]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/tilcdc: Add support for drm panels
authorJyri Sarha <jsarha@ti.com>
Sun, 18 Feb 2018 17:48:32 +0000 (19:48 +0200)
committerJyri Sarha <jsarha@ti.com>
Wed, 28 Feb 2018 09:48:16 +0000 (11:48 +0200)
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>
drivers/gpu/drm/tilcdc/Kconfig
drivers/gpu/drm/tilcdc/tilcdc_external.c

index 81ac82455ce4d649aadfc99eb85e53a37f74f683..52598049c096eb4d5d6d550ac6ef5d00d823d980 100644 (file)
@@ -4,6 +4,8 @@ config DRM_TILCDC
        select DRM_KMS_HELPER
        select DRM_KMS_CMA_HELPER
        select DRM_GEM_CMA_HELPER
+       select DRM_BRIDGE
+       select DRM_PANEL_BRIDGE
        select VIDEOMODE_HELPERS
        select BACKLIGHT_CLASS_DEVICE
        select BACKLIGHT_LCD_SUPPORT
index 711c7b3289d35f06f909d80ad2a3ba79107571fe..d651bdd6597e6f5a3429300c3d2e2ba68bc66707 100644 (file)
@@ -188,18 +188,16 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
 int tilcdc_attach_external_device(struct drm_device *ddev)
 {
        struct tilcdc_drm_private *priv = ddev->dev_private;
-       struct device_node *remote_node;
        struct drm_bridge *bridge;
+       struct drm_panel *panel;
        int ret;
 
-       remote_node = of_graph_get_remote_node(ddev->dev->of_node, 0, 0);
-       if (!remote_node)
+       ret = drm_of_find_panel_or_bridge(ddev->dev->of_node, 0, 0,
+                                         &panel, &bridge);
+       if (ret == -ENODEV)
                return 0;
-
-       bridge = of_drm_find_bridge(remote_node);
-       of_node_put(remote_node);
-       if (!bridge)
-               return -EPROBE_DEFER;
+       else if (ret)
+               return ret;
 
        priv->external_encoder = devm_kzalloc(ddev->dev,
                                              sizeof(*priv->external_encoder),
@@ -215,10 +213,23 @@ int tilcdc_attach_external_device(struct drm_device *ddev)
                return ret;
        }
 
+       if (panel) {
+               bridge = devm_drm_panel_bridge_add(ddev->dev, panel,
+                                                  DRM_MODE_CONNECTOR_DPI);
+               if (IS_ERR(bridge)) {
+                       ret = PTR_ERR(bridge);
+                       goto err_encoder_cleanup;
+               }
+       }
+
        ret = tilcdc_attach_bridge(ddev, bridge);
        if (ret)
-               drm_encoder_cleanup(priv->external_encoder);
+               goto err_encoder_cleanup;
+
+       return 0;
 
+err_encoder_cleanup:
+       drm_encoder_cleanup(priv->external_encoder);
        return ret;
 }