]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/sun4i/sun4i_rgb.c
Merge tag 'sunxi-drm-for-4.12' of https://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / drivers / gpu / drm / sun4i / sun4i_rgb.c
index 46280dd70c9e05800aed87a6de4e512066da46e9..67f0b91a99de057933583d8aa786f23c73cb1af8 100644 (file)
@@ -18,7 +18,7 @@
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 
-#include "sun4i_drv.h"
+#include "sun4i_crtc.h"
 #include "sun4i_tcon.h"
 #include "sun4i_rgb.h"
 
@@ -26,7 +26,7 @@ struct sun4i_rgb {
        struct drm_connector    connector;
        struct drm_encoder      encoder;
 
-       struct sun4i_drv        *drv;
+       struct sun4i_tcon       *tcon;
 };
 
 static inline struct sun4i_rgb *
@@ -47,8 +47,7 @@ static int sun4i_rgb_get_modes(struct drm_connector *connector)
 {
        struct sun4i_rgb *rgb =
                drm_connector_to_sun4i_rgb(connector);
-       struct sun4i_drv *drv = rgb->drv;
-       struct sun4i_tcon *tcon = drv->tcon;
+       struct sun4i_tcon *tcon = rgb->tcon;
 
        return drm_panel_get_modes(tcon->panel);
 }
@@ -57,8 +56,7 @@ static int sun4i_rgb_mode_valid(struct drm_connector *connector,
                                struct drm_display_mode *mode)
 {
        struct sun4i_rgb *rgb = drm_connector_to_sun4i_rgb(connector);
-       struct sun4i_drv *drv = rgb->drv;
-       struct sun4i_tcon *tcon = drv->tcon;
+       struct sun4i_tcon *tcon = rgb->tcon;
        u32 hsync = mode->hsync_end - mode->hsync_start;
        u32 vsync = mode->vsync_end - mode->vsync_start;
        unsigned long rate = mode->clock * 1000;
@@ -115,8 +113,7 @@ static void
 sun4i_rgb_connector_destroy(struct drm_connector *connector)
 {
        struct sun4i_rgb *rgb = drm_connector_to_sun4i_rgb(connector);
-       struct sun4i_drv *drv = rgb->drv;
-       struct sun4i_tcon *tcon = drv->tcon;
+       struct sun4i_tcon *tcon = rgb->tcon;
 
        drm_panel_detach(tcon->panel);
        drm_connector_cleanup(connector);
@@ -141,8 +138,7 @@ static int sun4i_rgb_atomic_check(struct drm_encoder *encoder,
 static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
 {
        struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
-       struct sun4i_drv *drv = rgb->drv;
-       struct sun4i_tcon *tcon = drv->tcon;
+       struct sun4i_tcon *tcon = rgb->tcon;
 
        DRM_DEBUG_DRIVER("Enabling RGB output\n");
 
@@ -158,8 +154,7 @@ static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
 static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder)
 {
        struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
-       struct sun4i_drv *drv = rgb->drv;
-       struct sun4i_tcon *tcon = drv->tcon;
+       struct sun4i_tcon *tcon = rgb->tcon;
 
        DRM_DEBUG_DRIVER("Disabling RGB output\n");
 
@@ -177,8 +172,7 @@ static void sun4i_rgb_encoder_mode_set(struct drm_encoder *encoder,
                                       struct drm_display_mode *adjusted_mode)
 {
        struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
-       struct sun4i_drv *drv = rgb->drv;
-       struct sun4i_tcon *tcon = drv->tcon;
+       struct sun4i_tcon *tcon = rgb->tcon;
 
        sun4i_tcon0_mode_set(tcon, mode);
 
@@ -204,10 +198,8 @@ static struct drm_encoder_funcs sun4i_rgb_enc_funcs = {
        .destroy        = sun4i_rgb_enc_destroy,
 };
 
-int sun4i_rgb_init(struct drm_device *drm)
+int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon)
 {
-       struct sun4i_drv *drv = drm->dev_private;
-       struct sun4i_tcon *tcon = drv->tcon;
        struct drm_encoder *encoder;
        struct drm_bridge *bridge;
        struct sun4i_rgb *rgb;
@@ -216,7 +208,7 @@ int sun4i_rgb_init(struct drm_device *drm)
        rgb = devm_kzalloc(drm->dev, sizeof(*rgb), GFP_KERNEL);
        if (!rgb)
                return -ENOMEM;
-       rgb->drv = drv;
+       rgb->tcon = tcon;
        encoder = &rgb->encoder;
 
        ret = drm_of_find_panel_or_bridge(tcon->dev->of_node, 1, 0,
@@ -239,7 +231,7 @@ int sun4i_rgb_init(struct drm_device *drm)
        }
 
        /* The RGB encoder can only work with the TCON channel 0 */
-       rgb->encoder.possible_crtcs = BIT(0);
+       rgb->encoder.possible_crtcs = BIT(drm_crtc_index(&tcon->crtc->crtc));
 
        if (tcon->panel) {
                drm_connector_helper_add(&rgb->connector,