cs42l42.c 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * cs42l42.c -- CS42L42 ALSA SoC audio driver
  4. *
  5. * Copyright 2016 Cirrus Logic, Inc.
  6. *
  7. * Author: James Schulman <[email protected]>
  8. * Author: Brian Austin <[email protected]>
  9. * Author: Michael White <[email protected]>
  10. */
  11. #include <linux/module.h>
  12. #include <linux/moduleparam.h>
  13. #include <linux/version.h>
  14. #include <linux/types.h>
  15. #include <linux/init.h>
  16. #include <linux/delay.h>
  17. #include <linux/gpio.h>
  18. #include <linux/regmap.h>
  19. #include <linux/slab.h>
  20. #include <linux/acpi.h>
  21. #include <linux/platform_device.h>
  22. #include <linux/property.h>
  23. #include <linux/regulator/consumer.h>
  24. #include <linux/gpio/consumer.h>
  25. #include <linux/of_device.h>
  26. #include <sound/core.h>
  27. #include <sound/pcm.h>
  28. #include <sound/pcm_params.h>
  29. #include <sound/soc.h>
  30. #include <sound/soc-dapm.h>
  31. #include <sound/initval.h>
  32. #include <sound/tlv.h>
  33. #include <dt-bindings/sound/cs42l42.h>
  34. #include "cs42l42.h"
  35. #include "cirrus_legacy.h"
  36. static const char * const cs42l42_supply_names[] = {
  37. "VA",
  38. "VP",
  39. "VCP",
  40. "VD_FILT",
  41. "VL",
  42. };
  43. static const struct reg_default cs42l42_reg_defaults[] = {
  44. { CS42L42_FRZ_CTL, 0x00 },
  45. { CS42L42_SRC_CTL, 0x10 },
  46. { CS42L42_MCLK_CTL, 0x02 },
  47. { CS42L42_SFTRAMP_RATE, 0xA4 },
  48. { CS42L42_SLOW_START_ENABLE, 0x70 },
  49. { CS42L42_I2C_DEBOUNCE, 0x88 },
  50. { CS42L42_I2C_STRETCH, 0x03 },
  51. { CS42L42_I2C_TIMEOUT, 0xB7 },
  52. { CS42L42_PWR_CTL1, 0xFF },
  53. { CS42L42_PWR_CTL2, 0x84 },
  54. { CS42L42_PWR_CTL3, 0x20 },
  55. { CS42L42_RSENSE_CTL1, 0x40 },
  56. { CS42L42_RSENSE_CTL2, 0x00 },
  57. { CS42L42_OSC_SWITCH, 0x00 },
  58. { CS42L42_RSENSE_CTL3, 0x1B },
  59. { CS42L42_TSENSE_CTL, 0x1B },
  60. { CS42L42_TSRS_INT_DISABLE, 0x00 },
  61. { CS42L42_HSDET_CTL1, 0x77 },
  62. { CS42L42_HSDET_CTL2, 0x00 },
  63. { CS42L42_HS_SWITCH_CTL, 0xF3 },
  64. { CS42L42_HS_CLAMP_DISABLE, 0x00 },
  65. { CS42L42_MCLK_SRC_SEL, 0x00 },
  66. { CS42L42_SPDIF_CLK_CFG, 0x00 },
  67. { CS42L42_FSYNC_PW_LOWER, 0x00 },
  68. { CS42L42_FSYNC_PW_UPPER, 0x00 },
  69. { CS42L42_FSYNC_P_LOWER, 0xF9 },
  70. { CS42L42_FSYNC_P_UPPER, 0x00 },
  71. { CS42L42_ASP_CLK_CFG, 0x00 },
  72. { CS42L42_ASP_FRM_CFG, 0x10 },
  73. { CS42L42_FS_RATE_EN, 0x00 },
  74. { CS42L42_IN_ASRC_CLK, 0x00 },
  75. { CS42L42_OUT_ASRC_CLK, 0x00 },
  76. { CS42L42_PLL_DIV_CFG1, 0x00 },
  77. { CS42L42_ADC_OVFL_INT_MASK, 0x01 },
  78. { CS42L42_MIXER_INT_MASK, 0x0F },
  79. { CS42L42_SRC_INT_MASK, 0x0F },
  80. { CS42L42_ASP_RX_INT_MASK, 0x1F },
  81. { CS42L42_ASP_TX_INT_MASK, 0x0F },
  82. { CS42L42_CODEC_INT_MASK, 0x03 },
  83. { CS42L42_SRCPL_INT_MASK, 0x7F },
  84. { CS42L42_VPMON_INT_MASK, 0x01 },
  85. { CS42L42_PLL_LOCK_INT_MASK, 0x01 },
  86. { CS42L42_TSRS_PLUG_INT_MASK, 0x0F },
  87. { CS42L42_PLL_CTL1, 0x00 },
  88. { CS42L42_PLL_DIV_FRAC0, 0x00 },
  89. { CS42L42_PLL_DIV_FRAC1, 0x00 },
  90. { CS42L42_PLL_DIV_FRAC2, 0x00 },
  91. { CS42L42_PLL_DIV_INT, 0x40 },
  92. { CS42L42_PLL_CTL3, 0x10 },
  93. { CS42L42_PLL_CAL_RATIO, 0x80 },
  94. { CS42L42_PLL_CTL4, 0x03 },
  95. { CS42L42_LOAD_DET_EN, 0x00 },
  96. { CS42L42_HSBIAS_SC_AUTOCTL, 0x03 },
  97. { CS42L42_WAKE_CTL, 0xC0 },
  98. { CS42L42_ADC_DISABLE_MUTE, 0x00 },
  99. { CS42L42_TIPSENSE_CTL, 0x02 },
  100. { CS42L42_MISC_DET_CTL, 0x03 },
  101. { CS42L42_MIC_DET_CTL1, 0x1F },
  102. { CS42L42_MIC_DET_CTL2, 0x2F },
  103. { CS42L42_DET_INT1_MASK, 0xE0 },
  104. { CS42L42_DET_INT2_MASK, 0xFF },
  105. { CS42L42_HS_BIAS_CTL, 0xC2 },
  106. { CS42L42_ADC_CTL, 0x00 },
  107. { CS42L42_ADC_VOLUME, 0x00 },
  108. { CS42L42_ADC_WNF_HPF_CTL, 0x71 },
  109. { CS42L42_DAC_CTL1, 0x00 },
  110. { CS42L42_DAC_CTL2, 0x02 },
  111. { CS42L42_HP_CTL, 0x0D },
  112. { CS42L42_CLASSH_CTL, 0x07 },
  113. { CS42L42_MIXER_CHA_VOL, 0x3F },
  114. { CS42L42_MIXER_ADC_VOL, 0x3F },
  115. { CS42L42_MIXER_CHB_VOL, 0x3F },
  116. { CS42L42_EQ_COEF_IN0, 0x00 },
  117. { CS42L42_EQ_COEF_IN1, 0x00 },
  118. { CS42L42_EQ_COEF_IN2, 0x00 },
  119. { CS42L42_EQ_COEF_IN3, 0x00 },
  120. { CS42L42_EQ_COEF_RW, 0x00 },
  121. { CS42L42_EQ_COEF_OUT0, 0x00 },
  122. { CS42L42_EQ_COEF_OUT1, 0x00 },
  123. { CS42L42_EQ_COEF_OUT2, 0x00 },
  124. { CS42L42_EQ_COEF_OUT3, 0x00 },
  125. { CS42L42_EQ_INIT_STAT, 0x00 },
  126. { CS42L42_EQ_START_FILT, 0x00 },
  127. { CS42L42_EQ_MUTE_CTL, 0x00 },
  128. { CS42L42_SP_RX_CH_SEL, 0x04 },
  129. { CS42L42_SP_RX_ISOC_CTL, 0x04 },
  130. { CS42L42_SP_RX_FS, 0x8C },
  131. { CS42l42_SPDIF_CH_SEL, 0x0E },
  132. { CS42L42_SP_TX_ISOC_CTL, 0x04 },
  133. { CS42L42_SP_TX_FS, 0xCC },
  134. { CS42L42_SPDIF_SW_CTL1, 0x3F },
  135. { CS42L42_SRC_SDIN_FS, 0x40 },
  136. { CS42L42_SRC_SDOUT_FS, 0x40 },
  137. { CS42L42_SPDIF_CTL1, 0x01 },
  138. { CS42L42_SPDIF_CTL2, 0x00 },
  139. { CS42L42_SPDIF_CTL3, 0x00 },
  140. { CS42L42_SPDIF_CTL4, 0x42 },
  141. { CS42L42_ASP_TX_SZ_EN, 0x00 },
  142. { CS42L42_ASP_TX_CH_EN, 0x00 },
  143. { CS42L42_ASP_TX_CH_AP_RES, 0x0F },
  144. { CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },
  145. { CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },
  146. { CS42L42_ASP_TX_HIZ_DLY_CFG, 0x00 },
  147. { CS42L42_ASP_TX_CH2_BIT_MSB, 0x00 },
  148. { CS42L42_ASP_TX_CH2_BIT_LSB, 0x00 },
  149. { CS42L42_ASP_RX_DAI0_EN, 0x00 },
  150. { CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x03 },
  151. { CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },
  152. { CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x00 },
  153. { CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x03 },
  154. { CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },
  155. { CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0x00 },
  156. { CS42L42_ASP_RX_DAI0_CH3_AP_RES, 0x03 },
  157. { CS42L42_ASP_RX_DAI0_CH3_BIT_MSB, 0x00 },
  158. { CS42L42_ASP_RX_DAI0_CH3_BIT_LSB, 0x00 },
  159. { CS42L42_ASP_RX_DAI0_CH4_AP_RES, 0x03 },
  160. { CS42L42_ASP_RX_DAI0_CH4_BIT_MSB, 0x00 },
  161. { CS42L42_ASP_RX_DAI0_CH4_BIT_LSB, 0x00 },
  162. { CS42L42_ASP_RX_DAI1_CH1_AP_RES, 0x03 },
  163. { CS42L42_ASP_RX_DAI1_CH1_BIT_MSB, 0x00 },
  164. { CS42L42_ASP_RX_DAI1_CH1_BIT_LSB, 0x00 },
  165. { CS42L42_ASP_RX_DAI1_CH2_AP_RES, 0x03 },
  166. { CS42L42_ASP_RX_DAI1_CH2_BIT_MSB, 0x00 },
  167. { CS42L42_ASP_RX_DAI1_CH2_BIT_LSB, 0x00 },
  168. };
  169. bool cs42l42_readable_register(struct device *dev, unsigned int reg)
  170. {
  171. switch (reg) {
  172. case CS42L42_PAGE_REGISTER:
  173. case CS42L42_DEVID_AB:
  174. case CS42L42_DEVID_CD:
  175. case CS42L42_DEVID_E:
  176. case CS42L42_FABID:
  177. case CS42L42_REVID:
  178. case CS42L42_FRZ_CTL:
  179. case CS42L42_SRC_CTL:
  180. case CS42L42_MCLK_STATUS:
  181. case CS42L42_MCLK_CTL:
  182. case CS42L42_SFTRAMP_RATE:
  183. case CS42L42_SLOW_START_ENABLE:
  184. case CS42L42_I2C_DEBOUNCE:
  185. case CS42L42_I2C_STRETCH:
  186. case CS42L42_I2C_TIMEOUT:
  187. case CS42L42_PWR_CTL1:
  188. case CS42L42_PWR_CTL2:
  189. case CS42L42_PWR_CTL3:
  190. case CS42L42_RSENSE_CTL1:
  191. case CS42L42_RSENSE_CTL2:
  192. case CS42L42_OSC_SWITCH:
  193. case CS42L42_OSC_SWITCH_STATUS:
  194. case CS42L42_RSENSE_CTL3:
  195. case CS42L42_TSENSE_CTL:
  196. case CS42L42_TSRS_INT_DISABLE:
  197. case CS42L42_TRSENSE_STATUS:
  198. case CS42L42_HSDET_CTL1:
  199. case CS42L42_HSDET_CTL2:
  200. case CS42L42_HS_SWITCH_CTL:
  201. case CS42L42_HS_DET_STATUS:
  202. case CS42L42_HS_CLAMP_DISABLE:
  203. case CS42L42_MCLK_SRC_SEL:
  204. case CS42L42_SPDIF_CLK_CFG:
  205. case CS42L42_FSYNC_PW_LOWER:
  206. case CS42L42_FSYNC_PW_UPPER:
  207. case CS42L42_FSYNC_P_LOWER:
  208. case CS42L42_FSYNC_P_UPPER:
  209. case CS42L42_ASP_CLK_CFG:
  210. case CS42L42_ASP_FRM_CFG:
  211. case CS42L42_FS_RATE_EN:
  212. case CS42L42_IN_ASRC_CLK:
  213. case CS42L42_OUT_ASRC_CLK:
  214. case CS42L42_PLL_DIV_CFG1:
  215. case CS42L42_ADC_OVFL_STATUS:
  216. case CS42L42_MIXER_STATUS:
  217. case CS42L42_SRC_STATUS:
  218. case CS42L42_ASP_RX_STATUS:
  219. case CS42L42_ASP_TX_STATUS:
  220. case CS42L42_CODEC_STATUS:
  221. case CS42L42_DET_INT_STATUS1:
  222. case CS42L42_DET_INT_STATUS2:
  223. case CS42L42_SRCPL_INT_STATUS:
  224. case CS42L42_VPMON_STATUS:
  225. case CS42L42_PLL_LOCK_STATUS:
  226. case CS42L42_TSRS_PLUG_STATUS:
  227. case CS42L42_ADC_OVFL_INT_MASK:
  228. case CS42L42_MIXER_INT_MASK:
  229. case CS42L42_SRC_INT_MASK:
  230. case CS42L42_ASP_RX_INT_MASK:
  231. case CS42L42_ASP_TX_INT_MASK:
  232. case CS42L42_CODEC_INT_MASK:
  233. case CS42L42_SRCPL_INT_MASK:
  234. case CS42L42_VPMON_INT_MASK:
  235. case CS42L42_PLL_LOCK_INT_MASK:
  236. case CS42L42_TSRS_PLUG_INT_MASK:
  237. case CS42L42_PLL_CTL1:
  238. case CS42L42_PLL_DIV_FRAC0:
  239. case CS42L42_PLL_DIV_FRAC1:
  240. case CS42L42_PLL_DIV_FRAC2:
  241. case CS42L42_PLL_DIV_INT:
  242. case CS42L42_PLL_CTL3:
  243. case CS42L42_PLL_CAL_RATIO:
  244. case CS42L42_PLL_CTL4:
  245. case CS42L42_LOAD_DET_RCSTAT:
  246. case CS42L42_LOAD_DET_DONE:
  247. case CS42L42_LOAD_DET_EN:
  248. case CS42L42_HSBIAS_SC_AUTOCTL:
  249. case CS42L42_WAKE_CTL:
  250. case CS42L42_ADC_DISABLE_MUTE:
  251. case CS42L42_TIPSENSE_CTL:
  252. case CS42L42_MISC_DET_CTL:
  253. case CS42L42_MIC_DET_CTL1:
  254. case CS42L42_MIC_DET_CTL2:
  255. case CS42L42_DET_STATUS1:
  256. case CS42L42_DET_STATUS2:
  257. case CS42L42_DET_INT1_MASK:
  258. case CS42L42_DET_INT2_MASK:
  259. case CS42L42_HS_BIAS_CTL:
  260. case CS42L42_ADC_CTL:
  261. case CS42L42_ADC_VOLUME:
  262. case CS42L42_ADC_WNF_HPF_CTL:
  263. case CS42L42_DAC_CTL1:
  264. case CS42L42_DAC_CTL2:
  265. case CS42L42_HP_CTL:
  266. case CS42L42_CLASSH_CTL:
  267. case CS42L42_MIXER_CHA_VOL:
  268. case CS42L42_MIXER_ADC_VOL:
  269. case CS42L42_MIXER_CHB_VOL:
  270. case CS42L42_EQ_COEF_IN0:
  271. case CS42L42_EQ_COEF_IN1:
  272. case CS42L42_EQ_COEF_IN2:
  273. case CS42L42_EQ_COEF_IN3:
  274. case CS42L42_EQ_COEF_RW:
  275. case CS42L42_EQ_COEF_OUT0:
  276. case CS42L42_EQ_COEF_OUT1:
  277. case CS42L42_EQ_COEF_OUT2:
  278. case CS42L42_EQ_COEF_OUT3:
  279. case CS42L42_EQ_INIT_STAT:
  280. case CS42L42_EQ_START_FILT:
  281. case CS42L42_EQ_MUTE_CTL:
  282. case CS42L42_SP_RX_CH_SEL:
  283. case CS42L42_SP_RX_ISOC_CTL:
  284. case CS42L42_SP_RX_FS:
  285. case CS42l42_SPDIF_CH_SEL:
  286. case CS42L42_SP_TX_ISOC_CTL:
  287. case CS42L42_SP_TX_FS:
  288. case CS42L42_SPDIF_SW_CTL1:
  289. case CS42L42_SRC_SDIN_FS:
  290. case CS42L42_SRC_SDOUT_FS:
  291. case CS42L42_SPDIF_CTL1:
  292. case CS42L42_SPDIF_CTL2:
  293. case CS42L42_SPDIF_CTL3:
  294. case CS42L42_SPDIF_CTL4:
  295. case CS42L42_ASP_TX_SZ_EN:
  296. case CS42L42_ASP_TX_CH_EN:
  297. case CS42L42_ASP_TX_CH_AP_RES:
  298. case CS42L42_ASP_TX_CH1_BIT_MSB:
  299. case CS42L42_ASP_TX_CH1_BIT_LSB:
  300. case CS42L42_ASP_TX_HIZ_DLY_CFG:
  301. case CS42L42_ASP_TX_CH2_BIT_MSB:
  302. case CS42L42_ASP_TX_CH2_BIT_LSB:
  303. case CS42L42_ASP_RX_DAI0_EN:
  304. case CS42L42_ASP_RX_DAI0_CH1_AP_RES:
  305. case CS42L42_ASP_RX_DAI0_CH1_BIT_MSB:
  306. case CS42L42_ASP_RX_DAI0_CH1_BIT_LSB:
  307. case CS42L42_ASP_RX_DAI0_CH2_AP_RES:
  308. case CS42L42_ASP_RX_DAI0_CH2_BIT_MSB:
  309. case CS42L42_ASP_RX_DAI0_CH2_BIT_LSB:
  310. case CS42L42_ASP_RX_DAI0_CH3_AP_RES:
  311. case CS42L42_ASP_RX_DAI0_CH3_BIT_MSB:
  312. case CS42L42_ASP_RX_DAI0_CH3_BIT_LSB:
  313. case CS42L42_ASP_RX_DAI0_CH4_AP_RES:
  314. case CS42L42_ASP_RX_DAI0_CH4_BIT_MSB:
  315. case CS42L42_ASP_RX_DAI0_CH4_BIT_LSB:
  316. case CS42L42_ASP_RX_DAI1_CH1_AP_RES:
  317. case CS42L42_ASP_RX_DAI1_CH1_BIT_MSB:
  318. case CS42L42_ASP_RX_DAI1_CH1_BIT_LSB:
  319. case CS42L42_ASP_RX_DAI1_CH2_AP_RES:
  320. case CS42L42_ASP_RX_DAI1_CH2_BIT_MSB:
  321. case CS42L42_ASP_RX_DAI1_CH2_BIT_LSB:
  322. case CS42L42_SUB_REVID:
  323. return true;
  324. default:
  325. return false;
  326. }
  327. }
  328. EXPORT_SYMBOL_NS_GPL(cs42l42_readable_register, SND_SOC_CS42L42_CORE);
  329. bool cs42l42_volatile_register(struct device *dev, unsigned int reg)
  330. {
  331. switch (reg) {
  332. case CS42L42_DEVID_AB:
  333. case CS42L42_DEVID_CD:
  334. case CS42L42_DEVID_E:
  335. case CS42L42_MCLK_STATUS:
  336. case CS42L42_OSC_SWITCH_STATUS:
  337. case CS42L42_TRSENSE_STATUS:
  338. case CS42L42_HS_DET_STATUS:
  339. case CS42L42_ADC_OVFL_STATUS:
  340. case CS42L42_MIXER_STATUS:
  341. case CS42L42_SRC_STATUS:
  342. case CS42L42_ASP_RX_STATUS:
  343. case CS42L42_ASP_TX_STATUS:
  344. case CS42L42_CODEC_STATUS:
  345. case CS42L42_DET_INT_STATUS1:
  346. case CS42L42_DET_INT_STATUS2:
  347. case CS42L42_SRCPL_INT_STATUS:
  348. case CS42L42_VPMON_STATUS:
  349. case CS42L42_PLL_LOCK_STATUS:
  350. case CS42L42_TSRS_PLUG_STATUS:
  351. case CS42L42_LOAD_DET_RCSTAT:
  352. case CS42L42_LOAD_DET_DONE:
  353. case CS42L42_DET_STATUS1:
  354. case CS42L42_DET_STATUS2:
  355. return true;
  356. default:
  357. return false;
  358. }
  359. }
  360. EXPORT_SYMBOL_NS_GPL(cs42l42_volatile_register, SND_SOC_CS42L42_CORE);
  361. const struct regmap_range_cfg cs42l42_page_range = {
  362. .name = "Pages",
  363. .range_min = 0,
  364. .range_max = CS42L42_MAX_REGISTER,
  365. .selector_reg = CS42L42_PAGE_REGISTER,
  366. .selector_mask = 0xff,
  367. .selector_shift = 0,
  368. .window_start = 0,
  369. .window_len = 256,
  370. };
  371. EXPORT_SYMBOL_NS_GPL(cs42l42_page_range, SND_SOC_CS42L42_CORE);
  372. const struct regmap_config cs42l42_regmap = {
  373. .reg_bits = 8,
  374. .val_bits = 8,
  375. .readable_reg = cs42l42_readable_register,
  376. .volatile_reg = cs42l42_volatile_register,
  377. .ranges = &cs42l42_page_range,
  378. .num_ranges = 1,
  379. .max_register = CS42L42_MAX_REGISTER,
  380. .reg_defaults = cs42l42_reg_defaults,
  381. .num_reg_defaults = ARRAY_SIZE(cs42l42_reg_defaults),
  382. .cache_type = REGCACHE_RBTREE,
  383. .use_single_read = true,
  384. .use_single_write = true,
  385. };
  386. EXPORT_SYMBOL_NS_GPL(cs42l42_regmap, SND_SOC_CS42L42_CORE);
  387. static DECLARE_TLV_DB_SCALE(adc_tlv, -9700, 100, true);
  388. static DECLARE_TLV_DB_SCALE(mixer_tlv, -6300, 100, true);
  389. static int cs42l42_slow_start_put(struct snd_kcontrol *kcontrol,
  390. struct snd_ctl_elem_value *ucontrol)
  391. {
  392. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  393. u8 val;
  394. /* all bits of SLOW_START_EN must change together */
  395. switch (ucontrol->value.integer.value[0]) {
  396. case 0:
  397. val = 0;
  398. break;
  399. case 1:
  400. val = CS42L42_SLOW_START_EN_MASK;
  401. break;
  402. default:
  403. return -EINVAL;
  404. }
  405. return snd_soc_component_update_bits(component, CS42L42_SLOW_START_ENABLE,
  406. CS42L42_SLOW_START_EN_MASK, val);
  407. }
  408. static const char * const cs42l42_hpf_freq_text[] = {
  409. "1.86Hz", "120Hz", "235Hz", "466Hz"
  410. };
  411. static SOC_ENUM_SINGLE_DECL(cs42l42_hpf_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
  412. CS42L42_ADC_HPF_CF_SHIFT,
  413. cs42l42_hpf_freq_text);
  414. static const char * const cs42l42_wnf3_freq_text[] = {
  415. "160Hz", "180Hz", "200Hz", "220Hz",
  416. "240Hz", "260Hz", "280Hz", "300Hz"
  417. };
  418. static SOC_ENUM_SINGLE_DECL(cs42l42_wnf3_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
  419. CS42L42_ADC_WNF_CF_SHIFT,
  420. cs42l42_wnf3_freq_text);
  421. static const struct snd_kcontrol_new cs42l42_snd_controls[] = {
  422. /* ADC Volume and Filter Controls */
  423. SOC_SINGLE("ADC Notch Switch", CS42L42_ADC_CTL,
  424. CS42L42_ADC_NOTCH_DIS_SHIFT, true, true),
  425. SOC_SINGLE("ADC Weak Force Switch", CS42L42_ADC_CTL,
  426. CS42L42_ADC_FORCE_WEAK_VCM_SHIFT, true, false),
  427. SOC_SINGLE("ADC Invert Switch", CS42L42_ADC_CTL,
  428. CS42L42_ADC_INV_SHIFT, true, false),
  429. SOC_SINGLE("ADC Boost Switch", CS42L42_ADC_CTL,
  430. CS42L42_ADC_DIG_BOOST_SHIFT, true, false),
  431. SOC_SINGLE_S8_TLV("ADC Volume", CS42L42_ADC_VOLUME, -97, 12, adc_tlv),
  432. SOC_SINGLE("ADC WNF Switch", CS42L42_ADC_WNF_HPF_CTL,
  433. CS42L42_ADC_WNF_EN_SHIFT, true, false),
  434. SOC_SINGLE("ADC HPF Switch", CS42L42_ADC_WNF_HPF_CTL,
  435. CS42L42_ADC_HPF_EN_SHIFT, true, false),
  436. SOC_ENUM("HPF Corner Freq", cs42l42_hpf_freq_enum),
  437. SOC_ENUM("WNF 3dB Freq", cs42l42_wnf3_freq_enum),
  438. /* DAC Volume and Filter Controls */
  439. SOC_SINGLE("DACA Invert Switch", CS42L42_DAC_CTL1,
  440. CS42L42_DACA_INV_SHIFT, true, false),
  441. SOC_SINGLE("DACB Invert Switch", CS42L42_DAC_CTL1,
  442. CS42L42_DACB_INV_SHIFT, true, false),
  443. SOC_SINGLE("DAC HPF Switch", CS42L42_DAC_CTL2,
  444. CS42L42_DAC_HPF_EN_SHIFT, true, false),
  445. SOC_DOUBLE_R_TLV("Mixer Volume", CS42L42_MIXER_CHA_VOL,
  446. CS42L42_MIXER_CHB_VOL, CS42L42_MIXER_CH_VOL_SHIFT,
  447. 0x3f, 1, mixer_tlv),
  448. SOC_SINGLE_EXT("Slow Start Switch", CS42L42_SLOW_START_ENABLE,
  449. CS42L42_SLOW_START_EN_SHIFT, true, false,
  450. snd_soc_get_volsw, cs42l42_slow_start_put),
  451. };
  452. static int cs42l42_hp_adc_ev(struct snd_soc_dapm_widget *w,
  453. struct snd_kcontrol *kcontrol, int event)
  454. {
  455. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  456. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  457. switch (event) {
  458. case SND_SOC_DAPM_PRE_PMU:
  459. cs42l42->hp_adc_up_pending = true;
  460. break;
  461. case SND_SOC_DAPM_POST_PMU:
  462. /* Only need one delay if HP and ADC are both powering-up */
  463. if (cs42l42->hp_adc_up_pending) {
  464. usleep_range(CS42L42_HP_ADC_EN_TIME_US,
  465. CS42L42_HP_ADC_EN_TIME_US + 1000);
  466. cs42l42->hp_adc_up_pending = false;
  467. }
  468. break;
  469. default:
  470. break;
  471. }
  472. return 0;
  473. }
  474. static const struct snd_soc_dapm_widget cs42l42_dapm_widgets[] = {
  475. /* Playback Path */
  476. SND_SOC_DAPM_OUTPUT("HP"),
  477. SND_SOC_DAPM_DAC_E("DAC", NULL, CS42L42_PWR_CTL1, CS42L42_HP_PDN_SHIFT, 1,
  478. cs42l42_hp_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  479. SND_SOC_DAPM_MIXER("MIXER", CS42L42_PWR_CTL1, CS42L42_MIXER_PDN_SHIFT, 1, NULL, 0),
  480. SND_SOC_DAPM_AIF_IN("SDIN1", NULL, 0, SND_SOC_NOPM, 0, 0),
  481. SND_SOC_DAPM_AIF_IN("SDIN2", NULL, 1, SND_SOC_NOPM, 0, 0),
  482. /* Playback Requirements */
  483. SND_SOC_DAPM_SUPPLY("ASP DAI0", CS42L42_PWR_CTL1, CS42L42_ASP_DAI_PDN_SHIFT, 1, NULL, 0),
  484. /* Capture Path */
  485. SND_SOC_DAPM_INPUT("HS"),
  486. SND_SOC_DAPM_ADC_E("ADC", NULL, CS42L42_PWR_CTL1, CS42L42_ADC_PDN_SHIFT, 1,
  487. cs42l42_hp_adc_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  488. SND_SOC_DAPM_AIF_OUT("SDOUT1", NULL, 0, CS42L42_ASP_TX_CH_EN, CS42L42_ASP_TX0_CH1_SHIFT, 0),
  489. SND_SOC_DAPM_AIF_OUT("SDOUT2", NULL, 1, CS42L42_ASP_TX_CH_EN, CS42L42_ASP_TX0_CH2_SHIFT, 0),
  490. /* Capture Requirements */
  491. SND_SOC_DAPM_SUPPLY("ASP DAO0", CS42L42_PWR_CTL1, CS42L42_ASP_DAO_PDN_SHIFT, 1, NULL, 0),
  492. SND_SOC_DAPM_SUPPLY("ASP TX EN", CS42L42_ASP_TX_SZ_EN, CS42L42_ASP_TX_EN_SHIFT, 0, NULL, 0),
  493. /* Playback/Capture Requirements */
  494. SND_SOC_DAPM_SUPPLY("SCLK", CS42L42_ASP_CLK_CFG, CS42L42_ASP_SCLK_EN_SHIFT, 0, NULL, 0),
  495. };
  496. static const struct snd_soc_dapm_route cs42l42_audio_map[] = {
  497. /* Playback Path */
  498. {"HP", NULL, "DAC"},
  499. {"DAC", NULL, "MIXER"},
  500. {"MIXER", NULL, "SDIN1"},
  501. {"MIXER", NULL, "SDIN2"},
  502. {"SDIN1", NULL, "Playback"},
  503. {"SDIN2", NULL, "Playback"},
  504. /* Playback Requirements */
  505. {"SDIN1", NULL, "ASP DAI0"},
  506. {"SDIN2", NULL, "ASP DAI0"},
  507. {"SDIN1", NULL, "SCLK"},
  508. {"SDIN2", NULL, "SCLK"},
  509. /* Capture Path */
  510. {"ADC", NULL, "HS"},
  511. { "SDOUT1", NULL, "ADC" },
  512. { "SDOUT2", NULL, "ADC" },
  513. { "Capture", NULL, "SDOUT1" },
  514. { "Capture", NULL, "SDOUT2" },
  515. /* Capture Requirements */
  516. { "SDOUT1", NULL, "ASP DAO0" },
  517. { "SDOUT2", NULL, "ASP DAO0" },
  518. { "SDOUT1", NULL, "SCLK" },
  519. { "SDOUT2", NULL, "SCLK" },
  520. { "SDOUT1", NULL, "ASP TX EN" },
  521. { "SDOUT2", NULL, "ASP TX EN" },
  522. };
  523. static int cs42l42_set_jack(struct snd_soc_component *component, struct snd_soc_jack *jk, void *d)
  524. {
  525. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  526. /* Prevent race with interrupt handler */
  527. mutex_lock(&cs42l42->irq_lock);
  528. cs42l42->jack = jk;
  529. if (jk) {
  530. switch (cs42l42->hs_type) {
  531. case CS42L42_PLUG_CTIA:
  532. case CS42L42_PLUG_OMTP:
  533. snd_soc_jack_report(jk, SND_JACK_HEADSET, SND_JACK_HEADSET);
  534. break;
  535. case CS42L42_PLUG_HEADPHONE:
  536. snd_soc_jack_report(jk, SND_JACK_HEADPHONE, SND_JACK_HEADPHONE);
  537. break;
  538. default:
  539. break;
  540. }
  541. }
  542. mutex_unlock(&cs42l42->irq_lock);
  543. return 0;
  544. }
  545. const struct snd_soc_component_driver cs42l42_soc_component = {
  546. .set_jack = cs42l42_set_jack,
  547. .dapm_widgets = cs42l42_dapm_widgets,
  548. .num_dapm_widgets = ARRAY_SIZE(cs42l42_dapm_widgets),
  549. .dapm_routes = cs42l42_audio_map,
  550. .num_dapm_routes = ARRAY_SIZE(cs42l42_audio_map),
  551. .controls = cs42l42_snd_controls,
  552. .num_controls = ARRAY_SIZE(cs42l42_snd_controls),
  553. .idle_bias_on = 1,
  554. .endianness = 1,
  555. };
  556. EXPORT_SYMBOL_NS_GPL(cs42l42_soc_component, SND_SOC_CS42L42_CORE);
  557. /* Switch to SCLK. Atomic delay after the write to allow the switch to complete. */
  558. static const struct reg_sequence cs42l42_to_sclk_seq[] = {
  559. {
  560. .reg = CS42L42_OSC_SWITCH,
  561. .def = CS42L42_SCLK_PRESENT_MASK,
  562. .delay_us = CS42L42_CLOCK_SWITCH_DELAY_US,
  563. },
  564. };
  565. /* Switch to OSC. Atomic delay after the write to allow the switch to complete. */
  566. static const struct reg_sequence cs42l42_to_osc_seq[] = {
  567. {
  568. .reg = CS42L42_OSC_SWITCH,
  569. .def = 0,
  570. .delay_us = CS42L42_CLOCK_SWITCH_DELAY_US,
  571. },
  572. };
  573. struct cs42l42_pll_params {
  574. u32 sclk;
  575. u8 mclk_src_sel;
  576. u8 sclk_prediv;
  577. u8 pll_div_int;
  578. u32 pll_div_frac;
  579. u8 pll_mode;
  580. u8 pll_divout;
  581. u32 mclk_int;
  582. u8 pll_cal_ratio;
  583. u8 n;
  584. };
  585. /*
  586. * Common PLL Settings for given SCLK
  587. * Table 4-5 from the Datasheet
  588. */
  589. static const struct cs42l42_pll_params pll_ratio_table[] = {
  590. { 1411200, 1, 0x00, 0x80, 0x000000, 0x03, 0x10, 11289600, 128, 2},
  591. { 1536000, 1, 0x00, 0x7D, 0x000000, 0x03, 0x10, 12000000, 125, 2},
  592. { 2304000, 1, 0x00, 0x55, 0xC00000, 0x02, 0x10, 12288000, 85, 2},
  593. { 2400000, 1, 0x00, 0x50, 0x000000, 0x03, 0x10, 12000000, 80, 2},
  594. { 2822400, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
  595. { 3000000, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
  596. { 3072000, 1, 0x00, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
  597. { 4000000, 1, 0x00, 0x30, 0x800000, 0x03, 0x10, 12000000, 96, 1},
  598. { 4096000, 1, 0x00, 0x2E, 0xE00000, 0x03, 0x10, 12000000, 94, 1},
  599. { 5644800, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
  600. { 6000000, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
  601. { 6144000, 1, 0x01, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125, 1},
  602. { 11289600, 0, 0, 0, 0, 0, 0, 11289600, 0, 1},
  603. { 12000000, 0, 0, 0, 0, 0, 0, 12000000, 0, 1},
  604. { 12288000, 0, 0, 0, 0, 0, 0, 12288000, 0, 1},
  605. { 22579200, 1, 0x03, 0x40, 0x000000, 0x03, 0x10, 11289600, 128, 1},
  606. { 24000000, 1, 0x03, 0x40, 0x000000, 0x03, 0x10, 12000000, 128, 1},
  607. { 24576000, 1, 0x03, 0x40, 0x000000, 0x03, 0x10, 12288000, 128, 1}
  608. };
  609. static int cs42l42_pll_config(struct snd_soc_component *component, unsigned int clk)
  610. {
  611. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  612. int i;
  613. u32 fsync;
  614. /* Don't reconfigure if there is an audio stream running */
  615. if (cs42l42->stream_use) {
  616. if (pll_ratio_table[cs42l42->pll_config].sclk == clk)
  617. return 0;
  618. else
  619. return -EBUSY;
  620. }
  621. for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
  622. if (pll_ratio_table[i].sclk == clk) {
  623. cs42l42->pll_config = i;
  624. /* Configure the internal sample rate */
  625. snd_soc_component_update_bits(component, CS42L42_MCLK_CTL,
  626. CS42L42_INTERNAL_FS_MASK,
  627. ((pll_ratio_table[i].mclk_int !=
  628. 12000000) &&
  629. (pll_ratio_table[i].mclk_int !=
  630. 24000000)) <<
  631. CS42L42_INTERNAL_FS_SHIFT);
  632. /* Set up the LRCLK */
  633. fsync = clk / cs42l42->srate;
  634. if (((fsync * cs42l42->srate) != clk)
  635. || ((fsync % 2) != 0)) {
  636. dev_err(component->dev,
  637. "Unsupported sclk %d/sample rate %d\n",
  638. clk,
  639. cs42l42->srate);
  640. return -EINVAL;
  641. }
  642. /* Set the LRCLK period */
  643. snd_soc_component_update_bits(component,
  644. CS42L42_FSYNC_P_LOWER,
  645. CS42L42_FSYNC_PERIOD_MASK,
  646. CS42L42_FRAC0_VAL(fsync - 1) <<
  647. CS42L42_FSYNC_PERIOD_SHIFT);
  648. snd_soc_component_update_bits(component,
  649. CS42L42_FSYNC_P_UPPER,
  650. CS42L42_FSYNC_PERIOD_MASK,
  651. CS42L42_FRAC1_VAL(fsync - 1) <<
  652. CS42L42_FSYNC_PERIOD_SHIFT);
  653. /* Set the LRCLK to 50% duty cycle */
  654. fsync = fsync / 2;
  655. snd_soc_component_update_bits(component,
  656. CS42L42_FSYNC_PW_LOWER,
  657. CS42L42_FSYNC_PULSE_WIDTH_MASK,
  658. CS42L42_FRAC0_VAL(fsync - 1) <<
  659. CS42L42_FSYNC_PULSE_WIDTH_SHIFT);
  660. snd_soc_component_update_bits(component,
  661. CS42L42_FSYNC_PW_UPPER,
  662. CS42L42_FSYNC_PULSE_WIDTH_MASK,
  663. CS42L42_FRAC1_VAL(fsync - 1) <<
  664. CS42L42_FSYNC_PULSE_WIDTH_SHIFT);
  665. if (pll_ratio_table[i].mclk_src_sel == 0) {
  666. /* Pass the clock straight through */
  667. snd_soc_component_update_bits(component,
  668. CS42L42_PLL_CTL1,
  669. CS42L42_PLL_START_MASK, 0);
  670. } else {
  671. /* Configure PLL per table 4-5 */
  672. snd_soc_component_update_bits(component,
  673. CS42L42_PLL_DIV_CFG1,
  674. CS42L42_SCLK_PREDIV_MASK,
  675. pll_ratio_table[i].sclk_prediv
  676. << CS42L42_SCLK_PREDIV_SHIFT);
  677. snd_soc_component_update_bits(component,
  678. CS42L42_PLL_DIV_INT,
  679. CS42L42_PLL_DIV_INT_MASK,
  680. pll_ratio_table[i].pll_div_int
  681. << CS42L42_PLL_DIV_INT_SHIFT);
  682. snd_soc_component_update_bits(component,
  683. CS42L42_PLL_DIV_FRAC0,
  684. CS42L42_PLL_DIV_FRAC_MASK,
  685. CS42L42_FRAC0_VAL(
  686. pll_ratio_table[i].pll_div_frac)
  687. << CS42L42_PLL_DIV_FRAC_SHIFT);
  688. snd_soc_component_update_bits(component,
  689. CS42L42_PLL_DIV_FRAC1,
  690. CS42L42_PLL_DIV_FRAC_MASK,
  691. CS42L42_FRAC1_VAL(
  692. pll_ratio_table[i].pll_div_frac)
  693. << CS42L42_PLL_DIV_FRAC_SHIFT);
  694. snd_soc_component_update_bits(component,
  695. CS42L42_PLL_DIV_FRAC2,
  696. CS42L42_PLL_DIV_FRAC_MASK,
  697. CS42L42_FRAC2_VAL(
  698. pll_ratio_table[i].pll_div_frac)
  699. << CS42L42_PLL_DIV_FRAC_SHIFT);
  700. snd_soc_component_update_bits(component,
  701. CS42L42_PLL_CTL4,
  702. CS42L42_PLL_MODE_MASK,
  703. pll_ratio_table[i].pll_mode
  704. << CS42L42_PLL_MODE_SHIFT);
  705. snd_soc_component_update_bits(component,
  706. CS42L42_PLL_CTL3,
  707. CS42L42_PLL_DIVOUT_MASK,
  708. (pll_ratio_table[i].pll_divout * pll_ratio_table[i].n)
  709. << CS42L42_PLL_DIVOUT_SHIFT);
  710. snd_soc_component_update_bits(component,
  711. CS42L42_PLL_CAL_RATIO,
  712. CS42L42_PLL_CAL_RATIO_MASK,
  713. pll_ratio_table[i].pll_cal_ratio
  714. << CS42L42_PLL_CAL_RATIO_SHIFT);
  715. }
  716. return 0;
  717. }
  718. }
  719. return -EINVAL;
  720. }
  721. static void cs42l42_src_config(struct snd_soc_component *component, unsigned int sample_rate)
  722. {
  723. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  724. unsigned int fs;
  725. /* Don't reconfigure if there is an audio stream running */
  726. if (cs42l42->stream_use)
  727. return;
  728. /* SRC MCLK must be as close as possible to 125 * sample rate */
  729. if (sample_rate <= 48000)
  730. fs = CS42L42_CLK_IASRC_SEL_6;
  731. else
  732. fs = CS42L42_CLK_IASRC_SEL_12;
  733. /* Set the sample rates (96k or lower) */
  734. snd_soc_component_update_bits(component,
  735. CS42L42_FS_RATE_EN,
  736. CS42L42_FS_EN_MASK,
  737. (CS42L42_FS_EN_IASRC_96K |
  738. CS42L42_FS_EN_OASRC_96K) <<
  739. CS42L42_FS_EN_SHIFT);
  740. snd_soc_component_update_bits(component,
  741. CS42L42_IN_ASRC_CLK,
  742. CS42L42_CLK_IASRC_SEL_MASK,
  743. fs << CS42L42_CLK_IASRC_SEL_SHIFT);
  744. snd_soc_component_update_bits(component,
  745. CS42L42_OUT_ASRC_CLK,
  746. CS42L42_CLK_OASRC_SEL_MASK,
  747. fs << CS42L42_CLK_OASRC_SEL_SHIFT);
  748. }
  749. static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
  750. {
  751. struct snd_soc_component *component = codec_dai->component;
  752. u32 asp_cfg_val = 0;
  753. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  754. case SND_SOC_DAIFMT_CBS_CFM:
  755. asp_cfg_val |= CS42L42_ASP_MASTER_MODE <<
  756. CS42L42_ASP_MODE_SHIFT;
  757. break;
  758. case SND_SOC_DAIFMT_CBS_CFS:
  759. asp_cfg_val |= CS42L42_ASP_SLAVE_MODE <<
  760. CS42L42_ASP_MODE_SHIFT;
  761. break;
  762. default:
  763. return -EINVAL;
  764. }
  765. /* interface format */
  766. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  767. case SND_SOC_DAIFMT_I2S:
  768. /*
  769. * 5050 mode, frame starts on falling edge of LRCLK,
  770. * frame delayed by 1.0 SCLKs
  771. */
  772. snd_soc_component_update_bits(component,
  773. CS42L42_ASP_FRM_CFG,
  774. CS42L42_ASP_STP_MASK |
  775. CS42L42_ASP_5050_MASK |
  776. CS42L42_ASP_FSD_MASK,
  777. CS42L42_ASP_5050_MASK |
  778. (CS42L42_ASP_FSD_1_0 <<
  779. CS42L42_ASP_FSD_SHIFT));
  780. break;
  781. default:
  782. return -EINVAL;
  783. }
  784. /* Bitclock/frame inversion */
  785. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  786. case SND_SOC_DAIFMT_NB_NF:
  787. asp_cfg_val |= CS42L42_ASP_SCPOL_NOR << CS42L42_ASP_SCPOL_SHIFT;
  788. break;
  789. case SND_SOC_DAIFMT_NB_IF:
  790. asp_cfg_val |= CS42L42_ASP_SCPOL_NOR << CS42L42_ASP_SCPOL_SHIFT;
  791. asp_cfg_val |= CS42L42_ASP_LCPOL_INV << CS42L42_ASP_LCPOL_SHIFT;
  792. break;
  793. case SND_SOC_DAIFMT_IB_NF:
  794. break;
  795. case SND_SOC_DAIFMT_IB_IF:
  796. asp_cfg_val |= CS42L42_ASP_LCPOL_INV << CS42L42_ASP_LCPOL_SHIFT;
  797. break;
  798. }
  799. snd_soc_component_update_bits(component, CS42L42_ASP_CLK_CFG, CS42L42_ASP_MODE_MASK |
  800. CS42L42_ASP_SCPOL_MASK |
  801. CS42L42_ASP_LCPOL_MASK,
  802. asp_cfg_val);
  803. return 0;
  804. }
  805. static int cs42l42_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
  806. {
  807. struct snd_soc_component *component = dai->component;
  808. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  809. /*
  810. * Sample rates < 44.1 kHz would produce an out-of-range SCLK with
  811. * a standard I2S frame. If the machine driver sets SCLK it must be
  812. * legal.
  813. */
  814. if (cs42l42->sclk)
  815. return 0;
  816. /* Machine driver has not set a SCLK, limit bottom end to 44.1 kHz */
  817. return snd_pcm_hw_constraint_minmax(substream->runtime,
  818. SNDRV_PCM_HW_PARAM_RATE,
  819. 44100, 96000);
  820. }
  821. static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream,
  822. struct snd_pcm_hw_params *params,
  823. struct snd_soc_dai *dai)
  824. {
  825. struct snd_soc_component *component = dai->component;
  826. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  827. unsigned int channels = params_channels(params);
  828. unsigned int width = (params_width(params) / 8) - 1;
  829. unsigned int slot_width = 0;
  830. unsigned int val = 0;
  831. unsigned int bclk;
  832. int ret;
  833. cs42l42->srate = params_rate(params);
  834. if (cs42l42->bclk_ratio) {
  835. /* machine driver has set the BCLK/samp-rate ratio */
  836. bclk = cs42l42->bclk_ratio * params_rate(params);
  837. } else if (cs42l42->sclk) {
  838. /* machine driver has set the SCLK */
  839. bclk = cs42l42->sclk;
  840. } else {
  841. /*
  842. * Assume 24-bit samples are in 32-bit slots, to prevent SCLK being
  843. * more than assumed (which would result in overclocking).
  844. */
  845. if (params_width(params) == 24)
  846. slot_width = 32;
  847. /* I2S frame always has multiple of 2 channels */
  848. bclk = snd_soc_tdm_params_to_bclk(params, slot_width, 0, 2);
  849. }
  850. switch (substream->stream) {
  851. case SNDRV_PCM_STREAM_CAPTURE:
  852. /* channel 2 on high LRCLK */
  853. val = CS42L42_ASP_TX_CH2_AP_MASK |
  854. (width << CS42L42_ASP_TX_CH2_RES_SHIFT) |
  855. (width << CS42L42_ASP_TX_CH1_RES_SHIFT);
  856. snd_soc_component_update_bits(component, CS42L42_ASP_TX_CH_AP_RES,
  857. CS42L42_ASP_TX_CH1_AP_MASK | CS42L42_ASP_TX_CH2_AP_MASK |
  858. CS42L42_ASP_TX_CH2_RES_MASK | CS42L42_ASP_TX_CH1_RES_MASK, val);
  859. break;
  860. case SNDRV_PCM_STREAM_PLAYBACK:
  861. val |= width << CS42L42_ASP_RX_CH_RES_SHIFT;
  862. /* channel 1 on low LRCLK */
  863. snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH1_AP_RES,
  864. CS42L42_ASP_RX_CH_AP_MASK |
  865. CS42L42_ASP_RX_CH_RES_MASK, val);
  866. /* Channel 2 on high LRCLK */
  867. val |= CS42L42_ASP_RX_CH_AP_HI << CS42L42_ASP_RX_CH_AP_SHIFT;
  868. snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH2_AP_RES,
  869. CS42L42_ASP_RX_CH_AP_MASK |
  870. CS42L42_ASP_RX_CH_RES_MASK, val);
  871. /* Channel B comes from the last active channel */
  872. snd_soc_component_update_bits(component, CS42L42_SP_RX_CH_SEL,
  873. CS42L42_SP_RX_CHB_SEL_MASK,
  874. (channels - 1) << CS42L42_SP_RX_CHB_SEL_SHIFT);
  875. /* Both LRCLK slots must be enabled */
  876. snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_EN,
  877. CS42L42_ASP_RX0_CH_EN_MASK,
  878. BIT(CS42L42_ASP_RX0_CH1_SHIFT) |
  879. BIT(CS42L42_ASP_RX0_CH2_SHIFT));
  880. break;
  881. default:
  882. break;
  883. }
  884. ret = cs42l42_pll_config(component, bclk);
  885. if (ret)
  886. return ret;
  887. cs42l42_src_config(component, params_rate(params));
  888. return 0;
  889. }
  890. static int cs42l42_set_sysclk(struct snd_soc_dai *dai,
  891. int clk_id, unsigned int freq, int dir)
  892. {
  893. struct snd_soc_component *component = dai->component;
  894. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  895. int i;
  896. if (freq == 0) {
  897. cs42l42->sclk = 0;
  898. return 0;
  899. }
  900. for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
  901. if (pll_ratio_table[i].sclk == freq) {
  902. cs42l42->sclk = freq;
  903. return 0;
  904. }
  905. }
  906. dev_err(component->dev, "SCLK %u not supported\n", freq);
  907. return -EINVAL;
  908. }
  909. static int cs42l42_set_bclk_ratio(struct snd_soc_dai *dai,
  910. unsigned int bclk_ratio)
  911. {
  912. struct snd_soc_component *component = dai->component;
  913. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  914. cs42l42->bclk_ratio = bclk_ratio;
  915. return 0;
  916. }
  917. static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
  918. {
  919. struct snd_soc_component *component = dai->component;
  920. struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component);
  921. unsigned int regval;
  922. int ret;
  923. if (mute) {
  924. /* Mute the headphone */
  925. if (stream == SNDRV_PCM_STREAM_PLAYBACK)
  926. snd_soc_component_update_bits(component, CS42L42_HP_CTL,
  927. CS42L42_HP_ANA_AMUTE_MASK |
  928. CS42L42_HP_ANA_BMUTE_MASK,
  929. CS42L42_HP_ANA_AMUTE_MASK |
  930. CS42L42_HP_ANA_BMUTE_MASK);
  931. cs42l42->stream_use &= ~(1 << stream);
  932. if (!cs42l42->stream_use) {
  933. /*
  934. * Switch to the internal oscillator.
  935. * SCLK must remain running until after this clock switch.
  936. * Without a source of clock the I2C bus doesn't work.
  937. */
  938. regmap_multi_reg_write(cs42l42->regmap, cs42l42_to_osc_seq,
  939. ARRAY_SIZE(cs42l42_to_osc_seq));
  940. /* Must disconnect PLL before stopping it */
  941. snd_soc_component_update_bits(component,
  942. CS42L42_MCLK_SRC_SEL,
  943. CS42L42_MCLK_SRC_SEL_MASK,
  944. 0);
  945. usleep_range(100, 200);
  946. snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
  947. CS42L42_PLL_START_MASK, 0);
  948. }
  949. } else {
  950. if (!cs42l42->stream_use) {
  951. /* SCLK must be running before codec unmute.
  952. *
  953. * PLL must not be started with ADC and HP both off
  954. * otherwise the FILT+ supply will not charge properly.
  955. * DAPM widgets power-up before stream unmute so at least
  956. * one of the "DAC" or "ADC" widgets will already have
  957. * powered-up.
  958. */
  959. if (pll_ratio_table[cs42l42->pll_config].mclk_src_sel) {
  960. snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
  961. CS42L42_PLL_START_MASK, 1);
  962. if (pll_ratio_table[cs42l42->pll_config].n > 1) {
  963. usleep_range(CS42L42_PLL_DIVOUT_TIME_US,
  964. CS42L42_PLL_DIVOUT_TIME_US * 2);
  965. regval = pll_ratio_table[cs42l42->pll_config].pll_divout;
  966. snd_soc_component_update_bits(component, CS42L42_PLL_CTL3,
  967. CS42L42_PLL_DIVOUT_MASK,
  968. regval <<
  969. CS42L42_PLL_DIVOUT_SHIFT);
  970. }
  971. ret = regmap_read_poll_timeout(cs42l42->regmap,
  972. CS42L42_PLL_LOCK_STATUS,
  973. regval,
  974. (regval & 1),
  975. CS42L42_PLL_LOCK_POLL_US,
  976. CS42L42_PLL_LOCK_TIMEOUT_US);
  977. if (ret < 0)
  978. dev_warn(component->dev, "PLL failed to lock: %d\n", ret);
  979. /* PLL must be running to drive glitchless switch logic */
  980. snd_soc_component_update_bits(component,
  981. CS42L42_MCLK_SRC_SEL,
  982. CS42L42_MCLK_SRC_SEL_MASK,
  983. CS42L42_MCLK_SRC_SEL_MASK);
  984. }
  985. /* Mark SCLK as present, turn off internal oscillator */
  986. regmap_multi_reg_write(cs42l42->regmap, cs42l42_to_sclk_seq,
  987. ARRAY_SIZE(cs42l42_to_sclk_seq));
  988. }
  989. cs42l42->stream_use |= 1 << stream;
  990. if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
  991. /* Un-mute the headphone */
  992. snd_soc_component_update_bits(component, CS42L42_HP_CTL,
  993. CS42L42_HP_ANA_AMUTE_MASK |
  994. CS42L42_HP_ANA_BMUTE_MASK,
  995. 0);
  996. }
  997. }
  998. return 0;
  999. }
  1000. #define CS42L42_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  1001. SNDRV_PCM_FMTBIT_S24_LE |\
  1002. SNDRV_PCM_FMTBIT_S32_LE)
  1003. static const struct snd_soc_dai_ops cs42l42_ops = {
  1004. .startup = cs42l42_dai_startup,
  1005. .hw_params = cs42l42_pcm_hw_params,
  1006. .set_fmt = cs42l42_set_dai_fmt,
  1007. .set_sysclk = cs42l42_set_sysclk,
  1008. .set_bclk_ratio = cs42l42_set_bclk_ratio,
  1009. .mute_stream = cs42l42_mute_stream,
  1010. };
  1011. struct snd_soc_dai_driver cs42l42_dai = {
  1012. .name = "cs42l42",
  1013. .playback = {
  1014. .stream_name = "Playback",
  1015. .channels_min = 1,
  1016. .channels_max = 2,
  1017. .rates = SNDRV_PCM_RATE_8000_96000,
  1018. .formats = CS42L42_FORMATS,
  1019. },
  1020. .capture = {
  1021. .stream_name = "Capture",
  1022. .channels_min = 1,
  1023. .channels_max = 2,
  1024. .rates = SNDRV_PCM_RATE_8000_96000,
  1025. .formats = CS42L42_FORMATS,
  1026. },
  1027. .symmetric_rate = 1,
  1028. .symmetric_sample_bits = 1,
  1029. .ops = &cs42l42_ops,
  1030. };
  1031. EXPORT_SYMBOL_NS_GPL(cs42l42_dai, SND_SOC_CS42L42_CORE);
  1032. static void cs42l42_manual_hs_type_detect(struct cs42l42_private *cs42l42)
  1033. {
  1034. unsigned int hs_det_status;
  1035. unsigned int hs_det_comp1;
  1036. unsigned int hs_det_comp2;
  1037. unsigned int hs_det_sw;
  1038. /* Set hs detect to manual, active mode */
  1039. regmap_update_bits(cs42l42->regmap,
  1040. CS42L42_HSDET_CTL2,
  1041. CS42L42_HSDET_CTRL_MASK |
  1042. CS42L42_HSDET_SET_MASK |
  1043. CS42L42_HSBIAS_REF_MASK |
  1044. CS42L42_HSDET_AUTO_TIME_MASK,
  1045. (1 << CS42L42_HSDET_CTRL_SHIFT) |
  1046. (0 << CS42L42_HSDET_SET_SHIFT) |
  1047. (0 << CS42L42_HSBIAS_REF_SHIFT) |
  1048. (0 << CS42L42_HSDET_AUTO_TIME_SHIFT));
  1049. /* Configure HS DET comparator reference levels. */
  1050. regmap_update_bits(cs42l42->regmap,
  1051. CS42L42_HSDET_CTL1,
  1052. CS42L42_HSDET_COMP1_LVL_MASK |
  1053. CS42L42_HSDET_COMP2_LVL_MASK,
  1054. (CS42L42_HSDET_COMP1_LVL_VAL << CS42L42_HSDET_COMP1_LVL_SHIFT) |
  1055. (CS42L42_HSDET_COMP2_LVL_VAL << CS42L42_HSDET_COMP2_LVL_SHIFT));
  1056. /* Open the SW_HSB_HS3 switch and close SW_HSB_HS4 for a Type 1 headset. */
  1057. regmap_write(cs42l42->regmap, CS42L42_HS_SWITCH_CTL, CS42L42_HSDET_SW_COMP1);
  1058. msleep(100);
  1059. regmap_read(cs42l42->regmap, CS42L42_HS_DET_STATUS, &hs_det_status);
  1060. hs_det_comp1 = (hs_det_status & CS42L42_HSDET_COMP1_OUT_MASK) >>
  1061. CS42L42_HSDET_COMP1_OUT_SHIFT;
  1062. hs_det_comp2 = (hs_det_status & CS42L42_HSDET_COMP2_OUT_MASK) >>
  1063. CS42L42_HSDET_COMP2_OUT_SHIFT;
  1064. /* Close the SW_HSB_HS3 switch for a Type 2 headset. */
  1065. regmap_write(cs42l42->regmap, CS42L42_HS_SWITCH_CTL, CS42L42_HSDET_SW_COMP2);
  1066. msleep(100);
  1067. regmap_read(cs42l42->regmap, CS42L42_HS_DET_STATUS, &hs_det_status);
  1068. hs_det_comp1 |= ((hs_det_status & CS42L42_HSDET_COMP1_OUT_MASK) >>
  1069. CS42L42_HSDET_COMP1_OUT_SHIFT) << 1;
  1070. hs_det_comp2 |= ((hs_det_status & CS42L42_HSDET_COMP2_OUT_MASK) >>
  1071. CS42L42_HSDET_COMP2_OUT_SHIFT) << 1;
  1072. /* Use Comparator 1 with 1.25V Threshold. */
  1073. switch (hs_det_comp1) {
  1074. case CS42L42_HSDET_COMP_TYPE1:
  1075. cs42l42->hs_type = CS42L42_PLUG_CTIA;
  1076. hs_det_sw = CS42L42_HSDET_SW_TYPE1;
  1077. break;
  1078. case CS42L42_HSDET_COMP_TYPE2:
  1079. cs42l42->hs_type = CS42L42_PLUG_OMTP;
  1080. hs_det_sw = CS42L42_HSDET_SW_TYPE2;
  1081. break;
  1082. default:
  1083. /* Fallback to Comparator 2 with 1.75V Threshold. */
  1084. switch (hs_det_comp2) {
  1085. case CS42L42_HSDET_COMP_TYPE1:
  1086. cs42l42->hs_type = CS42L42_PLUG_CTIA;
  1087. hs_det_sw = CS42L42_HSDET_SW_TYPE1;
  1088. break;
  1089. case CS42L42_HSDET_COMP_TYPE2:
  1090. cs42l42->hs_type = CS42L42_PLUG_OMTP;
  1091. hs_det_sw = CS42L42_HSDET_SW_TYPE2;
  1092. break;
  1093. /* Detect Type 3 and Type 4 Headsets as Headphones */
  1094. default:
  1095. cs42l42->hs_type = CS42L42_PLUG_HEADPHONE;
  1096. hs_det_sw = CS42L42_HSDET_SW_TYPE3;
  1097. break;
  1098. }
  1099. }
  1100. /* Set Switches */
  1101. regmap_write(cs42l42->regmap, CS42L42_HS_SWITCH_CTL, hs_det_sw);
  1102. /* Set HSDET mode to Manual—Disabled */
  1103. regmap_update_bits(cs42l42->regmap,
  1104. CS42L42_HSDET_CTL2,
  1105. CS42L42_HSDET_CTRL_MASK |
  1106. CS42L42_HSDET_SET_MASK |
  1107. CS42L42_HSBIAS_REF_MASK |
  1108. CS42L42_HSDET_AUTO_TIME_MASK,
  1109. (0 << CS42L42_HSDET_CTRL_SHIFT) |
  1110. (0 << CS42L42_HSDET_SET_SHIFT) |
  1111. (0 << CS42L42_HSBIAS_REF_SHIFT) |
  1112. (0 << CS42L42_HSDET_AUTO_TIME_SHIFT));
  1113. /* Configure HS DET comparator reference levels. */
  1114. regmap_update_bits(cs42l42->regmap,
  1115. CS42L42_HSDET_CTL1,
  1116. CS42L42_HSDET_COMP1_LVL_MASK |
  1117. CS42L42_HSDET_COMP2_LVL_MASK,
  1118. (CS42L42_HSDET_COMP1_LVL_DEFAULT << CS42L42_HSDET_COMP1_LVL_SHIFT) |
  1119. (CS42L42_HSDET_COMP2_LVL_DEFAULT << CS42L42_HSDET_COMP2_LVL_SHIFT));
  1120. }
  1121. static void cs42l42_process_hs_type_detect(struct cs42l42_private *cs42l42)
  1122. {
  1123. unsigned int hs_det_status;
  1124. unsigned int int_status;
  1125. /* Read and save the hs detection result */
  1126. regmap_read(cs42l42->regmap, CS42L42_HS_DET_STATUS, &hs_det_status);
  1127. /* Mask the auto detect interrupt */
  1128. regmap_update_bits(cs42l42->regmap,
  1129. CS42L42_CODEC_INT_MASK,
  1130. CS42L42_PDN_DONE_MASK |
  1131. CS42L42_HSDET_AUTO_DONE_MASK,
  1132. (1 << CS42L42_PDN_DONE_SHIFT) |
  1133. (1 << CS42L42_HSDET_AUTO_DONE_SHIFT));
  1134. cs42l42->hs_type = (hs_det_status & CS42L42_HSDET_TYPE_MASK) >>
  1135. CS42L42_HSDET_TYPE_SHIFT;
  1136. /* Set hs detect to automatic, disabled mode */
  1137. regmap_update_bits(cs42l42->regmap,
  1138. CS42L42_HSDET_CTL2,
  1139. CS42L42_HSDET_CTRL_MASK |
  1140. CS42L42_HSDET_SET_MASK |
  1141. CS42L42_HSBIAS_REF_MASK |
  1142. CS42L42_HSDET_AUTO_TIME_MASK,
  1143. (2 << CS42L42_HSDET_CTRL_SHIFT) |
  1144. (2 << CS42L42_HSDET_SET_SHIFT) |
  1145. (0 << CS42L42_HSBIAS_REF_SHIFT) |
  1146. (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
  1147. /* Run Manual detection if auto detect has not found a headset.
  1148. * We Re-Run with Manual Detection if the original detection was invalid or headphones,
  1149. * to ensure that a headset mic is detected in all cases.
  1150. */
  1151. if (cs42l42->hs_type == CS42L42_PLUG_INVALID ||
  1152. cs42l42->hs_type == CS42L42_PLUG_HEADPHONE) {
  1153. dev_dbg(cs42l42->dev, "Running Manual Detection Fallback\n");
  1154. cs42l42_manual_hs_type_detect(cs42l42);
  1155. }
  1156. /* Set up button detection */
  1157. if ((cs42l42->hs_type == CS42L42_PLUG_CTIA) ||
  1158. (cs42l42->hs_type == CS42L42_PLUG_OMTP)) {
  1159. /* Set auto HS bias settings to default */
  1160. regmap_update_bits(cs42l42->regmap,
  1161. CS42L42_HSBIAS_SC_AUTOCTL,
  1162. CS42L42_HSBIAS_SENSE_EN_MASK |
  1163. CS42L42_AUTO_HSBIAS_HIZ_MASK |
  1164. CS42L42_TIP_SENSE_EN_MASK |
  1165. CS42L42_HSBIAS_SENSE_TRIP_MASK,
  1166. (0 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
  1167. (0 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
  1168. (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
  1169. (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
  1170. /* Set up hs detect level sensitivity */
  1171. regmap_update_bits(cs42l42->regmap,
  1172. CS42L42_MIC_DET_CTL1,
  1173. CS42L42_LATCH_TO_VP_MASK |
  1174. CS42L42_EVENT_STAT_SEL_MASK |
  1175. CS42L42_HS_DET_LEVEL_MASK,
  1176. (1 << CS42L42_LATCH_TO_VP_SHIFT) |
  1177. (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
  1178. (cs42l42->bias_thresholds[0] <<
  1179. CS42L42_HS_DET_LEVEL_SHIFT));
  1180. /* Set auto HS bias settings to default */
  1181. regmap_update_bits(cs42l42->regmap,
  1182. CS42L42_HSBIAS_SC_AUTOCTL,
  1183. CS42L42_HSBIAS_SENSE_EN_MASK |
  1184. CS42L42_AUTO_HSBIAS_HIZ_MASK |
  1185. CS42L42_TIP_SENSE_EN_MASK |
  1186. CS42L42_HSBIAS_SENSE_TRIP_MASK,
  1187. (cs42l42->hs_bias_sense_en << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
  1188. (1 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
  1189. (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
  1190. (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
  1191. /* Turn on level detect circuitry */
  1192. regmap_update_bits(cs42l42->regmap,
  1193. CS42L42_MISC_DET_CTL,
  1194. CS42L42_HSBIAS_CTL_MASK |
  1195. CS42L42_PDN_MIC_LVL_DET_MASK,
  1196. (3 << CS42L42_HSBIAS_CTL_SHIFT) |
  1197. (0 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
  1198. msleep(cs42l42->btn_det_init_dbnce);
  1199. /* Clear any button interrupts before unmasking them */
  1200. regmap_read(cs42l42->regmap, CS42L42_DET_INT_STATUS2,
  1201. &int_status);
  1202. /* Unmask button detect interrupts */
  1203. regmap_update_bits(cs42l42->regmap,
  1204. CS42L42_DET_INT2_MASK,
  1205. CS42L42_M_DETECT_TF_MASK |
  1206. CS42L42_M_DETECT_FT_MASK |
  1207. CS42L42_M_HSBIAS_HIZ_MASK |
  1208. CS42L42_M_SHORT_RLS_MASK |
  1209. CS42L42_M_SHORT_DET_MASK,
  1210. (0 << CS42L42_M_DETECT_TF_SHIFT) |
  1211. (0 << CS42L42_M_DETECT_FT_SHIFT) |
  1212. (0 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
  1213. (1 << CS42L42_M_SHORT_RLS_SHIFT) |
  1214. (1 << CS42L42_M_SHORT_DET_SHIFT));
  1215. } else {
  1216. /* Make sure button detect and HS bias circuits are off */
  1217. regmap_update_bits(cs42l42->regmap,
  1218. CS42L42_MISC_DET_CTL,
  1219. CS42L42_HSBIAS_CTL_MASK |
  1220. CS42L42_PDN_MIC_LVL_DET_MASK,
  1221. (1 << CS42L42_HSBIAS_CTL_SHIFT) |
  1222. (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
  1223. }
  1224. regmap_update_bits(cs42l42->regmap,
  1225. CS42L42_DAC_CTL2,
  1226. CS42L42_HPOUT_PULLDOWN_MASK |
  1227. CS42L42_HPOUT_LOAD_MASK |
  1228. CS42L42_HPOUT_CLAMP_MASK |
  1229. CS42L42_DAC_HPF_EN_MASK |
  1230. CS42L42_DAC_MON_EN_MASK,
  1231. (0 << CS42L42_HPOUT_PULLDOWN_SHIFT) |
  1232. (0 << CS42L42_HPOUT_LOAD_SHIFT) |
  1233. (0 << CS42L42_HPOUT_CLAMP_SHIFT) |
  1234. (1 << CS42L42_DAC_HPF_EN_SHIFT) |
  1235. (0 << CS42L42_DAC_MON_EN_SHIFT));
  1236. /* Unmask tip sense interrupts */
  1237. regmap_update_bits(cs42l42->regmap,
  1238. CS42L42_TSRS_PLUG_INT_MASK,
  1239. CS42L42_TS_PLUG_MASK |
  1240. CS42L42_TS_UNPLUG_MASK,
  1241. (0 << CS42L42_TS_PLUG_SHIFT) |
  1242. (0 << CS42L42_TS_UNPLUG_SHIFT));
  1243. }
  1244. static void cs42l42_init_hs_type_detect(struct cs42l42_private *cs42l42)
  1245. {
  1246. /* Mask tip sense interrupts */
  1247. regmap_update_bits(cs42l42->regmap,
  1248. CS42L42_TSRS_PLUG_INT_MASK,
  1249. CS42L42_TS_PLUG_MASK |
  1250. CS42L42_TS_UNPLUG_MASK,
  1251. (1 << CS42L42_TS_PLUG_SHIFT) |
  1252. (1 << CS42L42_TS_UNPLUG_SHIFT));
  1253. /* Make sure button detect and HS bias circuits are off */
  1254. regmap_update_bits(cs42l42->regmap,
  1255. CS42L42_MISC_DET_CTL,
  1256. CS42L42_HSBIAS_CTL_MASK |
  1257. CS42L42_PDN_MIC_LVL_DET_MASK,
  1258. (1 << CS42L42_HSBIAS_CTL_SHIFT) |
  1259. (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
  1260. /* Set auto HS bias settings to default */
  1261. regmap_update_bits(cs42l42->regmap,
  1262. CS42L42_HSBIAS_SC_AUTOCTL,
  1263. CS42L42_HSBIAS_SENSE_EN_MASK |
  1264. CS42L42_AUTO_HSBIAS_HIZ_MASK |
  1265. CS42L42_TIP_SENSE_EN_MASK |
  1266. CS42L42_HSBIAS_SENSE_TRIP_MASK,
  1267. (0 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
  1268. (0 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
  1269. (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
  1270. (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
  1271. /* Set hs detect to manual, disabled mode */
  1272. regmap_update_bits(cs42l42->regmap,
  1273. CS42L42_HSDET_CTL2,
  1274. CS42L42_HSDET_CTRL_MASK |
  1275. CS42L42_HSDET_SET_MASK |
  1276. CS42L42_HSBIAS_REF_MASK |
  1277. CS42L42_HSDET_AUTO_TIME_MASK,
  1278. (0 << CS42L42_HSDET_CTRL_SHIFT) |
  1279. (2 << CS42L42_HSDET_SET_SHIFT) |
  1280. (0 << CS42L42_HSBIAS_REF_SHIFT) |
  1281. (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
  1282. regmap_update_bits(cs42l42->regmap,
  1283. CS42L42_DAC_CTL2,
  1284. CS42L42_HPOUT_PULLDOWN_MASK |
  1285. CS42L42_HPOUT_LOAD_MASK |
  1286. CS42L42_HPOUT_CLAMP_MASK |
  1287. CS42L42_DAC_HPF_EN_MASK |
  1288. CS42L42_DAC_MON_EN_MASK,
  1289. (8 << CS42L42_HPOUT_PULLDOWN_SHIFT) |
  1290. (0 << CS42L42_HPOUT_LOAD_SHIFT) |
  1291. (1 << CS42L42_HPOUT_CLAMP_SHIFT) |
  1292. (1 << CS42L42_DAC_HPF_EN_SHIFT) |
  1293. (1 << CS42L42_DAC_MON_EN_SHIFT));
  1294. /* Power up HS bias to 2.7V */
  1295. regmap_update_bits(cs42l42->regmap,
  1296. CS42L42_MISC_DET_CTL,
  1297. CS42L42_HSBIAS_CTL_MASK |
  1298. CS42L42_PDN_MIC_LVL_DET_MASK,
  1299. (3 << CS42L42_HSBIAS_CTL_SHIFT) |
  1300. (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
  1301. /* Wait for HS bias to ramp up */
  1302. msleep(cs42l42->hs_bias_ramp_time);
  1303. /* Unmask auto detect interrupt */
  1304. regmap_update_bits(cs42l42->regmap,
  1305. CS42L42_CODEC_INT_MASK,
  1306. CS42L42_PDN_DONE_MASK |
  1307. CS42L42_HSDET_AUTO_DONE_MASK,
  1308. (1 << CS42L42_PDN_DONE_SHIFT) |
  1309. (0 << CS42L42_HSDET_AUTO_DONE_SHIFT));
  1310. /* Set hs detect to automatic, enabled mode */
  1311. regmap_update_bits(cs42l42->regmap,
  1312. CS42L42_HSDET_CTL2,
  1313. CS42L42_HSDET_CTRL_MASK |
  1314. CS42L42_HSDET_SET_MASK |
  1315. CS42L42_HSBIAS_REF_MASK |
  1316. CS42L42_HSDET_AUTO_TIME_MASK,
  1317. (3 << CS42L42_HSDET_CTRL_SHIFT) |
  1318. (2 << CS42L42_HSDET_SET_SHIFT) |
  1319. (0 << CS42L42_HSBIAS_REF_SHIFT) |
  1320. (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
  1321. }
  1322. static void cs42l42_cancel_hs_type_detect(struct cs42l42_private *cs42l42)
  1323. {
  1324. /* Mask button detect interrupts */
  1325. regmap_update_bits(cs42l42->regmap,
  1326. CS42L42_DET_INT2_MASK,
  1327. CS42L42_M_DETECT_TF_MASK |
  1328. CS42L42_M_DETECT_FT_MASK |
  1329. CS42L42_M_HSBIAS_HIZ_MASK |
  1330. CS42L42_M_SHORT_RLS_MASK |
  1331. CS42L42_M_SHORT_DET_MASK,
  1332. (1 << CS42L42_M_DETECT_TF_SHIFT) |
  1333. (1 << CS42L42_M_DETECT_FT_SHIFT) |
  1334. (1 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
  1335. (1 << CS42L42_M_SHORT_RLS_SHIFT) |
  1336. (1 << CS42L42_M_SHORT_DET_SHIFT));
  1337. /* Ground HS bias */
  1338. regmap_update_bits(cs42l42->regmap,
  1339. CS42L42_MISC_DET_CTL,
  1340. CS42L42_HSBIAS_CTL_MASK |
  1341. CS42L42_PDN_MIC_LVL_DET_MASK,
  1342. (1 << CS42L42_HSBIAS_CTL_SHIFT) |
  1343. (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
  1344. /* Set auto HS bias settings to default */
  1345. regmap_update_bits(cs42l42->regmap,
  1346. CS42L42_HSBIAS_SC_AUTOCTL,
  1347. CS42L42_HSBIAS_SENSE_EN_MASK |
  1348. CS42L42_AUTO_HSBIAS_HIZ_MASK |
  1349. CS42L42_TIP_SENSE_EN_MASK |
  1350. CS42L42_HSBIAS_SENSE_TRIP_MASK,
  1351. (0 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
  1352. (0 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
  1353. (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
  1354. (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
  1355. /* Set hs detect to manual, disabled mode */
  1356. regmap_update_bits(cs42l42->regmap,
  1357. CS42L42_HSDET_CTL2,
  1358. CS42L42_HSDET_CTRL_MASK |
  1359. CS42L42_HSDET_SET_MASK |
  1360. CS42L42_HSBIAS_REF_MASK |
  1361. CS42L42_HSDET_AUTO_TIME_MASK,
  1362. (0 << CS42L42_HSDET_CTRL_SHIFT) |
  1363. (2 << CS42L42_HSDET_SET_SHIFT) |
  1364. (0 << CS42L42_HSBIAS_REF_SHIFT) |
  1365. (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
  1366. }
  1367. static int cs42l42_handle_button_press(struct cs42l42_private *cs42l42)
  1368. {
  1369. int bias_level;
  1370. unsigned int detect_status;
  1371. /* Mask button detect interrupts */
  1372. regmap_update_bits(cs42l42->regmap,
  1373. CS42L42_DET_INT2_MASK,
  1374. CS42L42_M_DETECT_TF_MASK |
  1375. CS42L42_M_DETECT_FT_MASK |
  1376. CS42L42_M_HSBIAS_HIZ_MASK |
  1377. CS42L42_M_SHORT_RLS_MASK |
  1378. CS42L42_M_SHORT_DET_MASK,
  1379. (1 << CS42L42_M_DETECT_TF_SHIFT) |
  1380. (1 << CS42L42_M_DETECT_FT_SHIFT) |
  1381. (1 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
  1382. (1 << CS42L42_M_SHORT_RLS_SHIFT) |
  1383. (1 << CS42L42_M_SHORT_DET_SHIFT));
  1384. usleep_range(cs42l42->btn_det_event_dbnce * 1000,
  1385. cs42l42->btn_det_event_dbnce * 2000);
  1386. /* Test all 4 level detect biases */
  1387. bias_level = 1;
  1388. do {
  1389. /* Adjust button detect level sensitivity */
  1390. regmap_update_bits(cs42l42->regmap,
  1391. CS42L42_MIC_DET_CTL1,
  1392. CS42L42_LATCH_TO_VP_MASK |
  1393. CS42L42_EVENT_STAT_SEL_MASK |
  1394. CS42L42_HS_DET_LEVEL_MASK,
  1395. (1 << CS42L42_LATCH_TO_VP_SHIFT) |
  1396. (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
  1397. (cs42l42->bias_thresholds[bias_level] <<
  1398. CS42L42_HS_DET_LEVEL_SHIFT));
  1399. regmap_read(cs42l42->regmap, CS42L42_DET_STATUS2,
  1400. &detect_status);
  1401. } while ((detect_status & CS42L42_HS_TRUE_MASK) &&
  1402. (++bias_level < CS42L42_NUM_BIASES));
  1403. switch (bias_level) {
  1404. case 1: /* Function C button press */
  1405. bias_level = SND_JACK_BTN_2;
  1406. dev_dbg(cs42l42->dev, "Function C button press\n");
  1407. break;
  1408. case 2: /* Function B button press */
  1409. bias_level = SND_JACK_BTN_1;
  1410. dev_dbg(cs42l42->dev, "Function B button press\n");
  1411. break;
  1412. case 3: /* Function D button press */
  1413. bias_level = SND_JACK_BTN_3;
  1414. dev_dbg(cs42l42->dev, "Function D button press\n");
  1415. break;
  1416. case 4: /* Function A button press */
  1417. bias_level = SND_JACK_BTN_0;
  1418. dev_dbg(cs42l42->dev, "Function A button press\n");
  1419. break;
  1420. default:
  1421. bias_level = 0;
  1422. break;
  1423. }
  1424. /* Set button detect level sensitivity back to default */
  1425. regmap_update_bits(cs42l42->regmap,
  1426. CS42L42_MIC_DET_CTL1,
  1427. CS42L42_LATCH_TO_VP_MASK |
  1428. CS42L42_EVENT_STAT_SEL_MASK |
  1429. CS42L42_HS_DET_LEVEL_MASK,
  1430. (1 << CS42L42_LATCH_TO_VP_SHIFT) |
  1431. (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
  1432. (cs42l42->bias_thresholds[0] << CS42L42_HS_DET_LEVEL_SHIFT));
  1433. /* Clear any button interrupts before unmasking them */
  1434. regmap_read(cs42l42->regmap, CS42L42_DET_INT_STATUS2,
  1435. &detect_status);
  1436. /* Unmask button detect interrupts */
  1437. regmap_update_bits(cs42l42->regmap,
  1438. CS42L42_DET_INT2_MASK,
  1439. CS42L42_M_DETECT_TF_MASK |
  1440. CS42L42_M_DETECT_FT_MASK |
  1441. CS42L42_M_HSBIAS_HIZ_MASK |
  1442. CS42L42_M_SHORT_RLS_MASK |
  1443. CS42L42_M_SHORT_DET_MASK,
  1444. (0 << CS42L42_M_DETECT_TF_SHIFT) |
  1445. (0 << CS42L42_M_DETECT_FT_SHIFT) |
  1446. (0 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
  1447. (1 << CS42L42_M_SHORT_RLS_SHIFT) |
  1448. (1 << CS42L42_M_SHORT_DET_SHIFT));
  1449. return bias_level;
  1450. }
  1451. struct cs42l42_irq_params {
  1452. u16 status_addr;
  1453. u16 mask_addr;
  1454. u8 mask;
  1455. };
  1456. static const struct cs42l42_irq_params irq_params_table[] = {
  1457. {CS42L42_ADC_OVFL_STATUS, CS42L42_ADC_OVFL_INT_MASK,
  1458. CS42L42_ADC_OVFL_VAL_MASK},
  1459. {CS42L42_MIXER_STATUS, CS42L42_MIXER_INT_MASK,
  1460. CS42L42_MIXER_VAL_MASK},
  1461. {CS42L42_SRC_STATUS, CS42L42_SRC_INT_MASK,
  1462. CS42L42_SRC_VAL_MASK},
  1463. {CS42L42_ASP_RX_STATUS, CS42L42_ASP_RX_INT_MASK,
  1464. CS42L42_ASP_RX_VAL_MASK},
  1465. {CS42L42_ASP_TX_STATUS, CS42L42_ASP_TX_INT_MASK,
  1466. CS42L42_ASP_TX_VAL_MASK},
  1467. {CS42L42_CODEC_STATUS, CS42L42_CODEC_INT_MASK,
  1468. CS42L42_CODEC_VAL_MASK},
  1469. {CS42L42_DET_INT_STATUS1, CS42L42_DET_INT1_MASK,
  1470. CS42L42_DET_INT_VAL1_MASK},
  1471. {CS42L42_DET_INT_STATUS2, CS42L42_DET_INT2_MASK,
  1472. CS42L42_DET_INT_VAL2_MASK},
  1473. {CS42L42_SRCPL_INT_STATUS, CS42L42_SRCPL_INT_MASK,
  1474. CS42L42_SRCPL_VAL_MASK},
  1475. {CS42L42_VPMON_STATUS, CS42L42_VPMON_INT_MASK,
  1476. CS42L42_VPMON_VAL_MASK},
  1477. {CS42L42_PLL_LOCK_STATUS, CS42L42_PLL_LOCK_INT_MASK,
  1478. CS42L42_PLL_LOCK_VAL_MASK},
  1479. {CS42L42_TSRS_PLUG_STATUS, CS42L42_TSRS_PLUG_INT_MASK,
  1480. CS42L42_TSRS_PLUG_VAL_MASK}
  1481. };
  1482. static irqreturn_t cs42l42_irq_thread(int irq, void *data)
  1483. {
  1484. struct cs42l42_private *cs42l42 = (struct cs42l42_private *)data;
  1485. unsigned int stickies[12];
  1486. unsigned int masks[12];
  1487. unsigned int current_plug_status;
  1488. unsigned int current_button_status;
  1489. unsigned int i;
  1490. mutex_lock(&cs42l42->irq_lock);
  1491. if (cs42l42->suspended || !cs42l42->init_done) {
  1492. mutex_unlock(&cs42l42->irq_lock);
  1493. return IRQ_NONE;
  1494. }
  1495. /* Read sticky registers to clear interurpt */
  1496. for (i = 0; i < ARRAY_SIZE(stickies); i++) {
  1497. regmap_read(cs42l42->regmap, irq_params_table[i].status_addr,
  1498. &(stickies[i]));
  1499. regmap_read(cs42l42->regmap, irq_params_table[i].mask_addr,
  1500. &(masks[i]));
  1501. stickies[i] = stickies[i] & (~masks[i]) &
  1502. irq_params_table[i].mask;
  1503. }
  1504. /* Read tip sense status before handling type detect */
  1505. current_plug_status = (stickies[11] &
  1506. (CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK)) >>
  1507. CS42L42_TS_PLUG_SHIFT;
  1508. /* Read button sense status */
  1509. current_button_status = stickies[7] &
  1510. (CS42L42_M_DETECT_TF_MASK |
  1511. CS42L42_M_DETECT_FT_MASK |
  1512. CS42L42_M_HSBIAS_HIZ_MASK);
  1513. /*
  1514. * Check auto-detect status. Don't assume a previous unplug event has
  1515. * cleared the flags. If the jack is unplugged and plugged during
  1516. * system suspend there won't have been an unplug event.
  1517. */
  1518. if ((~masks[5]) & irq_params_table[5].mask) {
  1519. if (stickies[5] & CS42L42_HSDET_AUTO_DONE_MASK) {
  1520. cs42l42_process_hs_type_detect(cs42l42);
  1521. switch (cs42l42->hs_type) {
  1522. case CS42L42_PLUG_CTIA:
  1523. case CS42L42_PLUG_OMTP:
  1524. snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADSET,
  1525. SND_JACK_HEADSET |
  1526. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  1527. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  1528. break;
  1529. case CS42L42_PLUG_HEADPHONE:
  1530. snd_soc_jack_report(cs42l42->jack, SND_JACK_HEADPHONE,
  1531. SND_JACK_HEADSET |
  1532. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  1533. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  1534. break;
  1535. default:
  1536. break;
  1537. }
  1538. dev_dbg(cs42l42->dev, "Auto detect done (%d)\n", cs42l42->hs_type);
  1539. }
  1540. }
  1541. /* Check tip sense status */
  1542. if ((~masks[11]) & irq_params_table[11].mask) {
  1543. switch (current_plug_status) {
  1544. case CS42L42_TS_PLUG:
  1545. if (cs42l42->plug_state != CS42L42_TS_PLUG) {
  1546. cs42l42->plug_state = CS42L42_TS_PLUG;
  1547. cs42l42_init_hs_type_detect(cs42l42);
  1548. }
  1549. break;
  1550. case CS42L42_TS_UNPLUG:
  1551. if (cs42l42->plug_state != CS42L42_TS_UNPLUG) {
  1552. cs42l42->plug_state = CS42L42_TS_UNPLUG;
  1553. cs42l42_cancel_hs_type_detect(cs42l42);
  1554. snd_soc_jack_report(cs42l42->jack, 0,
  1555. SND_JACK_HEADSET |
  1556. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  1557. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  1558. dev_dbg(cs42l42->dev, "Unplug event\n");
  1559. }
  1560. break;
  1561. default:
  1562. cs42l42->plug_state = CS42L42_TS_TRANS;
  1563. }
  1564. }
  1565. /* Check button detect status */
  1566. if (cs42l42->plug_state == CS42L42_TS_PLUG && ((~masks[7]) & irq_params_table[7].mask)) {
  1567. if (!(current_button_status &
  1568. CS42L42_M_HSBIAS_HIZ_MASK)) {
  1569. if (current_button_status & CS42L42_M_DETECT_TF_MASK) {
  1570. dev_dbg(cs42l42->dev, "Button released\n");
  1571. snd_soc_jack_report(cs42l42->jack, 0,
  1572. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  1573. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  1574. } else if (current_button_status & CS42L42_M_DETECT_FT_MASK) {
  1575. snd_soc_jack_report(cs42l42->jack,
  1576. cs42l42_handle_button_press(cs42l42),
  1577. SND_JACK_BTN_0 | SND_JACK_BTN_1 |
  1578. SND_JACK_BTN_2 | SND_JACK_BTN_3);
  1579. }
  1580. }
  1581. }
  1582. mutex_unlock(&cs42l42->irq_lock);
  1583. return IRQ_HANDLED;
  1584. }
  1585. static void cs42l42_set_interrupt_masks(struct cs42l42_private *cs42l42)
  1586. {
  1587. regmap_update_bits(cs42l42->regmap, CS42L42_ADC_OVFL_INT_MASK,
  1588. CS42L42_ADC_OVFL_MASK,
  1589. (1 << CS42L42_ADC_OVFL_SHIFT));
  1590. regmap_update_bits(cs42l42->regmap, CS42L42_MIXER_INT_MASK,
  1591. CS42L42_MIX_CHB_OVFL_MASK |
  1592. CS42L42_MIX_CHA_OVFL_MASK |
  1593. CS42L42_EQ_OVFL_MASK |
  1594. CS42L42_EQ_BIQUAD_OVFL_MASK,
  1595. (1 << CS42L42_MIX_CHB_OVFL_SHIFT) |
  1596. (1 << CS42L42_MIX_CHA_OVFL_SHIFT) |
  1597. (1 << CS42L42_EQ_OVFL_SHIFT) |
  1598. (1 << CS42L42_EQ_BIQUAD_OVFL_SHIFT));
  1599. regmap_update_bits(cs42l42->regmap, CS42L42_SRC_INT_MASK,
  1600. CS42L42_SRC_ILK_MASK |
  1601. CS42L42_SRC_OLK_MASK |
  1602. CS42L42_SRC_IUNLK_MASK |
  1603. CS42L42_SRC_OUNLK_MASK,
  1604. (1 << CS42L42_SRC_ILK_SHIFT) |
  1605. (1 << CS42L42_SRC_OLK_SHIFT) |
  1606. (1 << CS42L42_SRC_IUNLK_SHIFT) |
  1607. (1 << CS42L42_SRC_OUNLK_SHIFT));
  1608. regmap_update_bits(cs42l42->regmap, CS42L42_ASP_RX_INT_MASK,
  1609. CS42L42_ASPRX_NOLRCK_MASK |
  1610. CS42L42_ASPRX_EARLY_MASK |
  1611. CS42L42_ASPRX_LATE_MASK |
  1612. CS42L42_ASPRX_ERROR_MASK |
  1613. CS42L42_ASPRX_OVLD_MASK,
  1614. (1 << CS42L42_ASPRX_NOLRCK_SHIFT) |
  1615. (1 << CS42L42_ASPRX_EARLY_SHIFT) |
  1616. (1 << CS42L42_ASPRX_LATE_SHIFT) |
  1617. (1 << CS42L42_ASPRX_ERROR_SHIFT) |
  1618. (1 << CS42L42_ASPRX_OVLD_SHIFT));
  1619. regmap_update_bits(cs42l42->regmap, CS42L42_ASP_TX_INT_MASK,
  1620. CS42L42_ASPTX_NOLRCK_MASK |
  1621. CS42L42_ASPTX_EARLY_MASK |
  1622. CS42L42_ASPTX_LATE_MASK |
  1623. CS42L42_ASPTX_SMERROR_MASK,
  1624. (1 << CS42L42_ASPTX_NOLRCK_SHIFT) |
  1625. (1 << CS42L42_ASPTX_EARLY_SHIFT) |
  1626. (1 << CS42L42_ASPTX_LATE_SHIFT) |
  1627. (1 << CS42L42_ASPTX_SMERROR_SHIFT));
  1628. regmap_update_bits(cs42l42->regmap, CS42L42_CODEC_INT_MASK,
  1629. CS42L42_PDN_DONE_MASK |
  1630. CS42L42_HSDET_AUTO_DONE_MASK,
  1631. (1 << CS42L42_PDN_DONE_SHIFT) |
  1632. (1 << CS42L42_HSDET_AUTO_DONE_SHIFT));
  1633. regmap_update_bits(cs42l42->regmap, CS42L42_SRCPL_INT_MASK,
  1634. CS42L42_SRCPL_ADC_LK_MASK |
  1635. CS42L42_SRCPL_DAC_LK_MASK |
  1636. CS42L42_SRCPL_ADC_UNLK_MASK |
  1637. CS42L42_SRCPL_DAC_UNLK_MASK,
  1638. (1 << CS42L42_SRCPL_ADC_LK_SHIFT) |
  1639. (1 << CS42L42_SRCPL_DAC_LK_SHIFT) |
  1640. (1 << CS42L42_SRCPL_ADC_UNLK_SHIFT) |
  1641. (1 << CS42L42_SRCPL_DAC_UNLK_SHIFT));
  1642. regmap_update_bits(cs42l42->regmap, CS42L42_DET_INT1_MASK,
  1643. CS42L42_TIP_SENSE_UNPLUG_MASK |
  1644. CS42L42_TIP_SENSE_PLUG_MASK |
  1645. CS42L42_HSBIAS_SENSE_MASK,
  1646. (1 << CS42L42_TIP_SENSE_UNPLUG_SHIFT) |
  1647. (1 << CS42L42_TIP_SENSE_PLUG_SHIFT) |
  1648. (1 << CS42L42_HSBIAS_SENSE_SHIFT));
  1649. regmap_update_bits(cs42l42->regmap, CS42L42_DET_INT2_MASK,
  1650. CS42L42_M_DETECT_TF_MASK |
  1651. CS42L42_M_DETECT_FT_MASK |
  1652. CS42L42_M_HSBIAS_HIZ_MASK |
  1653. CS42L42_M_SHORT_RLS_MASK |
  1654. CS42L42_M_SHORT_DET_MASK,
  1655. (1 << CS42L42_M_DETECT_TF_SHIFT) |
  1656. (1 << CS42L42_M_DETECT_FT_SHIFT) |
  1657. (1 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
  1658. (1 << CS42L42_M_SHORT_RLS_SHIFT) |
  1659. (1 << CS42L42_M_SHORT_DET_SHIFT));
  1660. regmap_update_bits(cs42l42->regmap, CS42L42_VPMON_INT_MASK,
  1661. CS42L42_VPMON_MASK,
  1662. (1 << CS42L42_VPMON_SHIFT));
  1663. regmap_update_bits(cs42l42->regmap, CS42L42_PLL_LOCK_INT_MASK,
  1664. CS42L42_PLL_LOCK_MASK,
  1665. (1 << CS42L42_PLL_LOCK_SHIFT));
  1666. regmap_update_bits(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK,
  1667. CS42L42_RS_PLUG_MASK |
  1668. CS42L42_RS_UNPLUG_MASK |
  1669. CS42L42_TS_PLUG_MASK |
  1670. CS42L42_TS_UNPLUG_MASK,
  1671. (1 << CS42L42_RS_PLUG_SHIFT) |
  1672. (1 << CS42L42_RS_UNPLUG_SHIFT) |
  1673. (0 << CS42L42_TS_PLUG_SHIFT) |
  1674. (0 << CS42L42_TS_UNPLUG_SHIFT));
  1675. }
  1676. static void cs42l42_setup_hs_type_detect(struct cs42l42_private *cs42l42)
  1677. {
  1678. unsigned int reg;
  1679. cs42l42->hs_type = CS42L42_PLUG_INVALID;
  1680. /*
  1681. * DETECT_MODE must always be 0 with ADC and HP both off otherwise the
  1682. * FILT+ supply will not charge properly.
  1683. */
  1684. regmap_update_bits(cs42l42->regmap, CS42L42_MISC_DET_CTL,
  1685. CS42L42_DETECT_MODE_MASK, 0);
  1686. /* Latch analog controls to VP power domain */
  1687. regmap_update_bits(cs42l42->regmap, CS42L42_MIC_DET_CTL1,
  1688. CS42L42_LATCH_TO_VP_MASK |
  1689. CS42L42_EVENT_STAT_SEL_MASK |
  1690. CS42L42_HS_DET_LEVEL_MASK,
  1691. (1 << CS42L42_LATCH_TO_VP_SHIFT) |
  1692. (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
  1693. (cs42l42->bias_thresholds[0] <<
  1694. CS42L42_HS_DET_LEVEL_SHIFT));
  1695. /* Remove ground noise-suppression clamps */
  1696. regmap_update_bits(cs42l42->regmap,
  1697. CS42L42_HS_CLAMP_DISABLE,
  1698. CS42L42_HS_CLAMP_DISABLE_MASK,
  1699. (1 << CS42L42_HS_CLAMP_DISABLE_SHIFT));
  1700. /* Enable the tip sense circuit */
  1701. regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL,
  1702. CS42L42_TS_INV_MASK, CS42L42_TS_INV_MASK);
  1703. regmap_update_bits(cs42l42->regmap, CS42L42_TIPSENSE_CTL,
  1704. CS42L42_TIP_SENSE_CTRL_MASK |
  1705. CS42L42_TIP_SENSE_INV_MASK |
  1706. CS42L42_TIP_SENSE_DEBOUNCE_MASK,
  1707. (3 << CS42L42_TIP_SENSE_CTRL_SHIFT) |
  1708. (!cs42l42->ts_inv << CS42L42_TIP_SENSE_INV_SHIFT) |
  1709. (2 << CS42L42_TIP_SENSE_DEBOUNCE_SHIFT));
  1710. /* Save the initial status of the tip sense */
  1711. regmap_read(cs42l42->regmap,
  1712. CS42L42_TSRS_PLUG_STATUS,
  1713. &reg);
  1714. cs42l42->plug_state = (((char) reg) &
  1715. (CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK)) >>
  1716. CS42L42_TS_PLUG_SHIFT;
  1717. }
  1718. static const unsigned int threshold_defaults[] = {
  1719. CS42L42_HS_DET_LEVEL_15,
  1720. CS42L42_HS_DET_LEVEL_8,
  1721. CS42L42_HS_DET_LEVEL_4,
  1722. CS42L42_HS_DET_LEVEL_1
  1723. };
  1724. static int cs42l42_handle_device_data(struct device *dev,
  1725. struct cs42l42_private *cs42l42)
  1726. {
  1727. unsigned int val;
  1728. u32 thresholds[CS42L42_NUM_BIASES];
  1729. int ret;
  1730. int i;
  1731. ret = device_property_read_u32(dev, "cirrus,ts-inv", &val);
  1732. if (!ret) {
  1733. switch (val) {
  1734. case CS42L42_TS_INV_EN:
  1735. case CS42L42_TS_INV_DIS:
  1736. cs42l42->ts_inv = val;
  1737. break;
  1738. default:
  1739. dev_err(dev,
  1740. "Wrong cirrus,ts-inv DT value %d\n",
  1741. val);
  1742. cs42l42->ts_inv = CS42L42_TS_INV_DIS;
  1743. }
  1744. } else {
  1745. cs42l42->ts_inv = CS42L42_TS_INV_DIS;
  1746. }
  1747. ret = device_property_read_u32(dev, "cirrus,ts-dbnc-rise", &val);
  1748. if (!ret) {
  1749. switch (val) {
  1750. case CS42L42_TS_DBNCE_0:
  1751. case CS42L42_TS_DBNCE_125:
  1752. case CS42L42_TS_DBNCE_250:
  1753. case CS42L42_TS_DBNCE_500:
  1754. case CS42L42_TS_DBNCE_750:
  1755. case CS42L42_TS_DBNCE_1000:
  1756. case CS42L42_TS_DBNCE_1250:
  1757. case CS42L42_TS_DBNCE_1500:
  1758. cs42l42->ts_dbnc_rise = val;
  1759. break;
  1760. default:
  1761. dev_err(dev,
  1762. "Wrong cirrus,ts-dbnc-rise DT value %d\n",
  1763. val);
  1764. cs42l42->ts_dbnc_rise = CS42L42_TS_DBNCE_1000;
  1765. }
  1766. } else {
  1767. cs42l42->ts_dbnc_rise = CS42L42_TS_DBNCE_1000;
  1768. }
  1769. regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL,
  1770. CS42L42_TS_RISE_DBNCE_TIME_MASK,
  1771. (cs42l42->ts_dbnc_rise <<
  1772. CS42L42_TS_RISE_DBNCE_TIME_SHIFT));
  1773. ret = device_property_read_u32(dev, "cirrus,ts-dbnc-fall", &val);
  1774. if (!ret) {
  1775. switch (val) {
  1776. case CS42L42_TS_DBNCE_0:
  1777. case CS42L42_TS_DBNCE_125:
  1778. case CS42L42_TS_DBNCE_250:
  1779. case CS42L42_TS_DBNCE_500:
  1780. case CS42L42_TS_DBNCE_750:
  1781. case CS42L42_TS_DBNCE_1000:
  1782. case CS42L42_TS_DBNCE_1250:
  1783. case CS42L42_TS_DBNCE_1500:
  1784. cs42l42->ts_dbnc_fall = val;
  1785. break;
  1786. default:
  1787. dev_err(dev,
  1788. "Wrong cirrus,ts-dbnc-fall DT value %d\n",
  1789. val);
  1790. cs42l42->ts_dbnc_fall = CS42L42_TS_DBNCE_0;
  1791. }
  1792. } else {
  1793. cs42l42->ts_dbnc_fall = CS42L42_TS_DBNCE_0;
  1794. }
  1795. regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL,
  1796. CS42L42_TS_FALL_DBNCE_TIME_MASK,
  1797. (cs42l42->ts_dbnc_fall <<
  1798. CS42L42_TS_FALL_DBNCE_TIME_SHIFT));
  1799. ret = device_property_read_u32(dev, "cirrus,btn-det-init-dbnce", &val);
  1800. if (!ret) {
  1801. if (val <= CS42L42_BTN_DET_INIT_DBNCE_MAX)
  1802. cs42l42->btn_det_init_dbnce = val;
  1803. else {
  1804. dev_err(dev,
  1805. "Wrong cirrus,btn-det-init-dbnce DT value %d\n",
  1806. val);
  1807. cs42l42->btn_det_init_dbnce =
  1808. CS42L42_BTN_DET_INIT_DBNCE_DEFAULT;
  1809. }
  1810. } else {
  1811. cs42l42->btn_det_init_dbnce =
  1812. CS42L42_BTN_DET_INIT_DBNCE_DEFAULT;
  1813. }
  1814. ret = device_property_read_u32(dev, "cirrus,btn-det-event-dbnce", &val);
  1815. if (!ret) {
  1816. if (val <= CS42L42_BTN_DET_EVENT_DBNCE_MAX)
  1817. cs42l42->btn_det_event_dbnce = val;
  1818. else {
  1819. dev_err(dev,
  1820. "Wrong cirrus,btn-det-event-dbnce DT value %d\n", val);
  1821. cs42l42->btn_det_event_dbnce =
  1822. CS42L42_BTN_DET_EVENT_DBNCE_DEFAULT;
  1823. }
  1824. } else {
  1825. cs42l42->btn_det_event_dbnce =
  1826. CS42L42_BTN_DET_EVENT_DBNCE_DEFAULT;
  1827. }
  1828. ret = device_property_read_u32_array(dev, "cirrus,bias-lvls",
  1829. thresholds, ARRAY_SIZE(thresholds));
  1830. if (!ret) {
  1831. for (i = 0; i < CS42L42_NUM_BIASES; i++) {
  1832. if (thresholds[i] <= CS42L42_HS_DET_LEVEL_MAX)
  1833. cs42l42->bias_thresholds[i] = thresholds[i];
  1834. else {
  1835. dev_err(dev,
  1836. "Wrong cirrus,bias-lvls[%d] DT value %d\n", i,
  1837. thresholds[i]);
  1838. cs42l42->bias_thresholds[i] = threshold_defaults[i];
  1839. }
  1840. }
  1841. } else {
  1842. for (i = 0; i < CS42L42_NUM_BIASES; i++)
  1843. cs42l42->bias_thresholds[i] = threshold_defaults[i];
  1844. }
  1845. ret = device_property_read_u32(dev, "cirrus,hs-bias-ramp-rate", &val);
  1846. if (!ret) {
  1847. switch (val) {
  1848. case CS42L42_HSBIAS_RAMP_FAST_RISE_SLOW_FALL:
  1849. cs42l42->hs_bias_ramp_rate = val;
  1850. cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME0;
  1851. break;
  1852. case CS42L42_HSBIAS_RAMP_FAST:
  1853. cs42l42->hs_bias_ramp_rate = val;
  1854. cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME1;
  1855. break;
  1856. case CS42L42_HSBIAS_RAMP_SLOW:
  1857. cs42l42->hs_bias_ramp_rate = val;
  1858. cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2;
  1859. break;
  1860. case CS42L42_HSBIAS_RAMP_SLOWEST:
  1861. cs42l42->hs_bias_ramp_rate = val;
  1862. cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME3;
  1863. break;
  1864. default:
  1865. dev_err(dev,
  1866. "Wrong cirrus,hs-bias-ramp-rate DT value %d\n",
  1867. val);
  1868. cs42l42->hs_bias_ramp_rate = CS42L42_HSBIAS_RAMP_SLOW;
  1869. cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2;
  1870. }
  1871. } else {
  1872. cs42l42->hs_bias_ramp_rate = CS42L42_HSBIAS_RAMP_SLOW;
  1873. cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2;
  1874. }
  1875. regmap_update_bits(cs42l42->regmap, CS42L42_HS_BIAS_CTL,
  1876. CS42L42_HSBIAS_RAMP_MASK,
  1877. (cs42l42->hs_bias_ramp_rate <<
  1878. CS42L42_HSBIAS_RAMP_SHIFT));
  1879. if (device_property_read_bool(dev, "cirrus,hs-bias-sense-disable"))
  1880. cs42l42->hs_bias_sense_en = 0;
  1881. else
  1882. cs42l42->hs_bias_sense_en = 1;
  1883. return 0;
  1884. }
  1885. /* Datasheet suspend sequence */
  1886. static const struct reg_sequence __maybe_unused cs42l42_shutdown_seq[] = {
  1887. REG_SEQ0(CS42L42_MIC_DET_CTL1, 0x9F),
  1888. REG_SEQ0(CS42L42_ADC_OVFL_INT_MASK, 0x01),
  1889. REG_SEQ0(CS42L42_MIXER_INT_MASK, 0x0F),
  1890. REG_SEQ0(CS42L42_SRC_INT_MASK, 0x0F),
  1891. REG_SEQ0(CS42L42_ASP_RX_INT_MASK, 0x1F),
  1892. REG_SEQ0(CS42L42_ASP_TX_INT_MASK, 0x0F),
  1893. REG_SEQ0(CS42L42_CODEC_INT_MASK, 0x03),
  1894. REG_SEQ0(CS42L42_SRCPL_INT_MASK, 0x7F),
  1895. REG_SEQ0(CS42L42_VPMON_INT_MASK, 0x01),
  1896. REG_SEQ0(CS42L42_PLL_LOCK_INT_MASK, 0x01),
  1897. REG_SEQ0(CS42L42_TSRS_PLUG_INT_MASK, 0x0F),
  1898. REG_SEQ0(CS42L42_WAKE_CTL, 0xE1),
  1899. REG_SEQ0(CS42L42_DET_INT1_MASK, 0xE0),
  1900. REG_SEQ0(CS42L42_DET_INT2_MASK, 0xFF),
  1901. REG_SEQ0(CS42L42_MIXER_CHA_VOL, 0x3F),
  1902. REG_SEQ0(CS42L42_MIXER_ADC_VOL, 0x3F),
  1903. REG_SEQ0(CS42L42_MIXER_CHB_VOL, 0x3F),
  1904. REG_SEQ0(CS42L42_HP_CTL, 0x0F),
  1905. REG_SEQ0(CS42L42_ASP_RX_DAI0_EN, 0x00),
  1906. REG_SEQ0(CS42L42_ASP_CLK_CFG, 0x00),
  1907. REG_SEQ0(CS42L42_HSDET_CTL2, 0x00),
  1908. REG_SEQ0(CS42L42_PWR_CTL1, 0xFE),
  1909. REG_SEQ0(CS42L42_PWR_CTL2, 0x8C),
  1910. REG_SEQ0(CS42L42_DAC_CTL2, 0x02),
  1911. REG_SEQ0(CS42L42_HS_CLAMP_DISABLE, 0x00),
  1912. REG_SEQ0(CS42L42_MISC_DET_CTL, 0x03),
  1913. REG_SEQ0(CS42L42_TIPSENSE_CTL, 0x02),
  1914. REG_SEQ0(CS42L42_HSBIAS_SC_AUTOCTL, 0x03),
  1915. REG_SEQ0(CS42L42_PWR_CTL1, 0xFF)
  1916. };
  1917. int cs42l42_suspend(struct device *dev)
  1918. {
  1919. struct cs42l42_private *cs42l42 = dev_get_drvdata(dev);
  1920. unsigned int reg;
  1921. u8 save_regs[ARRAY_SIZE(cs42l42_shutdown_seq)];
  1922. int i, ret;
  1923. /*
  1924. * Wait for threaded irq handler to be idle and stop it processing
  1925. * future interrupts. This ensures a safe disable if the interrupt
  1926. * is shared.
  1927. */
  1928. mutex_lock(&cs42l42->irq_lock);
  1929. cs42l42->suspended = true;
  1930. /* Save register values that will be overwritten by shutdown sequence */
  1931. for (i = 0; i < ARRAY_SIZE(cs42l42_shutdown_seq); ++i) {
  1932. regmap_read(cs42l42->regmap, cs42l42_shutdown_seq[i].reg, &reg);
  1933. save_regs[i] = (u8)reg;
  1934. }
  1935. /* Shutdown codec */
  1936. regmap_multi_reg_write(cs42l42->regmap,
  1937. cs42l42_shutdown_seq,
  1938. ARRAY_SIZE(cs42l42_shutdown_seq));
  1939. /* All interrupt sources are now disabled */
  1940. mutex_unlock(&cs42l42->irq_lock);
  1941. /* Wait for power-down complete */
  1942. msleep(CS42L42_PDN_DONE_TIME_MS);
  1943. ret = regmap_read_poll_timeout(cs42l42->regmap,
  1944. CS42L42_CODEC_STATUS, reg,
  1945. (reg & CS42L42_PDN_DONE_MASK),
  1946. CS42L42_PDN_DONE_POLL_US,
  1947. CS42L42_PDN_DONE_TIMEOUT_US);
  1948. if (ret)
  1949. dev_warn(dev, "Failed to get PDN_DONE: %d\n", ret);
  1950. /* Discharge FILT+ */
  1951. regmap_update_bits(cs42l42->regmap, CS42L42_PWR_CTL2,
  1952. CS42L42_DISCHARGE_FILT_MASK, CS42L42_DISCHARGE_FILT_MASK);
  1953. msleep(CS42L42_FILT_DISCHARGE_TIME_MS);
  1954. regcache_cache_only(cs42l42->regmap, true);
  1955. gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
  1956. regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies);
  1957. /* Restore register values to the regmap cache */
  1958. for (i = 0; i < ARRAY_SIZE(cs42l42_shutdown_seq); ++i)
  1959. regmap_write(cs42l42->regmap, cs42l42_shutdown_seq[i].reg, save_regs[i]);
  1960. /* The cached address page register value is now stale */
  1961. regcache_drop_region(cs42l42->regmap, CS42L42_PAGE_REGISTER, CS42L42_PAGE_REGISTER);
  1962. dev_dbg(dev, "System suspended\n");
  1963. return 0;
  1964. }
  1965. EXPORT_SYMBOL_NS_GPL(cs42l42_suspend, SND_SOC_CS42L42_CORE);
  1966. int cs42l42_resume(struct device *dev)
  1967. {
  1968. struct cs42l42_private *cs42l42 = dev_get_drvdata(dev);
  1969. int ret;
  1970. /*
  1971. * If jack was unplugged and re-plugged during suspend it could
  1972. * have changed type but the tip-sense state hasn't changed.
  1973. * Force a plugged state to be re-evaluated.
  1974. */
  1975. if (cs42l42->plug_state != CS42L42_TS_UNPLUG)
  1976. cs42l42->plug_state = CS42L42_TS_TRANS;
  1977. ret = regulator_bulk_enable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies);
  1978. if (ret != 0) {
  1979. dev_err(dev, "Failed to enable supplies: %d\n", ret);
  1980. return ret;
  1981. }
  1982. gpiod_set_value_cansleep(cs42l42->reset_gpio, 1);
  1983. usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2);
  1984. dev_dbg(dev, "System resume powered up\n");
  1985. return 0;
  1986. }
  1987. EXPORT_SYMBOL_NS_GPL(cs42l42_resume, SND_SOC_CS42L42_CORE);
  1988. void cs42l42_resume_restore(struct device *dev)
  1989. {
  1990. struct cs42l42_private *cs42l42 = dev_get_drvdata(dev);
  1991. regcache_cache_only(cs42l42->regmap, false);
  1992. regcache_mark_dirty(cs42l42->regmap);
  1993. mutex_lock(&cs42l42->irq_lock);
  1994. /* Sync LATCH_TO_VP first so the VP domain registers sync correctly */
  1995. regcache_sync_region(cs42l42->regmap, CS42L42_MIC_DET_CTL1, CS42L42_MIC_DET_CTL1);
  1996. regcache_sync(cs42l42->regmap);
  1997. cs42l42->suspended = false;
  1998. mutex_unlock(&cs42l42->irq_lock);
  1999. dev_dbg(dev, "System resumed\n");
  2000. }
  2001. EXPORT_SYMBOL_NS_GPL(cs42l42_resume_restore, SND_SOC_CS42L42_CORE);
  2002. static int __maybe_unused cs42l42_i2c_resume(struct device *dev)
  2003. {
  2004. int ret;
  2005. ret = cs42l42_resume(dev);
  2006. if (ret)
  2007. return ret;
  2008. cs42l42_resume_restore(dev);
  2009. return 0;
  2010. }
  2011. int cs42l42_common_probe(struct cs42l42_private *cs42l42,
  2012. const struct snd_soc_component_driver *component_drv,
  2013. struct snd_soc_dai_driver *dai)
  2014. {
  2015. int ret, i;
  2016. dev_set_drvdata(cs42l42->dev, cs42l42);
  2017. mutex_init(&cs42l42->irq_lock);
  2018. BUILD_BUG_ON(ARRAY_SIZE(cs42l42_supply_names) != ARRAY_SIZE(cs42l42->supplies));
  2019. for (i = 0; i < ARRAY_SIZE(cs42l42->supplies); i++)
  2020. cs42l42->supplies[i].supply = cs42l42_supply_names[i];
  2021. ret = devm_regulator_bulk_get(cs42l42->dev,
  2022. ARRAY_SIZE(cs42l42->supplies),
  2023. cs42l42->supplies);
  2024. if (ret != 0) {
  2025. dev_err(cs42l42->dev,
  2026. "Failed to request supplies: %d\n", ret);
  2027. return ret;
  2028. }
  2029. ret = regulator_bulk_enable(ARRAY_SIZE(cs42l42->supplies),
  2030. cs42l42->supplies);
  2031. if (ret != 0) {
  2032. dev_err(cs42l42->dev,
  2033. "Failed to enable supplies: %d\n", ret);
  2034. return ret;
  2035. }
  2036. /* Reset the Device */
  2037. cs42l42->reset_gpio = devm_gpiod_get_optional(cs42l42->dev,
  2038. "reset", GPIOD_OUT_LOW);
  2039. if (IS_ERR(cs42l42->reset_gpio)) {
  2040. ret = PTR_ERR(cs42l42->reset_gpio);
  2041. goto err_disable_noreset;
  2042. }
  2043. if (cs42l42->reset_gpio) {
  2044. dev_dbg(cs42l42->dev, "Found reset GPIO\n");
  2045. /*
  2046. * ACPI can override the default GPIO state we requested
  2047. * so ensure that we start with RESET low.
  2048. */
  2049. gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
  2050. /* Ensure minimum reset pulse width */
  2051. usleep_range(10, 500);
  2052. gpiod_set_value_cansleep(cs42l42->reset_gpio, 1);
  2053. }
  2054. usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2);
  2055. /* Request IRQ if one was specified */
  2056. if (cs42l42->irq) {
  2057. ret = request_threaded_irq(cs42l42->irq,
  2058. NULL, cs42l42_irq_thread,
  2059. IRQF_ONESHOT | IRQF_TRIGGER_LOW,
  2060. "cs42l42", cs42l42);
  2061. if (ret) {
  2062. dev_err_probe(cs42l42->dev, ret,
  2063. "Failed to request IRQ\n");
  2064. goto err_disable_noirq;
  2065. }
  2066. }
  2067. /* Register codec now so it can EPROBE_DEFER */
  2068. ret = devm_snd_soc_register_component(cs42l42->dev, component_drv, dai, 1);
  2069. if (ret < 0)
  2070. goto err;
  2071. return 0;
  2072. err:
  2073. if (cs42l42->irq)
  2074. free_irq(cs42l42->irq, cs42l42);
  2075. err_disable_noirq:
  2076. gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
  2077. err_disable_noreset:
  2078. regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies);
  2079. return ret;
  2080. }
  2081. EXPORT_SYMBOL_NS_GPL(cs42l42_common_probe, SND_SOC_CS42L42_CORE);
  2082. int cs42l42_init(struct cs42l42_private *cs42l42)
  2083. {
  2084. unsigned int reg;
  2085. int devid, ret;
  2086. /* initialize codec */
  2087. devid = cirrus_read_device_id(cs42l42->regmap, CS42L42_DEVID_AB);
  2088. if (devid < 0) {
  2089. ret = devid;
  2090. dev_err(cs42l42->dev, "Failed to read device ID: %d\n", ret);
  2091. goto err_disable;
  2092. }
  2093. if (devid != cs42l42->devid) {
  2094. ret = -ENODEV;
  2095. dev_err(cs42l42->dev,
  2096. "CS42L%x Device ID (%X). Expected %X\n",
  2097. cs42l42->devid & 0xff, devid, cs42l42->devid);
  2098. goto err_disable;
  2099. }
  2100. ret = regmap_read(cs42l42->regmap, CS42L42_REVID, &reg);
  2101. if (ret < 0) {
  2102. dev_err(cs42l42->dev, "Get Revision ID failed\n");
  2103. goto err_shutdown;
  2104. }
  2105. dev_info(cs42l42->dev,
  2106. "Cirrus Logic CS42L%x, Revision: %02X\n",
  2107. cs42l42->devid & 0xff, reg & 0xFF);
  2108. /* Power up the codec */
  2109. regmap_update_bits(cs42l42->regmap, CS42L42_PWR_CTL1,
  2110. CS42L42_ASP_DAO_PDN_MASK |
  2111. CS42L42_ASP_DAI_PDN_MASK |
  2112. CS42L42_MIXER_PDN_MASK |
  2113. CS42L42_EQ_PDN_MASK |
  2114. CS42L42_HP_PDN_MASK |
  2115. CS42L42_ADC_PDN_MASK |
  2116. CS42L42_PDN_ALL_MASK,
  2117. (1 << CS42L42_ASP_DAO_PDN_SHIFT) |
  2118. (1 << CS42L42_ASP_DAI_PDN_SHIFT) |
  2119. (1 << CS42L42_MIXER_PDN_SHIFT) |
  2120. (1 << CS42L42_EQ_PDN_SHIFT) |
  2121. (1 << CS42L42_HP_PDN_SHIFT) |
  2122. (1 << CS42L42_ADC_PDN_SHIFT) |
  2123. (0 << CS42L42_PDN_ALL_SHIFT));
  2124. ret = cs42l42_handle_device_data(cs42l42->dev, cs42l42);
  2125. if (ret != 0)
  2126. goto err_shutdown;
  2127. /* Setup headset detection */
  2128. cs42l42_setup_hs_type_detect(cs42l42);
  2129. /*
  2130. * Set init_done before unmasking interrupts so any triggered
  2131. * immediately will be handled.
  2132. */
  2133. cs42l42->init_done = true;
  2134. /* Mask/Unmask Interrupts */
  2135. cs42l42_set_interrupt_masks(cs42l42);
  2136. return 0;
  2137. err_shutdown:
  2138. regmap_write(cs42l42->regmap, CS42L42_CODEC_INT_MASK, 0xff);
  2139. regmap_write(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK, 0xff);
  2140. regmap_write(cs42l42->regmap, CS42L42_PWR_CTL1, 0xff);
  2141. err_disable:
  2142. if (cs42l42->irq)
  2143. free_irq(cs42l42->irq, cs42l42);
  2144. gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
  2145. regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies),
  2146. cs42l42->supplies);
  2147. return ret;
  2148. }
  2149. EXPORT_SYMBOL_NS_GPL(cs42l42_init, SND_SOC_CS42L42_CORE);
  2150. void cs42l42_common_remove(struct cs42l42_private *cs42l42)
  2151. {
  2152. if (cs42l42->irq)
  2153. free_irq(cs42l42->irq, cs42l42);
  2154. /*
  2155. * The driver might not have control of reset and power supplies,
  2156. * so ensure that the chip internals are powered down.
  2157. */
  2158. if (cs42l42->init_done) {
  2159. regmap_write(cs42l42->regmap, CS42L42_CODEC_INT_MASK, 0xff);
  2160. regmap_write(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK, 0xff);
  2161. regmap_write(cs42l42->regmap, CS42L42_PWR_CTL1, 0xff);
  2162. }
  2163. gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
  2164. regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies), cs42l42->supplies);
  2165. }
  2166. EXPORT_SYMBOL_NS_GPL(cs42l42_common_remove, SND_SOC_CS42L42_CORE);
  2167. MODULE_DESCRIPTION("ASoC CS42L42 driver");
  2168. MODULE_AUTHOR("James Schulman, Cirrus Logic Inc, <[email protected]>");
  2169. MODULE_AUTHOR("Brian Austin, Cirrus Logic Inc, <[email protected]>");
  2170. MODULE_AUTHOR("Michael White, Cirrus Logic Inc, <[email protected]>");
  2171. MODULE_AUTHOR("Lucas Tanure <[email protected]>");
  2172. MODULE_AUTHOR("Richard Fitzgerald <[email protected]>");
  2173. MODULE_AUTHOR("Vitaly Rodionov <[email protected]>");
  2174. MODULE_LICENSE("GPL");