diff mbox series

[1/4] drm/sun4i: Move the panel pointer from the TCON to the encoders

Message ID 13288b6b8f27b614a6c9aef348923c34b2803ad4.1551191081.git-series.maxime.ripard@bootlin.com (mailing list archive)
State New, archived
Headers show
Series drm/sun4i: rgb: Relax the pixel clock check | expand

Commit Message

Maxime Ripard Feb. 26, 2019, 2:25 p.m. UTC
The TCON driver used to need the panel pointer in order to configure the
tcon according to the various parameters of the panel. However, this has
evolved over time (especially to support bridges), and therefore the panel
pointer isn't needed anymore by the TCON driver.

Move that pointer to the LVDS and RGB encoders drivers.

Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
---
 drivers/gpu/drm/sun4i/sun4i_lvds.c | 29 ++++++++++++-----------------
 drivers/gpu/drm/sun4i/sun4i_rgb.c  | 27 ++++++++++++---------------
 drivers/gpu/drm/sun4i/sun4i_tcon.h |  2 --
 3 files changed, 24 insertions(+), 34 deletions(-)

Comments

Paul Kocialkowski March 7, 2019, 1:29 p.m. UTC | #1
Hi,

On Tue, 2019-02-26 at 15:25 +0100, Maxime Ripard wrote:
> The TCON driver used to need the panel pointer in order to configure the
> tcon according to the various parameters of the panel. However, this has
> evolved over time (especially to support bridges), and therefore the panel
> pointer isn't needed anymore by the TCON driver.
> 
> Move that pointer to the LVDS and RGB encoders drivers.
> 
> Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>

That definitely makes good sense to me!

Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>

Cheers,

Paul

