drm/sun4i: rgb: Pass tcon pointer when initializing RGB encoder
authorChen-Yu Tsai <wens@csie.org>
Thu, 23 Feb 2017 08:05:41 +0000 (16:05 +0800)
committerMaxime Ripard <maxime.ripard@free-electrons.com>
Tue, 7 Mar 2017 21:18:24 +0000 (22:18 +0100)
The RGB encoder represents channel 0 of the TCON. Instead of fetching
the pointer to its TCON from the main sun4i_drv structure, pass it in
as part of the init call, save it, and use it directly in the encoder
and connector callbacks.

We can also drop the otherwise unused sun4i_drv pointer.

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

index c4865bf1b39263dcf11f316460fb3ac107a5a7e6..1147451eb993339ad5e7df6f985821b5319e9b0b 100644 (file)
@@ -18,7 +18,6 @@
 #include <drm/drm_panel.h>
 
 #include "sun4i_crtc.h"
-#include "sun4i_drv.h"
 #include "sun4i_tcon.h"
 #include "sun4i_rgb.h"
 
@@ -26,7 +25,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 +46,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 +55,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 +112,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 +137,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 +153,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 +171,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 +197,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 +207,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;
 
        tcon->panel = sun4i_tcon_find_panel(tcon->dev->of_node);
index 7c4da4c8acdd452f8d24ad4ba0e863001ebf3e44..40c18f4a6c7e960af334ae897d76c9819fc8b934 100644 (file)
@@ -13,6 +13,6 @@
 #ifndef _SUN4I_RGB_H_
 #define _SUN4I_RGB_H_
 
-int sun4i_rgb_init(struct drm_device *drm);
+int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon);
 
 #endif /* _SUN4I_RGB_H_ */
index 3f3eb3f0b2095ae1baac683d5fc50e8d8a5dd819..505520baa5857cc661a412bf57c2e987abaed00b 100644 (file)
@@ -530,7 +530,7 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master,
                goto err_free_clocks;
        }
 
-       ret = sun4i_rgb_init(drm);
+       ret = sun4i_rgb_init(drm, tcon);
        if (ret < 0)
                goto err_free_clocks;