phy-qcom-qmp-usbc.c 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043
  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/mfd/syscon.h>
  13. #include <linux/module.h>
  14. #include <linux/of.h>
  15. #include <linux/of_address.h>
  16. #include <linux/phy/phy.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/regmap.h>
  19. #include <linux/regulator/consumer.h>
  20. #include <linux/reset.h>
  21. #include <linux/slab.h>
  22. #include <linux/usb/typec.h>
  23. #include <linux/usb/typec_mux.h>
  24. #include <dt-bindings/phy/phy-qcom-qmp.h>
  25. #include "phy-qcom-qmp-common.h"
  26. #include "phy-qcom-qmp.h"
  27. #include "phy-qcom-qmp-pcs-misc-v3.h"
  28. #include "phy-qcom-qmp-dp-phy.h"
  29. #include "phy-qcom-qmp-dp-phy-v2.h"
  30. #define PHY_INIT_COMPLETE_TIMEOUT 10000
  31. #define SW_PORTSELECT_VAL BIT(0)
  32. #define SW_PORTSELECT_MUX BIT(1)
  33. /* set of registers with offsets different per-PHY */
  34. enum qphy_reg_layout {
  35. /* PCS registers */
  36. QPHY_SW_RESET,
  37. QPHY_START_CTRL,
  38. QPHY_PCS_STATUS,
  39. QPHY_PCS_AUTONOMOUS_MODE_CTRL,
  40. QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
  41. QPHY_PCS_POWER_DOWN_CONTROL,
  42. /* Keep last to ensure regs_layout arrays are properly initialized */
  43. QPHY_LAYOUT_SIZE
  44. };
  45. static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
  46. [QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET,
  47. [QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL,
  48. [QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS,
  49. [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL,
  50. [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR,
  51. [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL,
  52. };
  53. static const unsigned int qmp_v3_usb3phy_regs_layout_qcm2290[QPHY_LAYOUT_SIZE] = {
  54. [QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET,
  55. [QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL,
  56. [QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS,
  57. [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL,
  58. [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR,
  59. [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL,
  60. };
  61. static const struct qmp_phy_init_tbl msm8998_usb3_serdes_tbl[] = {
  62. QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
  63. QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
  64. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
  65. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x06),
  66. QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
  67. QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
  68. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
  69. QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
  70. QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
  71. QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
  72. QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
  73. QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
  74. QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
  75. QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
  76. QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
  77. QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
  78. QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
  79. QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
  80. QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
  81. QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
  82. QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
  83. QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
  84. QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
  85. QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
  86. QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
  87. QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
  88. QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
  89. QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
  90. QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
  91. QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_INITVAL, 0x80),
  92. QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_MODE, 0x01),
  93. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
  94. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
  95. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
  96. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
  97. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
  98. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
  99. QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
  100. };
  101. static const struct qmp_phy_init_tbl msm8998_usb3_tx_tbl[] = {
  102. QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
  103. QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
  104. QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
  105. QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x00),
  106. };
  107. static const struct qmp_phy_init_tbl msm8998_usb3_rx_tbl[] = {
  108. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
  109. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
  110. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
  111. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
  112. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x07),
  113. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
  114. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x43),
  115. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1c),
  116. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
  117. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
  118. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
  119. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x80),
  120. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
  121. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x06),
  122. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x00),
  123. QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x03),
  124. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05),
  125. };
  126. static const struct qmp_phy_init_tbl msm8998_usb3_pcs_tbl[] = {
  127. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
  128. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
  129. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
  130. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
  131. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
  132. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
  133. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
  134. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
  135. QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
  136. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
  137. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
  138. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
  139. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
  140. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
  141. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
  142. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
  143. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
  144. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
  145. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
  146. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
  147. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
  148. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
  149. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x0d),
  150. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
  151. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
  152. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
  153. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
  154. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
  155. QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
  156. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
  157. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
  158. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
  159. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
  160. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
  161. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x8a),
  162. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
  163. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
  164. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
  165. };
  166. static const struct qmp_phy_init_tbl qcm2290_usb3_serdes_tbl[] = {
  167. QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x14),
  168. QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
  169. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
  170. QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
  171. QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x00),
  172. QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL2, 0x08),
  173. QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
  174. QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
  175. QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
  176. QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
  177. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
  178. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
  179. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
  180. QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
  181. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
  182. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
  183. QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
  184. QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
  185. QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
  186. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x15),
  187. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x34),
  188. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
  189. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x00),
  190. QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
  191. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
  192. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
  193. QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
  194. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
  195. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
  196. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
  197. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x00),
  198. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
  199. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0xde),
  200. QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x07),
  201. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
  202. QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
  203. QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_INITVAL, 0x80),
  204. QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CTRL_BY_PSM, 0x01),
  205. };
  206. static const struct qmp_phy_init_tbl qcm2290_usb3_tx_tbl[] = {
  207. QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
  208. QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
  209. QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0xc6),
  210. QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x00),
  211. QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x00),
  212. };
  213. static const struct qmp_phy_init_tbl qcm2290_usb3_rx_tbl[] = {
  214. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
  215. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x80),
  216. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
  217. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
  218. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
  219. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x06),
  220. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
  221. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
  222. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
  223. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
  224. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
  225. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
  226. QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x0a),
  227. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
  228. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
  229. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x00),
  230. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x00),
  231. };
  232. /* the only difference is QSERDES_V3_RX_UCDR_PI_CONTROLS */
  233. static const struct qmp_phy_init_tbl sdm660_usb3_rx_tbl[] = {
  234. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
  235. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x00),
  236. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
  237. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
  238. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
  239. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x06),
  240. QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
  241. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
  242. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
  243. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
  244. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
  245. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
  246. QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x0a),
  247. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
  248. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
  249. QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x00),
  250. QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x00),
  251. };
  252. static const struct qmp_phy_init_tbl qcm2290_usb3_pcs_tbl[] = {
  253. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
  254. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x17),
  255. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0f),
  256. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
  257. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
  258. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
  259. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
  260. QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x85),
  261. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
  262. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
  263. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
  264. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
  265. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
  266. QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
  267. QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
  268. QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
  269. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
  270. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
  271. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
  272. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
  273. QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x88),
  274. };
  275. static const struct qmp_phy_init_tbl qmp_v2_dp_serdes_tbl[] = {
  276. QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
  277. QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x37),
  278. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x00),
  279. QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
  280. QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x3f),
  281. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x0e),
  282. QMP_PHY_INIT_CFG(QSERDES_COM_BG_CTRL, 0x0f),
  283. QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x06),
  284. QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
  285. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
  286. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
  287. QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
  288. QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
  289. QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x40),
  290. QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
  291. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
  292. QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x08),
  293. QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x05),
  294. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x00),
  295. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE0, 0x00),
  296. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE0, 0x00),
  297. QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x00),
  298. QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x0f),
  299. QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x02),
  300. };
  301. static const struct qmp_phy_init_tbl qmp_v2_dp_serdes_tbl_rbr[] = {
  302. QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x2c),
  303. QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x69),
  304. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
  305. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x80),
  306. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x07),
  307. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xbf),
  308. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x21),
  309. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
  310. };
  311. static const struct qmp_phy_init_tbl qmp_v2_dp_serdes_tbl_hbr[] = {
  312. QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x24),
  313. QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x69),
  314. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
  315. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x80),
  316. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x07),
  317. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x3f),
  318. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x38),
  319. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
  320. };
  321. static const struct qmp_phy_init_tbl qmp_v2_dp_serdes_tbl_hbr2[] = {
  322. QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x20),
  323. QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x8c),
  324. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
  325. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00),
  326. QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x0a),
  327. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x7f),
  328. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x70),
  329. QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
  330. };
  331. static const struct qmp_phy_init_tbl qmp_v2_dp_tx_tbl[] = {
  332. QMP_PHY_INIT_CFG(QSERDES_V2_TX_TRANSCEIVER_BIAS_EN, 0x1a),
  333. QMP_PHY_INIT_CFG(QSERDES_V2_TX_VMODE_CTRL1, 0x40),
  334. QMP_PHY_INIT_CFG(QSERDES_V2_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
  335. QMP_PHY_INIT_CFG(QSERDES_V2_TX_INTERFACE_SELECT, 0x3d),
  336. QMP_PHY_INIT_CFG(QSERDES_V2_TX_CLKBUF_ENABLE, 0x0f),
  337. QMP_PHY_INIT_CFG(QSERDES_V2_TX_RESET_TSYNC_EN, 0x03),
  338. QMP_PHY_INIT_CFG(QSERDES_V2_TX_TRAN_DRVR_EMP_EN, 0x03),
  339. QMP_PHY_INIT_CFG(QSERDES_V2_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
  340. QMP_PHY_INIT_CFG(QSERDES_V2_TX_TX_INTERFACE_MODE, 0x00),
  341. QMP_PHY_INIT_CFG(QSERDES_V2_TX_TX_EMP_POST1_LVL, 0x2b),
  342. QMP_PHY_INIT_CFG(QSERDES_V2_TX_TX_DRV_LVL, 0x2f),
  343. QMP_PHY_INIT_CFG(QSERDES_V2_TX_TX_BAND, 0x4),
  344. QMP_PHY_INIT_CFG(QSERDES_V2_TX_RES_CODE_LANE_OFFSET_TX, 0x12),
  345. QMP_PHY_INIT_CFG(QSERDES_V2_TX_RES_CODE_LANE_OFFSET_RX, 0x12),
  346. };
  347. struct qmp_usbc_offsets {
  348. u16 serdes;
  349. u16 pcs;
  350. u16 pcs_misc;
  351. u16 tx;
  352. u16 rx;
  353. /* for PHYs with >= 2 lanes */
  354. u16 tx2;
  355. u16 rx2;
  356. u16 dp_serdes;
  357. u16 dp_txa;
  358. u16 dp_txb;
  359. u16 dp_dp_phy;
  360. };
  361. struct qmp_usbc;
  362. struct qmp_phy_cfg {
  363. const struct qmp_usbc_offsets *offsets;
  364. /* Init sequence for USB PHY blocks - serdes, tx, rx, pcs */
  365. const struct qmp_phy_init_tbl *serdes_tbl;
  366. int serdes_tbl_num;
  367. const struct qmp_phy_init_tbl *tx_tbl;
  368. int tx_tbl_num;
  369. const struct qmp_phy_init_tbl *rx_tbl;
  370. int rx_tbl_num;
  371. const struct qmp_phy_init_tbl *pcs_tbl;
  372. int pcs_tbl_num;
  373. /* Init sequence for DP PHY blocks - serdes, tx, rbr, hbr, hbr2 */
  374. const struct qmp_phy_init_tbl *dp_serdes_tbl;
  375. int dp_serdes_tbl_num;
  376. const struct qmp_phy_init_tbl *dp_tx_tbl;
  377. int dp_tx_tbl_num;
  378. const struct qmp_phy_init_tbl *serdes_tbl_rbr;
  379. int serdes_tbl_rbr_num;
  380. const struct qmp_phy_init_tbl *serdes_tbl_hbr;
  381. int serdes_tbl_hbr_num;
  382. const struct qmp_phy_init_tbl *serdes_tbl_hbr2;
  383. int serdes_tbl_hbr2_num;
  384. const u8 (*swing_tbl)[4][4];
  385. const u8 (*pre_emphasis_tbl)[4][4];
  386. /* DP PHY callbacks */
  387. void (*dp_aux_init)(struct qmp_usbc *qmp);
  388. void (*configure_dp_tx)(struct qmp_usbc *qmp);
  389. int (*configure_dp_phy)(struct qmp_usbc *qmp);
  390. int (*calibrate_dp_phy)(struct qmp_usbc *qmp);
  391. const char * const *reset_list;
  392. int num_resets;
  393. const struct regulator_bulk_data *vreg_list;
  394. int num_vregs;
  395. /* array of registers with different offsets */
  396. const unsigned int *regs;
  397. };
  398. struct qmp_usbc {
  399. struct device *dev;
  400. const struct qmp_phy_cfg *cfg;
  401. void __iomem *serdes;
  402. void __iomem *pcs;
  403. void __iomem *pcs_misc;
  404. void __iomem *tx;
  405. void __iomem *rx;
  406. void __iomem *tx2;
  407. void __iomem *rx2;
  408. void __iomem *dp_dp_phy;
  409. void __iomem *dp_tx;
  410. void __iomem *dp_tx2;
  411. void __iomem *dp_serdes;
  412. struct clk *pipe_clk;
  413. struct clk_fixed_rate pipe_clk_fixed;
  414. struct clk_hw dp_link_hw;
  415. struct clk_hw dp_pixel_hw;
  416. struct clk_bulk_data *clks;
  417. int num_clks;
  418. int num_resets;
  419. struct reset_control_bulk_data *resets;
  420. struct regulator_bulk_data *vregs;
  421. struct regmap *tcsr_map;
  422. u32 vls_clamp_reg;
  423. u32 dp_phy_mode_reg;
  424. struct mutex phy_mutex;
  425. struct phy *usb_phy;
  426. enum phy_mode mode;
  427. unsigned int usb_init_count;
  428. struct phy *dp_phy;
  429. unsigned int dp_aux_cfg;
  430. struct phy_configure_opts_dp dp_opts;
  431. unsigned int dp_init_count;
  432. struct typec_switch_dev *sw;
  433. enum typec_orientation orientation;
  434. };
  435. static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
  436. {
  437. u32 reg;
  438. reg = readl(base + offset);
  439. reg |= val;
  440. writel(reg, base + offset);
  441. /* ensure that above write is through */
  442. readl(base + offset);
  443. }
  444. static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
  445. {
  446. u32 reg;
  447. reg = readl(base + offset);
  448. reg &= ~val;
  449. writel(reg, base + offset);
  450. /* ensure that above write is through */
  451. readl(base + offset);
  452. }
  453. /* list of clocks required by phy */
  454. static const char * const qmp_usbc_phy_clk_l[] = {
  455. "aux", "cfg_ahb", "ref", "com_aux",
  456. };
  457. /* list of resets */
  458. static const char * const usb3phy_legacy_reset_l[] = {
  459. "phy", "common",
  460. };
  461. static const char * const usb3phy_reset_l[] = {
  462. "phy_phy", "phy",
  463. };
  464. static const char * const usb3dpphy_reset_l[] = {
  465. "phy_phy", "dp_phy",
  466. };
  467. static const struct regulator_bulk_data qmp_phy_msm8998_vreg_l[] = {
  468. { .supply = "vdda-phy", .init_load_uA = 68600 },
  469. { .supply = "vdda-pll", .init_load_uA = 14200 },
  470. };
  471. static const struct regulator_bulk_data qmp_phy_sm2290_vreg_l[] = {
  472. { .supply = "vdda-phy", .init_load_uA = 66100 },
  473. { .supply = "vdda-pll", .init_load_uA = 13300 },
  474. };
  475. static const struct regulator_bulk_data qmp_phy_qcs615_vreg_l[] = {
  476. { .supply = "vdda-phy", .init_load_uA = 50000 },
  477. { .supply = "vdda-pll", .init_load_uA = 20000 },
  478. };
  479. static const struct qmp_usbc_offsets qmp_usbc_offsets_v3_qcm2290 = {
  480. .serdes = 0x0,
  481. .pcs = 0xc00,
  482. .pcs_misc = 0xa00,
  483. .tx = 0x200,
  484. .rx = 0x400,
  485. .tx2 = 0x600,
  486. .rx2 = 0x800,
  487. };
  488. static const struct qmp_usbc_offsets qmp_usbc_usb3dp_offsets_qcs615 = {
  489. .serdes = 0x0,
  490. .pcs = 0xc00,
  491. .pcs_misc = 0xa00,
  492. .tx = 0x200,
  493. .rx = 0x400,
  494. .tx2 = 0x600,
  495. .rx2 = 0x800,
  496. .dp_serdes = 0x1c00,
  497. .dp_txa = 0x1400,
  498. .dp_txb = 0x1800,
  499. .dp_dp_phy = 0x1000,
  500. };
  501. static const u8 qmp_v2_dp_pre_emphasis_hbr2_rbr[4][4] = {
  502. {0x00, 0x0b, 0x12, 0xff},
  503. {0x00, 0x0a, 0x12, 0xff},
  504. {0x00, 0x0c, 0xff, 0xff},
  505. {0xff, 0xff, 0xff, 0xff}
  506. };
  507. static const u8 qmp_v2_dp_voltage_swing_hbr2_rbr[4][4] = {
  508. {0x07, 0x0f, 0x14, 0xff},
  509. {0x11, 0x1d, 0x1f, 0xff},
  510. {0x18, 0x1f, 0xff, 0xff},
  511. {0xff, 0xff, 0xff, 0xff}
  512. };
  513. static const struct qmp_phy_cfg msm8998_usb3phy_cfg = {
  514. .offsets = &qmp_usbc_offsets_v3_qcm2290,
  515. .serdes_tbl = msm8998_usb3_serdes_tbl,
  516. .serdes_tbl_num = ARRAY_SIZE(msm8998_usb3_serdes_tbl),
  517. .tx_tbl = msm8998_usb3_tx_tbl,
  518. .tx_tbl_num = ARRAY_SIZE(msm8998_usb3_tx_tbl),
  519. .rx_tbl = msm8998_usb3_rx_tbl,
  520. .rx_tbl_num = ARRAY_SIZE(msm8998_usb3_rx_tbl),
  521. .pcs_tbl = msm8998_usb3_pcs_tbl,
  522. .pcs_tbl_num = ARRAY_SIZE(msm8998_usb3_pcs_tbl),
  523. .reset_list = usb3phy_reset_l,
  524. .num_resets = ARRAY_SIZE(usb3phy_reset_l),
  525. .vreg_list = qmp_phy_msm8998_vreg_l,
  526. .num_vregs = ARRAY_SIZE(qmp_phy_msm8998_vreg_l),
  527. .regs = qmp_v3_usb3phy_regs_layout,
  528. };
  529. static const struct qmp_phy_cfg qcm2290_usb3phy_cfg = {
  530. .offsets = &qmp_usbc_offsets_v3_qcm2290,
  531. .serdes_tbl = qcm2290_usb3_serdes_tbl,
  532. .serdes_tbl_num = ARRAY_SIZE(qcm2290_usb3_serdes_tbl),
  533. .tx_tbl = qcm2290_usb3_tx_tbl,
  534. .tx_tbl_num = ARRAY_SIZE(qcm2290_usb3_tx_tbl),
  535. .rx_tbl = qcm2290_usb3_rx_tbl,
  536. .rx_tbl_num = ARRAY_SIZE(qcm2290_usb3_rx_tbl),
  537. .pcs_tbl = qcm2290_usb3_pcs_tbl,
  538. .pcs_tbl_num = ARRAY_SIZE(qcm2290_usb3_pcs_tbl),
  539. .reset_list = usb3phy_reset_l,
  540. .num_resets = ARRAY_SIZE(usb3phy_reset_l),
  541. .vreg_list = qmp_phy_sm2290_vreg_l,
  542. .num_vregs = ARRAY_SIZE(qmp_phy_sm2290_vreg_l),
  543. .regs = qmp_v3_usb3phy_regs_layout_qcm2290,
  544. };
  545. static const struct qmp_phy_cfg sdm660_usb3phy_cfg = {
  546. .offsets = &qmp_usbc_offsets_v3_qcm2290,
  547. .serdes_tbl = qcm2290_usb3_serdes_tbl,
  548. .serdes_tbl_num = ARRAY_SIZE(qcm2290_usb3_serdes_tbl),
  549. .tx_tbl = qcm2290_usb3_tx_tbl,
  550. .tx_tbl_num = ARRAY_SIZE(qcm2290_usb3_tx_tbl),
  551. .rx_tbl = sdm660_usb3_rx_tbl,
  552. .rx_tbl_num = ARRAY_SIZE(sdm660_usb3_rx_tbl),
  553. .pcs_tbl = qcm2290_usb3_pcs_tbl,
  554. .pcs_tbl_num = ARRAY_SIZE(qcm2290_usb3_pcs_tbl),
  555. .reset_list = usb3phy_reset_l,
  556. .num_resets = ARRAY_SIZE(usb3phy_reset_l),
  557. .vreg_list = qmp_phy_msm8998_vreg_l,
  558. .num_vregs = ARRAY_SIZE(qmp_phy_msm8998_vreg_l),
  559. .regs = qmp_v3_usb3phy_regs_layout_qcm2290,
  560. };
  561. static const struct qmp_phy_cfg qcs615_usb3phy_cfg = {
  562. .offsets = &qmp_usbc_offsets_v3_qcm2290,
  563. .serdes_tbl = qcm2290_usb3_serdes_tbl,
  564. .serdes_tbl_num = ARRAY_SIZE(qcm2290_usb3_serdes_tbl),
  565. .tx_tbl = qcm2290_usb3_tx_tbl,
  566. .tx_tbl_num = ARRAY_SIZE(qcm2290_usb3_tx_tbl),
  567. .rx_tbl = qcm2290_usb3_rx_tbl,
  568. .rx_tbl_num = ARRAY_SIZE(qcm2290_usb3_rx_tbl),
  569. .pcs_tbl = qcm2290_usb3_pcs_tbl,
  570. .pcs_tbl_num = ARRAY_SIZE(qcm2290_usb3_pcs_tbl),
  571. .reset_list = usb3phy_reset_l,
  572. .num_resets = ARRAY_SIZE(usb3phy_reset_l),
  573. .vreg_list = qmp_phy_qcs615_vreg_l,
  574. .num_vregs = ARRAY_SIZE(qmp_phy_qcs615_vreg_l),
  575. .regs = qmp_v3_usb3phy_regs_layout_qcm2290,
  576. };
  577. static void qmp_v2_dp_aux_init(struct qmp_usbc *qmp);
  578. static void qmp_v2_configure_dp_tx(struct qmp_usbc *qmp);
  579. static int qmp_v2_configure_dp_phy(struct qmp_usbc *qmp);
  580. static int qmp_v2_calibrate_dp_phy(struct qmp_usbc *qmp);
  581. static const struct qmp_phy_cfg qcs615_usb3dp_phy_cfg = {
  582. .offsets = &qmp_usbc_usb3dp_offsets_qcs615,
  583. .serdes_tbl = qcm2290_usb3_serdes_tbl,
  584. .serdes_tbl_num = ARRAY_SIZE(qcm2290_usb3_serdes_tbl),
  585. .tx_tbl = qcm2290_usb3_tx_tbl,
  586. .tx_tbl_num = ARRAY_SIZE(qcm2290_usb3_tx_tbl),
  587. .rx_tbl = qcm2290_usb3_rx_tbl,
  588. .rx_tbl_num = ARRAY_SIZE(qcm2290_usb3_rx_tbl),
  589. .pcs_tbl = qcm2290_usb3_pcs_tbl,
  590. .pcs_tbl_num = ARRAY_SIZE(qcm2290_usb3_pcs_tbl),
  591. .regs = qmp_v3_usb3phy_regs_layout_qcm2290,
  592. .dp_serdes_tbl = qmp_v2_dp_serdes_tbl,
  593. .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v2_dp_serdes_tbl),
  594. .dp_tx_tbl = qmp_v2_dp_tx_tbl,
  595. .dp_tx_tbl_num = ARRAY_SIZE(qmp_v2_dp_tx_tbl),
  596. .serdes_tbl_rbr = qmp_v2_dp_serdes_tbl_rbr,
  597. .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v2_dp_serdes_tbl_rbr),
  598. .serdes_tbl_hbr = qmp_v2_dp_serdes_tbl_hbr,
  599. .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v2_dp_serdes_tbl_hbr),
  600. .serdes_tbl_hbr2 = qmp_v2_dp_serdes_tbl_hbr2,
  601. .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v2_dp_serdes_tbl_hbr2),
  602. .swing_tbl = &qmp_v2_dp_voltage_swing_hbr2_rbr,
  603. .pre_emphasis_tbl = &qmp_v2_dp_pre_emphasis_hbr2_rbr,
  604. .dp_aux_init = qmp_v2_dp_aux_init,
  605. .configure_dp_tx = qmp_v2_configure_dp_tx,
  606. .configure_dp_phy = qmp_v2_configure_dp_phy,
  607. .calibrate_dp_phy = qmp_v2_calibrate_dp_phy,
  608. .reset_list = usb3dpphy_reset_l,
  609. .num_resets = ARRAY_SIZE(usb3dpphy_reset_l),
  610. .vreg_list = qmp_phy_qcs615_vreg_l,
  611. .num_vregs = ARRAY_SIZE(qmp_phy_qcs615_vreg_l),
  612. };
  613. static void qmp_usbc_set_phy_mode(struct qmp_usbc *qmp, bool is_dp)
  614. {
  615. if (qmp->tcsr_map && qmp->dp_phy_mode_reg)
  616. regmap_write(qmp->tcsr_map, qmp->dp_phy_mode_reg, is_dp);
  617. }
  618. static int qmp_usbc_com_init(struct phy *phy)
  619. {
  620. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  621. const struct qmp_phy_cfg *cfg = qmp->cfg;
  622. int ret;
  623. ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
  624. if (ret) {
  625. dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
  626. return ret;
  627. }
  628. ret = reset_control_bulk_assert(qmp->num_resets, qmp->resets);
  629. if (ret) {
  630. dev_err(qmp->dev, "reset assert failed\n");
  631. goto err_disable_regulators;
  632. }
  633. ret = reset_control_bulk_deassert(qmp->num_resets, qmp->resets);
  634. if (ret) {
  635. dev_err(qmp->dev, "reset deassert failed\n");
  636. goto err_disable_regulators;
  637. }
  638. ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks);
  639. if (ret)
  640. goto err_assert_reset;
  641. return 0;
  642. err_assert_reset:
  643. reset_control_bulk_assert(qmp->num_resets, qmp->resets);
  644. err_disable_regulators:
  645. regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
  646. return ret;
  647. }
  648. static int qmp_usbc_com_exit(struct phy *phy)
  649. {
  650. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  651. const struct qmp_phy_cfg *cfg = qmp->cfg;
  652. reset_control_bulk_assert(qmp->num_resets, qmp->resets);
  653. clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
  654. regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
  655. return 0;
  656. }
  657. static void qmp_v2_dp_aux_init(struct qmp_usbc *qmp)
  658. {
  659. writel(DP_PHY_PD_CTL_AUX_PWRDN |
  660. DP_PHY_PD_CTL_LANE_0_1_PWRDN | DP_PHY_PD_CTL_LANE_2_3_PWRDN |
  661. DP_PHY_PD_CTL_PLL_PWRDN,
  662. qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
  663. writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
  664. DP_PHY_PD_CTL_LANE_0_1_PWRDN | DP_PHY_PD_CTL_LANE_2_3_PWRDN |
  665. DP_PHY_PD_CTL_PLL_PWRDN,
  666. qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
  667. writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
  668. writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
  669. writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
  670. writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
  671. writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
  672. writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
  673. writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
  674. writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
  675. writel(0xbb, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
  676. writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
  677. qmp->dp_aux_cfg = 0;
  678. writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
  679. PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
  680. PHY_AUX_REQ_ERR_MASK,
  681. qmp->dp_dp_phy + QSERDES_V2_DP_PHY_AUX_INTERRUPT_MASK);
  682. }
  683. static int qmp_v2_configure_dp_swing(struct qmp_usbc *qmp)
  684. {
  685. const struct qmp_phy_cfg *cfg = qmp->cfg;
  686. const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
  687. void __iomem *tx = qmp->dp_tx;
  688. void __iomem *tx2 = qmp->dp_tx2;
  689. unsigned int v_level = 0, p_level = 0;
  690. u8 voltage_swing_cfg, pre_emphasis_cfg;
  691. int i;
  692. if (dp_opts->lanes > 4) {
  693. dev_err(qmp->dev, "Invalid lane_num(%d)\n", dp_opts->lanes);
  694. return -EINVAL;
  695. }
  696. for (i = 0; i < dp_opts->lanes; i++) {
  697. v_level = max(v_level, dp_opts->voltage[i]);
  698. p_level = max(p_level, dp_opts->pre[i]);
  699. }
  700. if (v_level > 4 || p_level > 4) {
  701. dev_err(qmp->dev, "Invalid v(%d) | p(%d) level)\n",
  702. v_level, p_level);
  703. return -EINVAL;
  704. }
  705. voltage_swing_cfg = (*cfg->swing_tbl)[v_level][p_level];
  706. pre_emphasis_cfg = (*cfg->pre_emphasis_tbl)[v_level][p_level];
  707. voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN;
  708. pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN;
  709. if (voltage_swing_cfg == 0xff && pre_emphasis_cfg == 0xff)
  710. return -EINVAL;
  711. writel(voltage_swing_cfg, tx + QSERDES_V2_TX_TX_DRV_LVL);
  712. writel(pre_emphasis_cfg, tx + QSERDES_V2_TX_TX_EMP_POST1_LVL);
  713. writel(voltage_swing_cfg, tx2 + QSERDES_V2_TX_TX_DRV_LVL);
  714. writel(pre_emphasis_cfg, tx2 + QSERDES_V2_TX_TX_EMP_POST1_LVL);
  715. return 0;
  716. }
  717. static void qmp_usbc_configure_dp_mode(struct qmp_usbc *qmp)
  718. {
  719. bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE);
  720. u32 val;
  721. val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
  722. DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_LANE_0_1_PWRDN | DP_PHY_PD_CTL_LANE_2_3_PWRDN;
  723. writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
  724. if (reverse)
  725. writel(0xc9, qmp->dp_dp_phy + QSERDES_DP_PHY_MODE);
  726. else
  727. writel(0xd9, qmp->dp_dp_phy + QSERDES_DP_PHY_MODE);
  728. }
  729. static int qmp_usbc_configure_dp_clocks(struct qmp_usbc *qmp)
  730. {
  731. const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
  732. u32 phy_vco_div;
  733. unsigned long pixel_freq;
  734. switch (dp_opts->link_rate) {
  735. case 1620:
  736. phy_vco_div = 0x1;
  737. pixel_freq = 1620000000UL / 2;
  738. break;
  739. case 2700:
  740. phy_vco_div = 0x1;
  741. pixel_freq = 2700000000UL / 2;
  742. break;
  743. case 5400:
  744. phy_vco_div = 0x2;
  745. pixel_freq = 5400000000UL / 4;
  746. break;
  747. default:
  748. dev_err(qmp->dev, "link rate:%d not supported\n", dp_opts->link_rate);
  749. return -EINVAL;
  750. }
  751. writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V2_DP_PHY_VCO_DIV);
  752. clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000);
  753. clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq);
  754. return 0;
  755. }
  756. static void qmp_v2_configure_dp_tx(struct qmp_usbc *qmp)
  757. {
  758. const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
  759. void __iomem *tx = qmp->dp_tx;
  760. void __iomem *tx2 = qmp->dp_tx2;
  761. /* program default setting first */
  762. writel(0x2a, tx + QSERDES_V2_TX_TX_DRV_LVL);
  763. writel(0x20, tx + QSERDES_V2_TX_TX_EMP_POST1_LVL);
  764. writel(0x2a, tx2 + QSERDES_V2_TX_TX_DRV_LVL);
  765. writel(0x20, tx2 + QSERDES_V2_TX_TX_EMP_POST1_LVL);
  766. if (dp_opts->link_rate >= 2700) {
  767. writel(0xc4, tx + QSERDES_V2_TX_LANE_MODE_1);
  768. writel(0xc4, tx2 + QSERDES_V2_TX_LANE_MODE_1);
  769. } else {
  770. writel(0xc6, tx + QSERDES_V2_TX_LANE_MODE_1);
  771. writel(0xc6, tx2 + QSERDES_V2_TX_LANE_MODE_1);
  772. }
  773. qmp_v2_configure_dp_swing(qmp);
  774. }
  775. static int qmp_v2_configure_dp_phy(struct qmp_usbc *qmp)
  776. {
  777. u32 status;
  778. int ret;
  779. qmp_usbc_configure_dp_mode(qmp);
  780. writel(0x05, qmp->dp_dp_phy + QSERDES_V2_DP_PHY_TX0_TX1_LANE_CTL);
  781. writel(0x05, qmp->dp_dp_phy + QSERDES_V2_DP_PHY_TX2_TX3_LANE_CTL);
  782. ret = qmp_usbc_configure_dp_clocks(qmp);
  783. if (ret)
  784. return ret;
  785. writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
  786. writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
  787. writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
  788. writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
  789. writel(0x20, qmp->dp_serdes + QSERDES_COM_RESETSM_CNTRL);
  790. if (readl_poll_timeout(qmp->dp_serdes + QSERDES_COM_C_READY_STATUS,
  791. status,
  792. ((status & BIT(0)) > 0),
  793. 500,
  794. 10000)) {
  795. dev_err(qmp->dev, "C_READY not ready\n");
  796. return -ETIMEDOUT;
  797. }
  798. if (readl_poll_timeout(qmp->dp_serdes + QSERDES_COM_CMN_STATUS,
  799. status,
  800. ((status & BIT(0)) > 0),
  801. 500,
  802. 10000)){
  803. dev_err(qmp->dev, "FREQ_DONE not ready\n");
  804. return -ETIMEDOUT;
  805. }
  806. if (readl_poll_timeout(qmp->dp_serdes + QSERDES_COM_CMN_STATUS,
  807. status,
  808. ((status & BIT(1)) > 0),
  809. 500,
  810. 10000)){
  811. dev_err(qmp->dev, "PLL_LOCKED not ready\n");
  812. return -ETIMEDOUT;
  813. }
  814. writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
  815. if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V2_DP_PHY_STATUS,
  816. status,
  817. ((status & BIT(0)) > 0),
  818. 500,
  819. 10000)){
  820. dev_err(qmp->dev, "TSYNC_DONE not ready\n");
  821. return -ETIMEDOUT;
  822. }
  823. if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V2_DP_PHY_STATUS,
  824. status,
  825. ((status & BIT(1)) > 0),
  826. 500,
  827. 10000)){
  828. dev_err(qmp->dev, "PHY_READY not ready\n");
  829. return -ETIMEDOUT;
  830. }
  831. writel(0x3f, qmp->dp_tx + QSERDES_V2_TX_TRANSCEIVER_BIAS_EN);
  832. writel(0x10, qmp->dp_tx + QSERDES_V2_TX_HIGHZ_DRVR_EN);
  833. writel(0x0a, qmp->dp_tx + QSERDES_V2_TX_TX_POL_INV);
  834. writel(0x3f, qmp->dp_tx2 + QSERDES_V2_TX_TRANSCEIVER_BIAS_EN);
  835. writel(0x10, qmp->dp_tx2 + QSERDES_V2_TX_HIGHZ_DRVR_EN);
  836. writel(0x0a, qmp->dp_tx2 + QSERDES_V2_TX_TX_POL_INV);
  837. writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
  838. writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
  839. if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V2_DP_PHY_STATUS,
  840. status,
  841. ((status & BIT(1)) > 0),
  842. 500,
  843. 10000)){
  844. dev_err(qmp->dev, "PHY_READY not ready\n");
  845. return -ETIMEDOUT;
  846. }
  847. return 0;
  848. }
  849. static int qmp_v2_calibrate_dp_phy(struct qmp_usbc *qmp)
  850. {
  851. static const u8 cfg1_settings[] = {0x13, 0x23, 0x1d};
  852. u8 val;
  853. qmp->dp_aux_cfg++;
  854. qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
  855. val = cfg1_settings[qmp->dp_aux_cfg];
  856. writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
  857. return 0;
  858. }
  859. static int qmp_usbc_usb_power_on(struct phy *phy)
  860. {
  861. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  862. const struct qmp_phy_cfg *cfg = qmp->cfg;
  863. void __iomem *status;
  864. unsigned int val;
  865. int ret;
  866. qphy_setbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], SW_PWRDN);
  867. /* Use software based port select and switch on typec orientation */
  868. val = SW_PORTSELECT_MUX;
  869. if (qmp->orientation == TYPEC_ORIENTATION_REVERSE)
  870. val |= SW_PORTSELECT_VAL;
  871. writel(val, qmp->pcs_misc);
  872. qmp_configure(qmp->dev, qmp->serdes, cfg->serdes_tbl,
  873. cfg->serdes_tbl_num);
  874. ret = clk_prepare_enable(qmp->pipe_clk);
  875. if (ret) {
  876. dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret);
  877. return ret;
  878. }
  879. /* Tx, Rx, and PCS configurations */
  880. qmp_configure_lane(qmp->dev, qmp->tx, cfg->tx_tbl, cfg->tx_tbl_num, 1);
  881. qmp_configure_lane(qmp->dev, qmp->rx, cfg->rx_tbl, cfg->rx_tbl_num, 1);
  882. qmp_configure_lane(qmp->dev, qmp->tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2);
  883. qmp_configure_lane(qmp->dev, qmp->rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2);
  884. qmp_configure(qmp->dev, qmp->pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
  885. /* Pull PHY out of reset state */
  886. qphy_clrbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
  887. /* start SerDes and Phy-Coding-Sublayer */
  888. qphy_setbits(qmp->pcs, cfg->regs[QPHY_START_CTRL], SERDES_START | PCS_START);
  889. status = qmp->pcs + cfg->regs[QPHY_PCS_STATUS];
  890. ret = readl_poll_timeout(status, val, !(val & PHYSTATUS), 200,
  891. PHY_INIT_COMPLETE_TIMEOUT);
  892. if (ret) {
  893. dev_err(qmp->dev, "phy initialization timed-out\n");
  894. goto err_disable_pipe_clk;
  895. }
  896. return 0;
  897. err_disable_pipe_clk:
  898. clk_disable_unprepare(qmp->pipe_clk);
  899. return ret;
  900. }
  901. static int qmp_usbc_usb_power_off(struct phy *phy)
  902. {
  903. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  904. const struct qmp_phy_cfg *cfg = qmp->cfg;
  905. clk_disable_unprepare(qmp->pipe_clk);
  906. /* PHY reset */
  907. qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
  908. /* stop SerDes and Phy-Coding-Sublayer */
  909. qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL],
  910. SERDES_START | PCS_START);
  911. /* Put PHY into POWER DOWN state: active low */
  912. qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
  913. SW_PWRDN);
  914. return 0;
  915. }
  916. static int qmp_usbc_check_phy_status(struct qmp_usbc *qmp, bool is_dp)
  917. {
  918. if ((is_dp && qmp->usb_init_count) ||
  919. (!is_dp && qmp->dp_init_count)) {
  920. dev_err(qmp->dev,
  921. "PHY is configured for %s, can not enable %s\n",
  922. is_dp ? "USB" : "DP", is_dp ? "DP" : "USB");
  923. return -EBUSY;
  924. }
  925. return 0;
  926. }
  927. static int qmp_usbc_usb_enable(struct phy *phy)
  928. {
  929. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  930. int ret;
  931. mutex_lock(&qmp->phy_mutex);
  932. ret = qmp_usbc_check_phy_status(qmp, false);
  933. if (ret)
  934. goto out_unlock;
  935. ret = qmp_usbc_com_init(phy);
  936. if (ret)
  937. goto out_unlock;
  938. qmp_usbc_set_phy_mode(qmp, false);
  939. ret = qmp_usbc_usb_power_on(phy);
  940. if (ret) {
  941. qmp_usbc_com_exit(phy);
  942. goto out_unlock;
  943. }
  944. qmp->usb_init_count++;
  945. out_unlock:
  946. mutex_unlock(&qmp->phy_mutex);
  947. return ret;
  948. }
  949. static int qmp_usbc_usb_disable(struct phy *phy)
  950. {
  951. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  952. int ret;
  953. qmp->usb_init_count--;
  954. ret = qmp_usbc_usb_power_off(phy);
  955. if (ret)
  956. return ret;
  957. return qmp_usbc_com_exit(phy);
  958. }
  959. static int qmp_usbc_usb_set_mode(struct phy *phy, enum phy_mode mode, int submode)
  960. {
  961. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  962. qmp->mode = mode;
  963. return 0;
  964. }
  965. static int qmp_usbc_dp_enable(struct phy *phy)
  966. {
  967. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  968. const struct qmp_phy_cfg *cfg = qmp->cfg;
  969. int ret;
  970. if (qmp->dp_init_count) {
  971. dev_err(qmp->dev, "DP already inited\n");
  972. return 0;
  973. }
  974. mutex_lock(&qmp->phy_mutex);
  975. ret = qmp_usbc_check_phy_status(qmp, true);
  976. if (ret)
  977. goto dp_init_unlock;
  978. ret = qmp_usbc_com_init(phy);
  979. if (ret)
  980. goto dp_init_unlock;
  981. qmp_usbc_set_phy_mode(qmp, true);
  982. cfg->dp_aux_init(qmp);
  983. qmp->dp_init_count++;
  984. dp_init_unlock:
  985. mutex_unlock(&qmp->phy_mutex);
  986. return ret;
  987. }
  988. static int qmp_usbc_dp_disable(struct phy *phy)
  989. {
  990. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  991. mutex_lock(&qmp->phy_mutex);
  992. qmp_usbc_com_exit(phy);
  993. qmp->dp_init_count--;
  994. mutex_unlock(&qmp->phy_mutex);
  995. return 0;
  996. }
  997. static int qmp_usbc_dp_configure(struct phy *phy, union phy_configure_opts *opts)
  998. {
  999. const struct phy_configure_opts_dp *dp_opts = &opts->dp;
  1000. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  1001. const struct qmp_phy_cfg *cfg = qmp->cfg;
  1002. mutex_lock(&qmp->phy_mutex);
  1003. memcpy(&qmp->dp_opts, dp_opts, sizeof(*dp_opts));
  1004. if (qmp->dp_opts.set_voltages) {
  1005. cfg->configure_dp_tx(qmp);
  1006. qmp->dp_opts.set_voltages = 0;
  1007. }
  1008. mutex_unlock(&qmp->phy_mutex);
  1009. return 0;
  1010. }
  1011. static int qmp_usbc_dp_calibrate(struct phy *phy)
  1012. {
  1013. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  1014. const struct qmp_phy_cfg *cfg = qmp->cfg;
  1015. int ret = 0;
  1016. mutex_lock(&qmp->phy_mutex);
  1017. if (cfg->calibrate_dp_phy) {
  1018. ret = cfg->calibrate_dp_phy(qmp);
  1019. if (ret) {
  1020. dev_err(qmp->dev, "dp calibrate err(%d)\n", ret);
  1021. mutex_unlock(&qmp->phy_mutex);
  1022. return ret;
  1023. }
  1024. }
  1025. mutex_unlock(&qmp->phy_mutex);
  1026. return 0;
  1027. }
  1028. static int qmp_usbc_dp_serdes_init(struct qmp_usbc *qmp)
  1029. {
  1030. const struct qmp_phy_cfg *cfg = qmp->cfg;
  1031. void __iomem *serdes = qmp->dp_serdes;
  1032. const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
  1033. qmp_configure(qmp->dev, serdes, cfg->dp_serdes_tbl,
  1034. cfg->dp_serdes_tbl_num);
  1035. switch (dp_opts->link_rate) {
  1036. case 1620:
  1037. qmp_configure(qmp->dev, serdes, cfg->serdes_tbl_rbr,
  1038. cfg->serdes_tbl_rbr_num);
  1039. break;
  1040. case 2700:
  1041. qmp_configure(qmp->dev, serdes, cfg->serdes_tbl_hbr,
  1042. cfg->serdes_tbl_hbr_num);
  1043. break;
  1044. case 5400:
  1045. qmp_configure(qmp->dev, serdes, cfg->serdes_tbl_hbr2,
  1046. cfg->serdes_tbl_hbr2_num);
  1047. break;
  1048. default:
  1049. /* Other link rates aren't supported */
  1050. return -EINVAL;
  1051. }
  1052. return 0;
  1053. }
  1054. static int qmp_usbc_dp_power_on(struct phy *phy)
  1055. {
  1056. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  1057. const struct qmp_phy_cfg *cfg = qmp->cfg;
  1058. void __iomem *tx = qmp->dp_tx;
  1059. void __iomem *tx2 = qmp->dp_tx2;
  1060. /*
  1061. * FIXME: SW_PORTSELECT handling for DP orientation flip is not implemented.
  1062. * Expected:
  1063. * - For standard lane mapping: configure SW_PORTSELECT in QSERDES_DP_PHY_CFG_1.
  1064. * - For non-standard mapping: pass orientation to dp_ctrl and handle flip
  1065. * via logical2physical lane remapping.
  1066. */
  1067. mutex_lock(&qmp->phy_mutex);
  1068. qmp_usbc_dp_serdes_init(qmp);
  1069. qmp_configure_lane(qmp->dev, tx, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 1);
  1070. qmp_configure_lane(qmp->dev, tx2, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 2);
  1071. /* Configure special DP tx tunings */
  1072. cfg->configure_dp_tx(qmp);
  1073. /* Configure link rate, swing, etc. */
  1074. cfg->configure_dp_phy(qmp);
  1075. mutex_unlock(&qmp->phy_mutex);
  1076. return 0;
  1077. }
  1078. static int qmp_usbc_dp_power_off(struct phy *phy)
  1079. {
  1080. struct qmp_usbc *qmp = phy_get_drvdata(phy);
  1081. mutex_lock(&qmp->phy_mutex);
  1082. /* Assert DP PHY power down */
  1083. writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
  1084. mutex_unlock(&qmp->phy_mutex);
  1085. return 0;
  1086. }
  1087. static const struct phy_ops qmp_usbc_usb_phy_ops = {
  1088. .init = qmp_usbc_usb_enable,
  1089. .exit = qmp_usbc_usb_disable,
  1090. .set_mode = qmp_usbc_usb_set_mode,
  1091. .owner = THIS_MODULE,
  1092. };
  1093. static const struct phy_ops qmp_usbc_dp_phy_ops = {
  1094. .init = qmp_usbc_dp_enable,
  1095. .exit = qmp_usbc_dp_disable,
  1096. .configure = qmp_usbc_dp_configure,
  1097. .calibrate = qmp_usbc_dp_calibrate,
  1098. .power_on = qmp_usbc_dp_power_on,
  1099. .power_off = qmp_usbc_dp_power_off,
  1100. .owner = THIS_MODULE,
  1101. };
  1102. static void qmp_usbc_enable_autonomous_mode(struct qmp_usbc *qmp)
  1103. {
  1104. const struct qmp_phy_cfg *cfg = qmp->cfg;
  1105. void __iomem *pcs = qmp->pcs;
  1106. u32 intr_mask;
  1107. if (qmp->mode == PHY_MODE_USB_HOST_SS ||
  1108. qmp->mode == PHY_MODE_USB_DEVICE_SS)
  1109. intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN;
  1110. else
  1111. intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL;
  1112. /* Clear any pending interrupts status */
  1113. qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
  1114. /* Writing 1 followed by 0 clears the interrupt */
  1115. qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
  1116. qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
  1117. ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL);
  1118. /* Enable required PHY autonomous mode interrupts */
  1119. qphy_setbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask);
  1120. /* Enable i/o clamp_n for autonomous mode */
  1121. if (qmp->tcsr_map && qmp->vls_clamp_reg)
  1122. regmap_write(qmp->tcsr_map, qmp->vls_clamp_reg, 1);
  1123. }
  1124. static void qmp_usbc_disable_autonomous_mode(struct qmp_usbc *qmp)
  1125. {
  1126. const struct qmp_phy_cfg *cfg = qmp->cfg;
  1127. void __iomem *pcs = qmp->pcs;
  1128. /* Disable i/o clamp_n on resume for normal mode */
  1129. if (qmp->tcsr_map && qmp->vls_clamp_reg)
  1130. regmap_write(qmp->tcsr_map, qmp->vls_clamp_reg, 0);
  1131. qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
  1132. ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN);
  1133. qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
  1134. /* Writing 1 followed by 0 clears the interrupt */
  1135. qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
  1136. }
  1137. static int __maybe_unused qmp_usbc_runtime_suspend(struct device *dev)
  1138. {
  1139. struct qmp_usbc *qmp = dev_get_drvdata(dev);
  1140. dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qmp->mode);
  1141. if (!qmp->usb_init_count && !qmp->dp_init_count) {
  1142. dev_vdbg(dev, "PHY not initialized, bailing out\n");
  1143. return 0;
  1144. }
  1145. qmp_usbc_enable_autonomous_mode(qmp);
  1146. clk_disable_unprepare(qmp->pipe_clk);
  1147. clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
  1148. return 0;
  1149. }
  1150. static int __maybe_unused qmp_usbc_runtime_resume(struct device *dev)
  1151. {
  1152. struct qmp_usbc *qmp = dev_get_drvdata(dev);
  1153. int ret = 0;
  1154. dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qmp->mode);
  1155. if (!qmp->usb_init_count && !qmp->dp_init_count) {
  1156. dev_vdbg(dev, "PHY not initialized, bailing out\n");
  1157. return 0;
  1158. }
  1159. ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks);
  1160. if (ret)
  1161. return ret;
  1162. ret = clk_prepare_enable(qmp->pipe_clk);
  1163. if (ret) {
  1164. dev_err(dev, "pipe_clk enable failed, err=%d\n", ret);
  1165. clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
  1166. return ret;
  1167. }
  1168. qmp_usbc_disable_autonomous_mode(qmp);
  1169. return 0;
  1170. }
  1171. static const struct dev_pm_ops qmp_usbc_pm_ops = {
  1172. SET_RUNTIME_PM_OPS(qmp_usbc_runtime_suspend,
  1173. qmp_usbc_runtime_resume, NULL)
  1174. };
  1175. static int qmp_usbc_reset_init(struct qmp_usbc *qmp,
  1176. const char *const *reset_list,
  1177. int num_resets)
  1178. {
  1179. struct device *dev = qmp->dev;
  1180. int i;
  1181. int ret;
  1182. qmp->resets = devm_kcalloc(dev, num_resets,
  1183. sizeof(*qmp->resets), GFP_KERNEL);
  1184. if (!qmp->resets)
  1185. return -ENOMEM;
  1186. for (i = 0; i < num_resets; i++)
  1187. qmp->resets[i].id = reset_list[i];
  1188. qmp->num_resets = num_resets;
  1189. ret = devm_reset_control_bulk_get_exclusive(dev, num_resets, qmp->resets);
  1190. if (ret)
  1191. return dev_err_probe(dev, ret, "failed to get resets\n");
  1192. return 0;
  1193. }
  1194. static int qmp_usbc_clk_init(struct qmp_usbc *qmp)
  1195. {
  1196. struct device *dev = qmp->dev;
  1197. int num = ARRAY_SIZE(qmp_usbc_phy_clk_l);
  1198. int i;
  1199. qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
  1200. if (!qmp->clks)
  1201. return -ENOMEM;
  1202. for (i = 0; i < num; i++)
  1203. qmp->clks[i].id = qmp_usbc_phy_clk_l[i];
  1204. qmp->num_clks = num;
  1205. return devm_clk_bulk_get_optional(dev, num, qmp->clks);
  1206. }
  1207. static struct clk_hw *qmp_usbc_clks_hw_get(struct of_phandle_args *clkspec, void *data)
  1208. {
  1209. struct qmp_usbc *qmp = data;
  1210. if (clkspec->args_count == 0)
  1211. return &qmp->pipe_clk_fixed.hw;
  1212. switch (clkspec->args[0]) {
  1213. case QMP_USB43DP_USB3_PIPE_CLK:
  1214. return &qmp->pipe_clk_fixed.hw;
  1215. case QMP_USB43DP_DP_LINK_CLK:
  1216. return &qmp->dp_link_hw;
  1217. case QMP_USB43DP_DP_VCO_DIV_CLK:
  1218. return &qmp->dp_pixel_hw;
  1219. }
  1220. return ERR_PTR(-EINVAL);
  1221. }
  1222. /*
  1223. * Register a fixed rate pipe clock.
  1224. *
  1225. * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
  1226. * controls it. The <s>_pipe_clk coming out of the GCC is requested
  1227. * by the PHY driver for its operations.
  1228. * We register the <s>_pipe_clksrc here. The gcc driver takes care
  1229. * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
  1230. * Below picture shows this relationship.
  1231. *
  1232. * +---------------+
  1233. * | PHY block |<<---------------------------------------+
  1234. * | | |
  1235. * | +-------+ | +-----+ |
  1236. * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
  1237. * clk | +-------+ | +-----+
  1238. * +---------------+
  1239. */
  1240. static int phy_pipe_clk_register(struct qmp_usbc *qmp, struct device_node *np)
  1241. {
  1242. struct clk_fixed_rate *fixed = &qmp->pipe_clk_fixed;
  1243. struct clk_init_data init = { };
  1244. char name[64];
  1245. int ret;
  1246. ret = of_property_read_string(np, "clock-output-names", &init.name);
  1247. if (ret) {
  1248. /* Clock name is not mandatory. */
  1249. snprintf(name, sizeof(name), "%s::pipe_clk", dev_name(qmp->dev));
  1250. init.name = name;
  1251. }
  1252. init.ops = &clk_fixed_rate_ops;
  1253. /* controllers using QMP phys use 125MHz pipe clock interface */
  1254. fixed->fixed_rate = 125000000;
  1255. fixed->hw.init = &init;
  1256. return devm_clk_hw_register(qmp->dev, &fixed->hw);
  1257. }
  1258. /*
  1259. * Display Port PLL driver block diagram for branch clocks
  1260. *
  1261. * +------------------------------+
  1262. * | DP_VCO_CLK |
  1263. * | |
  1264. * | +-------------------+ |
  1265. * | | (DP PLL/VCO) | |
  1266. * | +---------+---------+ |
  1267. * | v |
  1268. * | +----------+-----------+ |
  1269. * | | hsclk_divsel_clk_src | |
  1270. * | +----------+-----------+ |
  1271. * +------------------------------+
  1272. * |
  1273. * +---------<---------v------------>----------+
  1274. * | |
  1275. * +--------v----------------+ |
  1276. * | dp_phy_pll_link_clk | |
  1277. * | link_clk | |
  1278. * +--------+----------------+ |
  1279. * | |
  1280. * | |
  1281. * v v
  1282. * Input to DISPCC block |
  1283. * for link clk, crypto clk |
  1284. * and interface clock |
  1285. * |
  1286. * |
  1287. * +--------<------------+-----------------+---<---+
  1288. * | | |
  1289. * +----v---------+ +--------v-----+ +--------v------+
  1290. * | vco_divided | | vco_divided | | vco_divided |
  1291. * | _clk_src | | _clk_src | | _clk_src |
  1292. * | | | | | |
  1293. * |divsel_six | | divsel_two | | divsel_four |
  1294. * +-------+------+ +-----+--------+ +--------+------+
  1295. * | | |
  1296. * v---->----------v-------------<------v
  1297. * |
  1298. * +----------+-----------------+
  1299. * | dp_phy_pll_vco_div_clk |
  1300. * +---------+------------------+
  1301. * |
  1302. * v
  1303. * Input to DISPCC block
  1304. * for DP pixel clock
  1305. *
  1306. */
  1307. static int qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
  1308. {
  1309. switch (req->rate) {
  1310. case 1620000000UL / 2:
  1311. case 2700000000UL / 2:
  1312. /* 5.4 is same link rate as 2.7GHz, i.e. div 4 */
  1313. return 0;
  1314. default:
  1315. return -EINVAL;
  1316. }
  1317. }
  1318. static unsigned long qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
  1319. {
  1320. const struct qmp_usbc *qmp;
  1321. const struct phy_configure_opts_dp *dp_opts;
  1322. qmp = container_of(hw, struct qmp_usbc, dp_pixel_hw);
  1323. dp_opts = &qmp->dp_opts;
  1324. switch (dp_opts->link_rate) {
  1325. case 1620:
  1326. return 1620000000UL / 2;
  1327. case 2700:
  1328. return 2700000000UL / 2;
  1329. case 5400:
  1330. return 5400000000UL / 4;
  1331. default:
  1332. return 0;
  1333. }
  1334. }
  1335. static const struct clk_ops qmp_dp_pixel_clk_ops = {
  1336. .determine_rate = qmp_dp_pixel_clk_determine_rate,
  1337. .recalc_rate = qmp_dp_pixel_clk_recalc_rate,
  1338. };
  1339. static int qmp_dp_link_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
  1340. {
  1341. switch (req->rate) {
  1342. case 162000000:
  1343. case 270000000:
  1344. case 540000000:
  1345. return 0;
  1346. default:
  1347. return -EINVAL;
  1348. }
  1349. }
  1350. static unsigned long qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
  1351. {
  1352. const struct qmp_usbc *qmp;
  1353. const struct phy_configure_opts_dp *dp_opts;
  1354. qmp = container_of(hw, struct qmp_usbc, dp_link_hw);
  1355. dp_opts = &qmp->dp_opts;
  1356. switch (dp_opts->link_rate) {
  1357. case 1620:
  1358. case 2700:
  1359. case 5400:
  1360. return dp_opts->link_rate * 100000;
  1361. default:
  1362. return 0;
  1363. }
  1364. }
  1365. static const struct clk_ops qmp_dp_link_clk_ops = {
  1366. .determine_rate = qmp_dp_link_clk_determine_rate,
  1367. .recalc_rate = qmp_dp_link_clk_recalc_rate,
  1368. };
  1369. static int phy_dp_clks_register(struct qmp_usbc *qmp, struct device_node *np)
  1370. {
  1371. struct clk_init_data init = { };
  1372. char name[64];
  1373. int ret;
  1374. snprintf(name, sizeof(name), "%s::link_clk", dev_name(qmp->dev));
  1375. init.ops = &qmp_dp_link_clk_ops;
  1376. init.name = name;
  1377. qmp->dp_link_hw.init = &init;
  1378. ret = devm_clk_hw_register(qmp->dev, &qmp->dp_link_hw);
  1379. if (ret < 0) {
  1380. dev_err(qmp->dev, "link clk reg fail ret=%d\n", ret);
  1381. return ret;
  1382. }
  1383. snprintf(name, sizeof(name), "%s::vco_div_clk", dev_name(qmp->dev));
  1384. init.ops = &qmp_dp_pixel_clk_ops;
  1385. init.name = name;
  1386. qmp->dp_pixel_hw.init = &init;
  1387. ret = devm_clk_hw_register(qmp->dev, &qmp->dp_pixel_hw);
  1388. if (ret) {
  1389. dev_err(qmp->dev, "pxl clk reg fail ret=%d\n", ret);
  1390. return ret;
  1391. }
  1392. return 0;
  1393. }
  1394. static void phy_clk_release_provider(void *res)
  1395. {
  1396. of_clk_del_provider(res);
  1397. }
  1398. static int qmp_usbc_register_clocks(struct qmp_usbc *qmp, struct device_node *np)
  1399. {
  1400. struct clk_fixed_rate *fixed = &qmp->pipe_clk_fixed;
  1401. int ret;
  1402. ret = phy_pipe_clk_register(qmp, np);
  1403. if (ret)
  1404. return ret;
  1405. if (qmp->dp_serdes != 0) {
  1406. ret = phy_dp_clks_register(qmp, np);
  1407. if (ret)
  1408. return ret;
  1409. }
  1410. if (np == qmp->dev->of_node)
  1411. return devm_of_clk_add_hw_provider(qmp->dev, qmp_usbc_clks_hw_get, qmp);
  1412. ret = of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw);
  1413. if (ret)
  1414. return ret;
  1415. /*
  1416. * Roll a devm action because the clock provider is the child node, but
  1417. * the child node is not actually a device.
  1418. */
  1419. return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, np);
  1420. }
  1421. #if IS_ENABLED(CONFIG_TYPEC)
  1422. static int qmp_usbc_typec_switch_set(struct typec_switch_dev *sw,
  1423. enum typec_orientation orientation)
  1424. {
  1425. struct qmp_usbc *qmp = typec_switch_get_drvdata(sw);
  1426. if (orientation == qmp->orientation || orientation == TYPEC_ORIENTATION_NONE)
  1427. return 0;
  1428. mutex_lock(&qmp->phy_mutex);
  1429. qmp->orientation = orientation;
  1430. if (qmp->usb_init_count) {
  1431. qmp_usbc_usb_power_off(qmp->usb_phy);
  1432. qmp_usbc_com_exit(qmp->usb_phy);
  1433. qmp_usbc_com_init(qmp->usb_phy);
  1434. qmp_usbc_set_phy_mode(qmp, false);
  1435. qmp_usbc_usb_power_on(qmp->usb_phy);
  1436. }
  1437. mutex_unlock(&qmp->phy_mutex);
  1438. return 0;
  1439. }
  1440. static void qmp_usbc_typec_unregister(void *data)
  1441. {
  1442. struct qmp_usbc *qmp = data;
  1443. typec_switch_unregister(qmp->sw);
  1444. }
  1445. static int qmp_usbc_typec_switch_register(struct qmp_usbc *qmp)
  1446. {
  1447. struct typec_switch_desc sw_desc = {};
  1448. struct device *dev = qmp->dev;
  1449. sw_desc.drvdata = qmp;
  1450. sw_desc.fwnode = dev->fwnode;
  1451. sw_desc.set = qmp_usbc_typec_switch_set;
  1452. qmp->sw = typec_switch_register(dev, &sw_desc);
  1453. if (IS_ERR(qmp->sw)) {
  1454. dev_err(dev, "Unable to register typec switch: %pe\n", qmp->sw);
  1455. return PTR_ERR(qmp->sw);
  1456. }
  1457. return devm_add_action_or_reset(dev, qmp_usbc_typec_unregister, qmp);
  1458. }
  1459. #else
  1460. static int qmp_usbc_typec_switch_register(struct qmp_usbc *qmp)
  1461. {
  1462. return 0;
  1463. }
  1464. #endif
  1465. static int qmp_usbc_parse_dt_legacy(struct qmp_usbc *qmp, struct device_node *np)
  1466. {
  1467. struct platform_device *pdev = to_platform_device(qmp->dev);
  1468. struct device *dev = qmp->dev;
  1469. int ret;
  1470. qmp->serdes = devm_platform_ioremap_resource(pdev, 0);
  1471. if (IS_ERR(qmp->serdes))
  1472. return PTR_ERR(qmp->serdes);
  1473. /*
  1474. * Get memory resources for the PHY:
  1475. * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2.
  1476. * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5
  1477. * For single lane PHYs: pcs_misc (optional) -> 3.
  1478. */
  1479. qmp->tx = devm_of_iomap(dev, np, 0, NULL);
  1480. if (IS_ERR(qmp->tx))
  1481. return PTR_ERR(qmp->tx);
  1482. qmp->rx = devm_of_iomap(dev, np, 1, NULL);
  1483. if (IS_ERR(qmp->rx))
  1484. return PTR_ERR(qmp->rx);
  1485. qmp->pcs = devm_of_iomap(dev, np, 2, NULL);
  1486. if (IS_ERR(qmp->pcs))
  1487. return PTR_ERR(qmp->pcs);
  1488. qmp->tx2 = devm_of_iomap(dev, np, 3, NULL);
  1489. if (IS_ERR(qmp->tx2))
  1490. return PTR_ERR(qmp->tx2);
  1491. qmp->rx2 = devm_of_iomap(dev, np, 4, NULL);
  1492. if (IS_ERR(qmp->rx2))
  1493. return PTR_ERR(qmp->rx2);
  1494. qmp->pcs_misc = devm_of_iomap(dev, np, 5, NULL);
  1495. if (IS_ERR(qmp->pcs_misc)) {
  1496. dev_vdbg(dev, "PHY pcs_misc-reg not used\n");
  1497. qmp->pcs_misc = NULL;
  1498. }
  1499. qmp->pipe_clk = devm_get_clk_from_child(dev, np, NULL);
  1500. if (IS_ERR(qmp->pipe_clk)) {
  1501. return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk),
  1502. "failed to get pipe clock\n");
  1503. }
  1504. ret = devm_clk_bulk_get_all(qmp->dev, &qmp->clks);
  1505. if (ret < 0)
  1506. return ret;
  1507. qmp->num_clks = ret;
  1508. ret = qmp_usbc_reset_init(qmp, usb3phy_legacy_reset_l,
  1509. ARRAY_SIZE(usb3phy_legacy_reset_l));
  1510. if (ret)
  1511. return ret;
  1512. return 0;
  1513. }
  1514. static int qmp_usbc_parse_dt(struct qmp_usbc *qmp)
  1515. {
  1516. struct platform_device *pdev = to_platform_device(qmp->dev);
  1517. const struct qmp_phy_cfg *cfg = qmp->cfg;
  1518. const struct qmp_usbc_offsets *offs = cfg->offsets;
  1519. struct device *dev = qmp->dev;
  1520. void __iomem *base;
  1521. int ret;
  1522. if (!offs)
  1523. return -EINVAL;
  1524. base = devm_platform_ioremap_resource(pdev, 0);
  1525. if (IS_ERR(base))
  1526. return PTR_ERR(base);
  1527. if (offs->dp_serdes != 0) {
  1528. qmp->dp_serdes = base + offs->dp_serdes;
  1529. qmp->dp_tx = base + offs->dp_txa;
  1530. qmp->dp_tx2 = base + offs->dp_txb;
  1531. qmp->dp_dp_phy = base + offs->dp_dp_phy;
  1532. }
  1533. qmp->serdes = base + offs->serdes;
  1534. qmp->pcs = base + offs->pcs;
  1535. if (offs->pcs_misc)
  1536. qmp->pcs_misc = base + offs->pcs_misc;
  1537. qmp->tx = base + offs->tx;
  1538. qmp->rx = base + offs->rx;
  1539. qmp->tx2 = base + offs->tx2;
  1540. qmp->rx2 = base + offs->rx2;
  1541. ret = qmp_usbc_clk_init(qmp);
  1542. if (ret)
  1543. return ret;
  1544. qmp->pipe_clk = devm_clk_get(dev, "pipe");
  1545. if (IS_ERR(qmp->pipe_clk)) {
  1546. return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk),
  1547. "failed to get pipe clock\n");
  1548. }
  1549. ret = qmp_usbc_reset_init(qmp, cfg->reset_list, cfg->num_resets);
  1550. if (ret)
  1551. return ret;
  1552. return 0;
  1553. }
  1554. static int qmp_usbc_parse_tcsr(struct qmp_usbc *qmp)
  1555. {
  1556. struct of_phandle_args tcsr_args;
  1557. struct device *dev = qmp->dev;
  1558. int ret, args_count;
  1559. args_count = of_property_count_u32_elems(dev->of_node, "qcom,tcsr-reg");
  1560. args_count = args_count - 1;
  1561. ret = of_parse_phandle_with_fixed_args(dev->of_node, "qcom,tcsr-reg",
  1562. args_count, 0, &tcsr_args);
  1563. if (ret == -ENOENT)
  1564. return 0;
  1565. else if (ret < 0)
  1566. return dev_err_probe(dev, ret, "Failed to parse qcom,tcsr-reg\n");
  1567. qmp->tcsr_map = syscon_node_to_regmap(tcsr_args.np);
  1568. of_node_put(tcsr_args.np);
  1569. if (IS_ERR(qmp->tcsr_map))
  1570. return PTR_ERR(qmp->tcsr_map);
  1571. qmp->vls_clamp_reg = tcsr_args.args[0];
  1572. if (args_count > 1)
  1573. qmp->dp_phy_mode_reg = tcsr_args.args[1];
  1574. return 0;
  1575. }
  1576. static struct phy *qmp_usbc_phy_xlate(struct device *dev, const struct of_phandle_args *args)
  1577. {
  1578. struct qmp_usbc *qmp = dev_get_drvdata(dev);
  1579. if (args->args_count == 0)
  1580. return qmp->usb_phy;
  1581. switch (args->args[0]) {
  1582. case QMP_USB43DP_USB3_PHY:
  1583. return qmp->usb_phy;
  1584. case QMP_USB43DP_DP_PHY:
  1585. return qmp->dp_phy ?: ERR_PTR(-ENODEV);
  1586. }
  1587. return ERR_PTR(-EINVAL);
  1588. }
  1589. static int qmp_usbc_probe(struct platform_device *pdev)
  1590. {
  1591. struct device *dev = &pdev->dev;
  1592. struct phy_provider *phy_provider;
  1593. struct device_node *np;
  1594. struct qmp_usbc *qmp;
  1595. int ret;
  1596. qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
  1597. if (!qmp)
  1598. return -ENOMEM;
  1599. qmp->dev = dev;
  1600. dev_set_drvdata(dev, qmp);
  1601. qmp->orientation = TYPEC_ORIENTATION_NORMAL;
  1602. qmp->cfg = of_device_get_match_data(dev);
  1603. if (!qmp->cfg)
  1604. return -EINVAL;
  1605. mutex_init(&qmp->phy_mutex);
  1606. ret = devm_regulator_bulk_get_const(qmp->dev, qmp->cfg->num_vregs,
  1607. qmp->cfg->vreg_list, &qmp->vregs);
  1608. if (ret)
  1609. return ret;
  1610. ret = qmp_usbc_typec_switch_register(qmp);
  1611. if (ret)
  1612. return ret;
  1613. ret = qmp_usbc_parse_tcsr(qmp);
  1614. if (ret)
  1615. return ret;
  1616. /* Check for legacy binding with child node. */
  1617. np = of_get_child_by_name(dev->of_node, "phy");
  1618. if (np) {
  1619. ret = qmp_usbc_parse_dt_legacy(qmp, np);
  1620. } else {
  1621. np = of_node_get(dev->of_node);
  1622. ret = qmp_usbc_parse_dt(qmp);
  1623. }
  1624. if (ret)
  1625. goto err_node_put;
  1626. pm_runtime_set_active(dev);
  1627. ret = devm_pm_runtime_enable(dev);
  1628. if (ret)
  1629. goto err_node_put;
  1630. /*
  1631. * Prevent runtime pm from being ON by default. Users can enable
  1632. * it using power/control in sysfs.
  1633. */
  1634. pm_runtime_forbid(dev);
  1635. ret = qmp_usbc_register_clocks(qmp, np);
  1636. if (ret)
  1637. goto err_node_put;
  1638. qmp->usb_phy = devm_phy_create(dev, np, &qmp_usbc_usb_phy_ops);
  1639. if (IS_ERR(qmp->usb_phy)) {
  1640. ret = PTR_ERR(qmp->usb_phy);
  1641. dev_err(dev, "failed to create PHY: %d\n", ret);
  1642. goto err_node_put;
  1643. }
  1644. phy_set_drvdata(qmp->usb_phy, qmp);
  1645. if (qmp->dp_serdes != 0) {
  1646. qmp->dp_phy = devm_phy_create(dev, np, &qmp_usbc_dp_phy_ops);
  1647. if (IS_ERR(qmp->dp_phy)) {
  1648. ret = PTR_ERR(qmp->dp_phy);
  1649. dev_err(dev, "failed to create PHY: %d\n", ret);
  1650. goto err_node_put;
  1651. }
  1652. phy_set_drvdata(qmp->dp_phy, qmp);
  1653. }
  1654. of_node_put(np);
  1655. phy_provider = devm_of_phy_provider_register(dev, qmp_usbc_phy_xlate);
  1656. return PTR_ERR_OR_ZERO(phy_provider);
  1657. err_node_put:
  1658. of_node_put(np);
  1659. return ret;
  1660. }
  1661. static const struct of_device_id qmp_usbc_of_match_table[] = {
  1662. {
  1663. .compatible = "qcom,msm8998-qmp-usb3-phy",
  1664. .data = &msm8998_usb3phy_cfg,
  1665. }, {
  1666. .compatible = "qcom,qcm2290-qmp-usb3-phy",
  1667. .data = &qcm2290_usb3phy_cfg,
  1668. }, {
  1669. .compatible = "qcom,qcs615-qmp-usb3-dp-phy",
  1670. .data = &qcs615_usb3dp_phy_cfg,
  1671. }, {
  1672. .compatible = "qcom,qcs615-qmp-usb3-phy",
  1673. .data = &qcs615_usb3phy_cfg,
  1674. }, {
  1675. .compatible = "qcom,sdm660-qmp-usb3-phy",
  1676. .data = &sdm660_usb3phy_cfg,
  1677. }, {
  1678. .compatible = "qcom,sm6115-qmp-usb3-phy",
  1679. .data = &qcm2290_usb3phy_cfg,
  1680. },
  1681. { },
  1682. };
  1683. MODULE_DEVICE_TABLE(of, qmp_usbc_of_match_table);
  1684. static struct platform_driver qmp_usbc_driver = {
  1685. .probe = qmp_usbc_probe,
  1686. .driver = {
  1687. .name = "qcom-qmp-usbc-phy",
  1688. .pm = &qmp_usbc_pm_ops,
  1689. .of_match_table = qmp_usbc_of_match_table,
  1690. },
  1691. };
  1692. module_platform_driver(qmp_usbc_driver);
  1693. MODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>");
  1694. MODULE_DESCRIPTION("Qualcomm QMP USB-C PHY driver");
  1695. MODULE_LICENSE("GPL");