@@ -55,19 +55,19 @@ MODULE_DEVICE_TABLE(of, mtk_mdp_of_ids);
55
55
static void mtk_mdp_clock_on (struct mtk_mdp_dev * mdp )
56
56
{
57
57
struct device * dev = & mdp -> pdev -> dev ;
58
- int i ;
58
+ struct mtk_mdp_comp * comp_node ;
59
59
60
- for ( i = 0 ; i < ARRAY_SIZE ( mdp -> comp ); i ++ )
61
- mtk_mdp_comp_clock_on (dev , mdp -> comp [ i ] );
60
+ list_for_each_entry ( comp_node , & mdp -> comp_list , node )
61
+ mtk_mdp_comp_clock_on (dev , comp_node );
62
62
}
63
63
64
64
static void mtk_mdp_clock_off (struct mtk_mdp_dev * mdp )
65
65
{
66
66
struct device * dev = & mdp -> pdev -> dev ;
67
- int i ;
67
+ struct mtk_mdp_comp * comp_node ;
68
68
69
- for ( i = 0 ; i < ARRAY_SIZE ( mdp -> comp ); i ++ )
70
- mtk_mdp_comp_clock_off (dev , mdp -> comp [ i ] );
69
+ list_for_each_entry ( comp_node , & mdp -> comp_list , node )
70
+ mtk_mdp_comp_clock_off (dev , comp_node );
71
71
}
72
72
73
73
static void mtk_mdp_wdt_worker (struct work_struct * work )
@@ -91,19 +91,33 @@ static void mtk_mdp_reset_handler(void *priv)
91
91
queue_work (mdp -> wdt_wq , & mdp -> wdt_work );
92
92
}
93
93
94
+ void mtk_mdp_register_component (struct mtk_mdp_dev * mdp ,
95
+ struct mtk_mdp_comp * comp )
96
+ {
97
+ list_add (& mdp -> comp_list , & comp -> node );
98
+ }
99
+
100
+ void mtk_mdp_unregister_component (struct mtk_mdp_dev * mdp ,
101
+ struct mtk_mdp_comp * comp )
102
+ {
103
+ list_del (& comp -> node );
104
+ }
105
+
94
106
static int mtk_mdp_probe (struct platform_device * pdev )
95
107
{
96
108
struct mtk_mdp_dev * mdp ;
97
109
struct device * dev = & pdev -> dev ;
98
110
struct device_node * node , * parent ;
99
- int i , ret = 0 ;
111
+ struct mtk_mdp_comp * comp , * comp_temp ;
112
+ int ret = 0 ;
100
113
101
114
mdp = devm_kzalloc (dev , sizeof (* mdp ), GFP_KERNEL );
102
115
if (!mdp )
103
116
return - ENOMEM ;
104
117
105
118
mdp -> id = pdev -> id ;
106
119
mdp -> pdev = pdev ;
120
+ INIT_LIST_HEAD (& mdp -> comp_list );
107
121
INIT_LIST_HEAD (& mdp -> ctx_list );
108
122
109
123
mutex_init (& mdp -> lock );
@@ -124,7 +138,6 @@ static int mtk_mdp_probe(struct platform_device *pdev)
124
138
const struct of_device_id * of_id ;
125
139
enum mtk_mdp_comp_type comp_type ;
126
140
int comp_id ;
127
- struct mtk_mdp_comp * comp ;
128
141
129
142
of_id = of_match_node (mtk_mdp_comp_dt_ids , node );
130
143
if (!of_id )
@@ -150,13 +163,14 @@ static int mtk_mdp_probe(struct platform_device *pdev)
150
163
of_node_put (node );
151
164
goto err_comp ;
152
165
}
153
- mdp -> comp [comp_id ] = comp ;
154
166
155
167
ret = mtk_mdp_comp_init (dev , node , comp , comp_id );
156
168
if (ret ) {
157
169
of_node_put (node );
158
170
goto err_comp ;
159
171
}
172
+
173
+ mtk_mdp_register_component (mdp , comp );
160
174
}
161
175
162
176
mdp -> job_wq = create_singlethread_workqueue (MTK_MDP_MODULE_NAME );
@@ -220,8 +234,10 @@ static int mtk_mdp_probe(struct platform_device *pdev)
220
234
err_alloc_job_wq :
221
235
222
236
err_comp :
223
- for (i = 0 ; i < ARRAY_SIZE (mdp -> comp ); i ++ )
224
- mtk_mdp_comp_deinit (dev , mdp -> comp [i ]);
237
+ list_for_each_entry_safe (comp , comp_temp , & mdp -> comp_list , node ) {
238
+ mtk_mdp_unregister_component (mdp , comp );
239
+ mtk_mdp_comp_deinit (dev , comp );
240
+ }
225
241
226
242
dev_dbg (dev , "err %d\n" , ret );
227
243
return ret ;
@@ -230,7 +246,7 @@ static int mtk_mdp_probe(struct platform_device *pdev)
230
246
static int mtk_mdp_remove (struct platform_device * pdev )
231
247
{
232
248
struct mtk_mdp_dev * mdp = platform_get_drvdata (pdev );
233
- int i ;
249
+ struct mtk_mdp_comp * comp , * comp_temp ;
234
250
235
251
pm_runtime_disable (& pdev -> dev );
236
252
vb2_dma_contig_clear_max_seg_size (& pdev -> dev );
@@ -243,8 +259,10 @@ static int mtk_mdp_remove(struct platform_device *pdev)
243
259
flush_workqueue (mdp -> job_wq );
244
260
destroy_workqueue (mdp -> job_wq );
245
261
246
- for (i = 0 ; i < ARRAY_SIZE (mdp -> comp ); i ++ )
247
- mtk_mdp_comp_deinit (& pdev -> dev , mdp -> comp [i ]);
262
+ list_for_each_entry_safe (comp , comp_temp , & mdp -> comp_list , node ) {
263
+ mtk_mdp_unregister_component (mdp , comp );
264
+ mtk_mdp_comp_deinit (& pdev -> dev , comp );
265
+ }
248
266
249
267
dev_dbg (& pdev -> dev , "%s driver unloaded\n" , pdev -> name );
250
268
return 0 ;
0 commit comments