7
7
*/
8
8
9
9
#include <linux/auxiliary_bus.h>
10
+ #include <linux/clk.h>
10
11
#include <linux/clk-provider.h>
11
12
#include <linux/init.h>
12
13
#include <linux/io.h>
@@ -389,6 +390,7 @@ static int __init jh7110_syscrg_probe(struct platform_device *pdev)
389
390
struct jh71x0_clk_priv * priv ;
390
391
unsigned int idx ;
391
392
int ret ;
393
+ struct clk * pllclk ;
392
394
393
395
priv = devm_kzalloc (& pdev -> dev ,
394
396
struct_size (priv , reg , JH7110_SYSCLK_END ),
@@ -402,28 +404,42 @@ static int __init jh7110_syscrg_probe(struct platform_device *pdev)
402
404
if (IS_ERR (priv -> base ))
403
405
return PTR_ERR (priv -> base );
404
406
405
- /*
406
- * These PLL clocks are not actually fixed factor clocks and can be
407
- * controlled by the syscon registers of JH7110. They will be dropped
408
- * and registered in the PLL clock driver instead.
409
- */
410
- /* 24MHz -> 1000.0MHz */
411
- priv -> pll [0 ] = devm_clk_hw_register_fixed_factor (priv -> dev , "pll0_out" ,
412
- "osc" , 0 , 125 , 3 );
413
- if (IS_ERR (priv -> pll [0 ]))
414
- return PTR_ERR (priv -> pll [0 ]);
415
-
416
- /* 24MHz -> 1066.0MHz */
417
- priv -> pll [1 ] = devm_clk_hw_register_fixed_factor (priv -> dev , "pll1_out" ,
418
- "osc" , 0 , 533 , 12 );
419
- if (IS_ERR (priv -> pll [1 ]))
420
- return PTR_ERR (priv -> pll [1 ]);
421
-
422
- /* 24MHz -> 1188.0MHz */
423
- priv -> pll [2 ] = devm_clk_hw_register_fixed_factor (priv -> dev , "pll2_out" ,
424
- "osc" , 0 , 99 , 2 );
425
- if (IS_ERR (priv -> pll [2 ]))
426
- return PTR_ERR (priv -> pll [2 ]);
407
+ /* Use fixed factor clocks if can not get the PLL clocks from DTS */
408
+ pllclk = clk_get (priv -> dev , "pll0_out" );
409
+ if (IS_ERR (pllclk )) {
410
+ /* 24MHz -> 1000.0MHz */
411
+ priv -> pll [0 ] = devm_clk_hw_register_fixed_factor (priv -> dev , "pll0_out" ,
412
+ "osc" , 0 , 125 , 3 );
413
+ if (IS_ERR (priv -> pll [0 ]))
414
+ return PTR_ERR (priv -> pll [0 ]);
415
+ } else {
416
+ clk_put (pllclk );
417
+ priv -> pll [0 ] = NULL ;
418
+ }
419
+
420
+ pllclk = clk_get (priv -> dev , "pll1_out" );
421
+ if (IS_ERR (pllclk )) {
422
+ /* 24MHz -> 1066.0MHz */
423
+ priv -> pll [1 ] = devm_clk_hw_register_fixed_factor (priv -> dev , "pll1_out" ,
424
+ "osc" , 0 , 533 , 12 );
425
+ if (IS_ERR (priv -> pll [1 ]))
426
+ return PTR_ERR (priv -> pll [1 ]);
427
+ } else {
428
+ clk_put (pllclk );
429
+ priv -> pll [1 ] = NULL ;
430
+ }
431
+
432
+ pllclk = clk_get (priv -> dev , "pll2_out" );
433
+ if (IS_ERR (pllclk )) {
434
+ /* 24MHz -> 1188.0MHz */
435
+ priv -> pll [2 ] = devm_clk_hw_register_fixed_factor (priv -> dev , "pll2_out" ,
436
+ "osc" , 0 , 99 , 2 );
437
+ if (IS_ERR (priv -> pll [2 ]))
438
+ return PTR_ERR (priv -> pll [2 ]);
439
+ } else {
440
+ clk_put (pllclk );
441
+ priv -> pll [2 ] = NULL ;
442
+ }
427
443
428
444
for (idx = 0 ; idx < JH7110_SYSCLK_END ; idx ++ ) {
429
445
u32 max = jh7110_sysclk_data [idx ].max ;
@@ -462,6 +478,12 @@ static int __init jh7110_syscrg_probe(struct platform_device *pdev)
462
478
parents [i ].fw_name = "tdm_ext" ;
463
479
else if (pidx == JH7110_SYSCLK_MCLK_EXT )
464
480
parents [i ].fw_name = "mclk_ext" ;
481
+ else if (pidx == JH7110_SYSCLK_PLL0_OUT && !priv -> pll [0 ])
482
+ parents [i ].fw_name = "pll0_out" ;
483
+ else if (pidx == JH7110_SYSCLK_PLL1_OUT && !priv -> pll [1 ])
484
+ parents [i ].fw_name = "pll1_out" ;
485
+ else if (pidx == JH7110_SYSCLK_PLL2_OUT && !priv -> pll [2 ])
486
+ parents [i ].fw_name = "pll2_out" ;
465
487
else
466
488
parents [i ].hw = priv -> pll [pidx - JH7110_SYSCLK_PLL0_OUT ];
467
489
}
0 commit comments