24
24
25
25
#define DIV_MAX 255
26
26
27
- static const char * 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" ,
31
31
"flexcom4" , "timer1" , "usb_refclk" ,
32
32
};
33
33
34
+ static const char * const lan969x_clk_names [] = {
35
+ "qspi0" , "qspi2" , "sdmmc0" , "sdmmc1" ,
36
+ "mcan0" , "mcan1" , "flexcom0" ,
37
+ "flexcom1" , "flexcom2" , "flexcom3" ,
38
+ "timer1" , "usb_refclk" ,
39
+ };
40
+
34
41
struct lan966x_gck {
35
42
struct clk_hw hw ;
36
43
void __iomem * reg ;
@@ -53,14 +60,45 @@ struct clk_gate_soc_desc {
53
60
int bit_idx ;
54
61
};
55
62
56
- static const struct clk_gate_soc_desc clk_gate_desc [] = {
63
+ static const struct clk_gate_soc_desc lan966x_clk_gate_desc [] = {
57
64
{ "uhphs" , 11 },
58
65
{ "udphs" , 10 },
59
66
{ "mcramc" , 9 },
60
67
{ "hmatrix" , 8 },
61
68
{ }
62
69
};
63
70
71
+ static const struct clk_gate_soc_desc lan969x_clk_gate_desc [] = {
72
+ { "usb_drd" , 10 },
73
+ { "mcramc" , 9 },
74
+ { "hmatrix" , 8 },
75
+ { }
76
+ };
77
+
78
+ struct lan966x_match_data {
79
+ char * name ;
80
+ const char * const * clk_name ;
81
+ const struct clk_gate_soc_desc * clk_gate_desc ;
82
+ u8 num_generic_clks ;
83
+ u8 num_total_clks ;
84
+ };
85
+
86
+ static struct lan966x_match_data lan966x_desc = {
87
+ .name = "lan966x" ,
88
+ .clk_name = lan966x_clk_names ,
89
+ .clk_gate_desc = lan966x_clk_gate_desc ,
90
+ .num_total_clks = 18 ,
91
+ .num_generic_clks = 14 ,
92
+ };
93
+
94
+ static struct lan966x_match_data lan969x_desc = {
95
+ .name = "lan969x" ,
96
+ .clk_name = lan969x_clk_names ,
97
+ .clk_gate_desc = lan969x_clk_gate_desc ,
98
+ .num_total_clks = 15 ,
99
+ .num_generic_clks = 12 ,
100
+ };
101
+
64
102
static DEFINE_SPINLOCK (clk_gate_lock );
65
103
static void __iomem * base ;
66
104
@@ -186,38 +224,45 @@ static struct clk_hw *lan966x_gck_clk_register(struct device *dev, int i)
186
224
};
187
225
188
226
static int lan966x_gate_clk_register (struct device * dev ,
227
+ const struct lan966x_match_data * data ,
189
228
struct clk_hw_onecell_data * hw_data ,
190
229
void __iomem * gate_base )
191
230
{
192
- int i ;
231
+ for (int i = data -> num_generic_clks ; i < data -> num_total_clks ; ++ i ) {
232
+ int idx = i - data -> num_generic_clks ;
233
+ const struct clk_gate_soc_desc * desc ;
193
234
194
- for (i = GCK_GATE_UHPHS ; i < N_CLOCKS ; ++ i ) {
195
- int idx = i - GCK_GATE_UHPHS ;
235
+ desc = & data -> clk_gate_desc [idx ];
196
236
197
237
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 ,
238
+ devm_clk_hw_register_gate (dev , desc -> name ,
239
+ data -> name , 0 , gate_base ,
240
+ desc -> bit_idx ,
201
241
0 , & clk_gate_lock );
202
242
203
243
if (IS_ERR (hw_data -> hws [i ]))
204
244
return dev_err_probe (dev , PTR_ERR (hw_data -> hws [i ]),
205
245
"failed to register %s clock\n" ,
206
- clk_gate_desc [ idx ]. name );
246
+ desc -> name );
207
247
}
208
248
209
249
return 0 ;
210
250
}
211
251
212
252
static int lan966x_clk_probe (struct platform_device * pdev )
213
253
{
254
+ const struct lan966x_match_data * data ;
214
255
struct clk_hw_onecell_data * hw_data ;
215
256
struct device * dev = & pdev -> dev ;
216
257
void __iomem * gate_base ;
217
258
struct resource * res ;
218
259
int i , ret ;
219
260
220
- hw_data = devm_kzalloc (dev , struct_size (hw_data , hws , N_CLOCKS ),
261
+ data = device_get_match_data (dev );
262
+ if (!data )
263
+ return - EINVAL ;
264
+
265
+ hw_data = devm_kzalloc (dev , struct_size (hw_data , hws , data -> num_total_clks ),
221
266
GFP_KERNEL );
222
267
if (!hw_data )
223
268
return - ENOMEM ;
@@ -228,10 +273,10 @@ static int lan966x_clk_probe(struct platform_device *pdev)
228
273
229
274
init .ops = & lan966x_gck_ops ;
230
275
231
- hw_data -> num = GCK_GATE_UHPHS ;
276
+ hw_data -> num = data -> num_generic_clks ;
232
277
233
- for (i = 0 ; i < GCK_GATE_UHPHS ; i ++ ) {
234
- init .name = clk_names [i ];
278
+ for (i = 0 ; i < data -> num_generic_clks ; i ++ ) {
279
+ init .name = data -> clk_name [i ];
235
280
hw_data -> hws [i ] = lan966x_gck_clk_register (dev , i );
236
281
if (IS_ERR (hw_data -> hws [i ])) {
237
282
dev_err (dev , "failed to register %s clock\n" ,
@@ -246,9 +291,9 @@ static int lan966x_clk_probe(struct platform_device *pdev)
246
291
if (IS_ERR (gate_base ))
247
292
return PTR_ERR (gate_base );
248
293
249
- hw_data -> num = N_CLOCKS ;
294
+ hw_data -> num = data -> num_total_clks ;
250
295
251
- ret = lan966x_gate_clk_register (dev , hw_data , gate_base );
296
+ ret = lan966x_gate_clk_register (dev , data , hw_data , gate_base );
252
297
if (ret )
253
298
return ret ;
254
299
}
@@ -257,7 +302,8 @@ static int lan966x_clk_probe(struct platform_device *pdev)
257
302
}
258
303
259
304
static const struct of_device_id lan966x_clk_dt_ids [] = {
260
- { .compatible = "microchip,lan966x-gck" , },
305
+ { .compatible = "microchip,lan966x-gck" , .data = & lan966x_desc },
306
+ { .compatible = "microchip,lan9691-gck" , .data = & lan969x_desc },
261
307
{ }
262
308
};
263
309
MODULE_DEVICE_TABLE (of , lan966x_clk_dt_ids );
0 commit comments