Skip to content

Commit d4ff816

Browse files
SuperDavidWudavem330
authored andcommitted
net: ethernet: stmmac: dwmac-rk: Add RK3328 gmac support
Add constants and callback functions for the dwmac on rk3328 socs. As can be seen, the base structure is the same, only registers and the bits in them moved slightly. Signed-off-by: david.wu <david.wu@rock-chips.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a4d69a4 commit d4ff816

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

Documentation/devicetree/bindings/net/rockchip-dwmac.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Required properties:
66
- compatible: should be "rockchip,<name>-gamc"
77
"rockchip,rk3228-gmac": found on RK322x SoCs
88
"rockchip,rk3288-gmac": found on RK3288 SoCs
9+
"rockchip,rk3328-gmac": found on RK3328 SoCs
910
"rockchip,rk3366-gmac": found on RK3366 SoCs
1011
"rockchip,rk3368-gmac": found on RK3368 SoCs
1112
"rockchip,rk3399-gmac": found on RK3399 SoCs

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

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,122 @@ static const struct rk_gmac_ops rk3288_ops = {
302302
.set_rmii_speed = rk3288_set_rmii_speed,
303303
};
304304

305+
#define RK3328_GRF_MAC_CON0 0x0900
306+
#define RK3328_GRF_MAC_CON1 0x0904
307+
308+
/* RK3328_GRF_MAC_CON0 */
309+
#define RK3328_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
310+
#define RK3328_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
311+
312+
/* RK3328_GRF_MAC_CON1 */
313+
#define RK3328_GMAC_PHY_INTF_SEL_RGMII \
314+
(GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
315+
#define RK3328_GMAC_PHY_INTF_SEL_RMII \
316+
(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
317+
#define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
318+
#define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
319+
#define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
320+
#define RK3328_GMAC_SPEED_100M GRF_BIT(2)
321+
#define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
322+
#define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
323+
#define RK3328_GMAC_CLK_125M (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
324+
#define RK3328_GMAC_CLK_25M (GRF_BIT(11) | GRF_BIT(12))
325+
#define RK3328_GMAC_CLK_2_5M (GRF_CLR_BIT(11) | GRF_BIT(12))
326+
#define RK3328_GMAC_RMII_MODE GRF_BIT(9)
327+
#define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
328+
#define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
329+
#define RK3328_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
330+
#define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
331+
#define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
332+
333+
static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
334+
int tx_delay, int rx_delay)
335+
{
336+
struct device *dev = &bsp_priv->pdev->dev;
337+
338+
if (IS_ERR(bsp_priv->grf)) {
339+
dev_err(dev, "Missing rockchip,grf property\n");
340+
return;
341+
}
342+
343+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
344+
RK3328_GMAC_PHY_INTF_SEL_RGMII |
345+
RK3328_GMAC_RMII_MODE_CLR |
346+
RK3328_GMAC_RXCLK_DLY_ENABLE |
347+
RK3328_GMAC_TXCLK_DLY_ENABLE);
348+
349+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
350+
RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) |
351+
RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
352+
}
353+
354+
static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
355+
{
356+
struct device *dev = &bsp_priv->pdev->dev;
357+
358+
if (IS_ERR(bsp_priv->grf)) {
359+
dev_err(dev, "Missing rockchip,grf property\n");
360+
return;
361+
}
362+
363+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
364+
RK3328_GMAC_PHY_INTF_SEL_RMII |
365+
RK3328_GMAC_RMII_MODE);
366+
367+
/* set MAC to RMII mode */
368+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1, GRF_BIT(11));
369+
}
370+
371+
static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
372+
{
373+
struct device *dev = &bsp_priv->pdev->dev;
374+
375+
if (IS_ERR(bsp_priv->grf)) {
376+
dev_err(dev, "Missing rockchip,grf property\n");
377+
return;
378+
}
379+
380+
if (speed == 10)
381+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
382+
RK3328_GMAC_CLK_2_5M);
383+
else if (speed == 100)
384+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
385+
RK3328_GMAC_CLK_25M);
386+
else if (speed == 1000)
387+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
388+
RK3328_GMAC_CLK_125M);
389+
else
390+
dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
391+
}
392+
393+
static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
394+
{
395+
struct device *dev = &bsp_priv->pdev->dev;
396+
397+
if (IS_ERR(bsp_priv->grf)) {
398+
dev_err(dev, "Missing rockchip,grf property\n");
399+
return;
400+
}
401+
402+
if (speed == 10)
403+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
404+
RK3328_GMAC_RMII_CLK_2_5M |
405+
RK3328_GMAC_SPEED_10M);
406+
else if (speed == 100)
407+
regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
408+
RK3328_GMAC_RMII_CLK_25M |
409+
RK3328_GMAC_SPEED_100M);
410+
else
411+
dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
412+
}
413+
414+
static const struct rk_gmac_ops rk3328_ops = {
415+
.set_to_rgmii = rk3328_set_to_rgmii,
416+
.set_to_rmii = rk3328_set_to_rmii,
417+
.set_rgmii_speed = rk3328_set_rgmii_speed,
418+
.set_rmii_speed = rk3328_set_rmii_speed,
419+
};
420+
305421
#define RK3366_GRF_SOC_CON6 0x0418
306422
#define RK3366_GRF_SOC_CON7 0x041c
307423

@@ -1006,6 +1122,7 @@ static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
10061122
static const struct of_device_id rk_gmac_dwmac_match[] = {
10071123
{ .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
10081124
{ .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
1125+
{ .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
10091126
{ .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
10101127
{ .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
10111128
{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },

0 commit comments

Comments
 (0)