.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /** |
---|
2 | | - * dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer |
---|
| 3 | + * DOC: dwmac-rk.c - Rockchip RK3288 DWMAC specific glue layer |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2014 Chen-Zhi (Roger Chen) |
---|
5 | 6 | * |
---|
6 | 7 | * Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com> |
---|
7 | | - * |
---|
8 | | - * This program is free software; you can redistribute it and/or modify |
---|
9 | | - * it under the terms of the GNU General Public License as published by |
---|
10 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
11 | | - * (at your option) any later version. |
---|
12 | | - * |
---|
13 | | - * This program is distributed in the hope that it will be useful, |
---|
14 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
15 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
16 | | - * GNU General Public License for more details. |
---|
17 | 8 | */ |
---|
18 | 9 | |
---|
19 | 10 | #include <linux/stmmac.h> |
---|
.. | .. |
---|
24 | 15 | #include <linux/of_net.h> |
---|
25 | 16 | #include <linux/gpio.h> |
---|
26 | 17 | #include <linux/module.h> |
---|
| 18 | +#include <linux/nvmem-consumer.h> |
---|
27 | 19 | #include <linux/of_gpio.h> |
---|
28 | 20 | #include <linux/of_device.h> |
---|
29 | 21 | #include <linux/platform_device.h> |
---|
.. | .. |
---|
47 | 39 | void (*set_to_qsgmii)(struct rk_priv_data *bsp_priv); |
---|
48 | 40 | void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed); |
---|
49 | 41 | void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed); |
---|
50 | | - void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv); |
---|
| 42 | + void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input, |
---|
| 43 | + bool enable); |
---|
| 44 | + void (*integrated_phy_power)(struct rk_priv_data *bsp_priv, bool up); |
---|
51 | 45 | }; |
---|
52 | 46 | |
---|
53 | 47 | struct rk_priv_data { |
---|
54 | 48 | struct platform_device *pdev; |
---|
55 | | - int phy_iface; |
---|
| 49 | + phy_interface_t phy_iface; |
---|
56 | 50 | int bus_id; |
---|
57 | 51 | struct regulator *regulator; |
---|
58 | 52 | bool suspended; |
---|
.. | .. |
---|
73 | 67 | struct clk *pclk_mac; |
---|
74 | 68 | struct clk *clk_phy; |
---|
75 | 69 | struct clk *pclk_xpcs; |
---|
| 70 | + struct clk *clk_xpcs_eee; |
---|
76 | 71 | |
---|
77 | 72 | struct reset_control *phy_reset; |
---|
78 | 73 | |
---|
.. | .. |
---|
80 | 75 | int rx_delay; |
---|
81 | 76 | |
---|
82 | 77 | struct regmap *grf; |
---|
| 78 | + struct regmap *php_grf; |
---|
83 | 79 | struct regmap *xpcs; |
---|
| 80 | + |
---|
| 81 | + unsigned char otp_data; |
---|
| 82 | + unsigned int bgs_increment; |
---|
84 | 83 | }; |
---|
85 | 84 | |
---|
86 | 85 | /* XPCS */ |
---|
.. | .. |
---|
212 | 211 | #define GRF_CLR_BIT(nr) (BIT(nr+16)) |
---|
213 | 212 | |
---|
214 | 213 | #define DELAY_ENABLE(soc, tx, rx) \ |
---|
215 | | - (((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \ |
---|
216 | | - ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE)) |
---|
| 214 | + ((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \ |
---|
| 215 | + (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE)) |
---|
| 216 | + |
---|
| 217 | +#define DELAY_ENABLE_BY_ID(soc, tx, rx, id) \ |
---|
| 218 | + ((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE(id) : soc##_GMAC_TXCLK_DLY_DISABLE(id)) | \ |
---|
| 219 | + (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE(id) : soc##_GMAC_RXCLK_DLY_DISABLE(id))) |
---|
| 220 | + |
---|
| 221 | +#define DELAY_VALUE(soc, tx, rx) \ |
---|
| 222 | + ((((tx) >= 0) ? soc##_GMAC_CLK_TX_DL_CFG(tx) : 0) | \ |
---|
| 223 | + (((rx) >= 0) ? soc##_GMAC_CLK_RX_DL_CFG(rx) : 0)) |
---|
| 224 | + |
---|
| 225 | +#define GMAC_RGMII_CLK_DIV_BY_ID(soc, id, div) \ |
---|
| 226 | + (soc##_GMAC##id##_CLK_RGMII_DIV##div) |
---|
| 227 | + |
---|
| 228 | +#define GMAC_RMII_CLK_DIV_BY_ID(soc, id, div) \ |
---|
| 229 | + (soc##_GMAC##id##_CLK_RMII_DIV##div) |
---|
| 230 | + |
---|
| 231 | +/* Integrated EPHY */ |
---|
| 232 | + |
---|
| 233 | +#define RK_GRF_MACPHY_CON0 0xb00 |
---|
| 234 | +#define RK_GRF_MACPHY_CON1 0xb04 |
---|
| 235 | +#define RK_GRF_MACPHY_CON2 0xb08 |
---|
| 236 | +#define RK_GRF_MACPHY_CON3 0xb0c |
---|
| 237 | + |
---|
| 238 | +#define RK_MACPHY_ENABLE GRF_BIT(0) |
---|
| 239 | +#define RK_MACPHY_DISABLE GRF_CLR_BIT(0) |
---|
| 240 | +#define RK_MACPHY_CFG_CLK_50M GRF_BIT(14) |
---|
| 241 | +#define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7)) |
---|
| 242 | +#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0) |
---|
| 243 | +#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0) |
---|
| 244 | + |
---|
| 245 | +static void rk_gmac_integrated_ephy_powerup(struct rk_priv_data *priv) |
---|
| 246 | +{ |
---|
| 247 | + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M); |
---|
| 248 | + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE); |
---|
| 249 | + |
---|
| 250 | + regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID); |
---|
| 251 | + regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID); |
---|
| 252 | + |
---|
| 253 | + if (priv->phy_reset) { |
---|
| 254 | + /* PHY needs to be disabled before trying to reset it */ |
---|
| 255 | + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); |
---|
| 256 | + if (priv->phy_reset) |
---|
| 257 | + reset_control_assert(priv->phy_reset); |
---|
| 258 | + usleep_range(10, 20); |
---|
| 259 | + if (priv->phy_reset) |
---|
| 260 | + reset_control_deassert(priv->phy_reset); |
---|
| 261 | + usleep_range(10, 20); |
---|
| 262 | + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE); |
---|
| 263 | + msleep(30); |
---|
| 264 | + } |
---|
| 265 | +} |
---|
| 266 | + |
---|
| 267 | +static void rk_gmac_integrated_ephy_powerdown(struct rk_priv_data *priv) |
---|
| 268 | +{ |
---|
| 269 | + regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); |
---|
| 270 | + if (priv->phy_reset) |
---|
| 271 | + reset_control_assert(priv->phy_reset); |
---|
| 272 | +} |
---|
| 273 | + |
---|
| 274 | +/* Integrated FEPHY */ |
---|
| 275 | +#define RK_FEPHY_SHUTDOWN GRF_BIT(1) |
---|
| 276 | +#define RK_FEPHY_POWERUP GRF_CLR_BIT(1) |
---|
| 277 | +#define RK_FEPHY_INTERNAL_RMII_SEL GRF_BIT(6) |
---|
| 278 | +#define RK_FEPHY_24M_CLK_SEL (GRF_BIT(8) | GRF_BIT(9)) |
---|
| 279 | +#define RK_FEPHY_PHY_ID GRF_BIT(11) |
---|
| 280 | + |
---|
| 281 | +#define RK_FEPHY_BGS HIWORD_UPDATE(0x0, 0xf, 0) |
---|
| 282 | + |
---|
| 283 | +#define RK_FEPHY_BGS_MAX 7 |
---|
| 284 | + |
---|
| 285 | +static void rk_gmac_integrated_fephy_power(struct rk_priv_data *priv, |
---|
| 286 | + unsigned int ctrl_offset, |
---|
| 287 | + unsigned int bgs_offset, |
---|
| 288 | + bool up) |
---|
| 289 | +{ |
---|
| 290 | + struct device *dev = &priv->pdev->dev; |
---|
| 291 | + |
---|
| 292 | + if (IS_ERR(priv->grf) || !priv->phy_reset) { |
---|
| 293 | + dev_err(dev, "%s: Missing rockchip,grf or phy_reset property\n", |
---|
| 294 | + __func__); |
---|
| 295 | + return; |
---|
| 296 | + } |
---|
| 297 | + |
---|
| 298 | + if (up) { |
---|
| 299 | + unsigned int bgs = priv->otp_data; |
---|
| 300 | + |
---|
| 301 | + reset_control_assert(priv->phy_reset); |
---|
| 302 | + udelay(20); |
---|
| 303 | + regmap_write(priv->grf, ctrl_offset, |
---|
| 304 | + RK_FEPHY_POWERUP | |
---|
| 305 | + RK_FEPHY_INTERNAL_RMII_SEL | |
---|
| 306 | + RK_FEPHY_24M_CLK_SEL | |
---|
| 307 | + RK_FEPHY_PHY_ID); |
---|
| 308 | + |
---|
| 309 | + if (bgs > (RK_FEPHY_BGS_MAX - priv->bgs_increment) && |
---|
| 310 | + bgs <= RK_FEPHY_BGS_MAX) { |
---|
| 311 | + bgs = HIWORD_UPDATE(RK_FEPHY_BGS_MAX, 0xf, 0); |
---|
| 312 | + } else { |
---|
| 313 | + bgs += priv->bgs_increment; |
---|
| 314 | + bgs &= 0xf; |
---|
| 315 | + bgs = HIWORD_UPDATE(bgs, 0xf, 0); |
---|
| 316 | + } |
---|
| 317 | + |
---|
| 318 | + regmap_write(priv->grf, bgs_offset, bgs); |
---|
| 319 | + usleep_range(10 * 1000, 12 * 1000); |
---|
| 320 | + reset_control_deassert(priv->phy_reset); |
---|
| 321 | + usleep_range(50 * 1000, 60 * 1000); |
---|
| 322 | + } else { |
---|
| 323 | + regmap_write(priv->grf, ctrl_offset, |
---|
| 324 | + RK_FEPHY_SHUTDOWN); |
---|
| 325 | + } |
---|
| 326 | +} |
---|
217 | 327 | |
---|
218 | 328 | #define PX30_GRF_GMAC_CON1 0x0904 |
---|
219 | 329 | |
---|
.. | .. |
---|
306 | 416 | |
---|
307 | 417 | regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1, |
---|
308 | 418 | RK1808_GMAC_PHY_INTF_SEL_RGMII | |
---|
309 | | - RK1808_GMAC_RXCLK_DLY_ENABLE | |
---|
310 | | - RK1808_GMAC_TXCLK_DLY_ENABLE); |
---|
| 419 | + DELAY_ENABLE(RK1808, tx_delay, rx_delay)); |
---|
311 | 420 | |
---|
312 | 421 | regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON0, |
---|
313 | | - RK1808_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
314 | | - RK1808_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 422 | + DELAY_VALUE(RK1808, tx_delay, rx_delay)); |
---|
315 | 423 | } |
---|
316 | 424 | |
---|
317 | 425 | static void rk1808_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
439 | 547 | RK3128_GMAC_RMII_MODE_CLR); |
---|
440 | 548 | regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0, |
---|
441 | 549 | DELAY_ENABLE(RK3128, tx_delay, rx_delay) | |
---|
442 | | - RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
443 | | - RK3128_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 550 | + DELAY_VALUE(RK3128, tx_delay, rx_delay)); |
---|
444 | 551 | } |
---|
445 | 552 | |
---|
446 | 553 | static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
556 | 663 | DELAY_ENABLE(RK3228, tx_delay, rx_delay)); |
---|
557 | 664 | |
---|
558 | 665 | regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0, |
---|
559 | | - RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
560 | | - RK3228_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 666 | + DELAY_VALUE(RK3128, tx_delay, rx_delay)); |
---|
561 | 667 | } |
---|
562 | 668 | |
---|
563 | 669 | static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
620 | 726 | dev_err(dev, "unknown speed value for RMII! speed=%d", speed); |
---|
621 | 727 | } |
---|
622 | 728 | |
---|
623 | | -static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv) |
---|
| 729 | +static void rk3228_integrated_phy_power(struct rk_priv_data *priv, bool up) |
---|
624 | 730 | { |
---|
625 | | - regmap_write(priv->grf, RK3228_GRF_CON_MUX, |
---|
626 | | - RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); |
---|
| 731 | + if (up) { |
---|
| 732 | + regmap_write(priv->grf, RK3228_GRF_CON_MUX, |
---|
| 733 | + RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY); |
---|
| 734 | + |
---|
| 735 | + rk_gmac_integrated_ephy_powerup(priv); |
---|
| 736 | + } else { |
---|
| 737 | + rk_gmac_integrated_ephy_powerdown(priv); |
---|
| 738 | + } |
---|
627 | 739 | } |
---|
628 | 740 | |
---|
629 | 741 | static const struct rk_gmac_ops rk3228_ops = { |
---|
.. | .. |
---|
631 | 743 | .set_to_rmii = rk3228_set_to_rmii, |
---|
632 | 744 | .set_rgmii_speed = rk3228_set_rgmii_speed, |
---|
633 | 745 | .set_rmii_speed = rk3228_set_rmii_speed, |
---|
634 | | - .integrated_phy_powerup = rk3228_integrated_phy_powerup, |
---|
| 746 | + .integrated_phy_power = rk3228_integrated_phy_power, |
---|
635 | 747 | }; |
---|
636 | 748 | |
---|
637 | 749 | #define RK3288_GRF_SOC_CON1 0x0248 |
---|
.. | .. |
---|
677 | 789 | RK3288_GMAC_RMII_MODE_CLR); |
---|
678 | 790 | regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3, |
---|
679 | 791 | DELAY_ENABLE(RK3288, tx_delay, rx_delay) | |
---|
680 | | - RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
681 | | - RK3288_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 792 | + DELAY_VALUE(RK3288, tx_delay, rx_delay)); |
---|
682 | 793 | } |
---|
683 | 794 | |
---|
684 | 795 | static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
849 | 960 | regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1, |
---|
850 | 961 | RK3328_GMAC_PHY_INTF_SEL_RGMII | |
---|
851 | 962 | RK3328_GMAC_RMII_MODE_CLR | |
---|
852 | | - RK3328_GMAC_RXCLK_DLY_ENABLE | |
---|
853 | | - RK3328_GMAC_TXCLK_DLY_ENABLE); |
---|
| 963 | + DELAY_ENABLE(RK3328, tx_delay, rx_delay)); |
---|
854 | 964 | |
---|
855 | 965 | regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0, |
---|
856 | | - RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
857 | | - RK3328_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 966 | + DELAY_VALUE(RK3328, tx_delay, rx_delay)); |
---|
858 | 967 | } |
---|
859 | 968 | |
---|
860 | 969 | static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
922 | 1031 | dev_err(dev, "unknown speed value for RMII! speed=%d", speed); |
---|
923 | 1032 | } |
---|
924 | 1033 | |
---|
925 | | -static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv) |
---|
| 1034 | +static void rk3328_integrated_phy_power(struct rk_priv_data *priv, bool up) |
---|
926 | 1035 | { |
---|
927 | | - regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1, |
---|
928 | | - RK3328_MACPHY_RMII_MODE); |
---|
| 1036 | + if (up) { |
---|
| 1037 | + regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1, |
---|
| 1038 | + RK3328_MACPHY_RMII_MODE); |
---|
| 1039 | + |
---|
| 1040 | + rk_gmac_integrated_ephy_powerup(priv); |
---|
| 1041 | + } else { |
---|
| 1042 | + rk_gmac_integrated_ephy_powerdown(priv); |
---|
| 1043 | + } |
---|
929 | 1044 | } |
---|
930 | 1045 | |
---|
931 | 1046 | static const struct rk_gmac_ops rk3328_ops = { |
---|
.. | .. |
---|
933 | 1048 | .set_to_rmii = rk3328_set_to_rmii, |
---|
934 | 1049 | .set_rgmii_speed = rk3328_set_rgmii_speed, |
---|
935 | 1050 | .set_rmii_speed = rk3328_set_rmii_speed, |
---|
936 | | - .integrated_phy_powerup = rk3328_integrated_phy_powerup, |
---|
| 1051 | + .integrated_phy_power = rk3328_integrated_phy_power, |
---|
937 | 1052 | }; |
---|
938 | 1053 | |
---|
939 | 1054 | #define RK3366_GRF_SOC_CON6 0x0418 |
---|
.. | .. |
---|
979 | 1094 | RK3366_GMAC_RMII_MODE_CLR); |
---|
980 | 1095 | regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7, |
---|
981 | 1096 | DELAY_ENABLE(RK3366, tx_delay, rx_delay) | |
---|
982 | | - RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
983 | | - RK3366_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 1097 | + DELAY_VALUE(RK3366, tx_delay, rx_delay)); |
---|
984 | 1098 | } |
---|
985 | 1099 | |
---|
986 | 1100 | static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
1090 | 1204 | RK3368_GMAC_RMII_MODE_CLR); |
---|
1091 | 1205 | regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16, |
---|
1092 | 1206 | DELAY_ENABLE(RK3368, tx_delay, rx_delay) | |
---|
1093 | | - RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
1094 | | - RK3368_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 1207 | + DELAY_VALUE(RK3368, tx_delay, rx_delay)); |
---|
1095 | 1208 | } |
---|
1096 | 1209 | |
---|
1097 | 1210 | static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
1201 | 1314 | RK3399_GMAC_RMII_MODE_CLR); |
---|
1202 | 1315 | regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6, |
---|
1203 | 1316 | DELAY_ENABLE(RK3399, tx_delay, rx_delay) | |
---|
1204 | | - RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
1205 | | - RK3399_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 1317 | + DELAY_VALUE(RK3399, tx_delay, rx_delay)); |
---|
1206 | 1318 | } |
---|
1207 | 1319 | |
---|
1208 | 1320 | static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
1267 | 1379 | .set_to_rmii = rk3399_set_to_rmii, |
---|
1268 | 1380 | .set_rgmii_speed = rk3399_set_rgmii_speed, |
---|
1269 | 1381 | .set_rmii_speed = rk3399_set_rmii_speed, |
---|
| 1382 | +}; |
---|
| 1383 | + |
---|
| 1384 | +#define RK3528_VO_GRF_GMAC_CON 0X60018 |
---|
| 1385 | +#define RK3528_VPU_GRF_GMAC_CON5 0X40018 |
---|
| 1386 | +#define RK3528_VPU_GRF_GMAC_CON6 0X4001c |
---|
| 1387 | + |
---|
| 1388 | +#define RK3528_GMAC_RXCLK_DLY_ENABLE GRF_BIT(15) |
---|
| 1389 | +#define RK3528_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(15) |
---|
| 1390 | +#define RK3528_GMAC_TXCLK_DLY_ENABLE GRF_BIT(14) |
---|
| 1391 | +#define RK3528_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(14) |
---|
| 1392 | + |
---|
| 1393 | +#define RK3528_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8) |
---|
| 1394 | +#define RK3528_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0) |
---|
| 1395 | + |
---|
| 1396 | +#define RK3528_GMAC0_PHY_INTF_SEL_RMII GRF_BIT(1) |
---|
| 1397 | +#define RK3528_GMAC1_PHY_INTF_SEL_RGMII GRF_CLR_BIT(8) |
---|
| 1398 | +#define RK3528_GMAC1_PHY_INTF_SEL_RMII GRF_BIT(8) |
---|
| 1399 | + |
---|
| 1400 | +#define RK3528_GMAC1_CLK_SELET_CRU GRF_CLR_BIT(12) |
---|
| 1401 | +#define RK3528_GMAC1_CLK_SELET_IO GRF_BIT(12) |
---|
| 1402 | + |
---|
| 1403 | +#define RK3528_GMAC0_CLK_RMII_DIV2 GRF_BIT(3) |
---|
| 1404 | +#define RK3528_GMAC0_CLK_RMII_DIV20 GRF_CLR_BIT(3) |
---|
| 1405 | +#define RK3528_GMAC1_CLK_RMII_DIV2 GRF_BIT(10) |
---|
| 1406 | +#define RK3528_GMAC1_CLK_RMII_DIV20 GRF_CLR_BIT(10) |
---|
| 1407 | + |
---|
| 1408 | +#define RK3528_GMAC1_CLK_RGMII_DIV1 \ |
---|
| 1409 | + (GRF_CLR_BIT(11) | GRF_CLR_BIT(10)) |
---|
| 1410 | +#define RK3528_GMAC1_CLK_RGMII_DIV5 \ |
---|
| 1411 | + (GRF_BIT(11) | GRF_BIT(10)) |
---|
| 1412 | +#define RK3528_GMAC1_CLK_RGMII_DIV50 \ |
---|
| 1413 | + (GRF_BIT(11) | GRF_CLR_BIT(10)) |
---|
| 1414 | + |
---|
| 1415 | +#define RK3528_GMAC0_CLK_RMII_GATE GRF_BIT(2) |
---|
| 1416 | +#define RK3528_GMAC0_CLK_RMII_NOGATE GRF_CLR_BIT(2) |
---|
| 1417 | +#define RK3528_GMAC1_CLK_RMII_GATE GRF_BIT(9) |
---|
| 1418 | +#define RK3528_GMAC1_CLK_RMII_NOGATE GRF_CLR_BIT(9) |
---|
| 1419 | + |
---|
| 1420 | +#define RK3528_VO_GRF_MACPHY_CON0 0X6001c |
---|
| 1421 | +#define RK3528_VO_GRF_MACPHY_CON1 0X60020 |
---|
| 1422 | + |
---|
| 1423 | +static void rk3528_set_to_rgmii(struct rk_priv_data *bsp_priv, |
---|
| 1424 | + int tx_delay, int rx_delay) |
---|
| 1425 | +{ |
---|
| 1426 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1427 | + |
---|
| 1428 | + if (IS_ERR(bsp_priv->grf)) { |
---|
| 1429 | + dev_err(dev, "Missing rockchip,grf property\n"); |
---|
| 1430 | + return; |
---|
| 1431 | + } |
---|
| 1432 | + |
---|
| 1433 | + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, |
---|
| 1434 | + RK3528_GMAC1_PHY_INTF_SEL_RGMII); |
---|
| 1435 | + |
---|
| 1436 | + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, |
---|
| 1437 | + DELAY_ENABLE(RK3528, tx_delay, rx_delay)); |
---|
| 1438 | + |
---|
| 1439 | + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON6, |
---|
| 1440 | + DELAY_VALUE(RK3528, tx_delay, rx_delay)); |
---|
| 1441 | +} |
---|
| 1442 | + |
---|
| 1443 | +static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
| 1444 | +{ |
---|
| 1445 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1446 | + unsigned int id = bsp_priv->bus_id; |
---|
| 1447 | + |
---|
| 1448 | + if (IS_ERR(bsp_priv->grf)) { |
---|
| 1449 | + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); |
---|
| 1450 | + return; |
---|
| 1451 | + } |
---|
| 1452 | + |
---|
| 1453 | + if (id == 1) |
---|
| 1454 | + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, |
---|
| 1455 | + RK3528_GMAC1_PHY_INTF_SEL_RMII); |
---|
| 1456 | + else |
---|
| 1457 | + regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON, |
---|
| 1458 | + RK3528_GMAC0_PHY_INTF_SEL_RMII | |
---|
| 1459 | + RK3528_GMAC0_CLK_RMII_DIV2); |
---|
| 1460 | +} |
---|
| 1461 | + |
---|
| 1462 | +static void rk3528_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed) |
---|
| 1463 | +{ |
---|
| 1464 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1465 | + unsigned int val = 0; |
---|
| 1466 | + |
---|
| 1467 | + switch (speed) { |
---|
| 1468 | + case 10: |
---|
| 1469 | + val = RK3528_GMAC1_CLK_RGMII_DIV50; |
---|
| 1470 | + break; |
---|
| 1471 | + case 100: |
---|
| 1472 | + val = RK3528_GMAC1_CLK_RGMII_DIV5; |
---|
| 1473 | + break; |
---|
| 1474 | + case 1000: |
---|
| 1475 | + val = RK3528_GMAC1_CLK_RGMII_DIV1; |
---|
| 1476 | + break; |
---|
| 1477 | + default: |
---|
| 1478 | + goto err; |
---|
| 1479 | + } |
---|
| 1480 | + |
---|
| 1481 | + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, val); |
---|
| 1482 | + return; |
---|
| 1483 | +err: |
---|
| 1484 | + dev_err(dev, "unknown RGMII speed value for GMAC speed=%d", speed); |
---|
| 1485 | +} |
---|
| 1486 | + |
---|
| 1487 | +static void rk3528_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) |
---|
| 1488 | +{ |
---|
| 1489 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1490 | + unsigned int val, offset, id = bsp_priv->bus_id; |
---|
| 1491 | + |
---|
| 1492 | + switch (speed) { |
---|
| 1493 | + case 10: |
---|
| 1494 | + val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV20 : |
---|
| 1495 | + RK3528_GMAC0_CLK_RMII_DIV20; |
---|
| 1496 | + break; |
---|
| 1497 | + case 100: |
---|
| 1498 | + val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV2 : |
---|
| 1499 | + RK3528_GMAC0_CLK_RMII_DIV2; |
---|
| 1500 | + break; |
---|
| 1501 | + default: |
---|
| 1502 | + goto err; |
---|
| 1503 | + } |
---|
| 1504 | + |
---|
| 1505 | + offset = (id == 1) ? RK3528_VPU_GRF_GMAC_CON5 : RK3528_VO_GRF_GMAC_CON; |
---|
| 1506 | + regmap_write(bsp_priv->grf, offset, val); |
---|
| 1507 | + |
---|
| 1508 | + return; |
---|
| 1509 | +err: |
---|
| 1510 | + dev_err(dev, "unknown RMII speed value for GMAC speed=%d", speed); |
---|
| 1511 | +} |
---|
| 1512 | + |
---|
| 1513 | +static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv, |
---|
| 1514 | + bool input, bool enable) |
---|
| 1515 | +{ |
---|
| 1516 | + unsigned int value, id = bsp_priv->bus_id; |
---|
| 1517 | + |
---|
| 1518 | + if (id == 1) { |
---|
| 1519 | + value = input ? RK3528_GMAC1_CLK_SELET_IO : |
---|
| 1520 | + RK3528_GMAC1_CLK_SELET_CRU; |
---|
| 1521 | + value |= enable ? RK3528_GMAC1_CLK_RMII_NOGATE : |
---|
| 1522 | + RK3528_GMAC1_CLK_RMII_GATE; |
---|
| 1523 | + regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, value); |
---|
| 1524 | + } else { |
---|
| 1525 | + value = enable ? RK3528_GMAC0_CLK_RMII_NOGATE : |
---|
| 1526 | + RK3528_GMAC0_CLK_RMII_GATE; |
---|
| 1527 | + regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON, value); |
---|
| 1528 | + } |
---|
| 1529 | +} |
---|
| 1530 | + |
---|
| 1531 | +static void rk3528_integrated_sphy_power(struct rk_priv_data *priv, bool up) |
---|
| 1532 | +{ |
---|
| 1533 | + rk_gmac_integrated_fephy_power(priv, RK3528_VO_GRF_MACPHY_CON0, |
---|
| 1534 | + RK3528_VO_GRF_MACPHY_CON1, up); |
---|
| 1535 | +} |
---|
| 1536 | + |
---|
| 1537 | +static const struct rk_gmac_ops rk3528_ops = { |
---|
| 1538 | + .set_to_rgmii = rk3528_set_to_rgmii, |
---|
| 1539 | + .set_to_rmii = rk3528_set_to_rmii, |
---|
| 1540 | + .set_rgmii_speed = rk3528_set_rgmii_speed, |
---|
| 1541 | + .set_rmii_speed = rk3528_set_rmii_speed, |
---|
| 1542 | + .set_clock_selection = rk3528_set_clock_selection, |
---|
| 1543 | + .integrated_phy_power = rk3528_integrated_sphy_power, |
---|
| 1544 | +}; |
---|
| 1545 | + |
---|
| 1546 | +/* sys_grf */ |
---|
| 1547 | +#define RK3562_GRF_SYS_SOC_CON0 0X0400 |
---|
| 1548 | +#define RK3562_GRF_SYS_SOC_CON1 0X0404 |
---|
| 1549 | + |
---|
| 1550 | +#define RK3562_GMAC0_CLK_RMII_MODE GRF_BIT(5) |
---|
| 1551 | +#define RK3562_GMAC0_CLK_RGMII_MODE GRF_CLR_BIT(5) |
---|
| 1552 | + |
---|
| 1553 | +#define RK3562_GMAC0_CLK_RMII_GATE GRF_BIT(6) |
---|
| 1554 | +#define RK3562_GMAC0_CLK_RMII_NOGATE GRF_CLR_BIT(6) |
---|
| 1555 | + |
---|
| 1556 | +#define RK3562_GMAC0_CLK_RMII_DIV2 GRF_BIT(7) |
---|
| 1557 | +#define RK3562_GMAC0_CLK_RMII_DIV20 GRF_CLR_BIT(7) |
---|
| 1558 | + |
---|
| 1559 | +#define RK3562_GMAC0_CLK_RGMII_DIV1 \ |
---|
| 1560 | + (GRF_CLR_BIT(7) | GRF_CLR_BIT(8)) |
---|
| 1561 | +#define RK3562_GMAC0_CLK_RGMII_DIV5 \ |
---|
| 1562 | + (GRF_BIT(7) | GRF_BIT(8)) |
---|
| 1563 | +#define RK3562_GMAC0_CLK_RGMII_DIV50 \ |
---|
| 1564 | + (GRF_CLR_BIT(7) | GRF_BIT(8)) |
---|
| 1565 | + |
---|
| 1566 | +#define RK3562_GMAC0_CLK_RMII_DIV2 GRF_BIT(7) |
---|
| 1567 | +#define RK3562_GMAC0_CLK_RMII_DIV20 GRF_CLR_BIT(7) |
---|
| 1568 | + |
---|
| 1569 | +#define RK3562_GMAC0_CLK_SELET_CRU GRF_CLR_BIT(9) |
---|
| 1570 | +#define RK3562_GMAC0_CLK_SELET_IO GRF_BIT(9) |
---|
| 1571 | + |
---|
| 1572 | +#define RK3562_GMAC1_CLK_RMII_GATE GRF_BIT(12) |
---|
| 1573 | +#define RK3562_GMAC1_CLK_RMII_NOGATE GRF_CLR_BIT(12) |
---|
| 1574 | + |
---|
| 1575 | +#define RK3562_GMAC1_CLK_RMII_DIV2 GRF_BIT(13) |
---|
| 1576 | +#define RK3562_GMAC1_CLK_RMII_DIV20 GRF_CLR_BIT(13) |
---|
| 1577 | + |
---|
| 1578 | +#define RK3562_GMAC1_RMII_SPEED100 GRF_BIT(11) |
---|
| 1579 | +#define RK3562_GMAC1_RMII_SPEED10 GRF_CLR_BIT(11) |
---|
| 1580 | + |
---|
| 1581 | +#define RK3562_GMAC1_CLK_SELET_CRU GRF_CLR_BIT(15) |
---|
| 1582 | +#define RK3562_GMAC1_CLK_SELET_IO GRF_BIT(15) |
---|
| 1583 | + |
---|
| 1584 | +/* ioc_grf */ |
---|
| 1585 | +#define RK3562_GRF_IOC_GMAC_IOFUNC0_CON0 0X10400 |
---|
| 1586 | +#define RK3562_GRF_IOC_GMAC_IOFUNC0_CON1 0X10404 |
---|
| 1587 | +#define RK3562_GRF_IOC_GMAC_IOFUNC1_CON0 0X00400 |
---|
| 1588 | +#define RK3562_GRF_IOC_GMAC_IOFUNC1_CON1 0X00404 |
---|
| 1589 | + |
---|
| 1590 | +#define RK3562_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1) |
---|
| 1591 | +#define RK3562_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1) |
---|
| 1592 | +#define RK3562_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0) |
---|
| 1593 | +#define RK3562_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0) |
---|
| 1594 | + |
---|
| 1595 | +#define RK3562_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8) |
---|
| 1596 | +#define RK3562_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0) |
---|
| 1597 | + |
---|
| 1598 | +#define RK3562_GMAC0_IO_EXTCLK_SELET_CRU GRF_CLR_BIT(2) |
---|
| 1599 | +#define RK3562_GMAC0_IO_EXTCLK_SELET_IO GRF_BIT(2) |
---|
| 1600 | + |
---|
| 1601 | +#define RK3562_GMAC1_IO_EXTCLK_SELET_CRU GRF_CLR_BIT(3) |
---|
| 1602 | +#define RK3562_GMAC1_IO_EXTCLK_SELET_IO GRF_BIT(3) |
---|
| 1603 | + |
---|
| 1604 | +static void rk3562_set_to_rgmii(struct rk_priv_data *bsp_priv, |
---|
| 1605 | + int tx_delay, int rx_delay) |
---|
| 1606 | +{ |
---|
| 1607 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1608 | + |
---|
| 1609 | + if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) { |
---|
| 1610 | + dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n"); |
---|
| 1611 | + return; |
---|
| 1612 | + } |
---|
| 1613 | + |
---|
| 1614 | + if (bsp_priv->bus_id > 0) |
---|
| 1615 | + return; |
---|
| 1616 | + |
---|
| 1617 | + regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0, |
---|
| 1618 | + RK3562_GMAC0_CLK_RGMII_MODE); |
---|
| 1619 | + |
---|
| 1620 | + regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC0_CON1, |
---|
| 1621 | + DELAY_ENABLE(RK3562, tx_delay, rx_delay)); |
---|
| 1622 | + regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC0_CON0, |
---|
| 1623 | + DELAY_VALUE(RK3562, tx_delay, rx_delay)); |
---|
| 1624 | + |
---|
| 1625 | + regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON1, |
---|
| 1626 | + DELAY_ENABLE(RK3562, tx_delay, rx_delay)); |
---|
| 1627 | + regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON0, |
---|
| 1628 | + DELAY_VALUE(RK3562, tx_delay, rx_delay)); |
---|
| 1629 | +} |
---|
| 1630 | + |
---|
| 1631 | +static void rk3562_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
| 1632 | +{ |
---|
| 1633 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1634 | + |
---|
| 1635 | + if (IS_ERR(bsp_priv->grf)) { |
---|
| 1636 | + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); |
---|
| 1637 | + return; |
---|
| 1638 | + } |
---|
| 1639 | + |
---|
| 1640 | + if (!bsp_priv->bus_id) |
---|
| 1641 | + regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0, |
---|
| 1642 | + RK3562_GMAC0_CLK_RMII_MODE); |
---|
| 1643 | +} |
---|
| 1644 | + |
---|
| 1645 | +static void rk3562_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed) |
---|
| 1646 | +{ |
---|
| 1647 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1648 | + unsigned int val = 0, offset, id = bsp_priv->bus_id; |
---|
| 1649 | + |
---|
| 1650 | + switch (speed) { |
---|
| 1651 | + case 10: |
---|
| 1652 | + if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) { |
---|
| 1653 | + if (id > 0) { |
---|
| 1654 | + val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 1, 20); |
---|
| 1655 | + regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0, |
---|
| 1656 | + RK3562_GMAC1_RMII_SPEED10); |
---|
| 1657 | + } else { |
---|
| 1658 | + val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 0, 20); |
---|
| 1659 | + } |
---|
| 1660 | + } else { |
---|
| 1661 | + val = GMAC_RGMII_CLK_DIV_BY_ID(RK3562, 0, 50); |
---|
| 1662 | + } |
---|
| 1663 | + break; |
---|
| 1664 | + case 100: |
---|
| 1665 | + if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) { |
---|
| 1666 | + if (id > 0) { |
---|
| 1667 | + val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 1, 2); |
---|
| 1668 | + regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0, |
---|
| 1669 | + RK3562_GMAC1_RMII_SPEED100); |
---|
| 1670 | + } else { |
---|
| 1671 | + val = GMAC_RMII_CLK_DIV_BY_ID(RK3562, 0, 2); |
---|
| 1672 | + } |
---|
| 1673 | + } else { |
---|
| 1674 | + val = GMAC_RGMII_CLK_DIV_BY_ID(RK3562, 0, 5); |
---|
| 1675 | + } |
---|
| 1676 | + break; |
---|
| 1677 | + case 1000: |
---|
| 1678 | + if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII) |
---|
| 1679 | + val = GMAC_RGMII_CLK_DIV_BY_ID(RK3562, 0, 1); |
---|
| 1680 | + else |
---|
| 1681 | + goto err; |
---|
| 1682 | + break; |
---|
| 1683 | + default: |
---|
| 1684 | + goto err; |
---|
| 1685 | + } |
---|
| 1686 | + |
---|
| 1687 | + offset = (bsp_priv->bus_id > 0) ? RK3562_GRF_SYS_SOC_CON1 : |
---|
| 1688 | + RK3562_GRF_SYS_SOC_CON0; |
---|
| 1689 | + regmap_write(bsp_priv->grf, offset, val); |
---|
| 1690 | + |
---|
| 1691 | + return; |
---|
| 1692 | +err: |
---|
| 1693 | + dev_err(dev, "unknown speed value for GMAC speed=%d", speed); |
---|
| 1694 | +} |
---|
| 1695 | + |
---|
| 1696 | +static void rk3562_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, |
---|
| 1697 | + bool enable) |
---|
| 1698 | +{ |
---|
| 1699 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1700 | + unsigned int value; |
---|
| 1701 | + |
---|
| 1702 | + if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) { |
---|
| 1703 | + dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n"); |
---|
| 1704 | + return; |
---|
| 1705 | + } |
---|
| 1706 | + |
---|
| 1707 | + if (!bsp_priv->bus_id) { |
---|
| 1708 | + value = input ? RK3562_GMAC0_CLK_SELET_IO : |
---|
| 1709 | + RK3562_GMAC0_CLK_SELET_CRU; |
---|
| 1710 | + value |= enable ? RK3562_GMAC0_CLK_RMII_NOGATE : |
---|
| 1711 | + RK3562_GMAC0_CLK_RMII_GATE; |
---|
| 1712 | + regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON0, value); |
---|
| 1713 | + |
---|
| 1714 | + value = input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO : |
---|
| 1715 | + RK3562_GMAC0_IO_EXTCLK_SELET_CRU; |
---|
| 1716 | + regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC0_CON1, value); |
---|
| 1717 | + regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON1, value); |
---|
| 1718 | + } else { |
---|
| 1719 | + value = input ? RK3562_GMAC1_CLK_SELET_IO : |
---|
| 1720 | + RK3562_GMAC1_CLK_SELET_CRU; |
---|
| 1721 | + value |= enable ? RK3562_GMAC1_CLK_RMII_NOGATE : |
---|
| 1722 | + RK3562_GMAC1_CLK_RMII_GATE; |
---|
| 1723 | + regmap_write(bsp_priv->grf, RK3562_GRF_SYS_SOC_CON1, value); |
---|
| 1724 | + |
---|
| 1725 | + value = input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO : |
---|
| 1726 | + RK3562_GMAC1_IO_EXTCLK_SELET_CRU; |
---|
| 1727 | + regmap_write(bsp_priv->php_grf, RK3562_GRF_IOC_GMAC_IOFUNC1_CON1, value); |
---|
| 1728 | + } |
---|
| 1729 | +} |
---|
| 1730 | + |
---|
| 1731 | +static const struct rk_gmac_ops rk3562_ops = { |
---|
| 1732 | + .set_to_rgmii = rk3562_set_to_rgmii, |
---|
| 1733 | + .set_to_rmii = rk3562_set_to_rmii, |
---|
| 1734 | + .set_rgmii_speed = rk3562_set_gmac_speed, |
---|
| 1735 | + .set_rmii_speed = rk3562_set_gmac_speed, |
---|
| 1736 | + .set_clock_selection = rk3562_set_clock_selection, |
---|
1270 | 1737 | }; |
---|
1271 | 1738 | |
---|
1272 | 1739 | #define RK3568_GRF_GMAC0_CON0 0X0380 |
---|
.. | .. |
---|
1349 | 1816 | |
---|
1350 | 1817 | regmap_write(bsp_priv->grf, offset_con1, |
---|
1351 | 1818 | RK3568_GMAC_PHY_INTF_SEL_RGMII | |
---|
1352 | | - RK3568_GMAC_RXCLK_DLY_ENABLE | |
---|
1353 | | - RK3568_GMAC_TXCLK_DLY_ENABLE); |
---|
| 1819 | + DELAY_ENABLE(RK3568, tx_delay, rx_delay)); |
---|
1354 | 1820 | |
---|
1355 | 1821 | regmap_write(bsp_priv->grf, offset_con0, |
---|
1356 | | - RK3568_GMAC_CLK_RX_DL_CFG(rx_delay) | |
---|
1357 | | - RK3568_GMAC_CLK_TX_DL_CFG(tx_delay)); |
---|
| 1822 | + DELAY_VALUE(RK3568, tx_delay, rx_delay)); |
---|
1358 | 1823 | } |
---|
1359 | 1824 | |
---|
1360 | 1825 | static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
1407 | 1872 | .set_to_qsgmii = rk3568_set_to_qsgmii, |
---|
1408 | 1873 | .set_rgmii_speed = rk3568_set_gmac_speed, |
---|
1409 | 1874 | .set_rmii_speed = rk3568_set_gmac_speed, |
---|
| 1875 | +}; |
---|
| 1876 | + |
---|
| 1877 | +/* sys_grf */ |
---|
| 1878 | +#define RK3588_GRF_GMAC_CON7 0X031c |
---|
| 1879 | +#define RK3588_GRF_GMAC_CON8 0X0320 |
---|
| 1880 | +#define RK3588_GRF_GMAC_CON9 0X0324 |
---|
| 1881 | + |
---|
| 1882 | +#define RK3588_GMAC_RXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 3) |
---|
| 1883 | +#define RK3588_GMAC_RXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 3) |
---|
| 1884 | +#define RK3588_GMAC_TXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 2) |
---|
| 1885 | +#define RK3588_GMAC_TXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 2) |
---|
| 1886 | + |
---|
| 1887 | +#define RK3588_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8) |
---|
| 1888 | +#define RK3588_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0) |
---|
| 1889 | + |
---|
| 1890 | +/* php_grf */ |
---|
| 1891 | +#define RK3588_GRF_GMAC_CON0 0X0008 |
---|
| 1892 | +#define RK3588_GRF_CLK_CON1 0X0070 |
---|
| 1893 | + |
---|
| 1894 | +#define RK3588_GMAC_PHY_INTF_SEL_RGMII(id) \ |
---|
| 1895 | + (GRF_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_CLR_BIT(5 + (id) * 6)) |
---|
| 1896 | +#define RK3588_GMAC_PHY_INTF_SEL_RMII(id) \ |
---|
| 1897 | + (GRF_CLR_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_BIT(5 + (id) * 6)) |
---|
| 1898 | + |
---|
| 1899 | +#define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id)) |
---|
| 1900 | +#define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id)) |
---|
| 1901 | + |
---|
| 1902 | +#define RK3588_GMAC_CLK_SELET_CRU(id) GRF_BIT(5 * (id) + 4) |
---|
| 1903 | +#define RK3588_GMAC_CLK_SELET_IO(id) GRF_CLR_BIT(5 * (id) + 4) |
---|
| 1904 | + |
---|
| 1905 | +#define RK3588_GMA_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2) |
---|
| 1906 | +#define RK3588_GMA_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2) |
---|
| 1907 | + |
---|
| 1908 | +#define RK3588_GMAC_CLK_RGMII_DIV1(id) \ |
---|
| 1909 | + (GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + 3)) |
---|
| 1910 | +#define RK3588_GMAC_CLK_RGMII_DIV5(id) \ |
---|
| 1911 | + (GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) |
---|
| 1912 | +#define RK3588_GMAC_CLK_RGMII_DIV50(id) \ |
---|
| 1913 | + (GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) |
---|
| 1914 | + |
---|
| 1915 | +#define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1) |
---|
| 1916 | +#define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + 1) |
---|
| 1917 | + |
---|
| 1918 | +static void rk3588_set_to_rgmii(struct rk_priv_data *bsp_priv, |
---|
| 1919 | + int tx_delay, int rx_delay) |
---|
| 1920 | +{ |
---|
| 1921 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1922 | + u32 offset_con, id = bsp_priv->bus_id; |
---|
| 1923 | + |
---|
| 1924 | + if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) { |
---|
| 1925 | + dev_err(dev, "Missing rockchip,grf or rockchip,php_grf property\n"); |
---|
| 1926 | + return; |
---|
| 1927 | + } |
---|
| 1928 | + |
---|
| 1929 | + offset_con = bsp_priv->bus_id == 1 ? RK3588_GRF_GMAC_CON9 : |
---|
| 1930 | + RK3588_GRF_GMAC_CON8; |
---|
| 1931 | + |
---|
| 1932 | + regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0, |
---|
| 1933 | + RK3588_GMAC_PHY_INTF_SEL_RGMII(id)); |
---|
| 1934 | + |
---|
| 1935 | + regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, |
---|
| 1936 | + RK3588_GMAC_CLK_RGMII_MODE(id)); |
---|
| 1937 | + |
---|
| 1938 | + regmap_write(bsp_priv->grf, RK3588_GRF_GMAC_CON7, |
---|
| 1939 | + DELAY_ENABLE_BY_ID(RK3588, tx_delay, rx_delay, id)); |
---|
| 1940 | + |
---|
| 1941 | + regmap_write(bsp_priv->grf, offset_con, |
---|
| 1942 | + DELAY_VALUE(RK3588, tx_delay, rx_delay)); |
---|
| 1943 | +} |
---|
| 1944 | + |
---|
| 1945 | +static void rk3588_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
| 1946 | +{ |
---|
| 1947 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1948 | + |
---|
| 1949 | + if (IS_ERR(bsp_priv->php_grf)) { |
---|
| 1950 | + dev_err(dev, "%s: Missing rockchip,php_grf property\n", __func__); |
---|
| 1951 | + return; |
---|
| 1952 | + } |
---|
| 1953 | + |
---|
| 1954 | + regmap_write(bsp_priv->php_grf, RK3588_GRF_GMAC_CON0, |
---|
| 1955 | + RK3588_GMAC_PHY_INTF_SEL_RMII(bsp_priv->bus_id)); |
---|
| 1956 | + |
---|
| 1957 | + regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, |
---|
| 1958 | + RK3588_GMAC_CLK_RMII_MODE(bsp_priv->bus_id)); |
---|
| 1959 | +} |
---|
| 1960 | + |
---|
| 1961 | +static void rk3588_set_gmac_speed(struct rk_priv_data *bsp_priv, int speed) |
---|
| 1962 | +{ |
---|
| 1963 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 1964 | + unsigned int val = 0, id = bsp_priv->bus_id; |
---|
| 1965 | + |
---|
| 1966 | + switch (speed) { |
---|
| 1967 | + case 10: |
---|
| 1968 | + if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) |
---|
| 1969 | + val = RK3588_GMA_CLK_RMII_DIV20(id); |
---|
| 1970 | + else |
---|
| 1971 | + val = RK3588_GMAC_CLK_RGMII_DIV50(id); |
---|
| 1972 | + break; |
---|
| 1973 | + case 100: |
---|
| 1974 | + if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII) |
---|
| 1975 | + val = RK3588_GMA_CLK_RMII_DIV2(id); |
---|
| 1976 | + else |
---|
| 1977 | + val = RK3588_GMAC_CLK_RGMII_DIV5(id); |
---|
| 1978 | + break; |
---|
| 1979 | + case 1000: |
---|
| 1980 | + if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII) |
---|
| 1981 | + val = RK3588_GMAC_CLK_RGMII_DIV1(id); |
---|
| 1982 | + else |
---|
| 1983 | + goto err; |
---|
| 1984 | + break; |
---|
| 1985 | + default: |
---|
| 1986 | + goto err; |
---|
| 1987 | + } |
---|
| 1988 | + |
---|
| 1989 | + regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val); |
---|
| 1990 | + |
---|
| 1991 | + return; |
---|
| 1992 | +err: |
---|
| 1993 | + dev_err(dev, "unknown speed value for GMAC speed=%d", speed); |
---|
| 1994 | +} |
---|
| 1995 | + |
---|
| 1996 | +static void rk3588_set_clock_selection(struct rk_priv_data *bsp_priv, bool input, |
---|
| 1997 | + bool enable) |
---|
| 1998 | +{ |
---|
| 1999 | + unsigned int val = input ? RK3588_GMAC_CLK_SELET_IO(bsp_priv->bus_id) : |
---|
| 2000 | + RK3588_GMAC_CLK_SELET_CRU(bsp_priv->bus_id); |
---|
| 2001 | + |
---|
| 2002 | + val |= enable ? RK3588_GMAC_CLK_RMII_NOGATE(bsp_priv->bus_id) : |
---|
| 2003 | + RK3588_GMAC_CLK_RMII_GATE(bsp_priv->bus_id); |
---|
| 2004 | + |
---|
| 2005 | + regmap_write(bsp_priv->php_grf, RK3588_GRF_CLK_CON1, val); |
---|
| 2006 | +} |
---|
| 2007 | + |
---|
| 2008 | +static const struct rk_gmac_ops rk3588_ops = { |
---|
| 2009 | + .set_to_rgmii = rk3588_set_to_rgmii, |
---|
| 2010 | + .set_to_rmii = rk3588_set_to_rmii, |
---|
| 2011 | + .set_rgmii_speed = rk3588_set_gmac_speed, |
---|
| 2012 | + .set_rmii_speed = rk3588_set_gmac_speed, |
---|
| 2013 | + .set_clock_selection = rk3588_set_clock_selection, |
---|
| 2014 | +}; |
---|
| 2015 | + |
---|
| 2016 | +#define RV1106_VOGRF_GMAC_CLK_CON 0X60004 |
---|
| 2017 | + |
---|
| 2018 | +#define RV1106_VOGRF_MACPHY_RMII_MODE GRF_BIT(0) |
---|
| 2019 | +#define RV1106_VOGRF_GMAC_CLK_RMII_DIV2 GRF_BIT(2) |
---|
| 2020 | +#define RV1106_VOGRF_GMAC_CLK_RMII_DIV20 GRF_CLR_BIT(2) |
---|
| 2021 | + |
---|
| 2022 | +#define RV1106_VOGRF_MACPHY_CON0 0X60028 |
---|
| 2023 | +#define RV1106_VOGRF_MACPHY_CON1 0X6002C |
---|
| 2024 | + |
---|
| 2025 | +static void rv1106_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
| 2026 | +{ |
---|
| 2027 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 2028 | + |
---|
| 2029 | + if (IS_ERR(bsp_priv->grf)) { |
---|
| 2030 | + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); |
---|
| 2031 | + return; |
---|
| 2032 | + } |
---|
| 2033 | + |
---|
| 2034 | + regmap_write(bsp_priv->grf, RV1106_VOGRF_GMAC_CLK_CON, |
---|
| 2035 | + RV1106_VOGRF_MACPHY_RMII_MODE | |
---|
| 2036 | + RV1106_VOGRF_GMAC_CLK_RMII_DIV2); |
---|
| 2037 | +} |
---|
| 2038 | + |
---|
| 2039 | +static void rv1106_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed) |
---|
| 2040 | +{ |
---|
| 2041 | + struct device *dev = &bsp_priv->pdev->dev; |
---|
| 2042 | + unsigned int val = 0; |
---|
| 2043 | + |
---|
| 2044 | + if (IS_ERR(bsp_priv->grf)) { |
---|
| 2045 | + dev_err(dev, "%s: Missing rockchip,grf property\n", __func__); |
---|
| 2046 | + return; |
---|
| 2047 | + } |
---|
| 2048 | + |
---|
| 2049 | + if (speed == 10) { |
---|
| 2050 | + val = RV1106_VOGRF_GMAC_CLK_RMII_DIV20; |
---|
| 2051 | + } else if (speed == 100) { |
---|
| 2052 | + val = RV1106_VOGRF_GMAC_CLK_RMII_DIV2; |
---|
| 2053 | + } else { |
---|
| 2054 | + dev_err(dev, "unknown speed value for RMII! speed=%d", speed); |
---|
| 2055 | + return; |
---|
| 2056 | + } |
---|
| 2057 | + |
---|
| 2058 | + regmap_write(bsp_priv->grf, RV1106_VOGRF_GMAC_CLK_CON, val); |
---|
| 2059 | +} |
---|
| 2060 | + |
---|
| 2061 | +static void rv1106_integrated_sphy_power(struct rk_priv_data *priv, bool up) |
---|
| 2062 | +{ |
---|
| 2063 | + rk_gmac_integrated_fephy_power(priv, RV1106_VOGRF_MACPHY_CON0, |
---|
| 2064 | + RV1106_VOGRF_MACPHY_CON1, up); |
---|
| 2065 | +} |
---|
| 2066 | + |
---|
| 2067 | +static const struct rk_gmac_ops rv1106_ops = { |
---|
| 2068 | + .set_to_rmii = rv1106_set_to_rmii, |
---|
| 2069 | + .set_rmii_speed = rv1106_set_rmii_speed, |
---|
| 2070 | + .integrated_phy_power = rv1106_integrated_sphy_power, |
---|
1410 | 2071 | }; |
---|
1411 | 2072 | |
---|
1412 | 2073 | #define RV1108_GRF_GMAC_CON0 0X0900 |
---|
.. | .. |
---|
1472 | 2133 | (GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6)) |
---|
1473 | 2134 | #define RV1126_GMAC_FLOW_CTRL GRF_BIT(7) |
---|
1474 | 2135 | #define RV1126_GMAC_FLOW_CTRL_CLR GRF_CLR_BIT(7) |
---|
1475 | | -#define RV1126_GMAC_M0_RXCLK_DLY_ENABLE GRF_BIT(1) |
---|
1476 | | -#define RV1126_GMAC_M0_RXCLK_DLY_DISABLE GRF_CLR_BIT(1) |
---|
1477 | | -#define RV1126_GMAC_M0_TXCLK_DLY_ENABLE GRF_BIT(0) |
---|
1478 | | -#define RV1126_GMAC_M0_TXCLK_DLY_DISABLE GRF_CLR_BIT(0) |
---|
1479 | | -#define RV1126_GMAC_M1_RXCLK_DLY_ENABLE GRF_BIT(3) |
---|
1480 | | -#define RV1126_GMAC_M1_RXCLK_DLY_DISABLE GRF_CLR_BIT(3) |
---|
1481 | | -#define RV1126_GMAC_M1_TXCLK_DLY_ENABLE GRF_BIT(2) |
---|
1482 | | -#define RV1126_GMAC_M1_TXCLK_DLY_DISABLE GRF_CLR_BIT(2) |
---|
| 2136 | +#define RV1126_M0_GMAC_RXCLK_DLY_ENABLE GRF_BIT(1) |
---|
| 2137 | +#define RV1126_M0_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(1) |
---|
| 2138 | +#define RV1126_M0_GMAC_TXCLK_DLY_ENABLE GRF_BIT(0) |
---|
| 2139 | +#define RV1126_M0_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(0) |
---|
| 2140 | +#define RV1126_M1_GMAC_RXCLK_DLY_ENABLE GRF_BIT(3) |
---|
| 2141 | +#define RV1126_M1_GMAC_RXCLK_DLY_DISABLE GRF_CLR_BIT(3) |
---|
| 2142 | +#define RV1126_M1_GMAC_TXCLK_DLY_ENABLE GRF_BIT(2) |
---|
| 2143 | +#define RV1126_M1_GMAC_TXCLK_DLY_DISABLE GRF_CLR_BIT(2) |
---|
1483 | 2144 | |
---|
1484 | | -/* RV1126_GRF_GMAC_CON1 */ |
---|
1485 | | -#define RV1126_GMAC_M0_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) |
---|
1486 | | -#define RV1126_GMAC_M0_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) |
---|
1487 | | -/* RV1126_GRF_GMAC_CON2 */ |
---|
1488 | | -#define RV1126_GMAC_M1_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) |
---|
1489 | | -#define RV1126_GMAC_M1_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) |
---|
| 2145 | +/* RV1126_GRF_GMAC_CON1 && RV1126_GRF_GMAC_CON2 */ |
---|
| 2146 | +#define RV1126_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 8) |
---|
| 2147 | +#define RV1126_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0x7F, 0) |
---|
1490 | 2148 | |
---|
1491 | 2149 | static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv, |
---|
1492 | 2150 | int tx_delay, int rx_delay) |
---|
.. | .. |
---|
1500 | 2158 | |
---|
1501 | 2159 | regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0, |
---|
1502 | 2160 | RV1126_GMAC_PHY_INTF_SEL_RGMII | |
---|
1503 | | - RV1126_GMAC_M0_RXCLK_DLY_ENABLE | |
---|
1504 | | - RV1126_GMAC_M0_TXCLK_DLY_ENABLE | |
---|
1505 | | - RV1126_GMAC_M1_RXCLK_DLY_ENABLE | |
---|
1506 | | - RV1126_GMAC_M1_TXCLK_DLY_ENABLE); |
---|
| 2161 | + DELAY_ENABLE(RV1126_M0, tx_delay, rx_delay) | |
---|
| 2162 | + DELAY_ENABLE(RV1126_M1, tx_delay, rx_delay)); |
---|
1507 | 2163 | |
---|
1508 | 2164 | regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON1, |
---|
1509 | | - RV1126_GMAC_M0_CLK_RX_DL_CFG(rx_delay) | |
---|
1510 | | - RV1126_GMAC_M0_CLK_TX_DL_CFG(tx_delay)); |
---|
| 2165 | + DELAY_VALUE(RV1126, tx_delay, rx_delay)); |
---|
1511 | 2166 | |
---|
1512 | 2167 | regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON2, |
---|
1513 | | - RV1126_GMAC_M1_CLK_RX_DL_CFG(rx_delay) | |
---|
1514 | | - RV1126_GMAC_M1_CLK_TX_DL_CFG(tx_delay)); |
---|
| 2168 | + DELAY_VALUE(RV1126, tx_delay, rx_delay)); |
---|
1515 | 2169 | } |
---|
1516 | 2170 | |
---|
1517 | 2171 | static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv) |
---|
.. | .. |
---|
1585 | 2239 | .set_rmii_speed = rv1126_set_rmii_speed, |
---|
1586 | 2240 | }; |
---|
1587 | 2241 | |
---|
1588 | | -#define RK_GRF_MACPHY_CON0 0xb00 |
---|
1589 | | -#define RK_GRF_MACPHY_CON1 0xb04 |
---|
1590 | | -#define RK_GRF_MACPHY_CON2 0xb08 |
---|
1591 | | -#define RK_GRF_MACPHY_CON3 0xb0c |
---|
1592 | | - |
---|
1593 | | -#define RK_MACPHY_ENABLE GRF_BIT(0) |
---|
1594 | | -#define RK_MACPHY_DISABLE GRF_CLR_BIT(0) |
---|
1595 | | -#define RK_MACPHY_CFG_CLK_50M GRF_BIT(14) |
---|
1596 | | -#define RK_GMAC2PHY_RMII_MODE (GRF_BIT(6) | GRF_CLR_BIT(7)) |
---|
1597 | | -#define RK_GRF_CON2_MACPHY_ID HIWORD_UPDATE(0x1234, 0xffff, 0) |
---|
1598 | | -#define RK_GRF_CON3_MACPHY_ID HIWORD_UPDATE(0x35, 0x3f, 0) |
---|
1599 | | - |
---|
1600 | | -static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv) |
---|
1601 | | -{ |
---|
1602 | | - if (priv->ops->integrated_phy_powerup) |
---|
1603 | | - priv->ops->integrated_phy_powerup(priv); |
---|
1604 | | - |
---|
1605 | | - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M); |
---|
1606 | | - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE); |
---|
1607 | | - |
---|
1608 | | - regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID); |
---|
1609 | | - regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID); |
---|
1610 | | - |
---|
1611 | | - if (priv->phy_reset) { |
---|
1612 | | - /* PHY needs to be disabled before trying to reset it */ |
---|
1613 | | - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); |
---|
1614 | | - if (priv->phy_reset) |
---|
1615 | | - reset_control_assert(priv->phy_reset); |
---|
1616 | | - usleep_range(10, 20); |
---|
1617 | | - if (priv->phy_reset) |
---|
1618 | | - reset_control_deassert(priv->phy_reset); |
---|
1619 | | - usleep_range(10, 20); |
---|
1620 | | - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE); |
---|
1621 | | - msleep(30); |
---|
1622 | | - } |
---|
1623 | | -} |
---|
1624 | | - |
---|
1625 | | -static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv) |
---|
1626 | | -{ |
---|
1627 | | - regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE); |
---|
1628 | | - if (priv->phy_reset) |
---|
1629 | | - reset_control_assert(priv->phy_reset); |
---|
1630 | | -} |
---|
1631 | | - |
---|
1632 | 2242 | static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat) |
---|
1633 | 2243 | { |
---|
1634 | 2244 | struct rk_priv_data *bsp_priv = plat->bsp_priv; |
---|
.. | .. |
---|
1679 | 2289 | bsp_priv->phy_iface == PHY_INTERFACE_MODE_QSGMII) { |
---|
1680 | 2290 | bsp_priv->pclk_xpcs = devm_clk_get(dev, "pclk_xpcs"); |
---|
1681 | 2291 | if (IS_ERR(bsp_priv->pclk_xpcs)) |
---|
1682 | | - dev_err(dev, "cannot get clock %s\n", |
---|
1683 | | - "pclk_xpcs"); |
---|
| 2292 | + dev_err(dev, "cannot get clock %s\n", "pclk_xpcs"); |
---|
| 2293 | + bsp_priv->clk_xpcs_eee = devm_clk_get(dev, "clk_xpcs_eee"); |
---|
| 2294 | + if (IS_ERR(bsp_priv->clk_xpcs_eee)) |
---|
| 2295 | + dev_err(dev, "cannot get clock %s\n", "clk_xpcs_eee"); |
---|
1684 | 2296 | } |
---|
1685 | 2297 | |
---|
1686 | 2298 | bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed"); |
---|
.. | .. |
---|
1748 | 2360 | if (!IS_ERR(bsp_priv->pclk_xpcs)) |
---|
1749 | 2361 | clk_prepare_enable(bsp_priv->pclk_xpcs); |
---|
1750 | 2362 | |
---|
| 2363 | + if (!IS_ERR(bsp_priv->clk_xpcs_eee)) |
---|
| 2364 | + clk_prepare_enable(bsp_priv->clk_xpcs_eee); |
---|
| 2365 | + |
---|
| 2366 | + if (bsp_priv->ops && bsp_priv->ops->set_clock_selection) |
---|
| 2367 | + bsp_priv->ops->set_clock_selection(bsp_priv, |
---|
| 2368 | + bsp_priv->clock_input, true); |
---|
| 2369 | + |
---|
1751 | 2370 | /** |
---|
1752 | 2371 | * if (!IS_ERR(bsp_priv->clk_mac)) |
---|
1753 | 2372 | * clk_prepare_enable(bsp_priv->clk_mac); |
---|
1754 | 2373 | */ |
---|
1755 | | - mdelay(5); |
---|
| 2374 | + usleep_range(100, 200); |
---|
1756 | 2375 | bsp_priv->clk_enabled = true; |
---|
1757 | 2376 | } |
---|
1758 | 2377 | } else { |
---|
1759 | 2378 | if (bsp_priv->clk_enabled) { |
---|
| 2379 | + if (bsp_priv->ops && bsp_priv->ops->set_clock_selection) |
---|
| 2380 | + bsp_priv->ops->set_clock_selection(bsp_priv, |
---|
| 2381 | + bsp_priv->clock_input, false); |
---|
| 2382 | + |
---|
1760 | 2383 | if (phy_iface == PHY_INTERFACE_MODE_RMII) { |
---|
1761 | 2384 | clk_disable_unprepare(bsp_priv->mac_clk_rx); |
---|
1762 | 2385 | |
---|
.. | .. |
---|
1776 | 2399 | clk_disable_unprepare(bsp_priv->clk_mac_speed); |
---|
1777 | 2400 | |
---|
1778 | 2401 | clk_disable_unprepare(bsp_priv->pclk_xpcs); |
---|
| 2402 | + |
---|
| 2403 | + clk_disable_unprepare(bsp_priv->clk_xpcs_eee); |
---|
1779 | 2404 | |
---|
1780 | 2405 | /** |
---|
1781 | 2406 | * if (!IS_ERR(bsp_priv->clk_mac)) |
---|
.. | .. |
---|
1824 | 2449 | if (!bsp_priv) |
---|
1825 | 2450 | return ERR_PTR(-ENOMEM); |
---|
1826 | 2451 | |
---|
1827 | | - bsp_priv->phy_iface = of_get_phy_mode(dev->of_node); |
---|
| 2452 | + of_get_phy_mode(dev->of_node, &bsp_priv->phy_iface); |
---|
1828 | 2453 | bsp_priv->ops = ops; |
---|
1829 | 2454 | bsp_priv->bus_id = plat->bus_id; |
---|
1830 | 2455 | |
---|
.. | .. |
---|
1853 | 2478 | |
---|
1854 | 2479 | ret = of_property_read_u32(dev->of_node, "tx_delay", &value); |
---|
1855 | 2480 | if (ret) { |
---|
1856 | | - bsp_priv->tx_delay = 0x30; |
---|
| 2481 | + bsp_priv->tx_delay = -1; |
---|
1857 | 2482 | dev_err(dev, "Can not read property: tx_delay."); |
---|
1858 | 2483 | dev_err(dev, "set tx_delay to 0x%x\n", |
---|
1859 | 2484 | bsp_priv->tx_delay); |
---|
.. | .. |
---|
1864 | 2489 | |
---|
1865 | 2490 | ret = of_property_read_u32(dev->of_node, "rx_delay", &value); |
---|
1866 | 2491 | if (ret) { |
---|
1867 | | - bsp_priv->rx_delay = 0x10; |
---|
| 2492 | + bsp_priv->rx_delay = -1; |
---|
1868 | 2493 | dev_err(dev, "Can not read property: rx_delay."); |
---|
1869 | 2494 | dev_err(dev, "set rx_delay to 0x%x\n", |
---|
1870 | 2495 | bsp_priv->rx_delay); |
---|
.. | .. |
---|
1875 | 2500 | |
---|
1876 | 2501 | bsp_priv->grf = syscon_regmap_lookup_by_phandle(dev->of_node, |
---|
1877 | 2502 | "rockchip,grf"); |
---|
| 2503 | + bsp_priv->php_grf = syscon_regmap_lookup_by_phandle(dev->of_node, |
---|
| 2504 | + "rockchip,php_grf"); |
---|
1878 | 2505 | bsp_priv->xpcs = syscon_regmap_lookup_by_phandle(dev->of_node, |
---|
1879 | 2506 | "rockchip,xpcs"); |
---|
1880 | 2507 | if (!IS_ERR(bsp_priv->xpcs)) { |
---|
.. | .. |
---|
1892 | 2519 | bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node, |
---|
1893 | 2520 | "phy-is-integrated"); |
---|
1894 | 2521 | if (bsp_priv->integrated_phy) { |
---|
| 2522 | + unsigned char *efuse_buf; |
---|
| 2523 | + struct nvmem_cell *cell; |
---|
| 2524 | + size_t len; |
---|
| 2525 | + |
---|
1895 | 2526 | bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL); |
---|
1896 | 2527 | if (IS_ERR(bsp_priv->phy_reset)) { |
---|
1897 | 2528 | dev_err(&pdev->dev, "No PHY reset control found.\n"); |
---|
1898 | 2529 | bsp_priv->phy_reset = NULL; |
---|
| 2530 | + } |
---|
| 2531 | + |
---|
| 2532 | + if (of_property_read_u32(plat->phy_node, "bgs,increment", |
---|
| 2533 | + &bsp_priv->bgs_increment)) { |
---|
| 2534 | + bsp_priv->bgs_increment = 0; |
---|
| 2535 | + } else { |
---|
| 2536 | + if (bsp_priv->bgs_increment > RK_FEPHY_BGS_MAX) { |
---|
| 2537 | + dev_err(dev, "%s: error bgs increment: %d\n", |
---|
| 2538 | + __func__, bsp_priv->bgs_increment); |
---|
| 2539 | + bsp_priv->bgs_increment = RK_FEPHY_BGS_MAX; |
---|
| 2540 | + } |
---|
| 2541 | + } |
---|
| 2542 | + |
---|
| 2543 | + /* Read bgs from OTP if it exists */ |
---|
| 2544 | + cell = nvmem_cell_get(dev, "bgs"); |
---|
| 2545 | + if (IS_ERR(cell)) { |
---|
| 2546 | + if (PTR_ERR(cell) != -EPROBE_DEFER) |
---|
| 2547 | + dev_info(dev, "failed to get bgs cell: %ld, use default\n", |
---|
| 2548 | + PTR_ERR(cell)); |
---|
| 2549 | + else |
---|
| 2550 | + return ERR_CAST(cell); |
---|
| 2551 | + } else { |
---|
| 2552 | + efuse_buf = nvmem_cell_read(cell, &len); |
---|
| 2553 | + nvmem_cell_put(cell); |
---|
| 2554 | + if (!IS_ERR(efuse_buf)) { |
---|
| 2555 | + if (len == 1) |
---|
| 2556 | + bsp_priv->otp_data = efuse_buf[0]; |
---|
| 2557 | + kfree(efuse_buf); |
---|
| 2558 | + } else { |
---|
| 2559 | + dev_err(dev, "failed to get efuse buf, use default\n"); |
---|
| 2560 | + } |
---|
1899 | 2561 | } |
---|
1900 | 2562 | } |
---|
1901 | 2563 | } |
---|
.. | .. |
---|
1927 | 2589 | case PHY_INTERFACE_MODE_RGMII_ID: |
---|
1928 | 2590 | dev_info(dev, "init for RGMII_ID\n"); |
---|
1929 | 2591 | if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) |
---|
1930 | | - bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0); |
---|
| 2592 | + bsp_priv->ops->set_to_rgmii(bsp_priv, -1, -1); |
---|
1931 | 2593 | break; |
---|
1932 | 2594 | case PHY_INTERFACE_MODE_RGMII_RXID: |
---|
1933 | 2595 | dev_info(dev, "init for RGMII_RXID\n"); |
---|
1934 | 2596 | if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) |
---|
1935 | | - bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0); |
---|
| 2597 | + bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, -1); |
---|
1936 | 2598 | break; |
---|
1937 | 2599 | case PHY_INTERFACE_MODE_RGMII_TXID: |
---|
1938 | 2600 | dev_info(dev, "init for RGMII_TXID\n"); |
---|
1939 | 2601 | if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii) |
---|
1940 | | - bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay); |
---|
| 2602 | + bsp_priv->ops->set_to_rgmii(bsp_priv, -1, bsp_priv->rx_delay); |
---|
1941 | 2603 | break; |
---|
1942 | 2604 | case PHY_INTERFACE_MODE_RMII: |
---|
1943 | 2605 | dev_info(dev, "init for RMII\n"); |
---|
.. | .. |
---|
1964 | 2626 | return ret; |
---|
1965 | 2627 | } |
---|
1966 | 2628 | |
---|
1967 | | - pm_runtime_enable(dev); |
---|
1968 | 2629 | pm_runtime_get_sync(dev); |
---|
1969 | | - |
---|
1970 | | - if (bsp_priv->integrated_phy) |
---|
1971 | | - rk_gmac_integrated_phy_powerup(bsp_priv); |
---|
1972 | 2630 | |
---|
1973 | 2631 | return 0; |
---|
1974 | 2632 | } |
---|
1975 | 2633 | |
---|
1976 | 2634 | static void rk_gmac_powerdown(struct rk_priv_data *gmac) |
---|
1977 | 2635 | { |
---|
1978 | | - struct device *dev = &gmac->pdev->dev; |
---|
1979 | | - |
---|
1980 | | - if (gmac->integrated_phy) |
---|
1981 | | - rk_gmac_integrated_phy_powerdown(gmac); |
---|
1982 | | - |
---|
1983 | | - pm_runtime_put_sync(dev); |
---|
1984 | | - pm_runtime_disable(dev); |
---|
| 2636 | + pm_runtime_put_sync(&gmac->pdev->dev); |
---|
1985 | 2637 | |
---|
1986 | 2638 | rk_gmac_phy_power_on(gmac, false); |
---|
1987 | 2639 | gmac_clk_enable(gmac, false); |
---|
.. | .. |
---|
2010 | 2662 | default: |
---|
2011 | 2663 | dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface); |
---|
2012 | 2664 | } |
---|
| 2665 | +} |
---|
| 2666 | + |
---|
| 2667 | +static int rk_integrated_phy_power(void *priv, bool up) |
---|
| 2668 | +{ |
---|
| 2669 | + struct rk_priv_data *bsp_priv = priv; |
---|
| 2670 | + |
---|
| 2671 | + if (!bsp_priv->integrated_phy || !bsp_priv->ops || |
---|
| 2672 | + !bsp_priv->ops->integrated_phy_power) |
---|
| 2673 | + return 0; |
---|
| 2674 | + |
---|
| 2675 | + bsp_priv->ops->integrated_phy_power(bsp_priv, up); |
---|
| 2676 | + |
---|
| 2677 | + return 0; |
---|
2013 | 2678 | } |
---|
2014 | 2679 | |
---|
2015 | 2680 | void dwmac_rk_set_rgmii_delayline(struct stmmac_priv *priv, |
---|
.. | .. |
---|
2046 | 2711 | } |
---|
2047 | 2712 | EXPORT_SYMBOL(dwmac_rk_get_phy_interface); |
---|
2048 | 2713 | |
---|
2049 | | -void __weak rk_devinfo_get_eth_mac(u8 *mac) |
---|
2050 | | -{ |
---|
2051 | | -} |
---|
2052 | | - |
---|
2053 | 2714 | static unsigned char macaddr[6]; |
---|
2054 | 2715 | extern ssize_t at24_mac_read(unsigned char* addr); |
---|
2055 | | -void rk_get_eth_addr(void *priv, unsigned char *addr) |
---|
| 2716 | +static void rk_get_eth_addr(void *priv, unsigned char *addr) |
---|
2056 | 2717 | { |
---|
2057 | 2718 | struct rk_priv_data *bsp_priv = priv; |
---|
2058 | 2719 | struct device *dev = &bsp_priv->pdev->dev; |
---|
2059 | | - int i; |
---|
2060 | 2720 | //unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0}; |
---|
2061 | | - //int ret, id = bsp_priv->bus_id; |
---|
| 2721 | + int ret, id = bsp_priv->bus_id; |
---|
| 2722 | + //int i; |
---|
2062 | 2723 | |
---|
2063 | | - //ben |
---|
2064 | | - printk("nk-debug:enter rk_get_eth_addr.. \n"); |
---|
2065 | | - |
---|
2066 | | - #if 0 |
---|
2067 | | - rk_devinfo_get_eth_mac(addr); |
---|
| 2724 | + printk("hw-debug:enter rk_get_eth_addr.. \n"); |
---|
| 2725 | +#if 0 |
---|
2068 | 2726 | if (is_valid_ether_addr(addr)) |
---|
2069 | 2727 | goto out; |
---|
2070 | | - |
---|
| 2728 | + |
---|
2071 | 2729 | if (id < 0 || id >= MAX_ETH) { |
---|
2072 | 2730 | dev_err(dev, "%s: Invalid ethernet bus id %d\n", __func__, id); |
---|
2073 | 2731 | return; |
---|
.. | .. |
---|
2094 | 2752 | } else { |
---|
2095 | 2753 | memcpy(addr, ðaddr[id * ETH_ALEN], ETH_ALEN); |
---|
2096 | 2754 | } |
---|
2097 | | - #endif |
---|
| 2755 | +#endif |
---|
2098 | 2756 | |
---|
2099 | | - #if 0 |
---|
2100 | | - macaddr[0] = 0xee; |
---|
2101 | | - macaddr[1] = 0x31; |
---|
2102 | | - macaddr[2] = 0x32; |
---|
2103 | | - macaddr[3] = 0x33; |
---|
2104 | | - macaddr[4] = 0x34; |
---|
2105 | | - macaddr[5] = 0x35; |
---|
2106 | | - |
---|
2107 | | - memcpy(addr, macaddr, 6); |
---|
2108 | | - #endif |
---|
2109 | | - |
---|
2110 | | - #if 1 |
---|
2111 | | - if (at24_mac_read(macaddr) > 0) { |
---|
2112 | | - printk("ben %s: at24_mac_read Success!! \n", __func__); |
---|
2113 | | - memcpy(addr, macaddr, 6); |
---|
2114 | 2757 | |
---|
2115 | | - printk("Read the Ethernet MAC address from :"); |
---|
2116 | | - for (i = 0; i < 5; i++) |
---|
2117 | | - printk("%2.2x:", addr[i]); |
---|
2118 | | - |
---|
2119 | | - printk("%2.2x\n", addr[i]); |
---|
2120 | | - } else { |
---|
2121 | | - printk("ben %s: at24_mac_read Failed!! \n", __func__); |
---|
2122 | | - goto out; |
---|
2123 | | - } |
---|
2124 | | - #endif |
---|
2125 | | - |
---|
| 2758 | + //eeprom |
---|
| 2759 | + ret = at24_mac_read(macaddr); |
---|
| 2760 | + if (ret > 0) |
---|
| 2761 | + { |
---|
| 2762 | + printk("ben %s: at24_mac_read Success!! \n", __func__); |
---|
| 2763 | + memcpy(addr, macaddr, 6); |
---|
| 2764 | + |
---|
| 2765 | + if ((addr[0] == 0x68) && (addr[1] == 0xed)) |
---|
| 2766 | + { |
---|
| 2767 | + printk("at24_eeprom mac is valid \n", __func__); |
---|
| 2768 | + goto out; |
---|
| 2769 | + } |
---|
| 2770 | + else |
---|
| 2771 | + { |
---|
| 2772 | + printk("at24_eeprom mac is invalid \n", __func__); |
---|
| 2773 | + addr[0] = 0x68; |
---|
| 2774 | + addr[1] = 0xed; |
---|
| 2775 | + addr[2] = 0x01; |
---|
| 2776 | + addr[3] = 0x02; |
---|
| 2777 | + addr[4] = 0x03; |
---|
| 2778 | + addr[5] = 0x04; |
---|
| 2779 | + } |
---|
| 2780 | + } |
---|
2126 | 2781 | out: |
---|
2127 | 2782 | dev_err(dev, "%s: mac address: %pM\n", __func__, addr); |
---|
2128 | 2783 | } |
---|
.. | .. |
---|
2134 | 2789 | const struct rk_gmac_ops *data; |
---|
2135 | 2790 | int ret; |
---|
2136 | 2791 | |
---|
2137 | | - printk("nk-debug:enter rk_gmac_probe 1.. \n"); |
---|
2138 | 2792 | data = of_device_get_match_data(&pdev->dev); |
---|
2139 | 2793 | if (!data) { |
---|
2140 | 2794 | dev_err(&pdev->dev, "no of match data provided\n"); |
---|
.. | .. |
---|
2152 | 2806 | if (!of_device_is_compatible(pdev->dev.of_node, "snps,dwmac-4.20a")) |
---|
2153 | 2807 | plat_dat->has_gmac = true; |
---|
2154 | 2808 | |
---|
| 2809 | + plat_dat->sph_disable = true; |
---|
2155 | 2810 | plat_dat->fix_mac_speed = rk_fix_speed; |
---|
2156 | 2811 | plat_dat->get_eth_addr = rk_get_eth_addr; |
---|
| 2812 | + plat_dat->integrated_phy_power = rk_integrated_phy_power; |
---|
2157 | 2813 | |
---|
2158 | 2814 | plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data); |
---|
2159 | 2815 | if (IS_ERR(plat_dat->bsp_priv)) { |
---|
.. | .. |
---|
2161 | 2817 | goto err_remove_config_dt; |
---|
2162 | 2818 | } |
---|
2163 | 2819 | |
---|
2164 | | - printk("nk-debug:enter rk_gmac_probe 2.. \n"); |
---|
2165 | 2820 | ret = rk_gmac_clk_init(plat_dat); |
---|
2166 | 2821 | if (ret) |
---|
2167 | 2822 | goto err_remove_config_dt; |
---|
.. | .. |
---|
2231 | 2886 | static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume); |
---|
2232 | 2887 | |
---|
2233 | 2888 | static const struct of_device_id rk_gmac_dwmac_match[] = { |
---|
| 2889 | +#ifdef CONFIG_CPU_PX30 |
---|
2234 | 2890 | { .compatible = "rockchip,px30-gmac", .data = &px30_ops }, |
---|
| 2891 | +#endif |
---|
| 2892 | +#ifdef CONFIG_CPU_RK1808 |
---|
2235 | 2893 | { .compatible = "rockchip,rk1808-gmac", .data = &rk1808_ops }, |
---|
| 2894 | +#endif |
---|
| 2895 | +#ifdef CONFIG_CPU_RK312X |
---|
2236 | 2896 | { .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops }, |
---|
| 2897 | +#endif |
---|
| 2898 | +#ifdef CONFIG_CPU_RK322X |
---|
2237 | 2899 | { .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops }, |
---|
| 2900 | +#endif |
---|
| 2901 | +#ifdef CONFIG_CPU_RK3288 |
---|
2238 | 2902 | { .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops }, |
---|
| 2903 | +#endif |
---|
| 2904 | +#ifdef CONFIG_CPU_RK3308 |
---|
2239 | 2905 | { .compatible = "rockchip,rk3308-mac", .data = &rk3308_ops }, |
---|
| 2906 | +#endif |
---|
| 2907 | +#ifdef CONFIG_CPU_RK3328 |
---|
2240 | 2908 | { .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops }, |
---|
| 2909 | +#endif |
---|
| 2910 | +#ifdef CONFIG_CPU_RK3366 |
---|
2241 | 2911 | { .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops }, |
---|
| 2912 | +#endif |
---|
| 2913 | +#ifdef CONFIG_CPU_RK3368 |
---|
2242 | 2914 | { .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops }, |
---|
| 2915 | +#endif |
---|
| 2916 | +#ifdef CONFIG_CPU_RK3399 |
---|
2243 | 2917 | { .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops }, |
---|
| 2918 | +#endif |
---|
| 2919 | +#ifdef CONFIG_CPU_RK3528 |
---|
| 2920 | + { .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops }, |
---|
| 2921 | +#endif |
---|
| 2922 | +#ifdef CONFIG_CPU_RK3562 |
---|
| 2923 | + { .compatible = "rockchip,rk3562-gmac", .data = &rk3562_ops }, |
---|
| 2924 | +#endif |
---|
| 2925 | +#ifdef CONFIG_CPU_RK3568 |
---|
2244 | 2926 | { .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops }, |
---|
| 2927 | +#endif |
---|
| 2928 | +#ifdef CONFIG_CPU_RK3588 |
---|
| 2929 | + { .compatible = "rockchip,rk3588-gmac", .data = &rk3588_ops }, |
---|
| 2930 | +#endif |
---|
| 2931 | +#ifdef CONFIG_CPU_RV1106 |
---|
| 2932 | + { .compatible = "rockchip,rv1106-gmac", .data = &rv1106_ops }, |
---|
| 2933 | +#endif |
---|
| 2934 | +#ifdef CONFIG_CPU_RV1108 |
---|
2245 | 2935 | { .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops }, |
---|
| 2936 | +#endif |
---|
| 2937 | +#ifdef CONFIG_CPU_RV1126 |
---|
2246 | 2938 | { .compatible = "rockchip,rv1126-gmac", .data = &rv1126_ops }, |
---|
| 2939 | +#endif |
---|
2247 | 2940 | { } |
---|
2248 | 2941 | }; |
---|
2249 | 2942 | MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match); |
---|
.. | .. |
---|
2258 | 2951 | }, |
---|
2259 | 2952 | }; |
---|
2260 | 2953 | //module_platform_driver(rk_gmac_dwmac_driver); |
---|
2261 | | - module_platform_driver1(rk_gmac_dwmac_driver); |
---|
| 2954 | +module_platform_driver1(rk_gmac_dwmac_driver); |
---|
2262 | 2955 | |
---|
2263 | 2956 | MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>"); |
---|
2264 | 2957 | MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer"); |
---|