Defer panel handling to drm_panel_bridge, unifying codepaths for the
panel and bridge cases. The MFD_SYSCON symbol is moved to select to
prevent Kconfig symbol loops.

Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org>
---
 drivers/gpu/drm/imx/ipuv3/Kconfig   |  6 +++--
 drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 44 ++++++++++++-------------------------
 2 files changed, 18 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/imx/ipuv3/Kconfig 
b/drivers/gpu/drm/imx/ipuv3/Kconfig
index bacf0655ebaf..6abcf9c833d4 100644
--- a/drivers/gpu/drm/imx/ipuv3/Kconfig
+++ b/drivers/gpu/drm/imx/ipuv3/Kconfig
@@ -26,9 +26,11 @@ config DRM_IMX_TVE
 
 config DRM_IMX_LDB
        tristate "Support for LVDS displays"
-       depends on DRM_IMX && MFD_SYSCON
+       depends on DRM_IMX
        depends on COMMON_CLK
-       select DRM_PANEL
+       select MFD_SYSCON
+       select DRM_BRIDGE
+       select DRM_PANEL_BRIDGE
        help
          Choose this to enable the internal LVDS Display Bridge (LDB)
          found on i.MX53 and i.MX6 processors.
diff --git a/drivers/gpu/drm/imx/ipuv3/imx-ldb.c 
b/drivers/gpu/drm/imx/ipuv3/imx-ldb.c
index 3f669604377e..bc7ad9697130 100644
--- a/drivers/gpu/drm/imx/ipuv3/imx-ldb.c
+++ b/drivers/gpu/drm/imx/ipuv3/imx-ldb.c
@@ -27,7 +27,6 @@
 #include <drm/drm_bridge.h>
 #include <drm/drm_managed.h>
 #include <drm/drm_of.h>
-#include <drm/drm_panel.h>
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
@@ -64,8 +63,6 @@ struct imx_ldb;
 struct imx_ldb_channel {
        struct imx_ldb *ldb;
 
-       /* Defines what is connected to the ldb, only one at a time */
-       struct drm_panel *panel;
        struct drm_bridge *bridge;
 
        struct device_node *child;
@@ -135,10 +132,6 @@ static int imx_ldb_connector_get_modes(struct 
drm_connector *connector)
        struct imx_ldb_channel *imx_ldb_ch = con_to_imx_ldb_ch(connector);
        int num_modes;
 
-       num_modes = drm_panel_get_modes(imx_ldb_ch->panel, connector);
-       if (num_modes > 0)
-               return num_modes;
-
        if (imx_ldb_ch->mode_valid) {
                struct drm_display_mode *mode;
 
@@ -193,8 +186,6 @@ static void imx_ldb_encoder_enable(struct drm_encoder 
*encoder)
                return;
        }
 
-       drm_panel_prepare(imx_ldb_ch->panel);
-
        if (dual) {
                clk_set_parent(ldb->clk_sel[mux], ldb->clk[0]);
                clk_set_parent(ldb->clk_sel[mux], ldb->clk[1]);
@@ -233,8 +224,6 @@ static void imx_ldb_encoder_enable(struct drm_encoder 
*encoder)
        }
 
        regmap_write(ldb->regmap, IOMUXC_GPR2, ldb->ldb_ctrl);
-
-       drm_panel_enable(imx_ldb_ch->panel);
 }
 
 static void
@@ -311,8 +300,6 @@ static void imx_ldb_encoder_disable(struct drm_encoder 
*encoder)
        int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN;
        int mux, ret;
 
-       drm_panel_disable(imx_ldb_ch->panel);
-
        if (imx_ldb_ch == &ldb->channel[0] || dual)
                ldb->ldb_ctrl &= ~LDB_CH0_MODE_EN_MASK;
        if (imx_ldb_ch == &ldb->channel[1] || dual)
@@ -346,8 +333,6 @@ static void imx_ldb_encoder_disable(struct drm_encoder 
*encoder)
                dev_err(ldb->dev,
                        "unable to set di%d parent clock to original parent\n",
                        mux);
-
-       drm_panel_unprepare(imx_ldb_ch->panel);
 }
 
 static int imx_ldb_encoder_atomic_check(struct drm_encoder *encoder,
@@ -640,13 +625,15 @@ static int imx_ldb_probe(struct platform_device *pdev)
                 * The output port is port@4 with an external 4-port mux or
                 * port@2 with the internal 2-port mux.
                 */
-               ret = drm_of_find_panel_or_bridge(child,
-                                                 imx_ldb->lvds_mux ? 4 : 2, 0,
-                                                 &channel->panel, 
&channel->bridge);
-               if (ret && ret != -ENODEV)
-                       goto free_child;
+               channel->bridge = devm_drm_of_get_bridge(dev, child,
+                                               imx_ldb->lvds_mux ? 4 : 2, 0);
+               if (IS_ERR(channel->bridge)) {
+                       ret = PTR_ERR(channel->bridge);
+                       if (ret != -ENODEV)
+                               goto free_child;
+
+                       channel->bridge = NULL;
 
-               if (!channel->bridge && !channel->panel) {
                        ret = of_get_drm_display_mode(child,
                                                      &channel->mode,
                                                      &channel->bus_flags,
@@ -658,15 +645,12 @@ static int imx_ldb_probe(struct platform_device *pdev)
                }
 
                bus_format = of_get_bus_format(dev, child);
-               if (bus_format == -EINVAL) {
-                       /*
-                        * If no bus format was specified in the device tree,
-                        * we can still get it from the connected panel later.
-                        */
-                       if (channel->panel && channel->panel->funcs &&
-                           channel->panel->funcs->get_modes)
-                               bus_format = 0;
-               }
+               /*
+                * If no bus format was specified in the device tree,
+                * we can still get it from the connected panel later.
+                */
+               if (bus_format == -EINVAL && channel->bridge)
+                       bus_format = 0;
                if (bus_format < 0) {
                        dev_err(dev, "could not determine data mapping: %d\n",
                                bus_format);

-- 
2.39.2

Reply via email to