Thread (42 messages) 42 messages, 5 authors, 2017-07-24
STALE3245d

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

From: linux@armlinux.org.uk (Russell King - ARM Linux)
Date: 2017-06-02 09:18:20
Also in: dri-devel

On Fri, Jun 02, 2017 at 11:06:24AM +0200, Hans Verkuil wrote:
On 06/02/17 08:43, Jose Abreu wrote:
quoted
Hi Hans,


On 02-06-2017 07:31, Hans Verkuil wrote:
quoted
On 06/01/2017 03:47 PM, Neil Armstrong wrote:
quoted
On 05/30/2017 04:23 PM, Russell King wrote:
quoted
Add a CEC driver for the dw-hdmi hardware.

Signed-off-by: Russell King <redacted>
---
  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.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help