@@ -56,6 +56,8 @@ static char *rpi_firmware_clk_names[] = {
5656#define RPI_FIRMWARE_STATE_ENABLE_BIT BIT(0)
5757#define RPI_FIRMWARE_STATE_WAIT_BIT BIT(1)
5858
59+ struct raspberrypi_clk_variant ;
60+
5961struct raspberrypi_clk {
6062 struct device * dev ;
6163 struct rpi_firmware * firmware ;
@@ -66,10 +68,36 @@ struct raspberrypi_clk_data {
6668 struct clk_hw hw ;
6769
6870 unsigned int id ;
71+ struct raspberrypi_clk_variant * variant ;
6972
7073 struct raspberrypi_clk * rpi ;
7174};
7275
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+
73101/*
74102 * Structure of the message passed to Raspberry Pi's firmware in order to
75103 * 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 = {
183211
184212static struct clk_hw * raspberrypi_clk_register (struct raspberrypi_clk * rpi ,
185213 unsigned int parent ,
186- unsigned int id )
214+ unsigned int id ,
215+ struct raspberrypi_clk_variant * variant )
187216{
188217 struct raspberrypi_clk_data * data ;
189218 struct clk_init_data init = {};
@@ -195,6 +224,7 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
195224 return ERR_PTR (- ENOMEM );
196225 data -> rpi = rpi ;
197226 data -> id = id ;
227+ data -> variant = variant ;
198228
199229 init .name = devm_kasprintf (rpi -> dev , GFP_KERNEL ,
200230 "fw-clk-%s" ,
@@ -228,9 +258,9 @@ static struct clk_hw *raspberrypi_clk_register(struct raspberrypi_clk *rpi,
228258
229259 clk_hw_set_rate_range (& data -> hw , min_rate , max_rate );
230260
231- if (id == RPI_FIRMWARE_ARM_CLK_ID ) {
261+ if (variant -> clkdev ) {
232262 ret = devm_clk_hw_register_clkdev (rpi -> dev , & data -> hw ,
233- NULL , "cpu0" );
263+ NULL , variant -> clkdev );
234264 if (ret ) {
235265 dev_err (rpi -> dev , "Failed to initialize clkdev\n" );
236266 return ERR_PTR (ret );
@@ -264,27 +294,27 @@ static int raspberrypi_discover_clocks(struct raspberrypi_clk *rpi,
264294 return ret ;
265295
266296 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+
275308 hw = raspberrypi_clk_register (rpi , clks -> parent ,
276- clks -> id );
309+ clks -> id , variant );
277310 if (IS_ERR (hw ))
278311 return PTR_ERR (hw );
279312
280313 data -> hws [clks -> id ] = hw ;
281314 data -> num = clks -> id + 1 ;
282- fallthrough ;
283-
284- default :
285- clks ++ ;
286- break ;
287315 }
316+
317+ clks ++ ;
288318 }
289319
290320 return 0 ;
0 commit comments