aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJyri Sarha <jsarha@ti.com>2018-02-18 12:48:32 -0500
committerJyri Sarha <jsarha@ti.com>2018-02-28 04:48:16 -0500
commit544f7377d92c9dcd7578e5e376bbc2ec96478b37 (patch)
tree9bbe231f8c26b45238946c05839f38b748db05e2 /drivers
parentb225e742542d944c883f578a5c0106157ff4fb7f (diff)
drm/tilcdc: Add support for drm panels
Add support for drm panels to tilcdc. Adding the support on top of the existing bridge support needs only couple of lines of code when using using the drm panel bridge helpers. Signed-off-by: Jyri Sarha <jsarha@ti.com> Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/tilcdc/Kconfig2
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_external.c29
2 files changed, 22 insertions, 9 deletions
diff --git a/drivers/gpu/drm/tilcdc/Kconfig b/drivers/gpu/drm/tilcdc/Kconfig
index 81ac82455ce4..52598049c096 100644
--- a/drivers/gpu/drm/tilcdc/Kconfig
+++ b/drivers/gpu/drm/tilcdc/Kconfig
@@ -4,6 +4,8 @@ config DRM_TILCDC
4 select DRM_KMS_HELPER 4 select DRM_KMS_HELPER
5 select DRM_KMS_CMA_HELPER 5 select DRM_KMS_CMA_HELPER
6 select DRM_GEM_CMA_HELPER 6 select DRM_GEM_CMA_HELPER
7 select DRM_BRIDGE
8 select DRM_PANEL_BRIDGE
7 select VIDEOMODE_HELPERS 9 select VIDEOMODE_HELPERS
8 select BACKLIGHT_CLASS_DEVICE 10 select BACKLIGHT_CLASS_DEVICE
9 select BACKLIGHT_LCD_SUPPORT 11 select BACKLIGHT_LCD_SUPPORT
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
index 711c7b3289d3..d651bdd6597e 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
@@ -188,18 +188,16 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
188int tilcdc_attach_external_device(struct drm_device *ddev) 188int tilcdc_attach_external_device(struct drm_device *ddev)
189{ 189{
190 struct tilcdc_drm_private *priv = ddev->dev_private; 190 struct tilcdc_drm_private *priv = ddev->dev_private;
191 struct device_node *remote_node;
192 struct drm_bridge *bridge; 191 struct drm_bridge *bridge;
192 struct drm_panel *panel;
193 int ret; 193 int ret;
194 194
195 remote_node = of_graph_get_remote_node(ddev->dev->of_node, 0, 0); 195 ret = drm_of_find_panel_or_bridge(ddev->dev->of_node, 0, 0,
196 if (!remote_node) 196 &panel, &bridge);
197 if (ret == -ENODEV)
197 return 0; 198 return 0;
198 199 else if (ret)
199 bridge = of_drm_find_bridge(remote_node); 200 return ret;
200 of_node_put(remote_node);
201 if (!bridge)
202 return -EPROBE_DEFER;
203 201
204 priv->external_encoder = devm_kzalloc(ddev->dev, 202 priv->external_encoder = devm_kzalloc(ddev->dev,
205 sizeof(*priv->external_encoder), 203 sizeof(*priv->external_encoder),
@@ -215,10 +213,23 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
215 return ret; 213 return ret;
216 } 214 }
217 215
216 if (panel) {
217 bridge = devm_drm_panel_bridge_add(ddev->dev, panel,
218 DRM_MODE_CONNECTOR_DPI);
219 if (IS_ERR(bridge)) {
220 ret = PTR_ERR(bridge);
221 goto err_encoder_cleanup;
222 }
223 }
224
218 ret = tilcdc_attach_bridge(ddev, bridge); 225 ret = tilcdc_attach_bridge(ddev, bridge);
219 if (ret) 226 if (ret)
220 drm_encoder_cleanup(priv->external_encoder); 227 goto err_encoder_cleanup;
228
229 return 0;
221 230
231err_encoder_cleanup:
232 drm_encoder_cleanup(priv->external_encoder);
222 return ret; 233 return ret;
223} 234}
224 235