mbox series

[v1,0/6] Add display driver for MT8188 VDOSYS1

Message ID 20230607061121.6732-1-shawn.sung@mediatek.com
Headers show
Series Add display driver for MT8188 VDOSYS1 | expand

Message

Shawn Sung June 7, 2023, 6:11 a.m. UTC
[PATCH v1 1/6] dt-bindings: display/mediatek: mt8188: Add documentations
[PATCH v1 2/6] dt-bindings: reset: mt8188: Add reset control bits for VDOSYS1
[PATCH v1 3/6] soc: mediatek: mt8188: Support VDOSYS1 in mtk-mmsys
[PATCH v1 4/6] drm/mediatek: mt8188: Modify display driver for VDOSYS1
[PATCH v1 5/6] soc: mediatek: mt8188: Support VDOSYS1 PADDING in mtk-mmsys
[PATCH v1 6/6] drm/mediatek: mt8188: Add VDOSYS1 PADDING driver

Hsiao Chien Sung (6):
  dt-bindings: display/mediatek: mt8188: Add documentations for VDOSYS1
  dt-bindings: reset: mt8188: Add reset control bits for VDOSYS1
  soc: mediatek: mt8188: Support VDOSYS1 in mtk-mmsys
  drm/mediatek: mt8188: Modify display driver for VDOSYS1
  soc: mediatek: mt8188: Support VDOSYS1 PADDING in mtk-mmsys
  drm/mediatek: mt8188: Add VDOSYS1 PADDING driver

 .../bindings/arm/mediatek/mediatek,mmsys.yaml |   1 +
 .../display/mediatek/mediatek,ethdr.yaml      |   5 +-
 .../display/mediatek/mediatek,mdp-rdma.yaml   |   5 +-
 .../display/mediatek/mediatek,merge.yaml      |   1 +
 .../display/mediatek/mediatek,padding.yaml    |  80 ++++++++++
 drivers/gpu/drm/mediatek/Makefile             |   1 +
 drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   3 +
 drivers/gpu/drm/mediatek/mtk_disp_merge.c     |   3 +-
 .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   | 143 +++++++++++------
 drivers/gpu/drm/mediatek/mtk_disp_padding.c   | 134 ++++++++++++++++
 drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h   |   1 +
 drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  29 +++-
 drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
 drivers/gpu/drm/mediatek/mtk_ethdr.c          |   1 +
 drivers/gpu/drm/mediatek/mtk_mdp_rdma.c       |   1 +
 drivers/soc/mediatek/mt8188-mmsys.h           | 149 ++++++++++++++++++
 drivers/soc/mediatek/mtk-mmsys.c              |  13 ++
 drivers/soc/mediatek/mtk-mmsys.h              |   1 +
 drivers/soc/mediatek/mtk-mutex.c              |  51 ++++++
 include/dt-bindings/reset/mt8188-resets.h     |  12 ++
 include/linux/soc/mediatek/mtk-mmsys.h        |   8 +
 21 files changed, 589 insertions(+), 55 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,padding.yaml
 create mode 100644 drivers/gpu/drm/mediatek/mtk_disp_padding.c

--
2.18.0

Comments

AngeloGioacchino Del Regno June 7, 2023, 7:20 a.m. UTC | #1
Il 07/06/23 08:11, Hsiao Chien Sung ha scritto:
> - Modify MUTEX and component preparation logic for better compatibility
> - Adjust display module probe sequence to avoid probe deferral

Please split this in two commits, one modifying mutex/component preparation
logic, and one optimizing the probe sequence.

Also, you're adding MT8188 compatible strings without mentioning that anywhere.

Thanks,
Angelo

