Skip to content

Commit dd9c697

Browse files
committed
Merge branches 'clk-microchip', 'clk-mmp', 'clk-unused' and 'clk-at91' into clk-next
- Add support for SAMA7G5 SoC clks - Microchip Sparx5 DPLL clk * clk-microchip: clk: sparx5: Add Sparx5 SoC DPLL clock driver dt-bindings: clock: sparx5: Add bindings include file * clk-mmp: clk: mmp: avoid missing prototype warning * clk-unused: clk: drop unused function __clk_get_flags * clk-at91: clk: at91: sama7g5: add clock support for sama7g5 clk: at91: clk-utmi: add utmi support for sama7g5 clk: at91: clk-sam9x60-pll: re-factor to support plls with multiple outputs clk: at91: add macro for pll ids mask clk: at91: clk-programmable: add mux_table option clk: at91: clk-peripheral: add support for changeable parent rate clk: at91: clk-master: add master clock support for SAMA7G5 clk: at91: clk-generated: add mux_table option clk: at91: clk-generated: pass the id of changeable parent at registration clk: at91: replace conditional operator with double logical not clk: at91: sckc: register slow_rc with accuracy option clk: at91: sam9x60: fix main rc oscillator frequency clk: at91: sam9x60-pll: use frac when setting frequency clk: at91: sam9x60-pll: check fcore against ranges clk: at91: sam9x60-pll: use logical or for range check clk: at91: clk-sam9x60-pll: fix mul mask clk: at91: clk-generated: check best_rate against ranges clk: at91: clk-generated: continue if __clk_determine_rate() returns error clk: at91: fix possible dead lock in new drivers
5 parents 1a91e31 + 53727eb + 4aeccdf + 6cfde88 + cb783bb commit dd9c697

31 files changed

+2465
-286
lines changed

drivers/clk/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ obj-$(CONFIG_COMMON_CLK_CDCE925) += clk-cdce925.o
2828
obj-$(CONFIG_ARCH_CLPS711X) += clk-clps711x.o
2929
obj-$(CONFIG_COMMON_CLK_CS2000_CP) += clk-cs2000-cp.o
3030
obj-$(CONFIG_ARCH_EFM32) += clk-efm32gg.o
31+
obj-$(CONFIG_ARCH_SPARX5) += clk-sparx5.o
3132
obj-$(CONFIG_COMMON_CLK_FIXED_MMIO) += clk-fixed-mmio.o
3233
obj-$(CONFIG_COMMON_CLK_FSL_SAI) += clk-fsl-sai.o
3334
obj-$(CONFIG_COMMON_CLK_GEMINI) += clk-gemini.o

drivers/clk/at91/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ obj-$(CONFIG_SOC_SAM9X60) += sam9x60.o
2323
obj-$(CONFIG_SOC_SAMA5D3) += sama5d3.o
2424
obj-$(CONFIG_SOC_SAMA5D4) += sama5d4.o
2525
obj-$(CONFIG_SOC_SAMA5D2) += sama5d2.o
26+
obj-$(CONFIG_SOC_SAMA7G5) += sama7g5.o

drivers/clk/at91/at91rm9200.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ static void __init at91rm9200_pmc_setup(struct device_node *np)
160160

161161
hw = at91_clk_register_programmable(regmap, name,
162162
parent_names, 4, i,
163-
&at91rm9200_programmable_layout);
163+
&at91rm9200_programmable_layout,
164+
NULL);
164165
if (IS_ERR(hw))
165166
goto err_free;
166167

drivers/clk/at91/at91sam9260.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ static void __init at91sam926x_pmc_setup(struct device_node *np,
436436

437437
hw = at91_clk_register_programmable(regmap, name,
438438
parent_names, 4, i,
439-
&at91rm9200_programmable_layout);
439+
&at91rm9200_programmable_layout,
440+
NULL);
440441
if (IS_ERR(hw))
441442
goto err_free;
442443

drivers/clk/at91/at91sam9g45.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np)
111111
return;
112112
mainxtal_name = of_clk_get_parent_name(np, i);
113113

114-
regmap = syscon_node_to_regmap(np);
114+
regmap = device_node_to_regmap(np);
115115
if (IS_ERR(regmap))
116116
return;
117117

@@ -181,7 +181,8 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np)
181181

182182
hw = at91_clk_register_programmable(regmap, name,
183183
parent_names, 5, i,
184-
&at91sam9g45_programmable_layout);
184+
&at91sam9g45_programmable_layout,
185+
NULL);
185186
if (IS_ERR(hw))
186187
goto err_free;
187188

