dp83867.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Driver for the Texas Instruments DP83867 PHY
  3. *
  4. * Copyright (C) 2015 Texas Instruments Inc.
  5. */
  6. #include <linux/ethtool.h>
  7. #include <linux/kernel.h>
  8. #include <linux/mii.h>
  9. #include <linux/module.h>
  10. #include <linux/of.h>
  11. #include <linux/phy.h>
  12. #include <linux/delay.h>
  13. #include <linux/netdevice.h>
  14. #include <linux/etherdevice.h>
  15. #include <linux/bitfield.h>
  16. #include <linux/nvmem-consumer.h>
  17. #include <dt-bindings/net/ti-dp83867.h>
  18. #define DP83867_PHY_ID 0x2000a231
  19. #define DP83867_DEVADDR 0x1f
  20. #define MII_DP83867_PHYCTRL 0x10
  21. #define MII_DP83867_PHYSTS 0x11
  22. #define MII_DP83867_MICR 0x12
  23. #define MII_DP83867_ISR 0x13
  24. #define DP83867_CFG2 0x14
  25. #define DP83867_LEDCR1 0x18
  26. #define DP83867_LEDCR2 0x19
  27. #define DP83867_CFG3 0x1e
  28. #define DP83867_CTRL 0x1f
  29. /* Extended Registers */
  30. #define DP83867_FLD_THR_CFG 0x002e
  31. #define DP83867_CFG4 0x0031
  32. #define DP83867_CFG4_SGMII_ANEG_MASK (BIT(5) | BIT(6))
  33. #define DP83867_CFG4_SGMII_ANEG_TIMER_11MS (3 << 5)
  34. #define DP83867_CFG4_SGMII_ANEG_TIMER_800US (2 << 5)
  35. #define DP83867_CFG4_SGMII_ANEG_TIMER_2US (1 << 5)
  36. #define DP83867_CFG4_SGMII_ANEG_TIMER_16MS (0 << 5)
  37. #define DP83867_RGMIICTL 0x0032
  38. #define DP83867_STRAP_STS1 0x006E
  39. #define DP83867_STRAP_STS2 0x006f
  40. #define DP83867_RGMIIDCTL 0x0086
  41. #define DP83867_DSP_FFE_CFG 0x012c
  42. #define DP83867_RXFCFG 0x0134
  43. #define DP83867_RXFPMD1 0x0136
  44. #define DP83867_RXFPMD2 0x0137
  45. #define DP83867_RXFPMD3 0x0138
  46. #define DP83867_RXFSOP1 0x0139
  47. #define DP83867_RXFSOP2 0x013A
  48. #define DP83867_RXFSOP3 0x013B
  49. #define DP83867_IO_MUX_CFG 0x0170
  50. #define DP83867_SGMIICTL 0x00D3
  51. #define DP83867_10M_SGMII_CFG 0x016F
  52. #define DP83867_10M_SGMII_RATE_ADAPT_MASK BIT(7)
  53. #define DP83867_SW_RESET BIT(15)
  54. #define DP83867_SW_RESTART BIT(14)
  55. /* MICR Interrupt bits */
  56. #define MII_DP83867_MICR_AN_ERR_INT_EN BIT(15)
  57. #define MII_DP83867_MICR_SPEED_CHNG_INT_EN BIT(14)
  58. #define MII_DP83867_MICR_DUP_MODE_CHNG_INT_EN BIT(13)
  59. #define MII_DP83867_MICR_PAGE_RXD_INT_EN BIT(12)
  60. #define MII_DP83867_MICR_AUTONEG_COMP_INT_EN BIT(11)
  61. #define MII_DP83867_MICR_LINK_STS_CHNG_INT_EN BIT(10)
  62. #define MII_DP83867_MICR_FALSE_CARRIER_INT_EN BIT(8)
  63. #define MII_DP83867_MICR_SLEEP_MODE_CHNG_INT_EN BIT(4)
  64. #define MII_DP83867_MICR_WOL_INT_EN BIT(3)
  65. #define MII_DP83867_MICR_XGMII_ERR_INT_EN BIT(2)
  66. #define MII_DP83867_MICR_POL_CHNG_INT_EN BIT(1)
  67. #define MII_DP83867_MICR_JABBER_INT_EN BIT(0)
  68. /* RGMIICTL bits */
  69. #define DP83867_RGMII_EN BIT(7)
  70. #define DP83867_RGMII_TX_CLK_DELAY_EN BIT(1)
  71. #define DP83867_RGMII_RX_CLK_DELAY_EN BIT(0)
  72. /* SGMIICTL bits */
  73. #define DP83867_SGMII_TYPE BIT(14)
  74. /* RXFCFG bits*/
  75. #define DP83867_WOL_MAGIC_EN BIT(0)
  76. #define DP83867_WOL_BCAST_EN BIT(2)
  77. #define DP83867_WOL_UCAST_EN BIT(4)
  78. #define DP83867_WOL_SEC_EN BIT(5)
  79. #define DP83867_WOL_ENH_MAC BIT(7)
  80. /* STRAP_STS1 bits */
  81. #define DP83867_STRAP_STS1_RESERVED BIT(11)
  82. /* STRAP_STS2 bits */
  83. #define DP83867_STRAP_STS2_STRAP_FLD BIT(10)
  84. /* PHY CTRL bits */
  85. #define DP83867_PHYCR_TX_FIFO_DEPTH_SHIFT 14
  86. #define DP83867_PHYCR_RX_FIFO_DEPTH_SHIFT 12
  87. #define DP83867_PHYCR_FIFO_DEPTH_MAX 0x03
  88. #define DP83867_PHYCR_TX_FIFO_DEPTH_MASK GENMASK(15, 14)
  89. #define DP83867_PHYCR_RX_FIFO_DEPTH_MASK GENMASK(13, 12)
  90. #define DP83867_PHYCR_SGMII_EN BIT(11)
  91. #define DP83867_PHYCR_FORCE_LINK_GOOD BIT(10)
  92. /* RGMIIDCTL bits */
  93. #define DP83867_RGMII_TX_CLK_DELAY_MAX 0xf
  94. #define DP83867_RGMII_TX_CLK_DELAY_SHIFT 4
  95. #define DP83867_RGMII_RX_CLK_DELAY_MAX 0xf
  96. #define DP83867_RGMII_RX_CLK_DELAY_SHIFT 0
  97. /* IO_MUX_CFG bits */
  98. #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MASK 0x1f
  99. #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MAX 0x0
  100. #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN 0x1f
  101. #define DP83867_IO_MUX_CFG_CLK_O_DISABLE BIT(6)
  102. #define DP83867_IO_MUX_CFG_CLK_O_SEL_MASK (0x1f << 8)
  103. #define DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT 8
  104. /* PHY STS bits */
  105. #define DP83867_PHYSTS_1000 BIT(15)
  106. #define DP83867_PHYSTS_100 BIT(14)
  107. #define DP83867_PHYSTS_DUPLEX BIT(13)
  108. #define DP83867_PHYSTS_LINK BIT(10)
  109. /* CFG2 bits */
  110. #define DP83867_DOWNSHIFT_EN (BIT(8) | BIT(9))
  111. #define DP83867_DOWNSHIFT_ATTEMPT_MASK (BIT(10) | BIT(11))
  112. #define DP83867_DOWNSHIFT_1_COUNT_VAL 0
  113. #define DP83867_DOWNSHIFT_2_COUNT_VAL 1
  114. #define DP83867_DOWNSHIFT_4_COUNT_VAL 2
  115. #define DP83867_DOWNSHIFT_8_COUNT_VAL 3
  116. #define DP83867_DOWNSHIFT_1_COUNT 1
  117. #define DP83867_DOWNSHIFT_2_COUNT 2
  118. #define DP83867_DOWNSHIFT_4_COUNT 4
  119. #define DP83867_DOWNSHIFT_8_COUNT 8
  120. #define DP83867_SGMII_AUTONEG_EN BIT(7)
  121. /* CFG3 bits */
  122. #define DP83867_CFG3_INT_OE BIT(7)
  123. #define DP83867_CFG3_ROBUST_AUTO_MDIX BIT(9)
  124. /* CFG4 bits */
  125. #define DP83867_CFG4_PORT_MIRROR_EN BIT(0)
  126. /* FLD_THR_CFG */
  127. #define DP83867_FLD_THR_CFG_ENERGY_LOST_THR_MASK 0x7
  128. #define DP83867_LED_COUNT 4
  129. /* LED_DRV bits */
  130. #define DP83867_LED_DRV_EN(x) BIT((x) * 4)
  131. #define DP83867_LED_DRV_VAL(x) BIT((x) * 4 + 1)
  132. #define DP83867_LED_POLARITY(x) BIT((x) * 4 + 2)
  133. #define DP83867_LED_FN(idx, val) (((val) & 0xf) << ((idx) * 4))
  134. #define DP83867_LED_FN_MASK(idx) (0xf << ((idx) * 4))
  135. #define DP83867_LED_FN_RX_ERR 0xe /* Receive Error */
  136. #define DP83867_LED_FN_RX_TX_ERR 0xd /* Receive Error or Transmit Error */
  137. #define DP83867_LED_FN_LINK_RX_TX 0xb /* Link established, blink for rx or tx activity */
  138. #define DP83867_LED_FN_FULL_DUPLEX 0xa /* Full duplex */
  139. #define DP83867_LED_FN_LINK_100_1000_BT 0x9 /* 100/1000BT link established */
  140. #define DP83867_LED_FN_LINK_10_100_BT 0x8 /* 10/100BT link established */
  141. #define DP83867_LED_FN_LINK_10_BT 0x7 /* 10BT link established */
  142. #define DP83867_LED_FN_LINK_100_BTX 0x6 /* 100 BTX link established */
  143. #define DP83867_LED_FN_LINK_1000_BT 0x5 /* 1000 BT link established */
  144. #define DP83867_LED_FN_COLLISION 0x4 /* Collision detected */
  145. #define DP83867_LED_FN_RX 0x3 /* Receive activity */
  146. #define DP83867_LED_FN_TX 0x2 /* Transmit activity */
  147. #define DP83867_LED_FN_RX_TX 0x1 /* Receive or Transmit activity */
  148. #define DP83867_LED_FN_LINK 0x0 /* Link established */
  149. enum {
  150. DP83867_PORT_MIRROING_KEEP,
  151. DP83867_PORT_MIRROING_EN,
  152. DP83867_PORT_MIRROING_DIS,
  153. };
  154. struct dp83867_private {
  155. u32 rx_id_delay;
  156. u32 tx_id_delay;
  157. u32 tx_fifo_depth;
  158. u32 rx_fifo_depth;
  159. int io_impedance;
  160. int port_mirroring;
  161. bool rxctrl_strap_quirk;
  162. bool set_clk_output;
  163. u32 clk_output_sel;
  164. bool sgmii_ref_clk_en;
  165. };
  166. static int dp83867_ack_interrupt(struct phy_device *phydev)
  167. {
  168. int err = phy_read(phydev, MII_DP83867_ISR);
  169. if (err < 0)
  170. return err;
  171. return 0;
  172. }
  173. static int dp83867_set_wol(struct phy_device *phydev,
  174. struct ethtool_wolinfo *wol)
  175. {
  176. struct net_device *ndev = phydev->attached_dev;
  177. u16 val_rxcfg, val_micr;
  178. const u8 *mac;
  179. val_rxcfg = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG);
  180. val_micr = phy_read(phydev, MII_DP83867_MICR);
  181. if (wol->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_UCAST |
  182. WAKE_BCAST)) {
  183. val_rxcfg |= DP83867_WOL_ENH_MAC;
  184. val_micr |= MII_DP83867_MICR_WOL_INT_EN;
  185. if (wol->wolopts & WAKE_MAGIC) {
  186. mac = (const u8 *)ndev->dev_addr;
  187. if (!is_valid_ether_addr(mac))
  188. return -EINVAL;
  189. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD1,
  190. (mac[1] << 8 | mac[0]));
  191. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD2,
  192. (mac[3] << 8 | mac[2]));
  193. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD3,
  194. (mac[5] << 8 | mac[4]));
  195. val_rxcfg |= DP83867_WOL_MAGIC_EN;
  196. } else {
  197. val_rxcfg &= ~DP83867_WOL_MAGIC_EN;
  198. }
  199. if (wol->wolopts & WAKE_MAGICSECURE) {
  200. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP1,
  201. (wol->sopass[1] << 8) | wol->sopass[0]);
  202. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP2,
  203. (wol->sopass[3] << 8) | wol->sopass[2]);
  204. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP3,
  205. (wol->sopass[5] << 8) | wol->sopass[4]);
  206. val_rxcfg |= DP83867_WOL_SEC_EN;
  207. } else {
  208. val_rxcfg &= ~DP83867_WOL_SEC_EN;
  209. }
  210. if (wol->wolopts & WAKE_UCAST)
  211. val_rxcfg |= DP83867_WOL_UCAST_EN;
  212. else
  213. val_rxcfg &= ~DP83867_WOL_UCAST_EN;
  214. if (wol->wolopts & WAKE_BCAST)
  215. val_rxcfg |= DP83867_WOL_BCAST_EN;
  216. else
  217. val_rxcfg &= ~DP83867_WOL_BCAST_EN;
  218. } else {
  219. val_rxcfg &= ~DP83867_WOL_ENH_MAC;
  220. val_micr &= ~MII_DP83867_MICR_WOL_INT_EN;
  221. }
  222. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG, val_rxcfg);
  223. phy_write(phydev, MII_DP83867_MICR, val_micr);
  224. return 0;
  225. }
  226. static void dp83867_get_wol(struct phy_device *phydev,
  227. struct ethtool_wolinfo *wol)
  228. {
  229. u16 value, sopass_val;
  230. wol->supported = (WAKE_UCAST | WAKE_BCAST | WAKE_MAGIC |
  231. WAKE_MAGICSECURE);
  232. wol->wolopts = 0;
  233. value = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG);
  234. if (value & DP83867_WOL_UCAST_EN)
  235. wol->wolopts |= WAKE_UCAST;
  236. if (value & DP83867_WOL_BCAST_EN)
  237. wol->wolopts |= WAKE_BCAST;
  238. if (value & DP83867_WOL_MAGIC_EN)
  239. wol->wolopts |= WAKE_MAGIC;
  240. if (value & DP83867_WOL_SEC_EN) {
  241. sopass_val = phy_read_mmd(phydev, DP83867_DEVADDR,
  242. DP83867_RXFSOP1);
  243. wol->sopass[0] = (sopass_val & 0xff);
  244. wol->sopass[1] = (sopass_val >> 8);
  245. sopass_val = phy_read_mmd(phydev, DP83867_DEVADDR,
  246. DP83867_RXFSOP2);
  247. wol->sopass[2] = (sopass_val & 0xff);
  248. wol->sopass[3] = (sopass_val >> 8);
  249. sopass_val = phy_read_mmd(phydev, DP83867_DEVADDR,
  250. DP83867_RXFSOP3);
  251. wol->sopass[4] = (sopass_val & 0xff);
  252. wol->sopass[5] = (sopass_val >> 8);
  253. wol->wolopts |= WAKE_MAGICSECURE;
  254. }
  255. if (!(value & DP83867_WOL_ENH_MAC))
  256. wol->wolopts = 0;
  257. }
  258. static int dp83867_config_intr(struct phy_device *phydev)
  259. {
  260. int micr_status, err;
  261. if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
  262. err = dp83867_ack_interrupt(phydev);
  263. if (err)
  264. return err;
  265. micr_status = phy_read(phydev, MII_DP83867_MICR);
  266. if (micr_status < 0)
  267. return micr_status;
  268. micr_status |=
  269. (MII_DP83867_MICR_AN_ERR_INT_EN |
  270. MII_DP83867_MICR_SPEED_CHNG_INT_EN |
  271. MII_DP83867_MICR_AUTONEG_COMP_INT_EN |
  272. MII_DP83867_MICR_LINK_STS_CHNG_INT_EN |
  273. MII_DP83867_MICR_DUP_MODE_CHNG_INT_EN |
  274. MII_DP83867_MICR_SLEEP_MODE_CHNG_INT_EN);
  275. err = phy_write(phydev, MII_DP83867_MICR, micr_status);
  276. } else {
  277. micr_status = 0x0;
  278. err = phy_write(phydev, MII_DP83867_MICR, micr_status);
  279. if (err)
  280. return err;
  281. err = dp83867_ack_interrupt(phydev);
  282. }
  283. return err;
  284. }
  285. static irqreturn_t dp83867_handle_interrupt(struct phy_device *phydev)
  286. {
  287. int irq_status, irq_enabled;
  288. irq_status = phy_read(phydev, MII_DP83867_ISR);
  289. if (irq_status < 0) {
  290. phy_error(phydev);
  291. return IRQ_NONE;
  292. }
  293. irq_enabled = phy_read(phydev, MII_DP83867_MICR);
  294. if (irq_enabled < 0) {
  295. phy_error(phydev);
  296. return IRQ_NONE;
  297. }
  298. if (!(irq_status & irq_enabled))
  299. return IRQ_NONE;
  300. phy_trigger_machine(phydev);
  301. return IRQ_HANDLED;
  302. }
  303. static int dp83867_read_status(struct phy_device *phydev)
  304. {
  305. int status = phy_read(phydev, MII_DP83867_PHYSTS);
  306. int ret;
  307. ret = genphy_read_status(phydev);
  308. if (ret)
  309. return ret;
  310. if (status < 0)
  311. return status;
  312. if (status & DP83867_PHYSTS_DUPLEX)
  313. phydev->duplex = DUPLEX_FULL;
  314. else
  315. phydev->duplex = DUPLEX_HALF;
  316. if (status & DP83867_PHYSTS_1000)
  317. phydev->speed = SPEED_1000;
  318. else if (status & DP83867_PHYSTS_100)
  319. phydev->speed = SPEED_100;
  320. else
  321. phydev->speed = SPEED_10;
  322. return 0;
  323. }
  324. static int dp83867_get_downshift(struct phy_device *phydev, u8 *data)
  325. {
  326. int val, cnt, enable, count;
  327. val = phy_read(phydev, DP83867_CFG2);
  328. if (val < 0)
  329. return val;
  330. enable = FIELD_GET(DP83867_DOWNSHIFT_EN, val);
  331. cnt = FIELD_GET(DP83867_DOWNSHIFT_ATTEMPT_MASK, val);
  332. switch (cnt) {
  333. case DP83867_DOWNSHIFT_1_COUNT_VAL:
  334. count = DP83867_DOWNSHIFT_1_COUNT;
  335. break;
  336. case DP83867_DOWNSHIFT_2_COUNT_VAL:
  337. count = DP83867_DOWNSHIFT_2_COUNT;
  338. break;
  339. case DP83867_DOWNSHIFT_4_COUNT_VAL:
  340. count = DP83867_DOWNSHIFT_4_COUNT;
  341. break;
  342. case DP83867_DOWNSHIFT_8_COUNT_VAL:
  343. count = DP83867_DOWNSHIFT_8_COUNT;
  344. break;
  345. default:
  346. return -EINVAL;
  347. }
  348. *data = enable ? count : DOWNSHIFT_DEV_DISABLE;
  349. return 0;
  350. }
  351. static int dp83867_set_downshift(struct phy_device *phydev, u8 cnt)
  352. {
  353. int val, count;
  354. if (cnt > DP83867_DOWNSHIFT_8_COUNT)
  355. return -E2BIG;
  356. if (!cnt)
  357. return phy_clear_bits(phydev, DP83867_CFG2,
  358. DP83867_DOWNSHIFT_EN);
  359. switch (cnt) {
  360. case DP83867_DOWNSHIFT_1_COUNT:
  361. count = DP83867_DOWNSHIFT_1_COUNT_VAL;
  362. break;
  363. case DP83867_DOWNSHIFT_2_COUNT:
  364. count = DP83867_DOWNSHIFT_2_COUNT_VAL;
  365. break;
  366. case DP83867_DOWNSHIFT_4_COUNT:
  367. count = DP83867_DOWNSHIFT_4_COUNT_VAL;
  368. break;
  369. case DP83867_DOWNSHIFT_8_COUNT:
  370. count = DP83867_DOWNSHIFT_8_COUNT_VAL;
  371. break;
  372. default:
  373. phydev_err(phydev,
  374. "Downshift count must be 1, 2, 4 or 8\n");
  375. return -EINVAL;
  376. }
  377. val = DP83867_DOWNSHIFT_EN;
  378. val |= FIELD_PREP(DP83867_DOWNSHIFT_ATTEMPT_MASK, count);
  379. return phy_modify(phydev, DP83867_CFG2,
  380. DP83867_DOWNSHIFT_EN | DP83867_DOWNSHIFT_ATTEMPT_MASK,
  381. val);
  382. }
  383. static int dp83867_get_tunable(struct phy_device *phydev,
  384. struct ethtool_tunable *tuna, void *data)
  385. {
  386. switch (tuna->id) {
  387. case ETHTOOL_PHY_DOWNSHIFT:
  388. return dp83867_get_downshift(phydev, data);
  389. default:
  390. return -EOPNOTSUPP;
  391. }
  392. }
  393. static int dp83867_set_tunable(struct phy_device *phydev,
  394. struct ethtool_tunable *tuna, const void *data)
  395. {
  396. switch (tuna->id) {
  397. case ETHTOOL_PHY_DOWNSHIFT:
  398. return dp83867_set_downshift(phydev, *(const u8 *)data);
  399. default:
  400. return -EOPNOTSUPP;
  401. }
  402. }
  403. static int dp83867_config_port_mirroring(struct phy_device *phydev)
  404. {
  405. struct dp83867_private *dp83867 = phydev->priv;
  406. if (dp83867->port_mirroring == DP83867_PORT_MIRROING_EN)
  407. phy_set_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
  408. DP83867_CFG4_PORT_MIRROR_EN);
  409. else
  410. phy_clear_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
  411. DP83867_CFG4_PORT_MIRROR_EN);
  412. return 0;
  413. }
  414. #if IS_ENABLED(CONFIG_OF_MDIO)
  415. static int dp83867_of_init_io_impedance(struct phy_device *phydev)
  416. {
  417. struct dp83867_private *dp83867 = phydev->priv;
  418. struct device *dev = &phydev->mdio.dev;
  419. struct device_node *of_node = dev->of_node;
  420. struct nvmem_cell *cell;
  421. u8 *buf, val;
  422. int ret;
  423. cell = of_nvmem_cell_get(of_node, "io_impedance_ctrl");
  424. if (IS_ERR(cell)) {
  425. ret = PTR_ERR(cell);
  426. if (ret != -ENOENT && ret != -EOPNOTSUPP)
  427. return phydev_err_probe(phydev, ret,
  428. "failed to get nvmem cell io_impedance_ctrl\n");
  429. /* If no nvmem cell, check for the boolean properties. */
  430. if (of_property_read_bool(of_node, "ti,max-output-impedance"))
  431. dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MAX;
  432. else if (of_property_read_bool(of_node, "ti,min-output-impedance"))
  433. dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN;
  434. else
  435. dp83867->io_impedance = -1; /* leave at default */
  436. return 0;
  437. }
  438. buf = nvmem_cell_read(cell, NULL);
  439. nvmem_cell_put(cell);
  440. if (IS_ERR(buf))
  441. return PTR_ERR(buf);
  442. val = *buf;
  443. kfree(buf);
  444. if ((val & DP83867_IO_MUX_CFG_IO_IMPEDANCE_MASK) != val) {
  445. phydev_err(phydev, "nvmem cell 'io_impedance_ctrl' contents out of range\n");
  446. return -ERANGE;
  447. }
  448. dp83867->io_impedance = val;
  449. return 0;
  450. }
  451. static int dp83867_of_init(struct phy_device *phydev)
  452. {
  453. struct dp83867_private *dp83867 = phydev->priv;
  454. struct device *dev = &phydev->mdio.dev;
  455. struct device_node *of_node = dev->of_node;
  456. int ret;
  457. if (!of_node)
  458. return -ENODEV;
  459. /* Optional configuration */
  460. ret = of_property_read_u32(of_node, "ti,clk-output-sel",
  461. &dp83867->clk_output_sel);
  462. /* If not set, keep default */
  463. if (!ret) {
  464. dp83867->set_clk_output = true;
  465. /* Valid values are 0 to DP83867_CLK_O_SEL_REF_CLK or
  466. * DP83867_CLK_O_SEL_OFF.
  467. */
  468. if (dp83867->clk_output_sel > DP83867_CLK_O_SEL_REF_CLK &&
  469. dp83867->clk_output_sel != DP83867_CLK_O_SEL_OFF) {
  470. phydev_err(phydev, "ti,clk-output-sel value %u out of range\n",
  471. dp83867->clk_output_sel);
  472. return -EINVAL;
  473. }
  474. }
  475. ret = dp83867_of_init_io_impedance(phydev);
  476. if (ret)
  477. return ret;
  478. dp83867->rxctrl_strap_quirk = of_property_read_bool(of_node,
  479. "ti,dp83867-rxctrl-strap-quirk");
  480. dp83867->sgmii_ref_clk_en = of_property_read_bool(of_node,
  481. "ti,sgmii-ref-clock-output-enable");
  482. dp83867->rx_id_delay = DP83867_RGMIIDCTL_2_00_NS;
  483. ret = of_property_read_u32(of_node, "ti,rx-internal-delay",
  484. &dp83867->rx_id_delay);
  485. if (!ret && dp83867->rx_id_delay > DP83867_RGMII_RX_CLK_DELAY_MAX) {
  486. phydev_err(phydev,
  487. "ti,rx-internal-delay value of %u out of range\n",
  488. dp83867->rx_id_delay);
  489. return -EINVAL;
  490. }
  491. dp83867->tx_id_delay = DP83867_RGMIIDCTL_2_00_NS;
  492. ret = of_property_read_u32(of_node, "ti,tx-internal-delay",
  493. &dp83867->tx_id_delay);
  494. if (!ret && dp83867->tx_id_delay > DP83867_RGMII_TX_CLK_DELAY_MAX) {
  495. phydev_err(phydev,
  496. "ti,tx-internal-delay value of %u out of range\n",
  497. dp83867->tx_id_delay);
  498. return -EINVAL;
  499. }
  500. if (of_property_read_bool(of_node, "enet-phy-lane-swap"))
  501. dp83867->port_mirroring = DP83867_PORT_MIRROING_EN;
  502. if (of_property_read_bool(of_node, "enet-phy-lane-no-swap"))
  503. dp83867->port_mirroring = DP83867_PORT_MIRROING_DIS;
  504. ret = of_property_read_u32(of_node, "ti,fifo-depth",
  505. &dp83867->tx_fifo_depth);
  506. if (ret) {
  507. ret = of_property_read_u32(of_node, "tx-fifo-depth",
  508. &dp83867->tx_fifo_depth);
  509. if (ret)
  510. dp83867->tx_fifo_depth =
  511. DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
  512. }
  513. if (dp83867->tx_fifo_depth > DP83867_PHYCR_FIFO_DEPTH_MAX) {
  514. phydev_err(phydev, "tx-fifo-depth value %u out of range\n",
  515. dp83867->tx_fifo_depth);
  516. return -EINVAL;
  517. }
  518. ret = of_property_read_u32(of_node, "rx-fifo-depth",
  519. &dp83867->rx_fifo_depth);
  520. if (ret)
  521. dp83867->rx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
  522. if (dp83867->rx_fifo_depth > DP83867_PHYCR_FIFO_DEPTH_MAX) {
  523. phydev_err(phydev, "rx-fifo-depth value %u out of range\n",
  524. dp83867->rx_fifo_depth);
  525. return -EINVAL;
  526. }
  527. return 0;
  528. }
  529. #else
  530. static int dp83867_of_init(struct phy_device *phydev)
  531. {
  532. struct dp83867_private *dp83867 = phydev->priv;
  533. u16 delay;
  534. /* For non-OF device, the RX and TX ID values are either strapped
  535. * or take from default value. So, we init RX & TX ID values here
  536. * so that the RGMIIDCTL is configured correctly later in
  537. * dp83867_config_init();
  538. */
  539. delay = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIIDCTL);
  540. dp83867->rx_id_delay = delay & DP83867_RGMII_RX_CLK_DELAY_MAX;
  541. dp83867->tx_id_delay = (delay >> DP83867_RGMII_TX_CLK_DELAY_SHIFT) &
  542. DP83867_RGMII_TX_CLK_DELAY_MAX;
  543. /* Per datasheet, IO impedance is default to 50-ohm, so we set the
  544. * same here or else the default '0' means highest IO impedance
  545. * which is wrong.
  546. */
  547. dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN / 2;
  548. /* For non-OF device, the RX and TX FIFO depths are taken from
  549. * default value. So, we init RX & TX FIFO depths here
  550. * so that it is configured correctly later in dp83867_config_init();
  551. */
  552. dp83867->tx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
  553. dp83867->rx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
  554. return 0;
  555. }
  556. #endif /* CONFIG_OF_MDIO */
  557. static int dp83867_suspend(struct phy_device *phydev)
  558. {
  559. /* Disable PHY Interrupts */
  560. if (phy_interrupt_is_valid(phydev)) {
  561. phydev->interrupts = PHY_INTERRUPT_DISABLED;
  562. dp83867_config_intr(phydev);
  563. }
  564. return genphy_suspend(phydev);
  565. }
  566. static int dp83867_resume(struct phy_device *phydev)
  567. {
  568. /* Enable PHY Interrupts */
  569. if (phy_interrupt_is_valid(phydev)) {
  570. phydev->interrupts = PHY_INTERRUPT_ENABLED;
  571. dp83867_config_intr(phydev);
  572. }
  573. genphy_resume(phydev);
  574. return 0;
  575. }
  576. static int dp83867_probe(struct phy_device *phydev)
  577. {
  578. struct dp83867_private *dp83867;
  579. dp83867 = devm_kzalloc(&phydev->mdio.dev, sizeof(*dp83867),
  580. GFP_KERNEL);
  581. if (!dp83867)
  582. return -ENOMEM;
  583. phydev->priv = dp83867;
  584. return dp83867_of_init(phydev);
  585. }
  586. static int dp83867_config_init(struct phy_device *phydev)
  587. {
  588. struct dp83867_private *dp83867 = phydev->priv;
  589. int ret, val, bs;
  590. /* Force speed optimization for the PHY even if it strapped */
  591. ret = phy_modify(phydev, DP83867_CFG2, DP83867_DOWNSHIFT_EN,
  592. DP83867_DOWNSHIFT_EN);
  593. if (ret)
  594. return ret;
  595. /* RX_DV/RX_CTRL strapped in mode 1 or mode 2 workaround */
  596. if (dp83867->rxctrl_strap_quirk)
  597. phy_clear_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
  598. BIT(7));
  599. bs = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_STRAP_STS2);
  600. if (bs & DP83867_STRAP_STS2_STRAP_FLD) {
  601. /* When using strap to enable FLD, the ENERGY_LOST_FLD_THR will
  602. * be set to 0x2. This may causes the PHY link to be unstable -
  603. * the default value 0x1 need to be restored.
  604. */
  605. ret = phy_modify_mmd(phydev, DP83867_DEVADDR,
  606. DP83867_FLD_THR_CFG,
  607. DP83867_FLD_THR_CFG_ENERGY_LOST_THR_MASK,
  608. 0x1);
  609. if (ret)
  610. return ret;
  611. }
  612. /* Although the DP83867 reports EEE capability through the
  613. * MDIO_PCS_EEE_ABLE and MDIO_AN_EEE_ADV registers, the feature
  614. * is not actually implemented in hardware.
  615. */
  616. phy_disable_eee(phydev);
  617. val = phy_read(phydev, MII_DP83867_PHYCTRL);
  618. if (val < 0)
  619. return val;
  620. val &= ~DP83867_PHYCR_TX_FIFO_DEPTH_MASK;
  621. val |= (dp83867->tx_fifo_depth <<
  622. DP83867_PHYCR_TX_FIFO_DEPTH_SHIFT);
  623. val &= ~DP83867_PHYCR_SGMII_EN;
  624. if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
  625. val &= ~DP83867_PHYCR_RX_FIFO_DEPTH_MASK;
  626. val |= (dp83867->rx_fifo_depth <<
  627. DP83867_PHYCR_RX_FIFO_DEPTH_SHIFT) |
  628. DP83867_PHYCR_SGMII_EN;
  629. }
  630. ret = phy_write(phydev, MII_DP83867_PHYCTRL, val);
  631. if (ret)
  632. return ret;
  633. if (phy_interface_is_rgmii(phydev)) {
  634. /* Set up RGMII delays */
  635. val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIICTL);
  636. val |= DP83867_RGMII_EN;
  637. val &= ~(DP83867_RGMII_TX_CLK_DELAY_EN | DP83867_RGMII_RX_CLK_DELAY_EN);
  638. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
  639. val |= (DP83867_RGMII_TX_CLK_DELAY_EN | DP83867_RGMII_RX_CLK_DELAY_EN);
  640. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
  641. val |= DP83867_RGMII_TX_CLK_DELAY_EN;
  642. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
  643. val |= DP83867_RGMII_RX_CLK_DELAY_EN;
  644. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIICTL, val);
  645. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIIDCTL,
  646. dp83867->rx_id_delay |
  647. (dp83867->tx_id_delay << DP83867_RGMII_TX_CLK_DELAY_SHIFT));
  648. } else {
  649. val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIICTL);
  650. val &= ~DP83867_RGMII_EN;
  651. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RGMIICTL, val);
  652. }
  653. /* If specified, set io impedance */
  654. if (dp83867->io_impedance >= 0)
  655. phy_modify_mmd(phydev, DP83867_DEVADDR, DP83867_IO_MUX_CFG,
  656. DP83867_IO_MUX_CFG_IO_IMPEDANCE_MASK,
  657. dp83867->io_impedance);
  658. if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
  659. /* For support SPEED_10 in SGMII mode
  660. * DP83867_10M_SGMII_RATE_ADAPT bit
  661. * has to be cleared by software. That
  662. * does not affect SPEED_100 and
  663. * SPEED_1000.
  664. */
  665. ret = phy_modify_mmd(phydev, DP83867_DEVADDR,
  666. DP83867_10M_SGMII_CFG,
  667. DP83867_10M_SGMII_RATE_ADAPT_MASK,
  668. 0);
  669. if (ret)
  670. return ret;
  671. /* After reset SGMII Autoneg timer is set to 2us (bits 6 and 5
  672. * are 01). That is not enough to finalize autoneg on some
  673. * devices. Increase this timer duration to maximum 16ms.
  674. */
  675. ret = phy_modify_mmd(phydev, DP83867_DEVADDR,
  676. DP83867_CFG4,
  677. DP83867_CFG4_SGMII_ANEG_MASK,
  678. DP83867_CFG4_SGMII_ANEG_TIMER_16MS);
  679. if (ret)
  680. return ret;
  681. val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_SGMIICTL);
  682. /* SGMII type is set to 4-wire mode by default.
  683. * If we place appropriate property in dts (see above)
  684. * switch on 6-wire mode.
  685. */
  686. if (dp83867->sgmii_ref_clk_en)
  687. val |= DP83867_SGMII_TYPE;
  688. else
  689. val &= ~DP83867_SGMII_TYPE;
  690. phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_SGMIICTL, val);
  691. /* This is a SW workaround for link instability if RX_CTRL is
  692. * not strapped to mode 3 or 4 in HW. This is required for SGMII
  693. * in addition to clearing bit 7, handled above.
  694. */
  695. if (dp83867->rxctrl_strap_quirk)
  696. phy_set_bits_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4,
  697. BIT(8));
  698. }
  699. val = phy_read(phydev, DP83867_CFG3);
  700. /* Enable Interrupt output INT_OE in CFG3 register */
  701. if (phy_interrupt_is_valid(phydev))
  702. val |= DP83867_CFG3_INT_OE;
  703. val |= DP83867_CFG3_ROBUST_AUTO_MDIX;
  704. phy_write(phydev, DP83867_CFG3, val);
  705. if (dp83867->port_mirroring != DP83867_PORT_MIRROING_KEEP)
  706. dp83867_config_port_mirroring(phydev);
  707. /* Clock output selection if muxing property is set */
  708. if (dp83867->set_clk_output) {
  709. u16 mask = DP83867_IO_MUX_CFG_CLK_O_DISABLE;
  710. if (dp83867->clk_output_sel == DP83867_CLK_O_SEL_OFF) {
  711. val = DP83867_IO_MUX_CFG_CLK_O_DISABLE;
  712. } else {
  713. mask |= DP83867_IO_MUX_CFG_CLK_O_SEL_MASK;
  714. val = dp83867->clk_output_sel <<
  715. DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT;
  716. }
  717. phy_modify_mmd(phydev, DP83867_DEVADDR, DP83867_IO_MUX_CFG,
  718. mask, val);
  719. }
  720. return 0;
  721. }
  722. static int dp83867_phy_reset(struct phy_device *phydev)
  723. {
  724. int err;
  725. err = phy_write(phydev, DP83867_CTRL, DP83867_SW_RESET);
  726. if (err < 0)
  727. return err;
  728. usleep_range(10, 20);
  729. err = phy_modify(phydev, MII_DP83867_PHYCTRL,
  730. DP83867_PHYCR_FORCE_LINK_GOOD, 0);
  731. if (err < 0)
  732. return err;
  733. /* Configure the DSP Feedforward Equalizer Configuration register to
  734. * improve short cable (< 1 meter) performance. This will not affect
  735. * long cable performance.
  736. */
  737. err = phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_DSP_FFE_CFG,
  738. 0x0e81);
  739. if (err < 0)
  740. return err;
  741. err = phy_write(phydev, DP83867_CTRL, DP83867_SW_RESTART);
  742. if (err < 0)
  743. return err;
  744. usleep_range(10, 20);
  745. return 0;
  746. }
  747. static void dp83867_link_change_notify(struct phy_device *phydev)
  748. {
  749. /* There is a limitation in DP83867 PHY device where SGMII AN is
  750. * only triggered once after the device is booted up. Even after the
  751. * PHY TPI is down and up again, SGMII AN is not triggered and
  752. * hence no new in-band message from PHY to MAC side SGMII.
  753. * This could cause an issue during power up, when PHY is up prior
  754. * to MAC. At this condition, once MAC side SGMII is up, MAC side
  755. * SGMII wouldn`t receive new in-band message from TI PHY with
  756. * correct link status, speed and duplex info.
  757. * Thus, implemented a SW solution here to retrigger SGMII Auto-Neg
  758. * whenever there is a link change.
  759. */
  760. if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
  761. int val;
  762. val = phy_modify_changed(phydev, DP83867_CFG2,
  763. DP83867_SGMII_AUTONEG_EN, 0);
  764. /* Keep the in-band setting made by dp83867_config_inband() */
  765. if (val != 0)
  766. phy_set_bits(phydev, DP83867_CFG2,
  767. DP83867_SGMII_AUTONEG_EN);
  768. }
  769. }
  770. static int dp83867_loopback(struct phy_device *phydev, bool enable, int speed)
  771. {
  772. if (enable && speed)
  773. return -EOPNOTSUPP;
  774. return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
  775. enable ? BMCR_LOOPBACK : 0);
  776. }
  777. static int
  778. dp83867_led_brightness_set(struct phy_device *phydev,
  779. u8 index, enum led_brightness brightness)
  780. {
  781. u32 val;
  782. if (index >= DP83867_LED_COUNT)
  783. return -EINVAL;
  784. /* DRV_EN==1: output is DRV_VAL */
  785. val = DP83867_LED_DRV_EN(index);
  786. if (brightness)
  787. val |= DP83867_LED_DRV_VAL(index);
  788. return phy_modify(phydev, DP83867_LEDCR2,
  789. DP83867_LED_DRV_VAL(index) |
  790. DP83867_LED_DRV_EN(index),
  791. val);
  792. }
  793. static int dp83867_led_mode(u8 index, unsigned long rules)
  794. {
  795. if (index >= DP83867_LED_COUNT)
  796. return -EINVAL;
  797. switch (rules) {
  798. case BIT(TRIGGER_NETDEV_LINK):
  799. return DP83867_LED_FN_LINK;
  800. case BIT(TRIGGER_NETDEV_LINK_10):
  801. return DP83867_LED_FN_LINK_10_BT;
  802. case BIT(TRIGGER_NETDEV_LINK_100):
  803. return DP83867_LED_FN_LINK_100_BTX;
  804. case BIT(TRIGGER_NETDEV_FULL_DUPLEX):
  805. return DP83867_LED_FN_FULL_DUPLEX;
  806. case BIT(TRIGGER_NETDEV_TX):
  807. return DP83867_LED_FN_TX;
  808. case BIT(TRIGGER_NETDEV_RX):
  809. return DP83867_LED_FN_RX;
  810. case BIT(TRIGGER_NETDEV_LINK_1000):
  811. return DP83867_LED_FN_LINK_1000_BT;
  812. case BIT(TRIGGER_NETDEV_TX) | BIT(TRIGGER_NETDEV_RX):
  813. return DP83867_LED_FN_RX_TX;
  814. case BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK_1000):
  815. return DP83867_LED_FN_LINK_100_1000_BT;
  816. case BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK_100):
  817. return DP83867_LED_FN_LINK_10_100_BT;
  818. case BIT(TRIGGER_NETDEV_LINK) | BIT(TRIGGER_NETDEV_TX) | BIT(TRIGGER_NETDEV_RX):
  819. return DP83867_LED_FN_LINK_RX_TX;
  820. default:
  821. return -EOPNOTSUPP;
  822. }
  823. }
  824. static int dp83867_led_hw_is_supported(struct phy_device *phydev, u8 index,
  825. unsigned long rules)
  826. {
  827. int ret;
  828. ret = dp83867_led_mode(index, rules);
  829. if (ret < 0)
  830. return ret;
  831. return 0;
  832. }
  833. static int dp83867_led_hw_control_set(struct phy_device *phydev, u8 index,
  834. unsigned long rules)
  835. {
  836. int mode, ret;
  837. mode = dp83867_led_mode(index, rules);
  838. if (mode < 0)
  839. return mode;
  840. ret = phy_modify(phydev, DP83867_LEDCR1, DP83867_LED_FN_MASK(index),
  841. DP83867_LED_FN(index, mode));
  842. if (ret)
  843. return ret;
  844. return phy_modify(phydev, DP83867_LEDCR2, DP83867_LED_DRV_EN(index), 0);
  845. }
  846. static int dp83867_led_hw_control_get(struct phy_device *phydev, u8 index,
  847. unsigned long *rules)
  848. {
  849. int val;
  850. val = phy_read(phydev, DP83867_LEDCR1);
  851. if (val < 0)
  852. return val;
  853. val &= DP83867_LED_FN_MASK(index);
  854. val >>= index * 4;
  855. switch (val) {
  856. case DP83867_LED_FN_LINK:
  857. *rules = BIT(TRIGGER_NETDEV_LINK);
  858. break;
  859. case DP83867_LED_FN_LINK_10_BT:
  860. *rules = BIT(TRIGGER_NETDEV_LINK_10);
  861. break;
  862. case DP83867_LED_FN_LINK_100_BTX:
  863. *rules = BIT(TRIGGER_NETDEV_LINK_100);
  864. break;
  865. case DP83867_LED_FN_FULL_DUPLEX:
  866. *rules = BIT(TRIGGER_NETDEV_FULL_DUPLEX);
  867. break;
  868. case DP83867_LED_FN_TX:
  869. *rules = BIT(TRIGGER_NETDEV_TX);
  870. break;
  871. case DP83867_LED_FN_RX:
  872. *rules = BIT(TRIGGER_NETDEV_RX);
  873. break;
  874. case DP83867_LED_FN_LINK_1000_BT:
  875. *rules = BIT(TRIGGER_NETDEV_LINK_1000);
  876. break;
  877. case DP83867_LED_FN_RX_TX:
  878. *rules = BIT(TRIGGER_NETDEV_TX) | BIT(TRIGGER_NETDEV_RX);
  879. break;
  880. case DP83867_LED_FN_LINK_100_1000_BT:
  881. *rules = BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK_1000);
  882. break;
  883. case DP83867_LED_FN_LINK_10_100_BT:
  884. *rules = BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK_100);
  885. break;
  886. case DP83867_LED_FN_LINK_RX_TX:
  887. *rules = BIT(TRIGGER_NETDEV_LINK) | BIT(TRIGGER_NETDEV_TX) |
  888. BIT(TRIGGER_NETDEV_RX);
  889. break;
  890. default:
  891. *rules = 0;
  892. break;
  893. }
  894. return 0;
  895. }
  896. static int dp83867_led_polarity_set(struct phy_device *phydev, int index,
  897. unsigned long modes)
  898. {
  899. /* Default active high */
  900. u16 polarity = DP83867_LED_POLARITY(index);
  901. u32 mode;
  902. for_each_set_bit(mode, &modes, __PHY_LED_MODES_NUM) {
  903. switch (mode) {
  904. case PHY_LED_ACTIVE_LOW:
  905. polarity = 0;
  906. break;
  907. default:
  908. return -EINVAL;
  909. }
  910. }
  911. return phy_modify(phydev, DP83867_LEDCR2,
  912. DP83867_LED_POLARITY(index), polarity);
  913. }
  914. static unsigned int dp83867_inband_caps(struct phy_device *phydev,
  915. phy_interface_t interface)
  916. {
  917. if (interface == PHY_INTERFACE_MODE_SGMII)
  918. return LINK_INBAND_ENABLE | LINK_INBAND_DISABLE;
  919. return 0;
  920. }
  921. static int dp83867_config_inband(struct phy_device *phydev, unsigned int modes)
  922. {
  923. int val = 0;
  924. if (modes == LINK_INBAND_ENABLE)
  925. val = DP83867_SGMII_AUTONEG_EN;
  926. return phy_modify(phydev, DP83867_CFG2, DP83867_SGMII_AUTONEG_EN, val);
  927. }
  928. static struct phy_driver dp83867_driver[] = {
  929. {
  930. .phy_id = DP83867_PHY_ID,
  931. .phy_id_mask = 0xfffffff0,
  932. .name = "TI DP83867",
  933. /* PHY_GBIT_FEATURES */
  934. .probe = dp83867_probe,
  935. .config_init = dp83867_config_init,
  936. .soft_reset = dp83867_phy_reset,
  937. .read_status = dp83867_read_status,
  938. .get_tunable = dp83867_get_tunable,
  939. .set_tunable = dp83867_set_tunable,
  940. .get_wol = dp83867_get_wol,
  941. .set_wol = dp83867_set_wol,
  942. /* IRQ related */
  943. .config_intr = dp83867_config_intr,
  944. .handle_interrupt = dp83867_handle_interrupt,
  945. .suspend = dp83867_suspend,
  946. .resume = dp83867_resume,
  947. .link_change_notify = dp83867_link_change_notify,
  948. .set_loopback = dp83867_loopback,
  949. .led_brightness_set = dp83867_led_brightness_set,
  950. .led_hw_is_supported = dp83867_led_hw_is_supported,
  951. .led_hw_control_set = dp83867_led_hw_control_set,
  952. .led_hw_control_get = dp83867_led_hw_control_get,
  953. .led_polarity_set = dp83867_led_polarity_set,
  954. .inband_caps = dp83867_inband_caps,
  955. .config_inband = dp83867_config_inband,
  956. },
  957. };
  958. module_phy_driver(dp83867_driver);
  959. static const struct mdio_device_id __maybe_unused dp83867_tbl[] = {
  960. { DP83867_PHY_ID, 0xfffffff0 },
  961. { }
  962. };
  963. MODULE_DEVICE_TABLE(mdio, dp83867_tbl);
  964. MODULE_DESCRIPTION("Texas Instruments DP83867 PHY driver");
  965. MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com");
  966. MODULE_LICENSE("GPL v2");