da732x.c 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * da732x.c --- Dialog DA732X ALSA SoC Audio Driver
  4. *
  5. * Copyright (C) 2012 Dialog Semiconductor GmbH
  6. *
  7. * Author: Michal Hajduk <[email protected]>
  8. */
  9. #include <linux/module.h>
  10. #include <linux/moduleparam.h>
  11. #include <linux/init.h>
  12. #include <linux/delay.h>
  13. #include <linux/pm.h>
  14. #include <linux/i2c.h>
  15. #include <linux/regmap.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/slab.h>
  18. #include <linux/sysfs.h>
  19. #include <sound/core.h>
  20. #include <sound/pcm.h>
  21. #include <sound/pcm_params.h>
  22. #include <sound/soc.h>
  23. #include <sound/soc-dapm.h>
  24. #include <sound/initval.h>
  25. #include <sound/tlv.h>
  26. #include <asm/div64.h>
  27. #include "da732x.h"
  28. #include "da732x_reg.h"
  29. struct da732x_priv {
  30. struct regmap *regmap;
  31. unsigned int sysclk;
  32. bool pll_en;
  33. };
  34. /*
  35. * da732x register cache - default settings
  36. */
  37. static const struct reg_default da732x_reg_cache[] = {
  38. { DA732X_REG_REF1 , 0x02 },
  39. { DA732X_REG_BIAS_EN , 0x80 },
  40. { DA732X_REG_BIAS1 , 0x00 },
  41. { DA732X_REG_BIAS2 , 0x00 },
  42. { DA732X_REG_BIAS3 , 0x00 },
  43. { DA732X_REG_BIAS4 , 0x00 },
  44. { DA732X_REG_MICBIAS2 , 0x00 },
  45. { DA732X_REG_MICBIAS1 , 0x00 },
  46. { DA732X_REG_MICDET , 0x00 },
  47. { DA732X_REG_MIC1_PRE , 0x01 },
  48. { DA732X_REG_MIC1 , 0x40 },
  49. { DA732X_REG_MIC2_PRE , 0x01 },
  50. { DA732X_REG_MIC2 , 0x40 },
  51. { DA732X_REG_AUX1L , 0x75 },
  52. { DA732X_REG_AUX1R , 0x75 },
  53. { DA732X_REG_MIC3_PRE , 0x01 },
  54. { DA732X_REG_MIC3 , 0x40 },
  55. { DA732X_REG_INP_PINBIAS , 0x00 },
  56. { DA732X_REG_INP_ZC_EN , 0x00 },
  57. { DA732X_REG_INP_MUX , 0x50 },
  58. { DA732X_REG_HP_DET , 0x00 },
  59. { DA732X_REG_HPL_DAC_OFFSET , 0x00 },
  60. { DA732X_REG_HPL_DAC_OFF_CNTL , 0x00 },
  61. { DA732X_REG_HPL_OUT_OFFSET , 0x00 },
  62. { DA732X_REG_HPL , 0x40 },
  63. { DA732X_REG_HPL_VOL , 0x0F },
  64. { DA732X_REG_HPR_DAC_OFFSET , 0x00 },
  65. { DA732X_REG_HPR_DAC_OFF_CNTL , 0x00 },
  66. { DA732X_REG_HPR_OUT_OFFSET , 0x00 },
  67. { DA732X_REG_HPR , 0x40 },
  68. { DA732X_REG_HPR_VOL , 0x0F },
  69. { DA732X_REG_LIN2 , 0x4F },
  70. { DA732X_REG_LIN3 , 0x4F },
  71. { DA732X_REG_LIN4 , 0x4F },
  72. { DA732X_REG_OUT_ZC_EN , 0x00 },
  73. { DA732X_REG_HP_LIN1_GNDSEL , 0x00 },
  74. { DA732X_REG_CP_HP1 , 0x0C },
  75. { DA732X_REG_CP_HP2 , 0x03 },
  76. { DA732X_REG_CP_CTRL1 , 0x00 },
  77. { DA732X_REG_CP_CTRL2 , 0x99 },
  78. { DA732X_REG_CP_CTRL3 , 0x25 },
  79. { DA732X_REG_CP_LEVEL_MASK , 0x3F },
  80. { DA732X_REG_CP_DET , 0x00 },
  81. { DA732X_REG_CP_STATUS , 0x00 },
  82. { DA732X_REG_CP_THRESH1 , 0x00 },
  83. { DA732X_REG_CP_THRESH2 , 0x00 },
  84. { DA732X_REG_CP_THRESH3 , 0x00 },
  85. { DA732X_REG_CP_THRESH4 , 0x00 },
  86. { DA732X_REG_CP_THRESH5 , 0x00 },
  87. { DA732X_REG_CP_THRESH6 , 0x00 },
  88. { DA732X_REG_CP_THRESH7 , 0x00 },
  89. { DA732X_REG_CP_THRESH8 , 0x00 },
  90. { DA732X_REG_PLL_DIV_LO , 0x00 },
  91. { DA732X_REG_PLL_DIV_MID , 0x00 },
  92. { DA732X_REG_PLL_DIV_HI , 0x00 },
  93. { DA732X_REG_PLL_CTRL , 0x02 },
  94. { DA732X_REG_CLK_CTRL , 0xaa },
  95. { DA732X_REG_CLK_DSP , 0x07 },
  96. { DA732X_REG_CLK_EN1 , 0x00 },
  97. { DA732X_REG_CLK_EN2 , 0x00 },
  98. { DA732X_REG_CLK_EN3 , 0x00 },
  99. { DA732X_REG_CLK_EN4 , 0x00 },
  100. { DA732X_REG_CLK_EN5 , 0x00 },
  101. { DA732X_REG_AIF_MCLK , 0x00 },
  102. { DA732X_REG_AIFA1 , 0x02 },
  103. { DA732X_REG_AIFA2 , 0x00 },
  104. { DA732X_REG_AIFA3 , 0x08 },
  105. { DA732X_REG_AIFB1 , 0x02 },
  106. { DA732X_REG_AIFB2 , 0x00 },
  107. { DA732X_REG_AIFB3 , 0x08 },
  108. { DA732X_REG_PC_CTRL , 0xC0 },
  109. { DA732X_REG_DATA_ROUTE , 0x00 },
  110. { DA732X_REG_DSP_CTRL , 0x00 },
  111. { DA732X_REG_CIF_CTRL2 , 0x00 },
  112. { DA732X_REG_HANDSHAKE , 0x00 },
  113. { DA732X_REG_SPARE1_OUT , 0x00 },
  114. { DA732X_REG_SPARE2_OUT , 0x00 },
  115. { DA732X_REG_SPARE1_IN , 0x00 },
  116. { DA732X_REG_ADC1_PD , 0x00 },
  117. { DA732X_REG_ADC1_HPF , 0x00 },
  118. { DA732X_REG_ADC1_SEL , 0x00 },
  119. { DA732X_REG_ADC1_EQ12 , 0x00 },
  120. { DA732X_REG_ADC1_EQ34 , 0x00 },
  121. { DA732X_REG_ADC1_EQ5 , 0x00 },
  122. { DA732X_REG_ADC2_PD , 0x00 },
  123. { DA732X_REG_ADC2_HPF , 0x00 },
  124. { DA732X_REG_ADC2_SEL , 0x00 },
  125. { DA732X_REG_ADC2_EQ12 , 0x00 },
  126. { DA732X_REG_ADC2_EQ34 , 0x00 },
  127. { DA732X_REG_ADC2_EQ5 , 0x00 },
  128. { DA732X_REG_DAC1_HPF , 0x00 },
  129. { DA732X_REG_DAC1_L_VOL , 0x00 },
  130. { DA732X_REG_DAC1_R_VOL , 0x00 },
  131. { DA732X_REG_DAC1_SEL , 0x00 },
  132. { DA732X_REG_DAC1_SOFTMUTE , 0x00 },
  133. { DA732X_REG_DAC1_EQ12 , 0x00 },
  134. { DA732X_REG_DAC1_EQ34 , 0x00 },
  135. { DA732X_REG_DAC1_EQ5 , 0x00 },
  136. { DA732X_REG_DAC2_HPF , 0x00 },
  137. { DA732X_REG_DAC2_L_VOL , 0x00 },
  138. { DA732X_REG_DAC2_R_VOL , 0x00 },
  139. { DA732X_REG_DAC2_SEL , 0x00 },
  140. { DA732X_REG_DAC2_SOFTMUTE , 0x00 },
  141. { DA732X_REG_DAC2_EQ12 , 0x00 },
  142. { DA732X_REG_DAC2_EQ34 , 0x00 },
  143. { DA732X_REG_DAC2_EQ5 , 0x00 },
  144. { DA732X_REG_DAC3_HPF , 0x00 },
  145. { DA732X_REG_DAC3_VOL , 0x00 },
  146. { DA732X_REG_DAC3_SEL , 0x00 },
  147. { DA732X_REG_DAC3_SOFTMUTE , 0x00 },
  148. { DA732X_REG_DAC3_EQ12 , 0x00 },
  149. { DA732X_REG_DAC3_EQ34 , 0x00 },
  150. { DA732X_REG_DAC3_EQ5 , 0x00 },
  151. { DA732X_REG_BIQ_BYP , 0x00 },
  152. { DA732X_REG_DMA_CMD , 0x00 },
  153. { DA732X_REG_DMA_ADDR0 , 0x00 },
  154. { DA732X_REG_DMA_ADDR1 , 0x00 },
  155. { DA732X_REG_DMA_DATA0 , 0x00 },
  156. { DA732X_REG_DMA_DATA1 , 0x00 },
  157. { DA732X_REG_DMA_DATA2 , 0x00 },
  158. { DA732X_REG_DMA_DATA3 , 0x00 },
  159. { DA732X_REG_UNLOCK , 0x00 },
  160. };
  161. static inline int da732x_get_input_div(struct snd_soc_component *component, int sysclk)
  162. {
  163. int val;
  164. if (sysclk < DA732X_MCLK_10MHZ) {
  165. val = DA732X_MCLK_VAL_0_10MHZ;
  166. } else if ((sysclk >= DA732X_MCLK_10MHZ) &&
  167. (sysclk < DA732X_MCLK_20MHZ)) {
  168. val = DA732X_MCLK_VAL_10_20MHZ;
  169. } else if ((sysclk >= DA732X_MCLK_20MHZ) &&
  170. (sysclk < DA732X_MCLK_40MHZ)) {
  171. val = DA732X_MCLK_VAL_20_40MHZ;
  172. } else if ((sysclk >= DA732X_MCLK_40MHZ) &&
  173. (sysclk <= DA732X_MCLK_54MHZ)) {
  174. val = DA732X_MCLK_VAL_40_54MHZ;
  175. } else {
  176. return -EINVAL;
  177. }
  178. snd_soc_component_write(component, DA732X_REG_PLL_CTRL, val);
  179. return val;
  180. }
  181. static void da732x_set_charge_pump(struct snd_soc_component *component, int state)
  182. {
  183. switch (state) {
  184. case DA732X_ENABLE_CP:
  185. snd_soc_component_write(component, DA732X_REG_CLK_EN2, DA732X_CP_CLK_EN);
  186. snd_soc_component_write(component, DA732X_REG_CP_HP2, DA732X_HP_CP_EN |
  187. DA732X_HP_CP_REG | DA732X_HP_CP_PULSESKIP);
  188. snd_soc_component_write(component, DA732X_REG_CP_CTRL1, DA732X_CP_EN |
  189. DA732X_CP_CTRL_CPVDD1);
  190. snd_soc_component_write(component, DA732X_REG_CP_CTRL2,
  191. DA732X_CP_MANAGE_MAGNITUDE | DA732X_CP_BOOST);
  192. snd_soc_component_write(component, DA732X_REG_CP_CTRL3, DA732X_CP_1MHZ);
  193. break;
  194. case DA732X_DISABLE_CP:
  195. snd_soc_component_write(component, DA732X_REG_CLK_EN2, DA732X_CP_CLK_DIS);
  196. snd_soc_component_write(component, DA732X_REG_CP_HP2, DA732X_HP_CP_DIS);
  197. snd_soc_component_write(component, DA732X_REG_CP_CTRL1, DA723X_CP_DIS);
  198. break;
  199. default:
  200. pr_err("Wrong charge pump state\n");
  201. break;
  202. }
  203. }
  204. static const DECLARE_TLV_DB_SCALE(mic_boost_tlv, DA732X_MIC_PRE_VOL_DB_MIN,
  205. DA732X_MIC_PRE_VOL_DB_INC, 0);
  206. static const DECLARE_TLV_DB_SCALE(mic_pga_tlv, DA732X_MIC_VOL_DB_MIN,
  207. DA732X_MIC_VOL_DB_INC, 0);
  208. static const DECLARE_TLV_DB_SCALE(aux_pga_tlv, DA732X_AUX_VOL_DB_MIN,
  209. DA732X_AUX_VOL_DB_INC, 0);
  210. static const DECLARE_TLV_DB_SCALE(hp_pga_tlv, DA732X_HP_VOL_DB_MIN,
  211. DA732X_AUX_VOL_DB_INC, 0);
  212. static const DECLARE_TLV_DB_SCALE(lin2_pga_tlv, DA732X_LIN2_VOL_DB_MIN,
  213. DA732X_LIN2_VOL_DB_INC, 0);
  214. static const DECLARE_TLV_DB_SCALE(lin3_pga_tlv, DA732X_LIN3_VOL_DB_MIN,
  215. DA732X_LIN3_VOL_DB_INC, 0);
  216. static const DECLARE_TLV_DB_SCALE(lin4_pga_tlv, DA732X_LIN4_VOL_DB_MIN,
  217. DA732X_LIN4_VOL_DB_INC, 0);
  218. static const DECLARE_TLV_DB_SCALE(adc_pga_tlv, DA732X_ADC_VOL_DB_MIN,
  219. DA732X_ADC_VOL_DB_INC, 0);
  220. static const DECLARE_TLV_DB_SCALE(dac_pga_tlv, DA732X_DAC_VOL_DB_MIN,
  221. DA732X_DAC_VOL_DB_INC, 0);
  222. static const DECLARE_TLV_DB_SCALE(eq_band_pga_tlv, DA732X_EQ_BAND_VOL_DB_MIN,
  223. DA732X_EQ_BAND_VOL_DB_INC, 0);
  224. static const DECLARE_TLV_DB_SCALE(eq_overall_tlv, DA732X_EQ_OVERALL_VOL_DB_MIN,
  225. DA732X_EQ_OVERALL_VOL_DB_INC, 0);
  226. /* High Pass Filter */
  227. static const char *da732x_hpf_mode[] = {
  228. "Disable", "Music", "Voice",
  229. };
  230. static const char *da732x_hpf_music[] = {
  231. "1.8Hz", "3.75Hz", "7.5Hz", "15Hz",
  232. };
  233. static const char *da732x_hpf_voice[] = {
  234. "2.5Hz", "25Hz", "50Hz", "100Hz",
  235. "150Hz", "200Hz", "300Hz", "400Hz"
  236. };
  237. static SOC_ENUM_SINGLE_DECL(da732x_dac1_hpf_mode_enum,
  238. DA732X_REG_DAC1_HPF, DA732X_HPF_MODE_SHIFT,
  239. da732x_hpf_mode);
  240. static SOC_ENUM_SINGLE_DECL(da732x_dac2_hpf_mode_enum,
  241. DA732X_REG_DAC2_HPF, DA732X_HPF_MODE_SHIFT,
  242. da732x_hpf_mode);
  243. static SOC_ENUM_SINGLE_DECL(da732x_dac3_hpf_mode_enum,
  244. DA732X_REG_DAC3_HPF, DA732X_HPF_MODE_SHIFT,
  245. da732x_hpf_mode);
  246. static SOC_ENUM_SINGLE_DECL(da732x_adc1_hpf_mode_enum,
  247. DA732X_REG_ADC1_HPF, DA732X_HPF_MODE_SHIFT,
  248. da732x_hpf_mode);
  249. static SOC_ENUM_SINGLE_DECL(da732x_adc2_hpf_mode_enum,
  250. DA732X_REG_ADC2_HPF, DA732X_HPF_MODE_SHIFT,
  251. da732x_hpf_mode);
  252. static SOC_ENUM_SINGLE_DECL(da732x_dac1_hp_filter_enum,
  253. DA732X_REG_DAC1_HPF, DA732X_HPF_MUSIC_SHIFT,
  254. da732x_hpf_music);
  255. static SOC_ENUM_SINGLE_DECL(da732x_dac2_hp_filter_enum,
  256. DA732X_REG_DAC2_HPF, DA732X_HPF_MUSIC_SHIFT,
  257. da732x_hpf_music);
  258. static SOC_ENUM_SINGLE_DECL(da732x_dac3_hp_filter_enum,
  259. DA732X_REG_DAC3_HPF, DA732X_HPF_MUSIC_SHIFT,
  260. da732x_hpf_music);
  261. static SOC_ENUM_SINGLE_DECL(da732x_adc1_hp_filter_enum,
  262. DA732X_REG_ADC1_HPF, DA732X_HPF_MUSIC_SHIFT,
  263. da732x_hpf_music);
  264. static SOC_ENUM_SINGLE_DECL(da732x_adc2_hp_filter_enum,
  265. DA732X_REG_ADC2_HPF, DA732X_HPF_MUSIC_SHIFT,
  266. da732x_hpf_music);
  267. static SOC_ENUM_SINGLE_DECL(da732x_dac1_voice_filter_enum,
  268. DA732X_REG_DAC1_HPF, DA732X_HPF_VOICE_SHIFT,
  269. da732x_hpf_voice);
  270. static SOC_ENUM_SINGLE_DECL(da732x_dac2_voice_filter_enum,
  271. DA732X_REG_DAC2_HPF, DA732X_HPF_VOICE_SHIFT,
  272. da732x_hpf_voice);
  273. static SOC_ENUM_SINGLE_DECL(da732x_dac3_voice_filter_enum,
  274. DA732X_REG_DAC3_HPF, DA732X_HPF_VOICE_SHIFT,
  275. da732x_hpf_voice);
  276. static SOC_ENUM_SINGLE_DECL(da732x_adc1_voice_filter_enum,
  277. DA732X_REG_ADC1_HPF, DA732X_HPF_VOICE_SHIFT,
  278. da732x_hpf_voice);
  279. static SOC_ENUM_SINGLE_DECL(da732x_adc2_voice_filter_enum,
  280. DA732X_REG_ADC2_HPF, DA732X_HPF_VOICE_SHIFT,
  281. da732x_hpf_voice);
  282. static int da732x_hpf_set(struct snd_kcontrol *kcontrol,
  283. struct snd_ctl_elem_value *ucontrol)
  284. {
  285. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  286. struct soc_enum *enum_ctrl = (struct soc_enum *)kcontrol->private_value;
  287. unsigned int reg = enum_ctrl->reg;
  288. unsigned int sel = ucontrol->value.enumerated.item[0];
  289. unsigned int bits;
  290. switch (sel) {
  291. case DA732X_HPF_DISABLED:
  292. bits = DA732X_HPF_DIS;
  293. break;
  294. case DA732X_HPF_VOICE:
  295. bits = DA732X_HPF_VOICE_EN;
  296. break;
  297. case DA732X_HPF_MUSIC:
  298. bits = DA732X_HPF_MUSIC_EN;
  299. break;
  300. default:
  301. return -EINVAL;
  302. }
  303. snd_soc_component_update_bits(component, reg, DA732X_HPF_MASK, bits);
  304. return 0;
  305. }
  306. static int da732x_hpf_get(struct snd_kcontrol *kcontrol,
  307. struct snd_ctl_elem_value *ucontrol)
  308. {
  309. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  310. struct soc_enum *enum_ctrl = (struct soc_enum *)kcontrol->private_value;
  311. unsigned int reg = enum_ctrl->reg;
  312. int val;
  313. val = snd_soc_component_read(component, reg) & DA732X_HPF_MASK;
  314. switch (val) {
  315. case DA732X_HPF_VOICE_EN:
  316. ucontrol->value.enumerated.item[0] = DA732X_HPF_VOICE;
  317. break;
  318. case DA732X_HPF_MUSIC_EN:
  319. ucontrol->value.enumerated.item[0] = DA732X_HPF_MUSIC;
  320. break;
  321. default:
  322. ucontrol->value.enumerated.item[0] = DA732X_HPF_DISABLED;
  323. break;
  324. }
  325. return 0;
  326. }
  327. static const struct snd_kcontrol_new da732x_snd_controls[] = {
  328. /* Input PGAs */
  329. SOC_SINGLE_RANGE_TLV("MIC1 Boost Volume", DA732X_REG_MIC1_PRE,
  330. DA732X_MICBOOST_SHIFT, DA732X_MICBOOST_MIN,
  331. DA732X_MICBOOST_MAX, 0, mic_boost_tlv),
  332. SOC_SINGLE_RANGE_TLV("MIC2 Boost Volume", DA732X_REG_MIC2_PRE,
  333. DA732X_MICBOOST_SHIFT, DA732X_MICBOOST_MIN,
  334. DA732X_MICBOOST_MAX, 0, mic_boost_tlv),
  335. SOC_SINGLE_RANGE_TLV("MIC3 Boost Volume", DA732X_REG_MIC3_PRE,
  336. DA732X_MICBOOST_SHIFT, DA732X_MICBOOST_MIN,
  337. DA732X_MICBOOST_MAX, 0, mic_boost_tlv),
  338. /* MICs */
  339. SOC_SINGLE("MIC1 Switch", DA732X_REG_MIC1, DA732X_MIC_MUTE_SHIFT,
  340. DA732X_SWITCH_MAX, DA732X_INVERT),
  341. SOC_SINGLE_RANGE_TLV("MIC1 Volume", DA732X_REG_MIC1,
  342. DA732X_MIC_VOL_SHIFT, DA732X_MIC_VOL_VAL_MIN,
  343. DA732X_MIC_VOL_VAL_MAX, 0, mic_pga_tlv),
  344. SOC_SINGLE("MIC2 Switch", DA732X_REG_MIC2, DA732X_MIC_MUTE_SHIFT,
  345. DA732X_SWITCH_MAX, DA732X_INVERT),
  346. SOC_SINGLE_RANGE_TLV("MIC2 Volume", DA732X_REG_MIC2,
  347. DA732X_MIC_VOL_SHIFT, DA732X_MIC_VOL_VAL_MIN,
  348. DA732X_MIC_VOL_VAL_MAX, 0, mic_pga_tlv),
  349. SOC_SINGLE("MIC3 Switch", DA732X_REG_MIC3, DA732X_MIC_MUTE_SHIFT,
  350. DA732X_SWITCH_MAX, DA732X_INVERT),
  351. SOC_SINGLE_RANGE_TLV("MIC3 Volume", DA732X_REG_MIC3,
  352. DA732X_MIC_VOL_SHIFT, DA732X_MIC_VOL_VAL_MIN,
  353. DA732X_MIC_VOL_VAL_MAX, 0, mic_pga_tlv),
  354. /* AUXs */
  355. SOC_SINGLE("AUX1L Switch", DA732X_REG_AUX1L, DA732X_AUX_MUTE_SHIFT,
  356. DA732X_SWITCH_MAX, DA732X_INVERT),
  357. SOC_SINGLE_TLV("AUX1L Volume", DA732X_REG_AUX1L,
  358. DA732X_AUX_VOL_SHIFT, DA732X_AUX_VOL_VAL_MAX,
  359. DA732X_NO_INVERT, aux_pga_tlv),
  360. SOC_SINGLE("AUX1R Switch", DA732X_REG_AUX1R, DA732X_AUX_MUTE_SHIFT,
  361. DA732X_SWITCH_MAX, DA732X_INVERT),
  362. SOC_SINGLE_TLV("AUX1R Volume", DA732X_REG_AUX1R,
  363. DA732X_AUX_VOL_SHIFT, DA732X_AUX_VOL_VAL_MAX,
  364. DA732X_NO_INVERT, aux_pga_tlv),
  365. /* ADCs */
  366. SOC_DOUBLE_TLV("ADC1 Volume", DA732X_REG_ADC1_SEL,
  367. DA732X_ADCL_VOL_SHIFT, DA732X_ADCR_VOL_SHIFT,
  368. DA732X_ADC_VOL_VAL_MAX, DA732X_INVERT, adc_pga_tlv),
  369. SOC_DOUBLE_TLV("ADC2 Volume", DA732X_REG_ADC2_SEL,
  370. DA732X_ADCL_VOL_SHIFT, DA732X_ADCR_VOL_SHIFT,
  371. DA732X_ADC_VOL_VAL_MAX, DA732X_INVERT, adc_pga_tlv),
  372. /* DACs */
  373. SOC_DOUBLE("Digital Playback DAC12 Switch", DA732X_REG_DAC1_SEL,
  374. DA732X_DACL_MUTE_SHIFT, DA732X_DACR_MUTE_SHIFT,
  375. DA732X_SWITCH_MAX, DA732X_INVERT),
  376. SOC_DOUBLE_R_TLV("Digital Playback DAC12 Volume", DA732X_REG_DAC1_L_VOL,
  377. DA732X_REG_DAC1_R_VOL, DA732X_DAC_VOL_SHIFT,
  378. DA732X_DAC_VOL_VAL_MAX, DA732X_INVERT, dac_pga_tlv),
  379. SOC_SINGLE("Digital Playback DAC3 Switch", DA732X_REG_DAC2_SEL,
  380. DA732X_DACL_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT),
  381. SOC_SINGLE_TLV("Digital Playback DAC3 Volume", DA732X_REG_DAC2_L_VOL,
  382. DA732X_DAC_VOL_SHIFT, DA732X_DAC_VOL_VAL_MAX,
  383. DA732X_INVERT, dac_pga_tlv),
  384. SOC_SINGLE("Digital Playback DAC4 Switch", DA732X_REG_DAC2_SEL,
  385. DA732X_DACR_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT),
  386. SOC_SINGLE_TLV("Digital Playback DAC4 Volume", DA732X_REG_DAC2_R_VOL,
  387. DA732X_DAC_VOL_SHIFT, DA732X_DAC_VOL_VAL_MAX,
  388. DA732X_INVERT, dac_pga_tlv),
  389. SOC_SINGLE("Digital Playback DAC5 Switch", DA732X_REG_DAC3_SEL,
  390. DA732X_DACL_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT),
  391. SOC_SINGLE_TLV("Digital Playback DAC5 Volume", DA732X_REG_DAC3_VOL,
  392. DA732X_DAC_VOL_SHIFT, DA732X_DAC_VOL_VAL_MAX,
  393. DA732X_INVERT, dac_pga_tlv),
  394. /* High Pass Filters */
  395. SOC_ENUM_EXT("DAC1 High Pass Filter Mode",
  396. da732x_dac1_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set),
  397. SOC_ENUM("DAC1 High Pass Filter", da732x_dac1_hp_filter_enum),
  398. SOC_ENUM("DAC1 Voice Filter", da732x_dac1_voice_filter_enum),
  399. SOC_ENUM_EXT("DAC2 High Pass Filter Mode",
  400. da732x_dac2_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set),
  401. SOC_ENUM("DAC2 High Pass Filter", da732x_dac2_hp_filter_enum),
  402. SOC_ENUM("DAC2 Voice Filter", da732x_dac2_voice_filter_enum),
  403. SOC_ENUM_EXT("DAC3 High Pass Filter Mode",
  404. da732x_dac3_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set),
  405. SOC_ENUM("DAC3 High Pass Filter", da732x_dac3_hp_filter_enum),
  406. SOC_ENUM("DAC3 Filter Mode", da732x_dac3_voice_filter_enum),
  407. SOC_ENUM_EXT("ADC1 High Pass Filter Mode",
  408. da732x_adc1_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set),
  409. SOC_ENUM("ADC1 High Pass Filter", da732x_adc1_hp_filter_enum),
  410. SOC_ENUM("ADC1 Voice Filter", da732x_adc1_voice_filter_enum),
  411. SOC_ENUM_EXT("ADC2 High Pass Filter Mode",
  412. da732x_adc2_hpf_mode_enum, da732x_hpf_get, da732x_hpf_set),
  413. SOC_ENUM("ADC2 High Pass Filter", da732x_adc2_hp_filter_enum),
  414. SOC_ENUM("ADC2 Voice Filter", da732x_adc2_voice_filter_enum),
  415. /* Equalizers */
  416. SOC_SINGLE("ADC1 EQ Switch", DA732X_REG_ADC1_EQ5,
  417. DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT),
  418. SOC_SINGLE_TLV("ADC1 EQ Band 1 Volume", DA732X_REG_ADC1_EQ12,
  419. DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  420. DA732X_INVERT, eq_band_pga_tlv),
  421. SOC_SINGLE_TLV("ADC1 EQ Band 2 Volume", DA732X_REG_ADC1_EQ12,
  422. DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  423. DA732X_INVERT, eq_band_pga_tlv),
  424. SOC_SINGLE_TLV("ADC1 EQ Band 3 Volume", DA732X_REG_ADC1_EQ34,
  425. DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  426. DA732X_INVERT, eq_band_pga_tlv),
  427. SOC_SINGLE_TLV("ADC1 EQ Band 4 Volume", DA732X_REG_ADC1_EQ34,
  428. DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  429. DA732X_INVERT, eq_band_pga_tlv),
  430. SOC_SINGLE_TLV("ADC1 EQ Band 5 Volume", DA732X_REG_ADC1_EQ5,
  431. DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  432. DA732X_INVERT, eq_band_pga_tlv),
  433. SOC_SINGLE_TLV("ADC1 EQ Overall Volume", DA732X_REG_ADC1_EQ5,
  434. DA732X_EQ_OVERALL_SHIFT, DA732X_EQ_OVERALL_VOL_VAL_MAX,
  435. DA732X_INVERT, eq_overall_tlv),
  436. SOC_SINGLE("ADC2 EQ Switch", DA732X_REG_ADC2_EQ5,
  437. DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT),
  438. SOC_SINGLE_TLV("ADC2 EQ Band 1 Volume", DA732X_REG_ADC2_EQ12,
  439. DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  440. DA732X_INVERT, eq_band_pga_tlv),
  441. SOC_SINGLE_TLV("ADC2 EQ Band 2 Volume", DA732X_REG_ADC2_EQ12,
  442. DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  443. DA732X_INVERT, eq_band_pga_tlv),
  444. SOC_SINGLE_TLV("ADC2 EQ Band 3 Volume", DA732X_REG_ADC2_EQ34,
  445. DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  446. DA732X_INVERT, eq_band_pga_tlv),
  447. SOC_SINGLE_TLV("ACD2 EQ Band 4 Volume", DA732X_REG_ADC2_EQ34,
  448. DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  449. DA732X_INVERT, eq_band_pga_tlv),
  450. SOC_SINGLE_TLV("ACD2 EQ Band 5 Volume", DA732X_REG_ADC2_EQ5,
  451. DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  452. DA732X_INVERT, eq_band_pga_tlv),
  453. SOC_SINGLE_TLV("ADC2 EQ Overall Volume", DA732X_REG_ADC1_EQ5,
  454. DA732X_EQ_OVERALL_SHIFT, DA732X_EQ_OVERALL_VOL_VAL_MAX,
  455. DA732X_INVERT, eq_overall_tlv),
  456. SOC_SINGLE("DAC1 EQ Switch", DA732X_REG_DAC1_EQ5,
  457. DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT),
  458. SOC_SINGLE_TLV("DAC1 EQ Band 1 Volume", DA732X_REG_DAC1_EQ12,
  459. DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  460. DA732X_INVERT, eq_band_pga_tlv),
  461. SOC_SINGLE_TLV("DAC1 EQ Band 2 Volume", DA732X_REG_DAC1_EQ12,
  462. DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  463. DA732X_INVERT, eq_band_pga_tlv),
  464. SOC_SINGLE_TLV("DAC1 EQ Band 3 Volume", DA732X_REG_DAC1_EQ34,
  465. DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  466. DA732X_INVERT, eq_band_pga_tlv),
  467. SOC_SINGLE_TLV("DAC1 EQ Band 4 Volume", DA732X_REG_DAC1_EQ34,
  468. DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  469. DA732X_INVERT, eq_band_pga_tlv),
  470. SOC_SINGLE_TLV("DAC1 EQ Band 5 Volume", DA732X_REG_DAC1_EQ5,
  471. DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  472. DA732X_INVERT, eq_band_pga_tlv),
  473. SOC_SINGLE("DAC2 EQ Switch", DA732X_REG_DAC2_EQ5,
  474. DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT),
  475. SOC_SINGLE_TLV("DAC2 EQ Band 1 Volume", DA732X_REG_DAC2_EQ12,
  476. DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  477. DA732X_INVERT, eq_band_pga_tlv),
  478. SOC_SINGLE_TLV("DAC2 EQ Band 2 Volume", DA732X_REG_DAC2_EQ12,
  479. DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  480. DA732X_INVERT, eq_band_pga_tlv),
  481. SOC_SINGLE_TLV("DAC2 EQ Band 3 Volume", DA732X_REG_DAC2_EQ34,
  482. DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  483. DA732X_INVERT, eq_band_pga_tlv),
  484. SOC_SINGLE_TLV("DAC2 EQ Band 4 Volume", DA732X_REG_DAC2_EQ34,
  485. DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  486. DA732X_INVERT, eq_band_pga_tlv),
  487. SOC_SINGLE_TLV("DAC2 EQ Band 5 Volume", DA732X_REG_DAC2_EQ5,
  488. DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  489. DA732X_INVERT, eq_band_pga_tlv),
  490. SOC_SINGLE("DAC3 EQ Switch", DA732X_REG_DAC3_EQ5,
  491. DA732X_EQ_EN_SHIFT, DA732X_EQ_EN_MAX, DA732X_NO_INVERT),
  492. SOC_SINGLE_TLV("DAC3 EQ Band 1 Volume", DA732X_REG_DAC3_EQ12,
  493. DA732X_EQ_BAND1_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  494. DA732X_INVERT, eq_band_pga_tlv),
  495. SOC_SINGLE_TLV("DAC3 EQ Band 2 Volume", DA732X_REG_DAC3_EQ12,
  496. DA732X_EQ_BAND2_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  497. DA732X_INVERT, eq_band_pga_tlv),
  498. SOC_SINGLE_TLV("DAC3 EQ Band 3 Volume", DA732X_REG_DAC3_EQ34,
  499. DA732X_EQ_BAND3_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  500. DA732X_INVERT, eq_band_pga_tlv),
  501. SOC_SINGLE_TLV("DAC3 EQ Band 4 Volume", DA732X_REG_DAC3_EQ34,
  502. DA732X_EQ_BAND4_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  503. DA732X_INVERT, eq_band_pga_tlv),
  504. SOC_SINGLE_TLV("DAC3 EQ Band 5 Volume", DA732X_REG_DAC3_EQ5,
  505. DA732X_EQ_BAND5_SHIFT, DA732X_EQ_VOL_VAL_MAX,
  506. DA732X_INVERT, eq_band_pga_tlv),
  507. /* Lineout 2 Reciever*/
  508. SOC_SINGLE("Lineout 2 Switch", DA732X_REG_LIN2, DA732X_LOUT_MUTE_SHIFT,
  509. DA732X_SWITCH_MAX, DA732X_INVERT),
  510. SOC_SINGLE_TLV("Lineout 2 Volume", DA732X_REG_LIN2,
  511. DA732X_LOUT_VOL_SHIFT, DA732X_LOUT_VOL_VAL_MAX,
  512. DA732X_NO_INVERT, lin2_pga_tlv),
  513. /* Lineout 3 SPEAKER*/
  514. SOC_SINGLE("Lineout 3 Switch", DA732X_REG_LIN3, DA732X_LOUT_MUTE_SHIFT,
  515. DA732X_SWITCH_MAX, DA732X_INVERT),
  516. SOC_SINGLE_TLV("Lineout 3 Volume", DA732X_REG_LIN3,
  517. DA732X_LOUT_VOL_SHIFT, DA732X_LOUT_VOL_VAL_MAX,
  518. DA732X_NO_INVERT, lin3_pga_tlv),
  519. /* Lineout 4 */
  520. SOC_SINGLE("Lineout 4 Switch", DA732X_REG_LIN4, DA732X_LOUT_MUTE_SHIFT,
  521. DA732X_SWITCH_MAX, DA732X_INVERT),
  522. SOC_SINGLE_TLV("Lineout 4 Volume", DA732X_REG_LIN4,
  523. DA732X_LOUT_VOL_SHIFT, DA732X_LOUT_VOL_VAL_MAX,
  524. DA732X_NO_INVERT, lin4_pga_tlv),
  525. /* Headphones */
  526. SOC_DOUBLE_R("Headphone Switch", DA732X_REG_HPR, DA732X_REG_HPL,
  527. DA732X_HP_MUTE_SHIFT, DA732X_SWITCH_MAX, DA732X_INVERT),
  528. SOC_DOUBLE_R_TLV("Headphone Volume", DA732X_REG_HPL_VOL,
  529. DA732X_REG_HPR_VOL, DA732X_HP_VOL_SHIFT,
  530. DA732X_HP_VOL_VAL_MAX, DA732X_NO_INVERT, hp_pga_tlv),
  531. };
  532. static int da732x_adc_event(struct snd_soc_dapm_widget *w,
  533. struct snd_kcontrol *kcontrol, int event)
  534. {
  535. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  536. switch (event) {
  537. case SND_SOC_DAPM_POST_PMU:
  538. switch (w->reg) {
  539. case DA732X_REG_ADC1_PD:
  540. snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3,
  541. DA732X_ADCA_BB_CLK_EN,
  542. DA732X_ADCA_BB_CLK_EN);
  543. break;
  544. case DA732X_REG_ADC2_PD:
  545. snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3,
  546. DA732X_ADCC_BB_CLK_EN,
  547. DA732X_ADCC_BB_CLK_EN);
  548. break;
  549. default:
  550. return -EINVAL;
  551. }
  552. snd_soc_component_update_bits(component, w->reg, DA732X_ADC_RST_MASK,
  553. DA732X_ADC_SET_ACT);
  554. snd_soc_component_update_bits(component, w->reg, DA732X_ADC_PD_MASK,
  555. DA732X_ADC_ON);
  556. break;
  557. case SND_SOC_DAPM_POST_PMD:
  558. snd_soc_component_update_bits(component, w->reg, DA732X_ADC_PD_MASK,
  559. DA732X_ADC_OFF);
  560. snd_soc_component_update_bits(component, w->reg, DA732X_ADC_RST_MASK,
  561. DA732X_ADC_SET_RST);
  562. switch (w->reg) {
  563. case DA732X_REG_ADC1_PD:
  564. snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3,
  565. DA732X_ADCA_BB_CLK_EN, 0);
  566. break;
  567. case DA732X_REG_ADC2_PD:
  568. snd_soc_component_update_bits(component, DA732X_REG_CLK_EN3,
  569. DA732X_ADCC_BB_CLK_EN, 0);
  570. break;
  571. default:
  572. return -EINVAL;
  573. }
  574. break;
  575. default:
  576. return -EINVAL;
  577. }
  578. return 0;
  579. }
  580. static int da732x_out_pga_event(struct snd_soc_dapm_widget *w,
  581. struct snd_kcontrol *kcontrol, int event)
  582. {
  583. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  584. switch (event) {
  585. case SND_SOC_DAPM_POST_PMU:
  586. snd_soc_component_update_bits(component, w->reg,
  587. (1 << w->shift) | DA732X_OUT_HIZ_EN,
  588. (1 << w->shift) | DA732X_OUT_HIZ_EN);
  589. break;
  590. case SND_SOC_DAPM_POST_PMD:
  591. snd_soc_component_update_bits(component, w->reg,
  592. (1 << w->shift) | DA732X_OUT_HIZ_EN,
  593. (1 << w->shift) | DA732X_OUT_HIZ_DIS);
  594. break;
  595. default:
  596. return -EINVAL;
  597. }
  598. return 0;
  599. }
  600. static const char *adcl_text[] = {
  601. "AUX1L", "MIC1"
  602. };
  603. static const char *adcr_text[] = {
  604. "AUX1R", "MIC2", "MIC3"
  605. };
  606. static const char *enable_text[] = {
  607. "Disabled",
  608. "Enabled"
  609. };
  610. /* ADC1LMUX */
  611. static SOC_ENUM_SINGLE_DECL(adc1l_enum,
  612. DA732X_REG_INP_MUX, DA732X_ADC1L_MUX_SEL_SHIFT,
  613. adcl_text);
  614. static const struct snd_kcontrol_new adc1l_mux =
  615. SOC_DAPM_ENUM("ADC Route", adc1l_enum);
  616. /* ADC1RMUX */
  617. static SOC_ENUM_SINGLE_DECL(adc1r_enum,
  618. DA732X_REG_INP_MUX, DA732X_ADC1R_MUX_SEL_SHIFT,
  619. adcr_text);
  620. static const struct snd_kcontrol_new adc1r_mux =
  621. SOC_DAPM_ENUM("ADC Route", adc1r_enum);
  622. /* ADC2LMUX */
  623. static SOC_ENUM_SINGLE_DECL(adc2l_enum,
  624. DA732X_REG_INP_MUX, DA732X_ADC2L_MUX_SEL_SHIFT,
  625. adcl_text);
  626. static const struct snd_kcontrol_new adc2l_mux =
  627. SOC_DAPM_ENUM("ADC Route", adc2l_enum);
  628. /* ADC2RMUX */
  629. static SOC_ENUM_SINGLE_DECL(adc2r_enum,
  630. DA732X_REG_INP_MUX, DA732X_ADC2R_MUX_SEL_SHIFT,
  631. adcr_text);
  632. static const struct snd_kcontrol_new adc2r_mux =
  633. SOC_DAPM_ENUM("ADC Route", adc2r_enum);
  634. static SOC_ENUM_SINGLE_DECL(da732x_hp_left_output,
  635. DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN_SHIFT,
  636. enable_text);
  637. static const struct snd_kcontrol_new hpl_mux =
  638. SOC_DAPM_ENUM("HPL Switch", da732x_hp_left_output);
  639. static SOC_ENUM_SINGLE_DECL(da732x_hp_right_output,
  640. DA732X_REG_HPR, DA732X_HP_OUT_DAC_EN_SHIFT,
  641. enable_text);
  642. static const struct snd_kcontrol_new hpr_mux =
  643. SOC_DAPM_ENUM("HPR Switch", da732x_hp_right_output);
  644. static SOC_ENUM_SINGLE_DECL(da732x_speaker_output,
  645. DA732X_REG_LIN3, DA732X_LOUT_DAC_EN_SHIFT,
  646. enable_text);
  647. static const struct snd_kcontrol_new spk_mux =
  648. SOC_DAPM_ENUM("SPK Switch", da732x_speaker_output);
  649. static SOC_ENUM_SINGLE_DECL(da732x_lout4_output,
  650. DA732X_REG_LIN4, DA732X_LOUT_DAC_EN_SHIFT,
  651. enable_text);
  652. static const struct snd_kcontrol_new lout4_mux =
  653. SOC_DAPM_ENUM("LOUT4 Switch", da732x_lout4_output);
  654. static SOC_ENUM_SINGLE_DECL(da732x_lout2_output,
  655. DA732X_REG_LIN2, DA732X_LOUT_DAC_EN_SHIFT,
  656. enable_text);
  657. static const struct snd_kcontrol_new lout2_mux =
  658. SOC_DAPM_ENUM("LOUT2 Switch", da732x_lout2_output);
  659. static const struct snd_soc_dapm_widget da732x_dapm_widgets[] = {
  660. /* Supplies */
  661. SND_SOC_DAPM_SUPPLY("ADC1 Supply", DA732X_REG_ADC1_PD, 0,
  662. DA732X_NO_INVERT, da732x_adc_event,
  663. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  664. SND_SOC_DAPM_SUPPLY("ADC2 Supply", DA732X_REG_ADC2_PD, 0,
  665. DA732X_NO_INVERT, da732x_adc_event,
  666. SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
  667. SND_SOC_DAPM_SUPPLY("DAC1 CLK", DA732X_REG_CLK_EN4,
  668. DA732X_DACA_BB_CLK_SHIFT, DA732X_NO_INVERT,
  669. NULL, 0),
  670. SND_SOC_DAPM_SUPPLY("DAC2 CLK", DA732X_REG_CLK_EN4,
  671. DA732X_DACC_BB_CLK_SHIFT, DA732X_NO_INVERT,
  672. NULL, 0),
  673. SND_SOC_DAPM_SUPPLY("DAC3 CLK", DA732X_REG_CLK_EN5,
  674. DA732X_DACE_BB_CLK_SHIFT, DA732X_NO_INVERT,
  675. NULL, 0),
  676. /* Micbias */
  677. SND_SOC_DAPM_SUPPLY("MICBIAS1", DA732X_REG_MICBIAS1,
  678. DA732X_MICBIAS_EN_SHIFT,
  679. DA732X_NO_INVERT, NULL, 0),
  680. SND_SOC_DAPM_SUPPLY("MICBIAS2", DA732X_REG_MICBIAS2,
  681. DA732X_MICBIAS_EN_SHIFT,
  682. DA732X_NO_INVERT, NULL, 0),
  683. /* Inputs */
  684. SND_SOC_DAPM_INPUT("MIC1"),
  685. SND_SOC_DAPM_INPUT("MIC2"),
  686. SND_SOC_DAPM_INPUT("MIC3"),
  687. SND_SOC_DAPM_INPUT("AUX1L"),
  688. SND_SOC_DAPM_INPUT("AUX1R"),
  689. /* Outputs */
  690. SND_SOC_DAPM_OUTPUT("HPL"),
  691. SND_SOC_DAPM_OUTPUT("HPR"),
  692. SND_SOC_DAPM_OUTPUT("LOUTL"),
  693. SND_SOC_DAPM_OUTPUT("LOUTR"),
  694. SND_SOC_DAPM_OUTPUT("ClassD"),
  695. /* ADCs */
  696. SND_SOC_DAPM_ADC("ADC1L", NULL, DA732X_REG_ADC1_SEL,
  697. DA732X_ADCL_EN_SHIFT, DA732X_NO_INVERT),
  698. SND_SOC_DAPM_ADC("ADC1R", NULL, DA732X_REG_ADC1_SEL,
  699. DA732X_ADCR_EN_SHIFT, DA732X_NO_INVERT),
  700. SND_SOC_DAPM_ADC("ADC2L", NULL, DA732X_REG_ADC2_SEL,
  701. DA732X_ADCL_EN_SHIFT, DA732X_NO_INVERT),
  702. SND_SOC_DAPM_ADC("ADC2R", NULL, DA732X_REG_ADC2_SEL,
  703. DA732X_ADCR_EN_SHIFT, DA732X_NO_INVERT),
  704. /* DACs */
  705. SND_SOC_DAPM_DAC("DAC1L", NULL, DA732X_REG_DAC1_SEL,
  706. DA732X_DACL_EN_SHIFT, DA732X_NO_INVERT),
  707. SND_SOC_DAPM_DAC("DAC1R", NULL, DA732X_REG_DAC1_SEL,
  708. DA732X_DACR_EN_SHIFT, DA732X_NO_INVERT),
  709. SND_SOC_DAPM_DAC("DAC2L", NULL, DA732X_REG_DAC2_SEL,
  710. DA732X_DACL_EN_SHIFT, DA732X_NO_INVERT),
  711. SND_SOC_DAPM_DAC("DAC2R", NULL, DA732X_REG_DAC2_SEL,
  712. DA732X_DACR_EN_SHIFT, DA732X_NO_INVERT),
  713. SND_SOC_DAPM_DAC("DAC3", NULL, DA732X_REG_DAC3_SEL,
  714. DA732X_DACL_EN_SHIFT, DA732X_NO_INVERT),
  715. /* Input Pgas */
  716. SND_SOC_DAPM_PGA("MIC1 PGA", DA732X_REG_MIC1, DA732X_MIC_EN_SHIFT,
  717. 0, NULL, 0),
  718. SND_SOC_DAPM_PGA("MIC2 PGA", DA732X_REG_MIC2, DA732X_MIC_EN_SHIFT,
  719. 0, NULL, 0),
  720. SND_SOC_DAPM_PGA("MIC3 PGA", DA732X_REG_MIC3, DA732X_MIC_EN_SHIFT,
  721. 0, NULL, 0),
  722. SND_SOC_DAPM_PGA("AUX1L PGA", DA732X_REG_AUX1L, DA732X_AUX_EN_SHIFT,
  723. 0, NULL, 0),
  724. SND_SOC_DAPM_PGA("AUX1R PGA", DA732X_REG_AUX1R, DA732X_AUX_EN_SHIFT,
  725. 0, NULL, 0),
  726. SND_SOC_DAPM_PGA_E("HP Left", DA732X_REG_HPL, DA732X_HP_OUT_EN_SHIFT,
  727. 0, NULL, 0, da732x_out_pga_event,
  728. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  729. SND_SOC_DAPM_PGA_E("HP Right", DA732X_REG_HPR, DA732X_HP_OUT_EN_SHIFT,
  730. 0, NULL, 0, da732x_out_pga_event,
  731. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  732. SND_SOC_DAPM_PGA_E("LIN2", DA732X_REG_LIN2, DA732X_LIN_OUT_EN_SHIFT,
  733. 0, NULL, 0, da732x_out_pga_event,
  734. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  735. SND_SOC_DAPM_PGA_E("LIN3", DA732X_REG_LIN3, DA732X_LIN_OUT_EN_SHIFT,
  736. 0, NULL, 0, da732x_out_pga_event,
  737. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  738. SND_SOC_DAPM_PGA_E("LIN4", DA732X_REG_LIN4, DA732X_LIN_OUT_EN_SHIFT,
  739. 0, NULL, 0, da732x_out_pga_event,
  740. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  741. /* MUXs */
  742. SND_SOC_DAPM_MUX("ADC1 Left MUX", SND_SOC_NOPM, 0, 0, &adc1l_mux),
  743. SND_SOC_DAPM_MUX("ADC1 Right MUX", SND_SOC_NOPM, 0, 0, &adc1r_mux),
  744. SND_SOC_DAPM_MUX("ADC2 Left MUX", SND_SOC_NOPM, 0, 0, &adc2l_mux),
  745. SND_SOC_DAPM_MUX("ADC2 Right MUX", SND_SOC_NOPM, 0, 0, &adc2r_mux),
  746. SND_SOC_DAPM_MUX("HP Left MUX", SND_SOC_NOPM, 0, 0, &hpl_mux),
  747. SND_SOC_DAPM_MUX("HP Right MUX", SND_SOC_NOPM, 0, 0, &hpr_mux),
  748. SND_SOC_DAPM_MUX("Speaker MUX", SND_SOC_NOPM, 0, 0, &spk_mux),
  749. SND_SOC_DAPM_MUX("LOUT2 MUX", SND_SOC_NOPM, 0, 0, &lout2_mux),
  750. SND_SOC_DAPM_MUX("LOUT4 MUX", SND_SOC_NOPM, 0, 0, &lout4_mux),
  751. /* AIF interfaces */
  752. SND_SOC_DAPM_AIF_OUT("AIFA Output", "AIFA Capture", 0, DA732X_REG_AIFA3,
  753. DA732X_AIF_EN_SHIFT, 0),
  754. SND_SOC_DAPM_AIF_IN("AIFA Input", "AIFA Playback", 0, DA732X_REG_AIFA3,
  755. DA732X_AIF_EN_SHIFT, 0),
  756. SND_SOC_DAPM_AIF_OUT("AIFB Output", "AIFB Capture", 0, DA732X_REG_AIFB3,
  757. DA732X_AIF_EN_SHIFT, 0),
  758. SND_SOC_DAPM_AIF_IN("AIFB Input", "AIFB Playback", 0, DA732X_REG_AIFB3,
  759. DA732X_AIF_EN_SHIFT, 0),
  760. };
  761. static const struct snd_soc_dapm_route da732x_dapm_routes[] = {
  762. /* Inputs */
  763. {"AUX1L PGA", NULL, "AUX1L"},
  764. {"AUX1R PGA", NULL, "AUX1R"},
  765. {"MIC1 PGA", NULL, "MIC1"},
  766. {"MIC2 PGA", NULL, "MIC2"},
  767. {"MIC3 PGA", NULL, "MIC3"},
  768. /* Capture Path */
  769. {"ADC1 Left MUX", "MIC1", "MIC1 PGA"},
  770. {"ADC1 Left MUX", "AUX1L", "AUX1L PGA"},
  771. {"ADC1 Right MUX", "AUX1R", "AUX1R PGA"},
  772. {"ADC1 Right MUX", "MIC2", "MIC2 PGA"},
  773. {"ADC1 Right MUX", "MIC3", "MIC3 PGA"},
  774. {"ADC2 Left MUX", "AUX1L", "AUX1L PGA"},
  775. {"ADC2 Left MUX", "MIC1", "MIC1 PGA"},
  776. {"ADC2 Right MUX", "AUX1R", "AUX1R PGA"},
  777. {"ADC2 Right MUX", "MIC2", "MIC2 PGA"},
  778. {"ADC2 Right MUX", "MIC3", "MIC3 PGA"},
  779. {"ADC1L", NULL, "ADC1 Supply"},
  780. {"ADC1R", NULL, "ADC1 Supply"},
  781. {"ADC2L", NULL, "ADC2 Supply"},
  782. {"ADC2R", NULL, "ADC2 Supply"},
  783. {"ADC1L", NULL, "ADC1 Left MUX"},
  784. {"ADC1R", NULL, "ADC1 Right MUX"},
  785. {"ADC2L", NULL, "ADC2 Left MUX"},
  786. {"ADC2R", NULL, "ADC2 Right MUX"},
  787. {"AIFA Output", NULL, "ADC1L"},
  788. {"AIFA Output", NULL, "ADC1R"},
  789. {"AIFB Output", NULL, "ADC2L"},
  790. {"AIFB Output", NULL, "ADC2R"},
  791. {"HP Left MUX", "Enabled", "AIFA Input"},
  792. {"HP Right MUX", "Enabled", "AIFA Input"},
  793. {"Speaker MUX", "Enabled", "AIFB Input"},
  794. {"LOUT2 MUX", "Enabled", "AIFB Input"},
  795. {"LOUT4 MUX", "Enabled", "AIFB Input"},
  796. {"DAC1L", NULL, "DAC1 CLK"},
  797. {"DAC1R", NULL, "DAC1 CLK"},
  798. {"DAC2L", NULL, "DAC2 CLK"},
  799. {"DAC2R", NULL, "DAC2 CLK"},
  800. {"DAC3", NULL, "DAC3 CLK"},
  801. {"DAC1L", NULL, "HP Left MUX"},
  802. {"DAC1R", NULL, "HP Right MUX"},
  803. {"DAC2L", NULL, "Speaker MUX"},
  804. {"DAC2R", NULL, "LOUT4 MUX"},
  805. {"DAC3", NULL, "LOUT2 MUX"},
  806. /* Output Pgas */
  807. {"HP Left", NULL, "DAC1L"},
  808. {"HP Right", NULL, "DAC1R"},
  809. {"LIN3", NULL, "DAC2L"},
  810. {"LIN4", NULL, "DAC2R"},
  811. {"LIN2", NULL, "DAC3"},
  812. /* Outputs */
  813. {"ClassD", NULL, "LIN3"},
  814. {"LOUTL", NULL, "LIN2"},
  815. {"LOUTR", NULL, "LIN4"},
  816. {"HPL", NULL, "HP Left"},
  817. {"HPR", NULL, "HP Right"},
  818. };
  819. static int da732x_hw_params(struct snd_pcm_substream *substream,
  820. struct snd_pcm_hw_params *params,
  821. struct snd_soc_dai *dai)
  822. {
  823. struct snd_soc_component *component = dai->component;
  824. u32 aif = 0;
  825. u32 reg_aif;
  826. u32 fs;
  827. reg_aif = dai->driver->base;
  828. switch (params_width(params)) {
  829. case 16:
  830. aif |= DA732X_AIF_WORD_16;
  831. break;
  832. case 20:
  833. aif |= DA732X_AIF_WORD_20;
  834. break;
  835. case 24:
  836. aif |= DA732X_AIF_WORD_24;
  837. break;
  838. case 32:
  839. aif |= DA732X_AIF_WORD_32;
  840. break;
  841. default:
  842. return -EINVAL;
  843. }
  844. switch (params_rate(params)) {
  845. case 8000:
  846. fs = DA732X_SR_8KHZ;
  847. break;
  848. case 11025:
  849. fs = DA732X_SR_11_025KHZ;
  850. break;
  851. case 12000:
  852. fs = DA732X_SR_12KHZ;
  853. break;
  854. case 16000:
  855. fs = DA732X_SR_16KHZ;
  856. break;
  857. case 22050:
  858. fs = DA732X_SR_22_05KHZ;
  859. break;
  860. case 24000:
  861. fs = DA732X_SR_24KHZ;
  862. break;
  863. case 32000:
  864. fs = DA732X_SR_32KHZ;
  865. break;
  866. case 44100:
  867. fs = DA732X_SR_44_1KHZ;
  868. break;
  869. case 48000:
  870. fs = DA732X_SR_48KHZ;
  871. break;
  872. case 88100:
  873. fs = DA732X_SR_88_1KHZ;
  874. break;
  875. case 96000:
  876. fs = DA732X_SR_96KHZ;
  877. break;
  878. default:
  879. return -EINVAL;
  880. }
  881. snd_soc_component_update_bits(component, reg_aif, DA732X_AIF_WORD_MASK, aif);
  882. snd_soc_component_update_bits(component, DA732X_REG_CLK_CTRL, DA732X_SR1_MASK, fs);
  883. return 0;
  884. }
  885. static int da732x_set_dai_fmt(struct snd_soc_dai *dai, u32 fmt)
  886. {
  887. struct snd_soc_component *component = dai->component;
  888. u32 aif_mclk, pc_count;
  889. u32 reg_aif1, aif1;
  890. u32 reg_aif3, aif3;
  891. switch (dai->id) {
  892. case DA732X_DAI_ID1:
  893. reg_aif1 = DA732X_REG_AIFA1;
  894. reg_aif3 = DA732X_REG_AIFA3;
  895. pc_count = DA732X_PC_PULSE_AIFA | DA732X_PC_RESYNC_NOT_AUT |
  896. DA732X_PC_SAME;
  897. break;
  898. case DA732X_DAI_ID2:
  899. reg_aif1 = DA732X_REG_AIFB1;
  900. reg_aif3 = DA732X_REG_AIFB3;
  901. pc_count = DA732X_PC_PULSE_AIFB | DA732X_PC_RESYNC_NOT_AUT |
  902. DA732X_PC_SAME;
  903. break;
  904. default:
  905. return -EINVAL;
  906. }
  907. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  908. case SND_SOC_DAIFMT_CBS_CFS:
  909. aif1 = DA732X_AIF_SLAVE;
  910. aif_mclk = DA732X_AIFM_FRAME_64 | DA732X_AIFM_SRC_SEL_AIFA;
  911. break;
  912. case SND_SOC_DAIFMT_CBM_CFM:
  913. aif1 = DA732X_AIF_CLK_FROM_SRC;
  914. aif_mclk = DA732X_CLK_GENERATION_AIF_A;
  915. break;
  916. default:
  917. return -EINVAL;
  918. }
  919. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  920. case SND_SOC_DAIFMT_I2S:
  921. aif3 = DA732X_AIF_I2S_MODE;
  922. break;
  923. case SND_SOC_DAIFMT_RIGHT_J:
  924. aif3 = DA732X_AIF_RIGHT_J_MODE;
  925. break;
  926. case SND_SOC_DAIFMT_LEFT_J:
  927. aif3 = DA732X_AIF_LEFT_J_MODE;
  928. break;
  929. case SND_SOC_DAIFMT_DSP_B:
  930. aif3 = DA732X_AIF_DSP_MODE;
  931. break;
  932. default:
  933. return -EINVAL;
  934. }
  935. /* Clock inversion */
  936. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  937. case SND_SOC_DAIFMT_DSP_B:
  938. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  939. case SND_SOC_DAIFMT_NB_NF:
  940. break;
  941. case SND_SOC_DAIFMT_IB_NF:
  942. aif3 |= DA732X_AIF_BCLK_INV;
  943. break;
  944. default:
  945. return -EINVAL;
  946. }
  947. break;
  948. case SND_SOC_DAIFMT_I2S:
  949. case SND_SOC_DAIFMT_RIGHT_J:
  950. case SND_SOC_DAIFMT_LEFT_J:
  951. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  952. case SND_SOC_DAIFMT_NB_NF:
  953. break;
  954. case SND_SOC_DAIFMT_IB_IF:
  955. aif3 |= DA732X_AIF_BCLK_INV | DA732X_AIF_WCLK_INV;
  956. break;
  957. case SND_SOC_DAIFMT_IB_NF:
  958. aif3 |= DA732X_AIF_BCLK_INV;
  959. break;
  960. case SND_SOC_DAIFMT_NB_IF:
  961. aif3 |= DA732X_AIF_WCLK_INV;
  962. break;
  963. default:
  964. return -EINVAL;
  965. }
  966. break;
  967. default:
  968. return -EINVAL;
  969. }
  970. snd_soc_component_write(component, DA732X_REG_AIF_MCLK, aif_mclk);
  971. snd_soc_component_update_bits(component, reg_aif1, DA732X_AIF1_CLK_MASK, aif1);
  972. snd_soc_component_update_bits(component, reg_aif3, DA732X_AIF_BCLK_INV |
  973. DA732X_AIF_WCLK_INV | DA732X_AIF_MODE_MASK, aif3);
  974. snd_soc_component_write(component, DA732X_REG_PC_CTRL, pc_count);
  975. return 0;
  976. }
  977. static int da732x_set_dai_pll(struct snd_soc_component *component, int pll_id,
  978. int source, unsigned int freq_in,
  979. unsigned int freq_out)
  980. {
  981. struct da732x_priv *da732x = snd_soc_component_get_drvdata(component);
  982. int fref, indiv;
  983. u8 div_lo, div_mid, div_hi;
  984. u64 frac_div;
  985. /* Disable PLL */
  986. if (freq_out == 0) {
  987. snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL,
  988. DA732X_PLL_EN, 0);
  989. da732x->pll_en = false;
  990. return 0;
  991. }
  992. if (da732x->pll_en)
  993. return -EBUSY;
  994. if (source == DA732X_SRCCLK_MCLK) {
  995. /* Validate Sysclk rate */
  996. switch (da732x->sysclk) {
  997. case 11290000:
  998. case 12288000:
  999. case 22580000:
  1000. case 24576000:
  1001. case 45160000:
  1002. case 49152000:
  1003. snd_soc_component_write(component, DA732X_REG_PLL_CTRL,
  1004. DA732X_PLL_BYPASS);
  1005. return 0;
  1006. default:
  1007. dev_err(component->dev,
  1008. "Cannot use PLL Bypass, invalid SYSCLK rate\n");
  1009. return -EINVAL;
  1010. }
  1011. }
  1012. indiv = da732x_get_input_div(component, da732x->sysclk);
  1013. if (indiv < 0)
  1014. return indiv;
  1015. fref = da732x->sysclk / BIT(indiv);
  1016. div_hi = freq_out / fref;
  1017. frac_div = (u64)(freq_out % fref) * 8192ULL;
  1018. do_div(frac_div, fref);
  1019. div_mid = (frac_div >> DA732X_1BYTE_SHIFT) & DA732X_U8_MASK;
  1020. div_lo = (frac_div) & DA732X_U8_MASK;
  1021. snd_soc_component_write(component, DA732X_REG_PLL_DIV_LO, div_lo);
  1022. snd_soc_component_write(component, DA732X_REG_PLL_DIV_MID, div_mid);
  1023. snd_soc_component_write(component, DA732X_REG_PLL_DIV_HI, div_hi);
  1024. snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL, DA732X_PLL_EN,
  1025. DA732X_PLL_EN);
  1026. da732x->pll_en = true;
  1027. return 0;
  1028. }
  1029. static int da732x_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
  1030. unsigned int freq, int dir)
  1031. {
  1032. struct snd_soc_component *component = dai->component;
  1033. struct da732x_priv *da732x = snd_soc_component_get_drvdata(component);
  1034. da732x->sysclk = freq;
  1035. return 0;
  1036. }
  1037. #define DA732X_RATES SNDRV_PCM_RATE_8000_96000
  1038. #define DA732X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
  1039. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
  1040. static const struct snd_soc_dai_ops da732x_dai_ops = {
  1041. .hw_params = da732x_hw_params,
  1042. .set_fmt = da732x_set_dai_fmt,
  1043. .set_sysclk = da732x_set_dai_sysclk,
  1044. };
  1045. static struct snd_soc_dai_driver da732x_dai[] = {
  1046. {
  1047. .name = "DA732X_AIFA",
  1048. .id = DA732X_DAI_ID1,
  1049. .base = DA732X_REG_AIFA1,
  1050. .playback = {
  1051. .stream_name = "AIFA Playback",
  1052. .channels_min = 1,
  1053. .channels_max = 2,
  1054. .rates = DA732X_RATES,
  1055. .formats = DA732X_FORMATS,
  1056. },
  1057. .capture = {
  1058. .stream_name = "AIFA Capture",
  1059. .channels_min = 1,
  1060. .channels_max = 2,
  1061. .rates = DA732X_RATES,
  1062. .formats = DA732X_FORMATS,
  1063. },
  1064. .ops = &da732x_dai_ops,
  1065. },
  1066. {
  1067. .name = "DA732X_AIFB",
  1068. .id = DA732X_DAI_ID2,
  1069. .base = DA732X_REG_AIFB1,
  1070. .playback = {
  1071. .stream_name = "AIFB Playback",
  1072. .channels_min = 1,
  1073. .channels_max = 2,
  1074. .rates = DA732X_RATES,
  1075. .formats = DA732X_FORMATS,
  1076. },
  1077. .capture = {
  1078. .stream_name = "AIFB Capture",
  1079. .channels_min = 1,
  1080. .channels_max = 2,
  1081. .rates = DA732X_RATES,
  1082. .formats = DA732X_FORMATS,
  1083. },
  1084. .ops = &da732x_dai_ops,
  1085. },
  1086. };
  1087. static bool da732x_volatile(struct device *dev, unsigned int reg)
  1088. {
  1089. switch (reg) {
  1090. case DA732X_REG_HPL_DAC_OFF_CNTL:
  1091. case DA732X_REG_HPR_DAC_OFF_CNTL:
  1092. return true;
  1093. default:
  1094. return false;
  1095. }
  1096. }
  1097. static const struct regmap_config da732x_regmap = {
  1098. .reg_bits = 8,
  1099. .val_bits = 8,
  1100. .max_register = DA732X_MAX_REG,
  1101. .volatile_reg = da732x_volatile,
  1102. .reg_defaults = da732x_reg_cache,
  1103. .num_reg_defaults = ARRAY_SIZE(da732x_reg_cache),
  1104. .cache_type = REGCACHE_RBTREE,
  1105. };
  1106. static void da732x_dac_offset_adjust(struct snd_soc_component *component)
  1107. {
  1108. u8 offset[DA732X_HP_DACS];
  1109. u8 sign[DA732X_HP_DACS];
  1110. u8 step = DA732X_DAC_OFFSET_STEP;
  1111. /* Initialize DAC offset calibration circuits and registers */
  1112. snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET,
  1113. DA732X_HP_DAC_OFFSET_TRIM_VAL);
  1114. snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET,
  1115. DA732X_HP_DAC_OFFSET_TRIM_VAL);
  1116. snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFF_CNTL,
  1117. DA732X_HP_DAC_OFF_CALIBRATION |
  1118. DA732X_HP_DAC_OFF_SCALE_STEPS);
  1119. snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFF_CNTL,
  1120. DA732X_HP_DAC_OFF_CALIBRATION |
  1121. DA732X_HP_DAC_OFF_SCALE_STEPS);
  1122. /* Wait for voltage stabilization */
  1123. msleep(DA732X_WAIT_FOR_STABILIZATION);
  1124. /* Check DAC offset sign */
  1125. sign[DA732X_HPL_DAC] = (snd_soc_component_read(component, DA732X_REG_HPL_DAC_OFF_CNTL) &
  1126. DA732X_HP_DAC_OFF_CNTL_COMPO);
  1127. sign[DA732X_HPR_DAC] = (snd_soc_component_read(component, DA732X_REG_HPR_DAC_OFF_CNTL) &
  1128. DA732X_HP_DAC_OFF_CNTL_COMPO);
  1129. /* Binary search DAC offset values (both channels at once) */
  1130. offset[DA732X_HPL_DAC] = sign[DA732X_HPL_DAC] << DA732X_HP_DAC_COMPO_SHIFT;
  1131. offset[DA732X_HPR_DAC] = sign[DA732X_HPR_DAC] << DA732X_HP_DAC_COMPO_SHIFT;
  1132. do {
  1133. offset[DA732X_HPL_DAC] |= step;
  1134. offset[DA732X_HPR_DAC] |= step;
  1135. snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET,
  1136. ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK);
  1137. snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET,
  1138. ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK);
  1139. msleep(DA732X_WAIT_FOR_STABILIZATION);
  1140. if ((snd_soc_component_read(component, DA732X_REG_HPL_DAC_OFF_CNTL) &
  1141. DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPL_DAC])
  1142. offset[DA732X_HPL_DAC] &= ~step;
  1143. if ((snd_soc_component_read(component, DA732X_REG_HPR_DAC_OFF_CNTL) &
  1144. DA732X_HP_DAC_OFF_CNTL_COMPO) ^ sign[DA732X_HPR_DAC])
  1145. offset[DA732X_HPR_DAC] &= ~step;
  1146. step >>= 1;
  1147. } while (step);
  1148. /* Write final DAC offsets to registers */
  1149. snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFFSET,
  1150. ~offset[DA732X_HPL_DAC] & DA732X_HP_DAC_OFF_MASK);
  1151. snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFFSET,
  1152. ~offset[DA732X_HPR_DAC] & DA732X_HP_DAC_OFF_MASK);
  1153. /* End DAC calibration mode */
  1154. snd_soc_component_write(component, DA732X_REG_HPL_DAC_OFF_CNTL,
  1155. DA732X_HP_DAC_OFF_SCALE_STEPS);
  1156. snd_soc_component_write(component, DA732X_REG_HPR_DAC_OFF_CNTL,
  1157. DA732X_HP_DAC_OFF_SCALE_STEPS);
  1158. }
  1159. static void da732x_output_offset_adjust(struct snd_soc_component *component)
  1160. {
  1161. u8 offset[DA732X_HP_AMPS];
  1162. u8 sign[DA732X_HP_AMPS];
  1163. u8 step = DA732X_OUTPUT_OFFSET_STEP;
  1164. offset[DA732X_HPL_AMP] = DA732X_HP_OUT_TRIM_VAL;
  1165. offset[DA732X_HPR_AMP] = DA732X_HP_OUT_TRIM_VAL;
  1166. /* Initialize output offset calibration circuits and registers */
  1167. snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL);
  1168. snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, DA732X_HP_OUT_TRIM_VAL);
  1169. snd_soc_component_write(component, DA732X_REG_HPL,
  1170. DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN);
  1171. snd_soc_component_write(component, DA732X_REG_HPR,
  1172. DA732X_HP_OUT_COMP | DA732X_HP_OUT_EN);
  1173. /* Wait for voltage stabilization */
  1174. msleep(DA732X_WAIT_FOR_STABILIZATION);
  1175. /* Check output offset sign */
  1176. sign[DA732X_HPL_AMP] = snd_soc_component_read(component, DA732X_REG_HPL) &
  1177. DA732X_HP_OUT_COMPO;
  1178. sign[DA732X_HPR_AMP] = snd_soc_component_read(component, DA732X_REG_HPR) &
  1179. DA732X_HP_OUT_COMPO;
  1180. snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_OUT_COMP |
  1181. (sign[DA732X_HPL_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) |
  1182. DA732X_HP_OUT_EN);
  1183. snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_OUT_COMP |
  1184. (sign[DA732X_HPR_AMP] >> DA732X_HP_OUT_COMPO_SHIFT) |
  1185. DA732X_HP_OUT_EN);
  1186. /* Binary search output offset values (both channels at once) */
  1187. do {
  1188. offset[DA732X_HPL_AMP] |= step;
  1189. offset[DA732X_HPR_AMP] |= step;
  1190. snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET,
  1191. offset[DA732X_HPL_AMP]);
  1192. snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET,
  1193. offset[DA732X_HPR_AMP]);
  1194. msleep(DA732X_WAIT_FOR_STABILIZATION);
  1195. if ((snd_soc_component_read(component, DA732X_REG_HPL) &
  1196. DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPL_AMP])
  1197. offset[DA732X_HPL_AMP] &= ~step;
  1198. if ((snd_soc_component_read(component, DA732X_REG_HPR) &
  1199. DA732X_HP_OUT_COMPO) ^ sign[DA732X_HPR_AMP])
  1200. offset[DA732X_HPR_AMP] &= ~step;
  1201. step >>= 1;
  1202. } while (step);
  1203. /* Write final DAC offsets to registers */
  1204. snd_soc_component_write(component, DA732X_REG_HPL_OUT_OFFSET, offset[DA732X_HPL_AMP]);
  1205. snd_soc_component_write(component, DA732X_REG_HPR_OUT_OFFSET, offset[DA732X_HPR_AMP]);
  1206. }
  1207. static void da732x_hp_dc_offset_cancellation(struct snd_soc_component *component)
  1208. {
  1209. /* Make sure that we have Soft Mute enabled */
  1210. snd_soc_component_write(component, DA732X_REG_DAC1_SOFTMUTE, DA732X_SOFTMUTE_EN |
  1211. DA732X_GAIN_RAMPED | DA732X_16_SAMPLES);
  1212. snd_soc_component_write(component, DA732X_REG_DAC1_SEL, DA732X_DACL_EN |
  1213. DA732X_DACR_EN | DA732X_DACL_SDM | DA732X_DACR_SDM |
  1214. DA732X_DACL_MUTE | DA732X_DACR_MUTE);
  1215. snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN |
  1216. DA732X_HP_OUT_MUTE | DA732X_HP_OUT_EN);
  1217. snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_OUT_EN |
  1218. DA732X_HP_OUT_MUTE | DA732X_HP_OUT_DAC_EN);
  1219. da732x_dac_offset_adjust(component);
  1220. da732x_output_offset_adjust(component);
  1221. snd_soc_component_write(component, DA732X_REG_DAC1_SEL, DA732X_DACS_DIS);
  1222. snd_soc_component_write(component, DA732X_REG_HPL, DA732X_HP_DIS);
  1223. snd_soc_component_write(component, DA732X_REG_HPR, DA732X_HP_DIS);
  1224. }
  1225. static int da732x_set_bias_level(struct snd_soc_component *component,
  1226. enum snd_soc_bias_level level)
  1227. {
  1228. struct da732x_priv *da732x = snd_soc_component_get_drvdata(component);
  1229. switch (level) {
  1230. case SND_SOC_BIAS_ON:
  1231. snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN,
  1232. DA732X_BIAS_BOOST_MASK,
  1233. DA732X_BIAS_BOOST_100PC);
  1234. break;
  1235. case SND_SOC_BIAS_PREPARE:
  1236. break;
  1237. case SND_SOC_BIAS_STANDBY:
  1238. if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) {
  1239. /* Init Codec */
  1240. snd_soc_component_write(component, DA732X_REG_REF1,
  1241. DA732X_VMID_FASTCHG);
  1242. snd_soc_component_write(component, DA732X_REG_BIAS_EN,
  1243. DA732X_BIAS_EN);
  1244. mdelay(DA732X_STARTUP_DELAY);
  1245. /* Disable Fast Charge and enable DAC ref voltage */
  1246. snd_soc_component_write(component, DA732X_REG_REF1,
  1247. DA732X_REFBUFX2_EN);
  1248. /* Enable bypass DSP routing */
  1249. snd_soc_component_write(component, DA732X_REG_DATA_ROUTE,
  1250. DA732X_BYPASS_DSP);
  1251. /* Enable Digital subsystem */
  1252. snd_soc_component_write(component, DA732X_REG_DSP_CTRL,
  1253. DA732X_DIGITAL_EN);
  1254. snd_soc_component_write(component, DA732X_REG_SPARE1_OUT,
  1255. DA732X_HP_DRIVER_EN |
  1256. DA732X_HP_GATE_LOW |
  1257. DA732X_HP_LOOP_GAIN_CTRL);
  1258. snd_soc_component_write(component, DA732X_REG_HP_LIN1_GNDSEL,
  1259. DA732X_HP_OUT_GNDSEL);
  1260. da732x_set_charge_pump(component, DA732X_ENABLE_CP);
  1261. snd_soc_component_write(component, DA732X_REG_CLK_EN1,
  1262. DA732X_SYS3_CLK_EN | DA732X_PC_CLK_EN);
  1263. /* Enable Zero Crossing */
  1264. snd_soc_component_write(component, DA732X_REG_INP_ZC_EN,
  1265. DA732X_MIC1_PRE_ZC_EN |
  1266. DA732X_MIC1_ZC_EN |
  1267. DA732X_MIC2_PRE_ZC_EN |
  1268. DA732X_MIC2_ZC_EN |
  1269. DA732X_AUXL_ZC_EN |
  1270. DA732X_AUXR_ZC_EN |
  1271. DA732X_MIC3_PRE_ZC_EN |
  1272. DA732X_MIC3_ZC_EN);
  1273. snd_soc_component_write(component, DA732X_REG_OUT_ZC_EN,
  1274. DA732X_HPL_ZC_EN | DA732X_HPR_ZC_EN |
  1275. DA732X_LIN2_ZC_EN | DA732X_LIN3_ZC_EN |
  1276. DA732X_LIN4_ZC_EN);
  1277. da732x_hp_dc_offset_cancellation(component);
  1278. regcache_cache_only(da732x->regmap, false);
  1279. regcache_sync(da732x->regmap);
  1280. } else {
  1281. snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN,
  1282. DA732X_BIAS_BOOST_MASK,
  1283. DA732X_BIAS_BOOST_50PC);
  1284. snd_soc_component_update_bits(component, DA732X_REG_PLL_CTRL,
  1285. DA732X_PLL_EN, 0);
  1286. da732x->pll_en = false;
  1287. }
  1288. break;
  1289. case SND_SOC_BIAS_OFF:
  1290. regcache_cache_only(da732x->regmap, true);
  1291. da732x_set_charge_pump(component, DA732X_DISABLE_CP);
  1292. snd_soc_component_update_bits(component, DA732X_REG_BIAS_EN, DA732X_BIAS_EN,
  1293. DA732X_BIAS_DIS);
  1294. da732x->pll_en = false;
  1295. break;
  1296. }
  1297. return 0;
  1298. }
  1299. static const struct snd_soc_component_driver soc_component_dev_da732x = {
  1300. .set_bias_level = da732x_set_bias_level,
  1301. .controls = da732x_snd_controls,
  1302. .num_controls = ARRAY_SIZE(da732x_snd_controls),
  1303. .dapm_widgets = da732x_dapm_widgets,
  1304. .num_dapm_widgets = ARRAY_SIZE(da732x_dapm_widgets),
  1305. .dapm_routes = da732x_dapm_routes,
  1306. .num_dapm_routes = ARRAY_SIZE(da732x_dapm_routes),
  1307. .set_pll = da732x_set_dai_pll,
  1308. .idle_bias_on = 1,
  1309. .use_pmdown_time = 1,
  1310. .endianness = 1,
  1311. };
  1312. static int da732x_i2c_probe(struct i2c_client *i2c)
  1313. {
  1314. struct da732x_priv *da732x;
  1315. unsigned int reg;
  1316. int ret;
  1317. da732x = devm_kzalloc(&i2c->dev, sizeof(struct da732x_priv),
  1318. GFP_KERNEL);
  1319. if (!da732x)
  1320. return -ENOMEM;
  1321. i2c_set_clientdata(i2c, da732x);
  1322. da732x->regmap = devm_regmap_init_i2c(i2c, &da732x_regmap);
  1323. if (IS_ERR(da732x->regmap)) {
  1324. ret = PTR_ERR(da732x->regmap);
  1325. dev_err(&i2c->dev, "Failed to initialize regmap\n");
  1326. goto err;
  1327. }
  1328. ret = regmap_read(da732x->regmap, DA732X_REG_ID, &reg);
  1329. if (ret < 0) {
  1330. dev_err(&i2c->dev, "Failed to read ID register: %d\n", ret);
  1331. goto err;
  1332. }
  1333. dev_info(&i2c->dev, "Revision: %d.%d\n",
  1334. (reg & DA732X_ID_MAJOR_MASK) >> 4,
  1335. (reg & DA732X_ID_MINOR_MASK));
  1336. ret = devm_snd_soc_register_component(&i2c->dev,
  1337. &soc_component_dev_da732x,
  1338. da732x_dai, ARRAY_SIZE(da732x_dai));
  1339. if (ret != 0)
  1340. dev_err(&i2c->dev, "Failed to register component.\n");
  1341. err:
  1342. return ret;
  1343. }
  1344. static const struct i2c_device_id da732x_i2c_id[] = {
  1345. { "da7320", 0},
  1346. { }
  1347. };
  1348. MODULE_DEVICE_TABLE(i2c, da732x_i2c_id);
  1349. static struct i2c_driver da732x_i2c_driver = {
  1350. .driver = {
  1351. .name = "da7320",
  1352. },
  1353. .probe_new = da732x_i2c_probe,
  1354. .id_table = da732x_i2c_id,
  1355. };
  1356. module_i2c_driver(da732x_i2c_driver);
  1357. MODULE_DESCRIPTION("ASoC DA732X driver");
  1358. MODULE_AUTHOR("Michal Hajduk <[email protected]>");
  1359. MODULE_LICENSE("GPL");