hns_mdio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2014-2015 Hisilicon Limited.
  4. */
  5. #include <linux/acpi.h>
  6. #include <linux/errno.h>
  7. #include <linux/etherdevice.h>
  8. #include <linux/init.h>
  9. #include <linux/kernel.h>
  10. #include <linux/mfd/syscon.h>
  11. #include <linux/module.h>
  12. #include <linux/mutex.h>
  13. #include <linux/netdevice.h>
  14. #include <linux/of_address.h>
  15. #include <linux/of.h>
  16. #include <linux/of_mdio.h>
  17. #include <linux/of_platform.h>
  18. #include <linux/phy.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/regmap.h>
  21. #define MDIO_DRV_NAME "Hi-HNS_MDIO"
  22. #define MDIO_BUS_NAME "Hisilicon MII Bus"
  23. #define MDIO_TIMEOUT 1000000
  24. struct hns_mdio_sc_reg {
  25. u16 mdio_clk_en;
  26. u16 mdio_clk_dis;
  27. u16 mdio_reset_req;
  28. u16 mdio_reset_dreq;
  29. u16 mdio_clk_st;
  30. u16 mdio_reset_st;
  31. };
  32. struct hns_mdio_device {
  33. u8 __iomem *vbase; /* mdio reg base address */
  34. struct regmap *subctrl_vbase;
  35. struct hns_mdio_sc_reg sc_reg;
  36. };
  37. /* mdio reg */
  38. #define MDIO_COMMAND_REG 0x0
  39. #define MDIO_ADDR_REG 0x4
  40. #define MDIO_WDATA_REG 0x8
  41. #define MDIO_RDATA_REG 0xc
  42. #define MDIO_STA_REG 0x10
  43. /* cfg phy bit map */
  44. #define MDIO_CMD_DEVAD_M 0x1f
  45. #define MDIO_CMD_DEVAD_S 0
  46. #define MDIO_CMD_PRTAD_M 0x1f
  47. #define MDIO_CMD_PRTAD_S 5
  48. #define MDIO_CMD_OP_S 10
  49. #define MDIO_CMD_ST_S 12
  50. #define MDIO_CMD_START_B 14
  51. #define MDIO_ADDR_DATA_M 0xffff
  52. #define MDIO_ADDR_DATA_S 0
  53. #define MDIO_WDATA_DATA_M 0xffff
  54. #define MDIO_WDATA_DATA_S 0
  55. #define MDIO_RDATA_DATA_M 0xffff
  56. #define MDIO_RDATA_DATA_S 0
  57. #define MDIO_STATE_STA_B 0
  58. enum mdio_st_clause {
  59. MDIO_ST_CLAUSE_45 = 0,
  60. MDIO_ST_CLAUSE_22
  61. };
  62. enum mdio_c22_op_seq {
  63. MDIO_C22_WRITE = 1,
  64. MDIO_C22_READ = 2
  65. };
  66. enum mdio_c45_op_seq {
  67. MDIO_C45_WRITE_ADDR = 0,
  68. MDIO_C45_WRITE_DATA,
  69. MDIO_C45_READ_INCREMENT,
  70. MDIO_C45_READ
  71. };
  72. /* peri subctrl reg */
  73. #define MDIO_SC_CLK_EN 0x338
  74. #define MDIO_SC_CLK_DIS 0x33C
  75. #define MDIO_SC_RESET_REQ 0xA38
  76. #define MDIO_SC_RESET_DREQ 0xA3C
  77. #define MDIO_SC_CLK_ST 0x531C
  78. #define MDIO_SC_RESET_ST 0x5A1C
  79. static void mdio_write_reg(u8 __iomem *base, u32 reg, u32 value)
  80. {
  81. writel_relaxed(value, base + reg);
  82. }
  83. #define MDIO_WRITE_REG(a, reg, value) \
  84. mdio_write_reg((a)->vbase, (reg), (value))
  85. static u32 mdio_read_reg(u8 __iomem *base, u32 reg)
  86. {
  87. return readl_relaxed(base + reg);
  88. }
  89. #define mdio_set_field(origin, mask, shift, val) \
  90. do { \
  91. (origin) &= (~((mask) << (shift))); \
  92. (origin) |= (((val) & (mask)) << (shift)); \
  93. } while (0)
  94. #define mdio_get_field(origin, mask, shift) (((origin) >> (shift)) & (mask))
  95. static void mdio_set_reg_field(u8 __iomem *base, u32 reg, u32 mask, u32 shift,
  96. u32 val)
  97. {
  98. u32 origin = mdio_read_reg(base, reg);
  99. mdio_set_field(origin, mask, shift, val);
  100. mdio_write_reg(base, reg, origin);
  101. }
  102. #define MDIO_SET_REG_FIELD(dev, reg, mask, shift, val) \
  103. mdio_set_reg_field((dev)->vbase, (reg), (mask), (shift), (val))
  104. static u32 mdio_get_reg_field(u8 __iomem *base, u32 reg, u32 mask, u32 shift)
  105. {
  106. u32 origin;
  107. origin = mdio_read_reg(base, reg);
  108. return mdio_get_field(origin, mask, shift);
  109. }
  110. #define MDIO_GET_REG_FIELD(dev, reg, mask, shift) \
  111. mdio_get_reg_field((dev)->vbase, (reg), (mask), (shift))
  112. #define MDIO_GET_REG_BIT(dev, reg, bit) \
  113. mdio_get_reg_field((dev)->vbase, (reg), 0x1ull, (bit))
  114. #define MDIO_CHECK_SET_ST 1
  115. #define MDIO_CHECK_CLR_ST 0
  116. static int mdio_sc_cfg_reg_write(struct hns_mdio_device *mdio_dev,
  117. u32 cfg_reg, u32 set_val,
  118. u32 st_reg, u32 st_msk, u8 check_st)
  119. {
  120. u32 time_cnt;
  121. u32 reg_value;
  122. int ret;
  123. regmap_write(mdio_dev->subctrl_vbase, cfg_reg, set_val);
  124. for (time_cnt = MDIO_TIMEOUT; time_cnt; time_cnt--) {
  125. ret = regmap_read(mdio_dev->subctrl_vbase, st_reg, &reg_value);
  126. if (ret)
  127. return ret;
  128. reg_value &= st_msk;
  129. if ((!!check_st) == (!!reg_value))
  130. break;
  131. }
  132. if ((!!check_st) != (!!reg_value))
  133. return -EBUSY;
  134. return 0;
  135. }
  136. static int hns_mdio_wait_ready(struct mii_bus *bus)
  137. {
  138. struct hns_mdio_device *mdio_dev = bus->priv;
  139. u32 cmd_reg_value;
  140. int i;
  141. /* waiting for MDIO_COMMAND_REG's mdio_start==0 */
  142. /* after that can do read or write*/
  143. for (i = 0; i < MDIO_TIMEOUT; i++) {
  144. cmd_reg_value = MDIO_GET_REG_BIT(mdio_dev,
  145. MDIO_COMMAND_REG,
  146. MDIO_CMD_START_B);
  147. if (!cmd_reg_value)
  148. break;
  149. }
  150. if ((i == MDIO_TIMEOUT) && cmd_reg_value)
  151. return -ETIMEDOUT;
  152. return 0;
  153. }
  154. static void hns_mdio_cmd_write(struct hns_mdio_device *mdio_dev,
  155. u8 is_c45, u8 op, u8 phy_id, u16 cmd)
  156. {
  157. u32 cmd_reg_value;
  158. u8 st = is_c45 ? MDIO_ST_CLAUSE_45 : MDIO_ST_CLAUSE_22;
  159. cmd_reg_value = st << MDIO_CMD_ST_S;
  160. cmd_reg_value |= op << MDIO_CMD_OP_S;
  161. cmd_reg_value |=
  162. (phy_id & MDIO_CMD_PRTAD_M) << MDIO_CMD_PRTAD_S;
  163. cmd_reg_value |= (cmd & MDIO_CMD_DEVAD_M) << MDIO_CMD_DEVAD_S;
  164. cmd_reg_value |= 1 << MDIO_CMD_START_B;
  165. MDIO_WRITE_REG(mdio_dev, MDIO_COMMAND_REG, cmd_reg_value);
  166. }
  167. /**
  168. * hns_mdio_write - access phy register
  169. * @bus: mdio bus
  170. * @phy_id: phy id
  171. * @regnum: register num
  172. * @data: register value
  173. *
  174. * Return 0 on success, negative on failure
  175. */
  176. static int hns_mdio_write(struct mii_bus *bus,
  177. int phy_id, int regnum, u16 data)
  178. {
  179. int ret;
  180. struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
  181. u8 devad = ((regnum >> 16) & 0x1f);
  182. u8 is_c45 = !!(regnum & MII_ADDR_C45);
  183. u16 reg = (u16)(regnum & 0xffff);
  184. u8 op;
  185. u16 cmd_reg_cfg;
  186. dev_dbg(&bus->dev, "mdio write %s,base is %p\n",
  187. bus->id, mdio_dev->vbase);
  188. dev_dbg(&bus->dev, "phy id=%d, is_c45=%d, devad=%d, reg=%#x, write data=%d\n",
  189. phy_id, is_c45, devad, reg, data);
  190. /* wait for ready */
  191. ret = hns_mdio_wait_ready(bus);
  192. if (ret) {
  193. dev_err(&bus->dev, "MDIO bus is busy\n");
  194. return ret;
  195. }
  196. if (!is_c45) {
  197. cmd_reg_cfg = reg;
  198. op = MDIO_C22_WRITE;
  199. } else {
  200. /* config the cmd-reg to write addr*/
  201. MDIO_SET_REG_FIELD(mdio_dev, MDIO_ADDR_REG, MDIO_ADDR_DATA_M,
  202. MDIO_ADDR_DATA_S, reg);
  203. hns_mdio_cmd_write(mdio_dev, is_c45,
  204. MDIO_C45_WRITE_ADDR, phy_id, devad);
  205. /* check for read or write opt is finished */
  206. ret = hns_mdio_wait_ready(bus);
  207. if (ret) {
  208. dev_err(&bus->dev, "MDIO bus is busy\n");
  209. return ret;
  210. }
  211. /* config the data needed writing */
  212. cmd_reg_cfg = devad;
  213. op = MDIO_C45_WRITE_DATA;
  214. }
  215. MDIO_SET_REG_FIELD(mdio_dev, MDIO_WDATA_REG, MDIO_WDATA_DATA_M,
  216. MDIO_WDATA_DATA_S, data);
  217. hns_mdio_cmd_write(mdio_dev, is_c45, op, phy_id, cmd_reg_cfg);
  218. return 0;
  219. }
  220. /**
  221. * hns_mdio_read - access phy register
  222. * @bus: mdio bus
  223. * @phy_id: phy id
  224. * @regnum: register num
  225. *
  226. * Return phy register value
  227. */
  228. static int hns_mdio_read(struct mii_bus *bus, int phy_id, int regnum)
  229. {
  230. int ret;
  231. u16 reg_val;
  232. u8 devad = ((regnum >> 16) & 0x1f);
  233. u8 is_c45 = !!(regnum & MII_ADDR_C45);
  234. u16 reg = (u16)(regnum & 0xffff);
  235. struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
  236. dev_dbg(&bus->dev, "mdio read %s,base is %p\n",
  237. bus->id, mdio_dev->vbase);
  238. dev_dbg(&bus->dev, "phy id=%d, is_c45=%d, devad=%d, reg=%#x!\n",
  239. phy_id, is_c45, devad, reg);
  240. /* Step 1: wait for ready */
  241. ret = hns_mdio_wait_ready(bus);
  242. if (ret) {
  243. dev_err(&bus->dev, "MDIO bus is busy\n");
  244. return ret;
  245. }
  246. if (!is_c45) {
  247. hns_mdio_cmd_write(mdio_dev, is_c45,
  248. MDIO_C22_READ, phy_id, reg);
  249. } else {
  250. MDIO_SET_REG_FIELD(mdio_dev, MDIO_ADDR_REG, MDIO_ADDR_DATA_M,
  251. MDIO_ADDR_DATA_S, reg);
  252. /* Step 2; config the cmd-reg to write addr*/
  253. hns_mdio_cmd_write(mdio_dev, is_c45,
  254. MDIO_C45_WRITE_ADDR, phy_id, devad);
  255. /* Step 3: check for read or write opt is finished */
  256. ret = hns_mdio_wait_ready(bus);
  257. if (ret) {
  258. dev_err(&bus->dev, "MDIO bus is busy\n");
  259. return ret;
  260. }
  261. hns_mdio_cmd_write(mdio_dev, is_c45,
  262. MDIO_C45_READ, phy_id, devad);
  263. }
  264. /* Step 5: waiting for MDIO_COMMAND_REG's mdio_start==0,*/
  265. /* check for read or write opt is finished */
  266. ret = hns_mdio_wait_ready(bus);
  267. if (ret) {
  268. dev_err(&bus->dev, "MDIO bus is busy\n");
  269. return ret;
  270. }
  271. reg_val = MDIO_GET_REG_BIT(mdio_dev, MDIO_STA_REG, MDIO_STATE_STA_B);
  272. if (reg_val) {
  273. dev_err(&bus->dev, " ERROR! MDIO Read failed!\n");
  274. return -EBUSY;
  275. }
  276. /* Step 6; get out data*/
  277. reg_val = (u16)MDIO_GET_REG_FIELD(mdio_dev, MDIO_RDATA_REG,
  278. MDIO_RDATA_DATA_M, MDIO_RDATA_DATA_S);
  279. return reg_val;
  280. }
  281. /**
  282. * hns_mdio_reset - reset mdio bus
  283. * @bus: mdio bus
  284. *
  285. * Return 0 on success, negative on failure
  286. */
  287. static int hns_mdio_reset(struct mii_bus *bus)
  288. {
  289. struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
  290. const struct hns_mdio_sc_reg *sc_reg;
  291. int ret;
  292. if (dev_of_node(bus->parent)) {
  293. if (!mdio_dev->subctrl_vbase) {
  294. dev_err(&bus->dev, "mdio sys ctl reg has not mapped\n");
  295. return -ENODEV;
  296. }
  297. sc_reg = &mdio_dev->sc_reg;
  298. /* 1. reset req, and read reset st check */
  299. ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req,
  300. 0x1, sc_reg->mdio_reset_st, 0x1,
  301. MDIO_CHECK_SET_ST);
  302. if (ret) {
  303. dev_err(&bus->dev, "MDIO reset fail\n");
  304. return ret;
  305. }
  306. /* 2. dis clk, and read clk st check */
  307. ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
  308. 0x1, sc_reg->mdio_clk_st, 0x1,
  309. MDIO_CHECK_CLR_ST);
  310. if (ret) {
  311. dev_err(&bus->dev, "MDIO dis clk fail\n");
  312. return ret;
  313. }
  314. /* 3. reset dreq, and read reset st check */
  315. ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq,
  316. 0x1, sc_reg->mdio_reset_st, 0x1,
  317. MDIO_CHECK_CLR_ST);
  318. if (ret) {
  319. dev_err(&bus->dev, "MDIO dis clk fail\n");
  320. return ret;
  321. }
  322. /* 4. en clk, and read clk st check */
  323. ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
  324. 0x1, sc_reg->mdio_clk_st, 0x1,
  325. MDIO_CHECK_SET_ST);
  326. if (ret)
  327. dev_err(&bus->dev, "MDIO en clk fail\n");
  328. } else if (is_acpi_node(bus->parent->fwnode)) {
  329. acpi_status s;
  330. s = acpi_evaluate_object(ACPI_HANDLE(bus->parent),
  331. "_RST", NULL, NULL);
  332. if (ACPI_FAILURE(s)) {
  333. dev_err(&bus->dev, "Reset failed, return:%#x\n", s);
  334. ret = -EBUSY;
  335. } else {
  336. ret = 0;
  337. }
  338. } else {
  339. dev_err(&bus->dev, "Can not get cfg data from DT or ACPI\n");
  340. ret = -ENXIO;
  341. }
  342. return ret;
  343. }
  344. /**
  345. * hns_mdio_probe - probe mdio device
  346. * @pdev: mdio platform device
  347. *
  348. * Return 0 on success, negative on failure
  349. */
  350. static int hns_mdio_probe(struct platform_device *pdev)
  351. {
  352. struct hns_mdio_device *mdio_dev;
  353. struct mii_bus *new_bus;
  354. int ret;
  355. if (!pdev) {
  356. dev_err(NULL, "pdev is NULL!\r\n");
  357. return -ENODEV;
  358. }
  359. mdio_dev = devm_kzalloc(&pdev->dev, sizeof(*mdio_dev), GFP_KERNEL);
  360. if (!mdio_dev)
  361. return -ENOMEM;
  362. new_bus = devm_mdiobus_alloc(&pdev->dev);
  363. if (!new_bus) {
  364. dev_err(&pdev->dev, "mdiobus_alloc fail!\n");
  365. return -ENOMEM;
  366. }
  367. new_bus->name = MDIO_BUS_NAME;
  368. new_bus->read = hns_mdio_read;
  369. new_bus->write = hns_mdio_write;
  370. new_bus->reset = hns_mdio_reset;
  371. new_bus->priv = mdio_dev;
  372. new_bus->parent = &pdev->dev;
  373. mdio_dev->vbase = devm_platform_ioremap_resource(pdev, 0);
  374. if (IS_ERR(mdio_dev->vbase)) {
  375. ret = PTR_ERR(mdio_dev->vbase);
  376. return ret;
  377. }
  378. platform_set_drvdata(pdev, new_bus);
  379. snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
  380. dev_name(&pdev->dev));
  381. if (dev_of_node(&pdev->dev)) {
  382. struct of_phandle_args reg_args;
  383. ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
  384. "subctrl-vbase",
  385. 4,
  386. 0,
  387. &reg_args);
  388. if (!ret) {
  389. mdio_dev->subctrl_vbase =
  390. syscon_node_to_regmap(reg_args.np);
  391. if (IS_ERR(mdio_dev->subctrl_vbase)) {
  392. dev_warn(&pdev->dev, "syscon_node_to_regmap error\n");
  393. mdio_dev->subctrl_vbase = NULL;
  394. } else {
  395. if (reg_args.args_count == 4) {
  396. mdio_dev->sc_reg.mdio_clk_en =
  397. (u16)reg_args.args[0];
  398. mdio_dev->sc_reg.mdio_clk_dis =
  399. (u16)reg_args.args[0] + 4;
  400. mdio_dev->sc_reg.mdio_reset_req =
  401. (u16)reg_args.args[1];
  402. mdio_dev->sc_reg.mdio_reset_dreq =
  403. (u16)reg_args.args[1] + 4;
  404. mdio_dev->sc_reg.mdio_clk_st =
  405. (u16)reg_args.args[2];
  406. mdio_dev->sc_reg.mdio_reset_st =
  407. (u16)reg_args.args[3];
  408. } else {
  409. /* for compatible */
  410. mdio_dev->sc_reg.mdio_clk_en =
  411. MDIO_SC_CLK_EN;
  412. mdio_dev->sc_reg.mdio_clk_dis =
  413. MDIO_SC_CLK_DIS;
  414. mdio_dev->sc_reg.mdio_reset_req =
  415. MDIO_SC_RESET_REQ;
  416. mdio_dev->sc_reg.mdio_reset_dreq =
  417. MDIO_SC_RESET_DREQ;
  418. mdio_dev->sc_reg.mdio_clk_st =
  419. MDIO_SC_CLK_ST;
  420. mdio_dev->sc_reg.mdio_reset_st =
  421. MDIO_SC_RESET_ST;
  422. }
  423. }
  424. } else {
  425. dev_warn(&pdev->dev, "find syscon ret = %#x\n", ret);
  426. mdio_dev->subctrl_vbase = NULL;
  427. }
  428. ret = of_mdiobus_register(new_bus, pdev->dev.of_node);
  429. } else if (is_acpi_node(pdev->dev.fwnode)) {
  430. /* Clear all the IRQ properties */
  431. memset(new_bus->irq, PHY_POLL, 4 * PHY_MAX_ADDR);
  432. /* Mask out all PHYs from auto probing. */
  433. new_bus->phy_mask = ~0;
  434. /* Register the MDIO bus */
  435. ret = mdiobus_register(new_bus);
  436. } else {
  437. dev_err(&pdev->dev, "Can not get cfg data from DT or ACPI\n");
  438. ret = -ENXIO;
  439. }
  440. if (ret) {
  441. dev_err(&pdev->dev, "Cannot register as MDIO bus!\n");
  442. platform_set_drvdata(pdev, NULL);
  443. return ret;
  444. }
  445. return 0;
  446. }
  447. /**
  448. * hns_mdio_remove - remove mdio device
  449. * @pdev: mdio platform device
  450. *
  451. * Return 0 on success, negative on failure
  452. */
  453. static int hns_mdio_remove(struct platform_device *pdev)
  454. {
  455. struct mii_bus *bus;
  456. bus = platform_get_drvdata(pdev);
  457. mdiobus_unregister(bus);
  458. platform_set_drvdata(pdev, NULL);
  459. return 0;
  460. }
  461. static const struct of_device_id hns_mdio_match[] = {
  462. {.compatible = "hisilicon,mdio"},
  463. {.compatible = "hisilicon,hns-mdio"},
  464. {}
  465. };
  466. MODULE_DEVICE_TABLE(of, hns_mdio_match);
  467. static const struct acpi_device_id hns_mdio_acpi_match[] = {
  468. { "HISI0141", 0 },
  469. { },
  470. };
  471. MODULE_DEVICE_TABLE(acpi, hns_mdio_acpi_match);
  472. static struct platform_driver hns_mdio_driver = {
  473. .probe = hns_mdio_probe,
  474. .remove = hns_mdio_remove,
  475. .driver = {
  476. .name = MDIO_DRV_NAME,
  477. .of_match_table = hns_mdio_match,
  478. .acpi_match_table = ACPI_PTR(hns_mdio_acpi_match),
  479. },
  480. };
  481. module_platform_driver(hns_mdio_driver);
  482. MODULE_LICENSE("GPL");
  483. MODULE_AUTHOR("Huawei Tech. Co., Ltd.");
  484. MODULE_DESCRIPTION("Hisilicon HNS MDIO driver");
  485. MODULE_ALIAS("platform:" MDIO_DRV_NAME);