* [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support
@ 2017-09-11 12:29 Hans Verkuil
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
` (2 more replies)
0 siblings, 3 replies; 19+ messages in thread
From: Hans Verkuil @ 2017-09-11 12:29 UTC (permalink / raw)
To: linux-media; +Cc: linux-tegra, devicetree, thierry.reding, dri-devel
From: Hans Verkuil <hans.verkuil@cisco.com>
This patch series adds support for the Tegra CEC functionality.
This v4 has been rebased to the latest 4.14 pre-rc1 mainline.
Please review! Other than for the bindings that are now Acked I have not
received any feedback.
The first patch documents the CEC bindings, the second adds support
for this to tegra124.dtsi and enables it for the Jetson TK1.
The third patch adds the CEC driver itself and the final patch adds
the cec notifier support to the drm/tegra driver in order to notify
the CEC driver whenever the physical address changes.
I expect that the dts changes apply as well to the Tegra X1/X2 and possibly
other Tegra SoCs, but I can only test this with my Jetson TK1 board.
The dt-bindings and the tegra-cec driver would go in through the media
subsystem, the drm/tegra part through the drm subsystem and the dts
changes through (I guess) the linux-tegra developers. Luckily they are
all independent of one another.
To test this you need the CEC utilities from git://linuxtv.org/v4l-utils.git.
To build this:
git clone git://linuxtv.org/v4l-utils.git
cd v4l-utils
./bootstrap.sh; ./configure
make
sudo make install # optional, you really only need utils/cec*
To test:
cec-ctl --playback # configure as playback device
cec-ctl -S # detect all connected CEC devices
See here for the public CEC API:
https://hverkuil.home.xs4all.nl/spec/uapi/cec/cec-api.html
Regards,
Hans
Changes since v3:
- Use the new CEC_CAP_DEFAULTS define
- Use IS_ERR(cec->adap) instead of IS_ERR_OR_NULL(cec->adap)
(cec_allocate_adapter never returns a NULL pointer)
- Drop the device_init_wakeup: wakeup is not (yet) supported by
the CEC framework and I have never tested it.
Hans Verkuil (4):
dt-bindings: document the tegra CEC bindings
ARM: tegra: add CEC support to tegra124.dtsi
tegra-cec: add Tegra HDMI CEC driver
drm/tegra: add cec-notifier support
.../devicetree/bindings/media/tegra-cec.txt | 27 ++
MAINTAINERS | 8 +
arch/arm/boot/dts/tegra124-jetson-tk1.dts | 4 +
arch/arm/boot/dts/tegra124.dtsi | 12 +-
drivers/gpu/drm/tegra/Kconfig | 1 +
drivers/gpu/drm/tegra/drm.h | 3 +
drivers/gpu/drm/tegra/hdmi.c | 9 +
drivers/gpu/drm/tegra/output.c | 6 +
drivers/media/platform/Kconfig | 11 +
drivers/media/platform/Makefile | 2 +
drivers/media/platform/tegra-cec/Makefile | 1 +
drivers/media/platform/tegra-cec/tegra_cec.c | 501 +++++++++++++++++++++
drivers/media/platform/tegra-cec/tegra_cec.h | 127 ++++++
13 files changed, 711 insertions(+), 1 deletion(-)
create mode 100644 Documentation/devicetree/bindings/media/tegra-cec.txt
create mode 100644 drivers/media/platform/tegra-cec/Makefile
create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.c
create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.h
--
2.14.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCHv4 1/4] dt-bindings: document the tegra CEC bindings
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-09-11 12:29 ` Hans Verkuil
[not found] ` <20170911122952.33980-2-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-11 12:29 ` [PATCHv4 3/4] tegra-cec: add Tegra HDMI CEC driver Hans Verkuil
` (2 subsequent siblings)
3 siblings, 1 reply; 19+ messages in thread
From: Hans Verkuil @ 2017-09-11 12:29 UTC (permalink / raw)
To: linux-media-u79uwXL29TY76Z2rM5mHXA
Cc: linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
thierry.reding-Re5JQEeQqe8AvxtiuMwx3w, Hans Verkuil
From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
This documents the binding for the Tegra CEC module.
Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
.../devicetree/bindings/media/tegra-cec.txt | 27 ++++++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/tegra-cec.txt
diff --git a/Documentation/devicetree/bindings/media/tegra-cec.txt b/Documentation/devicetree/bindings/media/tegra-cec.txt
new file mode 100644
index 000000000000..c503f06f3b84
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/tegra-cec.txt
@@ -0,0 +1,27 @@
+* Tegra HDMI CEC hardware
+
+The HDMI CEC module is present in Tegra SoCs and its purpose is to
+handle communication between HDMI connected devices over the CEC bus.
+
+Required properties:
+ - compatible : value should be one of the following:
+ "nvidia,tegra114-cec"
+ "nvidia,tegra124-cec"
+ "nvidia,tegra210-cec"
+ - reg : Physical base address of the IP registers and length of memory
+ mapped region.
+ - interrupts : HDMI CEC interrupt number to the CPU.
+ - clocks : from common clock binding: handle to HDMI CEC clock.
+ - clock-names : from common clock binding: must contain "cec",
+ corresponding to the entry in the clocks property.
+ - hdmi-phandle : phandle to the HDMI controller, see also cec.txt.
+
+Example:
+
+cec@70015000 {
+ compatible = "nvidia,tegra124-cec";
+ reg = <0x0 0x70015000 0x0 0x00001000>;
+ interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&tegra_car TEGRA124_CLK_CEC>;
+ clock-names = "cec";
+};
--
2.14.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCHv4 2/4] ARM: tegra: add CEC support to tegra124.dtsi
2017-09-11 12:29 [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Hans Verkuil
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-09-11 12:29 ` Hans Verkuil
[not found] ` <20170911122952.33980-3-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-14 12:08 ` [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Hans Verkuil
2 siblings, 1 reply; 19+ messages in thread
From: Hans Verkuil @ 2017-09-11 12:29 UTC (permalink / raw)
To: linux-media
Cc: linux-tegra, devicetree, thierry.reding, Hans Verkuil, dri-devel
From: Hans Verkuil <hans.verkuil@cisco.com>
Add support for the Tegra CEC IP to tegra124.dtsi and enable it on the
Jetson TK1.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
---
arch/arm/boot/dts/tegra124-jetson-tk1.dts | 4 ++++
arch/arm/boot/dts/tegra124.dtsi | 12 +++++++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/arch/arm/boot/dts/tegra124-jetson-tk1.dts b/arch/arm/boot/dts/tegra124-jetson-tk1.dts
index 7bacb2954f58..7f56de6890c3 100644
--- a/arch/arm/boot/dts/tegra124-jetson-tk1.dts
+++ b/arch/arm/boot/dts/tegra124-jetson-tk1.dts
@@ -67,6 +67,10 @@
};
};
+ cec@70015000 {
+ status = "okay";
+ };
+
gpu@0,57000000 {
/*
* Node left disabled on purpose - the bootloader will enable
diff --git a/arch/arm/boot/dts/tegra124.dtsi b/arch/arm/boot/dts/tegra124.dtsi
index 1b10b14a6abd..1a21e527fb6e 100644
--- a/arch/arm/boot/dts/tegra124.dtsi
+++ b/arch/arm/boot/dts/tegra124.dtsi
@@ -123,7 +123,7 @@
nvidia,head = <1>;
};
- hdmi@54280000 {
+ hdmi: hdmi@54280000 {
compatible = "nvidia,tegra124-hdmi";
reg = <0x0 0x54280000 0x0 0x00040000>;
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
@@ -851,6 +851,16 @@
status = "disabled";
};
+ cec@70015000 {
+ compatible = "nvidia,tegra124-cec";
+ reg = <0x0 0x70015000 0x0 0x00001000>;
+ interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&tegra_car TEGRA124_CLK_CEC>;
+ clock-names = "cec";
+ hdmi-phandle = <&hdmi>;
+ status = "disabled";
+ };
+
soctherm: thermal-sensor@700e2000 {
compatible = "nvidia,tegra124-soctherm";
reg = <0x0 0x700e2000 0x0 0x600 /* SOC_THERM reg_base */
--
2.14.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCHv4 3/4] tegra-cec: add Tegra HDMI CEC driver
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-11 12:29 ` [PATCHv4 1/4] dt-bindings: document the tegra CEC bindings Hans Verkuil
@ 2017-09-11 12:29 ` Hans Verkuil
[not found] ` <20170911122952.33980-4-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-11 12:29 ` [PATCHv4 4/4] drm/tegra: add cec-notifier support Hans Verkuil
2017-10-19 9:20 ` [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Thierry Reding
3 siblings, 1 reply; 19+ messages in thread
From: Hans Verkuil @ 2017-09-11 12:29 UTC (permalink / raw)
To: linux-media-u79uwXL29TY76Z2rM5mHXA
Cc: linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
thierry.reding-Re5JQEeQqe8AvxtiuMwx3w, Hans Verkuil
From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
This driver adds support for the Tegra CEC IP. It is based on the
NVIDIA drivers/misc/tegra-cec driver in their 3.10 kernel.
This has been converted to the CEC framework and cleaned up.
Tested with my Jetson TK1 board. It has also been tested with the
Tegra X1 in an embedded product.
Note of warning for the Tegra X2: this SoC supports two HDMI outputs,
but only one CEC adapter and the CEC bus is shared between the
two outputs. This is a design mistake and the CEC adapter can
control only one HDMI output. Never hook up both HDMI outputs
to the CEC bus in a hardware design: this is illegal as per the
CEC specification.
The CEC bus can be shared between multiple inputs and zero or one
outputs, but not between multiple outputs.
Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
---
MAINTAINERS | 8 +
drivers/media/platform/Kconfig | 11 +
drivers/media/platform/Makefile | 2 +
drivers/media/platform/tegra-cec/Makefile | 1 +
drivers/media/platform/tegra-cec/tegra_cec.c | 501 +++++++++++++++++++++++++++
drivers/media/platform/tegra-cec/tegra_cec.h | 127 +++++++
6 files changed, 650 insertions(+)
create mode 100644 drivers/media/platform/tegra-cec/Makefile
create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.c
create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.h
diff --git a/MAINTAINERS b/MAINTAINERS
index eb930ebecfcb..dd40c1f335a8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1923,6 +1923,14 @@ M: Lennert Buytenhek <kernel-OLH4Qvv75CYX/NnBR394Jw@public.gmane.org>
L: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org (moderated for non-subscribers)
S: Maintained
+ARM/TEGRA HDMI CEC SUBSYSTEM SUPPORT
+M: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
+L: linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
+L: linux-media-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
+S: Maintained
+F: drivers/media/platform/tegra-cec/
+F: Documentation/devicetree/bindings/media/tegra-cec.txt
+
ARM/TETON BGA MACHINE SUPPORT
M: "Mark F. Brown" <mark.brown314-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
L: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org (moderated for non-subscribers)
diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig
index 7e7cc49b8674..ec218fcf3886 100644
--- a/drivers/media/platform/Kconfig
+++ b/drivers/media/platform/Kconfig
@@ -589,6 +589,17 @@ config VIDEO_STM32_HDMI_CEC
CEC bus is present in the HDMI connector and enables communication
between compatible devices.
+config VIDEO_TEGRA_HDMI_CEC
+ tristate "Tegra HDMI CEC driver"
+ depends on ARCH_TEGRA || COMPILE_TEST
+ select CEC_CORE
+ select CEC_NOTIFIER
+ ---help---
+ This is a driver for the Tegra HDMI CEC interface. It uses the
+ generic CEC framework interface.
+ The CEC bus is present in the HDMI connector and enables communication
+ between compatible devices.
+
endif #CEC_PLATFORM_DRIVERS
menuconfig SDR_PLATFORM_DRIVERS
diff --git a/drivers/media/platform/Makefile b/drivers/media/platform/Makefile
index c1ef946bf032..e31faaa852f3 100644
--- a/drivers/media/platform/Makefile
+++ b/drivers/media/platform/Makefile
@@ -46,6 +46,8 @@ obj-$(CONFIG_VIDEO_STI_HDMI_CEC) += sti/cec/
obj-$(CONFIG_VIDEO_STI_DELTA) += sti/delta/
+obj-$(CONFIG_VIDEO_TEGRA_HDMI_CEC) += tegra-cec/
+
obj-y += stm32/
obj-y += blackfin/
diff --git a/drivers/media/platform/tegra-cec/Makefile b/drivers/media/platform/tegra-cec/Makefile
new file mode 100644
index 000000000000..f3d81127589f
--- /dev/null
+++ b/drivers/media/platform/tegra-cec/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_VIDEO_TEGRA_HDMI_CEC) += tegra_cec.o
diff --git a/drivers/media/platform/tegra-cec/tegra_cec.c b/drivers/media/platform/tegra-cec/tegra_cec.c
new file mode 100644
index 000000000000..b53743f555e8
--- /dev/null
+++ b/drivers/media/platform/tegra-cec/tegra_cec.c
@@ -0,0 +1,501 @@
+/*
+ * Tegra CEC implementation
+ *
+ * The original 3.10 CEC driver using a custom API:
+ *
+ * Copyright (c) 2012-2015, NVIDIA CORPORATION. All rights reserved.
+ *
+ * Conversion to the CEC framework and to the mainline kernel:
+ *
+ * Copyright 2016-2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+#include <linux/interrupt.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/clk/tegra.h>
+
+#include <media/cec-notifier.h>
+
+#include "tegra_cec.h"
+
+#define TEGRA_CEC_NAME "tegra-cec"
+
+struct tegra_cec {
+ struct cec_adapter *adap;
+ struct device *dev;
+ struct clk *clk;
+ void __iomem *cec_base;
+ struct cec_notifier *notifier;
+ int tegra_cec_irq;
+ bool rx_done;
+ bool tx_done;
+ int tx_status;
+ u8 rx_buf[CEC_MAX_MSG_SIZE];
+ u8 rx_buf_cnt;
+ u32 tx_buf[CEC_MAX_MSG_SIZE];
+ u8 tx_buf_cur;
+ u8 tx_buf_cnt;
+};
+
+static inline u32 cec_read(struct tegra_cec *cec, u32 reg)
+{
+ return readl(cec->cec_base + reg);
+}
+
+static inline void cec_write(struct tegra_cec *cec, u32 reg, u32 val)
+{
+ writel(val, cec->cec_base + reg);
+}
+
+static void tegra_cec_error_recovery(struct tegra_cec *cec)
+{
+ u32 hw_ctrl;
+
+ hw_ctrl = cec_read(cec, TEGRA_CEC_HW_CONTROL);
+ cec_write(cec, TEGRA_CEC_HW_CONTROL, 0);
+ cec_write(cec, TEGRA_CEC_INT_STAT, 0xffffffff);
+ cec_write(cec, TEGRA_CEC_HW_CONTROL, hw_ctrl);
+}
+
+static irqreturn_t tegra_cec_irq_thread_handler(int irq, void *data)
+{
+ struct device *dev = data;
+ struct tegra_cec *cec = dev_get_drvdata(dev);
+
+ if (cec->tx_done) {
+ cec_transmit_attempt_done(cec->adap, cec->tx_status);
+ cec->tx_done = false;
+ }
+ if (cec->rx_done) {
+ struct cec_msg msg = {};
+
+ msg.len = cec->rx_buf_cnt;
+ memcpy(msg.msg, cec->rx_buf, msg.len);
+ cec_received_msg(cec->adap, &msg);
+ cec->rx_done = false;
+ cec->rx_buf_cnt = 0;
+ }
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t tegra_cec_irq_handler(int irq, void *data)
+{
+ struct device *dev = data;
+ struct tegra_cec *cec = dev_get_drvdata(dev);
+ u32 status, mask;
+
+ status = cec_read(cec, TEGRA_CEC_INT_STAT);
+ mask = cec_read(cec, TEGRA_CEC_INT_MASK);
+
+ status &= mask;
+
+ if (!status)
+ return IRQ_HANDLED;
+
+ if (status & TEGRA_CEC_INT_STAT_TX_REGISTER_UNDERRUN) {
+ dev_err(dev, "TX underrun, interrupt timing issue!\n");
+
+ tegra_cec_error_recovery(cec);
+ cec_write(cec, TEGRA_CEC_INT_MASK,
+ mask & ~TEGRA_CEC_INT_MASK_TX_REGISTER_EMPTY);
+
+ cec->tx_done = true;
+ cec->tx_status = CEC_TX_STATUS_ERROR;
+ return IRQ_WAKE_THREAD;
+ }
+
+ if ((status & TEGRA_CEC_INT_STAT_TX_ARBITRATION_FAILED) ||
+ (status & TEGRA_CEC_INT_STAT_TX_BUS_ANOMALY_DETECTED)) {
+ tegra_cec_error_recovery(cec);
+ cec_write(cec, TEGRA_CEC_INT_MASK,
+ mask & ~TEGRA_CEC_INT_MASK_TX_REGISTER_EMPTY);
+
+ cec->tx_done = true;
+ if (status & TEGRA_CEC_INT_STAT_TX_BUS_ANOMALY_DETECTED)
+ cec->tx_status = CEC_TX_STATUS_LOW_DRIVE;
+ else
+ cec->tx_status = CEC_TX_STATUS_ARB_LOST;
+ return IRQ_WAKE_THREAD;
+ }
+
+ if (status & TEGRA_CEC_INT_STAT_TX_FRAME_TRANSMITTED) {
+ cec_write(cec, TEGRA_CEC_INT_STAT,
+ TEGRA_CEC_INT_STAT_TX_FRAME_TRANSMITTED);
+
+ if (status & TEGRA_CEC_INT_STAT_TX_FRAME_OR_BLOCK_NAKD) {
+ tegra_cec_error_recovery(cec);
+
+ cec->tx_done = true;
+ cec->tx_status = CEC_TX_STATUS_NACK;
+ } else {
+ cec->tx_done = true;
+ cec->tx_status = CEC_TX_STATUS_OK;
+ }
+ return IRQ_WAKE_THREAD;
+ }
+
+ if (status & TEGRA_CEC_INT_STAT_TX_FRAME_OR_BLOCK_NAKD)
+ dev_warn(dev, "TX NAKed on the fly!\n");
+
+ if (status & TEGRA_CEC_INT_STAT_TX_REGISTER_EMPTY) {
+ if (cec->tx_buf_cur == cec->tx_buf_cnt) {
+ cec_write(cec, TEGRA_CEC_INT_MASK,
+ mask & ~TEGRA_CEC_INT_MASK_TX_REGISTER_EMPTY);
+ } else {
+ cec_write(cec, TEGRA_CEC_TX_REGISTER,
+ cec->tx_buf[cec->tx_buf_cur++]);
+ cec_write(cec, TEGRA_CEC_INT_STAT,
+ TEGRA_CEC_INT_STAT_TX_REGISTER_EMPTY);
+ }
+ }
+
+ if (status & (TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN |
+ TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED |
+ TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED |
+ TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED)) {
+ cec_write(cec, TEGRA_CEC_INT_STAT,
+ (TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN |
+ TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED |
+ TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED |
+ TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED));
+ } else if (status & TEGRA_CEC_INT_STAT_RX_REGISTER_FULL) {
+ u32 v;
+
+ cec_write(cec, TEGRA_CEC_INT_STAT,
+ TEGRA_CEC_INT_STAT_RX_REGISTER_FULL);
+ v = cec_read(cec, TEGRA_CEC_RX_REGISTER);
+ if (cec->rx_buf_cnt < CEC_MAX_MSG_SIZE)
+ cec->rx_buf[cec->rx_buf_cnt++] = v & 0xff;
+ if (v & TEGRA_CEC_RX_REGISTER_EOM) {
+ cec->rx_done = true;
+ return IRQ_WAKE_THREAD;
+ }
+ }
+
+ return IRQ_HANDLED;
+}
+
+static int tegra_cec_adap_enable(struct cec_adapter *adap, bool enable)
+{
+ struct tegra_cec *cec = adap->priv;
+
+ cec->rx_buf_cnt = 0;
+ cec->tx_buf_cnt = 0;
+ cec->tx_buf_cur = 0;
+
+ cec_write(cec, TEGRA_CEC_HW_CONTROL, 0);
+ cec_write(cec, TEGRA_CEC_INT_MASK, 0);
+ cec_write(cec, TEGRA_CEC_INT_STAT, 0xffffffff);
+ cec_write(cec, TEGRA_CEC_SW_CONTROL, 0);
+
+ if (!enable)
+ return 0;
+
+ cec_write(cec, TEGRA_CEC_INPUT_FILTER, (1U << 31) | 0x20);
+
+ cec_write(cec, TEGRA_CEC_RX_TIMING_0,
+ (0x7a << TEGRA_CEC_RX_TIM0_START_BIT_MAX_LO_TIME_SHIFT) |
+ (0x6d << TEGRA_CEC_RX_TIM0_START_BIT_MIN_LO_TIME_SHIFT) |
+ (0x93 << TEGRA_CEC_RX_TIM0_START_BIT_MAX_DURATION_SHIFT) |
+ (0x86 << TEGRA_CEC_RX_TIM0_START_BIT_MIN_DURATION_SHIFT));
+
+ cec_write(cec, TEGRA_CEC_RX_TIMING_1,
+ (0x35 << TEGRA_CEC_RX_TIM1_DATA_BIT_MAX_LO_TIME_SHIFT) |
+ (0x21 << TEGRA_CEC_RX_TIM1_DATA_BIT_SAMPLE_TIME_SHIFT) |
+ (0x56 << TEGRA_CEC_RX_TIM1_DATA_BIT_MAX_DURATION_SHIFT) |
+ (0x40 << TEGRA_CEC_RX_TIM1_DATA_BIT_MIN_DURATION_SHIFT));
+
+ cec_write(cec, TEGRA_CEC_RX_TIMING_2,
+ (0x50 << TEGRA_CEC_RX_TIM2_END_OF_BLOCK_TIME_SHIFT));
+
+ cec_write(cec, TEGRA_CEC_TX_TIMING_0,
+ (0x74 << TEGRA_CEC_TX_TIM0_START_BIT_LO_TIME_SHIFT) |
+ (0x8d << TEGRA_CEC_TX_TIM0_START_BIT_DURATION_SHIFT) |
+ (0x08 << TEGRA_CEC_TX_TIM0_BUS_XITION_TIME_SHIFT) |
+ (0x71 << TEGRA_CEC_TX_TIM0_BUS_ERROR_LO_TIME_SHIFT));
+
+ cec_write(cec, TEGRA_CEC_TX_TIMING_1,
+ (0x2f << TEGRA_CEC_TX_TIM1_LO_DATA_BIT_LO_TIME_SHIFT) |
+ (0x13 << TEGRA_CEC_TX_TIM1_HI_DATA_BIT_LO_TIME_SHIFT) |
+ (0x4b << TEGRA_CEC_TX_TIM1_DATA_BIT_DURATION_SHIFT) |
+ (0x21 << TEGRA_CEC_TX_TIM1_ACK_NAK_BIT_SAMPLE_TIME_SHIFT));
+
+ cec_write(cec, TEGRA_CEC_TX_TIMING_2,
+ (0x07 << TEGRA_CEC_TX_TIM2_BUS_IDLE_TIME_ADDITIONAL_FRAME_SHIFT) |
+ (0x05 << TEGRA_CEC_TX_TIM2_BUS_IDLE_TIME_NEW_FRAME_SHIFT) |
+ (0x03 << TEGRA_CEC_TX_TIM2_BUS_IDLE_TIME_RETRY_FRAME_SHIFT));
+
+ cec_write(cec, TEGRA_CEC_INT_MASK,
+ TEGRA_CEC_INT_MASK_TX_REGISTER_UNDERRUN |
+ TEGRA_CEC_INT_MASK_TX_FRAME_OR_BLOCK_NAKD |
+ TEGRA_CEC_INT_MASK_TX_ARBITRATION_FAILED |
+ TEGRA_CEC_INT_MASK_TX_BUS_ANOMALY_DETECTED |
+ TEGRA_CEC_INT_MASK_TX_FRAME_TRANSMITTED |
+ TEGRA_CEC_INT_MASK_RX_REGISTER_FULL |
+ TEGRA_CEC_INT_MASK_RX_REGISTER_OVERRUN);
+
+ cec_write(cec, TEGRA_CEC_HW_CONTROL, TEGRA_CEC_HWCTRL_TX_RX_MODE);
+ return 0;
+}
+
+static int tegra_cec_adap_log_addr(struct cec_adapter *adap, u8 logical_addr)
+{
+ struct tegra_cec *cec = adap->priv;
+ u32 state = cec_read(cec, TEGRA_CEC_HW_CONTROL);
+
+ if (logical_addr == CEC_LOG_ADDR_INVALID)
+ state &= ~TEGRA_CEC_HWCTRL_RX_LADDR_MASK;
+ else
+ state |= TEGRA_CEC_HWCTRL_RX_LADDR((1 << logical_addr));
+
+ cec_write(cec, TEGRA_CEC_HW_CONTROL, state);
+ return 0;
+}
+
+static int tegra_cec_adap_monitor_all_enable(struct cec_adapter *adap,
+ bool enable)
+{
+ struct tegra_cec *cec = adap->priv;
+ u32 reg = cec_read(cec, TEGRA_CEC_HW_CONTROL);
+
+ if (enable)
+ reg |= TEGRA_CEC_HWCTRL_RX_SNOOP;
+ else
+ reg &= ~TEGRA_CEC_HWCTRL_RX_SNOOP;
+ cec_write(cec, TEGRA_CEC_HW_CONTROL, reg);
+ return 0;
+}
+
+static int tegra_cec_adap_transmit(struct cec_adapter *adap, u8 attempts,
+ u32 signal_free_time_ms, struct cec_msg *msg)
+{
+ bool retry_xfer = signal_free_time_ms == CEC_SIGNAL_FREE_TIME_RETRY;
+ struct tegra_cec *cec = adap->priv;
+ unsigned int i;
+ u32 mode = 0;
+ u32 mask;
+
+ if (cec_msg_is_broadcast(msg))
+ mode = TEGRA_CEC_TX_REG_BCAST;
+
+ cec->tx_buf_cur = 0;
+ cec->tx_buf_cnt = msg->len;
+
+ for (i = 0; i < msg->len; i++) {
+ cec->tx_buf[i] = mode | msg->msg[i];
+ if (i == 0)
+ cec->tx_buf[i] |= TEGRA_CEC_TX_REG_START_BIT;
+ if (i == msg->len - 1)
+ cec->tx_buf[i] |= TEGRA_CEC_TX_REG_EOM;
+ if (i == 0 && retry_xfer)
+ cec->tx_buf[i] |= TEGRA_CEC_TX_REG_RETRY;
+ }
+
+ mask = cec_read(cec, TEGRA_CEC_INT_MASK);
+ cec_write(cec, TEGRA_CEC_INT_MASK,
+ mask | TEGRA_CEC_INT_MASK_TX_REGISTER_EMPTY);
+
+ return 0;
+}
+
+static const struct cec_adap_ops tegra_cec_ops = {
+ .adap_enable = tegra_cec_adap_enable,
+ .adap_log_addr = tegra_cec_adap_log_addr,
+ .adap_transmit = tegra_cec_adap_transmit,
+ .adap_monitor_all_enable = tegra_cec_adap_monitor_all_enable,
+};
+
+static int tegra_cec_probe(struct platform_device *pdev)
+{
+ struct platform_device *hdmi_dev;
+ struct device_node *np;
+ struct tegra_cec *cec;
+ struct resource *res;
+ int ret = 0;
+
+ 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(struct tegra_cec), GFP_KERNEL);
+
+ if (!cec)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+ if (!res) {
+ dev_err(&pdev->dev,
+ "Unable to allocate resources for device\n");
+ ret = -EBUSY;
+ goto cec_error;
+ }
+
+ if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
+ pdev->name)) {
+ dev_err(&pdev->dev,
+ "Unable to request mem region for device\n");
+ ret = -EBUSY;
+ goto cec_error;
+ }
+
+ cec->tegra_cec_irq = platform_get_irq(pdev, 0);
+
+ if (cec->tegra_cec_irq <= 0) {
+ ret = -EBUSY;
+ goto cec_error;
+ }
+
+ cec->cec_base = devm_ioremap_nocache(&pdev->dev, res->start,
+ resource_size(res));
+
+ if (!cec->cec_base) {
+ dev_err(&pdev->dev, "Unable to grab IOs for device\n");
+ ret = -EBUSY;
+ goto cec_error;
+ }
+
+ cec->clk = devm_clk_get(&pdev->dev, "cec");
+
+ if (IS_ERR_OR_NULL(cec->clk)) {
+ dev_err(&pdev->dev, "Can't get clock for CEC\n");
+ ret = -ENOENT;
+ goto clk_error;
+ }
+
+ clk_prepare_enable(cec->clk);
+
+ /* set context info. */
+ cec->dev = &pdev->dev;
+
+ platform_set_drvdata(pdev, cec);
+
+ ret = devm_request_threaded_irq(&pdev->dev, cec->tegra_cec_irq,
+ tegra_cec_irq_handler, tegra_cec_irq_thread_handler,
+ 0, "cec_irq", &pdev->dev);
+
+ if (ret) {
+ dev_err(&pdev->dev,
+ "Unable to request interrupt for device\n");
+ goto cec_error;
+ }
+
+ cec->notifier = cec_notifier_get(&hdmi_dev->dev);
+ if (!cec->notifier) {
+ ret = -ENOMEM;
+ goto cec_error;
+ }
+
+ cec->adap = cec_allocate_adapter(&tegra_cec_ops, cec, TEGRA_CEC_NAME,
+ CEC_CAP_DEFAULTS | CEC_CAP_MONITOR_ALL,
+ CEC_MAX_LOG_ADDRS);
+ if (IS_ERR(cec->adap)) {
+ ret = -ENOMEM;
+ dev_err(&pdev->dev, "Couldn't create cec adapter\n");
+ goto cec_error;
+ }
+ ret = cec_register_adapter(cec->adap, &pdev->dev);
+ if (ret) {
+ dev_err(&pdev->dev, "Couldn't register device\n");
+ goto cec_error;
+ }
+
+ cec_register_cec_notifier(cec->adap, cec->notifier);
+
+ return 0;
+
+cec_error:
+ if (cec->notifier)
+ cec_notifier_put(cec->notifier);
+ cec_delete_adapter(cec->adap);
+ clk_disable_unprepare(cec->clk);
+clk_error:
+ return ret;
+}
+
+static int tegra_cec_remove(struct platform_device *pdev)
+{
+ struct tegra_cec *cec = platform_get_drvdata(pdev);
+
+ clk_disable_unprepare(cec->clk);
+
+ cec_unregister_adapter(cec->adap);
+ cec_notifier_put(cec->notifier);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int tegra_cec_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ struct tegra_cec *cec = platform_get_drvdata(pdev);
+
+ clk_disable_unprepare(cec->clk);
+
+ dev_notice(&pdev->dev, "suspended\n");
+ return 0;
+}
+
+static int tegra_cec_resume(struct platform_device *pdev)
+{
+ struct tegra_cec *cec = platform_get_drvdata(pdev);
+
+ dev_notice(&pdev->dev, "Resuming\n");
+
+ clk_prepare_enable(cec->clk);
+
+ return 0;
+}
+#endif
+
+static const struct of_device_id tegra_cec_of_match[] = {
+ { .compatible = "nvidia,tegra114-cec", },
+ { .compatible = "nvidia,tegra124-cec", },
+ { .compatible = "nvidia,tegra210-cec", },
+ {},
+};
+
+static struct platform_driver tegra_cec_driver = {
+ .driver = {
+ .name = TEGRA_CEC_NAME,
+ .of_match_table = of_match_ptr(tegra_cec_of_match),
+ },
+ .probe = tegra_cec_probe,
+ .remove = tegra_cec_remove,
+
+#ifdef CONFIG_PM
+ .suspend = tegra_cec_suspend,
+ .resume = tegra_cec_resume,
+#endif
+};
+
+module_platform_driver(tegra_cec_driver);
diff --git a/drivers/media/platform/tegra-cec/tegra_cec.h b/drivers/media/platform/tegra-cec/tegra_cec.h
new file mode 100644
index 000000000000..e301513daa87
--- /dev/null
+++ b/drivers/media/platform/tegra-cec/tegra_cec.h
@@ -0,0 +1,127 @@
+/*
+ * Tegra CEC register definitions
+ *
+ * The original 3.10 CEC driver using a custom API:
+ *
+ * Copyright (c) 2012-2015, NVIDIA CORPORATION. All rights reserved.
+ *
+ * Conversion to the CEC framework and to the mainline kernel:
+ *
+ * Copyright 2016-2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TEGRA_CEC_H
+#define TEGRA_CEC_H
+
+/* CEC registers */
+#define TEGRA_CEC_SW_CONTROL 0x000
+#define TEGRA_CEC_HW_CONTROL 0x004
+#define TEGRA_CEC_INPUT_FILTER 0x008
+#define TEGRA_CEC_TX_REGISTER 0x010
+#define TEGRA_CEC_RX_REGISTER 0x014
+#define TEGRA_CEC_RX_TIMING_0 0x018
+#define TEGRA_CEC_RX_TIMING_1 0x01c
+#define TEGRA_CEC_RX_TIMING_2 0x020
+#define TEGRA_CEC_TX_TIMING_0 0x024
+#define TEGRA_CEC_TX_TIMING_1 0x028
+#define TEGRA_CEC_TX_TIMING_2 0x02c
+#define TEGRA_CEC_INT_STAT 0x030
+#define TEGRA_CEC_INT_MASK 0x034
+#define TEGRA_CEC_HW_DEBUG_RX 0x038
+#define TEGRA_CEC_HW_DEBUG_TX 0x03c
+
+#define TEGRA_CEC_HWCTRL_RX_LADDR_MASK 0x7fff
+#define TEGRA_CEC_HWCTRL_RX_LADDR(x) \
+ ((x) & TEGRA_CEC_HWCTRL_RX_LADDR_MASK)
+#define TEGRA_CEC_HWCTRL_RX_SNOOP (1 << 15)
+#define TEGRA_CEC_HWCTRL_RX_NAK_MODE (1 << 16)
+#define TEGRA_CEC_HWCTRL_TX_NAK_MODE (1 << 24)
+#define TEGRA_CEC_HWCTRL_FAST_SIM_MODE (1 << 30)
+#define TEGRA_CEC_HWCTRL_TX_RX_MODE (1 << 31)
+
+#define TEGRA_CEC_INPUT_FILTER_MODE (1 << 31)
+#define TEGRA_CEC_INPUT_FILTER_FIFO_LENGTH_SHIFT 0
+
+#define TEGRA_CEC_TX_REG_DATA_SHIFT 0
+#define TEGRA_CEC_TX_REG_EOM (1 << 8)
+#define TEGRA_CEC_TX_REG_BCAST (1 << 12)
+#define TEGRA_CEC_TX_REG_START_BIT (1 << 16)
+#define TEGRA_CEC_TX_REG_RETRY (1 << 17)
+
+#define TEGRA_CEC_RX_REGISTER_SHIFT 0
+#define TEGRA_CEC_RX_REGISTER_EOM (1 << 8)
+#define TEGRA_CEC_RX_REGISTER_ACK (1 << 9)
+
+#define TEGRA_CEC_RX_TIM0_START_BIT_MAX_LO_TIME_SHIFT 0
+#define TEGRA_CEC_RX_TIM0_START_BIT_MIN_LO_TIME_SHIFT 8
+#define TEGRA_CEC_RX_TIM0_START_BIT_MAX_DURATION_SHIFT 16
+#define TEGRA_CEC_RX_TIM0_START_BIT_MIN_DURATION_SHIFT 24
+
+#define TEGRA_CEC_RX_TIM1_DATA_BIT_MAX_LO_TIME_SHIFT 0
+#define TEGRA_CEC_RX_TIM1_DATA_BIT_SAMPLE_TIME_SHIFT 8
+#define TEGRA_CEC_RX_TIM1_DATA_BIT_MAX_DURATION_SHIFT 16
+#define TEGRA_CEC_RX_TIM1_DATA_BIT_MIN_DURATION_SHIFT 24
+
+#define TEGRA_CEC_RX_TIM2_END_OF_BLOCK_TIME_SHIFT 0
+
+#define TEGRA_CEC_TX_TIM0_START_BIT_LO_TIME_SHIFT 0
+#define TEGRA_CEC_TX_TIM0_START_BIT_DURATION_SHIFT 8
+#define TEGRA_CEC_TX_TIM0_BUS_XITION_TIME_SHIFT 16
+#define TEGRA_CEC_TX_TIM0_BUS_ERROR_LO_TIME_SHIFT 24
+
+#define TEGRA_CEC_TX_TIM1_LO_DATA_BIT_LO_TIME_SHIFT 0
+#define TEGRA_CEC_TX_TIM1_HI_DATA_BIT_LO_TIME_SHIFT 8
+#define TEGRA_CEC_TX_TIM1_DATA_BIT_DURATION_SHIFT 16
+#define TEGRA_CEC_TX_TIM1_ACK_NAK_BIT_SAMPLE_TIME_SHIFT 24
+
+#define TEGRA_CEC_TX_TIM2_BUS_IDLE_TIME_ADDITIONAL_FRAME_SHIFT 0
+#define TEGRA_CEC_TX_TIM2_BUS_IDLE_TIME_NEW_FRAME_SHIFT 4
+#define TEGRA_CEC_TX_TIM2_BUS_IDLE_TIME_RETRY_FRAME_SHIFT 8
+
+#define TEGRA_CEC_INT_STAT_TX_REGISTER_EMPTY (1 << 0)
+#define TEGRA_CEC_INT_STAT_TX_REGISTER_UNDERRUN (1 << 1)
+#define TEGRA_CEC_INT_STAT_TX_FRAME_OR_BLOCK_NAKD (1 << 2)
+#define TEGRA_CEC_INT_STAT_TX_ARBITRATION_FAILED (1 << 3)
+#define TEGRA_CEC_INT_STAT_TX_BUS_ANOMALY_DETECTED (1 << 4)
+#define TEGRA_CEC_INT_STAT_TX_FRAME_TRANSMITTED (1 << 5)
+#define TEGRA_CEC_INT_STAT_RX_REGISTER_FULL (1 << 8)
+#define TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN (1 << 9)
+#define TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED (1 << 10)
+#define TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED (1 << 11)
+#define TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED (1 << 12)
+#define TEGRA_CEC_INT_STAT_FILTERED_RX_DATA_PIN_TRANSITION_H2L (1 << 13)
+#define TEGRA_CEC_INT_STAT_FILTERED_RX_DATA_PIN_TRANSITION_L2H (1 << 14)
+
+#define TEGRA_CEC_INT_MASK_TX_REGISTER_EMPTY (1 << 0)
+#define TEGRA_CEC_INT_MASK_TX_REGISTER_UNDERRUN (1 << 1)
+#define TEGRA_CEC_INT_MASK_TX_FRAME_OR_BLOCK_NAKD (1 << 2)
+#define TEGRA_CEC_INT_MASK_TX_ARBITRATION_FAILED (1 << 3)
+#define TEGRA_CEC_INT_MASK_TX_BUS_ANOMALY_DETECTED (1 << 4)
+#define TEGRA_CEC_INT_MASK_TX_FRAME_TRANSMITTED (1 << 5)
+#define TEGRA_CEC_INT_MASK_RX_REGISTER_FULL (1 << 8)
+#define TEGRA_CEC_INT_MASK_RX_REGISTER_OVERRUN (1 << 9)
+#define TEGRA_CEC_INT_MASK_RX_START_BIT_DETECTED (1 << 10)
+#define TEGRA_CEC_INT_MASK_RX_BUS_ANOMALY_DETECTED (1 << 11)
+#define TEGRA_CEC_INT_MASK_RX_BUS_ERROR_DETECTED (1 << 12)
+#define TEGRA_CEC_INT_MASK_FILTERED_RX_DATA_PIN_TRANSITION_H2L (1 << 13)
+#define TEGRA_CEC_INT_MASK_FILTERED_RX_DATA_PIN_TRANSITION_L2H (1 << 14)
+
+#define TEGRA_CEC_HW_DEBUG_TX_DURATION_COUNT_SHIFT 0
+#define TEGRA_CEC_HW_DEBUG_TX_TXBIT_COUNT_SHIFT 17
+#define TEGRA_CEC_HW_DEBUG_TX_STATE_SHIFT 21
+#define TEGRA_CEC_HW_DEBUG_TX_FORCELOOUT (1 << 25)
+#define TEGRA_CEC_HW_DEBUG_TX_TXDATABIT_SAMPLE_TIMER (1 << 26)
+
+#endif /* TEGRA_CEC_H */
--
2.14.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCHv4 4/4] drm/tegra: add cec-notifier support
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-11 12:29 ` [PATCHv4 1/4] dt-bindings: document the tegra CEC bindings Hans Verkuil
2017-09-11 12:29 ` [PATCHv4 3/4] tegra-cec: add Tegra HDMI CEC driver Hans Verkuil
@ 2017-09-11 12:29 ` Hans Verkuil
[not found] ` <20170911122952.33980-5-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-19 13:17 ` Thierry Reding
2017-10-19 9:20 ` [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Thierry Reding
3 siblings, 2 replies; 19+ messages in thread
From: Hans Verkuil @ 2017-09-11 12:29 UTC (permalink / raw)
To: linux-media-u79uwXL29TY76Z2rM5mHXA
Cc: linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW,
thierry.reding-Re5JQEeQqe8AvxtiuMwx3w, Hans Verkuil
From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
In order to support CEC the HDMI driver has to inform the CEC driver
whenever the physical address changes. So when the EDID is read the
CEC driver has to be informed and whenever the hotplug detect goes
away.
This is done through the cec-notifier framework.
The link between the HDMI driver and the CEC driver is done through
the hdmi_phandle in the tegra-cec node in the device tree.
Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
---
drivers/gpu/drm/tegra/Kconfig | 1 +
drivers/gpu/drm/tegra/drm.h | 3 +++
drivers/gpu/drm/tegra/hdmi.c | 9 +++++++++
drivers/gpu/drm/tegra/output.c | 6 ++++++
4 files changed, 19 insertions(+)
diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
index 2db29d67193d..c882918c2024 100644
--- a/drivers/gpu/drm/tegra/Kconfig
+++ b/drivers/gpu/drm/tegra/Kconfig
@@ -8,6 +8,7 @@ config DRM_TEGRA
select DRM_PANEL
select TEGRA_HOST1X
select IOMMU_IOVA if IOMMU_SUPPORT
+ select CEC_CORE if CEC_NOTIFIER
help
Choose this option if you have an NVIDIA Tegra SoC.
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 6d6da01282f3..c0a18b60caf1 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -212,6 +212,8 @@ int tegra_dc_state_setup_clock(struct tegra_dc *dc,
struct clk *clk, unsigned long pclk,
unsigned int div);
+struct cec_notifier;
+
struct tegra_output {
struct device_node *of_node;
struct device *dev;
@@ -219,6 +221,7 @@ struct tegra_output {
struct drm_panel *panel;
struct i2c_adapter *ddc;
const struct edid *edid;
+ struct cec_notifier *notifier;
unsigned int hpd_irq;
int hpd_gpio;
enum of_gpio_flags hpd_gpio_flags;
diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
index cda0491ed6bf..fbf14e1efd0e 100644
--- a/drivers/gpu/drm/tegra/hdmi.c
+++ b/drivers/gpu/drm/tegra/hdmi.c
@@ -21,6 +21,8 @@
#include <sound/hda_verbs.h>
+#include <media/cec-notifier.h>
+
#include "hdmi.h"
#include "drm.h"
#include "dc.h"
@@ -1720,6 +1722,10 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
return PTR_ERR(hdmi->vdd);
}
+ hdmi->output.notifier = cec_notifier_get(&pdev->dev);
+ if (hdmi->output.notifier == NULL)
+ return -ENOMEM;
+
hdmi->output.dev = &pdev->dev;
err = tegra_output_probe(&hdmi->output);
@@ -1778,6 +1784,9 @@ static int tegra_hdmi_remove(struct platform_device *pdev)
tegra_output_remove(&hdmi->output);
+ if (hdmi->output.notifier)
+ cec_notifier_put(hdmi->output.notifier);
+
return 0;
}
diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
index 595d1ec3e02e..57c052521a44 100644
--- a/drivers/gpu/drm/tegra/output.c
+++ b/drivers/gpu/drm/tegra/output.c
@@ -11,6 +11,8 @@
#include <drm/drm_panel.h>
#include "drm.h"
+#include <media/cec-notifier.h>
+
int tegra_output_connector_get_modes(struct drm_connector *connector)
{
struct tegra_output *output = connector_to_output(connector);
@@ -33,6 +35,7 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
edid = drm_get_edid(connector, output->ddc);
drm_mode_connector_update_edid_property(connector, edid);
+ cec_notifier_set_phys_addr_from_edid(output->notifier, edid);
if (edid) {
err = drm_add_edid_modes(connector, edid);
@@ -68,6 +71,9 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
status = connector_status_connected;
}
+ if (status != connector_status_connected)
+ cec_notifier_phys_addr_invalidate(output->notifier);
+
return status;
}
--
2.14.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support
2017-09-11 12:29 [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Hans Verkuil
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-11 12:29 ` [PATCHv4 2/4] ARM: tegra: add CEC support to tegra124.dtsi Hans Verkuil
@ 2017-10-14 12:08 ` Hans Verkuil
[not found] ` <9314614a-446d-b76d-640b-033cc74e3879-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2 siblings, 1 reply; 19+ messages in thread
From: Hans Verkuil @ 2017-10-14 12:08 UTC (permalink / raw)
To: linux-media; +Cc: linux-tegra, devicetree, thierry.reding, dri-devel
Hi Thierry,
On 09/11/2017 02:29 PM, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil@cisco.com>
>
> This patch series adds support for the Tegra CEC functionality.
>
> This v4 has been rebased to the latest 4.14 pre-rc1 mainline.
>
> Please review! Other than for the bindings that are now Acked I have not
> received any feedback.
Can you or someone else from the Tegra maintainers review this?
I have not heard anything about this patch series, nor of the previous
versions of this series. What's the hold-up?
Regards,
Hans
>
> The first patch documents the CEC bindings, the second adds support
> for this to tegra124.dtsi and enables it for the Jetson TK1.
>
> The third patch adds the CEC driver itself and the final patch adds
> the cec notifier support to the drm/tegra driver in order to notify
> the CEC driver whenever the physical address changes.
>
> I expect that the dts changes apply as well to the Tegra X1/X2 and possibly
> other Tegra SoCs, but I can only test this with my Jetson TK1 board.
>
> The dt-bindings and the tegra-cec driver would go in through the media
> subsystem, the drm/tegra part through the drm subsystem and the dts
> changes through (I guess) the linux-tegra developers. Luckily they are
> all independent of one another.
>
> To test this you need the CEC utilities from git://linuxtv.org/v4l-utils.git.
>
> To build this:
>
> git clone git://linuxtv.org/v4l-utils.git
> cd v4l-utils
> ./bootstrap.sh; ./configure
> make
> sudo make install # optional, you really only need utils/cec*
>
> To test:
>
> cec-ctl --playback # configure as playback device
> cec-ctl -S # detect all connected CEC devices
>
> See here for the public CEC API:
>
> https://hverkuil.home.xs4all.nl/spec/uapi/cec/cec-api.html
>
> Regards,
>
> Hans
>
> Changes since v3:
>
> - Use the new CEC_CAP_DEFAULTS define
> - Use IS_ERR(cec->adap) instead of IS_ERR_OR_NULL(cec->adap)
> (cec_allocate_adapter never returns a NULL pointer)
> - Drop the device_init_wakeup: wakeup is not (yet) supported by
> the CEC framework and I have never tested it.
>
> Hans Verkuil (4):
> dt-bindings: document the tegra CEC bindings
> ARM: tegra: add CEC support to tegra124.dtsi
> tegra-cec: add Tegra HDMI CEC driver
> drm/tegra: add cec-notifier support
>
> .../devicetree/bindings/media/tegra-cec.txt | 27 ++
> MAINTAINERS | 8 +
> arch/arm/boot/dts/tegra124-jetson-tk1.dts | 4 +
> arch/arm/boot/dts/tegra124.dtsi | 12 +-
> drivers/gpu/drm/tegra/Kconfig | 1 +
> drivers/gpu/drm/tegra/drm.h | 3 +
> drivers/gpu/drm/tegra/hdmi.c | 9 +
> drivers/gpu/drm/tegra/output.c | 6 +
> drivers/media/platform/Kconfig | 11 +
> drivers/media/platform/Makefile | 2 +
> drivers/media/platform/tegra-cec/Makefile | 1 +
> drivers/media/platform/tegra-cec/tegra_cec.c | 501 +++++++++++++++++++++
> drivers/media/platform/tegra-cec/tegra_cec.h | 127 ++++++
> 13 files changed, 711 insertions(+), 1 deletion(-)
> create mode 100644 Documentation/devicetree/bindings/media/tegra-cec.txt
> create mode 100644 drivers/media/platform/tegra-cec/Makefile
> create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.c
> create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.h
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support
[not found] ` <9314614a-446d-b76d-640b-033cc74e3879-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-10-14 13:34 ` Thierry Reding
2017-10-14 13:48 ` Hans Verkuil
0 siblings, 1 reply; 19+ messages in thread
From: Thierry Reding @ 2017-10-14 13:34 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
[-- Attachment #1: Type: text/plain, Size: 4308 bytes --]
On Sat, Oct 14, 2017 at 02:08:31PM +0200, Hans Verkuil wrote:
> Hi Thierry,
>
> On 09/11/2017 02:29 PM, Hans Verkuil wrote:
> > From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> >
> > This patch series adds support for the Tegra CEC functionality.
> >
> > This v4 has been rebased to the latest 4.14 pre-rc1 mainline.
> >
> > Please review! Other than for the bindings that are now Acked I have not
> > received any feedback.
>
> Can you or someone else from the Tegra maintainers review this?
>
> I have not heard anything about this patch series, nor of the previous
> versions of this series. What's the hold-up?
Sorry about that. I've been meaning to look at this for a while now, but
never got around to it. From a quick glance this looks good. Let me take
this for a quick test-drive when I'm back at the office next week and
I'll report back.
Is there any particular ordering that we need to observe in order to
merge this? Looks to me like it would be safe to merge patches 1 and 3
through the CEC (media?) tree and take the others through DRM and Tegra
separately without breaking anything.
Thierry
> > The first patch documents the CEC bindings, the second adds support
> > for this to tegra124.dtsi and enables it for the Jetson TK1.
> >
> > The third patch adds the CEC driver itself and the final patch adds
> > the cec notifier support to the drm/tegra driver in order to notify
> > the CEC driver whenever the physical address changes.
> >
> > I expect that the dts changes apply as well to the Tegra X1/X2 and possibly
> > other Tegra SoCs, but I can only test this with my Jetson TK1 board.
> >
> > The dt-bindings and the tegra-cec driver would go in through the media
> > subsystem, the drm/tegra part through the drm subsystem and the dts
> > changes through (I guess) the linux-tegra developers. Luckily they are
> > all independent of one another.
> >
> > To test this you need the CEC utilities from git://linuxtv.org/v4l-utils.git.
> >
> > To build this:
> >
> > git clone git://linuxtv.org/v4l-utils.git
> > cd v4l-utils
> > ./bootstrap.sh; ./configure
> > make
> > sudo make install # optional, you really only need utils/cec*
> >
> > To test:
> >
> > cec-ctl --playback # configure as playback device
> > cec-ctl -S # detect all connected CEC devices
> >
> > See here for the public CEC API:
> >
> > https://hverkuil.home.xs4all.nl/spec/uapi/cec/cec-api.html
> >
> > Regards,
> >
> > Hans
> >
> > Changes since v3:
> >
> > - Use the new CEC_CAP_DEFAULTS define
> > - Use IS_ERR(cec->adap) instead of IS_ERR_OR_NULL(cec->adap)
> > (cec_allocate_adapter never returns a NULL pointer)
> > - Drop the device_init_wakeup: wakeup is not (yet) supported by
> > the CEC framework and I have never tested it.
> >
> > Hans Verkuil (4):
> > dt-bindings: document the tegra CEC bindings
> > ARM: tegra: add CEC support to tegra124.dtsi
> > tegra-cec: add Tegra HDMI CEC driver
> > drm/tegra: add cec-notifier support
> >
> > .../devicetree/bindings/media/tegra-cec.txt | 27 ++
> > MAINTAINERS | 8 +
> > arch/arm/boot/dts/tegra124-jetson-tk1.dts | 4 +
> > arch/arm/boot/dts/tegra124.dtsi | 12 +-
> > drivers/gpu/drm/tegra/Kconfig | 1 +
> > drivers/gpu/drm/tegra/drm.h | 3 +
> > drivers/gpu/drm/tegra/hdmi.c | 9 +
> > drivers/gpu/drm/tegra/output.c | 6 +
> > drivers/media/platform/Kconfig | 11 +
> > drivers/media/platform/Makefile | 2 +
> > drivers/media/platform/tegra-cec/Makefile | 1 +
> > drivers/media/platform/tegra-cec/tegra_cec.c | 501 +++++++++++++++++++++
> > drivers/media/platform/tegra-cec/tegra_cec.h | 127 ++++++
> > 13 files changed, 711 insertions(+), 1 deletion(-)
> > create mode 100644 Documentation/devicetree/bindings/media/tegra-cec.txt
> > create mode 100644 drivers/media/platform/tegra-cec/Makefile
> > create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.c
> > create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.h
> >
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support
2017-10-14 13:34 ` Thierry Reding
@ 2017-10-14 13:48 ` Hans Verkuil
0 siblings, 0 replies; 19+ messages in thread
From: Hans Verkuil @ 2017-10-14 13:48 UTC (permalink / raw)
To: Thierry Reding
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On 10/14/2017 03:34 PM, Thierry Reding wrote:
> On Sat, Oct 14, 2017 at 02:08:31PM +0200, Hans Verkuil wrote:
>> Hi Thierry,
>>
>> On 09/11/2017 02:29 PM, Hans Verkuil wrote:
>>> From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
>>>
>>> This patch series adds support for the Tegra CEC functionality.
>>>
>>> This v4 has been rebased to the latest 4.14 pre-rc1 mainline.
>>>
>>> Please review! Other than for the bindings that are now Acked I have not
>>> received any feedback.
>>
>> Can you or someone else from the Tegra maintainers review this?
>>
>> I have not heard anything about this patch series, nor of the previous
>> versions of this series. What's the hold-up?
>
> Sorry about that. I've been meaning to look at this for a while now, but
> never got around to it. From a quick glance this looks good. Let me take
> this for a quick test-drive when I'm back at the office next week and
> I'll report back.
It would be great if you can test if the TK1 dts changes will also work
with the Jetson X1. It should, but I don't have a Jetson X1 to test with.
> Is there any particular ordering that we need to observe in order to
> merge this? Looks to me like it would be safe to merge patches 1 and 3
> through the CEC (media?) tree and take the others through DRM and Tegra
> separately without breaking anything.
Correct. Once I have your Ack I can make a pull request for patches 1+3.
Patches 2+4 would have to go through you.
Regards,
Hans
>
> Thierry
>
>>> The first patch documents the CEC bindings, the second adds support
>>> for this to tegra124.dtsi and enables it for the Jetson TK1.
>>>
>>> The third patch adds the CEC driver itself and the final patch adds
>>> the cec notifier support to the drm/tegra driver in order to notify
>>> the CEC driver whenever the physical address changes.
>>>
>>> I expect that the dts changes apply as well to the Tegra X1/X2 and possibly
>>> other Tegra SoCs, but I can only test this with my Jetson TK1 board.
>>>
>>> The dt-bindings and the tegra-cec driver would go in through the media
>>> subsystem, the drm/tegra part through the drm subsystem and the dts
>>> changes through (I guess) the linux-tegra developers. Luckily they are
>>> all independent of one another.
>>>
>>> To test this you need the CEC utilities from git://linuxtv.org/v4l-utils.git.
>>>
>>> To build this:
>>>
>>> git clone git://linuxtv.org/v4l-utils.git
>>> cd v4l-utils
>>> ./bootstrap.sh; ./configure
>>> make
>>> sudo make install # optional, you really only need utils/cec*
>>>
>>> To test:
>>>
>>> cec-ctl --playback # configure as playback device
>>> cec-ctl -S # detect all connected CEC devices
>>>
>>> See here for the public CEC API:
>>>
>>> https://hverkuil.home.xs4all.nl/spec/uapi/cec/cec-api.html
>>>
>>> Regards,
>>>
>>> Hans
>>>
>>> Changes since v3:
>>>
>>> - Use the new CEC_CAP_DEFAULTS define
>>> - Use IS_ERR(cec->adap) instead of IS_ERR_OR_NULL(cec->adap)
>>> (cec_allocate_adapter never returns a NULL pointer)
>>> - Drop the device_init_wakeup: wakeup is not (yet) supported by
>>> the CEC framework and I have never tested it.
>>>
>>> Hans Verkuil (4):
>>> dt-bindings: document the tegra CEC bindings
>>> ARM: tegra: add CEC support to tegra124.dtsi
>>> tegra-cec: add Tegra HDMI CEC driver
>>> drm/tegra: add cec-notifier support
>>>
>>> .../devicetree/bindings/media/tegra-cec.txt | 27 ++
>>> MAINTAINERS | 8 +
>>> arch/arm/boot/dts/tegra124-jetson-tk1.dts | 4 +
>>> arch/arm/boot/dts/tegra124.dtsi | 12 +-
>>> drivers/gpu/drm/tegra/Kconfig | 1 +
>>> drivers/gpu/drm/tegra/drm.h | 3 +
>>> drivers/gpu/drm/tegra/hdmi.c | 9 +
>>> drivers/gpu/drm/tegra/output.c | 6 +
>>> drivers/media/platform/Kconfig | 11 +
>>> drivers/media/platform/Makefile | 2 +
>>> drivers/media/platform/tegra-cec/Makefile | 1 +
>>> drivers/media/platform/tegra-cec/tegra_cec.c | 501 +++++++++++++++++++++
>>> drivers/media/platform/tegra-cec/tegra_cec.h | 127 ++++++
>>> 13 files changed, 711 insertions(+), 1 deletion(-)
>>> create mode 100644 Documentation/devicetree/bindings/media/tegra-cec.txt
>>> create mode 100644 drivers/media/platform/tegra-cec/Makefile
>>> create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.c
>>> create mode 100644 drivers/media/platform/tegra-cec/tegra_cec.h
>>>
>>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
` (2 preceding siblings ...)
2017-09-11 12:29 ` [PATCHv4 4/4] drm/tegra: add cec-notifier support Hans Verkuil
@ 2017-10-19 9:20 ` Thierry Reding
2017-10-19 9:36 ` Hans Verkuil
3 siblings, 1 reply; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 9:20 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
[-- Attachment #1: Type: text/plain, Size: 1947 bytes --]
On Mon, Sep 11, 2017 at 02:29:48PM +0200, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
>
> This patch series adds support for the Tegra CEC functionality.
>
> This v4 has been rebased to the latest 4.14 pre-rc1 mainline.
>
> Please review! Other than for the bindings that are now Acked I have not
> received any feedback.
>
> The first patch documents the CEC bindings, the second adds support
> for this to tegra124.dtsi and enables it for the Jetson TK1.
>
> The third patch adds the CEC driver itself and the final patch adds
> the cec notifier support to the drm/tegra driver in order to notify
> the CEC driver whenever the physical address changes.
>
> I expect that the dts changes apply as well to the Tegra X1/X2 and possibly
> other Tegra SoCs, but I can only test this with my Jetson TK1 board.
>
> The dt-bindings and the tegra-cec driver would go in through the media
> subsystem, the drm/tegra part through the drm subsystem and the dts
> changes through (I guess) the linux-tegra developers. Luckily they are
> all independent of one another.
>
> To test this you need the CEC utilities from git://linuxtv.org/v4l-utils.git.
>
> To build this:
>
> git clone git://linuxtv.org/v4l-utils.git
> cd v4l-utils
> ./bootstrap.sh; ./configure
> make
> sudo make install # optional, you really only need utils/cec*
>
> To test:
>
> cec-ctl --playback # configure as playback device
> cec-ctl -S # detect all connected CEC devices
I finally got around to test this. Unfortunately I wasn't able to
properly show connected CEC devices, but I think that may just be
because the monitor I was testing against doesn't support CEC. I
will have to check against a different device eventually to check
that it properly enumerates, though I suspect you've already done
quite extensive testing yourself.
Thanks for doing this!
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 1/4] dt-bindings: document the tegra CEC bindings
[not found] ` <20170911122952.33980-2-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-10-19 9:22 ` Thierry Reding
0 siblings, 0 replies; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 9:22 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Hans Verkuil
[-- Attachment #1: Type: text/plain, Size: 1894 bytes --]
On Mon, Sep 11, 2017 at 02:29:49PM +0200, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
>
> This documents the binding for the Tegra CEC module.
>
> Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> ---
> .../devicetree/bindings/media/tegra-cec.txt | 27 ++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/media/tegra-cec.txt
>
> diff --git a/Documentation/devicetree/bindings/media/tegra-cec.txt b/Documentation/devicetree/bindings/media/tegra-cec.txt
> new file mode 100644
> index 000000000000..c503f06f3b84
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/media/tegra-cec.txt
> @@ -0,0 +1,27 @@
> +* Tegra HDMI CEC hardware
> +
> +The HDMI CEC module is present in Tegra SoCs and its purpose is to
> +handle communication between HDMI connected devices over the CEC bus.
> +
> +Required properties:
> + - compatible : value should be one of the following:
> + "nvidia,tegra114-cec"
> + "nvidia,tegra124-cec"
> + "nvidia,tegra210-cec"
> + - reg : Physical base address of the IP registers and length of memory
> + mapped region.
> + - interrupts : HDMI CEC interrupt number to the CPU.
> + - clocks : from common clock binding: handle to HDMI CEC clock.
> + - clock-names : from common clock binding: must contain "cec",
> + corresponding to the entry in the clocks property.
> + - hdmi-phandle : phandle to the HDMI controller, see also cec.txt.
I don't understand the need for the -phandle suffix. I would've probably
just gone with "hdmi", or "hdmi-controller". But I see that this is
already pretty standardized, so...
Acked-by: Thierry Reding <treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 2/4] ARM: tegra: add CEC support to tegra124.dtsi
[not found] ` <20170911122952.33980-3-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-10-19 9:23 ` Thierry Reding
0 siblings, 0 replies; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 9:23 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Hans Verkuil
[-- Attachment #1: Type: text/plain, Size: 640 bytes --]
On Mon, Sep 11, 2017 at 02:29:50PM +0200, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
>
> Add support for the Tegra CEC IP to tegra124.dtsi and enable it on the
> Jetson TK1.
>
> Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> ---
> arch/arm/boot/dts/tegra124-jetson-tk1.dts | 4 ++++
> arch/arm/boot/dts/tegra124.dtsi | 12 +++++++++++-
> 2 files changed, 15 insertions(+), 1 deletion(-)
I prefer SoC and board changes to be split into separate patches. I've
done that with this patch while applying.
Thanks,
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support
2017-10-19 9:20 ` [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Thierry Reding
@ 2017-10-19 9:36 ` Hans Verkuil
[not found] ` <0f43276f-0a89-8caa-6522-253458e3ad08-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
0 siblings, 1 reply; 19+ messages in thread
From: Hans Verkuil @ 2017-10-19 9:36 UTC (permalink / raw)
To: Thierry Reding; +Cc: linux-media, linux-tegra, devicetree, dri-devel
On 10/19/17 11:20, Thierry Reding wrote:
> On Mon, Sep 11, 2017 at 02:29:48PM +0200, Hans Verkuil wrote:
>> From: Hans Verkuil <hans.verkuil@cisco.com>
>>
>> This patch series adds support for the Tegra CEC functionality.
>>
>> This v4 has been rebased to the latest 4.14 pre-rc1 mainline.
>>
>> Please review! Other than for the bindings that are now Acked I have not
>> received any feedback.
>>
>> The first patch documents the CEC bindings, the second adds support
>> for this to tegra124.dtsi and enables it for the Jetson TK1.
>>
>> The third patch adds the CEC driver itself and the final patch adds
>> the cec notifier support to the drm/tegra driver in order to notify
>> the CEC driver whenever the physical address changes.
>>
>> I expect that the dts changes apply as well to the Tegra X1/X2 and possibly
>> other Tegra SoCs, but I can only test this with my Jetson TK1 board.
>>
>> The dt-bindings and the tegra-cec driver would go in through the media
>> subsystem, the drm/tegra part through the drm subsystem and the dts
>> changes through (I guess) the linux-tegra developers. Luckily they are
>> all independent of one another.
>>
>> To test this you need the CEC utilities from git://linuxtv.org/v4l-utils.git.
>>
>> To build this:
>>
>> git clone git://linuxtv.org/v4l-utils.git
>> cd v4l-utils
>> ./bootstrap.sh; ./configure
>> make
>> sudo make install # optional, you really only need utils/cec*
>>
>> To test:
>>
>> cec-ctl --playback # configure as playback device
>> cec-ctl -S # detect all connected CEC devices
>
> I finally got around to test this. Unfortunately I wasn't able to
> properly show connected CEC devices, but I think that may just be
> because the monitor I was testing against doesn't support CEC. I
> will have to check against a different device eventually to check
> that it properly enumerates, though I suspect you've already done
> quite extensive testing yourself.
Yes, you need a TV with CEC. Most (all?) PC monitors do not support this.
I never understood why not.
So just to confirm: you've merged this driver for 4.15?
Regards,
Hans
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 3/4] tegra-cec: add Tegra HDMI CEC driver
[not found] ` <20170911122952.33980-4-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-10-19 9:37 ` Thierry Reding
0 siblings, 0 replies; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 9:37 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Hans Verkuil
[-- Attachment #1: Type: text/plain, Size: 3679 bytes --]
On Mon, Sep 11, 2017 at 02:29:51PM +0200, Hans Verkuil wrote:
[...]
> diff --git a/drivers/media/platform/tegra-cec/tegra_cec.c b/drivers/media/platform/tegra-cec/tegra_cec.c
[...]
> +static int tegra_cec_probe(struct platform_device *pdev)
> +{
> + struct platform_device *hdmi_dev;
> + struct device_node *np;
> + struct tegra_cec *cec;
> + struct resource *res;
> + int ret = 0;
> +
> + 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;
This seems a little awkward. Why exactly do we need to defer probe here?
It seems to me like cec_notifier_get() should be able to deal with HDMI
appearing at a later point.
> +
> + cec = devm_kzalloc(&pdev->dev, sizeof(struct tegra_cec), GFP_KERNEL);
> +
> + if (!cec)
> + return -ENOMEM;
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +
> + if (!res) {
> + dev_err(&pdev->dev,
> + "Unable to allocate resources for device\n");
> + ret = -EBUSY;
> + goto cec_error;
> + }
> +
> + if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
> + pdev->name)) {
> + dev_err(&pdev->dev,
> + "Unable to request mem region for device\n");
> + ret = -EBUSY;
> + goto cec_error;
> + }
> +
> + cec->tegra_cec_irq = platform_get_irq(pdev, 0);
> +
> + if (cec->tegra_cec_irq <= 0) {
> + ret = -EBUSY;
> + goto cec_error;
> + }
> +
> + cec->cec_base = devm_ioremap_nocache(&pdev->dev, res->start,
> + resource_size(res));
> +
> + if (!cec->cec_base) {
> + dev_err(&pdev->dev, "Unable to grab IOs for device\n");
> + ret = -EBUSY;
> + goto cec_error;
> + }
> +
> + cec->clk = devm_clk_get(&pdev->dev, "cec");
> +
> + if (IS_ERR_OR_NULL(cec->clk)) {
> + dev_err(&pdev->dev, "Can't get clock for CEC\n");
> + ret = -ENOENT;
> + goto clk_error;
> + }
> +
> + clk_prepare_enable(cec->clk);
> +
> + /* set context info. */
> + cec->dev = &pdev->dev;
> +
> + platform_set_drvdata(pdev, cec);
> +
> + ret = devm_request_threaded_irq(&pdev->dev, cec->tegra_cec_irq,
> + tegra_cec_irq_handler, tegra_cec_irq_thread_handler,
> + 0, "cec_irq", &pdev->dev);
> +
> + if (ret) {
> + dev_err(&pdev->dev,
> + "Unable to request interrupt for device\n");
> + goto cec_error;
> + }
> +
> + cec->notifier = cec_notifier_get(&hdmi_dev->dev);
> + if (!cec->notifier) {
> + ret = -ENOMEM;
> + goto cec_error;
> + }
Ah... I see why we need the HDMI device right away. This seems a little
brittle to me, for two reasons: what if the HDMI controller goes away?
Will we be hanging on to a stale device? I mean, the device doesn't
necessarily have to go away, but what's the effect on CEC if the driver
unbinds from the HDMI controller?
Secondly, this creates a circular dependency. It seems to me like it'd
actually be simpler if the CEC controller was a "service provider" that
HDMI could use and "request/release" as appropriate.
In that case, the DT would look somewhat like this:
hdmi@... {
cec = <&cec>;
};
cec: cec@... {
...
};
And then the HDMI driver could do something like:
cec = cec_get(&pdev->dev);
/* register notifier, ... */
That way the dependency becomes unidirectional and it seems to me like
that would allow interactions between HDMI and CEC would become simpler
overall.
Anyway, this is something that could always be changed after the fact
(except maybe for some bits needed for backwards-compatibility with old
device trees), and this seems to work well enough as it is, so:
Acked-by: Thierry Reding <treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 4/4] drm/tegra: add cec-notifier support
[not found] ` <20170911122952.33980-5-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-10-19 9:38 ` Thierry Reding
0 siblings, 0 replies; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 9:38 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Hans Verkuil
[-- Attachment #1: Type: text/plain, Size: 937 bytes --]
On Mon, Sep 11, 2017 at 02:29:52PM +0200, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
>
> In order to support CEC the HDMI driver has to inform the CEC driver
> whenever the physical address changes. So when the EDID is read the
> CEC driver has to be informed and whenever the hotplug detect goes
> away.
>
> This is done through the cec-notifier framework.
>
> The link between the HDMI driver and the CEC driver is done through
> the hdmi_phandle in the tegra-cec node in the device tree.
>
> Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> ---
> drivers/gpu/drm/tegra/Kconfig | 1 +
> drivers/gpu/drm/tegra/drm.h | 3 +++
> drivers/gpu/drm/tegra/hdmi.c | 9 +++++++++
> drivers/gpu/drm/tegra/output.c | 6 ++++++
> 4 files changed, 19 insertions(+)
I've applied this to drm/tegra/for-next.
Thanks,
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support
[not found] ` <0f43276f-0a89-8caa-6522-253458e3ad08-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-10-19 9:39 ` Thierry Reding
0 siblings, 0 replies; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 9:39 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
[-- Attachment #1: Type: text/plain, Size: 2549 bytes --]
On Thu, Oct 19, 2017 at 11:36:14AM +0200, Hans Verkuil wrote:
> On 10/19/17 11:20, Thierry Reding wrote:
> > On Mon, Sep 11, 2017 at 02:29:48PM +0200, Hans Verkuil wrote:
> >> From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> >>
> >> This patch series adds support for the Tegra CEC functionality.
> >>
> >> This v4 has been rebased to the latest 4.14 pre-rc1 mainline.
> >>
> >> Please review! Other than for the bindings that are now Acked I have not
> >> received any feedback.
> >>
> >> The first patch documents the CEC bindings, the second adds support
> >> for this to tegra124.dtsi and enables it for the Jetson TK1.
> >>
> >> The third patch adds the CEC driver itself and the final patch adds
> >> the cec notifier support to the drm/tegra driver in order to notify
> >> the CEC driver whenever the physical address changes.
> >>
> >> I expect that the dts changes apply as well to the Tegra X1/X2 and possibly
> >> other Tegra SoCs, but I can only test this with my Jetson TK1 board.
> >>
> >> The dt-bindings and the tegra-cec driver would go in through the media
> >> subsystem, the drm/tegra part through the drm subsystem and the dts
> >> changes through (I guess) the linux-tegra developers. Luckily they are
> >> all independent of one another.
> >>
> >> To test this you need the CEC utilities from git://linuxtv.org/v4l-utils.git.
> >>
> >> To build this:
> >>
> >> git clone git://linuxtv.org/v4l-utils.git
> >> cd v4l-utils
> >> ./bootstrap.sh; ./configure
> >> make
> >> sudo make install # optional, you really only need utils/cec*
> >>
> >> To test:
> >>
> >> cec-ctl --playback # configure as playback device
> >> cec-ctl -S # detect all connected CEC devices
> >
> > I finally got around to test this. Unfortunately I wasn't able to
> > properly show connected CEC devices, but I think that may just be
> > because the monitor I was testing against doesn't support CEC. I
> > will have to check against a different device eventually to check
> > that it properly enumerates, though I suspect you've already done
> > quite extensive testing yourself.
>
> Yes, you need a TV with CEC. Most (all?) PC monitors do not support this.
> I never understood why not.
>
> So just to confirm: you've merged this driver for 4.15?
I've applied the drm/tegra bits to drm/tegra/for-next and pulled the ARM
DT changes into the Tegra tree for v4.15. I think we had agreed that you
would take the DT bindings and CEC driver through your tree?
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 4/4] drm/tegra: add cec-notifier support
2017-09-11 12:29 ` [PATCHv4 4/4] drm/tegra: add cec-notifier support Hans Verkuil
[not found] ` <20170911122952.33980-5-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
@ 2017-10-19 13:17 ` Thierry Reding
2017-10-19 13:30 ` Thierry Reding
1 sibling, 1 reply; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 13:17 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media, linux-tegra, devicetree, dri-devel, Hans Verkuil
[-- Attachment #1: Type: text/plain, Size: 4336 bytes --]
On Mon, Sep 11, 2017 at 02:29:52PM +0200, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil@cisco.com>
>
> In order to support CEC the HDMI driver has to inform the CEC driver
> whenever the physical address changes. So when the EDID is read the
> CEC driver has to be informed and whenever the hotplug detect goes
> away.
>
> This is done through the cec-notifier framework.
>
> The link between the HDMI driver and the CEC driver is done through
> the hdmi_phandle in the tegra-cec node in the device tree.
>
> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
> ---
> drivers/gpu/drm/tegra/Kconfig | 1 +
> drivers/gpu/drm/tegra/drm.h | 3 +++
> drivers/gpu/drm/tegra/hdmi.c | 9 +++++++++
> drivers/gpu/drm/tegra/output.c | 6 ++++++
> 4 files changed, 19 insertions(+)
>
> diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
> index 2db29d67193d..c882918c2024 100644
> --- a/drivers/gpu/drm/tegra/Kconfig
> +++ b/drivers/gpu/drm/tegra/Kconfig
> @@ -8,6 +8,7 @@ config DRM_TEGRA
> select DRM_PANEL
> select TEGRA_HOST1X
> select IOMMU_IOVA if IOMMU_SUPPORT
> + select CEC_CORE if CEC_NOTIFIER
> help
> Choose this option if you have an NVIDIA Tegra SoC.
>
> diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
> index 6d6da01282f3..c0a18b60caf1 100644
> --- a/drivers/gpu/drm/tegra/drm.h
> +++ b/drivers/gpu/drm/tegra/drm.h
> @@ -212,6 +212,8 @@ int tegra_dc_state_setup_clock(struct tegra_dc *dc,
> struct clk *clk, unsigned long pclk,
> unsigned int div);
>
> +struct cec_notifier;
> +
> struct tegra_output {
> struct device_node *of_node;
> struct device *dev;
> @@ -219,6 +221,7 @@ struct tegra_output {
> struct drm_panel *panel;
> struct i2c_adapter *ddc;
> const struct edid *edid;
> + struct cec_notifier *notifier;
> unsigned int hpd_irq;
> int hpd_gpio;
> enum of_gpio_flags hpd_gpio_flags;
> diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
> index cda0491ed6bf..fbf14e1efd0e 100644
> --- a/drivers/gpu/drm/tegra/hdmi.c
> +++ b/drivers/gpu/drm/tegra/hdmi.c
> @@ -21,6 +21,8 @@
>
> #include <sound/hda_verbs.h>
>
> +#include <media/cec-notifier.h>
> +
> #include "hdmi.h"
> #include "drm.h"
> #include "dc.h"
> @@ -1720,6 +1722,10 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
> return PTR_ERR(hdmi->vdd);
> }
>
> + hdmi->output.notifier = cec_notifier_get(&pdev->dev);
> + if (hdmi->output.notifier == NULL)
> + return -ENOMEM;
> +
> hdmi->output.dev = &pdev->dev;
>
> err = tegra_output_probe(&hdmi->output);
> @@ -1778,6 +1784,9 @@ static int tegra_hdmi_remove(struct platform_device *pdev)
>
> tegra_output_remove(&hdmi->output);
>
> + if (hdmi->output.notifier)
> + cec_notifier_put(hdmi->output.notifier);
> +
> return 0;
> }
>
> diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
> index 595d1ec3e02e..57c052521a44 100644
> --- a/drivers/gpu/drm/tegra/output.c
> +++ b/drivers/gpu/drm/tegra/output.c
> @@ -11,6 +11,8 @@
> #include <drm/drm_panel.h>
> #include "drm.h"
>
> +#include <media/cec-notifier.h>
> +
> int tegra_output_connector_get_modes(struct drm_connector *connector)
> {
> struct tegra_output *output = connector_to_output(connector);
> @@ -33,6 +35,7 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
> edid = drm_get_edid(connector, output->ddc);
>
> drm_mode_connector_update_edid_property(connector, edid);
> + cec_notifier_set_phys_addr_from_edid(output->notifier, edid);
I had to guard this with:
#if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER)
...
#endif
to enable this driver to be built without CEC_NOTIFIER enabled. I see
that there are stubs defined if the above is false, but for some reason
they don't seem to be there for me either.
>
> if (edid) {
> err = drm_add_edid_modes(connector, edid);
> @@ -68,6 +71,9 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
> status = connector_status_connected;
> }
>
> + if (status != connector_status_connected)
> + cec_notifier_phys_addr_invalidate(output->notifier);
Same here.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 4/4] drm/tegra: add cec-notifier support
2017-10-19 13:17 ` Thierry Reding
@ 2017-10-19 13:30 ` Thierry Reding
2017-10-19 13:37 ` Hans Verkuil
0 siblings, 1 reply; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 13:30 UTC (permalink / raw)
To: Hans Verkuil
Cc: linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Hans Verkuil
[-- Attachment #1: Type: text/plain, Size: 5172 bytes --]
On Thu, Oct 19, 2017 at 03:17:16PM +0200, Thierry Reding wrote:
> On Mon, Sep 11, 2017 at 02:29:52PM +0200, Hans Verkuil wrote:
> > From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> >
> > In order to support CEC the HDMI driver has to inform the CEC driver
> > whenever the physical address changes. So when the EDID is read the
> > CEC driver has to be informed and whenever the hotplug detect goes
> > away.
> >
> > This is done through the cec-notifier framework.
> >
> > The link between the HDMI driver and the CEC driver is done through
> > the hdmi_phandle in the tegra-cec node in the device tree.
> >
> > Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> > ---
> > drivers/gpu/drm/tegra/Kconfig | 1 +
> > drivers/gpu/drm/tegra/drm.h | 3 +++
> > drivers/gpu/drm/tegra/hdmi.c | 9 +++++++++
> > drivers/gpu/drm/tegra/output.c | 6 ++++++
> > 4 files changed, 19 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
> > index 2db29d67193d..c882918c2024 100644
> > --- a/drivers/gpu/drm/tegra/Kconfig
> > +++ b/drivers/gpu/drm/tegra/Kconfig
> > @@ -8,6 +8,7 @@ config DRM_TEGRA
> > select DRM_PANEL
> > select TEGRA_HOST1X
> > select IOMMU_IOVA if IOMMU_SUPPORT
> > + select CEC_CORE if CEC_NOTIFIER
> > help
> > Choose this option if you have an NVIDIA Tegra SoC.
> >
> > diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
> > index 6d6da01282f3..c0a18b60caf1 100644
> > --- a/drivers/gpu/drm/tegra/drm.h
> > +++ b/drivers/gpu/drm/tegra/drm.h
> > @@ -212,6 +212,8 @@ int tegra_dc_state_setup_clock(struct tegra_dc *dc,
> > struct clk *clk, unsigned long pclk,
> > unsigned int div);
> >
> > +struct cec_notifier;
> > +
> > struct tegra_output {
> > struct device_node *of_node;
> > struct device *dev;
> > @@ -219,6 +221,7 @@ struct tegra_output {
> > struct drm_panel *panel;
> > struct i2c_adapter *ddc;
> > const struct edid *edid;
> > + struct cec_notifier *notifier;
> > unsigned int hpd_irq;
> > int hpd_gpio;
> > enum of_gpio_flags hpd_gpio_flags;
> > diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
> > index cda0491ed6bf..fbf14e1efd0e 100644
> > --- a/drivers/gpu/drm/tegra/hdmi.c
> > +++ b/drivers/gpu/drm/tegra/hdmi.c
> > @@ -21,6 +21,8 @@
> >
> > #include <sound/hda_verbs.h>
> >
> > +#include <media/cec-notifier.h>
> > +
> > #include "hdmi.h"
> > #include "drm.h"
> > #include "dc.h"
> > @@ -1720,6 +1722,10 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
> > return PTR_ERR(hdmi->vdd);
> > }
> >
> > + hdmi->output.notifier = cec_notifier_get(&pdev->dev);
> > + if (hdmi->output.notifier == NULL)
> > + return -ENOMEM;
> > +
> > hdmi->output.dev = &pdev->dev;
> >
> > err = tegra_output_probe(&hdmi->output);
> > @@ -1778,6 +1784,9 @@ static int tegra_hdmi_remove(struct platform_device *pdev)
> >
> > tegra_output_remove(&hdmi->output);
> >
> > + if (hdmi->output.notifier)
> > + cec_notifier_put(hdmi->output.notifier);
> > +
> > return 0;
> > }
> >
> > diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
> > index 595d1ec3e02e..57c052521a44 100644
> > --- a/drivers/gpu/drm/tegra/output.c
> > +++ b/drivers/gpu/drm/tegra/output.c
> > @@ -11,6 +11,8 @@
> > #include <drm/drm_panel.h>
> > #include "drm.h"
> >
> > +#include <media/cec-notifier.h>
> > +
> > int tegra_output_connector_get_modes(struct drm_connector *connector)
> > {
> > struct tegra_output *output = connector_to_output(connector);
> > @@ -33,6 +35,7 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
> > edid = drm_get_edid(connector, output->ddc);
> >
> > drm_mode_connector_update_edid_property(connector, edid);
> > + cec_notifier_set_phys_addr_from_edid(output->notifier, edid);
>
> I had to guard this with:
>
> #if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER)
> ...
> #endif
>
> to enable this driver to be built without CEC_NOTIFIER enabled. I see
> that there are stubs defined if the above is false, but for some reason
> they don't seem to be there for me either.
Nevermind that. This was not actually failing. However, ...
> >
> > if (edid) {
> > err = drm_add_edid_modes(connector, edid);
> > @@ -68,6 +71,9 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
> > status = connector_status_connected;
> > }
> >
> > + if (status != connector_status_connected)
> > + cec_notifier_phys_addr_invalidate(output->notifier);
This doesn't seem to exist in v4.14-rc1 which is the base for the
drm/tegra tree for v4.15. I see this function will be introduced in
v4.15 via the media tree.
How about if I replace this by:
cec_notifier_set_phys(output->notifier, CEC_PHYS_ADDR_INVALID);
for now and switch it over to the new function after v4.15-rc1? That way
we can avoid the extra dependency between the media and drm trees.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 4/4] drm/tegra: add cec-notifier support
2017-10-19 13:30 ` Thierry Reding
@ 2017-10-19 13:37 ` Hans Verkuil
[not found] ` <7e1fcffd-76dc-c4f2-942c-b9872f73fff0-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
0 siblings, 1 reply; 19+ messages in thread
From: Hans Verkuil @ 2017-10-19 13:37 UTC (permalink / raw)
To: Thierry Reding, Hans Verkuil
Cc: linux-media, linux-tegra, devicetree, dri-devel, Hans Verkuil
On 10/19/17 15:30, Thierry Reding wrote:
> On Thu, Oct 19, 2017 at 03:17:16PM +0200, Thierry Reding wrote:
>> On Mon, Sep 11, 2017 at 02:29:52PM +0200, Hans Verkuil wrote:
>>> From: Hans Verkuil <hans.verkuil@cisco.com>
>>>
>>> In order to support CEC the HDMI driver has to inform the CEC driver
>>> whenever the physical address changes. So when the EDID is read the
>>> CEC driver has to be informed and whenever the hotplug detect goes
>>> away.
>>>
>>> This is done through the cec-notifier framework.
>>>
>>> The link between the HDMI driver and the CEC driver is done through
>>> the hdmi_phandle in the tegra-cec node in the device tree.
>>>
>>> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
>>> ---
>>> drivers/gpu/drm/tegra/Kconfig | 1 +
>>> drivers/gpu/drm/tegra/drm.h | 3 +++
>>> drivers/gpu/drm/tegra/hdmi.c | 9 +++++++++
>>> drivers/gpu/drm/tegra/output.c | 6 ++++++
>>> 4 files changed, 19 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
>>> index 2db29d67193d..c882918c2024 100644
>>> --- a/drivers/gpu/drm/tegra/Kconfig
>>> +++ b/drivers/gpu/drm/tegra/Kconfig
>>> @@ -8,6 +8,7 @@ config DRM_TEGRA
>>> select DRM_PANEL
>>> select TEGRA_HOST1X
>>> select IOMMU_IOVA if IOMMU_SUPPORT
>>> + select CEC_CORE if CEC_NOTIFIER
>>> help
>>> Choose this option if you have an NVIDIA Tegra SoC.
>>>
>>> diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
>>> index 6d6da01282f3..c0a18b60caf1 100644
>>> --- a/drivers/gpu/drm/tegra/drm.h
>>> +++ b/drivers/gpu/drm/tegra/drm.h
>>> @@ -212,6 +212,8 @@ int tegra_dc_state_setup_clock(struct tegra_dc *dc,
>>> struct clk *clk, unsigned long pclk,
>>> unsigned int div);
>>>
>>> +struct cec_notifier;
>>> +
>>> struct tegra_output {
>>> struct device_node *of_node;
>>> struct device *dev;
>>> @@ -219,6 +221,7 @@ struct tegra_output {
>>> struct drm_panel *panel;
>>> struct i2c_adapter *ddc;
>>> const struct edid *edid;
>>> + struct cec_notifier *notifier;
>>> unsigned int hpd_irq;
>>> int hpd_gpio;
>>> enum of_gpio_flags hpd_gpio_flags;
>>> diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
>>> index cda0491ed6bf..fbf14e1efd0e 100644
>>> --- a/drivers/gpu/drm/tegra/hdmi.c
>>> +++ b/drivers/gpu/drm/tegra/hdmi.c
>>> @@ -21,6 +21,8 @@
>>>
>>> #include <sound/hda_verbs.h>
>>>
>>> +#include <media/cec-notifier.h>
>>> +
>>> #include "hdmi.h"
>>> #include "drm.h"
>>> #include "dc.h"
>>> @@ -1720,6 +1722,10 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
>>> return PTR_ERR(hdmi->vdd);
>>> }
>>>
>>> + hdmi->output.notifier = cec_notifier_get(&pdev->dev);
>>> + if (hdmi->output.notifier == NULL)
>>> + return -ENOMEM;
>>> +
>>> hdmi->output.dev = &pdev->dev;
>>>
>>> err = tegra_output_probe(&hdmi->output);
>>> @@ -1778,6 +1784,9 @@ static int tegra_hdmi_remove(struct platform_device *pdev)
>>>
>>> tegra_output_remove(&hdmi->output);
>>>
>>> + if (hdmi->output.notifier)
>>> + cec_notifier_put(hdmi->output.notifier);
>>> +
>>> return 0;
>>> }
>>>
>>> diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
>>> index 595d1ec3e02e..57c052521a44 100644
>>> --- a/drivers/gpu/drm/tegra/output.c
>>> +++ b/drivers/gpu/drm/tegra/output.c
>>> @@ -11,6 +11,8 @@
>>> #include <drm/drm_panel.h>
>>> #include "drm.h"
>>>
>>> +#include <media/cec-notifier.h>
>>> +
>>> int tegra_output_connector_get_modes(struct drm_connector *connector)
>>> {
>>> struct tegra_output *output = connector_to_output(connector);
>>> @@ -33,6 +35,7 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
>>> edid = drm_get_edid(connector, output->ddc);
>>>
>>> drm_mode_connector_update_edid_property(connector, edid);
>>> + cec_notifier_set_phys_addr_from_edid(output->notifier, edid);
>>
>> I had to guard this with:
>>
>> #if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER)
>> ...
>> #endif
>>
>> to enable this driver to be built without CEC_NOTIFIER enabled. I see
>> that there are stubs defined if the above is false, but for some reason
>> they don't seem to be there for me either.
>
> Nevermind that. This was not actually failing. However, ...
>
>>>
>>> if (edid) {
>>> err = drm_add_edid_modes(connector, edid);
>>> @@ -68,6 +71,9 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
>>> status = connector_status_connected;
>>> }
>>>
>>> + if (status != connector_status_connected)
>>> + cec_notifier_phys_addr_invalidate(output->notifier);
>
> This doesn't seem to exist in v4.14-rc1 which is the base for the
> drm/tegra tree for v4.15. I see this function will be introduced in
> v4.15 via the media tree.
Strange. This was released in the 4.13 kernel, so you should really have it.
It compiles fine for me, both with the drm tegra driver built-in and as a
module.
This makes no sense to me.
Regards,
Hans
>
> How about if I replace this by:
>
> cec_notifier_set_phys(output->notifier, CEC_PHYS_ADDR_INVALID);
>
> for now and switch it over to the new function after v4.15-rc1? That way
> we can avoid the extra dependency between the media and drm trees.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCHv4 4/4] drm/tegra: add cec-notifier support
[not found] ` <7e1fcffd-76dc-c4f2-942c-b9872f73fff0-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
@ 2017-10-19 14:01 ` Thierry Reding
0 siblings, 0 replies; 19+ messages in thread
From: Thierry Reding @ 2017-10-19 14:01 UTC (permalink / raw)
To: Hans Verkuil
Cc: Hans Verkuil, linux-media-u79uwXL29TY76Z2rM5mHXA,
linux-tegra-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Hans Verkuil
[-- Attachment #1: Type: text/plain, Size: 5685 bytes --]
On Thu, Oct 19, 2017 at 03:37:43PM +0200, Hans Verkuil wrote:
> On 10/19/17 15:30, Thierry Reding wrote:
> > On Thu, Oct 19, 2017 at 03:17:16PM +0200, Thierry Reding wrote:
> >> On Mon, Sep 11, 2017 at 02:29:52PM +0200, Hans Verkuil wrote:
> >>> From: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> >>>
> >>> In order to support CEC the HDMI driver has to inform the CEC driver
> >>> whenever the physical address changes. So when the EDID is read the
> >>> CEC driver has to be informed and whenever the hotplug detect goes
> >>> away.
> >>>
> >>> This is done through the cec-notifier framework.
> >>>
> >>> The link between the HDMI driver and the CEC driver is done through
> >>> the hdmi_phandle in the tegra-cec node in the device tree.
> >>>
> >>> Signed-off-by: Hans Verkuil <hans.verkuil-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
> >>> ---
> >>> drivers/gpu/drm/tegra/Kconfig | 1 +
> >>> drivers/gpu/drm/tegra/drm.h | 3 +++
> >>> drivers/gpu/drm/tegra/hdmi.c | 9 +++++++++
> >>> drivers/gpu/drm/tegra/output.c | 6 ++++++
> >>> 4 files changed, 19 insertions(+)
> >>>
> >>> diff --git a/drivers/gpu/drm/tegra/Kconfig b/drivers/gpu/drm/tegra/Kconfig
> >>> index 2db29d67193d..c882918c2024 100644
> >>> --- a/drivers/gpu/drm/tegra/Kconfig
> >>> +++ b/drivers/gpu/drm/tegra/Kconfig
> >>> @@ -8,6 +8,7 @@ config DRM_TEGRA
> >>> select DRM_PANEL
> >>> select TEGRA_HOST1X
> >>> select IOMMU_IOVA if IOMMU_SUPPORT
> >>> + select CEC_CORE if CEC_NOTIFIER
> >>> help
> >>> Choose this option if you have an NVIDIA Tegra SoC.
> >>>
> >>> diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
> >>> index 6d6da01282f3..c0a18b60caf1 100644
> >>> --- a/drivers/gpu/drm/tegra/drm.h
> >>> +++ b/drivers/gpu/drm/tegra/drm.h
> >>> @@ -212,6 +212,8 @@ int tegra_dc_state_setup_clock(struct tegra_dc *dc,
> >>> struct clk *clk, unsigned long pclk,
> >>> unsigned int div);
> >>>
> >>> +struct cec_notifier;
> >>> +
> >>> struct tegra_output {
> >>> struct device_node *of_node;
> >>> struct device *dev;
> >>> @@ -219,6 +221,7 @@ struct tegra_output {
> >>> struct drm_panel *panel;
> >>> struct i2c_adapter *ddc;
> >>> const struct edid *edid;
> >>> + struct cec_notifier *notifier;
> >>> unsigned int hpd_irq;
> >>> int hpd_gpio;
> >>> enum of_gpio_flags hpd_gpio_flags;
> >>> diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
> >>> index cda0491ed6bf..fbf14e1efd0e 100644
> >>> --- a/drivers/gpu/drm/tegra/hdmi.c
> >>> +++ b/drivers/gpu/drm/tegra/hdmi.c
> >>> @@ -21,6 +21,8 @@
> >>>
> >>> #include <sound/hda_verbs.h>
> >>>
> >>> +#include <media/cec-notifier.h>
> >>> +
> >>> #include "hdmi.h"
> >>> #include "drm.h"
> >>> #include "dc.h"
> >>> @@ -1720,6 +1722,10 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
> >>> return PTR_ERR(hdmi->vdd);
> >>> }
> >>>
> >>> + hdmi->output.notifier = cec_notifier_get(&pdev->dev);
> >>> + if (hdmi->output.notifier == NULL)
> >>> + return -ENOMEM;
> >>> +
> >>> hdmi->output.dev = &pdev->dev;
> >>>
> >>> err = tegra_output_probe(&hdmi->output);
> >>> @@ -1778,6 +1784,9 @@ static int tegra_hdmi_remove(struct platform_device *pdev)
> >>>
> >>> tegra_output_remove(&hdmi->output);
> >>>
> >>> + if (hdmi->output.notifier)
> >>> + cec_notifier_put(hdmi->output.notifier);
> >>> +
> >>> return 0;
> >>> }
> >>>
> >>> diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
> >>> index 595d1ec3e02e..57c052521a44 100644
> >>> --- a/drivers/gpu/drm/tegra/output.c
> >>> +++ b/drivers/gpu/drm/tegra/output.c
> >>> @@ -11,6 +11,8 @@
> >>> #include <drm/drm_panel.h>
> >>> #include "drm.h"
> >>>
> >>> +#include <media/cec-notifier.h>
> >>> +
> >>> int tegra_output_connector_get_modes(struct drm_connector *connector)
> >>> {
> >>> struct tegra_output *output = connector_to_output(connector);
> >>> @@ -33,6 +35,7 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
> >>> edid = drm_get_edid(connector, output->ddc);
> >>>
> >>> drm_mode_connector_update_edid_property(connector, edid);
> >>> + cec_notifier_set_phys_addr_from_edid(output->notifier, edid);
> >>
> >> I had to guard this with:
> >>
> >> #if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER)
> >> ...
> >> #endif
> >>
> >> to enable this driver to be built without CEC_NOTIFIER enabled. I see
> >> that there are stubs defined if the above is false, but for some reason
> >> they don't seem to be there for me either.
> >
> > Nevermind that. This was not actually failing. However, ...
> >
> >>>
> >>> if (edid) {
> >>> err = drm_add_edid_modes(connector, edid);
> >>> @@ -68,6 +71,9 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
> >>> status = connector_status_connected;
> >>> }
> >>>
> >>> + if (status != connector_status_connected)
> >>> + cec_notifier_phys_addr_invalidate(output->notifier);
> >
> > This doesn't seem to exist in v4.14-rc1 which is the base for the
> > drm/tegra tree for v4.15. I see this function will be introduced in
> > v4.15 via the media tree.
>
> Strange. This was released in the 4.13 kernel, so you should really have it.
> It compiles fine for me, both with the drm tegra driver built-in and as a
> module.
>
> This makes no sense to me.
Sigh... you're right. I had inadvertently rebased onto a v4.13-rc1 when
build testing. Sorry for the noise, it's working perfectly fine on top
of v4.14-rc1.
Thierry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2017-10-19 14:01 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-11 12:29 [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Hans Verkuil
[not found] ` <20170911122952.33980-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-09-11 12:29 ` [PATCHv4 1/4] dt-bindings: document the tegra CEC bindings Hans Verkuil
[not found] ` <20170911122952.33980-2-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-19 9:22 ` Thierry Reding
2017-09-11 12:29 ` [PATCHv4 3/4] tegra-cec: add Tegra HDMI CEC driver Hans Verkuil
[not found] ` <20170911122952.33980-4-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-19 9:37 ` Thierry Reding
2017-09-11 12:29 ` [PATCHv4 4/4] drm/tegra: add cec-notifier support Hans Verkuil
[not found] ` <20170911122952.33980-5-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-19 9:38 ` Thierry Reding
2017-10-19 13:17 ` Thierry Reding
2017-10-19 13:30 ` Thierry Reding
2017-10-19 13:37 ` Hans Verkuil
[not found] ` <7e1fcffd-76dc-c4f2-942c-b9872f73fff0-FYB4Gu1CFyUAvxtiuMwx3w@public.gmane.org>
2017-10-19 14:01 ` Thierry Reding
2017-10-19 9:20 ` [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Thierry Reding
2017-10-19 9:36 ` Hans Verkuil
[not found] ` <0f43276f-0a89-8caa-6522-253458e3ad08-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-19 9:39 ` Thierry Reding
2017-09-11 12:29 ` [PATCHv4 2/4] ARM: tegra: add CEC support to tegra124.dtsi Hans Verkuil
[not found] ` <20170911122952.33980-3-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-19 9:23 ` Thierry Reding
2017-10-14 12:08 ` [PATCHv4 0/4] tegra-cec: add Tegra HDMI CEC support Hans Verkuil
[not found] ` <9314614a-446d-b76d-640b-033cc74e3879-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org>
2017-10-14 13:34 ` Thierry Reding
2017-10-14 13:48 ` Hans Verkuil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).