phy-brcm-sata.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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. };
  44. enum brcm_sata_phy_rxaeq_mode {
  45. RXAEQ_MODE_OFF = 0,
  46. RXAEQ_MODE_AUTO,
  47. RXAEQ_MODE_MANUAL,
  48. };
  49. static enum brcm_sata_phy_rxaeq_mode rxaeq_to_val(const char *m)
  50. {
  51. if (!strcmp(m, "auto"))
  52. return RXAEQ_MODE_AUTO;
  53. else if (!strcmp(m, "manual"))
  54. return RXAEQ_MODE_MANUAL;
  55. else
  56. return RXAEQ_MODE_OFF;
  57. }
  58. struct brcm_sata_port {
  59. int portnum;
  60. struct phy *phy;
  61. struct brcm_sata_phy *phy_priv;
  62. bool ssc_en;
  63. enum brcm_sata_phy_rxaeq_mode rxaeq_mode;
  64. u32 rxaeq_val;
  65. };
  66. struct brcm_sata_phy {
  67. struct device *dev;
  68. void __iomem *phy_base;
  69. void __iomem *ctrl_base;
  70. enum brcm_sata_phy_version version;
  71. struct brcm_sata_port phys[MAX_PORTS];
  72. };
  73. enum sata_phy_regs {
  74. BLOCK0_REG_BANK = 0x000,
  75. BLOCK0_XGXSSTATUS = 0x81,
  76. BLOCK0_XGXSSTATUS_PLL_LOCK = BIT(12),
  77. BLOCK0_SPARE = 0x8d,
  78. BLOCK0_SPARE_OOB_CLK_SEL_MASK = 0x3,
  79. BLOCK0_SPARE_OOB_CLK_SEL_REFBY2 = 0x1,
  80. PLL_REG_BANK_0 = 0x050,
  81. PLL_REG_BANK_0_PLLCONTROL_0 = 0x81,
  82. PLLCONTROL_0_FREQ_DET_RESTART = BIT(13),
  83. PLLCONTROL_0_FREQ_MONITOR = BIT(12),
  84. PLLCONTROL_0_SEQ_START = BIT(15),
  85. PLL_CAP_CONTROL = 0x85,
  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. TX_REG_BANK = 0x070,
  95. TX_ACTRL0 = 0x80,
  96. TX_ACTRL0_TXPOL_FLIP = BIT(6),
  97. AEQRX_REG_BANK_0 = 0xd0,
  98. AEQ_CONTROL1 = 0x81,
  99. AEQ_CONTROL1_ENABLE = BIT(2),
  100. AEQ_CONTROL1_FREEZE = BIT(3),
  101. AEQ_FRC_EQ = 0x83,
  102. AEQ_FRC_EQ_FORCE = BIT(0),
  103. AEQ_FRC_EQ_FORCE_VAL = BIT(1),
  104. AEQRX_REG_BANK_1 = 0xe0,
  105. OOB_REG_BANK = 0x150,
  106. OOB1_REG_BANK = 0x160,
  107. OOB_CTRL1 = 0x80,
  108. OOB_CTRL1_BURST_MAX_MASK = 0xf,
  109. OOB_CTRL1_BURST_MAX_SHIFT = 12,
  110. OOB_CTRL1_BURST_MIN_MASK = 0xf,
  111. OOB_CTRL1_BURST_MIN_SHIFT = 8,
  112. OOB_CTRL1_WAKE_IDLE_MAX_MASK = 0xf,
  113. OOB_CTRL1_WAKE_IDLE_MAX_SHIFT = 4,
  114. OOB_CTRL1_WAKE_IDLE_MIN_MASK = 0xf,
  115. OOB_CTRL1_WAKE_IDLE_MIN_SHIFT = 0,
  116. OOB_CTRL2 = 0x81,
  117. OOB_CTRL2_SEL_ENA_SHIFT = 15,
  118. OOB_CTRL2_SEL_ENA_RC_SHIFT = 14,
  119. OOB_CTRL2_RESET_IDLE_MAX_MASK = 0x3f,
  120. OOB_CTRL2_RESET_IDLE_MAX_SHIFT = 8,
  121. OOB_CTRL2_BURST_CNT_MASK = 0x3,
  122. OOB_CTRL2_BURST_CNT_SHIFT = 6,
  123. OOB_CTRL2_RESET_IDLE_MIN_MASK = 0x3f,
  124. OOB_CTRL2_RESET_IDLE_MIN_SHIFT = 0,
  125. TXPMD_REG_BANK = 0x1a0,
  126. TXPMD_CONTROL1 = 0x81,
  127. TXPMD_CONTROL1_TX_SSC_EN_FRC = BIT(0),
  128. TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL = BIT(1),
  129. TXPMD_TX_FREQ_CTRL_CONTROL1 = 0x82,
  130. TXPMD_TX_FREQ_CTRL_CONTROL2 = 0x83,
  131. TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK = 0x3ff,
  132. TXPMD_TX_FREQ_CTRL_CONTROL3 = 0x84,
  133. TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK = 0x3ff,
  134. RXPMD_REG_BANK = 0x1c0,
  135. RXPMD_RX_FREQ_MON_CONTROL1 = 0x87,
  136. };
  137. enum sata_phy_ctrl_regs {
  138. PHY_CTRL_1 = 0x0,
  139. PHY_CTRL_1_RESET = BIT(0),
  140. };
  141. static inline void __iomem *brcm_sata_pcb_base(struct brcm_sata_port *port)
  142. {
  143. struct brcm_sata_phy *priv = port->phy_priv;
  144. u32 size = 0;
  145. switch (priv->version) {
  146. case BRCM_SATA_PHY_STB_28NM:
  147. case BRCM_SATA_PHY_IPROC_NS2:
  148. size = SATA_PCB_REG_28NM_SPACE_SIZE;
  149. break;
  150. case BRCM_SATA_PHY_STB_40NM:
  151. size = SATA_PCB_REG_40NM_SPACE_SIZE;
  152. break;
  153. default:
  154. dev_err(priv->dev, "invalid phy version\n");
  155. break;
  156. }
  157. return priv->phy_base + (port->portnum * size);
  158. }
  159. static inline void __iomem *brcm_sata_ctrl_base(struct brcm_sata_port *port)
  160. {
  161. struct brcm_sata_phy *priv = port->phy_priv;
  162. u32 size = 0;
  163. switch (priv->version) {
  164. case BRCM_SATA_PHY_IPROC_NS2:
  165. size = SATA_PHY_CTRL_REG_28NM_SPACE_SIZE;
  166. break;
  167. default:
  168. dev_err(priv->dev, "invalid phy version\n");
  169. break;
  170. }
  171. return priv->ctrl_base + (port->portnum * size);
  172. }
  173. static void brcm_sata_phy_wr(void __iomem *pcb_base, u32 bank,
  174. u32 ofs, u32 msk, u32 value)
  175. {
  176. u32 tmp;
  177. writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
  178. tmp = readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
  179. tmp = (tmp & msk) | value;
  180. writel(tmp, pcb_base + SATA_PCB_REG_OFFSET(ofs));
  181. }
  182. static u32 brcm_sata_phy_rd(void __iomem *pcb_base, u32 bank, u32 ofs)
  183. {
  184. writel(bank, pcb_base + SATA_PCB_BANK_OFFSET);
  185. return readl(pcb_base + SATA_PCB_REG_OFFSET(ofs));
  186. }
  187. /* These defaults were characterized by H/W group */
  188. #define STB_FMIN_VAL_DEFAULT 0x3df
  189. #define STB_FMAX_VAL_DEFAULT 0x3df
  190. #define STB_FMAX_VAL_SSC 0x83
  191. static void brcm_stb_sata_ssc_init(struct brcm_sata_port *port)
  192. {
  193. void __iomem *base = brcm_sata_pcb_base(port);
  194. struct brcm_sata_phy *priv = port->phy_priv;
  195. u32 tmp;
  196. /* override the TX spread spectrum setting */
  197. tmp = TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL | TXPMD_CONTROL1_TX_SSC_EN_FRC;
  198. brcm_sata_phy_wr(base, TXPMD_REG_BANK, TXPMD_CONTROL1, ~tmp, tmp);
  199. /* set fixed min freq */
  200. brcm_sata_phy_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL2,
  201. ~TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK,
  202. STB_FMIN_VAL_DEFAULT);
  203. /* set fixed max freq depending on SSC config */
  204. if (port->ssc_en) {
  205. dev_info(priv->dev, "enabling SSC on port%d\n", port->portnum);
  206. tmp = STB_FMAX_VAL_SSC;
  207. } else {
  208. tmp = STB_FMAX_VAL_DEFAULT;
  209. }
  210. brcm_sata_phy_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL3,
  211. ~TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK, tmp);
  212. }
  213. #define AEQ_FRC_EQ_VAL_SHIFT 2
  214. #define AEQ_FRC_EQ_VAL_MASK 0x3f
  215. static int brcm_stb_sata_rxaeq_init(struct brcm_sata_port *port)
  216. {
  217. void __iomem *base = brcm_sata_pcb_base(port);
  218. u32 tmp = 0, reg = 0;
  219. switch (port->rxaeq_mode) {
  220. case RXAEQ_MODE_OFF:
  221. return 0;
  222. case RXAEQ_MODE_AUTO:
  223. reg = AEQ_CONTROL1;
  224. tmp = AEQ_CONTROL1_ENABLE | AEQ_CONTROL1_FREEZE;
  225. break;
  226. case RXAEQ_MODE_MANUAL:
  227. reg = AEQ_FRC_EQ;
  228. tmp = AEQ_FRC_EQ_FORCE | AEQ_FRC_EQ_FORCE_VAL;
  229. if (port->rxaeq_val > AEQ_FRC_EQ_VAL_MASK)
  230. return -EINVAL;
  231. tmp |= port->rxaeq_val << AEQ_FRC_EQ_VAL_SHIFT;
  232. break;
  233. }
  234. brcm_sata_phy_wr(base, AEQRX_REG_BANK_0, reg, ~tmp, tmp);
  235. brcm_sata_phy_wr(base, AEQRX_REG_BANK_1, reg, ~tmp, tmp);
  236. return 0;
  237. }
  238. static int brcm_stb_sata_init(struct brcm_sata_port *port)
  239. {
  240. brcm_stb_sata_ssc_init(port);
  241. return brcm_stb_sata_rxaeq_init(port);
  242. }
  243. /* NS2 SATA PLL1 defaults were characterized by H/W group */
  244. #define NS2_PLL1_ACTRL2_MAGIC 0x1df8
  245. #define NS2_PLL1_ACTRL3_MAGIC 0x2b00
  246. #define NS2_PLL1_ACTRL4_MAGIC 0x8824
  247. static int brcm_ns2_sata_init(struct brcm_sata_port *port)
  248. {
  249. int try;
  250. unsigned int val;
  251. void __iomem *base = brcm_sata_pcb_base(port);
  252. void __iomem *ctrl_base = brcm_sata_ctrl_base(port);
  253. struct device *dev = port->phy_priv->dev;
  254. /* Configure OOB control */
  255. val = 0x0;
  256. val |= (0xc << OOB_CTRL1_BURST_MAX_SHIFT);
  257. val |= (0x4 << OOB_CTRL1_BURST_MIN_SHIFT);
  258. val |= (0x9 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
  259. val |= (0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
  260. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
  261. val = 0x0;
  262. val |= (0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
  263. val |= (0x2 << OOB_CTRL2_BURST_CNT_SHIFT);
  264. val |= (0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
  265. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
  266. /* Configure PHY PLL register bank 1 */
  267. val = NS2_PLL1_ACTRL2_MAGIC;
  268. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
  269. val = NS2_PLL1_ACTRL3_MAGIC;
  270. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
  271. val = NS2_PLL1_ACTRL4_MAGIC;
  272. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
  273. /* Configure PHY BLOCK0 register bank */
  274. /* Set oob_clk_sel to refclk/2 */
  275. brcm_sata_phy_wr(base, BLOCK0_REG_BANK, BLOCK0_SPARE,
  276. ~BLOCK0_SPARE_OOB_CLK_SEL_MASK,
  277. BLOCK0_SPARE_OOB_CLK_SEL_REFBY2);
  278. /* Strobe PHY reset using PHY control register */
  279. writel(PHY_CTRL_1_RESET, ctrl_base + PHY_CTRL_1);
  280. mdelay(1);
  281. writel(0x0, ctrl_base + PHY_CTRL_1);
  282. mdelay(1);
  283. /* Wait for PHY PLL lock by polling pll_lock bit */
  284. try = 50;
  285. while (try) {
  286. val = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
  287. BLOCK0_XGXSSTATUS);
  288. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  289. break;
  290. msleep(20);
  291. try--;
  292. }
  293. if (!try) {
  294. /* PLL did not lock; give up */
  295. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  296. return -ETIMEDOUT;
  297. }
  298. dev_dbg(dev, "port%d initialized\n", port->portnum);
  299. return 0;
  300. }
  301. static int brcm_nsp_sata_init(struct brcm_sata_port *port)
  302. {
  303. struct brcm_sata_phy *priv = port->phy_priv;
  304. struct device *dev = port->phy_priv->dev;
  305. void __iomem *base = priv->phy_base;
  306. unsigned int oob_bank;
  307. unsigned int val, try;
  308. /* Configure OOB control */
  309. if (port->portnum == 0)
  310. oob_bank = OOB_REG_BANK;
  311. else if (port->portnum == 1)
  312. oob_bank = OOB1_REG_BANK;
  313. else
  314. return -EINVAL;
  315. val = 0x0;
  316. val |= (0x0f << OOB_CTRL1_BURST_MAX_SHIFT);
  317. val |= (0x06 << OOB_CTRL1_BURST_MIN_SHIFT);
  318. val |= (0x0f << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT);
  319. val |= (0x06 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT);
  320. brcm_sata_phy_wr(base, oob_bank, OOB_CTRL1, 0x0, val);
  321. val = 0x0;
  322. val |= (0x2e << OOB_CTRL2_RESET_IDLE_MAX_SHIFT);
  323. val |= (0x02 << OOB_CTRL2_BURST_CNT_SHIFT);
  324. val |= (0x16 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT);
  325. brcm_sata_phy_wr(base, oob_bank, OOB_CTRL2, 0x0, val);
  326. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_ACTRL2,
  327. ~(PLL_ACTRL2_SELDIV_MASK << PLL_ACTRL2_SELDIV_SHIFT),
  328. 0x0c << PLL_ACTRL2_SELDIV_SHIFT);
  329. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_CAP_CONTROL,
  330. 0xff0, 0x4f0);
  331. val = PLLCONTROL_0_FREQ_DET_RESTART | PLLCONTROL_0_FREQ_MONITOR;
  332. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  333. ~val, val);
  334. val = PLLCONTROL_0_SEQ_START;
  335. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  336. ~val, 0);
  337. mdelay(10);
  338. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_REG_BANK_0_PLLCONTROL_0,
  339. ~val, val);
  340. /* Wait for pll_seq_done bit */
  341. try = 50;
  342. while (--try) {
  343. val = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
  344. BLOCK0_XGXSSTATUS);
  345. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  346. break;
  347. msleep(20);
  348. }
  349. if (!try) {
  350. /* PLL did not lock; give up */
  351. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  352. return -ETIMEDOUT;
  353. }
  354. dev_dbg(dev, "port%d initialized\n", port->portnum);
  355. return 0;
  356. }
  357. /* SR PHY PLL0 registers */
  358. #define SR_PLL0_ACTRL6_MAGIC 0xa
  359. /* SR PHY PLL1 registers */
  360. #define SR_PLL1_ACTRL2_MAGIC 0x32
  361. #define SR_PLL1_ACTRL3_MAGIC 0x2
  362. #define SR_PLL1_ACTRL4_MAGIC 0x3e8
  363. static int brcm_sr_sata_init(struct brcm_sata_port *port)
  364. {
  365. struct brcm_sata_phy *priv = port->phy_priv;
  366. struct device *dev = port->phy_priv->dev;
  367. void __iomem *base = priv->phy_base;
  368. unsigned int val, try;
  369. /* Configure PHY PLL register bank 1 */
  370. val = SR_PLL1_ACTRL2_MAGIC;
  371. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL2, 0x0, val);
  372. val = SR_PLL1_ACTRL3_MAGIC;
  373. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL3, 0x0, val);
  374. val = SR_PLL1_ACTRL4_MAGIC;
  375. brcm_sata_phy_wr(base, PLL1_REG_BANK, PLL1_ACTRL4, 0x0, val);
  376. /* Configure PHY PLL register bank 0 */
  377. val = SR_PLL0_ACTRL6_MAGIC;
  378. brcm_sata_phy_wr(base, PLL_REG_BANK_0, PLL_ACTRL6, 0x0, val);
  379. /* Wait for PHY PLL lock by polling pll_lock bit */
  380. try = 50;
  381. do {
  382. val = brcm_sata_phy_rd(base, BLOCK0_REG_BANK,
  383. BLOCK0_XGXSSTATUS);
  384. if (val & BLOCK0_XGXSSTATUS_PLL_LOCK)
  385. break;
  386. msleep(20);
  387. try--;
  388. } while (try);
  389. if ((val & BLOCK0_XGXSSTATUS_PLL_LOCK) == 0) {
  390. /* PLL did not lock; give up */
  391. dev_err(dev, "port%d PLL did not lock\n", port->portnum);
  392. return -ETIMEDOUT;
  393. }
  394. /* Invert Tx polarity */
  395. brcm_sata_phy_wr(base, TX_REG_BANK, TX_ACTRL0,
  396. ~TX_ACTRL0_TXPOL_FLIP, TX_ACTRL0_TXPOL_FLIP);
  397. /* Configure OOB control to handle 100MHz reference clock */
  398. val = ((0xc << OOB_CTRL1_BURST_MAX_SHIFT) |
  399. (0x4 << OOB_CTRL1_BURST_MIN_SHIFT) |
  400. (0x8 << OOB_CTRL1_WAKE_IDLE_MAX_SHIFT) |
  401. (0x3 << OOB_CTRL1_WAKE_IDLE_MIN_SHIFT));
  402. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL1, 0x0, val);
  403. val = ((0x1b << OOB_CTRL2_RESET_IDLE_MAX_SHIFT) |
  404. (0x2 << OOB_CTRL2_BURST_CNT_SHIFT) |
  405. (0x9 << OOB_CTRL2_RESET_IDLE_MIN_SHIFT));
  406. brcm_sata_phy_wr(base, OOB_REG_BANK, OOB_CTRL2, 0x0, val);
  407. return 0;
  408. }
  409. static int brcm_sata_phy_init(struct phy *phy)
  410. {
  411. int rc;
  412. struct brcm_sata_port *port = phy_get_drvdata(phy);
  413. switch (port->phy_priv->version) {
  414. case BRCM_SATA_PHY_STB_28NM:
  415. case BRCM_SATA_PHY_STB_40NM:
  416. rc = brcm_stb_sata_init(port);
  417. break;
  418. case BRCM_SATA_PHY_IPROC_NS2:
  419. rc = brcm_ns2_sata_init(port);
  420. break;
  421. case BRCM_SATA_PHY_IPROC_NSP:
  422. rc = brcm_nsp_sata_init(port);
  423. break;
  424. case BRCM_SATA_PHY_IPROC_SR:
  425. rc = brcm_sr_sata_init(port);
  426. break;
  427. default:
  428. rc = -ENODEV;
  429. }
  430. return rc;
  431. }
  432. static void brcm_stb_sata_calibrate(struct brcm_sata_port *port)
  433. {
  434. void __iomem *base = brcm_sata_pcb_base(port);
  435. u32 tmp = BIT(8);
  436. brcm_sata_phy_wr(base, RXPMD_REG_BANK, RXPMD_RX_FREQ_MON_CONTROL1,
  437. ~tmp, tmp);
  438. }
  439. static int brcm_sata_phy_calibrate(struct phy *phy)
  440. {
  441. struct brcm_sata_port *port = phy_get_drvdata(phy);
  442. int rc = -EOPNOTSUPP;
  443. switch (port->phy_priv->version) {
  444. case BRCM_SATA_PHY_STB_28NM:
  445. case BRCM_SATA_PHY_STB_40NM:
  446. brcm_stb_sata_calibrate(port);
  447. rc = 0;
  448. break;
  449. default:
  450. break;
  451. }
  452. return rc;
  453. }
  454. static const struct phy_ops phy_ops = {
  455. .init = brcm_sata_phy_init,
  456. .calibrate = brcm_sata_phy_calibrate,
  457. .owner = THIS_MODULE,
  458. };
  459. static const struct of_device_id brcm_sata_phy_of_match[] = {
  460. { .compatible = "brcm,bcm7445-sata-phy",
  461. .data = (void *)BRCM_SATA_PHY_STB_28NM },
  462. { .compatible = "brcm,bcm7425-sata-phy",
  463. .data = (void *)BRCM_SATA_PHY_STB_40NM },
  464. { .compatible = "brcm,iproc-ns2-sata-phy",
  465. .data = (void *)BRCM_SATA_PHY_IPROC_NS2 },
  466. { .compatible = "brcm,iproc-nsp-sata-phy",
  467. .data = (void *)BRCM_SATA_PHY_IPROC_NSP },
  468. { .compatible = "brcm,iproc-sr-sata-phy",
  469. .data = (void *)BRCM_SATA_PHY_IPROC_SR },
  470. {},
  471. };
  472. MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
  473. static int brcm_sata_phy_probe(struct platform_device *pdev)
  474. {
  475. const char *rxaeq_mode;
  476. struct device *dev = &pdev->dev;
  477. struct device_node *dn = dev->of_node, *child;
  478. const struct of_device_id *of_id;
  479. struct brcm_sata_phy *priv;
  480. struct resource *res;
  481. struct phy_provider *provider;
  482. int ret, count = 0;
  483. if (of_get_child_count(dn) == 0)
  484. return -ENODEV;
  485. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  486. if (!priv)
  487. return -ENOMEM;
  488. dev_set_drvdata(dev, priv);
  489. priv->dev = dev;
  490. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
  491. priv->phy_base = devm_ioremap_resource(dev, res);
  492. if (IS_ERR(priv->phy_base))
  493. return PTR_ERR(priv->phy_base);
  494. of_id = of_match_node(brcm_sata_phy_of_match, dn);
  495. if (of_id)
  496. priv->version = (enum brcm_sata_phy_version)of_id->data;
  497. else
  498. priv->version = BRCM_SATA_PHY_STB_28NM;
  499. if (priv->version == BRCM_SATA_PHY_IPROC_NS2) {
  500. res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  501. "phy-ctrl");
  502. priv->ctrl_base = devm_ioremap_resource(dev, res);
  503. if (IS_ERR(priv->ctrl_base))
  504. return PTR_ERR(priv->ctrl_base);
  505. }
  506. for_each_available_child_of_node(dn, child) {
  507. unsigned int id;
  508. struct brcm_sata_port *port;
  509. if (of_property_read_u32(child, "reg", &id)) {
  510. dev_err(dev, "missing reg property in node %s\n",
  511. child->name);
  512. ret = -EINVAL;
  513. goto put_child;
  514. }
  515. if (id >= MAX_PORTS) {
  516. dev_err(dev, "invalid reg: %u\n", id);
  517. ret = -EINVAL;
  518. goto put_child;
  519. }
  520. if (priv->phys[id].phy) {
  521. dev_err(dev, "already registered port %u\n", id);
  522. ret = -EINVAL;
  523. goto put_child;
  524. }
  525. port = &priv->phys[id];
  526. port->portnum = id;
  527. port->phy_priv = priv;
  528. port->phy = devm_phy_create(dev, child, &phy_ops);
  529. port->rxaeq_mode = RXAEQ_MODE_OFF;
  530. if (!of_property_read_string(child, "brcm,rxaeq-mode",
  531. &rxaeq_mode))
  532. port->rxaeq_mode = rxaeq_to_val(rxaeq_mode);
  533. if (port->rxaeq_mode == RXAEQ_MODE_MANUAL)
  534. of_property_read_u32(child, "brcm,rxaeq-value",
  535. &port->rxaeq_val);
  536. port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
  537. if (IS_ERR(port->phy)) {
  538. dev_err(dev, "failed to create PHY\n");
  539. ret = PTR_ERR(port->phy);
  540. goto put_child;
  541. }
  542. phy_set_drvdata(port->phy, port);
  543. count++;
  544. }
  545. provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
  546. if (IS_ERR(provider)) {
  547. dev_err(dev, "could not register PHY provider\n");
  548. return PTR_ERR(provider);
  549. }
  550. dev_info(dev, "registered %d port(s)\n", count);
  551. return 0;
  552. put_child:
  553. of_node_put(child);
  554. return ret;
  555. }
  556. static struct platform_driver brcm_sata_phy_driver = {
  557. .probe = brcm_sata_phy_probe,
  558. .driver = {
  559. .of_match_table = brcm_sata_phy_of_match,
  560. .name = "brcm-sata-phy",
  561. }
  562. };
  563. module_platform_driver(brcm_sata_phy_driver);
  564. MODULE_DESCRIPTION("Broadcom SATA PHY driver");
  565. MODULE_LICENSE("GPL");
  566. MODULE_AUTHOR("Marc Carino");
  567. MODULE_AUTHOR("Brian Norris");
  568. MODULE_ALIAS("platform:phy-brcm-sata");