nxp-tja11xx.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* NXP TJA1100 BroadRReach PHY driver
  3. *
  4. * Copyright (C) 2018 Marek Vasut <marex@denx.de>
  5. */
  6. #include <linux/delay.h>
  7. #include <linux/ethtool.h>
  8. #include <linux/kernel.h>
  9. #include <linux/mii.h>
  10. #include <linux/module.h>
  11. #include <linux/phy.h>
  12. #include <linux/hwmon.h>
  13. #include <linux/bitfield.h>
  14. #define PHY_ID_MASK 0xfffffff0
  15. #define PHY_ID_TJA1100 0x0180dc40
  16. #define PHY_ID_TJA1101 0x0180dd00
  17. #define MII_ECTRL 17
  18. #define MII_ECTRL_LINK_CONTROL BIT(15)
  19. #define MII_ECTRL_POWER_MODE_MASK GENMASK(14, 11)
  20. #define MII_ECTRL_POWER_MODE_NO_CHANGE (0x0 << 11)
  21. #define MII_ECTRL_POWER_MODE_NORMAL (0x3 << 11)
  22. #define MII_ECTRL_POWER_MODE_STANDBY (0xc << 11)
  23. #define MII_ECTRL_CONFIG_EN BIT(2)
  24. #define MII_ECTRL_WAKE_REQUEST BIT(0)
  25. #define MII_CFG1 18
  26. #define MII_CFG1_AUTO_OP BIT(14)
  27. #define MII_CFG1_SLEEP_CONFIRM BIT(6)
  28. #define MII_CFG1_LED_MODE_MASK GENMASK(5, 4)
  29. #define MII_CFG1_LED_MODE_LINKUP 0
  30. #define MII_CFG1_LED_ENABLE BIT(3)
  31. #define MII_CFG2 19
  32. #define MII_CFG2_SLEEP_REQUEST_TO GENMASK(1, 0)
  33. #define MII_CFG2_SLEEP_REQUEST_TO_16MS 0x3
  34. #define MII_INTSRC 21
  35. #define MII_INTSRC_TEMP_ERR BIT(1)
  36. #define MII_INTSRC_UV_ERR BIT(3)
  37. #define MII_COMMSTAT 23
  38. #define MII_COMMSTAT_LINK_UP BIT(15)
  39. #define MII_GENSTAT 24
  40. #define MII_GENSTAT_PLL_LOCKED BIT(14)
  41. #define MII_COMMCFG 27
  42. #define MII_COMMCFG_AUTO_OP BIT(15)
  43. struct tja11xx_priv {
  44. char *hwmon_name;
  45. struct device *hwmon_dev;
  46. };
  47. struct tja11xx_phy_stats {
  48. const char *string;
  49. u8 reg;
  50. u8 off;
  51. u16 mask;
  52. };
  53. static struct tja11xx_phy_stats tja11xx_hw_stats[] = {
  54. { "phy_symbol_error_count", 20, 0, GENMASK(15, 0) },
  55. { "phy_polarity_detect", 25, 6, BIT(6) },
  56. { "phy_open_detect", 25, 7, BIT(7) },
  57. { "phy_short_detect", 25, 8, BIT(8) },
  58. { "phy_rem_rcvr_count", 26, 0, GENMASK(7, 0) },
  59. { "phy_loc_rcvr_count", 26, 8, GENMASK(15, 8) },
  60. };
  61. static int tja11xx_check(struct phy_device *phydev, u8 reg, u16 mask, u16 set)
  62. {
  63. int i, ret;
  64. for (i = 0; i < 200; i++) {
  65. ret = phy_read(phydev, reg);
  66. if (ret < 0)
  67. return ret;
  68. if ((ret & mask) == set)
  69. return 0;
  70. usleep_range(100, 150);
  71. }
  72. return -ETIMEDOUT;
  73. }
  74. static int phy_modify_check(struct phy_device *phydev, u8 reg,
  75. u16 mask, u16 set)
  76. {
  77. int ret;
  78. ret = phy_modify(phydev, reg, mask, set);
  79. if (ret)
  80. return ret;
  81. return tja11xx_check(phydev, reg, mask, set);
  82. }
  83. static int tja11xx_enable_reg_write(struct phy_device *phydev)
  84. {
  85. return phy_set_bits(phydev, MII_ECTRL, MII_ECTRL_CONFIG_EN);
  86. }
  87. static int tja11xx_enable_link_control(struct phy_device *phydev)
  88. {
  89. return phy_set_bits(phydev, MII_ECTRL, MII_ECTRL_LINK_CONTROL);
  90. }
  91. static int tja11xx_wakeup(struct phy_device *phydev)
  92. {
  93. int ret;
  94. ret = phy_read(phydev, MII_ECTRL);
  95. if (ret < 0)
  96. return ret;
  97. switch (ret & MII_ECTRL_POWER_MODE_MASK) {
  98. case MII_ECTRL_POWER_MODE_NO_CHANGE:
  99. break;
  100. case MII_ECTRL_POWER_MODE_NORMAL:
  101. ret = phy_set_bits(phydev, MII_ECTRL, MII_ECTRL_WAKE_REQUEST);
  102. if (ret)
  103. return ret;
  104. ret = phy_clear_bits(phydev, MII_ECTRL, MII_ECTRL_WAKE_REQUEST);
  105. if (ret)
  106. return ret;
  107. break;
  108. case MII_ECTRL_POWER_MODE_STANDBY:
  109. ret = phy_modify_check(phydev, MII_ECTRL,
  110. MII_ECTRL_POWER_MODE_MASK,
  111. MII_ECTRL_POWER_MODE_STANDBY);
  112. if (ret)
  113. return ret;
  114. ret = phy_modify(phydev, MII_ECTRL, MII_ECTRL_POWER_MODE_MASK,
  115. MII_ECTRL_POWER_MODE_NORMAL);
  116. if (ret)
  117. return ret;
  118. ret = phy_modify_check(phydev, MII_GENSTAT,
  119. MII_GENSTAT_PLL_LOCKED,
  120. MII_GENSTAT_PLL_LOCKED);
  121. if (ret)
  122. return ret;
  123. return tja11xx_enable_link_control(phydev);
  124. default:
  125. break;
  126. }
  127. return 0;
  128. }
  129. static int tja11xx_soft_reset(struct phy_device *phydev)
  130. {
  131. int ret;
  132. ret = tja11xx_enable_reg_write(phydev);
  133. if (ret)
  134. return ret;
  135. return genphy_soft_reset(phydev);
  136. }
  137. static int tja11xx_config_init(struct phy_device *phydev)
  138. {
  139. int ret;
  140. ret = tja11xx_enable_reg_write(phydev);
  141. if (ret)
  142. return ret;
  143. phydev->autoneg = AUTONEG_DISABLE;
  144. phydev->speed = SPEED_100;
  145. phydev->duplex = DUPLEX_FULL;
  146. switch (phydev->phy_id & PHY_ID_MASK) {
  147. case PHY_ID_TJA1100:
  148. ret = phy_modify(phydev, MII_CFG1,
  149. MII_CFG1_AUTO_OP | MII_CFG1_LED_MODE_MASK |
  150. MII_CFG1_LED_ENABLE,
  151. MII_CFG1_AUTO_OP | MII_CFG1_LED_MODE_LINKUP |
  152. MII_CFG1_LED_ENABLE);
  153. if (ret)
  154. return ret;
  155. break;
  156. case PHY_ID_TJA1101:
  157. ret = phy_set_bits(phydev, MII_COMMCFG, MII_COMMCFG_AUTO_OP);
  158. if (ret)
  159. return ret;
  160. break;
  161. default:
  162. return -EINVAL;
  163. }
  164. ret = phy_clear_bits(phydev, MII_CFG1, MII_CFG1_SLEEP_CONFIRM);
  165. if (ret)
  166. return ret;
  167. ret = phy_modify(phydev, MII_CFG2, MII_CFG2_SLEEP_REQUEST_TO,
  168. MII_CFG2_SLEEP_REQUEST_TO_16MS);
  169. if (ret)
  170. return ret;
  171. ret = tja11xx_wakeup(phydev);
  172. if (ret < 0)
  173. return ret;
  174. /* ACK interrupts by reading the status register */
  175. ret = phy_read(phydev, MII_INTSRC);
  176. if (ret < 0)
  177. return ret;
  178. return 0;
  179. }
  180. static int tja11xx_read_status(struct phy_device *phydev)
  181. {
  182. int ret;
  183. ret = genphy_update_link(phydev);
  184. if (ret)
  185. return ret;
  186. if (phydev->link) {
  187. ret = phy_read(phydev, MII_COMMSTAT);
  188. if (ret < 0)
  189. return ret;
  190. if (!(ret & MII_COMMSTAT_LINK_UP))
  191. phydev->link = 0;
  192. }
  193. return 0;
  194. }
  195. static int tja11xx_get_sset_count(struct phy_device *phydev)
  196. {
  197. return ARRAY_SIZE(tja11xx_hw_stats);
  198. }
  199. static void tja11xx_get_strings(struct phy_device *phydev, u8 *data)
  200. {
  201. int i;
  202. for (i = 0; i < ARRAY_SIZE(tja11xx_hw_stats); i++) {
  203. strncpy(data + i * ETH_GSTRING_LEN,
  204. tja11xx_hw_stats[i].string, ETH_GSTRING_LEN);
  205. }
  206. }
  207. static void tja11xx_get_stats(struct phy_device *phydev,
  208. struct ethtool_stats *stats, u64 *data)
  209. {
  210. int i, ret;
  211. for (i = 0; i < ARRAY_SIZE(tja11xx_hw_stats); i++) {
  212. ret = phy_read(phydev, tja11xx_hw_stats[i].reg);
  213. if (ret < 0)
  214. data[i] = U64_MAX;
  215. else {
  216. data[i] = ret & tja11xx_hw_stats[i].mask;
  217. data[i] >>= tja11xx_hw_stats[i].off;
  218. }
  219. }
  220. }
  221. static int tja11xx_hwmon_read(struct device *dev,
  222. enum hwmon_sensor_types type,
  223. u32 attr, int channel, long *value)
  224. {
  225. struct phy_device *phydev = dev_get_drvdata(dev);
  226. int ret;
  227. if (type == hwmon_in && attr == hwmon_in_lcrit_alarm) {
  228. ret = phy_read(phydev, MII_INTSRC);
  229. if (ret < 0)
  230. return ret;
  231. *value = !!(ret & MII_INTSRC_TEMP_ERR);
  232. return 0;
  233. }
  234. if (type == hwmon_temp && attr == hwmon_temp_crit_alarm) {
  235. ret = phy_read(phydev, MII_INTSRC);
  236. if (ret < 0)
  237. return ret;
  238. *value = !!(ret & MII_INTSRC_UV_ERR);
  239. return 0;
  240. }
  241. return -EOPNOTSUPP;
  242. }
  243. static umode_t tja11xx_hwmon_is_visible(const void *data,
  244. enum hwmon_sensor_types type,
  245. u32 attr, int channel)
  246. {
  247. if (type == hwmon_in && attr == hwmon_in_lcrit_alarm)
  248. return 0444;
  249. if (type == hwmon_temp && attr == hwmon_temp_crit_alarm)
  250. return 0444;
  251. return 0;
  252. }
  253. static const struct hwmon_channel_info *tja11xx_hwmon_info[] = {
  254. HWMON_CHANNEL_INFO(in, HWMON_I_LCRIT_ALARM),
  255. HWMON_CHANNEL_INFO(temp, HWMON_T_CRIT_ALARM),
  256. NULL
  257. };
  258. static const struct hwmon_ops tja11xx_hwmon_hwmon_ops = {
  259. .is_visible = tja11xx_hwmon_is_visible,
  260. .read = tja11xx_hwmon_read,
  261. };
  262. static const struct hwmon_chip_info tja11xx_hwmon_chip_info = {
  263. .ops = &tja11xx_hwmon_hwmon_ops,
  264. .info = tja11xx_hwmon_info,
  265. };
  266. static int tja11xx_probe(struct phy_device *phydev)
  267. {
  268. struct device *dev = &phydev->mdio.dev;
  269. struct tja11xx_priv *priv;
  270. int i;
  271. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  272. if (!priv)
  273. return -ENOMEM;
  274. priv->hwmon_name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL);
  275. if (!priv->hwmon_name)
  276. return -ENOMEM;
  277. for (i = 0; priv->hwmon_name[i]; i++)
  278. if (hwmon_is_bad_char(priv->hwmon_name[i]))
  279. priv->hwmon_name[i] = '_';
  280. priv->hwmon_dev =
  281. devm_hwmon_device_register_with_info(dev, priv->hwmon_name,
  282. phydev,
  283. &tja11xx_hwmon_chip_info,
  284. NULL);
  285. return PTR_ERR_OR_ZERO(priv->hwmon_dev);
  286. }
  287. static struct phy_driver tja11xx_driver[] = {
  288. {
  289. PHY_ID_MATCH_MODEL(PHY_ID_TJA1100),
  290. .name = "NXP TJA1100",
  291. .features = PHY_BASIC_T1_FEATURES,
  292. .probe = tja11xx_probe,
  293. .soft_reset = tja11xx_soft_reset,
  294. .config_init = tja11xx_config_init,
  295. .read_status = tja11xx_read_status,
  296. .suspend = genphy_suspend,
  297. .resume = genphy_resume,
  298. .set_loopback = genphy_loopback,
  299. /* Statistics */
  300. .get_sset_count = tja11xx_get_sset_count,
  301. .get_strings = tja11xx_get_strings,
  302. .get_stats = tja11xx_get_stats,
  303. }, {
  304. PHY_ID_MATCH_MODEL(PHY_ID_TJA1101),
  305. .name = "NXP TJA1101",
  306. .features = PHY_BASIC_T1_FEATURES,
  307. .probe = tja11xx_probe,
  308. .soft_reset = tja11xx_soft_reset,
  309. .config_init = tja11xx_config_init,
  310. .read_status = tja11xx_read_status,
  311. .suspend = genphy_suspend,
  312. .resume = genphy_resume,
  313. .set_loopback = genphy_loopback,
  314. /* Statistics */
  315. .get_sset_count = tja11xx_get_sset_count,
  316. .get_strings = tja11xx_get_strings,
  317. .get_stats = tja11xx_get_stats,
  318. }
  319. };
  320. module_phy_driver(tja11xx_driver);
  321. static struct mdio_device_id __maybe_unused tja11xx_tbl[] = {
  322. { PHY_ID_MATCH_MODEL(PHY_ID_TJA1100) },
  323. { PHY_ID_MATCH_MODEL(PHY_ID_TJA1101) },
  324. { }
  325. };
  326. MODULE_DEVICE_TABLE(mdio, tja11xx_tbl);
  327. MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
  328. MODULE_DESCRIPTION("NXP TJA11xx BoardR-Reach PHY driver");
  329. MODULE_LICENSE("GPL");