drm/sun4i: Move panel retrieval in RGB connector
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Wed, 20 Jul 2016 08:35:06 +0000 (10:35 +0200)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Mon, 22 Aug 2016 13:34:16 +0000 (15:34 +0200)
In order to properly support bridges and use drm_encoder's bridge pointer,
move the panel (and bridge eventually) retrieval code in the RGB output
init function.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
drivers/gpu/drm/sun4i/sun4i_rgb.c
drivers/gpu/drm/sun4i/sun4i_tcon.c
drivers/gpu/drm/sun4i/sun4i_tcon.h

index f5bbac6efb4c8c01e5f7cd709de037f168a92eb6..d32f08f9ce5f48db04e81e2ed92f94103bb82d62 100644 (file)
@@ -206,15 +206,17 @@ int sun4i_rgb_init(struct drm_device *drm)
        struct sun4i_rgb *rgb;
        int ret;
 
-       /* If we don't have a panel, there's no point in going on */
-       if (IS_ERR(tcon->panel))
-               return -ENODEV;
-
        rgb = devm_kzalloc(drm->dev, sizeof(*rgb), GFP_KERNEL);
        if (!rgb)
                return -ENOMEM;
        rgb->drv = drv;
 
+       tcon->panel = sun4i_tcon_find_panel(tcon->dev->of_node);
+       if (IS_ERR(tcon->panel)) {
+               dev_info(drm->dev, "No panel found... RGB output disabled\n");
+               return 0;
+       }
+
        drm_encoder_helper_add(&rgb->encoder,
                               &sun4i_rgb_enc_helper_funcs);
        ret = drm_encoder_init(drm,
index af136dfc206ed4b3f85d076d145ec98709cef54b..d2f7489d29a5a2d2e9a4f22e8c940e9d75602d6c 100644 (file)
@@ -398,7 +398,7 @@ static int sun4i_tcon_init_regmap(struct device *dev,
        return 0;
 }
 
-static struct drm_panel *sun4i_tcon_find_panel(struct device_node *node)
+struct drm_panel *sun4i_tcon_find_panel(struct device_node *node)
 {
        struct device_node *port, *remote, *child;
        struct device_node *end_node = NULL;
@@ -485,12 +485,6 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master,
                goto err_free_clocks;
        }
 
-       tcon->panel = sun4i_tcon_find_panel(dev->of_node);
-       if (IS_ERR(tcon->panel)) {
-               dev_info(dev, "No panel found... RGB output disabled\n");
-               return 0;
-       }
-
        ret = sun4i_rgb_init(drm);
        if (ret < 0)
                goto err_free_clocks;
index 230550b720f187b6e156b60ac3b74be2b6129392..4f81d86ee5a41a6855c984d4968b36d7e4f3f842 100644 (file)
@@ -166,6 +166,8 @@ struct sun4i_tcon {
        struct drm_panel                *panel;
 };
 
+struct drm_panel *sun4i_tcon_find_panel(struct device_node *node);
+
 /* Global Control */
 void sun4i_tcon_disable(struct sun4i_tcon *tcon);
 void sun4i_tcon_enable(struct sun4i_tcon *tcon);