Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/exynos: dp: support drm_bridge

Modify driver to support drm_bridge.

Signed-off-by: Ajay Kumar <ajaykumar.rs@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Rahul Sharma <rahul.sharma@samsung.com>
Tested-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
Tested-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Tested-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
Signed-off-by: Thierry Reding <treding@nvidia.com>

authored by

Ajay Kumar and committed by
Thierry Reding
80185567 6a1688ae

+44 -6
+12
Documentation/devicetree/bindings/video/exynos_dp.txt
··· 66 66 Hotplug detect GPIO. 67 67 Indicates which GPIO should be used for hotplug 68 68 detection 69 + -video interfaces: Device node can contain video interface port 70 + nodes according to [1]. 71 + 72 + [1]: Documentation/devicetree/bindings/media/video-interfaces.txt 69 73 70 74 Example: 71 75 ··· 107 103 vback-porch = <10>; 108 104 vfront-porch = <12>; 109 105 vsync-len = <6>; 106 + }; 107 + }; 108 + 109 + ports { 110 + port@0 { 111 + dp_out: endpoint { 112 + remote-endpoint = <&bridge_in>; 113 + }; 110 114 }; 111 115 }; 112 116 };
+31 -6
drivers/gpu/drm/exynos/exynos_dp_core.c
··· 18 18 #include <linux/interrupt.h> 19 19 #include <linux/of.h> 20 20 #include <linux/of_gpio.h> 21 + #include <linux/of_graph.h> 21 22 #include <linux/gpio.h> 22 23 #include <linux/component.h> 23 24 #include <linux/phy/phy.h> ··· 995 994 }; 996 995 997 996 /* returns the number of bridges attached */ 998 - static int exynos_drm_attach_lcd_bridge(struct drm_device *dev, 997 + static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp, 999 998 struct drm_encoder *encoder) 1000 999 { 1000 + int ret; 1001 + 1002 + encoder->bridge = dp->bridge; 1003 + dp->bridge->encoder = encoder; 1004 + ret = drm_bridge_attach(encoder->dev, dp->bridge); 1005 + if (ret) { 1006 + DRM_ERROR("Failed to attach bridge to drm\n"); 1007 + return ret; 1008 + } 1009 + 1001 1010 return 0; 1002 1011 } 1003 1012 ··· 1021 1010 dp->encoder = encoder; 1022 1011 1023 1012 /* Pre-empt DP connector creation if there's a bridge */ 1024 - ret = exynos_drm_attach_lcd_bridge(dp->drm_dev, encoder); 1025 - if (ret) 1026 - return 0; 1013 + if (dp->bridge) { 1014 + ret = exynos_drm_attach_lcd_bridge(dp, encoder); 1015 + if (!ret) 1016 + return 0; 1017 + } 1027 1018 1028 1019 connector->polled = DRM_CONNECTOR_POLL_HPD; 1029 1020 ··· 1232 1219 } 1233 1220 } 1234 1221 1235 - if (!dp->panel) { 1222 + if (!dp->panel && !dp->bridge) { 1236 1223 ret = exynos_dp_dt_parse_panel(dp); 1237 1224 if (ret) 1238 1225 return ret; ··· 1316 1303 static int exynos_dp_probe(struct platform_device *pdev) 1317 1304 { 1318 1305 struct device *dev = &pdev->dev; 1319 - struct device_node *panel_node; 1306 + struct device_node *panel_node, *bridge_node, *endpoint; 1320 1307 struct exynos_dp_device *dp; 1321 1308 int ret; 1322 1309 ··· 1339 1326 dp->panel = of_drm_find_panel(panel_node); 1340 1327 of_node_put(panel_node); 1341 1328 if (!dp->panel) 1329 + return -EPROBE_DEFER; 1330 + } 1331 + 1332 + endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); 1333 + if (endpoint) { 1334 + bridge_node = of_graph_get_remote_port_parent(endpoint); 1335 + if (bridge_node) { 1336 + dp->bridge = of_drm_find_bridge(bridge_node); 1337 + of_node_put(bridge_node); 1338 + if (!dp->bridge) 1339 + return -EPROBE_DEFER; 1340 + } else 1342 1341 return -EPROBE_DEFER; 1343 1342 } 1344 1343
+1
drivers/gpu/drm/exynos/exynos_dp_core.h
··· 153 153 struct drm_connector connector; 154 154 struct drm_encoder *encoder; 155 155 struct drm_panel *panel; 156 + struct drm_bridge *bridge; 156 157 struct clk *clock; 157 158 unsigned int irq; 158 159 void __iomem *reg_base;