@@ -56,6 +56,8 @@ static char *rpi_firmware_clk_names[] = {
56
56
#define RPI_FIRMWARE_STATE_ENABLE_BIT BIT(0)
57
57
#define RPI_FIRMWARE_STATE_WAIT_BIT BIT(1)
58
58
59
+ struct raspberrypi_clk_variant ;
60
+
59
61
struct raspberrypi_clk {
60
62
struct device * dev ;
61
63
struct rpi_firmware * firmware ;
@@ -66,10 +68,36 @@ struct raspberrypi_clk_data {
66
68
struct clk_hw hw ;
67
69
68
70
unsigned int id ;
71
+ struct raspberrypi_clk_variant * variant ;
69
72
70
73
struct raspberrypi_clk * rpi ;
71
74
};
72
75
76
+ struct raspberrypi_clk_variant {
77
+ bool export ;
78
+ char * clkdev ;
79
+ };
80
+
81
+ static struct raspberrypi_clk_variant
82
+ raspberrypi_clk_variants [RPI_FIRMWARE_NUM_CLK_ID ] = {
83
+ [RPI_FIRMWARE_ARM_CLK_ID ] = {
84
+ .export = true,
85
+ .clkdev = "cpu0" ,
86
+ },
87
+ [RPI_FIRMWARE_CORE_CLK_ID ] = {
88
+ .export = true,
89
+ },
90
+ [RPI_FIRMWARE_M2MC_CLK_ID ] = {
91
+ .export = true,
92
+ },
93
+ [RPI_FIRMWARE_V3D_CLK_ID ] = {
94
+ .export = true,
95
+ },
96
+ [RPI_FIRMWARE_PIXEL_BVB_CLK_ID ] = {
97
+ .export = true,
98
+ },
99
+ };
100
+
73
101
/*
74
102
* Structure of the message passed to Raspberry Pi's firmware in order to
75
103
* change clock rates. The 'disable_turbo' option is only available to the ARM
@@ -183,7 +211,8 @@ static const struct clk_ops raspberrypi_firmware_clk_ops = {
183
211
184
212
static struct clk_hw * raspberrypi_clk_register (struct raspberrypi_clk * rpi ,
185
213
unsigned int parent ,
186
- unsigned int id )
214
+ unsigned int id ,
215
+ struct raspberrypi_clk_variant * variant )
187
216
{
188
217
struct raspberrypi_clk_data * data ;
189
218
struct clk_init_data init = {};
@@ -195,6 +224,7 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
195
224
return ERR_PTR (- ENOMEM );
196
225
data -> rpi = rpi ;
197
226
data -> id = id ;
227
+ data -> variant = variant ;
198
228
199
229
init .name = devm_kasprintf (rpi -> dev , GFP_KERNEL ,
200
230
"fw-clk-%s" ,
@@ -228,9 +258,9 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
228
258
229
259
clk_hw_set_rate_range (& data -> hw , min_rate , max_rate );
230
260
231
- if (id == RPI_FIRMWARE_ARM_CLK_ID ) {
261
+ if (variant -> clkdev ) {
232
262
ret = devm_clk_hw_register_clkdev (rpi -> dev , & data -> hw ,
233
- NULL , "cpu0" );
263
+ NULL , variant -> clkdev );
234
264
if (ret ) {
235
265
dev_err (rpi -> dev , "Failed to initialize clkdev\n" );
236
266
return ERR_PTR (ret );
@@ -264,27 +294,27 @@ static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi,
264
294
return ret ;
265
295
266
296
while (clks -> id ) {
267
- struct clk_hw * hw ;
268
-
269
- switch (clks -> id ) {
270
- case RPI_FIRMWARE_ARM_CLK_ID :
271
- case RPI_FIRMWARE_CORE_CLK_ID :
272
- case RPI_FIRMWARE_M2MC_CLK_ID :
273
- case RPI_FIRMWARE_V3D_CLK_ID :
274
- case RPI_FIRMWARE_PIXEL_BVB_CLK_ID :
297
+ struct raspberrypi_clk_variant * variant ;
298
+
299
+ if (clks -> id > RPI_FIRMWARE_NUM_CLK_ID ) {
300
+ dev_err (rpi -> dev , "Unknown clock id: %u" , clks -> id );
301
+ return - EINVAL ;
302
+ }
303
+
304
+ variant = & raspberrypi_clk_variants [clks -> id ];
305
+ if (variant -> export ) {
306
+ struct clk_hw * hw ;
307
+
275
308
hw = raspberrypi_clk_register (rpi , clks -> parent ,
276
- clks -> id );
309
+ clks -> id , variant );
277
310
if (IS_ERR (hw ))
278
311
return PTR_ERR (hw );
279
312
280
313
data -> hws [clks -> id ] = hw ;
281
314
data -> num = clks -> id + 1 ;
282
- fallthrough ;
283
-
284
- default :
285
- clks ++ ;
286
- break ;
287
315
}
316
+
317
+ clks ++ ;
288
318
}
289
319
290
320
return 0 ;
0 commit comments