Sfoglia il codice sorgente

[media] stih-cec: add CEC notifier support

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.

Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Benjamin Gaignard 8 anni fa
parent
commit
fc4e009c6c

+ 18 - 0
drivers/media/platform/Kconfig

@@ -460,6 +460,24 @@ config VIDEO_TI_SC
 config VIDEO_TI_CSC
 config VIDEO_TI_CSC
 	tristate
 	tristate
 
 
+menuconfig V4L_CEC_DRIVERS
+	bool "Platform HDMI CEC drivers"
+	depends on MEDIA_CEC_SUPPORT
+
+if V4L_CEC_DRIVERS
+
+config VIDEO_STI_HDMI_CEC
+       tristate "STMicroelectronics STiH4xx HDMI CEC driver"
+       depends on VIDEO_DEV && MEDIA_CEC_SUPPORT && (ARCH_STI || COMPILE_TEST)
+       select MEDIA_CEC_NOTIFIER
+       ---help---
+         This is a driver for STIH4xx HDMI CEC interface. It uses the
+         generic CEC framework interface.
+         CEC bus is present in the HDMI connector and enables communication
+         between compatible devices.
+
+endif #V4L_CEC_DRIVERS
+
 menuconfig V4L_TEST_DRIVERS
 menuconfig V4L_TEST_DRIVERS
 	bool "Media test drivers"
 	bool "Media test drivers"
 	depends on MEDIA_CAMERA_SUPPORT
 	depends on MEDIA_CAMERA_SUPPORT

+ 1 - 0
drivers/media/platform/Makefile

@@ -38,6 +38,7 @@ obj-$(CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC)	+= exynos-gsc/
 obj-$(CONFIG_VIDEO_STI_BDISP)		+= sti/bdisp/
 obj-$(CONFIG_VIDEO_STI_BDISP)		+= sti/bdisp/
 obj-$(CONFIG_VIDEO_STI_HVA)		+= sti/hva/
 obj-$(CONFIG_VIDEO_STI_HVA)		+= sti/hva/
 obj-$(CONFIG_DVB_C8SECTPFE)		+= sti/c8sectpfe/
 obj-$(CONFIG_DVB_C8SECTPFE)		+= sti/c8sectpfe/
+obj-$(CONFIG_VIDEO_STI_HDMI_CEC) 	+= sti/cec/
 
 
 obj-$(CONFIG_VIDEO_STI_DELTA)		+= sti/delta/
 obj-$(CONFIG_VIDEO_STI_DELTA)		+= sti/delta/
 
 

+ 0 - 0
drivers/staging/media/st-cec/Makefile → drivers/media/platform/sti/cec/Makefile


+ 28 - 3
drivers/staging/media/st-cec/stih-cec.c → drivers/media/platform/sti/cec/stih-cec.c