drivers/clk/at91/at91sam9n12.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
124124
return;
125125
mainxtal_name = of_clk_get_parent_name(np, i);
126126

127-
regmap = syscon_node_to_regmap(np);
127+
regmap = device_node_to_regmap(np);
128128
if (IS_ERR(regmap))
129129
return;
130130

@@ -199,7 +199,8 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
199199

200200
hw = at91_clk_register_programmable(regmap, name,
201201
parent_names, 5, i,
202-
&at91sam9x5_programmable_layout);
202+
&at91sam9x5_programmable_layout,
203+
NULL);
203204
if (IS_ERR(hw))
204205
goto err_free;
205206

@@ -222,7 +223,7 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
222223
at91sam9n12_periphck[i].n,
223224
"masterck",
224225
at91sam9n12_periphck[i].id,
225-
&range);
226+
&range, INT_MIN);
226227
if (IS_ERR(hw))
227228
goto err_free;
228229

drivers/clk/at91/at91sam9rl.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ static void __init at91sam9rl_pmc_setup(struct device_node *np)
137137

138138
hw = at91_clk_register_programmable(regmap, name,
139139
parent_names, 5, i,
140-
&at91rm9200_programmable_layout);
140+
&at91rm9200_programmable_layout,
141+
NULL);
141142
if (IS_ERR(hw))
142143
goto err_free;
143144

drivers/clk/at91/at91sam9x5.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,8 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
226226

227227
hw = at91_clk_register_programmable(regmap, name,
228228
parent_names, 5, i,
229-
&at91sam9x5_programmable_layout);
229+
&at91sam9x5_programmable_layout,
230+
NULL);
230231
if (IS_ERR(hw))
231232
goto err_free;
232233

@@ -257,7 +258,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
257258
at91sam9x5_periphck[i].n,
258259
"masterck",
259260
at91sam9x5_periphck[i].id,
260-
&range);
261+
&range, INT_MIN);
261262
if (IS_ERR(hw))
262263
goto err_free;
263264

@@ -270,7 +271,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
270271
extra_pcks[i].n,
271272
"masterck",
272273
extra_pcks[i].id,
273-
&range);
274+
&range, INT_MIN);
274275
if (IS_ERR(hw))
275276
goto err_free;
276277

drivers/clk/at91/clk-generated.c

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,17 @@
1818

1919
#define GENERATED_MAX_DIV 255
2020

21-
#define GCK_INDEX_DT_AUDIO_PLL 5
22-
2321
struct clk_generated {
2422
struct clk_hw hw;
2523
struct regmap *regmap;
2624
struct clk_range range;
2725
spinlock_t *lock;
26+
u32 *mux_table;
2827
u32 id;
2928
u32 gckdiv;
3029
const struct clk_pcr_layout *layout;
3130
u8 parent_id;
32-
bool audio_pll_allowed;
31+
int chg_pid;
3332
};
3433

3534
#define to_clk_generated(hw) \
@@ -83,7 +82,7 @@ static int clk_generated_is_enabled(struct clk_hw *hw)
8382
regmap_read(gck->regmap, gck->layout->offset, &status);
8483
spin_unlock_irqrestore(gck->lock, flags);
8584

86-
return status & AT91_PMC_PCR_GCKEN ? 1 : 0;
85+
return !!(status & AT91_PMC_PCR_GCKEN);
8786
}
8887

