]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
[media] s5p-cec: add cec-notifier support, move out of staging
authorHans Verkuil <hans.verkuil@cisco.com>
Tue, 13 Dec 2016 14:37:16 +0000 (12:37 -0200)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 10 Apr 2017 16:14:03 +0000 (13:14 -0300)
By using the CEC notifier framework there is no longer any reason
to manually set the physical address. This was the one blocking
issue that prevented this driver from going out of staging, so do
this move as well.

Update the bindings documenting the new hdmi phandle and
update exynos4.dtsi accordingly.

Tested with my Odroid U3.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Acked-by: Krzysztof Kozlowski <krzk@kernel.org>
CC: linux-samsung-soc@vger.kernel.org
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
12 files changed:
drivers/media/platform/Kconfig
drivers/media/platform/Makefile
drivers/media/platform/s5p-cec/Makefile [moved from drivers/staging/media/s5p-cec/Makefile with 100% similarity]
drivers/media/platform/s5p-cec/exynos_hdmi_cec.h [moved from drivers/staging/media/s5p-cec/exynos_hdmi_cec.h with 100% similarity]
drivers/media/platform/s5p-cec/exynos_hdmi_cecctrl.c [moved from drivers/staging/media/s5p-cec/exynos_hdmi_cecctrl.c with 100% similarity]
drivers/media/platform/s5p-cec/regs-cec.h [moved from drivers/staging/media/s5p-cec/regs-cec.h with 100% similarity]
drivers/media/platform/s5p-cec/s5p_cec.c [moved from drivers/staging/media/s5p-cec/s5p_cec.c with 89% similarity]
drivers/media/platform/s5p-cec/s5p_cec.h [moved from drivers/staging/media/s5p-cec/s5p_cec.h with 97% similarity]
drivers/staging/media/Kconfig
drivers/staging/media/Makefile
drivers/staging/media/s5p-cec/Kconfig [deleted file]
drivers/staging/media/s5p-cec/TODO [deleted file]

index e252b27742918c84de4c296120f1896060bf6eb0..7321f612365924d821903737b244eb2a7c431a23 100644 (file)
@@ -466,6 +466,16 @@ menuconfig V4L_CEC_DRIVERS
 
 if V4L_CEC_DRIVERS
 
+config VIDEO_SAMSUNG_S5P_CEC
+       tristate "Samsung S5P CEC driver"
+       depends on VIDEO_DEV && MEDIA_CEC_SUPPORT && (PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST)
+       select MEDIA_CEC_NOTIFIER
+       ---help---
+         This is a driver for Samsung S5P HDMI CEC interface. It uses the
+         generic CEC framework interface.
+         CEC bus is present in the HDMI connector and enables communication
+         between compatible devices.
+
 config VIDEO_STI_HDMI_CEC
        tristate "STMicroelectronics STiH4xx HDMI CEC driver"
        depends on VIDEO_DEV && MEDIA_CEC_SUPPORT && (ARCH_STI || COMPILE_TEST)
index 057422cd803e7090d4f4ea1a8f6a2f143d7097fd..ce59af58c925186186d6bd86b05250cca5bc8a91 100644 (file)
@@ -33,6 +33,7 @@ obj-$(CONFIG_VIDEO_SAMSUNG_S5P_JPEG)  += s5p-jpeg/
 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_MFC)    += s5p-mfc/
 
 obj-$(CONFIG_VIDEO_SAMSUNG_S5P_G2D)    += s5p-g2d/
+obj-$(CONFIG_VIDEO_SAMSUNG_S5P_CEC)    += s5p-cec/
 obj-$(CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC) += exynos-gsc/
 
 obj-$(CONFIG_VIDEO_STI_BDISP)          += sti/bdisp/
similarity index 89%
rename from drivers/staging/media/s5p-cec/s5p_cec.c
rename to drivers/media/platform/s5p-cec/s5p_cec.c
index a30b80a123dda4cabcfce8d68b2a7d3d2d9932aa..4688f0879f559627b9b2c705f640e813e2bba1ab 100644 (file)
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/timer.h>
 #include <linux/workqueue.h>
 #include <media/cec.h>
+#include <media/cec-edid.h>
+#include <media/cec-notifier.h>
 
 #include "exynos_hdmi_cec.h"
 #include "regs-cec.h"
