Re: [RESEND PATCH 2/3] drm/mediatek: mtk_dpi: Convert to bridge driver

2020-07-08 Thread Enric Balletbo i Serra
Hi Boris,

Thank you for review the patch.

On 1/7/20 13:51, Boris Brezillon wrote:
> On Mon, 18 May 2020 19:39:08 +0200
> Enric Balletbo i Serra  wrote:
> 
>> Convert mtk_dpi to a bridge driver with built-in encoder support for
>> compatibility with existing component drivers.
>>
>> Signed-off-by: Enric Balletbo i Serra 
>> Reviewed-by: Chun-Kuang Hu 
>> ---
>>
>>  drivers/gpu/drm/mediatek/mtk_dpi.c | 66 +++---
>>  1 file changed, 34 insertions(+), 32 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c 
>> b/drivers/gpu/drm/mediatek/mtk_dpi.c
>> index 7112125dc3d1..baad198c69eb 100644
>> --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
>> +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
>> @@ -61,6 +61,7 @@ enum mtk_dpi_out_color_format {
>>  struct mtk_dpi {
>>  struct mtk_ddp_comp ddp_comp;
>>  struct drm_encoder encoder;
>> +struct drm_bridge bridge;
>>  struct drm_bridge *next_bridge;
>>  void __iomem *regs;
>>  struct device *dev;
>> @@ -77,9 +78,9 @@ struct mtk_dpi {
>>  int refcount;
>>  };
>>  
>> -static inline struct mtk_dpi *mtk_dpi_from_encoder(struct drm_encoder *e)
>> +static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b)
>>  {
>> -return container_of(e, struct mtk_dpi, encoder);
>> +return container_of(b, struct mtk_dpi, bridge);
>>  }
>>  
>>  enum mtk_dpi_polarity {
>> @@ -518,50 +519,44 @@ static const struct drm_encoder_funcs 
>> mtk_dpi_encoder_funcs = {
>>  .destroy = mtk_dpi_encoder_destroy,
>>  };
>>  
>> -static bool mtk_dpi_encoder_mode_fixup(struct drm_encoder *encoder,
>> -   const struct drm_display_mode *mode,
>> -   struct drm_display_mode *adjusted_mode)
>> +static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
>> + enum drm_bridge_attach_flags flags)
>>  {
>> -return true;
>> +struct mtk_dpi *dpi = bridge_to_dpi(bridge);
>> +
>> +return drm_bridge_attach(bridge->encoder, dpi->next_bridge,
>> + >bridge, flags);
>>  }
>>  
>> -static void mtk_dpi_encoder_mode_set(struct drm_encoder *encoder,
>> - struct drm_display_mode *mode,
>> - struct drm_display_mode *adjusted_mode)
>> +static void mtk_dpi_bridge_mode_set(struct drm_bridge *bridge,
>> +const struct drm_display_mode *mode,
>> +const struct drm_display_mode *adjusted_mode)
>>  {
>> -struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
>> +struct mtk_dpi *dpi = bridge_to_dpi(bridge);
>>  
>>  drm_mode_copy(>mode, adjusted_mode);
>>  }
>>  
>> -static void mtk_dpi_encoder_disable(struct drm_encoder *encoder)
>> +static void mtk_dpi_bridge_disable(struct drm_bridge *bridge)
>>  {
>> -struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
>> +struct mtk_dpi *dpi = bridge_to_dpi(bridge);
>>  
>>  mtk_dpi_power_off(dpi);
>>  }
>>  
>> -static void mtk_dpi_encoder_enable(struct drm_encoder *encoder)
>> +static void mtk_dpi_bridge_enable(struct drm_bridge *bridge)
>>  {
>> -struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
>> +struct mtk_dpi *dpi = bridge_to_dpi(bridge);
>>  
>>  mtk_dpi_power_on(dpi);
>>  mtk_dpi_set_display_mode(dpi, >mode);
>>  }
>>  
>> -static int mtk_dpi_atomic_check(struct drm_encoder *encoder,
>> -struct drm_crtc_state *crtc_state,
>> -struct drm_connector_state *conn_state)
>> -{
>> -return 0;
>> -}
>> -
>> -static const struct drm_encoder_helper_funcs mtk_dpi_encoder_helper_funcs = 
>> {
>> -.mode_fixup = mtk_dpi_encoder_mode_fixup,
>> -.mode_set = mtk_dpi_encoder_mode_set,
>> -.disable = mtk_dpi_encoder_disable,
>> -.enable = mtk_dpi_encoder_enable,
>> -.atomic_check = mtk_dpi_atomic_check,
>> +static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
>> +.attach = mtk_dpi_bridge_attach,
>> +.mode_set = mtk_dpi_bridge_mode_set,
>> +.disable = mtk_dpi_bridge_disable,
>> +.enable = mtk_dpi_bridge_enable,
>>  };
>>  
>>  static void mtk_dpi_start(struct mtk_ddp_comp *comp)
>> @@ -602,16 +597,13 @@ static int mtk_dpi_bind(struct device *dev, struct 
>> device *master, void *data)
>>  dev_err(dev, "Failed to initialize decoder: %d\n", ret);
>>  goto err_unregister;
>>  }
>> -drm_encoder_helper_add(>encoder, _dpi_encoder_helper_funcs);
>>  
>>  /* Currently DPI0 is fixed to be driven by OVL1 */
>>  dpi->encoder.possible_crtcs = BIT(1);
>>  
>> -ret = drm_bridge_attach(>encoder, dpi->next_bridge, NULL, 0);
>> -if (ret) {
>> -dev_err(dev, "Failed to attach bridge: %d\n", ret);
> 
> Any reason your decided to drop this error message? If there's one,
> this should probably happen in a separate patch.
> 

Right, I'll maintain the error in next version.

>> +ret = 

Re: [RESEND PATCH 2/3] drm/mediatek: mtk_dpi: Convert to bridge driver

2020-07-01 Thread Boris Brezillon
On Mon, 18 May 2020 19:39:08 +0200
Enric Balletbo i Serra  wrote:

> Convert mtk_dpi to a bridge driver with built-in encoder support for
> compatibility with existing component drivers.
> 
> Signed-off-by: Enric Balletbo i Serra 
> Reviewed-by: Chun-Kuang Hu 
> ---
> 
>  drivers/gpu/drm/mediatek/mtk_dpi.c | 66 +++---
>  1 file changed, 34 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c 
> b/drivers/gpu/drm/mediatek/mtk_dpi.c
> index 7112125dc3d1..baad198c69eb 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> @@ -61,6 +61,7 @@ enum mtk_dpi_out_color_format {
>  struct mtk_dpi {
>   struct mtk_ddp_comp ddp_comp;
>   struct drm_encoder encoder;
> + struct drm_bridge bridge;
>   struct drm_bridge *next_bridge;
>   void __iomem *regs;
>   struct device *dev;
> @@ -77,9 +78,9 @@ struct mtk_dpi {
>   int refcount;
>  };
>  
> -static inline struct mtk_dpi *mtk_dpi_from_encoder(struct drm_encoder *e)
> +static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b)
>  {
> - return container_of(e, struct mtk_dpi, encoder);
> + return container_of(b, struct mtk_dpi, bridge);
>  }
>  
>  enum mtk_dpi_polarity {
> @@ -518,50 +519,44 @@ static const struct drm_encoder_funcs 
> mtk_dpi_encoder_funcs = {
>   .destroy = mtk_dpi_encoder_destroy,
>  };
>  
> -static bool mtk_dpi_encoder_mode_fixup(struct drm_encoder *encoder,
> -const struct drm_display_mode *mode,
> -struct drm_display_mode *adjusted_mode)
> +static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
> +  enum drm_bridge_attach_flags flags)
>  {
> - return true;
> + struct mtk_dpi *dpi = bridge_to_dpi(bridge);
> +
> + return drm_bridge_attach(bridge->encoder, dpi->next_bridge,
> +  >bridge, flags);
>  }
>  
> -static void mtk_dpi_encoder_mode_set(struct drm_encoder *encoder,
> -  struct drm_display_mode *mode,
> -  struct drm_display_mode *adjusted_mode)
> +static void mtk_dpi_bridge_mode_set(struct drm_bridge *bridge,
> + const struct drm_display_mode *mode,
> + const struct drm_display_mode *adjusted_mode)
>  {
> - struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
> + struct mtk_dpi *dpi = bridge_to_dpi(bridge);
>  
>   drm_mode_copy(>mode, adjusted_mode);
>  }
>  
> -static void mtk_dpi_encoder_disable(struct drm_encoder *encoder)
> +static void mtk_dpi_bridge_disable(struct drm_bridge *bridge)
>  {
> - struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
> + struct mtk_dpi *dpi = bridge_to_dpi(bridge);
>  
>   mtk_dpi_power_off(dpi);
>  }
>  
> -static void mtk_dpi_encoder_enable(struct drm_encoder *encoder)
> +static void mtk_dpi_bridge_enable(struct drm_bridge *bridge)
>  {
> - struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
> + struct mtk_dpi *dpi = bridge_to_dpi(bridge);
>  
>   mtk_dpi_power_on(dpi);
>   mtk_dpi_set_display_mode(dpi, >mode);
>  }
>  
> -static int mtk_dpi_atomic_check(struct drm_encoder *encoder,
> - struct drm_crtc_state *crtc_state,
> - struct drm_connector_state *conn_state)
> -{
> - return 0;
> -}
> -
> -static const struct drm_encoder_helper_funcs mtk_dpi_encoder_helper_funcs = {
> - .mode_fixup = mtk_dpi_encoder_mode_fixup,
> - .mode_set = mtk_dpi_encoder_mode_set,
> - .disable = mtk_dpi_encoder_disable,
> - .enable = mtk_dpi_encoder_enable,
> - .atomic_check = mtk_dpi_atomic_check,
> +static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
> + .attach = mtk_dpi_bridge_attach,
> + .mode_set = mtk_dpi_bridge_mode_set,
> + .disable = mtk_dpi_bridge_disable,
> + .enable = mtk_dpi_bridge_enable,
>  };
>  
>  static void mtk_dpi_start(struct mtk_ddp_comp *comp)
> @@ -602,16 +597,13 @@ static int mtk_dpi_bind(struct device *dev, struct 
> device *master, void *data)
>   dev_err(dev, "Failed to initialize decoder: %d\n", ret);
>   goto err_unregister;
>   }
> - drm_encoder_helper_add(>encoder, _dpi_encoder_helper_funcs);
>  
>   /* Currently DPI0 is fixed to be driven by OVL1 */
>   dpi->encoder.possible_crtcs = BIT(1);
>  
> - ret = drm_bridge_attach(>encoder, dpi->next_bridge, NULL, 0);
> - if (ret) {
> - dev_err(dev, "Failed to attach bridge: %d\n", ret);

Any reason your decided to drop this error message? If there's one,
this should probably happen in a separate patch.

> + ret = drm_bridge_attach(>encoder, >bridge, NULL, 0);
> + if (ret)
>   goto err_cleanup;
> - }
>  
>   dpi->bit_num = MTK_DPI_OUT_BIT_NUM_8BITS;
>   dpi->channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB;
> @@ -768,8 

[RESEND PATCH 2/3] drm/mediatek: mtk_dpi: Convert to bridge driver

2020-05-18 Thread Enric Balletbo i Serra
Convert mtk_dpi to a bridge driver with built-in encoder support for
compatibility with existing component drivers.

Signed-off-by: Enric Balletbo i Serra 
Reviewed-by: Chun-Kuang Hu 
---

 drivers/gpu/drm/mediatek/mtk_dpi.c | 66 +++---
 1 file changed, 34 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c 
b/drivers/gpu/drm/mediatek/mtk_dpi.c
index 7112125dc3d1..baad198c69eb 100644
--- a/drivers/gpu/drm/mediatek/mtk_dpi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
@@ -61,6 +61,7 @@ enum mtk_dpi_out_color_format {
 struct mtk_dpi {
struct mtk_ddp_comp ddp_comp;
struct drm_encoder encoder;
+   struct drm_bridge bridge;
struct drm_bridge *next_bridge;
void __iomem *regs;
struct device *dev;
@@ -77,9 +78,9 @@ struct mtk_dpi {
int refcount;
 };
 
-static inline struct mtk_dpi *mtk_dpi_from_encoder(struct drm_encoder *e)
+static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b)
 {
-   return container_of(e, struct mtk_dpi, encoder);
+   return container_of(b, struct mtk_dpi, bridge);
 }
 
 enum mtk_dpi_polarity {
@@ -518,50 +519,44 @@ static const struct drm_encoder_funcs 
mtk_dpi_encoder_funcs = {
.destroy = mtk_dpi_encoder_destroy,
 };
 
-static bool mtk_dpi_encoder_mode_fixup(struct drm_encoder *encoder,
-  const struct drm_display_mode *mode,
-  struct drm_display_mode *adjusted_mode)
+static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
+enum drm_bridge_attach_flags flags)
 {
-   return true;
+   struct mtk_dpi *dpi = bridge_to_dpi(bridge);
+
+   return drm_bridge_attach(bridge->encoder, dpi->next_bridge,
+>bridge, flags);
 }
 
-static void mtk_dpi_encoder_mode_set(struct drm_encoder *encoder,
-struct drm_display_mode *mode,
-struct drm_display_mode *adjusted_mode)
+static void mtk_dpi_bridge_mode_set(struct drm_bridge *bridge,
+   const struct drm_display_mode *mode,
+   const struct drm_display_mode *adjusted_mode)
 {
-   struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
+   struct mtk_dpi *dpi = bridge_to_dpi(bridge);
 
drm_mode_copy(>mode, adjusted_mode);
 }
 
-static void mtk_dpi_encoder_disable(struct drm_encoder *encoder)
+static void mtk_dpi_bridge_disable(struct drm_bridge *bridge)
 {
-   struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
+   struct mtk_dpi *dpi = bridge_to_dpi(bridge);
 
mtk_dpi_power_off(dpi);
 }
 
-static void mtk_dpi_encoder_enable(struct drm_encoder *encoder)
+static void mtk_dpi_bridge_enable(struct drm_bridge *bridge)
 {
-   struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
+   struct mtk_dpi *dpi = bridge_to_dpi(bridge);
 
mtk_dpi_power_on(dpi);
mtk_dpi_set_display_mode(dpi, >mode);
 }
 
-static int mtk_dpi_atomic_check(struct drm_encoder *encoder,
-   struct drm_crtc_state *crtc_state,
-   struct drm_connector_state *conn_state)
-{
-   return 0;
-}
-
-static const struct drm_encoder_helper_funcs mtk_dpi_encoder_helper_funcs = {
-   .mode_fixup = mtk_dpi_encoder_mode_fixup,
-   .mode_set = mtk_dpi_encoder_mode_set,
-   .disable = mtk_dpi_encoder_disable,
-   .enable = mtk_dpi_encoder_enable,
-   .atomic_check = mtk_dpi_atomic_check,
+static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
+   .attach = mtk_dpi_bridge_attach,
+   .mode_set = mtk_dpi_bridge_mode_set,
+   .disable = mtk_dpi_bridge_disable,
+   .enable = mtk_dpi_bridge_enable,
 };
 
 static void mtk_dpi_start(struct mtk_ddp_comp *comp)
@@ -602,16 +597,13 @@ static int mtk_dpi_bind(struct device *dev, struct device 
*master, void *data)
dev_err(dev, "Failed to initialize decoder: %d\n", ret);
goto err_unregister;
}
-   drm_encoder_helper_add(>encoder, _dpi_encoder_helper_funcs);
 
/* Currently DPI0 is fixed to be driven by OVL1 */
dpi->encoder.possible_crtcs = BIT(1);
 
-   ret = drm_bridge_attach(>encoder, dpi->next_bridge, NULL, 0);
-   if (ret) {
-   dev_err(dev, "Failed to attach bridge: %d\n", ret);
+   ret = drm_bridge_attach(>encoder, >bridge, NULL, 0);
+   if (ret)
goto err_cleanup;
-   }
 
dpi->bit_num = MTK_DPI_OUT_BIT_NUM_8BITS;
dpi->channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB;
@@ -768,8 +760,15 @@ static int mtk_dpi_probe(struct platform_device *pdev)
 
platform_set_drvdata(pdev, dpi);
 
+   dpi->bridge.funcs = _dpi_bridge_funcs;
+   dpi->bridge.of_node = dev->of_node;
+   dpi->bridge.type = DRM_MODE_CONNECTOR_DPI;
+
+   drm_bridge_add(>bridge);
+
ret = component_add(dev,