> 
> Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
> ---
>   drivers/gpu/drm/mediatek/mtk_disp_merge.c     |   3 +-
>   .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   | 100 ++++++++++--------
>   drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  28 ++++-
>   drivers/gpu/drm/mediatek/mtk_ethdr.c          |   1 +
>   drivers/gpu/drm/mediatek/mtk_mdp_rdma.c       |   1 +
>   5 files changed, 84 insertions(+), 49 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> index 6428b6203ffe..2a30e41c246f 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> @@ -104,7 +104,7 @@ void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
>   	mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs,
>   		      DISP_REG_MERGE_CTRL);
> 
> -	if (priv->async_clk)
> +	if (!cmdq_pkt && priv->async_clk)
>   		reset_control_reset(priv->reset_ctl);
>   }
> 
> @@ -303,6 +303,7 @@ static int mtk_disp_merge_remove(struct platform_device *pdev)
>   }
> 
>   static const struct of_device_id mtk_disp_merge_driver_dt_match[] = {
> +	{ .compatible = "mediatek,mt8188-disp-merge", },
>   	{ .compatible = "mediatek,mt8195-disp-merge", },
>   	{},
>   };
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> index c0a38f5217ee..e1d8d4765af8 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> @@ -51,6 +51,7 @@ enum mtk_ovl_adaptor_comp_id {
> 
>   struct ovl_adaptor_comp_match {
>   	enum mtk_ovl_adaptor_comp_type type;
> +	enum mtk_ddp_comp_id comp_id;
>   	int alias_id;
>   };
> 
> @@ -67,19 +68,19 @@ static const char * const private_comp_stem[OVL_ADAPTOR_TYPE_NUM] = {
>   };
> 
>   static const struct ovl_adaptor_comp_match comp_matches[OVL_ADAPTOR_ID_MAX] = {
> -	[OVL_ADAPTOR_MDP_RDMA0]	= { OVL_ADAPTOR_TYPE_RDMA, 0 },
> -	[OVL_ADAPTOR_MDP_RDMA1]	= { OVL_ADAPTOR_TYPE_RDMA, 1 },
> -	[OVL_ADAPTOR_MDP_RDMA2]	= { OVL_ADAPTOR_TYPE_RDMA, 2 },
> -	[OVL_ADAPTOR_MDP_RDMA3]	= { OVL_ADAPTOR_TYPE_RDMA, 3 },
> -	[OVL_ADAPTOR_MDP_RDMA4]	= { OVL_ADAPTOR_TYPE_RDMA, 4 },
> -	[OVL_ADAPTOR_MDP_RDMA5]	= { OVL_ADAPTOR_TYPE_RDMA, 5 },
> -	[OVL_ADAPTOR_MDP_RDMA6]	= { OVL_ADAPTOR_TYPE_RDMA, 6 },
> -	[OVL_ADAPTOR_MDP_RDMA7]	= { OVL_ADAPTOR_TYPE_RDMA, 7 },
> -	[OVL_ADAPTOR_MERGE0]	= { OVL_ADAPTOR_TYPE_MERGE, 1 },
> -	[OVL_ADAPTOR_MERGE1]	= { OVL_ADAPTOR_TYPE_MERGE, 2 },
> -	[OVL_ADAPTOR_MERGE2]	= { OVL_ADAPTOR_TYPE_MERGE, 3 },
> -	[OVL_ADAPTOR_MERGE3]	= { OVL_ADAPTOR_TYPE_MERGE, 4 },
> -	[OVL_ADAPTOR_ETHDR0]	= { OVL_ADAPTOR_TYPE_ETHDR, 0 },
> +	[OVL_ADAPTOR_MDP_RDMA0] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA0, 0 },
> +	[OVL_ADAPTOR_MDP_RDMA1] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA1, 1 },
> +	[OVL_ADAPTOR_MDP_RDMA2] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA2, 2 },
> +	[OVL_ADAPTOR_MDP_RDMA3] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA3, 3 },
> +	[OVL_ADAPTOR_MDP_RDMA4] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA4, 4 },
> +	[OVL_ADAPTOR_MDP_RDMA5] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA5, 5 },
> +	[OVL_ADAPTOR_MDP_RDMA6] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA6, 6 },
> +	[OVL_ADAPTOR_MDP_RDMA7] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA7, 7 },
> +	[OVL_ADAPTOR_MERGE0] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE1, 1 },
> +	[OVL_ADAPTOR_MERGE1] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE2, 2 },
> +	[OVL_ADAPTOR_MERGE2] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE3, 3 },
> +	[OVL_ADAPTOR_MERGE3] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE4, 4 },
> +	[OVL_ADAPTOR_ETHDR0] = { OVL_ADAPTOR_TYPE_ETHDR, DDP_COMPONENT_ETHDR_MIXER, 0 },
>   };
> 
>   void mtk_ovl_adaptor_layer_config(struct device *dev, unsigned int idx,
> @@ -192,6 +193,8 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
> 
>   	for (i = 0; i < OVL_ADAPTOR_MERGE0; i++) {
>   		comp = ovl_adaptor->ovl_adaptor_comp[i];
> +		if (!comp)
> +			continue;
>   		ret = pm_runtime_get_sync(comp);
>   		if (ret < 0) {
>   			dev_err(dev, "Failed to enable power domain %d, err %d\n", i, ret);
> @@ -201,7 +204,8 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
> 
>   	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
>   		comp = ovl_adaptor->ovl_adaptor_comp[i];
> -
> +		if (!comp)
> +			continue;
>   		if (i < OVL_ADAPTOR_MERGE0)
>   			ret = mtk_mdp_rdma_clk_enable(comp);
>   		else if (i < OVL_ADAPTOR_ETHDR0)
> @@ -219,6 +223,8 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>   clk_err:
>   	while (--i >= 0) {
>   		comp = ovl_adaptor->ovl_adaptor_comp[i];
> +		if (!comp)
> +			continue;
>   		if (i < OVL_ADAPTOR_MERGE0)
>   			mtk_mdp_rdma_clk_disable(comp);
>   		else if (i < OVL_ADAPTOR_ETHDR0)
> @@ -229,8 +235,12 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>   	i = OVL_ADAPTOR_MERGE0;
> 
>   pwr_err:
> -	while (--i >= 0)
> -		pm_runtime_put(ovl_adaptor->ovl_adaptor_comp[i]);
> +	while (--i >= 0) {
> +		comp = ovl_adaptor->ovl_adaptor_comp[i];
> +		if (!comp)
> +			continue;
> +		pm_runtime_put(comp);
> +	}
> 
>   	return ret;
>   }
> @@ -243,7 +253,8 @@ void mtk_ovl_adaptor_clk_disable(struct device *dev)
> 
>   	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
>   		comp = ovl_adaptor->ovl_adaptor_comp[i];
> -
> +		if (!comp)
> +			continue;
>   		if (i < OVL_ADAPTOR_MERGE0) {
>   			mtk_mdp_rdma_clk_disable(comp);
>   			pm_runtime_put(comp);
> @@ -313,36 +324,26 @@ size_t mtk_ovl_adaptor_get_num_formats(struct device *dev)
> 
>   void mtk_ovl_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex)
>   {
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA0);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA1);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA2);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA3);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA4);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA5);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA6);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA7);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE1);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE2);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE3);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE4);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_ETHDR_MIXER);
> +	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
> +	int i;
> +
> +	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
> +		if (!ovl_adaptor->ovl_adaptor_comp[i])
> +			continue;
> +		mtk_mutex_add_comp(mutex, comp_matches[i].comp_id);
> +	}
>   }
> 
>   void mtk_ovl_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex)
>   {
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA0);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA1);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA2);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA3);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA4);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA5);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA6);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA7);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE1);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE2);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE3);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE4);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_ETHDR_MIXER);
> +	struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
> +	int i;
> +
> +	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
> +		if (!ovl_adaptor->ovl_adaptor_comp[i])
> +			continue;
> +		mtk_mutex_remove_comp(mutex, comp_matches[i].comp_id);
> +	}
>   }
> 
>   void mtk_ovl_adaptor_connect(struct device *dev, struct device *mmsys_dev, unsigned int next)
> @@ -386,6 +387,15 @@ static int ovl_adaptor_comp_get_id(struct device *dev, struct device_node *node,
> 
>   static const struct of_device_id mtk_ovl_adaptor_comp_dt_ids[] = {
>   	{
> +		.compatible = "mediatek,mt8188-vdo1-rdma",
> +		.data = (void *)OVL_ADAPTOR_TYPE_RDMA,
> +	}, {
> +		.compatible = "mediatek,mt8188-disp-merge",
> +		.data = (void *)OVL_ADAPTOR_TYPE_MERGE,
> +	}, {
> +		.compatible = "mediatek,mt8188-disp-ethdr",
> +		.data = (void *)OVL_ADAPTOR_TYPE_ETHDR,
> +	}, {
>   		.compatible = "mediatek,mt8195-vdo1-rdma",
>   		.data = (void *)OVL_ADAPTOR_TYPE_RDMA,
>   	}, {
> @@ -466,6 +476,9 @@ static int mtk_disp_ovl_adaptor_comp_bind(struct device *dev, struct device *mas
>   static void mtk_disp_ovl_adaptor_comp_unbind(struct device *dev, struct device *master,
>   					     void *data)
>   {
> +	struct mtk_disp_ovl_adaptor *priv = dev_get_drvdata(dev);
> +
> +	priv->children_bound = false;
>   }
> 
>   static const struct component_ops mtk_disp_ovl_adaptor_comp_ops = {
> @@ -483,6 +496,7 @@ static int mtk_disp_ovl_adaptor_master_bind(struct device *dev)
>   		return dev_err_probe(dev, ret, "component_bind_all failed!\n");
> 
>   	priv->children_bound = true;
> +
>   	return 0;
>   }
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index 6dcb4ba2466c..87dadd129c22 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -188,6 +188,12 @@ static const unsigned int mt8188_mtk_ddp_main[] = {
>   	DDP_COMPONENT_DP_INTF0,
>   };
> 
> +static const unsigned int mt8188_mtk_ddp_ext[] = {
> +	DDP_COMPONENT_DRM_OVL_ADAPTOR,
> +	DDP_COMPONENT_MERGE5,
> +	DDP_COMPONENT_DP_INTF1,
> +};
> +
>   static const unsigned int mt8192_mtk_ddp_main[] = {
>   	DDP_COMPONENT_OVL0,
>   	DDP_COMPONENT_OVL_2L0,
> @@ -287,6 +293,14 @@ static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
>   static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data = {
>   	.main_path = mt8188_mtk_ddp_main,
>   	.main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> +	.mmsys_dev_num = 2,
> +};
> +
> +static const struct mtk_mmsys_driver_data mt8188_vdosys1_driver_data = {
> +	.ext_path = mt8188_mtk_ddp_ext,
> +	.ext_len = ARRAY_SIZE(mt8188_mtk_ddp_ext),
> +	.mmsys_id = 1,
> +	.mmsys_dev_num = 2,
>   };
> 
>   static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = {
> @@ -327,6 +341,8 @@ static const struct of_device_id mtk_drm_of_ids[] = {
>   	  .data = &mt8186_mmsys_driver_data},
>   	{ .compatible = "mediatek,mt8188-vdosys0",
>   	  .data = &mt8188_vdosys0_driver_data},
> +	{ .compatible = "mediatek,mt8188-vdosys1",
> +	  .data = &mt8188_vdosys1_driver_data},
>   	{ .compatible = "mediatek,mt8192-mmsys",
>   	  .data = &mt8192_mmsys_driver_data},
>   	{ .compatible = "mediatek,mt8195-mmsys",
> @@ -682,6 +698,8 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
>   	  .data = (void *)MTK_DISP_GAMMA, },
>   	{ .compatible = "mediatek,mt8183-disp-gamma",
>   	  .data = (void *)MTK_DISP_GAMMA, },
> +	{ .compatible = "mediatek,mt8188-disp-merge",
> +	  .data = (void *)MTK_DISP_MERGE },
>   	{ .compatible = "mediatek,mt8195-disp-merge",
>   	  .data = (void *)MTK_DISP_MERGE },
>   	{ .compatible = "mediatek,mt2701-disp-mutex",
> @@ -965,15 +983,15 @@ static struct platform_driver * const mtk_drm_drivers[] = {
>   	&mtk_disp_ccorr_driver,
>   	&mtk_disp_color_driver,
>   	&mtk_disp_gamma_driver,
> +	&mtk_disp_rdma_driver,
> +	&mtk_mdp_rdma_driver,
>   	&mtk_disp_merge_driver,
> -	&mtk_disp_ovl_adaptor_driver,
> +	&mtk_ethdr_driver,
>   	&mtk_disp_ovl_driver,
> -	&mtk_disp_rdma_driver,
> +	&mtk_disp_ovl_adaptor_driver,
> +	&mtk_dsi_driver,
>   	&mtk_dpi_driver,
>   	&mtk_drm_platform_driver,
> -	&mtk_dsi_driver,
> -	&mtk_ethdr_driver,
> -	&mtk_mdp_rdma_driver,
>   };
> 
>   static int __init mtk_drm_init(void)
> diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> index 73dc4da3ba3b..b5a6b67f2db9 100644
> --- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
> +++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> @@ -353,6 +353,7 @@ static int mtk_ethdr_remove(struct platform_device *pdev)
>   }
> 
>   static const struct of_device_id mtk_ethdr_driver_dt_match[] = {
> +	{ .compatible = "mediatek,mt8188-disp-ethdr"},
>   	{ .compatible = "mediatek,mt8195-disp-ethdr"},
>   	{},
>   };
> diff --git a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> index e06db6e56b5f..06d5c9abb515 100644
> --- a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> @@ -323,6 +323,7 @@ static int mtk_mdp_rdma_remove(struct platform_device *pdev)
>   }
> 
>   static const struct of_device_id mtk_mdp_rdma_driver_dt_match[] = {
> +	{ .compatible = "mediatek,mt8188-vdo1-rdma", },
>   	{ .compatible = "mediatek,mt8195-vdo1-rdma", },
>   	{},
>   };
> --
> 2.18.0
>
AngeloGioacchino Del Regno June 7, 2023, 7:36 a.m. UTC | #2
Il 07/06/23 08:11, Hsiao Chien Sung ha scritto:
> Add VDOSYS1 PADDING driver.

Please expand on the commit description, say what PADDING does, what is it for.

> 
> Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
> ---
>   drivers/gpu/drm/mediatek/Makefile             |   1 +
>   drivers/gpu/drm/mediatek/mtk_disp_drv.h       |   3 +
>   .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   |  43 +++++-
>   drivers/gpu/drm/mediatek/mtk_disp_padding.c   | 134 ++++++++++++++++++
>   drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h   |   1 +
>   drivers/gpu/drm/mediatek/mtk_drm_drv.c        |   1 +
>   drivers/gpu/drm/mediatek/mtk_drm_drv.h        |   2 +-
>   7 files changed, 181 insertions(+), 4 deletions(-)
>   create mode 100644 drivers/gpu/drm/mediatek/mtk_disp_padding.c
> 
> diff --git a/drivers/gpu/drm/mediatek/Makefile b/drivers/gpu/drm/mediatek/Makefile
> index d4d193f60271..753b7cb264d6 100644
> --- a/drivers/gpu/drm/mediatek/Makefile
> +++ b/drivers/gpu/drm/mediatek/Makefile
> @@ -7,6 +7,7 @@ mediatek-drm-y := mtk_disp_aal.o \
>   		  mtk_disp_merge.o \
>   		  mtk_disp_ovl.o \
>   		  mtk_disp_ovl_adaptor.o \
> +		  mtk_disp_padding.o \
>   		  mtk_disp_rdma.o \
>   		  mtk_drm_crtc.o \
>   		  mtk_drm_ddp_comp.o \
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 2254038519e1..7200519a2670 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -157,4 +157,7 @@ void mtk_mdp_rdma_config(struct device *dev, struct mtk_mdp_rdma_cfg *cfg,
>   const u32 *mtk_mdp_rdma_get_formats(struct device *dev);
>   size_t mtk_mdp_rdma_get_num_formats(struct device *dev);
> 
> +int mtk_disp_padding_clk_enable(struct device *dev);
> +void mtk_disp_padding_clk_disable(struct device *dev);
> +void mtk_disp_padding_config(struct device *dev, struct cmdq_pkt *cmdq_pkt);
>   #endif
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> index e1d8d4765af8..5f775144e8c1 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> @@ -27,6 +27,7 @@
> 
>   enum mtk_ovl_adaptor_comp_type {
>   	OVL_ADAPTOR_TYPE_RDMA = 0,
> +	OVL_ADAPTOR_TYPE_PADDING,
>   	OVL_ADAPTOR_TYPE_MERGE,
>   	OVL_ADAPTOR_TYPE_ETHDR,
>   	OVL_ADAPTOR_TYPE_NUM,
> @@ -41,6 +42,14 @@ enum mtk_ovl_adaptor_comp_id {
>   	OVL_ADAPTOR_MDP_RDMA5,
>   	OVL_ADAPTOR_MDP_RDMA6,
>   	OVL_ADAPTOR_MDP_RDMA7,
> +	OVL_ADAPTOR_DISP_PADDING0,
> +	OVL_ADAPTOR_DISP_PADDING1,
> +	OVL_ADAPTOR_DISP_PADDING2,
> +	OVL_ADAPTOR_DISP_PADDING3,
> +	OVL_ADAPTOR_DISP_PADDING4,
> +	OVL_ADAPTOR_DISP_PADDING5,
> +	OVL_ADAPTOR_DISP_PADDING6,
> +	OVL_ADAPTOR_DISP_PADDING7,
>   	OVL_ADAPTOR_MERGE0,
>   	OVL_ADAPTOR_MERGE1,
>   	OVL_ADAPTOR_MERGE2,
> @@ -63,6 +72,7 @@ struct mtk_disp_ovl_adaptor {
> 
>   static const char * const private_comp_stem[OVL_ADAPTOR_TYPE_NUM] = {
>   	[OVL_ADAPTOR_TYPE_RDMA]		= "vdo1-rdma",
> +	[OVL_ADAPTOR_TYPE_PADDING]	= "vdo1-padding",
>   	[OVL_ADAPTOR_TYPE_MERGE]	= "merge",
>   	[OVL_ADAPTOR_TYPE_ETHDR]	= "ethdr",
>   };
> @@ -76,6 +86,14 @@ static const struct ovl_adaptor_comp_match comp_matches[OVL_ADAPTOR_ID_MAX] = {
>   	[OVL_ADAPTOR_MDP_RDMA5] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA5, 5 },
>   	[OVL_ADAPTOR_MDP_RDMA6] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA6, 6 },
>   	[OVL_ADAPTOR_MDP_RDMA7] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA7, 7 },
> +	[OVL_ADAPTOR_DISP_PADDING0] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING0, 0 },
> +	[OVL_ADAPTOR_DISP_PADDING1] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING1, 1 },
> +	[OVL_ADAPTOR_DISP_PADDING2] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING2, 2 },
> +	[OVL_ADAPTOR_DISP_PADDING3] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING3, 3 },
> +	[OVL_ADAPTOR_DISP_PADDING4] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING4, 4 },
> +	[OVL_ADAPTOR_DISP_PADDING5] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING5, 5 },
> +	[OVL_ADAPTOR_DISP_PADDING6] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING6, 6 },
> +	[OVL_ADAPTOR_DISP_PADDING7] = { OVL_ADAPTOR_TYPE_PADDING, DDP_COMPONENT_DISP_PADDING7, 7 },
>   	[OVL_ADAPTOR_MERGE0] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE1, 1 },
>   	[OVL_ADAPTOR_MERGE1] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE2, 2 },
>   	[OVL_ADAPTOR_MERGE2] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE3, 3 },
> @@ -92,6 +110,8 @@ void mtk_ovl_adaptor_layer_config(struct device *dev, unsigned int idx,
>   	struct mtk_mdp_rdma_cfg rdma_config = {0};
>   	struct device *rdma_l;
>   	struct device *rdma_r;
> +	struct device *padding_l;
> +	struct device *padding_r;
>   	struct device *merge;
>   	struct device *ethdr;
>   	const struct drm_format_info *fmt_info = drm_format_info(pending->format);
> @@ -108,6 +128,8 @@ void mtk_ovl_adaptor_layer_config(struct device *dev, unsigned int idx,
> 
>   	rdma_l = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_MDP_RDMA0 + 2 * idx];
>   	rdma_r = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_MDP_RDMA0 + 2 * idx + 1];
> +	padding_l = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_DISP_PADDING0 + 2 * idx];
> +	padding_r = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_DISP_PADDING0 + 2 * idx + 1];
>   	merge = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_MERGE0 + idx];
>   	ethdr = ovl_adaptor->ovl_adaptor_comp[OVL_ADAPTOR_ETHDR0];
> 
> @@ -143,10 +165,15 @@ void mtk_ovl_adaptor_layer_config(struct device *dev, unsigned int idx,
>   	rdma_config.color_encoding = pending->color_encoding;
>   	mtk_mdp_rdma_config(rdma_l, &rdma_config, cmdq_pkt);
> 
> +	if (padding_l)
> +		mtk_disp_padding_config(padding_l, cmdq_pkt);
> +
>   	if (use_dual_pipe) {
>   		rdma_config.x_left = l_w;
>   		rdma_config.width = r_w;
>   		mtk_mdp_rdma_config(rdma_r, &rdma_config, cmdq_pkt);
> +		if (padding_r)
> +			mtk_disp_padding_config(padding_r, cmdq_pkt);
>   	}
> 
>   	mtk_merge_start_cmdq(merge, cmdq_pkt);
> @@ -206,8 +233,10 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>   		comp = ovl_adaptor->ovl_adaptor_comp[i];
>   		if (!comp)
>   			continue;
> -		if (i < OVL_ADAPTOR_MERGE0)
> +		if (i < OVL_ADAPTOR_DISP_PADDING0)
>   			ret = mtk_mdp_rdma_clk_enable(comp);
> +		else if (i < OVL_ADAPTOR_MERGE0)
> +			ret = mtk_disp_padding_clk_enable(comp);
>   		else if (i < OVL_ADAPTOR_ETHDR0)
>   			ret = mtk_merge_clk_enable(comp);
>   		else
> @@ -225,8 +254,10 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>   		comp = ovl_adaptor->ovl_adaptor_comp[i];
>   		if (!comp)
>   			continue;
> -		if (i < OVL_ADAPTOR_MERGE0)
> +		if (i < OVL_ADAPTOR_DISP_PADDING0)
>   			mtk_mdp_rdma_clk_disable(comp);
> +		else if (i < OVL_ADAPTOR_MERGE0)
> +			mtk_disp_padding_clk_disable(comp);
>   		else if (i < OVL_ADAPTOR_ETHDR0)
>   			mtk_merge_clk_disable(comp);
>   		else
> @@ -255,9 +286,12 @@ void mtk_ovl_adaptor_clk_disable(struct device *dev)
>   		comp = ovl_adaptor->ovl_adaptor_comp[i];
>   		if (!comp)
>   			continue;
> -		if (i < OVL_ADAPTOR_MERGE0) {
> +		if (i < OVL_ADAPTOR_DISP_PADDING0) {

Now we're counting three branches. I'd say that a switch() would be a better
fit at this point.

>   			mtk_mdp_rdma_clk_disable(comp);
>   			pm_runtime_put(comp);
> +		} else if (i < OVL_ADAPTOR_MERGE0) {
> +			mtk_disp_padding_clk_disable(comp);
> +			pm_runtime_put(comp);
>   		} else if (i < OVL_ADAPTOR_ETHDR0) {
>   			mtk_merge_clk_disable(comp);
>   		} else {
> @@ -389,6 +423,9 @@ static const struct of_device_id mtk_ovl_adaptor_comp_dt_ids[] = {
>   	{
>   		.compatible = "mediatek,mt8188-vdo1-rdma",
>   		.data = (void *)OVL_ADAPTOR_TYPE_RDMA,
> +	}, {
> +		.compatible = "mediatek,mt8188-vdo1-padding",
> +		.data = (void *)OVL_ADAPTOR_TYPE_PADDING,
>   	}, {
>   		.compatible = "mediatek,mt8188-disp-merge",
>   		.data = (void *)OVL_ADAPTOR_TYPE_MERGE,
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_padding.c b/drivers/gpu/drm/mediatek/mtk_disp_padding.c
> new file mode 100644
> index 000000000000..5722aa57d628
> --- /dev/null
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_padding.c
> @@ -0,0 +1,134 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2022 MediaTek Inc.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/component.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/of_irq.h>

I don't see any interrupt parsing action here, why are you including of_irq.h?

> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/soc/mediatek/mtk-cmdq.h>
> +
> +#include "mtk_disp_drv.h"
> +#include "mtk_drm_crtc.h"
> +#include "mtk_drm_ddp_comp.h"
> +
> +/*

For kerneldoc, this should be:

/**

> + * struct mtk_disp_padding - DISP_RDMA driver structure

Also, this is not the DISP_RDMA driver structure

> + * @data: local driver data

...and there's no @data member, plus, you're not documenting other members.

> + */
> +struct mtk_disp_padding {
> +	struct clk		*clk;
> +	void __iomem		*regs;
> +	struct cmdq_client_reg	cmdq_reg;
> +};
> +
> +static int mtk_disp_padding_bind(struct device *dev, struct device *master,
> +				 void *data)
> +{
> +	return 0;
> +}
> +
> +static void mtk_disp_padding_unbind(struct device *dev, struct device *master,
> +				    void *data)
> +{
> +}
> +
> +static const struct component_ops mtk_disp_padding_component_ops = {
> +	.bind	= mtk_disp_padding_bind,
> +	.unbind = mtk_disp_padding_unbind,
> +};
> +
> +static int mtk_disp_padding_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct mtk_disp_padding *priv;
> +	struct resource *res;
> +	int ret;
> +
> +	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	priv->clk = devm_clk_get(dev, NULL);
> +	if (IS_ERR(priv->clk)) {
> +		dev_err(dev, "failed to get clk\n");
> +		return PTR_ERR(priv->clk);
> +	}
> +
> +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	priv->regs = devm_ioremap_resource(dev, res);

priv->regs = devm_platform_get_and_ioremap_resource(pdev, 0, res);

> +	if (IS_ERR(priv->regs)) {
> +		dev_err(dev, "failed to do ioremap\n");
> +		return PTR_ERR(priv->regs);
> +	}
> +
> +#if IS_REACHABLE(CONFIG_MTK_CMDQ)
> +	ret = cmdq_dev_get_client_reg(dev, &priv->cmdq_reg, 0);
> +	if (ret) {
> +		dev_err(dev, "failed to get gce client reg\n");
> +		return ret;
> +	}
> +#endif
> +
> +	platform_set_drvdata(pdev, priv);
> +
> +	pm_runtime_enable(dev);

	ret = devm_pm_runtime_enable(dev);
	if (ret)
		return ret;

> +
> +	ret = component_add(dev, &mtk_disp_padding_component_ops);
> +	if (ret) {
> +		pm_runtime_disable(dev);
> +		dev_err(dev, "failed to add component: %d\n", ret);

	return dev_err_probe( .... )

> +	}
> +
> +	return ret;

return 0;

> +}
> +
> +static int mtk_disp_padding_remove(struct platform_device *pdev)
> +{
> +	component_del(&pdev->dev, &mtk_disp_padding_component_ops);
> +	pm_runtime_disable(&pdev->dev);

If you use devm_pm_runtime_enable, you don't have to call pm_runtime_disable here.

> +	return 0;
> +}
> +
> +static const struct of_device_id mtk_disp_padding_driver_dt_match[] = {
> +	{ .compatible = "mediatek,mt8188-vdo1-padding" },
> +	{},

	{ /* sentinel */ }
}

> +};
> +MODULE_DEVICE_TABLE(of, mtk_disp_padding_driver_dt_match);
> +
> +struct platform_driver mtk_disp_padding_driver = {
> +	.probe		= mtk_disp_padding_probe,
> +	.remove		= mtk_disp_padding_remove,
> +	.driver		= {
> +		.name	= "mediatek-disp-padding",
> +		.owner	= THIS_MODULE,
> +		.of_match_table = mtk_disp_padding_driver_dt_match,
> +	},
> +};
> +
> +int mtk_disp_padding_clk_enable(struct device *dev)
> +{
> +	struct mtk_disp_padding *padding = dev_get_drvdata(dev);
> +
> +	return clk_prepare_enable(padding->clk);
> +}
> +
> +void mtk_disp_padding_clk_disable(struct device *dev)
> +{
> +	struct mtk_disp_padding *padding = dev_get_drvdata(dev);
> +
> +	clk_disable_unprepare(padding->clk);
> +}
> +
> +void mtk_disp_padding_config(struct device *dev, struct cmdq_pkt *cmdq_pkt)
> +{
> +	struct mtk_disp_padding *padding = dev_get_drvdata(dev);
> +
> +	// bypass padding

C-style comments please.

> +	mtk_ddp_write_mask(cmdq_pkt,
> +			   0b11, &padding->cmdq_reg, padding->regs, 0, 0b11);

Please add definitions and use GENMASK().

> +}

Move those functions before the probe function please.

Regards,
Angelo
Chun-Kuang Hu June 9, 2023, 1:26 a.m. UTC | #3
Hi, Hsiao-chien:

Hsiao Chien Sung <shawn.sung@mediatek.com> 於 2023年6月7日 週三 下午2:11寫道:
>
> - Modify MUTEX and component preparation logic for better compatibility
> - Adjust display module probe sequence to avoid probe deferral
>
> Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_merge.c     |   3 +-
>  .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   | 100 ++++++++++--------
>  drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  28 ++++-
>  drivers/gpu/drm/mediatek/mtk_ethdr.c          |   1 +
>  drivers/gpu/drm/mediatek/mtk_mdp_rdma.c       |   1 +
>  5 files changed, 84 insertions(+), 49 deletions(-)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> index 6428b6203ffe..2a30e41c246f 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> @@ -104,7 +104,7 @@ void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
>         mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs,
>                       DISP_REG_MERGE_CTRL);
>
> -       if (priv->async_clk)
> +       if (!cmdq_pkt && priv->async_clk)

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>                 reset_control_reset(priv->reset_ctl);
>  }
>
> @@ -303,6 +303,7 @@ static int mtk_disp_merge_remove(struct platform_device *pdev)
>  }
>
>  static const struct of_device_id mtk_disp_merge_driver_dt_match[] = {
> +       { .compatible = "mediatek,mt8188-disp-merge", },

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>         { .compatible = "mediatek,mt8195-disp-merge", },
>         {},
>  };
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> index c0a38f5217ee..e1d8d4765af8 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> @@ -51,6 +51,7 @@ enum mtk_ovl_adaptor_comp_id {
>
>  struct ovl_adaptor_comp_match {
>         enum mtk_ovl_adaptor_comp_type type;
> +       enum mtk_ddp_comp_id comp_id;
>         int alias_id;
>  };
>
> @@ -67,19 +68,19 @@ static const char * const private_comp_stem[OVL_ADAPTOR_TYPE_NUM] = {
>  };
>
>  static const struct ovl_adaptor_comp_match comp_matches[OVL_ADAPTOR_ID_MAX] = {
> -       [OVL_ADAPTOR_MDP_RDMA0] = { OVL_ADAPTOR_TYPE_RDMA, 0 },
> -       [OVL_ADAPTOR_MDP_RDMA1] = { OVL_ADAPTOR_TYPE_RDMA, 1 },
> -       [OVL_ADAPTOR_MDP_RDMA2] = { OVL_ADAPTOR_TYPE_RDMA, 2 },
> -       [OVL_ADAPTOR_MDP_RDMA3] = { OVL_ADAPTOR_TYPE_RDMA, 3 },
> -       [OVL_ADAPTOR_MDP_RDMA4] = { OVL_ADAPTOR_TYPE_RDMA, 4 },
> -       [OVL_ADAPTOR_MDP_RDMA5] = { OVL_ADAPTOR_TYPE_RDMA, 5 },
> -       [OVL_ADAPTOR_MDP_RDMA6] = { OVL_ADAPTOR_TYPE_RDMA, 6 },
> -       [OVL_ADAPTOR_MDP_RDMA7] = { OVL_ADAPTOR_TYPE_RDMA, 7 },
> -       [OVL_ADAPTOR_MERGE0]    = { OVL_ADAPTOR_TYPE_MERGE, 1 },
> -       [OVL_ADAPTOR_MERGE1]    = { OVL_ADAPTOR_TYPE_MERGE, 2 },
> -       [OVL_ADAPTOR_MERGE2]    = { OVL_ADAPTOR_TYPE_MERGE, 3 },
> -       [OVL_ADAPTOR_MERGE3]    = { OVL_ADAPTOR_TYPE_MERGE, 4 },
> -       [OVL_ADAPTOR_ETHDR0]    = { OVL_ADAPTOR_TYPE_ETHDR, 0 },
> +       [OVL_ADAPTOR_MDP_RDMA0] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA0, 0 },
> +       [OVL_ADAPTOR_MDP_RDMA1] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA1, 1 },
> +       [OVL_ADAPTOR_MDP_RDMA2] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA2, 2 },
> +       [OVL_ADAPTOR_MDP_RDMA3] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA3, 3 },
> +       [OVL_ADAPTOR_MDP_RDMA4] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA4, 4 },
> +       [OVL_ADAPTOR_MDP_RDMA5] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA5, 5 },
> +       [OVL_ADAPTOR_MDP_RDMA6] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA6, 6 },
> +       [OVL_ADAPTOR_MDP_RDMA7] = { OVL_ADAPTOR_TYPE_RDMA, DDP_COMPONENT_MDP_RDMA7, 7 },
> +       [OVL_ADAPTOR_MERGE0] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE1, 1 },
> +       [OVL_ADAPTOR_MERGE1] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE2, 2 },
> +       [OVL_ADAPTOR_MERGE2] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE3, 3 },
> +       [OVL_ADAPTOR_MERGE3] = { OVL_ADAPTOR_TYPE_MERGE, DDP_COMPONENT_MERGE4, 4 },
> +       [OVL_ADAPTOR_ETHDR0] = { OVL_ADAPTOR_TYPE_ETHDR, DDP_COMPONENT_ETHDR_MIXER, 0 },
>  };
>
>  void mtk_ovl_adaptor_layer_config(struct device *dev, unsigned int idx,
> @@ -192,6 +193,8 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>
>         for (i = 0; i < OVL_ADAPTOR_MERGE0; i++) {
>                 comp = ovl_adaptor->ovl_adaptor_comp[i];
> +               if (!comp)
> +                       continue;
>                 ret = pm_runtime_get_sync(comp);
>                 if (ret < 0) {
>                         dev_err(dev, "Failed to enable power domain %d, err %d\n", i, ret);
> @@ -201,7 +204,8 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>
>         for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
>                 comp = ovl_adaptor->ovl_adaptor_comp[i];
> -
> +               if (!comp)
> +                       continue;
>                 if (i < OVL_ADAPTOR_MERGE0)
>                         ret = mtk_mdp_rdma_clk_enable(comp);
>                 else if (i < OVL_ADAPTOR_ETHDR0)
> @@ -219,6 +223,8 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>  clk_err:
>         while (--i >= 0) {
>                 comp = ovl_adaptor->ovl_adaptor_comp[i];
> +               if (!comp)
> +                       continue;
>                 if (i < OVL_ADAPTOR_MERGE0)
>                         mtk_mdp_rdma_clk_disable(comp);
>                 else if (i < OVL_ADAPTOR_ETHDR0)
> @@ -229,8 +235,12 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
>         i = OVL_ADAPTOR_MERGE0;
>
>  pwr_err:
> -       while (--i >= 0)
> -               pm_runtime_put(ovl_adaptor->ovl_adaptor_comp[i]);
> +       while (--i >= 0) {
> +               comp = ovl_adaptor->ovl_adaptor_comp[i];
> +               if (!comp)
> +                       continue;
> +               pm_runtime_put(comp);
> +       }
>
>         return ret;
>  }
> @@ -243,7 +253,8 @@ void mtk_ovl_adaptor_clk_disable(struct device *dev)
>
>         for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
>                 comp = ovl_adaptor->ovl_adaptor_comp[i];
> -
> +               if (!comp)
> +                       continue;
>                 if (i < OVL_ADAPTOR_MERGE0) {
>                         mtk_mdp_rdma_clk_disable(comp);
>                         pm_runtime_put(comp);
> @@ -313,36 +324,26 @@ size_t mtk_ovl_adaptor_get_num_formats(struct device *dev)
>
>  void mtk_ovl_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex)
>  {
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA0);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA1);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA2);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA3);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA4);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA5);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA6);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA7);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE1);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE2);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE3);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE4);
> -       mtk_mutex_add_comp(mutex, DDP_COMPONENT_ETHDR_MIXER);
> +       struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
> +       int i;
> +
> +       for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
> +               if (!ovl_adaptor->ovl_adaptor_comp[i])
> +                       continue;
> +               mtk_mutex_add_comp(mutex, comp_matches[i].comp_id);
> +       }
>  }
>
>  void mtk_ovl_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex)
>  {
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA0);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA1);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA2);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA3);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA4);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA5);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA6);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA7);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE1);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE2);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE3);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE4);
> -       mtk_mutex_remove_comp(mutex, DDP_COMPONENT_ETHDR_MIXER);
> +       struct mtk_disp_ovl_adaptor *ovl_adaptor = dev_get_drvdata(dev);
> +       int i;
> +
> +       for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
> +               if (!ovl_adaptor->ovl_adaptor_comp[i])
> +                       continue;
> +               mtk_mutex_remove_comp(mutex, comp_matches[i].comp_id);
> +       }
>  }
>
>  void mtk_ovl_adaptor_connect(struct device *dev, struct device *mmsys_dev, unsigned int next)
> @@ -386,6 +387,15 @@ static int ovl_adaptor_comp_get_id(struct device *dev, struct device_node *node,
>
>  static const struct of_device_id mtk_ovl_adaptor_comp_dt_ids[] = {
>         {
> +               .compatible = "mediatek,mt8188-vdo1-rdma",
> +               .data = (void *)OVL_ADAPTOR_TYPE_RDMA,
> +       }, {
> +               .compatible = "mediatek,mt8188-disp-merge",
> +               .data = (void *)OVL_ADAPTOR_TYPE_MERGE,
> +       }, {
> +               .compatible = "mediatek,mt8188-disp-ethdr",
> +               .data = (void *)OVL_ADAPTOR_TYPE_ETHDR,
> +       }, {

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>                 .compatible = "mediatek,mt8195-vdo1-rdma",
>                 .data = (void *)OVL_ADAPTOR_TYPE_RDMA,
>         }, {
> @@ -466,6 +476,9 @@ static int mtk_disp_ovl_adaptor_comp_bind(struct device *dev, struct device *mas
>  static void mtk_disp_ovl_adaptor_comp_unbind(struct device *dev, struct device *master,
>                                              void *data)
>  {
> +       struct mtk_disp_ovl_adaptor *priv = dev_get_drvdata(dev);
> +
> +       priv->children_bound = false;
>  }
>
>  static const struct component_ops mtk_disp_ovl_adaptor_comp_ops = {
> @@ -483,6 +496,7 @@ static int mtk_disp_ovl_adaptor_master_bind(struct device *dev)
>                 return dev_err_probe(dev, ret, "component_bind_all failed!\n");
>
>         priv->children_bound = true;
> +

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>         return 0;
>  }
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index 6dcb4ba2466c..87dadd129c22 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -188,6 +188,12 @@ static const unsigned int mt8188_mtk_ddp_main[] = {
>         DDP_COMPONENT_DP_INTF0,
>  };
>
> +static const unsigned int mt8188_mtk_ddp_ext[] = {
> +       DDP_COMPONENT_DRM_OVL_ADAPTOR,
> +       DDP_COMPONENT_MERGE5,
> +       DDP_COMPONENT_DP_INTF1,
> +};
> +
>  static const unsigned int mt8192_mtk_ddp_main[] = {
>         DDP_COMPONENT_OVL0,
>         DDP_COMPONENT_OVL_2L0,
> @@ -287,6 +293,14 @@ static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
>  static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data = {
>         .main_path = mt8188_mtk_ddp_main,
>         .main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> +       .mmsys_dev_num = 2,
> +};
> +
> +static const struct mtk_mmsys_driver_data mt8188_vdosys1_driver_data = {
> +       .ext_path = mt8188_mtk_ddp_ext,
> +       .ext_len = ARRAY_SIZE(mt8188_mtk_ddp_ext),
> +       .mmsys_id = 1,
> +       .mmsys_dev_num = 2,

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>  };
>
>  static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = {
> @@ -327,6 +341,8 @@ static const struct of_device_id mtk_drm_of_ids[] = {
>           .data = &mt8186_mmsys_driver_data},
>         { .compatible = "mediatek,mt8188-vdosys0",
>           .data = &mt8188_vdosys0_driver_data},
> +       { .compatible = "mediatek,mt8188-vdosys1",
> +         .data = &mt8188_vdosys1_driver_data},

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>         { .compatible = "mediatek,mt8192-mmsys",
>           .data = &mt8192_mmsys_driver_data},
>         { .compatible = "mediatek,mt8195-mmsys",
> @@ -682,6 +698,8 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
>           .data = (void *)MTK_DISP_GAMMA, },
>         { .compatible = "mediatek,mt8183-disp-gamma",
>           .data = (void *)MTK_DISP_GAMMA, },
> +       { .compatible = "mediatek,mt8188-disp-merge",
> +         .data = (void *)MTK_DISP_MERGE },

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>         { .compatible = "mediatek,mt8195-disp-merge",
>           .data = (void *)MTK_DISP_MERGE },
>         { .compatible = "mediatek,mt2701-disp-mutex",
> @@ -965,15 +983,15 @@ static struct platform_driver * const mtk_drm_drivers[] = {
>         &mtk_disp_ccorr_driver,
>         &mtk_disp_color_driver,
>         &mtk_disp_gamma_driver,
> +       &mtk_disp_rdma_driver,
> +       &mtk_mdp_rdma_driver,
>         &mtk_disp_merge_driver,
> -       &mtk_disp_ovl_adaptor_driver,
> +       &mtk_ethdr_driver,
>         &mtk_disp_ovl_driver,
> -       &mtk_disp_rdma_driver,
> +       &mtk_disp_ovl_adaptor_driver,
> +       &mtk_dsi_driver,
>         &mtk_dpi_driver,
>         &mtk_drm_platform_driver,
> -       &mtk_dsi_driver,
> -       &mtk_ethdr_driver,
> -       &mtk_mdp_rdma_driver,

Why change the order?

>  };
>
>  static int __init mtk_drm_init(void)
> diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> index 73dc4da3ba3b..b5a6b67f2db9 100644
> --- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
> +++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> @@ -353,6 +353,7 @@ static int mtk_ethdr_remove(struct platform_device *pdev)
>  }
>
>  static const struct of_device_id mtk_ethdr_driver_dt_match[] = {
> +       { .compatible = "mediatek,mt8188-disp-ethdr"},

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

>         { .compatible = "mediatek,mt8195-disp-ethdr"},
>         {},
>  };
> diff --git a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> index e06db6e56b5f..06d5c9abb515 100644
> --- a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> @@ -323,6 +323,7 @@ static int mtk_mdp_rdma_remove(struct platform_device *pdev)
>  }
>
>  static const struct of_device_id mtk_mdp_rdma_driver_dt_match[] = {
> +       { .compatible = "mediatek,mt8188-vdo1-rdma", },

This is related to neither preparation logic nor probe sequence,
separate this to another patch.

Regards,
Chun-Kuang.

>         { .compatible = "mediatek,mt8195-vdo1-rdma", },
>         {},
>  };
> --
> 2.18.0
>
CK Hu (胡俊光) July 6, 2023, 6:16 a.m. UTC | #4
Hi, Hsiao chien:

On Wed, 2023-06-07 at 14:11 +0800, Hsiao Chien Sung wrote:
> - Modify MUTEX and component preparation logic for better
> compatibility
> - Adjust display module probe sequence to avoid probe deferral

Probe deferral is normal in Linux driver, why to avoid it?
Is new sequence only optimized for mt8188? If so, I think it's not
necessary to do this only for one SoC.

Regards,
CK

> 
> Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_merge.c     |   3 +-
>  .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c   | 100 ++++++++++----
> ----
>  drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  28 ++++-
>  drivers/gpu/drm/mediatek/mtk_ethdr.c          |   1 +
>  drivers/gpu/drm/mediatek/mtk_mdp_rdma.c       |   1 +
>  5 files changed, 84 insertions(+), 49 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> index 6428b6203ffe..2a30e41c246f 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> @@ -104,7 +104,7 @@ void mtk_merge_stop_cmdq(struct device *dev,
> struct cmdq_pkt *cmdq_pkt)
>  	mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs,
>  		      DISP_REG_MERGE_CTRL);
> 
> -	if (priv->async_clk)
> +	if (!cmdq_pkt && priv->async_clk)
>  		reset_control_reset(priv->reset_ctl);
>  }
> 
> @@ -303,6 +303,7 @@ static int mtk_disp_merge_remove(struct
> platform_device *pdev)
>  }
> 
>  static const struct of_device_id mtk_disp_merge_driver_dt_match[] =
> {
> +	{ .compatible = "mediatek,mt8188-disp-merge", },
>  	{ .compatible = "mediatek,mt8195-disp-merge", },
>  	{},
>  };
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> index c0a38f5217ee..e1d8d4765af8 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c
> @@ -51,6 +51,7 @@ enum mtk_ovl_adaptor_comp_id {
> 
>  struct ovl_adaptor_comp_match {
>  	enum mtk_ovl_adaptor_comp_type type;
> +	enum mtk_ddp_comp_id comp_id;
>  	int alias_id;
>  };
> 
> @@ -67,19 +68,19 @@ static const char * const
> private_comp_stem[OVL_ADAPTOR_TYPE_NUM] = {
>  };
> 
>  static const struct ovl_adaptor_comp_match
> comp_matches[OVL_ADAPTOR_ID_MAX] = {
> -	[OVL_ADAPTOR_MDP_RDMA0]	= { OVL_ADAPTOR_TYPE_RDMA, 0 },
> -	[OVL_ADAPTOR_MDP_RDMA1]	= { OVL_ADAPTOR_TYPE_RDMA, 1 },
> -	[OVL_ADAPTOR_MDP_RDMA2]	= { OVL_ADAPTOR_TYPE_RDMA, 2 },
> -	[OVL_ADAPTOR_MDP_RDMA3]	= { OVL_ADAPTOR_TYPE_RDMA, 3 },
> -	[OVL_ADAPTOR_MDP_RDMA4]	= { OVL_ADAPTOR_TYPE_RDMA, 4 },
> -	[OVL_ADAPTOR_MDP_RDMA5]	= { OVL_ADAPTOR_TYPE_RDMA, 5 },
> -	[OVL_ADAPTOR_MDP_RDMA6]	= { OVL_ADAPTOR_TYPE_RDMA, 6 },
> -	[OVL_ADAPTOR_MDP_RDMA7]	= { OVL_ADAPTOR_TYPE_RDMA, 7 },
> -	[OVL_ADAPTOR_MERGE0]	= { OVL_ADAPTOR_TYPE_MERGE, 1 },
> -	[OVL_ADAPTOR_MERGE1]	= { OVL_ADAPTOR_TYPE_MERGE, 2 },
> -	[OVL_ADAPTOR_MERGE2]	= { OVL_ADAPTOR_TYPE_MERGE, 3 },
> -	[OVL_ADAPTOR_MERGE3]	= { OVL_ADAPTOR_TYPE_MERGE, 4 },
> -	[OVL_ADAPTOR_ETHDR0]	= { OVL_ADAPTOR_TYPE_ETHDR, 0 },
> +	[OVL_ADAPTOR_MDP_RDMA0] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA0, 0 },
> +	[OVL_ADAPTOR_MDP_RDMA1] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA1, 1 },
> +	[OVL_ADAPTOR_MDP_RDMA2] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA2, 2 },
> +	[OVL_ADAPTOR_MDP_RDMA3] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA3, 3 },
> +	[OVL_ADAPTOR_MDP_RDMA4] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA4, 4 },
> +	[OVL_ADAPTOR_MDP_RDMA5] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA5, 5 },
> +	[OVL_ADAPTOR_MDP_RDMA6] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA6, 6 },
> +	[OVL_ADAPTOR_MDP_RDMA7] = { OVL_ADAPTOR_TYPE_RDMA,
> DDP_COMPONENT_MDP_RDMA7, 7 },
> +	[OVL_ADAPTOR_MERGE0] = { OVL_ADAPTOR_TYPE_MERGE,
> DDP_COMPONENT_MERGE1, 1 },
> +	[OVL_ADAPTOR_MERGE1] = { OVL_ADAPTOR_TYPE_MERGE,
> DDP_COMPONENT_MERGE2, 2 },
> +	[OVL_ADAPTOR_MERGE2] = { OVL_ADAPTOR_TYPE_MERGE,
> DDP_COMPONENT_MERGE3, 3 },
> +	[OVL_ADAPTOR_MERGE3] = { OVL_ADAPTOR_TYPE_MERGE,
> DDP_COMPONENT_MERGE4, 4 },
> +	[OVL_ADAPTOR_ETHDR0] = { OVL_ADAPTOR_TYPE_ETHDR,
> DDP_COMPONENT_ETHDR_MIXER, 0 },
>  };
> 
>  void mtk_ovl_adaptor_layer_config(struct device *dev, unsigned int
> idx,
> @@ -192,6 +193,8 @@ int mtk_ovl_adaptor_clk_enable(struct device
> *dev)
> 
>  	for (i = 0; i < OVL_ADAPTOR_MERGE0; i++) {
>  		comp = ovl_adaptor->ovl_adaptor_comp[i];
> +		if (!comp)
> +			continue;
>  		ret = pm_runtime_get_sync(comp);
>  		if (ret < 0) {
>  			dev_err(dev, "Failed to enable power domain %d,
> err %d\n", i, ret);
> @@ -201,7 +204,8 @@ int mtk_ovl_adaptor_clk_enable(struct device
> *dev)
> 
>  	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
>  		comp = ovl_adaptor->ovl_adaptor_comp[i];
> -
> +		if (!comp)
> +			continue;
>  		if (i < OVL_ADAPTOR_MERGE0)
>  			ret = mtk_mdp_rdma_clk_enable(comp);
>  		else if (i < OVL_ADAPTOR_ETHDR0)
> @@ -219,6 +223,8 @@ int mtk_ovl_adaptor_clk_enable(struct device
> *dev)
>  clk_err:
>  	while (--i >= 0) {
>  		comp = ovl_adaptor->ovl_adaptor_comp[i];
> +		if (!comp)
> +			continue;
>  		if (i < OVL_ADAPTOR_MERGE0)
>  			mtk_mdp_rdma_clk_disable(comp);
>  		else if (i < OVL_ADAPTOR_ETHDR0)
> @@ -229,8 +235,12 @@ int mtk_ovl_adaptor_clk_enable(struct device
> *dev)
>  	i = OVL_ADAPTOR_MERGE0;
> 
>  pwr_err:
> -	while (--i >= 0)
> -		pm_runtime_put(ovl_adaptor->ovl_adaptor_comp[i]);
> +	while (--i >= 0) {
> +		comp = ovl_adaptor->ovl_adaptor_comp[i];
> +		if (!comp)
> +			continue;
> +		pm_runtime_put(comp);
> +	}
> 
>  	return ret;
>  }
> @@ -243,7 +253,8 @@ void mtk_ovl_adaptor_clk_disable(struct device
> *dev)
> 
>  	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
>  		comp = ovl_adaptor->ovl_adaptor_comp[i];
> -
> +		if (!comp)
> +			continue;
>  		if (i < OVL_ADAPTOR_MERGE0) {
>  			mtk_mdp_rdma_clk_disable(comp);
>  			pm_runtime_put(comp);
> @@ -313,36 +324,26 @@ size_t mtk_ovl_adaptor_get_num_formats(struct
> device *dev)
> 
>  void mtk_ovl_adaptor_add_comp(struct device *dev, struct mtk_mutex
> *mutex)
>  {
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA0);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA1);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA2);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA3);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA4);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA5);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA6);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MDP_RDMA7);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE1);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE2);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE3);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_MERGE4);
> -	mtk_mutex_add_comp(mutex, DDP_COMPONENT_ETHDR_MIXER);
> +	struct mtk_disp_ovl_adaptor *ovl_adaptor =
> dev_get_drvdata(dev);
> +	int i;
> +
> +	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
> +		if (!ovl_adaptor->ovl_adaptor_comp[i])
> +			continue;
> +		mtk_mutex_add_comp(mutex, comp_matches[i].comp_id);
> +	}
>  }
> 
>  void mtk_ovl_adaptor_remove_comp(struct device *dev, struct
> mtk_mutex *mutex)
>  {
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA0);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA1);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA2);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA3);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA4);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA5);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA6);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MDP_RDMA7);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE1);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE2);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE3);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_MERGE4);
> -	mtk_mutex_remove_comp(mutex, DDP_COMPONENT_ETHDR_MIXER);
> +	struct mtk_disp_ovl_adaptor *ovl_adaptor =
> dev_get_drvdata(dev);
> +	int i;
> +
> +	for (i = 0; i < OVL_ADAPTOR_ID_MAX; i++) {
> +		if (!ovl_adaptor->ovl_adaptor_comp[i])
> +			continue;
> +		mtk_mutex_remove_comp(mutex, comp_matches[i].comp_id);
> +	}
>  }
> 
>  void mtk_ovl_adaptor_connect(struct device *dev, struct device
> *mmsys_dev, unsigned int next)
> @@ -386,6 +387,15 @@ static int ovl_adaptor_comp_get_id(struct device
> *dev, struct device_node *node,
> 
>  static const struct of_device_id mtk_ovl_adaptor_comp_dt_ids[] = {
>  	{
> +		.compatible = "mediatek,mt8188-vdo1-rdma",
> +		.data = (void *)OVL_ADAPTOR_TYPE_RDMA,
> +	}, {
> +		.compatible = "mediatek,mt8188-disp-merge",
> +		.data = (void *)OVL_ADAPTOR_TYPE_MERGE,
> +	}, {
> +		.compatible = "mediatek,mt8188-disp-ethdr",
> +		.data = (void *)OVL_ADAPTOR_TYPE_ETHDR,
> +	}, {
>  		.compatible = "mediatek,mt8195-vdo1-rdma",
>  		.data = (void *)OVL_ADAPTOR_TYPE_RDMA,
>  	}, {
> @@ -466,6 +476,9 @@ static int mtk_disp_ovl_adaptor_comp_bind(struct
> device *dev, struct device *mas
>  static void mtk_disp_ovl_adaptor_comp_unbind(struct device *dev,
> struct device *master,
>  					     void *data)
>  {
> +	struct mtk_disp_ovl_adaptor *priv = dev_get_drvdata(dev);
> +
> +	priv->children_bound = false;
>  }
> 
>  static const struct component_ops mtk_disp_ovl_adaptor_comp_ops = {
> @@ -483,6 +496,7 @@ static int
> mtk_disp_ovl_adaptor_master_bind(struct device *dev)
>  		return dev_err_probe(dev, ret, "component_bind_all
> failed!\n");
> 
>  	priv->children_bound = true;
> +
>  	return 0;
>  }
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index 6dcb4ba2466c..87dadd129c22 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -188,6 +188,12 @@ static const unsigned int mt8188_mtk_ddp_main[]
> = {
>  	DDP_COMPONENT_DP_INTF0,
>  };
> 
> +static const unsigned int mt8188_mtk_ddp_ext[] = {
> +	DDP_COMPONENT_DRM_OVL_ADAPTOR,
> +	DDP_COMPONENT_MERGE5,
> +	DDP_COMPONENT_DP_INTF1,
> +};
> +
>  static const unsigned int mt8192_mtk_ddp_main[] = {
>  	DDP_COMPONENT_OVL0,
>  	DDP_COMPONENT_OVL_2L0,
> @@ -287,6 +293,14 @@ static const struct mtk_mmsys_driver_data
> mt8186_mmsys_driver_data = {
>  static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data
> = {
>  	.main_path = mt8188_mtk_ddp_main,
>  	.main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> +	.mmsys_dev_num = 2,
> +};
> +
> +static const struct mtk_mmsys_driver_data mt8188_vdosys1_driver_data
> = {
> +	.ext_path = mt8188_mtk_ddp_ext,
> +	.ext_len = ARRAY_SIZE(mt8188_mtk_ddp_ext),
> +	.mmsys_id = 1,
> +	.mmsys_dev_num = 2,
>  };
> 
>  static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data =
> {
> @@ -327,6 +341,8 @@ static const struct of_device_id mtk_drm_of_ids[]
> = {
>  	  .data = &mt8186_mmsys_driver_data},
>  	{ .compatible = "mediatek,mt8188-vdosys0",
>  	  .data = &mt8188_vdosys0_driver_data},
> +	{ .compatible = "mediatek,mt8188-vdosys1",
> +	  .data = &mt8188_vdosys1_driver_data},
>  	{ .compatible = "mediatek,mt8192-mmsys",
>  	  .data = &mt8192_mmsys_driver_data},
>  	{ .compatible = "mediatek,mt8195-mmsys",
> @@ -682,6 +698,8 @@ static const struct of_device_id
> mtk_ddp_comp_dt_ids[] = {
>  	  .data = (void *)MTK_DISP_GAMMA, },
>  	{ .compatible = "mediatek,mt8183-disp-gamma",
>  	  .data = (void *)MTK_DISP_GAMMA, },
> +	{ .compatible = "mediatek,mt8188-disp-merge",
> +	  .data = (void *)MTK_DISP_MERGE },
>  	{ .compatible = "mediatek,mt8195-disp-merge",
>  	  .data = (void *)MTK_DISP_MERGE },
>  	{ .compatible = "mediatek,mt2701-disp-mutex",
> @@ -965,15 +983,15 @@ static struct platform_driver * const
> mtk_drm_drivers[] = {
>  	&mtk_disp_ccorr_driver,
>  	&mtk_disp_color_driver,
>  	&mtk_disp_gamma_driver,
> +	&mtk_disp_rdma_driver,
> +	&mtk_mdp_rdma_driver,
>  	&mtk_disp_merge_driver,
> -	&mtk_disp_ovl_adaptor_driver,
> +	&mtk_ethdr_driver,
>  	&mtk_disp_ovl_driver,
> -	&mtk_disp_rdma_driver,
> +	&mtk_disp_ovl_adaptor_driver,
> +	&mtk_dsi_driver,
>  	&mtk_dpi_driver,
>  	&mtk_drm_platform_driver,
> -	&mtk_dsi_driver,
> -	&mtk_ethdr_driver,
> -	&mtk_mdp_rdma_driver,
>  };
> 
>  static int __init mtk_drm_init(void)
> diff --git a/drivers/gpu/drm/mediatek/mtk_ethdr.c
> b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> index 73dc4da3ba3b..b5a6b67f2db9 100644
> --- a/drivers/gpu/drm/mediatek/mtk_ethdr.c
> +++ b/drivers/gpu/drm/mediatek/mtk_ethdr.c
> @@ -353,6 +353,7 @@ static int mtk_ethdr_remove(struct
> platform_device *pdev)
>  }
> 
>  static const struct of_device_id mtk_ethdr_driver_dt_match[] = {
> +	{ .compatible = "mediatek,mt8188-disp-ethdr"},
>  	{ .compatible = "mediatek,mt8195-disp-ethdr"},
>  	{},
>  };
> diff --git a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> index e06db6e56b5f..06d5c9abb515 100644
> --- a/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_mdp_rdma.c
> @@ -323,6 +323,7 @@ static int mtk_mdp_rdma_remove(struct
> platform_device *pdev)
>  }
> 
>  static const struct of_device_id mtk_mdp_rdma_driver_dt_match[] = {
> +	{ .compatible = "mediatek,mt8188-vdo1-rdma", },
>  	{ .compatible = "mediatek,mt8195-vdo1-rdma", },
>  	{},
>  };
> --
> 2.18.0
> 
>