24
24
25
25
#define DIV_MAX 255
26
26
27
- static const char * const clk_names [ N_CLOCKS ] = {
27
+ static const char * const lan966x_clk_names [ ] = {
28
28
"qspi0" , "qspi1" , "qspi2" , "sdmmc0" ,
29
29
"pi" , "mcan0" , "mcan1" , "flexcom0" ,
30
30
"flexcom1" , "flexcom2" , "flexcom3" ,
@@ -53,14 +53,30 @@ struct clk_gate_soc_desc {
53
53
int bit_idx ;
54
54
};
55
55
56
- static const struct clk_gate_soc_desc clk_gate_desc [] = {
56
+ static const struct clk_gate_soc_desc lan966x_clk_gate_desc [] = {
57
57
{ "uhphs" , 11 },
58
58
{ "udphs" , 10 },
59
59
{ "mcramc" , 9 },
60
60
{ "hmatrix" , 8 },
61
61
{ }
62
62
};
63
63
64
+ struct lan966x_match_data {
65
+ char * name ;
66
+ const char * const * clk_name ;
67
+ const struct clk_gate_soc_desc * clk_gate_desc ;
68
+ u8 num_generic_clks ;
69
+ u8 num_total_clks ;
70
+ };
71
+
72
+ static struct lan966x_match_data lan966x_desc = {
73
+ .name = "lan966x" ,
74
+ .clk_name = lan966x_clk_names ,
75
+ .clk_gate_desc = lan966x_clk_gate_desc ,
76
+ .num_total_clks = 18 ,
77
+ .num_generic_clks = 14 ,
78
+ };
79
+
64
80
static DEFINE_SPINLOCK (clk_gate_lock );
65
81
static void __iomem * base ;
66
82
@@ -186,38 +202,45 @@ static struct clk_hw *lan966x_gck_clk_register(struct device *dev, int i)
186
202
};
187
203
188
204
static int lan966x_gate_clk_register (struct device * dev ,
205
+ const struct lan966x_match_data * data ,
189
206
struct clk_hw_onecell_data * hw_data ,
190
207
void __iomem * gate_base )
191
208
{
192
- int i ;
209
+ for (int i = data -> num_generic_clks ; i < data -> num_total_clks ; ++ i ) {
210
+ int idx = i - data -> num_generic_clks ;
211
+ const struct clk_gate_soc_desc * desc ;
193
212
194
- for (i = GCK_GATE_UHPHS ; i < N_CLOCKS ; ++ i ) {
195
- int idx = i - GCK_GATE_UHPHS ;
213
+ desc = & data -> clk_gate_desc [idx ];
196
214
197
215
hw_data -> hws [i ] =
198
- devm_clk_hw_register_gate (dev , clk_gate_desc [ idx ]. name ,
199
- "lan966x" , 0 , gate_base ,
200
- clk_gate_desc [ idx ]. bit_idx ,
216
+ devm_clk_hw_register_gate (dev , desc -> name ,
217
+ data -> name , 0 , gate_base ,
218
+ desc -> bit_idx ,
201
219
0 , & clk_gate_lock );
202
220
203
221
if (IS_ERR (hw_data -> hws [i ]))
204
222
return dev_err_probe (dev , PTR_ERR (hw_data -> hws [i ]),
205
223
"failed to register %s clock\n" ,
206
- clk_gate_desc [ idx ]. name );
224
+ desc -> name );
207
225
}
208
226
209
227
return 0 ;
210
228
}
211
229
212
230
static int lan966x_clk_probe (struct platform_device * pdev )
213
231
{
232
+ const struct lan966x_match_data * data ;
214
233
struct clk_hw_onecell_data * hw_data ;
215
234
struct device * dev = & pdev -> dev ;
216
235
void __iomem * gate_base ;
217
236
struct resource * res ;
218
237
int i , ret ;
219
238
220
- hw_data = devm_kzalloc (dev , struct_size (hw_data , hws , N_CLOCKS ),
239
+ data = device_get_match_data (dev );
240
+ if (!data )
241
+ return - EINVAL ;
242
+
243
+ hw_data = devm_kzalloc (dev , struct_size (hw_data , hws , data -> num_total_clks ),
221
244
GFP_KERNEL );
222
245
if (!hw_data )
223
246
return - ENOMEM ;
@@ -228,10 +251,10 @@ static int lan966x_clk_probe(struct platform_device *pdev)
228
251
229
252
init .ops = & lan966x_gck_ops ;
230
253
231
- hw_data -> num = GCK_GATE_UHPHS ;
254
+ hw_data -> num = data -> num_generic_clks ;
232
255
233
- for (i = 0 ; i < GCK_GATE_UHPHS ; i ++ ) {
234
- init .name = clk_names [i ];
256
+ for (i = 0 ; i < data -> num_generic_clks ; i ++ ) {
257
+ init .name = data -> clk_name [i ];
235
258
hw_data -> hws [i ] = lan966x_gck_clk_register (dev , i );
236
259
if (IS_ERR (hw_data -> hws [i ])) {
237
260
dev_err (dev , "failed to register %s clock\n" ,
@@ -246,9 +269,9 @@ static int lan966x_clk_probe(struct platform_device *pdev)
246
269
if (IS_ERR (gate_base ))
247
270
return PTR_ERR (gate_base );
248
271
249
- hw_data -> num = N_CLOCKS ;
272
+ hw_data -> num = data -> num_total_clks ;
250
273
251
- ret = lan966x_gate_clk_register (dev , hw_data , gate_base );
274
+ ret = lan966x_gate_clk_register (dev , data , hw_data , gate_base );
252
275
if (ret )
253
276
return ret ;
254
277
}
@@ -257,7 +280,7 @@ static int lan966x_clk_probe(struct platform_device *pdev)
257
280
}
258
281
259
282
static const struct of_device_id lan966x_clk_dt_ids [] = {
260
- { .compatible = "microchip,lan966x-gck" , },
283
+ { .compatible = "microchip,lan966x-gck" , . data = & lan966x_desc },
261
284
{ }
262
285
};
263
286
MODULE_DEVICE_TABLE (of , lan966x_clk_dt_ids );
0 commit comments