adau1977.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * ADAU1977/ADAU1978/ADAU1979 driver
  4. *
  5. * Copyright 2014 Analog Devices Inc.
  6. * Author: Lars-Peter Clausen <[email protected]>
  7. */
  8. #include <linux/delay.h>
  9. #include <linux/device.h>
  10. #include <linux/gpio/consumer.h>
  11. #include <linux/i2c.h>
  12. #include <linux/init.h>
  13. #include <linux/module.h>
  14. #include <linux/regmap.h>
  15. #include <linux/regulator/consumer.h>
  16. #include <linux/slab.h>
  17. #include <sound/core.h>
  18. #include <sound/initval.h>
  19. #include <sound/pcm.h>
  20. #include <sound/pcm_params.h>
  21. #include <sound/soc.h>
  22. #include <sound/tlv.h>
  23. #include <dt-bindings/sound/adi,adau1977.h>
  24. #include "adau1977.h"
  25. #define ADAU1977_REG_POWER 0x00
  26. #define ADAU1977_REG_PLL 0x01
  27. #define ADAU1977_REG_BOOST 0x02
  28. #define ADAU1977_REG_MICBIAS 0x03
  29. #define ADAU1977_REG_BLOCK_POWER_SAI 0x04
  30. #define ADAU1977_REG_SAI_CTRL0 0x05
  31. #define ADAU1977_REG_SAI_CTRL1 0x06
  32. #define ADAU1977_REG_CMAP12 0x07
  33. #define ADAU1977_REG_CMAP34 0x08
  34. #define ADAU1977_REG_SAI_OVERTEMP 0x09
  35. #define ADAU1977_REG_POST_ADC_GAIN(x) (0x0a + (x))
  36. #define ADAU1977_REG_MISC_CONTROL 0x0e
  37. #define ADAU1977_REG_DIAG_CONTROL 0x10
  38. #define ADAU1977_REG_STATUS(x) (0x11 + (x))
  39. #define ADAU1977_REG_DIAG_IRQ1 0x15
  40. #define ADAU1977_REG_DIAG_IRQ2 0x16
  41. #define ADAU1977_REG_ADJUST1 0x17
  42. #define ADAU1977_REG_ADJUST2 0x18
  43. #define ADAU1977_REG_ADC_CLIP 0x19
  44. #define ADAU1977_REG_DC_HPF_CAL 0x1a
  45. #define ADAU1977_POWER_RESET BIT(7)
  46. #define ADAU1977_POWER_PWUP BIT(0)
  47. #define ADAU1977_PLL_CLK_S BIT(4)
  48. #define ADAU1977_PLL_MCS_MASK 0x7
  49. #define ADAU1977_MICBIAS_MB_VOLTS_MASK 0xf0
  50. #define ADAU1977_MICBIAS_MB_VOLTS_OFFSET 4
  51. #define ADAU1977_BLOCK_POWER_SAI_LR_POL BIT(7)
  52. #define ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE BIT(6)
  53. #define ADAU1977_BLOCK_POWER_SAI_LDO_EN BIT(5)
  54. #define ADAU1977_SAI_CTRL0_FMT_MASK (0x3 << 6)
  55. #define ADAU1977_SAI_CTRL0_FMT_I2S (0x0 << 6)
  56. #define ADAU1977_SAI_CTRL0_FMT_LJ (0x1 << 6)
  57. #define ADAU1977_SAI_CTRL0_FMT_RJ_24BIT (0x2 << 6)
  58. #define ADAU1977_SAI_CTRL0_FMT_RJ_16BIT (0x3 << 6)
  59. #define ADAU1977_SAI_CTRL0_SAI_MASK (0x7 << 3)
  60. #define ADAU1977_SAI_CTRL0_SAI_I2S (0x0 << 3)
  61. #define ADAU1977_SAI_CTRL0_SAI_TDM_2 (0x1 << 3)
  62. #define ADAU1977_SAI_CTRL0_SAI_TDM_4 (0x2 << 3)
  63. #define ADAU1977_SAI_CTRL0_SAI_TDM_8 (0x3 << 3)
  64. #define ADAU1977_SAI_CTRL0_SAI_TDM_16 (0x4 << 3)
  65. #define ADAU1977_SAI_CTRL0_FS_MASK (0x7)
  66. #define ADAU1977_SAI_CTRL0_FS_8000_12000 (0x0)
  67. #define ADAU1977_SAI_CTRL0_FS_16000_24000 (0x1)
  68. #define ADAU1977_SAI_CTRL0_FS_32000_48000 (0x2)
  69. #define ADAU1977_SAI_CTRL0_FS_64000_96000 (0x3)
  70. #define ADAU1977_SAI_CTRL0_FS_128000_192000 (0x4)
  71. #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_MASK (0x3 << 5)
  72. #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_32 (0x0 << 5)
  73. #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_24 (0x1 << 5)
  74. #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_16 (0x2 << 5)
  75. #define ADAU1977_SAI_CTRL1_DATA_WIDTH_MASK (0x1 << 4)
  76. #define ADAU1977_SAI_CTRL1_DATA_WIDTH_16BIT (0x1 << 4)
  77. #define ADAU1977_SAI_CTRL1_DATA_WIDTH_24BIT (0x0 << 4)
  78. #define ADAU1977_SAI_CTRL1_LRCLK_PULSE BIT(3)
  79. #define ADAU1977_SAI_CTRL1_MSB BIT(2)
  80. #define ADAU1977_SAI_CTRL1_BCLKRATE_16 (0x1 << 1)
  81. #define ADAU1977_SAI_CTRL1_BCLKRATE_32 (0x0 << 1)
  82. #define ADAU1977_SAI_CTRL1_BCLKRATE_MASK (0x1 << 1)
  83. #define ADAU1977_SAI_CTRL1_MASTER BIT(0)
  84. #define ADAU1977_SAI_OVERTEMP_DRV_C(x) BIT(4 + (x))
  85. #define ADAU1977_SAI_OVERTEMP_DRV_HIZ BIT(3)
  86. #define ADAU1977_MISC_CONTROL_SUM_MODE_MASK (0x3 << 6)
  87. #define ADAU1977_MISC_CONTROL_SUM_MODE_1CH (0x2 << 6)
  88. #define ADAU1977_MISC_CONTROL_SUM_MODE_2CH (0x1 << 6)
  89. #define ADAU1977_MISC_CONTROL_SUM_MODE_4CH (0x0 << 6)
  90. #define ADAU1977_MISC_CONTROL_MMUTE BIT(4)
  91. #define ADAU1977_MISC_CONTROL_DC_CAL BIT(0)
  92. #define ADAU1977_CHAN_MAP_SECOND_SLOT_OFFSET 4
  93. #define ADAU1977_CHAN_MAP_FIRST_SLOT_OFFSET 0
  94. struct adau1977 {
  95. struct regmap *regmap;
  96. bool right_j;
  97. unsigned int sysclk;
  98. enum adau1977_sysclk_src sysclk_src;
  99. struct gpio_desc *reset_gpio;
  100. enum adau1977_type type;
  101. struct regulator *avdd_reg;
  102. struct regulator *dvdd_reg;
  103. struct snd_pcm_hw_constraint_list constraints;
  104. struct device *dev;
  105. void (*switch_mode)(struct device *dev);
  106. unsigned int max_clock_provider_fs;
  107. unsigned int slot_width;
  108. bool enabled;
  109. bool clock_provider;
  110. };
  111. static const struct reg_default adau1977_reg_defaults[] = {
  112. { 0x00, 0x00 },
  113. { 0x01, 0x41 },
  114. { 0x02, 0x4a },
  115. { 0x03, 0x7d },
  116. { 0x04, 0x3d },
  117. { 0x05, 0x02 },
  118. { 0x06, 0x00 },
  119. { 0x07, 0x10 },
  120. { 0x08, 0x32 },
  121. { 0x09, 0xf0 },
  122. { 0x0a, 0xa0 },
  123. { 0x0b, 0xa0 },
  124. { 0x0c, 0xa0 },
  125. { 0x0d, 0xa0 },
  126. { 0x0e, 0x02 },
  127. { 0x10, 0x0f },
  128. { 0x15, 0x20 },
  129. { 0x16, 0x00 },
  130. { 0x17, 0x00 },
  131. { 0x18, 0x00 },
  132. { 0x1a, 0x00 },
  133. };
  134. static const DECLARE_TLV_DB_MINMAX_MUTE(adau1977_adc_gain, -3562, 6000);
  135. static const struct snd_soc_dapm_widget adau1977_micbias_dapm_widgets[] = {
  136. SND_SOC_DAPM_SUPPLY("MICBIAS", ADAU1977_REG_MICBIAS,
  137. 3, 0, NULL, 0)
  138. };
  139. static const struct snd_soc_dapm_widget adau1977_dapm_widgets[] = {
  140. SND_SOC_DAPM_SUPPLY("Vref", ADAU1977_REG_BLOCK_POWER_SAI,
  141. 4, 0, NULL, 0),
  142. SND_SOC_DAPM_ADC("ADC1", "Capture", ADAU1977_REG_BLOCK_POWER_SAI, 0, 0),
  143. SND_SOC_DAPM_ADC("ADC2", "Capture", ADAU1977_REG_BLOCK_POWER_SAI, 1, 0),
  144. SND_SOC_DAPM_ADC("ADC3", "Capture", ADAU1977_REG_BLOCK_POWER_SAI, 2, 0),
  145. SND_SOC_DAPM_ADC("ADC4", "Capture", ADAU1977_REG_BLOCK_POWER_SAI, 3, 0),
  146. SND_SOC_DAPM_INPUT("AIN1"),
  147. SND_SOC_DAPM_INPUT("AIN2"),
  148. SND_SOC_DAPM_INPUT("AIN3"),
  149. SND_SOC_DAPM_INPUT("AIN4"),
  150. SND_SOC_DAPM_OUTPUT("VREF"),
  151. };
  152. static const struct snd_soc_dapm_route adau1977_dapm_routes[] = {
  153. { "ADC1", NULL, "AIN1" },
  154. { "ADC2", NULL, "AIN2" },
  155. { "ADC3", NULL, "AIN3" },
  156. { "ADC4", NULL, "AIN4" },
  157. { "ADC1", NULL, "Vref" },
  158. { "ADC2", NULL, "Vref" },
  159. { "ADC3", NULL, "Vref" },
  160. { "ADC4", NULL, "Vref" },
  161. { "VREF", NULL, "Vref" },
  162. };
  163. #define ADAU1977_VOLUME(x) \
  164. SOC_SINGLE_TLV("ADC" #x " Capture Volume", \
  165. ADAU1977_REG_POST_ADC_GAIN((x) - 1), \
  166. 0, 255, 1, adau1977_adc_gain)
  167. #define ADAU1977_HPF_SWITCH(x) \
  168. SOC_SINGLE("ADC" #x " Highpass-Filter Capture Switch", \
  169. ADAU1977_REG_DC_HPF_CAL, (x) - 1, 1, 0)
  170. #define ADAU1977_DC_SUB_SWITCH(x) \
  171. SOC_SINGLE("ADC" #x " DC Subtraction Capture Switch", \
  172. ADAU1977_REG_DC_HPF_CAL, (x) + 3, 1, 0)
  173. static const struct snd_kcontrol_new adau1977_snd_controls[] = {
  174. ADAU1977_VOLUME(1),
  175. ADAU1977_VOLUME(2),
  176. ADAU1977_VOLUME(3),
  177. ADAU1977_VOLUME(4),
  178. ADAU1977_HPF_SWITCH(1),
  179. ADAU1977_HPF_SWITCH(2),
  180. ADAU1977_HPF_SWITCH(3),
  181. ADAU1977_HPF_SWITCH(4),
  182. ADAU1977_DC_SUB_SWITCH(1),
  183. ADAU1977_DC_SUB_SWITCH(2),
  184. ADAU1977_DC_SUB_SWITCH(3),
  185. ADAU1977_DC_SUB_SWITCH(4),
  186. };
  187. static int adau1977_reset(struct adau1977 *adau1977)
  188. {
  189. int ret;
  190. /*
  191. * The reset bit is obviously volatile, but we need to be able to cache
  192. * the other bits in the register, so we can't just mark the whole
  193. * register as volatile. Since this is the only place where we'll ever
  194. * touch the reset bit just bypass the cache for this operation.
  195. */
  196. regcache_cache_bypass(adau1977->regmap, true);
  197. ret = regmap_write(adau1977->regmap, ADAU1977_REG_POWER,
  198. ADAU1977_POWER_RESET);
  199. regcache_cache_bypass(adau1977->regmap, false);
  200. return ret;
  201. }
  202. /*
  203. * Returns the appropriate setting for ths FS field in the CTRL0 register
  204. * depending on the rate.
  205. */
  206. static int adau1977_lookup_fs(unsigned int rate)
  207. {
  208. if (rate >= 8000 && rate <= 12000)
  209. return ADAU1977_SAI_CTRL0_FS_8000_12000;
  210. else if (rate >= 16000 && rate <= 24000)
  211. return ADAU1977_SAI_CTRL0_FS_16000_24000;
  212. else if (rate >= 32000 && rate <= 48000)
  213. return ADAU1977_SAI_CTRL0_FS_32000_48000;
  214. else if (rate >= 64000 && rate <= 96000)
  215. return ADAU1977_SAI_CTRL0_FS_64000_96000;
  216. else if (rate >= 128000 && rate <= 192000)
  217. return ADAU1977_SAI_CTRL0_FS_128000_192000;
  218. else
  219. return -EINVAL;
  220. }
  221. static int adau1977_lookup_mcs(struct adau1977 *adau1977, unsigned int rate,
  222. unsigned int fs)
  223. {
  224. unsigned int mcs;
  225. /*
  226. * rate = sysclk / (512 * mcs_lut[mcs]) * 2**fs
  227. * => mcs_lut[mcs] = sysclk / (512 * rate) * 2**fs
  228. * => mcs_lut[mcs] = sysclk / ((512 / 2**fs) * rate)
  229. */
  230. rate *= 512 >> fs;
  231. if (adau1977->sysclk % rate != 0)
  232. return -EINVAL;
  233. mcs = adau1977->sysclk / rate;
  234. /* The factors configured by MCS are 1, 2, 3, 4, 6 */
  235. if (mcs < 1 || mcs > 6 || mcs == 5)
  236. return -EINVAL;
  237. mcs = mcs - 1;
  238. if (mcs == 5)
  239. mcs = 4;
  240. return mcs;
  241. }
  242. static int adau1977_hw_params(struct snd_pcm_substream *substream,
  243. struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
  244. {
  245. struct snd_soc_component *component = dai->component;
  246. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
  247. unsigned int rate = params_rate(params);
  248. unsigned int slot_width;
  249. unsigned int ctrl0, ctrl0_mask;
  250. unsigned int ctrl1;
  251. int mcs, fs;
  252. int ret;
  253. fs = adau1977_lookup_fs(rate);
  254. if (fs < 0)
  255. return fs;
  256. if (adau1977->sysclk_src == ADAU1977_SYSCLK_SRC_MCLK) {
  257. mcs = adau1977_lookup_mcs(adau1977, rate, fs);
  258. if (mcs < 0)
  259. return mcs;
  260. } else {
  261. mcs = 0;
  262. }
  263. ctrl0_mask = ADAU1977_SAI_CTRL0_FS_MASK;
  264. ctrl0 = fs;
  265. if (adau1977->right_j) {
  266. switch (params_width(params)) {
  267. case 16:
  268. ctrl0 |= ADAU1977_SAI_CTRL0_FMT_RJ_16BIT;
  269. break;
  270. case 24:
  271. ctrl0 |= ADAU1977_SAI_CTRL0_FMT_RJ_24BIT;
  272. break;
  273. default:
  274. return -EINVAL;
  275. }
  276. ctrl0_mask |= ADAU1977_SAI_CTRL0_FMT_MASK;
  277. }
  278. if (adau1977->clock_provider) {
  279. switch (params_width(params)) {
  280. case 16:
  281. ctrl1 = ADAU1977_SAI_CTRL1_DATA_WIDTH_16BIT;
  282. slot_width = 16;
  283. break;
  284. case 24:
  285. case 32:
  286. ctrl1 = ADAU1977_SAI_CTRL1_DATA_WIDTH_24BIT;
  287. slot_width = 32;
  288. break;
  289. default:
  290. return -EINVAL;
  291. }
  292. /* In TDM mode there is a fixed slot width */
  293. if (adau1977->slot_width)
  294. slot_width = adau1977->slot_width;
  295. if (slot_width == 16)
  296. ctrl1 |= ADAU1977_SAI_CTRL1_BCLKRATE_16;
  297. else
  298. ctrl1 |= ADAU1977_SAI_CTRL1_BCLKRATE_32;
  299. ret = regmap_update_bits(adau1977->regmap,
  300. ADAU1977_REG_SAI_CTRL1,
  301. ADAU1977_SAI_CTRL1_DATA_WIDTH_MASK |
  302. ADAU1977_SAI_CTRL1_BCLKRATE_MASK,
  303. ctrl1);
  304. if (ret < 0)
  305. return ret;
  306. }
  307. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL0,
  308. ctrl0_mask, ctrl0);
  309. if (ret < 0)
  310. return ret;
  311. return regmap_update_bits(adau1977->regmap, ADAU1977_REG_PLL,
  312. ADAU1977_PLL_MCS_MASK, mcs);
  313. }
  314. static int adau1977_power_disable(struct adau1977 *adau1977)
  315. {
  316. int ret = 0;
  317. if (!adau1977->enabled)
  318. return 0;
  319. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_POWER,
  320. ADAU1977_POWER_PWUP, 0);
  321. if (ret)
  322. return ret;
  323. regcache_mark_dirty(adau1977->regmap);
  324. gpiod_set_value_cansleep(adau1977->reset_gpio, 0);
  325. regcache_cache_only(adau1977->regmap, true);
  326. regulator_disable(adau1977->avdd_reg);
  327. if (adau1977->dvdd_reg)
  328. regulator_disable(adau1977->dvdd_reg);
  329. adau1977->enabled = false;
  330. return 0;
  331. }
  332. static int adau1977_power_enable(struct adau1977 *adau1977)
  333. {
  334. unsigned int val;
  335. int ret = 0;
  336. if (adau1977->enabled)
  337. return 0;
  338. ret = regulator_enable(adau1977->avdd_reg);
  339. if (ret)
  340. return ret;
  341. if (adau1977->dvdd_reg) {
  342. ret = regulator_enable(adau1977->dvdd_reg);
  343. if (ret)
  344. goto err_disable_avdd;
  345. }
  346. gpiod_set_value_cansleep(adau1977->reset_gpio, 1);
  347. regcache_cache_only(adau1977->regmap, false);
  348. if (adau1977->switch_mode)
  349. adau1977->switch_mode(adau1977->dev);
  350. ret = adau1977_reset(adau1977);
  351. if (ret)
  352. goto err_disable_dvdd;
  353. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_POWER,
  354. ADAU1977_POWER_PWUP, ADAU1977_POWER_PWUP);
  355. if (ret)
  356. goto err_disable_dvdd;
  357. ret = regcache_sync(adau1977->regmap);
  358. if (ret)
  359. goto err_disable_dvdd;
  360. /*
  361. * The PLL register is not affected by the software reset. It is
  362. * possible that the value of the register was changed to the
  363. * default value while we were in cache only mode. In this case
  364. * regcache_sync will skip over it and we have to manually sync
  365. * it.
  366. */
  367. ret = regmap_read(adau1977->regmap, ADAU1977_REG_PLL, &val);
  368. if (ret)
  369. goto err_disable_dvdd;
  370. if (val == 0x41) {
  371. regcache_cache_bypass(adau1977->regmap, true);
  372. ret = regmap_write(adau1977->regmap, ADAU1977_REG_PLL,
  373. 0x41);
  374. if (ret)
  375. goto err_disable_dvdd;
  376. regcache_cache_bypass(adau1977->regmap, false);
  377. }
  378. adau1977->enabled = true;
  379. return ret;
  380. err_disable_dvdd:
  381. if (adau1977->dvdd_reg)
  382. regulator_disable(adau1977->dvdd_reg);
  383. err_disable_avdd:
  384. regulator_disable(adau1977->avdd_reg);
  385. return ret;
  386. }
  387. static int adau1977_set_bias_level(struct snd_soc_component *component,
  388. enum snd_soc_bias_level level)
  389. {
  390. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
  391. int ret = 0;
  392. switch (level) {
  393. case SND_SOC_BIAS_ON:
  394. break;
  395. case SND_SOC_BIAS_PREPARE:
  396. break;
  397. case SND_SOC_BIAS_STANDBY:
  398. if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)
  399. ret = adau1977_power_enable(adau1977);
  400. break;
  401. case SND_SOC_BIAS_OFF:
  402. ret = adau1977_power_disable(adau1977);
  403. break;
  404. }
  405. return ret;
  406. }
  407. static int adau1977_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
  408. unsigned int rx_mask, int slots, int width)
  409. {
  410. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
  411. unsigned int ctrl0, ctrl1, drv;
  412. unsigned int slot[4];
  413. unsigned int i;
  414. int ret;
  415. if (slots == 0) {
  416. /* 0 = No fixed slot width */
  417. adau1977->slot_width = 0;
  418. adau1977->max_clock_provider_fs = 192000;
  419. return regmap_update_bits(adau1977->regmap,
  420. ADAU1977_REG_SAI_CTRL0, ADAU1977_SAI_CTRL0_SAI_MASK,
  421. ADAU1977_SAI_CTRL0_SAI_I2S);
  422. }
  423. if (rx_mask == 0 || tx_mask != 0)
  424. return -EINVAL;
  425. drv = 0;
  426. for (i = 0; i < 4; i++) {
  427. slot[i] = __ffs(rx_mask);
  428. drv |= ADAU1977_SAI_OVERTEMP_DRV_C(i);
  429. rx_mask &= ~(1 << slot[i]);
  430. if (slot[i] >= slots)
  431. return -EINVAL;
  432. if (rx_mask == 0)
  433. break;
  434. }
  435. if (rx_mask != 0)
  436. return -EINVAL;
  437. switch (width) {
  438. case 16:
  439. ctrl1 = ADAU1977_SAI_CTRL1_SLOT_WIDTH_16;
  440. break;
  441. case 24:
  442. /* We can only generate 16 bit or 32 bit wide slots */
  443. if (adau1977->clock_provider)
  444. return -EINVAL;
  445. ctrl1 = ADAU1977_SAI_CTRL1_SLOT_WIDTH_24;
  446. break;
  447. case 32:
  448. ctrl1 = ADAU1977_SAI_CTRL1_SLOT_WIDTH_32;
  449. break;
  450. default:
  451. return -EINVAL;
  452. }
  453. switch (slots) {
  454. case 2:
  455. ctrl0 = ADAU1977_SAI_CTRL0_SAI_TDM_2;
  456. break;
  457. case 4:
  458. ctrl0 = ADAU1977_SAI_CTRL0_SAI_TDM_4;
  459. break;
  460. case 8:
  461. ctrl0 = ADAU1977_SAI_CTRL0_SAI_TDM_8;
  462. break;
  463. case 16:
  464. ctrl0 = ADAU1977_SAI_CTRL0_SAI_TDM_16;
  465. break;
  466. default:
  467. return -EINVAL;
  468. }
  469. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_OVERTEMP,
  470. ADAU1977_SAI_OVERTEMP_DRV_C(0) |
  471. ADAU1977_SAI_OVERTEMP_DRV_C(1) |
  472. ADAU1977_SAI_OVERTEMP_DRV_C(2) |
  473. ADAU1977_SAI_OVERTEMP_DRV_C(3), drv);
  474. if (ret)
  475. return ret;
  476. ret = regmap_write(adau1977->regmap, ADAU1977_REG_CMAP12,
  477. (slot[1] << ADAU1977_CHAN_MAP_SECOND_SLOT_OFFSET) |
  478. (slot[0] << ADAU1977_CHAN_MAP_FIRST_SLOT_OFFSET));
  479. if (ret)
  480. return ret;
  481. ret = regmap_write(adau1977->regmap, ADAU1977_REG_CMAP34,
  482. (slot[3] << ADAU1977_CHAN_MAP_SECOND_SLOT_OFFSET) |
  483. (slot[2] << ADAU1977_CHAN_MAP_FIRST_SLOT_OFFSET));
  484. if (ret)
  485. return ret;
  486. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL0,
  487. ADAU1977_SAI_CTRL0_SAI_MASK, ctrl0);
  488. if (ret)
  489. return ret;
  490. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL1,
  491. ADAU1977_SAI_CTRL1_SLOT_WIDTH_MASK, ctrl1);
  492. if (ret)
  493. return ret;
  494. adau1977->slot_width = width;
  495. /* In clock provider mode the maximum bitclock is 24.576 MHz */
  496. adau1977->max_clock_provider_fs = min(192000, 24576000 / width / slots);
  497. return 0;
  498. }
  499. static int adau1977_mute(struct snd_soc_dai *dai, int mute, int stream)
  500. {
  501. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
  502. unsigned int val;
  503. if (mute)
  504. val = ADAU1977_MISC_CONTROL_MMUTE;
  505. else
  506. val = 0;
  507. return regmap_update_bits(adau1977->regmap, ADAU1977_REG_MISC_CONTROL,
  508. ADAU1977_MISC_CONTROL_MMUTE, val);
  509. }
  510. static int adau1977_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
  511. {
  512. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
  513. unsigned int ctrl0 = 0, ctrl1 = 0, block_power = 0;
  514. bool invert_lrclk;
  515. int ret;
  516. switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
  517. case SND_SOC_DAIFMT_CBC_CFC:
  518. adau1977->clock_provider = false;
  519. break;
  520. case SND_SOC_DAIFMT_CBP_CFP:
  521. ctrl1 |= ADAU1977_SAI_CTRL1_MASTER;
  522. adau1977->clock_provider = true;
  523. break;
  524. default:
  525. return -EINVAL;
  526. }
  527. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  528. case SND_SOC_DAIFMT_NB_NF:
  529. invert_lrclk = false;
  530. break;
  531. case SND_SOC_DAIFMT_IB_NF:
  532. block_power |= ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE;
  533. invert_lrclk = false;
  534. break;
  535. case SND_SOC_DAIFMT_NB_IF:
  536. invert_lrclk = true;
  537. break;
  538. case SND_SOC_DAIFMT_IB_IF:
  539. block_power |= ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE;
  540. invert_lrclk = true;
  541. break;
  542. default:
  543. return -EINVAL;
  544. }
  545. adau1977->right_j = false;
  546. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  547. case SND_SOC_DAIFMT_I2S:
  548. ctrl0 |= ADAU1977_SAI_CTRL0_FMT_I2S;
  549. break;
  550. case SND_SOC_DAIFMT_LEFT_J:
  551. ctrl0 |= ADAU1977_SAI_CTRL0_FMT_LJ;
  552. invert_lrclk = !invert_lrclk;
  553. break;
  554. case SND_SOC_DAIFMT_RIGHT_J:
  555. ctrl0 |= ADAU1977_SAI_CTRL0_FMT_RJ_24BIT;
  556. adau1977->right_j = true;
  557. invert_lrclk = !invert_lrclk;
  558. break;
  559. case SND_SOC_DAIFMT_DSP_A:
  560. ctrl1 |= ADAU1977_SAI_CTRL1_LRCLK_PULSE;
  561. ctrl0 |= ADAU1977_SAI_CTRL0_FMT_I2S;
  562. invert_lrclk = false;
  563. break;
  564. case SND_SOC_DAIFMT_DSP_B:
  565. ctrl1 |= ADAU1977_SAI_CTRL1_LRCLK_PULSE;
  566. ctrl0 |= ADAU1977_SAI_CTRL0_FMT_LJ;
  567. invert_lrclk = false;
  568. break;
  569. default:
  570. return -EINVAL;
  571. }
  572. if (invert_lrclk)
  573. block_power |= ADAU1977_BLOCK_POWER_SAI_LR_POL;
  574. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI,
  575. ADAU1977_BLOCK_POWER_SAI_LR_POL |
  576. ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE, block_power);
  577. if (ret)
  578. return ret;
  579. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL0,
  580. ADAU1977_SAI_CTRL0_FMT_MASK,
  581. ctrl0);
  582. if (ret)
  583. return ret;
  584. return regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL1,
  585. ADAU1977_SAI_CTRL1_MASTER | ADAU1977_SAI_CTRL1_LRCLK_PULSE,
  586. ctrl1);
  587. }
  588. static int adau1977_startup(struct snd_pcm_substream *substream,
  589. struct snd_soc_dai *dai)
  590. {
  591. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
  592. u64 formats = 0;
  593. if (adau1977->slot_width == 16)
  594. formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE;
  595. else if (adau1977->right_j || adau1977->slot_width == 24)
  596. formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE |
  597. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE;
  598. snd_pcm_hw_constraint_list(substream->runtime, 0,
  599. SNDRV_PCM_HW_PARAM_RATE, &adau1977->constraints);
  600. if (adau1977->clock_provider)
  601. snd_pcm_hw_constraint_minmax(substream->runtime,
  602. SNDRV_PCM_HW_PARAM_RATE, 8000,
  603. adau1977->max_clock_provider_fs);
  604. if (formats != 0)
  605. snd_pcm_hw_constraint_mask64(substream->runtime,
  606. SNDRV_PCM_HW_PARAM_FORMAT, formats);
  607. return 0;
  608. }
  609. static int adau1977_set_tristate(struct snd_soc_dai *dai, int tristate)
  610. {
  611. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
  612. unsigned int val;
  613. if (tristate)
  614. val = ADAU1977_SAI_OVERTEMP_DRV_HIZ;
  615. else
  616. val = 0;
  617. return regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_OVERTEMP,
  618. ADAU1977_SAI_OVERTEMP_DRV_HIZ, val);
  619. }
  620. static const struct snd_soc_dai_ops adau1977_dai_ops = {
  621. .startup = adau1977_startup,
  622. .hw_params = adau1977_hw_params,
  623. .mute_stream = adau1977_mute,
  624. .set_fmt = adau1977_set_dai_fmt,
  625. .set_tdm_slot = adau1977_set_tdm_slot,
  626. .set_tristate = adau1977_set_tristate,
  627. };
  628. static struct snd_soc_dai_driver adau1977_dai = {
  629. .name = "adau1977-hifi",
  630. .capture = {
  631. .stream_name = "Capture",
  632. .channels_min = 1,
  633. .channels_max = 4,
  634. .rates = SNDRV_PCM_RATE_KNOT,
  635. .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE |
  636. SNDRV_PCM_FMTBIT_S32_LE,
  637. .sig_bits = 24,
  638. },
  639. .ops = &adau1977_dai_ops,
  640. };
  641. static const unsigned int adau1977_rates[] = {
  642. 8000, 16000, 32000, 64000, 128000,
  643. 11025, 22050, 44100, 88200, 172400,
  644. 12000, 24000, 48000, 96000, 192000,
  645. };
  646. #define ADAU1977_RATE_CONSTRAINT_MASK_32000 0x001f
  647. #define ADAU1977_RATE_CONSTRAINT_MASK_44100 0x03e0
  648. #define ADAU1977_RATE_CONSTRAINT_MASK_48000 0x7c00
  649. /* All rates >= 32000 */
  650. #define ADAU1977_RATE_CONSTRAINT_MASK_LRCLK 0x739c
  651. static bool adau1977_check_sysclk(unsigned int mclk, unsigned int base_freq)
  652. {
  653. unsigned int mcs;
  654. if (mclk % (base_freq * 128) != 0)
  655. return false;
  656. mcs = mclk / (128 * base_freq);
  657. if (mcs < 1 || mcs > 6 || mcs == 5)
  658. return false;
  659. return true;
  660. }
  661. static int adau1977_set_sysclk(struct snd_soc_component *component,
  662. int clk_id, int source, unsigned int freq, int dir)
  663. {
  664. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
  665. unsigned int mask = 0;
  666. unsigned int clk_src;
  667. unsigned int ret;
  668. if (dir != SND_SOC_CLOCK_IN)
  669. return -EINVAL;
  670. if (clk_id != ADAU1977_SYSCLK)
  671. return -EINVAL;
  672. switch (source) {
  673. case ADAU1977_SYSCLK_SRC_MCLK:
  674. clk_src = 0;
  675. break;
  676. case ADAU1977_SYSCLK_SRC_LRCLK:
  677. clk_src = ADAU1977_PLL_CLK_S;
  678. break;
  679. default:
  680. return -EINVAL;
  681. }
  682. if (freq != 0 && source == ADAU1977_SYSCLK_SRC_MCLK) {
  683. if (freq < 4000000 || freq > 36864000)
  684. return -EINVAL;
  685. if (adau1977_check_sysclk(freq, 32000))
  686. mask |= ADAU1977_RATE_CONSTRAINT_MASK_32000;
  687. if (adau1977_check_sysclk(freq, 44100))
  688. mask |= ADAU1977_RATE_CONSTRAINT_MASK_44100;
  689. if (adau1977_check_sysclk(freq, 48000))
  690. mask |= ADAU1977_RATE_CONSTRAINT_MASK_48000;
  691. if (mask == 0)
  692. return -EINVAL;
  693. } else if (source == ADAU1977_SYSCLK_SRC_LRCLK) {
  694. mask = ADAU1977_RATE_CONSTRAINT_MASK_LRCLK;
  695. }
  696. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_PLL,
  697. ADAU1977_PLL_CLK_S, clk_src);
  698. if (ret)
  699. return ret;
  700. adau1977->constraints.mask = mask;
  701. adau1977->sysclk_src = source;
  702. adau1977->sysclk = freq;
  703. return 0;
  704. }
  705. static int adau1977_component_probe(struct snd_soc_component *component)
  706. {
  707. struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
  708. struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
  709. int ret;
  710. switch (adau1977->type) {
  711. case ADAU1977:
  712. ret = snd_soc_dapm_new_controls(dapm,
  713. adau1977_micbias_dapm_widgets,
  714. ARRAY_SIZE(adau1977_micbias_dapm_widgets));
  715. if (ret < 0)
  716. return ret;
  717. break;
  718. default:
  719. break;
  720. }
  721. return 0;
  722. }
  723. static const struct snd_soc_component_driver adau1977_component_driver = {
  724. .probe = adau1977_component_probe,
  725. .set_bias_level = adau1977_set_bias_level,
  726. .set_sysclk = adau1977_set_sysclk,
  727. .controls = adau1977_snd_controls,
  728. .num_controls = ARRAY_SIZE(adau1977_snd_controls),
  729. .dapm_widgets = adau1977_dapm_widgets,
  730. .num_dapm_widgets = ARRAY_SIZE(adau1977_dapm_widgets),
  731. .dapm_routes = adau1977_dapm_routes,
  732. .num_dapm_routes = ARRAY_SIZE(adau1977_dapm_routes),
  733. .use_pmdown_time = 1,
  734. .endianness = 1,
  735. };
  736. static int adau1977_setup_micbias(struct adau1977 *adau1977)
  737. {
  738. unsigned int micbias;
  739. if (device_property_read_u32(adau1977->dev, "adi,micbias", &micbias))
  740. micbias = ADAU1977_MICBIAS_8V5;
  741. if (micbias > ADAU1977_MICBIAS_9V0) {
  742. dev_err(adau1977->dev, "Invalid value for 'adi,micbias'\n");
  743. return -EINVAL;
  744. }
  745. return regmap_update_bits(adau1977->regmap, ADAU1977_REG_MICBIAS,
  746. ADAU1977_MICBIAS_MB_VOLTS_MASK,
  747. micbias << ADAU1977_MICBIAS_MB_VOLTS_OFFSET);
  748. }
  749. int adau1977_probe(struct device *dev, struct regmap *regmap,
  750. enum adau1977_type type, void (*switch_mode)(struct device *dev))
  751. {
  752. unsigned int power_off_mask;
  753. struct adau1977 *adau1977;
  754. int ret;
  755. if (IS_ERR(regmap))
  756. return PTR_ERR(regmap);
  757. adau1977 = devm_kzalloc(dev, sizeof(*adau1977), GFP_KERNEL);
  758. if (adau1977 == NULL)
  759. return -ENOMEM;
  760. adau1977->dev = dev;
  761. adau1977->type = type;
  762. adau1977->regmap = regmap;
  763. adau1977->switch_mode = switch_mode;
  764. adau1977->max_clock_provider_fs = 192000;
  765. adau1977->constraints.list = adau1977_rates;
  766. adau1977->constraints.count = ARRAY_SIZE(adau1977_rates);
  767. adau1977->avdd_reg = devm_regulator_get(dev, "AVDD");
  768. if (IS_ERR(adau1977->avdd_reg))
  769. return PTR_ERR(adau1977->avdd_reg);
  770. adau1977->dvdd_reg = devm_regulator_get_optional(dev, "DVDD");
  771. if (IS_ERR(adau1977->dvdd_reg)) {
  772. if (PTR_ERR(adau1977->dvdd_reg) != -ENODEV)
  773. return PTR_ERR(adau1977->dvdd_reg);
  774. adau1977->dvdd_reg = NULL;
  775. }
  776. adau1977->reset_gpio = devm_gpiod_get_optional(dev, "reset",
  777. GPIOD_OUT_LOW);
  778. if (IS_ERR(adau1977->reset_gpio))
  779. return PTR_ERR(adau1977->reset_gpio);
  780. dev_set_drvdata(dev, adau1977);
  781. if (adau1977->reset_gpio)
  782. ndelay(100);
  783. ret = adau1977_power_enable(adau1977);
  784. if (ret)
  785. return ret;
  786. if (type == ADAU1977) {
  787. ret = adau1977_setup_micbias(adau1977);
  788. if (ret)
  789. goto err_poweroff;
  790. }
  791. if (adau1977->dvdd_reg)
  792. power_off_mask = ~0;
  793. else
  794. power_off_mask = (unsigned int)~ADAU1977_BLOCK_POWER_SAI_LDO_EN;
  795. ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI,
  796. power_off_mask, 0x00);
  797. if (ret)
  798. goto err_poweroff;
  799. ret = adau1977_power_disable(adau1977);
  800. if (ret)
  801. return ret;
  802. return devm_snd_soc_register_component(dev, &adau1977_component_driver,
  803. &adau1977_dai, 1);
  804. err_poweroff:
  805. adau1977_power_disable(adau1977);
  806. return ret;
  807. }
  808. EXPORT_SYMBOL_GPL(adau1977_probe);
  809. static bool adau1977_register_volatile(struct device *dev, unsigned int reg)
  810. {
  811. switch (reg) {
  812. case ADAU1977_REG_STATUS(0):
  813. case ADAU1977_REG_STATUS(1):
  814. case ADAU1977_REG_STATUS(2):
  815. case ADAU1977_REG_STATUS(3):
  816. case ADAU1977_REG_ADC_CLIP:
  817. return true;
  818. }
  819. return false;
  820. }
  821. const struct regmap_config adau1977_regmap_config = {
  822. .max_register = ADAU1977_REG_DC_HPF_CAL,
  823. .volatile_reg = adau1977_register_volatile,
  824. .cache_type = REGCACHE_RBTREE,
  825. .reg_defaults = adau1977_reg_defaults,
  826. .num_reg_defaults = ARRAY_SIZE(adau1977_reg_defaults),
  827. };
  828. EXPORT_SYMBOL_GPL(adau1977_regmap_config);
  829. MODULE_DESCRIPTION("ASoC ADAU1977/ADAU1978/ADAU1979 driver");
  830. MODULE_AUTHOR("Lars-Peter Clausen <[email protected]>");
  831. MODULE_LICENSE("GPL");