Skip to content

Commit 08422c6

Browse files
Gabriel-FernandzPatrice CHOTARD
authored andcommitted
clk: stm32: Update clock management for STM32MP13/21/25
During clock's registration, clock's name are used to establish parent - child relation. Most of SCMI clocks are parent clocks. Since commit fdb1bff ("clk: scmi: Postpone clock name resolution"), all scmi clocks are named by default "scmi-%zu" until they are enabled, it breaks clocks registration and boot process for STM32MP13/25 platforms. Rework the STM32 core clock driver and STM32MP13/21/25 clock description to use clock index instead of their real name. Introduce struct clk_parent_data which allows to identify parent clock either by index or by name. Name is only used for particular clocks provided by IP which are clock provider as i2s/i2s_ckin, usb0/ck_usbo_48m, and ltdc/ck_ker_ltdc. STM32_GATE() and STM32_COMPOSITE_NOMUX macros are updated in order to use parent clock index. Change-Id: I7c7179df6ef3c9d4728c697bd0285e0fd908dcc3 Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com> Signed-off-by: Gabriel Fernandez <gabriel.fernandez@foss.st.com> Reviewed-on: https://gerrit.st.com/c/mpu/oe/st/u-boot/+/543952 ACI: CIBUILD <MDG-smet-aci-builds@list.st.com>
1 parent 7fbc677 commit 08422c6

5 files changed

Lines changed: 848 additions & 447 deletions

File tree

drivers/clk/stm32/clk-stm32-core.c

Lines changed: 93 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include <log.h>
1313
#include <asm/io.h>
1414
#include <dm/device_compat.h>
15+
#include <dm/devres.h>
16+
#include <dm/uclass-internal.h>
1517
#include <linux/clk-provider.h>
1618
#include "clk-stm32-core.h"
1719

