aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs')
-rw-r--r--sound/soc/codecs/88pm860x-codec.c12
-rw-r--r--sound/soc/codecs/Kconfig27
-rw-r--r--sound/soc/codecs/Makefile8
-rw-r--r--sound/soc/codecs/ac97.c4
-rw-r--r--sound/soc/codecs/adau17x1.c8
-rw-r--r--sound/soc/codecs/adau1977.c2
-rw-r--r--sound/soc/codecs/ak4642.c4
-rw-r--r--sound/soc/codecs/ak5386.c50
-rw-r--r--sound/soc/codecs/arizona.c263
-rw-r--r--sound/soc/codecs/cs4265.c682
-rw-r--r--sound/soc/codecs/cs4265.h64
-rw-r--r--sound/soc/codecs/cs4270.c4
-rw-r--r--sound/soc/codecs/cs42l52.c14
-rw-r--r--sound/soc/codecs/cs42l56.c76
-rw-r--r--sound/soc/codecs/cs42l73.c6
-rw-r--r--sound/soc/codecs/cs42xx8.c5
-rw-r--r--sound/soc/codecs/cs42xx8.h8
-rw-r--r--sound/soc/codecs/cx20442.c10
-rw-r--r--sound/soc/codecs/max98088.c6
-rw-r--r--sound/soc/codecs/max98090.c42
-rw-r--r--sound/soc/codecs/max98095.c12
-rw-r--r--sound/soc/codecs/mc13783.c6
-rw-r--r--sound/soc/codecs/pcm1792a.c3
-rw-r--r--sound/soc/codecs/pcm1792a.h3
-rw-r--r--sound/soc/codecs/rl6231.c19
-rw-r--r--sound/soc/codecs/rt286.c1222
-rw-r--r--sound/soc/codecs/rt286.h198
-rw-r--r--sound/soc/codecs/rt5631.c10
-rw-r--r--sound/soc/codecs/rt5640.c10
-rw-r--r--sound/soc/codecs/rt5645.c10
-rw-r--r--sound/soc/codecs/rt5651.c10
-rw-r--r--sound/soc/codecs/rt5670-dsp.h54
-rw-r--r--sound/soc/codecs/rt5670.c2657
-rw-r--r--sound/soc/codecs/rt5670.h2000
-rw-r--r--sound/soc/codecs/rt5677.c272
-rw-r--r--sound/soc/codecs/rt5677.h15
-rw-r--r--sound/soc/codecs/sgtl5000.c14
-rw-r--r--sound/soc/codecs/si476x.c10
-rw-r--r--sound/soc/codecs/sirf-audio-codec.c4
-rw-r--r--sound/soc/codecs/sn95031.c6
-rw-r--r--sound/soc/codecs/spdif_transmitter.c2
-rw-r--r--sound/soc/codecs/ssm2518.c6
-rw-r--r--sound/soc/codecs/ssm2602.c10
-rw-r--r--sound/soc/codecs/sta32x.c19
-rw-r--r--sound/soc/codecs/sta529.c12
-rw-r--r--sound/soc/codecs/tas2552.c544
-rw-r--r--sound/soc/codecs/tas2552.h129
-rw-r--r--sound/soc/codecs/tas5086.c75
-rw-r--r--sound/soc/codecs/tlv320aic23.c10
-rw-r--r--sound/soc/codecs/tlv320aic26.c14
-rw-r--r--sound/soc/codecs/tlv320aic31xx.c40
-rw-r--r--sound/soc/codecs/tlv320aic32x4.c31
-rw-r--r--sound/soc/codecs/tlv320aic3x.c21
-rw-r--r--sound/soc/codecs/tlv320dac33.c12
-rw-r--r--sound/soc/codecs/tpa6130a2.c4
-rw-r--r--sound/soc/codecs/twl4030.c19
-rw-r--r--sound/soc/codecs/uda134x.c10
-rw-r--r--sound/soc/codecs/wl1273.c9
-rw-r--r--sound/soc/codecs/wm0010.c14
-rw-r--r--sound/soc/codecs/wm1250-ev1.c1
-rw-r--r--sound/soc/codecs/wm2000.c4
-rw-r--r--sound/soc/codecs/wm5100.c3
-rw-r--r--sound/soc/codecs/wm5102.c65
-rw-r--r--sound/soc/codecs/wm5110.c3
-rw-r--r--sound/soc/codecs/wm8350.c13
-rw-r--r--sound/soc/codecs/wm8400.c10
-rw-r--r--sound/soc/codecs/wm8510.c10
-rw-r--r--sound/soc/codecs/wm8523.c10
-rw-r--r--sound/soc/codecs/wm8580.c10
-rw-r--r--sound/soc/codecs/wm8711.c8
-rw-r--r--sound/soc/codecs/wm8728.c8
-rw-r--r--sound/soc/codecs/wm8731.c8
-rw-r--r--sound/soc/codecs/wm8737.c10
-rw-r--r--sound/soc/codecs/wm8741.c14
-rw-r--r--sound/soc/codecs/wm8750.c10
-rw-r--r--sound/soc/codecs/wm8753.c20
-rw-r--r--sound/soc/codecs/wm8770.c10
-rw-r--r--sound/soc/codecs/wm8804.c10
-rw-r--r--sound/soc/codecs/wm8900.c10
-rw-r--r--sound/soc/codecs/wm8903.c13
-rw-r--r--sound/soc/codecs/wm8904.c27
-rw-r--r--sound/soc/codecs/wm8940.c12
-rw-r--r--sound/soc/codecs/wm8955.c10
-rw-r--r--sound/soc/codecs/wm8958-dsp2.c24
-rw-r--r--sound/soc/codecs/wm8960.c17
-rw-r--r--sound/soc/codecs/wm8961.c10
-rw-r--r--sound/soc/codecs/wm8962.c29
-rw-r--r--sound/soc/codecs/wm8971.c10
-rw-r--r--sound/soc/codecs/wm8974.c10
-rw-r--r--sound/soc/codecs/wm8978.c14
-rw-r--r--sound/soc/codecs/wm8983.c12
-rw-r--r--sound/soc/codecs/wm8985.c15
-rw-r--r--sound/soc/codecs/wm8988.c10
-rw-r--r--sound/soc/codecs/wm8990.c10
-rw-r--r--sound/soc/codecs/wm8991.c10
-rw-r--r--sound/soc/codecs/wm8993.c10
-rw-r--r--sound/soc/codecs/wm8994.c26
-rw-r--r--sound/soc/codecs/wm8995.c12
-rw-r--r--sound/soc/codecs/wm8996.c6
-rw-r--r--sound/soc/codecs/wm8997.c2
-rw-r--r--sound/soc/codecs/wm9081.c10
-rw-r--r--sound/soc/codecs/wm9090.c4
-rw-r--r--sound/soc/codecs/wm9713.c10
-rw-r--r--sound/soc/codecs/wm_adsp.c4
-rw-r--r--sound/soc/codecs/wm_hubs.c4
105 files changed, 8566 insertions, 803 deletions
diff --git a/sound/soc/codecs/88pm860x-codec.c b/sound/soc/codecs/88pm860x-codec.c
index 3c4b10ff48c1..922006dd0583 100644
--- a/sound/soc/codecs/88pm860x-codec.c
+++ b/sound/soc/codecs/88pm860x-codec.c
@@ -945,11 +945,11 @@ static int pm860x_pcm_hw_params(struct snd_pcm_substream *substream,
945 unsigned char inf = 0, mask = 0; 945 unsigned char inf = 0, mask = 0;
946 946
947 /* bit size */ 947 /* bit size */
948 switch (params_format(params)) { 948 switch (params_width(params)) {
949 case SNDRV_PCM_FORMAT_S16_LE: 949 case 16:
950 inf &= ~PCM_INF2_18WL; 950 inf &= ~PCM_INF2_18WL;
951 break; 951 break;
952 case SNDRV_PCM_FORMAT_S18_3LE: 952 case 18:
953 inf |= PCM_INF2_18WL; 953 inf |= PCM_INF2_18WL;
954 break; 954 break;
955 default: 955 default:
@@ -1044,11 +1044,11 @@ static int pm860x_i2s_hw_params(struct snd_pcm_substream *substream,
1044 unsigned char inf; 1044 unsigned char inf;
1045 1045
1046 /* bit size */ 1046 /* bit size */
1047 switch (params_format(params)) { 1047 switch (params_width(params)) {
1048 case SNDRV_PCM_FORMAT_S16_LE: 1048 case 16:
1049 inf = 0; 1049 inf = 0;
1050 break; 1050 break;
1051 case SNDRV_PCM_FORMAT_S18_3LE: 1051 case 18:
1052 inf = PCM_INF2_18WL; 1052 inf = PCM_INF2_18WL;
1053 break; 1053 break;
1054 default: 1054 default:
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 0b9571c858f8..8838838e25ed 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -47,6 +47,7 @@ config SND_SOC_ALL_CODECS
47 select SND_SOC_CS42L52 if I2C && INPUT 47 select SND_SOC_CS42L52 if I2C && INPUT
48 select SND_SOC_CS42L56 if I2C && INPUT 48 select SND_SOC_CS42L56 if I2C && INPUT
49 select SND_SOC_CS42L73 if I2C 49 select SND_SOC_CS42L73 if I2C
50 select SND_SOC_CS4265 if I2C
50 select SND_SOC_CS4270 if I2C 51 select SND_SOC_CS4270 if I2C
51 select SND_SOC_CS4271 if SND_SOC_I2C_AND_SPI 52 select SND_SOC_CS4271 if SND_SOC_I2C_AND_SPI
52 select SND_SOC_CS42XX8_I2C if I2C 53 select SND_SOC_CS42XX8_I2C if I2C
@@ -74,10 +75,12 @@ config SND_SOC_ALL_CODECS
74 select SND_SOC_PCM3008 75 select SND_SOC_PCM3008
75 select SND_SOC_PCM512x_I2C if I2C 76 select SND_SOC_PCM512x_I2C if I2C
76 select SND_SOC_PCM512x_SPI if SPI_MASTER 77 select SND_SOC_PCM512x_SPI if SPI_MASTER
78 select SND_SOC_RT286 if I2C
77 select SND_SOC_RT5631 if I2C 79 select SND_SOC_RT5631 if I2C
78 select SND_SOC_RT5640 if I2C 80 select SND_SOC_RT5640 if I2C
79 select SND_SOC_RT5645 if I2C 81 select SND_SOC_RT5645 if I2C
80 select SND_SOC_RT5651 if I2C 82 select SND_SOC_RT5651 if I2C
83 select SND_SOC_RT5670 if I2C
81 select SND_SOC_RT5677 if I2C 84 select SND_SOC_RT5677 if I2C
82 select SND_SOC_SGTL5000 if I2C 85 select SND_SOC_SGTL5000 if I2C
83 select SND_SOC_SI476X if MFD_SI476X_CORE 86 select SND_SOC_SI476X if MFD_SI476X_CORE
@@ -91,6 +94,7 @@ config SND_SOC_ALL_CODECS
91 select SND_SOC_STA350 if I2C 94 select SND_SOC_STA350 if I2C
92 select SND_SOC_STA529 if I2C 95 select SND_SOC_STA529 if I2C
93 select SND_SOC_STAC9766 if SND_SOC_AC97_BUS 96 select SND_SOC_STAC9766 if SND_SOC_AC97_BUS
97 select SND_SOC_TAS2552 if I2C
94 select SND_SOC_TAS5086 if I2C 98 select SND_SOC_TAS5086 if I2C
95 select SND_SOC_TLV320AIC23_I2C if I2C 99 select SND_SOC_TLV320AIC23_I2C if I2C
96 select SND_SOC_TLV320AIC23_SPI if SPI_MASTER 100 select SND_SOC_TLV320AIC23_SPI if SPI_MASTER
@@ -338,6 +342,11 @@ config SND_SOC_CS42L73
338 tristate "Cirrus Logic CS42L73 CODEC" 342 tristate "Cirrus Logic CS42L73 CODEC"
339 depends on I2C 343 depends on I2C
340 344
345config SND_SOC_CS4265
346 tristate "Cirrus Logic CS4265 CODEC"
347 depends on I2C
348 select REGMAP_I2C
349
341# Cirrus Logic CS4270 Codec 350# Cirrus Logic CS4270 Codec
342config SND_SOC_CS4270 351config SND_SOC_CS4270
343 tristate "Cirrus Logic CS4270 CODEC" 352 tristate "Cirrus Logic CS4270 CODEC"
@@ -445,9 +454,16 @@ config SND_SOC_RL6231
445 default y if SND_SOC_RT5640=y 454 default y if SND_SOC_RT5640=y
446 default y if SND_SOC_RT5645=y 455 default y if SND_SOC_RT5645=y
447 default y if SND_SOC_RT5651=y 456 default y if SND_SOC_RT5651=y
457 default y if SND_SOC_RT5670=y
458 default y if SND_SOC_RT5677=y
448 default m if SND_SOC_RT5640=m 459 default m if SND_SOC_RT5640=m
449 default m if SND_SOC_RT5645=m 460 default m if SND_SOC_RT5645=m
450 default m if SND_SOC_RT5651=m 461 default m if SND_SOC_RT5651=m
462 default m if SND_SOC_RT5670=m
463 default m if SND_SOC_RT5677=m
464
465config SND_SOC_RT286
466 tristate
451 467
452config SND_SOC_RT5631 468config SND_SOC_RT5631
453 tristate 469 tristate
@@ -461,6 +477,9 @@ config SND_SOC_RT5645
461config SND_SOC_RT5651 477config SND_SOC_RT5651
462 tristate 478 tristate
463 479
480config SND_SOC_RT5670
481 tristate
482
464config SND_SOC_RT5677 483config SND_SOC_RT5677
465 tristate 484 tristate
466 485
@@ -521,6 +540,10 @@ config SND_SOC_STA529
521config SND_SOC_STAC9766 540config SND_SOC_STAC9766
522 tristate 541 tristate
523 542
543config SND_SOC_TAS2552
544 tristate "Texas Instruments TAS2552 Mono Audio amplifier"
545 depends on I2C
546
524config SND_SOC_TAS5086 547config SND_SOC_TAS5086
525 tristate "Texas Instruments TAS5086 speaker amplifier" 548 tristate "Texas Instruments TAS5086 speaker amplifier"
526 depends on I2C 549 depends on I2C
@@ -541,7 +564,9 @@ config SND_SOC_TLV320AIC26
541 depends on SPI 564 depends on SPI
542 565
543config SND_SOC_TLV320AIC31XX 566config SND_SOC_TLV320AIC31XX
544 tristate 567 tristate "Texas Instruments TLV320AIC31xx CODECs"
568 depends on I2C
569 select REGMAP_I2C
545 570
546config SND_SOC_TLV320AIC32X4 571config SND_SOC_TLV320AIC32X4
547 tristate 572 tristate
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 1bd6e1cf6f82..20afe0f0c5be 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -37,6 +37,7 @@ snd-soc-cs42l51-i2c-objs := cs42l51-i2c.o
37snd-soc-cs42l52-objs := cs42l52.o 37snd-soc-cs42l52-objs := cs42l52.o
38snd-soc-cs42l56-objs := cs42l56.o 38snd-soc-cs42l56-objs := cs42l56.o
39snd-soc-cs42l73-objs := cs42l73.o 39snd-soc-cs42l73-objs := cs42l73.o
40snd-soc-cs4265-objs := cs4265.o
40snd-soc-cs4270-objs := cs4270.o 41snd-soc-cs4270-objs := cs4270.o
41snd-soc-cs4271-objs := cs4271.o 42snd-soc-cs4271-objs := cs4271.o
42snd-soc-cs42xx8-objs := cs42xx8.o 43snd-soc-cs42xx8-objs := cs42xx8.o
@@ -68,10 +69,12 @@ snd-soc-pcm512x-objs := pcm512x.o
68snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o 69snd-soc-pcm512x-i2c-objs := pcm512x-i2c.o
69snd-soc-pcm512x-spi-objs := pcm512x-spi.o 70snd-soc-pcm512x-spi-objs := pcm512x-spi.o
70snd-soc-rl6231-objs := rl6231.o 71snd-soc-rl6231-objs := rl6231.o
72snd-soc-rt286-objs := rt286.o
71snd-soc-rt5631-objs := rt5631.o 73snd-soc-rt5631-objs := rt5631.o
72snd-soc-rt5640-objs := rt5640.o 74snd-soc-rt5640-objs := rt5640.o
73snd-soc-rt5645-objs := rt5645.o 75snd-soc-rt5645-objs := rt5645.o
74snd-soc-rt5651-objs := rt5651.o 76snd-soc-rt5651-objs := rt5651.o
77snd-soc-rt5670-objs := rt5670.o
75snd-soc-rt5677-objs := rt5677.o 78snd-soc-rt5677-objs := rt5677.o
76snd-soc-sgtl5000-objs := sgtl5000.o 79snd-soc-sgtl5000-objs := sgtl5000.o
77snd-soc-alc5623-objs := alc5623.o 80snd-soc-alc5623-objs := alc5623.o
@@ -162,6 +165,7 @@ snd-soc-wm-hubs-objs := wm_hubs.o
162# Amp 165# Amp
163snd-soc-max9877-objs := max9877.o 166snd-soc-max9877-objs := max9877.o
164snd-soc-tpa6130a2-objs := tpa6130a2.o 167snd-soc-tpa6130a2-objs := tpa6130a2.o
168snd-soc-tas2552-objs := tas2552.o
165 169
166obj-$(CONFIG_SND_SOC_88PM860X) += snd-soc-88pm860x.o 170obj-$(CONFIG_SND_SOC_88PM860X) += snd-soc-88pm860x.o
167obj-$(CONFIG_SND_SOC_AB8500_CODEC) += snd-soc-ab8500-codec.o 171obj-$(CONFIG_SND_SOC_AB8500_CODEC) += snd-soc-ab8500-codec.o
@@ -204,6 +208,7 @@ obj-$(CONFIG_SND_SOC_CS42L51_I2C) += snd-soc-cs42l51-i2c.o
204obj-$(CONFIG_SND_SOC_CS42L52) += snd-soc-cs42l52.o 208obj-$(CONFIG_SND_SOC_CS42L52) += snd-soc-cs42l52.o
205obj-$(CONFIG_SND_SOC_CS42L56) += snd-soc-cs42l56.o 209obj-$(CONFIG_SND_SOC_CS42L56) += snd-soc-cs42l56.o
206obj-$(CONFIG_SND_SOC_CS42L73) += snd-soc-cs42l73.o 210obj-$(CONFIG_SND_SOC_CS42L73) += snd-soc-cs42l73.o
211obj-$(CONFIG_SND_SOC_CS4265) += snd-soc-cs4265.o
207obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o 212obj-$(CONFIG_SND_SOC_CS4270) += snd-soc-cs4270.o
208obj-$(CONFIG_SND_SOC_CS4271) += snd-soc-cs4271.o 213obj-$(CONFIG_SND_SOC_CS4271) += snd-soc-cs4271.o
209obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o 214obj-$(CONFIG_SND_SOC_CS42XX8) += snd-soc-cs42xx8.o
@@ -235,10 +240,12 @@ obj-$(CONFIG_SND_SOC_PCM512x) += snd-soc-pcm512x.o
235obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o 240obj-$(CONFIG_SND_SOC_PCM512x_I2C) += snd-soc-pcm512x-i2c.o
236obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o 241obj-$(CONFIG_SND_SOC_PCM512x_SPI) += snd-soc-pcm512x-spi.o
237obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o 242obj-$(CONFIG_SND_SOC_RL6231) += snd-soc-rl6231.o
243obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o
238obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o 244obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o
239obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o 245obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o
240obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o 246obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o
241obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o 247obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o
248obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o
242obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o 249obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o
243obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o 250obj-$(CONFIG_SND_SOC_SGTL5000) += snd-soc-sgtl5000.o
244obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o 251obj-$(CONFIG_SND_SOC_SIGMADSP) += snd-soc-sigmadsp.o
@@ -255,6 +262,7 @@ obj-$(CONFIG_SND_SOC_STA32X) += snd-soc-sta32x.o
255obj-$(CONFIG_SND_SOC_STA350) += snd-soc-sta350.o 262obj-$(CONFIG_SND_SOC_STA350) += snd-soc-sta350.o
256obj-$(CONFIG_SND_SOC_STA529) += snd-soc-sta529.o 263obj-$(CONFIG_SND_SOC_STA529) += snd-soc-sta529.o
257obj-$(CONFIG_SND_SOC_STAC9766) += snd-soc-stac9766.o 264obj-$(CONFIG_SND_SOC_STAC9766) += snd-soc-stac9766.o
265obj-$(CONFIG_SND_SOC_TAS2552) += snd-soc-tas2552.o
258obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o 266obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o
259obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o 267obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o
260obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o 268obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o
diff --git a/sound/soc/codecs/ac97.c b/sound/soc/codecs/ac97.c
index 8d9ba4ba4bfe..e889e1b84192 100644
--- a/sound/soc/codecs/ac97.c
+++ b/sound/soc/codecs/ac97.c
@@ -89,8 +89,8 @@ static int ac97_soc_probe(struct snd_soc_codec *codec)
89 int ret; 89 int ret;
90 90
91 /* add codec as bus device for standard ac97 */ 91 /* add codec as bus device for standard ac97 */
92 ret = snd_ac97_bus(codec->card->snd_card, 0, soc_ac97_ops, NULL, 92 ret = snd_ac97_bus(codec->component.card->snd_card, 0, soc_ac97_ops,
93 &ac97_bus); 93 NULL, &ac97_bus);
94 if (ret < 0) 94 if (ret < 0)
95 return ret; 95 return ret;
96 96
diff --git a/sound/soc/codecs/adau17x1.c b/sound/soc/codecs/adau17x1.c
index 2961fae9670a..0b659704e60c 100644
--- a/sound/soc/codecs/adau17x1.c
+++ b/sound/soc/codecs/adau17x1.c
@@ -359,14 +359,14 @@ static int adau17x1_hw_params(struct snd_pcm_substream *substream,
359 if (adau->dai_fmt != SND_SOC_DAIFMT_RIGHT_J) 359 if (adau->dai_fmt != SND_SOC_DAIFMT_RIGHT_J)
360 return 0; 360 return 0;
361 361
362 switch (params_format(params)) { 362 switch (params_width(params)) {
363 case SNDRV_PCM_FORMAT_S16_LE: 363 case 16:
364 val = ADAU17X1_SERIAL_PORT1_DELAY16; 364 val = ADAU17X1_SERIAL_PORT1_DELAY16;
365 break; 365 break;
366 case SNDRV_PCM_FORMAT_S24_LE: 366 case 24:
367 val = ADAU17X1_SERIAL_PORT1_DELAY8; 367 val = ADAU17X1_SERIAL_PORT1_DELAY8;
368 break; 368 break;
369 case SNDRV_PCM_FORMAT_S32_LE: 369 case 32:
370 val = ADAU17X1_SERIAL_PORT1_DELAY0; 370 val = ADAU17X1_SERIAL_PORT1_DELAY0;
371 break; 371 break;
372 default: 372 default:
diff --git a/sound/soc/codecs/adau1977.c b/sound/soc/codecs/adau1977.c
index fd55da7cb9d4..70ab35744aba 100644
--- a/sound/soc/codecs/adau1977.c
+++ b/sound/soc/codecs/adau1977.c
@@ -968,7 +968,7 @@ int adau1977_probe(struct device *dev, struct regmap *regmap,
968 if (adau1977->dvdd_reg) 968 if (adau1977->dvdd_reg)
969 power_off_mask = ~0; 969 power_off_mask = ~0;
970 else 970 else
971 power_off_mask = ~ADAU1977_BLOCK_POWER_SAI_LDO_EN; 971 power_off_mask = (unsigned int)~ADAU1977_BLOCK_POWER_SAI_LDO_EN;
972 972
973 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI, 973 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI,
974 power_off_mask, 0x00); 974 power_off_mask, 0x00);
diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c
index 3ba4c0f11418..041712592e29 100644
--- a/sound/soc/codecs/ak4642.c
+++ b/sound/soc/codecs/ak4642.c
@@ -547,7 +547,7 @@ static const struct ak4642_drvdata ak4648_drvdata = {
547 .extended_frequencies = 1, 547 .extended_frequencies = 1,
548}; 548};
549 549
550static struct of_device_id ak4642_of_match[]; 550static const struct of_device_id ak4642_of_match[];
551static int ak4642_i2c_probe(struct i2c_client *i2c, 551static int ak4642_i2c_probe(struct i2c_client *i2c,
552 const struct i2c_device_id *id) 552 const struct i2c_device_id *id)
553{ 553{
@@ -593,7 +593,7 @@ static int ak4642_i2c_remove(struct i2c_client *client)
593 return 0; 593 return 0;
594} 594}
595 595
596static struct of_device_id ak4642_of_match[] = { 596static const struct of_device_id ak4642_of_match[] = {
597 { .compatible = "asahi-kasei,ak4642", .data = &ak4642_drvdata}, 597 { .compatible = "asahi-kasei,ak4642", .data = &ak4642_drvdata},
598 { .compatible = "asahi-kasei,ak4643", .data = &ak4643_drvdata}, 598 { .compatible = "asahi-kasei,ak4643", .data = &ak4643_drvdata},
599 { .compatible = "asahi-kasei,ak4648", .data = &ak4648_drvdata}, 599 { .compatible = "asahi-kasei,ak4648", .data = &ak4648_drvdata},
diff --git a/sound/soc/codecs/ak5386.c b/sound/soc/codecs/ak5386.c
index 72e953b2cb41..8107a1cac876 100644
--- a/sound/soc/codecs/ak5386.c
+++ b/sound/soc/codecs/ak5386.c
@@ -14,12 +14,18 @@
14#include <linux/of.h> 14#include <linux/of.h>
15#include <linux/of_gpio.h> 15#include <linux/of_gpio.h>
16#include <linux/of_device.h> 16#include <linux/of_device.h>
17#include <linux/regulator/consumer.h>
17#include <sound/soc.h> 18#include <sound/soc.h>
18#include <sound/pcm.h> 19#include <sound/pcm.h>
19#include <sound/initval.h> 20#include <sound/initval.h>
20 21
22static const char * const supply_names[] = {
23 "va", "vd"
24};
25
21struct ak5386_priv { 26struct ak5386_priv {
22 int reset_gpio; 27 int reset_gpio;
28 struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
23}; 29};
24 30
25static const struct snd_soc_dapm_widget ak5386_dapm_widgets[] = { 31static const struct snd_soc_dapm_widget ak5386_dapm_widgets[] = {
@@ -32,7 +38,42 @@ static const struct snd_soc_dapm_route ak5386_dapm_routes[] = {
32 { "Capture", NULL, "AINR" }, 38 { "Capture", NULL, "AINR" },
33}; 39};
34 40
41static int ak5386_soc_probe(struct snd_soc_codec *codec)
42{
43 struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec);
44 return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
45}
46
47static int ak5386_soc_remove(struct snd_soc_codec *codec)
48{
49 struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec);
50 regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
51 return 0;
52}
53
54#ifdef CONFIG_PM
55static int ak5386_soc_suspend(struct snd_soc_codec *codec)
56{
57 struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec);
58 regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
59 return 0;
60}
61
62static int ak5386_soc_resume(struct snd_soc_codec *codec)
63{
64 struct ak5386_priv *priv = snd_soc_codec_get_drvdata(codec);
65 return regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
66}
67#else
68#define ak5386_soc_suspend NULL
69#define ak5386_soc_resume NULL
70#endif /* CONFIG_PM */
71
35static struct snd_soc_codec_driver soc_codec_ak5386 = { 72static struct snd_soc_codec_driver soc_codec_ak5386 = {
73 .probe = ak5386_soc_probe,
74 .remove = ak5386_soc_remove,
75 .suspend = ak5386_soc_suspend,
76 .resume = ak5386_soc_resume,
36 .dapm_widgets = ak5386_dapm_widgets, 77 .dapm_widgets = ak5386_dapm_widgets,
37 .num_dapm_widgets = ARRAY_SIZE(ak5386_dapm_widgets), 78 .num_dapm_widgets = ARRAY_SIZE(ak5386_dapm_widgets),
38 .dapm_routes = ak5386_dapm_routes, 79 .dapm_routes = ak5386_dapm_routes,
@@ -122,6 +163,7 @@ static int ak5386_probe(struct platform_device *pdev)
122{ 163{
123 struct device *dev = &pdev->dev; 164 struct device *dev = &pdev->dev;
124 struct ak5386_priv *priv; 165 struct ak5386_priv *priv;
166 int ret, i;
125 167
126 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 168 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
127 if (!priv) 169 if (!priv)
@@ -130,6 +172,14 @@ static int ak5386_probe(struct platform_device *pdev)
130 priv->reset_gpio = -EINVAL; 172 priv->reset_gpio = -EINVAL;
131 dev_set_drvdata(dev, priv); 173 dev_set_drvdata(dev, priv);
132 174
175 for (i = 0; i < ARRAY_SIZE(supply_names); i++)
176 priv->supplies[i].supply = supply_names[i];
177
178 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(priv->supplies),
179 priv->supplies);
180 if (ret < 0)
181 return ret;
182
133 if (of_match_device(of_match_ptr(ak5386_dt_ids), dev)) 183 if (of_match_device(of_match_ptr(ak5386_dt_ids), dev))
134 priv->reset_gpio = of_get_named_gpio(dev->of_node, 184 priv->reset_gpio = of_get_named_gpio(dev->of_node,
135 "reset-gpio", 0); 185 "reset-gpio", 0);
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index 747c71e59c04..2f2e91ac690f 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -1152,6 +1152,31 @@ static int arizona_startup(struct snd_pcm_substream *substream,
1152 constraint); 1152 constraint);
1153} 1153}
1154 1154
1155static void arizona_wm5102_set_dac_comp(struct snd_soc_codec *codec,
1156 unsigned int rate)
1157{
1158 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1159 struct arizona *arizona = priv->arizona;
1160 struct reg_default dac_comp[] = {
1161 { 0x80, 0x3 },
1162 { ARIZONA_DAC_COMP_1, 0 },
1163 { ARIZONA_DAC_COMP_2, 0 },
1164 { 0x80, 0x0 },
1165 };
1166
1167 mutex_lock(&codec->mutex);
1168
1169 dac_comp[1].def = arizona->dac_comp_coeff;
1170 if (rate >= 176400)
1171 dac_comp[2].def = arizona->dac_comp_enabled;
1172
1173 mutex_unlock(&codec->mutex);
1174
1175 regmap_multi_reg_write(arizona->regmap,
1176 dac_comp,
1177 ARRAY_SIZE(dac_comp));
1178}
1179
1155static int arizona_hw_params_rate(struct snd_pcm_substream *substream, 1180static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
1156 struct snd_pcm_hw_params *params, 1181 struct snd_pcm_hw_params *params,
1157 struct snd_soc_dai *dai) 1182 struct snd_soc_dai *dai)
@@ -1178,6 +1203,15 @@ static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
1178 1203
1179 switch (dai_priv->clk) { 1204 switch (dai_priv->clk) {
1180 case ARIZONA_CLK_SYSCLK: 1205 case ARIZONA_CLK_SYSCLK:
1206 switch (priv->arizona->type) {
1207 case WM5102:
1208 arizona_wm5102_set_dac_comp(codec,
1209 params_rate(params));
1210 break;
1211 default:
1212 break;
1213 }
1214
1181 snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1, 1215 snd_soc_update_bits(codec, ARIZONA_SAMPLE_RATE_1,
1182 ARIZONA_SAMPLE_RATE_1_MASK, sr_val); 1216 ARIZONA_SAMPLE_RATE_1_MASK, sr_val);
1183 if (base) 1217 if (base)
@@ -1200,6 +1234,27 @@ static int arizona_hw_params_rate(struct snd_pcm_substream *substream,
1200 return 0; 1234 return 0;
1201} 1235}
1202 1236
1237static bool arizona_aif_cfg_changed(struct snd_soc_codec *codec,
1238 int base, int bclk, int lrclk, int frame)
1239{
1240 int val;
1241
1242 val = snd_soc_read(codec, base + ARIZONA_AIF_BCLK_CTRL);
1243 if (bclk != (val & ARIZONA_AIF1_BCLK_FREQ_MASK))
1244 return true;
1245
1246 val = snd_soc_read(codec, base + ARIZONA_AIF_TX_BCLK_RATE);
1247 if (lrclk != (val & ARIZONA_AIF1TX_BCPF_MASK))
1248 return true;
1249
1250 val = snd_soc_read(codec, base + ARIZONA_AIF_FRAME_CTRL_1);
1251 if (frame != (val & (ARIZONA_AIF1TX_WL_MASK |
1252 ARIZONA_AIF1TX_SLOT_LEN_MASK)))
1253 return true;
1254
1255 return false;
1256}
1257
1203static int arizona_hw_params(struct snd_pcm_substream *substream, 1258static int arizona_hw_params(struct snd_pcm_substream *substream,
1204 struct snd_pcm_hw_params *params, 1259 struct snd_pcm_hw_params *params,
1205 struct snd_soc_dai *dai) 1260 struct snd_soc_dai *dai)
@@ -1210,26 +1265,40 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
1210 int base = dai->driver->base; 1265 int base = dai->driver->base;
1211 const int *rates; 1266 const int *rates;
1212 int i, ret, val; 1267 int i, ret, val;
1268 int channels = params_channels(params);
1213 int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1]; 1269 int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1];
1270 int tdm_width = arizona->tdm_width[dai->id - 1];
1271 int tdm_slots = arizona->tdm_slots[dai->id - 1];
1214 int bclk, lrclk, wl, frame, bclk_target; 1272 int bclk, lrclk, wl, frame, bclk_target;
1273 bool reconfig;
1274 unsigned int aif_tx_state, aif_rx_state;
1215 1275
1216 if (params_rate(params) % 8000) 1276 if (params_rate(params) % 8000)
1217 rates = &arizona_44k1_bclk_rates[0]; 1277 rates = &arizona_44k1_bclk_rates[0];
1218 else 1278 else
1219 rates = &arizona_48k_bclk_rates[0]; 1279 rates = &arizona_48k_bclk_rates[0];
1220 1280
1221 bclk_target = snd_soc_params_to_bclk(params); 1281 if (tdm_slots) {
1222 if (chan_limit && chan_limit < params_channels(params)) { 1282 arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n",
1283 tdm_slots, tdm_width);
1284 bclk_target = tdm_slots * tdm_width * params_rate(params);
1285 channels = tdm_slots;
1286 } else {
1287 bclk_target = snd_soc_params_to_bclk(params);
1288 }
1289
1290 if (chan_limit && chan_limit < channels) {
1223 arizona_aif_dbg(dai, "Limiting to %d channels\n", chan_limit); 1291 arizona_aif_dbg(dai, "Limiting to %d channels\n", chan_limit);
1224 bclk_target /= params_channels(params); 1292 bclk_target /= channels;
1225 bclk_target *= chan_limit; 1293 bclk_target *= chan_limit;
1226 } 1294 }
1227 1295
1228 /* Force stereo for I2S mode */ 1296 /* Force multiple of 2 channels for I2S mode */
1229 val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT); 1297 val = snd_soc_read(codec, base + ARIZONA_AIF_FORMAT);
1230 if (params_channels(params) == 1 && (val & ARIZONA_AIF1_FMT_MASK)) { 1298 if ((channels & 1) && (val & ARIZONA_AIF1_FMT_MASK)) {
1231 arizona_aif_dbg(dai, "Forcing stereo mode\n"); 1299 arizona_aif_dbg(dai, "Forcing stereo mode\n");
1232 bclk_target *= 2; 1300 bclk_target /= channels;
1301 bclk_target *= channels + 1;
1233 } 1302 }
1234 1303
1235 for (i = 0; i < ARRAY_SIZE(arizona_44k1_bclk_rates); i++) { 1304 for (i = 0; i < ARRAY_SIZE(arizona_44k1_bclk_rates); i++) {
@@ -1253,28 +1322,56 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
1253 wl = snd_pcm_format_width(params_format(params)); 1322 wl = snd_pcm_format_width(params_format(params));
1254 frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl; 1323 frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl;
1255 1324
1325 reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame);
1326
1327 if (reconfig) {
1328 /* Save AIF TX/RX state */
1329 aif_tx_state = snd_soc_read(codec,
1330 base + ARIZONA_AIF_TX_ENABLES);
1331 aif_rx_state = snd_soc_read(codec,
1332 base + ARIZONA_AIF_RX_ENABLES);
1333 /* Disable AIF TX/RX before reconfiguring it */
1334 regmap_update_bits_async(arizona->regmap,
1335 base + ARIZONA_AIF_TX_ENABLES, 0xff, 0x0);
1336 regmap_update_bits(arizona->regmap,
1337 base + ARIZONA_AIF_RX_ENABLES, 0xff, 0x0);
1338 }
1339
1256 ret = arizona_hw_params_rate(substream, params, dai); 1340 ret = arizona_hw_params_rate(substream, params, dai);
1257 if (ret != 0) 1341 if (ret != 0)
1258 return ret; 1342 goto restore_aif;
1259 1343
1260 regmap_update_bits_async(arizona->regmap, 1344 if (reconfig) {
1261 base + ARIZONA_AIF_BCLK_CTRL, 1345 regmap_update_bits_async(arizona->regmap,
1262 ARIZONA_AIF1_BCLK_FREQ_MASK, bclk); 1346 base + ARIZONA_AIF_BCLK_CTRL,
1263 regmap_update_bits_async(arizona->regmap, 1347 ARIZONA_AIF1_BCLK_FREQ_MASK, bclk);
1264 base + ARIZONA_AIF_TX_BCLK_RATE, 1348 regmap_update_bits_async(arizona->regmap,
1265 ARIZONA_AIF1TX_BCPF_MASK, lrclk); 1349 base + ARIZONA_AIF_TX_BCLK_RATE,
1266 regmap_update_bits_async(arizona->regmap, 1350 ARIZONA_AIF1TX_BCPF_MASK, lrclk);
1267 base + ARIZONA_AIF_RX_BCLK_RATE, 1351 regmap_update_bits_async(arizona->regmap,
1268 ARIZONA_AIF1RX_BCPF_MASK, lrclk); 1352 base + ARIZONA_AIF_RX_BCLK_RATE,
1269 regmap_update_bits_async(arizona->regmap, 1353 ARIZONA_AIF1RX_BCPF_MASK, lrclk);
1270 base + ARIZONA_AIF_FRAME_CTRL_1, 1354 regmap_update_bits_async(arizona->regmap,
1271 ARIZONA_AIF1TX_WL_MASK | 1355 base + ARIZONA_AIF_FRAME_CTRL_1,
1272 ARIZONA_AIF1TX_SLOT_LEN_MASK, frame); 1356 ARIZONA_AIF1TX_WL_MASK |
1273 regmap_update_bits(arizona->regmap, base + ARIZONA_AIF_FRAME_CTRL_2, 1357 ARIZONA_AIF1TX_SLOT_LEN_MASK, frame);
1274 ARIZONA_AIF1RX_WL_MASK | 1358 regmap_update_bits(arizona->regmap,
1275 ARIZONA_AIF1RX_SLOT_LEN_MASK, frame); 1359 base + ARIZONA_AIF_FRAME_CTRL_2,
1360 ARIZONA_AIF1RX_WL_MASK |
1361 ARIZONA_AIF1RX_SLOT_LEN_MASK, frame);
1362 }
1276 1363
1277 return 0; 1364restore_aif:
1365 if (reconfig) {
1366 /* Restore AIF TX/RX state */
1367 regmap_update_bits_async(arizona->regmap,
1368 base + ARIZONA_AIF_TX_ENABLES,
1369 0xff, aif_tx_state);
1370 regmap_update_bits(arizona->regmap,
1371 base + ARIZONA_AIF_RX_ENABLES,
1372 0xff, aif_rx_state);
1373 }
1374 return ret;
1278} 1375}
1279 1376
1280static const char *arizona_dai_clk_str(int clk_id) 1377static const char *arizona_dai_clk_str(int clk_id)
@@ -1349,9 +1446,63 @@ static int arizona_set_tristate(struct snd_soc_dai *dai, int tristate)
1349 ARIZONA_AIF1_TRI, reg); 1446 ARIZONA_AIF1_TRI, reg);
1350} 1447}
1351 1448
1449static void arizona_set_channels_to_mask(struct snd_soc_dai *dai,
1450 unsigned int base,
1451 int channels, unsigned int mask)
1452{
1453 struct snd_soc_codec *codec = dai->codec;
1454 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1455 struct arizona *arizona = priv->arizona;
1456 int slot, i;
1457
1458 for (i = 0; i < channels; ++i) {
1459 slot = ffs(mask) - 1;
1460 if (slot < 0)
1461 return;
1462
1463 regmap_write(arizona->regmap, base + i, slot);
1464
1465 mask &= ~(1 << slot);
1466 }
1467
1468 if (mask)
1469 arizona_aif_warn(dai, "Too many channels in TDM mask\n");
1470}
1471
1472static int arizona_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
1473 unsigned int rx_mask, int slots, int slot_width)
1474{
1475 struct snd_soc_codec *codec = dai->codec;
1476 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
1477 struct arizona *arizona = priv->arizona;
1478 int base = dai->driver->base;
1479 int rx_max_chan = dai->driver->playback.channels_max;
1480 int tx_max_chan = dai->driver->capture.channels_max;
1481
1482 /* Only support TDM for the physical AIFs */
1483 if (dai->id > ARIZONA_MAX_AIF)
1484 return -ENOTSUPP;
1485
1486 if (slots == 0) {
1487 tx_mask = (1 << tx_max_chan) - 1;
1488 rx_mask = (1 << rx_max_chan) - 1;
1489 }
1490
1491 arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_3,
1492 tx_max_chan, tx_mask);
1493 arizona_set_channels_to_mask(dai, base + ARIZONA_AIF_FRAME_CTRL_11,
1494 rx_max_chan, rx_mask);
1495
1496 arizona->tdm_width[dai->id - 1] = slot_width;
1497 arizona->tdm_slots[dai->id - 1] = slots;
1498
1499 return 0;
1500}
1501
1352const struct snd_soc_dai_ops arizona_dai_ops = { 1502const struct snd_soc_dai_ops arizona_dai_ops = {
1353 .startup = arizona_startup, 1503 .startup = arizona_startup,
1354 .set_fmt = arizona_set_fmt, 1504 .set_fmt = arizona_set_fmt,
1505 .set_tdm_slot = arizona_set_tdm_slot,
1355 .hw_params = arizona_hw_params, 1506 .hw_params = arizona_hw_params,
1356 .set_sysclk = arizona_dai_set_sysclk, 1507 .set_sysclk = arizona_dai_set_sysclk,
1357 .set_tristate = arizona_set_tristate, 1508 .set_tristate = arizona_set_tristate,
@@ -1425,6 +1576,12 @@ static int arizona_validate_fll(struct arizona_fll *fll,
1425{ 1576{
1426 unsigned int Fvco_min; 1577 unsigned int Fvco_min;
1427 1578
1579 if (fll->fout && Fout != fll->fout) {
1580 arizona_fll_err(fll,
1581 "Can't change output on active FLL\n");
1582 return -EINVAL;
1583 }
1584
1428 if (Fref / ARIZONA_FLL_MAX_REFDIV > ARIZONA_FLL_MAX_FREF) { 1585 if (Fref / ARIZONA_FLL_MAX_REFDIV > ARIZONA_FLL_MAX_FREF) {
1429 arizona_fll_err(fll, 1586 arizona_fll_err(fll,
1430 "Can't scale %dMHz in to <=13.5MHz\n", 1587 "Can't scale %dMHz in to <=13.5MHz\n",
@@ -1503,6 +1660,10 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
1503 while (div <= ARIZONA_FLL_MAX_REFDIV) { 1660 while (div <= ARIZONA_FLL_MAX_REFDIV) {
1504 for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO; 1661 for (ratio = init_ratio; ratio <= ARIZONA_FLL_MAX_FRATIO;
1505 ratio++) { 1662 ratio++) {
1663 if ((ARIZONA_FLL_VCO_CORNER / 2) /
1664 (fll->vco_mult * ratio) < Fref)
1665 break;
1666
1506 if (target % (ratio * Fref)) { 1667 if (target % (ratio * Fref)) {
1507 cfg->refdiv = refdiv; 1668 cfg->refdiv = refdiv;
1508 cfg->fratio = ratio - 1; 1669 cfg->fratio = ratio - 1;
@@ -1510,11 +1671,7 @@ static int arizona_calc_fratio(struct arizona_fll *fll,
1510 } 1671 }
1511 } 1672 }
1512 1673
1513 for (ratio = init_ratio - 1; ratio >= 0; ratio--) { 1674 for (ratio = init_ratio - 1; ratio > 0; ratio--) {
1514 if (ARIZONA_FLL_VCO_CORNER / (fll->vco_mult * ratio) <
1515 Fref)
1516 break;
1517
1518 if (target % (ratio * Fref)) { 1675 if (target % (ratio * Fref)) {
1519 cfg->refdiv = refdiv; 1676 cfg->refdiv = refdiv;
1520 cfg->fratio = ratio - 1; 1677 cfg->fratio = ratio - 1;
@@ -1641,7 +1798,7 @@ static void arizona_apply_fll(struct arizona *arizona, unsigned int base,
1641 ARIZONA_FLL1_CTRL_UPD | cfg->n); 1798 ARIZONA_FLL1_CTRL_UPD | cfg->n);
1642} 1799}
1643 1800
1644static bool arizona_is_enabled_fll(struct arizona_fll *fll) 1801static int arizona_is_enabled_fll(struct arizona_fll *fll)
1645{ 1802{
1646 struct arizona *arizona = fll->arizona; 1803 struct arizona *arizona = fll->arizona;
1647 unsigned int reg; 1804 unsigned int reg;
@@ -1657,13 +1814,26 @@ static bool arizona_is_enabled_fll(struct arizona_fll *fll)
1657 return reg & ARIZONA_FLL1_ENA; 1814 return reg & ARIZONA_FLL1_ENA;
1658} 1815}
1659 1816
1660static void arizona_enable_fll(struct arizona_fll *fll) 1817static int arizona_enable_fll(struct arizona_fll *fll)
1661{ 1818{
1662 struct arizona *arizona = fll->arizona; 1819 struct arizona *arizona = fll->arizona;
1663 int ret; 1820 int ret;
1664 bool use_sync = false; 1821 bool use_sync = false;
1822 int already_enabled = arizona_is_enabled_fll(fll);
1665 struct arizona_fll_cfg cfg; 1823 struct arizona_fll_cfg cfg;
1666 1824
1825 if (already_enabled < 0)
1826 return already_enabled;
1827
1828 if (already_enabled) {
1829 /* Facilitate smooth refclk across the transition */
1830 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x7,
1831 ARIZONA_FLL1_GAIN_MASK, 0);
1832 regmap_update_bits_async(fll->arizona->regmap, fll->base + 1,
1833 ARIZONA_FLL1_FREERUN,
1834 ARIZONA_FLL1_FREERUN);
1835 }
1836
1667 /* 1837 /*
1668 * If we have both REFCLK and SYNCCLK then enable both, 1838 * If we have both REFCLK and SYNCCLK then enable both,
1669 * otherwise apply the SYNCCLK settings to REFCLK. 1839 * otherwise apply the SYNCCLK settings to REFCLK.
@@ -1691,7 +1861,7 @@ static void arizona_enable_fll(struct arizona_fll *fll)
1691 ARIZONA_FLL1_SYNC_ENA, 0); 1861 ARIZONA_FLL1_SYNC_ENA, 0);
1692 } else { 1862 } else {
1693 arizona_fll_err(fll, "No clocks provided\n"); 1863 arizona_fll_err(fll, "No clocks provided\n");
1694 return; 1864 return -EINVAL;
1695 } 1865 }
1696 1866
1697 /* 1867 /*
@@ -1706,25 +1876,29 @@ static void arizona_enable_fll(struct arizona_fll *fll)
1706 ARIZONA_FLL1_SYNC_BW, 1876 ARIZONA_FLL1_SYNC_BW,
1707 ARIZONA_FLL1_SYNC_BW); 1877 ARIZONA_FLL1_SYNC_BW);
1708 1878
1709 if (!arizona_is_enabled_fll(fll)) 1879 if (!already_enabled)
1710 pm_runtime_get(arizona->dev); 1880 pm_runtime_get(arizona->dev);
1711 1881
1712 /* Clear any pending completions */ 1882 /* Clear any pending completions */
1713 try_wait_for_completion(&fll->ok); 1883 try_wait_for_completion(&fll->ok);
1714 1884
1715 regmap_update_bits_async(arizona->regmap, fll->base + 1, 1885 regmap_update_bits_async(arizona->regmap, fll->base + 1,
1716 ARIZONA_FLL1_FREERUN, 0);
1717 regmap_update_bits_async(arizona->regmap, fll->base + 1,
1718 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA); 1886 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
1719 if (use_sync) 1887 if (use_sync)
1720 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, 1888 regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
1721 ARIZONA_FLL1_SYNC_ENA, 1889 ARIZONA_FLL1_SYNC_ENA,
1722 ARIZONA_FLL1_SYNC_ENA); 1890 ARIZONA_FLL1_SYNC_ENA);
1723 1891
1892 if (already_enabled)
1893 regmap_update_bits_async(arizona->regmap, fll->base + 1,
1894 ARIZONA_FLL1_FREERUN, 0);
1895
1724 ret = wait_for_completion_timeout(&fll->ok, 1896 ret = wait_for_completion_timeout(&fll->ok,
1725 msecs_to_jiffies(250)); 1897 msecs_to_jiffies(250));
1726 if (ret == 0) 1898 if (ret == 0)
1727 arizona_fll_warn(fll, "Timed out waiting for lock\n"); 1899 arizona_fll_warn(fll, "Timed out waiting for lock\n");
1900
1901 return 0;
1728} 1902}
1729 1903
1730static void arizona_disable_fll(struct arizona_fll *fll) 1904static void arizona_disable_fll(struct arizona_fll *fll)
@@ -1738,6 +1912,8 @@ static void arizona_disable_fll(struct arizona_fll *fll)
1738 ARIZONA_FLL1_ENA, 0, &change); 1912 ARIZONA_FLL1_ENA, 0, &change);
1739 regmap_update_bits(arizona->regmap, fll->base + 0x11, 1913 regmap_update_bits(arizona->regmap, fll->base + 0x11,
1740 ARIZONA_FLL1_SYNC_ENA, 0); 1914 ARIZONA_FLL1_SYNC_ENA, 0);
1915 regmap_update_bits_async(arizona->regmap, fll->base + 1,
1916 ARIZONA_FLL1_FREERUN, 0);
1741 1917
1742 if (change) 1918 if (change)
1743 pm_runtime_put_autosuspend(arizona->dev); 1919 pm_runtime_put_autosuspend(arizona->dev);
@@ -1746,7 +1922,7 @@ static void arizona_disable_fll(struct arizona_fll *fll)
1746int arizona_set_fll_refclk(struct arizona_fll *fll, int source, 1922int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
1747 unsigned int Fref, unsigned int Fout) 1923 unsigned int Fref, unsigned int Fout)
1748{ 1924{
1749 int ret; 1925 int ret = 0;
1750 1926
1751 if (fll->ref_src == source && fll->ref_freq == Fref) 1927 if (fll->ref_src == source && fll->ref_freq == Fref)
1752 return 0; 1928 return 0;
@@ -1761,17 +1937,17 @@ int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
1761 fll->ref_freq = Fref; 1937 fll->ref_freq = Fref;
1762 1938
1763 if (fll->fout && Fref > 0) { 1939 if (fll->fout && Fref > 0) {
1764 arizona_enable_fll(fll); 1940 ret = arizona_enable_fll(fll);
1765 } 1941 }
1766 1942
1767 return 0; 1943 return ret;
1768} 1944}
1769EXPORT_SYMBOL_GPL(arizona_set_fll_refclk); 1945EXPORT_SYMBOL_GPL(arizona_set_fll_refclk);
1770 1946
1771int arizona_set_fll(struct arizona_fll *fll, int source, 1947int arizona_set_fll(struct arizona_fll *fll, int source,
1772 unsigned int Fref, unsigned int Fout) 1948 unsigned int Fref, unsigned int Fout)
1773{ 1949{
1774 int ret; 1950 int ret = 0;
1775 1951
1776 if (fll->sync_src == source && 1952 if (fll->sync_src == source &&
1777 fll->sync_freq == Fref && fll->fout == Fout) 1953 fll->sync_freq == Fref && fll->fout == Fout)
@@ -1793,13 +1969,12 @@ int arizona_set_fll(struct arizona_fll *fll, int source,
1793 fll->sync_freq = Fref; 1969 fll->sync_freq = Fref;
1794 fll->fout = Fout; 1970 fll->fout = Fout;
1795 1971
1796 if (Fout) { 1972 if (Fout)
1797 arizona_enable_fll(fll); 1973 ret = arizona_enable_fll(fll);
1798 } else { 1974 else
1799 arizona_disable_fll(fll); 1975 arizona_disable_fll(fll);
1800 }
1801 1976
1802 return 0; 1977 return ret;
1803} 1978}
1804EXPORT_SYMBOL_GPL(arizona_set_fll); 1979EXPORT_SYMBOL_GPL(arizona_set_fll);
1805 1980
diff --git a/sound/soc/codecs/cs4265.c b/sound/soc/codecs/cs4265.c
new file mode 100644
index 000000000000..a20b30ca52c0
--- /dev/null
+++ b/sound/soc/codecs/cs4265.c
@@ -0,0 +1,682 @@
1/*
2 * cs4265.c -- CS4265 ALSA SoC audio driver
3 *
4 * Copyright 2014 Cirrus Logic, Inc.
5 *
6 * Author: Paul Handrigan <paul.handrigan@cirrus.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/moduleparam.h>
16#include <linux/kernel.h>
17#include <linux/gpio/consumer.h>
18#include <linux/init.h>
19#include <linux/delay.h>
20#include <linux/i2c.h>
21#include <linux/input.h>
22#include <linux/regmap.h>
23#include <linux/slab.h>
24#include <linux/platform_device.h>
25#include <sound/core.h>
26#include <sound/pcm.h>
27#include <sound/pcm_params.h>
28#include <sound/soc.h>
29#include <sound/soc-dapm.h>
30#include <sound/initval.h>
31#include <sound/tlv.h>
32#include "cs4265.h"
33
34struct cs4265_private {
35 struct device *dev;
36 struct regmap *regmap;
37 struct gpio_desc *reset_gpio;
38 u8 format;
39 u32 sysclk;
40};
41
42static const struct reg_default cs4265_reg_defaults[] = {
43 { CS4265_PWRCTL, 0x0F },
44 { CS4265_DAC_CTL, 0x08 },
45 { CS4265_ADC_CTL, 0x00 },
46 { CS4265_MCLK_FREQ, 0x00 },
47 { CS4265_SIG_SEL, 0x40 },
48 { CS4265_CHB_PGA_CTL, 0x00 },
49 { CS4265_CHA_PGA_CTL, 0x00 },
50 { CS4265_ADC_CTL2, 0x19 },
51 { CS4265_DAC_CHA_VOL, 0x00 },
52 { CS4265_DAC_CHB_VOL, 0x00 },
53 { CS4265_DAC_CTL2, 0xC0 },
54 { CS4265_SPDIF_CTL1, 0x00 },
55 { CS4265_SPDIF_CTL2, 0x00 },
56 { CS4265_INT_MASK, 0x00 },
57 { CS4265_STATUS_MODE_MSB, 0x00 },
58 { CS4265_STATUS_MODE_LSB, 0x00 },
59};
60
61static bool cs4265_readable_register(struct device *dev, unsigned int reg)
62{
63 switch (reg) {
64 case CS4265_PWRCTL:
65 case CS4265_DAC_CTL:
66 case CS4265_ADC_CTL:
67 case CS4265_MCLK_FREQ:
68 case CS4265_SIG_SEL:
69 case CS4265_CHB_PGA_CTL:
70 case CS4265_CHA_PGA_CTL:
71 case CS4265_ADC_CTL2:
72 case CS4265_DAC_CHA_VOL:
73 case CS4265_DAC_CHB_VOL:
74 case CS4265_DAC_CTL2:
75 case CS4265_SPDIF_CTL1:
76 case CS4265_SPDIF_CTL2:
77 case CS4265_INT_MASK:
78 case CS4265_STATUS_MODE_MSB:
79 case CS4265_STATUS_MODE_LSB:
80 return true;
81 default:
82 return false;
83 }
84}
85
86static bool cs4265_volatile_register(struct device *dev, unsigned int reg)
87{
88 switch (reg) {
89 case CS4265_INT_STATUS:
90 return true;
91 default:
92 return false;
93 }
94}
95
96static DECLARE_TLV_DB_SCALE(pga_tlv, -1200, 50, 0);
97
98static DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 0);
99
100static const char * const digital_input_mux_text[] = {
101 "SDIN1", "SDIN2"
102};
103
104static SOC_ENUM_SINGLE_DECL(digital_input_mux_enum, CS4265_SIG_SEL, 7,
105 digital_input_mux_text);
106
107static const struct snd_kcontrol_new digital_input_mux =
108 SOC_DAPM_ENUM("Digital Input Mux", digital_input_mux_enum);
109
110static const char * const mic_linein_text[] = {
111 "MIC", "LINEIN"
112};
113
114static SOC_ENUM_SINGLE_DECL(mic_linein_enum, CS4265_ADC_CTL2, 0,
115 mic_linein_text);
116
117static const char * const cam_mode_text[] = {
118 "One Byte", "Two Byte"
119};
120
121static SOC_ENUM_SINGLE_DECL(cam_mode_enum, CS4265_SPDIF_CTL1, 5,
122 cam_mode_text);
123
124static const char * const cam_mono_stereo_text[] = {
125 "Stereo", "Mono"
126};
127
128static SOC_ENUM_SINGLE_DECL(spdif_mono_stereo_enum, CS4265_SPDIF_CTL2, 2,
129 cam_mono_stereo_text);
130
131static const char * const mono_select_text[] = {
132 "Channel A", "Channel B"
133};
134
135static SOC_ENUM_SINGLE_DECL(spdif_mono_select_enum, CS4265_SPDIF_CTL2, 0,
136 mono_select_text);
137
138static const struct snd_kcontrol_new mic_linein_mux =
139 SOC_DAPM_ENUM("ADC Input Capture Mux", mic_linein_enum);
140
141static const struct snd_kcontrol_new loopback_ctl =
142 SOC_DAPM_SINGLE("Switch", CS4265_SIG_SEL, 1, 1, 0);
143
144static const struct snd_kcontrol_new spdif_switch =
145 SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 0, 0);
146
147static const struct snd_kcontrol_new dac_switch =
148 SOC_DAPM_SINGLE("Switch", CS4265_PWRCTL, 1, 1, 0);
149
150static const struct snd_kcontrol_new cs4265_snd_controls[] = {
151
152 SOC_DOUBLE_R_SX_TLV("PGA Volume", CS4265_CHA_PGA_CTL,
153 CS4265_CHB_PGA_CTL, 0, 0x28, 0x30, pga_tlv),
154 SOC_DOUBLE_R_TLV("DAC Volume", CS4265_DAC_CHA_VOL,
155 CS4265_DAC_CHB_VOL, 0, 0xFF, 1, dac_tlv),
156 SOC_SINGLE("De-emp 44.1kHz Switch", CS4265_DAC_CTL, 1,
157 1, 0),
158 SOC_SINGLE("DAC INV Switch", CS4265_DAC_CTL2, 5,
159 1, 0),
160 SOC_SINGLE("DAC Zero Cross Switch", CS4265_DAC_CTL2, 6,
161 1, 0),
162 SOC_SINGLE("DAC Soft Ramp Switch", CS4265_DAC_CTL2, 7,
163 1, 0),
164 SOC_SINGLE("ADC HPF Switch", CS4265_ADC_CTL, 1,
165 1, 0),
166 SOC_SINGLE("ADC Zero Cross Switch", CS4265_ADC_CTL2, 3,
167 1, 1),
168 SOC_SINGLE("ADC Soft Ramp Switch", CS4265_ADC_CTL2, 7,
169 1, 0),
170 SOC_SINGLE("E to F Buffer Disable Switch", CS4265_SPDIF_CTL1,
171 6, 1, 0),
172 SOC_ENUM("C Data Access", cam_mode_enum),
173 SOC_SINGLE("Validity Bit Control Switch", CS4265_SPDIF_CTL2,
174 3, 1, 0),
175 SOC_ENUM("SPDIF Mono/Stereo", spdif_mono_stereo_enum),
176 SOC_SINGLE("MMTLR Data Switch", 0,
177 1, 1, 0),
178 SOC_ENUM("Mono Channel Select", spdif_mono_select_enum),
179 SND_SOC_BYTES("C Data Buffer", CS4265_C_DATA_BUFF, 24),
180};
181
182static const struct snd_soc_dapm_widget cs4265_dapm_widgets[] = {
183
184 SND_SOC_DAPM_INPUT("LINEINL"),
185 SND_SOC_DAPM_INPUT("LINEINR"),
186 SND_SOC_DAPM_INPUT("MICL"),
187 SND_SOC_DAPM_INPUT("MICR"),
188
189 SND_SOC_DAPM_AIF_OUT("DOUT", NULL, 0,
190 SND_SOC_NOPM, 0, 0),
191 SND_SOC_DAPM_AIF_OUT("SPDIFOUT", NULL, 0,
192 SND_SOC_NOPM, 0, 0),
193
194 SND_SOC_DAPM_MUX("ADC Mux", SND_SOC_NOPM, 0, 0, &mic_linein_mux),
195
196 SND_SOC_DAPM_ADC("ADC", NULL, CS4265_PWRCTL, 2, 1),
197 SND_SOC_DAPM_PGA("Pre-amp MIC", CS4265_PWRCTL, 3,
198 1, NULL, 0),
199
200 SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM,
201 0, 0, &digital_input_mux),
202
203 SND_SOC_DAPM_MIXER("SDIN1 Input Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
204 SND_SOC_DAPM_MIXER("SDIN2 Input Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
205 SND_SOC_DAPM_MIXER("SPDIF Transmitter", SND_SOC_NOPM, 0, 0, NULL, 0),
206
207 SND_SOC_DAPM_SWITCH("Loopback", SND_SOC_NOPM, 0, 0,
208 &loopback_ctl),
209 SND_SOC_DAPM_SWITCH("SPDIF", SND_SOC_NOPM, 0, 0,
210 &spdif_switch),
211 SND_SOC_DAPM_SWITCH("DAC", CS4265_PWRCTL, 1, 1,
212 &dac_switch),
213
214 SND_SOC_DAPM_AIF_IN("DIN1", NULL, 0,
215 SND_SOC_NOPM, 0, 0),
216 SND_SOC_DAPM_AIF_IN("DIN2", NULL, 0,
217 SND_SOC_NOPM, 0, 0),
218 SND_SOC_DAPM_AIF_IN("TXIN", NULL, 0,
219 CS4265_SPDIF_CTL2, 5, 1),
220
221 SND_SOC_DAPM_OUTPUT("LINEOUTL"),
222 SND_SOC_DAPM_OUTPUT("LINEOUTR"),
223
224};
225
226static const struct snd_soc_dapm_route cs4265_audio_map[] = {
227
228 {"DIN1", NULL, "DAI1 Playback"},
229 {"DIN2", NULL, "DAI2 Playback"},
230 {"SDIN1 Input Mixer", NULL, "DIN1"},
231 {"SDIN2 Input Mixer", NULL, "DIN2"},
232 {"Input Mux", "SDIN1", "SDIN1 Input Mixer"},
233 {"Input Mux", "SDIN2", "SDIN2 Input Mixer"},
234 {"DAC", "Switch", "Input Mux"},
235 {"SPDIF", "Switch", "Input Mux"},
236 {"LINEOUTL", NULL, "DAC"},
237 {"LINEOUTR", NULL, "DAC"},
238 {"SPDIFOUT", NULL, "SPDIF"},
239
240 {"ADC Mux", "LINEIN", "LINEINL"},
241 {"ADC Mux", "LINEIN", "LINEINR"},
242 {"ADC Mux", "MIC", "MICL"},
243 {"ADC Mux", "MIC", "MICR"},
244 {"ADC", NULL, "ADC Mux"},
245 {"DOUT", NULL, "ADC"},
246 {"DAI1 Capture", NULL, "DOUT"},
247 {"DAI2 Capture", NULL, "DOUT"},
248
249 /* Loopback */
250 {"Loopback", "Switch", "ADC"},
251 {"DAC", NULL, "Loopback"},
252};
253
254struct cs4265_clk_para {
255 u32 mclk;
256 u32 rate;
257 u8 fm_mode; /* values 1, 2, or 4 */
258 u8 mclkdiv;
259};
260
261static const struct cs4265_clk_para clk_map_table[] = {
262 /*32k*/
263 {8192000, 32000, 0, 0},
264 {12288000, 32000, 0, 1},
265 {16384000, 32000, 0, 2},
266 {24576000, 32000, 0, 3},
267 {32768000, 32000, 0, 4},
268
269 /*44.1k*/
270 {11289600, 44100, 0, 0},
271 {16934400, 44100, 0, 1},
272 {22579200, 44100, 0, 2},
273 {33868000, 44100, 0, 3},
274 {45158400, 44100, 0, 4},
275
276 /*48k*/
277 {12288000, 48000, 0, 0},
278 {18432000, 48000, 0, 1},
279 {24576000, 48000, 0, 2},
280 {36864000, 48000, 0, 3},
281 {49152000, 48000, 0, 4},
282
283 /*64k*/
284 {8192000, 64000, 1, 0},
285 {1228800, 64000, 1, 1},
286 {1693440, 64000, 1, 2},
287 {2457600, 64000, 1, 3},
288 {3276800, 64000, 1, 4},
289
290 /* 88.2k */
291 {11289600, 88200, 1, 0},
292 {16934400, 88200, 1, 1},
293 {22579200, 88200, 1, 2},
294 {33868000, 88200, 1, 3},
295 {45158400, 88200, 1, 4},
296
297 /* 96k */
298 {12288000, 96000, 1, 0},
299 {18432000, 96000, 1, 1},
300 {24576000, 96000, 1, 2},
301 {36864000, 96000, 1, 3},
302 {49152000, 96000, 1, 4},
303
304 /* 128k */
305 {8192000, 128000, 2, 0},
306 {12288000, 128000, 2, 1},
307 {16934400, 128000, 2, 2},
308 {24576000, 128000, 2, 3},
309 {32768000, 128000, 2, 4},
310
311 /* 176.4k */
312 {11289600, 176400, 2, 0},
313 {16934400, 176400, 2, 1},
314 {22579200, 176400, 2, 2},
315 {33868000, 176400, 2, 3},
316 {49152000, 176400, 2, 4},
317
318 /* 192k */
319 {12288000, 192000, 2, 0},
320 {18432000, 192000, 2, 1},
321 {24576000, 192000, 2, 2},
322 {36864000, 192000, 2, 3},
323 {49152000, 192000, 2, 4},
324};
325
326static int cs4265_get_clk_index(int mclk, int rate)
327{
328 int i;
329
330 for (i = 0; i < ARRAY_SIZE(clk_map_table); i++) {
331 if (clk_map_table[i].rate == rate &&
332 clk_map_table[i].mclk == mclk)
333 return i;
334 }
335 return -EINVAL;
336}
337
338static int cs4265_set_sysclk(struct snd_soc_dai *codec_dai, int clk_id,
339 unsigned int freq, int dir)
340{
341 struct snd_soc_codec *codec = codec_dai->codec;
342 struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec);
343 int i;
344
345 if (clk_id != 0) {
346 dev_err(codec->dev, "Invalid clk_id %d\n", clk_id);
347 return -EINVAL;
348 }
349 for (i = 0; i < ARRAY_SIZE(clk_map_table); i++) {
350 if (clk_map_table[i].mclk == freq) {
351 cs4265->sysclk = freq;
352 return 0;
353 }
354 }
355 cs4265->sysclk = 0;
356 dev_err(codec->dev, "Invalid freq parameter %d\n", freq);
357 return -EINVAL;
358}
359
360static int cs4265_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
361{
362 struct snd_soc_codec *codec = codec_dai->codec;
363 struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec);
364 u8 iface = 0;
365
366 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
367 case SND_SOC_DAIFMT_CBM_CFM:
368 snd_soc_update_bits(codec, CS4265_ADC_CTL,
369 CS4265_ADC_MASTER,
370 CS4265_ADC_MASTER);
371 break;
372 case SND_SOC_DAIFMT_CBS_CFS:
373 snd_soc_update_bits(codec, CS4265_ADC_CTL,
374 CS4265_ADC_MASTER,
375 0);
376 break;
377 default:
378 return -EINVAL;
379 }
380
381 /* interface format */
382 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
383 case SND_SOC_DAIFMT_I2S:
384 iface |= SND_SOC_DAIFMT_I2S;
385 break;
386 case SND_SOC_DAIFMT_RIGHT_J:
387 iface |= SND_SOC_DAIFMT_RIGHT_J;
388 break;
389 case SND_SOC_DAIFMT_LEFT_J:
390 iface |= SND_SOC_DAIFMT_LEFT_J;
391 break;
392 default:
393 return -EINVAL;
394 }
395
396 cs4265->format = iface;
397 return 0;
398}
399
400static int cs4265_digital_mute(struct snd_soc_dai *dai, int mute)
401{
402 struct snd_soc_codec *codec = dai->codec;
403
404 if (mute) {
405 snd_soc_update_bits(codec, CS4265_DAC_CTL,
406 CS4265_DAC_CTL_MUTE,
407 CS4265_DAC_CTL_MUTE);
408 snd_soc_update_bits(codec, CS4265_SPDIF_CTL2,
409 CS4265_SPDIF_CTL2_MUTE,
410 CS4265_SPDIF_CTL2_MUTE);
411 } else {
412 snd_soc_update_bits(codec, CS4265_DAC_CTL,
413 CS4265_DAC_CTL_MUTE,
414 0);
415 snd_soc_update_bits(codec, CS4265_SPDIF_CTL2,
416 CS4265_SPDIF_CTL2_MUTE,
417 0);
418 }
419 return 0;
420}
421
422static int cs4265_pcm_hw_params(struct snd_pcm_substream *substream,
423 struct snd_pcm_hw_params *params,
424 struct snd_soc_dai *dai)
425{
426 struct snd_soc_codec *codec = dai->codec;
427 struct cs4265_private *cs4265 = snd_soc_codec_get_drvdata(codec);
428 int index;
429
430 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
431 ((cs4265->format & SND_SOC_DAIFMT_FORMAT_MASK)
432 == SND_SOC_DAIFMT_RIGHT_J))
433 return -EINVAL;
434
435 index = cs4265_get_clk_index(cs4265->sysclk, params_rate(params));
436 if (index >= 0) {
437 snd_soc_update_bits(codec, CS4265_ADC_CTL,
438 CS4265_ADC_FM, clk_map_table[index].fm_mode);
439 snd_soc_update_bits(codec, CS4265_MCLK_FREQ,
440 CS4265_MCLK_FREQ_MASK,
441 clk_map_table[index].mclkdiv);
442
443 } else {
444 dev_err(codec->dev, "can't get correct mclk\n");
445 return -EINVAL;
446 }
447
448 switch (cs4265->format & SND_SOC_DAIFMT_FORMAT_MASK) {
449 case SND_SOC_DAIFMT_I2S:
450 snd_soc_update_bits(codec, CS4265_DAC_CTL,
451 CS4265_DAC_CTL_DIF, (1 << 4));
452 snd_soc_update_bits(codec, CS4265_ADC_CTL,
453 CS4265_ADC_DIF, (1 << 4));
454 snd_soc_update_bits(codec, CS4265_SPDIF_CTL2,
455 CS4265_SPDIF_CTL2_DIF, (1 << 6));
456 break;
457 case SND_SOC_DAIFMT_RIGHT_J:
458 if (params_width(params) == 16) {
459 snd_soc_update_bits(codec, CS4265_DAC_CTL,
460 CS4265_DAC_CTL_DIF, (1 << 5));
461 snd_soc_update_bits(codec, CS4265_ADC_CTL,
462 CS4265_SPDIF_CTL2_DIF, (1 << 7));
463 } else {
464 snd_soc_update_bits(codec, CS4265_DAC_CTL,
465 CS4265_DAC_CTL_DIF, (3 << 5));
466 snd_soc_update_bits(codec, CS4265_ADC_CTL,
467 CS4265_SPDIF_CTL2_DIF, (1 << 7));
468 }
469 break;
470 case SND_SOC_DAIFMT_LEFT_J:
471 snd_soc_update_bits(codec, CS4265_DAC_CTL,
472 CS4265_DAC_CTL_DIF, 0);
473 snd_soc_update_bits(codec, CS4265_ADC_CTL,
474 CS4265_ADC_DIF, 0);
475 snd_soc_update_bits(codec, CS4265_ADC_CTL,
476 CS4265_SPDIF_CTL2_DIF, (1 << 6));
477
478 break;
479 default:
480 return -EINVAL;
481 }
482 return 0;
483}
484
485static int cs4265_set_bias_level(struct snd_soc_codec *codec,
486 enum snd_soc_bias_level level)
487{
488 switch (level) {
489 case SND_SOC_BIAS_ON:
490 break;
491 case SND_SOC_BIAS_PREPARE:
492 snd_soc_update_bits(codec, CS4265_PWRCTL,
493 CS4265_PWRCTL_PDN, 0);
494 break;
495 case SND_SOC_BIAS_STANDBY:
496 snd_soc_update_bits(codec, CS4265_PWRCTL,
497 CS4265_PWRCTL_PDN,
498 CS4265_PWRCTL_PDN);
499 break;
500 case SND_SOC_BIAS_OFF:
501 snd_soc_update_bits(codec, CS4265_PWRCTL,
502 CS4265_PWRCTL_PDN,
503 CS4265_PWRCTL_PDN);
504 break;
505 }
506 codec->dapm.bias_level = level;
507 return 0;
508}
509
510#define CS4265_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
511 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \
512 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
513 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000)
514
515#define CS4265_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE | \
516 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U24_LE)
517
518static const struct snd_soc_dai_ops cs4265_ops = {
519 .hw_params = cs4265_pcm_hw_params,
520 .digital_mute = cs4265_digital_mute,
521 .set_fmt = cs4265_set_fmt,
522 .set_sysclk = cs4265_set_sysclk,
523};
524
525static struct snd_soc_dai_driver cs4265_dai[] = {
526 {
527 .name = "cs4265-dai1",
528 .playback = {
529 .stream_name = "DAI1 Playback",
530 .channels_min = 1,
531 .channels_max = 2,
532 .rates = CS4265_RATES,
533 .formats = CS4265_FORMATS,
534 },
535 .capture = {
536 .stream_name = "DAI1 Capture",
537 .channels_min = 1,
538 .channels_max = 2,
539 .rates = CS4265_RATES,
540 .formats = CS4265_FORMATS,
541 },
542 .ops = &cs4265_ops,
543 },
544 {
545 .name = "cs4265-dai2",
546 .playback = {
547 .stream_name = "DAI2 Playback",
548 .channels_min = 1,
549 .channels_max = 2,
550 .rates = CS4265_RATES,
551 .formats = CS4265_FORMATS,
552 },
553 .capture = {
554 .stream_name = "DAI2 Capture",
555 .channels_min = 1,
556 .channels_max = 2,
557 .rates = CS4265_RATES,
558 .formats = CS4265_FORMATS,
559 },
560 .ops = &cs4265_ops,
561 },
562};
563
564static const struct snd_soc_codec_driver soc_codec_cs4265 = {
565 .set_bias_level = cs4265_set_bias_level,
566
567 .dapm_widgets = cs4265_dapm_widgets,
568 .num_dapm_widgets = ARRAY_SIZE(cs4265_dapm_widgets),
569 .dapm_routes = cs4265_audio_map,
570 .num_dapm_routes = ARRAY_SIZE(cs4265_audio_map),
571
572 .controls = cs4265_snd_controls,
573 .num_controls = ARRAY_SIZE(cs4265_snd_controls),
574};
575
576static const struct regmap_config cs4265_regmap = {
577 .reg_bits = 8,
578 .val_bits = 8,
579
580 .max_register = CS4265_MAX_REGISTER,
581 .reg_defaults = cs4265_reg_defaults,
582 .num_reg_defaults = ARRAY_SIZE(cs4265_reg_defaults),
583 .readable_reg = cs4265_readable_register,
584 .volatile_reg = cs4265_volatile_register,
585 .cache_type = REGCACHE_RBTREE,
586};
587
588static int cs4265_i2c_probe(struct i2c_client *i2c_client,
589 const struct i2c_device_id *id)
590{
591 struct cs4265_private *cs4265;
592 int ret = 0;
593 unsigned int devid = 0;
594 unsigned int reg;
595
596 cs4265 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs4265_private),
597 GFP_KERNEL);
598 if (cs4265 == NULL)
599 return -ENOMEM;
600 cs4265->dev = &i2c_client->dev;
601
602 cs4265->regmap = devm_regmap_init_i2c(i2c_client, &cs4265_regmap);
603 if (IS_ERR(cs4265->regmap)) {
604 ret = PTR_ERR(cs4265->regmap);
605 dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret);
606 return ret;
607 }
608
609 cs4265->reset_gpio = devm_gpiod_get(&i2c_client->dev,
610 "reset-gpios");
611 if (IS_ERR(cs4265->reset_gpio)) {
612 ret = PTR_ERR(cs4265->reset_gpio);
613 if (ret != -ENOENT && ret != -ENOSYS)
614 return ret;
615
616 cs4265->reset_gpio = NULL;
617 } else {
618 ret = gpiod_direction_output(cs4265->reset_gpio, 0);
619 if (ret)
620 return ret;
621 mdelay(1);
622 gpiod_set_value_cansleep(cs4265->reset_gpio, 1);
623
624 }
625
626 i2c_set_clientdata(i2c_client, cs4265);
627
628 ret = regmap_read(cs4265->regmap, CS4265_CHIP_ID, &reg);
629 devid = reg & CS4265_CHIP_ID_MASK;
630 if (devid != CS4265_CHIP_ID_VAL) {
631 ret = -ENODEV;
632 dev_err(&i2c_client->dev,
633 "CS4265 Device ID (%X). Expected %X\n",
634 devid, CS4265_CHIP_ID);
635 return ret;
636 }
637 dev_info(&i2c_client->dev,
638 "CS4265 Version %x\n",
639 reg & CS4265_REV_ID_MASK);
640
641 regmap_write(cs4265->regmap, CS4265_PWRCTL, 0x0F);
642
643 ret = snd_soc_register_codec(&i2c_client->dev,
644 &soc_codec_cs4265, cs4265_dai,
645 ARRAY_SIZE(cs4265_dai));
646 return ret;
647}
648
649static int cs4265_i2c_remove(struct i2c_client *client)
650{
651 snd_soc_unregister_codec(&client->dev);
652 return 0;
653}
654
655static const struct of_device_id cs4265_of_match[] = {
656 { .compatible = "cirrus,cs4265", },
657 { }
658};
659MODULE_DEVICE_TABLE(of, cs4265_of_match);
660
661static const struct i2c_device_id cs4265_id[] = {
662 { "cs4265", 0 },
663 { }
664};
665MODULE_DEVICE_TABLE(i2c, cs4265_id);
666
667static struct i2c_driver cs4265_i2c_driver = {
668 .driver = {
669 .name = "cs4265",
670 .owner = THIS_MODULE,
671 .of_match_table = cs4265_of_match,
672 },
673 .id_table = cs4265_id,
674 .probe = cs4265_i2c_probe,
675 .remove = cs4265_i2c_remove,
676};
677
678module_i2c_driver(cs4265_i2c_driver);
679
680MODULE_DESCRIPTION("ASoC CS4265 driver");
681MODULE_AUTHOR("Paul Handrigan, Cirrus Logic Inc, <paul.handrigan@cirrus.com>");
682MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/cs4265.h b/sound/soc/codecs/cs4265.h
new file mode 100644
index 000000000000..0a80a8dcec67
--- /dev/null
+++ b/sound/soc/codecs/cs4265.h
@@ -0,0 +1,64 @@
1/*
2 * cs4265.h -- CS4265 ALSA SoC audio driver
3 *
4 * Copyright 2014 Cirrus Logic, Inc.
5 *
6 * Author: Paul Handrigan <paul.handrigan@cirrus.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#ifndef __CS4265_H__
15#define __CS4265_H__
16
17#define CS4265_CHIP_ID 0x1
18#define CS4265_CHIP_ID_VAL 0xD0
19#define CS4265_CHIP_ID_MASK 0xF0
20#define CS4265_REV_ID_MASK 0x0F
21
22#define CS4265_PWRCTL 0x02
23#define CS4265_PWRCTL_PDN 1
24
25#define CS4265_DAC_CTL 0x3
26#define CS4265_DAC_CTL_MUTE (1 << 2)
27#define CS4265_DAC_CTL_DIF (3 << 4)
28
29#define CS4265_ADC_CTL 0x4
30#define CS4265_ADC_MASTER 1
31#define CS4265_ADC_DIF (1 << 4)
32#define CS4265_ADC_FM (3 << 6)
33
34#define CS4265_MCLK_FREQ 0x5
35#define CS4265_MCLK_FREQ_MASK (7 << 4)
36
37#define CS4265_SIG_SEL 0x6
38#define CS4265_SIG_SEL_LOOP (1 << 1)
39
40#define CS4265_CHB_PGA_CTL 0x7
41#define CS4265_CHA_PGA_CTL 0x8
42
43#define CS4265_ADC_CTL2 0x9
44
45#define CS4265_DAC_CHA_VOL 0xA
46#define CS4265_DAC_CHB_VOL 0xB
47
48#define CS4265_DAC_CTL2 0xC
49
50#define CS4265_INT_STATUS 0xD
51#define CS4265_INT_MASK 0xE
52#define CS4265_STATUS_MODE_MSB 0xF
53#define CS4265_STATUS_MODE_LSB 0x10
54
55#define CS4265_SPDIF_CTL1 0x11
56
57#define CS4265_SPDIF_CTL2 0x12
58#define CS4265_SPDIF_CTL2_MUTE (1 << 4)
59#define CS4265_SPDIF_CTL2_DIF (3 << 6)
60
61#define CS4265_C_DATA_BUFF 0x13
62#define CS4265_MAX_REGISTER 0x2A
63
64#endif
diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c
index 9947a9583679..e6d4ff9fd992 100644
--- a/sound/soc/codecs/cs4270.c
+++ b/sound/soc/codecs/cs4270.c
@@ -664,10 +664,8 @@ static int cs4270_i2c_probe(struct i2c_client *i2c_client,
664 664
665 cs4270 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs4270_private), 665 cs4270 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs4270_private),
666 GFP_KERNEL); 666 GFP_KERNEL);
667 if (!cs4270) { 667 if (!cs4270)
668 dev_err(&i2c_client->dev, "could not allocate codec\n");
669 return -ENOMEM; 668 return -ENOMEM;
670 }
671 669
672 /* get the power supply regulators */ 670 /* get the power supply regulators */
673 for (i = 0; i < ARRAY_SIZE(supply_names); i++) 671 for (i = 0; i < ARRAY_SIZE(supply_names); i++)
diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c
index 071fc77f2f06..969167d8b71e 100644
--- a/sound/soc/codecs/cs42l52.c
+++ b/sound/soc/codecs/cs42l52.c
@@ -399,15 +399,15 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
399 CS42L52_MASTERB_VOL, 0, 0x34, 0xE4, hl_tlv), 399 CS42L52_MASTERB_VOL, 0, 0x34, 0xE4, hl_tlv),
400 400
401 SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L52_HPA_VOL, 401 SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L52_HPA_VOL,
402 CS42L52_HPB_VOL, 0, 0x34, 0xCC, hpd_tlv), 402 CS42L52_HPB_VOL, 0, 0x34, 0xC0, hpd_tlv),
403 403
404 SOC_ENUM("Headphone Analog Gain", hp_gain_enum), 404 SOC_ENUM("Headphone Analog Gain", hp_gain_enum),
405 405
406 SOC_DOUBLE_R_SX_TLV("Speaker Volume", CS42L52_SPKA_VOL, 406 SOC_DOUBLE_R_SX_TLV("Speaker Volume", CS42L52_SPKA_VOL,
407 CS42L52_SPKB_VOL, 0, 0x1, 0xff, hl_tlv), 407 CS42L52_SPKB_VOL, 0, 0x40, 0xC0, hl_tlv),
408 408
409 SOC_DOUBLE_R_SX_TLV("Bypass Volume", CS42L52_PASSTHRUA_VOL, 409 SOC_DOUBLE_R_SX_TLV("Bypass Volume", CS42L52_PASSTHRUA_VOL,
410 CS42L52_PASSTHRUB_VOL, 6, 0x18, 0x90, pga_tlv), 410 CS42L52_PASSTHRUB_VOL, 0, 0x88, 0x90, pga_tlv),
411 411
412 SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0), 412 SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0),
413 413
@@ -417,10 +417,10 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
417 SOC_ENUM("MIC Bias Level", mic_bias_level_enum), 417 SOC_ENUM("MIC Bias Level", mic_bias_level_enum),
418 418
419 SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L52_ADCA_VOL, 419 SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L52_ADCA_VOL,
420 CS42L52_ADCB_VOL, 7, 0x80, 0xA0, ipd_tlv), 420 CS42L52_ADCB_VOL, 0, 0xA0, 0x78, ipd_tlv),
421 SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", 421 SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume",
422 CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL, 422 CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL,
423 6, 0x7f, 0x19, ipd_tlv), 423 0, 0x19, 0x7F, ipd_tlv),
424 424
425 SOC_DOUBLE("ADC Switch", CS42L52_ADC_MISC_CTL, 0, 1, 1, 0), 425 SOC_DOUBLE("ADC Switch", CS42L52_ADC_MISC_CTL, 0, 1, 1, 0),
426 426
@@ -428,11 +428,11 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
428 CS42L52_ADCB_MIXER_VOL, 7, 1, 1), 428 CS42L52_ADCB_MIXER_VOL, 7, 1, 1),
429 429
430 SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L52_PGAA_CTL, 430 SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L52_PGAA_CTL,
431 CS42L52_PGAB_CTL, 0, 0x28, 0x30, pga_tlv), 431 CS42L52_PGAB_CTL, 0, 0x28, 0x24, pga_tlv),
432 432
433 SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", 433 SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume",
434 CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 434 CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL,
435 0, 0x7f, 0x19, mix_tlv), 435 0, 0x19, 0x7f, mix_tlv),
436 SOC_DOUBLE_R("PCM Mixer Switch", 436 SOC_DOUBLE_R("PCM Mixer Switch",
437 CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1), 437 CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1),
438 438
diff --git a/sound/soc/codecs/cs42l56.c b/sound/soc/codecs/cs42l56.c
index 8e68ef5de849..c766a5a9ce80 100644
--- a/sound/soc/codecs/cs42l56.c
+++ b/sound/soc/codecs/cs42l56.c
@@ -318,24 +318,32 @@ static const struct soc_enum adca_swap_enum =
318 ARRAY_SIZE(left_swap_text), 318 ARRAY_SIZE(left_swap_text),
319 left_swap_text, 319 left_swap_text,
320 swap_values); 320 swap_values);
321static const struct snd_kcontrol_new adca_swap_mux =
322 SOC_DAPM_ENUM("Route", adca_swap_enum);
321 323
322static const struct soc_enum pcma_swap_enum = 324static const struct soc_enum pcma_swap_enum =
323 SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 4, 3, 325 SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 4, 3,
324 ARRAY_SIZE(left_swap_text), 326 ARRAY_SIZE(left_swap_text),
325 left_swap_text, 327 left_swap_text,
326 swap_values); 328 swap_values);
329static const struct snd_kcontrol_new pcma_swap_mux =
330 SOC_DAPM_ENUM("Route", pcma_swap_enum);
327 331
328static const struct soc_enum adcb_swap_enum = 332static const struct soc_enum adcb_swap_enum =
329 SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 2, 3, 333 SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 2, 3,
330 ARRAY_SIZE(right_swap_text), 334 ARRAY_SIZE(right_swap_text),
331 right_swap_text, 335 right_swap_text,
332 swap_values); 336 swap_values);
337static const struct snd_kcontrol_new adcb_swap_mux =
338 SOC_DAPM_ENUM("Route", adcb_swap_enum);
333 339
334static const struct soc_enum pcmb_swap_enum = 340static const struct soc_enum pcmb_swap_enum =
335 SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 6, 3, 341 SOC_VALUE_ENUM_SINGLE(CS42L56_CHAN_MIX_SWAP, 6, 3,
336 ARRAY_SIZE(right_swap_text), 342 ARRAY_SIZE(right_swap_text),
337 right_swap_text, 343 right_swap_text,
338 swap_values); 344 swap_values);
345static const struct snd_kcontrol_new pcmb_swap_mux =
346 SOC_DAPM_ENUM("Route", pcmb_swap_enum);
339 347
340static const struct snd_kcontrol_new hpa_switch = 348static const struct snd_kcontrol_new hpa_switch =
341 SOC_DAPM_SINGLE("Switch", CS42L56_PWRCTL_2, 6, 1, 1); 349 SOC_DAPM_SINGLE("Switch", CS42L56_PWRCTL_2, 6, 1, 1);
@@ -421,15 +429,15 @@ static const struct soc_enum ng_delay_enum =
421static const struct snd_kcontrol_new cs42l56_snd_controls[] = { 429static const struct snd_kcontrol_new cs42l56_snd_controls[] = {
422 430
423 SOC_DOUBLE_R_SX_TLV("Master Volume", CS42L56_MASTER_A_VOLUME, 431 SOC_DOUBLE_R_SX_TLV("Master Volume", CS42L56_MASTER_A_VOLUME,
424 CS42L56_MASTER_B_VOLUME, 0, 0x34, 0xfd, adv_tlv), 432 CS42L56_MASTER_B_VOLUME, 0, 0x34, 0xE4, adv_tlv),
425 SOC_DOUBLE("Master Mute Switch", CS42L56_DSP_MUTE_CTL, 0, 1, 1, 1), 433 SOC_DOUBLE("Master Mute Switch", CS42L56_DSP_MUTE_CTL, 0, 1, 1, 1),
426 434
427 SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", CS42L56_ADCA_MIX_VOLUME, 435 SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", CS42L56_ADCA_MIX_VOLUME,
428 CS42L56_ADCB_MIX_VOLUME, 0, 0x88, 0xa9, hl_tlv), 436 CS42L56_ADCB_MIX_VOLUME, 0, 0x88, 0x90, hl_tlv),
429 SOC_DOUBLE("ADC Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 6, 7, 1, 1), 437 SOC_DOUBLE("ADC Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 6, 7, 1, 1),
430 438
431 SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", CS42L56_PCMA_MIX_VOLUME, 439 SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", CS42L56_PCMA_MIX_VOLUME,
432 CS42L56_PCMB_MIX_VOLUME, 0, 0x88, 0xa9, hl_tlv), 440 CS42L56_PCMB_MIX_VOLUME, 0, 0x88, 0x90, hl_tlv),
433 SOC_DOUBLE("PCM Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 4, 5, 1, 1), 441 SOC_DOUBLE("PCM Mixer Mute Switch", CS42L56_DSP_MUTE_CTL, 4, 5, 1, 1),
434 442
435 SOC_SINGLE_TLV("Analog Advisory Volume", 443 SOC_SINGLE_TLV("Analog Advisory Volume",
@@ -438,16 +446,16 @@ static const struct snd_kcontrol_new cs42l56_snd_controls[] = {
438 CS42L56_DIGINPUT_ADV_VOLUME, 0, 0x00, 1, adv_tlv), 446 CS42L56_DIGINPUT_ADV_VOLUME, 0, 0x00, 1, adv_tlv),
439 447
440 SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L56_PGAA_MUX_VOLUME, 448 SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L56_PGAA_MUX_VOLUME,
441 CS42L56_PGAB_MUX_VOLUME, 0, 0x34, 0xfd, pga_tlv), 449 CS42L56_PGAB_MUX_VOLUME, 0, 0x34, 0x24, pga_tlv),
442 SOC_DOUBLE_R_TLV("ADC Volume", CS42L56_ADCA_ATTENUATOR, 450 SOC_DOUBLE_R_TLV("ADC Volume", CS42L56_ADCA_ATTENUATOR,
443 CS42L56_ADCB_ATTENUATOR, 0, 0x00, 1, adc_tlv), 451 CS42L56_ADCB_ATTENUATOR, 0, 0x00, 1, adc_tlv),
444 SOC_DOUBLE("ADC Mute Switch", CS42L56_MISC_ADC_CTL, 2, 3, 1, 1), 452 SOC_DOUBLE("ADC Mute Switch", CS42L56_MISC_ADC_CTL, 2, 3, 1, 1),
445 SOC_DOUBLE("ADC Boost Switch", CS42L56_GAIN_BIAS_CTL, 3, 2, 1, 1), 453 SOC_DOUBLE("ADC Boost Switch", CS42L56_GAIN_BIAS_CTL, 3, 2, 1, 1),
446 454
447 SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L56_HPA_VOLUME, 455 SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L56_HPA_VOLUME,
448 CS42L56_HPB_VOLUME, 0, 0x44, 0x55, hl_tlv), 456 CS42L56_HPB_VOLUME, 0, 0x84, 0x48, hl_tlv),
449 SOC_DOUBLE_R_SX_TLV("LineOut Volume", CS42L56_LOA_VOLUME, 457 SOC_DOUBLE_R_SX_TLV("LineOut Volume", CS42L56_LOA_VOLUME,
450 CS42L56_LOB_VOLUME, 0, 0x44, 0x55, hl_tlv), 458 CS42L56_LOB_VOLUME, 0, 0x84, 0x48, hl_tlv),
451 459
452 SOC_SINGLE_TLV("Bass Shelving Volume", CS42L56_TONE_CTL, 460 SOC_SINGLE_TLV("Bass Shelving Volume", CS42L56_TONE_CTL,
453 0, 0x00, 1, tone_tlv), 461 0, 0x00, 1, tone_tlv),
@@ -467,11 +475,6 @@ static const struct snd_kcontrol_new cs42l56_snd_controls[] = {
467 SOC_SINGLE("ADCA Invert", CS42L56_MISC_ADC_CTL, 2, 1, 1), 475 SOC_SINGLE("ADCA Invert", CS42L56_MISC_ADC_CTL, 2, 1, 1),
468 SOC_SINGLE("ADCB Invert", CS42L56_MISC_ADC_CTL, 3, 1, 1), 476 SOC_SINGLE("ADCB Invert", CS42L56_MISC_ADC_CTL, 3, 1, 1),
469 477
470 SOC_ENUM("PCMA Swap", pcma_swap_enum),
471 SOC_ENUM("PCMB Swap", pcmb_swap_enum),
472 SOC_ENUM("ADCA Swap", adca_swap_enum),
473 SOC_ENUM("ADCB Swap", adcb_swap_enum),
474
475 SOC_DOUBLE("HPF Switch", CS42L56_HPF_CTL, 5, 7, 1, 1), 478 SOC_DOUBLE("HPF Switch", CS42L56_HPF_CTL, 5, 7, 1, 1),
476 SOC_DOUBLE("HPF Freeze Switch", CS42L56_HPF_CTL, 4, 6, 1, 1), 479 SOC_DOUBLE("HPF Freeze Switch", CS42L56_HPF_CTL, 4, 6, 1, 1),
477 SOC_ENUM("HPFA Corner Freq", hpfa_freq_enum), 480 SOC_ENUM("HPFA Corner Freq", hpfa_freq_enum),
@@ -570,6 +573,16 @@ static const struct snd_soc_dapm_widget cs42l56_dapm_widgets[] = {
570 SND_SOC_DAPM_ADC("ADCA", NULL, CS42L56_PWRCTL_1, 1, 1), 573 SND_SOC_DAPM_ADC("ADCA", NULL, CS42L56_PWRCTL_1, 1, 1),
571 SND_SOC_DAPM_ADC("ADCB", NULL, CS42L56_PWRCTL_1, 2, 1), 574 SND_SOC_DAPM_ADC("ADCB", NULL, CS42L56_PWRCTL_1, 2, 1),
572 575
576 SND_SOC_DAPM_MUX("ADCA Swap Mux", SND_SOC_NOPM, 0, 0,
577 &adca_swap_mux),
578 SND_SOC_DAPM_MUX("ADCB Swap Mux", SND_SOC_NOPM, 0, 0,
579 &adcb_swap_mux),
580
581 SND_SOC_DAPM_MUX("PCMA Swap Mux", SND_SOC_NOPM, 0, 0,
582 &pcma_swap_mux),
583 SND_SOC_DAPM_MUX("PCMB Swap Mux", SND_SOC_NOPM, 0, 0,
584 &pcmb_swap_mux),
585
573 SND_SOC_DAPM_DAC("DACA", NULL, SND_SOC_NOPM, 0, 0), 586 SND_SOC_DAPM_DAC("DACA", NULL, SND_SOC_NOPM, 0, 0),
574 SND_SOC_DAPM_DAC("DACB", NULL, SND_SOC_NOPM, 0, 0), 587 SND_SOC_DAPM_DAC("DACB", NULL, SND_SOC_NOPM, 0, 0),
575 588
@@ -607,8 +620,19 @@ static const struct snd_soc_dapm_route cs42l56_audio_map[] = {
607 {"Digital Output Mux", NULL, "ADCA"}, 620 {"Digital Output Mux", NULL, "ADCA"},
608 {"Digital Output Mux", NULL, "ADCB"}, 621 {"Digital Output Mux", NULL, "ADCB"},
609 622
610 {"ADCB", NULL, "ADCB Mux"}, 623 {"ADCB", NULL, "ADCB Swap Mux"},
611 {"ADCA", NULL, "ADCA Mux"}, 624 {"ADCA", NULL, "ADCA Swap Mux"},
625
626 {"ADCA Swap Mux", NULL, "ADCA"},
627 {"ADCB Swap Mux", NULL, "ADCB"},
628
629 {"DACA", "Left", "ADCA Swap Mux"},
630 {"DACA", "LR 2", "ADCA Swap Mux"},
631 {"DACA", "Right", "ADCA Swap Mux"},
632
633 {"DACB", "Left", "ADCB Swap Mux"},
634 {"DACB", "LR 2", "ADCB Swap Mux"},
635 {"DACB", "Right", "ADCB Swap Mux"},
612 636
613 {"ADCA Mux", NULL, "AIN3A"}, 637 {"ADCA Mux", NULL, "AIN3A"},
614 {"ADCA Mux", NULL, "AIN2A"}, 638 {"ADCA Mux", NULL, "AIN2A"},
@@ -633,30 +657,32 @@ static const struct snd_soc_dapm_route cs42l56_audio_map[] = {
633 {"PGAB Input Mux", NULL, "AIN2B"}, 657 {"PGAB Input Mux", NULL, "AIN2B"},
634 {"PGAB Input Mux", NULL, "AIN3B"}, 658 {"PGAB Input Mux", NULL, "AIN3B"},
635 659
636 {"LOB", NULL, "Lineout Right"}, 660 {"LOB", "Switch", "LINEOUTB Input Mux"},
637 {"LOA", NULL, "Lineout Left"}, 661 {"LOA", "Switch", "LINEOUTA Input Mux"},
638
639 {"Lineout Right", "Switch", "LINEOUTB Input Mux"},
640 {"Lineout Left", "Switch", "LINEOUTA Input Mux"},
641 662
642 {"LINEOUTA Input Mux", "PGAA", "PGAA"}, 663 {"LINEOUTA Input Mux", "PGAA", "PGAA"},
643 {"LINEOUTB Input Mux", "PGAB", "PGAB"}, 664 {"LINEOUTB Input Mux", "PGAB", "PGAB"},
644 {"LINEOUTA Input Mux", "DACA", "DACA"}, 665 {"LINEOUTA Input Mux", "DACA", "DACA"},
645 {"LINEOUTB Input Mux", "DACB", "DACB"}, 666 {"LINEOUTB Input Mux", "DACB", "DACB"},
646 667
647 {"HPA", NULL, "Headphone Left"}, 668 {"HPA", "Switch", "HPB Input Mux"},
648 {"HPB", NULL, "Headphone Right"}, 669 {"HPB", "Switch", "HPA Input Mux"},
649
650 {"Headphone Right", "Switch", "HPB Input Mux"},
651 {"Headphone Left", "Switch", "HPA Input Mux"},
652 670
653 {"HPA Input Mux", "PGAA", "PGAA"}, 671 {"HPA Input Mux", "PGAA", "PGAA"},
654 {"HPB Input Mux", "PGAB", "PGAB"}, 672 {"HPB Input Mux", "PGAB", "PGAB"},
655 {"HPA Input Mux", "DACA", "DACA"}, 673 {"HPA Input Mux", "DACA", "DACA"},
656 {"HPB Input Mux", "DACB", "DACB"}, 674 {"HPB Input Mux", "DACB", "DACB"},
657 675
658 {"DACB", NULL, "HiFi Playback"}, 676 {"DACA", NULL, "PCMA Swap Mux"},
659 {"DACA", NULL, "HiFi Playback"}, 677 {"DACB", NULL, "PCMB Swap Mux"},
678
679 {"PCMB Swap Mux", "Left", "HiFi Playback"},
680 {"PCMB Swap Mux", "LR 2", "HiFi Playback"},
681 {"PCMB Swap Mux", "Right", "HiFi Playback"},
682
683 {"PCMA Swap Mux", "Left", "HiFi Playback"},
684 {"PCMA Swap Mux", "LR 2", "HiFi Playback"},
685 {"PCMA Swap Mux", "Right", "HiFi Playback"},
660 686
661}; 687};
662 688
diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c
index ae3717992d56..0e7b9eb2ba61 100644
--- a/sound/soc/codecs/cs42l73.c
+++ b/sound/soc/codecs/cs42l73.c
@@ -401,7 +401,7 @@ static const struct snd_kcontrol_new cs42l73_snd_controls[] = {
401 CS42L73_LOBAVOL, 0, 0x41, 0x4B, hpaloa_tlv), 401 CS42L73_LOBAVOL, 0, 0x41, 0x4B, hpaloa_tlv),
402 402
403 SOC_DOUBLE_R_SX_TLV("Input PGA Analog Volume", CS42L73_MICAPREPGAAVOL, 403 SOC_DOUBLE_R_SX_TLV("Input PGA Analog Volume", CS42L73_MICAPREPGAAVOL,
404 CS42L73_MICBPREPGABVOL, 5, 0x34, 404 CS42L73_MICBPREPGABVOL, 0, 0x34,
405 0x24, micpga_tlv), 405 0x24, micpga_tlv),
406 406
407 SOC_DOUBLE_R("MIC Preamp Switch", CS42L73_MICAPREPGAAVOL, 407 SOC_DOUBLE_R("MIC Preamp Switch", CS42L73_MICAPREPGAAVOL,
@@ -1408,10 +1408,8 @@ static int cs42l73_i2c_probe(struct i2c_client *i2c_client,
1408 1408
1409 cs42l73 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs42l73_private), 1409 cs42l73 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs42l73_private),
1410 GFP_KERNEL); 1410 GFP_KERNEL);
1411 if (!cs42l73) { 1411 if (!cs42l73)
1412 dev_err(&i2c_client->dev, "could not allocate codec\n");
1413 return -ENOMEM; 1412 return -ENOMEM;
1414 }
1415 1413
1416 cs42l73->regmap = devm_regmap_init_i2c(i2c_client, &cs42l73_regmap); 1414 cs42l73->regmap = devm_regmap_init_i2c(i2c_client, &cs42l73_regmap);
1417 if (IS_ERR(cs42l73->regmap)) { 1415 if (IS_ERR(cs42l73->regmap)) {
diff --git a/sound/soc/codecs/cs42xx8.c b/sound/soc/codecs/cs42xx8.c
index a25bc6061a30..02b1520ae0bc 100644
--- a/sound/soc/codecs/cs42xx8.c
+++ b/sound/soc/codecs/cs42xx8.c
@@ -219,6 +219,9 @@ static int cs42xx8_set_dai_fmt(struct snd_soc_dai *codec_dai,
219 case SND_SOC_DAIFMT_RIGHT_J: 219 case SND_SOC_DAIFMT_RIGHT_J:
220 val = CS42XX8_INTF_DAC_DIF_RIGHTJ | CS42XX8_INTF_ADC_DIF_RIGHTJ; 220 val = CS42XX8_INTF_DAC_DIF_RIGHTJ | CS42XX8_INTF_ADC_DIF_RIGHTJ;
221 break; 221 break;
222 case SND_SOC_DAIFMT_DSP_A:
223 val = CS42XX8_INTF_DAC_DIF_TDM | CS42XX8_INTF_ADC_DIF_TDM;
224 break;
222 default: 225 default:
223 dev_err(codec->dev, "unsupported dai format\n"); 226 dev_err(codec->dev, "unsupported dai format\n");
224 return -EINVAL; 227 return -EINVAL;
@@ -422,7 +425,7 @@ const struct cs42xx8_driver_data cs42888_data = {
422}; 425};
423EXPORT_SYMBOL_GPL(cs42888_data); 426EXPORT_SYMBOL_GPL(cs42888_data);
424 427
425const struct of_device_id cs42xx8_of_match[] = { 428static const struct of_device_id cs42xx8_of_match[] = {
426 { .compatible = "cirrus,cs42448", .data = &cs42448_data, }, 429 { .compatible = "cirrus,cs42448", .data = &cs42448_data, },
427 { .compatible = "cirrus,cs42888", .data = &cs42888_data, }, 430 { .compatible = "cirrus,cs42888", .data = &cs42888_data, },
428 { /* sentinel */ } 431 { /* sentinel */ }
diff --git a/sound/soc/codecs/cs42xx8.h b/sound/soc/codecs/cs42xx8.h
index da0b94aee419..b2c10e537ef6 100644
--- a/sound/soc/codecs/cs42xx8.h
+++ b/sound/soc/codecs/cs42xx8.h
@@ -128,8 +128,8 @@ int cs42xx8_probe(struct device *dev, struct regmap *regmap);
128#define CS42XX8_INTF_DAC_DIF_RIGHTJ (2 << CS42XX8_INTF_DAC_DIF_SHIFT) 128#define CS42XX8_INTF_DAC_DIF_RIGHTJ (2 << CS42XX8_INTF_DAC_DIF_SHIFT)
129#define CS42XX8_INTF_DAC_DIF_RIGHTJ_16 (3 << CS42XX8_INTF_DAC_DIF_SHIFT) 129#define CS42XX8_INTF_DAC_DIF_RIGHTJ_16 (3 << CS42XX8_INTF_DAC_DIF_SHIFT)
130#define CS42XX8_INTF_DAC_DIF_ONELINE_20 (4 << CS42XX8_INTF_DAC_DIF_SHIFT) 130#define CS42XX8_INTF_DAC_DIF_ONELINE_20 (4 << CS42XX8_INTF_DAC_DIF_SHIFT)
131#define CS42XX8_INTF_DAC_DIF_ONELINE_24 (6 << CS42XX8_INTF_DAC_DIF_SHIFT) 131#define CS42XX8_INTF_DAC_DIF_ONELINE_24 (5 << CS42XX8_INTF_DAC_DIF_SHIFT)
132#define CS42XX8_INTF_DAC_DIF_TDM (7 << CS42XX8_INTF_DAC_DIF_SHIFT) 132#define CS42XX8_INTF_DAC_DIF_TDM (6 << CS42XX8_INTF_DAC_DIF_SHIFT)
133#define CS42XX8_INTF_ADC_DIF_SHIFT 0 133#define CS42XX8_INTF_ADC_DIF_SHIFT 0
134#define CS42XX8_INTF_ADC_DIF_WIDTH 3 134#define CS42XX8_INTF_ADC_DIF_WIDTH 3
135#define CS42XX8_INTF_ADC_DIF_MASK (((1 << CS42XX8_INTF_ADC_DIF_WIDTH) - 1) << CS42XX8_INTF_ADC_DIF_SHIFT) 135#define CS42XX8_INTF_ADC_DIF_MASK (((1 << CS42XX8_INTF_ADC_DIF_WIDTH) - 1) << CS42XX8_INTF_ADC_DIF_SHIFT)
@@ -138,8 +138,8 @@ int cs42xx8_probe(struct device *dev, struct regmap *regmap);
138#define CS42XX8_INTF_ADC_DIF_RIGHTJ (2 << CS42XX8_INTF_ADC_DIF_SHIFT) 138#define CS42XX8_INTF_ADC_DIF_RIGHTJ (2 << CS42XX8_INTF_ADC_DIF_SHIFT)
139#define CS42XX8_INTF_ADC_DIF_RIGHTJ_16 (3 << CS42XX8_INTF_ADC_DIF_SHIFT) 139#define CS42XX8_INTF_ADC_DIF_RIGHTJ_16 (3 << CS42XX8_INTF_ADC_DIF_SHIFT)
140#define CS42XX8_INTF_ADC_DIF_ONELINE_20 (4 << CS42XX8_INTF_ADC_DIF_SHIFT) 140#define CS42XX8_INTF_ADC_DIF_ONELINE_20 (4 << CS42XX8_INTF_ADC_DIF_SHIFT)
141#define CS42XX8_INTF_ADC_DIF_ONELINE_24 (6 << CS42XX8_INTF_ADC_DIF_SHIFT) 141#define CS42XX8_INTF_ADC_DIF_ONELINE_24 (5 << CS42XX8_INTF_ADC_DIF_SHIFT)
142#define CS42XX8_INTF_ADC_DIF_TDM (7 << CS42XX8_INTF_ADC_DIF_SHIFT) 142#define CS42XX8_INTF_ADC_DIF_TDM (6 << CS42XX8_INTF_ADC_DIF_SHIFT)
143 143
144/* ADC Control & DAC De-Emphasis (Address 05h) */ 144/* ADC Control & DAC De-Emphasis (Address 05h) */
145#define CS42XX8_ADCCTL_ADC_HPF_FREEZE_SHIFT 7 145#define CS42XX8_ADCCTL_ADC_HPF_FREEZE_SHIFT 7
diff --git a/sound/soc/codecs/cx20442.c b/sound/soc/codecs/cx20442.c
index d5fd00a64748..8f95b0300f1a 100644
--- a/sound/soc/codecs/cx20442.c
+++ b/sound/soc/codecs/cx20442.c
@@ -253,7 +253,7 @@ static void v253_close(struct tty_struct *tty)
253 /* Prevent the codec driver from further accessing the modem */ 253 /* Prevent the codec driver from further accessing the modem */
254 codec->hw_write = NULL; 254 codec->hw_write = NULL;
255 cx20442->control_data = NULL; 255 cx20442->control_data = NULL;
256 codec->card->pop_time = 0; 256 codec->component.card->pop_time = 0;
257} 257}
258 258
259/* Line discipline .hangup() */ 259/* Line discipline .hangup() */
@@ -281,7 +281,7 @@ static void v253_receive(struct tty_struct *tty,
281 /* Set up codec driver access to modem controls */ 281 /* Set up codec driver access to modem controls */
282 cx20442->control_data = tty; 282 cx20442->control_data = tty;
283 codec->hw_write = (hw_write_t)tty->ops->write; 283 codec->hw_write = (hw_write_t)tty->ops->write;
284 codec->card->pop_time = 1; 284 codec->component.card->pop_time = 1;
285 } 285 }
286} 286}
287 287
@@ -372,7 +372,7 @@ static int cx20442_codec_probe(struct snd_soc_codec *codec)
372 372
373 snd_soc_codec_set_drvdata(codec, cx20442); 373 snd_soc_codec_set_drvdata(codec, cx20442);
374 codec->hw_write = NULL; 374 codec->hw_write = NULL;
375 codec->card->pop_time = 0; 375 codec->component.card->pop_time = 0;
376 376
377 return 0; 377 return 0;
378} 378}
@@ -383,8 +383,8 @@ static int cx20442_codec_remove(struct snd_soc_codec *codec)
383 struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec); 383 struct cx20442_priv *cx20442 = snd_soc_codec_get_drvdata(codec);
384 384
385 if (cx20442->control_data) { 385 if (cx20442->control_data) {
386 struct tty_struct *tty = cx20442->control_data; 386 struct tty_struct *tty = cx20442->control_data;
387 tty_hangup(tty); 387 tty_hangup(tty);
388 } 388 }
389 389
390 if (!IS_ERR(cx20442->por)) { 390 if (!IS_ERR(cx20442->por)) {
diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c
index 9134982807b5..2cd3e5427441 100644
--- a/sound/soc/codecs/max98088.c
+++ b/sound/soc/codecs/max98088.c
@@ -1299,12 +1299,12 @@ static int max98088_dai2_hw_params(struct snd_pcm_substream *substream,
1299 1299
1300 rate = params_rate(params); 1300 rate = params_rate(params);
1301 1301
1302 switch (params_format(params)) { 1302 switch (params_width(params)) {
1303 case SNDRV_PCM_FORMAT_S16_LE: 1303 case 16:
1304 snd_soc_update_bits(codec, M98088_REG_1C_DAI2_FORMAT, 1304 snd_soc_update_bits(codec, M98088_REG_1C_DAI2_FORMAT,
1305 M98088_DAI_WS, 0); 1305 M98088_DAI_WS, 0);
1306 break; 1306 break;
1307 case SNDRV_PCM_FORMAT_S24_LE: 1307 case 24:
1308 snd_soc_update_bits(codec, M98088_REG_1C_DAI2_FORMAT, 1308 snd_soc_update_bits(codec, M98088_REG_1C_DAI2_FORMAT,
1309 M98088_DAI_WS, M98088_DAI_WS); 1309 M98088_DAI_WS, M98088_DAI_WS);
1310 break; 1310 break;
diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c
index d97f1ce7ff7d..4a063fa88526 100644
--- a/sound/soc/codecs/max98090.c
+++ b/sound/soc/codecs/max98090.c
@@ -26,10 +26,6 @@
26#include <sound/max98090.h> 26#include <sound/max98090.h>
27#include "max98090.h" 27#include "max98090.h"
28 28
29#define DEBUG
30#define EXTMIC_METHOD
31#define EXTMIC_METHOD_TEST
32
33/* Allows for sparsely populated register maps */ 29/* Allows for sparsely populated register maps */
34static struct reg_default max98090_reg[] = { 30static struct reg_default max98090_reg[] = {
35 { 0x00, 0x00 }, /* 00 Software Reset */ 31 { 0x00, 0x00 }, /* 00 Software Reset */
@@ -820,7 +816,6 @@ static int max98090_micinput_event(struct snd_soc_dapm_widget *w,
820 else 816 else
821 val = (val & M98090_MIC_PA2EN_MASK) >> M98090_MIC_PA2EN_SHIFT; 817 val = (val & M98090_MIC_PA2EN_MASK) >> M98090_MIC_PA2EN_SHIFT;
822 818
823
824 if (val >= 1) { 819 if (val >= 1) {
825 if (w->reg == M98090_REG_MIC1_INPUT_LEVEL) { 820 if (w->reg == M98090_REG_MIC1_INPUT_LEVEL) {
826 max98090->pa1en = val - 1; /* Update for volatile */ 821 max98090->pa1en = val - 1; /* Update for volatile */
@@ -1140,7 +1135,6 @@ static const struct snd_kcontrol_new max98090_mixhprsel_mux =
1140 SOC_DAPM_ENUM("MIXHPRSEL Mux", mixhprsel_mux_enum); 1135 SOC_DAPM_ENUM("MIXHPRSEL Mux", mixhprsel_mux_enum);
1141 1136
1142static const struct snd_soc_dapm_widget max98090_dapm_widgets[] = { 1137static const struct snd_soc_dapm_widget max98090_dapm_widgets[] = {
1143
1144 SND_SOC_DAPM_INPUT("MIC1"), 1138 SND_SOC_DAPM_INPUT("MIC1"),
1145 SND_SOC_DAPM_INPUT("MIC2"), 1139 SND_SOC_DAPM_INPUT("MIC2"),
1146 SND_SOC_DAPM_INPUT("DMICL"), 1140 SND_SOC_DAPM_INPUT("DMICL"),
@@ -1304,7 +1298,6 @@ static const struct snd_soc_dapm_widget max98090_dapm_widgets[] = {
1304}; 1298};
1305 1299
1306static const struct snd_soc_dapm_widget max98091_dapm_widgets[] = { 1300static const struct snd_soc_dapm_widget max98091_dapm_widgets[] = {
1307
1308 SND_SOC_DAPM_INPUT("DMIC3"), 1301 SND_SOC_DAPM_INPUT("DMIC3"),
1309 SND_SOC_DAPM_INPUT("DMIC4"), 1302 SND_SOC_DAPM_INPUT("DMIC4"),
1310 1303
@@ -1315,7 +1308,6 @@ static const struct snd_soc_dapm_widget max98091_dapm_widgets[] = {
1315}; 1308};
1316 1309
1317static const struct snd_soc_dapm_route max98090_dapm_routes[] = { 1310static const struct snd_soc_dapm_route max98090_dapm_routes[] = {
1318
1319 {"MIC1 Input", NULL, "MIC1"}, 1311 {"MIC1 Input", NULL, "MIC1"},
1320 {"MIC2 Input", NULL, "MIC2"}, 1312 {"MIC2 Input", NULL, "MIC2"},
1321 1313
@@ -1493,17 +1485,14 @@ static const struct snd_soc_dapm_route max98090_dapm_routes[] = {
1493 {"SPKR", NULL, "SPK Right Out"}, 1485 {"SPKR", NULL, "SPK Right Out"},
1494 {"RCVL", NULL, "RCV Left Out"}, 1486 {"RCVL", NULL, "RCV Left Out"},
1495 {"RCVR", NULL, "RCV Right Out"}, 1487 {"RCVR", NULL, "RCV Right Out"},
1496
1497}; 1488};
1498 1489
1499static const struct snd_soc_dapm_route max98091_dapm_routes[] = { 1490static const struct snd_soc_dapm_route max98091_dapm_routes[] = {
1500
1501 /* DMIC inputs */ 1491 /* DMIC inputs */
1502 {"DMIC3", NULL, "DMIC3_ENA"}, 1492 {"DMIC3", NULL, "DMIC3_ENA"},
1503 {"DMIC4", NULL, "DMIC4_ENA"}, 1493 {"DMIC4", NULL, "DMIC4_ENA"},
1504 {"DMIC3", NULL, "AHPF"}, 1494 {"DMIC3", NULL, "AHPF"},
1505 {"DMIC4", NULL, "AHPF"}, 1495 {"DMIC4", NULL, "AHPF"},
1506
1507}; 1496};
1508 1497
1509static int max98090_add_widgets(struct snd_soc_codec *codec) 1498static int max98090_add_widgets(struct snd_soc_codec *codec)
@@ -1531,7 +1520,6 @@ static int max98090_add_widgets(struct snd_soc_codec *codec)
1531 1520
1532 snd_soc_dapm_add_routes(dapm, max98091_dapm_routes, 1521 snd_soc_dapm_add_routes(dapm, max98091_dapm_routes,
1533 ARRAY_SIZE(max98091_dapm_routes)); 1522 ARRAY_SIZE(max98091_dapm_routes));
1534
1535 } 1523 }
1536 1524
1537 return 0; 1525 return 0;
@@ -2212,22 +2200,11 @@ static struct snd_soc_dai_driver max98090_dai[] = {
2212} 2200}
2213}; 2201};
2214 2202
2215static void max98090_handle_pdata(struct snd_soc_codec *codec)
2216{
2217 struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
2218 struct max98090_pdata *pdata = max98090->pdata;
2219
2220 if (!pdata) {
2221 dev_err(codec->dev, "No platform data\n");
2222 return;
2223 }
2224
2225}
2226
2227static int max98090_probe(struct snd_soc_codec *codec) 2203static int max98090_probe(struct snd_soc_codec *codec)
2228{ 2204{
2229 struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); 2205 struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
2230 struct max98090_cdata *cdata; 2206 struct max98090_cdata *cdata;
2207 enum max98090_type devtype;
2231 int ret = 0; 2208 int ret = 0;
2232 2209
2233 dev_dbg(codec->dev, "max98090_probe\n"); 2210 dev_dbg(codec->dev, "max98090_probe\n");
@@ -2263,16 +2240,21 @@ static int max98090_probe(struct snd_soc_codec *codec)
2263 } 2240 }
2264 2241
2265 if ((ret >= M98090_REVA) && (ret <= M98090_REVA + 0x0f)) { 2242 if ((ret >= M98090_REVA) && (ret <= M98090_REVA + 0x0f)) {
2266 max98090->devtype = MAX98090; 2243 devtype = MAX98090;
2267 dev_info(codec->dev, "MAX98090 REVID=0x%02x\n", ret); 2244 dev_info(codec->dev, "MAX98090 REVID=0x%02x\n", ret);
2268 } else if ((ret >= M98091_REVA) && (ret <= M98091_REVA + 0x0f)) { 2245 } else if ((ret >= M98091_REVA) && (ret <= M98091_REVA + 0x0f)) {
2269 max98090->devtype = MAX98091; 2246 devtype = MAX98091;
2270 dev_info(codec->dev, "MAX98091 REVID=0x%02x\n", ret); 2247 dev_info(codec->dev, "MAX98091 REVID=0x%02x\n", ret);
2271 } else { 2248 } else {
2272 max98090->devtype = MAX98090; 2249 devtype = MAX98090;
2273 dev_err(codec->dev, "Unrecognized revision 0x%02x\n", ret); 2250 dev_err(codec->dev, "Unrecognized revision 0x%02x\n", ret);
2274 } 2251 }
2275 2252
2253 if (max98090->devtype != devtype) {
2254 dev_warn(codec->dev, "Mismatch in DT specified CODEC type.\n");
2255 max98090->devtype = devtype;
2256 }
2257
2276 max98090->jack_state = M98090_JACK_STATE_NO_HEADSET; 2258 max98090->jack_state = M98090_JACK_STATE_NO_HEADSET;
2277 2259
2278 INIT_DELAYED_WORK(&max98090->jack_work, max98090_jack_work); 2260 INIT_DELAYED_WORK(&max98090->jack_work, max98090_jack_work);
@@ -2317,8 +2299,6 @@ static int max98090_probe(struct snd_soc_codec *codec)
2317 snd_soc_update_bits(codec, M98090_REG_MIC_BIAS_VOLTAGE, 2299 snd_soc_update_bits(codec, M98090_REG_MIC_BIAS_VOLTAGE,
2318 M98090_MBVSEL_MASK, M98090_MBVSEL_2V8); 2300 M98090_MBVSEL_MASK, M98090_MBVSEL_2V8);
2319 2301
2320 max98090_handle_pdata(codec);
2321
2322 max98090_add_widgets(codec); 2302 max98090_add_widgets(codec);
2323 2303
2324err_access: 2304err_access:
@@ -2428,7 +2408,7 @@ static int max98090_runtime_suspend(struct device *dev)
2428} 2408}
2429#endif 2409#endif
2430 2410
2431#ifdef CONFIG_PM 2411#ifdef CONFIG_PM_SLEEP
2432static int max98090_resume(struct device *dev) 2412static int max98090_resume(struct device *dev)
2433{ 2413{
2434 struct max98090_priv *max98090 = dev_get_drvdata(dev); 2414 struct max98090_priv *max98090 = dev_get_drvdata(dev);
@@ -2460,12 +2440,14 @@ static const struct dev_pm_ops max98090_pm = {
2460 2440
2461static const struct i2c_device_id max98090_i2c_id[] = { 2441static const struct i2c_device_id max98090_i2c_id[] = {
2462 { "max98090", MAX98090 }, 2442 { "max98090", MAX98090 },
2443 { "max98091", MAX98091 },
2463 { } 2444 { }
2464}; 2445};
2465MODULE_DEVICE_TABLE(i2c, max98090_i2c_id); 2446MODULE_DEVICE_TABLE(i2c, max98090_i2c_id);
2466 2447
2467static const struct of_device_id max98090_of_match[] = { 2448static const struct of_device_id max98090_of_match[] = {
2468 { .compatible = "maxim,max98090", }, 2449 { .compatible = "maxim,max98090", },
2450 { .compatible = "maxim,max98091", },
2469 { } 2451 { }
2470}; 2452};
2471MODULE_DEVICE_TABLE(of, max98090_of_match); 2453MODULE_DEVICE_TABLE(of, max98090_of_match);
diff --git a/sound/soc/codecs/max98095.c b/sound/soc/codecs/max98095.c
index 89ec00424880..0ee6797d5083 100644
--- a/sound/soc/codecs/max98095.c
+++ b/sound/soc/codecs/max98095.c
@@ -1280,12 +1280,12 @@ static int max98095_dai2_hw_params(struct snd_pcm_substream *substream,
1280 1280
1281 rate = params_rate(params); 1281 rate = params_rate(params);
1282 1282
1283 switch (params_format(params)) { 1283 switch (params_width(params)) {
1284 case SNDRV_PCM_FORMAT_S16_LE: 1284 case 16:
1285 snd_soc_update_bits(codec, M98095_034_DAI2_FORMAT, 1285 snd_soc_update_bits(codec, M98095_034_DAI2_FORMAT,
1286 M98095_DAI_WS, 0); 1286 M98095_DAI_WS, 0);
1287 break; 1287 break;
1288 case SNDRV_PCM_FORMAT_S24_LE: 1288 case 24:
1289 snd_soc_update_bits(codec, M98095_034_DAI2_FORMAT, 1289 snd_soc_update_bits(codec, M98095_034_DAI2_FORMAT,
1290 M98095_DAI_WS, M98095_DAI_WS); 1290 M98095_DAI_WS, M98095_DAI_WS);
1291 break; 1291 break;
@@ -1341,12 +1341,12 @@ static int max98095_dai3_hw_params(struct snd_pcm_substream *substream,
1341 1341
1342 rate = params_rate(params); 1342 rate = params_rate(params);
1343 1343
1344 switch (params_format(params)) { 1344 switch (params_width(params)) {
1345 case SNDRV_PCM_FORMAT_S16_LE: 1345 case 16:
1346 snd_soc_update_bits(codec, M98095_03E_DAI3_FORMAT, 1346 snd_soc_update_bits(codec, M98095_03E_DAI3_FORMAT,
1347 M98095_DAI_WS, 0); 1347 M98095_DAI_WS, 0);
1348 break; 1348 break;
1349 case SNDRV_PCM_FORMAT_S24_LE: 1349 case 24:
1350 snd_soc_update_bits(codec, M98095_03E_DAI3_FORMAT, 1350 snd_soc_update_bits(codec, M98095_03E_DAI3_FORMAT,
1351 M98095_DAI_WS, M98095_DAI_WS); 1351 M98095_DAI_WS, M98095_DAI_WS);
1352 break; 1352 break;
diff --git a/sound/soc/codecs/mc13783.c b/sound/soc/codecs/mc13783.c
index 9965277b595a..388f90a597fa 100644
--- a/sound/soc/codecs/mc13783.c
+++ b/sound/soc/codecs/mc13783.c
@@ -766,11 +766,11 @@ static int __init mc13783_codec_probe(struct platform_device *pdev)
766 766
767 ret = of_property_read_u32(np, "adc-port", &priv->adc_ssi_port); 767 ret = of_property_read_u32(np, "adc-port", &priv->adc_ssi_port);
768 if (ret) 768 if (ret)
769 return ret; 769 goto out;
770 770
771 ret = of_property_read_u32(np, "dac-port", &priv->dac_ssi_port); 771 ret = of_property_read_u32(np, "dac-port", &priv->dac_ssi_port);
772 if (ret) 772 if (ret)
773 return ret; 773 goto out;
774 } 774 }
775 775
776 dev_set_drvdata(&pdev->dev, priv); 776 dev_set_drvdata(&pdev->dev, priv);
@@ -783,6 +783,8 @@ static int __init mc13783_codec_probe(struct platform_device *pdev)
783 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_mc13783, 783 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_mc13783,
784 mc13783_dai_async, ARRAY_SIZE(mc13783_dai_async)); 784 mc13783_dai_async, ARRAY_SIZE(mc13783_dai_async));
785 785
786out:
787 of_node_put(np);
786 return ret; 788 return ret;
787} 789}
788 790
diff --git a/sound/soc/codecs/pcm1792a.c b/sound/soc/codecs/pcm1792a.c
index 3a80ba4452df..57b0c94a710b 100644
--- a/sound/soc/codecs/pcm1792a.c
+++ b/sound/soc/codecs/pcm1792a.c
@@ -36,6 +36,7 @@
36#define PCM1792A_DAC_VOL_LEFT 0x10 36#define PCM1792A_DAC_VOL_LEFT 0x10
37#define PCM1792A_DAC_VOL_RIGHT 0x11 37#define PCM1792A_DAC_VOL_RIGHT 0x11
38#define PCM1792A_FMT_CONTROL 0x12 38#define PCM1792A_FMT_CONTROL 0x12
39#define PCM1792A_MODE_CONTROL 0x13
39#define PCM1792A_SOFT_MUTE PCM1792A_FMT_CONTROL 40#define PCM1792A_SOFT_MUTE PCM1792A_FMT_CONTROL
40 41
41#define PCM1792A_FMT_MASK 0x70 42#define PCM1792A_FMT_MASK 0x70
@@ -164,6 +165,8 @@ static const struct snd_kcontrol_new pcm1792a_controls[] = {
164 SOC_DOUBLE_R_RANGE_TLV("DAC Playback Volume", PCM1792A_DAC_VOL_LEFT, 165 SOC_DOUBLE_R_RANGE_TLV("DAC Playback Volume", PCM1792A_DAC_VOL_LEFT,
165 PCM1792A_DAC_VOL_RIGHT, 0, 0xf, 0xff, 0, 166 PCM1792A_DAC_VOL_RIGHT, 0, 0xf, 0xff, 0,
166 pcm1792a_dac_tlv), 167 pcm1792a_dac_tlv),
168 SOC_SINGLE("DAC Invert Output Switch", PCM1792A_MODE_CONTROL, 7, 1, 0),
169 SOC_SINGLE("DAC Rolloff Filter Switch", PCM1792A_MODE_CONTROL, 1, 1, 0),
167}; 170};
168 171
169static const struct snd_soc_dapm_widget pcm1792a_dapm_widgets[] = { 172static const struct snd_soc_dapm_widget pcm1792a_dapm_widgets[] = {
diff --git a/sound/soc/codecs/pcm1792a.h b/sound/soc/codecs/pcm1792a.h
index 7a83d1fc102a..51d5470fee16 100644
--- a/sound/soc/codecs/pcm1792a.h
+++ b/sound/soc/codecs/pcm1792a.h
@@ -18,7 +18,8 @@
18#define __PCM1792A_H__ 18#define __PCM1792A_H__
19 19
20#define PCM1792A_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_8000_48000 | \ 20#define PCM1792A_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_8000_48000 | \
21 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000) 21 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
22 SNDRV_PCM_RATE_192000)
22 23
23#define PCM1792A_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \ 24#define PCM1792A_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \
24 SNDRV_PCM_FMTBIT_S16_LE) 25 SNDRV_PCM_FMTBIT_S16_LE)
diff --git a/sound/soc/codecs/rl6231.c b/sound/soc/codecs/rl6231.c
index 7b82fbe0d14c..56650d6c2f53 100644
--- a/sound/soc/codecs/rl6231.c
+++ b/sound/soc/codecs/rl6231.c
@@ -11,25 +11,6 @@
11 */ 11 */
12 12
13#include <linux/module.h> 13#include <linux/module.h>
14#include <linux/moduleparam.h>
15#include <linux/init.h>
16#include <linux/delay.h>
17#include <linux/pm.h>
18#include <linux/gpio.h>
19#include <linux/i2c.h>
20#include <linux/regmap.h>
21#include <linux/of.h>
22#include <linux/of_gpio.h>
23#include <linux/platform_device.h>
24#include <linux/spi/spi.h>
25#include <linux/acpi.h>
26#include <sound/core.h>
27#include <sound/pcm.h>
28#include <sound/pcm_params.h>
29#include <sound/soc.h>
30#include <sound/soc-dapm.h>
31#include <sound/initval.h>
32#include <sound/tlv.h>
33 14
34#include "rl6231.h" 15#include "rl6231.h"
35 16
diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c
new file mode 100644
index 000000000000..e4f6102efc1a
--- /dev/null
+++ b/sound/soc/codecs/rt286.c
@@ -0,0 +1,1222 @@
1/*
2 * rt286.c -- RT286 ALSA SoC audio codec driver
3 *
4 * Copyright 2013 Realtek Semiconductor Corp.
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <linux/init.h>
15#include <linux/delay.h>
16#include <linux/pm.h>
17#include <linux/i2c.h>
18#include <linux/platform_device.h>
19#include <linux/spi/spi.h>
20#include <linux/acpi.h>
21#include <sound/core.h>
22#include <sound/pcm.h>
23#include <sound/pcm_params.h>
24#include <sound/soc.h>
25#include <sound/soc-dapm.h>
26#include <sound/initval.h>
27#include <sound/tlv.h>
28#include <sound/jack.h>
29#include <linux/workqueue.h>
30#include <sound/rt286.h>
31#include <sound/hda_verbs.h>
32
33#include "rt286.h"
34
35#define RT286_VENDOR_ID 0x10ec0286
36
37struct rt286_priv {
38 struct regmap *regmap;
39 struct rt286_platform_data pdata;
40 struct i2c_client *i2c;
41 struct snd_soc_jack *jack;
42 struct delayed_work jack_detect_work;
43 int sys_clk;
44 struct reg_default *index_cache;
45};
46
47static struct reg_default rt286_index_def[] = {
48 { 0x01, 0xaaaa },
49 { 0x02, 0x8aaa },
50 { 0x03, 0x0002 },
51 { 0x04, 0xaf01 },
52 { 0x08, 0x000d },
53 { 0x09, 0xd810 },
54 { 0x0a, 0x0060 },
55 { 0x0b, 0x0000 },
56 { 0x0d, 0x2800 },
57 { 0x0f, 0x0000 },
58 { 0x19, 0x0a17 },
59 { 0x20, 0x0020 },
60 { 0x33, 0x0208 },
61 { 0x49, 0x0004 },
62 { 0x4f, 0x50e9 },
63 { 0x50, 0x2c00 },
64 { 0x63, 0x2902 },
65 { 0x67, 0x1111 },
66 { 0x68, 0x1016 },
67 { 0x69, 0x273f },
68};
69#define INDEX_CACHE_SIZE ARRAY_SIZE(rt286_index_def)
70
71static const struct reg_default rt286_reg[] = {
72 { 0x00170500, 0x00000400 },
73 { 0x00220000, 0x00000031 },
74 { 0x00239000, 0x0000007f },
75 { 0x0023a000, 0x0000007f },
76 { 0x00270500, 0x00000400 },
77 { 0x00370500, 0x00000400 },
78 { 0x00870500, 0x00000400 },
79 { 0x00920000, 0x00000031 },
80 { 0x00935000, 0x000000c3 },
81 { 0x00936000, 0x000000c3 },
82 { 0x00970500, 0x00000400 },
83 { 0x00b37000, 0x00000097 },
84 { 0x00b37200, 0x00000097 },
85 { 0x00b37300, 0x00000097 },
86 { 0x00c37000, 0x00000000 },
87 { 0x00c37100, 0x00000080 },
88 { 0x01270500, 0x00000400 },
89 { 0x01370500, 0x00000400 },
90 { 0x01371f00, 0x411111f0 },
91 { 0x01439000, 0x00000080 },
92 { 0x0143a000, 0x00000080 },
93 { 0x01470700, 0x00000000 },
94 { 0x01470500, 0x00000400 },
95 { 0x01470c00, 0x00000000 },
96 { 0x01470100, 0x00000000 },
97 { 0x01837000, 0x00000000 },
98 { 0x01870500, 0x00000400 },
99 { 0x02050000, 0x00000000 },
100 { 0x02139000, 0x00000080 },
101 { 0x0213a000, 0x00000080 },
102 { 0x02170100, 0x00000000 },
103 { 0x02170500, 0x00000400 },
104 { 0x02170700, 0x00000000 },
105 { 0x02270100, 0x00000000 },
106 { 0x02370100, 0x00000000 },
107 { 0x02040000, 0x00004002 },
108 { 0x01870700, 0x00000020 },
109 { 0x00830000, 0x000000c3 },
110 { 0x00930000, 0x000000c3 },
111 { 0x01270700, 0x00000000 },
112};
113
114static bool rt286_volatile_register(struct device *dev, unsigned int reg)
115{
116 switch (reg) {
117 case 0 ... 0xff:
118 case RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID):
119 case RT286_GET_HP_SENSE:
120 case RT286_GET_MIC1_SENSE:
121 case RT286_PROC_COEF:
122 return true;
123 default:
124 return false;
125 }
126
127
128}
129
130static bool rt286_readable_register(struct device *dev, unsigned int reg)
131{
132 switch (reg) {
133 case 0 ... 0xff:
134 case RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID):
135 case RT286_GET_HP_SENSE:
136 case RT286_GET_MIC1_SENSE:
137 case RT286_SET_AUDIO_POWER:
138 case RT286_SET_HPO_POWER:
139 case RT286_SET_SPK_POWER:
140 case RT286_SET_DMIC1_POWER:
141 case RT286_SPK_MUX:
142 case RT286_HPO_MUX:
143 case RT286_ADC0_MUX:
144 case RT286_ADC1_MUX:
145 case RT286_SET_MIC1:
146 case RT286_SET_PIN_HPO:
147 case RT286_SET_PIN_SPK:
148 case RT286_SET_PIN_DMIC1:
149 case RT286_SPK_EAPD:
150 case RT286_SET_AMP_GAIN_HPO:
151 case RT286_SET_DMIC2_DEFAULT:
152 case RT286_DACL_GAIN:
153 case RT286_DACR_GAIN:
154 case RT286_ADCL_GAIN:
155 case RT286_ADCR_GAIN:
156 case RT286_MIC_GAIN:
157 case RT286_SPOL_GAIN:
158 case RT286_SPOR_GAIN:
159 case RT286_HPOL_GAIN:
160 case RT286_HPOR_GAIN:
161 case RT286_F_DAC_SWITCH:
162 case RT286_F_RECMIX_SWITCH:
163 case RT286_REC_MIC_SWITCH:
164 case RT286_REC_I2S_SWITCH:
165 case RT286_REC_LINE_SWITCH:
166 case RT286_REC_BEEP_SWITCH:
167 case RT286_DAC_FORMAT:
168 case RT286_ADC_FORMAT:
169 case RT286_COEF_INDEX:
170 case RT286_PROC_COEF:
171 case RT286_SET_AMP_GAIN_ADC_IN1:
172 case RT286_SET_AMP_GAIN_ADC_IN2:
173 case RT286_SET_POWER(RT286_DAC_OUT1):
174 case RT286_SET_POWER(RT286_DAC_OUT2):
175 case RT286_SET_POWER(RT286_ADC_IN1):
176 case RT286_SET_POWER(RT286_ADC_IN2):
177 case RT286_SET_POWER(RT286_DMIC2):
178 case RT286_SET_POWER(RT286_MIC1):
179 return true;
180 default:
181 return false;
182 }
183}
184
185static int rt286_hw_write(void *context, unsigned int reg, unsigned int value)
186{
187 struct i2c_client *client = context;
188 struct rt286_priv *rt286 = i2c_get_clientdata(client);
189 u8 data[4];
190 int ret, i;
191
192 /*handle index registers*/
193 if (reg <= 0xff) {
194 rt286_hw_write(client, RT286_COEF_INDEX, reg);
195 reg = RT286_PROC_COEF;
196 for (i = 0; i < INDEX_CACHE_SIZE; i++) {
197 if (reg == rt286->index_cache[i].reg) {
198 rt286->index_cache[i].def = value;
199 break;
200 }
201
202 }
203 }
204
205 data[0] = (reg >> 24) & 0xff;
206 data[1] = (reg >> 16) & 0xff;
207 /*
208 * 4 bit VID: reg should be 0
209 * 12 bit VID: value should be 0
210 * So we use an OR operator to handle it rather than use if condition.
211 */
212 data[2] = ((reg >> 8) & 0xff) | ((value >> 8) & 0xff);
213 data[3] = value & 0xff;
214
215 ret = i2c_master_send(client, data, 4);
216
217 if (ret == 4)
218 return 0;
219 else
220 pr_err("ret=%d\n", ret);
221 if (ret < 0)
222 return ret;
223 else
224 return -EIO;
225}
226
227static int rt286_hw_read(void *context, unsigned int reg, unsigned int *value)
228{
229 struct i2c_client *client = context;
230 struct i2c_msg xfer[2];
231 int ret;
232 __be32 be_reg;
233 unsigned int index, vid, buf = 0x0;
234
235 /*handle index registers*/
236 if (reg <= 0xff) {
237 rt286_hw_write(client, RT286_COEF_INDEX, reg);
238 reg = RT286_PROC_COEF;
239 }
240
241 reg = reg | 0x80000;
242 vid = (reg >> 8) & 0xfff;
243
244 if (AC_VERB_GET_AMP_GAIN_MUTE == (vid & 0xf00)) {
245 index = (reg >> 8) & 0xf;
246 reg = (reg & ~0xf0f) | index;
247 }
248 be_reg = cpu_to_be32(reg);
249
250 /* Write register */
251 xfer[0].addr = client->addr;
252 xfer[0].flags = 0;
253 xfer[0].len = 4;
254 xfer[0].buf = (u8 *)&be_reg;
255
256 /* Read data */
257 xfer[1].addr = client->addr;
258 xfer[1].flags = I2C_M_RD;
259 xfer[1].len = 4;
260 xfer[1].buf = (u8 *)&buf;
261
262 ret = i2c_transfer(client->adapter, xfer, 2);
263 if (ret < 0)
264 return ret;
265 else if (ret != 2)
266 return -EIO;
267
268 *value = be32_to_cpu(buf);
269
270 return 0;
271}
272
273static void rt286_index_sync(struct snd_soc_codec *codec)
274{
275 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
276 int i;
277
278 for (i = 0; i < INDEX_CACHE_SIZE; i++) {
279 snd_soc_write(codec, rt286->index_cache[i].reg,
280 rt286->index_cache[i].def);
281 }
282}
283
284static int rt286_support_power_controls[] = {
285 RT286_DAC_OUT1,
286 RT286_DAC_OUT2,
287 RT286_ADC_IN1,
288 RT286_ADC_IN2,
289 RT286_MIC1,
290 RT286_DMIC1,
291 RT286_DMIC2,
292 RT286_SPK_OUT,
293 RT286_HP_OUT,
294};
295#define RT286_POWER_REG_LEN ARRAY_SIZE(rt286_support_power_controls)
296
297static int rt286_jack_detect(struct rt286_priv *rt286, bool *hp, bool *mic)
298{
299 unsigned int val, buf;
300 int i;
301
302 *hp = false;
303 *mic = false;
304
305 if (rt286->pdata.cbj_en) {
306 regmap_read(rt286->regmap, RT286_GET_HP_SENSE, &buf);
307 *hp = buf & 0x80000000;
308 if (*hp) {
309 /* power on HV,VERF */
310 regmap_update_bits(rt286->regmap,
311 RT286_POWER_CTRL1, 0x1001, 0x0);
312 /* power LDO1 */
313 regmap_update_bits(rt286->regmap,
314 RT286_POWER_CTRL2, 0x4, 0x4);
315 regmap_write(rt286->regmap, RT286_SET_MIC1, 0x24);
316 regmap_read(rt286->regmap, RT286_CBJ_CTRL2, &val);
317
318 msleep(200);
319 i = 40;
320 while (((val & 0x0800) == 0) && (i > 0)) {
321 regmap_read(rt286->regmap,
322 RT286_CBJ_CTRL2, &val);
323 i--;
324 msleep(20);
325 }
326
327 if (0x0400 == (val & 0x0700)) {
328 *mic = false;
329
330 regmap_write(rt286->regmap,
331 RT286_SET_MIC1, 0x20);
332 /* power off HV,VERF */
333 regmap_update_bits(rt286->regmap,
334 RT286_POWER_CTRL1, 0x1001, 0x1001);
335 regmap_update_bits(rt286->regmap,
336 RT286_A_BIAS_CTRL3, 0xc000, 0x0000);
337 regmap_update_bits(rt286->regmap,
338 RT286_CBJ_CTRL1, 0x0030, 0x0000);
339 regmap_update_bits(rt286->regmap,
340 RT286_A_BIAS_CTRL2, 0xc000, 0x0000);
341 } else if ((0x0200 == (val & 0x0700)) ||
342 (0x0100 == (val & 0x0700))) {
343 *mic = true;
344 regmap_update_bits(rt286->regmap,
345 RT286_A_BIAS_CTRL3, 0xc000, 0x8000);
346 regmap_update_bits(rt286->regmap,
347 RT286_CBJ_CTRL1, 0x0030, 0x0020);
348 regmap_update_bits(rt286->regmap,
349 RT286_A_BIAS_CTRL2, 0xc000, 0x8000);
350 } else {
351 *mic = false;
352 }
353
354 regmap_update_bits(rt286->regmap,
355 RT286_MISC_CTRL1,
356 0x0060, 0x0000);
357 } else {
358 regmap_update_bits(rt286->regmap,
359 RT286_MISC_CTRL1,
360 0x0060, 0x0020);
361 regmap_update_bits(rt286->regmap,
362 RT286_A_BIAS_CTRL3,
363 0xc000, 0x8000);
364 regmap_update_bits(rt286->regmap,
365 RT286_CBJ_CTRL1,
366 0x0030, 0x0020);
367 regmap_update_bits(rt286->regmap,
368 RT286_A_BIAS_CTRL2,
369 0xc000, 0x8000);
370
371 *mic = false;
372 }
373 } else {
374 regmap_read(rt286->regmap, RT286_GET_HP_SENSE, &buf);
375 *hp = buf & 0x80000000;
376 regmap_read(rt286->regmap, RT286_GET_MIC1_SENSE, &buf);
377 *mic = buf & 0x80000000;
378 }
379
380 return 0;
381}
382
383static void rt286_jack_detect_work(struct work_struct *work)
384{
385 struct rt286_priv *rt286 =
386 container_of(work, struct rt286_priv, jack_detect_work.work);
387 int status = 0;
388 bool hp = false;
389 bool mic = false;
390
391 rt286_jack_detect(rt286, &hp, &mic);
392
393 if (hp == true)
394 status |= SND_JACK_HEADPHONE;
395
396 if (mic == true)
397 status |= SND_JACK_MICROPHONE;
398
399 snd_soc_jack_report(rt286->jack, status,
400 SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
401}
402
403int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
404{
405 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
406
407 rt286->jack = jack;
408
409 /* Send an initial empty report */
410 snd_soc_jack_report(rt286->jack, 0,
411 SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
412
413 return 0;
414}
415EXPORT_SYMBOL_GPL(rt286_mic_detect);
416
417static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6350, 50, 0);
418static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
419
420static const struct snd_kcontrol_new rt286_snd_controls[] = {
421 SOC_DOUBLE_R_TLV("DAC0 Playback Volume", RT286_DACL_GAIN,
422 RT286_DACR_GAIN, 0, 0x7f, 0, out_vol_tlv),
423 SOC_DOUBLE_R_TLV("ADC0 Capture Volume", RT286_ADCL_GAIN,
424 RT286_ADCR_GAIN, 0, 0x7f, 0, out_vol_tlv),
425 SOC_SINGLE_TLV("AMIC Volume", RT286_MIC_GAIN,
426 0, 0x3, 0, mic_vol_tlv),
427 SOC_DOUBLE_R("Speaker Playback Switch", RT286_SPOL_GAIN,
428 RT286_SPOR_GAIN, RT286_MUTE_SFT, 1, 1),
429};
430
431/* Digital Mixer */
432static const struct snd_kcontrol_new rt286_front_mix[] = {
433 SOC_DAPM_SINGLE("DAC Switch", RT286_F_DAC_SWITCH,
434 RT286_MUTE_SFT, 1, 1),
435 SOC_DAPM_SINGLE("RECMIX Switch", RT286_F_RECMIX_SWITCH,
436 RT286_MUTE_SFT, 1, 1),
437};
438
439/* Analog Input Mixer */
440static const struct snd_kcontrol_new rt286_rec_mix[] = {
441 SOC_DAPM_SINGLE("Mic1 Switch", RT286_REC_MIC_SWITCH,
442 RT286_MUTE_SFT, 1, 1),
443 SOC_DAPM_SINGLE("I2S Switch", RT286_REC_I2S_SWITCH,
444 RT286_MUTE_SFT, 1, 1),
445 SOC_DAPM_SINGLE("Line1 Switch", RT286_REC_LINE_SWITCH,
446 RT286_MUTE_SFT, 1, 1),
447 SOC_DAPM_SINGLE("Beep Switch", RT286_REC_BEEP_SWITCH,
448 RT286_MUTE_SFT, 1, 1),
449};
450
451static const struct snd_kcontrol_new spo_enable_control =
452 SOC_DAPM_SINGLE("Switch", RT286_SET_PIN_SPK,
453 RT286_SET_PIN_SFT, 1, 0);
454
455static const struct snd_kcontrol_new hpol_enable_control =
456 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT286_HPOL_GAIN,
457 RT286_MUTE_SFT, 1, 1);
458
459static const struct snd_kcontrol_new hpor_enable_control =
460 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT286_HPOR_GAIN,
461 RT286_MUTE_SFT, 1, 1);
462
463/* ADC0 source */
464static const char * const rt286_adc_src[] = {
465 "Mic", "RECMIX", "Dmic"
466};
467
468static const int rt286_adc_values[] = {
469 0, 4, 5,
470};
471
472static SOC_VALUE_ENUM_SINGLE_DECL(
473 rt286_adc0_enum, RT286_ADC0_MUX, RT286_ADC_SEL_SFT,
474 RT286_ADC_SEL_MASK, rt286_adc_src, rt286_adc_values);
475
476static const struct snd_kcontrol_new rt286_adc0_mux =
477 SOC_DAPM_ENUM("ADC 0 source", rt286_adc0_enum);
478
479static SOC_VALUE_ENUM_SINGLE_DECL(
480 rt286_adc1_enum, RT286_ADC1_MUX, RT286_ADC_SEL_SFT,
481 RT286_ADC_SEL_MASK, rt286_adc_src, rt286_adc_values);
482
483static const struct snd_kcontrol_new rt286_adc1_mux =
484 SOC_DAPM_ENUM("ADC 1 source", rt286_adc1_enum);
485
486static const char * const rt286_dac_src[] = {
487 "Front", "Surround"
488};
489/* HP-OUT source */
490static SOC_ENUM_SINGLE_DECL(rt286_hpo_enum, RT286_HPO_MUX,
491 0, rt286_dac_src);
492
493static const struct snd_kcontrol_new rt286_hpo_mux =
494SOC_DAPM_ENUM("HPO source", rt286_hpo_enum);
495
496/* SPK-OUT source */
497static SOC_ENUM_SINGLE_DECL(rt286_spo_enum, RT286_SPK_MUX,
498 0, rt286_dac_src);
499
500static const struct snd_kcontrol_new rt286_spo_mux =
501SOC_DAPM_ENUM("SPO source", rt286_spo_enum);
502
503static int rt286_spk_event(struct snd_soc_dapm_widget *w,
504 struct snd_kcontrol *kcontrol, int event)
505{
506 struct snd_soc_codec *codec = w->codec;
507
508 switch (event) {
509 case SND_SOC_DAPM_POST_PMU:
510 snd_soc_write(codec,
511 RT286_SPK_EAPD, RT286_SET_EAPD_HIGH);
512 break;
513 case SND_SOC_DAPM_PRE_PMD:
514 snd_soc_write(codec,
515 RT286_SPK_EAPD, RT286_SET_EAPD_LOW);
516 break;
517
518 default:
519 return 0;
520 }
521
522 return 0;
523}
524
525static int rt286_set_dmic1_event(struct snd_soc_dapm_widget *w,
526 struct snd_kcontrol *kcontrol, int event)
527{
528 struct snd_soc_codec *codec = w->codec;
529
530 switch (event) {
531 case SND_SOC_DAPM_POST_PMU:
532 snd_soc_write(codec, RT286_SET_PIN_DMIC1, 0x20);
533 break;
534 case SND_SOC_DAPM_PRE_PMD:
535 snd_soc_write(codec, RT286_SET_PIN_DMIC1, 0);
536 break;
537 default:
538 return 0;
539 }
540
541 return 0;
542}
543
544static int rt286_adc_event(struct snd_soc_dapm_widget *w,
545 struct snd_kcontrol *kcontrol, int event)
546{
547 struct snd_soc_codec *codec = w->codec;
548 unsigned int nid;
549
550 nid = (w->reg >> 20) & 0xff;
551
552 switch (event) {
553 case SND_SOC_DAPM_POST_PMU:
554 snd_soc_update_bits(codec,
555 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0),
556 0x7080, 0x7000);
557 break;
558 case SND_SOC_DAPM_PRE_PMD:
559 snd_soc_update_bits(codec,
560 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0),
561 0x7080, 0x7080);
562 break;
563 default:
564 return 0;
565 }
566
567 return 0;
568}
569
570static const struct snd_soc_dapm_widget rt286_dapm_widgets[] = {
571 /* Input Lines */
572 SND_SOC_DAPM_INPUT("DMIC1 Pin"),
573 SND_SOC_DAPM_INPUT("DMIC2 Pin"),
574 SND_SOC_DAPM_INPUT("MIC1"),
575 SND_SOC_DAPM_INPUT("LINE1"),
576 SND_SOC_DAPM_INPUT("Beep"),
577
578 /* DMIC */
579 SND_SOC_DAPM_PGA_E("DMIC1", RT286_SET_POWER(RT286_DMIC1), 0, 1,
580 NULL, 0, rt286_set_dmic1_event,
581 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
582 SND_SOC_DAPM_PGA("DMIC2", RT286_SET_POWER(RT286_DMIC2), 0, 1,
583 NULL, 0),
584 SND_SOC_DAPM_SUPPLY("DMIC Receiver", SND_SOC_NOPM,
585 0, 0, NULL, 0),
586
587 /* REC Mixer */
588 SND_SOC_DAPM_MIXER("RECMIX", SND_SOC_NOPM, 0, 0,
589 rt286_rec_mix, ARRAY_SIZE(rt286_rec_mix)),
590
591 /* ADCs */
592 SND_SOC_DAPM_ADC("ADC 0", NULL, SND_SOC_NOPM, 0, 0),
593 SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM, 0, 0),
594
595 /* ADC Mux */
596 SND_SOC_DAPM_MUX_E("ADC 0 Mux", RT286_SET_POWER(RT286_ADC_IN1), 0, 1,
597 &rt286_adc0_mux, rt286_adc_event, SND_SOC_DAPM_PRE_PMD |
598 SND_SOC_DAPM_POST_PMU),
599 SND_SOC_DAPM_MUX_E("ADC 1 Mux", RT286_SET_POWER(RT286_ADC_IN2), 0, 1,
600 &rt286_adc1_mux, rt286_adc_event, SND_SOC_DAPM_PRE_PMD |
601 SND_SOC_DAPM_POST_PMU),
602
603 /* Audio Interface */
604 SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
605 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
606 SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
607 SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
608
609 /* Output Side */
610 /* DACs */
611 SND_SOC_DAPM_DAC("DAC 0", NULL, SND_SOC_NOPM, 0, 0),
612 SND_SOC_DAPM_DAC("DAC 1", NULL, SND_SOC_NOPM, 0, 0),
613
614 /* Output Mux */
615 SND_SOC_DAPM_MUX("SPK Mux", SND_SOC_NOPM, 0, 0, &rt286_spo_mux),
616 SND_SOC_DAPM_MUX("HPO Mux", SND_SOC_NOPM, 0, 0, &rt286_hpo_mux),
617
618 SND_SOC_DAPM_SUPPLY("HP Power", RT286_SET_PIN_HPO,
619 RT286_SET_PIN_SFT, 0, NULL, 0),
620
621 /* Output Mixer */
622 SND_SOC_DAPM_MIXER("Front", RT286_SET_POWER(RT286_DAC_OUT1), 0, 1,
623 rt286_front_mix, ARRAY_SIZE(rt286_front_mix)),
624 SND_SOC_DAPM_PGA("Surround", RT286_SET_POWER(RT286_DAC_OUT2), 0, 1,
625 NULL, 0),
626
627 /* Output Pga */
628 SND_SOC_DAPM_SWITCH_E("SPO", SND_SOC_NOPM, 0, 0,
629 &spo_enable_control, rt286_spk_event,
630 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
631 SND_SOC_DAPM_SWITCH("HPO L", SND_SOC_NOPM, 0, 0,
632 &hpol_enable_control),
633 SND_SOC_DAPM_SWITCH("HPO R", SND_SOC_NOPM, 0, 0,
634 &hpor_enable_control),
635
636 /* Output Lines */
637 SND_SOC_DAPM_OUTPUT("SPOL"),
638 SND_SOC_DAPM_OUTPUT("SPOR"),
639 SND_SOC_DAPM_OUTPUT("HPO Pin"),
640 SND_SOC_DAPM_OUTPUT("SPDIF"),
641};
642
643static const struct snd_soc_dapm_route rt286_dapm_routes[] = {
644 {"DMIC1", NULL, "DMIC1 Pin"},
645 {"DMIC2", NULL, "DMIC2 Pin"},
646 {"DMIC1", NULL, "DMIC Receiver"},
647 {"DMIC2", NULL, "DMIC Receiver"},
648
649 {"RECMIX", "Beep Switch", "Beep"},
650 {"RECMIX", "Line1 Switch", "LINE1"},
651 {"RECMIX", "Mic1 Switch", "MIC1"},
652
653 {"ADC 0 Mux", "Dmic", "DMIC1"},
654 {"ADC 0 Mux", "RECMIX", "RECMIX"},
655 {"ADC 0 Mux", "Mic", "MIC1"},
656 {"ADC 1 Mux", "Dmic", "DMIC2"},
657 {"ADC 1 Mux", "RECMIX", "RECMIX"},
658 {"ADC 1 Mux", "Mic", "MIC1"},
659
660 {"ADC 0", NULL, "ADC 0 Mux"},
661 {"ADC 1", NULL, "ADC 1 Mux"},
662
663 {"AIF1TX", NULL, "ADC 0"},
664 {"AIF2TX", NULL, "ADC 1"},
665
666 {"DAC 0", NULL, "AIF1RX"},
667 {"DAC 1", NULL, "AIF2RX"},
668
669 {"Front", "DAC Switch", "DAC 0"},
670 {"Front", "RECMIX Switch", "RECMIX"},
671
672 {"Surround", NULL, "DAC 1"},
673
674 {"SPK Mux", "Front", "Front"},
675 {"SPK Mux", "Surround", "Surround"},
676
677 {"HPO Mux", "Front", "Front"},
678 {"HPO Mux", "Surround", "Surround"},
679
680 {"SPO", "Switch", "SPK Mux"},
681 {"HPO L", "Switch", "HPO Mux"},
682 {"HPO R", "Switch", "HPO Mux"},
683 {"HPO L", NULL, "HP Power"},
684 {"HPO R", NULL, "HP Power"},
685
686 {"SPOL", NULL, "SPO"},
687 {"SPOR", NULL, "SPO"},
688 {"HPO Pin", NULL, "HPO L"},
689 {"HPO Pin", NULL, "HPO R"},
690};
691
692static int rt286_hw_params(struct snd_pcm_substream *substream,
693 struct snd_pcm_hw_params *params,
694 struct snd_soc_dai *dai)
695{
696 struct snd_soc_codec *codec = dai->codec;
697 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
698 unsigned int val = 0;
699 int d_len_code;
700
701 switch (params_rate(params)) {
702 /* bit 14 0:48K 1:44.1K */
703 case 44100:
704 val |= 0x4000;
705 break;
706 case 48000:
707 break;
708 default:
709 dev_err(codec->dev, "Unsupported sample rate %d\n",
710 params_rate(params));
711 return -EINVAL;
712 }
713 switch (rt286->sys_clk) {
714 case 12288000:
715 case 24576000:
716 if (params_rate(params) != 48000) {
717 dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n",
718 params_rate(params), rt286->sys_clk);
719 return -EINVAL;
720 }
721 break;
722 case 11289600:
723 case 22579200:
724 if (params_rate(params) != 44100) {
725 dev_err(codec->dev, "Sys_clk is not matched (%d %d)\n",
726 params_rate(params), rt286->sys_clk);
727 return -EINVAL;
728 }
729 break;
730 }
731
732 if (params_channels(params) <= 16) {
733 /* bit 3:0 Number of Channel */
734 val |= (params_channels(params) - 1);
735 } else {
736 dev_err(codec->dev, "Unsupported channels %d\n",
737 params_channels(params));
738 return -EINVAL;
739 }
740
741 d_len_code = 0;
742 switch (params_width(params)) {
743 /* bit 6:4 Bits per Sample */
744 case 16:
745 d_len_code = 0;
746 val |= (0x1 << 4);
747 break;
748 case 32:
749 d_len_code = 2;
750 val |= (0x4 << 4);
751 break;
752 case 20:
753 d_len_code = 1;
754 val |= (0x2 << 4);
755 break;
756 case 24:
757 d_len_code = 2;
758 val |= (0x3 << 4);
759 break;
760 case 8:
761 d_len_code = 3;
762 break;
763 default:
764 return -EINVAL;
765 }
766
767 snd_soc_update_bits(codec,
768 RT286_I2S_CTRL1, 0x0018, d_len_code << 3);
769 dev_dbg(codec->dev, "format val = 0x%x\n", val);
770
771 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
772 snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x407f, val);
773 else
774 snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x407f, val);
775
776 return 0;
777}
778
779static int rt286_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
780{
781 struct snd_soc_codec *codec = dai->codec;
782
783 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
784 case SND_SOC_DAIFMT_CBM_CFM:
785 snd_soc_update_bits(codec,
786 RT286_I2S_CTRL1, 0x800, 0x800);
787 break;
788 case SND_SOC_DAIFMT_CBS_CFS:
789 snd_soc_update_bits(codec,
790 RT286_I2S_CTRL1, 0x800, 0x0);
791 break;
792 default:
793 return -EINVAL;
794 }
795
796 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
797 case SND_SOC_DAIFMT_I2S:
798 snd_soc_update_bits(codec,
799 RT286_I2S_CTRL1, 0x300, 0x0);
800 break;
801 case SND_SOC_DAIFMT_LEFT_J:
802 snd_soc_update_bits(codec,
803 RT286_I2S_CTRL1, 0x300, 0x1 << 8);
804 break;
805 case SND_SOC_DAIFMT_DSP_A:
806 snd_soc_update_bits(codec,
807 RT286_I2S_CTRL1, 0x300, 0x2 << 8);
808 break;
809 case SND_SOC_DAIFMT_DSP_B:
810 snd_soc_update_bits(codec,
811 RT286_I2S_CTRL1, 0x300, 0x3 << 8);
812 break;
813 default:
814 return -EINVAL;
815 }
816 /* bit 15 Stream Type 0:PCM 1:Non-PCM */
817 snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x8000, 0);
818 snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x8000, 0);
819
820 return 0;
821}
822
823static int rt286_set_dai_sysclk(struct snd_soc_dai *dai,
824 int clk_id, unsigned int freq, int dir)
825{
826 struct snd_soc_codec *codec = dai->codec;
827 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
828
829 dev_dbg(codec->dev, "%s freq=%d\n", __func__, freq);
830
831 if (RT286_SCLK_S_MCLK == clk_id) {
832 snd_soc_update_bits(codec,
833 RT286_I2S_CTRL2, 0x0100, 0x0);
834 snd_soc_update_bits(codec,
835 RT286_PLL_CTRL1, 0x20, 0x20);
836 } else {
837 snd_soc_update_bits(codec,
838 RT286_I2S_CTRL2, 0x0100, 0x0100);
839 snd_soc_update_bits(codec,
840 RT286_PLL_CTRL, 0x4, 0x4);
841 snd_soc_update_bits(codec,
842 RT286_PLL_CTRL1, 0x20, 0x0);
843 }
844
845 switch (freq) {
846 case 19200000:
847 if (RT286_SCLK_S_MCLK == clk_id) {
848 dev_err(codec->dev, "Should not use MCLK\n");
849 return -EINVAL;
850 }
851 snd_soc_update_bits(codec,
852 RT286_I2S_CTRL2, 0x40, 0x40);
853 break;
854 case 24000000:
855 if (RT286_SCLK_S_MCLK == clk_id) {
856 dev_err(codec->dev, "Should not use MCLK\n");
857 return -EINVAL;
858 }
859 snd_soc_update_bits(codec,
860 RT286_I2S_CTRL2, 0x40, 0x0);
861 break;
862 case 12288000:
863 case 11289600:
864 snd_soc_update_bits(codec,
865 RT286_I2S_CTRL2, 0x8, 0x0);
866 snd_soc_update_bits(codec,
867 RT286_CLK_DIV, 0xfc1e, 0x0004);
868 break;
869 case 24576000:
870 case 22579200:
871 snd_soc_update_bits(codec,
872 RT286_I2S_CTRL2, 0x8, 0x8);
873 snd_soc_update_bits(codec,
874 RT286_CLK_DIV, 0xfc1e, 0x5406);
875 break;
876 default:
877 dev_err(codec->dev, "Unsupported system clock\n");
878 return -EINVAL;
879 }
880
881 rt286->sys_clk = freq;
882
883 return 0;
884}
885
886static int rt286_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
887{
888 struct snd_soc_codec *codec = dai->codec;
889
890 dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio);
891 if (50 == ratio)
892 snd_soc_update_bits(codec,
893 RT286_I2S_CTRL1, 0x1000, 0x1000);
894 else
895 snd_soc_update_bits(codec,
896 RT286_I2S_CTRL1, 0x1000, 0x0);
897
898
899 return 0;
900}
901
902static int rt286_set_bias_level(struct snd_soc_codec *codec,
903 enum snd_soc_bias_level level)
904{
905 switch (level) {
906 case SND_SOC_BIAS_PREPARE:
907 if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level) {
908 snd_soc_write(codec,
909 RT286_SET_AUDIO_POWER, AC_PWRST_D0);
910 snd_soc_update_bits(codec,
911 RT286_DC_GAIN, 0x200, 0x200);
912 }
913 break;
914
915 case SND_SOC_BIAS_ON:
916 mdelay(10);
917 break;
918
919 case SND_SOC_BIAS_STANDBY:
920 snd_soc_write(codec,
921 RT286_SET_AUDIO_POWER, AC_PWRST_D3);
922 snd_soc_update_bits(codec,
923 RT286_DC_GAIN, 0x200, 0x0);
924 break;
925
926 default:
927 break;
928 }
929 codec->dapm.bias_level = level;
930
931 return 0;
932}
933
934static irqreturn_t rt286_irq(int irq, void *data)
935{
936 struct rt286_priv *rt286 = data;
937 bool hp = false;
938 bool mic = false;
939 int status = 0;
940
941 rt286_jack_detect(rt286, &hp, &mic);
942
943 /* Clear IRQ */
944 regmap_update_bits(rt286->regmap, RT286_IRQ_CTRL, 0x1, 0x1);
945
946 if (hp == true)
947 status |= SND_JACK_HEADPHONE;
948
949 if (mic == true)
950 status |= SND_JACK_MICROPHONE;
951
952 snd_soc_jack_report(rt286->jack, status,
953 SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
954
955 pm_wakeup_event(&rt286->i2c->dev, 300);
956
957 return IRQ_HANDLED;
958}
959
960static int rt286_probe(struct snd_soc_codec *codec)
961{
962 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
963
964 codec->dapm.bias_level = SND_SOC_BIAS_OFF;
965
966 if (rt286->i2c->irq) {
967 regmap_update_bits(rt286->regmap,
968 RT286_IRQ_CTRL, 0x2, 0x2);
969
970 INIT_DELAYED_WORK(&rt286->jack_detect_work,
971 rt286_jack_detect_work);
972 schedule_delayed_work(&rt286->jack_detect_work,
973 msecs_to_jiffies(1250));
974 }
975
976 return 0;
977}
978
979static int rt286_remove(struct snd_soc_codec *codec)
980{
981 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
982
983 cancel_delayed_work_sync(&rt286->jack_detect_work);
984
985 return 0;
986}
987
988#ifdef CONFIG_PM
989static int rt286_suspend(struct snd_soc_codec *codec)
990{
991 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
992
993 regcache_cache_only(rt286->regmap, true);
994 regcache_mark_dirty(rt286->regmap);
995
996 return 0;
997}
998
999static int rt286_resume(struct snd_soc_codec *codec)
1000{
1001 struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
1002
1003 regcache_cache_only(rt286->regmap, false);
1004 rt286_index_sync(codec);
1005 regcache_sync(rt286->regmap);
1006
1007 return 0;
1008}
1009#else
1010#define rt286_suspend NULL
1011#define rt286_resume NULL
1012#endif
1013
1014#define RT286_STEREO_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1015#define RT286_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1016 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
1017
1018static const struct snd_soc_dai_ops rt286_aif_dai_ops = {
1019 .hw_params = rt286_hw_params,
1020 .set_fmt = rt286_set_dai_fmt,
1021 .set_sysclk = rt286_set_dai_sysclk,
1022 .set_bclk_ratio = rt286_set_bclk_ratio,
1023};
1024
1025static struct snd_soc_dai_driver rt286_dai[] = {
1026 {
1027 .name = "rt286-aif1",
1028 .id = RT286_AIF1,
1029 .playback = {
1030 .stream_name = "AIF1 Playback",
1031 .channels_min = 1,
1032 .channels_max = 2,
1033 .rates = RT286_STEREO_RATES,
1034 .formats = RT286_FORMATS,
1035 },
1036 .capture = {
1037 .stream_name = "AIF1 Capture",
1038 .channels_min = 1,
1039 .channels_max = 2,
1040 .rates = RT286_STEREO_RATES,
1041 .formats = RT286_FORMATS,
1042 },
1043 .ops = &rt286_aif_dai_ops,
1044 .symmetric_rates = 1,
1045 },
1046 {
1047 .name = "rt286-aif2",
1048 .id = RT286_AIF2,
1049 .playback = {
1050 .stream_name = "AIF2 Playback",
1051 .channels_min = 1,
1052 .channels_max = 2,
1053 .rates = RT286_STEREO_RATES,
1054 .formats = RT286_FORMATS,
1055 },
1056 .capture = {
1057 .stream_name = "AIF2 Capture",
1058 .channels_min = 1,
1059 .channels_max = 2,
1060 .rates = RT286_STEREO_RATES,
1061 .formats = RT286_FORMATS,
1062 },
1063 .ops = &rt286_aif_dai_ops,
1064 .symmetric_rates = 1,
1065 },
1066
1067};
1068
1069static struct snd_soc_codec_driver soc_codec_dev_rt286 = {
1070 .probe = rt286_probe,
1071 .remove = rt286_remove,
1072 .suspend = rt286_suspend,
1073 .resume = rt286_resume,
1074 .set_bias_level = rt286_set_bias_level,
1075 .idle_bias_off = true,
1076 .controls = rt286_snd_controls,
1077 .num_controls = ARRAY_SIZE(rt286_snd_controls),
1078 .dapm_widgets = rt286_dapm_widgets,
1079 .num_dapm_widgets = ARRAY_SIZE(rt286_dapm_widgets),
1080 .dapm_routes = rt286_dapm_routes,
1081 .num_dapm_routes = ARRAY_SIZE(rt286_dapm_routes),
1082};
1083
1084static const struct regmap_config rt286_regmap = {
1085 .reg_bits = 32,
1086 .val_bits = 32,
1087 .max_register = 0x02370100,
1088 .volatile_reg = rt286_volatile_register,
1089 .readable_reg = rt286_readable_register,
1090 .reg_write = rt286_hw_write,
1091 .reg_read = rt286_hw_read,
1092 .cache_type = REGCACHE_RBTREE,
1093 .reg_defaults = rt286_reg,
1094 .num_reg_defaults = ARRAY_SIZE(rt286_reg),
1095};
1096
1097static const struct i2c_device_id rt286_i2c_id[] = {
1098 {"rt286", 0},
1099 {}
1100};
1101MODULE_DEVICE_TABLE(i2c, rt286_i2c_id);
1102
1103static const struct acpi_device_id rt286_acpi_match[] = {
1104 { "INT343A", 0 },
1105 {},
1106};
1107MODULE_DEVICE_TABLE(acpi, rt286_acpi_match);
1108
1109static int rt286_i2c_probe(struct i2c_client *i2c,
1110 const struct i2c_device_id *id)
1111{
1112 struct rt286_platform_data *pdata = dev_get_platdata(&i2c->dev);
1113 struct rt286_priv *rt286;
1114 int i, ret;
1115
1116 rt286 = devm_kzalloc(&i2c->dev, sizeof(*rt286),
1117 GFP_KERNEL);
1118 if (NULL == rt286)
1119 return -ENOMEM;
1120
1121 rt286->regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt286_regmap);
1122 if (IS_ERR(rt286->regmap)) {
1123 ret = PTR_ERR(rt286->regmap);
1124 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
1125 ret);
1126 return ret;
1127 }
1128
1129 regmap_read(rt286->regmap,
1130 RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &ret);
1131 if (ret != RT286_VENDOR_ID) {
1132 dev_err(&i2c->dev,
1133 "Device with ID register %x is not rt286\n", ret);
1134 return -ENODEV;
1135 }
1136
1137 rt286->index_cache = rt286_index_def;
1138 rt286->i2c = i2c;
1139 i2c_set_clientdata(i2c, rt286);
1140
1141 if (pdata)
1142 rt286->pdata = *pdata;
1143
1144 regmap_write(rt286->regmap, RT286_SET_AUDIO_POWER, AC_PWRST_D3);
1145
1146 for (i = 0; i < RT286_POWER_REG_LEN; i++)
1147 regmap_write(rt286->regmap,
1148 RT286_SET_POWER(rt286_support_power_controls[i]),
1149 AC_PWRST_D1);
1150
1151 if (!rt286->pdata.cbj_en) {
1152 regmap_write(rt286->regmap, RT286_CBJ_CTRL2, 0x0000);
1153 regmap_write(rt286->regmap, RT286_MIC1_DET_CTRL, 0x0816);
1154 regmap_write(rt286->regmap, RT286_MISC_CTRL1, 0x0000);
1155 regmap_update_bits(rt286->regmap,
1156 RT286_CBJ_CTRL1, 0xf000, 0xb000);
1157 } else {
1158 regmap_update_bits(rt286->regmap,
1159 RT286_CBJ_CTRL1, 0xf000, 0x5000);
1160 }
1161
1162 mdelay(10);
1163
1164 if (!rt286->pdata.gpio2_en)
1165 regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0x4000);
1166 else
1167 regmap_write(rt286->regmap, RT286_SET_DMIC2_DEFAULT, 0);
1168
1169 mdelay(10);
1170
1171 /*Power down LDO2*/
1172 regmap_update_bits(rt286->regmap, RT286_POWER_CTRL2, 0x8, 0x0);
1173
1174 /*Set depop parameter*/
1175 regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL2, 0x403a, 0x401a);
1176 regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL3, 0xf777, 0x4737);
1177 regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL4, 0x00ff, 0x003f);
1178
1179 if (rt286->i2c->irq) {
1180 ret = request_threaded_irq(rt286->i2c->irq, NULL, rt286_irq,
1181 IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "rt286", rt286);
1182 if (ret != 0) {
1183 dev_err(&i2c->dev,
1184 "Failed to reguest IRQ: %d\n", ret);
1185 return ret;
1186 }
1187 }
1188
1189 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt286,
1190 rt286_dai, ARRAY_SIZE(rt286_dai));
1191
1192 return ret;
1193}
1194
1195static int rt286_i2c_remove(struct i2c_client *i2c)
1196{
1197 struct rt286_priv *rt286 = i2c_get_clientdata(i2c);
1198
1199 if (i2c->irq)
1200 free_irq(i2c->irq, rt286);
1201 snd_soc_unregister_codec(&i2c->dev);
1202
1203 return 0;
1204}
1205
1206
1207static struct i2c_driver rt286_i2c_driver = {
1208 .driver = {
1209 .name = "rt286",
1210 .owner = THIS_MODULE,
1211 .acpi_match_table = ACPI_PTR(rt286_acpi_match),
1212 },
1213 .probe = rt286_i2c_probe,
1214 .remove = rt286_i2c_remove,
1215 .id_table = rt286_i2c_id,
1216};
1217
1218module_i2c_driver(rt286_i2c_driver);
1219
1220MODULE_DESCRIPTION("ASoC RT286 driver");
1221MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
1222MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/rt286.h b/sound/soc/codecs/rt286.h
new file mode 100644
index 000000000000..b539b7320a79
--- /dev/null
+++ b/sound/soc/codecs/rt286.h
@@ -0,0 +1,198 @@
1/*
2 * rt286.h -- RT286 ALSA SoC audio driver
3 *
4 * Copyright 2011 Realtek Microelectronics
5 * Author: Johnny Hsu <johnnyhsu@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __RT286_H__
13#define __RT286_H__
14
15#define VERB_CMD(V, N, D) ((N << 20) | (V << 8) | D)
16
17#define RT286_AUDIO_FUNCTION_GROUP 0x01
18#define RT286_DAC_OUT1 0x02
19#define RT286_DAC_OUT2 0x03
20#define RT286_ADC_IN1 0x09
21#define RT286_ADC_IN2 0x08
22#define RT286_MIXER_IN 0x0b
23#define RT286_MIXER_OUT1 0x0c
24#define RT286_MIXER_OUT2 0x0d
25#define RT286_DMIC1 0x12
26#define RT286_DMIC2 0x13
27#define RT286_SPK_OUT 0x14
28#define RT286_MIC1 0x18
29#define RT286_LINE1 0x1a
30#define RT286_BEEP 0x1d
31#define RT286_SPDIF 0x1e
32#define RT286_VENDOR_REGISTERS 0x20
33#define RT286_HP_OUT 0x21
34#define RT286_MIXER_IN1 0x22
35#define RT286_MIXER_IN2 0x23
36
37#define RT286_SET_PIN_SFT 6
38#define RT286_SET_PIN_ENABLE 0x40
39#define RT286_SET_PIN_DISABLE 0
40#define RT286_SET_EAPD_HIGH 0x2
41#define RT286_SET_EAPD_LOW 0
42
43#define RT286_MUTE_SFT 7
44
45/* Verb commands */
46#define RT286_GET_PARAM(NID, PARAM) VERB_CMD(AC_VERB_PARAMETERS, NID, PARAM)
47#define RT286_SET_POWER(NID) VERB_CMD(AC_VERB_SET_POWER_STATE, NID, 0)
48#define RT286_SET_AUDIO_POWER RT286_SET_POWER(RT286_AUDIO_FUNCTION_GROUP)
49#define RT286_SET_HPO_POWER RT286_SET_POWER(RT286_HP_OUT)
50#define RT286_SET_SPK_POWER RT286_SET_POWER(RT286_SPK_OUT)
51#define RT286_SET_DMIC1_POWER RT286_SET_POWER(RT286_DMIC1)
52#define RT286_SPK_MUX\
53 VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_SPK_OUT, 0)
54#define RT286_HPO_MUX\
55 VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_HP_OUT, 0)
56#define RT286_ADC0_MUX\
57 VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_MIXER_IN1, 0)
58#define RT286_ADC1_MUX\
59 VERB_CMD(AC_VERB_SET_CONNECT_SEL, RT286_MIXER_IN2, 0)
60#define RT286_SET_MIC1\
61 VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_MIC1, 0)
62#define RT286_SET_PIN_HPO\
63 VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_HP_OUT, 0)
64#define RT286_SET_PIN_SPK\
65 VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_SPK_OUT, 0)
66#define RT286_SET_PIN_DMIC1\
67 VERB_CMD(AC_VERB_SET_PIN_WIDGET_CONTROL, RT286_DMIC1, 0)
68#define RT286_SPK_EAPD\
69 VERB_CMD(AC_VERB_SET_EAPD_BTLENABLE, RT286_SPK_OUT, 0)
70#define RT286_SET_AMP_GAIN_HPO\
71 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0)
72#define RT286_SET_AMP_GAIN_ADC_IN1\
73 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0)
74#define RT286_SET_AMP_GAIN_ADC_IN2\
75 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN2, 0)
76#define RT286_GET_HP_SENSE\
77 VERB_CMD(AC_VERB_GET_PIN_SENSE, RT286_HP_OUT, 0)
78#define RT286_GET_MIC1_SENSE\
79 VERB_CMD(AC_VERB_GET_PIN_SENSE, RT286_MIC1, 0)
80#define RT286_SET_DMIC2_DEFAULT\
81 VERB_CMD(AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, RT286_DMIC2, 0)
82#define RT286_DACL_GAIN\
83 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_DAC_OUT1, 0xa000)
84#define RT286_DACR_GAIN\
85 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_DAC_OUT1, 0x9000)
86#define RT286_ADCL_GAIN\
87 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0x6000)
88#define RT286_ADCR_GAIN\
89 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_ADC_IN1, 0x5000)
90#define RT286_MIC_GAIN\
91 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIC1, 0x7000)
92#define RT286_SPOL_GAIN\
93 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_SPK_OUT, 0xa000)
94#define RT286_SPOR_GAIN\
95 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_SPK_OUT, 0x9000)
96#define RT286_HPOL_GAIN\
97 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0xa000)
98#define RT286_HPOR_GAIN\
99 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_HP_OUT, 0x9000)
100#define RT286_F_DAC_SWITCH\
101 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_OUT1, 0x7000)
102#define RT286_F_RECMIX_SWITCH\
103 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_OUT1, 0x7100)
104#define RT286_REC_MIC_SWITCH\
105 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7000)
106#define RT286_REC_I2S_SWITCH\
107 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7100)
108#define RT286_REC_LINE_SWITCH\
109 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7200)
110#define RT286_REC_BEEP_SWITCH\
111 VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, RT286_MIXER_IN, 0x7300)
112#define RT286_DAC_FORMAT\
113 VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT286_DAC_OUT1, 0)
114#define RT286_ADC_FORMAT\
115 VERB_CMD(AC_VERB_SET_STREAM_FORMAT, RT286_ADC_IN1, 0)
116#define RT286_COEF_INDEX\
117 VERB_CMD(AC_VERB_SET_COEF_INDEX, RT286_VENDOR_REGISTERS, 0)
118#define RT286_PROC_COEF\
119 VERB_CMD(AC_VERB_SET_PROC_COEF, RT286_VENDOR_REGISTERS, 0)
120
121/* Index registers */
122#define RT286_A_BIAS_CTRL1 0x01
123#define RT286_A_BIAS_CTRL2 0x02
124#define RT286_POWER_CTRL1 0x03
125#define RT286_A_BIAS_CTRL3 0x04
126#define RT286_POWER_CTRL2 0x08
127#define RT286_I2S_CTRL1 0x09
128#define RT286_I2S_CTRL2 0x0a
129#define RT286_CLK_DIV 0x0b
130#define RT286_DC_GAIN 0x0d
131#define RT286_POWER_CTRL3 0x0f
132#define RT286_MIC1_DET_CTRL 0x19
133#define RT286_MISC_CTRL1 0x20
134#define RT286_IRQ_CTRL 0x33
135#define RT286_PLL_CTRL1 0x49
136#define RT286_CBJ_CTRL1 0x4f
137#define RT286_CBJ_CTRL2 0x50
138#define RT286_PLL_CTRL 0x63
139#define RT286_DEPOP_CTRL1 0x66
140#define RT286_DEPOP_CTRL2 0x67
141#define RT286_DEPOP_CTRL3 0x68
142#define RT286_DEPOP_CTRL4 0x69
143
144/* SPDIF (0x06) */
145#define RT286_SPDIF_SEL_SFT 0
146#define RT286_SPDIF_SEL_PCM0 0
147#define RT286_SPDIF_SEL_PCM1 1
148#define RT286_SPDIF_SEL_SPOUT 2
149#define RT286_SPDIF_SEL_PP 3
150
151/* RECMIX (0x0b) */
152#define RT286_M_REC_BEEP_SFT 0
153#define RT286_M_REC_LINE1_SFT 1
154#define RT286_M_REC_MIC1_SFT 2
155#define RT286_M_REC_I2S_SFT 3
156
157/* Front (0x0c) */
158#define RT286_M_FRONT_DAC_SFT 0
159#define RT286_M_FRONT_REC_SFT 1
160
161/* SPK-OUT (0x14) */
162#define RT286_M_SPK_MUX_SFT 14
163#define RT286_SPK_SEL_MASK 0x1
164#define RT286_SPK_SEL_SFT 0
165#define RT286_SPK_SEL_F 0
166#define RT286_SPK_SEL_S 1
167
168/* HP-OUT (0x21) */
169#define RT286_M_HP_MUX_SFT 14
170#define RT286_HP_SEL_MASK 0x1
171#define RT286_HP_SEL_SFT 0
172#define RT286_HP_SEL_F 0
173#define RT286_HP_SEL_S 1
174
175/* ADC (0x22) (0x23) */
176#define RT286_ADC_SEL_MASK 0x7
177#define RT286_ADC_SEL_SFT 0
178#define RT286_ADC_SEL_SURR 0
179#define RT286_ADC_SEL_FRONT 1
180#define RT286_ADC_SEL_DMIC 2
181#define RT286_ADC_SEL_BEEP 4
182#define RT286_ADC_SEL_LINE1 5
183#define RT286_ADC_SEL_I2S 6
184#define RT286_ADC_SEL_MIC1 7
185
186#define RT286_SCLK_S_MCLK 0
187#define RT286_SCLK_S_PLL 1
188
189enum {
190 RT286_AIF1,
191 RT286_AIF2,
192 RT286_AIFS,
193};
194
195int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
196
197#endif /* __RT286_H__ */
198
diff --git a/sound/soc/codecs/rt5631.c b/sound/soc/codecs/rt5631.c
index 30e234708579..1ba27db660a6 100644
--- a/sound/soc/codecs/rt5631.c
+++ b/sound/soc/codecs/rt5631.c
@@ -1370,16 +1370,16 @@ static int rt5631_hifi_pcm_params(struct snd_pcm_substream *substream,
1370 return coeff; 1370 return coeff;
1371 } 1371 }
1372 1372
1373 switch (params_format(params)) { 1373 switch (params_width(params)) {
1374 case SNDRV_PCM_FORMAT_S16_LE: 1374 case 16:
1375 break; 1375 break;
1376 case SNDRV_PCM_FORMAT_S20_3LE: 1376 case 20:
1377 iface |= RT5631_SDP_I2S_DL_20; 1377 iface |= RT5631_SDP_I2S_DL_20;
1378 break; 1378 break;
1379 case SNDRV_PCM_FORMAT_S24_LE: 1379 case 24:
1380 iface |= RT5631_SDP_I2S_DL_24; 1380 iface |= RT5631_SDP_I2S_DL_24;
1381 break; 1381 break;
1382 case SNDRV_PCM_FORMAT_S8: 1382 case 8:
1383 iface |= RT5631_SDP_I2S_DL_8; 1383 iface |= RT5631_SDP_I2S_DL_8;
1384 break; 1384 break;
1385 default: 1385 default:
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c
index de80e89b5fd8..6bc6efdec550 100644
--- a/sound/soc/codecs/rt5640.c
+++ b/sound/soc/codecs/rt5640.c
@@ -2215,14 +2215,8 @@ static int rt5640_i2c_probe(struct i2c_client *i2c,
2215 2215
2216 rt5640->hp_mute = 1; 2216 rt5640->hp_mute = 1;
2217 2217
2218 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640, 2218 return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640,
2219 rt5640_dai, ARRAY_SIZE(rt5640_dai)); 2219 rt5640_dai, ARRAY_SIZE(rt5640_dai));
2220 if (ret < 0)
2221 goto err;
2222
2223 return 0;
2224err:
2225 return ret;
2226} 2220}
2227 2221
2228static int rt5640_i2c_remove(struct i2c_client *i2c) 2222static int rt5640_i2c_remove(struct i2c_client *i2c)
diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index 02147be2b302..a7762d0a623e 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -2345,14 +2345,8 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
2345 2345
2346 } 2346 }
2347 2347
2348 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5645, 2348 return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5645,
2349 rt5645_dai, ARRAY_SIZE(rt5645_dai)); 2349 rt5645_dai, ARRAY_SIZE(rt5645_dai));
2350 if (ret < 0)
2351 goto err;
2352
2353 return 0;
2354err:
2355 return ret;
2356} 2350}
2357 2351
2358static int rt5645_i2c_remove(struct i2c_client *i2c) 2352static int rt5645_i2c_remove(struct i2c_client *i2c)
diff --git a/sound/soc/codecs/rt5651.c b/sound/soc/codecs/rt5651.c
index ea4b1c652a26..bb0a3ab5416c 100644
--- a/sound/soc/codecs/rt5651.c
+++ b/sound/soc/codecs/rt5651.c
@@ -1366,16 +1366,16 @@ static int rt5651_hw_params(struct snd_pcm_substream *substream,
1366 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", 1366 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
1367 bclk_ms, pre_div, dai->id); 1367 bclk_ms, pre_div, dai->id);
1368 1368
1369 switch (params_format(params)) { 1369 switch (params_width(params)) {
1370 case SNDRV_PCM_FORMAT_S16_LE: 1370 case 16:
1371 break; 1371 break;
1372 case SNDRV_PCM_FORMAT_S20_3LE: 1372 case 20:
1373 val_len |= RT5651_I2S_DL_20; 1373 val_len |= RT5651_I2S_DL_20;
1374 break; 1374 break;
1375 case SNDRV_PCM_FORMAT_S24_LE: 1375 case 24:
1376 val_len |= RT5651_I2S_DL_24; 1376 val_len |= RT5651_I2S_DL_24;
1377 break; 1377 break;
1378 case SNDRV_PCM_FORMAT_S8: 1378 case 8:
1379 val_len |= RT5651_I2S_DL_8; 1379 val_len |= RT5651_I2S_DL_8;
1380 break; 1380 break;
1381 default: 1381 default:
diff --git a/sound/soc/codecs/rt5670-dsp.h b/sound/soc/codecs/rt5670-dsp.h
new file mode 100644
index 000000000000..a34d0cdb8198
--- /dev/null
+++ b/sound/soc/codecs/rt5670-dsp.h
@@ -0,0 +1,54 @@
1/*
2 * rt5670-dsp.h -- RT5670 ALSA SoC DSP driver
3 *
4 * Copyright 2014 Realtek Microelectronics
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __RT5670_DSP_H__
13#define __RT5670_DSP_H__
14
15#define RT5670_DSP_CTRL1 0xe0
16#define RT5670_DSP_CTRL2 0xe1
17#define RT5670_DSP_CTRL3 0xe2
18#define RT5670_DSP_CTRL4 0xe3
19#define RT5670_DSP_CTRL5 0xe4
20
21/* DSP Control 1 (0xe0) */
22#define RT5670_DSP_CMD_MASK (0xff << 8)
23#define RT5670_DSP_CMD_PE (0x0d << 8) /* Patch Entry */
24#define RT5670_DSP_CMD_MW (0x3b << 8) /* Memory Write */
25#define RT5670_DSP_CMD_MR (0x37 << 8) /* Memory Read */
26#define RT5670_DSP_CMD_RR (0x60 << 8) /* Register Read */
27#define RT5670_DSP_CMD_RW (0x68 << 8) /* Register Write */
28#define RT5670_DSP_REG_DATHI (0x26 << 8) /* High Data Addr */
29#define RT5670_DSP_REG_DATLO (0x25 << 8) /* Low Data Addr */
30#define RT5670_DSP_CLK_MASK (0x3 << 6)
31#define RT5670_DSP_CLK_SFT 6
32#define RT5670_DSP_CLK_768K (0x0 << 6)
33#define RT5670_DSP_CLK_384K (0x1 << 6)
34#define RT5670_DSP_CLK_192K (0x2 << 6)
35#define RT5670_DSP_CLK_96K (0x3 << 6)
36#define RT5670_DSP_BUSY_MASK (0x1 << 5)
37#define RT5670_DSP_RW_MASK (0x1 << 4)
38#define RT5670_DSP_DL_MASK (0x3 << 2)
39#define RT5670_DSP_DL_0 (0x0 << 2)
40#define RT5670_DSP_DL_1 (0x1 << 2)
41#define RT5670_DSP_DL_2 (0x2 << 2)
42#define RT5670_DSP_DL_3 (0x3 << 2)
43#define RT5670_DSP_I2C_AL_16 (0x1 << 1)
44#define RT5670_DSP_CMD_EN (0x1)
45
46struct rt5670_dsp_param {
47 u16 cmd_fmt;
48 u16 addr;
49 u16 data;
50 u8 cmd;
51};
52
53#endif /* __RT5670_DSP_H__ */
54
diff --git a/sound/soc/codecs/rt5670.c b/sound/soc/codecs/rt5670.c
new file mode 100644
index 000000000000..ba9d9b4d4857
--- /dev/null
+++ b/sound/soc/codecs/rt5670.c
@@ -0,0 +1,2657 @@
1/*
2 * rt5670.c -- RT5670 ALSA SoC audio codec driver
3 *
4 * Copyright 2014 Realtek Semiconductor Corp.
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <linux/init.h>
15#include <linux/delay.h>
16#include <linux/pm.h>
17#include <linux/i2c.h>
18#include <linux/platform_device.h>
19#include <linux/spi/spi.h>
20#include <sound/core.h>
21#include <sound/pcm.h>
22#include <sound/pcm_params.h>
23#include <sound/jack.h>
24#include <sound/soc.h>
25#include <sound/soc-dapm.h>
26#include <sound/initval.h>
27#include <sound/tlv.h>
28#include <sound/rt5670.h>
29
30#include "rl6231.h"
31#include "rt5670.h"
32#include "rt5670-dsp.h"
33
34#define RT5670_DEVICE_ID 0x6271
35
36#define RT5670_PR_RANGE_BASE (0xff + 1)
37#define RT5670_PR_SPACING 0x100
38
39#define RT5670_PR_BASE (RT5670_PR_RANGE_BASE + (0 * RT5670_PR_SPACING))
40
41static const struct regmap_range_cfg rt5670_ranges[] = {
42 { .name = "PR", .range_min = RT5670_PR_BASE,
43 .range_max = RT5670_PR_BASE + 0xf8,
44 .selector_reg = RT5670_PRIV_INDEX,
45 .selector_mask = 0xff,
46 .selector_shift = 0x0,
47 .window_start = RT5670_PRIV_DATA,
48 .window_len = 0x1, },
49};
50
51static struct reg_default init_list[] = {
52 { RT5670_PR_BASE + 0x14, 0x9a8a },
53 { RT5670_PR_BASE + 0x38, 0x3ba1 },
54 { RT5670_PR_BASE + 0x3d, 0x3640 },
55};
56#define RT5670_INIT_REG_LEN ARRAY_SIZE(init_list)
57
58static const struct reg_default rt5670_reg[] = {
59 { 0x00, 0x0000 },
60 { 0x02, 0x8888 },
61 { 0x03, 0x8888 },
62 { 0x0a, 0x0001 },
63 { 0x0b, 0x0827 },
64 { 0x0c, 0x0000 },
65 { 0x0d, 0x0008 },
66 { 0x0e, 0x0000 },
67 { 0x0f, 0x0808 },
68 { 0x19, 0xafaf },
69 { 0x1a, 0xafaf },
70 { 0x1b, 0x0011 },
71 { 0x1c, 0x2f2f },
72 { 0x1d, 0x2f2f },
73 { 0x1e, 0x0000 },
74 { 0x1f, 0x2f2f },
75 { 0x20, 0x0000 },
76 { 0x26, 0x7860 },
77 { 0x27, 0x7860 },
78 { 0x28, 0x7871 },
79 { 0x29, 0x8080 },
80 { 0x2a, 0x5656 },
81 { 0x2b, 0x5454 },
82 { 0x2c, 0xaaa0 },
83 { 0x2d, 0x0000 },
84 { 0x2e, 0x2f2f },
85 { 0x2f, 0x1002 },
86 { 0x30, 0x0000 },
87 { 0x31, 0x5f00 },
88 { 0x32, 0x0000 },
89 { 0x33, 0x0000 },
90 { 0x34, 0x0000 },
91 { 0x35, 0x0000 },
92 { 0x36, 0x0000 },
93 { 0x37, 0x0000 },
94 { 0x38, 0x0000 },
95 { 0x3b, 0x0000 },
96 { 0x3c, 0x007f },
97 { 0x3d, 0x0000 },
98 { 0x3e, 0x007f },
99 { 0x45, 0xe00f },
100 { 0x4c, 0x5380 },
101 { 0x4f, 0x0073 },
102 { 0x52, 0x00d3 },
103 { 0x53, 0xf0f0 },
104 { 0x61, 0x0000 },
105 { 0x62, 0x0001 },
106 { 0x63, 0x00c3 },
107 { 0x64, 0x0000 },
108 { 0x65, 0x0000 },
109 { 0x66, 0x0000 },
110 { 0x6f, 0x8000 },
111 { 0x70, 0x8000 },
112 { 0x71, 0x8000 },
113 { 0x72, 0x8000 },
114 { 0x73, 0x1110 },
115 { 0x74, 0x0e00 },
116 { 0x75, 0x1505 },
117 { 0x76, 0x0015 },
118 { 0x77, 0x0c00 },
119 { 0x78, 0x4000 },
120 { 0x79, 0x0123 },
121 { 0x7f, 0x1100 },
122 { 0x80, 0x0000 },
123 { 0x81, 0x0000 },
124 { 0x82, 0x0000 },
125 { 0x83, 0x0000 },
126 { 0x84, 0x0000 },
127 { 0x85, 0x0000 },
128 { 0x86, 0x0008 },
129 { 0x87, 0x0000 },
130 { 0x88, 0x0000 },
131 { 0x89, 0x0000 },
132 { 0x8a, 0x0000 },
133 { 0x8b, 0x0000 },
134 { 0x8c, 0x0007 },
135 { 0x8d, 0x0000 },
136 { 0x8e, 0x0004 },
137 { 0x8f, 0x1100 },
138 { 0x90, 0x0646 },
139 { 0x91, 0x0c06 },
140 { 0x93, 0x0000 },
141 { 0x94, 0x0000 },
142 { 0x95, 0x0000 },
143 { 0x97, 0x0000 },
144 { 0x98, 0x0000 },
145 { 0x99, 0x0000 },
146 { 0x9a, 0x2184 },
147 { 0x9b, 0x010a },
148 { 0x9c, 0x0aea },
149 { 0x9d, 0x000c },
150 { 0x9e, 0x0400 },
151 { 0xae, 0x7000 },
152 { 0xaf, 0x0000 },
153 { 0xb0, 0x6000 },
154 { 0xb1, 0x0000 },
155 { 0xb2, 0x0000 },
156 { 0xb3, 0x001f },
157 { 0xb4, 0x2206 },
158 { 0xb5, 0x1f00 },
159 { 0xb6, 0x0000 },
160 { 0xb7, 0x0000 },
161 { 0xbb, 0x0000 },
162 { 0xbc, 0x0000 },
163 { 0xbd, 0x0000 },
164 { 0xbe, 0x0000 },
165 { 0xbf, 0x0000 },
166 { 0xc0, 0x0000 },
167 { 0xc1, 0x0000 },
168 { 0xc2, 0x0000 },
169 { 0xcd, 0x0000 },
170 { 0xce, 0x0000 },
171 { 0xcf, 0x1813 },
172 { 0xd0, 0x0690 },
173 { 0xd1, 0x1c17 },
174 { 0xd3, 0xb320 },
175 { 0xd4, 0x0000 },
176 { 0xd6, 0x0400 },
177 { 0xd9, 0x0809 },
178 { 0xda, 0x0000 },
179 { 0xdb, 0x0001 },
180 { 0xdc, 0x0049 },
181 { 0xdd, 0x0009 },
182 { 0xe6, 0x8000 },
183 { 0xe7, 0x0000 },
184 { 0xec, 0xb300 },
185 { 0xed, 0x0000 },
186 { 0xee, 0xb300 },
187 { 0xef, 0x0000 },
188 { 0xf8, 0x0000 },
189 { 0xf9, 0x0000 },
190 { 0xfa, 0x8010 },
191 { 0xfb, 0x0033 },
192 { 0xfc, 0x0080 },
193};
194
195static bool rt5670_volatile_register(struct device *dev, unsigned int reg)
196{
197 int i;
198
199 for (i = 0; i < ARRAY_SIZE(rt5670_ranges); i++) {
200 if ((reg >= rt5670_ranges[i].window_start &&
201 reg <= rt5670_ranges[i].window_start +
202 rt5670_ranges[i].window_len) ||
203 (reg >= rt5670_ranges[i].range_min &&
204 reg <= rt5670_ranges[i].range_max)) {
205 return true;
206 }
207 }
208
209 switch (reg) {
210 case RT5670_RESET:
211 case RT5670_PDM_DATA_CTRL1:
212 case RT5670_PDM1_DATA_CTRL4:
213 case RT5670_PDM2_DATA_CTRL4:
214 case RT5670_PRIV_DATA:
215 case RT5670_ASRC_5:
216 case RT5670_CJ_CTRL1:
217 case RT5670_CJ_CTRL2:
218 case RT5670_CJ_CTRL3:
219 case RT5670_A_JD_CTRL1:
220 case RT5670_A_JD_CTRL2:
221 case RT5670_VAD_CTRL5:
222 case RT5670_ADC_EQ_CTRL1:
223 case RT5670_EQ_CTRL1:
224 case RT5670_ALC_CTRL_1:
225 case RT5670_IRQ_CTRL1:
226 case RT5670_IRQ_CTRL2:
227 case RT5670_INT_IRQ_ST:
228 case RT5670_IL_CMD:
229 case RT5670_DSP_CTRL1:
230 case RT5670_DSP_CTRL2:
231 case RT5670_DSP_CTRL3:
232 case RT5670_DSP_CTRL4:
233 case RT5670_DSP_CTRL5:
234 case RT5670_VENDOR_ID:
235 case RT5670_VENDOR_ID1:
236 case RT5670_VENDOR_ID2:
237 return true;
238 default:
239 return false;
240 }
241}
242
243static bool rt5670_readable_register(struct device *dev, unsigned int reg)
244{
245 int i;
246
247 for (i = 0; i < ARRAY_SIZE(rt5670_ranges); i++) {
248 if ((reg >= rt5670_ranges[i].window_start &&
249 reg <= rt5670_ranges[i].window_start +
250 rt5670_ranges[i].window_len) ||
251 (reg >= rt5670_ranges[i].range_min &&
252 reg <= rt5670_ranges[i].range_max)) {
253 return true;
254 }
255 }
256
257 switch (reg) {
258 case RT5670_RESET:
259 case RT5670_HP_VOL:
260 case RT5670_LOUT1:
261 case RT5670_CJ_CTRL1:
262 case RT5670_CJ_CTRL2:
263 case RT5670_CJ_CTRL3:
264 case RT5670_IN2:
265 case RT5670_INL1_INR1_VOL:
266 case RT5670_DAC1_DIG_VOL:
267 case RT5670_DAC2_DIG_VOL:
268 case RT5670_DAC_CTRL:
269 case RT5670_STO1_ADC_DIG_VOL:
270 case RT5670_MONO_ADC_DIG_VOL:
271 case RT5670_STO2_ADC_DIG_VOL:
272 case RT5670_ADC_BST_VOL1:
273 case RT5670_ADC_BST_VOL2:
274 case RT5670_STO2_ADC_MIXER:
275 case RT5670_STO1_ADC_MIXER:
276 case RT5670_MONO_ADC_MIXER:
277 case RT5670_AD_DA_MIXER:
278 case RT5670_STO_DAC_MIXER:
279 case RT5670_DD_MIXER:
280 case RT5670_DIG_MIXER:
281 case RT5670_DSP_PATH1:
282 case RT5670_DSP_PATH2:
283 case RT5670_DIG_INF1_DATA:
284 case RT5670_DIG_INF2_DATA:
285 case RT5670_PDM_OUT_CTRL:
286 case RT5670_PDM_DATA_CTRL1:
287 case RT5670_PDM1_DATA_CTRL2:
288 case RT5670_PDM1_DATA_CTRL3:
289 case RT5670_PDM1_DATA_CTRL4:
290 case RT5670_PDM2_DATA_CTRL2:
291 case RT5670_PDM2_DATA_CTRL3:
292 case RT5670_PDM2_DATA_CTRL4:
293 case RT5670_REC_L1_MIXER:
294 case RT5670_REC_L2_MIXER:
295 case RT5670_REC_R1_MIXER:
296 case RT5670_REC_R2_MIXER:
297 case RT5670_HPO_MIXER:
298 case RT5670_MONO_MIXER:
299 case RT5670_OUT_L1_MIXER:
300 case RT5670_OUT_R1_MIXER:
301 case RT5670_LOUT_MIXER:
302 case RT5670_PWR_DIG1:
303 case RT5670_PWR_DIG2:
304 case RT5670_PWR_ANLG1:
305 case RT5670_PWR_ANLG2:
306 case RT5670_PWR_MIXER:
307 case RT5670_PWR_VOL:
308 case RT5670_PRIV_INDEX:
309 case RT5670_PRIV_DATA:
310 case RT5670_I2S4_SDP:
311 case RT5670_I2S1_SDP:
312 case RT5670_I2S2_SDP:
313 case RT5670_I2S3_SDP:
314 case RT5670_ADDA_CLK1:
315 case RT5670_ADDA_CLK2:
316 case RT5670_DMIC_CTRL1:
317 case RT5670_DMIC_CTRL2:
318 case RT5670_TDM_CTRL_1:
319 case RT5670_TDM_CTRL_2:
320 case RT5670_TDM_CTRL_3:
321 case RT5670_DSP_CLK:
322 case RT5670_GLB_CLK:
323 case RT5670_PLL_CTRL1:
324 case RT5670_PLL_CTRL2:
325 case RT5670_ASRC_1:
326 case RT5670_ASRC_2:
327 case RT5670_ASRC_3:
328 case RT5670_ASRC_4:
329 case RT5670_ASRC_5:
330 case RT5670_ASRC_7:
331 case RT5670_ASRC_8:
332 case RT5670_ASRC_9:
333 case RT5670_ASRC_10:
334 case RT5670_ASRC_11:
335 case RT5670_ASRC_12:
336 case RT5670_ASRC_13:
337 case RT5670_ASRC_14:
338 case RT5670_DEPOP_M1:
339 case RT5670_DEPOP_M2:
340 case RT5670_DEPOP_M3:
341 case RT5670_CHARGE_PUMP:
342 case RT5670_MICBIAS:
343 case RT5670_A_JD_CTRL1:
344 case RT5670_A_JD_CTRL2:
345 case RT5670_VAD_CTRL1:
346 case RT5670_VAD_CTRL2:
347 case RT5670_VAD_CTRL3:
348 case RT5670_VAD_CTRL4:
349 case RT5670_VAD_CTRL5:
350 case RT5670_ADC_EQ_CTRL1:
351 case RT5670_ADC_EQ_CTRL2:
352 case RT5670_EQ_CTRL1:
353 case RT5670_EQ_CTRL2:
354 case RT5670_ALC_DRC_CTRL1:
355 case RT5670_ALC_DRC_CTRL2:
356 case RT5670_ALC_CTRL_1:
357 case RT5670_ALC_CTRL_2:
358 case RT5670_ALC_CTRL_3:
359 case RT5670_JD_CTRL:
360 case RT5670_IRQ_CTRL1:
361 case RT5670_IRQ_CTRL2:
362 case RT5670_INT_IRQ_ST:
363 case RT5670_GPIO_CTRL1:
364 case RT5670_GPIO_CTRL2:
365 case RT5670_GPIO_CTRL3:
366 case RT5670_SCRABBLE_FUN:
367 case RT5670_SCRABBLE_CTRL:
368 case RT5670_BASE_BACK:
369 case RT5670_MP3_PLUS1:
370 case RT5670_MP3_PLUS2:
371 case RT5670_ADJ_HPF1:
372 case RT5670_ADJ_HPF2:
373 case RT5670_HP_CALIB_AMP_DET:
374 case RT5670_SV_ZCD1:
375 case RT5670_SV_ZCD2:
376 case RT5670_IL_CMD:
377 case RT5670_IL_CMD2:
378 case RT5670_IL_CMD3:
379 case RT5670_DRC_HL_CTRL1:
380 case RT5670_DRC_HL_CTRL2:
381 case RT5670_ADC_MONO_HP_CTRL1:
382 case RT5670_ADC_MONO_HP_CTRL2:
383 case RT5670_ADC_STO2_HP_CTRL1:
384 case RT5670_ADC_STO2_HP_CTRL2:
385 case RT5670_JD_CTRL3:
386 case RT5670_JD_CTRL4:
387 case RT5670_DIG_MISC:
388 case RT5670_DSP_CTRL1:
389 case RT5670_DSP_CTRL2:
390 case RT5670_DSP_CTRL3:
391 case RT5670_DSP_CTRL4:
392 case RT5670_DSP_CTRL5:
393 case RT5670_GEN_CTRL2:
394 case RT5670_GEN_CTRL3:
395 case RT5670_VENDOR_ID:
396 case RT5670_VENDOR_ID1:
397 case RT5670_VENDOR_ID2:
398 return true;
399 default:
400 return false;
401 }
402}
403
404static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
405static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
406static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
407static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
408static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
409
410/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
411static unsigned int bst_tlv[] = {
412 TLV_DB_RANGE_HEAD(7),
413 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
414 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
415 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
416 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
417 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
418 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
419 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0),
420};
421
422/* Interface data select */
423static const char * const rt5670_data_select[] = {
424 "Normal", "Swap", "left copy to right", "right copy to left"
425};
426
427static SOC_ENUM_SINGLE_DECL(rt5670_if2_dac_enum, RT5670_DIG_INF1_DATA,
428 RT5670_IF2_DAC_SEL_SFT, rt5670_data_select);
429
430static SOC_ENUM_SINGLE_DECL(rt5670_if2_adc_enum, RT5670_DIG_INF1_DATA,
431 RT5670_IF2_ADC_SEL_SFT, rt5670_data_select);
432
433static const struct snd_kcontrol_new rt5670_snd_controls[] = {
434 /* Headphone Output Volume */
435 SOC_DOUBLE("HP Playback Switch", RT5670_HP_VOL,
436 RT5670_L_MUTE_SFT, RT5670_R_MUTE_SFT, 1, 1),
437 SOC_DOUBLE_TLV("HP Playback Volume", RT5670_HP_VOL,
438 RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
439 39, 0, out_vol_tlv),
440 /* OUTPUT Control */
441 SOC_DOUBLE("OUT Channel Switch", RT5670_LOUT1,
442 RT5670_VOL_L_SFT, RT5670_VOL_R_SFT, 1, 1),
443 SOC_DOUBLE_TLV("OUT Playback Volume", RT5670_LOUT1,
444 RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 39, 1, out_vol_tlv),
445 /* DAC Digital Volume */
446 SOC_DOUBLE("DAC2 Playback Switch", RT5670_DAC_CTRL,
447 RT5670_M_DAC_L2_VOL_SFT, RT5670_M_DAC_R2_VOL_SFT, 1, 1),
448 SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5670_DAC1_DIG_VOL,
449 RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
450 175, 0, dac_vol_tlv),
451 SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5670_DAC2_DIG_VOL,
452 RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
453 175, 0, dac_vol_tlv),
454 /* IN1/IN2 Control */
455 SOC_SINGLE_TLV("IN1 Boost Volume", RT5670_CJ_CTRL1,
456 RT5670_BST_SFT1, 8, 0, bst_tlv),
457 SOC_SINGLE_TLV("IN2 Boost Volume", RT5670_IN2,
458 RT5670_BST_SFT1, 8, 0, bst_tlv),
459 /* INL/INR Volume Control */
460 SOC_DOUBLE_TLV("IN Capture Volume", RT5670_INL1_INR1_VOL,
461 RT5670_INL_VOL_SFT, RT5670_INR_VOL_SFT,
462 31, 1, in_vol_tlv),
463 /* ADC Digital Volume Control */
464 SOC_DOUBLE("ADC Capture Switch", RT5670_STO1_ADC_DIG_VOL,
465 RT5670_L_MUTE_SFT, RT5670_R_MUTE_SFT, 1, 1),
466 SOC_DOUBLE_TLV("ADC Capture Volume", RT5670_STO1_ADC_DIG_VOL,
467 RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
468 127, 0, adc_vol_tlv),
469
470 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5670_MONO_ADC_DIG_VOL,
471 RT5670_L_VOL_SFT, RT5670_R_VOL_SFT,
472 127, 0, adc_vol_tlv),
473
474 /* ADC Boost Volume Control */
475 SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5670_ADC_BST_VOL1,
476 RT5670_STO1_ADC_L_BST_SFT, RT5670_STO1_ADC_R_BST_SFT,
477 3, 0, adc_bst_tlv),
478
479 SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5670_ADC_BST_VOL1,
480 RT5670_STO2_ADC_L_BST_SFT, RT5670_STO2_ADC_R_BST_SFT,
481 3, 0, adc_bst_tlv),
482
483 SOC_ENUM("ADC IF2 Data Switch", rt5670_if2_adc_enum),
484 SOC_ENUM("DAC IF2 Data Switch", rt5670_if2_dac_enum),
485};
486
487/**
488 * set_dmic_clk - Set parameter of dmic.
489 *
490 * @w: DAPM widget.
491 * @kcontrol: The kcontrol of this widget.
492 * @event: Event id.
493 *
494 * Choose dmic clock between 1MHz and 3MHz.
495 * It is better for clock to approximate 3MHz.
496 */
497static int set_dmic_clk(struct snd_soc_dapm_widget *w,
498 struct snd_kcontrol *kcontrol, int event)
499{
500 struct snd_soc_codec *codec = w->codec;
501 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
502 int idx = -EINVAL;
503
504 idx = rl6231_calc_dmic_clk(rt5670->sysclk);
505
506 if (idx < 0)
507 dev_err(codec->dev, "Failed to set DMIC clock\n");
508 else
509 snd_soc_update_bits(codec, RT5670_DMIC_CTRL1,
510 RT5670_DMIC_CLK_MASK, idx << RT5670_DMIC_CLK_SFT);
511 return idx;
512}
513
514static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
515 struct snd_soc_dapm_widget *sink)
516{
517 unsigned int val;
518
519 val = snd_soc_read(source->codec, RT5670_GLB_CLK);
520 val &= RT5670_SCLK_SRC_MASK;
521 if (val == RT5670_SCLK_SRC_PLL1)
522 return 1;
523 else
524 return 0;
525}
526
527static int is_using_asrc(struct snd_soc_dapm_widget *source,
528 struct snd_soc_dapm_widget *sink)
529{
530 unsigned int reg, shift, val;
531
532 switch (source->shift) {
533 case 0:
534 reg = RT5670_ASRC_3;
535 shift = 0;
536 break;
537 case 1:
538 reg = RT5670_ASRC_3;
539 shift = 4;
540 break;
541 case 2:
542 reg = RT5670_ASRC_5;
543 shift = 12;
544 break;
545 case 3:
546 reg = RT5670_ASRC_2;
547 shift = 0;
548 break;
549 case 8:
550 reg = RT5670_ASRC_2;
551 shift = 4;
552 break;
553 case 9:
554 reg = RT5670_ASRC_2;
555 shift = 8;
556 break;
557 case 10:
558 reg = RT5670_ASRC_2;
559 shift = 12;
560 break;
561 default:
562 return 0;
563 }
564
565 val = (snd_soc_read(source->codec, reg) >> shift) & 0xf;
566 switch (val) {
567 case 1:
568 case 2:
569 case 3:
570 case 4:
571 return 1;
572 default:
573 return 0;
574 }
575
576}
577
578/* Digital Mixer */
579static const struct snd_kcontrol_new rt5670_sto1_adc_l_mix[] = {
580 SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO1_ADC_MIXER,
581 RT5670_M_ADC_L1_SFT, 1, 1),
582 SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO1_ADC_MIXER,
583 RT5670_M_ADC_L2_SFT, 1, 1),
584};
585
586static const struct snd_kcontrol_new rt5670_sto1_adc_r_mix[] = {
587 SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO1_ADC_MIXER,
588 RT5670_M_ADC_R1_SFT, 1, 1),
589 SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO1_ADC_MIXER,
590 RT5670_M_ADC_R2_SFT, 1, 1),
591};
592
593static const struct snd_kcontrol_new rt5670_sto2_adc_l_mix[] = {
594 SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO2_ADC_MIXER,
595 RT5670_M_ADC_L1_SFT, 1, 1),
596 SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO2_ADC_MIXER,
597 RT5670_M_ADC_L2_SFT, 1, 1),
598};
599
600static const struct snd_kcontrol_new rt5670_sto2_adc_r_mix[] = {
601 SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO2_ADC_MIXER,
602 RT5670_M_ADC_R1_SFT, 1, 1),
603 SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO2_ADC_MIXER,
604 RT5670_M_ADC_R2_SFT, 1, 1),
605};
606
607static const struct snd_kcontrol_new rt5670_mono_adc_l_mix[] = {
608 SOC_DAPM_SINGLE("ADC1 Switch", RT5670_MONO_ADC_MIXER,
609 RT5670_M_MONO_ADC_L1_SFT, 1, 1),
610 SOC_DAPM_SINGLE("ADC2 Switch", RT5670_MONO_ADC_MIXER,
611 RT5670_M_MONO_ADC_L2_SFT, 1, 1),
612};
613
614static const struct snd_kcontrol_new rt5670_mono_adc_r_mix[] = {
615 SOC_DAPM_SINGLE("ADC1 Switch", RT5670_MONO_ADC_MIXER,
616 RT5670_M_MONO_ADC_R1_SFT, 1, 1),
617 SOC_DAPM_SINGLE("ADC2 Switch", RT5670_MONO_ADC_MIXER,
618 RT5670_M_MONO_ADC_R2_SFT, 1, 1),
619};
620
621static const struct snd_kcontrol_new rt5670_dac_l_mix[] = {
622 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5670_AD_DA_MIXER,
623 RT5670_M_ADCMIX_L_SFT, 1, 1),
624 SOC_DAPM_SINGLE("DAC1 Switch", RT5670_AD_DA_MIXER,
625 RT5670_M_DAC1_L_SFT, 1, 1),
626};
627
628static const struct snd_kcontrol_new rt5670_dac_r_mix[] = {
629 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5670_AD_DA_MIXER,
630 RT5670_M_ADCMIX_R_SFT, 1, 1),
631 SOC_DAPM_SINGLE("DAC1 Switch", RT5670_AD_DA_MIXER,
632 RT5670_M_DAC1_R_SFT, 1, 1),
633};
634
635static const struct snd_kcontrol_new rt5670_sto_dac_l_mix[] = {
636 SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_STO_DAC_MIXER,
637 RT5670_M_DAC_L1_SFT, 1, 1),
638 SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_STO_DAC_MIXER,
639 RT5670_M_DAC_L2_SFT, 1, 1),
640 SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_STO_DAC_MIXER,
641 RT5670_M_DAC_R1_STO_L_SFT, 1, 1),
642};
643
644static const struct snd_kcontrol_new rt5670_sto_dac_r_mix[] = {
645 SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_STO_DAC_MIXER,
646 RT5670_M_DAC_R1_SFT, 1, 1),
647 SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_STO_DAC_MIXER,
648 RT5670_M_DAC_R2_SFT, 1, 1),
649 SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_STO_DAC_MIXER,
650 RT5670_M_DAC_L1_STO_R_SFT, 1, 1),
651};
652
653static const struct snd_kcontrol_new rt5670_mono_dac_l_mix[] = {
654 SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_DD_MIXER,
655 RT5670_M_DAC_L1_MONO_L_SFT, 1, 1),
656 SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DD_MIXER,
657 RT5670_M_DAC_L2_MONO_L_SFT, 1, 1),
658 SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DD_MIXER,
659 RT5670_M_DAC_R2_MONO_L_SFT, 1, 1),
660};
661
662static const struct snd_kcontrol_new rt5670_mono_dac_r_mix[] = {
663 SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_DD_MIXER,
664 RT5670_M_DAC_R1_MONO_R_SFT, 1, 1),
665 SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DD_MIXER,
666 RT5670_M_DAC_R2_MONO_R_SFT, 1, 1),
667 SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DD_MIXER,
668 RT5670_M_DAC_L2_MONO_R_SFT, 1, 1),
669};
670
671static const struct snd_kcontrol_new rt5670_dig_l_mix[] = {
672 SOC_DAPM_SINGLE("Sto DAC Mix L Switch", RT5670_DIG_MIXER,
673 RT5670_M_STO_L_DAC_L_SFT, 1, 1),
674 SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DIG_MIXER,
675 RT5670_M_DAC_L2_DAC_L_SFT, 1, 1),
676 SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DIG_MIXER,
677 RT5670_M_DAC_R2_DAC_L_SFT, 1, 1),
678};
679
680static const struct snd_kcontrol_new rt5670_dig_r_mix[] = {
681 SOC_DAPM_SINGLE("Sto DAC Mix R Switch", RT5670_DIG_MIXER,
682 RT5670_M_STO_R_DAC_R_SFT, 1, 1),
683 SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DIG_MIXER,
684 RT5670_M_DAC_R2_DAC_R_SFT, 1, 1),
685 SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DIG_MIXER,
686 RT5670_M_DAC_L2_DAC_R_SFT, 1, 1),
687};
688
689/* Analog Input Mixer */
690static const struct snd_kcontrol_new rt5670_rec_l_mix[] = {
691 SOC_DAPM_SINGLE("INL Switch", RT5670_REC_L2_MIXER,
692 RT5670_M_IN_L_RM_L_SFT, 1, 1),
693 SOC_DAPM_SINGLE("BST2 Switch", RT5670_REC_L2_MIXER,
694 RT5670_M_BST2_RM_L_SFT, 1, 1),
695 SOC_DAPM_SINGLE("BST1 Switch", RT5670_REC_L2_MIXER,
696 RT5670_M_BST1_RM_L_SFT, 1, 1),
697};
698
699static const struct snd_kcontrol_new rt5670_rec_r_mix[] = {
700 SOC_DAPM_SINGLE("INR Switch", RT5670_REC_R2_MIXER,
701 RT5670_M_IN_R_RM_R_SFT, 1, 1),
702 SOC_DAPM_SINGLE("BST2 Switch", RT5670_REC_R2_MIXER,
703 RT5670_M_BST2_RM_R_SFT, 1, 1),
704 SOC_DAPM_SINGLE("BST1 Switch", RT5670_REC_R2_MIXER,
705 RT5670_M_BST1_RM_R_SFT, 1, 1),
706};
707
708static const struct snd_kcontrol_new rt5670_out_l_mix[] = {
709 SOC_DAPM_SINGLE("BST1 Switch", RT5670_OUT_L1_MIXER,
710 RT5670_M_BST1_OM_L_SFT, 1, 1),
711 SOC_DAPM_SINGLE("INL Switch", RT5670_OUT_L1_MIXER,
712 RT5670_M_IN_L_OM_L_SFT, 1, 1),
713 SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_OUT_L1_MIXER,
714 RT5670_M_DAC_L2_OM_L_SFT, 1, 1),
715 SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_OUT_L1_MIXER,
716 RT5670_M_DAC_L1_OM_L_SFT, 1, 1),
717};
718
719static const struct snd_kcontrol_new rt5670_out_r_mix[] = {
720 SOC_DAPM_SINGLE("BST2 Switch", RT5670_OUT_R1_MIXER,
721 RT5670_M_BST2_OM_R_SFT, 1, 1),
722 SOC_DAPM_SINGLE("INR Switch", RT5670_OUT_R1_MIXER,
723 RT5670_M_IN_R_OM_R_SFT, 1, 1),
724 SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_OUT_R1_MIXER,
725 RT5670_M_DAC_R2_OM_R_SFT, 1, 1),
726 SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_OUT_R1_MIXER,
727 RT5670_M_DAC_R1_OM_R_SFT, 1, 1),
728};
729
730static const struct snd_kcontrol_new rt5670_hpo_mix[] = {
731 SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER,
732 RT5670_M_DAC1_HM_SFT, 1, 1),
733 SOC_DAPM_SINGLE("HPVOL Switch", RT5670_HPO_MIXER,
734 RT5670_M_HPVOL_HM_SFT, 1, 1),
735};
736
737static const struct snd_kcontrol_new rt5670_hpvoll_mix[] = {
738 SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER,
739 RT5670_M_DACL1_HML_SFT, 1, 1),
740 SOC_DAPM_SINGLE("INL Switch", RT5670_HPO_MIXER,
741 RT5670_M_INL1_HML_SFT, 1, 1),
742};
743
744static const struct snd_kcontrol_new rt5670_hpvolr_mix[] = {
745 SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER,
746 RT5670_M_DACR1_HMR_SFT, 1, 1),
747 SOC_DAPM_SINGLE("INR Switch", RT5670_HPO_MIXER,
748 RT5670_M_INR1_HMR_SFT, 1, 1),
749};
750
751static const struct snd_kcontrol_new rt5670_lout_mix[] = {
752 SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_LOUT_MIXER,
753 RT5670_M_DAC_L1_LM_SFT, 1, 1),
754 SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_LOUT_MIXER,
755 RT5670_M_DAC_R1_LM_SFT, 1, 1),
756 SOC_DAPM_SINGLE("OUTMIX L Switch", RT5670_LOUT_MIXER,
757 RT5670_M_OV_L_LM_SFT, 1, 1),
758 SOC_DAPM_SINGLE("OUTMIX R Switch", RT5670_LOUT_MIXER,
759 RT5670_M_OV_R_LM_SFT, 1, 1),
760};
761
762static const struct snd_kcontrol_new rt5670_hpl_mix[] = {
763 SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_HPO_MIXER,
764 RT5670_M_DACL1_HML_SFT, 1, 1),
765 SOC_DAPM_SINGLE("INL1 Switch", RT5670_HPO_MIXER,
766 RT5670_M_INL1_HML_SFT, 1, 1),
767};
768
769static const struct snd_kcontrol_new rt5670_hpr_mix[] = {
770 SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_HPO_MIXER,
771 RT5670_M_DACR1_HMR_SFT, 1, 1),
772 SOC_DAPM_SINGLE("INR1 Switch", RT5670_HPO_MIXER,
773 RT5670_M_INR1_HMR_SFT, 1, 1),
774};
775
776static const struct snd_kcontrol_new lout_l_enable_control =
777 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5670_LOUT1,
778 RT5670_L_MUTE_SFT, 1, 1);
779
780static const struct snd_kcontrol_new lout_r_enable_control =
781 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5670_LOUT1,
782 RT5670_R_MUTE_SFT, 1, 1);
783
784/* DAC1 L/R source */ /* MX-29 [9:8] [11:10] */
785static const char * const rt5670_dac1_src[] = {
786 "IF1 DAC", "IF2 DAC"
787};
788
789static SOC_ENUM_SINGLE_DECL(rt5670_dac1l_enum, RT5670_AD_DA_MIXER,
790 RT5670_DAC1_L_SEL_SFT, rt5670_dac1_src);
791
792static const struct snd_kcontrol_new rt5670_dac1l_mux =
793 SOC_DAPM_ENUM("DAC1 L source", rt5670_dac1l_enum);
794
795static SOC_ENUM_SINGLE_DECL(rt5670_dac1r_enum, RT5670_AD_DA_MIXER,
796 RT5670_DAC1_R_SEL_SFT, rt5670_dac1_src);
797
798static const struct snd_kcontrol_new rt5670_dac1r_mux =
799 SOC_DAPM_ENUM("DAC1 R source", rt5670_dac1r_enum);
800
801/*DAC2 L/R source*/ /* MX-1B [6:4] [2:0] */
802/* TODO Use SOC_VALUE_ENUM_SINGLE_DECL */
803static const char * const rt5670_dac12_src[] = {
804 "IF1 DAC", "IF2 DAC", "IF3 DAC", "TxDC DAC",
805 "Bass", "VAD_ADC", "IF4 DAC"
806};
807
808static SOC_ENUM_SINGLE_DECL(rt5670_dac2l_enum, RT5670_DAC_CTRL,
809 RT5670_DAC2_L_SEL_SFT, rt5670_dac12_src);
810
811static const struct snd_kcontrol_new rt5670_dac_l2_mux =
812 SOC_DAPM_ENUM("DAC2 L source", rt5670_dac2l_enum);
813
814static const char * const rt5670_dacr2_src[] = {
815 "IF1 DAC", "IF2 DAC", "IF3 DAC", "TxDC DAC", "TxDP ADC", "IF4 DAC"
816};
817
818static SOC_ENUM_SINGLE_DECL(rt5670_dac2r_enum, RT5670_DAC_CTRL,
819 RT5670_DAC2_R_SEL_SFT, rt5670_dacr2_src);
820
821static const struct snd_kcontrol_new rt5670_dac_r2_mux =
822 SOC_DAPM_ENUM("DAC2 R source", rt5670_dac2r_enum);
823
824/*RxDP source*/ /* MX-2D [15:13] */
825static const char * const rt5670_rxdp_src[] = {
826 "IF2 DAC", "IF1 DAC", "STO1 ADC Mixer", "STO2 ADC Mixer",
827 "Mono ADC Mixer L", "Mono ADC Mixer R", "DAC1"
828};
829
830static SOC_ENUM_SINGLE_DECL(rt5670_rxdp_enum, RT5670_DSP_PATH1,
831 RT5670_RXDP_SEL_SFT, rt5670_rxdp_src);
832
833static const struct snd_kcontrol_new rt5670_rxdp_mux =
834 SOC_DAPM_ENUM("DAC2 L source", rt5670_rxdp_enum);
835
836/* MX-2D [1] [0] */
837static const char * const rt5670_dsp_bypass_src[] = {
838 "DSP", "Bypass"
839};
840
841static SOC_ENUM_SINGLE_DECL(rt5670_dsp_ul_enum, RT5670_DSP_PATH1,
842 RT5670_DSP_UL_SFT, rt5670_dsp_bypass_src);
843
844static const struct snd_kcontrol_new rt5670_dsp_ul_mux =
845 SOC_DAPM_ENUM("DSP UL source", rt5670_dsp_ul_enum);
846
847static SOC_ENUM_SINGLE_DECL(rt5670_dsp_dl_enum, RT5670_DSP_PATH1,
848 RT5670_DSP_DL_SFT, rt5670_dsp_bypass_src);
849
850static const struct snd_kcontrol_new rt5670_dsp_dl_mux =
851 SOC_DAPM_ENUM("DSP DL source", rt5670_dsp_dl_enum);
852
853/* Stereo2 ADC source */
854/* MX-26 [15] */
855static const char * const rt5670_stereo2_adc_lr_src[] = {
856 "L", "LR"
857};
858
859static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc_lr_enum, RT5670_STO2_ADC_MIXER,
860 RT5670_STO2_ADC_SRC_SFT, rt5670_stereo2_adc_lr_src);
861
862static const struct snd_kcontrol_new rt5670_sto2_adc_lr_mux =
863 SOC_DAPM_ENUM("Stereo2 ADC LR source", rt5670_stereo2_adc_lr_enum);
864
865/* Stereo1 ADC source */
866/* MX-27 MX-26 [12] */
867static const char * const rt5670_stereo_adc1_src[] = {
868 "DAC MIX", "ADC"
869};
870
871static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc1_enum, RT5670_STO1_ADC_MIXER,
872 RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src);
873
874static const struct snd_kcontrol_new rt5670_sto_adc_l1_mux =
875 SOC_DAPM_ENUM("Stereo1 ADC L1 source", rt5670_stereo1_adc1_enum);
876
877static const struct snd_kcontrol_new rt5670_sto_adc_r1_mux =
878 SOC_DAPM_ENUM("Stereo1 ADC R1 source", rt5670_stereo1_adc1_enum);
879
880static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc1_enum, RT5670_STO2_ADC_MIXER,
881 RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src);
882
883static const struct snd_kcontrol_new rt5670_sto2_adc_l1_mux =
884 SOC_DAPM_ENUM("Stereo2 ADC L1 source", rt5670_stereo2_adc1_enum);
885
886static const struct snd_kcontrol_new rt5670_sto2_adc_r1_mux =
887 SOC_DAPM_ENUM("Stereo2 ADC R1 source", rt5670_stereo2_adc1_enum);
888
889/* MX-27 MX-26 [11] */
890static const char * const rt5670_stereo_adc2_src[] = {
891 "DAC MIX", "DMIC"
892};
893
894static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc2_enum, RT5670_STO1_ADC_MIXER,
895 RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src);
896
897static const struct snd_kcontrol_new rt5670_sto_adc_l2_mux =
898 SOC_DAPM_ENUM("Stereo1 ADC L2 source", rt5670_stereo1_adc2_enum);
899
900static const struct snd_kcontrol_new rt5670_sto_adc_r2_mux =
901 SOC_DAPM_ENUM("Stereo1 ADC R2 source", rt5670_stereo1_adc2_enum);
902
903static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc2_enum, RT5670_STO2_ADC_MIXER,
904 RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src);
905
906static const struct snd_kcontrol_new rt5670_sto2_adc_l2_mux =
907 SOC_DAPM_ENUM("Stereo2 ADC L2 source", rt5670_stereo2_adc2_enum);
908
909static const struct snd_kcontrol_new rt5670_sto2_adc_r2_mux =
910 SOC_DAPM_ENUM("Stereo2 ADC R2 source", rt5670_stereo2_adc2_enum);
911
912/* MX-27 MX26 [10] */
913static const char * const rt5670_stereo_adc_src[] = {
914 "ADC1L ADC2R", "ADC3"
915};
916
917static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc_enum, RT5670_STO1_ADC_MIXER,
918 RT5670_ADC_SRC_SFT, rt5670_stereo_adc_src);
919
920static const struct snd_kcontrol_new rt5670_sto_adc_mux =
921 SOC_DAPM_ENUM("Stereo1 ADC source", rt5670_stereo1_adc_enum);
922
923static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc_enum, RT5670_STO2_ADC_MIXER,
924 RT5670_ADC_SRC_SFT, rt5670_stereo_adc_src);
925
926static const struct snd_kcontrol_new rt5670_sto2_adc_mux =
927 SOC_DAPM_ENUM("Stereo2 ADC source", rt5670_stereo2_adc_enum);
928
929/* MX-27 MX-26 [9:8] */
930static const char * const rt5670_stereo_dmic_src[] = {
931 "DMIC1", "DMIC2", "DMIC3"
932};
933
934static SOC_ENUM_SINGLE_DECL(rt5670_stereo1_dmic_enum, RT5670_STO1_ADC_MIXER,
935 RT5670_DMIC_SRC_SFT, rt5670_stereo_dmic_src);
936
937static const struct snd_kcontrol_new rt5670_sto1_dmic_mux =
938 SOC_DAPM_ENUM("Stereo1 DMIC source", rt5670_stereo1_dmic_enum);
939
940static SOC_ENUM_SINGLE_DECL(rt5670_stereo2_dmic_enum, RT5670_STO2_ADC_MIXER,
941 RT5670_DMIC_SRC_SFT, rt5670_stereo_dmic_src);
942
943static const struct snd_kcontrol_new rt5670_sto2_dmic_mux =
944 SOC_DAPM_ENUM("Stereo2 DMIC source", rt5670_stereo2_dmic_enum);
945
946/* MX-27 [0] */
947static const char * const rt5670_stereo_dmic3_src[] = {
948 "DMIC3", "PDM ADC"
949};
950
951static SOC_ENUM_SINGLE_DECL(rt5670_stereo_dmic3_enum, RT5670_STO1_ADC_MIXER,
952 RT5670_DMIC3_SRC_SFT, rt5670_stereo_dmic3_src);
953
954static const struct snd_kcontrol_new rt5670_sto_dmic3_mux =
955 SOC_DAPM_ENUM("Stereo DMIC3 source", rt5670_stereo_dmic3_enum);
956
957/* Mono ADC source */
958/* MX-28 [12] */
959static const char * const rt5670_mono_adc_l1_src[] = {
960 "Mono DAC MIXL", "ADC1"
961};
962
963static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_l1_enum, RT5670_MONO_ADC_MIXER,
964 RT5670_MONO_ADC_L1_SRC_SFT, rt5670_mono_adc_l1_src);
965
966static const struct snd_kcontrol_new rt5670_mono_adc_l1_mux =
967 SOC_DAPM_ENUM("Mono ADC1 left source", rt5670_mono_adc_l1_enum);
968/* MX-28 [11] */
969static const char * const rt5670_mono_adc_l2_src[] = {
970 "Mono DAC MIXL", "DMIC"
971};
972
973static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_l2_enum, RT5670_MONO_ADC_MIXER,
974 RT5670_MONO_ADC_L2_SRC_SFT, rt5670_mono_adc_l2_src);
975
976static const struct snd_kcontrol_new rt5670_mono_adc_l2_mux =
977 SOC_DAPM_ENUM("Mono ADC2 left source", rt5670_mono_adc_l2_enum);
978
979/* MX-28 [9:8] */
980static const char * const rt5670_mono_dmic_src[] = {
981 "DMIC1", "DMIC2", "DMIC3"
982};
983
984static SOC_ENUM_SINGLE_DECL(rt5670_mono_dmic_l_enum, RT5670_MONO_ADC_MIXER,
985 RT5670_MONO_DMIC_L_SRC_SFT, rt5670_mono_dmic_src);
986
987static const struct snd_kcontrol_new rt5670_mono_dmic_l_mux =
988 SOC_DAPM_ENUM("Mono DMIC left source", rt5670_mono_dmic_l_enum);
989/* MX-28 [1:0] */
990static SOC_ENUM_SINGLE_DECL(rt5670_mono_dmic_r_enum, RT5670_MONO_ADC_MIXER,
991 RT5670_MONO_DMIC_R_SRC_SFT, rt5670_mono_dmic_src);
992
993static const struct snd_kcontrol_new rt5670_mono_dmic_r_mux =
994 SOC_DAPM_ENUM("Mono DMIC Right source", rt5670_mono_dmic_r_enum);
995/* MX-28 [4] */
996static const char * const rt5670_mono_adc_r1_src[] = {
997 "Mono DAC MIXR", "ADC2"
998};
999
1000static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_r1_enum, RT5670_MONO_ADC_MIXER,
1001 RT5670_MONO_ADC_R1_SRC_SFT, rt5670_mono_adc_r1_src);
1002
1003static const struct snd_kcontrol_new rt5670_mono_adc_r1_mux =
1004 SOC_DAPM_ENUM("Mono ADC1 right source", rt5670_mono_adc_r1_enum);
1005/* MX-28 [3] */
1006static const char * const rt5670_mono_adc_r2_src[] = {
1007 "Mono DAC MIXR", "DMIC"
1008};
1009
1010static SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_r2_enum, RT5670_MONO_ADC_MIXER,
1011 RT5670_MONO_ADC_R2_SRC_SFT, rt5670_mono_adc_r2_src);
1012
1013static const struct snd_kcontrol_new rt5670_mono_adc_r2_mux =
1014 SOC_DAPM_ENUM("Mono ADC2 right source", rt5670_mono_adc_r2_enum);
1015
1016/* MX-2D [3:2] */
1017static const char * const rt5670_txdp_slot_src[] = {
1018 "Slot 0-1", "Slot 2-3", "Slot 4-5", "Slot 6-7"
1019};
1020
1021static SOC_ENUM_SINGLE_DECL(rt5670_txdp_slot_enum, RT5670_DSP_PATH1,
1022 RT5670_TXDP_SLOT_SEL_SFT, rt5670_txdp_slot_src);
1023
1024static const struct snd_kcontrol_new rt5670_txdp_slot_mux =
1025 SOC_DAPM_ENUM("TxDP Slot source", rt5670_txdp_slot_enum);
1026
1027/* MX-2F [15] */
1028static const char * const rt5670_if1_adc2_in_src[] = {
1029 "IF_ADC2", "VAD_ADC"
1030};
1031
1032static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc2_in_enum, RT5670_DIG_INF1_DATA,
1033 RT5670_IF1_ADC2_IN_SFT, rt5670_if1_adc2_in_src);
1034
1035static const struct snd_kcontrol_new rt5670_if1_adc2_in_mux =
1036 SOC_DAPM_ENUM("IF1 ADC2 IN source", rt5670_if1_adc2_in_enum);
1037
1038/* MX-2F [14:12] */
1039static const char * const rt5670_if2_adc_in_src[] = {
1040 "IF_ADC1", "IF_ADC2", "IF_ADC3", "TxDC_DAC", "TxDP_ADC", "VAD_ADC"
1041};
1042
1043static SOC_ENUM_SINGLE_DECL(rt5670_if2_adc_in_enum, RT5670_DIG_INF1_DATA,
1044 RT5670_IF2_ADC_IN_SFT, rt5670_if2_adc_in_src);
1045
1046static const struct snd_kcontrol_new rt5670_if2_adc_in_mux =
1047 SOC_DAPM_ENUM("IF2 ADC IN source", rt5670_if2_adc_in_enum);
1048
1049/* MX-30 [5:4] */
1050static const char * const rt5670_if4_adc_in_src[] = {
1051 "IF_ADC1", "IF_ADC2", "IF_ADC3"
1052};
1053
1054static SOC_ENUM_SINGLE_DECL(rt5670_if4_adc_in_enum, RT5670_DIG_INF2_DATA,
1055 RT5670_IF4_ADC_IN_SFT, rt5670_if4_adc_in_src);
1056
1057static const struct snd_kcontrol_new rt5670_if4_adc_in_mux =
1058 SOC_DAPM_ENUM("IF4 ADC IN source", rt5670_if4_adc_in_enum);
1059
1060/* MX-31 [15] [13] [11] [9] */
1061static const char * const rt5670_pdm_src[] = {
1062 "Mono DAC", "Stereo DAC"
1063};
1064
1065static SOC_ENUM_SINGLE_DECL(rt5670_pdm1_l_enum, RT5670_PDM_OUT_CTRL,
1066 RT5670_PDM1_L_SFT, rt5670_pdm_src);
1067
1068static const struct snd_kcontrol_new rt5670_pdm1_l_mux =
1069 SOC_DAPM_ENUM("PDM1 L source", rt5670_pdm1_l_enum);
1070
1071static SOC_ENUM_SINGLE_DECL(rt5670_pdm1_r_enum, RT5670_PDM_OUT_CTRL,
1072 RT5670_PDM1_R_SFT, rt5670_pdm_src);
1073
1074static const struct snd_kcontrol_new rt5670_pdm1_r_mux =
1075 SOC_DAPM_ENUM("PDM1 R source", rt5670_pdm1_r_enum);
1076
1077static SOC_ENUM_SINGLE_DECL(rt5670_pdm2_l_enum, RT5670_PDM_OUT_CTRL,
1078 RT5670_PDM2_L_SFT, rt5670_pdm_src);
1079
1080static const struct snd_kcontrol_new rt5670_pdm2_l_mux =
1081 SOC_DAPM_ENUM("PDM2 L source", rt5670_pdm2_l_enum);
1082
1083static SOC_ENUM_SINGLE_DECL(rt5670_pdm2_r_enum, RT5670_PDM_OUT_CTRL,
1084 RT5670_PDM2_R_SFT, rt5670_pdm_src);
1085
1086static const struct snd_kcontrol_new rt5670_pdm2_r_mux =
1087 SOC_DAPM_ENUM("PDM2 R source", rt5670_pdm2_r_enum);
1088
1089/* MX-FA [12] */
1090static const char * const rt5670_if1_adc1_in1_src[] = {
1091 "IF_ADC1", "IF1_ADC3"
1092};
1093
1094static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc1_in1_enum, RT5670_DIG_MISC,
1095 RT5670_IF1_ADC1_IN1_SFT, rt5670_if1_adc1_in1_src);
1096
1097static const struct snd_kcontrol_new rt5670_if1_adc1_in1_mux =
1098 SOC_DAPM_ENUM("IF1 ADC1 IN1 source", rt5670_if1_adc1_in1_enum);
1099
1100/* MX-FA [11] */
1101static const char * const rt5670_if1_adc1_in2_src[] = {
1102 "IF1_ADC1_IN1", "IF1_ADC4"
1103};
1104
1105static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc1_in2_enum, RT5670_DIG_MISC,
1106 RT5670_IF1_ADC1_IN2_SFT, rt5670_if1_adc1_in2_src);
1107
1108static const struct snd_kcontrol_new rt5670_if1_adc1_in2_mux =
1109 SOC_DAPM_ENUM("IF1 ADC1 IN2 source", rt5670_if1_adc1_in2_enum);
1110
1111/* MX-FA [10] */
1112static const char * const rt5670_if1_adc2_in1_src[] = {
1113 "IF1_ADC2_IN", "IF1_ADC4"
1114};
1115
1116static SOC_ENUM_SINGLE_DECL(rt5670_if1_adc2_in1_enum, RT5670_DIG_MISC,
1117 RT5670_IF1_ADC2_IN1_SFT, rt5670_if1_adc2_in1_src);
1118
1119static const struct snd_kcontrol_new rt5670_if1_adc2_in1_mux =
1120 SOC_DAPM_ENUM("IF1 ADC2 IN1 source", rt5670_if1_adc2_in1_enum);
1121
1122/* MX-9D [9:8] */
1123static const char * const rt5670_vad_adc_src[] = {
1124 "Sto1 ADC L", "Mono ADC L", "Mono ADC R", "Sto2 ADC L"
1125};
1126
1127static SOC_ENUM_SINGLE_DECL(rt5670_vad_adc_enum, RT5670_VAD_CTRL4,
1128 RT5670_VAD_SEL_SFT, rt5670_vad_adc_src);
1129
1130static const struct snd_kcontrol_new rt5670_vad_adc_mux =
1131 SOC_DAPM_ENUM("VAD ADC source", rt5670_vad_adc_enum);
1132
1133static int rt5670_hp_power_event(struct snd_soc_dapm_widget *w,
1134 struct snd_kcontrol *kcontrol, int event)
1135{
1136 struct snd_soc_codec *codec = w->codec;
1137 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
1138
1139 switch (event) {
1140 case SND_SOC_DAPM_POST_PMU:
1141 regmap_update_bits(rt5670->regmap, RT5670_CHARGE_PUMP,
1142 RT5670_PM_HP_MASK, RT5670_PM_HP_HV);
1143 regmap_update_bits(rt5670->regmap, RT5670_GEN_CTRL2,
1144 0x0400, 0x0400);
1145 /* headphone amp power on */
1146 regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1,
1147 RT5670_PWR_HA | RT5670_PWR_FV1 |
1148 RT5670_PWR_FV2, RT5670_PWR_HA |
1149 RT5670_PWR_FV1 | RT5670_PWR_FV2);
1150 /* depop parameters */
1151 regmap_write(rt5670->regmap, RT5670_DEPOP_M2, 0x3100);
1152 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8009);
1153 regmap_write(rt5670->regmap, RT5670_PR_BASE +
1154 RT5670_HP_DCC_INT1, 0x9f00);
1155 mdelay(20);
1156 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019);
1157 break;
1158 case SND_SOC_DAPM_PRE_PMD:
1159 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x0004);
1160 msleep(30);
1161 break;
1162 default:
1163 return 0;
1164 }
1165
1166 return 0;
1167}
1168
1169static int rt5670_hp_event(struct snd_soc_dapm_widget *w,
1170 struct snd_kcontrol *kcontrol, int event)
1171{
1172 struct snd_soc_codec *codec = w->codec;
1173 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
1174
1175 switch (event) {
1176 case SND_SOC_DAPM_POST_PMU:
1177 /* headphone unmute sequence */
1178 regmap_write(rt5670->regmap, RT5670_PR_BASE +
1179 RT5670_MAMP_INT_REG2, 0xb400);
1180 regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0772);
1181 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x805d);
1182 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x831d);
1183 regmap_update_bits(rt5670->regmap, RT5670_GEN_CTRL2,
1184 0x0300, 0x0300);
1185 regmap_update_bits(rt5670->regmap, RT5670_HP_VOL,
1186 RT5670_L_MUTE | RT5670_R_MUTE, 0);
1187 msleep(80);
1188 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019);
1189 break;
1190
1191 case SND_SOC_DAPM_PRE_PMD:
1192 /* headphone mute sequence */
1193 regmap_write(rt5670->regmap, RT5670_PR_BASE +
1194 RT5670_MAMP_INT_REG2, 0xb400);
1195 regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0772);
1196 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x803d);
1197 mdelay(10);
1198 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x831d);
1199 mdelay(10);
1200 regmap_update_bits(rt5670->regmap, RT5670_HP_VOL,
1201 RT5670_L_MUTE | RT5670_R_MUTE,
1202 RT5670_L_MUTE | RT5670_R_MUTE);
1203 msleep(20);
1204 regmap_update_bits(rt5670->regmap,
1205 RT5670_GEN_CTRL2, 0x0300, 0x0);
1206 regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019);
1207 regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0707);
1208 regmap_write(rt5670->regmap, RT5670_PR_BASE +
1209 RT5670_MAMP_INT_REG2, 0xfc00);
1210 break;
1211
1212 default:
1213 return 0;
1214 }
1215
1216 return 0;
1217}
1218
1219static int rt5670_bst1_event(struct snd_soc_dapm_widget *w,
1220 struct snd_kcontrol *kcontrol, int event)
1221{
1222 struct snd_soc_codec *codec = w->codec;
1223
1224 switch (event) {
1225 case SND_SOC_DAPM_POST_PMU:
1226 snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
1227 RT5670_PWR_BST1_P, RT5670_PWR_BST1_P);
1228 break;
1229
1230 case SND_SOC_DAPM_PRE_PMD:
1231 snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
1232 RT5670_PWR_BST1_P, 0);
1233 break;
1234
1235 default:
1236 return 0;
1237 }
1238
1239 return 0;
1240}
1241
1242static int rt5670_bst2_event(struct snd_soc_dapm_widget *w,
1243 struct snd_kcontrol *kcontrol, int event)
1244{
1245 struct snd_soc_codec *codec = w->codec;
1246
1247 switch (event) {
1248 case SND_SOC_DAPM_POST_PMU:
1249 snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
1250 RT5670_PWR_BST2_P, RT5670_PWR_BST2_P);
1251 break;
1252
1253 case SND_SOC_DAPM_PRE_PMD:
1254 snd_soc_update_bits(codec, RT5670_PWR_ANLG2,
1255 RT5670_PWR_BST2_P, 0);
1256 break;
1257
1258 default:
1259 return 0;
1260 }
1261
1262 return 0;
1263}
1264
1265static const struct snd_soc_dapm_widget rt5670_dapm_widgets[] = {
1266 SND_SOC_DAPM_SUPPLY("PLL1", RT5670_PWR_ANLG2,
1267 RT5670_PWR_PLL_BIT, 0, NULL, 0),
1268 SND_SOC_DAPM_SUPPLY("I2S DSP", RT5670_PWR_DIG2,
1269 RT5670_PWR_I2S_DSP_BIT, 0, NULL, 0),
1270 SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5670_PWR_VOL,
1271 RT5670_PWR_MIC_DET_BIT, 0, NULL, 0),
1272
1273 /* ASRC */
1274 SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5670_ASRC_1,
1275 11, 0, NULL, 0),
1276 SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5670_ASRC_1,
1277 12, 0, NULL, 0),
1278 SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5670_ASRC_1,
1279 10, 0, NULL, 0),
1280 SND_SOC_DAPM_SUPPLY_S("DAC MONO L ASRC", 1, RT5670_ASRC_1,
1281 9, 0, NULL, 0),
1282 SND_SOC_DAPM_SUPPLY_S("DAC MONO R ASRC", 1, RT5670_ASRC_1,
1283 8, 0, NULL, 0),
1284 SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5670_ASRC_1,
1285 3, 0, NULL, 0),
1286 SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5670_ASRC_1,
1287 2, 0, NULL, 0),
1288 SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5670_ASRC_1,
1289 1, 0, NULL, 0),
1290 SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5670_ASRC_1,
1291 0, 0, NULL, 0),
1292
1293 /* Input Side */
1294 /* micbias */
1295 SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5670_PWR_ANLG2,
1296 RT5670_PWR_MB1_BIT, 0, NULL, 0),
1297
1298 /* Input Lines */
1299 SND_SOC_DAPM_INPUT("DMIC L1"),
1300 SND_SOC_DAPM_INPUT("DMIC R1"),
1301 SND_SOC_DAPM_INPUT("DMIC L2"),
1302 SND_SOC_DAPM_INPUT("DMIC R2"),
1303 SND_SOC_DAPM_INPUT("DMIC L3"),
1304 SND_SOC_DAPM_INPUT("DMIC R3"),
1305
1306 SND_SOC_DAPM_INPUT("IN1P"),
1307 SND_SOC_DAPM_INPUT("IN1N"),
1308 SND_SOC_DAPM_INPUT("IN2P"),
1309 SND_SOC_DAPM_INPUT("IN2N"),
1310
1311 SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
1312 SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
1313 SND_SOC_DAPM_PGA("DMIC3", SND_SOC_NOPM, 0, 0, NULL, 0),
1314
1315 SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
1316 set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
1317 SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5670_DMIC_CTRL1,
1318 RT5670_DMIC_1_EN_SFT, 0, NULL, 0),
1319 SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5670_DMIC_CTRL1,
1320 RT5670_DMIC_2_EN_SFT, 0, NULL, 0),
1321 SND_SOC_DAPM_SUPPLY("DMIC3 Power", RT5670_DMIC_CTRL1,
1322 RT5670_DMIC_3_EN_SFT, 0, NULL, 0),
1323 /* Boost */
1324 SND_SOC_DAPM_PGA_E("BST1", RT5670_PWR_ANLG2, RT5670_PWR_BST1_BIT,
1325 0, NULL, 0, rt5670_bst1_event,
1326 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1327 SND_SOC_DAPM_PGA_E("BST2", RT5670_PWR_ANLG2, RT5670_PWR_BST2_BIT,
1328 0, NULL, 0, rt5670_bst2_event,
1329 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
1330 /* Input Volume */
1331 SND_SOC_DAPM_PGA("INL VOL", RT5670_PWR_VOL,
1332 RT5670_PWR_IN_L_BIT, 0, NULL, 0),
1333 SND_SOC_DAPM_PGA("INR VOL", RT5670_PWR_VOL,
1334 RT5670_PWR_IN_R_BIT, 0, NULL, 0),
1335
1336 /* REC Mixer */
1337 SND_SOC_DAPM_MIXER("RECMIXL", RT5670_PWR_MIXER, RT5670_PWR_RM_L_BIT, 0,
1338 rt5670_rec_l_mix, ARRAY_SIZE(rt5670_rec_l_mix)),
1339 SND_SOC_DAPM_MIXER("RECMIXR", RT5670_PWR_MIXER, RT5670_PWR_RM_R_BIT, 0,
1340 rt5670_rec_r_mix, ARRAY_SIZE(rt5670_rec_r_mix)),
1341 /* ADCs */
1342 SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM, 0, 0),
1343 SND_SOC_DAPM_ADC("ADC 2", NULL, SND_SOC_NOPM, 0, 0),
1344
1345 SND_SOC_DAPM_PGA("ADC 1_2", SND_SOC_NOPM, 0, 0, NULL, 0),
1346
1347 SND_SOC_DAPM_SUPPLY("ADC 1 power", RT5670_PWR_DIG1,
1348 RT5670_PWR_ADC_L_BIT, 0, NULL, 0),
1349 SND_SOC_DAPM_SUPPLY("ADC 2 power", RT5670_PWR_DIG1,
1350 RT5670_PWR_ADC_R_BIT, 0, NULL, 0),
1351 SND_SOC_DAPM_SUPPLY("ADC clock", RT5670_PR_BASE +
1352 RT5670_CHOP_DAC_ADC, 12, 0, NULL, 0),
1353 /* ADC Mux */
1354 SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0,
1355 &rt5670_sto1_dmic_mux),
1356 SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1357 &rt5670_sto_adc_l2_mux),
1358 SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1359 &rt5670_sto_adc_r2_mux),
1360 SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1361 &rt5670_sto_adc_l1_mux),
1362 SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1363 &rt5670_sto_adc_r1_mux),
1364 SND_SOC_DAPM_MUX("Stereo2 DMIC Mux", SND_SOC_NOPM, 0, 0,
1365 &rt5670_sto2_dmic_mux),
1366 SND_SOC_DAPM_MUX("Stereo2 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1367 &rt5670_sto2_adc_l2_mux),
1368 SND_SOC_DAPM_MUX("Stereo2 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1369 &rt5670_sto2_adc_r2_mux),
1370 SND_SOC_DAPM_MUX("Stereo2 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1371 &rt5670_sto2_adc_l1_mux),
1372 SND_SOC_DAPM_MUX("Stereo2 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1373 &rt5670_sto2_adc_r1_mux),
1374 SND_SOC_DAPM_MUX("Stereo2 ADC LR Mux", SND_SOC_NOPM, 0, 0,
1375 &rt5670_sto2_adc_lr_mux),
1376 SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
1377 &rt5670_mono_dmic_l_mux),
1378 SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
1379 &rt5670_mono_dmic_r_mux),
1380 SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
1381 &rt5670_mono_adc_l2_mux),
1382 SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
1383 &rt5670_mono_adc_l1_mux),
1384 SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
1385 &rt5670_mono_adc_r1_mux),
1386 SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
1387 &rt5670_mono_adc_r2_mux),
1388 /* ADC Mixer */
1389 SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5670_PWR_DIG2,
1390 RT5670_PWR_ADC_S1F_BIT, 0, NULL, 0),
1391 SND_SOC_DAPM_SUPPLY("ADC Stereo2 Filter", RT5670_PWR_DIG2,
1392 RT5670_PWR_ADC_S2F_BIT, 0, NULL, 0),
1393 SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", RT5670_STO1_ADC_DIG_VOL,
1394 RT5670_L_MUTE_SFT, 1, rt5670_sto1_adc_l_mix,
1395 ARRAY_SIZE(rt5670_sto1_adc_l_mix)),
1396 SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", RT5670_STO1_ADC_DIG_VOL,
1397 RT5670_R_MUTE_SFT, 1, rt5670_sto1_adc_r_mix,
1398 ARRAY_SIZE(rt5670_sto1_adc_r_mix)),
1399 SND_SOC_DAPM_MIXER("Sto2 ADC MIXL", SND_SOC_NOPM, 0, 0,
1400 rt5670_sto2_adc_l_mix,
1401 ARRAY_SIZE(rt5670_sto2_adc_l_mix)),
1402 SND_SOC_DAPM_MIXER("Sto2 ADC MIXR", SND_SOC_NOPM, 0, 0,
1403 rt5670_sto2_adc_r_mix,
1404 ARRAY_SIZE(rt5670_sto2_adc_r_mix)),
1405 SND_SOC_DAPM_SUPPLY("ADC Mono Left Filter", RT5670_PWR_DIG2,
1406 RT5670_PWR_ADC_MF_L_BIT, 0, NULL, 0),
1407 SND_SOC_DAPM_MIXER("Mono ADC MIXL", RT5670_MONO_ADC_DIG_VOL,
1408 RT5670_L_MUTE_SFT, 1, rt5670_mono_adc_l_mix,
1409 ARRAY_SIZE(rt5670_mono_adc_l_mix)),
1410 SND_SOC_DAPM_SUPPLY("ADC Mono Right Filter", RT5670_PWR_DIG2,
1411 RT5670_PWR_ADC_MF_R_BIT, 0, NULL, 0),
1412 SND_SOC_DAPM_MIXER("Mono ADC MIXR", RT5670_MONO_ADC_DIG_VOL,
1413 RT5670_R_MUTE_SFT, 1, rt5670_mono_adc_r_mix,
1414 ARRAY_SIZE(rt5670_mono_adc_r_mix)),
1415
1416 /* ADC PGA */
1417 SND_SOC_DAPM_PGA("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
1418 SND_SOC_DAPM_PGA("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
1419 SND_SOC_DAPM_PGA("Stereo2 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0),
1420 SND_SOC_DAPM_PGA("Stereo2 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0),
1421 SND_SOC_DAPM_PGA("Sto2 ADC LR MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
1422 SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
1423 SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
1424 SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
1425 SND_SOC_DAPM_PGA("VAD_ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1426 SND_SOC_DAPM_PGA("IF_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
1427 SND_SOC_DAPM_PGA("IF_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
1428 SND_SOC_DAPM_PGA("IF_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
1429 SND_SOC_DAPM_PGA("IF1_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
1430 SND_SOC_DAPM_PGA("IF1_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
1431 SND_SOC_DAPM_PGA("IF1_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
1432 SND_SOC_DAPM_PGA("IF1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
1433
1434 /* DSP */
1435 SND_SOC_DAPM_PGA("TxDP_ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1436 SND_SOC_DAPM_PGA("TxDP_ADC_L", SND_SOC_NOPM, 0, 0, NULL, 0),
1437 SND_SOC_DAPM_PGA("TxDP_ADC_R", SND_SOC_NOPM, 0, 0, NULL, 0),
1438 SND_SOC_DAPM_PGA("TxDC_DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
1439
1440 SND_SOC_DAPM_MUX("TDM Data Mux", SND_SOC_NOPM, 0, 0,
1441 &rt5670_txdp_slot_mux),
1442
1443 SND_SOC_DAPM_MUX("DSP UL Mux", SND_SOC_NOPM, 0, 0,
1444 &rt5670_dsp_ul_mux),
1445 SND_SOC_DAPM_MUX("DSP DL Mux", SND_SOC_NOPM, 0, 0,
1446 &rt5670_dsp_dl_mux),
1447
1448 SND_SOC_DAPM_MUX("RxDP Mux", SND_SOC_NOPM, 0, 0,
1449 &rt5670_rxdp_mux),
1450
1451 /* IF2 Mux */
1452 SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM, 0, 0,
1453 &rt5670_if2_adc_in_mux),
1454
1455 /* Digital Interface */
1456 SND_SOC_DAPM_SUPPLY("I2S1", RT5670_PWR_DIG1,
1457 RT5670_PWR_I2S1_BIT, 0, NULL, 0),
1458 SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
1459 SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
1460 SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
1461 SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
1462 SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0),
1463 SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0),
1464 SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1465 SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1466 SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1467 SND_SOC_DAPM_SUPPLY("I2S2", RT5670_PWR_DIG1,
1468 RT5670_PWR_I2S2_BIT, 0, NULL, 0),
1469 SND_SOC_DAPM_PGA("IF2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
1470 SND_SOC_DAPM_PGA("IF2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1471 SND_SOC_DAPM_PGA("IF2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1472 SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
1473 SND_SOC_DAPM_PGA("IF2 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
1474 SND_SOC_DAPM_PGA("IF2 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
1475
1476 /* Digital Interface Select */
1477 SND_SOC_DAPM_MUX("IF1 ADC1 IN1 Mux", SND_SOC_NOPM, 0, 0,
1478 &rt5670_if1_adc1_in1_mux),
1479 SND_SOC_DAPM_MUX("IF1 ADC1 IN2 Mux", SND_SOC_NOPM, 0, 0,
1480 &rt5670_if1_adc1_in2_mux),
1481 SND_SOC_DAPM_MUX("IF1 ADC2 IN Mux", SND_SOC_NOPM, 0, 0,
1482 &rt5670_if1_adc2_in_mux),
1483 SND_SOC_DAPM_MUX("IF1 ADC2 IN1 Mux", SND_SOC_NOPM, 0, 0,
1484 &rt5670_if1_adc2_in1_mux),
1485 SND_SOC_DAPM_MUX("VAD ADC Mux", SND_SOC_NOPM, 0, 0,
1486 &rt5670_vad_adc_mux),
1487
1488 /* Audio Interface */
1489 SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
1490 SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
1491 SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
1492 SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0,
1493 RT5670_GPIO_CTRL1, RT5670_I2S2_PIN_SFT, 1),
1494
1495 /* Audio DSP */
1496 SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0),
1497
1498 /* Output Side */
1499 /* DAC mixer before sound effect */
1500 SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
1501 rt5670_dac_l_mix, ARRAY_SIZE(rt5670_dac_l_mix)),
1502 SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
1503 rt5670_dac_r_mix, ARRAY_SIZE(rt5670_dac_r_mix)),
1504 SND_SOC_DAPM_PGA("DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
1505
1506 /* DAC2 channel Mux */
1507 SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0,
1508 &rt5670_dac_l2_mux),
1509 SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0,
1510 &rt5670_dac_r2_mux),
1511 SND_SOC_DAPM_PGA("DAC L2 Volume", RT5670_PWR_DIG1,
1512 RT5670_PWR_DAC_L2_BIT, 0, NULL, 0),
1513 SND_SOC_DAPM_PGA("DAC R2 Volume", RT5670_PWR_DIG1,
1514 RT5670_PWR_DAC_R2_BIT, 0, NULL, 0),
1515
1516 SND_SOC_DAPM_MUX("DAC1 L Mux", SND_SOC_NOPM, 0, 0, &rt5670_dac1l_mux),
1517 SND_SOC_DAPM_MUX("DAC1 R Mux", SND_SOC_NOPM, 0, 0, &rt5670_dac1r_mux),
1518
1519 /* DAC Mixer */
1520 SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5670_PWR_DIG2,
1521 RT5670_PWR_DAC_S1F_BIT, 0, NULL, 0),
1522 SND_SOC_DAPM_SUPPLY("DAC Mono Left Filter", RT5670_PWR_DIG2,
1523 RT5670_PWR_DAC_MF_L_BIT, 0, NULL, 0),
1524 SND_SOC_DAPM_SUPPLY("DAC Mono Right Filter", RT5670_PWR_DIG2,
1525 RT5670_PWR_DAC_MF_R_BIT, 0, NULL, 0),
1526 SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
1527 rt5670_sto_dac_l_mix,
1528 ARRAY_SIZE(rt5670_sto_dac_l_mix)),
1529 SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0,
1530 rt5670_sto_dac_r_mix,
1531 ARRAY_SIZE(rt5670_sto_dac_r_mix)),
1532 SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
1533 rt5670_mono_dac_l_mix,
1534 ARRAY_SIZE(rt5670_mono_dac_l_mix)),
1535 SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
1536 rt5670_mono_dac_r_mix,
1537 ARRAY_SIZE(rt5670_mono_dac_r_mix)),
1538 SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0,
1539 rt5670_dig_l_mix,
1540 ARRAY_SIZE(rt5670_dig_l_mix)),
1541 SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0,
1542 rt5670_dig_r_mix,
1543 ARRAY_SIZE(rt5670_dig_r_mix)),
1544
1545 /* DACs */
1546 SND_SOC_DAPM_SUPPLY("DAC L1 Power", RT5670_PWR_DIG1,
1547 RT5670_PWR_DAC_L1_BIT, 0, NULL, 0),
1548 SND_SOC_DAPM_SUPPLY("DAC R1 Power", RT5670_PWR_DIG1,
1549 RT5670_PWR_DAC_R1_BIT, 0, NULL, 0),
1550 SND_SOC_DAPM_DAC("DAC L1", NULL, SND_SOC_NOPM, 0, 0),
1551 SND_SOC_DAPM_DAC("DAC R1", NULL, SND_SOC_NOPM, 0, 0),
1552 SND_SOC_DAPM_DAC("DAC L2", NULL, RT5670_PWR_DIG1,
1553 RT5670_PWR_DAC_L2_BIT, 0),
1554
1555 SND_SOC_DAPM_DAC("DAC R2", NULL, RT5670_PWR_DIG1,
1556 RT5670_PWR_DAC_R2_BIT, 0),
1557 /* OUT Mixer */
1558
1559 SND_SOC_DAPM_MIXER("OUT MIXL", RT5670_PWR_MIXER, RT5670_PWR_OM_L_BIT,
1560 0, rt5670_out_l_mix, ARRAY_SIZE(rt5670_out_l_mix)),
1561 SND_SOC_DAPM_MIXER("OUT MIXR", RT5670_PWR_MIXER, RT5670_PWR_OM_R_BIT,
1562 0, rt5670_out_r_mix, ARRAY_SIZE(rt5670_out_r_mix)),
1563 /* Ouput Volume */
1564 SND_SOC_DAPM_MIXER("HPOVOL MIXL", RT5670_PWR_VOL,
1565 RT5670_PWR_HV_L_BIT, 0,
1566 rt5670_hpvoll_mix, ARRAY_SIZE(rt5670_hpvoll_mix)),
1567 SND_SOC_DAPM_MIXER("HPOVOL MIXR", RT5670_PWR_VOL,
1568 RT5670_PWR_HV_R_BIT, 0,
1569 rt5670_hpvolr_mix, ARRAY_SIZE(rt5670_hpvolr_mix)),
1570 SND_SOC_DAPM_PGA("DAC 1", SND_SOC_NOPM, 0, 0, NULL, 0),
1571 SND_SOC_DAPM_PGA("DAC 2", SND_SOC_NOPM, 0, 0, NULL, 0),
1572 SND_SOC_DAPM_PGA("HPOVOL", SND_SOC_NOPM, 0, 0, NULL, 0),
1573
1574 /* HPO/LOUT/Mono Mixer */
1575 SND_SOC_DAPM_MIXER("HPO MIX", SND_SOC_NOPM, 0, 0,
1576 rt5670_hpo_mix, ARRAY_SIZE(rt5670_hpo_mix)),
1577 SND_SOC_DAPM_MIXER("LOUT MIX", RT5670_PWR_ANLG1, RT5670_PWR_LM_BIT,
1578 0, rt5670_lout_mix, ARRAY_SIZE(rt5670_lout_mix)),
1579 SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM, 0, 0,
1580 rt5670_hp_power_event, SND_SOC_DAPM_POST_PMU |
1581 SND_SOC_DAPM_PRE_PMD),
1582 SND_SOC_DAPM_SUPPLY("HP L Amp", RT5670_PWR_ANLG1,
1583 RT5670_PWR_HP_L_BIT, 0, NULL, 0),
1584 SND_SOC_DAPM_SUPPLY("HP R Amp", RT5670_PWR_ANLG1,
1585 RT5670_PWR_HP_R_BIT, 0, NULL, 0),
1586 SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
1587 rt5670_hp_event, SND_SOC_DAPM_PRE_PMD |
1588 SND_SOC_DAPM_POST_PMU),
1589 SND_SOC_DAPM_SWITCH("LOUT L Playback", SND_SOC_NOPM, 0, 0,
1590 &lout_l_enable_control),
1591 SND_SOC_DAPM_SWITCH("LOUT R Playback", SND_SOC_NOPM, 0, 0,
1592 &lout_r_enable_control),
1593 SND_SOC_DAPM_PGA("LOUT Amp", SND_SOC_NOPM, 0, 0, NULL, 0),
1594
1595 /* PDM */
1596 SND_SOC_DAPM_SUPPLY("PDM1 Power", RT5670_PWR_DIG2,
1597 RT5670_PWR_PDM1_BIT, 0, NULL, 0),
1598 SND_SOC_DAPM_SUPPLY("PDM2 Power", RT5670_PWR_DIG2,
1599 RT5670_PWR_PDM2_BIT, 0, NULL, 0),
1600
1601 SND_SOC_DAPM_MUX("PDM1 L Mux", RT5670_PDM_OUT_CTRL,
1602 RT5670_M_PDM1_L_SFT, 1, &rt5670_pdm1_l_mux),
1603 SND_SOC_DAPM_MUX("PDM1 R Mux", RT5670_PDM_OUT_CTRL,
1604 RT5670_M_PDM1_R_SFT, 1, &rt5670_pdm1_r_mux),
1605 SND_SOC_DAPM_MUX("PDM2 L Mux", RT5670_PDM_OUT_CTRL,
1606 RT5670_M_PDM2_L_SFT, 1, &rt5670_pdm2_l_mux),
1607 SND_SOC_DAPM_MUX("PDM2 R Mux", RT5670_PDM_OUT_CTRL,
1608 RT5670_M_PDM2_R_SFT, 1, &rt5670_pdm2_r_mux),
1609
1610 /* Output Lines */
1611 SND_SOC_DAPM_OUTPUT("HPOL"),
1612 SND_SOC_DAPM_OUTPUT("HPOR"),
1613 SND_SOC_DAPM_OUTPUT("LOUTL"),
1614 SND_SOC_DAPM_OUTPUT("LOUTR"),
1615 SND_SOC_DAPM_OUTPUT("PDM1L"),
1616 SND_SOC_DAPM_OUTPUT("PDM1R"),
1617 SND_SOC_DAPM_OUTPUT("PDM2L"),
1618 SND_SOC_DAPM_OUTPUT("PDM2R"),
1619};
1620
1621static const struct snd_soc_dapm_route rt5670_dapm_routes[] = {
1622 { "ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc },
1623 { "ADC Stereo2 Filter", NULL, "ADC STO2 ASRC", is_using_asrc },
1624 { "ADC Mono Left Filter", NULL, "ADC MONO L ASRC", is_using_asrc },
1625 { "ADC Mono Right Filter", NULL, "ADC MONO R ASRC", is_using_asrc },
1626 { "DAC Mono Left Filter", NULL, "DAC MONO L ASRC", is_using_asrc },
1627 { "DAC Mono Right Filter", NULL, "DAC MONO R ASRC", is_using_asrc },
1628 { "DAC Stereo1 Filter", NULL, "DAC STO ASRC", is_using_asrc },
1629
1630 { "I2S1", NULL, "I2S1 ASRC" },
1631 { "I2S2", NULL, "I2S2 ASRC" },
1632
1633 { "DMIC1", NULL, "DMIC L1" },
1634 { "DMIC1", NULL, "DMIC R1" },
1635 { "DMIC2", NULL, "DMIC L2" },
1636 { "DMIC2", NULL, "DMIC R2" },
1637 { "DMIC3", NULL, "DMIC L3" },
1638 { "DMIC3", NULL, "DMIC R3" },
1639
1640 { "BST1", NULL, "IN1P" },
1641 { "BST1", NULL, "IN1N" },
1642 { "BST1", NULL, "Mic Det Power" },
1643 { "BST2", NULL, "IN2P" },
1644 { "BST2", NULL, "IN2N" },
1645
1646 { "INL VOL", NULL, "IN2P" },
1647 { "INR VOL", NULL, "IN2N" },
1648
1649 { "RECMIXL", "INL Switch", "INL VOL" },
1650 { "RECMIXL", "BST2 Switch", "BST2" },
1651 { "RECMIXL", "BST1 Switch", "BST1" },
1652
1653 { "RECMIXR", "INR Switch", "INR VOL" },
1654 { "RECMIXR", "BST2 Switch", "BST2" },
1655 { "RECMIXR", "BST1 Switch", "BST1" },
1656
1657 { "ADC 1", NULL, "RECMIXL" },
1658 { "ADC 1", NULL, "ADC 1 power" },
1659 { "ADC 1", NULL, "ADC clock" },
1660 { "ADC 2", NULL, "RECMIXR" },
1661 { "ADC 2", NULL, "ADC 2 power" },
1662 { "ADC 2", NULL, "ADC clock" },
1663
1664 { "DMIC L1", NULL, "DMIC CLK" },
1665 { "DMIC L1", NULL, "DMIC1 Power" },
1666 { "DMIC R1", NULL, "DMIC CLK" },
1667 { "DMIC R1", NULL, "DMIC1 Power" },
1668 { "DMIC L2", NULL, "DMIC CLK" },
1669 { "DMIC L2", NULL, "DMIC2 Power" },
1670 { "DMIC R2", NULL, "DMIC CLK" },
1671 { "DMIC R2", NULL, "DMIC2 Power" },
1672 { "DMIC L3", NULL, "DMIC CLK" },
1673 { "DMIC L3", NULL, "DMIC3 Power" },
1674 { "DMIC R3", NULL, "DMIC CLK" },
1675 { "DMIC R3", NULL, "DMIC3 Power" },
1676
1677 { "Stereo1 DMIC Mux", "DMIC1", "DMIC1" },
1678 { "Stereo1 DMIC Mux", "DMIC2", "DMIC2" },
1679 { "Stereo1 DMIC Mux", "DMIC3", "DMIC3" },
1680
1681 { "Stereo2 DMIC Mux", "DMIC1", "DMIC1" },
1682 { "Stereo2 DMIC Mux", "DMIC2", "DMIC2" },
1683 { "Stereo2 DMIC Mux", "DMIC3", "DMIC3" },
1684
1685 { "Mono DMIC L Mux", "DMIC1", "DMIC L1" },
1686 { "Mono DMIC L Mux", "DMIC2", "DMIC L2" },
1687 { "Mono DMIC L Mux", "DMIC3", "DMIC L3" },
1688
1689 { "Mono DMIC R Mux", "DMIC1", "DMIC R1" },
1690 { "Mono DMIC R Mux", "DMIC2", "DMIC R2" },
1691 { "Mono DMIC R Mux", "DMIC3", "DMIC R3" },
1692
1693 { "ADC 1_2", NULL, "ADC 1" },
1694 { "ADC 1_2", NULL, "ADC 2" },
1695
1696 { "Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC Mux" },
1697 { "Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL" },
1698 { "Stereo1 ADC L1 Mux", "ADC", "ADC 1_2" },
1699 { "Stereo1 ADC L1 Mux", "DAC MIX", "DAC MIXL" },
1700
1701 { "Stereo1 ADC R1 Mux", "ADC", "ADC 1_2" },
1702 { "Stereo1 ADC R1 Mux", "DAC MIX", "DAC MIXR" },
1703 { "Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC Mux" },
1704 { "Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR" },
1705
1706 { "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" },
1707 { "Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
1708 { "Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL" },
1709 { "Mono ADC L1 Mux", "ADC1", "ADC 1" },
1710
1711 { "Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
1712 { "Mono ADC R1 Mux", "ADC2", "ADC 2" },
1713 { "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" },
1714 { "Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR" },
1715
1716 { "Sto1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux" },
1717 { "Sto1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux" },
1718 { "Sto1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux" },
1719 { "Sto1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux" },
1720
1721 { "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
1722 { "Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter" },
1723 { "ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll },
1724
1725 { "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
1726 { "Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter" },
1727 { "ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll },
1728
1729 { "Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux" },
1730 { "Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux" },
1731 { "Mono ADC MIXL", NULL, "ADC Mono Left Filter" },
1732 { "ADC Mono Left Filter", NULL, "PLL1", is_sys_clk_from_pll },
1733
1734 { "Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux" },
1735 { "Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux" },
1736 { "Mono ADC MIXR", NULL, "ADC Mono Right Filter" },
1737 { "ADC Mono Right Filter", NULL, "PLL1", is_sys_clk_from_pll },
1738
1739 { "Stereo2 ADC L2 Mux", "DMIC", "Stereo2 DMIC Mux" },
1740 { "Stereo2 ADC L2 Mux", "DAC MIX", "DAC MIXL" },
1741 { "Stereo2 ADC L1 Mux", "ADC", "ADC 1_2" },
1742 { "Stereo2 ADC L1 Mux", "DAC MIX", "DAC MIXL" },
1743
1744 { "Stereo2 ADC R1 Mux", "ADC", "ADC 1_2" },
1745 { "Stereo2 ADC R1 Mux", "DAC MIX", "DAC MIXR" },
1746 { "Stereo2 ADC R2 Mux", "DMIC", "Stereo2 DMIC Mux" },
1747 { "Stereo2 ADC R2 Mux", "DAC MIX", "DAC MIXR" },
1748
1749 { "Sto2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC L1 Mux" },
1750 { "Sto2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC L2 Mux" },
1751 { "Sto2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC R1 Mux" },
1752 { "Sto2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC R2 Mux" },
1753
1754 { "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXL" },
1755 { "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXR" },
1756
1757 { "Stereo2 ADC LR Mux", "L", "Sto2 ADC MIXL" },
1758 { "Stereo2 ADC LR Mux", "LR", "Sto2 ADC LR MIX" },
1759
1760 { "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" },
1761 { "Stereo2 ADC MIXL", NULL, "ADC Stereo2 Filter" },
1762 { "ADC Stereo2 Filter", NULL, "PLL1", is_sys_clk_from_pll },
1763
1764 { "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },
1765 { "Stereo2 ADC MIXR", NULL, "ADC Stereo2 Filter" },
1766 { "ADC Stereo2 Filter", NULL, "PLL1", is_sys_clk_from_pll },
1767
1768 { "VAD ADC Mux", "Sto1 ADC L", "Stereo1 ADC MIXL" },
1769 { "VAD ADC Mux", "Mono ADC L", "Mono ADC MIXL" },
1770 { "VAD ADC Mux", "Mono ADC R", "Mono ADC MIXR" },
1771 { "VAD ADC Mux", "Sto2 ADC L", "Sto2 ADC MIXL" },
1772
1773 { "VAD_ADC", NULL, "VAD ADC Mux" },
1774
1775 { "IF_ADC1", NULL, "Stereo1 ADC MIXL" },
1776 { "IF_ADC1", NULL, "Stereo1 ADC MIXR" },
1777 { "IF_ADC2", NULL, "Mono ADC MIXL" },
1778 { "IF_ADC2", NULL, "Mono ADC MIXR" },
1779 { "IF_ADC3", NULL, "Stereo2 ADC MIXL" },
1780 { "IF_ADC3", NULL, "Stereo2 ADC MIXR" },
1781
1782 { "IF1 ADC1 IN1 Mux", "IF_ADC1", "IF_ADC1" },
1783 { "IF1 ADC1 IN1 Mux", "IF1_ADC3", "IF1_ADC3" },
1784
1785 { "IF1 ADC1 IN2 Mux", "IF1_ADC1_IN1", "IF1 ADC1 IN1 Mux" },
1786 { "IF1 ADC1 IN2 Mux", "IF1_ADC4", "IF1_ADC4" },
1787
1788 { "IF1 ADC2 IN Mux", "IF_ADC2", "IF_ADC2" },
1789 { "IF1 ADC2 IN Mux", "VAD_ADC", "VAD_ADC" },
1790
1791 { "IF1 ADC2 IN1 Mux", "IF1_ADC2_IN", "IF1 ADC2 IN Mux" },
1792 { "IF1 ADC2 IN1 Mux", "IF1_ADC4", "IF1_ADC4" },
1793
1794 { "IF1_ADC1" , NULL, "IF1 ADC1 IN2 Mux" },
1795 { "IF1_ADC2" , NULL, "IF1 ADC2 IN1 Mux" },
1796
1797 { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL" },
1798 { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" },
1799 { "Stereo2 ADC MIX", NULL, "Sto2 ADC MIXL" },
1800 { "Stereo2 ADC MIX", NULL, "Sto2 ADC MIXR" },
1801 { "Mono ADC MIX", NULL, "Mono ADC MIXL" },
1802 { "Mono ADC MIX", NULL, "Mono ADC MIXR" },
1803
1804 { "RxDP Mux", "IF2 DAC", "IF2 DAC" },
1805 { "RxDP Mux", "IF1 DAC", "IF1 DAC2" },
1806 { "RxDP Mux", "STO1 ADC Mixer", "Stereo1 ADC MIX" },
1807 { "RxDP Mux", "STO2 ADC Mixer", "Stereo2 ADC MIX" },
1808 { "RxDP Mux", "Mono ADC Mixer L", "Mono ADC MIXL" },
1809 { "RxDP Mux", "Mono ADC Mixer R", "Mono ADC MIXR" },
1810 { "RxDP Mux", "DAC1", "DAC MIX" },
1811
1812 { "TDM Data Mux", "Slot 0-1", "Stereo1 ADC MIX" },
1813 { "TDM Data Mux", "Slot 2-3", "Mono ADC MIX" },
1814 { "TDM Data Mux", "Slot 4-5", "Stereo2 ADC MIX" },
1815 { "TDM Data Mux", "Slot 6-7", "IF2 DAC" },
1816
1817 { "DSP UL Mux", "Bypass", "TDM Data Mux" },
1818 { "DSP UL Mux", NULL, "I2S DSP" },
1819 { "DSP DL Mux", "Bypass", "RxDP Mux" },
1820 { "DSP DL Mux", NULL, "I2S DSP" },
1821
1822 { "TxDP_ADC_L", NULL, "DSP UL Mux" },
1823 { "TxDP_ADC_R", NULL, "DSP UL Mux" },
1824 { "TxDC_DAC", NULL, "DSP DL Mux" },
1825
1826 { "TxDP_ADC", NULL, "TxDP_ADC_L" },
1827 { "TxDP_ADC", NULL, "TxDP_ADC_R" },
1828
1829 { "IF1 ADC", NULL, "I2S1" },
1830 { "IF1 ADC", NULL, "IF1_ADC1" },
1831 { "IF1 ADC", NULL, "IF1_ADC2" },
1832 { "IF1 ADC", NULL, "IF_ADC3" },
1833 { "IF1 ADC", NULL, "TxDP_ADC" },
1834
1835 { "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" },
1836 { "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" },
1837 { "IF2 ADC Mux", "IF_ADC3", "IF_ADC3" },
1838 { "IF2 ADC Mux", "TxDC_DAC", "TxDC_DAC" },
1839 { "IF2 ADC Mux", "TxDP_ADC", "TxDP_ADC" },
1840 { "IF2 ADC Mux", "VAD_ADC", "VAD_ADC" },
1841
1842 { "IF2 ADC L", NULL, "IF2 ADC Mux" },
1843 { "IF2 ADC R", NULL, "IF2 ADC Mux" },
1844
1845 { "IF2 ADC", NULL, "I2S2" },
1846 { "IF2 ADC", NULL, "IF2 ADC L" },
1847 { "IF2 ADC", NULL, "IF2 ADC R" },
1848
1849 { "AIF1TX", NULL, "IF1 ADC" },
1850 { "AIF2TX", NULL, "IF2 ADC" },
1851
1852 { "IF1 DAC1", NULL, "AIF1RX" },
1853 { "IF1 DAC2", NULL, "AIF1RX" },
1854 { "IF2 DAC", NULL, "AIF2RX" },
1855
1856 { "IF1 DAC1", NULL, "I2S1" },
1857 { "IF1 DAC2", NULL, "I2S1" },
1858 { "IF2 DAC", NULL, "I2S2" },
1859
1860 { "IF1 DAC2 L", NULL, "IF1 DAC2" },
1861 { "IF1 DAC2 R", NULL, "IF1 DAC2" },
1862 { "IF1 DAC1 L", NULL, "IF1 DAC1" },
1863 { "IF1 DAC1 R", NULL, "IF1 DAC1" },
1864 { "IF2 DAC L", NULL, "IF2 DAC" },
1865 { "IF2 DAC R", NULL, "IF2 DAC" },
1866
1867 { "DAC1 L Mux", "IF1 DAC", "IF1 DAC1 L" },
1868 { "DAC1 L Mux", "IF2 DAC", "IF2 DAC L" },
1869
1870 { "DAC1 R Mux", "IF1 DAC", "IF1 DAC1 R" },
1871 { "DAC1 R Mux", "IF2 DAC", "IF2 DAC R" },
1872
1873 { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL" },
1874 { "DAC1 MIXL", "DAC1 Switch", "DAC1 L Mux" },
1875 { "DAC1 MIXL", NULL, "DAC Stereo1 Filter" },
1876 { "DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR" },
1877 { "DAC1 MIXR", "DAC1 Switch", "DAC1 R Mux" },
1878 { "DAC1 MIXR", NULL, "DAC Stereo1 Filter" },
1879
1880 { "DAC MIX", NULL, "DAC1 MIXL" },
1881 { "DAC MIX", NULL, "DAC1 MIXR" },
1882
1883 { "Audio DSP", NULL, "DAC1 MIXL" },
1884 { "Audio DSP", NULL, "DAC1 MIXR" },
1885
1886 { "DAC L2 Mux", "IF1 DAC", "IF1 DAC2 L" },
1887 { "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" },
1888 { "DAC L2 Mux", "TxDC DAC", "TxDC_DAC" },
1889 { "DAC L2 Mux", "VAD_ADC", "VAD_ADC" },
1890 { "DAC L2 Volume", NULL, "DAC L2 Mux" },
1891 { "DAC L2 Volume", NULL, "DAC Mono Left Filter" },
1892
1893 { "DAC R2 Mux", "IF1 DAC", "IF1 DAC2 R" },
1894 { "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" },
1895 { "DAC R2 Mux", "TxDC DAC", "TxDC_DAC" },
1896 { "DAC R2 Mux", "TxDP ADC", "TxDP_ADC" },
1897 { "DAC R2 Volume", NULL, "DAC R2 Mux" },
1898 { "DAC R2 Volume", NULL, "DAC Mono Right Filter" },
1899
1900 { "Stereo DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
1901 { "Stereo DAC MIXL", "DAC R1 Switch", "DAC1 MIXR" },
1902 { "Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" },
1903 { "Stereo DAC MIXL", NULL, "DAC Stereo1 Filter" },
1904 { "Stereo DAC MIXL", NULL, "DAC L1 Power" },
1905 { "Stereo DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
1906 { "Stereo DAC MIXR", "DAC L1 Switch", "DAC1 MIXL" },
1907 { "Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
1908 { "Stereo DAC MIXR", NULL, "DAC Stereo1 Filter" },
1909 { "Stereo DAC MIXR", NULL, "DAC R1 Power" },
1910
1911 { "Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" },
1912 { "Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" },
1913 { "Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Volume" },
1914 { "Mono DAC MIXL", NULL, "DAC Mono Left Filter" },
1915 { "Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" },
1916 { "Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
1917 { "Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" },
1918 { "Mono DAC MIXR", NULL, "DAC Mono Right Filter" },
1919
1920 { "DAC MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
1921 { "DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" },
1922 { "DAC MIXL", "DAC R2 Switch", "DAC R2 Volume" },
1923 { "DAC MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
1924 { "DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" },
1925 { "DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" },
1926
1927 { "DAC L1", NULL, "DAC L1 Power" },
1928 { "DAC L1", NULL, "Stereo DAC MIXL" },
1929 { "DAC L1", NULL, "PLL1", is_sys_clk_from_pll },
1930 { "DAC R1", NULL, "DAC R1 Power" },
1931 { "DAC R1", NULL, "Stereo DAC MIXR" },
1932 { "DAC R1", NULL, "PLL1", is_sys_clk_from_pll },
1933 { "DAC L2", NULL, "Mono DAC MIXL" },
1934 { "DAC L2", NULL, "PLL1", is_sys_clk_from_pll },
1935 { "DAC R2", NULL, "Mono DAC MIXR" },
1936 { "DAC R2", NULL, "PLL1", is_sys_clk_from_pll },
1937
1938 { "OUT MIXL", "BST1 Switch", "BST1" },
1939 { "OUT MIXL", "INL Switch", "INL VOL" },
1940 { "OUT MIXL", "DAC L2 Switch", "DAC L2" },
1941 { "OUT MIXL", "DAC L1 Switch", "DAC L1" },
1942
1943 { "OUT MIXR", "BST2 Switch", "BST2" },
1944 { "OUT MIXR", "INR Switch", "INR VOL" },
1945 { "OUT MIXR", "DAC R2 Switch", "DAC R2" },
1946 { "OUT MIXR", "DAC R1 Switch", "DAC R1" },
1947
1948 { "HPOVOL MIXL", "DAC1 Switch", "DAC L1" },
1949 { "HPOVOL MIXL", "INL Switch", "INL VOL" },
1950 { "HPOVOL MIXR", "DAC1 Switch", "DAC R1" },
1951 { "HPOVOL MIXR", "INR Switch", "INR VOL" },
1952
1953 { "DAC 2", NULL, "DAC L2" },
1954 { "DAC 2", NULL, "DAC R2" },
1955 { "DAC 1", NULL, "DAC L1" },
1956 { "DAC 1", NULL, "DAC R1" },
1957 { "HPOVOL", NULL, "HPOVOL MIXL" },
1958 { "HPOVOL", NULL, "HPOVOL MIXR" },
1959 { "HPO MIX", "DAC1 Switch", "DAC 1" },
1960 { "HPO MIX", "HPVOL Switch", "HPOVOL" },
1961
1962 { "LOUT MIX", "DAC L1 Switch", "DAC L1" },
1963 { "LOUT MIX", "DAC R1 Switch", "DAC R1" },
1964 { "LOUT MIX", "OUTMIX L Switch", "OUT MIXL" },
1965 { "LOUT MIX", "OUTMIX R Switch", "OUT MIXR" },
1966
1967 { "PDM1 L Mux", "Stereo DAC", "Stereo DAC MIXL" },
1968 { "PDM1 L Mux", "Mono DAC", "Mono DAC MIXL" },
1969 { "PDM1 L Mux", NULL, "PDM1 Power" },
1970 { "PDM1 R Mux", "Stereo DAC", "Stereo DAC MIXR" },
1971 { "PDM1 R Mux", "Mono DAC", "Mono DAC MIXR" },
1972 { "PDM1 R Mux", NULL, "PDM1 Power" },
1973 { "PDM2 L Mux", "Stereo DAC", "Stereo DAC MIXL" },
1974 { "PDM2 L Mux", "Mono DAC", "Mono DAC MIXL" },
1975 { "PDM2 L Mux", NULL, "PDM2 Power" },
1976 { "PDM2 R Mux", "Stereo DAC", "Stereo DAC MIXR" },
1977 { "PDM2 R Mux", "Mono DAC", "Mono DAC MIXR" },
1978 { "PDM2 R Mux", NULL, "PDM2 Power" },
1979
1980 { "HP Amp", NULL, "HPO MIX" },
1981 { "HP Amp", NULL, "Mic Det Power" },
1982 { "HPOL", NULL, "HP Amp" },
1983 { "HPOL", NULL, "HP L Amp" },
1984 { "HPOL", NULL, "Improve HP Amp Drv" },
1985 { "HPOR", NULL, "HP Amp" },
1986 { "HPOR", NULL, "HP R Amp" },
1987 { "HPOR", NULL, "Improve HP Amp Drv" },
1988
1989 { "LOUT Amp", NULL, "LOUT MIX" },
1990 { "LOUT L Playback", "Switch", "LOUT Amp" },
1991 { "LOUT R Playback", "Switch", "LOUT Amp" },
1992 { "LOUTL", NULL, "LOUT L Playback" },
1993 { "LOUTR", NULL, "LOUT R Playback" },
1994 { "LOUTL", NULL, "Improve HP Amp Drv" },
1995 { "LOUTR", NULL, "Improve HP Amp Drv" },
1996
1997 { "PDM1L", NULL, "PDM1 L Mux" },
1998 { "PDM1R", NULL, "PDM1 R Mux" },
1999 { "PDM2L", NULL, "PDM2 L Mux" },
2000 { "PDM2R", NULL, "PDM2 R Mux" },
2001};
2002
2003static int rt5670_hw_params(struct snd_pcm_substream *substream,
2004 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
2005{
2006 struct snd_soc_codec *codec = dai->codec;
2007 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2008 unsigned int val_len = 0, val_clk, mask_clk;
2009 int pre_div, bclk_ms, frame_size;
2010
2011 rt5670->lrck[dai->id] = params_rate(params);
2012 pre_div = rl6231_get_clk_info(rt5670->sysclk, rt5670->lrck[dai->id]);
2013 if (pre_div < 0) {
2014 dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n",
2015 rt5670->lrck[dai->id], dai->id);
2016 return -EINVAL;
2017 }
2018 frame_size = snd_soc_params_to_frame_size(params);
2019 if (frame_size < 0) {
2020 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
2021 return -EINVAL;
2022 }
2023 bclk_ms = frame_size > 32;
2024 rt5670->bclk[dai->id] = rt5670->lrck[dai->id] * (32 << bclk_ms);
2025
2026 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
2027 rt5670->bclk[dai->id], rt5670->lrck[dai->id]);
2028 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
2029 bclk_ms, pre_div, dai->id);
2030
2031 switch (params_width(params)) {
2032 case 16:
2033 break;
2034 case 20:
2035 val_len |= RT5670_I2S_DL_20;
2036 break;
2037 case 24:
2038 val_len |= RT5670_I2S_DL_24;
2039 break;
2040 case 8:
2041 val_len |= RT5670_I2S_DL_8;
2042 break;
2043 default:
2044 return -EINVAL;
2045 }
2046
2047 switch (dai->id) {
2048 case RT5670_AIF1:
2049 mask_clk = RT5670_I2S_BCLK_MS1_MASK | RT5670_I2S_PD1_MASK;
2050 val_clk = bclk_ms << RT5670_I2S_BCLK_MS1_SFT |
2051 pre_div << RT5670_I2S_PD1_SFT;
2052 snd_soc_update_bits(codec, RT5670_I2S1_SDP,
2053 RT5670_I2S_DL_MASK, val_len);
2054 snd_soc_update_bits(codec, RT5670_ADDA_CLK1, mask_clk, val_clk);
2055 break;
2056 case RT5670_AIF2:
2057 mask_clk = RT5670_I2S_BCLK_MS2_MASK | RT5670_I2S_PD2_MASK;
2058 val_clk = bclk_ms << RT5670_I2S_BCLK_MS2_SFT |
2059 pre_div << RT5670_I2S_PD2_SFT;
2060 snd_soc_update_bits(codec, RT5670_I2S2_SDP,
2061 RT5670_I2S_DL_MASK, val_len);
2062 snd_soc_update_bits(codec, RT5670_ADDA_CLK1, mask_clk, val_clk);
2063 break;
2064 default:
2065 dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
2066 return -EINVAL;
2067 }
2068
2069 return 0;
2070}
2071
2072static int rt5670_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2073{
2074 struct snd_soc_codec *codec = dai->codec;
2075 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2076 unsigned int reg_val = 0;
2077
2078 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
2079 case SND_SOC_DAIFMT_CBM_CFM:
2080 rt5670->master[dai->id] = 1;
2081 break;
2082 case SND_SOC_DAIFMT_CBS_CFS:
2083 reg_val |= RT5670_I2S_MS_S;
2084 rt5670->master[dai->id] = 0;
2085 break;
2086 default:
2087 return -EINVAL;
2088 }
2089
2090 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
2091 case SND_SOC_DAIFMT_NB_NF:
2092 break;
2093 case SND_SOC_DAIFMT_IB_NF:
2094 reg_val |= RT5670_I2S_BP_INV;
2095 break;
2096 default:
2097 return -EINVAL;
2098 }
2099
2100 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2101 case SND_SOC_DAIFMT_I2S:
2102 break;
2103 case SND_SOC_DAIFMT_LEFT_J:
2104 reg_val |= RT5670_I2S_DF_LEFT;
2105 break;
2106 case SND_SOC_DAIFMT_DSP_A:
2107 reg_val |= RT5670_I2S_DF_PCM_A;
2108 break;
2109 case SND_SOC_DAIFMT_DSP_B:
2110 reg_val |= RT5670_I2S_DF_PCM_B;
2111 break;
2112 default:
2113 return -EINVAL;
2114 }
2115
2116 switch (dai->id) {
2117 case RT5670_AIF1:
2118 snd_soc_update_bits(codec, RT5670_I2S1_SDP,
2119 RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK |
2120 RT5670_I2S_DF_MASK, reg_val);
2121 break;
2122 case RT5670_AIF2:
2123 snd_soc_update_bits(codec, RT5670_I2S2_SDP,
2124 RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK |
2125 RT5670_I2S_DF_MASK, reg_val);
2126 break;
2127 default:
2128 dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
2129 return -EINVAL;
2130 }
2131 return 0;
2132}
2133
2134static int rt5670_set_dai_sysclk(struct snd_soc_dai *dai,
2135 int clk_id, unsigned int freq, int dir)
2136{
2137 struct snd_soc_codec *codec = dai->codec;
2138 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2139 unsigned int reg_val = 0;
2140
2141 if (freq == rt5670->sysclk && clk_id == rt5670->sysclk_src)
2142 return 0;
2143
2144 switch (clk_id) {
2145 case RT5670_SCLK_S_MCLK:
2146 reg_val |= RT5670_SCLK_SRC_MCLK;
2147 break;
2148 case RT5670_SCLK_S_PLL1:
2149 reg_val |= RT5670_SCLK_SRC_PLL1;
2150 break;
2151 case RT5670_SCLK_S_RCCLK:
2152 reg_val |= RT5670_SCLK_SRC_RCCLK;
2153 break;
2154 default:
2155 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
2156 return -EINVAL;
2157 }
2158 snd_soc_update_bits(codec, RT5670_GLB_CLK,
2159 RT5670_SCLK_SRC_MASK, reg_val);
2160 rt5670->sysclk = freq;
2161 rt5670->sysclk_src = clk_id;
2162
2163 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
2164
2165 return 0;
2166}
2167
2168static int rt5670_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
2169 unsigned int freq_in, unsigned int freq_out)
2170{
2171 struct snd_soc_codec *codec = dai->codec;
2172 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2173 struct rl6231_pll_code pll_code;
2174 int ret;
2175
2176 if (source == rt5670->pll_src && freq_in == rt5670->pll_in &&
2177 freq_out == rt5670->pll_out)
2178 return 0;
2179
2180 if (!freq_in || !freq_out) {
2181 dev_dbg(codec->dev, "PLL disabled\n");
2182
2183 rt5670->pll_in = 0;
2184 rt5670->pll_out = 0;
2185 snd_soc_update_bits(codec, RT5670_GLB_CLK,
2186 RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_MCLK);
2187 return 0;
2188 }
2189
2190 switch (source) {
2191 case RT5670_PLL1_S_MCLK:
2192 snd_soc_update_bits(codec, RT5670_GLB_CLK,
2193 RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_MCLK);
2194 break;
2195 case RT5670_PLL1_S_BCLK1:
2196 case RT5670_PLL1_S_BCLK2:
2197 case RT5670_PLL1_S_BCLK3:
2198 case RT5670_PLL1_S_BCLK4:
2199 switch (dai->id) {
2200 case RT5670_AIF1:
2201 snd_soc_update_bits(codec, RT5670_GLB_CLK,
2202 RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK1);
2203 break;
2204 case RT5670_AIF2:
2205 snd_soc_update_bits(codec, RT5670_GLB_CLK,
2206 RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK2);
2207 break;
2208 default:
2209 dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
2210 return -EINVAL;
2211 }
2212 break;
2213 default:
2214 dev_err(codec->dev, "Unknown PLL source %d\n", source);
2215 return -EINVAL;
2216 }
2217
2218 ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
2219 if (ret < 0) {
2220 dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
2221 return ret;
2222 }
2223
2224 dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
2225 pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
2226 pll_code.n_code, pll_code.k_code);
2227
2228 snd_soc_write(codec, RT5670_PLL_CTRL1,
2229 pll_code.n_code << RT5670_PLL_N_SFT | pll_code.k_code);
2230 snd_soc_write(codec, RT5670_PLL_CTRL2,
2231 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5670_PLL_M_SFT |
2232 pll_code.m_bp << RT5670_PLL_M_BP_SFT);
2233
2234 rt5670->pll_in = freq_in;
2235 rt5670->pll_out = freq_out;
2236 rt5670->pll_src = source;
2237
2238 return 0;
2239}
2240
2241static int rt5670_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
2242 unsigned int rx_mask, int slots, int slot_width)
2243{
2244 struct snd_soc_codec *codec = dai->codec;
2245 unsigned int val = 0;
2246
2247 if (rx_mask || tx_mask)
2248 val |= (1 << 14);
2249
2250 switch (slots) {
2251 case 4:
2252 val |= (1 << 12);
2253 break;
2254 case 6:
2255 val |= (2 << 12);
2256 break;
2257 case 8:
2258 val |= (3 << 12);
2259 break;
2260 case 2:
2261 break;
2262 default:
2263 return -EINVAL;
2264 }
2265
2266 switch (slot_width) {
2267 case 20:
2268 val |= (1 << 10);
2269 break;
2270 case 24:
2271 val |= (2 << 10);
2272 break;
2273 case 32:
2274 val |= (3 << 10);
2275 break;
2276 case 16:
2277 break;
2278 default:
2279 return -EINVAL;
2280 }
2281
2282 snd_soc_update_bits(codec, RT5670_TDM_CTRL_1, 0x7c00, val);
2283
2284 return 0;
2285}
2286
2287static int rt5670_set_bias_level(struct snd_soc_codec *codec,
2288 enum snd_soc_bias_level level)
2289{
2290 switch (level) {
2291 case SND_SOC_BIAS_PREPARE:
2292 if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level) {
2293 snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2294 RT5670_PWR_VREF1 | RT5670_PWR_MB |
2295 RT5670_PWR_BG | RT5670_PWR_VREF2,
2296 RT5670_PWR_VREF1 | RT5670_PWR_MB |
2297 RT5670_PWR_BG | RT5670_PWR_VREF2);
2298 mdelay(10);
2299 snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2300 RT5670_PWR_FV1 | RT5670_PWR_FV2,
2301 RT5670_PWR_FV1 | RT5670_PWR_FV2);
2302 snd_soc_update_bits(codec, RT5670_CHARGE_PUMP,
2303 RT5670_OSW_L_MASK | RT5670_OSW_R_MASK,
2304 RT5670_OSW_L_DIS | RT5670_OSW_R_DIS);
2305 snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x1);
2306 snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2307 RT5670_LDO_SEL_MASK, 0x3);
2308 }
2309 break;
2310 case SND_SOC_BIAS_STANDBY:
2311 snd_soc_write(codec, RT5670_PWR_DIG1, 0x0000);
2312 snd_soc_write(codec, RT5670_PWR_DIG2, 0x0001);
2313 snd_soc_write(codec, RT5670_PWR_VOL, 0x0000);
2314 snd_soc_write(codec, RT5670_PWR_MIXER, 0x0001);
2315 snd_soc_write(codec, RT5670_PWR_ANLG1, 0x2800);
2316 snd_soc_write(codec, RT5670_PWR_ANLG2, 0x0004);
2317 snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x0);
2318 snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2319 RT5670_LDO_SEL_MASK, 0x1);
2320 break;
2321
2322 default:
2323 break;
2324 }
2325 codec->dapm.bias_level = level;
2326
2327 return 0;
2328}
2329
2330static int rt5670_probe(struct snd_soc_codec *codec)
2331{
2332 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2333
2334 rt5670->codec = codec;
2335
2336 return 0;
2337}
2338
2339static int rt5670_remove(struct snd_soc_codec *codec)
2340{
2341 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2342
2343 regmap_write(rt5670->regmap, RT5670_RESET, 0);
2344 return 0;
2345}
2346
2347#ifdef CONFIG_PM
2348static int rt5670_suspend(struct snd_soc_codec *codec)
2349{
2350 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2351
2352 regcache_cache_only(rt5670->regmap, true);
2353 regcache_mark_dirty(rt5670->regmap);
2354 return 0;
2355}
2356
2357static int rt5670_resume(struct snd_soc_codec *codec)
2358{
2359 struct rt5670_priv *rt5670 = snd_soc_codec_get_drvdata(codec);
2360
2361 regcache_cache_only(rt5670->regmap, false);
2362 regcache_sync(rt5670->regmap);
2363
2364 return 0;
2365}
2366#else
2367#define rt5670_suspend NULL
2368#define rt5670_resume NULL
2369#endif
2370
2371#define RT5670_STEREO_RATES SNDRV_PCM_RATE_8000_96000
2372#define RT5670_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
2373 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
2374
2375static struct snd_soc_dai_ops rt5670_aif_dai_ops = {
2376 .hw_params = rt5670_hw_params,
2377 .set_fmt = rt5670_set_dai_fmt,
2378 .set_sysclk = rt5670_set_dai_sysclk,
2379 .set_tdm_slot = rt5670_set_tdm_slot,
2380 .set_pll = rt5670_set_dai_pll,
2381};
2382
2383static struct snd_soc_dai_driver rt5670_dai[] = {
2384 {
2385 .name = "rt5670-aif1",
2386 .id = RT5670_AIF1,
2387 .playback = {
2388 .stream_name = "AIF1 Playback",
2389 .channels_min = 1,
2390 .channels_max = 2,
2391 .rates = RT5670_STEREO_RATES,
2392 .formats = RT5670_FORMATS,
2393 },
2394 .capture = {
2395 .stream_name = "AIF1 Capture",
2396 .channels_min = 1,
2397 .channels_max = 2,
2398 .rates = RT5670_STEREO_RATES,
2399 .formats = RT5670_FORMATS,
2400 },
2401 .ops = &rt5670_aif_dai_ops,
2402 },
2403 {
2404 .name = "rt5670-aif2",
2405 .id = RT5670_AIF2,
2406 .playback = {
2407 .stream_name = "AIF2 Playback",
2408 .channels_min = 1,
2409 .channels_max = 2,
2410 .rates = RT5670_STEREO_RATES,
2411 .formats = RT5670_FORMATS,
2412 },
2413 .capture = {
2414 .stream_name = "AIF2 Capture",
2415 .channels_min = 1,
2416 .channels_max = 2,
2417 .rates = RT5670_STEREO_RATES,
2418 .formats = RT5670_FORMATS,
2419 },
2420 .ops = &rt5670_aif_dai_ops,
2421 },
2422};
2423
2424static struct snd_soc_codec_driver soc_codec_dev_rt5670 = {
2425 .probe = rt5670_probe,
2426 .remove = rt5670_remove,
2427 .suspend = rt5670_suspend,
2428 .resume = rt5670_resume,
2429 .set_bias_level = rt5670_set_bias_level,
2430 .idle_bias_off = true,
2431 .controls = rt5670_snd_controls,
2432 .num_controls = ARRAY_SIZE(rt5670_snd_controls),
2433 .dapm_widgets = rt5670_dapm_widgets,
2434 .num_dapm_widgets = ARRAY_SIZE(rt5670_dapm_widgets),
2435 .dapm_routes = rt5670_dapm_routes,
2436 .num_dapm_routes = ARRAY_SIZE(rt5670_dapm_routes),
2437};
2438
2439static const struct regmap_config rt5670_regmap = {
2440 .reg_bits = 8,
2441 .val_bits = 16,
2442 .max_register = RT5670_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5670_ranges) *
2443 RT5670_PR_SPACING),
2444 .volatile_reg = rt5670_volatile_register,
2445 .readable_reg = rt5670_readable_register,
2446 .cache_type = REGCACHE_RBTREE,
2447 .reg_defaults = rt5670_reg,
2448 .num_reg_defaults = ARRAY_SIZE(rt5670_reg),
2449 .ranges = rt5670_ranges,
2450 .num_ranges = ARRAY_SIZE(rt5670_ranges),
2451};
2452
2453static const struct i2c_device_id rt5670_i2c_id[] = {
2454 { "rt5670", 0 },
2455 { }
2456};
2457MODULE_DEVICE_TABLE(i2c, rt5670_i2c_id);
2458
2459static int rt5670_i2c_probe(struct i2c_client *i2c,
2460 const struct i2c_device_id *id)
2461{
2462 struct rt5670_platform_data *pdata = dev_get_platdata(&i2c->dev);
2463 struct rt5670_priv *rt5670;
2464 int ret;
2465 unsigned int val;
2466
2467 rt5670 = devm_kzalloc(&i2c->dev,
2468 sizeof(struct rt5670_priv),
2469 GFP_KERNEL);
2470 if (NULL == rt5670)
2471 return -ENOMEM;
2472
2473 i2c_set_clientdata(i2c, rt5670);
2474
2475 if (pdata)
2476 rt5670->pdata = *pdata;
2477
2478 rt5670->regmap = devm_regmap_init_i2c(i2c, &rt5670_regmap);
2479 if (IS_ERR(rt5670->regmap)) {
2480 ret = PTR_ERR(rt5670->regmap);
2481 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
2482 ret);
2483 return ret;
2484 }
2485
2486 regmap_read(rt5670->regmap, RT5670_VENDOR_ID2, &val);
2487 if (val != RT5670_DEVICE_ID) {
2488 dev_err(&i2c->dev,
2489 "Device with ID register %x is not rt5670/72\n", val);
2490 return -ENODEV;
2491 }
2492
2493 regmap_write(rt5670->regmap, RT5670_RESET, 0);
2494 regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1,
2495 RT5670_PWR_HP_L | RT5670_PWR_HP_R |
2496 RT5670_PWR_VREF2, RT5670_PWR_VREF2);
2497 msleep(100);
2498
2499 regmap_write(rt5670->regmap, RT5670_RESET, 0);
2500
2501 ret = regmap_register_patch(rt5670->regmap, init_list,
2502 ARRAY_SIZE(init_list));
2503 if (ret != 0)
2504 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
2505
2506 if (rt5670->pdata.in2_diff)
2507 regmap_update_bits(rt5670->regmap, RT5670_IN2,
2508 RT5670_IN_DF2, RT5670_IN_DF2);
2509
2510 if (i2c->irq) {
2511 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
2512 RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_IRQ);
2513 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
2514 RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT);
2515
2516 }
2517
2518 if (rt5670->pdata.jd_mode) {
2519 regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1,
2520 RT5670_PWR_MB, RT5670_PWR_MB);
2521 regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG2,
2522 RT5670_PWR_JD1, RT5670_PWR_JD1);
2523 regmap_update_bits(rt5670->regmap, RT5670_IRQ_CTRL1,
2524 RT5670_JD1_1_EN_MASK, RT5670_JD1_1_EN);
2525 regmap_update_bits(rt5670->regmap, RT5670_JD_CTRL3,
2526 RT5670_JD_TRI_CBJ_SEL_MASK |
2527 RT5670_JD_TRI_HPO_SEL_MASK,
2528 RT5670_JD_CBJ_JD1_1 | RT5670_JD_HPO_JD1_1);
2529 switch (rt5670->pdata.jd_mode) {
2530 case 1:
2531 regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1,
2532 RT5670_JD1_MODE_MASK,
2533 RT5670_JD1_MODE_0);
2534 break;
2535 case 2:
2536 regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1,
2537 RT5670_JD1_MODE_MASK,
2538 RT5670_JD1_MODE_1);
2539 break;
2540 case 3:
2541 regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1,
2542 RT5670_JD1_MODE_MASK,
2543 RT5670_JD1_MODE_2);
2544 break;
2545 default:
2546 break;
2547 }
2548 }
2549
2550 if (rt5670->pdata.dmic_en) {
2551 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
2552 RT5670_GP2_PIN_MASK,
2553 RT5670_GP2_PIN_DMIC1_SCL);
2554
2555 switch (rt5670->pdata.dmic1_data_pin) {
2556 case RT5670_DMIC_DATA_IN2P:
2557 regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
2558 RT5670_DMIC_1_DP_MASK,
2559 RT5670_DMIC_1_DP_IN2P);
2560 break;
2561
2562 case RT5670_DMIC_DATA_GPIO6:
2563 regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
2564 RT5670_DMIC_1_DP_MASK,
2565 RT5670_DMIC_1_DP_GPIO6);
2566 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
2567 RT5670_GP6_PIN_MASK,
2568 RT5670_GP6_PIN_DMIC1_SDA);
2569 break;
2570
2571 case RT5670_DMIC_DATA_GPIO7:
2572 regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
2573 RT5670_DMIC_1_DP_MASK,
2574 RT5670_DMIC_1_DP_GPIO7);
2575 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
2576 RT5670_GP7_PIN_MASK,
2577 RT5670_GP7_PIN_DMIC1_SDA);
2578 break;
2579
2580 default:
2581 break;
2582 }
2583
2584 switch (rt5670->pdata.dmic2_data_pin) {
2585 case RT5670_DMIC_DATA_IN3N:
2586 regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
2587 RT5670_DMIC_2_DP_MASK,
2588 RT5670_DMIC_2_DP_IN3N);
2589 break;
2590
2591 case RT5670_DMIC_DATA_GPIO8:
2592 regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1,
2593 RT5670_DMIC_2_DP_MASK,
2594 RT5670_DMIC_2_DP_GPIO8);
2595 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
2596 RT5670_GP8_PIN_MASK,
2597 RT5670_GP8_PIN_DMIC2_SDA);
2598 break;
2599
2600 default:
2601 break;
2602 }
2603
2604 switch (rt5670->pdata.dmic3_data_pin) {
2605 case RT5670_DMIC_DATA_GPIO5:
2606 regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL2,
2607 RT5670_DMIC_3_DP_MASK,
2608 RT5670_DMIC_3_DP_GPIO5);
2609 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
2610 RT5670_GP5_PIN_MASK,
2611 RT5670_GP5_PIN_DMIC3_SDA);
2612 break;
2613
2614 case RT5670_DMIC_DATA_GPIO9:
2615 case RT5670_DMIC_DATA_GPIO10:
2616 dev_err(&i2c->dev,
2617 "Always use GPIO5 as DMIC3 data pin\n");
2618 break;
2619
2620 default:
2621 break;
2622 }
2623
2624 }
2625
2626 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5670,
2627 rt5670_dai, ARRAY_SIZE(rt5670_dai));
2628 if (ret < 0)
2629 goto err;
2630
2631 return 0;
2632err:
2633 return ret;
2634}
2635
2636static int rt5670_i2c_remove(struct i2c_client *i2c)
2637{
2638 snd_soc_unregister_codec(&i2c->dev);
2639
2640 return 0;
2641}
2642
2643static struct i2c_driver rt5670_i2c_driver = {
2644 .driver = {
2645 .name = "rt5670",
2646 .owner = THIS_MODULE,
2647 },
2648 .probe = rt5670_i2c_probe,
2649 .remove = rt5670_i2c_remove,
2650 .id_table = rt5670_i2c_id,
2651};
2652
2653module_i2c_driver(rt5670_i2c_driver);
2654
2655MODULE_DESCRIPTION("ASoC RT5670 driver");
2656MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
2657MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/rt5670.h b/sound/soc/codecs/rt5670.h
new file mode 100644
index 000000000000..a0b5c855b492
--- /dev/null
+++ b/sound/soc/codecs/rt5670.h
@@ -0,0 +1,2000 @@
1/*
2 * rt5670.h -- RT5670 ALSA SoC audio driver
3 *
4 * Copyright 2014 Realtek Microelectronics
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __RT5670_H__
13#define __RT5670_H__
14
15#include <sound/rt5670.h>
16
17/* Info */
18#define RT5670_RESET 0x00
19#define RT5670_VENDOR_ID 0xfd
20#define RT5670_VENDOR_ID1 0xfe
21#define RT5670_VENDOR_ID2 0xff
22/* I/O - Output */
23#define RT5670_HP_VOL 0x02
24#define RT5670_LOUT1 0x03
25/* I/O - Input */
26#define RT5670_CJ_CTRL1 0x0a
27#define RT5670_CJ_CTRL2 0x0b
28#define RT5670_CJ_CTRL3 0x0c
29#define RT5670_IN2 0x0e
30#define RT5670_INL1_INR1_VOL 0x0f
31/* I/O - ADC/DAC/DMIC */
32#define RT5670_DAC1_DIG_VOL 0x19
33#define RT5670_DAC2_DIG_VOL 0x1a
34#define RT5670_DAC_CTRL 0x1b
35#define RT5670_STO1_ADC_DIG_VOL 0x1c
36#define RT5670_MONO_ADC_DIG_VOL 0x1d
37#define RT5670_ADC_BST_VOL1 0x1e
38#define RT5670_STO2_ADC_DIG_VOL 0x1f
39/* Mixer - D-D */
40#define RT5670_ADC_BST_VOL2 0x20
41#define RT5670_STO2_ADC_MIXER 0x26
42#define RT5670_STO1_ADC_MIXER 0x27
43#define RT5670_MONO_ADC_MIXER 0x28
44#define RT5670_AD_DA_MIXER 0x29
45#define RT5670_STO_DAC_MIXER 0x2a
46#define RT5670_DD_MIXER 0x2b
47#define RT5670_DIG_MIXER 0x2c
48#define RT5670_DSP_PATH1 0x2d
49#define RT5670_DSP_PATH2 0x2e
50#define RT5670_DIG_INF1_DATA 0x2f
51#define RT5670_DIG_INF2_DATA 0x30
52/* Mixer - PDM */
53#define RT5670_PDM_OUT_CTRL 0x31
54#define RT5670_PDM_DATA_CTRL1 0x32
55#define RT5670_PDM1_DATA_CTRL2 0x33
56#define RT5670_PDM1_DATA_CTRL3 0x34
57#define RT5670_PDM1_DATA_CTRL4 0x35
58#define RT5670_PDM2_DATA_CTRL2 0x36
59#define RT5670_PDM2_DATA_CTRL3 0x37
60#define RT5670_PDM2_DATA_CTRL4 0x38
61/* Mixer - ADC */
62#define RT5670_REC_L1_MIXER 0x3b
63#define RT5670_REC_L2_MIXER 0x3c
64#define RT5670_REC_R1_MIXER 0x3d
65#define RT5670_REC_R2_MIXER 0x3e
66/* Mixer - DAC */
67#define RT5670_HPO_MIXER 0x45
68#define RT5670_MONO_MIXER 0x4c
69#define RT5670_OUT_L1_MIXER 0x4f
70#define RT5670_OUT_R1_MIXER 0x52
71#define RT5670_LOUT_MIXER 0x53
72/* Power */
73#define RT5670_PWR_DIG1 0x61
74#define RT5670_PWR_DIG2 0x62
75#define RT5670_PWR_ANLG1 0x63
76#define RT5670_PWR_ANLG2 0x64
77#define RT5670_PWR_MIXER 0x65
78#define RT5670_PWR_VOL 0x66
79/* Private Register Control */
80#define RT5670_PRIV_INDEX 0x6a
81#define RT5670_PRIV_DATA 0x6c
82/* Format - ADC/DAC */
83#define RT5670_I2S4_SDP 0x6f
84#define RT5670_I2S1_SDP 0x70
85#define RT5670_I2S2_SDP 0x71
86#define RT5670_I2S3_SDP 0x72
87#define RT5670_ADDA_CLK1 0x73
88#define RT5670_ADDA_CLK2 0x74
89#define RT5670_DMIC_CTRL1 0x75
90#define RT5670_DMIC_CTRL2 0x76
91/* Format - TDM Control */
92#define RT5670_TDM_CTRL_1 0x77
93#define RT5670_TDM_CTRL_2 0x78
94#define RT5670_TDM_CTRL_3 0x79
95
96/* Function - Analog */
97#define RT5670_DSP_CLK 0x7f
98#define RT5670_GLB_CLK 0x80
99#define RT5670_PLL_CTRL1 0x81
100#define RT5670_PLL_CTRL2 0x82
101#define RT5670_ASRC_1 0x83
102#define RT5670_ASRC_2 0x84
103#define RT5670_ASRC_3 0x85
104#define RT5670_ASRC_4 0x86
105#define RT5670_ASRC_5 0x87
106#define RT5670_ASRC_7 0x89
107#define RT5670_ASRC_8 0x8a
108#define RT5670_ASRC_9 0x8b
109#define RT5670_ASRC_10 0x8c
110#define RT5670_ASRC_11 0x8d
111#define RT5670_DEPOP_M1 0x8e
112#define RT5670_DEPOP_M2 0x8f
113#define RT5670_DEPOP_M3 0x90
114#define RT5670_CHARGE_PUMP 0x91
115#define RT5670_MICBIAS 0x93
116#define RT5670_A_JD_CTRL1 0x94
117#define RT5670_A_JD_CTRL2 0x95
118#define RT5670_ASRC_12 0x97
119#define RT5670_ASRC_13 0x98
120#define RT5670_ASRC_14 0x99
121#define RT5670_VAD_CTRL1 0x9a
122#define RT5670_VAD_CTRL2 0x9b
123#define RT5670_VAD_CTRL3 0x9c
124#define RT5670_VAD_CTRL4 0x9d
125#define RT5670_VAD_CTRL5 0x9e
126/* Function - Digital */
127#define RT5670_ADC_EQ_CTRL1 0xae
128#define RT5670_ADC_EQ_CTRL2 0xaf
129#define RT5670_EQ_CTRL1 0xb0
130#define RT5670_EQ_CTRL2 0xb1
131#define RT5670_ALC_DRC_CTRL1 0xb2
132#define RT5670_ALC_DRC_CTRL2 0xb3
133#define RT5670_ALC_CTRL_1 0xb4
134#define RT5670_ALC_CTRL_2 0xb5
135#define RT5670_ALC_CTRL_3 0xb6
136#define RT5670_ALC_CTRL_4 0xb7
137#define RT5670_JD_CTRL 0xbb
138#define RT5670_IRQ_CTRL1 0xbd
139#define RT5670_IRQ_CTRL2 0xbe
140#define RT5670_INT_IRQ_ST 0xbf
141#define RT5670_GPIO_CTRL1 0xc0
142#define RT5670_GPIO_CTRL2 0xc1
143#define RT5670_GPIO_CTRL3 0xc2
144#define RT5670_SCRABBLE_FUN 0xcd
145#define RT5670_SCRABBLE_CTRL 0xce
146#define RT5670_BASE_BACK 0xcf
147#define RT5670_MP3_PLUS1 0xd0
148#define RT5670_MP3_PLUS2 0xd1
149#define RT5670_ADJ_HPF1 0xd3
150#define RT5670_ADJ_HPF2 0xd4
151#define RT5670_HP_CALIB_AMP_DET 0xd6
152#define RT5670_SV_ZCD1 0xd9
153#define RT5670_SV_ZCD2 0xda
154#define RT5670_IL_CMD 0xdb
155#define RT5670_IL_CMD2 0xdc
156#define RT5670_IL_CMD3 0xdd
157#define RT5670_DRC_HL_CTRL1 0xe6
158#define RT5670_DRC_HL_CTRL2 0xe7
159#define RT5670_ADC_MONO_HP_CTRL1 0xec
160#define RT5670_ADC_MONO_HP_CTRL2 0xed
161#define RT5670_ADC_STO2_HP_CTRL1 0xee
162#define RT5670_ADC_STO2_HP_CTRL2 0xef
163#define RT5670_JD_CTRL3 0xf8
164#define RT5670_JD_CTRL4 0xf9
165/* General Control */
166#define RT5670_DIG_MISC 0xfa
167#define RT5670_GEN_CTRL2 0xfb
168#define RT5670_GEN_CTRL3 0xfc
169
170
171/* Index of Codec Private Register definition */
172#define RT5670_DIG_VOL 0x00
173#define RT5670_PR_ALC_CTRL_1 0x01
174#define RT5670_PR_ALC_CTRL_2 0x02
175#define RT5670_PR_ALC_CTRL_3 0x03
176#define RT5670_PR_ALC_CTRL_4 0x04
177#define RT5670_PR_ALC_CTRL_5 0x05
178#define RT5670_PR_ALC_CTRL_6 0x06
179#define RT5670_BIAS_CUR1 0x12
180#define RT5670_BIAS_CUR3 0x14
181#define RT5670_CLSD_INT_REG1 0x1c
182#define RT5670_MAMP_INT_REG2 0x37
183#define RT5670_CHOP_DAC_ADC 0x3d
184#define RT5670_MIXER_INT_REG 0x3f
185#define RT5670_3D_SPK 0x63
186#define RT5670_WND_1 0x6c
187#define RT5670_WND_2 0x6d
188#define RT5670_WND_3 0x6e
189#define RT5670_WND_4 0x6f
190#define RT5670_WND_5 0x70
191#define RT5670_WND_8 0x73
192#define RT5670_DIP_SPK_INF 0x75
193#define RT5670_HP_DCC_INT1 0x77
194#define RT5670_EQ_BW_LOP 0xa0
195#define RT5670_EQ_GN_LOP 0xa1
196#define RT5670_EQ_FC_BP1 0xa2
197#define RT5670_EQ_BW_BP1 0xa3
198#define RT5670_EQ_GN_BP1 0xa4
199#define RT5670_EQ_FC_BP2 0xa5
200#define RT5670_EQ_BW_BP2 0xa6
201#define RT5670_EQ_GN_BP2 0xa7
202#define RT5670_EQ_FC_BP3 0xa8
203#define RT5670_EQ_BW_BP3 0xa9
204#define RT5670_EQ_GN_BP3 0xaa
205#define RT5670_EQ_FC_BP4 0xab
206#define RT5670_EQ_BW_BP4 0xac
207#define RT5670_EQ_GN_BP4 0xad
208#define RT5670_EQ_FC_HIP1 0xae
209#define RT5670_EQ_GN_HIP1 0xaf
210#define RT5670_EQ_FC_HIP2 0xb0
211#define RT5670_EQ_BW_HIP2 0xb1
212#define RT5670_EQ_GN_HIP2 0xb2
213#define RT5670_EQ_PRE_VOL 0xb3
214#define RT5670_EQ_PST_VOL 0xb4
215
216
217/* global definition */
218#define RT5670_L_MUTE (0x1 << 15)
219#define RT5670_L_MUTE_SFT 15
220#define RT5670_VOL_L_MUTE (0x1 << 14)
221#define RT5670_VOL_L_SFT 14
222#define RT5670_R_MUTE (0x1 << 7)
223#define RT5670_R_MUTE_SFT 7
224#define RT5670_VOL_R_MUTE (0x1 << 6)
225#define RT5670_VOL_R_SFT 6
226#define RT5670_L_VOL_MASK (0x3f << 8)
227#define RT5670_L_VOL_SFT 8
228#define RT5670_R_VOL_MASK (0x3f)
229#define RT5670_R_VOL_SFT 0
230
231/* Combo Jack Control 1 (0x0a) */
232#define RT5670_CBJ_BST1_MASK (0xf << 12)
233#define RT5670_CBJ_BST1_SFT (12)
234#define RT5670_CBJ_JD_HP_EN (0x1 << 9)
235#define RT5670_CBJ_JD_MIC_EN (0x1 << 8)
236#define RT5670_CBJ_BST1_EN (0x1 << 2)
237
238/* Combo Jack Control 1 (0x0b) */
239#define RT5670_CBJ_MN_JD (0x1 << 12)
240#define RT5670_CAPLESS_EN (0x1 << 11)
241#define RT5670_CBJ_DET_MODE (0x1 << 7)
242
243/* IN2 Control (0x0e) */
244#define RT5670_BST_MASK1 (0xf<<12)
245#define RT5670_BST_SFT1 12
246#define RT5670_BST_MASK2 (0xf<<8)
247#define RT5670_BST_SFT2 8
248#define RT5670_IN_DF1 (0x1 << 7)
249#define RT5670_IN_SFT1 7
250#define RT5670_IN_DF2 (0x1 << 6)
251#define RT5670_IN_SFT2 6
252
253/* INL and INR Volume Control (0x0f) */
254#define RT5670_INL_SEL_MASK (0x1 << 15)
255#define RT5670_INL_SEL_SFT 15
256#define RT5670_INL_SEL_IN4P (0x0 << 15)
257#define RT5670_INL_SEL_MONOP (0x1 << 15)
258#define RT5670_INL_VOL_MASK (0x1f << 8)
259#define RT5670_INL_VOL_SFT 8
260#define RT5670_INR_SEL_MASK (0x1 << 7)
261#define RT5670_INR_SEL_SFT 7
262#define RT5670_INR_SEL_IN4N (0x0 << 7)
263#define RT5670_INR_SEL_MONON (0x1 << 7)
264#define RT5670_INR_VOL_MASK (0x1f)
265#define RT5670_INR_VOL_SFT 0
266
267/* Sidetone Control (0x18) */
268#define RT5670_ST_SEL_MASK (0x7 << 9)
269#define RT5670_ST_SEL_SFT 9
270#define RT5670_M_ST_DACR2 (0x1 << 8)
271#define RT5670_M_ST_DACR2_SFT 8
272#define RT5670_M_ST_DACL2 (0x1 << 7)
273#define RT5670_M_ST_DACL2_SFT 7
274#define RT5670_ST_EN (0x1 << 6)
275#define RT5670_ST_EN_SFT 6
276
277/* DAC1 Digital Volume (0x19) */
278#define RT5670_DAC_L1_VOL_MASK (0xff << 8)
279#define RT5670_DAC_L1_VOL_SFT 8
280#define RT5670_DAC_R1_VOL_MASK (0xff)
281#define RT5670_DAC_R1_VOL_SFT 0
282
283/* DAC2 Digital Volume (0x1a) */
284#define RT5670_DAC_L2_VOL_MASK (0xff << 8)
285#define RT5670_DAC_L2_VOL_SFT 8
286#define RT5670_DAC_R2_VOL_MASK (0xff)
287#define RT5670_DAC_R2_VOL_SFT 0
288
289/* DAC2 Control (0x1b) */
290#define RT5670_M_DAC_L2_VOL (0x1 << 13)
291#define RT5670_M_DAC_L2_VOL_SFT 13
292#define RT5670_M_DAC_R2_VOL (0x1 << 12)
293#define RT5670_M_DAC_R2_VOL_SFT 12
294#define RT5670_DAC2_L_SEL_MASK (0x7 << 4)
295#define RT5670_DAC2_L_SEL_SFT 4
296#define RT5670_DAC2_R_SEL_MASK (0x7 << 0)
297#define RT5670_DAC2_R_SEL_SFT 0
298
299/* ADC Digital Volume Control (0x1c) */
300#define RT5670_ADC_L_VOL_MASK (0x7f << 8)
301#define RT5670_ADC_L_VOL_SFT 8
302#define RT5670_ADC_R_VOL_MASK (0x7f)
303#define RT5670_ADC_R_VOL_SFT 0
304
305/* Mono ADC Digital Volume Control (0x1d) */
306#define RT5670_MONO_ADC_L_VOL_MASK (0x7f << 8)
307#define RT5670_MONO_ADC_L_VOL_SFT 8
308#define RT5670_MONO_ADC_R_VOL_MASK (0x7f)
309#define RT5670_MONO_ADC_R_VOL_SFT 0
310
311/* ADC Boost Volume Control (0x1e) */
312#define RT5670_STO1_ADC_L_BST_MASK (0x3 << 14)
313#define RT5670_STO1_ADC_L_BST_SFT 14
314#define RT5670_STO1_ADC_R_BST_MASK (0x3 << 12)
315#define RT5670_STO1_ADC_R_BST_SFT 12
316#define RT5670_STO1_ADC_COMP_MASK (0x3 << 10)
317#define RT5670_STO1_ADC_COMP_SFT 10
318#define RT5670_STO2_ADC_L_BST_MASK (0x3 << 8)
319#define RT5670_STO2_ADC_L_BST_SFT 8
320#define RT5670_STO2_ADC_R_BST_MASK (0x3 << 6)
321#define RT5670_STO2_ADC_R_BST_SFT 6
322#define RT5670_STO2_ADC_COMP_MASK (0x3 << 4)
323#define RT5670_STO2_ADC_COMP_SFT 4
324
325/* Stereo2 ADC Mixer Control (0x26) */
326#define RT5670_STO2_ADC_SRC_MASK (0x1 << 15)
327#define RT5670_STO2_ADC_SRC_SFT 15
328
329/* Stereo ADC Mixer Control (0x26 0x27) */
330#define RT5670_M_ADC_L1 (0x1 << 14)
331#define RT5670_M_ADC_L1_SFT 14
332#define RT5670_M_ADC_L2 (0x1 << 13)
333#define RT5670_M_ADC_L2_SFT 13
334#define RT5670_ADC_1_SRC_MASK (0x1 << 12)
335#define RT5670_ADC_1_SRC_SFT 12
336#define RT5670_ADC_1_SRC_ADC (0x1 << 12)
337#define RT5670_ADC_1_SRC_DACMIX (0x0 << 12)
338#define RT5670_ADC_2_SRC_MASK (0x1 << 11)
339#define RT5670_ADC_2_SRC_SFT 11
340#define RT5670_ADC_SRC_MASK (0x1 << 10)
341#define RT5670_ADC_SRC_SFT 10
342#define RT5670_DMIC_SRC_MASK (0x3 << 8)
343#define RT5670_DMIC_SRC_SFT 8
344#define RT5670_M_ADC_R1 (0x1 << 6)
345#define RT5670_M_ADC_R1_SFT 6
346#define RT5670_M_ADC_R2 (0x1 << 5)
347#define RT5670_M_ADC_R2_SFT 5
348#define RT5670_DMIC3_SRC_MASK (0x1 << 1)
349#define RT5670_DMIC3_SRC_SFT 0
350
351/* Mono ADC Mixer Control (0x28) */
352#define RT5670_M_MONO_ADC_L1 (0x1 << 14)
353#define RT5670_M_MONO_ADC_L1_SFT 14
354#define RT5670_M_MONO_ADC_L2 (0x1 << 13)
355#define RT5670_M_MONO_ADC_L2_SFT 13
356#define RT5670_MONO_ADC_L1_SRC_MASK (0x1 << 12)
357#define RT5670_MONO_ADC_L1_SRC_SFT 12
358#define RT5670_MONO_ADC_L1_SRC_DACMIXL (0x0 << 12)
359#define RT5670_MONO_ADC_L1_SRC_ADCL (0x1 << 12)
360#define RT5670_MONO_ADC_L2_SRC_MASK (0x1 << 11)
361#define RT5670_MONO_ADC_L2_SRC_SFT 11
362#define RT5670_MONO_ADC_L_SRC_MASK (0x1 << 10)
363#define RT5670_MONO_ADC_L_SRC_SFT 10
364#define RT5670_MONO_DMIC_L_SRC_MASK (0x3 << 8)
365#define RT5670_MONO_DMIC_L_SRC_SFT 8
366#define RT5670_M_MONO_ADC_R1 (0x1 << 6)
367#define RT5670_M_MONO_ADC_R1_SFT 6
368#define RT5670_M_MONO_ADC_R2 (0x1 << 5)
369#define RT5670_M_MONO_ADC_R2_SFT 5
370#define RT5670_MONO_ADC_R1_SRC_MASK (0x1 << 4)
371#define RT5670_MONO_ADC_R1_SRC_SFT 4
372#define RT5670_MONO_ADC_R1_SRC_ADCR (0x1 << 4)
373#define RT5670_MONO_ADC_R1_SRC_DACMIXR (0x0 << 4)
374#define RT5670_MONO_ADC_R2_SRC_MASK (0x1 << 3)
375#define RT5670_MONO_ADC_R2_SRC_SFT 3
376#define RT5670_MONO_DMIC_R_SRC_MASK (0x3)
377#define RT5670_MONO_DMIC_R_SRC_SFT 0
378
379/* ADC Mixer to DAC Mixer Control (0x29) */
380#define RT5670_M_ADCMIX_L (0x1 << 15)
381#define RT5670_M_ADCMIX_L_SFT 15
382#define RT5670_M_DAC1_L (0x1 << 14)
383#define RT5670_M_DAC1_L_SFT 14
384#define RT5670_DAC1_R_SEL_MASK (0x3 << 10)
385#define RT5670_DAC1_R_SEL_SFT 10
386#define RT5670_DAC1_R_SEL_IF1 (0x0 << 10)
387#define RT5670_DAC1_R_SEL_IF2 (0x1 << 10)
388#define RT5670_DAC1_R_SEL_IF3 (0x2 << 10)
389#define RT5670_DAC1_R_SEL_IF4 (0x3 << 10)
390#define RT5670_DAC1_L_SEL_MASK (0x3 << 8)
391#define RT5670_DAC1_L_SEL_SFT 8
392#define RT5670_DAC1_L_SEL_IF1 (0x0 << 8)
393#define RT5670_DAC1_L_SEL_IF2 (0x1 << 8)
394#define RT5670_DAC1_L_SEL_IF3 (0x2 << 8)
395#define RT5670_DAC1_L_SEL_IF4 (0x3 << 8)
396#define RT5670_M_ADCMIX_R (0x1 << 7)
397#define RT5670_M_ADCMIX_R_SFT 7
398#define RT5670_M_DAC1_R (0x1 << 6)
399#define RT5670_M_DAC1_R_SFT 6
400
401/* Stereo DAC Mixer Control (0x2a) */
402#define RT5670_M_DAC_L1 (0x1 << 14)
403#define RT5670_M_DAC_L1_SFT 14
404#define RT5670_DAC_L1_STO_L_VOL_MASK (0x1 << 13)
405#define RT5670_DAC_L1_STO_L_VOL_SFT 13
406#define RT5670_M_DAC_L2 (0x1 << 12)
407#define RT5670_M_DAC_L2_SFT 12
408#define RT5670_DAC_L2_STO_L_VOL_MASK (0x1 << 11)
409#define RT5670_DAC_L2_STO_L_VOL_SFT 11
410#define RT5670_M_DAC_R1_STO_L (0x1 << 9)
411#define RT5670_M_DAC_R1_STO_L_SFT 9
412#define RT5670_DAC_R1_STO_L_VOL_MASK (0x1 << 8)
413#define RT5670_DAC_R1_STO_L_VOL_SFT 8
414#define RT5670_M_DAC_R1 (0x1 << 6)
415#define RT5670_M_DAC_R1_SFT 6
416#define RT5670_DAC_R1_STO_R_VOL_MASK (0x1 << 5)
417#define RT5670_DAC_R1_STO_R_VOL_SFT 5
418#define RT5670_M_DAC_R2 (0x1 << 4)
419#define RT5670_M_DAC_R2_SFT 4
420#define RT5670_DAC_R2_STO_R_VOL_MASK (0x1 << 3)
421#define RT5670_DAC_R2_STO_R_VOL_SFT 3
422#define RT5670_M_DAC_L1_STO_R (0x1 << 1)
423#define RT5670_M_DAC_L1_STO_R_SFT 1
424#define RT5670_DAC_L1_STO_R_VOL_MASK (0x1)
425#define RT5670_DAC_L1_STO_R_VOL_SFT 0
426
427/* Mono DAC Mixer Control (0x2b) */
428#define RT5670_M_DAC_L1_MONO_L (0x1 << 14)
429#define RT5670_M_DAC_L1_MONO_L_SFT 14
430#define RT5670_DAC_L1_MONO_L_VOL_MASK (0x1 << 13)
431#define RT5670_DAC_L1_MONO_L_VOL_SFT 13
432#define RT5670_M_DAC_L2_MONO_L (0x1 << 12)
433#define RT5670_M_DAC_L2_MONO_L_SFT 12
434#define RT5670_DAC_L2_MONO_L_VOL_MASK (0x1 << 11)
435#define RT5670_DAC_L2_MONO_L_VOL_SFT 11
436#define RT5670_M_DAC_R2_MONO_L (0x1 << 10)
437#define RT5670_M_DAC_R2_MONO_L_SFT 10
438#define RT5670_DAC_R2_MONO_L_VOL_MASK (0x1 << 9)
439#define RT5670_DAC_R2_MONO_L_VOL_SFT 9
440#define RT5670_M_DAC_R1_MONO_R (0x1 << 6)
441#define RT5670_M_DAC_R1_MONO_R_SFT 6
442#define RT5670_DAC_R1_MONO_R_VOL_MASK (0x1 << 5)
443#define RT5670_DAC_R1_MONO_R_VOL_SFT 5
444#define RT5670_M_DAC_R2_MONO_R (0x1 << 4)
445#define RT5670_M_DAC_R2_MONO_R_SFT 4
446#define RT5670_DAC_R2_MONO_R_VOL_MASK (0x1 << 3)
447#define RT5670_DAC_R2_MONO_R_VOL_SFT 3
448#define RT5670_M_DAC_L2_MONO_R (0x1 << 2)
449#define RT5670_M_DAC_L2_MONO_R_SFT 2
450#define RT5670_DAC_L2_MONO_R_VOL_MASK (0x1 << 1)
451#define RT5670_DAC_L2_MONO_R_VOL_SFT 1
452
453/* Digital Mixer Control (0x2c) */
454#define RT5670_M_STO_L_DAC_L (0x1 << 15)
455#define RT5670_M_STO_L_DAC_L_SFT 15
456#define RT5670_STO_L_DAC_L_VOL_MASK (0x1 << 14)
457#define RT5670_STO_L_DAC_L_VOL_SFT 14
458#define RT5670_M_DAC_L2_DAC_L (0x1 << 13)
459#define RT5670_M_DAC_L2_DAC_L_SFT 13
460#define RT5670_DAC_L2_DAC_L_VOL_MASK (0x1 << 12)
461#define RT5670_DAC_L2_DAC_L_VOL_SFT 12
462#define RT5670_M_STO_R_DAC_R (0x1 << 11)
463#define RT5670_M_STO_R_DAC_R_SFT 11
464#define RT5670_STO_R_DAC_R_VOL_MASK (0x1 << 10)
465#define RT5670_STO_R_DAC_R_VOL_SFT 10
466#define RT5670_M_DAC_R2_DAC_R (0x1 << 9)
467#define RT5670_M_DAC_R2_DAC_R_SFT 9
468#define RT5670_DAC_R2_DAC_R_VOL_MASK (0x1 << 8)
469#define RT5670_DAC_R2_DAC_R_VOL_SFT 8
470#define RT5670_M_DAC_R2_DAC_L (0x1 << 7)
471#define RT5670_M_DAC_R2_DAC_L_SFT 7
472#define RT5670_DAC_R2_DAC_L_VOL_MASK (0x1 << 6)
473#define RT5670_DAC_R2_DAC_L_VOL_SFT 6
474#define RT5670_M_DAC_L2_DAC_R (0x1 << 5)
475#define RT5670_M_DAC_L2_DAC_R_SFT 5
476#define RT5670_DAC_L2_DAC_R_VOL_MASK (0x1 << 4)
477#define RT5670_DAC_L2_DAC_R_VOL_SFT 4
478
479/* DSP Path Control 1 (0x2d) */
480#define RT5670_RXDP_SEL_MASK (0x7 << 13)
481#define RT5670_RXDP_SEL_SFT 13
482#define RT5670_RXDP_SRC_MASK (0x3 << 11)
483#define RT5670_RXDP_SRC_SFT 11
484#define RT5670_RXDP_SRC_NOR (0x0 << 11)
485#define RT5670_RXDP_SRC_DIV2 (0x1 << 11)
486#define RT5670_RXDP_SRC_DIV3 (0x2 << 11)
487#define RT5670_TXDP_SRC_MASK (0x3 << 4)
488#define RT5670_TXDP_SRC_SFT 4
489#define RT5670_TXDP_SRC_NOR (0x0 << 4)
490#define RT5670_TXDP_SRC_DIV2 (0x1 << 4)
491#define RT5670_TXDP_SRC_DIV3 (0x2 << 4)
492#define RT5670_TXDP_SLOT_SEL_MASK (0x3 << 2)
493#define RT5670_TXDP_SLOT_SEL_SFT 2
494#define RT5670_DSP_UL_SEL (0x1 << 1)
495#define RT5670_DSP_UL_SFT 1
496#define RT5670_DSP_DL_SEL 0x1
497#define RT5670_DSP_DL_SFT 0
498
499/* DSP Path Control 2 (0x2e) */
500#define RT5670_TXDP_L_VOL_MASK (0x7f << 8)
501#define RT5670_TXDP_L_VOL_SFT 8
502#define RT5670_TXDP_R_VOL_MASK (0x7f)
503#define RT5670_TXDP_R_VOL_SFT 0
504
505/* Digital Interface Data Control (0x2f) */
506#define RT5670_IF1_ADC2_IN_SEL (0x1 << 15)
507#define RT5670_IF1_ADC2_IN_SFT 15
508#define RT5670_IF2_ADC_IN_MASK (0x7 << 12)
509#define RT5670_IF2_ADC_IN_SFT 12
510#define RT5670_IF2_DAC_SEL_MASK (0x3 << 10)
511#define RT5670_IF2_DAC_SEL_SFT 10
512#define RT5670_IF2_ADC_SEL_MASK (0x3 << 8)
513#define RT5670_IF2_ADC_SEL_SFT 8
514
515/* Digital Interface Data Control (0x30) */
516#define RT5670_IF4_ADC_IN_MASK (0x3 << 4)
517#define RT5670_IF4_ADC_IN_SFT 4
518
519/* PDM Output Control (0x31) */
520#define RT5670_PDM1_L_MASK (0x1 << 15)
521#define RT5670_PDM1_L_SFT 15
522#define RT5670_M_PDM1_L (0x1 << 14)
523#define RT5670_M_PDM1_L_SFT 14
524#define RT5670_PDM1_R_MASK (0x1 << 13)
525#define RT5670_PDM1_R_SFT 13
526#define RT5670_M_PDM1_R (0x1 << 12)
527#define RT5670_M_PDM1_R_SFT 12
528#define RT5670_PDM2_L_MASK (0x1 << 11)
529#define RT5670_PDM2_L_SFT 11
530#define RT5670_M_PDM2_L (0x1 << 10)
531#define RT5670_M_PDM2_L_SFT 10
532#define RT5670_PDM2_R_MASK (0x1 << 9)
533#define RT5670_PDM2_R_SFT 9
534#define RT5670_M_PDM2_R (0x1 << 8)
535#define RT5670_M_PDM2_R_SFT 8
536#define RT5670_PDM2_BUSY (0x1 << 7)
537#define RT5670_PDM1_BUSY (0x1 << 6)
538#define RT5670_PDM_PATTERN (0x1 << 5)
539#define RT5670_PDM_GAIN (0x1 << 4)
540#define RT5670_PDM_DIV_MASK (0x3)
541
542/* REC Left Mixer Control 1 (0x3b) */
543#define RT5670_G_HP_L_RM_L_MASK (0x7 << 13)
544#define RT5670_G_HP_L_RM_L_SFT 13
545#define RT5670_G_IN_L_RM_L_MASK (0x7 << 10)
546#define RT5670_G_IN_L_RM_L_SFT 10
547#define RT5670_G_BST4_RM_L_MASK (0x7 << 7)
548#define RT5670_G_BST4_RM_L_SFT 7
549#define RT5670_G_BST3_RM_L_MASK (0x7 << 4)
550#define RT5670_G_BST3_RM_L_SFT 4
551#define RT5670_G_BST2_RM_L_MASK (0x7 << 1)
552#define RT5670_G_BST2_RM_L_SFT 1
553
554/* REC Left Mixer Control 2 (0x3c) */
555#define RT5670_G_BST1_RM_L_MASK (0x7 << 13)
556#define RT5670_G_BST1_RM_L_SFT 13
557#define RT5670_M_IN_L_RM_L (0x1 << 5)
558#define RT5670_M_IN_L_RM_L_SFT 5
559#define RT5670_M_BST2_RM_L (0x1 << 3)
560#define RT5670_M_BST2_RM_L_SFT 3
561#define RT5670_M_BST1_RM_L (0x1 << 1)
562#define RT5670_M_BST1_RM_L_SFT 1
563
564/* REC Right Mixer Control 1 (0x3d) */
565#define RT5670_G_HP_R_RM_R_MASK (0x7 << 13)
566#define RT5670_G_HP_R_RM_R_SFT 13
567#define RT5670_G_IN_R_RM_R_MASK (0x7 << 10)
568#define RT5670_G_IN_R_RM_R_SFT 10
569#define RT5670_G_BST4_RM_R_MASK (0x7 << 7)
570#define RT5670_G_BST4_RM_R_SFT 7
571#define RT5670_G_BST3_RM_R_MASK (0x7 << 4)
572#define RT5670_G_BST3_RM_R_SFT 4
573#define RT5670_G_BST2_RM_R_MASK (0x7 << 1)
574#define RT5670_G_BST2_RM_R_SFT 1
575
576/* REC Right Mixer Control 2 (0x3e) */
577#define RT5670_G_BST1_RM_R_MASK (0x7 << 13)
578#define RT5670_G_BST1_RM_R_SFT 13
579#define RT5670_M_IN_R_RM_R (0x1 << 5)
580#define RT5670_M_IN_R_RM_R_SFT 5
581#define RT5670_M_BST2_RM_R (0x1 << 3)
582#define RT5670_M_BST2_RM_R_SFT 3
583#define RT5670_M_BST1_RM_R (0x1 << 1)
584#define RT5670_M_BST1_RM_R_SFT 1
585
586/* HPMIX Control (0x45) */
587#define RT5670_M_DAC2_HM (0x1 << 15)
588#define RT5670_M_DAC2_HM_SFT 15
589#define RT5670_M_HPVOL_HM (0x1 << 14)
590#define RT5670_M_HPVOL_HM_SFT 14
591#define RT5670_M_DAC1_HM (0x1 << 13)
592#define RT5670_M_DAC1_HM_SFT 13
593#define RT5670_G_HPOMIX_MASK (0x1 << 12)
594#define RT5670_G_HPOMIX_SFT 12
595#define RT5670_M_INR1_HMR (0x1 << 3)
596#define RT5670_M_INR1_HMR_SFT 3
597#define RT5670_M_DACR1_HMR (0x1 << 2)
598#define RT5670_M_DACR1_HMR_SFT 2
599#define RT5670_M_INL1_HML (0x1 << 1)
600#define RT5670_M_INL1_HML_SFT 1
601#define RT5670_M_DACL1_HML (0x1)
602#define RT5670_M_DACL1_HML_SFT 0
603
604/* Mono Output Mixer Control (0x4c) */
605#define RT5670_M_DAC_R2_MA (0x1 << 15)
606#define RT5670_M_DAC_R2_MA_SFT 15
607#define RT5670_M_DAC_L2_MA (0x1 << 14)
608#define RT5670_M_DAC_L2_MA_SFT 14
609#define RT5670_M_OV_R_MM (0x1 << 13)
610#define RT5670_M_OV_R_MM_SFT 13
611#define RT5670_M_OV_L_MM (0x1 << 12)
612#define RT5670_M_OV_L_MM_SFT 12
613#define RT5670_G_MONOMIX_MASK (0x1 << 10)
614#define RT5670_G_MONOMIX_SFT 10
615#define RT5670_M_DAC_R2_MM (0x1 << 9)
616#define RT5670_M_DAC_R2_MM_SFT 9
617#define RT5670_M_DAC_L2_MM (0x1 << 8)
618#define RT5670_M_DAC_L2_MM_SFT 8
619#define RT5670_M_BST4_MM (0x1 << 7)
620#define RT5670_M_BST4_MM_SFT 7
621
622/* Output Left Mixer Control 1 (0x4d) */
623#define RT5670_G_BST3_OM_L_MASK (0x7 << 13)
624#define RT5670_G_BST3_OM_L_SFT 13
625#define RT5670_G_BST2_OM_L_MASK (0x7 << 10)
626#define RT5670_G_BST2_OM_L_SFT 10
627#define RT5670_G_BST1_OM_L_MASK (0x7 << 7)
628#define RT5670_G_BST1_OM_L_SFT 7
629#define RT5670_G_IN_L_OM_L_MASK (0x7 << 4)
630#define RT5670_G_IN_L_OM_L_SFT 4
631#define RT5670_G_RM_L_OM_L_MASK (0x7 << 1)
632#define RT5670_G_RM_L_OM_L_SFT 1
633
634/* Output Left Mixer Control 2 (0x4e) */
635#define RT5670_G_DAC_R2_OM_L_MASK (0x7 << 13)
636#define RT5670_G_DAC_R2_OM_L_SFT 13
637#define RT5670_G_DAC_L2_OM_L_MASK (0x7 << 10)
638#define RT5670_G_DAC_L2_OM_L_SFT 10
639#define RT5670_G_DAC_L1_OM_L_MASK (0x7 << 7)
640#define RT5670_G_DAC_L1_OM_L_SFT 7
641
642/* Output Left Mixer Control 3 (0x4f) */
643#define RT5670_M_BST1_OM_L (0x1 << 5)
644#define RT5670_M_BST1_OM_L_SFT 5
645#define RT5670_M_IN_L_OM_L (0x1 << 4)
646#define RT5670_M_IN_L_OM_L_SFT 4
647#define RT5670_M_DAC_L2_OM_L (0x1 << 1)
648#define RT5670_M_DAC_L2_OM_L_SFT 1
649#define RT5670_M_DAC_L1_OM_L (0x1)
650#define RT5670_M_DAC_L1_OM_L_SFT 0
651
652/* Output Right Mixer Control 1 (0x50) */
653#define RT5670_G_BST4_OM_R_MASK (0x7 << 13)
654#define RT5670_G_BST4_OM_R_SFT 13
655#define RT5670_G_BST2_OM_R_MASK (0x7 << 10)
656#define RT5670_G_BST2_OM_R_SFT 10
657#define RT5670_G_BST1_OM_R_MASK (0x7 << 7)
658#define RT5670_G_BST1_OM_R_SFT 7
659#define RT5670_G_IN_R_OM_R_MASK (0x7 << 4)
660#define RT5670_G_IN_R_OM_R_SFT 4
661#define RT5670_G_RM_R_OM_R_MASK (0x7 << 1)
662#define RT5670_G_RM_R_OM_R_SFT 1
663
664/* Output Right Mixer Control 2 (0x51) */
665#define RT5670_G_DAC_L2_OM_R_MASK (0x7 << 13)
666#define RT5670_G_DAC_L2_OM_R_SFT 13
667#define RT5670_G_DAC_R2_OM_R_MASK (0x7 << 10)
668#define RT5670_G_DAC_R2_OM_R_SFT 10
669#define RT5670_G_DAC_R1_OM_R_MASK (0x7 << 7)
670#define RT5670_G_DAC_R1_OM_R_SFT 7
671
672/* Output Right Mixer Control 3 (0x52) */
673#define RT5670_M_BST2_OM_R (0x1 << 6)
674#define RT5670_M_BST2_OM_R_SFT 6
675#define RT5670_M_IN_R_OM_R (0x1 << 4)
676#define RT5670_M_IN_R_OM_R_SFT 4
677#define RT5670_M_DAC_R2_OM_R (0x1 << 1)
678#define RT5670_M_DAC_R2_OM_R_SFT 1
679#define RT5670_M_DAC_R1_OM_R (0x1)
680#define RT5670_M_DAC_R1_OM_R_SFT 0
681
682/* LOUT Mixer Control (0x53) */
683#define RT5670_M_DAC_L1_LM (0x1 << 15)
684#define RT5670_M_DAC_L1_LM_SFT 15
685#define RT5670_M_DAC_R1_LM (0x1 << 14)
686#define RT5670_M_DAC_R1_LM_SFT 14
687#define RT5670_M_OV_L_LM (0x1 << 13)
688#define RT5670_M_OV_L_LM_SFT 13
689#define RT5670_M_OV_R_LM (0x1 << 12)
690#define RT5670_M_OV_R_LM_SFT 12
691#define RT5670_G_LOUTMIX_MASK (0x1 << 11)
692#define RT5670_G_LOUTMIX_SFT 11
693
694/* Power Management for Digital 1 (0x61) */
695#define RT5670_PWR_I2S1 (0x1 << 15)
696#define RT5670_PWR_I2S1_BIT 15
697#define RT5670_PWR_I2S2 (0x1 << 14)
698#define RT5670_PWR_I2S2_BIT 14
699#define RT5670_PWR_DAC_L1 (0x1 << 12)
700#define RT5670_PWR_DAC_L1_BIT 12
701#define RT5670_PWR_DAC_R1 (0x1 << 11)
702#define RT5670_PWR_DAC_R1_BIT 11
703#define RT5670_PWR_DAC_L2 (0x1 << 7)
704#define RT5670_PWR_DAC_L2_BIT 7
705#define RT5670_PWR_DAC_R2 (0x1 << 6)
706#define RT5670_PWR_DAC_R2_BIT 6
707#define RT5670_PWR_ADC_L (0x1 << 2)
708#define RT5670_PWR_ADC_L_BIT 2
709#define RT5670_PWR_ADC_R (0x1 << 1)
710#define RT5670_PWR_ADC_R_BIT 1
711#define RT5670_PWR_CLS_D (0x1)
712#define RT5670_PWR_CLS_D_BIT 0
713
714/* Power Management for Digital 2 (0x62) */
715#define RT5670_PWR_ADC_S1F (0x1 << 15)
716#define RT5670_PWR_ADC_S1F_BIT 15
717#define RT5670_PWR_ADC_MF_L (0x1 << 14)
718#define RT5670_PWR_ADC_MF_L_BIT 14
719#define RT5670_PWR_ADC_MF_R (0x1 << 13)
720#define RT5670_PWR_ADC_MF_R_BIT 13
721#define RT5670_PWR_I2S_DSP (0x1 << 12)
722#define RT5670_PWR_I2S_DSP_BIT 12
723#define RT5670_PWR_DAC_S1F (0x1 << 11)
724#define RT5670_PWR_DAC_S1F_BIT 11
725#define RT5670_PWR_DAC_MF_L (0x1 << 10)
726#define RT5670_PWR_DAC_MF_L_BIT 10
727#define RT5670_PWR_DAC_MF_R (0x1 << 9)
728#define RT5670_PWR_DAC_MF_R_BIT 9
729#define RT5670_PWR_ADC_S2F (0x1 << 8)
730#define RT5670_PWR_ADC_S2F_BIT 8
731#define RT5670_PWR_PDM1 (0x1 << 7)
732#define RT5670_PWR_PDM1_BIT 7
733#define RT5670_PWR_PDM2 (0x1 << 6)
734#define RT5670_PWR_PDM2_BIT 6
735
736/* Power Management for Analog 1 (0x63) */
737#define RT5670_PWR_VREF1 (0x1 << 15)
738#define RT5670_PWR_VREF1_BIT 15
739#define RT5670_PWR_FV1 (0x1 << 14)
740#define RT5670_PWR_FV1_BIT 14
741#define RT5670_PWR_MB (0x1 << 13)
742#define RT5670_PWR_MB_BIT 13
743#define RT5670_PWR_LM (0x1 << 12)
744#define RT5670_PWR_LM_BIT 12
745#define RT5670_PWR_BG (0x1 << 11)
746#define RT5670_PWR_BG_BIT 11
747#define RT5670_PWR_HP_L (0x1 << 7)
748#define RT5670_PWR_HP_L_BIT 7
749#define RT5670_PWR_HP_R (0x1 << 6)
750#define RT5670_PWR_HP_R_BIT 6
751#define RT5670_PWR_HA (0x1 << 5)
752#define RT5670_PWR_HA_BIT 5
753#define RT5670_PWR_VREF2 (0x1 << 4)
754#define RT5670_PWR_VREF2_BIT 4
755#define RT5670_PWR_FV2 (0x1 << 3)
756#define RT5670_PWR_FV2_BIT 3
757#define RT5670_LDO_SEL_MASK (0x3)
758#define RT5670_LDO_SEL_SFT 0
759
760/* Power Management for Analog 2 (0x64) */
761#define RT5670_PWR_BST1 (0x1 << 15)
762#define RT5670_PWR_BST1_BIT 15
763#define RT5670_PWR_BST2 (0x1 << 13)
764#define RT5670_PWR_BST2_BIT 13
765#define RT5670_PWR_MB1 (0x1 << 11)
766#define RT5670_PWR_MB1_BIT 11
767#define RT5670_PWR_MB2 (0x1 << 10)
768#define RT5670_PWR_MB2_BIT 10
769#define RT5670_PWR_PLL (0x1 << 9)
770#define RT5670_PWR_PLL_BIT 9
771#define RT5670_PWR_BST1_P (0x1 << 6)
772#define RT5670_PWR_BST1_P_BIT 6
773#define RT5670_PWR_BST2_P (0x1 << 4)
774#define RT5670_PWR_BST2_P_BIT 4
775#define RT5670_PWR_JD1 (0x1 << 2)
776#define RT5670_PWR_JD1_BIT 2
777#define RT5670_PWR_JD (0x1 << 1)
778#define RT5670_PWR_JD_BIT 1
779
780/* Power Management for Mixer (0x65) */
781#define RT5670_PWR_OM_L (0x1 << 15)
782#define RT5670_PWR_OM_L_BIT 15
783#define RT5670_PWR_OM_R (0x1 << 14)
784#define RT5670_PWR_OM_R_BIT 14
785#define RT5670_PWR_RM_L (0x1 << 11)
786#define RT5670_PWR_RM_L_BIT 11
787#define RT5670_PWR_RM_R (0x1 << 10)
788#define RT5670_PWR_RM_R_BIT 10
789
790/* Power Management for Volume (0x66) */
791#define RT5670_PWR_HV_L (0x1 << 11)
792#define RT5670_PWR_HV_L_BIT 11
793#define RT5670_PWR_HV_R (0x1 << 10)
794#define RT5670_PWR_HV_R_BIT 10
795#define RT5670_PWR_IN_L (0x1 << 9)
796#define RT5670_PWR_IN_L_BIT 9
797#define RT5670_PWR_IN_R (0x1 << 8)
798#define RT5670_PWR_IN_R_BIT 8
799#define RT5670_PWR_MIC_DET (0x1 << 5)
800#define RT5670_PWR_MIC_DET_BIT 5
801
802/* I2S1/2/3 Audio Serial Data Port Control (0x70 0x71 0x72) */
803#define RT5670_I2S_MS_MASK (0x1 << 15)
804#define RT5670_I2S_MS_SFT 15
805#define RT5670_I2S_MS_M (0x0 << 15)
806#define RT5670_I2S_MS_S (0x1 << 15)
807#define RT5670_I2S_IF_MASK (0x7 << 12)
808#define RT5670_I2S_IF_SFT 12
809#define RT5670_I2S_O_CP_MASK (0x3 << 10)
810#define RT5670_I2S_O_CP_SFT 10
811#define RT5670_I2S_O_CP_OFF (0x0 << 10)
812#define RT5670_I2S_O_CP_U_LAW (0x1 << 10)
813#define RT5670_I2S_O_CP_A_LAW (0x2 << 10)
814#define RT5670_I2S_I_CP_MASK (0x3 << 8)
815#define RT5670_I2S_I_CP_SFT 8
816#define RT5670_I2S_I_CP_OFF (0x0 << 8)
817#define RT5670_I2S_I_CP_U_LAW (0x1 << 8)
818#define RT5670_I2S_I_CP_A_LAW (0x2 << 8)
819#define RT5670_I2S_BP_MASK (0x1 << 7)
820#define RT5670_I2S_BP_SFT 7
821#define RT5670_I2S_BP_NOR (0x0 << 7)
822#define RT5670_I2S_BP_INV (0x1 << 7)
823#define RT5670_I2S_DL_MASK (0x3 << 2)
824#define RT5670_I2S_DL_SFT 2
825#define RT5670_I2S_DL_16 (0x0 << 2)
826#define RT5670_I2S_DL_20 (0x1 << 2)
827#define RT5670_I2S_DL_24 (0x2 << 2)
828#define RT5670_I2S_DL_8 (0x3 << 2)
829#define RT5670_I2S_DF_MASK (0x3)
830#define RT5670_I2S_DF_SFT 0
831#define RT5670_I2S_DF_I2S (0x0)
832#define RT5670_I2S_DF_LEFT (0x1)
833#define RT5670_I2S_DF_PCM_A (0x2)
834#define RT5670_I2S_DF_PCM_B (0x3)
835
836/* I2S2 Audio Serial Data Port Control (0x71) */
837#define RT5670_I2S2_SDI_MASK (0x1 << 6)
838#define RT5670_I2S2_SDI_SFT 6
839#define RT5670_I2S2_SDI_I2S1 (0x0 << 6)
840#define RT5670_I2S2_SDI_I2S2 (0x1 << 6)
841
842/* ADC/DAC Clock Control 1 (0x73) */
843#define RT5670_I2S_BCLK_MS1_MASK (0x1 << 15)
844#define RT5670_I2S_BCLK_MS1_SFT 15
845#define RT5670_I2S_BCLK_MS1_32 (0x0 << 15)
846#define RT5670_I2S_BCLK_MS1_64 (0x1 << 15)
847#define RT5670_I2S_PD1_MASK (0x7 << 12)
848#define RT5670_I2S_PD1_SFT 12
849#define RT5670_I2S_PD1_1 (0x0 << 12)
850#define RT5670_I2S_PD1_2 (0x1 << 12)
851#define RT5670_I2S_PD1_3 (0x2 << 12)
852#define RT5670_I2S_PD1_4 (0x3 << 12)
853#define RT5670_I2S_PD1_6 (0x4 << 12)
854#define RT5670_I2S_PD1_8 (0x5 << 12)
855#define RT5670_I2S_PD1_12 (0x6 << 12)
856#define RT5670_I2S_PD1_16 (0x7 << 12)
857#define RT5670_I2S_BCLK_MS2_MASK (0x1 << 11)
858#define RT5670_I2S_BCLK_MS2_SFT 11
859#define RT5670_I2S_BCLK_MS2_32 (0x0 << 11)
860#define RT5670_I2S_BCLK_MS2_64 (0x1 << 11)
861#define RT5670_I2S_PD2_MASK (0x7 << 8)
862#define RT5670_I2S_PD2_SFT 8
863#define RT5670_I2S_PD2_1 (0x0 << 8)
864#define RT5670_I2S_PD2_2 (0x1 << 8)
865#define RT5670_I2S_PD2_3 (0x2 << 8)
866#define RT5670_I2S_PD2_4 (0x3 << 8)
867#define RT5670_I2S_PD2_6 (0x4 << 8)
868#define RT5670_I2S_PD2_8 (0x5 << 8)
869#define RT5670_I2S_PD2_12 (0x6 << 8)
870#define RT5670_I2S_PD2_16 (0x7 << 8)
871#define RT5670_I2S_BCLK_MS3_MASK (0x1 << 7)
872#define RT5670_I2S_BCLK_MS3_SFT 7
873#define RT5670_I2S_BCLK_MS3_32 (0x0 << 7)
874#define RT5670_I2S_BCLK_MS3_64 (0x1 << 7)
875#define RT5670_I2S_PD3_MASK (0x7 << 4)
876#define RT5670_I2S_PD3_SFT 4
877#define RT5670_I2S_PD3_1 (0x0 << 4)
878#define RT5670_I2S_PD3_2 (0x1 << 4)
879#define RT5670_I2S_PD3_3 (0x2 << 4)
880#define RT5670_I2S_PD3_4 (0x3 << 4)
881#define RT5670_I2S_PD3_6 (0x4 << 4)
882#define RT5670_I2S_PD3_8 (0x5 << 4)
883#define RT5670_I2S_PD3_12 (0x6 << 4)
884#define RT5670_I2S_PD3_16 (0x7 << 4)
885#define RT5670_DAC_OSR_MASK (0x3 << 2)
886#define RT5670_DAC_OSR_SFT 2
887#define RT5670_DAC_OSR_128 (0x0 << 2)
888#define RT5670_DAC_OSR_64 (0x1 << 2)
889#define RT5670_DAC_OSR_32 (0x2 << 2)
890#define RT5670_DAC_OSR_16 (0x3 << 2)
891#define RT5670_ADC_OSR_MASK (0x3)
892#define RT5670_ADC_OSR_SFT 0
893#define RT5670_ADC_OSR_128 (0x0)
894#define RT5670_ADC_OSR_64 (0x1)
895#define RT5670_ADC_OSR_32 (0x2)
896#define RT5670_ADC_OSR_16 (0x3)
897
898/* ADC/DAC Clock Control 2 (0x74) */
899#define RT5670_DAC_L_OSR_MASK (0x3 << 14)
900#define RT5670_DAC_L_OSR_SFT 14
901#define RT5670_DAC_L_OSR_128 (0x0 << 14)
902#define RT5670_DAC_L_OSR_64 (0x1 << 14)
903#define RT5670_DAC_L_OSR_32 (0x2 << 14)
904#define RT5670_DAC_L_OSR_16 (0x3 << 14)
905#define RT5670_ADC_R_OSR_MASK (0x3 << 12)
906#define RT5670_ADC_R_OSR_SFT 12
907#define RT5670_ADC_R_OSR_128 (0x0 << 12)
908#define RT5670_ADC_R_OSR_64 (0x1 << 12)
909#define RT5670_ADC_R_OSR_32 (0x2 << 12)
910#define RT5670_ADC_R_OSR_16 (0x3 << 12)
911#define RT5670_DAHPF_EN (0x1 << 11)
912#define RT5670_DAHPF_EN_SFT 11
913#define RT5670_ADHPF_EN (0x1 << 10)
914#define RT5670_ADHPF_EN_SFT 10
915
916/* Digital Microphone Control (0x75) */
917#define RT5670_DMIC_1_EN_MASK (0x1 << 15)
918#define RT5670_DMIC_1_EN_SFT 15
919#define RT5670_DMIC_1_DIS (0x0 << 15)
920#define RT5670_DMIC_1_EN (0x1 << 15)
921#define RT5670_DMIC_2_EN_MASK (0x1 << 14)
922#define RT5670_DMIC_2_EN_SFT 14
923#define RT5670_DMIC_2_DIS (0x0 << 14)
924#define RT5670_DMIC_2_EN (0x1 << 14)
925#define RT5670_DMIC_1L_LH_MASK (0x1 << 13)
926#define RT5670_DMIC_1L_LH_SFT 13
927#define RT5670_DMIC_1L_LH_FALLING (0x0 << 13)
928#define RT5670_DMIC_1L_LH_RISING (0x1 << 13)
929#define RT5670_DMIC_1R_LH_MASK (0x1 << 12)
930#define RT5670_DMIC_1R_LH_SFT 12
931#define RT5670_DMIC_1R_LH_FALLING (0x0 << 12)
932#define RT5670_DMIC_1R_LH_RISING (0x1 << 12)
933#define RT5670_DMIC_2_DP_MASK (0x1 << 10)
934#define RT5670_DMIC_2_DP_SFT 10
935#define RT5670_DMIC_2_DP_GPIO8 (0x0 << 10)
936#define RT5670_DMIC_2_DP_IN3N (0x1 << 10)
937#define RT5670_DMIC_2L_LH_MASK (0x1 << 9)
938#define RT5670_DMIC_2L_LH_SFT 9
939#define RT5670_DMIC_2L_LH_FALLING (0x0 << 9)
940#define RT5670_DMIC_2L_LH_RISING (0x1 << 9)
941#define RT5670_DMIC_2R_LH_MASK (0x1 << 8)
942#define RT5670_DMIC_2R_LH_SFT 8
943#define RT5670_DMIC_2R_LH_FALLING (0x0 << 8)
944#define RT5670_DMIC_2R_LH_RISING (0x1 << 8)
945#define RT5670_DMIC_CLK_MASK (0x7 << 5)
946#define RT5670_DMIC_CLK_SFT 5
947#define RT5670_DMIC_3_EN_MASK (0x1 << 4)
948#define RT5670_DMIC_3_EN_SFT 4
949#define RT5670_DMIC_3_DIS (0x0 << 4)
950#define RT5670_DMIC_3_EN (0x1 << 4)
951#define RT5670_DMIC_1_DP_MASK (0x3 << 0)
952#define RT5670_DMIC_1_DP_SFT 0
953#define RT5670_DMIC_1_DP_GPIO6 (0x0 << 0)
954#define RT5670_DMIC_1_DP_IN2P (0x1 << 0)
955#define RT5670_DMIC_1_DP_GPIO7 (0x2 << 0)
956
957/* Digital Microphone Control2 (0x76) */
958#define RT5670_DMIC_3_DP_MASK (0x3 << 6)
959#define RT5670_DMIC_3_DP_SFT 6
960#define RT5670_DMIC_3_DP_GPIO9 (0x0 << 6)
961#define RT5670_DMIC_3_DP_GPIO10 (0x1 << 6)
962#define RT5670_DMIC_3_DP_GPIO5 (0x2 << 6)
963
964/* Global Clock Control (0x80) */
965#define RT5670_SCLK_SRC_MASK (0x3 << 14)
966#define RT5670_SCLK_SRC_SFT 14
967#define RT5670_SCLK_SRC_MCLK (0x0 << 14)
968#define RT5670_SCLK_SRC_PLL1 (0x1 << 14)
969#define RT5670_SCLK_SRC_RCCLK (0x2 << 14) /* 15MHz */
970#define RT5670_PLL1_SRC_MASK (0x3 << 12)
971#define RT5670_PLL1_SRC_SFT 12
972#define RT5670_PLL1_SRC_MCLK (0x0 << 12)
973#define RT5670_PLL1_SRC_BCLK1 (0x1 << 12)
974#define RT5670_PLL1_SRC_BCLK2 (0x2 << 12)
975#define RT5670_PLL1_SRC_BCLK3 (0x3 << 12)
976#define RT5670_PLL1_PD_MASK (0x1 << 3)
977#define RT5670_PLL1_PD_SFT 3
978#define RT5670_PLL1_PD_1 (0x0 << 3)
979#define RT5670_PLL1_PD_2 (0x1 << 3)
980
981#define RT5670_PLL_INP_MAX 40000000
982#define RT5670_PLL_INP_MIN 256000
983/* PLL M/N/K Code Control 1 (0x81) */
984#define RT5670_PLL_N_MAX 0x1ff
985#define RT5670_PLL_N_MASK (RT5670_PLL_N_MAX << 7)
986#define RT5670_PLL_N_SFT 7
987#define RT5670_PLL_K_MAX 0x1f
988#define RT5670_PLL_K_MASK (RT5670_PLL_K_MAX)
989#define RT5670_PLL_K_SFT 0
990
991/* PLL M/N/K Code Control 2 (0x82) */
992#define RT5670_PLL_M_MAX 0xf
993#define RT5670_PLL_M_MASK (RT5670_PLL_M_MAX << 12)
994#define RT5670_PLL_M_SFT 12
995#define RT5670_PLL_M_BP (0x1 << 11)
996#define RT5670_PLL_M_BP_SFT 11
997
998/* ASRC Control 1 (0x83) */
999#define RT5670_STO_T_MASK (0x1 << 15)
1000#define RT5670_STO_T_SFT 15
1001#define RT5670_STO_T_SCLK (0x0 << 15)
1002#define RT5670_STO_T_LRCK1 (0x1 << 15)
1003#define RT5670_M1_T_MASK (0x1 << 14)
1004#define RT5670_M1_T_SFT 14
1005#define RT5670_M1_T_I2S2 (0x0 << 14)
1006#define RT5670_M1_T_I2S2_D3 (0x1 << 14)
1007#define RT5670_I2S2_F_MASK (0x1 << 12)
1008#define RT5670_I2S2_F_SFT 12
1009#define RT5670_I2S2_F_I2S2_D2 (0x0 << 12)
1010#define RT5670_I2S2_F_I2S1_TCLK (0x1 << 12)
1011#define RT5670_DMIC_1_M_MASK (0x1 << 9)
1012#define RT5670_DMIC_1_M_SFT 9
1013#define RT5670_DMIC_1_M_NOR (0x0 << 9)
1014#define RT5670_DMIC_1_M_ASYN (0x1 << 9)
1015#define RT5670_DMIC_2_M_MASK (0x1 << 8)
1016#define RT5670_DMIC_2_M_SFT 8
1017#define RT5670_DMIC_2_M_NOR (0x0 << 8)
1018#define RT5670_DMIC_2_M_ASYN (0x1 << 8)
1019
1020/* ASRC Control 2 (0x84) */
1021#define RT5670_MDA_L_M_MASK (0x1 << 15)
1022#define RT5670_MDA_L_M_SFT 15
1023#define RT5670_MDA_L_M_NOR (0x0 << 15)
1024#define RT5670_MDA_L_M_ASYN (0x1 << 15)
1025#define RT5670_MDA_R_M_MASK (0x1 << 14)
1026#define RT5670_MDA_R_M_SFT 14
1027#define RT5670_MDA_R_M_NOR (0x0 << 14)
1028#define RT5670_MDA_R_M_ASYN (0x1 << 14)
1029#define RT5670_MAD_L_M_MASK (0x1 << 13)
1030#define RT5670_MAD_L_M_SFT 13
1031#define RT5670_MAD_L_M_NOR (0x0 << 13)
1032#define RT5670_MAD_L_M_ASYN (0x1 << 13)
1033#define RT5670_MAD_R_M_MASK (0x1 << 12)
1034#define RT5670_MAD_R_M_SFT 12
1035#define RT5670_MAD_R_M_NOR (0x0 << 12)
1036#define RT5670_MAD_R_M_ASYN (0x1 << 12)
1037#define RT5670_ADC_M_MASK (0x1 << 11)
1038#define RT5670_ADC_M_SFT 11
1039#define RT5670_ADC_M_NOR (0x0 << 11)
1040#define RT5670_ADC_M_ASYN (0x1 << 11)
1041#define RT5670_STO_DAC_M_MASK (0x1 << 5)
1042#define RT5670_STO_DAC_M_SFT 5
1043#define RT5670_STO_DAC_M_NOR (0x0 << 5)
1044#define RT5670_STO_DAC_M_ASYN (0x1 << 5)
1045#define RT5670_I2S1_R_D_MASK (0x1 << 4)
1046#define RT5670_I2S1_R_D_SFT 4
1047#define RT5670_I2S1_R_D_DIS (0x0 << 4)
1048#define RT5670_I2S1_R_D_EN (0x1 << 4)
1049#define RT5670_I2S2_R_D_MASK (0x1 << 3)
1050#define RT5670_I2S2_R_D_SFT 3
1051#define RT5670_I2S2_R_D_DIS (0x0 << 3)
1052#define RT5670_I2S2_R_D_EN (0x1 << 3)
1053#define RT5670_PRE_SCLK_MASK (0x3)
1054#define RT5670_PRE_SCLK_SFT 0
1055#define RT5670_PRE_SCLK_512 (0x0)
1056#define RT5670_PRE_SCLK_1024 (0x1)
1057#define RT5670_PRE_SCLK_2048 (0x2)
1058
1059/* ASRC Control 3 (0x85) */
1060#define RT5670_I2S1_RATE_MASK (0xf << 12)
1061#define RT5670_I2S1_RATE_SFT 12
1062#define RT5670_I2S2_RATE_MASK (0xf << 8)
1063#define RT5670_I2S2_RATE_SFT 8
1064
1065/* ASRC Control 4 (0x89) */
1066#define RT5670_I2S1_PD_MASK (0x7 << 12)
1067#define RT5670_I2S1_PD_SFT 12
1068#define RT5670_I2S2_PD_MASK (0x7 << 8)
1069#define RT5670_I2S2_PD_SFT 8
1070
1071/* HPOUT Over Current Detection (0x8b) */
1072#define RT5670_HP_OVCD_MASK (0x1 << 10)
1073#define RT5670_HP_OVCD_SFT 10
1074#define RT5670_HP_OVCD_DIS (0x0 << 10)
1075#define RT5670_HP_OVCD_EN (0x1 << 10)
1076#define RT5670_HP_OC_TH_MASK (0x3 << 8)
1077#define RT5670_HP_OC_TH_SFT 8
1078#define RT5670_HP_OC_TH_90 (0x0 << 8)
1079#define RT5670_HP_OC_TH_105 (0x1 << 8)
1080#define RT5670_HP_OC_TH_120 (0x2 << 8)
1081#define RT5670_HP_OC_TH_135 (0x3 << 8)
1082
1083/* Class D Over Current Control (0x8c) */
1084#define RT5670_CLSD_OC_MASK (0x1 << 9)
1085#define RT5670_CLSD_OC_SFT 9
1086#define RT5670_CLSD_OC_PU (0x0 << 9)
1087#define RT5670_CLSD_OC_PD (0x1 << 9)
1088#define RT5670_AUTO_PD_MASK (0x1 << 8)
1089#define RT5670_AUTO_PD_SFT 8
1090#define RT5670_AUTO_PD_DIS (0x0 << 8)
1091#define RT5670_AUTO_PD_EN (0x1 << 8)
1092#define RT5670_CLSD_OC_TH_MASK (0x3f)
1093#define RT5670_CLSD_OC_TH_SFT 0
1094
1095/* Class D Output Control (0x8d) */
1096#define RT5670_CLSD_RATIO_MASK (0xf << 12)
1097#define RT5670_CLSD_RATIO_SFT 12
1098#define RT5670_CLSD_OM_MASK (0x1 << 11)
1099#define RT5670_CLSD_OM_SFT 11
1100#define RT5670_CLSD_OM_MONO (0x0 << 11)
1101#define RT5670_CLSD_OM_STO (0x1 << 11)
1102#define RT5670_CLSD_SCH_MASK (0x1 << 10)
1103#define RT5670_CLSD_SCH_SFT 10
1104#define RT5670_CLSD_SCH_L (0x0 << 10)
1105#define RT5670_CLSD_SCH_S (0x1 << 10)
1106
1107/* Depop Mode Control 1 (0x8e) */
1108#define RT5670_SMT_TRIG_MASK (0x1 << 15)
1109#define RT5670_SMT_TRIG_SFT 15
1110#define RT5670_SMT_TRIG_DIS (0x0 << 15)
1111#define RT5670_SMT_TRIG_EN (0x1 << 15)
1112#define RT5670_HP_L_SMT_MASK (0x1 << 9)
1113#define RT5670_HP_L_SMT_SFT 9
1114#define RT5670_HP_L_SMT_DIS (0x0 << 9)
1115#define RT5670_HP_L_SMT_EN (0x1 << 9)
1116#define RT5670_HP_R_SMT_MASK (0x1 << 8)
1117#define RT5670_HP_R_SMT_SFT 8
1118#define RT5670_HP_R_SMT_DIS (0x0 << 8)
1119#define RT5670_HP_R_SMT_EN (0x1 << 8)
1120#define RT5670_HP_CD_PD_MASK (0x1 << 7)
1121#define RT5670_HP_CD_PD_SFT 7
1122#define RT5670_HP_CD_PD_DIS (0x0 << 7)
1123#define RT5670_HP_CD_PD_EN (0x1 << 7)
1124#define RT5670_RSTN_MASK (0x1 << 6)
1125#define RT5670_RSTN_SFT 6
1126#define RT5670_RSTN_DIS (0x0 << 6)
1127#define RT5670_RSTN_EN (0x1 << 6)
1128#define RT5670_RSTP_MASK (0x1 << 5)
1129#define RT5670_RSTP_SFT 5
1130#define RT5670_RSTP_DIS (0x0 << 5)
1131#define RT5670_RSTP_EN (0x1 << 5)
1132#define RT5670_HP_CO_MASK (0x1 << 4)
1133#define RT5670_HP_CO_SFT 4
1134#define RT5670_HP_CO_DIS (0x0 << 4)
1135#define RT5670_HP_CO_EN (0x1 << 4)
1136#define RT5670_HP_CP_MASK (0x1 << 3)
1137#define RT5670_HP_CP_SFT 3
1138#define RT5670_HP_CP_PD (0x0 << 3)
1139#define RT5670_HP_CP_PU (0x1 << 3)
1140#define RT5670_HP_SG_MASK (0x1 << 2)
1141#define RT5670_HP_SG_SFT 2
1142#define RT5670_HP_SG_DIS (0x0 << 2)
1143#define RT5670_HP_SG_EN (0x1 << 2)
1144#define RT5670_HP_DP_MASK (0x1 << 1)
1145#define RT5670_HP_DP_SFT 1
1146#define RT5670_HP_DP_PD (0x0 << 1)
1147#define RT5670_HP_DP_PU (0x1 << 1)
1148#define RT5670_HP_CB_MASK (0x1)
1149#define RT5670_HP_CB_SFT 0
1150#define RT5670_HP_CB_PD (0x0)
1151#define RT5670_HP_CB_PU (0x1)
1152
1153/* Depop Mode Control 2 (0x8f) */
1154#define RT5670_DEPOP_MASK (0x1 << 13)
1155#define RT5670_DEPOP_SFT 13
1156#define RT5670_DEPOP_AUTO (0x0 << 13)
1157#define RT5670_DEPOP_MAN (0x1 << 13)
1158#define RT5670_RAMP_MASK (0x1 << 12)
1159#define RT5670_RAMP_SFT 12
1160#define RT5670_RAMP_DIS (0x0 << 12)
1161#define RT5670_RAMP_EN (0x1 << 12)
1162#define RT5670_BPS_MASK (0x1 << 11)
1163#define RT5670_BPS_SFT 11
1164#define RT5670_BPS_DIS (0x0 << 11)
1165#define RT5670_BPS_EN (0x1 << 11)
1166#define RT5670_FAST_UPDN_MASK (0x1 << 10)
1167#define RT5670_FAST_UPDN_SFT 10
1168#define RT5670_FAST_UPDN_DIS (0x0 << 10)
1169#define RT5670_FAST_UPDN_EN (0x1 << 10)
1170#define RT5670_MRES_MASK (0x3 << 8)
1171#define RT5670_MRES_SFT 8
1172#define RT5670_MRES_15MO (0x0 << 8)
1173#define RT5670_MRES_25MO (0x1 << 8)
1174#define RT5670_MRES_35MO (0x2 << 8)
1175#define RT5670_MRES_45MO (0x3 << 8)
1176#define RT5670_VLO_MASK (0x1 << 7)
1177#define RT5670_VLO_SFT 7
1178#define RT5670_VLO_3V (0x0 << 7)
1179#define RT5670_VLO_32V (0x1 << 7)
1180#define RT5670_DIG_DP_MASK (0x1 << 6)
1181#define RT5670_DIG_DP_SFT 6
1182#define RT5670_DIG_DP_DIS (0x0 << 6)
1183#define RT5670_DIG_DP_EN (0x1 << 6)
1184#define RT5670_DP_TH_MASK (0x3 << 4)
1185#define RT5670_DP_TH_SFT 4
1186
1187/* Depop Mode Control 3 (0x90) */
1188#define RT5670_CP_SYS_MASK (0x7 << 12)
1189#define RT5670_CP_SYS_SFT 12
1190#define RT5670_CP_FQ1_MASK (0x7 << 8)
1191#define RT5670_CP_FQ1_SFT 8
1192#define RT5670_CP_FQ2_MASK (0x7 << 4)
1193#define RT5670_CP_FQ2_SFT 4
1194#define RT5670_CP_FQ3_MASK (0x7)
1195#define RT5670_CP_FQ3_SFT 0
1196#define RT5670_CP_FQ_1_5_KHZ 0
1197#define RT5670_CP_FQ_3_KHZ 1
1198#define RT5670_CP_FQ_6_KHZ 2
1199#define RT5670_CP_FQ_12_KHZ 3
1200#define RT5670_CP_FQ_24_KHZ 4
1201#define RT5670_CP_FQ_48_KHZ 5
1202#define RT5670_CP_FQ_96_KHZ 6
1203#define RT5670_CP_FQ_192_KHZ 7
1204
1205/* HPOUT charge pump (0x91) */
1206#define RT5670_OSW_L_MASK (0x1 << 11)
1207#define RT5670_OSW_L_SFT 11
1208#define RT5670_OSW_L_DIS (0x0 << 11)
1209#define RT5670_OSW_L_EN (0x1 << 11)
1210#define RT5670_OSW_R_MASK (0x1 << 10)
1211#define RT5670_OSW_R_SFT 10
1212#define RT5670_OSW_R_DIS (0x0 << 10)
1213#define RT5670_OSW_R_EN (0x1 << 10)
1214#define RT5670_PM_HP_MASK (0x3 << 8)
1215#define RT5670_PM_HP_SFT 8
1216#define RT5670_PM_HP_LV (0x0 << 8)
1217#define RT5670_PM_HP_MV (0x1 << 8)
1218#define RT5670_PM_HP_HV (0x2 << 8)
1219#define RT5670_IB_HP_MASK (0x3 << 6)
1220#define RT5670_IB_HP_SFT 6
1221#define RT5670_IB_HP_125IL (0x0 << 6)
1222#define RT5670_IB_HP_25IL (0x1 << 6)
1223#define RT5670_IB_HP_5IL (0x2 << 6)
1224#define RT5670_IB_HP_1IL (0x3 << 6)
1225
1226/* PV detection and SPK gain control (0x92) */
1227#define RT5670_PVDD_DET_MASK (0x1 << 15)
1228#define RT5670_PVDD_DET_SFT 15
1229#define RT5670_PVDD_DET_DIS (0x0 << 15)
1230#define RT5670_PVDD_DET_EN (0x1 << 15)
1231#define RT5670_SPK_AG_MASK (0x1 << 14)
1232#define RT5670_SPK_AG_SFT 14
1233#define RT5670_SPK_AG_DIS (0x0 << 14)
1234#define RT5670_SPK_AG_EN (0x1 << 14)
1235
1236/* Micbias Control (0x93) */
1237#define RT5670_MIC1_BS_MASK (0x1 << 15)
1238#define RT5670_MIC1_BS_SFT 15
1239#define RT5670_MIC1_BS_9AV (0x0 << 15)
1240#define RT5670_MIC1_BS_75AV (0x1 << 15)
1241#define RT5670_MIC2_BS_MASK (0x1 << 14)
1242#define RT5670_MIC2_BS_SFT 14
1243#define RT5670_MIC2_BS_9AV (0x0 << 14)
1244#define RT5670_MIC2_BS_75AV (0x1 << 14)
1245#define RT5670_MIC1_CLK_MASK (0x1 << 13)
1246#define RT5670_MIC1_CLK_SFT 13
1247#define RT5670_MIC1_CLK_DIS (0x0 << 13)
1248#define RT5670_MIC1_CLK_EN (0x1 << 13)
1249#define RT5670_MIC2_CLK_MASK (0x1 << 12)
1250#define RT5670_MIC2_CLK_SFT 12
1251#define RT5670_MIC2_CLK_DIS (0x0 << 12)
1252#define RT5670_MIC2_CLK_EN (0x1 << 12)
1253#define RT5670_MIC1_OVCD_MASK (0x1 << 11)
1254#define RT5670_MIC1_OVCD_SFT 11
1255#define RT5670_MIC1_OVCD_DIS (0x0 << 11)
1256#define RT5670_MIC1_OVCD_EN (0x1 << 11)
1257#define RT5670_MIC1_OVTH_MASK (0x3 << 9)
1258#define RT5670_MIC1_OVTH_SFT 9
1259#define RT5670_MIC1_OVTH_600UA (0x0 << 9)
1260#define RT5670_MIC1_OVTH_1500UA (0x1 << 9)
1261#define RT5670_MIC1_OVTH_2000UA (0x2 << 9)
1262#define RT5670_MIC2_OVCD_MASK (0x1 << 8)
1263#define RT5670_MIC2_OVCD_SFT 8
1264#define RT5670_MIC2_OVCD_DIS (0x0 << 8)
1265#define RT5670_MIC2_OVCD_EN (0x1 << 8)
1266#define RT5670_MIC2_OVTH_MASK (0x3 << 6)
1267#define RT5670_MIC2_OVTH_SFT 6
1268#define RT5670_MIC2_OVTH_600UA (0x0 << 6)
1269#define RT5670_MIC2_OVTH_1500UA (0x1 << 6)
1270#define RT5670_MIC2_OVTH_2000UA (0x2 << 6)
1271#define RT5670_PWR_MB_MASK (0x1 << 5)
1272#define RT5670_PWR_MB_SFT 5
1273#define RT5670_PWR_MB_PD (0x0 << 5)
1274#define RT5670_PWR_MB_PU (0x1 << 5)
1275#define RT5670_PWR_CLK25M_MASK (0x1 << 4)
1276#define RT5670_PWR_CLK25M_SFT 4
1277#define RT5670_PWR_CLK25M_PD (0x0 << 4)
1278#define RT5670_PWR_CLK25M_PU (0x1 << 4)
1279
1280/* Analog JD Control 1 (0x94) */
1281#define RT5670_JD1_MODE_MASK (0x3 << 0)
1282#define RT5670_JD1_MODE_0 (0x0 << 0)
1283#define RT5670_JD1_MODE_1 (0x1 << 0)
1284#define RT5670_JD1_MODE_2 (0x2 << 0)
1285
1286/* VAD Control 4 (0x9d) */
1287#define RT5670_VAD_SEL_MASK (0x3 << 8)
1288#define RT5670_VAD_SEL_SFT 8
1289
1290/* EQ Control 1 (0xb0) */
1291#define RT5670_EQ_SRC_MASK (0x1 << 15)
1292#define RT5670_EQ_SRC_SFT 15
1293#define RT5670_EQ_SRC_DAC (0x0 << 15)
1294#define RT5670_EQ_SRC_ADC (0x1 << 15)
1295#define RT5670_EQ_UPD (0x1 << 14)
1296#define RT5670_EQ_UPD_BIT 14
1297#define RT5670_EQ_CD_MASK (0x1 << 13)
1298#define RT5670_EQ_CD_SFT 13
1299#define RT5670_EQ_CD_DIS (0x0 << 13)
1300#define RT5670_EQ_CD_EN (0x1 << 13)
1301#define RT5670_EQ_DITH_MASK (0x3 << 8)
1302#define RT5670_EQ_DITH_SFT 8
1303#define RT5670_EQ_DITH_NOR (0x0 << 8)
1304#define RT5670_EQ_DITH_LSB (0x1 << 8)
1305#define RT5670_EQ_DITH_LSB_1 (0x2 << 8)
1306#define RT5670_EQ_DITH_LSB_2 (0x3 << 8)
1307
1308/* EQ Control 2 (0xb1) */
1309#define RT5670_EQ_HPF1_M_MASK (0x1 << 8)
1310#define RT5670_EQ_HPF1_M_SFT 8
1311#define RT5670_EQ_HPF1_M_HI (0x0 << 8)
1312#define RT5670_EQ_HPF1_M_1ST (0x1 << 8)
1313#define RT5670_EQ_LPF1_M_MASK (0x1 << 7)
1314#define RT5670_EQ_LPF1_M_SFT 7
1315#define RT5670_EQ_LPF1_M_LO (0x0 << 7)
1316#define RT5670_EQ_LPF1_M_1ST (0x1 << 7)
1317#define RT5670_EQ_HPF2_MASK (0x1 << 6)
1318#define RT5670_EQ_HPF2_SFT 6
1319#define RT5670_EQ_HPF2_DIS (0x0 << 6)
1320#define RT5670_EQ_HPF2_EN (0x1 << 6)
1321#define RT5670_EQ_HPF1_MASK (0x1 << 5)
1322#define RT5670_EQ_HPF1_SFT 5
1323#define RT5670_EQ_HPF1_DIS (0x0 << 5)
1324#define RT5670_EQ_HPF1_EN (0x1 << 5)
1325#define RT5670_EQ_BPF4_MASK (0x1 << 4)
1326#define RT5670_EQ_BPF4_SFT 4
1327#define RT5670_EQ_BPF4_DIS (0x0 << 4)
1328#define RT5670_EQ_BPF4_EN (0x1 << 4)
1329#define RT5670_EQ_BPF3_MASK (0x1 << 3)
1330#define RT5670_EQ_BPF3_SFT 3
1331#define RT5670_EQ_BPF3_DIS (0x0 << 3)
1332#define RT5670_EQ_BPF3_EN (0x1 << 3)
1333#define RT5670_EQ_BPF2_MASK (0x1 << 2)
1334#define RT5670_EQ_BPF2_SFT 2
1335#define RT5670_EQ_BPF2_DIS (0x0 << 2)
1336#define RT5670_EQ_BPF2_EN (0x1 << 2)
1337#define RT5670_EQ_BPF1_MASK (0x1 << 1)
1338#define RT5670_EQ_BPF1_SFT 1
1339#define RT5670_EQ_BPF1_DIS (0x0 << 1)
1340#define RT5670_EQ_BPF1_EN (0x1 << 1)
1341#define RT5670_EQ_LPF_MASK (0x1)
1342#define RT5670_EQ_LPF_SFT 0
1343#define RT5670_EQ_LPF_DIS (0x0)
1344#define RT5670_EQ_LPF_EN (0x1)
1345#define RT5670_EQ_CTRL_MASK (0x7f)
1346
1347/* Memory Test (0xb2) */
1348#define RT5670_MT_MASK (0x1 << 15)
1349#define RT5670_MT_SFT 15
1350#define RT5670_MT_DIS (0x0 << 15)
1351#define RT5670_MT_EN (0x1 << 15)
1352
1353/* DRC/AGC Control 1 (0xb4) */
1354#define RT5670_DRC_AGC_P_MASK (0x1 << 15)
1355#define RT5670_DRC_AGC_P_SFT 15
1356#define RT5670_DRC_AGC_P_DAC (0x0 << 15)
1357#define RT5670_DRC_AGC_P_ADC (0x1 << 15)
1358#define RT5670_DRC_AGC_MASK (0x1 << 14)
1359#define RT5670_DRC_AGC_SFT 14
1360#define RT5670_DRC_AGC_DIS (0x0 << 14)
1361#define RT5670_DRC_AGC_EN (0x1 << 14)
1362#define RT5670_DRC_AGC_UPD (0x1 << 13)
1363#define RT5670_DRC_AGC_UPD_BIT 13
1364#define RT5670_DRC_AGC_AR_MASK (0x1f << 8)
1365#define RT5670_DRC_AGC_AR_SFT 8
1366#define RT5670_DRC_AGC_R_MASK (0x7 << 5)
1367#define RT5670_DRC_AGC_R_SFT 5
1368#define RT5670_DRC_AGC_R_48K (0x1 << 5)
1369#define RT5670_DRC_AGC_R_96K (0x2 << 5)
1370#define RT5670_DRC_AGC_R_192K (0x3 << 5)
1371#define RT5670_DRC_AGC_R_441K (0x5 << 5)
1372#define RT5670_DRC_AGC_R_882K (0x6 << 5)
1373#define RT5670_DRC_AGC_R_1764K (0x7 << 5)
1374#define RT5670_DRC_AGC_RC_MASK (0x1f)
1375#define RT5670_DRC_AGC_RC_SFT 0
1376
1377/* DRC/AGC Control 2 (0xb5) */
1378#define RT5670_DRC_AGC_POB_MASK (0x3f << 8)
1379#define RT5670_DRC_AGC_POB_SFT 8
1380#define RT5670_DRC_AGC_CP_MASK (0x1 << 7)
1381#define RT5670_DRC_AGC_CP_SFT 7
1382#define RT5670_DRC_AGC_CP_DIS (0x0 << 7)
1383#define RT5670_DRC_AGC_CP_EN (0x1 << 7)
1384#define RT5670_DRC_AGC_CPR_MASK (0x3 << 5)
1385#define RT5670_DRC_AGC_CPR_SFT 5
1386#define RT5670_DRC_AGC_CPR_1_1 (0x0 << 5)
1387#define RT5670_DRC_AGC_CPR_1_2 (0x1 << 5)
1388#define RT5670_DRC_AGC_CPR_1_3 (0x2 << 5)
1389#define RT5670_DRC_AGC_CPR_1_4 (0x3 << 5)
1390#define RT5670_DRC_AGC_PRB_MASK (0x1f)
1391#define RT5670_DRC_AGC_PRB_SFT 0
1392
1393/* DRC/AGC Control 3 (0xb6) */
1394#define RT5670_DRC_AGC_NGB_MASK (0xf << 12)
1395#define RT5670_DRC_AGC_NGB_SFT 12
1396#define RT5670_DRC_AGC_TAR_MASK (0x1f << 7)
1397#define RT5670_DRC_AGC_TAR_SFT 7
1398#define RT5670_DRC_AGC_NG_MASK (0x1 << 6)
1399#define RT5670_DRC_AGC_NG_SFT 6
1400#define RT5670_DRC_AGC_NG_DIS (0x0 << 6)
1401#define RT5670_DRC_AGC_NG_EN (0x1 << 6)
1402#define RT5670_DRC_AGC_NGH_MASK (0x1 << 5)
1403#define RT5670_DRC_AGC_NGH_SFT 5
1404#define RT5670_DRC_AGC_NGH_DIS (0x0 << 5)
1405#define RT5670_DRC_AGC_NGH_EN (0x1 << 5)
1406#define RT5670_DRC_AGC_NGT_MASK (0x1f)
1407#define RT5670_DRC_AGC_NGT_SFT 0
1408
1409/* Jack Detect Control (0xbb) */
1410#define RT5670_JD_MASK (0x7 << 13)
1411#define RT5670_JD_SFT 13
1412#define RT5670_JD_DIS (0x0 << 13)
1413#define RT5670_JD_GPIO1 (0x1 << 13)
1414#define RT5670_JD_JD1_IN4P (0x2 << 13)
1415#define RT5670_JD_JD2_IN4N (0x3 << 13)
1416#define RT5670_JD_GPIO2 (0x4 << 13)
1417#define RT5670_JD_GPIO3 (0x5 << 13)
1418#define RT5670_JD_GPIO4 (0x6 << 13)
1419#define RT5670_JD_HP_MASK (0x1 << 11)
1420#define RT5670_JD_HP_SFT 11
1421#define RT5670_JD_HP_DIS (0x0 << 11)
1422#define RT5670_JD_HP_EN (0x1 << 11)
1423#define RT5670_JD_HP_TRG_MASK (0x1 << 10)
1424#define RT5670_JD_HP_TRG_SFT 10
1425#define RT5670_JD_HP_TRG_LO (0x0 << 10)
1426#define RT5670_JD_HP_TRG_HI (0x1 << 10)
1427#define RT5670_JD_SPL_MASK (0x1 << 9)
1428#define RT5670_JD_SPL_SFT 9
1429#define RT5670_JD_SPL_DIS (0x0 << 9)
1430#define RT5670_JD_SPL_EN (0x1 << 9)
1431#define RT5670_JD_SPL_TRG_MASK (0x1 << 8)
1432#define RT5670_JD_SPL_TRG_SFT 8
1433#define RT5670_JD_SPL_TRG_LO (0x0 << 8)
1434#define RT5670_JD_SPL_TRG_HI (0x1 << 8)
1435#define RT5670_JD_SPR_MASK (0x1 << 7)
1436#define RT5670_JD_SPR_SFT 7
1437#define RT5670_JD_SPR_DIS (0x0 << 7)
1438#define RT5670_JD_SPR_EN (0x1 << 7)
1439#define RT5670_JD_SPR_TRG_MASK (0x1 << 6)
1440#define RT5670_JD_SPR_TRG_SFT 6
1441#define RT5670_JD_SPR_TRG_LO (0x0 << 6)
1442#define RT5670_JD_SPR_TRG_HI (0x1 << 6)
1443#define RT5670_JD_MO_MASK (0x1 << 5)
1444#define RT5670_JD_MO_SFT 5
1445#define RT5670_JD_MO_DIS (0x0 << 5)
1446#define RT5670_JD_MO_EN (0x1 << 5)
1447#define RT5670_JD_MO_TRG_MASK (0x1 << 4)
1448#define RT5670_JD_MO_TRG_SFT 4
1449#define RT5670_JD_MO_TRG_LO (0x0 << 4)
1450#define RT5670_JD_MO_TRG_HI (0x1 << 4)
1451#define RT5670_JD_LO_MASK (0x1 << 3)
1452#define RT5670_JD_LO_SFT 3
1453#define RT5670_JD_LO_DIS (0x0 << 3)
1454#define RT5670_JD_LO_EN (0x1 << 3)
1455#define RT5670_JD_LO_TRG_MASK (0x1 << 2)
1456#define RT5670_JD_LO_TRG_SFT 2
1457#define RT5670_JD_LO_TRG_LO (0x0 << 2)
1458#define RT5670_JD_LO_TRG_HI (0x1 << 2)
1459#define RT5670_JD1_IN4P_MASK (0x1 << 1)
1460#define RT5670_JD1_IN4P_SFT 1
1461#define RT5670_JD1_IN4P_DIS (0x0 << 1)
1462#define RT5670_JD1_IN4P_EN (0x1 << 1)
1463#define RT5670_JD2_IN4N_MASK (0x1)
1464#define RT5670_JD2_IN4N_SFT 0
1465#define RT5670_JD2_IN4N_DIS (0x0)
1466#define RT5670_JD2_IN4N_EN (0x1)
1467
1468/* IRQ Control 1 (0xbd) */
1469#define RT5670_IRQ_JD_MASK (0x1 << 15)
1470#define RT5670_IRQ_JD_SFT 15
1471#define RT5670_IRQ_JD_BP (0x0 << 15)
1472#define RT5670_IRQ_JD_NOR (0x1 << 15)
1473#define RT5670_IRQ_OT_MASK (0x1 << 14)
1474#define RT5670_IRQ_OT_SFT 14
1475#define RT5670_IRQ_OT_BP (0x0 << 14)
1476#define RT5670_IRQ_OT_NOR (0x1 << 14)
1477#define RT5670_JD_STKY_MASK (0x1 << 13)
1478#define RT5670_JD_STKY_SFT 13
1479#define RT5670_JD_STKY_DIS (0x0 << 13)
1480#define RT5670_JD_STKY_EN (0x1 << 13)
1481#define RT5670_OT_STKY_MASK (0x1 << 12)
1482#define RT5670_OT_STKY_SFT 12
1483#define RT5670_OT_STKY_DIS (0x0 << 12)
1484#define RT5670_OT_STKY_EN (0x1 << 12)
1485#define RT5670_JD_P_MASK (0x1 << 11)
1486#define RT5670_JD_P_SFT 11
1487#define RT5670_JD_P_NOR (0x0 << 11)
1488#define RT5670_JD_P_INV (0x1 << 11)
1489#define RT5670_OT_P_MASK (0x1 << 10)
1490#define RT5670_OT_P_SFT 10
1491#define RT5670_OT_P_NOR (0x0 << 10)
1492#define RT5670_OT_P_INV (0x1 << 10)
1493#define RT5670_JD1_1_EN_MASK (0x1 << 9)
1494#define RT5670_JD1_1_EN_SFT 9
1495#define RT5670_JD1_1_DIS (0x0 << 9)
1496#define RT5670_JD1_1_EN (0x1 << 9)
1497
1498/* IRQ Control 2 (0xbe) */
1499#define RT5670_IRQ_MB1_OC_MASK (0x1 << 15)
1500#define RT5670_IRQ_MB1_OC_SFT 15
1501#define RT5670_IRQ_MB1_OC_BP (0x0 << 15)
1502#define RT5670_IRQ_MB1_OC_NOR (0x1 << 15)
1503#define RT5670_IRQ_MB2_OC_MASK (0x1 << 14)
1504#define RT5670_IRQ_MB2_OC_SFT 14
1505#define RT5670_IRQ_MB2_OC_BP (0x0 << 14)
1506#define RT5670_IRQ_MB2_OC_NOR (0x1 << 14)
1507#define RT5670_MB1_OC_STKY_MASK (0x1 << 11)
1508#define RT5670_MB1_OC_STKY_SFT 11
1509#define RT5670_MB1_OC_STKY_DIS (0x0 << 11)
1510#define RT5670_MB1_OC_STKY_EN (0x1 << 11)
1511#define RT5670_MB2_OC_STKY_MASK (0x1 << 10)
1512#define RT5670_MB2_OC_STKY_SFT 10
1513#define RT5670_MB2_OC_STKY_DIS (0x0 << 10)
1514#define RT5670_MB2_OC_STKY_EN (0x1 << 10)
1515#define RT5670_MB1_OC_P_MASK (0x1 << 7)
1516#define RT5670_MB1_OC_P_SFT 7
1517#define RT5670_MB1_OC_P_NOR (0x0 << 7)
1518#define RT5670_MB1_OC_P_INV (0x1 << 7)
1519#define RT5670_MB2_OC_P_MASK (0x1 << 6)
1520#define RT5670_MB2_OC_P_SFT 6
1521#define RT5670_MB2_OC_P_NOR (0x0 << 6)
1522#define RT5670_MB2_OC_P_INV (0x1 << 6)
1523#define RT5670_MB1_OC_CLR (0x1 << 3)
1524#define RT5670_MB1_OC_CLR_SFT 3
1525#define RT5670_MB2_OC_CLR (0x1 << 2)
1526#define RT5670_MB2_OC_CLR_SFT 2
1527
1528/* GPIO Control 1 (0xc0) */
1529#define RT5670_GP1_PIN_MASK (0x1 << 15)
1530#define RT5670_GP1_PIN_SFT 15
1531#define RT5670_GP1_PIN_GPIO1 (0x0 << 15)
1532#define RT5670_GP1_PIN_IRQ (0x1 << 15)
1533#define RT5670_GP2_PIN_MASK (0x1 << 14)
1534#define RT5670_GP2_PIN_SFT 14
1535#define RT5670_GP2_PIN_GPIO2 (0x0 << 14)
1536#define RT5670_GP2_PIN_DMIC1_SCL (0x1 << 14)
1537#define RT5670_GP3_PIN_MASK (0x3 << 12)
1538#define RT5670_GP3_PIN_SFT 12
1539#define RT5670_GP3_PIN_GPIO3 (0x0 << 12)
1540#define RT5670_GP3_PIN_DMIC1_SDA (0x1 << 12)
1541#define RT5670_GP3_PIN_IRQ (0x2 << 12)
1542#define RT5670_GP4_PIN_MASK (0x1 << 11)
1543#define RT5670_GP4_PIN_SFT 11
1544#define RT5670_GP4_PIN_GPIO4 (0x0 << 11)
1545#define RT5670_GP4_PIN_DMIC2_SDA (0x1 << 11)
1546#define RT5670_DP_SIG_MASK (0x1 << 10)
1547#define RT5670_DP_SIG_SFT 10
1548#define RT5670_DP_SIG_TEST (0x0 << 10)
1549#define RT5670_DP_SIG_AP (0x1 << 10)
1550#define RT5670_GPIO_M_MASK (0x1 << 9)
1551#define RT5670_GPIO_M_SFT 9
1552#define RT5670_GPIO_M_FLT (0x0 << 9)
1553#define RT5670_GPIO_M_PH (0x1 << 9)
1554#define RT5670_I2S2_PIN_MASK (0x1 << 8)
1555#define RT5670_I2S2_PIN_SFT 8
1556#define RT5670_I2S2_PIN_I2S (0x0 << 8)
1557#define RT5670_I2S2_PIN_GPIO (0x1 << 8)
1558#define RT5670_GP5_PIN_MASK (0x1 << 7)
1559#define RT5670_GP5_PIN_SFT 7
1560#define RT5670_GP5_PIN_GPIO5 (0x0 << 7)
1561#define RT5670_GP5_PIN_DMIC3_SDA (0x1 << 7)
1562#define RT5670_GP6_PIN_MASK (0x1 << 6)
1563#define RT5670_GP6_PIN_SFT 6
1564#define RT5670_GP6_PIN_GPIO6 (0x0 << 6)
1565#define RT5670_GP6_PIN_DMIC1_SDA (0x1 << 6)
1566#define RT5670_GP7_PIN_MASK (0x3 << 4)
1567#define RT5670_GP7_PIN_SFT 4
1568#define RT5670_GP7_PIN_GPIO7 (0x0 << 4)
1569#define RT5670_GP7_PIN_DMIC1_SDA (0x1 << 4)
1570#define RT5670_GP7_PIN_PDM_SCL2 (0x2 << 4)
1571#define RT5670_GP8_PIN_MASK (0x1 << 3)
1572#define RT5670_GP8_PIN_SFT 3
1573#define RT5670_GP8_PIN_GPIO8 (0x0 << 3)
1574#define RT5670_GP8_PIN_DMIC2_SDA (0x1 << 3)
1575#define RT5670_GP9_PIN_MASK (0x1 << 2)
1576#define RT5670_GP9_PIN_SFT 2
1577#define RT5670_GP9_PIN_GPIO9 (0x0 << 2)
1578#define RT5670_GP9_PIN_DMIC3_SDA (0x1 << 2)
1579#define RT5670_GP10_PIN_MASK (0x3)
1580#define RT5670_GP10_PIN_SFT 0
1581#define RT5670_GP10_PIN_GPIO9 (0x0)
1582#define RT5670_GP10_PIN_DMIC3_SDA (0x1)
1583#define RT5670_GP10_PIN_PDM_ADT2 (0x2)
1584
1585/* GPIO Control 2 (0xc1) */
1586#define RT5670_GP4_PF_MASK (0x1 << 11)
1587#define RT5670_GP4_PF_SFT 11
1588#define RT5670_GP4_PF_IN (0x0 << 11)
1589#define RT5670_GP4_PF_OUT (0x1 << 11)
1590#define RT5670_GP4_OUT_MASK (0x1 << 10)
1591#define RT5670_GP4_OUT_SFT 10
1592#define RT5670_GP4_OUT_LO (0x0 << 10)
1593#define RT5670_GP4_OUT_HI (0x1 << 10)
1594#define RT5670_GP4_P_MASK (0x1 << 9)
1595#define RT5670_GP4_P_SFT 9
1596#define RT5670_GP4_P_NOR (0x0 << 9)
1597#define RT5670_GP4_P_INV (0x1 << 9)
1598#define RT5670_GP3_PF_MASK (0x1 << 8)
1599#define RT5670_GP3_PF_SFT 8
1600#define RT5670_GP3_PF_IN (0x0 << 8)
1601#define RT5670_GP3_PF_OUT (0x1 << 8)
1602#define RT5670_GP3_OUT_MASK (0x1 << 7)
1603#define RT5670_GP3_OUT_SFT 7
1604#define RT5670_GP3_OUT_LO (0x0 << 7)
1605#define RT5670_GP3_OUT_HI (0x1 << 7)
1606#define RT5670_GP3_P_MASK (0x1 << 6)
1607#define RT5670_GP3_P_SFT 6
1608#define RT5670_GP3_P_NOR (0x0 << 6)
1609#define RT5670_GP3_P_INV (0x1 << 6)
1610#define RT5670_GP2_PF_MASK (0x1 << 5)
1611#define RT5670_GP2_PF_SFT 5
1612#define RT5670_GP2_PF_IN (0x0 << 5)
1613#define RT5670_GP2_PF_OUT (0x1 << 5)
1614#define RT5670_GP2_OUT_MASK (0x1 << 4)
1615#define RT5670_GP2_OUT_SFT 4
1616#define RT5670_GP2_OUT_LO (0x0 << 4)
1617#define RT5670_GP2_OUT_HI (0x1 << 4)
1618#define RT5670_GP2_P_MASK (0x1 << 3)
1619#define RT5670_GP2_P_SFT 3
1620#define RT5670_GP2_P_NOR (0x0 << 3)
1621#define RT5670_GP2_P_INV (0x1 << 3)
1622#define RT5670_GP1_PF_MASK (0x1 << 2)
1623#define RT5670_GP1_PF_SFT 2
1624#define RT5670_GP1_PF_IN (0x0 << 2)
1625#define RT5670_GP1_PF_OUT (0x1 << 2)
1626#define RT5670_GP1_OUT_MASK (0x1 << 1)
1627#define RT5670_GP1_OUT_SFT 1
1628#define RT5670_GP1_OUT_LO (0x0 << 1)
1629#define RT5670_GP1_OUT_HI (0x1 << 1)
1630#define RT5670_GP1_P_MASK (0x1)
1631#define RT5670_GP1_P_SFT 0
1632#define RT5670_GP1_P_NOR (0x0)
1633#define RT5670_GP1_P_INV (0x1)
1634
1635/* Scramble Function (0xcd) */
1636#define RT5670_SCB_KEY_MASK (0xff)
1637#define RT5670_SCB_KEY_SFT 0
1638
1639/* Scramble Control (0xce) */
1640#define RT5670_SCB_SWAP_MASK (0x1 << 15)
1641#define RT5670_SCB_SWAP_SFT 15
1642#define RT5670_SCB_SWAP_DIS (0x0 << 15)
1643#define RT5670_SCB_SWAP_EN (0x1 << 15)
1644#define RT5670_SCB_MASK (0x1 << 14)
1645#define RT5670_SCB_SFT 14
1646#define RT5670_SCB_DIS (0x0 << 14)
1647#define RT5670_SCB_EN (0x1 << 14)
1648
1649/* Baseback Control (0xcf) */
1650#define RT5670_BB_MASK (0x1 << 15)
1651#define RT5670_BB_SFT 15
1652#define RT5670_BB_DIS (0x0 << 15)
1653#define RT5670_BB_EN (0x1 << 15)
1654#define RT5670_BB_CT_MASK (0x7 << 12)
1655#define RT5670_BB_CT_SFT 12
1656#define RT5670_BB_CT_A (0x0 << 12)
1657#define RT5670_BB_CT_B (0x1 << 12)
1658#define RT5670_BB_CT_C (0x2 << 12)
1659#define RT5670_BB_CT_D (0x3 << 12)
1660#define RT5670_M_BB_L_MASK (0x1 << 9)
1661#define RT5670_M_BB_L_SFT 9
1662#define RT5670_M_BB_R_MASK (0x1 << 8)
1663#define RT5670_M_BB_R_SFT 8
1664#define RT5670_M_BB_HPF_L_MASK (0x1 << 7)
1665#define RT5670_M_BB_HPF_L_SFT 7
1666#define RT5670_M_BB_HPF_R_MASK (0x1 << 6)
1667#define RT5670_M_BB_HPF_R_SFT 6
1668#define RT5670_G_BB_BST_MASK (0x3f)
1669#define RT5670_G_BB_BST_SFT 0
1670
1671/* MP3 Plus Control 1 (0xd0) */
1672#define RT5670_M_MP3_L_MASK (0x1 << 15)
1673#define RT5670_M_MP3_L_SFT 15
1674#define RT5670_M_MP3_R_MASK (0x1 << 14)
1675#define RT5670_M_MP3_R_SFT 14
1676#define RT5670_M_MP3_MASK (0x1 << 13)
1677#define RT5670_M_MP3_SFT 13
1678#define RT5670_M_MP3_DIS (0x0 << 13)
1679#define RT5670_M_MP3_EN (0x1 << 13)
1680#define RT5670_EG_MP3_MASK (0x1f << 8)
1681#define RT5670_EG_MP3_SFT 8
1682#define RT5670_MP3_HLP_MASK (0x1 << 7)
1683#define RT5670_MP3_HLP_SFT 7
1684#define RT5670_MP3_HLP_DIS (0x0 << 7)
1685#define RT5670_MP3_HLP_EN (0x1 << 7)
1686#define RT5670_M_MP3_ORG_L_MASK (0x1 << 6)
1687#define RT5670_M_MP3_ORG_L_SFT 6
1688#define RT5670_M_MP3_ORG_R_MASK (0x1 << 5)
1689#define RT5670_M_MP3_ORG_R_SFT 5
1690
1691/* MP3 Plus Control 2 (0xd1) */
1692#define RT5670_MP3_WT_MASK (0x1 << 13)
1693#define RT5670_MP3_WT_SFT 13
1694#define RT5670_MP3_WT_1_4 (0x0 << 13)
1695#define RT5670_MP3_WT_1_2 (0x1 << 13)
1696#define RT5670_OG_MP3_MASK (0x1f << 8)
1697#define RT5670_OG_MP3_SFT 8
1698#define RT5670_HG_MP3_MASK (0x3f)
1699#define RT5670_HG_MP3_SFT 0
1700
1701/* 3D HP Control 1 (0xd2) */
1702#define RT5670_3D_CF_MASK (0x1 << 15)
1703#define RT5670_3D_CF_SFT 15
1704#define RT5670_3D_CF_DIS (0x0 << 15)
1705#define RT5670_3D_CF_EN (0x1 << 15)
1706#define RT5670_3D_HP_MASK (0x1 << 14)
1707#define RT5670_3D_HP_SFT 14
1708#define RT5670_3D_HP_DIS (0x0 << 14)
1709#define RT5670_3D_HP_EN (0x1 << 14)
1710#define RT5670_3D_BT_MASK (0x1 << 13)
1711#define RT5670_3D_BT_SFT 13
1712#define RT5670_3D_BT_DIS (0x0 << 13)
1713#define RT5670_3D_BT_EN (0x1 << 13)
1714#define RT5670_3D_1F_MIX_MASK (0x3 << 11)
1715#define RT5670_3D_1F_MIX_SFT 11
1716#define RT5670_3D_HP_M_MASK (0x1 << 10)
1717#define RT5670_3D_HP_M_SFT 10
1718#define RT5670_3D_HP_M_SUR (0x0 << 10)
1719#define RT5670_3D_HP_M_FRO (0x1 << 10)
1720#define RT5670_M_3D_HRTF_MASK (0x1 << 9)
1721#define RT5670_M_3D_HRTF_SFT 9
1722#define RT5670_M_3D_D2H_MASK (0x1 << 8)
1723#define RT5670_M_3D_D2H_SFT 8
1724#define RT5670_M_3D_D2R_MASK (0x1 << 7)
1725#define RT5670_M_3D_D2R_SFT 7
1726#define RT5670_M_3D_REVB_MASK (0x1 << 6)
1727#define RT5670_M_3D_REVB_SFT 6
1728
1729/* Adjustable high pass filter control 1 (0xd3) */
1730#define RT5670_2ND_HPF_MASK (0x1 << 15)
1731#define RT5670_2ND_HPF_SFT 15
1732#define RT5670_2ND_HPF_DIS (0x0 << 15)
1733#define RT5670_2ND_HPF_EN (0x1 << 15)
1734#define RT5670_HPF_CF_L_MASK (0x7 << 12)
1735#define RT5670_HPF_CF_L_SFT 12
1736#define RT5670_1ST_HPF_MASK (0x1 << 11)
1737#define RT5670_1ST_HPF_SFT 11
1738#define RT5670_1ST_HPF_DIS (0x0 << 11)
1739#define RT5670_1ST_HPF_EN (0x1 << 11)
1740#define RT5670_HPF_CF_R_MASK (0x7 << 8)
1741#define RT5670_HPF_CF_R_SFT 8
1742#define RT5670_ZD_T_MASK (0x3 << 6)
1743#define RT5670_ZD_T_SFT 6
1744#define RT5670_ZD_F_MASK (0x3 << 4)
1745#define RT5670_ZD_F_SFT 4
1746#define RT5670_ZD_F_IM (0x0 << 4)
1747#define RT5670_ZD_F_ZC_IM (0x1 << 4)
1748#define RT5670_ZD_F_ZC_IOD (0x2 << 4)
1749#define RT5670_ZD_F_UN (0x3 << 4)
1750
1751/* HP calibration control and Amp detection (0xd6) */
1752#define RT5670_SI_DAC_MASK (0x1 << 11)
1753#define RT5670_SI_DAC_SFT 11
1754#define RT5670_SI_DAC_AUTO (0x0 << 11)
1755#define RT5670_SI_DAC_TEST (0x1 << 11)
1756#define RT5670_DC_CAL_M_MASK (0x1 << 10)
1757#define RT5670_DC_CAL_M_SFT 10
1758#define RT5670_DC_CAL_M_CAL (0x0 << 10)
1759#define RT5670_DC_CAL_M_NOR (0x1 << 10)
1760#define RT5670_DC_CAL_MASK (0x1 << 9)
1761#define RT5670_DC_CAL_SFT 9
1762#define RT5670_DC_CAL_DIS (0x0 << 9)
1763#define RT5670_DC_CAL_EN (0x1 << 9)
1764#define RT5670_HPD_RCV_MASK (0x7 << 6)
1765#define RT5670_HPD_RCV_SFT 6
1766#define RT5670_HPD_PS_MASK (0x1 << 5)
1767#define RT5670_HPD_PS_SFT 5
1768#define RT5670_HPD_PS_DIS (0x0 << 5)
1769#define RT5670_HPD_PS_EN (0x1 << 5)
1770#define RT5670_CAL_M_MASK (0x1 << 4)
1771#define RT5670_CAL_M_SFT 4
1772#define RT5670_CAL_M_DEP (0x0 << 4)
1773#define RT5670_CAL_M_CAL (0x1 << 4)
1774#define RT5670_CAL_MASK (0x1 << 3)
1775#define RT5670_CAL_SFT 3
1776#define RT5670_CAL_DIS (0x0 << 3)
1777#define RT5670_CAL_EN (0x1 << 3)
1778#define RT5670_CAL_TEST_MASK (0x1 << 2)
1779#define RT5670_CAL_TEST_SFT 2
1780#define RT5670_CAL_TEST_DIS (0x0 << 2)
1781#define RT5670_CAL_TEST_EN (0x1 << 2)
1782#define RT5670_CAL_P_MASK (0x3)
1783#define RT5670_CAL_P_SFT 0
1784#define RT5670_CAL_P_NONE (0x0)
1785#define RT5670_CAL_P_CAL (0x1)
1786#define RT5670_CAL_P_DAC_CAL (0x2)
1787
1788/* Soft volume and zero cross control 1 (0xd9) */
1789#define RT5670_SV_MASK (0x1 << 15)
1790#define RT5670_SV_SFT 15
1791#define RT5670_SV_DIS (0x0 << 15)
1792#define RT5670_SV_EN (0x1 << 15)
1793#define RT5670_SPO_SV_MASK (0x1 << 14)
1794#define RT5670_SPO_SV_SFT 14
1795#define RT5670_SPO_SV_DIS (0x0 << 14)
1796#define RT5670_SPO_SV_EN (0x1 << 14)
1797#define RT5670_OUT_SV_MASK (0x1 << 13)
1798#define RT5670_OUT_SV_SFT 13
1799#define RT5670_OUT_SV_DIS (0x0 << 13)
1800#define RT5670_OUT_SV_EN (0x1 << 13)
1801#define RT5670_HP_SV_MASK (0x1 << 12)
1802#define RT5670_HP_SV_SFT 12
1803#define RT5670_HP_SV_DIS (0x0 << 12)
1804#define RT5670_HP_SV_EN (0x1 << 12)
1805#define RT5670_ZCD_DIG_MASK (0x1 << 11)
1806#define RT5670_ZCD_DIG_SFT 11
1807#define RT5670_ZCD_DIG_DIS (0x0 << 11)
1808#define RT5670_ZCD_DIG_EN (0x1 << 11)
1809#define RT5670_ZCD_MASK (0x1 << 10)
1810#define RT5670_ZCD_SFT 10
1811#define RT5670_ZCD_PD (0x0 << 10)
1812#define RT5670_ZCD_PU (0x1 << 10)
1813#define RT5670_M_ZCD_MASK (0x3f << 4)
1814#define RT5670_M_ZCD_SFT 4
1815#define RT5670_M_ZCD_RM_L (0x1 << 9)
1816#define RT5670_M_ZCD_RM_R (0x1 << 8)
1817#define RT5670_M_ZCD_SM_L (0x1 << 7)
1818#define RT5670_M_ZCD_SM_R (0x1 << 6)
1819#define RT5670_M_ZCD_OM_L (0x1 << 5)
1820#define RT5670_M_ZCD_OM_R (0x1 << 4)
1821#define RT5670_SV_DLY_MASK (0xf)
1822#define RT5670_SV_DLY_SFT 0
1823
1824/* Soft volume and zero cross control 2 (0xda) */
1825#define RT5670_ZCD_HP_MASK (0x1 << 15)
1826#define RT5670_ZCD_HP_SFT 15
1827#define RT5670_ZCD_HP_DIS (0x0 << 15)
1828#define RT5670_ZCD_HP_EN (0x1 << 15)
1829
1830
1831/* Codec Private Register definition */
1832/* 3D Speaker Control (0x63) */
1833#define RT5670_3D_SPK_MASK (0x1 << 15)
1834#define RT5670_3D_SPK_SFT 15
1835#define RT5670_3D_SPK_DIS (0x0 << 15)
1836#define RT5670_3D_SPK_EN (0x1 << 15)
1837#define RT5670_3D_SPK_M_MASK (0x3 << 13)
1838#define RT5670_3D_SPK_M_SFT 13
1839#define RT5670_3D_SPK_CG_MASK (0x1f << 8)
1840#define RT5670_3D_SPK_CG_SFT 8
1841#define RT5670_3D_SPK_SG_MASK (0x1f)
1842#define RT5670_3D_SPK_SG_SFT 0
1843
1844/* Wind Noise Detection Control 1 (0x6c) */
1845#define RT5670_WND_MASK (0x1 << 15)
1846#define RT5670_WND_SFT 15
1847#define RT5670_WND_DIS (0x0 << 15)
1848#define RT5670_WND_EN (0x1 << 15)
1849
1850/* Wind Noise Detection Control 2 (0x6d) */
1851#define RT5670_WND_FC_NW_MASK (0x3f << 10)
1852#define RT5670_WND_FC_NW_SFT 10
1853#define RT5670_WND_FC_WK_MASK (0x3f << 4)
1854#define RT5670_WND_FC_WK_SFT 4
1855
1856/* Wind Noise Detection Control 3 (0x6e) */
1857#define RT5670_HPF_FC_MASK (0x3f << 6)
1858#define RT5670_HPF_FC_SFT 6
1859#define RT5670_WND_FC_ST_MASK (0x3f)
1860#define RT5670_WND_FC_ST_SFT 0
1861
1862/* Wind Noise Detection Control 4 (0x6f) */
1863#define RT5670_WND_TH_LO_MASK (0x3ff)
1864#define RT5670_WND_TH_LO_SFT 0
1865
1866/* Wind Noise Detection Control 5 (0x70) */
1867#define RT5670_WND_TH_HI_MASK (0x3ff)
1868#define RT5670_WND_TH_HI_SFT 0
1869
1870/* Wind Noise Detection Control 8 (0x73) */
1871#define RT5670_WND_WIND_MASK (0x1 << 13) /* Read-Only */
1872#define RT5670_WND_WIND_SFT 13
1873#define RT5670_WND_STRONG_MASK (0x1 << 12) /* Read-Only */
1874#define RT5670_WND_STRONG_SFT 12
1875enum {
1876 RT5670_NO_WIND,
1877 RT5670_BREEZE,
1878 RT5670_STORM,
1879};
1880
1881/* Dipole Speaker Interface (0x75) */
1882#define RT5670_DP_ATT_MASK (0x3 << 14)
1883#define RT5670_DP_ATT_SFT 14
1884#define RT5670_DP_SPK_MASK (0x1 << 10)
1885#define RT5670_DP_SPK_SFT 10
1886#define RT5670_DP_SPK_DIS (0x0 << 10)
1887#define RT5670_DP_SPK_EN (0x1 << 10)
1888
1889/* EQ Pre Volume Control (0xb3) */
1890#define RT5670_EQ_PRE_VOL_MASK (0xffff)
1891#define RT5670_EQ_PRE_VOL_SFT 0
1892
1893/* EQ Post Volume Control (0xb4) */
1894#define RT5670_EQ_PST_VOL_MASK (0xffff)
1895#define RT5670_EQ_PST_VOL_SFT 0
1896
1897/* Jack Detect Control 3 (0xf8) */
1898#define RT5670_CMP_MIC_IN_DET_MASK (0x7 << 12)
1899#define RT5670_JD_CBJ_EN (0x1 << 7)
1900#define RT5670_JD_CBJ_POL (0x1 << 6)
1901#define RT5670_JD_TRI_CBJ_SEL_MASK (0x7 << 3)
1902#define RT5670_JD_TRI_CBJ_SEL_SFT (3)
1903#define RT5670_JD_CBJ_GPIO_JD1 (0x0 << 3)
1904#define RT5670_JD_CBJ_JD1_1 (0x1 << 3)
1905#define RT5670_JD_CBJ_JD1_2 (0x2 << 3)
1906#define RT5670_JD_CBJ_JD2 (0x3 << 3)
1907#define RT5670_JD_CBJ_JD3 (0x4 << 3)
1908#define RT5670_JD_CBJ_GPIO_JD2 (0x5 << 3)
1909#define RT5670_JD_CBJ_MX0B_12 (0x6 << 3)
1910#define RT5670_JD_TRI_HPO_SEL_MASK (0x7 << 3)
1911#define RT5670_JD_TRI_HPO_SEL_SFT (0)
1912#define RT5670_JD_HPO_GPIO_JD1 (0x0)
1913#define RT5670_JD_HPO_JD1_1 (0x1)
1914#define RT5670_JD_HPO_JD1_2 (0x2)
1915#define RT5670_JD_HPO_JD2 (0x3)
1916#define RT5670_JD_HPO_JD3 (0x4)
1917#define RT5670_JD_HPO_GPIO_JD2 (0x5)
1918#define RT5670_JD_HPO_MX0B_12 (0x6)
1919
1920/* Digital Misc Control (0xfa) */
1921#define RT5670_RST_DSP (0x1 << 13)
1922#define RT5670_IF1_ADC1_IN1_SEL (0x1 << 12)
1923#define RT5670_IF1_ADC1_IN1_SFT 12
1924#define RT5670_IF1_ADC1_IN2_SEL (0x1 << 11)
1925#define RT5670_IF1_ADC1_IN2_SFT 11
1926#define RT5670_IF1_ADC2_IN1_SEL (0x1 << 10)
1927#define RT5670_IF1_ADC2_IN1_SFT 10
1928
1929/* General Control2 (0xfb) */
1930#define RT5670_RXDC_SRC_MASK (0x1 << 7)
1931#define RT5670_RXDC_SRC_STO (0x0 << 7)
1932#define RT5670_RXDC_SRC_MONO (0x1 << 7)
1933#define RT5670_RXDC_SRC_SFT (7)
1934#define RT5670_RXDP2_SEL_MASK (0x1 << 3)
1935#define RT5670_RXDP2_SEL_IF2 (0x0 << 3)
1936#define RT5670_RXDP2_SEL_ADC (0x1 << 3)
1937#define RT5670_RXDP2_SEL_SFT (3)
1938
1939/* System Clock Source */
1940enum {
1941 RT5670_SCLK_S_MCLK,
1942 RT5670_SCLK_S_PLL1,
1943 RT5670_SCLK_S_RCCLK,
1944};
1945
1946/* PLL1 Source */
1947enum {
1948 RT5670_PLL1_S_MCLK,
1949 RT5670_PLL1_S_BCLK1,
1950 RT5670_PLL1_S_BCLK2,
1951 RT5670_PLL1_S_BCLK3,
1952 RT5670_PLL1_S_BCLK4,
1953};
1954
1955enum {
1956 RT5670_AIF1,
1957 RT5670_AIF2,
1958 RT5670_AIF3,
1959 RT5670_AIF4,
1960 RT5670_AIFS,
1961};
1962
1963enum {
1964 RT5670_DMIC_DATA_GPIO6,
1965 RT5670_DMIC_DATA_IN2P,
1966 RT5670_DMIC_DATA_GPIO7,
1967};
1968
1969enum {
1970 RT5670_DMIC_DATA_GPIO8,
1971 RT5670_DMIC_DATA_IN3N,
1972};
1973
1974enum {
1975 RT5670_DMIC_DATA_GPIO9,
1976 RT5670_DMIC_DATA_GPIO10,
1977 RT5670_DMIC_DATA_GPIO5,
1978};
1979
1980struct rt5670_priv {
1981 struct snd_soc_codec *codec;
1982 struct rt5670_platform_data pdata;
1983 struct regmap *regmap;
1984
1985 int sysclk;
1986 int sysclk_src;
1987 int lrck[RT5670_AIFS];
1988 int bclk[RT5670_AIFS];
1989 int master[RT5670_AIFS];
1990
1991 int pll_src;
1992 int pll_in;
1993 int pll_out;
1994
1995 int dsp_sw; /* expected parameter setting */
1996 int dsp_rate;
1997 int jack_type;
1998};
1999
2000#endif /* __RT5670_H__ */
diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c
index 833231e27340..67f14556462f 100644
--- a/sound/soc/codecs/rt5677.c
+++ b/sound/soc/codecs/rt5677.c
@@ -27,6 +27,7 @@
27#include <sound/initval.h> 27#include <sound/initval.h>
28#include <sound/tlv.h> 28#include <sound/tlv.h>
29 29
30#include "rl6231.h"
30#include "rt5677.h" 31#include "rt5677.h"
31 32
32#define RT5677_DEVICE_ID 0x6327 33#define RT5677_DEVICE_ID 0x6327
@@ -604,19 +605,19 @@ static const struct snd_kcontrol_new rt5677_snd_controls[] = {
604 adc_vol_tlv), 605 adc_vol_tlv),
605 606
606 /* ADC Boost Volume Control */ 607 /* ADC Boost Volume Control */
607 SOC_DOUBLE_TLV("STO1 ADC Boost Gain", RT5677_STO1_2_ADC_BST, 608 SOC_DOUBLE_TLV("STO1 ADC Boost Volume", RT5677_STO1_2_ADC_BST,
608 RT5677_STO1_ADC_L_BST_SFT, RT5677_STO1_ADC_R_BST_SFT, 3, 0, 609 RT5677_STO1_ADC_L_BST_SFT, RT5677_STO1_ADC_R_BST_SFT, 3, 0,
609 adc_bst_tlv), 610 adc_bst_tlv),
610 SOC_DOUBLE_TLV("STO2 ADC Boost Gain", RT5677_STO1_2_ADC_BST, 611 SOC_DOUBLE_TLV("STO2 ADC Boost Volume", RT5677_STO1_2_ADC_BST,
611 RT5677_STO2_ADC_L_BST_SFT, RT5677_STO2_ADC_R_BST_SFT, 3, 0, 612 RT5677_STO2_ADC_L_BST_SFT, RT5677_STO2_ADC_R_BST_SFT, 3, 0,
612 adc_bst_tlv), 613 adc_bst_tlv),
613 SOC_DOUBLE_TLV("STO3 ADC Boost Gain", RT5677_STO3_4_ADC_BST, 614 SOC_DOUBLE_TLV("STO3 ADC Boost Volume", RT5677_STO3_4_ADC_BST,
614 RT5677_STO3_ADC_L_BST_SFT, RT5677_STO3_ADC_R_BST_SFT, 3, 0, 615 RT5677_STO3_ADC_L_BST_SFT, RT5677_STO3_ADC_R_BST_SFT, 3, 0,
615 adc_bst_tlv), 616 adc_bst_tlv),
616 SOC_DOUBLE_TLV("STO4 ADC Boost Gain", RT5677_STO3_4_ADC_BST, 617 SOC_DOUBLE_TLV("STO4 ADC Boost Volume", RT5677_STO3_4_ADC_BST,
617 RT5677_STO4_ADC_L_BST_SFT, RT5677_STO4_ADC_R_BST_SFT, 3, 0, 618 RT5677_STO4_ADC_L_BST_SFT, RT5677_STO4_ADC_R_BST_SFT, 3, 0,
618 adc_bst_tlv), 619 adc_bst_tlv),
619 SOC_DOUBLE_TLV("Mono ADC Boost Gain", RT5677_ADC_BST_CTRL2, 620 SOC_DOUBLE_TLV("Mono ADC Boost Volume", RT5677_ADC_BST_CTRL2,
620 RT5677_MONO_ADC_L_BST_SFT, RT5677_MONO_ADC_R_BST_SFT, 3, 0, 621 RT5677_MONO_ADC_L_BST_SFT, RT5677_MONO_ADC_R_BST_SFT, 3, 0,
621 adc_bst_tlv), 622 adc_bst_tlv),
622}; 623};
@@ -636,21 +637,7 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w,
636{ 637{
637 struct snd_soc_codec *codec = w->codec; 638 struct snd_soc_codec *codec = w->codec;
638 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); 639 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
639 int div[] = {2, 3, 4, 6, 8, 12}, idx = -EINVAL, i; 640 int idx = rl6231_calc_dmic_clk(rt5677->sysclk);
640 int rate, red, bound, temp;
641
642 rate = rt5677->sysclk;
643 red = 3000000 * 12;
644 for (i = 0; i < ARRAY_SIZE(div); i++) {
645 bound = div[i] * 3000000;
646 if (rate > bound)
647 continue;
648 temp = bound - rate;
649 if (temp < red) {
650 red = temp;
651 idx = i;
652 }
653 }
654 641
655 if (idx < 0) 642 if (idx < 0)
656 dev_err(codec->dev, "Failed to set DMIC clock\n"); 643 dev_err(codec->dev, "Failed to set DMIC clock\n");
@@ -951,7 +938,7 @@ static const struct snd_kcontrol_new rt5677_ob_7_mix[] = {
951 938
952 939
953/* Mux */ 940/* Mux */
954/* DAC1 L/R source */ /* MX-29 [10:8] */ 941/* DAC1 L/R Source */ /* MX-29 [10:8] */
955static const char * const rt5677_dac1_src[] = { 942static const char * const rt5677_dac1_src[] = {
956 "IF1 DAC 01", "IF2 DAC 01", "IF3 DAC LR", "IF4 DAC LR", "SLB DAC 01", 943 "IF1 DAC 01", "IF2 DAC 01", "IF3 DAC LR", "IF4 DAC LR", "SLB DAC 01",
957 "OB 01" 944 "OB 01"
@@ -962,9 +949,9 @@ static SOC_ENUM_SINGLE_DECL(
962 RT5677_DAC1_L_SEL_SFT, rt5677_dac1_src); 949 RT5677_DAC1_L_SEL_SFT, rt5677_dac1_src);
963 950
964static const struct snd_kcontrol_new rt5677_dac1_mux = 951static const struct snd_kcontrol_new rt5677_dac1_mux =
965 SOC_DAPM_ENUM("DAC1 source", rt5677_dac1_enum); 952 SOC_DAPM_ENUM("DAC1 Source", rt5677_dac1_enum);
966 953
967/* ADDA1 L/R source */ /* MX-29 [1:0] */ 954/* ADDA1 L/R Source */ /* MX-29 [1:0] */
968static const char * const rt5677_adda1_src[] = { 955static const char * const rt5677_adda1_src[] = {
969 "STO1 ADC MIX", "STO2 ADC MIX", "OB 67", 956 "STO1 ADC MIX", "STO2 ADC MIX", "OB 67",
970}; 957};
@@ -974,10 +961,10 @@ static SOC_ENUM_SINGLE_DECL(
974 RT5677_ADDA1_SEL_SFT, rt5677_adda1_src); 961 RT5677_ADDA1_SEL_SFT, rt5677_adda1_src);
975 962
976static const struct snd_kcontrol_new rt5677_adda1_mux = 963static const struct snd_kcontrol_new rt5677_adda1_mux =
977 SOC_DAPM_ENUM("ADDA1 source", rt5677_adda1_enum); 964 SOC_DAPM_ENUM("ADDA1 Source", rt5677_adda1_enum);
978 965
979 966
980/*DAC2 L/R source*/ /* MX-1B [6:4] [2:0] */ 967/*DAC2 L/R Source*/ /* MX-1B [6:4] [2:0] */
981static const char * const rt5677_dac2l_src[] = { 968static const char * const rt5677_dac2l_src[] = {
982 "IF1 DAC 2", "IF2 DAC 2", "IF3 DAC L", "IF4 DAC L", "SLB DAC 2", 969 "IF1 DAC 2", "IF2 DAC 2", "IF3 DAC L", "IF4 DAC L", "SLB DAC 2",
983 "OB 2", 970 "OB 2",
@@ -988,7 +975,7 @@ static SOC_ENUM_SINGLE_DECL(
988 RT5677_SEL_DAC2_L_SRC_SFT, rt5677_dac2l_src); 975 RT5677_SEL_DAC2_L_SRC_SFT, rt5677_dac2l_src);
989 976
990static const struct snd_kcontrol_new rt5677_dac2_l_mux = 977static const struct snd_kcontrol_new rt5677_dac2_l_mux =
991 SOC_DAPM_ENUM("DAC2 L source", rt5677_dac2l_enum); 978 SOC_DAPM_ENUM("DAC2 L Source", rt5677_dac2l_enum);
992 979
993static const char * const rt5677_dac2r_src[] = { 980static const char * const rt5677_dac2r_src[] = {
994 "IF1 DAC 3", "IF2 DAC 3", "IF3 DAC R", "IF4 DAC R", "SLB DAC 3", 981 "IF1 DAC 3", "IF2 DAC 3", "IF3 DAC R", "IF4 DAC R", "SLB DAC 3",
@@ -1000,9 +987,9 @@ static SOC_ENUM_SINGLE_DECL(
1000 RT5677_SEL_DAC2_R_SRC_SFT, rt5677_dac2r_src); 987 RT5677_SEL_DAC2_R_SRC_SFT, rt5677_dac2r_src);
1001 988
1002static const struct snd_kcontrol_new rt5677_dac2_r_mux = 989static const struct snd_kcontrol_new rt5677_dac2_r_mux =
1003 SOC_DAPM_ENUM("DAC2 R source", rt5677_dac2r_enum); 990 SOC_DAPM_ENUM("DAC2 R Source", rt5677_dac2r_enum);
1004 991
1005/*DAC3 L/R source*/ /* MX-16 [6:4] [2:0] */ 992/*DAC3 L/R Source*/ /* MX-16 [6:4] [2:0] */
1006static const char * const rt5677_dac3l_src[] = { 993static const char * const rt5677_dac3l_src[] = {
1007 "IF1 DAC 4", "IF2 DAC 4", "IF3 DAC L", "IF4 DAC L", 994 "IF1 DAC 4", "IF2 DAC 4", "IF3 DAC L", "IF4 DAC L",
1008 "SLB DAC 4", "OB 4" 995 "SLB DAC 4", "OB 4"
@@ -1013,7 +1000,7 @@ static SOC_ENUM_SINGLE_DECL(
1013 RT5677_SEL_DAC3_L_SRC_SFT, rt5677_dac3l_src); 1000 RT5677_SEL_DAC3_L_SRC_SFT, rt5677_dac3l_src);
1014 1001
1015static const struct snd_kcontrol_new rt5677_dac3_l_mux = 1002static const struct snd_kcontrol_new rt5677_dac3_l_mux =
1016 SOC_DAPM_ENUM("DAC3 L source", rt5677_dac3l_enum); 1003 SOC_DAPM_ENUM("DAC3 L Source", rt5677_dac3l_enum);
1017 1004
1018static const char * const rt5677_dac3r_src[] = { 1005static const char * const rt5677_dac3r_src[] = {
1019 "IF1 DAC 5", "IF2 DAC 5", "IF3 DAC R", "IF4 DAC R", 1006 "IF1 DAC 5", "IF2 DAC 5", "IF3 DAC R", "IF4 DAC R",
@@ -1025,9 +1012,9 @@ static SOC_ENUM_SINGLE_DECL(
1025 RT5677_SEL_DAC3_R_SRC_SFT, rt5677_dac3r_src); 1012 RT5677_SEL_DAC3_R_SRC_SFT, rt5677_dac3r_src);
1026 1013
1027static const struct snd_kcontrol_new rt5677_dac3_r_mux = 1014static const struct snd_kcontrol_new rt5677_dac3_r_mux =
1028 SOC_DAPM_ENUM("DAC3 R source", rt5677_dac3r_enum); 1015 SOC_DAPM_ENUM("DAC3 R Source", rt5677_dac3r_enum);
1029 1016
1030/*DAC4 L/R source*/ /* MX-16 [14:12] [10:8] */ 1017/*DAC4 L/R Source*/ /* MX-16 [14:12] [10:8] */
1031static const char * const rt5677_dac4l_src[] = { 1018static const char * const rt5677_dac4l_src[] = {
1032 "IF1 DAC 6", "IF2 DAC 6", "IF3 DAC L", "IF4 DAC L", 1019 "IF1 DAC 6", "IF2 DAC 6", "IF3 DAC L", "IF4 DAC L",
1033 "SLB DAC 6", "OB 6" 1020 "SLB DAC 6", "OB 6"
@@ -1038,7 +1025,7 @@ static SOC_ENUM_SINGLE_DECL(
1038 RT5677_SEL_DAC4_L_SRC_SFT, rt5677_dac4l_src); 1025 RT5677_SEL_DAC4_L_SRC_SFT, rt5677_dac4l_src);
1039 1026
1040static const struct snd_kcontrol_new rt5677_dac4_l_mux = 1027static const struct snd_kcontrol_new rt5677_dac4_l_mux =
1041 SOC_DAPM_ENUM("DAC4 L source", rt5677_dac4l_enum); 1028 SOC_DAPM_ENUM("DAC4 L Source", rt5677_dac4l_enum);
1042 1029
1043static const char * const rt5677_dac4r_src[] = { 1030static const char * const rt5677_dac4r_src[] = {
1044 "IF1 DAC 7", "IF2 DAC 7", "IF3 DAC R", "IF4 DAC R", 1031 "IF1 DAC 7", "IF2 DAC 7", "IF3 DAC R", "IF4 DAC R",
@@ -1050,7 +1037,7 @@ static SOC_ENUM_SINGLE_DECL(
1050 RT5677_SEL_DAC4_R_SRC_SFT, rt5677_dac4r_src); 1037 RT5677_SEL_DAC4_R_SRC_SFT, rt5677_dac4r_src);
1051 1038
1052static const struct snd_kcontrol_new rt5677_dac4_r_mux = 1039static const struct snd_kcontrol_new rt5677_dac4_r_mux =
1053 SOC_DAPM_ENUM("DAC4 R source", rt5677_dac4r_enum); 1040 SOC_DAPM_ENUM("DAC4 R Source", rt5677_dac4r_enum);
1054 1041
1055/* In/OutBound Source Pass SRC */ /* MX-A5 [3] [4] [0] [1] [2] */ 1042/* In/OutBound Source Pass SRC */ /* MX-A5 [3] [4] [0] [1] [2] */
1056static const char * const rt5677_iob_bypass_src[] = { 1043static const char * const rt5677_iob_bypass_src[] = {
@@ -1062,35 +1049,35 @@ static SOC_ENUM_SINGLE_DECL(
1062 RT5677_SEL_SRC_OB01_SFT, rt5677_iob_bypass_src); 1049 RT5677_SEL_SRC_OB01_SFT, rt5677_iob_bypass_src);
1063 1050
1064static const struct snd_kcontrol_new rt5677_ob01_bypass_src_mux = 1051static const struct snd_kcontrol_new rt5677_ob01_bypass_src_mux =
1065 SOC_DAPM_ENUM("OB01 Bypass source", rt5677_ob01_bypass_src_enum); 1052 SOC_DAPM_ENUM("OB01 Bypass Source", rt5677_ob01_bypass_src_enum);
1066 1053
1067static SOC_ENUM_SINGLE_DECL( 1054static SOC_ENUM_SINGLE_DECL(
1068 rt5677_ob23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL, 1055 rt5677_ob23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
1069 RT5677_SEL_SRC_OB23_SFT, rt5677_iob_bypass_src); 1056 RT5677_SEL_SRC_OB23_SFT, rt5677_iob_bypass_src);
1070 1057
1071static const struct snd_kcontrol_new rt5677_ob23_bypass_src_mux = 1058static const struct snd_kcontrol_new rt5677_ob23_bypass_src_mux =
1072 SOC_DAPM_ENUM("OB23 Bypass source", rt5677_ob23_bypass_src_enum); 1059 SOC_DAPM_ENUM("OB23 Bypass Source", rt5677_ob23_bypass_src_enum);
1073 1060
1074static SOC_ENUM_SINGLE_DECL( 1061static SOC_ENUM_SINGLE_DECL(
1075 rt5677_ib01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL, 1062 rt5677_ib01_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
1076 RT5677_SEL_SRC_IB01_SFT, rt5677_iob_bypass_src); 1063 RT5677_SEL_SRC_IB01_SFT, rt5677_iob_bypass_src);
1077 1064
1078static const struct snd_kcontrol_new rt5677_ib01_bypass_src_mux = 1065static const struct snd_kcontrol_new rt5677_ib01_bypass_src_mux =
1079 SOC_DAPM_ENUM("IB01 Bypass source", rt5677_ib01_bypass_src_enum); 1066 SOC_DAPM_ENUM("IB01 Bypass Source", rt5677_ib01_bypass_src_enum);
1080 1067
1081static SOC_ENUM_SINGLE_DECL( 1068static SOC_ENUM_SINGLE_DECL(
1082 rt5677_ib23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL, 1069 rt5677_ib23_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
1083 RT5677_SEL_SRC_IB23_SFT, rt5677_iob_bypass_src); 1070 RT5677_SEL_SRC_IB23_SFT, rt5677_iob_bypass_src);
1084 1071
1085static const struct snd_kcontrol_new rt5677_ib23_bypass_src_mux = 1072static const struct snd_kcontrol_new rt5677_ib23_bypass_src_mux =
1086 SOC_DAPM_ENUM("IB23 Bypass source", rt5677_ib23_bypass_src_enum); 1073 SOC_DAPM_ENUM("IB23 Bypass Source", rt5677_ib23_bypass_src_enum);
1087 1074
1088static SOC_ENUM_SINGLE_DECL( 1075static SOC_ENUM_SINGLE_DECL(
1089 rt5677_ib45_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL, 1076 rt5677_ib45_bypass_src_enum, RT5677_DSP_IN_OUTB_CTRL,
1090 RT5677_SEL_SRC_IB45_SFT, rt5677_iob_bypass_src); 1077 RT5677_SEL_SRC_IB45_SFT, rt5677_iob_bypass_src);
1091 1078
1092static const struct snd_kcontrol_new rt5677_ib45_bypass_src_mux = 1079static const struct snd_kcontrol_new rt5677_ib45_bypass_src_mux =
1093 SOC_DAPM_ENUM("IB45 Bypass source", rt5677_ib45_bypass_src_enum); 1080 SOC_DAPM_ENUM("IB45 Bypass Source", rt5677_ib45_bypass_src_enum);
1094 1081
1095/* Stereo ADC Source 2 */ /* MX-27 MX26 MX25 [11:10] */ 1082/* Stereo ADC Source 2 */ /* MX-27 MX26 MX25 [11:10] */
1096static const char * const rt5677_stereo_adc2_src[] = { 1083static const char * const rt5677_stereo_adc2_src[] = {
@@ -1102,21 +1089,21 @@ static SOC_ENUM_SINGLE_DECL(
1102 RT5677_SEL_STO1_ADC2_SFT, rt5677_stereo_adc2_src); 1089 RT5677_SEL_STO1_ADC2_SFT, rt5677_stereo_adc2_src);
1103 1090
1104static const struct snd_kcontrol_new rt5677_sto1_adc2_mux = 1091static const struct snd_kcontrol_new rt5677_sto1_adc2_mux =
1105 SOC_DAPM_ENUM("Stereo1 ADC2 source", rt5677_stereo1_adc2_enum); 1092 SOC_DAPM_ENUM("Stereo1 ADC2 Source", rt5677_stereo1_adc2_enum);
1106 1093
1107static SOC_ENUM_SINGLE_DECL( 1094static SOC_ENUM_SINGLE_DECL(
1108 rt5677_stereo2_adc2_enum, RT5677_STO2_ADC_MIXER, 1095 rt5677_stereo2_adc2_enum, RT5677_STO2_ADC_MIXER,
1109 RT5677_SEL_STO2_ADC2_SFT, rt5677_stereo_adc2_src); 1096 RT5677_SEL_STO2_ADC2_SFT, rt5677_stereo_adc2_src);
1110 1097
1111static const struct snd_kcontrol_new rt5677_sto2_adc2_mux = 1098static const struct snd_kcontrol_new rt5677_sto2_adc2_mux =
1112 SOC_DAPM_ENUM("Stereo2 ADC2 source", rt5677_stereo2_adc2_enum); 1099 SOC_DAPM_ENUM("Stereo2 ADC2 Source", rt5677_stereo2_adc2_enum);
1113 1100
1114static SOC_ENUM_SINGLE_DECL( 1101static SOC_ENUM_SINGLE_DECL(
1115 rt5677_stereo3_adc2_enum, RT5677_STO3_ADC_MIXER, 1102 rt5677_stereo3_adc2_enum, RT5677_STO3_ADC_MIXER,
1116 RT5677_SEL_STO3_ADC2_SFT, rt5677_stereo_adc2_src); 1103 RT5677_SEL_STO3_ADC2_SFT, rt5677_stereo_adc2_src);
1117 1104
1118static const struct snd_kcontrol_new rt5677_sto3_adc2_mux = 1105static const struct snd_kcontrol_new rt5677_sto3_adc2_mux =
1119 SOC_DAPM_ENUM("Stereo3 ADC2 source", rt5677_stereo3_adc2_enum); 1106 SOC_DAPM_ENUM("Stereo3 ADC2 Source", rt5677_stereo3_adc2_enum);
1120 1107
1121/* DMIC Source */ /* MX-28 [9:8][1:0] MX-27 MX-26 MX-25 MX-24 [9:8] */ 1108/* DMIC Source */ /* MX-28 [9:8][1:0] MX-27 MX-26 MX-25 MX-24 [9:8] */
1122static const char * const rt5677_dmic_src[] = { 1109static const char * const rt5677_dmic_src[] = {
@@ -1128,44 +1115,44 @@ static SOC_ENUM_SINGLE_DECL(
1128 RT5677_SEL_MONO_DMIC_L_SFT, rt5677_dmic_src); 1115 RT5677_SEL_MONO_DMIC_L_SFT, rt5677_dmic_src);
1129 1116
1130static const struct snd_kcontrol_new rt5677_mono_dmic_l_mux = 1117static const struct snd_kcontrol_new rt5677_mono_dmic_l_mux =
1131 SOC_DAPM_ENUM("Mono DMIC L source", rt5677_mono_dmic_l_enum); 1118 SOC_DAPM_ENUM("Mono DMIC L Source", rt5677_mono_dmic_l_enum);
1132 1119
1133static SOC_ENUM_SINGLE_DECL( 1120static SOC_ENUM_SINGLE_DECL(
1134 rt5677_mono_dmic_r_enum, RT5677_MONO_ADC_MIXER, 1121 rt5677_mono_dmic_r_enum, RT5677_MONO_ADC_MIXER,
1135 RT5677_SEL_MONO_DMIC_R_SFT, rt5677_dmic_src); 1122 RT5677_SEL_MONO_DMIC_R_SFT, rt5677_dmic_src);
1136 1123
1137static const struct snd_kcontrol_new rt5677_mono_dmic_r_mux = 1124static const struct snd_kcontrol_new rt5677_mono_dmic_r_mux =
1138 SOC_DAPM_ENUM("Mono DMIC R source", rt5677_mono_dmic_r_enum); 1125 SOC_DAPM_ENUM("Mono DMIC R Source", rt5677_mono_dmic_r_enum);
1139 1126
1140static SOC_ENUM_SINGLE_DECL( 1127static SOC_ENUM_SINGLE_DECL(
1141 rt5677_stereo1_dmic_enum, RT5677_STO1_ADC_MIXER, 1128 rt5677_stereo1_dmic_enum, RT5677_STO1_ADC_MIXER,
1142 RT5677_SEL_STO1_DMIC_SFT, rt5677_dmic_src); 1129 RT5677_SEL_STO1_DMIC_SFT, rt5677_dmic_src);
1143 1130
1144static const struct snd_kcontrol_new rt5677_sto1_dmic_mux = 1131static const struct snd_kcontrol_new rt5677_sto1_dmic_mux =
1145 SOC_DAPM_ENUM("Stereo1 DMIC source", rt5677_stereo1_dmic_enum); 1132 SOC_DAPM_ENUM("Stereo1 DMIC Source", rt5677_stereo1_dmic_enum);
1146 1133
1147static SOC_ENUM_SINGLE_DECL( 1134static SOC_ENUM_SINGLE_DECL(
1148 rt5677_stereo2_dmic_enum, RT5677_STO2_ADC_MIXER, 1135 rt5677_stereo2_dmic_enum, RT5677_STO2_ADC_MIXER,
1149 RT5677_SEL_STO2_DMIC_SFT, rt5677_dmic_src); 1136 RT5677_SEL_STO2_DMIC_SFT, rt5677_dmic_src);
1150 1137
1151static const struct snd_kcontrol_new rt5677_sto2_dmic_mux = 1138static const struct snd_kcontrol_new rt5677_sto2_dmic_mux =
1152 SOC_DAPM_ENUM("Stereo2 DMIC source", rt5677_stereo2_dmic_enum); 1139 SOC_DAPM_ENUM("Stereo2 DMIC Source", rt5677_stereo2_dmic_enum);
1153 1140
1154static SOC_ENUM_SINGLE_DECL( 1141static SOC_ENUM_SINGLE_DECL(
1155 rt5677_stereo3_dmic_enum, RT5677_STO3_ADC_MIXER, 1142 rt5677_stereo3_dmic_enum, RT5677_STO3_ADC_MIXER,
1156 RT5677_SEL_STO3_DMIC_SFT, rt5677_dmic_src); 1143 RT5677_SEL_STO3_DMIC_SFT, rt5677_dmic_src);
1157 1144
1158static const struct snd_kcontrol_new rt5677_sto3_dmic_mux = 1145static const struct snd_kcontrol_new rt5677_sto3_dmic_mux =
1159 SOC_DAPM_ENUM("Stereo3 DMIC source", rt5677_stereo3_dmic_enum); 1146 SOC_DAPM_ENUM("Stereo3 DMIC Source", rt5677_stereo3_dmic_enum);
1160 1147
1161static SOC_ENUM_SINGLE_DECL( 1148static SOC_ENUM_SINGLE_DECL(
1162 rt5677_stereo4_dmic_enum, RT5677_STO4_ADC_MIXER, 1149 rt5677_stereo4_dmic_enum, RT5677_STO4_ADC_MIXER,
1163 RT5677_SEL_STO4_DMIC_SFT, rt5677_dmic_src); 1150 RT5677_SEL_STO4_DMIC_SFT, rt5677_dmic_src);
1164 1151
1165static const struct snd_kcontrol_new rt5677_sto4_dmic_mux = 1152static const struct snd_kcontrol_new rt5677_sto4_dmic_mux =
1166 SOC_DAPM_ENUM("Stereo4 DMIC source", rt5677_stereo4_dmic_enum); 1153 SOC_DAPM_ENUM("Stereo4 DMIC Source", rt5677_stereo4_dmic_enum);
1167 1154
1168/* Stereo2 ADC source */ /* MX-26 [0] */ 1155/* Stereo2 ADC Source */ /* MX-26 [0] */
1169static const char * const rt5677_stereo2_adc_lr_src[] = { 1156static const char * const rt5677_stereo2_adc_lr_src[] = {
1170 "L", "LR" 1157 "L", "LR"
1171}; 1158};
@@ -1175,7 +1162,7 @@ static SOC_ENUM_SINGLE_DECL(
1175 RT5677_SEL_STO2_LR_MIX_SFT, rt5677_stereo2_adc_lr_src); 1162 RT5677_SEL_STO2_LR_MIX_SFT, rt5677_stereo2_adc_lr_src);
1176 1163
1177static const struct snd_kcontrol_new rt5677_sto2_adc_lr_mux = 1164static const struct snd_kcontrol_new rt5677_sto2_adc_lr_mux =
1178 SOC_DAPM_ENUM("Stereo2 ADC LR source", rt5677_stereo2_adc_lr_enum); 1165 SOC_DAPM_ENUM("Stereo2 ADC LR Source", rt5677_stereo2_adc_lr_enum);
1179 1166
1180/* Stereo1 ADC Source 1 */ /* MX-27 MX26 MX25 [13:12] */ 1167/* Stereo1 ADC Source 1 */ /* MX-27 MX26 MX25 [13:12] */
1181static const char * const rt5677_stereo_adc1_src[] = { 1168static const char * const rt5677_stereo_adc1_src[] = {
@@ -1187,23 +1174,23 @@ static SOC_ENUM_SINGLE_DECL(
1187 RT5677_SEL_STO1_ADC1_SFT, rt5677_stereo_adc1_src); 1174 RT5677_SEL_STO1_ADC1_SFT, rt5677_stereo_adc1_src);
1188 1175
1189static const struct snd_kcontrol_new rt5677_sto1_adc1_mux = 1176static const struct snd_kcontrol_new rt5677_sto1_adc1_mux =
1190 SOC_DAPM_ENUM("Stereo1 ADC1 source", rt5677_stereo1_adc1_enum); 1177 SOC_DAPM_ENUM("Stereo1 ADC1 Source", rt5677_stereo1_adc1_enum);
1191 1178
1192static SOC_ENUM_SINGLE_DECL( 1179static SOC_ENUM_SINGLE_DECL(
1193 rt5677_stereo2_adc1_enum, RT5677_STO2_ADC_MIXER, 1180 rt5677_stereo2_adc1_enum, RT5677_STO2_ADC_MIXER,
1194 RT5677_SEL_STO2_ADC1_SFT, rt5677_stereo_adc1_src); 1181 RT5677_SEL_STO2_ADC1_SFT, rt5677_stereo_adc1_src);
1195 1182
1196static const struct snd_kcontrol_new rt5677_sto2_adc1_mux = 1183static const struct snd_kcontrol_new rt5677_sto2_adc1_mux =
1197 SOC_DAPM_ENUM("Stereo2 ADC1 source", rt5677_stereo2_adc1_enum); 1184 SOC_DAPM_ENUM("Stereo2 ADC1 Source", rt5677_stereo2_adc1_enum);
1198 1185
1199static SOC_ENUM_SINGLE_DECL( 1186static SOC_ENUM_SINGLE_DECL(
1200 rt5677_stereo3_adc1_enum, RT5677_STO3_ADC_MIXER, 1187 rt5677_stereo3_adc1_enum, RT5677_STO3_ADC_MIXER,
1201 RT5677_SEL_STO3_ADC1_SFT, rt5677_stereo_adc1_src); 1188 RT5677_SEL_STO3_ADC1_SFT, rt5677_stereo_adc1_src);
1202 1189
1203static const struct snd_kcontrol_new rt5677_sto3_adc1_mux = 1190static const struct snd_kcontrol_new rt5677_sto3_adc1_mux =
1204 SOC_DAPM_ENUM("Stereo3 ADC1 source", rt5677_stereo3_adc1_enum); 1191 SOC_DAPM_ENUM("Stereo3 ADC1 Source", rt5677_stereo3_adc1_enum);
1205 1192
1206/* Mono ADC Left source 2 */ /* MX-28 [11:10] */ 1193/* Mono ADC Left Source 2 */ /* MX-28 [11:10] */
1207static const char * const rt5677_mono_adc2_l_src[] = { 1194static const char * const rt5677_mono_adc2_l_src[] = {
1208 "DD MIX1L", "DMIC", "MONO DAC MIXL" 1195 "DD MIX1L", "DMIC", "MONO DAC MIXL"
1209}; 1196};
@@ -1213,9 +1200,9 @@ static SOC_ENUM_SINGLE_DECL(
1213 RT5677_SEL_MONO_ADC_L2_SFT, rt5677_mono_adc2_l_src); 1200 RT5677_SEL_MONO_ADC_L2_SFT, rt5677_mono_adc2_l_src);
1214 1201
1215static const struct snd_kcontrol_new rt5677_mono_adc2_l_mux = 1202static const struct snd_kcontrol_new rt5677_mono_adc2_l_mux =
1216 SOC_DAPM_ENUM("Mono ADC2 L source", rt5677_mono_adc2_l_enum); 1203 SOC_DAPM_ENUM("Mono ADC2 L Source", rt5677_mono_adc2_l_enum);
1217 1204
1218/* Mono ADC Left source 1 */ /* MX-28 [13:12] */ 1205/* Mono ADC Left Source 1 */ /* MX-28 [13:12] */
1219static const char * const rt5677_mono_adc1_l_src[] = { 1206static const char * const rt5677_mono_adc1_l_src[] = {
1220 "DD MIX1L", "ADC1", "MONO DAC MIXL" 1207 "DD MIX1L", "ADC1", "MONO DAC MIXL"
1221}; 1208};
@@ -1225,9 +1212,9 @@ static SOC_ENUM_SINGLE_DECL(
1225 RT5677_SEL_MONO_ADC_L1_SFT, rt5677_mono_adc1_l_src); 1212 RT5677_SEL_MONO_ADC_L1_SFT, rt5677_mono_adc1_l_src);
1226 1213
1227static const struct snd_kcontrol_new rt5677_mono_adc1_l_mux = 1214static const struct snd_kcontrol_new rt5677_mono_adc1_l_mux =
1228 SOC_DAPM_ENUM("Mono ADC1 L source", rt5677_mono_adc1_l_enum); 1215 SOC_DAPM_ENUM("Mono ADC1 L Source", rt5677_mono_adc1_l_enum);
1229 1216
1230/* Mono ADC Right source 2 */ /* MX-28 [3:2] */ 1217/* Mono ADC Right Source 2 */ /* MX-28 [3:2] */
1231static const char * const rt5677_mono_adc2_r_src[] = { 1218static const char * const rt5677_mono_adc2_r_src[] = {
1232 "DD MIX1R", "DMIC", "MONO DAC MIXR" 1219 "DD MIX1R", "DMIC", "MONO DAC MIXR"
1233}; 1220};
@@ -1237,9 +1224,9 @@ static SOC_ENUM_SINGLE_DECL(
1237 RT5677_SEL_MONO_ADC_R2_SFT, rt5677_mono_adc2_r_src); 1224 RT5677_SEL_MONO_ADC_R2_SFT, rt5677_mono_adc2_r_src);
1238 1225
1239static const struct snd_kcontrol_new rt5677_mono_adc2_r_mux = 1226static const struct snd_kcontrol_new rt5677_mono_adc2_r_mux =
1240 SOC_DAPM_ENUM("Mono ADC2 R source", rt5677_mono_adc2_r_enum); 1227 SOC_DAPM_ENUM("Mono ADC2 R Source", rt5677_mono_adc2_r_enum);
1241 1228
1242/* Mono ADC Right source 1 */ /* MX-28 [5:4] */ 1229/* Mono ADC Right Source 1 */ /* MX-28 [5:4] */
1243static const char * const rt5677_mono_adc1_r_src[] = { 1230static const char * const rt5677_mono_adc1_r_src[] = {
1244 "DD MIX1R", "ADC2", "MONO DAC MIXR" 1231 "DD MIX1R", "ADC2", "MONO DAC MIXR"
1245}; 1232};
@@ -1249,7 +1236,7 @@ static SOC_ENUM_SINGLE_DECL(
1249 RT5677_SEL_MONO_ADC_R1_SFT, rt5677_mono_adc1_r_src); 1236 RT5677_SEL_MONO_ADC_R1_SFT, rt5677_mono_adc1_r_src);
1250 1237
1251static const struct snd_kcontrol_new rt5677_mono_adc1_r_mux = 1238static const struct snd_kcontrol_new rt5677_mono_adc1_r_mux =
1252 SOC_DAPM_ENUM("Mono ADC1 R source", rt5677_mono_adc1_r_enum); 1239 SOC_DAPM_ENUM("Mono ADC1 R Source", rt5677_mono_adc1_r_enum);
1253 1240
1254/* Stereo4 ADC Source 2 */ /* MX-24 [11:10] */ 1241/* Stereo4 ADC Source 2 */ /* MX-24 [11:10] */
1255static const char * const rt5677_stereo4_adc2_src[] = { 1242static const char * const rt5677_stereo4_adc2_src[] = {
@@ -1261,7 +1248,7 @@ static SOC_ENUM_SINGLE_DECL(
1261 RT5677_SEL_STO4_ADC2_SFT, rt5677_stereo4_adc2_src); 1248 RT5677_SEL_STO4_ADC2_SFT, rt5677_stereo4_adc2_src);
1262 1249
1263static const struct snd_kcontrol_new rt5677_sto4_adc2_mux = 1250static const struct snd_kcontrol_new rt5677_sto4_adc2_mux =
1264 SOC_DAPM_ENUM("Stereo4 ADC2 source", rt5677_stereo4_adc2_enum); 1251 SOC_DAPM_ENUM("Stereo4 ADC2 Source", rt5677_stereo4_adc2_enum);
1265 1252
1266 1253
1267/* Stereo4 ADC Source 1 */ /* MX-24 [13:12] */ 1254/* Stereo4 ADC Source 1 */ /* MX-24 [13:12] */
@@ -1274,7 +1261,7 @@ static SOC_ENUM_SINGLE_DECL(
1274 RT5677_SEL_STO4_ADC1_SFT, rt5677_stereo4_adc1_src); 1261 RT5677_SEL_STO4_ADC1_SFT, rt5677_stereo4_adc1_src);
1275 1262
1276static const struct snd_kcontrol_new rt5677_sto4_adc1_mux = 1263static const struct snd_kcontrol_new rt5677_sto4_adc1_mux =
1277 SOC_DAPM_ENUM("Stereo4 ADC1 source", rt5677_stereo4_adc1_enum); 1264 SOC_DAPM_ENUM("Stereo4 ADC1 Source", rt5677_stereo4_adc1_enum);
1278 1265
1279/* InBound0/1 Source */ /* MX-A3 [14:12] */ 1266/* InBound0/1 Source */ /* MX-A3 [14:12] */
1280static const char * const rt5677_inbound01_src[] = { 1267static const char * const rt5677_inbound01_src[] = {
@@ -1416,7 +1403,7 @@ static SOC_ENUM_SINGLE_DECL(
1416static const struct snd_kcontrol_new rt5677_dac3_mux = 1403static const struct snd_kcontrol_new rt5677_dac3_mux =
1417 SOC_DAPM_ENUM("Analog DAC3 Source", rt5677_dac3_enum); 1404 SOC_DAPM_ENUM("Analog DAC3 Source", rt5677_dac3_enum);
1418 1405
1419/* PDM channel source */ /* MX-31 [13:12][9:8][5:4][1:0] */ 1406/* PDM channel Source */ /* MX-31 [13:12][9:8][5:4][1:0] */
1420static const char * const rt5677_pdm_src[] = { 1407static const char * const rt5677_pdm_src[] = {
1421 "STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2" 1408 "STO1 DAC MIX", "MONO DAC MIX", "DD MIX1", "DD MIX2"
1422}; 1409};
@@ -1426,28 +1413,28 @@ static SOC_ENUM_SINGLE_DECL(
1426 RT5677_SEL_PDM1_L_SFT, rt5677_pdm_src); 1413 RT5677_SEL_PDM1_L_SFT, rt5677_pdm_src);
1427 1414
1428static const struct snd_kcontrol_new rt5677_pdm1_l_mux = 1415static const struct snd_kcontrol_new rt5677_pdm1_l_mux =
1429 SOC_DAPM_ENUM("PDM1 source", rt5677_pdm1_l_enum); 1416 SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_l_enum);
1430 1417
1431static SOC_ENUM_SINGLE_DECL( 1418static SOC_ENUM_SINGLE_DECL(
1432 rt5677_pdm2_l_enum, RT5677_PDM_OUT_CTRL, 1419 rt5677_pdm2_l_enum, RT5677_PDM_OUT_CTRL,
1433 RT5677_SEL_PDM2_L_SFT, rt5677_pdm_src); 1420 RT5677_SEL_PDM2_L_SFT, rt5677_pdm_src);
1434 1421
1435static const struct snd_kcontrol_new rt5677_pdm2_l_mux = 1422static const struct snd_kcontrol_new rt5677_pdm2_l_mux =
1436 SOC_DAPM_ENUM("PDM2 source", rt5677_pdm2_l_enum); 1423 SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_l_enum);
1437 1424
1438static SOC_ENUM_SINGLE_DECL( 1425static SOC_ENUM_SINGLE_DECL(
1439 rt5677_pdm1_r_enum, RT5677_PDM_OUT_CTRL, 1426 rt5677_pdm1_r_enum, RT5677_PDM_OUT_CTRL,
1440 RT5677_SEL_PDM1_R_SFT, rt5677_pdm_src); 1427 RT5677_SEL_PDM1_R_SFT, rt5677_pdm_src);
1441 1428
1442static const struct snd_kcontrol_new rt5677_pdm1_r_mux = 1429static const struct snd_kcontrol_new rt5677_pdm1_r_mux =
1443 SOC_DAPM_ENUM("PDM1 source", rt5677_pdm1_r_enum); 1430 SOC_DAPM_ENUM("PDM1 Source", rt5677_pdm1_r_enum);
1444 1431
1445static SOC_ENUM_SINGLE_DECL( 1432static SOC_ENUM_SINGLE_DECL(
1446 rt5677_pdm2_r_enum, RT5677_PDM_OUT_CTRL, 1433 rt5677_pdm2_r_enum, RT5677_PDM_OUT_CTRL,
1447 RT5677_SEL_PDM2_R_SFT, rt5677_pdm_src); 1434 RT5677_SEL_PDM2_R_SFT, rt5677_pdm_src);
1448 1435
1449static const struct snd_kcontrol_new rt5677_pdm2_r_mux = 1436static const struct snd_kcontrol_new rt5677_pdm2_r_mux =
1450 SOC_DAPM_ENUM("PDM2 source", rt5677_pdm2_r_enum); 1437 SOC_DAPM_ENUM("PDM2 Source", rt5677_pdm2_r_enum);
1451 1438
1452/* TDM IF1/2 SLB ADC1 Data Selection */ /* MX-3C MX-41 [5:4] MX-08 [1:0]*/ 1439/* TDM IF1/2 SLB ADC1 Data Selection */ /* MX-3C MX-41 [5:4] MX-08 [1:0]*/
1453static const char * const rt5677_if12_adc1_src[] = { 1440static const char * const rt5677_if12_adc1_src[] = {
@@ -1459,21 +1446,21 @@ static SOC_ENUM_SINGLE_DECL(
1459 RT5677_IF1_ADC1_SFT, rt5677_if12_adc1_src); 1446 RT5677_IF1_ADC1_SFT, rt5677_if12_adc1_src);
1460 1447
1461static const struct snd_kcontrol_new rt5677_if1_adc1_mux = 1448static const struct snd_kcontrol_new rt5677_if1_adc1_mux =
1462 SOC_DAPM_ENUM("IF1 ADC1 source", rt5677_if1_adc1_enum); 1449 SOC_DAPM_ENUM("IF1 ADC1 Source", rt5677_if1_adc1_enum);
1463 1450
1464static SOC_ENUM_SINGLE_DECL( 1451static SOC_ENUM_SINGLE_DECL(
1465 rt5677_if2_adc1_enum, RT5677_TDM2_CTRL2, 1452 rt5677_if2_adc1_enum, RT5677_TDM2_CTRL2,
1466 RT5677_IF2_ADC1_SFT, rt5677_if12_adc1_src); 1453 RT5677_IF2_ADC1_SFT, rt5677_if12_adc1_src);
1467 1454
1468static const struct snd_kcontrol_new rt5677_if2_adc1_mux = 1455static const struct snd_kcontrol_new rt5677_if2_adc1_mux =
1469 SOC_DAPM_ENUM("IF2 ADC1 source", rt5677_if2_adc1_enum); 1456 SOC_DAPM_ENUM("IF2 ADC1 Source", rt5677_if2_adc1_enum);
1470 1457
1471static SOC_ENUM_SINGLE_DECL( 1458static SOC_ENUM_SINGLE_DECL(
1472 rt5677_slb_adc1_enum, RT5677_SLIMBUS_RX, 1459 rt5677_slb_adc1_enum, RT5677_SLIMBUS_RX,
1473 RT5677_SLB_ADC1_SFT, rt5677_if12_adc1_src); 1460 RT5677_SLB_ADC1_SFT, rt5677_if12_adc1_src);
1474 1461
1475static const struct snd_kcontrol_new rt5677_slb_adc1_mux = 1462static const struct snd_kcontrol_new rt5677_slb_adc1_mux =
1476 SOC_DAPM_ENUM("SLB ADC1 source", rt5677_slb_adc1_enum); 1463 SOC_DAPM_ENUM("SLB ADC1 Source", rt5677_slb_adc1_enum);
1477 1464
1478/* TDM IF1/2 SLB ADC2 Data Selection */ /* MX-3C MX-41 [7:6] MX-08 [3:2] */ 1465/* TDM IF1/2 SLB ADC2 Data Selection */ /* MX-3C MX-41 [7:6] MX-08 [3:2] */
1479static const char * const rt5677_if12_adc2_src[] = { 1466static const char * const rt5677_if12_adc2_src[] = {
@@ -1485,21 +1472,21 @@ static SOC_ENUM_SINGLE_DECL(
1485 RT5677_IF1_ADC2_SFT, rt5677_if12_adc2_src); 1472 RT5677_IF1_ADC2_SFT, rt5677_if12_adc2_src);
1486 1473
1487static const struct snd_kcontrol_new rt5677_if1_adc2_mux = 1474static const struct snd_kcontrol_new rt5677_if1_adc2_mux =
1488 SOC_DAPM_ENUM("IF1 ADC2 source", rt5677_if1_adc2_enum); 1475 SOC_DAPM_ENUM("IF1 ADC2 Source", rt5677_if1_adc2_enum);
1489 1476
1490static SOC_ENUM_SINGLE_DECL( 1477static SOC_ENUM_SINGLE_DECL(
1491 rt5677_if2_adc2_enum, RT5677_TDM2_CTRL2, 1478 rt5677_if2_adc2_enum, RT5677_TDM2_CTRL2,
1492 RT5677_IF2_ADC2_SFT, rt5677_if12_adc2_src); 1479 RT5677_IF2_ADC2_SFT, rt5677_if12_adc2_src);
1493 1480
1494static const struct snd_kcontrol_new rt5677_if2_adc2_mux = 1481static const struct snd_kcontrol_new rt5677_if2_adc2_mux =
1495 SOC_DAPM_ENUM("IF2 ADC2 source", rt5677_if2_adc2_enum); 1482 SOC_DAPM_ENUM("IF2 ADC2 Source", rt5677_if2_adc2_enum);
1496 1483
1497static SOC_ENUM_SINGLE_DECL( 1484static SOC_ENUM_SINGLE_DECL(
1498 rt5677_slb_adc2_enum, RT5677_SLIMBUS_RX, 1485 rt5677_slb_adc2_enum, RT5677_SLIMBUS_RX,
1499 RT5677_SLB_ADC2_SFT, rt5677_if12_adc2_src); 1486 RT5677_SLB_ADC2_SFT, rt5677_if12_adc2_src);
1500 1487
1501static const struct snd_kcontrol_new rt5677_slb_adc2_mux = 1488static const struct snd_kcontrol_new rt5677_slb_adc2_mux =
1502 SOC_DAPM_ENUM("SLB ADC2 source", rt5677_slb_adc2_enum); 1489 SOC_DAPM_ENUM("SLB ADC2 Source", rt5677_slb_adc2_enum);
1503 1490
1504/* TDM IF1/2 SLB ADC3 Data Selection */ /* MX-3C MX-41 [9:8] MX-08 [5:4] */ 1491/* TDM IF1/2 SLB ADC3 Data Selection */ /* MX-3C MX-41 [9:8] MX-08 [5:4] */
1505static const char * const rt5677_if12_adc3_src[] = { 1492static const char * const rt5677_if12_adc3_src[] = {
@@ -1511,21 +1498,21 @@ static SOC_ENUM_SINGLE_DECL(
1511 RT5677_IF1_ADC3_SFT, rt5677_if12_adc3_src); 1498 RT5677_IF1_ADC3_SFT, rt5677_if12_adc3_src);
1512 1499
1513static const struct snd_kcontrol_new rt5677_if1_adc3_mux = 1500static const struct snd_kcontrol_new rt5677_if1_adc3_mux =
1514 SOC_DAPM_ENUM("IF1 ADC3 source", rt5677_if1_adc3_enum); 1501 SOC_DAPM_ENUM("IF1 ADC3 Source", rt5677_if1_adc3_enum);
1515 1502
1516static SOC_ENUM_SINGLE_DECL( 1503static SOC_ENUM_SINGLE_DECL(
1517 rt5677_if2_adc3_enum, RT5677_TDM2_CTRL2, 1504 rt5677_if2_adc3_enum, RT5677_TDM2_CTRL2,
1518 RT5677_IF2_ADC3_SFT, rt5677_if12_adc3_src); 1505 RT5677_IF2_ADC3_SFT, rt5677_if12_adc3_src);
1519 1506
1520static const struct snd_kcontrol_new rt5677_if2_adc3_mux = 1507static const struct snd_kcontrol_new rt5677_if2_adc3_mux =
1521 SOC_DAPM_ENUM("IF2 ADC3 source", rt5677_if2_adc3_enum); 1508 SOC_DAPM_ENUM("IF2 ADC3 Source", rt5677_if2_adc3_enum);
1522 1509
1523static SOC_ENUM_SINGLE_DECL( 1510static SOC_ENUM_SINGLE_DECL(
1524 rt5677_slb_adc3_enum, RT5677_SLIMBUS_RX, 1511 rt5677_slb_adc3_enum, RT5677_SLIMBUS_RX,
1525 RT5677_SLB_ADC3_SFT, rt5677_if12_adc3_src); 1512 RT5677_SLB_ADC3_SFT, rt5677_if12_adc3_src);
1526 1513
1527static const struct snd_kcontrol_new rt5677_slb_adc3_mux = 1514static const struct snd_kcontrol_new rt5677_slb_adc3_mux =
1528 SOC_DAPM_ENUM("SLB ADC3 source", rt5677_slb_adc3_enum); 1515 SOC_DAPM_ENUM("SLB ADC3 Source", rt5677_slb_adc3_enum);
1529 1516
1530/* TDM IF1/2 SLB ADC4 Data Selection */ /* MX-3C MX-41 [11:10] MX-08 [7:6] */ 1517/* TDM IF1/2 SLB ADC4 Data Selection */ /* MX-3C MX-41 [11:10] MX-08 [7:6] */
1531static const char * const rt5677_if12_adc4_src[] = { 1518static const char * const rt5677_if12_adc4_src[] = {
@@ -1537,21 +1524,21 @@ static SOC_ENUM_SINGLE_DECL(
1537 RT5677_IF1_ADC4_SFT, rt5677_if12_adc4_src); 1524 RT5677_IF1_ADC4_SFT, rt5677_if12_adc4_src);
1538 1525
1539static const struct snd_kcontrol_new rt5677_if1_adc4_mux = 1526static const struct snd_kcontrol_new rt5677_if1_adc4_mux =
1540 SOC_DAPM_ENUM("IF1 ADC4 source", rt5677_if1_adc4_enum); 1527 SOC_DAPM_ENUM("IF1 ADC4 Source", rt5677_if1_adc4_enum);
1541 1528
1542static SOC_ENUM_SINGLE_DECL( 1529static SOC_ENUM_SINGLE_DECL(
1543 rt5677_if2_adc4_enum, RT5677_TDM2_CTRL2, 1530 rt5677_if2_adc4_enum, RT5677_TDM2_CTRL2,
1544 RT5677_IF2_ADC4_SFT, rt5677_if12_adc4_src); 1531 RT5677_IF2_ADC4_SFT, rt5677_if12_adc4_src);
1545 1532
1546static const struct snd_kcontrol_new rt5677_if2_adc4_mux = 1533static const struct snd_kcontrol_new rt5677_if2_adc4_mux =
1547 SOC_DAPM_ENUM("IF2 ADC4 source", rt5677_if2_adc4_enum); 1534 SOC_DAPM_ENUM("IF2 ADC4 Source", rt5677_if2_adc4_enum);
1548 1535
1549static SOC_ENUM_SINGLE_DECL( 1536static SOC_ENUM_SINGLE_DECL(
1550 rt5677_slb_adc4_enum, RT5677_SLIMBUS_RX, 1537 rt5677_slb_adc4_enum, RT5677_SLIMBUS_RX,
1551 RT5677_SLB_ADC4_SFT, rt5677_if12_adc4_src); 1538 RT5677_SLB_ADC4_SFT, rt5677_if12_adc4_src);
1552 1539
1553static const struct snd_kcontrol_new rt5677_slb_adc4_mux = 1540static const struct snd_kcontrol_new rt5677_slb_adc4_mux =
1554 SOC_DAPM_ENUM("SLB ADC4 source", rt5677_slb_adc4_enum); 1541 SOC_DAPM_ENUM("SLB ADC4 Source", rt5677_slb_adc4_enum);
1555 1542
1556/* Interface3/4 ADC Data Input */ /* MX-2F [3:0] MX-30 [7:4]*/ 1543/* Interface3/4 ADC Data Input */ /* MX-2F [3:0] MX-30 [7:4]*/
1557static const char * const rt5677_if34_adc_src[] = { 1544static const char * const rt5677_if34_adc_src[] = {
@@ -1564,14 +1551,14 @@ static SOC_ENUM_SINGLE_DECL(
1564 RT5677_IF3_ADC_IN_SFT, rt5677_if34_adc_src); 1551 RT5677_IF3_ADC_IN_SFT, rt5677_if34_adc_src);
1565 1552
1566static const struct snd_kcontrol_new rt5677_if3_adc_mux = 1553static const struct snd_kcontrol_new rt5677_if3_adc_mux =
1567 SOC_DAPM_ENUM("IF3 ADC source", rt5677_if3_adc_enum); 1554 SOC_DAPM_ENUM("IF3 ADC Source", rt5677_if3_adc_enum);
1568 1555
1569static SOC_ENUM_SINGLE_DECL( 1556static SOC_ENUM_SINGLE_DECL(
1570 rt5677_if4_adc_enum, RT5677_IF4_DATA, 1557 rt5677_if4_adc_enum, RT5677_IF4_DATA,
1571 RT5677_IF4_ADC_IN_SFT, rt5677_if34_adc_src); 1558 RT5677_IF4_ADC_IN_SFT, rt5677_if34_adc_src);
1572 1559
1573static const struct snd_kcontrol_new rt5677_if4_adc_mux = 1560static const struct snd_kcontrol_new rt5677_if4_adc_mux =
1574 SOC_DAPM_ENUM("IF4 ADC source", rt5677_if4_adc_enum); 1561 SOC_DAPM_ENUM("IF4 ADC Source", rt5677_if4_adc_enum);
1575 1562
1576static int rt5677_bst1_event(struct snd_soc_dapm_widget *w, 1563static int rt5677_bst1_event(struct snd_soc_dapm_widget *w,
1577 struct snd_kcontrol *kcontrol, int event) 1564 struct snd_kcontrol *kcontrol, int event)
@@ -1670,6 +1657,13 @@ static int rt5677_set_micbias1_event(struct snd_soc_dapm_widget *w,
1670 RT5677_PWR_CLK_MB, RT5677_PWR_CLK_MB1 | 1657 RT5677_PWR_CLK_MB, RT5677_PWR_CLK_MB1 |
1671 RT5677_PWR_PP_MB1 | RT5677_PWR_CLK_MB); 1658 RT5677_PWR_PP_MB1 | RT5677_PWR_CLK_MB);
1672 break; 1659 break;
1660
1661 case SND_SOC_DAPM_PRE_PMD:
1662 regmap_update_bits(rt5677->regmap, RT5677_PWR_ANLG2,
1663 RT5677_PWR_CLK_MB1 | RT5677_PWR_PP_MB1 |
1664 RT5677_PWR_CLK_MB, 0);
1665 break;
1666
1673 default: 1667 default:
1674 return 0; 1668 return 0;
1675 } 1669 }
@@ -1685,8 +1679,9 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
1685 1679
1686 /* Input Side */ 1680 /* Input Side */
1687 /* micbias */ 1681 /* micbias */
1688 SND_SOC_DAPM_SUPPLY("micbias1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT, 1682 SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT,
1689 0, rt5677_set_micbias1_event, SND_SOC_DAPM_POST_PMU), 1683 0, rt5677_set_micbias1_event, SND_SOC_DAPM_PRE_PMD |
1684 SND_SOC_DAPM_POST_PMU),
1690 1685
1691 /* Input Lines */ 1686 /* Input Lines */
1692 SND_SOC_DAPM_INPUT("DMIC L1"), 1687 SND_SOC_DAPM_INPUT("DMIC L1"),
@@ -2798,21 +2793,6 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
2798 { "PDM2R", NULL, "PDM2 R Mux" }, 2793 { "PDM2R", NULL, "PDM2 R Mux" },
2799}; 2794};
2800 2795
2801static int get_clk_info(int sclk, int rate)
2802{
2803 int i, pd[] = {1, 2, 3, 4, 6, 8, 12, 16};
2804
2805 if (sclk <= 0 || rate <= 0)
2806 return -EINVAL;
2807
2808 rate = rate << 8;
2809 for (i = 0; i < ARRAY_SIZE(pd); i++)
2810 if (sclk == rate * pd[i])
2811 return i;
2812
2813 return -EINVAL;
2814}
2815
2816static int rt5677_hw_params(struct snd_pcm_substream *substream, 2796static int rt5677_hw_params(struct snd_pcm_substream *substream,
2817 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 2797 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
2818{ 2798{
@@ -2822,7 +2802,7 @@ static int rt5677_hw_params(struct snd_pcm_substream *substream,
2822 int pre_div, bclk_ms, frame_size; 2802 int pre_div, bclk_ms, frame_size;
2823 2803
2824 rt5677->lrck[dai->id] = params_rate(params); 2804 rt5677->lrck[dai->id] = params_rate(params);
2825 pre_div = get_clk_info(rt5677->sysclk, rt5677->lrck[dai->id]); 2805 pre_div = rl6231_get_clk_info(rt5677->sysclk, rt5677->lrck[dai->id]);
2826 if (pre_div < 0) { 2806 if (pre_div < 0) {
2827 dev_err(codec->dev, "Unsupported clock setting\n"); 2807 dev_err(codec->dev, "Unsupported clock setting\n");
2828 return -EINVAL; 2808 return -EINVAL;
@@ -3016,62 +2996,12 @@ static int rt5677_set_dai_sysclk(struct snd_soc_dai *dai,
3016 * Returns 0 for success or negative error code. 2996 * Returns 0 for success or negative error code.
3017 */ 2997 */
3018static int rt5677_pll_calc(const unsigned int freq_in, 2998static int rt5677_pll_calc(const unsigned int freq_in,
3019 const unsigned int freq_out, struct rt5677_pll_code *pll_code) 2999 const unsigned int freq_out, struct rl6231_pll_code *pll_code)
3020{ 3000{
3021 int max_n = RT5677_PLL_N_MAX, max_m = RT5677_PLL_M_MAX; 3001 if (RT5677_PLL_INP_MIN > freq_in)
3022 int k, red, n_t, pll_out, in_t;
3023 int n = 0, m = 0, m_t = 0;
3024 int out_t, red_t = abs(freq_out - freq_in);
3025 bool m_bp = false, k_bp = false;
3026
3027 if (RT5677_PLL_INP_MAX < freq_in || RT5677_PLL_INP_MIN > freq_in)
3028 return -EINVAL; 3002 return -EINVAL;
3029 3003
3030 k = 100000000 / freq_out - 2; 3004 return rl6231_pll_calc(freq_in, freq_out, pll_code);
3031 if (k > RT5677_PLL_K_MAX)
3032 k = RT5677_PLL_K_MAX;
3033 for (n_t = 0; n_t <= max_n; n_t++) {
3034 in_t = freq_in / (k + 2);
3035 pll_out = freq_out / (n_t + 2);
3036 if (in_t < 0)
3037 continue;
3038 if (in_t == pll_out) {
3039 m_bp = true;
3040 n = n_t;
3041 goto code_find;
3042 }
3043 red = abs(in_t - pll_out);
3044 if (red < red_t) {
3045 m_bp = true;
3046 n = n_t;
3047 m = m_t;
3048 if (red == 0)
3049 goto code_find;
3050 red_t = red;
3051 }
3052 for (m_t = 0; m_t <= max_m; m_t++) {
3053 out_t = in_t / (m_t + 2);
3054 red = abs(out_t - pll_out);
3055 if (red < red_t) {
3056 m_bp = false;
3057 n = n_t;
3058 m = m_t;
3059 if (red == 0)
3060 goto code_find;
3061 red_t = red;
3062 }
3063 }
3064 }
3065 pr_debug("Only get approximation about PLL\n");
3066
3067code_find:
3068
3069 pll_code->m_bp = m_bp;
3070 pll_code->k_bp = k_bp;
3071 pll_code->m_code = m;
3072 pll_code->n_code = n;
3073 pll_code->k_code = k;
3074 return 0;
3075} 3005}
3076 3006
3077static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, 3007static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
@@ -3079,7 +3009,7 @@ static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
3079{ 3009{
3080 struct snd_soc_codec *codec = dai->codec; 3010 struct snd_soc_codec *codec = dai->codec;
3081 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec); 3011 struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
3082 struct rt5677_pll_code pll_code; 3012 struct rl6231_pll_code pll_code;
3083 int ret; 3013 int ret;
3084 3014
3085 if (source == rt5677->pll_src && freq_in == rt5677->pll_in && 3015 if (source == rt5677->pll_src && freq_in == rt5677->pll_in &&
@@ -3137,15 +3067,12 @@ static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
3137 return ret; 3067 return ret;
3138 } 3068 }
3139 3069
3140 dev_dbg(codec->dev, "m_bypass=%d k_bypass=%d m=%d n=%d k=%d\n", 3070 dev_dbg(codec->dev, "m_bypass=%d m=%d n=%d k=%d\n",
3141 pll_code.m_bp, pll_code.k_bp, 3071 pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
3142 (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, 3072 pll_code.n_code, pll_code.k_code);
3143 (pll_code.k_bp ? 0 : pll_code.k_code));
3144 3073
3145 regmap_write(rt5677->regmap, RT5677_PLL1_CTRL1, 3074 regmap_write(rt5677->regmap, RT5677_PLL1_CTRL1,
3146 pll_code.n_code << RT5677_PLL_N_SFT | 3075 pll_code.n_code << RT5677_PLL_N_SFT | pll_code.k_code);
3147 pll_code.k_bp << RT5677_PLL_K_BP_SFT |
3148 (pll_code.k_bp ? 0 : pll_code.k_code));
3149 regmap_write(rt5677->regmap, RT5677_PLL1_CTRL2, 3076 regmap_write(rt5677->regmap, RT5677_PLL1_CTRL2,
3150 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5677_PLL_M_SFT | 3077 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5677_PLL_M_SFT |
3151 pll_code.m_bp << RT5677_PLL_M_BP_SFT); 3078 pll_code.m_bp << RT5677_PLL_M_BP_SFT);
@@ -3197,7 +3124,7 @@ static int rt5677_set_bias_level(struct snd_soc_codec *codec,
3197 regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x1, 0x0); 3124 regmap_update_bits(rt5677->regmap, RT5677_DIG_MISC, 0x1, 0x0);
3198 regmap_write(rt5677->regmap, RT5677_PWR_DIG1, 0x0000); 3125 regmap_write(rt5677->regmap, RT5677_PWR_DIG1, 0x0000);
3199 regmap_write(rt5677->regmap, RT5677_PWR_DIG2, 0x0000); 3126 regmap_write(rt5677->regmap, RT5677_PWR_DIG2, 0x0000);
3200 regmap_write(rt5677->regmap, RT5677_PWR_ANLG1, 0x0000); 3127 regmap_write(rt5677->regmap, RT5677_PWR_ANLG1, 0x0022);
3201 regmap_write(rt5677->regmap, RT5677_PWR_ANLG2, 0x0000); 3128 regmap_write(rt5677->regmap, RT5677_PWR_ANLG2, 0x0000);
3202 regmap_update_bits(rt5677->regmap, 3129 regmap_update_bits(rt5677->regmap,
3203 RT5677_PR_BASE + RT5677_BIAS_CUR4, 0x0f00, 0x0000); 3130 RT5677_PR_BASE + RT5677_BIAS_CUR4, 0x0f00, 0x0000);
@@ -3454,14 +3381,8 @@ static int rt5677_i2c_probe(struct i2c_client *i2c,
3454 regmap_update_bits(rt5677->regmap, RT5677_IN1, 3381 regmap_update_bits(rt5677->regmap, RT5677_IN1,
3455 RT5677_IN_DF2, RT5677_IN_DF2); 3382 RT5677_IN_DF2, RT5677_IN_DF2);
3456 3383
3457 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5677, 3384 return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5677,
3458 rt5677_dai, ARRAY_SIZE(rt5677_dai)); 3385 rt5677_dai, ARRAY_SIZE(rt5677_dai));
3459 if (ret < 0)
3460 goto err;
3461
3462 return 0;
3463err:
3464 return ret;
3465} 3386}
3466 3387
3467static int rt5677_i2c_remove(struct i2c_client *i2c) 3388static int rt5677_i2c_remove(struct i2c_client *i2c)
@@ -3480,18 +3401,7 @@ static struct i2c_driver rt5677_i2c_driver = {
3480 .remove = rt5677_i2c_remove, 3401 .remove = rt5677_i2c_remove,
3481 .id_table = rt5677_i2c_id, 3402 .id_table = rt5677_i2c_id,
3482}; 3403};
3483 3404module_i2c_driver(rt5677_i2c_driver);
3484static int __init rt5677_modinit(void)
3485{
3486 return i2c_add_driver(&rt5677_i2c_driver);
3487}
3488module_init(rt5677_modinit);
3489
3490static void __exit rt5677_modexit(void)
3491{
3492 i2c_del_driver(&rt5677_i2c_driver);
3493}
3494module_exit(rt5677_modexit);
3495 3405
3496MODULE_DESCRIPTION("ASoC RT5677 driver"); 3406MODULE_DESCRIPTION("ASoC RT5677 driver");
3497MODULE_AUTHOR("Oder Chiou <oder_chiou@realtek.com>"); 3407MODULE_AUTHOR("Oder Chiou <oder_chiou@realtek.com>");
diff --git a/sound/soc/codecs/rt5677.h b/sound/soc/codecs/rt5677.h
index af4e9c797408..863393e62096 100644
--- a/sound/soc/codecs/rt5677.h
+++ b/sound/soc/codecs/rt5677.h
@@ -1393,13 +1393,6 @@
1393#define RT5677_DSP_IB_9_L (0x1 << 1) 1393#define RT5677_DSP_IB_9_L (0x1 << 1)
1394#define RT5677_DSP_IB_9_L_SFT 1 1394#define RT5677_DSP_IB_9_L_SFT 1
1395 1395
1396/* Debug String Length */
1397#define RT5677_REG_DISP_LEN 23
1398
1399#define RT5677_NO_JACK BIT(0)
1400#define RT5677_HEADSET_DET BIT(1)
1401#define RT5677_HEADPHO_DET BIT(2)
1402
1403/* System Clock Source */ 1396/* System Clock Source */
1404enum { 1397enum {
1405 RT5677_SCLK_S_MCLK, 1398 RT5677_SCLK_S_MCLK,
@@ -1425,14 +1418,6 @@ enum {
1425 RT5677_AIFS, 1418 RT5677_AIFS,
1426}; 1419};
1427 1420
1428struct rt5677_pll_code {
1429 bool m_bp; /* Indicates bypass m code or not. */
1430 bool k_bp; /* Indicates bypass k code or not. */
1431 int m_code;
1432 int n_code;
1433 int k_code;
1434};
1435
1436struct rt5677_priv { 1421struct rt5677_priv {
1437 struct snd_soc_codec *codec; 1422 struct snd_soc_codec *codec;
1438 struct rt5677_platform_data pdata; 1423 struct rt5677_platform_data pdata;
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c
index 8f4c73d17c87..e997d271728d 100644
--- a/sound/soc/codecs/sgtl5000.c
+++ b/sound/soc/codecs/sgtl5000.c
@@ -724,25 +724,25 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream,
724 return ret; 724 return ret;
725 725
726 /* set i2s data format */ 726 /* set i2s data format */
727 switch (params_format(params)) { 727 switch (params_width(params)) {
728 case SNDRV_PCM_FORMAT_S16_LE: 728 case 16:
729 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J) 729 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
730 return -EINVAL; 730 return -EINVAL;
731 i2s_ctl |= SGTL5000_I2S_DLEN_16 << SGTL5000_I2S_DLEN_SHIFT; 731 i2s_ctl |= SGTL5000_I2S_DLEN_16 << SGTL5000_I2S_DLEN_SHIFT;
732 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_32FS << 732 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_32FS <<
733 SGTL5000_I2S_SCLKFREQ_SHIFT; 733 SGTL5000_I2S_SCLKFREQ_SHIFT;
734 break; 734 break;
735 case SNDRV_PCM_FORMAT_S20_3LE: 735 case 20:
736 i2s_ctl |= SGTL5000_I2S_DLEN_20 << SGTL5000_I2S_DLEN_SHIFT; 736 i2s_ctl |= SGTL5000_I2S_DLEN_20 << SGTL5000_I2S_DLEN_SHIFT;
737 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS << 737 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
738 SGTL5000_I2S_SCLKFREQ_SHIFT; 738 SGTL5000_I2S_SCLKFREQ_SHIFT;
739 break; 739 break;
740 case SNDRV_PCM_FORMAT_S24_LE: 740 case 24:
741 i2s_ctl |= SGTL5000_I2S_DLEN_24 << SGTL5000_I2S_DLEN_SHIFT; 741 i2s_ctl |= SGTL5000_I2S_DLEN_24 << SGTL5000_I2S_DLEN_SHIFT;
742 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS << 742 i2s_ctl |= SGTL5000_I2S_SCLKFREQ_64FS <<
743 SGTL5000_I2S_SCLKFREQ_SHIFT; 743 SGTL5000_I2S_SCLKFREQ_SHIFT;
744 break; 744 break;
745 case SNDRV_PCM_FORMAT_S32_LE: 745 case 32:
746 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J) 746 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
747 return -EINVAL; 747 return -EINVAL;
748 i2s_ctl |= SGTL5000_I2S_DLEN_32 << SGTL5000_I2S_DLEN_SHIFT; 748 i2s_ctl |= SGTL5000_I2S_DLEN_32 << SGTL5000_I2S_DLEN_SHIFT;
@@ -843,10 +843,8 @@ static int ldo_regulator_register(struct snd_soc_codec *codec,
843 843
844 ldo = kzalloc(sizeof(struct ldo_regulator), GFP_KERNEL); 844 ldo = kzalloc(sizeof(struct ldo_regulator), GFP_KERNEL);
845 845
846 if (!ldo) { 846 if (!ldo)
847 dev_err(codec->dev, "failed to allocate ldo_regulator\n");
848 return -ENOMEM; 847 return -ENOMEM;
849 }
850 848
851 ldo->desc.name = kstrdup(dev_name(codec->dev), GFP_KERNEL); 849 ldo->desc.name = kstrdup(dev_name(codec->dev), GFP_KERNEL);
852 if (!ldo->desc.name) { 850 if (!ldo->desc.name) {
diff --git a/sound/soc/codecs/si476x.c b/sound/soc/codecs/si476x.c
index f26befb0c297..cdf882fa7716 100644
--- a/sound/soc/codecs/si476x.c
+++ b/sound/soc/codecs/si476x.c
@@ -167,17 +167,17 @@ static int si476x_codec_hw_params(struct snd_pcm_substream *substream,
167 return -EINVAL; 167 return -EINVAL;
168 } 168 }
169 169
170 switch (params_format(params)) { 170 switch (params_width(params)) {
171 case SNDRV_PCM_FORMAT_S8: 171 case 8:
172 width = SI476X_PCM_FORMAT_S8; 172 width = SI476X_PCM_FORMAT_S8;
173 break; 173 break;
174 case SNDRV_PCM_FORMAT_S16_LE: 174 case 16:
175 width = SI476X_PCM_FORMAT_S16_LE; 175 width = SI476X_PCM_FORMAT_S16_LE;
176 break; 176 break;
177 case SNDRV_PCM_FORMAT_S20_3LE: 177 case 20:
178 width = SI476X_PCM_FORMAT_S20_3LE; 178 width = SI476X_PCM_FORMAT_S20_3LE;
179 break; 179 break;
180 case SNDRV_PCM_FORMAT_S24_LE: 180 case 24:
181 width = SI476X_PCM_FORMAT_S24_LE; 181 width = SI476X_PCM_FORMAT_S24_LE;
182 break; 182 break;
183 default: 183 default:
diff --git a/sound/soc/codecs/sirf-audio-codec.c b/sound/soc/codecs/sirf-audio-codec.c
index d90cb0fafcb2..06ba4923fd5a 100644
--- a/sound/soc/codecs/sirf-audio-codec.c
+++ b/sound/soc/codecs/sirf-audio-codec.c
@@ -471,8 +471,8 @@ static int sirf_audio_codec_driver_probe(struct platform_device *pdev)
471 471
472 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 472 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
473 base = devm_ioremap_resource(&pdev->dev, mem_res); 473 base = devm_ioremap_resource(&pdev->dev, mem_res);
474 if (base == NULL) 474 if (IS_ERR(base))
475 return -ENOMEM; 475 return PTR_ERR(base);
476 476
477 sirf_audio_codec->regmap = devm_regmap_init_mmio(&pdev->dev, base, 477 sirf_audio_codec->regmap = devm_regmap_init_mmio(&pdev->dev, base,
478 &sirf_audio_codec_regmap_config); 478 &sirf_audio_codec_regmap_config);
diff --git a/sound/soc/codecs/sn95031.c b/sound/soc/codecs/sn95031.c
index 42dff26b3a2a..cf8fa40662f0 100644
--- a/sound/soc/codecs/sn95031.c
+++ b/sound/soc/codecs/sn95031.c
@@ -661,12 +661,12 @@ static int sn95031_pcm_hw_params(struct snd_pcm_substream *substream,
661{ 661{
662 unsigned int format, rate; 662 unsigned int format, rate;
663 663
664 switch (params_format(params)) { 664 switch (params_width(params)) {
665 case SNDRV_PCM_FORMAT_S16_LE: 665 case 16:
666 format = BIT(4)|BIT(5); 666 format = BIT(4)|BIT(5);
667 break; 667 break;
668 668
669 case SNDRV_PCM_FORMAT_S24_LE: 669 case 24:
670 format = 0; 670 format = 0;
671 break; 671 break;
672 default: 672 default:
diff --git a/sound/soc/codecs/spdif_transmitter.c b/sound/soc/codecs/spdif_transmitter.c
index a078aa31052a..e0df537dd4b7 100644
--- a/sound/soc/codecs/spdif_transmitter.c
+++ b/sound/soc/codecs/spdif_transmitter.c
@@ -24,7 +24,7 @@
24 24
25#define DRV_NAME "spdif-dit" 25#define DRV_NAME "spdif-dit"
26 26
27#define STUB_RATES SNDRV_PCM_RATE_8000_96000 27#define STUB_RATES SNDRV_PCM_RATE_8000_192000
28#define STUB_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 28#define STUB_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
29 SNDRV_PCM_FMTBIT_S20_3LE | \ 29 SNDRV_PCM_FMTBIT_S20_3LE | \
30 SNDRV_PCM_FMTBIT_S24_LE) 30 SNDRV_PCM_FMTBIT_S24_LE)
diff --git a/sound/soc/codecs/ssm2518.c b/sound/soc/codecs/ssm2518.c
index 56adb3e2def9..e8680bea5f86 100644
--- a/sound/soc/codecs/ssm2518.c
+++ b/sound/soc/codecs/ssm2518.c
@@ -361,11 +361,11 @@ static int ssm2518_hw_params(struct snd_pcm_substream *substream,
361 return -EINVAL; 361 return -EINVAL;
362 362
363 if (ssm2518->right_j) { 363 if (ssm2518->right_j) {
364 switch (params_format(params)) { 364 switch (params_width(params)) {
365 case SNDRV_PCM_FORMAT_S16_LE: 365 case 16:
366 ctrl1 |= SSM2518_SAI_CTRL1_FMT_RJ_16BIT; 366 ctrl1 |= SSM2518_SAI_CTRL1_FMT_RJ_16BIT;
367 break; 367 break;
368 case SNDRV_PCM_FORMAT_S24_LE: 368 case 24:
369 ctrl1 |= SSM2518_SAI_CTRL1_FMT_RJ_24BIT; 369 ctrl1 |= SSM2518_SAI_CTRL1_FMT_RJ_24BIT;
370 break; 370 break;
371 default: 371 default:
diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c
index 97b0454eb346..484b3bbe8624 100644
--- a/sound/soc/codecs/ssm2602.c
+++ b/sound/soc/codecs/ssm2602.c
@@ -275,17 +275,17 @@ static int ssm2602_hw_params(struct snd_pcm_substream *substream,
275 regmap_write(ssm2602->regmap, SSM2602_SRATE, srate); 275 regmap_write(ssm2602->regmap, SSM2602_SRATE, srate);
276 276
277 /* bit size */ 277 /* bit size */
278 switch (params_format(params)) { 278 switch (params_width(params)) {
279 case SNDRV_PCM_FORMAT_S16_LE: 279 case 16:
280 iface = 0x0; 280 iface = 0x0;
281 break; 281 break;
282 case SNDRV_PCM_FORMAT_S20_3LE: 282 case 20:
283 iface = 0x4; 283 iface = 0x4;
284 break; 284 break;
285 case SNDRV_PCM_FORMAT_S24_LE: 285 case 24:
286 iface = 0x8; 286 iface = 0x8;
287 break; 287 break;
288 case SNDRV_PCM_FORMAT_S32_LE: 288 case 32:
289 iface = 0xc; 289 iface = 0xc;
290 break; 290 break;
291 default: 291 default:
diff --git a/sound/soc/codecs/sta32x.c b/sound/soc/codecs/sta32x.c
index 0579d187135b..48740855566d 100644
--- a/sound/soc/codecs/sta32x.c
+++ b/sound/soc/codecs/sta32x.c
@@ -678,15 +678,11 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream,
678 678
679 confb = snd_soc_read(codec, STA32X_CONFB); 679 confb = snd_soc_read(codec, STA32X_CONFB);
680 confb &= ~(STA32X_CONFB_SAI_MASK | STA32X_CONFB_SAIFB); 680 confb &= ~(STA32X_CONFB_SAI_MASK | STA32X_CONFB_SAIFB);
681 switch (params_format(params)) { 681 switch (params_width(params)) {
682 case SNDRV_PCM_FORMAT_S24_LE: 682 case 24:
683 case SNDRV_PCM_FORMAT_S24_BE:
684 case SNDRV_PCM_FORMAT_S24_3LE:
685 case SNDRV_PCM_FORMAT_S24_3BE:
686 pr_debug("24bit\n"); 683 pr_debug("24bit\n");
687 /* fall through */ 684 /* fall through */
688 case SNDRV_PCM_FORMAT_S32_LE: 685 case 32:
689 case SNDRV_PCM_FORMAT_S32_BE:
690 pr_debug("24bit or 32bit\n"); 686 pr_debug("24bit or 32bit\n");
691 switch (sta32x->format) { 687 switch (sta32x->format) {
692 case SND_SOC_DAIFMT_I2S: 688 case SND_SOC_DAIFMT_I2S:
@@ -701,8 +697,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream,
701 } 697 }
702 698
703 break; 699 break;
704 case SNDRV_PCM_FORMAT_S20_3LE: 700 case 20:
705 case SNDRV_PCM_FORMAT_S20_3BE:
706 pr_debug("20bit\n"); 701 pr_debug("20bit\n");
707 switch (sta32x->format) { 702 switch (sta32x->format) {
708 case SND_SOC_DAIFMT_I2S: 703 case SND_SOC_DAIFMT_I2S:
@@ -717,8 +712,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream,
717 } 712 }
718 713
719 break; 714 break;
720 case SNDRV_PCM_FORMAT_S18_3LE: 715 case 18:
721 case SNDRV_PCM_FORMAT_S18_3BE:
722 pr_debug("18bit\n"); 716 pr_debug("18bit\n");
723 switch (sta32x->format) { 717 switch (sta32x->format) {
724 case SND_SOC_DAIFMT_I2S: 718 case SND_SOC_DAIFMT_I2S:
@@ -733,8 +727,7 @@ static int sta32x_hw_params(struct snd_pcm_substream *substream,
733 } 727 }
734 728
735 break; 729 break;
736 case SNDRV_PCM_FORMAT_S16_LE: 730 case 16:
737 case SNDRV_PCM_FORMAT_S16_BE:
738 pr_debug("16bit\n"); 731 pr_debug("16bit\n");
739 switch (sta32x->format) { 732 switch (sta32x->format) {
740 case SND_SOC_DAIFMT_I2S: 733 case SND_SOC_DAIFMT_I2S:
diff --git a/sound/soc/codecs/sta529.c b/sound/soc/codecs/sta529.c
index a40c4b0196a3..9aa1323fb2ab 100644
--- a/sound/soc/codecs/sta529.c
+++ b/sound/soc/codecs/sta529.c
@@ -197,16 +197,16 @@ static int sta529_hw_params(struct snd_pcm_substream *substream,
197 int pdata, play_freq_val, record_freq_val; 197 int pdata, play_freq_val, record_freq_val;
198 int bclk_to_fs_ratio; 198 int bclk_to_fs_ratio;
199 199
200 switch (params_format(params)) { 200 switch (params_width(params)) {
201 case SNDRV_PCM_FORMAT_S16_LE: 201 case 16:
202 pdata = 1; 202 pdata = 1;
203 bclk_to_fs_ratio = 0; 203 bclk_to_fs_ratio = 0;
204 break; 204 break;
205 case SNDRV_PCM_FORMAT_S24_LE: 205 case 24:
206 pdata = 2; 206 pdata = 2;
207 bclk_to_fs_ratio = 1; 207 bclk_to_fs_ratio = 1;
208 break; 208 break;
209 case SNDRV_PCM_FORMAT_S32_LE: 209 case 32:
210 pdata = 3; 210 pdata = 3;
211 bclk_to_fs_ratio = 2; 211 bclk_to_fs_ratio = 2;
212 break; 212 break;
@@ -380,10 +380,8 @@ static int sta529_i2c_probe(struct i2c_client *i2c,
380 return -EINVAL; 380 return -EINVAL;
381 381
382 sta529 = devm_kzalloc(&i2c->dev, sizeof(struct sta529), GFP_KERNEL); 382 sta529 = devm_kzalloc(&i2c->dev, sizeof(struct sta529), GFP_KERNEL);
383 if (sta529 == NULL) { 383 if (!sta529)
384 dev_err(&i2c->dev, "Can not allocate memory\n");
385 return -ENOMEM; 384 return -ENOMEM;
386 }
387 385
388 sta529->regmap = devm_regmap_init_i2c(i2c, &sta529_regmap); 386 sta529->regmap = devm_regmap_init_i2c(i2c, &sta529_regmap);
389 if (IS_ERR(sta529->regmap)) { 387 if (IS_ERR(sta529->regmap)) {
diff --git a/sound/soc/codecs/tas2552.c b/sound/soc/codecs/tas2552.c
new file mode 100644
index 000000000000..23b32960ff1d
--- /dev/null
+++ b/sound/soc/codecs/tas2552.c
@@ -0,0 +1,544 @@
1/*
2 * tas2552.c - ALSA SoC Texas Instruments TAS2552 Mono Audio Amplifier
3 *
4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Author: Dan Murphy <dmurphy@ti.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 */
17
18#include <linux/module.h>
19#include <linux/errno.h>
20#include <linux/device.h>
21#include <linux/i2c.h>
22#include <linux/gpio.h>
23#include <linux/of_gpio.h>
24#include <linux/pm_runtime.h>
25#include <linux/regmap.h>
26#include <linux/slab.h>
27
28#include <linux/gpio/consumer.h>
29#include <linux/regulator/consumer.h>
30
31#include <sound/pcm.h>
32#include <sound/pcm_params.h>
33#include <sound/soc.h>
34#include <sound/soc-dapm.h>
35#include <sound/tlv.h>
36#include <sound/tas2552-plat.h>
37
38#include "tas2552.h"
39
40static struct reg_default tas2552_reg_defs[] = {
41 {TAS2552_CFG_1, 0x22},
42 {TAS2552_CFG_3, 0x80},
43 {TAS2552_DOUT, 0x00},
44 {TAS2552_OUTPUT_DATA, 0xc0},
45 {TAS2552_PDM_CFG, 0x01},
46 {TAS2552_PGA_GAIN, 0x00},
47 {TAS2552_BOOST_PT_CTRL, 0x0f},
48 {TAS2552_RESERVED_0D, 0x00},
49 {TAS2552_LIMIT_RATE_HYS, 0x08},
50 {TAS2552_CFG_2, 0xef},
51 {TAS2552_SER_CTRL_1, 0x00},
52 {TAS2552_SER_CTRL_2, 0x00},
53 {TAS2552_PLL_CTRL_1, 0x10},
54 {TAS2552_PLL_CTRL_2, 0x00},
55 {TAS2552_PLL_CTRL_3, 0x00},
56 {TAS2552_BTIP, 0x8f},
57 {TAS2552_BTS_CTRL, 0x80},
58 {TAS2552_LIMIT_RELEASE, 0x04},
59 {TAS2552_LIMIT_INT_COUNT, 0x00},
60 {TAS2552_EDGE_RATE_CTRL, 0x40},
61 {TAS2552_VBAT_DATA, 0x00},
62};
63
64#define TAS2552_NUM_SUPPLIES 3
65static const char *tas2552_supply_names[TAS2552_NUM_SUPPLIES] = {
66 "vbat", /* vbat voltage */
67 "iovdd", /* I/O Voltage */
68 "avdd", /* Analog DAC Voltage */
69};
70
71struct tas2552_data {
72 struct snd_soc_codec *codec;
73 struct regmap *regmap;
74 struct i2c_client *tas2552_client;
75 struct regulator_bulk_data supplies[TAS2552_NUM_SUPPLIES];
76 struct gpio_desc *enable_gpio;
77 unsigned char regs[TAS2552_VBAT_DATA];
78 unsigned int mclk;
79};
80
81static void tas2552_sw_shutdown(struct tas2552_data *tas_data, int sw_shutdown)
82{
83 u8 cfg1_reg;
84
85 if (sw_shutdown)
86 cfg1_reg = 0;
87 else
88 cfg1_reg = TAS2552_SWS_MASK;
89
90 snd_soc_update_bits(tas_data->codec, TAS2552_CFG_1,
91 TAS2552_SWS_MASK, cfg1_reg);
92}
93
94static int tas2552_hw_params(struct snd_pcm_substream *substream,
95 struct snd_pcm_hw_params *params,
96 struct snd_soc_dai *dai)
97{
98 struct snd_soc_codec *codec = dai->codec;
99 struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
100 int sample_rate, pll_clk;
101 int d;
102 u8 p, j;
103
104 /* Turn on Class D amplifier */
105 snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_CLASSD_EN_MASK,
106 TAS2552_CLASSD_EN);
107
108 if (!tas2552->mclk)
109 return -EINVAL;
110
111 snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_PLL_ENABLE, 0);
112
113 if (tas2552->mclk == TAS2552_245MHZ_CLK ||
114 tas2552->mclk == TAS2552_225MHZ_CLK) {
115 /* By pass the PLL configuration */
116 snd_soc_update_bits(codec, TAS2552_PLL_CTRL_2,
117 TAS2552_PLL_BYPASS_MASK,
118 TAS2552_PLL_BYPASS);
119 } else {
120 /* Fill in the PLL control registers for J & D
121 * PLL_CLK = (.5 * freq * J.D) / 2^p
122 * Need to fill in J and D here based on incoming freq
123 */
124 p = snd_soc_read(codec, TAS2552_PLL_CTRL_1);
125 p = (p >> 7);
126 sample_rate = params_rate(params);
127
128 if (sample_rate == 48000)
129 pll_clk = TAS2552_245MHZ_CLK;
130 else if (sample_rate == 44100)
131 pll_clk = TAS2552_225MHZ_CLK;
132 else {
133 dev_vdbg(codec->dev, "Substream sample rate is not found %i\n",
134 params_rate(params));
135 return -EINVAL;
136 }
137
138 j = (pll_clk * 2 * (1 << p)) / tas2552->mclk;
139 d = (pll_clk * 2 * (1 << p)) % tas2552->mclk;
140
141 snd_soc_update_bits(codec, TAS2552_PLL_CTRL_1,
142 TAS2552_PLL_J_MASK, j);
143 snd_soc_write(codec, TAS2552_PLL_CTRL_2,
144 (d >> 7) & TAS2552_PLL_D_UPPER_MASK);
145 snd_soc_write(codec, TAS2552_PLL_CTRL_3,
146 d & TAS2552_PLL_D_LOWER_MASK);
147
148 }
149
150 snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_PLL_ENABLE,
151 TAS2552_PLL_ENABLE);
152
153 return 0;
154}
155
156static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
157{
158 struct snd_soc_codec *codec = dai->codec;
159 u8 serial_format;
160 u8 serial_control_mask;
161
162 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
163 case SND_SOC_DAIFMT_CBS_CFS:
164 serial_format = 0x00;
165 break;
166 case SND_SOC_DAIFMT_CBS_CFM:
167 serial_format = TAS2552_WORD_CLK_MASK;
168 break;
169 case SND_SOC_DAIFMT_CBM_CFS:
170 serial_format = TAS2552_BIT_CLK_MASK;
171 break;
172 case SND_SOC_DAIFMT_CBM_CFM:
173 serial_format = (TAS2552_BIT_CLK_MASK | TAS2552_WORD_CLK_MASK);
174 break;
175 default:
176 dev_vdbg(codec->dev, "DAI Format master is not found\n");
177 return -EINVAL;
178 }
179
180 serial_control_mask = TAS2552_BIT_CLK_MASK | TAS2552_WORD_CLK_MASK;
181
182 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
183 case SND_SOC_DAIFMT_I2S:
184 serial_format &= TAS2552_DAIFMT_I2S_MASK;
185 break;
186 case SND_SOC_DAIFMT_DSP_A:
187 serial_format |= TAS2552_DAIFMT_DSP;
188 break;
189 case SND_SOC_DAIFMT_RIGHT_J:
190 serial_format |= TAS2552_DAIFMT_RIGHT_J;
191 break;
192 case SND_SOC_DAIFMT_LEFT_J:
193 serial_format |= TAS2552_DAIFMT_LEFT_J;
194 break;
195 default:
196 dev_vdbg(codec->dev, "DAI Format is not found\n");
197 return -EINVAL;
198 }
199
200 if (fmt & SND_SOC_DAIFMT_FORMAT_MASK)
201 serial_control_mask |= TAS2552_DATA_FORMAT_MASK;
202
203 snd_soc_update_bits(codec, TAS2552_SER_CTRL_1, serial_control_mask,
204 serial_format);
205
206 return 0;
207}
208
209static int tas2552_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
210 unsigned int freq, int dir)
211{
212 struct snd_soc_codec *codec = dai->codec;
213 struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
214
215 tas2552->mclk = freq;
216
217 return 0;
218}
219
220static int tas2552_mute(struct snd_soc_dai *dai, int mute)
221{
222 u8 cfg1_reg;
223 struct snd_soc_codec *codec = dai->codec;
224
225 if (mute)
226 cfg1_reg = TAS2552_MUTE_MASK;
227 else
228 cfg1_reg = ~TAS2552_MUTE_MASK;
229
230 snd_soc_update_bits(codec, TAS2552_CFG_1, TAS2552_MUTE_MASK, cfg1_reg);
231
232 return 0;
233}
234
235#ifdef CONFIG_PM_RUNTIME
236static int tas2552_runtime_suspend(struct device *dev)
237{
238 struct tas2552_data *tas2552 = dev_get_drvdata(dev);
239
240 tas2552_sw_shutdown(tas2552, 0);
241
242 regcache_cache_only(tas2552->regmap, true);
243 regcache_mark_dirty(tas2552->regmap);
244
245 if (tas2552->enable_gpio)
246 gpiod_set_value(tas2552->enable_gpio, 0);
247
248 return 0;
249}
250
251static int tas2552_runtime_resume(struct device *dev)
252{
253 struct tas2552_data *tas2552 = dev_get_drvdata(dev);
254
255 if (tas2552->enable_gpio)
256 gpiod_set_value(tas2552->enable_gpio, 1);
257
258 tas2552_sw_shutdown(tas2552, 1);
259
260 regcache_cache_only(tas2552->regmap, false);
261 regcache_sync(tas2552->regmap);
262
263 return 0;
264}
265#endif
266
267static const struct dev_pm_ops tas2552_pm = {
268 SET_RUNTIME_PM_OPS(tas2552_runtime_suspend, tas2552_runtime_resume,
269 NULL)
270};
271
272static void tas2552_shutdown(struct snd_pcm_substream *substream,
273 struct snd_soc_dai *dai)
274{
275 struct snd_soc_codec *codec = dai->codec;
276
277 snd_soc_update_bits(codec, TAS2552_CFG_2, TAS2552_PLL_ENABLE, 0);
278}
279
280static struct snd_soc_dai_ops tas2552_speaker_dai_ops = {
281 .hw_params = tas2552_hw_params,
282 .set_sysclk = tas2552_set_dai_sysclk,
283 .set_fmt = tas2552_set_dai_fmt,
284 .shutdown = tas2552_shutdown,
285 .digital_mute = tas2552_mute,
286};
287
288/* Formats supported by TAS2552 driver. */
289#define TAS2552_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
290 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
291
292/* TAS2552 dai structure. */
293static struct snd_soc_dai_driver tas2552_dai[] = {
294 {
295 .name = "tas2552-amplifier",
296 .playback = {
297 .stream_name = "Speaker",
298 .channels_min = 2,
299 .channels_max = 2,
300 .rates = SNDRV_PCM_RATE_8000_192000,
301 .formats = TAS2552_FORMATS,
302 },
303 .ops = &tas2552_speaker_dai_ops,
304 },
305};
306
307/*
308 * DAC digital volumes. From -7 to 24 dB in 1 dB steps
309 */
310static DECLARE_TLV_DB_SCALE(dac_tlv, -7, 100, 24);
311
312static const struct snd_kcontrol_new tas2552_snd_controls[] = {
313 SOC_SINGLE_TLV("Speaker Driver Playback Volume",
314 TAS2552_PGA_GAIN, 0, 0x1f, 1, dac_tlv),
315};
316
317static const struct reg_default tas2552_init_regs[] = {
318 { TAS2552_RESERVED_0D, 0xc0 },
319};
320
321static int tas2552_codec_probe(struct snd_soc_codec *codec)
322{
323 struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
324 int ret;
325
326 tas2552->codec = codec;
327
328 ret = regulator_bulk_enable(ARRAY_SIZE(tas2552->supplies),
329 tas2552->supplies);
330
331 if (ret != 0) {
332 dev_err(codec->dev, "Failed to enable supplies: %d\n",
333 ret);
334 return ret;
335 }
336
337 if (tas2552->enable_gpio)
338 gpiod_set_value(tas2552->enable_gpio, 1);
339
340 ret = pm_runtime_get_sync(codec->dev);
341 if (ret < 0) {
342 dev_err(codec->dev, "Enabling device failed: %d\n",
343 ret);
344 goto probe_fail;
345 }
346
347 snd_soc_write(codec, TAS2552_CFG_1, TAS2552_MUTE_MASK |
348 TAS2552_PLL_SRC_BCLK);
349 snd_soc_write(codec, TAS2552_CFG_3, TAS2552_I2S_OUT_SEL |
350 TAS2552_DIN_SRC_SEL_AVG_L_R | TAS2552_88_96KHZ);
351 snd_soc_write(codec, TAS2552_DOUT, TAS2552_PDM_DATA_I);
352 snd_soc_write(codec, TAS2552_OUTPUT_DATA, TAS2552_PDM_DATA_V_I | 0x8);
353 snd_soc_write(codec, TAS2552_PDM_CFG, TAS2552_PDM_BCLK_SEL);
354 snd_soc_write(codec, TAS2552_BOOST_PT_CTRL, TAS2552_APT_DELAY_200 |
355 TAS2552_APT_THRESH_2_1_7);
356
357 ret = regmap_register_patch(tas2552->regmap, tas2552_init_regs,
358 ARRAY_SIZE(tas2552_init_regs));
359 if (ret != 0) {
360 dev_err(codec->dev, "Failed to write init registers: %d\n",
361 ret);
362 goto patch_fail;
363 }
364
365 snd_soc_write(codec, TAS2552_CFG_2, TAS2552_CLASSD_EN |
366 TAS2552_BOOST_EN | TAS2552_APT_EN |
367 TAS2552_LIM_EN);
368 return 0;
369
370patch_fail:
371 pm_runtime_put(codec->dev);
372probe_fail:
373 if (tas2552->enable_gpio)
374 gpiod_set_value(tas2552->enable_gpio, 0);
375
376 regulator_bulk_disable(ARRAY_SIZE(tas2552->supplies),
377 tas2552->supplies);
378 return -EIO;
379}
380
381static int tas2552_codec_remove(struct snd_soc_codec *codec)
382{
383 struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
384
385 pm_runtime_put(codec->dev);
386
387 if (tas2552->enable_gpio)
388 gpiod_set_value(tas2552->enable_gpio, 0);
389
390 return 0;
391};
392
393#ifdef CONFIG_PM
394static int tas2552_suspend(struct snd_soc_codec *codec)
395{
396 struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
397 int ret;
398
399 ret = regulator_bulk_disable(ARRAY_SIZE(tas2552->supplies),
400 tas2552->supplies);
401
402 if (ret != 0)
403 dev_err(codec->dev, "Failed to disable supplies: %d\n",
404 ret);
405 return 0;
406}
407
408static int tas2552_resume(struct snd_soc_codec *codec)
409{
410 struct tas2552_data *tas2552 = snd_soc_codec_get_drvdata(codec);
411 int ret;
412
413 ret = regulator_bulk_enable(ARRAY_SIZE(tas2552->supplies),
414 tas2552->supplies);
415
416 if (ret != 0) {
417 dev_err(codec->dev, "Failed to enable supplies: %d\n",
418 ret);
419 }
420
421 return 0;
422}
423#else
424#define tas2552_suspend NULL
425#define tas2552_resume NULL
426#endif
427
428static struct snd_soc_codec_driver soc_codec_dev_tas2552 = {
429 .probe = tas2552_codec_probe,
430 .remove = tas2552_codec_remove,
431 .suspend = tas2552_suspend,
432 .resume = tas2552_resume,
433 .controls = tas2552_snd_controls,
434 .num_controls = ARRAY_SIZE(tas2552_snd_controls),
435};
436
437static const struct regmap_config tas2552_regmap_config = {
438 .reg_bits = 8,
439 .val_bits = 8,
440
441 .max_register = TAS2552_MAX_REG,
442 .reg_defaults = tas2552_reg_defs,
443 .num_reg_defaults = ARRAY_SIZE(tas2552_reg_defs),
444 .cache_type = REGCACHE_RBTREE,
445};
446
447static int tas2552_probe(struct i2c_client *client,
448 const struct i2c_device_id *id)
449{
450 struct device *dev;
451 struct tas2552_data *data;
452 int ret;
453 int i;
454
455 dev = &client->dev;
456 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
457 if (data == NULL)
458 return -ENOMEM;
459
460 data->enable_gpio = devm_gpiod_get(dev, "enable");
461 if (IS_ERR(data->enable_gpio)) {
462 ret = PTR_ERR(data->enable_gpio);
463 if (ret != -ENOENT && ret != -ENOSYS)
464 return ret;
465
466 data->enable_gpio = NULL;
467 } else {
468 gpiod_direction_output(data->enable_gpio, 0);
469 }
470
471 data->tas2552_client = client;
472 data->regmap = devm_regmap_init_i2c(client, &tas2552_regmap_config);
473 if (IS_ERR(data->regmap)) {
474 ret = PTR_ERR(data->regmap);
475 dev_err(&client->dev, "Failed to allocate register map: %d\n",
476 ret);
477 return ret;
478 }
479
480 for (i = 0; i < ARRAY_SIZE(data->supplies); i++)
481 data->supplies[i].supply = tas2552_supply_names[i];
482
483 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
484 data->supplies);
485 if (ret != 0) {
486 dev_err(dev, "Failed to request supplies: %d\n", ret);
487 return ret;
488 }
489
490 pm_runtime_set_active(&client->dev);
491 pm_runtime_set_autosuspend_delay(&client->dev, 1000);
492 pm_runtime_use_autosuspend(&client->dev);
493 pm_runtime_enable(&client->dev);
494 pm_runtime_mark_last_busy(&client->dev);
495 pm_runtime_put_sync_autosuspend(&client->dev);
496
497 dev_set_drvdata(&client->dev, data);
498
499 ret = snd_soc_register_codec(&client->dev,
500 &soc_codec_dev_tas2552,
501 tas2552_dai, ARRAY_SIZE(tas2552_dai));
502 if (ret < 0)
503 dev_err(&client->dev, "Failed to register codec: %d\n", ret);
504
505 return ret;
506}
507
508static int tas2552_i2c_remove(struct i2c_client *client)
509{
510 snd_soc_unregister_codec(&client->dev);
511 return 0;
512}
513
514static const struct i2c_device_id tas2552_id[] = {
515 { "tas2552", 0 },
516 { }
517};
518MODULE_DEVICE_TABLE(i2c, tas2552_id);
519
520#if IS_ENABLED(CONFIG_OF)
521static const struct of_device_id tas2552_of_match[] = {
522 { .compatible = "ti,tas2552", },
523 {},
524};
525MODULE_DEVICE_TABLE(of, tas2552_of_match);
526#endif
527
528static struct i2c_driver tas2552_i2c_driver = {
529 .driver = {
530 .name = "tas2552",
531 .owner = THIS_MODULE,
532 .of_match_table = of_match_ptr(tas2552_of_match),
533 .pm = &tas2552_pm,
534 },
535 .probe = tas2552_probe,
536 .remove = tas2552_i2c_remove,
537 .id_table = tas2552_id,
538};
539
540module_i2c_driver(tas2552_i2c_driver);
541
542MODULE_AUTHOR("Dan Muprhy <dmurphy@ti.com>");
543MODULE_DESCRIPTION("TAS2552 Audio amplifier driver");
544MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/tas2552.h b/sound/soc/codecs/tas2552.h
new file mode 100644
index 000000000000..6cea8f31bf88
--- /dev/null
+++ b/sound/soc/codecs/tas2552.h
@@ -0,0 +1,129 @@
1/*
2 * tas2552.h - ALSA SoC Texas Instruments TAS2552 Mono Audio Amplifier
3 *
4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Author: Dan Murphy <dmurphy@ti.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 */
17
18#ifndef __TAS2552_H__
19#define __TAS2552_H__
20
21/* Register Address Map */
22#define TAS2552_DEVICE_STATUS 0x00
23#define TAS2552_CFG_1 0x01
24#define TAS2552_CFG_2 0x02
25#define TAS2552_CFG_3 0x03
26#define TAS2552_DOUT 0x04
27#define TAS2552_SER_CTRL_1 0x05
28#define TAS2552_SER_CTRL_2 0x06
29#define TAS2552_OUTPUT_DATA 0x07
30#define TAS2552_PLL_CTRL_1 0x08
31#define TAS2552_PLL_CTRL_2 0x09
32#define TAS2552_PLL_CTRL_3 0x0a
33#define TAS2552_BTIP 0x0b
34#define TAS2552_BTS_CTRL 0x0c
35#define TAS2552_RESERVED_0D 0x0d
36#define TAS2552_LIMIT_RATE_HYS 0x0e
37#define TAS2552_LIMIT_RELEASE 0x0f
38#define TAS2552_LIMIT_INT_COUNT 0x10
39#define TAS2552_PDM_CFG 0x11
40#define TAS2552_PGA_GAIN 0x12
41#define TAS2552_EDGE_RATE_CTRL 0x13
42#define TAS2552_BOOST_PT_CTRL 0x14
43#define TAS2552_VER_NUM 0x16
44#define TAS2552_VBAT_DATA 0x19
45#define TAS2552_MAX_REG 0x20
46
47/* CFG1 Register Masks */
48#define TAS2552_MUTE_MASK (1 << 2)
49#define TAS2552_SWS_MASK (1 << 1)
50#define TAS2552_WCLK_MASK 0x07
51#define TAS2552_CLASSD_EN_MASK (1 << 7)
52
53/* CFG2 Register Masks */
54#define TAS2552_CLASSD_EN (1 << 7)
55#define TAS2552_BOOST_EN (1 << 6)
56#define TAS2552_APT_EN (1 << 5)
57#define TAS2552_PLL_ENABLE (1 << 3)
58#define TAS2552_LIM_EN (1 << 2)
59#define TAS2552_IVSENSE_EN (1 << 1)
60
61/* CFG3 Register Masks */
62#define TAS2552_WORD_CLK_MASK (1 << 7)
63#define TAS2552_BIT_CLK_MASK (1 << 6)
64#define TAS2552_DATA_FORMAT_MASK (0x11 << 2)
65
66#define TAS2552_DAIFMT_I2S_MASK 0xf3
67#define TAS2552_DAIFMT_DSP (1 << 3)
68#define TAS2552_DAIFMT_RIGHT_J (1 << 4)
69#define TAS2552_DAIFMT_LEFT_J (0x11 << 3)
70
71#define TAS2552_PLL_SRC_MCLK 0x00
72#define TAS2552_PLL_SRC_BCLK (1 << 3)
73#define TAS2552_PLL_SRC_IVCLKIN (1 << 4)
74#define TAS2552_PLL_SRC_1_8_FIXED (0x11 << 3)
75
76#define TAS2552_DIN_SRC_SEL_MUTED 0x00
77#define TAS2552_DIN_SRC_SEL_LEFT (1 << 4)
78#define TAS2552_DIN_SRC_SEL_RIGHT (1 << 5)
79#define TAS2552_DIN_SRC_SEL_AVG_L_R (0x11 << 4)
80
81#define TAS2552_PDM_IN_SEL (1 << 5)
82#define TAS2552_I2S_OUT_SEL (1 << 6)
83#define TAS2552_ANALOG_IN_SEL (1 << 7)
84
85/* CFG3 WCLK Dividers */
86#define TAS2552_8KHZ 0x00
87#define TAS2552_11_12KHZ (1 << 1)
88#define TAS2552_16KHZ (1 << 2)
89#define TAS2552_22_24KHZ (1 << 3)
90#define TAS2552_32KHZ (1 << 4)
91#define TAS2552_44_48KHZ (1 << 5)
92#define TAS2552_88_96KHZ (1 << 6)
93#define TAS2552_176_192KHZ (1 << 7)
94
95/* OUTPUT_DATA register */
96#define TAS2552_PDM_DATA_I 0x00
97#define TAS2552_PDM_DATA_V (1 << 6)
98#define TAS2552_PDM_DATA_I_V (1 << 7)
99#define TAS2552_PDM_DATA_V_I (0x11 << 6)
100
101/* PDM CFG Register */
102#define TAS2552_PDM_DATA_ES_RISE 0x4
103
104#define TAS2552_PDM_PLL_CLK_SEL 0x00
105#define TAS2552_PDM_IV_CLK_SEL (1 << 1)
106#define TAS2552_PDM_BCLK_SEL (1 << 2)
107#define TAS2552_PDM_MCLK_SEL (1 << 3)
108
109/* Boost pass-through register */
110#define TAS2552_APT_DELAY_50 0x00
111#define TAS2552_APT_DELAY_75 (1 << 1)
112#define TAS2552_APT_DELAY_125 (1 << 2)
113#define TAS2552_APT_DELAY_200 (1 << 3)
114
115#define TAS2552_APT_THRESH_2_5 0x00
116#define TAS2552_APT_THRESH_1_7 (1 << 3)
117#define TAS2552_APT_THRESH_1_4_1_1 (1 << 4)
118#define TAS2552_APT_THRESH_2_1_7 (0x11 << 2)
119
120/* PLL Control Register */
121#define TAS2552_245MHZ_CLK 24576000
122#define TAS2552_225MHZ_CLK 22579200
123#define TAS2552_PLL_J_MASK 0x7f
124#define TAS2552_PLL_D_UPPER_MASK 0x3f
125#define TAS2552_PLL_D_LOWER_MASK 0xff
126#define TAS2552_PLL_BYPASS_MASK 0x80
127#define TAS2552_PLL_BYPASS 0x80
128
129#endif
diff --git a/sound/soc/codecs/tas5086.c b/sound/soc/codecs/tas5086.c
index d48491a4a19d..249ef5c4c762 100644
--- a/sound/soc/codecs/tas5086.c
+++ b/sound/soc/codecs/tas5086.c
@@ -36,6 +36,7 @@
36#include <linux/gpio.h> 36#include <linux/gpio.h>
37#include <linux/i2c.h> 37#include <linux/i2c.h>
38#include <linux/regmap.h> 38#include <linux/regmap.h>
39#include <linux/regulator/consumer.h>
39#include <linux/spi/spi.h> 40#include <linux/spi/spi.h>
40#include <linux/of.h> 41#include <linux/of.h>
41#include <linux/of_device.h> 42#include <linux/of_device.h>
@@ -240,6 +241,10 @@ static int tas5086_reg_read(void *context, unsigned int reg,
240 return 0; 241 return 0;
241} 242}
242 243
244static const char * const supply_names[] = {
245 "dvdd", "avdd"
246};
247
243struct tas5086_private { 248struct tas5086_private {
244 struct regmap *regmap; 249 struct regmap *regmap;
245 unsigned int mclk, sclk; 250 unsigned int mclk, sclk;
@@ -251,6 +256,7 @@ struct tas5086_private {
251 int rate; 256 int rate;
252 /* GPIO driving Reset pin, if any */ 257 /* GPIO driving Reset pin, if any */
253 int gpio_nreset; 258 int gpio_nreset;
259 struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
254}; 260};
255 261
256static int tas5086_deemph[] = { 0, 32000, 44100, 48000 }; 262static int tas5086_deemph[] = { 0, 32000, 44100, 48000 };
@@ -419,14 +425,14 @@ static int tas5086_hw_params(struct snd_pcm_substream *substream,
419 } 425 }
420 426
421 /* ... then add the offset for the sample bit depth. */ 427 /* ... then add the offset for the sample bit depth. */
422 switch (params_format(params)) { 428 switch (params_width(params)) {
423 case SNDRV_PCM_FORMAT_S16_LE: 429 case 16:
424 val += 0; 430 val += 0;
425 break; 431 break;
426 case SNDRV_PCM_FORMAT_S20_3LE: 432 case 20:
427 val += 1; 433 val += 1;
428 break; 434 break;
429 case SNDRV_PCM_FORMAT_S24_3LE: 435 case 24:
430 val += 2; 436 val += 2;
431 break; 437 break;
432 default: 438 default:
@@ -773,6 +779,8 @@ static int tas5086_soc_suspend(struct snd_soc_codec *codec)
773 if (ret < 0) 779 if (ret < 0)
774 return ret; 780 return ret;
775 781
782 regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
783
776 return 0; 784 return 0;
777} 785}
778 786
@@ -781,6 +789,10 @@ static int tas5086_soc_resume(struct snd_soc_codec *codec)
781 struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); 789 struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
782 int ret; 790 int ret;
783 791
792 ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
793 if (ret < 0)
794 return ret;
795
784 tas5086_reset(priv); 796 tas5086_reset(priv);
785 regcache_mark_dirty(priv->regmap); 797 regcache_mark_dirty(priv->regmap);
786 798
@@ -812,6 +824,12 @@ static int tas5086_probe(struct snd_soc_codec *codec)
812 struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec); 824 struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
813 int i, ret; 825 int i, ret;
814 826
827 ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
828 if (ret < 0) {
829 dev_err(codec->dev, "Failed to enable regulators: %d\n", ret);
830 return ret;
831 }
832
815 priv->pwm_start_mid_z = 0; 833 priv->pwm_start_mid_z = 0;
816 priv->charge_period = 1300000; /* hardware default is 1300 ms */ 834 priv->charge_period = 1300000; /* hardware default is 1300 ms */
817 835
@@ -832,16 +850,22 @@ static int tas5086_probe(struct snd_soc_codec *codec)
832 } 850 }
833 } 851 }
834 852
853 tas5086_reset(priv);
835 ret = tas5086_init(codec->dev, priv); 854 ret = tas5086_init(codec->dev, priv);
836 if (ret < 0) 855 if (ret < 0)
837 return ret; 856 goto exit_disable_regulators;
838 857
839 /* set master volume to 0 dB */ 858 /* set master volume to 0 dB */
840 ret = regmap_write(priv->regmap, TAS5086_MASTER_VOL, 0x30); 859 ret = regmap_write(priv->regmap, TAS5086_MASTER_VOL, 0x30);
841 if (ret < 0) 860 if (ret < 0)
842 return ret; 861 goto exit_disable_regulators;
843 862
844 return 0; 863 return 0;
864
865exit_disable_regulators:
866 regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
867
868 return ret;
845} 869}
846 870
847static int tas5086_remove(struct snd_soc_codec *codec) 871static int tas5086_remove(struct snd_soc_codec *codec)
@@ -852,6 +876,8 @@ static int tas5086_remove(struct snd_soc_codec *codec)
852 /* Set codec to the reset state */ 876 /* Set codec to the reset state */
853 gpio_set_value(priv->gpio_nreset, 0); 877 gpio_set_value(priv->gpio_nreset, 0);
854 878
879 regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
880
855 return 0; 881 return 0;
856}; 882};
857 883
@@ -900,6 +926,16 @@ static int tas5086_i2c_probe(struct i2c_client *i2c,
900 if (!priv) 926 if (!priv)
901 return -ENOMEM; 927 return -ENOMEM;
902 928
929 for (i = 0; i < ARRAY_SIZE(supply_names); i++)
930 priv->supplies[i].supply = supply_names[i];
931
932 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(priv->supplies),
933 priv->supplies);
934 if (ret < 0) {
935 dev_err(dev, "Failed to get regulators: %d\n", ret);
936 return ret;
937 }
938
903 priv->regmap = devm_regmap_init(dev, NULL, i2c, &tas5086_regmap); 939 priv->regmap = devm_regmap_init(dev, NULL, i2c, &tas5086_regmap);
904 if (IS_ERR(priv->regmap)) { 940 if (IS_ERR(priv->regmap)) {
905 ret = PTR_ERR(priv->regmap); 941 ret = PTR_ERR(priv->regmap);
@@ -919,21 +955,34 @@ static int tas5086_i2c_probe(struct i2c_client *i2c,
919 gpio_nreset = -EINVAL; 955 gpio_nreset = -EINVAL;
920 956
921 priv->gpio_nreset = gpio_nreset; 957 priv->gpio_nreset = gpio_nreset;
958
959 ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
960 if (ret < 0) {
961 dev_err(dev, "Failed to enable regulators: %d\n", ret);
962 return ret;
963 }
964
922 tas5086_reset(priv); 965 tas5086_reset(priv);
923 966
924 /* The TAS5086 always returns 0x03 in its TAS5086_DEV_ID register */ 967 /* The TAS5086 always returns 0x03 in its TAS5086_DEV_ID register */
925 ret = regmap_read(priv->regmap, TAS5086_DEV_ID, &i); 968 ret = regmap_read(priv->regmap, TAS5086_DEV_ID, &i);
926 if (ret < 0) 969 if (ret == 0 && i != 0x3) {
927 return ret;
928
929 if (i != 0x3) {
930 dev_err(dev, 970 dev_err(dev,
931 "Failed to identify TAS5086 codec (got %02x)\n", i); 971 "Failed to identify TAS5086 codec (got %02x)\n", i);
932 return -ENODEV; 972 ret = -ENODEV;
933 } 973 }
934 974
935 return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_tas5086, 975 /*
936 &tas5086_dai, 1); 976 * The chip has been identified, so we can turn off the power
977 * again until the dai link is set up.
978 */
979 regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
980
981 if (ret == 0)
982 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_tas5086,
983 &tas5086_dai, 1);
984
985 return ret;
937} 986}
938 987
939static int tas5086_i2c_remove(struct i2c_client *i2c) 988static int tas5086_i2c_remove(struct i2c_client *i2c)
diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c
index 686b8b85b956..d67167920c2f 100644
--- a/sound/soc/codecs/tlv320aic23.c
+++ b/sound/soc/codecs/tlv320aic23.c
@@ -364,16 +364,16 @@ static int tlv320aic23_hw_params(struct snd_pcm_substream *substream,
364 364
365 iface_reg = snd_soc_read(codec, TLV320AIC23_DIGT_FMT) & ~(0x03 << 2); 365 iface_reg = snd_soc_read(codec, TLV320AIC23_DIGT_FMT) & ~(0x03 << 2);
366 366
367 switch (params_format(params)) { 367 switch (params_width(params)) {
368 case SNDRV_PCM_FORMAT_S16_LE: 368 case 16:
369 break; 369 break;
370 case SNDRV_PCM_FORMAT_S20_3LE: 370 case 20:
371 iface_reg |= (0x01 << 2); 371 iface_reg |= (0x01 << 2);
372 break; 372 break;
373 case SNDRV_PCM_FORMAT_S24_LE: 373 case 24:
374 iface_reg |= (0x02 << 2); 374 iface_reg |= (0x02 << 2);
375 break; 375 break;
376 case SNDRV_PCM_FORMAT_S32_LE: 376 case 32:
377 iface_reg |= (0x03 << 2); 377 iface_reg |= (0x03 << 2);
378 break; 378 break;
379 } 379 }
diff --git a/sound/soc/codecs/tlv320aic26.c b/sound/soc/codecs/tlv320aic26.c
index 43069de3d56a..620ab9ea1ef0 100644
--- a/sound/soc/codecs/tlv320aic26.c
+++ b/sound/soc/codecs/tlv320aic26.c
@@ -71,8 +71,8 @@ static int aic26_hw_params(struct snd_pcm_substream *substream,
71 71
72 dev_dbg(&aic26->spi->dev, "aic26_hw_params(substream=%p, params=%p)\n", 72 dev_dbg(&aic26->spi->dev, "aic26_hw_params(substream=%p, params=%p)\n",
73 substream, params); 73 substream, params);
74 dev_dbg(&aic26->spi->dev, "rate=%i format=%i\n", params_rate(params), 74 dev_dbg(&aic26->spi->dev, "rate=%i width=%d\n", params_rate(params),
75 params_format(params)); 75 params_width(params));
76 76
77 switch (params_rate(params)) { 77 switch (params_rate(params)) {
78 case 8000: fsref = 48000; divisor = AIC26_DIV_6; break; 78 case 8000: fsref = 48000; divisor = AIC26_DIV_6; break;
@@ -89,11 +89,11 @@ static int aic26_hw_params(struct snd_pcm_substream *substream,
89 } 89 }
90 90
91 /* select data word length */ 91 /* select data word length */
92 switch (params_format(params)) { 92 switch (params_width(params)) {
93 case SNDRV_PCM_FORMAT_S8: wlen = AIC26_WLEN_16; break; 93 case 8: wlen = AIC26_WLEN_16; break;
94 case SNDRV_PCM_FORMAT_S16_BE: wlen = AIC26_WLEN_16; break; 94 case 16: wlen = AIC26_WLEN_16; break;
95 case SNDRV_PCM_FORMAT_S24_BE: wlen = AIC26_WLEN_24; break; 95 case 24: wlen = AIC26_WLEN_24; break;
96 case SNDRV_PCM_FORMAT_S32_BE: wlen = AIC26_WLEN_32; break; 96 case 32: wlen = AIC26_WLEN_32; break;
97 default: 97 default:
98 dev_dbg(&aic26->spi->dev, "bad format\n"); return -EINVAL; 98 dev_dbg(&aic26->spi->dev, "bad format\n"); return -EINVAL;
99 } 99 }
diff --git a/sound/soc/codecs/tlv320aic31xx.c b/sound/soc/codecs/tlv320aic31xx.c
index 23419109ecac..0f64c7890eed 100644
--- a/sound/soc/codecs/tlv320aic31xx.c
+++ b/sound/soc/codecs/tlv320aic31xx.c
@@ -249,17 +249,16 @@ static const char * const mic_select_text[] = {
249 "Off", "FFR 10 Ohm", "FFR 20 Ohm", "FFR 40 Ohm" 249 "Off", "FFR 10 Ohm", "FFR 20 Ohm", "FFR 40 Ohm"
250}; 250};
251 251
252static const 252static SOC_ENUM_SINGLE_DECL(mic1lp_p_enum, AIC31XX_MICPGAPI, 6,
253SOC_ENUM_SINGLE_DECL(mic1lp_p_enum, AIC31XX_MICPGAPI, 6, mic_select_text); 253 mic_select_text);
254static const 254static SOC_ENUM_SINGLE_DECL(mic1rp_p_enum, AIC31XX_MICPGAPI, 4,
255SOC_ENUM_SINGLE_DECL(mic1rp_p_enum, AIC31XX_MICPGAPI, 4, mic_select_text); 255 mic_select_text);
256static const 256static SOC_ENUM_SINGLE_DECL(mic1lm_p_enum, AIC31XX_MICPGAPI, 2,
257SOC_ENUM_SINGLE_DECL(mic1lm_p_enum, AIC31XX_MICPGAPI, 2, mic_select_text); 257 mic_select_text);
258 258
259static const 259static SOC_ENUM_SINGLE_DECL(cm_m_enum, AIC31XX_MICPGAMI, 6, mic_select_text);
260SOC_ENUM_SINGLE_DECL(cm_m_enum, AIC31XX_MICPGAMI, 6, mic_select_text); 260static SOC_ENUM_SINGLE_DECL(mic1lm_m_enum, AIC31XX_MICPGAMI, 4,
261static const 261 mic_select_text);
262SOC_ENUM_SINGLE_DECL(mic1lm_m_enum, AIC31XX_MICPGAMI, 4, mic_select_text);
263 262
264static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6350, 50, 0); 263static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6350, 50, 0);
265static const DECLARE_TLV_DB_SCALE(adc_fgain_tlv, 0, 10, 0); 264static const DECLARE_TLV_DB_SCALE(adc_fgain_tlv, 0, 10, 0);
@@ -329,6 +328,7 @@ static int aic31xx_wait_bits(struct aic31xx_priv *aic31xx, unsigned int reg,
329 unsigned int bits; 328 unsigned int bits;
330 int counter = count; 329 int counter = count;
331 int ret = regmap_read(aic31xx->regmap, reg, &bits); 330 int ret = regmap_read(aic31xx->regmap, reg, &bits);
331
332 while ((bits & mask) != wbits && counter && !ret) { 332 while ((bits & mask) != wbits && counter && !ret) {
333 usleep_range(sleep, sleep * 2); 333 usleep_range(sleep, sleep * 2);
334 ret = regmap_read(aic31xx->regmap, reg, &bits); 334 ret = regmap_read(aic31xx->regmap, reg, &bits);
@@ -435,6 +435,7 @@ static int mic_bias_event(struct snd_soc_dapm_widget *w,
435{ 435{
436 struct snd_soc_codec *codec = w->codec; 436 struct snd_soc_codec *codec = w->codec;
437 struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); 437 struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec);
438
438 switch (event) { 439 switch (event) {
439 case SND_SOC_DAPM_POST_PMU: 440 case SND_SOC_DAPM_POST_PMU:
440 /* change mic bias voltage to user defined */ 441 /* change mic bias voltage to user defined */
@@ -759,8 +760,8 @@ static int aic31xx_hw_params(struct snd_pcm_substream *substream,
759 struct snd_soc_codec *codec = dai->codec; 760 struct snd_soc_codec *codec = dai->codec;
760 u8 data = 0; 761 u8 data = 0;
761 762
762 dev_dbg(codec->dev, "## %s: format %d width %d rate %d\n", 763 dev_dbg(codec->dev, "## %s: width %d rate %d\n",
763 __func__, params_format(params), params_width(params), 764 __func__, params_width(params),
764 params_rate(params)); 765 params_rate(params));
765 766
766 switch (params_width(params)) { 767 switch (params_width(params)) {
@@ -779,8 +780,8 @@ static int aic31xx_hw_params(struct snd_pcm_substream *substream,
779 AIC31XX_IFACE1_DATALEN_SHIFT); 780 AIC31XX_IFACE1_DATALEN_SHIFT);
780 break; 781 break;
781 default: 782 default:
782 dev_err(codec->dev, "%s: Unsupported format %d\n", 783 dev_err(codec->dev, "%s: Unsupported width %d\n",
783 __func__, params_format(params)); 784 __func__, params_width(params));
784 return -EINVAL; 785 return -EINVAL;
785 } 786 }
786 787
@@ -1178,7 +1179,7 @@ static void aic31xx_pdata_from_of(struct aic31xx_priv *aic31xx)
1178} 1179}
1179#endif /* CONFIG_OF */ 1180#endif /* CONFIG_OF */
1180 1181
1181static void aic31xx_device_init(struct aic31xx_priv *aic31xx) 1182static int aic31xx_device_init(struct aic31xx_priv *aic31xx)
1182{ 1183{
1183 int ret, i; 1184 int ret, i;
1184 1185
@@ -1197,7 +1198,7 @@ static void aic31xx_device_init(struct aic31xx_priv *aic31xx)
1197 "aic31xx-reset-pin"); 1198 "aic31xx-reset-pin");
1198 if (ret < 0) { 1199 if (ret < 0) {
1199 dev_err(aic31xx->dev, "not able to acquire gpio\n"); 1200 dev_err(aic31xx->dev, "not able to acquire gpio\n");
1200 return; 1201 return ret;
1201 } 1202 }
1202 } 1203 }
1203 1204
@@ -1210,6 +1211,7 @@ static void aic31xx_device_init(struct aic31xx_priv *aic31xx)
1210 if (ret != 0) 1211 if (ret != 0)
1211 dev_err(aic31xx->dev, "Failed to request supplies: %d\n", ret); 1212 dev_err(aic31xx->dev, "Failed to request supplies: %d\n", ret);
1212 1213
1214 return ret;
1213} 1215}
1214 1216
1215static int aic31xx_i2c_probe(struct i2c_client *i2c, 1217static int aic31xx_i2c_probe(struct i2c_client *i2c,
@@ -1239,7 +1241,9 @@ static int aic31xx_i2c_probe(struct i2c_client *i2c,
1239 1241
1240 aic31xx->pdata.codec_type = id->driver_data; 1242 aic31xx->pdata.codec_type = id->driver_data;
1241 1243
1242 aic31xx_device_init(aic31xx); 1244 ret = aic31xx_device_init(aic31xx);
1245 if (ret)
1246 return ret;
1243 1247
1244 return snd_soc_register_codec(&i2c->dev, &soc_codec_driver_aic31xx, 1248 return snd_soc_register_codec(&i2c->dev, &soc_codec_driver_aic31xx,
1245 aic31xx_dai_driver, 1249 aic31xx_dai_driver,
diff --git a/sound/soc/codecs/tlv320aic32x4.c b/sound/soc/codecs/tlv320aic32x4.c
index 1d9b117345a3..6ea662db2410 100644
--- a/sound/soc/codecs/tlv320aic32x4.c
+++ b/sound/soc/codecs/tlv320aic32x4.c
@@ -450,16 +450,16 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream,
450 450
451 data = snd_soc_read(codec, AIC32X4_IFACE1); 451 data = snd_soc_read(codec, AIC32X4_IFACE1);
452 data = data & ~(3 << 4); 452 data = data & ~(3 << 4);
453 switch (params_format(params)) { 453 switch (params_width(params)) {
454 case SNDRV_PCM_FORMAT_S16_LE: 454 case 16:
455 break; 455 break;
456 case SNDRV_PCM_FORMAT_S20_3LE: 456 case 20:
457 data |= (AIC32X4_WORD_LEN_20BITS << AIC32X4_DOSRMSB_SHIFT); 457 data |= (AIC32X4_WORD_LEN_20BITS << AIC32X4_DOSRMSB_SHIFT);
458 break; 458 break;
459 case SNDRV_PCM_FORMAT_S24_LE: 459 case 24:
460 data |= (AIC32X4_WORD_LEN_24BITS << AIC32X4_DOSRMSB_SHIFT); 460 data |= (AIC32X4_WORD_LEN_24BITS << AIC32X4_DOSRMSB_SHIFT);
461 break; 461 break;
462 case SNDRV_PCM_FORMAT_S32_LE: 462 case 32:
463 data |= (AIC32X4_WORD_LEN_32BITS << AIC32X4_DOSRMSB_SHIFT); 463 data |= (AIC32X4_WORD_LEN_32BITS << AIC32X4_DOSRMSB_SHIFT);
464 break; 464 break;
465 } 465 }
@@ -626,32 +626,33 @@ static int aic32x4_probe(struct snd_soc_codec *codec)
626 snd_soc_write(codec, AIC32X4_MICBIAS, AIC32X4_MICBIAS_LDOIN | 626 snd_soc_write(codec, AIC32X4_MICBIAS, AIC32X4_MICBIAS_LDOIN |
627 AIC32X4_MICBIAS_2075V); 627 AIC32X4_MICBIAS_2075V);
628 } 628 }
629 if (aic32x4->power_cfg & AIC32X4_PWR_AVDD_DVDD_WEAK_DISABLE) { 629 if (aic32x4->power_cfg & AIC32X4_PWR_AVDD_DVDD_WEAK_DISABLE)
630 snd_soc_write(codec, AIC32X4_PWRCFG, AIC32X4_AVDDWEAKDISABLE); 630 snd_soc_write(codec, AIC32X4_PWRCFG, AIC32X4_AVDDWEAKDISABLE);
631 }
632 631
633 tmp_reg = (aic32x4->power_cfg & AIC32X4_PWR_AIC32X4_LDO_ENABLE) ? 632 tmp_reg = (aic32x4->power_cfg & AIC32X4_PWR_AIC32X4_LDO_ENABLE) ?
634 AIC32X4_LDOCTLEN : 0; 633 AIC32X4_LDOCTLEN : 0;
635 snd_soc_write(codec, AIC32X4_LDOCTL, tmp_reg); 634 snd_soc_write(codec, AIC32X4_LDOCTL, tmp_reg);
636 635
637 tmp_reg = snd_soc_read(codec, AIC32X4_CMMODE); 636 tmp_reg = snd_soc_read(codec, AIC32X4_CMMODE);
638 if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_LDOIN_RANGE_18_36) { 637 if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_LDOIN_RANGE_18_36)
639 tmp_reg |= AIC32X4_LDOIN_18_36; 638 tmp_reg |= AIC32X4_LDOIN_18_36;
640 } 639 if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_HP_LDOIN_POWERED)
641 if (aic32x4->power_cfg & AIC32X4_PWR_CMMODE_HP_LDOIN_POWERED) {
642 tmp_reg |= AIC32X4_LDOIN2HP; 640 tmp_reg |= AIC32X4_LDOIN2HP;
643 }
644 snd_soc_write(codec, AIC32X4_CMMODE, tmp_reg); 641 snd_soc_write(codec, AIC32X4_CMMODE, tmp_reg);
645 642
646 /* Mic PGA routing */ 643 /* Mic PGA routing */
647 if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K) 644 if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_LMIC_IN2R_10K)
648 snd_soc_write(codec, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_IN2R_10K); 645 snd_soc_write(codec, AIC32X4_LMICPGANIN,
646 AIC32X4_LMICPGANIN_IN2R_10K);
649 else 647 else
650 snd_soc_write(codec, AIC32X4_LMICPGANIN, AIC32X4_LMICPGANIN_CM1L_10K); 648 snd_soc_write(codec, AIC32X4_LMICPGANIN,
649 AIC32X4_LMICPGANIN_CM1L_10K);
651 if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_RMIC_IN1L_10K) 650 if (aic32x4->micpga_routing & AIC32X4_MICPGA_ROUTE_RMIC_IN1L_10K)
652 snd_soc_write(codec, AIC32X4_RMICPGANIN, AIC32X4_RMICPGANIN_IN1L_10K); 651 snd_soc_write(codec, AIC32X4_RMICPGANIN,
652 AIC32X4_RMICPGANIN_IN1L_10K);
653 else 653 else
654 snd_soc_write(codec, AIC32X4_RMICPGANIN, AIC32X4_RMICPGANIN_CM1R_10K); 654 snd_soc_write(codec, AIC32X4_RMICPGANIN,
655 AIC32X4_RMICPGANIN_CM1R_10K);
655 656
656 aic32x4_set_bias_level(codec, SND_SOC_BIAS_STANDBY); 657 aic32x4_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
657 658
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
index 5360772bc1ad..64f179ee9834 100644
--- a/sound/soc/codecs/tlv320aic3x.c
+++ b/sound/soc/codecs/tlv320aic3x.c
@@ -873,16 +873,16 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream,
873 873
874 /* select data word length */ 874 /* select data word length */
875 data = snd_soc_read(codec, AIC3X_ASD_INTF_CTRLB) & (~(0x3 << 4)); 875 data = snd_soc_read(codec, AIC3X_ASD_INTF_CTRLB) & (~(0x3 << 4));
876 switch (params_format(params)) { 876 switch (params_width(params)) {
877 case SNDRV_PCM_FORMAT_S16_LE: 877 case 16:
878 break; 878 break;
879 case SNDRV_PCM_FORMAT_S20_3LE: 879 case 20:
880 data |= (0x01 << 4); 880 data |= (0x01 << 4);
881 break; 881 break;
882 case SNDRV_PCM_FORMAT_S24_3LE: 882 case 24:
883 data |= (0x02 << 4); 883 data |= (0x02 << 4);
884 break; 884 break;
885 case SNDRV_PCM_FORMAT_S32_LE: 885 case 32:
886 data |= (0x03 << 4); 886 data |= (0x03 << 4);
887 break; 887 break;
888 } 888 }
@@ -1194,7 +1194,8 @@ static int aic3x_set_bias_level(struct snd_soc_codec *codec,
1194 1194
1195#define AIC3X_RATES SNDRV_PCM_RATE_8000_96000 1195#define AIC3X_RATES SNDRV_PCM_RATE_8000_96000
1196#define AIC3X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 1196#define AIC3X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
1197 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE) 1197 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
1198 SNDRV_PCM_FMTBIT_S32_LE)
1198 1199
1199static const struct snd_soc_dai_ops aic3x_dai_ops = { 1200static const struct snd_soc_dai_ops aic3x_dai_ops = {
1200 .hw_params = aic3x_hw_params, 1201 .hw_params = aic3x_hw_params,
@@ -1477,10 +1478,8 @@ static int aic3x_i2c_probe(struct i2c_client *i2c,
1477 u32 value; 1478 u32 value;
1478 1479
1479 aic3x = devm_kzalloc(&i2c->dev, sizeof(struct aic3x_priv), GFP_KERNEL); 1480 aic3x = devm_kzalloc(&i2c->dev, sizeof(struct aic3x_priv), GFP_KERNEL);
1480 if (aic3x == NULL) { 1481 if (!aic3x)
1481 dev_err(&i2c->dev, "failed to create private data\n");
1482 return -ENOMEM; 1482 return -ENOMEM;
1483 }
1484 1483
1485 aic3x->regmap = devm_regmap_init_i2c(i2c, &aic3x_regmap); 1484 aic3x->regmap = devm_regmap_init_i2c(i2c, &aic3x_regmap);
1486 if (IS_ERR(aic3x->regmap)) { 1485 if (IS_ERR(aic3x->regmap)) {
@@ -1498,10 +1497,8 @@ static int aic3x_i2c_probe(struct i2c_client *i2c,
1498 } else if (np) { 1497 } else if (np) {
1499 ai3x_setup = devm_kzalloc(&i2c->dev, sizeof(*ai3x_setup), 1498 ai3x_setup = devm_kzalloc(&i2c->dev, sizeof(*ai3x_setup),
1500 GFP_KERNEL); 1499 GFP_KERNEL);
1501 if (ai3x_setup == NULL) { 1500 if (!ai3x_setup)
1502 dev_err(&i2c->dev, "failed to create private data\n");
1503 return -ENOMEM; 1501 return -ENOMEM;
1504 }
1505 1502
1506 ret = of_get_named_gpio(np, "gpio-reset", 0); 1503 ret = of_get_named_gpio(np, "gpio-reset", 0);
1507 if (ret >= 0) 1504 if (ret >= 0)
diff --git a/sound/soc/codecs/tlv320dac33.c b/sound/soc/codecs/tlv320dac33.c
index df3a7506c023..e21ed934bdbf 100644
--- a/sound/soc/codecs/tlv320dac33.c
+++ b/sound/soc/codecs/tlv320dac33.c
@@ -832,18 +832,18 @@ static int dac33_hw_params(struct snd_pcm_substream *substream,
832 return -EINVAL; 832 return -EINVAL;
833 } 833 }
834 834
835 switch (params_format(params)) { 835 switch (params_width(params)) {
836 case SNDRV_PCM_FORMAT_S16_LE: 836 case 16:
837 dac33->fifo_size = DAC33_FIFO_SIZE_16BIT; 837 dac33->fifo_size = DAC33_FIFO_SIZE_16BIT;
838 dac33->burst_rate = CALC_BURST_RATE(dac33->burst_bclkdiv, 32); 838 dac33->burst_rate = CALC_BURST_RATE(dac33->burst_bclkdiv, 32);
839 break; 839 break;
840 case SNDRV_PCM_FORMAT_S32_LE: 840 case 32:
841 dac33->fifo_size = DAC33_FIFO_SIZE_24BIT; 841 dac33->fifo_size = DAC33_FIFO_SIZE_24BIT;
842 dac33->burst_rate = CALC_BURST_RATE(dac33->burst_bclkdiv, 64); 842 dac33->burst_rate = CALC_BURST_RATE(dac33->burst_bclkdiv, 64);
843 break; 843 break;
844 default: 844 default:
845 dev_err(codec->dev, "unsupported format %d\n", 845 dev_err(codec->dev, "unsupported width %d\n",
846 params_format(params)); 846 params_width(params));
847 return -EINVAL; 847 return -EINVAL;
848 } 848 }
849 849
@@ -1404,7 +1404,7 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
1404 if (dac33->irq >= 0) { 1404 if (dac33->irq >= 0) {
1405 ret = request_irq(dac33->irq, dac33_interrupt_handler, 1405 ret = request_irq(dac33->irq, dac33_interrupt_handler,
1406 IRQF_TRIGGER_RISING, 1406 IRQF_TRIGGER_RISING,
1407 codec->name, codec); 1407 codec->component.name, codec);
1408 if (ret < 0) { 1408 if (ret < 0) {
1409 dev_err(codec->dev, "Could not request IRQ%d (%d)\n", 1409 dev_err(codec->dev, "Could not request IRQ%d (%d)\n",
1410 dac33->irq, ret); 1410 dac33->irq, ret);
diff --git a/sound/soc/codecs/tpa6130a2.c b/sound/soc/codecs/tpa6130a2.c
index 8fc5a647453b..6fac9e034c48 100644
--- a/sound/soc/codecs/tpa6130a2.c
+++ b/sound/soc/codecs/tpa6130a2.c
@@ -381,10 +381,8 @@ static int tpa6130a2_probe(struct i2c_client *client,
381 dev = &client->dev; 381 dev = &client->dev;
382 382
383 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); 383 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
384 if (data == NULL) { 384 if (!data)
385 dev_err(dev, "Can not allocate memory\n");
386 return -ENOMEM; 385 return -ENOMEM;
387 }
388 386
389 if (pdata) { 387 if (pdata) {
390 data->power_gpio = pdata->power_gpio; 388 data->power_gpio = pdata->power_gpio;
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
index 69e12a311ba2..b6b0cb399599 100644
--- a/sound/soc/codecs/twl4030.c
+++ b/sound/soc/codecs/twl4030.c
@@ -344,17 +344,16 @@ static void twl4030_init_chip(struct snd_soc_codec *codec)
344static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable) 344static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable)
345{ 345{
346 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec); 346 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
347 int status = -1;
348 347
349 if (enable) { 348 if (enable) {
350 twl4030->apll_enabled++; 349 twl4030->apll_enabled++;
351 if (twl4030->apll_enabled == 1) 350 if (twl4030->apll_enabled == 1)
352 status = twl4030_audio_enable_resource( 351 twl4030_audio_enable_resource(
353 TWL4030_AUDIO_RES_APLL); 352 TWL4030_AUDIO_RES_APLL);
354 } else { 353 } else {
355 twl4030->apll_enabled--; 354 twl4030->apll_enabled--;
356 if (!twl4030->apll_enabled) 355 if (!twl4030->apll_enabled)
357 status = twl4030_audio_disable_resource( 356 twl4030_audio_disable_resource(
358 TWL4030_AUDIO_RES_APLL); 357 TWL4030_AUDIO_RES_APLL);
359 } 358 }
360} 359}
@@ -1764,16 +1763,16 @@ static int twl4030_hw_params(struct snd_pcm_substream *substream,
1764 old_format = twl4030_read(codec, TWL4030_REG_AUDIO_IF); 1763 old_format = twl4030_read(codec, TWL4030_REG_AUDIO_IF);
1765 format = old_format; 1764 format = old_format;
1766 format &= ~TWL4030_DATA_WIDTH; 1765 format &= ~TWL4030_DATA_WIDTH;
1767 switch (params_format(params)) { 1766 switch (params_width(params)) {
1768 case SNDRV_PCM_FORMAT_S16_LE: 1767 case 16:
1769 format |= TWL4030_DATA_WIDTH_16S_16W; 1768 format |= TWL4030_DATA_WIDTH_16S_16W;
1770 break; 1769 break;
1771 case SNDRV_PCM_FORMAT_S32_LE: 1770 case 32:
1772 format |= TWL4030_DATA_WIDTH_32S_24W; 1771 format |= TWL4030_DATA_WIDTH_32S_24W;
1773 break; 1772 break;
1774 default: 1773 default:
1775 dev_err(codec->dev, "%s: unknown format %d\n", __func__, 1774 dev_err(codec->dev, "%s: unsupported bits/sample %d\n",
1776 params_format(params)); 1775 __func__, params_width(params));
1777 return -EINVAL; 1776 return -EINVAL;
1778 } 1777 }
1779 1778
@@ -2162,10 +2161,8 @@ static int twl4030_soc_probe(struct snd_soc_codec *codec)
2162 2161
2163 twl4030 = devm_kzalloc(codec->dev, sizeof(struct twl4030_priv), 2162 twl4030 = devm_kzalloc(codec->dev, sizeof(struct twl4030_priv),
2164 GFP_KERNEL); 2163 GFP_KERNEL);
2165 if (twl4030 == NULL) { 2164 if (!twl4030)
2166 dev_err(codec->dev, "Can not allocate memory\n");
2167 return -ENOMEM; 2165 return -ENOMEM;
2168 }
2169 snd_soc_codec_set_drvdata(codec, twl4030); 2166 snd_soc_codec_set_drvdata(codec, twl4030);
2170 /* Set the defaults, and power up the codec */ 2167 /* Set the defaults, and power up the codec */
2171 twl4030->sysclk = twl4030_audio_get_mclk() / 1000; 2168 twl4030->sysclk = twl4030_audio_get_mclk() / 1000;
diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c
index edf27acc1d77..32b2f78aa62c 100644
--- a/sound/soc/codecs/uda134x.c
+++ b/sound/soc/codecs/uda134x.c
@@ -243,14 +243,14 @@ static int uda134x_hw_params(struct snd_pcm_substream *substream,
243 case SND_SOC_DAIFMT_I2S: 243 case SND_SOC_DAIFMT_I2S:
244 break; 244 break;
245 case SND_SOC_DAIFMT_RIGHT_J: 245 case SND_SOC_DAIFMT_RIGHT_J:
246 switch (params_format(params)) { 246 switch (params_width(params)) {
247 case SNDRV_PCM_FORMAT_S16_LE: 247 case 16:
248 hw_params |= (1<<1); 248 hw_params |= (1<<1);
249 break; 249 break;
250 case SNDRV_PCM_FORMAT_S18_3LE: 250 case 18:
251 hw_params |= (1<<2); 251 hw_params |= (1<<2);
252 break; 252 break;
253 case SNDRV_PCM_FORMAT_S20_3LE: 253 case 20:
254 hw_params |= ((1<<2) | (1<<1)); 254 hw_params |= ((1<<2) | (1<<1));
255 break; 255 break;
256 default: 256 default:
@@ -479,7 +479,7 @@ static struct snd_soc_dai_driver uda134x_dai = {
479static int uda134x_soc_probe(struct snd_soc_codec *codec) 479static int uda134x_soc_probe(struct snd_soc_codec *codec)
480{ 480{
481 struct uda134x_priv *uda134x; 481 struct uda134x_priv *uda134x;
482 struct uda134x_platform_data *pd = codec->card->dev->platform_data; 482 struct uda134x_platform_data *pd = codec->component.card->dev->platform_data;
483 const struct snd_soc_dapm_widget *widgets; 483 const struct snd_soc_dapm_widget *widgets;
484 unsigned num_widgets; 484 unsigned num_widgets;
485 485
diff --git a/sound/soc/codecs/wl1273.c b/sound/soc/codecs/wl1273.c
index 4ead0dc02b87..f3d4e88d0b7b 100644
--- a/sound/soc/codecs/wl1273.c
+++ b/sound/soc/codecs/wl1273.c
@@ -341,8 +341,9 @@ static int wl1273_hw_params(struct snd_pcm_substream *substream,
341 struct wl1273_core *core = wl1273->core; 341 struct wl1273_core *core = wl1273->core;
342 unsigned int rate, width, r; 342 unsigned int rate, width, r;
343 343
344 if (params_format(params) != SNDRV_PCM_FORMAT_S16_LE) { 344 if (params_width(params) != 16) {
345 pr_err("Only SNDRV_PCM_FORMAT_S16_LE supported.\n"); 345 dev_err(dai->dev, "%d bits/sample not supported\n",
346 params_width(params));
346 return -EINVAL; 347 return -EINVAL;
347 } 348 }
348 349
@@ -461,10 +462,8 @@ static int wl1273_probe(struct snd_soc_codec *codec)
461 } 462 }
462 463
463 wl1273 = kzalloc(sizeof(struct wl1273_priv), GFP_KERNEL); 464 wl1273 = kzalloc(sizeof(struct wl1273_priv), GFP_KERNEL);
464 if (wl1273 == NULL) { 465 if (!wl1273)
465 dev_err(codec->dev, "Cannot allocate memory.\n");
466 return -ENOMEM; 466 return -ENOMEM;
467 }
468 467
469 wl1273->mode = WL1273_MODE_BT; 468 wl1273->mode = WL1273_MODE_BT;
470 wl1273->core = *core; 469 wl1273->core = *core;
diff --git a/sound/soc/codecs/wm0010.c b/sound/soc/codecs/wm0010.c
index 71ce3159a62e..f37989ec7cba 100644
--- a/sound/soc/codecs/wm0010.c
+++ b/sound/soc/codecs/wm0010.c
@@ -144,7 +144,7 @@ static const struct snd_soc_dapm_route wm0010_dapm_routes[] = {
144 144
145static const char *wm0010_state_to_str(enum wm0010_state state) 145static const char *wm0010_state_to_str(enum wm0010_state state)
146{ 146{
147 const char *state_to_str[] = { 147 static const char * const state_to_str[] = {
148 "Power off", 148 "Power off",
149 "Out of reset", 149 "Out of reset",
150 "Boot ROM", 150 "Boot ROM",
@@ -413,7 +413,6 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
413 413
414 xfer = kzalloc(sizeof(*xfer), GFP_KERNEL); 414 xfer = kzalloc(sizeof(*xfer), GFP_KERNEL);
415 if (!xfer) { 415 if (!xfer) {
416 dev_err(codec->dev, "Failed to allocate xfer\n");
417 ret = -ENOMEM; 416 ret = -ENOMEM;
418 goto abort; 417 goto abort;
419 } 418 }
@@ -423,8 +422,6 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
423 422
424 out = kzalloc(len, GFP_KERNEL | GFP_DMA); 423 out = kzalloc(len, GFP_KERNEL | GFP_DMA);
425 if (!out) { 424 if (!out) {
426 dev_err(codec->dev,
427 "Failed to allocate RX buffer\n");
428 ret = -ENOMEM; 425 ret = -ENOMEM;
429 goto abort1; 426 goto abort1;
430 } 427 }
@@ -432,8 +429,6 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
432 429
433 img = kzalloc(len, GFP_KERNEL | GFP_DMA); 430 img = kzalloc(len, GFP_KERNEL | GFP_DMA);
434 if (!img) { 431 if (!img) {
435 dev_err(codec->dev,
436 "Failed to allocate image buffer\n");
437 ret = -ENOMEM; 432 ret = -ENOMEM;
438 goto abort1; 433 goto abort1;
439 } 434 }
@@ -526,14 +521,12 @@ static int wm0010_stage2_load(struct snd_soc_codec *codec)
526 /* Copy to local buffer first as vmalloc causes problems for dma */ 521 /* Copy to local buffer first as vmalloc causes problems for dma */
527 img = kzalloc(fw->size, GFP_KERNEL | GFP_DMA); 522 img = kzalloc(fw->size, GFP_KERNEL | GFP_DMA);
528 if (!img) { 523 if (!img) {
529 dev_err(codec->dev, "Failed to allocate image buffer\n");
530 ret = -ENOMEM; 524 ret = -ENOMEM;
531 goto abort2; 525 goto abort2;
532 } 526 }
533 527
534 out = kzalloc(fw->size, GFP_KERNEL | GFP_DMA); 528 out = kzalloc(fw->size, GFP_KERNEL | GFP_DMA);
535 if (!out) { 529 if (!out) {
536 dev_err(codec->dev, "Failed to allocate output buffer\n");
537 ret = -ENOMEM; 530 ret = -ENOMEM;
538 goto abort1; 531 goto abort1;
539 } 532 }
@@ -679,11 +672,8 @@ static int wm0010_boot(struct snd_soc_codec *codec)
679 } 672 }
680 673
681 img_swap = kzalloc(len, GFP_KERNEL | GFP_DMA); 674 img_swap = kzalloc(len, GFP_KERNEL | GFP_DMA);
682 if (!img_swap) { 675 if (!img_swap)
683 dev_err(codec->dev,
684 "Failed to allocate image buffer\n");
685 goto abort; 676 goto abort;
686 }
687 677
688 /* We need to re-order for 0010 */ 678 /* We need to re-order for 0010 */
689 byte_swap_64((u64 *)&pll_rec, img_swap, len); 679 byte_swap_64((u64 *)&pll_rec, img_swap, len);
diff --git a/sound/soc/codecs/wm1250-ev1.c b/sound/soc/codecs/wm1250-ev1.c
index 6e6b93d4696e..8011f75fb6cb 100644
--- a/sound/soc/codecs/wm1250-ev1.c
+++ b/sound/soc/codecs/wm1250-ev1.c
@@ -164,7 +164,6 @@ static int wm1250_ev1_pdata(struct i2c_client *i2c)
164 164
165 wm1250 = devm_kzalloc(&i2c->dev, sizeof(*wm1250), GFP_KERNEL); 165 wm1250 = devm_kzalloc(&i2c->dev, sizeof(*wm1250), GFP_KERNEL);
166 if (!wm1250) { 166 if (!wm1250) {
167 dev_err(&i2c->dev, "Unable to allocate private data\n");
168 ret = -ENOMEM; 167 ret = -ENOMEM;
169 goto err; 168 goto err;
170 } 169 }
diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c
index a4c352cc3464..34ef65c52a7d 100644
--- a/sound/soc/codecs/wm2000.c
+++ b/sound/soc/codecs/wm2000.c
@@ -826,10 +826,8 @@ static int wm2000_i2c_probe(struct i2c_client *i2c,
826 826
827 wm2000 = devm_kzalloc(&i2c->dev, sizeof(struct wm2000_priv), 827 wm2000 = devm_kzalloc(&i2c->dev, sizeof(struct wm2000_priv),
828 GFP_KERNEL); 828 GFP_KERNEL);
829 if (wm2000 == NULL) { 829 if (!wm2000)
830 dev_err(&i2c->dev, "Unable to allocate private data\n");
831 return -ENOMEM; 830 return -ENOMEM;
832 }
833 831
834 mutex_init(&wm2000->lock); 832 mutex_init(&wm2000->lock);
835 833
diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c
index 91a9ea2a2056..7bb0d36d4c54 100644
--- a/sound/soc/codecs/wm5100.c
+++ b/sound/soc/codecs/wm5100.c
@@ -735,8 +735,7 @@ WM5100_MIXER_CONTROLS("LHPF4", WM5100_HPLP4MIX_INPUT_1_SOURCE),
735static void wm5100_seq_notifier(struct snd_soc_dapm_context *dapm, 735static void wm5100_seq_notifier(struct snd_soc_dapm_context *dapm,
736 enum snd_soc_dapm_type event, int subseq) 736 enum snd_soc_dapm_type event, int subseq)
737{ 737{
738 struct snd_soc_codec *codec = container_of(dapm, 738 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);
739 struct snd_soc_codec, dapm);
740 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec); 739 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
741 u16 val, expect, i; 740 u16 val, expect, i;
742 741
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c
index 289b64d89abd..f60234962527 100644
--- a/sound/soc/codecs/wm5102.c
+++ b/sound/soc/codecs/wm5102.c
@@ -612,6 +612,62 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
612 return 0; 612 return 0;
613} 613}
614 614
615static int wm5102_out_comp_coeff_get(struct snd_kcontrol *kcontrol,
616 struct snd_ctl_elem_value *ucontrol)
617{
618 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
619 struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
620 uint16_t data;
621
622 mutex_lock(&codec->mutex);
623 data = cpu_to_be16(arizona->dac_comp_coeff);
624 memcpy(ucontrol->value.bytes.data, &data, sizeof(data));
625 mutex_unlock(&codec->mutex);
626
627 return 0;
628}
629
630static int wm5102_out_comp_coeff_put(struct snd_kcontrol *kcontrol,
631 struct snd_ctl_elem_value *ucontrol)
632{
633 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
634 struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
635
636 mutex_lock(&codec->mutex);
637 memcpy(&arizona->dac_comp_coeff, ucontrol->value.bytes.data,
638 sizeof(arizona->dac_comp_coeff));
639 arizona->dac_comp_coeff = be16_to_cpu(arizona->dac_comp_coeff);
640 mutex_unlock(&codec->mutex);
641
642 return 0;
643}
644
645static int wm5102_out_comp_switch_get(struct snd_kcontrol *kcontrol,
646 struct snd_ctl_elem_value *ucontrol)
647{
648 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
649 struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
650
651 mutex_lock(&codec->mutex);
652 ucontrol->value.integer.value[0] = arizona->dac_comp_enabled;
653 mutex_unlock(&codec->mutex);
654
655 return 0;
656}
657
658static int wm5102_out_comp_switch_put(struct snd_kcontrol *kcontrol,
659 struct snd_ctl_elem_value *ucontrol)
660{
661 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
662 struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
663
664 mutex_lock(&codec->mutex);
665 arizona->dac_comp_enabled = ucontrol->value.integer.value[0];
666 mutex_unlock(&codec->mutex);
667
668 return 0;
669}
670
615static const char *wm5102_osr_text[] = { 671static const char *wm5102_osr_text[] = {
616 "Low power", "Normal", "High performance", 672 "Low power", "Normal", "High performance",
617}; 673};
@@ -843,6 +899,12 @@ SOC_SINGLE_TLV("Noise Gate Threshold Volume", ARIZONA_NOISE_GATE_CONTROL,
843 ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv), 899 ARIZONA_NGATE_THR_SHIFT, 7, 1, ng_tlv),
844SOC_ENUM("Noise Gate Hold", arizona_ng_hold), 900SOC_ENUM("Noise Gate Hold", arizona_ng_hold),
845 901
902SND_SOC_BYTES_EXT("Output Compensation Coefficient", 2,
903 wm5102_out_comp_coeff_get, wm5102_out_comp_coeff_put),
904
905SOC_SINGLE_EXT("Output Compensation Switch", 0, 0, 1, 0,
906 wm5102_out_comp_switch_get, wm5102_out_comp_switch_put),
907
846WM5102_NG_SRC("HPOUT1L", ARIZONA_NOISE_GATE_SELECT_1L), 908WM5102_NG_SRC("HPOUT1L", ARIZONA_NOISE_GATE_SELECT_1L),
847WM5102_NG_SRC("HPOUT1R", ARIZONA_NOISE_GATE_SELECT_1R), 909WM5102_NG_SRC("HPOUT1R", ARIZONA_NOISE_GATE_SELECT_1R),
848WM5102_NG_SRC("HPOUT2L", ARIZONA_NOISE_GATE_SELECT_2L), 910WM5102_NG_SRC("HPOUT2L", ARIZONA_NOISE_GATE_SELECT_2L),
@@ -1653,6 +1715,7 @@ static struct snd_soc_dai_driver wm5102_dai[] = {
1653 }, 1715 },
1654 .ops = &arizona_dai_ops, 1716 .ops = &arizona_dai_ops,
1655 .symmetric_rates = 1, 1717 .symmetric_rates = 1,
1718 .symmetric_samplebits = 1,
1656 }, 1719 },
1657 { 1720 {
1658 .name = "wm5102-aif2", 1721 .name = "wm5102-aif2",
@@ -1674,6 +1737,7 @@ static struct snd_soc_dai_driver wm5102_dai[] = {
1674 }, 1737 },
1675 .ops = &arizona_dai_ops, 1738 .ops = &arizona_dai_ops,
1676 .symmetric_rates = 1, 1739 .symmetric_rates = 1,
1740 .symmetric_samplebits = 1,
1677 }, 1741 },
1678 { 1742 {
1679 .name = "wm5102-aif3", 1743 .name = "wm5102-aif3",
@@ -1695,6 +1759,7 @@ static struct snd_soc_dai_driver wm5102_dai[] = {
1695 }, 1759 },
1696 .ops = &arizona_dai_ops, 1760 .ops = &arizona_dai_ops,
1697 .symmetric_rates = 1, 1761 .symmetric_rates = 1,
1762 .symmetric_samplebits = 1,
1698 }, 1763 },
1699 { 1764 {
1700 .name = "wm5102-slim1", 1765 .name = "wm5102-slim1",
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index 62ef54456499..2f2ec26d831c 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -1485,6 +1485,7 @@ static struct snd_soc_dai_driver wm5110_dai[] = {
1485 }, 1485 },
1486 .ops = &arizona_dai_ops, 1486 .ops = &arizona_dai_ops,
1487 .symmetric_rates = 1, 1487 .symmetric_rates = 1,
1488 .symmetric_samplebits = 1,
1488 }, 1489 },
1489 { 1490 {
1490 .name = "wm5110-aif2", 1491 .name = "wm5110-aif2",
@@ -1506,6 +1507,7 @@ static struct snd_soc_dai_driver wm5110_dai[] = {
1506 }, 1507 },
1507 .ops = &arizona_dai_ops, 1508 .ops = &arizona_dai_ops,
1508 .symmetric_rates = 1, 1509 .symmetric_rates = 1,
1510 .symmetric_samplebits = 1,
1509 }, 1511 },
1510 { 1512 {
1511 .name = "wm5110-aif3", 1513 .name = "wm5110-aif3",
@@ -1527,6 +1529,7 @@ static struct snd_soc_dai_driver wm5110_dai[] = {
1527 }, 1529 },
1528 .ops = &arizona_dai_ops, 1530 .ops = &arizona_dai_ops,
1529 .symmetric_rates = 1, 1531 .symmetric_rates = 1,
1532 .symmetric_samplebits = 1,
1530 }, 1533 },
1531 { 1534 {
1532 .name = "wm5110-slim1", 1535 .name = "wm5110-slim1",
diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c
index 392285edb595..3dfdcc4197fa 100644
--- a/sound/soc/codecs/wm8350.c
+++ b/sound/soc/codecs/wm8350.c
@@ -918,16 +918,16 @@ static int wm8350_pcm_hw_params(struct snd_pcm_substream *substream,
918 ~WM8350_AIF_WL_MASK; 918 ~WM8350_AIF_WL_MASK;
919 919
920 /* bit size */ 920 /* bit size */
921 switch (params_format(params)) { 921 switch (params_width(params)) {
922 case SNDRV_PCM_FORMAT_S16_LE: 922 case 16:
923 break; 923 break;
924 case SNDRV_PCM_FORMAT_S20_3LE: 924 case 20:
925 iface |= 0x1 << 10; 925 iface |= 0x1 << 10;
926 break; 926 break;
927 case SNDRV_PCM_FORMAT_S24_LE: 927 case 24:
928 iface |= 0x2 << 10; 928 iface |= 0x2 << 10;
929 break; 929 break;
930 case SNDRV_PCM_FORMAT_S32_LE: 930 case 32:
931 iface |= 0x3 << 10; 931 iface |= 0x3 << 10;
932 break; 932 break;
933 } 933 }
@@ -1341,21 +1341,18 @@ int wm8350_hp_jack_detect(struct snd_soc_codec *codec, enum wm8350_jack which,
1341{ 1341{
1342 struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec); 1342 struct wm8350_data *priv = snd_soc_codec_get_drvdata(codec);
1343 struct wm8350 *wm8350 = priv->wm8350; 1343 struct wm8350 *wm8350 = priv->wm8350;
1344 int irq;
1345 int ena; 1344 int ena;
1346 1345
1347 switch (which) { 1346 switch (which) {
1348 case WM8350_JDL: 1347 case WM8350_JDL:
1349 priv->hpl.jack = jack; 1348 priv->hpl.jack = jack;
1350 priv->hpl.report = report; 1349 priv->hpl.report = report;
1351 irq = WM8350_IRQ_CODEC_JCK_DET_L;
1352 ena = WM8350_JDL_ENA; 1350 ena = WM8350_JDL_ENA;
1353 break; 1351 break;
1354 1352
1355 case WM8350_JDR: 1353 case WM8350_JDR:
1356 priv->hpr.jack = jack; 1354 priv->hpr.jack = jack;
1357 priv->hpr.report = report; 1355 priv->hpr.report = report;
1358 irq = WM8350_IRQ_CODEC_JCK_DET_R;
1359 ena = WM8350_JDR_ENA; 1356 ena = WM8350_JDR_ENA;
1360 break; 1357 break;
1361 1358
diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c
index 06e913d3fea1..72471bef2e9a 100644
--- a/sound/soc/codecs/wm8400.c
+++ b/sound/soc/codecs/wm8400.c
@@ -1095,16 +1095,16 @@ static int wm8400_hw_params(struct snd_pcm_substream *substream,
1095 1095
1096 audio1 &= ~WM8400_AIF_WL_MASK; 1096 audio1 &= ~WM8400_AIF_WL_MASK;
1097 /* bit size */ 1097 /* bit size */
1098 switch (params_format(params)) { 1098 switch (params_width(params)) {
1099 case SNDRV_PCM_FORMAT_S16_LE: 1099 case 16:
1100 break; 1100 break;
1101 case SNDRV_PCM_FORMAT_S20_3LE: 1101 case 20:
1102 audio1 |= WM8400_AIF_WL_20BITS; 1102 audio1 |= WM8400_AIF_WL_20BITS;
1103 break; 1103 break;
1104 case SNDRV_PCM_FORMAT_S24_LE: 1104 case 24:
1105 audio1 |= WM8400_AIF_WL_24BITS; 1105 audio1 |= WM8400_AIF_WL_24BITS;
1106 break; 1106 break;
1107 case SNDRV_PCM_FORMAT_S32_LE: 1107 case 32:
1108 audio1 |= WM8400_AIF_WL_32BITS; 1108 audio1 |= WM8400_AIF_WL_32BITS;
1109 break; 1109 break;
1110 } 1110 }
diff --git a/sound/soc/codecs/wm8510.c b/sound/soc/codecs/wm8510.c
index 1c1e328feeb8..e11127f9069e 100644
--- a/sound/soc/codecs/wm8510.c
+++ b/sound/soc/codecs/wm8510.c
@@ -449,16 +449,16 @@ static int wm8510_pcm_hw_params(struct snd_pcm_substream *substream,
449 u16 adn = snd_soc_read(codec, WM8510_ADD) & 0x1f1; 449 u16 adn = snd_soc_read(codec, WM8510_ADD) & 0x1f1;
450 450
451 /* bit size */ 451 /* bit size */
452 switch (params_format(params)) { 452 switch (params_width(params)) {
453 case SNDRV_PCM_FORMAT_S16_LE: 453 case 16:
454 break; 454 break;
455 case SNDRV_PCM_FORMAT_S20_3LE: 455 case 20:
456 iface |= 0x0020; 456 iface |= 0x0020;
457 break; 457 break;
458 case SNDRV_PCM_FORMAT_S24_LE: 458 case 24:
459 iface |= 0x0040; 459 iface |= 0x0040;
460 break; 460 break;
461 case SNDRV_PCM_FORMAT_S32_LE: 461 case 32:
462 iface |= 0x0060; 462 iface |= 0x0060;
463 break; 463 break;
464 } 464 }
diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c
index 601ee8178af1..ec1f5740dbd0 100644
--- a/sound/soc/codecs/wm8523.c
+++ b/sound/soc/codecs/wm8523.c
@@ -163,16 +163,16 @@ static int wm8523_hw_params(struct snd_pcm_substream *substream,
163 aifctrl2 |= lrclk_ratios[i].value; 163 aifctrl2 |= lrclk_ratios[i].value;
164 164
165 aifctrl1 &= ~WM8523_WL_MASK; 165 aifctrl1 &= ~WM8523_WL_MASK;
166 switch (params_format(params)) { 166 switch (params_width(params)) {
167 case SNDRV_PCM_FORMAT_S16_LE: 167 case 16:
168 break; 168 break;
169 case SNDRV_PCM_FORMAT_S20_3LE: 169 case 20:
170 aifctrl1 |= 0x8; 170 aifctrl1 |= 0x8;
171 break; 171 break;
172 case SNDRV_PCM_FORMAT_S24_LE: 172 case 24:
173 aifctrl1 |= 0x10; 173 aifctrl1 |= 0x10;
174 break; 174 break;
175 case SNDRV_PCM_FORMAT_S32_LE: 175 case 32:
176 aifctrl1 |= 0x18; 176 aifctrl1 |= 0x18;
177 break; 177 break;
178 } 178 }
diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c
index 7665ff6aea6d..911605ee25b0 100644
--- a/sound/soc/codecs/wm8580.c
+++ b/sound/soc/codecs/wm8580.c
@@ -511,19 +511,19 @@ static int wm8580_paif_hw_params(struct snd_pcm_substream *substream,
511 int i, ratio, osr; 511 int i, ratio, osr;
512 512
513 /* bit size */ 513 /* bit size */
514 switch (params_format(params)) { 514 switch (params_width(params)) {
515 case SNDRV_PCM_FORMAT_S16_LE: 515 case 16:
516 paifa |= 0x8; 516 paifa |= 0x8;
517 break; 517 break;
518 case SNDRV_PCM_FORMAT_S20_3LE: 518 case 20:
519 paifa |= 0x0; 519 paifa |= 0x0;
520 paifb |= WM8580_AIF_LENGTH_20; 520 paifb |= WM8580_AIF_LENGTH_20;
521 break; 521 break;
522 case SNDRV_PCM_FORMAT_S24_LE: 522 case 24:
523 paifa |= 0x0; 523 paifa |= 0x0;
524 paifb |= WM8580_AIF_LENGTH_24; 524 paifb |= WM8580_AIF_LENGTH_24;
525 break; 525 break;
526 case SNDRV_PCM_FORMAT_S32_LE: 526 case 32:
527 paifa |= 0x0; 527 paifa |= 0x0;
528 paifb |= WM8580_AIF_LENGTH_32; 528 paifb |= WM8580_AIF_LENGTH_32;
529 break; 529 break;
diff --git a/sound/soc/codecs/wm8711.c b/sound/soc/codecs/wm8711.c
index b0fbcb377baf..32187e739b4f 100644
--- a/sound/soc/codecs/wm8711.c
+++ b/sound/soc/codecs/wm8711.c
@@ -169,13 +169,13 @@ static int wm8711_hw_params(struct snd_pcm_substream *substream,
169 snd_soc_write(codec, WM8711_SRATE, srate); 169 snd_soc_write(codec, WM8711_SRATE, srate);
170 170
171 /* bit size */ 171 /* bit size */
172 switch (params_format(params)) { 172 switch (params_width(params)) {
173 case SNDRV_PCM_FORMAT_S16_LE: 173 case 16:
174 break; 174 break;
175 case SNDRV_PCM_FORMAT_S20_3LE: 175 case 20:
176 iface |= 0x0004; 176 iface |= 0x0004;
177 break; 177 break;
178 case SNDRV_PCM_FORMAT_S24_LE: 178 case 24:
179 iface |= 0x0008; 179 iface |= 0x0008;
180 break; 180 break;
181 } 181 }
diff --git a/sound/soc/codecs/wm8728.c b/sound/soc/codecs/wm8728.c
index bac7fc28fe71..38ff826f589a 100644
--- a/sound/soc/codecs/wm8728.c
+++ b/sound/soc/codecs/wm8728.c
@@ -94,13 +94,13 @@ static int wm8728_hw_params(struct snd_pcm_substream *substream,
94 94
95 dac &= ~0x18; 95 dac &= ~0x18;
96 96
97 switch (params_format(params)) { 97 switch (params_width(params)) {
98 case SNDRV_PCM_FORMAT_S16_LE: 98 case 16:
99 break; 99 break;
100 case SNDRV_PCM_FORMAT_S20_3LE: 100 case 20:
101 dac |= 0x10; 101 dac |= 0x10;
102 break; 102 break;
103 case SNDRV_PCM_FORMAT_S24_LE: 103 case 24:
104 dac |= 0x08; 104 dac |= 0x08;
105 break; 105 break;
106 default: 106 default:
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
index 5ada61611324..eebb3280bfad 100644
--- a/sound/soc/codecs/wm8731.c
+++ b/sound/soc/codecs/wm8731.c
@@ -348,13 +348,13 @@ static int wm8731_hw_params(struct snd_pcm_substream *substream,
348 snd_soc_write(codec, WM8731_SRATE, srate); 348 snd_soc_write(codec, WM8731_SRATE, srate);
349 349
350 /* bit size */ 350 /* bit size */
351 switch (params_format(params)) { 351 switch (params_width(params)) {
352 case SNDRV_PCM_FORMAT_S16_LE: 352 case 16:
353 break; 353 break;
354 case SNDRV_PCM_FORMAT_S20_3LE: 354 case 20:
355 iface |= 0x0004; 355 iface |= 0x0004;
356 break; 356 break;
357 case SNDRV_PCM_FORMAT_S24_LE: 357 case 24:
358 iface |= 0x0008; 358 iface |= 0x0008;
359 break; 359 break;
360 } 360 }
diff --git a/sound/soc/codecs/wm8737.c b/sound/soc/codecs/wm8737.c
index b27f26cdc049..744a422ecb05 100644
--- a/sound/soc/codecs/wm8737.c
+++ b/sound/soc/codecs/wm8737.c
@@ -367,16 +367,16 @@ static int wm8737_hw_params(struct snd_pcm_substream *substream,
367 367
368 clocking |= coeff_div[i].usb | (coeff_div[i].sr << WM8737_SR_SHIFT); 368 clocking |= coeff_div[i].usb | (coeff_div[i].sr << WM8737_SR_SHIFT);
369 369
370 switch (params_format(params)) { 370 switch (params_width(params)) {
371 case SNDRV_PCM_FORMAT_S16_LE: 371 case 16:
372 break; 372 break;
373 case SNDRV_PCM_FORMAT_S20_3LE: 373 case 20:
374 af |= 0x8; 374 af |= 0x8;
375 break; 375 break;
376 case SNDRV_PCM_FORMAT_S24_LE: 376 case 24:
377 af |= 0x10; 377 af |= 0x10;
378 break; 378 break;
379 case SNDRV_PCM_FORMAT_S32_LE: 379 case 32:
380 af |= 0x18; 380 af |= 0x18;
381 break; 381 break;
382 default: 382 default:
diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c
index b33542a04607..a237f1627f61 100644
--- a/sound/soc/codecs/wm8741.c
+++ b/sound/soc/codecs/wm8741.c
@@ -241,26 +241,26 @@ static int wm8741_hw_params(struct snd_pcm_substream *substream,
241 } 241 }
242 242
243 /* bit size */ 243 /* bit size */
244 switch (params_format(params)) { 244 switch (params_width(params)) {
245 case SNDRV_PCM_FORMAT_S16_LE: 245 case 16:
246 break; 246 break;
247 case SNDRV_PCM_FORMAT_S20_3LE: 247 case 20:
248 iface |= 0x0001; 248 iface |= 0x0001;
249 break; 249 break;
250 case SNDRV_PCM_FORMAT_S24_LE: 250 case 24:
251 iface |= 0x0002; 251 iface |= 0x0002;
252 break; 252 break;
253 case SNDRV_PCM_FORMAT_S32_LE: 253 case 32:
254 iface |= 0x0003; 254 iface |= 0x0003;
255 break; 255 break;
256 default: 256 default:
257 dev_dbg(codec->dev, "wm8741_hw_params: Unsupported bit size param = %d", 257 dev_dbg(codec->dev, "wm8741_hw_params: Unsupported bit size param = %d",
258 params_format(params)); 258 params_width(params));
259 return -EINVAL; 259 return -EINVAL;
260 } 260 }
261 261
262 dev_dbg(codec->dev, "wm8741_hw_params: bit size param = %d", 262 dev_dbg(codec->dev, "wm8741_hw_params: bit size param = %d",
263 params_format(params)); 263 params_width(params));
264 264
265 snd_soc_write(codec, WM8741_FORMAT_CONTROL, iface); 265 snd_soc_write(codec, WM8741_FORMAT_CONTROL, iface);
266 return 0; 266 return 0;
diff --git a/sound/soc/codecs/wm8750.c b/sound/soc/codecs/wm8750.c
index 33990b63d214..67653a2db223 100644
--- a/sound/soc/codecs/wm8750.c
+++ b/sound/soc/codecs/wm8750.c
@@ -586,16 +586,16 @@ static int wm8750_pcm_hw_params(struct snd_pcm_substream *substream,
586 int coeff = get_coeff(wm8750->sysclk, params_rate(params)); 586 int coeff = get_coeff(wm8750->sysclk, params_rate(params));
587 587
588 /* bit size */ 588 /* bit size */
589 switch (params_format(params)) { 589 switch (params_width(params)) {
590 case SNDRV_PCM_FORMAT_S16_LE: 590 case 16:
591 break; 591 break;
592 case SNDRV_PCM_FORMAT_S20_3LE: 592 case 20:
593 iface |= 0x0004; 593 iface |= 0x0004;
594 break; 594 break;
595 case SNDRV_PCM_FORMAT_S24_LE: 595 case 24:
596 iface |= 0x0008; 596 iface |= 0x0008;
597 break; 597 break;
598 case SNDRV_PCM_FORMAT_S32_LE: 598 case 32:
599 iface |= 0x000c; 599 iface |= 0x000c;
600 break; 600 break;
601 } 601 }
diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c
index 53e57b4049a8..e54e097f4fcb 100644
--- a/sound/soc/codecs/wm8753.c
+++ b/sound/soc/codecs/wm8753.c
@@ -937,16 +937,16 @@ static int wm8753_pcm_hw_params(struct snd_pcm_substream *substream,
937 u16 srate = snd_soc_read(codec, WM8753_SRATE1) & 0x017f; 937 u16 srate = snd_soc_read(codec, WM8753_SRATE1) & 0x017f;
938 938
939 /* bit size */ 939 /* bit size */
940 switch (params_format(params)) { 940 switch (params_width(params)) {
941 case SNDRV_PCM_FORMAT_S16_LE: 941 case 16:
942 break; 942 break;
943 case SNDRV_PCM_FORMAT_S20_3LE: 943 case 20:
944 voice |= 0x0004; 944 voice |= 0x0004;
945 break; 945 break;
946 case SNDRV_PCM_FORMAT_S24_LE: 946 case 24:
947 voice |= 0x0008; 947 voice |= 0x0008;
948 break; 948 break;
949 case SNDRV_PCM_FORMAT_S32_LE: 949 case 32:
950 voice |= 0x000c; 950 voice |= 0x000c;
951 break; 951 break;
952 } 952 }
@@ -1176,16 +1176,16 @@ static int wm8753_i2s_hw_params(struct snd_pcm_substream *substream,
1176 coeff_div[coeff].usb); 1176 coeff_div[coeff].usb);
1177 1177
1178 /* bit size */ 1178 /* bit size */
1179 switch (params_format(params)) { 1179 switch (params_width(params)) {
1180 case SNDRV_PCM_FORMAT_S16_LE: 1180 case 16:
1181 break; 1181 break;
1182 case SNDRV_PCM_FORMAT_S20_3LE: 1182 case 20:
1183 hifi |= 0x0004; 1183 hifi |= 0x0004;
1184 break; 1184 break;
1185 case SNDRV_PCM_FORMAT_S24_LE: 1185 case 24:
1186 hifi |= 0x0008; 1186 hifi |= 0x0008;
1187 break; 1187 break;
1188 case SNDRV_PCM_FORMAT_S32_LE: 1188 case 32:
1189 hifi |= 0x000c; 1189 hifi |= 0x000c;
1190 break; 1190 break;
1191 } 1191 }
diff --git a/sound/soc/codecs/wm8770.c b/sound/soc/codecs/wm8770.c
index c61aeb38efb8..180e7a098726 100644
--- a/sound/soc/codecs/wm8770.c
+++ b/sound/soc/codecs/wm8770.c
@@ -426,16 +426,16 @@ static int wm8770_hw_params(struct snd_pcm_substream *substream,
426 wm8770 = snd_soc_codec_get_drvdata(codec); 426 wm8770 = snd_soc_codec_get_drvdata(codec);
427 427
428 iface = 0; 428 iface = 0;
429 switch (params_format(params)) { 429 switch (params_width(params)) {
430 case SNDRV_PCM_FORMAT_S16_LE: 430 case 16:
431 break; 431 break;
432 case SNDRV_PCM_FORMAT_S20_3LE: 432 case 20:
433 iface |= 0x10; 433 iface |= 0x10;
434 break; 434 break;
435 case SNDRV_PCM_FORMAT_S24_LE: 435 case 24:
436 iface |= 0x20; 436 iface |= 0x20;
437 break; 437 break;
438 case SNDRV_PCM_FORMAT_S32_LE: 438 case 32:
439 iface |= 0x30; 439 iface |= 0x30;
440 break; 440 break;
441 } 441 }
diff --git a/sound/soc/codecs/wm8804.c b/sound/soc/codecs/wm8804.c
index d96e5963ee35..0ea01dfcb6e1 100644
--- a/sound/soc/codecs/wm8804.c
+++ b/sound/soc/codecs/wm8804.c
@@ -270,19 +270,19 @@ static int wm8804_hw_params(struct snd_pcm_substream *substream,
270 270
271 codec = dai->codec; 271 codec = dai->codec;
272 272
273 switch (params_format(params)) { 273 switch (params_width(params)) {
274 case SNDRV_PCM_FORMAT_S16_LE: 274 case 16:
275 blen = 0x0; 275 blen = 0x0;
276 break; 276 break;
277 case SNDRV_PCM_FORMAT_S20_3LE: 277 case 20:
278 blen = 0x1; 278 blen = 0x1;
279 break; 279 break;
280 case SNDRV_PCM_FORMAT_S24_LE: 280 case 24:
281 blen = 0x2; 281 blen = 0x2;
282 break; 282 break;
283 default: 283 default:
284 dev_err(dai->dev, "Unsupported word length: %u\n", 284 dev_err(dai->dev, "Unsupported word length: %u\n",
285 params_format(params)); 285 params_width(params));
286 return -EINVAL; 286 return -EINVAL;
287 } 287 }
288 288
diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c
index d09fdce57f5a..44a5f1511f0f 100644
--- a/sound/soc/codecs/wm8900.c
+++ b/sound/soc/codecs/wm8900.c
@@ -640,16 +640,16 @@ static int wm8900_hw_params(struct snd_pcm_substream *substream,
640 640
641 reg = snd_soc_read(codec, WM8900_REG_AUDIO1) & ~0x60; 641 reg = snd_soc_read(codec, WM8900_REG_AUDIO1) & ~0x60;
642 642
643 switch (params_format(params)) { 643 switch (params_width(params)) {
644 case SNDRV_PCM_FORMAT_S16_LE: 644 case 16:
645 break; 645 break;
646 case SNDRV_PCM_FORMAT_S20_3LE: 646 case 20:
647 reg |= 0x20; 647 reg |= 0x20;
648 break; 648 break;
649 case SNDRV_PCM_FORMAT_S24_LE: 649 case 24:
650 reg |= 0x40; 650 reg |= 0x40;
651 break; 651 break;
652 case SNDRV_PCM_FORMAT_S32_LE: 652 case 32:
653 reg |= 0x60; 653 reg |= 0x60;
654 break; 654 break;
655 default: 655 default:
diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c
index b84940c359a1..aa0984864e76 100644
--- a/sound/soc/codecs/wm8903.c
+++ b/sound/soc/codecs/wm8903.c
@@ -281,8 +281,7 @@ static int wm8903_dcs_event(struct snd_soc_dapm_widget *w,
281static void wm8903_seq_notifier(struct snd_soc_dapm_context *dapm, 281static void wm8903_seq_notifier(struct snd_soc_dapm_context *dapm,
282 enum snd_soc_dapm_type event, int subseq) 282 enum snd_soc_dapm_type event, int subseq)
283{ 283{
284 struct snd_soc_codec *codec = container_of(dapm, 284 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);
285 struct snd_soc_codec, dapm);
286 struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); 285 struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
287 int dcs_mode = WM8903_DCS_MODE_WRITE_STOP; 286 int dcs_mode = WM8903_DCS_MODE_WRITE_STOP;
288 int i, val; 287 int i, val;
@@ -1477,19 +1476,19 @@ static int wm8903_hw_params(struct snd_pcm_substream *substream,
1477 1476
1478 aif1 &= ~WM8903_AIF_WL_MASK; 1477 aif1 &= ~WM8903_AIF_WL_MASK;
1479 bclk = 2 * fs; 1478 bclk = 2 * fs;
1480 switch (params_format(params)) { 1479 switch (params_width(params)) {
1481 case SNDRV_PCM_FORMAT_S16_LE: 1480 case 16:
1482 bclk *= 16; 1481 bclk *= 16;
1483 break; 1482 break;
1484 case SNDRV_PCM_FORMAT_S20_3LE: 1483 case 20:
1485 bclk *= 20; 1484 bclk *= 20;
1486 aif1 |= 0x4; 1485 aif1 |= 0x4;
1487 break; 1486 break;
1488 case SNDRV_PCM_FORMAT_S24_LE: 1487 case 24:
1489 bclk *= 24; 1488 bclk *= 24;
1490 aif1 |= 0x8; 1489 aif1 |= 0x8;
1491 break; 1490 break;
1492 case SNDRV_PCM_FORMAT_S32_LE: 1491 case 32:
1493 bclk *= 32; 1492 bclk *= 32;
1494 aif1 |= 0xc; 1493 aif1 |= 0xc;
1495 break; 1494 break;
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c
index f7c549949c54..4d2d2b1380d5 100644
--- a/sound/soc/codecs/wm8904.c
+++ b/sound/soc/codecs/wm8904.c
@@ -11,6 +11,7 @@
11 * published by the Free Software Foundation. 11 * published by the Free Software Foundation.
12 */ 12 */
13 13
14#include <linux/clk.h>
14#include <linux/module.h> 15#include <linux/module.h>
15#include <linux/moduleparam.h> 16#include <linux/moduleparam.h>
16#include <linux/init.h> 17#include <linux/init.h>
@@ -49,6 +50,7 @@ static const char *wm8904_supply_names[WM8904_NUM_SUPPLIES] = {
49/* codec private data */ 50/* codec private data */
50struct wm8904_priv { 51struct wm8904_priv {
51 struct regmap *regmap; 52 struct regmap *regmap;
53 struct clk *mclk;
52 54
53 enum wm8904_type devtype; 55 enum wm8904_type devtype;
54 56
@@ -1290,16 +1292,16 @@ static int wm8904_hw_params(struct snd_pcm_substream *substream,
1290 wm8904->bclk = snd_soc_params_to_bclk(params); 1292 wm8904->bclk = snd_soc_params_to_bclk(params);
1291 } 1293 }
1292 1294
1293 switch (params_format(params)) { 1295 switch (params_width(params)) {
1294 case SNDRV_PCM_FORMAT_S16_LE: 1296 case 16:
1295 break; 1297 break;
1296 case SNDRV_PCM_FORMAT_S20_3LE: 1298 case 20:
1297 aif1 |= 0x40; 1299 aif1 |= 0x40;
1298 break; 1300 break;
1299 case SNDRV_PCM_FORMAT_S24_LE: 1301 case 24:
1300 aif1 |= 0x80; 1302 aif1 |= 0x80;
1301 break; 1303 break;
1302 case SNDRV_PCM_FORMAT_S32_LE: 1304 case 32:
1303 aif1 |= 0xc0; 1305 aif1 |= 0xc0;
1304 break; 1306 break;
1305 default: 1307 default:
@@ -1828,6 +1830,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,
1828 1830
1829 switch (level) { 1831 switch (level) {
1830 case SND_SOC_BIAS_ON: 1832 case SND_SOC_BIAS_ON:
1833 clk_prepare_enable(wm8904->mclk);
1831 break; 1834 break;
1832 1835
1833 case SND_SOC_BIAS_PREPARE: 1836 case SND_SOC_BIAS_PREPARE:
@@ -1894,6 +1897,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,
1894 1897
1895 regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), 1898 regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies),
1896 wm8904->supplies); 1899 wm8904->supplies);
1900 clk_disable_unprepare(wm8904->mclk);
1897 break; 1901 break;
1898 } 1902 }
1899 codec->dapm.bias_level = level; 1903 codec->dapm.bias_level = level;
@@ -2013,12 +2017,8 @@ static void wm8904_handle_pdata(struct snd_soc_codec *codec)
2013 /* We need an array of texts for the enum API */ 2017 /* We need an array of texts for the enum API */
2014 wm8904->drc_texts = kmalloc(sizeof(char *) 2018 wm8904->drc_texts = kmalloc(sizeof(char *)
2015 * pdata->num_drc_cfgs, GFP_KERNEL); 2019 * pdata->num_drc_cfgs, GFP_KERNEL);
2016 if (!wm8904->drc_texts) { 2020 if (!wm8904->drc_texts)
2017 dev_err(codec->dev,
2018 "Failed to allocate %d DRC config texts\n",
2019 pdata->num_drc_cfgs);
2020 return; 2021 return;
2021 }
2022 2022
2023 for (i = 0; i < pdata->num_drc_cfgs; i++) 2023 for (i = 0; i < pdata->num_drc_cfgs; i++)
2024 wm8904->drc_texts[i] = pdata->drc_cfgs[i].name; 2024 wm8904->drc_texts[i] = pdata->drc_cfgs[i].name;
@@ -2110,6 +2110,13 @@ static int wm8904_i2c_probe(struct i2c_client *i2c,
2110 if (wm8904 == NULL) 2110 if (wm8904 == NULL)
2111 return -ENOMEM; 2111 return -ENOMEM;
2112 2112
2113 wm8904->mclk = devm_clk_get(&i2c->dev, "mclk");
2114 if (IS_ERR(wm8904->mclk)) {
2115 ret = PTR_ERR(wm8904->mclk);
2116 dev_err(&i2c->dev, "Failed to get MCLK\n");
2117 return ret;
2118 }
2119
2113 wm8904->regmap = devm_regmap_init_i2c(i2c, &wm8904_regmap); 2120 wm8904->regmap = devm_regmap_init_i2c(i2c, &wm8904_regmap);
2114 if (IS_ERR(wm8904->regmap)) { 2121 if (IS_ERR(wm8904->regmap)) {
2115 ret = PTR_ERR(wm8904->regmap); 2122 ret = PTR_ERR(wm8904->regmap);
diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c
index fc6eec9ad66b..52011043e54c 100644
--- a/sound/soc/codecs/wm8940.c
+++ b/sound/soc/codecs/wm8940.c
@@ -430,19 +430,19 @@ static int wm8940_i2s_hw_params(struct snd_pcm_substream *substream,
430 if (ret) 430 if (ret)
431 goto error_ret; 431 goto error_ret;
432 432
433 switch (params_format(params)) { 433 switch (params_width(params)) {
434 case SNDRV_PCM_FORMAT_S8: 434 case 8:
435 companding = companding | (1 << 5); 435 companding = companding | (1 << 5);
436 break; 436 break;
437 case SNDRV_PCM_FORMAT_S16_LE: 437 case 16:
438 break; 438 break;
439 case SNDRV_PCM_FORMAT_S20_3LE: 439 case 20:
440 iface |= (1 << 5); 440 iface |= (1 << 5);
441 break; 441 break;
442 case SNDRV_PCM_FORMAT_S24_LE: 442 case 24:
443 iface |= (2 << 5); 443 iface |= (2 << 5);
444 break; 444 break;
445 case SNDRV_PCM_FORMAT_S32_LE: 445 case 32:
446 iface |= (3 << 5); 446 iface |= (3 << 5);
447 break; 447 break;
448 } 448 }
diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c
index 2a35108f233d..09d91d9dc4ee 100644
--- a/sound/soc/codecs/wm8955.c
+++ b/sound/soc/codecs/wm8955.c
@@ -597,17 +597,17 @@ static int wm8955_hw_params(struct snd_pcm_substream *substream,
597 int ret; 597 int ret;
598 int wl; 598 int wl;
599 599
600 switch (params_format(params)) { 600 switch (params_width(params)) {
601 case SNDRV_PCM_FORMAT_S16_LE: 601 case 16:
602 wl = 0; 602 wl = 0;
603 break; 603 break;
604 case SNDRV_PCM_FORMAT_S20_3LE: 604 case 20:
605 wl = 0x4; 605 wl = 0x4;
606 break; 606 break;
607 case SNDRV_PCM_FORMAT_S24_LE: 607 case 24:
608 wl = 0x8; 608 wl = 0x8;
609 break; 609 break;
610 case SNDRV_PCM_FORMAT_S32_LE: 610 case 32:
611 wl = 0xc; 611 wl = 0xc;
612 break; 612 break;
613 default: 613 default:
diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c
index b2ebb104d879..0dada7f0105e 100644
--- a/sound/soc/codecs/wm8958-dsp2.c
+++ b/sound/soc/codecs/wm8958-dsp2.c
@@ -934,12 +934,8 @@ void wm8958_dsp2_init(struct snd_soc_codec *codec)
934 /* We need an array of texts for the enum API */ 934 /* We need an array of texts for the enum API */
935 wm8994->mbc_texts = kmalloc(sizeof(char *) 935 wm8994->mbc_texts = kmalloc(sizeof(char *)
936 * pdata->num_mbc_cfgs, GFP_KERNEL); 936 * pdata->num_mbc_cfgs, GFP_KERNEL);
937 if (!wm8994->mbc_texts) { 937 if (!wm8994->mbc_texts)
938 dev_err(wm8994->hubs.codec->dev,
939 "Failed to allocate %d MBC config texts\n",
940 pdata->num_mbc_cfgs);
941 return; 938 return;
942 }
943 939
944 for (i = 0; i < pdata->num_mbc_cfgs; i++) 940 for (i = 0; i < pdata->num_mbc_cfgs; i++)
945 wm8994->mbc_texts[i] = pdata->mbc_cfgs[i].name; 941 wm8994->mbc_texts[i] = pdata->mbc_cfgs[i].name;
@@ -963,12 +959,8 @@ void wm8958_dsp2_init(struct snd_soc_codec *codec)
963 /* We need an array of texts for the enum API */ 959 /* We need an array of texts for the enum API */
964 wm8994->vss_texts = kmalloc(sizeof(char *) 960 wm8994->vss_texts = kmalloc(sizeof(char *)
965 * pdata->num_vss_cfgs, GFP_KERNEL); 961 * pdata->num_vss_cfgs, GFP_KERNEL);
966 if (!wm8994->vss_texts) { 962 if (!wm8994->vss_texts)
967 dev_err(wm8994->hubs.codec->dev,
968 "Failed to allocate %d VSS config texts\n",
969 pdata->num_vss_cfgs);
970 return; 963 return;
971 }
972 964
973 for (i = 0; i < pdata->num_vss_cfgs; i++) 965 for (i = 0; i < pdata->num_vss_cfgs; i++)
974 wm8994->vss_texts[i] = pdata->vss_cfgs[i].name; 966 wm8994->vss_texts[i] = pdata->vss_cfgs[i].name;
@@ -993,12 +985,8 @@ void wm8958_dsp2_init(struct snd_soc_codec *codec)
993 /* We need an array of texts for the enum API */ 985 /* We need an array of texts for the enum API */
994 wm8994->vss_hpf_texts = kmalloc(sizeof(char *) 986 wm8994->vss_hpf_texts = kmalloc(sizeof(char *)
995 * pdata->num_vss_hpf_cfgs, GFP_KERNEL); 987 * pdata->num_vss_hpf_cfgs, GFP_KERNEL);
996 if (!wm8994->vss_hpf_texts) { 988 if (!wm8994->vss_hpf_texts)
997 dev_err(wm8994->hubs.codec->dev,
998 "Failed to allocate %d VSS HPF config texts\n",
999 pdata->num_vss_hpf_cfgs);
1000 return; 989 return;
1001 }
1002 990
1003 for (i = 0; i < pdata->num_vss_hpf_cfgs; i++) 991 for (i = 0; i < pdata->num_vss_hpf_cfgs; i++)
1004 wm8994->vss_hpf_texts[i] = pdata->vss_hpf_cfgs[i].name; 992 wm8994->vss_hpf_texts[i] = pdata->vss_hpf_cfgs[i].name;
@@ -1024,12 +1012,8 @@ void wm8958_dsp2_init(struct snd_soc_codec *codec)
1024 /* We need an array of texts for the enum API */ 1012 /* We need an array of texts for the enum API */
1025 wm8994->enh_eq_texts = kmalloc(sizeof(char *) 1013 wm8994->enh_eq_texts = kmalloc(sizeof(char *)
1026 * pdata->num_enh_eq_cfgs, GFP_KERNEL); 1014 * pdata->num_enh_eq_cfgs, GFP_KERNEL);
1027 if (!wm8994->enh_eq_texts) { 1015 if (!wm8994->enh_eq_texts)
1028 dev_err(wm8994->hubs.codec->dev,
1029 "Failed to allocate %d enhanced EQ config texts\n",
1030 pdata->num_enh_eq_cfgs);
1031 return; 1016 return;
1032 }
1033 1017
1034 for (i = 0; i < pdata->num_enh_eq_cfgs; i++) 1018 for (i = 0; i < pdata->num_enh_eq_cfgs; i++)
1035 wm8994->enh_eq_texts[i] = pdata->enh_eq_cfgs[i].name; 1019 wm8994->enh_eq_texts[i] = pdata->enh_eq_cfgs[i].name;
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c
index a145d0431b63..4dc4e85116cd 100644
--- a/sound/soc/codecs/wm8960.c
+++ b/sound/soc/codecs/wm8960.c
@@ -472,7 +472,7 @@ static int wm8960_add_widgets(struct snd_soc_codec *codec)
472 * list each time to find the desired power state do so now 472 * list each time to find the desired power state do so now
473 * and save the result. 473 * and save the result.
474 */ 474 */
475 list_for_each_entry(w, &codec->card->widgets, list) { 475 list_for_each_entry(w, &codec->component.card->widgets, list) {
476 if (w->dapm != &codec->dapm) 476 if (w->dapm != &codec->dapm)
477 continue; 477 continue;
478 if (strcmp(w->name, "LOUT1 PGA") == 0) 478 if (strcmp(w->name, "LOUT1 PGA") == 0)
@@ -567,24 +567,21 @@ static int wm8960_hw_params(struct snd_pcm_substream *substream,
567 struct snd_soc_codec *codec = dai->codec; 567 struct snd_soc_codec *codec = dai->codec;
568 struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); 568 struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
569 u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3; 569 u16 iface = snd_soc_read(codec, WM8960_IFACE1) & 0xfff3;
570 snd_pcm_format_t format = params_format(params);
571 int i; 570 int i;
572 571
573 /* bit size */ 572 /* bit size */
574 switch (format) { 573 switch (params_width(params)) {
575 case SNDRV_PCM_FORMAT_S16_LE: 574 case 16:
576 case SNDRV_PCM_FORMAT_S16_BE:
577 break; 575 break;
578 case SNDRV_PCM_FORMAT_S20_3LE: 576 case 20:
579 case SNDRV_PCM_FORMAT_S20_3BE:
580 iface |= 0x0004; 577 iface |= 0x0004;
581 break; 578 break;
582 case SNDRV_PCM_FORMAT_S24_LE: 579 case 24:
583 case SNDRV_PCM_FORMAT_S24_BE:
584 iface |= 0x0008; 580 iface |= 0x0008;
585 break; 581 break;
586 default: 582 default:
587 dev_err(codec->dev, "unsupported format %i\n", format); 583 dev_err(codec->dev, "unsupported width %d\n",
584 params_width(params));
588 return -EINVAL; 585 return -EINVAL;
589 } 586 }
590 587
diff --git a/sound/soc/codecs/wm8961.c b/sound/soc/codecs/wm8961.c
index 9c88f04442b3..41d23e920ad5 100644
--- a/sound/soc/codecs/wm8961.c
+++ b/sound/soc/codecs/wm8961.c
@@ -565,16 +565,16 @@ static int wm8961_hw_params(struct snd_pcm_substream *substream,
565 565
566 reg = snd_soc_read(codec, WM8961_AUDIO_INTERFACE_0); 566 reg = snd_soc_read(codec, WM8961_AUDIO_INTERFACE_0);
567 reg &= ~WM8961_WL_MASK; 567 reg &= ~WM8961_WL_MASK;
568 switch (params_format(params)) { 568 switch (params_width(params)) {
569 case SNDRV_PCM_FORMAT_S16_LE: 569 case 16:
570 break; 570 break;
571 case SNDRV_PCM_FORMAT_S20_3LE: 571 case 20:
572 reg |= 1 << WM8961_WL_SHIFT; 572 reg |= 1 << WM8961_WL_SHIFT;
573 break; 573 break;
574 case SNDRV_PCM_FORMAT_S24_LE: 574 case 24:
575 reg |= 2 << WM8961_WL_SHIFT; 575 reg |= 2 << WM8961_WL_SHIFT;
576 break; 576 break;
577 case SNDRV_PCM_FORMAT_S32_LE: 577 case 32:
578 reg |= 3 << WM8961_WL_SHIFT; 578 reg |= 3 << WM8961_WL_SHIFT;
579 break; 579 break;
580 default: 580 default:
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c
index ca2fda9d72be..1098ae32f1f9 100644
--- a/sound/soc/codecs/wm8962.c
+++ b/sound/soc/codecs/wm8962.c
@@ -14,6 +14,7 @@
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/moduleparam.h> 15#include <linux/moduleparam.h>
16#include <linux/init.h> 16#include <linux/init.h>
17#include <linux/clk.h>
17#include <linux/delay.h> 18#include <linux/delay.h>
18#include <linux/pm.h> 19#include <linux/pm.h>
19#include <linux/gcd.h> 20#include <linux/gcd.h>
@@ -2586,16 +2587,16 @@ static int wm8962_hw_params(struct snd_pcm_substream *substream,
2586 if (wm8962->lrclk % 8000 == 0) 2587 if (wm8962->lrclk % 8000 == 0)
2587 adctl3 |= WM8962_SAMPLE_RATE_INT_MODE; 2588 adctl3 |= WM8962_SAMPLE_RATE_INT_MODE;
2588 2589
2589 switch (params_format(params)) { 2590 switch (params_width(params)) {
2590 case SNDRV_PCM_FORMAT_S16_LE: 2591 case 16:
2591 break; 2592 break;
2592 case SNDRV_PCM_FORMAT_S20_3LE: 2593 case 20:
2593 aif0 |= 0x4; 2594 aif0 |= 0x4;
2594 break; 2595 break;
2595 case SNDRV_PCM_FORMAT_S24_LE: 2596 case 24:
2596 aif0 |= 0x8; 2597 aif0 |= 0x8;
2597 break; 2598 break;
2598 case SNDRV_PCM_FORMAT_S32_LE: 2599 case 32:
2599 aif0 |= 0xc; 2600 aif0 |= 0xc;
2600 break; 2601 break;
2601 default: 2602 default:
@@ -3541,6 +3542,8 @@ static int wm8962_set_pdata_from_of(struct i2c_client *i2c,
3541 pdata->gpio_init[i] = 0x0; 3542 pdata->gpio_init[i] = 0x0;
3542 } 3543 }
3543 3544
3545 pdata->mclk = devm_clk_get(&i2c->dev, NULL);
3546
3544 return 0; 3547 return 0;
3545} 3548}
3546 3549
@@ -3572,6 +3575,14 @@ static int wm8962_i2c_probe(struct i2c_client *i2c,
3572 return ret; 3575 return ret;
3573 } 3576 }
3574 3577
3578 /* Mark the mclk pointer to NULL if no mclk assigned */
3579 if (IS_ERR(wm8962->pdata.mclk)) {
3580 /* But do not ignore the request for probe defer */
3581 if (PTR_ERR(wm8962->pdata.mclk) == -EPROBE_DEFER)
3582 return -EPROBE_DEFER;
3583 wm8962->pdata.mclk = NULL;
3584 }
3585
3575 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) 3586 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++)
3576 wm8962->supplies[i].supply = wm8962_supply_names[i]; 3587 wm8962->supplies[i].supply = wm8962_supply_names[i];
3577 3588
@@ -3780,6 +3791,12 @@ static int wm8962_runtime_resume(struct device *dev)
3780 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); 3791 struct wm8962_priv *wm8962 = dev_get_drvdata(dev);
3781 int ret; 3792 int ret;
3782 3793
3794 ret = clk_prepare_enable(wm8962->pdata.mclk);
3795 if (ret) {
3796 dev_err(dev, "Failed to enable MCLK: %d\n", ret);
3797 return ret;
3798 }
3799
3783 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), 3800 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies),
3784 wm8962->supplies); 3801 wm8962->supplies);
3785 if (ret != 0) { 3802 if (ret != 0) {
@@ -3839,6 +3856,8 @@ static int wm8962_runtime_suspend(struct device *dev)
3839 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), 3856 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies),
3840 wm8962->supplies); 3857 wm8962->supplies);
3841 3858
3859 clk_disable_unprepare(wm8962->pdata.mclk);
3860
3842 return 0; 3861 return 0;
3843} 3862}
3844#endif 3863#endif
diff --git a/sound/soc/codecs/wm8971.c b/sound/soc/codecs/wm8971.c
index 09b7b4200221..0499cd4cfb71 100644
--- a/sound/soc/codecs/wm8971.c
+++ b/sound/soc/codecs/wm8971.c
@@ -517,16 +517,16 @@ static int wm8971_pcm_hw_params(struct snd_pcm_substream *substream,
517 int coeff = get_coeff(wm8971->sysclk, params_rate(params)); 517 int coeff = get_coeff(wm8971->sysclk, params_rate(params));
518 518
519 /* bit size */ 519 /* bit size */
520 switch (params_format(params)) { 520 switch (params_width(params)) {
521 case SNDRV_PCM_FORMAT_S16_LE: 521 case 16:
522 break; 522 break;
523 case SNDRV_PCM_FORMAT_S20_3LE: 523 case 20:
524 iface |= 0x0004; 524 iface |= 0x0004;
525 break; 525 break;
526 case SNDRV_PCM_FORMAT_S24_LE: 526 case 24:
527 iface |= 0x0008; 527 iface |= 0x0008;
528 break; 528 break;
529 case SNDRV_PCM_FORMAT_S32_LE: 529 case 32:
530 iface |= 0x000c; 530 iface |= 0x000c;
531 break; 531 break;
532 } 532 }
diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c
index 0627c56fa44e..682e9eda1019 100644
--- a/sound/soc/codecs/wm8974.c
+++ b/sound/soc/codecs/wm8974.c
@@ -445,16 +445,16 @@ static int wm8974_pcm_hw_params(struct snd_pcm_substream *substream,
445 u16 adn = snd_soc_read(codec, WM8974_ADD) & 0x1f1; 445 u16 adn = snd_soc_read(codec, WM8974_ADD) & 0x1f1;
446 446
447 /* bit size */ 447 /* bit size */
448 switch (params_format(params)) { 448 switch (params_width(params)) {
449 case SNDRV_PCM_FORMAT_S16_LE: 449 case 16:
450 break; 450 break;
451 case SNDRV_PCM_FORMAT_S20_3LE: 451 case 20:
452 iface |= 0x0020; 452 iface |= 0x0020;
453 break; 453 break;
454 case SNDRV_PCM_FORMAT_S24_LE: 454 case 24:
455 iface |= 0x0040; 455 iface |= 0x0040;
456 break; 456 break;
457 case SNDRV_PCM_FORMAT_S32_LE: 457 case 32:
458 iface |= 0x0060; 458 iface |= 0x0060;
459 break; 459 break;
460 } 460 }
diff --git a/sound/soc/codecs/wm8978.c b/sound/soc/codecs/wm8978.c
index 28ef46c91f62..ee2ba574952b 100644
--- a/sound/soc/codecs/wm8978.c
+++ b/sound/soc/codecs/wm8978.c
@@ -736,16 +736,16 @@ static int wm8978_hw_params(struct snd_pcm_substream *substream,
736 return -EINVAL; 736 return -EINVAL;
737 737
738 /* bit size */ 738 /* bit size */
739 switch (params_format(params)) { 739 switch (params_width(params)) {
740 case SNDRV_PCM_FORMAT_S16_LE: 740 case 16:
741 break; 741 break;
742 case SNDRV_PCM_FORMAT_S20_3LE: 742 case 20:
743 iface_ctl |= 0x20; 743 iface_ctl |= 0x20;
744 break; 744 break;
745 case SNDRV_PCM_FORMAT_S24_LE: 745 case 24:
746 iface_ctl |= 0x40; 746 iface_ctl |= 0x40;
747 break; 747 break;
748 case SNDRV_PCM_FORMAT_S32_LE: 748 case 32:
749 iface_ctl |= 0x60; 749 iface_ctl |= 0x60;
750 break; 750 break;
751 } 751 }
@@ -817,8 +817,8 @@ static int wm8978_hw_params(struct snd_pcm_substream *substream,
817 wm8978->sysclk == WM8978_MCLK ? 817 wm8978->sysclk == WM8978_MCLK ?
818 ", consider using PLL" : ""); 818 ", consider using PLL" : "");
819 819
820 dev_dbg(codec->dev, "%s: fmt %d, rate %u, MCLK divisor #%d\n", __func__, 820 dev_dbg(codec->dev, "%s: width %d, rate %u, MCLK divisor #%d\n", __func__,
821 params_format(params), params_rate(params), best); 821 params_width(params), params_rate(params), best);
822 822
823 /* MCLK divisor mask = 0xe0 */ 823 /* MCLK divisor mask = 0xe0 */
824 snd_soc_update_bits(codec, WM8978_CLOCKING, 0xe0, best << 5); 824 snd_soc_update_bits(codec, WM8978_CLOCKING, 0xe0, best << 5);
diff --git a/sound/soc/codecs/wm8983.c b/sound/soc/codecs/wm8983.c
index 19d5baa38f5c..ac5defda8824 100644
--- a/sound/soc/codecs/wm8983.c
+++ b/sound/soc/codecs/wm8983.c
@@ -719,22 +719,22 @@ static int wm8983_hw_params(struct snd_pcm_substream *substream,
719 719
720 wm8983->bclk = ret; 720 wm8983->bclk = ret;
721 721
722 switch (params_format(params)) { 722 switch (params_width(params)) {
723 case SNDRV_PCM_FORMAT_S16_LE: 723 case 16:
724 blen = 0x0; 724 blen = 0x0;
725 break; 725 break;
726 case SNDRV_PCM_FORMAT_S20_3LE: 726 case 20:
727 blen = 0x1; 727 blen = 0x1;
728 break; 728 break;
729 case SNDRV_PCM_FORMAT_S24_LE: 729 case 24:
730 blen = 0x2; 730 blen = 0x2;
731 break; 731 break;
732 case SNDRV_PCM_FORMAT_S32_LE: 732 case 32:
733 blen = 0x3; 733 blen = 0x3;
734 break; 734 break;
735 default: 735 default:
736 dev_err(dai->dev, "Unsupported word length %u\n", 736 dev_err(dai->dev, "Unsupported word length %u\n",
737 params_format(params)); 737 params_width(params));
738 return -EINVAL; 738 return -EINVAL;
739 } 739 }
740 740
diff --git a/sound/soc/codecs/wm8985.c b/sound/soc/codecs/wm8985.c
index 0f5780c09f3a..ee380190399f 100644
--- a/sound/soc/codecs/wm8985.c
+++ b/sound/soc/codecs/wm8985.c
@@ -698,22 +698,22 @@ static int wm8985_hw_params(struct snd_pcm_substream *substream,
698 if ((int)wm8985->bclk < 0) 698 if ((int)wm8985->bclk < 0)
699 return wm8985->bclk; 699 return wm8985->bclk;
700 700
701 switch (params_format(params)) { 701 switch (params_width(params)) {
702 case SNDRV_PCM_FORMAT_S16_LE: 702 case 16:
703 blen = 0x0; 703 blen = 0x0;
704 break; 704 break;
705 case SNDRV_PCM_FORMAT_S20_3LE: 705 case 20:
706 blen = 0x1; 706 blen = 0x1;
707 break; 707 break;
708 case SNDRV_PCM_FORMAT_S24_LE: 708 case 24:
709 blen = 0x2; 709 blen = 0x2;
710 break; 710 break;
711 case SNDRV_PCM_FORMAT_S32_LE: 711 case 32:
712 blen = 0x3; 712 blen = 0x3;
713 break; 713 break;
714 default: 714 default:
715 dev_err(dai->dev, "Unsupported word length %u\n", 715 dev_err(dai->dev, "Unsupported word length %u\n",
716 params_format(params)); 716 params_width(params));
717 return -EINVAL; 717 return -EINVAL;
718 } 718 }
719 719
@@ -980,9 +980,6 @@ static int wm8985_resume(struct snd_soc_codec *codec)
980 980
981static int wm8985_remove(struct snd_soc_codec *codec) 981static int wm8985_remove(struct snd_soc_codec *codec)
982{ 982{
983 struct wm8985_priv *wm8985;
984
985 wm8985 = snd_soc_codec_get_drvdata(codec);
986 wm8985_set_bias_level(codec, SND_SOC_BIAS_OFF); 983 wm8985_set_bias_level(codec, SND_SOC_BIAS_OFF);
987 return 0; 984 return 0;
988} 985}
diff --git a/sound/soc/codecs/wm8988.c b/sound/soc/codecs/wm8988.c
index d3fea46d58e8..a5130d965146 100644
--- a/sound/soc/codecs/wm8988.c
+++ b/sound/soc/codecs/wm8988.c
@@ -687,16 +687,16 @@ static int wm8988_pcm_hw_params(struct snd_pcm_substream *substream,
687 } 687 }
688 688
689 /* bit size */ 689 /* bit size */
690 switch (params_format(params)) { 690 switch (params_width(params)) {
691 case SNDRV_PCM_FORMAT_S16_LE: 691 case 16:
692 break; 692 break;
693 case SNDRV_PCM_FORMAT_S20_3LE: 693 case 20:
694 iface |= 0x0004; 694 iface |= 0x0004;
695 break; 695 break;
696 case SNDRV_PCM_FORMAT_S24_LE: 696 case 24:
697 iface |= 0x0008; 697 iface |= 0x0008;
698 break; 698 break;
699 case SNDRV_PCM_FORMAT_S32_LE: 699 case 32:
700 iface |= 0x000c; 700 iface |= 0x000c;
701 break; 701 break;
702 } 702 }
diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c
index b5c1f0f07058..03e43e3f395e 100644
--- a/sound/soc/codecs/wm8990.c
+++ b/sound/soc/codecs/wm8990.c
@@ -1073,16 +1073,16 @@ static int wm8990_hw_params(struct snd_pcm_substream *substream,
1073 1073
1074 audio1 &= ~WM8990_AIF_WL_MASK; 1074 audio1 &= ~WM8990_AIF_WL_MASK;
1075 /* bit size */ 1075 /* bit size */
1076 switch (params_format(params)) { 1076 switch (params_width(params)) {
1077 case SNDRV_PCM_FORMAT_S16_LE: 1077 case 16:
1078 break; 1078 break;
1079 case SNDRV_PCM_FORMAT_S20_3LE: 1079 case 20:
1080 audio1 |= WM8990_AIF_WL_20BITS; 1080 audio1 |= WM8990_AIF_WL_20BITS;
1081 break; 1081 break;
1082 case SNDRV_PCM_FORMAT_S24_LE: 1082 case 24:
1083 audio1 |= WM8990_AIF_WL_24BITS; 1083 audio1 |= WM8990_AIF_WL_24BITS;
1084 break; 1084 break;
1085 case SNDRV_PCM_FORMAT_S32_LE: 1085 case 32:
1086 audio1 |= WM8990_AIF_WL_32BITS; 1086 audio1 |= WM8990_AIF_WL_32BITS;
1087 break; 1087 break;
1088 } 1088 }
diff --git a/sound/soc/codecs/wm8991.c b/sound/soc/codecs/wm8991.c
index b8fd284fc0c0..d0be89731cdb 100644
--- a/sound/soc/codecs/wm8991.c
+++ b/sound/soc/codecs/wm8991.c
@@ -1081,16 +1081,16 @@ static int wm8991_hw_params(struct snd_pcm_substream *substream,
1081 1081
1082 audio1 &= ~WM8991_AIF_WL_MASK; 1082 audio1 &= ~WM8991_AIF_WL_MASK;
1083 /* bit size */ 1083 /* bit size */
1084 switch (params_format(params)) { 1084 switch (params_width(params)) {
1085 case SNDRV_PCM_FORMAT_S16_LE: 1085 case 16:
1086 break; 1086 break;
1087 case SNDRV_PCM_FORMAT_S20_3LE: 1087 case 20:
1088 audio1 |= WM8991_AIF_WL_20BITS; 1088 audio1 |= WM8991_AIF_WL_20BITS;
1089 break; 1089 break;
1090 case SNDRV_PCM_FORMAT_S24_LE: 1090 case 24:
1091 audio1 |= WM8991_AIF_WL_24BITS; 1091 audio1 |= WM8991_AIF_WL_24BITS;
1092 break; 1092 break;
1093 case SNDRV_PCM_FORMAT_S32_LE: 1093 case 32:
1094 audio1 |= WM8991_AIF_WL_32BITS; 1094 audio1 |= WM8991_AIF_WL_32BITS;
1095 break; 1095 break;
1096 } 1096 }
diff --git a/sound/soc/codecs/wm8993.c b/sound/soc/codecs/wm8993.c
index f825dc04ebe1..93b14eda355a 100644
--- a/sound/soc/codecs/wm8993.c
+++ b/sound/soc/codecs/wm8993.c
@@ -1214,19 +1214,19 @@ static int wm8993_hw_params(struct snd_pcm_substream *substream,
1214 wm8993->tdm_slots, wm8993->tdm_width); 1214 wm8993->tdm_slots, wm8993->tdm_width);
1215 wm8993->bclk *= wm8993->tdm_width * wm8993->tdm_slots; 1215 wm8993->bclk *= wm8993->tdm_width * wm8993->tdm_slots;
1216 } else { 1216 } else {
1217 switch (params_format(params)) { 1217 switch (params_width(params)) {
1218 case SNDRV_PCM_FORMAT_S16_LE: 1218 case 16:
1219 wm8993->bclk *= 16; 1219 wm8993->bclk *= 16;
1220 break; 1220 break;
1221 case SNDRV_PCM_FORMAT_S20_3LE: 1221 case 20:
1222 wm8993->bclk *= 20; 1222 wm8993->bclk *= 20;
1223 aif1 |= 0x8; 1223 aif1 |= 0x8;
1224 break; 1224 break;
1225 case SNDRV_PCM_FORMAT_S24_LE: 1225 case 24:
1226 wm8993->bclk *= 24; 1226 wm8993->bclk *= 24;
1227 aif1 |= 0x10; 1227 aif1 |= 0x10;
1228 break; 1228 break;
1229 case SNDRV_PCM_FORMAT_S32_LE: 1229 case 32:
1230 wm8993->bclk *= 32; 1230 wm8993->bclk *= 32;
1231 aif1 |= 0x18; 1231 aif1 |= 0x18;
1232 break; 1232 break;
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index 9719d3ca8e47..6cc0566dc29a 100644
--- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c
@@ -2815,19 +2815,19 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream,
2815 } 2815 }
2816 2816
2817 bclk_rate = params_rate(params); 2817 bclk_rate = params_rate(params);
2818 switch (params_format(params)) { 2818 switch (params_width(params)) {
2819 case SNDRV_PCM_FORMAT_S16_LE: 2819 case 16:
2820 bclk_rate *= 16; 2820 bclk_rate *= 16;
2821 break; 2821 break;
2822 case SNDRV_PCM_FORMAT_S20_3LE: 2822 case 20:
2823 bclk_rate *= 20; 2823 bclk_rate *= 20;
2824 aif1 |= 0x20; 2824 aif1 |= 0x20;
2825 break; 2825 break;
2826 case SNDRV_PCM_FORMAT_S24_LE: 2826 case 24:
2827 bclk_rate *= 24; 2827 bclk_rate *= 24;
2828 aif1 |= 0x40; 2828 aif1 |= 0x40;
2829 break; 2829 break;
2830 case SNDRV_PCM_FORMAT_S32_LE: 2830 case 32:
2831 bclk_rate *= 32; 2831 bclk_rate *= 32;
2832 aif1 |= 0x60; 2832 aif1 |= 0x60;
2833 break; 2833 break;
@@ -2966,16 +2966,16 @@ static int wm8994_aif3_hw_params(struct snd_pcm_substream *substream,
2966 return 0; 2966 return 0;
2967 } 2967 }
2968 2968
2969 switch (params_format(params)) { 2969 switch (params_width(params)) {
2970 case SNDRV_PCM_FORMAT_S16_LE: 2970 case 16:
2971 break; 2971 break;
2972 case SNDRV_PCM_FORMAT_S20_3LE: 2972 case 20:
2973 aif1 |= 0x20; 2973 aif1 |= 0x20;
2974 break; 2974 break;
2975 case SNDRV_PCM_FORMAT_S24_LE: 2975 case 24:
2976 aif1 |= 0x40; 2976 aif1 |= 0x40;
2977 break; 2977 break;
2978 case SNDRV_PCM_FORMAT_S32_LE: 2978 case 32:
2979 aif1 |= 0x60; 2979 aif1 |= 0x60;
2980 break; 2980 break;
2981 default: 2981 default:
@@ -3296,12 +3296,8 @@ static void wm8994_handle_pdata(struct wm8994_priv *wm8994)
3296 /* We need an array of texts for the enum API */ 3296 /* We need an array of texts for the enum API */
3297 wm8994->drc_texts = devm_kzalloc(wm8994->hubs.codec->dev, 3297 wm8994->drc_texts = devm_kzalloc(wm8994->hubs.codec->dev,
3298 sizeof(char *) * pdata->num_drc_cfgs, GFP_KERNEL); 3298 sizeof(char *) * pdata->num_drc_cfgs, GFP_KERNEL);
3299 if (!wm8994->drc_texts) { 3299 if (!wm8994->drc_texts)
3300 dev_err(wm8994->hubs.codec->dev,
3301 "Failed to allocate %d DRC config texts\n",
3302 pdata->num_drc_cfgs);
3303 return; 3300 return;
3304 }
3305 3301
3306 for (i = 0; i < pdata->num_drc_cfgs; i++) 3302 for (i = 0; i < pdata->num_drc_cfgs; i++)
3307 wm8994->drc_texts[i] = pdata->drc_cfgs[i].name; 3303 wm8994->drc_texts[i] = pdata->drc_cfgs[i].name;
diff --git a/sound/soc/codecs/wm8995.c b/sound/soc/codecs/wm8995.c
index 863a2c38bcb5..cae4ac5a5730 100644
--- a/sound/soc/codecs/wm8995.c
+++ b/sound/soc/codecs/wm8995.c
@@ -1597,21 +1597,21 @@ static int wm8995_hw_params(struct snd_pcm_substream *substream,
1597 return bclk_rate; 1597 return bclk_rate;
1598 1598
1599 aif1 = 0; 1599 aif1 = 0;
1600 switch (params_format(params)) { 1600 switch (params_width(params)) {
1601 case SNDRV_PCM_FORMAT_S16_LE: 1601 case 16:
1602 break; 1602 break;
1603 case SNDRV_PCM_FORMAT_S20_3LE: 1603 case 20:
1604 aif1 |= (0x1 << WM8995_AIF1_WL_SHIFT); 1604 aif1 |= (0x1 << WM8995_AIF1_WL_SHIFT);
1605 break; 1605 break;
1606 case SNDRV_PCM_FORMAT_S24_LE: 1606 case 24:
1607 aif1 |= (0x2 << WM8995_AIF1_WL_SHIFT); 1607 aif1 |= (0x2 << WM8995_AIF1_WL_SHIFT);
1608 break; 1608 break;
1609 case SNDRV_PCM_FORMAT_S32_LE: 1609 case 32:
1610 aif1 |= (0x3 << WM8995_AIF1_WL_SHIFT); 1610 aif1 |= (0x3 << WM8995_AIF1_WL_SHIFT);
1611 break; 1611 break;
1612 default: 1612 default:
1613 dev_err(dai->dev, "Unsupported word length %u\n", 1613 dev_err(dai->dev, "Unsupported word length %u\n",
1614 params_format(params)); 1614 params_width(params));
1615 return -EINVAL; 1615 return -EINVAL;
1616 } 1616 }
1617 1617
diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c
index 69266332760e..f16ff4f56923 100644
--- a/sound/soc/codecs/wm8996.c
+++ b/sound/soc/codecs/wm8996.c
@@ -620,15 +620,12 @@ static int bg_event(struct snd_soc_dapm_widget *w,
620static int cp_event(struct snd_soc_dapm_widget *w, 620static int cp_event(struct snd_soc_dapm_widget *w,
621 struct snd_kcontrol *kcontrol, int event) 621 struct snd_kcontrol *kcontrol, int event)
622{ 622{
623 int ret = 0;
624
625 switch (event) { 623 switch (event) {
626 case SND_SOC_DAPM_POST_PMU: 624 case SND_SOC_DAPM_POST_PMU:
627 msleep(5); 625 msleep(5);
628 break; 626 break;
629 default: 627 default:
630 WARN(1, "Invalid event %d\n", event); 628 WARN(1, "Invalid event %d\n", event);
631 ret = -EINVAL;
632 } 629 }
633 630
634 return 0; 631 return 0;
@@ -690,8 +687,7 @@ static void wait_for_dc_servo(struct snd_soc_codec *codec, u16 mask)
690static void wm8996_seq_notifier(struct snd_soc_dapm_context *dapm, 687static void wm8996_seq_notifier(struct snd_soc_dapm_context *dapm,
691 enum snd_soc_dapm_type event, int subseq) 688 enum snd_soc_dapm_type event, int subseq)
692{ 689{
693 struct snd_soc_codec *codec = container_of(dapm, 690 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);
694 struct snd_soc_codec, dapm);
695 struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); 691 struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec);
696 u16 val, mask; 692 u16 val, mask;
697 693
diff --git a/sound/soc/codecs/wm8997.c b/sound/soc/codecs/wm8997.c
index bb9b47b956aa..ab33fe596519 100644
--- a/sound/soc/codecs/wm8997.c
+++ b/sound/soc/codecs/wm8997.c
@@ -967,6 +967,7 @@ static struct snd_soc_dai_driver wm8997_dai[] = {
967 }, 967 },
968 .ops = &arizona_dai_ops, 968 .ops = &arizona_dai_ops,
969 .symmetric_rates = 1, 969 .symmetric_rates = 1,
970 .symmetric_samplebits = 1,
970 }, 971 },
971 { 972 {
972 .name = "wm8997-aif2", 973 .name = "wm8997-aif2",
@@ -988,6 +989,7 @@ static struct snd_soc_dai_driver wm8997_dai[] = {
988 }, 989 },
989 .ops = &arizona_dai_ops, 990 .ops = &arizona_dai_ops,
990 .symmetric_rates = 1, 991 .symmetric_rates = 1,
992 .symmetric_samplebits = 1,
991 }, 993 },
992 { 994 {
993 .name = "wm8997-slim1", 995 .name = "wm8997-slim1",
diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c
index 185eb97769e7..0cdc9e2184ab 100644
--- a/sound/soc/codecs/wm9081.c
+++ b/sound/soc/codecs/wm9081.c
@@ -1029,19 +1029,19 @@ static int wm9081_hw_params(struct snd_pcm_substream *substream,
1029 /* Otherwise work out a BCLK from the sample size */ 1029 /* Otherwise work out a BCLK from the sample size */
1030 wm9081->bclk = 2 * wm9081->fs; 1030 wm9081->bclk = 2 * wm9081->fs;
1031 1031
1032 switch (params_format(params)) { 1032 switch (params_width(params)) {
1033 case SNDRV_PCM_FORMAT_S16_LE: 1033 case 16:
1034 wm9081->bclk *= 16; 1034 wm9081->bclk *= 16;
1035 break; 1035 break;
1036 case SNDRV_PCM_FORMAT_S20_3LE: 1036 case 20:
1037 wm9081->bclk *= 20; 1037 wm9081->bclk *= 20;
1038 aif2 |= 0x4; 1038 aif2 |= 0x4;
1039 break; 1039 break;
1040 case SNDRV_PCM_FORMAT_S24_LE: 1040 case 24:
1041 wm9081->bclk *= 24; 1041 wm9081->bclk *= 24;
1042 aif2 |= 0x8; 1042 aif2 |= 0x8;
1043 break; 1043 break;
1044 case SNDRV_PCM_FORMAT_S32_LE: 1044 case 32:
1045 wm9081->bclk *= 32; 1045 wm9081->bclk *= 32;
1046 aif2 |= 0xc; 1046 aif2 |= 0xc;
1047 break; 1047 break;
diff --git a/sound/soc/codecs/wm9090.c b/sound/soc/codecs/wm9090.c
index 87934171f063..a13f0725611a 100644
--- a/sound/soc/codecs/wm9090.c
+++ b/sound/soc/codecs/wm9090.c
@@ -613,10 +613,8 @@ static int wm9090_i2c_probe(struct i2c_client *i2c,
613 int ret; 613 int ret;
614 614
615 wm9090 = devm_kzalloc(&i2c->dev, sizeof(*wm9090), GFP_KERNEL); 615 wm9090 = devm_kzalloc(&i2c->dev, sizeof(*wm9090), GFP_KERNEL);
616 if (wm9090 == NULL) { 616 if (!wm9090)
617 dev_err(&i2c->dev, "Can not allocate memory\n");
618 return -ENOMEM; 617 return -ENOMEM;
619 }
620 618
621 wm9090->regmap = devm_regmap_init_i2c(i2c, &wm9090_regmap); 619 wm9090->regmap = devm_regmap_init_i2c(i2c, &wm9090_regmap);
622 if (IS_ERR(wm9090->regmap)) { 620 if (IS_ERR(wm9090->regmap)) {
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c
index 2a9c6d11330c..bddee30a4bc7 100644
--- a/sound/soc/codecs/wm9713.c
+++ b/sound/soc/codecs/wm9713.c
@@ -953,16 +953,16 @@ static int wm9713_pcm_hw_params(struct snd_pcm_substream *substream,
953 struct snd_soc_codec *codec = dai->codec; 953 struct snd_soc_codec *codec = dai->codec;
954 u16 reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0xfff3; 954 u16 reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0xfff3;
955 955
956 switch (params_format(params)) { 956 switch (params_width(params)) {
957 case SNDRV_PCM_FORMAT_S16_LE: 957 case 16:
958 break; 958 break;
959 case SNDRV_PCM_FORMAT_S20_3LE: 959 case 20:
960 reg |= 0x0004; 960 reg |= 0x0004;
961 break; 961 break;
962 case SNDRV_PCM_FORMAT_S24_LE: 962 case 24:
963 reg |= 0x0008; 963 reg |= 0x0008;
964 break; 964 break;
965 case SNDRV_PCM_FORMAT_S32_LE: 965 case 32:
966 reg |= 0x000c; 966 reg |= 0x000c;
967 break; 967 break;
968 } 968 }
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index 2537725dd53f..f412a9911a75 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -1382,7 +1382,7 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
1382 int ret; 1382 int ret;
1383 int val; 1383 int val;
1384 1384
1385 dsp->card = codec->card; 1385 dsp->card = codec->component.card;
1386 1386
1387 switch (event) { 1387 switch (event) {
1388 case SND_SOC_DAPM_POST_PMU: 1388 case SND_SOC_DAPM_POST_PMU:
@@ -1617,7 +1617,7 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
1617 struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec); 1617 struct wm_adsp *dsps = snd_soc_codec_get_drvdata(codec);
1618 struct wm_adsp *dsp = &dsps[w->shift]; 1618 struct wm_adsp *dsp = &dsps[w->shift];
1619 1619
1620 dsp->card = codec->card; 1620 dsp->card = codec->component.card;
1621 1621
1622 switch (event) { 1622 switch (event) {
1623 case SND_SOC_DAPM_PRE_PMU: 1623 case SND_SOC_DAPM_PRE_PMU:
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c
index 916817fe6632..374537d5e179 100644
--- a/sound/soc/codecs/wm_hubs.c
+++ b/sound/soc/codecs/wm_hubs.c
@@ -183,10 +183,8 @@ static void wm_hubs_dcs_cache_set(struct snd_soc_codec *codec, u16 dcs_cfg)
183 return; 183 return;
184 184
185 cache = devm_kzalloc(codec->dev, sizeof(*cache), GFP_KERNEL); 185 cache = devm_kzalloc(codec->dev, sizeof(*cache), GFP_KERNEL);
186 if (!cache) { 186 if (!cache)
187 dev_err(codec->dev, "Failed to allocate DCS cache entry\n");
188 return; 187 return;
189 }
190 188
191 cache->left = snd_soc_read(codec, WM8993_LEFT_OUTPUT_VOLUME); 189 cache->left = snd_soc_read(codec, WM8993_LEFT_OUTPUT_VOLUME);
192 cache->left &= WM8993_HPOUT1L_VOL_MASK; 190 cache->left &= WM8993_HPOUT1L_VOL_MASK;