[PATCH 2/4] drm/bridge: dw-hdmi: add cec notifier support
Hans Verkuil
hverkuil at xs4all.nl
Fri Jun 9 06:51:49 PDT 2017
On 09/06/17 15:38, Russell King - ARM Linux wrote:
> On Fri, Jun 09, 2017 at 02:59:20PM +0200, Neil Armstrong wrote:
>> On 05/30/2017 04:23 PM, Russell King wrote:
>>> Add CEC notifier support to the HDMI bridge driver, so that the CEC
>>> part of the IP can receive its physical address.
>>>
>>> Signed-off-by: Russell King <rmk+kernel at armlinux.org.uk>
>>> ---
>>> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 22 +++++++++++++++++++++-
>>> 1 file changed, 21 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
>>> index 4e1f54a675d8..966422576c44 100644
>>> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
>>> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
>>> @@ -36,7 +36,10 @@
>>> #include "dw-hdmi.h"
>>> #include "dw-hdmi-audio.h"
>>>
>>> +#include <media/cec-notifier.h>
>>> +
>>> #define DDC_SEGMENT_ADDR 0x30
>>> +
>>> #define HDMI_EDID_LEN 512
>>>
>>> enum hdmi_datamap {
>>> @@ -173,6 +176,8 @@ struct dw_hdmi {
>>>
>>> unsigned int reg_shift;
>>> struct regmap *regm;
>>> +
>>> + struct cec_notifier *cec_notifier;
>>> };
>>>
>>> #define HDMI_IH_PHY_STAT0_RX_SENSE \
>>> @@ -1870,6 +1875,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
>>> hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid);
>>> hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
>>> drm_mode_connector_update_edid_property(connector, edid);
>>> + cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid);
>>> ret = drm_add_edid_modes(connector, edid);
>>> /* Store the ELD */
>>> drm_edid_to_eld(connector, edid);
>>> @@ -2108,11 +2114,16 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
>>> * ask the source to re-read the EDID.
>>> */
>>> if (intr_stat &
>>> - (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD))
>>> + (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) {
>>> __dw_hdmi_setup_rx_sense(hdmi,
>>> phy_stat & HDMI_PHY_HPD,
>>> phy_stat & HDMI_PHY_RX_SENSE);
>>>
>>> + if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0)
>>> + cec_notifier_set_phys_addr(hdmi->cec_notifier,
>>> + CEC_PHYS_ADDR_INVALID);
>>> + }
>>> +
>>> if (intr_stat & HDMI_IH_PHY_STAT0_HPD) {
>>> dev_dbg(hdmi->dev, "EVENT=%s\n",
>>> phy_int_pol & HDMI_PHY_HPD ? "plugin" : "plugout");
>>> @@ -2365,6 +2376,12 @@ __dw_hdmi_probe(struct platform_device *pdev,
>>> if (ret)
>>> goto err_iahb;
>>>
>>> + hdmi->cec_notifier = cec_notifier_get(dev);
>>> + if (!hdmi->cec_notifier) {
>>> + ret = -ENOMEM;
>>> + goto err_iahb;
>>> + }
>>> +
>>> /*
>>> * To prevent overflows in HDMI_IH_FC_STAT2, set the clk regenerator
>>> * N and cts values before enabling phy
>>> @@ -2437,6 +2454,9 @@ __dw_hdmi_probe(struct platform_device *pdev,
>>> hdmi->ddc = NULL;
>>> }
>>>
>>> + if (hdmi->cec_notifier)
>>> + cec_notifier_put(hdmi->cec_notifier);
>>> +
>>> clk_disable_unprepare(hdmi->iahb_clk);
>>> err_isfr:
>>> clk_disable_unprepare(hdmi->isfr_clk);
>>>
>>
>> Hi Archit,
>>
>> I think this one could go through drm-next since it's quite
>> standalone and will reduce the DW-HDMI CEC patchset and dependencies.
>
> Not a good idea. If you read all the comments, Hans is suggesting that
> CEC should be part of dw-hdmi itself, not stand-alone. That would mean
> this patch probably changes - basically, with CEC support built-in to
> dw-hdmi, we don't need the notifier stuff.
>
> So, I'd suggest _not_ merging it at the moment, because the patch could
> well become obsolete.
>
> Wait until the CEC changes that Hans has talked about have hit mainline
> and I've had a chance to rework this for those. We're waiting on Mauro
> for that at the moment.
The patches are in mainline now. Note: you may get the occasional kbuild
robot emails since there are a few more CEC patches pending for 4.12 but
that's just slight CEC header changes to fix obscure .config combinations.
It should not affect your patches. I expect those pending fixes to hit
mainline some time next week.
> (I do find it rather frustrating that CEC seems to evolve very rapidly,
> it makes it quite difficult to publish a patch set, and get it merged.)
It's a pretty new framework and yours and my own work on drm drivers showed
a few shortcomings, primarily in the way the kernel config options were set
up for CEC.
I believe this is now sorted with 4.12.
What makes CEC a bit tricky is that it straddles two subsystems: drm and media.
Always harder to synchronize things.
Regards,
Hans
More information about the linux-arm-kernel
mailing list