0001
0002
0003
0004
0005
0006
0007 #include <linux/ethtool.h>
0008 #include <linux/kernel.h>
0009 #include <linux/mii.h>
0010 #include <linux/module.h>
0011 #include <linux/of.h>
0012 #include <linux/phy.h>
0013 #include <linux/delay.h>
0014 #include <linux/netdevice.h>
0015 #include <linux/etherdevice.h>
0016 #include <linux/bitfield.h>
0017 #include <linux/nvmem-consumer.h>
0018
0019 #include <dt-bindings/net/ti-dp83867.h>
0020
0021 #define DP83867_PHY_ID 0x2000a231
0022 #define DP83867_DEVADDR 0x1f
0023
0024 #define MII_DP83867_PHYCTRL 0x10
0025 #define MII_DP83867_PHYSTS 0x11
0026 #define MII_DP83867_MICR 0x12
0027 #define MII_DP83867_ISR 0x13
0028 #define DP83867_CFG2 0x14
0029 #define DP83867_CFG3 0x1e
0030 #define DP83867_CTRL 0x1f
0031
0032
0033 #define DP83867_FLD_THR_CFG 0x002e
0034 #define DP83867_CFG4 0x0031
0035 #define DP83867_CFG4_SGMII_ANEG_MASK (BIT(5) | BIT(6))
0036 #define DP83867_CFG4_SGMII_ANEG_TIMER_11MS (3 << 5)
0037 #define DP83867_CFG4_SGMII_ANEG_TIMER_800US (2 << 5)
0038 #define DP83867_CFG4_SGMII_ANEG_TIMER_2US (1 << 5)
0039 #define DP83867_CFG4_SGMII_ANEG_TIMER_16MS (0 << 5)
0040
0041 #define DP83867_RGMIICTL 0x0032
0042 #define DP83867_STRAP_STS1 0x006E
0043 #define DP83867_STRAP_STS2 0x006f
0044 #define DP83867_RGMIIDCTL 0x0086
0045 #define DP83867_RXFCFG 0x0134
0046 #define DP83867_RXFPMD1 0x0136
0047 #define DP83867_RXFPMD2 0x0137
0048 #define DP83867_RXFPMD3 0x0138
0049 #define DP83867_RXFSOP1 0x0139
0050 #define DP83867_RXFSOP2 0x013A
0051 #define DP83867_RXFSOP3 0x013B
0052 #define DP83867_IO_MUX_CFG 0x0170
0053 #define DP83867_SGMIICTL 0x00D3
0054 #define DP83867_10M_SGMII_CFG 0x016F
0055 #define DP83867_10M_SGMII_RATE_ADAPT_MASK BIT(7)
0056
0057 #define DP83867_SW_RESET BIT(15)
0058 #define DP83867_SW_RESTART BIT(14)
0059
0060
0061 #define MII_DP83867_MICR_AN_ERR_INT_EN BIT(15)
0062 #define MII_DP83867_MICR_SPEED_CHNG_INT_EN BIT(14)
0063 #define MII_DP83867_MICR_DUP_MODE_CHNG_INT_EN BIT(13)
0064 #define MII_DP83867_MICR_PAGE_RXD_INT_EN BIT(12)
0065 #define MII_DP83867_MICR_AUTONEG_COMP_INT_EN BIT(11)
0066 #define MII_DP83867_MICR_LINK_STS_CHNG_INT_EN BIT(10)
0067 #define MII_DP83867_MICR_FALSE_CARRIER_INT_EN BIT(8)
0068 #define MII_DP83867_MICR_SLEEP_MODE_CHNG_INT_EN BIT(4)
0069 #define MII_DP83867_MICR_WOL_INT_EN BIT(3)
0070 #define MII_DP83867_MICR_XGMII_ERR_INT_EN BIT(2)
0071 #define MII_DP83867_MICR_POL_CHNG_INT_EN BIT(1)
0072 #define MII_DP83867_MICR_JABBER_INT_EN BIT(0)
0073
0074
0075 #define DP83867_RGMII_TX_CLK_DELAY_EN BIT(1)
0076 #define DP83867_RGMII_RX_CLK_DELAY_EN BIT(0)
0077
0078
0079 #define DP83867_SGMII_TYPE BIT(14)
0080
0081
0082 #define DP83867_WOL_MAGIC_EN BIT(0)
0083 #define DP83867_WOL_BCAST_EN BIT(2)
0084 #define DP83867_WOL_UCAST_EN BIT(4)
0085 #define DP83867_WOL_SEC_EN BIT(5)
0086 #define DP83867_WOL_ENH_MAC BIT(7)
0087
0088
0089 #define DP83867_STRAP_STS1_RESERVED BIT(11)
0090
0091
0092 #define DP83867_STRAP_STS2_CLK_SKEW_TX_MASK GENMASK(6, 4)
0093 #define DP83867_STRAP_STS2_CLK_SKEW_TX_SHIFT 4
0094 #define DP83867_STRAP_STS2_CLK_SKEW_RX_MASK GENMASK(2, 0)
0095 #define DP83867_STRAP_STS2_CLK_SKEW_RX_SHIFT 0
0096 #define DP83867_STRAP_STS2_CLK_SKEW_NONE BIT(2)
0097 #define DP83867_STRAP_STS2_STRAP_FLD BIT(10)
0098
0099
0100 #define DP83867_PHYCR_TX_FIFO_DEPTH_SHIFT 14
0101 #define DP83867_PHYCR_RX_FIFO_DEPTH_SHIFT 12
0102 #define DP83867_PHYCR_FIFO_DEPTH_MAX 0x03
0103 #define DP83867_PHYCR_TX_FIFO_DEPTH_MASK GENMASK(15, 14)
0104 #define DP83867_PHYCR_RX_FIFO_DEPTH_MASK GENMASK(13, 12)
0105 #define DP83867_PHYCR_RESERVED_MASK BIT(11)
0106 #define DP83867_PHYCR_FORCE_LINK_GOOD BIT(10)
0107
0108
0109 #define DP83867_RGMII_TX_CLK_DELAY_MAX 0xf
0110 #define DP83867_RGMII_TX_CLK_DELAY_SHIFT 4
0111 #define DP83867_RGMII_TX_CLK_DELAY_INV (DP83867_RGMII_TX_CLK_DELAY_MAX + 1)
0112 #define DP83867_RGMII_RX_CLK_DELAY_MAX 0xf
0113 #define DP83867_RGMII_RX_CLK_DELAY_SHIFT 0
0114 #define DP83867_RGMII_RX_CLK_DELAY_INV (DP83867_RGMII_RX_CLK_DELAY_MAX + 1)
0115
0116
0117 #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MASK 0x1f
0118 #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MAX 0x0
0119 #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN 0x1f
0120 #define DP83867_IO_MUX_CFG_CLK_O_DISABLE BIT(6)
0121 #define DP83867_IO_MUX_CFG_CLK_O_SEL_MASK (0x1f << 8)
0122 #define DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT 8
0123
0124
0125 #define DP83867_PHYSTS_1000 BIT(15)
0126 #define DP83867_PHYSTS_100 BIT(14)
0127 #define DP83867_PHYSTS_DUPLEX BIT(13)
0128 #define DP83867_PHYSTS_LINK BIT(10)
0129
0130
0131 #define DP83867_DOWNSHIFT_EN (BIT(8) | BIT(9))
0132 #define DP83867_DOWNSHIFT_ATTEMPT_MASK (BIT(10) | BIT(11))
0133 #define DP83867_DOWNSHIFT_1_COUNT_VAL 0
0134 #define DP83867_DOWNSHIFT_2_COUNT_VAL 1
0135 #define DP83867_DOWNSHIFT_4_COUNT_VAL 2
0136 #define DP83867_DOWNSHIFT_8_COUNT_VAL 3
0137 #define DP83867_DOWNSHIFT_1_COUNT 1
0138 #define DP83867_DOWNSHIFT_2_COUNT 2
0139 #define DP83867_DOWNSHIFT_4_COUNT 4
0140 #define DP83867_DOWNSHIFT_8_COUNT 8
0141 #define DP83867_SGMII_AUTONEG_EN BIT(7)
0142
0143
0144 #define DP83867_CFG3_INT_OE BIT(7)
0145 #define DP83867_CFG3_ROBUST_AUTO_MDIX BIT(9)
0146
0147
0148 #define DP83867_CFG4_PORT_MIRROR_EN BIT(0)
0149
0150
0151 #define DP83867_FLD_THR_CFG_ENERGY_LOST_THR_MASK 0x7
0152
0153 enum {
0154 DP83867_PORT_MIRROING_KEEP,
0155 DP83867_PORT_MIRROING_EN,
0156 DP83867_PORT_MIRROING_DIS,
0157 };
0158
0159 struct dp83867_private {
0160 u32 rx_id_delay;
0161 u32 tx_id_delay;
0162 u32 tx_fifo_depth;
0163 u32 rx_fifo_depth;
0164 int io_impedance;
0165 int port_mirroring;
0166 bool rxctrl_strap_quirk;
0167 bool set_clk_output;
0168 u32 clk_output_sel;
0169 bool sgmii_ref_clk_en;
0170 };
0171
0172 static int dp83867_ack_interrupt(struct phy_device *phydev)
0173 {
0174 int err = phy_read(phydev, MII_DP83867_ISR);
0175
0176 if (err < 0)
0177 return err;
0178
0179 return 0;
0180 }
0181
0182 static int dp83867_set_wol(struct phy_device *phydev,
0183 struct ethtool_wolinfo *wol)
0184 {
0185 struct net_device *ndev = phydev->attached_dev;
0186 u16 val_rxcfg, val_micr;
0187 const u8 *mac;
0188
0189 val_rxcfg = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG);
0190 val_micr = phy_read(phydev, MII_DP83867_MICR);
0191
0192 if (wol->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_UCAST |
0193 WAKE_BCAST)) {
0194 val_rxcfg |= DP83867_WOL_ENH_MAC;
0195 val_micr |= MII_DP83867_MICR_WOL_INT_EN;
0196
0197 if (wol->wolopts & WAKE_MAGIC) {
0198 mac = (const u8 *)ndev->dev_addr;
0199
0200 if (!is_valid_ether_addr(mac))
0201 return -EINVAL;
0202
0203 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD1,
0204 (mac[1] << 8 | mac[0]));
0205 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD2,
0206 (mac[3] << 8 | mac[2]));
0207 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD3,
0208 (mac[5] << 8 | mac[4]));
0209
0210 val_rxcfg |= DP83867_WOL_MAGIC_EN;
0211 } else {
0212 val_rxcfg &= ~DP83867_WOL_MAGIC_EN;
0213 }
0214
0215 if (wol->wolopts & WAKE_MAGICSECURE) {
0216 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP1,
0217 (wol->sopass[1] << 8) | wol->sopass[0]);
0218 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP2,
0219 (wol->sopass[3] << 8) | wol->sopass[2]);
0220 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP3,
0221 (wol->sopass[5] << 8) | wol->sopass[4]);
0222
0223 val_rxcfg |= DP83867_WOL_SEC_EN;
0224 } else {
0225 val_rxcfg &= ~DP83867_WOL_SEC_EN;
0226 }
0227
0228 if (wol->wolopts & WAKE_UCAST)
0229 val_rxcfg |= DP83867_WOL_UCAST_EN;
0230 else
0231 val_rxcfg &= ~DP83867_WOL_UCAST_EN;
0232
0233 if (wol->wolopts & WAKE_BCAST)
0234 val_rxcfg |= DP83867_WOL_BCAST_EN;
0235 else
0236 val_rxcfg &= ~DP83867_WOL_BCAST_EN;
0237 } else {
0238 val_rxcfg &= ~DP83867_WOL_ENH_MAC;
0239 val_micr &= ~MII_DP83867_MICR_WOL_INT_EN;
0240 }
0241
0242 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG, val_rxcfg);
0243 phy_write(phydev, MII_DP83867_MICR, val_micr);
0244
0245 return 0;
0246 }
0247
0248 static void dp83867_get_wol(struct phy_device *phydev,
0249 struct ethtool_wolinfo *wol)
0250 {
0251 u16 value, sopass_val;
0252
0253 wol->supported = (WAKE_UCAST | WAKE_BCAST | WAKE_MAGIC |
0254 WAKE_MAGICSECURE);
0255 wol->wolopts = 0;
0256
0257 value = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG);
0258
0259 if (value & DP83867_WOL_UCAST_EN)
0260 wol->wolopts |= WAKE_UCAST;
0261
0262 if (value & DP83867_WOL_BCAST_EN)
0263 wol->wolopts |= WAKE_BCAST;
0264
0265 if (value & DP83867_WOL_MAGIC_EN)
0266 wol->wolopts |= WAKE_MAGIC;
0267
0268 if (value & DP83867_WOL_SEC_EN) {
0269 sopass_val = phy_read_mmd(phydev, DP83867_DEVADDR,
0270 DP83867_RXFSOP1);
0271 wol->sopass[0] = (sopass_val & 0xff);
0272 wol->sopass[1] = (sopass_val >> 8);
0273
0274 sopass_val = phy_read_mmd(phydev, DP83867_DEVADDR,
0275 DP83867_RXFSOP2);
0276 wol->sopass[2] = (sopass_val & 0xff);
0277 wol->sopass[3] = (sopass_val >> 8);
0278
0279 sopass_val = phy_read_mmd(phydev, DP83867_DEVADDR,
0280 DP83867_RXFSOP3);
0281 wol->sopass[4] = (sopass_val & 0xff);
0282 wol->sopass[5] = (sopass_val >> 8);
0283
0284 wol->wolopts |= WAKE_MAGICSECURE;
0285 }
0286
0287 if (!(value & DP83867_WOL_ENH_MAC))
0288 wol->wolopts = 0;
0289 }
0290
0291 static int dp83867_config_intr(struct phy_device *phydev)
0292 {
0293 int micr_status, err;
0294
0295 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
0296 err = dp83867_ack_interrupt(phydev);
0297 if (err)
0298 return err;
0299
0300 micr_status = phy_read(phydev, MII_DP83867_MICR);
0301 if (micr_status < 0)
0302 return micr_status;
0303
0304 micr_status |=
0305 (MII_DP83867_MICR_AN_ERR_INT_EN |
0306 MII_DP83867_MICR_SPEED_CHNG_INT_EN |
0307 MII_DP83867_MICR_AUTONEG_COMP_INT_EN |
0308 MII_DP83867_MICR_LINK_STS_CHNG_INT_EN |
0309 MII_DP83867_MICR_DUP_MODE_CHNG_INT_EN |
0310 MII_DP83867_MICR_SLEEP_MODE_CHNG_INT_EN);
0311
0312 err = phy_write(phydev, MII_DP83867_MICR, micr_status);
0313 } else {
0314 micr_status = 0x0;
0315 err = phy_write(phydev, MII_DP83867_MICR, micr_status);
0316 if (err)
0317 return err;
0318
0319 err = dp83867_ack_interrupt(phydev);
0320 }
0321
0322 return err;
0323 }
0324
0325 static irqreturn_t dp83867_handle_interrupt(struct phy_device *phydev)
0326 {
0327 int irq_status, irq_enabled;
0328
0329 irq_status = phy_read(phydev, MII_DP83867_ISR);
0330 if (irq_status < 0) {
0331 phy_error(phydev);
0332 return IRQ_NONE;
0333 }
0334
0335 irq_enabled = phy_read(phydev, MII_DP83867_MICR);
0336 if (irq_enabled < 0) {
0337 phy_error(phydev);
0338 return IRQ_NONE;
0339 }
0340
0341 if (!(irq_status & irq_enabled))
0342 return IRQ_NONE;
0343
0344 phy_trigger_machine(phydev);
0345
0346 return IRQ_HANDLED;
0347 }
0348
0349 static int dp83867_read_status(struct phy_device *phydev)
0350 {
0351 int status = phy_read(phydev, MII_DP83867_PHYSTS);
0352 int ret;
0353
0354 ret = genphy_read_status(phydev);
0355 if (ret)
0356 return ret;
0357
0358 if (status < 0)
0359 return status;
0360
0361 if (status & DP83867_PHYSTS_DUPLEX)
0362 phydev->duplex = DUPLEX_FULL;
0363 else
0364 phydev->duplex = DUPLEX_HALF;
0365
0366 if (status & DP83867_PHYSTS_1000)
0367 phydev->speed = SPEED_1000;
0368 else if (status & DP83867_PHYSTS_100)
0369 phydev->speed = SPEED_100;
0370 else
0371 phydev->speed = SPEED_10;
0372
0373 return 0;
0374 }
0375
0376 static int dp83867_get_downshift(struct phy_device *phydev, u8 *data)
0377 {
0378 int val, cnt, enable, count;
0379
0380 val = phy_read(phydev, DP83867_CFG2);
0381 if (val < 0)
0382 return val;
0383
0384 enable = FIELD_GET(DP83867_DOWNSHIFT_EN, val);
0385 cnt = FIELD_GET(DP83867_DOWNSHIFT_ATTEMPT_MASK, val);
0386
0387 switch (cnt) {
0388 case DP83867_DOWNSHIFT_1_COUNT_VAL:
0389 count = DP83867_DOWNSHIFT_1_COUNT;
0390 break;
0391 case DP83867_DOWNSHIFT_2_COUNT_VAL:
0392 count = DP83867_DOWNSHIFT_2_COUNT;
0393 break;
0394 case DP83867_DOWNSHIFT_4_COUNT_VAL:
0395 count = DP83867_DOWNSHIFT_4_COUNT;
0396 break;
0397 case DP83867_DOWNSHIFT_8_COUNT_VAL:
0398 count = DP83867_DOWNSHIFT_8_COUNT;
0399 break;
0400 default:
0401 return -EINVAL;
0402 }
0403
0404 *data = enable ? count : DOWNSHIFT_DEV_DISABLE;
0405
0406 return 0;
0407 }
0408
0409 static int dp83867_set_downshift(struct phy_device *phydev, u8 cnt)
0410 {
0411 int val, count;
0412
0413 if (cnt > DP83867_DOWNSHIFT_8_COUNT)
0414 return -E2BIG;
0415
0416 if (!cnt)
0417 return phy_clear_bits(phydev, DP83867_CFG2,
0418 DP83867_DOWNSHIFT_EN);
0419
0420 switch (cnt) {
0421 case DP83867_DOWNSHIFT_1_COUNT:
0422 count = DP83867_DOWNSHIFT_1_COUNT_VAL;
0423 break;
0424 case DP83867_DOWNSHIFT_2_COUNT:
0425 count = DP83867_DOWNSHIFT_2_COUNT_VAL;
0426 break;
0427 case DP83867_DOWNSHIFT_4_COUNT:
0428 count = DP83867_DOWNSHIFT_4_COUNT_VAL;
0429 break;
0430 case DP83867_DOWNSHIFT_8_COUNT:
0431 count = DP83867_DOWNSHIFT_8_COUNT_VAL;
0432 break;
0433 default:
0434 phydev_err(phydev,
0435 "Downshift count must be 1, 2, 4 or 8\n");
0436 return -EINVAL;
0437 }
0438
0439 val = DP83867_DOWNSHIFT_EN;
0440 val |= FIELD_PREP(DP83867_DOWNSHIFT_ATTEMPT_MASK, count);
0441
0442 return phy_modify(phydev, DP83867_CFG2,
0443 DP83867_DOWNSHIFT_EN | DP83867_DOWNSHIFT_ATTEMPT_MASK,
0444 val);
0445 }
0446
0447 static int dp83867_get_tunable(struct phy_device *phydev,
0448 struct ethtool_tunable *tuna, void *data)
0449 {
0450 switch (tuna->id) {
0451 case ETHTOOL_PHY_DOWNSHIFT:
0452 return dp83867_get_downshift(phydev, data);
0453 default:
0454 return -EOPNOTSUPP;
0455 }
0456 }
0457
0458 static int dp83867_set_tunable(struct phy_device *phydev,
0459 struct ethtool_tunable *tuna, const void *data)
0460 {
0461 switch (tuna->id) {
0462 case ETHTOOL_PHY_DOWNSHIFT:
0463 return dp83867_set_downshift(phydev, *(const u8 *)data);
0464 default:
0465 return -EOPNOTSUPP;
0466 }
0467 }
0468
0469 static int dp83867_config_port_mirroring(struct phy_device *phydev)
0470 {
0471 struct dp83867_private *dp83867 =
0472 (struct dp83867_private *)phydev->priv;
0473
0474 if (dp83867->port_mirroring == DP83867_PORT_MIRROING_EN)
0475 phy_set_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
0476 DP83867_CFG4_PORT_MIRROR_EN);
0477 else
0478 phy_clear_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
0479 DP83867_CFG4_PORT_MIRROR_EN);
0480 return 0;
0481 }
0482
0483 static int dp83867_verify_rgmii_cfg(struct phy_device *phydev)
0484 {
0485 struct dp83867_private *dp83867 = phydev->priv;
0486
0487
0488
0489
0490 if (phydev->interface == PHY_INTERFACE_MODE_RGMII) {
0491 const u16 val = phy_read_mmd(phydev, DP83867_DEVADDR,
0492 DP83867_STRAP_STS2);
0493 const u16 txskew = (val & DP83867_STRAP_STS2_CLK_SKEW_TX_MASK) >>
0494 DP83867_STRAP_STS2_CLK_SKEW_TX_SHIFT;
0495 const u16 rxskew = (val & DP83867_STRAP_STS2_CLK_SKEW_RX_MASK) >>
0496 DP83867_STRAP_STS2_CLK_SKEW_RX_SHIFT;
0497
0498 if (txskew != DP83867_STRAP_STS2_CLK_SKEW_NONE ||
0499 rxskew != DP83867_STRAP_STS2_CLK_SKEW_NONE)
0500 phydev_warn(phydev,
0501 "PHY has delays via pin strapping, but phy-mode = 'rgmii'\n"
0502 "Should be 'rgmii-id' to use internal delays txskew:%x rxskew:%x\n",
0503 txskew, rxskew);
0504 }
0505
0506
0507 if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
0508 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) &&
0509 dp83867->rx_id_delay == DP83867_RGMII_RX_CLK_DELAY_INV) {
0510 phydev_err(phydev, "ti,rx-internal-delay must be specified\n");
0511 return -EINVAL;
0512 }
0513
0514
0515 if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
0516 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) &&
0517 dp83867->tx_id_delay == DP83867_RGMII_TX_CLK_DELAY_INV) {
0518 phydev_err(phydev, "ti,tx-internal-delay must be specified\n");
0519 return -EINVAL;
0520 }
0521
0522 return 0;
0523 }
0524
0525 #if IS_ENABLED(CONFIG_OF_MDIO)
0526 static int dp83867_of_init_io_impedance(struct phy_device *phydev)
0527 {
0528 struct dp83867_private *dp83867 = phydev->priv;
0529 struct device *dev = &phydev->mdio.dev;
0530 struct device_node *of_node = dev->of_node;
0531 struct nvmem_cell *cell;
0532 u8 *buf, val;
0533 int ret;
0534
0535 cell = of_nvmem_cell_get(of_node, "io_impedance_ctrl");
0536 if (IS_ERR(cell)) {
0537 ret = PTR_ERR(cell);
0538 if (ret != -ENOENT && ret != -EOPNOTSUPP)
0539 return phydev_err_probe(phydev, ret,
0540 "failed to get nvmem cell io_impedance_ctrl\n");
0541
0542
0543 if (of_property_read_bool(of_node, "ti,max-output-impedance"))
0544 dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MAX;
0545 else if (of_property_read_bool(of_node, "ti,min-output-impedance"))
0546 dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN;
0547 else
0548 dp83867->io_impedance = -1;
0549
0550 return 0;
0551 }
0552
0553 buf = nvmem_cell_read(cell, NULL);
0554 nvmem_cell_put(cell);
0555
0556 if (IS_ERR(buf))
0557 return PTR_ERR(buf);
0558
0559 val = *buf;
0560 kfree(buf);
0561
0562 if ((val & DP83867_IO_MUX_CFG_IO_IMPEDANCE_MASK) != val) {
0563 phydev_err(phydev, "nvmem cell 'io_impedance_ctrl' contents out of range\n");
0564 return -ERANGE;
0565 }
0566 dp83867->io_impedance = val;
0567
0568 return 0;
0569 }
0570
0571 static int dp83867_of_init(struct phy_device *phydev)
0572 {
0573 struct dp83867_private *dp83867 = phydev->priv;
0574 struct device *dev = &phydev->mdio.dev;
0575 struct device_node *of_node = dev->of_node;
0576 int ret;
0577
0578 if (!of_node)
0579 return -ENODEV;
0580
0581
0582 ret = of_property_read_u32(of_node, "ti,clk-output-sel",
0583 &dp83867->clk_output_sel);
0584
0585 if (!ret) {
0586 dp83867->set_clk_output = true;
0587
0588
0589
0590 if (dp83867->clk_output_sel > DP83867_CLK_O_SEL_REF_CLK &&
0591 dp83867->clk_output_sel != DP83867_CLK_O_SEL_OFF) {
0592 phydev_err(phydev, "ti,clk-output-sel value %u out of range\n",
0593 dp83867->clk_output_sel);
0594 return -EINVAL;
0595 }
0596 }
0597
0598 ret = dp83867_of_init_io_impedance(phydev);
0599 if (ret)
0600 return ret;
0601
0602 dp83867->rxctrl_strap_quirk = of_property_read_bool(of_node,
0603 "ti,dp83867-rxctrl-strap-quirk");
0604
0605 dp83867->sgmii_ref_clk_en = of_property_read_bool(of_node,
0606 "ti,sgmii-ref-clock-output-enable");
0607
0608 dp83867->rx_id_delay = DP83867_RGMII_RX_CLK_DELAY_INV;
0609 ret = of_property_read_u32(of_node, "ti,rx-internal-delay",
0610 &dp83867->rx_id_delay);
0611 if (!ret && dp83867->rx_id_delay > DP83867_RGMII_RX_CLK_DELAY_MAX) {
0612 phydev_err(phydev,
0613 "ti,rx-internal-delay value of %u out of range\n",
0614 dp83867->rx_id_delay);
0615 return -EINVAL;
0616 }
0617
0618 dp83867->tx_id_delay = DP83867_RGMII_TX_CLK_DELAY_INV;
0619 ret = of_property_read_u32(of_node, "ti,tx-internal-delay",
0620 &dp83867->tx_id_delay);
0621 if (!ret && dp83867->tx_id_delay > DP83867_RGMII_TX_CLK_DELAY_MAX) {
0622 phydev_err(phydev,
0623 "ti,tx-internal-delay value of %u out of range\n",
0624 dp83867->tx_id_delay);
0625 return -EINVAL;
0626 }
0627
0628 if (of_property_read_bool(of_node, "enet-phy-lane-swap"))
0629 dp83867->port_mirroring = DP83867_PORT_MIRROING_EN;
0630
0631 if (of_property_read_bool(of_node, "enet-phy-lane-no-swap"))
0632 dp83867->port_mirroring = DP83867_PORT_MIRROING_DIS;
0633
0634 ret = of_property_read_u32(of_node, "ti,fifo-depth",
0635 &dp83867->tx_fifo_depth);
0636 if (ret) {
0637 ret = of_property_read_u32(of_node, "tx-fifo-depth",
0638 &dp83867->tx_fifo_depth);
0639 if (ret)
0640 dp83867->tx_fifo_depth =
0641 DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
0642 }
0643
0644 if (dp83867->tx_fifo_depth > DP83867_PHYCR_FIFO_DEPTH_MAX) {
0645 phydev_err(phydev, "tx-fifo-depth value %u out of range\n",
0646 dp83867->tx_fifo_depth);
0647 return -EINVAL;
0648 }
0649
0650 ret = of_property_read_u32(of_node, "rx-fifo-depth",
0651 &dp83867->rx_fifo_depth);
0652 if (ret)
0653 dp83867->rx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
0654
0655 if (dp83867->rx_fifo_depth > DP83867_PHYCR_FIFO_DEPTH_MAX) {
0656 phydev_err(phydev, "rx-fifo-depth value %u out of range\n",
0657 dp83867->rx_fifo_depth);
0658 return -EINVAL;
0659 }
0660
0661 return 0;
0662 }
0663 #else
0664 static int dp83867_of_init(struct phy_device *phydev)
0665 {
0666 struct dp83867_private *dp83867 = phydev->priv;
0667 u16 delay;
0668
0669
0670
0671
0672
0673
0674 delay = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIIDCTL);
0675 dp83867->rx_id_delay = delay & DP83867_RGMII_RX_CLK_DELAY_MAX;
0676 dp83867->tx_id_delay = (delay >> DP83867_RGMII_TX_CLK_DELAY_SHIFT) &
0677 DP83867_RGMII_TX_CLK_DELAY_MAX;
0678
0679
0680
0681
0682
0683 dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN / 2;
0684
0685 return 0;
0686 }
0687 #endif
0688
0689 static int dp83867_probe(struct phy_device *phydev)
0690 {
0691 struct dp83867_private *dp83867;
0692
0693 dp83867 = devm_kzalloc(&phydev->mdio.dev, sizeof(*dp83867),
0694 GFP_KERNEL);
0695 if (!dp83867)
0696 return -ENOMEM;
0697
0698 phydev->priv = dp83867;
0699
0700 return dp83867_of_init(phydev);
0701 }
0702
0703 static int dp83867_config_init(struct phy_device *phydev)
0704 {
0705 struct dp83867_private *dp83867 = phydev->priv;
0706 int ret, val, bs;
0707 u16 delay;
0708
0709
0710 ret = phy_modify(phydev, DP83867_CFG2, DP83867_DOWNSHIFT_EN,
0711 DP83867_DOWNSHIFT_EN);
0712 if (ret)
0713 return ret;
0714
0715 ret = dp83867_verify_rgmii_cfg(phydev);
0716 if (ret)
0717 return ret;
0718
0719
0720 if (dp83867->rxctrl_strap_quirk)
0721 phy_clear_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
0722 BIT(7));
0723
0724 bs = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_STRAP_STS2);
0725 if (bs & DP83867_STRAP_STS2_STRAP_FLD) {
0726
0727
0728
0729
0730 ret = phy_modify_mmd(phydev, DP83867_DEVADDR,
0731 DP83867_FLD_THR_CFG,
0732 DP83867_FLD_THR_CFG_ENERGY_LOST_THR_MASK,
0733 0x1);
0734 if (ret)
0735 return ret;
0736 }
0737
0738 if (phy_interface_is_rgmii(phydev) ||
0739 phydev->interface == PHY_INTERFACE_MODE_SGMII) {
0740 val = phy_read(phydev, MII_DP83867_PHYCTRL);
0741 if (val < 0)
0742 return val;
0743
0744 val &= ~DP83867_PHYCR_TX_FIFO_DEPTH_MASK;
0745 val |= (dp83867->tx_fifo_depth <<
0746 DP83867_PHYCR_TX_FIFO_DEPTH_SHIFT);
0747
0748 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
0749 val &= ~DP83867_PHYCR_RX_FIFO_DEPTH_MASK;
0750 val |= (dp83867->rx_fifo_depth <<
0751 DP83867_PHYCR_RX_FIFO_DEPTH_SHIFT);
0752 }
0753
0754 ret = phy_write(phydev, MII_DP83867_PHYCTRL, val);
0755 if (ret)
0756 return ret;
0757 }
0758
0759 if (phy_interface_is_rgmii(phydev)) {
0760 val = phy_read(phydev, MII_DP83867_PHYCTRL);
0761 if (val < 0)
0762 return val;
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774 bs = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_STRAP_STS1);
0775 if (bs & DP83867_STRAP_STS1_RESERVED)
0776 val &= ~DP83867_PHYCR_RESERVED_MASK;
0777
0778 ret = phy_write(phydev, MII_DP83867_PHYCTRL, val);
0779 if (ret)
0780 return ret;
0781
0782
0783
0784
0785
0786
0787
0788
0789 val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIICTL);
0790
0791 val &= ~(DP83867_RGMII_TX_CLK_DELAY_EN | DP83867_RGMII_RX_CLK_DELAY_EN);
0792 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
0793 val |= (DP83867_RGMII_TX_CLK_DELAY_EN | DP83867_RGMII_RX_CLK_DELAY_EN);
0794
0795 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
0796 val |= DP83867_RGMII_TX_CLK_DELAY_EN;
0797
0798 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
0799 val |= DP83867_RGMII_RX_CLK_DELAY_EN;
0800
0801 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIICTL, val);
0802
0803 delay = 0;
0804 if (dp83867->rx_id_delay != DP83867_RGMII_RX_CLK_DELAY_INV)
0805 delay |= dp83867->rx_id_delay;
0806 if (dp83867->tx_id_delay != DP83867_RGMII_TX_CLK_DELAY_INV)
0807 delay |= dp83867->tx_id_delay <<
0808 DP83867_RGMII_TX_CLK_DELAY_SHIFT;
0809
0810 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIIDCTL,
0811 delay);
0812 }
0813
0814
0815 if (dp83867->io_impedance >= 0)
0816 phy_modify_mmd(phydev, DP83867_DEVADDR, DP83867_IO_MUX_CFG,
0817 DP83867_IO_MUX_CFG_IO_IMPEDANCE_MASK,
0818 dp83867->io_impedance);
0819
0820 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
0821
0822
0823
0824
0825
0826
0827 ret = phy_modify_mmd(phydev, DP83867_DEVADDR,
0828 DP83867_10M_SGMII_CFG,
0829 DP83867_10M_SGMII_RATE_ADAPT_MASK,
0830 0);
0831 if (ret)
0832 return ret;
0833
0834
0835
0836
0837
0838 ret = phy_modify_mmd(phydev, DP83867_DEVADDR,
0839 DP83867_CFG4,
0840 DP83867_CFG4_SGMII_ANEG_MASK,
0841 DP83867_CFG4_SGMII_ANEG_TIMER_16MS);
0842
0843 if (ret)
0844 return ret;
0845
0846 val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_SGMIICTL);
0847
0848
0849
0850
0851 if (dp83867->sgmii_ref_clk_en)
0852 val |= DP83867_SGMII_TYPE;
0853 else
0854 val &= ~DP83867_SGMII_TYPE;
0855 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_SGMIICTL, val);
0856 }
0857
0858 val = phy_read(phydev, DP83867_CFG3);
0859
0860 if (phy_interrupt_is_valid(phydev))
0861 val |= DP83867_CFG3_INT_OE;
0862
0863 val |= DP83867_CFG3_ROBUST_AUTO_MDIX;
0864 phy_write(phydev, DP83867_CFG3, val);
0865
0866 if (dp83867->port_mirroring != DP83867_PORT_MIRROING_KEEP)
0867 dp83867_config_port_mirroring(phydev);
0868
0869
0870 if (dp83867->set_clk_output) {
0871 u16 mask = DP83867_IO_MUX_CFG_CLK_O_DISABLE;
0872
0873 if (dp83867->clk_output_sel == DP83867_CLK_O_SEL_OFF) {
0874 val = DP83867_IO_MUX_CFG_CLK_O_DISABLE;
0875 } else {
0876 mask |= DP83867_IO_MUX_CFG_CLK_O_SEL_MASK;
0877 val = dp83867->clk_output_sel <<
0878 DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT;
0879 }
0880
0881 phy_modify_mmd(phydev, DP83867_DEVADDR, DP83867_IO_MUX_CFG,
0882 mask, val);
0883 }
0884
0885 return 0;
0886 }
0887
0888 static int dp83867_phy_reset(struct phy_device *phydev)
0889 {
0890 int err;
0891
0892 err = phy_write(phydev, DP83867_CTRL, DP83867_SW_RESTART);
0893 if (err < 0)
0894 return err;
0895
0896 usleep_range(10, 20);
0897
0898 return phy_modify(phydev, MII_DP83867_PHYCTRL,
0899 DP83867_PHYCR_FORCE_LINK_GOOD, 0);
0900 }
0901
0902 static void dp83867_link_change_notify(struct phy_device *phydev)
0903 {
0904
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
0916 int val = 0;
0917
0918 val = phy_clear_bits(phydev, DP83867_CFG2,
0919 DP83867_SGMII_AUTONEG_EN);
0920 if (val < 0)
0921 return;
0922
0923 phy_set_bits(phydev, DP83867_CFG2,
0924 DP83867_SGMII_AUTONEG_EN);
0925 }
0926 }
0927
0928 static struct phy_driver dp83867_driver[] = {
0929 {
0930 .phy_id = DP83867_PHY_ID,
0931 .phy_id_mask = 0xfffffff0,
0932 .name = "TI DP83867",
0933
0934
0935 .probe = dp83867_probe,
0936 .config_init = dp83867_config_init,
0937 .soft_reset = dp83867_phy_reset,
0938
0939 .read_status = dp83867_read_status,
0940 .get_tunable = dp83867_get_tunable,
0941 .set_tunable = dp83867_set_tunable,
0942
0943 .get_wol = dp83867_get_wol,
0944 .set_wol = dp83867_set_wol,
0945
0946
0947 .config_intr = dp83867_config_intr,
0948 .handle_interrupt = dp83867_handle_interrupt,
0949
0950 .suspend = genphy_suspend,
0951 .resume = genphy_resume,
0952
0953 .link_change_notify = dp83867_link_change_notify,
0954 },
0955 };
0956 module_phy_driver(dp83867_driver);
0957
0958 static struct mdio_device_id __maybe_unused dp83867_tbl[] = {
0959 { DP83867_PHY_ID, 0xfffffff0 },
0960 { }
0961 };
0962
0963 MODULE_DEVICE_TABLE(mdio, dp83867_tbl);
0964
0965 MODULE_DESCRIPTION("Texas Instruments DP83867 PHY driver");
0966 MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com");
0967 MODULE_LICENSE("GPL v2");