Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: ethernet: stmmac: dwmac-rk: Add GMAC support for px30

Add constants and callback functions for the dwmac on px30 Soc.
The base structure is the same, but registers and the bits in
them are moved slightly, and add the clk_mac_speed for selecting
mac speed.

Signed-off-by: David Wu <david.wu@rock-chips.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

David Wu and committed by
David S. Miller
23c94d63 9b10000f

+70
+1
Documentation/devicetree/bindings/net/rockchip-dwmac.txt
··· 4 4 5 5 Required properties: 6 6 - compatible: should be "rockchip,<name>-gamc" 7 + "rockchip,px30-gmac": found on PX30 SoCs 7 8 "rockchip,rk3128-gmac": found on RK312x SoCs 8 9 "rockchip,rk3228-gmac": found on RK322x SoCs 9 10 "rockchip,rk3288-gmac": found on RK3288 SoCs
+69
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
··· 61 61 struct clk *mac_clk_tx; 62 62 struct clk *clk_mac_ref; 63 63 struct clk *clk_mac_refout; 64 + struct clk *clk_mac_speed; 64 65 struct clk *aclk_mac; 65 66 struct clk *pclk_mac; 66 67 struct clk *clk_phy; ··· 83 82 #define DELAY_ENABLE(soc, tx, rx) \ 84 83 (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \ 85 84 ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE)) 85 + 86 + #define PX30_GRF_GMAC_CON1 0x0904 87 + 88 + /* PX30_GRF_GMAC_CON1 */ 89 + #define PX30_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \ 90 + GRF_BIT(6)) 91 + #define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2) 92 + #define PX30_GMAC_SPEED_100M GRF_BIT(2) 93 + 94 + static void px30_set_to_rmii(struct rk_priv_data *bsp_priv) 95 + { 96 + struct device *dev = &bsp_priv->pdev->dev; 97 + 98 + if (IS_ERR(bsp_priv->grf)) { 99 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 100 + return; 101 + } 102 + 103 + regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1, 104 + PX30_GMAC_PHY_INTF_SEL_RMII); 105 + } 106 + 107 + static void px30_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) 108 + { 109 + struct device *dev = &bsp_priv->pdev->dev; 110 + int ret; 111 + 112 + if (IS_ERR(bsp_priv->clk_mac_speed)) { 113 + dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__); 114 + return; 115 + } 116 + 117 + if (speed == 10) { 118 + regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1, 119 + PX30_GMAC_SPEED_10M); 120 + 121 + ret = clk_set_rate(bsp_priv->clk_mac_speed, 2500000); 122 + if (ret) 123 + dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n", 124 + __func__, ret); 125 + } else if (speed == 100) { 126 + regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1, 127 + PX30_GMAC_SPEED_100M); 128 + 129 + ret = clk_set_rate(bsp_priv->clk_mac_speed, 25000000); 130 + if (ret) 131 + dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n", 132 + __func__, ret); 133 + 134 + } else { 135 + dev_err(dev, "unknown speed value for RMII! speed=%d", speed); 136 + } 137 + } 138 + 139 + static const struct rk_gmac_ops px30_ops = { 140 + .set_to_rmii = px30_set_to_rmii, 141 + .set_rmii_speed = px30_set_rmii_speed, 142 + }; 86 143 87 144 #define RK3128_GRF_MAC_CON0 0x0168 88 145 #define RK3128_GRF_MAC_CON1 0x016c ··· 1101 1042 } 1102 1043 } 1103 1044 1045 + bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed"); 1046 + if (IS_ERR(bsp_priv->clk_mac_speed)) 1047 + dev_err(dev, "cannot get clock %s\n", "clk_mac_speed"); 1048 + 1104 1049 if (bsp_priv->clock_input) { 1105 1050 dev_info(dev, "clock input from PHY\n"); 1106 1051 } else { ··· 1157 1094 if (!IS_ERR(bsp_priv->mac_clk_tx)) 1158 1095 clk_prepare_enable(bsp_priv->mac_clk_tx); 1159 1096 1097 + if (!IS_ERR(bsp_priv->clk_mac_speed)) 1098 + clk_prepare_enable(bsp_priv->clk_mac_speed); 1099 + 1160 1100 /** 1161 1101 * if (!IS_ERR(bsp_priv->clk_mac)) 1162 1102 * clk_prepare_enable(bsp_priv->clk_mac); ··· 1184 1118 clk_disable_unprepare(bsp_priv->pclk_mac); 1185 1119 1186 1120 clk_disable_unprepare(bsp_priv->mac_clk_tx); 1121 + 1122 + clk_disable_unprepare(bsp_priv->clk_mac_speed); 1187 1123 /** 1188 1124 * if (!IS_ERR(bsp_priv->clk_mac)) 1189 1125 * clk_disable_unprepare(bsp_priv->clk_mac); ··· 1482 1414 static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume); 1483 1415 1484 1416 static const struct of_device_id rk_gmac_dwmac_match[] = { 1417 + { .compatible = "rockchip,px30-gmac", .data = &px30_ops }, 1485 1418 { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops }, 1486 1419 { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops }, 1487 1420 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },