4747 *------------------------------------------
4848 */
4949#define SYSCFG_PMCR_ETH_SEL_MII BIT(20)
50- #define SYSCFG_PMCR_ETH_SEL_RGMII BIT(21)
51- #define SYSCFG_PMCR_ETH_SEL_RMII BIT(23)
52- #define SYSCFG_PMCR_ETH_SEL_GMII 0
50+ #define SYSCFG_PMCR_PHY_INTF_SEL_MASK GENMASK(23, 21)
5351#define SYSCFG_MCU_ETH_SEL_MII 0
5452#define SYSCFG_MCU_ETH_SEL_RMII 1
5553
5654/* STM32MP2 register definitions */
5755#define SYSCFG_MP2_ETH_MASK GENMASK(31, 0)
5856
57+ #define SYSCFG_ETHCR_ETH_SEL_MASK GENMASK(6, 4)
5958#define SYSCFG_ETHCR_ETH_PTP_CLK_SEL BIT(2)
6059#define SYSCFG_ETHCR_ETH_CLK_SEL BIT(1)
6160#define SYSCFG_ETHCR_ETH_REF_CLK_SEL BIT(0)
6261
63- #define SYSCFG_ETHCR_ETH_SEL_MII 0
64- #define SYSCFG_ETHCR_ETH_SEL_RGMII BIT(4)
65- #define SYSCFG_ETHCR_ETH_SEL_RMII BIT(6)
66-
6762/* STM32MPx register definitions
6863 *
6964 * Below table summarizes the clock requirement and clock sources for
@@ -232,11 +227,14 @@ static int stm32mp1_validate_ethck_rate(struct plat_stmmacenet_data *plat_dat)
232227 return - EINVAL ;
233228}
234229
235- static int stm32mp1_configure_pmcr (struct plat_stmmacenet_data * plat_dat )
230+ static int stm32mp1_configure_pmcr (struct plat_stmmacenet_data * plat_dat ,
231+ u8 phy_intf_sel )
236232{
237233 struct stm32_dwmac * dwmac = plat_dat -> bsp_priv ;
238234 u32 reg = dwmac -> mode_reg ;
239- int val = 0 ;
235+ int val ;
236+
237+ val = FIELD_PREP (SYSCFG_PMCR_PHY_INTF_SEL_MASK , phy_intf_sel );
240238
241239 switch (plat_dat -> phy_interface ) {
242240 case PHY_INTERFACE_MODE_MII :
@@ -250,20 +248,17 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat)
250248 val |= SYSCFG_PMCR_ETH_SEL_MII ;
251249 break ;
252250 case PHY_INTERFACE_MODE_GMII :
253- val = SYSCFG_PMCR_ETH_SEL_GMII ;
254251 if (dwmac -> enable_eth_ck )
255252 val |= SYSCFG_PMCR_ETH_CLK_SEL ;
256253 break ;
257254 case PHY_INTERFACE_MODE_RMII :
258- val = SYSCFG_PMCR_ETH_SEL_RMII ;
259255 if (dwmac -> enable_eth_ck )
260256 val |= SYSCFG_PMCR_ETH_REF_CLK_SEL ;
261257 break ;
262258 case PHY_INTERFACE_MODE_RGMII :
263259 case PHY_INTERFACE_MODE_RGMII_ID :
264260 case PHY_INTERFACE_MODE_RGMII_RXID :
265261 case PHY_INTERFACE_MODE_RGMII_TXID :
266- val = SYSCFG_PMCR_ETH_SEL_RGMII ;
267262 if (dwmac -> enable_eth_ck )
268263 val |= SYSCFG_PMCR_ETH_CLK_SEL ;
269264 break ;
@@ -288,18 +283,20 @@ static int stm32mp1_configure_pmcr(struct plat_stmmacenet_data *plat_dat)
288283 dwmac -> mode_mask , val );
289284}
290285
291- static int stm32mp2_configure_syscfg (struct plat_stmmacenet_data * plat_dat )
286+ static int stm32mp2_configure_syscfg (struct plat_stmmacenet_data * plat_dat ,
287+ u8 phy_intf_sel )
292288{
293289 struct stm32_dwmac * dwmac = plat_dat -> bsp_priv ;
294290 u32 reg = dwmac -> mode_reg ;
295- int val = 0 ;
291+ int val ;
292+
293+ val = FIELD_PREP (SYSCFG_ETHCR_ETH_SEL_MASK , phy_intf_sel );
296294
297295 switch (plat_dat -> phy_interface ) {
298296 case PHY_INTERFACE_MODE_MII :
299297 /* ETH_REF_CLK_SEL bit in SYSCFG register is not applicable in MII mode */
300298 break ;
301299 case PHY_INTERFACE_MODE_RMII :
302- val = SYSCFG_ETHCR_ETH_SEL_RMII ;
303300 if (dwmac -> enable_eth_ck ) {
304301 /* Internal clock ETH_CLK of 50MHz from RCC is used */
305302 val |= SYSCFG_ETHCR_ETH_REF_CLK_SEL ;
@@ -309,8 +306,6 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)
309306 case PHY_INTERFACE_MODE_RGMII_ID :
310307 case PHY_INTERFACE_MODE_RGMII_RXID :
311308 case PHY_INTERFACE_MODE_RGMII_TXID :
312- val = SYSCFG_ETHCR_ETH_SEL_RGMII ;
313- fallthrough ;
314309 case PHY_INTERFACE_MODE_GMII :
315310 if (dwmac -> enable_eth_ck ) {
316311 /* Internal clock ETH_CLK of 125MHz from RCC is used */
@@ -337,7 +332,7 @@ static int stm32mp2_configure_syscfg(struct plat_stmmacenet_data *plat_dat)
337332static int stm32mp1_set_mode (struct plat_stmmacenet_data * plat_dat )
338333{
339334 struct stm32_dwmac * dwmac = plat_dat -> bsp_priv ;
340- int ret ;
335+ int phy_intf_sel , ret ;
341336
342337 ret = stm32mp1_select_ethck_external (plat_dat );
343338 if (ret )
@@ -347,10 +342,19 @@ static int stm32mp1_set_mode(struct plat_stmmacenet_data *plat_dat)
347342 if (ret )
348343 return ret ;
349344
345+ phy_intf_sel = stmmac_get_phy_intf_sel (plat_dat -> phy_interface );
346+ if (phy_intf_sel != PHY_INTF_SEL_GMII_MII &&
347+ phy_intf_sel != PHY_INTF_SEL_RGMII &&
348+ phy_intf_sel != PHY_INTF_SEL_RMII ) {
349+ dev_err (dwmac -> dev , "Mode %s not supported\n" ,
350+ phy_modes (plat_dat -> phy_interface ));
351+ return phy_intf_sel < 0 ? phy_intf_sel : - EINVAL ;
352+ }
353+
350354 if (!dwmac -> ops -> is_mp2 )
351- return stm32mp1_configure_pmcr (plat_dat );
355+ return stm32mp1_configure_pmcr (plat_dat , phy_intf_sel );
352356 else
353- return stm32mp2_configure_syscfg (plat_dat );
357+ return stm32mp2_configure_syscfg (plat_dat , phy_intf_sel );
354358}
355359
356360static int stm32mcu_set_mode (struct plat_stmmacenet_data * plat_dat )
0 commit comments