aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-10-24 06:24:18 -0400
committerMark Brown <broonie@linaro.org>2013-10-24 06:24:18 -0400
commitcd77607f57d224236e33d86b92ee330927681457 (patch)
tree53221d2a2bb5b5620fa2c786c45a86f78081ba26
parentd12649452d3e15b622053b3f7c4f57b3cee77cf3 (diff)
parentb8cc4151f8af97e1b573ca399a77f439f401a57e (diff)
Merge remote-tracking branch 'asoc/topic/wm8400' into asoc-next
-rw-r--r--sound/soc/codecs/wm8400.c95
1 files changed, 20 insertions, 75 deletions
diff --git a/sound/soc/codecs/wm8400.c b/sound/soc/codecs/wm8400.c
index d2a092850283..48dc7d2fee36 100644
--- a/sound/soc/codecs/wm8400.c
+++ b/sound/soc/codecs/wm8400.c
@@ -32,13 +32,6 @@
32 32
33#include "wm8400.h" 33#include "wm8400.h"
34 34
35/* Fake register for internal state */
36#define WM8400_INTDRIVBITS (WM8400_REGISTER_COUNT + 1)
37#define WM8400_INMIXL_PWR 0
38#define WM8400_AINLMUX_PWR 1
39#define WM8400_INMIXR_PWR 2
40#define WM8400_AINRMUX_PWR 3
41
42static struct regulator_bulk_data power[] = { 35static struct regulator_bulk_data power[] = {
43 { 36 {
44 .supply = "I2S1VDD", 37 .supply = "I2S1VDD",
@@ -74,32 +67,6 @@ struct wm8400_priv {
74 int fll_in, fll_out; 67 int fll_in, fll_out;
75}; 68};
76 69
77static inline unsigned int wm8400_read(struct snd_soc_codec *codec,
78 unsigned int reg)
79{
80 struct wm8400_priv *wm8400 = snd_soc_codec_get_drvdata(codec);
81
82 if (reg == WM8400_INTDRIVBITS)
83 return wm8400->fake_register;
84 else
85 return wm8400_reg_read(wm8400->wm8400, reg);
86}
87
88/*
89 * write to the wm8400 register space
90 */
91static int wm8400_write(struct snd_soc_codec *codec, unsigned int reg,
92 unsigned int value)
93{
94 struct wm8400_priv *wm8400 = snd_soc_codec_get_drvdata(codec);
95
96 if (reg == WM8400_INTDRIVBITS) {
97 wm8400->fake_register = value;
98 return 0;
99 } else
100 return wm8400_set_bits(wm8400->wm8400, reg, 0xffff, value);
101}
102
103static void wm8400_codec_reset(struct snd_soc_codec *codec) 70static void wm8400_codec_reset(struct snd_soc_codec *codec)
104{ 71{
105 struct wm8400_priv *wm8400 = snd_soc_codec_get_drvdata(codec); 72 struct wm8400_priv *wm8400 = snd_soc_codec_get_drvdata(codec);
@@ -352,32 +319,6 @@ SOC_SINGLE("RIN34 Mute Switch", WM8400_RIGHT_LINE_INPUT_3_4_VOLUME,
352 * _DAPM_ Controls 319 * _DAPM_ Controls
353 */ 320 */
354 321
355static int inmixer_event (struct snd_soc_dapm_widget *w,
356 struct snd_kcontrol *kcontrol, int event)
357{
358 u16 reg, fakepower;
359
360 reg = snd_soc_read(w->codec, WM8400_POWER_MANAGEMENT_2);
361 fakepower = snd_soc_read(w->codec, WM8400_INTDRIVBITS);
362
363 if (fakepower & ((1 << WM8400_INMIXL_PWR) |
364 (1 << WM8400_AINLMUX_PWR))) {
365 reg |= WM8400_AINL_ENA;
366 } else {
367 reg &= ~WM8400_AINL_ENA;
368 }
369
370 if (fakepower & ((1 << WM8400_INMIXR_PWR) |
371 (1 << WM8400_AINRMUX_PWR))) {
372 reg |= WM8400_AINR_ENA;
373 } else {
374 reg &= ~WM8400_AINR_ENA;
375 }
376 snd_soc_write(w->codec, WM8400_POWER_MANAGEMENT_2, reg);
377
378 return 0;
379}
380
381static int outmixer_event (struct snd_soc_dapm_widget *w, 322static int outmixer_event (struct snd_soc_dapm_widget *w,
382 struct snd_kcontrol * kcontrol, int event) 323 struct snd_kcontrol * kcontrol, int event)
383{ 324{
@@ -658,27 +599,26 @@ SND_SOC_DAPM_MIXER("RIN34 PGA", WM8400_POWER_MANAGEMENT_2,
658 0, &wm8400_dapm_rin34_pga_controls[0], 599 0, &wm8400_dapm_rin34_pga_controls[0],
659 ARRAY_SIZE(wm8400_dapm_rin34_pga_controls)), 600 ARRAY_SIZE(wm8400_dapm_rin34_pga_controls)),
660 601
602SND_SOC_DAPM_SUPPLY("INL", WM8400_POWER_MANAGEMENT_2, WM8400_AINL_ENA_SHIFT,
603 0, NULL, 0),
604SND_SOC_DAPM_SUPPLY("INR", WM8400_POWER_MANAGEMENT_2, WM8400_AINR_ENA_SHIFT,
605 0, NULL, 0),
606
661/* INMIXL */ 607/* INMIXL */
662SND_SOC_DAPM_MIXER_E("INMIXL", WM8400_INTDRIVBITS, WM8400_INMIXL_PWR, 0, 608SND_SOC_DAPM_MIXER("INMIXL", SND_SOC_NOPM, 0, 0,
663 &wm8400_dapm_inmixl_controls[0], 609 &wm8400_dapm_inmixl_controls[0],
664 ARRAY_SIZE(wm8400_dapm_inmixl_controls), 610 ARRAY_SIZE(wm8400_dapm_inmixl_controls)),
665 inmixer_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
666 611
667/* AINLMUX */ 612/* AINLMUX */
668SND_SOC_DAPM_MUX_E("AILNMUX", WM8400_INTDRIVBITS, WM8400_AINLMUX_PWR, 0, 613SND_SOC_DAPM_MUX("AILNMUX", SND_SOC_NOPM, 0, 0, &wm8400_dapm_ainlmux_controls),
669 &wm8400_dapm_ainlmux_controls, inmixer_event,
670 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
671 614
672/* INMIXR */ 615/* INMIXR */
673SND_SOC_DAPM_MIXER_E("INMIXR", WM8400_INTDRIVBITS, WM8400_INMIXR_PWR, 0, 616SND_SOC_DAPM_MIXER("INMIXR", SND_SOC_NOPM, 0, 0,
674 &wm8400_dapm_inmixr_controls[0], 617 &wm8400_dapm_inmixr_controls[0],
675 ARRAY_SIZE(wm8400_dapm_inmixr_controls), 618 ARRAY_SIZE(wm8400_dapm_inmixr_controls)),
676 inmixer_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
677 619
678/* AINRMUX */ 620/* AINRMUX */
679SND_SOC_DAPM_MUX_E("AIRNMUX", WM8400_INTDRIVBITS, WM8400_AINRMUX_PWR, 0, 621SND_SOC_DAPM_MUX("AIRNMUX", SND_SOC_NOPM, 0, 0, &wm8400_dapm_ainrmux_controls),
680 &wm8400_dapm_ainrmux_controls, inmixer_event,
681 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
682 622
683/* Output Side */ 623/* Output Side */
684/* DACs */ 624/* DACs */
@@ -789,11 +729,13 @@ static const struct snd_soc_dapm_route wm8400_dapm_routes[] = {
789 {"LIN34 PGA", "LIN3 Switch", "LIN3"}, 729 {"LIN34 PGA", "LIN3 Switch", "LIN3"},
790 {"LIN34 PGA", "LIN4 Switch", "LIN4/RXN"}, 730 {"LIN34 PGA", "LIN4 Switch", "LIN4/RXN"},
791 /* INMIXL */ 731 /* INMIXL */
732 {"INMIXL", NULL, "INL"},
792 {"INMIXL", "Record Left Volume", "LOMIX"}, 733 {"INMIXL", "Record Left Volume", "LOMIX"},
793 {"INMIXL", "LIN2 Volume", "LIN2"}, 734 {"INMIXL", "LIN2 Volume", "LIN2"},
794 {"INMIXL", "LINPGA12 Switch", "LIN12 PGA"}, 735 {"INMIXL", "LINPGA12 Switch", "LIN12 PGA"},
795 {"INMIXL", "LINPGA34 Switch", "LIN34 PGA"}, 736 {"INMIXL", "LINPGA34 Switch", "LIN34 PGA"},
796 /* AILNMUX */ 737 /* AILNMUX */
738 {"AILNMUX", NULL, "INL"},
797 {"AILNMUX", "INMIXL Mix", "INMIXL"}, 739 {"AILNMUX", "INMIXL Mix", "INMIXL"},
798 {"AILNMUX", "DIFFINL Mix", "LIN12 PGA"}, 740 {"AILNMUX", "DIFFINL Mix", "LIN12 PGA"},
799 {"AILNMUX", "DIFFINL Mix", "LIN34 PGA"}, 741 {"AILNMUX", "DIFFINL Mix", "LIN34 PGA"},
@@ -808,12 +750,14 @@ static const struct snd_soc_dapm_route wm8400_dapm_routes[] = {
808 /* RIN34 PGA */ 750 /* RIN34 PGA */
809 {"RIN34 PGA", "RIN3 Switch", "RIN3"}, 751 {"RIN34 PGA", "RIN3 Switch", "RIN3"},
810 {"RIN34 PGA", "RIN4 Switch", "RIN4/RXP"}, 752 {"RIN34 PGA", "RIN4 Switch", "RIN4/RXP"},
811 /* INMIXL */ 753 /* INMIXR */
754 {"INMIXR", NULL, "INR"},
812 {"INMIXR", "Record Right Volume", "ROMIX"}, 755 {"INMIXR", "Record Right Volume", "ROMIX"},
813 {"INMIXR", "RIN2 Volume", "RIN2"}, 756 {"INMIXR", "RIN2 Volume", "RIN2"},
814 {"INMIXR", "RINPGA12 Switch", "RIN12 PGA"}, 757 {"INMIXR", "RINPGA12 Switch", "RIN12 PGA"},
815 {"INMIXR", "RINPGA34 Switch", "RIN34 PGA"}, 758 {"INMIXR", "RINPGA34 Switch", "RIN34 PGA"},
816 /* AIRNMUX */ 759 /* AIRNMUX */
760 {"AIRNMUX", NULL, "INR"},
817 {"AIRNMUX", "INMIXR Mix", "INMIXR"}, 761 {"AIRNMUX", "INMIXR Mix", "INMIXR"},
818 {"AIRNMUX", "DIFFINR Mix", "RIN12 PGA"}, 762 {"AIRNMUX", "DIFFINR Mix", "RIN12 PGA"},
819 {"AIRNMUX", "DIFFINR Mix", "RIN34 PGA"}, 763 {"AIRNMUX", "DIFFINR Mix", "RIN34 PGA"},
@@ -1365,9 +1309,12 @@ static int wm8400_codec_probe(struct snd_soc_codec *codec)
1365 return -ENOMEM; 1309 return -ENOMEM;
1366 1310
1367 snd_soc_codec_set_drvdata(codec, priv); 1311 snd_soc_codec_set_drvdata(codec, priv);
1368 codec->control_data = priv->wm8400 = wm8400; 1312 priv->wm8400 = wm8400;
1313 codec->control_data = wm8400->regmap;
1369 priv->codec = codec; 1314 priv->codec = codec;
1370 1315
1316 snd_soc_codec_set_cache_io(codec, 8, 16, SND_SOC_REGMAP);
1317
1371 ret = devm_regulator_bulk_get(wm8400->dev, 1318 ret = devm_regulator_bulk_get(wm8400->dev,
1372 ARRAY_SIZE(power), &power[0]); 1319 ARRAY_SIZE(power), &power[0]);
1373 if (ret != 0) { 1320 if (ret != 0) {
@@ -1414,8 +1361,6 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8400 = {
1414 .remove = wm8400_codec_remove, 1361 .remove = wm8400_codec_remove,
1415 .suspend = wm8400_suspend, 1362 .suspend = wm8400_suspend,
1416 .resume = wm8400_resume, 1363 .resume = wm8400_resume,
1417 .read = snd_soc_read,
1418 .write = wm8400_write,
1419 .set_bias_level = wm8400_set_bias_level, 1364 .set_bias_level = wm8400_set_bias_level,
1420 1365
1421 .controls = wm8400_snd_controls, 1366 .controls = wm8400_snd_controls,