DRM bridge drivers have build-in handling of treating all display
pipeline components as bridges.

So, convert the existing to a drm bridge driver with a built-in
encoder support for compatibility with existing component drivers.

Signed-off-by: Jagan Teki <ja...@amarulasolutions.com>
---
Changes for v4:
- none
Changes for v3:
- new patch

 drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 75 ++++++++++++++++----------
 drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h |  6 +++
 2 files changed, 54 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c 
b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
index 39321299dc27..6f3c5330a468 100644
--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
@@ -714,10 +714,10 @@ static int sun6i_dsi_start(struct sun6i_dsi *dsi,
        return 0;
 }
 
-static void sun6i_dsi_encoder_enable(struct drm_encoder *encoder)
+static void sun6i_dsi_bridge_enable(struct drm_bridge *bridge)
 {
-       struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
-       struct sun6i_dsi *dsi = encoder_to_sun6i_dsi(encoder);
+       struct drm_display_mode *mode = 
&bridge->encoder->crtc->state->adjusted_mode;
+       struct sun6i_dsi *dsi = bridge_to_sun6i_dsi(bridge);
        struct mipi_dsi_device *device = dsi->device;
        union phy_configure_opts opts = { };
        struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;
@@ -801,9 +801,9 @@ static void sun6i_dsi_encoder_enable(struct drm_encoder 
*encoder)
        sun6i_dsi_start(dsi, DSI_START_HSD);
 }
 
