mt7531.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2018 MediaTek Inc.
  4. * Author: Zhanguo Ju <[email protected]>
  5. */
  6. #include <linux/kernel.h>
  7. #include <linux/delay.h>
  8. #include <linux/hrtimer.h>
  9. #include "mt753x.h"
  10. #include "mt753x_regs.h"
  11. /* MT7531 registers */
  12. #define SGMII_REG_BASE 0x5000
  13. #define SGMII_REG_PORT_BASE 0x1000
  14. #define SGMII_REG(p, r) (SGMII_REG_BASE + \
  15. (p) * SGMII_REG_PORT_BASE + (r))
  16. #define PCS_CONTROL_1(p) SGMII_REG(p, 0x00)
  17. #define SGMII_MODE(p) SGMII_REG(p, 0x20)
  18. #define QPHY_PWR_STATE_CTRL(p) SGMII_REG(p, 0xe8)
  19. #define PHYA_CTRL_SIGNAL3(p) SGMII_REG(p, 0x128)
  20. /* Fields of PCS_CONTROL_1 */
  21. #define SGMII_LINK_STATUS BIT(18)
  22. #define SGMII_AN_ENABLE BIT(12)
  23. #define SGMII_AN_RESTART BIT(9)
  24. /* Fields of SGMII_MODE */
  25. #define SGMII_REMOTE_FAULT_DIS BIT(8)
  26. #define SGMII_IF_MODE_FORCE_DUPLEX BIT(4)
  27. #define SGMII_IF_MODE_FORCE_SPEED_S 0x2
  28. #define SGMII_IF_MODE_FORCE_SPEED_M 0x0c
  29. #define SGMII_IF_MODE_ADVERT_AN BIT(1)
  30. /* Values of SGMII_IF_MODE_FORCE_SPEED */
  31. #define SGMII_IF_MODE_FORCE_SPEED_10 0
  32. #define SGMII_IF_MODE_FORCE_SPEED_100 1
  33. #define SGMII_IF_MODE_FORCE_SPEED_1000 2
  34. /* Fields of QPHY_PWR_STATE_CTRL */
  35. #define PHYA_PWD BIT(4)
  36. /* Fields of PHYA_CTRL_SIGNAL3 */
  37. #define RG_TPHY_SPEED_S 2
  38. #define RG_TPHY_SPEED_M 0x0c
  39. /* Values of RG_TPHY_SPEED */
  40. #define RG_TPHY_SPEED_1000 0
  41. #define RG_TPHY_SPEED_2500 1
  42. /* Unique fields of (M)HWSTRAP for MT7531 */
  43. #define XTAL_FSEL_S 7
  44. #define XTAL_FSEL_M BIT(7)
  45. #define PHY_EN BIT(6)
  46. #define CHG_STRAP BIT(8)
  47. /* Efuse Register Define */
  48. #define GBE_EFUSE 0x7bc8
  49. #define GBE_SEL_EFUSE_EN BIT(0)
  50. /* PHY ENABLE Register bitmap define */
  51. #define PHY_DEV1F 0x1f
  52. #define PHY_DEV1F_REG_44 0x44
  53. #define PHY_DEV1F_REG_104 0x104
  54. #define PHY_DEV1F_REG_10A 0x10a
  55. #define PHY_DEV1F_REG_10B 0x10b
  56. #define PHY_DEV1F_REG_10C 0x10c
  57. #define PHY_DEV1F_REG_10D 0x10d
  58. #define PHY_DEV1F_REG_268 0x268
  59. #define PHY_DEV1F_REG_269 0x269
  60. #define PHY_DEV1F_REG_403 0x403
  61. /* Fields of PHY_DEV1F_REG_403 */
  62. #define GBE_EFUSE_SETTING BIT(3)
  63. #define PHY_EN_BYPASS_MODE BIT(4)
  64. #define POWER_ON_OFF BIT(5)
  65. #define PHY_PLL_M GENMASK(9, 8)
  66. #define PHY_PLL_SEL(x) (((x) << 8) & GENMASK(9, 8))
  67. /* PHY EEE Register bitmap of define */
  68. #define PHY_DEV07 0x07
  69. #define PHY_DEV07_REG_03C 0x3c
  70. /* PHY Extend Register 0x14 bitmap of define */
  71. #define PHY_EXT_REG_14 0x14
  72. /* Fields of PHY_EXT_REG_14 */
  73. #define PHY_EN_DOWN_SHFIT BIT(4)
  74. /* PHY Extend Register 0x17 bitmap of define */
  75. #define PHY_EXT_REG_17 0x17
  76. /* Fields of PHY_EXT_REG_17 */
  77. #define PHY_LINKDOWN_POWER_SAVING_EN BIT(4)
  78. /* PHY Token Ring Register 0x10 bitmap of define */
  79. #define PHY_TR_REG_10 0x10
  80. /* PHY Token Ring Register 0x12 bitmap of define */
  81. #define PHY_TR_REG_12 0x12
  82. /* PHY DEV 0x1e Register bitmap of define */
  83. #define PHY_DEV1E 0x1e
  84. #define PHY_DEV1E_REG_13 0x13
  85. #define PHY_DEV1E_REG_14 0x14
  86. #define PHY_DEV1E_REG_41 0x41
  87. #define PHY_DEV1E_REG_A6 0xa6
  88. #define PHY_DEV1E_REG_0C6 0x0c6
  89. #define PHY_DEV1E_REG_0FE 0x0fe
  90. #define PHY_DEV1E_REG_123 0x123
  91. #define PHY_DEV1E_REG_189 0x189
  92. /* Fields of PHY_DEV1E_REG_0C6 */
  93. #define PHY_POWER_SAVING_S 8
  94. #define PHY_POWER_SAVING_M 0x300
  95. #define PHY_POWER_SAVING_TX 0x0
  96. /* Fields of PHY_DEV1E_REG_189 */
  97. #define DESCRAMBLER_CLEAR_EN 0x1
  98. /* Values of XTAL_FSEL_S */
  99. #define XTAL_40MHZ 0
  100. #define XTAL_25MHZ 1
  101. #define PLLGP_EN 0x7820
  102. #define EN_COREPLL BIT(2)
  103. #define SW_CLKSW BIT(1)
  104. #define SW_PLLGP BIT(0)
  105. #define PLLGP_CR0 0x78a8
  106. #define RG_COREPLL_EN BIT(22)
  107. #define RG_COREPLL_POSDIV_S 23
  108. #define RG_COREPLL_POSDIV_M 0x3800000
  109. #define RG_COREPLL_SDM_PCW_S 1
  110. #define RG_COREPLL_SDM_PCW_M 0x3ffffe
  111. #define RG_COREPLL_SDM_PCW_CHG BIT(0)
  112. /* TOP Signals Status Register */
  113. #define TOP_SIG_SR 0x780c
  114. #define PAD_DUAL_SGMII_EN BIT(1)
  115. /* RGMII and SGMII PLL clock */
  116. #define ANA_PLLGP_CR2 0x78b0
  117. #define ANA_PLLGP_CR5 0x78bc
  118. /* GPIO mode define */
  119. #define GPIO_MODE_REGS(x) (0x7c0c + (((x) / 8) * 4))
  120. #define GPIO_MODE_S 4
  121. /* GPIO GROUP IOLB SMT0 Control */
  122. #define SMT0_IOLB 0x7f04
  123. #define SMT_IOLB_5_SMI_MDC_EN BIT(5)
  124. /* Unique fields of PMCR for MT7531 */
  125. #define FORCE_MODE_EEE1G BIT(25)
  126. #define FORCE_MODE_EEE100 BIT(26)
  127. #define FORCE_MODE_TX_FC BIT(27)
  128. #define FORCE_MODE_RX_FC BIT(28)
  129. #define FORCE_MODE_DPX BIT(29)
  130. #define FORCE_MODE_SPD BIT(30)
  131. #define FORCE_MODE_LNK BIT(31)
  132. #define FORCE_MODE BIT(15)
  133. #define CHIP_REV 0x781C
  134. #define CHIP_NAME_S 16
  135. #define CHIP_NAME_M 0xffff0000
  136. #define CHIP_REV_S 0
  137. #define CHIP_REV_M 0x0f
  138. #define CHIP_REV_E1 0x0
  139. #define CLKGEN_CTRL 0x7500
  140. #define CLK_SKEW_OUT_S 8
  141. #define CLK_SKEW_OUT_M 0x300
  142. #define CLK_SKEW_IN_S 6
  143. #define CLK_SKEW_IN_M 0xc0
  144. #define RXCLK_NO_DELAY BIT(5)
  145. #define TXCLK_NO_REVERSE BIT(4)
  146. #define GP_MODE_S 1
  147. #define GP_MODE_M 0x06
  148. #define GP_CLK_EN BIT(0)
  149. /* Values of GP_MODE */
  150. #define GP_MODE_RGMII 0
  151. #define GP_MODE_MII 1
  152. #define GP_MODE_REV_MII 2
  153. /* Values of CLK_SKEW_IN */
  154. #define CLK_SKEW_IN_NO_CHANGE 0
  155. #define CLK_SKEW_IN_DELAY_100PPS 1
  156. #define CLK_SKEW_IN_DELAY_200PPS 2
  157. #define CLK_SKEW_IN_REVERSE 3
  158. /* Values of CLK_SKEW_OUT */
  159. #define CLK_SKEW_OUT_NO_CHANGE 0
  160. #define CLK_SKEW_OUT_DELAY_100PPS 1
  161. #define CLK_SKEW_OUT_DELAY_200PPS 2
  162. #define CLK_SKEW_OUT_REVERSE 3
  163. /* Proprietory Control Register of Internal Phy device 0x1e */
  164. #define RXADC_CONTROL_3 0xc2
  165. #define RXADC_LDO_CONTROL_2 0xd3
  166. /* Proprietory Control Register of Internal Phy device 0x1f */
  167. #define TXVLD_DA_271 0x271
  168. #define TXVLD_DA_272 0x272
  169. #define TXVLD_DA_273 0x273
  170. /* DSP Channel and NOD_ADDR*/
  171. #define DSP_CH 0x2
  172. #define DSP_NOD_ADDR 0xD
  173. /* gpio pinmux pins and functions define */
  174. static int gpio_int_pins[] = {0};
  175. static int gpio_int_funcs[] = {1};
  176. static int gpio_mdc_pins[] = {11, 20};
  177. static int gpio_mdc_funcs[] = {2, 2};
  178. static int gpio_mdio_pins[] = {12, 21};
  179. static int gpio_mdio_funcs[] = {2, 2};
  180. static int mt7531_set_port_sgmii_force_mode(struct gsw_mt753x *gsw, u32 port,
  181. struct mt753x_port_cfg *port_cfg)
  182. {
  183. u32 speed, port_base, val;
  184. ktime_t timeout;
  185. u32 timeout_us;
  186. if (port < 5 || port >= MT753X_NUM_PORTS) {
  187. dev_info(gsw->dev, "port %d is not a SGMII port\n", port);
  188. return -EINVAL;
  189. }
  190. port_base = port - 5;
  191. switch (port_cfg->speed) {
  192. case MAC_SPD_1000:
  193. speed = RG_TPHY_SPEED_1000;
  194. break;
  195. case MAC_SPD_2500:
  196. speed = RG_TPHY_SPEED_2500;
  197. break;
  198. default:
  199. dev_info(gsw->dev, "invalid SGMII speed idx %d for port %d\n",
  200. port_cfg->speed, port);
  201. speed = RG_TPHY_SPEED_1000;
  202. }
  203. /* Step 1: Speed select register setting */
  204. val = mt753x_reg_read(gsw, PHYA_CTRL_SIGNAL3(port_base));
  205. val &= ~RG_TPHY_SPEED_M;
  206. val |= speed << RG_TPHY_SPEED_S;
  207. mt753x_reg_write(gsw, PHYA_CTRL_SIGNAL3(port_base), val);
  208. /* Step 2 : Disable AN */
  209. val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
  210. val &= ~SGMII_AN_ENABLE;
  211. mt753x_reg_write(gsw, PCS_CONTROL_1(port_base), val);
  212. /* Step 3: SGMII force mode setting */
  213. val = mt753x_reg_read(gsw, SGMII_MODE(port_base));
  214. val &= ~SGMII_IF_MODE_ADVERT_AN;
  215. val &= ~SGMII_IF_MODE_FORCE_SPEED_M;
  216. val |= SGMII_IF_MODE_FORCE_SPEED_1000 << SGMII_IF_MODE_FORCE_SPEED_S;
  217. val |= SGMII_IF_MODE_FORCE_DUPLEX;
  218. /* For sgmii force mode, 0 is full duplex and 1 is half duplex */
  219. if (port_cfg->duplex)
  220. val &= ~SGMII_IF_MODE_FORCE_DUPLEX;
  221. mt753x_reg_write(gsw, SGMII_MODE(port_base), val);
  222. /* Step 4: XXX: Disable Link partner's AN and set force mode */
  223. /* Step 5: XXX: Special setting for PHYA ==> reserved for flexible */
  224. /* Step 6 : Release PHYA power down state */
  225. val = mt753x_reg_read(gsw, QPHY_PWR_STATE_CTRL(port_base));
  226. val &= ~PHYA_PWD;
  227. mt753x_reg_write(gsw, QPHY_PWR_STATE_CTRL(port_base), val);
  228. /* Step 7 : Polling SGMII_LINK_STATUS */
  229. timeout_us = 2000000;
  230. timeout = ktime_add_us(ktime_get(), timeout_us);
  231. while (1) {
  232. val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
  233. val &= SGMII_LINK_STATUS;
  234. if (val)
  235. break;
  236. if (ktime_compare(ktime_get(), timeout) > 0)
  237. return -ETIMEDOUT;
  238. }
  239. return 0;
  240. }
  241. static int mt7531_set_port_sgmii_an_mode(struct gsw_mt753x *gsw, u32 port,
  242. struct mt753x_port_cfg *port_cfg)
  243. {
  244. u32 speed, port_base, val;
  245. ktime_t timeout;
  246. u32 timeout_us;
  247. if (port < 5 || port >= MT753X_NUM_PORTS) {
  248. dev_info(gsw->dev, "port %d is not a SGMII port\n", port);
  249. return -EINVAL;
  250. }
  251. port_base = port - 5;
  252. switch (port_cfg->speed) {
  253. case MAC_SPD_1000:
  254. speed = RG_TPHY_SPEED_1000;
  255. break;
  256. case MAC_SPD_2500:
  257. speed = RG_TPHY_SPEED_2500;
  258. break;
  259. default:
  260. dev_info(gsw->dev, "invalid SGMII speed idx %d for port %d\n",
  261. port_cfg->speed, port);
  262. speed = RG_TPHY_SPEED_1000;
  263. }
  264. /* Step 1: Speed select register setting */
  265. val = mt753x_reg_read(gsw, PHYA_CTRL_SIGNAL3(port_base));
  266. val &= ~RG_TPHY_SPEED_M;
  267. val |= speed << RG_TPHY_SPEED_S;
  268. mt753x_reg_write(gsw, PHYA_CTRL_SIGNAL3(port_base), val);
  269. /* Step 2: Remote fault disable */
  270. val = mt753x_reg_read(gsw, SGMII_MODE(port));
  271. val |= SGMII_REMOTE_FAULT_DIS;
  272. mt753x_reg_write(gsw, SGMII_MODE(port), val);
  273. /* Step 3: Setting Link partner's AN enable = 1 */
  274. /* Step 4: Setting Link partner's device ability for speed/duplex */
  275. /* Step 5: AN re-start */
  276. val = mt753x_reg_read(gsw, PCS_CONTROL_1(port));
  277. val |= SGMII_AN_RESTART;
  278. mt753x_reg_write(gsw, PCS_CONTROL_1(port), val);
  279. /* Step 6: Special setting for PHYA ==> reserved for flexible */
  280. /* Step 7 : Polling SGMII_LINK_STATUS */
  281. timeout_us = 2000000;
  282. timeout = ktime_add_us(ktime_get(), timeout_us);
  283. while (1) {
  284. val = mt753x_reg_read(gsw, PCS_CONTROL_1(port_base));
  285. val &= SGMII_LINK_STATUS;
  286. if (val)
  287. break;
  288. if (ktime_compare(ktime_get(), timeout) > 0)
  289. return -ETIMEDOUT;
  290. }
  291. return 0;
  292. }
  293. static int mt7531_set_port_rgmii(struct gsw_mt753x *gsw, u32 port)
  294. {
  295. u32 val;
  296. if (port != 5) {
  297. dev_info(gsw->dev, "RGMII mode is not available for port %d\n",
  298. port);
  299. return -EINVAL;
  300. }
  301. val = mt753x_reg_read(gsw, CLKGEN_CTRL);
  302. val |= GP_CLK_EN;
  303. val &= ~GP_MODE_M;
  304. val |= GP_MODE_RGMII << GP_MODE_S;
  305. val |= TXCLK_NO_REVERSE;
  306. val |= RXCLK_NO_DELAY;
  307. val &= ~CLK_SKEW_IN_M;
  308. val |= CLK_SKEW_IN_NO_CHANGE << CLK_SKEW_IN_S;
  309. val &= ~CLK_SKEW_OUT_M;
  310. val |= CLK_SKEW_OUT_NO_CHANGE << CLK_SKEW_OUT_S;
  311. mt753x_reg_write(gsw, CLKGEN_CTRL, val);
  312. return 0;
  313. }
  314. static int mt7531_mac_port_setup(struct gsw_mt753x *gsw, u32 port,
  315. struct mt753x_port_cfg *port_cfg)
  316. {
  317. u32 pmcr;
  318. u32 speed;
  319. if (port < 5 || port >= MT753X_NUM_PORTS) {
  320. dev_info(gsw->dev, "port %d is not a MAC port\n", port);
  321. return -EINVAL;
  322. }
  323. if (port_cfg->enabled) {
  324. pmcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
  325. MAC_MODE | MAC_TX_EN | MAC_RX_EN |
  326. BKOFF_EN | BACKPR_EN;
  327. if (port_cfg->force_link) {
  328. /* PMCR's speed field 0x11 is reserved,
  329. * sw should set 0x10
  330. */
  331. speed = port_cfg->speed;
  332. if (port_cfg->speed == MAC_SPD_2500)
  333. speed = MAC_SPD_1000;
  334. pmcr |= FORCE_MODE_LNK | FORCE_LINK |
  335. FORCE_MODE_SPD | FORCE_MODE_DPX |
  336. FORCE_MODE_RX_FC | FORCE_MODE_TX_FC |
  337. FORCE_RX_FC | FORCE_TX_FC |
  338. (speed << FORCE_SPD_S);
  339. if (port_cfg->duplex)
  340. pmcr |= FORCE_DPX;
  341. }
  342. } else {
  343. pmcr = FORCE_MODE_LNK;
  344. }
  345. switch (port_cfg->phy_mode) {
  346. case PHY_INTERFACE_MODE_RGMII:
  347. mt7531_set_port_rgmii(gsw, port);
  348. break;
  349. case PHY_INTERFACE_MODE_SGMII:
  350. if (port_cfg->force_link)
  351. mt7531_set_port_sgmii_force_mode(gsw, port, port_cfg);
  352. else
  353. mt7531_set_port_sgmii_an_mode(gsw, port, port_cfg);
  354. break;
  355. default:
  356. if (port_cfg->enabled)
  357. dev_info(gsw->dev, "%s is not supported by port %d\n",
  358. phy_modes(port_cfg->phy_mode), port);
  359. pmcr = FORCE_MODE_LNK;
  360. }
  361. mt753x_reg_write(gsw, PMCR(port), pmcr);
  362. return 0;
  363. }
  364. static void mt7531_core_pll_setup(struct gsw_mt753x *gsw)
  365. {
  366. u32 hwstrap;
  367. u32 val;
  368. val = mt753x_reg_read(gsw, TOP_SIG_SR);
  369. if (val & PAD_DUAL_SGMII_EN)
  370. return;
  371. hwstrap = mt753x_reg_read(gsw, HWSTRAP);
  372. switch ((hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S) {
  373. case XTAL_25MHZ:
  374. /* Step 1 : Disable MT7531 COREPLL */
  375. val = mt753x_reg_read(gsw, PLLGP_EN);
  376. val &= ~EN_COREPLL;
  377. mt753x_reg_write(gsw, PLLGP_EN, val);
  378. /* Step 2: switch to XTAL output */
  379. val = mt753x_reg_read(gsw, PLLGP_EN);
  380. val |= SW_CLKSW;
  381. mt753x_reg_write(gsw, PLLGP_EN, val);
  382. val = mt753x_reg_read(gsw, PLLGP_CR0);
  383. val &= ~RG_COREPLL_EN;
  384. mt753x_reg_write(gsw, PLLGP_CR0, val);
  385. /* Step 3: disable PLLGP and enable program PLLGP */
  386. val = mt753x_reg_read(gsw, PLLGP_EN);
  387. val |= SW_PLLGP;
  388. mt753x_reg_write(gsw, PLLGP_EN, val);
  389. /* Step 4: program COREPLL output frequency to 500MHz */
  390. val = mt753x_reg_read(gsw, PLLGP_CR0);
  391. val &= ~RG_COREPLL_POSDIV_M;
  392. val |= 2 << RG_COREPLL_POSDIV_S;
  393. mt753x_reg_write(gsw, PLLGP_CR0, val);
  394. usleep_range(25, 35);
  395. val = mt753x_reg_read(gsw, PLLGP_CR0);
  396. val &= ~RG_COREPLL_SDM_PCW_M;
  397. val |= 0x140000 << RG_COREPLL_SDM_PCW_S;
  398. mt753x_reg_write(gsw, PLLGP_CR0, val);
  399. /* Set feedback divide ratio update signal to high */
  400. val = mt753x_reg_read(gsw, PLLGP_CR0);
  401. val |= RG_COREPLL_SDM_PCW_CHG;
  402. mt753x_reg_write(gsw, PLLGP_CR0, val);
  403. /* Wait for at least 16 XTAL clocks */
  404. usleep_range(10, 20);
  405. /* Step 5: set feedback divide ratio update signal to low */
  406. val = mt753x_reg_read(gsw, PLLGP_CR0);
  407. val &= ~RG_COREPLL_SDM_PCW_CHG;
  408. mt753x_reg_write(gsw, PLLGP_CR0, val);
  409. /* Enable 325M clock for SGMII */
  410. mt753x_reg_write(gsw, ANA_PLLGP_CR5, 0xad0000);
  411. /* Enable 250SSC clock for RGMII */
  412. mt753x_reg_write(gsw, ANA_PLLGP_CR2, 0x4f40000);
  413. /* Step 6: Enable MT7531 PLL */
  414. val = mt753x_reg_read(gsw, PLLGP_CR0);
  415. val |= RG_COREPLL_EN;
  416. mt753x_reg_write(gsw, PLLGP_CR0, val);
  417. val = mt753x_reg_read(gsw, PLLGP_EN);
  418. val |= EN_COREPLL;
  419. mt753x_reg_write(gsw, PLLGP_EN, val);
  420. usleep_range(25, 35);
  421. break;
  422. case XTAL_40MHZ:
  423. /* Step 1 : Disable MT7531 COREPLL */
  424. val = mt753x_reg_read(gsw, PLLGP_EN);
  425. val &= ~EN_COREPLL;
  426. mt753x_reg_write(gsw, PLLGP_EN, val);
  427. /* Step 2: switch to XTAL output */
  428. val = mt753x_reg_read(gsw, PLLGP_EN);
  429. val |= SW_CLKSW;
  430. mt753x_reg_write(gsw, PLLGP_EN, val);
  431. val = mt753x_reg_read(gsw, PLLGP_CR0);
  432. val &= ~RG_COREPLL_EN;
  433. mt753x_reg_write(gsw, PLLGP_CR0, val);
  434. /* Step 3: disable PLLGP and enable program PLLGP */
  435. val = mt753x_reg_read(gsw, PLLGP_EN);
  436. val |= SW_PLLGP;
  437. mt753x_reg_write(gsw, PLLGP_EN, val);
  438. /* Step 4: program COREPLL output frequency to 500MHz */
  439. val = mt753x_reg_read(gsw, PLLGP_CR0);
  440. val &= ~RG_COREPLL_POSDIV_M;
  441. val |= 2 << RG_COREPLL_POSDIV_S;
  442. mt753x_reg_write(gsw, PLLGP_CR0, val);
  443. usleep_range(25, 35);
  444. val = mt753x_reg_read(gsw, PLLGP_CR0);
  445. val &= ~RG_COREPLL_SDM_PCW_M;
  446. val |= 0x190000 << RG_COREPLL_SDM_PCW_S;
  447. mt753x_reg_write(gsw, PLLGP_CR0, val);
  448. /* Set feedback divide ratio update signal to high */
  449. val = mt753x_reg_read(gsw, PLLGP_CR0);
  450. val |= RG_COREPLL_SDM_PCW_CHG;
  451. mt753x_reg_write(gsw, PLLGP_CR0, val);
  452. /* Wait for at least 16 XTAL clocks */
  453. usleep_range(10, 20);
  454. /* Step 5: set feedback divide ratio update signal to low */
  455. val = mt753x_reg_read(gsw, PLLGP_CR0);
  456. val &= ~RG_COREPLL_SDM_PCW_CHG;
  457. mt753x_reg_write(gsw, PLLGP_CR0, val);
  458. /* Enable 325M clock for SGMII */
  459. mt753x_reg_write(gsw, ANA_PLLGP_CR5, 0xad0000);
  460. /* Enable 250SSC clock for RGMII */
  461. mt753x_reg_write(gsw, ANA_PLLGP_CR2, 0x4f40000);
  462. /* Step 6: Enable MT7531 PLL */
  463. val = mt753x_reg_read(gsw, PLLGP_CR0);
  464. val |= RG_COREPLL_EN;
  465. mt753x_reg_write(gsw, PLLGP_CR0, val);
  466. val = mt753x_reg_read(gsw, PLLGP_EN);
  467. val |= EN_COREPLL;
  468. mt753x_reg_write(gsw, PLLGP_EN, val);
  469. usleep_range(25, 35);
  470. break;
  471. }
  472. }
  473. static int mt7531_internal_phy_calibration(struct gsw_mt753x *gsw)
  474. {
  475. return 0;
  476. }
  477. static int mt7531_sw_detect(struct gsw_mt753x *gsw, struct chip_rev *crev)
  478. {
  479. u32 rev, topsig;
  480. rev = mt753x_reg_read(gsw, CHIP_REV);
  481. if (((rev & CHIP_NAME_M) >> CHIP_NAME_S) == MT7531) {
  482. if (crev) {
  483. topsig = mt753x_reg_read(gsw, TOP_SIG_SR);
  484. crev->rev = rev & CHIP_REV_M;
  485. crev->name = topsig & PAD_DUAL_SGMII_EN ?
  486. "MT7531AE" : "MT7531BE";
  487. }
  488. return 0;
  489. }
  490. return -ENODEV;
  491. }
  492. static void pinmux_set_mux_7531(struct gsw_mt753x *gsw, u32 pin, u32 mode)
  493. {
  494. u32 val;
  495. val = mt753x_reg_read(gsw, GPIO_MODE_REGS(pin));
  496. val &= ~(0xf << (pin & 7) * GPIO_MODE_S);
  497. val |= mode << (pin & 7) * GPIO_MODE_S;
  498. mt753x_reg_write(gsw, GPIO_MODE_REGS(pin), val);
  499. }
  500. static int mt7531_set_gpio_pinmux(struct gsw_mt753x *gsw)
  501. {
  502. u32 group = 0;
  503. struct device_node *np = gsw->dev->of_node;
  504. /* Set GPIO 0 interrupt mode */
  505. pinmux_set_mux_7531(gsw, gpio_int_pins[0], gpio_int_funcs[0]);
  506. of_property_read_u32(np, "mediatek,mdio_master_pinmux", &group);
  507. /* group = 0: do nothing, 1: 1st group (AE), 2: 2nd group (BE) */
  508. if (group > 0 && group <= 2) {
  509. group--;
  510. pinmux_set_mux_7531(gsw, gpio_mdc_pins[group],
  511. gpio_mdc_funcs[group]);
  512. pinmux_set_mux_7531(gsw, gpio_mdio_pins[group],
  513. gpio_mdio_funcs[group]);
  514. }
  515. return 0;
  516. }
  517. static void mt7531_phy_pll_setup(struct gsw_mt753x *gsw)
  518. {
  519. u32 hwstrap;
  520. u32 val;
  521. hwstrap = mt753x_reg_read(gsw, HWSTRAP);
  522. switch ((hwstrap & XTAL_FSEL_M) >> XTAL_FSEL_S) {
  523. case XTAL_25MHZ:
  524. /* disable pll auto calibration */
  525. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_104, 0x608);
  526. /* change pll sel */
  527. val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
  528. PHY_DEV1F_REG_403);
  529. val &= ~(PHY_PLL_M);
  530. val |= PHY_PLL_SEL(3);
  531. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
  532. /* set divider ratio */
  533. gsw->mmd_write(gsw, 0, PHY_DEV1F,
  534. PHY_DEV1F_REG_10A, 0x1009);
  535. /* set divider ratio */
  536. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10B, 0x7c6);
  537. /* capacitance and resistance adjustment */
  538. gsw->mmd_write(gsw, 0, PHY_DEV1F,
  539. PHY_DEV1F_REG_10C, 0xa8be);
  540. break;
  541. case XTAL_40MHZ:
  542. /* disable pll auto calibration */
  543. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_104, 0x608);
  544. /* change pll sel */
  545. val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
  546. PHY_DEV1F_REG_403);
  547. val &= ~(PHY_PLL_M);
  548. val |= PHY_PLL_SEL(3);
  549. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
  550. /* set divider ratio */
  551. gsw->mmd_write(gsw, 0, PHY_DEV1F,
  552. PHY_DEV1F_REG_10A, 0x1018);
  553. /* set divider ratio */
  554. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10B, 0xc676);
  555. /* capacitance and resistance adjustment */
  556. gsw->mmd_write(gsw, 0, PHY_DEV1F,
  557. PHY_DEV1F_REG_10C, 0xd8be);
  558. break;
  559. }
  560. /* power down pll. additional delay is not required via mdio access */
  561. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10D, 0x10);
  562. /* power up pll */
  563. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_10D, 0x14);
  564. }
  565. static void mt7531_phy_setting(struct gsw_mt753x *gsw)
  566. {
  567. int i;
  568. u32 val;
  569. /* Adjust DAC TX Delay */
  570. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_44, 0xc0);
  571. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  572. /* Disable EEE */
  573. gsw->mmd_write(gsw, i, PHY_DEV07, PHY_DEV07_REG_03C, 0);
  574. /* Enable HW auto downshift */
  575. gsw->mii_write(gsw, i, 0x1f, 0x1);
  576. val = gsw->mii_read(gsw, i, PHY_EXT_REG_14);
  577. val |= PHY_EN_DOWN_SHFIT;
  578. gsw->mii_write(gsw, i, PHY_EXT_REG_14, val);
  579. /* Increase SlvDPSready time */
  580. gsw->mii_write(gsw, i, 0x1f, 0x52b5);
  581. gsw->mii_write(gsw, i, PHY_TR_REG_10, 0xafae);
  582. gsw->mii_write(gsw, i, PHY_TR_REG_12, 0x2f);
  583. gsw->mii_write(gsw, i, PHY_TR_REG_10, 0x8fae);
  584. gsw->mii_write(gsw, i, 0x1f, 0);
  585. /* Adjust 100_mse_threshold */
  586. gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_123, 0xffff);
  587. /* Disable mcc */
  588. gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_A6, 0x300);
  589. /* PHY link down power saving enable */
  590. val = gsw->mii_read(gsw, i, PHY_EXT_REG_17);
  591. val |= PHY_LINKDOWN_POWER_SAVING_EN;
  592. gsw->mii_write(gsw, i, PHY_EXT_REG_17, val);
  593. val = gsw->mmd_read(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_0C6);
  594. val &= ~PHY_POWER_SAVING_M;
  595. val |= PHY_POWER_SAVING_TX << PHY_POWER_SAVING_S;
  596. gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_0C6, val);
  597. /* Set TX Pair delay selection */
  598. gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_13, 0x404);
  599. gsw->mmd_write(gsw, i, PHY_DEV1E, PHY_DEV1E_REG_14, 0x404);
  600. }
  601. }
  602. static void mt7531_adjust_line_driving(struct gsw_mt753x *gsw, u32 port)
  603. {
  604. /* For ADC timing margin window for LDO calibration */
  605. gsw->mmd_write(gsw, port, PHY_DEV1E, RXADC_LDO_CONTROL_2, 0x2222);
  606. /* Adjust AD sample timing */
  607. gsw->mmd_write(gsw, port, PHY_DEV1E, RXADC_CONTROL_3, 0x4444);
  608. /* Adjust Line driver current for different mode */
  609. gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_271, 0x2ca5);
  610. /* Adjust Line driver current for different mode */
  611. gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_272, 0xc6b);
  612. /* Adjust Line driver amplitude for 10BT */
  613. gsw->mmd_write(gsw, port, PHY_DEV1F, TXVLD_DA_273, 0x3000);
  614. /* Adjust RX Echo path filter */
  615. gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_0FE, 0x2);
  616. /* Adjust RX HVGA bias current */
  617. gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_41, 0x3333);
  618. /* Adjust TX class AB driver 1 */
  619. gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_268, 0x388);
  620. /* Adjust TX class AB driver 2 */
  621. gsw->mmd_write(gsw, port, PHY_DEV1F, PHY_DEV1F_REG_269, 0x4448);
  622. }
  623. static void mt7531_eee_setting(struct gsw_mt753x *gsw, u32 port)
  624. {
  625. u32 tr_reg_control;
  626. u32 val;
  627. /* Disable generate signal to clear the scramble_lock when lpi mode */
  628. val = gsw->mmd_read(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_189);
  629. val &= ~DESCRAMBLER_CLEAR_EN;
  630. gsw->mmd_write(gsw, port, PHY_DEV1E, PHY_DEV1E_REG_189, val);
  631. /* roll back CR*/
  632. gsw->mii_write(gsw, port, 0x1f, 0x52b5);
  633. gsw->mmd_write(gsw, port, 0x1e, 0x2d1, 0);
  634. tr_reg_control = (1 << 15) | (0 << 13) | (DSP_CH << 11) |
  635. (DSP_NOD_ADDR << 7) | (0x8 << 1);
  636. gsw->mii_write(gsw, port, 17, 0x1b);
  637. gsw->mii_write(gsw, port, 18, 0);
  638. gsw->mii_write(gsw, port, 16, tr_reg_control);
  639. tr_reg_control = (1 << 15) | (0 << 13) | (DSP_CH << 11) |
  640. (DSP_NOD_ADDR << 7) | (0xf << 1);
  641. gsw->mii_write(gsw, port, 17, 0);
  642. gsw->mii_write(gsw, port, 18, 0);
  643. gsw->mii_write(gsw, port, 16, tr_reg_control);
  644. tr_reg_control = (1 << 15) | (0 << 13) | (DSP_CH << 11) |
  645. (DSP_NOD_ADDR << 7) | (0x10 << 1);
  646. gsw->mii_write(gsw, port, 17, 0x500);
  647. gsw->mii_write(gsw, port, 18, 0);
  648. gsw->mii_write(gsw, port, 16, tr_reg_control);
  649. gsw->mii_write(gsw, port, 0x1f, 0);
  650. }
  651. static int mt7531_sw_init(struct gsw_mt753x *gsw)
  652. {
  653. int i;
  654. u32 val;
  655. gsw->phy_base = (gsw->smi_addr + 1) & MT753X_SMI_ADDR_MASK;
  656. gsw->mii_read = mt753x_mii_read;
  657. gsw->mii_write = mt753x_mii_write;
  658. gsw->mmd_read = mt753x_mmd_read;
  659. gsw->mmd_write = mt753x_mmd_write;
  660. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  661. val = gsw->mii_read(gsw, i, MII_BMCR);
  662. val |= BMCR_ISOLATE;
  663. gsw->mii_write(gsw, i, MII_BMCR, val);
  664. }
  665. /* Force MAC link down before reset */
  666. mt753x_reg_write(gsw, PMCR(5), FORCE_MODE_LNK);
  667. mt753x_reg_write(gsw, PMCR(6), FORCE_MODE_LNK);
  668. /* Switch soft reset */
  669. mt753x_reg_write(gsw, SYS_CTRL, SW_SYS_RST | SW_REG_RST);
  670. usleep_range(10, 20);
  671. /* Enable MDC input Schmitt Trigger */
  672. val = mt753x_reg_read(gsw, SMT0_IOLB);
  673. mt753x_reg_write(gsw, SMT0_IOLB, val | SMT_IOLB_5_SMI_MDC_EN);
  674. /* Set 7531 gpio pinmux */
  675. mt7531_set_gpio_pinmux(gsw);
  676. /* Global mac control settings */
  677. mt753x_reg_write(gsw, GMACCR,
  678. (15 << MTCC_LMT_S) | (11 << MAX_RX_JUMBO_S) |
  679. RX_PKT_LEN_MAX_JUMBO);
  680. mt7531_core_pll_setup(gsw);
  681. mt7531_mac_port_setup(gsw, 5, &gsw->port5_cfg);
  682. mt7531_mac_port_setup(gsw, 6, &gsw->port6_cfg);
  683. return 0;
  684. }
  685. static int mt7531_sw_post_init(struct gsw_mt753x *gsw)
  686. {
  687. int i;
  688. u32 val;
  689. mt7531_phy_pll_setup(gsw);
  690. /* Internal PHYs are disabled by default. SW should enable them.
  691. * Note that this may already be enabled in bootloader stage.
  692. */
  693. val = gsw->mmd_read(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403);
  694. val |= PHY_EN_BYPASS_MODE;
  695. val &= ~POWER_ON_OFF;
  696. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403, val);
  697. mt7531_phy_setting(gsw);
  698. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  699. val = gsw->mii_read(gsw, i, MII_BMCR);
  700. val &= ~BMCR_ISOLATE;
  701. gsw->mii_write(gsw, i, MII_BMCR, val);
  702. }
  703. for (i = 0; i < MT753X_NUM_PHYS; i++)
  704. mt7531_adjust_line_driving(gsw, i);
  705. for (i = 0; i < MT753X_NUM_PHYS; i++)
  706. mt7531_eee_setting(gsw, i);
  707. val = mt753x_reg_read(gsw, CHIP_REV);
  708. val &= CHIP_REV_M;
  709. if (val == CHIP_REV_E1) {
  710. mt7531_internal_phy_calibration(gsw);
  711. } else {
  712. val = mt753x_reg_read(gsw, GBE_EFUSE);
  713. if (val & GBE_SEL_EFUSE_EN) {
  714. val = gsw->mmd_read(gsw, 0, PHY_DEV1F,
  715. PHY_DEV1F_REG_403);
  716. val &= ~GBE_EFUSE_SETTING;
  717. gsw->mmd_write(gsw, 0, PHY_DEV1F, PHY_DEV1F_REG_403,
  718. val);
  719. } else {
  720. mt7531_internal_phy_calibration(gsw);
  721. }
  722. }
  723. return 0;
  724. }
  725. struct mt753x_sw_id mt7531_id = {
  726. .model = MT7531,
  727. .detect = mt7531_sw_detect,
  728. .init = mt7531_sw_init,
  729. .post_init = mt7531_sw_post_init
  730. };
  731. MODULE_LICENSE("GPL");
  732. MODULE_AUTHOR("Zhanguo Ju <[email protected]>");
  733. MODULE_DESCRIPTION("Driver for MediaTek MT753x Gigabit Switch");