@@ -54,6 +54,7 @@ struct ovl_adaptor_comp_match {
5454 enum mtk_ovl_adaptor_comp_type type ;
5555 enum mtk_ddp_comp_id comp_id ;
5656 int alias_id ;
57+ const struct mtk_ddp_comp_funcs * funcs ;
5758};
5859
5960struct mtk_disp_ovl_adaptor {
@@ -68,20 +69,35 @@ static const char * const private_comp_stem[OVL_ADAPTOR_TYPE_NUM] = {
6869 [OVL_ADAPTOR_TYPE_ETHDR ] = "ethdr" ,
6970};
7071
72+ static const struct mtk_ddp_comp_funcs ethdr = {
73+ .clk_enable = mtk_ethdr_clk_enable ,
74+ .clk_disable = mtk_ethdr_clk_disable ,
75+ };
76+
77+ static const struct mtk_ddp_comp_funcs merge = {
78+ .clk_enable = mtk_merge_clk_enable ,
79+ .clk_disable = mtk_merge_clk_disable ,
80+ };
81+
82+ static const struct mtk_ddp_comp_funcs rdma = {
83+ .clk_enable = mtk_mdp_rdma_clk_enable ,
84+ .clk_disable = mtk_mdp_rdma_clk_disable ,
85+ };
86+
7187static const struct ovl_adaptor_comp_match comp_matches [OVL_ADAPTOR_ID_MAX ] = {
72- [OVL_ADAPTOR_MDP_RDMA0 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA0 , 0 },
73- [OVL_ADAPTOR_MDP_RDMA1 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA1 , 1 },
74- [OVL_ADAPTOR_MDP_RDMA2 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA2 , 2 },
75- [OVL_ADAPTOR_MDP_RDMA3 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA3 , 3 },
76- [OVL_ADAPTOR_MDP_RDMA4 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA4 , 4 },
77- [OVL_ADAPTOR_MDP_RDMA5 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA5 , 5 },
78- [OVL_ADAPTOR_MDP_RDMA6 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA6 , 6 },
79- [OVL_ADAPTOR_MDP_RDMA7 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA7 , 7 },
80- [OVL_ADAPTOR_MERGE0 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE1 , 1 },
81- [OVL_ADAPTOR_MERGE1 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE2 , 2 },
82- [OVL_ADAPTOR_MERGE2 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE3 , 3 },
83- [OVL_ADAPTOR_MERGE3 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE4 , 4 },
84- [OVL_ADAPTOR_ETHDR0 ] = { OVL_ADAPTOR_TYPE_ETHDR , DDP_COMPONENT_ETHDR_MIXER , 0 },
88+ [OVL_ADAPTOR_MDP_RDMA0 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA0 , 0 , & rdma },
89+ [OVL_ADAPTOR_MDP_RDMA1 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA1 , 1 , & rdma },
90+ [OVL_ADAPTOR_MDP_RDMA2 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA2 , 2 , & rdma },
91+ [OVL_ADAPTOR_MDP_RDMA3 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA3 , 3 , & rdma },
92+ [OVL_ADAPTOR_MDP_RDMA4 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA4 , 4 , & rdma },
93+ [OVL_ADAPTOR_MDP_RDMA5 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA5 , 5 , & rdma },
94+ [OVL_ADAPTOR_MDP_RDMA6 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA6 , 6 , & rdma },
95+ [OVL_ADAPTOR_MDP_RDMA7 ] = { OVL_ADAPTOR_TYPE_MDP_RDMA , DDP_COMPONENT_MDP_RDMA7 , 7 , & rdma },
96+ [OVL_ADAPTOR_MERGE0 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE1 , 1 , & merge },
97+ [OVL_ADAPTOR_MERGE1 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE2 , 2 , & merge },
98+ [OVL_ADAPTOR_MERGE2 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE3 , 3 , & merge },
99+ [OVL_ADAPTOR_MERGE3 ] = { OVL_ADAPTOR_TYPE_MERGE , DDP_COMPONENT_MERGE4 , 4 , & merge },
100+ [OVL_ADAPTOR_ETHDR0 ] = { OVL_ADAPTOR_TYPE_ETHDR , DDP_COMPONENT_ETHDR_MIXER , 0 , & ethdr },
85101};
86102
87103void mtk_ovl_adaptor_layer_config (struct device * dev , unsigned int idx ,
@@ -197,40 +213,25 @@ int mtk_ovl_adaptor_clk_enable(struct device *dev)
197213 ret = pm_runtime_get_sync (comp );
198214 if (ret < 0 ) {
199215 dev_err (dev , "Failed to enable power domain %d, err %d\n" , i , ret );
200- goto pwr_err ;
216+ goto error ;
201217 }
202218 }
203219
204220 for (i = 0 ; i < OVL_ADAPTOR_ID_MAX ; i ++ ) {
205221 comp = ovl_adaptor -> ovl_adaptor_comp [i ];
206-
207- if (i < OVL_ADAPTOR_MERGE0 )
208- ret = mtk_mdp_rdma_clk_enable (comp );
209- else if (i < OVL_ADAPTOR_ETHDR0 )
210- ret = mtk_merge_clk_enable (comp );
211- else
212- ret = mtk_ethdr_clk_enable (comp );
222+ if (!comp || !comp_matches [i ].funcs -> clk_enable )
223+ continue ;
224+ ret = comp_matches [i ].funcs -> clk_enable (comp );
213225 if (ret ) {
214226 dev_err (dev , "Failed to enable clock %d, err %d\n" , i , ret );
215- goto clk_err ;
227+ while (-- i >= 0 )
228+ comp_matches [i ].funcs -> clk_disable (comp );
229+ i = OVL_ADAPTOR_MERGE0 ;
230+ goto error ;
216231 }
217232 }
218-
219- return ret ;
220-
221- clk_err :
222- while (-- i >= 0 ) {
223- comp = ovl_adaptor -> ovl_adaptor_comp [i ];
224- if (i < OVL_ADAPTOR_MERGE0 )
225- mtk_mdp_rdma_clk_disable (comp );
226- else if (i < OVL_ADAPTOR_ETHDR0 )
227- mtk_merge_clk_disable (comp );
228- else
229- mtk_ethdr_clk_disable (comp );
230- }
231- i = OVL_ADAPTOR_MERGE0 ;
232-
233- pwr_err :
233+ return 0 ;
234+ error :
234235 while (-- i >= 0 )
235236 pm_runtime_put (ovl_adaptor -> ovl_adaptor_comp [i ]);
236237
@@ -245,15 +246,11 @@ void mtk_ovl_adaptor_clk_disable(struct device *dev)
245246
246247 for (i = 0 ; i < OVL_ADAPTOR_ID_MAX ; i ++ ) {
247248 comp = ovl_adaptor -> ovl_adaptor_comp [i ];
248-
249- if (i < OVL_ADAPTOR_MERGE0 ) {
250- mtk_mdp_rdma_clk_disable (comp );
249+ if (!comp || !comp_matches [i ].funcs -> clk_disable )
250+ continue ;
251+ comp_matches [i ].funcs -> clk_disable (comp );
252+ if (i < OVL_ADAPTOR_MERGE0 )
251253 pm_runtime_put (comp );
252- } else if (i < OVL_ADAPTOR_ETHDR0 ) {
253- mtk_merge_clk_disable (comp );
254- } else {
255- mtk_ethdr_clk_disable (comp );
256- }
257254 }
258255}
259256
0 commit comments