Re: [PATCH v4 40/78] drm/vc4: hdmi: rework connectors and encoders

2020-07-28 Thread Dave Stevenson
Hi Maxime

On Wed, 8 Jul 2020 at 18:43, Maxime Ripard  wrote:
>
> the vc4_hdmi driver has some custom structures to hold the data it needs to
> associate with the drm_encoder and drm_connector structures.
>
> However, it allocates them separately from the vc4_hdmi structure which
> makes it more complicated than it needs to be.
>
> Move those structures to be contained by vc4_hdmi and update the code
> accordingly.
>
> Signed-off-by: Maxime Ripard 

Reviewed-by: Dave Stevenson 

> ---
>  drivers/gpu/drm/vc4/vc4_hdmi.c | 87 ---
>  drivers/gpu/drm/vc4/vc4_hdmi.h | 64 +-
>  2 files changed, 72 insertions(+), 79 deletions(-)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
> index db79e0d88625..1e2214f24ed7 100644
> --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
> +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
> @@ -191,20 +191,15 @@ static const struct drm_connector_helper_funcs 
> vc4_hdmi_connector_helper_funcs =
> .get_modes = vc4_hdmi_connector_get_modes,
>  };
>
> -static struct drm_connector *vc4_hdmi_connector_init(struct drm_device *dev,
> -struct drm_encoder 
> *encoder,
> -struct i2c_adapter *ddc)
> +static int vc4_hdmi_connector_init(struct drm_device *dev,
> +  struct vc4_hdmi *vc4_hdmi,
> +  struct i2c_adapter *ddc)
>  {
> -   struct drm_connector *connector;
> -   struct vc4_hdmi_connector *hdmi_connector;
> +   struct vc4_hdmi_connector *hdmi_connector = _hdmi->connector;
> +   struct drm_connector *connector = _connector->base;
> +   struct drm_encoder *encoder = _hdmi->encoder.base.base;
> int ret;
>
> -   hdmi_connector = devm_kzalloc(dev->dev, sizeof(*hdmi_connector),
> - GFP_KERNEL);
> -   if (!hdmi_connector)
> -   return ERR_PTR(-ENOMEM);
> -   connector = _connector->base;
> -
> hdmi_connector->encoder = encoder;
>
> drm_connector_init_with_ddc(dev, connector,
> @@ -216,7 +211,7 @@ static struct drm_connector 
> *vc4_hdmi_connector_init(struct drm_device *dev,
> /* Create and attach TV margin props to this connector. */
> ret = drm_mode_create_tv_margin_properties(dev);
> if (ret)
> -   return ERR_PTR(ret);
> +   return ret;
>
> drm_connector_attach_tv_margin_properties(connector);
>
> @@ -228,7 +223,7 @@ static struct drm_connector 
> *vc4_hdmi_connector_init(struct drm_device *dev,
>
> drm_connector_attach_encoder(connector, encoder);
>
> -   return connector;
> +   return 0;
>  }
>
>  static int vc4_hdmi_stop_packet(struct drm_encoder *encoder,
> @@ -298,21 +293,22 @@ static void vc4_hdmi_set_avi_infoframe(struct 
> drm_encoder *encoder)
> struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
> struct vc4_dev *vc4 = encoder->dev->dev_private;
> struct vc4_hdmi *hdmi = vc4->hdmi;
> -   struct drm_connector_state *cstate = hdmi->connector->state;
> +   struct drm_connector *connector = >connector.base;
> +   struct drm_connector_state *cstate = connector->state;
> struct drm_crtc *crtc = encoder->crtc;
> const struct drm_display_mode *mode = >state->adjusted_mode;
> union hdmi_infoframe frame;
> int ret;
>
> ret = drm_hdmi_avi_infoframe_from_display_mode(,
> -  hdmi->connector, mode);
> +  connector, mode);
> if (ret < 0) {
> DRM_ERROR("couldn't fill AVI infoframe\n");
> return;
> }
>
> drm_hdmi_avi_infoframe_quant_range(,
> -  hdmi->connector, mode,
> +  connector, mode,
>vc4_encoder->limited_rgb_range ?
>HDMI_QUANTIZATION_RANGE_LIMITED :
>HDMI_QUANTIZATION_RANGE_FULL);
> @@ -628,7 +624,8 @@ static const struct drm_encoder_helper_funcs 
> vc4_hdmi_encoder_helper_funcs = {
>  /* HDMI audio codec callbacks */
>  static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *hdmi)
>  {
> -   struct drm_device *drm = hdmi->encoder->dev;
> +   struct drm_encoder *encoder = >encoder.base.base;
> +   struct drm_device *drm = encoder->dev;
> struct vc4_dev *vc4 = to_vc4_dev(drm);
> u32 hsm_clock = clk_get_rate(hdmi->hsm_clock);
> unsigned long n, m;
> @@ -647,7 +644,7 @@ static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi 
> *hdmi)
>
>  static void vc4_hdmi_set_n_cts(struct vc4_hdmi *hdmi)
>  {
> -   struct drm_encoder *encoder = hdmi->encoder;
> +   struct drm_encoder *encoder = 

[PATCH v4 40/78] drm/vc4: hdmi: rework connectors and encoders

2020-07-09 Thread Maxime Ripard
the vc4_hdmi driver has some custom structures to hold the data it needs to
associate with the drm_encoder and drm_connector structures.

However, it allocates them separately from the vc4_hdmi structure which
makes it more complicated than it needs to be.

Move those structures to be contained by vc4_hdmi and update the code
accordingly.

Signed-off-by: Maxime Ripard 
---
 drivers/gpu/drm/vc4/vc4_hdmi.c | 87 ---
 drivers/gpu/drm/vc4/vc4_hdmi.h | 64 +-
 2 files changed, 72 insertions(+), 79 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index db79e0d88625..1e2214f24ed7 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -191,20 +191,15 @@ static const struct drm_connector_helper_funcs 
vc4_hdmi_connector_helper_funcs =
.get_modes = vc4_hdmi_connector_get_modes,
 };
 
-static struct drm_connector *vc4_hdmi_connector_init(struct drm_device *dev,
-struct drm_encoder 
*encoder,
-struct i2c_adapter *ddc)
+static int vc4_hdmi_connector_init(struct drm_device *dev,
+  struct vc4_hdmi *vc4_hdmi,
+  struct i2c_adapter *ddc)
 {
-   struct drm_connector *connector;
-   struct vc4_hdmi_connector *hdmi_connector;
+   struct vc4_hdmi_connector *hdmi_connector = _hdmi->connector;
+   struct drm_connector *connector = _connector->base;
+   struct drm_encoder *encoder = _hdmi->encoder.base.base;
int ret;
 
-   hdmi_connector = devm_kzalloc(dev->dev, sizeof(*hdmi_connector),
- GFP_KERNEL);
-   if (!hdmi_connector)
-   return ERR_PTR(-ENOMEM);
-   connector = _connector->base;
-
hdmi_connector->encoder = encoder;
 
drm_connector_init_with_ddc(dev, connector,
@@ -216,7 +211,7 @@ static struct drm_connector *vc4_hdmi_connector_init(struct 
drm_device *dev,
/* Create and attach TV margin props to this connector. */
ret = drm_mode_create_tv_margin_properties(dev);
if (ret)
-   return ERR_PTR(ret);
+   return ret;
 
drm_connector_attach_tv_margin_properties(connector);
 
@@ -228,7 +223,7 @@ static struct drm_connector *vc4_hdmi_connector_init(struct 
drm_device *dev,
 
drm_connector_attach_encoder(connector, encoder);
 
-   return connector;
+   return 0;
 }
 
 static int vc4_hdmi_stop_packet(struct drm_encoder *encoder,
@@ -298,21 +293,22 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder 
*encoder)
struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
struct vc4_dev *vc4 = encoder->dev->dev_private;
struct vc4_hdmi *hdmi = vc4->hdmi;
-   struct drm_connector_state *cstate = hdmi->connector->state;
+   struct drm_connector *connector = >connector.base;
+   struct drm_connector_state *cstate = connector->state;
struct drm_crtc *crtc = encoder->crtc;
const struct drm_display_mode *mode = >state->adjusted_mode;
union hdmi_infoframe frame;
int ret;
 
ret = drm_hdmi_avi_infoframe_from_display_mode(,
-  hdmi->connector, mode);
+  connector, mode);
if (ret < 0) {
DRM_ERROR("couldn't fill AVI infoframe\n");
return;
}
 
drm_hdmi_avi_infoframe_quant_range(,
-  hdmi->connector, mode,
+  connector, mode,
   vc4_encoder->limited_rgb_range ?
   HDMI_QUANTIZATION_RANGE_LIMITED :
   HDMI_QUANTIZATION_RANGE_FULL);
@@ -628,7 +624,8 @@ static const struct drm_encoder_helper_funcs 
vc4_hdmi_encoder_helper_funcs = {
 /* HDMI audio codec callbacks */
 static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *hdmi)
 {
-   struct drm_device *drm = hdmi->encoder->dev;
+   struct drm_encoder *encoder = >encoder.base.base;
+   struct drm_device *drm = encoder->dev;
struct vc4_dev *vc4 = to_vc4_dev(drm);
u32 hsm_clock = clk_get_rate(hdmi->hsm_clock);
unsigned long n, m;
@@ -647,7 +644,7 @@ static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi 
*hdmi)
 
 static void vc4_hdmi_set_n_cts(struct vc4_hdmi *hdmi)
 {
-   struct drm_encoder *encoder = hdmi->encoder;
+   struct drm_encoder *encoder = >encoder.base.base;
struct drm_crtc *crtc = encoder->crtc;
struct drm_device *drm = encoder->dev;
struct vc4_dev *vc4 = to_vc4_dev(drm);
@@ -685,7 +682,8 @@ static int vc4_hdmi_audio_startup(struct snd_pcm_substream 
*substream,
  struct