diff options
Diffstat (limited to 'sound/soc/omap')
-rw-r--r-- | sound/soc/omap/Kconfig | 4 | ||||
-rw-r--r-- | sound/soc/omap/am3517evm.c | 2 | ||||
-rw-r--r-- | sound/soc/omap/ams-delta.c | 2 | ||||
-rw-r--r-- | sound/soc/omap/n810.c | 2 | ||||
-rw-r--r-- | sound/soc/omap/omap-abe-twl6040.c | 13 | ||||
-rw-r--r-- | sound/soc/omap/omap-dmic.c | 9 | ||||
-rw-r--r-- | sound/soc/omap/omap-hdmi-card.c | 2 | ||||
-rw-r--r-- | sound/soc/omap/omap-hdmi.c | 6 | ||||
-rw-r--r-- | sound/soc/omap/omap-mcbsp.c | 25 | ||||
-rw-r--r-- | sound/soc/omap/omap-mcbsp.h | 2 | ||||
-rw-r--r-- | sound/soc/omap/omap-mcpdm.c | 16 | ||||
-rw-r--r-- | sound/soc/omap/omap-pcm.c | 25 | ||||
-rw-r--r-- | sound/soc/omap/omap-twl4030.c | 15 | ||||
-rw-r--r-- | sound/soc/omap/omap3pandora.c | 4 | ||||
-rw-r--r-- | sound/soc/omap/osk5912.c | 2 | ||||
-rw-r--r-- | sound/soc/omap/rx51.c | 228 |
16 files changed, 235 insertions, 122 deletions
diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig index e00659351a4e..d44463a7b0fa 100644 --- a/sound/soc/omap/Kconfig +++ b/sound/soc/omap/Kconfig | |||
@@ -26,7 +26,7 @@ config SND_OMAP_SOC_N810 | |||
26 | 26 | ||
27 | config SND_OMAP_SOC_RX51 | 27 | config SND_OMAP_SOC_RX51 |
28 | tristate "SoC Audio support for Nokia RX-51" | 28 | tristate "SoC Audio support for Nokia RX-51" |
29 | depends on SND_OMAP_SOC && ARM && (MACH_NOKIA_RX51 || COMPILE_TEST) | 29 | depends on SND_OMAP_SOC && ARM && (MACH_NOKIA_RX51 || COMPILE_TEST) && I2C |
30 | select SND_OMAP_SOC_MCBSP | 30 | select SND_OMAP_SOC_MCBSP |
31 | select SND_SOC_TLV320AIC3X | 31 | select SND_SOC_TLV320AIC3X |
32 | select SND_SOC_TPA6130A2 | 32 | select SND_SOC_TPA6130A2 |
@@ -37,7 +37,7 @@ config SND_OMAP_SOC_RX51 | |||
37 | 37 | ||
38 | config SND_OMAP_SOC_AMS_DELTA | 38 | config SND_OMAP_SOC_AMS_DELTA |
39 | tristate "SoC Audio support for Amstrad E3 (Delta) videophone" | 39 | tristate "SoC Audio support for Amstrad E3 (Delta) videophone" |
40 | depends on SND_OMAP_SOC && MACH_AMS_DELTA | 40 | depends on SND_OMAP_SOC && MACH_AMS_DELTA && TTY |
41 | select SND_OMAP_SOC_MCBSP | 41 | select SND_OMAP_SOC_MCBSP |
42 | select SND_SOC_CX20442 | 42 | select SND_SOC_CX20442 |
43 | help | 43 | help |
diff --git a/sound/soc/omap/am3517evm.c b/sound/soc/omap/am3517evm.c index 994dcf345975..25a33e9d417a 100644 --- a/sound/soc/omap/am3517evm.c +++ b/sound/soc/omap/am3517evm.c | |||
@@ -77,7 +77,7 @@ static struct snd_soc_dai_link am3517evm_dai = { | |||
77 | .stream_name = "AIC23", | 77 | .stream_name = "AIC23", |
78 | .cpu_dai_name = "omap-mcbsp.1", | 78 | .cpu_dai_name = "omap-mcbsp.1", |
79 | .codec_dai_name = "tlv320aic23-hifi", | 79 | .codec_dai_name = "tlv320aic23-hifi", |
80 | .platform_name = "omap-pcm-audio", | 80 | .platform_name = "omap-mcbsp.1", |
81 | .codec_name = "tlv320aic23-codec.2-001a", | 81 | .codec_name = "tlv320aic23-codec.2-001a", |
82 | .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_NB_NF | | 82 | .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_NB_NF | |
83 | SND_SOC_DAIFMT_CBM_CFM, | 83 | SND_SOC_DAIFMT_CBM_CFM, |
diff --git a/sound/soc/omap/ams-delta.c b/sound/soc/omap/ams-delta.c index 669f84d9b76e..bb243c663e6b 100644 --- a/sound/soc/omap/ams-delta.c +++ b/sound/soc/omap/ams-delta.c | |||
@@ -534,7 +534,7 @@ static struct snd_soc_dai_link ams_delta_dai_link = { | |||
534 | .cpu_dai_name = "omap-mcbsp.1", | 534 | .cpu_dai_name = "omap-mcbsp.1", |
535 | .codec_dai_name = "cx20442-voice", | 535 | .codec_dai_name = "cx20442-voice", |
536 | .init = ams_delta_cx20442_init, | 536 | .init = ams_delta_cx20442_init, |
537 | .platform_name = "omap-pcm-audio", | 537 | .platform_name = "omap-mcbsp.1", |
538 | .codec_name = "cx20442-codec", | 538 | .codec_name = "cx20442-codec", |
539 | .ops = &ams_delta_ops, | 539 | .ops = &ams_delta_ops, |
540 | }; | 540 | }; |
diff --git a/sound/soc/omap/n810.c b/sound/soc/omap/n810.c index fd4d9c809e50..5d7f9cebe041 100644 --- a/sound/soc/omap/n810.c +++ b/sound/soc/omap/n810.c | |||
@@ -278,7 +278,7 @@ static struct snd_soc_dai_link n810_dai = { | |||
278 | .name = "TLV320AIC33", | 278 | .name = "TLV320AIC33", |
279 | .stream_name = "AIC33", | 279 | .stream_name = "AIC33", |
280 | .cpu_dai_name = "omap-mcbsp.2", | 280 | .cpu_dai_name = "omap-mcbsp.2", |
281 | .platform_name = "omap-pcm-audio", | 281 | .platform_name = "omap-mcbsp.2", |
282 | .codec_name = "tlv320aic3x-codec.2-0018", | 282 | .codec_name = "tlv320aic3x-codec.2-0018", |
283 | .codec_dai_name = "tlv320aic3x-hifi", | 283 | .codec_dai_name = "tlv320aic3x-hifi", |
284 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | | 284 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
diff --git a/sound/soc/omap/omap-abe-twl6040.c b/sound/soc/omap/omap-abe-twl6040.c index 024dafc3e298..cec836ed0c01 100644 --- a/sound/soc/omap/omap-abe-twl6040.c +++ b/sound/soc/omap/omap-abe-twl6040.c | |||
@@ -47,8 +47,7 @@ static int omap_abe_hw_params(struct snd_pcm_substream *substream, | |||
47 | { | 47 | { |
48 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 48 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
49 | struct snd_soc_dai *codec_dai = rtd->codec_dai; | 49 | struct snd_soc_dai *codec_dai = rtd->codec_dai; |
50 | struct snd_soc_codec *codec = rtd->codec; | 50 | struct snd_soc_card *card = rtd->card; |
51 | struct snd_soc_card *card = codec->card; | ||
52 | struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card); | 51 | struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card); |
53 | int clk_id, freq; | 52 | int clk_id, freq; |
54 | int ret; | 53 | int ret; |
@@ -168,7 +167,7 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
168 | static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd) | 167 | static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd) |
169 | { | 168 | { |
170 | struct snd_soc_codec *codec = rtd->codec; | 169 | struct snd_soc_codec *codec = rtd->codec; |
171 | struct snd_soc_card *card = codec->card; | 170 | struct snd_soc_card *card = rtd->card; |
172 | struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card); | 171 | struct abe_twl6040 *priv = snd_soc_card_get_drvdata(card); |
173 | int hs_trim; | 172 | int hs_trim; |
174 | int ret = 0; | 173 | int ret = 0; |
@@ -214,9 +213,7 @@ static struct snd_soc_dai_link abe_twl6040_dai_links[] = { | |||
214 | { | 213 | { |
215 | .name = "TWL6040", | 214 | .name = "TWL6040", |
216 | .stream_name = "TWL6040", | 215 | .stream_name = "TWL6040", |
217 | .cpu_dai_name = "omap-mcpdm", | ||
218 | .codec_dai_name = "twl6040-legacy", | 216 | .codec_dai_name = "twl6040-legacy", |
219 | .platform_name = "omap-pcm-audio", | ||
220 | .codec_name = "twl6040-codec", | 217 | .codec_name = "twl6040-codec", |
221 | .init = omap_abe_twl6040_init, | 218 | .init = omap_abe_twl6040_init, |
222 | .ops = &omap_abe_ops, | 219 | .ops = &omap_abe_ops, |
@@ -224,9 +221,7 @@ static struct snd_soc_dai_link abe_twl6040_dai_links[] = { | |||
224 | { | 221 | { |
225 | .name = "DMIC", | 222 | .name = "DMIC", |
226 | .stream_name = "DMIC Capture", | 223 | .stream_name = "DMIC Capture", |
227 | .cpu_dai_name = "omap-dmic", | ||
228 | .codec_dai_name = "dmic-hifi", | 224 | .codec_dai_name = "dmic-hifi", |
229 | .platform_name = "omap-pcm-audio", | ||
230 | .codec_name = "dmic-codec", | 225 | .codec_name = "dmic-codec", |
231 | .init = omap_abe_dmic_init, | 226 | .init = omap_abe_dmic_init, |
232 | .ops = &omap_abe_dmic_ops, | 227 | .ops = &omap_abe_dmic_ops, |
@@ -281,14 +276,14 @@ static int omap_abe_probe(struct platform_device *pdev) | |||
281 | dev_err(&pdev->dev, "McPDM node is not provided\n"); | 276 | dev_err(&pdev->dev, "McPDM node is not provided\n"); |
282 | return -EINVAL; | 277 | return -EINVAL; |
283 | } | 278 | } |
284 | abe_twl6040_dai_links[0].cpu_dai_name = NULL; | ||
285 | abe_twl6040_dai_links[0].cpu_of_node = dai_node; | 279 | abe_twl6040_dai_links[0].cpu_of_node = dai_node; |
280 | abe_twl6040_dai_links[0].platform_of_node = dai_node; | ||
286 | 281 | ||
287 | dai_node = of_parse_phandle(node, "ti,dmic", 0); | 282 | dai_node = of_parse_phandle(node, "ti,dmic", 0); |
288 | if (dai_node) { | 283 | if (dai_node) { |
289 | num_links = 2; | 284 | num_links = 2; |
290 | abe_twl6040_dai_links[1].cpu_dai_name = NULL; | ||
291 | abe_twl6040_dai_links[1].cpu_of_node = dai_node; | 285 | abe_twl6040_dai_links[1].cpu_of_node = dai_node; |
286 | abe_twl6040_dai_links[1].platform_of_node = dai_node; | ||
292 | 287 | ||
293 | priv->dmic_codec_dev = platform_device_register_simple( | 288 | priv->dmic_codec_dev = platform_device_register_simple( |
294 | "dmic-codec", -1, NULL, 0); | 289 | "dmic-codec", -1, NULL, 0); |
diff --git a/sound/soc/omap/omap-dmic.c b/sound/soc/omap/omap-dmic.c index 1bd531d718f9..53da041896c4 100644 --- a/sound/soc/omap/omap-dmic.c +++ b/sound/soc/omap/omap-dmic.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <sound/dmaengine_pcm.h> | 42 | #include <sound/dmaengine_pcm.h> |
43 | 43 | ||
44 | #include "omap-dmic.h" | 44 | #include "omap-dmic.h" |
45 | #include "omap-pcm.h" | ||
45 | 46 | ||
46 | struct omap_dmic { | 47 | struct omap_dmic { |
47 | struct device *dev; | 48 | struct device *dev; |
@@ -113,7 +114,6 @@ static int omap_dmic_dai_startup(struct snd_pcm_substream *substream, | |||
113 | 114 | ||
114 | mutex_unlock(&dmic->mutex); | 115 | mutex_unlock(&dmic->mutex); |
115 | 116 | ||
116 | snd_soc_dai_set_dma_data(dai, substream, &dmic->dma_data); | ||
117 | return ret; | 117 | return ret; |
118 | } | 118 | } |
119 | 119 | ||
@@ -417,6 +417,9 @@ static int omap_dmic_probe(struct snd_soc_dai *dai) | |||
417 | 417 | ||
418 | /* Configure DMIC threshold value */ | 418 | /* Configure DMIC threshold value */ |
419 | dmic->threshold = OMAP_DMIC_THRES_MAX - 3; | 419 | dmic->threshold = OMAP_DMIC_THRES_MAX - 3; |
420 | |||
421 | snd_soc_dai_init_dma_data(dai, NULL, &dmic->dma_data); | ||
422 | |||
420 | return 0; | 423 | return 0; |
421 | } | 424 | } |
422 | 425 | ||
@@ -492,6 +495,10 @@ static int asoc_dmic_probe(struct platform_device *pdev) | |||
492 | if (ret) | 495 | if (ret) |
493 | goto err_put_clk; | 496 | goto err_put_clk; |
494 | 497 | ||
498 | ret = omap_pcm_platform_register(&pdev->dev); | ||
499 | if (ret) | ||
500 | goto err_put_clk; | ||
501 | |||
495 | return 0; | 502 | return 0; |
496 | 503 | ||
497 | err_put_clk: | 504 | err_put_clk: |
diff --git a/sound/soc/omap/omap-hdmi-card.c b/sound/soc/omap/omap-hdmi-card.c index 7e66e9cba5a8..f649fe84b629 100644 --- a/sound/soc/omap/omap-hdmi-card.c +++ b/sound/soc/omap/omap-hdmi-card.c | |||
@@ -33,7 +33,7 @@ static struct snd_soc_dai_link omap_hdmi_dai = { | |||
33 | .name = "HDMI", | 33 | .name = "HDMI", |
34 | .stream_name = "HDMI", | 34 | .stream_name = "HDMI", |
35 | .cpu_dai_name = "omap-hdmi-audio-dai", | 35 | .cpu_dai_name = "omap-hdmi-audio-dai", |
36 | .platform_name = "omap-pcm-audio", | 36 | .platform_name = "omap-hdmi-audio-dai", |
37 | .codec_name = "hdmi-audio-codec", | 37 | .codec_name = "hdmi-audio-codec", |
38 | .codec_dai_name = "hdmi-hifi", | 38 | .codec_dai_name = "hdmi-hifi", |
39 | }; | 39 | }; |
diff --git a/sound/soc/omap/omap-hdmi.c b/sound/soc/omap/omap-hdmi.c index ced3b88b44d4..537a1ec8ad61 100644 --- a/sound/soc/omap/omap-hdmi.c +++ b/sound/soc/omap/omap-hdmi.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <video/omapdss.h> | 36 | #include <video/omapdss.h> |
37 | 37 | ||
38 | #include "omap-hdmi.h" | 38 | #include "omap-hdmi.h" |
39 | #include "omap-pcm.h" | ||
39 | 40 | ||
40 | #define DRV_NAME "omap-hdmi-audio-dai" | 41 | #define DRV_NAME "omap-hdmi-audio-dai" |
41 | 42 | ||
@@ -324,7 +325,10 @@ static int omap_hdmi_probe(struct platform_device *pdev) | |||
324 | ret = snd_soc_register_component(&pdev->dev, &omap_hdmi_component, | 325 | ret = snd_soc_register_component(&pdev->dev, &omap_hdmi_component, |
325 | &omap_hdmi_dai, 1); | 326 | &omap_hdmi_dai, 1); |
326 | 327 | ||
327 | return ret; | 328 | if (ret) |
329 | return ret; | ||
330 | |||
331 | return omap_pcm_platform_register(&pdev->dev); | ||
328 | } | 332 | } |
329 | 333 | ||
330 | static int omap_hdmi_remove(struct platform_device *pdev) | 334 | static int omap_hdmi_remove(struct platform_device *pdev) |
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 6c19bba23570..71d226626f7c 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 38 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
39 | #include "mcbsp.h" | 39 | #include "mcbsp.h" |
40 | #include "omap-mcbsp.h" | 40 | #include "omap-mcbsp.h" |
41 | #include "omap-pcm.h" | ||
41 | 42 | ||
42 | #define OMAP_MCBSP_RATES (SNDRV_PCM_RATE_8000_96000) | 43 | #define OMAP_MCBSP_RATES (SNDRV_PCM_RATE_8000_96000) |
43 | 44 | ||
@@ -149,9 +150,6 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, | |||
149 | SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2); | 150 | SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 2); |
150 | } | 151 | } |
151 | 152 | ||
152 | snd_soc_dai_set_dma_data(cpu_dai, substream, | ||
153 | &mcbsp->dma_data[substream->stream]); | ||
154 | |||
155 | return err; | 153 | return err; |
156 | } | 154 | } |
157 | 155 | ||
@@ -559,6 +557,10 @@ static int omap_mcbsp_probe(struct snd_soc_dai *dai) | |||
559 | 557 | ||
560 | pm_runtime_enable(mcbsp->dev); | 558 | pm_runtime_enable(mcbsp->dev); |
561 | 559 | ||
560 | snd_soc_dai_init_dma_data(dai, | ||
561 | &mcbsp->dma_data[SNDRV_PCM_STREAM_PLAYBACK], | ||
562 | &mcbsp->dma_data[SNDRV_PCM_STREAM_CAPTURE]); | ||
563 | |||
562 | return 0; | 564 | return 0; |
563 | } | 565 | } |
564 | 566 | ||
@@ -691,7 +693,7 @@ OMAP_MCBSP_SOC_SINGLE_S16_EXT("McBSP" #port " Sidetone Channel 1 Volume", \ | |||
691 | OMAP_MCBSP_ST_CONTROLS(2); | 693 | OMAP_MCBSP_ST_CONTROLS(2); |
692 | OMAP_MCBSP_ST_CONTROLS(3); | 694 | OMAP_MCBSP_ST_CONTROLS(3); |
693 | 695 | ||
694 | int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd) | 696 | int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd, int port_id) |
695 | { | 697 | { |
696 | struct snd_soc_dai *cpu_dai = rtd->cpu_dai; | 698 | struct snd_soc_dai *cpu_dai = rtd->cpu_dai; |
697 | struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai); | 699 | struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai); |
@@ -701,7 +703,7 @@ int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd) | |||
701 | return 0; | 703 | return 0; |
702 | } | 704 | } |
703 | 705 | ||
704 | switch (mcbsp->id) { | 706 | switch (port_id) { |
705 | case 2: /* McBSP 2 */ | 707 | case 2: /* McBSP 2 */ |
706 | return snd_soc_add_dai_controls(cpu_dai, | 708 | return snd_soc_add_dai_controls(cpu_dai, |
707 | omap_mcbsp2_st_controls, | 709 | omap_mcbsp2_st_controls, |
@@ -711,6 +713,7 @@ int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd) | |||
711 | omap_mcbsp3_st_controls, | 713 | omap_mcbsp3_st_controls, |
712 | ARRAY_SIZE(omap_mcbsp3_st_controls)); | 714 | ARRAY_SIZE(omap_mcbsp3_st_controls)); |
713 | default: | 715 | default: |
716 | dev_err(mcbsp->dev, "Port %d not supported\n", port_id); | ||
714 | break; | 717 | break; |
715 | } | 718 | } |
716 | 719 | ||
@@ -799,11 +802,15 @@ static int asoc_mcbsp_probe(struct platform_device *pdev) | |||
799 | platform_set_drvdata(pdev, mcbsp); | 802 | platform_set_drvdata(pdev, mcbsp); |
800 | 803 | ||
801 | ret = omap_mcbsp_init(pdev); | 804 | ret = omap_mcbsp_init(pdev); |
802 | if (!ret) | 805 | if (ret) |
803 | return snd_soc_register_component(&pdev->dev, &omap_mcbsp_component, | 806 | return ret; |
804 | &omap_mcbsp_dai, 1); | 807 | |
808 | ret = snd_soc_register_component(&pdev->dev, &omap_mcbsp_component, | ||
809 | &omap_mcbsp_dai, 1); | ||
810 | if (ret) | ||
811 | return ret; | ||
805 | 812 | ||
806 | return ret; | 813 | return omap_pcm_platform_register(&pdev->dev); |
807 | } | 814 | } |
808 | 815 | ||
809 | static int asoc_mcbsp_remove(struct platform_device *pdev) | 816 | static int asoc_mcbsp_remove(struct platform_device *pdev) |
diff --git a/sound/soc/omap/omap-mcbsp.h b/sound/soc/omap/omap-mcbsp.h index ba8386a0d8dc..2e3369c27be3 100644 --- a/sound/soc/omap/omap-mcbsp.h +++ b/sound/soc/omap/omap-mcbsp.h | |||
@@ -39,6 +39,6 @@ enum omap_mcbsp_div { | |||
39 | OMAP_MCBSP_CLKGDV, /* Sample rate generator divider */ | 39 | OMAP_MCBSP_CLKGDV, /* Sample rate generator divider */ |
40 | }; | 40 | }; |
41 | 41 | ||
42 | int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd); | 42 | int omap_mcbsp_st_add_controls(struct snd_soc_pcm_runtime *rtd, int port_id); |
43 | 43 | ||
44 | #endif | 44 | #endif |
diff --git a/sound/soc/omap/omap-mcpdm.c b/sound/soc/omap/omap-mcpdm.c index 2f5b1536477e..d8ebb52645a9 100644 --- a/sound/soc/omap/omap-mcpdm.c +++ b/sound/soc/omap/omap-mcpdm.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <sound/dmaengine_pcm.h> | 42 | #include <sound/dmaengine_pcm.h> |
43 | 43 | ||
44 | #include "omap-mcpdm.h" | 44 | #include "omap-mcpdm.h" |
45 | #include "omap-pcm.h" | ||
45 | 46 | ||
46 | struct mcpdm_link_config { | 47 | struct mcpdm_link_config { |
47 | u32 link_mask; /* channel mask for the direction */ | 48 | u32 link_mask; /* channel mask for the direction */ |
@@ -265,9 +266,6 @@ static int omap_mcpdm_dai_startup(struct snd_pcm_substream *substream, | |||
265 | } | 266 | } |
266 | mutex_unlock(&mcpdm->mutex); | 267 | mutex_unlock(&mcpdm->mutex); |
267 | 268 | ||
268 | snd_soc_dai_set_dma_data(dai, substream, | ||
269 | &mcpdm->dma_data[substream->stream]); | ||
270 | |||
271 | return 0; | 269 | return 0; |
272 | } | 270 | } |
273 | 271 | ||
@@ -406,6 +404,11 @@ static int omap_mcpdm_probe(struct snd_soc_dai *dai) | |||
406 | mcpdm->config[SNDRV_PCM_STREAM_PLAYBACK].threshold = 2; | 404 | mcpdm->config[SNDRV_PCM_STREAM_PLAYBACK].threshold = 2; |
407 | mcpdm->config[SNDRV_PCM_STREAM_CAPTURE].threshold = | 405 | mcpdm->config[SNDRV_PCM_STREAM_CAPTURE].threshold = |
408 | MCPDM_UP_THRES_MAX - 3; | 406 | MCPDM_UP_THRES_MAX - 3; |
407 | |||
408 | snd_soc_dai_init_dma_data(dai, | ||
409 | &mcpdm->dma_data[SNDRV_PCM_STREAM_PLAYBACK], | ||
410 | &mcpdm->dma_data[SNDRV_PCM_STREAM_CAPTURE]); | ||
411 | |||
409 | return ret; | 412 | return ret; |
410 | } | 413 | } |
411 | 414 | ||
@@ -460,6 +463,7 @@ static int asoc_mcpdm_probe(struct platform_device *pdev) | |||
460 | { | 463 | { |
461 | struct omap_mcpdm *mcpdm; | 464 | struct omap_mcpdm *mcpdm; |
462 | struct resource *res; | 465 | struct resource *res; |
466 | int ret; | ||
463 | 467 | ||
464 | mcpdm = devm_kzalloc(&pdev->dev, sizeof(struct omap_mcpdm), GFP_KERNEL); | 468 | mcpdm = devm_kzalloc(&pdev->dev, sizeof(struct omap_mcpdm), GFP_KERNEL); |
465 | if (!mcpdm) | 469 | if (!mcpdm) |
@@ -490,9 +494,13 @@ static int asoc_mcpdm_probe(struct platform_device *pdev) | |||
490 | 494 | ||
491 | mcpdm->dev = &pdev->dev; | 495 | mcpdm->dev = &pdev->dev; |
492 | 496 | ||
493 | return devm_snd_soc_register_component(&pdev->dev, | 497 | ret = devm_snd_soc_register_component(&pdev->dev, |
494 | &omap_mcpdm_component, | 498 | &omap_mcpdm_component, |
495 | &omap_mcpdm_dai, 1); | 499 | &omap_mcpdm_dai, 1); |
500 | if (ret) | ||
501 | return ret; | ||
502 | |||
503 | return omap_pcm_platform_register(&pdev->dev); | ||
496 | } | 504 | } |
497 | 505 | ||
498 | static const struct of_device_id omap_mcpdm_of_match[] = { | 506 | static const struct of_device_id omap_mcpdm_of_match[] = { |
diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index c3711b582d5f..8d809f8509c8 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c | |||
@@ -238,31 +238,6 @@ int omap_pcm_platform_register(struct device *dev) | |||
238 | } | 238 | } |
239 | EXPORT_SYMBOL_GPL(omap_pcm_platform_register); | 239 | EXPORT_SYMBOL_GPL(omap_pcm_platform_register); |
240 | 240 | ||
241 | static int omap_pcm_probe(struct platform_device *pdev) | ||
242 | { | ||
243 | return snd_soc_register_platform(&pdev->dev, | ||
244 | &omap_soc_platform); | ||
245 | } | ||
246 | |||
247 | static int omap_pcm_remove(struct platform_device *pdev) | ||
248 | { | ||
249 | snd_soc_unregister_platform(&pdev->dev); | ||
250 | return 0; | ||
251 | } | ||
252 | |||
253 | static struct platform_driver omap_pcm_driver = { | ||
254 | .driver = { | ||
255 | .name = "omap-pcm-audio", | ||
256 | .owner = THIS_MODULE, | ||
257 | }, | ||
258 | |||
259 | .probe = omap_pcm_probe, | ||
260 | .remove = omap_pcm_remove, | ||
261 | }; | ||
262 | |||
263 | module_platform_driver(omap_pcm_driver); | ||
264 | |||
265 | MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>"); | 241 | MODULE_AUTHOR("Jarkko Nikula <jarkko.nikula@bitmer.com>"); |
266 | MODULE_DESCRIPTION("OMAP PCM DMA module"); | 242 | MODULE_DESCRIPTION("OMAP PCM DMA module"); |
267 | MODULE_LICENSE("GPL"); | 243 | MODULE_LICENSE("GPL"); |
268 | MODULE_ALIAS("platform:omap-pcm-audio"); | ||
diff --git a/sound/soc/omap/omap-twl4030.c b/sound/soc/omap/omap-twl4030.c index 6a8d6b5f160d..64141db311b2 100644 --- a/sound/soc/omap/omap-twl4030.c +++ b/sound/soc/omap/omap-twl4030.c | |||
@@ -55,8 +55,7 @@ static int omap_twl4030_hw_params(struct snd_pcm_substream *substream, | |||
55 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 55 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
56 | struct snd_soc_dai *codec_dai = rtd->codec_dai; | 56 | struct snd_soc_dai *codec_dai = rtd->codec_dai; |
57 | struct snd_soc_dai *cpu_dai = rtd->cpu_dai; | 57 | struct snd_soc_dai *cpu_dai = rtd->cpu_dai; |
58 | struct snd_soc_codec *codec = rtd->codec; | 58 | struct snd_soc_card *card = rtd->card; |
59 | struct snd_soc_card *card = codec->card; | ||
60 | unsigned int fmt; | 59 | unsigned int fmt; |
61 | int ret; | 60 | int ret; |
62 | 61 | ||
@@ -179,7 +178,7 @@ static inline void twl4030_disconnect_pin(struct snd_soc_dapm_context *dapm, | |||
179 | static int omap_twl4030_init(struct snd_soc_pcm_runtime *rtd) | 178 | static int omap_twl4030_init(struct snd_soc_pcm_runtime *rtd) |
180 | { | 179 | { |
181 | struct snd_soc_codec *codec = rtd->codec; | 180 | struct snd_soc_codec *codec = rtd->codec; |
182 | struct snd_soc_card *card = codec->card; | 181 | struct snd_soc_card *card = rtd->card; |
183 | struct snd_soc_dapm_context *dapm = &codec->dapm; | 182 | struct snd_soc_dapm_context *dapm = &codec->dapm; |
184 | struct omap_tw4030_pdata *pdata = dev_get_platdata(card->dev); | 183 | struct omap_tw4030_pdata *pdata = dev_get_platdata(card->dev); |
185 | struct omap_twl4030 *priv = snd_soc_card_get_drvdata(card); | 184 | struct omap_twl4030 *priv = snd_soc_card_get_drvdata(card); |
@@ -239,7 +238,7 @@ static struct snd_soc_dai_link omap_twl4030_dai_links[] = { | |||
239 | .stream_name = "TWL4030 HiFi", | 238 | .stream_name = "TWL4030 HiFi", |
240 | .cpu_dai_name = "omap-mcbsp.2", | 239 | .cpu_dai_name = "omap-mcbsp.2", |
241 | .codec_dai_name = "twl4030-hifi", | 240 | .codec_dai_name = "twl4030-hifi", |
242 | .platform_name = "omap-pcm-audio", | 241 | .platform_name = "omap-mcbsp.2", |
243 | .codec_name = "twl4030-codec", | 242 | .codec_name = "twl4030-codec", |
244 | .init = omap_twl4030_init, | 243 | .init = omap_twl4030_init, |
245 | .ops = &omap_twl4030_ops, | 244 | .ops = &omap_twl4030_ops, |
@@ -249,7 +248,7 @@ static struct snd_soc_dai_link omap_twl4030_dai_links[] = { | |||
249 | .stream_name = "TWL4030 Voice", | 248 | .stream_name = "TWL4030 Voice", |
250 | .cpu_dai_name = "omap-mcbsp.3", | 249 | .cpu_dai_name = "omap-mcbsp.3", |
251 | .codec_dai_name = "twl4030-voice", | 250 | .codec_dai_name = "twl4030-voice", |
252 | .platform_name = "omap-pcm-audio", | 251 | .platform_name = "omap-mcbsp.2", |
253 | .codec_name = "twl4030-codec", | 252 | .codec_name = "twl4030-codec", |
254 | .dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF | | 253 | .dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF | |
255 | SND_SOC_DAIFMT_CBM_CFM, | 254 | SND_SOC_DAIFMT_CBM_CFM, |
@@ -299,12 +298,18 @@ static int omap_twl4030_probe(struct platform_device *pdev) | |||
299 | omap_twl4030_dai_links[0].cpu_dai_name = NULL; | 298 | omap_twl4030_dai_links[0].cpu_dai_name = NULL; |
300 | omap_twl4030_dai_links[0].cpu_of_node = dai_node; | 299 | omap_twl4030_dai_links[0].cpu_of_node = dai_node; |
301 | 300 | ||
301 | omap_twl4030_dai_links[0].platform_name = NULL; | ||
302 | omap_twl4030_dai_links[0].platform_of_node = dai_node; | ||
303 | |||
302 | dai_node = of_parse_phandle(node, "ti,mcbsp-voice", 0); | 304 | dai_node = of_parse_phandle(node, "ti,mcbsp-voice", 0); |
303 | if (!dai_node) { | 305 | if (!dai_node) { |
304 | card->num_links = 1; | 306 | card->num_links = 1; |
305 | } else { | 307 | } else { |
306 | omap_twl4030_dai_links[1].cpu_dai_name = NULL; | 308 | omap_twl4030_dai_links[1].cpu_dai_name = NULL; |
307 | omap_twl4030_dai_links[1].cpu_of_node = dai_node; | 309 | omap_twl4030_dai_links[1].cpu_of_node = dai_node; |
310 | |||
311 | omap_twl4030_dai_links[1].platform_name = NULL; | ||
312 | omap_twl4030_dai_links[1].platform_of_node = dai_node; | ||
308 | } | 313 | } |
309 | 314 | ||
310 | priv->jack_detect = of_get_named_gpio(node, | 315 | priv->jack_detect = of_get_named_gpio(node, |
diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c index 02181bb70400..076bec606d78 100644 --- a/sound/soc/omap/omap3pandora.c +++ b/sound/soc/omap/omap3pandora.c | |||
@@ -197,7 +197,7 @@ static struct snd_soc_dai_link omap3pandora_dai[] = { | |||
197 | .stream_name = "HiFi Out", | 197 | .stream_name = "HiFi Out", |
198 | .cpu_dai_name = "omap-mcbsp.2", | 198 | .cpu_dai_name = "omap-mcbsp.2", |
199 | .codec_dai_name = "twl4030-hifi", | 199 | .codec_dai_name = "twl4030-hifi", |
200 | .platform_name = "omap-pcm-audio", | 200 | .platform_name = "omap-mcbsp.2", |
201 | .codec_name = "twl4030-codec", | 201 | .codec_name = "twl4030-codec", |
202 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | | 202 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
203 | SND_SOC_DAIFMT_CBS_CFS, | 203 | SND_SOC_DAIFMT_CBS_CFS, |
@@ -208,7 +208,7 @@ static struct snd_soc_dai_link omap3pandora_dai[] = { | |||
208 | .stream_name = "Line/Mic In", | 208 | .stream_name = "Line/Mic In", |
209 | .cpu_dai_name = "omap-mcbsp.4", | 209 | .cpu_dai_name = "omap-mcbsp.4", |
210 | .codec_dai_name = "twl4030-hifi", | 210 | .codec_dai_name = "twl4030-hifi", |
211 | .platform_name = "omap-pcm-audio", | 211 | .platform_name = "omap-mcbsp.4", |
212 | .codec_name = "twl4030-codec", | 212 | .codec_name = "twl4030-codec", |
213 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | | 213 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
214 | SND_SOC_DAIFMT_CBS_CFS, | 214 | SND_SOC_DAIFMT_CBS_CFS, |
diff --git a/sound/soc/omap/osk5912.c b/sound/soc/omap/osk5912.c index d03e57da7708..aa4053bf6710 100644 --- a/sound/soc/omap/osk5912.c +++ b/sound/soc/omap/osk5912.c | |||
@@ -96,7 +96,7 @@ static struct snd_soc_dai_link osk_dai = { | |||
96 | .stream_name = "AIC23", | 96 | .stream_name = "AIC23", |
97 | .cpu_dai_name = "omap-mcbsp.1", | 97 | .cpu_dai_name = "omap-mcbsp.1", |
98 | .codec_dai_name = "tlv320aic23-hifi", | 98 | .codec_dai_name = "tlv320aic23-hifi", |
99 | .platform_name = "omap-pcm-audio", | 99 | .platform_name = "omap-mcbsp.1", |
100 | .codec_name = "tlv320aic23-codec", | 100 | .codec_name = "tlv320aic23-codec", |
101 | .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_NB_NF | | 101 | .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_NB_NF | |
102 | SND_SOC_DAIFMT_CBM_CFM, | 102 | SND_SOC_DAIFMT_CBM_CFM, |
diff --git a/sound/soc/omap/rx51.c b/sound/soc/omap/rx51.c index 2b4641123142..6951dc812055 100644 --- a/sound/soc/omap/rx51.c +++ b/sound/soc/omap/rx51.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | #include <linux/platform_device.h> | 28 | #include <linux/platform_device.h> |
29 | #include <linux/gpio/consumer.h> | ||
29 | #include <linux/module.h> | 30 | #include <linux/module.h> |
30 | #include <sound/core.h> | 31 | #include <sound/core.h> |
31 | #include <sound/jack.h> | 32 | #include <sound/jack.h> |
@@ -38,15 +39,6 @@ | |||
38 | 39 | ||
39 | #include "omap-mcbsp.h" | 40 | #include "omap-mcbsp.h" |
40 | 41 | ||
41 | #define RX51_TVOUT_SEL_GPIO 40 | ||
42 | #define RX51_JACK_DETECT_GPIO 177 | ||
43 | #define RX51_ECI_SW_GPIO 182 | ||
44 | /* | ||
45 | * REVISIT: TWL4030 GPIO base in RX-51. Now statically defined to 192. This | ||
46 | * gpio is reserved in arch/arm/mach-omap2/board-rx51-peripherals.c | ||
47 | */ | ||
48 | #define RX51_SPEAKER_AMP_TWL_GPIO (192 + 7) | ||
49 | |||
50 | enum { | 42 | enum { |
51 | RX51_JACK_DISABLED, | 43 | RX51_JACK_DISABLED, |
52 | RX51_JACK_TVOUT, /* tv-out with stereo output */ | 44 | RX51_JACK_TVOUT, /* tv-out with stereo output */ |
@@ -54,12 +46,21 @@ enum { | |||
54 | RX51_JACK_HS, /* headset: stereo output with mic */ | 46 | RX51_JACK_HS, /* headset: stereo output with mic */ |
55 | }; | 47 | }; |
56 | 48 | ||
49 | struct rx51_audio_pdata { | ||
50 | struct gpio_desc *tvout_selection_gpio; | ||
51 | struct gpio_desc *jack_detection_gpio; | ||
52 | struct gpio_desc *eci_sw_gpio; | ||
53 | struct gpio_desc *speaker_amp_gpio; | ||
54 | }; | ||
55 | |||
57 | static int rx51_spk_func; | 56 | static int rx51_spk_func; |
58 | static int rx51_dmic_func; | 57 | static int rx51_dmic_func; |
59 | static int rx51_jack_func; | 58 | static int rx51_jack_func; |
60 | 59 | ||
61 | static void rx51_ext_control(struct snd_soc_dapm_context *dapm) | 60 | static void rx51_ext_control(struct snd_soc_dapm_context *dapm) |
62 | { | 61 | { |
62 | struct snd_soc_card *card = dapm->card; | ||
63 | struct rx51_audio_pdata *pdata = snd_soc_card_get_drvdata(card); | ||
63 | int hp = 0, hs = 0, tvout = 0; | 64 | int hp = 0, hs = 0, tvout = 0; |
64 | 65 | ||
65 | switch (rx51_jack_func) { | 66 | switch (rx51_jack_func) { |
@@ -93,7 +94,7 @@ static void rx51_ext_control(struct snd_soc_dapm_context *dapm) | |||
93 | else | 94 | else |
94 | snd_soc_dapm_disable_pin_unlocked(dapm, "HS Mic"); | 95 | snd_soc_dapm_disable_pin_unlocked(dapm, "HS Mic"); |
95 | 96 | ||
96 | gpio_set_value(RX51_TVOUT_SEL_GPIO, tvout); | 97 | gpiod_set_value(pdata->tvout_selection_gpio, tvout); |
97 | 98 | ||
98 | snd_soc_dapm_sync_unlocked(dapm); | 99 | snd_soc_dapm_sync_unlocked(dapm); |
99 | 100 | ||
@@ -154,10 +155,12 @@ static int rx51_set_spk(struct snd_kcontrol *kcontrol, | |||
154 | static int rx51_spk_event(struct snd_soc_dapm_widget *w, | 155 | static int rx51_spk_event(struct snd_soc_dapm_widget *w, |
155 | struct snd_kcontrol *k, int event) | 156 | struct snd_kcontrol *k, int event) |
156 | { | 157 | { |
157 | if (SND_SOC_DAPM_EVENT_ON(event)) | 158 | struct snd_soc_dapm_context *dapm = w->dapm; |
158 | gpio_set_value_cansleep(RX51_SPEAKER_AMP_TWL_GPIO, 1); | 159 | struct snd_soc_card *card = dapm->card; |
159 | else | 160 | struct rx51_audio_pdata *pdata = snd_soc_card_get_drvdata(card); |
160 | gpio_set_value_cansleep(RX51_SPEAKER_AMP_TWL_GPIO, 0); | 161 | |
162 | gpiod_set_raw_value_cansleep(pdata->speaker_amp_gpio, | ||
163 | !!SND_SOC_DAPM_EVENT_ON(event)); | ||
161 | 164 | ||
162 | return 0; | 165 | return 0; |
163 | } | 166 | } |
@@ -223,7 +226,6 @@ static struct snd_soc_jack rx51_av_jack; | |||
223 | 226 | ||
224 | static struct snd_soc_jack_gpio rx51_av_jack_gpios[] = { | 227 | static struct snd_soc_jack_gpio rx51_av_jack_gpios[] = { |
225 | { | 228 | { |
226 | .gpio = RX51_JACK_DETECT_GPIO, | ||
227 | .name = "avdet-gpio", | 229 | .name = "avdet-gpio", |
228 | .report = SND_JACK_HEADSET, | 230 | .report = SND_JACK_HEADSET, |
229 | .invert = 1, | 231 | .invert = 1, |
@@ -258,9 +260,11 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
258 | {"b Mic Bias", NULL, "HS Mic"} | 260 | {"b Mic Bias", NULL, "HS Mic"} |
259 | }; | 261 | }; |
260 | 262 | ||
261 | static const char *spk_function[] = {"Off", "On"}; | 263 | static const char * const spk_function[] = {"Off", "On"}; |
262 | static const char *input_function[] = {"ADC", "Digital Mic"}; | 264 | static const char * const input_function[] = {"ADC", "Digital Mic"}; |
263 | static const char *jack_function[] = {"Off", "TV-OUT", "Headphone", "Headset"}; | 265 | static const char * const jack_function[] = { |
266 | "Off", "TV-OUT", "Headphone", "Headset" | ||
267 | }; | ||
264 | 268 | ||
265 | static const struct soc_enum rx51_enum[] = { | 269 | static const struct soc_enum rx51_enum[] = { |
266 | SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spk_function), spk_function), | 270 | SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(spk_function), spk_function), |
@@ -282,6 +286,9 @@ static const struct snd_kcontrol_new aic34_rx51_controls[] = { | |||
282 | static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) | 286 | static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) |
283 | { | 287 | { |
284 | struct snd_soc_codec *codec = rtd->codec; | 288 | struct snd_soc_codec *codec = rtd->codec; |
289 | struct snd_soc_card *card = rtd->card; | ||
290 | struct rx51_audio_pdata *pdata = snd_soc_card_get_drvdata(card); | ||
291 | |||
285 | struct snd_soc_dapm_context *dapm = &codec->dapm; | 292 | struct snd_soc_dapm_context *dapm = &codec->dapm; |
286 | int err; | 293 | int err; |
287 | 294 | ||
@@ -291,23 +298,38 @@ static int rx51_aic34_init(struct snd_soc_pcm_runtime *rtd) | |||
291 | snd_soc_dapm_nc_pin(dapm, "LINE1R"); | 298 | snd_soc_dapm_nc_pin(dapm, "LINE1R"); |
292 | 299 | ||
293 | err = tpa6130a2_add_controls(codec); | 300 | err = tpa6130a2_add_controls(codec); |
294 | if (err < 0) | 301 | if (err < 0) { |
302 | dev_err(card->dev, "Failed to add TPA6130A2 controls\n"); | ||
295 | return err; | 303 | return err; |
304 | } | ||
296 | snd_soc_limit_volume(codec, "TPA6130A2 Headphone Playback Volume", 42); | 305 | snd_soc_limit_volume(codec, "TPA6130A2 Headphone Playback Volume", 42); |
297 | 306 | ||
298 | err = omap_mcbsp_st_add_controls(rtd); | 307 | err = omap_mcbsp_st_add_controls(rtd, 2); |
299 | if (err < 0) | 308 | if (err < 0) { |
309 | dev_err(card->dev, "Failed to add MCBSP controls\n"); | ||
300 | return err; | 310 | return err; |
311 | } | ||
301 | 312 | ||
302 | /* AV jack detection */ | 313 | /* AV jack detection */ |
303 | err = snd_soc_jack_new(codec, "AV Jack", | 314 | err = snd_soc_jack_new(codec, "AV Jack", |
304 | SND_JACK_HEADSET | SND_JACK_VIDEOOUT, | 315 | SND_JACK_HEADSET | SND_JACK_VIDEOOUT, |
305 | &rx51_av_jack); | 316 | &rx51_av_jack); |
306 | if (err) | 317 | if (err) { |
318 | dev_err(card->dev, "Failed to add AV Jack\n"); | ||
307 | return err; | 319 | return err; |
320 | } | ||
321 | |||
322 | /* prepare gpio for snd_soc_jack_add_gpios */ | ||
323 | rx51_av_jack_gpios[0].gpio = desc_to_gpio(pdata->jack_detection_gpio); | ||
324 | devm_gpiod_put(card->dev, pdata->jack_detection_gpio); | ||
325 | |||
308 | err = snd_soc_jack_add_gpios(&rx51_av_jack, | 326 | err = snd_soc_jack_add_gpios(&rx51_av_jack, |
309 | ARRAY_SIZE(rx51_av_jack_gpios), | 327 | ARRAY_SIZE(rx51_av_jack_gpios), |
310 | rx51_av_jack_gpios); | 328 | rx51_av_jack_gpios); |
329 | if (err) { | ||
330 | dev_err(card->dev, "Failed to add GPIOs\n"); | ||
331 | return err; | ||
332 | } | ||
311 | 333 | ||
312 | return err; | 334 | return err; |
313 | } | 335 | } |
@@ -319,7 +341,7 @@ static struct snd_soc_dai_link rx51_dai[] = { | |||
319 | .stream_name = "AIC34", | 341 | .stream_name = "AIC34", |
320 | .cpu_dai_name = "omap-mcbsp.2", | 342 | .cpu_dai_name = "omap-mcbsp.2", |
321 | .codec_dai_name = "tlv320aic3x-hifi", | 343 | .codec_dai_name = "tlv320aic3x-hifi", |
322 | .platform_name = "omap-pcm-audio", | 344 | .platform_name = "omap-mcbsp.2", |
323 | .codec_name = "tlv320aic3x-codec.2-0018", | 345 | .codec_name = "tlv320aic3x-codec.2-0018", |
324 | .dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF | | 346 | .dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF | |
325 | SND_SOC_DAIFMT_CBM_CFM, | 347 | SND_SOC_DAIFMT_CBM_CFM, |
@@ -361,61 +383,151 @@ static struct snd_soc_card rx51_sound_card = { | |||
361 | .num_dapm_routes = ARRAY_SIZE(audio_map), | 383 | .num_dapm_routes = ARRAY_SIZE(audio_map), |
362 | }; | 384 | }; |
363 | 385 | ||
364 | static struct platform_device *rx51_snd_device; | 386 | static int rx51_soc_probe(struct platform_device *pdev) |
365 | |||
366 | static int __init rx51_soc_init(void) | ||
367 | { | 387 | { |
388 | struct rx51_audio_pdata *pdata; | ||
389 | struct device_node *np = pdev->dev.of_node; | ||
390 | struct snd_soc_card *card = &rx51_sound_card; | ||
368 | int err; | 391 | int err; |
369 | 392 | ||
370 | if (!machine_is_nokia_rx51() && !of_machine_is_compatible("nokia,omap3-n900")) | 393 | if (!machine_is_nokia_rx51() && !of_machine_is_compatible("nokia,omap3-n900")) |
371 | return -ENODEV; | 394 | return -ENODEV; |
372 | 395 | ||
373 | err = gpio_request_one(RX51_TVOUT_SEL_GPIO, | 396 | card->dev = &pdev->dev; |
374 | GPIOF_DIR_OUT | GPIOF_INIT_LOW, "tvout_sel"); | 397 | |
375 | if (err) | 398 | if (np) { |
376 | goto err_gpio_tvout_sel; | 399 | struct device_node *dai_node; |
377 | err = gpio_request_one(RX51_ECI_SW_GPIO, | 400 | |
378 | GPIOF_DIR_OUT | GPIOF_INIT_HIGH, "eci_sw"); | 401 | dai_node = of_parse_phandle(np, "nokia,cpu-dai", 0); |
379 | if (err) | 402 | if (!dai_node) { |
380 | goto err_gpio_eci_sw; | 403 | dev_err(&pdev->dev, "McBSP node is not provided\n"); |
381 | 404 | return -EINVAL; | |
382 | rx51_snd_device = platform_device_alloc("soc-audio", -1); | 405 | } |
383 | if (!rx51_snd_device) { | 406 | rx51_dai[0].cpu_dai_name = NULL; |
384 | err = -ENOMEM; | 407 | rx51_dai[0].platform_name = NULL; |
385 | goto err1; | 408 | rx51_dai[0].cpu_of_node = dai_node; |
409 | rx51_dai[0].platform_of_node = dai_node; | ||
410 | |||
411 | dai_node = of_parse_phandle(np, "nokia,audio-codec", 0); | ||
412 | if (!dai_node) { | ||
413 | dev_err(&pdev->dev, "Codec node is not provided\n"); | ||
414 | return -EINVAL; | ||
415 | } | ||
416 | rx51_dai[0].codec_name = NULL; | ||
417 | rx51_dai[0].codec_of_node = dai_node; | ||
418 | |||
419 | dai_node = of_parse_phandle(np, "nokia,audio-codec", 1); | ||
420 | if (!dai_node) { | ||
421 | dev_err(&pdev->dev, "Auxiliary Codec node is not provided\n"); | ||
422 | return -EINVAL; | ||
423 | } | ||
424 | rx51_aux_dev[0].codec_name = NULL; | ||
425 | rx51_aux_dev[0].codec_of_node = dai_node; | ||
426 | rx51_codec_conf[0].dev_name = NULL; | ||
427 | rx51_codec_conf[0].of_node = dai_node; | ||
428 | |||
429 | dai_node = of_parse_phandle(np, "nokia,headphone-amplifier", 0); | ||
430 | if (!dai_node) { | ||
431 | dev_err(&pdev->dev, "Headphone amplifier node is not provided\n"); | ||
432 | return -EINVAL; | ||
433 | } | ||
434 | |||
435 | /* TODO: tpa6130a2a driver supports only a single instance, so | ||
436 | * this driver ignores the headphone-amplifier node for now. | ||
437 | * It's already mandatory in the DT binding to be future proof. | ||
438 | */ | ||
386 | } | 439 | } |
387 | 440 | ||
388 | platform_set_drvdata(rx51_snd_device, &rx51_sound_card); | 441 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); |
442 | if (pdata == NULL) { | ||
443 | dev_err(card->dev, "failed to create private data\n"); | ||
444 | return -ENOMEM; | ||
445 | } | ||
446 | snd_soc_card_set_drvdata(card, pdata); | ||
389 | 447 | ||
390 | err = platform_device_add(rx51_snd_device); | 448 | pdata->tvout_selection_gpio = devm_gpiod_get(card->dev, |
391 | if (err) | 449 | "tvout-selection"); |
392 | goto err2; | 450 | if (IS_ERR(pdata->tvout_selection_gpio)) { |
451 | dev_err(card->dev, "could not get tvout selection gpio\n"); | ||
452 | return PTR_ERR(pdata->tvout_selection_gpio); | ||
453 | } | ||
393 | 454 | ||
394 | return 0; | 455 | err = gpiod_direction_output(pdata->tvout_selection_gpio, 0); |
395 | err2: | 456 | if (err) { |
396 | platform_device_put(rx51_snd_device); | 457 | dev_err(card->dev, "could not setup tvout selection gpio\n"); |
397 | err1: | 458 | return err; |
398 | gpio_free(RX51_ECI_SW_GPIO); | 459 | } |
399 | err_gpio_eci_sw: | ||
400 | gpio_free(RX51_TVOUT_SEL_GPIO); | ||
401 | err_gpio_tvout_sel: | ||
402 | 460 | ||
403 | return err; | 461 | pdata->jack_detection_gpio = devm_gpiod_get(card->dev, |
462 | "jack-detection"); | ||
463 | if (IS_ERR(pdata->jack_detection_gpio)) { | ||
464 | dev_err(card->dev, "could not get jack detection gpio\n"); | ||
465 | return PTR_ERR(pdata->jack_detection_gpio); | ||
466 | } | ||
467 | |||
468 | pdata->eci_sw_gpio = devm_gpiod_get(card->dev, "eci-switch"); | ||
469 | if (IS_ERR(pdata->eci_sw_gpio)) { | ||
470 | dev_err(card->dev, "could not get eci switch gpio\n"); | ||
471 | return PTR_ERR(pdata->eci_sw_gpio); | ||
472 | } | ||
473 | |||
474 | err = gpiod_direction_output(pdata->eci_sw_gpio, 1); | ||
475 | if (err) { | ||
476 | dev_err(card->dev, "could not setup eci switch gpio\n"); | ||
477 | return err; | ||
478 | } | ||
479 | |||
480 | pdata->speaker_amp_gpio = devm_gpiod_get(card->dev, | ||
481 | "speaker-amplifier"); | ||
482 | if (IS_ERR(pdata->speaker_amp_gpio)) { | ||
483 | dev_err(card->dev, "could not get speaker enable gpio\n"); | ||
484 | return PTR_ERR(pdata->speaker_amp_gpio); | ||
485 | } | ||
486 | |||
487 | err = gpiod_direction_output(pdata->speaker_amp_gpio, 0); | ||
488 | if (err) { | ||
489 | dev_err(card->dev, "could not setup speaker enable gpio\n"); | ||
490 | return err; | ||
491 | } | ||
492 | |||
493 | err = devm_snd_soc_register_card(card->dev, card); | ||
494 | if (err) { | ||
495 | dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", err); | ||
496 | return err; | ||
497 | } | ||
498 | |||
499 | return 0; | ||
404 | } | 500 | } |
405 | 501 | ||
406 | static void __exit rx51_soc_exit(void) | 502 | static int rx51_soc_remove(struct platform_device *pdev) |
407 | { | 503 | { |
408 | snd_soc_jack_free_gpios(&rx51_av_jack, ARRAY_SIZE(rx51_av_jack_gpios), | 504 | snd_soc_jack_free_gpios(&rx51_av_jack, ARRAY_SIZE(rx51_av_jack_gpios), |
409 | rx51_av_jack_gpios); | 505 | rx51_av_jack_gpios); |
410 | 506 | ||
411 | platform_device_unregister(rx51_snd_device); | 507 | return 0; |
412 | gpio_free(RX51_ECI_SW_GPIO); | ||
413 | gpio_free(RX51_TVOUT_SEL_GPIO); | ||
414 | } | 508 | } |
415 | 509 | ||
416 | module_init(rx51_soc_init); | 510 | #if defined(CONFIG_OF) |
417 | module_exit(rx51_soc_exit); | 511 | static const struct of_device_id rx51_audio_of_match[] = { |
512 | { .compatible = "nokia,n900-audio", }, | ||
513 | {}, | ||
514 | }; | ||
515 | MODULE_DEVICE_TABLE(of, rx51_audio_of_match); | ||
516 | #endif | ||
517 | |||
518 | static struct platform_driver rx51_soc_driver = { | ||
519 | .driver = { | ||
520 | .name = "rx51-audio", | ||
521 | .owner = THIS_MODULE, | ||
522 | .of_match_table = of_match_ptr(rx51_audio_of_match), | ||
523 | }, | ||
524 | .probe = rx51_soc_probe, | ||
525 | .remove = rx51_soc_remove, | ||
526 | }; | ||
527 | |||
528 | module_platform_driver(rx51_soc_driver); | ||
418 | 529 | ||
419 | MODULE_AUTHOR("Nokia Corporation"); | 530 | MODULE_AUTHOR("Nokia Corporation"); |
420 | MODULE_DESCRIPTION("ALSA SoC Nokia RX-51"); | 531 | MODULE_DESCRIPTION("ALSA SoC Nokia RX-51"); |
421 | MODULE_LICENSE("GPL"); | 532 | MODULE_LICENSE("GPL"); |
533 | MODULE_ALIAS("platform:rx51-audio"); | ||