nxp-tja11xx.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933
  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/ethtool_netlink.h>
  9. #include <linux/kernel.h>
  10. #include <linux/mdio.h>
  11. #include <linux/mii.h>
  12. #include <linux/module.h>
  13. #include <linux/of.h>
  14. #include <linux/phy.h>
  15. #include <linux/hwmon.h>
  16. #include <linux/bitfield.h>
  17. #include <linux/of_mdio.h>
  18. #include <linux/of_irq.h>
  19. #define PHY_ID_MASK 0xfffffff0
  20. #define PHY_ID_TJA1100 0x0180dc40
  21. #define PHY_ID_TJA1101 0x0180dd00
  22. #define PHY_ID_TJA1102 0x0180dc80
  23. #define PHY_ID_TJA1102S 0x0180dc90
  24. #define MII_ECTRL 17
  25. #define MII_ECTRL_LINK_CONTROL BIT(15)
  26. #define MII_ECTRL_POWER_MODE_MASK GENMASK(14, 11)
  27. #define MII_ECTRL_POWER_MODE_NO_CHANGE (0x0 << 11)
  28. #define MII_ECTRL_POWER_MODE_NORMAL (0x3 << 11)
  29. #define MII_ECTRL_POWER_MODE_SLEEP (0xa << 11)
  30. #define MII_ECTRL_POWER_MODE_STANDBY (0xc << 11)
  31. #define MII_ECTRL_CABLE_TEST BIT(5)
  32. #define MII_ECTRL_CONFIG_EN BIT(2)
  33. #define MII_ECTRL_WAKE_REQUEST BIT(0)
  34. #define MII_CFG1 18
  35. #define MII_CFG1_MASTER_SLAVE BIT(15)
  36. #define MII_CFG1_AUTO_OP BIT(14)
  37. #define MII_CFG1_INTERFACE_MODE_MASK GENMASK(9, 8)
  38. #define MII_CFG1_MII_MODE (0x0 << 8)
  39. #define MII_CFG1_RMII_MODE_REFCLK_IN BIT(8)
  40. #define MII_CFG1_RMII_MODE_REFCLK_OUT BIT(9)
  41. #define MII_CFG1_REVMII_MODE GENMASK(9, 8)
  42. #define MII_CFG1_SLEEP_CONFIRM BIT(6)
  43. #define MII_CFG1_LED_MODE_MASK GENMASK(5, 4)
  44. #define MII_CFG1_LED_MODE_LINKUP 0
  45. #define MII_CFG1_LED_ENABLE BIT(3)
  46. #define MII_CFG2 19
  47. #define MII_CFG2_SLEEP_REQUEST_TO GENMASK(1, 0)
  48. #define MII_CFG2_SLEEP_REQUEST_TO_16MS 0x3
  49. #define MII_INTSRC 21
  50. #define MII_INTSRC_LINK_FAIL BIT(10)
  51. #define MII_INTSRC_LINK_UP BIT(9)
  52. #define MII_INTSRC_MASK (MII_INTSRC_LINK_FAIL | MII_INTSRC_LINK_UP)
  53. #define MII_INTSRC_UV_ERR BIT(3)
  54. #define MII_INTSRC_TEMP_ERR BIT(1)
  55. #define MII_INTEN 22
  56. #define MII_INTEN_LINK_FAIL BIT(10)
  57. #define MII_INTEN_LINK_UP BIT(9)
  58. #define MII_INTEN_UV_ERR BIT(3)
  59. #define MII_INTEN_TEMP_ERR BIT(1)
  60. #define MII_COMMSTAT 23
  61. #define MII_COMMSTAT_LINK_UP BIT(15)
  62. #define MII_COMMSTAT_SQI_STATE GENMASK(7, 5)
  63. #define MII_COMMSTAT_SQI_MAX 7
  64. #define MII_GENSTAT 24
  65. #define MII_GENSTAT_PLL_LOCKED BIT(14)
  66. #define MII_EXTSTAT 25
  67. #define MII_EXTSTAT_SHORT_DETECT BIT(8)
  68. #define MII_EXTSTAT_OPEN_DETECT BIT(7)
  69. #define MII_EXTSTAT_POLARITY_DETECT BIT(6)
  70. #define MII_COMMCFG 27
  71. #define MII_COMMCFG_AUTO_OP BIT(15)
  72. #define MII_CFG3 28
  73. #define MII_CFG3_PHY_EN BIT(0)
  74. /* Configure REF_CLK as input in RMII mode */
  75. #define TJA110X_RMII_MODE_REFCLK_IN BIT(0)
  76. struct tja11xx_priv {
  77. struct phy_device *phydev;
  78. struct work_struct phy_register_work;
  79. u32 flags;
  80. };
  81. struct tja11xx_phy_stats {
  82. const char *string;
  83. u8 reg;
  84. u8 off;
  85. u16 mask;
  86. };
  87. static struct tja11xx_phy_stats tja11xx_hw_stats[] = {
  88. { "phy_symbol_error_count", 20, 0, GENMASK(15, 0) },
  89. { "phy_polarity_detect", 25, 6, BIT(6) },
  90. { "phy_open_detect", 25, 7, BIT(7) },
  91. { "phy_short_detect", 25, 8, BIT(8) },
  92. { "phy_rem_rcvr_count", 26, 0, GENMASK(7, 0) },
  93. { "phy_loc_rcvr_count", 26, 8, GENMASK(15, 8) },
  94. };
  95. static int tja11xx_check(struct phy_device *phydev, u8 reg, u16 mask, u16 set)
  96. {
  97. int val;
  98. return phy_read_poll_timeout(phydev, reg, val, (val & mask) == set,
  99. 150, 30000, false);
  100. }
  101. static int phy_modify_check(struct phy_device *phydev, u8 reg,
  102. u16 mask, u16 set)
  103. {
  104. int ret;
  105. ret = phy_modify(phydev, reg, mask, set);
  106. if (ret)
  107. return ret;
  108. return tja11xx_check(phydev, reg, mask, set);
  109. }
  110. static int tja11xx_enable_reg_write(struct phy_device *phydev)
  111. {
  112. return phy_set_bits(phydev, MII_ECTRL, MII_ECTRL_CONFIG_EN);
  113. }
  114. static int tja11xx_enable_link_control(struct phy_device *phydev)
  115. {
  116. return phy_set_bits(phydev, MII_ECTRL, MII_ECTRL_LINK_CONTROL);
  117. }
  118. static int tja11xx_disable_link_control(struct phy_device *phydev)
  119. {
  120. return phy_clear_bits(phydev, MII_ECTRL, MII_ECTRL_LINK_CONTROL);
  121. }
  122. static int tja11xx_wakeup(struct phy_device *phydev)
  123. {
  124. int ret;
  125. ret = phy_read(phydev, MII_ECTRL);
  126. if (ret < 0)
  127. return ret;
  128. switch (ret & MII_ECTRL_POWER_MODE_MASK) {
  129. case MII_ECTRL_POWER_MODE_NO_CHANGE:
  130. break;
  131. case MII_ECTRL_POWER_MODE_NORMAL:
  132. ret = phy_set_bits(phydev, MII_ECTRL, MII_ECTRL_WAKE_REQUEST);
  133. if (ret)
  134. return ret;
  135. ret = phy_clear_bits(phydev, MII_ECTRL, MII_ECTRL_WAKE_REQUEST);
  136. if (ret)
  137. return ret;
  138. break;
  139. case MII_ECTRL_POWER_MODE_STANDBY:
  140. ret = phy_modify_check(phydev, MII_ECTRL,
  141. MII_ECTRL_POWER_MODE_MASK,
  142. MII_ECTRL_POWER_MODE_STANDBY);
  143. if (ret)
  144. return ret;
  145. ret = phy_modify(phydev, MII_ECTRL, MII_ECTRL_POWER_MODE_MASK,
  146. MII_ECTRL_POWER_MODE_NORMAL);
  147. if (ret)
  148. return ret;
  149. ret = phy_modify_check(phydev, MII_GENSTAT,
  150. MII_GENSTAT_PLL_LOCKED,
  151. MII_GENSTAT_PLL_LOCKED);
  152. if (ret)
  153. return ret;
  154. return tja11xx_enable_link_control(phydev);
  155. case MII_ECTRL_POWER_MODE_SLEEP:
  156. switch (phydev->phy_id & PHY_ID_MASK) {
  157. case PHY_ID_TJA1102S:
  158. /* Enable PHY, maybe it is disabled due to pin strapping */
  159. return phy_set_bits(phydev, MII_CFG3, MII_CFG3_PHY_EN);
  160. default:
  161. return 0;
  162. }
  163. default:
  164. break;
  165. }
  166. return 0;
  167. }
  168. static int tja11xx_soft_reset(struct phy_device *phydev)
  169. {
  170. int ret;
  171. ret = tja11xx_enable_reg_write(phydev);
  172. if (ret)
  173. return ret;
  174. return genphy_soft_reset(phydev);
  175. }
  176. static int tja11xx_config_aneg_cable_test(struct phy_device *phydev)
  177. {
  178. bool finished = false;
  179. int ret;
  180. if (phydev->link)
  181. return 0;
  182. if (!phydev->drv->cable_test_start ||
  183. !phydev->drv->cable_test_get_status)
  184. return 0;
  185. ret = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_NTF);
  186. if (ret)
  187. return ret;
  188. ret = phydev->drv->cable_test_start(phydev);
  189. if (ret)
  190. return ret;
  191. /* According to the documentation this test takes 100 usec */
  192. usleep_range(100, 200);
  193. ret = phydev->drv->cable_test_get_status(phydev, &finished);
  194. if (ret)
  195. return ret;
  196. if (finished)
  197. ethnl_cable_test_finished(phydev);
  198. return 0;
  199. }
  200. static int tja11xx_config_aneg(struct phy_device *phydev)
  201. {
  202. int ret, changed = 0;
  203. u16 ctl = 0;
  204. switch (phydev->master_slave_set) {
  205. case MASTER_SLAVE_CFG_MASTER_FORCE:
  206. ctl |= MII_CFG1_MASTER_SLAVE;
  207. break;
  208. case MASTER_SLAVE_CFG_SLAVE_FORCE:
  209. break;
  210. case MASTER_SLAVE_CFG_UNKNOWN:
  211. case MASTER_SLAVE_CFG_UNSUPPORTED:
  212. goto do_test;
  213. default:
  214. phydev_warn(phydev, "Unsupported Master/Slave mode\n");
  215. return -ENOTSUPP;
  216. }
  217. changed = phy_modify_changed(phydev, MII_CFG1, MII_CFG1_MASTER_SLAVE, ctl);
  218. if (changed < 0)
  219. return changed;
  220. do_test:
  221. ret = tja11xx_config_aneg_cable_test(phydev);
  222. if (ret)
  223. return ret;
  224. return __genphy_config_aneg(phydev, changed);
  225. }
  226. static int tja11xx_get_interface_mode(struct phy_device *phydev)
  227. {
  228. struct tja11xx_priv *priv = phydev->priv;
  229. int mii_mode;
  230. switch (phydev->interface) {
  231. case PHY_INTERFACE_MODE_MII:
  232. mii_mode = MII_CFG1_MII_MODE;
  233. break;
  234. case PHY_INTERFACE_MODE_REVMII:
  235. mii_mode = MII_CFG1_REVMII_MODE;
  236. break;
  237. case PHY_INTERFACE_MODE_RMII:
  238. if (priv->flags & TJA110X_RMII_MODE_REFCLK_IN)
  239. mii_mode = MII_CFG1_RMII_MODE_REFCLK_IN;
  240. else
  241. mii_mode = MII_CFG1_RMII_MODE_REFCLK_OUT;
  242. break;
  243. default:
  244. return -EINVAL;
  245. }
  246. return mii_mode;
  247. }
  248. static int tja11xx_config_init(struct phy_device *phydev)
  249. {
  250. u16 reg_mask, reg_val;
  251. int ret;
  252. ret = tja11xx_enable_reg_write(phydev);
  253. if (ret)
  254. return ret;
  255. phydev->autoneg = AUTONEG_DISABLE;
  256. phydev->speed = SPEED_100;
  257. phydev->duplex = DUPLEX_FULL;
  258. switch (phydev->phy_id & PHY_ID_MASK) {
  259. case PHY_ID_TJA1100:
  260. reg_mask = MII_CFG1_AUTO_OP | MII_CFG1_LED_MODE_MASK |
  261. MII_CFG1_LED_ENABLE;
  262. reg_val = MII_CFG1_AUTO_OP | MII_CFG1_LED_MODE_LINKUP |
  263. MII_CFG1_LED_ENABLE;
  264. reg_mask |= MII_CFG1_INTERFACE_MODE_MASK;
  265. ret = tja11xx_get_interface_mode(phydev);
  266. if (ret < 0)
  267. return ret;
  268. reg_val |= (ret & 0xffff);
  269. ret = phy_modify(phydev, MII_CFG1, reg_mask, reg_val);
  270. if (ret)
  271. return ret;
  272. break;
  273. case PHY_ID_TJA1102S:
  274. case PHY_ID_TJA1101:
  275. reg_mask = MII_CFG1_INTERFACE_MODE_MASK;
  276. ret = tja11xx_get_interface_mode(phydev);
  277. if (ret < 0)
  278. return ret;
  279. reg_val = ret & 0xffff;
  280. ret = phy_modify(phydev, MII_CFG1, reg_mask, reg_val);
  281. if (ret)
  282. return ret;
  283. fallthrough;
  284. case PHY_ID_TJA1102:
  285. ret = phy_set_bits(phydev, MII_COMMCFG, MII_COMMCFG_AUTO_OP);
  286. if (ret)
  287. return ret;
  288. break;
  289. default:
  290. return -EINVAL;
  291. }
  292. ret = phy_clear_bits(phydev, MII_CFG1, MII_CFG1_SLEEP_CONFIRM);
  293. if (ret)
  294. return ret;
  295. ret = phy_modify(phydev, MII_CFG2, MII_CFG2_SLEEP_REQUEST_TO,
  296. MII_CFG2_SLEEP_REQUEST_TO_16MS);
  297. if (ret)
  298. return ret;
  299. ret = tja11xx_wakeup(phydev);
  300. if (ret < 0)
  301. return ret;
  302. /* ACK interrupts by reading the status register */
  303. ret = phy_read(phydev, MII_INTSRC);
  304. if (ret < 0)
  305. return ret;
  306. return 0;
  307. }
  308. static int tja11xx_read_status(struct phy_device *phydev)
  309. {
  310. int ret;
  311. phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN;
  312. phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
  313. ret = genphy_update_link(phydev);
  314. if (ret)
  315. return ret;
  316. ret = phy_read(phydev, MII_CFG1);
  317. if (ret < 0)
  318. return ret;
  319. if (ret & MII_CFG1_MASTER_SLAVE)
  320. phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE;
  321. else
  322. phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE;
  323. if (phydev->link) {
  324. ret = phy_read(phydev, MII_COMMSTAT);
  325. if (ret < 0)
  326. return ret;
  327. if (!(ret & MII_COMMSTAT_LINK_UP))
  328. phydev->link = 0;
  329. }
  330. return 0;
  331. }
  332. static int tja11xx_get_sqi(struct phy_device *phydev)
  333. {
  334. int ret;
  335. ret = phy_read(phydev, MII_COMMSTAT);
  336. if (ret < 0)
  337. return ret;
  338. return FIELD_GET(MII_COMMSTAT_SQI_STATE, ret);
  339. }
  340. static int tja11xx_get_sqi_max(struct phy_device *phydev)
  341. {
  342. return MII_COMMSTAT_SQI_MAX;
  343. }
  344. static int tja11xx_get_sset_count(struct phy_device *phydev)
  345. {
  346. return ARRAY_SIZE(tja11xx_hw_stats);
  347. }
  348. static void tja11xx_get_strings(struct phy_device *phydev, u8 *data)
  349. {
  350. int i;
  351. for (i = 0; i < ARRAY_SIZE(tja11xx_hw_stats); i++)
  352. ethtool_puts(&data, tja11xx_hw_stats[i].string);
  353. }
  354. static void tja11xx_get_stats(struct phy_device *phydev,
  355. struct ethtool_stats *stats, u64 *data)
  356. {
  357. int i, ret;
  358. for (i = 0; i < ARRAY_SIZE(tja11xx_hw_stats); i++) {
  359. ret = phy_read(phydev, tja11xx_hw_stats[i].reg);
  360. if (ret < 0)
  361. data[i] = U64_MAX;
  362. else {
  363. data[i] = ret & tja11xx_hw_stats[i].mask;
  364. data[i] >>= tja11xx_hw_stats[i].off;
  365. }
  366. }
  367. }
  368. static int tja11xx_hwmon_read(struct device *dev,
  369. enum hwmon_sensor_types type,
  370. u32 attr, int channel, long *value)
  371. {
  372. struct phy_device *phydev = dev_get_drvdata(dev);
  373. int ret;
  374. if (type == hwmon_in && attr == hwmon_in_lcrit_alarm) {
  375. ret = phy_read(phydev, MII_INTSRC);
  376. if (ret < 0)
  377. return ret;
  378. *value = !!(ret & MII_INTSRC_TEMP_ERR);
  379. return 0;
  380. }
  381. if (type == hwmon_temp && attr == hwmon_temp_crit_alarm) {
  382. ret = phy_read(phydev, MII_INTSRC);
  383. if (ret < 0)
  384. return ret;
  385. *value = !!(ret & MII_INTSRC_UV_ERR);
  386. return 0;
  387. }
  388. return -EOPNOTSUPP;
  389. }
  390. static umode_t tja11xx_hwmon_is_visible(const void *data,
  391. enum hwmon_sensor_types type,
  392. u32 attr, int channel)
  393. {
  394. if (type == hwmon_in && attr == hwmon_in_lcrit_alarm)
  395. return 0444;
  396. if (type == hwmon_temp && attr == hwmon_temp_crit_alarm)
  397. return 0444;
  398. return 0;
  399. }
  400. static const struct hwmon_channel_info * const tja11xx_hwmon_info[] = {
  401. HWMON_CHANNEL_INFO(in, HWMON_I_LCRIT_ALARM),
  402. HWMON_CHANNEL_INFO(temp, HWMON_T_CRIT_ALARM),
  403. NULL
  404. };
  405. static const struct hwmon_ops tja11xx_hwmon_hwmon_ops = {
  406. .is_visible = tja11xx_hwmon_is_visible,
  407. .read = tja11xx_hwmon_read,
  408. };
  409. static const struct hwmon_chip_info tja11xx_hwmon_chip_info = {
  410. .ops = &tja11xx_hwmon_hwmon_ops,
  411. .info = tja11xx_hwmon_info,
  412. };
  413. static int tja11xx_hwmon_register(struct phy_device *phydev,
  414. struct tja11xx_priv *priv)
  415. {
  416. struct device *hdev, *dev = &phydev->mdio.dev;
  417. hdev = devm_hwmon_device_register_with_info(dev, NULL, phydev,
  418. &tja11xx_hwmon_chip_info,
  419. NULL);
  420. return PTR_ERR_OR_ZERO(hdev);
  421. }
  422. static int tja11xx_parse_dt(struct phy_device *phydev)
  423. {
  424. struct device_node *node = phydev->mdio.dev.of_node;
  425. struct tja11xx_priv *priv = phydev->priv;
  426. if (!IS_ENABLED(CONFIG_OF_MDIO))
  427. return 0;
  428. if (of_property_read_bool(node, "nxp,rmii-refclk-in"))
  429. priv->flags |= TJA110X_RMII_MODE_REFCLK_IN;
  430. return 0;
  431. }
  432. static int tja11xx_probe(struct phy_device *phydev)
  433. {
  434. struct device *dev = &phydev->mdio.dev;
  435. struct tja11xx_priv *priv;
  436. int ret;
  437. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  438. if (!priv)
  439. return -ENOMEM;
  440. priv->phydev = phydev;
  441. phydev->priv = priv;
  442. ret = tja11xx_parse_dt(phydev);
  443. if (ret)
  444. return ret;
  445. return tja11xx_hwmon_register(phydev, priv);
  446. }
  447. static void tja1102_p1_register(struct work_struct *work)
  448. {
  449. struct tja11xx_priv *priv = container_of(work, struct tja11xx_priv,
  450. phy_register_work);
  451. struct phy_device *phydev_phy0 = priv->phydev;
  452. struct mii_bus *bus = phydev_phy0->mdio.bus;
  453. struct device *dev = &phydev_phy0->mdio.dev;
  454. struct device_node *np = dev->of_node;
  455. struct device_node *child;
  456. int ret;
  457. for_each_available_child_of_node(np, child) {
  458. struct phy_device *phy;
  459. int addr;
  460. addr = of_mdio_parse_addr(dev, child);
  461. if (addr < 0) {
  462. dev_err(dev, "Can't parse addr\n");
  463. continue;
  464. } else if (addr != phydev_phy0->mdio.addr + 1) {
  465. /* Currently we care only about double PHY chip TJA1102.
  466. * If some day NXP will decide to bring chips with more
  467. * PHYs, this logic should be reworked.
  468. */
  469. dev_err(dev, "Unexpected address. Should be: %i\n",
  470. phydev_phy0->mdio.addr + 1);
  471. continue;
  472. }
  473. if (mdiobus_is_registered_device(bus, addr)) {
  474. dev_err(dev, "device is already registered\n");
  475. continue;
  476. }
  477. /* Real PHY ID of Port 1 is 0 */
  478. phy = phy_device_create(bus, addr, PHY_ID_TJA1102, false, NULL);
  479. if (IS_ERR(phy)) {
  480. dev_err(dev, "Can't create PHY device for Port 1: %i\n",
  481. addr);
  482. continue;
  483. }
  484. /* Overwrite parent device. phy_device_create() set parent to
  485. * the mii_bus->dev, which is not correct in case.
  486. */
  487. phy->mdio.dev.parent = dev;
  488. ret = of_mdiobus_phy_device_register(bus, phy, child, addr);
  489. if (ret) {
  490. /* All resources needed for Port 1 should be already
  491. * available for Port 0. Both ports use the same
  492. * interrupt line, so -EPROBE_DEFER would make no sense
  493. * here.
  494. */
  495. dev_err(dev, "Can't register Port 1. Unexpected error: %i\n",
  496. ret);
  497. phy_device_free(phy);
  498. }
  499. }
  500. }
  501. static int tja1102_p0_probe(struct phy_device *phydev)
  502. {
  503. struct device *dev = &phydev->mdio.dev;
  504. struct tja11xx_priv *priv;
  505. int ret;
  506. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  507. if (!priv)
  508. return -ENOMEM;
  509. priv->phydev = phydev;
  510. INIT_WORK(&priv->phy_register_work, tja1102_p1_register);
  511. ret = tja11xx_hwmon_register(phydev, priv);
  512. if (ret)
  513. return ret;
  514. schedule_work(&priv->phy_register_work);
  515. return 0;
  516. }
  517. static int tja1102_match_phy_device(struct phy_device *phydev, bool port0)
  518. {
  519. int ret;
  520. if ((phydev->phy_id & PHY_ID_MASK) != PHY_ID_TJA1102)
  521. return 0;
  522. ret = phy_read(phydev, MII_PHYSID2);
  523. if (ret < 0)
  524. return ret;
  525. /* TJA1102 Port 1 has phyid 0 and doesn't support temperature
  526. * and undervoltage alarms.
  527. */
  528. if (port0)
  529. return ret ? 1 : 0;
  530. return !ret;
  531. }
  532. static int tja1102_p0_match_phy_device(struct phy_device *phydev,
  533. const struct phy_driver *phydrv)
  534. {
  535. return tja1102_match_phy_device(phydev, true);
  536. }
  537. static int tja1102_p1_match_phy_device(struct phy_device *phydev,
  538. const struct phy_driver *phydrv)
  539. {
  540. return tja1102_match_phy_device(phydev, false);
  541. }
  542. static int tja11xx_ack_interrupt(struct phy_device *phydev)
  543. {
  544. int ret;
  545. ret = phy_read(phydev, MII_INTSRC);
  546. return (ret < 0) ? ret : 0;
  547. }
  548. static int tja11xx_config_intr(struct phy_device *phydev)
  549. {
  550. int value = 0;
  551. int err;
  552. if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
  553. err = tja11xx_ack_interrupt(phydev);
  554. if (err)
  555. return err;
  556. value = MII_INTEN_LINK_FAIL | MII_INTEN_LINK_UP |
  557. MII_INTEN_UV_ERR | MII_INTEN_TEMP_ERR;
  558. err = phy_write(phydev, MII_INTEN, value);
  559. } else {
  560. err = phy_write(phydev, MII_INTEN, value);
  561. if (err)
  562. return err;
  563. err = tja11xx_ack_interrupt(phydev);
  564. }
  565. return err;
  566. }
  567. static irqreturn_t tja11xx_handle_interrupt(struct phy_device *phydev)
  568. {
  569. struct device *dev = &phydev->mdio.dev;
  570. int irq_status;
  571. irq_status = phy_read(phydev, MII_INTSRC);
  572. if (irq_status < 0) {
  573. phy_error(phydev);
  574. return IRQ_NONE;
  575. }
  576. if (irq_status & MII_INTSRC_TEMP_ERR)
  577. dev_warn(dev, "Overtemperature error detected (temp > 155C°).\n");
  578. if (irq_status & MII_INTSRC_UV_ERR)
  579. dev_warn(dev, "Undervoltage error detected.\n");
  580. if (!(irq_status & MII_INTSRC_MASK))
  581. return IRQ_NONE;
  582. phy_trigger_machine(phydev);
  583. return IRQ_HANDLED;
  584. }
  585. static int tja11xx_cable_test_start(struct phy_device *phydev)
  586. {
  587. int ret;
  588. ret = phy_clear_bits(phydev, MII_COMMCFG, MII_COMMCFG_AUTO_OP);
  589. if (ret)
  590. return ret;
  591. ret = tja11xx_wakeup(phydev);
  592. if (ret < 0)
  593. return ret;
  594. ret = tja11xx_disable_link_control(phydev);
  595. if (ret < 0)
  596. return ret;
  597. return phy_set_bits(phydev, MII_ECTRL, MII_ECTRL_CABLE_TEST);
  598. }
  599. /*
  600. * | BI_DA+ | BI_DA- | Result
  601. * | open | open | open
  602. * | + short to - | - short to + | short
  603. * | short to Vdd | open | open
  604. * | open | shot to Vdd | open
  605. * | short to Vdd | short to Vdd | short
  606. * | shot to GND | open | open
  607. * | open | shot to GND | open
  608. * | short to GND | shot to GND | short
  609. * | connected to active link partner (master) | shot and open
  610. */
  611. static int tja11xx_cable_test_report_trans(u32 result)
  612. {
  613. u32 mask = MII_EXTSTAT_SHORT_DETECT | MII_EXTSTAT_OPEN_DETECT;
  614. if ((result & mask) == mask) {
  615. /* connected to active link partner (master) */
  616. return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
  617. } else if ((result & mask) == 0) {
  618. return ETHTOOL_A_CABLE_RESULT_CODE_OK;
  619. } else if (result & MII_EXTSTAT_SHORT_DETECT) {
  620. return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
  621. } else if (result & MII_EXTSTAT_OPEN_DETECT) {
  622. return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
  623. } else {
  624. return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
  625. }
  626. }
  627. static int tja11xx_cable_test_report(struct phy_device *phydev)
  628. {
  629. int ret;
  630. ret = phy_read(phydev, MII_EXTSTAT);
  631. if (ret < 0)
  632. return ret;
  633. ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A,
  634. tja11xx_cable_test_report_trans(ret));
  635. return 0;
  636. }
  637. static int tja11xx_cable_test_get_status(struct phy_device *phydev,
  638. bool *finished)
  639. {
  640. int ret;
  641. *finished = false;
  642. ret = phy_read(phydev, MII_ECTRL);
  643. if (ret < 0)
  644. return ret;
  645. if (!(ret & MII_ECTRL_CABLE_TEST)) {
  646. *finished = true;
  647. ret = phy_set_bits(phydev, MII_COMMCFG, MII_COMMCFG_AUTO_OP);
  648. if (ret)
  649. return ret;
  650. return tja11xx_cable_test_report(phydev);
  651. }
  652. return 0;
  653. }
  654. static struct phy_driver tja11xx_driver[] = {
  655. {
  656. PHY_ID_MATCH_MODEL(PHY_ID_TJA1100),
  657. .name = "NXP TJA1100",
  658. .features = PHY_BASIC_T1_FEATURES,
  659. .probe = tja11xx_probe,
  660. .soft_reset = tja11xx_soft_reset,
  661. .config_aneg = tja11xx_config_aneg,
  662. .config_init = tja11xx_config_init,
  663. .read_status = tja11xx_read_status,
  664. .get_sqi = tja11xx_get_sqi,
  665. .get_sqi_max = tja11xx_get_sqi_max,
  666. .suspend = genphy_suspend,
  667. .resume = genphy_resume,
  668. .set_loopback = genphy_loopback,
  669. /* Statistics */
  670. .get_sset_count = tja11xx_get_sset_count,
  671. .get_strings = tja11xx_get_strings,
  672. .get_stats = tja11xx_get_stats,
  673. }, {
  674. PHY_ID_MATCH_MODEL(PHY_ID_TJA1101),
  675. .name = "NXP TJA1101",
  676. .features = PHY_BASIC_T1_FEATURES,
  677. .probe = tja11xx_probe,
  678. .soft_reset = tja11xx_soft_reset,
  679. .config_aneg = tja11xx_config_aneg,
  680. .config_init = tja11xx_config_init,
  681. .read_status = tja11xx_read_status,
  682. .get_sqi = tja11xx_get_sqi,
  683. .get_sqi_max = tja11xx_get_sqi_max,
  684. .suspend = genphy_suspend,
  685. .resume = genphy_resume,
  686. .set_loopback = genphy_loopback,
  687. /* Statistics */
  688. .get_sset_count = tja11xx_get_sset_count,
  689. .get_strings = tja11xx_get_strings,
  690. .get_stats = tja11xx_get_stats,
  691. }, {
  692. .name = "NXP TJA1102 Port 0",
  693. .features = PHY_BASIC_T1_FEATURES,
  694. .flags = PHY_POLL_CABLE_TEST,
  695. .probe = tja1102_p0_probe,
  696. .soft_reset = tja11xx_soft_reset,
  697. .config_aneg = tja11xx_config_aneg,
  698. .config_init = tja11xx_config_init,
  699. .read_status = tja11xx_read_status,
  700. .get_sqi = tja11xx_get_sqi,
  701. .get_sqi_max = tja11xx_get_sqi_max,
  702. .match_phy_device = tja1102_p0_match_phy_device,
  703. .suspend = genphy_suspend,
  704. .resume = genphy_resume,
  705. .set_loopback = genphy_loopback,
  706. /* Statistics */
  707. .get_sset_count = tja11xx_get_sset_count,
  708. .get_strings = tja11xx_get_strings,
  709. .get_stats = tja11xx_get_stats,
  710. .config_intr = tja11xx_config_intr,
  711. .handle_interrupt = tja11xx_handle_interrupt,
  712. .cable_test_start = tja11xx_cable_test_start,
  713. .cable_test_get_status = tja11xx_cable_test_get_status,
  714. }, {
  715. .name = "NXP TJA1102 Port 1",
  716. .features = PHY_BASIC_T1_FEATURES,
  717. .flags = PHY_POLL_CABLE_TEST,
  718. /* currently no probe for Port 1 is need */
  719. .soft_reset = tja11xx_soft_reset,
  720. .config_aneg = tja11xx_config_aneg,
  721. .config_init = tja11xx_config_init,
  722. .read_status = tja11xx_read_status,
  723. .get_sqi = tja11xx_get_sqi,
  724. .get_sqi_max = tja11xx_get_sqi_max,
  725. .match_phy_device = tja1102_p1_match_phy_device,
  726. .suspend = genphy_suspend,
  727. .resume = genphy_resume,
  728. .set_loopback = genphy_loopback,
  729. /* Statistics */
  730. .get_sset_count = tja11xx_get_sset_count,
  731. .get_strings = tja11xx_get_strings,
  732. .get_stats = tja11xx_get_stats,
  733. .config_intr = tja11xx_config_intr,
  734. .handle_interrupt = tja11xx_handle_interrupt,
  735. .cable_test_start = tja11xx_cable_test_start,
  736. .cable_test_get_status = tja11xx_cable_test_get_status,
  737. }, {
  738. PHY_ID_MATCH_MODEL(PHY_ID_TJA1102S),
  739. .name = "NXP TJA1102S",
  740. .features = PHY_BASIC_T1_FEATURES,
  741. .flags = PHY_POLL_CABLE_TEST,
  742. .probe = tja11xx_probe,
  743. .soft_reset = tja11xx_soft_reset,
  744. .config_aneg = tja11xx_config_aneg,
  745. .config_init = tja11xx_config_init,
  746. .read_status = tja11xx_read_status,
  747. .get_sqi = tja11xx_get_sqi,
  748. .get_sqi_max = tja11xx_get_sqi_max,
  749. .suspend = genphy_suspend,
  750. .resume = genphy_resume,
  751. .set_loopback = genphy_loopback,
  752. /* Statistics */
  753. .get_sset_count = tja11xx_get_sset_count,
  754. .get_strings = tja11xx_get_strings,
  755. .get_stats = tja11xx_get_stats,
  756. .config_intr = tja11xx_config_intr,
  757. .handle_interrupt = tja11xx_handle_interrupt,
  758. .cable_test_start = tja11xx_cable_test_start,
  759. .cable_test_get_status = tja11xx_cable_test_get_status,
  760. }
  761. };
  762. module_phy_driver(tja11xx_driver);
  763. static const struct mdio_device_id __maybe_unused tja11xx_tbl[] = {
  764. { PHY_ID_MATCH_MODEL(PHY_ID_TJA1100) },
  765. { PHY_ID_MATCH_MODEL(PHY_ID_TJA1101) },
  766. { PHY_ID_MATCH_MODEL(PHY_ID_TJA1102) },
  767. { PHY_ID_MATCH_MODEL(PHY_ID_TJA1102S) },
  768. { }
  769. };
  770. MODULE_DEVICE_TABLE(mdio, tja11xx_tbl);
  771. MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
  772. MODULE_DESCRIPTION("NXP TJA11xx BoardR-Reach PHY driver");
  773. MODULE_LICENSE("GPL");