From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752638AbcCVWWs (ORCPT ); Tue, 22 Mar 2016 18:22:48 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:43537 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751213AbcCVWWp (ORCPT ); Tue, 22 Mar 2016 18:22:45 -0400 MIME-version: 1.0 Content-type: text/plain; charset=utf-8 X-AuditID: cbfee691-f79766d0000012b6-d8-56f1c5b240d6 Content-transfer-encoding: 8BIT Message-id: <56F1C5B2.8020104@samsung.com> Date: Wed, 23 Mar 2016 07:22:42 +0900 From: Inki Dae User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 To: Yakir Yang , Andrzej Hajda , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Jingoo Han , Thierry Reding , Krzysztof Kozlowski , Rob Herring , Heiko Stuebner , Mark Yao Cc: Russell King , djkurtz@chromium.org, dianders@chromium.org, Sean Paul , Kukjin Kim , Kumar Gala , emil.l.velikov@gmail.com, Ian Campbell , Gustavo Padovan , Kishon Vijay Abraham I , Pawel Moll , ajaynumb@gmail.com, robherring2@gmail.com, javier@osg.samsung.com, Andy Yan , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v8 01/17] drm: exynos: dp: convert to drm bridge mode References: <1446020143-32645-1-git-send-email-ykk@rock-chips.com> <1446020345-7388-1-git-send-email-ykk@rock-chips.com> In-reply-to: <1446020345-7388-1-git-send-email-ykk@rock-chips.com> X-Brightmail-Tracker: H4sIAAAAAAAAA02Sa1CMYRTH53lve6E8lvIoBjtuEyJdPA1j4gNvHxjGaIw+sOUtxtZm3zTV uGwqk2qrnbZkUTFNVi12VqOLolZGk2m7KdmmLSW3cgthlOy2DN9+Z87/f875zxwhKWmjPYRH omM5ZbRMLmXElGGu37E1poefQtal3A7A1psWGhtHr5A4u/UZwEWN9rKltIHBSQVFNH7y9QOD a7tsBM4evULjsfJUAZ4aHKGx5e11gEffGQis/3JBgF/b2ik88toHZw+NkLhtOJPBLWdGBdg0 1E3jzppLDB4bmCJxQes9Avd2uuAqbT2Bc87foHBqXaMAfxsfZ3CfsQXggtw3DO796YotqlxB 0GLWUGgAbEpyJsNeVLVTbGeWmmAnXz2l2Gpdn4C9fu0Lw5rKzjFsf8Yjgr1dcppVJ79n2Ips e3NSd59isyrKAFvZXUiyj3oqiV2z94s3HeLkR+I45drNB8WHhyy1dMxwYHz7m2pCBUq804FI iKAfuqxqEjjZHbXZbjHpQCyUQD1AfWdbyL+ivB8dtLOhA+h77+Vphwucjb7n2qh0IBSScBFq 7DjqxBVIq41yygcAalZbGafcC42npVEOpuAy1JmZP82MnTX6fsbhdYP7UEZTgsM7F5pIZKj5 RDoKEppplKROIx2iOTAYTZQDB0pgIlIX8I4xIrgV6ZOTCIccQasIpQ0+Z5y7IBrPNU+fieBC ZKr/E2s+atD3UDnAXfdfGN2/MLp/YYoBWQbcuJjwGD4sUunvzcui+OPRkd7hiigTsD/a418v NVWgv36jGUAhkM50URk/hkhoWRyfEGUG/vYbNKSHW7jC/pvRsQd8fAPWY38/f9/1GwIDpPNc Vnv+2COBkbJY7ijHxXDKA8rjco43A0Io8lABbWIRH68Pql2eXqnyDpEPLQGaF9vGTOLQ8L2u sSWzyneHUomfiz1Dk08Vj7Wu6NpzzSI1tJbKw7I8yz7nFE0olk511xq1zT0PJi6emK/c+sr6 Nm9V0I6dVpPgrq30ZF2CZV8YGVF4dcuMkIeKiJVZogiFESYFvVsevP2Or6smf4GU4g/LfLxI JS/7DWabG05jAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprLJsWRmVeSWpSXmKPExsVy+t9jQd1NRz+GGTw7oWNxa905VosNbxYy W/Sfv8loMf8IkHt22UE2i8YZ81ktrnx9z2ax5+o9Jov+NwtZLT6tbmW3+P/oNavFuVcrGS3e vF3DZLHiy0x2ixf3LrJYvH5haNH/+DWzxYWnPWwWZ5vesFtsenyN1eLyrjlsFp8e/Ge2mHF+ H5PF7cu8FjumHGCymDB9LYtF694j7Bbfv31js7i74SyjxYzJL9ksbv/mszjXMJndQcFjzbw1 jB4tzT1sHrMbLrJ4XO7rZfL4+/w6i8fOWXfZPVYu/8LmsWlVJ5vH/e7jTB6bl9R79Da/Y/PY 0g+U/DtrP4tH35ZVjB7br81j9jh+YztTgGBUA6NNRmpiSmqRQmpecn5KZl66rZJ3cLxzvKmZ gaGuoaWFuZJCXmJuqq2Si0+ArltmDjDglBTKEnNKgUIBicXFSvp2mCaEhrjpWsA0Ruj6hgTB 9RgZoIGENYwZj8/tYS14allx8eVOpgbGJXpdjJwcEgImElN/XmKFsMUkLtxbz9bFyMUhJDCL UeLH7bnsIAleAUGJH5PvsXQxcnAwC8hLHLmUDWGqS0yZkgtR/oBR4lTvLTaIci2Jbx0dLCA2 i4CqxOWeaWA2G5A9ccV9NpBeUYEIie4TlSC9IgKbmCXW7PrIDOIwCxxilWjs7WAGKRIW8JT4 s5oRxBQSqJLonVEMMoZTwEliRXMj0wRGoBsRjpuFcNwshOMWMDKvYpRILUguKE5KzzXMSy3X K07MLS7NS9dLzs/dxAhOms+kdjAe3OV+iFGAg1GJh7dhw4cwIdbEsuLK3EOMEhzMSiK8q/o+ hgnxpiRWVqUW5ccXleakFh9iNAX6biKzlGhyPjCh55XEGxqbmBlZGpkbWhgZmyuJ8z7+vy5M SCA9sSQ1OzW1ILUIpo+Jg1OqgTE2sManNn3RLEHOrTHBXL8esJ8SUj3hNHP6VIWk79z5HN6O /3afk5xxb97ch46nrrntvhJ+f8Xci9KHeZ3PtsTsPFSuIfPk+tr3S623vWM/kOgvOVvnQ+1v efkdXJu3zlku9fBEGsOj/snxfLfEvcXduabHPN8wKc770odOvTfejF/3/7c411asxFKckWio xVxUnAgARu1F/bADAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2015년 10월 28일 17:19에 Yakir Yang 이(가) 쓴 글: > In order to move exynos dp code to bridge directory, > we need to convert driver drm bridge mode first. As > dp driver already have a ptn3460 bridge, so we need > to move ptn bridge to the next bridge of dp bridge. > > Tested-by: Javier Martinez Canillas > Signed-off-by: Yakir Yang Acked-by: Inki Dae Thanks, Inki Dae > --- > Changes in v8: None > Changes in v7: None > Changes in v6: > - Fix the wrong code in previous series, and test on Samsung snow Chromebook > successfully, here are the detail changes: > =============> > - if (!dp->panel && !dp->bridge) { > + if (!dp->panel && !dp->ptn_bridge) { > ret = exynos_dp_dt_parse_panel(dp); > if (ret) > =============> > + encoder->bridge = bridge; > bridge->driver_private = dp; > bridge->encoder = encoder; > bridge->funcs = &exynos_dp_bridge_funcs; > ret = drm_bridge_attach(drm_dev, bridge); > > Changes in v5: None > Changes in v4: None > Changes in v3: None > Changes in v2: > - Keep author name list no changed (Jingoo) > > drivers/gpu/drm/exynos/exynos_dp_core.c | 103 ++++++++++++++++++++++++-------- > drivers/gpu/drm/exynos/exynos_dp_core.h | 1 + > 2 files changed, 78 insertions(+), 26 deletions(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c > index 124fb9a..aedd074 100644 > --- a/drivers/gpu/drm/exynos/exynos_dp_core.c > +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c > @@ -1009,9 +1009,9 @@ static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp, > { > int ret; > > - encoder->bridge = dp->bridge; > - dp->bridge->encoder = encoder; > - ret = drm_bridge_attach(encoder->dev, dp->bridge); > + encoder->bridge->next = dp->ptn_bridge; > + dp->ptn_bridge->encoder = encoder; > + ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge); > if (ret) { > DRM_ERROR("Failed to attach bridge to drm\n"); > return ret; > @@ -1020,14 +1020,15 @@ static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp, > return 0; > } > > -static int exynos_dp_create_connector(struct drm_encoder *encoder) > +static int exynos_dp_bridge_attach(struct drm_bridge *bridge) > { > - struct exynos_dp_device *dp = encoder_to_dp(encoder); > + struct exynos_dp_device *dp = bridge->driver_private; > + struct drm_encoder *encoder = &dp->encoder; > struct drm_connector *connector = &dp->connector; > int ret; > > /* Pre-empt DP connector creation if there's a bridge */ > - if (dp->bridge) { > + if (dp->ptn_bridge) { > ret = exynos_drm_attach_lcd_bridge(dp, encoder); > if (!ret) > return 0; > @@ -1052,22 +1053,9 @@ static int exynos_dp_create_connector(struct drm_encoder *encoder) > return ret; > } > > -static bool exynos_dp_mode_fixup(struct drm_encoder *encoder, > - const struct drm_display_mode *mode, > - struct drm_display_mode *adjusted_mode) > -{ > - return true; > -} > - > -static void exynos_dp_mode_set(struct drm_encoder *encoder, > - struct drm_display_mode *mode, > - struct drm_display_mode *adjusted_mode) > -{ > -} > - > -static void exynos_dp_enable(struct drm_encoder *encoder) > +static void exynos_dp_bridge_enable(struct drm_bridge *bridge) > { > - struct exynos_dp_device *dp = encoder_to_dp(encoder); > + struct exynos_dp_device *dp = bridge->driver_private; > struct exynos_drm_crtc *crtc = dp_to_crtc(dp); > > if (dp->dpms_mode == DRM_MODE_DPMS_ON) > @@ -1092,9 +1080,9 @@ static void exynos_dp_enable(struct drm_encoder *encoder) > dp->dpms_mode = DRM_MODE_DPMS_ON; > } > > -static void exynos_dp_disable(struct drm_encoder *encoder) > +static void exynos_dp_bridge_disable(struct drm_bridge *bridge) > { > - struct exynos_dp_device *dp = encoder_to_dp(encoder); > + struct exynos_dp_device *dp = bridge->driver_private; > struct exynos_drm_crtc *crtc = dp_to_crtc(dp); > > if (dp->dpms_mode != DRM_MODE_DPMS_ON) > @@ -1123,6 +1111,69 @@ static void exynos_dp_disable(struct drm_encoder *encoder) > dp->dpms_mode = DRM_MODE_DPMS_OFF; > } > > +static void exynos_dp_bridge_nop(struct drm_bridge *bridge) > +{ > + /* do nothing */ > +} > + > +static const struct drm_bridge_funcs exynos_dp_bridge_funcs = { > + .enable = exynos_dp_bridge_enable, > + .disable = exynos_dp_bridge_disable, > + .pre_enable = exynos_dp_bridge_nop, > + .post_disable = exynos_dp_bridge_nop, > + .attach = exynos_dp_bridge_attach, > +}; > + > +static int exynos_dp_create_connector(struct drm_encoder *encoder) > +{ > + struct exynos_dp_device *dp = encoder_to_dp(encoder); > + struct drm_device *drm_dev = dp->drm_dev; > + struct drm_bridge *bridge; > + int ret; > + > + bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL); > + if (!bridge) { > + DRM_ERROR("failed to allocate for drm bridge\n"); > + return -ENOMEM; > + } > + > + dp->bridge = bridge; > + > + encoder->bridge = bridge; > + bridge->driver_private = dp; > + bridge->encoder = encoder; > + bridge->funcs = &exynos_dp_bridge_funcs; > + > + ret = drm_bridge_attach(drm_dev, bridge); > + if (ret) { > + DRM_ERROR("failed to attach drm bridge\n"); > + return -EINVAL; > + } > + > + return 0; > +} > + > +static bool exynos_dp_mode_fixup(struct drm_encoder *encoder, > + const struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > +{ > + return true; > +} > + > +static void exynos_dp_mode_set(struct drm_encoder *encoder, > + struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > +{ > +} > + > +static void exynos_dp_enable(struct drm_encoder *encoder) > +{ > +} > + > +static void exynos_dp_disable(struct drm_encoder *encoder) > +{ > +} > + > static struct drm_encoder_helper_funcs exynos_dp_encoder_helper_funcs = { > .mode_fixup = exynos_dp_mode_fixup, > .mode_set = exynos_dp_mode_set, > @@ -1238,7 +1289,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data) > } > } > > - if (!dp->panel && !dp->bridge) { > + if (!dp->panel && !dp->ptn_bridge) { > ret = exynos_dp_dt_parse_panel(dp); > if (ret) > return ret; > @@ -1365,9 +1416,9 @@ static int exynos_dp_probe(struct platform_device *pdev) > if (endpoint) { > bridge_node = of_graph_get_remote_port_parent(endpoint); > if (bridge_node) { > - dp->bridge = of_drm_find_bridge(bridge_node); > + dp->ptn_bridge = of_drm_find_bridge(bridge_node); > of_node_put(bridge_node); > - if (!dp->bridge) > + if (!dp->ptn_bridge) > return -EPROBE_DEFER; > } else > return -EPROBE_DEFER; > diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.h b/drivers/gpu/drm/exynos/exynos_dp_core.h > index e413b6f..66eec4b 100644 > --- a/drivers/gpu/drm/exynos/exynos_dp_core.h > +++ b/drivers/gpu/drm/exynos/exynos_dp_core.h > @@ -153,6 +153,7 @@ struct exynos_dp_device { > struct drm_connector connector; > struct drm_panel *panel; > struct drm_bridge *bridge; > + struct drm_bridge *ptn_bridge; > struct clk *clock; > unsigned int irq; > void __iomem *reg_base; >