8988
static unsigned long
@@ -109,7 +108,7 @@ static void clk_generated_best_diff(struct clk_rate_request *req,
109108
tmp_rate = parent_rate / div;
110109
tmp_diff = abs(req->rate - tmp_rate);
111110

112-
if (*best_diff < 0 || *best_diff > tmp_diff) {
111+
if (*best_diff < 0 || *best_diff >= tmp_diff) {
113112
*best_rate = tmp_rate;
114113
*best_diff = tmp_diff;
115114
req->best_parent_rate = parent_rate;
@@ -129,7 +128,10 @@ static int clk_generated_determine_rate(struct clk_hw *hw,
129128
int i;
130129
u32 div;
131130

132-
for (i = 0; i < clk_hw_get_num_parents(hw) - 1; i++) {
131+
for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
132+
if (gck->chg_pid == i)
133+
continue;
134+
133135
parent = clk_hw_get_parent_by_index(hw, i);
134136
if (!parent)
135137
continue;
@@ -161,16 +163,17 @@ static int clk_generated_determine_rate(struct clk_hw *hw,
161163
* that the only clks able to modify gck rate are those of audio IPs.
162164
*/
163165

164-
if (!gck->audio_pll_allowed)
166+
if (gck->chg_pid < 0)
165167
goto end;
166168

167-
parent = clk_hw_get_parent_by_index(hw, GCK_INDEX_DT_AUDIO_PLL);
169+
parent = clk_hw_get_parent_by_index(hw, gck->chg_pid);
168170
if (!parent)
169171
goto end;
170172

171173
for (div = 1; div < GENERATED_MAX_DIV + 2; div++) {
172174
req_parent.rate = req->rate * div;
173-
__clk_determine_rate(parent, &req_parent);
175+
if (__clk_determine_rate(parent, &req_parent))
176+
continue;
174177
clk_generated_best_diff(req, parent, req_parent.rate, div,
175178
&best_diff, &best_rate);
176179

@@ -184,8 +187,8 @@ static int clk_generated_determine_rate(struct clk_hw *hw,
184187
__clk_get_name((req->best_parent_hw)->clk),
185188
req->best_parent_rate);
186189

187-
if (best_rate < 0)
188-
return best_rate;
190+
if (best_rate < 0 || (gck->range.max && best_rate > gck->range.max))
191+
return -EINVAL;
189192

190193
req->rate = best_rate;
191194
return 0;
@@ -199,7 +202,11 @@ static int clk_generated_set_parent(struct clk_hw *hw, u8 index)
199202
if (index >= clk_hw_get_num_parents(hw))
200203
return -EINVAL;
201204

202-
gck->parent_id = index;
205+
if (gck->mux_table)
206+
gck->parent_id = clk_mux_index_to_val(gck->mux_table, 0, index);
207+
else
208+
gck->parent_id = index;
209+
203210
return 0;
204211
}
205212

@@ -271,8 +278,9 @@ struct clk_hw * __init
271278
at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
272279
const struct clk_pcr_layout *layout,
273280
const char *name, const char **parent_names,
274-
u8 num_parents, u8 id, bool pll_audio,
275-
const struct clk_range *range)
281+
u32 *mux_table, u8 num_parents, u8 id,
282+
const struct clk_range *range,
283+
int chg_pid)
276284
{
277285
struct clk_generated *gck;
278286
struct clk_init_data init;
@@ -287,16 +295,18 @@ at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock,
287295
init.ops = &generated_ops;
288296
init.parent_names = parent_names;
289297
init.num_parents = num_parents;
290-
init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
291-
CLK_SET_RATE_PARENT;
298+
init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
299+
if (chg_pid >= 0)
300+
init.flags |= CLK_SET_RATE_PARENT;
292301

293302
gck->id = id;
294303
gck->hw.init = &init;
295304
gck->regmap = regmap;
296305
gck->lock = lock;
297306
gck->range = *range;
298-
gck->audio_pll_allowed = pll_audio;
307+
gck->chg_pid = chg_pid;
299308
gck->layout = layout;
309+
gck->mux_table = mux_table;
300310

301311
clk_generated_startup(gck);
302312
hw = &gck->hw;

drivers/clk/at91/clk-main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ static bool clk_main_rc_osc_ready(struct regmap *regmap)
175175

176176
regmap_read(regmap, AT91_PMC_SR, &status);
177177

178-
return status & AT91_PMC_MOSCRCS;
178+
return !!(status & AT91_PMC_MOSCRCS);
179179
}
180180

181181
static int clk_main_rc_osc_prepare(struct clk_hw *hw)
@@ -336,7 +336,7 @@ static int clk_rm9200_main_is_prepared(struct clk_hw *hw)
336336

337337
regmap_read(clkmain->regmap, AT91_CKGR_MCFR, &status);
338338

339-
return status & AT91_PMC_MAINRDY ? 1 : 0;
339+
return !!(status & AT91_PMC_MAINRDY);
340340
}
341341

342342
static unsigned long clk_rm9200_main_recalc_rate(struct clk_hw *hw,
@@ -398,7 +398,7 @@ static inline bool clk_sam9x5_main_ready(struct regmap *regmap)
398398

399399
regmap_read(regmap, AT91_PMC_SR, &status);
400400

401-
return status & AT91_PMC_MOSCSELS ? 1 : 0;
401+
return !!(status & AT91_PMC_MOSCSELS);
402402
}
403403

404404
static int clk_sam9x5_main_prepare(struct clk_hw *hw)

0 commit comments

Comments
 (0)