phy-qcom-qmp-pcie-msm8996.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2017, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/clk.h>
  6. #include <linux/clk-provider.h>
  7. #include <linux/delay.h>
  8. #include <linux/err.h>
  9. #include <linux/io.h>
  10. #include <linux/iopoll.h>
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/of.h>
  14. #include <linux/of_device.h>
  15. #include <linux/of_address.h>
  16. #include <linux/phy/phy.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/regulator/consumer.h>
  19. #include <linux/reset.h>
  20. #include <linux/slab.h>
  21. #include <dt-bindings/phy/phy.h>
  22. #include "phy-qcom-qmp.h"
  23. /* QPHY_SW_RESET bit */
  24. #define SW_RESET BIT(0)
  25. /* QPHY_POWER_DOWN_CONTROL */
  26. #define SW_PWRDN BIT(0)
  27. #define REFCLK_DRV_DSBL BIT(1)
  28. /* QPHY_START_CONTROL bits */
  29. #define SERDES_START BIT(0)
  30. #define PCS_START BIT(1)
  31. #define PLL_READY_GATE_EN BIT(3)
  32. /* QPHY_PCS_STATUS bit */
  33. #define PHYSTATUS BIT(6)
  34. #define PHYSTATUS_4_20 BIT(7)
  35. /* QPHY_COM_PCS_READY_STATUS bit */
  36. #define PCS_READY BIT(0)
  37. #define PHY_INIT_COMPLETE_TIMEOUT 10000
  38. #define POWER_DOWN_DELAY_US_MIN 10
  39. #define POWER_DOWN_DELAY_US_MAX 11
  40. struct qmp_phy_init_tbl {
  41. unsigned int offset;
  42. unsigned int val;
  43. /*
  44. * register part of layout ?
  45. * if yes, then offset gives index in the reg-layout
  46. */
  47. bool in_layout;
  48. /*
  49. * mask of lanes for which this register is written
  50. * for cases when second lane needs different values
  51. */
  52. u8 lane_mask;
  53. };
  54. #define QMP_PHY_INIT_CFG(o, v) \
  55. { \
  56. .offset = o, \
  57. .val = v, \
  58. .lane_mask = 0xff, \
  59. }
  60. #define QMP_PHY_INIT_CFG_L(o, v) \
  61. { \
  62. .offset = o, \
  63. .val = v, \
  64. .in_layout = true, \
  65. .lane_mask = 0xff, \
  66. }
  67. #define QMP_PHY_INIT_CFG_LANE(o, v, l) \
  68. { \
  69. .offset = o, \
  70. .val = v, \
  71. .lane_mask = l, \
  72. }
  73. /* set of registers with offsets different per-PHY */
  74. enum qphy_reg_layout {
  75. /* Common block control registers */
  76. QPHY_COM_SW_RESET,
  77. QPHY_COM_POWER_DOWN_CONTROL,
  78. QPHY_COM_START_CONTROL,
  79. QPHY_COM_PCS_READY_STATUS,
  80. /* PCS registers */
  81. QPHY_SW_RESET,
  82. QPHY_START_CTRL,
  83. QPHY_PCS_STATUS,
  84. QPHY_PCS_POWER_DOWN_CONTROL,
  85. /* Keep last to ensure regs_layout arrays are properly initialized */
  86. QPHY_LAYOUT_SIZE
  87. };
  88. static const unsigned int pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
  89. [QPHY_COM_SW_RESET] = 0x400,
  90. [QPHY_COM_POWER_DOWN_CONTROL] = 0x404,
  91. [QPHY_COM_START_CONTROL] = 0x408,
  92. [QPHY_COM_PCS_READY_STATUS] = 0x448,
  93. [QPHY_SW_RESET] = 0x00,
  94. [QPHY_START_CTRL] = 0x08,
  95. [QPHY_PCS_STATUS] = 0x174,
  96. };
  97. static const struct qmp_phy_init_tbl msm8996_pcie_serdes_tbl[] = {
  98. QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x1c),
  99. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
  100. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
  101. QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
  102. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x42),
  103. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
  104. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
  105. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
  106. QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x01),
  107. QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
  108. QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
  109. QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
  110. QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x09),
  111. QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
  112. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
  113. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
  114. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
  115. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
  116. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x1a),
  117. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x0a),
  118. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
  119. QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x02),
  120. QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1f),
  121. QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x04),
  122. QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
  123. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
  124. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
  125. QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
  126. QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
  127. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
  128. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
  129. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
  130. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x02),
  131. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
  132. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
  133. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
  134. QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x15),
  135. QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
  136. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
  137. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
  138. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
  139. QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
  140. QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x40),
  141. };
  142. static const struct qmp_phy_init_tbl msm8996_pcie_tx_tbl[] = {
  143. QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
  144. QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
  145. };
  146. static const struct qmp_phy_init_tbl msm8996_pcie_rx_tbl[] = {
  147. QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x1c),
  148. QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x01),
  149. QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x00),
  150. QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
  151. QMP_PHY_INIT_CFG(QSERDES_RX_RX_BAND, 0x18),
  152. QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x04),
  153. QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN_HALF, 0x04),
  154. QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
  155. QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
  156. QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x19),
  157. };
  158. static const struct qmp_phy_init_tbl msm8996_pcie_pcs_tbl[] = {
  159. QMP_PHY_INIT_CFG(QPHY_V2_PCS_RX_IDLE_DTCT_CNTRL, 0x4c),
  160. QMP_PHY_INIT_CFG(QPHY_V2_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x00),
  161. QMP_PHY_INIT_CFG(QPHY_V2_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
  162. QMP_PHY_INIT_CFG(QPHY_V2_PCS_PLL_LOCK_CHK_DLY_TIME, 0x05),
  163. QMP_PHY_INIT_CFG(QPHY_V2_PCS_ENDPOINT_REFCLK_DRIVE, 0x05),
  164. QMP_PHY_INIT_CFG(QPHY_V2_PCS_POWER_DOWN_CONTROL, 0x02),
  165. QMP_PHY_INIT_CFG(QPHY_V2_PCS_POWER_STATE_CONFIG4, 0x00),
  166. QMP_PHY_INIT_CFG(QPHY_V2_PCS_POWER_STATE_CONFIG1, 0xa3),
  167. QMP_PHY_INIT_CFG(QPHY_V2_PCS_TXDEEMPH_M3P5DB_V0, 0x0e),
  168. };
  169. /* struct qmp_phy_cfg - per-PHY initialization config */
  170. struct qmp_phy_cfg {
  171. /* number of PHYs provided by this block */
  172. int num_phys;
  173. /* Init sequence for PHY blocks - serdes, tx, rx, pcs */
  174. const struct qmp_phy_init_tbl *serdes_tbl;
  175. int serdes_tbl_num;
  176. const struct qmp_phy_init_tbl *tx_tbl;
  177. int tx_tbl_num;
  178. const struct qmp_phy_init_tbl *rx_tbl;
  179. int rx_tbl_num;
  180. const struct qmp_phy_init_tbl *pcs_tbl;
  181. int pcs_tbl_num;
  182. /* clock ids to be requested */
  183. const char * const *clk_list;
  184. int num_clks;
  185. /* resets to be requested */
  186. const char * const *reset_list;
  187. int num_resets;
  188. /* regulators to be requested */
  189. const char * const *vreg_list;
  190. int num_vregs;
  191. /* array of registers with different offsets */
  192. const unsigned int *regs;
  193. unsigned int start_ctrl;
  194. unsigned int pwrdn_ctrl;
  195. unsigned int mask_com_pcs_ready;
  196. /* bit offset of PHYSTATUS in QPHY_PCS_STATUS register */
  197. unsigned int phy_status;
  198. /* true, if PHY needs delay after POWER_DOWN */
  199. bool has_pwrdn_delay;
  200. /* power_down delay in usec */
  201. int pwrdn_delay_min;
  202. int pwrdn_delay_max;
  203. };
  204. /**
  205. * struct qmp_phy - per-lane phy descriptor
  206. *
  207. * @phy: generic phy
  208. * @cfg: phy specific configuration
  209. * @serdes: iomapped memory space for phy's serdes (i.e. PLL)
  210. * @tx: iomapped memory space for lane's tx
  211. * @rx: iomapped memory space for lane's rx
  212. * @pcs: iomapped memory space for lane's pcs
  213. * @pipe_clk: pipe clock
  214. * @index: lane index
  215. * @qmp: QMP phy to which this lane belongs
  216. * @lane_rst: lane's reset controller
  217. */
  218. struct qmp_phy {
  219. struct phy *phy;
  220. const struct qmp_phy_cfg *cfg;
  221. void __iomem *serdes;
  222. void __iomem *tx;
  223. void __iomem *rx;
  224. void __iomem *pcs;
  225. struct clk *pipe_clk;
  226. unsigned int index;
  227. struct qcom_qmp *qmp;
  228. struct reset_control *lane_rst;
  229. };
  230. /**
  231. * struct qcom_qmp - structure holding QMP phy block attributes
  232. *
  233. * @dev: device
  234. *
  235. * @clks: array of clocks required by phy
  236. * @resets: array of resets required by phy
  237. * @vregs: regulator supplies bulk data
  238. *
  239. * @phys: array of per-lane phy descriptors
  240. * @phy_mutex: mutex lock for PHY common block initialization
  241. * @init_count: phy common block initialization count
  242. */
  243. struct qcom_qmp {
  244. struct device *dev;
  245. struct clk_bulk_data *clks;
  246. struct reset_control_bulk_data *resets;
  247. struct regulator_bulk_data *vregs;
  248. struct qmp_phy **phys;
  249. struct mutex phy_mutex;
  250. int init_count;
  251. };
  252. static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
  253. {
  254. u32 reg;
  255. reg = readl(base + offset);
  256. reg |= val;
  257. writel(reg, base + offset);
  258. /* ensure that above write is through */
  259. readl(base + offset);
  260. }
  261. static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
  262. {
  263. u32 reg;
  264. reg = readl(base + offset);
  265. reg &= ~val;
  266. writel(reg, base + offset);
  267. /* ensure that above write is through */
  268. readl(base + offset);
  269. }
  270. /* list of clocks required by phy */
  271. static const char * const msm8996_phy_clk_l[] = {
  272. "aux", "cfg_ahb", "ref",
  273. };
  274. /* list of resets */
  275. static const char * const msm8996_pciephy_reset_l[] = {
  276. "phy", "common", "cfg",
  277. };
  278. /* list of regulators */
  279. static const char * const qmp_phy_vreg_l[] = {
  280. "vdda-phy", "vdda-pll",
  281. };
  282. static const struct qmp_phy_cfg msm8996_pciephy_cfg = {
  283. .num_phys = 3,
  284. .serdes_tbl = msm8996_pcie_serdes_tbl,
  285. .serdes_tbl_num = ARRAY_SIZE(msm8996_pcie_serdes_tbl),
  286. .tx_tbl = msm8996_pcie_tx_tbl,
  287. .tx_tbl_num = ARRAY_SIZE(msm8996_pcie_tx_tbl),
  288. .rx_tbl = msm8996_pcie_rx_tbl,
  289. .rx_tbl_num = ARRAY_SIZE(msm8996_pcie_rx_tbl),
  290. .pcs_tbl = msm8996_pcie_pcs_tbl,
  291. .pcs_tbl_num = ARRAY_SIZE(msm8996_pcie_pcs_tbl),
  292. .clk_list = msm8996_phy_clk_l,
  293. .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
  294. .reset_list = msm8996_pciephy_reset_l,
  295. .num_resets = ARRAY_SIZE(msm8996_pciephy_reset_l),
  296. .vreg_list = qmp_phy_vreg_l,
  297. .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
  298. .regs = pciephy_regs_layout,
  299. .start_ctrl = PCS_START | PLL_READY_GATE_EN,
  300. .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
  301. .mask_com_pcs_ready = PCS_READY,
  302. .phy_status = PHYSTATUS,
  303. .has_pwrdn_delay = true,
  304. .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
  305. .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
  306. };
  307. static void qmp_pcie_msm8996_configure_lane(void __iomem *base,
  308. const unsigned int *regs,
  309. const struct qmp_phy_init_tbl tbl[],
  310. int num,
  311. u8 lane_mask)
  312. {
  313. int i;
  314. const struct qmp_phy_init_tbl *t = tbl;
  315. if (!t)
  316. return;
  317. for (i = 0; i < num; i++, t++) {
  318. if (!(t->lane_mask & lane_mask))
  319. continue;
  320. if (t->in_layout)
  321. writel(t->val, base + regs[t->offset]);
  322. else
  323. writel(t->val, base + t->offset);
  324. }
  325. }
  326. static void qmp_pcie_msm8996_configure(void __iomem *base,
  327. const unsigned int *regs,
  328. const struct qmp_phy_init_tbl tbl[],
  329. int num)
  330. {
  331. qmp_pcie_msm8996_configure_lane(base, regs, tbl, num, 0xff);
  332. }
  333. static int qmp_pcie_msm8996_serdes_init(struct qmp_phy *qphy)
  334. {
  335. struct qcom_qmp *qmp = qphy->qmp;
  336. const struct qmp_phy_cfg *cfg = qphy->cfg;
  337. void __iomem *serdes = qphy->serdes;
  338. const struct qmp_phy_init_tbl *serdes_tbl = cfg->serdes_tbl;
  339. int serdes_tbl_num = cfg->serdes_tbl_num;
  340. void __iomem *status;
  341. unsigned int mask, val;
  342. int ret;
  343. qmp_pcie_msm8996_configure(serdes, cfg->regs, serdes_tbl, serdes_tbl_num);
  344. qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET], SW_RESET);
  345. qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
  346. SERDES_START | PCS_START);
  347. status = serdes + cfg->regs[QPHY_COM_PCS_READY_STATUS];
  348. mask = cfg->mask_com_pcs_ready;
  349. ret = readl_poll_timeout(status, val, (val & mask), 10,
  350. PHY_INIT_COMPLETE_TIMEOUT);
  351. if (ret) {
  352. dev_err(qmp->dev,
  353. "phy common block init timed-out\n");
  354. return ret;
  355. }
  356. return 0;
  357. }
  358. static int qmp_pcie_msm8996_com_init(struct qmp_phy *qphy)
  359. {
  360. struct qcom_qmp *qmp = qphy->qmp;
  361. const struct qmp_phy_cfg *cfg = qphy->cfg;
  362. void __iomem *serdes = qphy->serdes;
  363. int ret;
  364. mutex_lock(&qmp->phy_mutex);
  365. if (qmp->init_count++) {
  366. mutex_unlock(&qmp->phy_mutex);
  367. return 0;
  368. }
  369. /* turn on regulator supplies */
  370. ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
  371. if (ret) {
  372. dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
  373. goto err_decrement_count;
  374. }
  375. ret = reset_control_bulk_assert(cfg->num_resets, qmp->resets);
  376. if (ret) {
  377. dev_err(qmp->dev, "reset assert failed\n");
  378. goto err_disable_regulators;
  379. }
  380. ret = reset_control_bulk_deassert(cfg->num_resets, qmp->resets);
  381. if (ret) {
  382. dev_err(qmp->dev, "reset deassert failed\n");
  383. goto err_disable_regulators;
  384. }
  385. ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
  386. if (ret)
  387. goto err_assert_reset;
  388. qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
  389. SW_PWRDN);
  390. mutex_unlock(&qmp->phy_mutex);
  391. return 0;
  392. err_assert_reset:
  393. reset_control_bulk_assert(cfg->num_resets, qmp->resets);
  394. err_disable_regulators:
  395. regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
  396. err_decrement_count:
  397. qmp->init_count--;
  398. mutex_unlock(&qmp->phy_mutex);
  399. return ret;
  400. }
  401. static int qmp_pcie_msm8996_com_exit(struct qmp_phy *qphy)
  402. {
  403. struct qcom_qmp *qmp = qphy->qmp;
  404. const struct qmp_phy_cfg *cfg = qphy->cfg;
  405. void __iomem *serdes = qphy->serdes;
  406. mutex_lock(&qmp->phy_mutex);
  407. if (--qmp->init_count) {
  408. mutex_unlock(&qmp->phy_mutex);
  409. return 0;
  410. }
  411. qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
  412. SERDES_START | PCS_START);
  413. qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET],
  414. SW_RESET);
  415. qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
  416. SW_PWRDN);
  417. reset_control_bulk_assert(cfg->num_resets, qmp->resets);
  418. clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
  419. regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
  420. mutex_unlock(&qmp->phy_mutex);
  421. return 0;
  422. }
  423. static int qmp_pcie_msm8996_init(struct phy *phy)
  424. {
  425. struct qmp_phy *qphy = phy_get_drvdata(phy);
  426. struct qcom_qmp *qmp = qphy->qmp;
  427. int ret;
  428. dev_vdbg(qmp->dev, "Initializing QMP phy\n");
  429. ret = qmp_pcie_msm8996_com_init(qphy);
  430. if (ret)
  431. return ret;
  432. return 0;
  433. }
  434. static int qmp_pcie_msm8996_power_on(struct phy *phy)
  435. {
  436. struct qmp_phy *qphy = phy_get_drvdata(phy);
  437. struct qcom_qmp *qmp = qphy->qmp;
  438. const struct qmp_phy_cfg *cfg = qphy->cfg;
  439. void __iomem *tx = qphy->tx;
  440. void __iomem *rx = qphy->rx;
  441. void __iomem *pcs = qphy->pcs;
  442. void __iomem *status;
  443. unsigned int mask, val, ready;
  444. int ret;
  445. qmp_pcie_msm8996_serdes_init(qphy);
  446. ret = reset_control_deassert(qphy->lane_rst);
  447. if (ret) {
  448. dev_err(qmp->dev, "lane%d reset deassert failed\n",
  449. qphy->index);
  450. return ret;
  451. }
  452. ret = clk_prepare_enable(qphy->pipe_clk);
  453. if (ret) {
  454. dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret);
  455. goto err_reset_lane;
  456. }
  457. /* Tx, Rx, and PCS configurations */
  458. qmp_pcie_msm8996_configure_lane(tx, cfg->regs, cfg->tx_tbl,
  459. cfg->tx_tbl_num, 1);
  460. qmp_pcie_msm8996_configure_lane(rx, cfg->regs, cfg->rx_tbl,
  461. cfg->rx_tbl_num, 1);
  462. qmp_pcie_msm8996_configure(pcs, cfg->regs, cfg->pcs_tbl, cfg->pcs_tbl_num);
  463. /*
  464. * Pull out PHY from POWER DOWN state.
  465. * This is active low enable signal to power-down PHY.
  466. */
  467. qphy_setbits(pcs, QPHY_V2_PCS_POWER_DOWN_CONTROL, cfg->pwrdn_ctrl);
  468. if (cfg->has_pwrdn_delay)
  469. usleep_range(cfg->pwrdn_delay_min, cfg->pwrdn_delay_max);
  470. /* Pull PHY out of reset state */
  471. qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
  472. /* start SerDes and Phy-Coding-Sublayer */
  473. qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
  474. status = pcs + cfg->regs[QPHY_PCS_STATUS];
  475. mask = cfg->phy_status;
  476. ready = 0;
  477. ret = readl_poll_timeout(status, val, (val & mask) == ready, 10,
  478. PHY_INIT_COMPLETE_TIMEOUT);
  479. if (ret) {
  480. dev_err(qmp->dev, "phy initialization timed-out\n");
  481. goto err_disable_pipe_clk;
  482. }
  483. return 0;
  484. err_disable_pipe_clk:
  485. clk_disable_unprepare(qphy->pipe_clk);
  486. err_reset_lane:
  487. reset_control_assert(qphy->lane_rst);
  488. return ret;
  489. }
  490. static int qmp_pcie_msm8996_power_off(struct phy *phy)
  491. {
  492. struct qmp_phy *qphy = phy_get_drvdata(phy);
  493. const struct qmp_phy_cfg *cfg = qphy->cfg;
  494. clk_disable_unprepare(qphy->pipe_clk);
  495. /* PHY reset */
  496. qphy_setbits(qphy->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
  497. /* stop SerDes and Phy-Coding-Sublayer */
  498. qphy_clrbits(qphy->pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
  499. /* Put PHY into POWER DOWN state: active low */
  500. if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL]) {
  501. qphy_clrbits(qphy->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
  502. cfg->pwrdn_ctrl);
  503. } else {
  504. qphy_clrbits(qphy->pcs, QPHY_V2_PCS_POWER_DOWN_CONTROL,
  505. cfg->pwrdn_ctrl);
  506. }
  507. return 0;
  508. }
  509. static int qmp_pcie_msm8996_exit(struct phy *phy)
  510. {
  511. struct qmp_phy *qphy = phy_get_drvdata(phy);
  512. reset_control_assert(qphy->lane_rst);
  513. qmp_pcie_msm8996_com_exit(qphy);
  514. return 0;
  515. }
  516. static int qmp_pcie_msm8996_enable(struct phy *phy)
  517. {
  518. int ret;
  519. ret = qmp_pcie_msm8996_init(phy);
  520. if (ret)
  521. return ret;
  522. ret = qmp_pcie_msm8996_power_on(phy);
  523. if (ret)
  524. qmp_pcie_msm8996_exit(phy);
  525. return ret;
  526. }
  527. static int qmp_pcie_msm8996_disable(struct phy *phy)
  528. {
  529. int ret;
  530. ret = qmp_pcie_msm8996_power_off(phy);
  531. if (ret)
  532. return ret;
  533. return qmp_pcie_msm8996_exit(phy);
  534. }
  535. static int qmp_pcie_msm8996_vreg_init(struct device *dev, const struct qmp_phy_cfg *cfg)
  536. {
  537. struct qcom_qmp *qmp = dev_get_drvdata(dev);
  538. int num = cfg->num_vregs;
  539. int i;
  540. qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL);
  541. if (!qmp->vregs)
  542. return -ENOMEM;
  543. for (i = 0; i < num; i++)
  544. qmp->vregs[i].supply = cfg->vreg_list[i];
  545. return devm_regulator_bulk_get(dev, num, qmp->vregs);
  546. }
  547. static int qmp_pcie_msm8996_reset_init(struct device *dev, const struct qmp_phy_cfg *cfg)
  548. {
  549. struct qcom_qmp *qmp = dev_get_drvdata(dev);
  550. int i;
  551. int ret;
  552. qmp->resets = devm_kcalloc(dev, cfg->num_resets,
  553. sizeof(*qmp->resets), GFP_KERNEL);
  554. if (!qmp->resets)
  555. return -ENOMEM;
  556. for (i = 0; i < cfg->num_resets; i++)
  557. qmp->resets[i].id = cfg->reset_list[i];
  558. ret = devm_reset_control_bulk_get_exclusive(dev, cfg->num_resets, qmp->resets);
  559. if (ret)
  560. return dev_err_probe(dev, ret, "failed to get resets\n");
  561. return 0;
  562. }
  563. static int qmp_pcie_msm8996_clk_init(struct device *dev, const struct qmp_phy_cfg *cfg)
  564. {
  565. struct qcom_qmp *qmp = dev_get_drvdata(dev);
  566. int num = cfg->num_clks;
  567. int i;
  568. qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
  569. if (!qmp->clks)
  570. return -ENOMEM;
  571. for (i = 0; i < num; i++)
  572. qmp->clks[i].id = cfg->clk_list[i];
  573. return devm_clk_bulk_get(dev, num, qmp->clks);
  574. }
  575. static void phy_clk_release_provider(void *res)
  576. {
  577. of_clk_del_provider(res);
  578. }
  579. /*
  580. * Register a fixed rate pipe clock.
  581. *
  582. * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
  583. * controls it. The <s>_pipe_clk coming out of the GCC is requested
  584. * by the PHY driver for its operations.
  585. * We register the <s>_pipe_clksrc here. The gcc driver takes care
  586. * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
  587. * Below picture shows this relationship.
  588. *
  589. * +---------------+
  590. * | PHY block |<<---------------------------------------+
  591. * | | |
  592. * | +-------+ | +-----+ |
  593. * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
  594. * clk | +-------+ | +-----+
  595. * +---------------+
  596. */
  597. static int phy_pipe_clk_register(struct qcom_qmp *qmp, struct device_node *np)
  598. {
  599. struct clk_fixed_rate *fixed;
  600. struct clk_init_data init = { };
  601. int ret;
  602. ret = of_property_read_string(np, "clock-output-names", &init.name);
  603. if (ret) {
  604. dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np);
  605. return ret;
  606. }
  607. fixed = devm_kzalloc(qmp->dev, sizeof(*fixed), GFP_KERNEL);
  608. if (!fixed)
  609. return -ENOMEM;
  610. init.ops = &clk_fixed_rate_ops;
  611. /* controllers using QMP phys use 125MHz pipe clock interface */
  612. fixed->fixed_rate = 125000000;
  613. fixed->hw.init = &init;
  614. ret = devm_clk_hw_register(qmp->dev, &fixed->hw);
  615. if (ret)
  616. return ret;
  617. ret = of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw);
  618. if (ret)
  619. return ret;
  620. /*
  621. * Roll a devm action because the clock provider is the child node, but
  622. * the child node is not actually a device.
  623. */
  624. return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np);
  625. }
  626. static const struct phy_ops qmp_pcie_msm8996_ops = {
  627. .power_on = qmp_pcie_msm8996_enable,
  628. .power_off = qmp_pcie_msm8996_disable,
  629. .owner = THIS_MODULE,
  630. };
  631. static void qcom_qmp_reset_control_put(void *data)
  632. {
  633. reset_control_put(data);
  634. }
  635. static int qmp_pcie_msm8996_create(struct device *dev, struct device_node *np, int id,
  636. void __iomem *serdes, const struct qmp_phy_cfg *cfg)
  637. {
  638. struct qcom_qmp *qmp = dev_get_drvdata(dev);
  639. struct phy *generic_phy;
  640. struct qmp_phy *qphy;
  641. int ret;
  642. qphy = devm_kzalloc(dev, sizeof(*qphy), GFP_KERNEL);
  643. if (!qphy)
  644. return -ENOMEM;
  645. qphy->cfg = cfg;
  646. qphy->serdes = serdes;
  647. /*
  648. * Get memory resources for each phy lane:
  649. * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2.
  650. */
  651. qphy->tx = devm_of_iomap(dev, np, 0, NULL);
  652. if (IS_ERR(qphy->tx))
  653. return PTR_ERR(qphy->tx);
  654. qphy->rx = devm_of_iomap(dev, np, 1, NULL);
  655. if (IS_ERR(qphy->rx))
  656. return PTR_ERR(qphy->rx);
  657. qphy->pcs = devm_of_iomap(dev, np, 2, NULL);
  658. if (IS_ERR(qphy->pcs))
  659. return PTR_ERR(qphy->pcs);
  660. qphy->pipe_clk = devm_get_clk_from_child(dev, np, NULL);
  661. if (IS_ERR(qphy->pipe_clk)) {
  662. return dev_err_probe(dev, PTR_ERR(qphy->pipe_clk),
  663. "failed to get lane%d pipe clock\n", id);
  664. }
  665. qphy->lane_rst = of_reset_control_get_exclusive_by_index(np, 0);
  666. if (IS_ERR(qphy->lane_rst)) {
  667. dev_err(dev, "failed to get lane%d reset\n", id);
  668. return PTR_ERR(qphy->lane_rst);
  669. }
  670. ret = devm_add_action_or_reset(dev, qcom_qmp_reset_control_put,
  671. qphy->lane_rst);
  672. if (ret)
  673. return ret;
  674. generic_phy = devm_phy_create(dev, np, &qmp_pcie_msm8996_ops);
  675. if (IS_ERR(generic_phy)) {
  676. ret = PTR_ERR(generic_phy);
  677. dev_err(dev, "failed to create qphy %d\n", ret);
  678. return ret;
  679. }
  680. qphy->phy = generic_phy;
  681. qphy->index = id;
  682. qphy->qmp = qmp;
  683. qmp->phys[id] = qphy;
  684. phy_set_drvdata(generic_phy, qphy);
  685. return 0;
  686. }
  687. static const struct of_device_id qmp_pcie_msm8996_of_match_table[] = {
  688. {
  689. .compatible = "qcom,msm8996-qmp-pcie-phy",
  690. .data = &msm8996_pciephy_cfg,
  691. },
  692. { },
  693. };
  694. MODULE_DEVICE_TABLE(of, qmp_pcie_msm8996_of_match_table);
  695. static int qmp_pcie_msm8996_probe(struct platform_device *pdev)
  696. {
  697. struct qcom_qmp *qmp;
  698. struct device *dev = &pdev->dev;
  699. struct device_node *child;
  700. struct phy_provider *phy_provider;
  701. void __iomem *serdes;
  702. const struct qmp_phy_cfg *cfg = NULL;
  703. int num, id, expected_phys;
  704. int ret;
  705. qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
  706. if (!qmp)
  707. return -ENOMEM;
  708. qmp->dev = dev;
  709. dev_set_drvdata(dev, qmp);
  710. /* Get the specific init parameters of QMP phy */
  711. cfg = of_device_get_match_data(dev);
  712. if (!cfg)
  713. return -EINVAL;
  714. /* per PHY serdes; usually located at base address */
  715. serdes = devm_platform_ioremap_resource(pdev, 0);
  716. if (IS_ERR(serdes))
  717. return PTR_ERR(serdes);
  718. expected_phys = cfg->num_phys;
  719. mutex_init(&qmp->phy_mutex);
  720. ret = qmp_pcie_msm8996_clk_init(dev, cfg);
  721. if (ret)
  722. return ret;
  723. ret = qmp_pcie_msm8996_reset_init(dev, cfg);
  724. if (ret)
  725. return ret;
  726. ret = qmp_pcie_msm8996_vreg_init(dev, cfg);
  727. if (ret)
  728. return dev_err_probe(dev, ret,
  729. "failed to get regulator supplies\n");
  730. num = of_get_available_child_count(dev->of_node);
  731. /* do we have a rogue child node ? */
  732. if (num > expected_phys)
  733. return -EINVAL;
  734. qmp->phys = devm_kcalloc(dev, num, sizeof(*qmp->phys), GFP_KERNEL);
  735. if (!qmp->phys)
  736. return -ENOMEM;
  737. id = 0;
  738. for_each_available_child_of_node(dev->of_node, child) {
  739. /* Create per-lane phy */
  740. ret = qmp_pcie_msm8996_create(dev, child, id, serdes, cfg);
  741. if (ret) {
  742. dev_err(dev, "failed to create lane%d phy, %d\n",
  743. id, ret);
  744. goto err_node_put;
  745. }
  746. /*
  747. * Register the pipe clock provided by phy.
  748. * See function description to see details of this pipe clock.
  749. */
  750. ret = phy_pipe_clk_register(qmp, child);
  751. if (ret) {
  752. dev_err(qmp->dev,
  753. "failed to register pipe clock source\n");
  754. goto err_node_put;
  755. }
  756. id++;
  757. }
  758. phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
  759. return PTR_ERR_OR_ZERO(phy_provider);
  760. err_node_put:
  761. of_node_put(child);
  762. return ret;
  763. }
  764. static struct platform_driver qmp_pcie_msm8996_driver = {
  765. .probe = qmp_pcie_msm8996_probe,
  766. .driver = {
  767. .name = "qcom-qmp-msm8996-pcie-phy",
  768. .of_match_table = qmp_pcie_msm8996_of_match_table,
  769. },
  770. };
  771. module_platform_driver(qmp_pcie_msm8996_driver);
  772. MODULE_AUTHOR("Vivek Gautam <[email protected]>");
  773. MODULE_DESCRIPTION("Qualcomm QMP MSM8996 PCIe PHY driver");
  774. MODULE_LICENSE("GPL v2");