diff options
Diffstat (limited to 'sound/soc/samsung')
31 files changed, 249 insertions, 276 deletions
diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig index f2e289180e46..753b8c93ab51 100644 --- a/sound/soc/samsung/Kconfig +++ b/sound/soc/samsung/Kconfig | |||
@@ -64,6 +64,7 @@ config SND_SOC_SAMSUNG_JIVE_WM8750 | |||
64 | config SND_SOC_SAMSUNG_SMDK_WM8580 | 64 | config SND_SOC_SAMSUNG_SMDK_WM8580 |
65 | tristate "SoC I2S Audio support for WM8580 on SMDK" | 65 | tristate "SoC I2S Audio support for WM8580 on SMDK" |
66 | depends on SND_SOC_SAMSUNG && (MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDK6440 || MACH_SMDK6450 || MACH_SMDKV210 || MACH_SMDKC110) | 66 | depends on SND_SOC_SAMSUNG && (MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDK6440 || MACH_SMDK6450 || MACH_SMDKV210 || MACH_SMDKC110) |
67 | depends on REGMAP_I2C | ||
67 | select SND_SOC_WM8580 | 68 | select SND_SOC_WM8580 |
68 | select SND_SAMSUNG_I2S | 69 | select SND_SAMSUNG_I2S |
69 | help | 70 | help |
@@ -115,21 +116,21 @@ config SND_SOC_SAMSUNG_SIMTEC | |||
115 | 116 | ||
116 | config SND_SOC_SAMSUNG_SIMTEC_TLV320AIC23 | 117 | config SND_SOC_SAMSUNG_SIMTEC_TLV320AIC23 |
117 | tristate "SoC I2S Audio support for TLV320AIC23 on Simtec boards" | 118 | tristate "SoC I2S Audio support for TLV320AIC23 on Simtec boards" |
118 | depends on SND_SOC_SAMSUNG && ARCH_S3C24XX | 119 | depends on SND_SOC_SAMSUNG && ARCH_S3C24XX && I2C |
119 | select SND_S3C24XX_I2S | 120 | select SND_S3C24XX_I2S |
120 | select SND_SOC_TLV320AIC23_I2C | 121 | select SND_SOC_TLV320AIC23_I2C |
121 | select SND_SOC_SAMSUNG_SIMTEC | 122 | select SND_SOC_SAMSUNG_SIMTEC |
122 | 123 | ||
123 | config SND_SOC_SAMSUNG_SIMTEC_HERMES | 124 | config SND_SOC_SAMSUNG_SIMTEC_HERMES |
124 | tristate "SoC I2S Audio support for Simtec Hermes board" | 125 | tristate "SoC I2S Audio support for Simtec Hermes board" |
125 | depends on SND_SOC_SAMSUNG && ARCH_S3C24XX | 126 | depends on SND_SOC_SAMSUNG && ARCH_S3C24XX && I2C |
126 | select SND_S3C24XX_I2S | 127 | select SND_S3C24XX_I2S |
127 | select SND_SOC_TLV320AIC3X | 128 | select SND_SOC_TLV320AIC3X |
128 | select SND_SOC_SAMSUNG_SIMTEC | 129 | select SND_SOC_SAMSUNG_SIMTEC |
129 | 130 | ||
130 | config SND_SOC_SAMSUNG_H1940_UDA1380 | 131 | config SND_SOC_SAMSUNG_H1940_UDA1380 |
131 | tristate "Audio support for the HP iPAQ H1940" | 132 | tristate "Audio support for the HP iPAQ H1940" |
132 | depends on SND_SOC_SAMSUNG && ARCH_H1940 | 133 | depends on SND_SOC_SAMSUNG && ARCH_H1940 && I2C |
133 | select SND_S3C24XX_I2S | 134 | select SND_S3C24XX_I2S |
134 | select SND_SOC_UDA1380 | 135 | select SND_SOC_UDA1380 |
135 | help | 136 | help |
@@ -137,7 +138,7 @@ config SND_SOC_SAMSUNG_H1940_UDA1380 | |||
137 | 138 | ||
138 | config SND_SOC_SAMSUNG_RX1950_UDA1380 | 139 | config SND_SOC_SAMSUNG_RX1950_UDA1380 |
139 | tristate "Audio support for the HP iPAQ RX1950" | 140 | tristate "Audio support for the HP iPAQ RX1950" |
140 | depends on SND_SOC_SAMSUNG && MACH_RX1950 | 141 | depends on SND_SOC_SAMSUNG && MACH_RX1950 && I2C |
141 | select SND_S3C24XX_I2S | 142 | select SND_S3C24XX_I2S |
142 | select SND_SOC_UDA1380 | 143 | select SND_SOC_UDA1380 |
143 | help | 144 | help |
@@ -178,6 +179,7 @@ config SND_SOC_SAMSUNG_SMDK_SPDIF | |||
178 | config SND_SOC_SMDK_WM8580_PCM | 179 | config SND_SOC_SMDK_WM8580_PCM |
179 | tristate "SoC PCM Audio support for WM8580 on SMDK" | 180 | tristate "SoC PCM Audio support for WM8580 on SMDK" |
180 | depends on SND_SOC_SAMSUNG && (MACH_SMDK6450 || MACH_SMDKV210 || MACH_SMDKC110) | 181 | depends on SND_SOC_SAMSUNG && (MACH_SMDK6450 || MACH_SMDKV210 || MACH_SMDKC110) |
182 | depends on REGMAP_I2C | ||
181 | select SND_SOC_WM8580 | 183 | select SND_SOC_WM8580 |
182 | select SND_SAMSUNG_PCM | 184 | select SND_SAMSUNG_PCM |
183 | help | 185 | help |
@@ -204,7 +206,7 @@ config SND_SOC_SPEYSIDE | |||
204 | 206 | ||
205 | config SND_SOC_TOBERMORY | 207 | config SND_SOC_TOBERMORY |
206 | tristate "Audio support for Wolfson Tobermory" | 208 | tristate "Audio support for Wolfson Tobermory" |
207 | depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 | 209 | depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 && INPUT |
208 | select SND_SAMSUNG_I2S | 210 | select SND_SAMSUNG_I2S |
209 | select SND_SOC_WM8962 | 211 | select SND_SOC_WM8962 |
210 | 212 | ||
@@ -231,3 +233,13 @@ config SND_SOC_LITTLEMILL | |||
231 | select SND_SAMSUNG_I2S | 233 | select SND_SAMSUNG_I2S |
232 | select MFD_WM8994 | 234 | select MFD_WM8994 |
233 | select SND_SOC_WM8994 | 235 | select SND_SOC_WM8994 |
236 | |||
237 | config SND_SOC_SNOW | ||
238 | tristate "Audio support for Google Snow boards" | ||
239 | depends on SND_SOC_SAMSUNG | ||
240 | select SND_SOC_MAX98090 | ||
241 | select SND_SOC_MAX98095 | ||
242 | select SND_SAMSUNG_I2S | ||
243 | help | ||
244 | Say Y if you want to add audio support for various Snow | ||
245 | boards based on Exynos5 series of SoCs. | ||
diff --git a/sound/soc/samsung/Makefile b/sound/soc/samsung/Makefile index 86715d8efee6..6d0212ba571c 100644 --- a/sound/soc/samsung/Makefile +++ b/sound/soc/samsung/Makefile | |||
@@ -34,6 +34,7 @@ snd-soc-h1940-uda1380-objs := h1940_uda1380.o | |||
34 | snd-soc-rx1950-uda1380-objs := rx1950_uda1380.o | 34 | snd-soc-rx1950-uda1380-objs := rx1950_uda1380.o |
35 | snd-soc-smdk-wm8580-objs := smdk_wm8580.o | 35 | snd-soc-smdk-wm8580-objs := smdk_wm8580.o |
36 | snd-soc-smdk-wm8994-objs := smdk_wm8994.o | 36 | snd-soc-smdk-wm8994-objs := smdk_wm8994.o |
37 | snd-soc-snow-objs := snow.o | ||
37 | snd-soc-smdk-wm9713-objs := smdk_wm9713.o | 38 | snd-soc-smdk-wm9713-objs := smdk_wm9713.o |
38 | snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o | 39 | snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o |
39 | snd-soc-goni-wm8994-objs := goni_wm8994.o | 40 | snd-soc-goni-wm8994-objs := goni_wm8994.o |
@@ -58,6 +59,7 @@ obj-$(CONFIG_SND_SOC_SAMSUNG_H1940_UDA1380) += snd-soc-h1940-uda1380.o | |||
58 | obj-$(CONFIG_SND_SOC_SAMSUNG_RX1950_UDA1380) += snd-soc-rx1950-uda1380.o | 59 | obj-$(CONFIG_SND_SOC_SAMSUNG_RX1950_UDA1380) += snd-soc-rx1950-uda1380.o |
59 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8580) += snd-soc-smdk-wm8580.o | 60 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8580) += snd-soc-smdk-wm8580.o |
60 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994) += snd-soc-smdk-wm8994.o | 61 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994) += snd-soc-smdk-wm8994.o |
62 | obj-$(CONFIG_SND_SOC_SNOW) += snd-soc-snow.o | ||
61 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713) += snd-soc-smdk-wm9713.o | 63 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713) += snd-soc-smdk-wm9713.o |
62 | obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o | 64 | obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o |
63 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF) += snd-soc-smdk-spdif.o | 65 | obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF) += snd-soc-smdk-spdif.o |
diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c index 76b072bd4ba2..68d9303047e8 100644 --- a/sound/soc/samsung/ac97.c +++ b/sound/soc/samsung/ac97.c | |||
@@ -433,7 +433,7 @@ static int s3c_ac97_probe(struct platform_device *pdev) | |||
433 | goto err4; | 433 | goto err4; |
434 | } | 434 | } |
435 | 435 | ||
436 | ret = snd_soc_register_component(&pdev->dev, &s3c_ac97_component, | 436 | ret = devm_snd_soc_register_component(&pdev->dev, &s3c_ac97_component, |
437 | s3c_ac97_dai, ARRAY_SIZE(s3c_ac97_dai)); | 437 | s3c_ac97_dai, ARRAY_SIZE(s3c_ac97_dai)); |
438 | if (ret) | 438 | if (ret) |
439 | goto err5; | 439 | goto err5; |
@@ -441,12 +441,10 @@ static int s3c_ac97_probe(struct platform_device *pdev) | |||
441 | ret = samsung_asoc_dma_platform_register(&pdev->dev); | 441 | ret = samsung_asoc_dma_platform_register(&pdev->dev); |
442 | if (ret) { | 442 | if (ret) { |
443 | dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); | 443 | dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); |
444 | goto err6; | 444 | goto err5; |
445 | } | 445 | } |
446 | 446 | ||
447 | return 0; | 447 | return 0; |
448 | err6: | ||
449 | snd_soc_unregister_component(&pdev->dev); | ||
450 | err5: | 448 | err5: |
451 | free_irq(irq_res->start, NULL); | 449 | free_irq(irq_res->start, NULL); |
452 | err4: | 450 | err4: |
@@ -461,9 +459,6 @@ static int s3c_ac97_remove(struct platform_device *pdev) | |||
461 | { | 459 | { |
462 | struct resource *irq_res; | 460 | struct resource *irq_res; |
463 | 461 | ||
464 | samsung_asoc_dma_platform_unregister(&pdev->dev); | ||
465 | snd_soc_unregister_component(&pdev->dev); | ||
466 | |||
467 | irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 462 | irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
468 | if (irq_res) | 463 | if (irq_res) |
469 | free_irq(irq_res->start, NULL); | 464 | free_irq(irq_res->start, NULL); |
diff --git a/sound/soc/samsung/bells.c b/sound/soc/samsung/bells.c index 84f5d8b76679..5b21207cf551 100644 --- a/sound/soc/samsung/bells.c +++ b/sound/soc/samsung/bells.c | |||
@@ -433,22 +433,13 @@ static int bells_probe(struct platform_device *pdev) | |||
433 | 433 | ||
434 | bells_cards[pdev->id].dev = &pdev->dev; | 434 | bells_cards[pdev->id].dev = &pdev->dev; |
435 | 435 | ||
436 | ret = snd_soc_register_card(&bells_cards[pdev->id]); | 436 | ret = devm_snd_soc_register_card(&pdev->dev, &bells_cards[pdev->id]); |
437 | if (ret) { | 437 | if (ret) |
438 | dev_err(&pdev->dev, | 438 | dev_err(&pdev->dev, |
439 | "snd_soc_register_card(%s) failed: %d\n", | 439 | "snd_soc_register_card(%s) failed: %d\n", |
440 | bells_cards[pdev->id].name, ret); | 440 | bells_cards[pdev->id].name, ret); |
441 | return ret; | ||
442 | } | ||
443 | |||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | static int bells_remove(struct platform_device *pdev) | ||
448 | { | ||
449 | snd_soc_unregister_card(&bells_cards[pdev->id]); | ||
450 | 441 | ||
451 | return 0; | 442 | return ret; |
452 | } | 443 | } |
453 | 444 | ||
454 | static struct platform_driver bells_driver = { | 445 | static struct platform_driver bells_driver = { |
@@ -458,7 +449,6 @@ static struct platform_driver bells_driver = { | |||
458 | .pm = &snd_soc_pm_ops, | 449 | .pm = &snd_soc_pm_ops, |
459 | }, | 450 | }, |
460 | .probe = bells_probe, | 451 | .probe = bells_probe, |
461 | .remove = bells_remove, | ||
462 | }; | 452 | }; |
463 | 453 | ||
464 | module_platform_driver(bells_driver); | 454 | module_platform_driver(bells_driver); |
diff --git a/sound/soc/samsung/dma.c b/sound/soc/samsung/dma.c index dc09b71b7d9f..d9dc7bcc0336 100644 --- a/sound/soc/samsung/dma.c +++ b/sound/soc/samsung/dma.c | |||
@@ -445,16 +445,10 @@ EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data); | |||
445 | 445 | ||
446 | int samsung_asoc_dma_platform_register(struct device *dev) | 446 | int samsung_asoc_dma_platform_register(struct device *dev) |
447 | { | 447 | { |
448 | return snd_soc_register_platform(dev, &samsung_asoc_platform); | 448 | return devm_snd_soc_register_platform(dev, &samsung_asoc_platform); |
449 | } | 449 | } |
450 | EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); | 450 | EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); |
451 | 451 | ||
452 | void samsung_asoc_dma_platform_unregister(struct device *dev) | ||
453 | { | ||
454 | snd_soc_unregister_platform(dev); | ||
455 | } | ||
456 | EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_unregister); | ||
457 | |||
458 | MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); | 452 | MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); |
459 | MODULE_DESCRIPTION("Samsung ASoC DMA Driver"); | 453 | MODULE_DESCRIPTION("Samsung ASoC DMA Driver"); |
460 | MODULE_LICENSE("GPL"); | 454 | MODULE_LICENSE("GPL"); |
diff --git a/sound/soc/samsung/dma.h b/sound/soc/samsung/dma.h index ad7c0f04f00d..070ab0f09609 100644 --- a/sound/soc/samsung/dma.h +++ b/sound/soc/samsung/dma.h | |||
@@ -33,6 +33,5 @@ void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, | |||
33 | struct s3c_dma_params *playback, | 33 | struct s3c_dma_params *playback, |
34 | struct s3c_dma_params *capture); | 34 | struct s3c_dma_params *capture); |
35 | int samsung_asoc_dma_platform_register(struct device *dev); | 35 | int samsung_asoc_dma_platform_register(struct device *dev); |
36 | void samsung_asoc_dma_platform_unregister(struct device *dev); | ||
37 | 36 | ||
38 | #endif | 37 | #endif |
diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c index 750ce5808d9f..a0e4e7948909 100644 --- a/sound/soc/samsung/dmaengine.c +++ b/sound/soc/samsung/dmaengine.c | |||
@@ -66,18 +66,13 @@ EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data); | |||
66 | 66 | ||
67 | int samsung_asoc_dma_platform_register(struct device *dev) | 67 | int samsung_asoc_dma_platform_register(struct device *dev) |
68 | { | 68 | { |
69 | return snd_dmaengine_pcm_register(dev, &samsung_dmaengine_pcm_config, | 69 | return devm_snd_dmaengine_pcm_register(dev, |
70 | SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME | | 70 | &samsung_dmaengine_pcm_config, |
71 | SND_DMAENGINE_PCM_FLAG_COMPAT); | 71 | SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME | |
72 | SND_DMAENGINE_PCM_FLAG_COMPAT); | ||
72 | } | 73 | } |
73 | EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); | 74 | EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); |
74 | 75 | ||
75 | void samsung_asoc_dma_platform_unregister(struct device *dev) | ||
76 | { | ||
77 | return snd_dmaengine_pcm_unregister(dev); | ||
78 | } | ||
79 | EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_unregister); | ||
80 | |||
81 | MODULE_AUTHOR("Mark Brown <broonie@linaro.org>"); | 76 | MODULE_AUTHOR("Mark Brown <broonie@linaro.org>"); |
82 | MODULE_DESCRIPTION("Samsung dmaengine ASoC driver"); | 77 | MODULE_DESCRIPTION("Samsung dmaengine ASoC driver"); |
83 | MODULE_LICENSE("GPL"); | 78 | MODULE_LICENSE("GPL"); |
diff --git a/sound/soc/samsung/goni_wm8994.c b/sound/soc/samsung/goni_wm8994.c index 415ad81999c4..9506d7617223 100644 --- a/sound/soc/samsung/goni_wm8994.c +++ b/sound/soc/samsung/goni_wm8994.c | |||
@@ -274,8 +274,8 @@ static int __init goni_init(void) | |||
274 | return -ENOMEM; | 274 | return -ENOMEM; |
275 | 275 | ||
276 | /* register voice DAI here */ | 276 | /* register voice DAI here */ |
277 | ret = snd_soc_register_component(&goni_snd_device->dev, &voice_component, | 277 | ret = devm_snd_soc_register_component(&goni_snd_device->dev, |
278 | &voice_dai, 1); | 278 | &voice_component, &voice_dai, 1); |
279 | if (ret) { | 279 | if (ret) { |
280 | platform_device_put(goni_snd_device); | 280 | platform_device_put(goni_snd_device); |
281 | return ret; | 281 | return ret; |
@@ -284,17 +284,14 @@ static int __init goni_init(void) | |||
284 | platform_set_drvdata(goni_snd_device, &goni); | 284 | platform_set_drvdata(goni_snd_device, &goni); |
285 | ret = platform_device_add(goni_snd_device); | 285 | ret = platform_device_add(goni_snd_device); |
286 | 286 | ||
287 | if (ret) { | 287 | if (ret) |
288 | snd_soc_unregister_component(&goni_snd_device->dev); | ||
289 | platform_device_put(goni_snd_device); | 288 | platform_device_put(goni_snd_device); |
290 | } | ||
291 | 289 | ||
292 | return ret; | 290 | return ret; |
293 | } | 291 | } |
294 | 292 | ||
295 | static void __exit goni_exit(void) | 293 | static void __exit goni_exit(void) |
296 | { | 294 | { |
297 | snd_soc_unregister_component(&goni_snd_device->dev); | ||
298 | platform_device_unregister(goni_snd_device); | 295 | platform_device_unregister(goni_snd_device); |
299 | } | 296 | } |
300 | 297 | ||
diff --git a/sound/soc/samsung/h1940_uda1380.c b/sound/soc/samsung/h1940_uda1380.c index 88b09e022503..f2d7980d7ddc 100644 --- a/sound/soc/samsung/h1940_uda1380.c +++ b/sound/soc/samsung/h1940_uda1380.c | |||
@@ -176,11 +176,6 @@ static struct platform_device *s3c24xx_snd_device; | |||
176 | static int h1940_uda1380_init(struct snd_soc_pcm_runtime *rtd) | 176 | static int h1940_uda1380_init(struct snd_soc_pcm_runtime *rtd) |
177 | { | 177 | { |
178 | struct snd_soc_codec *codec = rtd->codec; | 178 | struct snd_soc_codec *codec = rtd->codec; |
179 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
180 | |||
181 | snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); | ||
182 | snd_soc_dapm_enable_pin(dapm, "Speaker"); | ||
183 | snd_soc_dapm_enable_pin(dapm, "Mic Jack"); | ||
184 | 179 | ||
185 | snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE, | 180 | snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE, |
186 | &hp_jack); | 181 | &hp_jack); |
@@ -194,6 +189,14 @@ static int h1940_uda1380_init(struct snd_soc_pcm_runtime *rtd) | |||
194 | return 0; | 189 | return 0; |
195 | } | 190 | } |
196 | 191 | ||
192 | static int h1940_uda1380_card_remove(struct snd_soc_card *card) | ||
193 | { | ||
194 | snd_soc_jack_free_gpios(&hp_jack, ARRAY_SIZE(hp_jack_gpios), | ||
195 | hp_jack_gpios); | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | |||
197 | /* s3c24xx digital audio interface glue - connects codec <--> CPU */ | 200 | /* s3c24xx digital audio interface glue - connects codec <--> CPU */ |
198 | static struct snd_soc_dai_link h1940_uda1380_dai[] = { | 201 | static struct snd_soc_dai_link h1940_uda1380_dai[] = { |
199 | { | 202 | { |
@@ -211,6 +214,7 @@ static struct snd_soc_dai_link h1940_uda1380_dai[] = { | |||
211 | static struct snd_soc_card h1940_asoc = { | 214 | static struct snd_soc_card h1940_asoc = { |
212 | .name = "h1940", | 215 | .name = "h1940", |
213 | .owner = THIS_MODULE, | 216 | .owner = THIS_MODULE, |
217 | .remove = h1940_uda1380_card_remove, | ||
214 | .dai_link = h1940_uda1380_dai, | 218 | .dai_link = h1940_uda1380_dai, |
215 | .num_links = ARRAY_SIZE(h1940_uda1380_dai), | 219 | .num_links = ARRAY_SIZE(h1940_uda1380_dai), |
216 | 220 | ||
@@ -262,8 +266,6 @@ err_out: | |||
262 | static void __exit h1940_exit(void) | 266 | static void __exit h1940_exit(void) |
263 | { | 267 | { |
264 | platform_device_unregister(s3c24xx_snd_device); | 268 | platform_device_unregister(s3c24xx_snd_device); |
265 | snd_soc_jack_free_gpios(&hp_jack, ARRAY_SIZE(hp_jack_gpios), | ||
266 | hp_jack_gpios); | ||
267 | gpio_free(S3C_GPIO_END + 9); | 269 | gpio_free(S3C_GPIO_END + 9); |
268 | } | 270 | } |
269 | 271 | ||
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index 048ead967199..2ac76fa3e742 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c | |||
@@ -451,6 +451,10 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, | |||
451 | u32 mod = readl(i2s->addr + I2SMOD); | 451 | u32 mod = readl(i2s->addr + I2SMOD); |
452 | 452 | ||
453 | switch (clk_id) { | 453 | switch (clk_id) { |
454 | case SAMSUNG_I2S_OPCLK: | ||
455 | mod &= ~MOD_OPCLK_MASK; | ||
456 | mod |= dir; | ||
457 | break; | ||
454 | case SAMSUNG_I2S_CDCLK: | 458 | case SAMSUNG_I2S_CDCLK: |
455 | /* Shouldn't matter in GATING(CLOCK_IN) mode */ | 459 | /* Shouldn't matter in GATING(CLOCK_IN) mode */ |
456 | if (dir == SND_SOC_CLOCK_IN) | 460 | if (dir == SND_SOC_CLOCK_IN) |
@@ -484,7 +488,7 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, | |||
484 | clk_id = 1; | 488 | clk_id = 1; |
485 | 489 | ||
486 | if (!any_active(i2s)) { | 490 | if (!any_active(i2s)) { |
487 | if (i2s->op_clk) { | 491 | if (i2s->op_clk && !IS_ERR(i2s->op_clk)) { |
488 | if ((clk_id && !(mod & MOD_IMS_SYSMUX)) || | 492 | if ((clk_id && !(mod & MOD_IMS_SYSMUX)) || |
489 | (!clk_id && (mod & MOD_IMS_SYSMUX))) { | 493 | (!clk_id && (mod & MOD_IMS_SYSMUX))) { |
490 | clk_disable_unprepare(i2s->op_clk); | 494 | clk_disable_unprepare(i2s->op_clk); |
@@ -502,6 +506,10 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, | |||
502 | else | 506 | else |
503 | i2s->op_clk = clk_get(&i2s->pdev->dev, | 507 | i2s->op_clk = clk_get(&i2s->pdev->dev, |
504 | "i2s_opclk0"); | 508 | "i2s_opclk0"); |
509 | |||
510 | if (WARN_ON(IS_ERR(i2s->op_clk))) | ||
511 | return PTR_ERR(i2s->op_clk); | ||
512 | |||
505 | clk_prepare_enable(i2s->op_clk); | 513 | clk_prepare_enable(i2s->op_clk); |
506 | i2s->rclk_srcrate = clk_get_rate(i2s->op_clk); | 514 | i2s->rclk_srcrate = clk_get_rate(i2s->op_clk); |
507 | 515 | ||
@@ -668,8 +676,8 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, | |||
668 | if (is_manager(i2s)) | 676 | if (is_manager(i2s)) |
669 | mod &= ~MOD_BLC_MASK; | 677 | mod &= ~MOD_BLC_MASK; |
670 | 678 | ||
671 | switch (params_format(params)) { | 679 | switch (params_width(params)) { |
672 | case SNDRV_PCM_FORMAT_S8: | 680 | case 8: |
673 | if (is_secondary(i2s)) | 681 | if (is_secondary(i2s)) |
674 | mod |= MOD_BLCS_8BIT; | 682 | mod |= MOD_BLCS_8BIT; |
675 | else | 683 | else |
@@ -677,7 +685,7 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, | |||
677 | if (is_manager(i2s)) | 685 | if (is_manager(i2s)) |
678 | mod |= MOD_BLC_8BIT; | 686 | mod |= MOD_BLC_8BIT; |
679 | break; | 687 | break; |
680 | case SNDRV_PCM_FORMAT_S16_LE: | 688 | case 16: |
681 | if (is_secondary(i2s)) | 689 | if (is_secondary(i2s)) |
682 | mod |= MOD_BLCS_16BIT; | 690 | mod |= MOD_BLCS_16BIT; |
683 | else | 691 | else |
@@ -685,7 +693,7 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, | |||
685 | if (is_manager(i2s)) | 693 | if (is_manager(i2s)) |
686 | mod |= MOD_BLC_16BIT; | 694 | mod |= MOD_BLC_16BIT; |
687 | break; | 695 | break; |
688 | case SNDRV_PCM_FORMAT_S24_LE: | 696 | case 24: |
689 | if (is_secondary(i2s)) | 697 | if (is_secondary(i2s)) |
690 | mod |= MOD_BLCS_24BIT; | 698 | mod |= MOD_BLCS_24BIT; |
691 | else | 699 | else |
@@ -724,9 +732,6 @@ static int i2s_startup(struct snd_pcm_substream *substream, | |||
724 | else | 732 | else |
725 | i2s->mode |= DAI_MANAGER; | 733 | i2s->mode |= DAI_MANAGER; |
726 | 734 | ||
727 | /* Enforce set_sysclk in Master mode */ | ||
728 | i2s->rclk_srcrate = 0; | ||
729 | |||
730 | if (!any_active(i2s) && (i2s->quirks & QUIRK_NEED_RSTCLR)) | 735 | if (!any_active(i2s) && (i2s->quirks & QUIRK_NEED_RSTCLR)) |
731 | writel(CON_RSTCLR, i2s->addr + I2SCON); | 736 | writel(CON_RSTCLR, i2s->addr + I2SCON); |
732 | 737 | ||
@@ -984,6 +989,7 @@ probe_exit: | |||
984 | /* Reset any constraint on RFS and BFS */ | 989 | /* Reset any constraint on RFS and BFS */ |
985 | i2s->rfs = 0; | 990 | i2s->rfs = 0; |
986 | i2s->bfs = 0; | 991 | i2s->bfs = 0; |
992 | i2s->rclk_srcrate = 0; | ||
987 | i2s_txctrl(i2s, 0); | 993 | i2s_txctrl(i2s, 0); |
988 | i2s_rxctrl(i2s, 0); | 994 | i2s_rxctrl(i2s, 0); |
989 | i2s_fifo(i2s, FIC_TXFLUSH); | 995 | i2s_fifo(i2s, FIC_TXFLUSH); |
@@ -1293,8 +1299,6 @@ static int samsung_i2s_remove(struct platform_device *pdev) | |||
1293 | i2s->pri_dai = NULL; | 1299 | i2s->pri_dai = NULL; |
1294 | i2s->sec_dai = NULL; | 1300 | i2s->sec_dai = NULL; |
1295 | 1301 | ||
1296 | samsung_asoc_dma_platform_unregister(&pdev->dev); | ||
1297 | |||
1298 | return 0; | 1302 | return 0; |
1299 | } | 1303 | } |
1300 | 1304 | ||
diff --git a/sound/soc/samsung/i2s.h b/sound/soc/samsung/i2s.h index 7966afc934db..21ff24e930db 100644 --- a/sound/soc/samsung/i2s.h +++ b/sound/soc/samsung/i2s.h | |||
@@ -18,5 +18,6 @@ | |||
18 | #define SAMSUNG_I2S_RCLKSRC_0 0 | 18 | #define SAMSUNG_I2S_RCLKSRC_0 0 |
19 | #define SAMSUNG_I2S_RCLKSRC_1 1 | 19 | #define SAMSUNG_I2S_RCLKSRC_1 1 |
20 | #define SAMSUNG_I2S_CDCLK 2 | 20 | #define SAMSUNG_I2S_CDCLK 2 |
21 | #define SAMSUNG_I2S_OPCLK 3 | ||
21 | 22 | ||
22 | #endif /* __SND_SOC_SAMSUNG_I2S_H */ | 23 | #endif /* __SND_SOC_SAMSUNG_I2S_H */ |
diff --git a/sound/soc/samsung/idma.c b/sound/soc/samsung/idma.c index 3d5cf1530b6f..8cc5770abb39 100644 --- a/sound/soc/samsung/idma.c +++ b/sound/soc/samsung/idma.c | |||
@@ -274,7 +274,7 @@ static irqreturn_t iis_irq(int irqno, void *dev_id) | |||
274 | 274 | ||
275 | addr = readl(idma.regs + I2SLVL0ADDR) - idma.lp_tx_addr; | 275 | addr = readl(idma.regs + I2SLVL0ADDR) - idma.lp_tx_addr; |
276 | addr += prtd->periodsz; | 276 | addr += prtd->periodsz; |
277 | addr %= (prtd->end - prtd->start); | 277 | addr %= (u32)(prtd->end - prtd->start); |
278 | addr += idma.lp_tx_addr; | 278 | addr += idma.lp_tx_addr; |
279 | 279 | ||
280 | writel(addr, idma.regs + I2SLVL0ADDR); | 280 | writel(addr, idma.regs + I2SLVL0ADDR); |
@@ -413,13 +413,7 @@ static int asoc_idma_platform_probe(struct platform_device *pdev) | |||
413 | if (idma_irq < 0) | 413 | if (idma_irq < 0) |
414 | return idma_irq; | 414 | return idma_irq; |
415 | 415 | ||
416 | return snd_soc_register_platform(&pdev->dev, &asoc_idma_platform); | 416 | return devm_snd_soc_register_platform(&pdev->dev, &asoc_idma_platform); |
417 | } | ||
418 | |||
419 | static int asoc_idma_platform_remove(struct platform_device *pdev) | ||
420 | { | ||
421 | snd_soc_unregister_platform(&pdev->dev); | ||
422 | return 0; | ||
423 | } | 417 | } |
424 | 418 | ||
425 | static struct platform_driver asoc_idma_driver = { | 419 | static struct platform_driver asoc_idma_driver = { |
@@ -429,7 +423,6 @@ static struct platform_driver asoc_idma_driver = { | |||
429 | }, | 423 | }, |
430 | 424 | ||
431 | .probe = asoc_idma_platform_probe, | 425 | .probe = asoc_idma_platform_probe, |
432 | .remove = asoc_idma_platform_remove, | ||
433 | }; | 426 | }; |
434 | 427 | ||
435 | module_platform_driver(asoc_idma_driver); | 428 | module_platform_driver(asoc_idma_driver); |
diff --git a/sound/soc/samsung/littlemill.c b/sound/soc/samsung/littlemill.c index bfb91f34a22a..840787e63cb1 100644 --- a/sound/soc/samsung/littlemill.c +++ b/sound/soc/samsung/littlemill.c | |||
@@ -304,23 +304,12 @@ static int littlemill_probe(struct platform_device *pdev) | |||
304 | 304 | ||
305 | card->dev = &pdev->dev; | 305 | card->dev = &pdev->dev; |
306 | 306 | ||
307 | ret = snd_soc_register_card(card); | 307 | ret = devm_snd_soc_register_card(&pdev->dev, card); |
308 | if (ret) { | 308 | if (ret) |
309 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", | 309 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", |
310 | ret); | 310 | ret); |
311 | return ret; | ||
312 | } | ||
313 | |||
314 | return 0; | ||
315 | } | ||
316 | |||
317 | static int littlemill_remove(struct platform_device *pdev) | ||
318 | { | ||
319 | struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
320 | 311 | ||
321 | snd_soc_unregister_card(card); | 312 | return ret; |
322 | |||
323 | return 0; | ||
324 | } | 313 | } |
325 | 314 | ||
326 | static struct platform_driver littlemill_driver = { | 315 | static struct platform_driver littlemill_driver = { |
@@ -330,7 +319,6 @@ static struct platform_driver littlemill_driver = { | |||
330 | .pm = &snd_soc_pm_ops, | 319 | .pm = &snd_soc_pm_ops, |
331 | }, | 320 | }, |
332 | .probe = littlemill_probe, | 321 | .probe = littlemill_probe, |
333 | .remove = littlemill_remove, | ||
334 | }; | 322 | }; |
335 | 323 | ||
336 | module_platform_driver(littlemill_driver); | 324 | module_platform_driver(littlemill_driver); |
diff --git a/sound/soc/samsung/lowland.c b/sound/soc/samsung/lowland.c index 570cf5229508..bd5f0d643a86 100644 --- a/sound/soc/samsung/lowland.c +++ b/sound/soc/samsung/lowland.c | |||
@@ -187,23 +187,12 @@ static int lowland_probe(struct platform_device *pdev) | |||
187 | 187 | ||
188 | card->dev = &pdev->dev; | 188 | card->dev = &pdev->dev; |
189 | 189 | ||
190 | ret = snd_soc_register_card(card); | 190 | ret = devm_snd_soc_register_card(&pdev->dev, card); |
191 | if (ret) { | 191 | if (ret) |
192 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", | 192 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", |
193 | ret); | 193 | ret); |
194 | return ret; | ||
195 | } | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | static int lowland_remove(struct platform_device *pdev) | ||
201 | { | ||
202 | struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
203 | 194 | ||
204 | snd_soc_unregister_card(card); | 195 | return ret; |
205 | |||
206 | return 0; | ||
207 | } | 196 | } |
208 | 197 | ||
209 | static struct platform_driver lowland_driver = { | 198 | static struct platform_driver lowland_driver = { |
@@ -213,7 +202,6 @@ static struct platform_driver lowland_driver = { | |||
213 | .pm = &snd_soc_pm_ops, | 202 | .pm = &snd_soc_pm_ops, |
214 | }, | 203 | }, |
215 | .probe = lowland_probe, | 204 | .probe = lowland_probe, |
216 | .remove = lowland_remove, | ||
217 | }; | 205 | }; |
218 | 206 | ||
219 | module_platform_driver(lowland_driver); | 207 | module_platform_driver(lowland_driver); |
diff --git a/sound/soc/samsung/neo1973_wm8753.c b/sound/soc/samsung/neo1973_wm8753.c index b0800337b79e..9b4a09f14b6c 100644 --- a/sound/soc/samsung/neo1973_wm8753.c +++ b/sound/soc/samsung/neo1973_wm8753.c | |||
@@ -271,15 +271,8 @@ static const struct snd_kcontrol_new neo1973_wm8753_controls[] = { | |||
271 | 271 | ||
272 | static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) | 272 | static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) |
273 | { | 273 | { |
274 | struct snd_soc_codec *codec = rtd->codec; | ||
275 | struct snd_soc_card *card = rtd->card; | 274 | struct snd_soc_card *card = rtd->card; |
276 | 275 | ||
277 | /* set up NC codec pins */ | ||
278 | snd_soc_dapm_nc_pin(&codec->dapm, "OUT3"); | ||
279 | snd_soc_dapm_nc_pin(&codec->dapm, "OUT4"); | ||
280 | snd_soc_dapm_nc_pin(&codec->dapm, "LINE1"); | ||
281 | snd_soc_dapm_nc_pin(&codec->dapm, "LINE2"); | ||
282 | |||
283 | /* set endpoints to default off mode */ | 276 | /* set endpoints to default off mode */ |
284 | snd_soc_dapm_disable_pin(&card->dapm, "GSM Line Out"); | 277 | snd_soc_dapm_disable_pin(&card->dapm, "GSM Line Out"); |
285 | snd_soc_dapm_disable_pin(&card->dapm, "GSM Line In"); | 278 | snd_soc_dapm_disable_pin(&card->dapm, "GSM Line In"); |
@@ -355,6 +348,7 @@ static struct snd_soc_card neo1973 = { | |||
355 | .num_dapm_widgets = ARRAY_SIZE(neo1973_wm8753_dapm_widgets), | 348 | .num_dapm_widgets = ARRAY_SIZE(neo1973_wm8753_dapm_widgets), |
356 | .dapm_routes = neo1973_wm8753_routes, | 349 | .dapm_routes = neo1973_wm8753_routes, |
357 | .num_dapm_routes = ARRAY_SIZE(neo1973_wm8753_routes), | 350 | .num_dapm_routes = ARRAY_SIZE(neo1973_wm8753_routes), |
351 | .fully_routed = true, | ||
358 | }; | 352 | }; |
359 | 353 | ||
360 | static struct platform_device *neo1973_snd_device; | 354 | static struct platform_device *neo1973_snd_device; |
diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c index ab54e297957c..4c5f97fe45c8 100644 --- a/sound/soc/samsung/pcm.c +++ b/sound/soc/samsung/pcm.c | |||
@@ -283,8 +283,8 @@ static int s3c_pcm_hw_params(struct snd_pcm_substream *substream, | |||
283 | dev_dbg(pcm->dev, "Entered %s\n", __func__); | 283 | dev_dbg(pcm->dev, "Entered %s\n", __func__); |
284 | 284 | ||
285 | /* Strictly check for sample size */ | 285 | /* Strictly check for sample size */ |
286 | switch (params_format(params)) { | 286 | switch (params_width(params)) { |
287 | case SNDRV_PCM_FORMAT_S16_LE: | 287 | case 16: |
288 | break; | 288 | break; |
289 | default: | 289 | default: |
290 | return -EINVAL; | 290 | return -EINVAL; |
@@ -542,7 +542,7 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) | |||
542 | /* Default is 128fs */ | 542 | /* Default is 128fs */ |
543 | pcm->sclk_per_fs = 128; | 543 | pcm->sclk_per_fs = 128; |
544 | 544 | ||
545 | pcm->cclk = clk_get(&pdev->dev, "audio-bus"); | 545 | pcm->cclk = devm_clk_get(&pdev->dev, "audio-bus"); |
546 | if (IS_ERR(pcm->cclk)) { | 546 | if (IS_ERR(pcm->cclk)) { |
547 | dev_err(&pdev->dev, "failed to get audio-bus\n"); | 547 | dev_err(&pdev->dev, "failed to get audio-bus\n"); |
548 | ret = PTR_ERR(pcm->cclk); | 548 | ret = PTR_ERR(pcm->cclk); |
@@ -567,7 +567,7 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) | |||
567 | goto err3; | 567 | goto err3; |
568 | } | 568 | } |
569 | 569 | ||
570 | pcm->pclk = clk_get(&pdev->dev, "pcm"); | 570 | pcm->pclk = devm_clk_get(&pdev->dev, "pcm"); |
571 | if (IS_ERR(pcm->pclk)) { | 571 | if (IS_ERR(pcm->pclk)) { |
572 | dev_err(&pdev->dev, "failed to get pcm_clock\n"); | 572 | dev_err(&pdev->dev, "failed to get pcm_clock\n"); |
573 | ret = -ENOENT; | 573 | ret = -ENOENT; |
@@ -588,7 +588,7 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) | |||
588 | 588 | ||
589 | pm_runtime_enable(&pdev->dev); | 589 | pm_runtime_enable(&pdev->dev); |
590 | 590 | ||
591 | ret = snd_soc_register_component(&pdev->dev, &s3c_pcm_component, | 591 | ret = devm_snd_soc_register_component(&pdev->dev, &s3c_pcm_component, |
592 | &s3c_pcm_dai[pdev->id], 1); | 592 | &s3c_pcm_dai[pdev->id], 1); |
593 | if (ret != 0) { | 593 | if (ret != 0) { |
594 | dev_err(&pdev->dev, "failed to get register DAI: %d\n", ret); | 594 | dev_err(&pdev->dev, "failed to get register DAI: %d\n", ret); |
@@ -598,23 +598,19 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev) | |||
598 | ret = samsung_asoc_dma_platform_register(&pdev->dev); | 598 | ret = samsung_asoc_dma_platform_register(&pdev->dev); |
599 | if (ret) { | 599 | if (ret) { |
600 | dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); | 600 | dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); |
601 | goto err6; | 601 | goto err5; |
602 | } | 602 | } |
603 | 603 | ||
604 | return 0; | 604 | return 0; |
605 | 605 | ||
606 | err6: | ||
607 | snd_soc_unregister_component(&pdev->dev); | ||
608 | err5: | 606 | err5: |
609 | clk_disable_unprepare(pcm->pclk); | 607 | clk_disable_unprepare(pcm->pclk); |
610 | clk_put(pcm->pclk); | ||
611 | err4: | 608 | err4: |
612 | iounmap(pcm->regs); | 609 | iounmap(pcm->regs); |
613 | err3: | 610 | err3: |
614 | release_mem_region(mem_res->start, resource_size(mem_res)); | 611 | release_mem_region(mem_res->start, resource_size(mem_res)); |
615 | err2: | 612 | err2: |
616 | clk_disable_unprepare(pcm->cclk); | 613 | clk_disable_unprepare(pcm->cclk); |
617 | clk_put(pcm->cclk); | ||
618 | err1: | 614 | err1: |
619 | return ret; | 615 | return ret; |
620 | } | 616 | } |
@@ -624,9 +620,6 @@ static int s3c_pcm_dev_remove(struct platform_device *pdev) | |||
624 | struct s3c_pcm_info *pcm = &s3c_pcm[pdev->id]; | 620 | struct s3c_pcm_info *pcm = &s3c_pcm[pdev->id]; |
625 | struct resource *mem_res; | 621 | struct resource *mem_res; |
626 | 622 | ||
627 | samsung_asoc_dma_platform_unregister(&pdev->dev); | ||
628 | snd_soc_unregister_component(&pdev->dev); | ||
629 | |||
630 | pm_runtime_disable(&pdev->dev); | 623 | pm_runtime_disable(&pdev->dev); |
631 | 624 | ||
632 | iounmap(pcm->regs); | 625 | iounmap(pcm->regs); |
@@ -636,8 +629,6 @@ static int s3c_pcm_dev_remove(struct platform_device *pdev) | |||
636 | 629 | ||
637 | clk_disable_unprepare(pcm->cclk); | 630 | clk_disable_unprepare(pcm->cclk); |
638 | clk_disable_unprepare(pcm->pclk); | 631 | clk_disable_unprepare(pcm->pclk); |
639 | clk_put(pcm->pclk); | ||
640 | clk_put(pcm->cclk); | ||
641 | 632 | ||
642 | return 0; | 633 | return 0; |
643 | } | 634 | } |
diff --git a/sound/soc/samsung/rx1950_uda1380.c b/sound/soc/samsung/rx1950_uda1380.c index 2982d9e7f268..37688ebbb2b4 100644 --- a/sound/soc/samsung/rx1950_uda1380.c +++ b/sound/soc/samsung/rx1950_uda1380.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include "s3c24xx-i2s.h" | 31 | #include "s3c24xx-i2s.h" |
32 | 32 | ||
33 | static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd); | 33 | static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd); |
34 | static int rx1950_uda1380_card_remove(struct snd_soc_card *card); | ||
34 | static int rx1950_startup(struct snd_pcm_substream *substream); | 35 | static int rx1950_startup(struct snd_pcm_substream *substream); |
35 | static int rx1950_hw_params(struct snd_pcm_substream *substream, | 36 | static int rx1950_hw_params(struct snd_pcm_substream *substream, |
36 | struct snd_pcm_hw_params *params); | 37 | struct snd_pcm_hw_params *params); |
@@ -116,6 +117,7 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
116 | static struct snd_soc_card rx1950_asoc = { | 117 | static struct snd_soc_card rx1950_asoc = { |
117 | .name = "rx1950", | 118 | .name = "rx1950", |
118 | .owner = THIS_MODULE, | 119 | .owner = THIS_MODULE, |
120 | .remove = rx1950_uda1380_card_remove, | ||
119 | .dai_link = rx1950_uda1380_dai, | 121 | .dai_link = rx1950_uda1380_dai, |
120 | .num_links = ARRAY_SIZE(rx1950_uda1380_dai), | 122 | .num_links = ARRAY_SIZE(rx1950_uda1380_dai), |
121 | 123 | ||
@@ -221,11 +223,6 @@ static int rx1950_hw_params(struct snd_pcm_substream *substream, | |||
221 | static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd) | 223 | static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd) |
222 | { | 224 | { |
223 | struct snd_soc_codec *codec = rtd->codec; | 225 | struct snd_soc_codec *codec = rtd->codec; |
224 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
225 | |||
226 | snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); | ||
227 | snd_soc_dapm_enable_pin(dapm, "Speaker"); | ||
228 | snd_soc_dapm_enable_pin(dapm, "Mic Jack"); | ||
229 | 226 | ||
230 | snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE, | 227 | snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE, |
231 | &hp_jack); | 228 | &hp_jack); |
@@ -239,6 +236,14 @@ static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd) | |||
239 | return 0; | 236 | return 0; |
240 | } | 237 | } |
241 | 238 | ||
239 | static int rx1950_uda1380_card_remove(struct snd_soc_card *card) | ||
240 | { | ||
241 | snd_soc_jack_free_gpios(&hp_jack, ARRAY_SIZE(hp_jack_gpios), | ||
242 | hp_jack_gpios); | ||
243 | |||
244 | return 0; | ||
245 | } | ||
246 | |||
242 | static int __init rx1950_init(void) | 247 | static int __init rx1950_init(void) |
243 | { | 248 | { |
244 | int ret; | 249 | int ret; |
@@ -283,8 +288,6 @@ err_gpio: | |||
283 | static void __exit rx1950_exit(void) | 288 | static void __exit rx1950_exit(void) |
284 | { | 289 | { |
285 | platform_device_unregister(s3c24xx_snd_device); | 290 | platform_device_unregister(s3c24xx_snd_device); |
286 | snd_soc_jack_free_gpios(&hp_jack, ARRAY_SIZE(hp_jack_gpios), | ||
287 | hp_jack_gpios); | ||
288 | gpio_free(S3C2410_GPA(1)); | 291 | gpio_free(S3C2410_GPA(1)); |
289 | } | 292 | } |
290 | 293 | ||
diff --git a/sound/soc/samsung/s3c-i2s-v2.c b/sound/soc/samsung/s3c-i2s-v2.c index 79e7efb9283c..0ff4bbe23af3 100644 --- a/sound/soc/samsung/s3c-i2s-v2.c +++ b/sound/soc/samsung/s3c-i2s-v2.c | |||
@@ -322,13 +322,13 @@ static int s3c_i2sv2_hw_params(struct snd_pcm_substream *substream, | |||
322 | 322 | ||
323 | iismod &= ~S3C64XX_IISMOD_BLC_MASK; | 323 | iismod &= ~S3C64XX_IISMOD_BLC_MASK; |
324 | /* Sample size */ | 324 | /* Sample size */ |
325 | switch (params_format(params)) { | 325 | switch (params_width(params)) { |
326 | case SNDRV_PCM_FORMAT_S8: | 326 | case 8: |
327 | iismod |= S3C64XX_IISMOD_BLC_8BIT; | 327 | iismod |= S3C64XX_IISMOD_BLC_8BIT; |
328 | break; | 328 | break; |
329 | case SNDRV_PCM_FORMAT_S16_LE: | 329 | case 16: |
330 | break; | 330 | break; |
331 | case SNDRV_PCM_FORMAT_S24_LE: | 331 | case 24: |
332 | iismod |= S3C64XX_IISMOD_BLC_24BIT; | 332 | iismod |= S3C64XX_IISMOD_BLC_24BIT; |
333 | break; | 333 | break; |
334 | } | 334 | } |
@@ -745,7 +745,7 @@ int s3c_i2sv2_register_component(struct device *dev, int id, | |||
745 | dai_drv->suspend = s3c2412_i2s_suspend; | 745 | dai_drv->suspend = s3c2412_i2s_suspend; |
746 | dai_drv->resume = s3c2412_i2s_resume; | 746 | dai_drv->resume = s3c2412_i2s_resume; |
747 | 747 | ||
748 | return snd_soc_register_component(dev, cmp_drv, dai_drv, 1); | 748 | return devm_snd_soc_register_component(dev, cmp_drv, dai_drv, 1); |
749 | } | 749 | } |
750 | EXPORT_SYMBOL_GPL(s3c_i2sv2_register_component); | 750 | EXPORT_SYMBOL_GPL(s3c_i2sv2_register_component); |
751 | 751 | ||
diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c index e9bb5d7a71ee..08c059be9104 100644 --- a/sound/soc/samsung/s3c2412-i2s.c +++ b/sound/soc/samsung/s3c2412-i2s.c | |||
@@ -120,11 +120,11 @@ static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream, | |||
120 | iismod = readl(i2s->regs + S3C2412_IISMOD); | 120 | iismod = readl(i2s->regs + S3C2412_IISMOD); |
121 | pr_debug("%s: r: IISMOD: %x\n", __func__, iismod); | 121 | pr_debug("%s: r: IISMOD: %x\n", __func__, iismod); |
122 | 122 | ||
123 | switch (params_format(params)) { | 123 | switch (params_width(params)) { |
124 | case SNDRV_PCM_FORMAT_S8: | 124 | case 8: |
125 | iismod |= S3C2412_IISMOD_8BIT; | 125 | iismod |= S3C2412_IISMOD_8BIT; |
126 | break; | 126 | break; |
127 | case SNDRV_PCM_FORMAT_S16_LE: | 127 | case 16: |
128 | iismod &= ~S3C2412_IISMOD_8BIT; | 128 | iismod &= ~S3C2412_IISMOD_8BIT; |
129 | break; | 129 | break; |
130 | } | 130 | } |
@@ -179,27 +179,14 @@ static int s3c2412_iis_dev_probe(struct platform_device *pdev) | |||
179 | } | 179 | } |
180 | 180 | ||
181 | ret = samsung_asoc_dma_platform_register(&pdev->dev); | 181 | ret = samsung_asoc_dma_platform_register(&pdev->dev); |
182 | if (ret) { | 182 | if (ret) |
183 | pr_err("failed to register the DMA: %d\n", ret); | 183 | pr_err("failed to register the DMA: %d\n", ret); |
184 | goto err; | ||
185 | } | ||
186 | 184 | ||
187 | return 0; | ||
188 | err: | ||
189 | snd_soc_unregister_component(&pdev->dev); | ||
190 | return ret; | 185 | return ret; |
191 | } | 186 | } |
192 | 187 | ||
193 | static int s3c2412_iis_dev_remove(struct platform_device *pdev) | ||
194 | { | ||
195 | samsung_asoc_dma_platform_unregister(&pdev->dev); | ||
196 | snd_soc_unregister_component(&pdev->dev); | ||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | static struct platform_driver s3c2412_iis_driver = { | 188 | static struct platform_driver s3c2412_iis_driver = { |
201 | .probe = s3c2412_iis_dev_probe, | 189 | .probe = s3c2412_iis_dev_probe, |
202 | .remove = s3c2412_iis_dev_remove, | ||
203 | .driver = { | 190 | .driver = { |
204 | .name = "s3c2412-iis", | 191 | .name = "s3c2412-iis", |
205 | .owner = THIS_MODULE, | 192 | .owner = THIS_MODULE, |
diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c index d7b8457b5650..9aba9fb7df0e 100644 --- a/sound/soc/samsung/s3c24xx-i2s.c +++ b/sound/soc/samsung/s3c24xx-i2s.c | |||
@@ -248,12 +248,12 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
248 | iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); | 248 | iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); |
249 | pr_debug("hw_params r: IISMOD: %x\n", iismod); | 249 | pr_debug("hw_params r: IISMOD: %x\n", iismod); |
250 | 250 | ||
251 | switch (params_format(params)) { | 251 | switch (params_width(params)) { |
252 | case SNDRV_PCM_FORMAT_S8: | 252 | case 8: |
253 | iismod &= ~S3C2410_IISMOD_16BIT; | 253 | iismod &= ~S3C2410_IISMOD_16BIT; |
254 | dma_data->dma_size = 1; | 254 | dma_data->dma_size = 1; |
255 | break; | 255 | break; |
256 | case SNDRV_PCM_FORMAT_S16_LE: | 256 | case 16: |
257 | iismod |= S3C2410_IISMOD_16BIT; | 257 | iismod |= S3C2410_IISMOD_16BIT; |
258 | dma_data->dma_size = 2; | 258 | dma_data->dma_size = 2; |
259 | break; | 259 | break; |
@@ -475,35 +475,22 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev) | |||
475 | { | 475 | { |
476 | int ret = 0; | 476 | int ret = 0; |
477 | 477 | ||
478 | ret = snd_soc_register_component(&pdev->dev, &s3c24xx_i2s_component, | 478 | ret = devm_snd_soc_register_component(&pdev->dev, |
479 | &s3c24xx_i2s_dai, 1); | 479 | &s3c24xx_i2s_component, &s3c24xx_i2s_dai, 1); |
480 | if (ret) { | 480 | if (ret) { |
481 | pr_err("failed to register the dai\n"); | 481 | pr_err("failed to register the dai\n"); |
482 | return ret; | 482 | return ret; |
483 | } | 483 | } |
484 | 484 | ||
485 | ret = samsung_asoc_dma_platform_register(&pdev->dev); | 485 | ret = samsung_asoc_dma_platform_register(&pdev->dev); |
486 | if (ret) { | 486 | if (ret) |
487 | pr_err("failed to register the dma: %d\n", ret); | 487 | pr_err("failed to register the dma: %d\n", ret); |
488 | goto err; | ||
489 | } | ||
490 | 488 | ||
491 | return 0; | ||
492 | err: | ||
493 | snd_soc_unregister_component(&pdev->dev); | ||
494 | return ret; | 489 | return ret; |
495 | } | 490 | } |
496 | 491 | ||
497 | static int s3c24xx_iis_dev_remove(struct platform_device *pdev) | ||
498 | { | ||
499 | samsung_asoc_dma_platform_unregister(&pdev->dev); | ||
500 | snd_soc_unregister_component(&pdev->dev); | ||
501 | return 0; | ||
502 | } | ||
503 | |||
504 | static struct platform_driver s3c24xx_iis_driver = { | 492 | static struct platform_driver s3c24xx_iis_driver = { |
505 | .probe = s3c24xx_iis_dev_probe, | 493 | .probe = s3c24xx_iis_dev_probe, |
506 | .remove = s3c24xx_iis_dev_remove, | ||
507 | .driver = { | 494 | .driver = { |
508 | .name = "s3c24xx-iis", | 495 | .name = "s3c24xx-iis", |
509 | .owner = THIS_MODULE, | 496 | .owner = THIS_MODULE, |
diff --git a/sound/soc/samsung/s3c24xx_simtec_hermes.c b/sound/soc/samsung/s3c24xx_simtec_hermes.c index d8a0543cae5e..2d30b7b6818a 100644 --- a/sound/soc/samsung/s3c24xx_simtec_hermes.c +++ b/sound/soc/samsung/s3c24xx_simtec_hermes.c | |||
@@ -63,14 +63,6 @@ static const struct snd_soc_dapm_route base_map[] = { | |||
63 | */ | 63 | */ |
64 | static int simtec_hermes_init(struct snd_soc_pcm_runtime *rtd) | 64 | static int simtec_hermes_init(struct snd_soc_pcm_runtime *rtd) |
65 | { | 65 | { |
66 | struct snd_soc_codec *codec = rtd->codec; | ||
67 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
68 | |||
69 | snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); | ||
70 | snd_soc_dapm_enable_pin(dapm, "Line In"); | ||
71 | snd_soc_dapm_enable_pin(dapm, "Line Out"); | ||
72 | snd_soc_dapm_enable_pin(dapm, "Mic Jack"); | ||
73 | |||
74 | simtec_audio_init(rtd); | 66 | simtec_audio_init(rtd); |
75 | 67 | ||
76 | return 0; | 68 | return 0; |
diff --git a/sound/soc/samsung/s3c24xx_simtec_tlv320aic23.c b/sound/soc/samsung/s3c24xx_simtec_tlv320aic23.c index 1ac0d7a63a3a..83f6c7d49cd6 100644 --- a/sound/soc/samsung/s3c24xx_simtec_tlv320aic23.c +++ b/sound/soc/samsung/s3c24xx_simtec_tlv320aic23.c | |||
@@ -52,14 +52,6 @@ static const struct snd_soc_dapm_route base_map[] = { | |||
52 | */ | 52 | */ |
53 | static int simtec_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) | 53 | static int simtec_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) |
54 | { | 54 | { |
55 | struct snd_soc_codec *codec = rtd->codec; | ||
56 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
57 | |||
58 | snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); | ||
59 | snd_soc_dapm_enable_pin(dapm, "Line In"); | ||
60 | snd_soc_dapm_enable_pin(dapm, "Line Out"); | ||
61 | snd_soc_dapm_enable_pin(dapm, "Mic Jack"); | ||
62 | |||
63 | simtec_audio_init(rtd); | 55 | simtec_audio_init(rtd); |
64 | 56 | ||
65 | return 0; | 57 | return 0; |
diff --git a/sound/soc/samsung/smartq_wm8987.c b/sound/soc/samsung/smartq_wm8987.c index c3b2adafb7b5..9b0ffacab790 100644 --- a/sound/soc/samsung/smartq_wm8987.c +++ b/sound/soc/samsung/smartq_wm8987.c | |||
@@ -162,8 +162,6 @@ static int smartq_wm8987_init(struct snd_soc_pcm_runtime *rtd) | |||
162 | snd_soc_dapm_nc_pin(dapm, "ROUT1"); | 162 | snd_soc_dapm_nc_pin(dapm, "ROUT1"); |
163 | 163 | ||
164 | /* set endpoints to default off mode */ | 164 | /* set endpoints to default off mode */ |
165 | snd_soc_dapm_enable_pin(dapm, "Internal Speaker"); | ||
166 | snd_soc_dapm_enable_pin(dapm, "Internal Mic"); | ||
167 | snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); | 165 | snd_soc_dapm_disable_pin(dapm, "Headphone Jack"); |
168 | 166 | ||
169 | /* Headphone jack detection */ | 167 | /* Headphone jack detection */ |
@@ -184,6 +182,14 @@ static int smartq_wm8987_init(struct snd_soc_pcm_runtime *rtd) | |||
184 | return err; | 182 | return err; |
185 | } | 183 | } |
186 | 184 | ||
185 | static int smartq_wm8987_card_remove(struct snd_soc_card *card) | ||
186 | { | ||
187 | snd_soc_jack_free_gpios(&smartq_jack, ARRAY_SIZE(smartq_jack_gpios), | ||
188 | smartq_jack_gpios); | ||
189 | |||
190 | return 0; | ||
191 | } | ||
192 | |||
187 | static struct snd_soc_dai_link smartq_dai[] = { | 193 | static struct snd_soc_dai_link smartq_dai[] = { |
188 | { | 194 | { |
189 | .name = "wm8987", | 195 | .name = "wm8987", |
@@ -200,6 +206,7 @@ static struct snd_soc_dai_link smartq_dai[] = { | |||
200 | static struct snd_soc_card snd_soc_smartq = { | 206 | static struct snd_soc_card snd_soc_smartq = { |
201 | .name = "SmartQ", | 207 | .name = "SmartQ", |
202 | .owner = THIS_MODULE, | 208 | .owner = THIS_MODULE, |
209 | .remove = smartq_wm8987_card_remove, | ||
203 | .dai_link = smartq_dai, | 210 | .dai_link = smartq_dai, |
204 | .num_links = ARRAY_SIZE(smartq_dai), | 211 | .num_links = ARRAY_SIZE(smartq_dai), |
205 | 212 | ||
@@ -261,8 +268,6 @@ err_unregister_device: | |||
261 | static void __exit smartq_exit(void) | 268 | static void __exit smartq_exit(void) |
262 | { | 269 | { |
263 | gpio_free(S3C64XX_GPK(12)); | 270 | gpio_free(S3C64XX_GPK(12)); |
264 | snd_soc_jack_free_gpios(&smartq_jack, ARRAY_SIZE(smartq_jack_gpios), | ||
265 | smartq_jack_gpios); | ||
266 | 271 | ||
267 | platform_device_unregister(smartq_snd_device); | 272 | platform_device_unregister(smartq_snd_device); |
268 | } | 273 | } |
diff --git a/sound/soc/samsung/smdk_wm8580.c b/sound/soc/samsung/smdk_wm8580.c index 7a16b32ed673..b1a519f83b29 100644 --- a/sound/soc/samsung/smdk_wm8580.c +++ b/sound/soc/samsung/smdk_wm8580.c | |||
@@ -37,13 +37,11 @@ static int smdk_hw_params(struct snd_pcm_substream *substream, | |||
37 | unsigned int pll_out; | 37 | unsigned int pll_out; |
38 | int bfs, rfs, ret; | 38 | int bfs, rfs, ret; |
39 | 39 | ||
40 | switch (params_format(params)) { | 40 | switch (params_width(params)) { |
41 | case SNDRV_PCM_FORMAT_U8: | 41 | case 8: |
42 | case SNDRV_PCM_FORMAT_S8: | ||
43 | bfs = 16; | 42 | bfs = 16; |
44 | break; | 43 | break; |
45 | case SNDRV_PCM_FORMAT_U16_LE: | 44 | case 16: |
46 | case SNDRV_PCM_FORMAT_S16_LE: | ||
47 | bfs = 32; | 45 | bfs = 32; |
48 | break; | 46 | break; |
49 | default: | 47 | default: |
diff --git a/sound/soc/samsung/smdk_wm8580pcm.c b/sound/soc/samsung/smdk_wm8580pcm.c index 23a9204b106d..e119aaa91c28 100644 --- a/sound/soc/samsung/smdk_wm8580pcm.c +++ b/sound/soc/samsung/smdk_wm8580pcm.c | |||
@@ -164,19 +164,11 @@ static int snd_smdk_probe(struct platform_device *pdev) | |||
164 | xtal_freq = mclk_freq = SMDK_WM8580_EXT_VOICE; | 164 | xtal_freq = mclk_freq = SMDK_WM8580_EXT_VOICE; |
165 | 165 | ||
166 | smdk_pcm.dev = &pdev->dev; | 166 | smdk_pcm.dev = &pdev->dev; |
167 | ret = snd_soc_register_card(&smdk_pcm); | 167 | ret = devm_snd_soc_register_card(&pdev->dev, &smdk_pcm); |
168 | if (ret) { | 168 | if (ret) |
169 | dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret); | 169 | dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret); |
170 | return ret; | ||
171 | } | ||
172 | 170 | ||
173 | return 0; | 171 | return ret; |
174 | } | ||
175 | |||
176 | static int snd_smdk_remove(struct platform_device *pdev) | ||
177 | { | ||
178 | snd_soc_unregister_card(&smdk_pcm); | ||
179 | return 0; | ||
180 | } | 172 | } |
181 | 173 | ||
182 | static struct platform_driver snd_smdk_driver = { | 174 | static struct platform_driver snd_smdk_driver = { |
@@ -185,7 +177,6 @@ static struct platform_driver snd_smdk_driver = { | |||
185 | .name = "samsung-smdk-pcm", | 177 | .name = "samsung-smdk-pcm", |
186 | }, | 178 | }, |
187 | .probe = snd_smdk_probe, | 179 | .probe = snd_smdk_probe, |
188 | .remove = snd_smdk_remove, | ||
189 | }; | 180 | }; |
190 | 181 | ||
191 | module_platform_driver(snd_smdk_driver); | 182 | module_platform_driver(snd_smdk_driver); |
diff --git a/sound/soc/samsung/smdk_wm8994.c b/sound/soc/samsung/smdk_wm8994.c index 682eb4f7ba0c..3d6272a8cad2 100644 --- a/sound/soc/samsung/smdk_wm8994.c +++ b/sound/soc/samsung/smdk_wm8994.c | |||
@@ -57,7 +57,7 @@ static int smdk_hw_params(struct snd_pcm_substream *substream, | |||
57 | int ret; | 57 | int ret; |
58 | 58 | ||
59 | /* AIF1CLK should be >=3MHz for optimal performance */ | 59 | /* AIF1CLK should be >=3MHz for optimal performance */ |
60 | if (params_format(params) == SNDRV_PCM_FORMAT_S24_LE) | 60 | if (params_width(params) == 24) |
61 | pll_out = params_rate(params) * 384; | 61 | pll_out = params_rate(params) * 384; |
62 | else if (params_rate(params) == 8000 || params_rate(params) == 11025) | 62 | else if (params_rate(params) == 8000 || params_rate(params) == 11025) |
63 | pll_out = params_rate(params) * 512; | 63 | pll_out = params_rate(params) * 512; |
@@ -89,18 +89,6 @@ static int smdk_wm8994_init_paiftx(struct snd_soc_pcm_runtime *rtd) | |||
89 | struct snd_soc_codec *codec = rtd->codec; | 89 | struct snd_soc_codec *codec = rtd->codec; |
90 | struct snd_soc_dapm_context *dapm = &codec->dapm; | 90 | struct snd_soc_dapm_context *dapm = &codec->dapm; |
91 | 91 | ||
92 | /* HeadPhone */ | ||
93 | snd_soc_dapm_enable_pin(dapm, "HPOUT1R"); | ||
94 | snd_soc_dapm_enable_pin(dapm, "HPOUT1L"); | ||
95 | |||
96 | /* MicIn */ | ||
97 | snd_soc_dapm_enable_pin(dapm, "IN1LN"); | ||
98 | snd_soc_dapm_enable_pin(dapm, "IN1RN"); | ||
99 | |||
100 | /* LineIn */ | ||
101 | snd_soc_dapm_enable_pin(dapm, "IN2LN"); | ||
102 | snd_soc_dapm_enable_pin(dapm, "IN2RN"); | ||
103 | |||
104 | /* Other pins NC */ | 92 | /* Other pins NC */ |
105 | snd_soc_dapm_nc_pin(dapm, "HPOUT2P"); | 93 | snd_soc_dapm_nc_pin(dapm, "HPOUT2P"); |
106 | snd_soc_dapm_nc_pin(dapm, "HPOUT2N"); | 94 | snd_soc_dapm_nc_pin(dapm, "HPOUT2N"); |
diff --git a/sound/soc/samsung/smdk_wm8994pcm.c b/sound/soc/samsung/smdk_wm8994pcm.c index 0c84ca099612..b6c09979be1f 100644 --- a/sound/soc/samsung/smdk_wm8994pcm.c +++ b/sound/soc/samsung/smdk_wm8994pcm.c | |||
@@ -134,19 +134,11 @@ static int snd_smdk_probe(struct platform_device *pdev) | |||
134 | int ret = 0; | 134 | int ret = 0; |
135 | 135 | ||
136 | smdk_pcm.dev = &pdev->dev; | 136 | smdk_pcm.dev = &pdev->dev; |
137 | ret = snd_soc_register_card(&smdk_pcm); | 137 | ret = devm_snd_soc_register_card(&pdev->dev, &smdk_pcm); |
138 | if (ret) { | 138 | if (ret) |
139 | dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret); | 139 | dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret); |
140 | return ret; | ||
141 | } | ||
142 | 140 | ||
143 | return 0; | 141 | return ret; |
144 | } | ||
145 | |||
146 | static int snd_smdk_remove(struct platform_device *pdev) | ||
147 | { | ||
148 | snd_soc_unregister_card(&smdk_pcm); | ||
149 | return 0; | ||
150 | } | 142 | } |
151 | 143 | ||
152 | static struct platform_driver snd_smdk_driver = { | 144 | static struct platform_driver snd_smdk_driver = { |
@@ -155,7 +147,6 @@ static struct platform_driver snd_smdk_driver = { | |||
155 | .name = "samsung-smdk-pcm", | 147 | .name = "samsung-smdk-pcm", |
156 | }, | 148 | }, |
157 | .probe = snd_smdk_probe, | 149 | .probe = snd_smdk_probe, |
158 | .remove = snd_smdk_remove, | ||
159 | }; | 150 | }; |
160 | 151 | ||
161 | module_platform_driver(snd_smdk_driver); | 152 | module_platform_driver(snd_smdk_driver); |
diff --git a/sound/soc/samsung/snow.c b/sound/soc/samsung/snow.c new file mode 100644 index 000000000000..014c177840ba --- /dev/null +++ b/sound/soc/samsung/snow.c | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * ASoC machine driver for Snow boards | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * version 2 as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, but | ||
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
11 | * General Public License for more details. | ||
12 | */ | ||
13 | |||
14 | #include <linux/module.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/of.h> | ||
17 | #include <linux/of_device.h> | ||
18 | |||
19 | #include <sound/soc.h> | ||
20 | |||
21 | #include "i2s.h" | ||
22 | |||
23 | #define FIN_PLL_RATE 24000000 | ||
24 | |||
25 | static struct snd_soc_dai_link snow_dai[] = { | ||
26 | { | ||
27 | .name = "Primary", | ||
28 | .stream_name = "Primary", | ||
29 | .codec_dai_name = "HiFi", | ||
30 | .dai_fmt = SND_SOC_DAIFMT_I2S | | ||
31 | SND_SOC_DAIFMT_NB_NF | | ||
32 | SND_SOC_DAIFMT_CBS_CFS, | ||
33 | }, | ||
34 | }; | ||
35 | |||
36 | static int snow_late_probe(struct snd_soc_card *card) | ||
37 | { | ||
38 | struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; | ||
39 | struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai; | ||
40 | int ret; | ||
41 | |||
42 | /* Set the MCLK rate for the codec */ | ||
43 | ret = snd_soc_dai_set_sysclk(codec_dai, 0, | ||
44 | FIN_PLL_RATE, SND_SOC_CLOCK_IN); | ||
45 | if (ret < 0) | ||
46 | return ret; | ||
47 | |||
48 | /* Select I2S Bus clock to set RCLK and BCLK */ | ||
49 | ret = snd_soc_dai_set_sysclk(cpu_dai, SAMSUNG_I2S_RCLKSRC_0, | ||
50 | 0, SND_SOC_CLOCK_IN); | ||
51 | if (ret < 0) | ||
52 | return ret; | ||
53 | |||
54 | return 0; | ||
55 | } | ||
56 | |||
57 | static struct snd_soc_card snow_snd = { | ||
58 | .name = "Snow-I2S", | ||
59 | .dai_link = snow_dai, | ||
60 | .num_links = ARRAY_SIZE(snow_dai), | ||
61 | |||
62 | .late_probe = snow_late_probe, | ||
63 | }; | ||
64 | |||
65 | static int snow_probe(struct platform_device *pdev) | ||
66 | { | ||
67 | struct snd_soc_card *card = &snow_snd; | ||
68 | struct device_node *i2s_node, *codec_node; | ||
69 | int i, ret; | ||
70 | |||
71 | i2s_node = of_parse_phandle(pdev->dev.of_node, | ||
72 | "samsung,i2s-controller", 0); | ||
73 | if (!i2s_node) { | ||
74 | dev_err(&pdev->dev, | ||
75 | "Property 'i2s-controller' missing or invalid\n"); | ||
76 | return -EINVAL; | ||
77 | } | ||
78 | |||
79 | codec_node = of_parse_phandle(pdev->dev.of_node, | ||
80 | "samsung,audio-codec", 0); | ||
81 | if (!codec_node) { | ||
82 | dev_err(&pdev->dev, | ||
83 | "Property 'audio-codec' missing or invalid\n"); | ||
84 | return -EINVAL; | ||
85 | } | ||
86 | |||
87 | for (i = 0; i < ARRAY_SIZE(snow_dai); i++) { | ||
88 | snow_dai[i].codec_of_node = codec_node; | ||
89 | snow_dai[i].cpu_of_node = i2s_node; | ||
90 | snow_dai[i].platform_of_node = i2s_node; | ||
91 | } | ||
92 | |||
93 | card->dev = &pdev->dev; | ||
94 | |||
95 | ret = devm_snd_soc_register_card(&pdev->dev, card); | ||
96 | if (ret) { | ||
97 | dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); | ||
98 | return ret; | ||
99 | } | ||
100 | |||
101 | return ret; | ||
102 | } | ||
103 | |||
104 | static const struct of_device_id snow_of_match[] = { | ||
105 | { .compatible = "google,snow-audio-max98090", }, | ||
106 | { .compatible = "google,snow-audio-max98095", }, | ||
107 | {}, | ||
108 | }; | ||
109 | |||
110 | static struct platform_driver snow_driver = { | ||
111 | .driver = { | ||
112 | .name = "snow-audio", | ||
113 | .owner = THIS_MODULE, | ||
114 | .pm = &snd_soc_pm_ops, | ||
115 | .of_match_table = snow_of_match, | ||
116 | }, | ||
117 | .probe = snow_probe, | ||
118 | }; | ||
119 | |||
120 | module_platform_driver(snow_driver); | ||
121 | |||
122 | MODULE_DESCRIPTION("ALSA SoC Audio machine driver for Snow"); | ||
123 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/samsung/spdif.c b/sound/soc/samsung/spdif.c index cfe63b7bcc9f..d9ffc48fce5e 100644 --- a/sound/soc/samsung/spdif.c +++ b/sound/soc/samsung/spdif.c | |||
@@ -211,8 +211,8 @@ static int spdif_hw_params(struct snd_pcm_substream *substream, | |||
211 | con |= CON_PCM_DATA; | 211 | con |= CON_PCM_DATA; |
212 | 212 | ||
213 | con &= ~CON_PCM_MASK; | 213 | con &= ~CON_PCM_MASK; |
214 | switch (params_format(params)) { | 214 | switch (params_width(params)) { |
215 | case SNDRV_PCM_FORMAT_S16_LE: | 215 | case 16: |
216 | con |= CON_PCM_16BIT; | 216 | con |= CON_PCM_16BIT; |
217 | break; | 217 | break; |
218 | default: | 218 | default: |
@@ -427,8 +427,8 @@ static int spdif_probe(struct platform_device *pdev) | |||
427 | 427 | ||
428 | dev_set_drvdata(&pdev->dev, spdif); | 428 | dev_set_drvdata(&pdev->dev, spdif); |
429 | 429 | ||
430 | ret = snd_soc_register_component(&pdev->dev, &samsung_spdif_component, | 430 | ret = devm_snd_soc_register_component(&pdev->dev, |
431 | &samsung_spdif_dai, 1); | 431 | &samsung_spdif_component, &samsung_spdif_dai, 1); |
432 | if (ret != 0) { | 432 | if (ret != 0) { |
433 | dev_err(&pdev->dev, "fail to register dai\n"); | 433 | dev_err(&pdev->dev, "fail to register dai\n"); |
434 | goto err4; | 434 | goto err4; |
@@ -444,12 +444,10 @@ static int spdif_probe(struct platform_device *pdev) | |||
444 | ret = samsung_asoc_dma_platform_register(&pdev->dev); | 444 | ret = samsung_asoc_dma_platform_register(&pdev->dev); |
445 | if (ret) { | 445 | if (ret) { |
446 | dev_err(&pdev->dev, "failed to register DMA: %d\n", ret); | 446 | dev_err(&pdev->dev, "failed to register DMA: %d\n", ret); |
447 | goto err5; | 447 | goto err4; |
448 | } | 448 | } |
449 | 449 | ||
450 | return 0; | 450 | return 0; |
451 | err5: | ||
452 | snd_soc_unregister_component(&pdev->dev); | ||
453 | err4: | 451 | err4: |
454 | iounmap(spdif->regs); | 452 | iounmap(spdif->regs); |
455 | err3: | 453 | err3: |
@@ -467,9 +465,6 @@ static int spdif_remove(struct platform_device *pdev) | |||
467 | struct samsung_spdif_info *spdif = &spdif_info; | 465 | struct samsung_spdif_info *spdif = &spdif_info; |
468 | struct resource *mem_res; | 466 | struct resource *mem_res; |
469 | 467 | ||
470 | samsung_asoc_dma_platform_unregister(&pdev->dev); | ||
471 | snd_soc_unregister_component(&pdev->dev); | ||
472 | |||
473 | iounmap(spdif->regs); | 468 | iounmap(spdif->regs); |
474 | 469 | ||
475 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 470 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
diff --git a/sound/soc/samsung/speyside.c b/sound/soc/samsung/speyside.c index 57df90d6b7c1..9902efcb8ea1 100644 --- a/sound/soc/samsung/speyside.c +++ b/sound/soc/samsung/speyside.c | |||
@@ -327,23 +327,12 @@ static int speyside_probe(struct platform_device *pdev) | |||
327 | 327 | ||
328 | card->dev = &pdev->dev; | 328 | card->dev = &pdev->dev; |
329 | 329 | ||
330 | ret = snd_soc_register_card(card); | 330 | ret = devm_snd_soc_register_card(&pdev->dev, card); |
331 | if (ret) { | 331 | if (ret) |
332 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", | 332 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", |
333 | ret); | 333 | ret); |
334 | return ret; | ||
335 | } | ||
336 | |||
337 | return 0; | ||
338 | } | ||
339 | |||
340 | static int speyside_remove(struct platform_device *pdev) | ||
341 | { | ||
342 | struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
343 | 334 | ||
344 | snd_soc_unregister_card(card); | 335 | return ret; |
345 | |||
346 | return 0; | ||
347 | } | 336 | } |
348 | 337 | ||
349 | static struct platform_driver speyside_driver = { | 338 | static struct platform_driver speyside_driver = { |
@@ -353,7 +342,6 @@ static struct platform_driver speyside_driver = { | |||
353 | .pm = &snd_soc_pm_ops, | 342 | .pm = &snd_soc_pm_ops, |
354 | }, | 343 | }, |
355 | .probe = speyside_probe, | 344 | .probe = speyside_probe, |
356 | .remove = speyside_remove, | ||
357 | }; | 345 | }; |
358 | 346 | ||
359 | module_platform_driver(speyside_driver); | 347 | module_platform_driver(speyside_driver); |
diff --git a/sound/soc/samsung/tobermory.c b/sound/soc/samsung/tobermory.c index 1807b75ccc12..6a2b9f14d624 100644 --- a/sound/soc/samsung/tobermory.c +++ b/sound/soc/samsung/tobermory.c | |||
@@ -223,23 +223,12 @@ static int tobermory_probe(struct platform_device *pdev) | |||
223 | 223 | ||
224 | card->dev = &pdev->dev; | 224 | card->dev = &pdev->dev; |
225 | 225 | ||
226 | ret = snd_soc_register_card(card); | 226 | ret = devm_snd_soc_register_card(&pdev->dev, card); |
227 | if (ret) { | 227 | if (ret) |
228 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", | 228 | dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", |
229 | ret); | 229 | ret); |
230 | return ret; | ||
231 | } | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | static int tobermory_remove(struct platform_device *pdev) | ||
237 | { | ||
238 | struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
239 | 230 | ||
240 | snd_soc_unregister_card(card); | 231 | return ret; |
241 | |||
242 | return 0; | ||
243 | } | 232 | } |
244 | 233 | ||
245 | static struct platform_driver tobermory_driver = { | 234 | static struct platform_driver tobermory_driver = { |
@@ -249,7 +238,6 @@ static struct platform_driver tobermory_driver = { | |||
249 | .pm = &snd_soc_pm_ops, | 238 | .pm = &snd_soc_pm_ops, |
250 | }, | 239 | }, |
251 | .probe = tobermory_probe, | 240 | .probe = tobermory_probe, |
252 | .remove = tobermory_remove, | ||
253 | }; | 241 | }; |
254 | 242 | ||
255 | module_platform_driver(tobermory_driver); | 243 | module_platform_driver(tobermory_driver); |