Skip to content

Commit e9ed1ef

Browse files
Marek Vasutbebarino
authored andcommitted
clk: stm32mp1: Add parent_data to ETHRX clock
Pass parent_data to ETHRX clock with new fw_name = "ETH_RX_CLK/ETH_REF_CLK". By default, this change has no impact on the operation of the clock driver. However, due to the fw_name, it permits DT to override ETHRX clock parent, which might be needed in case the ETHRX clock are supplied by external clock source. Example of MCO2 supplying clock to ETH_RX_CLK via external pad-to-pad wire: &rcc { clocks = <&rcc CK_MCO2>; clock-names = "ETH_RX_CLK/ETH_REF_CLK"; }; Note that while this patch permits to implement this rare usecase, the issue with ethernet RX and TX input clock modeling on MP1 is far more complex and requires more core plumbing. [1] STM32MP1 Reference Manual RM0436 Rev 3, Page 574, Figure 83. Peripheral clock distribution for Ethernet https://www.st.com/resource/en/reference_manual/dm00327659-stm32mp157-advanced-armbased-32bit-mpus-stmicroelectronics.pdf Signed-off-by: Marek Vasut <marex@denx.de> Cc: Alexandre Torgue <alexandre.torgue@foss.st.com> Cc: Christophe Roullier <christophe.roullier@foss.st.com> Cc: Gabriel Fernandez <gabriel.fernandez@foss.st.com> Cc: Patrice Chotard <patrice.chotard@foss.st.com> Cc: Patrick Delaunay <patrick.delaunay@foss.st.com> Cc: linux-clk@vger.kernel.org Cc: linux-stm32@st-md-mailman.stormreply.com Link: https://lore.kernel.org/r/20220118202958.1840431-2-marex@denx.de Tested-by: Johann Neuhauser <jneuhauser@dh-electronics.com> Acked-by: Gabriel Fernandez <gabriel.fernandez@foss.st.com> Signed-off-by: Stephen Boyd <sboyd@kernel.org>
1 parent e33b88b commit e9ed1ef

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

drivers/clk/clk-stm32mp1.c

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ static const char * const eth_src[] = {
155155
"pll4_p", "pll3_q"
156156
};
157157