-static void sun6i_dsi_encoder_disable(struct drm_encoder *encoder)
+static void sun6i_dsi_bridge_disable(struct drm_bridge *bridge)
 {
-       struct sun6i_dsi *dsi = encoder_to_sun6i_dsi(encoder);
+       struct sun6i_dsi *dsi = bridge_to_sun6i_dsi(bridge);
 
        DRM_DEBUG_DRIVER("Disabling DSI output\n");
 
@@ -852,9 +852,40 @@ static const struct drm_connector_funcs 
sun6i_dsi_connector_funcs = {
        .atomic_destroy_state   = drm_atomic_helper_connector_destroy_state,
 };
 
-static const struct drm_encoder_helper_funcs sun6i_dsi_enc_helper_funcs = {
-       .disable        = sun6i_dsi_encoder_disable,
-       .enable         = sun6i_dsi_encoder_enable,
+static int sun6i_dsi_bridge_attach(struct drm_bridge *bridge,
+                                  enum drm_bridge_attach_flags flags)
+{
+       struct sun6i_dsi *dsi = bridge_to_sun6i_dsi(bridge);
+       int ret;
+
+       if (dsi->panel_bridge)
+               return drm_bridge_attach(bridge->encoder, dsi->panel_bridge, 
NULL, 0);
+
+       if (dsi->panel) {
+               drm_connector_helper_add(&dsi->connector,
+                                        &sun6i_dsi_connector_helper_funcs);
+               ret = drm_connector_init(bridge->dev, &dsi->connector,
+                                        &sun6i_dsi_connector_funcs,
+                                        DRM_MODE_CONNECTOR_DSI);
+               if (ret) {
+                       dev_err(dsi->dev, "Couldn't initialise the DSI 
connector\n");
+                       goto err_cleanup_connector;
+               }
+
+               drm_connector_attach_encoder(&dsi->connector, &dsi->encoder);
+       }
+
+       return 0;
+
+err_cleanup_connector:
+       drm_encoder_cleanup(&dsi->encoder);
+       return ret;
+}
+
+static const struct drm_bridge_funcs sun6i_dsi_bridge_funcs = {
+       .enable         = sun6i_dsi_bridge_enable,
+       .disable        = sun6i_dsi_bridge_disable,
+       .attach         = sun6i_dsi_bridge_attach,
 };
 
 static u32 sun6i_dsi_dcs_build_pkt_hdr(struct sun6i_dsi *dsi,
@@ -1063,8 +1094,6 @@ static int sun6i_dsi_bind(struct device *dev, struct 
device *master,
        struct sun6i_dsi *dsi = dev_get_drvdata(dev);
        int ret;
 
-       drm_encoder_helper_add(&dsi->encoder,
-                              &sun6i_dsi_enc_helper_funcs);
        ret = drm_simple_encoder_init(drm, &dsi->encoder,
                                      DRM_MODE_ENCODER_DSI);
        if (ret) {
@@ -1073,27 +1102,12 @@ static int sun6i_dsi_bind(struct device *dev, struct 
device *master,
        }
        dsi->encoder.possible_crtcs = BIT(0);
 
-       drm_connector_helper_add(&dsi->connector,
-                                &sun6i_dsi_connector_helper_funcs);
-       ret = drm_connector_init(drm, &dsi->connector,
-                                &sun6i_dsi_connector_funcs,
-                                DRM_MODE_CONNECTOR_DSI);
+       ret = drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL, 0);
        if (ret) {
-               dev_err(dsi->dev,
-                       "Couldn't initialise the DSI connector\n");
+               dev_err(dsi->dev, "Couldn't attach drm bridge\n");
                goto err_cleanup_connector;
        }
 
-       drm_connector_attach_encoder(&dsi->connector, &dsi->encoder);
-
-       if (dsi->panel_bridge) {
-               ret = drm_bridge_attach(&dsi->encoder, dsi->panel_bridge, NULL, 
0);
-               if (ret) {
-                       dev_err(dsi->dev, "Couldn't attach drm bridge\n");
-                       goto err_cleanup_connector;
-               }
-       }
-
        return 0;
 
 err_cleanup_connector:
@@ -1199,6 +1213,12 @@ static int sun6i_dsi_probe(struct platform_device *pdev)
                goto err_unprotect_clk;
        }
 
+       dsi->bridge.funcs = &sun6i_dsi_bridge_funcs;
+       dsi->bridge.of_node = dev->of_node;
+       dsi->bridge.type = DRM_MODE_CONNECTOR_DSI;
+
+       drm_bridge_add(&dsi->bridge);
+
        ret = component_add(&pdev->dev, &sun6i_dsi_ops);
        if (ret) {
                dev_err(dev, "Couldn't register our component\n");
@@ -1222,6 +1242,7 @@ static int sun6i_dsi_remove(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct sun6i_dsi *dsi = dev_get_drvdata(dev);
 
+       drm_bridge_remove(&dsi->bridge);
        component_del(&pdev->dev, &sun6i_dsi_ops);
        mipi_dsi_host_unregister(&dsi->host);
        clk_rate_exclusive_put(dsi->mod_clk);
diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h 
b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h
index 370ecb356a63..5e70666089ad 100644
--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h
+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.h
@@ -16,6 +16,7 @@
 #define SUN6I_DSI_TCON_DIV     4
 
 struct sun6i_dsi {
+       struct drm_bridge       bridge;
        struct drm_connector    connector;
        struct drm_encoder      encoder;
        struct mipi_dsi_host    host;
@@ -38,6 +39,11 @@ static inline struct sun6i_dsi *host_to_sun6i_dsi(struct 
mipi_dsi_host *host)
        return container_of(host, struct sun6i_dsi, host);
 };
 
+static inline struct sun6i_dsi *bridge_to_sun6i_dsi(struct drm_bridge *bridge)
+{
+       return container_of(bridge, struct sun6i_dsi, bridge);
+}
+
 static inline struct sun6i_dsi *connector_to_sun6i_dsi(struct drm_connector 
*connector)
 {
        return container_of(connector, struct sun6i_dsi, connector);
-- 
2.25.1

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linux-sunxi+unsubscr...@googlegroups.com.
To view this discussion on the web, visit 
https://groups.google.com/d/msgid/linux-sunxi/20210322140152.101709-4-jagan%40amarulasolutions.com.

Reply via email to