@@ -35,8 +37,8 @@ int stm32_rcc_init(struct udevice *dev,
3537
return -ENOMEM;
3638

3739
priv->gate_cpt = cpt;
38-
39-
priv->data = clock_data;
40+
priv->clock_data = clock_data;
41+
priv->match_data = data;
4042

4143
for (i = 0; i < data->num_clocks; i++) {
4244
const struct clock_config *cfg = &data->tab_clocks[i];
@@ -58,9 +60,50 @@ int stm32_rcc_init(struct udevice *dev,
5860
return 0;
5961
}
6062

61-
ulong clk_stm32_get_rate_by_name(const char *name)
63+
static int clk_stm32_resolve_clk_name(struct udevice *dev, int idx, const char **name)
64+
{
65+
struct ofnode_phandle_args args;
66+
struct udevice *clk_udevice;
67+
struct udevice *child;
68+
int ret;
69+
70+
ret = dev_read_phandle_with_args(dev, "clocks", "#clock-cells", 0, idx, &args);
71+
if (ret) {
72+
dev_err(dev, "%s: dev_read_phandle_with_args failed: err=%d\n",
73+
__func__, ret);
74+
return ret;
75+
}
76+
77+
ret = uclass_find_device_by_ofnode(UCLASS_CLK, args.node, &clk_udevice);
78+
if (ret)
79+
return ret;
80+
81+
if (args.args_count) {
82+
device_foreach_child(child, clk_udevice) {
83+
struct clk *clkp;
84+
85+
clkp = dev_get_clk_ptr(child);
86+
if (clk_get_id(clkp) == args.args[0])
87+
break;
88+
89+
clk_udevice = child;
90+
}
91+
*name = child->name;
92+
} else {
93+
*name = clk_udevice->name;
94+
}
95+
96+
return 0;
97+
}
98+
99+
ulong clk_stm32_get_rate_by_index(struct udevice *dev, int index)
62100
{
63-
struct udevice *dev;
101+
const char *name;
102+
int ret;
103+
104+
ret = clk_stm32_resolve_clk_name(dev, index, &name);
105+
if (ret)
106+
return ret;
64107

65108
if (!uclass_get_device_by_name(UCLASS_CLK, name, &dev)) {
66109
struct clk *clk = dev_get_clk_ptr(dev);
@@ -172,7 +215,7 @@ static int clk_stm32_gate_enable(struct clk *clk)
172215
struct clk_stm32_gate *stm32_gate = to_clk_stm32_gate(clk);
173216
struct stm32mp_rcc_priv *priv = stm32_gate->priv;
174217

175-
clk_stm32_gate_set_state(priv->base, priv->data, priv->gate_cpt,
218+
clk_stm32_gate_set_state(priv->base, priv->clock_data, priv->gate_cpt,
176219
stm32_gate->gate_id, 1);
177220

178221
return 0;
@@ -183,7 +226,7 @@ static int clk_stm32_gate_disable(struct clk *clk)
183226
struct clk_stm32_gate *stm32_gate = to_clk_stm32_gate(clk);
184227
struct stm32mp_rcc_priv *priv = stm32_gate->priv;
185228

186-
clk_stm32_gate_set_state(priv->base, priv->data, priv->gate_cpt,
229+
clk_stm32_gate_set_state(priv->base, priv->clock_data, priv->gate_cpt,
187230
stm32_gate->gate_id, 0);
188231

189232
return 0;
@@ -210,6 +253,7 @@ struct clk *clk_stm32_gate_register(struct udevice *dev,
210253
struct stm32_clk_gate_cfg *clk_cfg = cfg->clock_cfg;
211254
struct clk_stm32_gate *stm32_gate;
212255
struct clk *clk;
256+
const char *parent_name;
213257
int ret;
214258

215259
stm32_gate = kzalloc(sizeof(*stm32_gate), GFP_KERNEL);
@@ -222,8 +266,17 @@ struct clk *clk_stm32_gate_register(struct udevice *dev,
222266
clk = &stm32_gate->clk;
223267
clk->flags = cfg->flags;
224268

269+
if (cfg->parent_data->name) {
270+
parent_name = cfg->parent_data->name;
271+
} else {
272+
ret = clk_stm32_resolve_clk_name(dev, cfg->parent_data->index,
273+
&parent_name);
274+
if (ret)
275+
return ERR_PTR(ret);
276+
}
277+
225278
ret = clk_register(clk, UBOOT_DM_CLK_STM32_GATE,
226-
cfg->name, cfg->parent_name);
279+
cfg->name, parent_name);
227280
if (ret) {
228281
kfree(stm32_gate);
229282
return ERR_PTR(ret);
@@ -237,7 +290,7 @@ clk_stm32_register_composite(struct udevice *dev,
237290
const struct clock_config *cfg)
238291
{
239292
struct stm32_clk_composite_cfg *composite = cfg->clock_cfg;
240-
const char *const *parent_names;
293+
const char **parent_names = NULL;
241294
int num_parents;
242295
struct clk *clk = ERR_PTR(-ENOMEM);
243296
struct clk_mux *mux = NULL;
@@ -250,7 +303,8 @@ clk_stm32_register_composite(struct udevice *dev,
250303
struct clk *div_clk = NULL;
251304
const struct clk_ops *div_ops = NULL;
252305
struct stm32mp_rcc_priv *priv = dev_get_priv(dev);
253-
const struct clk_stm32_clock_data *data = priv->data;
306+
const struct clk_stm32_clock_data *data = priv->clock_data;
307+
int i, ret;
254308

255309
if (composite->mux_id != NO_STM32_MUX) {
256310
const struct stm32_mux_cfg *mux_cfg;
@@ -261,27 +315,50 @@ clk_stm32_register_composite(struct udevice *dev,
261315

262316
mux_cfg = &data->muxes[composite->mux_id];
263317

318+
parent_names = devm_kcalloc(dev, mux_cfg->num_parents,
319+
sizeof(char *), GFP_KERNEL);
320+
if (!parent_names)
321+
goto fail;
322+
264323
mux->reg = priv->base + mux_cfg->reg_off;
265324
mux->shift = mux_cfg->shift;
266325
mux->mask = BIT(mux_cfg->width) - 1;
267326
mux->num_parents = mux_cfg->num_parents;
268327
mux->flags = 0;
269-
mux->parent_names = mux_cfg->parent_names;
270328

329+
for (i = 0; i < mux_cfg->num_parents; i++) {
330+
if (mux_cfg->parent_data[i].name) {
331+
parent_names[i] = mux_cfg->parent_data[i].name;
332+
} else {
333+
ret = clk_stm32_resolve_clk_name(dev,
334+
mux_cfg->parent_data[i].index,
335+
&parent_names[i]);
336+
if (ret)
337+
return ERR_CAST(clk);
338+
}
339+
}
340+
341+
mux->parent_names = (const char * const*)parent_names;
271342
mux_clk = &mux->clk;
272343
mux_ops = &clk_mux_ops;
273-
274-
parent_names = mux_cfg->parent_names;
275344
num_parents = mux_cfg->num_parents;
276345
} else {
277-
parent_names = &cfg->parent_name;
346+
parent_names = devm_kzalloc(dev, sizeof(char *), GFP_KERNEL);
347+
if (!parent_names)
348+
goto fail;
349+
350+
ret = clk_stm32_resolve_clk_name(dev, cfg->parent_data->index,
351+
parent_names);
352+
if (ret)
353+
return ERR_CAST(clk);
354+
278355
num_parents = 1;
279356
}
280357

281358
if (composite->div_id != NO_STM32_DIV) {
282359
const struct stm32_div_cfg *div_cfg;
283360

284-
div = kzalloc(sizeof(*div), GFP_KERNEL);
361+
div = devm_kzalloc(dev, sizeof(*div), GFP_KERNEL);
285362
if (!div)
286363
goto fail;
287364

@@ -311,7 +388,7 @@ clk_stm32_register_composite(struct udevice *dev,
311388
}
312389

313390
clk = clk_register_composite(NULL, cfg->name,
314-
parent_names, num_parents,
391+
(const char * const *)parent_names, num_parents,
315392
mux_clk, mux_ops,
316393
div_clk, div_ops,
317394
gate_clk, gate_ops,
@@ -322,6 +399,7 @@ clk_stm32_register_composite(struct udevice *dev,
322399
return clk;
323400

324401
fail:
402+
kfree(parent_names);
325403
kfree(gate);
326404
kfree(div);
327405
kfree(mux);

drivers/clk/stm32/clk-stm32-core.h

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,20 @@
66

77
struct stm32_clock_match_data;
88

9+
/**
10+
* struct clk_parent_data - clk parent information
11+
* @name: globally unique parent name
12+
* @index: parent index local to provider registering clk
13+
*/
14+
struct clk_parent_data {
15+
const char *name;
16+
int index;
17+
};
18+
919
/**
1020
* struct stm32_mux_cfg - multiplexer configuration
1121
*
12-
* @parent_names: array of string names for all possible parents
22+
* @parent_data: array of parent information for all possible parent
1323
* @num_parents: number of possible parents
1424
* @reg_off: register controlling multiplexer
1525
* @shift: shift to multiplexer bit field
@@ -19,7 +29,7 @@ struct stm32_clock_match_data;
1929
* index
2030
*/
2131
struct stm32_mux_cfg {
22-
const char * const *parent_names;
32+
const struct clk_parent_data *parent_data;
2333
u8 num_parents;
2434
u32 reg_off;
2535
u8 shift;
@@ -81,7 +91,7 @@ struct stm32_composite_cfg {
8191
*
8292
* @id: binding id of the clock
8393
* @name: clock name
84-
* @parent_name: name of the clock parent
94+
* @parent_data: parent information
8595
* @flags: framework-specific flags
8696
* @sec_id: secure id (use to known if the clock is secured or not)
8797
* @clock_cfg: specific clock data configuration
@@ -91,7 +101,7 @@ struct stm32_composite_cfg {
91101
struct clock_config {
92102
unsigned long id;
93103
const char *name;
94-
const char *parent_name;
104+
const struct clk_parent_data *parent_data;
95105
unsigned long flags;
96106
int sec_id;
97107
void *clock_cfg;
@@ -129,6 +139,7 @@ struct stm32_clock_match_data {
129139
const struct clk_stm32_clock_data *clock_data;
130140
int (*check_security)(struct udevice *dev, void __iomem *base,
131141
const struct clock_config *cfg);
142+
const char *(*get_clock_name)(u8 index);
132143
};
133144

134145
/**
@@ -143,7 +154,8 @@ struct stm32_clock_match_data {
143154
struct stm32mp_rcc_priv {
144155
void __iomem *base;
145156
u8 *gate_cpt;
146-
const struct clk_stm32_clock_data *data;
157+
const struct clk_stm32_clock_data *clock_data;
158+
const struct stm32_clock_match_data *match_data;
147159
};
148160

149161
int stm32_rcc_init(struct udevice *dev,
@@ -223,12 +235,14 @@ struct stm32_clk_gate_cfg {
223235

224236
#define STM32_GATE(_id, _name, _parent, _flags, _gate_id, _sec_id) \
225237
{ \
226-
.id = _id, \
227-
.sec_id = _sec_id, \
228-
.name = _name, \
229-
.parent_name = _parent, \
230-
.flags = _flags, \
231-
.clock_cfg = &(struct stm32_clk_gate_cfg) { \
238+
.id = _id, \
239+
.sec_id = _sec_id, \
240+
.name = _name, \
241+
.parent_data = &(struct clk_parent_data) { \
242+
.index = _parent, \
243+
}, \
244+
.flags = _flags, \
245+
.clock_cfg = &(struct stm32_clk_gate_cfg) { \
232246
.gate_id = _gate_id, \
233247
}, \
234248
.setup = clk_stm32_gate_register, \
@@ -260,7 +274,9 @@ struct stm32_clk_composite_cfg {
260274
{ \
261275
.id = _id, \
262276
.name = _name, \
263-
.parent_name = _parent, \
277+
.parent_data = &(struct clk_parent_data) { \
278+
.index = _parent, \
279+
}, \
264280
.sec_id = _sec_id, \
265281
.flags = _flags, \
266282
.clock_cfg = &(struct stm32_clk_composite_cfg) { \
@@ -273,4 +289,4 @@ struct stm32_clk_composite_cfg {
273289

274290
extern const struct clk_ops stm32_clk_ops;
275291

276-
ulong clk_stm32_get_rate_by_name(const char *name);
292+
ulong clk_stm32_get_rate_by_index(struct udevice *dev, int index);

0 commit comments

Comments
 (0)