From: Christophe ROULLIER <christophe.roullier@st.com>
To: Alexandre TORGUE <alexandre.torgue@st.com>,
"robh@kernel.org" <robh@kernel.org>,
"davem@davemloft.net" <davem@davemloft.net>,
"joabreu@synopsys.com" <joabreu@synopsys.com>,
"mark.rutland@arm.com" <mark.rutland@arm.com>,
"mcoquelin.stm32@gmail.com" <mcoquelin.stm32@gmail.com>,
Peppe CAVALLARO <peppe.cavallaro@st.com>
Cc: "linux-stm32@st-md-mailman.stormreply.com"
<linux-stm32@st-md-mailman.stormreply.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
"andrew@lunn.ch" <andrew@lunn.ch>
Subject: Re: [PATCHv2 1/1] net: ethernet: stmmac: simplify phy modes management for stm32
Date: Tue, 14 Apr 2020 15:10:26 +0000 [thread overview]
Message-ID: <ecbfd26c-8dcb-3763-c1aa-ccc4c110aefa@st.com> (raw)
In-Reply-To: <cb0a5dd3-02da-7d60-7069-a8ee080ad239@st.com>
Hi,
Gentle reminder
Thanks,
Christophe.
On 01/04/2020 16:17, Alexandre Torgue wrote:
> Hi Christophe
>
> On 3/16/20 10:09 AM, Christophe Roullier wrote:
>> No new feature, just to simplify stm32 part to be easier to use.
>> Add by default all Ethernet clocks in DT, and activate or not in
>> function
>> of phy mode, clock frequency, if property "st,ext-phyclk" is set or not.
>> Keep backward compatibility
>> -----------------------------------------------------------------------
>> |PHY_MODE | Normal | PHY wo crystal| PHY wo crystal | No 125Mhz |
>> | | | 25MHz | 50MHz | from PHY |
>> -----------------------------------------------------------------------
>> | MII | - | eth-ck | n/a | n/a |
>> | | | st,ext-phyclk | | |
>> -----------------------------------------------------------------------
>> | GMII | - | eth-ck | n/a | n/a |
>> | | | st,ext-phyclk | | |
>> -----------------------------------------------------------------------
>> | RGMII | - | eth-ck | n/a | eth-ck |
>> | | | st,ext-phyclk | |st,eth-clk-sel|
>> | | | | | or |
>> | | | | | st,ext-phyclk|
>> ------------------------------------------------------------------------
>> | RMII | - | eth-ck | eth-ck | n/a |
>> | | | st,ext-phyclk | st,eth-ref-clk-sel | |
>> | | | | or st,ext-phyclk | |
>> ------------------------------------------------------------------------
>>
>> Signed-off-by: Christophe Roullier <christophe.roullier@st.com>
>>
>> ---
>
> Acked-by: Alexandre TORGUE <alexandre.torgue@st.com>
>
>
>> .../net/ethernet/stmicro/stmmac/dwmac-stm32.c | 74 +++++++++++--------
>> 1 file changed, 44 insertions(+), 30 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
>> b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
>> index b2dc99289687..5d4df4c5254e 100644
>> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
>> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
>> @@ -29,6 +29,11 @@
>> #define SYSCFG_PMCR_ETH_CLK_SEL BIT(16)
>> #define SYSCFG_PMCR_ETH_REF_CLK_SEL BIT(17)
>> +/* CLOCK feed to PHY*/
>> +#define ETH_CK_F_25M 25000000
>> +#define ETH_CK_F_50M 50000000
>> +#define ETH_CK_F_125M 125000000
>> +
>> /* Ethernet PHY interface selection in register SYSCFG Configuration
>> *------------------------------------------
>> * src |BIT(23)| BIT(22)| BIT(21)|BIT(20)|
>> @@ -58,33 +63,20 @@
>> *| | | 25MHz | 50MHz
>> | |
>> *
>> ---------------------------------------------------------------------------
>> *| MII | - | eth-ck | n/a |
>> n/a |
>> - *| | | | | |
>> + *| | | st,ext-phyclk | | |
>> *
>> ---------------------------------------------------------------------------
>> *| GMII | - | eth-ck | n/a |
>> n/a |
>> - *| | | | | |
>> + *| | | st,ext-phyclk | | |
>> *
>> ---------------------------------------------------------------------------
>> - *| RGMII | - | eth-ck | n/a | eth-ck
>> (no pin) |
>> - *| | | | |
>> st,eth-clk-sel |
>> + *| RGMII | - | eth-ck | n/a |
>> eth-ck |
>> + *| | | st,ext-phyclk | |
>> st,eth-clk-sel or|
>> + *| | | | |
>> st,ext-phyclk |
>> *
>> ---------------------------------------------------------------------------
>> *| RMII | - | eth-ck | eth-ck |
>> n/a |
>> - *| | | | st,eth-ref-clk-sel | |
>> + *| | | st,ext-phyclk | st,eth-ref-clk-sel
>> | |
>> + *| | | | or st,ext-phyclk | |
>> *
>> ---------------------------------------------------------------------------
>> *
>> - * BIT(17) : set this bit in RMII mode when you have PHY without
>> crystal 50MHz
>> - * BIT(16) : set this bit in GMII/RGMII PHY when you do not want use
>> 125Mhz
>> - * from PHY
>> - *-----------------------------------------------------
>> - * src | BIT(17) | BIT(16) |
>> - *-----------------------------------------------------
>> - * MII | n/a | n/a |
>> - *-----------------------------------------------------
>> - * GMII | n/a | st,eth-clk-sel |
>> - *-----------------------------------------------------
>> - * RGMII | n/a | st,eth-clk-sel |
>> - *-----------------------------------------------------
>> - * RMII | st,eth-ref-clk-sel | n/a |
>> - *-----------------------------------------------------
>> - *
>> */
>> struct stm32_dwmac {
>> @@ -93,6 +85,8 @@ struct stm32_dwmac {
>> struct clk *clk_eth_ck;
>> struct clk *clk_ethstp;
>> struct clk *syscfg_clk;
>> + int ext_phyclk;
>> + int enable_eth_ck;
>> int eth_clk_sel_reg;
>> int eth_ref_clk_sel_reg;
>> int irq_pwr_wakeup;
>> @@ -155,14 +149,17 @@ static int stm32mp1_clk_prepare(struct
>> stm32_dwmac *dwmac, bool prepare)
>> ret = clk_prepare_enable(dwmac->syscfg_clk);
>> if (ret)
>> return ret;
>> - ret = clk_prepare_enable(dwmac->clk_eth_ck);
>> - if (ret) {
>> - clk_disable_unprepare(dwmac->syscfg_clk);
>> - return ret;
>> + if (dwmac->enable_eth_ck) {
>> + ret = clk_prepare_enable(dwmac->clk_eth_ck);
>> + if (ret) {
>> + clk_disable_unprepare(dwmac->syscfg_clk);
>> + return ret;
>> + }
>> }
>> } else {
>> clk_disable_unprepare(dwmac->syscfg_clk);
>> - clk_disable_unprepare(dwmac->clk_eth_ck);
>> + if (dwmac->enable_eth_ck)
>> + clk_disable_unprepare(dwmac->clk_eth_ck);
>> }
>> return ret;
>> }
>> @@ -170,24 +167,34 @@ static int stm32mp1_clk_prepare(struct
>> stm32_dwmac *dwmac, bool prepare)
>> static int stm32mp1_set_mode(struct plat_stmmacenet_data *plat_dat)
>> {
>> struct stm32_dwmac *dwmac = plat_dat->bsp_priv;
>> - u32 reg = dwmac->mode_reg;
>> + u32 reg = dwmac->mode_reg, clk_rate;
>> int val;
>> + clk_rate = clk_get_rate(dwmac->clk_eth_ck);
>> + dwmac->enable_eth_ck = false;
>> switch (plat_dat->interface) {
>> case PHY_INTERFACE_MODE_MII:
>> + if (clk_rate == ETH_CK_F_25M && dwmac->ext_phyclk)
>> + dwmac->enable_eth_ck = true;
>> val = SYSCFG_PMCR_ETH_SEL_MII;
>> pr_debug("SYSCFG init : PHY_INTERFACE_MODE_MII\n");
>> break;
>> case PHY_INTERFACE_MODE_GMII:
>> val = SYSCFG_PMCR_ETH_SEL_GMII;
>> - if (dwmac->eth_clk_sel_reg)
>> + if (clk_rate == ETH_CK_F_25M &&
>> + (dwmac->eth_clk_sel_reg || dwmac->ext_phyclk)) {
>> + dwmac->enable_eth_ck = true;
>> val |= SYSCFG_PMCR_ETH_CLK_SEL;
>> + }
>> pr_debug("SYSCFG init : PHY_INTERFACE_MODE_GMII\n");
>> break;
>> case PHY_INTERFACE_MODE_RMII:
>> val = SYSCFG_PMCR_ETH_SEL_RMII;
>> - if (dwmac->eth_ref_clk_sel_reg)
>> + if ((clk_rate == ETH_CK_F_25M || clk_rate == ETH_CK_F_50M) &&
>> + (dwmac->eth_ref_clk_sel_reg || dwmac->ext_phyclk)) {
>> + dwmac->enable_eth_ck = true;
>> val |= SYSCFG_PMCR_ETH_REF_CLK_SEL;
>> + }
>> pr_debug("SYSCFG init : PHY_INTERFACE_MODE_RMII\n");
>> break;
>> case PHY_INTERFACE_MODE_RGMII:
>> @@ -195,8 +202,11 @@ static int stm32mp1_set_mode(struct
>> plat_stmmacenet_data *plat_dat)
>> case PHY_INTERFACE_MODE_RGMII_RXID:
>> case PHY_INTERFACE_MODE_RGMII_TXID:
>> val = SYSCFG_PMCR_ETH_SEL_RGMII;
>> - if (dwmac->eth_clk_sel_reg)
>> + if ((clk_rate == ETH_CK_F_25M || clk_rate == ETH_CK_F_125M) &&
>> + (dwmac->eth_clk_sel_reg || dwmac->ext_phyclk)) {
>> + dwmac->enable_eth_ck = true;
>> val |= SYSCFG_PMCR_ETH_CLK_SEL;
>> + }
>> pr_debug("SYSCFG init : PHY_INTERFACE_MODE_RGMII\n");
>> break;
>> default:
>> @@ -294,6 +304,9 @@ static int stm32mp1_parse_data(struct stm32_dwmac
>> *dwmac,
>> struct device_node *np = dev->of_node;
>> int err = 0;
>> + /* Ethernet PHY have no crystal */
>> + dwmac->ext_phyclk = of_property_read_bool(np, "st,ext-phyclk");
>> +
>> /* Gigabit Ethernet 125MHz clock selection. */
>> dwmac->eth_clk_sel_reg = of_property_read_bool(np,
>> "st,eth-clk-sel");
>> @@ -431,7 +444,8 @@ static int stm32mp1_suspend(struct stm32_dwmac
>> *dwmac)
>> clk_disable_unprepare(dwmac->clk_tx);
>> clk_disable_unprepare(dwmac->syscfg_clk);
>> - clk_disable_unprepare(dwmac->clk_eth_ck);
>> + if (dwmac->enable_eth_ck)
>> + clk_disable_unprepare(dwmac->clk_eth_ck);
>> return ret;
>> }
>>
next prev parent reply other threads:[~2020-04-14 15:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-16 9:09 Christophe Roullier
2020-03-24 7:05 ` Christophe ROULLIER
2020-04-01 14:17 ` Alexandre Torgue
2020-04-14 15:10 ` Christophe ROULLIER [this message]
2020-04-14 15:14 ` Andrew Lunn
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=ecbfd26c-8dcb-3763-c1aa-ccc4c110aefa@st.com \
--to=christophe.roullier@st.com \
--cc=alexandre.torgue@st.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=joabreu@synopsys.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=mark.rutland@arm.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=peppe.cavallaro@st.com \
--cc=robh@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
all inboxes | Powered by JetHome®