[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