1313#include <linux/io-64-nonatomic-lo-hi.h>
1414#include <dt-bindings/clock/loongson,ls2k-clk.h>
1515
16- static const struct clk_parent_data pdata [] = {
17- { .fw_name = "ref_100m" , },
18- };
19-
2016enum loongson2_clk_type {
2117 CLK_TYPE_PLL ,
2218 CLK_TYPE_SCALE ,
@@ -275,7 +271,8 @@ static const struct clk_ops loongson2_freqscale_recalc_ops = {
275271 .recalc_rate = loongson2_freqscale_recalc_rate ,
276272};
277273
278- static struct clk_hw * loongson2_clk_register (struct loongson2_clk_provider * clp ,
274+ static struct clk_hw * loongson2_clk_register (const char * parent ,
275+ struct loongson2_clk_provider * clp ,
279276 const struct loongson2_clk_board_info * cld ,
280277 const struct clk_ops * ops )
281278{
@@ -292,11 +289,7 @@ static struct clk_hw *loongson2_clk_register(struct loongson2_clk_provider *clp,
292289 init .ops = ops ;
293290 init .flags = 0 ;
294291 init .num_parents = 1 ;
295-
296- if (!cld -> parent_name )
297- init .parent_data = pdata ;
298- else
299- init .parent_names = & cld -> parent_name ;
292+ init .parent_names = & parent ;
300293
301294 clk -> reg = clp -> base + cld -> reg_offset ;
302295 clk -> div_shift = cld -> div_shift ;
@@ -321,11 +314,17 @@ static int loongson2_clk_probe(struct platform_device *pdev)
321314 struct device * dev = & pdev -> dev ;
322315 struct loongson2_clk_provider * clp ;
323316 const struct loongson2_clk_board_info * p , * data ;
317+ const char * refclk_name , * parent_name ;
324318
325319 data = device_get_match_data (dev );
326320 if (!data )
327321 return - EINVAL ;
328322
323+ refclk_name = of_clk_get_parent_name (dev -> of_node , 0 );
324+ if (IS_ERR (refclk_name ))
325+ return dev_err_probe (dev , PTR_ERR (refclk_name ),
326+ "failed to get refclk name\n" );
327+
329328 for (p = data ; p -> name ; p ++ )
330329 clks_num = max (clks_num , p -> id + 1 );
331330
@@ -347,34 +346,36 @@ static int loongson2_clk_probe(struct platform_device *pdev)
347346
348347 for (i = 0 ; i < clks_num ; i ++ ) {
349348 p = & data [i ];
349+ parent_name = p -> parent_name ? p -> parent_name : refclk_name ;
350+
350351 switch (p -> type ) {
351352 case CLK_TYPE_PLL :
352- hw = loongson2_clk_register (clp , p ,
353+ hw = loongson2_clk_register (parent_name , clp , p ,
353354 & loongson2_pll_recalc_ops );
354355 break ;
355356 case CLK_TYPE_SCALE :
356- hw = loongson2_clk_register (clp , p ,
357+ hw = loongson2_clk_register (parent_name , clp , p ,
357358 & loongson2_freqscale_recalc_ops );
358359 break ;
359360 case CLK_TYPE_DIVIDER :
360361 hw = devm_clk_hw_register_divider (dev , p -> name ,
361- p -> parent_name , 0 ,
362+ parent_name , 0 ,
362363 clp -> base + p -> reg_offset ,
363364 p -> div_shift , p -> div_width ,
364365 CLK_DIVIDER_ONE_BASED |
365366 CLK_DIVIDER_ALLOW_ZERO ,
366367 & clp -> clk_lock );
367368 break ;
368369 case CLK_TYPE_GATE :
369- hw = devm_clk_hw_register_gate (dev , p -> name , p -> parent_name ,
370+ hw = devm_clk_hw_register_gate (dev , p -> name , parent_name ,
370371 p -> flags ,
371372 clp -> base + p -> reg_offset ,
372373 p -> bit_idx , 0 ,
373374 & clp -> clk_lock );
374375 break ;
375376 case CLK_TYPE_FIXED :
376- hw = devm_clk_hw_register_fixed_rate_parent_data (dev , p -> name , pdata ,
377- 0 , p -> fixed_rate );
377+ hw = devm_clk_hw_register_fixed_rate (dev , p -> name , parent_name ,
378+ 0 , p -> fixed_rate );
378379 break ;
379380 default :
380381 return dev_err_probe (dev , - EINVAL , "Invalid clk type\n" );
0 commit comments