> ---
>  drivers/gpu/drm/sun4i/sun4i_lvds.c | 29 ++++++++++++-----------------
>  drivers/gpu/drm/sun4i/sun4i_rgb.c  | 27 ++++++++++++---------------
>  drivers/gpu/drm/sun4i/sun4i_tcon.h |  2 --
>  3 files changed, 24 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/gpu/drm/sun4i/sun4i_lvds.c b/drivers/gpu/drm/sun4i/sun4i_lvds.c
> index e7eb0d1e17be..5696f55db5cd 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_lvds.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_lvds.c
> @@ -20,7 +20,7 @@ struct sun4i_lvds {
>  	struct drm_connector	connector;
>  	struct drm_encoder	encoder;
>  
> -	struct sun4i_tcon	*tcon;
> +	struct drm_panel	*panel;
>  };
>  
>  static inline struct sun4i_lvds *
> @@ -41,9 +41,8 @@ static int sun4i_lvds_get_modes(struct drm_connector *connector)
>  {
>  	struct sun4i_lvds *lvds =
>  		drm_connector_to_sun4i_lvds(connector);
> -	struct sun4i_tcon *tcon = lvds->tcon;
>  
> -	return drm_panel_get_modes(tcon->panel);
> +	return drm_panel_get_modes(lvds->panel);
>  }
>  
>  static struct drm_connector_helper_funcs sun4i_lvds_con_helper_funcs = {
> @@ -54,9 +53,8 @@ static void
>  sun4i_lvds_connector_destroy(struct drm_connector *connector)
>  {
>  	struct sun4i_lvds *lvds = drm_connector_to_sun4i_lvds(connector);
> -	struct sun4i_tcon *tcon = lvds->tcon;
>  
> -	drm_panel_detach(tcon->panel);
> +	drm_panel_detach(lvds->panel);
>  	drm_connector_cleanup(connector);
>  }
>  
> @@ -71,26 +69,24 @@ static const struct drm_connector_funcs sun4i_lvds_con_funcs = {
>  static void sun4i_lvds_encoder_enable(struct drm_encoder *encoder)
>  {
>  	struct sun4i_lvds *lvds = drm_encoder_to_sun4i_lvds(encoder);
> -	struct sun4i_tcon *tcon = lvds->tcon;
>  
>  	DRM_DEBUG_DRIVER("Enabling LVDS output\n");
>  
> -	if (tcon->panel) {
> -		drm_panel_prepare(tcon->panel);
> -		drm_panel_enable(tcon->panel);
> +	if (lvds->panel) {
> +		drm_panel_prepare(lvds->panel);
> +		drm_panel_enable(lvds->panel);
>  	}
>  }
>  
>  static void sun4i_lvds_encoder_disable(struct drm_encoder *encoder)
>  {
>  	struct sun4i_lvds *lvds = drm_encoder_to_sun4i_lvds(encoder);
> -	struct sun4i_tcon *tcon = lvds->tcon;
>  
>  	DRM_DEBUG_DRIVER("Disabling LVDS output\n");
>  
> -	if (tcon->panel) {
> -		drm_panel_disable(tcon->panel);
> -		drm_panel_unprepare(tcon->panel);
> +	if (lvds->panel) {
> +		drm_panel_disable(lvds->panel);
> +		drm_panel_unprepare(lvds->panel);
>  	}
>  }
>  
> @@ -113,11 +109,10 @@ int sun4i_lvds_init(struct drm_device *drm, struct sun4i_tcon *tcon)
>  	lvds = devm_kzalloc(drm->dev, sizeof(*lvds), GFP_KERNEL);
>  	if (!lvds)
>  		return -ENOMEM;
> -	lvds->tcon = tcon;
>  	encoder = &lvds->encoder;
>  
>  	ret = drm_of_find_panel_or_bridge(tcon->dev->of_node, 1, 0,
> -					  &tcon->panel, &bridge);
> +					  &lvds->panel, &bridge);
>  	if (ret) {
>  		dev_info(drm->dev, "No panel or bridge found... LVDS output disabled\n");
>  		return 0;
> @@ -138,7 +133,7 @@ int sun4i_lvds_init(struct drm_device *drm, struct sun4i_tcon *tcon)
>  	/* The LVDS encoder can only work with the TCON channel 0 */
>  	lvds->encoder.possible_crtcs = drm_crtc_mask(&tcon->crtc->crtc);
>  
> -	if (tcon->panel) {
> +	if (lvds->panel) {
>  		drm_connector_helper_add(&lvds->connector,
>  					 &sun4i_lvds_con_helper_funcs);
>  		ret = drm_connector_init(drm, &lvds->connector,
> @@ -152,7 +147,7 @@ int sun4i_lvds_init(struct drm_device *drm, struct sun4i_tcon *tcon)
>  		drm_connector_attach_encoder(&lvds->connector,
>  						  &lvds->encoder);
>  
> -		ret = drm_panel_attach(tcon->panel, &lvds->connector);
> +		ret = drm_panel_attach(lvds->panel, &lvds->connector);
>  		if (ret) {
>  			dev_err(drm->dev, "Couldn't attach our panel\n");
>  			goto err_cleanup_connector;
> diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> index f4a22689eb54..d181ee399b03 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
> +++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
> @@ -27,6 +27,7 @@ struct sun4i_rgb {
>  	struct drm_encoder	encoder;
>  
>  	struct sun4i_tcon	*tcon;
> +	struct drm_panel	*panel;
>  };
>  
>  static inline struct sun4i_rgb *
> @@ -47,9 +48,8 @@ static int sun4i_rgb_get_modes(struct drm_connector *connector)
>  {
>  	struct sun4i_rgb *rgb =
>  		drm_connector_to_sun4i_rgb(connector);
> -	struct sun4i_tcon *tcon = rgb->tcon;
>  
> -	return drm_panel_get_modes(tcon->panel);
> +	return drm_panel_get_modes(rgb->panel);
>  }
>  
>  static enum drm_mode_status sun4i_rgb_mode_valid(struct drm_encoder *crtc,
> @@ -114,9 +114,8 @@ static void
>  sun4i_rgb_connector_destroy(struct drm_connector *connector)
>  {
>  	struct sun4i_rgb *rgb = drm_connector_to_sun4i_rgb(connector);
> -	struct sun4i_tcon *tcon = rgb->tcon;
>  
> -	drm_panel_detach(tcon->panel);
> +	drm_panel_detach(rgb->panel);
>  	drm_connector_cleanup(connector);
>  }
>  
> @@ -131,26 +130,24 @@ static const struct drm_connector_funcs sun4i_rgb_con_funcs = {
>  static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
>  {
>  	struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
> -	struct sun4i_tcon *tcon = rgb->tcon;
>  
>  	DRM_DEBUG_DRIVER("Enabling RGB output\n");
>  
> -	if (tcon->panel) {
> -		drm_panel_prepare(tcon->panel);
> -		drm_panel_enable(tcon->panel);
> +	if (rgb->panel) {
> +		drm_panel_prepare(rgb->panel);
> +		drm_panel_enable(rgb->panel);
>  	}
>  }
>  
>  static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder)
>  {
>  	struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
> -	struct sun4i_tcon *tcon = rgb->tcon;
>  
>  	DRM_DEBUG_DRIVER("Disabling RGB output\n");
>  
> -	if (tcon->panel) {
> -		drm_panel_disable(tcon->panel);
> -		drm_panel_unprepare(tcon->panel);
> +	if (rgb->panel) {
> +		drm_panel_disable(rgb->panel);
> +		drm_panel_unprepare(rgb->panel);
>  	}
>  }
>  
> @@ -183,7 +180,7 @@ int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon)
>  	encoder = &rgb->encoder;
>  
>  	ret = drm_of_find_panel_or_bridge(tcon->dev->of_node, 1, 0,
> -					  &tcon->panel, &bridge);
> +					  &rgb->panel, &bridge);
>  	if (ret) {
>  		dev_info(drm->dev, "No panel or bridge found... RGB output disabled\n");
>  		return 0;
> @@ -204,7 +201,7 @@ int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon)
>  	/* The RGB encoder can only work with the TCON channel 0 */
>  	rgb->encoder.possible_crtcs = drm_crtc_mask(&tcon->crtc->crtc);
>  
> -	if (tcon->panel) {
> +	if (rgb->panel) {
>  		drm_connector_helper_add(&rgb->connector,
>  					 &sun4i_rgb_con_helper_funcs);
>  		ret = drm_connector_init(drm, &rgb->connector,
> @@ -218,7 +215,7 @@ int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon)
>  		drm_connector_attach_encoder(&rgb->connector,
>  						  &rgb->encoder);
>  
> -		ret = drm_panel_attach(tcon->panel, &rgb->connector);
> +		ret = drm_panel_attach(rgb->panel, &rgb->connector);
>  		if (ret) {
>  			dev_err(drm->dev, "Couldn't attach our panel\n");
>  			goto err_cleanup_connector;
> diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.h b/drivers/gpu/drm/sun4i/sun4i_tcon.h
> index b5214d71610f..84cfb1952ff7 100644
> --- a/drivers/gpu/drm/sun4i/sun4i_tcon.h
> +++ b/drivers/gpu/drm/sun4i/sun4i_tcon.h
> @@ -257,8 +257,6 @@ struct sun4i_tcon {
>  	struct reset_control		*lcd_rst;
>  	struct reset_control		*lvds_rst;
>  
> -	struct drm_panel		*panel;
> -
>  	/* Platform adjustments */
>  	const struct sun4i_tcon_quirks	*quirks;
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/sun4i/sun4i_lvds.c b/drivers/gpu/drm/sun4i/sun4i_lvds.c
index e7eb0d1e17be..5696f55db5cd 100644
--- a/drivers/gpu/drm/sun4i/sun4i_lvds.c
+++ b/drivers/gpu/drm/sun4i/sun4i_lvds.c
@@ -20,7 +20,7 @@  struct sun4i_lvds {
 	struct drm_connector	connector;
 	struct drm_encoder	encoder;
 
-	struct sun4i_tcon	*tcon;
+	struct drm_panel	*panel;
 };
 
 static inline struct sun4i_lvds *
@@ -41,9 +41,8 @@  static int sun4i_lvds_get_modes(struct drm_connector *connector)
 {
 	struct sun4i_lvds *lvds =
 		drm_connector_to_sun4i_lvds(connector);
-	struct sun4i_tcon *tcon = lvds->tcon;
 
-	return drm_panel_get_modes(tcon->panel);
+	return drm_panel_get_modes(lvds->panel);
 }
 
 static struct drm_connector_helper_funcs sun4i_lvds_con_helper_funcs = {
@@ -54,9 +53,8 @@  static void
 sun4i_lvds_connector_destroy(struct drm_connector *connector)
 {
 	struct sun4i_lvds *lvds = drm_connector_to_sun4i_lvds(connector);
-	struct sun4i_tcon *tcon = lvds->tcon;
 
-	drm_panel_detach(tcon->panel);
+	drm_panel_detach(lvds->panel);
 	drm_connector_cleanup(connector);
 }
 
@@ -71,26 +69,24 @@  static const struct drm_connector_funcs sun4i_lvds_con_funcs = {
 static void sun4i_lvds_encoder_enable(struct drm_encoder *encoder)
 {
 	struct sun4i_lvds *lvds = drm_encoder_to_sun4i_lvds(encoder);
-	struct sun4i_tcon *tcon = lvds->tcon;
 
 	DRM_DEBUG_DRIVER("Enabling LVDS output\n");
 
-	if (tcon->panel) {
-		drm_panel_prepare(tcon->panel);
-		drm_panel_enable(tcon->panel);
+	if (lvds->panel) {
+		drm_panel_prepare(lvds->panel);
+		drm_panel_enable(lvds->panel);
 	}
 }
 
 static void sun4i_lvds_encoder_disable(struct drm_encoder *encoder)
 {
 	struct sun4i_lvds *lvds = drm_encoder_to_sun4i_lvds(encoder);
-	struct sun4i_tcon *tcon = lvds->tcon;
 
 	DRM_DEBUG_DRIVER("Disabling LVDS output\n");
 
-	if (tcon->panel) {
-		drm_panel_disable(tcon->panel);
-		drm_panel_unprepare(tcon->panel);
+	if (lvds->panel) {
+		drm_panel_disable(lvds->panel);
+		drm_panel_unprepare(lvds->panel);
 	}
 }
 
@@ -113,11 +109,10 @@  int sun4i_lvds_init(struct drm_device *drm, struct sun4i_tcon *tcon)
 	lvds = devm_kzalloc(drm->dev, sizeof(*lvds), GFP_KERNEL);
 	if (!lvds)
 		return -ENOMEM;
-	lvds->tcon = tcon;
 	encoder = &lvds->encoder;
 
 	ret = drm_of_find_panel_or_bridge(tcon->dev->of_node, 1, 0,
-					  &tcon->panel, &bridge);
+					  &lvds->panel, &bridge);
 	if (ret) {
 		dev_info(drm->dev, "No panel or bridge found... LVDS output disabled\n");
 		return 0;
@@ -138,7 +133,7 @@  int sun4i_lvds_init(struct drm_device *drm, struct sun4i_tcon *tcon)
 	/* The LVDS encoder can only work with the TCON channel 0 */
 	lvds->encoder.possible_crtcs = drm_crtc_mask(&tcon->crtc->crtc);
 
-	if (tcon->panel) {
+	if (lvds->panel) {
 		drm_connector_helper_add(&lvds->connector,
 					 &sun4i_lvds_con_helper_funcs);
 		ret = drm_connector_init(drm, &lvds->connector,
@@ -152,7 +147,7 @@  int sun4i_lvds_init(struct drm_device *drm, struct sun4i_tcon *tcon)
 		drm_connector_attach_encoder(&lvds->connector,
 						  &lvds->encoder);
 
-		ret = drm_panel_attach(tcon->panel, &lvds->connector);
+		ret = drm_panel_attach(lvds->panel, &lvds->connector);
 		if (ret) {
 			dev_err(drm->dev, "Couldn't attach our panel\n");
 			goto err_cleanup_connector;
diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
index f4a22689eb54..d181ee399b03 100644
--- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
+++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
@@ -27,6 +27,7 @@  struct sun4i_rgb {
 	struct drm_encoder	encoder;
 
 	struct sun4i_tcon	*tcon;
+	struct drm_panel	*panel;
 };
 
 static inline struct sun4i_rgb *
@@ -47,9 +48,8 @@  static int sun4i_rgb_get_modes(struct drm_connector *connector)
 {
 	struct sun4i_rgb *rgb =
 		drm_connector_to_sun4i_rgb(connector);
-	struct sun4i_tcon *tcon = rgb->tcon;
 
-	return drm_panel_get_modes(tcon->panel);
+	return drm_panel_get_modes(rgb->panel);
 }
 
 static enum drm_mode_status sun4i_rgb_mode_valid(struct drm_encoder *crtc,
@@ -114,9 +114,8 @@  static void
 sun4i_rgb_connector_destroy(struct drm_connector *connector)
 {
 	struct sun4i_rgb *rgb = drm_connector_to_sun4i_rgb(connector);
-	struct sun4i_tcon *tcon = rgb->tcon;
 
-	drm_panel_detach(tcon->panel);
+	drm_panel_detach(rgb->panel);
 	drm_connector_cleanup(connector);
 }
 
@@ -131,26 +130,24 @@  static const struct drm_connector_funcs sun4i_rgb_con_funcs = {
 static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
 {
 	struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
-	struct sun4i_tcon *tcon = rgb->tcon;
 
 	DRM_DEBUG_DRIVER("Enabling RGB output\n");
 
-	if (tcon->panel) {
-		drm_panel_prepare(tcon->panel);
-		drm_panel_enable(tcon->panel);
+	if (rgb->panel) {
+		drm_panel_prepare(rgb->panel);
+		drm_panel_enable(rgb->panel);
 	}
 }
 
 static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder)
 {
 	struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
-	struct sun4i_tcon *tcon = rgb->tcon;
 
 	DRM_DEBUG_DRIVER("Disabling RGB output\n");
 
-	if (tcon->panel) {
-		drm_panel_disable(tcon->panel);
-		drm_panel_unprepare(tcon->panel);
+	if (rgb->panel) {
+		drm_panel_disable(rgb->panel);
+		drm_panel_unprepare(rgb->panel);
 	}
 }
 
@@ -183,7 +180,7 @@  int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon)
 	encoder = &rgb->encoder;
 
 	ret = drm_of_find_panel_or_bridge(tcon->dev->of_node, 1, 0,
-					  &tcon->panel, &bridge);
+					  &rgb->panel, &bridge);
 	if (ret) {
 		dev_info(drm->dev, "No panel or bridge found... RGB output disabled\n");
 		return 0;
@@ -204,7 +201,7 @@  int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon)
 	/* The RGB encoder can only work with the TCON channel 0 */
 	rgb->encoder.possible_crtcs = drm_crtc_mask(&tcon->crtc->crtc);
 
-	if (tcon->panel) {
+	if (rgb->panel) {
 		drm_connector_helper_add(&rgb->connector,
 					 &sun4i_rgb_con_helper_funcs);
 		ret = drm_connector_init(drm, &rgb->connector,
@@ -218,7 +215,7 @@  int sun4i_rgb_init(struct drm_device *drm, struct sun4i_tcon *tcon)
 		drm_connector_attach_encoder(&rgb->connector,
 						  &rgb->encoder);
 
-		ret = drm_panel_attach(tcon->panel, &rgb->connector);
+		ret = drm_panel_attach(rgb->panel, &rgb->connector);
 		if (ret) {
 			dev_err(drm->dev, "Couldn't attach our panel\n");
 			goto err_cleanup_connector;
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.h b/drivers/gpu/drm/sun4i/sun4i_tcon.h
index b5214d71610f..84cfb1952ff7 100644
--- a/drivers/gpu/drm/sun4i/sun4i_tcon.h
+++ b/drivers/gpu/drm/sun4i/sun4i_tcon.h
@@ -257,8 +257,6 @@  struct sun4i_tcon {
 	struct reset_control		*lcd_rst;
 	struct reset_control		*lvds_rst;
 
-	struct drm_panel		*panel;
-
 	/* Platform adjustments */
 	const struct sun4i_tcon_quirks	*quirks;