phy-brcm-sata.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Broadcom SATA3 AHCI Controller PHY Driver
  4. *
  5. * Copyright (C) 2016 Broadcom
  6. */
  7. #include <linux/delay.h>
  8. #include <linux/device.h>
  9. #include <linux/init.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/io.h>
  12. #include <linux/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/of.h>
  15. #include <linux/phy/phy.h>
  16. #include <linux/platform_device.h>
  17. #define SATA_PCB_BANK_OFFSET 0x23c
  18. #define SATA_PCB_REG_OFFSET(ofs) ((ofs) * 4)
  19. #define MAX_PORTS 2
  20. /* Register offset between PHYs in PCB space */
  21. #define SATA_PCB_REG_28NM_SPACE_SIZE 0x1000
  22. /* The older SATA PHY registers duplicated per port registers within the map,
  23. * rather than having a separate map per port.
  24. */
  25. #define SATA_PCB_REG_40NM_SPACE_SIZE 0x10
  26. /* Register offset between PHYs in PHY control space */
  27. #define SATA_PHY_CTRL_REG_28NM_SPACE_SIZE 0x8
  28. enum brcm_sata_phy_version {
  29. BRCM_SATA_PHY_STB_16NM,
  30. BRCM_SATA_PHY_STB_28NM,
  31. BRCM_SATA_PHY_STB_40NM,
  32. BRCM_SATA_PHY_IPROC_NS2,
  33. BRCM_SATA_PHY_IPROC_NSP,
  34. BRCM_SATA_PHY_IPROC_SR,
  35. BRCM_SATA_PHY_DSL_28NM,
  36. };
  37. enum brcm_sata_phy_rxaeq_mode {
  38. RXAEQ_MODE_OFF = 0,
  39. RXAEQ_MODE_AUTO,
  40. RXAEQ_MODE_MANUAL,
  41. };
  42. static enum brcm_sata_phy_rxaeq_mode rxaeq_to_val(const char *m)
  43. {
  44. if (!strcmp(m, "auto"))
  45. return RXAEQ_MODE_AUTO;
  46. else if (!strcmp(m, "manual"))
  47. return RXAEQ_MODE_MANUAL;
  48. else
  49. return RXAEQ_MODE_OFF;
  50. }
  51. struct brcm_sata_port {
  52. int portnum;
  53. struct phy *phy;
  54. struct brcm_sata_phy *phy_priv;
  55. bool ssc_en;
  56. enum brcm_sata_phy_rxaeq_mode rxaeq_mode;
  57. u32 rxaeq_val;
  58. u32 tx_amplitude_val;
  59. };
  60. struct brcm_sata_phy {
  61. struct device *dev;
  62. void __iomem *phy_base;
  63. void __iomem *ctrl_base;
  64. enum brcm_sata_phy_version version;
  65. struct brcm_sata_port phys[MAX_PORTS];
  66. };
  67. enum sata_phy_regs {
  68. BLOCK0_REG_BANK = 0x000,
  69. BLOCK0_XGXSSTATUS = 0x81,
  70. BLOCK0_XGXSSTATUS_PLL_LOCK = BIT(12),
  71. BLOCK0_SPARE = 0x8d,
  72. BLOCK0_SPARE_OOB_CLK_SEL_MASK = 0x3,
  73. BLOCK0_SPARE_OOB_CLK_SEL_REFBY2 = 0x1,
  74. BLOCK1_REG_BANK = 0x10,
  75. BLOCK1_TEST_TX = 0x83,
  76. BLOCK1_TEST_TX_AMP_SHIFT = 12,
  77. PLL_REG_BANK_0 = 0x050,
  78. PLL_REG_BANK_0_PLLCONTROL_0 = 0x81,
  79. PLLCONTROL_0_FREQ_DET_RESTART = BIT(13),
  80. PLLCONTROL_0_FREQ_MONITOR = BIT(12),
  81. PLLCONTROL_0_SEQ_START = BIT(15),
  82. PLL_CAP_CHARGE_TIME = 0x83,
  83. PLL_VCO_CAL_THRESH = 0x84,
  84. PLL_CAP_CONTROL = 0x85,
  85. PLL_FREQ_DET_TIME = 0x86,
  86. PLL_ACTRL2 = 0x8b,
  87. PLL_ACTRL2_SELDIV_MASK = 0x1f,
  88. PLL_ACTRL2_SELDIV_SHIFT = 9,
  89. PLL_ACTRL6 = 0x86,
  90. PLL1_REG_BANK = 0x060,
  91. PLL1_ACTRL2 = 0x82,
  92. PLL1_ACTRL3 = 0x83,
  93. PLL1_ACTRL4 = 0x84,
  94. PLL1_ACTRL5 = 0x85,
  95. PLL1_ACTRL6 = 0x86,
  96. PLL1_ACTRL7 = 0x87,
  97. PLL1_ACTRL8 = 0x88,
  98. TX_REG_BANK = 0x070,
  99. TX_ACTRL0 = 0x80,
  100. TX_ACTRL0_TXPOL_FLIP = BIT(6),
  101. TX_ACTRL5 = 0x85,
  102. TX_ACTRL5_SSC_EN = BIT(11),
  103. AEQRX_REG_BANK_0 = 0xd0,
  104. AEQ_CONTROL1 = 0x81,
  105. AEQ_CONTROL1_ENABLE = BIT(2),
  106. AEQ_CONTROL1_FREEZE = BIT(3),
  107. AEQ_FRC_EQ = 0x83,
  108. AEQ_FRC_EQ_FORCE = BIT(0),
  109. AEQ_FRC_EQ_FORCE_VAL = BIT(1),
  110. AEQ_RFZ_FRC_VAL = BIT(8),
  111. AEQRX_REG_BANK_1 = 0xe0,
  112. AEQRX_SLCAL0_CTRL0 = 0x82,
  113. AEQRX_SLCAL1_CTRL0 = 0x86,
  114. OOB_REG_BANK = 0x150,
  115. OOB1_REG_BANK = 0x160,
  116. OOB_CTRL1 = 0x80,
  117. OOB_CTRL1_BURST_MAX_MASK = 0xf,
  118. OOB_CTRL1_BURST_MAX_SHIFT = 12,
  119. OOB_CTRL1_BURST_MIN_MASK = 0xf,
  120. OOB_CTRL1_BURST_MIN_SHIFT = 8,
  121. OOB_CTRL1_WAKE_IDLE_MAX_MASK = 0xf,
  122. OOB_CTRL1_WAKE_IDLE_MAX_SHIFT = 4,
  123. OOB_CTRL1_WAKE_IDLE_MIN_MASK = 0xf,
  124. OOB_CTRL1_WAKE_IDLE_MIN_SHIFT = 0,
  125. OOB_CTRL2 = 0x81,
  126. OOB_CTRL2_SEL_ENA_SHIFT = 15,
  127. OOB_CTRL2_SEL_ENA_RC_SHIFT = 14,
  128. OOB_CTRL2_RESET_IDLE_MAX_MASK = 0x3f,
  129. OOB_CTRL2_RESET_IDLE_MAX_SHIFT = 8,
  130. OOB_CTRL2_BURST_CNT_MASK = 0x3,
  131. OOB_CTRL2_BURST_CNT_SHIFT = 6,
  132. OOB_CTRL2_RESET_IDLE_MIN_MASK = 0x3f,
  133. OOB_CTRL2_RESET_IDLE_MIN_SHIFT = 0,
  134. TXPMD_REG_BANK = 0x1a0,
  135. TXPMD_CONTROL1 = 0x81,
  136. TXPMD_CONTROL1_TX_SSC_EN_FRC = BIT(0),
  137. TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL = BIT(1),
  138. TXPMD_TX_FREQ_CTRL_CONTROL1 = 0x82,
  139. TXPMD_TX_FREQ_CTRL_CONTROL2 = 0x83,
  140. TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK = 0x3ff,
  141. TXPMD_TX_FREQ_CTRL_CONTROL3 = 0x84,
  142. TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK = 0x3ff,
  143. RXPMD_REG_BANK = 0x1c0,
  144. RXPMD_RX_CDR_CONTROL1 = 0x81,
  145. RXPMD_RX_PPM_VAL_MASK = 0x1ff,
  146. RXPMD_RXPMD_EN_FRC = BIT(12),
  147. RXPMD_RXPMD_EN_FRC_VAL = BIT(13),
  148. RXPMD_RX_CDR_CDR_PROP_BW = 0x82,
  149. RXPMD_G_CDR_PROP_BW_MASK = 0x7,
  150. RXPMD_G1_CDR_PROP_BW_SHIFT = 0,
  151. RXPMD_G2_CDR_PROP_BW_SHIFT = 3,
  152. RXPMD_G3_CDR_PROB_BW_SHIFT = 6,
  153. RXPMD_RX_CDR_CDR_ACQ_INTEG_BW = 0x83,
  154. RXPMD_G_CDR_ACQ_INT_BW_MASK = 0x7,
  155. RXPMD_G1_CDR_ACQ_INT_BW_SHIFT = 0,
  156. RXPMD_G2_CDR_ACQ_INT_BW_SHIFT = 3,
  157. RXPMD_G3_CDR_ACQ_INT_BW_SHIFT = 6,
  158. RXPMD_RX_CDR_CDR_LOCK_INTEG_BW = 0x84,
  159. RXPMD_G_CDR_LOCK_INT_BW_MASK = 0x7,
  160. RXPMD_G1_CDR_LOCK_INT_BW_SHIFT = 0,
  161. RXPMD_G2_CDR_LOCK_INT_BW_SHIFT = 3,
  162. RXPMD_G3_CDR_LOCK_INT_BW_SHIFT = 6,
  163. RXPMD_RX_FREQ_MON_CONTROL1 = 0x87,
  164. RXPMD_MON_CORRECT_EN = BIT(8),
  165. RXPMD_MON_MARGIN_VAL_MASK = 0xff,
  166. };
  167. enum sata_phy_ctrl_regs {
  168. PHY_CTRL_1 = 0x0,
  169. PHY_CTRL_1_RESET = BIT(0),
  170. };
  171. static inline void __iomem *brcm_sata_ctrl_base(struct brcm_sata_port *port)
  172. {
  173. struct brcm_sata_phy *priv = port->phy_priv;
  174. u32 size = 0;
  175. switch (priv->version) {
  176. case BRCM_SATA_PHY_IPROC_NS2:
  177. size = SATA_PHY_CTRL_REG_28NM_SPACE_SIZE;
  178. break;
  179. default:
  180. dev_err(priv->dev, "invalid phy version\n");
  181. break;
  182. }
  183. return priv->ctrl_base + (port->portnum * size);
  184. }
  185. static void brcm_sata_phy_wr(struct brcm_sata_port *port, u32 bank,
  186. u32 ofs, u32 msk, u32 value)
  187. {
  188. struct brcm_sata_phy *priv = port->phy_priv;
  189. void __iomem *pcb_base = priv->phy_base;
  190. u32 tmp;
  191. if (priv->version == BRCM_SATA_PHY_STB_40NM)
  192. bank += (port->portnum * SATA_PCB_REG_40NM_SPACE_SIZE);
  193. else
  194. pcb_base += (port->portnum * SATA_PCB_REG_28NM_SPACE_SIZE);
  195. writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
  196. tmp = readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
  197. tmp = (tmp & msk) | value;
  198. writel(tmp, pcb_base + SATA_PCB_REG_OFFSET(ofs));
  199. }
  200. static u32 brcm_sata_phy_rd(struct brcm_sata_port *port, u32 bank, u32 ofs)
  201. {
  202. struct brcm_sata_phy *priv = port->phy_priv;
  203. void __iomem *pcb_base = priv->phy_base;
  204. if (priv->version == BRCM_SATA_PHY_STB_40NM)
  205. bank += (port->portnum * SATA_PCB_REG_40NM_SPACE_SIZE);
  206. else
  207. pcb_base += (port->portnum * SATA_PCB_REG_28NM_SPACE_SIZE);
  208. writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
  209. return readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
  210. }
  211. /* These defaults were characterized by H/W group */
  212. #define STB_FMIN_VAL_DEFAULT 0x3df
  213. #define STB_FMAX_VAL_DEFAULT 0x3df
  214. #define STB_FMAX_VAL_SSC 0x83
  215. static void brcm_stb_sata_ssc_init(struct brcm_sata_port *port)
  216. {
  217. struct brcm_sata_phy *priv = port->phy_priv;
  218. u32 tmp;
  219. /* override the TX spread spectrum setting */
  220. tmp = TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL | TXPMD_CONTROL1_TX_SSC_EN_FRC;
  221. brcm_sata_phy_wr(port, TXPMD_REG_BANK, TXPMD_CONTROL1, ~tmp, tmp);
  222. /* set fixed min freq */
  223. brcm_sata_phy_wr(port, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL2,
  224. ~TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK,
  225. STB_FMIN_VAL_DEFAULT);
  226. /* set fixed max freq depending on SSC config */
  227. if (port->ssc_en) {
  228. dev_info(priv->dev, "enabling SSC on port%d\n", port->portnum);
  229. tmp = STB_FMAX_VAL_SSC;
  230. } else {
  231. tmp = STB_FMAX_VAL_DEFAULT;
  232. }
  233. brcm_sata_phy_wr(port, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL3,
  234. ~TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK, tmp);
  235. }
  236. #define AEQ_FRC_EQ_VAL_SHIFT 2
  237. #define AEQ_FRC_EQ_VAL_MASK 0x3f
  238. static int brcm_stb_sata_rxaeq_init(struct brcm_sata_port *port)
  239. {
  240. u32 tmp = 0, reg = 0;
  241. switch (port->rxaeq_mode) {
  242. case RXAEQ_MODE_OFF:
  243. return 0;
  244. case RXAEQ_MODE_AUTO:
  245. reg = AEQ_CONTROL1;
  246. tmp = AEQ_CONTROL1_ENABLE | AEQ_CONTROL1_FREEZE;
  247. break;
  248. case RXAEQ_MODE_MANUAL:
  249. reg = AEQ_FRC_EQ;
  250. tmp = AEQ_FRC_EQ_FORCE | AEQ_FRC_EQ_FORCE_VAL;
  251. if (port->rxaeq_val > AEQ_FRC_EQ_VAL_MASK)
  252. return -EINVAL;
  253. tmp |= port->rxaeq_val << AEQ_FRC_EQ_VAL_SHIFT;
  254. break;
  255. }
  256. brcm_sata_phy_wr(port, AEQRX_REG_BANK_0, reg, ~tmp, tmp);
  257. brcm_sata_phy_wr(port, AEQRX_REG_BANK_1, reg, ~tmp, tmp);
  258. return 0;
  259. }
  260. static int brcm_stb_sata_init(struct brcm_sata_port *port)
  261. {
  262. brcm_stb_sata_ssc_init(port);
  263. return brcm_stb_sata_rxaeq_init(port);
  264. }
  265. static int brcm_stb_sata_16nm_ssc_init(struct brcm_sata_port *port)
  266. {
  267. u32 tmp, value;
  268. /* Reduce CP tail current to 1/16th of its default value */
  269. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL6, 0, 0x141);
  270. /* Turn off CP tail current boost */
  271. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL8, 0, 0xc006);
  272. /* Set a specific AEQ equalizer value */
  273. tmp = AEQ_FRC_EQ_FORCE_VAL | AEQ_FRC_EQ_FORCE;
  274. brcm_sata_phy_wr(port, AEQRX_REG_BANK_0, AEQ_FRC_EQ,
  275. ~(tmp | AEQ_RFZ_FRC_VAL |
  276. AEQ_FRC_EQ_VAL_MASK << AEQ_FRC_EQ_VAL_SHIFT),
  277. tmp | 32 << AEQ_FRC_EQ_VAL_SHIFT);
  278. /* Set RX PPM val center frequency */
  279. if (port->ssc_en)
  280. value = 0x52;
  281. else
  282. value = 0;
  283. brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CONTROL1,
  284. ~RXPMD_RX_PPM_VAL_MASK, value);
  285. /* Set proportional loop bandwith Gen1/2/3 */
  286. tmp = RXPMD_G_CDR_PROP_BW_MASK << RXPMD_G1_CDR_PROP_BW_SHIFT |
  287. RXPMD_G_CDR_PROP_BW_MASK << RXPMD_G2_CDR_PROP_BW_SHIFT |
  288. RXPMD_G_CDR_PROP_BW_MASK << RXPMD_G3_CDR_PROB_BW_SHIFT;
  289. if (port->ssc_en)
  290. value = 2 << RXPMD_G1_CDR_PROP_BW_SHIFT |
  291. 2 << RXPMD_G2_CDR_PROP_BW_SHIFT |
  292. 2 << RXPMD_G3_CDR_PROB_BW_SHIFT;
  293. else
  294. value = 1 << RXPMD_G1_CDR_PROP_BW_SHIFT |
  295. 1 << RXPMD_G2_CDR_PROP_BW_SHIFT |
  296. 1 << RXPMD_G3_CDR_PROB_BW_SHIFT;
  297. brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CDR_PROP_BW, ~tmp,
  298. value);
  299. /* Set CDR integral loop acquisition bandwidth for Gen1/2/3 */
  300. tmp = RXPMD_G_CDR_ACQ_INT_BW_MASK << RXPMD_G1_CDR_ACQ_INT_BW_SHIFT |
  301. RXPMD_G_CDR_ACQ_INT_BW_MASK << RXPMD_G2_CDR_ACQ_INT_BW_SHIFT |
  302. RXPMD_G_CDR_ACQ_INT_BW_MASK << RXPMD_G3_CDR_ACQ_INT_BW_SHIFT;
  303. if (port->ssc_en)
  304. value = 1 << RXPMD_G1_CDR_ACQ_INT_BW_SHIFT |
  305. 1 << RXPMD_G2_CDR_ACQ_INT_BW_SHIFT |
  306. 1 << RXPMD_G3_CDR_ACQ_INT_BW_SHIFT;
  307. else
  308. value = 0;
  309. brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CDR_ACQ_INTEG_BW,
  310. ~tmp, value);
  311. /* Set CDR integral loop locking bandwidth to 1 for Gen 1/2/3 */
  312. tmp = RXPMD_G_CDR_LOCK_INT_BW_MASK << RXPMD_G1_CDR_LOCK_INT_BW_SHIFT |
  313. RXPMD_G_CDR_LOCK_INT_BW_MASK << RXPMD_G2_CDR_LOCK_INT_BW_SHIFT |
  314. RXPMD_G_CDR_LOCK_INT_BW_MASK << RXPMD_G3_CDR_LOCK_INT_BW_SHIFT;
  315. if (port->ssc_en)
  316. value = 1 << RXPMD_G1_CDR_LOCK_INT_BW_SHIFT |
  317. 1 << RXPMD_G2_CDR_LOCK_INT_BW_SHIFT |
  318. 1 << RXPMD_G3_CDR_LOCK_INT_BW_SHIFT;
  319. else
  320. value = 0;
  321. brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_CDR_CDR_LOCK_INTEG_BW,
  322. ~tmp, value);
  323. /* Set no guard band and clamp CDR */
  324. tmp = RXPMD_MON_CORRECT_EN | RXPMD_MON_MARGIN_VAL_MASK;
  325. if (port->ssc_en)
  326. value = 0x51;
  327. else
  328. value = 0;
  329. brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_FREQ_MON_CONTROL1,
  330. ~tmp, RXPMD_MON_CORRECT_EN | value);
  331. tmp = GENMASK(15, 12);
  332. switch (port->tx_amplitude_val) {
  333. case 400:
  334. value = BIT(12) | BIT(13);
  335. break;
  336. case 500:
  337. value = BIT(13);
  338. break;
  339. case 600:
  340. value = BIT(12);
  341. break;
  342. case 800:
  343. value = 0;
  344. break;
  345. default:
  346. value = tmp;
  347. break;
  348. }
  349. if (value != tmp)
  350. brcm_sata_phy_wr(port, BLOCK1_REG_BANK, BLOCK1_TEST_TX, ~tmp,
  351. value);
  352. /* Turn on/off SSC */
  353. brcm_sata_phy_wr(port, TX_REG_BANK, TX_ACTRL5, ~TX_ACTRL5_SSC_EN,
  354. port->ssc_en ? TX_ACTRL5_SSC_EN : 0);
  355. return 0;
  356. }
  357. static int brcm_stb_sata_16nm_init(struct brcm_sata_port *port)
  358. {
  359. return brcm_stb_sata_16nm_ssc_init(port);
  360. }
  361. /* NS2 SATA PLL1 defaults were characterized by H/W group */
  362. #define NS2_PLL1_ACTRL2_MAGIC 0x1df8
  363. #define NS2_PLL1_ACTRL3_MAGIC 0x2b00
  364. #define NS2_PLL1_ACTRL4_MAGIC 0x8824
  365. static int brcm_ns2_sata_init(struct brcm_sata_port *port)
  366. {
  367. int try;
  368. unsigned int val;
  369. void __iomem *ctrl_base = brcm_sata_ctrl_base(port);
  370. struct device *dev = port->phy_priv->dev;
  371. /* Configure OOB control */
  372. val = 0x0;
  373. val |= (0xc << OOB_CTRL1_BURST_MAX_SHIFT);
  374. val |= (0x4 << OOB_CTRL1_BURST_MIN_SHIFT);
  375. val |= (0x9 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
  376. val |= (0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
  377. brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
  378. val = 0x0;
  379. val |= (0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
  380. val |= (0x2 << OOB_CTRL2_BURST_CNT_SHIFT);
  381. val |= (0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
  382. brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
  383. /* Configure PHY PLL register bank 1 */
  384. val = NS2_PLL1_ACTRL2_MAGIC;
  385. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
  386. val = NS2_PLL1_ACTRL3_MAGIC;
  387. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
  388. val = NS2_PLL1_ACTRL4_MAGIC;
  389. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
  390. /* Configure PHY BLOCK0 register bank */
  391. /* Set oob_clk_sel to refclk/2 */
  392. brcm_sata_phy_wr(port, BLOCK0_REG_BANK, BLOCK0_SPARE,
  393. ~BLOCK0_SPARE_OOB_CLK_SEL_MASK,
  394. BLOCK0_SPARE_OOB_CLK_SEL_REFBY2);
  395. /* Strobe PHY reset using PHY control register */
  396. writel(PHY_CTRL_1_RESET, ctrl_base + PHY_CTRL_1);
  397. mdelay(1);
  398. writel(0x0, ctrl_base + PHY_CTRL_1);
  399. mdelay(1);
  400. /* Wait for PHY PLL lock by polling pll_lock bit */
  401. try = 50;
  402. while (try) {
  403. val = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
  404. BLOCK0_XGXSSTATUS);
  405. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  406. break;
  407. msleep(20);
  408. try--;
  409. }
  410. if (!try) {
  411. /* PLL did not lock; give up */
  412. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  413. return -ETIMEDOUT;
  414. }
  415. dev_dbg(dev, "port%d initialized\n", port->portnum);
  416. return 0;
  417. }
  418. static int brcm_nsp_sata_init(struct brcm_sata_port *port)
  419. {
  420. struct device *dev = port->phy_priv->dev;
  421. unsigned int oob_bank;
  422. unsigned int val, try;
  423. /* Configure OOB control */
  424. if (port->portnum == 0)
  425. oob_bank = OOB_REG_BANK;
  426. else if (port->portnum == 1)
  427. oob_bank = OOB1_REG_BANK;
  428. else
  429. return -EINVAL;
  430. val = 0x0;
  431. val |= (0x0f << OOB_CTRL1_BURST_MAX_SHIFT);
  432. val |= (0x06 << OOB_CTRL1_BURST_MIN_SHIFT);
  433. val |= (0x0f << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
  434. val |= (0x06 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
  435. brcm_sata_phy_wr(port, oob_bank, OOB_CTRL1, 0x0, val);
  436. val = 0x0;
  437. val |= (0x2e << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
  438. val |= (0x02 << OOB_CTRL2_BURST_CNT_SHIFT);
  439. val |= (0x16 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
  440. brcm_sata_phy_wr(port, oob_bank, OOB_CTRL2, 0x0, val);
  441. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_ACTRL2,
  442. ~(PLL_ACTRL2_SELDIV_MASK << PLL_ACTRL2_SELDIV_SHIFT),
  443. 0x0c << PLL_ACTRL2_SELDIV_SHIFT);
  444. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_CAP_CONTROL,
  445. 0xff0, 0x4f0);
  446. val = PLLCONTROL_0_FREQ_DET_RESTART | PLLCONTROL_0_FREQ_MONITOR;
  447. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  448. ~val, val);
  449. val = PLLCONTROL_0_SEQ_START;
  450. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  451. ~val, 0);
  452. mdelay(10);
  453. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  454. ~val, val);
  455. /* Wait for pll_seq_done bit */
  456. try = 50;
  457. while (--try) {
  458. val = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
  459. BLOCK0_XGXSSTATUS);
  460. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  461. break;
  462. msleep(20);
  463. }
  464. if (!try) {
  465. /* PLL did not lock; give up */
  466. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  467. return -ETIMEDOUT;
  468. }
  469. dev_dbg(dev, "port%d initialized\n", port->portnum);
  470. return 0;
  471. }
  472. /* SR PHY PLL0 registers */
  473. #define SR_PLL0_ACTRL6_MAGIC 0xa
  474. /* SR PHY PLL1 registers */
  475. #define SR_PLL1_ACTRL2_MAGIC 0x32
  476. #define SR_PLL1_ACTRL3_MAGIC 0x2
  477. #define SR_PLL1_ACTRL4_MAGIC 0x3e8
  478. static int brcm_sr_sata_init(struct brcm_sata_port *port)
  479. {
  480. struct device *dev = port->phy_priv->dev;
  481. unsigned int val, try;
  482. /* Configure PHY PLL register bank 1 */
  483. val = SR_PLL1_ACTRL2_MAGIC;
  484. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
  485. val = SR_PLL1_ACTRL3_MAGIC;
  486. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
  487. val = SR_PLL1_ACTRL4_MAGIC;
  488. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
  489. /* Configure PHY PLL register bank 0 */
  490. val = SR_PLL0_ACTRL6_MAGIC;
  491. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_ACTRL6, 0x0, val);
  492. /* Wait for PHY PLL lock by polling pll_lock bit */
  493. try = 50;
  494. do {
  495. val = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
  496. BLOCK0_XGXSSTATUS);
  497. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  498. break;
  499. msleep(20);
  500. try--;
  501. } while (try);
  502. if ((val & BLOCK0_XGXSSTATUS_PLL_LOCK) == 0) {
  503. /* PLL did not lock; give up */
  504. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  505. return -ETIMEDOUT;
  506. }
  507. /* Invert Tx polarity */
  508. brcm_sata_phy_wr(port, TX_REG_BANK, TX_ACTRL0,
  509. ~TX_ACTRL0_TXPOL_FLIP, TX_ACTRL0_TXPOL_FLIP);
  510. /* Configure OOB control to handle 100MHz reference clock */
  511. val = ((0xc << OOB_CTRL1_BURST_MAX_SHIFT) |
  512. (0x4 << OOB_CTRL1_BURST_MIN_SHIFT) |
  513. (0x8 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT) |
  514. (0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT));
  515. brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
  516. val = ((0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT) |
  517. (0x2 << OOB_CTRL2_BURST_CNT_SHIFT) |
  518. (0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT));
  519. brcm_sata_phy_wr(port, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
  520. return 0;
  521. }
  522. static int brcm_dsl_sata_init(struct brcm_sata_port *port)
  523. {
  524. struct device *dev = port->phy_priv->dev;
  525. unsigned int try;
  526. u32 tmp;
  527. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL7, 0, 0x873);
  528. brcm_sata_phy_wr(port, PLL1_REG_BANK, PLL1_ACTRL6, 0, 0xc000);
  529. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  530. 0, 0x3089);
  531. usleep_range(1000, 2000);
  532. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  533. 0, 0x3088);
  534. usleep_range(1000, 2000);
  535. brcm_sata_phy_wr(port, AEQRX_REG_BANK_1, AEQRX_SLCAL0_CTRL0,
  536. 0, 0x3000);
  537. brcm_sata_phy_wr(port, AEQRX_REG_BANK_1, AEQRX_SLCAL1_CTRL0,
  538. 0, 0x3000);
  539. usleep_range(1000, 2000);
  540. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_CAP_CHARGE_TIME, 0, 0x32);
  541. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_VCO_CAL_THRESH, 0, 0xa);
  542. brcm_sata_phy_wr(port, PLL_REG_BANK_0, PLL_FREQ_DET_TIME, 0, 0x64);
  543. usleep_range(1000, 2000);
  544. /* Acquire PLL lock */
  545. try = 50;
  546. while (try) {
  547. tmp = brcm_sata_phy_rd(port, BLOCK0_REG_BANK,
  548. BLOCK0_XGXSSTATUS);
  549. if (tmp & BLOCK0_XGXSSTATUS_PLL_LOCK)
  550. break;
  551. msleep(20);
  552. try--;
  553. }
  554. if (!try) {
  555. /* PLL did not lock; give up */
  556. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  557. return -ETIMEDOUT;
  558. }
  559. dev_dbg(dev, "port%d initialized\n", port->portnum);
  560. return 0;
  561. }
  562. static int brcm_sata_phy_init(struct phy *phy)
  563. {
  564. int rc;
  565. struct brcm_sata_port *port = phy_get_drvdata(phy);
  566. switch (port->phy_priv->version) {
  567. case BRCM_SATA_PHY_STB_16NM:
  568. rc = brcm_stb_sata_16nm_init(port);
  569. break;
  570. case BRCM_SATA_PHY_STB_28NM:
  571. case BRCM_SATA_PHY_STB_40NM:
  572. rc = brcm_stb_sata_init(port);
  573. break;
  574. case BRCM_SATA_PHY_IPROC_NS2:
  575. rc = brcm_ns2_sata_init(port);
  576. break;
  577. case BRCM_SATA_PHY_IPROC_NSP:
  578. rc = brcm_nsp_sata_init(port);
  579. break;
  580. case BRCM_SATA_PHY_IPROC_SR:
  581. rc = brcm_sr_sata_init(port);
  582. break;
  583. case BRCM_SATA_PHY_DSL_28NM:
  584. rc = brcm_dsl_sata_init(port);
  585. break;
  586. default:
  587. rc = -ENODEV;
  588. }
  589. return rc;
  590. }
  591. static void brcm_stb_sata_calibrate(struct brcm_sata_port *port)
  592. {
  593. u32 tmp = BIT(8);
  594. brcm_sata_phy_wr(port, RXPMD_REG_BANK, RXPMD_RX_FREQ_MON_CONTROL1,
  595. ~tmp, tmp);
  596. }
  597. static int brcm_sata_phy_calibrate(struct phy *phy)
  598. {
  599. struct brcm_sata_port *port = phy_get_drvdata(phy);
  600. int rc = -EOPNOTSUPP;
  601. switch (port->phy_priv->version) {
  602. case BRCM_SATA_PHY_STB_28NM:
  603. case BRCM_SATA_PHY_STB_40NM:
  604. brcm_stb_sata_calibrate(port);
  605. rc = 0;
  606. break;
  607. default:
  608. break;
  609. }
  610. return rc;
  611. }
  612. static const struct phy_ops phy_ops = {
  613. .init = brcm_sata_phy_init,
  614. .calibrate = brcm_sata_phy_calibrate,
  615. .owner = THIS_MODULE,
  616. };
  617. static const struct of_device_id brcm_sata_phy_of_match[] = {
  618. { .compatible = "brcm,bcm7216-sata-phy",
  619. .data = (void *)BRCM_SATA_PHY_STB_16NM },
  620. { .compatible = "brcm,bcm7445-sata-phy",
  621. .data = (void *)BRCM_SATA_PHY_STB_28NM },
  622. { .compatible = "brcm,bcm7425-sata-phy",
  623. .data = (void *)BRCM_SATA_PHY_STB_40NM },
  624. { .compatible = "brcm,iproc-ns2-sata-phy",
  625. .data = (void *)BRCM_SATA_PHY_IPROC_NS2 },
  626. { .compatible = "brcm,iproc-nsp-sata-phy",
  627. .data = (void *)BRCM_SATA_PHY_IPROC_NSP },
  628. { .compatible = "brcm,iproc-sr-sata-phy",
  629. .data = (void *)BRCM_SATA_PHY_IPROC_SR },
  630. { .compatible = "brcm,bcm63138-sata-phy",
  631. .data = (void *)BRCM_SATA_PHY_DSL_28NM },
  632. {},
  633. };
  634. MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
  635. static int brcm_sata_phy_probe(struct platform_device *pdev)
  636. {
  637. const char *rxaeq_mode;
  638. struct device *dev = &pdev->dev;
  639. struct device_node *dn = dev->of_node, *child;
  640. const struct of_device_id *of_id;
  641. struct brcm_sata_phy *priv;
  642. struct phy_provider *provider;
  643. int ret, count = 0;
  644. if (of_get_child_count(dn) == 0)
  645. return -ENODEV;
  646. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  647. if (!priv)
  648. return -ENOMEM;
  649. dev_set_drvdata(dev, priv);
  650. priv->dev = dev;
  651. priv->phy_base = devm_platform_ioremap_resource_byname(pdev, "phy");
  652. if (IS_ERR(priv->phy_base))
  653. return PTR_ERR(priv->phy_base);
  654. of_id = of_match_node(brcm_sata_phy_of_match, dn);
  655. if (of_id)
  656. priv->version = (enum brcm_sata_phy_version)of_id->data;
  657. else
  658. priv->version = BRCM_SATA_PHY_STB_28NM;
  659. if (priv->version == BRCM_SATA_PHY_IPROC_NS2) {
  660. priv->ctrl_base = devm_platform_ioremap_resource_byname(pdev, "phy-ctrl");
  661. if (IS_ERR(priv->ctrl_base))
  662. return PTR_ERR(priv->ctrl_base);
  663. }
  664. for_each_available_child_of_node(dn, child) {
  665. unsigned int id;
  666. struct brcm_sata_port *port;
  667. if (of_property_read_u32(child, "reg", &id)) {
  668. dev_err(dev, "missing reg property in node %pOFn\n",
  669. child);
  670. ret = -EINVAL;
  671. goto put_child;
  672. }
  673. if (id >= MAX_PORTS) {
  674. dev_err(dev, "invalid reg: %u\n", id);
  675. ret = -EINVAL;
  676. goto put_child;
  677. }
  678. if (priv->phys[id].phy) {
  679. dev_err(dev, "already registered port %u\n", id);
  680. ret = -EINVAL;
  681. goto put_child;
  682. }
  683. port = &priv->phys[id];
  684. port->portnum = id;
  685. port->phy_priv = priv;
  686. port->phy = devm_phy_create(dev, child, &phy_ops);
  687. port->rxaeq_mode = RXAEQ_MODE_OFF;
  688. if (!of_property_read_string(child, "brcm,rxaeq-mode",
  689. &rxaeq_mode))
  690. port->rxaeq_mode = rxaeq_to_val(rxaeq_mode);
  691. if (port->rxaeq_mode == RXAEQ_MODE_MANUAL)
  692. of_property_read_u32(child, "brcm,rxaeq-value",
  693. &port->rxaeq_val);
  694. of_property_read_u32(child, "brcm,tx-amplitude-millivolt",
  695. &port->tx_amplitude_val);
  696. port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
  697. if (IS_ERR(port->phy)) {
  698. dev_err(dev, "failed to create PHY\n");
  699. ret = PTR_ERR(port->phy);
  700. goto put_child;
  701. }
  702. phy_set_drvdata(port->phy, port);
  703. count++;
  704. }
  705. provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
  706. if (IS_ERR(provider)) {
  707. dev_err(dev, "could not register PHY provider\n");
  708. return PTR_ERR(provider);
  709. }
  710. dev_info(dev, "registered %d port(s)\n", count);
  711. return 0;
  712. put_child:
  713. of_node_put(child);
  714. return ret;
  715. }
  716. static struct platform_driver brcm_sata_phy_driver = {
  717. .probe = brcm_sata_phy_probe,
  718. .driver = {
  719. .of_match_table = brcm_sata_phy_of_match,
  720. .name = "brcm-sata-phy",
  721. }
  722. };
  723. module_platform_driver(brcm_sata_phy_driver);
  724. MODULE_DESCRIPTION("Broadcom SATA PHY driver");
  725. MODULE_LICENSE("GPL");
  726. MODULE_AUTHOR("Marc Carino");
  727. MODULE_AUTHOR("Brian Norris");
  728. MODULE_ALIAS("platform:phy-brcm-sata");