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@xxxxxx> >> >> --- > > Acked-by: Alexandre TORGUE <alexandre.torgue@xxxxxx> > > >> .../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; >> } >>