From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751711AbdBAI3q (ORCPT ); Wed, 1 Feb 2017 03:29:46 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:45754 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751404AbdBAI3o (ORCPT ); Wed, 1 Feb 2017 03:29:44 -0500 X-AuditID: cbfec7f4-f79716d000006f65-04-58919c7401b5 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 v3 4/7] drm/exynos/hdmi: add bridge support Date: Wed, 01 Feb 2017 09:29:14 +0100 Message-id: <1485937754-21440-1-git-send-email-a.hajda@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <58919994.3060100@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrLIsWRmVeSWpSXmKPExsWy7djP87olcyZGGPzfo25xa905VouNM9az Wlz5+p7NYtL9CSwW589vYLc42/SG3eLyrjlsFjPO72OyWHvkLrsDp8emVZ1sHve7jzN59G1Z xejxeZNcAEsUl01Kak5mWWqRvl0CV8ah06tYC3okK16e7WJrYPws0sXIySEhYCJx4uVjNghb TOLCvfVANheHkMBSRomWGQuYIJzPjBI/5ywAynCAdXw+nwQRX8Yo8eLEA6iO/4wSKzsfM4OM YhPQlPi7+SbYWBGBXImTX4+AFTEL/GGUuHlnKSNIQljAWmLJxMWsIFNZBFQlVm+XAAnzCjhL XN1ykAXiJDmJm+c6wWZyCmhLHFq2FmyOhEAzu8TPGSBFIBfJSmw6wAxR7yJx+MxbKFtY4tXx LewQtoxEZ8dBJojebkaJT/0n2CGcKYwS/z7MgOqwljh8/CIriM0swCcxadt0ZogFvBIdbUIQ JR4SZ2f/gCp3lPjc+g7sfiGBOomDfywnMMosYGRYxSiSWlqcm55abKJXnJhbXJqXrpecn7uJ ERjJp/8d/7KDcfExq0OMAhyMSjy8M05OiBBiTSwrrsw9xCjBwawkwss9c2KEEG9KYmVValF+ fFFpTmrxIUZpDhYlcd49C66ECwmkJ5akZqemFqQWwWSZODilGhgDFnsc0qlePmvFm4eMuiWx Pxz4pq1/l7O/8AHvtWB7A520VwUXYuSFZsgG997X5d4vUfhv2cFUlVdLpA9/U3ztZ+96rc86 6uTuJPXzWRGXNm3Venx8XshlpbJbvkY2P27VyrhWzW6+n1za12JV+Soz3niJl3byL6nF8gY1 z38cLVDl64qOKlZiKc5INNRiLipOBADzrawr4AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrLLMWRmVeSWpSXmKPExsVy+t/xy7o75kyMMHjz2tzi1rpzrBYbZ6xn tbjy9T2bxaT7E1gszp/fwG5xtukNu8XlXXPYLGac38dksfbIXXYHTo9NqzrZPO53H2fy6Nuy itHj8ya5AJYoN5uM1MSU1CKF1Lzk/JTMvHRbpdAQN10LJYW8xNxUW6UIXd+QICWFssScUiDP yAANODgHuAcr6dsluGUcOr2KtaBHsuLl2S62BsbPIl2MHBwSAiYSn88ndTFyApliEhfurWfr YuTiEBJYwihxs/M2I4TTyCRxccpnRpAqNgFNib+bb7KB2CICuRLrn85kByliFvjHKLHh6hsm kISwgLXEkomLWUE2sAioSqzeLgES5hVwlri65SALxDY5iZvnOplBbE4BbYlDy9aCzRQS0JK4 +3E62wRG3gWMDKsYRVJLi3PTc4sN9YoTc4tL89L1kvNzNzECg3rbsZ+bdzBe2hh8iFGAg1GJ h/fD6QkRQqyJZcWVuYcYJTiYlUR4uWdOjBDiTUmsrEotyo8vKs1JLT7EaAp000RmKdHkfGDE 5ZXEG5oYmlsaGhlbWJgbGSmJ85Z8uBIuJJCeWJKanZpakFoE08fEwSnVwDih6w7X2qjNYiop htpBPJeuzzqYVC0pzHVxaZXZZk5jxQPT1iSdO/fsxNp4PU6Oz+ee+5T9cY60cPIXPvqiYlNk 8ZodG39yB3barPtdfO5KPQO3XXJmZ/wzyd9zeM47venSvnSLzeOLytbnepdMzwR9jbjamf1z 8bQ180Rj17bl/S15OmdR3iclluKMREMt5qLiRAD6Z/wlgAIAAA== X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170201082940eucas1p1f19e15328a787d6b77cba97bad92afce X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 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: 20170201082940eucas1p1f19e15328a787d6b77cba97bad92afce X-RootMTR: 20170201082940eucas1p1f19e15328a787d6b77cba97bad92afce References: <58919994.3060100@samsung.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On TM2/TM2e platforms HDMI output is connected to MHL bridge SiI8620. To allow configure UltraHD modes on the bridge and to eliminate unsupported modes this bridge should be attached to drm_encoder implemented in exynos_hdmi. 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