1 // SPDX-License-Identifier: GPL-2.0-only
3 * ADAU1977/ADAU1978/ADAU1979 driver
5 * Copyright 2014 Analog Devices Inc.
6 * Author: Lars-Peter Clausen <lars@metafoo.de>
9 #include <linux/delay.h>
10 #include <linux/device.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/i2c.h>
13 #include <linux/init.h>
14 #include <linux/module.h>
15 #include <linux/regmap.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/slab.h>
19 #include <sound/core.h>
20 #include <sound/initval.h>
21 #include <sound/pcm.h>
22 #include <sound/pcm_params.h>
23 #include <sound/soc.h>
24 #include <sound/tlv.h>
26 #include <dt-bindings/sound/adi,adau1977.h>
30 #define ADAU1977_REG_POWER 0x00
31 #define ADAU1977_REG_PLL 0x01
32 #define ADAU1977_REG_BOOST 0x02
33 #define ADAU1977_REG_MICBIAS 0x03
34 #define ADAU1977_REG_BLOCK_POWER_SAI 0x04
35 #define ADAU1977_REG_SAI_CTRL0 0x05
36 #define ADAU1977_REG_SAI_CTRL1 0x06
37 #define ADAU1977_REG_CMAP12 0x07
38 #define ADAU1977_REG_CMAP34 0x08
39 #define ADAU1977_REG_SAI_OVERTEMP 0x09
40 #define ADAU1977_REG_POST_ADC_GAIN(x) (0x0a + (x))
41 #define ADAU1977_REG_MISC_CONTROL 0x0e
42 #define ADAU1977_REG_DIAG_CONTROL 0x10
43 #define ADAU1977_REG_STATUS(x) (0x11 + (x))
44 #define ADAU1977_REG_DIAG_IRQ1 0x15
45 #define ADAU1977_REG_DIAG_IRQ2 0x16
46 #define ADAU1977_REG_ADJUST1 0x17
47 #define ADAU1977_REG_ADJUST2 0x18
48 #define ADAU1977_REG_ADC_CLIP 0x19
49 #define ADAU1977_REG_DC_HPF_CAL 0x1a
51 #define ADAU1977_POWER_RESET BIT(7)
52 #define ADAU1977_POWER_PWUP BIT(0)
54 #define ADAU1977_PLL_CLK_S BIT(4)
55 #define ADAU1977_PLL_MCS_MASK 0x7
57 #define ADAU1977_MICBIAS_MB_VOLTS_MASK 0xf0
58 #define ADAU1977_MICBIAS_MB_VOLTS_OFFSET 4
60 #define ADAU1977_BLOCK_POWER_SAI_LR_POL BIT(7)
61 #define ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE BIT(6)
62 #define ADAU1977_BLOCK_POWER_SAI_LDO_EN BIT(5)
64 #define ADAU1977_SAI_CTRL0_FMT_MASK (0x3 << 6)
65 #define ADAU1977_SAI_CTRL0_FMT_I2S (0x0 << 6)
66 #define ADAU1977_SAI_CTRL0_FMT_LJ (0x1 << 6)
67 #define ADAU1977_SAI_CTRL0_FMT_RJ_24BIT (0x2 << 6)
68 #define ADAU1977_SAI_CTRL0_FMT_RJ_16BIT (0x3 << 6)
70 #define ADAU1977_SAI_CTRL0_SAI_MASK (0x7 << 3)
71 #define ADAU1977_SAI_CTRL0_SAI_I2S (0x0 << 3)
72 #define ADAU1977_SAI_CTRL0_SAI_TDM_2 (0x1 << 3)
73 #define ADAU1977_SAI_CTRL0_SAI_TDM_4 (0x2 << 3)
74 #define ADAU1977_SAI_CTRL0_SAI_TDM_8 (0x3 << 3)
75 #define ADAU1977_SAI_CTRL0_SAI_TDM_16 (0x4 << 3)
77 #define ADAU1977_SAI_CTRL0_FS_MASK (0x7)
78 #define ADAU1977_SAI_CTRL0_FS_8000_12000 (0x0)
79 #define ADAU1977_SAI_CTRL0_FS_16000_24000 (0x1)
80 #define ADAU1977_SAI_CTRL0_FS_32000_48000 (0x2)
81 #define ADAU1977_SAI_CTRL0_FS_64000_96000 (0x3)
82 #define ADAU1977_SAI_CTRL0_FS_128000_192000 (0x4)
84 #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_MASK (0x3 << 5)
85 #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_32 (0x0 << 5)
86 #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_24 (0x1 << 5)
87 #define ADAU1977_SAI_CTRL1_SLOT_WIDTH_16 (0x2 << 5)
88 #define ADAU1977_SAI_CTRL1_DATA_WIDTH_MASK (0x1 << 4)
89 #define ADAU1977_SAI_CTRL1_DATA_WIDTH_16BIT (0x1 << 4)
90 #define ADAU1977_SAI_CTRL1_DATA_WIDTH_24BIT (0x0 << 4)
91 #define ADAU1977_SAI_CTRL1_LRCLK_PULSE BIT(3)
92 #define ADAU1977_SAI_CTRL1_MSB BIT(2)
93 #define ADAU1977_SAI_CTRL1_BCLKRATE_16 (0x1 << 1)
94 #define ADAU1977_SAI_CTRL1_BCLKRATE_32 (0x0 << 1)
95 #define ADAU1977_SAI_CTRL1_BCLKRATE_MASK (0x1 << 1)
96 #define ADAU1977_SAI_CTRL1_MASTER BIT(0)
98 #define ADAU1977_SAI_OVERTEMP_DRV_C(x) BIT(4 + (x))
99 #define ADAU1977_SAI_OVERTEMP_DRV_HIZ BIT(3)
101 #define ADAU1977_MISC_CONTROL_SUM_MODE_MASK (0x3 << 6)
102 #define ADAU1977_MISC_CONTROL_SUM_MODE_1CH (0x2 << 6)
103 #define ADAU1977_MISC_CONTROL_SUM_MODE_2CH (0x1 << 6)
104 #define ADAU1977_MISC_CONTROL_SUM_MODE_4CH (0x0 << 6)
105 #define ADAU1977_MISC_CONTROL_MMUTE BIT(4)
106 #define ADAU1977_MISC_CONTROL_DC_CAL BIT(0)
108 #define ADAU1977_CHAN_MAP_SECOND_SLOT_OFFSET 4
109 #define ADAU1977_CHAN_MAP_FIRST_SLOT_OFFSET 0
112 struct regmap
*regmap
;
115 enum adau1977_sysclk_src sysclk_src
;
116 struct gpio_desc
*reset_gpio
;
117 enum adau1977_type type
;
119 struct regulator
*avdd_reg
;
120 struct regulator
*dvdd_reg
;
122 struct snd_pcm_hw_constraint_list constraints
;
125 void (*switch_mode
)(struct device
*dev
);
127 unsigned int max_clock_provider_fs
;
128 unsigned int slot_width
;
133 static const struct reg_default adau1977_reg_defaults
[] = {
157 static const DECLARE_TLV_DB_MINMAX_MUTE(adau1977_adc_gain
, -3562, 6000);
159 static const struct snd_soc_dapm_widget adau1977_micbias_dapm_widgets
[] = {
160 SND_SOC_DAPM_SUPPLY("MICBIAS", ADAU1977_REG_MICBIAS
,
164 static const struct snd_soc_dapm_widget adau1977_dapm_widgets
[] = {
165 SND_SOC_DAPM_SUPPLY("Vref", ADAU1977_REG_BLOCK_POWER_SAI
,
168 SND_SOC_DAPM_ADC("ADC1", "Capture", ADAU1977_REG_BLOCK_POWER_SAI
, 0, 0),
169 SND_SOC_DAPM_ADC("ADC2", "Capture", ADAU1977_REG_BLOCK_POWER_SAI
, 1, 0),
170 SND_SOC_DAPM_ADC("ADC3", "Capture", ADAU1977_REG_BLOCK_POWER_SAI
, 2, 0),
171 SND_SOC_DAPM_ADC("ADC4", "Capture", ADAU1977_REG_BLOCK_POWER_SAI
, 3, 0),
173 SND_SOC_DAPM_INPUT("AIN1"),
174 SND_SOC_DAPM_INPUT("AIN2"),
175 SND_SOC_DAPM_INPUT("AIN3"),
176 SND_SOC_DAPM_INPUT("AIN4"),
178 SND_SOC_DAPM_OUTPUT("VREF"),
181 static const struct snd_soc_dapm_route adau1977_dapm_routes
[] = {
182 { "ADC1", NULL
, "AIN1" },
183 { "ADC2", NULL
, "AIN2" },
184 { "ADC3", NULL
, "AIN3" },
185 { "ADC4", NULL
, "AIN4" },
187 { "ADC1", NULL
, "Vref" },
188 { "ADC2", NULL
, "Vref" },
189 { "ADC3", NULL
, "Vref" },
190 { "ADC4", NULL
, "Vref" },
192 { "VREF", NULL
, "Vref" },
195 #define ADAU1977_VOLUME(x) \
196 SOC_SINGLE_TLV("ADC" #x " Capture Volume", \
197 ADAU1977_REG_POST_ADC_GAIN((x) - 1), \
198 0, 255, 1, adau1977_adc_gain)
200 #define ADAU1977_HPF_SWITCH(x) \
201 SOC_SINGLE("ADC" #x " Highpass-Filter Capture Switch", \
202 ADAU1977_REG_DC_HPF_CAL, (x) - 1, 1, 0)
204 #define ADAU1977_DC_SUB_SWITCH(x) \
205 SOC_SINGLE("ADC" #x " DC Subtraction Capture Switch", \
206 ADAU1977_REG_DC_HPF_CAL, (x) + 3, 1, 0)
208 static const struct snd_kcontrol_new adau1977_snd_controls
[] = {
214 ADAU1977_HPF_SWITCH(1),
215 ADAU1977_HPF_SWITCH(2),
216 ADAU1977_HPF_SWITCH(3),
217 ADAU1977_HPF_SWITCH(4),
219 ADAU1977_DC_SUB_SWITCH(1),
220 ADAU1977_DC_SUB_SWITCH(2),
221 ADAU1977_DC_SUB_SWITCH(3),
222 ADAU1977_DC_SUB_SWITCH(4),
225 static int adau1977_reset(struct adau1977
*adau1977
)
230 * The reset bit is obviously volatile, but we need to be able to cache
231 * the other bits in the register, so we can't just mark the whole
232 * register as volatile. Since this is the only place where we'll ever
233 * touch the reset bit just bypass the cache for this operation.
235 regcache_cache_bypass(adau1977
->regmap
, true);
236 ret
= regmap_write(adau1977
->regmap
, ADAU1977_REG_POWER
,
237 ADAU1977_POWER_RESET
);
238 regcache_cache_bypass(adau1977
->regmap
, false);
244 * Returns the appropriate setting for ths FS field in the CTRL0 register
245 * depending on the rate.
247 static int adau1977_lookup_fs(unsigned int rate
)
249 if (rate
>= 8000 && rate
<= 12000)
250 return ADAU1977_SAI_CTRL0_FS_8000_12000
;
251 else if (rate
>= 16000 && rate
<= 24000)
252 return ADAU1977_SAI_CTRL0_FS_16000_24000
;
253 else if (rate
>= 32000 && rate
<= 48000)
254 return ADAU1977_SAI_CTRL0_FS_32000_48000
;
255 else if (rate
>= 64000 && rate
<= 96000)
256 return ADAU1977_SAI_CTRL0_FS_64000_96000
;
257 else if (rate
>= 128000 && rate
<= 192000)
258 return ADAU1977_SAI_CTRL0_FS_128000_192000
;
263 static int adau1977_lookup_mcs(struct adau1977
*adau1977
, unsigned int rate
,
269 * rate = sysclk / (512 * mcs_lut[mcs]) * 2**fs
270 * => mcs_lut[mcs] = sysclk / (512 * rate) * 2**fs
271 * => mcs_lut[mcs] = sysclk / ((512 / 2**fs) * rate)
276 if (adau1977
->sysclk
% rate
!= 0)
279 mcs
= adau1977
->sysclk
/ rate
;
281 /* The factors configured by MCS are 1, 2, 3, 4, 6 */
282 if (mcs
< 1 || mcs
> 6 || mcs
== 5)
292 static int adau1977_hw_params(struct snd_pcm_substream
*substream
,
293 struct snd_pcm_hw_params
*params
, struct snd_soc_dai
*dai
)
295 struct snd_soc_component
*component
= dai
->component
;
296 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(component
);
297 unsigned int rate
= params_rate(params
);
298 unsigned int slot_width
;
299 unsigned int ctrl0
, ctrl0_mask
;
304 fs
= adau1977_lookup_fs(rate
);
308 if (adau1977
->sysclk_src
== ADAU1977_SYSCLK_SRC_MCLK
) {
309 mcs
= adau1977_lookup_mcs(adau1977
, rate
, fs
);
316 ctrl0_mask
= ADAU1977_SAI_CTRL0_FS_MASK
;
319 if (adau1977
->right_j
) {
320 switch (params_width(params
)) {
322 ctrl0
|= ADAU1977_SAI_CTRL0_FMT_RJ_16BIT
;
325 ctrl0
|= ADAU1977_SAI_CTRL0_FMT_RJ_24BIT
;
330 ctrl0_mask
|= ADAU1977_SAI_CTRL0_FMT_MASK
;
333 if (adau1977
->clock_provider
) {
334 switch (params_width(params
)) {
336 ctrl1
= ADAU1977_SAI_CTRL1_DATA_WIDTH_16BIT
;
341 ctrl1
= ADAU1977_SAI_CTRL1_DATA_WIDTH_24BIT
;
348 /* In TDM mode there is a fixed slot width */
349 if (adau1977
->slot_width
)
350 slot_width
= adau1977
->slot_width
;
352 if (slot_width
== 16)
353 ctrl1
|= ADAU1977_SAI_CTRL1_BCLKRATE_16
;
355 ctrl1
|= ADAU1977_SAI_CTRL1_BCLKRATE_32
;
357 ret
= regmap_update_bits(adau1977
->regmap
,
358 ADAU1977_REG_SAI_CTRL1
,
359 ADAU1977_SAI_CTRL1_DATA_WIDTH_MASK
|
360 ADAU1977_SAI_CTRL1_BCLKRATE_MASK
,
366 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_SAI_CTRL0
,
371 return regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_PLL
,
372 ADAU1977_PLL_MCS_MASK
, mcs
);
375 static int adau1977_power_disable(struct adau1977
*adau1977
)
379 if (!adau1977
->enabled
)
382 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_POWER
,
383 ADAU1977_POWER_PWUP
, 0);
387 regcache_mark_dirty(adau1977
->regmap
);
389 gpiod_set_value_cansleep(adau1977
->reset_gpio
, 0);
391 regcache_cache_only(adau1977
->regmap
, true);
393 regulator_disable(adau1977
->avdd_reg
);
394 if (adau1977
->dvdd_reg
)
395 regulator_disable(adau1977
->dvdd_reg
);
397 adau1977
->enabled
= false;
402 static int adau1977_power_enable(struct adau1977
*adau1977
)
407 if (adau1977
->enabled
)
410 ret
= regulator_enable(adau1977
->avdd_reg
);
414 if (adau1977
->dvdd_reg
) {
415 ret
= regulator_enable(adau1977
->dvdd_reg
);
417 goto err_disable_avdd
;
420 gpiod_set_value_cansleep(adau1977
->reset_gpio
, 1);
422 regcache_cache_only(adau1977
->regmap
, false);
424 if (adau1977
->switch_mode
)
425 adau1977
->switch_mode(adau1977
->dev
);
427 ret
= adau1977_reset(adau1977
);
429 goto err_disable_dvdd
;
431 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_POWER
,
432 ADAU1977_POWER_PWUP
, ADAU1977_POWER_PWUP
);
434 goto err_disable_dvdd
;
436 ret
= regcache_sync(adau1977
->regmap
);
438 goto err_disable_dvdd
;
441 * The PLL register is not affected by the software reset. It is
442 * possible that the value of the register was changed to the
443 * default value while we were in cache only mode. In this case
444 * regcache_sync will skip over it and we have to manually sync
447 ret
= regmap_read(adau1977
->regmap
, ADAU1977_REG_PLL
, &val
);
449 goto err_disable_dvdd
;
452 regcache_cache_bypass(adau1977
->regmap
, true);
453 ret
= regmap_write(adau1977
->regmap
, ADAU1977_REG_PLL
,
456 goto err_disable_dvdd
;
457 regcache_cache_bypass(adau1977
->regmap
, false);
460 adau1977
->enabled
= true;
465 if (adau1977
->dvdd_reg
)
466 regulator_disable(adau1977
->dvdd_reg
);
468 regulator_disable(adau1977
->avdd_reg
);
472 static int adau1977_set_bias_level(struct snd_soc_component
*component
,
473 enum snd_soc_bias_level level
)
475 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(component
);
479 case SND_SOC_BIAS_ON
:
481 case SND_SOC_BIAS_PREPARE
:
483 case SND_SOC_BIAS_STANDBY
:
484 if (snd_soc_component_get_bias_level(component
) == SND_SOC_BIAS_OFF
)
485 ret
= adau1977_power_enable(adau1977
);
487 case SND_SOC_BIAS_OFF
:
488 ret
= adau1977_power_disable(adau1977
);
495 static int adau1977_set_tdm_slot(struct snd_soc_dai
*dai
, unsigned int tx_mask
,
496 unsigned int rx_mask
, int slots
, int width
)
498 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(dai
->component
);
499 unsigned int ctrl0
, ctrl1
, drv
;
500 unsigned int slot
[4];
505 /* 0 = No fixed slot width */
506 adau1977
->slot_width
= 0;
507 adau1977
->max_clock_provider_fs
= 192000;
508 return regmap_update_bits(adau1977
->regmap
,
509 ADAU1977_REG_SAI_CTRL0
, ADAU1977_SAI_CTRL0_SAI_MASK
,
510 ADAU1977_SAI_CTRL0_SAI_I2S
);
513 if (rx_mask
== 0 || tx_mask
!= 0)
517 for (i
= 0; i
< 4; i
++) {
518 slot
[i
] = __ffs(rx_mask
);
519 drv
|= ADAU1977_SAI_OVERTEMP_DRV_C(i
);
520 rx_mask
&= ~(1 << slot
[i
]);
521 if (slot
[i
] >= slots
)
532 ctrl1
= ADAU1977_SAI_CTRL1_SLOT_WIDTH_16
;
535 /* We can only generate 16 bit or 32 bit wide slots */
536 if (adau1977
->clock_provider
)
538 ctrl1
= ADAU1977_SAI_CTRL1_SLOT_WIDTH_24
;
541 ctrl1
= ADAU1977_SAI_CTRL1_SLOT_WIDTH_32
;
549 ctrl0
= ADAU1977_SAI_CTRL0_SAI_TDM_2
;
552 ctrl0
= ADAU1977_SAI_CTRL0_SAI_TDM_4
;
555 ctrl0
= ADAU1977_SAI_CTRL0_SAI_TDM_8
;
558 ctrl0
= ADAU1977_SAI_CTRL0_SAI_TDM_16
;
564 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_SAI_OVERTEMP
,
565 ADAU1977_SAI_OVERTEMP_DRV_C(0) |
566 ADAU1977_SAI_OVERTEMP_DRV_C(1) |
567 ADAU1977_SAI_OVERTEMP_DRV_C(2) |
568 ADAU1977_SAI_OVERTEMP_DRV_C(3), drv
);
572 ret
= regmap_write(adau1977
->regmap
, ADAU1977_REG_CMAP12
,
573 (slot
[1] << ADAU1977_CHAN_MAP_SECOND_SLOT_OFFSET
) |
574 (slot
[0] << ADAU1977_CHAN_MAP_FIRST_SLOT_OFFSET
));
578 ret
= regmap_write(adau1977
->regmap
, ADAU1977_REG_CMAP34
,
579 (slot
[3] << ADAU1977_CHAN_MAP_SECOND_SLOT_OFFSET
) |
580 (slot
[2] << ADAU1977_CHAN_MAP_FIRST_SLOT_OFFSET
));
584 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_SAI_CTRL0
,
585 ADAU1977_SAI_CTRL0_SAI_MASK
, ctrl0
);
589 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_SAI_CTRL1
,
590 ADAU1977_SAI_CTRL1_SLOT_WIDTH_MASK
, ctrl1
);
594 adau1977
->slot_width
= width
;
596 /* In clock provider mode the maximum bitclock is 24.576 MHz */
597 adau1977
->max_clock_provider_fs
= min(192000, 24576000 / width
/ slots
);
602 static int adau1977_mute(struct snd_soc_dai
*dai
, int mute
, int stream
)
604 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(dai
->component
);
608 val
= ADAU1977_MISC_CONTROL_MMUTE
;
612 return regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_MISC_CONTROL
,
613 ADAU1977_MISC_CONTROL_MMUTE
, val
);
616 static int adau1977_set_dai_fmt(struct snd_soc_dai
*dai
, unsigned int fmt
)
618 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(dai
->component
);
619 unsigned int ctrl0
= 0, ctrl1
= 0, block_power
= 0;
623 switch (fmt
& SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK
) {
624 case SND_SOC_DAIFMT_CBC_CFC
:
625 adau1977
->clock_provider
= false;
627 case SND_SOC_DAIFMT_CBP_CFP
:
628 ctrl1
|= ADAU1977_SAI_CTRL1_MASTER
;
629 adau1977
->clock_provider
= true;
635 switch (fmt
& SND_SOC_DAIFMT_INV_MASK
) {
636 case SND_SOC_DAIFMT_NB_NF
:
637 invert_lrclk
= false;
639 case SND_SOC_DAIFMT_IB_NF
:
640 block_power
|= ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE
;
641 invert_lrclk
= false;
643 case SND_SOC_DAIFMT_NB_IF
:
646 case SND_SOC_DAIFMT_IB_IF
:
647 block_power
|= ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE
;
654 adau1977
->right_j
= false;
655 switch (fmt
& SND_SOC_DAIFMT_FORMAT_MASK
) {
656 case SND_SOC_DAIFMT_I2S
:
657 ctrl0
|= ADAU1977_SAI_CTRL0_FMT_I2S
;
659 case SND_SOC_DAIFMT_LEFT_J
:
660 ctrl0
|= ADAU1977_SAI_CTRL0_FMT_LJ
;
661 invert_lrclk
= !invert_lrclk
;
663 case SND_SOC_DAIFMT_RIGHT_J
:
664 ctrl0
|= ADAU1977_SAI_CTRL0_FMT_RJ_24BIT
;
665 adau1977
->right_j
= true;
666 invert_lrclk
= !invert_lrclk
;
668 case SND_SOC_DAIFMT_DSP_A
:
669 ctrl1
|= ADAU1977_SAI_CTRL1_LRCLK_PULSE
;
670 ctrl0
|= ADAU1977_SAI_CTRL0_FMT_I2S
;
671 invert_lrclk
= false;
673 case SND_SOC_DAIFMT_DSP_B
:
674 ctrl1
|= ADAU1977_SAI_CTRL1_LRCLK_PULSE
;
675 ctrl0
|= ADAU1977_SAI_CTRL0_FMT_LJ
;
676 invert_lrclk
= false;
683 block_power
|= ADAU1977_BLOCK_POWER_SAI_LR_POL
;
685 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_BLOCK_POWER_SAI
,
686 ADAU1977_BLOCK_POWER_SAI_LR_POL
|
687 ADAU1977_BLOCK_POWER_SAI_BCLK_EDGE
, block_power
);
691 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_SAI_CTRL0
,
692 ADAU1977_SAI_CTRL0_FMT_MASK
,
697 return regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_SAI_CTRL1
,
698 ADAU1977_SAI_CTRL1_MASTER
| ADAU1977_SAI_CTRL1_LRCLK_PULSE
,
702 static int adau1977_startup(struct snd_pcm_substream
*substream
,
703 struct snd_soc_dai
*dai
)
705 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(dai
->component
);
708 if (adau1977
->slot_width
== 16)
709 formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S16_BE
;
710 else if (adau1977
->right_j
|| adau1977
->slot_width
== 24)
711 formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S16_BE
|
712 SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S24_BE
;
714 snd_pcm_hw_constraint_list(substream
->runtime
, 0,
715 SNDRV_PCM_HW_PARAM_RATE
, &adau1977
->constraints
);
717 if (adau1977
->clock_provider
)
718 snd_pcm_hw_constraint_minmax(substream
->runtime
,
719 SNDRV_PCM_HW_PARAM_RATE
, 8000,
720 adau1977
->max_clock_provider_fs
);
723 snd_pcm_hw_constraint_mask64(substream
->runtime
,
724 SNDRV_PCM_HW_PARAM_FORMAT
, formats
);
729 static int adau1977_set_tristate(struct snd_soc_dai
*dai
, int tristate
)
731 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(dai
->component
);
735 val
= ADAU1977_SAI_OVERTEMP_DRV_HIZ
;
739 return regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_SAI_OVERTEMP
,
740 ADAU1977_SAI_OVERTEMP_DRV_HIZ
, val
);
743 static const struct snd_soc_dai_ops adau1977_dai_ops
= {
744 .startup
= adau1977_startup
,
745 .hw_params
= adau1977_hw_params
,
746 .mute_stream
= adau1977_mute
,
747 .set_fmt
= adau1977_set_dai_fmt
,
748 .set_tdm_slot
= adau1977_set_tdm_slot
,
749 .set_tristate
= adau1977_set_tristate
,
752 static struct snd_soc_dai_driver adau1977_dai
= {
753 .name
= "adau1977-hifi",
755 .stream_name
= "Capture",
758 .rates
= SNDRV_PCM_RATE_KNOT
,
759 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
|
760 SNDRV_PCM_FMTBIT_S32_LE
,
763 .ops
= &adau1977_dai_ops
,
766 static const unsigned int adau1977_rates
[] = {
767 8000, 16000, 32000, 64000, 128000,
768 11025, 22050, 44100, 88200, 172400,
769 12000, 24000, 48000, 96000, 192000,
772 #define ADAU1977_RATE_CONSTRAINT_MASK_32000 0x001f
773 #define ADAU1977_RATE_CONSTRAINT_MASK_44100 0x03e0
774 #define ADAU1977_RATE_CONSTRAINT_MASK_48000 0x7c00
775 /* All rates >= 32000 */
776 #define ADAU1977_RATE_CONSTRAINT_MASK_LRCLK 0x739c
778 static bool adau1977_check_sysclk(unsigned int mclk
, unsigned int base_freq
)
782 if (mclk
% (base_freq
* 128) != 0)
785 mcs
= mclk
/ (128 * base_freq
);
786 if (mcs
< 1 || mcs
> 6 || mcs
== 5)
792 static int adau1977_set_sysclk(struct snd_soc_component
*component
,
793 int clk_id
, int source
, unsigned int freq
, int dir
)
795 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(component
);
796 unsigned int mask
= 0;
797 unsigned int clk_src
;
800 if (dir
!= SND_SOC_CLOCK_IN
)
803 if (clk_id
!= ADAU1977_SYSCLK
)
807 case ADAU1977_SYSCLK_SRC_MCLK
:
810 case ADAU1977_SYSCLK_SRC_LRCLK
:
811 clk_src
= ADAU1977_PLL_CLK_S
;
817 if (freq
!= 0 && source
== ADAU1977_SYSCLK_SRC_MCLK
) {
818 if (freq
< 4000000 || freq
> 36864000)
821 if (adau1977_check_sysclk(freq
, 32000))
822 mask
|= ADAU1977_RATE_CONSTRAINT_MASK_32000
;
823 if (adau1977_check_sysclk(freq
, 44100))
824 mask
|= ADAU1977_RATE_CONSTRAINT_MASK_44100
;
825 if (adau1977_check_sysclk(freq
, 48000))
826 mask
|= ADAU1977_RATE_CONSTRAINT_MASK_48000
;
830 } else if (source
== ADAU1977_SYSCLK_SRC_LRCLK
) {
831 mask
= ADAU1977_RATE_CONSTRAINT_MASK_LRCLK
;
834 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_PLL
,
835 ADAU1977_PLL_CLK_S
, clk_src
);
839 adau1977
->constraints
.mask
= mask
;
840 adau1977
->sysclk_src
= source
;
841 adau1977
->sysclk
= freq
;
846 static int adau1977_component_probe(struct snd_soc_component
*component
)
848 struct snd_soc_dapm_context
*dapm
= snd_soc_component_get_dapm(component
);
849 struct adau1977
*adau1977
= snd_soc_component_get_drvdata(component
);
852 switch (adau1977
->type
) {
854 ret
= snd_soc_dapm_new_controls(dapm
,
855 adau1977_micbias_dapm_widgets
,
856 ARRAY_SIZE(adau1977_micbias_dapm_widgets
));
867 static const struct snd_soc_component_driver adau1977_component_driver
= {
868 .probe
= adau1977_component_probe
,
869 .set_bias_level
= adau1977_set_bias_level
,
870 .set_sysclk
= adau1977_set_sysclk
,
871 .controls
= adau1977_snd_controls
,
872 .num_controls
= ARRAY_SIZE(adau1977_snd_controls
),
873 .dapm_widgets
= adau1977_dapm_widgets
,
874 .num_dapm_widgets
= ARRAY_SIZE(adau1977_dapm_widgets
),
875 .dapm_routes
= adau1977_dapm_routes
,
876 .num_dapm_routes
= ARRAY_SIZE(adau1977_dapm_routes
),
877 .use_pmdown_time
= 1,
881 static int adau1977_setup_micbias(struct adau1977
*adau1977
)
883 unsigned int micbias
;
885 if (device_property_read_u32(adau1977
->dev
, "adi,micbias", &micbias
))
886 micbias
= ADAU1977_MICBIAS_8V5
;
888 if (micbias
> ADAU1977_MICBIAS_9V0
) {
889 dev_err(adau1977
->dev
, "Invalid value for 'adi,micbias'\n");
893 return regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_MICBIAS
,
894 ADAU1977_MICBIAS_MB_VOLTS_MASK
,
895 micbias
<< ADAU1977_MICBIAS_MB_VOLTS_OFFSET
);
898 int adau1977_probe(struct device
*dev
, struct regmap
*regmap
,
899 enum adau1977_type type
, void (*switch_mode
)(struct device
*dev
))
901 unsigned int power_off_mask
;
902 struct adau1977
*adau1977
;
906 return PTR_ERR(regmap
);
908 adau1977
= devm_kzalloc(dev
, sizeof(*adau1977
), GFP_KERNEL
);
909 if (adau1977
== NULL
)
913 adau1977
->type
= type
;
914 adau1977
->regmap
= regmap
;
915 adau1977
->switch_mode
= switch_mode
;
916 adau1977
->max_clock_provider_fs
= 192000;
918 adau1977
->constraints
.list
= adau1977_rates
;
919 adau1977
->constraints
.count
= ARRAY_SIZE(adau1977_rates
);
921 adau1977
->avdd_reg
= devm_regulator_get(dev
, "AVDD");
922 if (IS_ERR(adau1977
->avdd_reg
))
923 return PTR_ERR(adau1977
->avdd_reg
);
925 adau1977
->dvdd_reg
= devm_regulator_get_optional(dev
, "DVDD");
926 if (IS_ERR(adau1977
->dvdd_reg
)) {
927 if (PTR_ERR(adau1977
->dvdd_reg
) != -ENODEV
)
928 return PTR_ERR(adau1977
->dvdd_reg
);
929 adau1977
->dvdd_reg
= NULL
;
932 adau1977
->reset_gpio
= devm_gpiod_get_optional(dev
, "reset",
934 if (IS_ERR(adau1977
->reset_gpio
))
935 return PTR_ERR(adau1977
->reset_gpio
);
937 dev_set_drvdata(dev
, adau1977
);
939 if (adau1977
->reset_gpio
)
942 ret
= adau1977_power_enable(adau1977
);
946 if (type
== ADAU1977
) {
947 ret
= adau1977_setup_micbias(adau1977
);
952 if (adau1977
->dvdd_reg
)
955 power_off_mask
= (unsigned int)~ADAU1977_BLOCK_POWER_SAI_LDO_EN
;
957 ret
= regmap_update_bits(adau1977
->regmap
, ADAU1977_REG_BLOCK_POWER_SAI
,
958 power_off_mask
, 0x00);
962 ret
= adau1977_power_disable(adau1977
);
966 return devm_snd_soc_register_component(dev
, &adau1977_component_driver
,
970 adau1977_power_disable(adau1977
);
974 EXPORT_SYMBOL_GPL(adau1977_probe
);
976 static bool adau1977_register_volatile(struct device
*dev
, unsigned int reg
)
979 case ADAU1977_REG_STATUS(0):
980 case ADAU1977_REG_STATUS(1):
981 case ADAU1977_REG_STATUS(2):
982 case ADAU1977_REG_STATUS(3):
983 case ADAU1977_REG_ADC_CLIP
:
990 const struct regmap_config adau1977_regmap_config
= {
991 .max_register
= ADAU1977_REG_DC_HPF_CAL
,
992 .volatile_reg
= adau1977_register_volatile
,
994 .cache_type
= REGCACHE_MAPLE
,
995 .reg_defaults
= adau1977_reg_defaults
,
996 .num_reg_defaults
= ARRAY_SIZE(adau1977_reg_defaults
),
998 EXPORT_SYMBOL_GPL(adau1977_regmap_config
);
1000 MODULE_DESCRIPTION("ASoC ADAU1977/ADAU1978/ADAU1979 driver");
1001 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
1002 MODULE_LICENSE("GPL");