]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
omapdrm: hdmi4: hook up the HDMI CEC support
authorHans Verkuil <hans.verkuil@cisco.com>
Wed, 2 Aug 2017 08:54:07 +0000 (10:54 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 12 Oct 2017 07:49:14 +0000 (10:49 +0300)
Hook up the HDMI CEC support in the hdmi4 driver.

It add the CEC irq handler, the CEC (un)init calls and tells the CEC
implementation when the physical address changes.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/gpu/drm/omapdrm/dss/Kconfig
drivers/gpu/drm/omapdrm/dss/Makefile
drivers/gpu/drm/omapdrm/dss/hdmi4.c

index 8b87d5cf45fc837c2b4cba3512af9ba9e23edca1..f24ebf7f61dd14d3a8ba609c78241fb636ec227a 100644 (file)
@@ -65,6 +65,14 @@ config OMAP4_DSS_HDMI
        help
          HDMI support for OMAP4 based SoCs.
 
+config OMAP4_DSS_HDMI_CEC
+       bool "Enable HDMI CEC support for OMAP4"
+       depends on OMAP4_DSS_HDMI
+       select CEC_CORE
+       default y
+       ---help---
+         When selected the HDMI transmitter will support the CEC feature.
+
 config OMAP5_DSS_HDMI
        bool "HDMI support for OMAP5"
        default n
index 142ce5a02542f28862956c2694e7033d37abc9d3..3c5644c3fc3877e3c7d4d38ab78f566d11e660b7 100644 (file)
@@ -14,5 +14,6 @@ omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o
 omapdss-$(CONFIG_OMAP2_DSS_HDMI_COMMON) += hdmi_common.o hdmi_wp.o hdmi_pll.o \
        hdmi_phy.o
 omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi4.o hdmi4_core.o
+omapdss-$(CONFIG_OMAP4_DSS_HDMI_CEC) += hdmi4_cec.o
 omapdss-$(CONFIG_OMAP5_DSS_HDMI) += hdmi5.o hdmi5_core.o
 ccflags-$(CONFIG_OMAP2_DSS_DEBUG) += -DDEBUG
index fd1b252c6e6d7d79d55937a5ff0d66bf0f8a70e9..2bfbd67458502d03fee0ce840f594afe7d5f41dc 100644 (file)
 #include <linux/of.h>
 #include <linux/of_graph.h>
 #include <sound/omap-hdmi-audio.h>
+#include <media/cec.h>
 
 #include "omapdss.h"
 #include "hdmi4_core.h"
+#include "hdmi4_cec.h"
 #include "dss.h"
 #include "hdmi.h"
 
@@ -96,6 +98,13 @@ static irqreturn_t hdmi_irq_handler(int irq, void *data)
        } else if (irqstatus & HDMI_IRQ_LINK_DISCONNECT) {
                hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_LDOON);
        }
+       if (irqstatus & HDMI_IRQ_CORE) {
+               u32 intr4 = hdmi_read_reg(hdmi->core.base, HDMI_CORE_SYS_INTR4);
+
+               hdmi_write_reg(hdmi->core.base, HDMI_CORE_SYS_INTR4, intr4);
+               if (intr4 & 8)
+                       hdmi4_cec_irq(&hdmi->core);
+       }
 
        return IRQ_HANDLED;
 }
@@ -392,6 +401,8 @@ static void hdmi_display_disable(struct omap_dss_device *dssdev)
 
        DSSDBG("Enter hdmi_display_disable\n");
 
+       hdmi4_cec_set_phys_addr(&hdmi.core, CEC_PHYS_ADDR_INVALID);
+
        mutex_lock(&hdmi.lock);
 
        spin_lock_irqsave(&hdmi.audio_playing_lock, flags);
@@ -492,7 +503,11 @@ static int hdmi_read_edid(struct omap_dss_device *dssdev,
        }
 
        r = read_edid(edid, len);
-
+       if (r >= 256)
+               hdmi4_cec_set_phys_addr(&hdmi.core,
+                                       cec_get_edid_phys_addr(edid, r, NULL));
+       else
+               hdmi4_cec_set_phys_addr(&hdmi.core, CEC_PHYS_ADDR_INVALID);
        if (need_enable)
                hdmi4_core_disable(dssdev);
 
@@ -726,6 +741,10 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
        if (r)
                goto err;
 
+       r = hdmi4_cec_init(pdev, &hdmi.core, &hdmi.wp);
+       if (r)
+               goto err;
+
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
                DSSERR("platform_get_irq failed\n");
@@ -770,6 +789,8 @@ static void hdmi4_unbind(struct device *dev, struct device *master, void *data)
 
        hdmi_uninit_output(pdev);
 
+       hdmi4_cec_uninit(&hdmi.core);
+
        hdmi_pll_uninit(&hdmi.pll);
 
        pm_runtime_disable(&pdev->dev);