0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/stmmac.h>
0011 #include <linux/bitops.h>
0012 #include <linux/clk.h>
0013 #include <linux/phy.h>
0014 #include <linux/of_net.h>
0015 #include <linux/gpio.h>
0016 #include <linux/module.h>
0017 #include <linux/of_gpio.h>
0018 #include <linux/of_device.h>
0019 #include <linux/platform_device.h>
0020 #include <linux/regulator/consumer.h>
0021 #include <linux/delay.h>
0022 #include <linux/mfd/syscon.h>
0023 #include <linux/regmap.h>
0024 #include <linux/pm_runtime.h>
0025
0026 #include "stmmac_platform.h"
0027
0028 struct rk_priv_data;
0029 struct rk_gmac_ops {
0030 void (*set_to_rgmii)(struct rk_priv_data *bsp_priv,
0031 int tx_delay, int rx_delay);
0032 void (*set_to_rmii)(struct rk_priv_data *bsp_priv);
0033 void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
0034 void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
0035 void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
0036 bool regs_valid;
0037 u32 regs[];
0038 };
0039
0040 struct rk_priv_data {
0041 struct platform_device *pdev;
0042 phy_interface_t phy_iface;
0043 int id;
0044 struct regulator *regulator;
0045 bool suspended;
0046 const struct rk_gmac_ops *ops;
0047
0048 bool clk_enabled;
0049 bool clock_input;
0050 bool integrated_phy;
0051
0052 struct clk *clk_mac;
0053 struct clk *gmac_clkin;
0054 struct clk *mac_clk_rx;
0055 struct clk *mac_clk_tx;
0056 struct clk *clk_mac_ref;
0057 struct clk *clk_mac_refout;
0058 struct clk *clk_mac_speed;
0059 struct clk *aclk_mac;
0060 struct clk *pclk_mac;
0061 struct clk *clk_phy;
0062
0063 struct reset_control *phy_reset;
0064
0065 int tx_delay;
0066 int rx_delay;
0067
0068 struct regmap *grf;
0069 };
0070
0071 #define HIWORD_UPDATE(val, mask, shift) \
0072 ((val) << (shift) | (mask) << ((shift) + 16))
0073
0074 #define GRF_BIT(nr) (BIT(nr) | BIT(nr+16))
0075 #define GRF_CLR_BIT(nr) (BIT(nr+16))
0076
0077 #define DELAY_ENABLE(soc, tx, rx) \
0078 (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
0079 ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
0080
0081 #define PX30_GRF_GMAC_CON1 0x0904
0082
0083
0084 #define PX30_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
0085 GRF_BIT(6))
0086 #define PX30_GMAC_SPEED_10M GRF_CLR_BIT(2)
0087 #define PX30_GMAC_SPEED_100M GRF_BIT(2)
0088
0089 static void px30_set_to_rmii(struct rk_priv_data *bsp_priv)
0090 {
0091 struct device *dev = &bsp_priv->pdev->dev;
0092
0093 if (IS_ERR(bsp_priv->grf)) {
0094 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0095 return;
0096 }
0097
0098 regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
0099 PX30_GMAC_PHY_INTF_SEL_RMII);
0100 }
0101
0102 static void px30_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0103 {
0104 struct device *dev = &bsp_priv->pdev->dev;
0105 int ret;
0106
0107 if (IS_ERR(bsp_priv->clk_mac_speed)) {
0108 dev_err(dev, "%s: Missing clk_mac_speed clock\n", __func__);
0109 return;
0110 }
0111
0112 if (speed == 10) {
0113 regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
0114 PX30_GMAC_SPEED_10M);
0115
0116 ret = clk_set_rate(bsp_priv->clk_mac_speed, 2500000);
0117 if (ret)
0118 dev_err(dev, "%s: set clk_mac_speed rate 2500000 failed: %d\n",
0119 __func__, ret);
0120 } else if (speed == 100) {
0121 regmap_write(bsp_priv->grf, PX30_GRF_GMAC_CON1,
0122 PX30_GMAC_SPEED_100M);
0123
0124 ret = clk_set_rate(bsp_priv->clk_mac_speed, 25000000);
0125 if (ret)
0126 dev_err(dev, "%s: set clk_mac_speed rate 25000000 failed: %d\n",
0127 __func__, ret);
0128
0129 } else {
0130 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0131 }
0132 }
0133
0134 static const struct rk_gmac_ops px30_ops = {
0135 .set_to_rmii = px30_set_to_rmii,
0136 .set_rmii_speed = px30_set_rmii_speed,
0137 };
0138
0139 #define RK3128_GRF_MAC_CON0 0x0168
0140 #define RK3128_GRF_MAC_CON1 0x016c
0141
0142
0143 #define RK3128_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
0144 #define RK3128_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
0145 #define RK3128_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
0146 #define RK3128_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
0147 #define RK3128_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
0148 #define RK3128_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
0149
0150
0151 #define RK3128_GMAC_PHY_INTF_SEL_RGMII \
0152 (GRF_BIT(6) | GRF_CLR_BIT(7) | GRF_CLR_BIT(8))
0153 #define RK3128_GMAC_PHY_INTF_SEL_RMII \
0154 (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | GRF_BIT(8))
0155 #define RK3128_GMAC_FLOW_CTRL GRF_BIT(9)
0156 #define RK3128_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
0157 #define RK3128_GMAC_SPEED_10M GRF_CLR_BIT(10)
0158 #define RK3128_GMAC_SPEED_100M GRF_BIT(10)
0159 #define RK3128_GMAC_RMII_CLK_25M GRF_BIT(11)
0160 #define RK3128_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
0161 #define RK3128_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
0162 #define RK3128_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
0163 #define RK3128_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
0164 #define RK3128_GMAC_RMII_MODE GRF_BIT(14)
0165 #define RK3128_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
0166
0167 static void rk3128_set_to_rgmii(struct rk_priv_data *bsp_priv,
0168 int tx_delay, int rx_delay)
0169 {
0170 struct device *dev = &bsp_priv->pdev->dev;
0171
0172 if (IS_ERR(bsp_priv->grf)) {
0173 dev_err(dev, "Missing rockchip,grf property\n");
0174 return;
0175 }
0176
0177 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
0178 RK3128_GMAC_PHY_INTF_SEL_RGMII |
0179 RK3128_GMAC_RMII_MODE_CLR);
0180 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
0181 DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
0182 RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
0183 RK3128_GMAC_CLK_TX_DL_CFG(tx_delay));
0184 }
0185
0186 static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
0187 {
0188 struct device *dev = &bsp_priv->pdev->dev;
0189
0190 if (IS_ERR(bsp_priv->grf)) {
0191 dev_err(dev, "Missing rockchip,grf property\n");
0192 return;
0193 }
0194
0195 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
0196 RK3128_GMAC_PHY_INTF_SEL_RMII | RK3128_GMAC_RMII_MODE);
0197 }
0198
0199 static void rk3128_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
0200 {
0201 struct device *dev = &bsp_priv->pdev->dev;
0202
0203 if (IS_ERR(bsp_priv->grf)) {
0204 dev_err(dev, "Missing rockchip,grf property\n");
0205 return;
0206 }
0207
0208 if (speed == 10)
0209 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
0210 RK3128_GMAC_CLK_2_5M);
0211 else if (speed == 100)
0212 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
0213 RK3128_GMAC_CLK_25M);
0214 else if (speed == 1000)
0215 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
0216 RK3128_GMAC_CLK_125M);
0217 else
0218 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
0219 }
0220
0221 static void rk3128_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0222 {
0223 struct device *dev = &bsp_priv->pdev->dev;
0224
0225 if (IS_ERR(bsp_priv->grf)) {
0226 dev_err(dev, "Missing rockchip,grf property\n");
0227 return;
0228 }
0229
0230 if (speed == 10) {
0231 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
0232 RK3128_GMAC_RMII_CLK_2_5M |
0233 RK3128_GMAC_SPEED_10M);
0234 } else if (speed == 100) {
0235 regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON1,
0236 RK3128_GMAC_RMII_CLK_25M |
0237 RK3128_GMAC_SPEED_100M);
0238 } else {
0239 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0240 }
0241 }
0242
0243 static const struct rk_gmac_ops rk3128_ops = {
0244 .set_to_rgmii = rk3128_set_to_rgmii,
0245 .set_to_rmii = rk3128_set_to_rmii,
0246 .set_rgmii_speed = rk3128_set_rgmii_speed,
0247 .set_rmii_speed = rk3128_set_rmii_speed,
0248 };
0249
0250 #define RK3228_GRF_MAC_CON0 0x0900
0251 #define RK3228_GRF_MAC_CON1 0x0904
0252
0253 #define RK3228_GRF_CON_MUX 0x50
0254
0255
0256 #define RK3228_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
0257 #define RK3228_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
0258
0259
0260 #define RK3228_GMAC_PHY_INTF_SEL_RGMII \
0261 (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
0262 #define RK3228_GMAC_PHY_INTF_SEL_RMII \
0263 (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
0264 #define RK3228_GMAC_FLOW_CTRL GRF_BIT(3)
0265 #define RK3228_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
0266 #define RK3228_GMAC_SPEED_10M GRF_CLR_BIT(2)
0267 #define RK3228_GMAC_SPEED_100M GRF_BIT(2)
0268 #define RK3228_GMAC_RMII_CLK_25M GRF_BIT(7)
0269 #define RK3228_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
0270 #define RK3228_GMAC_CLK_125M (GRF_CLR_BIT(8) | GRF_CLR_BIT(9))
0271 #define RK3228_GMAC_CLK_25M (GRF_BIT(8) | GRF_BIT(9))
0272 #define RK3228_GMAC_CLK_2_5M (GRF_CLR_BIT(8) | GRF_BIT(9))
0273 #define RK3228_GMAC_RMII_MODE GRF_BIT(10)
0274 #define RK3228_GMAC_RMII_MODE_CLR GRF_CLR_BIT(10)
0275 #define RK3228_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
0276 #define RK3228_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
0277 #define RK3228_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
0278 #define RK3228_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
0279
0280
0281 #define RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY GRF_BIT(15)
0282
0283 static void rk3228_set_to_rgmii(struct rk_priv_data *bsp_priv,
0284 int tx_delay, int rx_delay)
0285 {
0286 struct device *dev = &bsp_priv->pdev->dev;
0287
0288 if (IS_ERR(bsp_priv->grf)) {
0289 dev_err(dev, "Missing rockchip,grf property\n");
0290 return;
0291 }
0292
0293 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
0294 RK3228_GMAC_PHY_INTF_SEL_RGMII |
0295 RK3228_GMAC_RMII_MODE_CLR |
0296 DELAY_ENABLE(RK3228, tx_delay, rx_delay));
0297
0298 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
0299 RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) |
0300 RK3228_GMAC_CLK_TX_DL_CFG(tx_delay));
0301 }
0302
0303 static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
0304 {
0305 struct device *dev = &bsp_priv->pdev->dev;
0306
0307 if (IS_ERR(bsp_priv->grf)) {
0308 dev_err(dev, "Missing rockchip,grf property\n");
0309 return;
0310 }
0311
0312 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
0313 RK3228_GMAC_PHY_INTF_SEL_RMII |
0314 RK3228_GMAC_RMII_MODE);
0315
0316
0317 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1, GRF_BIT(11));
0318 }
0319
0320 static void rk3228_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
0321 {
0322 struct device *dev = &bsp_priv->pdev->dev;
0323
0324 if (IS_ERR(bsp_priv->grf)) {
0325 dev_err(dev, "Missing rockchip,grf property\n");
0326 return;
0327 }
0328
0329 if (speed == 10)
0330 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
0331 RK3228_GMAC_CLK_2_5M);
0332 else if (speed == 100)
0333 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
0334 RK3228_GMAC_CLK_25M);
0335 else if (speed == 1000)
0336 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
0337 RK3228_GMAC_CLK_125M);
0338 else
0339 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
0340 }
0341
0342 static void rk3228_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0343 {
0344 struct device *dev = &bsp_priv->pdev->dev;
0345
0346 if (IS_ERR(bsp_priv->grf)) {
0347 dev_err(dev, "Missing rockchip,grf property\n");
0348 return;
0349 }
0350
0351 if (speed == 10)
0352 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
0353 RK3228_GMAC_RMII_CLK_2_5M |
0354 RK3228_GMAC_SPEED_10M);
0355 else if (speed == 100)
0356 regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON1,
0357 RK3228_GMAC_RMII_CLK_25M |
0358 RK3228_GMAC_SPEED_100M);
0359 else
0360 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0361 }
0362
0363 static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
0364 {
0365 regmap_write(priv->grf, RK3228_GRF_CON_MUX,
0366 RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
0367 }
0368
0369 static const struct rk_gmac_ops rk3228_ops = {
0370 .set_to_rgmii = rk3228_set_to_rgmii,
0371 .set_to_rmii = rk3228_set_to_rmii,
0372 .set_rgmii_speed = rk3228_set_rgmii_speed,
0373 .set_rmii_speed = rk3228_set_rmii_speed,
0374 .integrated_phy_powerup = rk3228_integrated_phy_powerup,
0375 };
0376
0377 #define RK3288_GRF_SOC_CON1 0x0248
0378 #define RK3288_GRF_SOC_CON3 0x0250
0379
0380
0381 #define RK3288_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(6) | GRF_CLR_BIT(7) | \
0382 GRF_CLR_BIT(8))
0383 #define RK3288_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(6) | GRF_CLR_BIT(7) | \
0384 GRF_BIT(8))
0385 #define RK3288_GMAC_FLOW_CTRL GRF_BIT(9)
0386 #define RK3288_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(9)
0387 #define RK3288_GMAC_SPEED_10M GRF_CLR_BIT(10)
0388 #define RK3288_GMAC_SPEED_100M GRF_BIT(10)
0389 #define RK3288_GMAC_RMII_CLK_25M GRF_BIT(11)
0390 #define RK3288_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(11)
0391 #define RK3288_GMAC_CLK_125M (GRF_CLR_BIT(12) | GRF_CLR_BIT(13))
0392 #define RK3288_GMAC_CLK_25M (GRF_BIT(12) | GRF_BIT(13))
0393 #define RK3288_GMAC_CLK_2_5M (GRF_CLR_BIT(12) | GRF_BIT(13))
0394 #define RK3288_GMAC_RMII_MODE GRF_BIT(14)
0395 #define RK3288_GMAC_RMII_MODE_CLR GRF_CLR_BIT(14)
0396
0397
0398 #define RK3288_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14)
0399 #define RK3288_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14)
0400 #define RK3288_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
0401 #define RK3288_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
0402 #define RK3288_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
0403 #define RK3288_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
0404
0405 static void rk3288_set_to_rgmii(struct rk_priv_data *bsp_priv,
0406 int tx_delay, int rx_delay)
0407 {
0408 struct device *dev = &bsp_priv->pdev->dev;
0409
0410 if (IS_ERR(bsp_priv->grf)) {
0411 dev_err(dev, "Missing rockchip,grf property\n");
0412 return;
0413 }
0414
0415 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
0416 RK3288_GMAC_PHY_INTF_SEL_RGMII |
0417 RK3288_GMAC_RMII_MODE_CLR);
0418 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
0419 DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
0420 RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
0421 RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
0422 }
0423
0424 static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
0425 {
0426 struct device *dev = &bsp_priv->pdev->dev;
0427
0428 if (IS_ERR(bsp_priv->grf)) {
0429 dev_err(dev, "Missing rockchip,grf property\n");
0430 return;
0431 }
0432
0433 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
0434 RK3288_GMAC_PHY_INTF_SEL_RMII | RK3288_GMAC_RMII_MODE);
0435 }
0436
0437 static void rk3288_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
0438 {
0439 struct device *dev = &bsp_priv->pdev->dev;
0440
0441 if (IS_ERR(bsp_priv->grf)) {
0442 dev_err(dev, "Missing rockchip,grf property\n");
0443 return;
0444 }
0445
0446 if (speed == 10)
0447 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
0448 RK3288_GMAC_CLK_2_5M);
0449 else if (speed == 100)
0450 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
0451 RK3288_GMAC_CLK_25M);
0452 else if (speed == 1000)
0453 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
0454 RK3288_GMAC_CLK_125M);
0455 else
0456 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
0457 }
0458
0459 static void rk3288_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0460 {
0461 struct device *dev = &bsp_priv->pdev->dev;
0462
0463 if (IS_ERR(bsp_priv->grf)) {
0464 dev_err(dev, "Missing rockchip,grf property\n");
0465 return;
0466 }
0467
0468 if (speed == 10) {
0469 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
0470 RK3288_GMAC_RMII_CLK_2_5M |
0471 RK3288_GMAC_SPEED_10M);
0472 } else if (speed == 100) {
0473 regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON1,
0474 RK3288_GMAC_RMII_CLK_25M |
0475 RK3288_GMAC_SPEED_100M);
0476 } else {
0477 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0478 }
0479 }
0480
0481 static const struct rk_gmac_ops rk3288_ops = {
0482 .set_to_rgmii = rk3288_set_to_rgmii,
0483 .set_to_rmii = rk3288_set_to_rmii,
0484 .set_rgmii_speed = rk3288_set_rgmii_speed,
0485 .set_rmii_speed = rk3288_set_rmii_speed,
0486 };
0487
0488 #define RK3308_GRF_MAC_CON0 0x04a0
0489
0490
0491 #define RK3308_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(2) | GRF_CLR_BIT(3) | \
0492 GRF_BIT(4))
0493 #define RK3308_GMAC_FLOW_CTRL GRF_BIT(3)
0494 #define RK3308_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
0495 #define RK3308_GMAC_SPEED_10M GRF_CLR_BIT(0)
0496 #define RK3308_GMAC_SPEED_100M GRF_BIT(0)
0497
0498 static void rk3308_set_to_rmii(struct rk_priv_data *bsp_priv)
0499 {
0500 struct device *dev = &bsp_priv->pdev->dev;
0501
0502 if (IS_ERR(bsp_priv->grf)) {
0503 dev_err(dev, "Missing rockchip,grf property\n");
0504 return;
0505 }
0506
0507 regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
0508 RK3308_GMAC_PHY_INTF_SEL_RMII);
0509 }
0510
0511 static void rk3308_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0512 {
0513 struct device *dev = &bsp_priv->pdev->dev;
0514
0515 if (IS_ERR(bsp_priv->grf)) {
0516 dev_err(dev, "Missing rockchip,grf property\n");
0517 return;
0518 }
0519
0520 if (speed == 10) {
0521 regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
0522 RK3308_GMAC_SPEED_10M);
0523 } else if (speed == 100) {
0524 regmap_write(bsp_priv->grf, RK3308_GRF_MAC_CON0,
0525 RK3308_GMAC_SPEED_100M);
0526 } else {
0527 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0528 }
0529 }
0530
0531 static const struct rk_gmac_ops rk3308_ops = {
0532 .set_to_rmii = rk3308_set_to_rmii,
0533 .set_rmii_speed = rk3308_set_rmii_speed,
0534 };
0535
0536 #define RK3328_GRF_MAC_CON0 0x0900
0537 #define RK3328_GRF_MAC_CON1 0x0904
0538 #define RK3328_GRF_MAC_CON2 0x0908
0539 #define RK3328_GRF_MACPHY_CON1 0xb04
0540
0541
0542 #define RK3328_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 7)
0543 #define RK3328_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
0544
0545
0546 #define RK3328_GMAC_PHY_INTF_SEL_RGMII \
0547 (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
0548 #define RK3328_GMAC_PHY_INTF_SEL_RMII \
0549 (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
0550 #define RK3328_GMAC_FLOW_CTRL GRF_BIT(3)
0551 #define RK3328_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
0552 #define RK3328_GMAC_SPEED_10M GRF_CLR_BIT(2)
0553 #define RK3328_GMAC_SPEED_100M GRF_BIT(2)
0554 #define RK3328_GMAC_RMII_CLK_25M GRF_BIT(7)
0555 #define RK3328_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
0556 #define RK3328_GMAC_CLK_125M (GRF_CLR_BIT(11) | GRF_CLR_BIT(12))
0557 #define RK3328_GMAC_CLK_25M (GRF_BIT(11) | GRF_BIT(12))
0558 #define RK3328_GMAC_CLK_2_5M (GRF_CLR_BIT(11) | GRF_BIT(12))
0559 #define RK3328_GMAC_RMII_MODE GRF_BIT(9)
0560 #define RK3328_GMAC_RMII_MODE_CLR GRF_CLR_BIT(9)
0561 #define RK3328_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
0562 #define RK3328_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
0563 #define RK3328_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
0564 #define RK3328_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(0)
0565
0566
0567 #define RK3328_MACPHY_RMII_MODE GRF_BIT(9)
0568
0569 static void rk3328_set_to_rgmii(struct rk_priv_data *bsp_priv,
0570 int tx_delay, int rx_delay)
0571 {
0572 struct device *dev = &bsp_priv->pdev->dev;
0573
0574 if (IS_ERR(bsp_priv->grf)) {
0575 dev_err(dev, "Missing rockchip,grf property\n");
0576 return;
0577 }
0578
0579 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
0580 RK3328_GMAC_PHY_INTF_SEL_RGMII |
0581 RK3328_GMAC_RMII_MODE_CLR |
0582 RK3328_GMAC_RXCLK_DLY_ENABLE |
0583 RK3328_GMAC_TXCLK_DLY_ENABLE);
0584
0585 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
0586 RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) |
0587 RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
0588 }
0589
0590 static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
0591 {
0592 struct device *dev = &bsp_priv->pdev->dev;
0593 unsigned int reg;
0594
0595 if (IS_ERR(bsp_priv->grf)) {
0596 dev_err(dev, "Missing rockchip,grf property\n");
0597 return;
0598 }
0599
0600 reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
0601 RK3328_GRF_MAC_CON1;
0602
0603 regmap_write(bsp_priv->grf, reg,
0604 RK3328_GMAC_PHY_INTF_SEL_RMII |
0605 RK3328_GMAC_RMII_MODE);
0606 }
0607
0608 static void rk3328_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
0609 {
0610 struct device *dev = &bsp_priv->pdev->dev;
0611
0612 if (IS_ERR(bsp_priv->grf)) {
0613 dev_err(dev, "Missing rockchip,grf property\n");
0614 return;
0615 }
0616
0617 if (speed == 10)
0618 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
0619 RK3328_GMAC_CLK_2_5M);
0620 else if (speed == 100)
0621 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
0622 RK3328_GMAC_CLK_25M);
0623 else if (speed == 1000)
0624 regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
0625 RK3328_GMAC_CLK_125M);
0626 else
0627 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
0628 }
0629
0630 static void rk3328_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0631 {
0632 struct device *dev = &bsp_priv->pdev->dev;
0633 unsigned int reg;
0634
0635 if (IS_ERR(bsp_priv->grf)) {
0636 dev_err(dev, "Missing rockchip,grf property\n");
0637 return;
0638 }
0639
0640 reg = bsp_priv->integrated_phy ? RK3328_GRF_MAC_CON2 :
0641 RK3328_GRF_MAC_CON1;
0642
0643 if (speed == 10)
0644 regmap_write(bsp_priv->grf, reg,
0645 RK3328_GMAC_RMII_CLK_2_5M |
0646 RK3328_GMAC_SPEED_10M);
0647 else if (speed == 100)
0648 regmap_write(bsp_priv->grf, reg,
0649 RK3328_GMAC_RMII_CLK_25M |
0650 RK3328_GMAC_SPEED_100M);
0651 else
0652 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0653 }
0654
0655 static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
0656 {
0657 regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
0658 RK3328_MACPHY_RMII_MODE);
0659 }
0660
0661 static const struct rk_gmac_ops rk3328_ops = {
0662 .set_to_rgmii = rk3328_set_to_rgmii,
0663 .set_to_rmii = rk3328_set_to_rmii,
0664 .set_rgmii_speed = rk3328_set_rgmii_speed,
0665 .set_rmii_speed = rk3328_set_rmii_speed,
0666 .integrated_phy_powerup = rk3328_integrated_phy_powerup,
0667 };
0668
0669 #define RK3366_GRF_SOC_CON6 0x0418
0670 #define RK3366_GRF_SOC_CON7 0x041c
0671
0672
0673 #define RK3366_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
0674 GRF_CLR_BIT(11))
0675 #define RK3366_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
0676 GRF_BIT(11))
0677 #define RK3366_GMAC_FLOW_CTRL GRF_BIT(8)
0678 #define RK3366_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
0679 #define RK3366_GMAC_SPEED_10M GRF_CLR_BIT(7)
0680 #define RK3366_GMAC_SPEED_100M GRF_BIT(7)
0681 #define RK3366_GMAC_RMII_CLK_25M GRF_BIT(3)
0682 #define RK3366_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
0683 #define RK3366_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
0684 #define RK3366_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
0685 #define RK3366_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
0686 #define RK3366_GMAC_RMII_MODE GRF_BIT(6)
0687 #define RK3366_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
0688
0689
0690 #define RK3366_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
0691 #define RK3366_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
0692 #define RK3366_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
0693 #define RK3366_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
0694 #define RK3366_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
0695 #define RK3366_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
0696
0697 static void rk3366_set_to_rgmii(struct rk_priv_data *bsp_priv,
0698 int tx_delay, int rx_delay)
0699 {
0700 struct device *dev = &bsp_priv->pdev->dev;
0701
0702 if (IS_ERR(bsp_priv->grf)) {
0703 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0704 return;
0705 }
0706
0707 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
0708 RK3366_GMAC_PHY_INTF_SEL_RGMII |
0709 RK3366_GMAC_RMII_MODE_CLR);
0710 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
0711 DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
0712 RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
0713 RK3366_GMAC_CLK_TX_DL_CFG(tx_delay));
0714 }
0715
0716 static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
0717 {
0718 struct device *dev = &bsp_priv->pdev->dev;
0719
0720 if (IS_ERR(bsp_priv->grf)) {
0721 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0722 return;
0723 }
0724
0725 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
0726 RK3366_GMAC_PHY_INTF_SEL_RMII | RK3366_GMAC_RMII_MODE);
0727 }
0728
0729 static void rk3366_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
0730 {
0731 struct device *dev = &bsp_priv->pdev->dev;
0732
0733 if (IS_ERR(bsp_priv->grf)) {
0734 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0735 return;
0736 }
0737
0738 if (speed == 10)
0739 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
0740 RK3366_GMAC_CLK_2_5M);
0741 else if (speed == 100)
0742 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
0743 RK3366_GMAC_CLK_25M);
0744 else if (speed == 1000)
0745 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
0746 RK3366_GMAC_CLK_125M);
0747 else
0748 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
0749 }
0750
0751 static void rk3366_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0752 {
0753 struct device *dev = &bsp_priv->pdev->dev;
0754
0755 if (IS_ERR(bsp_priv->grf)) {
0756 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0757 return;
0758 }
0759
0760 if (speed == 10) {
0761 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
0762 RK3366_GMAC_RMII_CLK_2_5M |
0763 RK3366_GMAC_SPEED_10M);
0764 } else if (speed == 100) {
0765 regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON6,
0766 RK3366_GMAC_RMII_CLK_25M |
0767 RK3366_GMAC_SPEED_100M);
0768 } else {
0769 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0770 }
0771 }
0772
0773 static const struct rk_gmac_ops rk3366_ops = {
0774 .set_to_rgmii = rk3366_set_to_rgmii,
0775 .set_to_rmii = rk3366_set_to_rmii,
0776 .set_rgmii_speed = rk3366_set_rgmii_speed,
0777 .set_rmii_speed = rk3366_set_rmii_speed,
0778 };
0779
0780 #define RK3368_GRF_SOC_CON15 0x043c
0781 #define RK3368_GRF_SOC_CON16 0x0440
0782
0783
0784 #define RK3368_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
0785 GRF_CLR_BIT(11))
0786 #define RK3368_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
0787 GRF_BIT(11))
0788 #define RK3368_GMAC_FLOW_CTRL GRF_BIT(8)
0789 #define RK3368_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
0790 #define RK3368_GMAC_SPEED_10M GRF_CLR_BIT(7)
0791 #define RK3368_GMAC_SPEED_100M GRF_BIT(7)
0792 #define RK3368_GMAC_RMII_CLK_25M GRF_BIT(3)
0793 #define RK3368_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
0794 #define RK3368_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
0795 #define RK3368_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
0796 #define RK3368_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
0797 #define RK3368_GMAC_RMII_MODE GRF_BIT(6)
0798 #define RK3368_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
0799
0800
0801 #define RK3368_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
0802 #define RK3368_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
0803 #define RK3368_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
0804 #define RK3368_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
0805 #define RK3368_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
0806 #define RK3368_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
0807
0808 static void rk3368_set_to_rgmii(struct rk_priv_data *bsp_priv,
0809 int tx_delay, int rx_delay)
0810 {
0811 struct device *dev = &bsp_priv->pdev->dev;
0812
0813 if (IS_ERR(bsp_priv->grf)) {
0814 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0815 return;
0816 }
0817
0818 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
0819 RK3368_GMAC_PHY_INTF_SEL_RGMII |
0820 RK3368_GMAC_RMII_MODE_CLR);
0821 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
0822 DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
0823 RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
0824 RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
0825 }
0826
0827 static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
0828 {
0829 struct device *dev = &bsp_priv->pdev->dev;
0830
0831 if (IS_ERR(bsp_priv->grf)) {
0832 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0833 return;
0834 }
0835
0836 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
0837 RK3368_GMAC_PHY_INTF_SEL_RMII | RK3368_GMAC_RMII_MODE);
0838 }
0839
0840 static void rk3368_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
0841 {
0842 struct device *dev = &bsp_priv->pdev->dev;
0843
0844 if (IS_ERR(bsp_priv->grf)) {
0845 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0846 return;
0847 }
0848
0849 if (speed == 10)
0850 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
0851 RK3368_GMAC_CLK_2_5M);
0852 else if (speed == 100)
0853 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
0854 RK3368_GMAC_CLK_25M);
0855 else if (speed == 1000)
0856 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
0857 RK3368_GMAC_CLK_125M);
0858 else
0859 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
0860 }
0861
0862 static void rk3368_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0863 {
0864 struct device *dev = &bsp_priv->pdev->dev;
0865
0866 if (IS_ERR(bsp_priv->grf)) {
0867 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0868 return;
0869 }
0870
0871 if (speed == 10) {
0872 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
0873 RK3368_GMAC_RMII_CLK_2_5M |
0874 RK3368_GMAC_SPEED_10M);
0875 } else if (speed == 100) {
0876 regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON15,
0877 RK3368_GMAC_RMII_CLK_25M |
0878 RK3368_GMAC_SPEED_100M);
0879 } else {
0880 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0881 }
0882 }
0883
0884 static const struct rk_gmac_ops rk3368_ops = {
0885 .set_to_rgmii = rk3368_set_to_rgmii,
0886 .set_to_rmii = rk3368_set_to_rmii,
0887 .set_rgmii_speed = rk3368_set_rgmii_speed,
0888 .set_rmii_speed = rk3368_set_rmii_speed,
0889 };
0890
0891 #define RK3399_GRF_SOC_CON5 0xc214
0892 #define RK3399_GRF_SOC_CON6 0xc218
0893
0894
0895 #define RK3399_GMAC_PHY_INTF_SEL_RGMII (GRF_BIT(9) | GRF_CLR_BIT(10) | \
0896 GRF_CLR_BIT(11))
0897 #define RK3399_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(9) | GRF_CLR_BIT(10) | \
0898 GRF_BIT(11))
0899 #define RK3399_GMAC_FLOW_CTRL GRF_BIT(8)
0900 #define RK3399_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(8)
0901 #define RK3399_GMAC_SPEED_10M GRF_CLR_BIT(7)
0902 #define RK3399_GMAC_SPEED_100M GRF_BIT(7)
0903 #define RK3399_GMAC_RMII_CLK_25M GRF_BIT(3)
0904 #define RK3399_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(3)
0905 #define RK3399_GMAC_CLK_125M (GRF_CLR_BIT(4) | GRF_CLR_BIT(5))
0906 #define RK3399_GMAC_CLK_25M (GRF_BIT(4) | GRF_BIT(5))
0907 #define RK3399_GMAC_CLK_2_5M (GRF_CLR_BIT(4) | GRF_BIT(5))
0908 #define RK3399_GMAC_RMII_MODE GRF_BIT(6)
0909 #define RK3399_GMAC_RMII_MODE_CLR GRF_CLR_BIT(6)
0910
0911
0912 #define RK3399_GMAC_TXCLK_DLY_ENABLE GRF_BIT(7)
0913 #define RK3399_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(7)
0914 #define RK3399_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15)
0915 #define RK3399_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15)
0916 #define RK3399_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
0917 #define RK3399_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
0918
0919 static void rk3399_set_to_rgmii(struct rk_priv_data *bsp_priv,
0920 int tx_delay, int rx_delay)
0921 {
0922 struct device *dev = &bsp_priv->pdev->dev;
0923
0924 if (IS_ERR(bsp_priv->grf)) {
0925 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0926 return;
0927 }
0928
0929 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
0930 RK3399_GMAC_PHY_INTF_SEL_RGMII |
0931 RK3399_GMAC_RMII_MODE_CLR);
0932 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
0933 DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
0934 RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
0935 RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
0936 }
0937
0938 static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
0939 {
0940 struct device *dev = &bsp_priv->pdev->dev;
0941
0942 if (IS_ERR(bsp_priv->grf)) {
0943 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0944 return;
0945 }
0946
0947 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
0948 RK3399_GMAC_PHY_INTF_SEL_RMII | RK3399_GMAC_RMII_MODE);
0949 }
0950
0951 static void rk3399_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
0952 {
0953 struct device *dev = &bsp_priv->pdev->dev;
0954
0955 if (IS_ERR(bsp_priv->grf)) {
0956 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0957 return;
0958 }
0959
0960 if (speed == 10)
0961 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
0962 RK3399_GMAC_CLK_2_5M);
0963 else if (speed == 100)
0964 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
0965 RK3399_GMAC_CLK_25M);
0966 else if (speed == 1000)
0967 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
0968 RK3399_GMAC_CLK_125M);
0969 else
0970 dev_err(dev, "unknown speed value for RGMII! speed=%d", speed);
0971 }
0972
0973 static void rk3399_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
0974 {
0975 struct device *dev = &bsp_priv->pdev->dev;
0976
0977 if (IS_ERR(bsp_priv->grf)) {
0978 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
0979 return;
0980 }
0981
0982 if (speed == 10) {
0983 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
0984 RK3399_GMAC_RMII_CLK_2_5M |
0985 RK3399_GMAC_SPEED_10M);
0986 } else if (speed == 100) {
0987 regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON5,
0988 RK3399_GMAC_RMII_CLK_25M |
0989 RK3399_GMAC_SPEED_100M);
0990 } else {
0991 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
0992 }
0993 }
0994
0995 static const struct rk_gmac_ops rk3399_ops = {
0996 .set_to_rgmii = rk3399_set_to_rgmii,
0997 .set_to_rmii = rk3399_set_to_rmii,
0998 .set_rgmii_speed = rk3399_set_rgmii_speed,
0999 .set_rmii_speed = rk3399_set_rmii_speed,
1000 };
1001
1002 #define RK3568_GRF_GMAC0_CON0 0x0380
1003 #define RK3568_GRF_GMAC0_CON1 0x0384
1004 #define RK3568_GRF_GMAC1_CON0 0x0388
1005 #define RK3568_GRF_GMAC1_CON1 0x038c
1006
1007
1008 #define RK3568_GMAC_PHY_INTF_SEL_RGMII \
1009 (GRF_BIT(4) | GRF_CLR_BIT(5) | GRF_CLR_BIT(6))
1010 #define RK3568_GMAC_PHY_INTF_SEL_RMII \
1011 (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
1012 #define RK3568_GMAC_FLOW_CTRL GRF_BIT(3)
1013 #define RK3568_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
1014 #define RK3568_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1)
1015 #define RK3568_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1)
1016 #define RK3568_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0)
1017 #define RK3568_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0)
1018
1019
1020 #define RK3568_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8)
1021 #define RK3568_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0)
1022
1023 static void rk3568_set_to_rgmii(struct rk_priv_data *bsp_priv,
1024 int tx_delay, int rx_delay)
1025 {
1026 struct device *dev = &bsp_priv->pdev->dev;
1027 u32 con0, con1;
1028
1029 if (IS_ERR(bsp_priv->grf)) {
1030 dev_err(dev, "Missing rockchip,grf property\n");
1031 return;
1032 }
1033
1034 con0 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON0 :
1035 RK3568_GRF_GMAC0_CON0;
1036 con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
1037 RK3568_GRF_GMAC0_CON1;
1038
1039 regmap_write(bsp_priv->grf, con0,
1040 RK3568_GMAC_CLK_RX_DL_CFG(rx_delay) |
1041 RK3568_GMAC_CLK_TX_DL_CFG(tx_delay));
1042
1043 regmap_write(bsp_priv->grf, con1,
1044 RK3568_GMAC_PHY_INTF_SEL_RGMII |
1045 RK3568_GMAC_RXCLK_DLY_ENABLE |
1046 RK3568_GMAC_TXCLK_DLY_ENABLE);
1047 }
1048
1049 static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
1050 {
1051 struct device *dev = &bsp_priv->pdev->dev;
1052 u32 con1;
1053
1054 if (IS_ERR(bsp_priv->grf)) {
1055 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1056 return;
1057 }
1058
1059 con1 = (bsp_priv->id == 1) ? RK3568_GRF_GMAC1_CON1 :
1060 RK3568_GRF_GMAC0_CON1;
1061 regmap_write(bsp_priv->grf, con1, RK3568_GMAC_PHY_INTF_SEL_RMII);
1062 }
1063
1064 static void rk3568_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed)
1065 {
1066 struct device *dev = &bsp_priv->pdev->dev;
1067 unsigned long rate;
1068 int ret;
1069
1070 switch (speed) {
1071 case 10:
1072 rate = 2500000;
1073 break;
1074 case 100:
1075 rate = 25000000;
1076 break;
1077 case 1000:
1078 rate = 125000000;
1079 break;
1080 default:
1081 dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
1082 return;
1083 }
1084
1085 ret = clk_set_rate(bsp_priv->clk_mac_speed, rate);
1086 if (ret)
1087 dev_err(dev, "%s: set clk_mac_speed rate %ld failed %d\n",
1088 __func__, rate, ret);
1089 }
1090
1091 static const struct rk_gmac_ops rk3568_ops = {
1092 .set_to_rgmii = rk3568_set_to_rgmii,
1093 .set_to_rmii = rk3568_set_to_rmii,
1094 .set_rgmii_speed = rk3568_set_gmac_speed,
1095 .set_rmii_speed = rk3568_set_gmac_speed,
1096 .regs_valid = true,
1097 .regs = {
1098 0xfe2a0000,
1099 0xfe010000,
1100 0x0,
1101 },
1102 };
1103
1104 #define RV1108_GRF_GMAC_CON0 0X0900
1105
1106
1107 #define RV1108_GMAC_PHY_INTF_SEL_RMII (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | \
1108 GRF_BIT(6))
1109 #define RV1108_GMAC_FLOW_CTRL GRF_BIT(3)
1110 #define RV1108_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(3)
1111 #define RV1108_GMAC_SPEED_10M GRF_CLR_BIT(2)
1112 #define RV1108_GMAC_SPEED_100M GRF_BIT(2)
1113 #define RV1108_GMAC_RMII_CLK_25M GRF_BIT(7)
1114 #define RV1108_GMAC_RMII_CLK_2_5M GRF_CLR_BIT(7)
1115
1116 static void rv1108_set_to_rmii(struct rk_priv_data *bsp_priv)
1117 {
1118 struct device *dev = &bsp_priv->pdev->dev;
1119
1120 if (IS_ERR(bsp_priv->grf)) {
1121 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1122 return;
1123 }
1124
1125 regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
1126 RV1108_GMAC_PHY_INTF_SEL_RMII);
1127 }
1128
1129 static void rv1108_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
1130 {
1131 struct device *dev = &bsp_priv->pdev->dev;
1132
1133 if (IS_ERR(bsp_priv->grf)) {
1134 dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
1135 return;
1136 }
1137
1138 if (speed == 10) {
1139 regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
1140 RV1108_GMAC_RMII_CLK_2_5M |
1141 RV1108_GMAC_SPEED_10M);
1142 } else if (speed == 100) {
1143 regmap_write(bsp_priv->grf, RV1108_GRF_GMAC_CON0,
1144 RV1108_GMAC_RMII_CLK_25M |
1145 RV1108_GMAC_SPEED_100M);
1146 } else {
1147 dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
1148 }
1149 }
1150
1151 static const struct rk_gmac_ops rv1108_ops = {
1152 .set_to_rmii = rv1108_set_to_rmii,
1153 .set_rmii_speed = rv1108_set_rmii_speed,
1154 };
1155
1156 #define RK_GRF_MACPHY_CON0 0xb00
1157 #define RK_GRF_MACPHY_CON1 0xb04
1158 #define RK_GRF_MACPHY_CON2 0xb08
1159 #define RK_GRF_MACPHY_CON3 0xb0c
1160
1161 #define RK_MACPHY_ENABLE GRF_BIT(0)
1162 #define RK_MACPHY_DISABLE GRF_CLR_BIT(0)
1163 #define RK_MACPHY_CFG_CLK_50M GRF_BIT(14)
1164 #define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7))
1165 #define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0)
1166 #define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0)
1167
1168 static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
1169 {
1170 if (priv->ops->integrated_phy_powerup)
1171 priv->ops->integrated_phy_powerup(priv);
1172
1173 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
1174 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
1175
1176 regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
1177 regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
1178
1179 if (priv->phy_reset) {
1180
1181 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
1182 if (priv->phy_reset)
1183 reset_control_assert(priv->phy_reset);
1184 usleep_range(10, 20);
1185 if (priv->phy_reset)
1186 reset_control_deassert(priv->phy_reset);
1187 usleep_range(10, 20);
1188 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
1189 msleep(30);
1190 }
1191 }
1192
1193 static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
1194 {
1195 regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
1196 if (priv->phy_reset)
1197 reset_control_assert(priv->phy_reset);
1198 }
1199
1200 static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
1201 {
1202 struct rk_priv_data *bsp_priv = plat->bsp_priv;
1203 struct device *dev = &bsp_priv->pdev->dev;
1204 int ret;
1205
1206 bsp_priv->clk_enabled = false;
1207
1208 bsp_priv->mac_clk_rx = devm_clk_get(dev, "mac_clk_rx");
1209 if (IS_ERR(bsp_priv->mac_clk_rx))
1210 dev_err(dev, "cannot get clock %s\n",
1211 "mac_clk_rx");
1212
1213 bsp_priv->mac_clk_tx = devm_clk_get(dev, "mac_clk_tx");
1214 if (IS_ERR(bsp_priv->mac_clk_tx))
1215 dev_err(dev, "cannot get clock %s\n",
1216 "mac_clk_tx");
1217
1218 bsp_priv->aclk_mac = devm_clk_get(dev, "aclk_mac");
1219 if (IS_ERR(bsp_priv->aclk_mac))
1220 dev_err(dev, "cannot get clock %s\n",
1221 "aclk_mac");
1222
1223 bsp_priv->pclk_mac = devm_clk_get(dev, "pclk_mac");
1224 if (IS_ERR(bsp_priv->pclk_mac))
1225 dev_err(dev, "cannot get clock %s\n",
1226 "pclk_mac");
1227
1228 bsp_priv->clk_mac = devm_clk_get(dev, "stmmaceth");
1229 if (IS_ERR(bsp_priv->clk_mac))
1230 dev_err(dev, "cannot get clock %s\n",
1231 "stmmaceth");
1232
1233 if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) {
1234 bsp_priv->clk_mac_ref = devm_clk_get(dev, "clk_mac_ref");
1235 if (IS_ERR(bsp_priv->clk_mac_ref))
1236 dev_err(dev, "cannot get clock %s\n",
1237 "clk_mac_ref");
1238
1239 if (!bsp_priv->clock_input) {
1240 bsp_priv->clk_mac_refout =
1241 devm_clk_get(dev, "clk_mac_refout");
1242 if (IS_ERR(bsp_priv->clk_mac_refout))
1243 dev_err(dev, "cannot get clock %s\n",
1244 "clk_mac_refout");
1245 }
1246 }
1247
1248 bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed");
1249 if (IS_ERR(bsp_priv->clk_mac_speed))
1250 dev_err(dev, "cannot get clock %s\n", "clk_mac_speed");
1251
1252 if (bsp_priv->clock_input) {
1253 dev_info(dev, "clock input from PHY\n");
1254 } else {
1255 if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
1256 clk_set_rate(bsp_priv->clk_mac, 50000000);
1257 }
1258
1259 if (plat->phy_node && bsp_priv->integrated_phy) {
1260 bsp_priv->clk_phy = of_clk_get(plat->phy_node, 0);
1261 if (IS_ERR(bsp_priv->clk_phy)) {
1262 ret = PTR_ERR(bsp_priv->clk_phy);
1263 dev_err(dev, "Cannot get PHY clock: %d\n", ret);
1264 return -EINVAL;
1265 }
1266 clk_set_rate(bsp_priv->clk_phy, 50000000);
1267 }
1268
1269 return 0;
1270 }
1271
1272 static int gmac_clk_enable(struct rk_priv_data *bsp_priv, bool enable)
1273 {
1274 int phy_iface = bsp_priv->phy_iface;
1275
1276 if (enable) {
1277 if (!bsp_priv->clk_enabled) {
1278 if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1279 if (!IS_ERR(bsp_priv->mac_clk_rx))
1280 clk_prepare_enable(
1281 bsp_priv->mac_clk_rx);
1282
1283 if (!IS_ERR(bsp_priv->clk_mac_ref))
1284 clk_prepare_enable(
1285 bsp_priv->clk_mac_ref);
1286
1287 if (!IS_ERR(bsp_priv->clk_mac_refout))
1288 clk_prepare_enable(
1289 bsp_priv->clk_mac_refout);
1290 }
1291
1292 if (!IS_ERR(bsp_priv->clk_phy))
1293 clk_prepare_enable(bsp_priv->clk_phy);
1294
1295 if (!IS_ERR(bsp_priv->aclk_mac))
1296 clk_prepare_enable(bsp_priv->aclk_mac);
1297
1298 if (!IS_ERR(bsp_priv->pclk_mac))
1299 clk_prepare_enable(bsp_priv->pclk_mac);
1300
1301 if (!IS_ERR(bsp_priv->mac_clk_tx))
1302 clk_prepare_enable(bsp_priv->mac_clk_tx);
1303
1304 if (!IS_ERR(bsp_priv->clk_mac_speed))
1305 clk_prepare_enable(bsp_priv->clk_mac_speed);
1306
1307
1308
1309
1310
1311 mdelay(5);
1312 bsp_priv->clk_enabled = true;
1313 }
1314 } else {
1315 if (bsp_priv->clk_enabled) {
1316 if (phy_iface == PHY_INTERFACE_MODE_RMII) {
1317 clk_disable_unprepare(bsp_priv->mac_clk_rx);
1318
1319 clk_disable_unprepare(bsp_priv->clk_mac_ref);
1320
1321 clk_disable_unprepare(bsp_priv->clk_mac_refout);
1322 }
1323
1324 clk_disable_unprepare(bsp_priv->clk_phy);
1325
1326 clk_disable_unprepare(bsp_priv->aclk_mac);
1327
1328 clk_disable_unprepare(bsp_priv->pclk_mac);
1329
1330 clk_disable_unprepare(bsp_priv->mac_clk_tx);
1331
1332 clk_disable_unprepare(bsp_priv->clk_mac_speed);
1333
1334
1335
1336
1337 bsp_priv->clk_enabled = false;
1338 }
1339 }
1340
1341 return 0;
1342 }
1343
1344 static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
1345 {
1346 struct regulator *ldo = bsp_priv->regulator;
1347 int ret;
1348 struct device *dev = &bsp_priv->pdev->dev;
1349
1350 if (!ldo)
1351 return 0;
1352
1353 if (enable) {
1354 ret = regulator_enable(ldo);
1355 if (ret)
1356 dev_err(dev, "fail to enable phy-supply\n");
1357 } else {
1358 ret = regulator_disable(ldo);
1359 if (ret)
1360 dev_err(dev, "fail to disable phy-supply\n");
1361 }
1362
1363 return 0;
1364 }
1365
1366 static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
1367 struct plat_stmmacenet_data *plat,
1368 const struct rk_gmac_ops *ops)
1369 {
1370 struct rk_priv_data *bsp_priv;
1371 struct device *dev = &pdev->dev;
1372 struct resource *res;
1373 int ret;
1374 const char *strings = NULL;
1375 int value;
1376
1377 bsp_priv = devm_kzalloc(dev, sizeof(*bsp_priv), GFP_KERNEL);
1378 if (!bsp_priv)
1379 return ERR_PTR(-ENOMEM);
1380
1381 of_get_phy_mode(dev->of_node, &bsp_priv->phy_iface);
1382 bsp_priv->ops = ops;
1383
1384
1385
1386
1387 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1388 if (res && ops->regs_valid) {
1389 int i = 0;
1390
1391 while (ops->regs[i]) {
1392 if (ops->regs[i] == res->start) {
1393 bsp_priv->id = i;
1394 break;
1395 }
1396 i++;
1397 }
1398 }
1399
1400 bsp_priv->regulator = devm_regulator_get_optional(dev, "phy");
1401 if (IS_ERR(bsp_priv->regulator)) {
1402 if (PTR_ERR(bsp_priv->regulator) == -EPROBE_DEFER) {
1403 dev_err(dev, "phy regulator is not available yet, deferred probing\n");
1404 return ERR_PTR(-EPROBE_DEFER);
1405 }
1406 dev_err(dev, "no regulator found\n");
1407 bsp_priv->regulator = NULL;
1408 }
1409
1410 ret = of_property_read_string(dev->of_node, "clock_in_out", &strings);
1411 if (ret) {
1412 dev_err(dev, "Can not read property: clock_in_out.\n");
1413 bsp_priv->clock_input = true;
1414 } else {
1415 dev_info(dev, "clock input or output? (%s).\n",
1416 strings);
1417 if (!strcmp(strings, "input"))
1418 bsp_priv->clock_input = true;
1419 else
1420 bsp_priv->clock_input = false;
1421 }
1422
1423 ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
1424 if (ret) {
1425 bsp_priv->tx_delay = 0x30;
1426 dev_err(dev, "Can not read property: tx_delay.");
1427 dev_err(dev, "set tx_delay to 0x%x\n",
1428 bsp_priv->tx_delay);
1429 } else {
1430 dev_info(dev, "TX delay(0x%x).\n", value);
1431 bsp_priv->tx_delay = value;
1432 }
1433
1434 ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
1435 if (ret) {
1436 bsp_priv->rx_delay = 0x10;
1437 dev_err(dev, "Can not read property: rx_delay.");
1438 dev_err(dev, "set rx_delay to 0x%x\n",
1439 bsp_priv->rx_delay);
1440 } else {
1441 dev_info(dev, "RX delay(0x%x).\n", value);
1442 bsp_priv->rx_delay = value;
1443 }
1444
1445 bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
1446 "rockchip,grf");
1447
1448 if (plat->phy_node) {
1449 bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
1450 "phy-is-integrated");
1451 if (bsp_priv->integrated_phy) {
1452 bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL);
1453 if (IS_ERR(bsp_priv->phy_reset)) {
1454 dev_err(&pdev->dev, "No PHY reset control found.\n");
1455 bsp_priv->phy_reset = NULL;
1456 }
1457 }
1458 }
1459 dev_info(dev, "integrated PHY? (%s).\n",
1460 bsp_priv->integrated_phy ? "yes" : "no");
1461
1462 bsp_priv->pdev = pdev;
1463
1464 return bsp_priv;
1465 }
1466
1467 static int rk_gmac_check_ops(struct rk_priv_data *bsp_priv)
1468 {
1469 switch (bsp_priv->phy_iface) {
1470 case PHY_INTERFACE_MODE_RGMII:
1471 case PHY_INTERFACE_MODE_RGMII_ID:
1472 case PHY_INTERFACE_MODE_RGMII_RXID:
1473 case PHY_INTERFACE_MODE_RGMII_TXID:
1474 if (!bsp_priv->ops->set_to_rgmii)
1475 return -EINVAL;
1476 break;
1477 case PHY_INTERFACE_MODE_RMII:
1478 if (!bsp_priv->ops->set_to_rmii)
1479 return -EINVAL;
1480 break;
1481 default:
1482 dev_err(&bsp_priv->pdev->dev,
1483 "unsupported interface %d", bsp_priv->phy_iface);
1484 }
1485 return 0;
1486 }
1487
1488 static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
1489 {
1490 int ret;
1491 struct device *dev = &bsp_priv->pdev->dev;
1492
1493 ret = rk_gmac_check_ops(bsp_priv);
1494 if (ret)
1495 return ret;
1496
1497 ret = gmac_clk_enable(bsp_priv, true);
1498 if (ret)
1499 return ret;
1500
1501
1502 switch (bsp_priv->phy_iface) {
1503 case PHY_INTERFACE_MODE_RGMII:
1504 dev_info(dev, "init for RGMII\n");
1505 bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay,
1506 bsp_priv->rx_delay);
1507 break;
1508 case PHY_INTERFACE_MODE_RGMII_ID:
1509 dev_info(dev, "init for RGMII_ID\n");
1510 bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
1511 break;
1512 case PHY_INTERFACE_MODE_RGMII_RXID:
1513 dev_info(dev, "init for RGMII_RXID\n");
1514 bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0);
1515 break;
1516 case PHY_INTERFACE_MODE_RGMII_TXID:
1517 dev_info(dev, "init for RGMII_TXID\n");
1518 bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay);
1519 break;
1520 case PHY_INTERFACE_MODE_RMII:
1521 dev_info(dev, "init for RMII\n");
1522 bsp_priv->ops->set_to_rmii(bsp_priv);
1523 break;
1524 default:
1525 dev_err(dev, "NO interface defined!\n");
1526 }
1527
1528 ret = phy_power_on(bsp_priv, true);
1529 if (ret) {
1530 gmac_clk_enable(bsp_priv, false);
1531 return ret;
1532 }
1533
1534 pm_runtime_get_sync(dev);
1535
1536 if (bsp_priv->integrated_phy)
1537 rk_gmac_integrated_phy_powerup(bsp_priv);
1538
1539 return 0;
1540 }
1541
1542 static void rk_gmac_powerdown(struct rk_priv_data *gmac)
1543 {
1544 if (gmac->integrated_phy)
1545 rk_gmac_integrated_phy_powerdown(gmac);
1546
1547 pm_runtime_put_sync(&gmac->pdev->dev);
1548
1549 phy_power_on(gmac, false);
1550 gmac_clk_enable(gmac, false);
1551 }
1552
1553 static void rk_fix_speed(void *priv, unsigned int speed)
1554 {
1555 struct rk_priv_data *bsp_priv = priv;
1556 struct device *dev = &bsp_priv->pdev->dev;
1557
1558 switch (bsp_priv->phy_iface) {
1559 case PHY_INTERFACE_MODE_RGMII:
1560 case PHY_INTERFACE_MODE_RGMII_ID:
1561 case PHY_INTERFACE_MODE_RGMII_RXID:
1562 case PHY_INTERFACE_MODE_RGMII_TXID:
1563 if (bsp_priv->ops->set_rgmii_speed)
1564 bsp_priv->ops->set_rgmii_speed(bsp_priv, speed);
1565 break;
1566 case PHY_INTERFACE_MODE_RMII:
1567 if (bsp_priv->ops->set_rmii_speed)
1568 bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
1569 break;
1570 default:
1571 dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
1572 }
1573 }
1574
1575 static int rk_gmac_probe(struct platform_device *pdev)
1576 {
1577 struct plat_stmmacenet_data *plat_dat;
1578 struct stmmac_resources stmmac_res;
1579 const struct rk_gmac_ops *data;
1580 int ret;
1581
1582 data = of_device_get_match_data(&pdev->dev);
1583 if (!data) {
1584 dev_err(&pdev->dev, "no of match data provided\n");
1585 return -EINVAL;
1586 }
1587
1588 ret = stmmac_get_platform_resources(pdev, &stmmac_res);
1589 if (ret)
1590 return ret;
1591
1592 plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
1593 if (IS_ERR(plat_dat))
1594 return PTR_ERR(plat_dat);
1595
1596
1597
1598
1599 if (!plat_dat->has_gmac4)
1600 plat_dat->has_gmac = true;
1601 plat_dat->fix_mac_speed = rk_fix_speed;
1602
1603 plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
1604 if (IS_ERR(plat_dat->bsp_priv)) {
1605 ret = PTR_ERR(plat_dat->bsp_priv);
1606 goto err_remove_config_dt;
1607 }
1608
1609 ret = rk_gmac_clk_init(plat_dat);
1610 if (ret)
1611 goto err_remove_config_dt;
1612
1613 ret = rk_gmac_powerup(plat_dat->bsp_priv);
1614 if (ret)
1615 goto err_remove_config_dt;
1616
1617 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
1618 if (ret)
1619 goto err_gmac_powerdown;
1620
1621 return 0;
1622
1623 err_gmac_powerdown:
1624 rk_gmac_powerdown(plat_dat->bsp_priv);
1625 err_remove_config_dt:
1626 stmmac_remove_config_dt(pdev, plat_dat);
1627
1628 return ret;
1629 }
1630
1631 static int rk_gmac_remove(struct platform_device *pdev)
1632 {
1633 struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(&pdev->dev);
1634 int ret = stmmac_dvr_remove(&pdev->dev);
1635
1636 rk_gmac_powerdown(bsp_priv);
1637
1638 return ret;
1639 }
1640
1641 #ifdef CONFIG_PM_SLEEP
1642 static int rk_gmac_suspend(struct device *dev)
1643 {
1644 struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
1645 int ret = stmmac_suspend(dev);
1646
1647
1648 if (!device_may_wakeup(dev)) {
1649 rk_gmac_powerdown(bsp_priv);
1650 bsp_priv->suspended = true;
1651 }
1652
1653 return ret;
1654 }
1655
1656 static int rk_gmac_resume(struct device *dev)
1657 {
1658 struct rk_priv_data *bsp_priv = get_stmmac_bsp_priv(dev);
1659
1660
1661 if (bsp_priv->suspended) {
1662 rk_gmac_powerup(bsp_priv);
1663 bsp_priv->suspended = false;
1664 }
1665
1666 return stmmac_resume(dev);
1667 }
1668 #endif
1669
1670 static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
1671
1672 static const struct of_device_id rk_gmac_dwmac_match[] = {
1673 { .compatible = "rockchip,px30-gmac", .data = &px30_ops },
1674 { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },
1675 { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
1676 { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
1677 { .compatible = "rockchip,rk3308-gmac", .data = &rk3308_ops },
1678 { .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
1679 { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
1680 { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
1681 { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
1682 { .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
1683 { .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
1684 { }
1685 };
1686 MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
1687
1688 static struct platform_driver rk_gmac_dwmac_driver = {
1689 .probe = rk_gmac_probe,
1690 .remove = rk_gmac_remove,
1691 .driver = {
1692 .name = "rk_gmac-dwmac",
1693 .pm = &rk_gmac_pm_ops,
1694 .of_match_table = rk_gmac_dwmac_match,
1695 },
1696 };
1697 module_platform_driver(rk_gmac_dwmac_driver);
1698
1699 MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
1700 MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
1701 MODULE_LICENSE("GPL");