wcd934x.c 191 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2019, Linaro Limited
  3. #include <linux/clk.h>
  4. #include <linux/clk-provider.h>
  5. #include <linux/interrupt.h>
  6. #include <linux/kernel.h>
  7. #include <linux/mfd/wcd934x/registers.h>
  8. #include <linux/mfd/wcd934x/wcd934x.h>
  9. #include <linux/module.h>
  10. #include <linux/mutex.h>
  11. #include <linux/of_clk.h>
  12. #include <linux/of.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/regmap.h>
  15. #include <linux/regulator/consumer.h>
  16. #include <linux/slab.h>
  17. #include <linux/slimbus.h>
  18. #include <sound/pcm_params.h>
  19. #include <sound/soc.h>
  20. #include <sound/soc-dapm.h>
  21. #include <sound/tlv.h>
  22. #include "wcd-clsh-v2.h"
  23. #include "wcd-mbhc-v2.h"
  24. #define WCD934X_RATES_MASK (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
  25. SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
  26. SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
  27. /* Fractional Rates */
  28. #define WCD934X_FRAC_RATES_MASK (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\
  29. SNDRV_PCM_RATE_176400)
  30. #define WCD934X_FORMATS_S16_S24_LE (SNDRV_PCM_FMTBIT_S16_LE | \
  31. SNDRV_PCM_FMTBIT_S24_LE)
  32. /* slave port water mark level
  33. * (0: 6bytes, 1: 9bytes, 2: 12 bytes, 3: 15 bytes)
  34. */
  35. #define SLAVE_PORT_WATER_MARK_6BYTES 0
  36. #define SLAVE_PORT_WATER_MARK_9BYTES 1
  37. #define SLAVE_PORT_WATER_MARK_12BYTES 2
  38. #define SLAVE_PORT_WATER_MARK_15BYTES 3
  39. #define SLAVE_PORT_WATER_MARK_SHIFT 1
  40. #define SLAVE_PORT_ENABLE 1
  41. #define SLAVE_PORT_DISABLE 0
  42. #define WCD934X_SLIM_WATER_MARK_VAL \
  43. ((SLAVE_PORT_WATER_MARK_12BYTES << SLAVE_PORT_WATER_MARK_SHIFT) | \
  44. (SLAVE_PORT_ENABLE))
  45. #define WCD934X_SLIM_NUM_PORT_REG 3
  46. #define WCD934X_SLIM_PGD_PORT_INT_TX_EN0 (WCD934X_SLIM_PGD_PORT_INT_EN0 + 2)
  47. #define WCD934X_SLIM_IRQ_OVERFLOW BIT(0)
  48. #define WCD934X_SLIM_IRQ_UNDERFLOW BIT(1)
  49. #define WCD934X_SLIM_IRQ_PORT_CLOSED BIT(2)
  50. #define WCD934X_MCLK_CLK_12P288MHZ 12288000
  51. #define WCD934X_MCLK_CLK_9P6MHZ 9600000
  52. /* Only valid for 9.6 MHz mclk */
  53. #define WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ 2400000
  54. #define WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ 4800000
  55. /* Only valid for 12.288 MHz mclk */
  56. #define WCD9XXX_DMIC_SAMPLE_RATE_4P096MHZ 4096000
  57. #define WCD934X_DMIC_CLK_DIV_2 0x0
  58. #define WCD934X_DMIC_CLK_DIV_3 0x1
  59. #define WCD934X_DMIC_CLK_DIV_4 0x2
  60. #define WCD934X_DMIC_CLK_DIV_6 0x3
  61. #define WCD934X_DMIC_CLK_DIV_8 0x4
  62. #define WCD934X_DMIC_CLK_DIV_16 0x5
  63. #define WCD934X_DMIC_CLK_DRIVE_DEFAULT 0x02
  64. #define TX_HPF_CUT_OFF_FREQ_MASK 0x60
  65. #define CF_MIN_3DB_4HZ 0x0
  66. #define CF_MIN_3DB_75HZ 0x1
  67. #define CF_MIN_3DB_150HZ 0x2
  68. #define WCD934X_RX_START 16
  69. #define WCD934X_NUM_INTERPOLATORS 9
  70. #define WCD934X_RX_PATH_CTL_OFFSET 20
  71. #define WCD934X_MAX_VALID_ADC_MUX 13
  72. #define WCD934X_INVALID_ADC_MUX 9
  73. #define WCD934X_SLIM_RX_CH(p) \
  74. {.port = p + WCD934X_RX_START, .shift = p,}
  75. #define WCD934X_SLIM_TX_CH(p) \
  76. {.port = p, .shift = p,}
  77. /* Feature masks to distinguish codec version */
  78. #define DSD_DISABLED_MASK 0
  79. #define SLNQ_DISABLED_MASK 1
  80. #define DSD_DISABLED BIT(DSD_DISABLED_MASK)
  81. #define SLNQ_DISABLED BIT(SLNQ_DISABLED_MASK)
  82. /* As fine version info cannot be retrieved before wcd probe.
  83. * Define three coarse versions for possible future use before wcd probe.
  84. */
  85. #define WCD_VERSION_WCD9340_1_0 0x400
  86. #define WCD_VERSION_WCD9341_1_0 0x410
  87. #define WCD_VERSION_WCD9340_1_1 0x401
  88. #define WCD_VERSION_WCD9341_1_1 0x411
  89. #define WCD934X_AMIC_PWR_LEVEL_LP 0
  90. #define WCD934X_AMIC_PWR_LEVEL_DEFAULT 1
  91. #define WCD934X_AMIC_PWR_LEVEL_HP 2
  92. #define WCD934X_AMIC_PWR_LEVEL_HYBRID 3
  93. #define WCD934X_AMIC_PWR_LVL_MASK 0x60
  94. #define WCD934X_AMIC_PWR_LVL_SHIFT 0x5
  95. #define WCD934X_DEC_PWR_LVL_MASK 0x06
  96. #define WCD934X_DEC_PWR_LVL_LP 0x02
  97. #define WCD934X_DEC_PWR_LVL_HP 0x04
  98. #define WCD934X_DEC_PWR_LVL_DF 0x00
  99. #define WCD934X_DEC_PWR_LVL_HYBRID WCD934X_DEC_PWR_LVL_DF
  100. #define WCD934X_DEF_MICBIAS_MV 1800
  101. #define WCD934X_MAX_MICBIAS_MV 2850
  102. #define WCD_IIR_FILTER_SIZE (sizeof(u32) * BAND_MAX)
  103. #define WCD_IIR_FILTER_CTL(xname, iidx, bidx) \
  104. { \
  105. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  106. .info = wcd934x_iir_filter_info, \
  107. .get = wcd934x_get_iir_band_audio_mixer, \
  108. .put = wcd934x_put_iir_band_audio_mixer, \
  109. .private_value = (unsigned long)&(struct wcd_iir_filter_ctl) { \
  110. .iir_idx = iidx, \
  111. .band_idx = bidx, \
  112. .bytes_ext = {.max = WCD_IIR_FILTER_SIZE, }, \
  113. } \
  114. }
  115. /* Z value defined in milliohm */
  116. #define WCD934X_ZDET_VAL_32 32000
  117. #define WCD934X_ZDET_VAL_400 400000
  118. #define WCD934X_ZDET_VAL_1200 1200000
  119. #define WCD934X_ZDET_VAL_100K 100000000
  120. /* Z floating defined in ohms */
  121. #define WCD934X_ZDET_FLOATING_IMPEDANCE 0x0FFFFFFE
  122. #define WCD934X_ZDET_NUM_MEASUREMENTS 900
  123. #define WCD934X_MBHC_GET_C1(c) ((c & 0xC000) >> 14)
  124. #define WCD934X_MBHC_GET_X1(x) (x & 0x3FFF)
  125. /* Z value compared in milliOhm */
  126. #define WCD934X_MBHC_IS_SECOND_RAMP_REQUIRED(z) ((z > 400000) || (z < 32000))
  127. #define WCD934X_MBHC_ZDET_CONST (86 * 16384)
  128. #define WCD934X_MBHC_MOISTURE_RREF R_24_KOHM
  129. #define WCD934X_MBHC_MAX_BUTTONS (8)
  130. #define WCD_MBHC_HS_V_MAX 1600
  131. #define WCD934X_INTERPOLATOR_PATH(id) \
  132. {"RX INT" #id "_1 MIX1 INP0", "RX0", "SLIM RX0"}, \
  133. {"RX INT" #id "_1 MIX1 INP0", "RX1", "SLIM RX1"}, \
  134. {"RX INT" #id "_1 MIX1 INP0", "RX2", "SLIM RX2"}, \
  135. {"RX INT" #id "_1 MIX1 INP0", "RX3", "SLIM RX3"}, \
  136. {"RX INT" #id "_1 MIX1 INP0", "RX4", "SLIM RX4"}, \
  137. {"RX INT" #id "_1 MIX1 INP0", "RX5", "SLIM RX5"}, \
  138. {"RX INT" #id "_1 MIX1 INP0", "RX6", "SLIM RX6"}, \
  139. {"RX INT" #id "_1 MIX1 INP0", "RX7", "SLIM RX7"}, \
  140. {"RX INT" #id "_1 MIX1 INP0", "IIR0", "IIR0"}, \
  141. {"RX INT" #id "_1 MIX1 INP0", "IIR1", "IIR1"}, \
  142. {"RX INT" #id "_1 MIX1 INP1", "RX0", "SLIM RX0"}, \
  143. {"RX INT" #id "_1 MIX1 INP1", "RX1", "SLIM RX1"}, \
  144. {"RX INT" #id "_1 MIX1 INP1", "RX2", "SLIM RX2"}, \
  145. {"RX INT" #id "_1 MIX1 INP1", "RX3", "SLIM RX3"}, \
  146. {"RX INT" #id "_1 MIX1 INP1", "RX4", "SLIM RX4"}, \
  147. {"RX INT" #id "_1 MIX1 INP1", "RX5", "SLIM RX5"}, \
  148. {"RX INT" #id "_1 MIX1 INP1", "RX6", "SLIM RX6"}, \
  149. {"RX INT" #id "_1 MIX1 INP1", "RX7", "SLIM RX7"}, \
  150. {"RX INT" #id "_1 MIX1 INP1", "IIR0", "IIR0"}, \
  151. {"RX INT" #id "_1 MIX1 INP1", "IIR1", "IIR1"}, \
  152. {"RX INT" #id "_1 MIX1 INP2", "RX0", "SLIM RX0"}, \
  153. {"RX INT" #id "_1 MIX1 INP2", "RX1", "SLIM RX1"}, \
  154. {"RX INT" #id "_1 MIX1 INP2", "RX2", "SLIM RX2"}, \
  155. {"RX INT" #id "_1 MIX1 INP2", "RX3", "SLIM RX3"}, \
  156. {"RX INT" #id "_1 MIX1 INP2", "RX4", "SLIM RX4"}, \
  157. {"RX INT" #id "_1 MIX1 INP2", "RX5", "SLIM RX5"}, \
  158. {"RX INT" #id "_1 MIX1 INP2", "RX6", "SLIM RX6"}, \
  159. {"RX INT" #id "_1 MIX1 INP2", "RX7", "SLIM RX7"}, \
  160. {"RX INT" #id "_1 MIX1 INP2", "IIR0", "IIR0"}, \
  161. {"RX INT" #id "_1 MIX1 INP2", "IIR1", "IIR1"}, \
  162. {"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP0"}, \
  163. {"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP1"}, \
  164. {"RX INT" #id "_1 MIX1", NULL, "RX INT" #id "_1 MIX1 INP2"}, \
  165. {"RX INT" #id "_2 MUX", "RX0", "SLIM RX0"}, \
  166. {"RX INT" #id "_2 MUX", "RX1", "SLIM RX1"}, \
  167. {"RX INT" #id "_2 MUX", "RX2", "SLIM RX2"}, \
  168. {"RX INT" #id "_2 MUX", "RX3", "SLIM RX3"}, \
  169. {"RX INT" #id "_2 MUX", "RX4", "SLIM RX4"}, \
  170. {"RX INT" #id "_2 MUX", "RX5", "SLIM RX5"}, \
  171. {"RX INT" #id "_2 MUX", "RX6", "SLIM RX6"}, \
  172. {"RX INT" #id "_2 MUX", "RX7", "SLIM RX7"}, \
  173. {"RX INT" #id "_2 MUX", NULL, "INT" #id "_CLK"}, \
  174. {"RX INT" #id "_2 MUX", NULL, "DSMDEM" #id "_CLK"}, \
  175. {"RX INT" #id "_2 INTERP", NULL, "RX INT" #id "_2 MUX"}, \
  176. {"RX INT" #id " SEC MIX", NULL, "RX INT" #id "_2 INTERP"}, \
  177. {"RX INT" #id "_1 INTERP", NULL, "RX INT" #id "_1 MIX1"}, \
  178. {"RX INT" #id "_1 INTERP", NULL, "INT" #id "_CLK"}, \
  179. {"RX INT" #id "_1 INTERP", NULL, "DSMDEM" #id "_CLK"}, \
  180. {"RX INT" #id " SEC MIX", NULL, "RX INT" #id "_1 INTERP"}
  181. #define WCD934X_INTERPOLATOR_MIX2(id) \
  182. {"RX INT" #id " MIX2", NULL, "RX INT" #id " SEC MIX"}, \
  183. {"RX INT" #id " MIX2", NULL, "RX INT" #id " MIX2 INP"}
  184. #define WCD934X_SLIM_RX_AIF_PATH(id) \
  185. {"SLIM RX"#id" MUX", "AIF1_PB", "AIF1 PB"}, \
  186. {"SLIM RX"#id" MUX", "AIF2_PB", "AIF2 PB"}, \
  187. {"SLIM RX"#id" MUX", "AIF3_PB", "AIF3 PB"}, \
  188. {"SLIM RX"#id" MUX", "AIF4_PB", "AIF4 PB"}, \
  189. {"SLIM RX"#id, NULL, "SLIM RX"#id" MUX"}
  190. #define WCD934X_ADC_MUX(id) \
  191. {"ADC MUX" #id, "DMIC", "DMIC MUX" #id }, \
  192. {"ADC MUX" #id, "AMIC", "AMIC MUX" #id }, \
  193. {"DMIC MUX" #id, "DMIC0", "DMIC0"}, \
  194. {"DMIC MUX" #id, "DMIC1", "DMIC1"}, \
  195. {"DMIC MUX" #id, "DMIC2", "DMIC2"}, \
  196. {"DMIC MUX" #id, "DMIC3", "DMIC3"}, \
  197. {"DMIC MUX" #id, "DMIC4", "DMIC4"}, \
  198. {"DMIC MUX" #id, "DMIC5", "DMIC5"}, \
  199. {"AMIC MUX" #id, "ADC1", "ADC1"}, \
  200. {"AMIC MUX" #id, "ADC2", "ADC2"}, \
  201. {"AMIC MUX" #id, "ADC3", "ADC3"}, \
  202. {"AMIC MUX" #id, "ADC4", "ADC4"}
  203. #define WCD934X_IIR_INP_MUX(id) \
  204. {"IIR" #id, NULL, "IIR" #id " INP0 MUX"}, \
  205. {"IIR" #id " INP0 MUX", "DEC0", "ADC MUX0"}, \
  206. {"IIR" #id " INP0 MUX", "DEC1", "ADC MUX1"}, \
  207. {"IIR" #id " INP0 MUX", "DEC2", "ADC MUX2"}, \
  208. {"IIR" #id " INP0 MUX", "DEC3", "ADC MUX3"}, \
  209. {"IIR" #id " INP0 MUX", "DEC4", "ADC MUX4"}, \
  210. {"IIR" #id " INP0 MUX", "DEC5", "ADC MUX5"}, \
  211. {"IIR" #id " INP0 MUX", "DEC6", "ADC MUX6"}, \
  212. {"IIR" #id " INP0 MUX", "DEC7", "ADC MUX7"}, \
  213. {"IIR" #id " INP0 MUX", "DEC8", "ADC MUX8"}, \
  214. {"IIR" #id " INP0 MUX", "RX0", "SLIM RX0"}, \
  215. {"IIR" #id " INP0 MUX", "RX1", "SLIM RX1"}, \
  216. {"IIR" #id " INP0 MUX", "RX2", "SLIM RX2"}, \
  217. {"IIR" #id " INP0 MUX", "RX3", "SLIM RX3"}, \
  218. {"IIR" #id " INP0 MUX", "RX4", "SLIM RX4"}, \
  219. {"IIR" #id " INP0 MUX", "RX5", "SLIM RX5"}, \
  220. {"IIR" #id " INP0 MUX", "RX6", "SLIM RX6"}, \
  221. {"IIR" #id " INP0 MUX", "RX7", "SLIM RX7"}, \
  222. {"IIR" #id, NULL, "IIR" #id " INP1 MUX"}, \
  223. {"IIR" #id " INP1 MUX", "DEC0", "ADC MUX0"}, \
  224. {"IIR" #id " INP1 MUX", "DEC1", "ADC MUX1"}, \
  225. {"IIR" #id " INP1 MUX", "DEC2", "ADC MUX2"}, \
  226. {"IIR" #id " INP1 MUX", "DEC3", "ADC MUX3"}, \
  227. {"IIR" #id " INP1 MUX", "DEC4", "ADC MUX4"}, \
  228. {"IIR" #id " INP1 MUX", "DEC5", "ADC MUX5"}, \
  229. {"IIR" #id " INP1 MUX", "DEC6", "ADC MUX6"}, \
  230. {"IIR" #id " INP1 MUX", "DEC7", "ADC MUX7"}, \
  231. {"IIR" #id " INP1 MUX", "DEC8", "ADC MUX8"}, \
  232. {"IIR" #id " INP1 MUX", "RX0", "SLIM RX0"}, \
  233. {"IIR" #id " INP1 MUX", "RX1", "SLIM RX1"}, \
  234. {"IIR" #id " INP1 MUX", "RX2", "SLIM RX2"}, \
  235. {"IIR" #id " INP1 MUX", "RX3", "SLIM RX3"}, \
  236. {"IIR" #id " INP1 MUX", "RX4", "SLIM RX4"}, \
  237. {"IIR" #id " INP1 MUX", "RX5", "SLIM RX5"}, \
  238. {"IIR" #id " INP1 MUX", "RX6", "SLIM RX6"}, \
  239. {"IIR" #id " INP1 MUX", "RX7", "SLIM RX7"}, \
  240. {"IIR" #id, NULL, "IIR" #id " INP2 MUX"}, \
  241. {"IIR" #id " INP2 MUX", "DEC0", "ADC MUX0"}, \
  242. {"IIR" #id " INP2 MUX", "DEC1", "ADC MUX1"}, \
  243. {"IIR" #id " INP2 MUX", "DEC2", "ADC MUX2"}, \
  244. {"IIR" #id " INP2 MUX", "DEC3", "ADC MUX3"}, \
  245. {"IIR" #id " INP2 MUX", "DEC4", "ADC MUX4"}, \
  246. {"IIR" #id " INP2 MUX", "DEC5", "ADC MUX5"}, \
  247. {"IIR" #id " INP2 MUX", "DEC6", "ADC MUX6"}, \
  248. {"IIR" #id " INP2 MUX", "DEC7", "ADC MUX7"}, \
  249. {"IIR" #id " INP2 MUX", "DEC8", "ADC MUX8"}, \
  250. {"IIR" #id " INP2 MUX", "RX0", "SLIM RX0"}, \
  251. {"IIR" #id " INP2 MUX", "RX1", "SLIM RX1"}, \
  252. {"IIR" #id " INP2 MUX", "RX2", "SLIM RX2"}, \
  253. {"IIR" #id " INP2 MUX", "RX3", "SLIM RX3"}, \
  254. {"IIR" #id " INP2 MUX", "RX4", "SLIM RX4"}, \
  255. {"IIR" #id " INP2 MUX", "RX5", "SLIM RX5"}, \
  256. {"IIR" #id " INP2 MUX", "RX6", "SLIM RX6"}, \
  257. {"IIR" #id " INP2 MUX", "RX7", "SLIM RX7"}, \
  258. {"IIR" #id, NULL, "IIR" #id " INP3 MUX"}, \
  259. {"IIR" #id " INP3 MUX", "DEC0", "ADC MUX0"}, \
  260. {"IIR" #id " INP3 MUX", "DEC1", "ADC MUX1"}, \
  261. {"IIR" #id " INP3 MUX", "DEC2", "ADC MUX2"}, \
  262. {"IIR" #id " INP3 MUX", "DEC3", "ADC MUX3"}, \
  263. {"IIR" #id " INP3 MUX", "DEC4", "ADC MUX4"}, \
  264. {"IIR" #id " INP3 MUX", "DEC5", "ADC MUX5"}, \
  265. {"IIR" #id " INP3 MUX", "DEC6", "ADC MUX6"}, \
  266. {"IIR" #id " INP3 MUX", "DEC7", "ADC MUX7"}, \
  267. {"IIR" #id " INP3 MUX", "DEC8", "ADC MUX8"}, \
  268. {"IIR" #id " INP3 MUX", "RX0", "SLIM RX0"}, \
  269. {"IIR" #id " INP3 MUX", "RX1", "SLIM RX1"}, \
  270. {"IIR" #id " INP3 MUX", "RX2", "SLIM RX2"}, \
  271. {"IIR" #id " INP3 MUX", "RX3", "SLIM RX3"}, \
  272. {"IIR" #id " INP3 MUX", "RX4", "SLIM RX4"}, \
  273. {"IIR" #id " INP3 MUX", "RX5", "SLIM RX5"}, \
  274. {"IIR" #id " INP3 MUX", "RX6", "SLIM RX6"}, \
  275. {"IIR" #id " INP3 MUX", "RX7", "SLIM RX7"}
  276. #define WCD934X_SLIM_TX_AIF_PATH(id) \
  277. {"AIF1_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id }, \
  278. {"AIF2_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id }, \
  279. {"AIF3_CAP Mixer", "SLIM TX" #id, "SLIM TX" #id }, \
  280. {"SLIM TX" #id, NULL, "CDC_IF TX" #id " MUX"}
  281. #define WCD934X_MAX_MICBIAS MIC_BIAS_4
  282. enum {
  283. SIDO_SOURCE_INTERNAL,
  284. SIDO_SOURCE_RCO_BG,
  285. };
  286. enum {
  287. INTERP_EAR = 0,
  288. INTERP_HPHL,
  289. INTERP_HPHR,
  290. INTERP_LO1,
  291. INTERP_LO2,
  292. INTERP_LO3_NA, /* LO3 not avalible in Tavil */
  293. INTERP_LO4_NA,
  294. INTERP_SPKR1, /*INT7 WSA Speakers via soundwire */
  295. INTERP_SPKR2, /*INT8 WSA Speakers via soundwire */
  296. INTERP_MAX,
  297. };
  298. enum {
  299. WCD934X_RX0 = 0,
  300. WCD934X_RX1,
  301. WCD934X_RX2,
  302. WCD934X_RX3,
  303. WCD934X_RX4,
  304. WCD934X_RX5,
  305. WCD934X_RX6,
  306. WCD934X_RX7,
  307. WCD934X_RX8,
  308. WCD934X_RX9,
  309. WCD934X_RX10,
  310. WCD934X_RX11,
  311. WCD934X_RX12,
  312. WCD934X_RX_MAX,
  313. };
  314. enum {
  315. WCD934X_TX0 = 0,
  316. WCD934X_TX1,
  317. WCD934X_TX2,
  318. WCD934X_TX3,
  319. WCD934X_TX4,
  320. WCD934X_TX5,
  321. WCD934X_TX6,
  322. WCD934X_TX7,
  323. WCD934X_TX8,
  324. WCD934X_TX9,
  325. WCD934X_TX10,
  326. WCD934X_TX11,
  327. WCD934X_TX12,
  328. WCD934X_TX13,
  329. WCD934X_TX14,
  330. WCD934X_TX15,
  331. WCD934X_TX_MAX,
  332. };
  333. struct wcd934x_slim_ch {
  334. u32 ch_num;
  335. u16 port;
  336. u16 shift;
  337. struct list_head list;
  338. };
  339. static const struct wcd934x_slim_ch wcd934x_tx_chs[WCD934X_TX_MAX] = {
  340. WCD934X_SLIM_TX_CH(0),
  341. WCD934X_SLIM_TX_CH(1),
  342. WCD934X_SLIM_TX_CH(2),
  343. WCD934X_SLIM_TX_CH(3),
  344. WCD934X_SLIM_TX_CH(4),
  345. WCD934X_SLIM_TX_CH(5),
  346. WCD934X_SLIM_TX_CH(6),
  347. WCD934X_SLIM_TX_CH(7),
  348. WCD934X_SLIM_TX_CH(8),
  349. WCD934X_SLIM_TX_CH(9),
  350. WCD934X_SLIM_TX_CH(10),
  351. WCD934X_SLIM_TX_CH(11),
  352. WCD934X_SLIM_TX_CH(12),
  353. WCD934X_SLIM_TX_CH(13),
  354. WCD934X_SLIM_TX_CH(14),
  355. WCD934X_SLIM_TX_CH(15),
  356. };
  357. static const struct wcd934x_slim_ch wcd934x_rx_chs[WCD934X_RX_MAX] = {
  358. WCD934X_SLIM_RX_CH(0), /* 16 */
  359. WCD934X_SLIM_RX_CH(1), /* 17 */
  360. WCD934X_SLIM_RX_CH(2),
  361. WCD934X_SLIM_RX_CH(3),
  362. WCD934X_SLIM_RX_CH(4),
  363. WCD934X_SLIM_RX_CH(5),
  364. WCD934X_SLIM_RX_CH(6),
  365. WCD934X_SLIM_RX_CH(7),
  366. WCD934X_SLIM_RX_CH(8),
  367. WCD934X_SLIM_RX_CH(9),
  368. WCD934X_SLIM_RX_CH(10),
  369. WCD934X_SLIM_RX_CH(11),
  370. WCD934X_SLIM_RX_CH(12),
  371. };
  372. /* Codec supports 2 IIR filters */
  373. enum {
  374. IIR0 = 0,
  375. IIR1,
  376. IIR_MAX,
  377. };
  378. /* Each IIR has 5 Filter Stages */
  379. enum {
  380. BAND1 = 0,
  381. BAND2,
  382. BAND3,
  383. BAND4,
  384. BAND5,
  385. BAND_MAX,
  386. };
  387. enum {
  388. COMPANDER_1, /* HPH_L */
  389. COMPANDER_2, /* HPH_R */
  390. COMPANDER_3, /* LO1_DIFF */
  391. COMPANDER_4, /* LO2_DIFF */
  392. COMPANDER_5, /* LO3_SE - not used in Tavil */
  393. COMPANDER_6, /* LO4_SE - not used in Tavil */
  394. COMPANDER_7, /* SWR SPK CH1 */
  395. COMPANDER_8, /* SWR SPK CH2 */
  396. COMPANDER_MAX,
  397. };
  398. enum {
  399. AIF1_PB = 0,
  400. AIF1_CAP,
  401. AIF2_PB,
  402. AIF2_CAP,
  403. AIF3_PB,
  404. AIF3_CAP,
  405. AIF4_PB,
  406. AIF4_VIFEED,
  407. AIF4_MAD_TX,
  408. NUM_CODEC_DAIS,
  409. };
  410. enum {
  411. INTn_1_INP_SEL_ZERO = 0,
  412. INTn_1_INP_SEL_DEC0,
  413. INTn_1_INP_SEL_DEC1,
  414. INTn_1_INP_SEL_IIR0,
  415. INTn_1_INP_SEL_IIR1,
  416. INTn_1_INP_SEL_RX0,
  417. INTn_1_INP_SEL_RX1,
  418. INTn_1_INP_SEL_RX2,
  419. INTn_1_INP_SEL_RX3,
  420. INTn_1_INP_SEL_RX4,
  421. INTn_1_INP_SEL_RX5,
  422. INTn_1_INP_SEL_RX6,
  423. INTn_1_INP_SEL_RX7,
  424. };
  425. enum {
  426. INTn_2_INP_SEL_ZERO = 0,
  427. INTn_2_INP_SEL_RX0,
  428. INTn_2_INP_SEL_RX1,
  429. INTn_2_INP_SEL_RX2,
  430. INTn_2_INP_SEL_RX3,
  431. INTn_2_INP_SEL_RX4,
  432. INTn_2_INP_SEL_RX5,
  433. INTn_2_INP_SEL_RX6,
  434. INTn_2_INP_SEL_RX7,
  435. INTn_2_INP_SEL_PROXIMITY,
  436. };
  437. enum {
  438. INTERP_MAIN_PATH,
  439. INTERP_MIX_PATH,
  440. };
  441. struct interp_sample_rate {
  442. int sample_rate;
  443. int rate_val;
  444. };
  445. static struct interp_sample_rate sr_val_tbl[] = {
  446. {8000, 0x0},
  447. {16000, 0x1},
  448. {32000, 0x3},
  449. {48000, 0x4},
  450. {96000, 0x5},
  451. {192000, 0x6},
  452. {384000, 0x7},
  453. {44100, 0x9},
  454. {88200, 0xA},
  455. {176400, 0xB},
  456. {352800, 0xC},
  457. };
  458. struct wcd934x_mbhc_zdet_param {
  459. u16 ldo_ctl;
  460. u16 noff;
  461. u16 nshift;
  462. u16 btn5;
  463. u16 btn6;
  464. u16 btn7;
  465. };
  466. struct wcd_slim_codec_dai_data {
  467. struct list_head slim_ch_list;
  468. struct slim_stream_config sconfig;
  469. struct slim_stream_runtime *sruntime;
  470. };
  471. static const struct regmap_range_cfg wcd934x_ifc_ranges[] = {
  472. {
  473. .name = "WCD9335-IFC-DEV",
  474. .range_min = 0x0,
  475. .range_max = 0xffff,
  476. .selector_reg = 0x800,
  477. .selector_mask = 0xfff,
  478. .selector_shift = 0,
  479. .window_start = 0x800,
  480. .window_len = 0x400,
  481. },
  482. };
  483. static struct regmap_config wcd934x_ifc_regmap_config = {
  484. .reg_bits = 16,
  485. .val_bits = 8,
  486. .max_register = 0xffff,
  487. .ranges = wcd934x_ifc_ranges,
  488. .num_ranges = ARRAY_SIZE(wcd934x_ifc_ranges),
  489. };
  490. struct wcd934x_codec {
  491. struct device *dev;
  492. struct clk_hw hw;
  493. struct clk *extclk;
  494. struct regmap *regmap;
  495. struct regmap *if_regmap;
  496. struct slim_device *sdev;
  497. struct slim_device *sidev;
  498. struct wcd_clsh_ctrl *clsh_ctrl;
  499. struct snd_soc_component *component;
  500. struct wcd934x_slim_ch rx_chs[WCD934X_RX_MAX];
  501. struct wcd934x_slim_ch tx_chs[WCD934X_TX_MAX];
  502. struct wcd_slim_codec_dai_data dai[NUM_CODEC_DAIS];
  503. int rate;
  504. u32 version;
  505. u32 hph_mode;
  506. int num_rx_port;
  507. int num_tx_port;
  508. u32 tx_port_value[WCD934X_TX_MAX];
  509. u32 rx_port_value[WCD934X_RX_MAX];
  510. int sido_input_src;
  511. int dmic_0_1_clk_cnt;
  512. int dmic_2_3_clk_cnt;
  513. int dmic_4_5_clk_cnt;
  514. int dmic_sample_rate;
  515. int comp_enabled[COMPANDER_MAX];
  516. int sysclk_users;
  517. struct mutex sysclk_mutex;
  518. /* mbhc module */
  519. struct wcd_mbhc *mbhc;
  520. struct wcd_mbhc_config mbhc_cfg;
  521. struct wcd_mbhc_intr intr_ids;
  522. bool mbhc_started;
  523. struct mutex micb_lock;
  524. u32 micb_ref[WCD934X_MAX_MICBIAS];
  525. u32 pullup_ref[WCD934X_MAX_MICBIAS];
  526. u32 micb1_mv;
  527. u32 micb2_mv;
  528. u32 micb3_mv;
  529. u32 micb4_mv;
  530. };
  531. #define to_wcd934x_codec(_hw) container_of(_hw, struct wcd934x_codec, hw)
  532. struct wcd_iir_filter_ctl {
  533. unsigned int iir_idx;
  534. unsigned int band_idx;
  535. struct soc_bytes_ext bytes_ext;
  536. };
  537. static const DECLARE_TLV_DB_SCALE(digital_gain, -8400, 100, -8400);
  538. static const DECLARE_TLV_DB_SCALE(line_gain, 0, 7, 1);
  539. static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1);
  540. static const DECLARE_TLV_DB_SCALE(ear_pa_gain, 0, 150, 0);
  541. /* Cutoff frequency for high pass filter */
  542. static const char * const cf_text[] = {
  543. "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ"
  544. };
  545. static const char * const rx_cf_text[] = {
  546. "CF_NEG_3DB_4HZ", "CF_NEG_3DB_75HZ", "CF_NEG_3DB_150HZ",
  547. "CF_NEG_3DB_0P48HZ"
  548. };
  549. static const char * const rx_hph_mode_mux_text[] = {
  550. "Class H Invalid", "Class-H Hi-Fi", "Class-H Low Power", "Class-AB",
  551. "Class-H Hi-Fi Low Power"
  552. };
  553. static const char *const slim_rx_mux_text[] = {
  554. "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB",
  555. };
  556. static const char * const rx_int0_7_mix_mux_text[] = {
  557. "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5",
  558. "RX6", "RX7", "PROXIMITY"
  559. };
  560. static const char * const rx_int_mix_mux_text[] = {
  561. "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5",
  562. "RX6", "RX7"
  563. };
  564. static const char * const rx_prim_mix_text[] = {
  565. "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2",
  566. "RX3", "RX4", "RX5", "RX6", "RX7"
  567. };
  568. static const char * const rx_sidetone_mix_text[] = {
  569. "ZERO", "SRC0", "SRC1", "SRC_SUM"
  570. };
  571. static const char * const iir_inp_mux_text[] = {
  572. "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4", "DEC5", "DEC6",
  573. "DEC7", "DEC8", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5", "RX6", "RX7"
  574. };
  575. static const char * const rx_int_dem_inp_mux_text[] = {
  576. "NORMAL_DSM_OUT", "CLSH_DSM_OUT",
  577. };
  578. static const char * const rx_int0_1_interp_mux_text[] = {
  579. "ZERO", "RX INT0_1 MIX1",
  580. };
  581. static const char * const rx_int1_1_interp_mux_text[] = {
  582. "ZERO", "RX INT1_1 MIX1",
  583. };
  584. static const char * const rx_int2_1_interp_mux_text[] = {
  585. "ZERO", "RX INT2_1 MIX1",
  586. };
  587. static const char * const rx_int3_1_interp_mux_text[] = {
  588. "ZERO", "RX INT3_1 MIX1",
  589. };
  590. static const char * const rx_int4_1_interp_mux_text[] = {
  591. "ZERO", "RX INT4_1 MIX1",
  592. };
  593. static const char * const rx_int7_1_interp_mux_text[] = {
  594. "ZERO", "RX INT7_1 MIX1",
  595. };
  596. static const char * const rx_int8_1_interp_mux_text[] = {
  597. "ZERO", "RX INT8_1 MIX1",
  598. };
  599. static const char * const rx_int0_2_interp_mux_text[] = {
  600. "ZERO", "RX INT0_2 MUX",
  601. };
  602. static const char * const rx_int1_2_interp_mux_text[] = {
  603. "ZERO", "RX INT1_2 MUX",
  604. };
  605. static const char * const rx_int2_2_interp_mux_text[] = {
  606. "ZERO", "RX INT2_2 MUX",
  607. };
  608. static const char * const rx_int3_2_interp_mux_text[] = {
  609. "ZERO", "RX INT3_2 MUX",
  610. };
  611. static const char * const rx_int4_2_interp_mux_text[] = {
  612. "ZERO", "RX INT4_2 MUX",
  613. };
  614. static const char * const rx_int7_2_interp_mux_text[] = {
  615. "ZERO", "RX INT7_2 MUX",
  616. };
  617. static const char * const rx_int8_2_interp_mux_text[] = {
  618. "ZERO", "RX INT8_2 MUX",
  619. };
  620. static const char * const dmic_mux_text[] = {
  621. "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3", "DMIC4", "DMIC5"
  622. };
  623. static const char * const amic_mux_text[] = {
  624. "ZERO", "ADC1", "ADC2", "ADC3", "ADC4"
  625. };
  626. static const char * const amic4_5_sel_text[] = {
  627. "AMIC4", "AMIC5"
  628. };
  629. static const char * const adc_mux_text[] = {
  630. "DMIC", "AMIC", "ANC_FB_TUNE1", "ANC_FB_TUNE2"
  631. };
  632. static const char * const cdc_if_tx0_mux_text[] = {
  633. "ZERO", "RX_MIX_TX0", "DEC0", "DEC0_192"
  634. };
  635. static const char * const cdc_if_tx1_mux_text[] = {
  636. "ZERO", "RX_MIX_TX1", "DEC1", "DEC1_192"
  637. };
  638. static const char * const cdc_if_tx2_mux_text[] = {
  639. "ZERO", "RX_MIX_TX2", "DEC2", "DEC2_192"
  640. };
  641. static const char * const cdc_if_tx3_mux_text[] = {
  642. "ZERO", "RX_MIX_TX3", "DEC3", "DEC3_192"
  643. };
  644. static const char * const cdc_if_tx4_mux_text[] = {
  645. "ZERO", "RX_MIX_TX4", "DEC4", "DEC4_192"
  646. };
  647. static const char * const cdc_if_tx5_mux_text[] = {
  648. "ZERO", "RX_MIX_TX5", "DEC5", "DEC5_192"
  649. };
  650. static const char * const cdc_if_tx6_mux_text[] = {
  651. "ZERO", "RX_MIX_TX6", "DEC6", "DEC6_192"
  652. };
  653. static const char * const cdc_if_tx7_mux_text[] = {
  654. "ZERO", "RX_MIX_TX7", "DEC7", "DEC7_192"
  655. };
  656. static const char * const cdc_if_tx8_mux_text[] = {
  657. "ZERO", "RX_MIX_TX8", "DEC8", "DEC8_192"
  658. };
  659. static const char * const cdc_if_tx9_mux_text[] = {
  660. "ZERO", "DEC7", "DEC7_192"
  661. };
  662. static const char * const cdc_if_tx10_mux_text[] = {
  663. "ZERO", "DEC6", "DEC6_192"
  664. };
  665. static const char * const cdc_if_tx11_mux_text[] = {
  666. "DEC_0_5", "DEC_9_12", "MAD_AUDIO", "MAD_BRDCST"
  667. };
  668. static const char * const cdc_if_tx11_inp1_mux_text[] = {
  669. "ZERO", "DEC0", "DEC1", "DEC2", "DEC3", "DEC4",
  670. "DEC5", "RX_MIX_TX5", "DEC9_10", "DEC11_12"
  671. };
  672. static const char * const cdc_if_tx13_mux_text[] = {
  673. "CDC_DEC_5", "MAD_BRDCST"
  674. };
  675. static const char * const cdc_if_tx13_inp1_mux_text[] = {
  676. "ZERO", "DEC5", "DEC5_192"
  677. };
  678. static const struct soc_enum cf_dec0_enum =
  679. SOC_ENUM_SINGLE(WCD934X_CDC_TX0_TX_PATH_CFG0, 5, 3, cf_text);
  680. static const struct soc_enum cf_dec1_enum =
  681. SOC_ENUM_SINGLE(WCD934X_CDC_TX1_TX_PATH_CFG0, 5, 3, cf_text);
  682. static const struct soc_enum cf_dec2_enum =
  683. SOC_ENUM_SINGLE(WCD934X_CDC_TX2_TX_PATH_CFG0, 5, 3, cf_text);
  684. static const struct soc_enum cf_dec3_enum =
  685. SOC_ENUM_SINGLE(WCD934X_CDC_TX3_TX_PATH_CFG0, 5, 3, cf_text);
  686. static const struct soc_enum cf_dec4_enum =
  687. SOC_ENUM_SINGLE(WCD934X_CDC_TX4_TX_PATH_CFG0, 5, 3, cf_text);
  688. static const struct soc_enum cf_dec5_enum =
  689. SOC_ENUM_SINGLE(WCD934X_CDC_TX5_TX_PATH_CFG0, 5, 3, cf_text);
  690. static const struct soc_enum cf_dec6_enum =
  691. SOC_ENUM_SINGLE(WCD934X_CDC_TX6_TX_PATH_CFG0, 5, 3, cf_text);
  692. static const struct soc_enum cf_dec7_enum =
  693. SOC_ENUM_SINGLE(WCD934X_CDC_TX7_TX_PATH_CFG0, 5, 3, cf_text);
  694. static const struct soc_enum cf_dec8_enum =
  695. SOC_ENUM_SINGLE(WCD934X_CDC_TX8_TX_PATH_CFG0, 5, 3, cf_text);
  696. static const struct soc_enum cf_int0_1_enum =
  697. SOC_ENUM_SINGLE(WCD934X_CDC_RX0_RX_PATH_CFG2, 0, 4, rx_cf_text);
  698. static SOC_ENUM_SINGLE_DECL(cf_int0_2_enum, WCD934X_CDC_RX0_RX_PATH_MIX_CFG, 2,
  699. rx_cf_text);
  700. static const struct soc_enum cf_int1_1_enum =
  701. SOC_ENUM_SINGLE(WCD934X_CDC_RX1_RX_PATH_CFG2, 0, 4, rx_cf_text);
  702. static SOC_ENUM_SINGLE_DECL(cf_int1_2_enum, WCD934X_CDC_RX1_RX_PATH_MIX_CFG, 2,
  703. rx_cf_text);
  704. static const struct soc_enum cf_int2_1_enum =
  705. SOC_ENUM_SINGLE(WCD934X_CDC_RX2_RX_PATH_CFG2, 0, 4, rx_cf_text);
  706. static SOC_ENUM_SINGLE_DECL(cf_int2_2_enum, WCD934X_CDC_RX2_RX_PATH_MIX_CFG, 2,
  707. rx_cf_text);
  708. static const struct soc_enum cf_int3_1_enum =
  709. SOC_ENUM_SINGLE(WCD934X_CDC_RX3_RX_PATH_CFG2, 0, 4, rx_cf_text);
  710. static SOC_ENUM_SINGLE_DECL(cf_int3_2_enum, WCD934X_CDC_RX3_RX_PATH_MIX_CFG, 2,
  711. rx_cf_text);
  712. static const struct soc_enum cf_int4_1_enum =
  713. SOC_ENUM_SINGLE(WCD934X_CDC_RX4_RX_PATH_CFG2, 0, 4, rx_cf_text);
  714. static SOC_ENUM_SINGLE_DECL(cf_int4_2_enum, WCD934X_CDC_RX4_RX_PATH_MIX_CFG, 2,
  715. rx_cf_text);
  716. static const struct soc_enum cf_int7_1_enum =
  717. SOC_ENUM_SINGLE(WCD934X_CDC_RX7_RX_PATH_CFG2, 0, 4, rx_cf_text);
  718. static SOC_ENUM_SINGLE_DECL(cf_int7_2_enum, WCD934X_CDC_RX7_RX_PATH_MIX_CFG, 2,
  719. rx_cf_text);
  720. static const struct soc_enum cf_int8_1_enum =
  721. SOC_ENUM_SINGLE(WCD934X_CDC_RX8_RX_PATH_CFG2, 0, 4, rx_cf_text);
  722. static SOC_ENUM_SINGLE_DECL(cf_int8_2_enum, WCD934X_CDC_RX8_RX_PATH_MIX_CFG, 2,
  723. rx_cf_text);
  724. static const struct soc_enum rx_hph_mode_mux_enum =
  725. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_hph_mode_mux_text),
  726. rx_hph_mode_mux_text);
  727. static const struct soc_enum slim_rx_mux_enum =
  728. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim_rx_mux_text), slim_rx_mux_text);
  729. static const struct soc_enum rx_int0_2_mux_chain_enum =
  730. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1, 0, 10,
  731. rx_int0_7_mix_mux_text);
  732. static const struct soc_enum rx_int1_2_mux_chain_enum =
  733. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1, 0, 9,
  734. rx_int_mix_mux_text);
  735. static const struct soc_enum rx_int2_2_mux_chain_enum =
  736. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1, 0, 9,
  737. rx_int_mix_mux_text);
  738. static const struct soc_enum rx_int3_2_mux_chain_enum =
  739. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1, 0, 9,
  740. rx_int_mix_mux_text);
  741. static const struct soc_enum rx_int4_2_mux_chain_enum =
  742. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1, 0, 9,
  743. rx_int_mix_mux_text);
  744. static const struct soc_enum rx_int7_2_mux_chain_enum =
  745. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1, 0, 10,
  746. rx_int0_7_mix_mux_text);
  747. static const struct soc_enum rx_int8_2_mux_chain_enum =
  748. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1, 0, 9,
  749. rx_int_mix_mux_text);
  750. static const struct soc_enum rx_int0_1_mix_inp0_chain_enum =
  751. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0, 0, 13,
  752. rx_prim_mix_text);
  753. static const struct soc_enum rx_int0_1_mix_inp1_chain_enum =
  754. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG0, 4, 13,
  755. rx_prim_mix_text);
  756. static const struct soc_enum rx_int0_1_mix_inp2_chain_enum =
  757. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT0_CFG1, 4, 13,
  758. rx_prim_mix_text);
  759. static const struct soc_enum rx_int1_1_mix_inp0_chain_enum =
  760. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0, 0, 13,
  761. rx_prim_mix_text);
  762. static const struct soc_enum rx_int1_1_mix_inp1_chain_enum =
  763. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG0, 4, 13,
  764. rx_prim_mix_text);
  765. static const struct soc_enum rx_int1_1_mix_inp2_chain_enum =
  766. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT1_CFG1, 4, 13,
  767. rx_prim_mix_text);
  768. static const struct soc_enum rx_int2_1_mix_inp0_chain_enum =
  769. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0, 0, 13,
  770. rx_prim_mix_text);
  771. static const struct soc_enum rx_int2_1_mix_inp1_chain_enum =
  772. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG0, 4, 13,
  773. rx_prim_mix_text);
  774. static const struct soc_enum rx_int2_1_mix_inp2_chain_enum =
  775. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT2_CFG1, 4, 13,
  776. rx_prim_mix_text);
  777. static const struct soc_enum rx_int3_1_mix_inp0_chain_enum =
  778. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0, 0, 13,
  779. rx_prim_mix_text);
  780. static const struct soc_enum rx_int3_1_mix_inp1_chain_enum =
  781. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG0, 4, 13,
  782. rx_prim_mix_text);
  783. static const struct soc_enum rx_int3_1_mix_inp2_chain_enum =
  784. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT3_CFG1, 4, 13,
  785. rx_prim_mix_text);
  786. static const struct soc_enum rx_int4_1_mix_inp0_chain_enum =
  787. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0, 0, 13,
  788. rx_prim_mix_text);
  789. static const struct soc_enum rx_int4_1_mix_inp1_chain_enum =
  790. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG0, 4, 13,
  791. rx_prim_mix_text);
  792. static const struct soc_enum rx_int4_1_mix_inp2_chain_enum =
  793. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT4_CFG1, 4, 13,
  794. rx_prim_mix_text);
  795. static const struct soc_enum rx_int7_1_mix_inp0_chain_enum =
  796. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0, 0, 13,
  797. rx_prim_mix_text);
  798. static const struct soc_enum rx_int7_1_mix_inp1_chain_enum =
  799. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG0, 4, 13,
  800. rx_prim_mix_text);
  801. static const struct soc_enum rx_int7_1_mix_inp2_chain_enum =
  802. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT7_CFG1, 4, 13,
  803. rx_prim_mix_text);
  804. static const struct soc_enum rx_int8_1_mix_inp0_chain_enum =
  805. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0, 0, 13,
  806. rx_prim_mix_text);
  807. static const struct soc_enum rx_int8_1_mix_inp1_chain_enum =
  808. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG0, 4, 13,
  809. rx_prim_mix_text);
  810. static const struct soc_enum rx_int8_1_mix_inp2_chain_enum =
  811. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_RX_INT8_CFG1, 4, 13,
  812. rx_prim_mix_text);
  813. static const struct soc_enum rx_int0_mix2_inp_mux_enum =
  814. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 0, 4,
  815. rx_sidetone_mix_text);
  816. static const struct soc_enum rx_int1_mix2_inp_mux_enum =
  817. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2, 4,
  818. rx_sidetone_mix_text);
  819. static const struct soc_enum rx_int2_mix2_inp_mux_enum =
  820. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4, 4,
  821. rx_sidetone_mix_text);
  822. static const struct soc_enum rx_int3_mix2_inp_mux_enum =
  823. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6, 4,
  824. rx_sidetone_mix_text);
  825. static const struct soc_enum rx_int4_mix2_inp_mux_enum =
  826. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 0, 4,
  827. rx_sidetone_mix_text);
  828. static const struct soc_enum rx_int7_mix2_inp_mux_enum =
  829. SOC_ENUM_SINGLE(WCD934X_CDC_RX_INP_MUX_SIDETONE_SRC_CFG1, 2, 4,
  830. rx_sidetone_mix_text);
  831. static const struct soc_enum iir0_inp0_mux_enum =
  832. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG0,
  833. 0, 18, iir_inp_mux_text);
  834. static const struct soc_enum iir0_inp1_mux_enum =
  835. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG1,
  836. 0, 18, iir_inp_mux_text);
  837. static const struct soc_enum iir0_inp2_mux_enum =
  838. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG2,
  839. 0, 18, iir_inp_mux_text);
  840. static const struct soc_enum iir0_inp3_mux_enum =
  841. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR0_MIX_CFG3,
  842. 0, 18, iir_inp_mux_text);
  843. static const struct soc_enum iir1_inp0_mux_enum =
  844. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG0,
  845. 0, 18, iir_inp_mux_text);
  846. static const struct soc_enum iir1_inp1_mux_enum =
  847. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG1,
  848. 0, 18, iir_inp_mux_text);
  849. static const struct soc_enum iir1_inp2_mux_enum =
  850. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG2,
  851. 0, 18, iir_inp_mux_text);
  852. static const struct soc_enum iir1_inp3_mux_enum =
  853. SOC_ENUM_SINGLE(WCD934X_CDC_SIDETONE_IIR_INP_MUX_IIR1_MIX_CFG3,
  854. 0, 18, iir_inp_mux_text);
  855. static const struct soc_enum rx_int0_dem_inp_mux_enum =
  856. SOC_ENUM_SINGLE(WCD934X_CDC_RX0_RX_PATH_SEC0, 0,
  857. ARRAY_SIZE(rx_int_dem_inp_mux_text),
  858. rx_int_dem_inp_mux_text);
  859. static const struct soc_enum rx_int1_dem_inp_mux_enum =
  860. SOC_ENUM_SINGLE(WCD934X_CDC_RX1_RX_PATH_SEC0, 0,
  861. ARRAY_SIZE(rx_int_dem_inp_mux_text),
  862. rx_int_dem_inp_mux_text);
  863. static const struct soc_enum rx_int2_dem_inp_mux_enum =
  864. SOC_ENUM_SINGLE(WCD934X_CDC_RX2_RX_PATH_SEC0, 0,
  865. ARRAY_SIZE(rx_int_dem_inp_mux_text),
  866. rx_int_dem_inp_mux_text);
  867. static const struct soc_enum tx_adc_mux0_enum =
  868. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 0,
  869. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  870. static const struct soc_enum tx_adc_mux1_enum =
  871. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 0,
  872. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  873. static const struct soc_enum tx_adc_mux2_enum =
  874. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 0,
  875. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  876. static const struct soc_enum tx_adc_mux3_enum =
  877. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 0,
  878. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  879. static const struct soc_enum tx_adc_mux4_enum =
  880. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1, 2,
  881. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  882. static const struct soc_enum tx_adc_mux5_enum =
  883. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 2,
  884. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  885. static const struct soc_enum tx_adc_mux6_enum =
  886. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1, 2,
  887. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  888. static const struct soc_enum tx_adc_mux7_enum =
  889. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1, 2,
  890. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  891. static const struct soc_enum tx_adc_mux8_enum =
  892. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1, 4,
  893. ARRAY_SIZE(adc_mux_text), adc_mux_text);
  894. static const struct soc_enum rx_int0_1_interp_mux_enum =
  895. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2,
  896. rx_int0_1_interp_mux_text);
  897. static const struct soc_enum rx_int1_1_interp_mux_enum =
  898. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2,
  899. rx_int1_1_interp_mux_text);
  900. static const struct soc_enum rx_int2_1_interp_mux_enum =
  901. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2,
  902. rx_int2_1_interp_mux_text);
  903. static const struct soc_enum rx_int3_1_interp_mux_enum =
  904. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int3_1_interp_mux_text);
  905. static const struct soc_enum rx_int4_1_interp_mux_enum =
  906. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int4_1_interp_mux_text);
  907. static const struct soc_enum rx_int7_1_interp_mux_enum =
  908. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int7_1_interp_mux_text);
  909. static const struct soc_enum rx_int8_1_interp_mux_enum =
  910. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int8_1_interp_mux_text);
  911. static const struct soc_enum rx_int0_2_interp_mux_enum =
  912. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int0_2_interp_mux_text);
  913. static const struct soc_enum rx_int1_2_interp_mux_enum =
  914. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int1_2_interp_mux_text);
  915. static const struct soc_enum rx_int2_2_interp_mux_enum =
  916. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int2_2_interp_mux_text);
  917. static const struct soc_enum rx_int3_2_interp_mux_enum =
  918. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int3_2_interp_mux_text);
  919. static const struct soc_enum rx_int4_2_interp_mux_enum =
  920. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int4_2_interp_mux_text);
  921. static const struct soc_enum rx_int7_2_interp_mux_enum =
  922. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int7_2_interp_mux_text);
  923. static const struct soc_enum rx_int8_2_interp_mux_enum =
  924. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, rx_int8_2_interp_mux_text);
  925. static const struct soc_enum tx_dmic_mux0_enum =
  926. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 3, 7,
  927. dmic_mux_text);
  928. static const struct soc_enum tx_dmic_mux1_enum =
  929. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 3, 7,
  930. dmic_mux_text);
  931. static const struct soc_enum tx_dmic_mux2_enum =
  932. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 3, 7,
  933. dmic_mux_text);
  934. static const struct soc_enum tx_dmic_mux3_enum =
  935. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 3, 7,
  936. dmic_mux_text);
  937. static const struct soc_enum tx_dmic_mux4_enum =
  938. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 3, 7,
  939. dmic_mux_text);
  940. static const struct soc_enum tx_dmic_mux5_enum =
  941. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 3, 7,
  942. dmic_mux_text);
  943. static const struct soc_enum tx_dmic_mux6_enum =
  944. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 3, 7,
  945. dmic_mux_text);
  946. static const struct soc_enum tx_dmic_mux7_enum =
  947. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 3, 7,
  948. dmic_mux_text);
  949. static const struct soc_enum tx_dmic_mux8_enum =
  950. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 3, 7,
  951. dmic_mux_text);
  952. static const struct soc_enum tx_amic_mux0_enum =
  953. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0, 0, 5,
  954. amic_mux_text);
  955. static const struct soc_enum tx_amic_mux1_enum =
  956. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG0, 0, 5,
  957. amic_mux_text);
  958. static const struct soc_enum tx_amic_mux2_enum =
  959. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG0, 0, 5,
  960. amic_mux_text);
  961. static const struct soc_enum tx_amic_mux3_enum =
  962. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG0, 0, 5,
  963. amic_mux_text);
  964. static const struct soc_enum tx_amic_mux4_enum =
  965. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0, 0, 5,
  966. amic_mux_text);
  967. static const struct soc_enum tx_amic_mux5_enum =
  968. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX5_CFG0, 0, 5,
  969. amic_mux_text);
  970. static const struct soc_enum tx_amic_mux6_enum =
  971. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX6_CFG0, 0, 5,
  972. amic_mux_text);
  973. static const struct soc_enum tx_amic_mux7_enum =
  974. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX7_CFG0, 0, 5,
  975. amic_mux_text);
  976. static const struct soc_enum tx_amic_mux8_enum =
  977. SOC_ENUM_SINGLE(WCD934X_CDC_TX_INP_MUX_ADC_MUX8_CFG0, 0, 5,
  978. amic_mux_text);
  979. static const struct soc_enum tx_amic4_5_enum =
  980. SOC_ENUM_SINGLE(WCD934X_TX_NEW_AMIC_4_5_SEL, 7, 2, amic4_5_sel_text);
  981. static const struct soc_enum cdc_if_tx0_mux_enum =
  982. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 0,
  983. ARRAY_SIZE(cdc_if_tx0_mux_text), cdc_if_tx0_mux_text);
  984. static const struct soc_enum cdc_if_tx1_mux_enum =
  985. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 2,
  986. ARRAY_SIZE(cdc_if_tx1_mux_text), cdc_if_tx1_mux_text);
  987. static const struct soc_enum cdc_if_tx2_mux_enum =
  988. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 4,
  989. ARRAY_SIZE(cdc_if_tx2_mux_text), cdc_if_tx2_mux_text);
  990. static const struct soc_enum cdc_if_tx3_mux_enum =
  991. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0, 6,
  992. ARRAY_SIZE(cdc_if_tx3_mux_text), cdc_if_tx3_mux_text);
  993. static const struct soc_enum cdc_if_tx4_mux_enum =
  994. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 0,
  995. ARRAY_SIZE(cdc_if_tx4_mux_text), cdc_if_tx4_mux_text);
  996. static const struct soc_enum cdc_if_tx5_mux_enum =
  997. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 2,
  998. ARRAY_SIZE(cdc_if_tx5_mux_text), cdc_if_tx5_mux_text);
  999. static const struct soc_enum cdc_if_tx6_mux_enum =
  1000. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 4,
  1001. ARRAY_SIZE(cdc_if_tx6_mux_text), cdc_if_tx6_mux_text);
  1002. static const struct soc_enum cdc_if_tx7_mux_enum =
  1003. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1, 6,
  1004. ARRAY_SIZE(cdc_if_tx7_mux_text), cdc_if_tx7_mux_text);
  1005. static const struct soc_enum cdc_if_tx8_mux_enum =
  1006. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2, 0,
  1007. ARRAY_SIZE(cdc_if_tx8_mux_text), cdc_if_tx8_mux_text);
  1008. static const struct soc_enum cdc_if_tx9_mux_enum =
  1009. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2, 2,
  1010. ARRAY_SIZE(cdc_if_tx9_mux_text), cdc_if_tx9_mux_text);
  1011. static const struct soc_enum cdc_if_tx10_mux_enum =
  1012. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2, 4,
  1013. ARRAY_SIZE(cdc_if_tx10_mux_text), cdc_if_tx10_mux_text);
  1014. static const struct soc_enum cdc_if_tx11_inp1_mux_enum =
  1015. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3, 0,
  1016. ARRAY_SIZE(cdc_if_tx11_inp1_mux_text),
  1017. cdc_if_tx11_inp1_mux_text);
  1018. static const struct soc_enum cdc_if_tx11_mux_enum =
  1019. SOC_ENUM_SINGLE(WCD934X_DATA_HUB_SB_TX11_INP_CFG, 0,
  1020. ARRAY_SIZE(cdc_if_tx11_mux_text), cdc_if_tx11_mux_text);
  1021. static const struct soc_enum cdc_if_tx13_inp1_mux_enum =
  1022. SOC_ENUM_SINGLE(WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3, 4,
  1023. ARRAY_SIZE(cdc_if_tx13_inp1_mux_text),
  1024. cdc_if_tx13_inp1_mux_text);
  1025. static const struct soc_enum cdc_if_tx13_mux_enum =
  1026. SOC_ENUM_SINGLE(WCD934X_DATA_HUB_SB_TX13_INP_CFG, 0,
  1027. ARRAY_SIZE(cdc_if_tx13_mux_text), cdc_if_tx13_mux_text);
  1028. static struct wcd_mbhc_field wcd_mbhc_fields[WCD_MBHC_REG_FUNC_MAX] = {
  1029. WCD_MBHC_FIELD(WCD_MBHC_L_DET_EN, WCD934X_ANA_MBHC_MECH, 0x80),
  1030. WCD_MBHC_FIELD(WCD_MBHC_GND_DET_EN, WCD934X_ANA_MBHC_MECH, 0x40),
  1031. WCD_MBHC_FIELD(WCD_MBHC_MECH_DETECTION_TYPE, WCD934X_ANA_MBHC_MECH, 0x20),
  1032. WCD_MBHC_FIELD(WCD_MBHC_MIC_CLAMP_CTL, WCD934X_MBHC_NEW_PLUG_DETECT_CTL, 0x30),
  1033. WCD_MBHC_FIELD(WCD_MBHC_ELECT_DETECTION_TYPE, WCD934X_ANA_MBHC_ELECT, 0x08),
  1034. WCD_MBHC_FIELD(WCD_MBHC_HS_L_DET_PULL_UP_CTRL, WCD934X_MBHC_NEW_PLUG_DETECT_CTL, 0xC0),
  1035. WCD_MBHC_FIELD(WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL, WCD934X_ANA_MBHC_MECH, 0x04),
  1036. WCD_MBHC_FIELD(WCD_MBHC_HPHL_PLUG_TYPE, WCD934X_ANA_MBHC_MECH, 0x10),
  1037. WCD_MBHC_FIELD(WCD_MBHC_GND_PLUG_TYPE, WCD934X_ANA_MBHC_MECH, 0x08),
  1038. WCD_MBHC_FIELD(WCD_MBHC_SW_HPH_LP_100K_TO_GND, WCD934X_ANA_MBHC_MECH, 0x01),
  1039. WCD_MBHC_FIELD(WCD_MBHC_ELECT_SCHMT_ISRC, WCD934X_ANA_MBHC_ELECT, 0x06),
  1040. WCD_MBHC_FIELD(WCD_MBHC_FSM_EN, WCD934X_ANA_MBHC_ELECT, 0x80),
  1041. WCD_MBHC_FIELD(WCD_MBHC_INSREM_DBNC, WCD934X_MBHC_NEW_PLUG_DETECT_CTL, 0x0F),
  1042. WCD_MBHC_FIELD(WCD_MBHC_BTN_DBNC, WCD934X_MBHC_NEW_CTL_1, 0x03),
  1043. WCD_MBHC_FIELD(WCD_MBHC_HS_VREF, WCD934X_MBHC_NEW_CTL_2, 0x03),
  1044. WCD_MBHC_FIELD(WCD_MBHC_HS_COMP_RESULT, WCD934X_ANA_MBHC_RESULT_3, 0x08),
  1045. WCD_MBHC_FIELD(WCD_MBHC_IN2P_CLAMP_STATE, WCD934X_ANA_MBHC_RESULT_3, 0x10),
  1046. WCD_MBHC_FIELD(WCD_MBHC_MIC_SCHMT_RESULT, WCD934X_ANA_MBHC_RESULT_3, 0x20),
  1047. WCD_MBHC_FIELD(WCD_MBHC_HPHL_SCHMT_RESULT, WCD934X_ANA_MBHC_RESULT_3, 0x80),
  1048. WCD_MBHC_FIELD(WCD_MBHC_HPHR_SCHMT_RESULT, WCD934X_ANA_MBHC_RESULT_3, 0x40),
  1049. WCD_MBHC_FIELD(WCD_MBHC_OCP_FSM_EN, WCD934X_HPH_OCP_CTL, 0x10),
  1050. WCD_MBHC_FIELD(WCD_MBHC_BTN_RESULT, WCD934X_ANA_MBHC_RESULT_3, 0x07),
  1051. WCD_MBHC_FIELD(WCD_MBHC_BTN_ISRC_CTL, WCD934X_ANA_MBHC_ELECT, 0x70),
  1052. WCD_MBHC_FIELD(WCD_MBHC_ELECT_RESULT, WCD934X_ANA_MBHC_RESULT_3, 0xFF),
  1053. WCD_MBHC_FIELD(WCD_MBHC_MICB_CTRL, WCD934X_ANA_MICB2, 0xC0),
  1054. WCD_MBHC_FIELD(WCD_MBHC_HPH_CNP_WG_TIME, WCD934X_HPH_CNP_WG_TIME, 0xFF),
  1055. WCD_MBHC_FIELD(WCD_MBHC_HPHR_PA_EN, WCD934X_ANA_HPH, 0x40),
  1056. WCD_MBHC_FIELD(WCD_MBHC_HPHL_PA_EN, WCD934X_ANA_HPH, 0x80),
  1057. WCD_MBHC_FIELD(WCD_MBHC_HPH_PA_EN, WCD934X_ANA_HPH, 0xC0),
  1058. WCD_MBHC_FIELD(WCD_MBHC_SWCH_LEVEL_REMOVE, WCD934X_ANA_MBHC_RESULT_3, 0x10),
  1059. WCD_MBHC_FIELD(WCD_MBHC_ANC_DET_EN, WCD934X_MBHC_CTL_BCS, 0x02),
  1060. WCD_MBHC_FIELD(WCD_MBHC_FSM_STATUS, WCD934X_MBHC_STATUS_SPARE_1, 0x01),
  1061. WCD_MBHC_FIELD(WCD_MBHC_MUX_CTL, WCD934X_MBHC_NEW_CTL_2, 0x70),
  1062. WCD_MBHC_FIELD(WCD_MBHC_MOISTURE_STATUS, WCD934X_MBHC_NEW_FSM_STATUS, 0x20),
  1063. WCD_MBHC_FIELD(WCD_MBHC_HPHR_GND, WCD934X_HPH_PA_CTL2, 0x40),
  1064. WCD_MBHC_FIELD(WCD_MBHC_HPHL_GND, WCD934X_HPH_PA_CTL2, 0x10),
  1065. WCD_MBHC_FIELD(WCD_MBHC_HPHL_OCP_DET_EN, WCD934X_HPH_L_TEST, 0x01),
  1066. WCD_MBHC_FIELD(WCD_MBHC_HPHR_OCP_DET_EN, WCD934X_HPH_R_TEST, 0x01),
  1067. WCD_MBHC_FIELD(WCD_MBHC_HPHL_OCP_STATUS, WCD934X_INTR_PIN1_STATUS0, 0x04),
  1068. WCD_MBHC_FIELD(WCD_MBHC_HPHR_OCP_STATUS, WCD934X_INTR_PIN1_STATUS0, 0x08),
  1069. WCD_MBHC_FIELD(WCD_MBHC_ADC_EN, WCD934X_MBHC_NEW_CTL_1, 0x08),
  1070. WCD_MBHC_FIELD(WCD_MBHC_ADC_COMPLETE, WCD934X_MBHC_NEW_FSM_STATUS, 0x40),
  1071. WCD_MBHC_FIELD(WCD_MBHC_ADC_TIMEOUT, WCD934X_MBHC_NEW_FSM_STATUS, 0x80),
  1072. WCD_MBHC_FIELD(WCD_MBHC_ADC_RESULT, WCD934X_MBHC_NEW_ADC_RESULT, 0xFF),
  1073. WCD_MBHC_FIELD(WCD_MBHC_MICB2_VOUT, WCD934X_ANA_MICB2, 0x3F),
  1074. WCD_MBHC_FIELD(WCD_MBHC_ADC_MODE, WCD934X_MBHC_NEW_CTL_1, 0x10),
  1075. WCD_MBHC_FIELD(WCD_MBHC_DETECTION_DONE, WCD934X_MBHC_NEW_CTL_1, 0x04),
  1076. WCD_MBHC_FIELD(WCD_MBHC_ELECT_ISRC_EN, WCD934X_ANA_MBHC_ZDET, 0x02),
  1077. };
  1078. static int wcd934x_set_sido_input_src(struct wcd934x_codec *wcd, int sido_src)
  1079. {
  1080. if (sido_src == wcd->sido_input_src)
  1081. return 0;
  1082. if (sido_src == SIDO_SOURCE_RCO_BG) {
  1083. regmap_update_bits(wcd->regmap, WCD934X_ANA_RCO,
  1084. WCD934X_ANA_RCO_BG_EN_MASK,
  1085. WCD934X_ANA_RCO_BG_ENABLE);
  1086. usleep_range(100, 110);
  1087. }
  1088. wcd->sido_input_src = sido_src;
  1089. return 0;
  1090. }
  1091. static int wcd934x_enable_ana_bias_and_sysclk(struct wcd934x_codec *wcd)
  1092. {
  1093. mutex_lock(&wcd->sysclk_mutex);
  1094. if (++wcd->sysclk_users != 1) {
  1095. mutex_unlock(&wcd->sysclk_mutex);
  1096. return 0;
  1097. }
  1098. mutex_unlock(&wcd->sysclk_mutex);
  1099. regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
  1100. WCD934X_ANA_BIAS_EN_MASK,
  1101. WCD934X_ANA_BIAS_EN);
  1102. regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
  1103. WCD934X_ANA_PRECHRG_EN_MASK,
  1104. WCD934X_ANA_PRECHRG_EN);
  1105. /*
  1106. * 1ms delay is required after pre-charge is enabled
  1107. * as per HW requirement
  1108. */
  1109. usleep_range(1000, 1100);
  1110. regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
  1111. WCD934X_ANA_PRECHRG_EN_MASK, 0);
  1112. regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
  1113. WCD934X_ANA_PRECHRG_MODE_MASK, 0);
  1114. /*
  1115. * In data clock contrl register is changed
  1116. * to CLK_SYS_MCLK_PRG
  1117. */
  1118. regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
  1119. WCD934X_EXT_CLK_BUF_EN_MASK,
  1120. WCD934X_EXT_CLK_BUF_EN);
  1121. regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
  1122. WCD934X_EXT_CLK_DIV_RATIO_MASK,
  1123. WCD934X_EXT_CLK_DIV_BY_2);
  1124. regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
  1125. WCD934X_MCLK_SRC_MASK,
  1126. WCD934X_MCLK_SRC_EXT_CLK);
  1127. regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
  1128. WCD934X_MCLK_EN_MASK, WCD934X_MCLK_EN);
  1129. regmap_update_bits(wcd->regmap,
  1130. WCD934X_CDC_CLK_RST_CTRL_FS_CNT_CONTROL,
  1131. WCD934X_CDC_FS_MCLK_CNT_EN_MASK,
  1132. WCD934X_CDC_FS_MCLK_CNT_ENABLE);
  1133. regmap_update_bits(wcd->regmap,
  1134. WCD934X_CDC_CLK_RST_CTRL_MCLK_CONTROL,
  1135. WCD934X_MCLK_EN_MASK,
  1136. WCD934X_MCLK_EN);
  1137. regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_GATE,
  1138. WCD934X_CODEC_RPM_CLK_GATE_MASK, 0x0);
  1139. /*
  1140. * 10us sleep is required after clock is enabled
  1141. * as per HW requirement
  1142. */
  1143. usleep_range(10, 15);
  1144. wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_RCO_BG);
  1145. return 0;
  1146. }
  1147. static int wcd934x_disable_ana_bias_and_syclk(struct wcd934x_codec *wcd)
  1148. {
  1149. mutex_lock(&wcd->sysclk_mutex);
  1150. if (--wcd->sysclk_users != 0) {
  1151. mutex_unlock(&wcd->sysclk_mutex);
  1152. return 0;
  1153. }
  1154. mutex_unlock(&wcd->sysclk_mutex);
  1155. regmap_update_bits(wcd->regmap, WCD934X_CLK_SYS_MCLK_PRG,
  1156. WCD934X_EXT_CLK_BUF_EN_MASK |
  1157. WCD934X_MCLK_EN_MASK, 0x0);
  1158. regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
  1159. WCD934X_ANA_BIAS_EN_MASK, 0);
  1160. regmap_update_bits(wcd->regmap, WCD934X_ANA_BIAS,
  1161. WCD934X_ANA_PRECHRG_EN_MASK, 0);
  1162. return 0;
  1163. }
  1164. static int __wcd934x_cdc_mclk_enable(struct wcd934x_codec *wcd, bool enable)
  1165. {
  1166. int ret = 0;
  1167. if (enable) {
  1168. ret = clk_prepare_enable(wcd->extclk);
  1169. if (ret) {
  1170. dev_err(wcd->dev, "%s: ext clk enable failed\n",
  1171. __func__);
  1172. return ret;
  1173. }
  1174. ret = wcd934x_enable_ana_bias_and_sysclk(wcd);
  1175. } else {
  1176. int val;
  1177. regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL,
  1178. &val);
  1179. /* Don't disable clock if soundwire using it.*/
  1180. if (val & WCD934X_CDC_SWR_CLK_EN_MASK)
  1181. return 0;
  1182. wcd934x_disable_ana_bias_and_syclk(wcd);
  1183. clk_disable_unprepare(wcd->extclk);
  1184. }
  1185. return ret;
  1186. }
  1187. static int wcd934x_codec_enable_mclk(struct snd_soc_dapm_widget *w,
  1188. struct snd_kcontrol *kc, int event)
  1189. {
  1190. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  1191. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  1192. switch (event) {
  1193. case SND_SOC_DAPM_PRE_PMU:
  1194. return __wcd934x_cdc_mclk_enable(wcd, true);
  1195. case SND_SOC_DAPM_POST_PMD:
  1196. return __wcd934x_cdc_mclk_enable(wcd, false);
  1197. }
  1198. return 0;
  1199. }
  1200. static int wcd934x_get_version(struct wcd934x_codec *wcd)
  1201. {
  1202. int val1, val2, ver, ret;
  1203. struct regmap *regmap;
  1204. u16 id_minor;
  1205. u32 version_mask = 0;
  1206. regmap = wcd->regmap;
  1207. ver = 0;
  1208. ret = regmap_bulk_read(regmap, WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0,
  1209. (u8 *)&id_minor, sizeof(u16));
  1210. if (ret)
  1211. return ret;
  1212. regmap_read(regmap, WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14, &val1);
  1213. regmap_read(regmap, WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT15, &val2);
  1214. version_mask |= (!!((u8)val1 & 0x80)) << DSD_DISABLED_MASK;
  1215. version_mask |= (!!((u8)val2 & 0x01)) << SLNQ_DISABLED_MASK;
  1216. switch (version_mask) {
  1217. case DSD_DISABLED | SLNQ_DISABLED:
  1218. if (id_minor == 0)
  1219. ver = WCD_VERSION_WCD9340_1_0;
  1220. else if (id_minor == 0x01)
  1221. ver = WCD_VERSION_WCD9340_1_1;
  1222. break;
  1223. case SLNQ_DISABLED:
  1224. if (id_minor == 0)
  1225. ver = WCD_VERSION_WCD9341_1_0;
  1226. else if (id_minor == 0x01)
  1227. ver = WCD_VERSION_WCD9341_1_1;
  1228. break;
  1229. }
  1230. wcd->version = ver;
  1231. dev_info(wcd->dev, "WCD934X Minor:0x%x Version:0x%x\n", id_minor, ver);
  1232. return 0;
  1233. }
  1234. static void wcd934x_enable_efuse_sensing(struct wcd934x_codec *wcd)
  1235. {
  1236. int rc, val;
  1237. __wcd934x_cdc_mclk_enable(wcd, true);
  1238. regmap_update_bits(wcd->regmap,
  1239. WCD934X_CHIP_TIER_CTRL_EFUSE_CTL,
  1240. WCD934X_EFUSE_SENSE_STATE_MASK,
  1241. WCD934X_EFUSE_SENSE_STATE_DEF);
  1242. regmap_update_bits(wcd->regmap,
  1243. WCD934X_CHIP_TIER_CTRL_EFUSE_CTL,
  1244. WCD934X_EFUSE_SENSE_EN_MASK,
  1245. WCD934X_EFUSE_SENSE_ENABLE);
  1246. /*
  1247. * 5ms sleep required after enabling efuse control
  1248. * before checking the status.
  1249. */
  1250. usleep_range(5000, 5500);
  1251. wcd934x_set_sido_input_src(wcd, SIDO_SOURCE_RCO_BG);
  1252. rc = regmap_read(wcd->regmap,
  1253. WCD934X_CHIP_TIER_CTRL_EFUSE_STATUS, &val);
  1254. if (rc || (!(val & 0x01)))
  1255. WARN(1, "%s: Efuse sense is not complete val=%x, ret=%d\n",
  1256. __func__, val, rc);
  1257. __wcd934x_cdc_mclk_enable(wcd, false);
  1258. }
  1259. static int wcd934x_swrm_clock(struct wcd934x_codec *wcd, bool enable)
  1260. {
  1261. if (enable) {
  1262. __wcd934x_cdc_mclk_enable(wcd, true);
  1263. regmap_update_bits(wcd->regmap,
  1264. WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL,
  1265. WCD934X_CDC_SWR_CLK_EN_MASK,
  1266. WCD934X_CDC_SWR_CLK_ENABLE);
  1267. } else {
  1268. regmap_update_bits(wcd->regmap,
  1269. WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL,
  1270. WCD934X_CDC_SWR_CLK_EN_MASK, 0);
  1271. __wcd934x_cdc_mclk_enable(wcd, false);
  1272. }
  1273. return 0;
  1274. }
  1275. static int wcd934x_set_prim_interpolator_rate(struct snd_soc_dai *dai,
  1276. u8 rate_val, u32 rate)
  1277. {
  1278. struct snd_soc_component *comp = dai->component;
  1279. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  1280. struct wcd934x_slim_ch *ch;
  1281. u8 cfg0, cfg1, inp0_sel, inp1_sel, inp2_sel;
  1282. int inp, j;
  1283. list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
  1284. inp = ch->shift + INTn_1_INP_SEL_RX0;
  1285. /*
  1286. * Loop through all interpolator MUX inputs and find out
  1287. * to which interpolator input, the slim rx port
  1288. * is connected
  1289. */
  1290. for (j = 0; j < WCD934X_NUM_INTERPOLATORS; j++) {
  1291. /* Interpolators 5 and 6 are not aviliable in Tavil */
  1292. if (j == INTERP_LO3_NA || j == INTERP_LO4_NA)
  1293. continue;
  1294. cfg0 = snd_soc_component_read(comp,
  1295. WCD934X_CDC_RX_INP_MUX_RX_INT_CFG0(j));
  1296. cfg1 = snd_soc_component_read(comp,
  1297. WCD934X_CDC_RX_INP_MUX_RX_INT_CFG1(j));
  1298. inp0_sel = cfg0 &
  1299. WCD934X_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
  1300. inp1_sel = (cfg0 >> 4) &
  1301. WCD934X_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
  1302. inp2_sel = (cfg1 >> 4) &
  1303. WCD934X_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
  1304. if ((inp0_sel == inp) || (inp1_sel == inp) ||
  1305. (inp2_sel == inp)) {
  1306. /* rate is in Hz */
  1307. /*
  1308. * Ear and speaker primary path does not support
  1309. * native sample rates
  1310. */
  1311. if ((j == INTERP_EAR || j == INTERP_SPKR1 ||
  1312. j == INTERP_SPKR2) && rate == 44100)
  1313. dev_err(wcd->dev,
  1314. "Cannot set 44.1KHz on INT%d\n",
  1315. j);
  1316. else
  1317. snd_soc_component_update_bits(comp,
  1318. WCD934X_CDC_RX_PATH_CTL(j),
  1319. WCD934X_CDC_MIX_PCM_RATE_MASK,
  1320. rate_val);
  1321. }
  1322. }
  1323. }
  1324. return 0;
  1325. }
  1326. static int wcd934x_set_mix_interpolator_rate(struct snd_soc_dai *dai,
  1327. int rate_val, u32 rate)
  1328. {
  1329. struct snd_soc_component *component = dai->component;
  1330. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  1331. struct wcd934x_slim_ch *ch;
  1332. int val, j;
  1333. list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
  1334. for (j = 0; j < WCD934X_NUM_INTERPOLATORS; j++) {
  1335. /* Interpolators 5 and 6 are not aviliable in Tavil */
  1336. if (j == INTERP_LO3_NA || j == INTERP_LO4_NA)
  1337. continue;
  1338. val = snd_soc_component_read(component,
  1339. WCD934X_CDC_RX_INP_MUX_RX_INT_CFG1(j)) &
  1340. WCD934X_CDC_RX_INP_MUX_RX_INT_SEL_MASK;
  1341. if (val == (ch->shift + INTn_2_INP_SEL_RX0)) {
  1342. /*
  1343. * Ear mix path supports only 48, 96, 192,
  1344. * 384KHz only
  1345. */
  1346. if ((j == INTERP_EAR) &&
  1347. (rate_val < 0x4 ||
  1348. rate_val > 0x7)) {
  1349. dev_err(component->dev,
  1350. "Invalid rate for AIF_PB DAI(%d)\n",
  1351. dai->id);
  1352. return -EINVAL;
  1353. }
  1354. snd_soc_component_update_bits(component,
  1355. WCD934X_CDC_RX_PATH_MIX_CTL(j),
  1356. WCD934X_CDC_MIX_PCM_RATE_MASK,
  1357. rate_val);
  1358. }
  1359. }
  1360. }
  1361. return 0;
  1362. }
  1363. static int wcd934x_set_interpolator_rate(struct snd_soc_dai *dai,
  1364. u32 sample_rate)
  1365. {
  1366. int rate_val = 0;
  1367. int i, ret;
  1368. for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) {
  1369. if (sample_rate == sr_val_tbl[i].sample_rate) {
  1370. rate_val = sr_val_tbl[i].rate_val;
  1371. break;
  1372. }
  1373. }
  1374. if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) {
  1375. dev_err(dai->dev, "Unsupported sample rate: %d\n", sample_rate);
  1376. return -EINVAL;
  1377. }
  1378. ret = wcd934x_set_prim_interpolator_rate(dai, (u8)rate_val,
  1379. sample_rate);
  1380. if (ret)
  1381. return ret;
  1382. ret = wcd934x_set_mix_interpolator_rate(dai, (u8)rate_val,
  1383. sample_rate);
  1384. return ret;
  1385. }
  1386. static int wcd934x_set_decimator_rate(struct snd_soc_dai *dai,
  1387. u8 rate_val, u32 rate)
  1388. {
  1389. struct snd_soc_component *comp = dai->component;
  1390. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
  1391. u8 shift = 0, shift_val = 0, tx_mux_sel;
  1392. struct wcd934x_slim_ch *ch;
  1393. int tx_port, tx_port_reg;
  1394. int decimator = -1;
  1395. list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list) {
  1396. tx_port = ch->port;
  1397. /* Find the SB TX MUX input - which decimator is connected */
  1398. switch (tx_port) {
  1399. case 0 ... 3:
  1400. tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG0;
  1401. shift = (tx_port << 1);
  1402. shift_val = 0x03;
  1403. break;
  1404. case 4 ... 7:
  1405. tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG1;
  1406. shift = ((tx_port - 4) << 1);
  1407. shift_val = 0x03;
  1408. break;
  1409. case 8 ... 10:
  1410. tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG2;
  1411. shift = ((tx_port - 8) << 1);
  1412. shift_val = 0x03;
  1413. break;
  1414. case 11:
  1415. tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3;
  1416. shift = 0;
  1417. shift_val = 0x0F;
  1418. break;
  1419. case 13:
  1420. tx_port_reg = WCD934X_CDC_IF_ROUTER_TX_MUX_CFG3;
  1421. shift = 4;
  1422. shift_val = 0x03;
  1423. break;
  1424. default:
  1425. dev_err(wcd->dev, "Invalid SLIM TX%u port DAI ID:%d\n",
  1426. tx_port, dai->id);
  1427. return -EINVAL;
  1428. }
  1429. tx_mux_sel = snd_soc_component_read(comp, tx_port_reg) &
  1430. (shift_val << shift);
  1431. tx_mux_sel = tx_mux_sel >> shift;
  1432. switch (tx_port) {
  1433. case 0 ... 8:
  1434. if ((tx_mux_sel == 0x2) || (tx_mux_sel == 0x3))
  1435. decimator = tx_port;
  1436. break;
  1437. case 9 ... 10:
  1438. if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2))
  1439. decimator = ((tx_port == 9) ? 7 : 6);
  1440. break;
  1441. case 11:
  1442. if ((tx_mux_sel >= 1) && (tx_mux_sel < 7))
  1443. decimator = tx_mux_sel - 1;
  1444. break;
  1445. case 13:
  1446. if ((tx_mux_sel == 0x1) || (tx_mux_sel == 0x2))
  1447. decimator = 5;
  1448. break;
  1449. default:
  1450. dev_err(wcd->dev, "ERROR: Invalid tx_port: %d\n",
  1451. tx_port);
  1452. return -EINVAL;
  1453. }
  1454. snd_soc_component_update_bits(comp,
  1455. WCD934X_CDC_TX_PATH_CTL(decimator),
  1456. WCD934X_CDC_TX_PATH_CTL_PCM_RATE_MASK,
  1457. rate_val);
  1458. }
  1459. return 0;
  1460. }
  1461. static int wcd934x_slim_set_hw_params(struct wcd934x_codec *wcd,
  1462. struct wcd_slim_codec_dai_data *dai_data,
  1463. int direction)
  1464. {
  1465. struct list_head *slim_ch_list = &dai_data->slim_ch_list;
  1466. struct slim_stream_config *cfg = &dai_data->sconfig;
  1467. struct wcd934x_slim_ch *ch;
  1468. u16 payload = 0;
  1469. int ret, i;
  1470. cfg->ch_count = 0;
  1471. cfg->direction = direction;
  1472. cfg->port_mask = 0;
  1473. /* Configure slave interface device */
  1474. list_for_each_entry(ch, slim_ch_list, list) {
  1475. cfg->ch_count++;
  1476. payload |= 1 << ch->shift;
  1477. cfg->port_mask |= BIT(ch->port);
  1478. }
  1479. cfg->chs = kcalloc(cfg->ch_count, sizeof(unsigned int), GFP_KERNEL);
  1480. if (!cfg->chs)
  1481. return -ENOMEM;
  1482. i = 0;
  1483. list_for_each_entry(ch, slim_ch_list, list) {
  1484. cfg->chs[i++] = ch->ch_num;
  1485. if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
  1486. /* write to interface device */
  1487. ret = regmap_write(wcd->if_regmap,
  1488. WCD934X_SLIM_PGD_RX_PORT_MULTI_CHNL_0(ch->port),
  1489. payload);
  1490. if (ret < 0)
  1491. goto err;
  1492. /* configure the slave port for water mark and enable*/
  1493. ret = regmap_write(wcd->if_regmap,
  1494. WCD934X_SLIM_PGD_RX_PORT_CFG(ch->port),
  1495. WCD934X_SLIM_WATER_MARK_VAL);
  1496. if (ret < 0)
  1497. goto err;
  1498. } else {
  1499. ret = regmap_write(wcd->if_regmap,
  1500. WCD934X_SLIM_PGD_TX_PORT_MULTI_CHNL_0(ch->port),
  1501. payload & 0x00FF);
  1502. if (ret < 0)
  1503. goto err;
  1504. /* ports 8,9 */
  1505. ret = regmap_write(wcd->if_regmap,
  1506. WCD934X_SLIM_PGD_TX_PORT_MULTI_CHNL_1(ch->port),
  1507. (payload & 0xFF00) >> 8);
  1508. if (ret < 0)
  1509. goto err;
  1510. /* configure the slave port for water mark and enable*/
  1511. ret = regmap_write(wcd->if_regmap,
  1512. WCD934X_SLIM_PGD_TX_PORT_CFG(ch->port),
  1513. WCD934X_SLIM_WATER_MARK_VAL);
  1514. if (ret < 0)
  1515. goto err;
  1516. }
  1517. }
  1518. dai_data->sruntime = slim_stream_allocate(wcd->sdev, "WCD934x-SLIM");
  1519. return 0;
  1520. err:
  1521. dev_err(wcd->dev, "Error Setting slim hw params\n");
  1522. kfree(cfg->chs);
  1523. cfg->chs = NULL;
  1524. return ret;
  1525. }
  1526. static int wcd934x_hw_params(struct snd_pcm_substream *substream,
  1527. struct snd_pcm_hw_params *params,
  1528. struct snd_soc_dai *dai)
  1529. {
  1530. struct wcd934x_codec *wcd;
  1531. int ret, tx_fs_rate = 0;
  1532. wcd = snd_soc_component_get_drvdata(dai->component);
  1533. switch (substream->stream) {
  1534. case SNDRV_PCM_STREAM_PLAYBACK:
  1535. ret = wcd934x_set_interpolator_rate(dai, params_rate(params));
  1536. if (ret) {
  1537. dev_err(wcd->dev, "cannot set sample rate: %u\n",
  1538. params_rate(params));
  1539. return ret;
  1540. }
  1541. switch (params_width(params)) {
  1542. case 16 ... 24:
  1543. wcd->dai[dai->id].sconfig.bps = params_width(params);
  1544. break;
  1545. default:
  1546. dev_err(wcd->dev, "Invalid format 0x%x\n",
  1547. params_width(params));
  1548. return -EINVAL;
  1549. }
  1550. break;
  1551. case SNDRV_PCM_STREAM_CAPTURE:
  1552. switch (params_rate(params)) {
  1553. case 8000:
  1554. tx_fs_rate = 0;
  1555. break;
  1556. case 16000:
  1557. tx_fs_rate = 1;
  1558. break;
  1559. case 32000:
  1560. tx_fs_rate = 3;
  1561. break;
  1562. case 48000:
  1563. tx_fs_rate = 4;
  1564. break;
  1565. case 96000:
  1566. tx_fs_rate = 5;
  1567. break;
  1568. case 192000:
  1569. tx_fs_rate = 6;
  1570. break;
  1571. case 384000:
  1572. tx_fs_rate = 7;
  1573. break;
  1574. default:
  1575. dev_err(wcd->dev, "Invalid TX sample rate: %d\n",
  1576. params_rate(params));
  1577. return -EINVAL;
  1578. }
  1579. ret = wcd934x_set_decimator_rate(dai, tx_fs_rate,
  1580. params_rate(params));
  1581. if (ret < 0) {
  1582. dev_err(wcd->dev, "Cannot set TX Decimator rate\n");
  1583. return ret;
  1584. }
  1585. switch (params_width(params)) {
  1586. case 16 ... 32:
  1587. wcd->dai[dai->id].sconfig.bps = params_width(params);
  1588. break;
  1589. default:
  1590. dev_err(wcd->dev, "Invalid format 0x%x\n",
  1591. params_width(params));
  1592. return -EINVAL;
  1593. }
  1594. break;
  1595. default:
  1596. dev_err(wcd->dev, "Invalid stream type %d\n",
  1597. substream->stream);
  1598. return -EINVAL;
  1599. }
  1600. wcd->dai[dai->id].sconfig.rate = params_rate(params);
  1601. return wcd934x_slim_set_hw_params(wcd, &wcd->dai[dai->id], substream->stream);
  1602. }
  1603. static int wcd934x_hw_free(struct snd_pcm_substream *substream,
  1604. struct snd_soc_dai *dai)
  1605. {
  1606. struct wcd_slim_codec_dai_data *dai_data;
  1607. struct wcd934x_codec *wcd;
  1608. wcd = snd_soc_component_get_drvdata(dai->component);
  1609. dai_data = &wcd->dai[dai->id];
  1610. kfree(dai_data->sconfig.chs);
  1611. return 0;
  1612. }
  1613. static int wcd934x_trigger(struct snd_pcm_substream *substream, int cmd,
  1614. struct snd_soc_dai *dai)
  1615. {
  1616. struct wcd_slim_codec_dai_data *dai_data;
  1617. struct wcd934x_codec *wcd;
  1618. struct slim_stream_config *cfg;
  1619. wcd = snd_soc_component_get_drvdata(dai->component);
  1620. dai_data = &wcd->dai[dai->id];
  1621. switch (cmd) {
  1622. case SNDRV_PCM_TRIGGER_START:
  1623. case SNDRV_PCM_TRIGGER_RESUME:
  1624. case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
  1625. cfg = &dai_data->sconfig;
  1626. slim_stream_prepare(dai_data->sruntime, cfg);
  1627. slim_stream_enable(dai_data->sruntime);
  1628. break;
  1629. case SNDRV_PCM_TRIGGER_STOP:
  1630. case SNDRV_PCM_TRIGGER_SUSPEND:
  1631. case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
  1632. slim_stream_disable(dai_data->sruntime);
  1633. slim_stream_unprepare(dai_data->sruntime);
  1634. break;
  1635. default:
  1636. break;
  1637. }
  1638. return 0;
  1639. }
  1640. static int wcd934x_set_channel_map(struct snd_soc_dai *dai,
  1641. unsigned int tx_num, unsigned int *tx_slot,
  1642. unsigned int rx_num, unsigned int *rx_slot)
  1643. {
  1644. struct wcd934x_codec *wcd;
  1645. int i;
  1646. wcd = snd_soc_component_get_drvdata(dai->component);
  1647. if (tx_num > WCD934X_TX_MAX || rx_num > WCD934X_RX_MAX) {
  1648. dev_err(wcd->dev, "Invalid tx %d or rx %d channel count\n",
  1649. tx_num, rx_num);
  1650. return -EINVAL;
  1651. }
  1652. if (!tx_slot || !rx_slot) {
  1653. dev_err(wcd->dev, "Invalid tx_slot=%p, rx_slot=%p\n",
  1654. tx_slot, rx_slot);
  1655. return -EINVAL;
  1656. }
  1657. wcd->num_rx_port = rx_num;
  1658. for (i = 0; i < rx_num; i++) {
  1659. wcd->rx_chs[i].ch_num = rx_slot[i];
  1660. INIT_LIST_HEAD(&wcd->rx_chs[i].list);
  1661. }
  1662. wcd->num_tx_port = tx_num;
  1663. for (i = 0; i < tx_num; i++) {
  1664. wcd->tx_chs[i].ch_num = tx_slot[i];
  1665. INIT_LIST_HEAD(&wcd->tx_chs[i].list);
  1666. }
  1667. return 0;
  1668. }
  1669. static int wcd934x_get_channel_map(struct snd_soc_dai *dai,
  1670. unsigned int *tx_num, unsigned int *tx_slot,
  1671. unsigned int *rx_num, unsigned int *rx_slot)
  1672. {
  1673. struct wcd934x_slim_ch *ch;
  1674. struct wcd934x_codec *wcd;
  1675. int i = 0;
  1676. wcd = snd_soc_component_get_drvdata(dai->component);
  1677. switch (dai->id) {
  1678. case AIF1_PB:
  1679. case AIF2_PB:
  1680. case AIF3_PB:
  1681. case AIF4_PB:
  1682. if (!rx_slot || !rx_num) {
  1683. dev_err(wcd->dev, "Invalid rx_slot %p or rx_num %p\n",
  1684. rx_slot, rx_num);
  1685. return -EINVAL;
  1686. }
  1687. list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
  1688. rx_slot[i++] = ch->ch_num;
  1689. *rx_num = i;
  1690. break;
  1691. case AIF1_CAP:
  1692. case AIF2_CAP:
  1693. case AIF3_CAP:
  1694. if (!tx_slot || !tx_num) {
  1695. dev_err(wcd->dev, "Invalid tx_slot %p or tx_num %p\n",
  1696. tx_slot, tx_num);
  1697. return -EINVAL;
  1698. }
  1699. list_for_each_entry(ch, &wcd->dai[dai->id].slim_ch_list, list)
  1700. tx_slot[i++] = ch->ch_num;
  1701. *tx_num = i;
  1702. break;
  1703. default:
  1704. dev_err(wcd->dev, "Invalid DAI ID %x\n", dai->id);
  1705. break;
  1706. }
  1707. return 0;
  1708. }
  1709. static const struct snd_soc_dai_ops wcd934x_dai_ops = {
  1710. .hw_params = wcd934x_hw_params,
  1711. .hw_free = wcd934x_hw_free,
  1712. .trigger = wcd934x_trigger,
  1713. .set_channel_map = wcd934x_set_channel_map,
  1714. .get_channel_map = wcd934x_get_channel_map,
  1715. };
  1716. static struct snd_soc_dai_driver wcd934x_slim_dais[] = {
  1717. [0] = {
  1718. .name = "wcd934x_rx1",
  1719. .id = AIF1_PB,
  1720. .playback = {
  1721. .stream_name = "AIF1 Playback",
  1722. .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK,
  1723. .formats = WCD934X_FORMATS_S16_S24_LE,
  1724. .rate_max = 192000,
  1725. .rate_min = 8000,
  1726. .channels_min = 1,
  1727. .channels_max = 2,
  1728. },
  1729. .ops = &wcd934x_dai_ops,
  1730. },
  1731. [1] = {
  1732. .name = "wcd934x_tx1",
  1733. .id = AIF1_CAP,
  1734. .capture = {
  1735. .stream_name = "AIF1 Capture",
  1736. .rates = WCD934X_RATES_MASK,
  1737. .formats = SNDRV_PCM_FMTBIT_S16_LE,
  1738. .rate_min = 8000,
  1739. .rate_max = 192000,
  1740. .channels_min = 1,
  1741. .channels_max = 4,
  1742. },
  1743. .ops = &wcd934x_dai_ops,
  1744. },
  1745. [2] = {
  1746. .name = "wcd934x_rx2",
  1747. .id = AIF2_PB,
  1748. .playback = {
  1749. .stream_name = "AIF2 Playback",
  1750. .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK,
  1751. .formats = WCD934X_FORMATS_S16_S24_LE,
  1752. .rate_min = 8000,
  1753. .rate_max = 192000,
  1754. .channels_min = 1,
  1755. .channels_max = 2,
  1756. },
  1757. .ops = &wcd934x_dai_ops,
  1758. },
  1759. [3] = {
  1760. .name = "wcd934x_tx2",
  1761. .id = AIF2_CAP,
  1762. .capture = {
  1763. .stream_name = "AIF2 Capture",
  1764. .rates = WCD934X_RATES_MASK,
  1765. .formats = SNDRV_PCM_FMTBIT_S16_LE,
  1766. .rate_min = 8000,
  1767. .rate_max = 192000,
  1768. .channels_min = 1,
  1769. .channels_max = 4,
  1770. },
  1771. .ops = &wcd934x_dai_ops,
  1772. },
  1773. [4] = {
  1774. .name = "wcd934x_rx3",
  1775. .id = AIF3_PB,
  1776. .playback = {
  1777. .stream_name = "AIF3 Playback",
  1778. .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK,
  1779. .formats = WCD934X_FORMATS_S16_S24_LE,
  1780. .rate_min = 8000,
  1781. .rate_max = 192000,
  1782. .channels_min = 1,
  1783. .channels_max = 2,
  1784. },
  1785. .ops = &wcd934x_dai_ops,
  1786. },
  1787. [5] = {
  1788. .name = "wcd934x_tx3",
  1789. .id = AIF3_CAP,
  1790. .capture = {
  1791. .stream_name = "AIF3 Capture",
  1792. .rates = WCD934X_RATES_MASK,
  1793. .formats = SNDRV_PCM_FMTBIT_S16_LE,
  1794. .rate_min = 8000,
  1795. .rate_max = 192000,
  1796. .channels_min = 1,
  1797. .channels_max = 4,
  1798. },
  1799. .ops = &wcd934x_dai_ops,
  1800. },
  1801. [6] = {
  1802. .name = "wcd934x_rx4",
  1803. .id = AIF4_PB,
  1804. .playback = {
  1805. .stream_name = "AIF4 Playback",
  1806. .rates = WCD934X_RATES_MASK | WCD934X_FRAC_RATES_MASK,
  1807. .formats = WCD934X_FORMATS_S16_S24_LE,
  1808. .rate_min = 8000,
  1809. .rate_max = 192000,
  1810. .channels_min = 1,
  1811. .channels_max = 2,
  1812. },
  1813. .ops = &wcd934x_dai_ops,
  1814. },
  1815. };
  1816. static int swclk_gate_enable(struct clk_hw *hw)
  1817. {
  1818. return wcd934x_swrm_clock(to_wcd934x_codec(hw), true);
  1819. }
  1820. static void swclk_gate_disable(struct clk_hw *hw)
  1821. {
  1822. wcd934x_swrm_clock(to_wcd934x_codec(hw), false);
  1823. }
  1824. static int swclk_gate_is_enabled(struct clk_hw *hw)
  1825. {
  1826. struct wcd934x_codec *wcd = to_wcd934x_codec(hw);
  1827. int ret, val;
  1828. regmap_read(wcd->regmap, WCD934X_CDC_CLK_RST_CTRL_SWR_CONTROL, &val);
  1829. ret = val & WCD934X_CDC_SWR_CLK_EN_MASK;
  1830. return ret;
  1831. }
  1832. static unsigned long swclk_recalc_rate(struct clk_hw *hw,
  1833. unsigned long parent_rate)
  1834. {
  1835. return parent_rate / 2;
  1836. }
  1837. static const struct clk_ops swclk_gate_ops = {
  1838. .prepare = swclk_gate_enable,
  1839. .unprepare = swclk_gate_disable,
  1840. .is_enabled = swclk_gate_is_enabled,
  1841. .recalc_rate = swclk_recalc_rate,
  1842. };
  1843. static struct clk *wcd934x_register_mclk_output(struct wcd934x_codec *wcd)
  1844. {
  1845. struct clk *parent = wcd->extclk;
  1846. struct device *dev = wcd->dev;
  1847. struct device_node *np = dev->parent->of_node;
  1848. const char *parent_clk_name = NULL;
  1849. const char *clk_name = "mclk";
  1850. struct clk_hw *hw;
  1851. struct clk_init_data init;
  1852. int ret;
  1853. if (of_property_read_u32(np, "clock-frequency", &wcd->rate))
  1854. return NULL;
  1855. parent_clk_name = __clk_get_name(parent);
  1856. of_property_read_string(np, "clock-output-names", &clk_name);
  1857. init.name = clk_name;
  1858. init.ops = &swclk_gate_ops;
  1859. init.flags = 0;
  1860. init.parent_names = &parent_clk_name;
  1861. init.num_parents = 1;
  1862. wcd->hw.init = &init;
  1863. hw = &wcd->hw;
  1864. ret = devm_clk_hw_register(wcd->dev->parent, hw);
  1865. if (ret)
  1866. return ERR_PTR(ret);
  1867. ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
  1868. if (ret)
  1869. return ERR_PTR(ret);
  1870. return NULL;
  1871. }
  1872. static int wcd934x_get_micbias_val(struct device *dev, const char *micbias,
  1873. u32 *micb_mv)
  1874. {
  1875. int mv;
  1876. if (of_property_read_u32(dev->parent->of_node, micbias, &mv)) {
  1877. dev_err(dev, "%s value not found, using default\n", micbias);
  1878. mv = WCD934X_DEF_MICBIAS_MV;
  1879. } else {
  1880. /* convert it to milli volts */
  1881. mv = mv/1000;
  1882. }
  1883. if (mv < 1000 || mv > 2850) {
  1884. dev_err(dev, "%s value not in valid range, using default\n",
  1885. micbias);
  1886. mv = WCD934X_DEF_MICBIAS_MV;
  1887. }
  1888. *micb_mv = mv;
  1889. return (mv - 1000) / 50;
  1890. }
  1891. static int wcd934x_init_dmic(struct snd_soc_component *comp)
  1892. {
  1893. int vout_ctl_1, vout_ctl_2, vout_ctl_3, vout_ctl_4;
  1894. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  1895. u32 def_dmic_rate, dmic_clk_drv;
  1896. vout_ctl_1 = wcd934x_get_micbias_val(comp->dev,
  1897. "qcom,micbias1-microvolt",
  1898. &wcd->micb1_mv);
  1899. vout_ctl_2 = wcd934x_get_micbias_val(comp->dev,
  1900. "qcom,micbias2-microvolt",
  1901. &wcd->micb2_mv);
  1902. vout_ctl_3 = wcd934x_get_micbias_val(comp->dev,
  1903. "qcom,micbias3-microvolt",
  1904. &wcd->micb3_mv);
  1905. vout_ctl_4 = wcd934x_get_micbias_val(comp->dev,
  1906. "qcom,micbias4-microvolt",
  1907. &wcd->micb4_mv);
  1908. snd_soc_component_update_bits(comp, WCD934X_ANA_MICB1,
  1909. WCD934X_MICB_VAL_MASK, vout_ctl_1);
  1910. snd_soc_component_update_bits(comp, WCD934X_ANA_MICB2,
  1911. WCD934X_MICB_VAL_MASK, vout_ctl_2);
  1912. snd_soc_component_update_bits(comp, WCD934X_ANA_MICB3,
  1913. WCD934X_MICB_VAL_MASK, vout_ctl_3);
  1914. snd_soc_component_update_bits(comp, WCD934X_ANA_MICB4,
  1915. WCD934X_MICB_VAL_MASK, vout_ctl_4);
  1916. if (wcd->rate == WCD934X_MCLK_CLK_9P6MHZ)
  1917. def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ;
  1918. else
  1919. def_dmic_rate = WCD9XXX_DMIC_SAMPLE_RATE_4P096MHZ;
  1920. wcd->dmic_sample_rate = def_dmic_rate;
  1921. dmic_clk_drv = 0;
  1922. snd_soc_component_update_bits(comp, WCD934X_TEST_DEBUG_PAD_DRVCTL_0,
  1923. 0x0C, dmic_clk_drv << 2);
  1924. return 0;
  1925. }
  1926. static void wcd934x_hw_init(struct wcd934x_codec *wcd)
  1927. {
  1928. struct regmap *rm = wcd->regmap;
  1929. /* set SPKR rate to FS_2P4_3P072 */
  1930. regmap_update_bits(rm, WCD934X_CDC_RX7_RX_PATH_CFG1, 0x08, 0x08);
  1931. regmap_update_bits(rm, WCD934X_CDC_RX8_RX_PATH_CFG1, 0x08, 0x08);
  1932. /* Take DMICs out of reset */
  1933. regmap_update_bits(rm, WCD934X_CPE_SS_DMIC_CFG, 0x80, 0x00);
  1934. }
  1935. static int wcd934x_comp_init(struct snd_soc_component *component)
  1936. {
  1937. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  1938. wcd934x_hw_init(wcd);
  1939. wcd934x_enable_efuse_sensing(wcd);
  1940. wcd934x_get_version(wcd);
  1941. return 0;
  1942. }
  1943. static irqreturn_t wcd934x_slim_irq_handler(int irq, void *data)
  1944. {
  1945. struct wcd934x_codec *wcd = data;
  1946. unsigned long status = 0;
  1947. int i, j, port_id;
  1948. unsigned int val, int_val = 0;
  1949. irqreturn_t ret = IRQ_NONE;
  1950. bool tx;
  1951. unsigned short reg = 0;
  1952. for (i = WCD934X_SLIM_PGD_PORT_INT_STATUS_RX_0, j = 0;
  1953. i <= WCD934X_SLIM_PGD_PORT_INT_STATUS_TX_1; i++, j++) {
  1954. regmap_read(wcd->if_regmap, i, &val);
  1955. status |= ((u32)val << (8 * j));
  1956. }
  1957. for_each_set_bit(j, &status, 32) {
  1958. tx = false;
  1959. port_id = j;
  1960. if (j >= 16) {
  1961. tx = true;
  1962. port_id = j - 16;
  1963. }
  1964. regmap_read(wcd->if_regmap,
  1965. WCD934X_SLIM_PGD_PORT_INT_RX_SOURCE0 + j, &val);
  1966. if (val) {
  1967. if (!tx)
  1968. reg = WCD934X_SLIM_PGD_PORT_INT_EN0 +
  1969. (port_id / 8);
  1970. else
  1971. reg = WCD934X_SLIM_PGD_PORT_INT_TX_EN0 +
  1972. (port_id / 8);
  1973. regmap_read(wcd->if_regmap, reg, &int_val);
  1974. }
  1975. if (val & WCD934X_SLIM_IRQ_OVERFLOW)
  1976. dev_err_ratelimited(wcd->dev,
  1977. "overflow error on %s port %d, value %x\n",
  1978. (tx ? "TX" : "RX"), port_id, val);
  1979. if (val & WCD934X_SLIM_IRQ_UNDERFLOW)
  1980. dev_err_ratelimited(wcd->dev,
  1981. "underflow error on %s port %d, value %x\n",
  1982. (tx ? "TX" : "RX"), port_id, val);
  1983. if ((val & WCD934X_SLIM_IRQ_OVERFLOW) ||
  1984. (val & WCD934X_SLIM_IRQ_UNDERFLOW)) {
  1985. if (!tx)
  1986. reg = WCD934X_SLIM_PGD_PORT_INT_EN0 +
  1987. (port_id / 8);
  1988. else
  1989. reg = WCD934X_SLIM_PGD_PORT_INT_TX_EN0 +
  1990. (port_id / 8);
  1991. regmap_read(
  1992. wcd->if_regmap, reg, &int_val);
  1993. if (int_val & (1 << (port_id % 8))) {
  1994. int_val = int_val ^ (1 << (port_id % 8));
  1995. regmap_write(wcd->if_regmap,
  1996. reg, int_val);
  1997. }
  1998. }
  1999. if (val & WCD934X_SLIM_IRQ_PORT_CLOSED)
  2000. dev_err_ratelimited(wcd->dev,
  2001. "Port Closed %s port %d, value %x\n",
  2002. (tx ? "TX" : "RX"), port_id, val);
  2003. regmap_write(wcd->if_regmap,
  2004. WCD934X_SLIM_PGD_PORT_INT_CLR_RX_0 + (j / 8),
  2005. BIT(j % 8));
  2006. ret = IRQ_HANDLED;
  2007. }
  2008. return ret;
  2009. }
  2010. static void wcd934x_mbhc_clk_setup(struct snd_soc_component *component,
  2011. bool enable)
  2012. {
  2013. snd_soc_component_write_field(component, WCD934X_MBHC_NEW_CTL_1,
  2014. WCD934X_MBHC_CTL_RCO_EN_MASK, enable);
  2015. }
  2016. static void wcd934x_mbhc_mbhc_bias_control(struct snd_soc_component *component,
  2017. bool enable)
  2018. {
  2019. snd_soc_component_write_field(component, WCD934X_ANA_MBHC_ELECT,
  2020. WCD934X_ANA_MBHC_BIAS_EN, enable);
  2021. }
  2022. static void wcd934x_mbhc_program_btn_thr(struct snd_soc_component *component,
  2023. int *btn_low, int *btn_high,
  2024. int num_btn, bool is_micbias)
  2025. {
  2026. int i, vth;
  2027. if (num_btn > WCD_MBHC_DEF_BUTTONS) {
  2028. dev_err(component->dev, "%s: invalid number of buttons: %d\n",
  2029. __func__, num_btn);
  2030. return;
  2031. }
  2032. for (i = 0; i < num_btn; i++) {
  2033. vth = ((btn_high[i] * 2) / 25) & 0x3F;
  2034. snd_soc_component_write_field(component, WCD934X_ANA_MBHC_BTN0 + i,
  2035. WCD934X_MBHC_BTN_VTH_MASK, vth);
  2036. }
  2037. }
  2038. static bool wcd934x_mbhc_micb_en_status(struct snd_soc_component *component, int micb_num)
  2039. {
  2040. u8 val;
  2041. if (micb_num == MIC_BIAS_2) {
  2042. val = snd_soc_component_read_field(component, WCD934X_ANA_MICB2,
  2043. WCD934X_ANA_MICB2_ENABLE_MASK);
  2044. if (val == WCD934X_MICB_ENABLE)
  2045. return true;
  2046. }
  2047. return false;
  2048. }
  2049. static void wcd934x_mbhc_hph_l_pull_up_control(struct snd_soc_component *component,
  2050. enum mbhc_hs_pullup_iref pull_up_cur)
  2051. {
  2052. /* Default pull up current to 2uA */
  2053. if (pull_up_cur < I_OFF || pull_up_cur > I_3P0_UA ||
  2054. pull_up_cur == I_DEFAULT)
  2055. pull_up_cur = I_2P0_UA;
  2056. snd_soc_component_write_field(component, WCD934X_MBHC_NEW_PLUG_DETECT_CTL,
  2057. WCD934X_HSDET_PULLUP_C_MASK, pull_up_cur);
  2058. }
  2059. static int wcd934x_micbias_control(struct snd_soc_component *component,
  2060. int micb_num, int req, bool is_dapm)
  2061. {
  2062. struct wcd934x_codec *wcd934x = snd_soc_component_get_drvdata(component);
  2063. int micb_index = micb_num - 1;
  2064. u16 micb_reg;
  2065. switch (micb_num) {
  2066. case MIC_BIAS_1:
  2067. micb_reg = WCD934X_ANA_MICB1;
  2068. break;
  2069. case MIC_BIAS_2:
  2070. micb_reg = WCD934X_ANA_MICB2;
  2071. break;
  2072. case MIC_BIAS_3:
  2073. micb_reg = WCD934X_ANA_MICB3;
  2074. break;
  2075. case MIC_BIAS_4:
  2076. micb_reg = WCD934X_ANA_MICB4;
  2077. break;
  2078. default:
  2079. dev_err(component->dev, "%s: Invalid micbias number: %d\n",
  2080. __func__, micb_num);
  2081. return -EINVAL;
  2082. }
  2083. mutex_lock(&wcd934x->micb_lock);
  2084. switch (req) {
  2085. case MICB_PULLUP_ENABLE:
  2086. wcd934x->pullup_ref[micb_index]++;
  2087. if ((wcd934x->pullup_ref[micb_index] == 1) &&
  2088. (wcd934x->micb_ref[micb_index] == 0))
  2089. snd_soc_component_write_field(component, micb_reg,
  2090. WCD934X_ANA_MICB_EN_MASK,
  2091. WCD934X_MICB_PULL_UP);
  2092. break;
  2093. case MICB_PULLUP_DISABLE:
  2094. if (wcd934x->pullup_ref[micb_index] > 0)
  2095. wcd934x->pullup_ref[micb_index]--;
  2096. if ((wcd934x->pullup_ref[micb_index] == 0) &&
  2097. (wcd934x->micb_ref[micb_index] == 0))
  2098. snd_soc_component_write_field(component, micb_reg,
  2099. WCD934X_ANA_MICB_EN_MASK, 0);
  2100. break;
  2101. case MICB_ENABLE:
  2102. wcd934x->micb_ref[micb_index]++;
  2103. if (wcd934x->micb_ref[micb_index] == 1) {
  2104. snd_soc_component_write_field(component, micb_reg,
  2105. WCD934X_ANA_MICB_EN_MASK,
  2106. WCD934X_MICB_ENABLE);
  2107. if (micb_num == MIC_BIAS_2)
  2108. wcd_mbhc_event_notify(wcd934x->mbhc,
  2109. WCD_EVENT_POST_MICBIAS_2_ON);
  2110. }
  2111. if (micb_num == MIC_BIAS_2 && is_dapm)
  2112. wcd_mbhc_event_notify(wcd934x->mbhc,
  2113. WCD_EVENT_POST_DAPM_MICBIAS_2_ON);
  2114. break;
  2115. case MICB_DISABLE:
  2116. if (wcd934x->micb_ref[micb_index] > 0)
  2117. wcd934x->micb_ref[micb_index]--;
  2118. if ((wcd934x->micb_ref[micb_index] == 0) &&
  2119. (wcd934x->pullup_ref[micb_index] > 0))
  2120. snd_soc_component_write_field(component, micb_reg,
  2121. WCD934X_ANA_MICB_EN_MASK,
  2122. WCD934X_MICB_PULL_UP);
  2123. else if ((wcd934x->micb_ref[micb_index] == 0) &&
  2124. (wcd934x->pullup_ref[micb_index] == 0)) {
  2125. if (micb_num == MIC_BIAS_2)
  2126. wcd_mbhc_event_notify(wcd934x->mbhc,
  2127. WCD_EVENT_PRE_MICBIAS_2_OFF);
  2128. snd_soc_component_write_field(component, micb_reg,
  2129. WCD934X_ANA_MICB_EN_MASK, 0);
  2130. if (micb_num == MIC_BIAS_2)
  2131. wcd_mbhc_event_notify(wcd934x->mbhc,
  2132. WCD_EVENT_POST_MICBIAS_2_OFF);
  2133. }
  2134. if (is_dapm && micb_num == MIC_BIAS_2)
  2135. wcd_mbhc_event_notify(wcd934x->mbhc,
  2136. WCD_EVENT_POST_DAPM_MICBIAS_2_OFF);
  2137. break;
  2138. }
  2139. mutex_unlock(&wcd934x->micb_lock);
  2140. return 0;
  2141. }
  2142. static int wcd934x_mbhc_request_micbias(struct snd_soc_component *component,
  2143. int micb_num, int req)
  2144. {
  2145. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  2146. int ret;
  2147. if (req == MICB_ENABLE)
  2148. __wcd934x_cdc_mclk_enable(wcd, true);
  2149. ret = wcd934x_micbias_control(component, micb_num, req, false);
  2150. if (req == MICB_DISABLE)
  2151. __wcd934x_cdc_mclk_enable(wcd, false);
  2152. return ret;
  2153. }
  2154. static void wcd934x_mbhc_micb_ramp_control(struct snd_soc_component *component,
  2155. bool enable)
  2156. {
  2157. if (enable) {
  2158. snd_soc_component_write_field(component, WCD934X_ANA_MICB2_RAMP,
  2159. WCD934X_RAMP_SHIFT_CTRL_MASK, 0x3);
  2160. snd_soc_component_write_field(component, WCD934X_ANA_MICB2_RAMP,
  2161. WCD934X_RAMP_EN_MASK, 1);
  2162. } else {
  2163. snd_soc_component_write_field(component, WCD934X_ANA_MICB2_RAMP,
  2164. WCD934X_RAMP_EN_MASK, 0);
  2165. snd_soc_component_write_field(component, WCD934X_ANA_MICB2_RAMP,
  2166. WCD934X_RAMP_SHIFT_CTRL_MASK, 0);
  2167. }
  2168. }
  2169. static int wcd934x_get_micb_vout_ctl_val(u32 micb_mv)
  2170. {
  2171. /* min micbias voltage is 1V and maximum is 2.85V */
  2172. if (micb_mv < 1000 || micb_mv > 2850)
  2173. return -EINVAL;
  2174. return (micb_mv - 1000) / 50;
  2175. }
  2176. static int wcd934x_mbhc_micb_adjust_voltage(struct snd_soc_component *component,
  2177. int req_volt, int micb_num)
  2178. {
  2179. struct wcd934x_codec *wcd934x = snd_soc_component_get_drvdata(component);
  2180. int cur_vout_ctl, req_vout_ctl, micb_reg, micb_en, ret = 0;
  2181. switch (micb_num) {
  2182. case MIC_BIAS_1:
  2183. micb_reg = WCD934X_ANA_MICB1;
  2184. break;
  2185. case MIC_BIAS_2:
  2186. micb_reg = WCD934X_ANA_MICB2;
  2187. break;
  2188. case MIC_BIAS_3:
  2189. micb_reg = WCD934X_ANA_MICB3;
  2190. break;
  2191. case MIC_BIAS_4:
  2192. micb_reg = WCD934X_ANA_MICB4;
  2193. break;
  2194. default:
  2195. return -EINVAL;
  2196. }
  2197. mutex_lock(&wcd934x->micb_lock);
  2198. /*
  2199. * If requested micbias voltage is same as current micbias
  2200. * voltage, then just return. Otherwise, adjust voltage as
  2201. * per requested value. If micbias is already enabled, then
  2202. * to avoid slow micbias ramp-up or down enable pull-up
  2203. * momentarily, change the micbias value and then re-enable
  2204. * micbias.
  2205. */
  2206. micb_en = snd_soc_component_read_field(component, micb_reg,
  2207. WCD934X_ANA_MICB_EN_MASK);
  2208. cur_vout_ctl = snd_soc_component_read_field(component, micb_reg,
  2209. WCD934X_MICB_VAL_MASK);
  2210. req_vout_ctl = wcd934x_get_micb_vout_ctl_val(req_volt);
  2211. if (req_vout_ctl < 0) {
  2212. ret = -EINVAL;
  2213. goto exit;
  2214. }
  2215. if (cur_vout_ctl == req_vout_ctl) {
  2216. ret = 0;
  2217. goto exit;
  2218. }
  2219. if (micb_en == WCD934X_MICB_ENABLE)
  2220. snd_soc_component_write_field(component, micb_reg,
  2221. WCD934X_ANA_MICB_EN_MASK,
  2222. WCD934X_MICB_PULL_UP);
  2223. snd_soc_component_write_field(component, micb_reg,
  2224. WCD934X_MICB_VAL_MASK,
  2225. req_vout_ctl);
  2226. if (micb_en == WCD934X_MICB_ENABLE) {
  2227. snd_soc_component_write_field(component, micb_reg,
  2228. WCD934X_ANA_MICB_EN_MASK,
  2229. WCD934X_MICB_ENABLE);
  2230. /*
  2231. * Add 2ms delay as per HW requirement after enabling
  2232. * micbias
  2233. */
  2234. usleep_range(2000, 2100);
  2235. }
  2236. exit:
  2237. mutex_unlock(&wcd934x->micb_lock);
  2238. return ret;
  2239. }
  2240. static int wcd934x_mbhc_micb_ctrl_threshold_mic(struct snd_soc_component *component,
  2241. int micb_num, bool req_en)
  2242. {
  2243. struct wcd934x_codec *wcd934x = snd_soc_component_get_drvdata(component);
  2244. int rc, micb_mv;
  2245. if (micb_num != MIC_BIAS_2)
  2246. return -EINVAL;
  2247. /*
  2248. * If device tree micbias level is already above the minimum
  2249. * voltage needed to detect threshold microphone, then do
  2250. * not change the micbias, just return.
  2251. */
  2252. if (wcd934x->micb2_mv >= WCD_MBHC_THR_HS_MICB_MV)
  2253. return 0;
  2254. micb_mv = req_en ? WCD_MBHC_THR_HS_MICB_MV : wcd934x->micb2_mv;
  2255. rc = wcd934x_mbhc_micb_adjust_voltage(component, micb_mv, MIC_BIAS_2);
  2256. return rc;
  2257. }
  2258. static inline void wcd934x_mbhc_get_result_params(struct wcd934x_codec *wcd934x,
  2259. s16 *d1_a, u16 noff,
  2260. int32_t *zdet)
  2261. {
  2262. int i;
  2263. int val, val1;
  2264. s16 c1;
  2265. s32 x1, d1;
  2266. int32_t denom;
  2267. int minCode_param[] = {
  2268. 3277, 1639, 820, 410, 205, 103, 52, 26
  2269. };
  2270. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x20, 0x20);
  2271. for (i = 0; i < WCD934X_ZDET_NUM_MEASUREMENTS; i++) {
  2272. regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_2, &val);
  2273. if (val & 0x80)
  2274. break;
  2275. }
  2276. val = val << 0x8;
  2277. regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_1, &val1);
  2278. val |= val1;
  2279. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x20, 0x00);
  2280. x1 = WCD934X_MBHC_GET_X1(val);
  2281. c1 = WCD934X_MBHC_GET_C1(val);
  2282. /* If ramp is not complete, give additional 5ms */
  2283. if ((c1 < 2) && x1)
  2284. usleep_range(5000, 5050);
  2285. if (!c1 || !x1) {
  2286. dev_err(wcd934x->dev, "%s: Impedance detect ramp error, c1=%d, x1=0x%x\n",
  2287. __func__, c1, x1);
  2288. goto ramp_down;
  2289. }
  2290. d1 = d1_a[c1];
  2291. denom = (x1 * d1) - (1 << (14 - noff));
  2292. if (denom > 0)
  2293. *zdet = (WCD934X_MBHC_ZDET_CONST * 1000) / denom;
  2294. else if (x1 < minCode_param[noff])
  2295. *zdet = WCD934X_ZDET_FLOATING_IMPEDANCE;
  2296. dev_info(wcd934x->dev, "%s: d1=%d, c1=%d, x1=0x%x, z_val=%d(milliOhm)\n",
  2297. __func__, d1, c1, x1, *zdet);
  2298. ramp_down:
  2299. i = 0;
  2300. while (x1) {
  2301. regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_1, &val);
  2302. regmap_read(wcd934x->regmap, WCD934X_ANA_MBHC_RESULT_2, &val1);
  2303. val = val << 0x08;
  2304. val |= val1;
  2305. x1 = WCD934X_MBHC_GET_X1(val);
  2306. i++;
  2307. if (i == WCD934X_ZDET_NUM_MEASUREMENTS)
  2308. break;
  2309. }
  2310. }
  2311. static void wcd934x_mbhc_zdet_ramp(struct snd_soc_component *component,
  2312. struct wcd934x_mbhc_zdet_param *zdet_param,
  2313. int32_t *zl, int32_t *zr, s16 *d1_a)
  2314. {
  2315. struct wcd934x_codec *wcd934x = dev_get_drvdata(component->dev);
  2316. int32_t zdet = 0;
  2317. snd_soc_component_write_field(component, WCD934X_MBHC_NEW_ZDET_ANA_CTL,
  2318. WCD934X_ZDET_MAXV_CTL_MASK, zdet_param->ldo_ctl);
  2319. snd_soc_component_update_bits(component, WCD934X_ANA_MBHC_BTN5,
  2320. WCD934X_VTH_MASK, zdet_param->btn5);
  2321. snd_soc_component_update_bits(component, WCD934X_ANA_MBHC_BTN6,
  2322. WCD934X_VTH_MASK, zdet_param->btn6);
  2323. snd_soc_component_update_bits(component, WCD934X_ANA_MBHC_BTN7,
  2324. WCD934X_VTH_MASK, zdet_param->btn7);
  2325. snd_soc_component_write_field(component, WCD934X_MBHC_NEW_ZDET_ANA_CTL,
  2326. WCD934X_ZDET_RANGE_CTL_MASK, zdet_param->noff);
  2327. snd_soc_component_update_bits(component, WCD934X_MBHC_NEW_ZDET_RAMP_CTL,
  2328. 0x0F, zdet_param->nshift);
  2329. if (!zl)
  2330. goto z_right;
  2331. /* Start impedance measurement for HPH_L */
  2332. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x80, 0x80);
  2333. wcd934x_mbhc_get_result_params(wcd934x, d1_a, zdet_param->noff, &zdet);
  2334. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x80, 0x00);
  2335. *zl = zdet;
  2336. z_right:
  2337. if (!zr)
  2338. return;
  2339. /* Start impedance measurement for HPH_R */
  2340. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x40, 0x40);
  2341. wcd934x_mbhc_get_result_params(wcd934x, d1_a, zdet_param->noff, &zdet);
  2342. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ZDET, 0x40, 0x00);
  2343. *zr = zdet;
  2344. }
  2345. static inline void wcd934x_wcd_mbhc_qfuse_cal(struct snd_soc_component *component,
  2346. int32_t *z_val, int flag_l_r)
  2347. {
  2348. s16 q1;
  2349. int q1_cal;
  2350. if (*z_val < (WCD934X_ZDET_VAL_400/1000))
  2351. q1 = snd_soc_component_read(component,
  2352. WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 + (2 * flag_l_r));
  2353. else
  2354. q1 = snd_soc_component_read(component,
  2355. WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 + (2 * flag_l_r));
  2356. if (q1 & 0x80)
  2357. q1_cal = (10000 - ((q1 & 0x7F) * 25));
  2358. else
  2359. q1_cal = (10000 + (q1 * 25));
  2360. if (q1_cal > 0)
  2361. *z_val = ((*z_val) * 10000) / q1_cal;
  2362. }
  2363. static void wcd934x_wcd_mbhc_calc_impedance(struct snd_soc_component *component,
  2364. uint32_t *zl, uint32_t *zr)
  2365. {
  2366. struct wcd934x_codec *wcd934x = dev_get_drvdata(component->dev);
  2367. s16 reg0, reg1, reg2, reg3, reg4;
  2368. int32_t z1L, z1R, z1Ls;
  2369. int zMono, z_diff1, z_diff2;
  2370. bool is_fsm_disable = false;
  2371. struct wcd934x_mbhc_zdet_param zdet_param[] = {
  2372. {4, 0, 4, 0x08, 0x14, 0x18}, /* < 32ohm */
  2373. {2, 0, 3, 0x18, 0x7C, 0x90}, /* 32ohm < Z < 400ohm */
  2374. {1, 4, 5, 0x18, 0x7C, 0x90}, /* 400ohm < Z < 1200ohm */
  2375. {1, 6, 7, 0x18, 0x7C, 0x90}, /* >1200ohm */
  2376. };
  2377. struct wcd934x_mbhc_zdet_param *zdet_param_ptr = NULL;
  2378. s16 d1_a[][4] = {
  2379. {0, 30, 90, 30},
  2380. {0, 30, 30, 5},
  2381. {0, 30, 30, 5},
  2382. {0, 30, 30, 5},
  2383. };
  2384. s16 *d1 = NULL;
  2385. reg0 = snd_soc_component_read(component, WCD934X_ANA_MBHC_BTN5);
  2386. reg1 = snd_soc_component_read(component, WCD934X_ANA_MBHC_BTN6);
  2387. reg2 = snd_soc_component_read(component, WCD934X_ANA_MBHC_BTN7);
  2388. reg3 = snd_soc_component_read(component, WCD934X_MBHC_CTL_CLK);
  2389. reg4 = snd_soc_component_read(component, WCD934X_MBHC_NEW_ZDET_ANA_CTL);
  2390. if (snd_soc_component_read(component, WCD934X_ANA_MBHC_ELECT) & 0x80) {
  2391. is_fsm_disable = true;
  2392. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ELECT, 0x80, 0x00);
  2393. }
  2394. /* For NO-jack, disable L_DET_EN before Z-det measurements */
  2395. if (wcd934x->mbhc_cfg.hphl_swh)
  2396. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x80, 0x00);
  2397. /* Turn off 100k pull down on HPHL */
  2398. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x01, 0x00);
  2399. /* First get impedance on Left */
  2400. d1 = d1_a[1];
  2401. zdet_param_ptr = &zdet_param[1];
  2402. wcd934x_mbhc_zdet_ramp(component, zdet_param_ptr, &z1L, NULL, d1);
  2403. if (!WCD934X_MBHC_IS_SECOND_RAMP_REQUIRED(z1L))
  2404. goto left_ch_impedance;
  2405. /* Second ramp for left ch */
  2406. if (z1L < WCD934X_ZDET_VAL_32) {
  2407. zdet_param_ptr = &zdet_param[0];
  2408. d1 = d1_a[0];
  2409. } else if ((z1L > WCD934X_ZDET_VAL_400) &&
  2410. (z1L <= WCD934X_ZDET_VAL_1200)) {
  2411. zdet_param_ptr = &zdet_param[2];
  2412. d1 = d1_a[2];
  2413. } else if (z1L > WCD934X_ZDET_VAL_1200) {
  2414. zdet_param_ptr = &zdet_param[3];
  2415. d1 = d1_a[3];
  2416. }
  2417. wcd934x_mbhc_zdet_ramp(component, zdet_param_ptr, &z1L, NULL, d1);
  2418. left_ch_impedance:
  2419. if ((z1L == WCD934X_ZDET_FLOATING_IMPEDANCE) ||
  2420. (z1L > WCD934X_ZDET_VAL_100K)) {
  2421. *zl = WCD934X_ZDET_FLOATING_IMPEDANCE;
  2422. zdet_param_ptr = &zdet_param[1];
  2423. d1 = d1_a[1];
  2424. } else {
  2425. *zl = z1L/1000;
  2426. wcd934x_wcd_mbhc_qfuse_cal(component, zl, 0);
  2427. }
  2428. dev_info(component->dev, "%s: impedance on HPH_L = %d(ohms)\n",
  2429. __func__, *zl);
  2430. /* Start of right impedance ramp and calculation */
  2431. wcd934x_mbhc_zdet_ramp(component, zdet_param_ptr, NULL, &z1R, d1);
  2432. if (WCD934X_MBHC_IS_SECOND_RAMP_REQUIRED(z1R)) {
  2433. if (((z1R > WCD934X_ZDET_VAL_1200) &&
  2434. (zdet_param_ptr->noff == 0x6)) ||
  2435. ((*zl) != WCD934X_ZDET_FLOATING_IMPEDANCE))
  2436. goto right_ch_impedance;
  2437. /* Second ramp for right ch */
  2438. if (z1R < WCD934X_ZDET_VAL_32) {
  2439. zdet_param_ptr = &zdet_param[0];
  2440. d1 = d1_a[0];
  2441. } else if ((z1R > WCD934X_ZDET_VAL_400) &&
  2442. (z1R <= WCD934X_ZDET_VAL_1200)) {
  2443. zdet_param_ptr = &zdet_param[2];
  2444. d1 = d1_a[2];
  2445. } else if (z1R > WCD934X_ZDET_VAL_1200) {
  2446. zdet_param_ptr = &zdet_param[3];
  2447. d1 = d1_a[3];
  2448. }
  2449. wcd934x_mbhc_zdet_ramp(component, zdet_param_ptr, NULL, &z1R, d1);
  2450. }
  2451. right_ch_impedance:
  2452. if ((z1R == WCD934X_ZDET_FLOATING_IMPEDANCE) ||
  2453. (z1R > WCD934X_ZDET_VAL_100K)) {
  2454. *zr = WCD934X_ZDET_FLOATING_IMPEDANCE;
  2455. } else {
  2456. *zr = z1R/1000;
  2457. wcd934x_wcd_mbhc_qfuse_cal(component, zr, 1);
  2458. }
  2459. dev_err(component->dev, "%s: impedance on HPH_R = %d(ohms)\n",
  2460. __func__, *zr);
  2461. /* Mono/stereo detection */
  2462. if ((*zl == WCD934X_ZDET_FLOATING_IMPEDANCE) &&
  2463. (*zr == WCD934X_ZDET_FLOATING_IMPEDANCE)) {
  2464. dev_dbg(component->dev,
  2465. "%s: plug type is invalid or extension cable\n",
  2466. __func__);
  2467. goto zdet_complete;
  2468. }
  2469. if ((*zl == WCD934X_ZDET_FLOATING_IMPEDANCE) ||
  2470. (*zr == WCD934X_ZDET_FLOATING_IMPEDANCE) ||
  2471. ((*zl < WCD_MONO_HS_MIN_THR) && (*zr > WCD_MONO_HS_MIN_THR)) ||
  2472. ((*zl > WCD_MONO_HS_MIN_THR) && (*zr < WCD_MONO_HS_MIN_THR))) {
  2473. dev_dbg(component->dev,
  2474. "%s: Mono plug type with one ch floating or shorted to GND\n",
  2475. __func__);
  2476. wcd_mbhc_set_hph_type(wcd934x->mbhc, WCD_MBHC_HPH_MONO);
  2477. goto zdet_complete;
  2478. }
  2479. snd_soc_component_write_field(component, WCD934X_HPH_R_ATEST,
  2480. WCD934X_HPHPA_GND_OVR_MASK, 1);
  2481. snd_soc_component_write_field(component, WCD934X_HPH_PA_CTL2,
  2482. WCD934X_HPHPA_GND_R_MASK, 1);
  2483. if (*zl < (WCD934X_ZDET_VAL_32/1000))
  2484. wcd934x_mbhc_zdet_ramp(component, &zdet_param[0], &z1Ls, NULL, d1);
  2485. else
  2486. wcd934x_mbhc_zdet_ramp(component, &zdet_param[1], &z1Ls, NULL, d1);
  2487. snd_soc_component_write_field(component, WCD934X_HPH_PA_CTL2,
  2488. WCD934X_HPHPA_GND_R_MASK, 0);
  2489. snd_soc_component_write_field(component, WCD934X_HPH_R_ATEST,
  2490. WCD934X_HPHPA_GND_OVR_MASK, 0);
  2491. z1Ls /= 1000;
  2492. wcd934x_wcd_mbhc_qfuse_cal(component, &z1Ls, 0);
  2493. /* Parallel of left Z and 9 ohm pull down resistor */
  2494. zMono = ((*zl) * 9) / ((*zl) + 9);
  2495. z_diff1 = (z1Ls > zMono) ? (z1Ls - zMono) : (zMono - z1Ls);
  2496. z_diff2 = ((*zl) > z1Ls) ? ((*zl) - z1Ls) : (z1Ls - (*zl));
  2497. if ((z_diff1 * (*zl + z1Ls)) > (z_diff2 * (z1Ls + zMono))) {
  2498. dev_err(component->dev, "%s: stereo plug type detected\n",
  2499. __func__);
  2500. wcd_mbhc_set_hph_type(wcd934x->mbhc, WCD_MBHC_HPH_STEREO);
  2501. } else {
  2502. dev_err(component->dev, "%s: MONO plug type detected\n",
  2503. __func__);
  2504. wcd_mbhc_set_hph_type(wcd934x->mbhc, WCD_MBHC_HPH_MONO);
  2505. }
  2506. zdet_complete:
  2507. snd_soc_component_write(component, WCD934X_ANA_MBHC_BTN5, reg0);
  2508. snd_soc_component_write(component, WCD934X_ANA_MBHC_BTN6, reg1);
  2509. snd_soc_component_write(component, WCD934X_ANA_MBHC_BTN7, reg2);
  2510. /* Turn on 100k pull down on HPHL */
  2511. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x01, 0x01);
  2512. /* For NO-jack, re-enable L_DET_EN after Z-det measurements */
  2513. if (wcd934x->mbhc_cfg.hphl_swh)
  2514. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_MECH, 0x80, 0x80);
  2515. snd_soc_component_write(component, WCD934X_MBHC_NEW_ZDET_ANA_CTL, reg4);
  2516. snd_soc_component_write(component, WCD934X_MBHC_CTL_CLK, reg3);
  2517. if (is_fsm_disable)
  2518. regmap_update_bits(wcd934x->regmap, WCD934X_ANA_MBHC_ELECT, 0x80, 0x80);
  2519. }
  2520. static void wcd934x_mbhc_gnd_det_ctrl(struct snd_soc_component *component,
  2521. bool enable)
  2522. {
  2523. if (enable) {
  2524. snd_soc_component_write_field(component, WCD934X_ANA_MBHC_MECH,
  2525. WCD934X_MBHC_HSG_PULLUP_COMP_EN, 1);
  2526. snd_soc_component_write_field(component, WCD934X_ANA_MBHC_MECH,
  2527. WCD934X_MBHC_GND_DET_EN_MASK, 1);
  2528. } else {
  2529. snd_soc_component_write_field(component, WCD934X_ANA_MBHC_MECH,
  2530. WCD934X_MBHC_GND_DET_EN_MASK, 0);
  2531. snd_soc_component_write_field(component, WCD934X_ANA_MBHC_MECH,
  2532. WCD934X_MBHC_HSG_PULLUP_COMP_EN, 0);
  2533. }
  2534. }
  2535. static void wcd934x_mbhc_hph_pull_down_ctrl(struct snd_soc_component *component,
  2536. bool enable)
  2537. {
  2538. snd_soc_component_write_field(component, WCD934X_HPH_PA_CTL2,
  2539. WCD934X_HPHPA_GND_R_MASK, enable);
  2540. snd_soc_component_write_field(component, WCD934X_HPH_PA_CTL2,
  2541. WCD934X_HPHPA_GND_L_MASK, enable);
  2542. }
  2543. static const struct wcd_mbhc_cb mbhc_cb = {
  2544. .clk_setup = wcd934x_mbhc_clk_setup,
  2545. .mbhc_bias = wcd934x_mbhc_mbhc_bias_control,
  2546. .set_btn_thr = wcd934x_mbhc_program_btn_thr,
  2547. .micbias_enable_status = wcd934x_mbhc_micb_en_status,
  2548. .hph_pull_up_control = wcd934x_mbhc_hph_l_pull_up_control,
  2549. .mbhc_micbias_control = wcd934x_mbhc_request_micbias,
  2550. .mbhc_micb_ramp_control = wcd934x_mbhc_micb_ramp_control,
  2551. .mbhc_micb_ctrl_thr_mic = wcd934x_mbhc_micb_ctrl_threshold_mic,
  2552. .compute_impedance = wcd934x_wcd_mbhc_calc_impedance,
  2553. .mbhc_gnd_det_ctrl = wcd934x_mbhc_gnd_det_ctrl,
  2554. .hph_pull_down_ctrl = wcd934x_mbhc_hph_pull_down_ctrl,
  2555. };
  2556. static int wcd934x_get_hph_type(struct snd_kcontrol *kcontrol,
  2557. struct snd_ctl_elem_value *ucontrol)
  2558. {
  2559. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2560. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
  2561. ucontrol->value.integer.value[0] = wcd_mbhc_get_hph_type(wcd->mbhc);
  2562. return 0;
  2563. }
  2564. static int wcd934x_hph_impedance_get(struct snd_kcontrol *kcontrol,
  2565. struct snd_ctl_elem_value *ucontrol)
  2566. {
  2567. uint32_t zl, zr;
  2568. bool hphr;
  2569. struct soc_mixer_control *mc;
  2570. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  2571. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
  2572. mc = (struct soc_mixer_control *)(kcontrol->private_value);
  2573. hphr = mc->shift;
  2574. wcd_mbhc_get_impedance(wcd->mbhc, &zl, &zr);
  2575. dev_dbg(component->dev, "%s: zl=%u(ohms), zr=%u(ohms)\n", __func__, zl, zr);
  2576. ucontrol->value.integer.value[0] = hphr ? zr : zl;
  2577. return 0;
  2578. }
  2579. static const struct snd_kcontrol_new hph_type_detect_controls[] = {
  2580. SOC_SINGLE_EXT("HPH Type", 0, 0, WCD_MBHC_HPH_STEREO, 0,
  2581. wcd934x_get_hph_type, NULL),
  2582. };
  2583. static const struct snd_kcontrol_new impedance_detect_controls[] = {
  2584. SOC_SINGLE_EXT("HPHL Impedance", 0, 0, INT_MAX, 0,
  2585. wcd934x_hph_impedance_get, NULL),
  2586. SOC_SINGLE_EXT("HPHR Impedance", 0, 1, INT_MAX, 0,
  2587. wcd934x_hph_impedance_get, NULL),
  2588. };
  2589. static int wcd934x_mbhc_init(struct snd_soc_component *component)
  2590. {
  2591. struct wcd934x_ddata *data = dev_get_drvdata(component->dev->parent);
  2592. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
  2593. struct wcd_mbhc_intr *intr_ids = &wcd->intr_ids;
  2594. intr_ids->mbhc_sw_intr = regmap_irq_get_virq(data->irq_data,
  2595. WCD934X_IRQ_MBHC_SW_DET);
  2596. intr_ids->mbhc_btn_press_intr = regmap_irq_get_virq(data->irq_data,
  2597. WCD934X_IRQ_MBHC_BUTTON_PRESS_DET);
  2598. intr_ids->mbhc_btn_release_intr = regmap_irq_get_virq(data->irq_data,
  2599. WCD934X_IRQ_MBHC_BUTTON_RELEASE_DET);
  2600. intr_ids->mbhc_hs_ins_intr = regmap_irq_get_virq(data->irq_data,
  2601. WCD934X_IRQ_MBHC_ELECT_INS_REM_LEG_DET);
  2602. intr_ids->mbhc_hs_rem_intr = regmap_irq_get_virq(data->irq_data,
  2603. WCD934X_IRQ_MBHC_ELECT_INS_REM_DET);
  2604. intr_ids->hph_left_ocp = regmap_irq_get_virq(data->irq_data,
  2605. WCD934X_IRQ_HPH_PA_OCPL_FAULT);
  2606. intr_ids->hph_right_ocp = regmap_irq_get_virq(data->irq_data,
  2607. WCD934X_IRQ_HPH_PA_OCPR_FAULT);
  2608. wcd->mbhc = wcd_mbhc_init(component, &mbhc_cb, intr_ids, wcd_mbhc_fields, true);
  2609. if (IS_ERR(wcd->mbhc)) {
  2610. wcd->mbhc = NULL;
  2611. return -EINVAL;
  2612. }
  2613. snd_soc_add_component_controls(component, impedance_detect_controls,
  2614. ARRAY_SIZE(impedance_detect_controls));
  2615. snd_soc_add_component_controls(component, hph_type_detect_controls,
  2616. ARRAY_SIZE(hph_type_detect_controls));
  2617. return 0;
  2618. }
  2619. static void wcd934x_mbhc_deinit(struct snd_soc_component *component)
  2620. {
  2621. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(component);
  2622. if (!wcd->mbhc)
  2623. return;
  2624. wcd_mbhc_deinit(wcd->mbhc);
  2625. }
  2626. static int wcd934x_comp_probe(struct snd_soc_component *component)
  2627. {
  2628. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  2629. int i;
  2630. snd_soc_component_init_regmap(component, wcd->regmap);
  2631. wcd->component = component;
  2632. /* Class-H Init*/
  2633. wcd->clsh_ctrl = wcd_clsh_ctrl_alloc(component, wcd->version);
  2634. if (IS_ERR(wcd->clsh_ctrl))
  2635. return PTR_ERR(wcd->clsh_ctrl);
  2636. /* Default HPH Mode to Class-H Low HiFi */
  2637. wcd->hph_mode = CLS_H_LOHIFI;
  2638. wcd934x_comp_init(component);
  2639. for (i = 0; i < NUM_CODEC_DAIS; i++)
  2640. INIT_LIST_HEAD(&wcd->dai[i].slim_ch_list);
  2641. wcd934x_init_dmic(component);
  2642. if (wcd934x_mbhc_init(component))
  2643. dev_err(component->dev, "Failed to Initialize MBHC\n");
  2644. return 0;
  2645. }
  2646. static void wcd934x_comp_remove(struct snd_soc_component *comp)
  2647. {
  2648. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  2649. wcd934x_mbhc_deinit(comp);
  2650. wcd_clsh_ctrl_free(wcd->clsh_ctrl);
  2651. }
  2652. static int wcd934x_comp_set_sysclk(struct snd_soc_component *comp,
  2653. int clk_id, int source,
  2654. unsigned int freq, int dir)
  2655. {
  2656. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  2657. int val = WCD934X_CODEC_RPM_CLK_MCLK_CFG_9P6MHZ;
  2658. wcd->rate = freq;
  2659. if (wcd->rate == WCD934X_MCLK_CLK_12P288MHZ)
  2660. val = WCD934X_CODEC_RPM_CLK_MCLK_CFG_12P288MHZ;
  2661. snd_soc_component_update_bits(comp, WCD934X_CODEC_RPM_CLK_MCLK_CFG,
  2662. WCD934X_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
  2663. val);
  2664. return clk_set_rate(wcd->extclk, freq);
  2665. }
  2666. static uint32_t get_iir_band_coeff(struct snd_soc_component *component,
  2667. int iir_idx, int band_idx, int coeff_idx)
  2668. {
  2669. u32 value = 0;
  2670. int reg, b2_reg;
  2671. /* Address does not automatically update if reading */
  2672. reg = WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx;
  2673. b2_reg = WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx;
  2674. snd_soc_component_write(component, reg,
  2675. ((band_idx * BAND_MAX + coeff_idx) *
  2676. sizeof(uint32_t)) & 0x7F);
  2677. value |= snd_soc_component_read(component, b2_reg);
  2678. snd_soc_component_write(component, reg,
  2679. ((band_idx * BAND_MAX + coeff_idx)
  2680. * sizeof(uint32_t) + 1) & 0x7F);
  2681. value |= (snd_soc_component_read(component, b2_reg) << 8);
  2682. snd_soc_component_write(component, reg,
  2683. ((band_idx * BAND_MAX + coeff_idx)
  2684. * sizeof(uint32_t) + 2) & 0x7F);
  2685. value |= (snd_soc_component_read(component, b2_reg) << 16);
  2686. snd_soc_component_write(component, reg,
  2687. ((band_idx * BAND_MAX + coeff_idx)
  2688. * sizeof(uint32_t) + 3) & 0x7F);
  2689. /* Mask bits top 2 bits since they are reserved */
  2690. value |= (snd_soc_component_read(component, b2_reg) << 24);
  2691. return value;
  2692. }
  2693. static void set_iir_band_coeff(struct snd_soc_component *component,
  2694. int iir_idx, int band_idx, uint32_t value)
  2695. {
  2696. int reg = WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B2_CTL + 16 * iir_idx;
  2697. snd_soc_component_write(component, reg, (value & 0xFF));
  2698. snd_soc_component_write(component, reg, (value >> 8) & 0xFF);
  2699. snd_soc_component_write(component, reg, (value >> 16) & 0xFF);
  2700. /* Mask top 2 bits, 7-8 are reserved */
  2701. snd_soc_component_write(component, reg, (value >> 24) & 0x3F);
  2702. }
  2703. static int wcd934x_put_iir_band_audio_mixer(
  2704. struct snd_kcontrol *kcontrol,
  2705. struct snd_ctl_elem_value *ucontrol)
  2706. {
  2707. struct snd_soc_component *component =
  2708. snd_soc_kcontrol_component(kcontrol);
  2709. struct wcd_iir_filter_ctl *ctl =
  2710. (struct wcd_iir_filter_ctl *)kcontrol->private_value;
  2711. struct soc_bytes_ext *params = &ctl->bytes_ext;
  2712. int iir_idx = ctl->iir_idx;
  2713. int band_idx = ctl->band_idx;
  2714. u32 coeff[BAND_MAX];
  2715. int reg = WCD934X_CDC_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx;
  2716. memcpy(&coeff[0], ucontrol->value.bytes.data, params->max);
  2717. /* Mask top bit it is reserved */
  2718. /* Updates addr automatically for each B2 write */
  2719. snd_soc_component_write(component, reg, (band_idx * BAND_MAX *
  2720. sizeof(uint32_t)) & 0x7F);
  2721. set_iir_band_coeff(component, iir_idx, band_idx, coeff[0]);
  2722. set_iir_band_coeff(component, iir_idx, band_idx, coeff[1]);
  2723. set_iir_band_coeff(component, iir_idx, band_idx, coeff[2]);
  2724. set_iir_band_coeff(component, iir_idx, band_idx, coeff[3]);
  2725. set_iir_band_coeff(component, iir_idx, band_idx, coeff[4]);
  2726. return 0;
  2727. }
  2728. static int wcd934x_get_iir_band_audio_mixer(struct snd_kcontrol *kcontrol,
  2729. struct snd_ctl_elem_value *ucontrol)
  2730. {
  2731. struct snd_soc_component *component =
  2732. snd_soc_kcontrol_component(kcontrol);
  2733. struct wcd_iir_filter_ctl *ctl =
  2734. (struct wcd_iir_filter_ctl *)kcontrol->private_value;
  2735. struct soc_bytes_ext *params = &ctl->bytes_ext;
  2736. int iir_idx = ctl->iir_idx;
  2737. int band_idx = ctl->band_idx;
  2738. u32 coeff[BAND_MAX];
  2739. coeff[0] = get_iir_band_coeff(component, iir_idx, band_idx, 0);
  2740. coeff[1] = get_iir_band_coeff(component, iir_idx, band_idx, 1);
  2741. coeff[2] = get_iir_band_coeff(component, iir_idx, band_idx, 2);
  2742. coeff[3] = get_iir_band_coeff(component, iir_idx, band_idx, 3);
  2743. coeff[4] = get_iir_band_coeff(component, iir_idx, band_idx, 4);
  2744. memcpy(ucontrol->value.bytes.data, &coeff[0], params->max);
  2745. return 0;
  2746. }
  2747. static int wcd934x_iir_filter_info(struct snd_kcontrol *kcontrol,
  2748. struct snd_ctl_elem_info *ucontrol)
  2749. {
  2750. struct wcd_iir_filter_ctl *ctl =
  2751. (struct wcd_iir_filter_ctl *)kcontrol->private_value;
  2752. struct soc_bytes_ext *params = &ctl->bytes_ext;
  2753. ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES;
  2754. ucontrol->count = params->max;
  2755. return 0;
  2756. }
  2757. static int wcd934x_compander_get(struct snd_kcontrol *kc,
  2758. struct snd_ctl_elem_value *ucontrol)
  2759. {
  2760. struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
  2761. int comp = ((struct soc_mixer_control *)kc->private_value)->shift;
  2762. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  2763. ucontrol->value.integer.value[0] = wcd->comp_enabled[comp];
  2764. return 0;
  2765. }
  2766. static int wcd934x_compander_set(struct snd_kcontrol *kc,
  2767. struct snd_ctl_elem_value *ucontrol)
  2768. {
  2769. struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
  2770. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  2771. int comp = ((struct soc_mixer_control *)kc->private_value)->shift;
  2772. int value = ucontrol->value.integer.value[0];
  2773. int sel;
  2774. if (wcd->comp_enabled[comp] == value)
  2775. return 0;
  2776. wcd->comp_enabled[comp] = value;
  2777. sel = value ? WCD934X_HPH_GAIN_SRC_SEL_COMPANDER :
  2778. WCD934X_HPH_GAIN_SRC_SEL_REGISTER;
  2779. /* Any specific register configuration for compander */
  2780. switch (comp) {
  2781. case COMPANDER_1:
  2782. /* Set Gain Source Select based on compander enable/disable */
  2783. snd_soc_component_update_bits(component, WCD934X_HPH_L_EN,
  2784. WCD934X_HPH_GAIN_SRC_SEL_MASK,
  2785. sel);
  2786. break;
  2787. case COMPANDER_2:
  2788. snd_soc_component_update_bits(component, WCD934X_HPH_R_EN,
  2789. WCD934X_HPH_GAIN_SRC_SEL_MASK,
  2790. sel);
  2791. break;
  2792. case COMPANDER_3:
  2793. case COMPANDER_4:
  2794. case COMPANDER_7:
  2795. case COMPANDER_8:
  2796. break;
  2797. default:
  2798. return 0;
  2799. }
  2800. return 1;
  2801. }
  2802. static int wcd934x_rx_hph_mode_get(struct snd_kcontrol *kc,
  2803. struct snd_ctl_elem_value *ucontrol)
  2804. {
  2805. struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
  2806. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  2807. ucontrol->value.enumerated.item[0] = wcd->hph_mode;
  2808. return 0;
  2809. }
  2810. static int wcd934x_rx_hph_mode_put(struct snd_kcontrol *kc,
  2811. struct snd_ctl_elem_value *ucontrol)
  2812. {
  2813. struct snd_soc_component *component = snd_soc_kcontrol_component(kc);
  2814. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  2815. u32 mode_val;
  2816. mode_val = ucontrol->value.enumerated.item[0];
  2817. if (mode_val == wcd->hph_mode)
  2818. return 0;
  2819. if (mode_val == 0) {
  2820. dev_err(wcd->dev, "Invalid HPH Mode, default to ClSH HiFi\n");
  2821. mode_val = CLS_H_LOHIFI;
  2822. }
  2823. wcd->hph_mode = mode_val;
  2824. return 1;
  2825. }
  2826. static int slim_rx_mux_get(struct snd_kcontrol *kc,
  2827. struct snd_ctl_elem_value *ucontrol)
  2828. {
  2829. struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc);
  2830. struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kc);
  2831. struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev);
  2832. ucontrol->value.enumerated.item[0] = wcd->rx_port_value[w->shift];
  2833. return 0;
  2834. }
  2835. static int slim_rx_mux_to_dai_id(int mux)
  2836. {
  2837. int aif_id;
  2838. switch (mux) {
  2839. case 1:
  2840. aif_id = AIF1_PB;
  2841. break;
  2842. case 2:
  2843. aif_id = AIF2_PB;
  2844. break;
  2845. case 3:
  2846. aif_id = AIF3_PB;
  2847. break;
  2848. case 4:
  2849. aif_id = AIF4_PB;
  2850. break;
  2851. default:
  2852. aif_id = -1;
  2853. break;
  2854. }
  2855. return aif_id;
  2856. }
  2857. static int slim_rx_mux_put(struct snd_kcontrol *kc,
  2858. struct snd_ctl_elem_value *ucontrol)
  2859. {
  2860. struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kc);
  2861. struct wcd934x_codec *wcd = dev_get_drvdata(w->dapm->dev);
  2862. struct soc_enum *e = (struct soc_enum *)kc->private_value;
  2863. struct snd_soc_dapm_update *update = NULL;
  2864. struct wcd934x_slim_ch *ch, *c;
  2865. u32 port_id = w->shift;
  2866. bool found = false;
  2867. int mux_idx;
  2868. int prev_mux_idx = wcd->rx_port_value[port_id];
  2869. int aif_id;
  2870. mux_idx = ucontrol->value.enumerated.item[0];
  2871. if (mux_idx == prev_mux_idx)
  2872. return 0;
  2873. switch(mux_idx) {
  2874. case 0:
  2875. aif_id = slim_rx_mux_to_dai_id(prev_mux_idx);
  2876. if (aif_id < 0)
  2877. return 0;
  2878. list_for_each_entry_safe(ch, c, &wcd->dai[aif_id].slim_ch_list, list) {
  2879. if (ch->port == port_id + WCD934X_RX_START) {
  2880. found = true;
  2881. list_del_init(&ch->list);
  2882. break;
  2883. }
  2884. }
  2885. if (!found)
  2886. return 0;
  2887. break;
  2888. case 1 ... 4:
  2889. aif_id = slim_rx_mux_to_dai_id(mux_idx);
  2890. if (aif_id < 0)
  2891. return 0;
  2892. if (list_empty(&wcd->rx_chs[port_id].list)) {
  2893. list_add_tail(&wcd->rx_chs[port_id].list,
  2894. &wcd->dai[aif_id].slim_ch_list);
  2895. } else {
  2896. dev_err(wcd->dev ,"SLIM_RX%d PORT is busy\n", port_id);
  2897. return 0;
  2898. }
  2899. break;
  2900. default:
  2901. dev_err(wcd->dev, "Unknown AIF %d\n", mux_idx);
  2902. goto err;
  2903. }
  2904. wcd->rx_port_value[port_id] = mux_idx;
  2905. snd_soc_dapm_mux_update_power(w->dapm, kc, wcd->rx_port_value[port_id],
  2906. e, update);
  2907. return 1;
  2908. err:
  2909. return -EINVAL;
  2910. }
  2911. static int wcd934x_int_dem_inp_mux_put(struct snd_kcontrol *kc,
  2912. struct snd_ctl_elem_value *ucontrol)
  2913. {
  2914. struct soc_enum *e = (struct soc_enum *)kc->private_value;
  2915. struct snd_soc_component *component;
  2916. int reg, val;
  2917. component = snd_soc_dapm_kcontrol_component(kc);
  2918. val = ucontrol->value.enumerated.item[0];
  2919. if (e->reg == WCD934X_CDC_RX0_RX_PATH_SEC0)
  2920. reg = WCD934X_CDC_RX0_RX_PATH_CFG0;
  2921. else if (e->reg == WCD934X_CDC_RX1_RX_PATH_SEC0)
  2922. reg = WCD934X_CDC_RX1_RX_PATH_CFG0;
  2923. else if (e->reg == WCD934X_CDC_RX2_RX_PATH_SEC0)
  2924. reg = WCD934X_CDC_RX2_RX_PATH_CFG0;
  2925. else
  2926. return -EINVAL;
  2927. /* Set Look Ahead Delay */
  2928. if (val)
  2929. snd_soc_component_update_bits(component, reg,
  2930. WCD934X_RX_DLY_ZN_EN_MASK,
  2931. WCD934X_RX_DLY_ZN_ENABLE);
  2932. else
  2933. snd_soc_component_update_bits(component, reg,
  2934. WCD934X_RX_DLY_ZN_EN_MASK,
  2935. WCD934X_RX_DLY_ZN_DISABLE);
  2936. return snd_soc_dapm_put_enum_double(kc, ucontrol);
  2937. }
  2938. static int wcd934x_dec_enum_put(struct snd_kcontrol *kcontrol,
  2939. struct snd_ctl_elem_value *ucontrol)
  2940. {
  2941. struct snd_soc_component *comp;
  2942. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  2943. unsigned int val;
  2944. u16 mic_sel_reg = 0;
  2945. u8 mic_sel;
  2946. comp = snd_soc_dapm_kcontrol_component(kcontrol);
  2947. val = ucontrol->value.enumerated.item[0];
  2948. if (val > e->items - 1)
  2949. return -EINVAL;
  2950. switch (e->reg) {
  2951. case WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1:
  2952. if (e->shift_l == 0)
  2953. mic_sel_reg = WCD934X_CDC_TX0_TX_PATH_CFG0;
  2954. else if (e->shift_l == 2)
  2955. mic_sel_reg = WCD934X_CDC_TX4_TX_PATH_CFG0;
  2956. else if (e->shift_l == 4)
  2957. mic_sel_reg = WCD934X_CDC_TX8_TX_PATH_CFG0;
  2958. break;
  2959. case WCD934X_CDC_TX_INP_MUX_ADC_MUX1_CFG1:
  2960. if (e->shift_l == 0)
  2961. mic_sel_reg = WCD934X_CDC_TX1_TX_PATH_CFG0;
  2962. else if (e->shift_l == 2)
  2963. mic_sel_reg = WCD934X_CDC_TX5_TX_PATH_CFG0;
  2964. break;
  2965. case WCD934X_CDC_TX_INP_MUX_ADC_MUX2_CFG1:
  2966. if (e->shift_l == 0)
  2967. mic_sel_reg = WCD934X_CDC_TX2_TX_PATH_CFG0;
  2968. else if (e->shift_l == 2)
  2969. mic_sel_reg = WCD934X_CDC_TX6_TX_PATH_CFG0;
  2970. break;
  2971. case WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1:
  2972. if (e->shift_l == 0)
  2973. mic_sel_reg = WCD934X_CDC_TX3_TX_PATH_CFG0;
  2974. else if (e->shift_l == 2)
  2975. mic_sel_reg = WCD934X_CDC_TX7_TX_PATH_CFG0;
  2976. break;
  2977. default:
  2978. dev_err(comp->dev, "%s: e->reg: 0x%x not expected\n",
  2979. __func__, e->reg);
  2980. return -EINVAL;
  2981. }
  2982. /* ADC: 0, DMIC: 1 */
  2983. mic_sel = val ? 0x0 : 0x1;
  2984. if (mic_sel_reg)
  2985. snd_soc_component_update_bits(comp, mic_sel_reg, BIT(7),
  2986. mic_sel << 7);
  2987. return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
  2988. }
  2989. static const struct snd_kcontrol_new rx_int0_2_mux =
  2990. SOC_DAPM_ENUM("RX INT0_2 MUX Mux", rx_int0_2_mux_chain_enum);
  2991. static const struct snd_kcontrol_new rx_int1_2_mux =
  2992. SOC_DAPM_ENUM("RX INT1_2 MUX Mux", rx_int1_2_mux_chain_enum);
  2993. static const struct snd_kcontrol_new rx_int2_2_mux =
  2994. SOC_DAPM_ENUM("RX INT2_2 MUX Mux", rx_int2_2_mux_chain_enum);
  2995. static const struct snd_kcontrol_new rx_int3_2_mux =
  2996. SOC_DAPM_ENUM("RX INT3_2 MUX Mux", rx_int3_2_mux_chain_enum);
  2997. static const struct snd_kcontrol_new rx_int4_2_mux =
  2998. SOC_DAPM_ENUM("RX INT4_2 MUX Mux", rx_int4_2_mux_chain_enum);
  2999. static const struct snd_kcontrol_new rx_int7_2_mux =
  3000. SOC_DAPM_ENUM("RX INT7_2 MUX Mux", rx_int7_2_mux_chain_enum);
  3001. static const struct snd_kcontrol_new rx_int8_2_mux =
  3002. SOC_DAPM_ENUM("RX INT8_2 MUX Mux", rx_int8_2_mux_chain_enum);
  3003. static const struct snd_kcontrol_new rx_int0_1_mix_inp0_mux =
  3004. SOC_DAPM_ENUM("RX INT0_1 MIX1 INP0 Mux", rx_int0_1_mix_inp0_chain_enum);
  3005. static const struct snd_kcontrol_new rx_int0_1_mix_inp1_mux =
  3006. SOC_DAPM_ENUM("RX INT0_1 MIX1 INP1 Mux", rx_int0_1_mix_inp1_chain_enum);
  3007. static const struct snd_kcontrol_new rx_int0_1_mix_inp2_mux =
  3008. SOC_DAPM_ENUM("RX INT0_1 MIX1 INP2 Mux", rx_int0_1_mix_inp2_chain_enum);
  3009. static const struct snd_kcontrol_new rx_int1_1_mix_inp0_mux =
  3010. SOC_DAPM_ENUM("RX INT1_1 MIX1 INP0 Mux", rx_int1_1_mix_inp0_chain_enum);
  3011. static const struct snd_kcontrol_new rx_int1_1_mix_inp1_mux =
  3012. SOC_DAPM_ENUM("RX INT1_1 MIX1 INP1 Mux", rx_int1_1_mix_inp1_chain_enum);
  3013. static const struct snd_kcontrol_new rx_int1_1_mix_inp2_mux =
  3014. SOC_DAPM_ENUM("RX INT1_1 MIX1 INP2 Mux", rx_int1_1_mix_inp2_chain_enum);
  3015. static const struct snd_kcontrol_new rx_int2_1_mix_inp0_mux =
  3016. SOC_DAPM_ENUM("RX INT2_1 MIX1 INP0 Mux", rx_int2_1_mix_inp0_chain_enum);
  3017. static const struct snd_kcontrol_new rx_int2_1_mix_inp1_mux =
  3018. SOC_DAPM_ENUM("RX INT2_1 MIX1 INP1 Mux", rx_int2_1_mix_inp1_chain_enum);
  3019. static const struct snd_kcontrol_new rx_int2_1_mix_inp2_mux =
  3020. SOC_DAPM_ENUM("RX INT2_1 MIX1 INP2 Mux", rx_int2_1_mix_inp2_chain_enum);
  3021. static const struct snd_kcontrol_new rx_int3_1_mix_inp0_mux =
  3022. SOC_DAPM_ENUM("RX INT3_1 MIX1 INP0 Mux", rx_int3_1_mix_inp0_chain_enum);
  3023. static const struct snd_kcontrol_new rx_int3_1_mix_inp1_mux =
  3024. SOC_DAPM_ENUM("RX INT3_1 MIX1 INP1 Mux", rx_int3_1_mix_inp1_chain_enum);
  3025. static const struct snd_kcontrol_new rx_int3_1_mix_inp2_mux =
  3026. SOC_DAPM_ENUM("RX INT3_1 MIX1 INP2 Mux", rx_int3_1_mix_inp2_chain_enum);
  3027. static const struct snd_kcontrol_new rx_int4_1_mix_inp0_mux =
  3028. SOC_DAPM_ENUM("RX INT4_1 MIX1 INP0 Mux", rx_int4_1_mix_inp0_chain_enum);
  3029. static const struct snd_kcontrol_new rx_int4_1_mix_inp1_mux =
  3030. SOC_DAPM_ENUM("RX INT4_1 MIX1 INP1 Mux", rx_int4_1_mix_inp1_chain_enum);
  3031. static const struct snd_kcontrol_new rx_int4_1_mix_inp2_mux =
  3032. SOC_DAPM_ENUM("RX INT4_1 MIX1 INP2 Mux", rx_int4_1_mix_inp2_chain_enum);
  3033. static const struct snd_kcontrol_new rx_int7_1_mix_inp0_mux =
  3034. SOC_DAPM_ENUM("RX INT7_1 MIX1 INP0 Mux", rx_int7_1_mix_inp0_chain_enum);
  3035. static const struct snd_kcontrol_new rx_int7_1_mix_inp1_mux =
  3036. SOC_DAPM_ENUM("RX INT7_1 MIX1 INP1 Mux", rx_int7_1_mix_inp1_chain_enum);
  3037. static const struct snd_kcontrol_new rx_int7_1_mix_inp2_mux =
  3038. SOC_DAPM_ENUM("RX INT7_1 MIX1 INP2 Mux", rx_int7_1_mix_inp2_chain_enum);
  3039. static const struct snd_kcontrol_new rx_int8_1_mix_inp0_mux =
  3040. SOC_DAPM_ENUM("RX INT8_1 MIX1 INP0 Mux", rx_int8_1_mix_inp0_chain_enum);
  3041. static const struct snd_kcontrol_new rx_int8_1_mix_inp1_mux =
  3042. SOC_DAPM_ENUM("RX INT8_1 MIX1 INP1 Mux", rx_int8_1_mix_inp1_chain_enum);
  3043. static const struct snd_kcontrol_new rx_int8_1_mix_inp2_mux =
  3044. SOC_DAPM_ENUM("RX INT8_1 MIX1 INP2 Mux", rx_int8_1_mix_inp2_chain_enum);
  3045. static const struct snd_kcontrol_new rx_int0_mix2_inp_mux =
  3046. SOC_DAPM_ENUM("RX INT0 MIX2 INP Mux", rx_int0_mix2_inp_mux_enum);
  3047. static const struct snd_kcontrol_new rx_int1_mix2_inp_mux =
  3048. SOC_DAPM_ENUM("RX INT1 MIX2 INP Mux", rx_int1_mix2_inp_mux_enum);
  3049. static const struct snd_kcontrol_new rx_int2_mix2_inp_mux =
  3050. SOC_DAPM_ENUM("RX INT2 MIX2 INP Mux", rx_int2_mix2_inp_mux_enum);
  3051. static const struct snd_kcontrol_new rx_int3_mix2_inp_mux =
  3052. SOC_DAPM_ENUM("RX INT3 MIX2 INP Mux", rx_int3_mix2_inp_mux_enum);
  3053. static const struct snd_kcontrol_new rx_int4_mix2_inp_mux =
  3054. SOC_DAPM_ENUM("RX INT4 MIX2 INP Mux", rx_int4_mix2_inp_mux_enum);
  3055. static const struct snd_kcontrol_new rx_int7_mix2_inp_mux =
  3056. SOC_DAPM_ENUM("RX INT7 MIX2 INP Mux", rx_int7_mix2_inp_mux_enum);
  3057. static const struct snd_kcontrol_new iir0_inp0_mux =
  3058. SOC_DAPM_ENUM("IIR0 INP0 Mux", iir0_inp0_mux_enum);
  3059. static const struct snd_kcontrol_new iir0_inp1_mux =
  3060. SOC_DAPM_ENUM("IIR0 INP1 Mux", iir0_inp1_mux_enum);
  3061. static const struct snd_kcontrol_new iir0_inp2_mux =
  3062. SOC_DAPM_ENUM("IIR0 INP2 Mux", iir0_inp2_mux_enum);
  3063. static const struct snd_kcontrol_new iir0_inp3_mux =
  3064. SOC_DAPM_ENUM("IIR0 INP3 Mux", iir0_inp3_mux_enum);
  3065. static const struct snd_kcontrol_new iir1_inp0_mux =
  3066. SOC_DAPM_ENUM("IIR1 INP0 Mux", iir1_inp0_mux_enum);
  3067. static const struct snd_kcontrol_new iir1_inp1_mux =
  3068. SOC_DAPM_ENUM("IIR1 INP1 Mux", iir1_inp1_mux_enum);
  3069. static const struct snd_kcontrol_new iir1_inp2_mux =
  3070. SOC_DAPM_ENUM("IIR1 INP2 Mux", iir1_inp2_mux_enum);
  3071. static const struct snd_kcontrol_new iir1_inp3_mux =
  3072. SOC_DAPM_ENUM("IIR1 INP3 Mux", iir1_inp3_mux_enum);
  3073. static const struct snd_kcontrol_new slim_rx_mux[WCD934X_RX_MAX] = {
  3074. SOC_DAPM_ENUM_EXT("SLIM RX0 Mux", slim_rx_mux_enum,
  3075. slim_rx_mux_get, slim_rx_mux_put),
  3076. SOC_DAPM_ENUM_EXT("SLIM RX1 Mux", slim_rx_mux_enum,
  3077. slim_rx_mux_get, slim_rx_mux_put),
  3078. SOC_DAPM_ENUM_EXT("SLIM RX2 Mux", slim_rx_mux_enum,
  3079. slim_rx_mux_get, slim_rx_mux_put),
  3080. SOC_DAPM_ENUM_EXT("SLIM RX3 Mux", slim_rx_mux_enum,
  3081. slim_rx_mux_get, slim_rx_mux_put),
  3082. SOC_DAPM_ENUM_EXT("SLIM RX4 Mux", slim_rx_mux_enum,
  3083. slim_rx_mux_get, slim_rx_mux_put),
  3084. SOC_DAPM_ENUM_EXT("SLIM RX5 Mux", slim_rx_mux_enum,
  3085. slim_rx_mux_get, slim_rx_mux_put),
  3086. SOC_DAPM_ENUM_EXT("SLIM RX6 Mux", slim_rx_mux_enum,
  3087. slim_rx_mux_get, slim_rx_mux_put),
  3088. SOC_DAPM_ENUM_EXT("SLIM RX7 Mux", slim_rx_mux_enum,
  3089. slim_rx_mux_get, slim_rx_mux_put),
  3090. };
  3091. static const struct snd_kcontrol_new rx_int1_asrc_switch[] = {
  3092. SOC_DAPM_SINGLE("HPHL Switch", SND_SOC_NOPM, 0, 1, 0),
  3093. };
  3094. static const struct snd_kcontrol_new rx_int2_asrc_switch[] = {
  3095. SOC_DAPM_SINGLE("HPHR Switch", SND_SOC_NOPM, 0, 1, 0),
  3096. };
  3097. static const struct snd_kcontrol_new rx_int3_asrc_switch[] = {
  3098. SOC_DAPM_SINGLE("LO1 Switch", SND_SOC_NOPM, 0, 1, 0),
  3099. };
  3100. static const struct snd_kcontrol_new rx_int4_asrc_switch[] = {
  3101. SOC_DAPM_SINGLE("LO2 Switch", SND_SOC_NOPM, 0, 1, 0),
  3102. };
  3103. static const struct snd_kcontrol_new rx_int0_dem_inp_mux =
  3104. SOC_DAPM_ENUM_EXT("RX INT0 DEM MUX Mux", rx_int0_dem_inp_mux_enum,
  3105. snd_soc_dapm_get_enum_double,
  3106. wcd934x_int_dem_inp_mux_put);
  3107. static const struct snd_kcontrol_new rx_int1_dem_inp_mux =
  3108. SOC_DAPM_ENUM_EXT("RX INT1 DEM MUX Mux", rx_int1_dem_inp_mux_enum,
  3109. snd_soc_dapm_get_enum_double,
  3110. wcd934x_int_dem_inp_mux_put);
  3111. static const struct snd_kcontrol_new rx_int2_dem_inp_mux =
  3112. SOC_DAPM_ENUM_EXT("RX INT2 DEM MUX Mux", rx_int2_dem_inp_mux_enum,
  3113. snd_soc_dapm_get_enum_double,
  3114. wcd934x_int_dem_inp_mux_put);
  3115. static const struct snd_kcontrol_new rx_int0_1_interp_mux =
  3116. SOC_DAPM_ENUM("RX INT0_1 INTERP Mux", rx_int0_1_interp_mux_enum);
  3117. static const struct snd_kcontrol_new rx_int1_1_interp_mux =
  3118. SOC_DAPM_ENUM("RX INT1_1 INTERP Mux", rx_int1_1_interp_mux_enum);
  3119. static const struct snd_kcontrol_new rx_int2_1_interp_mux =
  3120. SOC_DAPM_ENUM("RX INT2_1 INTERP Mux", rx_int2_1_interp_mux_enum);
  3121. static const struct snd_kcontrol_new rx_int3_1_interp_mux =
  3122. SOC_DAPM_ENUM("RX INT3_1 INTERP Mux", rx_int3_1_interp_mux_enum);
  3123. static const struct snd_kcontrol_new rx_int4_1_interp_mux =
  3124. SOC_DAPM_ENUM("RX INT4_1 INTERP Mux", rx_int4_1_interp_mux_enum);
  3125. static const struct snd_kcontrol_new rx_int7_1_interp_mux =
  3126. SOC_DAPM_ENUM("RX INT7_1 INTERP Mux", rx_int7_1_interp_mux_enum);
  3127. static const struct snd_kcontrol_new rx_int8_1_interp_mux =
  3128. SOC_DAPM_ENUM("RX INT8_1 INTERP Mux", rx_int8_1_interp_mux_enum);
  3129. static const struct snd_kcontrol_new rx_int0_2_interp_mux =
  3130. SOC_DAPM_ENUM("RX INT0_2 INTERP Mux", rx_int0_2_interp_mux_enum);
  3131. static const struct snd_kcontrol_new rx_int1_2_interp_mux =
  3132. SOC_DAPM_ENUM("RX INT1_2 INTERP Mux", rx_int1_2_interp_mux_enum);
  3133. static const struct snd_kcontrol_new rx_int2_2_interp_mux =
  3134. SOC_DAPM_ENUM("RX INT2_2 INTERP Mux", rx_int2_2_interp_mux_enum);
  3135. static const struct snd_kcontrol_new rx_int3_2_interp_mux =
  3136. SOC_DAPM_ENUM("RX INT3_2 INTERP Mux", rx_int3_2_interp_mux_enum);
  3137. static const struct snd_kcontrol_new rx_int4_2_interp_mux =
  3138. SOC_DAPM_ENUM("RX INT4_2 INTERP Mux", rx_int4_2_interp_mux_enum);
  3139. static const struct snd_kcontrol_new rx_int7_2_interp_mux =
  3140. SOC_DAPM_ENUM("RX INT7_2 INTERP Mux", rx_int7_2_interp_mux_enum);
  3141. static const struct snd_kcontrol_new rx_int8_2_interp_mux =
  3142. SOC_DAPM_ENUM("RX INT8_2 INTERP Mux", rx_int8_2_interp_mux_enum);
  3143. static const struct snd_kcontrol_new tx_dmic_mux0 =
  3144. SOC_DAPM_ENUM("DMIC MUX0 Mux", tx_dmic_mux0_enum);
  3145. static const struct snd_kcontrol_new tx_dmic_mux1 =
  3146. SOC_DAPM_ENUM("DMIC MUX1 Mux", tx_dmic_mux1_enum);
  3147. static const struct snd_kcontrol_new tx_dmic_mux2 =
  3148. SOC_DAPM_ENUM("DMIC MUX2 Mux", tx_dmic_mux2_enum);
  3149. static const struct snd_kcontrol_new tx_dmic_mux3 =
  3150. SOC_DAPM_ENUM("DMIC MUX3 Mux", tx_dmic_mux3_enum);
  3151. static const struct snd_kcontrol_new tx_dmic_mux4 =
  3152. SOC_DAPM_ENUM("DMIC MUX4 Mux", tx_dmic_mux4_enum);
  3153. static const struct snd_kcontrol_new tx_dmic_mux5 =
  3154. SOC_DAPM_ENUM("DMIC MUX5 Mux", tx_dmic_mux5_enum);
  3155. static const struct snd_kcontrol_new tx_dmic_mux6 =
  3156. SOC_DAPM_ENUM("DMIC MUX6 Mux", tx_dmic_mux6_enum);
  3157. static const struct snd_kcontrol_new tx_dmic_mux7 =
  3158. SOC_DAPM_ENUM("DMIC MUX7 Mux", tx_dmic_mux7_enum);
  3159. static const struct snd_kcontrol_new tx_dmic_mux8 =
  3160. SOC_DAPM_ENUM("DMIC MUX8 Mux", tx_dmic_mux8_enum);
  3161. static const struct snd_kcontrol_new tx_amic_mux0 =
  3162. SOC_DAPM_ENUM("AMIC MUX0 Mux", tx_amic_mux0_enum);
  3163. static const struct snd_kcontrol_new tx_amic_mux1 =
  3164. SOC_DAPM_ENUM("AMIC MUX1 Mux", tx_amic_mux1_enum);
  3165. static const struct snd_kcontrol_new tx_amic_mux2 =
  3166. SOC_DAPM_ENUM("AMIC MUX2 Mux", tx_amic_mux2_enum);
  3167. static const struct snd_kcontrol_new tx_amic_mux3 =
  3168. SOC_DAPM_ENUM("AMIC MUX3 Mux", tx_amic_mux3_enum);
  3169. static const struct snd_kcontrol_new tx_amic_mux4 =
  3170. SOC_DAPM_ENUM("AMIC MUX4 Mux", tx_amic_mux4_enum);
  3171. static const struct snd_kcontrol_new tx_amic_mux5 =
  3172. SOC_DAPM_ENUM("AMIC MUX5 Mux", tx_amic_mux5_enum);
  3173. static const struct snd_kcontrol_new tx_amic_mux6 =
  3174. SOC_DAPM_ENUM("AMIC MUX6 Mux", tx_amic_mux6_enum);
  3175. static const struct snd_kcontrol_new tx_amic_mux7 =
  3176. SOC_DAPM_ENUM("AMIC MUX7 Mux", tx_amic_mux7_enum);
  3177. static const struct snd_kcontrol_new tx_amic_mux8 =
  3178. SOC_DAPM_ENUM("AMIC MUX8 Mux", tx_amic_mux8_enum);
  3179. static const struct snd_kcontrol_new tx_amic4_5 =
  3180. SOC_DAPM_ENUM("AMIC4_5 SEL Mux", tx_amic4_5_enum);
  3181. static const struct snd_kcontrol_new tx_adc_mux0_mux =
  3182. SOC_DAPM_ENUM_EXT("ADC MUX0 Mux", tx_adc_mux0_enum,
  3183. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3184. static const struct snd_kcontrol_new tx_adc_mux1_mux =
  3185. SOC_DAPM_ENUM_EXT("ADC MUX1 Mux", tx_adc_mux1_enum,
  3186. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3187. static const struct snd_kcontrol_new tx_adc_mux2_mux =
  3188. SOC_DAPM_ENUM_EXT("ADC MUX2 Mux", tx_adc_mux2_enum,
  3189. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3190. static const struct snd_kcontrol_new tx_adc_mux3_mux =
  3191. SOC_DAPM_ENUM_EXT("ADC MUX3 Mux", tx_adc_mux3_enum,
  3192. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3193. static const struct snd_kcontrol_new tx_adc_mux4_mux =
  3194. SOC_DAPM_ENUM_EXT("ADC MUX4 Mux", tx_adc_mux4_enum,
  3195. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3196. static const struct snd_kcontrol_new tx_adc_mux5_mux =
  3197. SOC_DAPM_ENUM_EXT("ADC MUX5 Mux", tx_adc_mux5_enum,
  3198. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3199. static const struct snd_kcontrol_new tx_adc_mux6_mux =
  3200. SOC_DAPM_ENUM_EXT("ADC MUX6 Mux", tx_adc_mux6_enum,
  3201. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3202. static const struct snd_kcontrol_new tx_adc_mux7_mux =
  3203. SOC_DAPM_ENUM_EXT("ADC MUX7 Mux", tx_adc_mux7_enum,
  3204. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3205. static const struct snd_kcontrol_new tx_adc_mux8_mux =
  3206. SOC_DAPM_ENUM_EXT("ADC MUX8 Mux", tx_adc_mux8_enum,
  3207. snd_soc_dapm_get_enum_double, wcd934x_dec_enum_put);
  3208. static const struct snd_kcontrol_new cdc_if_tx0_mux =
  3209. SOC_DAPM_ENUM("CDC_IF TX0 MUX Mux", cdc_if_tx0_mux_enum);
  3210. static const struct snd_kcontrol_new cdc_if_tx1_mux =
  3211. SOC_DAPM_ENUM("CDC_IF TX1 MUX Mux", cdc_if_tx1_mux_enum);
  3212. static const struct snd_kcontrol_new cdc_if_tx2_mux =
  3213. SOC_DAPM_ENUM("CDC_IF TX2 MUX Mux", cdc_if_tx2_mux_enum);
  3214. static const struct snd_kcontrol_new cdc_if_tx3_mux =
  3215. SOC_DAPM_ENUM("CDC_IF TX3 MUX Mux", cdc_if_tx3_mux_enum);
  3216. static const struct snd_kcontrol_new cdc_if_tx4_mux =
  3217. SOC_DAPM_ENUM("CDC_IF TX4 MUX Mux", cdc_if_tx4_mux_enum);
  3218. static const struct snd_kcontrol_new cdc_if_tx5_mux =
  3219. SOC_DAPM_ENUM("CDC_IF TX5 MUX Mux", cdc_if_tx5_mux_enum);
  3220. static const struct snd_kcontrol_new cdc_if_tx6_mux =
  3221. SOC_DAPM_ENUM("CDC_IF TX6 MUX Mux", cdc_if_tx6_mux_enum);
  3222. static const struct snd_kcontrol_new cdc_if_tx7_mux =
  3223. SOC_DAPM_ENUM("CDC_IF TX7 MUX Mux", cdc_if_tx7_mux_enum);
  3224. static const struct snd_kcontrol_new cdc_if_tx8_mux =
  3225. SOC_DAPM_ENUM("CDC_IF TX8 MUX Mux", cdc_if_tx8_mux_enum);
  3226. static const struct snd_kcontrol_new cdc_if_tx9_mux =
  3227. SOC_DAPM_ENUM("CDC_IF TX9 MUX Mux", cdc_if_tx9_mux_enum);
  3228. static const struct snd_kcontrol_new cdc_if_tx10_mux =
  3229. SOC_DAPM_ENUM("CDC_IF TX10 MUX Mux", cdc_if_tx10_mux_enum);
  3230. static const struct snd_kcontrol_new cdc_if_tx11_mux =
  3231. SOC_DAPM_ENUM("CDC_IF TX11 MUX Mux", cdc_if_tx11_mux_enum);
  3232. static const struct snd_kcontrol_new cdc_if_tx11_inp1_mux =
  3233. SOC_DAPM_ENUM("CDC_IF TX11 INP1 MUX Mux", cdc_if_tx11_inp1_mux_enum);
  3234. static const struct snd_kcontrol_new cdc_if_tx13_mux =
  3235. SOC_DAPM_ENUM("CDC_IF TX13 MUX Mux", cdc_if_tx13_mux_enum);
  3236. static const struct snd_kcontrol_new cdc_if_tx13_inp1_mux =
  3237. SOC_DAPM_ENUM("CDC_IF TX13 INP1 MUX Mux", cdc_if_tx13_inp1_mux_enum);
  3238. static int slim_tx_mixer_get(struct snd_kcontrol *kc,
  3239. struct snd_ctl_elem_value *ucontrol)
  3240. {
  3241. struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kc);
  3242. struct wcd934x_codec *wcd = dev_get_drvdata(dapm->dev);
  3243. struct soc_mixer_control *mixer =
  3244. (struct soc_mixer_control *)kc->private_value;
  3245. int port_id = mixer->shift;
  3246. ucontrol->value.integer.value[0] = wcd->tx_port_value[port_id];
  3247. return 0;
  3248. }
  3249. static int slim_tx_mixer_put(struct snd_kcontrol *kc,
  3250. struct snd_ctl_elem_value *ucontrol)
  3251. {
  3252. struct snd_soc_dapm_widget *widget = snd_soc_dapm_kcontrol_widget(kc);
  3253. struct wcd934x_codec *wcd = dev_get_drvdata(widget->dapm->dev);
  3254. struct snd_soc_dapm_update *update = NULL;
  3255. struct soc_mixer_control *mixer =
  3256. (struct soc_mixer_control *)kc->private_value;
  3257. int enable = ucontrol->value.integer.value[0];
  3258. struct wcd934x_slim_ch *ch, *c;
  3259. int dai_id = widget->shift;
  3260. int port_id = mixer->shift;
  3261. /* only add to the list if value not set */
  3262. if (enable == wcd->tx_port_value[port_id])
  3263. return 0;
  3264. if (enable) {
  3265. if (list_empty(&wcd->tx_chs[port_id].list)) {
  3266. list_add_tail(&wcd->tx_chs[port_id].list,
  3267. &wcd->dai[dai_id].slim_ch_list);
  3268. } else {
  3269. dev_err(wcd->dev ,"SLIM_TX%d PORT is busy\n", port_id);
  3270. return 0;
  3271. }
  3272. } else {
  3273. bool found = false;
  3274. list_for_each_entry_safe(ch, c, &wcd->dai[dai_id].slim_ch_list, list) {
  3275. if (ch->port == port_id) {
  3276. found = true;
  3277. list_del_init(&wcd->tx_chs[port_id].list);
  3278. break;
  3279. }
  3280. }
  3281. if (!found)
  3282. return 0;
  3283. }
  3284. wcd->tx_port_value[port_id] = enable;
  3285. snd_soc_dapm_mixer_update_power(widget->dapm, kc, enable, update);
  3286. return 1;
  3287. }
  3288. static const struct snd_kcontrol_new aif1_slim_cap_mixer[] = {
  3289. SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD934X_TX0, 1, 0,
  3290. slim_tx_mixer_get, slim_tx_mixer_put),
  3291. SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0,
  3292. slim_tx_mixer_get, slim_tx_mixer_put),
  3293. SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD934X_TX2, 1, 0,
  3294. slim_tx_mixer_get, slim_tx_mixer_put),
  3295. SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD934X_TX3, 1, 0,
  3296. slim_tx_mixer_get, slim_tx_mixer_put),
  3297. SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD934X_TX4, 1, 0,
  3298. slim_tx_mixer_get, slim_tx_mixer_put),
  3299. SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD934X_TX5, 1, 0,
  3300. slim_tx_mixer_get, slim_tx_mixer_put),
  3301. SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD934X_TX6, 1, 0,
  3302. slim_tx_mixer_get, slim_tx_mixer_put),
  3303. SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD934X_TX7, 1, 0,
  3304. slim_tx_mixer_get, slim_tx_mixer_put),
  3305. SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD934X_TX8, 1, 0,
  3306. slim_tx_mixer_get, slim_tx_mixer_put),
  3307. SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD934X_TX9, 1, 0,
  3308. slim_tx_mixer_get, slim_tx_mixer_put),
  3309. SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD934X_TX10, 1, 0,
  3310. slim_tx_mixer_get, slim_tx_mixer_put),
  3311. SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD934X_TX11, 1, 0,
  3312. slim_tx_mixer_get, slim_tx_mixer_put),
  3313. SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD934X_TX13, 1, 0,
  3314. slim_tx_mixer_get, slim_tx_mixer_put),
  3315. };
  3316. static const struct snd_kcontrol_new aif2_slim_cap_mixer[] = {
  3317. SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD934X_TX0, 1, 0,
  3318. slim_tx_mixer_get, slim_tx_mixer_put),
  3319. SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0,
  3320. slim_tx_mixer_get, slim_tx_mixer_put),
  3321. SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD934X_TX2, 1, 0,
  3322. slim_tx_mixer_get, slim_tx_mixer_put),
  3323. SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD934X_TX3, 1, 0,
  3324. slim_tx_mixer_get, slim_tx_mixer_put),
  3325. SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD934X_TX4, 1, 0,
  3326. slim_tx_mixer_get, slim_tx_mixer_put),
  3327. SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD934X_TX5, 1, 0,
  3328. slim_tx_mixer_get, slim_tx_mixer_put),
  3329. SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD934X_TX6, 1, 0,
  3330. slim_tx_mixer_get, slim_tx_mixer_put),
  3331. SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD934X_TX7, 1, 0,
  3332. slim_tx_mixer_get, slim_tx_mixer_put),
  3333. SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD934X_TX8, 1, 0,
  3334. slim_tx_mixer_get, slim_tx_mixer_put),
  3335. SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD934X_TX9, 1, 0,
  3336. slim_tx_mixer_get, slim_tx_mixer_put),
  3337. SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD934X_TX10, 1, 0,
  3338. slim_tx_mixer_get, slim_tx_mixer_put),
  3339. SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD934X_TX11, 1, 0,
  3340. slim_tx_mixer_get, slim_tx_mixer_put),
  3341. SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD934X_TX13, 1, 0,
  3342. slim_tx_mixer_get, slim_tx_mixer_put),
  3343. };
  3344. static const struct snd_kcontrol_new aif3_slim_cap_mixer[] = {
  3345. SOC_SINGLE_EXT("SLIM TX0", SND_SOC_NOPM, WCD934X_TX0, 1, 0,
  3346. slim_tx_mixer_get, slim_tx_mixer_put),
  3347. SOC_SINGLE_EXT("SLIM TX1", SND_SOC_NOPM, WCD934X_TX1, 1, 0,
  3348. slim_tx_mixer_get, slim_tx_mixer_put),
  3349. SOC_SINGLE_EXT("SLIM TX2", SND_SOC_NOPM, WCD934X_TX2, 1, 0,
  3350. slim_tx_mixer_get, slim_tx_mixer_put),
  3351. SOC_SINGLE_EXT("SLIM TX3", SND_SOC_NOPM, WCD934X_TX3, 1, 0,
  3352. slim_tx_mixer_get, slim_tx_mixer_put),
  3353. SOC_SINGLE_EXT("SLIM TX4", SND_SOC_NOPM, WCD934X_TX4, 1, 0,
  3354. slim_tx_mixer_get, slim_tx_mixer_put),
  3355. SOC_SINGLE_EXT("SLIM TX5", SND_SOC_NOPM, WCD934X_TX5, 1, 0,
  3356. slim_tx_mixer_get, slim_tx_mixer_put),
  3357. SOC_SINGLE_EXT("SLIM TX6", SND_SOC_NOPM, WCD934X_TX6, 1, 0,
  3358. slim_tx_mixer_get, slim_tx_mixer_put),
  3359. SOC_SINGLE_EXT("SLIM TX7", SND_SOC_NOPM, WCD934X_TX7, 1, 0,
  3360. slim_tx_mixer_get, slim_tx_mixer_put),
  3361. SOC_SINGLE_EXT("SLIM TX8", SND_SOC_NOPM, WCD934X_TX8, 1, 0,
  3362. slim_tx_mixer_get, slim_tx_mixer_put),
  3363. SOC_SINGLE_EXT("SLIM TX9", SND_SOC_NOPM, WCD934X_TX9, 1, 0,
  3364. slim_tx_mixer_get, slim_tx_mixer_put),
  3365. SOC_SINGLE_EXT("SLIM TX10", SND_SOC_NOPM, WCD934X_TX10, 1, 0,
  3366. slim_tx_mixer_get, slim_tx_mixer_put),
  3367. SOC_SINGLE_EXT("SLIM TX11", SND_SOC_NOPM, WCD934X_TX11, 1, 0,
  3368. slim_tx_mixer_get, slim_tx_mixer_put),
  3369. SOC_SINGLE_EXT("SLIM TX13", SND_SOC_NOPM, WCD934X_TX13, 1, 0,
  3370. slim_tx_mixer_get, slim_tx_mixer_put),
  3371. };
  3372. static const struct snd_kcontrol_new wcd934x_snd_controls[] = {
  3373. /* Gain Controls */
  3374. SOC_SINGLE_TLV("EAR PA Volume", WCD934X_ANA_EAR, 4, 4, 1, ear_pa_gain),
  3375. SOC_SINGLE_TLV("HPHL Volume", WCD934X_HPH_L_EN, 0, 24, 1, line_gain),
  3376. SOC_SINGLE_TLV("HPHR Volume", WCD934X_HPH_R_EN, 0, 24, 1, line_gain),
  3377. SOC_SINGLE_TLV("LINEOUT1 Volume", WCD934X_DIFF_LO_LO1_COMPANDER,
  3378. 3, 16, 1, line_gain),
  3379. SOC_SINGLE_TLV("LINEOUT2 Volume", WCD934X_DIFF_LO_LO2_COMPANDER,
  3380. 3, 16, 1, line_gain),
  3381. SOC_SINGLE_TLV("ADC1 Volume", WCD934X_ANA_AMIC1, 0, 20, 0, analog_gain),
  3382. SOC_SINGLE_TLV("ADC2 Volume", WCD934X_ANA_AMIC2, 0, 20, 0, analog_gain),
  3383. SOC_SINGLE_TLV("ADC3 Volume", WCD934X_ANA_AMIC3, 0, 20, 0, analog_gain),
  3384. SOC_SINGLE_TLV("ADC4 Volume", WCD934X_ANA_AMIC4, 0, 20, 0, analog_gain),
  3385. SOC_SINGLE_S8_TLV("RX0 Digital Volume", WCD934X_CDC_RX0_RX_VOL_CTL,
  3386. -84, 40, digital_gain), /* -84dB min - 40dB max */
  3387. SOC_SINGLE_S8_TLV("RX1 Digital Volume", WCD934X_CDC_RX1_RX_VOL_CTL,
  3388. -84, 40, digital_gain),
  3389. SOC_SINGLE_S8_TLV("RX2 Digital Volume", WCD934X_CDC_RX2_RX_VOL_CTL,
  3390. -84, 40, digital_gain),
  3391. SOC_SINGLE_S8_TLV("RX3 Digital Volume", WCD934X_CDC_RX3_RX_VOL_CTL,
  3392. -84, 40, digital_gain),
  3393. SOC_SINGLE_S8_TLV("RX4 Digital Volume", WCD934X_CDC_RX4_RX_VOL_CTL,
  3394. -84, 40, digital_gain),
  3395. SOC_SINGLE_S8_TLV("RX7 Digital Volume", WCD934X_CDC_RX7_RX_VOL_CTL,
  3396. -84, 40, digital_gain),
  3397. SOC_SINGLE_S8_TLV("RX8 Digital Volume", WCD934X_CDC_RX8_RX_VOL_CTL,
  3398. -84, 40, digital_gain),
  3399. SOC_SINGLE_S8_TLV("RX0 Mix Digital Volume",
  3400. WCD934X_CDC_RX0_RX_VOL_MIX_CTL,
  3401. -84, 40, digital_gain),
  3402. SOC_SINGLE_S8_TLV("RX1 Mix Digital Volume",
  3403. WCD934X_CDC_RX1_RX_VOL_MIX_CTL,
  3404. -84, 40, digital_gain),
  3405. SOC_SINGLE_S8_TLV("RX2 Mix Digital Volume",
  3406. WCD934X_CDC_RX2_RX_VOL_MIX_CTL,
  3407. -84, 40, digital_gain),
  3408. SOC_SINGLE_S8_TLV("RX3 Mix Digital Volume",
  3409. WCD934X_CDC_RX3_RX_VOL_MIX_CTL,
  3410. -84, 40, digital_gain),
  3411. SOC_SINGLE_S8_TLV("RX4 Mix Digital Volume",
  3412. WCD934X_CDC_RX4_RX_VOL_MIX_CTL,
  3413. -84, 40, digital_gain),
  3414. SOC_SINGLE_S8_TLV("RX7 Mix Digital Volume",
  3415. WCD934X_CDC_RX7_RX_VOL_MIX_CTL,
  3416. -84, 40, digital_gain),
  3417. SOC_SINGLE_S8_TLV("RX8 Mix Digital Volume",
  3418. WCD934X_CDC_RX8_RX_VOL_MIX_CTL,
  3419. -84, 40, digital_gain),
  3420. SOC_SINGLE_S8_TLV("DEC0 Volume", WCD934X_CDC_TX0_TX_VOL_CTL,
  3421. -84, 40, digital_gain),
  3422. SOC_SINGLE_S8_TLV("DEC1 Volume", WCD934X_CDC_TX1_TX_VOL_CTL,
  3423. -84, 40, digital_gain),
  3424. SOC_SINGLE_S8_TLV("DEC2 Volume", WCD934X_CDC_TX2_TX_VOL_CTL,
  3425. -84, 40, digital_gain),
  3426. SOC_SINGLE_S8_TLV("DEC3 Volume", WCD934X_CDC_TX3_TX_VOL_CTL,
  3427. -84, 40, digital_gain),
  3428. SOC_SINGLE_S8_TLV("DEC4 Volume", WCD934X_CDC_TX4_TX_VOL_CTL,
  3429. -84, 40, digital_gain),
  3430. SOC_SINGLE_S8_TLV("DEC5 Volume", WCD934X_CDC_TX5_TX_VOL_CTL,
  3431. -84, 40, digital_gain),
  3432. SOC_SINGLE_S8_TLV("DEC6 Volume", WCD934X_CDC_TX6_TX_VOL_CTL,
  3433. -84, 40, digital_gain),
  3434. SOC_SINGLE_S8_TLV("DEC7 Volume", WCD934X_CDC_TX7_TX_VOL_CTL,
  3435. -84, 40, digital_gain),
  3436. SOC_SINGLE_S8_TLV("DEC8 Volume", WCD934X_CDC_TX8_TX_VOL_CTL,
  3437. -84, 40, digital_gain),
  3438. SOC_SINGLE_S8_TLV("IIR0 INP0 Volume",
  3439. WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL, -84, 40,
  3440. digital_gain),
  3441. SOC_SINGLE_S8_TLV("IIR0 INP1 Volume",
  3442. WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B2_CTL, -84, 40,
  3443. digital_gain),
  3444. SOC_SINGLE_S8_TLV("IIR0 INP2 Volume",
  3445. WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B3_CTL, -84, 40,
  3446. digital_gain),
  3447. SOC_SINGLE_S8_TLV("IIR0 INP3 Volume",
  3448. WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B4_CTL, -84, 40,
  3449. digital_gain),
  3450. SOC_SINGLE_S8_TLV("IIR1 INP0 Volume",
  3451. WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL, -84, 40,
  3452. digital_gain),
  3453. SOC_SINGLE_S8_TLV("IIR1 INP1 Volume",
  3454. WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B2_CTL, -84, 40,
  3455. digital_gain),
  3456. SOC_SINGLE_S8_TLV("IIR1 INP2 Volume",
  3457. WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B3_CTL, -84, 40,
  3458. digital_gain),
  3459. SOC_SINGLE_S8_TLV("IIR1 INP3 Volume",
  3460. WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B4_CTL, -84, 40,
  3461. digital_gain),
  3462. SOC_ENUM("TX0 HPF cut off", cf_dec0_enum),
  3463. SOC_ENUM("TX1 HPF cut off", cf_dec1_enum),
  3464. SOC_ENUM("TX2 HPF cut off", cf_dec2_enum),
  3465. SOC_ENUM("TX3 HPF cut off", cf_dec3_enum),
  3466. SOC_ENUM("TX4 HPF cut off", cf_dec4_enum),
  3467. SOC_ENUM("TX5 HPF cut off", cf_dec5_enum),
  3468. SOC_ENUM("TX6 HPF cut off", cf_dec6_enum),
  3469. SOC_ENUM("TX7 HPF cut off", cf_dec7_enum),
  3470. SOC_ENUM("TX8 HPF cut off", cf_dec8_enum),
  3471. SOC_ENUM("RX INT0_1 HPF cut off", cf_int0_1_enum),
  3472. SOC_ENUM("RX INT0_2 HPF cut off", cf_int0_2_enum),
  3473. SOC_ENUM("RX INT1_1 HPF cut off", cf_int1_1_enum),
  3474. SOC_ENUM("RX INT1_2 HPF cut off", cf_int1_2_enum),
  3475. SOC_ENUM("RX INT2_1 HPF cut off", cf_int2_1_enum),
  3476. SOC_ENUM("RX INT2_2 HPF cut off", cf_int2_2_enum),
  3477. SOC_ENUM("RX INT3_1 HPF cut off", cf_int3_1_enum),
  3478. SOC_ENUM("RX INT3_2 HPF cut off", cf_int3_2_enum),
  3479. SOC_ENUM("RX INT4_1 HPF cut off", cf_int4_1_enum),
  3480. SOC_ENUM("RX INT4_2 HPF cut off", cf_int4_2_enum),
  3481. SOC_ENUM("RX INT7_1 HPF cut off", cf_int7_1_enum),
  3482. SOC_ENUM("RX INT7_2 HPF cut off", cf_int7_2_enum),
  3483. SOC_ENUM("RX INT8_1 HPF cut off", cf_int8_1_enum),
  3484. SOC_ENUM("RX INT8_2 HPF cut off", cf_int8_2_enum),
  3485. SOC_ENUM_EXT("RX HPH Mode", rx_hph_mode_mux_enum,
  3486. wcd934x_rx_hph_mode_get, wcd934x_rx_hph_mode_put),
  3487. SOC_SINGLE("IIR1 Band1 Switch", WCD934X_CDC_SIDETONE_IIR0_IIR_CTL,
  3488. 0, 1, 0),
  3489. SOC_SINGLE("IIR1 Band2 Switch", WCD934X_CDC_SIDETONE_IIR0_IIR_CTL,
  3490. 1, 1, 0),
  3491. SOC_SINGLE("IIR1 Band3 Switch", WCD934X_CDC_SIDETONE_IIR0_IIR_CTL,
  3492. 2, 1, 0),
  3493. SOC_SINGLE("IIR1 Band4 Switch", WCD934X_CDC_SIDETONE_IIR0_IIR_CTL,
  3494. 3, 1, 0),
  3495. SOC_SINGLE("IIR1 Band5 Switch", WCD934X_CDC_SIDETONE_IIR0_IIR_CTL,
  3496. 4, 1, 0),
  3497. SOC_SINGLE("IIR2 Band1 Switch", WCD934X_CDC_SIDETONE_IIR1_IIR_CTL,
  3498. 0, 1, 0),
  3499. SOC_SINGLE("IIR2 Band2 Switch", WCD934X_CDC_SIDETONE_IIR1_IIR_CTL,
  3500. 1, 1, 0),
  3501. SOC_SINGLE("IIR2 Band3 Switch", WCD934X_CDC_SIDETONE_IIR1_IIR_CTL,
  3502. 2, 1, 0),
  3503. SOC_SINGLE("IIR2 Band4 Switch", WCD934X_CDC_SIDETONE_IIR1_IIR_CTL,
  3504. 3, 1, 0),
  3505. SOC_SINGLE("IIR2 Band5 Switch", WCD934X_CDC_SIDETONE_IIR1_IIR_CTL,
  3506. 4, 1, 0),
  3507. WCD_IIR_FILTER_CTL("IIR0 Band1", IIR0, BAND1),
  3508. WCD_IIR_FILTER_CTL("IIR0 Band2", IIR0, BAND2),
  3509. WCD_IIR_FILTER_CTL("IIR0 Band3", IIR0, BAND3),
  3510. WCD_IIR_FILTER_CTL("IIR0 Band4", IIR0, BAND4),
  3511. WCD_IIR_FILTER_CTL("IIR0 Band5", IIR0, BAND5),
  3512. WCD_IIR_FILTER_CTL("IIR1 Band1", IIR1, BAND1),
  3513. WCD_IIR_FILTER_CTL("IIR1 Band2", IIR1, BAND2),
  3514. WCD_IIR_FILTER_CTL("IIR1 Band3", IIR1, BAND3),
  3515. WCD_IIR_FILTER_CTL("IIR1 Band4", IIR1, BAND4),
  3516. WCD_IIR_FILTER_CTL("IIR1 Band5", IIR1, BAND5),
  3517. SOC_SINGLE_EXT("COMP1 Switch", SND_SOC_NOPM, COMPANDER_1, 1, 0,
  3518. wcd934x_compander_get, wcd934x_compander_set),
  3519. SOC_SINGLE_EXT("COMP2 Switch", SND_SOC_NOPM, COMPANDER_2, 1, 0,
  3520. wcd934x_compander_get, wcd934x_compander_set),
  3521. SOC_SINGLE_EXT("COMP3 Switch", SND_SOC_NOPM, COMPANDER_3, 1, 0,
  3522. wcd934x_compander_get, wcd934x_compander_set),
  3523. SOC_SINGLE_EXT("COMP4 Switch", SND_SOC_NOPM, COMPANDER_4, 1, 0,
  3524. wcd934x_compander_get, wcd934x_compander_set),
  3525. SOC_SINGLE_EXT("COMP7 Switch", SND_SOC_NOPM, COMPANDER_7, 1, 0,
  3526. wcd934x_compander_get, wcd934x_compander_set),
  3527. SOC_SINGLE_EXT("COMP8 Switch", SND_SOC_NOPM, COMPANDER_8, 1, 0,
  3528. wcd934x_compander_get, wcd934x_compander_set),
  3529. };
  3530. static void wcd934x_codec_enable_int_port(struct wcd_slim_codec_dai_data *dai,
  3531. struct snd_soc_component *component)
  3532. {
  3533. int port_num = 0;
  3534. unsigned short reg = 0;
  3535. unsigned int val = 0;
  3536. struct wcd934x_codec *wcd = dev_get_drvdata(component->dev);
  3537. struct wcd934x_slim_ch *ch;
  3538. list_for_each_entry(ch, &dai->slim_ch_list, list) {
  3539. if (ch->port >= WCD934X_RX_START) {
  3540. port_num = ch->port - WCD934X_RX_START;
  3541. reg = WCD934X_SLIM_PGD_PORT_INT_EN0 + (port_num / 8);
  3542. } else {
  3543. port_num = ch->port;
  3544. reg = WCD934X_SLIM_PGD_PORT_INT_TX_EN0 + (port_num / 8);
  3545. }
  3546. regmap_read(wcd->if_regmap, reg, &val);
  3547. if (!(val & BIT(port_num % 8)))
  3548. regmap_write(wcd->if_regmap, reg,
  3549. val | BIT(port_num % 8));
  3550. }
  3551. }
  3552. static int wcd934x_codec_enable_slim(struct snd_soc_dapm_widget *w,
  3553. struct snd_kcontrol *kc, int event)
  3554. {
  3555. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3556. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
  3557. struct wcd_slim_codec_dai_data *dai = &wcd->dai[w->shift];
  3558. switch (event) {
  3559. case SND_SOC_DAPM_POST_PMU:
  3560. wcd934x_codec_enable_int_port(dai, comp);
  3561. break;
  3562. }
  3563. return 0;
  3564. }
  3565. static void wcd934x_codec_hd2_control(struct snd_soc_component *component,
  3566. u16 interp_idx, int event)
  3567. {
  3568. u16 hd2_scale_reg;
  3569. u16 hd2_enable_reg = 0;
  3570. switch (interp_idx) {
  3571. case INTERP_HPHL:
  3572. hd2_scale_reg = WCD934X_CDC_RX1_RX_PATH_SEC3;
  3573. hd2_enable_reg = WCD934X_CDC_RX1_RX_PATH_CFG0;
  3574. break;
  3575. case INTERP_HPHR:
  3576. hd2_scale_reg = WCD934X_CDC_RX2_RX_PATH_SEC3;
  3577. hd2_enable_reg = WCD934X_CDC_RX2_RX_PATH_CFG0;
  3578. break;
  3579. default:
  3580. return;
  3581. }
  3582. if (SND_SOC_DAPM_EVENT_ON(event)) {
  3583. snd_soc_component_update_bits(component, hd2_scale_reg,
  3584. WCD934X_CDC_RX_PATH_SEC_HD2_ALPHA_MASK,
  3585. WCD934X_CDC_RX_PATH_SEC_HD2_ALPHA_0P3125);
  3586. snd_soc_component_update_bits(component, hd2_enable_reg,
  3587. WCD934X_CDC_RX_PATH_CFG_HD2_EN_MASK,
  3588. WCD934X_CDC_RX_PATH_CFG_HD2_ENABLE);
  3589. }
  3590. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  3591. snd_soc_component_update_bits(component, hd2_enable_reg,
  3592. WCD934X_CDC_RX_PATH_CFG_HD2_EN_MASK,
  3593. WCD934X_CDC_RX_PATH_CFG_HD2_DISABLE);
  3594. snd_soc_component_update_bits(component, hd2_scale_reg,
  3595. WCD934X_CDC_RX_PATH_SEC_HD2_ALPHA_MASK,
  3596. WCD934X_CDC_RX_PATH_SEC_HD2_ALPHA_0P0000);
  3597. }
  3598. }
  3599. static void wcd934x_codec_hphdelay_lutbypass(struct snd_soc_component *comp,
  3600. u16 interp_idx, int event)
  3601. {
  3602. u8 hph_dly_mask;
  3603. u16 hph_lut_bypass_reg = 0;
  3604. switch (interp_idx) {
  3605. case INTERP_HPHL:
  3606. hph_dly_mask = 1;
  3607. hph_lut_bypass_reg = WCD934X_CDC_TOP_HPHL_COMP_LUT;
  3608. break;
  3609. case INTERP_HPHR:
  3610. hph_dly_mask = 2;
  3611. hph_lut_bypass_reg = WCD934X_CDC_TOP_HPHR_COMP_LUT;
  3612. break;
  3613. default:
  3614. return;
  3615. }
  3616. if (SND_SOC_DAPM_EVENT_ON(event)) {
  3617. snd_soc_component_update_bits(comp, WCD934X_CDC_CLSH_TEST0,
  3618. hph_dly_mask, 0x0);
  3619. snd_soc_component_update_bits(comp, hph_lut_bypass_reg,
  3620. WCD934X_HPH_LUT_BYPASS_MASK,
  3621. WCD934X_HPH_LUT_BYPASS_ENABLE);
  3622. }
  3623. if (SND_SOC_DAPM_EVENT_OFF(event)) {
  3624. snd_soc_component_update_bits(comp, WCD934X_CDC_CLSH_TEST0,
  3625. hph_dly_mask, hph_dly_mask);
  3626. snd_soc_component_update_bits(comp, hph_lut_bypass_reg,
  3627. WCD934X_HPH_LUT_BYPASS_MASK,
  3628. WCD934X_HPH_LUT_BYPASS_DISABLE);
  3629. }
  3630. }
  3631. static int wcd934x_config_compander(struct snd_soc_component *comp,
  3632. int interp_n, int event)
  3633. {
  3634. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  3635. int compander;
  3636. u16 comp_ctl0_reg, rx_path_cfg0_reg;
  3637. /* EAR does not have compander */
  3638. if (!interp_n)
  3639. return 0;
  3640. compander = interp_n - 1;
  3641. if (!wcd->comp_enabled[compander])
  3642. return 0;
  3643. comp_ctl0_reg = WCD934X_CDC_COMPANDER1_CTL0 + (compander * 8);
  3644. rx_path_cfg0_reg = WCD934X_CDC_RX1_RX_PATH_CFG0 + (compander * 20);
  3645. switch (event) {
  3646. case SND_SOC_DAPM_PRE_PMU:
  3647. /* Enable Compander Clock */
  3648. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3649. WCD934X_COMP_CLK_EN_MASK,
  3650. WCD934X_COMP_CLK_ENABLE);
  3651. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3652. WCD934X_COMP_SOFT_RST_MASK,
  3653. WCD934X_COMP_SOFT_RST_ENABLE);
  3654. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3655. WCD934X_COMP_SOFT_RST_MASK,
  3656. WCD934X_COMP_SOFT_RST_DISABLE);
  3657. snd_soc_component_update_bits(comp, rx_path_cfg0_reg,
  3658. WCD934X_HPH_CMP_EN_MASK,
  3659. WCD934X_HPH_CMP_ENABLE);
  3660. break;
  3661. case SND_SOC_DAPM_POST_PMD:
  3662. snd_soc_component_update_bits(comp, rx_path_cfg0_reg,
  3663. WCD934X_HPH_CMP_EN_MASK,
  3664. WCD934X_HPH_CMP_DISABLE);
  3665. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3666. WCD934X_COMP_HALT_MASK,
  3667. WCD934X_COMP_HALT);
  3668. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3669. WCD934X_COMP_SOFT_RST_MASK,
  3670. WCD934X_COMP_SOFT_RST_ENABLE);
  3671. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3672. WCD934X_COMP_SOFT_RST_MASK,
  3673. WCD934X_COMP_SOFT_RST_DISABLE);
  3674. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3675. WCD934X_COMP_CLK_EN_MASK, 0x0);
  3676. snd_soc_component_update_bits(comp, comp_ctl0_reg,
  3677. WCD934X_COMP_SOFT_RST_MASK, 0x0);
  3678. break;
  3679. }
  3680. return 0;
  3681. }
  3682. static int wcd934x_codec_enable_interp_clk(struct snd_soc_dapm_widget *w,
  3683. struct snd_kcontrol *kc, int event)
  3684. {
  3685. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3686. int interp_idx = w->shift;
  3687. u16 main_reg = WCD934X_CDC_RX0_RX_PATH_CTL + (interp_idx * 20);
  3688. switch (event) {
  3689. case SND_SOC_DAPM_PRE_PMU:
  3690. /* Clk enable */
  3691. snd_soc_component_update_bits(comp, main_reg,
  3692. WCD934X_RX_CLK_EN_MASK,
  3693. WCD934X_RX_CLK_ENABLE);
  3694. wcd934x_codec_hd2_control(comp, interp_idx, event);
  3695. wcd934x_codec_hphdelay_lutbypass(comp, interp_idx, event);
  3696. wcd934x_config_compander(comp, interp_idx, event);
  3697. break;
  3698. case SND_SOC_DAPM_POST_PMD:
  3699. wcd934x_config_compander(comp, interp_idx, event);
  3700. wcd934x_codec_hphdelay_lutbypass(comp, interp_idx, event);
  3701. wcd934x_codec_hd2_control(comp, interp_idx, event);
  3702. /* Clk Disable */
  3703. snd_soc_component_update_bits(comp, main_reg,
  3704. WCD934X_RX_CLK_EN_MASK, 0);
  3705. /* Reset enable and disable */
  3706. snd_soc_component_update_bits(comp, main_reg,
  3707. WCD934X_RX_RESET_MASK,
  3708. WCD934X_RX_RESET_ENABLE);
  3709. snd_soc_component_update_bits(comp, main_reg,
  3710. WCD934X_RX_RESET_MASK,
  3711. WCD934X_RX_RESET_DISABLE);
  3712. /* Reset rate to 48K*/
  3713. snd_soc_component_update_bits(comp, main_reg,
  3714. WCD934X_RX_PCM_RATE_MASK,
  3715. WCD934X_RX_PCM_RATE_F_48K);
  3716. break;
  3717. }
  3718. return 0;
  3719. }
  3720. static int wcd934x_codec_enable_mix_path(struct snd_soc_dapm_widget *w,
  3721. struct snd_kcontrol *kc, int event)
  3722. {
  3723. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3724. int offset_val = 0;
  3725. u16 gain_reg, mix_reg;
  3726. int val = 0;
  3727. gain_reg = WCD934X_CDC_RX0_RX_VOL_MIX_CTL +
  3728. (w->shift * WCD934X_RX_PATH_CTL_OFFSET);
  3729. mix_reg = WCD934X_CDC_RX0_RX_PATH_MIX_CTL +
  3730. (w->shift * WCD934X_RX_PATH_CTL_OFFSET);
  3731. switch (event) {
  3732. case SND_SOC_DAPM_PRE_PMU:
  3733. /* Clk enable */
  3734. snd_soc_component_update_bits(comp, mix_reg,
  3735. WCD934X_CDC_RX_MIX_CLK_EN_MASK,
  3736. WCD934X_CDC_RX_MIX_CLK_ENABLE);
  3737. break;
  3738. case SND_SOC_DAPM_POST_PMU:
  3739. val = snd_soc_component_read(comp, gain_reg);
  3740. val += offset_val;
  3741. snd_soc_component_write(comp, gain_reg, val);
  3742. break;
  3743. }
  3744. return 0;
  3745. }
  3746. static int wcd934x_codec_set_iir_gain(struct snd_soc_dapm_widget *w,
  3747. struct snd_kcontrol *kcontrol, int event)
  3748. {
  3749. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3750. int reg = w->reg;
  3751. switch (event) {
  3752. case SND_SOC_DAPM_POST_PMU:
  3753. /* B1 GAIN */
  3754. snd_soc_component_write(comp, reg,
  3755. snd_soc_component_read(comp, reg));
  3756. /* B2 GAIN */
  3757. reg++;
  3758. snd_soc_component_write(comp, reg,
  3759. snd_soc_component_read(comp, reg));
  3760. /* B3 GAIN */
  3761. reg++;
  3762. snd_soc_component_write(comp, reg,
  3763. snd_soc_component_read(comp, reg));
  3764. /* B4 GAIN */
  3765. reg++;
  3766. snd_soc_component_write(comp, reg,
  3767. snd_soc_component_read(comp, reg));
  3768. /* B5 GAIN */
  3769. reg++;
  3770. snd_soc_component_write(comp, reg,
  3771. snd_soc_component_read(comp, reg));
  3772. break;
  3773. default:
  3774. break;
  3775. }
  3776. return 0;
  3777. }
  3778. static int wcd934x_codec_enable_main_path(struct snd_soc_dapm_widget *w,
  3779. struct snd_kcontrol *kcontrol,
  3780. int event)
  3781. {
  3782. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3783. u16 gain_reg;
  3784. gain_reg = WCD934X_CDC_RX0_RX_VOL_CTL + (w->shift *
  3785. WCD934X_RX_PATH_CTL_OFFSET);
  3786. switch (event) {
  3787. case SND_SOC_DAPM_POST_PMU:
  3788. snd_soc_component_write(comp, gain_reg,
  3789. snd_soc_component_read(comp, gain_reg));
  3790. break;
  3791. }
  3792. return 0;
  3793. }
  3794. static int wcd934x_codec_ear_dac_event(struct snd_soc_dapm_widget *w,
  3795. struct snd_kcontrol *kc, int event)
  3796. {
  3797. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3798. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  3799. switch (event) {
  3800. case SND_SOC_DAPM_PRE_PMU:
  3801. /* Disable AutoChop timer during power up */
  3802. snd_soc_component_update_bits(comp,
  3803. WCD934X_HPH_NEW_INT_HPH_TIMER1,
  3804. WCD934X_HPH_AUTOCHOP_TIMER_EN_MASK, 0x0);
  3805. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
  3806. WCD_CLSH_STATE_EAR, CLS_H_NORMAL);
  3807. break;
  3808. case SND_SOC_DAPM_POST_PMD:
  3809. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
  3810. WCD_CLSH_STATE_EAR, CLS_H_NORMAL);
  3811. break;
  3812. }
  3813. return 0;
  3814. }
  3815. static int wcd934x_codec_hphl_dac_event(struct snd_soc_dapm_widget *w,
  3816. struct snd_kcontrol *kcontrol,
  3817. int event)
  3818. {
  3819. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3820. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  3821. int hph_mode = wcd->hph_mode;
  3822. u8 dem_inp;
  3823. switch (event) {
  3824. case SND_SOC_DAPM_PRE_PMU:
  3825. /* Read DEM INP Select */
  3826. dem_inp = snd_soc_component_read(comp,
  3827. WCD934X_CDC_RX1_RX_PATH_SEC0) & 0x03;
  3828. if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) ||
  3829. (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) {
  3830. return -EINVAL;
  3831. }
  3832. if (hph_mode != CLS_H_LP)
  3833. /* Ripple freq control enable */
  3834. snd_soc_component_update_bits(comp,
  3835. WCD934X_SIDO_NEW_VOUT_D_FREQ2,
  3836. WCD934X_SIDO_RIPPLE_FREQ_EN_MASK,
  3837. WCD934X_SIDO_RIPPLE_FREQ_ENABLE);
  3838. /* Disable AutoChop timer during power up */
  3839. snd_soc_component_update_bits(comp,
  3840. WCD934X_HPH_NEW_INT_HPH_TIMER1,
  3841. WCD934X_HPH_AUTOCHOP_TIMER_EN_MASK, 0x0);
  3842. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
  3843. WCD_CLSH_STATE_HPHL, hph_mode);
  3844. break;
  3845. case SND_SOC_DAPM_POST_PMD:
  3846. /* 1000us required as per HW requirement */
  3847. usleep_range(1000, 1100);
  3848. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
  3849. WCD_CLSH_STATE_HPHL, hph_mode);
  3850. if (hph_mode != CLS_H_LP)
  3851. /* Ripple freq control disable */
  3852. snd_soc_component_update_bits(comp,
  3853. WCD934X_SIDO_NEW_VOUT_D_FREQ2,
  3854. WCD934X_SIDO_RIPPLE_FREQ_EN_MASK, 0x0);
  3855. break;
  3856. default:
  3857. break;
  3858. }
  3859. return 0;
  3860. }
  3861. static int wcd934x_codec_hphr_dac_event(struct snd_soc_dapm_widget *w,
  3862. struct snd_kcontrol *kcontrol,
  3863. int event)
  3864. {
  3865. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3866. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  3867. int hph_mode = wcd->hph_mode;
  3868. u8 dem_inp;
  3869. switch (event) {
  3870. case SND_SOC_DAPM_PRE_PMU:
  3871. dem_inp = snd_soc_component_read(comp,
  3872. WCD934X_CDC_RX2_RX_PATH_SEC0) & 0x03;
  3873. if (((hph_mode == CLS_H_HIFI) || (hph_mode == CLS_H_LOHIFI) ||
  3874. (hph_mode == CLS_H_LP)) && (dem_inp != 0x01)) {
  3875. return -EINVAL;
  3876. }
  3877. if (hph_mode != CLS_H_LP)
  3878. /* Ripple freq control enable */
  3879. snd_soc_component_update_bits(comp,
  3880. WCD934X_SIDO_NEW_VOUT_D_FREQ2,
  3881. WCD934X_SIDO_RIPPLE_FREQ_EN_MASK,
  3882. WCD934X_SIDO_RIPPLE_FREQ_ENABLE);
  3883. /* Disable AutoChop timer during power up */
  3884. snd_soc_component_update_bits(comp,
  3885. WCD934X_HPH_NEW_INT_HPH_TIMER1,
  3886. WCD934X_HPH_AUTOCHOP_TIMER_EN_MASK, 0x0);
  3887. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
  3888. WCD_CLSH_STATE_HPHR,
  3889. hph_mode);
  3890. break;
  3891. case SND_SOC_DAPM_POST_PMD:
  3892. /* 1000us required as per HW requirement */
  3893. usleep_range(1000, 1100);
  3894. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
  3895. WCD_CLSH_STATE_HPHR, hph_mode);
  3896. if (hph_mode != CLS_H_LP)
  3897. /* Ripple freq control disable */
  3898. snd_soc_component_update_bits(comp,
  3899. WCD934X_SIDO_NEW_VOUT_D_FREQ2,
  3900. WCD934X_SIDO_RIPPLE_FREQ_EN_MASK, 0x0);
  3901. break;
  3902. default:
  3903. break;
  3904. }
  3905. return 0;
  3906. }
  3907. static int wcd934x_codec_lineout_dac_event(struct snd_soc_dapm_widget *w,
  3908. struct snd_kcontrol *kc, int event)
  3909. {
  3910. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3911. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  3912. switch (event) {
  3913. case SND_SOC_DAPM_PRE_PMU:
  3914. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_PRE_DAC,
  3915. WCD_CLSH_STATE_LO, CLS_AB);
  3916. break;
  3917. case SND_SOC_DAPM_POST_PMD:
  3918. wcd_clsh_ctrl_set_state(wcd->clsh_ctrl, WCD_CLSH_EVENT_POST_PA,
  3919. WCD_CLSH_STATE_LO, CLS_AB);
  3920. break;
  3921. }
  3922. return 0;
  3923. }
  3924. static int wcd934x_codec_enable_hphl_pa(struct snd_soc_dapm_widget *w,
  3925. struct snd_kcontrol *kcontrol,
  3926. int event)
  3927. {
  3928. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3929. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
  3930. switch (event) {
  3931. case SND_SOC_DAPM_POST_PMU:
  3932. /*
  3933. * 7ms sleep is required after PA is enabled as per
  3934. * HW requirement. If compander is disabled, then
  3935. * 20ms delay is needed.
  3936. */
  3937. usleep_range(20000, 20100);
  3938. snd_soc_component_update_bits(comp, WCD934X_HPH_L_TEST,
  3939. WCD934X_HPH_OCP_DET_MASK,
  3940. WCD934X_HPH_OCP_DET_ENABLE);
  3941. /* Remove Mute on primary path */
  3942. snd_soc_component_update_bits(comp, WCD934X_CDC_RX1_RX_PATH_CTL,
  3943. WCD934X_RX_PATH_PGA_MUTE_EN_MASK,
  3944. 0);
  3945. /* Enable GM3 boost */
  3946. snd_soc_component_update_bits(comp, WCD934X_HPH_CNP_WG_CTL,
  3947. WCD934X_HPH_GM3_BOOST_EN_MASK,
  3948. WCD934X_HPH_GM3_BOOST_ENABLE);
  3949. /* Enable AutoChop timer at the end of power up */
  3950. snd_soc_component_update_bits(comp,
  3951. WCD934X_HPH_NEW_INT_HPH_TIMER1,
  3952. WCD934X_HPH_AUTOCHOP_TIMER_EN_MASK,
  3953. WCD934X_HPH_AUTOCHOP_TIMER_ENABLE);
  3954. /* Remove mix path mute */
  3955. snd_soc_component_update_bits(comp,
  3956. WCD934X_CDC_RX1_RX_PATH_MIX_CTL,
  3957. WCD934X_CDC_RX_PGA_MUTE_EN_MASK, 0x00);
  3958. break;
  3959. case SND_SOC_DAPM_PRE_PMD:
  3960. wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHL_PA_OFF);
  3961. /* Enable DSD Mute before PA disable */
  3962. snd_soc_component_update_bits(comp, WCD934X_HPH_L_TEST,
  3963. WCD934X_HPH_OCP_DET_MASK,
  3964. WCD934X_HPH_OCP_DET_DISABLE);
  3965. snd_soc_component_update_bits(comp, WCD934X_CDC_RX1_RX_PATH_CTL,
  3966. WCD934X_RX_PATH_PGA_MUTE_EN_MASK,
  3967. WCD934X_RX_PATH_PGA_MUTE_ENABLE);
  3968. snd_soc_component_update_bits(comp,
  3969. WCD934X_CDC_RX1_RX_PATH_MIX_CTL,
  3970. WCD934X_RX_PATH_PGA_MUTE_EN_MASK,
  3971. WCD934X_RX_PATH_PGA_MUTE_ENABLE);
  3972. break;
  3973. case SND_SOC_DAPM_POST_PMD:
  3974. /*
  3975. * 5ms sleep is required after PA disable. If compander is
  3976. * disabled, then 20ms delay is needed after PA disable.
  3977. */
  3978. usleep_range(20000, 20100);
  3979. wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHL_PA_OFF);
  3980. break;
  3981. }
  3982. return 0;
  3983. }
  3984. static int wcd934x_codec_enable_hphr_pa(struct snd_soc_dapm_widget *w,
  3985. struct snd_kcontrol *kcontrol,
  3986. int event)
  3987. {
  3988. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  3989. struct wcd934x_codec *wcd = snd_soc_component_get_drvdata(comp);
  3990. switch (event) {
  3991. case SND_SOC_DAPM_POST_PMU:
  3992. /*
  3993. * 7ms sleep is required after PA is enabled as per
  3994. * HW requirement. If compander is disabled, then
  3995. * 20ms delay is needed.
  3996. */
  3997. usleep_range(20000, 20100);
  3998. snd_soc_component_update_bits(comp, WCD934X_HPH_R_TEST,
  3999. WCD934X_HPH_OCP_DET_MASK,
  4000. WCD934X_HPH_OCP_DET_ENABLE);
  4001. /* Remove mute */
  4002. snd_soc_component_update_bits(comp, WCD934X_CDC_RX2_RX_PATH_CTL,
  4003. WCD934X_RX_PATH_PGA_MUTE_EN_MASK,
  4004. 0);
  4005. /* Enable GM3 boost */
  4006. snd_soc_component_update_bits(comp, WCD934X_HPH_CNP_WG_CTL,
  4007. WCD934X_HPH_GM3_BOOST_EN_MASK,
  4008. WCD934X_HPH_GM3_BOOST_ENABLE);
  4009. /* Enable AutoChop timer at the end of power up */
  4010. snd_soc_component_update_bits(comp,
  4011. WCD934X_HPH_NEW_INT_HPH_TIMER1,
  4012. WCD934X_HPH_AUTOCHOP_TIMER_EN_MASK,
  4013. WCD934X_HPH_AUTOCHOP_TIMER_ENABLE);
  4014. /* Remove mix path mute if it is enabled */
  4015. if ((snd_soc_component_read(comp,
  4016. WCD934X_CDC_RX2_RX_PATH_MIX_CTL)) & 0x10)
  4017. snd_soc_component_update_bits(comp,
  4018. WCD934X_CDC_RX2_RX_PATH_MIX_CTL,
  4019. WCD934X_CDC_RX_PGA_MUTE_EN_MASK,
  4020. WCD934X_CDC_RX_PGA_MUTE_DISABLE);
  4021. break;
  4022. case SND_SOC_DAPM_PRE_PMD:
  4023. wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_PRE_HPHR_PA_OFF);
  4024. snd_soc_component_update_bits(comp, WCD934X_HPH_R_TEST,
  4025. WCD934X_HPH_OCP_DET_MASK,
  4026. WCD934X_HPH_OCP_DET_DISABLE);
  4027. snd_soc_component_update_bits(comp, WCD934X_CDC_RX2_RX_PATH_CTL,
  4028. WCD934X_RX_PATH_PGA_MUTE_EN_MASK,
  4029. WCD934X_RX_PATH_PGA_MUTE_ENABLE);
  4030. snd_soc_component_update_bits(comp,
  4031. WCD934X_CDC_RX2_RX_PATH_MIX_CTL,
  4032. WCD934X_CDC_RX_PGA_MUTE_EN_MASK,
  4033. WCD934X_CDC_RX_PGA_MUTE_ENABLE);
  4034. break;
  4035. case SND_SOC_DAPM_POST_PMD:
  4036. /*
  4037. * 5ms sleep is required after PA disable. If compander is
  4038. * disabled, then 20ms delay is needed after PA disable.
  4039. */
  4040. usleep_range(20000, 20100);
  4041. wcd_mbhc_event_notify(wcd->mbhc, WCD_EVENT_POST_HPHR_PA_OFF);
  4042. break;
  4043. }
  4044. return 0;
  4045. }
  4046. static u32 wcd934x_get_dmic_sample_rate(struct snd_soc_component *comp,
  4047. unsigned int dmic,
  4048. struct wcd934x_codec *wcd)
  4049. {
  4050. u8 tx_stream_fs;
  4051. u8 adc_mux_index = 0, adc_mux_sel = 0;
  4052. bool dec_found = false;
  4053. u16 adc_mux_ctl_reg, tx_fs_reg;
  4054. u32 dmic_fs;
  4055. while (!dec_found && adc_mux_index < WCD934X_MAX_VALID_ADC_MUX) {
  4056. if (adc_mux_index < 4) {
  4057. adc_mux_ctl_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
  4058. (adc_mux_index * 2);
  4059. } else if (adc_mux_index < WCD934X_INVALID_ADC_MUX) {
  4060. adc_mux_ctl_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 +
  4061. adc_mux_index - 4;
  4062. } else if (adc_mux_index == WCD934X_INVALID_ADC_MUX) {
  4063. ++adc_mux_index;
  4064. continue;
  4065. }
  4066. adc_mux_sel = ((snd_soc_component_read(comp, adc_mux_ctl_reg)
  4067. & 0xF8) >> 3) - 1;
  4068. if (adc_mux_sel == dmic) {
  4069. dec_found = true;
  4070. break;
  4071. }
  4072. ++adc_mux_index;
  4073. }
  4074. if (dec_found && adc_mux_index <= 8) {
  4075. tx_fs_reg = WCD934X_CDC_TX0_TX_PATH_CTL + (16 * adc_mux_index);
  4076. tx_stream_fs = snd_soc_component_read(comp, tx_fs_reg) & 0x0F;
  4077. if (tx_stream_fs <= 4) {
  4078. if (wcd->dmic_sample_rate <=
  4079. WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ)
  4080. dmic_fs = wcd->dmic_sample_rate;
  4081. else
  4082. dmic_fs = WCD9XXX_DMIC_SAMPLE_RATE_2P4MHZ;
  4083. } else
  4084. dmic_fs = WCD9XXX_DMIC_SAMPLE_RATE_4P8MHZ;
  4085. } else {
  4086. dmic_fs = wcd->dmic_sample_rate;
  4087. }
  4088. return dmic_fs;
  4089. }
  4090. static u8 wcd934x_get_dmic_clk_val(struct snd_soc_component *comp,
  4091. u32 mclk_rate, u32 dmic_clk_rate)
  4092. {
  4093. u32 div_factor;
  4094. u8 dmic_ctl_val;
  4095. /* Default value to return in case of error */
  4096. if (mclk_rate == WCD934X_MCLK_CLK_9P6MHZ)
  4097. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_2;
  4098. else
  4099. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_3;
  4100. if (dmic_clk_rate == 0) {
  4101. dev_err(comp->dev,
  4102. "%s: dmic_sample_rate cannot be 0\n",
  4103. __func__);
  4104. goto done;
  4105. }
  4106. div_factor = mclk_rate / dmic_clk_rate;
  4107. switch (div_factor) {
  4108. case 2:
  4109. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_2;
  4110. break;
  4111. case 3:
  4112. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_3;
  4113. break;
  4114. case 4:
  4115. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_4;
  4116. break;
  4117. case 6:
  4118. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_6;
  4119. break;
  4120. case 8:
  4121. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_8;
  4122. break;
  4123. case 16:
  4124. dmic_ctl_val = WCD934X_DMIC_CLK_DIV_16;
  4125. break;
  4126. default:
  4127. dev_err(comp->dev,
  4128. "%s: Invalid div_factor %u, clk_rate(%u), dmic_rate(%u)\n",
  4129. __func__, div_factor, mclk_rate, dmic_clk_rate);
  4130. break;
  4131. }
  4132. done:
  4133. return dmic_ctl_val;
  4134. }
  4135. static int wcd934x_codec_enable_dmic(struct snd_soc_dapm_widget *w,
  4136. struct snd_kcontrol *kcontrol, int event)
  4137. {
  4138. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  4139. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  4140. u8 dmic_clk_en = 0x01;
  4141. u16 dmic_clk_reg;
  4142. s32 *dmic_clk_cnt;
  4143. u8 dmic_rate_val, dmic_rate_shift = 1;
  4144. unsigned int dmic;
  4145. u32 dmic_sample_rate;
  4146. int ret;
  4147. char *wname;
  4148. wname = strpbrk(w->name, "012345");
  4149. if (!wname) {
  4150. dev_err(comp->dev, "%s: widget not found\n", __func__);
  4151. return -EINVAL;
  4152. }
  4153. ret = kstrtouint(wname, 10, &dmic);
  4154. if (ret < 0) {
  4155. dev_err(comp->dev, "%s: Invalid DMIC line on the codec\n",
  4156. __func__);
  4157. return -EINVAL;
  4158. }
  4159. switch (dmic) {
  4160. case 0:
  4161. case 1:
  4162. dmic_clk_cnt = &wcd->dmic_0_1_clk_cnt;
  4163. dmic_clk_reg = WCD934X_CPE_SS_DMIC0_CTL;
  4164. break;
  4165. case 2:
  4166. case 3:
  4167. dmic_clk_cnt = &wcd->dmic_2_3_clk_cnt;
  4168. dmic_clk_reg = WCD934X_CPE_SS_DMIC1_CTL;
  4169. break;
  4170. case 4:
  4171. case 5:
  4172. dmic_clk_cnt = &wcd->dmic_4_5_clk_cnt;
  4173. dmic_clk_reg = WCD934X_CPE_SS_DMIC2_CTL;
  4174. break;
  4175. default:
  4176. dev_err(comp->dev, "%s: Invalid DMIC Selection\n",
  4177. __func__);
  4178. return -EINVAL;
  4179. }
  4180. switch (event) {
  4181. case SND_SOC_DAPM_PRE_PMU:
  4182. dmic_sample_rate = wcd934x_get_dmic_sample_rate(comp, dmic,
  4183. wcd);
  4184. dmic_rate_val = wcd934x_get_dmic_clk_val(comp, wcd->rate,
  4185. dmic_sample_rate);
  4186. (*dmic_clk_cnt)++;
  4187. if (*dmic_clk_cnt == 1) {
  4188. dmic_rate_val = dmic_rate_val << dmic_rate_shift;
  4189. snd_soc_component_update_bits(comp, dmic_clk_reg,
  4190. WCD934X_DMIC_RATE_MASK,
  4191. dmic_rate_val);
  4192. snd_soc_component_update_bits(comp, dmic_clk_reg,
  4193. dmic_clk_en, dmic_clk_en);
  4194. }
  4195. break;
  4196. case SND_SOC_DAPM_POST_PMD:
  4197. (*dmic_clk_cnt)--;
  4198. if (*dmic_clk_cnt == 0)
  4199. snd_soc_component_update_bits(comp, dmic_clk_reg,
  4200. dmic_clk_en, 0);
  4201. break;
  4202. }
  4203. return 0;
  4204. }
  4205. static int wcd934x_codec_find_amic_input(struct snd_soc_component *comp,
  4206. int adc_mux_n)
  4207. {
  4208. u16 mask, shift, adc_mux_in_reg;
  4209. u16 amic_mux_sel_reg;
  4210. bool is_amic;
  4211. if (adc_mux_n < 0 || adc_mux_n > WCD934X_MAX_VALID_ADC_MUX ||
  4212. adc_mux_n == WCD934X_INVALID_ADC_MUX)
  4213. return 0;
  4214. if (adc_mux_n < 3) {
  4215. adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
  4216. adc_mux_n;
  4217. mask = 0x03;
  4218. shift = 0;
  4219. amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
  4220. 2 * adc_mux_n;
  4221. } else if (adc_mux_n < 4) {
  4222. adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1;
  4223. mask = 0x03;
  4224. shift = 0;
  4225. amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
  4226. 2 * adc_mux_n;
  4227. } else if (adc_mux_n < 7) {
  4228. adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
  4229. (adc_mux_n - 4);
  4230. mask = 0x0C;
  4231. shift = 2;
  4232. amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 +
  4233. adc_mux_n - 4;
  4234. } else if (adc_mux_n < 8) {
  4235. adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1;
  4236. mask = 0x0C;
  4237. shift = 2;
  4238. amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 +
  4239. adc_mux_n - 4;
  4240. } else if (adc_mux_n < 12) {
  4241. adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
  4242. ((adc_mux_n == 8) ? (adc_mux_n - 8) :
  4243. (adc_mux_n - 9));
  4244. mask = 0x30;
  4245. shift = 4;
  4246. amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 +
  4247. adc_mux_n - 4;
  4248. } else if (adc_mux_n < 13) {
  4249. adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX3_CFG1;
  4250. mask = 0x30;
  4251. shift = 4;
  4252. amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 +
  4253. adc_mux_n - 4;
  4254. } else {
  4255. adc_mux_in_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX0_CFG1;
  4256. mask = 0xC0;
  4257. shift = 6;
  4258. amic_mux_sel_reg = WCD934X_CDC_TX_INP_MUX_ADC_MUX4_CFG0 +
  4259. adc_mux_n - 4;
  4260. }
  4261. is_amic = (((snd_soc_component_read(comp, adc_mux_in_reg)
  4262. & mask) >> shift) == 1);
  4263. if (!is_amic)
  4264. return 0;
  4265. return snd_soc_component_read(comp, amic_mux_sel_reg) & 0x07;
  4266. }
  4267. static u16 wcd934x_codec_get_amic_pwlvl_reg(struct snd_soc_component *comp,
  4268. int amic)
  4269. {
  4270. u16 pwr_level_reg = 0;
  4271. switch (amic) {
  4272. case 1:
  4273. case 2:
  4274. pwr_level_reg = WCD934X_ANA_AMIC1;
  4275. break;
  4276. case 3:
  4277. case 4:
  4278. pwr_level_reg = WCD934X_ANA_AMIC3;
  4279. break;
  4280. default:
  4281. break;
  4282. }
  4283. return pwr_level_reg;
  4284. }
  4285. static int wcd934x_codec_enable_dec(struct snd_soc_dapm_widget *w,
  4286. struct snd_kcontrol *kcontrol, int event)
  4287. {
  4288. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  4289. unsigned int decimator;
  4290. char *dec_adc_mux_name = NULL;
  4291. char *widget_name = NULL;
  4292. char *wname;
  4293. int ret = 0, amic_n;
  4294. u16 tx_vol_ctl_reg, pwr_level_reg = 0, dec_cfg_reg, hpf_gate_reg;
  4295. u16 tx_gain_ctl_reg;
  4296. char *dec;
  4297. u8 hpf_coff_freq;
  4298. widget_name = kstrndup(w->name, 15, GFP_KERNEL);
  4299. if (!widget_name)
  4300. return -ENOMEM;
  4301. wname = widget_name;
  4302. dec_adc_mux_name = strsep(&widget_name, " ");
  4303. if (!dec_adc_mux_name) {
  4304. dev_err(comp->dev, "%s: Invalid decimator = %s\n",
  4305. __func__, w->name);
  4306. ret = -EINVAL;
  4307. goto out;
  4308. }
  4309. dec_adc_mux_name = widget_name;
  4310. dec = strpbrk(dec_adc_mux_name, "012345678");
  4311. if (!dec) {
  4312. dev_err(comp->dev, "%s: decimator index not found\n",
  4313. __func__);
  4314. ret = -EINVAL;
  4315. goto out;
  4316. }
  4317. ret = kstrtouint(dec, 10, &decimator);
  4318. if (ret < 0) {
  4319. dev_err(comp->dev, "%s: Invalid decimator = %s\n",
  4320. __func__, wname);
  4321. ret = -EINVAL;
  4322. goto out;
  4323. }
  4324. tx_vol_ctl_reg = WCD934X_CDC_TX0_TX_PATH_CTL + 16 * decimator;
  4325. hpf_gate_reg = WCD934X_CDC_TX0_TX_PATH_SEC2 + 16 * decimator;
  4326. dec_cfg_reg = WCD934X_CDC_TX0_TX_PATH_CFG0 + 16 * decimator;
  4327. tx_gain_ctl_reg = WCD934X_CDC_TX0_TX_VOL_CTL + 16 * decimator;
  4328. switch (event) {
  4329. case SND_SOC_DAPM_PRE_PMU:
  4330. amic_n = wcd934x_codec_find_amic_input(comp, decimator);
  4331. if (amic_n)
  4332. pwr_level_reg = wcd934x_codec_get_amic_pwlvl_reg(comp,
  4333. amic_n);
  4334. if (!pwr_level_reg)
  4335. break;
  4336. switch ((snd_soc_component_read(comp, pwr_level_reg) &
  4337. WCD934X_AMIC_PWR_LVL_MASK) >>
  4338. WCD934X_AMIC_PWR_LVL_SHIFT) {
  4339. case WCD934X_AMIC_PWR_LEVEL_LP:
  4340. snd_soc_component_update_bits(comp, dec_cfg_reg,
  4341. WCD934X_DEC_PWR_LVL_MASK,
  4342. WCD934X_DEC_PWR_LVL_LP);
  4343. break;
  4344. case WCD934X_AMIC_PWR_LEVEL_HP:
  4345. snd_soc_component_update_bits(comp, dec_cfg_reg,
  4346. WCD934X_DEC_PWR_LVL_MASK,
  4347. WCD934X_DEC_PWR_LVL_HP);
  4348. break;
  4349. case WCD934X_AMIC_PWR_LEVEL_DEFAULT:
  4350. case WCD934X_AMIC_PWR_LEVEL_HYBRID:
  4351. default:
  4352. snd_soc_component_update_bits(comp, dec_cfg_reg,
  4353. WCD934X_DEC_PWR_LVL_MASK,
  4354. WCD934X_DEC_PWR_LVL_DF);
  4355. break;
  4356. }
  4357. break;
  4358. case SND_SOC_DAPM_POST_PMU:
  4359. hpf_coff_freq = (snd_soc_component_read(comp, dec_cfg_reg) &
  4360. TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
  4361. if (hpf_coff_freq != CF_MIN_3DB_150HZ) {
  4362. snd_soc_component_update_bits(comp, dec_cfg_reg,
  4363. TX_HPF_CUT_OFF_FREQ_MASK,
  4364. CF_MIN_3DB_150HZ << 5);
  4365. snd_soc_component_update_bits(comp, hpf_gate_reg,
  4366. WCD934X_HPH_CUTOFF_FREQ_CHANGE_REQ_MASK,
  4367. WCD934X_HPH_CUTOFF_FREQ_CHANGE_REQ);
  4368. /*
  4369. * Minimum 1 clk cycle delay is required as per
  4370. * HW spec.
  4371. */
  4372. usleep_range(1000, 1010);
  4373. snd_soc_component_update_bits(comp, hpf_gate_reg,
  4374. WCD934X_HPH_CUTOFF_FREQ_CHANGE_REQ_MASK,
  4375. 0);
  4376. }
  4377. /* apply gain after decimator is enabled */
  4378. snd_soc_component_write(comp, tx_gain_ctl_reg,
  4379. snd_soc_component_read(comp,
  4380. tx_gain_ctl_reg));
  4381. break;
  4382. case SND_SOC_DAPM_PRE_PMD:
  4383. hpf_coff_freq = (snd_soc_component_read(comp, dec_cfg_reg) &
  4384. TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
  4385. if (hpf_coff_freq != CF_MIN_3DB_150HZ) {
  4386. snd_soc_component_update_bits(comp, dec_cfg_reg,
  4387. TX_HPF_CUT_OFF_FREQ_MASK,
  4388. hpf_coff_freq << 5);
  4389. snd_soc_component_update_bits(comp, hpf_gate_reg,
  4390. WCD934X_HPH_CUTOFF_FREQ_CHANGE_REQ_MASK,
  4391. WCD934X_HPH_CUTOFF_FREQ_CHANGE_REQ);
  4392. /*
  4393. * Minimum 1 clk cycle delay is required as per
  4394. * HW spec.
  4395. */
  4396. usleep_range(1000, 1010);
  4397. snd_soc_component_update_bits(comp, hpf_gate_reg,
  4398. WCD934X_HPH_CUTOFF_FREQ_CHANGE_REQ_MASK,
  4399. 0);
  4400. }
  4401. break;
  4402. case SND_SOC_DAPM_POST_PMD:
  4403. snd_soc_component_update_bits(comp, tx_vol_ctl_reg,
  4404. 0x10, 0x00);
  4405. snd_soc_component_update_bits(comp, dec_cfg_reg,
  4406. WCD934X_DEC_PWR_LVL_MASK,
  4407. WCD934X_DEC_PWR_LVL_DF);
  4408. break;
  4409. }
  4410. out:
  4411. kfree(wname);
  4412. return ret;
  4413. }
  4414. static void wcd934x_codec_set_tx_hold(struct snd_soc_component *comp,
  4415. u16 amic_reg, bool set)
  4416. {
  4417. u8 mask = 0x20;
  4418. u8 val;
  4419. if (amic_reg == WCD934X_ANA_AMIC1 ||
  4420. amic_reg == WCD934X_ANA_AMIC3)
  4421. mask = 0x40;
  4422. val = set ? mask : 0x00;
  4423. switch (amic_reg) {
  4424. case WCD934X_ANA_AMIC1:
  4425. case WCD934X_ANA_AMIC2:
  4426. snd_soc_component_update_bits(comp, WCD934X_ANA_AMIC2,
  4427. mask, val);
  4428. break;
  4429. case WCD934X_ANA_AMIC3:
  4430. case WCD934X_ANA_AMIC4:
  4431. snd_soc_component_update_bits(comp, WCD934X_ANA_AMIC4,
  4432. mask, val);
  4433. break;
  4434. default:
  4435. break;
  4436. }
  4437. }
  4438. static int wcd934x_codec_enable_adc(struct snd_soc_dapm_widget *w,
  4439. struct snd_kcontrol *kcontrol, int event)
  4440. {
  4441. struct snd_soc_component *comp = snd_soc_dapm_to_component(w->dapm);
  4442. switch (event) {
  4443. case SND_SOC_DAPM_PRE_PMU:
  4444. wcd934x_codec_set_tx_hold(comp, w->reg, true);
  4445. break;
  4446. default:
  4447. break;
  4448. }
  4449. return 0;
  4450. }
  4451. static int wcd934x_codec_enable_micbias(struct snd_soc_dapm_widget *w,
  4452. struct snd_kcontrol *kcontrol,
  4453. int event)
  4454. {
  4455. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  4456. int micb_num = w->shift;
  4457. switch (event) {
  4458. case SND_SOC_DAPM_PRE_PMU:
  4459. wcd934x_micbias_control(component, micb_num, MICB_ENABLE, true);
  4460. break;
  4461. case SND_SOC_DAPM_POST_PMU:
  4462. /* 1 msec delay as per HW requirement */
  4463. usleep_range(1000, 1100);
  4464. break;
  4465. case SND_SOC_DAPM_POST_PMD:
  4466. wcd934x_micbias_control(component, micb_num, MICB_DISABLE, true);
  4467. break;
  4468. }
  4469. return 0;
  4470. }
  4471. static const struct snd_soc_dapm_widget wcd934x_dapm_widgets[] = {
  4472. /* Analog Outputs */
  4473. SND_SOC_DAPM_OUTPUT("EAR"),
  4474. SND_SOC_DAPM_OUTPUT("HPHL"),
  4475. SND_SOC_DAPM_OUTPUT("HPHR"),
  4476. SND_SOC_DAPM_OUTPUT("LINEOUT1"),
  4477. SND_SOC_DAPM_OUTPUT("LINEOUT2"),
  4478. SND_SOC_DAPM_OUTPUT("SPK1 OUT"),
  4479. SND_SOC_DAPM_OUTPUT("SPK2 OUT"),
  4480. SND_SOC_DAPM_OUTPUT("ANC EAR"),
  4481. SND_SOC_DAPM_OUTPUT("ANC HPHL"),
  4482. SND_SOC_DAPM_OUTPUT("ANC HPHR"),
  4483. SND_SOC_DAPM_OUTPUT("WDMA3_OUT"),
  4484. SND_SOC_DAPM_OUTPUT("MAD_CPE_OUT1"),
  4485. SND_SOC_DAPM_OUTPUT("MAD_CPE_OUT2"),
  4486. SND_SOC_DAPM_AIF_IN_E("AIF1 PB", "AIF1 Playback", 0, SND_SOC_NOPM,
  4487. AIF1_PB, 0, wcd934x_codec_enable_slim,
  4488. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4489. SND_SOC_DAPM_AIF_IN_E("AIF2 PB", "AIF2 Playback", 0, SND_SOC_NOPM,
  4490. AIF2_PB, 0, wcd934x_codec_enable_slim,
  4491. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4492. SND_SOC_DAPM_AIF_IN_E("AIF3 PB", "AIF3 Playback", 0, SND_SOC_NOPM,
  4493. AIF3_PB, 0, wcd934x_codec_enable_slim,
  4494. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4495. SND_SOC_DAPM_AIF_IN_E("AIF4 PB", "AIF4 Playback", 0, SND_SOC_NOPM,
  4496. AIF4_PB, 0, wcd934x_codec_enable_slim,
  4497. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4498. SND_SOC_DAPM_MUX("SLIM RX0 MUX", SND_SOC_NOPM, WCD934X_RX0, 0,
  4499. &slim_rx_mux[WCD934X_RX0]),
  4500. SND_SOC_DAPM_MUX("SLIM RX1 MUX", SND_SOC_NOPM, WCD934X_RX1, 0,
  4501. &slim_rx_mux[WCD934X_RX1]),
  4502. SND_SOC_DAPM_MUX("SLIM RX2 MUX", SND_SOC_NOPM, WCD934X_RX2, 0,
  4503. &slim_rx_mux[WCD934X_RX2]),
  4504. SND_SOC_DAPM_MUX("SLIM RX3 MUX", SND_SOC_NOPM, WCD934X_RX3, 0,
  4505. &slim_rx_mux[WCD934X_RX3]),
  4506. SND_SOC_DAPM_MUX("SLIM RX4 MUX", SND_SOC_NOPM, WCD934X_RX4, 0,
  4507. &slim_rx_mux[WCD934X_RX4]),
  4508. SND_SOC_DAPM_MUX("SLIM RX5 MUX", SND_SOC_NOPM, WCD934X_RX5, 0,
  4509. &slim_rx_mux[WCD934X_RX5]),
  4510. SND_SOC_DAPM_MUX("SLIM RX6 MUX", SND_SOC_NOPM, WCD934X_RX6, 0,
  4511. &slim_rx_mux[WCD934X_RX6]),
  4512. SND_SOC_DAPM_MUX("SLIM RX7 MUX", SND_SOC_NOPM, WCD934X_RX7, 0,
  4513. &slim_rx_mux[WCD934X_RX7]),
  4514. SND_SOC_DAPM_MIXER("SLIM RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
  4515. SND_SOC_DAPM_MIXER("SLIM RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4516. SND_SOC_DAPM_MIXER("SLIM RX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4517. SND_SOC_DAPM_MIXER("SLIM RX3", SND_SOC_NOPM, 0, 0, NULL, 0),
  4518. SND_SOC_DAPM_MIXER("SLIM RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
  4519. SND_SOC_DAPM_MIXER("SLIM RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
  4520. SND_SOC_DAPM_MIXER("SLIM RX6", SND_SOC_NOPM, 0, 0, NULL, 0),
  4521. SND_SOC_DAPM_MIXER("SLIM RX7", SND_SOC_NOPM, 0, 0, NULL, 0),
  4522. SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_EAR, 0,
  4523. &rx_int0_2_mux, wcd934x_codec_enable_mix_path,
  4524. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4525. SND_SOC_DAPM_POST_PMD),
  4526. SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0,
  4527. &rx_int1_2_mux, wcd934x_codec_enable_mix_path,
  4528. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4529. SND_SOC_DAPM_POST_PMD),
  4530. SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0,
  4531. &rx_int2_2_mux, wcd934x_codec_enable_mix_path,
  4532. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4533. SND_SOC_DAPM_POST_PMD),
  4534. SND_SOC_DAPM_MUX_E("RX INT3_2 MUX", SND_SOC_NOPM, INTERP_LO1, 0,
  4535. &rx_int3_2_mux, wcd934x_codec_enable_mix_path,
  4536. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4537. SND_SOC_DAPM_POST_PMD),
  4538. SND_SOC_DAPM_MUX_E("RX INT4_2 MUX", SND_SOC_NOPM, INTERP_LO2, 0,
  4539. &rx_int4_2_mux, wcd934x_codec_enable_mix_path,
  4540. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4541. SND_SOC_DAPM_POST_PMD),
  4542. SND_SOC_DAPM_MUX_E("RX INT7_2 MUX", SND_SOC_NOPM, INTERP_SPKR1, 0,
  4543. &rx_int7_2_mux, wcd934x_codec_enable_mix_path,
  4544. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4545. SND_SOC_DAPM_POST_PMD),
  4546. SND_SOC_DAPM_MUX_E("RX INT8_2 MUX", SND_SOC_NOPM, INTERP_SPKR2, 0,
  4547. &rx_int8_2_mux, wcd934x_codec_enable_mix_path,
  4548. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4549. SND_SOC_DAPM_POST_PMD),
  4550. SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
  4551. &rx_int0_1_mix_inp0_mux),
  4552. SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
  4553. &rx_int0_1_mix_inp1_mux),
  4554. SND_SOC_DAPM_MUX("RX INT0_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
  4555. &rx_int0_1_mix_inp2_mux),
  4556. SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
  4557. &rx_int1_1_mix_inp0_mux),
  4558. SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
  4559. &rx_int1_1_mix_inp1_mux),
  4560. SND_SOC_DAPM_MUX("RX INT1_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
  4561. &rx_int1_1_mix_inp2_mux),
  4562. SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
  4563. &rx_int2_1_mix_inp0_mux),
  4564. SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
  4565. &rx_int2_1_mix_inp1_mux),
  4566. SND_SOC_DAPM_MUX("RX INT2_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
  4567. &rx_int2_1_mix_inp2_mux),
  4568. SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
  4569. &rx_int3_1_mix_inp0_mux),
  4570. SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
  4571. &rx_int3_1_mix_inp1_mux),
  4572. SND_SOC_DAPM_MUX("RX INT3_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
  4573. &rx_int3_1_mix_inp2_mux),
  4574. SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
  4575. &rx_int4_1_mix_inp0_mux),
  4576. SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
  4577. &rx_int4_1_mix_inp1_mux),
  4578. SND_SOC_DAPM_MUX("RX INT4_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
  4579. &rx_int4_1_mix_inp2_mux),
  4580. SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
  4581. &rx_int7_1_mix_inp0_mux),
  4582. SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
  4583. &rx_int7_1_mix_inp1_mux),
  4584. SND_SOC_DAPM_MUX("RX INT7_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
  4585. &rx_int7_1_mix_inp2_mux),
  4586. SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP0", SND_SOC_NOPM, 0, 0,
  4587. &rx_int8_1_mix_inp0_mux),
  4588. SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
  4589. &rx_int8_1_mix_inp1_mux),
  4590. SND_SOC_DAPM_MUX("RX INT8_1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
  4591. &rx_int8_1_mix_inp2_mux),
  4592. SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4593. SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
  4594. SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4595. SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0,
  4596. rx_int1_asrc_switch,
  4597. ARRAY_SIZE(rx_int1_asrc_switch)),
  4598. SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4599. SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0,
  4600. rx_int2_asrc_switch,
  4601. ARRAY_SIZE(rx_int2_asrc_switch)),
  4602. SND_SOC_DAPM_MIXER("RX INT3_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4603. SND_SOC_DAPM_MIXER("RX INT3 SEC MIX", SND_SOC_NOPM, 0, 0,
  4604. rx_int3_asrc_switch,
  4605. ARRAY_SIZE(rx_int3_asrc_switch)),
  4606. SND_SOC_DAPM_MIXER("RX INT4_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4607. SND_SOC_DAPM_MIXER("RX INT4 SEC MIX", SND_SOC_NOPM, 0, 0,
  4608. rx_int4_asrc_switch,
  4609. ARRAY_SIZE(rx_int4_asrc_switch)),
  4610. SND_SOC_DAPM_MIXER("RX INT7_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4611. SND_SOC_DAPM_MIXER("RX INT7 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
  4612. SND_SOC_DAPM_MIXER("RX INT8_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4613. SND_SOC_DAPM_MIXER("RX INT8 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
  4614. SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4615. SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4616. SND_SOC_DAPM_MIXER("RX INT1 MIX3", SND_SOC_NOPM, 0, 0, NULL, 0),
  4617. SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4618. SND_SOC_DAPM_MIXER("RX INT2 MIX3", SND_SOC_NOPM, 0, 0, NULL, 0),
  4619. SND_SOC_DAPM_MIXER("RX INT3 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4620. SND_SOC_DAPM_MIXER("RX INT3 MIX3", SND_SOC_NOPM, 0, 0, NULL, 0),
  4621. SND_SOC_DAPM_MIXER("RX INT4 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4622. SND_SOC_DAPM_MIXER("RX INT4 MIX3", SND_SOC_NOPM, 0, 0, NULL, 0),
  4623. SND_SOC_DAPM_MIXER("RX INT7 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4624. SND_SOC_DAPM_MIXER_E("RX INT7 CHAIN", SND_SOC_NOPM, 0, 0,
  4625. NULL, 0, NULL, 0),
  4626. SND_SOC_DAPM_MIXER_E("RX INT8 CHAIN", SND_SOC_NOPM, 0, 0,
  4627. NULL, 0, NULL, 0),
  4628. SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", WCD934X_CDC_RX0_RX_PATH_CFG0, 4,
  4629. 0, &rx_int0_mix2_inp_mux, NULL,
  4630. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4631. SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", WCD934X_CDC_RX1_RX_PATH_CFG0, 4,
  4632. 0, &rx_int1_mix2_inp_mux, NULL,
  4633. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4634. SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", WCD934X_CDC_RX2_RX_PATH_CFG0, 4,
  4635. 0, &rx_int2_mix2_inp_mux, NULL,
  4636. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4637. SND_SOC_DAPM_MUX_E("RX INT3 MIX2 INP", WCD934X_CDC_RX3_RX_PATH_CFG0, 4,
  4638. 0, &rx_int3_mix2_inp_mux, NULL,
  4639. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4640. SND_SOC_DAPM_MUX_E("RX INT4 MIX2 INP", WCD934X_CDC_RX4_RX_PATH_CFG0, 4,
  4641. 0, &rx_int4_mix2_inp_mux, NULL,
  4642. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4643. SND_SOC_DAPM_MUX_E("RX INT7 MIX2 INP", WCD934X_CDC_RX7_RX_PATH_CFG0, 4,
  4644. 0, &rx_int7_mix2_inp_mux, NULL,
  4645. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4646. SND_SOC_DAPM_MUX("IIR0 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp0_mux),
  4647. SND_SOC_DAPM_MUX("IIR0 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp1_mux),
  4648. SND_SOC_DAPM_MUX("IIR0 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp2_mux),
  4649. SND_SOC_DAPM_MUX("IIR0 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir0_inp3_mux),
  4650. SND_SOC_DAPM_MUX("IIR1 INP0 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp0_mux),
  4651. SND_SOC_DAPM_MUX("IIR1 INP1 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp1_mux),
  4652. SND_SOC_DAPM_MUX("IIR1 INP2 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp2_mux),
  4653. SND_SOC_DAPM_MUX("IIR1 INP3 MUX", SND_SOC_NOPM, 0, 0, &iir1_inp3_mux),
  4654. SND_SOC_DAPM_PGA_E("IIR0", WCD934X_CDC_SIDETONE_IIR0_IIR_GAIN_B1_CTL,
  4655. 0, 0, NULL, 0, wcd934x_codec_set_iir_gain,
  4656. SND_SOC_DAPM_POST_PMU),
  4657. SND_SOC_DAPM_PGA_E("IIR1", WCD934X_CDC_SIDETONE_IIR1_IIR_GAIN_B1_CTL,
  4658. 1, 0, NULL, 0, wcd934x_codec_set_iir_gain,
  4659. SND_SOC_DAPM_POST_PMU),
  4660. SND_SOC_DAPM_MIXER("SRC0", WCD934X_CDC_SIDETONE_SRC0_ST_SRC_PATH_CTL,
  4661. 4, 0, NULL, 0),
  4662. SND_SOC_DAPM_MIXER("SRC1", WCD934X_CDC_SIDETONE_SRC1_ST_SRC_PATH_CTL,
  4663. 4, 0, NULL, 0),
  4664. SND_SOC_DAPM_MUX("RX INT0 DEM MUX", SND_SOC_NOPM, 0, 0,
  4665. &rx_int0_dem_inp_mux),
  4666. SND_SOC_DAPM_MUX("RX INT1 DEM MUX", SND_SOC_NOPM, 0, 0,
  4667. &rx_int1_dem_inp_mux),
  4668. SND_SOC_DAPM_MUX("RX INT2 DEM MUX", SND_SOC_NOPM, 0, 0,
  4669. &rx_int2_dem_inp_mux),
  4670. SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_EAR, 0,
  4671. &rx_int0_1_interp_mux,
  4672. wcd934x_codec_enable_main_path,
  4673. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4674. SND_SOC_DAPM_POST_PMD),
  4675. SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0,
  4676. &rx_int1_1_interp_mux,
  4677. wcd934x_codec_enable_main_path,
  4678. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4679. SND_SOC_DAPM_POST_PMD),
  4680. SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0,
  4681. &rx_int2_1_interp_mux,
  4682. wcd934x_codec_enable_main_path,
  4683. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4684. SND_SOC_DAPM_POST_PMD),
  4685. SND_SOC_DAPM_MUX_E("RX INT3_1 INTERP", SND_SOC_NOPM, INTERP_LO1, 0,
  4686. &rx_int3_1_interp_mux,
  4687. wcd934x_codec_enable_main_path,
  4688. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4689. SND_SOC_DAPM_POST_PMD),
  4690. SND_SOC_DAPM_MUX_E("RX INT4_1 INTERP", SND_SOC_NOPM, INTERP_LO2, 0,
  4691. &rx_int4_1_interp_mux,
  4692. wcd934x_codec_enable_main_path,
  4693. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4694. SND_SOC_DAPM_POST_PMD),
  4695. SND_SOC_DAPM_MUX_E("RX INT7_1 INTERP", SND_SOC_NOPM, INTERP_SPKR1, 0,
  4696. &rx_int7_1_interp_mux,
  4697. wcd934x_codec_enable_main_path,
  4698. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4699. SND_SOC_DAPM_POST_PMD),
  4700. SND_SOC_DAPM_MUX_E("RX INT8_1 INTERP", SND_SOC_NOPM, INTERP_SPKR2, 0,
  4701. &rx_int8_1_interp_mux,
  4702. wcd934x_codec_enable_main_path,
  4703. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4704. SND_SOC_DAPM_POST_PMD),
  4705. SND_SOC_DAPM_MUX("RX INT0_2 INTERP", SND_SOC_NOPM, 0, 0,
  4706. &rx_int0_2_interp_mux),
  4707. SND_SOC_DAPM_MUX("RX INT1_2 INTERP", SND_SOC_NOPM, 0, 0,
  4708. &rx_int1_2_interp_mux),
  4709. SND_SOC_DAPM_MUX("RX INT2_2 INTERP", SND_SOC_NOPM, 0, 0,
  4710. &rx_int2_2_interp_mux),
  4711. SND_SOC_DAPM_MUX("RX INT3_2 INTERP", SND_SOC_NOPM, 0, 0,
  4712. &rx_int3_2_interp_mux),
  4713. SND_SOC_DAPM_MUX("RX INT4_2 INTERP", SND_SOC_NOPM, 0, 0,
  4714. &rx_int4_2_interp_mux),
  4715. SND_SOC_DAPM_MUX("RX INT7_2 INTERP", SND_SOC_NOPM, 0, 0,
  4716. &rx_int7_2_interp_mux),
  4717. SND_SOC_DAPM_MUX("RX INT8_2 INTERP", SND_SOC_NOPM, 0, 0,
  4718. &rx_int8_2_interp_mux),
  4719. SND_SOC_DAPM_DAC_E("RX INT0 DAC", NULL, SND_SOC_NOPM,
  4720. 0, 0, wcd934x_codec_ear_dac_event,
  4721. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4722. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4723. SND_SOC_DAPM_DAC_E("RX INT1 DAC", NULL, WCD934X_ANA_HPH,
  4724. 5, 0, wcd934x_codec_hphl_dac_event,
  4725. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4726. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4727. SND_SOC_DAPM_DAC_E("RX INT2 DAC", NULL, WCD934X_ANA_HPH,
  4728. 4, 0, wcd934x_codec_hphr_dac_event,
  4729. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4730. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4731. SND_SOC_DAPM_DAC_E("RX INT3 DAC", NULL, SND_SOC_NOPM,
  4732. 0, 0, wcd934x_codec_lineout_dac_event,
  4733. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4734. SND_SOC_DAPM_DAC_E("RX INT4 DAC", NULL, SND_SOC_NOPM,
  4735. 0, 0, wcd934x_codec_lineout_dac_event,
  4736. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4737. SND_SOC_DAPM_PGA_E("EAR PA", WCD934X_ANA_EAR, 7, 0, NULL, 0, NULL, 0),
  4738. SND_SOC_DAPM_PGA_E("HPHL PA", WCD934X_ANA_HPH, 7, 0, NULL, 0,
  4739. wcd934x_codec_enable_hphl_pa,
  4740. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4741. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4742. SND_SOC_DAPM_PGA_E("HPHR PA", WCD934X_ANA_HPH, 6, 0, NULL, 0,
  4743. wcd934x_codec_enable_hphr_pa,
  4744. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4745. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4746. SND_SOC_DAPM_PGA_E("LINEOUT1 PA", WCD934X_ANA_LO_1_2, 7, 0, NULL, 0,
  4747. NULL, 0),
  4748. SND_SOC_DAPM_PGA_E("LINEOUT2 PA", WCD934X_ANA_LO_1_2, 6, 0, NULL, 0,
  4749. NULL, 0),
  4750. SND_SOC_DAPM_SUPPLY("RX_BIAS", WCD934X_ANA_RX_SUPPLIES, 0, 0, NULL,
  4751. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4752. SND_SOC_DAPM_SUPPLY("SBOOST0", WCD934X_CDC_RX7_RX_PATH_CFG1,
  4753. 0, 0, NULL, 0),
  4754. SND_SOC_DAPM_SUPPLY("SBOOST0_CLK", WCD934X_CDC_BOOST0_BOOST_PATH_CTL,
  4755. 0, 0, NULL, 0),
  4756. SND_SOC_DAPM_SUPPLY("SBOOST1", WCD934X_CDC_RX8_RX_PATH_CFG1,
  4757. 0, 0, NULL, 0),
  4758. SND_SOC_DAPM_SUPPLY("SBOOST1_CLK", WCD934X_CDC_BOOST1_BOOST_PATH_CTL,
  4759. 0, 0, NULL, 0),
  4760. SND_SOC_DAPM_SUPPLY("INT0_CLK", SND_SOC_NOPM, INTERP_EAR, 0,
  4761. wcd934x_codec_enable_interp_clk,
  4762. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4763. SND_SOC_DAPM_SUPPLY("INT1_CLK", SND_SOC_NOPM, INTERP_HPHL, 0,
  4764. wcd934x_codec_enable_interp_clk,
  4765. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4766. SND_SOC_DAPM_SUPPLY("INT2_CLK", SND_SOC_NOPM, INTERP_HPHR, 0,
  4767. wcd934x_codec_enable_interp_clk,
  4768. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4769. SND_SOC_DAPM_SUPPLY("INT3_CLK", SND_SOC_NOPM, INTERP_LO1, 0,
  4770. wcd934x_codec_enable_interp_clk,
  4771. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4772. SND_SOC_DAPM_SUPPLY("INT4_CLK", SND_SOC_NOPM, INTERP_LO2, 0,
  4773. wcd934x_codec_enable_interp_clk,
  4774. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4775. SND_SOC_DAPM_SUPPLY("INT7_CLK", SND_SOC_NOPM, INTERP_SPKR1, 0,
  4776. wcd934x_codec_enable_interp_clk,
  4777. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4778. SND_SOC_DAPM_SUPPLY("INT8_CLK", SND_SOC_NOPM, INTERP_SPKR2, 0,
  4779. wcd934x_codec_enable_interp_clk,
  4780. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4781. SND_SOC_DAPM_SUPPLY("DSMDEM0_CLK", WCD934X_CDC_RX0_RX_PATH_DSMDEM_CTL,
  4782. 0, 0, NULL, 0),
  4783. SND_SOC_DAPM_SUPPLY("DSMDEM1_CLK", WCD934X_CDC_RX1_RX_PATH_DSMDEM_CTL,
  4784. 0, 0, NULL, 0),
  4785. SND_SOC_DAPM_SUPPLY("DSMDEM2_CLK", WCD934X_CDC_RX2_RX_PATH_DSMDEM_CTL,
  4786. 0, 0, NULL, 0),
  4787. SND_SOC_DAPM_SUPPLY("DSMDEM3_CLK", WCD934X_CDC_RX3_RX_PATH_DSMDEM_CTL,
  4788. 0, 0, NULL, 0),
  4789. SND_SOC_DAPM_SUPPLY("DSMDEM4_CLK", WCD934X_CDC_RX4_RX_PATH_DSMDEM_CTL,
  4790. 0, 0, NULL, 0),
  4791. SND_SOC_DAPM_SUPPLY("DSMDEM7_CLK", WCD934X_CDC_RX7_RX_PATH_DSMDEM_CTL,
  4792. 0, 0, NULL, 0),
  4793. SND_SOC_DAPM_SUPPLY("DSMDEM8_CLK", WCD934X_CDC_RX8_RX_PATH_DSMDEM_CTL,
  4794. 0, 0, NULL, 0),
  4795. SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0,
  4796. wcd934x_codec_enable_mclk,
  4797. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4798. /* TX */
  4799. SND_SOC_DAPM_INPUT("AMIC1"),
  4800. SND_SOC_DAPM_INPUT("AMIC2"),
  4801. SND_SOC_DAPM_INPUT("AMIC3"),
  4802. SND_SOC_DAPM_INPUT("AMIC4"),
  4803. SND_SOC_DAPM_INPUT("AMIC5"),
  4804. SND_SOC_DAPM_INPUT("DMIC0 Pin"),
  4805. SND_SOC_DAPM_INPUT("DMIC1 Pin"),
  4806. SND_SOC_DAPM_INPUT("DMIC2 Pin"),
  4807. SND_SOC_DAPM_INPUT("DMIC3 Pin"),
  4808. SND_SOC_DAPM_INPUT("DMIC4 Pin"),
  4809. SND_SOC_DAPM_INPUT("DMIC5 Pin"),
  4810. SND_SOC_DAPM_AIF_OUT_E("AIF1 CAP", "AIF1 Capture", 0, SND_SOC_NOPM,
  4811. AIF1_CAP, 0, wcd934x_codec_enable_slim,
  4812. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4813. SND_SOC_DAPM_AIF_OUT_E("AIF2 CAP", "AIF2 Capture", 0, SND_SOC_NOPM,
  4814. AIF2_CAP, 0, wcd934x_codec_enable_slim,
  4815. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4816. SND_SOC_DAPM_AIF_OUT_E("AIF3 CAP", "AIF3 Capture", 0, SND_SOC_NOPM,
  4817. AIF3_CAP, 0, wcd934x_codec_enable_slim,
  4818. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4819. SND_SOC_DAPM_MIXER("SLIM TX0", SND_SOC_NOPM, 0, 0, NULL, 0),
  4820. SND_SOC_DAPM_MIXER("SLIM TX1", SND_SOC_NOPM, 0, 0, NULL, 0),
  4821. SND_SOC_DAPM_MIXER("SLIM TX2", SND_SOC_NOPM, 0, 0, NULL, 0),
  4822. SND_SOC_DAPM_MIXER("SLIM TX3", SND_SOC_NOPM, 0, 0, NULL, 0),
  4823. SND_SOC_DAPM_MIXER("SLIM TX4", SND_SOC_NOPM, 0, 0, NULL, 0),
  4824. SND_SOC_DAPM_MIXER("SLIM TX5", SND_SOC_NOPM, 0, 0, NULL, 0),
  4825. SND_SOC_DAPM_MIXER("SLIM TX6", SND_SOC_NOPM, 0, 0, NULL, 0),
  4826. SND_SOC_DAPM_MIXER("SLIM TX7", SND_SOC_NOPM, 0, 0, NULL, 0),
  4827. SND_SOC_DAPM_MIXER("SLIM TX8", SND_SOC_NOPM, 0, 0, NULL, 0),
  4828. SND_SOC_DAPM_MIXER("SLIM TX9", SND_SOC_NOPM, 0, 0, NULL, 0),
  4829. SND_SOC_DAPM_MIXER("SLIM TX10", SND_SOC_NOPM, 0, 0, NULL, 0),
  4830. SND_SOC_DAPM_MIXER("SLIM TX11", SND_SOC_NOPM, 0, 0, NULL, 0),
  4831. SND_SOC_DAPM_MIXER("SLIM TX13", SND_SOC_NOPM, 0, 0, NULL, 0),
  4832. /* Digital Mic Inputs */
  4833. SND_SOC_DAPM_ADC_E("DMIC0", NULL, SND_SOC_NOPM, 0, 0,
  4834. wcd934x_codec_enable_dmic,
  4835. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4836. SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
  4837. wcd934x_codec_enable_dmic,
  4838. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4839. SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0,
  4840. wcd934x_codec_enable_dmic,
  4841. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4842. SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 0,
  4843. wcd934x_codec_enable_dmic,
  4844. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4845. SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 0,
  4846. wcd934x_codec_enable_dmic,
  4847. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4848. SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 0,
  4849. wcd934x_codec_enable_dmic,
  4850. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  4851. SND_SOC_DAPM_MUX("DMIC MUX0", SND_SOC_NOPM, 0, 0, &tx_dmic_mux0),
  4852. SND_SOC_DAPM_MUX("DMIC MUX1", SND_SOC_NOPM, 0, 0, &tx_dmic_mux1),
  4853. SND_SOC_DAPM_MUX("DMIC MUX2", SND_SOC_NOPM, 0, 0, &tx_dmic_mux2),
  4854. SND_SOC_DAPM_MUX("DMIC MUX3", SND_SOC_NOPM, 0, 0, &tx_dmic_mux3),
  4855. SND_SOC_DAPM_MUX("DMIC MUX4", SND_SOC_NOPM, 0, 0, &tx_dmic_mux4),
  4856. SND_SOC_DAPM_MUX("DMIC MUX5", SND_SOC_NOPM, 0, 0, &tx_dmic_mux5),
  4857. SND_SOC_DAPM_MUX("DMIC MUX6", SND_SOC_NOPM, 0, 0, &tx_dmic_mux6),
  4858. SND_SOC_DAPM_MUX("DMIC MUX7", SND_SOC_NOPM, 0, 0, &tx_dmic_mux7),
  4859. SND_SOC_DAPM_MUX("DMIC MUX8", SND_SOC_NOPM, 0, 0, &tx_dmic_mux8),
  4860. SND_SOC_DAPM_MUX("AMIC MUX0", SND_SOC_NOPM, 0, 0, &tx_amic_mux0),
  4861. SND_SOC_DAPM_MUX("AMIC MUX1", SND_SOC_NOPM, 0, 0, &tx_amic_mux1),
  4862. SND_SOC_DAPM_MUX("AMIC MUX2", SND_SOC_NOPM, 0, 0, &tx_amic_mux2),
  4863. SND_SOC_DAPM_MUX("AMIC MUX3", SND_SOC_NOPM, 0, 0, &tx_amic_mux3),
  4864. SND_SOC_DAPM_MUX("AMIC MUX4", SND_SOC_NOPM, 0, 0, &tx_amic_mux4),
  4865. SND_SOC_DAPM_MUX("AMIC MUX5", SND_SOC_NOPM, 0, 0, &tx_amic_mux5),
  4866. SND_SOC_DAPM_MUX("AMIC MUX6", SND_SOC_NOPM, 0, 0, &tx_amic_mux6),
  4867. SND_SOC_DAPM_MUX("AMIC MUX7", SND_SOC_NOPM, 0, 0, &tx_amic_mux7),
  4868. SND_SOC_DAPM_MUX("AMIC MUX8", SND_SOC_NOPM, 0, 0, &tx_amic_mux8),
  4869. SND_SOC_DAPM_MUX_E("ADC MUX0", WCD934X_CDC_TX0_TX_PATH_CTL, 5, 0,
  4870. &tx_adc_mux0_mux, wcd934x_codec_enable_dec,
  4871. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4872. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4873. SND_SOC_DAPM_MUX_E("ADC MUX1", WCD934X_CDC_TX1_TX_PATH_CTL, 5, 0,
  4874. &tx_adc_mux1_mux, wcd934x_codec_enable_dec,
  4875. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4876. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4877. SND_SOC_DAPM_MUX_E("ADC MUX2", WCD934X_CDC_TX2_TX_PATH_CTL, 5, 0,
  4878. &tx_adc_mux2_mux, wcd934x_codec_enable_dec,
  4879. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4880. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4881. SND_SOC_DAPM_MUX_E("ADC MUX3", WCD934X_CDC_TX3_TX_PATH_CTL, 5, 0,
  4882. &tx_adc_mux3_mux, wcd934x_codec_enable_dec,
  4883. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4884. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4885. SND_SOC_DAPM_MUX_E("ADC MUX4", WCD934X_CDC_TX4_TX_PATH_CTL, 5, 0,
  4886. &tx_adc_mux4_mux, wcd934x_codec_enable_dec,
  4887. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4888. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4889. SND_SOC_DAPM_MUX_E("ADC MUX5", WCD934X_CDC_TX5_TX_PATH_CTL, 5, 0,
  4890. &tx_adc_mux5_mux, wcd934x_codec_enable_dec,
  4891. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4892. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4893. SND_SOC_DAPM_MUX_E("ADC MUX6", WCD934X_CDC_TX6_TX_PATH_CTL, 5, 0,
  4894. &tx_adc_mux6_mux, wcd934x_codec_enable_dec,
  4895. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4896. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4897. SND_SOC_DAPM_MUX_E("ADC MUX7", WCD934X_CDC_TX7_TX_PATH_CTL, 5, 0,
  4898. &tx_adc_mux7_mux, wcd934x_codec_enable_dec,
  4899. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4900. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4901. SND_SOC_DAPM_MUX_E("ADC MUX8", WCD934X_CDC_TX8_TX_PATH_CTL, 5, 0,
  4902. &tx_adc_mux8_mux, wcd934x_codec_enable_dec,
  4903. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  4904. SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
  4905. SND_SOC_DAPM_ADC_E("ADC1", NULL, WCD934X_ANA_AMIC1, 7, 0,
  4906. wcd934x_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
  4907. SND_SOC_DAPM_ADC_E("ADC2", NULL, WCD934X_ANA_AMIC2, 7, 0,
  4908. wcd934x_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
  4909. SND_SOC_DAPM_ADC_E("ADC3", NULL, WCD934X_ANA_AMIC3, 7, 0,
  4910. wcd934x_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
  4911. SND_SOC_DAPM_ADC_E("ADC4", NULL, WCD934X_ANA_AMIC4, 7, 0,
  4912. wcd934x_codec_enable_adc, SND_SOC_DAPM_PRE_PMU),
  4913. SND_SOC_DAPM_SUPPLY("MIC BIAS1", SND_SOC_NOPM, MIC_BIAS_1, 0,
  4914. wcd934x_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  4915. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4916. SND_SOC_DAPM_SUPPLY("MIC BIAS2", SND_SOC_NOPM, MIC_BIAS_2, 0,
  4917. wcd934x_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  4918. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4919. SND_SOC_DAPM_SUPPLY("MIC BIAS3", SND_SOC_NOPM, MIC_BIAS_3, 0,
  4920. wcd934x_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  4921. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4922. SND_SOC_DAPM_SUPPLY("MIC BIAS4", SND_SOC_NOPM, MIC_BIAS_4, 0,
  4923. wcd934x_codec_enable_micbias, SND_SOC_DAPM_PRE_PMU |
  4924. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  4925. SND_SOC_DAPM_MUX("AMIC4_5 SEL", SND_SOC_NOPM, 0, 0, &tx_amic4_5),
  4926. SND_SOC_DAPM_MUX("CDC_IF TX0 MUX", SND_SOC_NOPM, WCD934X_TX0, 0,
  4927. &cdc_if_tx0_mux),
  4928. SND_SOC_DAPM_MUX("CDC_IF TX1 MUX", SND_SOC_NOPM, WCD934X_TX1, 0,
  4929. &cdc_if_tx1_mux),
  4930. SND_SOC_DAPM_MUX("CDC_IF TX2 MUX", SND_SOC_NOPM, WCD934X_TX2, 0,
  4931. &cdc_if_tx2_mux),
  4932. SND_SOC_DAPM_MUX("CDC_IF TX3 MUX", SND_SOC_NOPM, WCD934X_TX3, 0,
  4933. &cdc_if_tx3_mux),
  4934. SND_SOC_DAPM_MUX("CDC_IF TX4 MUX", SND_SOC_NOPM, WCD934X_TX4, 0,
  4935. &cdc_if_tx4_mux),
  4936. SND_SOC_DAPM_MUX("CDC_IF TX5 MUX", SND_SOC_NOPM, WCD934X_TX5, 0,
  4937. &cdc_if_tx5_mux),
  4938. SND_SOC_DAPM_MUX("CDC_IF TX6 MUX", SND_SOC_NOPM, WCD934X_TX6, 0,
  4939. &cdc_if_tx6_mux),
  4940. SND_SOC_DAPM_MUX("CDC_IF TX7 MUX", SND_SOC_NOPM, WCD934X_TX7, 0,
  4941. &cdc_if_tx7_mux),
  4942. SND_SOC_DAPM_MUX("CDC_IF TX8 MUX", SND_SOC_NOPM, WCD934X_TX8, 0,
  4943. &cdc_if_tx8_mux),
  4944. SND_SOC_DAPM_MUX("CDC_IF TX9 MUX", SND_SOC_NOPM, WCD934X_TX9, 0,
  4945. &cdc_if_tx9_mux),
  4946. SND_SOC_DAPM_MUX("CDC_IF TX10 MUX", SND_SOC_NOPM, WCD934X_TX10, 0,
  4947. &cdc_if_tx10_mux),
  4948. SND_SOC_DAPM_MUX("CDC_IF TX11 MUX", SND_SOC_NOPM, WCD934X_TX11, 0,
  4949. &cdc_if_tx11_mux),
  4950. SND_SOC_DAPM_MUX("CDC_IF TX11 INP1 MUX", SND_SOC_NOPM, WCD934X_TX11, 0,
  4951. &cdc_if_tx11_inp1_mux),
  4952. SND_SOC_DAPM_MUX("CDC_IF TX13 MUX", SND_SOC_NOPM, WCD934X_TX13, 0,
  4953. &cdc_if_tx13_mux),
  4954. SND_SOC_DAPM_MUX("CDC_IF TX13 INP1 MUX", SND_SOC_NOPM, WCD934X_TX13, 0,
  4955. &cdc_if_tx13_inp1_mux),
  4956. SND_SOC_DAPM_MIXER("AIF1_CAP Mixer", SND_SOC_NOPM, AIF1_CAP, 0,
  4957. aif1_slim_cap_mixer,
  4958. ARRAY_SIZE(aif1_slim_cap_mixer)),
  4959. SND_SOC_DAPM_MIXER("AIF2_CAP Mixer", SND_SOC_NOPM, AIF2_CAP, 0,
  4960. aif2_slim_cap_mixer,
  4961. ARRAY_SIZE(aif2_slim_cap_mixer)),
  4962. SND_SOC_DAPM_MIXER("AIF3_CAP Mixer", SND_SOC_NOPM, AIF3_CAP, 0,
  4963. aif3_slim_cap_mixer,
  4964. ARRAY_SIZE(aif3_slim_cap_mixer)),
  4965. };
  4966. static const struct snd_soc_dapm_route wcd934x_audio_map[] = {
  4967. /* RX0-RX7 */
  4968. WCD934X_SLIM_RX_AIF_PATH(0),
  4969. WCD934X_SLIM_RX_AIF_PATH(1),
  4970. WCD934X_SLIM_RX_AIF_PATH(2),
  4971. WCD934X_SLIM_RX_AIF_PATH(3),
  4972. WCD934X_SLIM_RX_AIF_PATH(4),
  4973. WCD934X_SLIM_RX_AIF_PATH(5),
  4974. WCD934X_SLIM_RX_AIF_PATH(6),
  4975. WCD934X_SLIM_RX_AIF_PATH(7),
  4976. /* RX0 Ear out */
  4977. WCD934X_INTERPOLATOR_PATH(0),
  4978. WCD934X_INTERPOLATOR_MIX2(0),
  4979. {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"},
  4980. {"RX INT0 DAC", NULL, "RX INT0 DEM MUX"},
  4981. {"RX INT0 DAC", NULL, "RX_BIAS"},
  4982. {"EAR PA", NULL, "RX INT0 DAC"},
  4983. {"EAR", NULL, "EAR PA"},
  4984. /* RX1 Headphone left */
  4985. WCD934X_INTERPOLATOR_PATH(1),
  4986. WCD934X_INTERPOLATOR_MIX2(1),
  4987. {"RX INT1 MIX3", NULL, "RX INT1 MIX2"},
  4988. {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX3"},
  4989. {"RX INT1 DAC", NULL, "RX INT1 DEM MUX"},
  4990. {"RX INT1 DAC", NULL, "RX_BIAS"},
  4991. {"HPHL PA", NULL, "RX INT1 DAC"},
  4992. {"HPHL", NULL, "HPHL PA"},
  4993. /* RX2 Headphone right */
  4994. WCD934X_INTERPOLATOR_PATH(2),
  4995. WCD934X_INTERPOLATOR_MIX2(2),
  4996. {"RX INT2 MIX3", NULL, "RX INT2 MIX2"},
  4997. {"RX INT2 DEM MUX", "CLSH_DSM_OUT", "RX INT2 MIX3"},
  4998. {"RX INT2 DAC", NULL, "RX INT2 DEM MUX"},
  4999. {"RX INT2 DAC", NULL, "RX_BIAS"},
  5000. {"HPHR PA", NULL, "RX INT2 DAC"},
  5001. {"HPHR", NULL, "HPHR PA"},
  5002. /* RX3 HIFi LineOut1 */
  5003. WCD934X_INTERPOLATOR_PATH(3),
  5004. WCD934X_INTERPOLATOR_MIX2(3),
  5005. {"RX INT3 MIX3", NULL, "RX INT3 MIX2"},
  5006. {"RX INT3 DAC", NULL, "RX INT3 MIX3"},
  5007. {"RX INT3 DAC", NULL, "RX_BIAS"},
  5008. {"LINEOUT1 PA", NULL, "RX INT3 DAC"},
  5009. {"LINEOUT1", NULL, "LINEOUT1 PA"},
  5010. /* RX4 HIFi LineOut2 */
  5011. WCD934X_INTERPOLATOR_PATH(4),
  5012. WCD934X_INTERPOLATOR_MIX2(4),
  5013. {"RX INT4 MIX3", NULL, "RX INT4 MIX2"},
  5014. {"RX INT4 DAC", NULL, "RX INT4 MIX3"},
  5015. {"RX INT4 DAC", NULL, "RX_BIAS"},
  5016. {"LINEOUT2 PA", NULL, "RX INT4 DAC"},
  5017. {"LINEOUT2", NULL, "LINEOUT2 PA"},
  5018. /* RX7 Speaker Left Out PA */
  5019. WCD934X_INTERPOLATOR_PATH(7),
  5020. WCD934X_INTERPOLATOR_MIX2(7),
  5021. {"RX INT7 CHAIN", NULL, "RX INT7 MIX2"},
  5022. {"RX INT7 CHAIN", NULL, "RX_BIAS"},
  5023. {"RX INT7 CHAIN", NULL, "SBOOST0"},
  5024. {"RX INT7 CHAIN", NULL, "SBOOST0_CLK"},
  5025. {"SPK1 OUT", NULL, "RX INT7 CHAIN"},
  5026. /* RX8 Speaker Right Out PA */
  5027. WCD934X_INTERPOLATOR_PATH(8),
  5028. {"RX INT8 CHAIN", NULL, "RX INT8 SEC MIX"},
  5029. {"RX INT8 CHAIN", NULL, "RX_BIAS"},
  5030. {"RX INT8 CHAIN", NULL, "SBOOST1"},
  5031. {"RX INT8 CHAIN", NULL, "SBOOST1_CLK"},
  5032. {"SPK2 OUT", NULL, "RX INT8 CHAIN"},
  5033. /* Tx */
  5034. {"AIF1 CAP", NULL, "AIF1_CAP Mixer"},
  5035. {"AIF2 CAP", NULL, "AIF2_CAP Mixer"},
  5036. {"AIF3 CAP", NULL, "AIF3_CAP Mixer"},
  5037. WCD934X_SLIM_TX_AIF_PATH(0),
  5038. WCD934X_SLIM_TX_AIF_PATH(1),
  5039. WCD934X_SLIM_TX_AIF_PATH(2),
  5040. WCD934X_SLIM_TX_AIF_PATH(3),
  5041. WCD934X_SLIM_TX_AIF_PATH(4),
  5042. WCD934X_SLIM_TX_AIF_PATH(5),
  5043. WCD934X_SLIM_TX_AIF_PATH(6),
  5044. WCD934X_SLIM_TX_AIF_PATH(7),
  5045. WCD934X_SLIM_TX_AIF_PATH(8),
  5046. WCD934X_ADC_MUX(0),
  5047. WCD934X_ADC_MUX(1),
  5048. WCD934X_ADC_MUX(2),
  5049. WCD934X_ADC_MUX(3),
  5050. WCD934X_ADC_MUX(4),
  5051. WCD934X_ADC_MUX(5),
  5052. WCD934X_ADC_MUX(6),
  5053. WCD934X_ADC_MUX(7),
  5054. WCD934X_ADC_MUX(8),
  5055. {"CDC_IF TX0 MUX", "DEC0", "ADC MUX0"},
  5056. {"CDC_IF TX1 MUX", "DEC1", "ADC MUX1"},
  5057. {"CDC_IF TX2 MUX", "DEC2", "ADC MUX2"},
  5058. {"CDC_IF TX3 MUX", "DEC3", "ADC MUX3"},
  5059. {"CDC_IF TX4 MUX", "DEC4", "ADC MUX4"},
  5060. {"CDC_IF TX5 MUX", "DEC5", "ADC MUX5"},
  5061. {"CDC_IF TX6 MUX", "DEC6", "ADC MUX6"},
  5062. {"CDC_IF TX7 MUX", "DEC7", "ADC MUX7"},
  5063. {"CDC_IF TX8 MUX", "DEC8", "ADC MUX8"},
  5064. {"AMIC4_5 SEL", "AMIC4", "AMIC4"},
  5065. {"AMIC4_5 SEL", "AMIC5", "AMIC5"},
  5066. { "DMIC0", NULL, "DMIC0 Pin" },
  5067. { "DMIC1", NULL, "DMIC1 Pin" },
  5068. { "DMIC2", NULL, "DMIC2 Pin" },
  5069. { "DMIC3", NULL, "DMIC3 Pin" },
  5070. { "DMIC4", NULL, "DMIC4 Pin" },
  5071. { "DMIC5", NULL, "DMIC5 Pin" },
  5072. {"ADC1", NULL, "AMIC1"},
  5073. {"ADC2", NULL, "AMIC2"},
  5074. {"ADC3", NULL, "AMIC3"},
  5075. {"ADC4", NULL, "AMIC4_5 SEL"},
  5076. WCD934X_IIR_INP_MUX(0),
  5077. WCD934X_IIR_INP_MUX(1),
  5078. {"SRC0", NULL, "IIR0"},
  5079. {"SRC1", NULL, "IIR1"},
  5080. };
  5081. static int wcd934x_codec_set_jack(struct snd_soc_component *comp,
  5082. struct snd_soc_jack *jack, void *data)
  5083. {
  5084. struct wcd934x_codec *wcd = dev_get_drvdata(comp->dev);
  5085. int ret = 0;
  5086. if (!wcd->mbhc)
  5087. return -ENOTSUPP;
  5088. if (jack && !wcd->mbhc_started) {
  5089. ret = wcd_mbhc_start(wcd->mbhc, &wcd->mbhc_cfg, jack);
  5090. wcd->mbhc_started = true;
  5091. } else if (wcd->mbhc_started) {
  5092. wcd_mbhc_stop(wcd->mbhc);
  5093. wcd->mbhc_started = false;
  5094. }
  5095. return ret;
  5096. }
  5097. static const struct snd_soc_component_driver wcd934x_component_drv = {
  5098. .probe = wcd934x_comp_probe,
  5099. .remove = wcd934x_comp_remove,
  5100. .set_sysclk = wcd934x_comp_set_sysclk,
  5101. .controls = wcd934x_snd_controls,
  5102. .num_controls = ARRAY_SIZE(wcd934x_snd_controls),
  5103. .dapm_widgets = wcd934x_dapm_widgets,
  5104. .num_dapm_widgets = ARRAY_SIZE(wcd934x_dapm_widgets),
  5105. .dapm_routes = wcd934x_audio_map,
  5106. .num_dapm_routes = ARRAY_SIZE(wcd934x_audio_map),
  5107. .set_jack = wcd934x_codec_set_jack,
  5108. .endianness = 1,
  5109. };
  5110. static int wcd934x_codec_parse_data(struct wcd934x_codec *wcd)
  5111. {
  5112. struct device *dev = &wcd->sdev->dev;
  5113. struct wcd_mbhc_config *cfg = &wcd->mbhc_cfg;
  5114. struct device_node *ifc_dev_np;
  5115. ifc_dev_np = of_parse_phandle(dev->of_node, "slim-ifc-dev", 0);
  5116. if (!ifc_dev_np) {
  5117. dev_err(dev, "No Interface device found\n");
  5118. return -EINVAL;
  5119. }
  5120. wcd->sidev = of_slim_get_device(wcd->sdev->ctrl, ifc_dev_np);
  5121. of_node_put(ifc_dev_np);
  5122. if (!wcd->sidev) {
  5123. dev_err(dev, "Unable to get SLIM Interface device\n");
  5124. return -EINVAL;
  5125. }
  5126. slim_get_logical_addr(wcd->sidev);
  5127. wcd->if_regmap = regmap_init_slimbus(wcd->sidev,
  5128. &wcd934x_ifc_regmap_config);
  5129. if (IS_ERR(wcd->if_regmap)) {
  5130. dev_err(dev, "Failed to allocate ifc register map\n");
  5131. return PTR_ERR(wcd->if_regmap);
  5132. }
  5133. of_property_read_u32(dev->parent->of_node, "qcom,dmic-sample-rate",
  5134. &wcd->dmic_sample_rate);
  5135. cfg->mbhc_micbias = MIC_BIAS_2;
  5136. cfg->anc_micbias = MIC_BIAS_2;
  5137. cfg->v_hs_max = WCD_MBHC_HS_V_MAX;
  5138. cfg->num_btn = WCD934X_MBHC_MAX_BUTTONS;
  5139. cfg->micb_mv = wcd->micb2_mv;
  5140. cfg->linein_th = 5000;
  5141. cfg->hs_thr = 1700;
  5142. cfg->hph_thr = 50;
  5143. wcd_dt_parse_mbhc_data(dev, cfg);
  5144. return 0;
  5145. }
  5146. static int wcd934x_codec_probe(struct platform_device *pdev)
  5147. {
  5148. struct wcd934x_ddata *data = dev_get_drvdata(pdev->dev.parent);
  5149. struct wcd934x_codec *wcd;
  5150. struct device *dev = &pdev->dev;
  5151. int ret, irq;
  5152. wcd = devm_kzalloc(&pdev->dev, sizeof(*wcd), GFP_KERNEL);
  5153. if (!wcd)
  5154. return -ENOMEM;
  5155. wcd->dev = dev;
  5156. wcd->regmap = data->regmap;
  5157. wcd->extclk = data->extclk;
  5158. wcd->sdev = to_slim_device(data->dev);
  5159. mutex_init(&wcd->sysclk_mutex);
  5160. mutex_init(&wcd->micb_lock);
  5161. ret = wcd934x_codec_parse_data(wcd);
  5162. if (ret) {
  5163. dev_err(wcd->dev, "Failed to get SLIM IRQ\n");
  5164. return ret;
  5165. }
  5166. /* set default rate 9P6MHz */
  5167. regmap_update_bits(wcd->regmap, WCD934X_CODEC_RPM_CLK_MCLK_CFG,
  5168. WCD934X_CODEC_RPM_CLK_MCLK_CFG_MCLK_MASK,
  5169. WCD934X_CODEC_RPM_CLK_MCLK_CFG_9P6MHZ);
  5170. memcpy(wcd->rx_chs, wcd934x_rx_chs, sizeof(wcd934x_rx_chs));
  5171. memcpy(wcd->tx_chs, wcd934x_tx_chs, sizeof(wcd934x_tx_chs));
  5172. irq = regmap_irq_get_virq(data->irq_data, WCD934X_IRQ_SLIMBUS);
  5173. if (irq < 0) {
  5174. dev_err(wcd->dev, "Failed to get SLIM IRQ\n");
  5175. return irq;
  5176. }
  5177. ret = devm_request_threaded_irq(dev, irq, NULL,
  5178. wcd934x_slim_irq_handler,
  5179. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  5180. "slim", wcd);
  5181. if (ret) {
  5182. dev_err(dev, "Failed to request slimbus irq\n");
  5183. return ret;
  5184. }
  5185. wcd934x_register_mclk_output(wcd);
  5186. platform_set_drvdata(pdev, wcd);
  5187. return devm_snd_soc_register_component(dev, &wcd934x_component_drv,
  5188. wcd934x_slim_dais,
  5189. ARRAY_SIZE(wcd934x_slim_dais));
  5190. }
  5191. static const struct platform_device_id wcd934x_driver_id[] = {
  5192. {
  5193. .name = "wcd934x-codec",
  5194. },
  5195. {},
  5196. };
  5197. MODULE_DEVICE_TABLE(platform, wcd934x_driver_id);
  5198. static struct platform_driver wcd934x_codec_driver = {
  5199. .probe = &wcd934x_codec_probe,
  5200. .id_table = wcd934x_driver_id,
  5201. .driver = {
  5202. .name = "wcd934x-codec",
  5203. }
  5204. };
  5205. MODULE_ALIAS("platform:wcd934x-codec");
  5206. module_platform_driver(wcd934x_codec_driver);
  5207. MODULE_DESCRIPTION("WCD934x codec driver");
  5208. MODULE_LICENSE("GPL v2");