From: Johann Neuhauser <jneuhauser@dh-electronics.com>
To: "Marek MV. Vasut" <marex@denx.de>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Cc: "Marek MV. Vasut" <marex@denx.de>,
Alexandre Torgue <alexandre.torgue@foss.st.com>,
Christophe Roullier <christophe.roullier@foss.st.com>,
Gabriel Fernandez <gabriel.fernandez@foss.st.com>,
Patrice Chotard <patrice.chotard@foss.st.com>,
Patrick Delaunay <patrick.delaunay@foss.st.com>,
Stephen Boyd <sboyd@kernel.org>,
"linux-clk@vger.kernel.org" <linux-clk@vger.kernel.org>,
"linux-stm32@st-md-mailman.stormreply.com"
<linux-stm32@st-md-mailman.stormreply.com>
Subject: RE: [PATCH 2/5] clk: stm32mp1: Add parent_data to ETHRX clock
Date: Thu, 20 Jan 2022 12:07:12 +0000 [thread overview]
Message-ID: <ddf6afba3fd2402a8b3f60fe30bbdbba@dh-electronics.com> (raw)
In-Reply-To: <20220118202958.1840431-2-marex@denx.de>
> From: Marek Vasut [mailto:marex@denx.de]
> Sent: Tuesday, January 18, 2022 9:30 PM
>
> 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: Stephen Boyd <sboyd@kernel.org>
> Cc: linux-clk@vger.kernel.org
> Cc: linux-stm32@st-md-mailman.stormreply.com
> To: linux-arm-kernel@lists.infradead.org
> ---
> drivers/clk/clk-stm32mp1.c | 36 ++++++++++++++++++++++++++++++++----
> 1 file changed, 32 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/clk/clk-stm32mp1.c b/drivers/clk/clk-stm32mp1.c
> index 23a34ab459a3b..7ad2e6203baef 100644
> --- a/drivers/clk/clk-stm32mp1.c
> +++ b/drivers/clk/clk-stm32mp1.c
> @@ -155,6 +155,10 @@ static const char * const eth_src[] = {
> "pll4_p", "pll3_q"
> };
>
> +const struct clk_parent_data ethrx_src[] = {
> + { .name = "ethck_k", .fw_name = "ETH_RX_CLK/ETH_REF_CLK" },
> +};
> +
> static const char * const rng_src[] = {
> "ck_csi", "pll4_r", "ck_lse", "ck_lsi"
> };
> @@ -317,6 +321,7 @@ struct clock_config {
> const char *name;
> const char *parent_name;
> const char * const *parent_names;
> + const struct clk_parent_data *parent_data;
> int num_parents;
> unsigned long flags;
> void *cfg;
> @@ -576,6 +581,7 @@ static struct clk_hw *
> clk_stm32_register_gate_ops(struct device *dev,
> const char *name,
> const char *parent_name,
> + const struct clk_parent_data *parent_data,
> unsigned long flags,
> void __iomem *base,
> const struct stm32_gate_cfg *cfg,
> @@ -586,7 +592,10 @@ clk_stm32_register_gate_ops(struct device *dev,
> int ret;
>
> init.name = name;
> - init.parent_names = &parent_name;
> + if (parent_name)
> + init.parent_names = &parent_name;
> + if (parent_data)
> + init.parent_data = parent_data;
> init.num_parents = 1;
> init.flags = flags;
>
> @@ -611,6 +620,7 @@ clk_stm32_register_gate_ops(struct device *dev,
> static struct clk_hw *
> clk_stm32_register_composite(struct device *dev,
> const char *name, const char * const *parent_names,
> + const struct clk_parent_data *parent_data,
> int num_parents, void __iomem *base,
> const struct stm32_composite_cfg *cfg,
> unsigned long flags, spinlock_t *lock)
> @@ -1135,6 +1145,7 @@ _clk_stm32_register_gate(struct device *dev,
> return clk_stm32_register_gate_ops(dev,
> cfg->name,
> cfg->parent_name,
> + cfg->parent_data,
> cfg->flags,
> base,
> cfg->cfg,
> @@ -1148,8 +1159,8 @@ _clk_stm32_register_composite(struct device *dev,
> const struct clock_config *cfg)
> {
> return clk_stm32_register_composite(dev, cfg->name, cfg->parent_names,
> - cfg->num_parents, base, cfg->cfg,
> - cfg->flags, lock);
> + cfg->parent_data, cfg->num_parents,
> + base, cfg->cfg, cfg->flags, lock);
> }
>
> #define GATE(_id, _name, _parent, _flags, _offset, _bit_idx, _gate_flags)\
> @@ -1258,6 +1269,16 @@ _clk_stm32_register_composite(struct device *dev,
> .func = _clk_stm32_register_gate,\
> }
>
> +#define STM32_GATE_PDATA(_id, _name, _parent, _flags, _gate)\
> +{\
> + .id = _id,\
> + .name = _name,\
> + .parent_data = _parent,\
> + .flags = _flags,\
> + .cfg = (struct stm32_gate_cfg *) {_gate},\
> + .func = _clk_stm32_register_gate,\
> +}
> +
> #define _STM32_GATE(_gate_offset, _gate_bit_idx, _gate_flags, _mgate, _ops)\
> (&(struct stm32_gate_cfg) {\
> &(struct gate_cfg) {\
> @@ -1291,6 +1312,10 @@ _clk_stm32_register_composite(struct device *dev,
> STM32_GATE(_id, _name, _parent, _flags,\
> _STM32_MGATE(_mgate))
>
> +#define MGATE_MP1_PDATA(_id, _name, _parent, _flags, _mgate)\
> + STM32_GATE_PDATA(_id, _name, _parent, _flags,\
> + _STM32_MGATE(_mgate))
> +
> #define _STM32_DIV(_div_offset, _div_shift, _div_width,\
> _div_flags, _div_table, _ops)\
> .div = &(struct stm32_div_cfg) {\
> @@ -1354,6 +1379,9 @@ _clk_stm32_register_composite(struct device *dev,
> #define PCLK(_id, _name, _parent, _flags, _mgate)\
> MGATE_MP1(_id, _name, _parent, _flags, _mgate)
>
> +#define PCLK_PDATA(_id, _name, _parent, _flags, _mgate)\
> + MGATE_MP1_PDATA(_id, _name, _parent, _flags, _mgate)
> +
> #define KCLK(_id, _name, _parents, _flags, _mgate, _mmux)\
> COMPOSITE(_id, _name, _parents, CLK_OPS_PARENT_ENABLE |\
> CLK_SET_RATE_NO_REPARENT | _flags,\
> @@ -1951,7 +1979,7 @@ static const struct clock_config stm32mp1_clock_cfg[] = {
> PCLK(MDMA, "mdma", "ck_axi", 0, G_MDMA),
> PCLK(GPU, "gpu", "ck_axi", 0, G_GPU),
> PCLK(ETHTX, "ethtx", "ck_axi", 0, G_ETHTX),
> - PCLK(ETHRX, "ethrx", "ck_axi", 0, G_ETHRX),
> + PCLK_PDATA(ETHRX, "ethrx", ethrx_src, 0, G_ETHRX),
> PCLK(ETHMAC, "ethmac", "ck_axi", 0, G_ETHMAC),
> PCLK(FMC, "fmc", "ck_axi", CLK_IGNORE_UNUSED, G_FMC),
> PCLK(QSPI, "qspi", "ck_axi", CLK_IGNORE_UNUSED, G_QSPI),
> --
> 2.34.1
Tested-by: Johann Neuhauser <jneuhauser@dh-electronics.com>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-01-20 12:24 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-18 20:29 [PATCH 1/5] clk: stm32mp1: Split ETHCK_K into separate MUX and GATE clock Marek Vasut
2022-01-18 20:29 ` [PATCH 2/5] clk: stm32mp1: Add parent_data to ETHRX clock Marek Vasut
2022-01-20 12:07 ` Johann Neuhauser [this message]
2022-01-21 9:05 ` gabriel.fernandez
2022-01-25 1:16 ` Stephen Boyd
2022-01-18 20:29 ` [PATCH 3/5] ARM: dts: stm32: Add alternate pinmux for ethernet0 pins Marek Vasut
2022-01-20 12:07 ` Johann Neuhauser
2022-02-07 11:47 ` Alexandre TORGUE
2022-01-18 20:29 ` [PATCH 4/5] ARM: dts: stm32: Add alternate pinmux for mco2 pins Marek Vasut
2022-01-20 12:07 ` Johann Neuhauser
2022-02-07 11:48 ` Alexandre TORGUE
2022-01-18 20:29 ` [PATCH 5/5] ARM: dts: stm32: Switch DWMAC RMII clock to MCO2 on DHCOM Marek Vasut
2022-01-20 12:08 ` Johann Neuhauser
2022-02-07 11:49 ` Alexandre TORGUE
2022-01-20 12:07 ` [PATCH 1/5] clk: stm32mp1: Split ETHCK_K into separate MUX and GATE clock Johann Neuhauser
2022-01-20 22:03 ` Stephen Boyd
2022-01-20 22:39 ` Marek Vasut
2022-01-21 13:12 ` Marek Vasut
2022-01-21 9:03 ` gabriel.fernandez
2022-01-25 1:16 ` Stephen Boyd
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ddf6afba3fd2402a8b3f60fe30bbdbba@dh-electronics.com \
--to=jneuhauser@dh-electronics.com \
--cc=alexandre.torgue@foss.st.com \
--cc=christophe.roullier@foss.st.com \
--cc=gabriel.fernandez@foss.st.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=marex@denx.de \
--cc=patrice.chotard@foss.st.com \
--cc=patrick.delaunay@foss.st.com \
--cc=sboyd@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).