From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751695AbdATGxw (ORCPT ); Fri, 20 Jan 2017 01:53:52 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:8733 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751359AbdATGwm (ORCPT ); Fri, 20 Jan 2017 01:52:42 -0500 X-AuditID: cbfec7ef-f79d26d00000420c-fd-5881b3b1c699 From: Andrzej Hajda To: Inki Dae , dri-devel@lists.freedesktop.org, Krzysztof Kozlowski Cc: Andrzej Hajda , Bartlomiej Zolnierkiewicz , Marek Szyprowski , Kyungmin Park , linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org Subject: [PATCH 4/7] drm/exynos/hdmi: add bridge support Date: Fri, 20 Jan 2017 07:52:22 +0100 Message-id: <1484895145-511-5-git-send-email-a.hajda@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1484895145-511-1-git-send-email-a.hajda@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrAIsWRmVeSWpSXmKPExsWy7djPc7obNzdGGPxoMrO4te4cq8XGGetZ La58fc9mMen+BBaL8+c3sFucbXrDbnF51xw2ixnn9zFZrD1yl92B02PTqk42j/vdx5k8+ras YvT4vEkugCWKyyYlNSezLLVI3y6BK+Pj549MBX0SFZ9//GBuYGwT6WLk5JAQMJHo2DmbCcIW k7hwbz1bFyMXh5DAMkaJs7tOsUA4nxklZjU8Zobp2N3Yh1C1/OYBdgjnP6NE29Sb7CBVbAKa En8332QDsUUEciVOfj0C1sEs8IdR4uadpYwgCWEBC4n5u8+D2SwCqhKbu/+xgNi8Ao4SHV8v s0Gsk5O4ea4TaDUHB6eAk8TeRekgcyQEvrNJbLlzgAUkLiEgK7HpANR1LhIf7h9nhLCFJV4d 38IOYctIXJ7czQLR280o8an/BDuEM4VR4t+HGVDd1hKHj19kBbGZBfgkJm2bzgyxgFeio00I osRD4um7xywQtqPEjCOvmSC+n8oo8ffbBqYJjDILGBlWMYqklhbnpqcWG+oVJ+YWl+al6yXn 525iBMbz6X/H3+9gfNoccohRgINRiYd3x4mGCCHWxLLiytxDjBIczEoivD3rGyOEeFMSK6tS i/Lji0pzUosPMUpzsCiJ8+5dcCVcSCA9sSQ1OzW1ILUIJsvEwSnVwGhst+XPXOfXQYdZOVpL GoQvHrXxn/H2u+ybIN/b27+7MolkVK+RUGi/edbXcNKyVEvHGZs2fbl5UNUs+eKLFq+NH9b7 u7RGvL9Ytu1AIUtG3rO+9frtp5+7Cng0hq7eeigi68COlcnBz+9udSip/F9+OSg/K9FqeqzN XsvHVy6niZ2vfJbU56rEUpyRaKjFXFScCADqSTzF4wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrLLMWRmVeSWpSXmKPExsVy+t/xa7qrNjdGGGzr4rG4te4cq8XGGetZ La58fc9mMen+BBaL8+c3sFucbXrDbnF51xw2ixnn9zFZrD1yl92B02PTqk42j/vdx5k8+ras YvT4vEkugCXKzSYjNTEltUghNS85PyUzL91WKTTETddCSSEvMTfVVilC1zckSEmhLDGnFMgz MkADDs4B7sFK+nYJbhkfP39kKuiTqPj84wdzA2ObSBcjJ4eEgInE7sY+NghbTOLCvfVANheH kMASRol/85qYQRJCAo1MEhffghWxCWhK/N18E8wWEciVWP90JjtIA7PAP0aJDVffMIEkhAUs JObvPs8IYrMIqEps7v7HAmLzCjhKdHy9DLVNTuLmuU6gBRwcnAJOEnsXpUPscpQ42HyAbQIj 7wJGhlWMIqmlxbnpucVGesWJucWleel6yfm5mxiBQb3t2M8tOxi73gUfYhTgYFTi4d1xoiFC iDWxrLgy9xCjBAezkghvz/rGCCHelMTKqtSi/Pii0pzU4kOMpkA3TWSWEk3OB0ZcXkm8oYmh uaWhkbGFhbmRkZI479QPV8KFBNITS1KzU1MLUotg+pg4OKUaGM/7XZmcz/aUpUPDolvcev6R sJUWpSapsxesFyipCbS4qNc25+oSzjmMLgzGRiYesTIqfFY9BZz3GquWTZNT2TOlI2tKv1FA 2uxN/itPOv6/ZzPl8tsmt9Vx0wzX6sXtOpBuc6Y6aZ5dd5E9d6H+nk6rjNjA9Oml78Ln/6jz nhhsF3Si/9UFJZbijERDLeai4kQAs/9LRIACAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170120065230eucas1p2e22f7b832ec7e1c770c3e8a27a3341f5 X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRvsgrw=?= =?UTF-8?B?7ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?QW5kcnplaiBIYWpkYRtTUlBPTC1LZXJuZWwgKFRQKRtTYW1z?= =?UTF-8?B?dW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170120065230eucas1p2e22f7b832ec7e1c770c3e8a27a3341f5 X-RootMTR: 20170120065230eucas1p2e22f7b832ec7e1c770c3e8a27a3341f5 References: <1484895145-511-1-git-send-email-a.hajda@samsung.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In some platforms there is attached another device to the end of HDMI. The patch adds support for it. Signed-off-by: Andrzej Hajda --- drivers/gpu/drm/exynos/exynos_hdmi.c | 56 +++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index a73b192..41fb894 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -133,6 +134,7 @@ struct hdmi_context { struct regulator_bulk_data regul_bulk[ARRAY_SIZE(supply)]; struct regulator *reg_hdmi_en; struct exynos_drm_clk phy_clk; + struct drm_bridge *bridge; }; static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e) @@ -922,7 +924,15 @@ static int hdmi_create_connector(struct drm_encoder *encoder) drm_connector_register(connector); drm_mode_connector_attach_encoder(connector, encoder); - return 0; + if (hdata->bridge) { + encoder->bridge = hdata->bridge; + hdata->bridge->encoder = encoder; + ret = drm_bridge_attach(encoder->dev, hdata->bridge); + if (ret) + DRM_ERROR("Failed to attach bridge\n"); + } + + return ret; } static bool hdmi_mode_fixup(struct drm_encoder *encoder, @@ -1591,6 +1601,31 @@ static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable) hdmiphy_disable(hdata); } +static int hdmi_bridge_init(struct hdmi_context *hdata) +{ + struct device *dev = hdata->dev; + struct device_node *ep, *np; + + ep = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1); + if (!ep) + return 0; + + np = of_graph_get_remote_port_parent(ep); + of_node_put(ep); + if (!np) { + DRM_ERROR("failed to get remote port parent"); + return -EINVAL; + } + + hdata->bridge = of_drm_find_bridge(np); + of_node_put(np); + + if (!hdata->bridge) + return -EPROBE_DEFER; + + return 0; +} + static int hdmi_resources_init(struct hdmi_context *hdata) { struct device *dev = hdata->dev; @@ -1630,17 +1665,18 @@ static int hdmi_resources_init(struct hdmi_context *hdata) hdata->reg_hdmi_en = devm_regulator_get_optional(dev, "hdmi-en"); - if (PTR_ERR(hdata->reg_hdmi_en) == -ENODEV) - return 0; + if (PTR_ERR(hdata->reg_hdmi_en) != -ENODEV) { + if (IS_ERR(hdata->reg_hdmi_en)) + return PTR_ERR(hdata->reg_hdmi_en); - if (IS_ERR(hdata->reg_hdmi_en)) - return PTR_ERR(hdata->reg_hdmi_en); - - ret = regulator_enable(hdata->reg_hdmi_en); - if (ret) - DRM_ERROR("failed to enable hdmi-en regulator\n"); + ret = regulator_enable(hdata->reg_hdmi_en); + if (ret) { + DRM_ERROR("failed to enable hdmi-en regulator\n"); + return ret; + } + } - return ret; + return hdmi_bridge_init(hdata); } static struct of_device_id hdmi_match_types[] = { -- 2.7.4