0001
0002
0003
0004
0005 #include <linux/bitfield.h>
0006 #include <linux/io.h>
0007 #include <linux/mfd/syscon.h>
0008 #include <linux/module.h>
0009 #include <linux/of.h>
0010 #include <linux/of_device.h>
0011 #include <linux/of_net.h>
0012 #include <linux/regmap.h>
0013 #include <linux/stmmac.h>
0014
0015 #include "stmmac.h"
0016 #include "stmmac_platform.h"
0017
0018
0019 #define PERI_ETH_PHY_INTF_SEL 0x418
0020 #define PHY_INTF_MII 0
0021 #define PHY_INTF_RGMII 1
0022 #define PHY_INTF_RMII 4
0023 #define RMII_CLK_SRC_RXC BIT(4)
0024 #define RMII_CLK_SRC_INTERNAL BIT(5)
0025
0026 #define PERI_ETH_DLY 0x428
0027 #define ETH_DLY_GTXC_INV BIT(6)
0028 #define ETH_DLY_GTXC_ENABLE BIT(5)
0029 #define ETH_DLY_GTXC_STAGES GENMASK(4, 0)
0030 #define ETH_DLY_TXC_INV BIT(20)
0031 #define ETH_DLY_TXC_ENABLE BIT(19)
0032 #define ETH_DLY_TXC_STAGES GENMASK(18, 14)
0033 #define ETH_DLY_RXC_INV BIT(13)
0034 #define ETH_DLY_RXC_ENABLE BIT(12)
0035 #define ETH_DLY_RXC_STAGES GENMASK(11, 7)
0036
0037 #define PERI_ETH_DLY_FINE 0x800
0038 #define ETH_RMII_DLY_TX_INV BIT(2)
0039 #define ETH_FINE_DLY_GTXC BIT(1)
0040 #define ETH_FINE_DLY_RXC BIT(0)
0041
0042
0043 #define MT8195_PERI_ETH_CTRL0 0xFD0
0044 #define MT8195_RMII_CLK_SRC_INTERNAL BIT(28)
0045 #define MT8195_RMII_CLK_SRC_RXC BIT(27)
0046 #define MT8195_ETH_INTF_SEL GENMASK(26, 24)
0047 #define MT8195_RGMII_TXC_PHASE_CTRL BIT(22)
0048 #define MT8195_EXT_PHY_MODE BIT(21)
0049 #define MT8195_DLY_GTXC_INV BIT(12)
0050 #define MT8195_DLY_GTXC_ENABLE BIT(5)
0051 #define MT8195_DLY_GTXC_STAGES GENMASK(4, 0)
0052
0053 #define MT8195_PERI_ETH_CTRL1 0xFD4
0054 #define MT8195_DLY_RXC_INV BIT(25)
0055 #define MT8195_DLY_RXC_ENABLE BIT(18)
0056 #define MT8195_DLY_RXC_STAGES GENMASK(17, 13)
0057 #define MT8195_DLY_TXC_INV BIT(12)
0058 #define MT8195_DLY_TXC_ENABLE BIT(5)
0059 #define MT8195_DLY_TXC_STAGES GENMASK(4, 0)
0060
0061 #define MT8195_PERI_ETH_CTRL2 0xFD8
0062 #define MT8195_DLY_RMII_RXC_INV BIT(25)
0063 #define MT8195_DLY_RMII_RXC_ENABLE BIT(18)
0064 #define MT8195_DLY_RMII_RXC_STAGES GENMASK(17, 13)
0065 #define MT8195_DLY_RMII_TXC_INV BIT(12)
0066 #define MT8195_DLY_RMII_TXC_ENABLE BIT(5)
0067 #define MT8195_DLY_RMII_TXC_STAGES GENMASK(4, 0)
0068
0069 struct mac_delay_struct {
0070 u32 tx_delay;
0071 u32 rx_delay;
0072 bool tx_inv;
0073 bool rx_inv;
0074 };
0075
0076 struct mediatek_dwmac_plat_data {
0077 const struct mediatek_dwmac_variant *variant;
0078 struct mac_delay_struct mac_delay;
0079 struct clk *rmii_internal_clk;
0080 struct clk_bulk_data *clks;
0081 struct regmap *peri_regmap;
0082 struct device_node *np;
0083 struct device *dev;
0084 phy_interface_t phy_mode;
0085 bool rmii_clk_from_mac;
0086 bool rmii_rxc;
0087 bool mac_wol;
0088 };
0089
0090 struct mediatek_dwmac_variant {
0091 int (*dwmac_set_phy_interface)(struct mediatek_dwmac_plat_data *plat);
0092 int (*dwmac_set_delay)(struct mediatek_dwmac_plat_data *plat);
0093 void (*dwmac_fix_mac_speed)(void *priv, unsigned int speed);
0094
0095
0096 const char * const *clk_list;
0097 int num_clks;
0098
0099 u32 dma_bit_mask;
0100 u32 rx_delay_max;
0101 u32 tx_delay_max;
0102 };
0103
0104
0105 static const char * const mt2712_dwmac_clk_l[] = {
0106 "axi", "apb", "mac_main", "ptp_ref"
0107 };
0108
0109 static const char * const mt8195_dwmac_clk_l[] = {
0110 "axi", "apb", "mac_cg", "mac_main", "ptp_ref"
0111 };
0112
0113 static int mt2712_set_interface(struct mediatek_dwmac_plat_data *plat)
0114 {
0115 int rmii_clk_from_mac = plat->rmii_clk_from_mac ? RMII_CLK_SRC_INTERNAL : 0;
0116 int rmii_rxc = plat->rmii_rxc ? RMII_CLK_SRC_RXC : 0;
0117 u32 intf_val = 0;
0118
0119
0120 switch (plat->phy_mode) {
0121 case PHY_INTERFACE_MODE_MII:
0122 intf_val |= PHY_INTF_MII;
0123 break;
0124 case PHY_INTERFACE_MODE_RMII:
0125 intf_val |= (PHY_INTF_RMII | rmii_rxc | rmii_clk_from_mac);
0126 break;
0127 case PHY_INTERFACE_MODE_RGMII:
0128 case PHY_INTERFACE_MODE_RGMII_TXID:
0129 case PHY_INTERFACE_MODE_RGMII_RXID:
0130 case PHY_INTERFACE_MODE_RGMII_ID:
0131 intf_val |= PHY_INTF_RGMII;
0132 break;
0133 default:
0134 dev_err(plat->dev, "phy interface not supported\n");
0135 return -EINVAL;
0136 }
0137
0138 regmap_write(plat->peri_regmap, PERI_ETH_PHY_INTF_SEL, intf_val);
0139
0140 return 0;
0141 }
0142
0143 static void mt2712_delay_ps2stage(struct mediatek_dwmac_plat_data *plat)
0144 {
0145 struct mac_delay_struct *mac_delay = &plat->mac_delay;
0146
0147 switch (plat->phy_mode) {
0148 case PHY_INTERFACE_MODE_MII:
0149 case PHY_INTERFACE_MODE_RMII:
0150
0151 mac_delay->tx_delay /= 550;
0152 mac_delay->rx_delay /= 550;
0153 break;
0154 case PHY_INTERFACE_MODE_RGMII:
0155 case PHY_INTERFACE_MODE_RGMII_TXID:
0156 case PHY_INTERFACE_MODE_RGMII_RXID:
0157 case PHY_INTERFACE_MODE_RGMII_ID:
0158
0159 mac_delay->tx_delay /= 170;
0160 mac_delay->rx_delay /= 170;
0161 break;
0162 default:
0163 dev_err(plat->dev, "phy interface not supported\n");
0164 break;
0165 }
0166 }
0167
0168 static void mt2712_delay_stage2ps(struct mediatek_dwmac_plat_data *plat)
0169 {
0170 struct mac_delay_struct *mac_delay = &plat->mac_delay;
0171
0172 switch (plat->phy_mode) {
0173 case PHY_INTERFACE_MODE_MII:
0174 case PHY_INTERFACE_MODE_RMII:
0175
0176 mac_delay->tx_delay *= 550;
0177 mac_delay->rx_delay *= 550;
0178 break;
0179 case PHY_INTERFACE_MODE_RGMII:
0180 case PHY_INTERFACE_MODE_RGMII_TXID:
0181 case PHY_INTERFACE_MODE_RGMII_RXID:
0182 case PHY_INTERFACE_MODE_RGMII_ID:
0183
0184 mac_delay->tx_delay *= 170;
0185 mac_delay->rx_delay *= 170;
0186 break;
0187 default:
0188 dev_err(plat->dev, "phy interface not supported\n");
0189 break;
0190 }
0191 }
0192
0193 static int mt2712_set_delay(struct mediatek_dwmac_plat_data *plat)
0194 {
0195 struct mac_delay_struct *mac_delay = &plat->mac_delay;
0196 u32 delay_val = 0, fine_val = 0;
0197
0198 mt2712_delay_ps2stage(plat);
0199
0200 switch (plat->phy_mode) {
0201 case PHY_INTERFACE_MODE_MII:
0202 delay_val |= FIELD_PREP(ETH_DLY_TXC_ENABLE, !!mac_delay->tx_delay);
0203 delay_val |= FIELD_PREP(ETH_DLY_TXC_STAGES, mac_delay->tx_delay);
0204 delay_val |= FIELD_PREP(ETH_DLY_TXC_INV, mac_delay->tx_inv);
0205
0206 delay_val |= FIELD_PREP(ETH_DLY_RXC_ENABLE, !!mac_delay->rx_delay);
0207 delay_val |= FIELD_PREP(ETH_DLY_RXC_STAGES, mac_delay->rx_delay);
0208 delay_val |= FIELD_PREP(ETH_DLY_RXC_INV, mac_delay->rx_inv);
0209 break;
0210 case PHY_INTERFACE_MODE_RMII:
0211 if (plat->rmii_clk_from_mac) {
0212
0213
0214
0215
0216
0217 delay_val |= FIELD_PREP(ETH_DLY_TXC_ENABLE, !!mac_delay->rx_delay);
0218 delay_val |= FIELD_PREP(ETH_DLY_TXC_STAGES, mac_delay->rx_delay);
0219 delay_val |= FIELD_PREP(ETH_DLY_TXC_INV, mac_delay->rx_inv);
0220
0221 delay_val |= FIELD_PREP(ETH_DLY_GTXC_ENABLE, !!mac_delay->tx_delay);
0222 delay_val |= FIELD_PREP(ETH_DLY_GTXC_STAGES, mac_delay->tx_delay);
0223 delay_val |= FIELD_PREP(ETH_DLY_GTXC_INV, mac_delay->tx_inv);
0224 } else {
0225
0226
0227
0228
0229
0230
0231 if (plat->rmii_rxc) {
0232
0233
0234
0235
0236 delay_val |= FIELD_PREP(ETH_DLY_RXC_ENABLE, !!mac_delay->rx_delay);
0237 delay_val |= FIELD_PREP(ETH_DLY_RXC_STAGES, mac_delay->rx_delay);
0238 delay_val |= FIELD_PREP(ETH_DLY_RXC_INV, mac_delay->rx_inv);
0239 } else {
0240
0241
0242
0243
0244 delay_val |= FIELD_PREP(ETH_DLY_TXC_ENABLE, !!mac_delay->rx_delay);
0245 delay_val |= FIELD_PREP(ETH_DLY_TXC_STAGES, mac_delay->rx_delay);
0246 delay_val |= FIELD_PREP(ETH_DLY_TXC_INV, mac_delay->rx_inv);
0247 }
0248
0249
0250
0251
0252 if (mac_delay->tx_inv)
0253 fine_val = ETH_RMII_DLY_TX_INV;
0254 }
0255 break;
0256 case PHY_INTERFACE_MODE_RGMII:
0257 case PHY_INTERFACE_MODE_RGMII_TXID:
0258 case PHY_INTERFACE_MODE_RGMII_RXID:
0259 case PHY_INTERFACE_MODE_RGMII_ID:
0260 fine_val = ETH_FINE_DLY_GTXC | ETH_FINE_DLY_RXC;
0261
0262 delay_val |= FIELD_PREP(ETH_DLY_GTXC_ENABLE, !!mac_delay->tx_delay);
0263 delay_val |= FIELD_PREP(ETH_DLY_GTXC_STAGES, mac_delay->tx_delay);
0264 delay_val |= FIELD_PREP(ETH_DLY_GTXC_INV, mac_delay->tx_inv);
0265
0266 delay_val |= FIELD_PREP(ETH_DLY_RXC_ENABLE, !!mac_delay->rx_delay);
0267 delay_val |= FIELD_PREP(ETH_DLY_RXC_STAGES, mac_delay->rx_delay);
0268 delay_val |= FIELD_PREP(ETH_DLY_RXC_INV, mac_delay->rx_inv);
0269 break;
0270 default:
0271 dev_err(plat->dev, "phy interface not supported\n");
0272 return -EINVAL;
0273 }
0274 regmap_write(plat->peri_regmap, PERI_ETH_DLY, delay_val);
0275 regmap_write(plat->peri_regmap, PERI_ETH_DLY_FINE, fine_val);
0276
0277 mt2712_delay_stage2ps(plat);
0278
0279 return 0;
0280 }
0281
0282 static const struct mediatek_dwmac_variant mt2712_gmac_variant = {
0283 .dwmac_set_phy_interface = mt2712_set_interface,
0284 .dwmac_set_delay = mt2712_set_delay,
0285 .clk_list = mt2712_dwmac_clk_l,
0286 .num_clks = ARRAY_SIZE(mt2712_dwmac_clk_l),
0287 .dma_bit_mask = 33,
0288 .rx_delay_max = 17600,
0289 .tx_delay_max = 17600,
0290 };
0291
0292 static int mt8195_set_interface(struct mediatek_dwmac_plat_data *plat)
0293 {
0294 int rmii_clk_from_mac = plat->rmii_clk_from_mac ? MT8195_RMII_CLK_SRC_INTERNAL : 0;
0295 int rmii_rxc = plat->rmii_rxc ? MT8195_RMII_CLK_SRC_RXC : 0;
0296 u32 intf_val = 0;
0297
0298
0299 switch (plat->phy_mode) {
0300 case PHY_INTERFACE_MODE_MII:
0301 intf_val |= FIELD_PREP(MT8195_ETH_INTF_SEL, PHY_INTF_MII);
0302 break;
0303 case PHY_INTERFACE_MODE_RMII:
0304 intf_val |= (rmii_rxc | rmii_clk_from_mac);
0305 intf_val |= FIELD_PREP(MT8195_ETH_INTF_SEL, PHY_INTF_RMII);
0306 break;
0307 case PHY_INTERFACE_MODE_RGMII:
0308 case PHY_INTERFACE_MODE_RGMII_TXID:
0309 case PHY_INTERFACE_MODE_RGMII_RXID:
0310 case PHY_INTERFACE_MODE_RGMII_ID:
0311 intf_val |= FIELD_PREP(MT8195_ETH_INTF_SEL, PHY_INTF_RGMII);
0312 break;
0313 default:
0314 dev_err(plat->dev, "phy interface not supported\n");
0315 return -EINVAL;
0316 }
0317
0318
0319 intf_val |= MT8195_EXT_PHY_MODE;
0320
0321 regmap_write(plat->peri_regmap, MT8195_PERI_ETH_CTRL0, intf_val);
0322
0323 return 0;
0324 }
0325
0326 static void mt8195_delay_ps2stage(struct mediatek_dwmac_plat_data *plat)
0327 {
0328 struct mac_delay_struct *mac_delay = &plat->mac_delay;
0329
0330
0331 mac_delay->tx_delay /= 290;
0332 mac_delay->rx_delay /= 290;
0333 }
0334
0335 static void mt8195_delay_stage2ps(struct mediatek_dwmac_plat_data *plat)
0336 {
0337 struct mac_delay_struct *mac_delay = &plat->mac_delay;
0338
0339
0340 mac_delay->tx_delay *= 290;
0341 mac_delay->rx_delay *= 290;
0342 }
0343
0344 static int mt8195_set_delay(struct mediatek_dwmac_plat_data *plat)
0345 {
0346 struct mac_delay_struct *mac_delay = &plat->mac_delay;
0347 u32 gtxc_delay_val = 0, delay_val = 0, rmii_delay_val = 0;
0348
0349 mt8195_delay_ps2stage(plat);
0350
0351 switch (plat->phy_mode) {
0352 case PHY_INTERFACE_MODE_MII:
0353 delay_val |= FIELD_PREP(MT8195_DLY_TXC_ENABLE, !!mac_delay->tx_delay);
0354 delay_val |= FIELD_PREP(MT8195_DLY_TXC_STAGES, mac_delay->tx_delay);
0355 delay_val |= FIELD_PREP(MT8195_DLY_TXC_INV, mac_delay->tx_inv);
0356
0357 delay_val |= FIELD_PREP(MT8195_DLY_RXC_ENABLE, !!mac_delay->rx_delay);
0358 delay_val |= FIELD_PREP(MT8195_DLY_RXC_STAGES, mac_delay->rx_delay);
0359 delay_val |= FIELD_PREP(MT8195_DLY_RXC_INV, mac_delay->rx_inv);
0360 break;
0361 case PHY_INTERFACE_MODE_RMII:
0362 if (plat->rmii_clk_from_mac) {
0363
0364
0365
0366
0367
0368 rmii_delay_val |= FIELD_PREP(MT8195_DLY_RMII_TXC_ENABLE,
0369 !!mac_delay->tx_delay);
0370 rmii_delay_val |= FIELD_PREP(MT8195_DLY_RMII_TXC_STAGES,
0371 mac_delay->tx_delay);
0372 rmii_delay_val |= FIELD_PREP(MT8195_DLY_RMII_TXC_INV,
0373 mac_delay->tx_inv);
0374
0375 rmii_delay_val |= FIELD_PREP(MT8195_DLY_RMII_RXC_ENABLE,
0376 !!mac_delay->rx_delay);
0377 rmii_delay_val |= FIELD_PREP(MT8195_DLY_RMII_RXC_STAGES,
0378 mac_delay->rx_delay);
0379 rmii_delay_val |= FIELD_PREP(MT8195_DLY_RMII_RXC_INV,
0380 mac_delay->rx_inv);
0381 } else {
0382
0383
0384
0385
0386
0387
0388 if (plat->rmii_rxc) {
0389
0390
0391
0392
0393 delay_val |= FIELD_PREP(MT8195_DLY_RXC_ENABLE,
0394 !!mac_delay->rx_delay);
0395 delay_val |= FIELD_PREP(MT8195_DLY_RXC_STAGES,
0396 mac_delay->rx_delay);
0397 delay_val |= FIELD_PREP(MT8195_DLY_RXC_INV,
0398 mac_delay->rx_inv);
0399 } else {
0400
0401
0402
0403
0404 delay_val |= FIELD_PREP(MT8195_DLY_TXC_ENABLE,
0405 !!mac_delay->rx_delay);
0406 delay_val |= FIELD_PREP(MT8195_DLY_TXC_STAGES,
0407 mac_delay->rx_delay);
0408 delay_val |= FIELD_PREP(MT8195_DLY_TXC_INV,
0409 mac_delay->rx_inv);
0410 }
0411 }
0412 break;
0413 case PHY_INTERFACE_MODE_RGMII:
0414 case PHY_INTERFACE_MODE_RGMII_TXID:
0415 case PHY_INTERFACE_MODE_RGMII_RXID:
0416 case PHY_INTERFACE_MODE_RGMII_ID:
0417 gtxc_delay_val |= FIELD_PREP(MT8195_DLY_GTXC_ENABLE, !!mac_delay->tx_delay);
0418 gtxc_delay_val |= FIELD_PREP(MT8195_DLY_GTXC_STAGES, mac_delay->tx_delay);
0419 gtxc_delay_val |= FIELD_PREP(MT8195_DLY_GTXC_INV, mac_delay->tx_inv);
0420
0421 delay_val |= FIELD_PREP(MT8195_DLY_RXC_ENABLE, !!mac_delay->rx_delay);
0422 delay_val |= FIELD_PREP(MT8195_DLY_RXC_STAGES, mac_delay->rx_delay);
0423 delay_val |= FIELD_PREP(MT8195_DLY_RXC_INV, mac_delay->rx_inv);
0424
0425 break;
0426 default:
0427 dev_err(plat->dev, "phy interface not supported\n");
0428 return -EINVAL;
0429 }
0430
0431 regmap_update_bits(plat->peri_regmap,
0432 MT8195_PERI_ETH_CTRL0,
0433 MT8195_RGMII_TXC_PHASE_CTRL |
0434 MT8195_DLY_GTXC_INV |
0435 MT8195_DLY_GTXC_ENABLE |
0436 MT8195_DLY_GTXC_STAGES,
0437 gtxc_delay_val);
0438 regmap_write(plat->peri_regmap, MT8195_PERI_ETH_CTRL1, delay_val);
0439 regmap_write(plat->peri_regmap, MT8195_PERI_ETH_CTRL2, rmii_delay_val);
0440
0441 mt8195_delay_stage2ps(plat);
0442
0443 return 0;
0444 }
0445
0446 static void mt8195_fix_mac_speed(void *priv, unsigned int speed)
0447 {
0448 struct mediatek_dwmac_plat_data *priv_plat = priv;
0449
0450 if ((phy_interface_mode_is_rgmii(priv_plat->phy_mode))) {
0451
0452
0453
0454
0455 if (speed == SPEED_1000)
0456 regmap_update_bits(priv_plat->peri_regmap,
0457 MT8195_PERI_ETH_CTRL0,
0458 MT8195_RGMII_TXC_PHASE_CTRL |
0459 MT8195_DLY_GTXC_ENABLE |
0460 MT8195_DLY_GTXC_INV |
0461 MT8195_DLY_GTXC_STAGES,
0462 MT8195_RGMII_TXC_PHASE_CTRL);
0463 else
0464 mt8195_set_delay(priv_plat);
0465 }
0466 }
0467
0468 static const struct mediatek_dwmac_variant mt8195_gmac_variant = {
0469 .dwmac_set_phy_interface = mt8195_set_interface,
0470 .dwmac_set_delay = mt8195_set_delay,
0471 .dwmac_fix_mac_speed = mt8195_fix_mac_speed,
0472 .clk_list = mt8195_dwmac_clk_l,
0473 .num_clks = ARRAY_SIZE(mt8195_dwmac_clk_l),
0474 .dma_bit_mask = 35,
0475 .rx_delay_max = 9280,
0476 .tx_delay_max = 9280,
0477 };
0478
0479 static int mediatek_dwmac_config_dt(struct mediatek_dwmac_plat_data *plat)
0480 {
0481 struct mac_delay_struct *mac_delay = &plat->mac_delay;
0482 u32 tx_delay_ps, rx_delay_ps;
0483 int err;
0484
0485 plat->peri_regmap = syscon_regmap_lookup_by_phandle(plat->np, "mediatek,pericfg");
0486 if (IS_ERR(plat->peri_regmap)) {
0487 dev_err(plat->dev, "Failed to get pericfg syscon\n");
0488 return PTR_ERR(plat->peri_regmap);
0489 }
0490
0491 err = of_get_phy_mode(plat->np, &plat->phy_mode);
0492 if (err) {
0493 dev_err(plat->dev, "not find phy-mode\n");
0494 return err;
0495 }
0496
0497 if (!of_property_read_u32(plat->np, "mediatek,tx-delay-ps", &tx_delay_ps)) {
0498 if (tx_delay_ps < plat->variant->tx_delay_max) {
0499 mac_delay->tx_delay = tx_delay_ps;
0500 } else {
0501 dev_err(plat->dev, "Invalid TX clock delay: %dps\n", tx_delay_ps);
0502 return -EINVAL;
0503 }
0504 }
0505
0506 if (!of_property_read_u32(plat->np, "mediatek,rx-delay-ps", &rx_delay_ps)) {
0507 if (rx_delay_ps < plat->variant->rx_delay_max) {
0508 mac_delay->rx_delay = rx_delay_ps;
0509 } else {
0510 dev_err(plat->dev, "Invalid RX clock delay: %dps\n", rx_delay_ps);
0511 return -EINVAL;
0512 }
0513 }
0514
0515 mac_delay->tx_inv = of_property_read_bool(plat->np, "mediatek,txc-inverse");
0516 mac_delay->rx_inv = of_property_read_bool(plat->np, "mediatek,rxc-inverse");
0517 plat->rmii_rxc = of_property_read_bool(plat->np, "mediatek,rmii-rxc");
0518 plat->rmii_clk_from_mac = of_property_read_bool(plat->np, "mediatek,rmii-clk-from-mac");
0519 plat->mac_wol = of_property_read_bool(plat->np, "mediatek,mac-wol");
0520
0521 return 0;
0522 }
0523
0524 static int mediatek_dwmac_clk_init(struct mediatek_dwmac_plat_data *plat)
0525 {
0526 const struct mediatek_dwmac_variant *variant = plat->variant;
0527 int i, ret;
0528
0529 plat->clks = devm_kcalloc(plat->dev, variant->num_clks, sizeof(*plat->clks), GFP_KERNEL);
0530 if (!plat->clks)
0531 return -ENOMEM;
0532
0533 for (i = 0; i < variant->num_clks; i++)
0534 plat->clks[i].id = variant->clk_list[i];
0535
0536 ret = devm_clk_bulk_get(plat->dev, variant->num_clks, plat->clks);
0537 if (ret)
0538 return ret;
0539
0540
0541
0542
0543
0544
0545
0546 if (plat->rmii_clk_from_mac) {
0547 plat->rmii_internal_clk = devm_clk_get(plat->dev, "rmii_internal");
0548 if (IS_ERR(plat->rmii_internal_clk))
0549 ret = PTR_ERR(plat->rmii_internal_clk);
0550 } else {
0551 plat->rmii_internal_clk = NULL;
0552 }
0553
0554 return ret;
0555 }
0556
0557 static int mediatek_dwmac_init(struct platform_device *pdev, void *priv)
0558 {
0559 struct mediatek_dwmac_plat_data *plat = priv;
0560 const struct mediatek_dwmac_variant *variant = plat->variant;
0561 int ret;
0562
0563 if (variant->dwmac_set_phy_interface) {
0564 ret = variant->dwmac_set_phy_interface(plat);
0565 if (ret) {
0566 dev_err(plat->dev, "failed to set phy interface, err = %d\n", ret);
0567 return ret;
0568 }
0569 }
0570
0571 if (variant->dwmac_set_delay) {
0572 ret = variant->dwmac_set_delay(plat);
0573 if (ret) {
0574 dev_err(plat->dev, "failed to set delay value, err = %d\n", ret);
0575 return ret;
0576 }
0577 }
0578
0579 return 0;
0580 }
0581
0582 static int mediatek_dwmac_clks_config(void *priv, bool enabled)
0583 {
0584 struct mediatek_dwmac_plat_data *plat = priv;
0585 const struct mediatek_dwmac_variant *variant = plat->variant;
0586 int ret = 0;
0587
0588 if (enabled) {
0589 ret = clk_bulk_prepare_enable(variant->num_clks, plat->clks);
0590 if (ret) {
0591 dev_err(plat->dev, "failed to enable clks, err = %d\n", ret);
0592 return ret;
0593 }
0594
0595 ret = clk_prepare_enable(plat->rmii_internal_clk);
0596 if (ret) {
0597 dev_err(plat->dev, "failed to enable rmii internal clk, err = %d\n", ret);
0598 return ret;
0599 }
0600 } else {
0601 clk_disable_unprepare(plat->rmii_internal_clk);
0602 clk_bulk_disable_unprepare(variant->num_clks, plat->clks);
0603 }
0604
0605 return ret;
0606 }
0607
0608 static int mediatek_dwmac_common_data(struct platform_device *pdev,
0609 struct plat_stmmacenet_data *plat,
0610 struct mediatek_dwmac_plat_data *priv_plat)
0611 {
0612 int i;
0613
0614 plat->interface = priv_plat->phy_mode;
0615 plat->use_phy_wol = priv_plat->mac_wol ? 0 : 1;
0616 plat->riwt_off = 1;
0617 plat->maxmtu = ETH_DATA_LEN;
0618 plat->addr64 = priv_plat->variant->dma_bit_mask;
0619 plat->bsp_priv = priv_plat;
0620 plat->init = mediatek_dwmac_init;
0621 plat->clks_config = mediatek_dwmac_clks_config;
0622 if (priv_plat->variant->dwmac_fix_mac_speed)
0623 plat->fix_mac_speed = priv_plat->variant->dwmac_fix_mac_speed;
0624
0625 plat->safety_feat_cfg = devm_kzalloc(&pdev->dev,
0626 sizeof(*plat->safety_feat_cfg),
0627 GFP_KERNEL);
0628 if (!plat->safety_feat_cfg)
0629 return -ENOMEM;
0630
0631 plat->safety_feat_cfg->tsoee = 1;
0632 plat->safety_feat_cfg->mrxpee = 0;
0633 plat->safety_feat_cfg->mestee = 1;
0634 plat->safety_feat_cfg->mrxee = 1;
0635 plat->safety_feat_cfg->mtxee = 1;
0636 plat->safety_feat_cfg->epsi = 0;
0637 plat->safety_feat_cfg->edpp = 1;
0638 plat->safety_feat_cfg->prtyen = 1;
0639 plat->safety_feat_cfg->tmouten = 1;
0640
0641 for (i = 0; i < plat->tx_queues_to_use; i++) {
0642
0643 if (i > 0)
0644 plat->tx_queues_cfg[i].tbs_en = 1;
0645 }
0646
0647 return 0;
0648 }
0649
0650 static int mediatek_dwmac_probe(struct platform_device *pdev)
0651 {
0652 struct mediatek_dwmac_plat_data *priv_plat;
0653 struct plat_stmmacenet_data *plat_dat;
0654 struct stmmac_resources stmmac_res;
0655 int ret;
0656
0657 priv_plat = devm_kzalloc(&pdev->dev, sizeof(*priv_plat), GFP_KERNEL);
0658 if (!priv_plat)
0659 return -ENOMEM;
0660
0661 priv_plat->variant = of_device_get_match_data(&pdev->dev);
0662 if (!priv_plat->variant) {
0663 dev_err(&pdev->dev, "Missing dwmac-mediatek variant\n");
0664 return -EINVAL;
0665 }
0666
0667 priv_plat->dev = &pdev->dev;
0668 priv_plat->np = pdev->dev.of_node;
0669
0670 ret = mediatek_dwmac_config_dt(priv_plat);
0671 if (ret)
0672 return ret;
0673
0674 ret = mediatek_dwmac_clk_init(priv_plat);
0675 if (ret)
0676 return ret;
0677
0678 ret = stmmac_get_platform_resources(pdev, &stmmac_res);
0679 if (ret)
0680 return ret;
0681
0682 plat_dat = stmmac_probe_config_dt(pdev, stmmac_res.mac);
0683 if (IS_ERR(plat_dat))
0684 return PTR_ERR(plat_dat);
0685
0686 mediatek_dwmac_common_data(pdev, plat_dat, priv_plat);
0687 mediatek_dwmac_init(pdev, priv_plat);
0688
0689 ret = mediatek_dwmac_clks_config(priv_plat, true);
0690 if (ret)
0691 goto err_remove_config_dt;
0692
0693 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
0694 if (ret)
0695 goto err_drv_probe;
0696
0697 return 0;
0698
0699 err_drv_probe:
0700 mediatek_dwmac_clks_config(priv_plat, false);
0701 err_remove_config_dt:
0702 stmmac_remove_config_dt(pdev, plat_dat);
0703
0704 return ret;
0705 }
0706
0707 static int mediatek_dwmac_remove(struct platform_device *pdev)
0708 {
0709 struct mediatek_dwmac_plat_data *priv_plat = get_stmmac_bsp_priv(&pdev->dev);
0710 int ret;
0711
0712 ret = stmmac_pltfr_remove(pdev);
0713 mediatek_dwmac_clks_config(priv_plat, false);
0714
0715 return ret;
0716 }
0717
0718 static const struct of_device_id mediatek_dwmac_match[] = {
0719 { .compatible = "mediatek,mt2712-gmac",
0720 .data = &mt2712_gmac_variant },
0721 { .compatible = "mediatek,mt8195-gmac",
0722 .data = &mt8195_gmac_variant },
0723 { }
0724 };
0725
0726 MODULE_DEVICE_TABLE(of, mediatek_dwmac_match);
0727
0728 static struct platform_driver mediatek_dwmac_driver = {
0729 .probe = mediatek_dwmac_probe,
0730 .remove = mediatek_dwmac_remove,
0731 .driver = {
0732 .name = "dwmac-mediatek",
0733 .pm = &stmmac_pltfr_pm_ops,
0734 .of_match_table = mediatek_dwmac_match,
0735 },
0736 };
0737 module_platform_driver(mediatek_dwmac_driver);
0738
0739 MODULE_AUTHOR("Biao Huang <biao.huang@mediatek.com>");
0740 MODULE_DESCRIPTION("MediaTek DWMAC specific glue layer");
0741 MODULE_LICENSE("GPL v2");