[PATCH 4/4] drm/bridge: dw-hdmi: add cec driver

Jose Abreu Jose.Abreu at synopsys.com
Thu Jun 1 23:43:51 PDT 2017


Hi Hans,


On 02-06-2017 07:31, Hans Verkuil wrote:
> On 06/01/2017 03:47 PM, Neil Armstrong wrote:
>> On 05/30/2017 04:23 PM, Russell King wrote:
>>> Add a CEC driver for the dw-hdmi hardware.
>>>
>>> Signed-off-by: Russell King <rmk+kernel at armlinux.org.uk>
>>> ---
>>>   drivers/gpu/drm/bridge/synopsys/Kconfig       |   8 +
>>>   drivers/gpu/drm/bridge/synopsys/Makefile      |   1 +
>>>   drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c | 320
>>> ++++++++++++++++++++++++++
>>>   drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h |  19 ++
>>>   drivers/gpu/drm/bridge/synopsys/dw-hdmi.c     |  40 +++-
>>>   5 files changed, 387 insertions(+), 1 deletion(-)
>>>   create mode 100644
>>> drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
>>>   create mode 100644
>>> drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h
>>>
>>> diff --git a/drivers/gpu/drm/bridge/synopsys/Kconfig
>>> b/drivers/gpu/drm/bridge/synopsys/Kconfig
>>> index 40d2827a6d19..bd30a0a07272 100644
>>> --- a/drivers/gpu/drm/bridge/synopsys/Kconfig
>>> +++ b/drivers/gpu/drm/bridge/synopsys/Kconfig
>>> @@ -21,3 +21,11 @@ config DRM_DW_HDMI_I2S_AUDIO
>>>       help
>>>         Support the I2S Audio interface which is part of the
>>> Synopsys
>>>         Designware HDMI block.
>>> +
>>> +config DRM_DW_HDMI_CEC
>>> +    tristate "Synopsis Designware CEC interface"
>>> +    depends on DRM_DW_HDMI && MEDIA_CEC_SUPPORT
>>> +    select MEDIA_CEC_NOTIFIER
>>> +    help
>>> +      Support the CE interface which is part of the Synopsis
>>> +      Designware HDMI block.
>>> diff --git a/drivers/gpu/drm/bridge/synopsys/Makefile
>>> b/drivers/gpu/drm/bridge/synopsys/Makefile
>>> index 17aa7a65b57e..6fe415903668 100644
>>> --- a/drivers/gpu/drm/bridge/synopsys/Makefile
>>> +++ b/drivers/gpu/drm/bridge/synopsys/Makefile
>>> @@ -3,3 +3,4 @@
>>>   obj-$(CONFIG_DRM_DW_HDMI) += dw-hdmi.o
>>>   obj-$(CONFIG_DRM_DW_HDMI_AHB_AUDIO) += dw-hdmi-ahb-audio.o
>>>   obj-$(CONFIG_DRM_DW_HDMI_I2S_AUDIO) += dw-hdmi-i2s-audio.o
>>> +obj-$(CONFIG_DRM_DW_HDMI_CEC) += dw-hdmi-cec.o
>>> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
>>> b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
>>> new file mode 100644
>>> index 000000000000..761ef5ae687d
>>> --- /dev/null
>>> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
>>> @@ -0,0 +1,320 @@
>>> +/*
>>> + * Designware HDMI CEC driver
>>> + *
>>> + * Copyright (C) 2015-2017 Russell King.
>>> + *
>>> + * This program is free software; you can redistribute it
>>> and/or modify
>>> + * it under the terms of the GNU General Public License
>>> version 2 as
>>> + * published by the Free Software Foundation.
>>> + */
>>> +#include <linux/interrupt.h>
>>> +#include <linux/io.h>
>>> +#include <linux/module.h>
>>> +#include <linux/platform_device.h>
>>> +#include <linux/sched.h>
>>> +#include <linux/slab.h>
>>> +
>>> +#include <drm/drm_edid.h>
>>> +
>>> +#include <media/cec.h>
>>> +#include <media/cec-notifier.h>
>>> +
>>> +#include "dw-hdmi-cec.h"
>>> +
>>> +enum {
>>> +    HDMI_IH_CEC_STAT0    = 0x0106,
>>> +    HDMI_IH_MUTE_CEC_STAT0    = 0x0186,
>>> +
>>> +    HDMI_CEC_CTRL        = 0x7d00,
>>> +    CEC_CTRL_START        = BIT(0),
>>> +    CEC_CTRL_NORMAL        = 1 << 1,
>>> +
>>> +    HDMI_CEC_STAT        = 0x7d01,
>>> +    CEC_STAT_DONE        = BIT(0),
>>> +    CEC_STAT_EOM        = BIT(1),
>>> +    CEC_STAT_NACK        = BIT(2),
>>> +    CEC_STAT_ARBLOST    = BIT(3),
>>> +    CEC_STAT_ERROR_INIT    = BIT(4),
>>> +    CEC_STAT_ERROR_FOLL    = BIT(5),
>>> +    CEC_STAT_WAKEUP        = BIT(6),
>
> I hadn't realized until Jose Abreu's latest reply, but you need
> to check the
> ARBLOST status and set the TX state to CEC_TX_STATUS_ARB_LOST.
>
> I think CEC_STAT_ERROR_FOLL might equal
> CEC_TX_STATUS_LOW_DRIVE, but without
> documentation I can't be sure.
>
> My experience is that this low drive condition tends to be
> poorly reported by
> hardware. Either that or poorly documented. This is why I added a
> CEC_TX_STATUS_ERROR status as a catch-all error status when it
> is unclear from
> the hardware/documentation what error occurred.
>
> Jose, do you know which status bit is used to report a follower
> pulling the
> CEC line low for a long time (approx. 3.6 ms) to signal a CEC
> error?

Bit 5 for follower error, bit 4 for initiator error.

Best regards,
Jose Miguel Abreu

>
> Regards,
>
>     Hans




More information about the linux-arm-kernel mailing list