From patchwork Sun Jul 30 11:08:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans Verkuil X-Patchwork-Id: 9870413 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CFA866037D for ; Sun, 30 Jul 2017 11:09:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C2D02283E8 for ; Sun, 30 Jul 2017 11:09:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B4238284F4; Sun, 30 Jul 2017 11:09:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A4D7E283E8 for ; Sun, 30 Jul 2017 11:09:01 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A5E3289141; Sun, 30 Jul 2017 11:08:37 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from lb1-smtp-cloud9.xs4all.net (lb1-smtp-cloud9.xs4all.net [194.109.24.22]) by gabe.freedesktop.org (Postfix) with ESMTPS id 52DE789141 for ; Sun, 30 Jul 2017 11:08:35 +0000 (UTC) Received: from [192.168.2.10] ([212.251.195.8]) by smtp-cloud9.xs4all.net with ESMTPA id bm5GdtpBcwANnbm5JdkQ11; Sun, 30 Jul 2017 13:08:34 +0200 Subject: [PATCHv2 4/4] drm/tegra: add cec-notifier support From: Hans Verkuil To: linux-media@vger.kernel.org References: <20170715124753.43714-1-hverkuil@xs4all.nl> <20170715124753.43714-5-hverkuil@xs4all.nl> Message-ID: Date: Sun, 30 Jul 2017 13:08:30 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <20170715124753.43714-5-hverkuil@xs4all.nl> Content-Language: en-US X-CMAE-Envelope: MS4wfDG9CoW/oy3u2yJ+MdxWuWqv/1hRW78IgKCsZFvL11cqOTDNsL8AORrZCjx6Jf4oCd8mytpdty0NrT8/7tpvixTNSV+emtE004+TSsPfbf4Au/viA8Hj ZWwh5CMMR23nWHK27/HUMeav4UjT9k7ldXI/Vb+WXiMkJEg9kKG8TrA0iuMW5wdPzvgNBJOZ3JegFQVLw1Kto+FpSwyIxfzw9ywlojiVfvvSVgShRTQvHPFI 8Az+jN6q8Vh5VHbMU3L5MuLwYxre6tX83KNv3oIIp7nF0N/KFLofKgCIJmCbwvFC7vr/+6MKy4n8x9xw9HklhmyredIx4jjS4TD6zR6gIOARwzoukvMN4qAq aXucpcJe Cc: linux-tegra@vger.kernel.org, devicetree@vger.kernel.org, Hans Verkuil , dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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 --- Changes since v1: Add 'select CEC_CORE if CEC_NOTIFIER' to Kconfig. If the tegra-cec driver is a module and the drm tegra driver is built-in, then the CEC core will be a module also, causing the CEC notifier to fail (will be compiled as empty functions). This select forces the correct dependency. --- 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 +#include + #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 #include "drm.h" +#include + 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; }