msm-analog-cdc.c 136 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665
  1. /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/init.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/printk.h>
  16. #include <linux/debugfs.h>
  17. #include <linux/delay.h>
  18. #include <linux/regulator/consumer.h>
  19. #include <linux/workqueue.h>
  20. #include <linux/regmap.h>
  21. #include <sound/pcm.h>
  22. #include <sound/pcm_params.h>
  23. #include <sound/soc.h>
  24. #include <sound/soc-dapm.h>
  25. #include <sound/tlv.h>
  26. #include <dsp/audio_notifier.h>
  27. #include <dsp/q6afe-v2.h>
  28. #include <dsp/q6core.h>
  29. #include <ipc/apr.h>
  30. #include "msm-analog-cdc.h"
  31. #include "msm-cdc-common.h"
  32. #include "sdm660-cdc-irq.h"
  33. #include "msm-analog-cdc-regmap.h"
  34. #include "../../sdm660-common.h"
  35. #include "../wcd-mbhc-v2-api.h"
  36. #define DRV_NAME "pmic_analog_codec"
  37. #define SDM660_CDC_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
  38. SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\
  39. SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\
  40. SNDRV_PCM_RATE_192000)
  41. #define SDM660_CDC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
  42. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE)
  43. #define MSM_DIG_CDC_STRING_LEN 80
  44. #define MSM_ANLG_CDC_VERSION_ENTRY_SIZE 32
  45. #define CODEC_DT_MAX_PROP_SIZE 40
  46. #define MAX_ON_DEMAND_SUPPLY_NAME_LENGTH 64
  47. #define BUS_DOWN 1
  48. /*
  49. * 200 Milliseconds sufficient for DSP bring up in the lpass
  50. * after Sub System Restart
  51. */
  52. #define ADSP_STATE_READY_TIMEOUT_MS 200
  53. #define EAR_PMD 0
  54. #define EAR_PMU 1
  55. #define SPK_PMD 2
  56. #define SPK_PMU 3
  57. #define MICBIAS_DEFAULT_VAL 1800000
  58. #define MICBIAS_MIN_VAL 1600000
  59. #define MICBIAS_STEP_SIZE 50000
  60. #define DEFAULT_BOOST_VOLTAGE 5000
  61. #define MIN_BOOST_VOLTAGE 4000
  62. #define MAX_BOOST_VOLTAGE 5550
  63. #define BOOST_VOLTAGE_STEP 50
  64. #define SDM660_CDC_MBHC_BTN_COARSE_ADJ 100 /* in mV */
  65. #define SDM660_CDC_MBHC_BTN_FINE_ADJ 12 /* in mV */
  66. #define VOLTAGE_CONVERTER(value, min_value, step_size)\
  67. ((value - min_value)/step_size)
  68. enum {
  69. BOOST_SWITCH = 0,
  70. BOOST_ALWAYS,
  71. BYPASS_ALWAYS,
  72. BOOST_ON_FOREVER,
  73. };
  74. static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
  75. static struct snd_soc_dai_driver msm_anlg_cdc_i2s_dai[];
  76. /* By default enable the internal speaker boost */
  77. static bool spkr_boost_en = true;
  78. static char on_demand_supply_name[][MAX_ON_DEMAND_SUPPLY_NAME_LENGTH] = {
  79. "cdc-vdd-mic-bias",
  80. };
  81. static struct wcd_mbhc_register
  82. wcd_mbhc_registers[WCD_MBHC_REG_FUNC_MAX] = {
  83. WCD_MBHC_REGISTER("WCD_MBHC_L_DET_EN",
  84. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x80, 7, 0),
  85. WCD_MBHC_REGISTER("WCD_MBHC_GND_DET_EN",
  86. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x40, 6, 0),
  87. WCD_MBHC_REGISTER("WCD_MBHC_MECH_DETECTION_TYPE",
  88. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x20, 5, 0),
  89. WCD_MBHC_REGISTER("WCD_MBHC_MIC_CLAMP_CTL",
  90. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_1, 0x18, 3, 0),
  91. WCD_MBHC_REGISTER("WCD_MBHC_ELECT_DETECTION_TYPE",
  92. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x01, 0, 0),
  93. WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_CTRL",
  94. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0xC0, 6, 0),
  95. WCD_MBHC_REGISTER("WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL",
  96. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x20, 5, 0),
  97. WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PLUG_TYPE",
  98. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x10, 4, 0),
  99. WCD_MBHC_REGISTER("WCD_MBHC_GND_PLUG_TYPE",
  100. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x08, 3, 0),
  101. WCD_MBHC_REGISTER("WCD_MBHC_SW_HPH_LP_100K_TO_GND",
  102. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x01, 0, 0),
  103. WCD_MBHC_REGISTER("WCD_MBHC_ELECT_SCHMT_ISRC",
  104. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, 0x06, 1, 0),
  105. WCD_MBHC_REGISTER("WCD_MBHC_FSM_EN",
  106. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x80, 7, 0),
  107. WCD_MBHC_REGISTER("WCD_MBHC_INSREM_DBNC",
  108. MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0xF0, 4, 0),
  109. WCD_MBHC_REGISTER("WCD_MBHC_BTN_DBNC",
  110. MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, 0x0C, 2, 0),
  111. WCD_MBHC_REGISTER("WCD_MBHC_HS_VREF",
  112. MSM89XX_PMIC_ANALOG_MBHC_BTN3_CTL, 0x03, 0, 0),
  113. WCD_MBHC_REGISTER("WCD_MBHC_HS_COMP_RESULT",
  114. MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x01,
  115. 0, 0),
  116. WCD_MBHC_REGISTER("WCD_MBHC_MIC_SCHMT_RESULT",
  117. MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x02,
  118. 1, 0),
  119. WCD_MBHC_REGISTER("WCD_MBHC_HPHL_SCHMT_RESULT",
  120. MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x08,
  121. 3, 0),
  122. WCD_MBHC_REGISTER("WCD_MBHC_HPHR_SCHMT_RESULT",
  123. MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0x04,
  124. 2, 0),
  125. WCD_MBHC_REGISTER("WCD_MBHC_OCP_FSM_EN",
  126. MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0x10, 4, 0),
  127. WCD_MBHC_REGISTER("WCD_MBHC_BTN_RESULT",
  128. MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT, 0xFF, 0, 0),
  129. WCD_MBHC_REGISTER("WCD_MBHC_BTN_ISRC_CTL",
  130. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, 0x70, 4, 0),
  131. WCD_MBHC_REGISTER("WCD_MBHC_ELECT_RESULT",
  132. MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT, 0xFF,
  133. 0, 0),
  134. WCD_MBHC_REGISTER("WCD_MBHC_MICB_CTRL",
  135. MSM89XX_PMIC_ANALOG_MICB_2_EN, 0xC0, 6, 0),
  136. WCD_MBHC_REGISTER("WCD_MBHC_HPH_CNP_WG_TIME",
  137. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0xFC, 2, 0),
  138. WCD_MBHC_REGISTER("WCD_MBHC_HPHR_PA_EN",
  139. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x10, 4, 0),
  140. WCD_MBHC_REGISTER("WCD_MBHC_HPHL_PA_EN",
  141. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x20, 5, 0),
  142. WCD_MBHC_REGISTER("WCD_MBHC_HPH_PA_EN",
  143. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN, 0x30, 4, 0),
  144. WCD_MBHC_REGISTER("WCD_MBHC_SWCH_LEVEL_REMOVE",
  145. MSM89XX_PMIC_ANALOG_MBHC_ZDET_ELECT_RESULT,
  146. 0x10, 4, 0),
  147. WCD_MBHC_REGISTER("WCD_MBHC_PULLDOWN_CTRL",
  148. MSM89XX_PMIC_ANALOG_MICB_2_EN, 0x20, 5, 0),
  149. WCD_MBHC_REGISTER("WCD_MBHC_ANC_DET_EN", 0, 0, 0, 0),
  150. WCD_MBHC_REGISTER("WCD_MBHC_FSM_STATUS", 0, 0, 0, 0),
  151. WCD_MBHC_REGISTER("WCD_MBHC_MUX_CTL", 0, 0, 0, 0),
  152. };
  153. /* Multiply gain_adj and offset by 1000 and 100 to avoid float arithmetic */
  154. static const struct wcd_imped_i_ref imped_i_ref[] = {
  155. {I_h4_UA, 8, 800, 9000, 10000},
  156. {I_pt5_UA, 10, 100, 990, 4600},
  157. {I_14_UA, 17, 14, 1050, 700},
  158. {I_l4_UA, 10, 4, 1165, 110},
  159. {I_1_UA, 0, 1, 1200, 65},
  160. };
  161. static const struct wcd_mbhc_intr intr_ids = {
  162. .mbhc_sw_intr = MSM89XX_IRQ_MBHC_HS_DET,
  163. .mbhc_btn_press_intr = MSM89XX_IRQ_MBHC_PRESS,
  164. .mbhc_btn_release_intr = MSM89XX_IRQ_MBHC_RELEASE,
  165. .mbhc_hs_ins_intr = MSM89XX_IRQ_MBHC_INSREM_DET1,
  166. .mbhc_hs_rem_intr = MSM89XX_IRQ_MBHC_INSREM_DET,
  167. .hph_left_ocp = MSM89XX_IRQ_HPHL_OCP,
  168. .hph_right_ocp = MSM89XX_IRQ_HPHR_OCP,
  169. };
  170. static int msm_anlg_cdc_dt_parse_vreg_info(struct device *dev,
  171. struct sdm660_cdc_regulator *vreg,
  172. const char *vreg_name,
  173. bool ondemand);
  174. static struct sdm660_cdc_pdata *msm_anlg_cdc_populate_dt_pdata(
  175. struct device *dev);
  176. static int msm_anlg_cdc_enable_ext_mb_source(struct wcd_mbhc *wcd_mbhc,
  177. bool turn_on);
  178. static void msm_anlg_cdc_trim_btn_reg(struct snd_soc_codec *codec);
  179. static void msm_anlg_cdc_set_micb_v(struct snd_soc_codec *codec);
  180. static void msm_anlg_cdc_set_boost_v(struct snd_soc_codec *codec);
  181. static void msm_anlg_cdc_set_auto_zeroing(struct snd_soc_codec *codec,
  182. bool enable);
  183. static void msm_anlg_cdc_configure_cap(struct snd_soc_codec *codec,
  184. bool micbias1, bool micbias2);
  185. static bool msm_anlg_cdc_use_mb(struct snd_soc_codec *codec);
  186. static int get_codec_version(struct sdm660_cdc_priv *sdm660_cdc)
  187. {
  188. if (sdm660_cdc->codec_version == DRAX_CDC)
  189. return DRAX_CDC;
  190. else if (sdm660_cdc->codec_version == DIANGU)
  191. return DIANGU;
  192. else if (sdm660_cdc->codec_version == CAJON_2_0)
  193. return CAJON_2_0;
  194. else if (sdm660_cdc->codec_version == CAJON)
  195. return CAJON;
  196. else if (sdm660_cdc->codec_version == CONGA)
  197. return CONGA;
  198. else if (sdm660_cdc->pmic_rev == TOMBAK_2_0)
  199. return TOMBAK_2_0;
  200. else if (sdm660_cdc->pmic_rev == TOMBAK_1_0)
  201. return TOMBAK_1_0;
  202. pr_err("%s: unsupported codec version\n", __func__);
  203. return UNSUPPORTED;
  204. }
  205. static void wcd_mbhc_meas_imped(struct snd_soc_codec *codec,
  206. s16 *impedance_l, s16 *impedance_r)
  207. {
  208. struct sdm660_cdc_priv *sdm660_cdc =
  209. snd_soc_codec_get_drvdata(codec);
  210. if ((sdm660_cdc->imped_det_pin == WCD_MBHC_DET_BOTH) ||
  211. (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHL)) {
  212. /* Enable ZDET_L_MEAS_EN */
  213. snd_soc_update_bits(codec,
  214. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  215. 0x08, 0x08);
  216. /* Wait for 2ms for measurement to complete */
  217. usleep_range(2000, 2100);
  218. /* Read Left impedance value from Result1 */
  219. *impedance_l = snd_soc_read(codec,
  220. MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT);
  221. /* Enable ZDET_R_MEAS_EN */
  222. snd_soc_update_bits(codec,
  223. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  224. 0x08, 0x00);
  225. }
  226. if ((sdm660_cdc->imped_det_pin == WCD_MBHC_DET_BOTH) ||
  227. (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR)) {
  228. snd_soc_update_bits(codec,
  229. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  230. 0x04, 0x04);
  231. /* Wait for 2ms for measurement to complete */
  232. usleep_range(2000, 2100);
  233. /* Read Right impedance value from Result1 */
  234. *impedance_r = snd_soc_read(codec,
  235. MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT);
  236. snd_soc_update_bits(codec,
  237. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  238. 0x04, 0x00);
  239. }
  240. }
  241. static void msm_anlg_cdc_set_ref_current(struct snd_soc_codec *codec,
  242. enum wcd_curr_ref curr_ref)
  243. {
  244. struct sdm660_cdc_priv *sdm660_cdc =
  245. snd_soc_codec_get_drvdata(codec);
  246. dev_dbg(codec->dev, "%s: curr_ref: %d\n", __func__, curr_ref);
  247. if (get_codec_version(sdm660_cdc) < CAJON)
  248. dev_dbg(codec->dev, "%s: Setting ref current not required\n",
  249. __func__);
  250. sdm660_cdc->imped_i_ref = imped_i_ref[curr_ref];
  251. switch (curr_ref) {
  252. case I_h4_UA:
  253. snd_soc_update_bits(codec,
  254. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  255. 0x07, 0x01);
  256. break;
  257. case I_pt5_UA:
  258. snd_soc_update_bits(codec,
  259. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  260. 0x07, 0x04);
  261. break;
  262. case I_14_UA:
  263. snd_soc_update_bits(codec,
  264. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  265. 0x07, 0x03);
  266. break;
  267. case I_l4_UA:
  268. snd_soc_update_bits(codec,
  269. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  270. 0x07, 0x01);
  271. break;
  272. case I_1_UA:
  273. snd_soc_update_bits(codec,
  274. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  275. 0x07, 0x00);
  276. break;
  277. default:
  278. pr_debug("%s: No ref current set\n", __func__);
  279. break;
  280. }
  281. }
  282. static bool msm_anlg_cdc_adj_ref_current(struct snd_soc_codec *codec,
  283. s16 *impedance_l, s16 *impedance_r)
  284. {
  285. int i = 2;
  286. s16 compare_imp = 0;
  287. struct sdm660_cdc_priv *sdm660_cdc =
  288. snd_soc_codec_get_drvdata(codec);
  289. if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR)
  290. compare_imp = *impedance_r;
  291. else
  292. compare_imp = *impedance_l;
  293. if (get_codec_version(sdm660_cdc) < CAJON) {
  294. dev_dbg(codec->dev,
  295. "%s: Reference current adjustment not required\n",
  296. __func__);
  297. return false;
  298. }
  299. while (compare_imp < imped_i_ref[i].min_val) {
  300. msm_anlg_cdc_set_ref_current(codec, imped_i_ref[++i].curr_ref);
  301. wcd_mbhc_meas_imped(codec, impedance_l, impedance_r);
  302. compare_imp = (sdm660_cdc->imped_det_pin ==
  303. WCD_MBHC_DET_HPHR) ? *impedance_r : *impedance_l;
  304. if (i >= I_1_UA)
  305. break;
  306. }
  307. return true;
  308. }
  309. void msm_anlg_cdc_spk_ext_pa_cb(
  310. int (*codec_spk_ext_pa)(struct snd_soc_codec *codec,
  311. int enable), struct snd_soc_codec *codec)
  312. {
  313. struct sdm660_cdc_priv *sdm660_cdc;
  314. if (!codec) {
  315. pr_err("%s: NULL codec pointer!\n", __func__);
  316. return;
  317. }
  318. sdm660_cdc = snd_soc_codec_get_drvdata(codec);
  319. dev_dbg(codec->dev, "%s: Enter\n", __func__);
  320. sdm660_cdc->codec_spk_ext_pa_cb = codec_spk_ext_pa;
  321. }
  322. EXPORT_SYMBOL(msm_anlg_cdc_spk_ext_pa_cb);
  323. static void msm_anlg_cdc_compute_impedance(struct snd_soc_codec *codec, s16 l,
  324. s16 r, uint32_t *zl, uint32_t *zr,
  325. bool high)
  326. {
  327. struct sdm660_cdc_priv *sdm660_cdc =
  328. snd_soc_codec_get_drvdata(codec);
  329. uint32_t rl = 0, rr = 0;
  330. struct wcd_imped_i_ref R = sdm660_cdc->imped_i_ref;
  331. int codec_ver = get_codec_version(sdm660_cdc);
  332. switch (codec_ver) {
  333. case TOMBAK_1_0:
  334. case TOMBAK_2_0:
  335. case CONGA:
  336. if (high) {
  337. dev_dbg(codec->dev,
  338. "%s: This plug has high range impedance\n",
  339. __func__);
  340. rl = (uint32_t)(((100 * (l * 400 - 200))/96) - 230);
  341. rr = (uint32_t)(((100 * (r * 400 - 200))/96) - 230);
  342. } else {
  343. dev_dbg(codec->dev,
  344. "%s: This plug has low range impedance\n",
  345. __func__);
  346. rl = (uint32_t)(((1000 * (l * 2 - 1))/1165) - (13/10));
  347. rr = (uint32_t)(((1000 * (r * 2 - 1))/1165) - (13/10));
  348. }
  349. break;
  350. case CAJON:
  351. case CAJON_2_0:
  352. case DIANGU:
  353. case DRAX_CDC:
  354. if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHL) {
  355. rr = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * r - 5)) -
  356. (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN);
  357. rl = (uint32_t)(((10000 * (R.multiplier * (10 * l - 5)))
  358. - R.offset * R.gain_adj)/(R.gain_adj * 100));
  359. } else if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR) {
  360. rr = (uint32_t)(((10000 * (R.multiplier * (10 * r - 5)))
  361. - R.offset * R.gain_adj)/(R.gain_adj * 100));
  362. rl = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * l - 5))-
  363. (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN);
  364. } else if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_NONE) {
  365. rr = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * r - 5)) -
  366. (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN);
  367. rl = (uint32_t)(((DEFAULT_MULTIPLIER * (10 * l - 5))-
  368. (DEFAULT_OFFSET * DEFAULT_GAIN))/DEFAULT_GAIN);
  369. } else {
  370. rr = (uint32_t)(((10000 * (R.multiplier * (10 * r - 5)))
  371. - R.offset * R.gain_adj)/(R.gain_adj * 100));
  372. rl = (uint32_t)(((10000 * (R.multiplier * (10 * l - 5)))
  373. - R.offset * R.gain_adj)/(R.gain_adj * 100));
  374. }
  375. break;
  376. default:
  377. dev_dbg(codec->dev, "%s: No codec mentioned\n", __func__);
  378. break;
  379. }
  380. *zl = rl;
  381. *zr = rr;
  382. }
  383. static struct firmware_cal *msm_anlg_cdc_get_hwdep_fw_cal(
  384. struct wcd_mbhc *wcd_mbhc,
  385. enum wcd_cal_type type)
  386. {
  387. struct sdm660_cdc_priv *sdm660_cdc;
  388. struct firmware_cal *hwdep_cal;
  389. struct snd_soc_codec *codec = wcd_mbhc->codec;
  390. if (!codec) {
  391. pr_err("%s: NULL codec pointer\n", __func__);
  392. return NULL;
  393. }
  394. sdm660_cdc = snd_soc_codec_get_drvdata(codec);
  395. hwdep_cal = wcdcal_get_fw_cal(sdm660_cdc->fw_data, type);
  396. if (!hwdep_cal) {
  397. dev_err(codec->dev, "%s: cal not sent by %d\n",
  398. __func__, type);
  399. return NULL;
  400. }
  401. return hwdep_cal;
  402. }
  403. static void wcd9xxx_spmi_irq_control(struct snd_soc_codec *codec,
  404. int irq, bool enable)
  405. {
  406. if (enable)
  407. wcd9xxx_spmi_enable_irq(irq);
  408. else
  409. wcd9xxx_spmi_disable_irq(irq);
  410. }
  411. static void msm_anlg_cdc_mbhc_clk_setup(struct snd_soc_codec *codec,
  412. bool enable)
  413. {
  414. if (enable)
  415. snd_soc_update_bits(codec,
  416. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  417. 0x08, 0x08);
  418. else
  419. snd_soc_update_bits(codec,
  420. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  421. 0x08, 0x00);
  422. }
  423. static int msm_anlg_cdc_mbhc_map_btn_code_to_num(struct snd_soc_codec *codec)
  424. {
  425. int btn_code;
  426. int btn;
  427. btn_code = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT);
  428. switch (btn_code) {
  429. case 0:
  430. btn = 0;
  431. break;
  432. case 1:
  433. btn = 1;
  434. break;
  435. case 3:
  436. btn = 2;
  437. break;
  438. case 7:
  439. btn = 3;
  440. break;
  441. case 15:
  442. btn = 4;
  443. break;
  444. default:
  445. btn = -EINVAL;
  446. break;
  447. };
  448. return btn;
  449. }
  450. static bool msm_anlg_cdc_spmi_lock_sleep(struct wcd_mbhc *mbhc, bool lock)
  451. {
  452. if (lock)
  453. return wcd9xxx_spmi_lock_sleep();
  454. wcd9xxx_spmi_unlock_sleep();
  455. return 0;
  456. }
  457. static bool msm_anlg_cdc_micb_en_status(struct wcd_mbhc *mbhc, int micb_num)
  458. {
  459. if (micb_num == MIC_BIAS_1)
  460. return (snd_soc_read(mbhc->codec,
  461. MSM89XX_PMIC_ANALOG_MICB_1_EN) &
  462. 0x80);
  463. if (micb_num == MIC_BIAS_2)
  464. return (snd_soc_read(mbhc->codec,
  465. MSM89XX_PMIC_ANALOG_MICB_2_EN) &
  466. 0x80);
  467. return false;
  468. }
  469. static void msm_anlg_cdc_enable_master_bias(struct snd_soc_codec *codec,
  470. bool enable)
  471. {
  472. if (enable)
  473. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL,
  474. 0x30, 0x30);
  475. else
  476. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL,
  477. 0x30, 0x00);
  478. }
  479. static void msm_anlg_cdc_mbhc_common_micb_ctrl(struct snd_soc_codec *codec,
  480. int event, bool enable)
  481. {
  482. u16 reg;
  483. u8 mask;
  484. u8 val;
  485. switch (event) {
  486. case MBHC_COMMON_MICB_PRECHARGE:
  487. reg = MSM89XX_PMIC_ANALOG_MICB_1_CTL;
  488. mask = 0x60;
  489. val = (enable ? 0x60 : 0x00);
  490. break;
  491. case MBHC_COMMON_MICB_SET_VAL:
  492. reg = MSM89XX_PMIC_ANALOG_MICB_1_VAL;
  493. mask = 0xFF;
  494. val = (enable ? 0xC0 : 0x00);
  495. break;
  496. case MBHC_COMMON_MICB_TAIL_CURR:
  497. reg = MSM89XX_PMIC_ANALOG_MICB_1_EN;
  498. mask = 0x04;
  499. val = (enable ? 0x04 : 0x00);
  500. break;
  501. default:
  502. dev_err(codec->dev,
  503. "%s: Invalid event received\n", __func__);
  504. return;
  505. };
  506. snd_soc_update_bits(codec, reg, mask, val);
  507. }
  508. static void msm_anlg_cdc_mbhc_internal_micbias_ctrl(struct snd_soc_codec *codec,
  509. int micbias_num,
  510. bool enable)
  511. {
  512. if (micbias_num == 1) {
  513. if (enable)
  514. snd_soc_update_bits(codec,
  515. MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS,
  516. 0x10, 0x10);
  517. else
  518. snd_soc_update_bits(codec,
  519. MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS,
  520. 0x10, 0x00);
  521. }
  522. }
  523. static bool msm_anlg_cdc_mbhc_hph_pa_on_status(struct snd_soc_codec *codec)
  524. {
  525. return (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN) &
  526. 0x30) ? true : false;
  527. }
  528. static void msm_anlg_cdc_mbhc_program_btn_thr(struct snd_soc_codec *codec,
  529. s16 *btn_low, s16 *btn_high,
  530. int num_btn, bool is_micbias)
  531. {
  532. int i;
  533. u32 course, fine, reg_val;
  534. u16 reg_addr = MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL;
  535. s16 *btn_voltage;
  536. btn_voltage = ((is_micbias) ? btn_high : btn_low);
  537. for (i = 0; i < num_btn; i++) {
  538. course = (btn_voltage[i] / SDM660_CDC_MBHC_BTN_COARSE_ADJ);
  539. fine = ((btn_voltage[i] % SDM660_CDC_MBHC_BTN_COARSE_ADJ) /
  540. SDM660_CDC_MBHC_BTN_FINE_ADJ);
  541. reg_val = (course << 5) | (fine << 2);
  542. snd_soc_update_bits(codec, reg_addr, 0xFC, reg_val);
  543. dev_dbg(codec->dev,
  544. "%s: course: %d fine: %d reg_addr: %x reg_val: %x\n",
  545. __func__, course, fine, reg_addr, reg_val);
  546. reg_addr++;
  547. }
  548. }
  549. static void msm_anlg_cdc_mbhc_calc_impedance(struct wcd_mbhc *mbhc,
  550. uint32_t *zl, uint32_t *zr)
  551. {
  552. struct snd_soc_codec *codec = mbhc->codec;
  553. struct sdm660_cdc_priv *sdm660_cdc =
  554. snd_soc_codec_get_drvdata(codec);
  555. s16 impedance_l, impedance_r;
  556. s16 impedance_l_fixed;
  557. s16 reg0, reg1, reg2, reg3, reg4;
  558. bool high = false;
  559. bool min_range_used = false;
  560. WCD_MBHC_RSC_ASSERT_LOCKED(mbhc);
  561. reg0 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER);
  562. reg1 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL);
  563. reg2 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2);
  564. reg3 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MICB_2_EN);
  565. reg4 = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL);
  566. sdm660_cdc->imped_det_pin = WCD_MBHC_DET_BOTH;
  567. mbhc->hph_type = WCD_MBHC_HPH_NONE;
  568. /* disable FSM and micbias and enable pullup*/
  569. snd_soc_update_bits(codec,
  570. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  571. 0x80, 0x00);
  572. snd_soc_update_bits(codec,
  573. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  574. 0xA5, 0x25);
  575. /*
  576. * Enable legacy electrical detection current sources
  577. * and disable fast ramp and enable manual switching
  578. * of extra capacitance
  579. */
  580. dev_dbg(codec->dev, "%s: Setup for impedance det\n", __func__);
  581. msm_anlg_cdc_set_ref_current(codec, I_h4_UA);
  582. snd_soc_update_bits(codec,
  583. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2,
  584. 0x06, 0x02);
  585. snd_soc_update_bits(codec,
  586. MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER,
  587. 0x02, 0x02);
  588. snd_soc_update_bits(codec,
  589. MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL,
  590. 0x02, 0x00);
  591. dev_dbg(codec->dev, "%s: Start performing impedance detection\n",
  592. __func__);
  593. wcd_mbhc_meas_imped(codec, &impedance_l, &impedance_r);
  594. if (impedance_l > 2 || impedance_r > 2) {
  595. high = true;
  596. if (!mbhc->mbhc_cfg->mono_stero_detection) {
  597. /* Set ZDET_CHG to 0 to discharge ramp */
  598. snd_soc_update_bits(codec,
  599. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  600. 0x02, 0x00);
  601. /* wait 40ms for the discharge ramp to complete */
  602. usleep_range(40000, 40100);
  603. snd_soc_update_bits(codec,
  604. MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL,
  605. 0x03, 0x00);
  606. sdm660_cdc->imped_det_pin = (impedance_l > 2 &&
  607. impedance_r > 2) ?
  608. WCD_MBHC_DET_NONE :
  609. ((impedance_l > 2) ?
  610. WCD_MBHC_DET_HPHR :
  611. WCD_MBHC_DET_HPHL);
  612. if (sdm660_cdc->imped_det_pin == WCD_MBHC_DET_NONE)
  613. goto exit;
  614. } else {
  615. if (get_codec_version(sdm660_cdc) >= CAJON) {
  616. if (impedance_l == 63 && impedance_r == 63) {
  617. dev_dbg(codec->dev,
  618. "%s: HPHL and HPHR are floating\n",
  619. __func__);
  620. sdm660_cdc->imped_det_pin =
  621. WCD_MBHC_DET_NONE;
  622. mbhc->hph_type = WCD_MBHC_HPH_NONE;
  623. } else if (impedance_l == 63
  624. && impedance_r < 63) {
  625. dev_dbg(codec->dev,
  626. "%s: Mono HS with HPHL floating\n",
  627. __func__);
  628. sdm660_cdc->imped_det_pin =
  629. WCD_MBHC_DET_HPHR;
  630. mbhc->hph_type = WCD_MBHC_HPH_MONO;
  631. } else if (impedance_r == 63 &&
  632. impedance_l < 63) {
  633. dev_dbg(codec->dev,
  634. "%s: Mono HS with HPHR floating\n",
  635. __func__);
  636. sdm660_cdc->imped_det_pin =
  637. WCD_MBHC_DET_HPHL;
  638. mbhc->hph_type = WCD_MBHC_HPH_MONO;
  639. } else if (impedance_l > 3 && impedance_r > 3 &&
  640. (impedance_l == impedance_r)) {
  641. snd_soc_update_bits(codec,
  642. MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2,
  643. 0x06, 0x06);
  644. wcd_mbhc_meas_imped(codec, &impedance_l,
  645. &impedance_r);
  646. if (impedance_r == impedance_l)
  647. dev_dbg(codec->dev,
  648. "%s: Mono Headset\n",
  649. __func__);
  650. sdm660_cdc->imped_det_pin =
  651. WCD_MBHC_DET_NONE;
  652. mbhc->hph_type =
  653. WCD_MBHC_HPH_MONO;
  654. } else {
  655. dev_dbg(codec->dev,
  656. "%s: STEREO headset is found\n",
  657. __func__);
  658. sdm660_cdc->imped_det_pin =
  659. WCD_MBHC_DET_BOTH;
  660. mbhc->hph_type = WCD_MBHC_HPH_STEREO;
  661. }
  662. }
  663. }
  664. }
  665. msm_anlg_cdc_set_ref_current(codec, I_pt5_UA);
  666. msm_anlg_cdc_set_ref_current(codec, I_14_UA);
  667. /* Enable RAMP_L , RAMP_R & ZDET_CHG*/
  668. snd_soc_update_bits(codec,
  669. MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL,
  670. 0x03, 0x03);
  671. snd_soc_update_bits(codec,
  672. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  673. 0x02, 0x02);
  674. /* wait for 50msec for the HW to apply ramp on HPHL and HPHR */
  675. usleep_range(50000, 50100);
  676. /* Enable ZDET_DISCHG_CAP_CTL to add extra capacitance */
  677. snd_soc_update_bits(codec,
  678. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  679. 0x01, 0x01);
  680. /* wait for 5msec for the voltage to get stable */
  681. usleep_range(5000, 5100);
  682. wcd_mbhc_meas_imped(codec, &impedance_l, &impedance_r);
  683. min_range_used = msm_anlg_cdc_adj_ref_current(codec,
  684. &impedance_l, &impedance_r);
  685. if (!mbhc->mbhc_cfg->mono_stero_detection) {
  686. /* Set ZDET_CHG to 0 to discharge ramp */
  687. snd_soc_update_bits(codec,
  688. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  689. 0x02, 0x00);
  690. /* wait for 40msec for the capacitor to discharge */
  691. usleep_range(40000, 40100);
  692. snd_soc_update_bits(codec,
  693. MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL,
  694. 0x03, 0x00);
  695. goto exit;
  696. }
  697. /* we are setting ref current to the minimun range or the measured
  698. * value larger than the minimum value, so min_range_used is true.
  699. * If the headset is mono headset with either HPHL or HPHR floating
  700. * then we have already done the mono stereo detection and do not
  701. * need to continue further.
  702. */
  703. if (!min_range_used ||
  704. sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHL ||
  705. sdm660_cdc->imped_det_pin == WCD_MBHC_DET_HPHR)
  706. goto exit;
  707. /* Disable Set ZDET_CONN_RAMP_L and enable ZDET_CONN_FIXED_L */
  708. snd_soc_update_bits(codec,
  709. MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL,
  710. 0x02, 0x00);
  711. snd_soc_update_bits(codec,
  712. MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL,
  713. 0x02, 0x02);
  714. /* Set ZDET_CHG to 0 */
  715. snd_soc_update_bits(codec,
  716. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  717. 0x02, 0x00);
  718. /* wait for 40msec for the capacitor to discharge */
  719. usleep_range(40000, 40100);
  720. /* Set ZDET_CONN_RAMP_R to 0 */
  721. snd_soc_update_bits(codec,
  722. MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL,
  723. 0x01, 0x00);
  724. /* Enable ZDET_L_MEAS_EN */
  725. snd_soc_update_bits(codec,
  726. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  727. 0x08, 0x08);
  728. /* wait for 2msec for the HW to compute left inpedance value */
  729. usleep_range(2000, 2100);
  730. /* Read Left impedance value from Result1 */
  731. impedance_l_fixed = snd_soc_read(codec,
  732. MSM89XX_PMIC_ANALOG_MBHC_BTN_RESULT);
  733. /* Disable ZDET_L_MEAS_EN */
  734. snd_soc_update_bits(codec,
  735. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  736. 0x08, 0x00);
  737. /*
  738. * Assume impedance_l is L1, impedance_l_fixed is L2.
  739. * If the following condition is met, we can take this
  740. * headset as mono one with impedance of L2.
  741. * Otherwise, take it as stereo with impedance of L1.
  742. * Condition:
  743. * abs[(L2-0.5L1)/(L2+0.5L1)] < abs [(L2-L1)/(L2+L1)]
  744. */
  745. if ((abs(impedance_l_fixed - impedance_l/2) *
  746. (impedance_l_fixed + impedance_l)) >=
  747. (abs(impedance_l_fixed - impedance_l) *
  748. (impedance_l_fixed + impedance_l/2))) {
  749. dev_dbg(codec->dev,
  750. "%s: STEREO plug type detected\n",
  751. __func__);
  752. mbhc->hph_type = WCD_MBHC_HPH_STEREO;
  753. } else {
  754. dev_dbg(codec->dev,
  755. "%s: MONO plug type detected\n",
  756. __func__);
  757. mbhc->hph_type = WCD_MBHC_HPH_MONO;
  758. impedance_l = impedance_l_fixed;
  759. }
  760. /* Enable ZDET_CHG */
  761. snd_soc_update_bits(codec,
  762. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  763. 0x02, 0x02);
  764. /* wait for 10msec for the capacitor to charge */
  765. usleep_range(10000, 10100);
  766. snd_soc_update_bits(codec,
  767. MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL,
  768. 0x02, 0x02);
  769. snd_soc_update_bits(codec,
  770. MSM89XX_PMIC_ANALOG_MBHC_BTN1_ZDETM_CTL,
  771. 0x02, 0x00);
  772. /* Set ZDET_CHG to 0 to discharge HPHL */
  773. snd_soc_update_bits(codec,
  774. MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL,
  775. 0x02, 0x00);
  776. /* wait for 40msec for the capacitor to discharge */
  777. usleep_range(40000, 40100);
  778. snd_soc_update_bits(codec,
  779. MSM89XX_PMIC_ANALOG_MBHC_BTN0_ZDETL_CTL,
  780. 0x02, 0x00);
  781. exit:
  782. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_FSM_CTL, reg4);
  783. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MICB_2_EN, reg3);
  784. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_BTN2_ZDETH_CTL, reg1);
  785. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_DBNC_TIMER, reg0);
  786. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MBHC_DET_CTL_2, reg2);
  787. msm_anlg_cdc_compute_impedance(codec, impedance_l, impedance_r,
  788. zl, zr, high);
  789. dev_dbg(codec->dev, "%s: RL %d ohm, RR %d ohm\n", __func__, *zl, *zr);
  790. dev_dbg(codec->dev, "%s: Impedance detection completed\n", __func__);
  791. }
  792. static int msm_anlg_cdc_dig_register_notifier(void *handle,
  793. struct notifier_block *nblock,
  794. bool enable)
  795. {
  796. struct sdm660_cdc_priv *handle_cdc = handle;
  797. if (enable)
  798. return blocking_notifier_chain_register(&handle_cdc->notifier,
  799. nblock);
  800. return blocking_notifier_chain_unregister(&handle_cdc->notifier,
  801. nblock);
  802. }
  803. static int msm_anlg_cdc_mbhc_register_notifier(struct wcd_mbhc *wcd_mbhc,
  804. struct notifier_block *nblock,
  805. bool enable)
  806. {
  807. struct snd_soc_codec *codec = wcd_mbhc->codec;
  808. struct sdm660_cdc_priv *sdm660_cdc =
  809. snd_soc_codec_get_drvdata(codec);
  810. if (enable)
  811. return blocking_notifier_chain_register(
  812. &sdm660_cdc->notifier_mbhc,
  813. nblock);
  814. return blocking_notifier_chain_unregister(&sdm660_cdc->notifier_mbhc,
  815. nblock);
  816. }
  817. static int msm_anlg_cdc_request_irq(struct snd_soc_codec *codec,
  818. int irq, irq_handler_t handler,
  819. const char *name, void *data)
  820. {
  821. return wcd9xxx_spmi_request_irq(irq, handler, name, data);
  822. }
  823. static int msm_anlg_cdc_free_irq(struct snd_soc_codec *codec,
  824. int irq, void *data)
  825. {
  826. return wcd9xxx_spmi_free_irq(irq, data);
  827. }
  828. static const struct wcd_mbhc_cb mbhc_cb = {
  829. .enable_mb_source = msm_anlg_cdc_enable_ext_mb_source,
  830. .trim_btn_reg = msm_anlg_cdc_trim_btn_reg,
  831. .compute_impedance = msm_anlg_cdc_mbhc_calc_impedance,
  832. .set_micbias_value = msm_anlg_cdc_set_micb_v,
  833. .set_auto_zeroing = msm_anlg_cdc_set_auto_zeroing,
  834. .get_hwdep_fw_cal = msm_anlg_cdc_get_hwdep_fw_cal,
  835. .set_cap_mode = msm_anlg_cdc_configure_cap,
  836. .register_notifier = msm_anlg_cdc_mbhc_register_notifier,
  837. .request_irq = msm_anlg_cdc_request_irq,
  838. .irq_control = wcd9xxx_spmi_irq_control,
  839. .free_irq = msm_anlg_cdc_free_irq,
  840. .clk_setup = msm_anlg_cdc_mbhc_clk_setup,
  841. .map_btn_code_to_num = msm_anlg_cdc_mbhc_map_btn_code_to_num,
  842. .lock_sleep = msm_anlg_cdc_spmi_lock_sleep,
  843. .micbias_enable_status = msm_anlg_cdc_micb_en_status,
  844. .mbhc_bias = msm_anlg_cdc_enable_master_bias,
  845. .mbhc_common_micb_ctrl = msm_anlg_cdc_mbhc_common_micb_ctrl,
  846. .micb_internal = msm_anlg_cdc_mbhc_internal_micbias_ctrl,
  847. .hph_pa_on_status = msm_anlg_cdc_mbhc_hph_pa_on_status,
  848. .set_btn_thr = msm_anlg_cdc_mbhc_program_btn_thr,
  849. .extn_use_mb = msm_anlg_cdc_use_mb,
  850. };
  851. static const uint32_t wcd_imped_val[] = {4, 8, 12, 13, 16,
  852. 20, 24, 28, 32,
  853. 36, 40, 44, 48};
  854. static void msm_anlg_cdc_dig_notifier_call(struct snd_soc_codec *codec,
  855. const enum dig_cdc_notify_event event)
  856. {
  857. struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec);
  858. pr_debug("%s: notifier call event %d\n", __func__, event);
  859. blocking_notifier_call_chain(&sdm660_cdc->notifier,
  860. event, NULL);
  861. }
  862. static void msm_anlg_cdc_notifier_call(struct snd_soc_codec *codec,
  863. const enum wcd_notify_event event)
  864. {
  865. struct sdm660_cdc_priv *sdm660_cdc =
  866. snd_soc_codec_get_drvdata(codec);
  867. dev_dbg(codec->dev, "%s: notifier call event %d\n", __func__, event);
  868. blocking_notifier_call_chain(&sdm660_cdc->notifier_mbhc, event,
  869. &sdm660_cdc->mbhc);
  870. }
  871. static void msm_anlg_cdc_boost_on(struct snd_soc_codec *codec)
  872. {
  873. struct sdm660_cdc_priv *sdm660_cdc =
  874. snd_soc_codec_get_drvdata(codec);
  875. snd_soc_update_bits(codec,
  876. MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F, 0x0F);
  877. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5);
  878. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F);
  879. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x30);
  880. if (get_codec_version(sdm660_cdc) < CAJON_2_0)
  881. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82);
  882. else
  883. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0xA2);
  884. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL,
  885. 0x69, 0x69);
  886. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG,
  887. 0x01, 0x01);
  888. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO,
  889. 0x88, 0x88);
  890. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL,
  891. 0x03, 0x03);
  892. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL,
  893. 0xE1, 0xE1);
  894. if (get_codec_version(sdm660_cdc) < CAJON_2_0) {
  895. snd_soc_update_bits(codec, MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  896. 0x20, 0x20);
  897. /* Wait for 1ms after clock ctl enable */
  898. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  899. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL,
  900. 0xDF, 0xDF);
  901. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  902. } else {
  903. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL,
  904. 0x40, 0x00);
  905. snd_soc_update_bits(codec, MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  906. 0x20, 0x20);
  907. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL,
  908. 0x80, 0x80);
  909. /* Wait for 500us after BOOST_EN to happen */
  910. usleep_range(500, 510);
  911. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL,
  912. 0x40, 0x40);
  913. /* Wait for 500us after BOOST pulse_skip */
  914. usleep_range(500, 510);
  915. }
  916. }
  917. static void msm_anlg_cdc_boost_off(struct snd_soc_codec *codec)
  918. {
  919. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_BOOST_EN_CTL,
  920. 0xDF, 0x5F);
  921. snd_soc_update_bits(codec, MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  922. 0x20, 0x00);
  923. }
  924. static void msm_anlg_cdc_bypass_on(struct snd_soc_codec *codec)
  925. {
  926. struct sdm660_cdc_priv *sdm660_cdc =
  927. snd_soc_codec_get_drvdata(codec);
  928. if (get_codec_version(sdm660_cdc) < CAJON_2_0) {
  929. snd_soc_write(codec,
  930. MSM89XX_PMIC_ANALOG_SEC_ACCESS,
  931. 0xA5);
  932. snd_soc_write(codec,
  933. MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3,
  934. 0x07);
  935. snd_soc_update_bits(codec,
  936. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  937. 0x02, 0x02);
  938. snd_soc_update_bits(codec,
  939. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  940. 0x01, 0x00);
  941. snd_soc_update_bits(codec,
  942. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  943. 0x40, 0x40);
  944. snd_soc_update_bits(codec,
  945. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  946. 0x80, 0x80);
  947. snd_soc_update_bits(codec,
  948. MSM89XX_PMIC_ANALOG_BOOST_EN_CTL,
  949. 0xDF, 0xDF);
  950. } else {
  951. snd_soc_update_bits(codec,
  952. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  953. 0x20, 0x20);
  954. snd_soc_update_bits(codec,
  955. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  956. 0x20, 0x20);
  957. }
  958. }
  959. static void msm_anlg_cdc_bypass_off(struct snd_soc_codec *codec)
  960. {
  961. struct sdm660_cdc_priv *sdm660_cdc =
  962. snd_soc_codec_get_drvdata(codec);
  963. if (get_codec_version(sdm660_cdc) < CAJON_2_0) {
  964. snd_soc_update_bits(codec,
  965. MSM89XX_PMIC_ANALOG_BOOST_EN_CTL,
  966. 0x80, 0x00);
  967. snd_soc_update_bits(codec,
  968. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  969. 0x80, 0x00);
  970. snd_soc_update_bits(codec,
  971. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  972. 0x02, 0x00);
  973. snd_soc_update_bits(codec,
  974. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  975. 0x40, 0x00);
  976. } else {
  977. snd_soc_update_bits(codec,
  978. MSM89XX_PMIC_ANALOG_BYPASS_MODE,
  979. 0x20, 0x00);
  980. snd_soc_update_bits(codec,
  981. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  982. 0x20, 0x00);
  983. }
  984. }
  985. static void msm_anlg_cdc_boost_mode_sequence(struct snd_soc_codec *codec,
  986. int flag)
  987. {
  988. struct sdm660_cdc_priv *sdm660_cdc =
  989. snd_soc_codec_get_drvdata(codec);
  990. if (flag == EAR_PMU) {
  991. switch (sdm660_cdc->boost_option) {
  992. case BOOST_SWITCH:
  993. if (sdm660_cdc->ear_pa_boost_set) {
  994. msm_anlg_cdc_boost_off(codec);
  995. msm_anlg_cdc_bypass_on(codec);
  996. }
  997. break;
  998. case BOOST_ALWAYS:
  999. msm_anlg_cdc_boost_on(codec);
  1000. break;
  1001. case BYPASS_ALWAYS:
  1002. msm_anlg_cdc_bypass_on(codec);
  1003. break;
  1004. case BOOST_ON_FOREVER:
  1005. msm_anlg_cdc_boost_on(codec);
  1006. break;
  1007. default:
  1008. dev_err(codec->dev,
  1009. "%s: invalid boost option: %d\n", __func__,
  1010. sdm660_cdc->boost_option);
  1011. break;
  1012. }
  1013. } else if (flag == EAR_PMD) {
  1014. switch (sdm660_cdc->boost_option) {
  1015. case BOOST_SWITCH:
  1016. if (sdm660_cdc->ear_pa_boost_set)
  1017. msm_anlg_cdc_bypass_off(codec);
  1018. break;
  1019. case BOOST_ALWAYS:
  1020. msm_anlg_cdc_boost_off(codec);
  1021. /* 80ms for EAR boost to settle down */
  1022. msleep(80);
  1023. break;
  1024. case BYPASS_ALWAYS:
  1025. /* nothing to do as bypass on always */
  1026. break;
  1027. case BOOST_ON_FOREVER:
  1028. /* nothing to do as boost on forever */
  1029. break;
  1030. default:
  1031. dev_err(codec->dev,
  1032. "%s: invalid boost option: %d\n", __func__,
  1033. sdm660_cdc->boost_option);
  1034. break;
  1035. }
  1036. } else if (flag == SPK_PMU) {
  1037. switch (sdm660_cdc->boost_option) {
  1038. case BOOST_SWITCH:
  1039. if (sdm660_cdc->spk_boost_set) {
  1040. msm_anlg_cdc_bypass_off(codec);
  1041. msm_anlg_cdc_boost_on(codec);
  1042. }
  1043. break;
  1044. case BOOST_ALWAYS:
  1045. msm_anlg_cdc_boost_on(codec);
  1046. break;
  1047. case BYPASS_ALWAYS:
  1048. msm_anlg_cdc_bypass_on(codec);
  1049. break;
  1050. case BOOST_ON_FOREVER:
  1051. msm_anlg_cdc_boost_on(codec);
  1052. break;
  1053. default:
  1054. dev_err(codec->dev,
  1055. "%s: invalid boost option: %d\n", __func__,
  1056. sdm660_cdc->boost_option);
  1057. break;
  1058. }
  1059. } else if (flag == SPK_PMD) {
  1060. switch (sdm660_cdc->boost_option) {
  1061. case BOOST_SWITCH:
  1062. if (sdm660_cdc->spk_boost_set) {
  1063. msm_anlg_cdc_boost_off(codec);
  1064. /*
  1065. * Add 40 ms sleep for the spk
  1066. * boost to settle down
  1067. */
  1068. msleep(40);
  1069. }
  1070. break;
  1071. case BOOST_ALWAYS:
  1072. msm_anlg_cdc_boost_off(codec);
  1073. /*
  1074. * Add 40 ms sleep for the spk
  1075. * boost to settle down
  1076. */
  1077. msleep(40);
  1078. break;
  1079. case BYPASS_ALWAYS:
  1080. /* nothing to do as bypass on always */
  1081. break;
  1082. case BOOST_ON_FOREVER:
  1083. /* nothing to do as boost on forever */
  1084. break;
  1085. default:
  1086. dev_err(codec->dev,
  1087. "%s: invalid boost option: %d\n", __func__,
  1088. sdm660_cdc->boost_option);
  1089. break;
  1090. }
  1091. }
  1092. }
  1093. static int msm_anlg_cdc_dt_parse_vreg_info(struct device *dev,
  1094. struct sdm660_cdc_regulator *vreg, const char *vreg_name,
  1095. bool ondemand)
  1096. {
  1097. int len, ret = 0;
  1098. const __be32 *prop;
  1099. char prop_name[CODEC_DT_MAX_PROP_SIZE];
  1100. struct device_node *regnode = NULL;
  1101. u32 prop_val;
  1102. snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "%s-supply",
  1103. vreg_name);
  1104. regnode = of_parse_phandle(dev->of_node, prop_name, 0);
  1105. if (!regnode) {
  1106. dev_err(dev, "Looking up %s property in node %s failed\n",
  1107. prop_name, dev->of_node->full_name);
  1108. return -ENODEV;
  1109. }
  1110. dev_dbg(dev, "Looking up %s property in node %s\n",
  1111. prop_name, dev->of_node->full_name);
  1112. vreg->name = vreg_name;
  1113. vreg->ondemand = ondemand;
  1114. snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
  1115. "qcom,%s-voltage", vreg_name);
  1116. prop = of_get_property(dev->of_node, prop_name, &len);
  1117. if (!prop || (len != (2 * sizeof(__be32)))) {
  1118. dev_err(dev, "%s %s property\n",
  1119. prop ? "invalid format" : "no", prop_name);
  1120. return -EINVAL;
  1121. }
  1122. vreg->min_uv = be32_to_cpup(&prop[0]);
  1123. vreg->max_uv = be32_to_cpup(&prop[1]);
  1124. snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE,
  1125. "qcom,%s-current", vreg_name);
  1126. ret = of_property_read_u32(dev->of_node, prop_name, &prop_val);
  1127. if (ret) {
  1128. dev_err(dev, "Looking up %s property in node %s failed",
  1129. prop_name, dev->of_node->full_name);
  1130. return -EFAULT;
  1131. }
  1132. vreg->optimum_ua = prop_val;
  1133. dev_dbg(dev, "%s: vol=[%d %d]uV, curr=[%d]uA, ond %d\n\n", vreg->name,
  1134. vreg->min_uv, vreg->max_uv, vreg->optimum_ua, vreg->ondemand);
  1135. return 0;
  1136. }
  1137. static void msm_anlg_cdc_dt_parse_boost_info(struct snd_soc_codec *codec)
  1138. {
  1139. struct sdm660_cdc_priv *sdm660_cdc_priv =
  1140. snd_soc_codec_get_drvdata(codec);
  1141. const char *prop_name = "qcom,cdc-boost-voltage";
  1142. int boost_voltage, ret;
  1143. ret = of_property_read_u32(codec->dev->of_node, prop_name,
  1144. &boost_voltage);
  1145. if (ret) {
  1146. dev_dbg(codec->dev, "Looking up %s property in node %s failed\n",
  1147. prop_name, codec->dev->of_node->full_name);
  1148. boost_voltage = DEFAULT_BOOST_VOLTAGE;
  1149. }
  1150. if (boost_voltage < MIN_BOOST_VOLTAGE ||
  1151. boost_voltage > MAX_BOOST_VOLTAGE) {
  1152. dev_err(codec->dev,
  1153. "Incorrect boost voltage. Reverting to default\n");
  1154. boost_voltage = DEFAULT_BOOST_VOLTAGE;
  1155. }
  1156. sdm660_cdc_priv->boost_voltage =
  1157. VOLTAGE_CONVERTER(boost_voltage, MIN_BOOST_VOLTAGE,
  1158. BOOST_VOLTAGE_STEP);
  1159. dev_dbg(codec->dev, "Boost voltage value is: %d\n",
  1160. boost_voltage);
  1161. }
  1162. static void msm_anlg_cdc_dt_parse_micbias_info(struct device *dev,
  1163. struct wcd_micbias_setting *micbias)
  1164. {
  1165. const char *prop_name = "qcom,cdc-micbias-cfilt-mv";
  1166. int ret;
  1167. ret = of_property_read_u32(dev->of_node, prop_name,
  1168. &micbias->cfilt1_mv);
  1169. if (ret) {
  1170. dev_dbg(dev, "Looking up %s property in node %s failed",
  1171. prop_name, dev->of_node->full_name);
  1172. micbias->cfilt1_mv = MICBIAS_DEFAULT_VAL;
  1173. }
  1174. }
  1175. static struct sdm660_cdc_pdata *msm_anlg_cdc_populate_dt_pdata(
  1176. struct device *dev)
  1177. {
  1178. struct sdm660_cdc_pdata *pdata;
  1179. int ret, static_cnt, ond_cnt, idx, i;
  1180. const char *name = NULL;
  1181. const char *static_prop_name = "qcom,cdc-static-supplies";
  1182. const char *ond_prop_name = "qcom,cdc-on-demand-supplies";
  1183. pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
  1184. if (!pdata)
  1185. return NULL;
  1186. static_cnt = of_property_count_strings(dev->of_node, static_prop_name);
  1187. if (static_cnt < 0) {
  1188. dev_err(dev, "%s: Failed to get static supplies %d\n", __func__,
  1189. static_cnt);
  1190. ret = -EINVAL;
  1191. goto err;
  1192. }
  1193. /* On-demand supply list is an optional property */
  1194. ond_cnt = of_property_count_strings(dev->of_node, ond_prop_name);
  1195. if (ond_cnt < 0)
  1196. ond_cnt = 0;
  1197. WARN_ON(static_cnt <= 0 || ond_cnt < 0);
  1198. if ((static_cnt + ond_cnt) > ARRAY_SIZE(pdata->regulator)) {
  1199. dev_err(dev, "%s: Num of supplies %u > max supported %zd\n",
  1200. __func__, (static_cnt + ond_cnt),
  1201. ARRAY_SIZE(pdata->regulator));
  1202. ret = -EINVAL;
  1203. goto err;
  1204. }
  1205. for (idx = 0; idx < static_cnt; idx++) {
  1206. ret = of_property_read_string_index(dev->of_node,
  1207. static_prop_name, idx,
  1208. &name);
  1209. if (ret) {
  1210. dev_err(dev, "%s: of read string %s idx %d error %d\n",
  1211. __func__, static_prop_name, idx, ret);
  1212. goto err;
  1213. }
  1214. dev_dbg(dev, "%s: Found static cdc supply %s\n", __func__,
  1215. name);
  1216. ret = msm_anlg_cdc_dt_parse_vreg_info(dev,
  1217. &pdata->regulator[idx],
  1218. name, false);
  1219. if (ret) {
  1220. dev_err(dev, "%s:err parsing vreg for %s idx %d\n",
  1221. __func__, name, idx);
  1222. goto err;
  1223. }
  1224. }
  1225. for (i = 0; i < ond_cnt; i++, idx++) {
  1226. ret = of_property_read_string_index(dev->of_node, ond_prop_name,
  1227. i, &name);
  1228. if (ret) {
  1229. dev_err(dev, "%s: err parsing on_demand for %s idx %d\n",
  1230. __func__, ond_prop_name, i);
  1231. goto err;
  1232. }
  1233. dev_dbg(dev, "%s: Found on-demand cdc supply %s\n", __func__,
  1234. name);
  1235. ret = msm_anlg_cdc_dt_parse_vreg_info(dev,
  1236. &pdata->regulator[idx],
  1237. name, true);
  1238. if (ret) {
  1239. dev_err(dev, "%s: err parsing vreg on_demand for %s idx %d\n",
  1240. __func__, name, idx);
  1241. goto err;
  1242. }
  1243. }
  1244. msm_anlg_cdc_dt_parse_micbias_info(dev, &pdata->micbias);
  1245. return pdata;
  1246. err:
  1247. devm_kfree(dev, pdata);
  1248. dev_err(dev, "%s: Failed to populate DT data ret = %d\n",
  1249. __func__, ret);
  1250. return NULL;
  1251. }
  1252. static int msm_anlg_cdc_codec_enable_on_demand_supply(
  1253. struct snd_soc_dapm_widget *w,
  1254. struct snd_kcontrol *kcontrol, int event)
  1255. {
  1256. int ret = 0;
  1257. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1258. struct sdm660_cdc_priv *sdm660_cdc =
  1259. snd_soc_codec_get_drvdata(codec);
  1260. struct on_demand_supply *supply;
  1261. if (w->shift >= ON_DEMAND_SUPPLIES_MAX) {
  1262. dev_err(codec->dev, "%s: error index > MAX Demand supplies",
  1263. __func__);
  1264. ret = -EINVAL;
  1265. goto out;
  1266. }
  1267. dev_dbg(codec->dev, "%s: supply: %s event: %d ref: %d\n",
  1268. __func__, on_demand_supply_name[w->shift], event,
  1269. atomic_read(&sdm660_cdc->on_demand_list[w->shift].ref));
  1270. supply = &sdm660_cdc->on_demand_list[w->shift];
  1271. WARN_ONCE(!supply->supply, "%s isn't defined\n",
  1272. on_demand_supply_name[w->shift]);
  1273. if (!supply->supply) {
  1274. dev_err(codec->dev, "%s: err supply not present ond for %d",
  1275. __func__, w->shift);
  1276. goto out;
  1277. }
  1278. switch (event) {
  1279. case SND_SOC_DAPM_PRE_PMU:
  1280. if (atomic_inc_return(&supply->ref) == 1) {
  1281. ret = regulator_set_voltage(supply->supply,
  1282. supply->min_uv,
  1283. supply->max_uv);
  1284. if (ret) {
  1285. dev_err(codec->dev,
  1286. "Setting regulator voltage(en) for micbias with err = %d\n",
  1287. ret);
  1288. goto out;
  1289. }
  1290. ret = regulator_set_load(supply->supply,
  1291. supply->optimum_ua);
  1292. if (ret < 0) {
  1293. dev_err(codec->dev,
  1294. "Setting regulator optimum mode(en) failed for micbias with err = %d\n",
  1295. ret);
  1296. goto out;
  1297. }
  1298. ret = regulator_enable(supply->supply);
  1299. }
  1300. if (ret)
  1301. dev_err(codec->dev, "%s: Failed to enable %s\n",
  1302. __func__,
  1303. on_demand_supply_name[w->shift]);
  1304. break;
  1305. case SND_SOC_DAPM_POST_PMD:
  1306. if (atomic_read(&supply->ref) == 0) {
  1307. dev_dbg(codec->dev, "%s: %s supply has been disabled.\n",
  1308. __func__, on_demand_supply_name[w->shift]);
  1309. goto out;
  1310. }
  1311. if (atomic_dec_return(&supply->ref) == 0) {
  1312. ret = regulator_disable(supply->supply);
  1313. if (ret)
  1314. dev_err(codec->dev, "%s: Failed to disable %s\n",
  1315. __func__,
  1316. on_demand_supply_name[w->shift]);
  1317. ret = regulator_set_voltage(supply->supply,
  1318. 0,
  1319. supply->max_uv);
  1320. if (ret) {
  1321. dev_err(codec->dev,
  1322. "Setting regulator voltage(dis) failed for micbias with err = %d\n",
  1323. ret);
  1324. goto out;
  1325. }
  1326. ret = regulator_set_load(supply->supply, 0);
  1327. if (ret < 0)
  1328. dev_err(codec->dev,
  1329. "Setting regulator optimum mode(dis) failed for micbias with err = %d\n",
  1330. ret);
  1331. }
  1332. break;
  1333. default:
  1334. break;
  1335. }
  1336. out:
  1337. return ret;
  1338. }
  1339. static int msm_anlg_cdc_codec_enable_clock_block(struct snd_soc_codec *codec,
  1340. int enable)
  1341. {
  1342. struct msm_asoc_mach_data *pdata = NULL;
  1343. pdata = snd_soc_card_get_drvdata(codec->component.card);
  1344. if (enable) {
  1345. snd_soc_update_bits(codec,
  1346. MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x30, 0x30);
  1347. msm_anlg_cdc_dig_notifier_call(codec, DIG_CDC_EVENT_CLK_ON);
  1348. snd_soc_update_bits(codec,
  1349. MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80, 0x80);
  1350. snd_soc_update_bits(codec,
  1351. MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x0C, 0x0C);
  1352. } else {
  1353. snd_soc_update_bits(codec,
  1354. MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL, 0x0C, 0x00);
  1355. }
  1356. return 0;
  1357. }
  1358. static int msm_anlg_cdc_codec_enable_charge_pump(struct snd_soc_dapm_widget *w,
  1359. struct snd_kcontrol *kcontrol,
  1360. int event)
  1361. {
  1362. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1363. struct sdm660_cdc_priv *sdm660_cdc =
  1364. snd_soc_codec_get_drvdata(codec);
  1365. dev_dbg(codec->dev, "%s: event = %d\n", __func__, event);
  1366. switch (event) {
  1367. case SND_SOC_DAPM_PRE_PMU:
  1368. msm_anlg_cdc_codec_enable_clock_block(codec, 1);
  1369. if (!(strcmp(w->name, "EAR CP"))) {
  1370. snd_soc_update_bits(codec,
  1371. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1372. 0x80, 0x80);
  1373. msm_anlg_cdc_boost_mode_sequence(codec, EAR_PMU);
  1374. } else if (get_codec_version(sdm660_cdc) >= DIANGU) {
  1375. snd_soc_update_bits(codec,
  1376. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1377. 0x80, 0x80);
  1378. } else {
  1379. snd_soc_update_bits(codec,
  1380. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1381. 0xC0, 0xC0);
  1382. }
  1383. break;
  1384. case SND_SOC_DAPM_POST_PMU:
  1385. /* Wait for 1ms post powerup of chargepump */
  1386. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  1387. break;
  1388. case SND_SOC_DAPM_POST_PMD:
  1389. /* Wait for 1ms post powerdown of chargepump */
  1390. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  1391. if (!(strcmp(w->name, "EAR CP"))) {
  1392. snd_soc_update_bits(codec,
  1393. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1394. 0x80, 0x00);
  1395. if (sdm660_cdc->boost_option != BOOST_ALWAYS) {
  1396. dev_dbg(codec->dev,
  1397. "%s: boost_option:%d, tear down ear\n",
  1398. __func__, sdm660_cdc->boost_option);
  1399. msm_anlg_cdc_boost_mode_sequence(codec,
  1400. EAR_PMD);
  1401. }
  1402. /*
  1403. * Reset pa select bit from ear to hph after ear pa
  1404. * is disabled and HPH DAC disable to reduce ear
  1405. * turn off pop and avoid HPH pop in concurrency
  1406. */
  1407. snd_soc_update_bits(codec,
  1408. MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x80, 0x00);
  1409. } else {
  1410. if (get_codec_version(sdm660_cdc) < DIANGU)
  1411. snd_soc_update_bits(codec,
  1412. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1413. 0x40, 0x00);
  1414. if (sdm660_cdc->rx_bias_count == 0)
  1415. snd_soc_update_bits(codec,
  1416. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1417. 0x80, 0x00);
  1418. dev_dbg(codec->dev, "%s: rx_bias_count = %d\n",
  1419. __func__, sdm660_cdc->rx_bias_count);
  1420. }
  1421. break;
  1422. }
  1423. return 0;
  1424. }
  1425. static int msm_anlg_cdc_ear_pa_boost_get(struct snd_kcontrol *kcontrol,
  1426. struct snd_ctl_elem_value *ucontrol)
  1427. {
  1428. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1429. struct sdm660_cdc_priv *sdm660_cdc =
  1430. snd_soc_codec_get_drvdata(codec);
  1431. ucontrol->value.integer.value[0] =
  1432. (sdm660_cdc->ear_pa_boost_set ? 1 : 0);
  1433. dev_dbg(codec->dev, "%s: sdm660_cdc->ear_pa_boost_set = %d\n",
  1434. __func__, sdm660_cdc->ear_pa_boost_set);
  1435. return 0;
  1436. }
  1437. static int msm_anlg_cdc_ear_pa_boost_set(struct snd_kcontrol *kcontrol,
  1438. struct snd_ctl_elem_value *ucontrol)
  1439. {
  1440. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1441. struct sdm660_cdc_priv *sdm660_cdc =
  1442. snd_soc_codec_get_drvdata(codec);
  1443. dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
  1444. __func__, ucontrol->value.integer.value[0]);
  1445. sdm660_cdc->ear_pa_boost_set =
  1446. (ucontrol->value.integer.value[0] ? true : false);
  1447. return 0;
  1448. }
  1449. static int msm_anlg_cdc_pa_gain_get(struct snd_kcontrol *kcontrol,
  1450. struct snd_ctl_elem_value *ucontrol)
  1451. {
  1452. u8 ear_pa_gain;
  1453. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1454. struct sdm660_cdc_priv *sdm660_cdc =
  1455. snd_soc_codec_get_drvdata(codec);
  1456. if (get_codec_version(sdm660_cdc) >= DIANGU) {
  1457. ear_pa_gain = snd_soc_read(codec,
  1458. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC);
  1459. ear_pa_gain = (ear_pa_gain >> 1) & 0x3;
  1460. if (ear_pa_gain == 0x00) {
  1461. ucontrol->value.integer.value[0] = 3;
  1462. } else if (ear_pa_gain == 0x01) {
  1463. ucontrol->value.integer.value[0] = 2;
  1464. } else if (ear_pa_gain == 0x02) {
  1465. ucontrol->value.integer.value[0] = 1;
  1466. } else if (ear_pa_gain == 0x03) {
  1467. ucontrol->value.integer.value[0] = 0;
  1468. } else {
  1469. dev_err(codec->dev,
  1470. "%s: ERROR: Unsupported Ear Gain = 0x%x\n",
  1471. __func__, ear_pa_gain);
  1472. return -EINVAL;
  1473. }
  1474. } else {
  1475. ear_pa_gain = snd_soc_read(codec,
  1476. MSM89XX_PMIC_ANALOG_RX_EAR_CTL);
  1477. ear_pa_gain = (ear_pa_gain >> 5) & 0x1;
  1478. if (ear_pa_gain == 0x00) {
  1479. ucontrol->value.integer.value[0] = 0;
  1480. } else if (ear_pa_gain == 0x01) {
  1481. ucontrol->value.integer.value[0] = 3;
  1482. } else {
  1483. dev_err(codec->dev,
  1484. "%s: ERROR: Unsupported Ear Gain = 0x%x\n",
  1485. __func__, ear_pa_gain);
  1486. return -EINVAL;
  1487. }
  1488. }
  1489. dev_dbg(codec->dev, "%s: ear_pa_gain = 0x%x\n", __func__, ear_pa_gain);
  1490. return 0;
  1491. }
  1492. static int msm_anlg_cdc_pa_gain_put(struct snd_kcontrol *kcontrol,
  1493. struct snd_ctl_elem_value *ucontrol)
  1494. {
  1495. u8 ear_pa_gain;
  1496. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1497. struct sdm660_cdc_priv *sdm660_cdc =
  1498. snd_soc_codec_get_drvdata(codec);
  1499. dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
  1500. __func__, ucontrol->value.integer.value[0]);
  1501. if (get_codec_version(sdm660_cdc) >= DIANGU) {
  1502. switch (ucontrol->value.integer.value[0]) {
  1503. case 0:
  1504. ear_pa_gain = 0x06;
  1505. break;
  1506. case 1:
  1507. ear_pa_gain = 0x04;
  1508. break;
  1509. case 2:
  1510. ear_pa_gain = 0x02;
  1511. break;
  1512. case 3:
  1513. ear_pa_gain = 0x00;
  1514. break;
  1515. default:
  1516. return -EINVAL;
  1517. }
  1518. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
  1519. 0x06, ear_pa_gain);
  1520. } else {
  1521. switch (ucontrol->value.integer.value[0]) {
  1522. case 0:
  1523. ear_pa_gain = 0x00;
  1524. break;
  1525. case 3:
  1526. ear_pa_gain = 0x20;
  1527. break;
  1528. case 1:
  1529. case 2:
  1530. default:
  1531. return -EINVAL;
  1532. }
  1533. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  1534. 0x20, ear_pa_gain);
  1535. }
  1536. return 0;
  1537. }
  1538. static int msm_anlg_cdc_hph_mode_get(struct snd_kcontrol *kcontrol,
  1539. struct snd_ctl_elem_value *ucontrol)
  1540. {
  1541. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1542. struct sdm660_cdc_priv *sdm660_cdc =
  1543. snd_soc_codec_get_drvdata(codec);
  1544. if (sdm660_cdc->hph_mode == NORMAL_MODE) {
  1545. ucontrol->value.integer.value[0] = 0;
  1546. } else if (sdm660_cdc->hph_mode == HD2_MODE) {
  1547. ucontrol->value.integer.value[0] = 1;
  1548. } else {
  1549. dev_err(codec->dev, "%s: ERROR: Default HPH Mode= %d\n",
  1550. __func__, sdm660_cdc->hph_mode);
  1551. }
  1552. dev_dbg(codec->dev, "%s: sdm660_cdc->hph_mode = %d\n", __func__,
  1553. sdm660_cdc->hph_mode);
  1554. return 0;
  1555. }
  1556. static int msm_anlg_cdc_hph_mode_set(struct snd_kcontrol *kcontrol,
  1557. struct snd_ctl_elem_value *ucontrol)
  1558. {
  1559. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1560. struct sdm660_cdc_priv *sdm660_cdc =
  1561. snd_soc_codec_get_drvdata(codec);
  1562. dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
  1563. __func__, ucontrol->value.integer.value[0]);
  1564. switch (ucontrol->value.integer.value[0]) {
  1565. case 0:
  1566. sdm660_cdc->hph_mode = NORMAL_MODE;
  1567. break;
  1568. case 1:
  1569. if (get_codec_version(sdm660_cdc) >= DIANGU)
  1570. sdm660_cdc->hph_mode = HD2_MODE;
  1571. break;
  1572. default:
  1573. sdm660_cdc->hph_mode = NORMAL_MODE;
  1574. break;
  1575. }
  1576. dev_dbg(codec->dev, "%s: sdm660_cdc->hph_mode_set = %d\n",
  1577. __func__, sdm660_cdc->hph_mode);
  1578. return 0;
  1579. }
  1580. static int msm_anlg_cdc_boost_option_get(struct snd_kcontrol *kcontrol,
  1581. struct snd_ctl_elem_value *ucontrol)
  1582. {
  1583. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1584. struct sdm660_cdc_priv *sdm660_cdc =
  1585. snd_soc_codec_get_drvdata(codec);
  1586. if (sdm660_cdc->boost_option == BOOST_SWITCH) {
  1587. ucontrol->value.integer.value[0] = 0;
  1588. } else if (sdm660_cdc->boost_option == BOOST_ALWAYS) {
  1589. ucontrol->value.integer.value[0] = 1;
  1590. } else if (sdm660_cdc->boost_option == BYPASS_ALWAYS) {
  1591. ucontrol->value.integer.value[0] = 2;
  1592. } else if (sdm660_cdc->boost_option == BOOST_ON_FOREVER) {
  1593. ucontrol->value.integer.value[0] = 3;
  1594. } else {
  1595. dev_err(codec->dev, "%s: ERROR: Unsupported Boost option= %d\n",
  1596. __func__, sdm660_cdc->boost_option);
  1597. return -EINVAL;
  1598. }
  1599. dev_dbg(codec->dev, "%s: sdm660_cdc->boost_option = %d\n", __func__,
  1600. sdm660_cdc->boost_option);
  1601. return 0;
  1602. }
  1603. static int msm_anlg_cdc_boost_option_set(struct snd_kcontrol *kcontrol,
  1604. struct snd_ctl_elem_value *ucontrol)
  1605. {
  1606. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1607. struct sdm660_cdc_priv *sdm660_cdc =
  1608. snd_soc_codec_get_drvdata(codec);
  1609. dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
  1610. __func__, ucontrol->value.integer.value[0]);
  1611. switch (ucontrol->value.integer.value[0]) {
  1612. case 0:
  1613. sdm660_cdc->boost_option = BOOST_SWITCH;
  1614. break;
  1615. case 1:
  1616. sdm660_cdc->boost_option = BOOST_ALWAYS;
  1617. break;
  1618. case 2:
  1619. sdm660_cdc->boost_option = BYPASS_ALWAYS;
  1620. msm_anlg_cdc_bypass_on(codec);
  1621. break;
  1622. case 3:
  1623. sdm660_cdc->boost_option = BOOST_ON_FOREVER;
  1624. msm_anlg_cdc_boost_on(codec);
  1625. break;
  1626. default:
  1627. pr_err("%s: invalid boost option: %d\n", __func__,
  1628. sdm660_cdc->boost_option);
  1629. return -EINVAL;
  1630. }
  1631. dev_dbg(codec->dev, "%s: sdm660_cdc->boost_option_set = %d\n",
  1632. __func__, sdm660_cdc->boost_option);
  1633. return 0;
  1634. }
  1635. static int msm_anlg_cdc_spk_boost_get(struct snd_kcontrol *kcontrol,
  1636. struct snd_ctl_elem_value *ucontrol)
  1637. {
  1638. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1639. struct sdm660_cdc_priv *sdm660_cdc =
  1640. snd_soc_codec_get_drvdata(codec);
  1641. if (sdm660_cdc->spk_boost_set == false) {
  1642. ucontrol->value.integer.value[0] = 0;
  1643. } else if (sdm660_cdc->spk_boost_set == true) {
  1644. ucontrol->value.integer.value[0] = 1;
  1645. } else {
  1646. dev_err(codec->dev, "%s: ERROR: Unsupported Speaker Boost = %d\n",
  1647. __func__, sdm660_cdc->spk_boost_set);
  1648. return -EINVAL;
  1649. }
  1650. dev_dbg(codec->dev, "%s: sdm660_cdc->spk_boost_set = %d\n", __func__,
  1651. sdm660_cdc->spk_boost_set);
  1652. return 0;
  1653. }
  1654. static int msm_anlg_cdc_spk_boost_set(struct snd_kcontrol *kcontrol,
  1655. struct snd_ctl_elem_value *ucontrol)
  1656. {
  1657. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1658. struct sdm660_cdc_priv *sdm660_cdc =
  1659. snd_soc_codec_get_drvdata(codec);
  1660. dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
  1661. __func__, ucontrol->value.integer.value[0]);
  1662. switch (ucontrol->value.integer.value[0]) {
  1663. case 0:
  1664. sdm660_cdc->spk_boost_set = false;
  1665. break;
  1666. case 1:
  1667. sdm660_cdc->spk_boost_set = true;
  1668. break;
  1669. default:
  1670. return -EINVAL;
  1671. }
  1672. dev_dbg(codec->dev, "%s: sdm660_cdc->spk_boost_set = %d\n",
  1673. __func__, sdm660_cdc->spk_boost_set);
  1674. return 0;
  1675. }
  1676. static int msm_anlg_cdc_ext_spk_boost_get(struct snd_kcontrol *kcontrol,
  1677. struct snd_ctl_elem_value *ucontrol)
  1678. {
  1679. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1680. struct sdm660_cdc_priv *sdm660_cdc =
  1681. snd_soc_codec_get_drvdata(codec);
  1682. if (sdm660_cdc->ext_spk_boost_set == false)
  1683. ucontrol->value.integer.value[0] = 0;
  1684. else
  1685. ucontrol->value.integer.value[0] = 1;
  1686. dev_dbg(codec->dev, "%s: sdm660_cdc->ext_spk_boost_set = %d\n",
  1687. __func__, sdm660_cdc->ext_spk_boost_set);
  1688. return 0;
  1689. }
  1690. static int msm_anlg_cdc_ext_spk_boost_set(struct snd_kcontrol *kcontrol,
  1691. struct snd_ctl_elem_value *ucontrol)
  1692. {
  1693. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1694. struct sdm660_cdc_priv *sdm660_cdc =
  1695. snd_soc_codec_get_drvdata(codec);
  1696. dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
  1697. __func__, ucontrol->value.integer.value[0]);
  1698. switch (ucontrol->value.integer.value[0]) {
  1699. case 0:
  1700. sdm660_cdc->ext_spk_boost_set = false;
  1701. break;
  1702. case 1:
  1703. sdm660_cdc->ext_spk_boost_set = true;
  1704. break;
  1705. default:
  1706. return -EINVAL;
  1707. }
  1708. dev_dbg(codec->dev, "%s: sdm660_cdc->spk_boost_set = %d\n",
  1709. __func__, sdm660_cdc->spk_boost_set);
  1710. return 0;
  1711. }
  1712. static const char * const msm_anlg_cdc_ear_pa_boost_ctrl_text[] = {
  1713. "DISABLE", "ENABLE"};
  1714. static const struct soc_enum msm_anlg_cdc_ear_pa_boost_ctl_enum[] = {
  1715. SOC_ENUM_SINGLE_EXT(2, msm_anlg_cdc_ear_pa_boost_ctrl_text),
  1716. };
  1717. static const char * const msm_anlg_cdc_ear_pa_gain_text[] = {
  1718. "POS_1P5_DB", "POS_3_DB", "POS_4P5_DB", "POS_6_DB"};
  1719. static const struct soc_enum msm_anlg_cdc_ear_pa_gain_enum[] = {
  1720. SOC_ENUM_SINGLE_EXT(4, msm_anlg_cdc_ear_pa_gain_text),
  1721. };
  1722. static const char * const msm_anlg_cdc_boost_option_ctrl_text[] = {
  1723. "BOOST_SWITCH", "BOOST_ALWAYS", "BYPASS_ALWAYS",
  1724. "BOOST_ON_FOREVER"};
  1725. static const struct soc_enum msm_anlg_cdc_boost_option_ctl_enum[] = {
  1726. SOC_ENUM_SINGLE_EXT(4, msm_anlg_cdc_boost_option_ctrl_text),
  1727. };
  1728. static const char * const msm_anlg_cdc_spk_boost_ctrl_text[] = {
  1729. "DISABLE", "ENABLE"};
  1730. static const struct soc_enum msm_anlg_cdc_spk_boost_ctl_enum[] = {
  1731. SOC_ENUM_SINGLE_EXT(2, msm_anlg_cdc_spk_boost_ctrl_text),
  1732. };
  1733. static const char * const msm_anlg_cdc_ext_spk_boost_ctrl_text[] = {
  1734. "DISABLE", "ENABLE"};
  1735. static const struct soc_enum msm_anlg_cdc_ext_spk_boost_ctl_enum[] = {
  1736. SOC_ENUM_SINGLE_EXT(2, msm_anlg_cdc_ext_spk_boost_ctrl_text),
  1737. };
  1738. static const char * const msm_anlg_cdc_hph_mode_ctrl_text[] = {
  1739. "NORMAL", "HD2"};
  1740. static const struct soc_enum msm_anlg_cdc_hph_mode_ctl_enum[] = {
  1741. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(msm_anlg_cdc_hph_mode_ctrl_text),
  1742. msm_anlg_cdc_hph_mode_ctrl_text),
  1743. };
  1744. /*cut of frequency for high pass filter*/
  1745. static const char * const cf_text[] = {
  1746. "MIN_3DB_4Hz", "MIN_3DB_75Hz", "MIN_3DB_150Hz"
  1747. };
  1748. static const struct snd_kcontrol_new msm_anlg_cdc_snd_controls[] = {
  1749. SOC_ENUM_EXT("RX HPH Mode", msm_anlg_cdc_hph_mode_ctl_enum[0],
  1750. msm_anlg_cdc_hph_mode_get, msm_anlg_cdc_hph_mode_set),
  1751. SOC_ENUM_EXT("Boost Option", msm_anlg_cdc_boost_option_ctl_enum[0],
  1752. msm_anlg_cdc_boost_option_get, msm_anlg_cdc_boost_option_set),
  1753. SOC_ENUM_EXT("EAR PA Boost", msm_anlg_cdc_ear_pa_boost_ctl_enum[0],
  1754. msm_anlg_cdc_ear_pa_boost_get, msm_anlg_cdc_ear_pa_boost_set),
  1755. SOC_ENUM_EXT("EAR PA Gain", msm_anlg_cdc_ear_pa_gain_enum[0],
  1756. msm_anlg_cdc_pa_gain_get, msm_anlg_cdc_pa_gain_put),
  1757. SOC_ENUM_EXT("Speaker Boost", msm_anlg_cdc_spk_boost_ctl_enum[0],
  1758. msm_anlg_cdc_spk_boost_get, msm_anlg_cdc_spk_boost_set),
  1759. SOC_ENUM_EXT("Ext Spk Boost", msm_anlg_cdc_ext_spk_boost_ctl_enum[0],
  1760. msm_anlg_cdc_ext_spk_boost_get, msm_anlg_cdc_ext_spk_boost_set),
  1761. SOC_SINGLE_TLV("ADC1 Volume", MSM89XX_PMIC_ANALOG_TX_1_EN, 3,
  1762. 8, 0, analog_gain),
  1763. SOC_SINGLE_TLV("ADC2 Volume", MSM89XX_PMIC_ANALOG_TX_2_EN, 3,
  1764. 8, 0, analog_gain),
  1765. SOC_SINGLE_TLV("ADC3 Volume", MSM89XX_PMIC_ANALOG_TX_3_EN, 3,
  1766. 8, 0, analog_gain),
  1767. };
  1768. static int tombak_hph_impedance_get(struct snd_kcontrol *kcontrol,
  1769. struct snd_ctl_elem_value *ucontrol)
  1770. {
  1771. int ret;
  1772. uint32_t zl, zr;
  1773. bool hphr;
  1774. struct soc_multi_mixer_control *mc;
  1775. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1776. struct sdm660_cdc_priv *priv = snd_soc_codec_get_drvdata(codec);
  1777. mc = (struct soc_multi_mixer_control *)(kcontrol->private_value);
  1778. hphr = mc->shift;
  1779. ret = wcd_mbhc_get_impedance(&priv->mbhc, &zl, &zr);
  1780. if (ret)
  1781. dev_dbg(codec->dev, "%s: Failed to get mbhc imped", __func__);
  1782. dev_dbg(codec->dev, "%s: zl %u, zr %u\n", __func__, zl, zr);
  1783. ucontrol->value.integer.value[0] = hphr ? zr : zl;
  1784. return 0;
  1785. }
  1786. static const struct snd_kcontrol_new impedance_detect_controls[] = {
  1787. SOC_SINGLE_EXT("HPHL Impedance", 0, 0, UINT_MAX, 0,
  1788. tombak_hph_impedance_get, NULL),
  1789. SOC_SINGLE_EXT("HPHR Impedance", 0, 1, UINT_MAX, 0,
  1790. tombak_hph_impedance_get, NULL),
  1791. };
  1792. static int tombak_get_hph_type(struct snd_kcontrol *kcontrol,
  1793. struct snd_ctl_elem_value *ucontrol)
  1794. {
  1795. struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
  1796. struct sdm660_cdc_priv *priv = snd_soc_codec_get_drvdata(codec);
  1797. struct wcd_mbhc *mbhc;
  1798. if (!priv) {
  1799. dev_err(codec->dev,
  1800. "%s: sdm660_cdc-wcd private data is NULL\n",
  1801. __func__);
  1802. return -EINVAL;
  1803. }
  1804. mbhc = &priv->mbhc;
  1805. if (!mbhc) {
  1806. dev_err(codec->dev, "%s: mbhc not initialized\n", __func__);
  1807. return -EINVAL;
  1808. }
  1809. ucontrol->value.integer.value[0] = (u32) mbhc->hph_type;
  1810. dev_dbg(codec->dev, "%s: hph_type = %u\n", __func__, mbhc->hph_type);
  1811. return 0;
  1812. }
  1813. static const struct snd_kcontrol_new hph_type_detect_controls[] = {
  1814. SOC_SINGLE_EXT("HPH Type", 0, 0, UINT_MAX, 0,
  1815. tombak_get_hph_type, NULL),
  1816. };
  1817. static const char * const rdac2_mux_text[] = {
  1818. "ZERO", "RX2", "RX1"
  1819. };
  1820. static const struct snd_kcontrol_new adc1_switch =
  1821. SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
  1822. static const struct soc_enum rdac2_mux_enum =
  1823. SOC_ENUM_SINGLE(MSM89XX_PMIC_DIGITAL_CDC_CONN_HPHR_DAC_CTL,
  1824. 0, 3, rdac2_mux_text);
  1825. static const char * const adc2_mux_text[] = {
  1826. "ZERO", "INP2", "INP3"
  1827. };
  1828. static const char * const ext_spk_text[] = {
  1829. "Off", "On"
  1830. };
  1831. static const char * const wsa_spk_text[] = {
  1832. "ZERO", "WSA"
  1833. };
  1834. static const struct soc_enum adc2_enum =
  1835. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
  1836. ARRAY_SIZE(adc2_mux_text), adc2_mux_text);
  1837. static const struct soc_enum ext_spk_enum =
  1838. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
  1839. ARRAY_SIZE(ext_spk_text), ext_spk_text);
  1840. static const struct soc_enum wsa_spk_enum =
  1841. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
  1842. ARRAY_SIZE(wsa_spk_text), wsa_spk_text);
  1843. static const struct snd_kcontrol_new ext_spk_mux =
  1844. SOC_DAPM_ENUM("Ext Spk Switch Mux", ext_spk_enum);
  1845. static const struct snd_kcontrol_new tx_adc2_mux =
  1846. SOC_DAPM_ENUM("ADC2 MUX Mux", adc2_enum);
  1847. static const struct snd_kcontrol_new rdac2_mux =
  1848. SOC_DAPM_ENUM("RDAC2 MUX Mux", rdac2_mux_enum);
  1849. static const char * const ear_text[] = {
  1850. "ZERO", "Switch",
  1851. };
  1852. static const struct soc_enum ear_enum =
  1853. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(ear_text), ear_text);
  1854. static const struct snd_kcontrol_new ear_pa_mux[] = {
  1855. SOC_DAPM_ENUM("EAR_S", ear_enum)
  1856. };
  1857. static const struct snd_kcontrol_new wsa_spk_mux[] = {
  1858. SOC_DAPM_ENUM("WSA Spk Switch", wsa_spk_enum)
  1859. };
  1860. static const char * const hph_text[] = {
  1861. "ZERO", "Switch",
  1862. };
  1863. static const struct soc_enum hph_enum =
  1864. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(hph_text), hph_text);
  1865. static const struct snd_kcontrol_new hphl_mux[] = {
  1866. SOC_DAPM_ENUM("HPHL", hph_enum)
  1867. };
  1868. static const struct snd_kcontrol_new hphr_mux[] = {
  1869. SOC_DAPM_ENUM("HPHR", hph_enum)
  1870. };
  1871. static const struct snd_kcontrol_new spkr_mux[] = {
  1872. SOC_DAPM_ENUM("SPK", hph_enum)
  1873. };
  1874. static const char * const lo_text[] = {
  1875. "ZERO", "Switch",
  1876. };
  1877. static const struct soc_enum lo_enum =
  1878. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, ARRAY_SIZE(hph_text), hph_text);
  1879. static const struct snd_kcontrol_new lo_mux[] = {
  1880. SOC_DAPM_ENUM("LINE_OUT", lo_enum)
  1881. };
  1882. static void msm_anlg_cdc_codec_enable_adc_block(struct snd_soc_codec *codec,
  1883. int enable)
  1884. {
  1885. struct sdm660_cdc_priv *wcd8x16 = snd_soc_codec_get_drvdata(codec);
  1886. dev_dbg(codec->dev, "%s %d\n", __func__, enable);
  1887. if (enable) {
  1888. wcd8x16->adc_count++;
  1889. snd_soc_update_bits(codec,
  1890. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL,
  1891. 0x20, 0x20);
  1892. snd_soc_update_bits(codec,
  1893. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1894. 0x10, 0x10);
  1895. } else {
  1896. wcd8x16->adc_count--;
  1897. if (!wcd8x16->adc_count) {
  1898. snd_soc_update_bits(codec,
  1899. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  1900. 0x10, 0x00);
  1901. snd_soc_update_bits(codec,
  1902. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL,
  1903. 0x20, 0x0);
  1904. }
  1905. }
  1906. }
  1907. static int msm_anlg_cdc_codec_enable_adc(struct snd_soc_dapm_widget *w,
  1908. struct snd_kcontrol *kcontrol,
  1909. int event)
  1910. {
  1911. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1912. u16 adc_reg;
  1913. u8 init_bit_shift;
  1914. dev_dbg(codec->dev, "%s %d\n", __func__, event);
  1915. adc_reg = MSM89XX_PMIC_ANALOG_TX_1_2_TEST_CTL_2;
  1916. if (w->reg == MSM89XX_PMIC_ANALOG_TX_1_EN)
  1917. init_bit_shift = 5;
  1918. else if ((w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) ||
  1919. (w->reg == MSM89XX_PMIC_ANALOG_TX_3_EN))
  1920. init_bit_shift = 4;
  1921. else {
  1922. dev_err(codec->dev, "%s: Error, invalid adc register\n",
  1923. __func__);
  1924. return -EINVAL;
  1925. }
  1926. switch (event) {
  1927. case SND_SOC_DAPM_PRE_PMU:
  1928. msm_anlg_cdc_codec_enable_adc_block(codec, 1);
  1929. if (w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN)
  1930. snd_soc_update_bits(codec,
  1931. MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x02, 0x02);
  1932. /*
  1933. * Add delay of 10 ms to give sufficient time for the voltage
  1934. * to shoot up and settle so that the txfe init does not
  1935. * happen when the input voltage is changing too much.
  1936. */
  1937. usleep_range(10000, 10010);
  1938. snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift,
  1939. 1 << init_bit_shift);
  1940. if (w->reg == MSM89XX_PMIC_ANALOG_TX_1_EN)
  1941. snd_soc_update_bits(codec,
  1942. MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL,
  1943. 0x03, 0x00);
  1944. else if ((w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) ||
  1945. (w->reg == MSM89XX_PMIC_ANALOG_TX_3_EN))
  1946. snd_soc_update_bits(codec,
  1947. MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL,
  1948. 0x03, 0x00);
  1949. /* Wait for 1ms to allow txfe settling time */
  1950. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  1951. break;
  1952. case SND_SOC_DAPM_POST_PMU:
  1953. /*
  1954. * Add delay of 12 ms before deasserting the init
  1955. * to reduce the tx pop
  1956. */
  1957. usleep_range(12000, 12010);
  1958. snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00);
  1959. /* Wait for 1ms to allow txfe settling time post powerup */
  1960. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  1961. break;
  1962. case SND_SOC_DAPM_POST_PMD:
  1963. msm_anlg_cdc_codec_enable_adc_block(codec, 0);
  1964. if (w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN)
  1965. snd_soc_update_bits(codec,
  1966. MSM89XX_PMIC_ANALOG_MICB_1_CTL, 0x02, 0x00);
  1967. if (w->reg == MSM89XX_PMIC_ANALOG_TX_1_EN)
  1968. snd_soc_update_bits(codec,
  1969. MSM89XX_PMIC_DIGITAL_CDC_CONN_TX1_CTL,
  1970. 0x03, 0x02);
  1971. else if ((w->reg == MSM89XX_PMIC_ANALOG_TX_2_EN) ||
  1972. (w->reg == MSM89XX_PMIC_ANALOG_TX_3_EN))
  1973. snd_soc_update_bits(codec,
  1974. MSM89XX_PMIC_DIGITAL_CDC_CONN_TX2_CTL,
  1975. 0x03, 0x02);
  1976. break;
  1977. }
  1978. return 0;
  1979. }
  1980. static int msm_anlg_cdc_codec_enable_spk_pa(struct snd_soc_dapm_widget *w,
  1981. struct snd_kcontrol *kcontrol,
  1982. int event)
  1983. {
  1984. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  1985. struct sdm660_cdc_priv *sdm660_cdc =
  1986. snd_soc_codec_get_drvdata(codec);
  1987. dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name);
  1988. switch (event) {
  1989. case SND_SOC_DAPM_PRE_PMU:
  1990. snd_soc_update_bits(codec,
  1991. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10);
  1992. snd_soc_update_bits(codec,
  1993. MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x01, 0x01);
  1994. switch (sdm660_cdc->boost_option) {
  1995. case BOOST_SWITCH:
  1996. if (!sdm660_cdc->spk_boost_set)
  1997. snd_soc_update_bits(codec,
  1998. MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL,
  1999. 0x10, 0x10);
  2000. break;
  2001. case BOOST_ALWAYS:
  2002. case BOOST_ON_FOREVER:
  2003. break;
  2004. case BYPASS_ALWAYS:
  2005. snd_soc_update_bits(codec,
  2006. MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL,
  2007. 0x10, 0x10);
  2008. break;
  2009. default:
  2010. dev_err(codec->dev,
  2011. "%s: invalid boost option: %d\n", __func__,
  2012. sdm660_cdc->boost_option);
  2013. break;
  2014. }
  2015. /* Wait for 1ms after SPK_DAC CTL setting */
  2016. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  2017. snd_soc_update_bits(codec,
  2018. MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0xE0, 0xE0);
  2019. if (get_codec_version(sdm660_cdc) != TOMBAK_1_0)
  2020. snd_soc_update_bits(codec,
  2021. MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x01, 0x01);
  2022. break;
  2023. case SND_SOC_DAPM_POST_PMU:
  2024. /* Wait for 1ms after SPK_VBAT_LDO Enable */
  2025. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  2026. switch (sdm660_cdc->boost_option) {
  2027. case BOOST_SWITCH:
  2028. if (sdm660_cdc->spk_boost_set)
  2029. snd_soc_update_bits(codec,
  2030. MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL,
  2031. 0xEF, 0xEF);
  2032. else
  2033. snd_soc_update_bits(codec,
  2034. MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL,
  2035. 0x10, 0x00);
  2036. break;
  2037. case BOOST_ALWAYS:
  2038. case BOOST_ON_FOREVER:
  2039. snd_soc_update_bits(codec,
  2040. MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL,
  2041. 0xEF, 0xEF);
  2042. break;
  2043. case BYPASS_ALWAYS:
  2044. snd_soc_update_bits(codec,
  2045. MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x10, 0x00);
  2046. break;
  2047. default:
  2048. dev_err(codec->dev,
  2049. "%s: invalid boost option: %d\n", __func__,
  2050. sdm660_cdc->boost_option);
  2051. break;
  2052. }
  2053. msm_anlg_cdc_dig_notifier_call(codec,
  2054. DIG_CDC_EVENT_RX3_MUTE_OFF);
  2055. snd_soc_update_bits(codec, w->reg, 0x80, 0x80);
  2056. break;
  2057. case SND_SOC_DAPM_PRE_PMD:
  2058. msm_anlg_cdc_dig_notifier_call(codec,
  2059. DIG_CDC_EVENT_RX3_MUTE_ON);
  2060. /*
  2061. * Add 1 ms sleep for the mute to take effect
  2062. */
  2063. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  2064. snd_soc_update_bits(codec,
  2065. MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x10, 0x10);
  2066. if (get_codec_version(sdm660_cdc) < CAJON_2_0)
  2067. msm_anlg_cdc_boost_mode_sequence(codec, SPK_PMD);
  2068. snd_soc_update_bits(codec, w->reg, 0x80, 0x00);
  2069. switch (sdm660_cdc->boost_option) {
  2070. case BOOST_SWITCH:
  2071. if (sdm660_cdc->spk_boost_set)
  2072. snd_soc_update_bits(codec,
  2073. MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL,
  2074. 0xEF, 0x69);
  2075. break;
  2076. case BOOST_ALWAYS:
  2077. case BOOST_ON_FOREVER:
  2078. snd_soc_update_bits(codec,
  2079. MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL,
  2080. 0xEF, 0x69);
  2081. break;
  2082. case BYPASS_ALWAYS:
  2083. break;
  2084. default:
  2085. dev_err(codec->dev,
  2086. "%s: invalid boost option: %d\n", __func__,
  2087. sdm660_cdc->boost_option);
  2088. break;
  2089. }
  2090. break;
  2091. case SND_SOC_DAPM_POST_PMD:
  2092. snd_soc_update_bits(codec,
  2093. MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0xE0, 0x00);
  2094. /* Wait for 1ms to allow setting time for spkr path disable */
  2095. usleep_range(CODEC_DELAY_1_MS, CODEC_DELAY_1_1_MS);
  2096. snd_soc_update_bits(codec,
  2097. MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL, 0x01, 0x00);
  2098. snd_soc_update_bits(codec,
  2099. MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x10, 0x00);
  2100. if (get_codec_version(sdm660_cdc) != TOMBAK_1_0)
  2101. snd_soc_update_bits(codec,
  2102. MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x01, 0x00);
  2103. snd_soc_update_bits(codec,
  2104. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x00);
  2105. if (get_codec_version(sdm660_cdc) >= CAJON_2_0)
  2106. msm_anlg_cdc_boost_mode_sequence(codec, SPK_PMD);
  2107. break;
  2108. }
  2109. return 0;
  2110. }
  2111. static int msm_anlg_cdc_codec_enable_dig_clk(struct snd_soc_dapm_widget *w,
  2112. struct snd_kcontrol *kcontrol,
  2113. int event)
  2114. {
  2115. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2116. struct sdm660_cdc_priv *sdm660_cdc =
  2117. snd_soc_codec_get_drvdata(codec);
  2118. struct msm_asoc_mach_data *pdata = NULL;
  2119. pdata = snd_soc_card_get_drvdata(codec->component.card);
  2120. dev_dbg(codec->dev, "%s event %d w->name %s\n", __func__,
  2121. event, w->name);
  2122. switch (event) {
  2123. case SND_SOC_DAPM_PRE_PMU:
  2124. msm_anlg_cdc_codec_enable_clock_block(codec, 1);
  2125. snd_soc_update_bits(codec, w->reg, 0x80, 0x80);
  2126. msm_anlg_cdc_boost_mode_sequence(codec, SPK_PMU);
  2127. break;
  2128. case SND_SOC_DAPM_POST_PMD:
  2129. if (sdm660_cdc->rx_bias_count == 0)
  2130. snd_soc_update_bits(codec,
  2131. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  2132. 0x80, 0x00);
  2133. }
  2134. return 0;
  2135. }
  2136. static bool msm_anlg_cdc_use_mb(struct snd_soc_codec *codec)
  2137. {
  2138. struct sdm660_cdc_priv *sdm660_cdc =
  2139. snd_soc_codec_get_drvdata(codec);
  2140. if (get_codec_version(sdm660_cdc) < CAJON)
  2141. return true;
  2142. else
  2143. return false;
  2144. }
  2145. static void msm_anlg_cdc_set_auto_zeroing(struct snd_soc_codec *codec,
  2146. bool enable)
  2147. {
  2148. struct sdm660_cdc_priv *sdm660_cdc =
  2149. snd_soc_codec_get_drvdata(codec);
  2150. if (get_codec_version(sdm660_cdc) < CONGA) {
  2151. if (enable)
  2152. /*
  2153. * Set autozeroing for special headset detection and
  2154. * buttons to work.
  2155. */
  2156. snd_soc_update_bits(codec,
  2157. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  2158. 0x18, 0x10);
  2159. else
  2160. snd_soc_update_bits(codec,
  2161. MSM89XX_PMIC_ANALOG_MICB_2_EN,
  2162. 0x18, 0x00);
  2163. } else {
  2164. dev_dbg(codec->dev,
  2165. "%s: Auto Zeroing is not required from CONGA\n",
  2166. __func__);
  2167. }
  2168. }
  2169. static void msm_anlg_cdc_trim_btn_reg(struct snd_soc_codec *codec)
  2170. {
  2171. struct sdm660_cdc_priv *sdm660_cdc =
  2172. snd_soc_codec_get_drvdata(codec);
  2173. if (get_codec_version(sdm660_cdc) == TOMBAK_1_0) {
  2174. pr_debug("%s: This device needs to be trimmed\n", __func__);
  2175. /*
  2176. * Calculate the trim value for each device used
  2177. * till is comes in production by hardware team
  2178. */
  2179. snd_soc_update_bits(codec,
  2180. MSM89XX_PMIC_ANALOG_SEC_ACCESS,
  2181. 0xA5, 0xA5);
  2182. snd_soc_update_bits(codec,
  2183. MSM89XX_PMIC_ANALOG_TRIM_CTRL2,
  2184. 0xFF, 0x30);
  2185. } else {
  2186. dev_dbg(codec->dev, "%s: This device is trimmed at ATE\n",
  2187. __func__);
  2188. }
  2189. }
  2190. static int msm_anlg_cdc_enable_ext_mb_source(struct wcd_mbhc *wcd_mbhc,
  2191. bool turn_on)
  2192. {
  2193. int ret = 0;
  2194. static int count;
  2195. struct snd_soc_codec *codec = wcd_mbhc->codec;
  2196. struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
  2197. dev_dbg(codec->dev, "%s turn_on: %d count: %d\n", __func__, turn_on,
  2198. count);
  2199. if (turn_on) {
  2200. if (!count) {
  2201. ret = snd_soc_dapm_force_enable_pin(dapm,
  2202. "MICBIAS_REGULATOR");
  2203. snd_soc_dapm_sync(dapm);
  2204. }
  2205. count++;
  2206. } else {
  2207. if (count > 0)
  2208. count--;
  2209. if (!count) {
  2210. ret = snd_soc_dapm_disable_pin(dapm,
  2211. "MICBIAS_REGULATOR");
  2212. snd_soc_dapm_sync(dapm);
  2213. }
  2214. }
  2215. if (ret)
  2216. dev_err(codec->dev, "%s: Failed to %s external micbias source\n",
  2217. __func__, turn_on ? "enable" : "disabled");
  2218. else
  2219. dev_dbg(codec->dev, "%s: %s external micbias source\n",
  2220. __func__, turn_on ? "Enabled" : "Disabled");
  2221. return ret;
  2222. }
  2223. static int msm_anlg_cdc_codec_enable_micbias(struct snd_soc_dapm_widget *w,
  2224. struct snd_kcontrol *kcontrol,
  2225. int event)
  2226. {
  2227. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2228. struct sdm660_cdc_priv *sdm660_cdc =
  2229. snd_soc_codec_get_drvdata(codec);
  2230. u16 micb_int_reg;
  2231. char *internal1_text = "Internal1";
  2232. char *internal2_text = "Internal2";
  2233. char *internal3_text = "Internal3";
  2234. char *external2_text = "External2";
  2235. char *external_text = "External";
  2236. bool micbias2;
  2237. dev_dbg(codec->dev, "%s %d\n", __func__, event);
  2238. switch (w->reg) {
  2239. case MSM89XX_PMIC_ANALOG_MICB_1_EN:
  2240. case MSM89XX_PMIC_ANALOG_MICB_2_EN:
  2241. micb_int_reg = MSM89XX_PMIC_ANALOG_MICB_1_INT_RBIAS;
  2242. break;
  2243. default:
  2244. dev_err(codec->dev,
  2245. "%s: Error, invalid micbias register 0x%x\n",
  2246. __func__, w->reg);
  2247. return -EINVAL;
  2248. }
  2249. micbias2 = (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_MICB_2_EN) & 0x80);
  2250. switch (event) {
  2251. case SND_SOC_DAPM_PRE_PMU:
  2252. if (strnstr(w->name, internal1_text, strlen(w->name))) {
  2253. if (get_codec_version(sdm660_cdc) >= CAJON)
  2254. snd_soc_update_bits(codec,
  2255. MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2,
  2256. 0x02, 0x02);
  2257. snd_soc_update_bits(codec, micb_int_reg, 0x80, 0x80);
  2258. } else if (strnstr(w->name, internal2_text, strlen(w->name))) {
  2259. snd_soc_update_bits(codec, micb_int_reg, 0x10, 0x10);
  2260. snd_soc_update_bits(codec, w->reg, 0x60, 0x00);
  2261. } else if (strnstr(w->name, internal3_text, strlen(w->name))) {
  2262. snd_soc_update_bits(codec, micb_int_reg, 0x2, 0x2);
  2263. /*
  2264. * update MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2
  2265. * for external bias only, not for external2.
  2266. */
  2267. } else if (!strnstr(w->name, external2_text, strlen(w->name)) &&
  2268. strnstr(w->name, external_text,
  2269. strlen(w->name))) {
  2270. snd_soc_update_bits(codec,
  2271. MSM89XX_PMIC_ANALOG_TX_1_2_ATEST_CTL_2,
  2272. 0x02, 0x02);
  2273. }
  2274. if (!strnstr(w->name, external_text, strlen(w->name)))
  2275. snd_soc_update_bits(codec,
  2276. MSM89XX_PMIC_ANALOG_MICB_1_EN, 0x05, 0x04);
  2277. if (w->reg == MSM89XX_PMIC_ANALOG_MICB_1_EN)
  2278. msm_anlg_cdc_configure_cap(codec, true, micbias2);
  2279. break;
  2280. case SND_SOC_DAPM_POST_PMU:
  2281. if (get_codec_version(sdm660_cdc) <= TOMBAK_2_0)
  2282. /*
  2283. * Wait for 20ms post micbias enable
  2284. * for version < tombak 2.0.
  2285. */
  2286. usleep_range(20000, 20100);
  2287. if (strnstr(w->name, internal1_text, strlen(w->name))) {
  2288. snd_soc_update_bits(codec, micb_int_reg, 0x40, 0x40);
  2289. } else if (strnstr(w->name, internal2_text, strlen(w->name))) {
  2290. snd_soc_update_bits(codec, micb_int_reg, 0x08, 0x08);
  2291. msm_anlg_cdc_notifier_call(codec,
  2292. WCD_EVENT_POST_MICBIAS_2_ON);
  2293. } else if (strnstr(w->name, internal3_text, 30)) {
  2294. snd_soc_update_bits(codec, micb_int_reg, 0x01, 0x01);
  2295. } else if (strnstr(w->name, external2_text, strlen(w->name))) {
  2296. msm_anlg_cdc_notifier_call(codec,
  2297. WCD_EVENT_POST_MICBIAS_2_ON);
  2298. }
  2299. break;
  2300. case SND_SOC_DAPM_POST_PMD:
  2301. if (strnstr(w->name, internal1_text, strlen(w->name))) {
  2302. snd_soc_update_bits(codec, micb_int_reg, 0xC0, 0x40);
  2303. } else if (strnstr(w->name, internal2_text, strlen(w->name))) {
  2304. msm_anlg_cdc_notifier_call(codec,
  2305. WCD_EVENT_POST_MICBIAS_2_OFF);
  2306. } else if (strnstr(w->name, internal3_text, 30)) {
  2307. snd_soc_update_bits(codec, micb_int_reg, 0x2, 0x0);
  2308. } else if (strnstr(w->name, external2_text, strlen(w->name))) {
  2309. /*
  2310. * send micbias turn off event to mbhc driver and then
  2311. * break, as no need to set MICB_1_EN register.
  2312. */
  2313. msm_anlg_cdc_notifier_call(codec,
  2314. WCD_EVENT_POST_MICBIAS_2_OFF);
  2315. break;
  2316. }
  2317. if (w->reg == MSM89XX_PMIC_ANALOG_MICB_1_EN)
  2318. msm_anlg_cdc_configure_cap(codec, false, micbias2);
  2319. break;
  2320. }
  2321. return 0;
  2322. }
  2323. static void set_compander_mode(void *handle, int val)
  2324. {
  2325. struct sdm660_cdc_priv *handle_cdc = handle;
  2326. struct snd_soc_codec *codec = handle_cdc->codec;
  2327. if (get_codec_version(handle_cdc) >= DIANGU) {
  2328. snd_soc_update_bits(codec,
  2329. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
  2330. 0x08, val);
  2331. };
  2332. }
  2333. static void update_clkdiv(void *handle, int val)
  2334. {
  2335. struct sdm660_cdc_priv *handle_cdc = handle;
  2336. struct snd_soc_codec *codec = handle_cdc->codec;
  2337. snd_soc_update_bits(codec,
  2338. MSM89XX_PMIC_ANALOG_TX_1_2_TXFE_CLKDIV,
  2339. 0xFF, val);
  2340. }
  2341. static int get_cdc_version(void *handle)
  2342. {
  2343. struct sdm660_cdc_priv *sdm660_cdc = handle;
  2344. return get_codec_version(sdm660_cdc);
  2345. }
  2346. static int sdm660_wcd_codec_enable_vdd_spkr(struct snd_soc_dapm_widget *w,
  2347. struct snd_kcontrol *kcontrol,
  2348. int event)
  2349. {
  2350. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2351. struct sdm660_cdc_priv *sdm660_cdc =
  2352. snd_soc_codec_get_drvdata(codec);
  2353. int ret = 0;
  2354. if (!sdm660_cdc->ext_spk_boost_set) {
  2355. dev_dbg(codec->dev, "%s: ext_boost not supported/disabled\n",
  2356. __func__);
  2357. return 0;
  2358. }
  2359. dev_dbg(codec->dev, "%s: %s %d\n", __func__, w->name, event);
  2360. switch (event) {
  2361. case SND_SOC_DAPM_PRE_PMU:
  2362. if (sdm660_cdc->spkdrv_reg) {
  2363. ret = regulator_enable(sdm660_cdc->spkdrv_reg);
  2364. if (ret)
  2365. dev_err(codec->dev,
  2366. "%s Failed to enable spkdrv reg %s\n",
  2367. __func__, MSM89XX_VDD_SPKDRV_NAME);
  2368. }
  2369. break;
  2370. case SND_SOC_DAPM_POST_PMD:
  2371. if (sdm660_cdc->spkdrv_reg) {
  2372. ret = regulator_disable(sdm660_cdc->spkdrv_reg);
  2373. if (ret)
  2374. dev_err(codec->dev,
  2375. "%s: Failed to disable spkdrv_reg %s\n",
  2376. __func__, MSM89XX_VDD_SPKDRV_NAME);
  2377. }
  2378. break;
  2379. }
  2380. return 0;
  2381. }
  2382. /* The register address is the same as other codec so it can use resmgr */
  2383. static int msm_anlg_cdc_codec_enable_rx_bias(struct snd_soc_dapm_widget *w,
  2384. struct snd_kcontrol *kcontrol,
  2385. int event)
  2386. {
  2387. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2388. struct sdm660_cdc_priv *sdm660_cdc =
  2389. snd_soc_codec_get_drvdata(codec);
  2390. dev_dbg(codec->dev, "%s %d\n", __func__, event);
  2391. switch (event) {
  2392. case SND_SOC_DAPM_PRE_PMU:
  2393. sdm660_cdc->rx_bias_count++;
  2394. if (sdm660_cdc->rx_bias_count == 1) {
  2395. snd_soc_update_bits(codec,
  2396. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
  2397. 0x80, 0x80);
  2398. snd_soc_update_bits(codec,
  2399. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
  2400. 0x01, 0x01);
  2401. }
  2402. break;
  2403. case SND_SOC_DAPM_POST_PMD:
  2404. sdm660_cdc->rx_bias_count--;
  2405. if (sdm660_cdc->rx_bias_count == 0) {
  2406. snd_soc_update_bits(codec,
  2407. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
  2408. 0x01, 0x00);
  2409. snd_soc_update_bits(codec,
  2410. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
  2411. 0x80, 0x00);
  2412. }
  2413. break;
  2414. }
  2415. dev_dbg(codec->dev, "%s rx_bias_count = %d\n",
  2416. __func__, sdm660_cdc->rx_bias_count);
  2417. return 0;
  2418. }
  2419. static uint32_t wcd_get_impedance_value(uint32_t imped)
  2420. {
  2421. int i;
  2422. for (i = 0; i < ARRAY_SIZE(wcd_imped_val) - 1; i++) {
  2423. if (imped >= wcd_imped_val[i] &&
  2424. imped < wcd_imped_val[i + 1])
  2425. break;
  2426. }
  2427. pr_debug("%s: selected impedance value = %d\n",
  2428. __func__, wcd_imped_val[i]);
  2429. return wcd_imped_val[i];
  2430. }
  2431. static void wcd_imped_config(struct snd_soc_codec *codec,
  2432. uint32_t imped, bool set_gain)
  2433. {
  2434. uint32_t value;
  2435. int codec_version;
  2436. struct sdm660_cdc_priv *sdm660_cdc =
  2437. snd_soc_codec_get_drvdata(codec);
  2438. value = wcd_get_impedance_value(imped);
  2439. if (value < wcd_imped_val[0]) {
  2440. dev_dbg(codec->dev,
  2441. "%s, detected impedance is less than 4 Ohm\n",
  2442. __func__);
  2443. return;
  2444. }
  2445. codec_version = get_codec_version(sdm660_cdc);
  2446. if (set_gain) {
  2447. switch (codec_version) {
  2448. case TOMBAK_1_0:
  2449. case TOMBAK_2_0:
  2450. case CONGA:
  2451. /*
  2452. * For 32Ohm load and higher loads, Set 0x19E
  2453. * bit 5 to 1 (POS_0_DB_DI). For loads lower
  2454. * than 32Ohm (such as 16Ohm load), Set 0x19E
  2455. * bit 5 to 0 (POS_M4P5_DB_DI)
  2456. */
  2457. if (value >= 32)
  2458. snd_soc_update_bits(codec,
  2459. MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  2460. 0x20, 0x20);
  2461. else
  2462. snd_soc_update_bits(codec,
  2463. MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  2464. 0x20, 0x00);
  2465. break;
  2466. case CAJON:
  2467. case CAJON_2_0:
  2468. case DIANGU:
  2469. case DRAX_CDC:
  2470. if (value >= 13) {
  2471. snd_soc_update_bits(codec,
  2472. MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  2473. 0x20, 0x20);
  2474. snd_soc_update_bits(codec,
  2475. MSM89XX_PMIC_ANALOG_NCP_VCTRL,
  2476. 0x07, 0x07);
  2477. } else {
  2478. snd_soc_update_bits(codec,
  2479. MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  2480. 0x20, 0x00);
  2481. snd_soc_update_bits(codec,
  2482. MSM89XX_PMIC_ANALOG_NCP_VCTRL,
  2483. 0x07, 0x04);
  2484. }
  2485. break;
  2486. }
  2487. } else {
  2488. snd_soc_update_bits(codec,
  2489. MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  2490. 0x20, 0x00);
  2491. snd_soc_update_bits(codec,
  2492. MSM89XX_PMIC_ANALOG_NCP_VCTRL,
  2493. 0x07, 0x04);
  2494. }
  2495. dev_dbg(codec->dev, "%s: Exit\n", __func__);
  2496. }
  2497. static int msm_anlg_cdc_hphl_dac_event(struct snd_soc_dapm_widget *w,
  2498. struct snd_kcontrol *kcontrol,
  2499. int event)
  2500. {
  2501. uint32_t impedl, impedr;
  2502. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2503. struct sdm660_cdc_priv *sdm660_cdc =
  2504. snd_soc_codec_get_drvdata(codec);
  2505. int ret;
  2506. dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event);
  2507. ret = wcd_mbhc_get_impedance(&sdm660_cdc->mbhc,
  2508. &impedl, &impedr);
  2509. switch (event) {
  2510. case SND_SOC_DAPM_PRE_PMU:
  2511. if (get_codec_version(sdm660_cdc) > CAJON)
  2512. snd_soc_update_bits(codec,
  2513. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN,
  2514. 0x08, 0x08);
  2515. if (get_codec_version(sdm660_cdc) == CAJON ||
  2516. get_codec_version(sdm660_cdc) == CAJON_2_0) {
  2517. snd_soc_update_bits(codec,
  2518. MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST,
  2519. 0x80, 0x80);
  2520. snd_soc_update_bits(codec,
  2521. MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST,
  2522. 0x80, 0x80);
  2523. }
  2524. if (get_codec_version(sdm660_cdc) > CAJON)
  2525. snd_soc_update_bits(codec,
  2526. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN,
  2527. 0x08, 0x00);
  2528. if (sdm660_cdc->hph_mode == HD2_MODE)
  2529. msm_anlg_cdc_dig_notifier_call(codec,
  2530. DIG_CDC_EVENT_PRE_RX1_INT_ON);
  2531. snd_soc_update_bits(codec,
  2532. MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x02, 0x02);
  2533. snd_soc_update_bits(codec,
  2534. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x01, 0x01);
  2535. snd_soc_update_bits(codec,
  2536. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x02, 0x02);
  2537. if (!ret)
  2538. wcd_imped_config(codec, impedl, true);
  2539. else
  2540. dev_dbg(codec->dev, "Failed to get mbhc impedance %d\n",
  2541. ret);
  2542. break;
  2543. case SND_SOC_DAPM_POST_PMU:
  2544. snd_soc_update_bits(codec,
  2545. MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x02, 0x00);
  2546. break;
  2547. case SND_SOC_DAPM_POST_PMD:
  2548. wcd_imped_config(codec, impedl, false);
  2549. snd_soc_update_bits(codec,
  2550. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x02, 0x00);
  2551. snd_soc_update_bits(codec,
  2552. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x01, 0x00);
  2553. if (sdm660_cdc->hph_mode == HD2_MODE)
  2554. msm_anlg_cdc_dig_notifier_call(codec,
  2555. DIG_CDC_EVENT_POST_RX1_INT_OFF);
  2556. break;
  2557. }
  2558. return 0;
  2559. }
  2560. static int msm_anlg_cdc_lo_dac_event(struct snd_soc_dapm_widget *w,
  2561. struct snd_kcontrol *kcontrol,
  2562. int event)
  2563. {
  2564. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2565. dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event);
  2566. switch (event) {
  2567. case SND_SOC_DAPM_PRE_PMU:
  2568. snd_soc_update_bits(codec,
  2569. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10);
  2570. snd_soc_update_bits(codec,
  2571. MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x20, 0x20);
  2572. snd_soc_update_bits(codec,
  2573. MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x80, 0x80);
  2574. snd_soc_update_bits(codec,
  2575. MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08);
  2576. snd_soc_update_bits(codec,
  2577. MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x40, 0x40);
  2578. break;
  2579. case SND_SOC_DAPM_POST_PMU:
  2580. snd_soc_update_bits(codec,
  2581. MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x80, 0x80);
  2582. snd_soc_update_bits(codec,
  2583. MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x08, 0x00);
  2584. snd_soc_update_bits(codec,
  2585. MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x40, 0x40);
  2586. break;
  2587. case SND_SOC_DAPM_POST_PMD:
  2588. /* Wait for 20ms before powerdown of lineout_dac */
  2589. usleep_range(20000, 20100);
  2590. snd_soc_update_bits(codec,
  2591. MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x80, 0x00);
  2592. snd_soc_update_bits(codec,
  2593. MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x40, 0x00);
  2594. snd_soc_update_bits(codec,
  2595. MSM89XX_PMIC_ANALOG_RX_LO_DAC_CTL, 0x08, 0x00);
  2596. snd_soc_update_bits(codec,
  2597. MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x80, 0x00);
  2598. snd_soc_update_bits(codec,
  2599. MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x40, 0x00);
  2600. snd_soc_update_bits(codec,
  2601. MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL, 0x20, 0x00);
  2602. snd_soc_update_bits(codec,
  2603. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x00);
  2604. break;
  2605. }
  2606. return 0;
  2607. }
  2608. static int msm_anlg_cdc_hphr_dac_event(struct snd_soc_dapm_widget *w,
  2609. struct snd_kcontrol *kcontrol,
  2610. int event)
  2611. {
  2612. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2613. struct sdm660_cdc_priv *sdm660_cdc =
  2614. snd_soc_codec_get_drvdata(codec);
  2615. dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event);
  2616. switch (event) {
  2617. case SND_SOC_DAPM_PRE_PMU:
  2618. if (sdm660_cdc->hph_mode == HD2_MODE)
  2619. msm_anlg_cdc_dig_notifier_call(codec,
  2620. DIG_CDC_EVENT_PRE_RX2_INT_ON);
  2621. snd_soc_update_bits(codec,
  2622. MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x02, 0x02);
  2623. snd_soc_update_bits(codec,
  2624. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x02, 0x02);
  2625. snd_soc_update_bits(codec,
  2626. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x01, 0x01);
  2627. break;
  2628. case SND_SOC_DAPM_POST_PMU:
  2629. snd_soc_update_bits(codec,
  2630. MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x02, 0x00);
  2631. break;
  2632. case SND_SOC_DAPM_POST_PMD:
  2633. snd_soc_update_bits(codec,
  2634. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL, 0x01, 0x00);
  2635. snd_soc_update_bits(codec,
  2636. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL, 0x02, 0x00);
  2637. if (sdm660_cdc->hph_mode == HD2_MODE)
  2638. msm_anlg_cdc_dig_notifier_call(codec,
  2639. DIG_CDC_EVENT_POST_RX2_INT_OFF);
  2640. break;
  2641. }
  2642. return 0;
  2643. }
  2644. static int msm_anlg_cdc_hph_pa_event(struct snd_soc_dapm_widget *w,
  2645. struct snd_kcontrol *kcontrol,
  2646. int event)
  2647. {
  2648. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2649. struct sdm660_cdc_priv *sdm660_cdc =
  2650. snd_soc_codec_get_drvdata(codec);
  2651. dev_dbg(codec->dev, "%s: %s event = %d\n", __func__, w->name, event);
  2652. switch (event) {
  2653. case SND_SOC_DAPM_PRE_PMU:
  2654. if (w->shift == 5)
  2655. msm_anlg_cdc_notifier_call(codec,
  2656. WCD_EVENT_PRE_HPHL_PA_ON);
  2657. else if (w->shift == 4)
  2658. msm_anlg_cdc_notifier_call(codec,
  2659. WCD_EVENT_PRE_HPHR_PA_ON);
  2660. snd_soc_update_bits(codec,
  2661. MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x20, 0x20);
  2662. break;
  2663. case SND_SOC_DAPM_POST_PMU:
  2664. /* Wait for 7ms to allow setting time for HPH_PA Enable */
  2665. usleep_range(7000, 7100);
  2666. if (w->shift == 5) {
  2667. snd_soc_update_bits(codec,
  2668. MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x04);
  2669. msm_anlg_cdc_dig_notifier_call(codec,
  2670. DIG_CDC_EVENT_RX1_MUTE_OFF);
  2671. } else if (w->shift == 4) {
  2672. snd_soc_update_bits(codec,
  2673. MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x04);
  2674. msm_anlg_cdc_dig_notifier_call(codec,
  2675. DIG_CDC_EVENT_RX2_MUTE_OFF);
  2676. }
  2677. break;
  2678. case SND_SOC_DAPM_PRE_PMD:
  2679. if (w->shift == 5) {
  2680. msm_anlg_cdc_dig_notifier_call(codec,
  2681. DIG_CDC_EVENT_RX1_MUTE_ON);
  2682. /* Wait for 20ms after HPHL RX digital mute */
  2683. msleep(20);
  2684. snd_soc_update_bits(codec,
  2685. MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x00);
  2686. msm_anlg_cdc_notifier_call(codec,
  2687. WCD_EVENT_PRE_HPHL_PA_OFF);
  2688. } else if (w->shift == 4) {
  2689. msm_anlg_cdc_dig_notifier_call(codec,
  2690. DIG_CDC_EVENT_RX2_MUTE_ON);
  2691. /* Wait for 20ms after HPHR RX digital mute */
  2692. msleep(20);
  2693. snd_soc_update_bits(codec,
  2694. MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x00);
  2695. msm_anlg_cdc_notifier_call(codec,
  2696. WCD_EVENT_PRE_HPHR_PA_OFF);
  2697. }
  2698. if (get_codec_version(sdm660_cdc) >= CAJON) {
  2699. snd_soc_update_bits(codec,
  2700. MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_CNP,
  2701. 0xF0, 0x30);
  2702. }
  2703. break;
  2704. case SND_SOC_DAPM_POST_PMD:
  2705. if (w->shift == 5) {
  2706. clear_bit(WCD_MBHC_HPHL_PA_OFF_ACK,
  2707. &sdm660_cdc->mbhc.hph_pa_dac_state);
  2708. msm_anlg_cdc_notifier_call(codec,
  2709. WCD_EVENT_POST_HPHL_PA_OFF);
  2710. } else if (w->shift == 4) {
  2711. clear_bit(WCD_MBHC_HPHR_PA_OFF_ACK,
  2712. &sdm660_cdc->mbhc.hph_pa_dac_state);
  2713. msm_anlg_cdc_notifier_call(codec,
  2714. WCD_EVENT_POST_HPHR_PA_OFF);
  2715. }
  2716. /* Wait for 15ms after HPH RX teardown */
  2717. usleep_range(15000, 15100);
  2718. break;
  2719. }
  2720. return 0;
  2721. }
  2722. static const struct snd_soc_dapm_route audio_map[] = {
  2723. /* RDAC Connections */
  2724. {"HPHR DAC", NULL, "RDAC2 MUX"},
  2725. {"RDAC2 MUX", "RX1", "PDM_IN_RX1"},
  2726. {"RDAC2 MUX", "RX2", "PDM_IN_RX2"},
  2727. /* WSA */
  2728. {"WSA_SPK OUT", NULL, "WSA Spk Switch"},
  2729. {"WSA Spk Switch", "WSA", "EAR PA"},
  2730. /* Earpiece (RX MIX1) */
  2731. {"EAR", NULL, "EAR_S"},
  2732. {"EAR_S", "Switch", "EAR PA"},
  2733. {"EAR PA", NULL, "RX_BIAS"},
  2734. {"EAR PA", NULL, "HPHL DAC"},
  2735. {"EAR PA", NULL, "HPHR DAC"},
  2736. {"EAR PA", NULL, "EAR CP"},
  2737. /* Headset (RX MIX1 and RX MIX2) */
  2738. {"HEADPHONE", NULL, "HPHL PA"},
  2739. {"HEADPHONE", NULL, "HPHR PA"},
  2740. {"Ext Spk", NULL, "Ext Spk Switch"},
  2741. {"Ext Spk Switch", "On", "HPHL PA"},
  2742. {"Ext Spk Switch", "On", "HPHR PA"},
  2743. {"HPHL PA", NULL, "HPHL"},
  2744. {"HPHR PA", NULL, "HPHR"},
  2745. {"HPHL", "Switch", "HPHL DAC"},
  2746. {"HPHR", "Switch", "HPHR DAC"},
  2747. {"HPHL PA", NULL, "CP"},
  2748. {"HPHL PA", NULL, "RX_BIAS"},
  2749. {"HPHR PA", NULL, "CP"},
  2750. {"HPHR PA", NULL, "RX_BIAS"},
  2751. {"HPHL DAC", NULL, "PDM_IN_RX1"},
  2752. {"SPK_OUT", NULL, "SPK PA"},
  2753. {"SPK PA", NULL, "SPK_RX_BIAS"},
  2754. {"SPK PA", NULL, "SPK"},
  2755. {"SPK", "Switch", "SPK DAC"},
  2756. {"SPK DAC", NULL, "PDM_IN_RX3"},
  2757. {"SPK DAC", NULL, "VDD_SPKDRV"},
  2758. /* lineout */
  2759. {"LINEOUT", NULL, "LINEOUT PA"},
  2760. {"LINEOUT PA", NULL, "SPK_RX_BIAS"},
  2761. {"LINEOUT PA", NULL, "LINE_OUT"},
  2762. {"LINE_OUT", "Switch", "LINEOUT DAC"},
  2763. {"LINEOUT DAC", NULL, "PDM_IN_RX3"},
  2764. /* lineout to WSA */
  2765. {"WSA_SPK OUT", NULL, "LINEOUT PA"},
  2766. {"PDM_IN_RX1", NULL, "RX1 CLK"},
  2767. {"PDM_IN_RX2", NULL, "RX2 CLK"},
  2768. {"PDM_IN_RX3", NULL, "RX3 CLK"},
  2769. {"ADC1_OUT", NULL, "ADC1"},
  2770. {"ADC2_OUT", NULL, "ADC2"},
  2771. {"ADC3_OUT", NULL, "ADC3"},
  2772. /* ADC Connections */
  2773. {"ADC2", NULL, "ADC2 MUX"},
  2774. {"ADC3", NULL, "ADC2 MUX"},
  2775. {"ADC2 MUX", "INP2", "ADC2_INP2"},
  2776. {"ADC2 MUX", "INP3", "ADC2_INP3"},
  2777. {"ADC1", NULL, "ADC1_INP1"},
  2778. {"ADC1_INP1", "Switch", "AMIC1"},
  2779. {"ADC2_INP2", NULL, "AMIC2"},
  2780. {"ADC2_INP3", NULL, "AMIC3"},
  2781. {"MIC BIAS Internal1", NULL, "INT_LDO_H"},
  2782. {"MIC BIAS Internal2", NULL, "INT_LDO_H"},
  2783. {"MIC BIAS External", NULL, "INT_LDO_H"},
  2784. {"MIC BIAS External2", NULL, "INT_LDO_H"},
  2785. {"MIC BIAS Internal1", NULL, "MICBIAS_REGULATOR"},
  2786. {"MIC BIAS Internal2", NULL, "MICBIAS_REGULATOR"},
  2787. {"MIC BIAS External", NULL, "MICBIAS_REGULATOR"},
  2788. {"MIC BIAS External2", NULL, "MICBIAS_REGULATOR"},
  2789. };
  2790. static int msm_anlg_cdc_startup(struct snd_pcm_substream *substream,
  2791. struct snd_soc_dai *dai)
  2792. {
  2793. struct sdm660_cdc_priv *sdm660_cdc =
  2794. snd_soc_codec_get_drvdata(dai->codec);
  2795. dev_dbg(dai->codec->dev, "%s(): substream = %s stream = %d\n",
  2796. __func__,
  2797. substream->name, substream->stream);
  2798. /*
  2799. * If status_mask is BUS_DOWN it means SSR is not complete.
  2800. * So return error.
  2801. */
  2802. if (test_bit(BUS_DOWN, &sdm660_cdc->status_mask)) {
  2803. dev_err(dai->codec->dev, "Error, Device is not up post SSR\n");
  2804. return -EINVAL;
  2805. }
  2806. return 0;
  2807. }
  2808. static void msm_anlg_cdc_shutdown(struct snd_pcm_substream *substream,
  2809. struct snd_soc_dai *dai)
  2810. {
  2811. dev_dbg(dai->codec->dev,
  2812. "%s(): substream = %s stream = %d\n", __func__,
  2813. substream->name, substream->stream);
  2814. }
  2815. int msm_anlg_cdc_mclk_enable(struct snd_soc_codec *codec,
  2816. int mclk_enable, bool dapm)
  2817. {
  2818. struct sdm660_cdc_priv *sdm660_cdc =
  2819. snd_soc_codec_get_drvdata(codec);
  2820. dev_dbg(codec->dev, "%s: mclk_enable = %u, dapm = %d\n",
  2821. __func__, mclk_enable, dapm);
  2822. if (mclk_enable) {
  2823. sdm660_cdc->int_mclk0_enabled = true;
  2824. msm_anlg_cdc_codec_enable_clock_block(codec, 1);
  2825. } else {
  2826. if (!sdm660_cdc->int_mclk0_enabled) {
  2827. dev_err(codec->dev, "Error, MCLK already diabled\n");
  2828. return -EINVAL;
  2829. }
  2830. sdm660_cdc->int_mclk0_enabled = false;
  2831. msm_anlg_cdc_codec_enable_clock_block(codec, 0);
  2832. }
  2833. return 0;
  2834. }
  2835. EXPORT_SYMBOL(msm_anlg_cdc_mclk_enable);
  2836. static int msm_anlg_cdc_set_dai_sysclk(struct snd_soc_dai *dai,
  2837. int clk_id, unsigned int freq, int dir)
  2838. {
  2839. dev_dbg(dai->codec->dev, "%s\n", __func__);
  2840. return 0;
  2841. }
  2842. static int msm_anlg_cdc_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
  2843. {
  2844. dev_dbg(dai->codec->dev, "%s\n", __func__);
  2845. return 0;
  2846. }
  2847. static int msm_anlg_cdc_set_channel_map(struct snd_soc_dai *dai,
  2848. unsigned int tx_num, unsigned int *tx_slot,
  2849. unsigned int rx_num, unsigned int *rx_slot)
  2850. {
  2851. dev_dbg(dai->codec->dev, "%s\n", __func__);
  2852. return 0;
  2853. }
  2854. static int msm_anlg_cdc_get_channel_map(struct snd_soc_dai *dai,
  2855. unsigned int *tx_num, unsigned int *tx_slot,
  2856. unsigned int *rx_num, unsigned int *rx_slot)
  2857. {
  2858. dev_dbg(dai->codec->dev, "%s\n", __func__);
  2859. return 0;
  2860. }
  2861. static struct snd_soc_dai_ops msm_anlg_cdc_dai_ops = {
  2862. .startup = msm_anlg_cdc_startup,
  2863. .shutdown = msm_anlg_cdc_shutdown,
  2864. .set_sysclk = msm_anlg_cdc_set_dai_sysclk,
  2865. .set_fmt = msm_anlg_cdc_set_dai_fmt,
  2866. .set_channel_map = msm_anlg_cdc_set_channel_map,
  2867. .get_channel_map = msm_anlg_cdc_get_channel_map,
  2868. };
  2869. static struct snd_soc_dai_driver msm_anlg_cdc_i2s_dai[] = {
  2870. {
  2871. .name = "msm_anlg_cdc_i2s_rx1",
  2872. .id = AIF1_PB,
  2873. .playback = {
  2874. .stream_name = "PDM Playback",
  2875. .rates = SDM660_CDC_RATES,
  2876. .formats = SDM660_CDC_FORMATS,
  2877. .rate_max = 192000,
  2878. .rate_min = 8000,
  2879. .channels_min = 1,
  2880. .channels_max = 3,
  2881. },
  2882. .ops = &msm_anlg_cdc_dai_ops,
  2883. },
  2884. {
  2885. .name = "msm_anlg_cdc_i2s_tx1",
  2886. .id = AIF1_CAP,
  2887. .capture = {
  2888. .stream_name = "PDM Capture",
  2889. .rates = SDM660_CDC_RATES,
  2890. .formats = SDM660_CDC_FORMATS,
  2891. .rate_max = 48000,
  2892. .rate_min = 8000,
  2893. .channels_min = 1,
  2894. .channels_max = 4,
  2895. },
  2896. .ops = &msm_anlg_cdc_dai_ops,
  2897. },
  2898. {
  2899. .name = "msm_anlg_cdc_i2s_tx2",
  2900. .id = AIF3_SVA,
  2901. .capture = {
  2902. .stream_name = "RecordSVA",
  2903. .rates = SDM660_CDC_RATES,
  2904. .formats = SDM660_CDC_FORMATS,
  2905. .rate_max = 48000,
  2906. .rate_min = 8000,
  2907. .channels_min = 1,
  2908. .channels_max = 2,
  2909. },
  2910. .ops = &msm_anlg_cdc_dai_ops,
  2911. },
  2912. {
  2913. .name = "msm_anlg_vifeedback",
  2914. .id = AIF2_VIFEED,
  2915. .capture = {
  2916. .stream_name = "VIfeed",
  2917. .rates = SDM660_CDC_RATES,
  2918. .formats = SDM660_CDC_FORMATS,
  2919. .rate_max = 48000,
  2920. .rate_min = 48000,
  2921. .channels_min = 2,
  2922. .channels_max = 2,
  2923. },
  2924. .ops = &msm_anlg_cdc_dai_ops,
  2925. },
  2926. };
  2927. static int msm_anlg_cdc_codec_enable_lo_pa(struct snd_soc_dapm_widget *w,
  2928. struct snd_kcontrol *kcontrol,
  2929. int event)
  2930. {
  2931. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2932. dev_dbg(codec->dev, "%s: %d %s\n", __func__, event, w->name);
  2933. switch (event) {
  2934. case SND_SOC_DAPM_POST_PMU:
  2935. msm_anlg_cdc_dig_notifier_call(codec,
  2936. DIG_CDC_EVENT_RX3_MUTE_OFF);
  2937. break;
  2938. case SND_SOC_DAPM_POST_PMD:
  2939. msm_anlg_cdc_dig_notifier_call(codec,
  2940. DIG_CDC_EVENT_RX3_MUTE_ON);
  2941. break;
  2942. }
  2943. return 0;
  2944. }
  2945. static int msm_anlg_cdc_codec_enable_spk_ext_pa(struct snd_soc_dapm_widget *w,
  2946. struct snd_kcontrol *kcontrol,
  2947. int event)
  2948. {
  2949. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2950. struct sdm660_cdc_priv *sdm660_cdc =
  2951. snd_soc_codec_get_drvdata(codec);
  2952. dev_dbg(codec->dev, "%s: %s event = %d\n", __func__, w->name, event);
  2953. switch (event) {
  2954. case SND_SOC_DAPM_POST_PMU:
  2955. dev_dbg(codec->dev,
  2956. "%s: enable external speaker PA\n", __func__);
  2957. if (sdm660_cdc->codec_spk_ext_pa_cb)
  2958. sdm660_cdc->codec_spk_ext_pa_cb(codec, 1);
  2959. break;
  2960. case SND_SOC_DAPM_PRE_PMD:
  2961. dev_dbg(codec->dev,
  2962. "%s: enable external speaker PA\n", __func__);
  2963. if (sdm660_cdc->codec_spk_ext_pa_cb)
  2964. sdm660_cdc->codec_spk_ext_pa_cb(codec, 0);
  2965. break;
  2966. }
  2967. return 0;
  2968. }
  2969. static int msm_anlg_cdc_codec_enable_ear_pa(struct snd_soc_dapm_widget *w,
  2970. struct snd_kcontrol *kcontrol,
  2971. int event)
  2972. {
  2973. struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
  2974. struct sdm660_cdc_priv *sdm660_cdc =
  2975. snd_soc_codec_get_drvdata(codec);
  2976. switch (event) {
  2977. case SND_SOC_DAPM_PRE_PMU:
  2978. dev_dbg(codec->dev,
  2979. "%s: Sleeping 20ms after select EAR PA\n",
  2980. __func__);
  2981. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  2982. 0x80, 0x80);
  2983. if (get_codec_version(sdm660_cdc) < CONGA)
  2984. snd_soc_update_bits(codec,
  2985. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0xFF, 0x2A);
  2986. if (get_codec_version(sdm660_cdc) >= DIANGU) {
  2987. snd_soc_update_bits(codec,
  2988. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x08, 0x00);
  2989. snd_soc_update_bits(codec,
  2990. MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x04);
  2991. snd_soc_update_bits(codec,
  2992. MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x04);
  2993. }
  2994. break;
  2995. case SND_SOC_DAPM_POST_PMU:
  2996. dev_dbg(codec->dev,
  2997. "%s: Sleeping 20ms after enabling EAR PA\n",
  2998. __func__);
  2999. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  3000. 0x40, 0x40);
  3001. /* Wait for 7ms after EAR PA enable */
  3002. usleep_range(7000, 7100);
  3003. msm_anlg_cdc_dig_notifier_call(codec,
  3004. DIG_CDC_EVENT_RX1_MUTE_OFF);
  3005. break;
  3006. case SND_SOC_DAPM_PRE_PMD:
  3007. msm_anlg_cdc_dig_notifier_call(codec,
  3008. DIG_CDC_EVENT_RX1_MUTE_ON);
  3009. /* Wait for 20ms for RX digital mute to take effect */
  3010. msleep(20);
  3011. if (sdm660_cdc->boost_option == BOOST_ALWAYS) {
  3012. dev_dbg(codec->dev,
  3013. "%s: boost_option:%d, tear down ear\n",
  3014. __func__, sdm660_cdc->boost_option);
  3015. msm_anlg_cdc_boost_mode_sequence(codec, EAR_PMD);
  3016. }
  3017. if (get_codec_version(sdm660_cdc) >= DIANGU) {
  3018. snd_soc_update_bits(codec,
  3019. MSM89XX_PMIC_ANALOG_RX_HPH_L_TEST, 0x04, 0x0);
  3020. snd_soc_update_bits(codec,
  3021. MSM89XX_PMIC_ANALOG_RX_HPH_R_TEST, 0x04, 0x0);
  3022. }
  3023. break;
  3024. case SND_SOC_DAPM_POST_PMD:
  3025. dev_dbg(codec->dev,
  3026. "%s: Sleeping 7ms after disabling EAR PA\n",
  3027. __func__);
  3028. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  3029. 0x40, 0x00);
  3030. /* Wait for 7ms after EAR PA teardown */
  3031. usleep_range(7000, 7100);
  3032. if (get_codec_version(sdm660_cdc) < CONGA)
  3033. snd_soc_update_bits(codec,
  3034. MSM89XX_PMIC_ANALOG_RX_HPH_CNP_WG_TIME, 0xFF, 0x16);
  3035. if (get_codec_version(sdm660_cdc) >= DIANGU)
  3036. snd_soc_update_bits(codec,
  3037. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC, 0x08, 0x08);
  3038. break;
  3039. }
  3040. return 0;
  3041. }
  3042. static const struct snd_soc_dapm_widget msm_anlg_cdc_dapm_widgets[] = {
  3043. SND_SOC_DAPM_PGA_E("EAR PA", SND_SOC_NOPM,
  3044. 0, 0, NULL, 0, msm_anlg_cdc_codec_enable_ear_pa,
  3045. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  3046. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  3047. SND_SOC_DAPM_PGA_E("HPHL PA", MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN,
  3048. 5, 0, NULL, 0,
  3049. msm_anlg_cdc_hph_pa_event, SND_SOC_DAPM_PRE_PMU |
  3050. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
  3051. SND_SOC_DAPM_POST_PMD),
  3052. SND_SOC_DAPM_PGA_E("HPHR PA", MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN,
  3053. 4, 0, NULL, 0,
  3054. msm_anlg_cdc_hph_pa_event, SND_SOC_DAPM_PRE_PMU |
  3055. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
  3056. SND_SOC_DAPM_POST_PMD),
  3057. SND_SOC_DAPM_PGA_E("SPK PA", SND_SOC_NOPM,
  3058. 0, 0, NULL, 0, msm_anlg_cdc_codec_enable_spk_pa,
  3059. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  3060. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  3061. SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM89XX_PMIC_ANALOG_RX_LO_EN_CTL,
  3062. 5, 0, NULL, 0, msm_anlg_cdc_codec_enable_lo_pa,
  3063. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  3064. SND_SOC_DAPM_MUX("EAR_S", SND_SOC_NOPM, 0, 0, ear_pa_mux),
  3065. SND_SOC_DAPM_MUX("SPK", SND_SOC_NOPM, 0, 0, spkr_mux),
  3066. SND_SOC_DAPM_MUX("HPHL", SND_SOC_NOPM, 0, 0, hphl_mux),
  3067. SND_SOC_DAPM_MUX("HPHR", SND_SOC_NOPM, 0, 0, hphr_mux),
  3068. SND_SOC_DAPM_MUX("RDAC2 MUX", SND_SOC_NOPM, 0, 0, &rdac2_mux),
  3069. SND_SOC_DAPM_MUX("WSA Spk Switch", SND_SOC_NOPM, 0, 0, wsa_spk_mux),
  3070. SND_SOC_DAPM_MUX("Ext Spk Switch", SND_SOC_NOPM, 0, 0, &ext_spk_mux),
  3071. SND_SOC_DAPM_MUX("LINE_OUT", SND_SOC_NOPM, 0, 0, lo_mux),
  3072. SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux),
  3073. SND_SOC_DAPM_MIXER_E("HPHL DAC",
  3074. MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 3, 0, NULL,
  3075. 0, msm_anlg_cdc_hphl_dac_event,
  3076. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  3077. SND_SOC_DAPM_POST_PMD),
  3078. SND_SOC_DAPM_MIXER_E("HPHR DAC",
  3079. MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 3, 0, NULL,
  3080. 0, msm_anlg_cdc_hphr_dac_event,
  3081. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  3082. SND_SOC_DAPM_POST_PMD),
  3083. SND_SOC_DAPM_MIXER("ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
  3084. SND_SOC_DAPM_MIXER("ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
  3085. SND_SOC_DAPM_DAC("SPK DAC", NULL, MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL,
  3086. 7, 0),
  3087. SND_SOC_DAPM_DAC_E("LINEOUT DAC", NULL,
  3088. SND_SOC_NOPM, 0, 0, msm_anlg_cdc_lo_dac_event,
  3089. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  3090. SND_SOC_DAPM_POST_PMD),
  3091. SND_SOC_DAPM_SPK("Ext Spk", msm_anlg_cdc_codec_enable_spk_ext_pa),
  3092. SND_SOC_DAPM_SWITCH("ADC1_INP1", SND_SOC_NOPM, 0, 0,
  3093. &adc1_switch),
  3094. SND_SOC_DAPM_SUPPLY("RX1 CLK", MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  3095. 0, 0, NULL, 0),
  3096. SND_SOC_DAPM_SUPPLY("RX2 CLK", MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  3097. 1, 0, NULL, 0),
  3098. SND_SOC_DAPM_SUPPLY("RX3 CLK", MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  3099. 2, 0, msm_anlg_cdc_codec_enable_dig_clk,
  3100. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  3101. SND_SOC_DAPM_SUPPLY("CP", MSM89XX_PMIC_ANALOG_NCP_EN, 0, 0,
  3102. msm_anlg_cdc_codec_enable_charge_pump,
  3103. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  3104. SND_SOC_DAPM_POST_PMD),
  3105. SND_SOC_DAPM_SUPPLY("EAR CP", MSM89XX_PMIC_ANALOG_NCP_EN, 4, 0,
  3106. msm_anlg_cdc_codec_enable_charge_pump,
  3107. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  3108. SND_SOC_DAPM_POST_PMD),
  3109. SND_SOC_DAPM_SUPPLY_S("RX_BIAS", 1, SND_SOC_NOPM,
  3110. 0, 0, msm_anlg_cdc_codec_enable_rx_bias,
  3111. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  3112. SND_SOC_DAPM_SUPPLY_S("SPK_RX_BIAS", 1, SND_SOC_NOPM, 0, 0,
  3113. msm_anlg_cdc_codec_enable_rx_bias, SND_SOC_DAPM_PRE_PMU |
  3114. SND_SOC_DAPM_POST_PMD),
  3115. SND_SOC_DAPM_SUPPLY("VDD_SPKDRV", SND_SOC_NOPM, 0, 0,
  3116. sdm660_wcd_codec_enable_vdd_spkr,
  3117. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  3118. SND_SOC_DAPM_SUPPLY("INT_LDO_H", SND_SOC_NOPM, 1, 0, NULL, 0),
  3119. SND_SOC_DAPM_SUPPLY("MICBIAS_REGULATOR", SND_SOC_NOPM,
  3120. ON_DEMAND_MICBIAS, 0,
  3121. msm_anlg_cdc_codec_enable_on_demand_supply,
  3122. SND_SOC_DAPM_PRE_PMU |
  3123. SND_SOC_DAPM_POST_PMD),
  3124. SND_SOC_DAPM_MICBIAS_E("MIC BIAS Internal1",
  3125. MSM89XX_PMIC_ANALOG_MICB_1_EN, 7, 0,
  3126. msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  3127. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  3128. SND_SOC_DAPM_MICBIAS_E("MIC BIAS Internal2",
  3129. MSM89XX_PMIC_ANALOG_MICB_2_EN, 7, 0,
  3130. msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  3131. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  3132. SND_SOC_DAPM_MICBIAS_E("MIC BIAS Internal3",
  3133. MSM89XX_PMIC_ANALOG_MICB_1_EN, 7, 0,
  3134. msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  3135. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  3136. SND_SOC_DAPM_ADC_E("ADC1", NULL, MSM89XX_PMIC_ANALOG_TX_1_EN, 7, 0,
  3137. msm_anlg_cdc_codec_enable_adc, SND_SOC_DAPM_PRE_PMU |
  3138. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  3139. SND_SOC_DAPM_ADC_E("ADC2_INP2",
  3140. NULL, MSM89XX_PMIC_ANALOG_TX_2_EN, 7, 0,
  3141. msm_anlg_cdc_codec_enable_adc, SND_SOC_DAPM_PRE_PMU |
  3142. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  3143. SND_SOC_DAPM_ADC_E("ADC2_INP3",
  3144. NULL, MSM89XX_PMIC_ANALOG_TX_3_EN, 7, 0,
  3145. msm_anlg_cdc_codec_enable_adc, SND_SOC_DAPM_PRE_PMU |
  3146. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  3147. SND_SOC_DAPM_MICBIAS_E("MIC BIAS External",
  3148. MSM89XX_PMIC_ANALOG_MICB_1_EN, 7, 0,
  3149. msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  3150. SND_SOC_DAPM_POST_PMD),
  3151. SND_SOC_DAPM_MICBIAS_E("MIC BIAS External2",
  3152. MSM89XX_PMIC_ANALOG_MICB_2_EN, 7, 0,
  3153. msm_anlg_cdc_codec_enable_micbias, SND_SOC_DAPM_POST_PMU |
  3154. SND_SOC_DAPM_POST_PMD),
  3155. SND_SOC_DAPM_INPUT("AMIC1"),
  3156. SND_SOC_DAPM_INPUT("AMIC2"),
  3157. SND_SOC_DAPM_INPUT("AMIC3"),
  3158. SND_SOC_DAPM_AIF_IN("PDM_IN_RX1", "PDM Playback",
  3159. 0, SND_SOC_NOPM, 0, 0),
  3160. SND_SOC_DAPM_AIF_IN("PDM_IN_RX2", "PDM Playback",
  3161. 0, SND_SOC_NOPM, 0, 0),
  3162. SND_SOC_DAPM_AIF_IN("PDM_IN_RX3", "PDM Playback",
  3163. 0, SND_SOC_NOPM, 0, 0),
  3164. SND_SOC_DAPM_OUTPUT("EAR"),
  3165. SND_SOC_DAPM_OUTPUT("WSA_SPK OUT"),
  3166. SND_SOC_DAPM_OUTPUT("HEADPHONE"),
  3167. SND_SOC_DAPM_OUTPUT("SPK_OUT"),
  3168. SND_SOC_DAPM_OUTPUT("LINEOUT"),
  3169. SND_SOC_DAPM_AIF_OUT("ADC1_OUT", "PDM Capture",
  3170. 0, SND_SOC_NOPM, 0, 0),
  3171. SND_SOC_DAPM_AIF_OUT("ADC2_OUT", "PDM Capture",
  3172. 0, SND_SOC_NOPM, 0, 0),
  3173. SND_SOC_DAPM_AIF_OUT("ADC3_OUT", "PDM Capture",
  3174. 0, SND_SOC_NOPM, 0, 0),
  3175. };
  3176. static const struct sdm660_cdc_reg_mask_val msm_anlg_cdc_reg_defaults[] = {
  3177. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03),
  3178. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82),
  3179. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1),
  3180. };
  3181. static const struct sdm660_cdc_reg_mask_val
  3182. msm_anlg_cdc_reg_defaults_2_0[] = {
  3183. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5),
  3184. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F),
  3185. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4F),
  3186. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x28),
  3187. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69),
  3188. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01),
  3189. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_BOOST_EN_CTL, 0x5F),
  3190. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SLOPE_COMP_IP_ZERO, 0x88),
  3191. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5),
  3192. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F),
  3193. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82),
  3194. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03),
  3195. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1),
  3196. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80),
  3197. };
  3198. static const struct sdm660_cdc_reg_mask_val conga_wcd_reg_defaults[] = {
  3199. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5),
  3200. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F),
  3201. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5),
  3202. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F),
  3203. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4C),
  3204. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0x28),
  3205. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69),
  3206. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01),
  3207. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_SUBTYPE, 0x0A),
  3208. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03),
  3209. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1),
  3210. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80),
  3211. };
  3212. static const struct sdm660_cdc_reg_mask_val cajon_wcd_reg_defaults[] = {
  3213. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5),
  3214. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F),
  3215. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5),
  3216. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F),
  3217. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4C),
  3218. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0x82),
  3219. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0xA8),
  3220. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0xA4),
  3221. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x41),
  3222. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69),
  3223. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01),
  3224. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1),
  3225. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03),
  3226. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0xFA),
  3227. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80),
  3228. };
  3229. static const struct sdm660_cdc_reg_mask_val cajon2p0_wcd_reg_defaults[] = {
  3230. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_SEC_ACCESS, 0xA5),
  3231. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL3, 0x0F),
  3232. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SEC_ACCESS, 0xA5),
  3233. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL3, 0x0F),
  3234. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_TX_1_2_OPAMP_BIAS, 0x4C),
  3235. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_CURRENT_LIMIT, 0xA2),
  3236. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_FBCTRL, 0xA8),
  3237. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_NCP_VCTRL, 0xA4),
  3238. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_ANA_BIAS_SET, 0x41),
  3239. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL, 0x69),
  3240. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DRV_DBG, 0x01),
  3241. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_OCP_CTL, 0xE1),
  3242. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x03),
  3243. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_RX_EAR_STATUS, 0x10),
  3244. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_BYPASS_MODE, 0x18),
  3245. MSM89XX_REG_VAL(MSM89XX_PMIC_ANALOG_RX_HPH_BIAS_PA, 0xFA),
  3246. MSM89XX_REG_VAL(MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80),
  3247. };
  3248. static void msm_anlg_cdc_update_reg_defaults(struct snd_soc_codec *codec)
  3249. {
  3250. u32 i, version;
  3251. struct sdm660_cdc_priv *sdm660_cdc =
  3252. snd_soc_codec_get_drvdata(codec);
  3253. version = get_codec_version(sdm660_cdc);
  3254. if (version == TOMBAK_1_0) {
  3255. for (i = 0; i < ARRAY_SIZE(msm_anlg_cdc_reg_defaults); i++)
  3256. snd_soc_write(codec, msm_anlg_cdc_reg_defaults[i].reg,
  3257. msm_anlg_cdc_reg_defaults[i].val);
  3258. } else if (version == TOMBAK_2_0) {
  3259. for (i = 0; i < ARRAY_SIZE(msm_anlg_cdc_reg_defaults_2_0); i++)
  3260. snd_soc_write(codec,
  3261. msm_anlg_cdc_reg_defaults_2_0[i].reg,
  3262. msm_anlg_cdc_reg_defaults_2_0[i].val);
  3263. } else if (version == CONGA) {
  3264. for (i = 0; i < ARRAY_SIZE(conga_wcd_reg_defaults); i++)
  3265. snd_soc_write(codec,
  3266. conga_wcd_reg_defaults[i].reg,
  3267. conga_wcd_reg_defaults[i].val);
  3268. } else if (version == CAJON) {
  3269. for (i = 0; i < ARRAY_SIZE(cajon_wcd_reg_defaults); i++)
  3270. snd_soc_write(codec,
  3271. cajon_wcd_reg_defaults[i].reg,
  3272. cajon_wcd_reg_defaults[i].val);
  3273. } else if (version == CAJON_2_0 || version == DIANGU
  3274. || version == DRAX_CDC) {
  3275. for (i = 0; i < ARRAY_SIZE(cajon2p0_wcd_reg_defaults); i++)
  3276. snd_soc_write(codec,
  3277. cajon2p0_wcd_reg_defaults[i].reg,
  3278. cajon2p0_wcd_reg_defaults[i].val);
  3279. }
  3280. }
  3281. static const struct sdm660_cdc_reg_mask_val
  3282. msm_anlg_cdc_codec_reg_init_val[] = {
  3283. /* Initialize current threshold to 350MA
  3284. * number of wait and run cycles to 4096
  3285. */
  3286. {MSM89XX_PMIC_ANALOG_RX_COM_OCP_CTL, 0xFF, 0x12},
  3287. {MSM89XX_PMIC_ANALOG_RX_COM_OCP_COUNT, 0xFF, 0xFF},
  3288. };
  3289. static void msm_anlg_cdc_codec_init_reg(struct snd_soc_codec *codec)
  3290. {
  3291. u32 i;
  3292. for (i = 0; i < ARRAY_SIZE(msm_anlg_cdc_codec_reg_init_val); i++)
  3293. snd_soc_update_bits(codec,
  3294. msm_anlg_cdc_codec_reg_init_val[i].reg,
  3295. msm_anlg_cdc_codec_reg_init_val[i].mask,
  3296. msm_anlg_cdc_codec_reg_init_val[i].val);
  3297. }
  3298. static int msm_anlg_cdc_bringup(struct snd_soc_codec *codec)
  3299. {
  3300. snd_soc_write(codec,
  3301. MSM89XX_PMIC_DIGITAL_SEC_ACCESS,
  3302. 0xA5);
  3303. snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x01);
  3304. snd_soc_write(codec,
  3305. MSM89XX_PMIC_ANALOG_SEC_ACCESS,
  3306. 0xA5);
  3307. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x01);
  3308. snd_soc_write(codec,
  3309. MSM89XX_PMIC_DIGITAL_SEC_ACCESS,
  3310. 0xA5);
  3311. snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_PERPH_RESET_CTL4, 0x00);
  3312. snd_soc_write(codec,
  3313. MSM89XX_PMIC_ANALOG_SEC_ACCESS,
  3314. 0xA5);
  3315. snd_soc_write(codec, MSM89XX_PMIC_ANALOG_PERPH_RESET_CTL4, 0x00);
  3316. return 0;
  3317. }
  3318. static struct regulator *msm_anlg_cdc_find_regulator(
  3319. const struct sdm660_cdc_priv *sdm660_cdc,
  3320. const char *name)
  3321. {
  3322. int i;
  3323. for (i = 0; i < sdm660_cdc->num_of_supplies; i++) {
  3324. if (sdm660_cdc->supplies[i].supply &&
  3325. !strcmp(sdm660_cdc->supplies[i].supply, name))
  3326. return sdm660_cdc->supplies[i].consumer;
  3327. }
  3328. dev_dbg(sdm660_cdc->dev, "Error: regulator not found:%s\n"
  3329. , name);
  3330. return NULL;
  3331. }
  3332. static void msm_anlg_cdc_update_micbias_regulator(
  3333. const struct sdm660_cdc_priv *sdm660_cdc,
  3334. const char *name,
  3335. struct on_demand_supply *micbias_supply)
  3336. {
  3337. int i;
  3338. struct sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data;
  3339. for (i = 0; i < sdm660_cdc->num_of_supplies; i++) {
  3340. if (sdm660_cdc->supplies[i].supply &&
  3341. !strcmp(sdm660_cdc->supplies[i].supply, name)) {
  3342. micbias_supply->supply =
  3343. sdm660_cdc->supplies[i].consumer;
  3344. micbias_supply->min_uv = pdata->regulator[i].min_uv;
  3345. micbias_supply->max_uv = pdata->regulator[i].max_uv;
  3346. micbias_supply->optimum_ua =
  3347. pdata->regulator[i].optimum_ua;
  3348. return;
  3349. }
  3350. }
  3351. dev_err(sdm660_cdc->dev, "Error: regulator not found:%s\n", name);
  3352. }
  3353. static int msm_anlg_cdc_device_down(struct snd_soc_codec *codec)
  3354. {
  3355. struct msm_asoc_mach_data *pdata = NULL;
  3356. struct sdm660_cdc_priv *sdm660_cdc_priv =
  3357. snd_soc_codec_get_drvdata(codec);
  3358. unsigned int tx_1_en;
  3359. unsigned int tx_2_en;
  3360. pdata = snd_soc_card_get_drvdata(codec->component.card);
  3361. dev_dbg(codec->dev, "%s: device down!\n", __func__);
  3362. tx_1_en = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_TX_1_EN);
  3363. tx_2_en = snd_soc_read(codec, MSM89XX_PMIC_ANALOG_TX_2_EN);
  3364. tx_1_en = tx_1_en & 0x7f;
  3365. tx_2_en = tx_2_en & 0x7f;
  3366. snd_soc_write(codec,
  3367. MSM89XX_PMIC_ANALOG_TX_1_EN, tx_1_en);
  3368. snd_soc_write(codec,
  3369. MSM89XX_PMIC_ANALOG_TX_2_EN, tx_2_en);
  3370. if (sdm660_cdc_priv->boost_option == BOOST_ON_FOREVER) {
  3371. if ((snd_soc_read(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL)
  3372. & 0x80) == 0) {
  3373. msm_anlg_cdc_dig_notifier_call(codec,
  3374. DIG_CDC_EVENT_CLK_ON);
  3375. snd_soc_write(codec,
  3376. MSM89XX_PMIC_ANALOG_MASTER_BIAS_CTL, 0x30);
  3377. snd_soc_update_bits(codec,
  3378. MSM89XX_PMIC_DIGITAL_CDC_RST_CTL, 0x80, 0x80);
  3379. snd_soc_update_bits(codec,
  3380. MSM89XX_PMIC_DIGITAL_CDC_TOP_CLK_CTL,
  3381. 0x0C, 0x0C);
  3382. snd_soc_update_bits(codec,
  3383. MSM89XX_PMIC_DIGITAL_CDC_DIG_CLK_CTL,
  3384. 0x84, 0x84);
  3385. snd_soc_update_bits(codec,
  3386. MSM89XX_PMIC_DIGITAL_CDC_ANA_CLK_CTL,
  3387. 0x10, 0x10);
  3388. snd_soc_update_bits(codec,
  3389. MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL,
  3390. 0x1F, 0x1F);
  3391. snd_soc_update_bits(codec,
  3392. MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
  3393. 0x90, 0x90);
  3394. snd_soc_update_bits(codec,
  3395. MSM89XX_PMIC_ANALOG_RX_EAR_CTL,
  3396. 0xFF, 0xFF);
  3397. /* Wait for 20us for boost settings to take effect */
  3398. usleep_range(20, 21);
  3399. snd_soc_update_bits(codec,
  3400. MSM89XX_PMIC_ANALOG_SPKR_PWRSTG_CTL,
  3401. 0xFF, 0xFF);
  3402. snd_soc_update_bits(codec,
  3403. MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL,
  3404. 0xE9, 0xE9);
  3405. }
  3406. }
  3407. msm_anlg_cdc_boost_off(codec);
  3408. sdm660_cdc_priv->hph_mode = NORMAL_MODE;
  3409. /* 40ms to allow boost to discharge */
  3410. msleep(40);
  3411. /* Disable PA to avoid pop during codec bring up */
  3412. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_RX_HPH_CNP_EN,
  3413. 0x30, 0x00);
  3414. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_SPKR_DRV_CTL,
  3415. 0x80, 0x00);
  3416. snd_soc_write(codec,
  3417. MSM89XX_PMIC_ANALOG_RX_HPH_L_PA_DAC_CTL, 0x20);
  3418. snd_soc_write(codec,
  3419. MSM89XX_PMIC_ANALOG_RX_HPH_R_PA_DAC_CTL, 0x20);
  3420. snd_soc_write(codec,
  3421. MSM89XX_PMIC_ANALOG_RX_EAR_CTL, 0x12);
  3422. snd_soc_write(codec,
  3423. MSM89XX_PMIC_ANALOG_SPKR_DAC_CTL, 0x93);
  3424. msm_anlg_cdc_dig_notifier_call(codec, DIG_CDC_EVENT_SSR_DOWN);
  3425. atomic_set(&pdata->int_mclk0_enabled, false);
  3426. set_bit(BUS_DOWN, &sdm660_cdc_priv->status_mask);
  3427. snd_soc_card_change_online_state(codec->component.card, 0);
  3428. return 0;
  3429. }
  3430. static int msm_anlg_cdc_device_up(struct snd_soc_codec *codec)
  3431. {
  3432. struct sdm660_cdc_priv *sdm660_cdc_priv =
  3433. snd_soc_codec_get_drvdata(codec);
  3434. dev_dbg(codec->dev, "%s: device up!\n", __func__);
  3435. msm_anlg_cdc_dig_notifier_call(codec, DIG_CDC_EVENT_SSR_UP);
  3436. clear_bit(BUS_DOWN, &sdm660_cdc_priv->status_mask);
  3437. snd_soc_card_change_online_state(codec->component.card, 1);
  3438. /* delay is required to make sure sound card state updated */
  3439. usleep_range(5000, 5100);
  3440. snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_INT_EN_SET,
  3441. MSM89XX_PMIC_DIGITAL_INT_EN_SET__POR);
  3442. snd_soc_write(codec, MSM89XX_PMIC_DIGITAL_INT_EN_CLR,
  3443. MSM89XX_PMIC_DIGITAL_INT_EN_CLR__POR);
  3444. msm_anlg_cdc_set_boost_v(codec);
  3445. msm_anlg_cdc_set_micb_v(codec);
  3446. if (sdm660_cdc_priv->boost_option == BOOST_ON_FOREVER)
  3447. msm_anlg_cdc_boost_on(codec);
  3448. else if (sdm660_cdc_priv->boost_option == BYPASS_ALWAYS)
  3449. msm_anlg_cdc_bypass_on(codec);
  3450. return 0;
  3451. }
  3452. static int sdm660_cdc_notifier_service_cb(struct notifier_block *nb,
  3453. unsigned long opcode, void *ptr)
  3454. {
  3455. struct snd_soc_codec *codec;
  3456. struct sdm660_cdc_priv *sdm660_cdc_priv =
  3457. container_of(nb, struct sdm660_cdc_priv,
  3458. audio_ssr_nb);
  3459. bool adsp_ready = false;
  3460. bool timedout;
  3461. unsigned long timeout;
  3462. static bool initial_boot = true;
  3463. codec = sdm660_cdc_priv->codec;
  3464. dev_dbg(codec->dev, "%s: Service opcode 0x%lx\n", __func__, opcode);
  3465. switch (opcode) {
  3466. case AUDIO_NOTIFIER_SERVICE_DOWN:
  3467. if (initial_boot) {
  3468. initial_boot = false;
  3469. break;
  3470. }
  3471. dev_dbg(codec->dev,
  3472. "ADSP is about to power down. teardown/reset codec\n");
  3473. msm_anlg_cdc_device_down(codec);
  3474. break;
  3475. case AUDIO_NOTIFIER_SERVICE_UP:
  3476. if (initial_boot)
  3477. initial_boot = false;
  3478. dev_dbg(codec->dev,
  3479. "ADSP is about to power up. bring up codec\n");
  3480. if (!q6core_is_adsp_ready()) {
  3481. dev_dbg(codec->dev,
  3482. "ADSP isn't ready\n");
  3483. timeout = jiffies +
  3484. msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS);
  3485. while (!(timedout = time_after(jiffies, timeout))) {
  3486. if (!q6core_is_adsp_ready()) {
  3487. dev_dbg(codec->dev,
  3488. "ADSP isn't ready\n");
  3489. } else {
  3490. dev_dbg(codec->dev,
  3491. "ADSP is ready\n");
  3492. adsp_ready = true;
  3493. goto powerup;
  3494. }
  3495. }
  3496. } else {
  3497. adsp_ready = true;
  3498. dev_dbg(codec->dev, "%s: DSP is ready\n", __func__);
  3499. }
  3500. powerup:
  3501. if (adsp_ready)
  3502. msm_anlg_cdc_device_up(codec);
  3503. break;
  3504. default:
  3505. break;
  3506. }
  3507. return NOTIFY_OK;
  3508. }
  3509. int msm_anlg_cdc_hs_detect(struct snd_soc_codec *codec,
  3510. struct wcd_mbhc_config *mbhc_cfg)
  3511. {
  3512. struct sdm660_cdc_priv *sdm660_cdc_priv =
  3513. snd_soc_codec_get_drvdata(codec);
  3514. return wcd_mbhc_start(&sdm660_cdc_priv->mbhc, mbhc_cfg);
  3515. }
  3516. EXPORT_SYMBOL(msm_anlg_cdc_hs_detect);
  3517. void msm_anlg_cdc_hs_detect_exit(struct snd_soc_codec *codec)
  3518. {
  3519. struct sdm660_cdc_priv *sdm660_cdc_priv =
  3520. snd_soc_codec_get_drvdata(codec);
  3521. wcd_mbhc_stop(&sdm660_cdc_priv->mbhc);
  3522. }
  3523. EXPORT_SYMBOL(msm_anlg_cdc_hs_detect_exit);
  3524. void msm_anlg_cdc_update_int_spk_boost(bool enable)
  3525. {
  3526. pr_debug("%s: enable = %d\n", __func__, enable);
  3527. spkr_boost_en = enable;
  3528. }
  3529. EXPORT_SYMBOL(msm_anlg_cdc_update_int_spk_boost);
  3530. static void msm_anlg_cdc_set_micb_v(struct snd_soc_codec *codec)
  3531. {
  3532. struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec);
  3533. struct sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data;
  3534. u8 reg_val;
  3535. reg_val = VOLTAGE_CONVERTER(pdata->micbias.cfilt1_mv, MICBIAS_MIN_VAL,
  3536. MICBIAS_STEP_SIZE);
  3537. dev_dbg(codec->dev, "cfilt1_mv %d reg_val %x\n",
  3538. (u32)pdata->micbias.cfilt1_mv, reg_val);
  3539. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_VAL,
  3540. 0xF8, (reg_val << 3));
  3541. }
  3542. static void msm_anlg_cdc_set_boost_v(struct snd_soc_codec *codec)
  3543. {
  3544. struct sdm660_cdc_priv *sdm660_cdc_priv =
  3545. snd_soc_codec_get_drvdata(codec);
  3546. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_OUTPUT_VOLTAGE,
  3547. 0x1F, sdm660_cdc_priv->boost_voltage);
  3548. }
  3549. static void msm_anlg_cdc_configure_cap(struct snd_soc_codec *codec,
  3550. bool micbias1, bool micbias2)
  3551. {
  3552. struct msm_asoc_mach_data *pdata = NULL;
  3553. pdata = snd_soc_card_get_drvdata(codec->component.card);
  3554. pr_debug("\n %s: micbias1 %x micbias2 = %d\n", __func__, micbias1,
  3555. micbias2);
  3556. if (micbias1 && micbias2) {
  3557. if ((pdata->micbias1_cap_mode
  3558. == MICBIAS_EXT_BYP_CAP) ||
  3559. (pdata->micbias2_cap_mode
  3560. == MICBIAS_EXT_BYP_CAP))
  3561. snd_soc_update_bits(codec,
  3562. MSM89XX_PMIC_ANALOG_MICB_1_EN,
  3563. 0x40, (MICBIAS_EXT_BYP_CAP << 6));
  3564. else
  3565. snd_soc_update_bits(codec,
  3566. MSM89XX_PMIC_ANALOG_MICB_1_EN,
  3567. 0x40, (MICBIAS_NO_EXT_BYP_CAP << 6));
  3568. } else if (micbias2) {
  3569. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_EN,
  3570. 0x40, (pdata->micbias2_cap_mode << 6));
  3571. } else if (micbias1) {
  3572. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_EN,
  3573. 0x40, (pdata->micbias1_cap_mode << 6));
  3574. } else {
  3575. snd_soc_update_bits(codec, MSM89XX_PMIC_ANALOG_MICB_1_EN,
  3576. 0x40, 0x00);
  3577. }
  3578. }
  3579. static ssize_t msm_anlg_codec_version_read(struct snd_info_entry *entry,
  3580. void *file_private_data,
  3581. struct file *file,
  3582. char __user *buf, size_t count,
  3583. loff_t pos)
  3584. {
  3585. struct sdm660_cdc_priv *sdm660_cdc_priv;
  3586. char buffer[MSM_ANLG_CDC_VERSION_ENTRY_SIZE];
  3587. int len = 0;
  3588. sdm660_cdc_priv = (struct sdm660_cdc_priv *) entry->private_data;
  3589. if (!sdm660_cdc_priv) {
  3590. pr_err("%s: sdm660_cdc_priv is null\n", __func__);
  3591. return -EINVAL;
  3592. }
  3593. switch (get_codec_version(sdm660_cdc_priv)) {
  3594. case DRAX_CDC:
  3595. len = snprintf(buffer, sizeof(buffer), "DRAX-CDC_1_0\n");
  3596. break;
  3597. default:
  3598. len = snprintf(buffer, sizeof(buffer), "VER_UNDEFINED\n");
  3599. }
  3600. return simple_read_from_buffer(buf, count, &pos, buffer, len);
  3601. }
  3602. static struct snd_info_entry_ops msm_anlg_codec_info_ops = {
  3603. .read = msm_anlg_codec_version_read,
  3604. };
  3605. /*
  3606. * msm_anlg_codec_info_create_codec_entry - creates pmic_analog module
  3607. * @codec_root: The parent directory
  3608. * @codec: Codec instance
  3609. *
  3610. * Creates pmic_analog module and version entry under the given
  3611. * parent directory.
  3612. *
  3613. * Return: 0 on success or negative error code on failure.
  3614. */
  3615. int msm_anlg_codec_info_create_codec_entry(struct snd_info_entry *codec_root,
  3616. struct snd_soc_codec *codec)
  3617. {
  3618. struct snd_info_entry *version_entry;
  3619. struct sdm660_cdc_priv *sdm660_cdc_priv;
  3620. struct snd_soc_card *card;
  3621. int ret;
  3622. if (!codec_root || !codec)
  3623. return -EINVAL;
  3624. sdm660_cdc_priv = snd_soc_codec_get_drvdata(codec);
  3625. card = codec->component.card;
  3626. sdm660_cdc_priv->entry = snd_info_create_subdir(codec_root->module,
  3627. "spmi0-03",
  3628. codec_root);
  3629. if (!sdm660_cdc_priv->entry) {
  3630. dev_dbg(codec->dev, "%s: failed to create pmic_analog entry\n",
  3631. __func__);
  3632. return -ENOMEM;
  3633. }
  3634. version_entry = snd_info_create_card_entry(card->snd_card,
  3635. "version",
  3636. sdm660_cdc_priv->entry);
  3637. if (!version_entry) {
  3638. dev_dbg(codec->dev, "%s: failed to create pmic_analog version entry\n",
  3639. __func__);
  3640. return -ENOMEM;
  3641. }
  3642. version_entry->private_data = sdm660_cdc_priv;
  3643. version_entry->size = MSM_ANLG_CDC_VERSION_ENTRY_SIZE;
  3644. version_entry->content = SNDRV_INFO_CONTENT_DATA;
  3645. version_entry->c.ops = &msm_anlg_codec_info_ops;
  3646. if (snd_info_register(version_entry) < 0) {
  3647. snd_info_free_entry(version_entry);
  3648. return -ENOMEM;
  3649. }
  3650. sdm660_cdc_priv->version_entry = version_entry;
  3651. sdm660_cdc_priv->audio_ssr_nb.notifier_call =
  3652. sdm660_cdc_notifier_service_cb;
  3653. ret = audio_notifier_register("pmic_analog_cdc",
  3654. AUDIO_NOTIFIER_ADSP_DOMAIN,
  3655. &sdm660_cdc_priv->audio_ssr_nb);
  3656. if (ret < 0) {
  3657. pr_err("%s: Audio notifier register failed ret = %d\n",
  3658. __func__, ret);
  3659. return ret;
  3660. }
  3661. return 0;
  3662. }
  3663. EXPORT_SYMBOL(msm_anlg_codec_info_create_codec_entry);
  3664. static int msm_anlg_cdc_soc_probe(struct snd_soc_codec *codec)
  3665. {
  3666. struct sdm660_cdc_priv *sdm660_cdc;
  3667. struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
  3668. int ret;
  3669. sdm660_cdc = dev_get_drvdata(codec->dev);
  3670. sdm660_cdc->codec = codec;
  3671. /* codec resmgr module init */
  3672. sdm660_cdc->spkdrv_reg =
  3673. msm_anlg_cdc_find_regulator(sdm660_cdc,
  3674. MSM89XX_VDD_SPKDRV_NAME);
  3675. sdm660_cdc->pmic_rev =
  3676. snd_soc_read(codec,
  3677. MSM89XX_PMIC_DIGITAL_REVISION1);
  3678. sdm660_cdc->codec_version =
  3679. snd_soc_read(codec,
  3680. MSM89XX_PMIC_DIGITAL_PERPH_SUBTYPE);
  3681. sdm660_cdc->analog_major_rev =
  3682. snd_soc_read(codec,
  3683. MSM89XX_PMIC_ANALOG_REVISION4);
  3684. if (sdm660_cdc->codec_version == CONGA) {
  3685. dev_dbg(codec->dev, "%s :Conga REV: %d\n", __func__,
  3686. sdm660_cdc->codec_version);
  3687. sdm660_cdc->ext_spk_boost_set = true;
  3688. } else {
  3689. dev_dbg(codec->dev, "%s :PMIC REV: %d\n", __func__,
  3690. sdm660_cdc->pmic_rev);
  3691. if (sdm660_cdc->pmic_rev == TOMBAK_1_0 &&
  3692. sdm660_cdc->codec_version == CAJON_2_0) {
  3693. if (sdm660_cdc->analog_major_rev == 0x02) {
  3694. sdm660_cdc->codec_version = DRAX_CDC;
  3695. dev_dbg(codec->dev,
  3696. "%s : Drax codec detected\n", __func__);
  3697. } else {
  3698. sdm660_cdc->codec_version = DIANGU;
  3699. dev_dbg(codec->dev, "%s : Diangu detected\n",
  3700. __func__);
  3701. }
  3702. } else if (sdm660_cdc->pmic_rev == TOMBAK_1_0 &&
  3703. (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_NCP_FBCTRL)
  3704. & 0x80)) {
  3705. sdm660_cdc->codec_version = CAJON;
  3706. dev_dbg(codec->dev, "%s : Cajon detected\n", __func__);
  3707. } else if (sdm660_cdc->pmic_rev == TOMBAK_2_0 &&
  3708. (snd_soc_read(codec, MSM89XX_PMIC_ANALOG_NCP_FBCTRL)
  3709. & 0x80)) {
  3710. sdm660_cdc->codec_version = CAJON_2_0;
  3711. dev_dbg(codec->dev, "%s : Cajon 2.0 detected\n",
  3712. __func__);
  3713. }
  3714. }
  3715. /*
  3716. * set to default boost option BOOST_SWITCH, user mixer path can change
  3717. * it to BOOST_ALWAYS or BOOST_BYPASS based on solution chosen.
  3718. */
  3719. sdm660_cdc->boost_option = BOOST_SWITCH;
  3720. sdm660_cdc->hph_mode = NORMAL_MODE;
  3721. msm_anlg_cdc_dt_parse_boost_info(codec);
  3722. msm_anlg_cdc_set_boost_v(codec);
  3723. snd_soc_add_codec_controls(codec, impedance_detect_controls,
  3724. ARRAY_SIZE(impedance_detect_controls));
  3725. snd_soc_add_codec_controls(codec, hph_type_detect_controls,
  3726. ARRAY_SIZE(hph_type_detect_controls));
  3727. msm_anlg_cdc_bringup(codec);
  3728. msm_anlg_cdc_codec_init_reg(codec);
  3729. msm_anlg_cdc_update_reg_defaults(codec);
  3730. wcd9xxx_spmi_set_codec(codec);
  3731. msm_anlg_cdc_update_micbias_regulator(
  3732. sdm660_cdc,
  3733. on_demand_supply_name[ON_DEMAND_MICBIAS],
  3734. &sdm660_cdc->on_demand_list[ON_DEMAND_MICBIAS]);
  3735. atomic_set(&sdm660_cdc->on_demand_list[ON_DEMAND_MICBIAS].ref,
  3736. 0);
  3737. sdm660_cdc->fw_data = devm_kzalloc(codec->dev,
  3738. sizeof(*(sdm660_cdc->fw_data)),
  3739. GFP_KERNEL);
  3740. if (!sdm660_cdc->fw_data)
  3741. return -ENOMEM;
  3742. set_bit(WCD9XXX_MBHC_CAL, sdm660_cdc->fw_data->cal_bit);
  3743. ret = wcd_cal_create_hwdep(sdm660_cdc->fw_data,
  3744. WCD9XXX_CODEC_HWDEP_NODE, codec);
  3745. if (ret < 0) {
  3746. dev_err(codec->dev, "%s hwdep failed %d\n", __func__, ret);
  3747. return ret;
  3748. }
  3749. wcd_mbhc_init(&sdm660_cdc->mbhc, codec, &mbhc_cb, &intr_ids,
  3750. wcd_mbhc_registers, true);
  3751. sdm660_cdc->int_mclk0_enabled = false;
  3752. /*Update speaker boost configuration*/
  3753. sdm660_cdc->spk_boost_set = spkr_boost_en;
  3754. pr_debug("%s: speaker boost configured = %d\n",
  3755. __func__, sdm660_cdc->spk_boost_set);
  3756. /* Set initial MICBIAS voltage level */
  3757. msm_anlg_cdc_set_micb_v(codec);
  3758. /* Set initial cap mode */
  3759. msm_anlg_cdc_configure_cap(codec, false, false);
  3760. snd_soc_dapm_ignore_suspend(dapm, "PDM Playback");
  3761. snd_soc_dapm_ignore_suspend(dapm, "PDM Capture");
  3762. snd_soc_dapm_sync(dapm);
  3763. return 0;
  3764. }
  3765. static int msm_anlg_cdc_soc_remove(struct snd_soc_codec *codec)
  3766. {
  3767. struct sdm660_cdc_priv *sdm660_cdc_priv =
  3768. dev_get_drvdata(codec->dev);
  3769. sdm660_cdc_priv->spkdrv_reg = NULL;
  3770. sdm660_cdc_priv->on_demand_list[ON_DEMAND_MICBIAS].supply = NULL;
  3771. atomic_set(&sdm660_cdc_priv->on_demand_list[ON_DEMAND_MICBIAS].ref,
  3772. 0);
  3773. wcd_mbhc_deinit(&sdm660_cdc_priv->mbhc);
  3774. return 0;
  3775. }
  3776. static int msm_anlg_cdc_enable_static_supplies_to_optimum(
  3777. struct sdm660_cdc_priv *sdm660_cdc,
  3778. struct sdm660_cdc_pdata *pdata)
  3779. {
  3780. int i;
  3781. int ret = 0, rc = 0;
  3782. for (i = 0; i < sdm660_cdc->num_of_supplies; i++) {
  3783. if (pdata->regulator[i].ondemand)
  3784. continue;
  3785. if (regulator_count_voltages(
  3786. sdm660_cdc->supplies[i].consumer) <= 0)
  3787. continue;
  3788. rc = regulator_enable(sdm660_cdc->supplies[i].consumer);
  3789. if (rc) {
  3790. dev_err(sdm660_cdc->dev, "Failed to enable %s: %d\n",
  3791. sdm660_cdc->supplies[i].supply, rc);
  3792. break;
  3793. }
  3794. ret = regulator_set_voltage(
  3795. sdm660_cdc->supplies[i].consumer,
  3796. pdata->regulator[i].min_uv,
  3797. pdata->regulator[i].max_uv);
  3798. if (ret) {
  3799. dev_err(sdm660_cdc->dev,
  3800. "Setting volt failed for regulator %s err %d\n",
  3801. sdm660_cdc->supplies[i].supply, ret);
  3802. }
  3803. ret = regulator_set_load(sdm660_cdc->supplies[i].consumer,
  3804. pdata->regulator[i].optimum_ua);
  3805. dev_dbg(sdm660_cdc->dev, "Regulator %s set optimum mode\n",
  3806. sdm660_cdc->supplies[i].supply);
  3807. }
  3808. while (rc && i--)
  3809. if (!pdata->regulator[i].ondemand)
  3810. regulator_disable(sdm660_cdc->supplies[i].consumer);
  3811. return rc;
  3812. }
  3813. static int msm_anlg_cdc_disable_static_supplies_to_optimum(
  3814. struct sdm660_cdc_priv *sdm660_cdc,
  3815. struct sdm660_cdc_pdata *pdata)
  3816. {
  3817. int i;
  3818. int ret = 0;
  3819. for (i = 0; i < sdm660_cdc->num_of_supplies; i++) {
  3820. if (pdata->regulator[i].ondemand)
  3821. continue;
  3822. if (regulator_count_voltages(
  3823. sdm660_cdc->supplies[i].consumer) <= 0)
  3824. continue;
  3825. regulator_set_voltage(sdm660_cdc->supplies[i].consumer, 0,
  3826. pdata->regulator[i].max_uv);
  3827. regulator_set_load(sdm660_cdc->supplies[i].consumer, 0);
  3828. ret = regulator_disable(sdm660_cdc->supplies[i].consumer);
  3829. if (ret)
  3830. dev_err(sdm660_cdc->dev, "Failed to disable %s: %d\n",
  3831. sdm660_cdc->supplies[i].supply, ret);
  3832. dev_dbg(sdm660_cdc->dev, "Regulator %s disable\n",
  3833. sdm660_cdc->supplies[i].supply);
  3834. }
  3835. return ret;
  3836. }
  3837. static int msm_anlg_cdc_suspend(struct snd_soc_codec *codec)
  3838. {
  3839. struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec);
  3840. struct sdm660_cdc_pdata *sdm660_cdc_pdata =
  3841. sdm660_cdc->dev->platform_data;
  3842. msm_anlg_cdc_disable_static_supplies_to_optimum(sdm660_cdc,
  3843. sdm660_cdc_pdata);
  3844. return 0;
  3845. }
  3846. static int msm_anlg_cdc_resume(struct snd_soc_codec *codec)
  3847. {
  3848. struct msm_asoc_mach_data *pdata = NULL;
  3849. struct sdm660_cdc_priv *sdm660_cdc = snd_soc_codec_get_drvdata(codec);
  3850. struct sdm660_cdc_pdata *sdm660_cdc_pdata =
  3851. sdm660_cdc->dev->platform_data;
  3852. pdata = snd_soc_card_get_drvdata(codec->component.card);
  3853. msm_anlg_cdc_enable_static_supplies_to_optimum(sdm660_cdc,
  3854. sdm660_cdc_pdata);
  3855. return 0;
  3856. }
  3857. static struct regmap *msm_anlg_get_regmap(struct device *dev)
  3858. {
  3859. return dev_get_regmap(dev->parent, NULL);
  3860. }
  3861. static struct snd_soc_codec_driver soc_codec_dev_sdm660_cdc = {
  3862. .probe = msm_anlg_cdc_soc_probe,
  3863. .remove = msm_anlg_cdc_soc_remove,
  3864. .suspend = msm_anlg_cdc_suspend,
  3865. .resume = msm_anlg_cdc_resume,
  3866. .reg_word_size = 1,
  3867. .get_regmap = msm_anlg_get_regmap,
  3868. .component_driver = {
  3869. .controls = msm_anlg_cdc_snd_controls,
  3870. .num_controls = ARRAY_SIZE(msm_anlg_cdc_snd_controls),
  3871. .dapm_widgets = msm_anlg_cdc_dapm_widgets,
  3872. .num_dapm_widgets = ARRAY_SIZE(msm_anlg_cdc_dapm_widgets),
  3873. .dapm_routes = audio_map,
  3874. .num_dapm_routes = ARRAY_SIZE(audio_map),
  3875. },
  3876. };
  3877. static int msm_anlg_cdc_init_supplies(struct sdm660_cdc_priv *sdm660_cdc,
  3878. struct sdm660_cdc_pdata *pdata)
  3879. {
  3880. int ret;
  3881. int i;
  3882. sdm660_cdc->supplies = devm_kzalloc(sdm660_cdc->dev,
  3883. sizeof(struct regulator_bulk_data) *
  3884. ARRAY_SIZE(pdata->regulator),
  3885. GFP_KERNEL);
  3886. if (!sdm660_cdc->supplies) {
  3887. ret = -ENOMEM;
  3888. goto err;
  3889. }
  3890. sdm660_cdc->num_of_supplies = 0;
  3891. if (ARRAY_SIZE(pdata->regulator) > MAX_REGULATOR) {
  3892. dev_err(sdm660_cdc->dev, "%s: Array Size out of bound\n",
  3893. __func__);
  3894. ret = -EINVAL;
  3895. goto err;
  3896. }
  3897. for (i = 0; i < ARRAY_SIZE(pdata->regulator); i++) {
  3898. if (pdata->regulator[i].name) {
  3899. sdm660_cdc->supplies[i].supply =
  3900. pdata->regulator[i].name;
  3901. sdm660_cdc->num_of_supplies++;
  3902. }
  3903. }
  3904. ret = devm_regulator_bulk_get(sdm660_cdc->dev,
  3905. sdm660_cdc->num_of_supplies,
  3906. sdm660_cdc->supplies);
  3907. if (ret != 0) {
  3908. dev_err(sdm660_cdc->dev,
  3909. "Failed to get supplies: err = %d\n",
  3910. ret);
  3911. goto err_supplies;
  3912. }
  3913. for (i = 0; i < sdm660_cdc->num_of_supplies; i++) {
  3914. if (regulator_count_voltages(
  3915. sdm660_cdc->supplies[i].consumer) <= 0)
  3916. continue;
  3917. if (pdata->regulator[i].ondemand) {
  3918. ret = regulator_set_voltage(
  3919. sdm660_cdc->supplies[i].consumer,
  3920. 0, pdata->regulator[i].max_uv);
  3921. if (ret) {
  3922. dev_err(sdm660_cdc->dev,
  3923. "Setting regulator voltage failed for regulator %s err = %d\n",
  3924. sdm660_cdc->supplies[i].supply, ret);
  3925. goto err_supplies;
  3926. }
  3927. ret = regulator_set_load(
  3928. sdm660_cdc->supplies[i].consumer, 0);
  3929. if (ret < 0) {
  3930. dev_err(sdm660_cdc->dev,
  3931. "Setting regulator optimum mode failed for regulator %s err = %d\n",
  3932. sdm660_cdc->supplies[i].supply, ret);
  3933. goto err_supplies;
  3934. } else {
  3935. ret = 0;
  3936. continue;
  3937. }
  3938. }
  3939. ret = regulator_set_voltage(sdm660_cdc->supplies[i].consumer,
  3940. pdata->regulator[i].min_uv,
  3941. pdata->regulator[i].max_uv);
  3942. if (ret) {
  3943. dev_err(sdm660_cdc->dev,
  3944. "Setting regulator voltage failed for regulator %s err = %d\n",
  3945. sdm660_cdc->supplies[i].supply, ret);
  3946. goto err_supplies;
  3947. }
  3948. ret = regulator_set_load(sdm660_cdc->supplies[i].consumer,
  3949. pdata->regulator[i].optimum_ua);
  3950. if (ret < 0) {
  3951. dev_err(sdm660_cdc->dev,
  3952. "Setting regulator optimum mode failed for regulator %s err = %d\n",
  3953. sdm660_cdc->supplies[i].supply, ret);
  3954. goto err_supplies;
  3955. } else {
  3956. ret = 0;
  3957. }
  3958. }
  3959. return ret;
  3960. err_supplies:
  3961. devm_kfree(sdm660_cdc->dev, sdm660_cdc->supplies);
  3962. err:
  3963. return ret;
  3964. }
  3965. static int msm_anlg_cdc_enable_static_supplies(
  3966. struct sdm660_cdc_priv *sdm660_cdc,
  3967. struct sdm660_cdc_pdata *pdata)
  3968. {
  3969. int i;
  3970. int ret = 0;
  3971. for (i = 0; i < sdm660_cdc->num_of_supplies; i++) {
  3972. if (pdata->regulator[i].ondemand)
  3973. continue;
  3974. ret = regulator_enable(sdm660_cdc->supplies[i].consumer);
  3975. if (ret) {
  3976. dev_err(sdm660_cdc->dev, "Failed to enable %s\n",
  3977. sdm660_cdc->supplies[i].supply);
  3978. break;
  3979. }
  3980. dev_dbg(sdm660_cdc->dev, "Enabled regulator %s\n",
  3981. sdm660_cdc->supplies[i].supply);
  3982. }
  3983. while (ret && i--)
  3984. if (!pdata->regulator[i].ondemand)
  3985. regulator_disable(sdm660_cdc->supplies[i].consumer);
  3986. return ret;
  3987. }
  3988. static void msm_anlg_cdc_disable_supplies(struct sdm660_cdc_priv *sdm660_cdc,
  3989. struct sdm660_cdc_pdata *pdata)
  3990. {
  3991. int i;
  3992. regulator_bulk_disable(sdm660_cdc->num_of_supplies,
  3993. sdm660_cdc->supplies);
  3994. for (i = 0; i < sdm660_cdc->num_of_supplies; i++) {
  3995. if (regulator_count_voltages(
  3996. sdm660_cdc->supplies[i].consumer) <= 0)
  3997. continue;
  3998. regulator_set_voltage(sdm660_cdc->supplies[i].consumer, 0,
  3999. pdata->regulator[i].max_uv);
  4000. regulator_set_load(sdm660_cdc->supplies[i].consumer, 0);
  4001. }
  4002. }
  4003. static const struct of_device_id sdm660_codec_of_match[] = {
  4004. { .compatible = "qcom,pmic-analog-codec", },
  4005. {},
  4006. };
  4007. static void msm_anlg_add_child_devices(struct work_struct *work)
  4008. {
  4009. struct sdm660_cdc_priv *pdata;
  4010. struct platform_device *pdev;
  4011. struct device_node *node;
  4012. struct msm_dig_ctrl_data *dig_ctrl_data = NULL, *temp;
  4013. int ret, ctrl_num = 0;
  4014. struct msm_dig_ctrl_platform_data *platdata;
  4015. char plat_dev_name[MSM_DIG_CDC_STRING_LEN];
  4016. pdata = container_of(work, struct sdm660_cdc_priv,
  4017. msm_anlg_add_child_devices_work);
  4018. if (!pdata) {
  4019. pr_err("%s: Memory for pdata does not exist\n",
  4020. __func__);
  4021. return;
  4022. }
  4023. if (!pdata->dev->of_node) {
  4024. dev_err(pdata->dev,
  4025. "%s: DT node for pdata does not exist\n", __func__);
  4026. return;
  4027. }
  4028. platdata = &pdata->dig_plat_data;
  4029. for_each_child_of_node(pdata->dev->of_node, node) {
  4030. if (!strcmp(node->name, "msm-dig-codec"))
  4031. strlcpy(plat_dev_name, "msm_digital_codec",
  4032. (MSM_DIG_CDC_STRING_LEN - 1));
  4033. else
  4034. continue;
  4035. pdev = platform_device_alloc(plat_dev_name, -1);
  4036. if (!pdev) {
  4037. dev_err(pdata->dev, "%s: pdev memory alloc failed\n",
  4038. __func__);
  4039. ret = -ENOMEM;
  4040. goto err;
  4041. }
  4042. pdev->dev.parent = pdata->dev;
  4043. pdev->dev.of_node = node;
  4044. if (!strcmp(node->name, "msm-dig-codec")) {
  4045. ret = platform_device_add_data(pdev, platdata,
  4046. sizeof(*platdata));
  4047. if (ret) {
  4048. dev_err(&pdev->dev,
  4049. "%s: cannot add plat data ctrl:%d\n",
  4050. __func__, ctrl_num);
  4051. goto fail_pdev_add;
  4052. }
  4053. }
  4054. ret = platform_device_add(pdev);
  4055. if (ret) {
  4056. dev_err(&pdev->dev,
  4057. "%s: Cannot add platform device\n",
  4058. __func__);
  4059. goto fail_pdev_add;
  4060. }
  4061. if (!strcmp(node->name, "msm-dig-codec")) {
  4062. temp = krealloc(dig_ctrl_data,
  4063. (ctrl_num + 1) * sizeof(
  4064. struct msm_dig_ctrl_data),
  4065. GFP_KERNEL);
  4066. if (!temp) {
  4067. dev_err(&pdev->dev, "out of memory\n");
  4068. ret = -ENOMEM;
  4069. goto err;
  4070. }
  4071. dig_ctrl_data = temp;
  4072. dig_ctrl_data[ctrl_num].dig_pdev = pdev;
  4073. ctrl_num++;
  4074. dev_dbg(&pdev->dev,
  4075. "%s: Added digital codec device(s)\n",
  4076. __func__);
  4077. pdata->dig_ctrl_data = dig_ctrl_data;
  4078. }
  4079. pdata->pdev_child_devices[pdata->child_count++] = pdev;
  4080. }
  4081. return;
  4082. fail_pdev_add:
  4083. platform_device_put(pdev);
  4084. err:
  4085. return;
  4086. }
  4087. static int msm_anlg_cdc_probe(struct platform_device *pdev)
  4088. {
  4089. int ret = 0;
  4090. struct sdm660_cdc_priv *sdm660_cdc = NULL;
  4091. struct sdm660_cdc_pdata *pdata;
  4092. int adsp_state;
  4093. adsp_state = apr_get_subsys_state();
  4094. if (adsp_state != APR_SUBSYS_LOADED) {
  4095. dev_err(&pdev->dev, "Adsp is not loaded yet %d\n",
  4096. adsp_state);
  4097. return -EPROBE_DEFER;
  4098. }
  4099. device_init_wakeup(&pdev->dev, true);
  4100. if (pdev->dev.of_node) {
  4101. dev_dbg(&pdev->dev, "%s:Platform data from device tree\n",
  4102. __func__);
  4103. pdata = msm_anlg_cdc_populate_dt_pdata(&pdev->dev);
  4104. pdev->dev.platform_data = pdata;
  4105. } else {
  4106. dev_dbg(&pdev->dev, "%s:Platform data from board file\n",
  4107. __func__);
  4108. pdata = pdev->dev.platform_data;
  4109. }
  4110. if (pdata == NULL) {
  4111. dev_err(&pdev->dev, "%s:Platform data failed to populate\n",
  4112. __func__);
  4113. goto rtn;
  4114. }
  4115. sdm660_cdc = devm_kzalloc(&pdev->dev, sizeof(struct sdm660_cdc_priv),
  4116. GFP_KERNEL);
  4117. if (sdm660_cdc == NULL) {
  4118. ret = -ENOMEM;
  4119. goto rtn;
  4120. }
  4121. sdm660_cdc->dev = &pdev->dev;
  4122. ret = msm_anlg_cdc_init_supplies(sdm660_cdc, pdata);
  4123. if (ret) {
  4124. dev_err(&pdev->dev, "%s: Fail to enable Codec supplies\n",
  4125. __func__);
  4126. goto rtn;
  4127. }
  4128. ret = msm_anlg_cdc_enable_static_supplies(sdm660_cdc, pdata);
  4129. if (ret) {
  4130. dev_err(&pdev->dev,
  4131. "%s: Fail to enable Codec pre-reset supplies\n",
  4132. __func__);
  4133. goto rtn;
  4134. }
  4135. /* Allow supplies to be ready */
  4136. usleep_range(5, 6);
  4137. wcd9xxx_spmi_set_dev(pdev, 0);
  4138. wcd9xxx_spmi_set_dev(pdev, 1);
  4139. if (wcd9xxx_spmi_irq_init()) {
  4140. dev_err(&pdev->dev,
  4141. "%s: irq initialization failed\n", __func__);
  4142. } else {
  4143. dev_dbg(&pdev->dev,
  4144. "%s: irq initialization passed\n", __func__);
  4145. }
  4146. dev_set_drvdata(&pdev->dev, sdm660_cdc);
  4147. ret = snd_soc_register_codec(&pdev->dev,
  4148. &soc_codec_dev_sdm660_cdc,
  4149. msm_anlg_cdc_i2s_dai,
  4150. ARRAY_SIZE(msm_anlg_cdc_i2s_dai));
  4151. if (ret) {
  4152. dev_err(&pdev->dev,
  4153. "%s:snd_soc_register_codec failed with error %d\n",
  4154. __func__, ret);
  4155. goto err_supplies;
  4156. }
  4157. BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->notifier);
  4158. BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->notifier_mbhc);
  4159. sdm660_cdc->dig_plat_data.handle = (void *) sdm660_cdc;
  4160. sdm660_cdc->dig_plat_data.set_compander_mode = set_compander_mode;
  4161. sdm660_cdc->dig_plat_data.update_clkdiv = update_clkdiv;
  4162. sdm660_cdc->dig_plat_data.get_cdc_version = get_cdc_version;
  4163. sdm660_cdc->dig_plat_data.register_notifier =
  4164. msm_anlg_cdc_dig_register_notifier;
  4165. INIT_WORK(&sdm660_cdc->msm_anlg_add_child_devices_work,
  4166. msm_anlg_add_child_devices);
  4167. schedule_work(&sdm660_cdc->msm_anlg_add_child_devices_work);
  4168. return ret;
  4169. err_supplies:
  4170. msm_anlg_cdc_disable_supplies(sdm660_cdc, pdata);
  4171. rtn:
  4172. return ret;
  4173. }
  4174. static int msm_anlg_cdc_remove(struct platform_device *pdev)
  4175. {
  4176. struct sdm660_cdc_priv *sdm660_cdc = dev_get_drvdata(&pdev->dev);
  4177. struct sdm660_cdc_pdata *pdata = sdm660_cdc->dev->platform_data;
  4178. int count;
  4179. for (count = 0; count < sdm660_cdc->child_count &&
  4180. count < ANLG_CDC_CHILD_DEVICES_MAX; count++)
  4181. platform_device_unregister(
  4182. sdm660_cdc->pdev_child_devices[count]);
  4183. snd_soc_unregister_codec(&pdev->dev);
  4184. msm_anlg_cdc_disable_supplies(sdm660_cdc, pdata);
  4185. wcd9xxx_spmi_irq_exit();
  4186. devm_kfree(&pdev->dev, sdm660_cdc);
  4187. return 0;
  4188. }
  4189. static struct platform_driver msm_anlg_codec_driver = {
  4190. .driver = {
  4191. .owner = THIS_MODULE,
  4192. .name = DRV_NAME,
  4193. .of_match_table = of_match_ptr(sdm660_codec_of_match)
  4194. },
  4195. .probe = msm_anlg_cdc_probe,
  4196. .remove = msm_anlg_cdc_remove,
  4197. };
  4198. module_platform_driver(msm_anlg_codec_driver);
  4199. MODULE_DESCRIPTION("MSM Audio Analog codec driver");
  4200. MODULE_LICENSE("GPL v2");