[PATCH 4/4] drm/bridge: dw-hdmi: add cec driver
Russell King - ARM Linux
linux at armlinux.org.uk
Fri Jun 2 09:18:20 UTC 2017
On Fri, Jun 02, 2017 at 11:06:24AM +0200, Hans Verkuil wrote:
> On 06/02/17 08:43, Jose Abreu wrote:
> > 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.
>
> I gathered that from the define names :-)
>
> But what does it mean? What sort of error is reported here?
I think the problem is that no one really knows, the documentation is
quite poor:
5 An error is notified by a follower. Abnormal logic data
ERROR_FOLL bit error (for follower).
4 An error is detected on cec line (for initiator only).
ERROR_INIT
It is so vague that you can read anything into that description.
--
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
More information about the dri-devel
mailing list