da7218.c 106 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339
  1. /*
  2. * da7218.c - DA7218 ALSA SoC Codec Driver
  3. *
  4. * Copyright (c) 2015 Dialog Semiconductor
  5. *
  6. * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. */
  13. #include <linux/clk.h>
  14. #include <linux/i2c.h>
  15. #include <linux/of_device.h>
  16. #include <linux/regmap.h>
  17. #include <linux/slab.h>
  18. #include <linux/pm.h>
  19. #include <linux/module.h>
  20. #include <linux/delay.h>
  21. #include <linux/regulator/consumer.h>
  22. #include <sound/pcm.h>
  23. #include <sound/pcm_params.h>
  24. #include <sound/soc.h>
  25. #include <sound/soc-dapm.h>
  26. #include <sound/jack.h>
  27. #include <sound/initval.h>
  28. #include <sound/tlv.h>
  29. #include <asm/div64.h>
  30. #include <sound/da7218.h>
  31. #include "da7218.h"
  32. /*
  33. * TLVs and Enums
  34. */
  35. /* Input TLVs */
  36. static const DECLARE_TLV_DB_SCALE(da7218_mic_gain_tlv, -600, 600, 0);
  37. static const DECLARE_TLV_DB_SCALE(da7218_mixin_gain_tlv, -450, 150, 0);
  38. static const DECLARE_TLV_DB_SCALE(da7218_in_dig_gain_tlv, -8325, 75, 0);
  39. static const DECLARE_TLV_DB_SCALE(da7218_ags_trigger_tlv, -9000, 600, 0);
  40. static const DECLARE_TLV_DB_SCALE(da7218_ags_att_max_tlv, 0, 600, 0);
  41. static const DECLARE_TLV_DB_SCALE(da7218_alc_threshold_tlv, -9450, 150, 0);
  42. static const DECLARE_TLV_DB_SCALE(da7218_alc_gain_tlv, 0, 600, 0);
  43. static const DECLARE_TLV_DB_SCALE(da7218_alc_ana_gain_tlv, 0, 600, 0);
  44. /* Input/Output TLVs */
  45. static const DECLARE_TLV_DB_SCALE(da7218_dmix_gain_tlv, -4200, 150, 0);
  46. /* Output TLVs */
  47. static const DECLARE_TLV_DB_SCALE(da7218_dgs_trigger_tlv, -9450, 150, 0);
  48. static const DECLARE_TLV_DB_SCALE(da7218_dgs_anticlip_tlv, -4200, 600, 0);
  49. static const DECLARE_TLV_DB_SCALE(da7218_dgs_signal_tlv, -9000, 600, 0);
  50. static const DECLARE_TLV_DB_SCALE(da7218_out_eq_band_tlv, -1050, 150, 0);
  51. static const DECLARE_TLV_DB_SCALE(da7218_out_dig_gain_tlv, -8325, 75, 0);
  52. static const DECLARE_TLV_DB_SCALE(da7218_dac_ng_threshold_tlv, -10200, 600, 0);
  53. static const DECLARE_TLV_DB_SCALE(da7218_mixout_gain_tlv, -100, 50, 0);
  54. static const DECLARE_TLV_DB_SCALE(da7218_hp_gain_tlv, -5700, 150, 0);
  55. /* Input Enums */
  56. static const char * const da7218_alc_attack_rate_txt[] = {
  57. "7.33/fs", "14.66/fs", "29.32/fs", "58.64/fs", "117.3/fs", "234.6/fs",
  58. "469.1/fs", "938.2/fs", "1876/fs", "3753/fs", "7506/fs", "15012/fs",
  59. "30024/fs",
  60. };
  61. static const struct soc_enum da7218_alc_attack_rate =
  62. SOC_ENUM_SINGLE(DA7218_ALC_CTRL2, DA7218_ALC_ATTACK_SHIFT,
  63. DA7218_ALC_ATTACK_MAX, da7218_alc_attack_rate_txt);
  64. static const char * const da7218_alc_release_rate_txt[] = {
  65. "28.66/fs", "57.33/fs", "114.6/fs", "229.3/fs", "458.6/fs", "917.1/fs",
  66. "1834/fs", "3668/fs", "7337/fs", "14674/fs", "29348/fs",
  67. };
  68. static const struct soc_enum da7218_alc_release_rate =
  69. SOC_ENUM_SINGLE(DA7218_ALC_CTRL2, DA7218_ALC_RELEASE_SHIFT,
  70. DA7218_ALC_RELEASE_MAX, da7218_alc_release_rate_txt);
  71. static const char * const da7218_alc_hold_time_txt[] = {
  72. "62/fs", "124/fs", "248/fs", "496/fs", "992/fs", "1984/fs", "3968/fs",
  73. "7936/fs", "15872/fs", "31744/fs", "63488/fs", "126976/fs",
  74. "253952/fs", "507904/fs", "1015808/fs", "2031616/fs"
  75. };
  76. static const struct soc_enum da7218_alc_hold_time =
  77. SOC_ENUM_SINGLE(DA7218_ALC_CTRL3, DA7218_ALC_HOLD_SHIFT,
  78. DA7218_ALC_HOLD_MAX, da7218_alc_hold_time_txt);
  79. static const char * const da7218_alc_anticlip_step_txt[] = {
  80. "0.034dB/fs", "0.068dB/fs", "0.136dB/fs", "0.272dB/fs",
  81. };
  82. static const struct soc_enum da7218_alc_anticlip_step =
  83. SOC_ENUM_SINGLE(DA7218_ALC_ANTICLIP_CTRL,
  84. DA7218_ALC_ANTICLIP_STEP_SHIFT,
  85. DA7218_ALC_ANTICLIP_STEP_MAX,
  86. da7218_alc_anticlip_step_txt);
  87. static const char * const da7218_integ_rate_txt[] = {
  88. "1/4", "1/16", "1/256", "1/65536"
  89. };
  90. static const struct soc_enum da7218_integ_attack_rate =
  91. SOC_ENUM_SINGLE(DA7218_ENV_TRACK_CTRL, DA7218_INTEG_ATTACK_SHIFT,
  92. DA7218_INTEG_MAX, da7218_integ_rate_txt);
  93. static const struct soc_enum da7218_integ_release_rate =
  94. SOC_ENUM_SINGLE(DA7218_ENV_TRACK_CTRL, DA7218_INTEG_RELEASE_SHIFT,
  95. DA7218_INTEG_MAX, da7218_integ_rate_txt);
  96. /* Input/Output Enums */
  97. static const char * const da7218_gain_ramp_rate_txt[] = {
  98. "Nominal Rate * 8", "Nominal Rate", "Nominal Rate / 8",
  99. "Nominal Rate / 16",
  100. };
  101. static const struct soc_enum da7218_gain_ramp_rate =
  102. SOC_ENUM_SINGLE(DA7218_GAIN_RAMP_CTRL, DA7218_GAIN_RAMP_RATE_SHIFT,
  103. DA7218_GAIN_RAMP_RATE_MAX, da7218_gain_ramp_rate_txt);
  104. static const char * const da7218_hpf_mode_txt[] = {
  105. "Disabled", "Audio", "Voice",
  106. };
  107. static const unsigned int da7218_hpf_mode_val[] = {
  108. DA7218_HPF_DISABLED, DA7218_HPF_AUDIO_EN, DA7218_HPF_VOICE_EN,
  109. };
  110. static const struct soc_enum da7218_in1_hpf_mode =
  111. SOC_VALUE_ENUM_SINGLE(DA7218_IN_1_HPF_FILTER_CTRL,
  112. DA7218_HPF_MODE_SHIFT, DA7218_HPF_MODE_MASK,
  113. DA7218_HPF_MODE_MAX, da7218_hpf_mode_txt,
  114. da7218_hpf_mode_val);
  115. static const struct soc_enum da7218_in2_hpf_mode =
  116. SOC_VALUE_ENUM_SINGLE(DA7218_IN_2_HPF_FILTER_CTRL,
  117. DA7218_HPF_MODE_SHIFT, DA7218_HPF_MODE_MASK,
  118. DA7218_HPF_MODE_MAX, da7218_hpf_mode_txt,
  119. da7218_hpf_mode_val);
  120. static const struct soc_enum da7218_out1_hpf_mode =
  121. SOC_VALUE_ENUM_SINGLE(DA7218_OUT_1_HPF_FILTER_CTRL,
  122. DA7218_HPF_MODE_SHIFT, DA7218_HPF_MODE_MASK,
  123. DA7218_HPF_MODE_MAX, da7218_hpf_mode_txt,
  124. da7218_hpf_mode_val);
  125. static const char * const da7218_audio_hpf_corner_txt[] = {
  126. "2Hz", "4Hz", "8Hz", "16Hz",
  127. };
  128. static const struct soc_enum da7218_in1_audio_hpf_corner =
  129. SOC_ENUM_SINGLE(DA7218_IN_1_HPF_FILTER_CTRL,
  130. DA7218_IN_1_AUDIO_HPF_CORNER_SHIFT,
  131. DA7218_AUDIO_HPF_CORNER_MAX,
  132. da7218_audio_hpf_corner_txt);
  133. static const struct soc_enum da7218_in2_audio_hpf_corner =
  134. SOC_ENUM_SINGLE(DA7218_IN_2_HPF_FILTER_CTRL,
  135. DA7218_IN_2_AUDIO_HPF_CORNER_SHIFT,
  136. DA7218_AUDIO_HPF_CORNER_MAX,
  137. da7218_audio_hpf_corner_txt);
  138. static const struct soc_enum da7218_out1_audio_hpf_corner =
  139. SOC_ENUM_SINGLE(DA7218_OUT_1_HPF_FILTER_CTRL,
  140. DA7218_OUT_1_AUDIO_HPF_CORNER_SHIFT,
  141. DA7218_AUDIO_HPF_CORNER_MAX,
  142. da7218_audio_hpf_corner_txt);
  143. static const char * const da7218_voice_hpf_corner_txt[] = {
  144. "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz",
  145. };
  146. static const struct soc_enum da7218_in1_voice_hpf_corner =
  147. SOC_ENUM_SINGLE(DA7218_IN_1_HPF_FILTER_CTRL,
  148. DA7218_IN_1_VOICE_HPF_CORNER_SHIFT,
  149. DA7218_VOICE_HPF_CORNER_MAX,
  150. da7218_voice_hpf_corner_txt);
  151. static const struct soc_enum da7218_in2_voice_hpf_corner =
  152. SOC_ENUM_SINGLE(DA7218_IN_2_HPF_FILTER_CTRL,
  153. DA7218_IN_2_VOICE_HPF_CORNER_SHIFT,
  154. DA7218_VOICE_HPF_CORNER_MAX,
  155. da7218_voice_hpf_corner_txt);
  156. static const struct soc_enum da7218_out1_voice_hpf_corner =
  157. SOC_ENUM_SINGLE(DA7218_OUT_1_HPF_FILTER_CTRL,
  158. DA7218_OUT_1_VOICE_HPF_CORNER_SHIFT,
  159. DA7218_VOICE_HPF_CORNER_MAX,
  160. da7218_voice_hpf_corner_txt);
  161. static const char * const da7218_tonegen_dtmf_key_txt[] = {
  162. "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D",
  163. "*", "#"
  164. };
  165. static const struct soc_enum da7218_tonegen_dtmf_key =
  166. SOC_ENUM_SINGLE(DA7218_TONE_GEN_CFG1, DA7218_DTMF_REG_SHIFT,
  167. DA7218_DTMF_REG_MAX, da7218_tonegen_dtmf_key_txt);
  168. static const char * const da7218_tonegen_swg_sel_txt[] = {
  169. "Sum", "SWG1", "SWG2", "SWG1_1-Cos"
  170. };
  171. static const struct soc_enum da7218_tonegen_swg_sel =
  172. SOC_ENUM_SINGLE(DA7218_TONE_GEN_CFG2, DA7218_SWG_SEL_SHIFT,
  173. DA7218_SWG_SEL_MAX, da7218_tonegen_swg_sel_txt);
  174. /* Output Enums */
  175. static const char * const da7218_dgs_rise_coeff_txt[] = {
  176. "1/1", "1/16", "1/64", "1/256", "1/1024", "1/4096", "1/16384",
  177. };
  178. static const struct soc_enum da7218_dgs_rise_coeff =
  179. SOC_ENUM_SINGLE(DA7218_DGS_RISE_FALL, DA7218_DGS_RISE_COEFF_SHIFT,
  180. DA7218_DGS_RISE_COEFF_MAX, da7218_dgs_rise_coeff_txt);
  181. static const char * const da7218_dgs_fall_coeff_txt[] = {
  182. "1/4", "1/16", "1/64", "1/256", "1/1024", "1/4096", "1/16384", "1/65536",
  183. };
  184. static const struct soc_enum da7218_dgs_fall_coeff =
  185. SOC_ENUM_SINGLE(DA7218_DGS_RISE_FALL, DA7218_DGS_FALL_COEFF_SHIFT,
  186. DA7218_DGS_FALL_COEFF_MAX, da7218_dgs_fall_coeff_txt);
  187. static const char * const da7218_dac_ng_setup_time_txt[] = {
  188. "256 Samples", "512 Samples", "1024 Samples", "2048 Samples"
  189. };
  190. static const struct soc_enum da7218_dac_ng_setup_time =
  191. SOC_ENUM_SINGLE(DA7218_DAC_NG_SETUP_TIME,
  192. DA7218_DAC_NG_SETUP_TIME_SHIFT,
  193. DA7218_DAC_NG_SETUP_TIME_MAX,
  194. da7218_dac_ng_setup_time_txt);
  195. static const char * const da7218_dac_ng_rampup_txt[] = {
  196. "0.22ms/dB", "0.0138ms/dB"
  197. };
  198. static const struct soc_enum da7218_dac_ng_rampup_rate =
  199. SOC_ENUM_SINGLE(DA7218_DAC_NG_SETUP_TIME,
  200. DA7218_DAC_NG_RAMPUP_RATE_SHIFT,
  201. DA7218_DAC_NG_RAMPUP_RATE_MAX,
  202. da7218_dac_ng_rampup_txt);
  203. static const char * const da7218_dac_ng_rampdown_txt[] = {
  204. "0.88ms/dB", "14.08ms/dB"
  205. };
  206. static const struct soc_enum da7218_dac_ng_rampdown_rate =
  207. SOC_ENUM_SINGLE(DA7218_DAC_NG_SETUP_TIME,
  208. DA7218_DAC_NG_RAMPDN_RATE_SHIFT,
  209. DA7218_DAC_NG_RAMPDN_RATE_MAX,
  210. da7218_dac_ng_rampdown_txt);
  211. static const char * const da7218_cp_mchange_txt[] = {
  212. "Largest Volume", "DAC Volume", "Signal Magnitude"
  213. };
  214. static const unsigned int da7218_cp_mchange_val[] = {
  215. DA7218_CP_MCHANGE_LARGEST_VOL, DA7218_CP_MCHANGE_DAC_VOL,
  216. DA7218_CP_MCHANGE_SIG_MAG
  217. };
  218. static const struct soc_enum da7218_cp_mchange =
  219. SOC_VALUE_ENUM_SINGLE(DA7218_CP_CTRL, DA7218_CP_MCHANGE_SHIFT,
  220. DA7218_CP_MCHANGE_REL_MASK, DA7218_CP_MCHANGE_MAX,
  221. da7218_cp_mchange_txt, da7218_cp_mchange_val);
  222. static const char * const da7218_cp_fcontrol_txt[] = {
  223. "1MHz", "500KHz", "250KHz", "125KHz", "63KHz", "0KHz"
  224. };
  225. static const struct soc_enum da7218_cp_fcontrol =
  226. SOC_ENUM_SINGLE(DA7218_CP_DELAY, DA7218_CP_FCONTROL_SHIFT,
  227. DA7218_CP_FCONTROL_MAX, da7218_cp_fcontrol_txt);
  228. static const char * const da7218_cp_tau_delay_txt[] = {
  229. "0ms", "2ms", "4ms", "16ms", "64ms", "128ms", "256ms", "512ms"
  230. };
  231. static const struct soc_enum da7218_cp_tau_delay =
  232. SOC_ENUM_SINGLE(DA7218_CP_DELAY, DA7218_CP_TAU_DELAY_SHIFT,
  233. DA7218_CP_TAU_DELAY_MAX, da7218_cp_tau_delay_txt);
  234. /*
  235. * Control Functions
  236. */
  237. /* ALC */
  238. static void da7218_alc_calib(struct snd_soc_codec *codec)
  239. {
  240. u8 mic_1_ctrl, mic_2_ctrl;
  241. u8 mixin_1_ctrl, mixin_2_ctrl;
  242. u8 in_1l_filt_ctrl, in_1r_filt_ctrl, in_2l_filt_ctrl, in_2r_filt_ctrl;
  243. u8 in_1_hpf_ctrl, in_2_hpf_ctrl;
  244. u8 calib_ctrl;
  245. int i = 0;
  246. bool calibrated = false;
  247. /* Save current state of MIC control registers */
  248. mic_1_ctrl = snd_soc_read(codec, DA7218_MIC_1_CTRL);
  249. mic_2_ctrl = snd_soc_read(codec, DA7218_MIC_2_CTRL);
  250. /* Save current state of input mixer control registers */
  251. mixin_1_ctrl = snd_soc_read(codec, DA7218_MIXIN_1_CTRL);
  252. mixin_2_ctrl = snd_soc_read(codec, DA7218_MIXIN_2_CTRL);
  253. /* Save current state of input filter control registers */
  254. in_1l_filt_ctrl = snd_soc_read(codec, DA7218_IN_1L_FILTER_CTRL);
  255. in_1r_filt_ctrl = snd_soc_read(codec, DA7218_IN_1R_FILTER_CTRL);
  256. in_2l_filt_ctrl = snd_soc_read(codec, DA7218_IN_2L_FILTER_CTRL);
  257. in_2r_filt_ctrl = snd_soc_read(codec, DA7218_IN_2R_FILTER_CTRL);
  258. /* Save current state of input HPF control registers */
  259. in_1_hpf_ctrl = snd_soc_read(codec, DA7218_IN_1_HPF_FILTER_CTRL);
  260. in_2_hpf_ctrl = snd_soc_read(codec, DA7218_IN_2_HPF_FILTER_CTRL);
  261. /* Enable then Mute MIC PGAs */
  262. snd_soc_update_bits(codec, DA7218_MIC_1_CTRL, DA7218_MIC_1_AMP_EN_MASK,
  263. DA7218_MIC_1_AMP_EN_MASK);
  264. snd_soc_update_bits(codec, DA7218_MIC_2_CTRL, DA7218_MIC_2_AMP_EN_MASK,
  265. DA7218_MIC_2_AMP_EN_MASK);
  266. snd_soc_update_bits(codec, DA7218_MIC_1_CTRL,
  267. DA7218_MIC_1_AMP_MUTE_EN_MASK,
  268. DA7218_MIC_1_AMP_MUTE_EN_MASK);
  269. snd_soc_update_bits(codec, DA7218_MIC_2_CTRL,
  270. DA7218_MIC_2_AMP_MUTE_EN_MASK,
  271. DA7218_MIC_2_AMP_MUTE_EN_MASK);
  272. /* Enable input mixers unmuted */
  273. snd_soc_update_bits(codec, DA7218_MIXIN_1_CTRL,
  274. DA7218_MIXIN_1_AMP_EN_MASK |
  275. DA7218_MIXIN_1_AMP_MUTE_EN_MASK,
  276. DA7218_MIXIN_1_AMP_EN_MASK);
  277. snd_soc_update_bits(codec, DA7218_MIXIN_2_CTRL,
  278. DA7218_MIXIN_2_AMP_EN_MASK |
  279. DA7218_MIXIN_2_AMP_MUTE_EN_MASK,
  280. DA7218_MIXIN_2_AMP_EN_MASK);
  281. /* Enable input filters unmuted */
  282. snd_soc_update_bits(codec, DA7218_IN_1L_FILTER_CTRL,
  283. DA7218_IN_1L_FILTER_EN_MASK |
  284. DA7218_IN_1L_MUTE_EN_MASK,
  285. DA7218_IN_1L_FILTER_EN_MASK);
  286. snd_soc_update_bits(codec, DA7218_IN_1R_FILTER_CTRL,
  287. DA7218_IN_1R_FILTER_EN_MASK |
  288. DA7218_IN_1R_MUTE_EN_MASK,
  289. DA7218_IN_1R_FILTER_EN_MASK);
  290. snd_soc_update_bits(codec, DA7218_IN_2L_FILTER_CTRL,
  291. DA7218_IN_2L_FILTER_EN_MASK |
  292. DA7218_IN_2L_MUTE_EN_MASK,
  293. DA7218_IN_2L_FILTER_EN_MASK);
  294. snd_soc_update_bits(codec, DA7218_IN_2R_FILTER_CTRL,
  295. DA7218_IN_2R_FILTER_EN_MASK |
  296. DA7218_IN_2R_MUTE_EN_MASK,
  297. DA7218_IN_2R_FILTER_EN_MASK);
  298. /*
  299. * Make sure input HPFs voice mode is disabled, otherwise for sampling
  300. * rates above 32KHz the ADC signals will be stopped and will cause
  301. * calibration to lock up.
  302. */
  303. snd_soc_update_bits(codec, DA7218_IN_1_HPF_FILTER_CTRL,
  304. DA7218_IN_1_VOICE_EN_MASK, 0);
  305. snd_soc_update_bits(codec, DA7218_IN_2_HPF_FILTER_CTRL,
  306. DA7218_IN_2_VOICE_EN_MASK, 0);
  307. /* Perform auto calibration */
  308. snd_soc_update_bits(codec, DA7218_CALIB_CTRL, DA7218_CALIB_AUTO_EN_MASK,
  309. DA7218_CALIB_AUTO_EN_MASK);
  310. do {
  311. calib_ctrl = snd_soc_read(codec, DA7218_CALIB_CTRL);
  312. if (calib_ctrl & DA7218_CALIB_AUTO_EN_MASK) {
  313. ++i;
  314. usleep_range(DA7218_ALC_CALIB_DELAY_MIN,
  315. DA7218_ALC_CALIB_DELAY_MAX);
  316. } else {
  317. calibrated = true;
  318. }
  319. } while ((i < DA7218_ALC_CALIB_MAX_TRIES) && (!calibrated));
  320. /* If auto calibration fails, disable DC offset, hybrid ALC */
  321. if ((!calibrated) || (calib_ctrl & DA7218_CALIB_OVERFLOW_MASK)) {
  322. dev_warn(codec->dev,
  323. "ALC auto calibration failed - %s\n",
  324. (calibrated) ? "overflow" : "timeout");
  325. snd_soc_update_bits(codec, DA7218_CALIB_CTRL,
  326. DA7218_CALIB_OFFSET_EN_MASK, 0);
  327. snd_soc_update_bits(codec, DA7218_ALC_CTRL1,
  328. DA7218_ALC_SYNC_MODE_MASK, 0);
  329. } else {
  330. /* Enable DC offset cancellation */
  331. snd_soc_update_bits(codec, DA7218_CALIB_CTRL,
  332. DA7218_CALIB_OFFSET_EN_MASK,
  333. DA7218_CALIB_OFFSET_EN_MASK);
  334. /* Enable ALC hybrid mode */
  335. snd_soc_update_bits(codec, DA7218_ALC_CTRL1,
  336. DA7218_ALC_SYNC_MODE_MASK,
  337. DA7218_ALC_SYNC_MODE_CH1 |
  338. DA7218_ALC_SYNC_MODE_CH2);
  339. }
  340. /* Restore input HPF control registers to original states */
  341. snd_soc_write(codec, DA7218_IN_1_HPF_FILTER_CTRL, in_1_hpf_ctrl);
  342. snd_soc_write(codec, DA7218_IN_2_HPF_FILTER_CTRL, in_2_hpf_ctrl);
  343. /* Restore input filter control registers to original states */
  344. snd_soc_write(codec, DA7218_IN_1L_FILTER_CTRL, in_1l_filt_ctrl);
  345. snd_soc_write(codec, DA7218_IN_1R_FILTER_CTRL, in_1r_filt_ctrl);
  346. snd_soc_write(codec, DA7218_IN_2L_FILTER_CTRL, in_2l_filt_ctrl);
  347. snd_soc_write(codec, DA7218_IN_2R_FILTER_CTRL, in_2r_filt_ctrl);
  348. /* Restore input mixer control registers to original state */
  349. snd_soc_write(codec, DA7218_MIXIN_1_CTRL, mixin_1_ctrl);
  350. snd_soc_write(codec, DA7218_MIXIN_2_CTRL, mixin_2_ctrl);
  351. /* Restore MIC control registers to original states */
  352. snd_soc_write(codec, DA7218_MIC_1_CTRL, mic_1_ctrl);
  353. snd_soc_write(codec, DA7218_MIC_2_CTRL, mic_2_ctrl);
  354. }
  355. static int da7218_mixin_gain_put(struct snd_kcontrol *kcontrol,
  356. struct snd_ctl_elem_value *ucontrol)
  357. {
  358. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  359. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  360. int ret;
  361. ret = snd_soc_put_volsw(kcontrol, ucontrol);
  362. /*
  363. * If ALC in operation and value of control has been updated,
  364. * make sure calibrated offsets are updated.
  365. */
  366. if ((ret == 1) && (da7218->alc_en))
  367. da7218_alc_calib(codec);
  368. return ret;
  369. }
  370. static int da7218_alc_sw_put(struct snd_kcontrol *kcontrol,
  371. struct snd_ctl_elem_value *ucontrol)
  372. {
  373. struct soc_mixer_control *mc =
  374. (struct soc_mixer_control *) kcontrol->private_value;
  375. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  376. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  377. unsigned int lvalue = ucontrol->value.integer.value[0];
  378. unsigned int rvalue = ucontrol->value.integer.value[1];
  379. unsigned int lshift = mc->shift;
  380. unsigned int rshift = mc->rshift;
  381. unsigned int mask = (mc->max << lshift) | (mc->max << rshift);
  382. /* Force ALC offset calibration if enabling ALC */
  383. if ((lvalue || rvalue) && (!da7218->alc_en))
  384. da7218_alc_calib(codec);
  385. /* Update bits to detail which channels are enabled/disabled */
  386. da7218->alc_en &= ~mask;
  387. da7218->alc_en |= (lvalue << lshift) | (rvalue << rshift);
  388. return snd_soc_put_volsw(kcontrol, ucontrol);
  389. }
  390. /* ToneGen */
  391. static int da7218_tonegen_freq_get(struct snd_kcontrol *kcontrol,
  392. struct snd_ctl_elem_value *ucontrol)
  393. {
  394. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  395. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  396. struct soc_mixer_control *mixer_ctrl =
  397. (struct soc_mixer_control *) kcontrol->private_value;
  398. unsigned int reg = mixer_ctrl->reg;
  399. u16 val;
  400. int ret;
  401. /*
  402. * Frequency value spans two 8-bit registers, lower then upper byte.
  403. * Therefore we need to convert to host endianness here.
  404. */
  405. ret = regmap_raw_read(da7218->regmap, reg, &val, 2);
  406. if (ret)
  407. return ret;
  408. ucontrol->value.integer.value[0] = le16_to_cpu(val);
  409. return 0;
  410. }
  411. static int da7218_tonegen_freq_put(struct snd_kcontrol *kcontrol,
  412. struct snd_ctl_elem_value *ucontrol)
  413. {
  414. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  415. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  416. struct soc_mixer_control *mixer_ctrl =
  417. (struct soc_mixer_control *) kcontrol->private_value;
  418. unsigned int reg = mixer_ctrl->reg;
  419. u16 val;
  420. /*
  421. * Frequency value spans two 8-bit registers, lower then upper byte.
  422. * Therefore we need to convert to little endian here to align with
  423. * HW registers.
  424. */
  425. val = cpu_to_le16(ucontrol->value.integer.value[0]);
  426. return regmap_raw_write(da7218->regmap, reg, &val, 2);
  427. }
  428. static int da7218_mic_lvl_det_sw_put(struct snd_kcontrol *kcontrol,
  429. struct snd_ctl_elem_value *ucontrol)
  430. {
  431. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  432. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  433. struct soc_mixer_control *mixer_ctrl =
  434. (struct soc_mixer_control *) kcontrol->private_value;
  435. unsigned int lvalue = ucontrol->value.integer.value[0];
  436. unsigned int rvalue = ucontrol->value.integer.value[1];
  437. unsigned int lshift = mixer_ctrl->shift;
  438. unsigned int rshift = mixer_ctrl->rshift;
  439. unsigned int mask = (mixer_ctrl->max << lshift) |
  440. (mixer_ctrl->max << rshift);
  441. da7218->mic_lvl_det_en &= ~mask;
  442. da7218->mic_lvl_det_en |= (lvalue << lshift) | (rvalue << rshift);
  443. /*
  444. * Here we only enable the feature on paths which are already
  445. * powered. If a channel is enabled here for level detect, but that path
  446. * isn't powered, then the channel will actually be enabled when we do
  447. * power the path (IN_FILTER widget events). This handling avoids
  448. * unwanted level detect events.
  449. */
  450. return snd_soc_write(codec, mixer_ctrl->reg,
  451. (da7218->in_filt_en & da7218->mic_lvl_det_en));
  452. }
  453. static int da7218_mic_lvl_det_sw_get(struct snd_kcontrol *kcontrol,
  454. struct snd_ctl_elem_value *ucontrol)
  455. {
  456. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  457. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  458. struct soc_mixer_control *mixer_ctrl =
  459. (struct soc_mixer_control *) kcontrol->private_value;
  460. unsigned int lshift = mixer_ctrl->shift;
  461. unsigned int rshift = mixer_ctrl->rshift;
  462. unsigned int lmask = (mixer_ctrl->max << lshift);
  463. unsigned int rmask = (mixer_ctrl->max << rshift);
  464. ucontrol->value.integer.value[0] =
  465. (da7218->mic_lvl_det_en & lmask) >> lshift;
  466. ucontrol->value.integer.value[1] =
  467. (da7218->mic_lvl_det_en & rmask) >> rshift;
  468. return 0;
  469. }
  470. static int da7218_biquad_coeff_get(struct snd_kcontrol *kcontrol,
  471. struct snd_ctl_elem_value *ucontrol)
  472. {
  473. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  474. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  475. struct soc_bytes_ext *bytes_ext =
  476. (struct soc_bytes_ext *) kcontrol->private_value;
  477. /* Determine which BiQuads we're setting based on size of config data */
  478. switch (bytes_ext->max) {
  479. case DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE:
  480. memcpy(ucontrol->value.bytes.data, da7218->biq_5stage_coeff,
  481. bytes_ext->max);
  482. break;
  483. case DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE:
  484. memcpy(ucontrol->value.bytes.data, da7218->stbiq_3stage_coeff,
  485. bytes_ext->max);
  486. break;
  487. default:
  488. return -EINVAL;
  489. }
  490. return 0;
  491. }
  492. static int da7218_biquad_coeff_put(struct snd_kcontrol *kcontrol,
  493. struct snd_ctl_elem_value *ucontrol)
  494. {
  495. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  496. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  497. struct soc_bytes_ext *bytes_ext =
  498. (struct soc_bytes_ext *) kcontrol->private_value;
  499. u8 reg, out_filt1l;
  500. u8 cfg[DA7218_BIQ_CFG_SIZE];
  501. int i;
  502. /*
  503. * Determine which BiQuads we're setting based on size of config data,
  504. * and stored the data for use by get function.
  505. */
  506. switch (bytes_ext->max) {
  507. case DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE:
  508. reg = DA7218_OUT_1_BIQ_5STAGE_DATA;
  509. memcpy(da7218->biq_5stage_coeff, ucontrol->value.bytes.data,
  510. bytes_ext->max);
  511. break;
  512. case DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE:
  513. reg = DA7218_SIDETONE_BIQ_3STAGE_DATA;
  514. memcpy(da7218->stbiq_3stage_coeff, ucontrol->value.bytes.data,
  515. bytes_ext->max);
  516. break;
  517. default:
  518. return -EINVAL;
  519. }
  520. /* Make sure at least out filter1 enabled to allow programming */
  521. out_filt1l = snd_soc_read(codec, DA7218_OUT_1L_FILTER_CTRL);
  522. snd_soc_write(codec, DA7218_OUT_1L_FILTER_CTRL,
  523. out_filt1l | DA7218_OUT_1L_FILTER_EN_MASK);
  524. for (i = 0; i < bytes_ext->max; ++i) {
  525. cfg[DA7218_BIQ_CFG_DATA] = ucontrol->value.bytes.data[i];
  526. cfg[DA7218_BIQ_CFG_ADDR] = i;
  527. regmap_raw_write(da7218->regmap, reg, cfg, DA7218_BIQ_CFG_SIZE);
  528. }
  529. /* Restore filter to previous setting */
  530. snd_soc_write(codec, DA7218_OUT_1L_FILTER_CTRL, out_filt1l);
  531. return 0;
  532. }
  533. /*
  534. * KControls
  535. */
  536. static const struct snd_kcontrol_new da7218_snd_controls[] = {
  537. /* Mics */
  538. SOC_SINGLE_TLV("Mic1 Volume", DA7218_MIC_1_GAIN,
  539. DA7218_MIC_1_AMP_GAIN_SHIFT, DA7218_MIC_AMP_GAIN_MAX,
  540. DA7218_NO_INVERT, da7218_mic_gain_tlv),
  541. SOC_SINGLE("Mic1 Switch", DA7218_MIC_1_CTRL,
  542. DA7218_MIC_1_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  543. DA7218_INVERT),
  544. SOC_SINGLE_TLV("Mic2 Volume", DA7218_MIC_2_GAIN,
  545. DA7218_MIC_2_AMP_GAIN_SHIFT, DA7218_MIC_AMP_GAIN_MAX,
  546. DA7218_NO_INVERT, da7218_mic_gain_tlv),
  547. SOC_SINGLE("Mic2 Switch", DA7218_MIC_2_CTRL,
  548. DA7218_MIC_2_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  549. DA7218_INVERT),
  550. /* Mixer Input */
  551. SOC_SINGLE_EXT_TLV("Mixin1 Volume", DA7218_MIXIN_1_GAIN,
  552. DA7218_MIXIN_1_AMP_GAIN_SHIFT,
  553. DA7218_MIXIN_AMP_GAIN_MAX, DA7218_NO_INVERT,
  554. snd_soc_get_volsw, da7218_mixin_gain_put,
  555. da7218_mixin_gain_tlv),
  556. SOC_SINGLE("Mixin1 Switch", DA7218_MIXIN_1_CTRL,
  557. DA7218_MIXIN_1_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  558. DA7218_INVERT),
  559. SOC_SINGLE("Mixin1 Gain Ramp Switch", DA7218_MIXIN_1_CTRL,
  560. DA7218_MIXIN_1_AMP_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  561. DA7218_NO_INVERT),
  562. SOC_SINGLE("Mixin1 ZC Gain Switch", DA7218_MIXIN_1_CTRL,
  563. DA7218_MIXIN_1_AMP_ZC_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  564. DA7218_NO_INVERT),
  565. SOC_SINGLE_EXT_TLV("Mixin2 Volume", DA7218_MIXIN_2_GAIN,
  566. DA7218_MIXIN_2_AMP_GAIN_SHIFT,
  567. DA7218_MIXIN_AMP_GAIN_MAX, DA7218_NO_INVERT,
  568. snd_soc_get_volsw, da7218_mixin_gain_put,
  569. da7218_mixin_gain_tlv),
  570. SOC_SINGLE("Mixin2 Switch", DA7218_MIXIN_2_CTRL,
  571. DA7218_MIXIN_2_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  572. DA7218_INVERT),
  573. SOC_SINGLE("Mixin2 Gain Ramp Switch", DA7218_MIXIN_2_CTRL,
  574. DA7218_MIXIN_2_AMP_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  575. DA7218_NO_INVERT),
  576. SOC_SINGLE("Mixin2 ZC Gain Switch", DA7218_MIXIN_2_CTRL,
  577. DA7218_MIXIN_2_AMP_ZC_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  578. DA7218_NO_INVERT),
  579. /* ADCs */
  580. SOC_SINGLE("ADC1 AAF Switch", DA7218_ADC_1_CTRL,
  581. DA7218_ADC_1_AAF_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  582. DA7218_NO_INVERT),
  583. SOC_SINGLE("ADC2 AAF Switch", DA7218_ADC_2_CTRL,
  584. DA7218_ADC_2_AAF_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  585. DA7218_NO_INVERT),
  586. SOC_SINGLE("ADC LP Mode Switch", DA7218_ADC_MODE,
  587. DA7218_ADC_LP_MODE_SHIFT, DA7218_SWITCH_EN_MAX,
  588. DA7218_NO_INVERT),
  589. /* Input Filters */
  590. SOC_SINGLE_TLV("In Filter1L Volume", DA7218_IN_1L_GAIN,
  591. DA7218_IN_1L_DIGITAL_GAIN_SHIFT,
  592. DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
  593. da7218_in_dig_gain_tlv),
  594. SOC_SINGLE("In Filter1L Switch", DA7218_IN_1L_FILTER_CTRL,
  595. DA7218_IN_1L_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  596. DA7218_INVERT),
  597. SOC_SINGLE("In Filter1L Gain Ramp Switch", DA7218_IN_1L_FILTER_CTRL,
  598. DA7218_IN_1L_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  599. DA7218_NO_INVERT),
  600. SOC_SINGLE_TLV("In Filter1R Volume", DA7218_IN_1R_GAIN,
  601. DA7218_IN_1R_DIGITAL_GAIN_SHIFT,
  602. DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
  603. da7218_in_dig_gain_tlv),
  604. SOC_SINGLE("In Filter1R Switch", DA7218_IN_1R_FILTER_CTRL,
  605. DA7218_IN_1R_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  606. DA7218_INVERT),
  607. SOC_SINGLE("In Filter1R Gain Ramp Switch",
  608. DA7218_IN_1R_FILTER_CTRL, DA7218_IN_1R_RAMP_EN_SHIFT,
  609. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
  610. SOC_SINGLE_TLV("In Filter2L Volume", DA7218_IN_2L_GAIN,
  611. DA7218_IN_2L_DIGITAL_GAIN_SHIFT,
  612. DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
  613. da7218_in_dig_gain_tlv),
  614. SOC_SINGLE("In Filter2L Switch", DA7218_IN_2L_FILTER_CTRL,
  615. DA7218_IN_2L_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  616. DA7218_INVERT),
  617. SOC_SINGLE("In Filter2L Gain Ramp Switch", DA7218_IN_2L_FILTER_CTRL,
  618. DA7218_IN_2L_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  619. DA7218_NO_INVERT),
  620. SOC_SINGLE_TLV("In Filter2R Volume", DA7218_IN_2R_GAIN,
  621. DA7218_IN_2R_DIGITAL_GAIN_SHIFT,
  622. DA7218_IN_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
  623. da7218_in_dig_gain_tlv),
  624. SOC_SINGLE("In Filter2R Switch", DA7218_IN_2R_FILTER_CTRL,
  625. DA7218_IN_2R_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  626. DA7218_INVERT),
  627. SOC_SINGLE("In Filter2R Gain Ramp Switch",
  628. DA7218_IN_2R_FILTER_CTRL, DA7218_IN_2R_RAMP_EN_SHIFT,
  629. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
  630. /* AGS */
  631. SOC_SINGLE_TLV("AGS Trigger", DA7218_AGS_TRIGGER,
  632. DA7218_AGS_TRIGGER_SHIFT, DA7218_AGS_TRIGGER_MAX,
  633. DA7218_INVERT, da7218_ags_trigger_tlv),
  634. SOC_SINGLE_TLV("AGS Max Attenuation", DA7218_AGS_ATT_MAX,
  635. DA7218_AGS_ATT_MAX_SHIFT, DA7218_AGS_ATT_MAX_MAX,
  636. DA7218_NO_INVERT, da7218_ags_att_max_tlv),
  637. SOC_SINGLE("AGS Anticlip Switch", DA7218_AGS_ANTICLIP_CTRL,
  638. DA7218_AGS_ANTICLIP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  639. DA7218_NO_INVERT),
  640. SOC_SINGLE("AGS Channel1 Switch", DA7218_AGS_ENABLE,
  641. DA7218_AGS_ENABLE_CHAN1_SHIFT, DA7218_SWITCH_EN_MAX,
  642. DA7218_NO_INVERT),
  643. SOC_SINGLE("AGS Channel2 Switch", DA7218_AGS_ENABLE,
  644. DA7218_AGS_ENABLE_CHAN2_SHIFT, DA7218_SWITCH_EN_MAX,
  645. DA7218_NO_INVERT),
  646. /* ALC */
  647. SOC_ENUM("ALC Attack Rate", da7218_alc_attack_rate),
  648. SOC_ENUM("ALC Release Rate", da7218_alc_release_rate),
  649. SOC_ENUM("ALC Hold Time", da7218_alc_hold_time),
  650. SOC_SINGLE_TLV("ALC Noise Threshold", DA7218_ALC_NOISE,
  651. DA7218_ALC_NOISE_SHIFT, DA7218_ALC_THRESHOLD_MAX,
  652. DA7218_INVERT, da7218_alc_threshold_tlv),
  653. SOC_SINGLE_TLV("ALC Min Threshold", DA7218_ALC_TARGET_MIN,
  654. DA7218_ALC_THRESHOLD_MIN_SHIFT, DA7218_ALC_THRESHOLD_MAX,
  655. DA7218_INVERT, da7218_alc_threshold_tlv),
  656. SOC_SINGLE_TLV("ALC Max Threshold", DA7218_ALC_TARGET_MAX,
  657. DA7218_ALC_THRESHOLD_MAX_SHIFT, DA7218_ALC_THRESHOLD_MAX,
  658. DA7218_INVERT, da7218_alc_threshold_tlv),
  659. SOC_SINGLE_TLV("ALC Max Attenuation", DA7218_ALC_GAIN_LIMITS,
  660. DA7218_ALC_ATTEN_MAX_SHIFT, DA7218_ALC_ATTEN_GAIN_MAX,
  661. DA7218_NO_INVERT, da7218_alc_gain_tlv),
  662. SOC_SINGLE_TLV("ALC Max Gain", DA7218_ALC_GAIN_LIMITS,
  663. DA7218_ALC_GAIN_MAX_SHIFT, DA7218_ALC_ATTEN_GAIN_MAX,
  664. DA7218_NO_INVERT, da7218_alc_gain_tlv),
  665. SOC_SINGLE_RANGE_TLV("ALC Min Analog Gain", DA7218_ALC_ANA_GAIN_LIMITS,
  666. DA7218_ALC_ANA_GAIN_MIN_SHIFT,
  667. DA7218_ALC_ANA_GAIN_MIN, DA7218_ALC_ANA_GAIN_MAX,
  668. DA7218_NO_INVERT, da7218_alc_ana_gain_tlv),
  669. SOC_SINGLE_RANGE_TLV("ALC Max Analog Gain", DA7218_ALC_ANA_GAIN_LIMITS,
  670. DA7218_ALC_ANA_GAIN_MAX_SHIFT,
  671. DA7218_ALC_ANA_GAIN_MIN, DA7218_ALC_ANA_GAIN_MAX,
  672. DA7218_NO_INVERT, da7218_alc_ana_gain_tlv),
  673. SOC_ENUM("ALC Anticlip Step", da7218_alc_anticlip_step),
  674. SOC_SINGLE("ALC Anticlip Switch", DA7218_ALC_ANTICLIP_CTRL,
  675. DA7218_ALC_ANTICLIP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  676. DA7218_NO_INVERT),
  677. SOC_DOUBLE_EXT("ALC Channel1 Switch", DA7218_ALC_CTRL1,
  678. DA7218_ALC_CHAN1_L_EN_SHIFT, DA7218_ALC_CHAN1_R_EN_SHIFT,
  679. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT,
  680. snd_soc_get_volsw, da7218_alc_sw_put),
  681. SOC_DOUBLE_EXT("ALC Channel2 Switch", DA7218_ALC_CTRL1,
  682. DA7218_ALC_CHAN2_L_EN_SHIFT, DA7218_ALC_CHAN2_R_EN_SHIFT,
  683. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT,
  684. snd_soc_get_volsw, da7218_alc_sw_put),
  685. /* Envelope Tracking */
  686. SOC_ENUM("Envelope Tracking Attack Rate", da7218_integ_attack_rate),
  687. SOC_ENUM("Envelope Tracking Release Rate", da7218_integ_release_rate),
  688. /* Input High-Pass Filters */
  689. SOC_ENUM("In Filter1 HPF Mode", da7218_in1_hpf_mode),
  690. SOC_ENUM("In Filter1 HPF Corner Audio", da7218_in1_audio_hpf_corner),
  691. SOC_ENUM("In Filter1 HPF Corner Voice", da7218_in1_voice_hpf_corner),
  692. SOC_ENUM("In Filter2 HPF Mode", da7218_in2_hpf_mode),
  693. SOC_ENUM("In Filter2 HPF Corner Audio", da7218_in2_audio_hpf_corner),
  694. SOC_ENUM("In Filter2 HPF Corner Voice", da7218_in2_voice_hpf_corner),
  695. /* Mic Level Detect */
  696. SOC_DOUBLE_EXT("Mic Level Detect Channel1 Switch", DA7218_LVL_DET_CTRL,
  697. DA7218_LVL_DET_EN_CHAN1L_SHIFT,
  698. DA7218_LVL_DET_EN_CHAN1R_SHIFT, DA7218_SWITCH_EN_MAX,
  699. DA7218_NO_INVERT, da7218_mic_lvl_det_sw_get,
  700. da7218_mic_lvl_det_sw_put),
  701. SOC_DOUBLE_EXT("Mic Level Detect Channel2 Switch", DA7218_LVL_DET_CTRL,
  702. DA7218_LVL_DET_EN_CHAN2L_SHIFT,
  703. DA7218_LVL_DET_EN_CHAN2R_SHIFT, DA7218_SWITCH_EN_MAX,
  704. DA7218_NO_INVERT, da7218_mic_lvl_det_sw_get,
  705. da7218_mic_lvl_det_sw_put),
  706. SOC_SINGLE("Mic Level Detect Level", DA7218_LVL_DET_LEVEL,
  707. DA7218_LVL_DET_LEVEL_SHIFT, DA7218_LVL_DET_LEVEL_MAX,
  708. DA7218_NO_INVERT),
  709. /* Digital Mixer (Input) */
  710. SOC_SINGLE_TLV("DMix In Filter1L Out1 DAIL Volume",
  711. DA7218_DMIX_OUTDAI_1L_INFILT_1L_GAIN,
  712. DA7218_OUTDAI_1L_INFILT_1L_GAIN_SHIFT,
  713. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  714. da7218_dmix_gain_tlv),
  715. SOC_SINGLE_TLV("DMix In Filter1L Out1 DAIR Volume",
  716. DA7218_DMIX_OUTDAI_1R_INFILT_1L_GAIN,
  717. DA7218_OUTDAI_1R_INFILT_1L_GAIN_SHIFT,
  718. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  719. da7218_dmix_gain_tlv),
  720. SOC_SINGLE_TLV("DMix In Filter1L Out2 DAIL Volume",
  721. DA7218_DMIX_OUTDAI_2L_INFILT_1L_GAIN,
  722. DA7218_OUTDAI_2L_INFILT_1L_GAIN_SHIFT,
  723. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  724. da7218_dmix_gain_tlv),
  725. SOC_SINGLE_TLV("DMix In Filter1L Out2 DAIR Volume",
  726. DA7218_DMIX_OUTDAI_2R_INFILT_1L_GAIN,
  727. DA7218_OUTDAI_2R_INFILT_1L_GAIN_SHIFT,
  728. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  729. da7218_dmix_gain_tlv),
  730. SOC_SINGLE_TLV("DMix In Filter1R Out1 DAIL Volume",
  731. DA7218_DMIX_OUTDAI_1L_INFILT_1R_GAIN,
  732. DA7218_OUTDAI_1L_INFILT_1R_GAIN_SHIFT,
  733. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  734. da7218_dmix_gain_tlv),
  735. SOC_SINGLE_TLV("DMix In Filter1R Out1 DAIR Volume",
  736. DA7218_DMIX_OUTDAI_1R_INFILT_1R_GAIN,
  737. DA7218_OUTDAI_1R_INFILT_1R_GAIN_SHIFT,
  738. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  739. da7218_dmix_gain_tlv),
  740. SOC_SINGLE_TLV("DMix In Filter1R Out2 DAIL Volume",
  741. DA7218_DMIX_OUTDAI_2L_INFILT_1R_GAIN,
  742. DA7218_OUTDAI_2L_INFILT_1R_GAIN_SHIFT,
  743. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  744. da7218_dmix_gain_tlv),
  745. SOC_SINGLE_TLV("DMix In Filter1R Out2 DAIR Volume",
  746. DA7218_DMIX_OUTDAI_2R_INFILT_1R_GAIN,
  747. DA7218_OUTDAI_2R_INFILT_1R_GAIN_SHIFT,
  748. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  749. da7218_dmix_gain_tlv),
  750. SOC_SINGLE_TLV("DMix In Filter2L Out1 DAIL Volume",
  751. DA7218_DMIX_OUTDAI_1L_INFILT_2L_GAIN,
  752. DA7218_OUTDAI_1L_INFILT_2L_GAIN_SHIFT,
  753. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  754. da7218_dmix_gain_tlv),
  755. SOC_SINGLE_TLV("DMix In Filter2L Out1 DAIR Volume",
  756. DA7218_DMIX_OUTDAI_1R_INFILT_2L_GAIN,
  757. DA7218_OUTDAI_1R_INFILT_2L_GAIN_SHIFT,
  758. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  759. da7218_dmix_gain_tlv),
  760. SOC_SINGLE_TLV("DMix In Filter2L Out2 DAIL Volume",
  761. DA7218_DMIX_OUTDAI_2L_INFILT_2L_GAIN,
  762. DA7218_OUTDAI_2L_INFILT_2L_GAIN_SHIFT,
  763. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  764. da7218_dmix_gain_tlv),
  765. SOC_SINGLE_TLV("DMix In Filter2L Out2 DAIR Volume",
  766. DA7218_DMIX_OUTDAI_2R_INFILT_2L_GAIN,
  767. DA7218_OUTDAI_2R_INFILT_2L_GAIN_SHIFT,
  768. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  769. da7218_dmix_gain_tlv),
  770. SOC_SINGLE_TLV("DMix In Filter2R Out1 DAIL Volume",
  771. DA7218_DMIX_OUTDAI_1L_INFILT_2R_GAIN,
  772. DA7218_OUTDAI_1L_INFILT_2R_GAIN_SHIFT,
  773. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  774. da7218_dmix_gain_tlv),
  775. SOC_SINGLE_TLV("DMix In Filter2R Out1 DAIR Volume",
  776. DA7218_DMIX_OUTDAI_1R_INFILT_2R_GAIN,
  777. DA7218_OUTDAI_1R_INFILT_2R_GAIN_SHIFT,
  778. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  779. da7218_dmix_gain_tlv),
  780. SOC_SINGLE_TLV("DMix In Filter2R Out2 DAIL Volume",
  781. DA7218_DMIX_OUTDAI_2L_INFILT_2R_GAIN,
  782. DA7218_OUTDAI_2L_INFILT_2R_GAIN_SHIFT,
  783. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  784. da7218_dmix_gain_tlv),
  785. SOC_SINGLE_TLV("DMix In Filter2R Out2 DAIR Volume",
  786. DA7218_DMIX_OUTDAI_2R_INFILT_2R_GAIN,
  787. DA7218_OUTDAI_2R_INFILT_2R_GAIN_SHIFT,
  788. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  789. da7218_dmix_gain_tlv),
  790. SOC_SINGLE_TLV("DMix ToneGen Out1 DAIL Volume",
  791. DA7218_DMIX_OUTDAI_1L_TONEGEN_GAIN,
  792. DA7218_OUTDAI_1L_TONEGEN_GAIN_SHIFT,
  793. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  794. da7218_dmix_gain_tlv),
  795. SOC_SINGLE_TLV("DMix ToneGen Out1 DAIR Volume",
  796. DA7218_DMIX_OUTDAI_1R_TONEGEN_GAIN,
  797. DA7218_OUTDAI_1R_TONEGEN_GAIN_SHIFT,
  798. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  799. da7218_dmix_gain_tlv),
  800. SOC_SINGLE_TLV("DMix ToneGen Out2 DAIL Volume",
  801. DA7218_DMIX_OUTDAI_2L_TONEGEN_GAIN,
  802. DA7218_OUTDAI_2L_TONEGEN_GAIN_SHIFT,
  803. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  804. da7218_dmix_gain_tlv),
  805. SOC_SINGLE_TLV("DMix ToneGen Out2 DAIR Volume",
  806. DA7218_DMIX_OUTDAI_2R_TONEGEN_GAIN,
  807. DA7218_OUTDAI_2R_TONEGEN_GAIN_SHIFT,
  808. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  809. da7218_dmix_gain_tlv),
  810. SOC_SINGLE_TLV("DMix In DAIL Out1 DAIL Volume",
  811. DA7218_DMIX_OUTDAI_1L_INDAI_1L_GAIN,
  812. DA7218_OUTDAI_1L_INDAI_1L_GAIN_SHIFT,
  813. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  814. da7218_dmix_gain_tlv),
  815. SOC_SINGLE_TLV("DMix In DAIL Out1 DAIR Volume",
  816. DA7218_DMIX_OUTDAI_1R_INDAI_1L_GAIN,
  817. DA7218_OUTDAI_1R_INDAI_1L_GAIN_SHIFT,
  818. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  819. da7218_dmix_gain_tlv),
  820. SOC_SINGLE_TLV("DMix In DAIL Out2 DAIL Volume",
  821. DA7218_DMIX_OUTDAI_2L_INDAI_1L_GAIN,
  822. DA7218_OUTDAI_2L_INDAI_1L_GAIN_SHIFT,
  823. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  824. da7218_dmix_gain_tlv),
  825. SOC_SINGLE_TLV("DMix In DAIL Out2 DAIR Volume",
  826. DA7218_DMIX_OUTDAI_2R_INDAI_1L_GAIN,
  827. DA7218_OUTDAI_2R_INDAI_1L_GAIN_SHIFT,
  828. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  829. da7218_dmix_gain_tlv),
  830. SOC_SINGLE_TLV("DMix In DAIR Out1 DAIL Volume",
  831. DA7218_DMIX_OUTDAI_1L_INDAI_1R_GAIN,
  832. DA7218_OUTDAI_1L_INDAI_1R_GAIN_SHIFT,
  833. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  834. da7218_dmix_gain_tlv),
  835. SOC_SINGLE_TLV("DMix In DAIR Out1 DAIR Volume",
  836. DA7218_DMIX_OUTDAI_1R_INDAI_1R_GAIN,
  837. DA7218_OUTDAI_1R_INDAI_1R_GAIN_SHIFT,
  838. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  839. da7218_dmix_gain_tlv),
  840. SOC_SINGLE_TLV("DMix In DAIR Out2 DAIL Volume",
  841. DA7218_DMIX_OUTDAI_2L_INDAI_1R_GAIN,
  842. DA7218_OUTDAI_2L_INDAI_1R_GAIN_SHIFT,
  843. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  844. da7218_dmix_gain_tlv),
  845. SOC_SINGLE_TLV("DMix In DAIR Out2 DAIR Volume",
  846. DA7218_DMIX_OUTDAI_2R_INDAI_1R_GAIN,
  847. DA7218_OUTDAI_2R_INDAI_1R_GAIN_SHIFT,
  848. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  849. da7218_dmix_gain_tlv),
  850. /* Digital Mixer (Output) */
  851. SOC_SINGLE_TLV("DMix In Filter1L Out FilterL Volume",
  852. DA7218_DMIX_OUTFILT_1L_INFILT_1L_GAIN,
  853. DA7218_OUTFILT_1L_INFILT_1L_GAIN_SHIFT,
  854. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  855. da7218_dmix_gain_tlv),
  856. SOC_SINGLE_TLV("DMix In Filter1L Out FilterR Volume",
  857. DA7218_DMIX_OUTFILT_1R_INFILT_1L_GAIN,
  858. DA7218_OUTFILT_1R_INFILT_1L_GAIN_SHIFT,
  859. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  860. da7218_dmix_gain_tlv),
  861. SOC_SINGLE_TLV("DMix In Filter1R Out FilterL Volume",
  862. DA7218_DMIX_OUTFILT_1L_INFILT_1R_GAIN,
  863. DA7218_OUTFILT_1L_INFILT_1R_GAIN_SHIFT,
  864. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  865. da7218_dmix_gain_tlv),
  866. SOC_SINGLE_TLV("DMix In Filter1R Out FilterR Volume",
  867. DA7218_DMIX_OUTFILT_1R_INFILT_1R_GAIN,
  868. DA7218_OUTFILT_1R_INFILT_1R_GAIN_SHIFT,
  869. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  870. da7218_dmix_gain_tlv),
  871. SOC_SINGLE_TLV("DMix In Filter2L Out FilterL Volume",
  872. DA7218_DMIX_OUTFILT_1L_INFILT_2L_GAIN,
  873. DA7218_OUTFILT_1L_INFILT_2L_GAIN_SHIFT,
  874. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  875. da7218_dmix_gain_tlv),
  876. SOC_SINGLE_TLV("DMix In Filter2L Out FilterR Volume",
  877. DA7218_DMIX_OUTFILT_1R_INFILT_2L_GAIN,
  878. DA7218_OUTFILT_1R_INFILT_2L_GAIN_SHIFT,
  879. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  880. da7218_dmix_gain_tlv),
  881. SOC_SINGLE_TLV("DMix In Filter2R Out FilterL Volume",
  882. DA7218_DMIX_OUTFILT_1L_INFILT_2R_GAIN,
  883. DA7218_OUTFILT_1L_INFILT_2R_GAIN_SHIFT,
  884. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  885. da7218_dmix_gain_tlv),
  886. SOC_SINGLE_TLV("DMix In Filter2R Out FilterR Volume",
  887. DA7218_DMIX_OUTFILT_1R_INFILT_2R_GAIN,
  888. DA7218_OUTFILT_1R_INFILT_2R_GAIN_SHIFT,
  889. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  890. da7218_dmix_gain_tlv),
  891. SOC_SINGLE_TLV("DMix ToneGen Out FilterL Volume",
  892. DA7218_DMIX_OUTFILT_1L_TONEGEN_GAIN,
  893. DA7218_OUTFILT_1L_TONEGEN_GAIN_SHIFT,
  894. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  895. da7218_dmix_gain_tlv),
  896. SOC_SINGLE_TLV("DMix ToneGen Out FilterR Volume",
  897. DA7218_DMIX_OUTFILT_1R_TONEGEN_GAIN,
  898. DA7218_OUTFILT_1R_TONEGEN_GAIN_SHIFT,
  899. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  900. da7218_dmix_gain_tlv),
  901. SOC_SINGLE_TLV("DMix In DAIL Out FilterL Volume",
  902. DA7218_DMIX_OUTFILT_1L_INDAI_1L_GAIN,
  903. DA7218_OUTFILT_1L_INDAI_1L_GAIN_SHIFT,
  904. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  905. da7218_dmix_gain_tlv),
  906. SOC_SINGLE_TLV("DMix In DAIL Out FilterR Volume",
  907. DA7218_DMIX_OUTFILT_1R_INDAI_1L_GAIN,
  908. DA7218_OUTFILT_1R_INDAI_1L_GAIN_SHIFT,
  909. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  910. da7218_dmix_gain_tlv),
  911. SOC_SINGLE_TLV("DMix In DAIR Out FilterL Volume",
  912. DA7218_DMIX_OUTFILT_1L_INDAI_1R_GAIN,
  913. DA7218_OUTFILT_1L_INDAI_1R_GAIN_SHIFT,
  914. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  915. da7218_dmix_gain_tlv),
  916. SOC_SINGLE_TLV("DMix In DAIR Out FilterR Volume",
  917. DA7218_DMIX_OUTFILT_1R_INDAI_1R_GAIN,
  918. DA7218_OUTFILT_1R_INDAI_1R_GAIN_SHIFT,
  919. DA7218_DMIX_GAIN_MAX, DA7218_NO_INVERT,
  920. da7218_dmix_gain_tlv),
  921. /* Sidetone Filter */
  922. SND_SOC_BYTES_EXT("Sidetone BiQuad Coefficients",
  923. DA7218_SIDETONE_BIQ_3STAGE_CFG_SIZE,
  924. da7218_biquad_coeff_get, da7218_biquad_coeff_put),
  925. SOC_SINGLE_TLV("Sidetone Volume", DA7218_SIDETONE_GAIN,
  926. DA7218_SIDETONE_GAIN_SHIFT, DA7218_DMIX_GAIN_MAX,
  927. DA7218_NO_INVERT, da7218_dmix_gain_tlv),
  928. SOC_SINGLE("Sidetone Switch", DA7218_SIDETONE_CTRL,
  929. DA7218_SIDETONE_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  930. DA7218_INVERT),
  931. /* Tone Generator */
  932. SOC_ENUM("ToneGen DTMF Key", da7218_tonegen_dtmf_key),
  933. SOC_SINGLE("ToneGen DTMF Switch", DA7218_TONE_GEN_CFG1,
  934. DA7218_DTMF_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  935. DA7218_NO_INVERT),
  936. SOC_ENUM("ToneGen Sinewave Gen Type", da7218_tonegen_swg_sel),
  937. SOC_SINGLE_EXT("ToneGen Sinewave1 Freq", DA7218_TONE_GEN_FREQ1_L,
  938. DA7218_FREQ1_L_SHIFT, DA7218_FREQ_MAX, DA7218_NO_INVERT,
  939. da7218_tonegen_freq_get, da7218_tonegen_freq_put),
  940. SOC_SINGLE_EXT("ToneGen Sinewave2 Freq", DA7218_TONE_GEN_FREQ2_L,
  941. DA7218_FREQ2_L_SHIFT, DA7218_FREQ_MAX, DA7218_NO_INVERT,
  942. da7218_tonegen_freq_get, da7218_tonegen_freq_put),
  943. SOC_SINGLE("ToneGen On Time", DA7218_TONE_GEN_ON_PER,
  944. DA7218_BEEP_ON_PER_SHIFT, DA7218_BEEP_ON_OFF_MAX,
  945. DA7218_NO_INVERT),
  946. SOC_SINGLE("ToneGen Off Time", DA7218_TONE_GEN_OFF_PER,
  947. DA7218_BEEP_OFF_PER_SHIFT, DA7218_BEEP_ON_OFF_MAX,
  948. DA7218_NO_INVERT),
  949. /* Gain ramping */
  950. SOC_ENUM("Gain Ramp Rate", da7218_gain_ramp_rate),
  951. /* DGS */
  952. SOC_SINGLE_TLV("DGS Trigger", DA7218_DGS_TRIGGER,
  953. DA7218_DGS_TRIGGER_LVL_SHIFT, DA7218_DGS_TRIGGER_MAX,
  954. DA7218_INVERT, da7218_dgs_trigger_tlv),
  955. SOC_ENUM("DGS Rise Coefficient", da7218_dgs_rise_coeff),
  956. SOC_ENUM("DGS Fall Coefficient", da7218_dgs_fall_coeff),
  957. SOC_SINGLE("DGS Sync Delay", DA7218_DGS_SYNC_DELAY,
  958. DA7218_DGS_SYNC_DELAY_SHIFT, DA7218_DGS_SYNC_DELAY_MAX,
  959. DA7218_NO_INVERT),
  960. SOC_SINGLE("DGS Fast SR Sync Delay", DA7218_DGS_SYNC_DELAY2,
  961. DA7218_DGS_SYNC_DELAY2_SHIFT, DA7218_DGS_SYNC_DELAY_MAX,
  962. DA7218_NO_INVERT),
  963. SOC_SINGLE("DGS Voice Filter Sync Delay", DA7218_DGS_SYNC_DELAY3,
  964. DA7218_DGS_SYNC_DELAY3_SHIFT, DA7218_DGS_SYNC_DELAY3_MAX,
  965. DA7218_NO_INVERT),
  966. SOC_SINGLE_TLV("DGS Anticlip Level", DA7218_DGS_LEVELS,
  967. DA7218_DGS_ANTICLIP_LVL_SHIFT,
  968. DA7218_DGS_ANTICLIP_LVL_MAX, DA7218_INVERT,
  969. da7218_dgs_anticlip_tlv),
  970. SOC_SINGLE_TLV("DGS Signal Level", DA7218_DGS_LEVELS,
  971. DA7218_DGS_SIGNAL_LVL_SHIFT, DA7218_DGS_SIGNAL_LVL_MAX,
  972. DA7218_INVERT, da7218_dgs_signal_tlv),
  973. SOC_SINGLE("DGS Gain Subrange Switch", DA7218_DGS_GAIN_CTRL,
  974. DA7218_DGS_SUBR_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  975. DA7218_NO_INVERT),
  976. SOC_SINGLE("DGS Gain Ramp Switch", DA7218_DGS_GAIN_CTRL,
  977. DA7218_DGS_RAMP_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  978. DA7218_NO_INVERT),
  979. SOC_SINGLE("DGS Gain Steps", DA7218_DGS_GAIN_CTRL,
  980. DA7218_DGS_STEPS_SHIFT, DA7218_DGS_STEPS_MAX,
  981. DA7218_NO_INVERT),
  982. SOC_DOUBLE("DGS Switch", DA7218_DGS_ENABLE, DA7218_DGS_ENABLE_L_SHIFT,
  983. DA7218_DGS_ENABLE_R_SHIFT, DA7218_SWITCH_EN_MAX,
  984. DA7218_NO_INVERT),
  985. /* Output High-Pass Filter */
  986. SOC_ENUM("Out Filter HPF Mode", da7218_out1_hpf_mode),
  987. SOC_ENUM("Out Filter HPF Corner Audio", da7218_out1_audio_hpf_corner),
  988. SOC_ENUM("Out Filter HPF Corner Voice", da7218_out1_voice_hpf_corner),
  989. /* 5-Band Equaliser */
  990. SOC_SINGLE_TLV("Out EQ Band1 Volume", DA7218_OUT_1_EQ_12_FILTER_CTRL,
  991. DA7218_OUT_1_EQ_BAND1_SHIFT, DA7218_OUT_EQ_BAND_MAX,
  992. DA7218_NO_INVERT, da7218_out_eq_band_tlv),
  993. SOC_SINGLE_TLV("Out EQ Band2 Volume", DA7218_OUT_1_EQ_12_FILTER_CTRL,
  994. DA7218_OUT_1_EQ_BAND2_SHIFT, DA7218_OUT_EQ_BAND_MAX,
  995. DA7218_NO_INVERT, da7218_out_eq_band_tlv),
  996. SOC_SINGLE_TLV("Out EQ Band3 Volume", DA7218_OUT_1_EQ_34_FILTER_CTRL,
  997. DA7218_OUT_1_EQ_BAND3_SHIFT, DA7218_OUT_EQ_BAND_MAX,
  998. DA7218_NO_INVERT, da7218_out_eq_band_tlv),
  999. SOC_SINGLE_TLV("Out EQ Band4 Volume", DA7218_OUT_1_EQ_34_FILTER_CTRL,
  1000. DA7218_OUT_1_EQ_BAND4_SHIFT, DA7218_OUT_EQ_BAND_MAX,
  1001. DA7218_NO_INVERT, da7218_out_eq_band_tlv),
  1002. SOC_SINGLE_TLV("Out EQ Band5 Volume", DA7218_OUT_1_EQ_5_FILTER_CTRL,
  1003. DA7218_OUT_1_EQ_BAND5_SHIFT, DA7218_OUT_EQ_BAND_MAX,
  1004. DA7218_NO_INVERT, da7218_out_eq_band_tlv),
  1005. SOC_SINGLE("Out EQ Switch", DA7218_OUT_1_EQ_5_FILTER_CTRL,
  1006. DA7218_OUT_1_EQ_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  1007. DA7218_NO_INVERT),
  1008. /* BiQuad Filters */
  1009. SND_SOC_BYTES_EXT("BiQuad Coefficients",
  1010. DA7218_OUT_1_BIQ_5STAGE_CFG_SIZE,
  1011. da7218_biquad_coeff_get, da7218_biquad_coeff_put),
  1012. SOC_SINGLE("BiQuad Filter Switch", DA7218_OUT_1_BIQ_5STAGE_CTRL,
  1013. DA7218_OUT_1_BIQ_5STAGE_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  1014. DA7218_INVERT),
  1015. /* Output Filters */
  1016. SOC_DOUBLE_R_RANGE_TLV("Out Filter Volume", DA7218_OUT_1L_GAIN,
  1017. DA7218_OUT_1R_GAIN,
  1018. DA7218_OUT_1L_DIGITAL_GAIN_SHIFT,
  1019. DA7218_OUT_DIGITAL_GAIN_MIN,
  1020. DA7218_OUT_DIGITAL_GAIN_MAX, DA7218_NO_INVERT,
  1021. da7218_out_dig_gain_tlv),
  1022. SOC_DOUBLE_R("Out Filter Switch", DA7218_OUT_1L_FILTER_CTRL,
  1023. DA7218_OUT_1R_FILTER_CTRL, DA7218_OUT_1L_MUTE_EN_SHIFT,
  1024. DA7218_SWITCH_EN_MAX, DA7218_INVERT),
  1025. SOC_DOUBLE_R("Out Filter Gain Subrange Switch",
  1026. DA7218_OUT_1L_FILTER_CTRL, DA7218_OUT_1R_FILTER_CTRL,
  1027. DA7218_OUT_1L_SUBRANGE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  1028. DA7218_NO_INVERT),
  1029. SOC_DOUBLE_R("Out Filter Gain Ramp Switch", DA7218_OUT_1L_FILTER_CTRL,
  1030. DA7218_OUT_1R_FILTER_CTRL, DA7218_OUT_1L_RAMP_EN_SHIFT,
  1031. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
  1032. /* Mixer Output */
  1033. SOC_DOUBLE_R_RANGE_TLV("Mixout Volume", DA7218_MIXOUT_L_GAIN,
  1034. DA7218_MIXOUT_R_GAIN,
  1035. DA7218_MIXOUT_L_AMP_GAIN_SHIFT,
  1036. DA7218_MIXOUT_AMP_GAIN_MIN,
  1037. DA7218_MIXOUT_AMP_GAIN_MAX, DA7218_NO_INVERT,
  1038. da7218_mixout_gain_tlv),
  1039. /* DAC Noise Gate */
  1040. SOC_ENUM("DAC NG Setup Time", da7218_dac_ng_setup_time),
  1041. SOC_ENUM("DAC NG Rampup Rate", da7218_dac_ng_rampup_rate),
  1042. SOC_ENUM("DAC NG Rampdown Rate", da7218_dac_ng_rampdown_rate),
  1043. SOC_SINGLE_TLV("DAC NG Off Threshold", DA7218_DAC_NG_OFF_THRESH,
  1044. DA7218_DAC_NG_OFF_THRESHOLD_SHIFT,
  1045. DA7218_DAC_NG_THRESHOLD_MAX, DA7218_NO_INVERT,
  1046. da7218_dac_ng_threshold_tlv),
  1047. SOC_SINGLE_TLV("DAC NG On Threshold", DA7218_DAC_NG_ON_THRESH,
  1048. DA7218_DAC_NG_ON_THRESHOLD_SHIFT,
  1049. DA7218_DAC_NG_THRESHOLD_MAX, DA7218_NO_INVERT,
  1050. da7218_dac_ng_threshold_tlv),
  1051. SOC_SINGLE("DAC NG Switch", DA7218_DAC_NG_CTRL, DA7218_DAC_NG_EN_SHIFT,
  1052. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
  1053. /* CP */
  1054. SOC_ENUM("Charge Pump Track Mode", da7218_cp_mchange),
  1055. SOC_ENUM("Charge Pump Frequency", da7218_cp_fcontrol),
  1056. SOC_ENUM("Charge Pump Decay Rate", da7218_cp_tau_delay),
  1057. SOC_SINGLE("Charge Pump Threshold", DA7218_CP_VOL_THRESHOLD1,
  1058. DA7218_CP_THRESH_VDD2_SHIFT, DA7218_CP_THRESH_VDD2_MAX,
  1059. DA7218_NO_INVERT),
  1060. /* Headphones */
  1061. SOC_DOUBLE_R_RANGE_TLV("Headphone Volume", DA7218_HP_L_GAIN,
  1062. DA7218_HP_R_GAIN, DA7218_HP_L_AMP_GAIN_SHIFT,
  1063. DA7218_HP_AMP_GAIN_MIN, DA7218_HP_AMP_GAIN_MAX,
  1064. DA7218_NO_INVERT, da7218_hp_gain_tlv),
  1065. SOC_DOUBLE_R("Headphone Switch", DA7218_HP_L_CTRL, DA7218_HP_R_CTRL,
  1066. DA7218_HP_L_AMP_MUTE_EN_SHIFT, DA7218_SWITCH_EN_MAX,
  1067. DA7218_INVERT),
  1068. SOC_DOUBLE_R("Headphone Gain Ramp Switch", DA7218_HP_L_CTRL,
  1069. DA7218_HP_R_CTRL, DA7218_HP_L_AMP_RAMP_EN_SHIFT,
  1070. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
  1071. SOC_DOUBLE_R("Headphone ZC Gain Switch", DA7218_HP_L_CTRL,
  1072. DA7218_HP_R_CTRL, DA7218_HP_L_AMP_ZC_EN_SHIFT,
  1073. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT),
  1074. };
  1075. /*
  1076. * DAPM Mux Controls
  1077. */
  1078. static const char * const da7218_mic_sel_text[] = { "Analog", "Digital" };
  1079. static const struct soc_enum da7218_mic1_sel =
  1080. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(da7218_mic_sel_text),
  1081. da7218_mic_sel_text);
  1082. static const struct snd_kcontrol_new da7218_mic1_sel_mux =
  1083. SOC_DAPM_ENUM("Mic1 Mux", da7218_mic1_sel);
  1084. static const struct soc_enum da7218_mic2_sel =
  1085. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(da7218_mic_sel_text),
  1086. da7218_mic_sel_text);
  1087. static const struct snd_kcontrol_new da7218_mic2_sel_mux =
  1088. SOC_DAPM_ENUM("Mic2 Mux", da7218_mic2_sel);
  1089. static const char * const da7218_sidetone_in_sel_txt[] = {
  1090. "In Filter1L", "In Filter1R", "In Filter2L", "In Filter2R"
  1091. };
  1092. static const struct soc_enum da7218_sidetone_in_sel =
  1093. SOC_ENUM_SINGLE(DA7218_SIDETONE_IN_SELECT,
  1094. DA7218_SIDETONE_IN_SELECT_SHIFT,
  1095. DA7218_SIDETONE_IN_SELECT_MAX,
  1096. da7218_sidetone_in_sel_txt);
  1097. static const struct snd_kcontrol_new da7218_sidetone_in_sel_mux =
  1098. SOC_DAPM_ENUM("Sidetone Mux", da7218_sidetone_in_sel);
  1099. static const char * const da7218_out_filt_biq_sel_txt[] = {
  1100. "Bypass", "Enabled"
  1101. };
  1102. static const struct soc_enum da7218_out_filtl_biq_sel =
  1103. SOC_ENUM_SINGLE(DA7218_OUT_1L_FILTER_CTRL,
  1104. DA7218_OUT_1L_BIQ_5STAGE_SEL_SHIFT,
  1105. DA7218_OUT_BIQ_5STAGE_SEL_MAX,
  1106. da7218_out_filt_biq_sel_txt);
  1107. static const struct snd_kcontrol_new da7218_out_filtl_biq_sel_mux =
  1108. SOC_DAPM_ENUM("Out FilterL BiQuad Mux", da7218_out_filtl_biq_sel);
  1109. static const struct soc_enum da7218_out_filtr_biq_sel =
  1110. SOC_ENUM_SINGLE(DA7218_OUT_1R_FILTER_CTRL,
  1111. DA7218_OUT_1R_BIQ_5STAGE_SEL_SHIFT,
  1112. DA7218_OUT_BIQ_5STAGE_SEL_MAX,
  1113. da7218_out_filt_biq_sel_txt);
  1114. static const struct snd_kcontrol_new da7218_out_filtr_biq_sel_mux =
  1115. SOC_DAPM_ENUM("Out FilterR BiQuad Mux", da7218_out_filtr_biq_sel);
  1116. /*
  1117. * DAPM Mixer Controls
  1118. */
  1119. #define DA7218_DMIX_CTRLS(reg) \
  1120. SOC_DAPM_SINGLE("In Filter1L Switch", reg, \
  1121. DA7218_DMIX_SRC_INFILT1L, \
  1122. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1123. SOC_DAPM_SINGLE("In Filter1R Switch", reg, \
  1124. DA7218_DMIX_SRC_INFILT1R, \
  1125. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1126. SOC_DAPM_SINGLE("In Filter2L Switch", reg, \
  1127. DA7218_DMIX_SRC_INFILT2L, \
  1128. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1129. SOC_DAPM_SINGLE("In Filter2R Switch", reg, \
  1130. DA7218_DMIX_SRC_INFILT2R, \
  1131. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1132. SOC_DAPM_SINGLE("ToneGen Switch", reg, \
  1133. DA7218_DMIX_SRC_TONEGEN, \
  1134. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1135. SOC_DAPM_SINGLE("DAIL Switch", reg, DA7218_DMIX_SRC_DAIL, \
  1136. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1137. SOC_DAPM_SINGLE("DAIR Switch", reg, DA7218_DMIX_SRC_DAIR, \
  1138. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT)
  1139. static const struct snd_kcontrol_new da7218_out_dai1l_mix_controls[] = {
  1140. DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_1L),
  1141. };
  1142. static const struct snd_kcontrol_new da7218_out_dai1r_mix_controls[] = {
  1143. DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_1R),
  1144. };
  1145. static const struct snd_kcontrol_new da7218_out_dai2l_mix_controls[] = {
  1146. DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_2L),
  1147. };
  1148. static const struct snd_kcontrol_new da7218_out_dai2r_mix_controls[] = {
  1149. DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTDAI_2R),
  1150. };
  1151. static const struct snd_kcontrol_new da7218_out_filtl_mix_controls[] = {
  1152. DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTFILT_1L),
  1153. };
  1154. static const struct snd_kcontrol_new da7218_out_filtr_mix_controls[] = {
  1155. DA7218_DMIX_CTRLS(DA7218_DROUTING_OUTFILT_1R),
  1156. };
  1157. #define DA7218_DMIX_ST_CTRLS(reg) \
  1158. SOC_DAPM_SINGLE("Out FilterL Switch", reg, \
  1159. DA7218_DMIX_ST_SRC_OUTFILT1L, \
  1160. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1161. SOC_DAPM_SINGLE("Out FilterR Switch", reg, \
  1162. DA7218_DMIX_ST_SRC_OUTFILT1R, \
  1163. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT), \
  1164. SOC_DAPM_SINGLE("Sidetone Switch", reg, \
  1165. DA7218_DMIX_ST_SRC_SIDETONE, \
  1166. DA7218_SWITCH_EN_MAX, DA7218_NO_INVERT) \
  1167. static const struct snd_kcontrol_new da7218_st_out_filtl_mix_controls[] = {
  1168. DA7218_DMIX_ST_CTRLS(DA7218_DROUTING_ST_OUTFILT_1L),
  1169. };
  1170. static const struct snd_kcontrol_new da7218_st_out_filtr_mix_controls[] = {
  1171. DA7218_DMIX_ST_CTRLS(DA7218_DROUTING_ST_OUTFILT_1R),
  1172. };
  1173. /*
  1174. * DAPM Events
  1175. */
  1176. /*
  1177. * We keep track of which input filters are enabled. This is used in the logic
  1178. * for controlling the mic level detect feature.
  1179. */
  1180. static int da7218_in_filter_event(struct snd_soc_dapm_widget *w,
  1181. struct snd_kcontrol *kcontrol, int event)
  1182. {
  1183. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1184. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1185. u8 mask;
  1186. switch (w->reg) {
  1187. case DA7218_IN_1L_FILTER_CTRL:
  1188. mask = (1 << DA7218_LVL_DET_EN_CHAN1L_SHIFT);
  1189. break;
  1190. case DA7218_IN_1R_FILTER_CTRL:
  1191. mask = (1 << DA7218_LVL_DET_EN_CHAN1R_SHIFT);
  1192. break;
  1193. case DA7218_IN_2L_FILTER_CTRL:
  1194. mask = (1 << DA7218_LVL_DET_EN_CHAN2L_SHIFT);
  1195. break;
  1196. case DA7218_IN_2R_FILTER_CTRL:
  1197. mask = (1 << DA7218_LVL_DET_EN_CHAN2R_SHIFT);
  1198. break;
  1199. default:
  1200. return -EINVAL;
  1201. }
  1202. switch (event) {
  1203. case SND_SOC_DAPM_POST_PMU:
  1204. da7218->in_filt_en |= mask;
  1205. /*
  1206. * If we're enabling path for mic level detect, wait for path
  1207. * to settle before enabling feature to avoid incorrect and
  1208. * unwanted detect events.
  1209. */
  1210. if (mask & da7218->mic_lvl_det_en)
  1211. msleep(DA7218_MIC_LVL_DET_DELAY);
  1212. break;
  1213. case SND_SOC_DAPM_PRE_PMD:
  1214. da7218->in_filt_en &= ~mask;
  1215. break;
  1216. default:
  1217. return -EINVAL;
  1218. }
  1219. /* Enable configured level detection paths */
  1220. snd_soc_write(codec, DA7218_LVL_DET_CTRL,
  1221. (da7218->in_filt_en & da7218->mic_lvl_det_en));
  1222. return 0;
  1223. }
  1224. static int da7218_dai_event(struct snd_soc_dapm_widget *w,
  1225. struct snd_kcontrol *kcontrol, int event)
  1226. {
  1227. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1228. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1229. u8 pll_ctrl, pll_status, refosc_cal;
  1230. int i;
  1231. bool success;
  1232. switch (event) {
  1233. case SND_SOC_DAPM_POST_PMU:
  1234. if (da7218->master)
  1235. /* Enable DAI clks for master mode */
  1236. snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
  1237. DA7218_DAI_CLK_EN_MASK,
  1238. DA7218_DAI_CLK_EN_MASK);
  1239. /* Tune reference oscillator */
  1240. snd_soc_write(codec, DA7218_PLL_REFOSC_CAL,
  1241. DA7218_PLL_REFOSC_CAL_START_MASK);
  1242. snd_soc_write(codec, DA7218_PLL_REFOSC_CAL,
  1243. DA7218_PLL_REFOSC_CAL_START_MASK |
  1244. DA7218_PLL_REFOSC_CAL_EN_MASK);
  1245. /* Check tuning complete */
  1246. i = 0;
  1247. success = false;
  1248. do {
  1249. refosc_cal = snd_soc_read(codec, DA7218_PLL_REFOSC_CAL);
  1250. if (!(refosc_cal & DA7218_PLL_REFOSC_CAL_START_MASK)) {
  1251. success = true;
  1252. } else {
  1253. ++i;
  1254. usleep_range(DA7218_REF_OSC_CHECK_DELAY_MIN,
  1255. DA7218_REF_OSC_CHECK_DELAY_MAX);
  1256. }
  1257. } while ((i < DA7218_REF_OSC_CHECK_TRIES) && (!success));
  1258. if (!success)
  1259. dev_warn(codec->dev,
  1260. "Reference oscillator failed calibration\n");
  1261. /* PC synchronised to DAI */
  1262. snd_soc_write(codec, DA7218_PC_COUNT,
  1263. DA7218_PC_RESYNC_AUTO_MASK);
  1264. /* If SRM not enabled, we don't need to check status */
  1265. pll_ctrl = snd_soc_read(codec, DA7218_PLL_CTRL);
  1266. if ((pll_ctrl & DA7218_PLL_MODE_MASK) != DA7218_PLL_MODE_SRM)
  1267. return 0;
  1268. /* Check SRM has locked */
  1269. i = 0;
  1270. success = false;
  1271. do {
  1272. pll_status = snd_soc_read(codec, DA7218_PLL_STATUS);
  1273. if (pll_status & DA7218_PLL_SRM_STATUS_SRM_LOCK) {
  1274. success = true;
  1275. } else {
  1276. ++i;
  1277. msleep(DA7218_SRM_CHECK_DELAY);
  1278. }
  1279. } while ((i < DA7218_SRM_CHECK_TRIES) & (!success));
  1280. if (!success)
  1281. dev_warn(codec->dev, "SRM failed to lock\n");
  1282. return 0;
  1283. case SND_SOC_DAPM_POST_PMD:
  1284. /* PC free-running */
  1285. snd_soc_write(codec, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK);
  1286. if (da7218->master)
  1287. /* Disable DAI clks for master mode */
  1288. snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
  1289. DA7218_DAI_CLK_EN_MASK, 0);
  1290. return 0;
  1291. default:
  1292. return -EINVAL;
  1293. }
  1294. }
  1295. static int da7218_cp_event(struct snd_soc_dapm_widget *w,
  1296. struct snd_kcontrol *kcontrol, int event)
  1297. {
  1298. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1299. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1300. /*
  1301. * If this is DA7217 and we're using single supply for differential
  1302. * output, we really don't want to touch the charge pump.
  1303. */
  1304. if (da7218->hp_single_supply)
  1305. return 0;
  1306. switch (event) {
  1307. case SND_SOC_DAPM_PRE_PMU:
  1308. snd_soc_update_bits(codec, DA7218_CP_CTRL, DA7218_CP_EN_MASK,
  1309. DA7218_CP_EN_MASK);
  1310. return 0;
  1311. case SND_SOC_DAPM_PRE_PMD:
  1312. snd_soc_update_bits(codec, DA7218_CP_CTRL, DA7218_CP_EN_MASK,
  1313. 0);
  1314. return 0;
  1315. default:
  1316. return -EINVAL;
  1317. }
  1318. }
  1319. static int da7218_hp_pga_event(struct snd_soc_dapm_widget *w,
  1320. struct snd_kcontrol *kcontrol, int event)
  1321. {
  1322. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1323. switch (event) {
  1324. case SND_SOC_DAPM_POST_PMU:
  1325. /* Enable headphone output */
  1326. snd_soc_update_bits(codec, w->reg, DA7218_HP_AMP_OE_MASK,
  1327. DA7218_HP_AMP_OE_MASK);
  1328. return 0;
  1329. case SND_SOC_DAPM_PRE_PMD:
  1330. /* Headphone output high impedance */
  1331. snd_soc_update_bits(codec, w->reg, DA7218_HP_AMP_OE_MASK, 0);
  1332. return 0;
  1333. default:
  1334. return -EINVAL;
  1335. }
  1336. }
  1337. /*
  1338. * DAPM Widgets
  1339. */
  1340. static const struct snd_soc_dapm_widget da7218_dapm_widgets[] = {
  1341. /* Input Supplies */
  1342. SND_SOC_DAPM_SUPPLY("Mic Bias1", DA7218_MICBIAS_EN,
  1343. DA7218_MICBIAS_1_EN_SHIFT, DA7218_NO_INVERT,
  1344. NULL, 0),
  1345. SND_SOC_DAPM_SUPPLY("Mic Bias2", DA7218_MICBIAS_EN,
  1346. DA7218_MICBIAS_2_EN_SHIFT, DA7218_NO_INVERT,
  1347. NULL, 0),
  1348. SND_SOC_DAPM_SUPPLY("DMic1 Left", DA7218_DMIC_1_CTRL,
  1349. DA7218_DMIC_1L_EN_SHIFT, DA7218_NO_INVERT,
  1350. NULL, 0),
  1351. SND_SOC_DAPM_SUPPLY("DMic1 Right", DA7218_DMIC_1_CTRL,
  1352. DA7218_DMIC_1R_EN_SHIFT, DA7218_NO_INVERT,
  1353. NULL, 0),
  1354. SND_SOC_DAPM_SUPPLY("DMic2 Left", DA7218_DMIC_2_CTRL,
  1355. DA7218_DMIC_2L_EN_SHIFT, DA7218_NO_INVERT,
  1356. NULL, 0),
  1357. SND_SOC_DAPM_SUPPLY("DMic2 Right", DA7218_DMIC_2_CTRL,
  1358. DA7218_DMIC_2R_EN_SHIFT, DA7218_NO_INVERT,
  1359. NULL, 0),
  1360. /* Inputs */
  1361. SND_SOC_DAPM_INPUT("MIC1"),
  1362. SND_SOC_DAPM_INPUT("MIC2"),
  1363. SND_SOC_DAPM_INPUT("DMIC1L"),
  1364. SND_SOC_DAPM_INPUT("DMIC1R"),
  1365. SND_SOC_DAPM_INPUT("DMIC2L"),
  1366. SND_SOC_DAPM_INPUT("DMIC2R"),
  1367. /* Input Mixer Supplies */
  1368. SND_SOC_DAPM_SUPPLY("Mixin1 Supply", DA7218_MIXIN_1_CTRL,
  1369. DA7218_MIXIN_1_MIX_SEL_SHIFT, DA7218_NO_INVERT,
  1370. NULL, 0),
  1371. SND_SOC_DAPM_SUPPLY("Mixin2 Supply", DA7218_MIXIN_2_CTRL,
  1372. DA7218_MIXIN_2_MIX_SEL_SHIFT, DA7218_NO_INVERT,
  1373. NULL, 0),
  1374. /* Input PGAs */
  1375. SND_SOC_DAPM_PGA("Mic1 PGA", DA7218_MIC_1_CTRL,
  1376. DA7218_MIC_1_AMP_EN_SHIFT, DA7218_NO_INVERT,
  1377. NULL, 0),
  1378. SND_SOC_DAPM_PGA("Mic2 PGA", DA7218_MIC_2_CTRL,
  1379. DA7218_MIC_2_AMP_EN_SHIFT, DA7218_NO_INVERT,
  1380. NULL, 0),
  1381. SND_SOC_DAPM_PGA("Mixin1 PGA", DA7218_MIXIN_1_CTRL,
  1382. DA7218_MIXIN_1_AMP_EN_SHIFT, DA7218_NO_INVERT,
  1383. NULL, 0),
  1384. SND_SOC_DAPM_PGA("Mixin2 PGA", DA7218_MIXIN_2_CTRL,
  1385. DA7218_MIXIN_2_AMP_EN_SHIFT, DA7218_NO_INVERT,
  1386. NULL, 0),
  1387. /* Mic/DMic Muxes */
  1388. SND_SOC_DAPM_MUX("Mic1 Mux", SND_SOC_NOPM, 0, 0, &da7218_mic1_sel_mux),
  1389. SND_SOC_DAPM_MUX("Mic2 Mux", SND_SOC_NOPM, 0, 0, &da7218_mic2_sel_mux),
  1390. /* Input Filters */
  1391. SND_SOC_DAPM_ADC_E("In Filter1L", NULL, DA7218_IN_1L_FILTER_CTRL,
  1392. DA7218_IN_1L_FILTER_EN_SHIFT, DA7218_NO_INVERT,
  1393. da7218_in_filter_event,
  1394. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  1395. SND_SOC_DAPM_ADC_E("In Filter1R", NULL, DA7218_IN_1R_FILTER_CTRL,
  1396. DA7218_IN_1R_FILTER_EN_SHIFT, DA7218_NO_INVERT,
  1397. da7218_in_filter_event,
  1398. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  1399. SND_SOC_DAPM_ADC_E("In Filter2L", NULL, DA7218_IN_2L_FILTER_CTRL,
  1400. DA7218_IN_2L_FILTER_EN_SHIFT, DA7218_NO_INVERT,
  1401. da7218_in_filter_event,
  1402. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  1403. SND_SOC_DAPM_ADC_E("In Filter2R", NULL, DA7218_IN_2R_FILTER_CTRL,
  1404. DA7218_IN_2R_FILTER_EN_SHIFT, DA7218_NO_INVERT,
  1405. da7218_in_filter_event,
  1406. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  1407. /* Tone Generator */
  1408. SND_SOC_DAPM_SIGGEN("TONE"),
  1409. SND_SOC_DAPM_PGA("Tone Generator", DA7218_TONE_GEN_CFG1,
  1410. DA7218_START_STOPN_SHIFT, DA7218_NO_INVERT, NULL, 0),
  1411. /* Sidetone Input */
  1412. SND_SOC_DAPM_MUX("Sidetone Mux", SND_SOC_NOPM, 0, 0,
  1413. &da7218_sidetone_in_sel_mux),
  1414. SND_SOC_DAPM_ADC("Sidetone Filter", NULL, DA7218_SIDETONE_CTRL,
  1415. DA7218_SIDETONE_FILTER_EN_SHIFT, DA7218_NO_INVERT),
  1416. /* Input Mixers */
  1417. SND_SOC_DAPM_MIXER("Mixer DAI1L", SND_SOC_NOPM, 0, 0,
  1418. da7218_out_dai1l_mix_controls,
  1419. ARRAY_SIZE(da7218_out_dai1l_mix_controls)),
  1420. SND_SOC_DAPM_MIXER("Mixer DAI1R", SND_SOC_NOPM, 0, 0,
  1421. da7218_out_dai1r_mix_controls,
  1422. ARRAY_SIZE(da7218_out_dai1r_mix_controls)),
  1423. SND_SOC_DAPM_MIXER("Mixer DAI2L", SND_SOC_NOPM, 0, 0,
  1424. da7218_out_dai2l_mix_controls,
  1425. ARRAY_SIZE(da7218_out_dai2l_mix_controls)),
  1426. SND_SOC_DAPM_MIXER("Mixer DAI2R", SND_SOC_NOPM, 0, 0,
  1427. da7218_out_dai2r_mix_controls,
  1428. ARRAY_SIZE(da7218_out_dai2r_mix_controls)),
  1429. /* DAI Supply */
  1430. SND_SOC_DAPM_SUPPLY("DAI", DA7218_DAI_CTRL, DA7218_DAI_EN_SHIFT,
  1431. DA7218_NO_INVERT, da7218_dai_event,
  1432. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  1433. /* DAI */
  1434. SND_SOC_DAPM_AIF_OUT("DAIOUT", "Capture", 0, SND_SOC_NOPM, 0, 0),
  1435. SND_SOC_DAPM_AIF_IN("DAIIN", "Playback", 0, SND_SOC_NOPM, 0, 0),
  1436. /* Output Mixers */
  1437. SND_SOC_DAPM_MIXER("Mixer Out FilterL", SND_SOC_NOPM, 0, 0,
  1438. da7218_out_filtl_mix_controls,
  1439. ARRAY_SIZE(da7218_out_filtl_mix_controls)),
  1440. SND_SOC_DAPM_MIXER("Mixer Out FilterR", SND_SOC_NOPM, 0, 0,
  1441. da7218_out_filtr_mix_controls,
  1442. ARRAY_SIZE(da7218_out_filtr_mix_controls)),
  1443. /* BiQuad Filters */
  1444. SND_SOC_DAPM_MUX("Out FilterL BiQuad Mux", SND_SOC_NOPM, 0, 0,
  1445. &da7218_out_filtl_biq_sel_mux),
  1446. SND_SOC_DAPM_MUX("Out FilterR BiQuad Mux", SND_SOC_NOPM, 0, 0,
  1447. &da7218_out_filtr_biq_sel_mux),
  1448. SND_SOC_DAPM_DAC("BiQuad Filter", NULL, DA7218_OUT_1_BIQ_5STAGE_CTRL,
  1449. DA7218_OUT_1_BIQ_5STAGE_FILTER_EN_SHIFT,
  1450. DA7218_NO_INVERT),
  1451. /* Sidetone Mixers */
  1452. SND_SOC_DAPM_MIXER("ST Mixer Out FilterL", SND_SOC_NOPM, 0, 0,
  1453. da7218_st_out_filtl_mix_controls,
  1454. ARRAY_SIZE(da7218_st_out_filtl_mix_controls)),
  1455. SND_SOC_DAPM_MIXER("ST Mixer Out FilterR", SND_SOC_NOPM, 0, 0,
  1456. da7218_st_out_filtr_mix_controls,
  1457. ARRAY_SIZE(da7218_st_out_filtr_mix_controls)),
  1458. /* Output Filters */
  1459. SND_SOC_DAPM_DAC("Out FilterL", NULL, DA7218_OUT_1L_FILTER_CTRL,
  1460. DA7218_OUT_1L_FILTER_EN_SHIFT, DA7218_NO_INVERT),
  1461. SND_SOC_DAPM_DAC("Out FilterR", NULL, DA7218_OUT_1R_FILTER_CTRL,
  1462. DA7218_IN_1R_FILTER_EN_SHIFT, DA7218_NO_INVERT),
  1463. /* Output PGAs */
  1464. SND_SOC_DAPM_PGA("Mixout Left PGA", DA7218_MIXOUT_L_CTRL,
  1465. DA7218_MIXOUT_L_AMP_EN_SHIFT, DA7218_NO_INVERT,
  1466. NULL, 0),
  1467. SND_SOC_DAPM_PGA("Mixout Right PGA", DA7218_MIXOUT_R_CTRL,
  1468. DA7218_MIXOUT_R_AMP_EN_SHIFT, DA7218_NO_INVERT,
  1469. NULL, 0),
  1470. SND_SOC_DAPM_PGA_E("Headphone Left PGA", DA7218_HP_L_CTRL,
  1471. DA7218_HP_L_AMP_EN_SHIFT, DA7218_NO_INVERT, NULL, 0,
  1472. da7218_hp_pga_event,
  1473. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  1474. SND_SOC_DAPM_PGA_E("Headphone Right PGA", DA7218_HP_R_CTRL,
  1475. DA7218_HP_R_AMP_EN_SHIFT, DA7218_NO_INVERT, NULL, 0,
  1476. da7218_hp_pga_event,
  1477. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  1478. /* Output Supplies */
  1479. SND_SOC_DAPM_SUPPLY("Charge Pump", SND_SOC_NOPM, 0, 0, da7218_cp_event,
  1480. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
  1481. /* Outputs */
  1482. SND_SOC_DAPM_OUTPUT("HPL"),
  1483. SND_SOC_DAPM_OUTPUT("HPR"),
  1484. };
  1485. /*
  1486. * DAPM Mixer Routes
  1487. */
  1488. #define DA7218_DMIX_ROUTES(name) \
  1489. {name, "In Filter1L Switch", "In Filter1L"}, \
  1490. {name, "In Filter1R Switch", "In Filter1R"}, \
  1491. {name, "In Filter2L Switch", "In Filter2L"}, \
  1492. {name, "In Filter2R Switch", "In Filter2R"}, \
  1493. {name, "ToneGen Switch", "Tone Generator"}, \
  1494. {name, "DAIL Switch", "DAIIN"}, \
  1495. {name, "DAIR Switch", "DAIIN"}
  1496. #define DA7218_DMIX_ST_ROUTES(name) \
  1497. {name, "Out FilterL Switch", "Out FilterL BiQuad Mux"}, \
  1498. {name, "Out FilterR Switch", "Out FilterR BiQuad Mux"}, \
  1499. {name, "Sidetone Switch", "Sidetone Filter"}
  1500. /*
  1501. * DAPM audio route definition
  1502. */
  1503. static const struct snd_soc_dapm_route da7218_audio_map[] = {
  1504. /* Input paths */
  1505. {"MIC1", NULL, "Mic Bias1"},
  1506. {"MIC2", NULL, "Mic Bias2"},
  1507. {"DMIC1L", NULL, "Mic Bias1"},
  1508. {"DMIC1L", NULL, "DMic1 Left"},
  1509. {"DMIC1R", NULL, "Mic Bias1"},
  1510. {"DMIC1R", NULL, "DMic1 Right"},
  1511. {"DMIC2L", NULL, "Mic Bias2"},
  1512. {"DMIC2L", NULL, "DMic2 Left"},
  1513. {"DMIC2R", NULL, "Mic Bias2"},
  1514. {"DMIC2R", NULL, "DMic2 Right"},
  1515. {"Mic1 PGA", NULL, "MIC1"},
  1516. {"Mic2 PGA", NULL, "MIC2"},
  1517. {"Mixin1 PGA", NULL, "Mixin1 Supply"},
  1518. {"Mixin2 PGA", NULL, "Mixin2 Supply"},
  1519. {"Mixin1 PGA", NULL, "Mic1 PGA"},
  1520. {"Mixin2 PGA", NULL, "Mic2 PGA"},
  1521. {"Mic1 Mux", "Analog", "Mixin1 PGA"},
  1522. {"Mic1 Mux", "Digital", "DMIC1L"},
  1523. {"Mic1 Mux", "Digital", "DMIC1R"},
  1524. {"Mic2 Mux", "Analog", "Mixin2 PGA"},
  1525. {"Mic2 Mux", "Digital", "DMIC2L"},
  1526. {"Mic2 Mux", "Digital", "DMIC2R"},
  1527. {"In Filter1L", NULL, "Mic1 Mux"},
  1528. {"In Filter1R", NULL, "Mic1 Mux"},
  1529. {"In Filter2L", NULL, "Mic2 Mux"},
  1530. {"In Filter2R", NULL, "Mic2 Mux"},
  1531. {"Tone Generator", NULL, "TONE"},
  1532. {"Sidetone Mux", "In Filter1L", "In Filter1L"},
  1533. {"Sidetone Mux", "In Filter1R", "In Filter1R"},
  1534. {"Sidetone Mux", "In Filter2L", "In Filter2L"},
  1535. {"Sidetone Mux", "In Filter2R", "In Filter2R"},
  1536. {"Sidetone Filter", NULL, "Sidetone Mux"},
  1537. DA7218_DMIX_ROUTES("Mixer DAI1L"),
  1538. DA7218_DMIX_ROUTES("Mixer DAI1R"),
  1539. DA7218_DMIX_ROUTES("Mixer DAI2L"),
  1540. DA7218_DMIX_ROUTES("Mixer DAI2R"),
  1541. {"DAIOUT", NULL, "Mixer DAI1L"},
  1542. {"DAIOUT", NULL, "Mixer DAI1R"},
  1543. {"DAIOUT", NULL, "Mixer DAI2L"},
  1544. {"DAIOUT", NULL, "Mixer DAI2R"},
  1545. {"DAIOUT", NULL, "DAI"},
  1546. /* Output paths */
  1547. {"DAIIN", NULL, "DAI"},
  1548. DA7218_DMIX_ROUTES("Mixer Out FilterL"),
  1549. DA7218_DMIX_ROUTES("Mixer Out FilterR"),
  1550. {"BiQuad Filter", NULL, "Mixer Out FilterL"},
  1551. {"BiQuad Filter", NULL, "Mixer Out FilterR"},
  1552. {"Out FilterL BiQuad Mux", "Bypass", "Mixer Out FilterL"},
  1553. {"Out FilterL BiQuad Mux", "Enabled", "BiQuad Filter"},
  1554. {"Out FilterR BiQuad Mux", "Bypass", "Mixer Out FilterR"},
  1555. {"Out FilterR BiQuad Mux", "Enabled", "BiQuad Filter"},
  1556. DA7218_DMIX_ST_ROUTES("ST Mixer Out FilterL"),
  1557. DA7218_DMIX_ST_ROUTES("ST Mixer Out FilterR"),
  1558. {"Out FilterL", NULL, "ST Mixer Out FilterL"},
  1559. {"Out FilterR", NULL, "ST Mixer Out FilterR"},
  1560. {"Mixout Left PGA", NULL, "Out FilterL"},
  1561. {"Mixout Right PGA", NULL, "Out FilterR"},
  1562. {"Headphone Left PGA", NULL, "Mixout Left PGA"},
  1563. {"Headphone Right PGA", NULL, "Mixout Right PGA"},
  1564. {"HPL", NULL, "Headphone Left PGA"},
  1565. {"HPR", NULL, "Headphone Right PGA"},
  1566. {"HPL", NULL, "Charge Pump"},
  1567. {"HPR", NULL, "Charge Pump"},
  1568. };
  1569. /*
  1570. * DAI operations
  1571. */
  1572. static int da7218_set_dai_sysclk(struct snd_soc_dai *codec_dai,
  1573. int clk_id, unsigned int freq, int dir)
  1574. {
  1575. struct snd_soc_codec *codec = codec_dai->codec;
  1576. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1577. int ret;
  1578. if (da7218->mclk_rate == freq)
  1579. return 0;
  1580. if ((freq < 2000000) || (freq > 54000000)) {
  1581. dev_err(codec_dai->dev, "Unsupported MCLK value %d\n",
  1582. freq);
  1583. return -EINVAL;
  1584. }
  1585. switch (clk_id) {
  1586. case DA7218_CLKSRC_MCLK_SQR:
  1587. snd_soc_update_bits(codec, DA7218_PLL_CTRL,
  1588. DA7218_PLL_MCLK_SQR_EN_MASK,
  1589. DA7218_PLL_MCLK_SQR_EN_MASK);
  1590. break;
  1591. case DA7218_CLKSRC_MCLK:
  1592. snd_soc_update_bits(codec, DA7218_PLL_CTRL,
  1593. DA7218_PLL_MCLK_SQR_EN_MASK, 0);
  1594. break;
  1595. default:
  1596. dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id);
  1597. return -EINVAL;
  1598. }
  1599. if (da7218->mclk) {
  1600. freq = clk_round_rate(da7218->mclk, freq);
  1601. ret = clk_set_rate(da7218->mclk, freq);
  1602. if (ret) {
  1603. dev_err(codec_dai->dev, "Failed to set clock rate %d\n",
  1604. freq);
  1605. return ret;
  1606. }
  1607. }
  1608. da7218->mclk_rate = freq;
  1609. return 0;
  1610. }
  1611. static int da7218_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
  1612. int source, unsigned int fref, unsigned int fout)
  1613. {
  1614. struct snd_soc_codec *codec = codec_dai->codec;
  1615. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1616. u8 pll_ctrl, indiv_bits, indiv;
  1617. u8 pll_frac_top, pll_frac_bot, pll_integer;
  1618. u32 freq_ref;
  1619. u64 frac_div;
  1620. /* Verify 2MHz - 54MHz MCLK provided, and set input divider */
  1621. if (da7218->mclk_rate < 2000000) {
  1622. dev_err(codec->dev, "PLL input clock %d below valid range\n",
  1623. da7218->mclk_rate);
  1624. return -EINVAL;
  1625. } else if (da7218->mclk_rate <= 4500000) {
  1626. indiv_bits = DA7218_PLL_INDIV_2_TO_4_5_MHZ;
  1627. indiv = DA7218_PLL_INDIV_2_TO_4_5_MHZ_VAL;
  1628. } else if (da7218->mclk_rate <= 9000000) {
  1629. indiv_bits = DA7218_PLL_INDIV_4_5_TO_9_MHZ;
  1630. indiv = DA7218_PLL_INDIV_4_5_TO_9_MHZ_VAL;
  1631. } else if (da7218->mclk_rate <= 18000000) {
  1632. indiv_bits = DA7218_PLL_INDIV_9_TO_18_MHZ;
  1633. indiv = DA7218_PLL_INDIV_9_TO_18_MHZ_VAL;
  1634. } else if (da7218->mclk_rate <= 36000000) {
  1635. indiv_bits = DA7218_PLL_INDIV_18_TO_36_MHZ;
  1636. indiv = DA7218_PLL_INDIV_18_TO_36_MHZ_VAL;
  1637. } else if (da7218->mclk_rate <= 54000000) {
  1638. indiv_bits = DA7218_PLL_INDIV_36_TO_54_MHZ;
  1639. indiv = DA7218_PLL_INDIV_36_TO_54_MHZ_VAL;
  1640. } else {
  1641. dev_err(codec->dev, "PLL input clock %d above valid range\n",
  1642. da7218->mclk_rate);
  1643. return -EINVAL;
  1644. }
  1645. freq_ref = (da7218->mclk_rate / indiv);
  1646. pll_ctrl = indiv_bits;
  1647. /* Configure PLL */
  1648. switch (source) {
  1649. case DA7218_SYSCLK_MCLK:
  1650. pll_ctrl |= DA7218_PLL_MODE_BYPASS;
  1651. snd_soc_update_bits(codec, DA7218_PLL_CTRL,
  1652. DA7218_PLL_INDIV_MASK |
  1653. DA7218_PLL_MODE_MASK, pll_ctrl);
  1654. return 0;
  1655. case DA7218_SYSCLK_PLL:
  1656. pll_ctrl |= DA7218_PLL_MODE_NORMAL;
  1657. break;
  1658. case DA7218_SYSCLK_PLL_SRM:
  1659. pll_ctrl |= DA7218_PLL_MODE_SRM;
  1660. break;
  1661. default:
  1662. dev_err(codec->dev, "Invalid PLL config\n");
  1663. return -EINVAL;
  1664. }
  1665. /* Calculate dividers for PLL */
  1666. pll_integer = fout / freq_ref;
  1667. frac_div = (u64)(fout % freq_ref) * 8192ULL;
  1668. do_div(frac_div, freq_ref);
  1669. pll_frac_top = (frac_div >> DA7218_BYTE_SHIFT) & DA7218_BYTE_MASK;
  1670. pll_frac_bot = (frac_div) & DA7218_BYTE_MASK;
  1671. /* Write PLL config & dividers */
  1672. snd_soc_write(codec, DA7218_PLL_FRAC_TOP, pll_frac_top);
  1673. snd_soc_write(codec, DA7218_PLL_FRAC_BOT, pll_frac_bot);
  1674. snd_soc_write(codec, DA7218_PLL_INTEGER, pll_integer);
  1675. snd_soc_update_bits(codec, DA7218_PLL_CTRL,
  1676. DA7218_PLL_MODE_MASK | DA7218_PLL_INDIV_MASK,
  1677. pll_ctrl);
  1678. return 0;
  1679. }
  1680. static int da7218_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
  1681. {
  1682. struct snd_soc_codec *codec = codec_dai->codec;
  1683. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1684. u8 dai_clk_mode = 0, dai_ctrl = 0;
  1685. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  1686. case SND_SOC_DAIFMT_CBM_CFM:
  1687. da7218->master = true;
  1688. break;
  1689. case SND_SOC_DAIFMT_CBS_CFS:
  1690. da7218->master = false;
  1691. break;
  1692. default:
  1693. return -EINVAL;
  1694. }
  1695. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  1696. case SND_SOC_DAIFMT_I2S:
  1697. case SND_SOC_DAIFMT_LEFT_J:
  1698. case SND_SOC_DAIFMT_RIGHT_J:
  1699. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  1700. case SND_SOC_DAIFMT_NB_NF:
  1701. break;
  1702. case SND_SOC_DAIFMT_NB_IF:
  1703. dai_clk_mode |= DA7218_DAI_WCLK_POL_INV;
  1704. break;
  1705. case SND_SOC_DAIFMT_IB_NF:
  1706. dai_clk_mode |= DA7218_DAI_CLK_POL_INV;
  1707. break;
  1708. case SND_SOC_DAIFMT_IB_IF:
  1709. dai_clk_mode |= DA7218_DAI_WCLK_POL_INV |
  1710. DA7218_DAI_CLK_POL_INV;
  1711. break;
  1712. default:
  1713. return -EINVAL;
  1714. }
  1715. break;
  1716. case SND_SOC_DAIFMT_DSP_B:
  1717. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  1718. case SND_SOC_DAIFMT_NB_NF:
  1719. dai_clk_mode |= DA7218_DAI_CLK_POL_INV;
  1720. break;
  1721. case SND_SOC_DAIFMT_NB_IF:
  1722. dai_clk_mode |= DA7218_DAI_WCLK_POL_INV |
  1723. DA7218_DAI_CLK_POL_INV;
  1724. break;
  1725. case SND_SOC_DAIFMT_IB_NF:
  1726. break;
  1727. case SND_SOC_DAIFMT_IB_IF:
  1728. dai_clk_mode |= DA7218_DAI_WCLK_POL_INV;
  1729. break;
  1730. default:
  1731. return -EINVAL;
  1732. }
  1733. break;
  1734. default:
  1735. return -EINVAL;
  1736. }
  1737. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  1738. case SND_SOC_DAIFMT_I2S:
  1739. dai_ctrl |= DA7218_DAI_FORMAT_I2S;
  1740. break;
  1741. case SND_SOC_DAIFMT_LEFT_J:
  1742. dai_ctrl |= DA7218_DAI_FORMAT_LEFT_J;
  1743. break;
  1744. case SND_SOC_DAIFMT_RIGHT_J:
  1745. dai_ctrl |= DA7218_DAI_FORMAT_RIGHT_J;
  1746. break;
  1747. case SND_SOC_DAIFMT_DSP_B:
  1748. dai_ctrl |= DA7218_DAI_FORMAT_DSP;
  1749. break;
  1750. default:
  1751. return -EINVAL;
  1752. }
  1753. /* By default 64 BCLKs per WCLK is supported */
  1754. dai_clk_mode |= DA7218_DAI_BCLKS_PER_WCLK_64;
  1755. snd_soc_write(codec, DA7218_DAI_CLK_MODE, dai_clk_mode);
  1756. snd_soc_update_bits(codec, DA7218_DAI_CTRL, DA7218_DAI_FORMAT_MASK,
  1757. dai_ctrl);
  1758. return 0;
  1759. }
  1760. static int da7218_set_dai_tdm_slot(struct snd_soc_dai *dai,
  1761. unsigned int tx_mask, unsigned int rx_mask,
  1762. int slots, int slot_width)
  1763. {
  1764. struct snd_soc_codec *codec = dai->codec;
  1765. u8 dai_bclks_per_wclk;
  1766. u32 frame_size;
  1767. /* No channels enabled so disable TDM, revert to 64-bit frames */
  1768. if (!tx_mask) {
  1769. snd_soc_update_bits(codec, DA7218_DAI_TDM_CTRL,
  1770. DA7218_DAI_TDM_CH_EN_MASK |
  1771. DA7218_DAI_TDM_MODE_EN_MASK, 0);
  1772. snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
  1773. DA7218_DAI_BCLKS_PER_WCLK_MASK,
  1774. DA7218_DAI_BCLKS_PER_WCLK_64);
  1775. return 0;
  1776. }
  1777. /* Check we have valid slots */
  1778. if (fls(tx_mask) > DA7218_DAI_TDM_MAX_SLOTS) {
  1779. dev_err(codec->dev, "Invalid number of slots, max = %d\n",
  1780. DA7218_DAI_TDM_MAX_SLOTS);
  1781. return -EINVAL;
  1782. }
  1783. /* Check we have a valid offset given (first 2 bytes of rx_mask) */
  1784. if (rx_mask >> DA7218_2BYTE_SHIFT) {
  1785. dev_err(codec->dev, "Invalid slot offset, max = %d\n",
  1786. DA7218_2BYTE_MASK);
  1787. return -EINVAL;
  1788. }
  1789. /* Calculate & validate frame size based on slot info provided. */
  1790. frame_size = slots * slot_width;
  1791. switch (frame_size) {
  1792. case 32:
  1793. dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_32;
  1794. break;
  1795. case 64:
  1796. dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_64;
  1797. break;
  1798. case 128:
  1799. dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_128;
  1800. break;
  1801. case 256:
  1802. dai_bclks_per_wclk = DA7218_DAI_BCLKS_PER_WCLK_256;
  1803. break;
  1804. default:
  1805. dev_err(codec->dev, "Invalid frame size\n");
  1806. return -EINVAL;
  1807. }
  1808. snd_soc_update_bits(codec, DA7218_DAI_CLK_MODE,
  1809. DA7218_DAI_BCLKS_PER_WCLK_MASK,
  1810. dai_bclks_per_wclk);
  1811. snd_soc_write(codec, DA7218_DAI_OFFSET_LOWER,
  1812. (rx_mask & DA7218_BYTE_MASK));
  1813. snd_soc_write(codec, DA7218_DAI_OFFSET_UPPER,
  1814. ((rx_mask >> DA7218_BYTE_SHIFT) & DA7218_BYTE_MASK));
  1815. snd_soc_update_bits(codec, DA7218_DAI_TDM_CTRL,
  1816. DA7218_DAI_TDM_CH_EN_MASK |
  1817. DA7218_DAI_TDM_MODE_EN_MASK,
  1818. (tx_mask << DA7218_DAI_TDM_CH_EN_SHIFT) |
  1819. DA7218_DAI_TDM_MODE_EN_MASK);
  1820. return 0;
  1821. }
  1822. static int da7218_hw_params(struct snd_pcm_substream *substream,
  1823. struct snd_pcm_hw_params *params,
  1824. struct snd_soc_dai *dai)
  1825. {
  1826. struct snd_soc_codec *codec = dai->codec;
  1827. u8 dai_ctrl = 0, fs;
  1828. unsigned int channels;
  1829. switch (params_width(params)) {
  1830. case 16:
  1831. dai_ctrl |= DA7218_DAI_WORD_LENGTH_S16_LE;
  1832. break;
  1833. case 20:
  1834. dai_ctrl |= DA7218_DAI_WORD_LENGTH_S20_LE;
  1835. break;
  1836. case 24:
  1837. dai_ctrl |= DA7218_DAI_WORD_LENGTH_S24_LE;
  1838. break;
  1839. case 32:
  1840. dai_ctrl |= DA7218_DAI_WORD_LENGTH_S32_LE;
  1841. break;
  1842. default:
  1843. return -EINVAL;
  1844. }
  1845. channels = params_channels(params);
  1846. if ((channels < 1) || (channels > DA7218_DAI_CH_NUM_MAX)) {
  1847. dev_err(codec->dev,
  1848. "Invalid number of channels, only 1 to %d supported\n",
  1849. DA7218_DAI_CH_NUM_MAX);
  1850. return -EINVAL;
  1851. }
  1852. dai_ctrl |= channels << DA7218_DAI_CH_NUM_SHIFT;
  1853. switch (params_rate(params)) {
  1854. case 8000:
  1855. fs = DA7218_SR_8000;
  1856. break;
  1857. case 11025:
  1858. fs = DA7218_SR_11025;
  1859. break;
  1860. case 12000:
  1861. fs = DA7218_SR_12000;
  1862. break;
  1863. case 16000:
  1864. fs = DA7218_SR_16000;
  1865. break;
  1866. case 22050:
  1867. fs = DA7218_SR_22050;
  1868. break;
  1869. case 24000:
  1870. fs = DA7218_SR_24000;
  1871. break;
  1872. case 32000:
  1873. fs = DA7218_SR_32000;
  1874. break;
  1875. case 44100:
  1876. fs = DA7218_SR_44100;
  1877. break;
  1878. case 48000:
  1879. fs = DA7218_SR_48000;
  1880. break;
  1881. case 88200:
  1882. fs = DA7218_SR_88200;
  1883. break;
  1884. case 96000:
  1885. fs = DA7218_SR_96000;
  1886. break;
  1887. default:
  1888. return -EINVAL;
  1889. }
  1890. snd_soc_update_bits(codec, DA7218_DAI_CTRL,
  1891. DA7218_DAI_WORD_LENGTH_MASK | DA7218_DAI_CH_NUM_MASK,
  1892. dai_ctrl);
  1893. /* SRs tied for ADCs and DACs. */
  1894. snd_soc_write(codec, DA7218_SR,
  1895. (fs << DA7218_SR_DAC_SHIFT) | (fs << DA7218_SR_ADC_SHIFT));
  1896. return 0;
  1897. }
  1898. static const struct snd_soc_dai_ops da7218_dai_ops = {
  1899. .hw_params = da7218_hw_params,
  1900. .set_sysclk = da7218_set_dai_sysclk,
  1901. .set_pll = da7218_set_dai_pll,
  1902. .set_fmt = da7218_set_dai_fmt,
  1903. .set_tdm_slot = da7218_set_dai_tdm_slot,
  1904. };
  1905. #define DA7218_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
  1906. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
  1907. static struct snd_soc_dai_driver da7218_dai = {
  1908. .name = "da7218-hifi",
  1909. .playback = {
  1910. .stream_name = "Playback",
  1911. .channels_min = 1,
  1912. .channels_max = 4, /* Only 2 channels of data */
  1913. .rates = SNDRV_PCM_RATE_8000_96000,
  1914. .formats = DA7218_FORMATS,
  1915. },
  1916. .capture = {
  1917. .stream_name = "Capture",
  1918. .channels_min = 1,
  1919. .channels_max = 4,
  1920. .rates = SNDRV_PCM_RATE_8000_96000,
  1921. .formats = DA7218_FORMATS,
  1922. },
  1923. .ops = &da7218_dai_ops,
  1924. .symmetric_rates = 1,
  1925. .symmetric_channels = 1,
  1926. .symmetric_samplebits = 1,
  1927. };
  1928. /*
  1929. * HP Detect
  1930. */
  1931. int da7218_hpldet(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
  1932. {
  1933. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1934. if (da7218->dev_id == DA7217_DEV_ID)
  1935. return -EINVAL;
  1936. da7218->jack = jack;
  1937. snd_soc_update_bits(codec, DA7218_HPLDET_JACK,
  1938. DA7218_HPLDET_JACK_EN_MASK,
  1939. jack ? DA7218_HPLDET_JACK_EN_MASK : 0);
  1940. return 0;
  1941. }
  1942. EXPORT_SYMBOL_GPL(da7218_hpldet);
  1943. static void da7218_micldet_irq(struct snd_soc_codec *codec)
  1944. {
  1945. char *envp[] = {
  1946. "EVENT=MIC_LEVEL_DETECT",
  1947. NULL,
  1948. };
  1949. kobject_uevent_env(&codec->dev->kobj, KOBJ_CHANGE, envp);
  1950. }
  1951. static void da7218_hpldet_irq(struct snd_soc_codec *codec)
  1952. {
  1953. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  1954. u8 jack_status;
  1955. int report;
  1956. jack_status = snd_soc_read(codec, DA7218_EVENT_STATUS);
  1957. if (jack_status & DA7218_HPLDET_JACK_STS_MASK)
  1958. report = SND_JACK_HEADPHONE;
  1959. else
  1960. report = 0;
  1961. snd_soc_jack_report(da7218->jack, report, SND_JACK_HEADPHONE);
  1962. }
  1963. /*
  1964. * IRQ
  1965. */
  1966. static irqreturn_t da7218_irq_thread(int irq, void *data)
  1967. {
  1968. struct snd_soc_codec *codec = data;
  1969. u8 status;
  1970. /* Read IRQ status reg */
  1971. status = snd_soc_read(codec, DA7218_EVENT);
  1972. if (!status)
  1973. return IRQ_NONE;
  1974. /* Mic level detect */
  1975. if (status & DA7218_LVL_DET_EVENT_MASK)
  1976. da7218_micldet_irq(codec);
  1977. /* HP detect */
  1978. if (status & DA7218_HPLDET_JACK_EVENT_MASK)
  1979. da7218_hpldet_irq(codec);
  1980. /* Clear interrupts */
  1981. snd_soc_write(codec, DA7218_EVENT, status);
  1982. return IRQ_HANDLED;
  1983. }
  1984. /*
  1985. * DT
  1986. */
  1987. static const struct of_device_id da7218_of_match[] = {
  1988. { .compatible = "dlg,da7217", .data = (void *) DA7217_DEV_ID },
  1989. { .compatible = "dlg,da7218", .data = (void *) DA7218_DEV_ID },
  1990. { }
  1991. };
  1992. MODULE_DEVICE_TABLE(of, da7218_of_match);
  1993. static inline int da7218_of_get_id(struct device *dev)
  1994. {
  1995. const struct of_device_id *id = of_match_device(da7218_of_match, dev);
  1996. if (id)
  1997. return (uintptr_t)id->data;
  1998. else
  1999. return -EINVAL;
  2000. }
  2001. static enum da7218_micbias_voltage
  2002. da7218_of_micbias_lvl(struct snd_soc_codec *codec, u32 val)
  2003. {
  2004. switch (val) {
  2005. case 1200:
  2006. return DA7218_MICBIAS_1_2V;
  2007. case 1600:
  2008. return DA7218_MICBIAS_1_6V;
  2009. case 1800:
  2010. return DA7218_MICBIAS_1_8V;
  2011. case 2000:
  2012. return DA7218_MICBIAS_2_0V;
  2013. case 2200:
  2014. return DA7218_MICBIAS_2_2V;
  2015. case 2400:
  2016. return DA7218_MICBIAS_2_4V;
  2017. case 2600:
  2018. return DA7218_MICBIAS_2_6V;
  2019. case 2800:
  2020. return DA7218_MICBIAS_2_8V;
  2021. case 3000:
  2022. return DA7218_MICBIAS_3_0V;
  2023. default:
  2024. dev_warn(codec->dev, "Invalid micbias level");
  2025. return DA7218_MICBIAS_1_6V;
  2026. }
  2027. }
  2028. static enum da7218_mic_amp_in_sel
  2029. da7218_of_mic_amp_in_sel(struct snd_soc_codec *codec, const char *str)
  2030. {
  2031. if (!strcmp(str, "diff")) {
  2032. return DA7218_MIC_AMP_IN_SEL_DIFF;
  2033. } else if (!strcmp(str, "se_p")) {
  2034. return DA7218_MIC_AMP_IN_SEL_SE_P;
  2035. } else if (!strcmp(str, "se_n")) {
  2036. return DA7218_MIC_AMP_IN_SEL_SE_N;
  2037. } else {
  2038. dev_warn(codec->dev, "Invalid mic input type selection");
  2039. return DA7218_MIC_AMP_IN_SEL_DIFF;
  2040. }
  2041. }
  2042. static enum da7218_dmic_data_sel
  2043. da7218_of_dmic_data_sel(struct snd_soc_codec *codec, const char *str)
  2044. {
  2045. if (!strcmp(str, "lrise_rfall")) {
  2046. return DA7218_DMIC_DATA_LRISE_RFALL;
  2047. } else if (!strcmp(str, "lfall_rrise")) {
  2048. return DA7218_DMIC_DATA_LFALL_RRISE;
  2049. } else {
  2050. dev_warn(codec->dev, "Invalid DMIC data type selection");
  2051. return DA7218_DMIC_DATA_LRISE_RFALL;
  2052. }
  2053. }
  2054. static enum da7218_dmic_samplephase
  2055. da7218_of_dmic_samplephase(struct snd_soc_codec *codec, const char *str)
  2056. {
  2057. if (!strcmp(str, "on_clkedge")) {
  2058. return DA7218_DMIC_SAMPLE_ON_CLKEDGE;
  2059. } else if (!strcmp(str, "between_clkedge")) {
  2060. return DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE;
  2061. } else {
  2062. dev_warn(codec->dev, "Invalid DMIC sample phase");
  2063. return DA7218_DMIC_SAMPLE_ON_CLKEDGE;
  2064. }
  2065. }
  2066. static enum da7218_dmic_clk_rate
  2067. da7218_of_dmic_clkrate(struct snd_soc_codec *codec, u32 val)
  2068. {
  2069. switch (val) {
  2070. case 1500000:
  2071. return DA7218_DMIC_CLK_1_5MHZ;
  2072. case 3000000:
  2073. return DA7218_DMIC_CLK_3_0MHZ;
  2074. default:
  2075. dev_warn(codec->dev, "Invalid DMIC clock rate");
  2076. return DA7218_DMIC_CLK_3_0MHZ;
  2077. }
  2078. }
  2079. static enum da7218_hpldet_jack_rate
  2080. da7218_of_jack_rate(struct snd_soc_codec *codec, u32 val)
  2081. {
  2082. switch (val) {
  2083. case 5:
  2084. return DA7218_HPLDET_JACK_RATE_5US;
  2085. case 10:
  2086. return DA7218_HPLDET_JACK_RATE_10US;
  2087. case 20:
  2088. return DA7218_HPLDET_JACK_RATE_20US;
  2089. case 40:
  2090. return DA7218_HPLDET_JACK_RATE_40US;
  2091. case 80:
  2092. return DA7218_HPLDET_JACK_RATE_80US;
  2093. case 160:
  2094. return DA7218_HPLDET_JACK_RATE_160US;
  2095. case 320:
  2096. return DA7218_HPLDET_JACK_RATE_320US;
  2097. case 640:
  2098. return DA7218_HPLDET_JACK_RATE_640US;
  2099. default:
  2100. dev_warn(codec->dev, "Invalid jack detect rate");
  2101. return DA7218_HPLDET_JACK_RATE_40US;
  2102. }
  2103. }
  2104. static enum da7218_hpldet_jack_debounce
  2105. da7218_of_jack_debounce(struct snd_soc_codec *codec, u32 val)
  2106. {
  2107. switch (val) {
  2108. case 0:
  2109. return DA7218_HPLDET_JACK_DEBOUNCE_OFF;
  2110. case 2:
  2111. return DA7218_HPLDET_JACK_DEBOUNCE_2;
  2112. case 3:
  2113. return DA7218_HPLDET_JACK_DEBOUNCE_3;
  2114. case 4:
  2115. return DA7218_HPLDET_JACK_DEBOUNCE_4;
  2116. default:
  2117. dev_warn(codec->dev, "Invalid jack debounce");
  2118. return DA7218_HPLDET_JACK_DEBOUNCE_2;
  2119. }
  2120. }
  2121. static enum da7218_hpldet_jack_thr
  2122. da7218_of_jack_thr(struct snd_soc_codec *codec, u32 val)
  2123. {
  2124. switch (val) {
  2125. case 84:
  2126. return DA7218_HPLDET_JACK_THR_84PCT;
  2127. case 88:
  2128. return DA7218_HPLDET_JACK_THR_88PCT;
  2129. case 92:
  2130. return DA7218_HPLDET_JACK_THR_92PCT;
  2131. case 96:
  2132. return DA7218_HPLDET_JACK_THR_96PCT;
  2133. default:
  2134. dev_warn(codec->dev, "Invalid jack threshold level");
  2135. return DA7218_HPLDET_JACK_THR_84PCT;
  2136. }
  2137. }
  2138. static struct da7218_pdata *da7218_of_to_pdata(struct snd_soc_codec *codec)
  2139. {
  2140. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2141. struct device_node *np = codec->dev->of_node;
  2142. struct device_node *hpldet_np;
  2143. struct da7218_pdata *pdata;
  2144. struct da7218_hpldet_pdata *hpldet_pdata;
  2145. const char *of_str;
  2146. u32 of_val32;
  2147. pdata = devm_kzalloc(codec->dev, sizeof(*pdata), GFP_KERNEL);
  2148. if (!pdata) {
  2149. dev_warn(codec->dev, "Failed to allocate memory for pdata\n");
  2150. return NULL;
  2151. }
  2152. if (of_property_read_u32(np, "dlg,micbias1-lvl-millivolt", &of_val32) >= 0)
  2153. pdata->micbias1_lvl = da7218_of_micbias_lvl(codec, of_val32);
  2154. else
  2155. pdata->micbias1_lvl = DA7218_MICBIAS_1_6V;
  2156. if (of_property_read_u32(np, "dlg,micbias2-lvl-millivolt", &of_val32) >= 0)
  2157. pdata->micbias2_lvl = da7218_of_micbias_lvl(codec, of_val32);
  2158. else
  2159. pdata->micbias2_lvl = DA7218_MICBIAS_1_6V;
  2160. if (!of_property_read_string(np, "dlg,mic1-amp-in-sel", &of_str))
  2161. pdata->mic1_amp_in_sel =
  2162. da7218_of_mic_amp_in_sel(codec, of_str);
  2163. else
  2164. pdata->mic1_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF;
  2165. if (!of_property_read_string(np, "dlg,mic2-amp-in-sel", &of_str))
  2166. pdata->mic2_amp_in_sel =
  2167. da7218_of_mic_amp_in_sel(codec, of_str);
  2168. else
  2169. pdata->mic2_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF;
  2170. if (!of_property_read_string(np, "dlg,dmic1-data-sel", &of_str))
  2171. pdata->dmic1_data_sel = da7218_of_dmic_data_sel(codec, of_str);
  2172. else
  2173. pdata->dmic1_data_sel = DA7218_DMIC_DATA_LRISE_RFALL;
  2174. if (!of_property_read_string(np, "dlg,dmic1-samplephase", &of_str))
  2175. pdata->dmic1_samplephase =
  2176. da7218_of_dmic_samplephase(codec, of_str);
  2177. else
  2178. pdata->dmic1_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE;
  2179. if (of_property_read_u32(np, "dlg,dmic1-clkrate-hz", &of_val32) >= 0)
  2180. pdata->dmic1_clk_rate = da7218_of_dmic_clkrate(codec, of_val32);
  2181. else
  2182. pdata->dmic1_clk_rate = DA7218_DMIC_CLK_3_0MHZ;
  2183. if (!of_property_read_string(np, "dlg,dmic2-data-sel", &of_str))
  2184. pdata->dmic2_data_sel = da7218_of_dmic_data_sel(codec, of_str);
  2185. else
  2186. pdata->dmic2_data_sel = DA7218_DMIC_DATA_LRISE_RFALL;
  2187. if (!of_property_read_string(np, "dlg,dmic2-samplephase", &of_str))
  2188. pdata->dmic2_samplephase =
  2189. da7218_of_dmic_samplephase(codec, of_str);
  2190. else
  2191. pdata->dmic2_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE;
  2192. if (of_property_read_u32(np, "dlg,dmic2-clkrate-hz", &of_val32) >= 0)
  2193. pdata->dmic2_clk_rate = da7218_of_dmic_clkrate(codec, of_val32);
  2194. else
  2195. pdata->dmic2_clk_rate = DA7218_DMIC_CLK_3_0MHZ;
  2196. if (da7218->dev_id == DA7217_DEV_ID) {
  2197. if (of_property_read_bool(np, "dlg,hp-diff-single-supply"))
  2198. pdata->hp_diff_single_supply = true;
  2199. }
  2200. if (da7218->dev_id == DA7218_DEV_ID) {
  2201. hpldet_np = of_get_child_by_name(np, "da7218_hpldet");
  2202. if (!hpldet_np)
  2203. return pdata;
  2204. hpldet_pdata = devm_kzalloc(codec->dev, sizeof(*hpldet_pdata),
  2205. GFP_KERNEL);
  2206. if (!hpldet_pdata) {
  2207. dev_warn(codec->dev,
  2208. "Failed to allocate memory for hpldet pdata\n");
  2209. of_node_put(hpldet_np);
  2210. return pdata;
  2211. }
  2212. pdata->hpldet_pdata = hpldet_pdata;
  2213. if (of_property_read_u32(hpldet_np, "dlg,jack-rate-us",
  2214. &of_val32) >= 0)
  2215. hpldet_pdata->jack_rate =
  2216. da7218_of_jack_rate(codec, of_val32);
  2217. else
  2218. hpldet_pdata->jack_rate = DA7218_HPLDET_JACK_RATE_40US;
  2219. if (of_property_read_u32(hpldet_np, "dlg,jack-debounce",
  2220. &of_val32) >= 0)
  2221. hpldet_pdata->jack_debounce =
  2222. da7218_of_jack_debounce(codec, of_val32);
  2223. else
  2224. hpldet_pdata->jack_debounce =
  2225. DA7218_HPLDET_JACK_DEBOUNCE_2;
  2226. if (of_property_read_u32(hpldet_np, "dlg,jack-threshold-pct",
  2227. &of_val32) >= 0)
  2228. hpldet_pdata->jack_thr =
  2229. da7218_of_jack_thr(codec, of_val32);
  2230. else
  2231. hpldet_pdata->jack_thr = DA7218_HPLDET_JACK_THR_84PCT;
  2232. if (of_property_read_bool(hpldet_np, "dlg,comp-inv"))
  2233. hpldet_pdata->comp_inv = true;
  2234. if (of_property_read_bool(hpldet_np, "dlg,hyst"))
  2235. hpldet_pdata->hyst = true;
  2236. if (of_property_read_bool(hpldet_np, "dlg,discharge"))
  2237. hpldet_pdata->discharge = true;
  2238. of_node_put(hpldet_np);
  2239. }
  2240. return pdata;
  2241. }
  2242. /*
  2243. * Codec driver functions
  2244. */
  2245. static int da7218_set_bias_level(struct snd_soc_codec *codec,
  2246. enum snd_soc_bias_level level)
  2247. {
  2248. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2249. int ret;
  2250. switch (level) {
  2251. case SND_SOC_BIAS_ON:
  2252. break;
  2253. case SND_SOC_BIAS_PREPARE:
  2254. /* Enable MCLK for transition to ON state */
  2255. if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) {
  2256. if (da7218->mclk) {
  2257. ret = clk_prepare_enable(da7218->mclk);
  2258. if (ret) {
  2259. dev_err(codec->dev, "Failed to enable mclk\n");
  2260. return ret;
  2261. }
  2262. }
  2263. }
  2264. break;
  2265. case SND_SOC_BIAS_STANDBY:
  2266. if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
  2267. /* Master bias */
  2268. snd_soc_update_bits(codec, DA7218_REFERENCES,
  2269. DA7218_BIAS_EN_MASK,
  2270. DA7218_BIAS_EN_MASK);
  2271. /* Internal LDO */
  2272. snd_soc_update_bits(codec, DA7218_LDO_CTRL,
  2273. DA7218_LDO_EN_MASK,
  2274. DA7218_LDO_EN_MASK);
  2275. } else {
  2276. /* Remove MCLK */
  2277. if (da7218->mclk)
  2278. clk_disable_unprepare(da7218->mclk);
  2279. }
  2280. break;
  2281. case SND_SOC_BIAS_OFF:
  2282. /* Only disable if jack detection disabled */
  2283. if (!da7218->jack) {
  2284. /* Internal LDO */
  2285. snd_soc_update_bits(codec, DA7218_LDO_CTRL,
  2286. DA7218_LDO_EN_MASK, 0);
  2287. /* Master bias */
  2288. snd_soc_update_bits(codec, DA7218_REFERENCES,
  2289. DA7218_BIAS_EN_MASK, 0);
  2290. }
  2291. break;
  2292. }
  2293. return 0;
  2294. }
  2295. static const char *da7218_supply_names[DA7218_NUM_SUPPLIES] = {
  2296. [DA7218_SUPPLY_VDD] = "VDD",
  2297. [DA7218_SUPPLY_VDDMIC] = "VDDMIC",
  2298. [DA7218_SUPPLY_VDDIO] = "VDDIO",
  2299. };
  2300. static int da7218_handle_supplies(struct snd_soc_codec *codec)
  2301. {
  2302. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2303. struct regulator *vddio;
  2304. u8 io_voltage_lvl = DA7218_IO_VOLTAGE_LEVEL_2_5V_3_6V;
  2305. int i, ret;
  2306. /* Get required supplies */
  2307. for (i = 0; i < DA7218_NUM_SUPPLIES; ++i)
  2308. da7218->supplies[i].supply = da7218_supply_names[i];
  2309. ret = devm_regulator_bulk_get(codec->dev, DA7218_NUM_SUPPLIES,
  2310. da7218->supplies);
  2311. if (ret) {
  2312. dev_err(codec->dev, "Failed to get supplies\n");
  2313. return ret;
  2314. }
  2315. /* Determine VDDIO voltage provided */
  2316. vddio = da7218->supplies[DA7218_SUPPLY_VDDIO].consumer;
  2317. ret = regulator_get_voltage(vddio);
  2318. if (ret < 1500000)
  2319. dev_warn(codec->dev, "Invalid VDDIO voltage\n");
  2320. else if (ret < 2500000)
  2321. io_voltage_lvl = DA7218_IO_VOLTAGE_LEVEL_1_5V_2_5V;
  2322. /* Enable main supplies */
  2323. ret = regulator_bulk_enable(DA7218_NUM_SUPPLIES, da7218->supplies);
  2324. if (ret) {
  2325. dev_err(codec->dev, "Failed to enable supplies\n");
  2326. return ret;
  2327. }
  2328. /* Ensure device in active mode */
  2329. snd_soc_write(codec, DA7218_SYSTEM_ACTIVE, DA7218_SYSTEM_ACTIVE_MASK);
  2330. /* Update IO voltage level range */
  2331. snd_soc_write(codec, DA7218_IO_CTRL, io_voltage_lvl);
  2332. return 0;
  2333. }
  2334. static void da7218_handle_pdata(struct snd_soc_codec *codec)
  2335. {
  2336. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2337. struct da7218_pdata *pdata = da7218->pdata;
  2338. if (pdata) {
  2339. u8 micbias_lvl = 0, dmic_cfg = 0;
  2340. /* Mic Bias voltages */
  2341. switch (pdata->micbias1_lvl) {
  2342. case DA7218_MICBIAS_1_2V:
  2343. micbias_lvl |= DA7218_MICBIAS_1_LP_MODE_MASK;
  2344. break;
  2345. case DA7218_MICBIAS_1_6V:
  2346. case DA7218_MICBIAS_1_8V:
  2347. case DA7218_MICBIAS_2_0V:
  2348. case DA7218_MICBIAS_2_2V:
  2349. case DA7218_MICBIAS_2_4V:
  2350. case DA7218_MICBIAS_2_6V:
  2351. case DA7218_MICBIAS_2_8V:
  2352. case DA7218_MICBIAS_3_0V:
  2353. micbias_lvl |= (pdata->micbias1_lvl <<
  2354. DA7218_MICBIAS_1_LEVEL_SHIFT);
  2355. break;
  2356. }
  2357. switch (pdata->micbias2_lvl) {
  2358. case DA7218_MICBIAS_1_2V:
  2359. micbias_lvl |= DA7218_MICBIAS_2_LP_MODE_MASK;
  2360. break;
  2361. case DA7218_MICBIAS_1_6V:
  2362. case DA7218_MICBIAS_1_8V:
  2363. case DA7218_MICBIAS_2_0V:
  2364. case DA7218_MICBIAS_2_2V:
  2365. case DA7218_MICBIAS_2_4V:
  2366. case DA7218_MICBIAS_2_6V:
  2367. case DA7218_MICBIAS_2_8V:
  2368. case DA7218_MICBIAS_3_0V:
  2369. micbias_lvl |= (pdata->micbias2_lvl <<
  2370. DA7218_MICBIAS_2_LEVEL_SHIFT);
  2371. break;
  2372. }
  2373. snd_soc_write(codec, DA7218_MICBIAS_CTRL, micbias_lvl);
  2374. /* Mic */
  2375. switch (pdata->mic1_amp_in_sel) {
  2376. case DA7218_MIC_AMP_IN_SEL_DIFF:
  2377. case DA7218_MIC_AMP_IN_SEL_SE_P:
  2378. case DA7218_MIC_AMP_IN_SEL_SE_N:
  2379. snd_soc_write(codec, DA7218_MIC_1_SELECT,
  2380. pdata->mic1_amp_in_sel);
  2381. break;
  2382. }
  2383. switch (pdata->mic2_amp_in_sel) {
  2384. case DA7218_MIC_AMP_IN_SEL_DIFF:
  2385. case DA7218_MIC_AMP_IN_SEL_SE_P:
  2386. case DA7218_MIC_AMP_IN_SEL_SE_N:
  2387. snd_soc_write(codec, DA7218_MIC_2_SELECT,
  2388. pdata->mic2_amp_in_sel);
  2389. break;
  2390. }
  2391. /* DMic */
  2392. switch (pdata->dmic1_data_sel) {
  2393. case DA7218_DMIC_DATA_LFALL_RRISE:
  2394. case DA7218_DMIC_DATA_LRISE_RFALL:
  2395. dmic_cfg |= (pdata->dmic1_data_sel <<
  2396. DA7218_DMIC_1_DATA_SEL_SHIFT);
  2397. break;
  2398. }
  2399. switch (pdata->dmic1_samplephase) {
  2400. case DA7218_DMIC_SAMPLE_ON_CLKEDGE:
  2401. case DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE:
  2402. dmic_cfg |= (pdata->dmic1_samplephase <<
  2403. DA7218_DMIC_1_SAMPLEPHASE_SHIFT);
  2404. break;
  2405. }
  2406. switch (pdata->dmic1_clk_rate) {
  2407. case DA7218_DMIC_CLK_3_0MHZ:
  2408. case DA7218_DMIC_CLK_1_5MHZ:
  2409. dmic_cfg |= (pdata->dmic1_clk_rate <<
  2410. DA7218_DMIC_1_CLK_RATE_SHIFT);
  2411. break;
  2412. }
  2413. snd_soc_update_bits(codec, DA7218_DMIC_1_CTRL,
  2414. DA7218_DMIC_1_DATA_SEL_MASK |
  2415. DA7218_DMIC_1_SAMPLEPHASE_MASK |
  2416. DA7218_DMIC_1_CLK_RATE_MASK, dmic_cfg);
  2417. dmic_cfg = 0;
  2418. switch (pdata->dmic2_data_sel) {
  2419. case DA7218_DMIC_DATA_LFALL_RRISE:
  2420. case DA7218_DMIC_DATA_LRISE_RFALL:
  2421. dmic_cfg |= (pdata->dmic2_data_sel <<
  2422. DA7218_DMIC_2_DATA_SEL_SHIFT);
  2423. break;
  2424. }
  2425. switch (pdata->dmic2_samplephase) {
  2426. case DA7218_DMIC_SAMPLE_ON_CLKEDGE:
  2427. case DA7218_DMIC_SAMPLE_BETWEEN_CLKEDGE:
  2428. dmic_cfg |= (pdata->dmic2_samplephase <<
  2429. DA7218_DMIC_2_SAMPLEPHASE_SHIFT);
  2430. break;
  2431. }
  2432. switch (pdata->dmic2_clk_rate) {
  2433. case DA7218_DMIC_CLK_3_0MHZ:
  2434. case DA7218_DMIC_CLK_1_5MHZ:
  2435. dmic_cfg |= (pdata->dmic2_clk_rate <<
  2436. DA7218_DMIC_2_CLK_RATE_SHIFT);
  2437. break;
  2438. }
  2439. snd_soc_update_bits(codec, DA7218_DMIC_2_CTRL,
  2440. DA7218_DMIC_2_DATA_SEL_MASK |
  2441. DA7218_DMIC_2_SAMPLEPHASE_MASK |
  2442. DA7218_DMIC_2_CLK_RATE_MASK, dmic_cfg);
  2443. /* DA7217 Specific */
  2444. if (da7218->dev_id == DA7217_DEV_ID) {
  2445. da7218->hp_single_supply =
  2446. pdata->hp_diff_single_supply;
  2447. if (da7218->hp_single_supply) {
  2448. snd_soc_write(codec, DA7218_HP_DIFF_UNLOCK,
  2449. DA7218_HP_DIFF_UNLOCK_VAL);
  2450. snd_soc_update_bits(codec, DA7218_HP_DIFF_CTRL,
  2451. DA7218_HP_AMP_SINGLE_SUPPLY_EN_MASK,
  2452. DA7218_HP_AMP_SINGLE_SUPPLY_EN_MASK);
  2453. }
  2454. }
  2455. /* DA7218 Specific */
  2456. if ((da7218->dev_id == DA7218_DEV_ID) &&
  2457. (pdata->hpldet_pdata)) {
  2458. struct da7218_hpldet_pdata *hpldet_pdata =
  2459. pdata->hpldet_pdata;
  2460. u8 hpldet_cfg = 0;
  2461. switch (hpldet_pdata->jack_rate) {
  2462. case DA7218_HPLDET_JACK_RATE_5US:
  2463. case DA7218_HPLDET_JACK_RATE_10US:
  2464. case DA7218_HPLDET_JACK_RATE_20US:
  2465. case DA7218_HPLDET_JACK_RATE_40US:
  2466. case DA7218_HPLDET_JACK_RATE_80US:
  2467. case DA7218_HPLDET_JACK_RATE_160US:
  2468. case DA7218_HPLDET_JACK_RATE_320US:
  2469. case DA7218_HPLDET_JACK_RATE_640US:
  2470. hpldet_cfg |=
  2471. (hpldet_pdata->jack_rate <<
  2472. DA7218_HPLDET_JACK_RATE_SHIFT);
  2473. break;
  2474. }
  2475. switch (hpldet_pdata->jack_debounce) {
  2476. case DA7218_HPLDET_JACK_DEBOUNCE_OFF:
  2477. case DA7218_HPLDET_JACK_DEBOUNCE_2:
  2478. case DA7218_HPLDET_JACK_DEBOUNCE_3:
  2479. case DA7218_HPLDET_JACK_DEBOUNCE_4:
  2480. hpldet_cfg |=
  2481. (hpldet_pdata->jack_debounce <<
  2482. DA7218_HPLDET_JACK_DEBOUNCE_SHIFT);
  2483. break;
  2484. }
  2485. switch (hpldet_pdata->jack_thr) {
  2486. case DA7218_HPLDET_JACK_THR_84PCT:
  2487. case DA7218_HPLDET_JACK_THR_88PCT:
  2488. case DA7218_HPLDET_JACK_THR_92PCT:
  2489. case DA7218_HPLDET_JACK_THR_96PCT:
  2490. hpldet_cfg |=
  2491. (hpldet_pdata->jack_thr <<
  2492. DA7218_HPLDET_JACK_THR_SHIFT);
  2493. break;
  2494. }
  2495. snd_soc_update_bits(codec, DA7218_HPLDET_JACK,
  2496. DA7218_HPLDET_JACK_RATE_MASK |
  2497. DA7218_HPLDET_JACK_DEBOUNCE_MASK |
  2498. DA7218_HPLDET_JACK_THR_MASK,
  2499. hpldet_cfg);
  2500. hpldet_cfg = 0;
  2501. if (hpldet_pdata->comp_inv)
  2502. hpldet_cfg |= DA7218_HPLDET_COMP_INV_MASK;
  2503. if (hpldet_pdata->hyst)
  2504. hpldet_cfg |= DA7218_HPLDET_HYST_EN_MASK;
  2505. if (hpldet_pdata->discharge)
  2506. hpldet_cfg |= DA7218_HPLDET_DISCHARGE_EN_MASK;
  2507. snd_soc_write(codec, DA7218_HPLDET_CTRL, hpldet_cfg);
  2508. }
  2509. }
  2510. }
  2511. static int da7218_probe(struct snd_soc_codec *codec)
  2512. {
  2513. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2514. int ret;
  2515. /* Regulator configuration */
  2516. ret = da7218_handle_supplies(codec);
  2517. if (ret)
  2518. return ret;
  2519. /* Handle DT/Platform data */
  2520. if (codec->dev->of_node)
  2521. da7218->pdata = da7218_of_to_pdata(codec);
  2522. else
  2523. da7218->pdata = dev_get_platdata(codec->dev);
  2524. da7218_handle_pdata(codec);
  2525. /* Check if MCLK provided, if not the clock is NULL */
  2526. da7218->mclk = devm_clk_get(codec->dev, "mclk");
  2527. if (IS_ERR(da7218->mclk)) {
  2528. if (PTR_ERR(da7218->mclk) != -ENOENT) {
  2529. ret = PTR_ERR(da7218->mclk);
  2530. goto err_disable_reg;
  2531. } else {
  2532. da7218->mclk = NULL;
  2533. }
  2534. }
  2535. /* Default PC to free-running */
  2536. snd_soc_write(codec, DA7218_PC_COUNT, DA7218_PC_FREERUN_MASK);
  2537. /*
  2538. * Default Output Filter mixers to off otherwise DAPM will power
  2539. * Mic to HP passthrough paths by default at startup.
  2540. */
  2541. snd_soc_write(codec, DA7218_DROUTING_OUTFILT_1L, 0);
  2542. snd_soc_write(codec, DA7218_DROUTING_OUTFILT_1R, 0);
  2543. /* Default CP to normal load, power mode */
  2544. snd_soc_update_bits(codec, DA7218_CP_CTRL,
  2545. DA7218_CP_SMALL_SWITCH_FREQ_EN_MASK, 0);
  2546. /* Default gain ramping */
  2547. snd_soc_update_bits(codec, DA7218_MIXIN_1_CTRL,
  2548. DA7218_MIXIN_1_AMP_RAMP_EN_MASK,
  2549. DA7218_MIXIN_1_AMP_RAMP_EN_MASK);
  2550. snd_soc_update_bits(codec, DA7218_MIXIN_2_CTRL,
  2551. DA7218_MIXIN_2_AMP_RAMP_EN_MASK,
  2552. DA7218_MIXIN_2_AMP_RAMP_EN_MASK);
  2553. snd_soc_update_bits(codec, DA7218_IN_1L_FILTER_CTRL,
  2554. DA7218_IN_1L_RAMP_EN_MASK,
  2555. DA7218_IN_1L_RAMP_EN_MASK);
  2556. snd_soc_update_bits(codec, DA7218_IN_1R_FILTER_CTRL,
  2557. DA7218_IN_1R_RAMP_EN_MASK,
  2558. DA7218_IN_1R_RAMP_EN_MASK);
  2559. snd_soc_update_bits(codec, DA7218_IN_2L_FILTER_CTRL,
  2560. DA7218_IN_2L_RAMP_EN_MASK,
  2561. DA7218_IN_2L_RAMP_EN_MASK);
  2562. snd_soc_update_bits(codec, DA7218_IN_2R_FILTER_CTRL,
  2563. DA7218_IN_2R_RAMP_EN_MASK,
  2564. DA7218_IN_2R_RAMP_EN_MASK);
  2565. snd_soc_update_bits(codec, DA7218_DGS_GAIN_CTRL,
  2566. DA7218_DGS_RAMP_EN_MASK, DA7218_DGS_RAMP_EN_MASK);
  2567. snd_soc_update_bits(codec, DA7218_OUT_1L_FILTER_CTRL,
  2568. DA7218_OUT_1L_RAMP_EN_MASK,
  2569. DA7218_OUT_1L_RAMP_EN_MASK);
  2570. snd_soc_update_bits(codec, DA7218_OUT_1R_FILTER_CTRL,
  2571. DA7218_OUT_1R_RAMP_EN_MASK,
  2572. DA7218_OUT_1R_RAMP_EN_MASK);
  2573. snd_soc_update_bits(codec, DA7218_HP_L_CTRL,
  2574. DA7218_HP_L_AMP_RAMP_EN_MASK,
  2575. DA7218_HP_L_AMP_RAMP_EN_MASK);
  2576. snd_soc_update_bits(codec, DA7218_HP_R_CTRL,
  2577. DA7218_HP_R_AMP_RAMP_EN_MASK,
  2578. DA7218_HP_R_AMP_RAMP_EN_MASK);
  2579. /* Default infinite tone gen, start/stop by Kcontrol */
  2580. snd_soc_write(codec, DA7218_TONE_GEN_CYCLES, DA7218_BEEP_CYCLES_MASK);
  2581. /* DA7217 specific config */
  2582. if (da7218->dev_id == DA7217_DEV_ID) {
  2583. snd_soc_update_bits(codec, DA7218_HP_DIFF_CTRL,
  2584. DA7218_HP_AMP_DIFF_MODE_EN_MASK,
  2585. DA7218_HP_AMP_DIFF_MODE_EN_MASK);
  2586. /* Only DA7218 supports HP detect, mask off for DA7217 */
  2587. snd_soc_write(codec, DA7218_EVENT_MASK,
  2588. DA7218_HPLDET_JACK_EVENT_IRQ_MSK_MASK);
  2589. }
  2590. if (da7218->irq) {
  2591. ret = devm_request_threaded_irq(codec->dev, da7218->irq, NULL,
  2592. da7218_irq_thread,
  2593. IRQF_TRIGGER_LOW | IRQF_ONESHOT,
  2594. "da7218", codec);
  2595. if (ret != 0) {
  2596. dev_err(codec->dev, "Failed to request IRQ %d: %d\n",
  2597. da7218->irq, ret);
  2598. goto err_disable_reg;
  2599. }
  2600. }
  2601. return 0;
  2602. err_disable_reg:
  2603. regulator_bulk_disable(DA7218_NUM_SUPPLIES, da7218->supplies);
  2604. return ret;
  2605. }
  2606. static int da7218_remove(struct snd_soc_codec *codec)
  2607. {
  2608. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2609. regulator_bulk_disable(DA7218_NUM_SUPPLIES, da7218->supplies);
  2610. return 0;
  2611. }
  2612. #ifdef CONFIG_PM
  2613. static int da7218_suspend(struct snd_soc_codec *codec)
  2614. {
  2615. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2616. da7218_set_bias_level(codec, SND_SOC_BIAS_OFF);
  2617. /* Put device into standby mode if jack detection disabled */
  2618. if (!da7218->jack)
  2619. snd_soc_write(codec, DA7218_SYSTEM_ACTIVE, 0);
  2620. return 0;
  2621. }
  2622. static int da7218_resume(struct snd_soc_codec *codec)
  2623. {
  2624. struct da7218_priv *da7218 = snd_soc_codec_get_drvdata(codec);
  2625. /* Put device into active mode if previously moved to standby */
  2626. if (!da7218->jack)
  2627. snd_soc_write(codec, DA7218_SYSTEM_ACTIVE,
  2628. DA7218_SYSTEM_ACTIVE_MASK);
  2629. da7218_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
  2630. return 0;
  2631. }
  2632. #else
  2633. #define da7218_suspend NULL
  2634. #define da7218_resume NULL
  2635. #endif
  2636. static struct snd_soc_codec_driver soc_codec_dev_da7218 = {
  2637. .probe = da7218_probe,
  2638. .remove = da7218_remove,
  2639. .suspend = da7218_suspend,
  2640. .resume = da7218_resume,
  2641. .set_bias_level = da7218_set_bias_level,
  2642. .component_driver = {
  2643. .controls = da7218_snd_controls,
  2644. .num_controls = ARRAY_SIZE(da7218_snd_controls),
  2645. .dapm_widgets = da7218_dapm_widgets,
  2646. .num_dapm_widgets = ARRAY_SIZE(da7218_dapm_widgets),
  2647. .dapm_routes = da7218_audio_map,
  2648. .num_dapm_routes = ARRAY_SIZE(da7218_audio_map),
  2649. },
  2650. };
  2651. /*
  2652. * Regmap configs
  2653. */
  2654. static struct reg_default da7218_reg_defaults[] = {
  2655. { DA7218_SYSTEM_ACTIVE, 0x00 },
  2656. { DA7218_CIF_CTRL, 0x00 },
  2657. { DA7218_SPARE1, 0x00 },
  2658. { DA7218_SR, 0xAA },
  2659. { DA7218_PC_COUNT, 0x02 },
  2660. { DA7218_GAIN_RAMP_CTRL, 0x00 },
  2661. { DA7218_CIF_TIMEOUT_CTRL, 0x01 },
  2662. { DA7218_SYSTEM_MODES_INPUT, 0x00 },
  2663. { DA7218_SYSTEM_MODES_OUTPUT, 0x00 },
  2664. { DA7218_IN_1L_FILTER_CTRL, 0x00 },
  2665. { DA7218_IN_1R_FILTER_CTRL, 0x00 },
  2666. { DA7218_IN_2L_FILTER_CTRL, 0x00 },
  2667. { DA7218_IN_2R_FILTER_CTRL, 0x00 },
  2668. { DA7218_OUT_1L_FILTER_CTRL, 0x40 },
  2669. { DA7218_OUT_1R_FILTER_CTRL, 0x40 },
  2670. { DA7218_OUT_1_HPF_FILTER_CTRL, 0x80 },
  2671. { DA7218_OUT_1_EQ_12_FILTER_CTRL, 0x77 },
  2672. { DA7218_OUT_1_EQ_34_FILTER_CTRL, 0x77 },
  2673. { DA7218_OUT_1_EQ_5_FILTER_CTRL, 0x07 },
  2674. { DA7218_OUT_1_BIQ_5STAGE_CTRL, 0x40 },
  2675. { DA7218_OUT_1_BIQ_5STAGE_DATA, 0x00 },
  2676. { DA7218_OUT_1_BIQ_5STAGE_ADDR, 0x00 },
  2677. { DA7218_MIXIN_1_CTRL, 0x48 },
  2678. { DA7218_MIXIN_1_GAIN, 0x03 },
  2679. { DA7218_MIXIN_2_CTRL, 0x48 },
  2680. { DA7218_MIXIN_2_GAIN, 0x03 },
  2681. { DA7218_ALC_CTRL1, 0x00 },
  2682. { DA7218_ALC_CTRL2, 0x00 },
  2683. { DA7218_ALC_CTRL3, 0x00 },
  2684. { DA7218_ALC_NOISE, 0x3F },
  2685. { DA7218_ALC_TARGET_MIN, 0x3F },
  2686. { DA7218_ALC_TARGET_MAX, 0x00 },
  2687. { DA7218_ALC_GAIN_LIMITS, 0xFF },
  2688. { DA7218_ALC_ANA_GAIN_LIMITS, 0x71 },
  2689. { DA7218_ALC_ANTICLIP_CTRL, 0x00 },
  2690. { DA7218_AGS_ENABLE, 0x00 },
  2691. { DA7218_AGS_TRIGGER, 0x09 },
  2692. { DA7218_AGS_ATT_MAX, 0x00 },
  2693. { DA7218_AGS_TIMEOUT, 0x00 },
  2694. { DA7218_AGS_ANTICLIP_CTRL, 0x00 },
  2695. { DA7218_ENV_TRACK_CTRL, 0x00 },
  2696. { DA7218_LVL_DET_CTRL, 0x00 },
  2697. { DA7218_LVL_DET_LEVEL, 0x7F },
  2698. { DA7218_DGS_TRIGGER, 0x24 },
  2699. { DA7218_DGS_ENABLE, 0x00 },
  2700. { DA7218_DGS_RISE_FALL, 0x50 },
  2701. { DA7218_DGS_SYNC_DELAY, 0xA3 },
  2702. { DA7218_DGS_SYNC_DELAY2, 0x31 },
  2703. { DA7218_DGS_SYNC_DELAY3, 0x11 },
  2704. { DA7218_DGS_LEVELS, 0x01 },
  2705. { DA7218_DGS_GAIN_CTRL, 0x74 },
  2706. { DA7218_DROUTING_OUTDAI_1L, 0x01 },
  2707. { DA7218_DMIX_OUTDAI_1L_INFILT_1L_GAIN, 0x1C },
  2708. { DA7218_DMIX_OUTDAI_1L_INFILT_1R_GAIN, 0x1C },
  2709. { DA7218_DMIX_OUTDAI_1L_INFILT_2L_GAIN, 0x1C },
  2710. { DA7218_DMIX_OUTDAI_1L_INFILT_2R_GAIN, 0x1C },
  2711. { DA7218_DMIX_OUTDAI_1L_TONEGEN_GAIN, 0x1C },
  2712. { DA7218_DMIX_OUTDAI_1L_INDAI_1L_GAIN, 0x1C },
  2713. { DA7218_DMIX_OUTDAI_1L_INDAI_1R_GAIN, 0x1C },
  2714. { DA7218_DROUTING_OUTDAI_1R, 0x04 },
  2715. { DA7218_DMIX_OUTDAI_1R_INFILT_1L_GAIN, 0x1C },
  2716. { DA7218_DMIX_OUTDAI_1R_INFILT_1R_GAIN, 0x1C },
  2717. { DA7218_DMIX_OUTDAI_1R_INFILT_2L_GAIN, 0x1C },
  2718. { DA7218_DMIX_OUTDAI_1R_INFILT_2R_GAIN, 0x1C },
  2719. { DA7218_DMIX_OUTDAI_1R_TONEGEN_GAIN, 0x1C },
  2720. { DA7218_DMIX_OUTDAI_1R_INDAI_1L_GAIN, 0x1C },
  2721. { DA7218_DMIX_OUTDAI_1R_INDAI_1R_GAIN, 0x1C },
  2722. { DA7218_DROUTING_OUTFILT_1L, 0x01 },
  2723. { DA7218_DMIX_OUTFILT_1L_INFILT_1L_GAIN, 0x1C },
  2724. { DA7218_DMIX_OUTFILT_1L_INFILT_1R_GAIN, 0x1C },
  2725. { DA7218_DMIX_OUTFILT_1L_INFILT_2L_GAIN, 0x1C },
  2726. { DA7218_DMIX_OUTFILT_1L_INFILT_2R_GAIN, 0x1C },
  2727. { DA7218_DMIX_OUTFILT_1L_TONEGEN_GAIN, 0x1C },
  2728. { DA7218_DMIX_OUTFILT_1L_INDAI_1L_GAIN, 0x1C },
  2729. { DA7218_DMIX_OUTFILT_1L_INDAI_1R_GAIN, 0x1C },
  2730. { DA7218_DROUTING_OUTFILT_1R, 0x04 },
  2731. { DA7218_DMIX_OUTFILT_1R_INFILT_1L_GAIN, 0x1C },
  2732. { DA7218_DMIX_OUTFILT_1R_INFILT_1R_GAIN, 0x1C },
  2733. { DA7218_DMIX_OUTFILT_1R_INFILT_2L_GAIN, 0x1C },
  2734. { DA7218_DMIX_OUTFILT_1R_INFILT_2R_GAIN, 0x1C },
  2735. { DA7218_DMIX_OUTFILT_1R_TONEGEN_GAIN, 0x1C },
  2736. { DA7218_DMIX_OUTFILT_1R_INDAI_1L_GAIN, 0x1C },
  2737. { DA7218_DMIX_OUTFILT_1R_INDAI_1R_GAIN, 0x1C },
  2738. { DA7218_DROUTING_OUTDAI_2L, 0x04 },
  2739. { DA7218_DMIX_OUTDAI_2L_INFILT_1L_GAIN, 0x1C },
  2740. { DA7218_DMIX_OUTDAI_2L_INFILT_1R_GAIN, 0x1C },
  2741. { DA7218_DMIX_OUTDAI_2L_INFILT_2L_GAIN, 0x1C },
  2742. { DA7218_DMIX_OUTDAI_2L_INFILT_2R_GAIN, 0x1C },
  2743. { DA7218_DMIX_OUTDAI_2L_TONEGEN_GAIN, 0x1C },
  2744. { DA7218_DMIX_OUTDAI_2L_INDAI_1L_GAIN, 0x1C },
  2745. { DA7218_DMIX_OUTDAI_2L_INDAI_1R_GAIN, 0x1C },
  2746. { DA7218_DROUTING_OUTDAI_2R, 0x08 },
  2747. { DA7218_DMIX_OUTDAI_2R_INFILT_1L_GAIN, 0x1C },
  2748. { DA7218_DMIX_OUTDAI_2R_INFILT_1R_GAIN, 0x1C },
  2749. { DA7218_DMIX_OUTDAI_2R_INFILT_2L_GAIN, 0x1C },
  2750. { DA7218_DMIX_OUTDAI_2R_INFILT_2R_GAIN, 0x1C },
  2751. { DA7218_DMIX_OUTDAI_2R_TONEGEN_GAIN, 0x1C },
  2752. { DA7218_DMIX_OUTDAI_2R_INDAI_1L_GAIN, 0x1C },
  2753. { DA7218_DMIX_OUTDAI_2R_INDAI_1R_GAIN, 0x1C },
  2754. { DA7218_DAI_CTRL, 0x28 },
  2755. { DA7218_DAI_TDM_CTRL, 0x40 },
  2756. { DA7218_DAI_OFFSET_LOWER, 0x00 },
  2757. { DA7218_DAI_OFFSET_UPPER, 0x00 },
  2758. { DA7218_DAI_CLK_MODE, 0x01 },
  2759. { DA7218_PLL_CTRL, 0x04 },
  2760. { DA7218_PLL_FRAC_TOP, 0x00 },
  2761. { DA7218_PLL_FRAC_BOT, 0x00 },
  2762. { DA7218_PLL_INTEGER, 0x20 },
  2763. { DA7218_DAC_NG_CTRL, 0x00 },
  2764. { DA7218_DAC_NG_SETUP_TIME, 0x00 },
  2765. { DA7218_DAC_NG_OFF_THRESH, 0x00 },
  2766. { DA7218_DAC_NG_ON_THRESH, 0x00 },
  2767. { DA7218_TONE_GEN_CFG2, 0x00 },
  2768. { DA7218_TONE_GEN_FREQ1_L, 0x55 },
  2769. { DA7218_TONE_GEN_FREQ1_U, 0x15 },
  2770. { DA7218_TONE_GEN_FREQ2_L, 0x00 },
  2771. { DA7218_TONE_GEN_FREQ2_U, 0x40 },
  2772. { DA7218_TONE_GEN_CYCLES, 0x00 },
  2773. { DA7218_TONE_GEN_ON_PER, 0x02 },
  2774. { DA7218_TONE_GEN_OFF_PER, 0x01 },
  2775. { DA7218_CP_CTRL, 0x60 },
  2776. { DA7218_CP_DELAY, 0x11 },
  2777. { DA7218_CP_VOL_THRESHOLD1, 0x0E },
  2778. { DA7218_MIC_1_CTRL, 0x40 },
  2779. { DA7218_MIC_1_GAIN, 0x01 },
  2780. { DA7218_MIC_1_SELECT, 0x00 },
  2781. { DA7218_MIC_2_CTRL, 0x40 },
  2782. { DA7218_MIC_2_GAIN, 0x01 },
  2783. { DA7218_MIC_2_SELECT, 0x00 },
  2784. { DA7218_IN_1_HPF_FILTER_CTRL, 0x80 },
  2785. { DA7218_IN_2_HPF_FILTER_CTRL, 0x80 },
  2786. { DA7218_ADC_1_CTRL, 0x07 },
  2787. { DA7218_ADC_2_CTRL, 0x07 },
  2788. { DA7218_MIXOUT_L_CTRL, 0x00 },
  2789. { DA7218_MIXOUT_L_GAIN, 0x03 },
  2790. { DA7218_MIXOUT_R_CTRL, 0x00 },
  2791. { DA7218_MIXOUT_R_GAIN, 0x03 },
  2792. { DA7218_HP_L_CTRL, 0x40 },
  2793. { DA7218_HP_L_GAIN, 0x3B },
  2794. { DA7218_HP_R_CTRL, 0x40 },
  2795. { DA7218_HP_R_GAIN, 0x3B },
  2796. { DA7218_HP_DIFF_CTRL, 0x00 },
  2797. { DA7218_HP_DIFF_UNLOCK, 0xC3 },
  2798. { DA7218_HPLDET_JACK, 0x0B },
  2799. { DA7218_HPLDET_CTRL, 0x00 },
  2800. { DA7218_REFERENCES, 0x08 },
  2801. { DA7218_IO_CTRL, 0x00 },
  2802. { DA7218_LDO_CTRL, 0x00 },
  2803. { DA7218_SIDETONE_CTRL, 0x40 },
  2804. { DA7218_SIDETONE_IN_SELECT, 0x00 },
  2805. { DA7218_SIDETONE_GAIN, 0x1C },
  2806. { DA7218_DROUTING_ST_OUTFILT_1L, 0x01 },
  2807. { DA7218_DROUTING_ST_OUTFILT_1R, 0x02 },
  2808. { DA7218_SIDETONE_BIQ_3STAGE_DATA, 0x00 },
  2809. { DA7218_SIDETONE_BIQ_3STAGE_ADDR, 0x00 },
  2810. { DA7218_EVENT_MASK, 0x00 },
  2811. { DA7218_DMIC_1_CTRL, 0x00 },
  2812. { DA7218_DMIC_2_CTRL, 0x00 },
  2813. { DA7218_IN_1L_GAIN, 0x6F },
  2814. { DA7218_IN_1R_GAIN, 0x6F },
  2815. { DA7218_IN_2L_GAIN, 0x6F },
  2816. { DA7218_IN_2R_GAIN, 0x6F },
  2817. { DA7218_OUT_1L_GAIN, 0x6F },
  2818. { DA7218_OUT_1R_GAIN, 0x6F },
  2819. { DA7218_MICBIAS_CTRL, 0x00 },
  2820. { DA7218_MICBIAS_EN, 0x00 },
  2821. };
  2822. static bool da7218_volatile_register(struct device *dev, unsigned int reg)
  2823. {
  2824. switch (reg) {
  2825. case DA7218_STATUS1:
  2826. case DA7218_SOFT_RESET:
  2827. case DA7218_SYSTEM_STATUS:
  2828. case DA7218_CALIB_CTRL:
  2829. case DA7218_CALIB_OFFSET_AUTO_M_1:
  2830. case DA7218_CALIB_OFFSET_AUTO_U_1:
  2831. case DA7218_CALIB_OFFSET_AUTO_M_2:
  2832. case DA7218_CALIB_OFFSET_AUTO_U_2:
  2833. case DA7218_PLL_STATUS:
  2834. case DA7218_PLL_REFOSC_CAL:
  2835. case DA7218_TONE_GEN_CFG1:
  2836. case DA7218_ADC_MODE:
  2837. case DA7218_HP_SNGL_CTRL:
  2838. case DA7218_HPLDET_TEST:
  2839. case DA7218_EVENT_STATUS:
  2840. case DA7218_EVENT:
  2841. return true;
  2842. default:
  2843. return false;
  2844. }
  2845. }
  2846. static const struct regmap_config da7218_regmap_config = {
  2847. .reg_bits = 8,
  2848. .val_bits = 8,
  2849. .max_register = DA7218_MICBIAS_EN,
  2850. .reg_defaults = da7218_reg_defaults,
  2851. .num_reg_defaults = ARRAY_SIZE(da7218_reg_defaults),
  2852. .volatile_reg = da7218_volatile_register,
  2853. .cache_type = REGCACHE_RBTREE,
  2854. };
  2855. /*
  2856. * I2C layer
  2857. */
  2858. static int da7218_i2c_probe(struct i2c_client *i2c,
  2859. const struct i2c_device_id *id)
  2860. {
  2861. struct da7218_priv *da7218;
  2862. int ret;
  2863. da7218 = devm_kzalloc(&i2c->dev, sizeof(struct da7218_priv),
  2864. GFP_KERNEL);
  2865. if (!da7218)
  2866. return -ENOMEM;
  2867. i2c_set_clientdata(i2c, da7218);
  2868. if (i2c->dev.of_node)
  2869. da7218->dev_id = da7218_of_get_id(&i2c->dev);
  2870. else
  2871. da7218->dev_id = id->driver_data;
  2872. if ((da7218->dev_id != DA7217_DEV_ID) &&
  2873. (da7218->dev_id != DA7218_DEV_ID)) {
  2874. dev_err(&i2c->dev, "Invalid device Id\n");
  2875. return -EINVAL;
  2876. }
  2877. da7218->irq = i2c->irq;
  2878. da7218->regmap = devm_regmap_init_i2c(i2c, &da7218_regmap_config);
  2879. if (IS_ERR(da7218->regmap)) {
  2880. ret = PTR_ERR(da7218->regmap);
  2881. dev_err(&i2c->dev, "regmap_init() failed: %d\n", ret);
  2882. return ret;
  2883. }
  2884. ret = snd_soc_register_codec(&i2c->dev,
  2885. &soc_codec_dev_da7218, &da7218_dai, 1);
  2886. if (ret < 0) {
  2887. dev_err(&i2c->dev, "Failed to register da7218 codec: %d\n",
  2888. ret);
  2889. }
  2890. return ret;
  2891. }
  2892. static int da7218_i2c_remove(struct i2c_client *client)
  2893. {
  2894. snd_soc_unregister_codec(&client->dev);
  2895. return 0;
  2896. }
  2897. static const struct i2c_device_id da7218_i2c_id[] = {
  2898. { "da7217", DA7217_DEV_ID },
  2899. { "da7218", DA7218_DEV_ID },
  2900. { }
  2901. };
  2902. MODULE_DEVICE_TABLE(i2c, da7218_i2c_id);
  2903. static struct i2c_driver da7218_i2c_driver = {
  2904. .driver = {
  2905. .name = "da7218",
  2906. .of_match_table = of_match_ptr(da7218_of_match),
  2907. },
  2908. .probe = da7218_i2c_probe,
  2909. .remove = da7218_i2c_remove,
  2910. .id_table = da7218_i2c_id,
  2911. };
  2912. module_i2c_driver(da7218_i2c_driver);
  2913. MODULE_DESCRIPTION("ASoC DA7218 Codec driver");
  2914. MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>");
  2915. MODULE_LICENSE("GPL");