Rockchip RK3528 (and RV1106) has a different integrated PHY compared to
the integrated PHY on RK3228/RK3328. Current powerup/down operation is
not compatible with the integrated PHY found in these SoCs.
Move the rk_gmac_integrated_phy_powerup/down functions to top of the
file to prepare for them to be called directly by a GMAC variant
specific powerup/down operation.
Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
---
Changes in v3:
- No change
Changes in v2:
- New patch
---
.../net/ethernet/stmicro/stmmac/dwmac-rk.c | 88 +++++++++----------
1 file changed, 44 insertions(+), 44 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index dfb4668db4ee..0321befed0d3 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -92,6 +92,50 @@ struct rk_priv_data {
(((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
+#define RK_GRF_MACPHY_CON0 0xb00
+#define RK_GRF_MACPHY_CON1 0xb04
+#define RK_GRF_MACPHY_CON2 0xb08
+#define RK_GRF_MACPHY_CON3 0xb0c
+
+#define RK_MACPHY_ENABLE GRF_BIT(0)
+#define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
+#define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
+#define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
+#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
+#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
+
+static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
+{
+ if (priv->ops->integrated_phy_powerup)
+ priv->ops->integrated_phy_powerup(priv);
+
+ regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
+ regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
+
+ regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
+ regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
+
+ if (priv->phy_reset) {
+ /* PHY needs to be disabled before trying to reset it */
+ regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
+ if (priv->phy_reset)
+ reset_control_assert(priv->phy_reset);
+ usleep_range(10, 20);
+ if (priv->phy_reset)
+ reset_control_deassert(priv->phy_reset);
+ usleep_range(10, 20);
+ regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
+ msleep(30);
+ }
+}
+
+static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
+{
+ regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
+ if (priv->phy_reset)
+ reset_control_assert(priv->phy_reset);
+}
+
#define PX30_GRF_GMAC_CON1 0x0904
/* PX30_GRF_GMAC_CON1 */
@@ -1463,50 +1507,6 @@ static const struct rk_gmac_ops rv1126_ops = {
.set_rmii_speed = rv1126_set_rmii_speed,
};
-#define RK_GRF_MACPHY_CON0 0xb00
-#define RK_GRF_MACPHY_CON1 0xb04
-#define RK_GRF_MACPHY_CON2 0xb08
-#define RK_GRF_MACPHY_CON3 0xb0c
-
-#define RK_MACPHY_ENABLE GRF_BIT(0)
-#define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
-#define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
-#define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
-#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
-#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
-
-static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
-{
- if (priv->ops->integrated_phy_powerup)
- priv->ops->integrated_phy_powerup(priv);
-
- regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
- regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
-
- regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
- regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
-
- if (priv->phy_reset) {
- /* PHY needs to be disabled before trying to reset it */
- regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
- if (priv->phy_reset)
- reset_control_assert(priv->phy_reset);
- usleep_range(10, 20);
- if (priv->phy_reset)
- reset_control_deassert(priv->phy_reset);
- usleep_range(10, 20);
- regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
- msleep(30);
- }
-}
-
-static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
-{
- regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
- if (priv->phy_reset)
- reset_control_assert(priv->phy_reset);
-}
-
static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
{
struct rk_priv_data *bsp_priv = plat->bsp_priv;
--
2.49.0
On Wed, Mar 19, 2025 at 09:44:07PM +0000, Jonas Karlman wrote: > Rockchip RK3528 (and RV1106) has a different integrated PHY compared to > the integrated PHY on RK3228/RK3328. Current powerup/down operation is > not compatible with the integrated PHY found in these SoCs. > > Move the rk_gmac_integrated_phy_powerup/down functions to top of the > file to prepare for them to be called directly by a GMAC variant > specific powerup/down operation. > > Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Reviewed-by: Andrew Lunn <andrew@lunn.ch> > +#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0) > +#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0) > + > +static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv) > +{ > + if (priv->ops->integrated_phy_powerup) > + priv->ops->integrated_phy_powerup(priv); > + > + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M); > + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE); > + > + regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID); > + regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID); I know you are just moving code around.... Do you know what these MACPHY_ID are? I hope it is not what you get when you read PHY registers 2 and 3? Andrew
Hi Andrew, On 2025-03-19 23:39, Andrew Lunn wrote: > On Wed, Mar 19, 2025 at 09:44:07PM +0000, Jonas Karlman wrote: >> Rockchip RK3528 (and RV1106) has a different integrated PHY compared to >> the integrated PHY on RK3228/RK3328. Current powerup/down operation is >> not compatible with the integrated PHY found in these SoCs. >> >> Move the rk_gmac_integrated_phy_powerup/down functions to top of the >> file to prepare for them to be called directly by a GMAC variant >> specific powerup/down operation. >> >> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> > > Reviewed-by: Andrew Lunn <andrew@lunn.ch> > >> +#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0) >> +#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0) >> + >> +static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv) >> +{ >> + if (priv->ops->integrated_phy_powerup) >> + priv->ops->integrated_phy_powerup(priv); >> + >> + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M); >> + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE); >> + >> + regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID); >> + regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID); > > I know you are just moving code around.... > > Do you know what these MACPHY_ID are? I hope it is not what you get > when you read PHY registers 2 and 3? I think it may be: GRF_MACPHY_CON2 15:0 macphy_id / PHY ID Number, macphy_cfg_phy_id[15:0] GRF_MACPHY_CON3 15:12 macphy_cfg_rev_nr / Manufacturer's Revision Number 11:6 macphy_model_nr / Manufacturer's Model Number 5:0 macphy_id / PHY ID Number, macphy_cfg_phy_id[21:16] and MACPHY_PHY_IDENTIFIER1 - Address: 02 15:0 PHY ID number / default:cfg_phy_id[15:0] MACPHY_PHY_IDENTIFIER2 - Address: 03 15:10 PHY ID number / default:cfg_phy_id[21:16] 9:4 Model number / default:cfg_model_nr[5:0] 3:0 Revision number / default:cfg_rev_nr[3:0] So likely what you get when you read PHY registers 2 and 3. Regards, Jonas > > Andrew
> > Do you know what these MACPHY_ID are? I hope it is not what you get > > when you read PHY registers 2 and 3? > > I think it may be: > > GRF_MACPHY_CON2 > 15:0 macphy_id / PHY ID Number, macphy_cfg_phy_id[15:0] > > GRF_MACPHY_CON3 > 15:12 macphy_cfg_rev_nr / Manufacturer's Revision Number > 11:6 macphy_model_nr / Manufacturer's Model Number > 5:0 macphy_id / PHY ID Number, macphy_cfg_phy_id[21:16] > > and > > MACPHY_PHY_IDENTIFIER1 - Address: 02 > 15:0 PHY ID number / default:cfg_phy_id[15:0] > > MACPHY_PHY_IDENTIFIER2 - Address: 03 > 15:10 PHY ID number / default:cfg_phy_id[21:16] > 9:4 Model number / default:cfg_model_nr[5:0] > 3:0 Revision number / default:cfg_rev_nr[3:0] > > So likely what you get when you read PHY registers 2 and 3. Ah: drivers/net/phy/rockchip.c #define INTERNAL_EPHY_ID 0x1234d400 However, it is not clear where the d4 come from. The problem here is the upper part should be an OUI from the vendor. I doubt rockchip actually own this OUI. They do actually have the MAC OUI: 10:DC:B6:90:00:00/28. I don't know if you can use a MAC OUI with a PHY ID? Andrew
© 2016 - 2025 Red Hat, Inc.