lpass-rx-macro.c 123 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. // Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
  3. #include <linux/module.h>
  4. #include <linux/init.h>
  5. #include <linux/io.h>
  6. #include <linux/platform_device.h>
  7. #include <linux/pm_runtime.h>
  8. #include <linux/clk.h>
  9. #include <sound/soc.h>
  10. #include <sound/pcm.h>
  11. #include <sound/pcm_params.h>
  12. #include <sound/soc-dapm.h>
  13. #include <sound/tlv.h>
  14. #include <linux/of_clk.h>
  15. #include <linux/clk-provider.h>
  16. #include "lpass-macro-common.h"
  17. #define CDC_RX_TOP_TOP_CFG0 (0x0000)
  18. #define CDC_RX_TOP_SWR_CTRL (0x0008)
  19. #define CDC_RX_TOP_DEBUG (0x000C)
  20. #define CDC_RX_TOP_DEBUG_BUS (0x0010)
  21. #define CDC_RX_TOP_DEBUG_EN0 (0x0014)
  22. #define CDC_RX_TOP_DEBUG_EN1 (0x0018)
  23. #define CDC_RX_TOP_DEBUG_EN2 (0x001C)
  24. #define CDC_RX_TOP_HPHL_COMP_WR_LSB (0x0020)
  25. #define CDC_RX_TOP_HPHL_COMP_WR_MSB (0x0024)
  26. #define CDC_RX_TOP_HPHL_COMP_LUT (0x0028)
  27. #define CDC_RX_TOP_HPH_LUT_BYPASS_MASK BIT(7)
  28. #define CDC_RX_TOP_HPHL_COMP_RD_LSB (0x002C)
  29. #define CDC_RX_TOP_HPHL_COMP_RD_MSB (0x0030)
  30. #define CDC_RX_TOP_HPHR_COMP_WR_LSB (0x0034)
  31. #define CDC_RX_TOP_HPHR_COMP_WR_MSB (0x0038)
  32. #define CDC_RX_TOP_HPHR_COMP_LUT (0x003C)
  33. #define CDC_RX_TOP_HPHR_COMP_RD_LSB (0x0040)
  34. #define CDC_RX_TOP_HPHR_COMP_RD_MSB (0x0044)
  35. #define CDC_RX_TOP_DSD0_DEBUG_CFG0 (0x0070)
  36. #define CDC_RX_TOP_DSD0_DEBUG_CFG1 (0x0074)
  37. #define CDC_RX_TOP_DSD0_DEBUG_CFG2 (0x0078)
  38. #define CDC_RX_TOP_DSD0_DEBUG_CFG3 (0x007C)
  39. #define CDC_RX_TOP_DSD1_DEBUG_CFG0 (0x0080)
  40. #define CDC_RX_TOP_DSD1_DEBUG_CFG1 (0x0084)
  41. #define CDC_RX_TOP_DSD1_DEBUG_CFG2 (0x0088)
  42. #define CDC_RX_TOP_DSD1_DEBUG_CFG3 (0x008C)
  43. #define CDC_RX_TOP_RX_I2S_CTL (0x0090)
  44. #define CDC_RX_TOP_TX_I2S2_CTL (0x0094)
  45. #define CDC_RX_TOP_I2S_CLK (0x0098)
  46. #define CDC_RX_TOP_I2S_RESET (0x009C)
  47. #define CDC_RX_TOP_I2S_MUX (0x00A0)
  48. #define CDC_RX_CLK_RST_CTRL_MCLK_CONTROL (0x0100)
  49. #define CDC_RX_CLK_MCLK_EN_MASK BIT(0)
  50. #define CDC_RX_CLK_MCLK_ENABLE BIT(0)
  51. #define CDC_RX_CLK_MCLK2_EN_MASK BIT(1)
  52. #define CDC_RX_CLK_MCLK2_ENABLE BIT(1)
  53. #define CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL (0x0104)
  54. #define CDC_RX_FS_MCLK_CNT_EN_MASK BIT(0)
  55. #define CDC_RX_FS_MCLK_CNT_ENABLE BIT(0)
  56. #define CDC_RX_FS_MCLK_CNT_CLR_MASK BIT(1)
  57. #define CDC_RX_FS_MCLK_CNT_CLR BIT(1)
  58. #define CDC_RX_CLK_RST_CTRL_SWR_CONTROL (0x0108)
  59. #define CDC_RX_SWR_CLK_EN_MASK BIT(0)
  60. #define CDC_RX_SWR_RESET_MASK BIT(1)
  61. #define CDC_RX_SWR_RESET BIT(1)
  62. #define CDC_RX_CLK_RST_CTRL_DSD_CONTROL (0x010C)
  63. #define CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL (0x0110)
  64. #define CDC_RX_SOFTCLIP_CRC (0x0140)
  65. #define CDC_RX_SOFTCLIP_CLK_EN_MASK BIT(0)
  66. #define CDC_RX_SOFTCLIP_SOFTCLIP_CTRL (0x0144)
  67. #define CDC_RX_SOFTCLIP_EN_MASK BIT(0)
  68. #define CDC_RX_INP_MUX_RX_INT0_CFG0 (0x0180)
  69. #define CDC_RX_INTX_1_MIX_INP0_SEL_MASK GENMASK(3, 0)
  70. #define CDC_RX_INTX_1_MIX_INP1_SEL_MASK GENMASK(7, 4)
  71. #define CDC_RX_INP_MUX_RX_INT0_CFG1 (0x0184)
  72. #define CDC_RX_INTX_2_SEL_MASK GENMASK(3, 0)
  73. #define CDC_RX_INTX_1_MIX_INP2_SEL_MASK GENMASK(7, 4)
  74. #define CDC_RX_INP_MUX_RX_INT1_CFG0 (0x0188)
  75. #define CDC_RX_INP_MUX_RX_INT1_CFG1 (0x018C)
  76. #define CDC_RX_INP_MUX_RX_INT2_CFG0 (0x0190)
  77. #define CDC_RX_INP_MUX_RX_INT2_CFG1 (0x0194)
  78. #define CDC_RX_INP_MUX_RX_MIX_CFG4 (0x0198)
  79. #define CDC_RX_INP_MUX_RX_MIX_CFG5 (0x019C)
  80. #define CDC_RX_INP_MUX_SIDETONE_SRC_CFG0 (0x01A0)
  81. #define CDC_RX_CLSH_CRC (0x0200)
  82. #define CDC_RX_CLSH_CLK_EN_MASK BIT(0)
  83. #define CDC_RX_CLSH_DLY_CTRL (0x0204)
  84. #define CDC_RX_CLSH_DECAY_CTRL (0x0208)
  85. #define CDC_RX_CLSH_DECAY_RATE_MASK GENMASK(2, 0)
  86. #define CDC_RX_CLSH_HPH_V_PA (0x020C)
  87. #define CDC_RX_CLSH_HPH_V_PA_MIN_MASK GENMASK(5, 0)
  88. #define CDC_RX_CLSH_EAR_V_PA (0x0210)
  89. #define CDC_RX_CLSH_HPH_V_HD (0x0214)
  90. #define CDC_RX_CLSH_EAR_V_HD (0x0218)
  91. #define CDC_RX_CLSH_K1_MSB (0x021C)
  92. #define CDC_RX_CLSH_K1_MSB_COEFF_MASK GENMASK(3, 0)
  93. #define CDC_RX_CLSH_K1_LSB (0x0220)
  94. #define CDC_RX_CLSH_K2_MSB (0x0224)
  95. #define CDC_RX_CLSH_K2_LSB (0x0228)
  96. #define CDC_RX_CLSH_IDLE_CTRL (0x022C)
  97. #define CDC_RX_CLSH_IDLE_HPH (0x0230)
  98. #define CDC_RX_CLSH_IDLE_EAR (0x0234)
  99. #define CDC_RX_CLSH_TEST0 (0x0238)
  100. #define CDC_RX_CLSH_TEST1 (0x023C)
  101. #define CDC_RX_CLSH_OVR_VREF (0x0240)
  102. #define CDC_RX_CLSH_CLSG_CTL (0x0244)
  103. #define CDC_RX_CLSH_CLSG_CFG1 (0x0248)
  104. #define CDC_RX_CLSH_CLSG_CFG2 (0x024C)
  105. #define CDC_RX_BCL_VBAT_PATH_CTL (0x0280)
  106. #define CDC_RX_BCL_VBAT_CFG (0x0284)
  107. #define CDC_RX_BCL_VBAT_ADC_CAL1 (0x0288)
  108. #define CDC_RX_BCL_VBAT_ADC_CAL2 (0x028C)
  109. #define CDC_RX_BCL_VBAT_ADC_CAL3 (0x0290)
  110. #define CDC_RX_BCL_VBAT_PK_EST1 (0x0294)
  111. #define CDC_RX_BCL_VBAT_PK_EST2 (0x0298)
  112. #define CDC_RX_BCL_VBAT_PK_EST3 (0x029C)
  113. #define CDC_RX_BCL_VBAT_RF_PROC1 (0x02A0)
  114. #define CDC_RX_BCL_VBAT_RF_PROC2 (0x02A4)
  115. #define CDC_RX_BCL_VBAT_TAC1 (0x02A8)
  116. #define CDC_RX_BCL_VBAT_TAC2 (0x02AC)
  117. #define CDC_RX_BCL_VBAT_TAC3 (0x02B0)
  118. #define CDC_RX_BCL_VBAT_TAC4 (0x02B4)
  119. #define CDC_RX_BCL_VBAT_GAIN_UPD1 (0x02B8)
  120. #define CDC_RX_BCL_VBAT_GAIN_UPD2 (0x02BC)
  121. #define CDC_RX_BCL_VBAT_GAIN_UPD3 (0x02C0)
  122. #define CDC_RX_BCL_VBAT_GAIN_UPD4 (0x02C4)
  123. #define CDC_RX_BCL_VBAT_GAIN_UPD5 (0x02C8)
  124. #define CDC_RX_BCL_VBAT_DEBUG1 (0x02CC)
  125. #define CDC_RX_BCL_VBAT_GAIN_UPD_MON (0x02D0)
  126. #define CDC_RX_BCL_VBAT_GAIN_MON_VAL (0x02D4)
  127. #define CDC_RX_BCL_VBAT_BAN (0x02D8)
  128. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD1 (0x02DC)
  129. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD2 (0x02E0)
  130. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD3 (0x02E4)
  131. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD4 (0x02E8)
  132. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD5 (0x02EC)
  133. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD6 (0x02F0)
  134. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD7 (0x02F4)
  135. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD8 (0x02F8)
  136. #define CDC_RX_BCL_VBAT_BCL_GAIN_UPD9 (0x02FC)
  137. #define CDC_RX_BCL_VBAT_ATTN1 (0x0300)
  138. #define CDC_RX_BCL_VBAT_ATTN2 (0x0304)
  139. #define CDC_RX_BCL_VBAT_ATTN3 (0x0308)
  140. #define CDC_RX_BCL_VBAT_DECODE_CTL1 (0x030C)
  141. #define CDC_RX_BCL_VBAT_DECODE_CTL2 (0x0310)
  142. #define CDC_RX_BCL_VBAT_DECODE_CFG1 (0x0314)
  143. #define CDC_RX_BCL_VBAT_DECODE_CFG2 (0x0318)
  144. #define CDC_RX_BCL_VBAT_DECODE_CFG3 (0x031C)
  145. #define CDC_RX_BCL_VBAT_DECODE_CFG4 (0x0320)
  146. #define CDC_RX_BCL_VBAT_DECODE_ST (0x0324)
  147. #define CDC_RX_INTR_CTRL_CFG (0x0340)
  148. #define CDC_RX_INTR_CTRL_CLR_COMMIT (0x0344)
  149. #define CDC_RX_INTR_CTRL_PIN1_MASK0 (0x0360)
  150. #define CDC_RX_INTR_CTRL_PIN1_STATUS0 (0x0368)
  151. #define CDC_RX_INTR_CTRL_PIN1_CLEAR0 (0x0370)
  152. #define CDC_RX_INTR_CTRL_PIN2_MASK0 (0x0380)
  153. #define CDC_RX_INTR_CTRL_PIN2_STATUS0 (0x0388)
  154. #define CDC_RX_INTR_CTRL_PIN2_CLEAR0 (0x0390)
  155. #define CDC_RX_INTR_CTRL_LEVEL0 (0x03C0)
  156. #define CDC_RX_INTR_CTRL_BYPASS0 (0x03C8)
  157. #define CDC_RX_INTR_CTRL_SET0 (0x03D0)
  158. #define CDC_RX_RXn_RX_PATH_CTL(n) (0x0400 + 0x80 * n)
  159. #define CDC_RX_RX0_RX_PATH_CTL (0x0400)
  160. #define CDC_RX_PATH_RESET_EN_MASK BIT(6)
  161. #define CDC_RX_PATH_CLK_EN_MASK BIT(5)
  162. #define CDC_RX_PATH_CLK_ENABLE BIT(5)
  163. #define CDC_RX_PATH_PGA_MUTE_MASK BIT(4)
  164. #define CDC_RX_PATH_PGA_MUTE_ENABLE BIT(4)
  165. #define CDC_RX_PATH_PCM_RATE_MASK GENMASK(3, 0)
  166. #define CDC_RX_RXn_RX_PATH_CFG0(n) (0x0404 + 0x80 * n)
  167. #define CDC_RX_RXn_COMP_EN_MASK BIT(1)
  168. #define CDC_RX_RX0_RX_PATH_CFG0 (0x0404)
  169. #define CDC_RX_RXn_CLSH_EN_MASK BIT(6)
  170. #define CDC_RX_DLY_ZN_EN_MASK BIT(3)
  171. #define CDC_RX_DLY_ZN_ENABLE BIT(3)
  172. #define CDC_RX_RXn_HD2_EN_MASK BIT(2)
  173. #define CDC_RX_RXn_RX_PATH_CFG1(n) (0x0408 + 0x80 * n)
  174. #define CDC_RX_RXn_SIDETONE_EN_MASK BIT(4)
  175. #define CDC_RX_RX0_RX_PATH_CFG1 (0x0408)
  176. #define CDC_RX_RX0_HPH_L_EAR_SEL_MASK BIT(1)
  177. #define CDC_RX_RXn_RX_PATH_CFG2(n) (0x040C + 0x80 * n)
  178. #define CDC_RX_RXn_HPF_CUT_FREQ_MASK GENMASK(1, 0)
  179. #define CDC_RX_RX0_RX_PATH_CFG2 (0x040C)
  180. #define CDC_RX_RXn_RX_PATH_CFG3(n) (0x0410 + 0x80 * n)
  181. #define CDC_RX_RX0_RX_PATH_CFG3 (0x0410)
  182. #define CDC_RX_DC_COEFF_SEL_MASK GENMASK(1, 0)
  183. #define CDC_RX_DC_COEFF_SEL_TWO 0x2
  184. #define CDC_RX_RXn_RX_VOL_CTL(n) (0x0414 + 0x80 * n)
  185. #define CDC_RX_RX0_RX_VOL_CTL (0x0414)
  186. #define CDC_RX_RXn_RX_PATH_MIX_CTL(n) (0x0418 + 0x80 * n)
  187. #define CDC_RX_RXn_MIX_PCM_RATE_MASK GENMASK(3, 0)
  188. #define CDC_RX_RXn_MIX_RESET_MASK BIT(6)
  189. #define CDC_RX_RXn_MIX_RESET BIT(6)
  190. #define CDC_RX_RXn_MIX_CLK_EN_MASK BIT(5)
  191. #define CDC_RX_RX0_RX_PATH_MIX_CTL (0x0418)
  192. #define CDC_RX_RX0_RX_PATH_MIX_CFG (0x041C)
  193. #define CDC_RX_RXn_RX_VOL_MIX_CTL(n) (0x0420 + 0x80 * n)
  194. #define CDC_RX_RX0_RX_VOL_MIX_CTL (0x0420)
  195. #define CDC_RX_RX0_RX_PATH_SEC1 (0x0424)
  196. #define CDC_RX_RX0_RX_PATH_SEC2 (0x0428)
  197. #define CDC_RX_RX0_RX_PATH_SEC3 (0x042C)
  198. #define CDC_RX_RX0_RX_PATH_SEC4 (0x0430)
  199. #define CDC_RX_RX0_RX_PATH_SEC7 (0x0434)
  200. #define CDC_RX_DSM_OUT_DELAY_SEL_MASK GENMASK(2, 0)
  201. #define CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE 0x2
  202. #define CDC_RX_RX0_RX_PATH_MIX_SEC0 (0x0438)
  203. #define CDC_RX_RX0_RX_PATH_MIX_SEC1 (0x043C)
  204. #define CDC_RX_RXn_RX_PATH_DSM_CTL(n) (0x0440 + 0x80 * n)
  205. #define CDC_RX_RXn_DSM_CLK_EN_MASK BIT(0)
  206. #define CDC_RX_RX0_RX_PATH_DSM_CTL (0x0440)
  207. #define CDC_RX_RX0_RX_PATH_DSM_DATA1 (0x0444)
  208. #define CDC_RX_RX0_RX_PATH_DSM_DATA2 (0x0448)
  209. #define CDC_RX_RX0_RX_PATH_DSM_DATA3 (0x044C)
  210. #define CDC_RX_RX0_RX_PATH_DSM_DATA4 (0x0450)
  211. #define CDC_RX_RX0_RX_PATH_DSM_DATA5 (0x0454)
  212. #define CDC_RX_RX0_RX_PATH_DSM_DATA6 (0x0458)
  213. #define CDC_RX_RX1_RX_PATH_CTL (0x0480)
  214. #define CDC_RX_RX1_RX_PATH_CFG0 (0x0484)
  215. #define CDC_RX_RX1_RX_PATH_CFG1 (0x0488)
  216. #define CDC_RX_RX1_RX_PATH_CFG2 (0x048C)
  217. #define CDC_RX_RX1_RX_PATH_CFG3 (0x0490)
  218. #define CDC_RX_RX1_RX_VOL_CTL (0x0494)
  219. #define CDC_RX_RX1_RX_PATH_MIX_CTL (0x0498)
  220. #define CDC_RX_RX1_RX_PATH_MIX_CFG (0x049C)
  221. #define CDC_RX_RX1_RX_VOL_MIX_CTL (0x04A0)
  222. #define CDC_RX_RX1_RX_PATH_SEC1 (0x04A4)
  223. #define CDC_RX_RX1_RX_PATH_SEC2 (0x04A8)
  224. #define CDC_RX_RX1_RX_PATH_SEC3 (0x04AC)
  225. #define CDC_RX_RXn_HD2_ALPHA_MASK GENMASK(5, 2)
  226. #define CDC_RX_RX1_RX_PATH_SEC4 (0x04B0)
  227. #define CDC_RX_RX1_RX_PATH_SEC7 (0x04B4)
  228. #define CDC_RX_RX1_RX_PATH_MIX_SEC0 (0x04B8)
  229. #define CDC_RX_RX1_RX_PATH_MIX_SEC1 (0x04BC)
  230. #define CDC_RX_RX1_RX_PATH_DSM_CTL (0x04C0)
  231. #define CDC_RX_RX1_RX_PATH_DSM_DATA1 (0x04C4)
  232. #define CDC_RX_RX1_RX_PATH_DSM_DATA2 (0x04C8)
  233. #define CDC_RX_RX1_RX_PATH_DSM_DATA3 (0x04CC)
  234. #define CDC_RX_RX1_RX_PATH_DSM_DATA4 (0x04D0)
  235. #define CDC_RX_RX1_RX_PATH_DSM_DATA5 (0x04D4)
  236. #define CDC_RX_RX1_RX_PATH_DSM_DATA6 (0x04D8)
  237. #define CDC_RX_RX2_RX_PATH_CTL (0x0500)
  238. #define CDC_RX_RX2_RX_PATH_CFG0 (0x0504)
  239. #define CDC_RX_RX2_CLSH_EN_MASK BIT(4)
  240. #define CDC_RX_RX2_DLY_Z_EN_MASK BIT(3)
  241. #define CDC_RX_RX2_RX_PATH_CFG1 (0x0508)
  242. #define CDC_RX_RX2_RX_PATH_CFG2 (0x050C)
  243. #define CDC_RX_RX2_RX_PATH_CFG3 (0x0510)
  244. #define CDC_RX_RX2_RX_VOL_CTL (0x0514)
  245. #define CDC_RX_RX2_RX_PATH_MIX_CTL (0x0518)
  246. #define CDC_RX_RX2_RX_PATH_MIX_CFG (0x051C)
  247. #define CDC_RX_RX2_RX_VOL_MIX_CTL (0x0520)
  248. #define CDC_RX_RX2_RX_PATH_SEC0 (0x0524)
  249. #define CDC_RX_RX2_RX_PATH_SEC1 (0x0528)
  250. #define CDC_RX_RX2_RX_PATH_SEC2 (0x052C)
  251. #define CDC_RX_RX2_RX_PATH_SEC3 (0x0530)
  252. #define CDC_RX_RX2_RX_PATH_SEC4 (0x0534)
  253. #define CDC_RX_RX2_RX_PATH_SEC5 (0x0538)
  254. #define CDC_RX_RX2_RX_PATH_SEC6 (0x053C)
  255. #define CDC_RX_RX2_RX_PATH_SEC7 (0x0540)
  256. #define CDC_RX_RX2_RX_PATH_MIX_SEC0 (0x0544)
  257. #define CDC_RX_RX2_RX_PATH_MIX_SEC1 (0x0548)
  258. #define CDC_RX_RX2_RX_PATH_DSM_CTL (0x054C)
  259. #define CDC_RX_IDLE_DETECT_PATH_CTL (0x0780)
  260. #define CDC_RX_IDLE_DETECT_CFG0 (0x0784)
  261. #define CDC_RX_IDLE_DETECT_CFG1 (0x0788)
  262. #define CDC_RX_IDLE_DETECT_CFG2 (0x078C)
  263. #define CDC_RX_IDLE_DETECT_CFG3 (0x0790)
  264. #define CDC_RX_COMPANDERn_CTL0(n) (0x0800 + 0x40 * n)
  265. #define CDC_RX_COMPANDERn_CLK_EN_MASK BIT(0)
  266. #define CDC_RX_COMPANDERn_SOFT_RST_MASK BIT(1)
  267. #define CDC_RX_COMPANDERn_HALT_MASK BIT(2)
  268. #define CDC_RX_COMPANDER0_CTL0 (0x0800)
  269. #define CDC_RX_COMPANDER0_CTL1 (0x0804)
  270. #define CDC_RX_COMPANDER0_CTL2 (0x0808)
  271. #define CDC_RX_COMPANDER0_CTL3 (0x080C)
  272. #define CDC_RX_COMPANDER0_CTL4 (0x0810)
  273. #define CDC_RX_COMPANDER0_CTL5 (0x0814)
  274. #define CDC_RX_COMPANDER0_CTL6 (0x0818)
  275. #define CDC_RX_COMPANDER0_CTL7 (0x081C)
  276. #define CDC_RX_COMPANDER1_CTL0 (0x0840)
  277. #define CDC_RX_COMPANDER1_CTL1 (0x0844)
  278. #define CDC_RX_COMPANDER1_CTL2 (0x0848)
  279. #define CDC_RX_COMPANDER1_CTL3 (0x084C)
  280. #define CDC_RX_COMPANDER1_CTL4 (0x0850)
  281. #define CDC_RX_COMPANDER1_CTL5 (0x0854)
  282. #define CDC_RX_COMPANDER1_CTL6 (0x0858)
  283. #define CDC_RX_COMPANDER1_CTL7 (0x085C)
  284. #define CDC_RX_COMPANDER1_HPH_LOW_PWR_MODE_MASK BIT(5)
  285. #define CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL (0x0A00)
  286. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL (0x0A04)
  287. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL (0x0A08)
  288. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL (0x0A0C)
  289. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL (0x0A10)
  290. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL (0x0A14)
  291. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL (0x0A18)
  292. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL (0x0A1C)
  293. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL (0x0A20)
  294. #define CDC_RX_SIDETONE_IIR0_IIR_CTL (0x0A24)
  295. #define CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL (0x0A28)
  296. #define CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL (0x0A2C)
  297. #define CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL (0x0A30)
  298. #define CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL (0x0A80)
  299. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL (0x0A84)
  300. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL (0x0A88)
  301. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL (0x0A8C)
  302. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL (0x0A90)
  303. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL (0x0A94)
  304. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL (0x0A98)
  305. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL (0x0A9C)
  306. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL (0x0AA0)
  307. #define CDC_RX_SIDETONE_IIR1_IIR_CTL (0x0AA4)
  308. #define CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL (0x0AA8)
  309. #define CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL (0x0AAC)
  310. #define CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL (0x0AB0)
  311. #define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0 (0x0B00)
  312. #define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1 (0x0B04)
  313. #define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2 (0x0B08)
  314. #define CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3 (0x0B0C)
  315. #define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0 (0x0B10)
  316. #define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1 (0x0B14)
  317. #define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2 (0x0B18)
  318. #define CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3 (0x0B1C)
  319. #define CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL (0x0B40)
  320. #define CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1 (0x0B44)
  321. #define CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL (0x0B50)
  322. #define CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1 (0x0B54)
  323. #define CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL (0x0C00)
  324. #define CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 (0x0C04)
  325. #define CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL (0x0C40)
  326. #define CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0 (0x0C44)
  327. #define CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL (0x0C80)
  328. #define CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0 (0x0C84)
  329. #define CDC_RX_EC_ASRC0_CLK_RST_CTL (0x0D00)
  330. #define CDC_RX_EC_ASRC0_CTL0 (0x0D04)
  331. #define CDC_RX_EC_ASRC0_CTL1 (0x0D08)
  332. #define CDC_RX_EC_ASRC0_FIFO_CTL (0x0D0C)
  333. #define CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB (0x0D10)
  334. #define CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB (0x0D14)
  335. #define CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB (0x0D18)
  336. #define CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB (0x0D1C)
  337. #define CDC_RX_EC_ASRC0_STATUS_FIFO (0x0D20)
  338. #define CDC_RX_EC_ASRC1_CLK_RST_CTL (0x0D40)
  339. #define CDC_RX_EC_ASRC1_CTL0 (0x0D44)
  340. #define CDC_RX_EC_ASRC1_CTL1 (0x0D48)
  341. #define CDC_RX_EC_ASRC1_FIFO_CTL (0x0D4C)
  342. #define CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB (0x0D50)
  343. #define CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB (0x0D54)
  344. #define CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB (0x0D58)
  345. #define CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB (0x0D5C)
  346. #define CDC_RX_EC_ASRC1_STATUS_FIFO (0x0D60)
  347. #define CDC_RX_EC_ASRC2_CLK_RST_CTL (0x0D80)
  348. #define CDC_RX_EC_ASRC2_CTL0 (0x0D84)
  349. #define CDC_RX_EC_ASRC2_CTL1 (0x0D88)
  350. #define CDC_RX_EC_ASRC2_FIFO_CTL (0x0D8C)
  351. #define CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB (0x0D90)
  352. #define CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB (0x0D94)
  353. #define CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB (0x0D98)
  354. #define CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB (0x0D9C)
  355. #define CDC_RX_EC_ASRC2_STATUS_FIFO (0x0DA0)
  356. #define CDC_RX_DSD0_PATH_CTL (0x0F00)
  357. #define CDC_RX_DSD0_CFG0 (0x0F04)
  358. #define CDC_RX_DSD0_CFG1 (0x0F08)
  359. #define CDC_RX_DSD0_CFG2 (0x0F0C)
  360. #define CDC_RX_DSD1_PATH_CTL (0x0F80)
  361. #define CDC_RX_DSD1_CFG0 (0x0F84)
  362. #define CDC_RX_DSD1_CFG1 (0x0F88)
  363. #define CDC_RX_DSD1_CFG2 (0x0F8C)
  364. #define RX_MAX_OFFSET (0x0F8C)
  365. #define MCLK_FREQ 19200000
  366. #define RX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
  367. SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
  368. SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\
  369. SNDRV_PCM_RATE_384000)
  370. /* Fractional Rates */
  371. #define RX_MACRO_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\
  372. SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800)
  373. #define RX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  374. SNDRV_PCM_FMTBIT_S24_LE |\
  375. SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
  376. #define RX_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
  377. SNDRV_PCM_RATE_48000)
  378. #define RX_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  379. SNDRV_PCM_FMTBIT_S24_LE |\
  380. SNDRV_PCM_FMTBIT_S24_3LE)
  381. #define RX_MACRO_MAX_DMA_CH_PER_PORT 2
  382. #define RX_MACRO_EC_MIX_TX0_MASK 0xf0
  383. #define RX_MACRO_EC_MIX_TX1_MASK 0x0f
  384. #define RX_MACRO_EC_MIX_TX2_MASK 0x0f
  385. #define COMP_MAX_COEFF 25
  386. #define RX_NUM_CLKS_MAX 5
  387. struct comp_coeff_val {
  388. u8 lsb;
  389. u8 msb;
  390. };
  391. enum {
  392. HPH_ULP,
  393. HPH_LOHIFI,
  394. HPH_MODE_MAX,
  395. };
  396. static const struct comp_coeff_val comp_coeff_table[HPH_MODE_MAX][COMP_MAX_COEFF] = {
  397. {
  398. {0x40, 0x00},
  399. {0x4C, 0x00},
  400. {0x5A, 0x00},
  401. {0x6B, 0x00},
  402. {0x7F, 0x00},
  403. {0x97, 0x00},
  404. {0xB3, 0x00},
  405. {0xD5, 0x00},
  406. {0xFD, 0x00},
  407. {0x2D, 0x01},
  408. {0x66, 0x01},
  409. {0xA7, 0x01},
  410. {0xF8, 0x01},
  411. {0x57, 0x02},
  412. {0xC7, 0x02},
  413. {0x4B, 0x03},
  414. {0xE9, 0x03},
  415. {0xA3, 0x04},
  416. {0x7D, 0x05},
  417. {0x90, 0x06},
  418. {0xD1, 0x07},
  419. {0x49, 0x09},
  420. {0x00, 0x0B},
  421. {0x01, 0x0D},
  422. {0x59, 0x0F},
  423. },
  424. {
  425. {0x40, 0x00},
  426. {0x4C, 0x00},
  427. {0x5A, 0x00},
  428. {0x6B, 0x00},
  429. {0x80, 0x00},
  430. {0x98, 0x00},
  431. {0xB4, 0x00},
  432. {0xD5, 0x00},
  433. {0xFE, 0x00},
  434. {0x2E, 0x01},
  435. {0x66, 0x01},
  436. {0xA9, 0x01},
  437. {0xF8, 0x01},
  438. {0x56, 0x02},
  439. {0xC4, 0x02},
  440. {0x4F, 0x03},
  441. {0xF0, 0x03},
  442. {0xAE, 0x04},
  443. {0x8B, 0x05},
  444. {0x8E, 0x06},
  445. {0xBC, 0x07},
  446. {0x56, 0x09},
  447. {0x0F, 0x0B},
  448. {0x13, 0x0D},
  449. {0x6F, 0x0F},
  450. },
  451. };
  452. struct rx_macro_reg_mask_val {
  453. u16 reg;
  454. u8 mask;
  455. u8 val;
  456. };
  457. enum {
  458. INTERP_HPHL,
  459. INTERP_HPHR,
  460. INTERP_AUX,
  461. INTERP_MAX
  462. };
  463. enum {
  464. RX_MACRO_RX0,
  465. RX_MACRO_RX1,
  466. RX_MACRO_RX2,
  467. RX_MACRO_RX3,
  468. RX_MACRO_RX4,
  469. RX_MACRO_RX5,
  470. RX_MACRO_PORTS_MAX
  471. };
  472. enum {
  473. RX_MACRO_COMP1, /* HPH_L */
  474. RX_MACRO_COMP2, /* HPH_R */
  475. RX_MACRO_COMP_MAX
  476. };
  477. enum {
  478. RX_MACRO_EC0_MUX = 0,
  479. RX_MACRO_EC1_MUX,
  480. RX_MACRO_EC2_MUX,
  481. RX_MACRO_EC_MUX_MAX,
  482. };
  483. enum {
  484. INTn_1_INP_SEL_ZERO = 0,
  485. INTn_1_INP_SEL_DEC0,
  486. INTn_1_INP_SEL_DEC1,
  487. INTn_1_INP_SEL_IIR0,
  488. INTn_1_INP_SEL_IIR1,
  489. INTn_1_INP_SEL_RX0,
  490. INTn_1_INP_SEL_RX1,
  491. INTn_1_INP_SEL_RX2,
  492. INTn_1_INP_SEL_RX3,
  493. INTn_1_INP_SEL_RX4,
  494. INTn_1_INP_SEL_RX5,
  495. };
  496. enum {
  497. INTn_2_INP_SEL_ZERO = 0,
  498. INTn_2_INP_SEL_RX0,
  499. INTn_2_INP_SEL_RX1,
  500. INTn_2_INP_SEL_RX2,
  501. INTn_2_INP_SEL_RX3,
  502. INTn_2_INP_SEL_RX4,
  503. INTn_2_INP_SEL_RX5,
  504. };
  505. enum {
  506. INTERP_MAIN_PATH,
  507. INTERP_MIX_PATH,
  508. };
  509. /* Codec supports 2 IIR filters */
  510. enum {
  511. IIR0 = 0,
  512. IIR1,
  513. IIR_MAX,
  514. };
  515. /* Each IIR has 5 Filter Stages */
  516. enum {
  517. BAND1 = 0,
  518. BAND2,
  519. BAND3,
  520. BAND4,
  521. BAND5,
  522. BAND_MAX,
  523. };
  524. #define RX_MACRO_IIR_FILTER_SIZE (sizeof(u32) * BAND_MAX)
  525. #define RX_MACRO_IIR_FILTER_CTL(xname, iidx, bidx) \
  526. { \
  527. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  528. .info = rx_macro_iir_filter_info, \
  529. .get = rx_macro_get_iir_band_audio_mixer, \
  530. .put = rx_macro_put_iir_band_audio_mixer, \
  531. .private_value = (unsigned long)&(struct wcd_iir_filter_ctl) { \
  532. .iir_idx = iidx, \
  533. .band_idx = bidx, \
  534. .bytes_ext = {.max = RX_MACRO_IIR_FILTER_SIZE, }, \
  535. } \
  536. }
  537. struct interp_sample_rate {
  538. int sample_rate;
  539. int rate_val;
  540. };
  541. static struct interp_sample_rate sr_val_tbl[] = {
  542. {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5},
  543. {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA},
  544. {176400, 0xB}, {352800, 0xC},
  545. };
  546. enum {
  547. RX_MACRO_AIF_INVALID = 0,
  548. RX_MACRO_AIF1_PB,
  549. RX_MACRO_AIF2_PB,
  550. RX_MACRO_AIF3_PB,
  551. RX_MACRO_AIF4_PB,
  552. RX_MACRO_AIF_ECHO,
  553. RX_MACRO_MAX_DAIS,
  554. };
  555. enum {
  556. RX_MACRO_AIF1_CAP = 0,
  557. RX_MACRO_AIF2_CAP,
  558. RX_MACRO_AIF3_CAP,
  559. RX_MACRO_MAX_AIF_CAP_DAIS
  560. };
  561. struct rx_macro {
  562. struct device *dev;
  563. int comp_enabled[RX_MACRO_COMP_MAX];
  564. /* Main path clock users count */
  565. int main_clk_users[INTERP_MAX];
  566. int rx_port_value[RX_MACRO_PORTS_MAX];
  567. u16 prim_int_users[INTERP_MAX];
  568. int rx_mclk_users;
  569. int clsh_users;
  570. int rx_mclk_cnt;
  571. bool is_ear_mode_on;
  572. bool hph_pwr_mode;
  573. bool hph_hd2_mode;
  574. struct snd_soc_component *component;
  575. unsigned long active_ch_mask[RX_MACRO_MAX_DAIS];
  576. unsigned long active_ch_cnt[RX_MACRO_MAX_DAIS];
  577. u16 bit_width[RX_MACRO_MAX_DAIS];
  578. int is_softclip_on;
  579. int is_aux_hpf_on;
  580. int softclip_clk_users;
  581. struct lpass_macro *pds;
  582. struct regmap *regmap;
  583. struct clk *mclk;
  584. struct clk *npl;
  585. struct clk *macro;
  586. struct clk *dcodec;
  587. struct clk *fsgen;
  588. struct clk_hw hw;
  589. };
  590. #define to_rx_macro(_hw) container_of(_hw, struct rx_macro, hw)
  591. struct wcd_iir_filter_ctl {
  592. unsigned int iir_idx;
  593. unsigned int band_idx;
  594. struct soc_bytes_ext bytes_ext;
  595. };
  596. static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
  597. static const char * const rx_int_mix_mux_text[] = {
  598. "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"
  599. };
  600. static const char * const rx_prim_mix_text[] = {
  601. "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2",
  602. "RX3", "RX4", "RX5"
  603. };
  604. static const char * const rx_sidetone_mix_text[] = {
  605. "ZERO", "SRC0", "SRC1", "SRC_SUM"
  606. };
  607. static const char * const iir_inp_mux_text[] = {
  608. "ZERO", "DEC0", "DEC1", "DEC2", "DEC3",
  609. "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"
  610. };
  611. static const char * const rx_int_dem_inp_mux_text[] = {
  612. "NORMAL_DSM_OUT", "CLSH_DSM_OUT",
  613. };
  614. static const char * const rx_int0_1_interp_mux_text[] = {
  615. "ZERO", "RX INT0_1 MIX1",
  616. };
  617. static const char * const rx_int1_1_interp_mux_text[] = {
  618. "ZERO", "RX INT1_1 MIX1",
  619. };
  620. static const char * const rx_int2_1_interp_mux_text[] = {
  621. "ZERO", "RX INT2_1 MIX1",
  622. };
  623. static const char * const rx_int0_2_interp_mux_text[] = {
  624. "ZERO", "RX INT0_2 MUX",
  625. };
  626. static const char * const rx_int1_2_interp_mux_text[] = {
  627. "ZERO", "RX INT1_2 MUX",
  628. };
  629. static const char * const rx_int2_2_interp_mux_text[] = {
  630. "ZERO", "RX INT2_2 MUX",
  631. };
  632. static const char *const rx_macro_mux_text[] = {
  633. "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB"
  634. };
  635. static const char *const rx_macro_hph_pwr_mode_text[] = {
  636. "ULP", "LOHIFI"
  637. };
  638. static const char * const rx_echo_mux_text[] = {
  639. "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2"
  640. };
  641. static const struct soc_enum rx_macro_hph_pwr_mode_enum =
  642. SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_pwr_mode_text);
  643. static const struct soc_enum rx_mix_tx2_mux_enum =
  644. SOC_ENUM_SINGLE(CDC_RX_INP_MUX_RX_MIX_CFG5, 0, 4, rx_echo_mux_text);
  645. static const struct soc_enum rx_mix_tx1_mux_enum =
  646. SOC_ENUM_SINGLE(CDC_RX_INP_MUX_RX_MIX_CFG4, 0, 4, rx_echo_mux_text);
  647. static const struct soc_enum rx_mix_tx0_mux_enum =
  648. SOC_ENUM_SINGLE(CDC_RX_INP_MUX_RX_MIX_CFG4, 4, 4, rx_echo_mux_text);
  649. static SOC_ENUM_SINGLE_DECL(rx_int0_2_enum, CDC_RX_INP_MUX_RX_INT0_CFG1, 0,
  650. rx_int_mix_mux_text);
  651. static SOC_ENUM_SINGLE_DECL(rx_int1_2_enum, CDC_RX_INP_MUX_RX_INT1_CFG1, 0,
  652. rx_int_mix_mux_text);
  653. static SOC_ENUM_SINGLE_DECL(rx_int2_2_enum, CDC_RX_INP_MUX_RX_INT2_CFG1, 0,
  654. rx_int_mix_mux_text);
  655. static SOC_ENUM_SINGLE_DECL(rx_int0_1_mix_inp0_enum, CDC_RX_INP_MUX_RX_INT0_CFG0, 0,
  656. rx_prim_mix_text);
  657. static SOC_ENUM_SINGLE_DECL(rx_int0_1_mix_inp1_enum, CDC_RX_INP_MUX_RX_INT0_CFG0, 4,
  658. rx_prim_mix_text);
  659. static SOC_ENUM_SINGLE_DECL(rx_int0_1_mix_inp2_enum, CDC_RX_INP_MUX_RX_INT0_CFG1, 4,
  660. rx_prim_mix_text);
  661. static SOC_ENUM_SINGLE_DECL(rx_int1_1_mix_inp0_enum, CDC_RX_INP_MUX_RX_INT1_CFG0, 0,
  662. rx_prim_mix_text);
  663. static SOC_ENUM_SINGLE_DECL(rx_int1_1_mix_inp1_enum, CDC_RX_INP_MUX_RX_INT1_CFG0, 4,
  664. rx_prim_mix_text);
  665. static SOC_ENUM_SINGLE_DECL(rx_int1_1_mix_inp2_enum, CDC_RX_INP_MUX_RX_INT1_CFG1, 4,
  666. rx_prim_mix_text);
  667. static SOC_ENUM_SINGLE_DECL(rx_int2_1_mix_inp0_enum, CDC_RX_INP_MUX_RX_INT2_CFG0, 0,
  668. rx_prim_mix_text);
  669. static SOC_ENUM_SINGLE_DECL(rx_int2_1_mix_inp1_enum, CDC_RX_INP_MUX_RX_INT2_CFG0, 4,
  670. rx_prim_mix_text);
  671. static SOC_ENUM_SINGLE_DECL(rx_int2_1_mix_inp2_enum, CDC_RX_INP_MUX_RX_INT2_CFG1, 4,
  672. rx_prim_mix_text);
  673. static SOC_ENUM_SINGLE_DECL(rx_int0_mix2_inp_enum, CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2,
  674. rx_sidetone_mix_text);
  675. static SOC_ENUM_SINGLE_DECL(rx_int1_mix2_inp_enum, CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4,
  676. rx_sidetone_mix_text);
  677. static SOC_ENUM_SINGLE_DECL(rx_int2_mix2_inp_enum, CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6,
  678. rx_sidetone_mix_text);
  679. static SOC_ENUM_SINGLE_DECL(iir0_inp0_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0,
  680. iir_inp_mux_text);
  681. static SOC_ENUM_SINGLE_DECL(iir0_inp1_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0,
  682. iir_inp_mux_text);
  683. static SOC_ENUM_SINGLE_DECL(iir0_inp2_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0,
  684. iir_inp_mux_text);
  685. static SOC_ENUM_SINGLE_DECL(iir0_inp3_enum, CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0,
  686. iir_inp_mux_text);
  687. static SOC_ENUM_SINGLE_DECL(iir1_inp0_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0,
  688. iir_inp_mux_text);
  689. static SOC_ENUM_SINGLE_DECL(iir1_inp1_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0,
  690. iir_inp_mux_text);
  691. static SOC_ENUM_SINGLE_DECL(iir1_inp2_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0,
  692. iir_inp_mux_text);
  693. static SOC_ENUM_SINGLE_DECL(iir1_inp3_enum, CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0,
  694. iir_inp_mux_text);
  695. static SOC_ENUM_SINGLE_DECL(rx_int0_1_interp_enum, SND_SOC_NOPM, 0,
  696. rx_int0_1_interp_mux_text);
  697. static SOC_ENUM_SINGLE_DECL(rx_int1_1_interp_enum, SND_SOC_NOPM, 0,
  698. rx_int1_1_interp_mux_text);
  699. static SOC_ENUM_SINGLE_DECL(rx_int2_1_interp_enum, SND_SOC_NOPM, 0,
  700. rx_int2_1_interp_mux_text);
  701. static SOC_ENUM_SINGLE_DECL(rx_int0_2_interp_enum, SND_SOC_NOPM, 0,
  702. rx_int0_2_interp_mux_text);
  703. static SOC_ENUM_SINGLE_DECL(rx_int1_2_interp_enum, SND_SOC_NOPM, 0,
  704. rx_int1_2_interp_mux_text);
  705. static SOC_ENUM_SINGLE_DECL(rx_int2_2_interp_enum, SND_SOC_NOPM, 0,
  706. rx_int2_2_interp_mux_text);
  707. static SOC_ENUM_SINGLE_DECL(rx_int0_dem_inp_enum, CDC_RX_RX0_RX_PATH_CFG1, 0,
  708. rx_int_dem_inp_mux_text);
  709. static SOC_ENUM_SINGLE_DECL(rx_int1_dem_inp_enum, CDC_RX_RX1_RX_PATH_CFG1, 0,
  710. rx_int_dem_inp_mux_text);
  711. static SOC_ENUM_SINGLE_DECL(rx_macro_rx0_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);
  712. static SOC_ENUM_SINGLE_DECL(rx_macro_rx1_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);
  713. static SOC_ENUM_SINGLE_DECL(rx_macro_rx2_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);
  714. static SOC_ENUM_SINGLE_DECL(rx_macro_rx3_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);
  715. static SOC_ENUM_SINGLE_DECL(rx_macro_rx4_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);
  716. static SOC_ENUM_SINGLE_DECL(rx_macro_rx5_enum, SND_SOC_NOPM, 0, rx_macro_mux_text);
  717. static const struct snd_kcontrol_new rx_mix_tx1_mux =
  718. SOC_DAPM_ENUM("RX MIX TX1_MUX Mux", rx_mix_tx1_mux_enum);
  719. static const struct snd_kcontrol_new rx_mix_tx2_mux =
  720. SOC_DAPM_ENUM("RX MIX TX2_MUX Mux", rx_mix_tx2_mux_enum);
  721. static const struct snd_kcontrol_new rx_int0_2_mux =
  722. SOC_DAPM_ENUM("rx_int0_2", rx_int0_2_enum);
  723. static const struct snd_kcontrol_new rx_int1_2_mux =
  724. SOC_DAPM_ENUM("rx_int1_2", rx_int1_2_enum);
  725. static const struct snd_kcontrol_new rx_int2_2_mux =
  726. SOC_DAPM_ENUM("rx_int2_2", rx_int2_2_enum);
  727. static const struct snd_kcontrol_new rx_int0_1_mix_inp0_mux =
  728. SOC_DAPM_ENUM("rx_int0_1_mix_inp0", rx_int0_1_mix_inp0_enum);
  729. static const struct snd_kcontrol_new rx_int0_1_mix_inp1_mux =
  730. SOC_DAPM_ENUM("rx_int0_1_mix_inp1", rx_int0_1_mix_inp1_enum);
  731. static const struct snd_kcontrol_new rx_int0_1_mix_inp2_mux =
  732. SOC_DAPM_ENUM("rx_int0_1_mix_inp2", rx_int0_1_mix_inp2_enum);
  733. static const struct snd_kcontrol_new rx_int1_1_mix_inp0_mux =
  734. SOC_DAPM_ENUM("rx_int1_1_mix_inp0", rx_int1_1_mix_inp0_enum);
  735. static const struct snd_kcontrol_new rx_int1_1_mix_inp1_mux =
  736. SOC_DAPM_ENUM("rx_int1_1_mix_inp1", rx_int1_1_mix_inp1_enum);
  737. static const struct snd_kcontrol_new rx_int1_1_mix_inp2_mux =
  738. SOC_DAPM_ENUM("rx_int1_1_mix_inp2", rx_int1_1_mix_inp2_enum);
  739. static const struct snd_kcontrol_new rx_int2_1_mix_inp0_mux =
  740. SOC_DAPM_ENUM("rx_int2_1_mix_inp0", rx_int2_1_mix_inp0_enum);
  741. static const struct snd_kcontrol_new rx_int2_1_mix_inp1_mux =
  742. SOC_DAPM_ENUM("rx_int2_1_mix_inp1", rx_int2_1_mix_inp1_enum);
  743. static const struct snd_kcontrol_new rx_int2_1_mix_inp2_mux =
  744. SOC_DAPM_ENUM("rx_int2_1_mix_inp2", rx_int2_1_mix_inp2_enum);
  745. static const struct snd_kcontrol_new rx_int0_mix2_inp_mux =
  746. SOC_DAPM_ENUM("rx_int0_mix2_inp", rx_int0_mix2_inp_enum);
  747. static const struct snd_kcontrol_new rx_int1_mix2_inp_mux =
  748. SOC_DAPM_ENUM("rx_int1_mix2_inp", rx_int1_mix2_inp_enum);
  749. static const struct snd_kcontrol_new rx_int2_mix2_inp_mux =
  750. SOC_DAPM_ENUM("rx_int2_mix2_inp", rx_int2_mix2_inp_enum);
  751. static const struct snd_kcontrol_new iir0_inp0_mux =
  752. SOC_DAPM_ENUM("iir0_inp0", iir0_inp0_enum);
  753. static const struct snd_kcontrol_new iir0_inp1_mux =
  754. SOC_DAPM_ENUM("iir0_inp1", iir0_inp1_enum);
  755. static const struct snd_kcontrol_new iir0_inp2_mux =
  756. SOC_DAPM_ENUM("iir0_inp2", iir0_inp2_enum);
  757. static const struct snd_kcontrol_new iir0_inp3_mux =
  758. SOC_DAPM_ENUM("iir0_inp3", iir0_inp3_enum);
  759. static const struct snd_kcontrol_new iir1_inp0_mux =
  760. SOC_DAPM_ENUM("iir1_inp0", iir1_inp0_enum);
  761. static const struct snd_kcontrol_new iir1_inp1_mux =
  762. SOC_DAPM_ENUM("iir1_inp1", iir1_inp1_enum);
  763. static const struct snd_kcontrol_new iir1_inp2_mux =
  764. SOC_DAPM_ENUM("iir1_inp2", iir1_inp2_enum);
  765. static const struct snd_kcontrol_new iir1_inp3_mux =
  766. SOC_DAPM_ENUM("iir1_inp3", iir1_inp3_enum);
  767. static const struct snd_kcontrol_new rx_int0_1_interp_mux =
  768. SOC_DAPM_ENUM("rx_int0_1_interp", rx_int0_1_interp_enum);
  769. static const struct snd_kcontrol_new rx_int1_1_interp_mux =
  770. SOC_DAPM_ENUM("rx_int1_1_interp", rx_int1_1_interp_enum);
  771. static const struct snd_kcontrol_new rx_int2_1_interp_mux =
  772. SOC_DAPM_ENUM("rx_int2_1_interp", rx_int2_1_interp_enum);
  773. static const struct snd_kcontrol_new rx_int0_2_interp_mux =
  774. SOC_DAPM_ENUM("rx_int0_2_interp", rx_int0_2_interp_enum);
  775. static const struct snd_kcontrol_new rx_int1_2_interp_mux =
  776. SOC_DAPM_ENUM("rx_int1_2_interp", rx_int1_2_interp_enum);
  777. static const struct snd_kcontrol_new rx_int2_2_interp_mux =
  778. SOC_DAPM_ENUM("rx_int2_2_interp", rx_int2_2_interp_enum);
  779. static const struct snd_kcontrol_new rx_mix_tx0_mux =
  780. SOC_DAPM_ENUM("RX MIX TX0_MUX Mux", rx_mix_tx0_mux_enum);
  781. static const struct reg_default rx_defaults[] = {
  782. /* RX Macro */
  783. { CDC_RX_TOP_TOP_CFG0, 0x00 },
  784. { CDC_RX_TOP_SWR_CTRL, 0x00 },
  785. { CDC_RX_TOP_DEBUG, 0x00 },
  786. { CDC_RX_TOP_DEBUG_BUS, 0x00 },
  787. { CDC_RX_TOP_DEBUG_EN0, 0x00 },
  788. { CDC_RX_TOP_DEBUG_EN1, 0x00 },
  789. { CDC_RX_TOP_DEBUG_EN2, 0x00 },
  790. { CDC_RX_TOP_HPHL_COMP_WR_LSB, 0x00 },
  791. { CDC_RX_TOP_HPHL_COMP_WR_MSB, 0x00 },
  792. { CDC_RX_TOP_HPHL_COMP_LUT, 0x00 },
  793. { CDC_RX_TOP_HPHL_COMP_RD_LSB, 0x00 },
  794. { CDC_RX_TOP_HPHL_COMP_RD_MSB, 0x00 },
  795. { CDC_RX_TOP_HPHR_COMP_WR_LSB, 0x00 },
  796. { CDC_RX_TOP_HPHR_COMP_WR_MSB, 0x00 },
  797. { CDC_RX_TOP_HPHR_COMP_LUT, 0x00 },
  798. { CDC_RX_TOP_HPHR_COMP_RD_LSB, 0x00 },
  799. { CDC_RX_TOP_HPHR_COMP_RD_MSB, 0x00 },
  800. { CDC_RX_TOP_DSD0_DEBUG_CFG0, 0x11 },
  801. { CDC_RX_TOP_DSD0_DEBUG_CFG1, 0x20 },
  802. { CDC_RX_TOP_DSD0_DEBUG_CFG2, 0x00 },
  803. { CDC_RX_TOP_DSD0_DEBUG_CFG3, 0x00 },
  804. { CDC_RX_TOP_DSD1_DEBUG_CFG0, 0x11 },
  805. { CDC_RX_TOP_DSD1_DEBUG_CFG1, 0x20 },
  806. { CDC_RX_TOP_DSD1_DEBUG_CFG2, 0x00 },
  807. { CDC_RX_TOP_DSD1_DEBUG_CFG3, 0x00 },
  808. { CDC_RX_TOP_RX_I2S_CTL, 0x0C },
  809. { CDC_RX_TOP_TX_I2S2_CTL, 0x0C },
  810. { CDC_RX_TOP_I2S_CLK, 0x0C },
  811. { CDC_RX_TOP_I2S_RESET, 0x00 },
  812. { CDC_RX_TOP_I2S_MUX, 0x00 },
  813. { CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, 0x00 },
  814. { CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, 0x00 },
  815. { CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 0x00 },
  816. { CDC_RX_CLK_RST_CTRL_DSD_CONTROL, 0x00 },
  817. { CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL, 0x08 },
  818. { CDC_RX_SOFTCLIP_CRC, 0x00 },
  819. { CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x38 },
  820. { CDC_RX_INP_MUX_RX_INT0_CFG0, 0x00 },
  821. { CDC_RX_INP_MUX_RX_INT0_CFG1, 0x00 },
  822. { CDC_RX_INP_MUX_RX_INT1_CFG0, 0x00 },
  823. { CDC_RX_INP_MUX_RX_INT1_CFG1, 0x00 },
  824. { CDC_RX_INP_MUX_RX_INT2_CFG0, 0x00 },
  825. { CDC_RX_INP_MUX_RX_INT2_CFG1, 0x00 },
  826. { CDC_RX_INP_MUX_RX_MIX_CFG4, 0x00 },
  827. { CDC_RX_INP_MUX_RX_MIX_CFG5, 0x00 },
  828. { CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0x00 },
  829. { CDC_RX_CLSH_CRC, 0x00 },
  830. { CDC_RX_CLSH_DLY_CTRL, 0x03 },
  831. { CDC_RX_CLSH_DECAY_CTRL, 0x02 },
  832. { CDC_RX_CLSH_HPH_V_PA, 0x1C },
  833. { CDC_RX_CLSH_EAR_V_PA, 0x39 },
  834. { CDC_RX_CLSH_HPH_V_HD, 0x0C },
  835. { CDC_RX_CLSH_EAR_V_HD, 0x0C },
  836. { CDC_RX_CLSH_K1_MSB, 0x01 },
  837. { CDC_RX_CLSH_K1_LSB, 0x00 },
  838. { CDC_RX_CLSH_K2_MSB, 0x00 },
  839. { CDC_RX_CLSH_K2_LSB, 0x80 },
  840. { CDC_RX_CLSH_IDLE_CTRL, 0x00 },
  841. { CDC_RX_CLSH_IDLE_HPH, 0x00 },
  842. { CDC_RX_CLSH_IDLE_EAR, 0x00 },
  843. { CDC_RX_CLSH_TEST0, 0x07 },
  844. { CDC_RX_CLSH_TEST1, 0x00 },
  845. { CDC_RX_CLSH_OVR_VREF, 0x00 },
  846. { CDC_RX_CLSH_CLSG_CTL, 0x02 },
  847. { CDC_RX_CLSH_CLSG_CFG1, 0x9A },
  848. { CDC_RX_CLSH_CLSG_CFG2, 0x10 },
  849. { CDC_RX_BCL_VBAT_PATH_CTL, 0x00 },
  850. { CDC_RX_BCL_VBAT_CFG, 0x10 },
  851. { CDC_RX_BCL_VBAT_ADC_CAL1, 0x00 },
  852. { CDC_RX_BCL_VBAT_ADC_CAL2, 0x00 },
  853. { CDC_RX_BCL_VBAT_ADC_CAL3, 0x04 },
  854. { CDC_RX_BCL_VBAT_PK_EST1, 0xE0 },
  855. { CDC_RX_BCL_VBAT_PK_EST2, 0x01 },
  856. { CDC_RX_BCL_VBAT_PK_EST3, 0x40 },
  857. { CDC_RX_BCL_VBAT_RF_PROC1, 0x2A },
  858. { CDC_RX_BCL_VBAT_RF_PROC1, 0x00 },
  859. { CDC_RX_BCL_VBAT_TAC1, 0x00 },
  860. { CDC_RX_BCL_VBAT_TAC2, 0x18 },
  861. { CDC_RX_BCL_VBAT_TAC3, 0x18 },
  862. { CDC_RX_BCL_VBAT_TAC4, 0x03 },
  863. { CDC_RX_BCL_VBAT_GAIN_UPD1, 0x01 },
  864. { CDC_RX_BCL_VBAT_GAIN_UPD2, 0x00 },
  865. { CDC_RX_BCL_VBAT_GAIN_UPD3, 0x00 },
  866. { CDC_RX_BCL_VBAT_GAIN_UPD4, 0x64 },
  867. { CDC_RX_BCL_VBAT_GAIN_UPD5, 0x01 },
  868. { CDC_RX_BCL_VBAT_DEBUG1, 0x00 },
  869. { CDC_RX_BCL_VBAT_GAIN_UPD_MON, 0x00 },
  870. { CDC_RX_BCL_VBAT_GAIN_MON_VAL, 0x00 },
  871. { CDC_RX_BCL_VBAT_BAN, 0x0C },
  872. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD1, 0x00 },
  873. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD2, 0x77 },
  874. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD3, 0x01 },
  875. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD4, 0x00 },
  876. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD5, 0x4B },
  877. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD6, 0x00 },
  878. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD7, 0x01 },
  879. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD8, 0x00 },
  880. { CDC_RX_BCL_VBAT_BCL_GAIN_UPD9, 0x00 },
  881. { CDC_RX_BCL_VBAT_ATTN1, 0x04 },
  882. { CDC_RX_BCL_VBAT_ATTN2, 0x08 },
  883. { CDC_RX_BCL_VBAT_ATTN3, 0x0C },
  884. { CDC_RX_BCL_VBAT_DECODE_CTL1, 0xE0 },
  885. { CDC_RX_BCL_VBAT_DECODE_CTL2, 0x00 },
  886. { CDC_RX_BCL_VBAT_DECODE_CFG1, 0x00 },
  887. { CDC_RX_BCL_VBAT_DECODE_CFG2, 0x00 },
  888. { CDC_RX_BCL_VBAT_DECODE_CFG3, 0x00 },
  889. { CDC_RX_BCL_VBAT_DECODE_CFG4, 0x00 },
  890. { CDC_RX_BCL_VBAT_DECODE_ST, 0x00 },
  891. { CDC_RX_INTR_CTRL_CFG, 0x00 },
  892. { CDC_RX_INTR_CTRL_CLR_COMMIT, 0x00 },
  893. { CDC_RX_INTR_CTRL_PIN1_MASK0, 0xFF },
  894. { CDC_RX_INTR_CTRL_PIN1_STATUS0, 0x00 },
  895. { CDC_RX_INTR_CTRL_PIN1_CLEAR0, 0x00 },
  896. { CDC_RX_INTR_CTRL_PIN2_MASK0, 0xFF },
  897. { CDC_RX_INTR_CTRL_PIN2_STATUS0, 0x00 },
  898. { CDC_RX_INTR_CTRL_PIN2_CLEAR0, 0x00 },
  899. { CDC_RX_INTR_CTRL_LEVEL0, 0x00 },
  900. { CDC_RX_INTR_CTRL_BYPASS0, 0x00 },
  901. { CDC_RX_INTR_CTRL_SET0, 0x00 },
  902. { CDC_RX_RX0_RX_PATH_CTL, 0x04 },
  903. { CDC_RX_RX0_RX_PATH_CFG0, 0x00 },
  904. { CDC_RX_RX0_RX_PATH_CFG1, 0x64 },
  905. { CDC_RX_RX0_RX_PATH_CFG2, 0x8F },
  906. { CDC_RX_RX0_RX_PATH_CFG3, 0x00 },
  907. { CDC_RX_RX0_RX_VOL_CTL, 0x00 },
  908. { CDC_RX_RX0_RX_PATH_MIX_CTL, 0x04 },
  909. { CDC_RX_RX0_RX_PATH_MIX_CFG, 0x7E },
  910. { CDC_RX_RX0_RX_VOL_MIX_CTL, 0x00 },
  911. { CDC_RX_RX0_RX_PATH_SEC1, 0x08 },
  912. { CDC_RX_RX0_RX_PATH_SEC2, 0x00 },
  913. { CDC_RX_RX0_RX_PATH_SEC3, 0x00 },
  914. { CDC_RX_RX0_RX_PATH_SEC4, 0x00 },
  915. { CDC_RX_RX0_RX_PATH_SEC7, 0x00 },
  916. { CDC_RX_RX0_RX_PATH_MIX_SEC0, 0x08 },
  917. { CDC_RX_RX0_RX_PATH_MIX_SEC1, 0x00 },
  918. { CDC_RX_RX0_RX_PATH_DSM_CTL, 0x08 },
  919. { CDC_RX_RX0_RX_PATH_DSM_DATA1, 0x00 },
  920. { CDC_RX_RX0_RX_PATH_DSM_DATA2, 0x00 },
  921. { CDC_RX_RX0_RX_PATH_DSM_DATA3, 0x00 },
  922. { CDC_RX_RX0_RX_PATH_DSM_DATA4, 0x55 },
  923. { CDC_RX_RX0_RX_PATH_DSM_DATA5, 0x55 },
  924. { CDC_RX_RX0_RX_PATH_DSM_DATA6, 0x55 },
  925. { CDC_RX_RX1_RX_PATH_CTL, 0x04 },
  926. { CDC_RX_RX1_RX_PATH_CFG0, 0x00 },
  927. { CDC_RX_RX1_RX_PATH_CFG1, 0x64 },
  928. { CDC_RX_RX1_RX_PATH_CFG2, 0x8F },
  929. { CDC_RX_RX1_RX_PATH_CFG3, 0x00 },
  930. { CDC_RX_RX1_RX_VOL_CTL, 0x00 },
  931. { CDC_RX_RX1_RX_PATH_MIX_CTL, 0x04 },
  932. { CDC_RX_RX1_RX_PATH_MIX_CFG, 0x7E },
  933. { CDC_RX_RX1_RX_VOL_MIX_CTL, 0x00 },
  934. { CDC_RX_RX1_RX_PATH_SEC1, 0x08 },
  935. { CDC_RX_RX1_RX_PATH_SEC2, 0x00 },
  936. { CDC_RX_RX1_RX_PATH_SEC3, 0x00 },
  937. { CDC_RX_RX1_RX_PATH_SEC4, 0x00 },
  938. { CDC_RX_RX1_RX_PATH_SEC7, 0x00 },
  939. { CDC_RX_RX1_RX_PATH_MIX_SEC0, 0x08 },
  940. { CDC_RX_RX1_RX_PATH_MIX_SEC1, 0x00 },
  941. { CDC_RX_RX1_RX_PATH_DSM_CTL, 0x08 },
  942. { CDC_RX_RX1_RX_PATH_DSM_DATA1, 0x00 },
  943. { CDC_RX_RX1_RX_PATH_DSM_DATA2, 0x00 },
  944. { CDC_RX_RX1_RX_PATH_DSM_DATA3, 0x00 },
  945. { CDC_RX_RX1_RX_PATH_DSM_DATA4, 0x55 },
  946. { CDC_RX_RX1_RX_PATH_DSM_DATA5, 0x55 },
  947. { CDC_RX_RX1_RX_PATH_DSM_DATA6, 0x55 },
  948. { CDC_RX_RX2_RX_PATH_CTL, 0x04 },
  949. { CDC_RX_RX2_RX_PATH_CFG0, 0x00 },
  950. { CDC_RX_RX2_RX_PATH_CFG1, 0x64 },
  951. { CDC_RX_RX2_RX_PATH_CFG2, 0x8F },
  952. { CDC_RX_RX2_RX_PATH_CFG3, 0x00 },
  953. { CDC_RX_RX2_RX_VOL_CTL, 0x00 },
  954. { CDC_RX_RX2_RX_PATH_MIX_CTL, 0x04 },
  955. { CDC_RX_RX2_RX_PATH_MIX_CFG, 0x7E },
  956. { CDC_RX_RX2_RX_VOL_MIX_CTL, 0x00 },
  957. { CDC_RX_RX2_RX_PATH_SEC0, 0x04 },
  958. { CDC_RX_RX2_RX_PATH_SEC1, 0x08 },
  959. { CDC_RX_RX2_RX_PATH_SEC2, 0x00 },
  960. { CDC_RX_RX2_RX_PATH_SEC3, 0x00 },
  961. { CDC_RX_RX2_RX_PATH_SEC4, 0x00 },
  962. { CDC_RX_RX2_RX_PATH_SEC5, 0x00 },
  963. { CDC_RX_RX2_RX_PATH_SEC6, 0x00 },
  964. { CDC_RX_RX2_RX_PATH_SEC7, 0x00 },
  965. { CDC_RX_RX2_RX_PATH_MIX_SEC0, 0x08 },
  966. { CDC_RX_RX2_RX_PATH_MIX_SEC1, 0x00 },
  967. { CDC_RX_RX2_RX_PATH_DSM_CTL, 0x00 },
  968. { CDC_RX_IDLE_DETECT_PATH_CTL, 0x00 },
  969. { CDC_RX_IDLE_DETECT_CFG0, 0x07 },
  970. { CDC_RX_IDLE_DETECT_CFG1, 0x3C },
  971. { CDC_RX_IDLE_DETECT_CFG2, 0x00 },
  972. { CDC_RX_IDLE_DETECT_CFG3, 0x00 },
  973. { CDC_RX_COMPANDER0_CTL0, 0x60 },
  974. { CDC_RX_COMPANDER0_CTL1, 0xDB },
  975. { CDC_RX_COMPANDER0_CTL2, 0xFF },
  976. { CDC_RX_COMPANDER0_CTL3, 0x35 },
  977. { CDC_RX_COMPANDER0_CTL4, 0xFF },
  978. { CDC_RX_COMPANDER0_CTL5, 0x00 },
  979. { CDC_RX_COMPANDER0_CTL6, 0x01 },
  980. { CDC_RX_COMPANDER0_CTL7, 0x28 },
  981. { CDC_RX_COMPANDER1_CTL0, 0x60 },
  982. { CDC_RX_COMPANDER1_CTL1, 0xDB },
  983. { CDC_RX_COMPANDER1_CTL2, 0xFF },
  984. { CDC_RX_COMPANDER1_CTL3, 0x35 },
  985. { CDC_RX_COMPANDER1_CTL4, 0xFF },
  986. { CDC_RX_COMPANDER1_CTL5, 0x00 },
  987. { CDC_RX_COMPANDER1_CTL6, 0x01 },
  988. { CDC_RX_COMPANDER1_CTL7, 0x28 },
  989. { CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL, 0x00 },
  990. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0x00 },
  991. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0x00 },
  992. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0x00 },
  993. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0x00 },
  994. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL, 0x00 },
  995. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL, 0x00 },
  996. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL, 0x00 },
  997. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL, 0x00 },
  998. { CDC_RX_SIDETONE_IIR0_IIR_CTL, 0x40 },
  999. { CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL, 0x00 },
  1000. { CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL, 0x00 },
  1001. { CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL, 0x00 },
  1002. { CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL, 0x00 },
  1003. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0x00 },
  1004. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0x00 },
  1005. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0x00 },
  1006. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0x00 },
  1007. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL, 0x00 },
  1008. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL, 0x00 },
  1009. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL, 0x00 },
  1010. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL, 0x00 },
  1011. { CDC_RX_SIDETONE_IIR1_IIR_CTL, 0x40 },
  1012. { CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL, 0x00 },
  1013. { CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL, 0x00 },
  1014. { CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL, 0x00 },
  1015. { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0x00 },
  1016. { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0x00 },
  1017. { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0x00 },
  1018. { CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0x00 },
  1019. { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0x00 },
  1020. { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0x00 },
  1021. { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0x00 },
  1022. { CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0x00 },
  1023. { CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL, 0x04 },
  1024. { CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1, 0x00 },
  1025. { CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL, 0x04 },
  1026. { CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1, 0x00 },
  1027. { CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL, 0x00 },
  1028. { CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0, 0x01 },
  1029. { CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL, 0x00 },
  1030. { CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0, 0x01 },
  1031. { CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL, 0x00 },
  1032. { CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0, 0x01 },
  1033. { CDC_RX_EC_ASRC0_CLK_RST_CTL, 0x00 },
  1034. { CDC_RX_EC_ASRC0_CTL0, 0x00 },
  1035. { CDC_RX_EC_ASRC0_CTL1, 0x00 },
  1036. { CDC_RX_EC_ASRC0_FIFO_CTL, 0xA8 },
  1037. { CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB, 0x00 },
  1038. { CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB, 0x00 },
  1039. { CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB, 0x00 },
  1040. { CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB, 0x00 },
  1041. { CDC_RX_EC_ASRC0_STATUS_FIFO, 0x00 },
  1042. { CDC_RX_EC_ASRC1_CLK_RST_CTL, 0x00 },
  1043. { CDC_RX_EC_ASRC1_CTL0, 0x00 },
  1044. { CDC_RX_EC_ASRC1_CTL1, 0x00 },
  1045. { CDC_RX_EC_ASRC1_FIFO_CTL, 0xA8 },
  1046. { CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB, 0x00 },
  1047. { CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB, 0x00 },
  1048. { CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB, 0x00 },
  1049. { CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB, 0x00 },
  1050. { CDC_RX_EC_ASRC1_STATUS_FIFO, 0x00 },
  1051. { CDC_RX_EC_ASRC2_CLK_RST_CTL, 0x00 },
  1052. { CDC_RX_EC_ASRC2_CTL0, 0x00 },
  1053. { CDC_RX_EC_ASRC2_CTL1, 0x00 },
  1054. { CDC_RX_EC_ASRC2_FIFO_CTL, 0xA8 },
  1055. { CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB, 0x00 },
  1056. { CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB, 0x00 },
  1057. { CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB, 0x00 },
  1058. { CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB, 0x00 },
  1059. { CDC_RX_EC_ASRC2_STATUS_FIFO, 0x00 },
  1060. { CDC_RX_DSD0_PATH_CTL, 0x00 },
  1061. { CDC_RX_DSD0_CFG0, 0x00 },
  1062. { CDC_RX_DSD0_CFG1, 0x62 },
  1063. { CDC_RX_DSD0_CFG2, 0x96 },
  1064. { CDC_RX_DSD1_PATH_CTL, 0x00 },
  1065. { CDC_RX_DSD1_CFG0, 0x00 },
  1066. { CDC_RX_DSD1_CFG1, 0x62 },
  1067. { CDC_RX_DSD1_CFG2, 0x96 },
  1068. };
  1069. static bool rx_is_wronly_register(struct device *dev,
  1070. unsigned int reg)
  1071. {
  1072. switch (reg) {
  1073. case CDC_RX_BCL_VBAT_GAIN_UPD_MON:
  1074. case CDC_RX_INTR_CTRL_CLR_COMMIT:
  1075. case CDC_RX_INTR_CTRL_PIN1_CLEAR0:
  1076. case CDC_RX_INTR_CTRL_PIN2_CLEAR0:
  1077. return true;
  1078. }
  1079. return false;
  1080. }
  1081. static bool rx_is_volatile_register(struct device *dev, unsigned int reg)
  1082. {
  1083. /* Update volatile list for rx/tx macros */
  1084. switch (reg) {
  1085. case CDC_RX_TOP_HPHL_COMP_RD_LSB:
  1086. case CDC_RX_TOP_HPHL_COMP_WR_LSB:
  1087. case CDC_RX_TOP_HPHL_COMP_RD_MSB:
  1088. case CDC_RX_TOP_HPHL_COMP_WR_MSB:
  1089. case CDC_RX_TOP_HPHR_COMP_RD_LSB:
  1090. case CDC_RX_TOP_HPHR_COMP_WR_LSB:
  1091. case CDC_RX_TOP_HPHR_COMP_RD_MSB:
  1092. case CDC_RX_TOP_HPHR_COMP_WR_MSB:
  1093. case CDC_RX_TOP_DSD0_DEBUG_CFG2:
  1094. case CDC_RX_TOP_DSD1_DEBUG_CFG2:
  1095. case CDC_RX_BCL_VBAT_GAIN_MON_VAL:
  1096. case CDC_RX_BCL_VBAT_DECODE_ST:
  1097. case CDC_RX_INTR_CTRL_PIN1_STATUS0:
  1098. case CDC_RX_INTR_CTRL_PIN2_STATUS0:
  1099. case CDC_RX_COMPANDER0_CTL6:
  1100. case CDC_RX_COMPANDER1_CTL6:
  1101. case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB:
  1102. case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB:
  1103. case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB:
  1104. case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB:
  1105. case CDC_RX_EC_ASRC0_STATUS_FIFO:
  1106. case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB:
  1107. case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB:
  1108. case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB:
  1109. case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB:
  1110. case CDC_RX_EC_ASRC1_STATUS_FIFO:
  1111. case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB:
  1112. case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB:
  1113. case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB:
  1114. case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB:
  1115. case CDC_RX_EC_ASRC2_STATUS_FIFO:
  1116. return true;
  1117. }
  1118. return false;
  1119. }
  1120. static bool rx_is_rw_register(struct device *dev, unsigned int reg)
  1121. {
  1122. switch (reg) {
  1123. case CDC_RX_TOP_TOP_CFG0:
  1124. case CDC_RX_TOP_SWR_CTRL:
  1125. case CDC_RX_TOP_DEBUG:
  1126. case CDC_RX_TOP_DEBUG_BUS:
  1127. case CDC_RX_TOP_DEBUG_EN0:
  1128. case CDC_RX_TOP_DEBUG_EN1:
  1129. case CDC_RX_TOP_DEBUG_EN2:
  1130. case CDC_RX_TOP_HPHL_COMP_WR_LSB:
  1131. case CDC_RX_TOP_HPHL_COMP_WR_MSB:
  1132. case CDC_RX_TOP_HPHL_COMP_LUT:
  1133. case CDC_RX_TOP_HPHR_COMP_WR_LSB:
  1134. case CDC_RX_TOP_HPHR_COMP_WR_MSB:
  1135. case CDC_RX_TOP_HPHR_COMP_LUT:
  1136. case CDC_RX_TOP_DSD0_DEBUG_CFG0:
  1137. case CDC_RX_TOP_DSD0_DEBUG_CFG1:
  1138. case CDC_RX_TOP_DSD0_DEBUG_CFG3:
  1139. case CDC_RX_TOP_DSD1_DEBUG_CFG0:
  1140. case CDC_RX_TOP_DSD1_DEBUG_CFG1:
  1141. case CDC_RX_TOP_DSD1_DEBUG_CFG3:
  1142. case CDC_RX_TOP_RX_I2S_CTL:
  1143. case CDC_RX_TOP_TX_I2S2_CTL:
  1144. case CDC_RX_TOP_I2S_CLK:
  1145. case CDC_RX_TOP_I2S_RESET:
  1146. case CDC_RX_TOP_I2S_MUX:
  1147. case CDC_RX_CLK_RST_CTRL_MCLK_CONTROL:
  1148. case CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL:
  1149. case CDC_RX_CLK_RST_CTRL_SWR_CONTROL:
  1150. case CDC_RX_CLK_RST_CTRL_DSD_CONTROL:
  1151. case CDC_RX_CLK_RST_CTRL_ASRC_SHARE_CONTROL:
  1152. case CDC_RX_SOFTCLIP_CRC:
  1153. case CDC_RX_SOFTCLIP_SOFTCLIP_CTRL:
  1154. case CDC_RX_INP_MUX_RX_INT0_CFG0:
  1155. case CDC_RX_INP_MUX_RX_INT0_CFG1:
  1156. case CDC_RX_INP_MUX_RX_INT1_CFG0:
  1157. case CDC_RX_INP_MUX_RX_INT1_CFG1:
  1158. case CDC_RX_INP_MUX_RX_INT2_CFG0:
  1159. case CDC_RX_INP_MUX_RX_INT2_CFG1:
  1160. case CDC_RX_INP_MUX_RX_MIX_CFG4:
  1161. case CDC_RX_INP_MUX_RX_MIX_CFG5:
  1162. case CDC_RX_INP_MUX_SIDETONE_SRC_CFG0:
  1163. case CDC_RX_CLSH_CRC:
  1164. case CDC_RX_CLSH_DLY_CTRL:
  1165. case CDC_RX_CLSH_DECAY_CTRL:
  1166. case CDC_RX_CLSH_HPH_V_PA:
  1167. case CDC_RX_CLSH_EAR_V_PA:
  1168. case CDC_RX_CLSH_HPH_V_HD:
  1169. case CDC_RX_CLSH_EAR_V_HD:
  1170. case CDC_RX_CLSH_K1_MSB:
  1171. case CDC_RX_CLSH_K1_LSB:
  1172. case CDC_RX_CLSH_K2_MSB:
  1173. case CDC_RX_CLSH_K2_LSB:
  1174. case CDC_RX_CLSH_IDLE_CTRL:
  1175. case CDC_RX_CLSH_IDLE_HPH:
  1176. case CDC_RX_CLSH_IDLE_EAR:
  1177. case CDC_RX_CLSH_TEST0:
  1178. case CDC_RX_CLSH_TEST1:
  1179. case CDC_RX_CLSH_OVR_VREF:
  1180. case CDC_RX_CLSH_CLSG_CTL:
  1181. case CDC_RX_CLSH_CLSG_CFG1:
  1182. case CDC_RX_CLSH_CLSG_CFG2:
  1183. case CDC_RX_BCL_VBAT_PATH_CTL:
  1184. case CDC_RX_BCL_VBAT_CFG:
  1185. case CDC_RX_BCL_VBAT_ADC_CAL1:
  1186. case CDC_RX_BCL_VBAT_ADC_CAL2:
  1187. case CDC_RX_BCL_VBAT_ADC_CAL3:
  1188. case CDC_RX_BCL_VBAT_PK_EST1:
  1189. case CDC_RX_BCL_VBAT_PK_EST2:
  1190. case CDC_RX_BCL_VBAT_PK_EST3:
  1191. case CDC_RX_BCL_VBAT_RF_PROC1:
  1192. case CDC_RX_BCL_VBAT_RF_PROC2:
  1193. case CDC_RX_BCL_VBAT_TAC1:
  1194. case CDC_RX_BCL_VBAT_TAC2:
  1195. case CDC_RX_BCL_VBAT_TAC3:
  1196. case CDC_RX_BCL_VBAT_TAC4:
  1197. case CDC_RX_BCL_VBAT_GAIN_UPD1:
  1198. case CDC_RX_BCL_VBAT_GAIN_UPD2:
  1199. case CDC_RX_BCL_VBAT_GAIN_UPD3:
  1200. case CDC_RX_BCL_VBAT_GAIN_UPD4:
  1201. case CDC_RX_BCL_VBAT_GAIN_UPD5:
  1202. case CDC_RX_BCL_VBAT_DEBUG1:
  1203. case CDC_RX_BCL_VBAT_BAN:
  1204. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD1:
  1205. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD2:
  1206. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD3:
  1207. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD4:
  1208. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD5:
  1209. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD6:
  1210. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD7:
  1211. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD8:
  1212. case CDC_RX_BCL_VBAT_BCL_GAIN_UPD9:
  1213. case CDC_RX_BCL_VBAT_ATTN1:
  1214. case CDC_RX_BCL_VBAT_ATTN2:
  1215. case CDC_RX_BCL_VBAT_ATTN3:
  1216. case CDC_RX_BCL_VBAT_DECODE_CTL1:
  1217. case CDC_RX_BCL_VBAT_DECODE_CTL2:
  1218. case CDC_RX_BCL_VBAT_DECODE_CFG1:
  1219. case CDC_RX_BCL_VBAT_DECODE_CFG2:
  1220. case CDC_RX_BCL_VBAT_DECODE_CFG3:
  1221. case CDC_RX_BCL_VBAT_DECODE_CFG4:
  1222. case CDC_RX_INTR_CTRL_CFG:
  1223. case CDC_RX_INTR_CTRL_PIN1_MASK0:
  1224. case CDC_RX_INTR_CTRL_PIN2_MASK0:
  1225. case CDC_RX_INTR_CTRL_LEVEL0:
  1226. case CDC_RX_INTR_CTRL_BYPASS0:
  1227. case CDC_RX_INTR_CTRL_SET0:
  1228. case CDC_RX_RX0_RX_PATH_CTL:
  1229. case CDC_RX_RX0_RX_PATH_CFG0:
  1230. case CDC_RX_RX0_RX_PATH_CFG1:
  1231. case CDC_RX_RX0_RX_PATH_CFG2:
  1232. case CDC_RX_RX0_RX_PATH_CFG3:
  1233. case CDC_RX_RX0_RX_VOL_CTL:
  1234. case CDC_RX_RX0_RX_PATH_MIX_CTL:
  1235. case CDC_RX_RX0_RX_PATH_MIX_CFG:
  1236. case CDC_RX_RX0_RX_VOL_MIX_CTL:
  1237. case CDC_RX_RX0_RX_PATH_SEC1:
  1238. case CDC_RX_RX0_RX_PATH_SEC2:
  1239. case CDC_RX_RX0_RX_PATH_SEC3:
  1240. case CDC_RX_RX0_RX_PATH_SEC4:
  1241. case CDC_RX_RX0_RX_PATH_SEC7:
  1242. case CDC_RX_RX0_RX_PATH_MIX_SEC0:
  1243. case CDC_RX_RX0_RX_PATH_MIX_SEC1:
  1244. case CDC_RX_RX0_RX_PATH_DSM_CTL:
  1245. case CDC_RX_RX0_RX_PATH_DSM_DATA1:
  1246. case CDC_RX_RX0_RX_PATH_DSM_DATA2:
  1247. case CDC_RX_RX0_RX_PATH_DSM_DATA3:
  1248. case CDC_RX_RX0_RX_PATH_DSM_DATA4:
  1249. case CDC_RX_RX0_RX_PATH_DSM_DATA5:
  1250. case CDC_RX_RX0_RX_PATH_DSM_DATA6:
  1251. case CDC_RX_RX1_RX_PATH_CTL:
  1252. case CDC_RX_RX1_RX_PATH_CFG0:
  1253. case CDC_RX_RX1_RX_PATH_CFG1:
  1254. case CDC_RX_RX1_RX_PATH_CFG2:
  1255. case CDC_RX_RX1_RX_PATH_CFG3:
  1256. case CDC_RX_RX1_RX_VOL_CTL:
  1257. case CDC_RX_RX1_RX_PATH_MIX_CTL:
  1258. case CDC_RX_RX1_RX_PATH_MIX_CFG:
  1259. case CDC_RX_RX1_RX_VOL_MIX_CTL:
  1260. case CDC_RX_RX1_RX_PATH_SEC1:
  1261. case CDC_RX_RX1_RX_PATH_SEC2:
  1262. case CDC_RX_RX1_RX_PATH_SEC3:
  1263. case CDC_RX_RX1_RX_PATH_SEC4:
  1264. case CDC_RX_RX1_RX_PATH_SEC7:
  1265. case CDC_RX_RX1_RX_PATH_MIX_SEC0:
  1266. case CDC_RX_RX1_RX_PATH_MIX_SEC1:
  1267. case CDC_RX_RX1_RX_PATH_DSM_CTL:
  1268. case CDC_RX_RX1_RX_PATH_DSM_DATA1:
  1269. case CDC_RX_RX1_RX_PATH_DSM_DATA2:
  1270. case CDC_RX_RX1_RX_PATH_DSM_DATA3:
  1271. case CDC_RX_RX1_RX_PATH_DSM_DATA4:
  1272. case CDC_RX_RX1_RX_PATH_DSM_DATA5:
  1273. case CDC_RX_RX1_RX_PATH_DSM_DATA6:
  1274. case CDC_RX_RX2_RX_PATH_CTL:
  1275. case CDC_RX_RX2_RX_PATH_CFG0:
  1276. case CDC_RX_RX2_RX_PATH_CFG1:
  1277. case CDC_RX_RX2_RX_PATH_CFG2:
  1278. case CDC_RX_RX2_RX_PATH_CFG3:
  1279. case CDC_RX_RX2_RX_VOL_CTL:
  1280. case CDC_RX_RX2_RX_PATH_MIX_CTL:
  1281. case CDC_RX_RX2_RX_PATH_MIX_CFG:
  1282. case CDC_RX_RX2_RX_VOL_MIX_CTL:
  1283. case CDC_RX_RX2_RX_PATH_SEC0:
  1284. case CDC_RX_RX2_RX_PATH_SEC1:
  1285. case CDC_RX_RX2_RX_PATH_SEC2:
  1286. case CDC_RX_RX2_RX_PATH_SEC3:
  1287. case CDC_RX_RX2_RX_PATH_SEC4:
  1288. case CDC_RX_RX2_RX_PATH_SEC5:
  1289. case CDC_RX_RX2_RX_PATH_SEC6:
  1290. case CDC_RX_RX2_RX_PATH_SEC7:
  1291. case CDC_RX_RX2_RX_PATH_MIX_SEC0:
  1292. case CDC_RX_RX2_RX_PATH_MIX_SEC1:
  1293. case CDC_RX_RX2_RX_PATH_DSM_CTL:
  1294. case CDC_RX_IDLE_DETECT_PATH_CTL:
  1295. case CDC_RX_IDLE_DETECT_CFG0:
  1296. case CDC_RX_IDLE_DETECT_CFG1:
  1297. case CDC_RX_IDLE_DETECT_CFG2:
  1298. case CDC_RX_IDLE_DETECT_CFG3:
  1299. case CDC_RX_COMPANDER0_CTL0:
  1300. case CDC_RX_COMPANDER0_CTL1:
  1301. case CDC_RX_COMPANDER0_CTL2:
  1302. case CDC_RX_COMPANDER0_CTL3:
  1303. case CDC_RX_COMPANDER0_CTL4:
  1304. case CDC_RX_COMPANDER0_CTL5:
  1305. case CDC_RX_COMPANDER0_CTL7:
  1306. case CDC_RX_COMPANDER1_CTL0:
  1307. case CDC_RX_COMPANDER1_CTL1:
  1308. case CDC_RX_COMPANDER1_CTL2:
  1309. case CDC_RX_COMPANDER1_CTL3:
  1310. case CDC_RX_COMPANDER1_CTL4:
  1311. case CDC_RX_COMPANDER1_CTL5:
  1312. case CDC_RX_COMPANDER1_CTL7:
  1313. case CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL:
  1314. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL:
  1315. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL:
  1316. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL:
  1317. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL:
  1318. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B5_CTL:
  1319. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B6_CTL:
  1320. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B7_CTL:
  1321. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_B8_CTL:
  1322. case CDC_RX_SIDETONE_IIR0_IIR_CTL:
  1323. case CDC_RX_SIDETONE_IIR0_IIR_GAIN_TIMER_CTL:
  1324. case CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL:
  1325. case CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL:
  1326. case CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL:
  1327. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL:
  1328. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL:
  1329. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL:
  1330. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL:
  1331. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B5_CTL:
  1332. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B6_CTL:
  1333. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B7_CTL:
  1334. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_B8_CTL:
  1335. case CDC_RX_SIDETONE_IIR1_IIR_CTL:
  1336. case CDC_RX_SIDETONE_IIR1_IIR_GAIN_TIMER_CTL:
  1337. case CDC_RX_SIDETONE_IIR1_IIR_COEF_B1_CTL:
  1338. case CDC_RX_SIDETONE_IIR1_IIR_COEF_B2_CTL:
  1339. case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0:
  1340. case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1:
  1341. case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2:
  1342. case CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3:
  1343. case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0:
  1344. case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1:
  1345. case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2:
  1346. case CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3:
  1347. case CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL:
  1348. case CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CFG1:
  1349. case CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL:
  1350. case CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CFG1:
  1351. case CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL:
  1352. case CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0:
  1353. case CDC_RX_EC_REF_HQ1_EC_REF_HQ_PATH_CTL:
  1354. case CDC_RX_EC_REF_HQ1_EC_REF_HQ_CFG0:
  1355. case CDC_RX_EC_REF_HQ2_EC_REF_HQ_PATH_CTL:
  1356. case CDC_RX_EC_REF_HQ2_EC_REF_HQ_CFG0:
  1357. case CDC_RX_EC_ASRC0_CLK_RST_CTL:
  1358. case CDC_RX_EC_ASRC0_CTL0:
  1359. case CDC_RX_EC_ASRC0_CTL1:
  1360. case CDC_RX_EC_ASRC0_FIFO_CTL:
  1361. case CDC_RX_EC_ASRC1_CLK_RST_CTL:
  1362. case CDC_RX_EC_ASRC1_CTL0:
  1363. case CDC_RX_EC_ASRC1_CTL1:
  1364. case CDC_RX_EC_ASRC1_FIFO_CTL:
  1365. case CDC_RX_EC_ASRC2_CLK_RST_CTL:
  1366. case CDC_RX_EC_ASRC2_CTL0:
  1367. case CDC_RX_EC_ASRC2_CTL1:
  1368. case CDC_RX_EC_ASRC2_FIFO_CTL:
  1369. case CDC_RX_DSD0_PATH_CTL:
  1370. case CDC_RX_DSD0_CFG0:
  1371. case CDC_RX_DSD0_CFG1:
  1372. case CDC_RX_DSD0_CFG2:
  1373. case CDC_RX_DSD1_PATH_CTL:
  1374. case CDC_RX_DSD1_CFG0:
  1375. case CDC_RX_DSD1_CFG1:
  1376. case CDC_RX_DSD1_CFG2:
  1377. return true;
  1378. }
  1379. return false;
  1380. }
  1381. static bool rx_is_writeable_register(struct device *dev, unsigned int reg)
  1382. {
  1383. bool ret;
  1384. ret = rx_is_rw_register(dev, reg);
  1385. if (!ret)
  1386. return rx_is_wronly_register(dev, reg);
  1387. return ret;
  1388. }
  1389. static bool rx_is_readable_register(struct device *dev, unsigned int reg)
  1390. {
  1391. switch (reg) {
  1392. case CDC_RX_TOP_HPHL_COMP_RD_LSB:
  1393. case CDC_RX_TOP_HPHL_COMP_RD_MSB:
  1394. case CDC_RX_TOP_HPHR_COMP_RD_LSB:
  1395. case CDC_RX_TOP_HPHR_COMP_RD_MSB:
  1396. case CDC_RX_TOP_DSD0_DEBUG_CFG2:
  1397. case CDC_RX_TOP_DSD1_DEBUG_CFG2:
  1398. case CDC_RX_BCL_VBAT_GAIN_MON_VAL:
  1399. case CDC_RX_BCL_VBAT_DECODE_ST:
  1400. case CDC_RX_INTR_CTRL_PIN1_STATUS0:
  1401. case CDC_RX_INTR_CTRL_PIN2_STATUS0:
  1402. case CDC_RX_COMPANDER0_CTL6:
  1403. case CDC_RX_COMPANDER1_CTL6:
  1404. case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_LSB:
  1405. case CDC_RX_EC_ASRC0_STATUS_FMIN_CNTR_MSB:
  1406. case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_LSB:
  1407. case CDC_RX_EC_ASRC0_STATUS_FMAX_CNTR_MSB:
  1408. case CDC_RX_EC_ASRC0_STATUS_FIFO:
  1409. case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_LSB:
  1410. case CDC_RX_EC_ASRC1_STATUS_FMIN_CNTR_MSB:
  1411. case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_LSB:
  1412. case CDC_RX_EC_ASRC1_STATUS_FMAX_CNTR_MSB:
  1413. case CDC_RX_EC_ASRC1_STATUS_FIFO:
  1414. case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_LSB:
  1415. case CDC_RX_EC_ASRC2_STATUS_FMIN_CNTR_MSB:
  1416. case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_LSB:
  1417. case CDC_RX_EC_ASRC2_STATUS_FMAX_CNTR_MSB:
  1418. case CDC_RX_EC_ASRC2_STATUS_FIFO:
  1419. return true;
  1420. }
  1421. return rx_is_rw_register(dev, reg);
  1422. }
  1423. static const struct regmap_config rx_regmap_config = {
  1424. .name = "rx_macro",
  1425. .reg_bits = 16,
  1426. .val_bits = 32, /* 8 but with 32 bit read/write */
  1427. .reg_stride = 4,
  1428. .cache_type = REGCACHE_FLAT,
  1429. .reg_defaults = rx_defaults,
  1430. .num_reg_defaults = ARRAY_SIZE(rx_defaults),
  1431. .max_register = RX_MAX_OFFSET,
  1432. .writeable_reg = rx_is_writeable_register,
  1433. .volatile_reg = rx_is_volatile_register,
  1434. .readable_reg = rx_is_readable_register,
  1435. };
  1436. static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol,
  1437. struct snd_ctl_elem_value *ucontrol)
  1438. {
  1439. struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
  1440. struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
  1441. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  1442. unsigned short look_ahead_dly_reg;
  1443. unsigned int val;
  1444. val = ucontrol->value.enumerated.item[0];
  1445. if (e->reg == CDC_RX_RX0_RX_PATH_CFG1)
  1446. look_ahead_dly_reg = CDC_RX_RX0_RX_PATH_CFG0;
  1447. else if (e->reg == CDC_RX_RX1_RX_PATH_CFG1)
  1448. look_ahead_dly_reg = CDC_RX_RX1_RX_PATH_CFG0;
  1449. /* Set Look Ahead Delay */
  1450. if (val)
  1451. snd_soc_component_update_bits(component, look_ahead_dly_reg,
  1452. CDC_RX_DLY_ZN_EN_MASK,
  1453. CDC_RX_DLY_ZN_ENABLE);
  1454. else
  1455. snd_soc_component_update_bits(component, look_ahead_dly_reg,
  1456. CDC_RX_DLY_ZN_EN_MASK, 0);
  1457. /* Set DEM INP Select */
  1458. return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
  1459. }
  1460. static const struct snd_kcontrol_new rx_int0_dem_inp_mux =
  1461. SOC_DAPM_ENUM_EXT("rx_int0_dem_inp", rx_int0_dem_inp_enum,
  1462. snd_soc_dapm_get_enum_double, rx_macro_int_dem_inp_mux_put);
  1463. static const struct snd_kcontrol_new rx_int1_dem_inp_mux =
  1464. SOC_DAPM_ENUM_EXT("rx_int1_dem_inp", rx_int1_dem_inp_enum,
  1465. snd_soc_dapm_get_enum_double, rx_macro_int_dem_inp_mux_put);
  1466. static int rx_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai,
  1467. int rate_reg_val, u32 sample_rate)
  1468. {
  1469. u8 int_1_mix1_inp;
  1470. u32 j, port;
  1471. u16 int_mux_cfg0, int_mux_cfg1;
  1472. u16 int_fs_reg;
  1473. u8 inp0_sel, inp1_sel, inp2_sel;
  1474. struct snd_soc_component *component = dai->component;
  1475. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  1476. for_each_set_bit(port, &rx->active_ch_mask[dai->id], RX_MACRO_PORTS_MAX) {
  1477. int_1_mix1_inp = port;
  1478. int_mux_cfg0 = CDC_RX_INP_MUX_RX_INT0_CFG0;
  1479. /*
  1480. * Loop through all interpolator MUX inputs and find out
  1481. * to which interpolator input, the rx port
  1482. * is connected
  1483. */
  1484. for (j = 0; j < INTERP_MAX; j++) {
  1485. int_mux_cfg1 = int_mux_cfg0 + 4;
  1486. inp0_sel = snd_soc_component_read_field(component, int_mux_cfg0,
  1487. CDC_RX_INTX_1_MIX_INP0_SEL_MASK);
  1488. inp1_sel = snd_soc_component_read_field(component, int_mux_cfg0,
  1489. CDC_RX_INTX_1_MIX_INP1_SEL_MASK);
  1490. inp2_sel = snd_soc_component_read_field(component, int_mux_cfg1,
  1491. CDC_RX_INTX_1_MIX_INP2_SEL_MASK);
  1492. if ((inp0_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||
  1493. (inp1_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0) ||
  1494. (inp2_sel == int_1_mix1_inp + INTn_1_INP_SEL_RX0)) {
  1495. int_fs_reg = CDC_RX_RXn_RX_PATH_CTL(j);
  1496. /* sample_rate is in Hz */
  1497. snd_soc_component_update_bits(component, int_fs_reg,
  1498. CDC_RX_PATH_PCM_RATE_MASK,
  1499. rate_reg_val);
  1500. }
  1501. int_mux_cfg0 += 8;
  1502. }
  1503. }
  1504. return 0;
  1505. }
  1506. static int rx_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai,
  1507. int rate_reg_val, u32 sample_rate)
  1508. {
  1509. u8 int_2_inp;
  1510. u32 j, port;
  1511. u16 int_mux_cfg1, int_fs_reg;
  1512. u8 int_mux_cfg1_val;
  1513. struct snd_soc_component *component = dai->component;
  1514. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  1515. for_each_set_bit(port, &rx->active_ch_mask[dai->id], RX_MACRO_PORTS_MAX) {
  1516. int_2_inp = port;
  1517. int_mux_cfg1 = CDC_RX_INP_MUX_RX_INT0_CFG1;
  1518. for (j = 0; j < INTERP_MAX; j++) {
  1519. int_mux_cfg1_val = snd_soc_component_read_field(component, int_mux_cfg1,
  1520. CDC_RX_INTX_2_SEL_MASK);
  1521. if (int_mux_cfg1_val == int_2_inp + INTn_2_INP_SEL_RX0) {
  1522. int_fs_reg = CDC_RX_RXn_RX_PATH_MIX_CTL(j);
  1523. snd_soc_component_update_bits(component, int_fs_reg,
  1524. CDC_RX_RXn_MIX_PCM_RATE_MASK,
  1525. rate_reg_val);
  1526. }
  1527. int_mux_cfg1 += 8;
  1528. }
  1529. }
  1530. return 0;
  1531. }
  1532. static int rx_macro_set_interpolator_rate(struct snd_soc_dai *dai,
  1533. u32 sample_rate)
  1534. {
  1535. int rate_val = 0;
  1536. int i, ret;
  1537. for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++)
  1538. if (sample_rate == sr_val_tbl[i].sample_rate)
  1539. rate_val = sr_val_tbl[i].rate_val;
  1540. ret = rx_macro_set_prim_interpolator_rate(dai, rate_val, sample_rate);
  1541. if (ret)
  1542. return ret;
  1543. ret = rx_macro_set_mix_interpolator_rate(dai, rate_val, sample_rate);
  1544. return ret;
  1545. }
  1546. static int rx_macro_hw_params(struct snd_pcm_substream *substream,
  1547. struct snd_pcm_hw_params *params,
  1548. struct snd_soc_dai *dai)
  1549. {
  1550. struct snd_soc_component *component = dai->component;
  1551. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  1552. int ret;
  1553. switch (substream->stream) {
  1554. case SNDRV_PCM_STREAM_PLAYBACK:
  1555. ret = rx_macro_set_interpolator_rate(dai, params_rate(params));
  1556. if (ret) {
  1557. dev_err(component->dev, "%s: cannot set sample rate: %u\n",
  1558. __func__, params_rate(params));
  1559. return ret;
  1560. }
  1561. rx->bit_width[dai->id] = params_width(params);
  1562. break;
  1563. default:
  1564. break;
  1565. }
  1566. return 0;
  1567. }
  1568. static int rx_macro_get_channel_map(struct snd_soc_dai *dai,
  1569. unsigned int *tx_num, unsigned int *tx_slot,
  1570. unsigned int *rx_num, unsigned int *rx_slot)
  1571. {
  1572. struct snd_soc_component *component = dai->component;
  1573. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  1574. u16 val, mask = 0, cnt = 0, temp;
  1575. switch (dai->id) {
  1576. case RX_MACRO_AIF1_PB:
  1577. case RX_MACRO_AIF2_PB:
  1578. case RX_MACRO_AIF3_PB:
  1579. case RX_MACRO_AIF4_PB:
  1580. for_each_set_bit(temp, &rx->active_ch_mask[dai->id],
  1581. RX_MACRO_PORTS_MAX) {
  1582. mask |= (1 << temp);
  1583. if (++cnt == RX_MACRO_MAX_DMA_CH_PER_PORT)
  1584. break;
  1585. }
  1586. /*
  1587. * CDC_DMA_RX_0 port drives RX0/RX1 -- ch_mask 0x1/0x2/0x3
  1588. * CDC_DMA_RX_1 port drives RX2/RX3 -- ch_mask 0x1/0x2/0x3
  1589. * CDC_DMA_RX_2 port drives RX4 -- ch_mask 0x1
  1590. * CDC_DMA_RX_3 port drives RX5 -- ch_mask 0x1
  1591. * AIFn can pair to any CDC_DMA_RX_n port.
  1592. * In general, below convention is used::
  1593. * CDC_DMA_RX_0(AIF1)/CDC_DMA_RX_1(AIF2)/
  1594. * CDC_DMA_RX_2(AIF3)/CDC_DMA_RX_3(AIF4)
  1595. */
  1596. if (mask & 0x0C)
  1597. mask = mask >> 2;
  1598. if ((mask & 0x10) || (mask & 0x20))
  1599. mask = 0x1;
  1600. *rx_slot = mask;
  1601. *rx_num = rx->active_ch_cnt[dai->id];
  1602. break;
  1603. case RX_MACRO_AIF_ECHO:
  1604. val = snd_soc_component_read(component, CDC_RX_INP_MUX_RX_MIX_CFG4);
  1605. if (val & RX_MACRO_EC_MIX_TX0_MASK) {
  1606. mask |= 0x1;
  1607. cnt++;
  1608. }
  1609. if (val & RX_MACRO_EC_MIX_TX1_MASK) {
  1610. mask |= 0x2;
  1611. cnt++;
  1612. }
  1613. val = snd_soc_component_read(component,
  1614. CDC_RX_INP_MUX_RX_MIX_CFG5);
  1615. if (val & RX_MACRO_EC_MIX_TX2_MASK) {
  1616. mask |= 0x4;
  1617. cnt++;
  1618. }
  1619. *tx_slot = mask;
  1620. *tx_num = cnt;
  1621. break;
  1622. default:
  1623. dev_err(component->dev, "%s: Invalid AIF\n", __func__);
  1624. break;
  1625. }
  1626. return 0;
  1627. }
  1628. static int rx_macro_digital_mute(struct snd_soc_dai *dai, int mute, int stream)
  1629. {
  1630. struct snd_soc_component *component = dai->component;
  1631. uint16_t j, reg, mix_reg, dsm_reg;
  1632. u16 int_mux_cfg0, int_mux_cfg1;
  1633. u8 int_mux_cfg0_val, int_mux_cfg1_val;
  1634. switch (dai->id) {
  1635. case RX_MACRO_AIF1_PB:
  1636. case RX_MACRO_AIF2_PB:
  1637. case RX_MACRO_AIF3_PB:
  1638. case RX_MACRO_AIF4_PB:
  1639. for (j = 0; j < INTERP_MAX; j++) {
  1640. reg = CDC_RX_RXn_RX_PATH_CTL(j);
  1641. mix_reg = CDC_RX_RXn_RX_PATH_MIX_CTL(j);
  1642. dsm_reg = CDC_RX_RXn_RX_PATH_DSM_CTL(j);
  1643. if (mute) {
  1644. snd_soc_component_update_bits(component, reg,
  1645. CDC_RX_PATH_PGA_MUTE_MASK,
  1646. CDC_RX_PATH_PGA_MUTE_ENABLE);
  1647. snd_soc_component_update_bits(component, mix_reg,
  1648. CDC_RX_PATH_PGA_MUTE_MASK,
  1649. CDC_RX_PATH_PGA_MUTE_ENABLE);
  1650. } else {
  1651. snd_soc_component_update_bits(component, reg,
  1652. CDC_RX_PATH_PGA_MUTE_MASK, 0x0);
  1653. snd_soc_component_update_bits(component, mix_reg,
  1654. CDC_RX_PATH_PGA_MUTE_MASK, 0x0);
  1655. }
  1656. if (j == INTERP_AUX)
  1657. dsm_reg = CDC_RX_RX2_RX_PATH_DSM_CTL;
  1658. int_mux_cfg0 = CDC_RX_INP_MUX_RX_INT0_CFG0 + j * 8;
  1659. int_mux_cfg1 = int_mux_cfg0 + 4;
  1660. int_mux_cfg0_val = snd_soc_component_read(component, int_mux_cfg0);
  1661. int_mux_cfg1_val = snd_soc_component_read(component, int_mux_cfg1);
  1662. if (snd_soc_component_read(component, dsm_reg) & 0x01) {
  1663. if (int_mux_cfg0_val || (int_mux_cfg1_val & 0xF0))
  1664. snd_soc_component_update_bits(component, reg, 0x20, 0x20);
  1665. if (int_mux_cfg1_val & 0x0F) {
  1666. snd_soc_component_update_bits(component, reg, 0x20, 0x20);
  1667. snd_soc_component_update_bits(component, mix_reg, 0x20,
  1668. 0x20);
  1669. }
  1670. }
  1671. }
  1672. break;
  1673. default:
  1674. break;
  1675. }
  1676. return 0;
  1677. }
  1678. static const struct snd_soc_dai_ops rx_macro_dai_ops = {
  1679. .hw_params = rx_macro_hw_params,
  1680. .get_channel_map = rx_macro_get_channel_map,
  1681. .mute_stream = rx_macro_digital_mute,
  1682. };
  1683. static struct snd_soc_dai_driver rx_macro_dai[] = {
  1684. {
  1685. .name = "rx_macro_rx1",
  1686. .id = RX_MACRO_AIF1_PB,
  1687. .playback = {
  1688. .stream_name = "RX_MACRO_AIF1 Playback",
  1689. .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
  1690. .formats = RX_MACRO_FORMATS,
  1691. .rate_max = 384000,
  1692. .rate_min = 8000,
  1693. .channels_min = 1,
  1694. .channels_max = 2,
  1695. },
  1696. .ops = &rx_macro_dai_ops,
  1697. },
  1698. {
  1699. .name = "rx_macro_rx2",
  1700. .id = RX_MACRO_AIF2_PB,
  1701. .playback = {
  1702. .stream_name = "RX_MACRO_AIF2 Playback",
  1703. .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
  1704. .formats = RX_MACRO_FORMATS,
  1705. .rate_max = 384000,
  1706. .rate_min = 8000,
  1707. .channels_min = 1,
  1708. .channels_max = 2,
  1709. },
  1710. .ops = &rx_macro_dai_ops,
  1711. },
  1712. {
  1713. .name = "rx_macro_rx3",
  1714. .id = RX_MACRO_AIF3_PB,
  1715. .playback = {
  1716. .stream_name = "RX_MACRO_AIF3 Playback",
  1717. .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
  1718. .formats = RX_MACRO_FORMATS,
  1719. .rate_max = 384000,
  1720. .rate_min = 8000,
  1721. .channels_min = 1,
  1722. .channels_max = 2,
  1723. },
  1724. .ops = &rx_macro_dai_ops,
  1725. },
  1726. {
  1727. .name = "rx_macro_rx4",
  1728. .id = RX_MACRO_AIF4_PB,
  1729. .playback = {
  1730. .stream_name = "RX_MACRO_AIF4 Playback",
  1731. .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
  1732. .formats = RX_MACRO_FORMATS,
  1733. .rate_max = 384000,
  1734. .rate_min = 8000,
  1735. .channels_min = 1,
  1736. .channels_max = 2,
  1737. },
  1738. .ops = &rx_macro_dai_ops,
  1739. },
  1740. {
  1741. .name = "rx_macro_echo",
  1742. .id = RX_MACRO_AIF_ECHO,
  1743. .capture = {
  1744. .stream_name = "RX_AIF_ECHO Capture",
  1745. .rates = RX_MACRO_ECHO_RATES,
  1746. .formats = RX_MACRO_ECHO_FORMATS,
  1747. .rate_max = 48000,
  1748. .rate_min = 8000,
  1749. .channels_min = 1,
  1750. .channels_max = 3,
  1751. },
  1752. .ops = &rx_macro_dai_ops,
  1753. },
  1754. };
  1755. static void rx_macro_mclk_enable(struct rx_macro *rx, bool mclk_enable)
  1756. {
  1757. struct regmap *regmap = rx->regmap;
  1758. if (mclk_enable) {
  1759. if (rx->rx_mclk_users == 0) {
  1760. regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
  1761. CDC_RX_CLK_MCLK_EN_MASK |
  1762. CDC_RX_CLK_MCLK2_EN_MASK,
  1763. CDC_RX_CLK_MCLK_ENABLE |
  1764. CDC_RX_CLK_MCLK2_ENABLE);
  1765. regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
  1766. CDC_RX_FS_MCLK_CNT_CLR_MASK, 0x00);
  1767. regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
  1768. CDC_RX_FS_MCLK_CNT_EN_MASK,
  1769. CDC_RX_FS_MCLK_CNT_ENABLE);
  1770. regcache_mark_dirty(regmap);
  1771. regcache_sync(regmap);
  1772. }
  1773. rx->rx_mclk_users++;
  1774. } else {
  1775. if (rx->rx_mclk_users <= 0) {
  1776. dev_err(rx->dev, "%s: clock already disabled\n", __func__);
  1777. rx->rx_mclk_users = 0;
  1778. return;
  1779. }
  1780. rx->rx_mclk_users--;
  1781. if (rx->rx_mclk_users == 0) {
  1782. regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
  1783. CDC_RX_FS_MCLK_CNT_EN_MASK, 0x0);
  1784. regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
  1785. CDC_RX_FS_MCLK_CNT_CLR_MASK,
  1786. CDC_RX_FS_MCLK_CNT_CLR);
  1787. regmap_update_bits(regmap, CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
  1788. CDC_RX_CLK_MCLK_EN_MASK |
  1789. CDC_RX_CLK_MCLK2_EN_MASK, 0x0);
  1790. }
  1791. }
  1792. }
  1793. static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w,
  1794. struct snd_kcontrol *kcontrol, int event)
  1795. {
  1796. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  1797. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  1798. int ret = 0;
  1799. switch (event) {
  1800. case SND_SOC_DAPM_PRE_PMU:
  1801. rx_macro_mclk_enable(rx, true);
  1802. break;
  1803. case SND_SOC_DAPM_POST_PMD:
  1804. rx_macro_mclk_enable(rx, false);
  1805. break;
  1806. default:
  1807. dev_err(component->dev, "%s: invalid DAPM event %d\n", __func__, event);
  1808. ret = -EINVAL;
  1809. }
  1810. return ret;
  1811. }
  1812. static bool rx_macro_adie_lb(struct snd_soc_component *component,
  1813. int interp_idx)
  1814. {
  1815. u16 int_mux_cfg0, int_mux_cfg1;
  1816. u8 int_n_inp0, int_n_inp1, int_n_inp2;
  1817. int_mux_cfg0 = CDC_RX_INP_MUX_RX_INT0_CFG0 + interp_idx * 8;
  1818. int_mux_cfg1 = int_mux_cfg0 + 4;
  1819. int_n_inp0 = snd_soc_component_read_field(component, int_mux_cfg0,
  1820. CDC_RX_INTX_1_MIX_INP0_SEL_MASK);
  1821. int_n_inp1 = snd_soc_component_read_field(component, int_mux_cfg0,
  1822. CDC_RX_INTX_1_MIX_INP1_SEL_MASK);
  1823. int_n_inp2 = snd_soc_component_read_field(component, int_mux_cfg1,
  1824. CDC_RX_INTX_1_MIX_INP2_SEL_MASK);
  1825. if (int_n_inp0 == INTn_1_INP_SEL_DEC0 ||
  1826. int_n_inp0 == INTn_1_INP_SEL_DEC1 ||
  1827. int_n_inp0 == INTn_1_INP_SEL_IIR0 ||
  1828. int_n_inp0 == INTn_1_INP_SEL_IIR1)
  1829. return true;
  1830. if (int_n_inp1 == INTn_1_INP_SEL_DEC0 ||
  1831. int_n_inp1 == INTn_1_INP_SEL_DEC1 ||
  1832. int_n_inp1 == INTn_1_INP_SEL_IIR0 ||
  1833. int_n_inp1 == INTn_1_INP_SEL_IIR1)
  1834. return true;
  1835. if (int_n_inp2 == INTn_1_INP_SEL_DEC0 ||
  1836. int_n_inp2 == INTn_1_INP_SEL_DEC1 ||
  1837. int_n_inp2 == INTn_1_INP_SEL_IIR0 ||
  1838. int_n_inp2 == INTn_1_INP_SEL_IIR1)
  1839. return true;
  1840. return false;
  1841. }
  1842. static int rx_macro_enable_interp_clk(struct snd_soc_component *component,
  1843. int event, int interp_idx);
  1844. static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w,
  1845. struct snd_kcontrol *kcontrol,
  1846. int event)
  1847. {
  1848. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  1849. u16 gain_reg, reg;
  1850. reg = CDC_RX_RXn_RX_PATH_CTL(w->shift);
  1851. gain_reg = CDC_RX_RXn_RX_VOL_CTL(w->shift);
  1852. switch (event) {
  1853. case SND_SOC_DAPM_PRE_PMU:
  1854. rx_macro_enable_interp_clk(component, event, w->shift);
  1855. if (rx_macro_adie_lb(component, w->shift))
  1856. snd_soc_component_update_bits(component, reg,
  1857. CDC_RX_PATH_CLK_EN_MASK,
  1858. CDC_RX_PATH_CLK_ENABLE);
  1859. break;
  1860. case SND_SOC_DAPM_POST_PMU:
  1861. snd_soc_component_write(component, gain_reg,
  1862. snd_soc_component_read(component, gain_reg));
  1863. break;
  1864. case SND_SOC_DAPM_POST_PMD:
  1865. rx_macro_enable_interp_clk(component, event, w->shift);
  1866. break;
  1867. }
  1868. return 0;
  1869. }
  1870. static int rx_macro_config_compander(struct snd_soc_component *component,
  1871. struct rx_macro *rx,
  1872. int comp, int event)
  1873. {
  1874. u8 pcm_rate, val;
  1875. /* AUX does not have compander */
  1876. if (comp == INTERP_AUX)
  1877. return 0;
  1878. pcm_rate = snd_soc_component_read(component, CDC_RX_RXn_RX_PATH_CTL(comp)) & 0x0F;
  1879. if (pcm_rate < 0x06)
  1880. val = 0x03;
  1881. else if (pcm_rate < 0x08)
  1882. val = 0x01;
  1883. else if (pcm_rate < 0x0B)
  1884. val = 0x02;
  1885. else
  1886. val = 0x00;
  1887. if (SND_SOC_DAPM_EVENT_ON(event))
  1888. snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_CFG3(comp),
  1889. CDC_RX_DC_COEFF_SEL_MASK, val);
  1890. if (SND_SOC_DAPM_EVENT_OFF(event))
  1891. snd_soc_component_update_bits(component, CDC_RX_RXn_RX_PATH_CFG3(comp),
  1892. CDC_RX_DC_COEFF_SEL_MASK, 0x3);
  1893. if (!rx->comp_enabled[comp])
  1894. return 0;
  1895. if (SND_SOC_DAPM_EVENT_ON(event)) {
  1896. /* Enable Compander Clock */
  1897. snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),
  1898. CDC_RX_COMPANDERn_CLK_EN_MASK, 0x1);
  1899. snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),
  1900. CDC_RX_COMPANDERn_SOFT_RST_MASK, 0x1);
  1901. snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),
  1902. CDC_RX_COMPANDERn_SOFT_RST_MASK, 0x0);
  1903. snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG0(comp),
  1904. CDC_RX_RXn_COMP_EN_MASK, 0x1);
  1905. }
  1906. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  1907. snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),
  1908. CDC_RX_COMPANDERn_HALT_MASK, 0x1);
  1909. snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG0(comp),
  1910. CDC_RX_RXn_COMP_EN_MASK, 0x0);
  1911. snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),
  1912. CDC_RX_COMPANDERn_CLK_EN_MASK, 0x0);
  1913. snd_soc_component_write_field(component, CDC_RX_COMPANDERn_CTL0(comp),
  1914. CDC_RX_COMPANDERn_HALT_MASK, 0x0);
  1915. }
  1916. return 0;
  1917. }
  1918. static int rx_macro_load_compander_coeff(struct snd_soc_component *component,
  1919. struct rx_macro *rx,
  1920. int comp, int event)
  1921. {
  1922. u16 comp_coeff_lsb_reg, comp_coeff_msb_reg;
  1923. int i;
  1924. int hph_pwr_mode;
  1925. /* AUX does not have compander */
  1926. if (comp == INTERP_AUX)
  1927. return 0;
  1928. if (!rx->comp_enabled[comp])
  1929. return 0;
  1930. if (comp == INTERP_HPHL) {
  1931. comp_coeff_lsb_reg = CDC_RX_TOP_HPHL_COMP_WR_LSB;
  1932. comp_coeff_msb_reg = CDC_RX_TOP_HPHL_COMP_WR_MSB;
  1933. } else if (comp == INTERP_HPHR) {
  1934. comp_coeff_lsb_reg = CDC_RX_TOP_HPHR_COMP_WR_LSB;
  1935. comp_coeff_msb_reg = CDC_RX_TOP_HPHR_COMP_WR_MSB;
  1936. } else {
  1937. /* compander coefficients are loaded only for hph path */
  1938. return 0;
  1939. }
  1940. hph_pwr_mode = rx->hph_pwr_mode;
  1941. if (SND_SOC_DAPM_EVENT_ON(event)) {
  1942. /* Load Compander Coeff */
  1943. for (i = 0; i < COMP_MAX_COEFF; i++) {
  1944. snd_soc_component_write(component, comp_coeff_lsb_reg,
  1945. comp_coeff_table[hph_pwr_mode][i].lsb);
  1946. snd_soc_component_write(component, comp_coeff_msb_reg,
  1947. comp_coeff_table[hph_pwr_mode][i].msb);
  1948. }
  1949. }
  1950. return 0;
  1951. }
  1952. static void rx_macro_enable_softclip_clk(struct snd_soc_component *component,
  1953. struct rx_macro *rx, bool enable)
  1954. {
  1955. if (enable) {
  1956. if (rx->softclip_clk_users == 0)
  1957. snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_CRC,
  1958. CDC_RX_SOFTCLIP_CLK_EN_MASK, 1);
  1959. rx->softclip_clk_users++;
  1960. } else {
  1961. rx->softclip_clk_users--;
  1962. if (rx->softclip_clk_users == 0)
  1963. snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_CRC,
  1964. CDC_RX_SOFTCLIP_CLK_EN_MASK, 0);
  1965. }
  1966. }
  1967. static int rx_macro_config_softclip(struct snd_soc_component *component,
  1968. struct rx_macro *rx, int event)
  1969. {
  1970. if (!rx->is_softclip_on)
  1971. return 0;
  1972. if (SND_SOC_DAPM_EVENT_ON(event)) {
  1973. /* Enable Softclip clock */
  1974. rx_macro_enable_softclip_clk(component, rx, true);
  1975. /* Enable Softclip control */
  1976. snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_SOFTCLIP_CTRL,
  1977. CDC_RX_SOFTCLIP_EN_MASK, 0x01);
  1978. }
  1979. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  1980. snd_soc_component_write_field(component, CDC_RX_SOFTCLIP_SOFTCLIP_CTRL,
  1981. CDC_RX_SOFTCLIP_EN_MASK, 0x0);
  1982. rx_macro_enable_softclip_clk(component, rx, false);
  1983. }
  1984. return 0;
  1985. }
  1986. static int rx_macro_config_aux_hpf(struct snd_soc_component *component,
  1987. struct rx_macro *rx, int event)
  1988. {
  1989. if (SND_SOC_DAPM_EVENT_ON(event)) {
  1990. /* Update Aux HPF control */
  1991. if (!rx->is_aux_hpf_on)
  1992. snd_soc_component_update_bits(component,
  1993. CDC_RX_RX2_RX_PATH_CFG1, 0x04, 0x00);
  1994. }
  1995. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  1996. /* Reset to default (HPF=ON) */
  1997. snd_soc_component_update_bits(component,
  1998. CDC_RX_RX2_RX_PATH_CFG1, 0x04, 0x04);
  1999. }
  2000. return 0;
  2001. }
  2002. static inline void rx_macro_enable_clsh_block(struct rx_macro *rx, bool enable)
  2003. {
  2004. if ((enable && ++rx->clsh_users == 1) || (!enable && --rx->clsh_users == 0))
  2005. snd_soc_component_update_bits(rx->component, CDC_RX_CLSH_CRC,
  2006. CDC_RX_CLSH_CLK_EN_MASK, enable);
  2007. if (rx->clsh_users < 0)
  2008. rx->clsh_users = 0;
  2009. }
  2010. static int rx_macro_config_classh(struct snd_soc_component *component,
  2011. struct rx_macro *rx,
  2012. int interp_n, int event)
  2013. {
  2014. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  2015. rx_macro_enable_clsh_block(rx, false);
  2016. return 0;
  2017. }
  2018. if (!SND_SOC_DAPM_EVENT_ON(event))
  2019. return 0;
  2020. rx_macro_enable_clsh_block(rx, true);
  2021. if (interp_n == INTERP_HPHL ||
  2022. interp_n == INTERP_HPHR) {
  2023. /*
  2024. * These K1 values depend on the Headphone Impedance
  2025. * For now it is assumed to be 16 ohm
  2026. */
  2027. snd_soc_component_write(component, CDC_RX_CLSH_K1_LSB, 0xc0);
  2028. snd_soc_component_write_field(component, CDC_RX_CLSH_K1_MSB,
  2029. CDC_RX_CLSH_K1_MSB_COEFF_MASK, 0);
  2030. }
  2031. switch (interp_n) {
  2032. case INTERP_HPHL:
  2033. if (rx->is_ear_mode_on)
  2034. snd_soc_component_update_bits(component,
  2035. CDC_RX_CLSH_HPH_V_PA,
  2036. CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x39);
  2037. else
  2038. snd_soc_component_update_bits(component,
  2039. CDC_RX_CLSH_HPH_V_PA,
  2040. CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x1c);
  2041. snd_soc_component_update_bits(component,
  2042. CDC_RX_CLSH_DECAY_CTRL,
  2043. CDC_RX_CLSH_DECAY_RATE_MASK, 0x0);
  2044. snd_soc_component_write_field(component,
  2045. CDC_RX_RX0_RX_PATH_CFG0,
  2046. CDC_RX_RXn_CLSH_EN_MASK, 0x1);
  2047. break;
  2048. case INTERP_HPHR:
  2049. if (rx->is_ear_mode_on)
  2050. snd_soc_component_update_bits(component,
  2051. CDC_RX_CLSH_HPH_V_PA,
  2052. CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x39);
  2053. else
  2054. snd_soc_component_update_bits(component,
  2055. CDC_RX_CLSH_HPH_V_PA,
  2056. CDC_RX_CLSH_HPH_V_PA_MIN_MASK, 0x1c);
  2057. snd_soc_component_update_bits(component,
  2058. CDC_RX_CLSH_DECAY_CTRL,
  2059. CDC_RX_CLSH_DECAY_RATE_MASK, 0x0);
  2060. snd_soc_component_write_field(component,
  2061. CDC_RX_RX1_RX_PATH_CFG0,
  2062. CDC_RX_RXn_CLSH_EN_MASK, 0x1);
  2063. break;
  2064. case INTERP_AUX:
  2065. snd_soc_component_update_bits(component,
  2066. CDC_RX_RX2_RX_PATH_CFG0,
  2067. CDC_RX_RX2_DLY_Z_EN_MASK, 1);
  2068. snd_soc_component_write_field(component,
  2069. CDC_RX_RX2_RX_PATH_CFG0,
  2070. CDC_RX_RX2_CLSH_EN_MASK, 1);
  2071. break;
  2072. }
  2073. return 0;
  2074. }
  2075. static void rx_macro_hd2_control(struct snd_soc_component *component,
  2076. u16 interp_idx, int event)
  2077. {
  2078. u16 hd2_scale_reg, hd2_enable_reg;
  2079. switch (interp_idx) {
  2080. case INTERP_HPHL:
  2081. hd2_scale_reg = CDC_RX_RX0_RX_PATH_SEC3;
  2082. hd2_enable_reg = CDC_RX_RX0_RX_PATH_CFG0;
  2083. break;
  2084. case INTERP_HPHR:
  2085. hd2_scale_reg = CDC_RX_RX1_RX_PATH_SEC3;
  2086. hd2_enable_reg = CDC_RX_RX1_RX_PATH_CFG0;
  2087. break;
  2088. }
  2089. if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
  2090. snd_soc_component_update_bits(component, hd2_scale_reg,
  2091. CDC_RX_RXn_HD2_ALPHA_MASK, 0x14);
  2092. snd_soc_component_write_field(component, hd2_enable_reg,
  2093. CDC_RX_RXn_HD2_EN_MASK, 1);
  2094. }
  2095. if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
  2096. snd_soc_component_write_field(component, hd2_enable_reg,
  2097. CDC_RX_RXn_HD2_EN_MASK, 0);
  2098. snd_soc_component_update_bits(component, hd2_scale_reg,
  2099. CDC_RX_RXn_HD2_ALPHA_MASK, 0x0);
  2100. }
  2101. }
  2102. static int rx_macro_get_compander(struct snd_kcontrol *kcontrol,
  2103. struct snd_ctl_elem_value *ucontrol)
  2104. {
  2105. struct snd_soc_component *component =
  2106. snd_soc_kcontrol_component(kcontrol);
  2107. int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
  2108. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2109. ucontrol->value.integer.value[0] = rx->comp_enabled[comp];
  2110. return 0;
  2111. }
  2112. static int rx_macro_set_compander(struct snd_kcontrol *kcontrol,
  2113. struct snd_ctl_elem_value *ucontrol)
  2114. {
  2115. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2116. int comp = ((struct soc_mixer_control *) kcontrol->private_value)->shift;
  2117. int value = ucontrol->value.integer.value[0];
  2118. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2119. rx->comp_enabled[comp] = value;
  2120. return 0;
  2121. }
  2122. static int rx_macro_mux_get(struct snd_kcontrol *kcontrol,
  2123. struct snd_ctl_elem_value *ucontrol)
  2124. {
  2125. struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
  2126. struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
  2127. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2128. ucontrol->value.enumerated.item[0] =
  2129. rx->rx_port_value[widget->shift];
  2130. return 0;
  2131. }
  2132. static int rx_macro_mux_put(struct snd_kcontrol *kcontrol,
  2133. struct snd_ctl_elem_value *ucontrol)
  2134. {
  2135. struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kcontrol);
  2136. struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm);
  2137. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  2138. struct snd_soc_dapm_update *update = NULL;
  2139. u32 rx_port_value = ucontrol->value.enumerated.item[0];
  2140. u32 aif_rst;
  2141. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2142. aif_rst = rx->rx_port_value[widget->shift];
  2143. if (!rx_port_value) {
  2144. if (aif_rst == 0) {
  2145. dev_err(component->dev, "%s:AIF reset already\n", __func__);
  2146. return 0;
  2147. }
  2148. if (aif_rst > RX_MACRO_AIF4_PB) {
  2149. dev_err(component->dev, "%s: Invalid AIF reset\n", __func__);
  2150. return 0;
  2151. }
  2152. }
  2153. rx->rx_port_value[widget->shift] = rx_port_value;
  2154. switch (rx_port_value) {
  2155. case 0:
  2156. if (rx->active_ch_cnt[aif_rst]) {
  2157. clear_bit(widget->shift,
  2158. &rx->active_ch_mask[aif_rst]);
  2159. rx->active_ch_cnt[aif_rst]--;
  2160. }
  2161. break;
  2162. case 1:
  2163. case 2:
  2164. case 3:
  2165. case 4:
  2166. set_bit(widget->shift,
  2167. &rx->active_ch_mask[rx_port_value]);
  2168. rx->active_ch_cnt[rx_port_value]++;
  2169. break;
  2170. default:
  2171. dev_err(component->dev,
  2172. "%s:Invalid AIF_ID for RX_MACRO MUX %d\n",
  2173. __func__, rx_port_value);
  2174. goto err;
  2175. }
  2176. snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
  2177. rx_port_value, e, update);
  2178. return 0;
  2179. err:
  2180. return -EINVAL;
  2181. }
  2182. static const struct snd_kcontrol_new rx_macro_rx0_mux =
  2183. SOC_DAPM_ENUM_EXT("rx_macro_rx0", rx_macro_rx0_enum,
  2184. rx_macro_mux_get, rx_macro_mux_put);
  2185. static const struct snd_kcontrol_new rx_macro_rx1_mux =
  2186. SOC_DAPM_ENUM_EXT("rx_macro_rx1", rx_macro_rx1_enum,
  2187. rx_macro_mux_get, rx_macro_mux_put);
  2188. static const struct snd_kcontrol_new rx_macro_rx2_mux =
  2189. SOC_DAPM_ENUM_EXT("rx_macro_rx2", rx_macro_rx2_enum,
  2190. rx_macro_mux_get, rx_macro_mux_put);
  2191. static const struct snd_kcontrol_new rx_macro_rx3_mux =
  2192. SOC_DAPM_ENUM_EXT("rx_macro_rx3", rx_macro_rx3_enum,
  2193. rx_macro_mux_get, rx_macro_mux_put);
  2194. static const struct snd_kcontrol_new rx_macro_rx4_mux =
  2195. SOC_DAPM_ENUM_EXT("rx_macro_rx4", rx_macro_rx4_enum,
  2196. rx_macro_mux_get, rx_macro_mux_put);
  2197. static const struct snd_kcontrol_new rx_macro_rx5_mux =
  2198. SOC_DAPM_ENUM_EXT("rx_macro_rx5", rx_macro_rx5_enum,
  2199. rx_macro_mux_get, rx_macro_mux_put);
  2200. static int rx_macro_get_ear_mode(struct snd_kcontrol *kcontrol,
  2201. struct snd_ctl_elem_value *ucontrol)
  2202. {
  2203. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2204. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2205. ucontrol->value.integer.value[0] = rx->is_ear_mode_on;
  2206. return 0;
  2207. }
  2208. static int rx_macro_put_ear_mode(struct snd_kcontrol *kcontrol,
  2209. struct snd_ctl_elem_value *ucontrol)
  2210. {
  2211. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2212. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2213. rx->is_ear_mode_on = (!ucontrol->value.integer.value[0] ? false : true);
  2214. return 0;
  2215. }
  2216. static int rx_macro_get_hph_hd2_mode(struct snd_kcontrol *kcontrol,
  2217. struct snd_ctl_elem_value *ucontrol)
  2218. {
  2219. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2220. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2221. ucontrol->value.integer.value[0] = rx->hph_hd2_mode;
  2222. return 0;
  2223. }
  2224. static int rx_macro_put_hph_hd2_mode(struct snd_kcontrol *kcontrol,
  2225. struct snd_ctl_elem_value *ucontrol)
  2226. {
  2227. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2228. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2229. rx->hph_hd2_mode = ucontrol->value.integer.value[0];
  2230. return 0;
  2231. }
  2232. static int rx_macro_get_hph_pwr_mode(struct snd_kcontrol *kcontrol,
  2233. struct snd_ctl_elem_value *ucontrol)
  2234. {
  2235. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2236. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2237. ucontrol->value.enumerated.item[0] = rx->hph_pwr_mode;
  2238. return 0;
  2239. }
  2240. static int rx_macro_put_hph_pwr_mode(struct snd_kcontrol *kcontrol,
  2241. struct snd_ctl_elem_value *ucontrol)
  2242. {
  2243. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2244. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2245. rx->hph_pwr_mode = ucontrol->value.enumerated.item[0];
  2246. return 0;
  2247. }
  2248. static int rx_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol,
  2249. struct snd_ctl_elem_value *ucontrol)
  2250. {
  2251. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2252. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2253. ucontrol->value.integer.value[0] = rx->is_softclip_on;
  2254. return 0;
  2255. }
  2256. static int rx_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol,
  2257. struct snd_ctl_elem_value *ucontrol)
  2258. {
  2259. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2260. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2261. rx->is_softclip_on = ucontrol->value.integer.value[0];
  2262. return 0;
  2263. }
  2264. static int rx_macro_aux_hpf_mode_get(struct snd_kcontrol *kcontrol,
  2265. struct snd_ctl_elem_value *ucontrol)
  2266. {
  2267. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2268. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2269. ucontrol->value.integer.value[0] = rx->is_aux_hpf_on;
  2270. return 0;
  2271. }
  2272. static int rx_macro_aux_hpf_mode_put(struct snd_kcontrol *kcontrol,
  2273. struct snd_ctl_elem_value *ucontrol)
  2274. {
  2275. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2276. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2277. rx->is_aux_hpf_on = ucontrol->value.integer.value[0];
  2278. return 0;
  2279. }
  2280. static int rx_macro_hphdelay_lutbypass(struct snd_soc_component *component,
  2281. struct rx_macro *rx,
  2282. u16 interp_idx, int event)
  2283. {
  2284. u16 hph_lut_bypass_reg;
  2285. u16 hph_comp_ctrl7;
  2286. switch (interp_idx) {
  2287. case INTERP_HPHL:
  2288. hph_lut_bypass_reg = CDC_RX_TOP_HPHL_COMP_LUT;
  2289. hph_comp_ctrl7 = CDC_RX_COMPANDER0_CTL7;
  2290. break;
  2291. case INTERP_HPHR:
  2292. hph_lut_bypass_reg = CDC_RX_TOP_HPHR_COMP_LUT;
  2293. hph_comp_ctrl7 = CDC_RX_COMPANDER1_CTL7;
  2294. break;
  2295. default:
  2296. return -EINVAL;
  2297. }
  2298. if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) {
  2299. if (interp_idx == INTERP_HPHL) {
  2300. if (rx->is_ear_mode_on)
  2301. snd_soc_component_write_field(component,
  2302. CDC_RX_RX0_RX_PATH_CFG1,
  2303. CDC_RX_RX0_HPH_L_EAR_SEL_MASK, 0x1);
  2304. else
  2305. snd_soc_component_write_field(component,
  2306. hph_lut_bypass_reg,
  2307. CDC_RX_TOP_HPH_LUT_BYPASS_MASK, 1);
  2308. } else {
  2309. snd_soc_component_write_field(component, hph_lut_bypass_reg,
  2310. CDC_RX_TOP_HPH_LUT_BYPASS_MASK, 1);
  2311. }
  2312. if (rx->hph_pwr_mode)
  2313. snd_soc_component_write_field(component, hph_comp_ctrl7,
  2314. CDC_RX_COMPANDER1_HPH_LOW_PWR_MODE_MASK, 0x0);
  2315. }
  2316. if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
  2317. snd_soc_component_write_field(component,
  2318. CDC_RX_RX0_RX_PATH_CFG1,
  2319. CDC_RX_RX0_HPH_L_EAR_SEL_MASK, 0x0);
  2320. snd_soc_component_update_bits(component, hph_lut_bypass_reg,
  2321. CDC_RX_TOP_HPH_LUT_BYPASS_MASK, 0);
  2322. snd_soc_component_write_field(component, hph_comp_ctrl7,
  2323. CDC_RX_COMPANDER1_HPH_LOW_PWR_MODE_MASK, 0x1);
  2324. }
  2325. return 0;
  2326. }
  2327. static int rx_macro_enable_interp_clk(struct snd_soc_component *component,
  2328. int event, int interp_idx)
  2329. {
  2330. u16 main_reg, dsm_reg, rx_cfg2_reg;
  2331. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  2332. main_reg = CDC_RX_RXn_RX_PATH_CTL(interp_idx);
  2333. dsm_reg = CDC_RX_RXn_RX_PATH_DSM_CTL(interp_idx);
  2334. if (interp_idx == INTERP_AUX)
  2335. dsm_reg = CDC_RX_RX2_RX_PATH_DSM_CTL;
  2336. rx_cfg2_reg = CDC_RX_RXn_RX_PATH_CFG2(interp_idx);
  2337. if (SND_SOC_DAPM_EVENT_ON(event)) {
  2338. if (rx->main_clk_users[interp_idx] == 0) {
  2339. /* Main path PGA mute enable */
  2340. snd_soc_component_write_field(component, main_reg,
  2341. CDC_RX_PATH_PGA_MUTE_MASK, 0x1);
  2342. snd_soc_component_write_field(component, dsm_reg,
  2343. CDC_RX_RXn_DSM_CLK_EN_MASK, 0x1);
  2344. snd_soc_component_update_bits(component, rx_cfg2_reg,
  2345. CDC_RX_RXn_HPF_CUT_FREQ_MASK, 0x03);
  2346. rx_macro_load_compander_coeff(component, rx, interp_idx, event);
  2347. if (rx->hph_hd2_mode)
  2348. rx_macro_hd2_control(component, interp_idx, event);
  2349. rx_macro_hphdelay_lutbypass(component, rx, interp_idx, event);
  2350. rx_macro_config_compander(component, rx, interp_idx, event);
  2351. if (interp_idx == INTERP_AUX) {
  2352. rx_macro_config_softclip(component, rx, event);
  2353. rx_macro_config_aux_hpf(component, rx, event);
  2354. }
  2355. rx_macro_config_classh(component, rx, interp_idx, event);
  2356. }
  2357. rx->main_clk_users[interp_idx]++;
  2358. }
  2359. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  2360. rx->main_clk_users[interp_idx]--;
  2361. if (rx->main_clk_users[interp_idx] <= 0) {
  2362. rx->main_clk_users[interp_idx] = 0;
  2363. /* Main path PGA mute enable */
  2364. snd_soc_component_write_field(component, main_reg,
  2365. CDC_RX_PATH_PGA_MUTE_MASK, 0x1);
  2366. /* Clk Disable */
  2367. snd_soc_component_write_field(component, dsm_reg,
  2368. CDC_RX_RXn_DSM_CLK_EN_MASK, 0);
  2369. snd_soc_component_write_field(component, main_reg,
  2370. CDC_RX_PATH_CLK_EN_MASK, 0);
  2371. /* Reset enable and disable */
  2372. snd_soc_component_write_field(component, main_reg,
  2373. CDC_RX_PATH_RESET_EN_MASK, 1);
  2374. snd_soc_component_write_field(component, main_reg,
  2375. CDC_RX_PATH_RESET_EN_MASK, 0);
  2376. /* Reset rate to 48K*/
  2377. snd_soc_component_update_bits(component, main_reg,
  2378. CDC_RX_PATH_PCM_RATE_MASK,
  2379. 0x04);
  2380. snd_soc_component_update_bits(component, rx_cfg2_reg,
  2381. CDC_RX_RXn_HPF_CUT_FREQ_MASK, 0x00);
  2382. rx_macro_config_classh(component, rx, interp_idx, event);
  2383. rx_macro_config_compander(component, rx, interp_idx, event);
  2384. if (interp_idx == INTERP_AUX) {
  2385. rx_macro_config_softclip(component, rx, event);
  2386. rx_macro_config_aux_hpf(component, rx, event);
  2387. }
  2388. rx_macro_hphdelay_lutbypass(component, rx, interp_idx, event);
  2389. if (rx->hph_hd2_mode)
  2390. rx_macro_hd2_control(component, interp_idx, event);
  2391. }
  2392. }
  2393. return rx->main_clk_users[interp_idx];
  2394. }
  2395. static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
  2396. struct snd_kcontrol *kcontrol, int event)
  2397. {
  2398. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  2399. u16 gain_reg, mix_reg;
  2400. gain_reg = CDC_RX_RXn_RX_VOL_MIX_CTL(w->shift);
  2401. mix_reg = CDC_RX_RXn_RX_PATH_MIX_CTL(w->shift);
  2402. switch (event) {
  2403. case SND_SOC_DAPM_PRE_PMU:
  2404. rx_macro_enable_interp_clk(component, event, w->shift);
  2405. break;
  2406. case SND_SOC_DAPM_POST_PMU:
  2407. snd_soc_component_write(component, gain_reg,
  2408. snd_soc_component_read(component, gain_reg));
  2409. break;
  2410. case SND_SOC_DAPM_POST_PMD:
  2411. /* Clk Disable */
  2412. snd_soc_component_update_bits(component, mix_reg,
  2413. CDC_RX_RXn_MIX_CLK_EN_MASK, 0x00);
  2414. rx_macro_enable_interp_clk(component, event, w->shift);
  2415. /* Reset enable and disable */
  2416. snd_soc_component_update_bits(component, mix_reg,
  2417. CDC_RX_RXn_MIX_RESET_MASK,
  2418. CDC_RX_RXn_MIX_RESET);
  2419. snd_soc_component_update_bits(component, mix_reg,
  2420. CDC_RX_RXn_MIX_RESET_MASK, 0x00);
  2421. break;
  2422. }
  2423. return 0;
  2424. }
  2425. static int rx_macro_enable_rx_path_clk(struct snd_soc_dapm_widget *w,
  2426. struct snd_kcontrol *kcontrol, int event)
  2427. {
  2428. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  2429. switch (event) {
  2430. case SND_SOC_DAPM_PRE_PMU:
  2431. rx_macro_enable_interp_clk(component, event, w->shift);
  2432. snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG1(w->shift),
  2433. CDC_RX_RXn_SIDETONE_EN_MASK, 1);
  2434. snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CTL(w->shift),
  2435. CDC_RX_PATH_CLK_EN_MASK, 1);
  2436. break;
  2437. case SND_SOC_DAPM_POST_PMD:
  2438. snd_soc_component_write_field(component, CDC_RX_RXn_RX_PATH_CFG1(w->shift),
  2439. CDC_RX_RXn_SIDETONE_EN_MASK, 0);
  2440. rx_macro_enable_interp_clk(component, event, w->shift);
  2441. break;
  2442. default:
  2443. break;
  2444. }
  2445. return 0;
  2446. }
  2447. static int rx_macro_set_iir_gain(struct snd_soc_dapm_widget *w,
  2448. struct snd_kcontrol *kcontrol, int event)
  2449. {
  2450. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  2451. switch (event) {
  2452. case SND_SOC_DAPM_POST_PMU: /* fall through */
  2453. case SND_SOC_DAPM_PRE_PMD:
  2454. if (strnstr(w->name, "IIR0", sizeof("IIR0"))) {
  2455. snd_soc_component_write(component,
  2456. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL,
  2457. snd_soc_component_read(component,
  2458. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL));
  2459. snd_soc_component_write(component,
  2460. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL,
  2461. snd_soc_component_read(component,
  2462. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL));
  2463. snd_soc_component_write(component,
  2464. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL,
  2465. snd_soc_component_read(component,
  2466. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL));
  2467. snd_soc_component_write(component,
  2468. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL,
  2469. snd_soc_component_read(component,
  2470. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL));
  2471. } else {
  2472. snd_soc_component_write(component,
  2473. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL,
  2474. snd_soc_component_read(component,
  2475. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL));
  2476. snd_soc_component_write(component,
  2477. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL,
  2478. snd_soc_component_read(component,
  2479. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL));
  2480. snd_soc_component_write(component,
  2481. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL,
  2482. snd_soc_component_read(component,
  2483. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL));
  2484. snd_soc_component_write(component,
  2485. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL,
  2486. snd_soc_component_read(component,
  2487. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL));
  2488. }
  2489. break;
  2490. }
  2491. return 0;
  2492. }
  2493. static uint32_t get_iir_band_coeff(struct snd_soc_component *component,
  2494. int iir_idx, int band_idx, int coeff_idx)
  2495. {
  2496. u32 value;
  2497. int reg, b2_reg;
  2498. /* Address does not automatically update if reading */
  2499. reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx;
  2500. b2_reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx;
  2501. snd_soc_component_write(component, reg,
  2502. ((band_idx * BAND_MAX + coeff_idx) *
  2503. sizeof(uint32_t)) & 0x7F);
  2504. value = snd_soc_component_read(component, b2_reg);
  2505. snd_soc_component_write(component, reg,
  2506. ((band_idx * BAND_MAX + coeff_idx)
  2507. * sizeof(uint32_t) + 1) & 0x7F);
  2508. value |= (snd_soc_component_read(component, b2_reg) << 8);
  2509. snd_soc_component_write(component, reg,
  2510. ((band_idx * BAND_MAX + coeff_idx)
  2511. * sizeof(uint32_t) + 2) & 0x7F);
  2512. value |= (snd_soc_component_read(component, b2_reg) << 16);
  2513. snd_soc_component_write(component, reg,
  2514. ((band_idx * BAND_MAX + coeff_idx)
  2515. * sizeof(uint32_t) + 3) & 0x7F);
  2516. /* Mask bits top 2 bits since they are reserved */
  2517. value |= (snd_soc_component_read(component, b2_reg) << 24);
  2518. return value;
  2519. }
  2520. static void set_iir_band_coeff(struct snd_soc_component *component,
  2521. int iir_idx, int band_idx, uint32_t value)
  2522. {
  2523. int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx;
  2524. snd_soc_component_write(component, reg, (value & 0xFF));
  2525. snd_soc_component_write(component, reg, (value >> 8) & 0xFF);
  2526. snd_soc_component_write(component, reg, (value >> 16) & 0xFF);
  2527. /* Mask top 2 bits, 7-8 are reserved */
  2528. snd_soc_component_write(component, reg, (value >> 24) & 0x3F);
  2529. }
  2530. static int rx_macro_put_iir_band_audio_mixer(
  2531. struct snd_kcontrol *kcontrol,
  2532. struct snd_ctl_elem_value *ucontrol)
  2533. {
  2534. struct snd_soc_component *component =
  2535. snd_soc_kcontrol_component(kcontrol);
  2536. struct wcd_iir_filter_ctl *ctl =
  2537. (struct wcd_iir_filter_ctl *)kcontrol->private_value;
  2538. struct soc_bytes_ext *params = &ctl->bytes_ext;
  2539. int iir_idx = ctl->iir_idx;
  2540. int band_idx = ctl->band_idx;
  2541. u32 coeff[BAND_MAX];
  2542. int reg = CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx;
  2543. memcpy(&coeff[0], ucontrol->value.bytes.data, params->max);
  2544. /* Mask top bit it is reserved */
  2545. /* Updates addr automatically for each B2 write */
  2546. snd_soc_component_write(component, reg, (band_idx * BAND_MAX *
  2547. sizeof(uint32_t)) & 0x7F);
  2548. set_iir_band_coeff(component, iir_idx, band_idx, coeff[0]);
  2549. set_iir_band_coeff(component, iir_idx, band_idx, coeff[1]);
  2550. set_iir_band_coeff(component, iir_idx, band_idx, coeff[2]);
  2551. set_iir_band_coeff(component, iir_idx, band_idx, coeff[3]);
  2552. set_iir_band_coeff(component, iir_idx, band_idx, coeff[4]);
  2553. return 0;
  2554. }
  2555. static int rx_macro_get_iir_band_audio_mixer(struct snd_kcontrol *kcontrol,
  2556. struct snd_ctl_elem_value *ucontrol)
  2557. {
  2558. struct snd_soc_component *component =
  2559. snd_soc_kcontrol_component(kcontrol);
  2560. struct wcd_iir_filter_ctl *ctl =
  2561. (struct wcd_iir_filter_ctl *)kcontrol->private_value;
  2562. struct soc_bytes_ext *params = &ctl->bytes_ext;
  2563. int iir_idx = ctl->iir_idx;
  2564. int band_idx = ctl->band_idx;
  2565. u32 coeff[BAND_MAX];
  2566. coeff[0] = get_iir_band_coeff(component, iir_idx, band_idx, 0);
  2567. coeff[1] = get_iir_band_coeff(component, iir_idx, band_idx, 1);
  2568. coeff[2] = get_iir_band_coeff(component, iir_idx, band_idx, 2);
  2569. coeff[3] = get_iir_band_coeff(component, iir_idx, band_idx, 3);
  2570. coeff[4] = get_iir_band_coeff(component, iir_idx, band_idx, 4);
  2571. memcpy(ucontrol->value.bytes.data, &coeff[0], params->max);
  2572. return 0;
  2573. }
  2574. static int rx_macro_iir_filter_info(struct snd_kcontrol *kcontrol,
  2575. struct snd_ctl_elem_info *ucontrol)
  2576. {
  2577. struct wcd_iir_filter_ctl *ctl =
  2578. (struct wcd_iir_filter_ctl *)kcontrol->private_value;
  2579. struct soc_bytes_ext *params = &ctl->bytes_ext;
  2580. ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES;
  2581. ucontrol->count = params->max;
  2582. return 0;
  2583. }
  2584. static const struct snd_kcontrol_new rx_macro_snd_controls[] = {
  2585. SOC_SINGLE_S8_TLV("RX_RX0 Digital Volume", CDC_RX_RX0_RX_VOL_CTL,
  2586. -84, 40, digital_gain),
  2587. SOC_SINGLE_S8_TLV("RX_RX1 Digital Volume", CDC_RX_RX1_RX_VOL_CTL,
  2588. -84, 40, digital_gain),
  2589. SOC_SINGLE_S8_TLV("RX_RX2 Digital Volume", CDC_RX_RX2_RX_VOL_CTL,
  2590. -84, 40, digital_gain),
  2591. SOC_SINGLE_S8_TLV("RX_RX0 Mix Digital Volume", CDC_RX_RX0_RX_VOL_MIX_CTL,
  2592. -84, 40, digital_gain),
  2593. SOC_SINGLE_S8_TLV("RX_RX1 Mix Digital Volume", CDC_RX_RX1_RX_VOL_MIX_CTL,
  2594. -84, 40, digital_gain),
  2595. SOC_SINGLE_S8_TLV("RX_RX2 Mix Digital Volume", CDC_RX_RX2_RX_VOL_MIX_CTL,
  2596. -84, 40, digital_gain),
  2597. SOC_SINGLE_EXT("RX_COMP1 Switch", SND_SOC_NOPM, RX_MACRO_COMP1, 1, 0,
  2598. rx_macro_get_compander, rx_macro_set_compander),
  2599. SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0,
  2600. rx_macro_get_compander, rx_macro_set_compander),
  2601. SOC_SINGLE_EXT("RX_EAR Mode Switch", SND_SOC_NOPM, 0, 1, 0,
  2602. rx_macro_get_ear_mode, rx_macro_put_ear_mode),
  2603. SOC_SINGLE_EXT("RX_HPH HD2 Mode Switch", SND_SOC_NOPM, 0, 1, 0,
  2604. rx_macro_get_hph_hd2_mode, rx_macro_put_hph_hd2_mode),
  2605. SOC_ENUM_EXT("RX_HPH PWR Mode", rx_macro_hph_pwr_mode_enum,
  2606. rx_macro_get_hph_pwr_mode, rx_macro_put_hph_pwr_mode),
  2607. SOC_SINGLE_EXT("RX_Softclip Switch", SND_SOC_NOPM, 0, 1, 0,
  2608. rx_macro_soft_clip_enable_get,
  2609. rx_macro_soft_clip_enable_put),
  2610. SOC_SINGLE_EXT("AUX_HPF Switch", SND_SOC_NOPM, 0, 1, 0,
  2611. rx_macro_aux_hpf_mode_get,
  2612. rx_macro_aux_hpf_mode_put),
  2613. SOC_SINGLE_S8_TLV("IIR0 INP0 Volume",
  2614. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, -84, 40,
  2615. digital_gain),
  2616. SOC_SINGLE_S8_TLV("IIR0 INP1 Volume",
  2617. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, -84, 40,
  2618. digital_gain),
  2619. SOC_SINGLE_S8_TLV("IIR0 INP2 Volume",
  2620. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, -84, 40,
  2621. digital_gain),
  2622. SOC_SINGLE_S8_TLV("IIR0 INP3 Volume",
  2623. CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, -84, 40,
  2624. digital_gain),
  2625. SOC_SINGLE_S8_TLV("IIR1 INP0 Volume",
  2626. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, -84, 40,
  2627. digital_gain),
  2628. SOC_SINGLE_S8_TLV("IIR1 INP1 Volume",
  2629. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, -84, 40,
  2630. digital_gain),
  2631. SOC_SINGLE_S8_TLV("IIR1 INP2 Volume",
  2632. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, -84, 40,
  2633. digital_gain),
  2634. SOC_SINGLE_S8_TLV("IIR1 INP3 Volume",
  2635. CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, -84, 40,
  2636. digital_gain),
  2637. SOC_SINGLE("IIR1 Band1 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,
  2638. 0, 1, 0),
  2639. SOC_SINGLE("IIR1 Band2 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,
  2640. 1, 1, 0),
  2641. SOC_SINGLE("IIR1 Band3 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,
  2642. 2, 1, 0),
  2643. SOC_SINGLE("IIR1 Band4 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,
  2644. 3, 1, 0),
  2645. SOC_SINGLE("IIR1 Band5 Switch", CDC_RX_SIDETONE_IIR0_IIR_CTL,
  2646. 4, 1, 0),
  2647. SOC_SINGLE("IIR2 Band1 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,
  2648. 0, 1, 0),
  2649. SOC_SINGLE("IIR2 Band2 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,
  2650. 1, 1, 0),
  2651. SOC_SINGLE("IIR2 Band3 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,
  2652. 2, 1, 0),
  2653. SOC_SINGLE("IIR2 Band4 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,
  2654. 3, 1, 0),
  2655. SOC_SINGLE("IIR2 Band5 Switch", CDC_RX_SIDETONE_IIR1_IIR_CTL,
  2656. 4, 1, 0),
  2657. RX_MACRO_IIR_FILTER_CTL("IIR0 Band1", IIR0, BAND1),
  2658. RX_MACRO_IIR_FILTER_CTL("IIR0 Band2", IIR0, BAND2),
  2659. RX_MACRO_IIR_FILTER_CTL("IIR0 Band3", IIR0, BAND3),
  2660. RX_MACRO_IIR_FILTER_CTL("IIR0 Band4", IIR0, BAND4),
  2661. RX_MACRO_IIR_FILTER_CTL("IIR0 Band5", IIR0, BAND5),
  2662. RX_MACRO_IIR_FILTER_CTL("IIR1 Band1", IIR1, BAND1),
  2663. RX_MACRO_IIR_FILTER_CTL("IIR1 Band2", IIR1, BAND2),
  2664. RX_MACRO_IIR_FILTER_CTL("IIR1 Band3", IIR1, BAND3),
  2665. RX_MACRO_IIR_FILTER_CTL("IIR1 Band4", IIR1, BAND4),
  2666. RX_MACRO_IIR_FILTER_CTL("IIR1 Band5", IIR1, BAND5),
  2667. };
  2668. static int rx_macro_enable_echo(struct snd_soc_dapm_widget *w,
  2669. struct snd_kcontrol *kcontrol,
  2670. int event)
  2671. {
  2672. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  2673. u16 val, ec_hq_reg;
  2674. int ec_tx = -1;
  2675. val = snd_soc_component_read(component,
  2676. CDC_RX_INP_MUX_RX_MIX_CFG4);
  2677. if (!(strcmp(w->name, "RX MIX TX0 MUX")))
  2678. ec_tx = ((val & 0xf0) >> 0x4) - 1;
  2679. else if (!(strcmp(w->name, "RX MIX TX1 MUX")))
  2680. ec_tx = (val & 0x0f) - 1;
  2681. val = snd_soc_component_read(component,
  2682. CDC_RX_INP_MUX_RX_MIX_CFG5);
  2683. if (!(strcmp(w->name, "RX MIX TX2 MUX")))
  2684. ec_tx = (val & 0x0f) - 1;
  2685. if (ec_tx < 0 || (ec_tx >= RX_MACRO_EC_MUX_MAX)) {
  2686. dev_err(component->dev, "%s: EC mix control not set correctly\n",
  2687. __func__);
  2688. return -EINVAL;
  2689. }
  2690. ec_hq_reg = CDC_RX_EC_REF_HQ0_EC_REF_HQ_PATH_CTL +
  2691. 0x40 * ec_tx;
  2692. snd_soc_component_update_bits(component, ec_hq_reg, 0x01, 0x01);
  2693. ec_hq_reg = CDC_RX_EC_REF_HQ0_EC_REF_HQ_CFG0 +
  2694. 0x40 * ec_tx;
  2695. /* default set to 48k */
  2696. snd_soc_component_update_bits(component, ec_hq_reg, 0x1E, 0x08);
  2697. return 0;
  2698. }
  2699. static const struct snd_soc_dapm_widget rx_macro_dapm_widgets[] = {
  2700. SND_SOC_DAPM_AIF_IN("RX AIF1 PB", "RX_MACRO_AIF1 Playback", 0,
  2701. SND_SOC_NOPM, 0, 0),
  2702. SND_SOC_DAPM_AIF_IN("RX AIF2 PB", "RX_MACRO_AIF2 Playback", 0,
  2703. SND_SOC_NOPM, 0, 0),
  2704. SND_SOC_DAPM_AIF_IN("RX AIF3 PB", "RX_MACRO_AIF3 Playback", 0,
  2705. SND_SOC_NOPM, 0, 0),
  2706. SND_SOC_DAPM_AIF_IN("RX AIF4 PB", "RX_MACRO_AIF4 Playback", 0,
  2707. SND_SOC_NOPM, 0, 0),
  2708. SND_SOC_DAPM_AIF_OUT("RX AIF_ECHO", "RX_AIF_ECHO Capture", 0,
  2709. SND_SOC_NOPM, 0, 0),
  2710. SND_SOC_DAPM_MUX("RX_MACRO RX0 MUX", SND_SOC_NOPM, RX_MACRO_RX0, 0,
  2711. &rx_macro_rx0_mux),
  2712. SND_SOC_DAPM_MUX("RX_MACRO RX1 MUX", SND_SOC_NOPM, RX_MACRO_RX1, 0,
  2713. &rx_macro_rx1_mux),
  2714. SND_SOC_DAPM_MUX("RX_MACRO RX2 MUX", SND_SOC_NOPM, RX_MACRO_RX2, 0,
  2715. &rx_macro_rx2_mux),
  2716. SND_SOC_DAPM_MUX("RX_MACRO RX3 MUX", SND_SOC_NOPM, RX_MACRO_RX3, 0,
  2717. &rx_macro_rx3_mux),
  2718. SND_SOC_DAPM_MUX("RX_MACRO RX4 MUX", SND_SOC_NOPM, RX_MACRO_RX4, 0,
  2719. &rx_macro_rx4_mux),
  2720. SND_SOC_DAPM_MUX("RX_MACRO RX5 MUX", SND_SOC_NOPM, RX_MACRO_RX5, 0,
  2721. &rx_macro_rx5_mux),
  2722. SND_SOC_DAPM_MIXER("RX_RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
  2723. SND_SOC_DAPM_MIXER("RX_RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  2724. SND_SOC_DAPM_MIXER("RX_RX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  2725. SND_SOC_DAPM_MIXER("RX_RX3", SND_SOC_NOPM, 0, 0, NULL, 0),
  2726. SND_SOC_DAPM_MIXER("RX_RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
  2727. SND_SOC_DAPM_MIXER("RX_RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
  2728. SND_SOC_DAPM_MUX("IIR0 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp0_mux),
  2729. SND_SOC_DAPM_MUX("IIR0 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp1_mux),
  2730. SND_SOC_DAPM_MUX("IIR0 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp2_mux),
  2731. SND_SOC_DAPM_MUX("IIR0 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp3_mux),
  2732. SND_SOC_DAPM_MUX("IIR1 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp0_mux),
  2733. SND_SOC_DAPM_MUX("IIR1 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp1_mux),
  2734. SND_SOC_DAPM_MUX("IIR1 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp2_mux),
  2735. SND_SOC_DAPM_MUX("IIR1 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp3_mux),
  2736. SND_SOC_DAPM_MUX_E("RX MIX TX0 MUX", SND_SOC_NOPM,
  2737. RX_MACRO_EC0_MUX, 0,
  2738. &rx_mix_tx0_mux, rx_macro_enable_echo,
  2739. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  2740. SND_SOC_DAPM_MUX_E("RX MIX TX1 MUX", SND_SOC_NOPM,
  2741. RX_MACRO_EC1_MUX, 0,
  2742. &rx_mix_tx1_mux, rx_macro_enable_echo,
  2743. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  2744. SND_SOC_DAPM_MUX_E("RX MIX TX2 MUX", SND_SOC_NOPM,
  2745. RX_MACRO_EC2_MUX, 0,
  2746. &rx_mix_tx2_mux, rx_macro_enable_echo,
  2747. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  2748. SND_SOC_DAPM_MIXER_E("IIR0", CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL,
  2749. 4, 0, NULL, 0, rx_macro_set_iir_gain,
  2750. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  2751. SND_SOC_DAPM_MIXER_E("IIR1", CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL,
  2752. 4, 0, NULL, 0, rx_macro_set_iir_gain,
  2753. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
  2754. SND_SOC_DAPM_MIXER("SRC0", CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL,
  2755. 4, 0, NULL, 0),
  2756. SND_SOC_DAPM_MIXER("SRC1", CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL,
  2757. 4, 0, NULL, 0),
  2758. SND_SOC_DAPM_MUX("RX INT0 DEM MUX", SND_SOC_NOPM, 0, 0,
  2759. &rx_int0_dem_inp_mux),
  2760. SND_SOC_DAPM_MUX("RX INT1 DEM MUX", SND_SOC_NOPM, 0, 0,
  2761. &rx_int1_dem_inp_mux),
  2762. SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0,
  2763. &rx_int0_2_mux, rx_macro_enable_mix_path,
  2764. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  2765. SND_SOC_DAPM_POST_PMD),
  2766. SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0,
  2767. &rx_int1_2_mux, rx_macro_enable_mix_path,
  2768. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  2769. SND_SOC_DAPM_POST_PMD),
  2770. SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0,
  2771. &rx_int2_2_mux, rx_macro_enable_mix_path,
  2772. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  2773. SND_SOC_DAPM_POST_PMD),
  2774. SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, &rx_int0_1_mix_inp0_mux),
  2775. SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx_int0_1_mix_inp1_mux),
  2776. SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, &rx_int0_1_mix_inp2_mux),
  2777. SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, &rx_int1_1_mix_inp0_mux),
  2778. SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx_int1_1_mix_inp1_mux),
  2779. SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, &rx_int1_1_mix_inp2_mux),
  2780. SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP0", SND_SOC_NOPM, 0, 0, &rx_int2_1_mix_inp0_mux),
  2781. SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP1", SND_SOC_NOPM, 0, 0, &rx_int2_1_mix_inp1_mux),
  2782. SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP2", SND_SOC_NOPM, 0, 0, &rx_int2_1_mix_inp2_mux),
  2783. SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0,
  2784. &rx_int0_1_interp_mux, rx_macro_enable_main_path,
  2785. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  2786. SND_SOC_DAPM_POST_PMD),
  2787. SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0,
  2788. &rx_int1_1_interp_mux, rx_macro_enable_main_path,
  2789. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  2790. SND_SOC_DAPM_POST_PMD),
  2791. SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0,
  2792. &rx_int2_1_interp_mux, rx_macro_enable_main_path,
  2793. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  2794. SND_SOC_DAPM_POST_PMD),
  2795. SND_SOC_DAPM_MUX("RX INT0_2 INTERP", SND_SOC_NOPM, 0, 0,
  2796. &rx_int0_2_interp_mux),
  2797. SND_SOC_DAPM_MUX("RX INT1_2 INTERP", SND_SOC_NOPM, 0, 0,
  2798. &rx_int1_2_interp_mux),
  2799. SND_SOC_DAPM_MUX("RX INT2_2 INTERP", SND_SOC_NOPM, 0, 0,
  2800. &rx_int2_2_interp_mux),
  2801. SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  2802. SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
  2803. SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  2804. SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
  2805. SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  2806. SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
  2807. SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL,
  2808. 0, &rx_int0_mix2_inp_mux, rx_macro_enable_rx_path_clk,
  2809. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  2810. SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR,
  2811. 0, &rx_int1_mix2_inp_mux, rx_macro_enable_rx_path_clk,
  2812. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  2813. SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_AUX,
  2814. 0, &rx_int2_mix2_inp_mux, rx_macro_enable_rx_path_clk,
  2815. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  2816. SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  2817. SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  2818. SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  2819. SND_SOC_DAPM_OUTPUT("HPHL_OUT"),
  2820. SND_SOC_DAPM_OUTPUT("HPHR_OUT"),
  2821. SND_SOC_DAPM_OUTPUT("AUX_OUT"),
  2822. SND_SOC_DAPM_INPUT("RX_TX DEC0_INP"),
  2823. SND_SOC_DAPM_INPUT("RX_TX DEC1_INP"),
  2824. SND_SOC_DAPM_INPUT("RX_TX DEC2_INP"),
  2825. SND_SOC_DAPM_INPUT("RX_TX DEC3_INP"),
  2826. SND_SOC_DAPM_SUPPLY_S("RX_MCLK", 0, SND_SOC_NOPM, 0, 0,
  2827. rx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  2828. };
  2829. static const struct snd_soc_dapm_route rx_audio_map[] = {
  2830. {"RX AIF1 PB", NULL, "RX_MCLK"},
  2831. {"RX AIF2 PB", NULL, "RX_MCLK"},
  2832. {"RX AIF3 PB", NULL, "RX_MCLK"},
  2833. {"RX AIF4 PB", NULL, "RX_MCLK"},
  2834. {"RX_MACRO RX0 MUX", "AIF1_PB", "RX AIF1 PB"},
  2835. {"RX_MACRO RX1 MUX", "AIF1_PB", "RX AIF1 PB"},
  2836. {"RX_MACRO RX2 MUX", "AIF1_PB", "RX AIF1 PB"},
  2837. {"RX_MACRO RX3 MUX", "AIF1_PB", "RX AIF1 PB"},
  2838. {"RX_MACRO RX4 MUX", "AIF1_PB", "RX AIF1 PB"},
  2839. {"RX_MACRO RX5 MUX", "AIF1_PB", "RX AIF1 PB"},
  2840. {"RX_MACRO RX0 MUX", "AIF2_PB", "RX AIF2 PB"},
  2841. {"RX_MACRO RX1 MUX", "AIF2_PB", "RX AIF2 PB"},
  2842. {"RX_MACRO RX2 MUX", "AIF2_PB", "RX AIF2 PB"},
  2843. {"RX_MACRO RX3 MUX", "AIF2_PB", "RX AIF2 PB"},
  2844. {"RX_MACRO RX4 MUX", "AIF2_PB", "RX AIF2 PB"},
  2845. {"RX_MACRO RX5 MUX", "AIF2_PB", "RX AIF2 PB"},
  2846. {"RX_MACRO RX0 MUX", "AIF3_PB", "RX AIF3 PB"},
  2847. {"RX_MACRO RX1 MUX", "AIF3_PB", "RX AIF3 PB"},
  2848. {"RX_MACRO RX2 MUX", "AIF3_PB", "RX AIF3 PB"},
  2849. {"RX_MACRO RX3 MUX", "AIF3_PB", "RX AIF3 PB"},
  2850. {"RX_MACRO RX4 MUX", "AIF3_PB", "RX AIF3 PB"},
  2851. {"RX_MACRO RX5 MUX", "AIF3_PB", "RX AIF3 PB"},
  2852. {"RX_MACRO RX0 MUX", "AIF4_PB", "RX AIF4 PB"},
  2853. {"RX_MACRO RX1 MUX", "AIF4_PB", "RX AIF4 PB"},
  2854. {"RX_MACRO RX2 MUX", "AIF4_PB", "RX AIF4 PB"},
  2855. {"RX_MACRO RX3 MUX", "AIF4_PB", "RX AIF4 PB"},
  2856. {"RX_MACRO RX4 MUX", "AIF4_PB", "RX AIF4 PB"},
  2857. {"RX_MACRO RX5 MUX", "AIF4_PB", "RX AIF4 PB"},
  2858. {"RX_RX0", NULL, "RX_MACRO RX0 MUX"},
  2859. {"RX_RX1", NULL, "RX_MACRO RX1 MUX"},
  2860. {"RX_RX2", NULL, "RX_MACRO RX2 MUX"},
  2861. {"RX_RX3", NULL, "RX_MACRO RX3 MUX"},
  2862. {"RX_RX4", NULL, "RX_MACRO RX4 MUX"},
  2863. {"RX_RX5", NULL, "RX_MACRO RX5 MUX"},
  2864. {"RX INT0_1 MIX1 INP0", "RX0", "RX_RX0"},
  2865. {"RX INT0_1 MIX1 INP0", "RX1", "RX_RX1"},
  2866. {"RX INT0_1 MIX1 INP0", "RX2", "RX_RX2"},
  2867. {"RX INT0_1 MIX1 INP0", "RX3", "RX_RX3"},
  2868. {"RX INT0_1 MIX1 INP0", "RX4", "RX_RX4"},
  2869. {"RX INT0_1 MIX1 INP0", "RX5", "RX_RX5"},
  2870. {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"},
  2871. {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"},
  2872. {"RX INT0_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"},
  2873. {"RX INT0_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"},
  2874. {"RX INT0_1 MIX1 INP1", "RX0", "RX_RX0"},
  2875. {"RX INT0_1 MIX1 INP1", "RX1", "RX_RX1"},
  2876. {"RX INT0_1 MIX1 INP1", "RX2", "RX_RX2"},
  2877. {"RX INT0_1 MIX1 INP1", "RX3", "RX_RX3"},
  2878. {"RX INT0_1 MIX1 INP1", "RX4", "RX_RX4"},
  2879. {"RX INT0_1 MIX1 INP1", "RX5", "RX_RX5"},
  2880. {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"},
  2881. {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"},
  2882. {"RX INT0_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"},
  2883. {"RX INT0_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"},
  2884. {"RX INT0_1 MIX1 INP2", "RX0", "RX_RX0"},
  2885. {"RX INT0_1 MIX1 INP2", "RX1", "RX_RX1"},
  2886. {"RX INT0_1 MIX1 INP2", "RX2", "RX_RX2"},
  2887. {"RX INT0_1 MIX1 INP2", "RX3", "RX_RX3"},
  2888. {"RX INT0_1 MIX1 INP2", "RX4", "RX_RX4"},
  2889. {"RX INT0_1 MIX1 INP2", "RX5", "RX_RX5"},
  2890. {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"},
  2891. {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"},
  2892. {"RX INT0_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"},
  2893. {"RX INT0_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"},
  2894. {"RX INT1_1 MIX1 INP0", "RX0", "RX_RX0"},
  2895. {"RX INT1_1 MIX1 INP0", "RX1", "RX_RX1"},
  2896. {"RX INT1_1 MIX1 INP0", "RX2", "RX_RX2"},
  2897. {"RX INT1_1 MIX1 INP0", "RX3", "RX_RX3"},
  2898. {"RX INT1_1 MIX1 INP0", "RX4", "RX_RX4"},
  2899. {"RX INT1_1 MIX1 INP0", "RX5", "RX_RX5"},
  2900. {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"},
  2901. {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"},
  2902. {"RX INT1_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"},
  2903. {"RX INT1_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"},
  2904. {"RX INT1_1 MIX1 INP1", "RX0", "RX_RX0"},
  2905. {"RX INT1_1 MIX1 INP1", "RX1", "RX_RX1"},
  2906. {"RX INT1_1 MIX1 INP1", "RX2", "RX_RX2"},
  2907. {"RX INT1_1 MIX1 INP1", "RX3", "RX_RX3"},
  2908. {"RX INT1_1 MIX1 INP1", "RX4", "RX_RX4"},
  2909. {"RX INT1_1 MIX1 INP1", "RX5", "RX_RX5"},
  2910. {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"},
  2911. {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"},
  2912. {"RX INT1_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"},
  2913. {"RX INT1_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"},
  2914. {"RX INT1_1 MIX1 INP2", "RX0", "RX_RX0"},
  2915. {"RX INT1_1 MIX1 INP2", "RX1", "RX_RX1"},
  2916. {"RX INT1_1 MIX1 INP2", "RX2", "RX_RX2"},
  2917. {"RX INT1_1 MIX1 INP2", "RX3", "RX_RX3"},
  2918. {"RX INT1_1 MIX1 INP2", "RX4", "RX_RX4"},
  2919. {"RX INT1_1 MIX1 INP2", "RX5", "RX_RX5"},
  2920. {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"},
  2921. {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"},
  2922. {"RX INT1_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"},
  2923. {"RX INT1_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"},
  2924. {"RX INT2_1 MIX1 INP0", "RX0", "RX_RX0"},
  2925. {"RX INT2_1 MIX1 INP0", "RX1", "RX_RX1"},
  2926. {"RX INT2_1 MIX1 INP0", "RX2", "RX_RX2"},
  2927. {"RX INT2_1 MIX1 INP0", "RX3", "RX_RX3"},
  2928. {"RX INT2_1 MIX1 INP0", "RX4", "RX_RX4"},
  2929. {"RX INT2_1 MIX1 INP0", "RX5", "RX_RX5"},
  2930. {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"},
  2931. {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"},
  2932. {"RX INT2_1 MIX1 INP0", "DEC0", "RX_TX DEC0_INP"},
  2933. {"RX INT2_1 MIX1 INP0", "DEC1", "RX_TX DEC1_INP"},
  2934. {"RX INT2_1 MIX1 INP1", "RX0", "RX_RX0"},
  2935. {"RX INT2_1 MIX1 INP1", "RX1", "RX_RX1"},
  2936. {"RX INT2_1 MIX1 INP1", "RX2", "RX_RX2"},
  2937. {"RX INT2_1 MIX1 INP1", "RX3", "RX_RX3"},
  2938. {"RX INT2_1 MIX1 INP1", "RX4", "RX_RX4"},
  2939. {"RX INT2_1 MIX1 INP1", "RX5", "RX_RX5"},
  2940. {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"},
  2941. {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"},
  2942. {"RX INT2_1 MIX1 INP1", "DEC0", "RX_TX DEC0_INP"},
  2943. {"RX INT2_1 MIX1 INP1", "DEC1", "RX_TX DEC1_INP"},
  2944. {"RX INT2_1 MIX1 INP2", "RX0", "RX_RX0"},
  2945. {"RX INT2_1 MIX1 INP2", "RX1", "RX_RX1"},
  2946. {"RX INT2_1 MIX1 INP2", "RX2", "RX_RX2"},
  2947. {"RX INT2_1 MIX1 INP2", "RX3", "RX_RX3"},
  2948. {"RX INT2_1 MIX1 INP2", "RX4", "RX_RX4"},
  2949. {"RX INT2_1 MIX1 INP2", "RX5", "RX_RX5"},
  2950. {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"},
  2951. {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"},
  2952. {"RX INT2_1 MIX1 INP2", "DEC0", "RX_TX DEC0_INP"},
  2953. {"RX INT2_1 MIX1 INP2", "DEC1", "RX_TX DEC1_INP"},
  2954. {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"},
  2955. {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"},
  2956. {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"},
  2957. {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"},
  2958. {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"},
  2959. {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"},
  2960. {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"},
  2961. {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"},
  2962. {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"},
  2963. {"RX MIX TX0 MUX", "RX_MIX0", "RX INT0 SEC MIX"},
  2964. {"RX MIX TX0 MUX", "RX_MIX1", "RX INT1 SEC MIX"},
  2965. {"RX MIX TX0 MUX", "RX_MIX2", "RX INT2 SEC MIX"},
  2966. {"RX MIX TX1 MUX", "RX_MIX0", "RX INT0 SEC MIX"},
  2967. {"RX MIX TX1 MUX", "RX_MIX1", "RX INT1 SEC MIX"},
  2968. {"RX MIX TX1 MUX", "RX_MIX2", "RX INT2 SEC MIX"},
  2969. {"RX MIX TX2 MUX", "RX_MIX0", "RX INT0 SEC MIX"},
  2970. {"RX MIX TX2 MUX", "RX_MIX1", "RX INT1 SEC MIX"},
  2971. {"RX MIX TX2 MUX", "RX_MIX2", "RX INT2 SEC MIX"},
  2972. {"RX AIF_ECHO", NULL, "RX MIX TX0 MUX"},
  2973. {"RX AIF_ECHO", NULL, "RX MIX TX1 MUX"},
  2974. {"RX AIF_ECHO", NULL, "RX MIX TX2 MUX"},
  2975. {"RX AIF_ECHO", NULL, "RX_MCLK"},
  2976. /* Mixing path INT0 */
  2977. {"RX INT0_2 MUX", "RX0", "RX_RX0"},
  2978. {"RX INT0_2 MUX", "RX1", "RX_RX1"},
  2979. {"RX INT0_2 MUX", "RX2", "RX_RX2"},
  2980. {"RX INT0_2 MUX", "RX3", "RX_RX3"},
  2981. {"RX INT0_2 MUX", "RX4", "RX_RX4"},
  2982. {"RX INT0_2 MUX", "RX5", "RX_RX5"},
  2983. {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"},
  2984. {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"},
  2985. /* Mixing path INT1 */
  2986. {"RX INT1_2 MUX", "RX0", "RX_RX0"},
  2987. {"RX INT1_2 MUX", "RX1", "RX_RX1"},
  2988. {"RX INT1_2 MUX", "RX2", "RX_RX2"},
  2989. {"RX INT1_2 MUX", "RX3", "RX_RX3"},
  2990. {"RX INT1_2 MUX", "RX4", "RX_RX4"},
  2991. {"RX INT1_2 MUX", "RX5", "RX_RX5"},
  2992. {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"},
  2993. {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"},
  2994. /* Mixing path INT2 */
  2995. {"RX INT2_2 MUX", "RX0", "RX_RX0"},
  2996. {"RX INT2_2 MUX", "RX1", "RX_RX1"},
  2997. {"RX INT2_2 MUX", "RX2", "RX_RX2"},
  2998. {"RX INT2_2 MUX", "RX3", "RX_RX3"},
  2999. {"RX INT2_2 MUX", "RX4", "RX_RX4"},
  3000. {"RX INT2_2 MUX", "RX5", "RX_RX5"},
  3001. {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"},
  3002. {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"},
  3003. {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"},
  3004. {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"},
  3005. {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"},
  3006. {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"},
  3007. {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"},
  3008. {"HPHL_OUT", NULL, "RX INT0 DEM MUX"},
  3009. {"HPHL_OUT", NULL, "RX_MCLK"},
  3010. {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"},
  3011. {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"},
  3012. {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"},
  3013. {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"},
  3014. {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX2"},
  3015. {"HPHR_OUT", NULL, "RX INT1 DEM MUX"},
  3016. {"HPHR_OUT", NULL, "RX_MCLK"},
  3017. {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"},
  3018. {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"},
  3019. {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"},
  3020. {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"},
  3021. {"AUX_OUT", NULL, "RX INT2 MIX2"},
  3022. {"AUX_OUT", NULL, "RX_MCLK"},
  3023. {"IIR0", NULL, "RX_MCLK"},
  3024. {"IIR0", NULL, "IIR0 INP0 MUX"},
  3025. {"IIR0 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
  3026. {"IIR0 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
  3027. {"IIR0 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
  3028. {"IIR0 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
  3029. {"IIR0 INP0 MUX", "RX0", "RX_RX0"},
  3030. {"IIR0 INP0 MUX", "RX1", "RX_RX1"},
  3031. {"IIR0 INP0 MUX", "RX2", "RX_RX2"},
  3032. {"IIR0 INP0 MUX", "RX3", "RX_RX3"},
  3033. {"IIR0 INP0 MUX", "RX4", "RX_RX4"},
  3034. {"IIR0 INP0 MUX", "RX5", "RX_RX5"},
  3035. {"IIR0", NULL, "IIR0 INP1 MUX"},
  3036. {"IIR0 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
  3037. {"IIR0 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
  3038. {"IIR0 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
  3039. {"IIR0 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
  3040. {"IIR0 INP1 MUX", "RX0", "RX_RX0"},
  3041. {"IIR0 INP1 MUX", "RX1", "RX_RX1"},
  3042. {"IIR0 INP1 MUX", "RX2", "RX_RX2"},
  3043. {"IIR0 INP1 MUX", "RX3", "RX_RX3"},
  3044. {"IIR0 INP1 MUX", "RX4", "RX_RX4"},
  3045. {"IIR0 INP1 MUX", "RX5", "RX_RX5"},
  3046. {"IIR0", NULL, "IIR0 INP2 MUX"},
  3047. {"IIR0 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
  3048. {"IIR0 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
  3049. {"IIR0 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
  3050. {"IIR0 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
  3051. {"IIR0 INP2 MUX", "RX0", "RX_RX0"},
  3052. {"IIR0 INP2 MUX", "RX1", "RX_RX1"},
  3053. {"IIR0 INP2 MUX", "RX2", "RX_RX2"},
  3054. {"IIR0 INP2 MUX", "RX3", "RX_RX3"},
  3055. {"IIR0 INP2 MUX", "RX4", "RX_RX4"},
  3056. {"IIR0 INP2 MUX", "RX5", "RX_RX5"},
  3057. {"IIR0", NULL, "IIR0 INP3 MUX"},
  3058. {"IIR0 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
  3059. {"IIR0 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
  3060. {"IIR0 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
  3061. {"IIR0 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
  3062. {"IIR0 INP3 MUX", "RX0", "RX_RX0"},
  3063. {"IIR0 INP3 MUX", "RX1", "RX_RX1"},
  3064. {"IIR0 INP3 MUX", "RX2", "RX_RX2"},
  3065. {"IIR0 INP3 MUX", "RX3", "RX_RX3"},
  3066. {"IIR0 INP3 MUX", "RX4", "RX_RX4"},
  3067. {"IIR0 INP3 MUX", "RX5", "RX_RX5"},
  3068. {"IIR1", NULL, "RX_MCLK"},
  3069. {"IIR1", NULL, "IIR1 INP0 MUX"},
  3070. {"IIR1 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
  3071. {"IIR1 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
  3072. {"IIR1 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
  3073. {"IIR1 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
  3074. {"IIR1 INP0 MUX", "RX0", "RX_RX0"},
  3075. {"IIR1 INP0 MUX", "RX1", "RX_RX1"},
  3076. {"IIR1 INP0 MUX", "RX2", "RX_RX2"},
  3077. {"IIR1 INP0 MUX", "RX3", "RX_RX3"},
  3078. {"IIR1 INP0 MUX", "RX4", "RX_RX4"},
  3079. {"IIR1 INP0 MUX", "RX5", "RX_RX5"},
  3080. {"IIR1", NULL, "IIR1 INP1 MUX"},
  3081. {"IIR1 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
  3082. {"IIR1 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
  3083. {"IIR1 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
  3084. {"IIR1 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
  3085. {"IIR1 INP1 MUX", "RX0", "RX_RX0"},
  3086. {"IIR1 INP1 MUX", "RX1", "RX_RX1"},
  3087. {"IIR1 INP1 MUX", "RX2", "RX_RX2"},
  3088. {"IIR1 INP1 MUX", "RX3", "RX_RX3"},
  3089. {"IIR1 INP1 MUX", "RX4", "RX_RX4"},
  3090. {"IIR1 INP1 MUX", "RX5", "RX_RX5"},
  3091. {"IIR1", NULL, "IIR1 INP2 MUX"},
  3092. {"IIR1 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
  3093. {"IIR1 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
  3094. {"IIR1 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
  3095. {"IIR1 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
  3096. {"IIR1 INP2 MUX", "RX0", "RX_RX0"},
  3097. {"IIR1 INP2 MUX", "RX1", "RX_RX1"},
  3098. {"IIR1 INP2 MUX", "RX2", "RX_RX2"},
  3099. {"IIR1 INP2 MUX", "RX3", "RX_RX3"},
  3100. {"IIR1 INP2 MUX", "RX4", "RX_RX4"},
  3101. {"IIR1 INP2 MUX", "RX5", "RX_RX5"},
  3102. {"IIR1", NULL, "IIR1 INP3 MUX"},
  3103. {"IIR1 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
  3104. {"IIR1 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
  3105. {"IIR1 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
  3106. {"IIR1 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
  3107. {"IIR1 INP3 MUX", "RX0", "RX_RX0"},
  3108. {"IIR1 INP3 MUX", "RX1", "RX_RX1"},
  3109. {"IIR1 INP3 MUX", "RX2", "RX_RX2"},
  3110. {"IIR1 INP3 MUX", "RX3", "RX_RX3"},
  3111. {"IIR1 INP3 MUX", "RX4", "RX_RX4"},
  3112. {"IIR1 INP3 MUX", "RX5", "RX_RX5"},
  3113. {"SRC0", NULL, "IIR0"},
  3114. {"SRC1", NULL, "IIR1"},
  3115. {"RX INT0 MIX2 INP", "SRC0", "SRC0"},
  3116. {"RX INT0 MIX2 INP", "SRC1", "SRC1"},
  3117. {"RX INT1 MIX2 INP", "SRC0", "SRC0"},
  3118. {"RX INT1 MIX2 INP", "SRC1", "SRC1"},
  3119. {"RX INT2 MIX2 INP", "SRC0", "SRC0"},
  3120. {"RX INT2 MIX2 INP", "SRC1", "SRC1"},
  3121. };
  3122. static int rx_macro_component_probe(struct snd_soc_component *component)
  3123. {
  3124. struct rx_macro *rx = snd_soc_component_get_drvdata(component);
  3125. snd_soc_component_init_regmap(component, rx->regmap);
  3126. snd_soc_component_update_bits(component, CDC_RX_RX0_RX_PATH_SEC7,
  3127. CDC_RX_DSM_OUT_DELAY_SEL_MASK,
  3128. CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE);
  3129. snd_soc_component_update_bits(component, CDC_RX_RX1_RX_PATH_SEC7,
  3130. CDC_RX_DSM_OUT_DELAY_SEL_MASK,
  3131. CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE);
  3132. snd_soc_component_update_bits(component, CDC_RX_RX2_RX_PATH_SEC7,
  3133. CDC_RX_DSM_OUT_DELAY_SEL_MASK,
  3134. CDC_RX_DSM_OUT_DELAY_TWO_SAMPLE);
  3135. snd_soc_component_update_bits(component, CDC_RX_RX0_RX_PATH_CFG3,
  3136. CDC_RX_DC_COEFF_SEL_MASK,
  3137. CDC_RX_DC_COEFF_SEL_TWO);
  3138. snd_soc_component_update_bits(component, CDC_RX_RX1_RX_PATH_CFG3,
  3139. CDC_RX_DC_COEFF_SEL_MASK,
  3140. CDC_RX_DC_COEFF_SEL_TWO);
  3141. snd_soc_component_update_bits(component, CDC_RX_RX2_RX_PATH_CFG3,
  3142. CDC_RX_DC_COEFF_SEL_MASK,
  3143. CDC_RX_DC_COEFF_SEL_TWO);
  3144. rx->component = component;
  3145. return 0;
  3146. }
  3147. static int swclk_gate_enable(struct clk_hw *hw)
  3148. {
  3149. struct rx_macro *rx = to_rx_macro(hw);
  3150. int ret;
  3151. ret = clk_prepare_enable(rx->mclk);
  3152. if (ret) {
  3153. dev_err(rx->dev, "unable to prepare mclk\n");
  3154. return ret;
  3155. }
  3156. rx_macro_mclk_enable(rx, true);
  3157. regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
  3158. CDC_RX_SWR_RESET_MASK,
  3159. CDC_RX_SWR_RESET);
  3160. regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
  3161. CDC_RX_SWR_CLK_EN_MASK, 1);
  3162. regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
  3163. CDC_RX_SWR_RESET_MASK, 0);
  3164. return 0;
  3165. }
  3166. static void swclk_gate_disable(struct clk_hw *hw)
  3167. {
  3168. struct rx_macro *rx = to_rx_macro(hw);
  3169. regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
  3170. CDC_RX_SWR_CLK_EN_MASK, 0);
  3171. rx_macro_mclk_enable(rx, false);
  3172. clk_disable_unprepare(rx->mclk);
  3173. }
  3174. static int swclk_gate_is_enabled(struct clk_hw *hw)
  3175. {
  3176. struct rx_macro *rx = to_rx_macro(hw);
  3177. int ret, val;
  3178. regmap_read(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, &val);
  3179. ret = val & BIT(0);
  3180. return ret;
  3181. }
  3182. static unsigned long swclk_recalc_rate(struct clk_hw *hw,
  3183. unsigned long parent_rate)
  3184. {
  3185. return parent_rate / 2;
  3186. }
  3187. static const struct clk_ops swclk_gate_ops = {
  3188. .prepare = swclk_gate_enable,
  3189. .unprepare = swclk_gate_disable,
  3190. .is_enabled = swclk_gate_is_enabled,
  3191. .recalc_rate = swclk_recalc_rate,
  3192. };
  3193. static int rx_macro_register_mclk_output(struct rx_macro *rx)
  3194. {
  3195. struct device *dev = rx->dev;
  3196. const char *parent_clk_name = NULL;
  3197. const char *clk_name = "lpass-rx-mclk";
  3198. struct clk_hw *hw;
  3199. struct clk_init_data init;
  3200. int ret;
  3201. parent_clk_name = __clk_get_name(rx->npl);
  3202. init.name = clk_name;
  3203. init.ops = &swclk_gate_ops;
  3204. init.flags = 0;
  3205. init.parent_names = &parent_clk_name;
  3206. init.num_parents = 1;
  3207. rx->hw.init = &init;
  3208. hw = &rx->hw;
  3209. ret = devm_clk_hw_register(rx->dev, hw);
  3210. if (ret)
  3211. return ret;
  3212. return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
  3213. }
  3214. static const struct snd_soc_component_driver rx_macro_component_drv = {
  3215. .name = "RX-MACRO",
  3216. .probe = rx_macro_component_probe,
  3217. .controls = rx_macro_snd_controls,
  3218. .num_controls = ARRAY_SIZE(rx_macro_snd_controls),
  3219. .dapm_widgets = rx_macro_dapm_widgets,
  3220. .num_dapm_widgets = ARRAY_SIZE(rx_macro_dapm_widgets),
  3221. .dapm_routes = rx_audio_map,
  3222. .num_dapm_routes = ARRAY_SIZE(rx_audio_map),
  3223. };
  3224. static int rx_macro_probe(struct platform_device *pdev)
  3225. {
  3226. struct device *dev = &pdev->dev;
  3227. struct rx_macro *rx;
  3228. void __iomem *base;
  3229. int ret;
  3230. rx = devm_kzalloc(dev, sizeof(*rx), GFP_KERNEL);
  3231. if (!rx)
  3232. return -ENOMEM;
  3233. rx->macro = devm_clk_get_optional(dev, "macro");
  3234. if (IS_ERR(rx->macro))
  3235. return PTR_ERR(rx->macro);
  3236. rx->dcodec = devm_clk_get_optional(dev, "dcodec");
  3237. if (IS_ERR(rx->dcodec))
  3238. return PTR_ERR(rx->dcodec);
  3239. rx->mclk = devm_clk_get(dev, "mclk");
  3240. if (IS_ERR(rx->mclk))
  3241. return PTR_ERR(rx->mclk);
  3242. rx->npl = devm_clk_get(dev, "npl");
  3243. if (IS_ERR(rx->npl))
  3244. return PTR_ERR(rx->npl);
  3245. rx->fsgen = devm_clk_get(dev, "fsgen");
  3246. if (IS_ERR(rx->fsgen))
  3247. return PTR_ERR(rx->fsgen);
  3248. rx->pds = lpass_macro_pds_init(dev);
  3249. if (IS_ERR(rx->pds))
  3250. return PTR_ERR(rx->pds);
  3251. base = devm_platform_ioremap_resource(pdev, 0);
  3252. if (IS_ERR(base)) {
  3253. ret = PTR_ERR(base);
  3254. goto err;
  3255. }
  3256. rx->regmap = devm_regmap_init_mmio(dev, base, &rx_regmap_config);
  3257. if (IS_ERR(rx->regmap)) {
  3258. ret = PTR_ERR(rx->regmap);
  3259. goto err;
  3260. }
  3261. dev_set_drvdata(dev, rx);
  3262. rx->dev = dev;
  3263. /* set MCLK and NPL rates */
  3264. clk_set_rate(rx->mclk, MCLK_FREQ);
  3265. clk_set_rate(rx->npl, MCLK_FREQ);
  3266. ret = clk_prepare_enable(rx->macro);
  3267. if (ret)
  3268. goto err;
  3269. ret = clk_prepare_enable(rx->dcodec);
  3270. if (ret)
  3271. goto err_dcodec;
  3272. ret = clk_prepare_enable(rx->mclk);
  3273. if (ret)
  3274. goto err_mclk;
  3275. ret = clk_prepare_enable(rx->npl);
  3276. if (ret)
  3277. goto err_npl;
  3278. ret = clk_prepare_enable(rx->fsgen);
  3279. if (ret)
  3280. goto err_fsgen;
  3281. ret = devm_snd_soc_register_component(dev, &rx_macro_component_drv,
  3282. rx_macro_dai,
  3283. ARRAY_SIZE(rx_macro_dai));
  3284. if (ret)
  3285. goto err_clkout;
  3286. pm_runtime_set_autosuspend_delay(dev, 3000);
  3287. pm_runtime_use_autosuspend(dev);
  3288. pm_runtime_mark_last_busy(dev);
  3289. pm_runtime_set_active(dev);
  3290. pm_runtime_enable(dev);
  3291. ret = rx_macro_register_mclk_output(rx);
  3292. if (ret)
  3293. goto err_clkout;
  3294. return 0;
  3295. err_clkout:
  3296. clk_disable_unprepare(rx->fsgen);
  3297. err_fsgen:
  3298. clk_disable_unprepare(rx->npl);
  3299. err_npl:
  3300. clk_disable_unprepare(rx->mclk);
  3301. err_mclk:
  3302. clk_disable_unprepare(rx->dcodec);
  3303. err_dcodec:
  3304. clk_disable_unprepare(rx->macro);
  3305. err:
  3306. lpass_macro_pds_exit(rx->pds);
  3307. return ret;
  3308. }
  3309. static int rx_macro_remove(struct platform_device *pdev)
  3310. {
  3311. struct rx_macro *rx = dev_get_drvdata(&pdev->dev);
  3312. clk_disable_unprepare(rx->mclk);
  3313. clk_disable_unprepare(rx->npl);
  3314. clk_disable_unprepare(rx->fsgen);
  3315. clk_disable_unprepare(rx->macro);
  3316. clk_disable_unprepare(rx->dcodec);
  3317. lpass_macro_pds_exit(rx->pds);
  3318. return 0;
  3319. }
  3320. static const struct of_device_id rx_macro_dt_match[] = {
  3321. { .compatible = "qcom,sc7280-lpass-rx-macro" },
  3322. { .compatible = "qcom,sm8250-lpass-rx-macro" },
  3323. { .compatible = "qcom,sm8450-lpass-rx-macro" },
  3324. { .compatible = "qcom,sc8280xp-lpass-rx-macro" },
  3325. { }
  3326. };
  3327. MODULE_DEVICE_TABLE(of, rx_macro_dt_match);
  3328. static int __maybe_unused rx_macro_runtime_suspend(struct device *dev)
  3329. {
  3330. struct rx_macro *rx = dev_get_drvdata(dev);
  3331. regcache_cache_only(rx->regmap, true);
  3332. regcache_mark_dirty(rx->regmap);
  3333. clk_disable_unprepare(rx->fsgen);
  3334. clk_disable_unprepare(rx->npl);
  3335. clk_disable_unprepare(rx->mclk);
  3336. return 0;
  3337. }
  3338. static int __maybe_unused rx_macro_runtime_resume(struct device *dev)
  3339. {
  3340. struct rx_macro *rx = dev_get_drvdata(dev);
  3341. int ret;
  3342. ret = clk_prepare_enable(rx->mclk);
  3343. if (ret) {
  3344. dev_err(dev, "unable to prepare mclk\n");
  3345. return ret;
  3346. }
  3347. ret = clk_prepare_enable(rx->npl);
  3348. if (ret) {
  3349. dev_err(dev, "unable to prepare mclkx2\n");
  3350. goto err_npl;
  3351. }
  3352. ret = clk_prepare_enable(rx->fsgen);
  3353. if (ret) {
  3354. dev_err(dev, "unable to prepare fsgen\n");
  3355. goto err_fsgen;
  3356. }
  3357. regcache_cache_only(rx->regmap, false);
  3358. regcache_sync(rx->regmap);
  3359. return 0;
  3360. err_fsgen:
  3361. clk_disable_unprepare(rx->npl);
  3362. err_npl:
  3363. clk_disable_unprepare(rx->mclk);
  3364. return ret;
  3365. }
  3366. static const struct dev_pm_ops rx_macro_pm_ops = {
  3367. SET_RUNTIME_PM_OPS(rx_macro_runtime_suspend, rx_macro_runtime_resume, NULL)
  3368. };
  3369. static struct platform_driver rx_macro_driver = {
  3370. .driver = {
  3371. .name = "rx_macro",
  3372. .of_match_table = rx_macro_dt_match,
  3373. .suppress_bind_attrs = true,
  3374. .pm = &rx_macro_pm_ops,
  3375. },
  3376. .probe = rx_macro_probe,
  3377. .remove = rx_macro_remove,
  3378. };
  3379. module_platform_driver(rx_macro_driver);
  3380. MODULE_DESCRIPTION("RX macro driver");
  3381. MODULE_LICENSE("GPL");