aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/samsung
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/samsung')
-rw-r--r--sound/soc/samsung/Kconfig22
-rw-r--r--sound/soc/samsung/Makefile2
-rw-r--r--sound/soc/samsung/ac97.c9
-rw-r--r--sound/soc/samsung/bells.c16
-rw-r--r--sound/soc/samsung/dma.c8
-rw-r--r--sound/soc/samsung/dma.h1
-rw-r--r--sound/soc/samsung/dmaengine.c13
-rw-r--r--sound/soc/samsung/goni_wm8994.c9
-rw-r--r--sound/soc/samsung/h1940_uda1380.c16
-rw-r--r--sound/soc/samsung/i2s.c24
-rw-r--r--sound/soc/samsung/i2s.h1
-rw-r--r--sound/soc/samsung/idma.c11
-rw-r--r--sound/soc/samsung/littlemill.c18
-rw-r--r--sound/soc/samsung/lowland.c18
-rw-r--r--sound/soc/samsung/neo1973_wm8753.c8
-rw-r--r--sound/soc/samsung/pcm.c21
-rw-r--r--sound/soc/samsung/rx1950_uda1380.c17
-rw-r--r--sound/soc/samsung/s3c-i2s-v2.c10
-rw-r--r--sound/soc/samsung/s3c2412-i2s.c21
-rw-r--r--sound/soc/samsung/s3c24xx-i2s.c25
-rw-r--r--sound/soc/samsung/s3c24xx_simtec_hermes.c8
-rw-r--r--sound/soc/samsung/s3c24xx_simtec_tlv320aic23.c8
-rw-r--r--sound/soc/samsung/smartq_wm8987.c13
-rw-r--r--sound/soc/samsung/smdk_wm8580.c8
-rw-r--r--sound/soc/samsung/smdk_wm8580pcm.c15
-rw-r--r--sound/soc/samsung/smdk_wm8994.c14
-rw-r--r--sound/soc/samsung/smdk_wm8994pcm.c15
-rw-r--r--sound/soc/samsung/snow.c123
-rw-r--r--sound/soc/samsung/spdif.c15
-rw-r--r--sound/soc/samsung/speyside.c18
-rw-r--r--sound/soc/samsung/tobermory.c18
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
64config SND_SOC_SAMSUNG_SMDK_WM8580 64config 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
116config SND_SOC_SAMSUNG_SIMTEC_TLV320AIC23 117config 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
123config SND_SOC_SAMSUNG_SIMTEC_HERMES 124config 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
130config SND_SOC_SAMSUNG_H1940_UDA1380 131config 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
138config SND_SOC_SAMSUNG_RX1950_UDA1380 139config 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
178config SND_SOC_SMDK_WM8580_PCM 179config 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
205config SND_SOC_TOBERMORY 207config 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
237config 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
34snd-soc-rx1950-uda1380-objs := rx1950_uda1380.o 34snd-soc-rx1950-uda1380-objs := rx1950_uda1380.o
35snd-soc-smdk-wm8580-objs := smdk_wm8580.o 35snd-soc-smdk-wm8580-objs := smdk_wm8580.o
36snd-soc-smdk-wm8994-objs := smdk_wm8994.o 36snd-soc-smdk-wm8994-objs := smdk_wm8994.o
37snd-soc-snow-objs := snow.o
37snd-soc-smdk-wm9713-objs := smdk_wm9713.o 38snd-soc-smdk-wm9713-objs := smdk_wm9713.o
38snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o 39snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o
39snd-soc-goni-wm8994-objs := goni_wm8994.o 40snd-soc-goni-wm8994-objs := goni_wm8994.o
@@ -58,6 +59,7 @@ obj-$(CONFIG_SND_SOC_SAMSUNG_H1940_UDA1380) += snd-soc-h1940-uda1380.o
58obj-$(CONFIG_SND_SOC_SAMSUNG_RX1950_UDA1380) += snd-soc-rx1950-uda1380.o 59obj-$(CONFIG_SND_SOC_SAMSUNG_RX1950_UDA1380) += snd-soc-rx1950-uda1380.o
59obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8580) += snd-soc-smdk-wm8580.o 60obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8580) += snd-soc-smdk-wm8580.o
60obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994) += snd-soc-smdk-wm8994.o 61obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994) += snd-soc-smdk-wm8994.o
62obj-$(CONFIG_SND_SOC_SNOW) += snd-soc-snow.o
61obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713) += snd-soc-smdk-wm9713.o 63obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713) += snd-soc-smdk-wm9713.o
62obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o 64obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o
63obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF) += snd-soc-smdk-spdif.o 65obj-$(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;
448err6:
449 snd_soc_unregister_component(&pdev->dev);
450err5: 448err5:
451 free_irq(irq_res->start, NULL); 449 free_irq(irq_res->start, NULL);
452err4: 450err4:
@@ -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
447static 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
454static struct platform_driver bells_driver = { 445static 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
464module_platform_driver(bells_driver); 454module_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
446int samsung_asoc_dma_platform_register(struct device *dev) 446int 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}
450EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); 450EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register);
451 451
452void samsung_asoc_dma_platform_unregister(struct device *dev)
453{
454 snd_soc_unregister_platform(dev);
455}
456EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_unregister);
457
458MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); 452MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
459MODULE_DESCRIPTION("Samsung ASoC DMA Driver"); 453MODULE_DESCRIPTION("Samsung ASoC DMA Driver");
460MODULE_LICENSE("GPL"); 454MODULE_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);
35int samsung_asoc_dma_platform_register(struct device *dev); 35int samsung_asoc_dma_platform_register(struct device *dev);
36void 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
67int samsung_asoc_dma_platform_register(struct device *dev) 67int 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}
73EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); 74EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register);
74 75
75void samsung_asoc_dma_platform_unregister(struct device *dev)
76{
77 return snd_dmaengine_pcm_unregister(dev);
78}
79EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_unregister);
80
81MODULE_AUTHOR("Mark Brown <broonie@linaro.org>"); 76MODULE_AUTHOR("Mark Brown <broonie@linaro.org>");
82MODULE_DESCRIPTION("Samsung dmaengine ASoC driver"); 77MODULE_DESCRIPTION("Samsung dmaengine ASoC driver");
83MODULE_LICENSE("GPL"); 78MODULE_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
295static void __exit goni_exit(void) 293static 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;
176static int h1940_uda1380_init(struct snd_soc_pcm_runtime *rtd) 176static 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
192static 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 */
198static struct snd_soc_dai_link h1940_uda1380_dai[] = { 201static struct snd_soc_dai_link h1940_uda1380_dai[] = {
199 { 202 {
@@ -211,6 +214,7 @@ static struct snd_soc_dai_link h1940_uda1380_dai[] = {
211static struct snd_soc_card h1940_asoc = { 214static 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:
262static void __exit h1940_exit(void) 266static 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
419static int asoc_idma_platform_remove(struct platform_device *pdev)
420{
421 snd_soc_unregister_platform(&pdev->dev);
422 return 0;
423} 417}
424 418
425static struct platform_driver asoc_idma_driver = { 419static 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
435module_platform_driver(asoc_idma_driver); 428module_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
317static 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
326static struct platform_driver littlemill_driver = { 315static 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
336module_platform_driver(littlemill_driver); 324module_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
200static 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
209static struct platform_driver lowland_driver = { 198static 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
219module_platform_driver(lowland_driver); 207module_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
272static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) 272static 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
360static struct platform_device *neo1973_snd_device; 354static 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
606err6:
607 snd_soc_unregister_component(&pdev->dev);
608err5: 606err5:
609 clk_disable_unprepare(pcm->pclk); 607 clk_disable_unprepare(pcm->pclk);
610 clk_put(pcm->pclk);
611err4: 608err4:
612 iounmap(pcm->regs); 609 iounmap(pcm->regs);
613err3: 610err3:
614 release_mem_region(mem_res->start, resource_size(mem_res)); 611 release_mem_region(mem_res->start, resource_size(mem_res));
615err2: 612err2:
616 clk_disable_unprepare(pcm->cclk); 613 clk_disable_unprepare(pcm->cclk);
617 clk_put(pcm->cclk);
618err1: 614err1:
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
33static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd); 33static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd);
34static int rx1950_uda1380_card_remove(struct snd_soc_card *card);
34static int rx1950_startup(struct snd_pcm_substream *substream); 35static int rx1950_startup(struct snd_pcm_substream *substream);
35static int rx1950_hw_params(struct snd_pcm_substream *substream, 36static 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[] = {
116static struct snd_soc_card rx1950_asoc = { 117static 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,
221static int rx1950_uda1380_init(struct snd_soc_pcm_runtime *rtd) 223static 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
239static 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
242static int __init rx1950_init(void) 247static int __init rx1950_init(void)
243{ 248{
244 int ret; 249 int ret;
@@ -283,8 +288,6 @@ err_gpio:
283static void __exit rx1950_exit(void) 288static 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}
750EXPORT_SYMBOL_GPL(s3c_i2sv2_register_component); 750EXPORT_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;
188err:
189 snd_soc_unregister_component(&pdev->dev);
190 return ret; 185 return ret;
191} 186}
192 187
193static 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
200static struct platform_driver s3c2412_iis_driver = { 188static 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;
492err:
493 snd_soc_unregister_component(&pdev->dev);
494 return ret; 489 return ret;
495} 490}
496 491
497static 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
504static struct platform_driver s3c24xx_iis_driver = { 492static 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*/
64static int simtec_hermes_init(struct snd_soc_pcm_runtime *rtd) 64static 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*/
53static int simtec_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) 53static 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
185static 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
187static struct snd_soc_dai_link smartq_dai[] = { 193static 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[] = {
200static struct snd_soc_card snd_soc_smartq = { 206static 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:
261static void __exit smartq_exit(void) 268static 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
176static int snd_smdk_remove(struct platform_device *pdev)
177{
178 snd_soc_unregister_card(&smdk_pcm);
179 return 0;
180} 172}
181 173
182static struct platform_driver snd_smdk_driver = { 174static 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
191module_platform_driver(snd_smdk_driver); 182module_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
146static int snd_smdk_remove(struct platform_device *pdev)
147{
148 snd_soc_unregister_card(&smdk_pcm);
149 return 0;
150} 142}
151 143
152static struct platform_driver snd_smdk_driver = { 144static 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
161module_platform_driver(snd_smdk_driver); 152module_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
25static 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
36static 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
57static 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
65static 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
104static const struct of_device_id snow_of_match[] = {
105 { .compatible = "google,snow-audio-max98090", },
106 { .compatible = "google,snow-audio-max98095", },
107 {},
108};
109
110static 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
120module_platform_driver(snow_driver);
121
122MODULE_DESCRIPTION("ALSA SoC Audio machine driver for Snow");
123MODULE_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;
451err5:
452 snd_soc_unregister_component(&pdev->dev);
453err4: 451err4:
454 iounmap(spdif->regs); 452 iounmap(spdif->regs);
455err3: 453err3:
@@ -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
340static 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
349static struct platform_driver speyside_driver = { 338static 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
359module_platform_driver(speyside_driver); 347module_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
236static 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
245static struct platform_driver tobermory_driver = { 234static 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
255module_platform_driver(tobermory_driver); 243module_platform_driver(tobermory_driver);