@@ -80,6 +80,18 @@ static struct clk * __init ath79_set_ff_clk(int type, const char *parent,
80
80
return clk ;
81
81
}
82
82
83
+ static unsigned long __init ath79_setup_ref_clk (unsigned long rate )
84
+ {
85
+ struct clk * clk = clks [ATH79_CLK_REF ];
86
+
87
+ if (clk )
88
+ rate = clk_get_rate (clk );
89
+ else
90
+ clk = ath79_set_clk (ATH79_CLK_REF , rate );
91
+
92
+ return rate ;
93
+ }
94
+
83
95
static void __init ar71xx_clocks_init (void __iomem * pll_base )
84
96
{
85
97
unsigned long ref_rate ;
@@ -90,7 +102,7 @@ static void __init ar71xx_clocks_init(void __iomem *pll_base)
90
102
u32 freq ;
91
103
u32 div ;
92
104
93
- ref_rate = AR71XX_BASE_FREQ ;
105
+ ref_rate = ath79_setup_ref_clk ( AR71XX_BASE_FREQ ) ;
94
106
95
107
pll = __raw_readl (pll_base + AR71XX_PLL_REG_CPU_CONFIG );
96
108
@@ -106,16 +118,17 @@ static void __init ar71xx_clocks_init(void __iomem *pll_base)
106
118
div = (((pll >> AR71XX_AHB_DIV_SHIFT ) & AR71XX_AHB_DIV_MASK ) + 1 ) * 2 ;
107
119
ahb_rate = cpu_rate / div ;
108
120
109
- ath79_set_clk (ATH79_CLK_REF , ref_rate );
110
121
ath79_set_clk (ATH79_CLK_CPU , cpu_rate );
111
122
ath79_set_clk (ATH79_CLK_DDR , ddr_rate );
112
123
ath79_set_clk (ATH79_CLK_AHB , ahb_rate );
113
124
}
114
125
115
- static void __init ar724x_clk_init ( struct clk * ref_clk , void __iomem * pll_base )
126
+ static void __init ar724x_clocks_init ( void __iomem * pll_base )
116
127
{
117
- u32 pll ;
118
128
u32 mult , div , ddr_div , ahb_div ;
129
+ u32 pll ;
130
+
131
+ ath79_setup_ref_clk (AR71XX_BASE_FREQ );
119
132
120
133
pll = __raw_readl (pll_base + AR724X_PLL_REG_CPU_CONFIG );
121
134
@@ -130,17 +143,9 @@ static void __init ar724x_clk_init(struct clk *ref_clk, void __iomem *pll_base)
130
143
ath79_set_ff_clk (ATH79_CLK_AHB , "ref" , mult , div * ahb_div );
131
144
}
132
145
133
- static void __init ar724x_clocks_init (void __iomem * pll_base )
134
- {
135
- struct clk * ref_clk ;
136
-
137
- ref_clk = ath79_set_clk (ATH79_CLK_REF , AR724X_BASE_FREQ );
138
-
139
- ar724x_clk_init (ref_clk , pll_base );
140
- }
141
-
142
- static void __init ar9330_clk_init (struct clk * ref_clk , void __iomem * pll_base )
146
+ static void __init ar933x_clocks_init (void __iomem * pll_base )
143
147
{
148
+ unsigned long ref_rate ;
144
149
u32 clock_ctrl ;
145
150
u32 ref_div ;
146
151
u32 ninit_mul ;
@@ -149,6 +154,15 @@ static void __init ar9330_clk_init(struct clk *ref_clk, void __iomem *pll_base)
149
154
u32 cpu_div ;
150
155
u32 ddr_div ;
151
156
u32 ahb_div ;
157
+ u32 t ;
158
+
159
+ t = ath79_reset_rr (AR933X_RESET_REG_BOOTSTRAP );
160
+ if (t & AR933X_BOOTSTRAP_REF_CLK_40 )
161
+ ref_rate = (40 * 1000 * 1000 );
162
+ else
163
+ ref_rate = (25 * 1000 * 1000 );
164
+
165
+ ath79_setup_ref_clk (ref_rate );
152
166
153
167
clock_ctrl = __raw_readl (pll_base + AR933X_PLL_CLOCK_CTRL_REG );
154
168
if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS ) {
@@ -197,23 +211,6 @@ static void __init ar9330_clk_init(struct clk *ref_clk, void __iomem *pll_base)
197
211
ref_div * out_div * ahb_div );
198
212
}
199
213
200
- static void __init ar933x_clocks_init (void __iomem * pll_base )
201
- {
202
- struct clk * ref_clk ;
203
- unsigned long ref_rate ;
204
- u32 t ;
205
-
206
- t = ath79_reset_rr (AR933X_RESET_REG_BOOTSTRAP );
207
- if (t & AR933X_BOOTSTRAP_REF_CLK_40 )
208
- ref_rate = (40 * 1000 * 1000 );
209
- else
210
- ref_rate = (25 * 1000 * 1000 );
211
-
212
- ref_clk = ath79_set_clk (ATH79_CLK_REF , ref_rate );
213
-
214
- ar9330_clk_init (ref_clk , ath79_pll_base );
215
- }
216
-
217
214
static u32 __init ar934x_get_pll_freq (u32 ref , u32 ref_div , u32 nint , u32 nfrac ,
218
215
u32 frac , u32 out_div )
219
216
{
@@ -253,6 +250,8 @@ static void __init ar934x_clocks_init(void __iomem *pll_base)
253
250
else
254
251
ref_rate = 25 * 1000 * 1000 ;
255
252
253
+ ref_rate = ath79_setup_ref_clk (ref_rate );
254
+
256
255
pll = __raw_readl (dpll_base + AR934X_SRIF_CPU_DPLL2_REG );
257
256
if (pll & AR934X_SRIF_DPLL2_LOCAL_PLL ) {
258
257
out_div = (pll >> AR934X_SRIF_DPLL2_OUTDIV_SHIFT ) &
@@ -339,7 +338,6 @@ static void __init ar934x_clocks_init(void __iomem *pll_base)
339
338
else
340
339
ahb_rate = cpu_pll / (postdiv + 1 );
341
340
342
- ath79_set_clk (ATH79_CLK_REF , ref_rate );
343
341
ath79_set_clk (ATH79_CLK_CPU , cpu_rate );
344
342
ath79_set_clk (ATH79_CLK_DDR , ddr_rate );
345
343
ath79_set_clk (ATH79_CLK_AHB , ahb_rate );
@@ -363,6 +361,8 @@ static void __init qca953x_clocks_init(void __iomem *pll_base)
363
361
else
364
362
ref_rate = 25 * 1000 * 1000 ;
365
363
364
+ ref_rate = ath79_setup_ref_clk (ref_rate );
365
+
366
366
pll = __raw_readl (pll_base + QCA953X_PLL_CPU_CONFIG_REG );
367
367
out_div = (pll >> QCA953X_PLL_CPU_CONFIG_OUTDIV_SHIFT ) &
368
368
QCA953X_PLL_CPU_CONFIG_OUTDIV_MASK ;
@@ -423,7 +423,6 @@ static void __init qca953x_clocks_init(void __iomem *pll_base)
423
423
else
424
424
ahb_rate = cpu_pll / (postdiv + 1 );
425
425
426
- ath79_set_clk (ATH79_CLK_REF , ref_rate );
427
426
ath79_set_clk (ATH79_CLK_CPU , cpu_rate );
428
427
ath79_set_clk (ATH79_CLK_DDR , ddr_rate );
429
428
ath79_set_clk (ATH79_CLK_AHB , ahb_rate );
@@ -445,6 +444,8 @@ static void __init qca955x_clocks_init(void __iomem *pll_base)
445
444
else
446
445
ref_rate = 25 * 1000 * 1000 ;
447
446
447
+ ref_rate = ath79_setup_ref_clk (ref_rate );
448
+
448
449
pll = __raw_readl (pll_base + QCA955X_PLL_CPU_CONFIG_REG );
449
450
out_div = (pll >> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT ) &
450
451
QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK ;
@@ -505,7 +506,6 @@ static void __init qca955x_clocks_init(void __iomem *pll_base)
505
506
else
506
507
ahb_rate = cpu_pll / (postdiv + 1 );
507
508
508
- ath79_set_clk (ATH79_CLK_REF , ref_rate );
509
509
ath79_set_clk (ATH79_CLK_CPU , cpu_rate );
510
510
ath79_set_clk (ATH79_CLK_DDR , ddr_rate );
511
511
ath79_set_clk (ATH79_CLK_AHB , ahb_rate );
@@ -537,6 +537,8 @@ static void __init qca956x_clocks_init(void __iomem *pll_base)
537
537
else
538
538
ref_rate = 25 * 1000 * 1000 ;
539
539
540
+ ref_rate = ath79_setup_ref_clk (ref_rate );
541
+
540
542
pll = __raw_readl (pll_base + QCA956X_PLL_CPU_CONFIG_REG );
541
543
out_div = (pll >> QCA956X_PLL_CPU_CONFIG_OUTDIV_SHIFT ) &
542
544
QCA956X_PLL_CPU_CONFIG_OUTDIV_MASK ;
@@ -606,7 +608,6 @@ static void __init qca956x_clocks_init(void __iomem *pll_base)
606
608
else
607
609
ahb_rate = cpu_pll / (postdiv + 1 );
608
610
609
- ath79_set_clk (ATH79_CLK_REF , ref_rate );
610
611
ath79_set_clk (ATH79_CLK_CPU , cpu_rate );
611
612
ath79_set_clk (ATH79_CLK_DDR , ddr_rate );
612
613
ath79_set_clk (ATH79_CLK_AHB , ahb_rate );
@@ -682,10 +683,8 @@ static void __init ath79_clocks_init_dt_ng(struct device_node *np)
682
683
void __iomem * pll_base ;
683
684
684
685
ref_clk = of_clk_get (np , 0 );
685
- if (IS_ERR (ref_clk )) {
686
- pr_err ("%pOF: of_clk_get failed\n" , np );
687
- goto err ;
688
- }
686
+ if (!IS_ERR (ref_clk ))
687
+ clks [ATH79_CLK_REF ] = ref_clk ;
689
688
690
689
pll_base = of_iomap (np , 0 );
691
690
if (!pll_base ) {
@@ -694,9 +693,9 @@ static void __init ath79_clocks_init_dt_ng(struct device_node *np)
694
693
}
695
694
696
695
if (of_device_is_compatible (np , "qca,ar9130-pll" ))
697
- ar724x_clk_init ( ref_clk , pll_base );
696
+ ar724x_clocks_init ( pll_base );
698
697
else if (of_device_is_compatible (np , "qca,ar9330-pll" ))
699
- ar9330_clk_init ( ref_clk , pll_base );
698
+ ar933x_clocks_init ( pll_base );
700
699
else {
701
700
pr_err ("%pOF: could not find any appropriate clk_init()\n" , np );
702
701
goto err_iounmap ;
@@ -714,9 +713,6 @@ static void __init ath79_clocks_init_dt_ng(struct device_node *np)
714
713
715
714
err_clk :
716
715
clk_put (ref_clk );
717
-
718
- err :
719
- return ;
720
716
}
721
717
CLK_OF_DECLARE (ar9130_clk , "qca,ar9130-pll" , ath79_clocks_init_dt_ng );
722
718
CLK_OF_DECLARE (ar9330_clk , "qca,ar9330-pll" , ath79_clocks_init_dt_ng );
0 commit comments