@@ -167,10 +170,22 @@ static const struct cec_adap_ops s5p_cec_adap_ops = {
 static int s5p_cec_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
+       struct device_node *np;
+       struct platform_device *hdmi_dev;
        struct resource *res;
        struct s5p_cec_dev *cec;
        int ret;
 
+       np = of_parse_phandle(pdev->dev.of_node, "hdmi-phandle", 0);
+
+       if (!np) {
+               dev_err(&pdev->dev, "Failed to find hdmi node in device tree\n");
+               return -ENODEV;
+       }
+       hdmi_dev = of_find_device_by_node(np);
+       if (hdmi_dev == NULL)
+               return -EPROBE_DEFER;
+
        cec = devm_kzalloc(&pdev->dev, sizeof(*cec), GFP_KERNEL);
        if (!cec)
                return -ENOMEM;
@@ -200,24 +215,33 @@ static int s5p_cec_probe(struct platform_device *pdev)
        if (IS_ERR(cec->reg))
                return PTR_ERR(cec->reg);
 
+       cec->notifier = cec_notifier_get(&hdmi_dev->dev);
+       if (cec->notifier == NULL)
+               return -ENOMEM;
+
        cec->adap = cec_allocate_adapter(&s5p_cec_adap_ops, cec,
                CEC_NAME,
-               CEC_CAP_PHYS_ADDR | CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT |
+               CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT |
                CEC_CAP_PASSTHROUGH | CEC_CAP_RC, 1);
        ret = PTR_ERR_OR_ZERO(cec->adap);
        if (ret)
                return ret;
+
        ret = cec_register_adapter(cec->adap, &pdev->dev);
-       if (ret) {
-               cec_delete_adapter(cec->adap);
-               return ret;
-       }
+       if (ret)
+               goto err_delete_adapter;
+
+       cec_register_cec_notifier(cec->adap, cec->notifier);
 
        platform_set_drvdata(pdev, cec);
        pm_runtime_enable(dev);
 
        dev_dbg(dev, "successfuly probed\n");
        return 0;
+
+err_delete_adapter:
+       cec_delete_adapter(cec->adap);
+       return ret;
 }
 
 static int s5p_cec_remove(struct platform_device *pdev)
@@ -225,6 +249,7 @@ static int s5p_cec_remove(struct platform_device *pdev)
        struct s5p_cec_dev *cec = platform_get_drvdata(pdev);
 
        cec_unregister_adapter(cec->adap);
+       cec_notifier_put(cec->notifier);
        pm_runtime_disable(&pdev->dev);
        return 0;
 }
similarity index 97%
rename from drivers/staging/media/s5p-cec/s5p_cec.h
rename to drivers/media/platform/s5p-cec/s5p_cec.h
index 03732c13d19f03d2ec3dedb49738d6ce43a00e85..7015845c1caa4f124a9c35e9bf42827d76c8900d 100644 (file)
@@ -59,12 +59,15 @@ enum cec_state {
        STATE_ERROR
 };
 
+struct cec_notifier;
+
 struct s5p_cec_dev {
        struct cec_adapter      *adap;
        struct clk              *clk;
        struct device           *dev;
        struct mutex            lock;
        struct regmap           *pmu;
+       struct cec_notifier     *notifier;
        int                     irq;
        void __iomem            *reg;
 
index 28088de6ddd02ac9a858cb3be5b9d5ec379cc18b..8ed8202da57a6d889857a26b8508586a1bd099fb 100644 (file)
@@ -29,8 +29,6 @@ source "drivers/staging/media/omap4iss/Kconfig"
 
 source "drivers/staging/media/platform/bcm2835/Kconfig"
 
-source "drivers/staging/media/s5p-cec/Kconfig"
-
 # Keep LIRC at the end, as it has sub-menus
 source "drivers/staging/media/lirc/Kconfig"
 
index 75e47dcdddd6f552a2d1afe936e88cee87681659..3a6adeabede1f77d8bfa47e03be4858666b8e415 100644 (file)
@@ -1,5 +1,4 @@
 obj-$(CONFIG_I2C_BCM2048)      += bcm2048/
-obj-$(CONFIG_VIDEO_SAMSUNG_S5P_CEC) += s5p-cec/
 obj-$(CONFIG_DVB_CXD2099)      += cxd2099/
 obj-$(CONFIG_LIRC_STAGING)     += lirc/
 obj-$(CONFIG_VIDEO_BCM2835)    += platform/bcm2835/
diff --git a/drivers/staging/media/s5p-cec/Kconfig b/drivers/staging/media/s5p-cec/Kconfig
deleted file mode 100644 (file)
index 7a3489d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-config VIDEO_SAMSUNG_S5P_CEC
-       tristate "Samsung S5P CEC driver"
-       depends on VIDEO_DEV && MEDIA_CEC_SUPPORT && (ARCH_EXYNOS || COMPILE_TEST)
-       ---help---
-         This is a driver for Samsung S5P HDMI CEC interface. It uses the
-         generic CEC framework interface.
-         CEC bus is present in the HDMI connector and enables communication
-         between compatible devices.
-
diff --git a/drivers/staging/media/s5p-cec/TODO b/drivers/staging/media/s5p-cec/TODO
deleted file mode 100644 (file)
index 64f21ba..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-This driver requires that userspace sets the physical address.
-However, this should be passed on from the corresponding
-Samsung HDMI driver.
-
-We have to wait until the HDMI notifier framework has been merged
-in order to handle this gracefully, until that time this driver
-has to remain in staging.