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

Merge branch 'stmmac-rk3368'

Heiko Stuebner says:

====================
net: stmmac: dwmac-rk: add support for rk3368

Apart from small cleanups, this series provides support for the dwmac
on the new rk3368 ARM64 soc.

Tested on a R88 board using a RMII phy.

Changes since v1:
- Adapt to changes resulting from patch d42202dce002 ("net: stmmac:
dwmac-rk: Don't add function name in info or err messages")
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+202 -46
+1 -1
Documentation/devicetree/bindings/net/rockchip-dwmac.txt
··· 3 3 The device node has following properties. 4 4 5 5 Required properties: 6 - - compatible: Can be "rockchip,rk3288-gmac". 6 + - compatible: Can be one of "rockchip,rk3288-gmac", "rockchip,rk3368-gmac" 7 7 - reg: addresses and length of the register sets for the device. 8 8 - interrupts: Should contain the GMAC interrupts. 9 9 - interrupt-names: Should contain the interrupt names "macirq".
+201 -45
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
··· 33 33 34 34 #include "stmmac_platform.h" 35 35 36 + struct rk_priv_data; 37 + struct rk_gmac_ops { 38 + void (*set_to_rgmii)(struct rk_priv_data *bsp_priv, 39 + int tx_delay, int rx_delay); 40 + void (*set_to_rmii)(struct rk_priv_data *bsp_priv); 41 + void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed); 42 + void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed); 43 + }; 44 + 36 45 struct rk_priv_data { 37 46 struct platform_device *pdev; 38 47 int phy_iface; 39 48 struct regulator *regulator; 49 + struct rk_gmac_ops *ops; 40 50 41 51 bool clk_enabled; 42 52 bool clock_input; 43 53 44 54 struct clk *clk_mac; 45 - struct clk *clk_mac_pll; 46 55 struct clk *gmac_clkin; 47 56 struct clk *mac_clk_rx; 48 57 struct clk *mac_clk_tx; ··· 74 65 75 66 #define RK3288_GRF_SOC_CON1 0x0248 76 67 #define RK3288_GRF_SOC_CON3 0x0250 77 - #define RK3288_GRF_GPIO3D_E 0x01ec 78 - #define RK3288_GRF_GPIO4A_E 0x01f0 79 - #define RK3288_GRF_GPIO4B_E 0x01f4 80 68 81 69 /*RK3288_GRF_SOC_CON1*/ 82 - #define GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8)) 83 - #define GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8)) 84 - #define GMAC_FLOW_CTRL GRF_BIT(9) 85 - #define GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9) 86 - #define GMAC_SPEED_10M GRF_CLR_BIT(10) 87 - #define GMAC_SPEED_100M GRF_BIT(10) 88 - #define GMAC_RMII_CLK_25M GRF_BIT(11) 89 - #define GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11) 90 - #define GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13)) 91 - #define GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13)) 92 - #define GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13)) 93 - #define GMAC_RMII_MODE GRF_BIT(14) 94 - #define GMAC_RMII_MODE_CLR GRF_CLR_BIT(14) 70 + #define RK3288_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | \ 71 + GRF_CLR_BIT(8)) 72 + #define RK3288_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \ 73 + GRF_BIT(8)) 74 + #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9) 75 + #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9) 76 + #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10) 77 + #define RK3288_GMAC_SPEED_100M GRF_BIT(10) 78 + #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11) 79 + #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11) 80 + #define RK3288_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13)) 81 + #define RK3288_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13)) 82 + #define RK3288_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13)) 83 + #define RK3288_GMAC_RMII_MODE GRF_BIT(14) 84 + #define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14) 95 85 96 86 /*RK3288_GRF_SOC_CON3*/ 97 - #define GMAC_TXCLK_DLY_ENABLE GRF_BIT(14) 98 - #define GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14) 99 - #define GMAC_RXCLK_DLY_ENABLE GRF_BIT(15) 100 - #define GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15) 101 - #define GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7) 102 - #define GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) 87 + #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14) 88 + #define RK3288_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14) 89 + #define RK3288_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15) 90 + #define RK3288_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15) 91 + #define RK3288_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7) 92 + #define RK3288_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) 103 93 104 - static void set_to_rgmii(struct rk_priv_data *bsp_priv, 105 - int tx_delay, int rx_delay) 94 + static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv, 95 + int tx_delay, int rx_delay) 106 96 { 107 97 struct device *dev = &bsp_priv->pdev->dev; 108 98 ··· 111 103 } 112 104 113 105 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, 114 - GMAC_PHY_INTF_SEL_RGMII | GMAC_RMII_MODE_CLR); 106 + RK3288_GMAC_PHY_INTF_SEL_RGMII | 107 + RK3288_GMAC_RMII_MODE_CLR); 115 108 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3, 116 - GMAC_RXCLK_DLY_ENABLE | GMAC_TXCLK_DLY_ENABLE | 117 - GMAC_CLK_RX_DL_CFG(rx_delay) | 118 - GMAC_CLK_TX_DL_CFG(tx_delay)); 109 + RK3288_GMAC_RXCLK_DLY_ENABLE | 110 + RK3288_GMAC_TXCLK_DLY_ENABLE | 111 + RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) | 112 + RK3288_GMAC_CLK_TX_DL_CFG(tx_delay)); 119 113 } 120 114 121 - static void set_to_rmii(struct rk_priv_data *bsp_priv) 115 + static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv) 122 116 { 123 117 struct device *dev = &bsp_priv->pdev->dev; 124 118 ··· 130 120 } 131 121 132 122 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, 133 - GMAC_PHY_INTF_SEL_RMII | GMAC_RMII_MODE); 123 + RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE); 134 124 } 135 125 136 - static void set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) 126 + static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) 137 127 { 138 128 struct device *dev = &bsp_priv->pdev->dev; 139 129 ··· 143 133 } 144 134 145 135 if (speed == 10) 146 - regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, GMAC_CLK_2_5M); 136 + regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, 137 + RK3288_GMAC_CLK_2_5M); 147 138 else if (speed == 100) 148 - regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, GMAC_CLK_25M); 139 + regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, 140 + RK3288_GMAC_CLK_25M); 149 141 else if (speed == 1000) 150 - regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, GMAC_CLK_125M); 142 + regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, 143 + RK3288_GMAC_CLK_125M); 151 144 else 152 145 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed); 153 146 } 154 147 155 - static void set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) 148 + static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) 156 149 { 157 150 struct device *dev = &bsp_priv->pdev->dev; 158 151 ··· 166 153 167 154 if (speed == 10) { 168 155 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, 169 - GMAC_RMII_CLK_2_5M | GMAC_SPEED_10M); 156 + RK3288_GMAC_RMII_CLK_2_5M | 157 + RK3288_GMAC_SPEED_10M); 170 158 } else if (speed == 100) { 171 159 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1, 172 - GMAC_RMII_CLK_25M | GMAC_SPEED_100M); 160 + RK3288_GMAC_RMII_CLK_25M | 161 + RK3288_GMAC_SPEED_100M); 173 162 } else { 174 163 dev_err(dev, "unknown speed value for RMII! speed=%d", speed); 175 164 } 176 165 } 166 + 167 + struct rk_gmac_ops rk3288_ops = { 168 + .set_to_rgmii = rk3288_set_to_rgmii, 169 + .set_to_rmii = rk3288_set_to_rmii, 170 + .set_rgmii_speed = rk3288_set_rgmii_speed, 171 + .set_rmii_speed = rk3288_set_rmii_speed, 172 + }; 173 + 174 + #define RK3368_GRF_SOC_CON15 0x043c 175 + #define RK3368_GRF_SOC_CON16 0x0440 176 + 177 + /* RK3368_GRF_SOC_CON15 */ 178 + #define RK3368_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \ 179 + GRF_CLR_BIT(11)) 180 + #define RK3368_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \ 181 + GRF_BIT(11)) 182 + #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8) 183 + #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8) 184 + #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7) 185 + #define RK3368_GMAC_SPEED_100M GRF_BIT(7) 186 + #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3) 187 + #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3) 188 + #define RK3368_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5)) 189 + #define RK3368_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5)) 190 + #define RK3368_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5)) 191 + #define RK3368_GMAC_RMII_MODE GRF_BIT(6) 192 + #define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6) 193 + 194 + /* RK3368_GRF_SOC_CON16 */ 195 + #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7) 196 + #define RK3368_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7) 197 + #define RK3368_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15) 198 + #define RK3368_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15) 199 + #define RK3368_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) 200 + #define RK3368_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) 201 + 202 + static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv, 203 + int tx_delay, int rx_delay) 204 + { 205 + struct device *dev = &bsp_priv->pdev->dev; 206 + 207 + if (IS_ERR(bsp_priv->grf)) { 208 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 209 + return; 210 + } 211 + 212 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, 213 + RK3368_GMAC_PHY_INTF_SEL_RGMII | 214 + RK3368_GMAC_RMII_MODE_CLR); 215 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16, 216 + RK3368_GMAC_RXCLK_DLY_ENABLE | 217 + RK3368_GMAC_TXCLK_DLY_ENABLE | 218 + RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) | 219 + RK3368_GMAC_CLK_TX_DL_CFG(tx_delay)); 220 + } 221 + 222 + static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv) 223 + { 224 + struct device *dev = &bsp_priv->pdev->dev; 225 + 226 + if (IS_ERR(bsp_priv->grf)) { 227 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 228 + return; 229 + } 230 + 231 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, 232 + RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE); 233 + } 234 + 235 + static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) 236 + { 237 + struct device *dev = &bsp_priv->pdev->dev; 238 + 239 + if (IS_ERR(bsp_priv->grf)) { 240 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 241 + return; 242 + } 243 + 244 + if (speed == 10) 245 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, 246 + RK3368_GMAC_CLK_2_5M); 247 + else if (speed == 100) 248 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, 249 + RK3368_GMAC_CLK_25M); 250 + else if (speed == 1000) 251 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, 252 + RK3368_GMAC_CLK_125M); 253 + else 254 + dev_err(dev, "unknown speed value for RGMII! speed=%d", speed); 255 + } 256 + 257 + static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) 258 + { 259 + struct device *dev = &bsp_priv->pdev->dev; 260 + 261 + if (IS_ERR(bsp_priv->grf)) { 262 + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); 263 + return; 264 + } 265 + 266 + if (speed == 10) { 267 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, 268 + RK3368_GMAC_RMII_CLK_2_5M | 269 + RK3368_GMAC_SPEED_10M); 270 + } else if (speed == 100) { 271 + regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15, 272 + RK3368_GMAC_RMII_CLK_25M | 273 + RK3368_GMAC_SPEED_100M); 274 + } else { 275 + dev_err(dev, "unknown speed value for RMII! speed=%d", speed); 276 + } 277 + } 278 + 279 + struct rk_gmac_ops rk3368_ops = { 280 + .set_to_rgmii = rk3368_set_to_rgmii, 281 + .set_to_rmii = rk3368_set_to_rmii, 282 + .set_rgmii_speed = rk3368_set_rgmii_speed, 283 + .set_rmii_speed = rk3368_set_rmii_speed, 284 + }; 177 285 178 286 static int gmac_clk_init(struct rk_priv_data *bsp_priv) 179 287 { ··· 346 212 dev_info(dev, "clock input from PHY\n"); 347 213 } else { 348 214 if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) 349 - clk_set_rate(bsp_priv->clk_mac_pll, 50000000); 215 + clk_set_rate(bsp_priv->clk_mac, 50000000); 350 216 } 351 217 352 218 return 0; ··· 447 313 return 0; 448 314 } 449 315 450 - static void *rk_gmac_setup(struct platform_device *pdev) 316 + static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev, 317 + struct rk_gmac_ops *ops) 451 318 { 452 319 struct rk_priv_data *bsp_priv; 453 320 struct device *dev = &pdev->dev; ··· 461 326 return ERR_PTR(-ENOMEM); 462 327 463 328 bsp_priv->phy_iface = of_get_phy_mode(dev->of_node); 329 + bsp_priv->ops = ops; 464 330 465 331 bsp_priv->regulator = devm_regulator_get_optional(dev, "phy"); 466 332 if (IS_ERR(bsp_priv->regulator)) { ··· 515 379 /*rmii or rgmii*/ 516 380 if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RGMII) { 517 381 dev_info(dev, "init for RGMII\n"); 518 - set_to_rgmii(bsp_priv, bsp_priv->tx_delay, bsp_priv->rx_delay); 382 + bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 383 + bsp_priv->rx_delay); 519 384 } else if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) { 520 385 dev_info(dev, "init for RMII\n"); 521 - set_to_rmii(bsp_priv); 386 + bsp_priv->ops->set_to_rmii(bsp_priv); 522 387 } else { 523 388 dev_err(dev, "NO interface defined!\n"); 524 389 } ··· 527 390 gmac_clk_init(bsp_priv); 528 391 529 392 return bsp_priv; 393 + } 394 + 395 + static void *rk3288_gmac_setup(struct platform_device *pdev) 396 + { 397 + return rk_gmac_setup(pdev, &rk3288_ops); 398 + } 399 + 400 + static void *rk3368_gmac_setup(struct platform_device *pdev) 401 + { 402 + return rk_gmac_setup(pdev, &rk3368_ops); 530 403 } 531 404 532 405 static int rk_gmac_init(struct platform_device *pdev, void *priv) ··· 569 422 struct device *dev = &bsp_priv->pdev->dev; 570 423 571 424 if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RGMII) 572 - set_rgmii_speed(bsp_priv, speed); 425 + bsp_priv->ops->set_rgmii_speed(bsp_priv, speed); 573 426 else if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) 574 - set_rmii_speed(bsp_priv, speed); 427 + bsp_priv->ops->set_rmii_speed(bsp_priv, speed); 575 428 else 576 429 dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface); 577 430 } ··· 579 432 static const struct stmmac_of_data rk3288_gmac_data = { 580 433 .has_gmac = 1, 581 434 .fix_mac_speed = rk_fix_speed, 582 - .setup = rk_gmac_setup, 435 + .setup = rk3288_gmac_setup, 436 + .init = rk_gmac_init, 437 + .exit = rk_gmac_exit, 438 + }; 439 + 440 + static const struct stmmac_of_data rk3368_gmac_data = { 441 + .has_gmac = 1, 442 + .fix_mac_speed = rk_fix_speed, 443 + .setup = rk3368_gmac_setup, 583 444 .init = rk_gmac_init, 584 445 .exit = rk_gmac_exit, 585 446 }; 586 447 587 448 static const struct of_device_id rk_gmac_dwmac_match[] = { 588 449 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_gmac_data}, 450 + { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_gmac_data}, 589 451 { } 590 452 }; 591 453 MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);