tlv320adcx140.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218
  1. // SPDX-License-Identifier: GPL-2.0
  2. // TLV320ADCX140 Sound driver
  3. // Copyright (C) 2020 Texas Instruments Incorporated - https://www.ti.com/
  4. #include <linux/module.h>
  5. #include <linux/moduleparam.h>
  6. #include <linux/init.h>
  7. #include <linux/delay.h>
  8. #include <linux/pm.h>
  9. #include <linux/i2c.h>
  10. #include <linux/gpio/consumer.h>
  11. #include <linux/regulator/consumer.h>
  12. #include <linux/acpi.h>
  13. #include <linux/of.h>
  14. #include <linux/of_gpio.h>
  15. #include <linux/slab.h>
  16. #include <sound/core.h>
  17. #include <sound/pcm.h>
  18. #include <sound/pcm_params.h>
  19. #include <sound/soc.h>
  20. #include <sound/initval.h>
  21. #include <sound/tlv.h>
  22. #include "tlv320adcx140.h"
  23. struct adcx140_priv {
  24. struct snd_soc_component *component;
  25. struct regulator *supply_areg;
  26. struct gpio_desc *gpio_reset;
  27. struct regmap *regmap;
  28. struct device *dev;
  29. bool micbias_vg;
  30. bool phase_calib_on;
  31. unsigned int dai_fmt;
  32. unsigned int slot_width;
  33. };
  34. static const char * const gpo_config_names[] = {
  35. "ti,gpo-config-1",
  36. "ti,gpo-config-2",
  37. "ti,gpo-config-3",
  38. "ti,gpo-config-4",
  39. };
  40. static const struct reg_default adcx140_reg_defaults[] = {
  41. { ADCX140_PAGE_SELECT, 0x00 },
  42. { ADCX140_SW_RESET, 0x00 },
  43. { ADCX140_SLEEP_CFG, 0x00 },
  44. { ADCX140_SHDN_CFG, 0x05 },
  45. { ADCX140_ASI_CFG0, 0x30 },
  46. { ADCX140_ASI_CFG1, 0x00 },
  47. { ADCX140_ASI_CFG2, 0x00 },
  48. { ADCX140_ASI_CH1, 0x00 },
  49. { ADCX140_ASI_CH2, 0x01 },
  50. { ADCX140_ASI_CH3, 0x02 },
  51. { ADCX140_ASI_CH4, 0x03 },
  52. { ADCX140_ASI_CH5, 0x04 },
  53. { ADCX140_ASI_CH6, 0x05 },
  54. { ADCX140_ASI_CH7, 0x06 },
  55. { ADCX140_ASI_CH8, 0x07 },
  56. { ADCX140_MST_CFG0, 0x02 },
  57. { ADCX140_MST_CFG1, 0x48 },
  58. { ADCX140_ASI_STS, 0xff },
  59. { ADCX140_CLK_SRC, 0x10 },
  60. { ADCX140_PDMCLK_CFG, 0x40 },
  61. { ADCX140_PDM_CFG, 0x00 },
  62. { ADCX140_GPIO_CFG0, 0x22 },
  63. { ADCX140_GPO_CFG0, 0x00 },
  64. { ADCX140_GPO_CFG1, 0x00 },
  65. { ADCX140_GPO_CFG2, 0x00 },
  66. { ADCX140_GPO_CFG3, 0x00 },
  67. { ADCX140_GPO_VAL, 0x00 },
  68. { ADCX140_GPIO_MON, 0x00 },
  69. { ADCX140_GPI_CFG0, 0x00 },
  70. { ADCX140_GPI_CFG1, 0x00 },
  71. { ADCX140_GPI_MON, 0x00 },
  72. { ADCX140_INT_CFG, 0x00 },
  73. { ADCX140_INT_MASK0, 0xff },
  74. { ADCX140_INT_LTCH0, 0x00 },
  75. { ADCX140_BIAS_CFG, 0x00 },
  76. { ADCX140_CH1_CFG0, 0x00 },
  77. { ADCX140_CH1_CFG1, 0x00 },
  78. { ADCX140_CH1_CFG2, 0xc9 },
  79. { ADCX140_CH1_CFG3, 0x80 },
  80. { ADCX140_CH1_CFG4, 0x00 },
  81. { ADCX140_CH2_CFG0, 0x00 },
  82. { ADCX140_CH2_CFG1, 0x00 },
  83. { ADCX140_CH2_CFG2, 0xc9 },
  84. { ADCX140_CH2_CFG3, 0x80 },
  85. { ADCX140_CH2_CFG4, 0x00 },
  86. { ADCX140_CH3_CFG0, 0x00 },
  87. { ADCX140_CH3_CFG1, 0x00 },
  88. { ADCX140_CH3_CFG2, 0xc9 },
  89. { ADCX140_CH3_CFG3, 0x80 },
  90. { ADCX140_CH3_CFG4, 0x00 },
  91. { ADCX140_CH4_CFG0, 0x00 },
  92. { ADCX140_CH4_CFG1, 0x00 },
  93. { ADCX140_CH4_CFG2, 0xc9 },
  94. { ADCX140_CH4_CFG3, 0x80 },
  95. { ADCX140_CH4_CFG4, 0x00 },
  96. { ADCX140_CH5_CFG2, 0xc9 },
  97. { ADCX140_CH5_CFG3, 0x80 },
  98. { ADCX140_CH5_CFG4, 0x00 },
  99. { ADCX140_CH6_CFG2, 0xc9 },
  100. { ADCX140_CH6_CFG3, 0x80 },
  101. { ADCX140_CH6_CFG4, 0x00 },
  102. { ADCX140_CH7_CFG2, 0xc9 },
  103. { ADCX140_CH7_CFG3, 0x80 },
  104. { ADCX140_CH7_CFG4, 0x00 },
  105. { ADCX140_CH8_CFG2, 0xc9 },
  106. { ADCX140_CH8_CFG3, 0x80 },
  107. { ADCX140_CH8_CFG4, 0x00 },
  108. { ADCX140_DSP_CFG0, 0x01 },
  109. { ADCX140_DSP_CFG1, 0x40 },
  110. { ADCX140_DRE_CFG0, 0x7b },
  111. { ADCX140_AGC_CFG0, 0xe7 },
  112. { ADCX140_IN_CH_EN, 0xf0 },
  113. { ADCX140_ASI_OUT_CH_EN, 0x00 },
  114. { ADCX140_PWR_CFG, 0x00 },
  115. { ADCX140_DEV_STS0, 0x00 },
  116. { ADCX140_DEV_STS1, 0x80 },
  117. };
  118. static const struct regmap_range_cfg adcx140_ranges[] = {
  119. {
  120. .range_min = 0,
  121. .range_max = 12 * 128,
  122. .selector_reg = ADCX140_PAGE_SELECT,
  123. .selector_mask = 0xff,
  124. .selector_shift = 0,
  125. .window_start = 0,
  126. .window_len = 128,
  127. },
  128. };
  129. static bool adcx140_volatile(struct device *dev, unsigned int reg)
  130. {
  131. switch (reg) {
  132. case ADCX140_SW_RESET:
  133. case ADCX140_DEV_STS0:
  134. case ADCX140_DEV_STS1:
  135. case ADCX140_ASI_STS:
  136. return true;
  137. default:
  138. return false;
  139. }
  140. }
  141. static const struct regmap_config adcx140_i2c_regmap = {
  142. .reg_bits = 8,
  143. .val_bits = 8,
  144. .reg_defaults = adcx140_reg_defaults,
  145. .num_reg_defaults = ARRAY_SIZE(adcx140_reg_defaults),
  146. .cache_type = REGCACHE_FLAT,
  147. .ranges = adcx140_ranges,
  148. .num_ranges = ARRAY_SIZE(adcx140_ranges),
  149. .max_register = 12 * 128,
  150. .volatile_reg = adcx140_volatile,
  151. };
  152. /* Digital Volume control. From -100 to 27 dB in 0.5 dB steps */
  153. static DECLARE_TLV_DB_SCALE(dig_vol_tlv, -10050, 50, 0);
  154. /* ADC gain. From 0 to 42 dB in 1 dB steps */
  155. static DECLARE_TLV_DB_SCALE(adc_tlv, 0, 100, 0);
  156. /* DRE Level. From -12 dB to -66 dB in 1 dB steps */
  157. static DECLARE_TLV_DB_SCALE(dre_thresh_tlv, -6600, 100, 0);
  158. /* DRE Max Gain. From 2 dB to 26 dB in 2 dB steps */
  159. static DECLARE_TLV_DB_SCALE(dre_gain_tlv, 200, 200, 0);
  160. /* AGC Level. From -6 dB to -36 dB in 2 dB steps */
  161. static DECLARE_TLV_DB_SCALE(agc_thresh_tlv, -3600, 200, 0);
  162. /* AGC Max Gain. From 3 dB to 42 dB in 3 dB steps */
  163. static DECLARE_TLV_DB_SCALE(agc_gain_tlv, 300, 300, 0);
  164. static const char * const decimation_filter_text[] = {
  165. "Linear Phase", "Low Latency", "Ultra-low Latency"
  166. };
  167. static SOC_ENUM_SINGLE_DECL(decimation_filter_enum, ADCX140_DSP_CFG0, 4,
  168. decimation_filter_text);
  169. static const struct snd_kcontrol_new decimation_filter_controls[] = {
  170. SOC_DAPM_ENUM("Decimation Filter", decimation_filter_enum),
  171. };
  172. static const char * const pdmclk_text[] = {
  173. "2.8224 MHz", "1.4112 MHz", "705.6 kHz", "5.6448 MHz"
  174. };
  175. static SOC_ENUM_SINGLE_DECL(pdmclk_select_enum, ADCX140_PDMCLK_CFG, 0,
  176. pdmclk_text);
  177. static const struct snd_kcontrol_new pdmclk_div_controls[] = {
  178. SOC_DAPM_ENUM("PDM Clk Divider Select", pdmclk_select_enum),
  179. };
  180. static const char * const resistor_text[] = {
  181. "2.5 kOhm", "10 kOhm", "20 kOhm"
  182. };
  183. static SOC_ENUM_SINGLE_DECL(in1_resistor_enum, ADCX140_CH1_CFG0, 2,
  184. resistor_text);
  185. static SOC_ENUM_SINGLE_DECL(in2_resistor_enum, ADCX140_CH2_CFG0, 2,
  186. resistor_text);
  187. static SOC_ENUM_SINGLE_DECL(in3_resistor_enum, ADCX140_CH3_CFG0, 2,
  188. resistor_text);
  189. static SOC_ENUM_SINGLE_DECL(in4_resistor_enum, ADCX140_CH4_CFG0, 2,
  190. resistor_text);
  191. static const struct snd_kcontrol_new in1_resistor_controls[] = {
  192. SOC_DAPM_ENUM("CH1 Resistor Select", in1_resistor_enum),
  193. };
  194. static const struct snd_kcontrol_new in2_resistor_controls[] = {
  195. SOC_DAPM_ENUM("CH2 Resistor Select", in2_resistor_enum),
  196. };
  197. static const struct snd_kcontrol_new in3_resistor_controls[] = {
  198. SOC_DAPM_ENUM("CH3 Resistor Select", in3_resistor_enum),
  199. };
  200. static const struct snd_kcontrol_new in4_resistor_controls[] = {
  201. SOC_DAPM_ENUM("CH4 Resistor Select", in4_resistor_enum),
  202. };
  203. /* Analog/Digital Selection */
  204. static const char * const adcx140_mic_sel_text[] = {"Analog", "Line In", "Digital"};
  205. static const char * const adcx140_analog_sel_text[] = {"Analog", "Line In"};
  206. static SOC_ENUM_SINGLE_DECL(adcx140_mic1p_enum,
  207. ADCX140_CH1_CFG0, 5,
  208. adcx140_mic_sel_text);
  209. static const struct snd_kcontrol_new adcx140_dapm_mic1p_control =
  210. SOC_DAPM_ENUM("MIC1P MUX", adcx140_mic1p_enum);
  211. static SOC_ENUM_SINGLE_DECL(adcx140_mic1_analog_enum,
  212. ADCX140_CH1_CFG0, 7,
  213. adcx140_analog_sel_text);
  214. static const struct snd_kcontrol_new adcx140_dapm_mic1_analog_control =
  215. SOC_DAPM_ENUM("MIC1 Analog MUX", adcx140_mic1_analog_enum);
  216. static SOC_ENUM_SINGLE_DECL(adcx140_mic1m_enum,
  217. ADCX140_CH1_CFG0, 5,
  218. adcx140_mic_sel_text);
  219. static const struct snd_kcontrol_new adcx140_dapm_mic1m_control =
  220. SOC_DAPM_ENUM("MIC1M MUX", adcx140_mic1m_enum);
  221. static SOC_ENUM_SINGLE_DECL(adcx140_mic2p_enum,
  222. ADCX140_CH2_CFG0, 5,
  223. adcx140_mic_sel_text);
  224. static const struct snd_kcontrol_new adcx140_dapm_mic2p_control =
  225. SOC_DAPM_ENUM("MIC2P MUX", adcx140_mic2p_enum);
  226. static SOC_ENUM_SINGLE_DECL(adcx140_mic2_analog_enum,
  227. ADCX140_CH2_CFG0, 7,
  228. adcx140_analog_sel_text);
  229. static const struct snd_kcontrol_new adcx140_dapm_mic2_analog_control =
  230. SOC_DAPM_ENUM("MIC2 Analog MUX", adcx140_mic2_analog_enum);
  231. static SOC_ENUM_SINGLE_DECL(adcx140_mic2m_enum,
  232. ADCX140_CH2_CFG0, 5,
  233. adcx140_mic_sel_text);
  234. static const struct snd_kcontrol_new adcx140_dapm_mic2m_control =
  235. SOC_DAPM_ENUM("MIC2M MUX", adcx140_mic2m_enum);
  236. static SOC_ENUM_SINGLE_DECL(adcx140_mic3p_enum,
  237. ADCX140_CH3_CFG0, 5,
  238. adcx140_mic_sel_text);
  239. static const struct snd_kcontrol_new adcx140_dapm_mic3p_control =
  240. SOC_DAPM_ENUM("MIC3P MUX", adcx140_mic3p_enum);
  241. static SOC_ENUM_SINGLE_DECL(adcx140_mic3_analog_enum,
  242. ADCX140_CH3_CFG0, 7,
  243. adcx140_analog_sel_text);
  244. static const struct snd_kcontrol_new adcx140_dapm_mic3_analog_control =
  245. SOC_DAPM_ENUM("MIC3 Analog MUX", adcx140_mic3_analog_enum);
  246. static SOC_ENUM_SINGLE_DECL(adcx140_mic3m_enum,
  247. ADCX140_CH3_CFG0, 5,
  248. adcx140_mic_sel_text);
  249. static const struct snd_kcontrol_new adcx140_dapm_mic3m_control =
  250. SOC_DAPM_ENUM("MIC3M MUX", adcx140_mic3m_enum);
  251. static SOC_ENUM_SINGLE_DECL(adcx140_mic4p_enum,
  252. ADCX140_CH4_CFG0, 5,
  253. adcx140_mic_sel_text);
  254. static const struct snd_kcontrol_new adcx140_dapm_mic4p_control =
  255. SOC_DAPM_ENUM("MIC4P MUX", adcx140_mic4p_enum);
  256. static SOC_ENUM_SINGLE_DECL(adcx140_mic4_analog_enum,
  257. ADCX140_CH4_CFG0, 7,
  258. adcx140_analog_sel_text);
  259. static const struct snd_kcontrol_new adcx140_dapm_mic4_analog_control =
  260. SOC_DAPM_ENUM("MIC4 Analog MUX", adcx140_mic4_analog_enum);
  261. static SOC_ENUM_SINGLE_DECL(adcx140_mic4m_enum,
  262. ADCX140_CH4_CFG0, 5,
  263. adcx140_mic_sel_text);
  264. static const struct snd_kcontrol_new adcx140_dapm_mic4m_control =
  265. SOC_DAPM_ENUM("MIC4M MUX", adcx140_mic4m_enum);
  266. static const struct snd_kcontrol_new adcx140_dapm_ch1_en_switch =
  267. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 7, 1, 0);
  268. static const struct snd_kcontrol_new adcx140_dapm_ch2_en_switch =
  269. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 6, 1, 0);
  270. static const struct snd_kcontrol_new adcx140_dapm_ch3_en_switch =
  271. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 5, 1, 0);
  272. static const struct snd_kcontrol_new adcx140_dapm_ch4_en_switch =
  273. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 4, 1, 0);
  274. static const struct snd_kcontrol_new adcx140_dapm_ch5_en_switch =
  275. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 3, 1, 0);
  276. static const struct snd_kcontrol_new adcx140_dapm_ch6_en_switch =
  277. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 2, 1, 0);
  278. static const struct snd_kcontrol_new adcx140_dapm_ch7_en_switch =
  279. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 1, 1, 0);
  280. static const struct snd_kcontrol_new adcx140_dapm_ch8_en_switch =
  281. SOC_DAPM_SINGLE("Switch", ADCX140_ASI_OUT_CH_EN, 0, 1, 0);
  282. static const struct snd_kcontrol_new adcx140_dapm_ch1_dre_en_switch =
  283. SOC_DAPM_SINGLE("Switch", ADCX140_CH1_CFG0, 0, 1, 0);
  284. static const struct snd_kcontrol_new adcx140_dapm_ch2_dre_en_switch =
  285. SOC_DAPM_SINGLE("Switch", ADCX140_CH2_CFG0, 0, 1, 0);
  286. static const struct snd_kcontrol_new adcx140_dapm_ch3_dre_en_switch =
  287. SOC_DAPM_SINGLE("Switch", ADCX140_CH3_CFG0, 0, 1, 0);
  288. static const struct snd_kcontrol_new adcx140_dapm_ch4_dre_en_switch =
  289. SOC_DAPM_SINGLE("Switch", ADCX140_CH4_CFG0, 0, 1, 0);
  290. static const struct snd_kcontrol_new adcx140_dapm_dre_en_switch =
  291. SOC_DAPM_SINGLE("Switch", ADCX140_DSP_CFG1, 3, 1, 0);
  292. /* Output Mixer */
  293. static const struct snd_kcontrol_new adcx140_output_mixer_controls[] = {
  294. SOC_DAPM_SINGLE("Digital CH1 Switch", 0, 0, 0, 0),
  295. SOC_DAPM_SINGLE("Digital CH2 Switch", 0, 0, 0, 0),
  296. SOC_DAPM_SINGLE("Digital CH3 Switch", 0, 0, 0, 0),
  297. SOC_DAPM_SINGLE("Digital CH4 Switch", 0, 0, 0, 0),
  298. };
  299. static const struct snd_soc_dapm_widget adcx140_dapm_widgets[] = {
  300. /* Analog Differential Inputs */
  301. SND_SOC_DAPM_INPUT("MIC1P"),
  302. SND_SOC_DAPM_INPUT("MIC1M"),
  303. SND_SOC_DAPM_INPUT("MIC2P"),
  304. SND_SOC_DAPM_INPUT("MIC2M"),
  305. SND_SOC_DAPM_INPUT("MIC3P"),
  306. SND_SOC_DAPM_INPUT("MIC3M"),
  307. SND_SOC_DAPM_INPUT("MIC4P"),
  308. SND_SOC_DAPM_INPUT("MIC4M"),
  309. SND_SOC_DAPM_OUTPUT("CH1_OUT"),
  310. SND_SOC_DAPM_OUTPUT("CH2_OUT"),
  311. SND_SOC_DAPM_OUTPUT("CH3_OUT"),
  312. SND_SOC_DAPM_OUTPUT("CH4_OUT"),
  313. SND_SOC_DAPM_OUTPUT("CH5_OUT"),
  314. SND_SOC_DAPM_OUTPUT("CH6_OUT"),
  315. SND_SOC_DAPM_OUTPUT("CH7_OUT"),
  316. SND_SOC_DAPM_OUTPUT("CH8_OUT"),
  317. SND_SOC_DAPM_MIXER("Output Mixer", SND_SOC_NOPM, 0, 0,
  318. &adcx140_output_mixer_controls[0],
  319. ARRAY_SIZE(adcx140_output_mixer_controls)),
  320. /* Input Selection to MIC_PGA */
  321. SND_SOC_DAPM_MUX("MIC1P Input Mux", SND_SOC_NOPM, 0, 0,
  322. &adcx140_dapm_mic1p_control),
  323. SND_SOC_DAPM_MUX("MIC2P Input Mux", SND_SOC_NOPM, 0, 0,
  324. &adcx140_dapm_mic2p_control),
  325. SND_SOC_DAPM_MUX("MIC3P Input Mux", SND_SOC_NOPM, 0, 0,
  326. &adcx140_dapm_mic3p_control),
  327. SND_SOC_DAPM_MUX("MIC4P Input Mux", SND_SOC_NOPM, 0, 0,
  328. &adcx140_dapm_mic4p_control),
  329. /* Input Selection to MIC_PGA */
  330. SND_SOC_DAPM_MUX("MIC1 Analog Mux", SND_SOC_NOPM, 0, 0,
  331. &adcx140_dapm_mic1_analog_control),
  332. SND_SOC_DAPM_MUX("MIC2 Analog Mux", SND_SOC_NOPM, 0, 0,
  333. &adcx140_dapm_mic2_analog_control),
  334. SND_SOC_DAPM_MUX("MIC3 Analog Mux", SND_SOC_NOPM, 0, 0,
  335. &adcx140_dapm_mic3_analog_control),
  336. SND_SOC_DAPM_MUX("MIC4 Analog Mux", SND_SOC_NOPM, 0, 0,
  337. &adcx140_dapm_mic4_analog_control),
  338. SND_SOC_DAPM_MUX("MIC1M Input Mux", SND_SOC_NOPM, 0, 0,
  339. &adcx140_dapm_mic1m_control),
  340. SND_SOC_DAPM_MUX("MIC2M Input Mux", SND_SOC_NOPM, 0, 0,
  341. &adcx140_dapm_mic2m_control),
  342. SND_SOC_DAPM_MUX("MIC3M Input Mux", SND_SOC_NOPM, 0, 0,
  343. &adcx140_dapm_mic3m_control),
  344. SND_SOC_DAPM_MUX("MIC4M Input Mux", SND_SOC_NOPM, 0, 0,
  345. &adcx140_dapm_mic4m_control),
  346. SND_SOC_DAPM_PGA("MIC_GAIN_CTL_CH1", SND_SOC_NOPM, 0, 0, NULL, 0),
  347. SND_SOC_DAPM_PGA("MIC_GAIN_CTL_CH2", SND_SOC_NOPM, 0, 0, NULL, 0),
  348. SND_SOC_DAPM_PGA("MIC_GAIN_CTL_CH3", SND_SOC_NOPM, 0, 0, NULL, 0),
  349. SND_SOC_DAPM_PGA("MIC_GAIN_CTL_CH4", SND_SOC_NOPM, 0, 0, NULL, 0),
  350. SND_SOC_DAPM_ADC("CH1_ADC", "CH1 Capture", ADCX140_IN_CH_EN, 7, 0),
  351. SND_SOC_DAPM_ADC("CH2_ADC", "CH2 Capture", ADCX140_IN_CH_EN, 6, 0),
  352. SND_SOC_DAPM_ADC("CH3_ADC", "CH3 Capture", ADCX140_IN_CH_EN, 5, 0),
  353. SND_SOC_DAPM_ADC("CH4_ADC", "CH4 Capture", ADCX140_IN_CH_EN, 4, 0),
  354. SND_SOC_DAPM_ADC("CH1_DIG", "CH1 Capture", ADCX140_IN_CH_EN, 7, 0),
  355. SND_SOC_DAPM_ADC("CH2_DIG", "CH2 Capture", ADCX140_IN_CH_EN, 6, 0),
  356. SND_SOC_DAPM_ADC("CH3_DIG", "CH3 Capture", ADCX140_IN_CH_EN, 5, 0),
  357. SND_SOC_DAPM_ADC("CH4_DIG", "CH4 Capture", ADCX140_IN_CH_EN, 4, 0),
  358. SND_SOC_DAPM_ADC("CH5_DIG", "CH5 Capture", ADCX140_IN_CH_EN, 3, 0),
  359. SND_SOC_DAPM_ADC("CH6_DIG", "CH6 Capture", ADCX140_IN_CH_EN, 2, 0),
  360. SND_SOC_DAPM_ADC("CH7_DIG", "CH7 Capture", ADCX140_IN_CH_EN, 1, 0),
  361. SND_SOC_DAPM_ADC("CH8_DIG", "CH8 Capture", ADCX140_IN_CH_EN, 0, 0),
  362. SND_SOC_DAPM_SWITCH("CH1_ASI_EN", SND_SOC_NOPM, 0, 0,
  363. &adcx140_dapm_ch1_en_switch),
  364. SND_SOC_DAPM_SWITCH("CH2_ASI_EN", SND_SOC_NOPM, 0, 0,
  365. &adcx140_dapm_ch2_en_switch),
  366. SND_SOC_DAPM_SWITCH("CH3_ASI_EN", SND_SOC_NOPM, 0, 0,
  367. &adcx140_dapm_ch3_en_switch),
  368. SND_SOC_DAPM_SWITCH("CH4_ASI_EN", SND_SOC_NOPM, 0, 0,
  369. &adcx140_dapm_ch4_en_switch),
  370. SND_SOC_DAPM_SWITCH("CH5_ASI_EN", SND_SOC_NOPM, 0, 0,
  371. &adcx140_dapm_ch5_en_switch),
  372. SND_SOC_DAPM_SWITCH("CH6_ASI_EN", SND_SOC_NOPM, 0, 0,
  373. &adcx140_dapm_ch6_en_switch),
  374. SND_SOC_DAPM_SWITCH("CH7_ASI_EN", SND_SOC_NOPM, 0, 0,
  375. &adcx140_dapm_ch7_en_switch),
  376. SND_SOC_DAPM_SWITCH("CH8_ASI_EN", SND_SOC_NOPM, 0, 0,
  377. &adcx140_dapm_ch8_en_switch),
  378. SND_SOC_DAPM_SWITCH("DRE_ENABLE", SND_SOC_NOPM, 0, 0,
  379. &adcx140_dapm_dre_en_switch),
  380. SND_SOC_DAPM_SWITCH("CH1_DRE_EN", SND_SOC_NOPM, 0, 0,
  381. &adcx140_dapm_ch1_dre_en_switch),
  382. SND_SOC_DAPM_SWITCH("CH2_DRE_EN", SND_SOC_NOPM, 0, 0,
  383. &adcx140_dapm_ch2_dre_en_switch),
  384. SND_SOC_DAPM_SWITCH("CH3_DRE_EN", SND_SOC_NOPM, 0, 0,
  385. &adcx140_dapm_ch3_dre_en_switch),
  386. SND_SOC_DAPM_SWITCH("CH4_DRE_EN", SND_SOC_NOPM, 0, 0,
  387. &adcx140_dapm_ch4_dre_en_switch),
  388. SND_SOC_DAPM_MUX("IN1 Analog Mic Resistor", SND_SOC_NOPM, 0, 0,
  389. in1_resistor_controls),
  390. SND_SOC_DAPM_MUX("IN2 Analog Mic Resistor", SND_SOC_NOPM, 0, 0,
  391. in2_resistor_controls),
  392. SND_SOC_DAPM_MUX("IN3 Analog Mic Resistor", SND_SOC_NOPM, 0, 0,
  393. in3_resistor_controls),
  394. SND_SOC_DAPM_MUX("IN4 Analog Mic Resistor", SND_SOC_NOPM, 0, 0,
  395. in4_resistor_controls),
  396. SND_SOC_DAPM_MUX("PDM Clk Div Select", SND_SOC_NOPM, 0, 0,
  397. pdmclk_div_controls),
  398. SND_SOC_DAPM_MUX("Decimation Filter", SND_SOC_NOPM, 0, 0,
  399. decimation_filter_controls),
  400. };
  401. static const struct snd_soc_dapm_route adcx140_audio_map[] = {
  402. /* Outputs */
  403. {"CH1_OUT", NULL, "Output Mixer"},
  404. {"CH2_OUT", NULL, "Output Mixer"},
  405. {"CH3_OUT", NULL, "Output Mixer"},
  406. {"CH4_OUT", NULL, "Output Mixer"},
  407. {"CH1_ASI_EN", "Switch", "CH1_ADC"},
  408. {"CH2_ASI_EN", "Switch", "CH2_ADC"},
  409. {"CH3_ASI_EN", "Switch", "CH3_ADC"},
  410. {"CH4_ASI_EN", "Switch", "CH4_ADC"},
  411. {"CH1_ASI_EN", "Switch", "CH1_DIG"},
  412. {"CH2_ASI_EN", "Switch", "CH2_DIG"},
  413. {"CH3_ASI_EN", "Switch", "CH3_DIG"},
  414. {"CH4_ASI_EN", "Switch", "CH4_DIG"},
  415. {"CH5_ASI_EN", "Switch", "CH5_DIG"},
  416. {"CH6_ASI_EN", "Switch", "CH6_DIG"},
  417. {"CH7_ASI_EN", "Switch", "CH7_DIG"},
  418. {"CH8_ASI_EN", "Switch", "CH8_DIG"},
  419. {"CH5_ASI_EN", "Switch", "CH5_OUT"},
  420. {"CH6_ASI_EN", "Switch", "CH6_OUT"},
  421. {"CH7_ASI_EN", "Switch", "CH7_OUT"},
  422. {"CH8_ASI_EN", "Switch", "CH8_OUT"},
  423. {"Decimation Filter", "Linear Phase", "DRE_ENABLE"},
  424. {"Decimation Filter", "Low Latency", "DRE_ENABLE"},
  425. {"Decimation Filter", "Ultra-low Latency", "DRE_ENABLE"},
  426. {"DRE_ENABLE", "Switch", "CH1_DRE_EN"},
  427. {"DRE_ENABLE", "Switch", "CH2_DRE_EN"},
  428. {"DRE_ENABLE", "Switch", "CH3_DRE_EN"},
  429. {"DRE_ENABLE", "Switch", "CH4_DRE_EN"},
  430. {"CH1_DRE_EN", "Switch", "CH1_ADC"},
  431. {"CH2_DRE_EN", "Switch", "CH2_ADC"},
  432. {"CH3_DRE_EN", "Switch", "CH3_ADC"},
  433. {"CH4_DRE_EN", "Switch", "CH4_ADC"},
  434. /* Mic input */
  435. {"CH1_ADC", NULL, "MIC_GAIN_CTL_CH1"},
  436. {"CH2_ADC", NULL, "MIC_GAIN_CTL_CH2"},
  437. {"CH3_ADC", NULL, "MIC_GAIN_CTL_CH3"},
  438. {"CH4_ADC", NULL, "MIC_GAIN_CTL_CH4"},
  439. {"MIC_GAIN_CTL_CH1", NULL, "IN1 Analog Mic Resistor"},
  440. {"MIC_GAIN_CTL_CH1", NULL, "IN1 Analog Mic Resistor"},
  441. {"MIC_GAIN_CTL_CH2", NULL, "IN2 Analog Mic Resistor"},
  442. {"MIC_GAIN_CTL_CH2", NULL, "IN2 Analog Mic Resistor"},
  443. {"MIC_GAIN_CTL_CH3", NULL, "IN3 Analog Mic Resistor"},
  444. {"MIC_GAIN_CTL_CH3", NULL, "IN3 Analog Mic Resistor"},
  445. {"MIC_GAIN_CTL_CH4", NULL, "IN4 Analog Mic Resistor"},
  446. {"MIC_GAIN_CTL_CH4", NULL, "IN4 Analog Mic Resistor"},
  447. {"IN1 Analog Mic Resistor", "2.5 kOhm", "MIC1P Input Mux"},
  448. {"IN1 Analog Mic Resistor", "10 kOhm", "MIC1P Input Mux"},
  449. {"IN1 Analog Mic Resistor", "20 kOhm", "MIC1P Input Mux"},
  450. {"IN1 Analog Mic Resistor", "2.5 kOhm", "MIC1M Input Mux"},
  451. {"IN1 Analog Mic Resistor", "10 kOhm", "MIC1M Input Mux"},
  452. {"IN1 Analog Mic Resistor", "20 kOhm", "MIC1M Input Mux"},
  453. {"IN2 Analog Mic Resistor", "2.5 kOhm", "MIC2P Input Mux"},
  454. {"IN2 Analog Mic Resistor", "10 kOhm", "MIC2P Input Mux"},
  455. {"IN2 Analog Mic Resistor", "20 kOhm", "MIC2P Input Mux"},
  456. {"IN2 Analog Mic Resistor", "2.5 kOhm", "MIC2M Input Mux"},
  457. {"IN2 Analog Mic Resistor", "10 kOhm", "MIC2M Input Mux"},
  458. {"IN2 Analog Mic Resistor", "20 kOhm", "MIC2M Input Mux"},
  459. {"IN3 Analog Mic Resistor", "2.5 kOhm", "MIC3P Input Mux"},
  460. {"IN3 Analog Mic Resistor", "10 kOhm", "MIC3P Input Mux"},
  461. {"IN3 Analog Mic Resistor", "20 kOhm", "MIC3P Input Mux"},
  462. {"IN3 Analog Mic Resistor", "2.5 kOhm", "MIC3M Input Mux"},
  463. {"IN3 Analog Mic Resistor", "10 kOhm", "MIC3M Input Mux"},
  464. {"IN3 Analog Mic Resistor", "20 kOhm", "MIC3M Input Mux"},
  465. {"IN4 Analog Mic Resistor", "2.5 kOhm", "MIC4P Input Mux"},
  466. {"IN4 Analog Mic Resistor", "10 kOhm", "MIC4P Input Mux"},
  467. {"IN4 Analog Mic Resistor", "20 kOhm", "MIC4P Input Mux"},
  468. {"IN4 Analog Mic Resistor", "2.5 kOhm", "MIC4M Input Mux"},
  469. {"IN4 Analog Mic Resistor", "10 kOhm", "MIC4M Input Mux"},
  470. {"IN4 Analog Mic Resistor", "20 kOhm", "MIC4M Input Mux"},
  471. {"PDM Clk Div Select", "2.8224 MHz", "MIC1P Input Mux"},
  472. {"PDM Clk Div Select", "1.4112 MHz", "MIC1P Input Mux"},
  473. {"PDM Clk Div Select", "705.6 kHz", "MIC1P Input Mux"},
  474. {"PDM Clk Div Select", "5.6448 MHz", "MIC1P Input Mux"},
  475. {"MIC1P Input Mux", NULL, "CH1_DIG"},
  476. {"MIC1M Input Mux", NULL, "CH2_DIG"},
  477. {"MIC2P Input Mux", NULL, "CH3_DIG"},
  478. {"MIC2M Input Mux", NULL, "CH4_DIG"},
  479. {"MIC3P Input Mux", NULL, "CH5_DIG"},
  480. {"MIC3M Input Mux", NULL, "CH6_DIG"},
  481. {"MIC4P Input Mux", NULL, "CH7_DIG"},
  482. {"MIC4M Input Mux", NULL, "CH8_DIG"},
  483. {"MIC1 Analog Mux", "Line In", "MIC1P"},
  484. {"MIC2 Analog Mux", "Line In", "MIC2P"},
  485. {"MIC3 Analog Mux", "Line In", "MIC3P"},
  486. {"MIC4 Analog Mux", "Line In", "MIC4P"},
  487. {"MIC1P Input Mux", "Analog", "MIC1P"},
  488. {"MIC1M Input Mux", "Analog", "MIC1M"},
  489. {"MIC2P Input Mux", "Analog", "MIC2P"},
  490. {"MIC2M Input Mux", "Analog", "MIC2M"},
  491. {"MIC3P Input Mux", "Analog", "MIC3P"},
  492. {"MIC3M Input Mux", "Analog", "MIC3M"},
  493. {"MIC4P Input Mux", "Analog", "MIC4P"},
  494. {"MIC4M Input Mux", "Analog", "MIC4M"},
  495. {"MIC1P Input Mux", "Digital", "MIC1P"},
  496. {"MIC1M Input Mux", "Digital", "MIC1M"},
  497. {"MIC2P Input Mux", "Digital", "MIC2P"},
  498. {"MIC2M Input Mux", "Digital", "MIC2M"},
  499. {"MIC3P Input Mux", "Digital", "MIC3P"},
  500. {"MIC3M Input Mux", "Digital", "MIC3M"},
  501. {"MIC4P Input Mux", "Digital", "MIC4P"},
  502. {"MIC4M Input Mux", "Digital", "MIC4M"},
  503. };
  504. #define ADCX140_PHASE_CALIB_SWITCH(xname) {\
  505. .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
  506. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,\
  507. .info = adcx140_phase_calib_info, \
  508. .get = adcx140_phase_calib_get, \
  509. .put = adcx140_phase_calib_put}
  510. static int adcx140_phase_calib_info(struct snd_kcontrol *kcontrol,
  511. struct snd_ctl_elem_info *uinfo)
  512. {
  513. uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
  514. uinfo->count = 1;
  515. uinfo->value.integer.min = 0;
  516. uinfo->value.integer.max = 1;
  517. return 0;
  518. }
  519. static int adcx140_phase_calib_get(struct snd_kcontrol *kcontrol,
  520. struct snd_ctl_elem_value *value)
  521. {
  522. struct snd_soc_component *codec =
  523. snd_soc_kcontrol_component(kcontrol);
  524. struct adcx140_priv *adcx140 = snd_soc_component_get_drvdata(codec);
  525. value->value.integer.value[0] = adcx140->phase_calib_on ? 1 : 0;
  526. return 0;
  527. }
  528. static int adcx140_phase_calib_put(struct snd_kcontrol *kcontrol,
  529. struct snd_ctl_elem_value *value)
  530. {
  531. struct snd_soc_component *codec
  532. = snd_soc_kcontrol_component(kcontrol);
  533. struct adcx140_priv *adcx140 = snd_soc_component_get_drvdata(codec);
  534. bool v = value->value.integer.value[0] ? true : false;
  535. if (adcx140->phase_calib_on != v) {
  536. adcx140->phase_calib_on = v;
  537. return 1;
  538. }
  539. return 0;
  540. }
  541. static const struct snd_kcontrol_new adcx140_snd_controls[] = {
  542. SOC_SINGLE_TLV("Analog CH1 Mic Gain Volume", ADCX140_CH1_CFG1, 2, 42, 0,
  543. adc_tlv),
  544. SOC_SINGLE_TLV("Analog CH2 Mic Gain Volume", ADCX140_CH2_CFG1, 2, 42, 0,
  545. adc_tlv),
  546. SOC_SINGLE_TLV("Analog CH3 Mic Gain Volume", ADCX140_CH3_CFG1, 2, 42, 0,
  547. adc_tlv),
  548. SOC_SINGLE_TLV("Analog CH4 Mic Gain Volume", ADCX140_CH4_CFG1, 2, 42, 0,
  549. adc_tlv),
  550. SOC_SINGLE_TLV("DRE Threshold", ADCX140_DRE_CFG0, 4, 9, 0,
  551. dre_thresh_tlv),
  552. SOC_SINGLE_TLV("DRE Max Gain", ADCX140_DRE_CFG0, 0, 12, 0,
  553. dre_gain_tlv),
  554. SOC_SINGLE_TLV("AGC Threshold", ADCX140_AGC_CFG0, 4, 15, 0,
  555. agc_thresh_tlv),
  556. SOC_SINGLE_TLV("AGC Max Gain", ADCX140_AGC_CFG0, 0, 13, 0,
  557. agc_gain_tlv),
  558. SOC_SINGLE_TLV("Digital CH1 Out Volume", ADCX140_CH1_CFG2,
  559. 0, 0xff, 0, dig_vol_tlv),
  560. SOC_SINGLE_TLV("Digital CH2 Out Volume", ADCX140_CH2_CFG2,
  561. 0, 0xff, 0, dig_vol_tlv),
  562. SOC_SINGLE_TLV("Digital CH3 Out Volume", ADCX140_CH3_CFG2,
  563. 0, 0xff, 0, dig_vol_tlv),
  564. SOC_SINGLE_TLV("Digital CH4 Out Volume", ADCX140_CH4_CFG2,
  565. 0, 0xff, 0, dig_vol_tlv),
  566. SOC_SINGLE_TLV("Digital CH5 Out Volume", ADCX140_CH5_CFG2,
  567. 0, 0xff, 0, dig_vol_tlv),
  568. SOC_SINGLE_TLV("Digital CH6 Out Volume", ADCX140_CH6_CFG2,
  569. 0, 0xff, 0, dig_vol_tlv),
  570. SOC_SINGLE_TLV("Digital CH7 Out Volume", ADCX140_CH7_CFG2,
  571. 0, 0xff, 0, dig_vol_tlv),
  572. SOC_SINGLE_TLV("Digital CH8 Out Volume", ADCX140_CH8_CFG2,
  573. 0, 0xff, 0, dig_vol_tlv),
  574. ADCX140_PHASE_CALIB_SWITCH("Phase Calibration Switch"),
  575. };
  576. static int adcx140_reset(struct adcx140_priv *adcx140)
  577. {
  578. int ret = 0;
  579. if (adcx140->gpio_reset) {
  580. gpiod_direction_output(adcx140->gpio_reset, 0);
  581. /* 8.4.1: wait for hw shutdown (25ms) + >= 1ms */
  582. usleep_range(30000, 100000);
  583. gpiod_direction_output(adcx140->gpio_reset, 1);
  584. } else {
  585. ret = regmap_write(adcx140->regmap, ADCX140_SW_RESET,
  586. ADCX140_RESET);
  587. }
  588. /* 8.4.2: wait >= 10 ms after entering sleep mode. */
  589. usleep_range(10000, 100000);
  590. return ret;
  591. }
  592. static void adcx140_pwr_ctrl(struct adcx140_priv *adcx140, bool power_state)
  593. {
  594. int pwr_ctrl = 0;
  595. int ret = 0;
  596. struct snd_soc_component *component = adcx140->component;
  597. if (power_state)
  598. pwr_ctrl = ADCX140_PWR_CFG_ADC_PDZ | ADCX140_PWR_CFG_PLL_PDZ;
  599. if (adcx140->micbias_vg && power_state)
  600. pwr_ctrl |= ADCX140_PWR_CFG_BIAS_PDZ;
  601. if (pwr_ctrl) {
  602. ret = regmap_write(adcx140->regmap, ADCX140_PHASE_CALIB,
  603. adcx140->phase_calib_on ? 0x00 : 0x40);
  604. if (ret)
  605. dev_err(component->dev, "%s: register write error %d\n",
  606. __func__, ret);
  607. }
  608. regmap_update_bits(adcx140->regmap, ADCX140_PWR_CFG,
  609. ADCX140_PWR_CTRL_MSK, pwr_ctrl);
  610. }
  611. static int adcx140_hw_params(struct snd_pcm_substream *substream,
  612. struct snd_pcm_hw_params *params,
  613. struct snd_soc_dai *dai)
  614. {
  615. struct snd_soc_component *component = dai->component;
  616. struct adcx140_priv *adcx140 = snd_soc_component_get_drvdata(component);
  617. u8 data = 0;
  618. switch (params_width(params)) {
  619. case 16:
  620. data = ADCX140_16_BIT_WORD;
  621. break;
  622. case 20:
  623. data = ADCX140_20_BIT_WORD;
  624. break;
  625. case 24:
  626. data = ADCX140_24_BIT_WORD;
  627. break;
  628. case 32:
  629. data = ADCX140_32_BIT_WORD;
  630. break;
  631. default:
  632. dev_err(component->dev, "%s: Unsupported width %d\n",
  633. __func__, params_width(params));
  634. return -EINVAL;
  635. }
  636. adcx140_pwr_ctrl(adcx140, false);
  637. snd_soc_component_update_bits(component, ADCX140_ASI_CFG0,
  638. ADCX140_WORD_LEN_MSK, data);
  639. adcx140_pwr_ctrl(adcx140, true);
  640. return 0;
  641. }
  642. static int adcx140_set_dai_fmt(struct snd_soc_dai *codec_dai,
  643. unsigned int fmt)
  644. {
  645. struct snd_soc_component *component = codec_dai->component;
  646. struct adcx140_priv *adcx140 = snd_soc_component_get_drvdata(component);
  647. u8 iface_reg1 = 0;
  648. u8 iface_reg2 = 0;
  649. int offset = 0;
  650. bool inverted_bclk = false;
  651. /* set master/slave audio interface */
  652. switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
  653. case SND_SOC_DAIFMT_CBP_CFP:
  654. iface_reg2 |= ADCX140_BCLK_FSYNC_MASTER;
  655. break;
  656. case SND_SOC_DAIFMT_CBC_CFC:
  657. break;
  658. default:
  659. dev_err(component->dev, "Invalid DAI clock provider\n");
  660. return -EINVAL;
  661. }
  662. /* interface format */
  663. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  664. case SND_SOC_DAIFMT_I2S:
  665. iface_reg1 |= ADCX140_I2S_MODE_BIT;
  666. break;
  667. case SND_SOC_DAIFMT_LEFT_J:
  668. iface_reg1 |= ADCX140_LEFT_JUST_BIT;
  669. break;
  670. case SND_SOC_DAIFMT_DSP_A:
  671. offset = 1;
  672. inverted_bclk = true;
  673. break;
  674. case SND_SOC_DAIFMT_DSP_B:
  675. inverted_bclk = true;
  676. break;
  677. default:
  678. dev_err(component->dev, "Invalid DAI interface format\n");
  679. return -EINVAL;
  680. }
  681. /* signal polarity */
  682. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  683. case SND_SOC_DAIFMT_IB_NF:
  684. case SND_SOC_DAIFMT_IB_IF:
  685. inverted_bclk = !inverted_bclk;
  686. break;
  687. case SND_SOC_DAIFMT_NB_IF:
  688. iface_reg1 |= ADCX140_FSYNCINV_BIT;
  689. break;
  690. case SND_SOC_DAIFMT_NB_NF:
  691. break;
  692. default:
  693. dev_err(component->dev, "Invalid DAI clock signal polarity\n");
  694. return -EINVAL;
  695. }
  696. if (inverted_bclk)
  697. iface_reg1 |= ADCX140_BCLKINV_BIT;
  698. adcx140->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
  699. adcx140_pwr_ctrl(adcx140, false);
  700. snd_soc_component_update_bits(component, ADCX140_ASI_CFG0,
  701. ADCX140_FSYNCINV_BIT |
  702. ADCX140_BCLKINV_BIT |
  703. ADCX140_ASI_FORMAT_MSK,
  704. iface_reg1);
  705. snd_soc_component_update_bits(component, ADCX140_MST_CFG0,
  706. ADCX140_BCLK_FSYNC_MASTER, iface_reg2);
  707. /* Configure data offset */
  708. snd_soc_component_update_bits(component, ADCX140_ASI_CFG1,
  709. ADCX140_TX_OFFSET_MASK, offset);
  710. adcx140_pwr_ctrl(adcx140, true);
  711. return 0;
  712. }
  713. static int adcx140_set_dai_tdm_slot(struct snd_soc_dai *codec_dai,
  714. unsigned int tx_mask, unsigned int rx_mask,
  715. int slots, int slot_width)
  716. {
  717. struct snd_soc_component *component = codec_dai->component;
  718. struct adcx140_priv *adcx140 = snd_soc_component_get_drvdata(component);
  719. /*
  720. * The chip itself supports arbitrary masks, but the driver currently
  721. * only supports adjacent slots beginning at the first slot.
  722. */
  723. if (tx_mask != GENMASK(__fls(tx_mask), 0)) {
  724. dev_err(component->dev, "Only lower adjacent slots are supported\n");
  725. return -EINVAL;
  726. }
  727. switch (slot_width) {
  728. case 16:
  729. case 20:
  730. case 24:
  731. case 32:
  732. break;
  733. default:
  734. dev_err(component->dev, "Unsupported slot width %d\n", slot_width);
  735. return -EINVAL;
  736. }
  737. adcx140->slot_width = slot_width;
  738. return 0;
  739. }
  740. static const struct snd_soc_dai_ops adcx140_dai_ops = {
  741. .hw_params = adcx140_hw_params,
  742. .set_fmt = adcx140_set_dai_fmt,
  743. .set_tdm_slot = adcx140_set_dai_tdm_slot,
  744. };
  745. static int adcx140_configure_gpo(struct adcx140_priv *adcx140)
  746. {
  747. u32 gpo_outputs[ADCX140_NUM_GPOS];
  748. u32 gpo_output_val = 0;
  749. int ret;
  750. int i;
  751. for (i = 0; i < ADCX140_NUM_GPOS; i++) {
  752. ret = device_property_read_u32_array(adcx140->dev,
  753. gpo_config_names[i],
  754. gpo_outputs,
  755. ADCX140_NUM_GPO_CFGS);
  756. if (ret)
  757. continue;
  758. if (gpo_outputs[0] > ADCX140_GPO_CFG_MAX) {
  759. dev_err(adcx140->dev, "GPO%d config out of range\n", i + 1);
  760. return -EINVAL;
  761. }
  762. if (gpo_outputs[1] > ADCX140_GPO_DRV_MAX) {
  763. dev_err(adcx140->dev, "GPO%d drive out of range\n", i + 1);
  764. return -EINVAL;
  765. }
  766. gpo_output_val = gpo_outputs[0] << ADCX140_GPO_SHIFT |
  767. gpo_outputs[1];
  768. ret = regmap_write(adcx140->regmap, ADCX140_GPO_CFG0 + i,
  769. gpo_output_val);
  770. if (ret)
  771. return ret;
  772. }
  773. return 0;
  774. }
  775. static int adcx140_configure_gpio(struct adcx140_priv *adcx140)
  776. {
  777. int gpio_count = 0;
  778. u32 gpio_outputs[ADCX140_NUM_GPIO_CFGS];
  779. u32 gpio_output_val = 0;
  780. int ret;
  781. gpio_count = device_property_count_u32(adcx140->dev,
  782. "ti,gpio-config");
  783. if (gpio_count <= 0)
  784. return 0;
  785. if (gpio_count != ADCX140_NUM_GPIO_CFGS)
  786. return -EINVAL;
  787. ret = device_property_read_u32_array(adcx140->dev, "ti,gpio-config",
  788. gpio_outputs, gpio_count);
  789. if (ret)
  790. return ret;
  791. if (gpio_outputs[0] > ADCX140_GPIO_CFG_MAX) {
  792. dev_err(adcx140->dev, "GPIO config out of range\n");
  793. return -EINVAL;
  794. }
  795. if (gpio_outputs[1] > ADCX140_GPIO_DRV_MAX) {
  796. dev_err(adcx140->dev, "GPIO drive out of range\n");
  797. return -EINVAL;
  798. }
  799. gpio_output_val = gpio_outputs[0] << ADCX140_GPIO_SHIFT
  800. | gpio_outputs[1];
  801. return regmap_write(adcx140->regmap, ADCX140_GPIO_CFG0, gpio_output_val);
  802. }
  803. static int adcx140_codec_probe(struct snd_soc_component *component)
  804. {
  805. struct adcx140_priv *adcx140 = snd_soc_component_get_drvdata(component);
  806. int sleep_cfg_val = ADCX140_WAKE_DEV;
  807. u32 bias_source;
  808. u32 vref_source;
  809. u8 bias_cfg;
  810. int pdm_count;
  811. u32 pdm_edges[ADCX140_NUM_PDM_EDGES];
  812. u32 pdm_edge_val = 0;
  813. int gpi_count;
  814. u32 gpi_inputs[ADCX140_NUM_GPI_PINS];
  815. u32 gpi_input_val = 0;
  816. int i;
  817. int ret;
  818. bool tx_high_z;
  819. ret = device_property_read_u32(adcx140->dev, "ti,mic-bias-source",
  820. &bias_source);
  821. if (ret || bias_source > ADCX140_MIC_BIAS_VAL_AVDD) {
  822. bias_source = ADCX140_MIC_BIAS_VAL_VREF;
  823. adcx140->micbias_vg = false;
  824. } else {
  825. adcx140->micbias_vg = true;
  826. }
  827. ret = device_property_read_u32(adcx140->dev, "ti,vref-source",
  828. &vref_source);
  829. if (ret)
  830. vref_source = ADCX140_MIC_BIAS_VREF_275V;
  831. if (vref_source > ADCX140_MIC_BIAS_VREF_1375V) {
  832. dev_err(adcx140->dev, "Mic Bias source value is invalid\n");
  833. return -EINVAL;
  834. }
  835. bias_cfg = bias_source << ADCX140_MIC_BIAS_SHIFT | vref_source;
  836. ret = adcx140_reset(adcx140);
  837. if (ret)
  838. goto out;
  839. if (adcx140->supply_areg == NULL)
  840. sleep_cfg_val |= ADCX140_AREG_INTERNAL;
  841. ret = regmap_write(adcx140->regmap, ADCX140_SLEEP_CFG, sleep_cfg_val);
  842. if (ret) {
  843. dev_err(adcx140->dev, "setting sleep config failed %d\n", ret);
  844. goto out;
  845. }
  846. /* 8.4.3: Wait >= 1ms after entering active mode. */
  847. usleep_range(1000, 100000);
  848. pdm_count = device_property_count_u32(adcx140->dev,
  849. "ti,pdm-edge-select");
  850. if (pdm_count <= ADCX140_NUM_PDM_EDGES && pdm_count > 0) {
  851. ret = device_property_read_u32_array(adcx140->dev,
  852. "ti,pdm-edge-select",
  853. pdm_edges, pdm_count);
  854. if (ret)
  855. return ret;
  856. for (i = 0; i < pdm_count; i++)
  857. pdm_edge_val |= pdm_edges[i] << (ADCX140_PDM_EDGE_SHIFT - i);
  858. ret = regmap_write(adcx140->regmap, ADCX140_PDM_CFG,
  859. pdm_edge_val);
  860. if (ret)
  861. return ret;
  862. }
  863. gpi_count = device_property_count_u32(adcx140->dev, "ti,gpi-config");
  864. if (gpi_count <= ADCX140_NUM_GPI_PINS && gpi_count > 0) {
  865. ret = device_property_read_u32_array(adcx140->dev,
  866. "ti,gpi-config",
  867. gpi_inputs, gpi_count);
  868. if (ret)
  869. return ret;
  870. gpi_input_val = gpi_inputs[ADCX140_GPI1_INDEX] << ADCX140_GPI_SHIFT |
  871. gpi_inputs[ADCX140_GPI2_INDEX];
  872. ret = regmap_write(adcx140->regmap, ADCX140_GPI_CFG0,
  873. gpi_input_val);
  874. if (ret)
  875. return ret;
  876. gpi_input_val = gpi_inputs[ADCX140_GPI3_INDEX] << ADCX140_GPI_SHIFT |
  877. gpi_inputs[ADCX140_GPI4_INDEX];
  878. ret = regmap_write(adcx140->regmap, ADCX140_GPI_CFG1,
  879. gpi_input_val);
  880. if (ret)
  881. return ret;
  882. }
  883. ret = adcx140_configure_gpio(adcx140);
  884. if (ret)
  885. return ret;
  886. ret = adcx140_configure_gpo(adcx140);
  887. if (ret)
  888. goto out;
  889. ret = regmap_update_bits(adcx140->regmap, ADCX140_BIAS_CFG,
  890. ADCX140_MIC_BIAS_VAL_MSK |
  891. ADCX140_MIC_BIAS_VREF_MSK, bias_cfg);
  892. if (ret)
  893. dev_err(adcx140->dev, "setting MIC bias failed %d\n", ret);
  894. tx_high_z = device_property_read_bool(adcx140->dev, "ti,asi-tx-drive");
  895. if (tx_high_z) {
  896. ret = regmap_update_bits(adcx140->regmap, ADCX140_ASI_CFG0,
  897. ADCX140_TX_FILL, ADCX140_TX_FILL);
  898. if (ret) {
  899. dev_err(adcx140->dev, "Setting Tx drive failed %d\n", ret);
  900. goto out;
  901. }
  902. }
  903. adcx140_pwr_ctrl(adcx140, true);
  904. out:
  905. return ret;
  906. }
  907. static int adcx140_set_bias_level(struct snd_soc_component *component,
  908. enum snd_soc_bias_level level)
  909. {
  910. struct adcx140_priv *adcx140 = snd_soc_component_get_drvdata(component);
  911. switch (level) {
  912. case SND_SOC_BIAS_ON:
  913. case SND_SOC_BIAS_PREPARE:
  914. case SND_SOC_BIAS_STANDBY:
  915. adcx140_pwr_ctrl(adcx140, true);
  916. break;
  917. case SND_SOC_BIAS_OFF:
  918. adcx140_pwr_ctrl(adcx140, false);
  919. break;
  920. }
  921. return 0;
  922. }
  923. static const struct snd_soc_component_driver soc_codec_driver_adcx140 = {
  924. .probe = adcx140_codec_probe,
  925. .set_bias_level = adcx140_set_bias_level,
  926. .controls = adcx140_snd_controls,
  927. .num_controls = ARRAY_SIZE(adcx140_snd_controls),
  928. .dapm_widgets = adcx140_dapm_widgets,
  929. .num_dapm_widgets = ARRAY_SIZE(adcx140_dapm_widgets),
  930. .dapm_routes = adcx140_audio_map,
  931. .num_dapm_routes = ARRAY_SIZE(adcx140_audio_map),
  932. .suspend_bias_off = 1,
  933. .idle_bias_on = 0,
  934. .use_pmdown_time = 1,
  935. .endianness = 1,
  936. };
  937. static struct snd_soc_dai_driver adcx140_dai_driver[] = {
  938. {
  939. .name = "tlv320adcx140-codec",
  940. .capture = {
  941. .stream_name = "Capture",
  942. .channels_min = 2,
  943. .channels_max = ADCX140_MAX_CHANNELS,
  944. .rates = ADCX140_RATES,
  945. .formats = ADCX140_FORMATS,
  946. },
  947. .ops = &adcx140_dai_ops,
  948. .symmetric_rate = 1,
  949. }
  950. };
  951. #ifdef CONFIG_OF
  952. static const struct of_device_id tlv320adcx140_of_match[] = {
  953. { .compatible = "ti,tlv320adc3140" },
  954. { .compatible = "ti,tlv320adc5140" },
  955. { .compatible = "ti,tlv320adc6140" },
  956. {},
  957. };
  958. MODULE_DEVICE_TABLE(of, tlv320adcx140_of_match);
  959. #endif
  960. static void adcx140_disable_regulator(void *arg)
  961. {
  962. struct adcx140_priv *adcx140 = arg;
  963. regulator_disable(adcx140->supply_areg);
  964. }
  965. static int adcx140_i2c_probe(struct i2c_client *i2c)
  966. {
  967. struct adcx140_priv *adcx140;
  968. int ret;
  969. adcx140 = devm_kzalloc(&i2c->dev, sizeof(*adcx140), GFP_KERNEL);
  970. if (!adcx140)
  971. return -ENOMEM;
  972. adcx140->phase_calib_on = false;
  973. adcx140->dev = &i2c->dev;
  974. adcx140->gpio_reset = devm_gpiod_get_optional(adcx140->dev,
  975. "reset", GPIOD_OUT_LOW);
  976. if (IS_ERR(adcx140->gpio_reset))
  977. dev_info(&i2c->dev, "Reset GPIO not defined\n");
  978. adcx140->supply_areg = devm_regulator_get_optional(adcx140->dev,
  979. "areg");
  980. if (IS_ERR(adcx140->supply_areg)) {
  981. if (PTR_ERR(adcx140->supply_areg) == -EPROBE_DEFER)
  982. return -EPROBE_DEFER;
  983. adcx140->supply_areg = NULL;
  984. } else {
  985. ret = regulator_enable(adcx140->supply_areg);
  986. if (ret) {
  987. dev_err(adcx140->dev, "Failed to enable areg\n");
  988. return ret;
  989. }
  990. ret = devm_add_action_or_reset(&i2c->dev, adcx140_disable_regulator, adcx140);
  991. if (ret)
  992. return ret;
  993. }
  994. adcx140->regmap = devm_regmap_init_i2c(i2c, &adcx140_i2c_regmap);
  995. if (IS_ERR(adcx140->regmap)) {
  996. ret = PTR_ERR(adcx140->regmap);
  997. dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
  998. ret);
  999. return ret;
  1000. }
  1001. i2c_set_clientdata(i2c, adcx140);
  1002. return devm_snd_soc_register_component(&i2c->dev,
  1003. &soc_codec_driver_adcx140,
  1004. adcx140_dai_driver, 1);
  1005. }
  1006. static const struct i2c_device_id adcx140_i2c_id[] = {
  1007. { "tlv320adc3140", 0 },
  1008. { "tlv320adc5140", 1 },
  1009. { "tlv320adc6140", 2 },
  1010. {}
  1011. };
  1012. MODULE_DEVICE_TABLE(i2c, adcx140_i2c_id);
  1013. static struct i2c_driver adcx140_i2c_driver = {
  1014. .driver = {
  1015. .name = "tlv320adcx140-codec",
  1016. .of_match_table = of_match_ptr(tlv320adcx140_of_match),
  1017. },
  1018. .probe_new = adcx140_i2c_probe,
  1019. .id_table = adcx140_i2c_id,
  1020. };
  1021. module_i2c_driver(adcx140_i2c_driver);
  1022. MODULE_AUTHOR("Dan Murphy <[email protected]>");
  1023. MODULE_DESCRIPTION("ASoC TLV320ADCX140 CODEC Driver");
  1024. MODULE_LICENSE("GPL v2");