adin1100.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
  2. /*
  3. * Driver for Analog Devices Industrial Ethernet T1L PHYs
  4. *
  5. * Copyright 2020 Analog Devices Inc.
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/bitfield.h>
  9. #include <linux/delay.h>
  10. #include <linux/errno.h>
  11. #include <linux/init.h>
  12. #include <linux/module.h>
  13. #include <linux/mii.h>
  14. #include <linux/phy.h>
  15. #include <linux/property.h>
  16. #define PHY_ID_ADIN1100 0x0283bc81
  17. #define PHY_ID_ADIN1110 0x0283bc91
  18. #define PHY_ID_ADIN2111 0x0283bca1
  19. #define ADIN_PHY_SUBSYS_IRQ_MASK 0x0021
  20. #define ADIN_LINK_STAT_CHNG_IRQ_EN BIT(1)
  21. #define ADIN_PHY_SUBSYS_IRQ_STATUS 0x0011
  22. #define ADIN_LINK_STAT_CHNG BIT(1)
  23. #define ADIN_FORCED_MODE 0x8000
  24. #define ADIN_FORCED_MODE_EN BIT(0)
  25. #define ADIN_CRSM_SFT_RST 0x8810
  26. #define ADIN_CRSM_SFT_RST_EN BIT(0)
  27. #define ADIN_CRSM_SFT_PD_CNTRL 0x8812
  28. #define ADIN_CRSM_SFT_PD_CNTRL_EN BIT(0)
  29. #define ADIN_AN_PHY_INST_STATUS 0x8030
  30. #define ADIN_IS_CFG_SLV BIT(2)
  31. #define ADIN_IS_CFG_MST BIT(3)
  32. #define ADIN_CRSM_STAT 0x8818
  33. #define ADIN_CRSM_SFT_PD_RDY BIT(1)
  34. #define ADIN_CRSM_SYS_RDY BIT(0)
  35. #define ADIN_MSE_VAL 0x830B
  36. #define ADIN_SQI_MAX 7
  37. struct adin_mse_sqi_range {
  38. u16 start;
  39. u16 end;
  40. };
  41. static const struct adin_mse_sqi_range adin_mse_sqi_map[] = {
  42. { 0x0A74, 0xFFFF },
  43. { 0x084E, 0x0A74 },
  44. { 0x0698, 0x084E },
  45. { 0x053D, 0x0698 },
  46. { 0x0429, 0x053D },
  47. { 0x034E, 0x0429 },
  48. { 0x02A0, 0x034E },
  49. { 0x0000, 0x02A0 },
  50. };
  51. /**
  52. * struct adin_priv - ADIN PHY driver private data
  53. * @tx_level_2v4_able: set if the PHY supports 2.4V TX levels (10BASE-T1L)
  54. * @tx_level_2v4: set if the PHY requests 2.4V TX levels (10BASE-T1L)
  55. * @tx_level_prop_present: set if the TX level is specified in DT
  56. */
  57. struct adin_priv {
  58. unsigned int tx_level_2v4_able:1;
  59. unsigned int tx_level_2v4:1;
  60. unsigned int tx_level_prop_present:1;
  61. };
  62. static int adin_read_status(struct phy_device *phydev)
  63. {
  64. int ret;
  65. ret = genphy_c45_read_status(phydev);
  66. if (ret)
  67. return ret;
  68. ret = phy_read_mmd(phydev, MDIO_MMD_AN, ADIN_AN_PHY_INST_STATUS);
  69. if (ret < 0)
  70. return ret;
  71. if (ret & ADIN_IS_CFG_SLV)
  72. phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE;
  73. if (ret & ADIN_IS_CFG_MST)
  74. phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER;
  75. return 0;
  76. }
  77. static int adin_config_aneg(struct phy_device *phydev)
  78. {
  79. struct adin_priv *priv = phydev->priv;
  80. int ret;
  81. if (phydev->autoneg == AUTONEG_DISABLE) {
  82. ret = genphy_c45_pma_setup_forced(phydev);
  83. if (ret < 0)
  84. return ret;
  85. if (priv->tx_level_prop_present && priv->tx_level_2v4)
  86. ret = phy_set_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_B10L_PMA_CTRL,
  87. MDIO_PMA_10T1L_CTRL_2V4_EN);
  88. else
  89. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_B10L_PMA_CTRL,
  90. MDIO_PMA_10T1L_CTRL_2V4_EN);
  91. if (ret < 0)
  92. return ret;
  93. /* Force PHY to use above configurations */
  94. return phy_set_bits_mmd(phydev, MDIO_MMD_AN, ADIN_FORCED_MODE, ADIN_FORCED_MODE_EN);
  95. }
  96. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_AN, ADIN_FORCED_MODE, ADIN_FORCED_MODE_EN);
  97. if (ret < 0)
  98. return ret;
  99. /* Request increased transmit level from LP. */
  100. if (priv->tx_level_prop_present && priv->tx_level_2v4) {
  101. ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_H,
  102. MDIO_AN_T1_ADV_H_10L_TX_HI |
  103. MDIO_AN_T1_ADV_H_10L_TX_HI_REQ);
  104. if (ret < 0)
  105. return ret;
  106. }
  107. /* Disable 2.4 Vpp transmit level. */
  108. if ((priv->tx_level_prop_present && !priv->tx_level_2v4) || !priv->tx_level_2v4_able) {
  109. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_ADV_H,
  110. MDIO_AN_T1_ADV_H_10L_TX_HI |
  111. MDIO_AN_T1_ADV_H_10L_TX_HI_REQ);
  112. if (ret < 0)
  113. return ret;
  114. }
  115. return genphy_c45_config_aneg(phydev);
  116. }
  117. static int adin_phy_ack_intr(struct phy_device *phydev)
  118. {
  119. /* Clear pending interrupts */
  120. int rc = phy_read_mmd(phydev, MDIO_MMD_VEND2,
  121. ADIN_PHY_SUBSYS_IRQ_STATUS);
  122. return rc < 0 ? rc : 0;
  123. }
  124. static int adin_config_intr(struct phy_device *phydev)
  125. {
  126. u16 irq_mask;
  127. int ret;
  128. ret = adin_phy_ack_intr(phydev);
  129. if (ret)
  130. return ret;
  131. if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
  132. irq_mask = ADIN_LINK_STAT_CHNG_IRQ_EN;
  133. else
  134. irq_mask = 0;
  135. return phy_modify_mmd(phydev, MDIO_MMD_VEND2,
  136. ADIN_PHY_SUBSYS_IRQ_MASK,
  137. ADIN_LINK_STAT_CHNG_IRQ_EN, irq_mask);
  138. }
  139. static irqreturn_t adin_phy_handle_interrupt(struct phy_device *phydev)
  140. {
  141. int irq_status;
  142. irq_status = phy_read_mmd(phydev, MDIO_MMD_VEND2,
  143. ADIN_PHY_SUBSYS_IRQ_STATUS);
  144. if (irq_status < 0) {
  145. phy_error(phydev);
  146. return IRQ_NONE;
  147. }
  148. if (!(irq_status & ADIN_LINK_STAT_CHNG))
  149. return IRQ_NONE;
  150. phy_trigger_machine(phydev);
  151. return IRQ_HANDLED;
  152. }
  153. static int adin_set_powerdown_mode(struct phy_device *phydev, bool en)
  154. {
  155. int ret;
  156. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1,
  157. ADIN_CRSM_SFT_PD_CNTRL,
  158. en ? ADIN_CRSM_SFT_PD_CNTRL_EN : 0);
  159. if (ret < 0)
  160. return ret;
  161. return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1, ADIN_CRSM_STAT, ret,
  162. !!(ret & ADIN_CRSM_SFT_PD_RDY) == en,
  163. 1000, 30000, true);
  164. }
  165. static int adin_suspend(struct phy_device *phydev)
  166. {
  167. return adin_set_powerdown_mode(phydev, true);
  168. }
  169. static int adin_resume(struct phy_device *phydev)
  170. {
  171. return adin_set_powerdown_mode(phydev, false);
  172. }
  173. static int adin_set_loopback(struct phy_device *phydev, bool enable, int speed)
  174. {
  175. if (enable && speed)
  176. return -EOPNOTSUPP;
  177. if (enable)
  178. return phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_10T1L_CTRL,
  179. BMCR_LOOPBACK);
  180. /* PCS loopback (according to 10BASE-T1L spec) */
  181. return phy_clear_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_10T1L_CTRL,
  182. BMCR_LOOPBACK);
  183. }
  184. static int adin_soft_reset(struct phy_device *phydev)
  185. {
  186. int ret;
  187. ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, ADIN_CRSM_SFT_RST, ADIN_CRSM_SFT_RST_EN);
  188. if (ret < 0)
  189. return ret;
  190. return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1, ADIN_CRSM_STAT, ret,
  191. (ret & ADIN_CRSM_SYS_RDY),
  192. 10000, 30000, true);
  193. }
  194. static int adin_get_features(struct phy_device *phydev)
  195. {
  196. struct adin_priv *priv = phydev->priv;
  197. struct device *dev = &phydev->mdio.dev;
  198. int ret;
  199. u8 val;
  200. ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_10T1L_STAT);
  201. if (ret < 0)
  202. return ret;
  203. /* This depends on the voltage level from the power source */
  204. priv->tx_level_2v4_able = !!(ret & MDIO_PMA_10T1L_STAT_2V4_ABLE);
  205. phydev_dbg(phydev, "PHY supports 2.4V TX level: %s\n",
  206. priv->tx_level_2v4_able ? "yes" : "no");
  207. priv->tx_level_prop_present = device_property_present(dev, "phy-10base-t1l-2.4vpp");
  208. if (priv->tx_level_prop_present) {
  209. ret = device_property_read_u8(dev, "phy-10base-t1l-2.4vpp", &val);
  210. if (ret < 0)
  211. return ret;
  212. priv->tx_level_2v4 = val;
  213. if (!priv->tx_level_2v4 && priv->tx_level_2v4_able)
  214. phydev_info(phydev,
  215. "PHY supports 2.4V TX level, but disabled via config\n");
  216. }
  217. linkmode_set_bit_array(phy_basic_ports_array, ARRAY_SIZE(phy_basic_ports_array),
  218. phydev->supported);
  219. return genphy_c45_pma_read_abilities(phydev);
  220. }
  221. static int adin_get_sqi(struct phy_device *phydev)
  222. {
  223. u16 mse_val;
  224. int sqi;
  225. int ret;
  226. ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT1);
  227. if (ret < 0)
  228. return ret;
  229. else if (!(ret & MDIO_STAT1_LSTATUS))
  230. return 0;
  231. ret = phy_read_mmd(phydev, MDIO_STAT1, ADIN_MSE_VAL);
  232. if (ret < 0)
  233. return ret;
  234. mse_val = 0xFFFF & ret;
  235. for (sqi = 0; sqi < ARRAY_SIZE(adin_mse_sqi_map); sqi++) {
  236. if (mse_val >= adin_mse_sqi_map[sqi].start && mse_val <= adin_mse_sqi_map[sqi].end)
  237. return sqi;
  238. }
  239. return -EINVAL;
  240. }
  241. static int adin_get_sqi_max(struct phy_device *phydev)
  242. {
  243. return ADIN_SQI_MAX;
  244. }
  245. static int adin_probe(struct phy_device *phydev)
  246. {
  247. struct device *dev = &phydev->mdio.dev;
  248. struct adin_priv *priv;
  249. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  250. if (!priv)
  251. return -ENOMEM;
  252. phydev->priv = priv;
  253. return 0;
  254. }
  255. static struct phy_driver adin_driver[] = {
  256. {
  257. .phy_id = PHY_ID_ADIN1100,
  258. .phy_id_mask = 0xffffffcf,
  259. .name = "ADIN1100",
  260. .get_features = adin_get_features,
  261. .soft_reset = adin_soft_reset,
  262. .probe = adin_probe,
  263. .config_aneg = adin_config_aneg,
  264. .read_status = adin_read_status,
  265. .config_intr = adin_config_intr,
  266. .handle_interrupt = adin_phy_handle_interrupt,
  267. .set_loopback = adin_set_loopback,
  268. .suspend = adin_suspend,
  269. .resume = adin_resume,
  270. .get_sqi = adin_get_sqi,
  271. .get_sqi_max = adin_get_sqi_max,
  272. },
  273. };
  274. module_phy_driver(adin_driver);
  275. static const struct mdio_device_id __maybe_unused adin_tbl[] = {
  276. { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1100) },
  277. { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1110) },
  278. { PHY_ID_MATCH_MODEL(PHY_ID_ADIN2111) },
  279. { }
  280. };
  281. MODULE_DEVICE_TABLE(mdio, adin_tbl);
  282. MODULE_DESCRIPTION("Analog Devices Industrial Ethernet T1L PHY driver");
  283. MODULE_LICENSE("Dual BSD/GPL");