158+
const struct clk_parent_data ethrx_src[] = {
159+
{ .name = "ethck_k", .fw_name = "ETH_RX_CLK/ETH_REF_CLK" },
160+
};
161+
158162
static const char * const rng_src[] = {
159163
"ck_csi", "pll4_r", "ck_lse", "ck_lsi"
160164
};
@@ -317,6 +321,7 @@ struct clock_config {
317321
const char *name;
318322
const char *parent_name;
319323
const char * const *parent_names;
324+
const struct clk_parent_data *parent_data;
320325
int num_parents;
321326
unsigned long flags;
322327
void *cfg;
@@ -576,6 +581,7 @@ static struct clk_hw *
576581
clk_stm32_register_gate_ops(struct device *dev,
577582
const char *name,
578583
const char *parent_name,
584+
const struct clk_parent_data *parent_data,
579585
unsigned long flags,
580586
void __iomem *base,
581587
const struct stm32_gate_cfg *cfg,
@@ -586,7 +592,10 @@ clk_stm32_register_gate_ops(struct device *dev,
586592
int ret;
587593

588594
init.name = name;
589-
init.parent_names = &parent_name;
595+
if (parent_name)
596+
init.parent_names = &parent_name;
597+
if (parent_data)
598+
init.parent_data = parent_data;
590599
init.num_parents = 1;
591600
init.flags = flags;
592601

@@ -611,6 +620,7 @@ clk_stm32_register_gate_ops(struct device *dev,
611620
static struct clk_hw *
612621
clk_stm32_register_composite(struct device *dev,
613622
const char *name, const char * const *parent_names,
623+
const struct clk_parent_data *parent_data,
614624
int num_parents, void __iomem *base,
615625
const struct stm32_composite_cfg *cfg,
616626
unsigned long flags, spinlock_t *lock)
@@ -1135,6 +1145,7 @@ _clk_stm32_register_gate(struct device *dev,
11351145
return clk_stm32_register_gate_ops(dev,
11361146
cfg->name,
11371147
cfg->parent_name,
1148+
cfg->parent_data,
11381149
cfg->flags,
11391150
base,
11401151
cfg->cfg,
@@ -1148,8 +1159,8 @@ _clk_stm32_register_composite(struct device *dev,
11481159
const struct clock_config *cfg)
11491160
{
11501161
return clk_stm32_register_composite(dev, cfg->name, cfg->parent_names,
1151-
cfg->num_parents, base, cfg->cfg,
1152-
cfg->flags, lock);
1162+
cfg->parent_data, cfg->num_parents,
1163+
base, cfg->cfg, cfg->flags, lock);
11531164
}
11541165

11551166
#define GATE(_id, _name, _parent, _flags, _offset, _bit_idx, _gate_flags)\
@@ -1258,6 +1269,16 @@ _clk_stm32_register_composite(struct device *dev,
12581269
.func = _clk_stm32_register_gate,\
12591270
}
12601271

1272+
#define STM32_GATE_PDATA(_id, _name, _parent, _flags, _gate)\
1273+
{\
1274+
.id = _id,\
1275+
.name = _name,\
1276+
.parent_data = _parent,\
1277+
.flags = _flags,\
1278+
.cfg = (struct stm32_gate_cfg *) {_gate},\
1279+
.func = _clk_stm32_register_gate,\
1280+
}
1281+
12611282
#define _STM32_GATE(_gate_offset, _gate_bit_idx, _gate_flags, _mgate, _ops)\
12621283
(&(struct stm32_gate_cfg) {\
12631284
&(struct gate_cfg) {\
@@ -1291,6 +1312,10 @@ _clk_stm32_register_composite(struct device *dev,
12911312
STM32_GATE(_id, _name, _parent, _flags,\
12921313
_STM32_MGATE(_mgate))
12931314

1315+
#define MGATE_MP1_PDATA(_id, _name, _parent, _flags, _mgate)\
1316+
STM32_GATE_PDATA(_id, _name, _parent, _flags,\
1317+
_STM32_MGATE(_mgate))
1318+
12941319
#define _STM32_DIV(_div_offset, _div_shift, _div_width,\
12951320
_div_flags, _div_table, _ops)\
12961321
.div = &(struct stm32_div_cfg) {\
@@ -1354,6 +1379,9 @@ _clk_stm32_register_composite(struct device *dev,
13541379
#define PCLK(_id, _name, _parent, _flags, _mgate)\
13551380
MGATE_MP1(_id, _name, _parent, _flags, _mgate)
13561381

1382+
#define PCLK_PDATA(_id, _name, _parent, _flags, _mgate)\
1383+
MGATE_MP1_PDATA(_id, _name, _parent, _flags, _mgate)
1384+
13571385
#define KCLK(_id, _name, _parents, _flags, _mgate, _mmux)\
13581386
COMPOSITE(_id, _name, _parents, CLK_OPS_PARENT_ENABLE |\
13591387
CLK_SET_RATE_NO_REPARENT | _flags,\
@@ -1951,7 +1979,7 @@ static const struct clock_config stm32mp1_clock_cfg[] = {
19511979
PCLK(MDMA, "mdma", "ck_axi", 0, G_MDMA),
19521980
PCLK(GPU, "gpu", "ck_axi", 0, G_GPU),
19531981
PCLK(ETHTX, "ethtx", "ck_axi", 0, G_ETHTX),
1954-
PCLK(ETHRX, "ethrx", "ck_axi", 0, G_ETHRX),
1982+
PCLK_PDATA(ETHRX, "ethrx", ethrx_src, 0, G_ETHRX),
19551983
PCLK(ETHMAC, "ethmac", "ck_axi", 0, G_ETHMAC),
19561984
PCLK(FMC, "fmc", "ck_axi", CLK_IGNORE_UNUSED, G_FMC),
19571985
PCLK(QSPI, "qspi", "ck_axi", CLK_IGNORE_UNUSED, G_QSPI),

0 commit comments

Comments
 (0)