da7213.c 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599
  1. /*
  2. * DA7213 ALSA SoC Codec Driver
  3. *
  4. * Copyright (c) 2013 Dialog Semiconductor
  5. *
  6. * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
  7. * Based on DA9055 ALSA SoC codec driver.
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms of the GNU General Public License as published by the
  11. * Free Software Foundation; either version 2 of the License, or (at your
  12. * option) any later version.
  13. */
  14. #include <linux/delay.h>
  15. #include <linux/i2c.h>
  16. #include <linux/regmap.h>
  17. #include <linux/slab.h>
  18. #include <linux/module.h>
  19. #include <sound/pcm.h>
  20. #include <sound/pcm_params.h>
  21. #include <sound/soc.h>
  22. #include <sound/initval.h>
  23. #include <sound/tlv.h>
  24. #include <sound/da7213.h>
  25. #include "da7213.h"
  26. /* Gain and Volume */
  27. static const unsigned int aux_vol_tlv[] = {
  28. TLV_DB_RANGE_HEAD(2),
  29. /* -54dB */
  30. 0x0, 0x11, TLV_DB_SCALE_ITEM(-5400, 0, 0),
  31. /* -52.5dB to 15dB */
  32. 0x12, 0x3f, TLV_DB_SCALE_ITEM(-5250, 150, 0)
  33. };
  34. static const unsigned int digital_gain_tlv[] = {
  35. TLV_DB_RANGE_HEAD(2),
  36. 0x0, 0x07, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
  37. /* -78dB to 12dB */
  38. 0x08, 0x7f, TLV_DB_SCALE_ITEM(-7800, 75, 0)
  39. };
  40. static const unsigned int alc_analog_gain_tlv[] = {
  41. TLV_DB_RANGE_HEAD(2),
  42. 0x0, 0x0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
  43. /* 0dB to 36dB */
  44. 0x01, 0x07, TLV_DB_SCALE_ITEM(0, 600, 0)
  45. };
  46. static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, -600, 600, 0);
  47. static const DECLARE_TLV_DB_SCALE(mixin_gain_tlv, -450, 150, 0);
  48. static const DECLARE_TLV_DB_SCALE(eq_gain_tlv, -1050, 150, 0);
  49. static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -5700, 100, 0);
  50. static const DECLARE_TLV_DB_SCALE(lineout_vol_tlv, -4800, 100, 0);
  51. static const DECLARE_TLV_DB_SCALE(alc_threshold_tlv, -9450, 150, 0);
  52. static const DECLARE_TLV_DB_SCALE(alc_gain_tlv, 0, 600, 0);
  53. /* ADC and DAC voice mode (8kHz) high pass cutoff value */
  54. static const char * const da7213_voice_hpf_corner_txt[] = {
  55. "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz"
  56. };
  57. static const struct soc_enum da7213_dac_voice_hpf_corner =
  58. SOC_ENUM_SINGLE(DA7213_DAC_FILTERS1, DA7213_VOICE_HPF_CORNER_SHIFT,
  59. DA7213_VOICE_HPF_CORNER_MAX,
  60. da7213_voice_hpf_corner_txt);
  61. static const struct soc_enum da7213_adc_voice_hpf_corner =
  62. SOC_ENUM_SINGLE(DA7213_ADC_FILTERS1, DA7213_VOICE_HPF_CORNER_SHIFT,
  63. DA7213_VOICE_HPF_CORNER_MAX,
  64. da7213_voice_hpf_corner_txt);
  65. /* ADC and DAC high pass filter cutoff value */
  66. static const char * const da7213_audio_hpf_corner_txt[] = {
  67. "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000"
  68. };
  69. static const struct soc_enum da7213_dac_audio_hpf_corner =
  70. SOC_ENUM_SINGLE(DA7213_DAC_FILTERS1, DA7213_AUDIO_HPF_CORNER_SHIFT,
  71. DA7213_AUDIO_HPF_CORNER_MAX,
  72. da7213_audio_hpf_corner_txt);
  73. static const struct soc_enum da7213_adc_audio_hpf_corner =
  74. SOC_ENUM_SINGLE(DA7213_ADC_FILTERS1, DA7213_AUDIO_HPF_CORNER_SHIFT,
  75. DA7213_AUDIO_HPF_CORNER_MAX,
  76. da7213_audio_hpf_corner_txt);
  77. /* Gain ramping rate value */
  78. static const char * const da7213_gain_ramp_rate_txt[] = {
  79. "nominal rate * 8", "nominal rate * 16", "nominal rate / 16",
  80. "nominal rate / 32"
  81. };
  82. static const struct soc_enum da7213_gain_ramp_rate =
  83. SOC_ENUM_SINGLE(DA7213_GAIN_RAMP_CTRL, DA7213_GAIN_RAMP_RATE_SHIFT,
  84. DA7213_GAIN_RAMP_RATE_MAX, da7213_gain_ramp_rate_txt);
  85. /* DAC noise gate setup time value */
  86. static const char * const da7213_dac_ng_setup_time_txt[] = {
  87. "256 samples", "512 samples", "1024 samples", "2048 samples"
  88. };
  89. static const struct soc_enum da7213_dac_ng_setup_time =
  90. SOC_ENUM_SINGLE(DA7213_DAC_NG_SETUP_TIME,
  91. DA7213_DAC_NG_SETUP_TIME_SHIFT,
  92. DA7213_DAC_NG_SETUP_TIME_MAX,
  93. da7213_dac_ng_setup_time_txt);
  94. /* DAC noise gate rampup rate value */
  95. static const char * const da7213_dac_ng_rampup_txt[] = {
  96. "0.02 ms/dB", "0.16 ms/dB"
  97. };
  98. static const struct soc_enum da7213_dac_ng_rampup_rate =
  99. SOC_ENUM_SINGLE(DA7213_DAC_NG_SETUP_TIME,
  100. DA7213_DAC_NG_RAMPUP_RATE_SHIFT,
  101. DA7213_DAC_NG_RAMP_RATE_MAX,
  102. da7213_dac_ng_rampup_txt);
  103. /* DAC noise gate rampdown rate value */
  104. static const char * const da7213_dac_ng_rampdown_txt[] = {
  105. "0.64 ms/dB", "20.48 ms/dB"
  106. };
  107. static const struct soc_enum da7213_dac_ng_rampdown_rate =
  108. SOC_ENUM_SINGLE(DA7213_DAC_NG_SETUP_TIME,
  109. DA7213_DAC_NG_RAMPDN_RATE_SHIFT,
  110. DA7213_DAC_NG_RAMP_RATE_MAX,
  111. da7213_dac_ng_rampdown_txt);
  112. /* DAC soft mute rate value */
  113. static const char * const da7213_dac_soft_mute_rate_txt[] = {
  114. "1", "2", "4", "8", "16", "32", "64"
  115. };
  116. static const struct soc_enum da7213_dac_soft_mute_rate =
  117. SOC_ENUM_SINGLE(DA7213_DAC_FILTERS5, DA7213_DAC_SOFTMUTE_RATE_SHIFT,
  118. DA7213_DAC_SOFTMUTE_RATE_MAX,
  119. da7213_dac_soft_mute_rate_txt);
  120. /* ALC Attack Rate select */
  121. static const char * const da7213_alc_attack_rate_txt[] = {
  122. "44/fs", "88/fs", "176/fs", "352/fs", "704/fs", "1408/fs", "2816/fs",
  123. "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
  124. };
  125. static const struct soc_enum da7213_alc_attack_rate =
  126. SOC_ENUM_SINGLE(DA7213_ALC_CTRL2, DA7213_ALC_ATTACK_SHIFT,
  127. DA7213_ALC_ATTACK_MAX, da7213_alc_attack_rate_txt);
  128. /* ALC Release Rate select */
  129. static const char * const da7213_alc_release_rate_txt[] = {
  130. "176/fs", "352/fs", "704/fs", "1408/fs", "2816/fs", "5632/fs",
  131. "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
  132. };
  133. static const struct soc_enum da7213_alc_release_rate =
  134. SOC_ENUM_SINGLE(DA7213_ALC_CTRL2, DA7213_ALC_RELEASE_SHIFT,
  135. DA7213_ALC_RELEASE_MAX, da7213_alc_release_rate_txt);
  136. /* ALC Hold Time select */
  137. static const char * const da7213_alc_hold_time_txt[] = {
  138. "62/fs", "124/fs", "248/fs", "496/fs", "992/fs", "1984/fs", "3968/fs",
  139. "7936/fs", "15872/fs", "31744/fs", "63488/fs", "126976/fs",
  140. "253952/fs", "507904/fs", "1015808/fs", "2031616/fs"
  141. };
  142. static const struct soc_enum da7213_alc_hold_time =
  143. SOC_ENUM_SINGLE(DA7213_ALC_CTRL3, DA7213_ALC_HOLD_SHIFT,
  144. DA7213_ALC_HOLD_MAX, da7213_alc_hold_time_txt);
  145. /* ALC Input Signal Tracking rate select */
  146. static const char * const da7213_alc_integ_rate_txt[] = {
  147. "1/4", "1/16", "1/256", "1/65536"
  148. };
  149. static const struct soc_enum da7213_alc_integ_attack_rate =
  150. SOC_ENUM_SINGLE(DA7213_ALC_CTRL3, DA7213_ALC_INTEG_ATTACK_SHIFT,
  151. DA7213_ALC_INTEG_MAX, da7213_alc_integ_rate_txt);
  152. static const struct soc_enum da7213_alc_integ_release_rate =
  153. SOC_ENUM_SINGLE(DA7213_ALC_CTRL3, DA7213_ALC_INTEG_RELEASE_SHIFT,
  154. DA7213_ALC_INTEG_MAX, da7213_alc_integ_rate_txt);
  155. /*
  156. * Control Functions
  157. */
  158. static int da7213_get_alc_data(struct snd_soc_codec *codec, u8 reg_val)
  159. {
  160. int mid_data, top_data;
  161. int sum = 0;
  162. u8 iteration;
  163. for (iteration = 0; iteration < DA7213_ALC_AVG_ITERATIONS;
  164. iteration++) {
  165. /* Select the left or right channel and capture data */
  166. snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL, reg_val);
  167. /* Select middle 8 bits for read back from data register */
  168. snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL,
  169. reg_val | DA7213_ALC_DATA_MIDDLE);
  170. mid_data = snd_soc_read(codec, DA7213_ALC_CIC_OP_LVL_DATA);
  171. /* Select top 8 bits for read back from data register */
  172. snd_soc_write(codec, DA7213_ALC_CIC_OP_LVL_CTRL,
  173. reg_val | DA7213_ALC_DATA_TOP);
  174. top_data = snd_soc_read(codec, DA7213_ALC_CIC_OP_LVL_DATA);
  175. sum += ((mid_data << 8) | (top_data << 16));
  176. }
  177. return sum / DA7213_ALC_AVG_ITERATIONS;
  178. }
  179. static void da7213_alc_calib_man(struct snd_soc_codec *codec)
  180. {
  181. u8 reg_val;
  182. int avg_left_data, avg_right_data, offset_l, offset_r;
  183. /* Calculate average for Left and Right data */
  184. /* Left Data */
  185. avg_left_data = da7213_get_alc_data(codec,
  186. DA7213_ALC_CIC_OP_CHANNEL_LEFT);
  187. /* Right Data */
  188. avg_right_data = da7213_get_alc_data(codec,
  189. DA7213_ALC_CIC_OP_CHANNEL_RIGHT);
  190. /* Calculate DC offset */
  191. offset_l = -avg_left_data;
  192. offset_r = -avg_right_data;
  193. reg_val = (offset_l & DA7213_ALC_OFFSET_15_8) >> 8;
  194. snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_M_L, reg_val);
  195. reg_val = (offset_l & DA7213_ALC_OFFSET_19_16) >> 16;
  196. snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_U_L, reg_val);
  197. reg_val = (offset_r & DA7213_ALC_OFFSET_15_8) >> 8;
  198. snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_M_R, reg_val);
  199. reg_val = (offset_r & DA7213_ALC_OFFSET_19_16) >> 16;
  200. snd_soc_write(codec, DA7213_ALC_OFFSET_MAN_U_R, reg_val);
  201. /* Enable analog/digital gain mode & offset cancellation */
  202. snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
  203. DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE,
  204. DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE);
  205. }
  206. static void da7213_alc_calib_auto(struct snd_soc_codec *codec)
  207. {
  208. u8 alc_ctrl1;
  209. /* Begin auto calibration and wait for completion */
  210. snd_soc_update_bits(codec, DA7213_ALC_CTRL1, DA7213_ALC_AUTO_CALIB_EN,
  211. DA7213_ALC_AUTO_CALIB_EN);
  212. do {
  213. alc_ctrl1 = snd_soc_read(codec, DA7213_ALC_CTRL1);
  214. } while (alc_ctrl1 & DA7213_ALC_AUTO_CALIB_EN);
  215. /* If auto calibration fails, fall back to digital gain only mode */
  216. if (alc_ctrl1 & DA7213_ALC_CALIB_OVERFLOW) {
  217. dev_warn(codec->dev,
  218. "ALC auto calibration failed with overflow\n");
  219. snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
  220. DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE,
  221. 0);
  222. } else {
  223. /* Enable analog/digital gain mode & offset cancellation */
  224. snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
  225. DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE,
  226. DA7213_ALC_OFFSET_EN | DA7213_ALC_SYNC_MODE);
  227. }
  228. }
  229. static void da7213_alc_calib(struct snd_soc_codec *codec)
  230. {
  231. struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
  232. u8 adc_l_ctrl, adc_r_ctrl;
  233. u8 mixin_l_sel, mixin_r_sel;
  234. u8 mic_1_ctrl, mic_2_ctrl;
  235. /* Save current values from ADC control registers */
  236. adc_l_ctrl = snd_soc_read(codec, DA7213_ADC_L_CTRL);
  237. adc_r_ctrl = snd_soc_read(codec, DA7213_ADC_R_CTRL);
  238. /* Save current values from MIXIN_L/R_SELECT registers */
  239. mixin_l_sel = snd_soc_read(codec, DA7213_MIXIN_L_SELECT);
  240. mixin_r_sel = snd_soc_read(codec, DA7213_MIXIN_R_SELECT);
  241. /* Save current values from MIC control registers */
  242. mic_1_ctrl = snd_soc_read(codec, DA7213_MIC_1_CTRL);
  243. mic_2_ctrl = snd_soc_read(codec, DA7213_MIC_2_CTRL);
  244. /* Enable ADC Left and Right */
  245. snd_soc_update_bits(codec, DA7213_ADC_L_CTRL, DA7213_ADC_EN,
  246. DA7213_ADC_EN);
  247. snd_soc_update_bits(codec, DA7213_ADC_R_CTRL, DA7213_ADC_EN,
  248. DA7213_ADC_EN);
  249. /* Enable MIC paths */
  250. snd_soc_update_bits(codec, DA7213_MIXIN_L_SELECT,
  251. DA7213_MIXIN_L_MIX_SELECT_MIC_1 |
  252. DA7213_MIXIN_L_MIX_SELECT_MIC_2,
  253. DA7213_MIXIN_L_MIX_SELECT_MIC_1 |
  254. DA7213_MIXIN_L_MIX_SELECT_MIC_2);
  255. snd_soc_update_bits(codec, DA7213_MIXIN_R_SELECT,
  256. DA7213_MIXIN_R_MIX_SELECT_MIC_2 |
  257. DA7213_MIXIN_R_MIX_SELECT_MIC_1,
  258. DA7213_MIXIN_R_MIX_SELECT_MIC_2 |
  259. DA7213_MIXIN_R_MIX_SELECT_MIC_1);
  260. /* Mute MIC PGAs */
  261. snd_soc_update_bits(codec, DA7213_MIC_1_CTRL, DA7213_MUTE_EN,
  262. DA7213_MUTE_EN);
  263. snd_soc_update_bits(codec, DA7213_MIC_2_CTRL, DA7213_MUTE_EN,
  264. DA7213_MUTE_EN);
  265. /* Perform calibration */
  266. if (da7213->alc_calib_auto)
  267. da7213_alc_calib_auto(codec);
  268. else
  269. da7213_alc_calib_man(codec);
  270. /* Restore MIXIN_L/R_SELECT registers to their original states */
  271. snd_soc_write(codec, DA7213_MIXIN_L_SELECT, mixin_l_sel);
  272. snd_soc_write(codec, DA7213_MIXIN_R_SELECT, mixin_r_sel);
  273. /* Restore ADC control registers to their original states */
  274. snd_soc_write(codec, DA7213_ADC_L_CTRL, adc_l_ctrl);
  275. snd_soc_write(codec, DA7213_ADC_R_CTRL, adc_r_ctrl);
  276. /* Restore original values of MIC control registers */
  277. snd_soc_write(codec, DA7213_MIC_1_CTRL, mic_1_ctrl);
  278. snd_soc_write(codec, DA7213_MIC_2_CTRL, mic_2_ctrl);
  279. }
  280. static int da7213_put_mixin_gain(struct snd_kcontrol *kcontrol,
  281. struct snd_ctl_elem_value *ucontrol)
  282. {
  283. struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
  284. struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
  285. int ret;
  286. ret = snd_soc_put_volsw_2r(kcontrol, ucontrol);
  287. /* If ALC in operation, make sure calibrated offsets are updated */
  288. if ((!ret) && (da7213->alc_en))
  289. da7213_alc_calib(codec);
  290. return ret;
  291. }
  292. static int da7213_put_alc_sw(struct snd_kcontrol *kcontrol,
  293. struct snd_ctl_elem_value *ucontrol)
  294. {
  295. struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
  296. struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
  297. /* Force ALC offset calibration if enabling ALC */
  298. if (ucontrol->value.integer.value[0] ||
  299. ucontrol->value.integer.value[1]) {
  300. if (!da7213->alc_en) {
  301. da7213_alc_calib(codec);
  302. da7213->alc_en = true;
  303. }
  304. } else {
  305. da7213->alc_en = false;
  306. }
  307. return snd_soc_put_volsw(kcontrol, ucontrol);
  308. }
  309. /*
  310. * KControls
  311. */
  312. static const struct snd_kcontrol_new da7213_snd_controls[] = {
  313. /* Volume controls */
  314. SOC_SINGLE_TLV("Mic 1 Volume", DA7213_MIC_1_GAIN,
  315. DA7213_MIC_AMP_GAIN_SHIFT, DA7213_MIC_AMP_GAIN_MAX,
  316. DA7213_NO_INVERT, mic_vol_tlv),
  317. SOC_SINGLE_TLV("Mic 2 Volume", DA7213_MIC_2_GAIN,
  318. DA7213_MIC_AMP_GAIN_SHIFT, DA7213_MIC_AMP_GAIN_MAX,
  319. DA7213_NO_INVERT, mic_vol_tlv),
  320. SOC_DOUBLE_R_TLV("Aux Volume", DA7213_AUX_L_GAIN, DA7213_AUX_R_GAIN,
  321. DA7213_AUX_AMP_GAIN_SHIFT, DA7213_AUX_AMP_GAIN_MAX,
  322. DA7213_NO_INVERT, aux_vol_tlv),
  323. SOC_DOUBLE_R_EXT_TLV("Mixin PGA Volume", DA7213_MIXIN_L_GAIN,
  324. DA7213_MIXIN_R_GAIN, DA7213_MIXIN_AMP_GAIN_SHIFT,
  325. DA7213_MIXIN_AMP_GAIN_MAX, DA7213_NO_INVERT,
  326. snd_soc_get_volsw_2r, da7213_put_mixin_gain,
  327. mixin_gain_tlv),
  328. SOC_DOUBLE_R_TLV("ADC Volume", DA7213_ADC_L_GAIN, DA7213_ADC_R_GAIN,
  329. DA7213_ADC_AMP_GAIN_SHIFT, DA7213_ADC_AMP_GAIN_MAX,
  330. DA7213_NO_INVERT, digital_gain_tlv),
  331. SOC_DOUBLE_R_TLV("DAC Volume", DA7213_DAC_L_GAIN, DA7213_DAC_R_GAIN,
  332. DA7213_DAC_AMP_GAIN_SHIFT, DA7213_DAC_AMP_GAIN_MAX,
  333. DA7213_NO_INVERT, digital_gain_tlv),
  334. SOC_DOUBLE_R_TLV("Headphone Volume", DA7213_HP_L_GAIN, DA7213_HP_R_GAIN,
  335. DA7213_HP_AMP_GAIN_SHIFT, DA7213_HP_AMP_GAIN_MAX,
  336. DA7213_NO_INVERT, hp_vol_tlv),
  337. SOC_SINGLE_TLV("Lineout Volume", DA7213_LINE_GAIN,
  338. DA7213_LINE_AMP_GAIN_SHIFT, DA7213_LINE_AMP_GAIN_MAX,
  339. DA7213_NO_INVERT, lineout_vol_tlv),
  340. /* DAC Equalizer controls */
  341. SOC_SINGLE("DAC EQ Switch", DA7213_DAC_FILTERS4, DA7213_DAC_EQ_EN_SHIFT,
  342. DA7213_DAC_EQ_EN_MAX, DA7213_NO_INVERT),
  343. SOC_SINGLE_TLV("DAC EQ1 Volume", DA7213_DAC_FILTERS2,
  344. DA7213_DAC_EQ_BAND1_SHIFT, DA7213_DAC_EQ_BAND_MAX,
  345. DA7213_NO_INVERT, eq_gain_tlv),
  346. SOC_SINGLE_TLV("DAC EQ2 Volume", DA7213_DAC_FILTERS2,
  347. DA7213_DAC_EQ_BAND2_SHIFT, DA7213_DAC_EQ_BAND_MAX,
  348. DA7213_NO_INVERT, eq_gain_tlv),
  349. SOC_SINGLE_TLV("DAC EQ3 Volume", DA7213_DAC_FILTERS3,
  350. DA7213_DAC_EQ_BAND3_SHIFT, DA7213_DAC_EQ_BAND_MAX,
  351. DA7213_NO_INVERT, eq_gain_tlv),
  352. SOC_SINGLE_TLV("DAC EQ4 Volume", DA7213_DAC_FILTERS3,
  353. DA7213_DAC_EQ_BAND4_SHIFT, DA7213_DAC_EQ_BAND_MAX,
  354. DA7213_NO_INVERT, eq_gain_tlv),
  355. SOC_SINGLE_TLV("DAC EQ5 Volume", DA7213_DAC_FILTERS4,
  356. DA7213_DAC_EQ_BAND5_SHIFT, DA7213_DAC_EQ_BAND_MAX,
  357. DA7213_NO_INVERT, eq_gain_tlv),
  358. /* High Pass Filter and Voice Mode controls */
  359. SOC_SINGLE("ADC HPF Switch", DA7213_ADC_FILTERS1, DA7213_HPF_EN_SHIFT,
  360. DA7213_HPF_EN_MAX, DA7213_NO_INVERT),
  361. SOC_ENUM("ADC HPF Cutoff", da7213_adc_audio_hpf_corner),
  362. SOC_SINGLE("ADC Voice Mode Switch", DA7213_ADC_FILTERS1,
  363. DA7213_VOICE_EN_SHIFT, DA7213_VOICE_EN_MAX,
  364. DA7213_NO_INVERT),
  365. SOC_ENUM("ADC Voice Cutoff", da7213_adc_voice_hpf_corner),
  366. SOC_SINGLE("DAC HPF Switch", DA7213_DAC_FILTERS1, DA7213_HPF_EN_SHIFT,
  367. DA7213_HPF_EN_MAX, DA7213_NO_INVERT),
  368. SOC_ENUM("DAC HPF Cutoff", da7213_dac_audio_hpf_corner),
  369. SOC_SINGLE("DAC Voice Mode Switch", DA7213_DAC_FILTERS1,
  370. DA7213_VOICE_EN_SHIFT, DA7213_VOICE_EN_MAX,
  371. DA7213_NO_INVERT),
  372. SOC_ENUM("DAC Voice Cutoff", da7213_dac_voice_hpf_corner),
  373. /* Mute controls */
  374. SOC_SINGLE("Mic 1 Switch", DA7213_MIC_1_CTRL, DA7213_MUTE_EN_SHIFT,
  375. DA7213_MUTE_EN_MAX, DA7213_INVERT),
  376. SOC_SINGLE("Mic 2 Switch", DA7213_MIC_2_CTRL, DA7213_MUTE_EN_SHIFT,
  377. DA7213_MUTE_EN_MAX, DA7213_INVERT),
  378. SOC_DOUBLE_R("Aux Switch", DA7213_AUX_L_CTRL, DA7213_AUX_R_CTRL,
  379. DA7213_MUTE_EN_SHIFT, DA7213_MUTE_EN_MAX, DA7213_INVERT),
  380. SOC_DOUBLE_R("Mixin PGA Switch", DA7213_MIXIN_L_CTRL,
  381. DA7213_MIXIN_R_CTRL, DA7213_MUTE_EN_SHIFT,
  382. DA7213_MUTE_EN_MAX, DA7213_INVERT),
  383. SOC_DOUBLE_R("ADC Switch", DA7213_ADC_L_CTRL, DA7213_ADC_R_CTRL,
  384. DA7213_MUTE_EN_SHIFT, DA7213_MUTE_EN_MAX, DA7213_INVERT),
  385. SOC_DOUBLE_R("Headphone Switch", DA7213_HP_L_CTRL, DA7213_HP_R_CTRL,
  386. DA7213_MUTE_EN_SHIFT, DA7213_MUTE_EN_MAX, DA7213_INVERT),
  387. SOC_SINGLE("Lineout Switch", DA7213_LINE_CTRL, DA7213_MUTE_EN_SHIFT,
  388. DA7213_MUTE_EN_MAX, DA7213_INVERT),
  389. SOC_SINGLE("DAC Soft Mute Switch", DA7213_DAC_FILTERS5,
  390. DA7213_DAC_SOFTMUTE_EN_SHIFT, DA7213_DAC_SOFTMUTE_EN_MAX,
  391. DA7213_NO_INVERT),
  392. SOC_ENUM("DAC Soft Mute Rate", da7213_dac_soft_mute_rate),
  393. /* Zero Cross controls */
  394. SOC_DOUBLE_R("Aux ZC Switch", DA7213_AUX_L_CTRL, DA7213_AUX_R_CTRL,
  395. DA7213_ZC_EN_SHIFT, DA7213_ZC_EN_MAX, DA7213_NO_INVERT),
  396. SOC_DOUBLE_R("Mixin PGA ZC Switch", DA7213_MIXIN_L_CTRL,
  397. DA7213_MIXIN_R_CTRL, DA7213_ZC_EN_SHIFT, DA7213_ZC_EN_MAX,
  398. DA7213_NO_INVERT),
  399. SOC_DOUBLE_R("Headphone ZC Switch", DA7213_HP_L_CTRL, DA7213_HP_R_CTRL,
  400. DA7213_ZC_EN_SHIFT, DA7213_ZC_EN_MAX, DA7213_NO_INVERT),
  401. /* Gain Ramping controls */
  402. SOC_DOUBLE_R("Aux Gain Ramping Switch", DA7213_AUX_L_CTRL,
  403. DA7213_AUX_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
  404. DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
  405. SOC_DOUBLE_R("Mixin Gain Ramping Switch", DA7213_MIXIN_L_CTRL,
  406. DA7213_MIXIN_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
  407. DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
  408. SOC_DOUBLE_R("ADC Gain Ramping Switch", DA7213_ADC_L_CTRL,
  409. DA7213_ADC_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
  410. DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
  411. SOC_DOUBLE_R("DAC Gain Ramping Switch", DA7213_DAC_L_CTRL,
  412. DA7213_DAC_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
  413. DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
  414. SOC_DOUBLE_R("Headphone Gain Ramping Switch", DA7213_HP_L_CTRL,
  415. DA7213_HP_R_CTRL, DA7213_GAIN_RAMP_EN_SHIFT,
  416. DA7213_GAIN_RAMP_EN_MAX, DA7213_NO_INVERT),
  417. SOC_SINGLE("Lineout Gain Ramping Switch", DA7213_LINE_CTRL,
  418. DA7213_GAIN_RAMP_EN_SHIFT, DA7213_GAIN_RAMP_EN_MAX,
  419. DA7213_NO_INVERT),
  420. SOC_ENUM("Gain Ramping Rate", da7213_gain_ramp_rate),
  421. /* DAC Noise Gate controls */
  422. SOC_SINGLE("DAC NG Switch", DA7213_DAC_NG_CTRL, DA7213_DAC_NG_EN_SHIFT,
  423. DA7213_DAC_NG_EN_MAX, DA7213_NO_INVERT),
  424. SOC_ENUM("DAC NG Setup Time", da7213_dac_ng_setup_time),
  425. SOC_ENUM("DAC NG Rampup Rate", da7213_dac_ng_rampup_rate),
  426. SOC_ENUM("DAC NG Rampdown Rate", da7213_dac_ng_rampdown_rate),
  427. SOC_SINGLE("DAC NG OFF Threshold", DA7213_DAC_NG_OFF_THRESHOLD,
  428. DA7213_DAC_NG_THRESHOLD_SHIFT, DA7213_DAC_NG_THRESHOLD_MAX,
  429. DA7213_NO_INVERT),
  430. SOC_SINGLE("DAC NG ON Threshold", DA7213_DAC_NG_ON_THRESHOLD,
  431. DA7213_DAC_NG_THRESHOLD_SHIFT, DA7213_DAC_NG_THRESHOLD_MAX,
  432. DA7213_NO_INVERT),
  433. /* DAC Routing & Inversion */
  434. SOC_DOUBLE("DAC Mono Switch", DA7213_DIG_ROUTING_DAC,
  435. DA7213_DAC_L_MONO_SHIFT, DA7213_DAC_R_MONO_SHIFT,
  436. DA7213_DAC_MONO_MAX, DA7213_NO_INVERT),
  437. SOC_DOUBLE("DAC Invert Switch", DA7213_DIG_CTRL, DA7213_DAC_L_INV_SHIFT,
  438. DA7213_DAC_R_INV_SHIFT, DA7213_DAC_INV_MAX,
  439. DA7213_NO_INVERT),
  440. /* DMIC controls */
  441. SOC_DOUBLE_R("DMIC Switch", DA7213_MIXIN_L_SELECT,
  442. DA7213_MIXIN_R_SELECT, DA7213_DMIC_EN_SHIFT,
  443. DA7213_DMIC_EN_MAX, DA7213_NO_INVERT),
  444. /* ALC Controls */
  445. SOC_DOUBLE_EXT("ALC Switch", DA7213_ALC_CTRL1, DA7213_ALC_L_EN_SHIFT,
  446. DA7213_ALC_R_EN_SHIFT, DA7213_ALC_EN_MAX,
  447. DA7213_NO_INVERT, snd_soc_get_volsw, da7213_put_alc_sw),
  448. SOC_ENUM("ALC Attack Rate", da7213_alc_attack_rate),
  449. SOC_ENUM("ALC Release Rate", da7213_alc_release_rate),
  450. SOC_ENUM("ALC Hold Time", da7213_alc_hold_time),
  451. /*
  452. * Rate at which input signal envelope is tracked as the signal gets
  453. * larger
  454. */
  455. SOC_ENUM("ALC Integ Attack Rate", da7213_alc_integ_attack_rate),
  456. /*
  457. * Rate at which input signal envelope is tracked as the signal gets
  458. * smaller
  459. */
  460. SOC_ENUM("ALC Integ Release Rate", da7213_alc_integ_release_rate),
  461. SOC_SINGLE_TLV("ALC Noise Threshold Volume", DA7213_ALC_NOISE,
  462. DA7213_ALC_THRESHOLD_SHIFT, DA7213_ALC_THRESHOLD_MAX,
  463. DA7213_INVERT, alc_threshold_tlv),
  464. SOC_SINGLE_TLV("ALC Min Threshold Volume", DA7213_ALC_TARGET_MIN,
  465. DA7213_ALC_THRESHOLD_SHIFT, DA7213_ALC_THRESHOLD_MAX,
  466. DA7213_INVERT, alc_threshold_tlv),
  467. SOC_SINGLE_TLV("ALC Max Threshold Volume", DA7213_ALC_TARGET_MAX,
  468. DA7213_ALC_THRESHOLD_SHIFT, DA7213_ALC_THRESHOLD_MAX,
  469. DA7213_INVERT, alc_threshold_tlv),
  470. SOC_SINGLE_TLV("ALC Max Attenuation Volume", DA7213_ALC_GAIN_LIMITS,
  471. DA7213_ALC_ATTEN_MAX_SHIFT,
  472. DA7213_ALC_ATTEN_GAIN_MAX_MAX, DA7213_NO_INVERT,
  473. alc_gain_tlv),
  474. SOC_SINGLE_TLV("ALC Max Gain Volume", DA7213_ALC_GAIN_LIMITS,
  475. DA7213_ALC_GAIN_MAX_SHIFT, DA7213_ALC_ATTEN_GAIN_MAX_MAX,
  476. DA7213_NO_INVERT, alc_gain_tlv),
  477. SOC_SINGLE_TLV("ALC Min Analog Gain Volume", DA7213_ALC_ANA_GAIN_LIMITS,
  478. DA7213_ALC_ANA_GAIN_MIN_SHIFT, DA7213_ALC_ANA_GAIN_MAX,
  479. DA7213_NO_INVERT, alc_analog_gain_tlv),
  480. SOC_SINGLE_TLV("ALC Max Analog Gain Volume", DA7213_ALC_ANA_GAIN_LIMITS,
  481. DA7213_ALC_ANA_GAIN_MAX_SHIFT, DA7213_ALC_ANA_GAIN_MAX,
  482. DA7213_NO_INVERT, alc_analog_gain_tlv),
  483. SOC_SINGLE("ALC Anticlip Mode Switch", DA7213_ALC_ANTICLIP_CTRL,
  484. DA7213_ALC_ANTICLIP_EN_SHIFT, DA7213_ALC_ANTICLIP_EN_MAX,
  485. DA7213_NO_INVERT),
  486. SOC_SINGLE("ALC Anticlip Level", DA7213_ALC_ANTICLIP_LEVEL,
  487. DA7213_ALC_ANTICLIP_LEVEL_SHIFT,
  488. DA7213_ALC_ANTICLIP_LEVEL_MAX, DA7213_NO_INVERT),
  489. };
  490. /*
  491. * DAPM
  492. */
  493. /*
  494. * Enums
  495. */
  496. /* MIC PGA source select */
  497. static const char * const da7213_mic_amp_in_sel_txt[] = {
  498. "Differential", "MIC_P", "MIC_N"
  499. };
  500. static const struct soc_enum da7213_mic_1_amp_in_sel =
  501. SOC_ENUM_SINGLE(DA7213_MIC_1_CTRL, DA7213_MIC_AMP_IN_SEL_SHIFT,
  502. DA7213_MIC_AMP_IN_SEL_MAX, da7213_mic_amp_in_sel_txt);
  503. static const struct snd_kcontrol_new da7213_mic_1_amp_in_sel_mux =
  504. SOC_DAPM_ENUM("Mic 1 Amp Source MUX", da7213_mic_1_amp_in_sel);
  505. static const struct soc_enum da7213_mic_2_amp_in_sel =
  506. SOC_ENUM_SINGLE(DA7213_MIC_2_CTRL, DA7213_MIC_AMP_IN_SEL_SHIFT,
  507. DA7213_MIC_AMP_IN_SEL_MAX, da7213_mic_amp_in_sel_txt);
  508. static const struct snd_kcontrol_new da7213_mic_2_amp_in_sel_mux =
  509. SOC_DAPM_ENUM("Mic 2 Amp Source MUX", da7213_mic_2_amp_in_sel);
  510. /* DAI routing select */
  511. static const char * const da7213_dai_src_txt[] = {
  512. "ADC Left", "ADC Right", "DAI Input Left", "DAI Input Right"
  513. };
  514. static const struct soc_enum da7213_dai_l_src =
  515. SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAI, DA7213_DAI_L_SRC_SHIFT,
  516. DA7213_DAI_SRC_MAX, da7213_dai_src_txt);
  517. static const struct snd_kcontrol_new da7213_dai_l_src_mux =
  518. SOC_DAPM_ENUM("DAI Left Source MUX", da7213_dai_l_src);
  519. static const struct soc_enum da7213_dai_r_src =
  520. SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAI, DA7213_DAI_R_SRC_SHIFT,
  521. DA7213_DAI_SRC_MAX, da7213_dai_src_txt);
  522. static const struct snd_kcontrol_new da7213_dai_r_src_mux =
  523. SOC_DAPM_ENUM("DAI Right Source MUX", da7213_dai_r_src);
  524. /* DAC routing select */
  525. static const char * const da7213_dac_src_txt[] = {
  526. "ADC Output Left", "ADC Output Right", "DAI Input Left",
  527. "DAI Input Right"
  528. };
  529. static const struct soc_enum da7213_dac_l_src =
  530. SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAC, DA7213_DAC_L_SRC_SHIFT,
  531. DA7213_DAC_SRC_MAX, da7213_dac_src_txt);
  532. static const struct snd_kcontrol_new da7213_dac_l_src_mux =
  533. SOC_DAPM_ENUM("DAC Left Source MUX", da7213_dac_l_src);
  534. static const struct soc_enum da7213_dac_r_src =
  535. SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAC, DA7213_DAC_R_SRC_SHIFT,
  536. DA7213_DAC_SRC_MAX, da7213_dac_src_txt);
  537. static const struct snd_kcontrol_new da7213_dac_r_src_mux =
  538. SOC_DAPM_ENUM("DAC Right Source MUX", da7213_dac_r_src);
  539. /*
  540. * Mixer Controls
  541. */
  542. /* Mixin Left */
  543. static const struct snd_kcontrol_new da7213_dapm_mixinl_controls[] = {
  544. SOC_DAPM_SINGLE("Aux Left Switch", DA7213_MIXIN_L_SELECT,
  545. DA7213_MIXIN_L_MIX_SELECT_AUX_L_SHIFT,
  546. DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  547. SOC_DAPM_SINGLE("Mic 1 Switch", DA7213_MIXIN_L_SELECT,
  548. DA7213_MIXIN_L_MIX_SELECT_MIC_1_SHIFT,
  549. DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  550. SOC_DAPM_SINGLE("Mic 2 Switch", DA7213_MIXIN_L_SELECT,
  551. DA7213_MIXIN_L_MIX_SELECT_MIC_2_SHIFT,
  552. DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  553. SOC_DAPM_SINGLE("Mixin Right Switch", DA7213_MIXIN_L_SELECT,
  554. DA7213_MIXIN_L_MIX_SELECT_MIXIN_R_SHIFT,
  555. DA7213_MIXIN_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  556. };
  557. /* Mixin Right */
  558. static const struct snd_kcontrol_new da7213_dapm_mixinr_controls[] = {
  559. SOC_DAPM_SINGLE("Aux Right Switch", DA7213_MIXIN_R_SELECT,
  560. DA7213_MIXIN_R_MIX_SELECT_AUX_R_SHIFT,
  561. DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  562. SOC_DAPM_SINGLE("Mic 2 Switch", DA7213_MIXIN_R_SELECT,
  563. DA7213_MIXIN_R_MIX_SELECT_MIC_2_SHIFT,
  564. DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  565. SOC_DAPM_SINGLE("Mic 1 Switch", DA7213_MIXIN_R_SELECT,
  566. DA7213_MIXIN_R_MIX_SELECT_MIC_1_SHIFT,
  567. DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  568. SOC_DAPM_SINGLE("Mixin Left Switch", DA7213_MIXIN_R_SELECT,
  569. DA7213_MIXIN_R_MIX_SELECT_MIXIN_L_SHIFT,
  570. DA7213_MIXIN_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  571. };
  572. /* Mixout Left */
  573. static const struct snd_kcontrol_new da7213_dapm_mixoutl_controls[] = {
  574. SOC_DAPM_SINGLE("Aux Left Switch", DA7213_MIXOUT_L_SELECT,
  575. DA7213_MIXOUT_L_MIX_SELECT_AUX_L_SHIFT,
  576. DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  577. SOC_DAPM_SINGLE("Mixin Left Switch", DA7213_MIXOUT_L_SELECT,
  578. DA7213_MIXOUT_L_MIX_SELECT_MIXIN_L_SHIFT,
  579. DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  580. SOC_DAPM_SINGLE("Mixin Right Switch", DA7213_MIXOUT_L_SELECT,
  581. DA7213_MIXOUT_L_MIX_SELECT_MIXIN_R_SHIFT,
  582. DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  583. SOC_DAPM_SINGLE("DAC Left Switch", DA7213_MIXOUT_L_SELECT,
  584. DA7213_MIXOUT_L_MIX_SELECT_DAC_L_SHIFT,
  585. DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  586. SOC_DAPM_SINGLE("Aux Left Invert Switch", DA7213_MIXOUT_L_SELECT,
  587. DA7213_MIXOUT_L_MIX_SELECT_AUX_L_INVERTED_SHIFT,
  588. DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  589. SOC_DAPM_SINGLE("Mixin Left Invert Switch", DA7213_MIXOUT_L_SELECT,
  590. DA7213_MIXOUT_L_MIX_SELECT_MIXIN_L_INVERTED_SHIFT,
  591. DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  592. SOC_DAPM_SINGLE("Mixin Right Invert Switch", DA7213_MIXOUT_L_SELECT,
  593. DA7213_MIXOUT_L_MIX_SELECT_MIXIN_R_INVERTED_SHIFT,
  594. DA7213_MIXOUT_L_MIX_SELECT_MAX, DA7213_NO_INVERT),
  595. };
  596. /* Mixout Right */
  597. static const struct snd_kcontrol_new da7213_dapm_mixoutr_controls[] = {
  598. SOC_DAPM_SINGLE("Aux Right Switch", DA7213_MIXOUT_R_SELECT,
  599. DA7213_MIXOUT_R_MIX_SELECT_AUX_R_SHIFT,
  600. DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  601. SOC_DAPM_SINGLE("Mixin Right Switch", DA7213_MIXOUT_R_SELECT,
  602. DA7213_MIXOUT_R_MIX_SELECT_MIXIN_R_SHIFT,
  603. DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  604. SOC_DAPM_SINGLE("Mixin Left Switch", DA7213_MIXOUT_R_SELECT,
  605. DA7213_MIXOUT_R_MIX_SELECT_MIXIN_L_SHIFT,
  606. DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  607. SOC_DAPM_SINGLE("DAC Right Switch", DA7213_MIXOUT_R_SELECT,
  608. DA7213_MIXOUT_R_MIX_SELECT_DAC_R_SHIFT,
  609. DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  610. SOC_DAPM_SINGLE("Aux Right Invert Switch", DA7213_MIXOUT_R_SELECT,
  611. DA7213_MIXOUT_R_MIX_SELECT_AUX_R_INVERTED_SHIFT,
  612. DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  613. SOC_DAPM_SINGLE("Mixin Right Invert Switch", DA7213_MIXOUT_R_SELECT,
  614. DA7213_MIXOUT_R_MIX_SELECT_MIXIN_R_INVERTED_SHIFT,
  615. DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  616. SOC_DAPM_SINGLE("Mixin Left Invert Switch", DA7213_MIXOUT_R_SELECT,
  617. DA7213_MIXOUT_R_MIX_SELECT_MIXIN_L_INVERTED_SHIFT,
  618. DA7213_MIXOUT_R_MIX_SELECT_MAX, DA7213_NO_INVERT),
  619. };
  620. /*
  621. * DAPM widgets
  622. */
  623. static const struct snd_soc_dapm_widget da7213_dapm_widgets[] = {
  624. /*
  625. * Input & Output
  626. */
  627. /* Use a supply here as this controls both input & output DAIs */
  628. SND_SOC_DAPM_SUPPLY("DAI", DA7213_DAI_CTRL, DA7213_DAI_EN_SHIFT,
  629. DA7213_NO_INVERT, NULL, 0),
  630. /*
  631. * Input
  632. */
  633. /* Input Lines */
  634. SND_SOC_DAPM_INPUT("MIC1"),
  635. SND_SOC_DAPM_INPUT("MIC2"),
  636. SND_SOC_DAPM_INPUT("AUXL"),
  637. SND_SOC_DAPM_INPUT("AUXR"),
  638. /* MUXs for Mic PGA source selection */
  639. SND_SOC_DAPM_MUX("Mic 1 Amp Source MUX", SND_SOC_NOPM, 0, 0,
  640. &da7213_mic_1_amp_in_sel_mux),
  641. SND_SOC_DAPM_MUX("Mic 2 Amp Source MUX", SND_SOC_NOPM, 0, 0,
  642. &da7213_mic_2_amp_in_sel_mux),
  643. /* Input PGAs */
  644. SND_SOC_DAPM_PGA("Mic 1 PGA", DA7213_MIC_1_CTRL, DA7213_AMP_EN_SHIFT,
  645. DA7213_NO_INVERT, NULL, 0),
  646. SND_SOC_DAPM_PGA("Mic 2 PGA", DA7213_MIC_2_CTRL, DA7213_AMP_EN_SHIFT,
  647. DA7213_NO_INVERT, NULL, 0),
  648. SND_SOC_DAPM_PGA("Aux Left PGA", DA7213_AUX_L_CTRL, DA7213_AMP_EN_SHIFT,
  649. DA7213_NO_INVERT, NULL, 0),
  650. SND_SOC_DAPM_PGA("Aux Right PGA", DA7213_AUX_R_CTRL,
  651. DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
  652. SND_SOC_DAPM_PGA("Mixin Left PGA", DA7213_MIXIN_L_CTRL,
  653. DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
  654. SND_SOC_DAPM_PGA("Mixin Right PGA", DA7213_MIXIN_R_CTRL,
  655. DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
  656. /* Mic Biases */
  657. SND_SOC_DAPM_SUPPLY("Mic Bias 1", DA7213_MICBIAS_CTRL,
  658. DA7213_MICBIAS1_EN_SHIFT, DA7213_NO_INVERT,
  659. NULL, 0),
  660. SND_SOC_DAPM_SUPPLY("Mic Bias 2", DA7213_MICBIAS_CTRL,
  661. DA7213_MICBIAS2_EN_SHIFT, DA7213_NO_INVERT,
  662. NULL, 0),
  663. /* Input Mixers */
  664. SND_SOC_DAPM_MIXER("Mixin Left", SND_SOC_NOPM, 0, 0,
  665. &da7213_dapm_mixinl_controls[0],
  666. ARRAY_SIZE(da7213_dapm_mixinl_controls)),
  667. SND_SOC_DAPM_MIXER("Mixin Right", SND_SOC_NOPM, 0, 0,
  668. &da7213_dapm_mixinr_controls[0],
  669. ARRAY_SIZE(da7213_dapm_mixinr_controls)),
  670. /* ADCs */
  671. SND_SOC_DAPM_ADC("ADC Left", NULL, DA7213_ADC_L_CTRL,
  672. DA7213_ADC_EN_SHIFT, DA7213_NO_INVERT),
  673. SND_SOC_DAPM_ADC("ADC Right", NULL, DA7213_ADC_R_CTRL,
  674. DA7213_ADC_EN_SHIFT, DA7213_NO_INVERT),
  675. /* DAI */
  676. SND_SOC_DAPM_MUX("DAI Left Source MUX", SND_SOC_NOPM, 0, 0,
  677. &da7213_dai_l_src_mux),
  678. SND_SOC_DAPM_MUX("DAI Right Source MUX", SND_SOC_NOPM, 0, 0,
  679. &da7213_dai_r_src_mux),
  680. SND_SOC_DAPM_AIF_OUT("DAIOUTL", "Capture", 0, SND_SOC_NOPM, 0, 0),
  681. SND_SOC_DAPM_AIF_OUT("DAIOUTR", "Capture", 1, SND_SOC_NOPM, 0, 0),
  682. /*
  683. * Output
  684. */
  685. /* DAI */
  686. SND_SOC_DAPM_AIF_IN("DAIINL", "Playback", 0, SND_SOC_NOPM, 0, 0),
  687. SND_SOC_DAPM_AIF_IN("DAIINR", "Playback", 1, SND_SOC_NOPM, 0, 0),
  688. SND_SOC_DAPM_MUX("DAC Left Source MUX", SND_SOC_NOPM, 0, 0,
  689. &da7213_dac_l_src_mux),
  690. SND_SOC_DAPM_MUX("DAC Right Source MUX", SND_SOC_NOPM, 0, 0,
  691. &da7213_dac_r_src_mux),
  692. /* DACs */
  693. SND_SOC_DAPM_DAC("DAC Left", NULL, DA7213_DAC_L_CTRL,
  694. DA7213_DAC_EN_SHIFT, DA7213_NO_INVERT),
  695. SND_SOC_DAPM_DAC("DAC Right", NULL, DA7213_DAC_R_CTRL,
  696. DA7213_DAC_EN_SHIFT, DA7213_NO_INVERT),
  697. /* Output Mixers */
  698. SND_SOC_DAPM_MIXER("Mixout Left", SND_SOC_NOPM, 0, 0,
  699. &da7213_dapm_mixoutl_controls[0],
  700. ARRAY_SIZE(da7213_dapm_mixoutl_controls)),
  701. SND_SOC_DAPM_MIXER("Mixout Right", SND_SOC_NOPM, 0, 0,
  702. &da7213_dapm_mixoutr_controls[0],
  703. ARRAY_SIZE(da7213_dapm_mixoutr_controls)),
  704. /* Output PGAs */
  705. SND_SOC_DAPM_PGA("Mixout Left PGA", DA7213_MIXOUT_L_CTRL,
  706. DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
  707. SND_SOC_DAPM_PGA("Mixout Right PGA", DA7213_MIXOUT_R_CTRL,
  708. DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
  709. SND_SOC_DAPM_PGA("Lineout PGA", DA7213_LINE_CTRL, DA7213_AMP_EN_SHIFT,
  710. DA7213_NO_INVERT, NULL, 0),
  711. SND_SOC_DAPM_PGA("Headphone Left PGA", DA7213_HP_L_CTRL,
  712. DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
  713. SND_SOC_DAPM_PGA("Headphone Right PGA", DA7213_HP_R_CTRL,
  714. DA7213_AMP_EN_SHIFT, DA7213_NO_INVERT, NULL, 0),
  715. /* Charge Pump */
  716. SND_SOC_DAPM_SUPPLY("Charge Pump", DA7213_CP_CTRL, DA7213_CP_EN_SHIFT,
  717. DA7213_NO_INVERT, NULL, 0),
  718. /* Output Lines */
  719. SND_SOC_DAPM_OUTPUT("HPL"),
  720. SND_SOC_DAPM_OUTPUT("HPR"),
  721. SND_SOC_DAPM_OUTPUT("LINE"),
  722. };
  723. /*
  724. * DAPM audio route definition
  725. */
  726. static const struct snd_soc_dapm_route da7213_audio_map[] = {
  727. /* Dest Connecting Widget source */
  728. /* Input path */
  729. {"MIC1", NULL, "Mic Bias 1"},
  730. {"MIC2", NULL, "Mic Bias 2"},
  731. {"Mic 1 Amp Source MUX", "Differential", "MIC1"},
  732. {"Mic 1 Amp Source MUX", "MIC_P", "MIC1"},
  733. {"Mic 1 Amp Source MUX", "MIC_N", "MIC1"},
  734. {"Mic 2 Amp Source MUX", "Differential", "MIC2"},
  735. {"Mic 2 Amp Source MUX", "MIC_P", "MIC2"},
  736. {"Mic 2 Amp Source MUX", "MIC_N", "MIC2"},
  737. {"Mic 1 PGA", NULL, "Mic 1 Amp Source MUX"},
  738. {"Mic 2 PGA", NULL, "Mic 2 Amp Source MUX"},
  739. {"Aux Left PGA", NULL, "AUXL"},
  740. {"Aux Right PGA", NULL, "AUXR"},
  741. {"Mixin Left", "Aux Left Switch", "Aux Left PGA"},
  742. {"Mixin Left", "Mic 1 Switch", "Mic 1 PGA"},
  743. {"Mixin Left", "Mic 2 Switch", "Mic 2 PGA"},
  744. {"Mixin Left", "Mixin Right Switch", "Mixin Right PGA"},
  745. {"Mixin Right", "Aux Right Switch", "Aux Right PGA"},
  746. {"Mixin Right", "Mic 2 Switch", "Mic 2 PGA"},
  747. {"Mixin Right", "Mic 1 Switch", "Mic 1 PGA"},
  748. {"Mixin Right", "Mixin Left Switch", "Mixin Left PGA"},
  749. {"Mixin Left PGA", NULL, "Mixin Left"},
  750. {"ADC Left", NULL, "Mixin Left PGA"},
  751. {"Mixin Right PGA", NULL, "Mixin Right"},
  752. {"ADC Right", NULL, "Mixin Right PGA"},
  753. {"DAI Left Source MUX", "ADC Left", "ADC Left"},
  754. {"DAI Left Source MUX", "ADC Right", "ADC Right"},
  755. {"DAI Left Source MUX", "DAI Input Left", "DAIINL"},
  756. {"DAI Left Source MUX", "DAI Input Right", "DAIINR"},
  757. {"DAI Right Source MUX", "ADC Left", "ADC Left"},
  758. {"DAI Right Source MUX", "ADC Right", "ADC Right"},
  759. {"DAI Right Source MUX", "DAI Input Left", "DAIINL"},
  760. {"DAI Right Source MUX", "DAI Input Right", "DAIINR"},
  761. {"DAIOUTL", NULL, "DAI Left Source MUX"},
  762. {"DAIOUTR", NULL, "DAI Right Source MUX"},
  763. {"DAIOUTL", NULL, "DAI"},
  764. {"DAIOUTR", NULL, "DAI"},
  765. /* Output path */
  766. {"DAIINL", NULL, "DAI"},
  767. {"DAIINR", NULL, "DAI"},
  768. {"DAC Left Source MUX", "ADC Output Left", "ADC Left"},
  769. {"DAC Left Source MUX", "ADC Output Right", "ADC Right"},
  770. {"DAC Left Source MUX", "DAI Input Left", "DAIINL"},
  771. {"DAC Left Source MUX", "DAI Input Right", "DAIINR"},
  772. {"DAC Right Source MUX", "ADC Output Left", "ADC Left"},
  773. {"DAC Right Source MUX", "ADC Output Right", "ADC Right"},
  774. {"DAC Right Source MUX", "DAI Input Left", "DAIINL"},
  775. {"DAC Right Source MUX", "DAI Input Right", "DAIINR"},
  776. {"DAC Left", NULL, "DAC Left Source MUX"},
  777. {"DAC Right", NULL, "DAC Right Source MUX"},
  778. {"Mixout Left", "Aux Left Switch", "Aux Left PGA"},
  779. {"Mixout Left", "Mixin Left Switch", "Mixin Left PGA"},
  780. {"Mixout Left", "Mixin Right Switch", "Mixin Right PGA"},
  781. {"Mixout Left", "DAC Left Switch", "DAC Left"},
  782. {"Mixout Left", "Aux Left Invert Switch", "Aux Left PGA"},
  783. {"Mixout Left", "Mixin Left Invert Switch", "Mixin Left PGA"},
  784. {"Mixout Left", "Mixin Right Invert Switch", "Mixin Right PGA"},
  785. {"Mixout Right", "Aux Right Switch", "Aux Right PGA"},
  786. {"Mixout Right", "Mixin Right Switch", "Mixin Right PGA"},
  787. {"Mixout Right", "Mixin Left Switch", "Mixin Left PGA"},
  788. {"Mixout Right", "DAC Right Switch", "DAC Right"},
  789. {"Mixout Right", "Aux Right Invert Switch", "Aux Right PGA"},
  790. {"Mixout Right", "Mixin Right Invert Switch", "Mixin Right PGA"},
  791. {"Mixout Right", "Mixin Left Invert Switch", "Mixin Left PGA"},
  792. {"Mixout Left PGA", NULL, "Mixout Left"},
  793. {"Mixout Right PGA", NULL, "Mixout Right"},
  794. {"Headphone Left PGA", NULL, "Mixout Left PGA"},
  795. {"Headphone Left PGA", NULL, "Charge Pump"},
  796. {"HPL", NULL, "Headphone Left PGA"},
  797. {"Headphone Right PGA", NULL, "Mixout Right PGA"},
  798. {"Headphone Right PGA", NULL, "Charge Pump"},
  799. {"HPR", NULL, "Headphone Right PGA"},
  800. {"Lineout PGA", NULL, "Mixout Right PGA"},
  801. {"LINE", NULL, "Lineout PGA"},
  802. };
  803. static struct reg_default da7213_reg_defaults[] = {
  804. { DA7213_DIG_ROUTING_DAI, 0x10 },
  805. { DA7213_SR, 0x0A },
  806. { DA7213_REFERENCES, 0x80 },
  807. { DA7213_PLL_FRAC_TOP, 0x00 },
  808. { DA7213_PLL_FRAC_BOT, 0x00 },
  809. { DA7213_PLL_INTEGER, 0x20 },
  810. { DA7213_PLL_CTRL, 0x0C },
  811. { DA7213_DAI_CLK_MODE, 0x01 },
  812. { DA7213_DAI_CTRL, 0x08 },
  813. { DA7213_DIG_ROUTING_DAC, 0x32 },
  814. { DA7213_AUX_L_GAIN, 0x35 },
  815. { DA7213_AUX_R_GAIN, 0x35 },
  816. { DA7213_MIXIN_L_SELECT, 0x00 },
  817. { DA7213_MIXIN_R_SELECT, 0x00 },
  818. { DA7213_MIXIN_L_GAIN, 0x03 },
  819. { DA7213_MIXIN_R_GAIN, 0x03 },
  820. { DA7213_ADC_L_GAIN, 0x6F },
  821. { DA7213_ADC_R_GAIN, 0x6F },
  822. { DA7213_ADC_FILTERS1, 0x80 },
  823. { DA7213_MIC_1_GAIN, 0x01 },
  824. { DA7213_MIC_2_GAIN, 0x01 },
  825. { DA7213_DAC_FILTERS5, 0x00 },
  826. { DA7213_DAC_FILTERS2, 0x88 },
  827. { DA7213_DAC_FILTERS3, 0x88 },
  828. { DA7213_DAC_FILTERS4, 0x08 },
  829. { DA7213_DAC_FILTERS1, 0x80 },
  830. { DA7213_DAC_L_GAIN, 0x6F },
  831. { DA7213_DAC_R_GAIN, 0x6F },
  832. { DA7213_CP_CTRL, 0x61 },
  833. { DA7213_HP_L_GAIN, 0x39 },
  834. { DA7213_HP_R_GAIN, 0x39 },
  835. { DA7213_LINE_GAIN, 0x30 },
  836. { DA7213_MIXOUT_L_SELECT, 0x00 },
  837. { DA7213_MIXOUT_R_SELECT, 0x00 },
  838. { DA7213_SYSTEM_MODES_INPUT, 0x00 },
  839. { DA7213_SYSTEM_MODES_OUTPUT, 0x00 },
  840. { DA7213_AUX_L_CTRL, 0x44 },
  841. { DA7213_AUX_R_CTRL, 0x44 },
  842. { DA7213_MICBIAS_CTRL, 0x11 },
  843. { DA7213_MIC_1_CTRL, 0x40 },
  844. { DA7213_MIC_2_CTRL, 0x40 },
  845. { DA7213_MIXIN_L_CTRL, 0x40 },
  846. { DA7213_MIXIN_R_CTRL, 0x40 },
  847. { DA7213_ADC_L_CTRL, 0x40 },
  848. { DA7213_ADC_R_CTRL, 0x40 },
  849. { DA7213_DAC_L_CTRL, 0x48 },
  850. { DA7213_DAC_R_CTRL, 0x40 },
  851. { DA7213_HP_L_CTRL, 0x41 },
  852. { DA7213_HP_R_CTRL, 0x40 },
  853. { DA7213_LINE_CTRL, 0x40 },
  854. { DA7213_MIXOUT_L_CTRL, 0x10 },
  855. { DA7213_MIXOUT_R_CTRL, 0x10 },
  856. { DA7213_LDO_CTRL, 0x00 },
  857. { DA7213_IO_CTRL, 0x00 },
  858. { DA7213_GAIN_RAMP_CTRL, 0x00},
  859. { DA7213_MIC_CONFIG, 0x00 },
  860. { DA7213_PC_COUNT, 0x00 },
  861. { DA7213_CP_VOL_THRESHOLD1, 0x32 },
  862. { DA7213_CP_DELAY, 0x95 },
  863. { DA7213_CP_DETECTOR, 0x00 },
  864. { DA7213_DAI_OFFSET, 0x00 },
  865. { DA7213_DIG_CTRL, 0x00 },
  866. { DA7213_ALC_CTRL2, 0x00 },
  867. { DA7213_ALC_CTRL3, 0x00 },
  868. { DA7213_ALC_NOISE, 0x3F },
  869. { DA7213_ALC_TARGET_MIN, 0x3F },
  870. { DA7213_ALC_TARGET_MAX, 0x00 },
  871. { DA7213_ALC_GAIN_LIMITS, 0xFF },
  872. { DA7213_ALC_ANA_GAIN_LIMITS, 0x71 },
  873. { DA7213_ALC_ANTICLIP_CTRL, 0x00 },
  874. { DA7213_ALC_ANTICLIP_LEVEL, 0x00 },
  875. { DA7213_ALC_OFFSET_MAN_M_L, 0x00 },
  876. { DA7213_ALC_OFFSET_MAN_U_L, 0x00 },
  877. { DA7213_ALC_OFFSET_MAN_M_R, 0x00 },
  878. { DA7213_ALC_OFFSET_MAN_U_R, 0x00 },
  879. { DA7213_ALC_CIC_OP_LVL_CTRL, 0x00 },
  880. { DA7213_DAC_NG_SETUP_TIME, 0x00 },
  881. { DA7213_DAC_NG_OFF_THRESHOLD, 0x00 },
  882. { DA7213_DAC_NG_ON_THRESHOLD, 0x00 },
  883. { DA7213_DAC_NG_CTRL, 0x00 },
  884. };
  885. static bool da7213_volatile_register(struct device *dev, unsigned int reg)
  886. {
  887. switch (reg) {
  888. case DA7213_STATUS1:
  889. case DA7213_PLL_STATUS:
  890. case DA7213_AUX_L_GAIN_STATUS:
  891. case DA7213_AUX_R_GAIN_STATUS:
  892. case DA7213_MIC_1_GAIN_STATUS:
  893. case DA7213_MIC_2_GAIN_STATUS:
  894. case DA7213_MIXIN_L_GAIN_STATUS:
  895. case DA7213_MIXIN_R_GAIN_STATUS:
  896. case DA7213_ADC_L_GAIN_STATUS:
  897. case DA7213_ADC_R_GAIN_STATUS:
  898. case DA7213_DAC_L_GAIN_STATUS:
  899. case DA7213_DAC_R_GAIN_STATUS:
  900. case DA7213_HP_L_GAIN_STATUS:
  901. case DA7213_HP_R_GAIN_STATUS:
  902. case DA7213_LINE_GAIN_STATUS:
  903. case DA7213_ALC_CTRL1:
  904. case DA7213_ALC_OFFSET_AUTO_M_L:
  905. case DA7213_ALC_OFFSET_AUTO_U_L:
  906. case DA7213_ALC_OFFSET_AUTO_M_R:
  907. case DA7213_ALC_OFFSET_AUTO_U_R:
  908. case DA7213_ALC_CIC_OP_LVL_DATA:
  909. return 1;
  910. default:
  911. return 0;
  912. }
  913. }
  914. static int da7213_hw_params(struct snd_pcm_substream *substream,
  915. struct snd_pcm_hw_params *params,
  916. struct snd_soc_dai *dai)
  917. {
  918. struct snd_soc_codec *codec = dai->codec;
  919. u8 dai_ctrl = 0;
  920. u8 fs;
  921. /* Set DAI format */
  922. switch (params_format(params)) {
  923. case SNDRV_PCM_FORMAT_S16_LE:
  924. dai_ctrl |= DA7213_DAI_WORD_LENGTH_S16_LE;
  925. break;
  926. case SNDRV_PCM_FORMAT_S20_3LE:
  927. dai_ctrl |= DA7213_DAI_WORD_LENGTH_S20_LE;
  928. break;
  929. case SNDRV_PCM_FORMAT_S24_LE:
  930. dai_ctrl |= DA7213_DAI_WORD_LENGTH_S24_LE;
  931. break;
  932. case SNDRV_PCM_FORMAT_S32_LE:
  933. dai_ctrl |= DA7213_DAI_WORD_LENGTH_S32_LE;
  934. break;
  935. default:
  936. return -EINVAL;
  937. }
  938. /* Set sampling rate */
  939. switch (params_rate(params)) {
  940. case 8000:
  941. fs = DA7213_SR_8000;
  942. break;
  943. case 11025:
  944. fs = DA7213_SR_11025;
  945. break;
  946. case 12000:
  947. fs = DA7213_SR_12000;
  948. break;
  949. case 16000:
  950. fs = DA7213_SR_16000;
  951. break;
  952. case 22050:
  953. fs = DA7213_SR_22050;
  954. break;
  955. case 32000:
  956. fs = DA7213_SR_32000;
  957. break;
  958. case 44100:
  959. fs = DA7213_SR_44100;
  960. break;
  961. case 48000:
  962. fs = DA7213_SR_48000;
  963. break;
  964. case 88200:
  965. fs = DA7213_SR_88200;
  966. break;
  967. case 96000:
  968. fs = DA7213_SR_96000;
  969. break;
  970. default:
  971. return -EINVAL;
  972. }
  973. snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_WORD_LENGTH_MASK,
  974. dai_ctrl);
  975. snd_soc_write(codec, DA7213_SR, fs);
  976. return 0;
  977. }
  978. static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
  979. {
  980. struct snd_soc_codec *codec = codec_dai->codec;
  981. struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
  982. u8 dai_clk_mode = 0, dai_ctrl = 0;
  983. /* Set master/slave mode */
  984. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  985. case SND_SOC_DAIFMT_CBM_CFM:
  986. dai_clk_mode |= DA7213_DAI_CLK_EN_MASTER_MODE;
  987. da7213->master = true;
  988. break;
  989. case SND_SOC_DAIFMT_CBS_CFS:
  990. dai_clk_mode |= DA7213_DAI_CLK_EN_SLAVE_MODE;
  991. da7213->master = false;
  992. break;
  993. default:
  994. return -EINVAL;
  995. }
  996. /* Set clock normal/inverted */
  997. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  998. case SND_SOC_DAIFMT_NB_NF:
  999. break;
  1000. case SND_SOC_DAIFMT_NB_IF:
  1001. dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
  1002. break;
  1003. case SND_SOC_DAIFMT_IB_NF:
  1004. dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
  1005. break;
  1006. case SND_SOC_DAIFMT_IB_IF:
  1007. dai_clk_mode |= DA7213_DAI_WCLK_POL_INV | DA7213_DAI_CLK_POL_INV;
  1008. break;
  1009. default:
  1010. return -EINVAL;
  1011. }
  1012. /* Only I2S is supported */
  1013. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  1014. case SND_SOC_DAIFMT_I2S:
  1015. dai_ctrl |= DA7213_DAI_FORMAT_I2S_MODE;
  1016. break;
  1017. case SND_SOC_DAIFMT_LEFT_J:
  1018. dai_ctrl |= DA7213_DAI_FORMAT_LEFT_J;
  1019. break;
  1020. case SND_SOC_DAIFMT_RIGHT_J:
  1021. dai_ctrl |= DA7213_DAI_FORMAT_RIGHT_J;
  1022. break;
  1023. default:
  1024. return -EINVAL;
  1025. }
  1026. /* By default only 32 BCLK per WCLK is supported */
  1027. dai_clk_mode |= DA7213_DAI_BCLKS_PER_WCLK_32;
  1028. snd_soc_write(codec, DA7213_DAI_CLK_MODE, dai_clk_mode);
  1029. snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK,
  1030. dai_ctrl);
  1031. return 0;
  1032. }
  1033. static int da7213_mute(struct snd_soc_dai *dai, int mute)
  1034. {
  1035. struct snd_soc_codec *codec = dai->codec;
  1036. if (mute) {
  1037. snd_soc_update_bits(codec, DA7213_DAC_L_CTRL,
  1038. DA7213_MUTE_EN, DA7213_MUTE_EN);
  1039. snd_soc_update_bits(codec, DA7213_DAC_R_CTRL,
  1040. DA7213_MUTE_EN, DA7213_MUTE_EN);
  1041. } else {
  1042. snd_soc_update_bits(codec, DA7213_DAC_L_CTRL,
  1043. DA7213_MUTE_EN, 0);
  1044. snd_soc_update_bits(codec, DA7213_DAC_R_CTRL,
  1045. DA7213_MUTE_EN, 0);
  1046. }
  1047. return 0;
  1048. }
  1049. #define DA7213_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
  1050. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
  1051. static int da7213_set_dai_sysclk(struct snd_soc_dai *codec_dai,
  1052. int clk_id, unsigned int freq, int dir)
  1053. {
  1054. struct snd_soc_codec *codec = codec_dai->codec;
  1055. struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
  1056. switch (clk_id) {
  1057. case DA7213_CLKSRC_MCLK:
  1058. if ((freq == 32768) ||
  1059. ((freq >= 5000000) && (freq <= 54000000))) {
  1060. da7213->mclk_rate = freq;
  1061. return 0;
  1062. } else {
  1063. dev_err(codec_dai->dev, "Unsupported MCLK value %d\n",
  1064. freq);
  1065. return -EINVAL;
  1066. }
  1067. break;
  1068. default:
  1069. dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id);
  1070. return -EINVAL;
  1071. }
  1072. }
  1073. /* Supported PLL input frequencies are 5MHz - 54MHz. */
  1074. static int da7213_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
  1075. int source, unsigned int fref, unsigned int fout)
  1076. {
  1077. struct snd_soc_codec *codec = codec_dai->codec;
  1078. struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
  1079. u8 pll_ctrl, indiv_bits, indiv;
  1080. u8 pll_frac_top, pll_frac_bot, pll_integer;
  1081. u32 freq_ref;
  1082. u64 frac_div;
  1083. /* Reset PLL configuration */
  1084. snd_soc_write(codec, DA7213_PLL_CTRL, 0);
  1085. pll_ctrl = 0;
  1086. /* Workout input divider based on MCLK rate */
  1087. if ((da7213->mclk_rate == 32768) && (source == DA7213_SYSCLK_PLL)) {
  1088. /* 32KHz PLL Mode */
  1089. indiv_bits = DA7213_PLL_INDIV_10_20_MHZ;
  1090. indiv = DA7213_PLL_INDIV_10_20_MHZ_VAL;
  1091. freq_ref = 3750000;
  1092. pll_ctrl |= DA7213_PLL_32K_MODE;
  1093. } else {
  1094. /* 5 - 54MHz MCLK */
  1095. if (da7213->mclk_rate < 5000000) {
  1096. goto pll_err;
  1097. } else if (da7213->mclk_rate <= 10000000) {
  1098. indiv_bits = DA7213_PLL_INDIV_5_10_MHZ;
  1099. indiv = DA7213_PLL_INDIV_5_10_MHZ_VAL;
  1100. } else if (da7213->mclk_rate <= 20000000) {
  1101. indiv_bits = DA7213_PLL_INDIV_10_20_MHZ;
  1102. indiv = DA7213_PLL_INDIV_10_20_MHZ_VAL;
  1103. } else if (da7213->mclk_rate <= 40000000) {
  1104. indiv_bits = DA7213_PLL_INDIV_20_40_MHZ;
  1105. indiv = DA7213_PLL_INDIV_20_40_MHZ_VAL;
  1106. } else if (da7213->mclk_rate <= 54000000) {
  1107. indiv_bits = DA7213_PLL_INDIV_40_54_MHZ;
  1108. indiv = DA7213_PLL_INDIV_40_54_MHZ_VAL;
  1109. } else {
  1110. goto pll_err;
  1111. }
  1112. freq_ref = (da7213->mclk_rate / indiv);
  1113. }
  1114. pll_ctrl |= indiv_bits;
  1115. /* PLL Bypass mode */
  1116. if (source == DA7213_SYSCLK_MCLK) {
  1117. snd_soc_write(codec, DA7213_PLL_CTRL, pll_ctrl);
  1118. return 0;
  1119. }
  1120. /*
  1121. * If Codec is slave and SRM enabled,
  1122. * freq_out is (98304000 + 90316800)/2 = 94310400
  1123. */
  1124. if (!da7213->master && da7213->srm_en) {
  1125. fout = DA7213_PLL_FREQ_OUT_94310400;
  1126. pll_ctrl |= DA7213_PLL_SRM_EN;
  1127. }
  1128. /* Enable MCLK squarer if required */
  1129. if (da7213->mclk_squarer_en)
  1130. pll_ctrl |= DA7213_PLL_MCLK_SQR_EN;
  1131. /* Calculate dividers for PLL */
  1132. pll_integer = fout / freq_ref;
  1133. frac_div = (u64)(fout % freq_ref) * 8192ULL;
  1134. do_div(frac_div, freq_ref);
  1135. pll_frac_top = (frac_div >> DA7213_BYTE_SHIFT) & DA7213_BYTE_MASK;
  1136. pll_frac_bot = (frac_div) & DA7213_BYTE_MASK;
  1137. /* Write PLL dividers */
  1138. snd_soc_write(codec, DA7213_PLL_FRAC_TOP, pll_frac_top);
  1139. snd_soc_write(codec, DA7213_PLL_FRAC_BOT, pll_frac_bot);
  1140. snd_soc_write(codec, DA7213_PLL_INTEGER, pll_integer);
  1141. /* Enable PLL */
  1142. pll_ctrl |= DA7213_PLL_EN;
  1143. snd_soc_write(codec, DA7213_PLL_CTRL, pll_ctrl);
  1144. return 0;
  1145. pll_err:
  1146. dev_err(codec_dai->dev, "Unsupported PLL input frequency %d\n",
  1147. da7213->mclk_rate);
  1148. return -EINVAL;
  1149. }
  1150. /* DAI operations */
  1151. static const struct snd_soc_dai_ops da7213_dai_ops = {
  1152. .hw_params = da7213_hw_params,
  1153. .set_fmt = da7213_set_dai_fmt,
  1154. .set_sysclk = da7213_set_dai_sysclk,
  1155. .set_pll = da7213_set_dai_pll,
  1156. .digital_mute = da7213_mute,
  1157. };
  1158. static struct snd_soc_dai_driver da7213_dai = {
  1159. .name = "da7213-hifi",
  1160. /* Playback Capabilities */
  1161. .playback = {
  1162. .stream_name = "Playback",
  1163. .channels_min = 1,
  1164. .channels_max = 2,
  1165. .rates = SNDRV_PCM_RATE_8000_96000,
  1166. .formats = DA7213_FORMATS,
  1167. },
  1168. /* Capture Capabilities */
  1169. .capture = {
  1170. .stream_name = "Capture",
  1171. .channels_min = 1,
  1172. .channels_max = 2,
  1173. .rates = SNDRV_PCM_RATE_8000_96000,
  1174. .formats = DA7213_FORMATS,
  1175. },
  1176. .ops = &da7213_dai_ops,
  1177. .symmetric_rates = 1,
  1178. };
  1179. static int da7213_set_bias_level(struct snd_soc_codec *codec,
  1180. enum snd_soc_bias_level level)
  1181. {
  1182. switch (level) {
  1183. case SND_SOC_BIAS_ON:
  1184. case SND_SOC_BIAS_PREPARE:
  1185. break;
  1186. case SND_SOC_BIAS_STANDBY:
  1187. if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
  1188. /* Enable VMID reference & master bias */
  1189. snd_soc_update_bits(codec, DA7213_REFERENCES,
  1190. DA7213_VMID_EN | DA7213_BIAS_EN,
  1191. DA7213_VMID_EN | DA7213_BIAS_EN);
  1192. }
  1193. break;
  1194. case SND_SOC_BIAS_OFF:
  1195. /* Disable VMID reference & master bias */
  1196. snd_soc_update_bits(codec, DA7213_REFERENCES,
  1197. DA7213_VMID_EN | DA7213_BIAS_EN, 0);
  1198. break;
  1199. }
  1200. codec->dapm.bias_level = level;
  1201. return 0;
  1202. }
  1203. static int da7213_probe(struct snd_soc_codec *codec)
  1204. {
  1205. int ret;
  1206. struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
  1207. struct da7213_platform_data *pdata = da7213->pdata;
  1208. codec->control_data = da7213->regmap;
  1209. ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_REGMAP);
  1210. if (ret < 0) {
  1211. dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
  1212. return ret;
  1213. }
  1214. /* Default to using ALC auto offset calibration mode. */
  1215. snd_soc_update_bits(codec, DA7213_ALC_CTRL1,
  1216. DA7213_ALC_CALIB_MODE_MAN, 0);
  1217. da7213->alc_calib_auto = true;
  1218. /* Default to using SRM for slave mode */
  1219. da7213->srm_en = true;
  1220. /* Enable all Gain Ramps */
  1221. snd_soc_update_bits(codec, DA7213_AUX_L_CTRL,
  1222. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1223. snd_soc_update_bits(codec, DA7213_AUX_R_CTRL,
  1224. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1225. snd_soc_update_bits(codec, DA7213_MIXIN_L_CTRL,
  1226. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1227. snd_soc_update_bits(codec, DA7213_MIXIN_R_CTRL,
  1228. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1229. snd_soc_update_bits(codec, DA7213_ADC_L_CTRL,
  1230. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1231. snd_soc_update_bits(codec, DA7213_ADC_R_CTRL,
  1232. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1233. snd_soc_update_bits(codec, DA7213_DAC_L_CTRL,
  1234. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1235. snd_soc_update_bits(codec, DA7213_DAC_R_CTRL,
  1236. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1237. snd_soc_update_bits(codec, DA7213_HP_L_CTRL,
  1238. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1239. snd_soc_update_bits(codec, DA7213_HP_R_CTRL,
  1240. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1241. snd_soc_update_bits(codec, DA7213_LINE_CTRL,
  1242. DA7213_GAIN_RAMP_EN, DA7213_GAIN_RAMP_EN);
  1243. /*
  1244. * There are two separate control bits for input and output mixers as
  1245. * well as headphone and line outs.
  1246. * One to enable corresponding amplifier and other to enable its
  1247. * output. As amplifier bits are related to power control, they are
  1248. * being managed by DAPM while other (non power related) bits are
  1249. * enabled here
  1250. */
  1251. snd_soc_update_bits(codec, DA7213_MIXIN_L_CTRL,
  1252. DA7213_MIXIN_MIX_EN, DA7213_MIXIN_MIX_EN);
  1253. snd_soc_update_bits(codec, DA7213_MIXIN_R_CTRL,
  1254. DA7213_MIXIN_MIX_EN, DA7213_MIXIN_MIX_EN);
  1255. snd_soc_update_bits(codec, DA7213_MIXOUT_L_CTRL,
  1256. DA7213_MIXOUT_MIX_EN, DA7213_MIXOUT_MIX_EN);
  1257. snd_soc_update_bits(codec, DA7213_MIXOUT_R_CTRL,
  1258. DA7213_MIXOUT_MIX_EN, DA7213_MIXOUT_MIX_EN);
  1259. snd_soc_update_bits(codec, DA7213_HP_L_CTRL,
  1260. DA7213_HP_AMP_OE, DA7213_HP_AMP_OE);
  1261. snd_soc_update_bits(codec, DA7213_HP_R_CTRL,
  1262. DA7213_HP_AMP_OE, DA7213_HP_AMP_OE);
  1263. snd_soc_update_bits(codec, DA7213_LINE_CTRL,
  1264. DA7213_LINE_AMP_OE, DA7213_LINE_AMP_OE);
  1265. /* Set platform data values */
  1266. if (da7213->pdata) {
  1267. u8 micbias_lvl = 0, dmic_cfg = 0;
  1268. /* Set Mic Bias voltages */
  1269. switch (pdata->micbias1_lvl) {
  1270. case DA7213_MICBIAS_1_6V:
  1271. case DA7213_MICBIAS_2_2V:
  1272. case DA7213_MICBIAS_2_5V:
  1273. case DA7213_MICBIAS_3_0V:
  1274. micbias_lvl |= (pdata->micbias1_lvl <<
  1275. DA7213_MICBIAS1_LEVEL_SHIFT);
  1276. break;
  1277. }
  1278. switch (pdata->micbias2_lvl) {
  1279. case DA7213_MICBIAS_1_6V:
  1280. case DA7213_MICBIAS_2_2V:
  1281. case DA7213_MICBIAS_2_5V:
  1282. case DA7213_MICBIAS_3_0V:
  1283. micbias_lvl |= (pdata->micbias2_lvl <<
  1284. DA7213_MICBIAS2_LEVEL_SHIFT);
  1285. break;
  1286. }
  1287. snd_soc_update_bits(codec, DA7213_MICBIAS_CTRL,
  1288. DA7213_MICBIAS1_LEVEL_MASK |
  1289. DA7213_MICBIAS2_LEVEL_MASK, micbias_lvl);
  1290. /* Set DMIC configuration */
  1291. switch (pdata->dmic_data_sel) {
  1292. case DA7213_DMIC_DATA_LFALL_RRISE:
  1293. case DA7213_DMIC_DATA_LRISE_RFALL:
  1294. dmic_cfg |= (pdata->dmic_data_sel <<
  1295. DA7213_DMIC_DATA_SEL_SHIFT);
  1296. break;
  1297. }
  1298. switch (pdata->dmic_data_sel) {
  1299. case DA7213_DMIC_SAMPLE_ON_CLKEDGE:
  1300. case DA7213_DMIC_SAMPLE_BETWEEN_CLKEDGE:
  1301. dmic_cfg |= (pdata->dmic_data_sel <<
  1302. DA7213_DMIC_SAMPLEPHASE_SHIFT);
  1303. break;
  1304. }
  1305. switch (pdata->dmic_data_sel) {
  1306. case DA7213_DMIC_CLK_3_0MHZ:
  1307. case DA7213_DMIC_CLK_1_5MHZ:
  1308. dmic_cfg |= (pdata->dmic_data_sel <<
  1309. DA7213_DMIC_CLK_RATE_SHIFT);
  1310. break;
  1311. }
  1312. snd_soc_update_bits(codec, DA7213_MIC_CONFIG,
  1313. DA7213_DMIC_DATA_SEL_MASK |
  1314. DA7213_DMIC_SAMPLEPHASE_MASK |
  1315. DA7213_DMIC_CLK_RATE_MASK, dmic_cfg);
  1316. /* Set MCLK squaring */
  1317. da7213->mclk_squarer_en = pdata->mclk_squaring;
  1318. }
  1319. return 0;
  1320. }
  1321. static struct snd_soc_codec_driver soc_codec_dev_da7213 = {
  1322. .probe = da7213_probe,
  1323. .set_bias_level = da7213_set_bias_level,
  1324. .controls = da7213_snd_controls,
  1325. .num_controls = ARRAY_SIZE(da7213_snd_controls),
  1326. .dapm_widgets = da7213_dapm_widgets,
  1327. .num_dapm_widgets = ARRAY_SIZE(da7213_dapm_widgets),
  1328. .dapm_routes = da7213_audio_map,
  1329. .num_dapm_routes = ARRAY_SIZE(da7213_audio_map),
  1330. };
  1331. static const struct regmap_config da7213_regmap_config = {
  1332. .reg_bits = 8,
  1333. .val_bits = 8,
  1334. .reg_defaults = da7213_reg_defaults,
  1335. .num_reg_defaults = ARRAY_SIZE(da7213_reg_defaults),
  1336. .volatile_reg = da7213_volatile_register,
  1337. .cache_type = REGCACHE_RBTREE,
  1338. };
  1339. static int da7213_i2c_probe(struct i2c_client *i2c,
  1340. const struct i2c_device_id *id)
  1341. {
  1342. struct da7213_priv *da7213;
  1343. struct da7213_platform_data *pdata = dev_get_platdata(&i2c->dev);
  1344. int ret;
  1345. da7213 = devm_kzalloc(&i2c->dev, sizeof(struct da7213_priv),
  1346. GFP_KERNEL);
  1347. if (!da7213)
  1348. return -ENOMEM;
  1349. if (pdata)
  1350. da7213->pdata = pdata;
  1351. i2c_set_clientdata(i2c, da7213);
  1352. da7213->regmap = devm_regmap_init_i2c(i2c, &da7213_regmap_config);
  1353. if (IS_ERR(da7213->regmap)) {
  1354. ret = PTR_ERR(da7213->regmap);
  1355. dev_err(&i2c->dev, "regmap_init() failed: %d\n", ret);
  1356. return ret;
  1357. }
  1358. ret = snd_soc_register_codec(&i2c->dev,
  1359. &soc_codec_dev_da7213, &da7213_dai, 1);
  1360. if (ret < 0) {
  1361. dev_err(&i2c->dev, "Failed to register da7213 codec: %d\n",
  1362. ret);
  1363. }
  1364. return ret;
  1365. }
  1366. static int da7213_remove(struct i2c_client *client)
  1367. {
  1368. snd_soc_unregister_codec(&client->dev);
  1369. return 0;
  1370. }
  1371. static const struct i2c_device_id da7213_i2c_id[] = {
  1372. { "da7213", 0 },
  1373. { }
  1374. };
  1375. MODULE_DEVICE_TABLE(i2c, da7213_i2c_id);
  1376. /* I2C codec control layer */
  1377. static struct i2c_driver da7213_i2c_driver = {
  1378. .driver = {
  1379. .name = "da7213",
  1380. .owner = THIS_MODULE,
  1381. },
  1382. .probe = da7213_i2c_probe,
  1383. .remove = da7213_remove,
  1384. .id_table = da7213_i2c_id,
  1385. };
  1386. module_i2c_driver(da7213_i2c_driver);
  1387. MODULE_DESCRIPTION("ASoC DA7213 Codec driver");
  1388. MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>");
  1389. MODULE_LICENSE("GPL");