tscs454.c 107 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484
  1. // SPDX-License-Identifier: GPL-2.0
  2. // tscs454.c -- TSCS454 ALSA SoC Audio driver
  3. // Copyright 2018 Tempo Semiconductor, Inc.
  4. // Author: Steven Eckhoff <[email protected]>
  5. #include <linux/kernel.h>
  6. #include <linux/clk.h>
  7. #include <linux/device.h>
  8. #include <linux/regmap.h>
  9. #include <linux/i2c.h>
  10. #include <linux/err.h>
  11. #include <linux/string.h>
  12. #include <linux/module.h>
  13. #include <linux/delay.h>
  14. #include <linux/mutex.h>
  15. #include <sound/tlv.h>
  16. #include <sound/pcm_params.h>
  17. #include <sound/pcm.h>
  18. #include <sound/soc.h>
  19. #include <sound/soc-dapm.h>
  20. #include "tscs454.h"
  21. static const unsigned int PLL_44_1K_RATE = (44100 * 256);
  22. #define COEFF_SIZE 3
  23. #define BIQUAD_COEFF_COUNT 5
  24. #define BIQUAD_SIZE (COEFF_SIZE * BIQUAD_COEFF_COUNT)
  25. #define COEFF_RAM_MAX_ADDR 0xcd
  26. #define COEFF_RAM_COEFF_COUNT (COEFF_RAM_MAX_ADDR + 1)
  27. #define COEFF_RAM_SIZE (COEFF_SIZE * COEFF_RAM_COEFF_COUNT)
  28. enum {
  29. TSCS454_DAI1_ID,
  30. TSCS454_DAI2_ID,
  31. TSCS454_DAI3_ID,
  32. TSCS454_DAI_COUNT,
  33. };
  34. struct pll {
  35. int id;
  36. unsigned int users;
  37. struct mutex lock;
  38. };
  39. static inline void pll_init(struct pll *pll, int id)
  40. {
  41. pll->id = id;
  42. mutex_init(&pll->lock);
  43. }
  44. struct internal_rate {
  45. struct pll *pll;
  46. };
  47. struct aif {
  48. unsigned int id;
  49. bool provider;
  50. struct pll *pll;
  51. };
  52. static inline void aif_init(struct aif *aif, unsigned int id)
  53. {
  54. aif->id = id;
  55. }
  56. struct coeff_ram {
  57. u8 cache[COEFF_RAM_SIZE];
  58. bool synced;
  59. struct mutex lock;
  60. };
  61. static inline void init_coeff_ram_cache(u8 *cache)
  62. {
  63. static const u8 norm_addrs[] = { 0x00, 0x05, 0x0a, 0x0f, 0x14, 0x19,
  64. 0x1f, 0x20, 0x25, 0x2a, 0x2f, 0x34, 0x39, 0x3f, 0x40, 0x45,
  65. 0x4a, 0x4f, 0x54, 0x59, 0x5f, 0x60, 0x65, 0x6a, 0x6f, 0x74,
  66. 0x79, 0x7f, 0x80, 0x85, 0x8c, 0x91, 0x96, 0x97, 0x9c, 0xa3,
  67. 0xa8, 0xad, 0xaf, 0xb0, 0xb5, 0xba, 0xbf, 0xc4, 0xc9};
  68. int i;
  69. for (i = 0; i < ARRAY_SIZE(norm_addrs); i++)
  70. cache[((norm_addrs[i] + 1) * COEFF_SIZE) - 1] = 0x40;
  71. }
  72. static inline void coeff_ram_init(struct coeff_ram *ram)
  73. {
  74. init_coeff_ram_cache(ram->cache);
  75. mutex_init(&ram->lock);
  76. }
  77. struct aifs_status {
  78. u8 streams;
  79. };
  80. static inline void set_aif_status_active(struct aifs_status *status,
  81. int aif_id, bool playback)
  82. {
  83. u8 mask = 0x01 << (aif_id * 2 + !playback);
  84. status->streams |= mask;
  85. }
  86. static inline void set_aif_status_inactive(struct aifs_status *status,
  87. int aif_id, bool playback)
  88. {
  89. u8 mask = ~(0x01 << (aif_id * 2 + !playback));
  90. status->streams &= mask;
  91. }
  92. static bool aifs_active(struct aifs_status *status)
  93. {
  94. return status->streams;
  95. }
  96. static bool aif_active(struct aifs_status *status, int aif_id)
  97. {
  98. return (0x03 << aif_id * 2) & status->streams;
  99. }
  100. struct tscs454 {
  101. struct regmap *regmap;
  102. struct aif aifs[TSCS454_DAI_COUNT];
  103. struct aifs_status aifs_status;
  104. struct mutex aifs_status_lock;
  105. struct pll pll1;
  106. struct pll pll2;
  107. struct internal_rate internal_rate;
  108. struct coeff_ram dac_ram;
  109. struct coeff_ram spk_ram;
  110. struct coeff_ram sub_ram;
  111. struct clk *sysclk;
  112. int sysclk_src_id;
  113. unsigned int bclk_freq;
  114. };
  115. struct coeff_ram_ctl {
  116. unsigned int addr;
  117. struct soc_bytes_ext bytes_ext;
  118. };
  119. static const struct reg_sequence tscs454_patch[] = {
  120. /* Assign ASRC out of the box so DAI 1 just works */
  121. { R_AUDIOMUX1, FV_ASRCIMUX_I2S1 | FV_I2S2MUX_I2S2 },
  122. { R_AUDIOMUX2, FV_ASRCOMUX_I2S1 | FV_DACMUX_I2S1 | FV_I2S3MUX_I2S3 },
  123. { R_AUDIOMUX3, FV_CLSSDMUX_I2S1 | FV_SUBMUX_I2S1_LR },
  124. { R_TDMCTL0, FV_TDMMD_256 },
  125. { VIRT_ADDR(0x0A, 0x13), 1 << 3 },
  126. };
  127. static bool tscs454_volatile(struct device *dev, unsigned int reg)
  128. {
  129. switch (reg) {
  130. case R_PLLSTAT:
  131. case R_SPKCRRDL:
  132. case R_SPKCRRDM:
  133. case R_SPKCRRDH:
  134. case R_SPKCRS:
  135. case R_DACCRRDL:
  136. case R_DACCRRDM:
  137. case R_DACCRRDH:
  138. case R_DACCRS:
  139. case R_SUBCRRDL:
  140. case R_SUBCRRDM:
  141. case R_SUBCRRDH:
  142. case R_SUBCRS:
  143. return true;
  144. default:
  145. return false;
  146. }
  147. }
  148. static bool tscs454_writable(struct device *dev, unsigned int reg)
  149. {
  150. switch (reg) {
  151. case R_SPKCRRDL:
  152. case R_SPKCRRDM:
  153. case R_SPKCRRDH:
  154. case R_DACCRRDL:
  155. case R_DACCRRDM:
  156. case R_DACCRRDH:
  157. case R_SUBCRRDL:
  158. case R_SUBCRRDM:
  159. case R_SUBCRRDH:
  160. return false;
  161. default:
  162. return true;
  163. }
  164. }
  165. static bool tscs454_readable(struct device *dev, unsigned int reg)
  166. {
  167. switch (reg) {
  168. case R_SPKCRWDL:
  169. case R_SPKCRWDM:
  170. case R_SPKCRWDH:
  171. case R_DACCRWDL:
  172. case R_DACCRWDM:
  173. case R_DACCRWDH:
  174. case R_SUBCRWDL:
  175. case R_SUBCRWDM:
  176. case R_SUBCRWDH:
  177. return false;
  178. default:
  179. return true;
  180. }
  181. }
  182. static bool tscs454_precious(struct device *dev, unsigned int reg)
  183. {
  184. switch (reg) {
  185. case R_SPKCRWDL:
  186. case R_SPKCRWDM:
  187. case R_SPKCRWDH:
  188. case R_SPKCRRDL:
  189. case R_SPKCRRDM:
  190. case R_SPKCRRDH:
  191. case R_DACCRWDL:
  192. case R_DACCRWDM:
  193. case R_DACCRWDH:
  194. case R_DACCRRDL:
  195. case R_DACCRRDM:
  196. case R_DACCRRDH:
  197. case R_SUBCRWDL:
  198. case R_SUBCRWDM:
  199. case R_SUBCRWDH:
  200. case R_SUBCRRDL:
  201. case R_SUBCRRDM:
  202. case R_SUBCRRDH:
  203. return true;
  204. default:
  205. return false;
  206. }
  207. }
  208. static const struct regmap_range_cfg tscs454_regmap_range_cfg = {
  209. .name = "Pages",
  210. .range_min = VIRT_BASE,
  211. .range_max = VIRT_ADDR(0xFE, 0x02),
  212. .selector_reg = R_PAGESEL,
  213. .selector_mask = 0xff,
  214. .selector_shift = 0,
  215. .window_start = 0,
  216. .window_len = 0x100,
  217. };
  218. static struct regmap_config const tscs454_regmap_cfg = {
  219. .reg_bits = 8,
  220. .val_bits = 8,
  221. .writeable_reg = tscs454_writable,
  222. .readable_reg = tscs454_readable,
  223. .volatile_reg = tscs454_volatile,
  224. .precious_reg = tscs454_precious,
  225. .ranges = &tscs454_regmap_range_cfg,
  226. .num_ranges = 1,
  227. .max_register = VIRT_ADDR(0xFE, 0x02),
  228. .cache_type = REGCACHE_RBTREE,
  229. };
  230. static inline int tscs454_data_init(struct tscs454 *tscs454,
  231. struct i2c_client *i2c)
  232. {
  233. int i;
  234. int ret;
  235. tscs454->regmap = devm_regmap_init_i2c(i2c, &tscs454_regmap_cfg);
  236. if (IS_ERR(tscs454->regmap)) {
  237. ret = PTR_ERR(tscs454->regmap);
  238. return ret;
  239. }
  240. for (i = 0; i < TSCS454_DAI_COUNT; i++)
  241. aif_init(&tscs454->aifs[i], i);
  242. mutex_init(&tscs454->aifs_status_lock);
  243. pll_init(&tscs454->pll1, 1);
  244. pll_init(&tscs454->pll2, 2);
  245. coeff_ram_init(&tscs454->dac_ram);
  246. coeff_ram_init(&tscs454->spk_ram);
  247. coeff_ram_init(&tscs454->sub_ram);
  248. return 0;
  249. }
  250. struct reg_setting {
  251. unsigned int addr;
  252. unsigned int val;
  253. };
  254. static int coeff_ram_get(struct snd_kcontrol *kcontrol,
  255. struct snd_ctl_elem_value *ucontrol)
  256. {
  257. struct snd_soc_component *component =
  258. snd_soc_kcontrol_component(kcontrol);
  259. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  260. struct coeff_ram_ctl *ctl =
  261. (struct coeff_ram_ctl *)kcontrol->private_value;
  262. struct soc_bytes_ext *params = &ctl->bytes_ext;
  263. u8 *coeff_ram;
  264. struct mutex *coeff_ram_lock;
  265. if (strstr(kcontrol->id.name, "DAC")) {
  266. coeff_ram = tscs454->dac_ram.cache;
  267. coeff_ram_lock = &tscs454->dac_ram.lock;
  268. } else if (strstr(kcontrol->id.name, "Speaker")) {
  269. coeff_ram = tscs454->spk_ram.cache;
  270. coeff_ram_lock = &tscs454->spk_ram.lock;
  271. } else if (strstr(kcontrol->id.name, "Sub")) {
  272. coeff_ram = tscs454->sub_ram.cache;
  273. coeff_ram_lock = &tscs454->sub_ram.lock;
  274. } else {
  275. return -EINVAL;
  276. }
  277. mutex_lock(coeff_ram_lock);
  278. memcpy(ucontrol->value.bytes.data,
  279. &coeff_ram[ctl->addr * COEFF_SIZE], params->max);
  280. mutex_unlock(coeff_ram_lock);
  281. return 0;
  282. }
  283. #define DACCRSTAT_MAX_TRYS 10
  284. static int write_coeff_ram(struct snd_soc_component *component, u8 *coeff_ram,
  285. unsigned int r_stat, unsigned int r_addr, unsigned int r_wr,
  286. unsigned int coeff_addr, unsigned int coeff_cnt)
  287. {
  288. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  289. unsigned int val;
  290. int cnt;
  291. int trys;
  292. int ret;
  293. for (cnt = 0; cnt < coeff_cnt; cnt++, coeff_addr++) {
  294. for (trys = 0; trys < DACCRSTAT_MAX_TRYS; trys++) {
  295. val = snd_soc_component_read(component, r_stat);
  296. if (!val)
  297. break;
  298. }
  299. if (trys == DACCRSTAT_MAX_TRYS) {
  300. ret = -EIO;
  301. dev_err(component->dev,
  302. "Coefficient write error (%d)\n", ret);
  303. return ret;
  304. }
  305. ret = regmap_write(tscs454->regmap, r_addr, coeff_addr);
  306. if (ret < 0) {
  307. dev_err(component->dev,
  308. "Failed to write dac ram address (%d)\n", ret);
  309. return ret;
  310. }
  311. ret = regmap_bulk_write(tscs454->regmap, r_wr,
  312. &coeff_ram[coeff_addr * COEFF_SIZE],
  313. COEFF_SIZE);
  314. if (ret < 0) {
  315. dev_err(component->dev,
  316. "Failed to write dac ram (%d)\n", ret);
  317. return ret;
  318. }
  319. }
  320. return 0;
  321. }
  322. static int coeff_ram_put(struct snd_kcontrol *kcontrol,
  323. struct snd_ctl_elem_value *ucontrol)
  324. {
  325. struct snd_soc_component *component =
  326. snd_soc_kcontrol_component(kcontrol);
  327. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  328. struct coeff_ram_ctl *ctl =
  329. (struct coeff_ram_ctl *)kcontrol->private_value;
  330. struct soc_bytes_ext *params = &ctl->bytes_ext;
  331. unsigned int coeff_cnt = params->max / COEFF_SIZE;
  332. u8 *coeff_ram;
  333. struct mutex *coeff_ram_lock;
  334. bool *coeff_ram_synced;
  335. unsigned int r_stat;
  336. unsigned int r_addr;
  337. unsigned int r_wr;
  338. unsigned int val;
  339. int ret;
  340. if (strstr(kcontrol->id.name, "DAC")) {
  341. coeff_ram = tscs454->dac_ram.cache;
  342. coeff_ram_lock = &tscs454->dac_ram.lock;
  343. coeff_ram_synced = &tscs454->dac_ram.synced;
  344. r_stat = R_DACCRS;
  345. r_addr = R_DACCRADD;
  346. r_wr = R_DACCRWDL;
  347. } else if (strstr(kcontrol->id.name, "Speaker")) {
  348. coeff_ram = tscs454->spk_ram.cache;
  349. coeff_ram_lock = &tscs454->spk_ram.lock;
  350. coeff_ram_synced = &tscs454->spk_ram.synced;
  351. r_stat = R_SPKCRS;
  352. r_addr = R_SPKCRADD;
  353. r_wr = R_SPKCRWDL;
  354. } else if (strstr(kcontrol->id.name, "Sub")) {
  355. coeff_ram = tscs454->sub_ram.cache;
  356. coeff_ram_lock = &tscs454->sub_ram.lock;
  357. coeff_ram_synced = &tscs454->sub_ram.synced;
  358. r_stat = R_SUBCRS;
  359. r_addr = R_SUBCRADD;
  360. r_wr = R_SUBCRWDL;
  361. } else {
  362. return -EINVAL;
  363. }
  364. mutex_lock(coeff_ram_lock);
  365. *coeff_ram_synced = false;
  366. memcpy(&coeff_ram[ctl->addr * COEFF_SIZE],
  367. ucontrol->value.bytes.data, params->max);
  368. mutex_lock(&tscs454->pll1.lock);
  369. mutex_lock(&tscs454->pll2.lock);
  370. val = snd_soc_component_read(component, R_PLLSTAT);
  371. if (val) { /* PLLs locked */
  372. ret = write_coeff_ram(component, coeff_ram,
  373. r_stat, r_addr, r_wr,
  374. ctl->addr, coeff_cnt);
  375. if (ret < 0) {
  376. dev_err(component->dev,
  377. "Failed to flush coeff ram cache (%d)\n", ret);
  378. goto exit;
  379. }
  380. *coeff_ram_synced = true;
  381. }
  382. ret = 0;
  383. exit:
  384. mutex_unlock(&tscs454->pll2.lock);
  385. mutex_unlock(&tscs454->pll1.lock);
  386. mutex_unlock(coeff_ram_lock);
  387. return ret;
  388. }
  389. static inline int coeff_ram_sync(struct snd_soc_component *component,
  390. struct tscs454 *tscs454)
  391. {
  392. int ret;
  393. mutex_lock(&tscs454->dac_ram.lock);
  394. if (!tscs454->dac_ram.synced) {
  395. ret = write_coeff_ram(component, tscs454->dac_ram.cache,
  396. R_DACCRS, R_DACCRADD, R_DACCRWDL,
  397. 0x00, COEFF_RAM_COEFF_COUNT);
  398. if (ret < 0) {
  399. mutex_unlock(&tscs454->dac_ram.lock);
  400. return ret;
  401. }
  402. }
  403. mutex_unlock(&tscs454->dac_ram.lock);
  404. mutex_lock(&tscs454->spk_ram.lock);
  405. if (!tscs454->spk_ram.synced) {
  406. ret = write_coeff_ram(component, tscs454->spk_ram.cache,
  407. R_SPKCRS, R_SPKCRADD, R_SPKCRWDL,
  408. 0x00, COEFF_RAM_COEFF_COUNT);
  409. if (ret < 0) {
  410. mutex_unlock(&tscs454->spk_ram.lock);
  411. return ret;
  412. }
  413. }
  414. mutex_unlock(&tscs454->spk_ram.lock);
  415. mutex_lock(&tscs454->sub_ram.lock);
  416. if (!tscs454->sub_ram.synced) {
  417. ret = write_coeff_ram(component, tscs454->sub_ram.cache,
  418. R_SUBCRS, R_SUBCRADD, R_SUBCRWDL,
  419. 0x00, COEFF_RAM_COEFF_COUNT);
  420. if (ret < 0) {
  421. mutex_unlock(&tscs454->sub_ram.lock);
  422. return ret;
  423. }
  424. }
  425. mutex_unlock(&tscs454->sub_ram.lock);
  426. return 0;
  427. }
  428. #define PLL_REG_SETTINGS_COUNT 11
  429. struct pll_ctl {
  430. int freq_in;
  431. struct reg_setting settings[PLL_REG_SETTINGS_COUNT];
  432. };
  433. #define PLL_CTL(f, t, c1, r1, o1, f1l, f1h, c2, r2, o2, f2l, f2h) \
  434. { \
  435. .freq_in = f, \
  436. .settings = { \
  437. {R_PLL1CTL, c1}, \
  438. {R_PLL1RDIV, r1}, \
  439. {R_PLL1ODIV, o1}, \
  440. {R_PLL1FDIVL, f1l}, \
  441. {R_PLL1FDIVH, f1h}, \
  442. {R_PLL2CTL, c2}, \
  443. {R_PLL2RDIV, r2}, \
  444. {R_PLL2ODIV, o2}, \
  445. {R_PLL2FDIVL, f2l}, \
  446. {R_PLL2FDIVH, f2h}, \
  447. {R_TIMEBASE, t}, \
  448. }, \
  449. }
  450. static const struct pll_ctl pll_ctls[] = {
  451. PLL_CTL(1411200, 0x05,
  452. 0xB9, 0x07, 0x02, 0xC3, 0x04,
  453. 0x5A, 0x02, 0x03, 0xE0, 0x01),
  454. PLL_CTL(1536000, 0x05,
  455. 0x5A, 0x02, 0x03, 0xE0, 0x01,
  456. 0x5A, 0x02, 0x03, 0xB9, 0x01),
  457. PLL_CTL(2822400, 0x0A,
  458. 0x63, 0x07, 0x04, 0xC3, 0x04,
  459. 0x62, 0x07, 0x03, 0x48, 0x03),
  460. PLL_CTL(3072000, 0x0B,
  461. 0x62, 0x07, 0x03, 0x48, 0x03,
  462. 0x5A, 0x04, 0x03, 0xB9, 0x01),
  463. PLL_CTL(5644800, 0x15,
  464. 0x63, 0x0E, 0x04, 0xC3, 0x04,
  465. 0x5A, 0x08, 0x03, 0xE0, 0x01),
  466. PLL_CTL(6144000, 0x17,
  467. 0x5A, 0x08, 0x03, 0xE0, 0x01,
  468. 0x5A, 0x08, 0x03, 0xB9, 0x01),
  469. PLL_CTL(12000000, 0x2E,
  470. 0x5B, 0x19, 0x03, 0x00, 0x03,
  471. 0x6A, 0x19, 0x05, 0x98, 0x04),
  472. PLL_CTL(19200000, 0x4A,
  473. 0x53, 0x14, 0x03, 0x80, 0x01,
  474. 0x5A, 0x19, 0x03, 0xB9, 0x01),
  475. PLL_CTL(22000000, 0x55,
  476. 0x6A, 0x37, 0x05, 0x00, 0x06,
  477. 0x62, 0x26, 0x03, 0x49, 0x02),
  478. PLL_CTL(22579200, 0x57,
  479. 0x62, 0x31, 0x03, 0x20, 0x03,
  480. 0x53, 0x1D, 0x03, 0xB3, 0x01),
  481. PLL_CTL(24000000, 0x5D,
  482. 0x53, 0x19, 0x03, 0x80, 0x01,
  483. 0x5B, 0x19, 0x05, 0x4C, 0x02),
  484. PLL_CTL(24576000, 0x5F,
  485. 0x53, 0x1D, 0x03, 0xB3, 0x01,
  486. 0x62, 0x40, 0x03, 0x72, 0x03),
  487. PLL_CTL(27000000, 0x68,
  488. 0x62, 0x4B, 0x03, 0x00, 0x04,
  489. 0x6A, 0x7D, 0x03, 0x20, 0x06),
  490. PLL_CTL(36000000, 0x8C,
  491. 0x5B, 0x4B, 0x03, 0x00, 0x03,
  492. 0x6A, 0x7D, 0x03, 0x98, 0x04),
  493. PLL_CTL(11289600, 0x2B,
  494. 0x6A, 0x31, 0x03, 0x40, 0x06,
  495. 0x5A, 0x12, 0x03, 0x1C, 0x02),
  496. PLL_CTL(26000000, 0x65,
  497. 0x63, 0x41, 0x05, 0x00, 0x06,
  498. 0x5A, 0x26, 0x03, 0xEF, 0x01),
  499. PLL_CTL(12288000, 0x2F,
  500. 0x5A, 0x12, 0x03, 0x1C, 0x02,
  501. 0x62, 0x20, 0x03, 0x72, 0x03),
  502. PLL_CTL(40000000, 0x9B,
  503. 0xA2, 0x7D, 0x03, 0x80, 0x04,
  504. 0x63, 0x7D, 0x05, 0xE4, 0x06),
  505. PLL_CTL(512000, 0x01,
  506. 0x62, 0x01, 0x03, 0xD0, 0x02,
  507. 0x5B, 0x01, 0x04, 0x72, 0x03),
  508. PLL_CTL(705600, 0x02,
  509. 0x62, 0x02, 0x03, 0x15, 0x04,
  510. 0x62, 0x01, 0x04, 0x80, 0x02),
  511. PLL_CTL(1024000, 0x03,
  512. 0x62, 0x02, 0x03, 0xD0, 0x02,
  513. 0x5B, 0x02, 0x04, 0x72, 0x03),
  514. PLL_CTL(2048000, 0x07,
  515. 0x62, 0x04, 0x03, 0xD0, 0x02,
  516. 0x5B, 0x04, 0x04, 0x72, 0x03),
  517. PLL_CTL(2400000, 0x08,
  518. 0x62, 0x05, 0x03, 0x00, 0x03,
  519. 0x63, 0x05, 0x05, 0x98, 0x04),
  520. };
  521. static inline const struct pll_ctl *get_pll_ctl(unsigned long freq_in)
  522. {
  523. int i;
  524. struct pll_ctl const *pll_ctl = NULL;
  525. for (i = 0; i < ARRAY_SIZE(pll_ctls); ++i)
  526. if (pll_ctls[i].freq_in == freq_in) {
  527. pll_ctl = &pll_ctls[i];
  528. break;
  529. }
  530. return pll_ctl;
  531. }
  532. enum {
  533. PLL_INPUT_XTAL = 0,
  534. PLL_INPUT_MCLK1,
  535. PLL_INPUT_MCLK2,
  536. PLL_INPUT_BCLK,
  537. };
  538. static int set_sysclk(struct snd_soc_component *component)
  539. {
  540. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  541. struct pll_ctl const *pll_ctl;
  542. unsigned long freq;
  543. int i;
  544. int ret;
  545. if (tscs454->sysclk_src_id < PLL_INPUT_BCLK)
  546. freq = clk_get_rate(tscs454->sysclk);
  547. else
  548. freq = tscs454->bclk_freq;
  549. pll_ctl = get_pll_ctl(freq);
  550. if (!pll_ctl) {
  551. ret = -EINVAL;
  552. dev_err(component->dev,
  553. "Invalid PLL input %lu (%d)\n", freq, ret);
  554. return ret;
  555. }
  556. for (i = 0; i < PLL_REG_SETTINGS_COUNT; ++i) {
  557. ret = snd_soc_component_write(component,
  558. pll_ctl->settings[i].addr,
  559. pll_ctl->settings[i].val);
  560. if (ret < 0) {
  561. dev_err(component->dev,
  562. "Failed to set pll setting (%d)\n",
  563. ret);
  564. return ret;
  565. }
  566. }
  567. return 0;
  568. }
  569. static inline void reserve_pll(struct pll *pll)
  570. {
  571. mutex_lock(&pll->lock);
  572. pll->users++;
  573. mutex_unlock(&pll->lock);
  574. }
  575. static inline void free_pll(struct pll *pll)
  576. {
  577. mutex_lock(&pll->lock);
  578. pll->users--;
  579. mutex_unlock(&pll->lock);
  580. }
  581. static int pll_connected(struct snd_soc_dapm_widget *source,
  582. struct snd_soc_dapm_widget *sink)
  583. {
  584. struct snd_soc_component *component =
  585. snd_soc_dapm_to_component(source->dapm);
  586. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  587. int users;
  588. if (strstr(source->name, "PLL 1")) {
  589. mutex_lock(&tscs454->pll1.lock);
  590. users = tscs454->pll1.users;
  591. mutex_unlock(&tscs454->pll1.lock);
  592. dev_dbg(component->dev, "%s(): PLL 1 users = %d\n", __func__,
  593. users);
  594. } else {
  595. mutex_lock(&tscs454->pll2.lock);
  596. users = tscs454->pll2.users;
  597. mutex_unlock(&tscs454->pll2.lock);
  598. dev_dbg(component->dev, "%s(): PLL 2 users = %d\n", __func__,
  599. users);
  600. }
  601. return users;
  602. }
  603. /*
  604. * PLL must be enabled after power up and must be disabled before power down
  605. * for proper clock switching.
  606. */
  607. static int pll_power_event(struct snd_soc_dapm_widget *w,
  608. struct snd_kcontrol *kcontrol, int event)
  609. {
  610. struct snd_soc_component *component =
  611. snd_soc_dapm_to_component(w->dapm);
  612. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  613. bool enable;
  614. bool pll1;
  615. unsigned int msk;
  616. unsigned int val;
  617. int ret;
  618. if (strstr(w->name, "PLL 1"))
  619. pll1 = true;
  620. else
  621. pll1 = false;
  622. msk = pll1 ? FM_PLLCTL_PLL1CLKEN : FM_PLLCTL_PLL2CLKEN;
  623. if (event == SND_SOC_DAPM_POST_PMU)
  624. enable = true;
  625. else
  626. enable = false;
  627. if (enable)
  628. val = pll1 ? FV_PLL1CLKEN_ENABLE : FV_PLL2CLKEN_ENABLE;
  629. else
  630. /*
  631. * FV_PLL1CLKEN_DISABLE and FV_PLL2CLKEN_DISABLE are
  632. * identical zero vzalues, there is no need to test
  633. * the PLL index
  634. */
  635. val = FV_PLL1CLKEN_DISABLE;
  636. ret = snd_soc_component_update_bits(component, R_PLLCTL, msk, val);
  637. if (ret < 0) {
  638. dev_err(component->dev, "Failed to %s PLL %d (%d)\n",
  639. enable ? "enable" : "disable",
  640. pll1 ? 1 : 2,
  641. ret);
  642. return ret;
  643. }
  644. if (enable) {
  645. msleep(20); // Wait for lock
  646. ret = coeff_ram_sync(component, tscs454);
  647. if (ret < 0) {
  648. dev_err(component->dev,
  649. "Failed to sync coeff ram (%d)\n", ret);
  650. return ret;
  651. }
  652. }
  653. return 0;
  654. }
  655. static inline int aif_set_provider(struct snd_soc_component *component,
  656. unsigned int aif_id, bool provider)
  657. {
  658. unsigned int reg;
  659. unsigned int mask;
  660. unsigned int val;
  661. int ret;
  662. switch (aif_id) {
  663. case TSCS454_DAI1_ID:
  664. reg = R_I2SP1CTL;
  665. break;
  666. case TSCS454_DAI2_ID:
  667. reg = R_I2SP2CTL;
  668. break;
  669. case TSCS454_DAI3_ID:
  670. reg = R_I2SP3CTL;
  671. break;
  672. default:
  673. ret = -ENODEV;
  674. dev_err(component->dev, "Unknown DAI %d (%d)\n", aif_id, ret);
  675. return ret;
  676. }
  677. mask = FM_I2SPCTL_PORTMS;
  678. val = provider ? FV_PORTMS_MASTER : FV_PORTMS_SLAVE;
  679. ret = snd_soc_component_update_bits(component, reg, mask, val);
  680. if (ret < 0) {
  681. dev_err(component->dev, "Failed to set DAI %d to %s (%d)\n",
  682. aif_id, provider ? "provider" : "consumer", ret);
  683. return ret;
  684. }
  685. return 0;
  686. }
  687. static inline
  688. int aif_prepare(struct snd_soc_component *component, struct aif *aif)
  689. {
  690. int ret;
  691. ret = aif_set_provider(component, aif->id, aif->provider);
  692. if (ret < 0)
  693. return ret;
  694. return 0;
  695. }
  696. static inline int aif_free(struct snd_soc_component *component,
  697. struct aif *aif, bool playback)
  698. {
  699. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  700. mutex_lock(&tscs454->aifs_status_lock);
  701. dev_dbg(component->dev, "%s(): aif %d\n", __func__, aif->id);
  702. set_aif_status_inactive(&tscs454->aifs_status, aif->id, playback);
  703. dev_dbg(component->dev, "Set aif %d inactive. Streams status is 0x%x\n",
  704. aif->id, tscs454->aifs_status.streams);
  705. if (!aif_active(&tscs454->aifs_status, aif->id)) {
  706. /* Do config in slave mode */
  707. aif_set_provider(component, aif->id, false);
  708. dev_dbg(component->dev, "Freeing pll %d from aif %d\n",
  709. aif->pll->id, aif->id);
  710. free_pll(aif->pll);
  711. }
  712. if (!aifs_active(&tscs454->aifs_status)) {
  713. dev_dbg(component->dev, "Freeing pll %d from ir\n",
  714. tscs454->internal_rate.pll->id);
  715. free_pll(tscs454->internal_rate.pll);
  716. }
  717. mutex_unlock(&tscs454->aifs_status_lock);
  718. return 0;
  719. }
  720. /* R_PLLCTL PG 0 ADDR 0x15 */
  721. static char const * const bclk_sel_txt[] = {
  722. "BCLK 1", "BCLK 2", "BCLK 3"};
  723. static struct soc_enum const bclk_sel_enum =
  724. SOC_ENUM_SINGLE(R_PLLCTL, FB_PLLCTL_BCLKSEL,
  725. ARRAY_SIZE(bclk_sel_txt), bclk_sel_txt);
  726. /* R_ISRC PG 0 ADDR 0x16 */
  727. static char const * const isrc_br_txt[] = {
  728. "44.1kHz", "48kHz"};
  729. static struct soc_enum const isrc_br_enum =
  730. SOC_ENUM_SINGLE(R_ISRC, FB_ISRC_IBR,
  731. ARRAY_SIZE(isrc_br_txt), isrc_br_txt);
  732. static char const * const isrc_bm_txt[] = {
  733. "0.25x", "0.5x", "1.0x", "2.0x"};
  734. static struct soc_enum const isrc_bm_enum =
  735. SOC_ENUM_SINGLE(R_ISRC, FB_ISRC_IBM,
  736. ARRAY_SIZE(isrc_bm_txt), isrc_bm_txt);
  737. /* R_SCLKCTL PG 0 ADDR 0x18 */
  738. static char const * const modular_rate_txt[] = {
  739. "Reserved", "Half", "Full", "Auto",};
  740. static struct soc_enum const adc_modular_rate_enum =
  741. SOC_ENUM_SINGLE(R_SCLKCTL, FB_SCLKCTL_ASDM,
  742. ARRAY_SIZE(modular_rate_txt), modular_rate_txt);
  743. static struct soc_enum const dac_modular_rate_enum =
  744. SOC_ENUM_SINGLE(R_SCLKCTL, FB_SCLKCTL_DSDM,
  745. ARRAY_SIZE(modular_rate_txt), modular_rate_txt);
  746. /* R_I2SIDCTL PG 0 ADDR 0x38 */
  747. static char const * const data_ctrl_txt[] = {
  748. "L/R", "L/L", "R/R", "R/L"};
  749. static struct soc_enum const data_in_ctrl_enums[] = {
  750. SOC_ENUM_SINGLE(R_I2SIDCTL, FB_I2SIDCTL_I2SI1DCTL,
  751. ARRAY_SIZE(data_ctrl_txt), data_ctrl_txt),
  752. SOC_ENUM_SINGLE(R_I2SIDCTL, FB_I2SIDCTL_I2SI2DCTL,
  753. ARRAY_SIZE(data_ctrl_txt), data_ctrl_txt),
  754. SOC_ENUM_SINGLE(R_I2SIDCTL, FB_I2SIDCTL_I2SI3DCTL,
  755. ARRAY_SIZE(data_ctrl_txt), data_ctrl_txt),
  756. };
  757. /* R_I2SODCTL PG 0 ADDR 0x39 */
  758. static struct soc_enum const data_out_ctrl_enums[] = {
  759. SOC_ENUM_SINGLE(R_I2SODCTL, FB_I2SODCTL_I2SO1DCTL,
  760. ARRAY_SIZE(data_ctrl_txt), data_ctrl_txt),
  761. SOC_ENUM_SINGLE(R_I2SODCTL, FB_I2SODCTL_I2SO2DCTL,
  762. ARRAY_SIZE(data_ctrl_txt), data_ctrl_txt),
  763. SOC_ENUM_SINGLE(R_I2SODCTL, FB_I2SODCTL_I2SO3DCTL,
  764. ARRAY_SIZE(data_ctrl_txt), data_ctrl_txt),
  765. };
  766. /* R_AUDIOMUX1 PG 0 ADDR 0x3A */
  767. static char const * const asrc_mux_txt[] = {
  768. "None", "DAI 1", "DAI 2", "DAI 3"};
  769. static struct soc_enum const asrc_in_mux_enum =
  770. SOC_ENUM_SINGLE(R_AUDIOMUX1, FB_AUDIOMUX1_ASRCIMUX,
  771. ARRAY_SIZE(asrc_mux_txt), asrc_mux_txt);
  772. static char const * const dai_mux_txt[] = {
  773. "CH 0_1", "CH 2_3", "CH 4_5", "ADC/DMic 1",
  774. "DMic 2", "ClassD", "DAC", "Sub"};
  775. static struct soc_enum const dai2_mux_enum =
  776. SOC_ENUM_SINGLE(R_AUDIOMUX1, FB_AUDIOMUX1_I2S2MUX,
  777. ARRAY_SIZE(dai_mux_txt), dai_mux_txt);
  778. static struct snd_kcontrol_new const dai2_mux_dapm_enum =
  779. SOC_DAPM_ENUM("DAI 2 Mux", dai2_mux_enum);
  780. static struct soc_enum const dai1_mux_enum =
  781. SOC_ENUM_SINGLE(R_AUDIOMUX1, FB_AUDIOMUX1_I2S1MUX,
  782. ARRAY_SIZE(dai_mux_txt), dai_mux_txt);
  783. static struct snd_kcontrol_new const dai1_mux_dapm_enum =
  784. SOC_DAPM_ENUM("DAI 1 Mux", dai1_mux_enum);
  785. /* R_AUDIOMUX2 PG 0 ADDR 0x3B */
  786. static struct soc_enum const asrc_out_mux_enum =
  787. SOC_ENUM_SINGLE(R_AUDIOMUX2, FB_AUDIOMUX2_ASRCOMUX,
  788. ARRAY_SIZE(asrc_mux_txt), asrc_mux_txt);
  789. static struct soc_enum const dac_mux_enum =
  790. SOC_ENUM_SINGLE(R_AUDIOMUX2, FB_AUDIOMUX2_DACMUX,
  791. ARRAY_SIZE(dai_mux_txt), dai_mux_txt);
  792. static struct snd_kcontrol_new const dac_mux_dapm_enum =
  793. SOC_DAPM_ENUM("DAC Mux", dac_mux_enum);
  794. static struct soc_enum const dai3_mux_enum =
  795. SOC_ENUM_SINGLE(R_AUDIOMUX2, FB_AUDIOMUX2_I2S3MUX,
  796. ARRAY_SIZE(dai_mux_txt), dai_mux_txt);
  797. static struct snd_kcontrol_new const dai3_mux_dapm_enum =
  798. SOC_DAPM_ENUM("DAI 3 Mux", dai3_mux_enum);
  799. /* R_AUDIOMUX3 PG 0 ADDR 0x3C */
  800. static char const * const sub_mux_txt[] = {
  801. "CH 0", "CH 1", "CH 0 + 1",
  802. "CH 2", "CH 3", "CH 2 + 3",
  803. "CH 4", "CH 5", "CH 4 + 5",
  804. "ADC/DMic 1 Left", "ADC/DMic 1 Right",
  805. "ADC/DMic 1 Left Plus Right",
  806. "DMic 2 Left", "DMic 2 Right", "DMic 2 Left Plus Right",
  807. "ClassD Left", "ClassD Right", "ClassD Left Plus Right"};
  808. static struct soc_enum const sub_mux_enum =
  809. SOC_ENUM_SINGLE(R_AUDIOMUX3, FB_AUDIOMUX3_SUBMUX,
  810. ARRAY_SIZE(sub_mux_txt), sub_mux_txt);
  811. static struct snd_kcontrol_new const sub_mux_dapm_enum =
  812. SOC_DAPM_ENUM("Sub Mux", sub_mux_enum);
  813. static struct soc_enum const classd_mux_enum =
  814. SOC_ENUM_SINGLE(R_AUDIOMUX3, FB_AUDIOMUX3_CLSSDMUX,
  815. ARRAY_SIZE(dai_mux_txt), dai_mux_txt);
  816. static struct snd_kcontrol_new const classd_mux_dapm_enum =
  817. SOC_DAPM_ENUM("ClassD Mux", classd_mux_enum);
  818. /* R_HSDCTL1 PG 1 ADDR 0x01 */
  819. static char const * const jack_type_txt[] = {
  820. "3 Terminal", "4 Terminal"};
  821. static struct soc_enum const hp_jack_type_enum =
  822. SOC_ENUM_SINGLE(R_HSDCTL1, FB_HSDCTL1_HPJKTYPE,
  823. ARRAY_SIZE(jack_type_txt), jack_type_txt);
  824. static char const * const hs_det_pol_txt[] = {
  825. "Rising", "Falling"};
  826. static struct soc_enum const hs_det_pol_enum =
  827. SOC_ENUM_SINGLE(R_HSDCTL1, FB_HSDCTL1_HSDETPOL,
  828. ARRAY_SIZE(hs_det_pol_txt), hs_det_pol_txt);
  829. /* R_HSDCTL1 PG 1 ADDR 0x02 */
  830. static char const * const hs_mic_bias_force_txt[] = {
  831. "Off", "Ring", "Sleeve"};
  832. static struct soc_enum const hs_mic_bias_force_enum =
  833. SOC_ENUM_SINGLE(R_HSDCTL2, FB_HSDCTL2_FMICBIAS1,
  834. ARRAY_SIZE(hs_mic_bias_force_txt),
  835. hs_mic_bias_force_txt);
  836. static char const * const plug_type_txt[] = {
  837. "OMTP", "CTIA", "Reserved", "Headphone"};
  838. static struct soc_enum const plug_type_force_enum =
  839. SOC_ENUM_SINGLE(R_HSDCTL2, FB_HSDCTL2_FPLUGTYPE,
  840. ARRAY_SIZE(plug_type_txt), plug_type_txt);
  841. /* R_CH0AIC PG 1 ADDR 0x06 */
  842. static char const * const in_bst_mux_txt[] = {
  843. "Input 1", "Input 2", "Input 3", "D2S"};
  844. static struct soc_enum const in_bst_mux_ch0_enum =
  845. SOC_ENUM_SINGLE(R_CH0AIC, FB_CH0AIC_INSELL,
  846. ARRAY_SIZE(in_bst_mux_txt),
  847. in_bst_mux_txt);
  848. static struct snd_kcontrol_new const in_bst_mux_ch0_dapm_enum =
  849. SOC_DAPM_ENUM("Input Boost Channel 0 Enum",
  850. in_bst_mux_ch0_enum);
  851. static DECLARE_TLV_DB_SCALE(in_bst_vol_tlv_arr, 0, 1000, 0);
  852. static char const * const adc_mux_txt[] = {
  853. "Input 1 Boost Bypass", "Input 2 Boost Bypass",
  854. "Input 3 Boost Bypass", "Input Boost"};
  855. static struct soc_enum const adc_mux_ch0_enum =
  856. SOC_ENUM_SINGLE(R_CH0AIC, FB_CH0AIC_LADCIN,
  857. ARRAY_SIZE(adc_mux_txt), adc_mux_txt);
  858. static struct snd_kcontrol_new const adc_mux_ch0_dapm_enum =
  859. SOC_DAPM_ENUM("ADC Channel 0 Enum", adc_mux_ch0_enum);
  860. static char const * const in_proc_mux_txt[] = {
  861. "ADC", "DMic"};
  862. static struct soc_enum const in_proc_ch0_enum =
  863. SOC_ENUM_SINGLE(R_CH0AIC, FB_CH0AIC_IPCH0S,
  864. ARRAY_SIZE(in_proc_mux_txt), in_proc_mux_txt);
  865. static struct snd_kcontrol_new const in_proc_mux_ch0_dapm_enum =
  866. SOC_DAPM_ENUM("Input Processor Channel 0 Enum",
  867. in_proc_ch0_enum);
  868. /* R_CH1AIC PG 1 ADDR 0x07 */
  869. static struct soc_enum const in_bst_mux_ch1_enum =
  870. SOC_ENUM_SINGLE(R_CH1AIC, FB_CH1AIC_INSELR,
  871. ARRAY_SIZE(in_bst_mux_txt),
  872. in_bst_mux_txt);
  873. static struct snd_kcontrol_new const in_bst_mux_ch1_dapm_enum =
  874. SOC_DAPM_ENUM("Input Boost Channel 1 Enum",
  875. in_bst_mux_ch1_enum);
  876. static struct soc_enum const adc_mux_ch1_enum =
  877. SOC_ENUM_SINGLE(R_CH1AIC, FB_CH1AIC_RADCIN,
  878. ARRAY_SIZE(adc_mux_txt), adc_mux_txt);
  879. static struct snd_kcontrol_new const adc_mux_ch1_dapm_enum =
  880. SOC_DAPM_ENUM("ADC Channel 1 Enum", adc_mux_ch1_enum);
  881. static struct soc_enum const in_proc_ch1_enum =
  882. SOC_ENUM_SINGLE(R_CH1AIC, FB_CH1AIC_IPCH1S,
  883. ARRAY_SIZE(in_proc_mux_txt), in_proc_mux_txt);
  884. static struct snd_kcontrol_new const in_proc_mux_ch1_dapm_enum =
  885. SOC_DAPM_ENUM("Input Processor Channel 1 Enum",
  886. in_proc_ch1_enum);
  887. /* R_ICTL0 PG 1 ADDR 0x0A */
  888. static char const * const pol_txt[] = {
  889. "Normal", "Invert"};
  890. static struct soc_enum const in_pol_ch1_enum =
  891. SOC_ENUM_SINGLE(R_ICTL0, FB_ICTL0_IN0POL,
  892. ARRAY_SIZE(pol_txt), pol_txt);
  893. static struct soc_enum const in_pol_ch0_enum =
  894. SOC_ENUM_SINGLE(R_ICTL0, FB_ICTL0_IN1POL,
  895. ARRAY_SIZE(pol_txt), pol_txt);
  896. static char const * const in_proc_ch_sel_txt[] = {
  897. "Normal", "Mono Mix to Channel 0",
  898. "Mono Mix to Channel 1", "Add"};
  899. static struct soc_enum const in_proc_ch01_sel_enum =
  900. SOC_ENUM_SINGLE(R_ICTL0, FB_ICTL0_INPCH10SEL,
  901. ARRAY_SIZE(in_proc_ch_sel_txt),
  902. in_proc_ch_sel_txt);
  903. /* R_ICTL1 PG 1 ADDR 0x0B */
  904. static struct soc_enum const in_pol_ch3_enum =
  905. SOC_ENUM_SINGLE(R_ICTL1, FB_ICTL1_IN2POL,
  906. ARRAY_SIZE(pol_txt), pol_txt);
  907. static struct soc_enum const in_pol_ch2_enum =
  908. SOC_ENUM_SINGLE(R_ICTL1, FB_ICTL1_IN3POL,
  909. ARRAY_SIZE(pol_txt), pol_txt);
  910. static struct soc_enum const in_proc_ch23_sel_enum =
  911. SOC_ENUM_SINGLE(R_ICTL1, FB_ICTL1_INPCH32SEL,
  912. ARRAY_SIZE(in_proc_ch_sel_txt),
  913. in_proc_ch_sel_txt);
  914. /* R_MICBIAS PG 1 ADDR 0x0C */
  915. static char const * const mic_bias_txt[] = {
  916. "2.5V", "2.1V", "1.8V", "Vdd"};
  917. static struct soc_enum const mic_bias_2_enum =
  918. SOC_ENUM_SINGLE(R_MICBIAS, FB_MICBIAS_MICBOV2,
  919. ARRAY_SIZE(mic_bias_txt), mic_bias_txt);
  920. static struct soc_enum const mic_bias_1_enum =
  921. SOC_ENUM_SINGLE(R_MICBIAS, FB_MICBIAS_MICBOV1,
  922. ARRAY_SIZE(mic_bias_txt), mic_bias_txt);
  923. /* R_PGACTL0 PG 1 ADDR 0x0D */
  924. /* R_PGACTL1 PG 1 ADDR 0x0E */
  925. /* R_PGACTL2 PG 1 ADDR 0x0F */
  926. /* R_PGACTL3 PG 1 ADDR 0x10 */
  927. static DECLARE_TLV_DB_SCALE(in_pga_vol_tlv_arr, -1725, 75, 0);
  928. /* R_ICH0VOL PG1 ADDR 0x12 */
  929. /* R_ICH1VOL PG1 ADDR 0x13 */
  930. /* R_ICH2VOL PG1 ADDR 0x14 */
  931. /* R_ICH3VOL PG1 ADDR 0x15 */
  932. static DECLARE_TLV_DB_MINMAX(in_vol_tlv_arr, -7125, 2400);
  933. /* R_ASRCILVOL PG1 ADDR 0x16 */
  934. /* R_ASRCIRVOL PG1 ADDR 0x17 */
  935. /* R_ASRCOLVOL PG1 ADDR 0x18 */
  936. /* R_ASRCORVOL PG1 ADDR 0x19 */
  937. static DECLARE_TLV_DB_MINMAX(asrc_vol_tlv_arr, -9562, 600);
  938. /* R_ALCCTL0 PG1 ADDR 0x1D */
  939. static char const * const alc_mode_txt[] = {
  940. "ALC", "Limiter"};
  941. static struct soc_enum const alc_mode_enum =
  942. SOC_ENUM_SINGLE(R_ALCCTL0, FB_ALCCTL0_ALCMODE,
  943. ARRAY_SIZE(alc_mode_txt), alc_mode_txt);
  944. static char const * const alc_ref_text[] = {
  945. "Channel 0", "Channel 1", "Channel 2", "Channel 3", "Peak"};
  946. static struct soc_enum const alc_ref_enum =
  947. SOC_ENUM_SINGLE(R_ALCCTL0, FB_ALCCTL0_ALCREF,
  948. ARRAY_SIZE(alc_ref_text), alc_ref_text);
  949. /* R_ALCCTL1 PG 1 ADDR 0x1E */
  950. static DECLARE_TLV_DB_SCALE(alc_max_gain_tlv_arr, -1200, 600, 0);
  951. static DECLARE_TLV_DB_SCALE(alc_target_tlv_arr, -2850, 150, 0);
  952. /* R_ALCCTL2 PG 1 ADDR 0x1F */
  953. static DECLARE_TLV_DB_SCALE(alc_min_gain_tlv_arr, -1725, 600, 0);
  954. /* R_NGATE PG 1 ADDR 0x21 */
  955. static DECLARE_TLV_DB_SCALE(ngth_tlv_arr, -7650, 150, 0);
  956. static char const * const ngate_type_txt[] = {
  957. "PGA Constant", "ADC Mute"};
  958. static struct soc_enum const ngate_type_enum =
  959. SOC_ENUM_SINGLE(R_NGATE, FB_NGATE_NGG,
  960. ARRAY_SIZE(ngate_type_txt), ngate_type_txt);
  961. /* R_DMICCTL PG 1 ADDR 0x22 */
  962. static char const * const dmic_mono_sel_txt[] = {
  963. "Stereo", "Mono"};
  964. static struct soc_enum const dmic_mono_sel_enum =
  965. SOC_ENUM_SINGLE(R_DMICCTL, FB_DMICCTL_DMONO,
  966. ARRAY_SIZE(dmic_mono_sel_txt), dmic_mono_sel_txt);
  967. /* R_DACCTL PG 2 ADDR 0x01 */
  968. static struct soc_enum const dac_pol_r_enum =
  969. SOC_ENUM_SINGLE(R_DACCTL, FB_DACCTL_DACPOLR,
  970. ARRAY_SIZE(pol_txt), pol_txt);
  971. static struct soc_enum const dac_pol_l_enum =
  972. SOC_ENUM_SINGLE(R_DACCTL, FB_DACCTL_DACPOLL,
  973. ARRAY_SIZE(pol_txt), pol_txt);
  974. static char const * const dac_dith_txt[] = {
  975. "Half", "Full", "Disabled", "Static"};
  976. static struct soc_enum const dac_dith_enum =
  977. SOC_ENUM_SINGLE(R_DACCTL, FB_DACCTL_DACDITH,
  978. ARRAY_SIZE(dac_dith_txt), dac_dith_txt);
  979. /* R_SPKCTL PG 2 ADDR 0x02 */
  980. static struct soc_enum const spk_pol_r_enum =
  981. SOC_ENUM_SINGLE(R_SPKCTL, FB_SPKCTL_SPKPOLR,
  982. ARRAY_SIZE(pol_txt), pol_txt);
  983. static struct soc_enum const spk_pol_l_enum =
  984. SOC_ENUM_SINGLE(R_SPKCTL, FB_SPKCTL_SPKPOLL,
  985. ARRAY_SIZE(pol_txt), pol_txt);
  986. /* R_SUBCTL PG 2 ADDR 0x03 */
  987. static struct soc_enum const sub_pol_enum =
  988. SOC_ENUM_SINGLE(R_SUBCTL, FB_SUBCTL_SUBPOL,
  989. ARRAY_SIZE(pol_txt), pol_txt);
  990. /* R_MVOLL PG 2 ADDR 0x08 */
  991. /* R_MVOLR PG 2 ADDR 0x09 */
  992. static DECLARE_TLV_DB_MINMAX(mvol_tlv_arr, -9562, 0);
  993. /* R_HPVOLL PG 2 ADDR 0x0A */
  994. /* R_HPVOLR PG 2 ADDR 0x0B */
  995. static DECLARE_TLV_DB_SCALE(hp_vol_tlv_arr, -8850, 75, 0);
  996. /* R_SPKVOLL PG 2 ADDR 0x0C */
  997. /* R_SPKVOLR PG 2 ADDR 0x0D */
  998. static DECLARE_TLV_DB_SCALE(spk_vol_tlv_arr, -7725, 75, 0);
  999. /* R_SPKEQFILT PG 3 ADDR 0x01 */
  1000. static char const * const eq_txt[] = {
  1001. "Pre Scale",
  1002. "Pre Scale + EQ Band 0",
  1003. "Pre Scale + EQ Band 0 - 1",
  1004. "Pre Scale + EQ Band 0 - 2",
  1005. "Pre Scale + EQ Band 0 - 3",
  1006. "Pre Scale + EQ Band 0 - 4",
  1007. "Pre Scale + EQ Band 0 - 5",
  1008. };
  1009. static struct soc_enum const spk_eq_enums[] = {
  1010. SOC_ENUM_SINGLE(R_SPKEQFILT, FB_SPKEQFILT_EQ2BE,
  1011. ARRAY_SIZE(eq_txt), eq_txt),
  1012. SOC_ENUM_SINGLE(R_SPKEQFILT, FB_SPKEQFILT_EQ1BE,
  1013. ARRAY_SIZE(eq_txt), eq_txt),
  1014. };
  1015. /* R_SPKMBCCTL PG 3 ADDR 0x0B */
  1016. static char const * const lvl_mode_txt[] = {
  1017. "Average", "Peak"};
  1018. static struct soc_enum const spk_mbc3_lvl_det_mode_enum =
  1019. SOC_ENUM_SINGLE(R_SPKMBCCTL, FB_SPKMBCCTL_LVLMODE3,
  1020. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1021. static char const * const win_sel_txt[] = {
  1022. "512", "64"};
  1023. static struct soc_enum const spk_mbc3_win_sel_enum =
  1024. SOC_ENUM_SINGLE(R_SPKMBCCTL, FB_SPKMBCCTL_WINSEL3,
  1025. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1026. static struct soc_enum const spk_mbc2_lvl_det_mode_enum =
  1027. SOC_ENUM_SINGLE(R_SPKMBCCTL, FB_SPKMBCCTL_LVLMODE2,
  1028. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1029. static struct soc_enum const spk_mbc2_win_sel_enum =
  1030. SOC_ENUM_SINGLE(R_SPKMBCCTL, FB_SPKMBCCTL_WINSEL2,
  1031. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1032. static struct soc_enum const spk_mbc1_lvl_det_mode_enum =
  1033. SOC_ENUM_SINGLE(R_SPKMBCCTL, FB_SPKMBCCTL_LVLMODE1,
  1034. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1035. static struct soc_enum const spk_mbc1_win_sel_enum =
  1036. SOC_ENUM_SINGLE(R_SPKMBCCTL, FB_SPKMBCCTL_WINSEL1,
  1037. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1038. /* R_SPKMBCMUG1 PG 3 ADDR 0x0C */
  1039. static struct soc_enum const spk_mbc1_phase_pol_enum =
  1040. SOC_ENUM_SINGLE(R_SPKMBCMUG1, FB_SPKMBCMUG_PHASE,
  1041. ARRAY_SIZE(pol_txt), pol_txt);
  1042. static DECLARE_TLV_DB_MINMAX(mbc_mug_tlv_arr, -4650, 0);
  1043. /* R_SPKMBCTHR1 PG 3 ADDR 0x0D */
  1044. static DECLARE_TLV_DB_MINMAX(thr_tlv_arr, -9562, 0);
  1045. /* R_SPKMBCRAT1 PG 3 ADDR 0x0E */
  1046. static char const * const comp_rat_txt[] = {
  1047. "Reserved", "1.5:1", "2:1", "3:1", "4:1", "5:1", "6:1",
  1048. "7:1", "8:1", "9:1", "10:1", "11:1", "12:1", "13:1", "14:1",
  1049. "15:1", "16:1", "17:1", "18:1", "19:1", "20:1"};
  1050. static struct soc_enum const spk_mbc1_comp_rat_enum =
  1051. SOC_ENUM_SINGLE(R_SPKMBCRAT1, FB_SPKMBCRAT_RATIO,
  1052. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1053. /* R_SPKMBCMUG2 PG 3 ADDR 0x13 */
  1054. static struct soc_enum const spk_mbc2_phase_pol_enum =
  1055. SOC_ENUM_SINGLE(R_SPKMBCMUG2, FB_SPKMBCMUG_PHASE,
  1056. ARRAY_SIZE(pol_txt), pol_txt);
  1057. /* R_SPKMBCRAT2 PG 3 ADDR 0x15 */
  1058. static struct soc_enum const spk_mbc2_comp_rat_enum =
  1059. SOC_ENUM_SINGLE(R_SPKMBCRAT2, FB_SPKMBCRAT_RATIO,
  1060. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1061. /* R_SPKMBCMUG3 PG 3 ADDR 0x1A */
  1062. static struct soc_enum const spk_mbc3_phase_pol_enum =
  1063. SOC_ENUM_SINGLE(R_SPKMBCMUG3, FB_SPKMBCMUG_PHASE,
  1064. ARRAY_SIZE(pol_txt), pol_txt);
  1065. /* R_SPKMBCRAT3 PG 3 ADDR 0x1C */
  1066. static struct soc_enum const spk_mbc3_comp_rat_enum =
  1067. SOC_ENUM_SINGLE(R_SPKMBCRAT3, FB_SPKMBCRAT_RATIO,
  1068. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1069. /* R_SPKCLECTL PG 3 ADDR 0x21 */
  1070. static struct soc_enum const spk_cle_lvl_mode_enum =
  1071. SOC_ENUM_SINGLE(R_SPKCLECTL, FB_SPKCLECTL_LVLMODE,
  1072. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1073. static struct soc_enum const spk_cle_win_sel_enum =
  1074. SOC_ENUM_SINGLE(R_SPKCLECTL, FB_SPKCLECTL_WINSEL,
  1075. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1076. /* R_SPKCLEMUG PG 3 ADDR 0x22 */
  1077. static DECLARE_TLV_DB_MINMAX(cle_mug_tlv_arr, 0, 4650);
  1078. /* R_SPKCOMPRAT PG 3 ADDR 0x24 */
  1079. static struct soc_enum const spk_comp_rat_enum =
  1080. SOC_ENUM_SINGLE(R_SPKCOMPRAT, FB_SPKCOMPRAT_RATIO,
  1081. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1082. /* R_SPKEXPTHR PG 3 ADDR 0x2F */
  1083. static char const * const exp_rat_txt[] = {
  1084. "Reserved", "Reserved", "1:2", "1:3",
  1085. "1:4", "1:5", "1:6", "1:7"};
  1086. static struct soc_enum const spk_exp_rat_enum =
  1087. SOC_ENUM_SINGLE(R_SPKEXPRAT, FB_SPKEXPRAT_RATIO,
  1088. ARRAY_SIZE(exp_rat_txt), exp_rat_txt);
  1089. /* R_DACEQFILT PG 4 ADDR 0x01 */
  1090. static struct soc_enum const dac_eq_enums[] = {
  1091. SOC_ENUM_SINGLE(R_DACEQFILT, FB_DACEQFILT_EQ2BE,
  1092. ARRAY_SIZE(eq_txt), eq_txt),
  1093. SOC_ENUM_SINGLE(R_DACEQFILT, FB_DACEQFILT_EQ1BE,
  1094. ARRAY_SIZE(eq_txt), eq_txt),
  1095. };
  1096. /* R_DACMBCCTL PG 4 ADDR 0x0B */
  1097. static struct soc_enum const dac_mbc3_lvl_det_mode_enum =
  1098. SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_LVLMODE3,
  1099. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1100. static struct soc_enum const dac_mbc3_win_sel_enum =
  1101. SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_WINSEL3,
  1102. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1103. static struct soc_enum const dac_mbc2_lvl_det_mode_enum =
  1104. SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_LVLMODE2,
  1105. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1106. static struct soc_enum const dac_mbc2_win_sel_enum =
  1107. SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_WINSEL2,
  1108. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1109. static struct soc_enum const dac_mbc1_lvl_det_mode_enum =
  1110. SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_LVLMODE1,
  1111. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1112. static struct soc_enum const dac_mbc1_win_sel_enum =
  1113. SOC_ENUM_SINGLE(R_DACMBCCTL, FB_DACMBCCTL_WINSEL1,
  1114. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1115. /* R_DACMBCMUG1 PG 4 ADDR 0x0C */
  1116. static struct soc_enum const dac_mbc1_phase_pol_enum =
  1117. SOC_ENUM_SINGLE(R_DACMBCMUG1, FB_DACMBCMUG_PHASE,
  1118. ARRAY_SIZE(pol_txt), pol_txt);
  1119. /* R_DACMBCRAT1 PG 4 ADDR 0x0E */
  1120. static struct soc_enum const dac_mbc1_comp_rat_enum =
  1121. SOC_ENUM_SINGLE(R_DACMBCRAT1, FB_DACMBCRAT_RATIO,
  1122. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1123. /* R_DACMBCMUG2 PG 4 ADDR 0x13 */
  1124. static struct soc_enum const dac_mbc2_phase_pol_enum =
  1125. SOC_ENUM_SINGLE(R_DACMBCMUG2, FB_DACMBCMUG_PHASE,
  1126. ARRAY_SIZE(pol_txt), pol_txt);
  1127. /* R_DACMBCRAT2 PG 4 ADDR 0x15 */
  1128. static struct soc_enum const dac_mbc2_comp_rat_enum =
  1129. SOC_ENUM_SINGLE(R_DACMBCRAT2, FB_DACMBCRAT_RATIO,
  1130. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1131. /* R_DACMBCMUG3 PG 4 ADDR 0x1A */
  1132. static struct soc_enum const dac_mbc3_phase_pol_enum =
  1133. SOC_ENUM_SINGLE(R_DACMBCMUG3, FB_DACMBCMUG_PHASE,
  1134. ARRAY_SIZE(pol_txt), pol_txt);
  1135. /* R_DACMBCRAT3 PG 4 ADDR 0x1C */
  1136. static struct soc_enum const dac_mbc3_comp_rat_enum =
  1137. SOC_ENUM_SINGLE(R_DACMBCRAT3, FB_DACMBCRAT_RATIO,
  1138. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1139. /* R_DACCLECTL PG 4 ADDR 0x21 */
  1140. static struct soc_enum const dac_cle_lvl_mode_enum =
  1141. SOC_ENUM_SINGLE(R_DACCLECTL, FB_DACCLECTL_LVLMODE,
  1142. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1143. static struct soc_enum const dac_cle_win_sel_enum =
  1144. SOC_ENUM_SINGLE(R_DACCLECTL, FB_DACCLECTL_WINSEL,
  1145. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1146. /* R_DACCOMPRAT PG 4 ADDR 0x24 */
  1147. static struct soc_enum const dac_comp_rat_enum =
  1148. SOC_ENUM_SINGLE(R_DACCOMPRAT, FB_DACCOMPRAT_RATIO,
  1149. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1150. /* R_DACEXPRAT PG 4 ADDR 0x30 */
  1151. static struct soc_enum const dac_exp_rat_enum =
  1152. SOC_ENUM_SINGLE(R_DACEXPRAT, FB_DACEXPRAT_RATIO,
  1153. ARRAY_SIZE(exp_rat_txt), exp_rat_txt);
  1154. /* R_SUBEQFILT PG 5 ADDR 0x01 */
  1155. static struct soc_enum const sub_eq_enums[] = {
  1156. SOC_ENUM_SINGLE(R_SUBEQFILT, FB_SUBEQFILT_EQ2BE,
  1157. ARRAY_SIZE(eq_txt), eq_txt),
  1158. SOC_ENUM_SINGLE(R_SUBEQFILT, FB_SUBEQFILT_EQ1BE,
  1159. ARRAY_SIZE(eq_txt), eq_txt),
  1160. };
  1161. /* R_SUBMBCCTL PG 5 ADDR 0x0B */
  1162. static struct soc_enum const sub_mbc3_lvl_det_mode_enum =
  1163. SOC_ENUM_SINGLE(R_SUBMBCCTL, FB_SUBMBCCTL_LVLMODE3,
  1164. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1165. static struct soc_enum const sub_mbc3_win_sel_enum =
  1166. SOC_ENUM_SINGLE(R_SUBMBCCTL, FB_SUBMBCCTL_WINSEL3,
  1167. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1168. static struct soc_enum const sub_mbc2_lvl_det_mode_enum =
  1169. SOC_ENUM_SINGLE(R_SUBMBCCTL, FB_SUBMBCCTL_LVLMODE2,
  1170. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1171. static struct soc_enum const sub_mbc2_win_sel_enum =
  1172. SOC_ENUM_SINGLE(R_SUBMBCCTL, FB_SUBMBCCTL_WINSEL2,
  1173. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1174. static struct soc_enum const sub_mbc1_lvl_det_mode_enum =
  1175. SOC_ENUM_SINGLE(R_SUBMBCCTL, FB_SUBMBCCTL_LVLMODE1,
  1176. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1177. static struct soc_enum const sub_mbc1_win_sel_enum =
  1178. SOC_ENUM_SINGLE(R_SUBMBCCTL, FB_SUBMBCCTL_WINSEL1,
  1179. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1180. /* R_SUBMBCMUG1 PG 5 ADDR 0x0C */
  1181. static struct soc_enum const sub_mbc1_phase_pol_enum =
  1182. SOC_ENUM_SINGLE(R_SUBMBCMUG1, FB_SUBMBCMUG_PHASE,
  1183. ARRAY_SIZE(pol_txt), pol_txt);
  1184. /* R_SUBMBCRAT1 PG 5 ADDR 0x0E */
  1185. static struct soc_enum const sub_mbc1_comp_rat_enum =
  1186. SOC_ENUM_SINGLE(R_SUBMBCRAT1, FB_SUBMBCRAT_RATIO,
  1187. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1188. /* R_SUBMBCMUG2 PG 5 ADDR 0x13 */
  1189. static struct soc_enum const sub_mbc2_phase_pol_enum =
  1190. SOC_ENUM_SINGLE(R_SUBMBCMUG2, FB_SUBMBCMUG_PHASE,
  1191. ARRAY_SIZE(pol_txt), pol_txt);
  1192. /* R_SUBMBCRAT2 PG 5 ADDR 0x15 */
  1193. static struct soc_enum const sub_mbc2_comp_rat_enum =
  1194. SOC_ENUM_SINGLE(R_SUBMBCRAT2, FB_SUBMBCRAT_RATIO,
  1195. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1196. /* R_SUBMBCMUG3 PG 5 ADDR 0x1A */
  1197. static struct soc_enum const sub_mbc3_phase_pol_enum =
  1198. SOC_ENUM_SINGLE(R_SUBMBCMUG3, FB_SUBMBCMUG_PHASE,
  1199. ARRAY_SIZE(pol_txt), pol_txt);
  1200. /* R_SUBMBCRAT3 PG 5 ADDR 0x1C */
  1201. static struct soc_enum const sub_mbc3_comp_rat_enum =
  1202. SOC_ENUM_SINGLE(R_SUBMBCRAT3, FB_SUBMBCRAT_RATIO,
  1203. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1204. /* R_SUBCLECTL PG 5 ADDR 0x21 */
  1205. static struct soc_enum const sub_cle_lvl_mode_enum =
  1206. SOC_ENUM_SINGLE(R_SUBCLECTL, FB_SUBCLECTL_LVLMODE,
  1207. ARRAY_SIZE(lvl_mode_txt), lvl_mode_txt);
  1208. static struct soc_enum const sub_cle_win_sel_enum =
  1209. SOC_ENUM_SINGLE(R_SUBCLECTL, FB_SUBCLECTL_WINSEL,
  1210. ARRAY_SIZE(win_sel_txt), win_sel_txt);
  1211. /* R_SUBCOMPRAT PG 5 ADDR 0x24 */
  1212. static struct soc_enum const sub_comp_rat_enum =
  1213. SOC_ENUM_SINGLE(R_SUBCOMPRAT, FB_SUBCOMPRAT_RATIO,
  1214. ARRAY_SIZE(comp_rat_txt), comp_rat_txt);
  1215. /* R_SUBEXPRAT PG 5 ADDR 0x30 */
  1216. static struct soc_enum const sub_exp_rat_enum =
  1217. SOC_ENUM_SINGLE(R_SUBEXPRAT, FB_SUBEXPRAT_RATIO,
  1218. ARRAY_SIZE(exp_rat_txt), exp_rat_txt);
  1219. static int bytes_info_ext(struct snd_kcontrol *kcontrol,
  1220. struct snd_ctl_elem_info *ucontrol)
  1221. {
  1222. struct coeff_ram_ctl *ctl =
  1223. (struct coeff_ram_ctl *)kcontrol->private_value;
  1224. struct soc_bytes_ext *params = &ctl->bytes_ext;
  1225. ucontrol->type = SNDRV_CTL_ELEM_TYPE_BYTES;
  1226. ucontrol->count = params->max;
  1227. return 0;
  1228. }
  1229. /* CH 0_1 Input Mux */
  1230. static char const * const ch_0_1_mux_txt[] = {"DAI 1", "TDM 0_1"};
  1231. static struct soc_enum const ch_0_1_mux_enum =
  1232. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
  1233. ARRAY_SIZE(ch_0_1_mux_txt), ch_0_1_mux_txt);
  1234. static struct snd_kcontrol_new const ch_0_1_mux_dapm_enum =
  1235. SOC_DAPM_ENUM("CH 0_1 Input Mux", ch_0_1_mux_enum);
  1236. /* CH 2_3 Input Mux */
  1237. static char const * const ch_2_3_mux_txt[] = {"DAI 2", "TDM 2_3"};
  1238. static struct soc_enum const ch_2_3_mux_enum =
  1239. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
  1240. ARRAY_SIZE(ch_2_3_mux_txt), ch_2_3_mux_txt);
  1241. static struct snd_kcontrol_new const ch_2_3_mux_dapm_enum =
  1242. SOC_DAPM_ENUM("CH 2_3 Input Mux", ch_2_3_mux_enum);
  1243. /* CH 4_5 Input Mux */
  1244. static char const * const ch_4_5_mux_txt[] = {"DAI 3", "TDM 4_5"};
  1245. static struct soc_enum const ch_4_5_mux_enum =
  1246. SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
  1247. ARRAY_SIZE(ch_4_5_mux_txt), ch_4_5_mux_txt);
  1248. static struct snd_kcontrol_new const ch_4_5_mux_dapm_enum =
  1249. SOC_DAPM_ENUM("CH 4_5 Input Mux", ch_4_5_mux_enum);
  1250. #define COEFF_RAM_CTL(xname, xcount, xaddr) \
  1251. { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  1252. .info = bytes_info_ext, \
  1253. .get = coeff_ram_get, .put = coeff_ram_put, \
  1254. .private_value = (unsigned long)&(struct coeff_ram_ctl) { \
  1255. .addr = xaddr, \
  1256. .bytes_ext = {.max = xcount, }, \
  1257. } \
  1258. }
  1259. static struct snd_kcontrol_new const tscs454_snd_controls[] = {
  1260. /* R_PLLCTL PG 0 ADDR 0x15 */
  1261. SOC_ENUM("PLL BCLK Input", bclk_sel_enum),
  1262. /* R_ISRC PG 0 ADDR 0x16 */
  1263. SOC_ENUM("Internal Rate", isrc_br_enum),
  1264. SOC_ENUM("Internal Rate Multiple", isrc_bm_enum),
  1265. /* R_SCLKCTL PG 0 ADDR 0x18 */
  1266. SOC_ENUM("ADC Modular Rate", adc_modular_rate_enum),
  1267. SOC_ENUM("DAC Modular Rate", dac_modular_rate_enum),
  1268. /* R_ASRC PG 0 ADDR 0x28 */
  1269. SOC_SINGLE("ASRC Out High Bandwidth Switch",
  1270. R_ASRC, FB_ASRC_ASRCOBW, 1, 0),
  1271. SOC_SINGLE("ASRC In High Bandwidth Switch",
  1272. R_ASRC, FB_ASRC_ASRCIBW, 1, 0),
  1273. /* R_I2SIDCTL PG 0 ADDR 0x38 */
  1274. SOC_ENUM("I2S 1 Data In Control", data_in_ctrl_enums[0]),
  1275. SOC_ENUM("I2S 2 Data In Control", data_in_ctrl_enums[1]),
  1276. SOC_ENUM("I2S 3 Data In Control", data_in_ctrl_enums[2]),
  1277. /* R_I2SODCTL PG 0 ADDR 0x39 */
  1278. SOC_ENUM("I2S 1 Data Out Control", data_out_ctrl_enums[0]),
  1279. SOC_ENUM("I2S 2 Data Out Control", data_out_ctrl_enums[1]),
  1280. SOC_ENUM("I2S 3 Data Out Control", data_out_ctrl_enums[2]),
  1281. /* R_AUDIOMUX1 PG 0 ADDR 0x3A */
  1282. SOC_ENUM("ASRC In", asrc_in_mux_enum),
  1283. /* R_AUDIOMUX2 PG 0 ADDR 0x3B */
  1284. SOC_ENUM("ASRC Out", asrc_out_mux_enum),
  1285. /* R_HSDCTL1 PG 1 ADDR 0x01 */
  1286. SOC_ENUM("Headphone Jack Type", hp_jack_type_enum),
  1287. SOC_ENUM("Headset Detection Polarity", hs_det_pol_enum),
  1288. SOC_SINGLE("Headphone Detection Switch",
  1289. R_HSDCTL1, FB_HSDCTL1_HPID_EN, 1, 0),
  1290. SOC_SINGLE("Headset OMTP/CTIA Switch",
  1291. R_HSDCTL1, FB_HSDCTL1_GBLHS_EN, 1, 0),
  1292. /* R_HSDCTL1 PG 1 ADDR 0x02 */
  1293. SOC_ENUM("Headset Mic Bias Force", hs_mic_bias_force_enum),
  1294. SOC_SINGLE("Manual Mic Bias Switch",
  1295. R_HSDCTL2, FB_HSDCTL2_MB1MODE, 1, 0),
  1296. SOC_SINGLE("Ring/Sleeve Auto Switch",
  1297. R_HSDCTL2, FB_HSDCTL2_SWMODE, 1, 0),
  1298. SOC_ENUM("Manual Mode Plug Type", plug_type_force_enum),
  1299. /* R_CH0AIC PG 1 ADDR 0x06 */
  1300. SOC_SINGLE_TLV("Input Boost Channel 0 Volume", R_CH0AIC,
  1301. FB_CHAIC_MICBST, 0x3, 0, in_bst_vol_tlv_arr),
  1302. /* R_CH1AIC PG 1 ADDR 0x07 */
  1303. SOC_SINGLE_TLV("Input Boost Channel 1 Volume", R_CH1AIC,
  1304. FB_CHAIC_MICBST, 0x3, 0, in_bst_vol_tlv_arr),
  1305. /* R_CH2AIC PG 1 ADDR 0x08 */
  1306. SOC_SINGLE_TLV("Input Boost Channel 2 Volume", R_CH2AIC,
  1307. FB_CHAIC_MICBST, 0x3, 0, in_bst_vol_tlv_arr),
  1308. /* R_CH3AIC PG 1 ADDR 0x09 */
  1309. SOC_SINGLE_TLV("Input Boost Channel 3 Volume", R_CH3AIC,
  1310. FB_CHAIC_MICBST, 0x3, 0, in_bst_vol_tlv_arr),
  1311. /* R_ICTL0 PG 1 ADDR 0x0A */
  1312. SOC_ENUM("Input Channel 1 Polarity", in_pol_ch1_enum),
  1313. SOC_ENUM("Input Channel 0 Polarity", in_pol_ch0_enum),
  1314. SOC_ENUM("Input Processor Channel 0/1 Operation",
  1315. in_proc_ch01_sel_enum),
  1316. SOC_SINGLE("Input Channel 1 Mute Switch",
  1317. R_ICTL0, FB_ICTL0_IN1MUTE, 1, 0),
  1318. SOC_SINGLE("Input Channel 0 Mute Switch",
  1319. R_ICTL0, FB_ICTL0_IN0MUTE, 1, 0),
  1320. SOC_SINGLE("Input Channel 1 HPF Disable Switch",
  1321. R_ICTL0, FB_ICTL0_IN1HP, 1, 0),
  1322. SOC_SINGLE("Input Channel 0 HPF Disable Switch",
  1323. R_ICTL0, FB_ICTL0_IN0HP, 1, 0),
  1324. /* R_ICTL1 PG 1 ADDR 0x0B */
  1325. SOC_ENUM("Input Channel 3 Polarity", in_pol_ch3_enum),
  1326. SOC_ENUM("Input Channel 2 Polarity", in_pol_ch2_enum),
  1327. SOC_ENUM("Input Processor Channel 2/3 Operation",
  1328. in_proc_ch23_sel_enum),
  1329. SOC_SINGLE("Input Channel 3 Mute Switch",
  1330. R_ICTL1, FB_ICTL1_IN3MUTE, 1, 0),
  1331. SOC_SINGLE("Input Channel 2 Mute Switch",
  1332. R_ICTL1, FB_ICTL1_IN2MUTE, 1, 0),
  1333. SOC_SINGLE("Input Channel 3 HPF Disable Switch",
  1334. R_ICTL1, FB_ICTL1_IN3HP, 1, 0),
  1335. SOC_SINGLE("Input Channel 2 HPF Disable Switch",
  1336. R_ICTL1, FB_ICTL1_IN2HP, 1, 0),
  1337. /* R_MICBIAS PG 1 ADDR 0x0C */
  1338. SOC_ENUM("Mic Bias 2 Voltage", mic_bias_2_enum),
  1339. SOC_ENUM("Mic Bias 1 Voltage", mic_bias_1_enum),
  1340. /* R_PGACTL0 PG 1 ADDR 0x0D */
  1341. SOC_SINGLE("Input Channel 0 PGA Mute Switch",
  1342. R_PGACTL0, FB_PGACTL_PGAMUTE, 1, 0),
  1343. SOC_SINGLE_TLV("Input Channel 0 PGA Volume", R_PGACTL0,
  1344. FB_PGACTL_PGAVOL,
  1345. FM_PGACTL_PGAVOL, 0, in_pga_vol_tlv_arr),
  1346. /* R_PGACTL1 PG 1 ADDR 0x0E */
  1347. SOC_SINGLE("Input Channel 1 PGA Mute Switch",
  1348. R_PGACTL1, FB_PGACTL_PGAMUTE, 1, 0),
  1349. SOC_SINGLE_TLV("Input Channel 1 PGA Volume", R_PGACTL1,
  1350. FB_PGACTL_PGAVOL,
  1351. FM_PGACTL_PGAVOL, 0, in_pga_vol_tlv_arr),
  1352. /* R_PGACTL2 PG 1 ADDR 0x0F */
  1353. SOC_SINGLE("Input Channel 2 PGA Mute Switch",
  1354. R_PGACTL2, FB_PGACTL_PGAMUTE, 1, 0),
  1355. SOC_SINGLE_TLV("Input Channel 2 PGA Volume", R_PGACTL2,
  1356. FB_PGACTL_PGAVOL,
  1357. FM_PGACTL_PGAVOL, 0, in_pga_vol_tlv_arr),
  1358. /* R_PGACTL3 PG 1 ADDR 0x10 */
  1359. SOC_SINGLE("Input Channel 3 PGA Mute Switch",
  1360. R_PGACTL3, FB_PGACTL_PGAMUTE, 1, 0),
  1361. SOC_SINGLE_TLV("Input Channel 3 PGA Volume", R_PGACTL3,
  1362. FB_PGACTL_PGAVOL,
  1363. FM_PGACTL_PGAVOL, 0, in_pga_vol_tlv_arr),
  1364. /* R_ICH0VOL PG 1 ADDR 0x12 */
  1365. SOC_SINGLE_TLV("Input Channel 0 Volume", R_ICH0VOL,
  1366. FB_ICHVOL_ICHVOL, FM_ICHVOL_ICHVOL, 0, in_vol_tlv_arr),
  1367. /* R_ICH1VOL PG 1 ADDR 0x13 */
  1368. SOC_SINGLE_TLV("Input Channel 1 Volume", R_ICH1VOL,
  1369. FB_ICHVOL_ICHVOL, FM_ICHVOL_ICHVOL, 0, in_vol_tlv_arr),
  1370. /* R_ICH2VOL PG 1 ADDR 0x14 */
  1371. SOC_SINGLE_TLV("Input Channel 2 Volume", R_ICH2VOL,
  1372. FB_ICHVOL_ICHVOL, FM_ICHVOL_ICHVOL, 0, in_vol_tlv_arr),
  1373. /* R_ICH3VOL PG 1 ADDR 0x15 */
  1374. SOC_SINGLE_TLV("Input Channel 3 Volume", R_ICH3VOL,
  1375. FB_ICHVOL_ICHVOL, FM_ICHVOL_ICHVOL, 0, in_vol_tlv_arr),
  1376. /* R_ASRCILVOL PG 1 ADDR 0x16 */
  1377. SOC_SINGLE_TLV("ASRC Input Left Volume", R_ASRCILVOL,
  1378. FB_ASRCILVOL_ASRCILVOL, FM_ASRCILVOL_ASRCILVOL,
  1379. 0, asrc_vol_tlv_arr),
  1380. /* R_ASRCIRVOL PG 1 ADDR 0x17 */
  1381. SOC_SINGLE_TLV("ASRC Input Right Volume", R_ASRCIRVOL,
  1382. FB_ASRCIRVOL_ASRCIRVOL, FM_ASRCIRVOL_ASRCIRVOL,
  1383. 0, asrc_vol_tlv_arr),
  1384. /* R_ASRCOLVOL PG 1 ADDR 0x18 */
  1385. SOC_SINGLE_TLV("ASRC Output Left Volume", R_ASRCOLVOL,
  1386. FB_ASRCOLVOL_ASRCOLVOL, FM_ASRCOLVOL_ASRCOLVOL,
  1387. 0, asrc_vol_tlv_arr),
  1388. /* R_ASRCORVOL PG 1 ADDR 0x19 */
  1389. SOC_SINGLE_TLV("ASRC Output Right Volume", R_ASRCORVOL,
  1390. FB_ASRCORVOL_ASRCOLVOL, FM_ASRCORVOL_ASRCOLVOL,
  1391. 0, asrc_vol_tlv_arr),
  1392. /* R_IVOLCTLU PG 1 ADDR 0x1C */
  1393. /* R_ALCCTL0 PG 1 ADDR 0x1D */
  1394. SOC_ENUM("ALC Mode", alc_mode_enum),
  1395. SOC_ENUM("ALC Reference", alc_ref_enum),
  1396. SOC_SINGLE("Input Channel 3 ALC Switch",
  1397. R_ALCCTL0, FB_ALCCTL0_ALCEN3, 1, 0),
  1398. SOC_SINGLE("Input Channel 2 ALC Switch",
  1399. R_ALCCTL0, FB_ALCCTL0_ALCEN2, 1, 0),
  1400. SOC_SINGLE("Input Channel 1 ALC Switch",
  1401. R_ALCCTL0, FB_ALCCTL0_ALCEN1, 1, 0),
  1402. SOC_SINGLE("Input Channel 0 ALC Switch",
  1403. R_ALCCTL0, FB_ALCCTL0_ALCEN0, 1, 0),
  1404. /* R_ALCCTL1 PG 1 ADDR 0x1E */
  1405. SOC_SINGLE_TLV("ALC Max Gain Volume", R_ALCCTL1,
  1406. FB_ALCCTL1_MAXGAIN, FM_ALCCTL1_MAXGAIN,
  1407. 0, alc_max_gain_tlv_arr),
  1408. SOC_SINGLE_TLV("ALC Target Volume", R_ALCCTL1,
  1409. FB_ALCCTL1_ALCL, FM_ALCCTL1_ALCL,
  1410. 0, alc_target_tlv_arr),
  1411. /* R_ALCCTL2 PG 1 ADDR 0x1F */
  1412. SOC_SINGLE("ALC Zero Cross Switch",
  1413. R_ALCCTL2, FB_ALCCTL2_ALCZC, 1, 0),
  1414. SOC_SINGLE_TLV("ALC Min Gain Volume", R_ALCCTL2,
  1415. FB_ALCCTL2_MINGAIN, FM_ALCCTL2_MINGAIN,
  1416. 0, alc_min_gain_tlv_arr),
  1417. SOC_SINGLE_RANGE("ALC Hold", R_ALCCTL2,
  1418. FB_ALCCTL2_HLD, 0, FM_ALCCTL2_HLD, 0),
  1419. /* R_ALCCTL3 PG 1 ADDR 0x20 */
  1420. SOC_SINGLE_RANGE("ALC Decay", R_ALCCTL3,
  1421. FB_ALCCTL3_DCY, 0, FM_ALCCTL3_DCY, 0),
  1422. SOC_SINGLE_RANGE("ALC Attack", R_ALCCTL3,
  1423. FB_ALCCTL3_ATK, 0, FM_ALCCTL3_ATK, 0),
  1424. /* R_NGATE PG 1 ADDR 0x21 */
  1425. SOC_SINGLE_TLV("Noise Gate Threshold Volume", R_NGATE,
  1426. FB_NGATE_NGTH, FM_NGATE_NGTH, 0, ngth_tlv_arr),
  1427. SOC_ENUM("Noise Gate Type", ngate_type_enum),
  1428. SOC_SINGLE("Noise Gate Switch", R_NGATE, FB_NGATE_NGAT, 1, 0),
  1429. /* R_DMICCTL PG 1 ADDR 0x22 */
  1430. SOC_SINGLE("Digital Mic 2 Switch", R_DMICCTL, FB_DMICCTL_DMIC2EN, 1, 0),
  1431. SOC_SINGLE("Digital Mic 1 Switch", R_DMICCTL, FB_DMICCTL_DMIC1EN, 1, 0),
  1432. SOC_ENUM("Digital Mic Mono Select", dmic_mono_sel_enum),
  1433. /* R_DACCTL PG 2 ADDR 0x01 */
  1434. SOC_ENUM("DAC Polarity Left", dac_pol_r_enum),
  1435. SOC_ENUM("DAC Polarity Right", dac_pol_l_enum),
  1436. SOC_ENUM("DAC Dither", dac_dith_enum),
  1437. SOC_SINGLE("DAC Mute Switch", R_DACCTL, FB_DACCTL_DACMUTE, 1, 0),
  1438. SOC_SINGLE("DAC De-Emphasis Switch", R_DACCTL, FB_DACCTL_DACDEM, 1, 0),
  1439. /* R_SPKCTL PG 2 ADDR 0x02 */
  1440. SOC_ENUM("Speaker Polarity Right", spk_pol_r_enum),
  1441. SOC_ENUM("Speaker Polarity Left", spk_pol_l_enum),
  1442. SOC_SINGLE("Speaker Mute Switch", R_SPKCTL, FB_SPKCTL_SPKMUTE, 1, 0),
  1443. SOC_SINGLE("Speaker De-Emphasis Switch",
  1444. R_SPKCTL, FB_SPKCTL_SPKDEM, 1, 0),
  1445. /* R_SUBCTL PG 2 ADDR 0x03 */
  1446. SOC_ENUM("Sub Polarity", sub_pol_enum),
  1447. SOC_SINGLE("SUB Mute Switch", R_SUBCTL, FB_SUBCTL_SUBMUTE, 1, 0),
  1448. SOC_SINGLE("Sub De-Emphasis Switch", R_SUBCTL, FB_SUBCTL_SUBDEM, 1, 0),
  1449. /* R_DCCTL PG 2 ADDR 0x04 */
  1450. SOC_SINGLE("Sub DC Removal Switch", R_DCCTL, FB_DCCTL_SUBDCBYP, 1, 1),
  1451. SOC_SINGLE("DAC DC Removal Switch", R_DCCTL, FB_DCCTL_DACDCBYP, 1, 1),
  1452. SOC_SINGLE("Speaker DC Removal Switch",
  1453. R_DCCTL, FB_DCCTL_SPKDCBYP, 1, 1),
  1454. SOC_SINGLE("DC Removal Coefficient Switch", R_DCCTL, FB_DCCTL_DCCOEFSEL,
  1455. FM_DCCTL_DCCOEFSEL, 0),
  1456. /* R_OVOLCTLU PG 2 ADDR 0x06 */
  1457. SOC_SINGLE("Output Fade Switch", R_OVOLCTLU, FB_OVOLCTLU_OFADE, 1, 0),
  1458. /* R_MVOLL PG 2 ADDR 0x08 */
  1459. /* R_MVOLR PG 2 ADDR 0x09 */
  1460. SOC_DOUBLE_R_TLV("Master Volume", R_MVOLL, R_MVOLR,
  1461. FB_MVOLL_MVOL_L, FM_MVOLL_MVOL_L, 0, mvol_tlv_arr),
  1462. /* R_HPVOLL PG 2 ADDR 0x0A */
  1463. /* R_HPVOLR PG 2 ADDR 0x0B */
  1464. SOC_DOUBLE_R_TLV("Headphone Volume", R_HPVOLL, R_HPVOLR,
  1465. FB_HPVOLL_HPVOL_L, FM_HPVOLL_HPVOL_L, 0,
  1466. hp_vol_tlv_arr),
  1467. /* R_SPKVOLL PG 2 ADDR 0x0C */
  1468. /* R_SPKVOLR PG 2 ADDR 0x0D */
  1469. SOC_DOUBLE_R_TLV("Speaker Volume", R_SPKVOLL, R_SPKVOLR,
  1470. FB_SPKVOLL_SPKVOL_L, FM_SPKVOLL_SPKVOL_L, 0,
  1471. spk_vol_tlv_arr),
  1472. /* R_SUBVOL PG 2 ADDR 0x10 */
  1473. SOC_SINGLE_TLV("Sub Volume", R_SUBVOL,
  1474. FB_SUBVOL_SUBVOL, FM_SUBVOL_SUBVOL, 0, spk_vol_tlv_arr),
  1475. /* R_SPKEQFILT PG 3 ADDR 0x01 */
  1476. SOC_SINGLE("Speaker EQ 2 Switch",
  1477. R_SPKEQFILT, FB_SPKEQFILT_EQ2EN, 1, 0),
  1478. SOC_ENUM("Speaker EQ 2 Band", spk_eq_enums[0]),
  1479. SOC_SINGLE("Speaker EQ 1 Switch",
  1480. R_SPKEQFILT, FB_SPKEQFILT_EQ1EN, 1, 0),
  1481. SOC_ENUM("Speaker EQ 1 Band", spk_eq_enums[1]),
  1482. /* R_SPKMBCEN PG 3 ADDR 0x0A */
  1483. SOC_SINGLE("Speaker MBC 3 Switch",
  1484. R_SPKMBCEN, FB_SPKMBCEN_MBCEN3, 1, 0),
  1485. SOC_SINGLE("Speaker MBC 2 Switch",
  1486. R_SPKMBCEN, FB_SPKMBCEN_MBCEN2, 1, 0),
  1487. SOC_SINGLE("Speaker MBC 1 Switch",
  1488. R_SPKMBCEN, FB_SPKMBCEN_MBCEN1, 1, 0),
  1489. /* R_SPKMBCCTL PG 3 ADDR 0x0B */
  1490. SOC_ENUM("Speaker MBC 3 Mode", spk_mbc3_lvl_det_mode_enum),
  1491. SOC_ENUM("Speaker MBC 3 Window", spk_mbc3_win_sel_enum),
  1492. SOC_ENUM("Speaker MBC 2 Mode", spk_mbc2_lvl_det_mode_enum),
  1493. SOC_ENUM("Speaker MBC 2 Window", spk_mbc2_win_sel_enum),
  1494. SOC_ENUM("Speaker MBC 1 Mode", spk_mbc1_lvl_det_mode_enum),
  1495. SOC_ENUM("Speaker MBC 1 Window", spk_mbc1_win_sel_enum),
  1496. /* R_SPKMBCMUG1 PG 3 ADDR 0x0C */
  1497. SOC_ENUM("Speaker MBC 1 Phase Polarity", spk_mbc1_phase_pol_enum),
  1498. SOC_SINGLE_TLV("Speaker MBC1 Make-Up Gain Volume", R_SPKMBCMUG1,
  1499. FB_SPKMBCMUG_MUGAIN, FM_SPKMBCMUG_MUGAIN,
  1500. 0, mbc_mug_tlv_arr),
  1501. /* R_SPKMBCTHR1 PG 3 ADDR 0x0D */
  1502. SOC_SINGLE_TLV("Speaker MBC 1 Compressor Threshold Volume",
  1503. R_SPKMBCTHR1, FB_SPKMBCTHR_THRESH, FM_SPKMBCTHR_THRESH,
  1504. 0, thr_tlv_arr),
  1505. /* R_SPKMBCRAT1 PG 3 ADDR 0x0E */
  1506. SOC_ENUM("Speaker MBC 1 Compressor Ratio", spk_mbc1_comp_rat_enum),
  1507. /* R_SPKMBCATK1L PG 3 ADDR 0x0F */
  1508. /* R_SPKMBCATK1H PG 3 ADDR 0x10 */
  1509. SND_SOC_BYTES("Speaker MBC 1 Attack", R_SPKMBCATK1L, 2),
  1510. /* R_SPKMBCREL1L PG 3 ADDR 0x11 */
  1511. /* R_SPKMBCREL1H PG 3 ADDR 0x12 */
  1512. SND_SOC_BYTES("Speaker MBC 1 Release", R_SPKMBCREL1L, 2),
  1513. /* R_SPKMBCMUG2 PG 3 ADDR 0x13 */
  1514. SOC_ENUM("Speaker MBC 2 Phase Polarity", spk_mbc2_phase_pol_enum),
  1515. SOC_SINGLE_TLV("Speaker MBC2 Make-Up Gain Volume", R_SPKMBCMUG2,
  1516. FB_SPKMBCMUG_MUGAIN, FM_SPKMBCMUG_MUGAIN,
  1517. 0, mbc_mug_tlv_arr),
  1518. /* R_SPKMBCTHR2 PG 3 ADDR 0x14 */
  1519. SOC_SINGLE_TLV("Speaker MBC 2 Compressor Threshold Volume",
  1520. R_SPKMBCTHR2, FB_SPKMBCTHR_THRESH, FM_SPKMBCTHR_THRESH,
  1521. 0, thr_tlv_arr),
  1522. /* R_SPKMBCRAT2 PG 3 ADDR 0x15 */
  1523. SOC_ENUM("Speaker MBC 2 Compressor Ratio", spk_mbc2_comp_rat_enum),
  1524. /* R_SPKMBCATK2L PG 3 ADDR 0x16 */
  1525. /* R_SPKMBCATK2H PG 3 ADDR 0x17 */
  1526. SND_SOC_BYTES("Speaker MBC 2 Attack", R_SPKMBCATK2L, 2),
  1527. /* R_SPKMBCREL2L PG 3 ADDR 0x18 */
  1528. /* R_SPKMBCREL2H PG 3 ADDR 0x19 */
  1529. SND_SOC_BYTES("Speaker MBC 2 Release", R_SPKMBCREL2L, 2),
  1530. /* R_SPKMBCMUG3 PG 3 ADDR 0x1A */
  1531. SOC_ENUM("Speaker MBC 3 Phase Polarity", spk_mbc3_phase_pol_enum),
  1532. SOC_SINGLE_TLV("Speaker MBC 3 Make-Up Gain Volume", R_SPKMBCMUG3,
  1533. FB_SPKMBCMUG_MUGAIN, FM_SPKMBCMUG_MUGAIN,
  1534. 0, mbc_mug_tlv_arr),
  1535. /* R_SPKMBCTHR3 PG 3 ADDR 0x1B */
  1536. SOC_SINGLE_TLV("Speaker MBC 3 Threshold Volume", R_SPKMBCTHR3,
  1537. FB_SPKMBCTHR_THRESH, FM_SPKMBCTHR_THRESH,
  1538. 0, thr_tlv_arr),
  1539. /* R_SPKMBCRAT3 PG 3 ADDR 0x1C */
  1540. SOC_ENUM("Speaker MBC 3 Compressor Ratio", spk_mbc3_comp_rat_enum),
  1541. /* R_SPKMBCATK3L PG 3 ADDR 0x1D */
  1542. /* R_SPKMBCATK3H PG 3 ADDR 0x1E */
  1543. SND_SOC_BYTES("Speaker MBC 3 Attack", R_SPKMBCATK3L, 3),
  1544. /* R_SPKMBCREL3L PG 3 ADDR 0x1F */
  1545. /* R_SPKMBCREL3H PG 3 ADDR 0x20 */
  1546. SND_SOC_BYTES("Speaker MBC 3 Release", R_SPKMBCREL3L, 3),
  1547. /* R_SPKCLECTL PG 3 ADDR 0x21 */
  1548. SOC_ENUM("Speaker CLE Level Mode", spk_cle_lvl_mode_enum),
  1549. SOC_ENUM("Speaker CLE Window", spk_cle_win_sel_enum),
  1550. SOC_SINGLE("Speaker CLE Expander Switch",
  1551. R_SPKCLECTL, FB_SPKCLECTL_EXPEN, 1, 0),
  1552. SOC_SINGLE("Speaker CLE Limiter Switch",
  1553. R_SPKCLECTL, FB_SPKCLECTL_LIMEN, 1, 0),
  1554. SOC_SINGLE("Speaker CLE Compressor Switch",
  1555. R_SPKCLECTL, FB_SPKCLECTL_COMPEN, 1, 0),
  1556. /* R_SPKCLEMUG PG 3 ADDR 0x22 */
  1557. SOC_SINGLE_TLV("Speaker CLE Make-Up Gain Volume", R_SPKCLEMUG,
  1558. FB_SPKCLEMUG_MUGAIN, FM_SPKCLEMUG_MUGAIN,
  1559. 0, cle_mug_tlv_arr),
  1560. /* R_SPKCOMPTHR PG 3 ADDR 0x23 */
  1561. SOC_SINGLE_TLV("Speaker Compressor Threshold Volume", R_SPKCOMPTHR,
  1562. FB_SPKCOMPTHR_THRESH, FM_SPKCOMPTHR_THRESH,
  1563. 0, thr_tlv_arr),
  1564. /* R_SPKCOMPRAT PG 3 ADDR 0x24 */
  1565. SOC_ENUM("Speaker Compressor Ratio", spk_comp_rat_enum),
  1566. /* R_SPKCOMPATKL PG 3 ADDR 0x25 */
  1567. /* R_SPKCOMPATKH PG 3 ADDR 0x26 */
  1568. SND_SOC_BYTES("Speaker Compressor Attack", R_SPKCOMPATKL, 2),
  1569. /* R_SPKCOMPRELL PG 3 ADDR 0x27 */
  1570. /* R_SPKCOMPRELH PG 3 ADDR 0x28 */
  1571. SND_SOC_BYTES("Speaker Compressor Release", R_SPKCOMPRELL, 2),
  1572. /* R_SPKLIMTHR PG 3 ADDR 0x29 */
  1573. SOC_SINGLE_TLV("Speaker Limiter Threshold Volume", R_SPKLIMTHR,
  1574. FB_SPKLIMTHR_THRESH, FM_SPKLIMTHR_THRESH,
  1575. 0, thr_tlv_arr),
  1576. /* R_SPKLIMTGT PG 3 ADDR 0x2A */
  1577. SOC_SINGLE_TLV("Speaker Limiter Target Volume", R_SPKLIMTGT,
  1578. FB_SPKLIMTGT_TARGET, FM_SPKLIMTGT_TARGET,
  1579. 0, thr_tlv_arr),
  1580. /* R_SPKLIMATKL PG 3 ADDR 0x2B */
  1581. /* R_SPKLIMATKH PG 3 ADDR 0x2C */
  1582. SND_SOC_BYTES("Speaker Limiter Attack", R_SPKLIMATKL, 2),
  1583. /* R_SPKLIMRELL PG 3 ADDR 0x2D */
  1584. /* R_SPKLIMRELR PG 3 ADDR 0x2E */
  1585. SND_SOC_BYTES("Speaker Limiter Release", R_SPKLIMRELL, 2),
  1586. /* R_SPKEXPTHR PG 3 ADDR 0x2F */
  1587. SOC_SINGLE_TLV("Speaker Expander Threshold Volume", R_SPKEXPTHR,
  1588. FB_SPKEXPTHR_THRESH, FM_SPKEXPTHR_THRESH,
  1589. 0, thr_tlv_arr),
  1590. /* R_SPKEXPRAT PG 3 ADDR 0x30 */
  1591. SOC_ENUM("Speaker Expander Ratio", spk_exp_rat_enum),
  1592. /* R_SPKEXPATKL PG 3 ADDR 0x31 */
  1593. /* R_SPKEXPATKR PG 3 ADDR 0x32 */
  1594. SND_SOC_BYTES("Speaker Expander Attack", R_SPKEXPATKL, 2),
  1595. /* R_SPKEXPRELL PG 3 ADDR 0x33 */
  1596. /* R_SPKEXPRELR PG 3 ADDR 0x34 */
  1597. SND_SOC_BYTES("Speaker Expander Release", R_SPKEXPRELL, 2),
  1598. /* R_SPKFXCTL PG 3 ADDR 0x35 */
  1599. SOC_SINGLE("Speaker 3D Switch", R_SPKFXCTL, FB_SPKFXCTL_3DEN, 1, 0),
  1600. SOC_SINGLE("Speaker Treble Enhancement Switch",
  1601. R_SPKFXCTL, FB_SPKFXCTL_TEEN, 1, 0),
  1602. SOC_SINGLE("Speaker Treble NLF Switch",
  1603. R_SPKFXCTL, FB_SPKFXCTL_TNLFBYP, 1, 1),
  1604. SOC_SINGLE("Speaker Bass Enhancement Switch",
  1605. R_SPKFXCTL, FB_SPKFXCTL_BEEN, 1, 0),
  1606. SOC_SINGLE("Speaker Bass NLF Switch",
  1607. R_SPKFXCTL, FB_SPKFXCTL_BNLFBYP, 1, 1),
  1608. /* R_DACEQFILT PG 4 ADDR 0x01 */
  1609. SOC_SINGLE("DAC EQ 2 Switch",
  1610. R_DACEQFILT, FB_DACEQFILT_EQ2EN, 1, 0),
  1611. SOC_ENUM("DAC EQ 2 Band", dac_eq_enums[0]),
  1612. SOC_SINGLE("DAC EQ 1 Switch", R_DACEQFILT, FB_DACEQFILT_EQ1EN, 1, 0),
  1613. SOC_ENUM("DAC EQ 1 Band", dac_eq_enums[1]),
  1614. /* R_DACMBCEN PG 4 ADDR 0x0A */
  1615. SOC_SINGLE("DAC MBC 3 Switch", R_DACMBCEN, FB_DACMBCEN_MBCEN3, 1, 0),
  1616. SOC_SINGLE("DAC MBC 2 Switch", R_DACMBCEN, FB_DACMBCEN_MBCEN2, 1, 0),
  1617. SOC_SINGLE("DAC MBC 1 Switch", R_DACMBCEN, FB_DACMBCEN_MBCEN1, 1, 0),
  1618. /* R_DACMBCCTL PG 4 ADDR 0x0B */
  1619. SOC_ENUM("DAC MBC 3 Mode", dac_mbc3_lvl_det_mode_enum),
  1620. SOC_ENUM("DAC MBC 3 Window", dac_mbc3_win_sel_enum),
  1621. SOC_ENUM("DAC MBC 2 Mode", dac_mbc2_lvl_det_mode_enum),
  1622. SOC_ENUM("DAC MBC 2 Window", dac_mbc2_win_sel_enum),
  1623. SOC_ENUM("DAC MBC 1 Mode", dac_mbc1_lvl_det_mode_enum),
  1624. SOC_ENUM("DAC MBC 1 Window", dac_mbc1_win_sel_enum),
  1625. /* R_DACMBCMUG1 PG 4 ADDR 0x0C */
  1626. SOC_ENUM("DAC MBC 1 Phase Polarity", dac_mbc1_phase_pol_enum),
  1627. SOC_SINGLE_TLV("DAC MBC 1 Make-Up Gain Volume", R_DACMBCMUG1,
  1628. FB_DACMBCMUG_MUGAIN, FM_DACMBCMUG_MUGAIN,
  1629. 0, mbc_mug_tlv_arr),
  1630. /* R_DACMBCTHR1 PG 4 ADDR 0x0D */
  1631. SOC_SINGLE_TLV("DAC MBC 1 Compressor Threshold Volume", R_DACMBCTHR1,
  1632. FB_DACMBCTHR_THRESH, FM_DACMBCTHR_THRESH,
  1633. 0, thr_tlv_arr),
  1634. /* R_DACMBCRAT1 PG 4 ADDR 0x0E */
  1635. SOC_ENUM("DAC MBC 1 Compressor Ratio", dac_mbc1_comp_rat_enum),
  1636. /* R_DACMBCATK1L PG 4 ADDR 0x0F */
  1637. /* R_DACMBCATK1H PG 4 ADDR 0x10 */
  1638. SND_SOC_BYTES("DAC MBC 1 Attack", R_DACMBCATK1L, 2),
  1639. /* R_DACMBCREL1L PG 4 ADDR 0x11 */
  1640. /* R_DACMBCREL1H PG 4 ADDR 0x12 */
  1641. SND_SOC_BYTES("DAC MBC 1 Release", R_DACMBCREL1L, 2),
  1642. /* R_DACMBCMUG2 PG 4 ADDR 0x13 */
  1643. SOC_ENUM("DAC MBC 2 Phase Polarity", dac_mbc2_phase_pol_enum),
  1644. SOC_SINGLE_TLV("DAC MBC 2 Make-Up Gain Volume", R_DACMBCMUG2,
  1645. FB_DACMBCMUG_MUGAIN, FM_DACMBCMUG_MUGAIN,
  1646. 0, mbc_mug_tlv_arr),
  1647. /* R_DACMBCTHR2 PG 4 ADDR 0x14 */
  1648. SOC_SINGLE_TLV("DAC MBC 2 Compressor Threshold Volume", R_DACMBCTHR2,
  1649. FB_DACMBCTHR_THRESH, FM_DACMBCTHR_THRESH,
  1650. 0, thr_tlv_arr),
  1651. /* R_DACMBCRAT2 PG 4 ADDR 0x15 */
  1652. SOC_ENUM("DAC MBC 2 Compressor Ratio", dac_mbc2_comp_rat_enum),
  1653. /* R_DACMBCATK2L PG 4 ADDR 0x16 */
  1654. /* R_DACMBCATK2H PG 4 ADDR 0x17 */
  1655. SND_SOC_BYTES("DAC MBC 2 Attack", R_DACMBCATK2L, 2),
  1656. /* R_DACMBCREL2L PG 4 ADDR 0x18 */
  1657. /* R_DACMBCREL2H PG 4 ADDR 0x19 */
  1658. SND_SOC_BYTES("DAC MBC 2 Release", R_DACMBCREL2L, 2),
  1659. /* R_DACMBCMUG3 PG 4 ADDR 0x1A */
  1660. SOC_ENUM("DAC MBC 3 Phase Polarity", dac_mbc3_phase_pol_enum),
  1661. SOC_SINGLE_TLV("DAC MBC 3 Make-Up Gain Volume", R_DACMBCMUG3,
  1662. FB_DACMBCMUG_MUGAIN, FM_DACMBCMUG_MUGAIN,
  1663. 0, mbc_mug_tlv_arr),
  1664. /* R_DACMBCTHR3 PG 4 ADDR 0x1B */
  1665. SOC_SINGLE_TLV("DAC MBC 3 Threshold Volume", R_DACMBCTHR3,
  1666. FB_DACMBCTHR_THRESH, FM_DACMBCTHR_THRESH,
  1667. 0, thr_tlv_arr),
  1668. /* R_DACMBCRAT3 PG 4 ADDR 0x1C */
  1669. SOC_ENUM("DAC MBC 3 Compressor Ratio", dac_mbc3_comp_rat_enum),
  1670. /* R_DACMBCATK3L PG 4 ADDR 0x1D */
  1671. /* R_DACMBCATK3H PG 4 ADDR 0x1E */
  1672. SND_SOC_BYTES("DAC MBC 3 Attack", R_DACMBCATK3L, 3),
  1673. /* R_DACMBCREL3L PG 4 ADDR 0x1F */
  1674. /* R_DACMBCREL3H PG 4 ADDR 0x20 */
  1675. SND_SOC_BYTES("DAC MBC 3 Release", R_DACMBCREL3L, 3),
  1676. /* R_DACCLECTL PG 4 ADDR 0x21 */
  1677. SOC_ENUM("DAC CLE Level Mode", dac_cle_lvl_mode_enum),
  1678. SOC_ENUM("DAC CLE Window", dac_cle_win_sel_enum),
  1679. SOC_SINGLE("DAC CLE Expander Switch",
  1680. R_DACCLECTL, FB_DACCLECTL_EXPEN, 1, 0),
  1681. SOC_SINGLE("DAC CLE Limiter Switch",
  1682. R_DACCLECTL, FB_DACCLECTL_LIMEN, 1, 0),
  1683. SOC_SINGLE("DAC CLE Compressor Switch",
  1684. R_DACCLECTL, FB_DACCLECTL_COMPEN, 1, 0),
  1685. /* R_DACCLEMUG PG 4 ADDR 0x22 */
  1686. SOC_SINGLE_TLV("DAC CLE Make-Up Gain Volume", R_DACCLEMUG,
  1687. FB_DACCLEMUG_MUGAIN, FM_DACCLEMUG_MUGAIN,
  1688. 0, cle_mug_tlv_arr),
  1689. /* R_DACCOMPTHR PG 4 ADDR 0x23 */
  1690. SOC_SINGLE_TLV("DAC Compressor Threshold Volume", R_DACCOMPTHR,
  1691. FB_DACCOMPTHR_THRESH, FM_DACCOMPTHR_THRESH,
  1692. 0, thr_tlv_arr),
  1693. /* R_DACCOMPRAT PG 4 ADDR 0x24 */
  1694. SOC_ENUM("DAC Compressor Ratio", dac_comp_rat_enum),
  1695. /* R_DACCOMPATKL PG 4 ADDR 0x25 */
  1696. /* R_DACCOMPATKH PG 4 ADDR 0x26 */
  1697. SND_SOC_BYTES("DAC Compressor Attack", R_DACCOMPATKL, 2),
  1698. /* R_DACCOMPRELL PG 4 ADDR 0x27 */
  1699. /* R_DACCOMPRELH PG 4 ADDR 0x28 */
  1700. SND_SOC_BYTES("DAC Compressor Release", R_DACCOMPRELL, 2),
  1701. /* R_DACLIMTHR PG 4 ADDR 0x29 */
  1702. SOC_SINGLE_TLV("DAC Limiter Threshold Volume", R_DACLIMTHR,
  1703. FB_DACLIMTHR_THRESH, FM_DACLIMTHR_THRESH,
  1704. 0, thr_tlv_arr),
  1705. /* R_DACLIMTGT PG 4 ADDR 0x2A */
  1706. SOC_SINGLE_TLV("DAC Limiter Target Volume", R_DACLIMTGT,
  1707. FB_DACLIMTGT_TARGET, FM_DACLIMTGT_TARGET,
  1708. 0, thr_tlv_arr),
  1709. /* R_DACLIMATKL PG 4 ADDR 0x2B */
  1710. /* R_DACLIMATKH PG 4 ADDR 0x2C */
  1711. SND_SOC_BYTES("DAC Limiter Attack", R_DACLIMATKL, 2),
  1712. /* R_DACLIMRELL PG 4 ADDR 0x2D */
  1713. /* R_DACLIMRELR PG 4 ADDR 0x2E */
  1714. SND_SOC_BYTES("DAC Limiter Release", R_DACLIMRELL, 2),
  1715. /* R_DACEXPTHR PG 4 ADDR 0x2F */
  1716. SOC_SINGLE_TLV("DAC Expander Threshold Volume", R_DACEXPTHR,
  1717. FB_DACEXPTHR_THRESH, FM_DACEXPTHR_THRESH,
  1718. 0, thr_tlv_arr),
  1719. /* R_DACEXPRAT PG 4 ADDR 0x30 */
  1720. SOC_ENUM("DAC Expander Ratio", dac_exp_rat_enum),
  1721. /* R_DACEXPATKL PG 4 ADDR 0x31 */
  1722. /* R_DACEXPATKR PG 4 ADDR 0x32 */
  1723. SND_SOC_BYTES("DAC Expander Attack", R_DACEXPATKL, 2),
  1724. /* R_DACEXPRELL PG 4 ADDR 0x33 */
  1725. /* R_DACEXPRELR PG 4 ADDR 0x34 */
  1726. SND_SOC_BYTES("DAC Expander Release", R_DACEXPRELL, 2),
  1727. /* R_DACFXCTL PG 4 ADDR 0x35 */
  1728. SOC_SINGLE("DAC 3D Switch", R_DACFXCTL, FB_DACFXCTL_3DEN, 1, 0),
  1729. SOC_SINGLE("DAC Treble Enhancement Switch",
  1730. R_DACFXCTL, FB_DACFXCTL_TEEN, 1, 0),
  1731. SOC_SINGLE("DAC Treble NLF Switch",
  1732. R_DACFXCTL, FB_DACFXCTL_TNLFBYP, 1, 1),
  1733. SOC_SINGLE("DAC Bass Enhancement Switch",
  1734. R_DACFXCTL, FB_DACFXCTL_BEEN, 1, 0),
  1735. SOC_SINGLE("DAC Bass NLF Switch",
  1736. R_DACFXCTL, FB_DACFXCTL_BNLFBYP, 1, 1),
  1737. /* R_SUBEQFILT PG 5 ADDR 0x01 */
  1738. SOC_SINGLE("Sub EQ 2 Switch",
  1739. R_SUBEQFILT, FB_SUBEQFILT_EQ2EN, 1, 0),
  1740. SOC_ENUM("Sub EQ 2 Band", sub_eq_enums[0]),
  1741. SOC_SINGLE("Sub EQ 1 Switch", R_SUBEQFILT, FB_SUBEQFILT_EQ1EN, 1, 0),
  1742. SOC_ENUM("Sub EQ 1 Band", sub_eq_enums[1]),
  1743. /* R_SUBMBCEN PG 5 ADDR 0x0A */
  1744. SOC_SINGLE("Sub MBC 3 Switch", R_SUBMBCEN, FB_SUBMBCEN_MBCEN3, 1, 0),
  1745. SOC_SINGLE("Sub MBC 2 Switch", R_SUBMBCEN, FB_SUBMBCEN_MBCEN2, 1, 0),
  1746. SOC_SINGLE("Sub MBC 1 Switch", R_SUBMBCEN, FB_SUBMBCEN_MBCEN1, 1, 0),
  1747. /* R_SUBMBCCTL PG 5 ADDR 0x0B */
  1748. SOC_ENUM("Sub MBC 3 Mode", sub_mbc3_lvl_det_mode_enum),
  1749. SOC_ENUM("Sub MBC 3 Window", sub_mbc3_win_sel_enum),
  1750. SOC_ENUM("Sub MBC 2 Mode", sub_mbc2_lvl_det_mode_enum),
  1751. SOC_ENUM("Sub MBC 2 Window", sub_mbc2_win_sel_enum),
  1752. SOC_ENUM("Sub MBC 1 Mode", sub_mbc1_lvl_det_mode_enum),
  1753. SOC_ENUM("Sub MBC 1 Window", sub_mbc1_win_sel_enum),
  1754. /* R_SUBMBCMUG1 PG 5 ADDR 0x0C */
  1755. SOC_ENUM("Sub MBC 1 Phase Polarity", sub_mbc1_phase_pol_enum),
  1756. SOC_SINGLE_TLV("Sub MBC 1 Make-Up Gain Volume", R_SUBMBCMUG1,
  1757. FB_SUBMBCMUG_MUGAIN, FM_SUBMBCMUG_MUGAIN,
  1758. 0, mbc_mug_tlv_arr),
  1759. /* R_SUBMBCTHR1 PG 5 ADDR 0x0D */
  1760. SOC_SINGLE_TLV("Sub MBC 1 Compressor Threshold Volume", R_SUBMBCTHR1,
  1761. FB_SUBMBCTHR_THRESH, FM_SUBMBCTHR_THRESH,
  1762. 0, thr_tlv_arr),
  1763. /* R_SUBMBCRAT1 PG 5 ADDR 0x0E */
  1764. SOC_ENUM("Sub MBC 1 Compressor Ratio", sub_mbc1_comp_rat_enum),
  1765. /* R_SUBMBCATK1L PG 5 ADDR 0x0F */
  1766. /* R_SUBMBCATK1H PG 5 ADDR 0x10 */
  1767. SND_SOC_BYTES("Sub MBC 1 Attack", R_SUBMBCATK1L, 2),
  1768. /* R_SUBMBCREL1L PG 5 ADDR 0x11 */
  1769. /* R_SUBMBCREL1H PG 5 ADDR 0x12 */
  1770. SND_SOC_BYTES("Sub MBC 1 Release", R_SUBMBCREL1L, 2),
  1771. /* R_SUBMBCMUG2 PG 5 ADDR 0x13 */
  1772. SOC_ENUM("Sub MBC 2 Phase Polarity", sub_mbc2_phase_pol_enum),
  1773. SOC_SINGLE_TLV("Sub MBC 2 Make-Up Gain Volume", R_SUBMBCMUG2,
  1774. FB_SUBMBCMUG_MUGAIN, FM_SUBMBCMUG_MUGAIN,
  1775. 0, mbc_mug_tlv_arr),
  1776. /* R_SUBMBCTHR2 PG 5 ADDR 0x14 */
  1777. SOC_SINGLE_TLV("Sub MBC 2 Compressor Threshold Volume", R_SUBMBCTHR2,
  1778. FB_SUBMBCTHR_THRESH, FM_SUBMBCTHR_THRESH,
  1779. 0, thr_tlv_arr),
  1780. /* R_SUBMBCRAT2 PG 5 ADDR 0x15 */
  1781. SOC_ENUM("Sub MBC 2 Compressor Ratio", sub_mbc2_comp_rat_enum),
  1782. /* R_SUBMBCATK2L PG 5 ADDR 0x16 */
  1783. /* R_SUBMBCATK2H PG 5 ADDR 0x17 */
  1784. SND_SOC_BYTES("Sub MBC 2 Attack", R_SUBMBCATK2L, 2),
  1785. /* R_SUBMBCREL2L PG 5 ADDR 0x18 */
  1786. /* R_SUBMBCREL2H PG 5 ADDR 0x19 */
  1787. SND_SOC_BYTES("Sub MBC 2 Release", R_SUBMBCREL2L, 2),
  1788. /* R_SUBMBCMUG3 PG 5 ADDR 0x1A */
  1789. SOC_ENUM("Sub MBC 3 Phase Polarity", sub_mbc3_phase_pol_enum),
  1790. SOC_SINGLE_TLV("Sub MBC 3 Make-Up Gain Volume", R_SUBMBCMUG3,
  1791. FB_SUBMBCMUG_MUGAIN, FM_SUBMBCMUG_MUGAIN,
  1792. 0, mbc_mug_tlv_arr),
  1793. /* R_SUBMBCTHR3 PG 5 ADDR 0x1B */
  1794. SOC_SINGLE_TLV("Sub MBC 3 Threshold Volume", R_SUBMBCTHR3,
  1795. FB_SUBMBCTHR_THRESH, FM_SUBMBCTHR_THRESH,
  1796. 0, thr_tlv_arr),
  1797. /* R_SUBMBCRAT3 PG 5 ADDR 0x1C */
  1798. SOC_ENUM("Sub MBC 3 Compressor Ratio", sub_mbc3_comp_rat_enum),
  1799. /* R_SUBMBCATK3L PG 5 ADDR 0x1D */
  1800. /* R_SUBMBCATK3H PG 5 ADDR 0x1E */
  1801. SND_SOC_BYTES("Sub MBC 3 Attack", R_SUBMBCATK3L, 3),
  1802. /* R_SUBMBCREL3L PG 5 ADDR 0x1F */
  1803. /* R_SUBMBCREL3H PG 5 ADDR 0x20 */
  1804. SND_SOC_BYTES("Sub MBC 3 Release", R_SUBMBCREL3L, 3),
  1805. /* R_SUBCLECTL PG 5 ADDR 0x21 */
  1806. SOC_ENUM("Sub CLE Level Mode", sub_cle_lvl_mode_enum),
  1807. SOC_ENUM("Sub CLE Window", sub_cle_win_sel_enum),
  1808. SOC_SINGLE("Sub CLE Expander Switch",
  1809. R_SUBCLECTL, FB_SUBCLECTL_EXPEN, 1, 0),
  1810. SOC_SINGLE("Sub CLE Limiter Switch",
  1811. R_SUBCLECTL, FB_SUBCLECTL_LIMEN, 1, 0),
  1812. SOC_SINGLE("Sub CLE Compressor Switch",
  1813. R_SUBCLECTL, FB_SUBCLECTL_COMPEN, 1, 0),
  1814. /* R_SUBCLEMUG PG 5 ADDR 0x22 */
  1815. SOC_SINGLE_TLV("Sub CLE Make-Up Gain Volume", R_SUBCLEMUG,
  1816. FB_SUBCLEMUG_MUGAIN, FM_SUBCLEMUG_MUGAIN,
  1817. 0, cle_mug_tlv_arr),
  1818. /* R_SUBCOMPTHR PG 5 ADDR 0x23 */
  1819. SOC_SINGLE_TLV("Sub Compressor Threshold Volume", R_SUBCOMPTHR,
  1820. FB_SUBCOMPTHR_THRESH, FM_SUBCOMPTHR_THRESH,
  1821. 0, thr_tlv_arr),
  1822. /* R_SUBCOMPRAT PG 5 ADDR 0x24 */
  1823. SOC_ENUM("Sub Compressor Ratio", sub_comp_rat_enum),
  1824. /* R_SUBCOMPATKL PG 5 ADDR 0x25 */
  1825. /* R_SUBCOMPATKH PG 5 ADDR 0x26 */
  1826. SND_SOC_BYTES("Sub Compressor Attack", R_SUBCOMPATKL, 2),
  1827. /* R_SUBCOMPRELL PG 5 ADDR 0x27 */
  1828. /* R_SUBCOMPRELH PG 5 ADDR 0x28 */
  1829. SND_SOC_BYTES("Sub Compressor Release", R_SUBCOMPRELL, 2),
  1830. /* R_SUBLIMTHR PG 5 ADDR 0x29 */
  1831. SOC_SINGLE_TLV("Sub Limiter Threshold Volume", R_SUBLIMTHR,
  1832. FB_SUBLIMTHR_THRESH, FM_SUBLIMTHR_THRESH,
  1833. 0, thr_tlv_arr),
  1834. /* R_SUBLIMTGT PG 5 ADDR 0x2A */
  1835. SOC_SINGLE_TLV("Sub Limiter Target Volume", R_SUBLIMTGT,
  1836. FB_SUBLIMTGT_TARGET, FM_SUBLIMTGT_TARGET,
  1837. 0, thr_tlv_arr),
  1838. /* R_SUBLIMATKL PG 5 ADDR 0x2B */
  1839. /* R_SUBLIMATKH PG 5 ADDR 0x2C */
  1840. SND_SOC_BYTES("Sub Limiter Attack", R_SUBLIMATKL, 2),
  1841. /* R_SUBLIMRELL PG 5 ADDR 0x2D */
  1842. /* R_SUBLIMRELR PG 5 ADDR 0x2E */
  1843. SND_SOC_BYTES("Sub Limiter Release", R_SUBLIMRELL, 2),
  1844. /* R_SUBEXPTHR PG 5 ADDR 0x2F */
  1845. SOC_SINGLE_TLV("Sub Expander Threshold Volume", R_SUBEXPTHR,
  1846. FB_SUBEXPTHR_THRESH, FM_SUBEXPTHR_THRESH,
  1847. 0, thr_tlv_arr),
  1848. /* R_SUBEXPRAT PG 5 ADDR 0x30 */
  1849. SOC_ENUM("Sub Expander Ratio", sub_exp_rat_enum),
  1850. /* R_SUBEXPATKL PG 5 ADDR 0x31 */
  1851. /* R_SUBEXPATKR PG 5 ADDR 0x32 */
  1852. SND_SOC_BYTES("Sub Expander Attack", R_SUBEXPATKL, 2),
  1853. /* R_SUBEXPRELL PG 5 ADDR 0x33 */
  1854. /* R_SUBEXPRELR PG 5 ADDR 0x34 */
  1855. SND_SOC_BYTES("Sub Expander Release", R_SUBEXPRELL, 2),
  1856. /* R_SUBFXCTL PG 5 ADDR 0x35 */
  1857. SOC_SINGLE("Sub Treble Enhancement Switch",
  1858. R_SUBFXCTL, FB_SUBFXCTL_TEEN, 1, 0),
  1859. SOC_SINGLE("Sub Treble NLF Switch",
  1860. R_SUBFXCTL, FB_SUBFXCTL_TNLFBYP, 1, 1),
  1861. SOC_SINGLE("Sub Bass Enhancement Switch",
  1862. R_SUBFXCTL, FB_SUBFXCTL_BEEN, 1, 0),
  1863. SOC_SINGLE("Sub Bass NLF Switch",
  1864. R_SUBFXCTL, FB_SUBFXCTL_BNLFBYP, 1, 1),
  1865. COEFF_RAM_CTL("DAC Cascade 1 Left BiQuad 1", BIQUAD_SIZE, 0x00),
  1866. COEFF_RAM_CTL("DAC Cascade 1 Left BiQuad 2", BIQUAD_SIZE, 0x05),
  1867. COEFF_RAM_CTL("DAC Cascade 1 Left BiQuad 3", BIQUAD_SIZE, 0x0a),
  1868. COEFF_RAM_CTL("DAC Cascade 1 Left BiQuad 4", BIQUAD_SIZE, 0x0f),
  1869. COEFF_RAM_CTL("DAC Cascade 1 Left BiQuad 5", BIQUAD_SIZE, 0x14),
  1870. COEFF_RAM_CTL("DAC Cascade 1 Left BiQuad 6", BIQUAD_SIZE, 0x19),
  1871. COEFF_RAM_CTL("DAC Cascade 1 Right BiQuad 1", BIQUAD_SIZE, 0x20),
  1872. COEFF_RAM_CTL("DAC Cascade 1 Right BiQuad 2", BIQUAD_SIZE, 0x25),
  1873. COEFF_RAM_CTL("DAC Cascade 1 Right BiQuad 3", BIQUAD_SIZE, 0x2a),
  1874. COEFF_RAM_CTL("DAC Cascade 1 Right BiQuad 4", BIQUAD_SIZE, 0x2f),
  1875. COEFF_RAM_CTL("DAC Cascade 1 Right BiQuad 5", BIQUAD_SIZE, 0x34),
  1876. COEFF_RAM_CTL("DAC Cascade 1 Right BiQuad 6", BIQUAD_SIZE, 0x39),
  1877. COEFF_RAM_CTL("DAC Cascade 1 Left Prescale", COEFF_SIZE, 0x1f),
  1878. COEFF_RAM_CTL("DAC Cascade 1 Right Prescale", COEFF_SIZE, 0x3f),
  1879. COEFF_RAM_CTL("DAC Cascade 2 Left BiQuad 1", BIQUAD_SIZE, 0x40),
  1880. COEFF_RAM_CTL("DAC Cascade 2 Left BiQuad 2", BIQUAD_SIZE, 0x45),
  1881. COEFF_RAM_CTL("DAC Cascade 2 Left BiQuad 3", BIQUAD_SIZE, 0x4a),
  1882. COEFF_RAM_CTL("DAC Cascade 2 Left BiQuad 4", BIQUAD_SIZE, 0x4f),
  1883. COEFF_RAM_CTL("DAC Cascade 2 Left BiQuad 5", BIQUAD_SIZE, 0x54),
  1884. COEFF_RAM_CTL("DAC Cascade 2 Left BiQuad 6", BIQUAD_SIZE, 0x59),
  1885. COEFF_RAM_CTL("DAC Cascade 2 Right BiQuad 1", BIQUAD_SIZE, 0x60),
  1886. COEFF_RAM_CTL("DAC Cascade 2 Right BiQuad 2", BIQUAD_SIZE, 0x65),
  1887. COEFF_RAM_CTL("DAC Cascade 2 Right BiQuad 3", BIQUAD_SIZE, 0x6a),
  1888. COEFF_RAM_CTL("DAC Cascade 2 Right BiQuad 4", BIQUAD_SIZE, 0x6f),
  1889. COEFF_RAM_CTL("DAC Cascade 2 Right BiQuad 5", BIQUAD_SIZE, 0x74),
  1890. COEFF_RAM_CTL("DAC Cascade 2 Right BiQuad 6", BIQUAD_SIZE, 0x79),
  1891. COEFF_RAM_CTL("DAC Cascade 2 Left Prescale", COEFF_SIZE, 0x5f),
  1892. COEFF_RAM_CTL("DAC Cascade 2 Right Prescale", COEFF_SIZE, 0x7f),
  1893. COEFF_RAM_CTL("DAC Bass Extraction BiQuad 1", BIQUAD_SIZE, 0x80),
  1894. COEFF_RAM_CTL("DAC Bass Extraction BiQuad 2", BIQUAD_SIZE, 0x85),
  1895. COEFF_RAM_CTL("DAC Bass Non Linear Function 1", COEFF_SIZE, 0x8a),
  1896. COEFF_RAM_CTL("DAC Bass Non Linear Function 2", COEFF_SIZE, 0x8b),
  1897. COEFF_RAM_CTL("DAC Bass Limiter BiQuad", BIQUAD_SIZE, 0x8c),
  1898. COEFF_RAM_CTL("DAC Bass Cut Off BiQuad", BIQUAD_SIZE, 0x91),
  1899. COEFF_RAM_CTL("DAC Bass Mix", COEFF_SIZE, 0x96),
  1900. COEFF_RAM_CTL("DAC Treb Extraction BiQuad 1", BIQUAD_SIZE, 0x97),
  1901. COEFF_RAM_CTL("DAC Treb Extraction BiQuad 2", BIQUAD_SIZE, 0x9c),
  1902. COEFF_RAM_CTL("DAC Treb Non Linear Function 1", COEFF_SIZE, 0xa1),
  1903. COEFF_RAM_CTL("DAC Treb Non Linear Function 2", COEFF_SIZE, 0xa2),
  1904. COEFF_RAM_CTL("DAC Treb Limiter BiQuad", BIQUAD_SIZE, 0xa3),
  1905. COEFF_RAM_CTL("DAC Treb Cut Off BiQuad", BIQUAD_SIZE, 0xa8),
  1906. COEFF_RAM_CTL("DAC Treb Mix", COEFF_SIZE, 0xad),
  1907. COEFF_RAM_CTL("DAC 3D", COEFF_SIZE, 0xae),
  1908. COEFF_RAM_CTL("DAC 3D Mix", COEFF_SIZE, 0xaf),
  1909. COEFF_RAM_CTL("DAC MBC 1 BiQuad 1", BIQUAD_SIZE, 0xb0),
  1910. COEFF_RAM_CTL("DAC MBC 1 BiQuad 2", BIQUAD_SIZE, 0xb5),
  1911. COEFF_RAM_CTL("DAC MBC 2 BiQuad 1", BIQUAD_SIZE, 0xba),
  1912. COEFF_RAM_CTL("DAC MBC 2 BiQuad 2", BIQUAD_SIZE, 0xbf),
  1913. COEFF_RAM_CTL("DAC MBC 3 BiQuad 1", BIQUAD_SIZE, 0xc4),
  1914. COEFF_RAM_CTL("DAC MBC 3 BiQuad 2", BIQUAD_SIZE, 0xc9),
  1915. COEFF_RAM_CTL("Speaker Cascade 1 Left BiQuad 1", BIQUAD_SIZE, 0x00),
  1916. COEFF_RAM_CTL("Speaker Cascade 1 Left BiQuad 2", BIQUAD_SIZE, 0x05),
  1917. COEFF_RAM_CTL("Speaker Cascade 1 Left BiQuad 3", BIQUAD_SIZE, 0x0a),
  1918. COEFF_RAM_CTL("Speaker Cascade 1 Left BiQuad 4", BIQUAD_SIZE, 0x0f),
  1919. COEFF_RAM_CTL("Speaker Cascade 1 Left BiQuad 5", BIQUAD_SIZE, 0x14),
  1920. COEFF_RAM_CTL("Speaker Cascade 1 Left BiQuad 6", BIQUAD_SIZE, 0x19),
  1921. COEFF_RAM_CTL("Speaker Cascade 1 Right BiQuad 1", BIQUAD_SIZE, 0x20),
  1922. COEFF_RAM_CTL("Speaker Cascade 1 Right BiQuad 2", BIQUAD_SIZE, 0x25),
  1923. COEFF_RAM_CTL("Speaker Cascade 1 Right BiQuad 3", BIQUAD_SIZE, 0x2a),
  1924. COEFF_RAM_CTL("Speaker Cascade 1 Right BiQuad 4", BIQUAD_SIZE, 0x2f),
  1925. COEFF_RAM_CTL("Speaker Cascade 1 Right BiQuad 5", BIQUAD_SIZE, 0x34),
  1926. COEFF_RAM_CTL("Speaker Cascade 1 Right BiQuad 6", BIQUAD_SIZE, 0x39),
  1927. COEFF_RAM_CTL("Speaker Cascade 1 Left Prescale", COEFF_SIZE, 0x1f),
  1928. COEFF_RAM_CTL("Speaker Cascade 1 Right Prescale", COEFF_SIZE, 0x3f),
  1929. COEFF_RAM_CTL("Speaker Cascade 2 Left BiQuad 1", BIQUAD_SIZE, 0x40),
  1930. COEFF_RAM_CTL("Speaker Cascade 2 Left BiQuad 2", BIQUAD_SIZE, 0x45),
  1931. COEFF_RAM_CTL("Speaker Cascade 2 Left BiQuad 3", BIQUAD_SIZE, 0x4a),
  1932. COEFF_RAM_CTL("Speaker Cascade 2 Left BiQuad 4", BIQUAD_SIZE, 0x4f),
  1933. COEFF_RAM_CTL("Speaker Cascade 2 Left BiQuad 5", BIQUAD_SIZE, 0x54),
  1934. COEFF_RAM_CTL("Speaker Cascade 2 Left BiQuad 6", BIQUAD_SIZE, 0x59),
  1935. COEFF_RAM_CTL("Speaker Cascade 2 Right BiQuad 1", BIQUAD_SIZE, 0x60),
  1936. COEFF_RAM_CTL("Speaker Cascade 2 Right BiQuad 2", BIQUAD_SIZE, 0x65),
  1937. COEFF_RAM_CTL("Speaker Cascade 2 Right BiQuad 3", BIQUAD_SIZE, 0x6a),
  1938. COEFF_RAM_CTL("Speaker Cascade 2 Right BiQuad 4", BIQUAD_SIZE, 0x6f),
  1939. COEFF_RAM_CTL("Speaker Cascade 2 Right BiQuad 5", BIQUAD_SIZE, 0x74),
  1940. COEFF_RAM_CTL("Speaker Cascade 2 Right BiQuad 6", BIQUAD_SIZE, 0x79),
  1941. COEFF_RAM_CTL("Speaker Cascade 2 Left Prescale", COEFF_SIZE, 0x5f),
  1942. COEFF_RAM_CTL("Speaker Cascade 2 Right Prescale", COEFF_SIZE, 0x7f),
  1943. COEFF_RAM_CTL("Speaker Bass Extraction BiQuad 1", BIQUAD_SIZE, 0x80),
  1944. COEFF_RAM_CTL("Speaker Bass Extraction BiQuad 2", BIQUAD_SIZE, 0x85),
  1945. COEFF_RAM_CTL("Speaker Bass Non Linear Function 1", COEFF_SIZE, 0x8a),
  1946. COEFF_RAM_CTL("Speaker Bass Non Linear Function 2", COEFF_SIZE, 0x8b),
  1947. COEFF_RAM_CTL("Speaker Bass Limiter BiQuad", BIQUAD_SIZE, 0x8c),
  1948. COEFF_RAM_CTL("Speaker Bass Cut Off BiQuad", BIQUAD_SIZE, 0x91),
  1949. COEFF_RAM_CTL("Speaker Bass Mix", COEFF_SIZE, 0x96),
  1950. COEFF_RAM_CTL("Speaker Treb Extraction BiQuad 1", BIQUAD_SIZE, 0x97),
  1951. COEFF_RAM_CTL("Speaker Treb Extraction BiQuad 2", BIQUAD_SIZE, 0x9c),
  1952. COEFF_RAM_CTL("Speaker Treb Non Linear Function 1", COEFF_SIZE, 0xa1),
  1953. COEFF_RAM_CTL("Speaker Treb Non Linear Function 2", COEFF_SIZE, 0xa2),
  1954. COEFF_RAM_CTL("Speaker Treb Limiter BiQuad", BIQUAD_SIZE, 0xa3),
  1955. COEFF_RAM_CTL("Speaker Treb Cut Off BiQuad", BIQUAD_SIZE, 0xa8),
  1956. COEFF_RAM_CTL("Speaker Treb Mix", COEFF_SIZE, 0xad),
  1957. COEFF_RAM_CTL("Speaker 3D", COEFF_SIZE, 0xae),
  1958. COEFF_RAM_CTL("Speaker 3D Mix", COEFF_SIZE, 0xaf),
  1959. COEFF_RAM_CTL("Speaker MBC 1 BiQuad 1", BIQUAD_SIZE, 0xb0),
  1960. COEFF_RAM_CTL("Speaker MBC 1 BiQuad 2", BIQUAD_SIZE, 0xb5),
  1961. COEFF_RAM_CTL("Speaker MBC 2 BiQuad 1", BIQUAD_SIZE, 0xba),
  1962. COEFF_RAM_CTL("Speaker MBC 2 BiQuad 2", BIQUAD_SIZE, 0xbf),
  1963. COEFF_RAM_CTL("Speaker MBC 3 BiQuad 1", BIQUAD_SIZE, 0xc4),
  1964. COEFF_RAM_CTL("Speaker MBC 3 BiQuad 2", BIQUAD_SIZE, 0xc9),
  1965. COEFF_RAM_CTL("Sub Cascade 1 Left BiQuad 1", BIQUAD_SIZE, 0x00),
  1966. COEFF_RAM_CTL("Sub Cascade 1 Left BiQuad 2", BIQUAD_SIZE, 0x05),
  1967. COEFF_RAM_CTL("Sub Cascade 1 Left BiQuad 3", BIQUAD_SIZE, 0x0a),
  1968. COEFF_RAM_CTL("Sub Cascade 1 Left BiQuad 4", BIQUAD_SIZE, 0x0f),
  1969. COEFF_RAM_CTL("Sub Cascade 1 Left BiQuad 5", BIQUAD_SIZE, 0x14),
  1970. COEFF_RAM_CTL("Sub Cascade 1 Left BiQuad 6", BIQUAD_SIZE, 0x19),
  1971. COEFF_RAM_CTL("Sub Cascade 1 Right BiQuad 1", BIQUAD_SIZE, 0x20),
  1972. COEFF_RAM_CTL("Sub Cascade 1 Right BiQuad 2", BIQUAD_SIZE, 0x25),
  1973. COEFF_RAM_CTL("Sub Cascade 1 Right BiQuad 3", BIQUAD_SIZE, 0x2a),
  1974. COEFF_RAM_CTL("Sub Cascade 1 Right BiQuad 4", BIQUAD_SIZE, 0x2f),
  1975. COEFF_RAM_CTL("Sub Cascade 1 Right BiQuad 5", BIQUAD_SIZE, 0x34),
  1976. COEFF_RAM_CTL("Sub Cascade 1 Right BiQuad 6", BIQUAD_SIZE, 0x39),
  1977. COEFF_RAM_CTL("Sub Cascade 1 Left Prescale", COEFF_SIZE, 0x1f),
  1978. COEFF_RAM_CTL("Sub Cascade 1 Right Prescale", COEFF_SIZE, 0x3f),
  1979. COEFF_RAM_CTL("Sub Cascade 2 Left BiQuad 1", BIQUAD_SIZE, 0x40),
  1980. COEFF_RAM_CTL("Sub Cascade 2 Left BiQuad 2", BIQUAD_SIZE, 0x45),
  1981. COEFF_RAM_CTL("Sub Cascade 2 Left BiQuad 3", BIQUAD_SIZE, 0x4a),
  1982. COEFF_RAM_CTL("Sub Cascade 2 Left BiQuad 4", BIQUAD_SIZE, 0x4f),
  1983. COEFF_RAM_CTL("Sub Cascade 2 Left BiQuad 5", BIQUAD_SIZE, 0x54),
  1984. COEFF_RAM_CTL("Sub Cascade 2 Left BiQuad 6", BIQUAD_SIZE, 0x59),
  1985. COEFF_RAM_CTL("Sub Cascade 2 Right BiQuad 1", BIQUAD_SIZE, 0x60),
  1986. COEFF_RAM_CTL("Sub Cascade 2 Right BiQuad 2", BIQUAD_SIZE, 0x65),
  1987. COEFF_RAM_CTL("Sub Cascade 2 Right BiQuad 3", BIQUAD_SIZE, 0x6a),
  1988. COEFF_RAM_CTL("Sub Cascade 2 Right BiQuad 4", BIQUAD_SIZE, 0x6f),
  1989. COEFF_RAM_CTL("Sub Cascade 2 Right BiQuad 5", BIQUAD_SIZE, 0x74),
  1990. COEFF_RAM_CTL("Sub Cascade 2 Right BiQuad 6", BIQUAD_SIZE, 0x79),
  1991. COEFF_RAM_CTL("Sub Cascade 2 Left Prescale", COEFF_SIZE, 0x5f),
  1992. COEFF_RAM_CTL("Sub Cascade 2 Right Prescale", COEFF_SIZE, 0x7f),
  1993. COEFF_RAM_CTL("Sub Bass Extraction BiQuad 1", BIQUAD_SIZE, 0x80),
  1994. COEFF_RAM_CTL("Sub Bass Extraction BiQuad 2", BIQUAD_SIZE, 0x85),
  1995. COEFF_RAM_CTL("Sub Bass Non Linear Function 1", COEFF_SIZE, 0x8a),
  1996. COEFF_RAM_CTL("Sub Bass Non Linear Function 2", COEFF_SIZE, 0x8b),
  1997. COEFF_RAM_CTL("Sub Bass Limiter BiQuad", BIQUAD_SIZE, 0x8c),
  1998. COEFF_RAM_CTL("Sub Bass Cut Off BiQuad", BIQUAD_SIZE, 0x91),
  1999. COEFF_RAM_CTL("Sub Bass Mix", COEFF_SIZE, 0x96),
  2000. COEFF_RAM_CTL("Sub Treb Extraction BiQuad 1", BIQUAD_SIZE, 0x97),
  2001. COEFF_RAM_CTL("Sub Treb Extraction BiQuad 2", BIQUAD_SIZE, 0x9c),
  2002. COEFF_RAM_CTL("Sub Treb Non Linear Function 1", COEFF_SIZE, 0xa1),
  2003. COEFF_RAM_CTL("Sub Treb Non Linear Function 2", COEFF_SIZE, 0xa2),
  2004. COEFF_RAM_CTL("Sub Treb Limiter BiQuad", BIQUAD_SIZE, 0xa3),
  2005. COEFF_RAM_CTL("Sub Treb Cut Off BiQuad", BIQUAD_SIZE, 0xa8),
  2006. COEFF_RAM_CTL("Sub Treb Mix", COEFF_SIZE, 0xad),
  2007. COEFF_RAM_CTL("Sub 3D", COEFF_SIZE, 0xae),
  2008. COEFF_RAM_CTL("Sub 3D Mix", COEFF_SIZE, 0xaf),
  2009. COEFF_RAM_CTL("Sub MBC 1 BiQuad 1", BIQUAD_SIZE, 0xb0),
  2010. COEFF_RAM_CTL("Sub MBC 1 BiQuad 2", BIQUAD_SIZE, 0xb5),
  2011. COEFF_RAM_CTL("Sub MBC 2 BiQuad 1", BIQUAD_SIZE, 0xba),
  2012. COEFF_RAM_CTL("Sub MBC 2 BiQuad 2", BIQUAD_SIZE, 0xbf),
  2013. COEFF_RAM_CTL("Sub MBC 3 BiQuad 1", BIQUAD_SIZE, 0xc4),
  2014. COEFF_RAM_CTL("Sub MBC 3 BiQuad 2", BIQUAD_SIZE, 0xc9),
  2015. };
  2016. static struct snd_soc_dapm_widget const tscs454_dapm_widgets[] = {
  2017. /* R_PLLCTL PG 0 ADDR 0x15 */
  2018. SND_SOC_DAPM_SUPPLY("PLL 1 Power", R_PLLCTL, FB_PLLCTL_PU_PLL1, 0,
  2019. pll_power_event,
  2020. SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD),
  2021. SND_SOC_DAPM_SUPPLY("PLL 2 Power", R_PLLCTL, FB_PLLCTL_PU_PLL2, 0,
  2022. pll_power_event,
  2023. SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_PRE_PMD),
  2024. /* R_I2SPINC0 PG 0 ADDR 0x22 */
  2025. SND_SOC_DAPM_AIF_OUT("DAI 3 Out", "DAI 3 Capture", 0,
  2026. R_I2SPINC0, FB_I2SPINC0_SDO3TRI, 1),
  2027. SND_SOC_DAPM_AIF_OUT("DAI 2 Out", "DAI 2 Capture", 0,
  2028. R_I2SPINC0, FB_I2SPINC0_SDO2TRI, 1),
  2029. SND_SOC_DAPM_AIF_OUT("DAI 1 Out", "DAI 1 Capture", 0,
  2030. R_I2SPINC0, FB_I2SPINC0_SDO1TRI, 1),
  2031. /* R_PWRM0 PG 0 ADDR 0x33 */
  2032. SND_SOC_DAPM_ADC("Input Processor Channel 3", NULL,
  2033. R_PWRM0, FB_PWRM0_INPROC3PU, 0),
  2034. SND_SOC_DAPM_ADC("Input Processor Channel 2", NULL,
  2035. R_PWRM0, FB_PWRM0_INPROC2PU, 0),
  2036. SND_SOC_DAPM_ADC("Input Processor Channel 1", NULL,
  2037. R_PWRM0, FB_PWRM0_INPROC1PU, 0),
  2038. SND_SOC_DAPM_ADC("Input Processor Channel 0", NULL,
  2039. R_PWRM0, FB_PWRM0_INPROC0PU, 0),
  2040. SND_SOC_DAPM_SUPPLY("Mic Bias 2",
  2041. R_PWRM0, FB_PWRM0_MICB2PU, 0, NULL, 0),
  2042. SND_SOC_DAPM_SUPPLY("Mic Bias 1", R_PWRM0,
  2043. FB_PWRM0_MICB1PU, 0, NULL, 0),
  2044. /* R_PWRM1 PG 0 ADDR 0x34 */
  2045. SND_SOC_DAPM_SUPPLY("Sub Power", R_PWRM1, FB_PWRM1_SUBPU, 0, NULL, 0),
  2046. SND_SOC_DAPM_SUPPLY("Headphone Left Power",
  2047. R_PWRM1, FB_PWRM1_HPLPU, 0, NULL, 0),
  2048. SND_SOC_DAPM_SUPPLY("Headphone Right Power",
  2049. R_PWRM1, FB_PWRM1_HPRPU, 0, NULL, 0),
  2050. SND_SOC_DAPM_SUPPLY("Speaker Left Power",
  2051. R_PWRM1, FB_PWRM1_SPKLPU, 0, NULL, 0),
  2052. SND_SOC_DAPM_SUPPLY("Speaker Right Power",
  2053. R_PWRM1, FB_PWRM1_SPKRPU, 0, NULL, 0),
  2054. SND_SOC_DAPM_SUPPLY("Differential Input 2 Power",
  2055. R_PWRM1, FB_PWRM1_D2S2PU, 0, NULL, 0),
  2056. SND_SOC_DAPM_SUPPLY("Differential Input 1 Power",
  2057. R_PWRM1, FB_PWRM1_D2S1PU, 0, NULL, 0),
  2058. /* R_PWRM2 PG 0 ADDR 0x35 */
  2059. SND_SOC_DAPM_SUPPLY("DAI 3 Out Power",
  2060. R_PWRM2, FB_PWRM2_I2S3OPU, 0, NULL, 0),
  2061. SND_SOC_DAPM_SUPPLY("DAI 2 Out Power",
  2062. R_PWRM2, FB_PWRM2_I2S2OPU, 0, NULL, 0),
  2063. SND_SOC_DAPM_SUPPLY("DAI 1 Out Power",
  2064. R_PWRM2, FB_PWRM2_I2S1OPU, 0, NULL, 0),
  2065. SND_SOC_DAPM_SUPPLY("DAI 3 In Power",
  2066. R_PWRM2, FB_PWRM2_I2S3IPU, 0, NULL, 0),
  2067. SND_SOC_DAPM_SUPPLY("DAI 2 In Power",
  2068. R_PWRM2, FB_PWRM2_I2S2IPU, 0, NULL, 0),
  2069. SND_SOC_DAPM_SUPPLY("DAI 1 In Power",
  2070. R_PWRM2, FB_PWRM2_I2S1IPU, 0, NULL, 0),
  2071. /* R_PWRM3 PG 0 ADDR 0x36 */
  2072. SND_SOC_DAPM_SUPPLY("Line Out Left Power",
  2073. R_PWRM3, FB_PWRM3_LLINEPU, 0, NULL, 0),
  2074. SND_SOC_DAPM_SUPPLY("Line Out Right Power",
  2075. R_PWRM3, FB_PWRM3_RLINEPU, 0, NULL, 0),
  2076. /* R_PWRM4 PG 0 ADDR 0x37 */
  2077. SND_SOC_DAPM_DAC("Sub", NULL, R_PWRM4, FB_PWRM4_OPSUBPU, 0),
  2078. SND_SOC_DAPM_DAC("DAC Left", NULL, R_PWRM4, FB_PWRM4_OPDACLPU, 0),
  2079. SND_SOC_DAPM_DAC("DAC Right", NULL, R_PWRM4, FB_PWRM4_OPDACRPU, 0),
  2080. SND_SOC_DAPM_DAC("ClassD Left", NULL, R_PWRM4, FB_PWRM4_OPSPKLPU, 0),
  2081. SND_SOC_DAPM_DAC("ClassD Right", NULL, R_PWRM4, FB_PWRM4_OPSPKRPU, 0),
  2082. /* R_AUDIOMUX1 PG 0 ADDR 0x3A */
  2083. SND_SOC_DAPM_MUX("DAI 2 Out Mux", SND_SOC_NOPM, 0, 0,
  2084. &dai2_mux_dapm_enum),
  2085. SND_SOC_DAPM_MUX("DAI 1 Out Mux", SND_SOC_NOPM, 0, 0,
  2086. &dai1_mux_dapm_enum),
  2087. /* R_AUDIOMUX2 PG 0 ADDR 0x3B */
  2088. SND_SOC_DAPM_MUX("DAC Mux", SND_SOC_NOPM, 0, 0,
  2089. &dac_mux_dapm_enum),
  2090. SND_SOC_DAPM_MUX("DAI 3 Out Mux", SND_SOC_NOPM, 0, 0,
  2091. &dai3_mux_dapm_enum),
  2092. /* R_AUDIOMUX3 PG 0 ADDR 0x3C */
  2093. SND_SOC_DAPM_MUX("Sub Mux", SND_SOC_NOPM, 0, 0,
  2094. &sub_mux_dapm_enum),
  2095. SND_SOC_DAPM_MUX("Speaker Mux", SND_SOC_NOPM, 0, 0,
  2096. &classd_mux_dapm_enum),
  2097. /* R_HSDCTL1 PG 1 ADDR 0x01 */
  2098. SND_SOC_DAPM_SUPPLY("GHS Detect Power", R_HSDCTL1,
  2099. FB_HSDCTL1_CON_DET_PWD, 1, NULL, 0),
  2100. /* R_CH0AIC PG 1 ADDR 0x06 */
  2101. SND_SOC_DAPM_MUX("Input Boost Channel 0 Mux", SND_SOC_NOPM, 0, 0,
  2102. &in_bst_mux_ch0_dapm_enum),
  2103. SND_SOC_DAPM_MUX("ADC Channel 0 Mux", SND_SOC_NOPM, 0, 0,
  2104. &adc_mux_ch0_dapm_enum),
  2105. SND_SOC_DAPM_MUX("Input Processor Channel 0 Mux", SND_SOC_NOPM, 0, 0,
  2106. &in_proc_mux_ch0_dapm_enum),
  2107. /* R_CH1AIC PG 1 ADDR 0x07 */
  2108. SND_SOC_DAPM_MUX("Input Boost Channel 1 Mux", SND_SOC_NOPM, 0, 0,
  2109. &in_bst_mux_ch1_dapm_enum),
  2110. SND_SOC_DAPM_MUX("ADC Channel 1 Mux", SND_SOC_NOPM, 0, 0,
  2111. &adc_mux_ch1_dapm_enum),
  2112. SND_SOC_DAPM_MUX("Input Processor Channel 1 Mux", SND_SOC_NOPM, 0, 0,
  2113. &in_proc_mux_ch1_dapm_enum),
  2114. /* Virtual */
  2115. SND_SOC_DAPM_AIF_IN("DAI 3 In", "DAI 3 Playback", 0,
  2116. SND_SOC_NOPM, 0, 0),
  2117. SND_SOC_DAPM_AIF_IN("DAI 2 In", "DAI 2 Playback", 0,
  2118. SND_SOC_NOPM, 0, 0),
  2119. SND_SOC_DAPM_AIF_IN("DAI 1 In", "DAI 1 Playback", 0,
  2120. SND_SOC_NOPM, 0, 0),
  2121. SND_SOC_DAPM_SUPPLY("PLLs", SND_SOC_NOPM, 0, 0, NULL, 0),
  2122. SND_SOC_DAPM_OUTPUT("Sub Out"),
  2123. SND_SOC_DAPM_OUTPUT("Headphone Left"),
  2124. SND_SOC_DAPM_OUTPUT("Headphone Right"),
  2125. SND_SOC_DAPM_OUTPUT("Speaker Left"),
  2126. SND_SOC_DAPM_OUTPUT("Speaker Right"),
  2127. SND_SOC_DAPM_OUTPUT("Line Out Left"),
  2128. SND_SOC_DAPM_OUTPUT("Line Out Right"),
  2129. SND_SOC_DAPM_INPUT("D2S 2"),
  2130. SND_SOC_DAPM_INPUT("D2S 1"),
  2131. SND_SOC_DAPM_INPUT("Line In 1 Left"),
  2132. SND_SOC_DAPM_INPUT("Line In 1 Right"),
  2133. SND_SOC_DAPM_INPUT("Line In 2 Left"),
  2134. SND_SOC_DAPM_INPUT("Line In 2 Right"),
  2135. SND_SOC_DAPM_INPUT("Line In 3 Left"),
  2136. SND_SOC_DAPM_INPUT("Line In 3 Right"),
  2137. SND_SOC_DAPM_INPUT("DMic 1"),
  2138. SND_SOC_DAPM_INPUT("DMic 2"),
  2139. SND_SOC_DAPM_MUX("CH 0_1 Mux", SND_SOC_NOPM, 0, 0,
  2140. &ch_0_1_mux_dapm_enum),
  2141. SND_SOC_DAPM_MUX("CH 2_3 Mux", SND_SOC_NOPM, 0, 0,
  2142. &ch_2_3_mux_dapm_enum),
  2143. SND_SOC_DAPM_MUX("CH 4_5 Mux", SND_SOC_NOPM, 0, 0,
  2144. &ch_4_5_mux_dapm_enum),
  2145. };
  2146. static struct snd_soc_dapm_route const tscs454_intercon[] = {
  2147. /* PLLs */
  2148. {"PLLs", NULL, "PLL 1 Power", pll_connected},
  2149. {"PLLs", NULL, "PLL 2 Power", pll_connected},
  2150. /* Inputs */
  2151. {"DAI 3 In", NULL, "DAI 3 In Power"},
  2152. {"DAI 2 In", NULL, "DAI 2 In Power"},
  2153. {"DAI 1 In", NULL, "DAI 1 In Power"},
  2154. /* Outputs */
  2155. {"DAI 3 Out", NULL, "DAI 3 Out Power"},
  2156. {"DAI 2 Out", NULL, "DAI 2 Out Power"},
  2157. {"DAI 1 Out", NULL, "DAI 1 Out Power"},
  2158. /* Ch Muxing */
  2159. {"CH 0_1 Mux", "DAI 1", "DAI 1 In"},
  2160. {"CH 0_1 Mux", "TDM 0_1", "DAI 1 In"},
  2161. {"CH 2_3 Mux", "DAI 2", "DAI 2 In"},
  2162. {"CH 2_3 Mux", "TDM 2_3", "DAI 1 In"},
  2163. {"CH 4_5 Mux", "DAI 3", "DAI 2 In"},
  2164. {"CH 4_5 Mux", "TDM 4_5", "DAI 1 In"},
  2165. /* In/Out Muxing */
  2166. {"DAI 1 Out Mux", "CH 0_1", "CH 0_1 Mux"},
  2167. {"DAI 1 Out Mux", "CH 2_3", "CH 2_3 Mux"},
  2168. {"DAI 1 Out Mux", "CH 4_5", "CH 4_5 Mux"},
  2169. {"DAI 2 Out Mux", "CH 0_1", "CH 0_1 Mux"},
  2170. {"DAI 2 Out Mux", "CH 2_3", "CH 2_3 Mux"},
  2171. {"DAI 2 Out Mux", "CH 4_5", "CH 4_5 Mux"},
  2172. {"DAI 3 Out Mux", "CH 0_1", "CH 0_1 Mux"},
  2173. {"DAI 3 Out Mux", "CH 2_3", "CH 2_3 Mux"},
  2174. {"DAI 3 Out Mux", "CH 4_5", "CH 4_5 Mux"},
  2175. /******************
  2176. * Playback Paths *
  2177. ******************/
  2178. /* DAC Path */
  2179. {"DAC Mux", "CH 4_5", "CH 4_5 Mux"},
  2180. {"DAC Mux", "CH 2_3", "CH 2_3 Mux"},
  2181. {"DAC Mux", "CH 0_1", "CH 0_1 Mux"},
  2182. {"DAC Left", NULL, "DAC Mux"},
  2183. {"DAC Right", NULL, "DAC Mux"},
  2184. {"DAC Left", NULL, "PLLs"},
  2185. {"DAC Right", NULL, "PLLs"},
  2186. {"Headphone Left", NULL, "Headphone Left Power"},
  2187. {"Headphone Right", NULL, "Headphone Right Power"},
  2188. {"Headphone Left", NULL, "DAC Left"},
  2189. {"Headphone Right", NULL, "DAC Right"},
  2190. /* Line Out */
  2191. {"Line Out Left", NULL, "Line Out Left Power"},
  2192. {"Line Out Right", NULL, "Line Out Right Power"},
  2193. {"Line Out Left", NULL, "DAC Left"},
  2194. {"Line Out Right", NULL, "DAC Right"},
  2195. /* ClassD Path */
  2196. {"Speaker Mux", "CH 4_5", "CH 4_5 Mux"},
  2197. {"Speaker Mux", "CH 2_3", "CH 2_3 Mux"},
  2198. {"Speaker Mux", "CH 0_1", "CH 0_1 Mux"},
  2199. {"ClassD Left", NULL, "Speaker Mux"},
  2200. {"ClassD Right", NULL, "Speaker Mux"},
  2201. {"ClassD Left", NULL, "PLLs"},
  2202. {"ClassD Right", NULL, "PLLs"},
  2203. {"Speaker Left", NULL, "Speaker Left Power"},
  2204. {"Speaker Right", NULL, "Speaker Right Power"},
  2205. {"Speaker Left", NULL, "ClassD Left"},
  2206. {"Speaker Right", NULL, "ClassD Right"},
  2207. /* Sub Path */
  2208. {"Sub Mux", "CH 4", "CH 4_5 Mux"},
  2209. {"Sub Mux", "CH 5", "CH 4_5 Mux"},
  2210. {"Sub Mux", "CH 4 + 5", "CH 4_5 Mux"},
  2211. {"Sub Mux", "CH 2", "CH 2_3 Mux"},
  2212. {"Sub Mux", "CH 3", "CH 2_3 Mux"},
  2213. {"Sub Mux", "CH 2 + 3", "CH 2_3 Mux"},
  2214. {"Sub Mux", "CH 0", "CH 0_1 Mux"},
  2215. {"Sub Mux", "CH 1", "CH 0_1 Mux"},
  2216. {"Sub Mux", "CH 0 + 1", "CH 0_1 Mux"},
  2217. {"Sub Mux", "ADC/DMic 1 Left", "Input Processor Channel 0"},
  2218. {"Sub Mux", "ADC/DMic 1 Right", "Input Processor Channel 1"},
  2219. {"Sub Mux", "ADC/DMic 1 Left Plus Right", "Input Processor Channel 0"},
  2220. {"Sub Mux", "ADC/DMic 1 Left Plus Right", "Input Processor Channel 1"},
  2221. {"Sub Mux", "DMic 2 Left", "DMic 2"},
  2222. {"Sub Mux", "DMic 2 Right", "DMic 2"},
  2223. {"Sub Mux", "DMic 2 Left Plus Right", "DMic 2"},
  2224. {"Sub Mux", "ClassD Left", "ClassD Left"},
  2225. {"Sub Mux", "ClassD Right", "ClassD Right"},
  2226. {"Sub Mux", "ClassD Left Plus Right", "ClassD Left"},
  2227. {"Sub Mux", "ClassD Left Plus Right", "ClassD Right"},
  2228. {"Sub", NULL, "Sub Mux"},
  2229. {"Sub", NULL, "PLLs"},
  2230. {"Sub Out", NULL, "Sub Power"},
  2231. {"Sub Out", NULL, "Sub"},
  2232. /*****************
  2233. * Capture Paths *
  2234. *****************/
  2235. {"Input Boost Channel 0 Mux", "Input 3", "Line In 3 Left"},
  2236. {"Input Boost Channel 0 Mux", "Input 2", "Line In 2 Left"},
  2237. {"Input Boost Channel 0 Mux", "Input 1", "Line In 1 Left"},
  2238. {"Input Boost Channel 0 Mux", "D2S", "D2S 1"},
  2239. {"Input Boost Channel 1 Mux", "Input 3", "Line In 3 Right"},
  2240. {"Input Boost Channel 1 Mux", "Input 2", "Line In 2 Right"},
  2241. {"Input Boost Channel 1 Mux", "Input 1", "Line In 1 Right"},
  2242. {"Input Boost Channel 1 Mux", "D2S", "D2S 2"},
  2243. {"ADC Channel 0 Mux", "Input 3 Boost Bypass", "Line In 3 Left"},
  2244. {"ADC Channel 0 Mux", "Input 2 Boost Bypass", "Line In 2 Left"},
  2245. {"ADC Channel 0 Mux", "Input 1 Boost Bypass", "Line In 1 Left"},
  2246. {"ADC Channel 0 Mux", "Input Boost", "Input Boost Channel 0 Mux"},
  2247. {"ADC Channel 1 Mux", "Input 3 Boost Bypass", "Line In 3 Right"},
  2248. {"ADC Channel 1 Mux", "Input 2 Boost Bypass", "Line In 2 Right"},
  2249. {"ADC Channel 1 Mux", "Input 1 Boost Bypass", "Line In 1 Right"},
  2250. {"ADC Channel 1 Mux", "Input Boost", "Input Boost Channel 1 Mux"},
  2251. {"Input Processor Channel 0 Mux", "ADC", "ADC Channel 0 Mux"},
  2252. {"Input Processor Channel 0 Mux", "DMic", "DMic 1"},
  2253. {"Input Processor Channel 0", NULL, "PLLs"},
  2254. {"Input Processor Channel 0", NULL, "Input Processor Channel 0 Mux"},
  2255. {"Input Processor Channel 1 Mux", "ADC", "ADC Channel 1 Mux"},
  2256. {"Input Processor Channel 1 Mux", "DMic", "DMic 1"},
  2257. {"Input Processor Channel 1", NULL, "PLLs"},
  2258. {"Input Processor Channel 1", NULL, "Input Processor Channel 1 Mux"},
  2259. {"Input Processor Channel 2", NULL, "PLLs"},
  2260. {"Input Processor Channel 2", NULL, "DMic 2"},
  2261. {"Input Processor Channel 3", NULL, "PLLs"},
  2262. {"Input Processor Channel 3", NULL, "DMic 2"},
  2263. {"DAI 1 Out Mux", "ADC/DMic 1", "Input Processor Channel 0"},
  2264. {"DAI 1 Out Mux", "ADC/DMic 1", "Input Processor Channel 1"},
  2265. {"DAI 1 Out Mux", "DMic 2", "Input Processor Channel 2"},
  2266. {"DAI 1 Out Mux", "DMic 2", "Input Processor Channel 3"},
  2267. {"DAI 2 Out Mux", "ADC/DMic 1", "Input Processor Channel 0"},
  2268. {"DAI 2 Out Mux", "ADC/DMic 1", "Input Processor Channel 1"},
  2269. {"DAI 2 Out Mux", "DMic 2", "Input Processor Channel 2"},
  2270. {"DAI 2 Out Mux", "DMic 2", "Input Processor Channel 3"},
  2271. {"DAI 3 Out Mux", "ADC/DMic 1", "Input Processor Channel 0"},
  2272. {"DAI 3 Out Mux", "ADC/DMic 1", "Input Processor Channel 1"},
  2273. {"DAI 3 Out Mux", "DMic 2", "Input Processor Channel 2"},
  2274. {"DAI 3 Out Mux", "DMic 2", "Input Processor Channel 3"},
  2275. {"DAI 1 Out", NULL, "DAI 1 Out Mux"},
  2276. {"DAI 2 Out", NULL, "DAI 2 Out Mux"},
  2277. {"DAI 3 Out", NULL, "DAI 3 Out Mux"},
  2278. };
  2279. /* This is used when BCLK is sourcing the PLLs */
  2280. static int tscs454_set_sysclk(struct snd_soc_dai *dai,
  2281. int clk_id, unsigned int freq, int dir)
  2282. {
  2283. struct snd_soc_component *component = dai->component;
  2284. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  2285. unsigned int val;
  2286. int bclk_dai;
  2287. dev_dbg(component->dev, "%s(): freq = %u\n", __func__, freq);
  2288. val = snd_soc_component_read(component, R_PLLCTL);
  2289. bclk_dai = (val & FM_PLLCTL_BCLKSEL) >> FB_PLLCTL_BCLKSEL;
  2290. if (bclk_dai != dai->id)
  2291. return 0;
  2292. tscs454->bclk_freq = freq;
  2293. return set_sysclk(component);
  2294. }
  2295. static int tscs454_set_bclk_ratio(struct snd_soc_dai *dai,
  2296. unsigned int ratio)
  2297. {
  2298. unsigned int mask;
  2299. int ret;
  2300. struct snd_soc_component *component = dai->component;
  2301. unsigned int val;
  2302. int shift;
  2303. dev_dbg(component->dev, "set_bclk_ratio() id = %d ratio = %u\n",
  2304. dai->id, ratio);
  2305. switch (dai->id) {
  2306. case TSCS454_DAI1_ID:
  2307. mask = FM_I2SCMC_BCMP1;
  2308. shift = FB_I2SCMC_BCMP1;
  2309. break;
  2310. case TSCS454_DAI2_ID:
  2311. mask = FM_I2SCMC_BCMP2;
  2312. shift = FB_I2SCMC_BCMP2;
  2313. break;
  2314. case TSCS454_DAI3_ID:
  2315. mask = FM_I2SCMC_BCMP3;
  2316. shift = FB_I2SCMC_BCMP3;
  2317. break;
  2318. default:
  2319. ret = -EINVAL;
  2320. dev_err(component->dev, "Unknown audio interface (%d)\n", ret);
  2321. return ret;
  2322. }
  2323. switch (ratio) {
  2324. case 32:
  2325. val = I2SCMC_BCMP_32X;
  2326. break;
  2327. case 40:
  2328. val = I2SCMC_BCMP_40X;
  2329. break;
  2330. case 64:
  2331. val = I2SCMC_BCMP_64X;
  2332. break;
  2333. default:
  2334. ret = -EINVAL;
  2335. dev_err(component->dev, "Unsupported bclk ratio (%d)\n", ret);
  2336. return ret;
  2337. }
  2338. ret = snd_soc_component_update_bits(component,
  2339. R_I2SCMC, mask, val << shift);
  2340. if (ret < 0) {
  2341. dev_err(component->dev,
  2342. "Failed to set DAI BCLK ratio (%d)\n", ret);
  2343. return ret;
  2344. }
  2345. return 0;
  2346. }
  2347. static inline int set_aif_provider_from_fmt(struct snd_soc_component *component,
  2348. struct aif *aif, unsigned int fmt)
  2349. {
  2350. int ret;
  2351. switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
  2352. case SND_SOC_DAIFMT_CBP_CFP:
  2353. aif->provider = true;
  2354. break;
  2355. case SND_SOC_DAIFMT_CBC_CFC:
  2356. aif->provider = false;
  2357. break;
  2358. default:
  2359. ret = -EINVAL;
  2360. dev_err(component->dev, "Unsupported format (%d)\n", ret);
  2361. return ret;
  2362. }
  2363. return 0;
  2364. }
  2365. static inline int set_aif_tdm_delay(struct snd_soc_component *component,
  2366. unsigned int dai_id, bool delay)
  2367. {
  2368. unsigned int reg;
  2369. int ret;
  2370. switch (dai_id) {
  2371. case TSCS454_DAI1_ID:
  2372. reg = R_TDMCTL0;
  2373. break;
  2374. case TSCS454_DAI2_ID:
  2375. reg = R_PCMP2CTL0;
  2376. break;
  2377. case TSCS454_DAI3_ID:
  2378. reg = R_PCMP3CTL0;
  2379. break;
  2380. default:
  2381. ret = -EINVAL;
  2382. dev_err(component->dev,
  2383. "DAI %d unknown (%d)\n", dai_id + 1, ret);
  2384. return ret;
  2385. }
  2386. ret = snd_soc_component_update_bits(component,
  2387. reg, FM_TDMCTL0_BDELAY, delay);
  2388. if (ret < 0) {
  2389. dev_err(component->dev, "Failed to setup tdm format (%d)\n",
  2390. ret);
  2391. return ret;
  2392. }
  2393. return 0;
  2394. }
  2395. static inline int set_aif_format_from_fmt(struct snd_soc_component *component,
  2396. unsigned int dai_id, unsigned int fmt)
  2397. {
  2398. unsigned int reg;
  2399. unsigned int val;
  2400. int ret;
  2401. switch (dai_id) {
  2402. case TSCS454_DAI1_ID:
  2403. reg = R_I2SP1CTL;
  2404. break;
  2405. case TSCS454_DAI2_ID:
  2406. reg = R_I2SP2CTL;
  2407. break;
  2408. case TSCS454_DAI3_ID:
  2409. reg = R_I2SP3CTL;
  2410. break;
  2411. default:
  2412. ret = -EINVAL;
  2413. dev_err(component->dev,
  2414. "DAI %d unknown (%d)\n", dai_id + 1, ret);
  2415. return ret;
  2416. }
  2417. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  2418. case SND_SOC_DAIFMT_RIGHT_J:
  2419. val = FV_FORMAT_RIGHT;
  2420. break;
  2421. case SND_SOC_DAIFMT_LEFT_J:
  2422. val = FV_FORMAT_LEFT;
  2423. break;
  2424. case SND_SOC_DAIFMT_I2S:
  2425. val = FV_FORMAT_I2S;
  2426. break;
  2427. case SND_SOC_DAIFMT_DSP_A:
  2428. ret = set_aif_tdm_delay(component, dai_id, true);
  2429. if (ret < 0)
  2430. return ret;
  2431. val = FV_FORMAT_TDM;
  2432. break;
  2433. case SND_SOC_DAIFMT_DSP_B:
  2434. ret = set_aif_tdm_delay(component, dai_id, false);
  2435. if (ret < 0)
  2436. return ret;
  2437. val = FV_FORMAT_TDM;
  2438. break;
  2439. default:
  2440. ret = -EINVAL;
  2441. dev_err(component->dev, "Format unsupported (%d)\n", ret);
  2442. return ret;
  2443. }
  2444. ret = snd_soc_component_update_bits(component,
  2445. reg, FM_I2SPCTL_FORMAT, val);
  2446. if (ret < 0) {
  2447. dev_err(component->dev, "Failed to set DAI %d format (%d)\n",
  2448. dai_id + 1, ret);
  2449. return ret;
  2450. }
  2451. return 0;
  2452. }
  2453. static inline int
  2454. set_aif_clock_format_from_fmt(struct snd_soc_component *component,
  2455. unsigned int dai_id, unsigned int fmt)
  2456. {
  2457. unsigned int reg;
  2458. unsigned int val;
  2459. int ret;
  2460. switch (dai_id) {
  2461. case TSCS454_DAI1_ID:
  2462. reg = R_I2SP1CTL;
  2463. break;
  2464. case TSCS454_DAI2_ID:
  2465. reg = R_I2SP2CTL;
  2466. break;
  2467. case TSCS454_DAI3_ID:
  2468. reg = R_I2SP3CTL;
  2469. break;
  2470. default:
  2471. ret = -EINVAL;
  2472. dev_err(component->dev,
  2473. "DAI %d unknown (%d)\n", dai_id + 1, ret);
  2474. return ret;
  2475. }
  2476. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  2477. case SND_SOC_DAIFMT_NB_NF:
  2478. val = FV_BCLKP_NOT_INVERTED | FV_LRCLKP_NOT_INVERTED;
  2479. break;
  2480. case SND_SOC_DAIFMT_NB_IF:
  2481. val = FV_BCLKP_NOT_INVERTED | FV_LRCLKP_INVERTED;
  2482. break;
  2483. case SND_SOC_DAIFMT_IB_NF:
  2484. val = FV_BCLKP_INVERTED | FV_LRCLKP_NOT_INVERTED;
  2485. break;
  2486. case SND_SOC_DAIFMT_IB_IF:
  2487. val = FV_BCLKP_INVERTED | FV_LRCLKP_INVERTED;
  2488. break;
  2489. default:
  2490. ret = -EINVAL;
  2491. dev_err(component->dev, "Format unknown (%d)\n", ret);
  2492. return ret;
  2493. }
  2494. ret = snd_soc_component_update_bits(component, reg,
  2495. FM_I2SPCTL_BCLKP | FM_I2SPCTL_LRCLKP, val);
  2496. if (ret < 0) {
  2497. dev_err(component->dev,
  2498. "Failed to set clock polarity for DAI%d (%d)\n",
  2499. dai_id + 1, ret);
  2500. return ret;
  2501. }
  2502. return 0;
  2503. }
  2504. static int tscs454_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
  2505. {
  2506. struct snd_soc_component *component = dai->component;
  2507. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  2508. struct aif *aif = &tscs454->aifs[dai->id];
  2509. int ret;
  2510. ret = set_aif_provider_from_fmt(component, aif, fmt);
  2511. if (ret < 0)
  2512. return ret;
  2513. ret = set_aif_format_from_fmt(component, dai->id, fmt);
  2514. if (ret < 0)
  2515. return ret;
  2516. ret = set_aif_clock_format_from_fmt(component, dai->id, fmt);
  2517. if (ret < 0)
  2518. return ret;
  2519. return 0;
  2520. }
  2521. static int tscs454_dai1_set_tdm_slot(struct snd_soc_dai *dai,
  2522. unsigned int tx_mask, unsigned int rx_mask, int slots,
  2523. int slot_width)
  2524. {
  2525. struct snd_soc_component *component = dai->component;
  2526. unsigned int val;
  2527. int ret;
  2528. if (!slots)
  2529. return 0;
  2530. if (tx_mask >= (1 << slots) || rx_mask >= (1 << slots)) {
  2531. ret = -EINVAL;
  2532. dev_err(component->dev, "Invalid TDM slot mask (%d)\n", ret);
  2533. return ret;
  2534. }
  2535. switch (slots) {
  2536. case 2:
  2537. val = FV_TDMSO_2 | FV_TDMSI_2;
  2538. break;
  2539. case 4:
  2540. val = FV_TDMSO_4 | FV_TDMSI_4;
  2541. break;
  2542. case 6:
  2543. val = FV_TDMSO_6 | FV_TDMSI_6;
  2544. break;
  2545. default:
  2546. ret = -EINVAL;
  2547. dev_err(component->dev, "Invalid number of slots (%d)\n", ret);
  2548. return ret;
  2549. }
  2550. switch (slot_width) {
  2551. case 16:
  2552. val = val | FV_TDMDSS_16;
  2553. break;
  2554. case 24:
  2555. val = val | FV_TDMDSS_24;
  2556. break;
  2557. case 32:
  2558. val = val | FV_TDMDSS_32;
  2559. break;
  2560. default:
  2561. ret = -EINVAL;
  2562. dev_err(component->dev, "Invalid TDM slot width (%d)\n", ret);
  2563. return ret;
  2564. }
  2565. ret = snd_soc_component_write(component, R_TDMCTL1, val);
  2566. if (ret < 0) {
  2567. dev_err(component->dev, "Failed to set slots (%d)\n", ret);
  2568. return ret;
  2569. }
  2570. return 0;
  2571. }
  2572. static int tscs454_dai23_set_tdm_slot(struct snd_soc_dai *dai,
  2573. unsigned int tx_mask, unsigned int rx_mask, int slots,
  2574. int slot_width)
  2575. {
  2576. struct snd_soc_component *component = dai->component;
  2577. unsigned int reg;
  2578. unsigned int val;
  2579. int ret;
  2580. if (!slots)
  2581. return 0;
  2582. if (tx_mask >= (1 << slots) || rx_mask >= (1 << slots)) {
  2583. ret = -EINVAL;
  2584. dev_err(component->dev, "Invalid TDM slot mask (%d)\n", ret);
  2585. return ret;
  2586. }
  2587. switch (dai->id) {
  2588. case TSCS454_DAI2_ID:
  2589. reg = R_PCMP2CTL1;
  2590. break;
  2591. case TSCS454_DAI3_ID:
  2592. reg = R_PCMP3CTL1;
  2593. break;
  2594. default:
  2595. ret = -EINVAL;
  2596. dev_err(component->dev, "Unrecognized interface %d (%d)\n",
  2597. dai->id, ret);
  2598. return ret;
  2599. }
  2600. switch (slots) {
  2601. case 1:
  2602. val = FV_PCMSOP_1 | FV_PCMSIP_1;
  2603. break;
  2604. case 2:
  2605. val = FV_PCMSOP_2 | FV_PCMSIP_2;
  2606. break;
  2607. default:
  2608. ret = -EINVAL;
  2609. dev_err(component->dev, "Invalid number of slots (%d)\n", ret);
  2610. return ret;
  2611. }
  2612. switch (slot_width) {
  2613. case 16:
  2614. val = val | FV_PCMDSSP_16;
  2615. break;
  2616. case 24:
  2617. val = val | FV_PCMDSSP_24;
  2618. break;
  2619. case 32:
  2620. val = val | FV_PCMDSSP_32;
  2621. break;
  2622. default:
  2623. ret = -EINVAL;
  2624. dev_err(component->dev, "Invalid TDM slot width (%d)\n", ret);
  2625. return ret;
  2626. }
  2627. ret = snd_soc_component_write(component, reg, val);
  2628. if (ret < 0) {
  2629. dev_err(component->dev, "Failed to set slots (%d)\n", ret);
  2630. return ret;
  2631. }
  2632. return 0;
  2633. }
  2634. static int set_aif_fs(struct snd_soc_component *component,
  2635. unsigned int id,
  2636. unsigned int rate)
  2637. {
  2638. unsigned int reg;
  2639. unsigned int br;
  2640. unsigned int bm;
  2641. int ret;
  2642. switch (rate) {
  2643. case 8000:
  2644. br = FV_I2SMBR_32;
  2645. bm = FV_I2SMBM_0PT25;
  2646. break;
  2647. case 16000:
  2648. br = FV_I2SMBR_32;
  2649. bm = FV_I2SMBM_0PT5;
  2650. break;
  2651. case 24000:
  2652. br = FV_I2SMBR_48;
  2653. bm = FV_I2SMBM_0PT5;
  2654. break;
  2655. case 32000:
  2656. br = FV_I2SMBR_32;
  2657. bm = FV_I2SMBM_1;
  2658. break;
  2659. case 48000:
  2660. br = FV_I2SMBR_48;
  2661. bm = FV_I2SMBM_1;
  2662. break;
  2663. case 96000:
  2664. br = FV_I2SMBR_48;
  2665. bm = FV_I2SMBM_2;
  2666. break;
  2667. case 11025:
  2668. br = FV_I2SMBR_44PT1;
  2669. bm = FV_I2SMBM_0PT25;
  2670. break;
  2671. case 22050:
  2672. br = FV_I2SMBR_44PT1;
  2673. bm = FV_I2SMBM_0PT5;
  2674. break;
  2675. case 44100:
  2676. br = FV_I2SMBR_44PT1;
  2677. bm = FV_I2SMBM_1;
  2678. break;
  2679. case 88200:
  2680. br = FV_I2SMBR_44PT1;
  2681. bm = FV_I2SMBM_2;
  2682. break;
  2683. default:
  2684. ret = -EINVAL;
  2685. dev_err(component->dev, "Unsupported sample rate (%d)\n", ret);
  2686. return ret;
  2687. }
  2688. switch (id) {
  2689. case TSCS454_DAI1_ID:
  2690. reg = R_I2S1MRATE;
  2691. break;
  2692. case TSCS454_DAI2_ID:
  2693. reg = R_I2S2MRATE;
  2694. break;
  2695. case TSCS454_DAI3_ID:
  2696. reg = R_I2S3MRATE;
  2697. break;
  2698. default:
  2699. ret = -EINVAL;
  2700. dev_err(component->dev, "DAI ID not recognized (%d)\n", ret);
  2701. return ret;
  2702. }
  2703. ret = snd_soc_component_update_bits(component, reg,
  2704. FM_I2SMRATE_I2SMBR | FM_I2SMRATE_I2SMBM, br|bm);
  2705. if (ret < 0) {
  2706. dev_err(component->dev,
  2707. "Failed to update register (%d)\n", ret);
  2708. return ret;
  2709. }
  2710. return 0;
  2711. }
  2712. static int set_aif_sample_format(struct snd_soc_component *component,
  2713. snd_pcm_format_t format,
  2714. int aif_id)
  2715. {
  2716. unsigned int reg;
  2717. unsigned int width;
  2718. int ret;
  2719. switch (snd_pcm_format_width(format)) {
  2720. case 16:
  2721. width = FV_WL_16;
  2722. break;
  2723. case 20:
  2724. width = FV_WL_20;
  2725. break;
  2726. case 24:
  2727. width = FV_WL_24;
  2728. break;
  2729. case 32:
  2730. width = FV_WL_32;
  2731. break;
  2732. default:
  2733. ret = -EINVAL;
  2734. dev_err(component->dev, "Unsupported format width (%d)\n", ret);
  2735. return ret;
  2736. }
  2737. switch (aif_id) {
  2738. case TSCS454_DAI1_ID:
  2739. reg = R_I2SP1CTL;
  2740. break;
  2741. case TSCS454_DAI2_ID:
  2742. reg = R_I2SP2CTL;
  2743. break;
  2744. case TSCS454_DAI3_ID:
  2745. reg = R_I2SP3CTL;
  2746. break;
  2747. default:
  2748. ret = -EINVAL;
  2749. dev_err(component->dev, "AIF ID not recognized (%d)\n", ret);
  2750. return ret;
  2751. }
  2752. ret = snd_soc_component_update_bits(component,
  2753. reg, FM_I2SPCTL_WL, width);
  2754. if (ret < 0) {
  2755. dev_err(component->dev,
  2756. "Failed to set sample width (%d)\n", ret);
  2757. return ret;
  2758. }
  2759. return 0;
  2760. }
  2761. static int tscs454_hw_params(struct snd_pcm_substream *substream,
  2762. struct snd_pcm_hw_params *params,
  2763. struct snd_soc_dai *dai)
  2764. {
  2765. struct snd_soc_component *component = dai->component;
  2766. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  2767. unsigned int fs = params_rate(params);
  2768. struct aif *aif = &tscs454->aifs[dai->id];
  2769. unsigned int val;
  2770. int ret;
  2771. mutex_lock(&tscs454->aifs_status_lock);
  2772. dev_dbg(component->dev, "%s(): aif %d fs = %u\n", __func__,
  2773. aif->id, fs);
  2774. if (!aif_active(&tscs454->aifs_status, aif->id)) {
  2775. if (PLL_44_1K_RATE % fs)
  2776. aif->pll = &tscs454->pll1;
  2777. else
  2778. aif->pll = &tscs454->pll2;
  2779. dev_dbg(component->dev, "Reserving pll %d for aif %d\n",
  2780. aif->pll->id, aif->id);
  2781. reserve_pll(aif->pll);
  2782. }
  2783. if (!aifs_active(&tscs454->aifs_status)) { /* First active aif */
  2784. val = snd_soc_component_read(component, R_ISRC);
  2785. if ((val & FM_ISRC_IBR) == FV_IBR_48)
  2786. tscs454->internal_rate.pll = &tscs454->pll1;
  2787. else
  2788. tscs454->internal_rate.pll = &tscs454->pll2;
  2789. dev_dbg(component->dev, "Reserving pll %d for ir\n",
  2790. tscs454->internal_rate.pll->id);
  2791. reserve_pll(tscs454->internal_rate.pll);
  2792. }
  2793. ret = set_aif_fs(component, aif->id, fs);
  2794. if (ret < 0) {
  2795. dev_err(component->dev, "Failed to set aif fs (%d)\n", ret);
  2796. goto exit;
  2797. }
  2798. ret = set_aif_sample_format(component, params_format(params), aif->id);
  2799. if (ret < 0) {
  2800. dev_err(component->dev,
  2801. "Failed to set aif sample format (%d)\n", ret);
  2802. goto exit;
  2803. }
  2804. set_aif_status_active(&tscs454->aifs_status, aif->id,
  2805. substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
  2806. dev_dbg(component->dev, "Set aif %d active. Streams status is 0x%x\n",
  2807. aif->id, tscs454->aifs_status.streams);
  2808. ret = 0;
  2809. exit:
  2810. mutex_unlock(&tscs454->aifs_status_lock);
  2811. return ret;
  2812. }
  2813. static int tscs454_hw_free(struct snd_pcm_substream *substream,
  2814. struct snd_soc_dai *dai)
  2815. {
  2816. struct snd_soc_component *component = dai->component;
  2817. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  2818. struct aif *aif = &tscs454->aifs[dai->id];
  2819. return aif_free(component, aif,
  2820. substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
  2821. }
  2822. static int tscs454_prepare(struct snd_pcm_substream *substream,
  2823. struct snd_soc_dai *dai)
  2824. {
  2825. int ret;
  2826. struct snd_soc_component *component = dai->component;
  2827. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  2828. struct aif *aif = &tscs454->aifs[dai->id];
  2829. ret = aif_prepare(component, aif);
  2830. if (ret < 0)
  2831. return ret;
  2832. return 0;
  2833. }
  2834. static struct snd_soc_dai_ops const tscs454_dai1_ops = {
  2835. .set_sysclk = tscs454_set_sysclk,
  2836. .set_bclk_ratio = tscs454_set_bclk_ratio,
  2837. .set_fmt = tscs454_set_dai_fmt,
  2838. .set_tdm_slot = tscs454_dai1_set_tdm_slot,
  2839. .hw_params = tscs454_hw_params,
  2840. .hw_free = tscs454_hw_free,
  2841. .prepare = tscs454_prepare,
  2842. };
  2843. static struct snd_soc_dai_ops const tscs454_dai23_ops = {
  2844. .set_sysclk = tscs454_set_sysclk,
  2845. .set_bclk_ratio = tscs454_set_bclk_ratio,
  2846. .set_fmt = tscs454_set_dai_fmt,
  2847. .set_tdm_slot = tscs454_dai23_set_tdm_slot,
  2848. .hw_params = tscs454_hw_params,
  2849. .hw_free = tscs454_hw_free,
  2850. .prepare = tscs454_prepare,
  2851. };
  2852. static int tscs454_probe(struct snd_soc_component *component)
  2853. {
  2854. struct tscs454 *tscs454 = snd_soc_component_get_drvdata(component);
  2855. unsigned int val;
  2856. int ret = 0;
  2857. switch (tscs454->sysclk_src_id) {
  2858. case PLL_INPUT_XTAL:
  2859. val = FV_PLLISEL_XTAL;
  2860. break;
  2861. case PLL_INPUT_MCLK1:
  2862. val = FV_PLLISEL_MCLK1;
  2863. break;
  2864. case PLL_INPUT_MCLK2:
  2865. val = FV_PLLISEL_MCLK2;
  2866. break;
  2867. case PLL_INPUT_BCLK:
  2868. val = FV_PLLISEL_BCLK;
  2869. break;
  2870. default:
  2871. ret = -EINVAL;
  2872. dev_err(component->dev, "Invalid sysclk src id (%d)\n", ret);
  2873. return ret;
  2874. }
  2875. ret = snd_soc_component_update_bits(component, R_PLLCTL,
  2876. FM_PLLCTL_PLLISEL, val);
  2877. if (ret < 0) {
  2878. dev_err(component->dev, "Failed to set PLL input (%d)\n", ret);
  2879. return ret;
  2880. }
  2881. if (tscs454->sysclk_src_id < PLL_INPUT_BCLK)
  2882. ret = set_sysclk(component);
  2883. return ret;
  2884. }
  2885. static const struct snd_soc_component_driver soc_component_dev_tscs454 = {
  2886. .probe = tscs454_probe,
  2887. .dapm_widgets = tscs454_dapm_widgets,
  2888. .num_dapm_widgets = ARRAY_SIZE(tscs454_dapm_widgets),
  2889. .dapm_routes = tscs454_intercon,
  2890. .num_dapm_routes = ARRAY_SIZE(tscs454_intercon),
  2891. .controls = tscs454_snd_controls,
  2892. .num_controls = ARRAY_SIZE(tscs454_snd_controls),
  2893. .endianness = 1,
  2894. };
  2895. #define TSCS454_RATES SNDRV_PCM_RATE_8000_96000
  2896. #define TSCS454_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE \
  2897. | SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE \
  2898. | SNDRV_PCM_FMTBIT_S32_LE)
  2899. static struct snd_soc_dai_driver tscs454_dais[] = {
  2900. {
  2901. .name = "tscs454-dai1",
  2902. .id = TSCS454_DAI1_ID,
  2903. .playback = {
  2904. .stream_name = "DAI 1 Playback",
  2905. .channels_min = 1,
  2906. .channels_max = 6,
  2907. .rates = TSCS454_RATES,
  2908. .formats = TSCS454_FORMATS,},
  2909. .capture = {
  2910. .stream_name = "DAI 1 Capture",
  2911. .channels_min = 1,
  2912. .channels_max = 6,
  2913. .rates = TSCS454_RATES,
  2914. .formats = TSCS454_FORMATS,},
  2915. .ops = &tscs454_dai1_ops,
  2916. .symmetric_rate = 1,
  2917. .symmetric_channels = 1,
  2918. .symmetric_sample_bits = 1,
  2919. },
  2920. {
  2921. .name = "tscs454-dai2",
  2922. .id = TSCS454_DAI2_ID,
  2923. .playback = {
  2924. .stream_name = "DAI 2 Playback",
  2925. .channels_min = 1,
  2926. .channels_max = 2,
  2927. .rates = TSCS454_RATES,
  2928. .formats = TSCS454_FORMATS,},
  2929. .capture = {
  2930. .stream_name = "DAI 2 Capture",
  2931. .channels_min = 1,
  2932. .channels_max = 2,
  2933. .rates = TSCS454_RATES,
  2934. .formats = TSCS454_FORMATS,},
  2935. .ops = &tscs454_dai23_ops,
  2936. .symmetric_rate = 1,
  2937. .symmetric_channels = 1,
  2938. .symmetric_sample_bits = 1,
  2939. },
  2940. {
  2941. .name = "tscs454-dai3",
  2942. .id = TSCS454_DAI3_ID,
  2943. .playback = {
  2944. .stream_name = "DAI 3 Playback",
  2945. .channels_min = 1,
  2946. .channels_max = 2,
  2947. .rates = TSCS454_RATES,
  2948. .formats = TSCS454_FORMATS,},
  2949. .capture = {
  2950. .stream_name = "DAI 3 Capture",
  2951. .channels_min = 1,
  2952. .channels_max = 2,
  2953. .rates = TSCS454_RATES,
  2954. .formats = TSCS454_FORMATS,},
  2955. .ops = &tscs454_dai23_ops,
  2956. .symmetric_rate = 1,
  2957. .symmetric_channels = 1,
  2958. .symmetric_sample_bits = 1,
  2959. },
  2960. };
  2961. static char const * const src_names[] = {
  2962. "xtal", "mclk1", "mclk2", "bclk"};
  2963. static int tscs454_i2c_probe(struct i2c_client *i2c)
  2964. {
  2965. struct tscs454 *tscs454;
  2966. int src;
  2967. int ret;
  2968. tscs454 = devm_kzalloc(&i2c->dev, sizeof(*tscs454), GFP_KERNEL);
  2969. if (!tscs454)
  2970. return -ENOMEM;
  2971. ret = tscs454_data_init(tscs454, i2c);
  2972. if (ret < 0)
  2973. return ret;
  2974. i2c_set_clientdata(i2c, tscs454);
  2975. for (src = PLL_INPUT_XTAL; src < PLL_INPUT_BCLK; src++) {
  2976. tscs454->sysclk = devm_clk_get(&i2c->dev, src_names[src]);
  2977. if (!IS_ERR(tscs454->sysclk)) {
  2978. break;
  2979. } else if (PTR_ERR(tscs454->sysclk) != -ENOENT) {
  2980. ret = PTR_ERR(tscs454->sysclk);
  2981. dev_err(&i2c->dev, "Failed to get sysclk (%d)\n", ret);
  2982. return ret;
  2983. }
  2984. }
  2985. dev_dbg(&i2c->dev, "PLL input is %s\n", src_names[src]);
  2986. tscs454->sysclk_src_id = src;
  2987. ret = regmap_write(tscs454->regmap,
  2988. R_RESET, FV_RESET_PWR_ON_DEFAULTS);
  2989. if (ret < 0) {
  2990. dev_err(&i2c->dev, "Failed to reset the component (%d)\n", ret);
  2991. return ret;
  2992. }
  2993. regcache_mark_dirty(tscs454->regmap);
  2994. ret = regmap_register_patch(tscs454->regmap, tscs454_patch,
  2995. ARRAY_SIZE(tscs454_patch));
  2996. if (ret < 0) {
  2997. dev_err(&i2c->dev, "Failed to apply patch (%d)\n", ret);
  2998. return ret;
  2999. }
  3000. /* Sync pg sel reg with cache */
  3001. regmap_write(tscs454->regmap, R_PAGESEL, 0x00);
  3002. ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_dev_tscs454,
  3003. tscs454_dais, ARRAY_SIZE(tscs454_dais));
  3004. if (ret) {
  3005. dev_err(&i2c->dev, "Failed to register component (%d)\n", ret);
  3006. return ret;
  3007. }
  3008. return 0;
  3009. }
  3010. static const struct i2c_device_id tscs454_i2c_id[] = {
  3011. { "tscs454", 0 },
  3012. { }
  3013. };
  3014. MODULE_DEVICE_TABLE(i2c, tscs454_i2c_id);
  3015. static const struct of_device_id tscs454_of_match[] = {
  3016. { .compatible = "tempo,tscs454", },
  3017. { }
  3018. };
  3019. MODULE_DEVICE_TABLE(of, tscs454_of_match);
  3020. static struct i2c_driver tscs454_i2c_driver = {
  3021. .driver = {
  3022. .name = "tscs454",
  3023. .of_match_table = tscs454_of_match,
  3024. },
  3025. .probe_new = tscs454_i2c_probe,
  3026. .id_table = tscs454_i2c_id,
  3027. };
  3028. module_i2c_driver(tscs454_i2c_driver);
  3029. MODULE_AUTHOR("Tempo Semiconductor <[email protected]");
  3030. MODULE_DESCRIPTION("ASoC TSCS454 driver");
  3031. MODULE_LICENSE("GPL v2");