3
3
* Copyright 2017-2018 NXP.
4
4
*/
5
5
6
+ #include <linux/bitfield.h>
6
7
#include <linux/bits.h>
7
8
#include <linux/clk-provider.h>
8
9
#include <linux/err.h>
22
23
#define CLKE_MASK BIT(11)
23
24
#define RST_MASK BIT(9)
24
25
#define BYPASS_MASK BIT(4)
25
- #define MDIV_SHIFT 12
26
26
#define MDIV_MASK GENMASK(21, 12)
27
- #define PDIV_SHIFT 4
28
27
#define PDIV_MASK GENMASK(9, 4)
29
- #define SDIV_SHIFT 0
30
28
#define SDIV_MASK GENMASK(2, 0)
31
- #define KDIV_SHIFT 0
32
29
#define KDIV_MASK GENMASK(15, 0)
33
30
34
31
#define LOCK_TIMEOUT_US 10000
@@ -124,9 +121,9 @@ static unsigned long clk_pll1416x_recalc_rate(struct clk_hw *hw,
124
121
u64 fvco = parent_rate ;
125
122
126
123
pll_div = readl_relaxed (pll -> base + DIV_CTL0 );
127
- mdiv = ( pll_div & MDIV_MASK ) >> MDIV_SHIFT ;
128
- pdiv = ( pll_div & PDIV_MASK ) >> PDIV_SHIFT ;
129
- sdiv = ( pll_div & SDIV_MASK ) >> SDIV_SHIFT ;
124
+ mdiv = FIELD_GET ( MDIV_MASK , pll_div ) ;
125
+ pdiv = FIELD_GET ( PDIV_MASK , pll_div ) ;
126
+ sdiv = FIELD_GET ( SDIV_MASK , pll_div ) ;
130
127
131
128
fvco *= mdiv ;
132
129
do_div (fvco , pdiv << sdiv );
@@ -144,10 +141,10 @@ static unsigned long clk_pll1443x_recalc_rate(struct clk_hw *hw,
144
141
145
142
pll_div_ctl0 = readl_relaxed (pll -> base + DIV_CTL0 );
146
143
pll_div_ctl1 = readl_relaxed (pll -> base + DIV_CTL1 );
147
- mdiv = ( pll_div_ctl0 & MDIV_MASK ) >> MDIV_SHIFT ;
148
- pdiv = ( pll_div_ctl0 & PDIV_MASK ) >> PDIV_SHIFT ;
149
- sdiv = ( pll_div_ctl0 & SDIV_MASK ) >> SDIV_SHIFT ;
150
- kdiv = pll_div_ctl1 & KDIV_MASK ;
144
+ mdiv = FIELD_GET ( MDIV_MASK , pll_div_ctl0 ) ;
145
+ pdiv = FIELD_GET ( PDIV_MASK , pll_div_ctl0 ) ;
146
+ sdiv = FIELD_GET ( SDIV_MASK , pll_div_ctl0 ) ;
147
+ kdiv = FIELD_GET ( KDIV_MASK , pll_div_ctl1 ) ;
151
148
152
149
/* fvco = (m * 65536 + k) * Fin / (p * 65536) */
153
150
fvco *= (mdiv * 65536 + kdiv );
@@ -163,8 +160,8 @@ static inline bool clk_pll14xx_mp_change(const struct imx_pll14xx_rate_table *ra
163
160
{
164
161
u32 old_mdiv , old_pdiv ;
165
162
166
- old_mdiv = ( pll_div & MDIV_MASK ) >> MDIV_SHIFT ;
167
- old_pdiv = ( pll_div & PDIV_MASK ) >> PDIV_SHIFT ;
163
+ old_mdiv = FIELD_GET ( MDIV_MASK , pll_div ) ;
164
+ old_pdiv = FIELD_GET ( PDIV_MASK , pll_div ) ;
168
165
169
166
return rate -> mdiv != old_mdiv || rate -> pdiv != old_pdiv ;
170
167
}
@@ -196,7 +193,7 @@ static int clk_pll1416x_set_rate(struct clk_hw *hw, unsigned long drate,
196
193
197
194
if (!clk_pll14xx_mp_change (rate , tmp )) {
198
195
tmp &= ~SDIV_MASK ;
199
- tmp |= rate -> sdiv << SDIV_SHIFT ;
196
+ tmp |= FIELD_PREP ( SDIV_MASK , rate -> sdiv ) ;
200
197
writel_relaxed (tmp , pll -> base + DIV_CTL0 );
201
198
202
199
return 0 ;
@@ -215,8 +212,8 @@ static int clk_pll1416x_set_rate(struct clk_hw *hw, unsigned long drate,
215
212
tmp |= BYPASS_MASK ;
216
213
writel (tmp , pll -> base + GNRL_CTL );
217
214
218
- div_val = ( rate -> mdiv << MDIV_SHIFT ) | ( rate -> pdiv << PDIV_SHIFT ) |
219
- ( rate -> sdiv << SDIV_SHIFT );
215
+ div_val = FIELD_PREP ( MDIV_MASK , rate -> mdiv ) | FIELD_PREP ( PDIV_MASK , rate -> pdiv ) |
216
+ FIELD_PREP ( SDIV_MASK , rate -> sdiv );
220
217
writel_relaxed (div_val , pll -> base + DIV_CTL0 );
221
218
222
219
/*
@@ -262,10 +259,10 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate,
262
259
263
260
if (!clk_pll14xx_mp_change (rate , tmp )) {
264
261
tmp &= ~SDIV_MASK ;
265
- tmp |= rate -> sdiv << SDIV_SHIFT ;
262
+ tmp |= FIELD_PREP ( SDIV_MASK , rate -> sdiv ) ;
266
263
writel_relaxed (tmp , pll -> base + DIV_CTL0 );
267
264
268
- tmp = rate -> kdiv << KDIV_SHIFT ;
265
+ tmp = FIELD_PREP ( KDIV_MASK , rate -> kdiv ) ;
269
266
writel_relaxed (tmp , pll -> base + DIV_CTL1 );
270
267
271
268
return 0 ;
@@ -280,10 +277,11 @@ static int clk_pll1443x_set_rate(struct clk_hw *hw, unsigned long drate,
280
277
tmp |= BYPASS_MASK ;
281
278
writel_relaxed (tmp , pll -> base + GNRL_CTL );
282
279
283
- div_val = (rate -> mdiv << MDIV_SHIFT ) | (rate -> pdiv << PDIV_SHIFT ) |
284
- (rate -> sdiv << SDIV_SHIFT );
280
+ div_val = FIELD_PREP (MDIV_MASK , rate -> mdiv ) |
281
+ FIELD_PREP (PDIV_MASK , rate -> pdiv ) |
282
+ FIELD_PREP (SDIV_MASK , rate -> sdiv );
285
283
writel_relaxed (div_val , pll -> base + DIV_CTL0 );
286
- writel_relaxed (rate -> kdiv << KDIV_SHIFT , pll -> base + DIV_CTL1 );
284
+ writel_relaxed (FIELD_PREP ( KDIV_MASK , rate -> kdiv ) , pll -> base + DIV_CTL1 );
287
285
288
286
/*
289
287
* According to SPEC, t3 - t2 need to be greater than
0 commit comments