sja1105_clocking.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855
  1. // SPDX-License-Identifier: BSD-3-Clause
  2. /* Copyright 2016-2018 NXP
  3. * Copyright (c) 2018-2019, Vladimir Oltean <[email protected]>
  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. 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. 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. 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. 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. 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. int clk_sources[] = {CLKSRC_IDIV0, CLKSRC_IDIV1, CLKSRC_IDIV2,
  307. CLKSRC_IDIV3, CLKSRC_IDIV4};
  308. clksrc = clk_sources[port];
  309. }
  310. /* RGMII: 125MHz for 1000, 25MHz for 100, 2.5MHz for 10 */
  311. txc.clksrc = clksrc;
  312. /* Autoblock clk while changing clksrc */
  313. txc.autoblock = 1;
  314. /* Power Down off => enabled */
  315. txc.pd = 0;
  316. sja1105_cgu_mii_control_packing(packed_buf, &txc, PACK);
  317. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgmii_tx_clk[port],
  318. packed_buf, SJA1105_SIZE_CGU_CMD);
  319. }
  320. /* AGU */
  321. static void
  322. sja1105_cfg_pad_mii_packing(void *buf, struct sja1105_cfg_pad_mii *cmd,
  323. enum packing_op op)
  324. {
  325. const int size = 4;
  326. sja1105_packing(buf, &cmd->d32_os, 28, 27, size, op);
  327. sja1105_packing(buf, &cmd->d32_ih, 26, 26, size, op);
  328. sja1105_packing(buf, &cmd->d32_ipud, 25, 24, size, op);
  329. sja1105_packing(buf, &cmd->d10_os, 20, 19, size, op);
  330. sja1105_packing(buf, &cmd->d10_ih, 18, 18, size, op);
  331. sja1105_packing(buf, &cmd->d10_ipud, 17, 16, size, op);
  332. sja1105_packing(buf, &cmd->ctrl_os, 12, 11, size, op);
  333. sja1105_packing(buf, &cmd->ctrl_ih, 10, 10, size, op);
  334. sja1105_packing(buf, &cmd->ctrl_ipud, 9, 8, size, op);
  335. sja1105_packing(buf, &cmd->clk_os, 4, 3, size, op);
  336. sja1105_packing(buf, &cmd->clk_ih, 2, 2, size, op);
  337. sja1105_packing(buf, &cmd->clk_ipud, 1, 0, size, op);
  338. }
  339. static int sja1105_rgmii_cfg_pad_tx_config(struct sja1105_private *priv,
  340. int port)
  341. {
  342. const struct sja1105_regs *regs = priv->info->regs;
  343. struct sja1105_cfg_pad_mii pad_mii_tx = {0};
  344. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  345. if (regs->pad_mii_tx[port] == SJA1105_RSV_ADDR)
  346. return 0;
  347. /* Payload */
  348. pad_mii_tx.d32_os = 3; /* TXD[3:2] output stage: */
  349. /* high noise/high speed */
  350. pad_mii_tx.d10_os = 3; /* TXD[1:0] output stage: */
  351. /* high noise/high speed */
  352. pad_mii_tx.d32_ipud = 2; /* TXD[3:2] input stage: */
  353. /* plain input (default) */
  354. pad_mii_tx.d10_ipud = 2; /* TXD[1:0] input stage: */
  355. /* plain input (default) */
  356. pad_mii_tx.ctrl_os = 3; /* TX_CTL / TX_ER output stage */
  357. pad_mii_tx.ctrl_ipud = 2; /* TX_CTL / TX_ER input stage (default) */
  358. pad_mii_tx.clk_os = 3; /* TX_CLK output stage */
  359. pad_mii_tx.clk_ih = 0; /* TX_CLK input hysteresis (default) */
  360. pad_mii_tx.clk_ipud = 2; /* TX_CLK input stage (default) */
  361. sja1105_cfg_pad_mii_packing(packed_buf, &pad_mii_tx, PACK);
  362. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_tx[port],
  363. packed_buf, SJA1105_SIZE_CGU_CMD);
  364. }
  365. static int sja1105_cfg_pad_rx_config(struct sja1105_private *priv, int port)
  366. {
  367. const struct sja1105_regs *regs = priv->info->regs;
  368. struct sja1105_cfg_pad_mii pad_mii_rx = {0};
  369. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  370. if (regs->pad_mii_rx[port] == SJA1105_RSV_ADDR)
  371. return 0;
  372. /* Payload */
  373. pad_mii_rx.d32_ih = 0; /* RXD[3:2] input stage hysteresis: */
  374. /* non-Schmitt (default) */
  375. pad_mii_rx.d32_ipud = 2; /* RXD[3:2] input weak pull-up/down */
  376. /* plain input (default) */
  377. pad_mii_rx.d10_ih = 0; /* RXD[1:0] input stage hysteresis: */
  378. /* non-Schmitt (default) */
  379. pad_mii_rx.d10_ipud = 2; /* RXD[1:0] input weak pull-up/down */
  380. /* plain input (default) */
  381. pad_mii_rx.ctrl_ih = 0; /* RX_DV/CRS_DV/RX_CTL and RX_ER */
  382. /* input stage hysteresis: */
  383. /* non-Schmitt (default) */
  384. pad_mii_rx.ctrl_ipud = 3; /* RX_DV/CRS_DV/RX_CTL and RX_ER */
  385. /* input stage weak pull-up/down: */
  386. /* pull-down */
  387. pad_mii_rx.clk_os = 2; /* RX_CLK/RXC output stage: */
  388. /* medium noise/fast speed (default) */
  389. pad_mii_rx.clk_ih = 0; /* RX_CLK/RXC input hysteresis: */
  390. /* non-Schmitt (default) */
  391. pad_mii_rx.clk_ipud = 2; /* RX_CLK/RXC input pull-up/down: */
  392. /* plain input (default) */
  393. sja1105_cfg_pad_mii_packing(packed_buf, &pad_mii_rx, PACK);
  394. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_rx[port],
  395. packed_buf, SJA1105_SIZE_CGU_CMD);
  396. }
  397. static void
  398. sja1105_cfg_pad_mii_id_packing(void *buf, struct sja1105_cfg_pad_mii_id *cmd,
  399. enum packing_op op)
  400. {
  401. const int size = SJA1105_SIZE_CGU_CMD;
  402. sja1105_packing(buf, &cmd->rxc_stable_ovr, 15, 15, size, op);
  403. sja1105_packing(buf, &cmd->rxc_delay, 14, 10, size, op);
  404. sja1105_packing(buf, &cmd->rxc_bypass, 9, 9, size, op);
  405. sja1105_packing(buf, &cmd->rxc_pd, 8, 8, size, op);
  406. sja1105_packing(buf, &cmd->txc_stable_ovr, 7, 7, size, op);
  407. sja1105_packing(buf, &cmd->txc_delay, 6, 2, size, op);
  408. sja1105_packing(buf, &cmd->txc_bypass, 1, 1, size, op);
  409. sja1105_packing(buf, &cmd->txc_pd, 0, 0, size, op);
  410. }
  411. static void
  412. sja1110_cfg_pad_mii_id_packing(void *buf, struct sja1105_cfg_pad_mii_id *cmd,
  413. enum packing_op op)
  414. {
  415. const int size = SJA1105_SIZE_CGU_CMD;
  416. u64 range = 4;
  417. /* Fields RXC_RANGE and TXC_RANGE select the input frequency range:
  418. * 0 = 2.5MHz
  419. * 1 = 25MHz
  420. * 2 = 50MHz
  421. * 3 = 125MHz
  422. * 4 = Automatically determined by port speed.
  423. * There's no point in defining a structure different than the one for
  424. * SJA1105, so just hardcode the frequency range to automatic, just as
  425. * before.
  426. */
  427. sja1105_packing(buf, &cmd->rxc_stable_ovr, 26, 26, size, op);
  428. sja1105_packing(buf, &cmd->rxc_delay, 25, 21, size, op);
  429. sja1105_packing(buf, &range, 20, 18, size, op);
  430. sja1105_packing(buf, &cmd->rxc_bypass, 17, 17, size, op);
  431. sja1105_packing(buf, &cmd->rxc_pd, 16, 16, size, op);
  432. sja1105_packing(buf, &cmd->txc_stable_ovr, 10, 10, size, op);
  433. sja1105_packing(buf, &cmd->txc_delay, 9, 5, size, op);
  434. sja1105_packing(buf, &range, 4, 2, size, op);
  435. sja1105_packing(buf, &cmd->txc_bypass, 1, 1, size, op);
  436. sja1105_packing(buf, &cmd->txc_pd, 0, 0, size, op);
  437. }
  438. /* The RGMII delay setup procedure is 2-step and gets called upon each
  439. * .phylink_mac_config. Both are strategic.
  440. * The reason is that the RX Tunable Delay Line of the SJA1105 MAC has issues
  441. * with recovering from a frequency change of the link partner's RGMII clock.
  442. * The easiest way to recover from this is to temporarily power down the TDL,
  443. * as it will re-lock at the new frequency afterwards.
  444. */
  445. int sja1105pqrs_setup_rgmii_delay(const void *ctx, int port)
  446. {
  447. const struct sja1105_private *priv = ctx;
  448. const struct sja1105_regs *regs = priv->info->regs;
  449. struct sja1105_cfg_pad_mii_id pad_mii_id = {0};
  450. int rx_delay = priv->rgmii_rx_delay_ps[port];
  451. int tx_delay = priv->rgmii_tx_delay_ps[port];
  452. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  453. int rc;
  454. if (rx_delay)
  455. pad_mii_id.rxc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(rx_delay);
  456. if (tx_delay)
  457. pad_mii_id.txc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(tx_delay);
  458. /* Stage 1: Turn the RGMII delay lines off. */
  459. pad_mii_id.rxc_bypass = 1;
  460. pad_mii_id.rxc_pd = 1;
  461. pad_mii_id.txc_bypass = 1;
  462. pad_mii_id.txc_pd = 1;
  463. sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  464. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  465. packed_buf, SJA1105_SIZE_CGU_CMD);
  466. if (rc < 0)
  467. return rc;
  468. /* Stage 2: Turn the RGMII delay lines on. */
  469. if (rx_delay) {
  470. pad_mii_id.rxc_bypass = 0;
  471. pad_mii_id.rxc_pd = 0;
  472. }
  473. if (tx_delay) {
  474. pad_mii_id.txc_bypass = 0;
  475. pad_mii_id.txc_pd = 0;
  476. }
  477. sja1105_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  478. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  479. packed_buf, SJA1105_SIZE_CGU_CMD);
  480. }
  481. int sja1110_setup_rgmii_delay(const void *ctx, int port)
  482. {
  483. const struct sja1105_private *priv = ctx;
  484. const struct sja1105_regs *regs = priv->info->regs;
  485. struct sja1105_cfg_pad_mii_id pad_mii_id = {0};
  486. int rx_delay = priv->rgmii_rx_delay_ps[port];
  487. int tx_delay = priv->rgmii_tx_delay_ps[port];
  488. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  489. pad_mii_id.rxc_pd = 1;
  490. pad_mii_id.txc_pd = 1;
  491. if (rx_delay) {
  492. pad_mii_id.rxc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(rx_delay);
  493. /* The "BYPASS" bit in SJA1110 is actually a "don't bypass" */
  494. pad_mii_id.rxc_bypass = 1;
  495. pad_mii_id.rxc_pd = 0;
  496. }
  497. if (tx_delay) {
  498. pad_mii_id.txc_delay = SJA1105_RGMII_DELAY_PS_TO_HW(tx_delay);
  499. pad_mii_id.txc_bypass = 1;
  500. pad_mii_id.txc_pd = 0;
  501. }
  502. sja1110_cfg_pad_mii_id_packing(packed_buf, &pad_mii_id, PACK);
  503. return sja1105_xfer_buf(priv, SPI_WRITE, regs->pad_mii_id[port],
  504. packed_buf, SJA1105_SIZE_CGU_CMD);
  505. }
  506. static int sja1105_rgmii_clocking_setup(struct sja1105_private *priv, int port,
  507. sja1105_mii_role_t role)
  508. {
  509. struct device *dev = priv->ds->dev;
  510. struct sja1105_mac_config_entry *mac;
  511. u64 speed;
  512. int rc;
  513. mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries;
  514. speed = mac[port].speed;
  515. dev_dbg(dev, "Configuring port %d RGMII at speed %lldMbps\n",
  516. port, speed);
  517. if (speed == priv->info->port_speed[SJA1105_SPEED_1000MBPS]) {
  518. /* 1000Mbps, IDIV disabled (125 MHz) */
  519. rc = sja1105_cgu_idiv_config(priv, port, false, 1);
  520. } else if (speed == priv->info->port_speed[SJA1105_SPEED_100MBPS]) {
  521. /* 100Mbps, IDIV enabled, divide by 1 (25 MHz) */
  522. rc = sja1105_cgu_idiv_config(priv, port, true, 1);
  523. } else if (speed == priv->info->port_speed[SJA1105_SPEED_10MBPS]) {
  524. /* 10Mbps, IDIV enabled, divide by 10 (2.5 MHz) */
  525. rc = sja1105_cgu_idiv_config(priv, port, true, 10);
  526. } else if (speed == priv->info->port_speed[SJA1105_SPEED_AUTO]) {
  527. /* Skip CGU configuration if there is no speed available
  528. * (e.g. link is not established yet)
  529. */
  530. dev_dbg(dev, "Speed not available, skipping CGU config\n");
  531. return 0;
  532. } else {
  533. rc = -EINVAL;
  534. }
  535. if (rc < 0) {
  536. dev_err(dev, "Failed to configure idiv\n");
  537. return rc;
  538. }
  539. rc = sja1105_cgu_rgmii_tx_clk_config(priv, port, speed);
  540. if (rc < 0) {
  541. dev_err(dev, "Failed to configure RGMII Tx clock\n");
  542. return rc;
  543. }
  544. rc = sja1105_rgmii_cfg_pad_tx_config(priv, port);
  545. if (rc < 0) {
  546. dev_err(dev, "Failed to configure Tx pad registers\n");
  547. return rc;
  548. }
  549. if (!priv->info->setup_rgmii_delay)
  550. return 0;
  551. return priv->info->setup_rgmii_delay(priv, port);
  552. }
  553. static int sja1105_cgu_rmii_ref_clk_config(struct sja1105_private *priv,
  554. int port)
  555. {
  556. const struct sja1105_regs *regs = priv->info->regs;
  557. struct sja1105_cgu_mii_ctrl ref_clk;
  558. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  559. const int clk_sources[] = {
  560. CLKSRC_MII0_TX_CLK,
  561. CLKSRC_MII1_TX_CLK,
  562. CLKSRC_MII2_TX_CLK,
  563. CLKSRC_MII3_TX_CLK,
  564. CLKSRC_MII4_TX_CLK,
  565. };
  566. if (regs->rmii_ref_clk[port] == SJA1105_RSV_ADDR)
  567. return 0;
  568. /* Payload for packed_buf */
  569. ref_clk.clksrc = clk_sources[port];
  570. ref_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  571. ref_clk.pd = 0; /* Power Down off => enabled */
  572. sja1105_cgu_mii_control_packing(packed_buf, &ref_clk, PACK);
  573. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ref_clk[port],
  574. packed_buf, SJA1105_SIZE_CGU_CMD);
  575. }
  576. static int
  577. sja1105_cgu_rmii_ext_tx_clk_config(struct sja1105_private *priv, int port)
  578. {
  579. const struct sja1105_regs *regs = priv->info->regs;
  580. struct sja1105_cgu_mii_ctrl ext_tx_clk;
  581. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  582. if (regs->rmii_ext_tx_clk[port] == SJA1105_RSV_ADDR)
  583. return 0;
  584. /* Payload for packed_buf */
  585. ext_tx_clk.clksrc = CLKSRC_PLL1;
  586. ext_tx_clk.autoblock = 1; /* Autoblock clk while changing clksrc */
  587. ext_tx_clk.pd = 0; /* Power Down off => enabled */
  588. sja1105_cgu_mii_control_packing(packed_buf, &ext_tx_clk, PACK);
  589. return sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_ext_tx_clk[port],
  590. packed_buf, SJA1105_SIZE_CGU_CMD);
  591. }
  592. static int sja1105_cgu_rmii_pll_config(struct sja1105_private *priv)
  593. {
  594. const struct sja1105_regs *regs = priv->info->regs;
  595. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  596. struct sja1105_cgu_pll_ctrl pll = {0};
  597. struct device *dev = priv->ds->dev;
  598. int rc;
  599. if (regs->rmii_pll1 == SJA1105_RSV_ADDR)
  600. return 0;
  601. /* PLL1 must be enabled and output 50 Mhz.
  602. * This is done by writing first 0x0A010941 to
  603. * the PLL_1_C register and then deasserting
  604. * power down (PD) 0x0A010940.
  605. */
  606. /* Step 1: PLL1 setup for 50Mhz */
  607. pll.pllclksrc = 0xA;
  608. pll.msel = 0x1;
  609. pll.autoblock = 0x1;
  610. pll.psel = 0x1;
  611. pll.direct = 0x0;
  612. pll.fbsel = 0x1;
  613. pll.bypass = 0x0;
  614. pll.pd = 0x1;
  615. sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
  616. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
  617. SJA1105_SIZE_CGU_CMD);
  618. if (rc < 0) {
  619. dev_err(dev, "failed to configure PLL1 for 50MHz\n");
  620. return rc;
  621. }
  622. /* Step 2: Enable PLL1 */
  623. pll.pd = 0x0;
  624. sja1105_cgu_pll_control_packing(packed_buf, &pll, PACK);
  625. rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->rmii_pll1, packed_buf,
  626. SJA1105_SIZE_CGU_CMD);
  627. if (rc < 0) {
  628. dev_err(dev, "failed to enable PLL1\n");
  629. return rc;
  630. }
  631. return rc;
  632. }
  633. static int sja1105_rmii_clocking_setup(struct sja1105_private *priv, int port,
  634. sja1105_mii_role_t role)
  635. {
  636. struct device *dev = priv->ds->dev;
  637. int rc;
  638. dev_dbg(dev, "Configuring RMII-%s clocking\n",
  639. (role == XMII_MAC) ? "MAC" : "PHY");
  640. /* AH1601.pdf chapter 2.5.1. Sources */
  641. if (role == XMII_MAC) {
  642. /* Configure and enable PLL1 for 50Mhz output */
  643. rc = sja1105_cgu_rmii_pll_config(priv);
  644. if (rc < 0)
  645. return rc;
  646. }
  647. /* Disable IDIV for this port */
  648. rc = sja1105_cgu_idiv_config(priv, port, false, 1);
  649. if (rc < 0)
  650. return rc;
  651. /* Source to sink mappings */
  652. rc = sja1105_cgu_rmii_ref_clk_config(priv, port);
  653. if (rc < 0)
  654. return rc;
  655. if (role == XMII_MAC) {
  656. rc = sja1105_cgu_rmii_ext_tx_clk_config(priv, port);
  657. if (rc < 0)
  658. return rc;
  659. }
  660. return 0;
  661. }
  662. int sja1105_clocking_setup_port(struct sja1105_private *priv, int port)
  663. {
  664. struct sja1105_xmii_params_entry *mii;
  665. struct device *dev = priv->ds->dev;
  666. sja1105_phy_interface_t phy_mode;
  667. sja1105_mii_role_t role;
  668. int rc;
  669. mii = priv->static_config.tables[BLK_IDX_XMII_PARAMS].entries;
  670. /* RGMII etc */
  671. phy_mode = mii->xmii_mode[port];
  672. /* MAC or PHY, for applicable types (not RGMII) */
  673. role = mii->phy_mac[port];
  674. switch (phy_mode) {
  675. case XMII_MODE_MII:
  676. rc = sja1105_mii_clocking_setup(priv, port, role);
  677. break;
  678. case XMII_MODE_RMII:
  679. rc = sja1105_rmii_clocking_setup(priv, port, role);
  680. break;
  681. case XMII_MODE_RGMII:
  682. rc = sja1105_rgmii_clocking_setup(priv, port, role);
  683. break;
  684. case XMII_MODE_SGMII:
  685. /* Nothing to do in the CGU for SGMII */
  686. rc = 0;
  687. break;
  688. default:
  689. dev_err(dev, "Invalid interface mode specified: %d\n",
  690. phy_mode);
  691. return -EINVAL;
  692. }
  693. if (rc) {
  694. dev_err(dev, "Clocking setup for port %d failed: %d\n",
  695. port, rc);
  696. return rc;
  697. }
  698. /* Internally pull down the RX_DV/CRS_DV/RX_CTL and RX_ER inputs */
  699. return sja1105_cfg_pad_rx_config(priv, port);
  700. }
  701. int sja1105_clocking_setup(struct sja1105_private *priv)
  702. {
  703. struct dsa_switch *ds = priv->ds;
  704. int port, rc;
  705. for (port = 0; port < ds->num_ports; port++) {
  706. rc = sja1105_clocking_setup_port(priv, port);
  707. if (rc < 0)
  708. return rc;
  709. }
  710. return 0;
  711. }
  712. static void
  713. sja1110_cgu_outclk_packing(void *buf, struct sja1110_cgu_outclk *outclk,
  714. enum packing_op op)
  715. {
  716. const int size = 4;
  717. sja1105_packing(buf, &outclk->clksrc, 27, 24, size, op);
  718. sja1105_packing(buf, &outclk->autoblock, 11, 11, size, op);
  719. sja1105_packing(buf, &outclk->pd, 0, 0, size, op);
  720. }
  721. int sja1110_disable_microcontroller(struct sja1105_private *priv)
  722. {
  723. u8 packed_buf[SJA1105_SIZE_CGU_CMD] = {0};
  724. struct sja1110_cgu_outclk outclk_6_c = {
  725. .clksrc = 0x3,
  726. .pd = true,
  727. };
  728. struct sja1110_cgu_outclk outclk_7_c = {
  729. .clksrc = 0x5,
  730. .pd = true,
  731. };
  732. int rc;
  733. /* Power down the BASE_TIMER_CLK to disable the watchdog timer */
  734. sja1110_cgu_outclk_packing(packed_buf, &outclk_7_c, PACK);
  735. rc = sja1105_xfer_buf(priv, SPI_WRITE, SJA1110_BASE_TIMER_CLK,
  736. packed_buf, SJA1105_SIZE_CGU_CMD);
  737. if (rc)
  738. return rc;
  739. /* Power down the BASE_MCSS_CLOCK to gate the microcontroller off */
  740. sja1110_cgu_outclk_packing(packed_buf, &outclk_6_c, PACK);
  741. return sja1105_xfer_buf(priv, SPI_WRITE, SJA1110_BASE_MCSS_CLK,
  742. packed_buf, SJA1105_SIZE_CGU_CMD);
  743. }