@@ -1,6 +1,4 @@
 /*
 /*
- * drivers/staging/media/st-cec/stih-cec.c
- *
  * STIH4xx CEC driver
  * STIH4xx CEC driver
  * Copyright (C) STMicroelectronic SA 2016
  * Copyright (C) STMicroelectronic SA 2016
  *
  *
@@ -15,9 +13,11 @@
 #include <linux/mfd/syscon.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of.h>
+#include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/platform_device.h>
 
 
 #include <media/cec.h>
 #include <media/cec.h>
+#include <media/cec-notifier.h>
 
 
 #define CEC_NAME	"stih-cec"
 #define CEC_NAME	"stih-cec"
 
 
@@ -129,6 +129,7 @@ struct stih_cec {
 	void __iomem		*regs;
 	void __iomem		*regs;
 	int			irq;
 	int			irq;
 	u32			irq_status;
 	u32			irq_status;
+	struct cec_notifier	*notifier;
 };
 };
 
 
 static int stih_cec_adap_enable(struct cec_adapter *adap, bool enable)
 static int stih_cec_adap_enable(struct cec_adapter *adap, bool enable)
@@ -303,12 +304,29 @@ static int stih_cec_probe(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	struct device *dev = &pdev->dev;
 	struct resource *res;
 	struct resource *res;
 	struct stih_cec *cec;
 	struct stih_cec *cec;
+	struct device_node *np;
+	struct platform_device *hdmi_dev;
 	int ret;
 	int ret;
 
 
 	cec = devm_kzalloc(dev, sizeof(*cec), GFP_KERNEL);
 	cec = devm_kzalloc(dev, sizeof(*cec), GFP_KERNEL);
 	if (!cec)
 	if (!cec)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
+	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)
+		return -EPROBE_DEFER;
+
+	cec->notifier = cec_notifier_get(&hdmi_dev->dev);
+	if (!cec->notifier)
+		return -ENOMEM;
+
 	cec->dev = dev;
 	cec->dev = dev;
 
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -335,7 +353,7 @@ static int stih_cec_probe(struct platform_device *pdev)
 	cec->adap = cec_allocate_adapter(&sti_cec_adap_ops, cec,
 	cec->adap = cec_allocate_adapter(&sti_cec_adap_ops, cec,
 			CEC_NAME,
 			CEC_NAME,
 			CEC_CAP_LOG_ADDRS | CEC_CAP_PASSTHROUGH |
 			CEC_CAP_LOG_ADDRS | CEC_CAP_PASSTHROUGH |
-			CEC_CAP_PHYS_ADDR | CEC_CAP_TRANSMIT, 1);
+			CEC_CAP_TRANSMIT, 1);
 	ret = PTR_ERR_OR_ZERO(cec->adap);
 	ret = PTR_ERR_OR_ZERO(cec->adap);
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;
@@ -346,12 +364,19 @@ static int stih_cec_probe(struct platform_device *pdev)
 		return ret;
 		return ret;
 	}
 	}
 
 
+	cec_register_cec_notifier(cec->adap, cec->notifier);
+
 	platform_set_drvdata(pdev, cec);
 	platform_set_drvdata(pdev, cec);
 	return 0;
 	return 0;
 }
 }
 
 
 static int stih_cec_remove(struct platform_device *pdev)
 static int stih_cec_remove(struct platform_device *pdev)
 {
 {
+	struct stih_cec *cec = platform_get_drvdata(pdev);
+
+	cec_unregister_adapter(cec->adap);
+	cec_notifier_put(cec->notifier);
+
 	return 0;
 	return 0;
 }
 }
 
 

+ 0 - 2
drivers/staging/media/Kconfig

@@ -34,6 +34,4 @@ source "drivers/staging/media/s5p-cec/Kconfig"
 # Keep LIRC at the end, as it has sub-menus
 # Keep LIRC at the end, as it has sub-menus
 source "drivers/staging/media/lirc/Kconfig"
 source "drivers/staging/media/lirc/Kconfig"
 
 
-source "drivers/staging/media/st-cec/Kconfig"
-
 endif
 endif

+ 0 - 1
drivers/staging/media/Makefile

@@ -5,4 +5,3 @@ obj-$(CONFIG_LIRC_STAGING)	+= lirc/
 obj-$(CONFIG_VIDEO_BCM2835)	+= platform/bcm2835/
 obj-$(CONFIG_VIDEO_BCM2835)	+= platform/bcm2835/
 obj-$(CONFIG_VIDEO_DM365_VPFE)	+= davinci_vpfe/
 obj-$(CONFIG_VIDEO_DM365_VPFE)	+= davinci_vpfe/
 obj-$(CONFIG_VIDEO_OMAP4)	+= omap4iss/
 obj-$(CONFIG_VIDEO_OMAP4)	+= omap4iss/
-obj-$(CONFIG_VIDEO_STI_HDMI_CEC) += st-cec/

+ 0 - 8
drivers/staging/media/st-cec/Kconfig

@@ -1,8 +0,0 @@
-config VIDEO_STI_HDMI_CEC
-       tristate "STMicroelectronics STiH4xx HDMI CEC driver"
-       depends on VIDEO_DEV && MEDIA_CEC_SUPPORT && (ARCH_STI || COMPILE_TEST)
-       ---help---
-         This is a driver for STIH4xx HDMI CEC interface. It uses the
-         generic CEC framework interface.
-         CEC bus is present in the HDMI connector and enables communication
-         between compatible devices.

+ 0 - 7
drivers/staging/media/st-cec/TODO

@@ -1,7 +0,0 @@
-This driver requires that userspace sets the physical address.
-However, this should be passed on from the corresponding
-ST 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.