diff options
-rw-r--r-- | Documentation/devicetree/bindings/sound/armada-370db-audio.txt | 9 | ||||
-rw-r--r-- | sound/soc/intel/mfld_machine.c | 51 | ||||
-rw-r--r-- | sound/soc/kirkwood/Kconfig | 1 | ||||
-rw-r--r-- | sound/soc/kirkwood/armada-370-db.c | 28 | ||||
-rw-r--r-- | sound/soc/soc-io.c | 35 |
5 files changed, 60 insertions, 64 deletions
diff --git a/Documentation/devicetree/bindings/sound/armada-370db-audio.txt b/Documentation/devicetree/bindings/sound/armada-370db-audio.txt index 3893b4d15a20..bf984d238620 100644 --- a/Documentation/devicetree/bindings/sound/armada-370db-audio.txt +++ b/Documentation/devicetree/bindings/sound/armada-370db-audio.txt | |||
@@ -11,14 +11,17 @@ Mandatory properties: | |||
11 | * marvell,audio-controller: a phandle that points to the audio | 11 | * marvell,audio-controller: a phandle that points to the audio |
12 | controller of the Armada 370 SoC. | 12 | controller of the Armada 370 SoC. |
13 | 13 | ||
14 | * marvell,audio-codec: a phandle that points to the analog audio | 14 | * marvell,audio-codec: a set of three phandles that points to: |
15 | codec connected to the Armada 370 SoC. | 15 | |
16 | 1/ the analog audio codec connected to the Armada 370 SoC | ||
17 | 2/ the S/PDIF transceiver | ||
18 | 3/ the S/PDIF receiver | ||
16 | 19 | ||
17 | Example: | 20 | Example: |
18 | 21 | ||
19 | sound { | 22 | sound { |
20 | compatible = "marvell,a370db-audio"; | 23 | compatible = "marvell,a370db-audio"; |
21 | marvell,audio-controller = <&audio_controller>; | 24 | marvell,audio-controller = <&audio_controller>; |
22 | marvell,audio-codec = <&audio_codec>; | 25 | marvell,audio-codec = <&audio_codec &spdif_out &spdif_in>; |
23 | status = "okay"; | 26 | status = "okay"; |
24 | }; | 27 | }; |
diff --git a/sound/soc/intel/mfld_machine.c b/sound/soc/intel/mfld_machine.c index 0cef32e9d402..031d78783fc8 100644 --- a/sound/soc/intel/mfld_machine.c +++ b/sound/soc/intel/mfld_machine.c | |||
@@ -53,6 +53,7 @@ enum soc_mic_bias_zones { | |||
53 | 53 | ||
54 | static unsigned int hs_switch; | 54 | static unsigned int hs_switch; |
55 | static unsigned int lo_dac; | 55 | static unsigned int lo_dac; |
56 | static struct snd_soc_codec *mfld_codec; | ||
56 | 57 | ||
57 | struct mfld_mc_private { | 58 | struct mfld_mc_private { |
58 | void __iomem *int_base; | 59 | void __iomem *int_base; |
@@ -100,8 +101,8 @@ static int headset_get_switch(struct snd_kcontrol *kcontrol, | |||
100 | static int headset_set_switch(struct snd_kcontrol *kcontrol, | 101 | static int headset_set_switch(struct snd_kcontrol *kcontrol, |
101 | struct snd_ctl_elem_value *ucontrol) | 102 | struct snd_ctl_elem_value *ucontrol) |
102 | { | 103 | { |
103 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 104 | struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); |
104 | struct snd_soc_dapm_context *dapm = &codec->dapm; | 105 | struct snd_soc_dapm_context *dapm = &card->dapm; |
105 | 106 | ||
106 | if (ucontrol->value.integer.value[0] == hs_switch) | 107 | if (ucontrol->value.integer.value[0] == hs_switch) |
107 | return 0; | 108 | return 0; |
@@ -127,10 +128,8 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol, | |||
127 | return 0; | 128 | return 0; |
128 | } | 129 | } |
129 | 130 | ||
130 | static void lo_enable_out_pins(struct snd_soc_codec *codec) | 131 | static void lo_enable_out_pins(struct snd_soc_dapm_context *dapm) |
131 | { | 132 | { |
132 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
133 | |||
134 | snd_soc_dapm_enable_pin_unlocked(dapm, "IHFOUTL"); | 133 | snd_soc_dapm_enable_pin_unlocked(dapm, "IHFOUTL"); |
135 | snd_soc_dapm_enable_pin_unlocked(dapm, "IHFOUTR"); | 134 | snd_soc_dapm_enable_pin_unlocked(dapm, "IHFOUTR"); |
136 | snd_soc_dapm_enable_pin_unlocked(dapm, "LINEOUTL"); | 135 | snd_soc_dapm_enable_pin_unlocked(dapm, "LINEOUTL"); |
@@ -156,8 +155,8 @@ static int lo_get_switch(struct snd_kcontrol *kcontrol, | |||
156 | static int lo_set_switch(struct snd_kcontrol *kcontrol, | 155 | static int lo_set_switch(struct snd_kcontrol *kcontrol, |
157 | struct snd_ctl_elem_value *ucontrol) | 156 | struct snd_ctl_elem_value *ucontrol) |
158 | { | 157 | { |
159 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 158 | struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); |
160 | struct snd_soc_dapm_context *dapm = &codec->dapm; | 159 | struct snd_soc_dapm_context *dapm = &card->dapm; |
161 | 160 | ||
162 | if (ucontrol->value.integer.value[0] == lo_dac) | 161 | if (ucontrol->value.integer.value[0] == lo_dac) |
163 | return 0; | 162 | return 0; |
@@ -167,35 +166,35 @@ static int lo_set_switch(struct snd_kcontrol *kcontrol, | |||
167 | /* we dont want to work with last state of lineout so just enable all | 166 | /* we dont want to work with last state of lineout so just enable all |
168 | * pins and then disable pins not required | 167 | * pins and then disable pins not required |
169 | */ | 168 | */ |
170 | lo_enable_out_pins(codec); | 169 | lo_enable_out_pins(dapm); |
171 | 170 | ||
172 | switch (ucontrol->value.integer.value[0]) { | 171 | switch (ucontrol->value.integer.value[0]) { |
173 | case 0: | 172 | case 0: |
174 | pr_debug("set vibra path\n"); | 173 | pr_debug("set vibra path\n"); |
175 | snd_soc_dapm_disable_pin_unlocked(dapm, "VIB1OUT"); | 174 | snd_soc_dapm_disable_pin_unlocked(dapm, "VIB1OUT"); |
176 | snd_soc_dapm_disable_pin_unlocked(dapm, "VIB2OUT"); | 175 | snd_soc_dapm_disable_pin_unlocked(dapm, "VIB2OUT"); |
177 | snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0); | 176 | snd_soc_update_bits(mfld_codec, SN95031_LOCTL, 0x66, 0); |
178 | break; | 177 | break; |
179 | 178 | ||
180 | case 1: | 179 | case 1: |
181 | pr_debug("set hs path\n"); | 180 | pr_debug("set hs path\n"); |
182 | snd_soc_dapm_disable_pin_unlocked(dapm, "Headphones"); | 181 | snd_soc_dapm_disable_pin_unlocked(dapm, "Headphones"); |
183 | snd_soc_dapm_disable_pin_unlocked(dapm, "EPOUT"); | 182 | snd_soc_dapm_disable_pin_unlocked(dapm, "EPOUT"); |
184 | snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x22); | 183 | snd_soc_update_bits(mfld_codec, SN95031_LOCTL, 0x66, 0x22); |
185 | break; | 184 | break; |
186 | 185 | ||
187 | case 2: | 186 | case 2: |
188 | pr_debug("set spkr path\n"); | 187 | pr_debug("set spkr path\n"); |
189 | snd_soc_dapm_disable_pin_unlocked(dapm, "IHFOUTL"); | 188 | snd_soc_dapm_disable_pin_unlocked(dapm, "IHFOUTL"); |
190 | snd_soc_dapm_disable_pin_unlocked(dapm, "IHFOUTR"); | 189 | snd_soc_dapm_disable_pin_unlocked(dapm, "IHFOUTR"); |
191 | snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x44); | 190 | snd_soc_update_bits(mfld_codec, SN95031_LOCTL, 0x66, 0x44); |
192 | break; | 191 | break; |
193 | 192 | ||
194 | case 3: | 193 | case 3: |
195 | pr_debug("set null path\n"); | 194 | pr_debug("set null path\n"); |
196 | snd_soc_dapm_disable_pin_unlocked(dapm, "LINEOUTL"); | 195 | snd_soc_dapm_disable_pin_unlocked(dapm, "LINEOUTL"); |
197 | snd_soc_dapm_disable_pin_unlocked(dapm, "LINEOUTR"); | 196 | snd_soc_dapm_disable_pin_unlocked(dapm, "LINEOUTR"); |
198 | snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x66); | 197 | snd_soc_update_bits(mfld_codec, SN95031_LOCTL, 0x66, 0x66); |
199 | break; | 198 | break; |
200 | } | 199 | } |
201 | 200 | ||
@@ -238,26 +237,11 @@ static void mfld_jack_check(unsigned int intr_status) | |||
238 | 237 | ||
239 | static int mfld_init(struct snd_soc_pcm_runtime *runtime) | 238 | static int mfld_init(struct snd_soc_pcm_runtime *runtime) |
240 | { | 239 | { |
241 | struct snd_soc_codec *codec = runtime->codec; | 240 | struct snd_soc_dapm_context *dapm = &runtime->card->dapm; |
242 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
243 | int ret_val; | 241 | int ret_val; |
244 | 242 | ||
245 | /* Add jack sense widgets */ | 243 | mfld_codec = runtime->codec; |
246 | snd_soc_dapm_new_controls(dapm, mfld_widgets, ARRAY_SIZE(mfld_widgets)); | ||
247 | |||
248 | /* Set up the map */ | ||
249 | snd_soc_dapm_add_routes(dapm, mfld_map, ARRAY_SIZE(mfld_map)); | ||
250 | 244 | ||
251 | /* always connected */ | ||
252 | snd_soc_dapm_enable_pin(dapm, "Headphones"); | ||
253 | snd_soc_dapm_enable_pin(dapm, "Mic"); | ||
254 | |||
255 | ret_val = snd_soc_add_codec_controls(codec, mfld_snd_controls, | ||
256 | ARRAY_SIZE(mfld_snd_controls)); | ||
257 | if (ret_val) { | ||
258 | pr_err("soc_add_controls failed %d", ret_val); | ||
259 | return ret_val; | ||
260 | } | ||
261 | /* default is earpiece pin, userspace sets it explcitly */ | 245 | /* default is earpiece pin, userspace sets it explcitly */ |
262 | snd_soc_dapm_disable_pin(dapm, "Headphones"); | 246 | snd_soc_dapm_disable_pin(dapm, "Headphones"); |
263 | /* default is lineout NC, userspace sets it explcitly */ | 247 | /* default is lineout NC, userspace sets it explcitly */ |
@@ -270,7 +254,7 @@ static int mfld_init(struct snd_soc_pcm_runtime *runtime) | |||
270 | snd_soc_dapm_disable_pin(dapm, "LINEINR"); | 254 | snd_soc_dapm_disable_pin(dapm, "LINEINR"); |
271 | 255 | ||
272 | /* Headset and button jack detection */ | 256 | /* Headset and button jack detection */ |
273 | ret_val = snd_soc_jack_new(codec, "Intel(R) MID Audio Jack", | 257 | ret_val = snd_soc_jack_new(mfld_codec, "Intel(R) MID Audio Jack", |
274 | SND_JACK_HEADSET | SND_JACK_BTN_0 | | 258 | SND_JACK_HEADSET | SND_JACK_BTN_0 | |
275 | SND_JACK_BTN_1, &mfld_jack); | 259 | SND_JACK_BTN_1, &mfld_jack); |
276 | if (ret_val) { | 260 | if (ret_val) { |
@@ -352,6 +336,13 @@ static struct snd_soc_card snd_soc_card_mfld = { | |||
352 | .owner = THIS_MODULE, | 336 | .owner = THIS_MODULE, |
353 | .dai_link = mfld_msic_dailink, | 337 | .dai_link = mfld_msic_dailink, |
354 | .num_links = ARRAY_SIZE(mfld_msic_dailink), | 338 | .num_links = ARRAY_SIZE(mfld_msic_dailink), |
339 | |||
340 | .controls = mfld_snd_controls, | ||
341 | .num_controls = ARRAY_SIZE(mfld_snd_controls), | ||
342 | .dapm_widgets = mfld_widgets, | ||
343 | .num_dapm_widgets = ARRAY_SIZE(mfld_widgets), | ||
344 | .dapm_routes = mfld_map, | ||
345 | .num_dapm_routes = ARRAY_SIZE(mfld_map), | ||
355 | }; | 346 | }; |
356 | 347 | ||
357 | static irqreturn_t snd_mfld_jack_intr_handler(int irq, void *dev) | 348 | static irqreturn_t snd_mfld_jack_intr_handler(int irq, void *dev) |
diff --git a/sound/soc/kirkwood/Kconfig b/sound/soc/kirkwood/Kconfig index 2dc3ecf34801..49f8437665de 100644 --- a/sound/soc/kirkwood/Kconfig +++ b/sound/soc/kirkwood/Kconfig | |||
@@ -10,6 +10,7 @@ config SND_KIRKWOOD_SOC_ARMADA370_DB | |||
10 | tristate "SoC Audio support for Armada 370 DB" | 10 | tristate "SoC Audio support for Armada 370 DB" |
11 | depends on SND_KIRKWOOD_SOC && (ARCH_MVEBU || COMPILE_TEST) && I2C | 11 | depends on SND_KIRKWOOD_SOC && (ARCH_MVEBU || COMPILE_TEST) && I2C |
12 | select SND_SOC_CS42L51 | 12 | select SND_SOC_CS42L51 |
13 | select SND_SOC_SPDIF | ||
13 | help | 14 | help |
14 | Say Y if you want to add support for SoC audio on | 15 | Say Y if you want to add support for SoC audio on |
15 | the Armada 370 Development Board. | 16 | the Armada 370 Development Board. |
diff --git a/sound/soc/kirkwood/armada-370-db.c b/sound/soc/kirkwood/armada-370-db.c index 977639b3ffde..c44333849259 100644 --- a/sound/soc/kirkwood/armada-370-db.c +++ b/sound/soc/kirkwood/armada-370-db.c | |||
@@ -67,6 +67,20 @@ static struct snd_soc_dai_link a370db_dai[] = { | |||
67 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, | 67 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, |
68 | .ops = &a370db_ops, | 68 | .ops = &a370db_ops, |
69 | }, | 69 | }, |
70 | { | ||
71 | .name = "S/PDIF out", | ||
72 | .stream_name = "spdif-out", | ||
73 | .cpu_dai_name = "spdif", | ||
74 | .codec_dai_name = "dit-hifi", | ||
75 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, | ||
76 | }, | ||
77 | { | ||
78 | .name = "S/PDIF in", | ||
79 | .stream_name = "spdif-in", | ||
80 | .cpu_dai_name = "spdif", | ||
81 | .codec_dai_name = "dir-hifi", | ||
82 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, | ||
83 | }, | ||
70 | }; | 84 | }; |
71 | 85 | ||
72 | static struct snd_soc_card a370db = { | 86 | static struct snd_soc_card a370db = { |
@@ -95,6 +109,20 @@ static int a370db_probe(struct platform_device *pdev) | |||
95 | of_parse_phandle(pdev->dev.of_node, | 109 | of_parse_phandle(pdev->dev.of_node, |
96 | "marvell,audio-codec", 0); | 110 | "marvell,audio-codec", 0); |
97 | 111 | ||
112 | a370db_dai[1].cpu_of_node = a370db_dai[0].cpu_of_node; | ||
113 | a370db_dai[1].platform_of_node = a370db_dai[0].cpu_of_node; | ||
114 | |||
115 | a370db_dai[1].codec_of_node = | ||
116 | of_parse_phandle(pdev->dev.of_node, | ||
117 | "marvell,audio-codec", 1); | ||
118 | |||
119 | a370db_dai[2].cpu_of_node = a370db_dai[0].cpu_of_node; | ||
120 | a370db_dai[2].platform_of_node = a370db_dai[0].cpu_of_node; | ||
121 | |||
122 | a370db_dai[2].codec_of_node = | ||
123 | of_parse_phandle(pdev->dev.of_node, | ||
124 | "marvell,audio-codec", 2); | ||
125 | |||
98 | return devm_snd_soc_register_card(card->dev, card); | 126 | return devm_snd_soc_register_card(card->dev, card); |
99 | } | 127 | } |
100 | 128 | ||
diff --git a/sound/soc/soc-io.c b/sound/soc/soc-io.c index 8aa086996866..260efc8466fc 100644 --- a/sound/soc/soc-io.c +++ b/sound/soc/soc-io.c | |||
@@ -23,21 +23,6 @@ | |||
23 | static int hw_write(struct snd_soc_codec *codec, unsigned int reg, | 23 | static int hw_write(struct snd_soc_codec *codec, unsigned int reg, |
24 | unsigned int value) | 24 | unsigned int value) |
25 | { | 25 | { |
26 | int ret; | ||
27 | |||
28 | if (!snd_soc_codec_volatile_register(codec, reg) && | ||
29 | reg < codec->driver->reg_cache_size && | ||
30 | !codec->cache_bypass) { | ||
31 | ret = snd_soc_cache_write(codec, reg, value); | ||
32 | if (ret < 0) | ||
33 | return -1; | ||
34 | } | ||
35 | |||
36 | if (codec->cache_only) { | ||
37 | codec->cache_sync = 1; | ||
38 | return 0; | ||
39 | } | ||
40 | |||
41 | return regmap_write(codec->control_data, reg, value); | 26 | return regmap_write(codec->control_data, reg, value); |
42 | } | 27 | } |
43 | 28 | ||
@@ -46,23 +31,11 @@ static unsigned int hw_read(struct snd_soc_codec *codec, unsigned int reg) | |||
46 | int ret; | 31 | int ret; |
47 | unsigned int val; | 32 | unsigned int val; |
48 | 33 | ||
49 | if (reg >= codec->driver->reg_cache_size || | 34 | ret = regmap_read(codec->control_data, reg, &val); |
50 | snd_soc_codec_volatile_register(codec, reg) || | 35 | if (ret == 0) |
51 | codec->cache_bypass) { | 36 | return val; |
52 | if (codec->cache_only) | 37 | else |
53 | return -1; | ||
54 | |||
55 | ret = regmap_read(codec->control_data, reg, &val); | ||
56 | if (ret == 0) | ||
57 | return val; | ||
58 | else | ||
59 | return -1; | ||
60 | } | ||
61 | |||
62 | ret = snd_soc_cache_read(codec, reg, &val); | ||
63 | if (ret < 0) | ||
64 | return -1; | 38 | return -1; |
65 | return val; | ||
66 | } | 39 | } |
67 | 40 | ||
68 | /** | 41 | /** |