xusb-tegra210.c 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043
  1. /*
  2. * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
  3. * Copyright (C) 2015 Google, Inc.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. */
  14. #include <linux/clk.h>
  15. #include <linux/clk/tegra.h>
  16. #include <linux/delay.h>
  17. #include <linux/io.h>
  18. #include <linux/mailbox_client.h>
  19. #include <linux/module.h>
  20. #include <linux/of.h>
  21. #include <linux/phy/phy.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/regulator/consumer.h>
  24. #include <linux/reset.h>
  25. #include <linux/slab.h>
  26. #include <soc/tegra/fuse.h>
  27. #include "xusb.h"
  28. #define FUSE_SKU_CALIB_HS_CURR_LEVEL_PADX_SHIFT(x) \
  29. ((x) ? (11 + ((x) - 1) * 6) : 0)
  30. #define FUSE_SKU_CALIB_HS_CURR_LEVEL_PAD_MASK 0x3f
  31. #define FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_SHIFT 7
  32. #define FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_MASK 0xf
  33. #define FUSE_USB_CALIB_EXT_RPD_CTRL_SHIFT 0
  34. #define FUSE_USB_CALIB_EXT_RPD_CTRL_MASK 0x1f
  35. #define XUSB_PADCTL_USB2_PAD_MUX 0x004
  36. #define XUSB_PADCTL_USB2_PAD_MUX_HSIC_PAD_TRK_SHIFT 16
  37. #define XUSB_PADCTL_USB2_PAD_MUX_HSIC_PAD_TRK_MASK 0x3
  38. #define XUSB_PADCTL_USB2_PAD_MUX_HSIC_PAD_TRK_XUSB 0x1
  39. #define XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_SHIFT 18
  40. #define XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_MASK 0x3
  41. #define XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB 0x1
  42. #define XUSB_PADCTL_USB2_PORT_CAP 0x008
  43. #define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(x) (0x1 << ((x) * 4))
  44. #define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_MASK(x) (0x3 << ((x) * 4))
  45. #define XUSB_PADCTL_SS_PORT_MAP 0x014
  46. #define XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(x) (1 << (((x) * 5) + 4))
  47. #define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_SHIFT(x) ((x) * 5)
  48. #define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(x) (0x7 << ((x) * 5))
  49. #define XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(x, v) (((v) & 0x7) << ((x) * 5))
  50. #define XUSB_PADCTL_ELPG_PROGRAM1 0x024
  51. #define XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_VCORE_DOWN (1 << 31)
  52. #define XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 30)
  53. #define XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN (1 << 29)
  54. #define XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_VCORE_DOWN(x) (1 << (2 + (x) * 3))
  55. #define XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_CLAMP_EN_EARLY(x) \
  56. (1 << (1 + (x) * 3))
  57. #define XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_CLAMP_EN(x) (1 << ((x) * 3))
  58. #define XUSB_PADCTL_USB3_PAD_MUX 0x028
  59. #define XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(x) (1 << (1 + (x)))
  60. #define XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(x) (1 << (8 + (x)))
  61. #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(x) (0x084 + (x) * 0x40)
  62. #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT 7
  63. #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_MASK 0x3
  64. #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18 (1 << 6)
  65. #define XUSB_PADCTL_USB2_OTG_PADX_CTL0(x) (0x088 + (x) * 0x40)
  66. #define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI (1 << 29)
  67. #define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 (1 << 27)
  68. #define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD (1 << 26)
  69. #define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT 0
  70. #define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_MASK 0x3f
  71. #define XUSB_PADCTL_USB2_OTG_PADX_CTL1(x) (0x08c + (x) * 0x40)
  72. #define XUSB_PADCTL_USB2_OTG_PAD_CTL1_RPD_CTRL_SHIFT 26
  73. #define XUSB_PADCTL_USB2_OTG_PAD_CTL1_RPD_CTRL_MASK 0x1f
  74. #define XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT 3
  75. #define XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_MASK 0xf
  76. #define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR (1 << 2)
  77. #define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_OVRD (1 << 1)
  78. #define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_OVRD (1 << 0)
  79. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0 0x284
  80. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD (1 << 11)
  81. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT 3
  82. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_MASK 0x7
  83. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL 0x7
  84. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT 0
  85. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_MASK 0x7
  86. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_VAL 0x2
  87. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1 0x288
  88. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_PD_TRK (1 << 26)
  89. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER_SHIFT 19
  90. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER_MASK 0x7f
  91. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER_VAL 0x0a
  92. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_START_TIMER_SHIFT 12
  93. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_START_TIMER_MASK 0x7f
  94. #define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_START_TIMER_VAL 0x1e
  95. #define XUSB_PADCTL_HSIC_PADX_CTL0(x) (0x300 + (x) * 0x20)
  96. #define XUSB_PADCTL_HSIC_PAD_CTL0_RPU_STROBE (1 << 18)
  97. #define XUSB_PADCTL_HSIC_PAD_CTL0_RPU_DATA1 (1 << 17)
  98. #define XUSB_PADCTL_HSIC_PAD_CTL0_RPU_DATA0 (1 << 16)
  99. #define XUSB_PADCTL_HSIC_PAD_CTL0_RPD_STROBE (1 << 15)
  100. #define XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA1 (1 << 14)
  101. #define XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA0 (1 << 13)
  102. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_STROBE (1 << 9)
  103. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_DATA1 (1 << 8)
  104. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_DATA0 (1 << 7)
  105. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_STROBE (1 << 6)
  106. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_DATA1 (1 << 5)
  107. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_DATA0 (1 << 4)
  108. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_STROBE (1 << 3)
  109. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_DATA1 (1 << 2)
  110. #define XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_DATA0 (1 << 1)
  111. #define XUSB_PADCTL_HSIC_PADX_CTL1(x) (0x304 + (x) * 0x20)
  112. #define XUSB_PADCTL_HSIC_PAD_CTL1_TX_RTUNEP_SHIFT 0
  113. #define XUSB_PADCTL_HSIC_PAD_CTL1_TX_RTUNEP_MASK 0xf
  114. #define XUSB_PADCTL_HSIC_PADX_CTL2(x) (0x308 + (x) * 0x20)
  115. #define XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT 8
  116. #define XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_MASK 0xf
  117. #define XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT 0
  118. #define XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_MASK 0xff
  119. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL 0x340
  120. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL_PD_TRK (1 << 19)
  121. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER_SHIFT 12
  122. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER_MASK 0x7f
  123. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER_VAL 0x0a
  124. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_START_TIMER_SHIFT 5
  125. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_START_TIMER_MASK 0x7f
  126. #define XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_START_TIMER_VAL 0x1e
  127. #define XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL 0x344
  128. #define XUSB_PADCTL_UPHY_PLL_P0_CTL1 0x360
  129. #define XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SHIFT 20
  130. #define XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_MASK 0xff
  131. #define XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_USB_VAL 0x19
  132. #define XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SATA_VAL 0x1e
  133. #define XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_MDIV_SHIFT 16
  134. #define XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_MDIV_MASK 0x3
  135. #define XUSB_PADCTL_UPHY_PLL_CTL1_LOCKDET_STATUS (1 << 15)
  136. #define XUSB_PADCTL_UPHY_PLL_CTL1_PWR_OVRD (1 << 4)
  137. #define XUSB_PADCTL_UPHY_PLL_CTL1_ENABLE (1 << 3)
  138. #define XUSB_PADCTL_UPHY_PLL_CTL1_SLEEP_SHIFT 1
  139. #define XUSB_PADCTL_UPHY_PLL_CTL1_SLEEP_MASK 0x3
  140. #define XUSB_PADCTL_UPHY_PLL_CTL1_IDDQ (1 << 0)
  141. #define XUSB_PADCTL_UPHY_PLL_P0_CTL2 0x364
  142. #define XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_SHIFT 4
  143. #define XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_MASK 0xffffff
  144. #define XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_VAL 0x136
  145. #define XUSB_PADCTL_UPHY_PLL_CTL2_CAL_OVRD (1 << 2)
  146. #define XUSB_PADCTL_UPHY_PLL_CTL2_CAL_DONE (1 << 1)
  147. #define XUSB_PADCTL_UPHY_PLL_CTL2_CAL_EN (1 << 0)
  148. #define XUSB_PADCTL_UPHY_PLL_P0_CTL4 0x36c
  149. #define XUSB_PADCTL_UPHY_PLL_CTL4_XDIGCLK_EN (1 << 19)
  150. #define XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_EN (1 << 15)
  151. #define XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SHIFT 12
  152. #define XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_MASK 0x3
  153. #define XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_USB_VAL 0x2
  154. #define XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SATA_VAL 0x0
  155. #define XUSB_PADCTL_UPHY_PLL_CTL4_REFCLKBUF_EN (1 << 8)
  156. #define XUSB_PADCTL_UPHY_PLL_CTL4_REFCLK_SEL_SHIFT 4
  157. #define XUSB_PADCTL_UPHY_PLL_CTL4_REFCLK_SEL_MASK 0xf
  158. #define XUSB_PADCTL_UPHY_PLL_P0_CTL5 0x370
  159. #define XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_SHIFT 16
  160. #define XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_MASK 0xff
  161. #define XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_VAL 0x2a
  162. #define XUSB_PADCTL_UPHY_PLL_P0_CTL8 0x37c
  163. #define XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_DONE (1 << 31)
  164. #define XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_OVRD (1 << 15)
  165. #define XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_CLK_EN (1 << 13)
  166. #define XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_EN (1 << 12)
  167. #define XUSB_PADCTL_UPHY_MISC_PAD_PX_CTL1(x) (0x460 + (x) * 0x40)
  168. #define XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_IDLE_MODE_SHIFT 20
  169. #define XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_IDLE_MODE_MASK 0x3
  170. #define XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_IDLE_MODE_VAL 0x1
  171. #define XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_TERM_EN BIT(18)
  172. #define XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_MODE_OVRD BIT(13)
  173. #define XUSB_PADCTL_UPHY_PLL_S0_CTL1 0x860
  174. #define XUSB_PADCTL_UPHY_PLL_S0_CTL2 0x864
  175. #define XUSB_PADCTL_UPHY_PLL_S0_CTL4 0x86c
  176. #define XUSB_PADCTL_UPHY_PLL_S0_CTL5 0x870
  177. #define XUSB_PADCTL_UPHY_PLL_S0_CTL8 0x87c
  178. #define XUSB_PADCTL_UPHY_MISC_PAD_S0_CTL1 0x960
  179. #define XUSB_PADCTL_UPHY_USB3_PADX_ECTL1(x) (0xa60 + (x) * 0x40)
  180. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL_SHIFT 16
  181. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL_MASK 0x3
  182. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL_VAL 0x2
  183. #define XUSB_PADCTL_UPHY_USB3_PADX_ECTL2(x) (0xa64 + (x) * 0x40)
  184. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL2_RX_CTLE_SHIFT 0
  185. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL2_RX_CTLE_MASK 0xffff
  186. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL2_RX_CTLE_VAL 0x00fc
  187. #define XUSB_PADCTL_UPHY_USB3_PADX_ECTL3(x) (0xa68 + (x) * 0x40)
  188. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL3_RX_DFE_VAL 0xc0077f1f
  189. #define XUSB_PADCTL_UPHY_USB3_PADX_ECTL4(x) (0xa6c + (x) * 0x40)
  190. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL_SHIFT 16
  191. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL_MASK 0xffff
  192. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL_VAL 0x01c7
  193. #define XUSB_PADCTL_UPHY_USB3_PADX_ECTL6(x) (0xa74 + (x) * 0x40)
  194. #define XUSB_PADCTL_UPHY_USB3_PAD_ECTL6_RX_EQ_CTRL_H_VAL 0xfcf01368
  195. struct tegra210_xusb_fuse_calibration {
  196. u32 hs_curr_level[4];
  197. u32 hs_term_range_adj;
  198. u32 rpd_ctrl;
  199. };
  200. struct tegra210_xusb_padctl {
  201. struct tegra_xusb_padctl base;
  202. struct tegra210_xusb_fuse_calibration fuse;
  203. };
  204. static inline struct tegra210_xusb_padctl *
  205. to_tegra210_xusb_padctl(struct tegra_xusb_padctl *padctl)
  206. {
  207. return container_of(padctl, struct tegra210_xusb_padctl, base);
  208. }
  209. /* must be called under padctl->lock */
  210. static int tegra210_pex_uphy_enable(struct tegra_xusb_padctl *padctl)
  211. {
  212. struct tegra_xusb_pcie_pad *pcie = to_pcie_pad(padctl->pcie);
  213. unsigned long timeout;
  214. u32 value;
  215. int err;
  216. if (pcie->enable > 0) {
  217. pcie->enable++;
  218. return 0;
  219. }
  220. err = clk_prepare_enable(pcie->pll);
  221. if (err < 0)
  222. return err;
  223. err = reset_control_deassert(pcie->rst);
  224. if (err < 0)
  225. goto disable;
  226. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  227. value &= ~(XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_MASK <<
  228. XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_SHIFT);
  229. value |= XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_VAL <<
  230. XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_SHIFT;
  231. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  232. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL5);
  233. value &= ~(XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_MASK <<
  234. XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_SHIFT);
  235. value |= XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_VAL <<
  236. XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_SHIFT;
  237. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL5);
  238. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  239. value |= XUSB_PADCTL_UPHY_PLL_CTL1_PWR_OVRD;
  240. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  241. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  242. value |= XUSB_PADCTL_UPHY_PLL_CTL2_CAL_OVRD;
  243. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  244. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  245. value |= XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_OVRD;
  246. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  247. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  248. value &= ~((XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_MASK <<
  249. XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SHIFT) |
  250. (XUSB_PADCTL_UPHY_PLL_CTL4_REFCLK_SEL_MASK <<
  251. XUSB_PADCTL_UPHY_PLL_CTL4_REFCLK_SEL_SHIFT));
  252. value |= (XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_USB_VAL <<
  253. XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SHIFT) |
  254. XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_EN;
  255. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  256. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  257. value &= ~((XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_MDIV_MASK <<
  258. XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_MDIV_SHIFT) |
  259. (XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_MASK <<
  260. XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SHIFT));
  261. value |= XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_USB_VAL <<
  262. XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SHIFT;
  263. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  264. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  265. value &= ~XUSB_PADCTL_UPHY_PLL_CTL1_IDDQ;
  266. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  267. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  268. value &= ~(XUSB_PADCTL_UPHY_PLL_CTL1_SLEEP_MASK <<
  269. XUSB_PADCTL_UPHY_PLL_CTL1_SLEEP_SHIFT);
  270. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  271. usleep_range(10, 20);
  272. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  273. value |= XUSB_PADCTL_UPHY_PLL_CTL4_REFCLKBUF_EN;
  274. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL4);
  275. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  276. value |= XUSB_PADCTL_UPHY_PLL_CTL2_CAL_EN;
  277. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  278. timeout = jiffies + msecs_to_jiffies(100);
  279. while (time_before(jiffies, timeout)) {
  280. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  281. if (value & XUSB_PADCTL_UPHY_PLL_CTL2_CAL_DONE)
  282. break;
  283. usleep_range(10, 20);
  284. }
  285. if (time_after_eq(jiffies, timeout)) {
  286. err = -ETIMEDOUT;
  287. goto reset;
  288. }
  289. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  290. value &= ~XUSB_PADCTL_UPHY_PLL_CTL2_CAL_EN;
  291. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  292. timeout = jiffies + msecs_to_jiffies(100);
  293. while (time_before(jiffies, timeout)) {
  294. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  295. if (!(value & XUSB_PADCTL_UPHY_PLL_CTL2_CAL_DONE))
  296. break;
  297. usleep_range(10, 20);
  298. }
  299. if (time_after_eq(jiffies, timeout)) {
  300. err = -ETIMEDOUT;
  301. goto reset;
  302. }
  303. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  304. value |= XUSB_PADCTL_UPHY_PLL_CTL1_ENABLE;
  305. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  306. timeout = jiffies + msecs_to_jiffies(100);
  307. while (time_before(jiffies, timeout)) {
  308. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  309. if (value & XUSB_PADCTL_UPHY_PLL_CTL1_LOCKDET_STATUS)
  310. break;
  311. usleep_range(10, 20);
  312. }
  313. if (time_after_eq(jiffies, timeout)) {
  314. err = -ETIMEDOUT;
  315. goto reset;
  316. }
  317. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  318. value |= XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_EN |
  319. XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_CLK_EN;
  320. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  321. timeout = jiffies + msecs_to_jiffies(100);
  322. while (time_before(jiffies, timeout)) {
  323. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  324. if (value & XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_DONE)
  325. break;
  326. usleep_range(10, 20);
  327. }
  328. if (time_after_eq(jiffies, timeout)) {
  329. err = -ETIMEDOUT;
  330. goto reset;
  331. }
  332. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  333. value &= ~XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_EN;
  334. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  335. timeout = jiffies + msecs_to_jiffies(100);
  336. while (time_before(jiffies, timeout)) {
  337. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  338. if (!(value & XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_DONE))
  339. break;
  340. usleep_range(10, 20);
  341. }
  342. if (time_after_eq(jiffies, timeout)) {
  343. err = -ETIMEDOUT;
  344. goto reset;
  345. }
  346. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  347. value &= ~XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_CLK_EN;
  348. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  349. tegra210_xusb_pll_hw_control_enable();
  350. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  351. value &= ~XUSB_PADCTL_UPHY_PLL_CTL1_PWR_OVRD;
  352. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL1);
  353. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  354. value &= ~XUSB_PADCTL_UPHY_PLL_CTL2_CAL_OVRD;
  355. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL2);
  356. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  357. value &= ~XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_OVRD;
  358. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_P0_CTL8);
  359. usleep_range(10, 20);
  360. tegra210_xusb_pll_hw_sequence_start();
  361. pcie->enable++;
  362. return 0;
  363. reset:
  364. reset_control_assert(pcie->rst);
  365. disable:
  366. clk_disable_unprepare(pcie->pll);
  367. return err;
  368. }
  369. static void tegra210_pex_uphy_disable(struct tegra_xusb_padctl *padctl)
  370. {
  371. struct tegra_xusb_pcie_pad *pcie = to_pcie_pad(padctl->pcie);
  372. mutex_lock(&padctl->lock);
  373. if (WARN_ON(pcie->enable == 0))
  374. goto unlock;
  375. if (--pcie->enable > 0)
  376. goto unlock;
  377. reset_control_assert(pcie->rst);
  378. clk_disable_unprepare(pcie->pll);
  379. unlock:
  380. mutex_unlock(&padctl->lock);
  381. }
  382. /* must be called under padctl->lock */
  383. static int tegra210_sata_uphy_enable(struct tegra_xusb_padctl *padctl, bool usb)
  384. {
  385. struct tegra_xusb_sata_pad *sata = to_sata_pad(padctl->sata);
  386. unsigned long timeout;
  387. u32 value;
  388. int err;
  389. if (sata->enable > 0) {
  390. sata->enable++;
  391. return 0;
  392. }
  393. err = clk_prepare_enable(sata->pll);
  394. if (err < 0)
  395. return err;
  396. err = reset_control_deassert(sata->rst);
  397. if (err < 0)
  398. goto disable;
  399. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  400. value &= ~(XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_MASK <<
  401. XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_SHIFT);
  402. value |= XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_VAL <<
  403. XUSB_PADCTL_UPHY_PLL_CTL2_CAL_CTRL_SHIFT;
  404. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  405. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL5);
  406. value &= ~(XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_MASK <<
  407. XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_SHIFT);
  408. value |= XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_VAL <<
  409. XUSB_PADCTL_UPHY_PLL_CTL5_DCO_CTRL_SHIFT;
  410. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL5);
  411. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  412. value |= XUSB_PADCTL_UPHY_PLL_CTL1_PWR_OVRD;
  413. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  414. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  415. value |= XUSB_PADCTL_UPHY_PLL_CTL2_CAL_OVRD;
  416. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  417. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  418. value |= XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_OVRD;
  419. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  420. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL4);
  421. value &= ~((XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_MASK <<
  422. XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SHIFT) |
  423. (XUSB_PADCTL_UPHY_PLL_CTL4_REFCLK_SEL_MASK <<
  424. XUSB_PADCTL_UPHY_PLL_CTL4_REFCLK_SEL_SHIFT));
  425. value |= XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_EN;
  426. if (usb)
  427. value |= (XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_USB_VAL <<
  428. XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SHIFT);
  429. else
  430. value |= (XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SATA_VAL <<
  431. XUSB_PADCTL_UPHY_PLL_CTL4_TXCLKREF_SEL_SHIFT);
  432. value &= ~XUSB_PADCTL_UPHY_PLL_CTL4_XDIGCLK_EN;
  433. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL4);
  434. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  435. value &= ~((XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_MDIV_MASK <<
  436. XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_MDIV_SHIFT) |
  437. (XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_MASK <<
  438. XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SHIFT));
  439. if (usb)
  440. value |= XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_USB_VAL <<
  441. XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SHIFT;
  442. else
  443. value |= XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SATA_VAL <<
  444. XUSB_PADCTL_UPHY_PLL_CTL1_FREQ_NDIV_SHIFT;
  445. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  446. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  447. value &= ~XUSB_PADCTL_UPHY_PLL_CTL1_IDDQ;
  448. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  449. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  450. value &= ~(XUSB_PADCTL_UPHY_PLL_CTL1_SLEEP_MASK <<
  451. XUSB_PADCTL_UPHY_PLL_CTL1_SLEEP_SHIFT);
  452. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  453. usleep_range(10, 20);
  454. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL4);
  455. value |= XUSB_PADCTL_UPHY_PLL_CTL4_REFCLKBUF_EN;
  456. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL4);
  457. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  458. value |= XUSB_PADCTL_UPHY_PLL_CTL2_CAL_EN;
  459. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  460. timeout = jiffies + msecs_to_jiffies(100);
  461. while (time_before(jiffies, timeout)) {
  462. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  463. if (value & XUSB_PADCTL_UPHY_PLL_CTL2_CAL_DONE)
  464. break;
  465. usleep_range(10, 20);
  466. }
  467. if (time_after_eq(jiffies, timeout)) {
  468. err = -ETIMEDOUT;
  469. goto reset;
  470. }
  471. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  472. value &= ~XUSB_PADCTL_UPHY_PLL_CTL2_CAL_EN;
  473. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  474. timeout = jiffies + msecs_to_jiffies(100);
  475. while (time_before(jiffies, timeout)) {
  476. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  477. if (!(value & XUSB_PADCTL_UPHY_PLL_CTL2_CAL_DONE))
  478. break;
  479. usleep_range(10, 20);
  480. }
  481. if (time_after_eq(jiffies, timeout)) {
  482. err = -ETIMEDOUT;
  483. goto reset;
  484. }
  485. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  486. value |= XUSB_PADCTL_UPHY_PLL_CTL1_ENABLE;
  487. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  488. timeout = jiffies + msecs_to_jiffies(100);
  489. while (time_before(jiffies, timeout)) {
  490. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  491. if (value & XUSB_PADCTL_UPHY_PLL_CTL1_LOCKDET_STATUS)
  492. break;
  493. usleep_range(10, 20);
  494. }
  495. if (time_after_eq(jiffies, timeout)) {
  496. err = -ETIMEDOUT;
  497. goto reset;
  498. }
  499. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  500. value |= XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_EN |
  501. XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_CLK_EN;
  502. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  503. timeout = jiffies + msecs_to_jiffies(100);
  504. while (time_before(jiffies, timeout)) {
  505. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  506. if (value & XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_DONE)
  507. break;
  508. usleep_range(10, 20);
  509. }
  510. if (time_after_eq(jiffies, timeout)) {
  511. err = -ETIMEDOUT;
  512. goto reset;
  513. }
  514. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  515. value &= ~XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_EN;
  516. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  517. timeout = jiffies + msecs_to_jiffies(100);
  518. while (time_before(jiffies, timeout)) {
  519. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  520. if (!(value & XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_DONE))
  521. break;
  522. usleep_range(10, 20);
  523. }
  524. if (time_after_eq(jiffies, timeout)) {
  525. err = -ETIMEDOUT;
  526. goto reset;
  527. }
  528. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  529. value &= ~XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_CLK_EN;
  530. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  531. tegra210_sata_pll_hw_control_enable();
  532. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  533. value &= ~XUSB_PADCTL_UPHY_PLL_CTL1_PWR_OVRD;
  534. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL1);
  535. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  536. value &= ~XUSB_PADCTL_UPHY_PLL_CTL2_CAL_OVRD;
  537. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL2);
  538. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  539. value &= ~XUSB_PADCTL_UPHY_PLL_CTL8_RCAL_OVRD;
  540. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_PLL_S0_CTL8);
  541. usleep_range(10, 20);
  542. tegra210_sata_pll_hw_sequence_start();
  543. sata->enable++;
  544. return 0;
  545. reset:
  546. reset_control_assert(sata->rst);
  547. disable:
  548. clk_disable_unprepare(sata->pll);
  549. return err;
  550. }
  551. static void tegra210_sata_uphy_disable(struct tegra_xusb_padctl *padctl)
  552. {
  553. struct tegra_xusb_sata_pad *sata = to_sata_pad(padctl->sata);
  554. mutex_lock(&padctl->lock);
  555. if (WARN_ON(sata->enable == 0))
  556. goto unlock;
  557. if (--sata->enable > 0)
  558. goto unlock;
  559. reset_control_assert(sata->rst);
  560. clk_disable_unprepare(sata->pll);
  561. unlock:
  562. mutex_unlock(&padctl->lock);
  563. }
  564. static int tegra210_xusb_padctl_enable(struct tegra_xusb_padctl *padctl)
  565. {
  566. u32 value;
  567. mutex_lock(&padctl->lock);
  568. if (padctl->enable++ > 0)
  569. goto out;
  570. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  571. value &= ~XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN;
  572. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  573. usleep_range(100, 200);
  574. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  575. value &= ~XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN_EARLY;
  576. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  577. usleep_range(100, 200);
  578. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  579. value &= ~XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_VCORE_DOWN;
  580. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  581. out:
  582. mutex_unlock(&padctl->lock);
  583. return 0;
  584. }
  585. static int tegra210_xusb_padctl_disable(struct tegra_xusb_padctl *padctl)
  586. {
  587. u32 value;
  588. mutex_lock(&padctl->lock);
  589. if (WARN_ON(padctl->enable == 0))
  590. goto out;
  591. if (--padctl->enable > 0)
  592. goto out;
  593. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  594. value |= XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_VCORE_DOWN;
  595. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  596. usleep_range(100, 200);
  597. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  598. value |= XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN_EARLY;
  599. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  600. usleep_range(100, 200);
  601. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  602. value |= XUSB_PADCTL_ELPG_PROGRAM1_AUX_MUX_LP0_CLAMP_EN;
  603. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  604. out:
  605. mutex_unlock(&padctl->lock);
  606. return 0;
  607. }
  608. static int tegra210_hsic_set_idle(struct tegra_xusb_padctl *padctl,
  609. unsigned int index, bool idle)
  610. {
  611. u32 value;
  612. value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL0(index));
  613. value &= ~(XUSB_PADCTL_HSIC_PAD_CTL0_RPU_DATA0 |
  614. XUSB_PADCTL_HSIC_PAD_CTL0_RPU_DATA1 |
  615. XUSB_PADCTL_HSIC_PAD_CTL0_RPD_STROBE);
  616. if (idle)
  617. value |= XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA0 |
  618. XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA1 |
  619. XUSB_PADCTL_HSIC_PAD_CTL0_RPU_STROBE;
  620. else
  621. value &= ~(XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA0 |
  622. XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA1 |
  623. XUSB_PADCTL_HSIC_PAD_CTL0_RPU_STROBE);
  624. padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL0(index));
  625. return 0;
  626. }
  627. static int tegra210_usb3_set_lfps_detect(struct tegra_xusb_padctl *padctl,
  628. unsigned int index, bool enable)
  629. {
  630. struct tegra_xusb_port *port;
  631. struct tegra_xusb_lane *lane;
  632. u32 value, offset;
  633. port = tegra_xusb_find_port(padctl, "usb3", index);
  634. if (!port)
  635. return -ENODEV;
  636. lane = port->lane;
  637. if (lane->pad == padctl->pcie)
  638. offset = XUSB_PADCTL_UPHY_MISC_PAD_PX_CTL1(lane->index);
  639. else
  640. offset = XUSB_PADCTL_UPHY_MISC_PAD_S0_CTL1;
  641. value = padctl_readl(padctl, offset);
  642. value &= ~((XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_IDLE_MODE_MASK <<
  643. XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_IDLE_MODE_SHIFT) |
  644. XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_TERM_EN |
  645. XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_MODE_OVRD);
  646. if (!enable) {
  647. value |= (XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_IDLE_MODE_VAL <<
  648. XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_IDLE_MODE_SHIFT) |
  649. XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_TERM_EN |
  650. XUSB_PADCTL_UPHY_MISC_PAD_CTL1_AUX_RX_MODE_OVRD;
  651. }
  652. padctl_writel(padctl, value, offset);
  653. return 0;
  654. }
  655. #define TEGRA210_LANE(_name, _offset, _shift, _mask, _type) \
  656. { \
  657. .name = _name, \
  658. .offset = _offset, \
  659. .shift = _shift, \
  660. .mask = _mask, \
  661. .num_funcs = ARRAY_SIZE(tegra210_##_type##_functions), \
  662. .funcs = tegra210_##_type##_functions, \
  663. }
  664. static const char *tegra210_usb2_functions[] = {
  665. "snps",
  666. "xusb",
  667. "uart"
  668. };
  669. static const struct tegra_xusb_lane_soc tegra210_usb2_lanes[] = {
  670. TEGRA210_LANE("usb2-0", 0x004, 0, 0x3, usb2),
  671. TEGRA210_LANE("usb2-1", 0x004, 2, 0x3, usb2),
  672. TEGRA210_LANE("usb2-2", 0x004, 4, 0x3, usb2),
  673. TEGRA210_LANE("usb2-3", 0x004, 6, 0x3, usb2),
  674. };
  675. static struct tegra_xusb_lane *
  676. tegra210_usb2_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
  677. unsigned int index)
  678. {
  679. struct tegra_xusb_usb2_lane *usb2;
  680. int err;
  681. usb2 = kzalloc(sizeof(*usb2), GFP_KERNEL);
  682. if (!usb2)
  683. return ERR_PTR(-ENOMEM);
  684. INIT_LIST_HEAD(&usb2->base.list);
  685. usb2->base.soc = &pad->soc->lanes[index];
  686. usb2->base.index = index;
  687. usb2->base.pad = pad;
  688. usb2->base.np = np;
  689. err = tegra_xusb_lane_parse_dt(&usb2->base, np);
  690. if (err < 0) {
  691. kfree(usb2);
  692. return ERR_PTR(err);
  693. }
  694. return &usb2->base;
  695. }
  696. static void tegra210_usb2_lane_remove(struct tegra_xusb_lane *lane)
  697. {
  698. struct tegra_xusb_usb2_lane *usb2 = to_usb2_lane(lane);
  699. kfree(usb2);
  700. }
  701. static const struct tegra_xusb_lane_ops tegra210_usb2_lane_ops = {
  702. .probe = tegra210_usb2_lane_probe,
  703. .remove = tegra210_usb2_lane_remove,
  704. };
  705. static int tegra210_usb2_phy_init(struct phy *phy)
  706. {
  707. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  708. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  709. u32 value;
  710. value = padctl_readl(padctl, XUSB_PADCTL_USB2_PAD_MUX);
  711. value &= ~(XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_MASK <<
  712. XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_SHIFT);
  713. value |= XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB <<
  714. XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_SHIFT;
  715. padctl_writel(padctl, value, XUSB_PADCTL_USB2_PAD_MUX);
  716. return tegra210_xusb_padctl_enable(padctl);
  717. }
  718. static int tegra210_usb2_phy_exit(struct phy *phy)
  719. {
  720. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  721. return tegra210_xusb_padctl_disable(lane->pad->padctl);
  722. }
  723. static int tegra210_usb2_phy_power_on(struct phy *phy)
  724. {
  725. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  726. struct tegra_xusb_usb2_lane *usb2 = to_usb2_lane(lane);
  727. struct tegra_xusb_usb2_pad *pad = to_usb2_pad(lane->pad);
  728. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  729. struct tegra210_xusb_padctl *priv;
  730. struct tegra_xusb_usb2_port *port;
  731. unsigned int index = lane->index;
  732. u32 value;
  733. int err;
  734. port = tegra_xusb_find_usb2_port(padctl, index);
  735. if (!port) {
  736. dev_err(&phy->dev, "no port found for USB2 lane %u\n", index);
  737. return -ENODEV;
  738. }
  739. priv = to_tegra210_xusb_padctl(padctl);
  740. value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
  741. value &= ~((XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_MASK <<
  742. XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT) |
  743. (XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_MASK <<
  744. XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT));
  745. value |= (XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL <<
  746. XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_SHIFT);
  747. if (tegra_sku_info.revision < TEGRA_REVISION_A02)
  748. value |=
  749. (XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_VAL <<
  750. XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL_SHIFT);
  751. padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
  752. value = padctl_readl(padctl, XUSB_PADCTL_USB2_PORT_CAP);
  753. value &= ~XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_MASK(index);
  754. value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(index);
  755. padctl_writel(padctl, value, XUSB_PADCTL_USB2_PORT_CAP);
  756. value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
  757. value &= ~((XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_MASK <<
  758. XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT) |
  759. XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD |
  760. XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 |
  761. XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI);
  762. value |= (priv->fuse.hs_curr_level[index] +
  763. usb2->hs_curr_level_offset) <<
  764. XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL_SHIFT;
  765. padctl_writel(padctl, value, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
  766. value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
  767. value &= ~((XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_MASK <<
  768. XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT) |
  769. (XUSB_PADCTL_USB2_OTG_PAD_CTL1_RPD_CTRL_MASK <<
  770. XUSB_PADCTL_USB2_OTG_PAD_CTL1_RPD_CTRL_SHIFT) |
  771. XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR |
  772. XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_OVRD |
  773. XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_OVRD);
  774. value |= (priv->fuse.hs_term_range_adj <<
  775. XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ_SHIFT) |
  776. (priv->fuse.rpd_ctrl <<
  777. XUSB_PADCTL_USB2_OTG_PAD_CTL1_RPD_CTRL_SHIFT);
  778. padctl_writel(padctl, value, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
  779. value = padctl_readl(padctl,
  780. XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(index));
  781. value &= ~(XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_MASK <<
  782. XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT);
  783. value |= XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18;
  784. padctl_writel(padctl, value,
  785. XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(index));
  786. err = regulator_enable(port->supply);
  787. if (err)
  788. return err;
  789. mutex_lock(&padctl->lock);
  790. if (pad->enable > 0) {
  791. pad->enable++;
  792. mutex_unlock(&padctl->lock);
  793. return 0;
  794. }
  795. err = clk_prepare_enable(pad->clk);
  796. if (err)
  797. goto disable_regulator;
  798. value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL1);
  799. value &= ~((XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_START_TIMER_MASK <<
  800. XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_START_TIMER_SHIFT) |
  801. (XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER_MASK <<
  802. XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER_SHIFT));
  803. value |= (XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_START_TIMER_VAL <<
  804. XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_START_TIMER_SHIFT) |
  805. (XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER_VAL <<
  806. XUSB_PADCTL_USB2_BIAS_PAD_CTL1_TRK_DONE_RESET_TIMER_SHIFT);
  807. padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL1);
  808. value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
  809. value &= ~XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD;
  810. padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
  811. udelay(1);
  812. value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL1);
  813. value &= ~XUSB_PADCTL_USB2_BIAS_PAD_CTL1_PD_TRK;
  814. padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL1);
  815. udelay(50);
  816. clk_disable_unprepare(pad->clk);
  817. pad->enable++;
  818. mutex_unlock(&padctl->lock);
  819. return 0;
  820. disable_regulator:
  821. regulator_disable(port->supply);
  822. mutex_unlock(&padctl->lock);
  823. return err;
  824. }
  825. static int tegra210_usb2_phy_power_off(struct phy *phy)
  826. {
  827. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  828. struct tegra_xusb_usb2_pad *pad = to_usb2_pad(lane->pad);
  829. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  830. struct tegra_xusb_usb2_port *port;
  831. u32 value;
  832. port = tegra_xusb_find_usb2_port(padctl, lane->index);
  833. if (!port) {
  834. dev_err(&phy->dev, "no port found for USB2 lane %u\n",
  835. lane->index);
  836. return -ENODEV;
  837. }
  838. mutex_lock(&padctl->lock);
  839. if (WARN_ON(pad->enable == 0))
  840. goto out;
  841. if (--pad->enable > 0)
  842. goto out;
  843. value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
  844. value |= XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD;
  845. padctl_writel(padctl, value, XUSB_PADCTL_USB2_BIAS_PAD_CTL0);
  846. out:
  847. regulator_disable(port->supply);
  848. mutex_unlock(&padctl->lock);
  849. return 0;
  850. }
  851. static const struct phy_ops tegra210_usb2_phy_ops = {
  852. .init = tegra210_usb2_phy_init,
  853. .exit = tegra210_usb2_phy_exit,
  854. .power_on = tegra210_usb2_phy_power_on,
  855. .power_off = tegra210_usb2_phy_power_off,
  856. .owner = THIS_MODULE,
  857. };
  858. static struct tegra_xusb_pad *
  859. tegra210_usb2_pad_probe(struct tegra_xusb_padctl *padctl,
  860. const struct tegra_xusb_pad_soc *soc,
  861. struct device_node *np)
  862. {
  863. struct tegra_xusb_usb2_pad *usb2;
  864. struct tegra_xusb_pad *pad;
  865. int err;
  866. usb2 = kzalloc(sizeof(*usb2), GFP_KERNEL);
  867. if (!usb2)
  868. return ERR_PTR(-ENOMEM);
  869. pad = &usb2->base;
  870. pad->ops = &tegra210_usb2_lane_ops;
  871. pad->soc = soc;
  872. err = tegra_xusb_pad_init(pad, padctl, np);
  873. if (err < 0) {
  874. kfree(usb2);
  875. goto out;
  876. }
  877. usb2->clk = devm_clk_get(&pad->dev, "trk");
  878. if (IS_ERR(usb2->clk)) {
  879. err = PTR_ERR(usb2->clk);
  880. dev_err(&pad->dev, "failed to get trk clock: %d\n", err);
  881. goto unregister;
  882. }
  883. err = tegra_xusb_pad_register(pad, &tegra210_usb2_phy_ops);
  884. if (err < 0)
  885. goto unregister;
  886. dev_set_drvdata(&pad->dev, pad);
  887. return pad;
  888. unregister:
  889. device_unregister(&pad->dev);
  890. out:
  891. return ERR_PTR(err);
  892. }
  893. static void tegra210_usb2_pad_remove(struct tegra_xusb_pad *pad)
  894. {
  895. struct tegra_xusb_usb2_pad *usb2 = to_usb2_pad(pad);
  896. kfree(usb2);
  897. }
  898. static const struct tegra_xusb_pad_ops tegra210_usb2_ops = {
  899. .probe = tegra210_usb2_pad_probe,
  900. .remove = tegra210_usb2_pad_remove,
  901. };
  902. static const struct tegra_xusb_pad_soc tegra210_usb2_pad = {
  903. .name = "usb2",
  904. .num_lanes = ARRAY_SIZE(tegra210_usb2_lanes),
  905. .lanes = tegra210_usb2_lanes,
  906. .ops = &tegra210_usb2_ops,
  907. };
  908. static const char *tegra210_hsic_functions[] = {
  909. "snps",
  910. "xusb",
  911. };
  912. static const struct tegra_xusb_lane_soc tegra210_hsic_lanes[] = {
  913. TEGRA210_LANE("hsic-0", 0x004, 14, 0x1, hsic),
  914. };
  915. static struct tegra_xusb_lane *
  916. tegra210_hsic_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
  917. unsigned int index)
  918. {
  919. struct tegra_xusb_hsic_lane *hsic;
  920. int err;
  921. hsic = kzalloc(sizeof(*hsic), GFP_KERNEL);
  922. if (!hsic)
  923. return ERR_PTR(-ENOMEM);
  924. INIT_LIST_HEAD(&hsic->base.list);
  925. hsic->base.soc = &pad->soc->lanes[index];
  926. hsic->base.index = index;
  927. hsic->base.pad = pad;
  928. hsic->base.np = np;
  929. err = tegra_xusb_lane_parse_dt(&hsic->base, np);
  930. if (err < 0) {
  931. kfree(hsic);
  932. return ERR_PTR(err);
  933. }
  934. return &hsic->base;
  935. }
  936. static void tegra210_hsic_lane_remove(struct tegra_xusb_lane *lane)
  937. {
  938. struct tegra_xusb_hsic_lane *hsic = to_hsic_lane(lane);
  939. kfree(hsic);
  940. }
  941. static const struct tegra_xusb_lane_ops tegra210_hsic_lane_ops = {
  942. .probe = tegra210_hsic_lane_probe,
  943. .remove = tegra210_hsic_lane_remove,
  944. };
  945. static int tegra210_hsic_phy_init(struct phy *phy)
  946. {
  947. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  948. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  949. u32 value;
  950. value = padctl_readl(padctl, XUSB_PADCTL_USB2_PAD_MUX);
  951. value &= ~(XUSB_PADCTL_USB2_PAD_MUX_HSIC_PAD_TRK_MASK <<
  952. XUSB_PADCTL_USB2_PAD_MUX_HSIC_PAD_TRK_SHIFT);
  953. value |= XUSB_PADCTL_USB2_PAD_MUX_HSIC_PAD_TRK_XUSB <<
  954. XUSB_PADCTL_USB2_PAD_MUX_HSIC_PAD_TRK_SHIFT;
  955. padctl_writel(padctl, value, XUSB_PADCTL_USB2_PAD_MUX);
  956. return tegra210_xusb_padctl_enable(padctl);
  957. }
  958. static int tegra210_hsic_phy_exit(struct phy *phy)
  959. {
  960. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  961. return tegra210_xusb_padctl_disable(lane->pad->padctl);
  962. }
  963. static int tegra210_hsic_phy_power_on(struct phy *phy)
  964. {
  965. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  966. struct tegra_xusb_hsic_lane *hsic = to_hsic_lane(lane);
  967. struct tegra_xusb_hsic_pad *pad = to_hsic_pad(lane->pad);
  968. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  969. struct tegra210_xusb_padctl *priv;
  970. unsigned int index = lane->index;
  971. u32 value;
  972. int err;
  973. priv = to_tegra210_xusb_padctl(padctl);
  974. err = regulator_enable(pad->supply);
  975. if (err)
  976. return err;
  977. padctl_writel(padctl, hsic->strobe_trim,
  978. XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL);
  979. value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL1(index));
  980. value &= ~(XUSB_PADCTL_HSIC_PAD_CTL1_TX_RTUNEP_MASK <<
  981. XUSB_PADCTL_HSIC_PAD_CTL1_TX_RTUNEP_SHIFT);
  982. value |= (hsic->tx_rtune_p <<
  983. XUSB_PADCTL_HSIC_PAD_CTL1_TX_RTUNEP_SHIFT);
  984. padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
  985. value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL2(index));
  986. value &= ~((XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_MASK <<
  987. XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT) |
  988. (XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_MASK <<
  989. XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT));
  990. value |= (hsic->rx_strobe_trim <<
  991. XUSB_PADCTL_HSIC_PAD_CTL2_RX_STROBE_TRIM_SHIFT) |
  992. (hsic->rx_data_trim <<
  993. XUSB_PADCTL_HSIC_PAD_CTL2_RX_DATA_TRIM_SHIFT);
  994. padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL2(index));
  995. value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL0(index));
  996. value &= ~(XUSB_PADCTL_HSIC_PAD_CTL0_RPU_DATA0 |
  997. XUSB_PADCTL_HSIC_PAD_CTL0_RPU_DATA1 |
  998. XUSB_PADCTL_HSIC_PAD_CTL0_RPU_STROBE |
  999. XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_DATA0 |
  1000. XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_DATA1 |
  1001. XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_STROBE |
  1002. XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_DATA0 |
  1003. XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_DATA1 |
  1004. XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_STROBE |
  1005. XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_DATA0 |
  1006. XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_DATA1 |
  1007. XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_STROBE);
  1008. value |= XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA0 |
  1009. XUSB_PADCTL_HSIC_PAD_CTL0_RPD_DATA1 |
  1010. XUSB_PADCTL_HSIC_PAD_CTL0_RPD_STROBE;
  1011. padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL0(index));
  1012. err = clk_prepare_enable(pad->clk);
  1013. if (err)
  1014. goto disable;
  1015. value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PAD_TRK_CTL);
  1016. value &= ~((XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_START_TIMER_MASK <<
  1017. XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_START_TIMER_SHIFT) |
  1018. (XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER_MASK <<
  1019. XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER_SHIFT));
  1020. value |= (XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_START_TIMER_VAL <<
  1021. XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_START_TIMER_SHIFT) |
  1022. (XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER_VAL <<
  1023. XUSB_PADCTL_HSIC_PAD_TRK_CTL_TRK_DONE_RESET_TIMER_SHIFT);
  1024. padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PAD_TRK_CTL);
  1025. udelay(1);
  1026. value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PAD_TRK_CTL);
  1027. value &= ~XUSB_PADCTL_HSIC_PAD_TRK_CTL_PD_TRK;
  1028. padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PAD_TRK_CTL);
  1029. udelay(50);
  1030. clk_disable_unprepare(pad->clk);
  1031. return 0;
  1032. disable:
  1033. regulator_disable(pad->supply);
  1034. return err;
  1035. }
  1036. static int tegra210_hsic_phy_power_off(struct phy *phy)
  1037. {
  1038. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1039. struct tegra_xusb_hsic_pad *pad = to_hsic_pad(lane->pad);
  1040. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  1041. unsigned int index = lane->index;
  1042. u32 value;
  1043. value = padctl_readl(padctl, XUSB_PADCTL_HSIC_PADX_CTL0(index));
  1044. value |= XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_DATA0 |
  1045. XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_DATA1 |
  1046. XUSB_PADCTL_HSIC_PAD_CTL0_PD_RX_STROBE |
  1047. XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_DATA0 |
  1048. XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_DATA1 |
  1049. XUSB_PADCTL_HSIC_PAD_CTL0_PD_ZI_STROBE |
  1050. XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_DATA0 |
  1051. XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_DATA1 |
  1052. XUSB_PADCTL_HSIC_PAD_CTL0_PD_TX_STROBE;
  1053. padctl_writel(padctl, value, XUSB_PADCTL_HSIC_PADX_CTL1(index));
  1054. regulator_disable(pad->supply);
  1055. return 0;
  1056. }
  1057. static const struct phy_ops tegra210_hsic_phy_ops = {
  1058. .init = tegra210_hsic_phy_init,
  1059. .exit = tegra210_hsic_phy_exit,
  1060. .power_on = tegra210_hsic_phy_power_on,
  1061. .power_off = tegra210_hsic_phy_power_off,
  1062. .owner = THIS_MODULE,
  1063. };
  1064. static struct tegra_xusb_pad *
  1065. tegra210_hsic_pad_probe(struct tegra_xusb_padctl *padctl,
  1066. const struct tegra_xusb_pad_soc *soc,
  1067. struct device_node *np)
  1068. {
  1069. struct tegra_xusb_hsic_pad *hsic;
  1070. struct tegra_xusb_pad *pad;
  1071. int err;
  1072. hsic = kzalloc(sizeof(*hsic), GFP_KERNEL);
  1073. if (!hsic)
  1074. return ERR_PTR(-ENOMEM);
  1075. pad = &hsic->base;
  1076. pad->ops = &tegra210_hsic_lane_ops;
  1077. pad->soc = soc;
  1078. err = tegra_xusb_pad_init(pad, padctl, np);
  1079. if (err < 0) {
  1080. kfree(hsic);
  1081. goto out;
  1082. }
  1083. hsic->clk = devm_clk_get(&pad->dev, "trk");
  1084. if (IS_ERR(hsic->clk)) {
  1085. err = PTR_ERR(hsic->clk);
  1086. dev_err(&pad->dev, "failed to get trk clock: %d\n", err);
  1087. goto unregister;
  1088. }
  1089. err = tegra_xusb_pad_register(pad, &tegra210_hsic_phy_ops);
  1090. if (err < 0)
  1091. goto unregister;
  1092. dev_set_drvdata(&pad->dev, pad);
  1093. return pad;
  1094. unregister:
  1095. device_unregister(&pad->dev);
  1096. out:
  1097. return ERR_PTR(err);
  1098. }
  1099. static void tegra210_hsic_pad_remove(struct tegra_xusb_pad *pad)
  1100. {
  1101. struct tegra_xusb_hsic_pad *hsic = to_hsic_pad(pad);
  1102. kfree(hsic);
  1103. }
  1104. static const struct tegra_xusb_pad_ops tegra210_hsic_ops = {
  1105. .probe = tegra210_hsic_pad_probe,
  1106. .remove = tegra210_hsic_pad_remove,
  1107. };
  1108. static const struct tegra_xusb_pad_soc tegra210_hsic_pad = {
  1109. .name = "hsic",
  1110. .num_lanes = ARRAY_SIZE(tegra210_hsic_lanes),
  1111. .lanes = tegra210_hsic_lanes,
  1112. .ops = &tegra210_hsic_ops,
  1113. };
  1114. static const char *tegra210_pcie_functions[] = {
  1115. "pcie-x1",
  1116. "usb3-ss",
  1117. "sata",
  1118. "pcie-x4",
  1119. };
  1120. static const struct tegra_xusb_lane_soc tegra210_pcie_lanes[] = {
  1121. TEGRA210_LANE("pcie-0", 0x028, 12, 0x3, pcie),
  1122. TEGRA210_LANE("pcie-1", 0x028, 14, 0x3, pcie),
  1123. TEGRA210_LANE("pcie-2", 0x028, 16, 0x3, pcie),
  1124. TEGRA210_LANE("pcie-3", 0x028, 18, 0x3, pcie),
  1125. TEGRA210_LANE("pcie-4", 0x028, 20, 0x3, pcie),
  1126. TEGRA210_LANE("pcie-5", 0x028, 22, 0x3, pcie),
  1127. TEGRA210_LANE("pcie-6", 0x028, 24, 0x3, pcie),
  1128. };
  1129. static struct tegra_xusb_lane *
  1130. tegra210_pcie_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
  1131. unsigned int index)
  1132. {
  1133. struct tegra_xusb_pcie_lane *pcie;
  1134. int err;
  1135. pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
  1136. if (!pcie)
  1137. return ERR_PTR(-ENOMEM);
  1138. INIT_LIST_HEAD(&pcie->base.list);
  1139. pcie->base.soc = &pad->soc->lanes[index];
  1140. pcie->base.index = index;
  1141. pcie->base.pad = pad;
  1142. pcie->base.np = np;
  1143. err = tegra_xusb_lane_parse_dt(&pcie->base, np);
  1144. if (err < 0) {
  1145. kfree(pcie);
  1146. return ERR_PTR(err);
  1147. }
  1148. return &pcie->base;
  1149. }
  1150. static void tegra210_pcie_lane_remove(struct tegra_xusb_lane *lane)
  1151. {
  1152. struct tegra_xusb_pcie_lane *pcie = to_pcie_lane(lane);
  1153. kfree(pcie);
  1154. }
  1155. static const struct tegra_xusb_lane_ops tegra210_pcie_lane_ops = {
  1156. .probe = tegra210_pcie_lane_probe,
  1157. .remove = tegra210_pcie_lane_remove,
  1158. };
  1159. static int tegra210_pcie_phy_init(struct phy *phy)
  1160. {
  1161. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1162. return tegra210_xusb_padctl_enable(lane->pad->padctl);
  1163. }
  1164. static int tegra210_pcie_phy_exit(struct phy *phy)
  1165. {
  1166. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1167. return tegra210_xusb_padctl_disable(lane->pad->padctl);
  1168. }
  1169. static int tegra210_pcie_phy_power_on(struct phy *phy)
  1170. {
  1171. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1172. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  1173. u32 value;
  1174. int err;
  1175. mutex_lock(&padctl->lock);
  1176. err = tegra210_pex_uphy_enable(padctl);
  1177. if (err < 0)
  1178. goto unlock;
  1179. value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
  1180. value |= XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->index);
  1181. padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
  1182. unlock:
  1183. mutex_unlock(&padctl->lock);
  1184. return err;
  1185. }
  1186. static int tegra210_pcie_phy_power_off(struct phy *phy)
  1187. {
  1188. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1189. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  1190. u32 value;
  1191. value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
  1192. value &= ~XUSB_PADCTL_USB3_PAD_MUX_PCIE_IDDQ_DISABLE(lane->index);
  1193. padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
  1194. tegra210_pex_uphy_disable(padctl);
  1195. return 0;
  1196. }
  1197. static const struct phy_ops tegra210_pcie_phy_ops = {
  1198. .init = tegra210_pcie_phy_init,
  1199. .exit = tegra210_pcie_phy_exit,
  1200. .power_on = tegra210_pcie_phy_power_on,
  1201. .power_off = tegra210_pcie_phy_power_off,
  1202. .owner = THIS_MODULE,
  1203. };
  1204. static struct tegra_xusb_pad *
  1205. tegra210_pcie_pad_probe(struct tegra_xusb_padctl *padctl,
  1206. const struct tegra_xusb_pad_soc *soc,
  1207. struct device_node *np)
  1208. {
  1209. struct tegra_xusb_pcie_pad *pcie;
  1210. struct tegra_xusb_pad *pad;
  1211. int err;
  1212. pcie = kzalloc(sizeof(*pcie), GFP_KERNEL);
  1213. if (!pcie)
  1214. return ERR_PTR(-ENOMEM);
  1215. pad = &pcie->base;
  1216. pad->ops = &tegra210_pcie_lane_ops;
  1217. pad->soc = soc;
  1218. err = tegra_xusb_pad_init(pad, padctl, np);
  1219. if (err < 0) {
  1220. kfree(pcie);
  1221. goto out;
  1222. }
  1223. pcie->pll = devm_clk_get(&pad->dev, "pll");
  1224. if (IS_ERR(pcie->pll)) {
  1225. err = PTR_ERR(pcie->pll);
  1226. dev_err(&pad->dev, "failed to get PLL: %d\n", err);
  1227. goto unregister;
  1228. }
  1229. pcie->rst = devm_reset_control_get(&pad->dev, "phy");
  1230. if (IS_ERR(pcie->rst)) {
  1231. err = PTR_ERR(pcie->rst);
  1232. dev_err(&pad->dev, "failed to get PCIe pad reset: %d\n", err);
  1233. goto unregister;
  1234. }
  1235. err = tegra_xusb_pad_register(pad, &tegra210_pcie_phy_ops);
  1236. if (err < 0)
  1237. goto unregister;
  1238. dev_set_drvdata(&pad->dev, pad);
  1239. return pad;
  1240. unregister:
  1241. device_unregister(&pad->dev);
  1242. out:
  1243. return ERR_PTR(err);
  1244. }
  1245. static void tegra210_pcie_pad_remove(struct tegra_xusb_pad *pad)
  1246. {
  1247. struct tegra_xusb_pcie_pad *pcie = to_pcie_pad(pad);
  1248. kfree(pcie);
  1249. }
  1250. static const struct tegra_xusb_pad_ops tegra210_pcie_ops = {
  1251. .probe = tegra210_pcie_pad_probe,
  1252. .remove = tegra210_pcie_pad_remove,
  1253. };
  1254. static const struct tegra_xusb_pad_soc tegra210_pcie_pad = {
  1255. .name = "pcie",
  1256. .num_lanes = ARRAY_SIZE(tegra210_pcie_lanes),
  1257. .lanes = tegra210_pcie_lanes,
  1258. .ops = &tegra210_pcie_ops,
  1259. };
  1260. static const struct tegra_xusb_lane_soc tegra210_sata_lanes[] = {
  1261. TEGRA210_LANE("sata-0", 0x028, 30, 0x3, pcie),
  1262. };
  1263. static struct tegra_xusb_lane *
  1264. tegra210_sata_lane_probe(struct tegra_xusb_pad *pad, struct device_node *np,
  1265. unsigned int index)
  1266. {
  1267. struct tegra_xusb_sata_lane *sata;
  1268. int err;
  1269. sata = kzalloc(sizeof(*sata), GFP_KERNEL);
  1270. if (!sata)
  1271. return ERR_PTR(-ENOMEM);
  1272. INIT_LIST_HEAD(&sata->base.list);
  1273. sata->base.soc = &pad->soc->lanes[index];
  1274. sata->base.index = index;
  1275. sata->base.pad = pad;
  1276. sata->base.np = np;
  1277. err = tegra_xusb_lane_parse_dt(&sata->base, np);
  1278. if (err < 0) {
  1279. kfree(sata);
  1280. return ERR_PTR(err);
  1281. }
  1282. return &sata->base;
  1283. }
  1284. static void tegra210_sata_lane_remove(struct tegra_xusb_lane *lane)
  1285. {
  1286. struct tegra_xusb_sata_lane *sata = to_sata_lane(lane);
  1287. kfree(sata);
  1288. }
  1289. static const struct tegra_xusb_lane_ops tegra210_sata_lane_ops = {
  1290. .probe = tegra210_sata_lane_probe,
  1291. .remove = tegra210_sata_lane_remove,
  1292. };
  1293. static int tegra210_sata_phy_init(struct phy *phy)
  1294. {
  1295. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1296. return tegra210_xusb_padctl_enable(lane->pad->padctl);
  1297. }
  1298. static int tegra210_sata_phy_exit(struct phy *phy)
  1299. {
  1300. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1301. return tegra210_xusb_padctl_disable(lane->pad->padctl);
  1302. }
  1303. static int tegra210_sata_phy_power_on(struct phy *phy)
  1304. {
  1305. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1306. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  1307. u32 value;
  1308. int err;
  1309. mutex_lock(&padctl->lock);
  1310. err = tegra210_sata_uphy_enable(padctl, false);
  1311. if (err < 0)
  1312. goto unlock;
  1313. value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
  1314. value |= XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane->index);
  1315. padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
  1316. unlock:
  1317. mutex_unlock(&padctl->lock);
  1318. return err;
  1319. }
  1320. static int tegra210_sata_phy_power_off(struct phy *phy)
  1321. {
  1322. struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
  1323. struct tegra_xusb_padctl *padctl = lane->pad->padctl;
  1324. u32 value;
  1325. value = padctl_readl(padctl, XUSB_PADCTL_USB3_PAD_MUX);
  1326. value &= ~XUSB_PADCTL_USB3_PAD_MUX_SATA_IDDQ_DISABLE(lane->index);
  1327. padctl_writel(padctl, value, XUSB_PADCTL_USB3_PAD_MUX);
  1328. tegra210_sata_uphy_disable(lane->pad->padctl);
  1329. return 0;
  1330. }
  1331. static const struct phy_ops tegra210_sata_phy_ops = {
  1332. .init = tegra210_sata_phy_init,
  1333. .exit = tegra210_sata_phy_exit,
  1334. .power_on = tegra210_sata_phy_power_on,
  1335. .power_off = tegra210_sata_phy_power_off,
  1336. .owner = THIS_MODULE,
  1337. };
  1338. static struct tegra_xusb_pad *
  1339. tegra210_sata_pad_probe(struct tegra_xusb_padctl *padctl,
  1340. const struct tegra_xusb_pad_soc *soc,
  1341. struct device_node *np)
  1342. {
  1343. struct tegra_xusb_sata_pad *sata;
  1344. struct tegra_xusb_pad *pad;
  1345. int err;
  1346. sata = kzalloc(sizeof(*sata), GFP_KERNEL);
  1347. if (!sata)
  1348. return ERR_PTR(-ENOMEM);
  1349. pad = &sata->base;
  1350. pad->ops = &tegra210_sata_lane_ops;
  1351. pad->soc = soc;
  1352. err = tegra_xusb_pad_init(pad, padctl, np);
  1353. if (err < 0) {
  1354. kfree(sata);
  1355. goto out;
  1356. }
  1357. sata->rst = devm_reset_control_get(&pad->dev, "phy");
  1358. if (IS_ERR(sata->rst)) {
  1359. err = PTR_ERR(sata->rst);
  1360. dev_err(&pad->dev, "failed to get SATA pad reset: %d\n", err);
  1361. goto unregister;
  1362. }
  1363. err = tegra_xusb_pad_register(pad, &tegra210_sata_phy_ops);
  1364. if (err < 0)
  1365. goto unregister;
  1366. dev_set_drvdata(&pad->dev, pad);
  1367. return pad;
  1368. unregister:
  1369. device_unregister(&pad->dev);
  1370. out:
  1371. return ERR_PTR(err);
  1372. }
  1373. static void tegra210_sata_pad_remove(struct tegra_xusb_pad *pad)
  1374. {
  1375. struct tegra_xusb_sata_pad *sata = to_sata_pad(pad);
  1376. kfree(sata);
  1377. }
  1378. static const struct tegra_xusb_pad_ops tegra210_sata_ops = {
  1379. .probe = tegra210_sata_pad_probe,
  1380. .remove = tegra210_sata_pad_remove,
  1381. };
  1382. static const struct tegra_xusb_pad_soc tegra210_sata_pad = {
  1383. .name = "sata",
  1384. .num_lanes = ARRAY_SIZE(tegra210_sata_lanes),
  1385. .lanes = tegra210_sata_lanes,
  1386. .ops = &tegra210_sata_ops,
  1387. };
  1388. static const struct tegra_xusb_pad_soc * const tegra210_pads[] = {
  1389. &tegra210_usb2_pad,
  1390. &tegra210_hsic_pad,
  1391. &tegra210_pcie_pad,
  1392. &tegra210_sata_pad,
  1393. };
  1394. static int tegra210_usb2_port_enable(struct tegra_xusb_port *port)
  1395. {
  1396. return 0;
  1397. }
  1398. static void tegra210_usb2_port_disable(struct tegra_xusb_port *port)
  1399. {
  1400. }
  1401. static struct tegra_xusb_lane *
  1402. tegra210_usb2_port_map(struct tegra_xusb_port *port)
  1403. {
  1404. return tegra_xusb_find_lane(port->padctl, "usb2", port->index);
  1405. }
  1406. static const struct tegra_xusb_port_ops tegra210_usb2_port_ops = {
  1407. .enable = tegra210_usb2_port_enable,
  1408. .disable = tegra210_usb2_port_disable,
  1409. .map = tegra210_usb2_port_map,
  1410. };
  1411. static int tegra210_hsic_port_enable(struct tegra_xusb_port *port)
  1412. {
  1413. return 0;
  1414. }
  1415. static void tegra210_hsic_port_disable(struct tegra_xusb_port *port)
  1416. {
  1417. }
  1418. static struct tegra_xusb_lane *
  1419. tegra210_hsic_port_map(struct tegra_xusb_port *port)
  1420. {
  1421. return tegra_xusb_find_lane(port->padctl, "hsic", port->index);
  1422. }
  1423. static const struct tegra_xusb_port_ops tegra210_hsic_port_ops = {
  1424. .enable = tegra210_hsic_port_enable,
  1425. .disable = tegra210_hsic_port_disable,
  1426. .map = tegra210_hsic_port_map,
  1427. };
  1428. static int tegra210_usb3_port_enable(struct tegra_xusb_port *port)
  1429. {
  1430. struct tegra_xusb_usb3_port *usb3 = to_usb3_port(port);
  1431. struct tegra_xusb_padctl *padctl = port->padctl;
  1432. struct tegra_xusb_lane *lane = usb3->base.lane;
  1433. unsigned int index = port->index;
  1434. u32 value;
  1435. int err;
  1436. value = padctl_readl(padctl, XUSB_PADCTL_SS_PORT_MAP);
  1437. if (!usb3->internal)
  1438. value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(index);
  1439. else
  1440. value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_INTERNAL(index);
  1441. value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(index);
  1442. value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(index, usb3->port);
  1443. padctl_writel(padctl, value, XUSB_PADCTL_SS_PORT_MAP);
  1444. /*
  1445. * TODO: move this code into the PCIe/SATA PHY ->power_on() callbacks
  1446. * and conditionalize based on mux function? This seems to work, but
  1447. * might not be the exact proper sequence.
  1448. */
  1449. err = regulator_enable(usb3->supply);
  1450. if (err < 0)
  1451. return err;
  1452. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_USB3_PADX_ECTL1(index));
  1453. value &= ~(XUSB_PADCTL_UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL_MASK <<
  1454. XUSB_PADCTL_UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL_SHIFT);
  1455. value |= XUSB_PADCTL_UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL_VAL <<
  1456. XUSB_PADCTL_UPHY_USB3_PAD_ECTL1_TX_TERM_CTRL_SHIFT;
  1457. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_USB3_PADX_ECTL1(index));
  1458. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_USB3_PADX_ECTL2(index));
  1459. value &= ~(XUSB_PADCTL_UPHY_USB3_PAD_ECTL2_RX_CTLE_MASK <<
  1460. XUSB_PADCTL_UPHY_USB3_PAD_ECTL2_RX_CTLE_SHIFT);
  1461. value |= XUSB_PADCTL_UPHY_USB3_PAD_ECTL2_RX_CTLE_VAL <<
  1462. XUSB_PADCTL_UPHY_USB3_PAD_ECTL2_RX_CTLE_SHIFT;
  1463. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_USB3_PADX_ECTL2(index));
  1464. padctl_writel(padctl, XUSB_PADCTL_UPHY_USB3_PAD_ECTL3_RX_DFE_VAL,
  1465. XUSB_PADCTL_UPHY_USB3_PADX_ECTL3(index));
  1466. value = padctl_readl(padctl, XUSB_PADCTL_UPHY_USB3_PADX_ECTL4(index));
  1467. value &= ~(XUSB_PADCTL_UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL_MASK <<
  1468. XUSB_PADCTL_UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL_SHIFT);
  1469. value |= XUSB_PADCTL_UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL_VAL <<
  1470. XUSB_PADCTL_UPHY_USB3_PAD_ECTL4_RX_CDR_CTRL_SHIFT;
  1471. padctl_writel(padctl, value, XUSB_PADCTL_UPHY_USB3_PADX_ECTL4(index));
  1472. padctl_writel(padctl, XUSB_PADCTL_UPHY_USB3_PAD_ECTL6_RX_EQ_CTRL_H_VAL,
  1473. XUSB_PADCTL_UPHY_USB3_PADX_ECTL6(index));
  1474. if (lane->pad == padctl->sata)
  1475. err = tegra210_sata_uphy_enable(padctl, true);
  1476. else
  1477. err = tegra210_pex_uphy_enable(padctl);
  1478. if (err) {
  1479. dev_err(&port->dev, "%s: failed to enable UPHY: %d\n",
  1480. __func__, err);
  1481. return err;
  1482. }
  1483. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  1484. value &= ~XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_VCORE_DOWN(index);
  1485. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  1486. usleep_range(100, 200);
  1487. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  1488. value &= ~XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_CLAMP_EN_EARLY(index);
  1489. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  1490. usleep_range(100, 200);
  1491. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  1492. value &= ~XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_CLAMP_EN(index);
  1493. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  1494. return 0;
  1495. }
  1496. static void tegra210_usb3_port_disable(struct tegra_xusb_port *port)
  1497. {
  1498. struct tegra_xusb_usb3_port *usb3 = to_usb3_port(port);
  1499. struct tegra_xusb_padctl *padctl = port->padctl;
  1500. struct tegra_xusb_lane *lane = port->lane;
  1501. unsigned int index = port->index;
  1502. u32 value;
  1503. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  1504. value |= XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_CLAMP_EN_EARLY(index);
  1505. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  1506. usleep_range(100, 200);
  1507. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  1508. value |= XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_CLAMP_EN(index);
  1509. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  1510. usleep_range(250, 350);
  1511. value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM1);
  1512. value |= XUSB_PADCTL_ELPG_PROGRAM1_SSPX_ELPG_VCORE_DOWN(index);
  1513. padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM1);
  1514. if (lane->pad == padctl->sata)
  1515. tegra210_sata_uphy_disable(padctl);
  1516. else
  1517. tegra210_pex_uphy_disable(padctl);
  1518. regulator_disable(usb3->supply);
  1519. value = padctl_readl(padctl, XUSB_PADCTL_SS_PORT_MAP);
  1520. value &= ~XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP_MASK(index);
  1521. value |= XUSB_PADCTL_SS_PORT_MAP_PORTX_MAP(index, 0x7);
  1522. padctl_writel(padctl, value, XUSB_PADCTL_SS_PORT_MAP);
  1523. }
  1524. static const struct tegra_xusb_lane_map tegra210_usb3_map[] = {
  1525. { 0, "pcie", 6 },
  1526. { 1, "pcie", 5 },
  1527. { 2, "pcie", 0 },
  1528. { 2, "pcie", 3 },
  1529. { 3, "pcie", 4 },
  1530. { 3, "pcie", 4 },
  1531. { 0, NULL, 0 }
  1532. };
  1533. static struct tegra_xusb_lane *
  1534. tegra210_usb3_port_map(struct tegra_xusb_port *port)
  1535. {
  1536. return tegra_xusb_port_find_lane(port, tegra210_usb3_map, "usb3-ss");
  1537. }
  1538. static const struct tegra_xusb_port_ops tegra210_usb3_port_ops = {
  1539. .enable = tegra210_usb3_port_enable,
  1540. .disable = tegra210_usb3_port_disable,
  1541. .map = tegra210_usb3_port_map,
  1542. };
  1543. static int
  1544. tegra210_xusb_read_fuse_calibration(struct tegra210_xusb_fuse_calibration *fuse)
  1545. {
  1546. unsigned int i;
  1547. u32 value;
  1548. int err;
  1549. err = tegra_fuse_readl(TEGRA_FUSE_SKU_CALIB_0, &value);
  1550. if (err < 0)
  1551. return err;
  1552. for (i = 0; i < ARRAY_SIZE(fuse->hs_curr_level); i++) {
  1553. fuse->hs_curr_level[i] =
  1554. (value >> FUSE_SKU_CALIB_HS_CURR_LEVEL_PADX_SHIFT(i)) &
  1555. FUSE_SKU_CALIB_HS_CURR_LEVEL_PAD_MASK;
  1556. }
  1557. fuse->hs_term_range_adj =
  1558. (value >> FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_SHIFT) &
  1559. FUSE_SKU_CALIB_HS_TERM_RANGE_ADJ_MASK;
  1560. err = tegra_fuse_readl(TEGRA_FUSE_USB_CALIB_EXT_0, &value);
  1561. if (err < 0)
  1562. return err;
  1563. fuse->rpd_ctrl =
  1564. (value >> FUSE_USB_CALIB_EXT_RPD_CTRL_SHIFT) &
  1565. FUSE_USB_CALIB_EXT_RPD_CTRL_MASK;
  1566. return 0;
  1567. }
  1568. static struct tegra_xusb_padctl *
  1569. tegra210_xusb_padctl_probe(struct device *dev,
  1570. const struct tegra_xusb_padctl_soc *soc)
  1571. {
  1572. struct tegra210_xusb_padctl *padctl;
  1573. int err;
  1574. padctl = devm_kzalloc(dev, sizeof(*padctl), GFP_KERNEL);
  1575. if (!padctl)
  1576. return ERR_PTR(-ENOMEM);
  1577. padctl->base.dev = dev;
  1578. padctl->base.soc = soc;
  1579. err = tegra210_xusb_read_fuse_calibration(&padctl->fuse);
  1580. if (err < 0)
  1581. return ERR_PTR(err);
  1582. return &padctl->base;
  1583. }
  1584. static void tegra210_xusb_padctl_remove(struct tegra_xusb_padctl *padctl)
  1585. {
  1586. }
  1587. static const struct tegra_xusb_padctl_ops tegra210_xusb_padctl_ops = {
  1588. .probe = tegra210_xusb_padctl_probe,
  1589. .remove = tegra210_xusb_padctl_remove,
  1590. .usb3_set_lfps_detect = tegra210_usb3_set_lfps_detect,
  1591. .hsic_set_idle = tegra210_hsic_set_idle,
  1592. };
  1593. const struct tegra_xusb_padctl_soc tegra210_xusb_padctl_soc = {
  1594. .num_pads = ARRAY_SIZE(tegra210_pads),
  1595. .pads = tegra210_pads,
  1596. .ports = {
  1597. .usb2 = {
  1598. .ops = &tegra210_usb2_port_ops,
  1599. .count = 4,
  1600. },
  1601. .hsic = {
  1602. .ops = &tegra210_hsic_port_ops,
  1603. .count = 1,
  1604. },
  1605. .usb3 = {
  1606. .ops = &tegra210_usb3_port_ops,
  1607. .count = 4,
  1608. },
  1609. },
  1610. .ops = &tegra210_xusb_padctl_ops,
  1611. };
  1612. EXPORT_SYMBOL_GPL(tegra210_xusb_padctl_soc);
  1613. MODULE_AUTHOR("Andrew Bresticker <abrestic@chromium.org>");
  1614. MODULE_DESCRIPTION("NVIDIA Tegra 210 XUSB Pad Controller driver");
  1615. MODULE_LICENSE("GPL v2");