sja1105_clocking.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. // SPDX-License-Identifier: BSD-3-Clause
  2. /* Copyright 2016-2018 NXP
  3. * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
  4. */
  5. #include <linux/packing.h>
  6. #include "sja1105.h"
  7. #define SJA1105_SIZE_CGU_CMD 4
  8. #define SJA1110_BASE_MCSS_CLK SJA1110_CGU_ADDR(0x70)
  9. #define SJA1110_BASE_TIMER_CLK SJA1110_CGU_ADDR(0x74)
  10. /* Common structure for CFG_PAD_MIIx_RX and CFG_PAD_MIIx_TX */
  11. struct sja1105_cfg_pad_mii {
  12. u64 d32_os;
  13. u64 d32_ih;
  14. u64 d32_ipud;
  15. u64 d10_ih;
  16. u64 d10_os;
  17. u64 d10_ipud;
  18. u64 ctrl_os;
  19. u64 ctrl_ih;
  20. u64 ctrl_ipud;
  21. u64 clk_os;
  22. u64 clk_ih;
  23. u64 clk_ipud;
  24. };
  25. struct sja1105_cfg_pad_mii_id {
  26. u64 rxc_stable_ovr;
  27. u64 rxc_delay;
  28. u64 rxc_bypass;
  29. u64 rxc_pd;
  30. u64 txc_stable_ovr;
  31. u64 txc_delay;
  32. u64 txc_bypass;
  33. u64 txc_pd;
  34. };
  35. /* UM10944 Table 82.
  36. * IDIV_0_C to IDIV_4_C control registers
  37. * (addr. 10000Bh to 10000Fh)
  38. */
  39. struct sja1105_cgu_idiv {
  40. u64 clksrc;
  41. u64 autoblock;
  42. u64 idiv;
  43. u64 pd;
  44. };
  45. /* PLL_1_C control register
  46. *
  47. * SJA1105 E/T: UM10944 Table 81 (address 10000Ah)
  48. * SJA1105 P/Q/R/S: UM11040 Table 116 (address 10000Ah)
  49. */
  50. struct sja1105_cgu_pll_ctrl {
  51. u64 pllclksrc;
  52. u64 msel;
  53. u64 autoblock;
  54. u64 psel;
  55. u64 direct;
  56. u64 fbsel;
  57. u64 bypass;
  58. u64 pd;
  59. };
  60. struct sja1110_cgu_outclk {
  61. u64 clksrc;
  62. u64 autoblock;
  63. u64 pd;
  64. };
  65. enum {
  66. CLKSRC_MII0_TX_CLK = 0x00,
  67. CLKSRC_MII0_RX_CLK = 0x01,
  68. CLKSRC_MII1_TX_CLK = 0x02,
  69. CLKSRC_MII1_RX_CLK = 0x03,
  70. CLKSRC_MII2_TX_CLK = 0x04,
  71. CLKSRC_MII2_RX_CLK = 0x05,
  72. CLKSRC_MII3_TX_CLK = 0x06,
  73. CLKSRC_MII3_RX_CLK = 0x07,
  74. CLKSRC_MII4_TX_CLK = 0x08,
  75. CLKSRC_MII4_RX_CLK = 0x09,
  76. CLKSRC_PLL0 = 0x0B,
  77. CLKSRC_PLL1 = 0x0E,
  78. CLKSRC_IDIV0 = 0x11,
  79. CLKSRC_IDIV1 = 0x12,
  80. CLKSRC_IDIV2 = 0x13,
  81. CLKSRC_IDIV3 = 0x14,
  82. CLKSRC_IDIV4 = 0x15,
  83. };
  84. /* UM10944 Table 83.
  85. * MIIx clock control registers 1 to 30
  86. * (addresses 100013h to 100035h)
  87. */
  88. struct sja1105_cgu_mii_ctrl {
  89. u64 clksrc;
  90. u64 autoblock;
  91. u64 pd;
  92. };
  93. static void sja1105_cgu_idiv_packing(void *buf, struct sja1105_cgu_idiv *idiv,
  94. enum packing_op op)
  95. {
  96. const int size = 4;
  97. sja1105_packing(buf, &idiv->clksrc, 28, 24, size, op);
  98. sja1105_packing(buf, &idiv->autoblock, 11, 11, size, op);
  99. sja1105_packing(buf, &idiv->idiv, 5, 2, size, op);
  100. sja1105_packing(buf, &idiv->pd, 0, 0, size, op);
  101. }
  102. static int sja1105_cgu_idiv_config(struct sja1105_private *priv, int port,
  103. bool enabled, int factor)
  104. {
  105. const struct sja1105_regs *regs = priv->info->regs;
  106. struct device *dev = priv->ds->dev;
  107. struct sja1105_cgu_idiv idiv;
  108. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  109. if (regs->cgu_idiv[port] == SJA1105_RSV_ADDR)
  110. return 0;
  111. if (enabled && factor != 1 && factor != 10) {
  112. dev_err(dev, "idiv factor must be 1 or 10\n");
  113. return -ERANGE;
  114. }
  115. /* Payload for packed_buf */
  116. idiv.clksrc = 0x0A; /* 25MHz */
  117. idiv.autoblock = 1; /* Block clk automatically */
  118. idiv.idiv = factor - 1; /* Divide by 1 or 10 */
  119. idiv.pd = enabled ? 0 : 1; /* Power down? */
  120. sja1105_cgu_idiv_packing(packed_buf, &idiv, PACK);
  121. return sja1105_xfer_buf(priv, SPI_WRITE, regs->cgu_idiv[port],
  122. packed_buf, SJA1105_SIZE_CGU_CMD);
  123. }
  124. static void
  125. sja1105_cgu_mii_control_packing(void *buf, struct sja1105_cgu_mii_ctrl *cmd,
  126. enum packing_op op)
  127. {
  128. const int size = 4;
  129. sja1105_packing(buf, &cmd->clksrc, 28, 24, size, op);
  130. sja1105_packing(buf, &cmd->autoblock, 11, 11, size, op);
  131. sja1105_packing(buf, &cmd->pd, 0, 0, size, op);
  132. }
  133. static int sja1105_cgu_mii_tx_clk_config(struct sja1105_private *priv,
  134. int port, sja1105_mii_role_t role)
  135. {
  136. const struct sja1105_regs *regs = priv->info->regs;
  137. struct sja1105_cgu_mii_ctrl mii_tx_clk;
  138. static const int mac_clk_sources[] = {
  139. CLKSRC_MII0_TX_CLK,
  140. CLKSRC_MII1_TX_CLK,
  141. CLKSRC_MII2_TX_CLK,
  142. CLKSRC_MII3_TX_CLK,
  143. CLKSRC_MII4_TX_CLK,
  144. };
  145. static const int phy_clk_sources[] = {
  146. CLKSRC_IDIV0,
  147. CLKSRC_IDIV1,
  148. CLKSRC_IDIV2,
  149. CLKSRC_IDIV3,
  150. CLKSRC_IDIV4,
  151. };
  152. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  153. int clksrc;
  154. if (regs->mii_tx_clk[port] == SJA1105_RSV_ADDR)
  155. return 0;
  156. if (role == XMII_MAC)
  157. clksrc = mac_clk_sources[port];
  158. else
  159. clksrc = phy_clk_sources[port];
  160. /* Payload for packed_buf */
  161. mii_tx_clk.clksrc = clksrc;
  162. mii_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  163. mii_tx_clk.pd = 0; /* Power Down off => enabled */
  164. sja1105_cgu_mii_control_packing(packed_buf, &mii_tx_clk, PACK);
  165. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_tx_clk[port],
  166. packed_buf, SJA1105_SIZE_CGU_CMD);
  167. }
  168. static int
  169. sja1105_cgu_mii_rx_clk_config(struct sja1105_private *priv, int port)
  170. {
  171. const struct sja1105_regs *regs = priv->info->regs;
  172. struct sja1105_cgu_mii_ctrl mii_rx_clk;
  173. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  174. static const int clk_sources[] = {
  175. CLKSRC_MII0_RX_CLK,
  176. CLKSRC_MII1_RX_CLK,
  177. CLKSRC_MII2_RX_CLK,
  178. CLKSRC_MII3_RX_CLK,
  179. CLKSRC_MII4_RX_CLK,
  180. };
  181. if (regs->mii_rx_clk[port] == SJA1105_RSV_ADDR)
  182. return 0;
  183. /* Payload for packed_buf */
  184. mii_rx_clk.clksrc = clk_sources[port];
  185. mii_rx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  186. mii_rx_clk.pd = 0; /* Power Down off => enabled */
  187. sja1105_cgu_mii_control_packing(packed_buf, &mii_rx_clk, PACK);
  188. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_rx_clk[port],
  189. packed_buf, SJA1105_SIZE_CGU_CMD);
  190. }
  191. static int
  192. sja1105_cgu_mii_ext_tx_clk_config(struct sja1105_private *priv, int port)
  193. {
  194. const struct sja1105_regs *regs = priv->info->regs;
  195. struct sja1105_cgu_mii_ctrl mii_ext_tx_clk;
  196. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  197. static const int clk_sources[] = {
  198. CLKSRC_IDIV0,
  199. CLKSRC_IDIV1,
  200. CLKSRC_IDIV2,
  201. CLKSRC_IDIV3,
  202. CLKSRC_IDIV4,
  203. };
  204. if (regs->mii_ext_tx_clk[port] == SJA1105_RSV_ADDR)
  205. return 0;
  206. /* Payload for packed_buf */
  207. mii_ext_tx_clk.clksrc = clk_sources[port];
  208. mii_ext_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  209. mii_ext_tx_clk.pd = 0; /* Power Down off => enabled */
  210. sja1105_cgu_mii_control_packing(packed_buf, &mii_ext_tx_clk, PACK);
  211. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_ext_tx_clk[port],
  212. packed_buf, SJA1105_SIZE_CGU_CMD);
  213. }
  214. static int
  215. sja1105_cgu_mii_ext_rx_clk_config(struct sja1105_private *priv, int port)
  216. {
  217. const struct sja1105_regs *regs = priv->info->regs;
  218. struct sja1105_cgu_mii_ctrl mii_ext_rx_clk;
  219. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  220. static const int clk_sources[] = {
  221. CLKSRC_IDIV0,
  222. CLKSRC_IDIV1,
  223. CLKSRC_IDIV2,
  224. CLKSRC_IDIV3,
  225. CLKSRC_IDIV4,
  226. };
  227. if (regs->mii_ext_rx_clk[port] == SJA1105_RSV_ADDR)
  228. return 0;
  229. /* Payload for packed_buf */
  230. mii_ext_rx_clk.clksrc = clk_sources[port];
  231. mii_ext_rx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  232. mii_ext_rx_clk.pd = 0; /* Power Down off => enabled */
  233. sja1105_cgu_mii_control_packing(packed_buf, &mii_ext_rx_clk, PACK);
  234. return sja1105_xfer_buf(priv, SPI_WRITE, regs->mii_ext_rx_clk[port],
  235. packed_buf, SJA1105_SIZE_CGU_CMD);
  236. }
  237. static int sja1105_mii_clocking_setup(struct sja1105_private *priv, int port,
  238. sja1105_mii_role_t role)
  239. {
  240. struct device *dev = priv->ds->dev;
  241. int rc;
  242. dev_dbg(dev, "Configuring MII-%s clocking\n",
  243. (role == XMII_MAC) ? "MAC" : "PHY");
  244. /* If role is MAC, disable IDIV
  245. * If role is PHY, enable IDIV and configure for 1/1 divider
  246. */
  247. rc = sja1105_cgu_idiv_config(priv, port, (role == XMII_PHY), 1);
  248. if (rc < 0)
  249. return rc;
  250. /* Configure CLKSRC of MII_TX_CLK_n
  251. * * If role is MAC, select TX_CLK_n
  252. * * If role is PHY, select IDIV_n
  253. */
  254. rc = sja1105_cgu_mii_tx_clk_config(priv, port, role);
  255. if (rc < 0)
  256. return rc;
  257. /* Configure CLKSRC of MII_RX_CLK_n
  258. * Select RX_CLK_n
  259. */
  260. rc = sja1105_cgu_mii_rx_clk_config(priv, port);
  261. if (rc < 0)
  262. return rc;
  263. if (role == XMII_PHY) {
  264. /* Per MII spec, the PHY (which is us) drives the TX_CLK pin */
  265. /* Configure CLKSRC of EXT_TX_CLK_n
  266. * Select IDIV_n
  267. */
  268. rc = sja1105_cgu_mii_ext_tx_clk_config(priv, port);
  269. if (rc < 0)
  270. return rc;
  271. /* Configure CLKSRC of EXT_RX_CLK_n
  272. * Select IDIV_n
  273. */
  274. rc = sja1105_cgu_mii_ext_rx_clk_config(priv, port);
  275. if (rc < 0)
  276. return rc;
  277. }
  278. return 0;
  279. }
  280. static void
  281. sja1105_cgu_pll_control_packing(void *buf, struct sja1105_cgu_pll_ctrl *cmd,
  282. enum packing_op op)
  283. {
  284. const int size = 4;
  285. sja1105_packing(buf, &cmd->pllclksrc, 28, 24, size, op);
  286. sja1105_packing(buf, &cmd->msel, 23, 16, size, op);
  287. sja1105_packing(buf, &cmd->autoblock, 11, 11, size, op);
  288. sja1105_packing(buf, &cmd->psel, 9, 8, size, op);
  289. sja1105_packing(buf, &cmd->direct, 7, 7, size, op);
  290. sja1105_packing(buf, &cmd->fbsel, 6, 6, size, op);
  291. sja1105_packing(buf, &cmd->bypass, 1, 1, size, op);
  292. sja1105_packing(buf, &cmd->pd, 0, 0, size, op);
  293. }
  294. static int sja1105_cgu_rgmii_tx_clk_config(struct sja1105_private *priv,
  295. int port, u64 speed)
  296. {
  297. const struct sja1105_regs *regs = priv->info->regs;
  298. struct sja1105_cgu_mii_ctrl txc;
  299. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  300. int clksrc;
  301. if (regs->rgmii_tx_clk[port] == SJA1105_RSV_ADDR)
  302. return 0;
  303. if (speed == priv->info->port_speed[SJA1105_SPEED_1000MBPS]) {
  304. clksrc = CLKSRC_PLL0;
  305. } else {
  306. static const int clk_sources[] = {
  307. CLKSRC_IDIV0,
  308. CLKSRC_IDIV1,
  309. CLKSRC_IDIV2,
  310. CLKSRC_IDIV3,
  311. CLKSRC_IDIV4,
  312. };
  313. clksrc = clk_sources[port];
  314. }
  315. /* RGMII: 125MHz for 1000, 25MHz for 100, 2.5MHz for 10 */
  316. txc.clksrc = clksrc;
  317. /* Autoblock clk while changing clksrc */
  318. txc.autoblock = 1;
  319. /* Power Down off => enabled */
  320. txc.pd = 0;
  321. sja1105_cgu_mii_control_packing(packed_buf, &txc, PACK);
  322. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgmii_tx_clk[port],
  323. packed_buf, SJA1105_SIZE_CGU_CMD);
  324. }
  325. /* AGU */
  326. static void
  327. sja1105_cfg_pad_mii_packing(void *buf, struct sja1105_cfg_pad_mii *cmd,
  328. enum packing_op op)
  329. {
  330. const int size = 4;
  331. sja1105_packing(buf, &cmd->d32_os, 28, 27, size, op);
  332. sja1105_packing(buf, &cmd->d32_ih, 26, 26, size, op);
  333. sja1105_packing(buf, &cmd->d32_ipud, 25, 24, size, op);
  334. sja1105_packing(buf, &cmd->d10_os, 20, 19, size, op);
  335. sja1105_packing(buf, &cmd->d10_ih, 18, 18, size, op);
  336. sja1105_packing(buf, &cmd->d10_ipud, 17, 16, size, op);
  337. sja1105_packing(buf, &cmd->ctrl_os, 12, 11, size, op);
  338. sja1105_packing(buf, &cmd->ctrl_ih, 10, 10, size, op);
  339. sja1105_packing(buf, &cmd->ctrl_ipud, 9, 8, size, op);
  340. sja1105_packing(buf, &cmd->clk_os, 4, 3, size, op);
  341. sja1105_packing(buf, &cmd->clk_ih, 2, 2, size, op);
  342. sja1105_packing(buf, &cmd->clk_ipud, 1, 0, size, op);
  343. }
  344. static int sja1105_rgmii_cfg_pad_tx_config(struct sja1105_private *priv,
  345. int port)
  346. {
  347. const struct sja1105_regs *regs = priv->info->regs;
  348. struct sja1105_cfg_pad_mii pad_mii_tx = {0};
  349. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  350. if (regs->pad_mii_tx[port] == SJA1105_RSV_ADDR)
  351. return 0;
  352. /* Payload */
  353. pad_mii_tx.d32_os = 3; /* TXD[3:2] output stage: */
  354. /* high noise/high speed */
  355. pad_mii_tx.d10_os = 3; /* TXD[1:0] output stage: */
  356. /* high noise/high speed */
  357. pad_mii_tx.d32_ipud = 2; /* TXD[3:2] input stage: */
  358. /* plain input (default) */
  359. pad_mii_tx.d10_ipud = 2; /* TXD[1:0] input stage: */
  360. /* plain input (default) */
  361. pad_mii_tx.ctrl_os = 3; /* TX_CTL / TX_ER output stage */
  362. pad_mii_tx.ctrl_ipud = 2; /* TX_CTL / TX_ER input stage (default) */
  363. pad_mii_tx.clk_os = 3; /* TX_CLK output stage */
  364. pad_mii_tx.clk_ih = 0; /* TX_CLK input hysteresis (default) */
  365. pad_mii_tx.clk_ipud = 2; /* TX_CLK input stage (default) */
  366. sja1105_cfg_pad_mii_packing(packed_buf, &pad_mii_tx, PACK);
  367. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_tx[port],
  368. packed_buf, SJA1105_SIZE_CGU_CMD);
  369. }
  370. static int sja1105_cfg_pad_rx_config(struct sja1105_private *priv, int port)
  371. {
  372. const struct sja1105_regs *regs = priv->info->regs;
  373. struct sja1105_cfg_pad_mii pad_mii_rx = {0};
  374. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  375. if (regs->pad_mii_rx[port] == SJA1105_RSV_ADDR)
  376. return 0;
  377. /* Payload */
  378. pad_mii_rx.d32_ih = 0; /* RXD[3:2] input stage hysteresis: */
  379. /* non-Schmitt (default) */
  380. pad_mii_rx.d32_ipud = 2; /* RXD[3:2] input weak pull-up/down */
  381. /* plain input (default) */
  382. pad_mii_rx.d10_ih = 0; /* RXD[1:0] input stage hysteresis: */
  383. /* non-Schmitt (default) */
  384. pad_mii_rx.d10_ipud = 2; /* RXD[1:0] input weak pull-up/down */
  385. /* plain input (default) */
  386. pad_mii_rx.ctrl_ih = 0; /* RX_DV/CRS_DV/RX_CTL and RX_ER */
  387. /* input stage hysteresis: */
  388. /* non-Schmitt (default) */
  389. pad_mii_rx.ctrl_ipud = 3; /* RX_DV/CRS_DV/RX_CTL and RX_ER */
  390. /* input stage weak pull-up/down: */
  391. /* pull-down */
  392. pad_mii_rx.clk_os = 2; /* RX_CLK/RXC output stage: */
  393. /* medium noise/fast speed (default) */
  394. pad_mii_rx.clk_ih = 0; /* RX_CLK/RXC input hysteresis: */
  395. /* non-Schmitt (default) */
  396. pad_mii_rx.clk_ipud = 2; /* RX_CLK/RXC input pull-up/down: */
  397. /* plain input (default) */
  398. sja1105_cfg_pad_mii_packing(packed_buf, &pad_mii_rx, PACK);
  399. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_rx[port],
  400. packed_buf, SJA1105_SIZE_CGU_CMD);
  401. }
  402. static void
  403. sja1105_cfg_pad_mii_id_packing(void *buf, struct sja1105_cfg_pad_mii_id *cmd,
  404. enum packing_op op)
  405. {
  406. const int size = SJA1105_SIZE_CGU_CMD;
  407. sja1105_packing(buf, &cmd->rxc_stable_ovr, 15, 15, size, op);
  408. sja1105_packing(buf, &cmd->rxc_delay, 14, 10, size, op);
  409. sja1105_packing(buf, &cmd->rxc_bypass, 9, 9, size, op);
  410. sja1105_packing(buf, &cmd->rxc_pd, 8, 8, size, op);
  411. sja1105_packing(buf, &cmd->txc_stable_ovr, 7, 7, size, op);
  412. sja1105_packing(buf, &cmd->txc_delay, 6, 2, size, op);
  413. sja1105_packing(buf, &cmd->txc_bypass, 1, 1, size, op);
  414. sja1105_packing(buf, &cmd->txc_pd, 0, 0, size, op);
  415. }
  416. static void
  417. sja1110_cfg_pad_mii_id_packing(void *buf, struct sja1105_cfg_pad_mii_id *cmd,
  418. enum packing_op op)
  419. {
  420. const int size = SJA1105_SIZE_CGU_CMD;
  421. u64 range = 4;
  422. /* Fields RXC_RANGE and TXC_RANGE select the input frequency range:
  423. * 0 = 2.5MHz
  424. * 1 = 25MHz
  425. * 2 = 50MHz
  426. * 3 = 125MHz
  427. * 4 = Automatically determined by port speed.
  428. * There's no point in defining a structure different than the one for
  429. * SJA1105, so just hardcode the frequency range to automatic, just as
  430. * before.
  431. */
  432. sja1105_packing(buf, &cmd->rxc_stable_ovr, 26, 26, size, op);
  433. sja1105_packing(buf, &cmd->rxc_delay, 25, 21, size, op);
  434. sja1105_packing(buf, &range, 20, 18, size, op);
  435. sja1105_packing(buf, &cmd->rxc_bypass, 17, 17, size, op);
  436. sja1105_packing(buf, &cmd->rxc_pd, 16, 16, size, op);
  437. sja1105_packing(buf, &cmd->txc_stable_ovr, 10, 10, size, op);
  438. sja1105_packing(buf, &cmd->txc_delay, 9, 5, size, op);
  439. sja1105_packing(buf, &range, 4, 2, size, op);
  440. sja1105_packing(buf, &cmd->txc_bypass, 1, 1, size, op);
  441. sja1105_packing(buf, &cmd->txc_pd, 0, 0, size, op);
  442. }
  443. /* The RGMII delay setup procedure is 2-step and gets called upon each
  444. * .phylink_mac_config. Both are strategic.
  445. * The reason is that the RX Tunable Delay Line of the SJA1105 MAC has issues
  446. * with recovering from a frequency change of the link partner's RGMII clock.
  447. * The easiest way to recover from this is to temporarily power down the TDL,
  448. * as it will re-lock at the new frequency afterwards.
  449. */
  450. int sja1105pqrs_setup_rgmii_delay(const void *ctx, int port)
  451. {
  452. const struct sja1105_private *priv = ctx;
  453. const struct sja1105_regs *regs = priv->info->regs;
  454. struct sja1105_cfg_pad_mii_id pad_mii_id = {0};
  455. int rx_delay = priv->rgmii_rx_delay_ps[port];
  456. int tx_delay = priv->rgmii_tx_delay_ps[port];
  457. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  458. int rc;
  459. if (rx_delay)
  460. pad_mii_id.rxc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(rx_delay);
  461. if (tx_delay)
  462. pad_mii_id.txc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(tx_delay);
  463. /* Stage 1: Turn the RGMII delay lines off. */
  464. pad_mii_id.rxc_bypass = 1;
  465. pad_mii_id.rxc_pd = 1;
  466. pad_mii_id.txc_bypass = 1;
  467. pad_mii_id.txc_pd = 1;
  468. sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  469. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  470. packed_buf, SJA1105_SIZE_CGU_CMD);
  471. if (rc < 0)
  472. return rc;
  473. /* Stage 2: Turn the RGMII delay lines on. */
  474. if (rx_delay) {
  475. pad_mii_id.rxc_bypass = 0;
  476. pad_mii_id.rxc_pd = 0;
  477. }
  478. if (tx_delay) {
  479. pad_mii_id.txc_bypass = 0;
  480. pad_mii_id.txc_pd = 0;
  481. }
  482. sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  483. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  484. packed_buf, SJA1105_SIZE_CGU_CMD);
  485. }
  486. int sja1110_setup_rgmii_delay(const void *ctx, int port)
  487. {
  488. const struct sja1105_private *priv = ctx;
  489. const struct sja1105_regs *regs = priv->info->regs;
  490. struct sja1105_cfg_pad_mii_id pad_mii_id = {0};
  491. int rx_delay = priv->rgmii_rx_delay_ps[port];
  492. int tx_delay = priv->rgmii_tx_delay_ps[port];
  493. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  494. pad_mii_id.rxc_pd = 1;
  495. pad_mii_id.txc_pd = 1;
  496. if (rx_delay) {
  497. pad_mii_id.rxc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(rx_delay);
  498. /* The "BYPASS" bit in SJA1110 is actually a "don't bypass" */
  499. pad_mii_id.rxc_bypass = 1;
  500. pad_mii_id.rxc_pd = 0;
  501. }
  502. if (tx_delay) {
  503. pad_mii_id.txc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(tx_delay);
  504. pad_mii_id.txc_bypass = 1;
  505. pad_mii_id.txc_pd = 0;
  506. }
  507. sja1110_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  508. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  509. packed_buf, SJA1105_SIZE_CGU_CMD);
  510. }
  511. static int sja1105_rgmii_clocking_setup(struct sja1105_private *priv, int port,
  512. sja1105_mii_role_t role)
  513. {
  514. struct device *dev = priv->ds->dev;
  515. struct sja1105_mac_config_entry *mac;
  516. u64 speed;
  517. int rc;
  518. mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
  519. speed = mac[port].speed;
  520. dev_dbg(dev, "Configuring port %d RGMII at speed %lldMbps\n",
  521. port, speed);
  522. if (speed == priv->info->port_speed[SJA1105_SPEED_1000MBPS]) {
  523. /* 1000Mbps, IDIV disabled (125 MHz) */
  524. rc = sja1105_cgu_idiv_config(priv, port, false, 1);
  525. } else if (speed == priv->info->port_speed[SJA1105_SPEED_100MBPS]) {
  526. /* 100Mbps, IDIV enabled, divide by 1 (25 MHz) */
  527. rc = sja1105_cgu_idiv_config(priv, port, true, 1);
  528. } else if (speed == priv->info->port_speed[SJA1105_SPEED_10MBPS]) {
  529. /* 10Mbps, IDIV enabled, divide by 10 (2.5 MHz) */
  530. rc = sja1105_cgu_idiv_config(priv, port, true, 10);
  531. } else if (speed == priv->info->port_speed[SJA1105_SPEED_AUTO]) {
  532. /* Skip CGU configuration if there is no speed available
  533. * (e.g. link is not established yet)
  534. */
  535. dev_dbg(dev, "Speed not available, skipping CGU config\n");
  536. return 0;
  537. } else {
  538. rc = -EINVAL;
  539. }
  540. if (rc < 0) {
  541. dev_err(dev, "Failed to configure idiv\n");
  542. return rc;
  543. }
  544. rc = sja1105_cgu_rgmii_tx_clk_config(priv, port, speed);
  545. if (rc < 0) {
  546. dev_err(dev, "Failed to configure RGMII Tx clock\n");
  547. return rc;
  548. }
  549. rc = sja1105_rgmii_cfg_pad_tx_config(priv, port);
  550. if (rc < 0) {
  551. dev_err(dev, "Failed to configure Tx pad registers\n");
  552. return rc;
  553. }
  554. if (!priv->info->setup_rgmii_delay)
  555. return 0;
  556. return priv->info->setup_rgmii_delay(priv, port);
  557. }
  558. static int sja1105_cgu_rmii_ref_clk_config(struct sja1105_private *priv,
  559. int port)
  560. {
  561. const struct sja1105_regs *regs = priv->info->regs;
  562. struct sja1105_cgu_mii_ctrl ref_clk;
  563. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  564. static const int clk_sources[] = {
  565. CLKSRC_MII0_TX_CLK,
  566. CLKSRC_MII1_TX_CLK,
  567. CLKSRC_MII2_TX_CLK,
  568. CLKSRC_MII3_TX_CLK,
  569. CLKSRC_MII4_TX_CLK,
  570. };
  571. if (regs->rmii_ref_clk[port] == SJA1105_RSV_ADDR)
  572. return 0;
  573. /* Payload for packed_buf */
  574. ref_clk.clksrc = clk_sources[port];
  575. ref_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  576. ref_clk.pd = 0; /* Power Down off => enabled */
  577. sja1105_cgu_mii_control_packing(packed_buf, &ref_clk, PACK);
  578. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ref_clk[port],
  579. packed_buf, SJA1105_SIZE_CGU_CMD);
  580. }
  581. static int
  582. sja1105_cgu_rmii_ext_tx_clk_config(struct sja1105_private *priv, int port)
  583. {
  584. const struct sja1105_regs *regs = priv->info->regs;
  585. struct sja1105_cgu_mii_ctrl ext_tx_clk;
  586. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  587. if (regs->rmii_ext_tx_clk[port] == SJA1105_RSV_ADDR)
  588. return 0;
  589. /* Payload for packed_buf */
  590. ext_tx_clk.clksrc = CLKSRC_PLL1;
  591. ext_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  592. ext_tx_clk.pd = 0; /* Power Down off => enabled */
  593. sja1105_cgu_mii_control_packing(packed_buf, &ext_tx_clk, PACK);
  594. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ext_tx_clk[port],
  595. packed_buf, SJA1105_SIZE_CGU_CMD);
  596. }
  597. static int sja1105_cgu_rmii_pll_config(struct sja1105_private *priv)
  598. {
  599. const struct sja1105_regs *regs = priv->info->regs;
  600. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  601. struct sja1105_cgu_pll_ctrl pll = {0};
  602. struct device *dev = priv->ds->dev;
  603. int rc;
  604. if (regs->rmii_pll1 == SJA1105_RSV_ADDR)
  605. return 0;
  606. /* PLL1 must be enabled and output 50 Mhz.
  607. * This is done by writing first 0x0A010941 to
  608. * the PLL_1_C register and then deasserting
  609. * power down (PD) 0x0A010940.
  610. */
  611. /* Step 1: PLL1 setup for 50Mhz */
  612. pll.pllclksrc = 0xA;
  613. pll.msel = 0x1;
  614. pll.autoblock = 0x1;
  615. pll.psel = 0x1;
  616. pll.direct = 0x0;
  617. pll.fbsel = 0x1;
  618. pll.bypass = 0x0;
  619. pll.pd = 0x1;
  620. sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
  621. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
  622. SJA1105_SIZE_CGU_CMD);
  623. if (rc < 0) {
  624. dev_err(dev, "failed to configure PLL1 for 50MHz\n");
  625. return rc;
  626. }
  627. /* Step 2: Enable PLL1 */
  628. pll.pd = 0x0;
  629. sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
  630. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
  631. SJA1105_SIZE_CGU_CMD);
  632. if (rc < 0) {
  633. dev_err(dev, "failed to enable PLL1\n");
  634. return rc;
  635. }
  636. return rc;
  637. }
  638. static int sja1105_rmii_clocking_setup(struct sja1105_private *priv, int port,
  639. sja1105_mii_role_t role)
  640. {
  641. struct device *dev = priv->ds->dev;
  642. int rc;
  643. dev_dbg(dev, "Configuring RMII-%s clocking\n",
  644. (role == XMII_MAC) ? "MAC" : "PHY");
  645. /* AH1601.pdf chapter 2.5.1. Sources */
  646. if (role == XMII_MAC) {
  647. /* Configure and enable PLL1 for 50Mhz output */
  648. rc = sja1105_cgu_rmii_pll_config(priv);
  649. if (rc < 0)
  650. return rc;
  651. }
  652. /* Disable IDIV for this port */
  653. rc = sja1105_cgu_idiv_config(priv, port, false, 1);
  654. if (rc < 0)
  655. return rc;
  656. /* Source to sink mappings */
  657. rc = sja1105_cgu_rmii_ref_clk_config(priv, port);
  658. if (rc < 0)
  659. return rc;
  660. if (role == XMII_MAC) {
  661. rc = sja1105_cgu_rmii_ext_tx_clk_config(priv, port);
  662. if (rc < 0)
  663. return rc;
  664. }
  665. return 0;
  666. }
  667. int sja1105_clocking_setup_port(struct sja1105_private *priv, int port)
  668. {
  669. struct sja1105_xmii_params_entry *mii;
  670. struct device *dev = priv->ds->dev;
  671. sja1105_phy_interface_t phy_mode;
  672. sja1105_mii_role_t role;
  673. int rc;
  674. mii = priv->static_config.tables[BLK_IDX_XMII_PARAMS].entries;
  675. /* RGMII etc */
  676. phy_mode = mii->xmii_mode[port];
  677. /* MAC or PHY, for applicable types (not RGMII) */
  678. role = mii->phy_mac[port];
  679. switch (phy_mode) {
  680. case XMII_MODE_MII:
  681. rc = sja1105_mii_clocking_setup(priv, port, role);
  682. break;
  683. case XMII_MODE_RMII:
  684. rc = sja1105_rmii_clocking_setup(priv, port, role);
  685. break;
  686. case XMII_MODE_RGMII:
  687. rc = sja1105_rgmii_clocking_setup(priv, port, role);
  688. break;
  689. case XMII_MODE_SGMII:
  690. /* Nothing to do in the CGU for SGMII */
  691. rc = 0;
  692. break;
  693. default:
  694. dev_err(dev, "Invalid interface mode specified: %d\n",
  695. phy_mode);
  696. return -EINVAL;
  697. }
  698. if (rc) {
  699. dev_err(dev, "Clocking setup for port %d failed: %d\n",
  700. port, rc);
  701. return rc;
  702. }
  703. /* Internally pull down the RX_DV/CRS_DV/RX_CTL and RX_ER inputs */
  704. return sja1105_cfg_pad_rx_config(priv, port);
  705. }
  706. int sja1105_clocking_setup(struct sja1105_private *priv)
  707. {
  708. struct dsa_switch *ds = priv->ds;
  709. int port, rc;
  710. for (port = 0; port < ds->num_ports; port++) {
  711. rc = sja1105_clocking_setup_port(priv, port);
  712. if (rc < 0)
  713. return rc;
  714. }
  715. return 0;
  716. }
  717. static void
  718. sja1110_cgu_outclk_packing(void *buf, struct sja1110_cgu_outclk *outclk,
  719. enum packing_op op)
  720. {
  721. const int size = 4;
  722. sja1105_packing(buf, &outclk->clksrc, 27, 24, size, op);
  723. sja1105_packing(buf, &outclk->autoblock, 11, 11, size, op);
  724. sja1105_packing(buf, &outclk->pd, 0, 0, size, op);
  725. }
  726. int sja1110_disable_microcontroller(struct sja1105_private *priv)
  727. {
  728. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  729. struct sja1110_cgu_outclk outclk_6_c = {
  730. .clksrc = 0x3,
  731. .pd = true,
  732. };
  733. struct sja1110_cgu_outclk outclk_7_c = {
  734. .clksrc = 0x5,
  735. .pd = true,
  736. };
  737. int rc;
  738. /* Power down the BASE_TIMER_CLK to disable the watchdog timer */
  739. sja1110_cgu_outclk_packing(packed_buf, &outclk_7_c, PACK);
  740. rc = sja1105_xfer_buf(priv, SPI_WRITE, SJA1110_BASE_TIMER_CLK,
  741. packed_buf, SJA1105_SIZE_CGU_CMD);
  742. if (rc)
  743. return rc;
  744. /* Power down the BASE_MCSS_CLOCK to gate the microcontroller off */
  745. sja1110_cgu_outclk_packing(packed_buf, &outclk_6_c, PACK);
  746. return sja1105_xfer_buf(priv, SPI_WRITE, SJA1110_BASE_MCSS_CLK,
  747. packed_buf, SJA1105_SIZE_CGU_CMD);
  748. }