Skip to content

Commit 8bdf63b

Browse files
SuperDavidWudavem330
authored andcommitted
net: stmmac: dwmac-rk: Add integrated PHY supprot for rk3328
There are two mac controllers in the rk3328, the one connects to external PHY, and the other one connects to integrated PHY. Like the mac of external PHY, the integrated PHY's mac also needs to configure the related mac registers at GRF. Signed-off-by: David Wu <david.wu@rock-chips.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 6fa12c7 commit 8bdf63b

File tree

1 file changed

+23
-3
lines changed

1 file changed

+23
-3
lines changed

drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,8 @@ static const struct rk_gmac_ops rk3288_ops = {
323323

324324
#define RK3328_GRF_MAC_CON0 0x0900
325325
#define RK3328_GRF_MAC_CON1 0x0904
326+
#define RK3328_GRF_MAC_CON2 0x0908
327+
#define RK3328_GRF_MACPHY_CON1 0xb04
326328

327329
/* RK3328_GRF_MAC_CON0 */
328330
#define RK3328_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
@@ -349,6 +351,9 @@ static const struct rk_gmac_ops rk3288_ops = {
349351
#define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
350352
#define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
351353

354+
/* RK3328_GRF_MACPHY_CON1 */
355+
#define RK3328_MACPHY_RMII_MODE GRF_BIT(9)
356+
352357
static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
353358
int tx_delay, int rx_delay)
354359
{
@@ -373,13 +378,17 @@ static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
373378
static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
374379
{
375380
struct device *dev = &bsp_priv->pdev->dev;
381+
unsigned int reg;
376382

377383
if (IS_ERR(bsp_priv->grf)) {
378384
dev_err(dev, "Missing rockchip,grf property\n");
379385
return;
380386
}
381387

382-
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
388+
reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
389+
RK3328_GRF_MAC_CON1;
390+
391+
regmap_write(bsp_priv->grf, reg,
383392
RK3328_GMAC_PHY_INTF_SEL_RMII |
384393
RK3328_GMAC_RMII_MODE);
385394
}
@@ -409,29 +418,40 @@ static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
409418
static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
410419
{
411420
struct device *dev = &bsp_priv->pdev->dev;
421+
unsigned int reg;
412422

413423
if (IS_ERR(bsp_priv->grf)) {
414424
dev_err(dev, "Missing rockchip,grf property\n");
415425
return;
416426
}
417427

428+
reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
429+
RK3328_GRF_MAC_CON1;
430+
418431
if (speed == 10)
419-
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
432+
regmap_write(bsp_priv->grf, reg,
420433
RK3328_GMAC_RMII_CLK_2_5M |
421434
RK3328_GMAC_SPEED_10M);
422435
else if (speed == 100)
423-
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
436+
regmap_write(bsp_priv->grf, reg,
424437
RK3328_GMAC_RMII_CLK_25M |
425438
RK3328_GMAC_SPEED_100M);
426439
else
427440
dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
428441
}
429442

443+
static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
444+
{
445+
regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
446+
RK3328_MACPHY_RMII_MODE);
447+
}
448+
430449
static const struct rk_gmac_ops rk3328_ops = {
431450
.set_to_rgmii = rk3328_set_to_rgmii,
432451
.set_to_rmii = rk3328_set_to_rmii,
433452
.set_rgmii_speed = rk3328_set_rgmii_speed,
434453
.set_rmii_speed = rk3328_set_rmii_speed,
454+
.integrated_phy_powerup = rk3328_integrated_phy_powerup,
435455
};
436456

437457
#define RK3366_GRF_SOC_CON6 0x0418

0 commit comments

Comments
 (0)