phy-brcm-sata.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. /*
  2. * Broadcom SATA3 AHCI Controller PHY Driver
  3. *
  4. * Copyright (C) 2016 Broadcom
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2, or (at your option)
  9. * any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. */
  16. #include <linux/delay.h>
  17. #include <linux/device.h>
  18. #include <linux/init.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/io.h>
  21. #include <linux/kernel.h>
  22. #include <linux/module.h>
  23. #include <linux/of.h>
  24. #include <linux/phy/phy.h>
  25. #include <linux/platform_device.h>
  26. #define SATA_PCB_BANK_OFFSET 0x23c
  27. #define SATA_PCB_REG_OFFSET(ofs) ((ofs) * 4)
  28. #define MAX_PORTS 2
  29. /* Register offset between PHYs in PCB space */
  30. #define SATA_PCB_REG_28NM_SPACE_SIZE 0x1000
  31. /* The older SATA PHY registers duplicated per port registers within the map,
  32. * rather than having a separate map per port.
  33. */
  34. #define SATA_PCB_REG_40NM_SPACE_SIZE 0x10
  35. /* Register offset between PHYs in PHY control space */
  36. #define SATA_PHY_CTRL_REG_28NM_SPACE_SIZE 0x8
  37. enum brcm_sata_phy_version {
  38. BRCM_SATA_PHY_STB_28NM,
  39. BRCM_SATA_PHY_STB_40NM,
  40. BRCM_SATA_PHY_IPROC_NS2,
  41. BRCM_SATA_PHY_IPROC_NSP,
  42. BRCM_SATA_PHY_IPROC_SR,
  43. BRCM_SATA_PHY_DSL_28NM,
  44. };
  45. enum brcm_sata_phy_rxaeq_mode {
  46. RXAEQ_MODE_OFF = 0,
  47. RXAEQ_MODE_AUTO,
  48. RXAEQ_MODE_MANUAL,
  49. };
  50. static enum brcm_sata_phy_rxaeq_mode rxaeq_to_val(const char *m)
  51. {
  52. if (!strcmp(m, "auto"))
  53. return RXAEQ_MODE_AUTO;
  54. else if (!strcmp(m, "manual"))
  55. return RXAEQ_MODE_MANUAL;
  56. else
  57. return RXAEQ_MODE_OFF;
  58. }
  59. struct brcm_sata_port {
  60. int portnum;
  61. struct phy *phy;
  62. struct brcm_sata_phy *phy_priv;
  63. bool ssc_en;
  64. enum brcm_sata_phy_rxaeq_mode rxaeq_mode;
  65. u32 rxaeq_val;
  66. };
  67. struct brcm_sata_phy {
  68. struct device *dev;
  69. void __iomem *phy_base;
  70. void __iomem *ctrl_base;
  71. enum brcm_sata_phy_version version;
  72. struct brcm_sata_port phys[MAX_PORTS];
  73. };
  74. enum sata_phy_regs {
  75. BLOCK0_REG_BANK = 0x000,
  76. BLOCK0_XGXSSTATUS = 0x81,
  77. BLOCK0_XGXSSTATUS_PLL_LOCK = BIT(12),
  78. BLOCK0_SPARE = 0x8d,
  79. BLOCK0_SPARE_OOB_CLK_SEL_MASK = 0x3,
  80. BLOCK0_SPARE_OOB_CLK_SEL_REFBY2 = 0x1,
  81. PLL_REG_BANK_0 = 0x050,
  82. PLL_REG_BANK_0_PLLCONTROL_0 = 0x81,
  83. PLLCONTROL_0_FREQ_DET_RESTART = BIT(13),
  84. PLLCONTROL_0_FREQ_MONITOR = BIT(12),
  85. PLLCONTROL_0_SEQ_START = BIT(15),
  86. PLL_CAP_CHARGE_TIME = 0x83,
  87. PLL_VCO_CAL_THRESH = 0x84,
  88. PLL_CAP_CONTROL = 0x85,
  89. PLL_FREQ_DET_TIME = 0x86,
  90. PLL_ACTRL2 = 0x8b,
  91. PLL_ACTRL2_SELDIV_MASK = 0x1f,
  92. PLL_ACTRL2_SELDIV_SHIFT = 9,
  93. PLL_ACTRL6 = 0x86,
  94. PLL1_REG_BANK = 0x060,
  95. PLL1_ACTRL2 = 0x82,
  96. PLL1_ACTRL3 = 0x83,
  97. PLL1_ACTRL4 = 0x84,
  98. PLL1_ACTRL5 = 0x85,
  99. PLL1_ACTRL6 = 0x86,
  100. PLL1_ACTRL7 = 0x87,
  101. TX_REG_BANK = 0x070,
  102. TX_ACTRL0 = 0x80,
  103. TX_ACTRL0_TXPOL_FLIP = BIT(6),
  104. AEQRX_REG_BANK_0 = 0xd0,
  105. AEQ_CONTROL1 = 0x81,
  106. AEQ_CONTROL1_ENABLE = BIT(2),
  107. AEQ_CONTROL1_FREEZE = BIT(3),
  108. AEQ_FRC_EQ = 0x83,
  109. AEQ_FRC_EQ_FORCE = BIT(0),
  110. AEQ_FRC_EQ_FORCE_VAL = BIT(1),
  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_FREQ_MON_CONTROL1 = 0x87,
  145. };
  146. enum sata_phy_ctrl_regs {
  147. PHY_CTRL_1 = 0x0,
  148. PHY_CTRL_1_RESET = BIT(0),
  149. };
  150. static inline void __iomem *brcm_sata_pcb_base(struct brcm_sata_port *port)
  151. {
  152. struct brcm_sata_phy *priv = port->phy_priv;
  153. u32 size = 0;
  154. switch (priv->version) {
  155. case BRCM_SATA_PHY_STB_28NM:
  156. case BRCM_SATA_PHY_IPROC_NS2:
  157. case BRCM_SATA_PHY_DSL_28NM:
  158. size = SATA_PCB_REG_28NM_SPACE_SIZE;
  159. break;
  160. case BRCM_SATA_PHY_STB_40NM:
  161. size = SATA_PCB_REG_40NM_SPACE_SIZE;
  162. break;
  163. default:
  164. dev_err(priv->dev, "invalid phy version\n");
  165. break;
  166. }
  167. return priv->phy_base + (port->portnum * size);
  168. }
  169. static inline void __iomem *brcm_sata_ctrl_base(struct brcm_sata_port *port)
  170. {
  171. struct brcm_sata_phy *priv = port->phy_priv;
  172. u32 size = 0;
  173. switch (priv->version) {
  174. case BRCM_SATA_PHY_IPROC_NS2:
  175. size = SATA_PHY_CTRL_REG_28NM_SPACE_SIZE;
  176. break;
  177. default:
  178. dev_err(priv->dev, "invalid phy version\n");
  179. break;
  180. }
  181. return priv->ctrl_base + (port->portnum * size);
  182. }
  183. static void brcm_sata_phy_wr(void __iomem *pcb_base, u32 bank,
  184. u32 ofs, u32 msk, u32 value)
  185. {
  186. u32 tmp;
  187. writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
  188. tmp = readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
  189. tmp = (tmp & msk) | value;
  190. writel(tmp, pcb_base + SATA_PCB_REG_OFFSET(ofs));
  191. }
  192. static u32 brcm_sata_phy_rd(void __iomem *pcb_base, u32 bank, u32 ofs)
  193. {
  194. writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
  195. return readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
  196. }
  197. /* These defaults were characterized by H/W group */
  198. #define STB_FMIN_VAL_DEFAULT 0x3df
  199. #define STB_FMAX_VAL_DEFAULT 0x3df
  200. #define STB_FMAX_VAL_SSC 0x83
  201. static void brcm_stb_sata_ssc_init(struct brcm_sata_port *port)
  202. {
  203. void __iomem *base = brcm_sata_pcb_base(port);
  204. struct brcm_sata_phy *priv = port->phy_priv;
  205. u32 tmp;
  206. /* override the TX spread spectrum setting */
  207. tmp = TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL | TXPMD_CONTROL1_TX_SSC_EN_FRC;
  208. brcm_sata_phy_wr(base, TXPMD_REG_BANK, TXPMD_CONTROL1, ~tmp, tmp);
  209. /* set fixed min freq */
  210. brcm_sata_phy_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL2,
  211. ~TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK,
  212. STB_FMIN_VAL_DEFAULT);
  213. /* set fixed max freq depending on SSC config */
  214. if (port->ssc_en) {
  215. dev_info(priv->dev, "enabling SSC on port%d\n", port->portnum);
  216. tmp = STB_FMAX_VAL_SSC;
  217. } else {
  218. tmp = STB_FMAX_VAL_DEFAULT;
  219. }
  220. brcm_sata_phy_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL3,
  221. ~TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK, tmp);
  222. }
  223. #define AEQ_FRC_EQ_VAL_SHIFT 2
  224. #define AEQ_FRC_EQ_VAL_MASK 0x3f
  225. static int brcm_stb_sata_rxaeq_init(struct brcm_sata_port *port)
  226. {
  227. void __iomem *base = brcm_sata_pcb_base(port);
  228. u32 tmp = 0, reg = 0;
  229. switch (port->rxaeq_mode) {
  230. case RXAEQ_MODE_OFF:
  231. return 0;
  232. case RXAEQ_MODE_AUTO:
  233. reg = AEQ_CONTROL1;
  234. tmp = AEQ_CONTROL1_ENABLE | AEQ_CONTROL1_FREEZE;
  235. break;
  236. case RXAEQ_MODE_MANUAL:
  237. reg = AEQ_FRC_EQ;
  238. tmp = AEQ_FRC_EQ_FORCE | AEQ_FRC_EQ_FORCE_VAL;
  239. if (port->rxaeq_val > AEQ_FRC_EQ_VAL_MASK)
  240. return -EINVAL;
  241. tmp |= port->rxaeq_val << AEQ_FRC_EQ_VAL_SHIFT;
  242. break;
  243. }
  244. brcm_sata_phy_wr(base, AEQRX_REG_BANK_0, reg, ~tmp, tmp);
  245. brcm_sata_phy_wr(base, AEQRX_REG_BANK_1, reg, ~tmp, tmp);
  246. return 0;
  247. }
  248. static int brcm_stb_sata_init(struct brcm_sata_port *port)
  249. {
  250. brcm_stb_sata_ssc_init(port);
  251. return brcm_stb_sata_rxaeq_init(port);
  252. }
  253. /* NS2 SATA PLL1 defaults were characterized by H/W group */
  254. #define NS2_PLL1_ACTRL2_MAGIC 0x1df8
  255. #define NS2_PLL1_ACTRL3_MAGIC 0x2b00
  256. #define NS2_PLL1_ACTRL4_MAGIC 0x8824
  257. static int brcm_ns2_sata_init(struct brcm_sata_port *port)
  258. {
  259. int try;
  260. unsigned int val;
  261. void __iomem *base = brcm_sata_pcb_base(port);
  262. void __iomem *ctrl_base = brcm_sata_ctrl_base(port);
  263. struct device *dev = port->phy_priv->dev;
  264. /* Configure OOB control */
  265. val = 0x0;
  266. val |= (0xc << OOB_CTRL1_BURST_MAX_SHIFT);
  267. val |= (0x4 << OOB_CTRL1_BURST_MIN_SHIFT);
  268. val |= (0x9 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
  269. val |= (0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
  270. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
  271. val = 0x0;
  272. val |= (0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
  273. val |= (0x2 << OOB_CTRL2_BURST_CNT_SHIFT);
  274. val |= (0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
  275. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
  276. /* Configure PHY PLL register bank 1 */
  277. val = NS2_PLL1_ACTRL2_MAGIC;
  278. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
  279. val = NS2_PLL1_ACTRL3_MAGIC;
  280. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
  281. val = NS2_PLL1_ACTRL4_MAGIC;
  282. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
  283. /* Configure PHY BLOCK0 register bank */
  284. /* Set oob_clk_sel to refclk/2 */
  285. brcm_sata_phy_wr(base, BLOCK0_REG_BANK, BLOCK0_SPARE,
  286. ~BLOCK0_SPARE_OOB_CLK_SEL_MASK,
  287. BLOCK0_SPARE_OOB_CLK_SEL_REFBY2);
  288. /* Strobe PHY reset using PHY control register */
  289. writel(PHY_CTRL_1_RESET, ctrl_base + PHY_CTRL_1);
  290. mdelay(1);
  291. writel(0x0, ctrl_base + PHY_CTRL_1);
  292. mdelay(1);
  293. /* Wait for PHY PLL lock by polling pll_lock bit */
  294. try = 50;
  295. while (try) {
  296. val = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
  297. BLOCK0_XGXSSTATUS);
  298. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  299. break;
  300. msleep(20);
  301. try--;
  302. }
  303. if (!try) {
  304. /* PLL did not lock; give up */
  305. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  306. return -ETIMEDOUT;
  307. }
  308. dev_dbg(dev, "port%d initialized\n", port->portnum);
  309. return 0;
  310. }
  311. static int brcm_nsp_sata_init(struct brcm_sata_port *port)
  312. {
  313. struct brcm_sata_phy *priv = port->phy_priv;
  314. struct device *dev = port->phy_priv->dev;
  315. void __iomem *base = priv->phy_base;
  316. unsigned int oob_bank;
  317. unsigned int val, try;
  318. /* Configure OOB control */
  319. if (port->portnum == 0)
  320. oob_bank = OOB_REG_BANK;
  321. else if (port->portnum == 1)
  322. oob_bank = OOB1_REG_BANK;
  323. else
  324. return -EINVAL;
  325. val = 0x0;
  326. val |= (0x0f << OOB_CTRL1_BURST_MAX_SHIFT);
  327. val |= (0x06 << OOB_CTRL1_BURST_MIN_SHIFT);
  328. val |= (0x0f << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
  329. val |= (0x06 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
  330. brcm_sata_phy_wr(base, oob_bank, OOB_CTRL1, 0x0, val);
  331. val = 0x0;
  332. val |= (0x2e << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
  333. val |= (0x02 << OOB_CTRL2_BURST_CNT_SHIFT);
  334. val |= (0x16 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
  335. brcm_sata_phy_wr(base, oob_bank, OOB_CTRL2, 0x0, val);
  336. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_ACTRL2,
  337. ~(PLL_ACTRL2_SELDIV_MASK << PLL_ACTRL2_SELDIV_SHIFT),
  338. 0x0c << PLL_ACTRL2_SELDIV_SHIFT);
  339. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_CAP_CONTROL,
  340. 0xff0, 0x4f0);
  341. val = PLLCONTROL_0_FREQ_DET_RESTART | PLLCONTROL_0_FREQ_MONITOR;
  342. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  343. ~val, val);
  344. val = PLLCONTROL_0_SEQ_START;
  345. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  346. ~val, 0);
  347. mdelay(10);
  348. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  349. ~val, val);
  350. /* Wait for pll_seq_done bit */
  351. try = 50;
  352. while (--try) {
  353. val = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
  354. BLOCK0_XGXSSTATUS);
  355. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  356. break;
  357. msleep(20);
  358. }
  359. if (!try) {
  360. /* PLL did not lock; give up */
  361. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  362. return -ETIMEDOUT;
  363. }
  364. dev_dbg(dev, "port%d initialized\n", port->portnum);
  365. return 0;
  366. }
  367. /* SR PHY PLL0 registers */
  368. #define SR_PLL0_ACTRL6_MAGIC 0xa
  369. /* SR PHY PLL1 registers */
  370. #define SR_PLL1_ACTRL2_MAGIC 0x32
  371. #define SR_PLL1_ACTRL3_MAGIC 0x2
  372. #define SR_PLL1_ACTRL4_MAGIC 0x3e8
  373. static int brcm_sr_sata_init(struct brcm_sata_port *port)
  374. {
  375. struct brcm_sata_phy *priv = port->phy_priv;
  376. struct device *dev = port->phy_priv->dev;
  377. void __iomem *base = priv->phy_base;
  378. unsigned int val, try;
  379. /* Configure PHY PLL register bank 1 */
  380. val = SR_PLL1_ACTRL2_MAGIC;
  381. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
  382. val = SR_PLL1_ACTRL3_MAGIC;
  383. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
  384. val = SR_PLL1_ACTRL4_MAGIC;
  385. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
  386. /* Configure PHY PLL register bank 0 */
  387. val = SR_PLL0_ACTRL6_MAGIC;
  388. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_ACTRL6, 0x0, val);
  389. /* Wait for PHY PLL lock by polling pll_lock bit */
  390. try = 50;
  391. do {
  392. val = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
  393. BLOCK0_XGXSSTATUS);
  394. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  395. break;
  396. msleep(20);
  397. try--;
  398. } while (try);
  399. if ((val & BLOCK0_XGXSSTATUS_PLL_LOCK) == 0) {
  400. /* PLL did not lock; give up */
  401. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  402. return -ETIMEDOUT;
  403. }
  404. /* Invert Tx polarity */
  405. brcm_sata_phy_wr(base, TX_REG_BANK, TX_ACTRL0,
  406. ~TX_ACTRL0_TXPOL_FLIP, TX_ACTRL0_TXPOL_FLIP);
  407. /* Configure OOB control to handle 100MHz reference clock */
  408. val = ((0xc << OOB_CTRL1_BURST_MAX_SHIFT) |
  409. (0x4 << OOB_CTRL1_BURST_MIN_SHIFT) |
  410. (0x8 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT) |
  411. (0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT));
  412. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
  413. val = ((0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT) |
  414. (0x2 << OOB_CTRL2_BURST_CNT_SHIFT) |
  415. (0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT));
  416. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
  417. return 0;
  418. }
  419. static int brcm_dsl_sata_init(struct brcm_sata_port *port)
  420. {
  421. void __iomem *base = brcm_sata_pcb_base(port);
  422. struct device *dev = port->phy_priv->dev;
  423. unsigned int try;
  424. u32 tmp;
  425. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL7, 0, 0x873);
  426. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL6, 0, 0xc000);
  427. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  428. 0, 0x3089);
  429. usleep_range(1000, 2000);
  430. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  431. 0, 0x3088);
  432. usleep_range(1000, 2000);
  433. brcm_sata_phy_wr(base, AEQRX_REG_BANK_1, AEQRX_SLCAL0_CTRL0,
  434. 0, 0x3000);
  435. brcm_sata_phy_wr(base, AEQRX_REG_BANK_1, AEQRX_SLCAL1_CTRL0,
  436. 0, 0x3000);
  437. usleep_range(1000, 2000);
  438. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_CAP_CHARGE_TIME, 0, 0x32);
  439. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_VCO_CAL_THRESH, 0, 0xa);
  440. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_FREQ_DET_TIME, 0, 0x64);
  441. usleep_range(1000, 2000);
  442. /* Acquire PLL lock */
  443. try = 50;
  444. while (try) {
  445. tmp = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
  446. BLOCK0_XGXSSTATUS);
  447. if (tmp & BLOCK0_XGXSSTATUS_PLL_LOCK)
  448. break;
  449. msleep(20);
  450. try--;
  451. };
  452. if (!try) {
  453. /* PLL did not lock; give up */
  454. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  455. return -ETIMEDOUT;
  456. }
  457. dev_dbg(dev, "port%d initialized\n", port->portnum);
  458. return 0;
  459. }
  460. static int brcm_sata_phy_init(struct phy *phy)
  461. {
  462. int rc;
  463. struct brcm_sata_port *port = phy_get_drvdata(phy);
  464. switch (port->phy_priv->version) {
  465. case BRCM_SATA_PHY_STB_28NM:
  466. case BRCM_SATA_PHY_STB_40NM:
  467. rc = brcm_stb_sata_init(port);
  468. break;
  469. case BRCM_SATA_PHY_IPROC_NS2:
  470. rc = brcm_ns2_sata_init(port);
  471. break;
  472. case BRCM_SATA_PHY_IPROC_NSP:
  473. rc = brcm_nsp_sata_init(port);
  474. break;
  475. case BRCM_SATA_PHY_IPROC_SR:
  476. rc = brcm_sr_sata_init(port);
  477. break;
  478. case BRCM_SATA_PHY_DSL_28NM:
  479. rc = brcm_dsl_sata_init(port);
  480. break;
  481. default:
  482. rc = -ENODEV;
  483. }
  484. return rc;
  485. }
  486. static void brcm_stb_sata_calibrate(struct brcm_sata_port *port)
  487. {
  488. void __iomem *base = brcm_sata_pcb_base(port);
  489. u32 tmp = BIT(8);
  490. brcm_sata_phy_wr(base, RXPMD_REG_BANK, RXPMD_RX_FREQ_MON_CONTROL1,
  491. ~tmp, tmp);
  492. }
  493. static int brcm_sata_phy_calibrate(struct phy *phy)
  494. {
  495. struct brcm_sata_port *port = phy_get_drvdata(phy);
  496. int rc = -EOPNOTSUPP;
  497. switch (port->phy_priv->version) {
  498. case BRCM_SATA_PHY_STB_28NM:
  499. case BRCM_SATA_PHY_STB_40NM:
  500. brcm_stb_sata_calibrate(port);
  501. rc = 0;
  502. break;
  503. default:
  504. break;
  505. }
  506. return rc;
  507. }
  508. static const struct phy_ops phy_ops = {
  509. .init = brcm_sata_phy_init,
  510. .calibrate = brcm_sata_phy_calibrate,
  511. .owner = THIS_MODULE,
  512. };
  513. static const struct of_device_id brcm_sata_phy_of_match[] = {
  514. { .compatible = "brcm,bcm7445-sata-phy",
  515. .data = (void *)BRCM_SATA_PHY_STB_28NM },
  516. { .compatible = "brcm,bcm7425-sata-phy",
  517. .data = (void *)BRCM_SATA_PHY_STB_40NM },
  518. { .compatible = "brcm,iproc-ns2-sata-phy",
  519. .data = (void *)BRCM_SATA_PHY_IPROC_NS2 },
  520. { .compatible = "brcm,iproc-nsp-sata-phy",
  521. .data = (void *)BRCM_SATA_PHY_IPROC_NSP },
  522. { .compatible = "brcm,iproc-sr-sata-phy",
  523. .data = (void *)BRCM_SATA_PHY_IPROC_SR },
  524. { .compatible = "brcm,bcm63138-sata-phy",
  525. .data = (void *)BRCM_SATA_PHY_DSL_28NM },
  526. {},
  527. };
  528. MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
  529. static int brcm_sata_phy_probe(struct platform_device *pdev)
  530. {
  531. const char *rxaeq_mode;
  532. struct device *dev = &pdev->dev;
  533. struct device_node *dn = dev->of_node, *child;
  534. const struct of_device_id *of_id;
  535. struct brcm_sata_phy *priv;
  536. struct resource *res;
  537. struct phy_provider *provider;
  538. int ret, count = 0;
  539. if (of_get_child_count(dn) == 0)
  540. return -ENODEV;
  541. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  542. if (!priv)
  543. return -ENOMEM;
  544. dev_set_drvdata(dev, priv);
  545. priv->dev = dev;
  546. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
  547. priv->phy_base = devm_ioremap_resource(dev, res);
  548. if (IS_ERR(priv->phy_base))
  549. return PTR_ERR(priv->phy_base);
  550. of_id = of_match_node(brcm_sata_phy_of_match, dn);
  551. if (of_id)
  552. priv->version = (enum brcm_sata_phy_version)of_id->data;
  553. else
  554. priv->version = BRCM_SATA_PHY_STB_28NM;
  555. if (priv->version == BRCM_SATA_PHY_IPROC_NS2) {
  556. res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  557. "phy-ctrl");
  558. priv->ctrl_base = devm_ioremap_resource(dev, res);
  559. if (IS_ERR(priv->ctrl_base))
  560. return PTR_ERR(priv->ctrl_base);
  561. }
  562. for_each_available_child_of_node(dn, child) {
  563. unsigned int id;
  564. struct brcm_sata_port *port;
  565. if (of_property_read_u32(child, "reg", &id)) {
  566. dev_err(dev, "missing reg property in node %pOFn\n",
  567. child);
  568. ret = -EINVAL;
  569. goto put_child;
  570. }
  571. if (id >= MAX_PORTS) {
  572. dev_err(dev, "invalid reg: %u\n", id);
  573. ret = -EINVAL;
  574. goto put_child;
  575. }
  576. if (priv->phys[id].phy) {
  577. dev_err(dev, "already registered port %u\n", id);
  578. ret = -EINVAL;
  579. goto put_child;
  580. }
  581. port = &priv->phys[id];
  582. port->portnum = id;
  583. port->phy_priv = priv;
  584. port->phy = devm_phy_create(dev, child, &phy_ops);
  585. port->rxaeq_mode = RXAEQ_MODE_OFF;
  586. if (!of_property_read_string(child, "brcm,rxaeq-mode",
  587. &rxaeq_mode))
  588. port->rxaeq_mode = rxaeq_to_val(rxaeq_mode);
  589. if (port->rxaeq_mode == RXAEQ_MODE_MANUAL)
  590. of_property_read_u32(child, "brcm,rxaeq-value",
  591. &port->rxaeq_val);
  592. port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
  593. if (IS_ERR(port->phy)) {
  594. dev_err(dev, "failed to create PHY\n");
  595. ret = PTR_ERR(port->phy);
  596. goto put_child;
  597. }
  598. phy_set_drvdata(port->phy, port);
  599. count++;
  600. }
  601. provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
  602. if (IS_ERR(provider)) {
  603. dev_err(dev, "could not register PHY provider\n");
  604. return PTR_ERR(provider);
  605. }
  606. dev_info(dev, "registered %d port(s)\n", count);
  607. return 0;
  608. put_child:
  609. of_node_put(child);
  610. return ret;
  611. }
  612. static struct platform_driver brcm_sata_phy_driver = {
  613. .probe = brcm_sata_phy_probe,
  614. .driver = {
  615. .of_match_table = brcm_sata_phy_of_match,
  616. .name = "brcm-sata-phy",
  617. }
  618. };
  619. module_platform_driver(brcm_sata_phy_driver);
  620. MODULE_DESCRIPTION("Broadcom SATA PHY driver");
  621. MODULE_LICENSE("GPL");
  622. MODULE_AUTHOR("Marc Carino");
  623. MODULE_AUTHOR("Brian Norris");
  624. MODULE_ALIAS("platform:phy-brcm-sata");