atheros.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Atheros PHY drivers
  4. *
  5. * Copyright 2011, 2013 Freescale Semiconductor, Inc.
  6. * author Andy Fleming
  7. * Copyright (c) 2019 Michael Walle <michael@walle.cc>
  8. */
  9. #include <common.h>
  10. #include <phy.h>
  11. #include <dm/device_compat.h>
  12. #include <linux/bitfield.h>
  13. #include <linux/bitops.h>
  14. #include <dt-bindings/net/qca-ar803x.h>
  15. #define AR803x_PHY_DEBUG_ADDR_REG 0x1d
  16. #define AR803x_PHY_DEBUG_DATA_REG 0x1e
  17. /* Debug registers */
  18. #define AR803x_DEBUG_REG_0 0x0
  19. #define AR803x_RGMII_RX_CLK_DLY BIT(15)
  20. #define AR803x_DEBUG_REG_5 0x5
  21. #define AR803x_RGMII_TX_CLK_DLY BIT(8)
  22. #define AR803x_DEBUG_REG_1F 0x1f
  23. #define AR803x_PLL_ON BIT(2)
  24. #define AR803x_RGMII_1V8 BIT(3)
  25. /* CLK_25M register is at MMD 7, address 0x8016 */
  26. #define AR803x_CLK_25M_SEL_REG 0x8016
  27. #define AR803x_CLK_25M_MASK GENMASK(4, 2)
  28. #define AR803x_CLK_25M_25MHZ_XTAL 0
  29. #define AR803x_CLK_25M_25MHZ_DSP 1
  30. #define AR803x_CLK_25M_50MHZ_PLL 2
  31. #define AR803x_CLK_25M_50MHZ_DSP 3
  32. #define AR803x_CLK_25M_62_5MHZ_PLL 4
  33. #define AR803x_CLK_25M_62_5MHZ_DSP 5
  34. #define AR803x_CLK_25M_125MHZ_PLL 6
  35. #define AR803x_CLK_25M_125MHZ_DSP 7
  36. #define AR8035_CLK_25M_MASK GENMASK(4, 3)
  37. #define AR803x_CLK_25M_DR_MASK GENMASK(8, 7)
  38. #define AR803x_CLK_25M_DR_FULL 0
  39. #define AR803x_CLK_25M_DR_HALF 1
  40. #define AR803x_CLK_25M_DR_QUARTER 2
  41. #define AR8021_PHY_ID 0x004dd040
  42. #define AR8031_PHY_ID 0x004dd074
  43. #define AR8035_PHY_ID 0x004dd072
  44. struct ar803x_priv {
  45. int flags;
  46. #define AR803x_FLAG_KEEP_PLL_ENABLED BIT(0) /* don't turn off internal PLL */
  47. #define AR803x_FLAG_RGMII_1V8 BIT(1) /* use 1.8V RGMII I/O voltage */
  48. u16 clk_25m_reg;
  49. u16 clk_25m_mask;
  50. };
  51. static int ar803x_debug_reg_read(struct phy_device *phydev, u16 reg)
  52. {
  53. int ret;
  54. ret = phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG,
  55. reg);
  56. if (ret < 0)
  57. return ret;
  58. return phy_read(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG);
  59. }
  60. static int ar803x_debug_reg_mask(struct phy_device *phydev, u16 reg,
  61. u16 clear, u16 set)
  62. {
  63. int val;
  64. val = ar803x_debug_reg_read(phydev, reg);
  65. if (val < 0)
  66. return val;
  67. val &= 0xffff;
  68. val &= ~clear;
  69. val |= set;
  70. return phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG,
  71. val);
  72. }
  73. static int ar803x_enable_rx_delay(struct phy_device *phydev, bool on)
  74. {
  75. u16 clear = 0, set = 0;
  76. if (on)
  77. set = AR803x_RGMII_RX_CLK_DLY;
  78. else
  79. clear = AR803x_RGMII_RX_CLK_DLY;
  80. return ar803x_debug_reg_mask(phydev, AR803x_DEBUG_REG_0, clear, set);
  81. }
  82. static int ar803x_enable_tx_delay(struct phy_device *phydev, bool on)
  83. {
  84. u16 clear = 0, set = 0;
  85. if (on)
  86. set = AR803x_RGMII_TX_CLK_DLY;
  87. else
  88. clear = AR803x_RGMII_TX_CLK_DLY;
  89. return ar803x_debug_reg_mask(phydev, AR803x_DEBUG_REG_5, clear, set);
  90. }
  91. static int ar8021_config(struct phy_device *phydev)
  92. {
  93. phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR,
  94. BMCR_ANENABLE | BMCR_ANRESTART);
  95. ar803x_enable_tx_delay(phydev, true);
  96. phydev->supported = phydev->drv->features;
  97. return 0;
  98. }
  99. static int ar803x_delay_config(struct phy_device *phydev)
  100. {
  101. int ret;
  102. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
  103. phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
  104. ret = ar803x_enable_tx_delay(phydev, true);
  105. else
  106. ret = ar803x_enable_tx_delay(phydev, false);
  107. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
  108. phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
  109. ret = ar803x_enable_rx_delay(phydev, true);
  110. else
  111. ret = ar803x_enable_rx_delay(phydev, false);
  112. return ret;
  113. }
  114. static int ar803x_regs_config(struct phy_device *phydev)
  115. {
  116. struct ar803x_priv *priv = phydev->priv;
  117. u16 set = 0, clear = 0;
  118. int val;
  119. int ret;
  120. /* no configuration available */
  121. if (!priv)
  122. return 0;
  123. /*
  124. * Only supported on the AR8031, AR8035 has strappings for the PLL mode
  125. * as well as the RGMII voltage.
  126. */
  127. if (phydev->drv->uid == AR8031_PHY_ID) {
  128. if (priv->flags & AR803x_FLAG_KEEP_PLL_ENABLED)
  129. set |= AR803x_PLL_ON;
  130. else
  131. clear |= AR803x_PLL_ON;
  132. if (priv->flags & AR803x_FLAG_RGMII_1V8)
  133. set |= AR803x_RGMII_1V8;
  134. else
  135. clear |= AR803x_RGMII_1V8;
  136. ret = ar803x_debug_reg_mask(phydev, AR803x_DEBUG_REG_1F, clear,
  137. set);
  138. if (ret < 0)
  139. return ret;
  140. }
  141. /* save the write access if the mask is empty */
  142. if (priv->clk_25m_mask) {
  143. val = phy_read_mmd(phydev, MDIO_MMD_AN, AR803x_CLK_25M_SEL_REG);
  144. if (val < 0)
  145. return val;
  146. val &= ~priv->clk_25m_mask;
  147. val |= priv->clk_25m_reg;
  148. ret = phy_write_mmd(phydev, MDIO_MMD_AN,
  149. AR803x_CLK_25M_SEL_REG, val);
  150. if (ret < 0)
  151. return ret;
  152. }
  153. return 0;
  154. }
  155. static int ar803x_of_init(struct phy_device *phydev)
  156. {
  157. struct ar803x_priv *priv;
  158. ofnode node, vddio_reg_node;
  159. u32 strength, freq, min_uV, max_uV;
  160. int sel;
  161. node = phy_get_ofnode(phydev);
  162. if (!ofnode_valid(node))
  163. return 0;
  164. priv = malloc(sizeof(*priv));
  165. if (!priv)
  166. return -ENOMEM;
  167. memset(priv, 0, sizeof(*priv));
  168. phydev->priv = priv;
  169. debug("%s: found PHY node: %s\n", __func__, ofnode_get_name(node));
  170. if (ofnode_read_bool(node, "qca,keep-pll-enabled"))
  171. priv->flags |= AR803x_FLAG_KEEP_PLL_ENABLED;
  172. /*
  173. * We can't use the regulator framework because the regulator is
  174. * a subnode of the PHY. So just read the two properties we are
  175. * interested in.
  176. */
  177. vddio_reg_node = ofnode_find_subnode(node, "vddio-regulator");
  178. if (ofnode_valid(vddio_reg_node)) {
  179. min_uV = ofnode_read_u32_default(vddio_reg_node,
  180. "regulator-min-microvolt", 0);
  181. max_uV = ofnode_read_u32_default(vddio_reg_node,
  182. "regulator-max-microvolt", 0);
  183. if (min_uV != max_uV) {
  184. free(priv);
  185. return -EINVAL;
  186. }
  187. switch (min_uV) {
  188. case 1500000:
  189. break;
  190. case 1800000:
  191. priv->flags |= AR803x_FLAG_RGMII_1V8;
  192. break;
  193. default:
  194. free(priv);
  195. return -EINVAL;
  196. }
  197. }
  198. /*
  199. * Get the CLK_25M frequency from the device tree. Only XTAL and PLL
  200. * sources are supported right now. There is also the possibilty to use
  201. * the DSP as frequency reference, this is used for synchronous
  202. * ethernet.
  203. */
  204. if (!ofnode_read_u32(node, "qca,clk-out-frequency", &freq)) {
  205. switch (freq) {
  206. case 25000000:
  207. sel = AR803x_CLK_25M_25MHZ_XTAL;
  208. break;
  209. case 50000000:
  210. sel = AR803x_CLK_25M_50MHZ_PLL;
  211. break;
  212. case 62500000:
  213. sel = AR803x_CLK_25M_62_5MHZ_PLL;
  214. break;
  215. case 125000000:
  216. sel = AR803x_CLK_25M_125MHZ_PLL;
  217. break;
  218. default:
  219. dev_err(phydev->dev,
  220. "invalid qca,clk-out-frequency\n");
  221. free(priv);
  222. return -EINVAL;
  223. }
  224. priv->clk_25m_mask |= AR803x_CLK_25M_MASK;
  225. priv->clk_25m_reg |= FIELD_PREP(AR803x_CLK_25M_MASK, sel);
  226. /*
  227. * Fixup for the AR8035 which only has two bits. The two
  228. * remaining bits map to the same frequencies.
  229. */
  230. if (phydev->drv->uid == AR8035_PHY_ID) {
  231. priv->clk_25m_reg &= AR8035_CLK_25M_MASK;
  232. priv->clk_25m_mask &= AR8035_CLK_25M_MASK;
  233. }
  234. }
  235. if (phydev->drv->uid == AR8031_PHY_ID &&
  236. !ofnode_read_u32(node, "qca,clk-out-strength", &strength)) {
  237. switch (strength) {
  238. case AR803X_STRENGTH_FULL:
  239. sel = AR803x_CLK_25M_DR_FULL;
  240. break;
  241. case AR803X_STRENGTH_HALF:
  242. sel = AR803x_CLK_25M_DR_HALF;
  243. break;
  244. case AR803X_STRENGTH_QUARTER:
  245. sel = AR803x_CLK_25M_DR_QUARTER;
  246. break;
  247. default:
  248. dev_err(phydev->dev,
  249. "invalid qca,clk-out-strength\n");
  250. free(priv);
  251. return -EINVAL;
  252. }
  253. priv->clk_25m_mask |= AR803x_CLK_25M_DR_MASK;
  254. priv->clk_25m_reg |= FIELD_PREP(AR803x_CLK_25M_DR_MASK, sel);
  255. }
  256. debug("%s: flags=%x clk_25m_reg=%04x clk_25m_mask=%04x\n", __func__,
  257. priv->flags, priv->clk_25m_reg, priv->clk_25m_mask);
  258. return 0;
  259. }
  260. static int ar803x_config(struct phy_device *phydev)
  261. {
  262. int ret;
  263. ret = ar803x_of_init(phydev);
  264. if (ret < 0)
  265. return ret;
  266. ret = ar803x_delay_config(phydev);
  267. if (ret < 0)
  268. return ret;
  269. ret = ar803x_regs_config(phydev);
  270. if (ret < 0)
  271. return ret;
  272. phydev->supported = phydev->drv->features;
  273. genphy_config_aneg(phydev);
  274. genphy_restart_aneg(phydev);
  275. return 0;
  276. }
  277. U_BOOT_PHY_DRIVER(AR8021) = {
  278. .name = "AR8021",
  279. .uid = AR8021_PHY_ID,
  280. .mask = 0xfffffff0,
  281. .features = PHY_GBIT_FEATURES,
  282. .config = ar8021_config,
  283. .startup = genphy_startup,
  284. .shutdown = genphy_shutdown,
  285. };
  286. U_BOOT_PHY_DRIVER(AR8031) = {
  287. .name = "AR8031/AR8033",
  288. .uid = AR8031_PHY_ID,
  289. .mask = 0xffffffef,
  290. .features = PHY_GBIT_FEATURES,
  291. .config = ar803x_config,
  292. .startup = genphy_startup,
  293. .shutdown = genphy_shutdown,
  294. };
  295. U_BOOT_PHY_DRIVER(AR8035) = {
  296. .name = "AR8035",
  297. .uid = AR8035_PHY_ID,
  298. .mask = 0xffffffef,
  299. .features = PHY_GBIT_FEATURES,
  300. .config = ar803x_config,
  301. .startup = genphy_startup,
  302. .shutdown = genphy_shutdown,
  303. };