aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorLiam Girdwood <lrg@slimlogic.co.uk>2010-03-17 16:15:21 -0400
committerLiam Girdwood <lrg@slimlogic.co.uk>2010-08-12 09:00:00 -0400
commitf0fba2ad1b6b53d5360125c41953b7afcd6deff0 (patch)
treef6ad50905f8daa616593c978d7ae992e73241180 /arch
parentbda7d2a862e6b788bca2d02d38a07966a9c92e48 (diff)
ASoC: multi-component - ASoC Multi-Component Support
This patch extends the ASoC API to allow sound cards to have more than one CODEC and more than one platform DMA controller. This is achieved by dividing some current ASoC structures that contain both driver data and device data into structures that only either contain device data or driver data. i.e. struct snd_soc_codec ---> struct snd_soc_codec (device data) +-> struct snd_soc_codec_driver (driver data) struct snd_soc_platform ---> struct snd_soc_platform (device data) +-> struct snd_soc_platform_driver (driver data) struct snd_soc_dai ---> struct snd_soc_dai (device data) +-> struct snd_soc_dai_driver (driver data) struct snd_soc_device ---> deleted This now allows ASoC to be more tightly aligned with the Linux driver model and also means that every ASoC codec, platform and (platform) DAI is a kernel device. ASoC component private data is now stored as device private data. The ASoC sound card struct snd_soc_card has also been updated to store lists of it's components rather than a pointer to a codec and platform. The PCM runtime struct soc_pcm_runtime now has pointers to all its components. This patch adds DAPM support for ASoC multi-component and removes struct snd_soc_socdev from DAPM core. All DAPM calls are now made on a card, codec or runtime PCM level basis rather than using snd_soc_socdev. Other notable multi-component changes:- * Stream operations now de-reference less structures. * close_delayed work() now runs on a DAI basis rather than looping all DAIs in a card. * PM suspend()/resume() operations can now handle N CODECs and Platforms per sound card. * Added soc_bind_dai_link() to bind the component devices to the sound card. * Added soc_dai_link_probe() and soc_dai_link_remove() to probe and remove DAI link components. * sysfs entries can now be registered per component per card. * snd_soc_new_pcms() functionailty rolled into dai_link_probe(). * snd_soc_register_codec() now does all the codec list and mutex init. This patch changes the probe() and remove() of the CODEC drivers as follows:- o Make CODEC driver a platform driver o Moved all struct snd_soc_codec list, mutex, etc initialiasation to core. o Removed all static codec pointers (drivers now support > 1 codec dev) o snd_soc_register_pcms() now done by core. o snd_soc_register_dai() folded into snd_soc_register_codec(). CS4270 portions: Acked-by: Timur Tabi <timur@freescale.com> Some TLV320aic23 and Cirrus platform fixes. Signed-off-by: Ryan Mallon <ryan@bluewatersys.com> TI CODEC and OMAP fixes Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com> Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> Signed-off-by: Jarkko Nikula <jhnikula@gmail.com> Samsung platform and misc fixes :- Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Reviewed-by: Jassi Brar <jassi.brar@samsung.com> Signed-off-by: Seungwhan Youn <sw.youn@samsung.com> MPC8610 and PPC fixes. Signed-off-by: Timur Tabi <timur@freescale.com> i.MX fixes and some core fixes. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> J4740 platform fixes:- Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> CC: Tony Lindgren <tony@atomide.com> CC: Nicolas Ferre <nicolas.ferre@atmel.com> CC: Kevin Hilman <khilman@deeprootsystems.com> CC: Sascha Hauer <s.hauer@pengutronix.de> CC: Atsushi Nemoto <anemo@mba.ocn.ne.jp> CC: Kuninori Morimoto <morimoto.kuninori@renesas.com> CC: Daniel Gloeckner <dg@emlix.com> CC: Manuel Lauss <mano@roarinelk.homelinux.net> CC: Mike Frysinger <vapier.adi@gmail.com> CC: Arnaud Patard <apatard@mandriva.com> CC: Wan ZongShun <mcuos.com@gmail.com> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-davinci/devices.c13
-rw-r--r--arch/arm/mach-ep93xx/core.c6
-rw-r--r--arch/arm/mach-kirkwood/common.c6
-rw-r--r--arch/arm/mach-mx2/clock_imx27.c4
-rw-r--r--arch/arm/mach-mx2/devices.c2
-rw-r--r--arch/arm/mach-mx3/clock-imx31.c4
-rw-r--r--arch/arm/mach-mx3/clock-imx35.c4
-rw-r--r--arch/arm/mach-mx3/devices.c4
-rw-r--r--arch/arm/mach-omap1/devices.c26
-rw-r--r--arch/arm/mach-omap2/board-n8x0.c15
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c14
-rw-r--r--arch/arm/mach-omap2/board-zoom2.c28
-rw-r--r--arch/arm/mach-omap2/devices.c39
-rw-r--r--arch/arm/mach-omap2/include/mach/board-zoom.h2
-rw-r--r--arch/arm/mach-pxa/devices.c25
-rw-r--r--arch/arm/mach-pxa/devices.h6
-rw-r--r--arch/arm/mach-pxa/pxa27x.c4
-rw-r--r--arch/arm/mach-pxa/pxa3xx.c5
-rw-r--r--arch/arm/mach-pxa/zylonite.c11
-rw-r--r--arch/arm/mach-s3c64xx/dev-audio.c13
-rw-r--r--arch/arm/mach-s3c64xx/mach-smdk6410.c1
-rw-r--r--arch/arm/plat-mxc/audmux-v2.c4
-rw-r--r--arch/arm/plat-omap/include/plat/mcbsp.h7
-rw-r--r--arch/arm/plat-s3c24xx/devs.c30
-rw-r--r--arch/arm/plat-samsung/include/plat/devs.h2
25 files changed, 258 insertions, 17 deletions
diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index 8b7201e4c79c..de40e9c787e1 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -295,6 +295,18 @@ static void davinci_init_wdt(void)
295 295
296/*-------------------------------------------------------------------------*/ 296/*-------------------------------------------------------------------------*/
297 297
298struct platform_device davinci_pcm_device = {
299 .name = "davinci-pcm-audio",
300 .id = -1,
301};
302
303static void davinci_init_pcm(void)
304{
305 platform_device_register(&davinci_pcm_device);
306}
307
308/*-------------------------------------------------------------------------*/
309
298struct davinci_timer_instance davinci_timer_instance[2] = { 310struct davinci_timer_instance davinci_timer_instance[2] = {
299 { 311 {
300 .base = DAVINCI_TIMER0_BASE, 312 .base = DAVINCI_TIMER0_BASE,
@@ -315,6 +327,7 @@ static int __init davinci_init_devices(void)
315 /* please keep these calls, and their implementations above, 327 /* please keep these calls, and their implementations above,
316 * in alphabetical order so they're easier to sort through. 328 * in alphabetical order so they're easier to sort through.
317 */ 329 */
330 davinci_init_pcm();
318 davinci_init_wdt(); 331 davinci_init_wdt();
319 332
320 return 0; 333 return 0;
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c
index b4ee5409eb72..b5261d44b263 100644
--- a/arch/arm/mach-ep93xx/core.c
+++ b/arch/arm/mach-ep93xx/core.c
@@ -732,9 +732,15 @@ static struct platform_device ep93xx_i2s_device = {
732 .resource = ep93xx_i2s_resource, 732 .resource = ep93xx_i2s_resource,
733}; 733};
734 734
735static struct platform_device ep93xx_pcm_device = {
736 .name = "ep93xx-pcm-audio",
737 .id = -1,
738};
739
735void __init ep93xx_register_i2s(void) 740void __init ep93xx_register_i2s(void)
736{ 741{
737 platform_device_register(&ep93xx_i2s_device); 742 platform_device_register(&ep93xx_i2s_device);
743 platform_device_register(&ep93xx_pcm_device);
738} 744}
739 745
740#define EP93XX_SYSCON_DEVCFG_I2S_MASK (EP93XX_SYSCON_DEVCFG_I2SONSSP | \ 746#define EP93XX_SYSCON_DEVCFG_I2S_MASK (EP93XX_SYSCON_DEVCFG_I2SONSSP | \
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
index e1f3efedbcf1..07690132cdbf 100644
--- a/arch/arm/mach-kirkwood/common.c
+++ b/arch/arm/mach-kirkwood/common.c
@@ -896,10 +896,16 @@ static struct platform_device kirkwood_i2s_device = {
896 }, 896 },
897}; 897};
898 898
899static struct platform_device kirkwood_pcm_device = {
900 .name = "kirkwood-pcm",
901 .id = -1,
902};
903
899void __init kirkwood_audio_init(void) 904void __init kirkwood_audio_init(void)
900{ 905{
901 kirkwood_clk_ctrl |= CGC_AUDIO; 906 kirkwood_clk_ctrl |= CGC_AUDIO;
902 platform_device_register(&kirkwood_i2s_device); 907 platform_device_register(&kirkwood_i2s_device);
908 platform_device_register(&kirkwood_pcm_device);
903} 909}
904 910
905/***************************************************************************** 911/*****************************************************************************
diff --git a/arch/arm/mach-mx2/clock_imx27.c b/arch/arm/mach-mx2/clock_imx27.c
index 0f0823c8b170..379de9c59332 100644
--- a/arch/arm/mach-mx2/clock_imx27.c
+++ b/arch/arm/mach-mx2/clock_imx27.c
@@ -653,8 +653,8 @@ static struct clk_lookup lookups[] = {
653 _REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_clk1) 653 _REGISTER_CLOCK("mxc-ehci.1", "usb_ahb", usb_clk1)
654 _REGISTER_CLOCK("mxc-ehci.2", "usb", usb_clk) 654 _REGISTER_CLOCK("mxc-ehci.2", "usb", usb_clk)
655 _REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_clk1) 655 _REGISTER_CLOCK("mxc-ehci.2", "usb_ahb", usb_clk1)
656 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) 656 _REGISTER_CLOCK("imx-ssi-dai.0", NULL, ssi1_clk)
657 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) 657 _REGISTER_CLOCK("imx-ssi-dai.1", NULL, ssi2_clk)
658 _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) 658 _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk)
659 _REGISTER_CLOCK(NULL, "vpu", vpu_clk) 659 _REGISTER_CLOCK(NULL, "vpu", vpu_clk)
660 _REGISTER_CLOCK(NULL, "dma", dma_clk) 660 _REGISTER_CLOCK(NULL, "dma", dma_clk)
diff --git a/arch/arm/mach-mx2/devices.c b/arch/arm/mach-mx2/devices.c
index a0aeb8a4adc1..2354d67a10db 100644
--- a/arch/arm/mach-mx2/devices.c
+++ b/arch/arm/mach-mx2/devices.c
@@ -415,7 +415,7 @@ struct platform_device mxc_usbh2 = {
415 }; \ 415 }; \
416 \ 416 \
417 struct platform_device imx_ssi_device ## n = { \ 417 struct platform_device imx_ssi_device ## n = { \
418 .name = "imx-ssi", \ 418 .name = "imx-ssi-dai", \
419 .id = n, \ 419 .id = n, \
420 .num_resources = ARRAY_SIZE(imx_ssi_resources ## n), \ 420 .num_resources = ARRAY_SIZE(imx_ssi_resources ## n), \
421 .resource = imx_ssi_resources ## n, \ 421 .resource = imx_ssi_resources ## n, \
diff --git a/arch/arm/mach-mx3/clock-imx31.c b/arch/arm/mach-mx3/clock-imx31.c
index 9a9eb6de6127..9b52a67abf2d 100644
--- a/arch/arm/mach-mx3/clock-imx31.c
+++ b/arch/arm/mach-mx3/clock-imx31.c
@@ -558,8 +558,8 @@ static struct clk_lookup lookups[] = {
558 _REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk) 558 _REGISTER_CLOCK("mxc_w1.0", NULL, owire_clk)
559 _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk) 559 _REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk)
560 _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk) 560 _REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk)
561 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) 561 _REGISTER_CLOCK("imx-ssi-dai.0", NULL, ssi1_clk)
562 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) 562 _REGISTER_CLOCK("imx-ssi-dai.1", NULL, ssi2_clk)
563 _REGISTER_CLOCK(NULL, "firi", firi_clk) 563 _REGISTER_CLOCK(NULL, "firi", firi_clk)
564 _REGISTER_CLOCK(NULL, "ata", ata_clk) 564 _REGISTER_CLOCK(NULL, "ata", ata_clk)
565 _REGISTER_CLOCK(NULL, "rtic", rtic_clk) 565 _REGISTER_CLOCK(NULL, "rtic", rtic_clk)
diff --git a/arch/arm/mach-mx3/clock-imx35.c b/arch/arm/mach-mx3/clock-imx35.c
index 9f3e943e2232..7b5acd5aa7c1 100644
--- a/arch/arm/mach-mx3/clock-imx35.c
+++ b/arch/arm/mach-mx3/clock-imx35.c
@@ -464,8 +464,8 @@ static struct clk_lookup lookups[] = {
464 _REGISTER_CLOCK(NULL, "sdma", sdma_clk) 464 _REGISTER_CLOCK(NULL, "sdma", sdma_clk)
465 _REGISTER_CLOCK(NULL, "spba", spba_clk) 465 _REGISTER_CLOCK(NULL, "spba", spba_clk)
466 _REGISTER_CLOCK(NULL, "spdif", spdif_clk) 466 _REGISTER_CLOCK(NULL, "spdif", spdif_clk)
467 _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk) 467 _REGISTER_CLOCK("imx-ssi-dai.0", NULL, ssi1_clk)
468 _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk) 468 _REGISTER_CLOCK("imx-ssi-dai.1", NULL, ssi2_clk)
469 _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk) 469 _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
470 _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk) 470 _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
471 _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk) 471 _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
diff --git a/arch/arm/mach-mx3/devices.c b/arch/arm/mach-mx3/devices.c
index db7acd6e9101..27cfc39106a8 100644
--- a/arch/arm/mach-mx3/devices.c
+++ b/arch/arm/mach-mx3/devices.c
@@ -562,14 +562,14 @@ static struct resource imx_ssi_resources1[] = {
562}; 562};
563 563
564struct platform_device imx_ssi_device0 = { 564struct platform_device imx_ssi_device0 = {
565 .name = "imx-ssi", 565 .name = "imx-ssi-dai",
566 .id = 0, 566 .id = 0,
567 .num_resources = ARRAY_SIZE(imx_ssi_resources0), 567 .num_resources = ARRAY_SIZE(imx_ssi_resources0),
568 .resource = imx_ssi_resources0, 568 .resource = imx_ssi_resources0,
569}; 569};
570 570
571struct platform_device imx_ssi_device1 = { 571struct platform_device imx_ssi_device1 = {
572 .name = "imx-ssi", 572 .name = "imx-ssi-dai",
573 .id = 1, 573 .id = 1,
574 .num_resources = ARRAY_SIZE(imx_ssi_resources1), 574 .num_resources = ARRAY_SIZE(imx_ssi_resources1),
575 .resource = imx_ssi_resources1, 575 .resource = imx_ssi_resources1,
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c
index 379100c17639..eb98eb8d3731 100644
--- a/arch/arm/mach-omap1/devices.c
+++ b/arch/arm/mach-omap1/devices.c
@@ -25,6 +25,7 @@
25#include <mach/gpio.h> 25#include <mach/gpio.h>
26#include <plat/mmc.h> 26#include <plat/mmc.h>
27#include <plat/omap7xx.h> 27#include <plat/omap7xx.h>
28#include <plat/mcbsp.h>
28 29
29/*-------------------------------------------------------------------------*/ 30/*-------------------------------------------------------------------------*/
30 31
@@ -267,6 +268,30 @@ static inline void omap_init_sti(void)
267static inline void omap_init_sti(void) {} 268static inline void omap_init_sti(void) {}
268#endif 269#endif
269 270
271#if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
272
273static struct platform_device omap_pcm = {
274 .name = "omap-pcm-audio",
275 .id = -1,
276};
277
278OMAP_MCBSP_PLATFORM_DEVICE(1);
279OMAP_MCBSP_PLATFORM_DEVICE(2);
280OMAP_MCBSP_PLATFORM_DEVICE(3);
281
282static void omap_init_audio(void)
283{
284 platform_device_register(&omap_mcbsp1);
285 platform_device_register(&omap_mcbsp2);
286 if (!cpu_is_omap7xx())
287 platform_device_register(&omap_mcbsp3);
288 platform_device_register(&omap_pcm);
289}
290
291#else
292static inline void omap_init_audio(void) {}
293#endif
294
270/*-------------------------------------------------------------------------*/ 295/*-------------------------------------------------------------------------*/
271 296
272/* 297/*
@@ -299,6 +324,7 @@ static int __init omap1_init_devices(void)
299 omap_init_rtc(); 324 omap_init_rtc();
300 omap_init_spi100k(); 325 omap_init_spi100k();
301 omap_init_sti(); 326 omap_init_sti();
327 omap_init_audio();
302 328
303 return 0; 329 return 0;
304} 330}
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c
index 3ccc34ebdcc7..04df912a7b55 100644
--- a/arch/arm/mach-omap2/board-n8x0.c
+++ b/arch/arm/mach-omap2/board-n8x0.c
@@ -20,6 +20,7 @@
20#include <linux/i2c.h> 20#include <linux/i2c.h>
21#include <linux/spi/spi.h> 21#include <linux/spi/spi.h>
22#include <linux/usb/musb.h> 22#include <linux/usb/musb.h>
23#include <sound/tlv320aic3x.h>
23 24
24#include <asm/mach/arch.h> 25#include <asm/mach/arch.h>
25#include <asm/mach-types.h> 26#include <asm/mach-types.h>
@@ -612,11 +613,25 @@ static int n8x0_menelaus_late_init(struct device *dev)
612 return 0; 613 return 0;
613} 614}
614 615
616static struct aic3x_setup_data n810_aic33_setup = {
617 .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED,
618 .gpio_func[1] = AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT,
619};
620
621static struct aic3x_pdata n810_aic33_data = {
622 .setup = &n810_aic33_setup,
623 .gpio_reset = -1,
624};
625
615static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] = { 626static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] = {
616 { 627 {
617 I2C_BOARD_INFO("menelaus", 0x72), 628 I2C_BOARD_INFO("menelaus", 0x72),
618 .irq = INT_24XX_SYS_NIRQ, 629 .irq = INT_24XX_SYS_NIRQ,
619 }, 630 },
631 {
632 I2C_BOARD_INFO("tlv320aic3x", 0x1b),
633 .platform_data = &n810_aic33_data,
634 },
620}; 635};
621 636
622static struct menelaus_platform_data n8x0_menelaus_platform_data = { 637static struct menelaus_platform_data n8x0_menelaus_platform_data = {
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index abdf321c2d41..28978c08bced 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -23,6 +23,7 @@
23#include <linux/gpio.h> 23#include <linux/gpio.h>
24#include <linux/gpio_keys.h> 24#include <linux/gpio_keys.h>
25#include <linux/mmc/host.h> 25#include <linux/mmc/host.h>
26#include <sound/tlv320aic3x.h>
26 27
27#include <plat/mcspi.h> 28#include <plat/mcspi.h>
28#include <plat/mux.h> 29#include <plat/mux.h>
@@ -686,7 +687,6 @@ static struct twl4030_power_data rx51_t2scripts_data __initdata = {
686}; 687};
687 688
688 689
689
690static struct twl4030_platform_data rx51_twldata __initdata = { 690static struct twl4030_platform_data rx51_twldata __initdata = {
691 .irq_base = TWL4030_IRQ_BASE, 691 .irq_base = TWL4030_IRQ_BASE,
692 .irq_end = TWL4030_IRQ_END, 692 .irq_end = TWL4030_IRQ_END,
@@ -716,9 +716,21 @@ static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_1[] = {
716 }, 716 },
717}; 717};
718 718
719/* Audio setup data */
720static struct aic3x_setup_data rx51_aic34_setup = {
721 .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED,
722 .gpio_func[1] = AIC3X_GPIO2_FUNC_DIGITAL_MIC_INPUT,
723};
724
725static struct aic3x_pdata rx51_aic34_data = {
726 .setup = &rx51_aic34_setup,
727 .gpio_reset = 60,
728};
729
719static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_2[] = { 730static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_2[] = {
720 { 731 {
721 I2C_BOARD_INFO("tlv320aic3x", 0x18), 732 I2C_BOARD_INFO("tlv320aic3x", 0x18),
733 .platform_data = &rx51_aic34_data,
722 }, 734 },
723}; 735};
724 736
diff --git a/arch/arm/mach-omap2/board-zoom2.c b/arch/arm/mach-omap2/board-zoom2.c
index 803ef14cbf2d..410fe006c0f6 100644
--- a/arch/arm/mach-omap2/board-zoom2.c
+++ b/arch/arm/mach-omap2/board-zoom2.c
@@ -14,6 +14,7 @@
14#include <linux/platform_device.h> 14#include <linux/platform_device.h>
15#include <linux/input.h> 15#include <linux/input.h>
16#include <linux/gpio.h> 16#include <linux/gpio.h>
17#include <linux/i2c/twl.h>
17 18
18#include <asm/mach-types.h> 19#include <asm/mach-types.h>
19#include <asm/mach/arch.h> 20#include <asm/mach/arch.h>
@@ -34,8 +35,11 @@ static void __init omap_zoom2_init_irq(void)
34 omap_gpio_init(); 35 omap_gpio_init();
35} 36}
36 37
37/* REVISIT: These audio entries can be removed once MFD code is merged */ 38/* EXTMUTE callback function */
38#if 0 39void zoom2_set_hs_extmute(int mute)
40{
41 gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute);
42}
39 43
40static struct twl4030_madc_platform_data zoom2_madc_data = { 44static struct twl4030_madc_platform_data zoom2_madc_data = {
41 .irq_line = 1, 45 .irq_line = 1,
@@ -43,6 +47,9 @@ static struct twl4030_madc_platform_data zoom2_madc_data = {
43 47
44static struct twl4030_codec_audio_data zoom2_audio_data = { 48static struct twl4030_codec_audio_data zoom2_audio_data = {
45 .audio_mclk = 26000000, 49 .audio_mclk = 26000000,
50 .ramp_delay_value = 3, /* 161 ms */
51 .hs_extmute = 1,
52 .set_hs_extmute = zoom2_set_hs_extmute,
46}; 53};
47 54
48static struct twl4030_codec_data zoom2_codec_data = { 55static struct twl4030_codec_data zoom2_codec_data = {
@@ -64,10 +71,24 @@ static struct twl4030_platform_data zoom2_twldata = {
64 .vmmc1 = &zoom2_vmmc1, 71 .vmmc1 = &zoom2_vmmc1,
65 .vmmc2 = &zoom2_vmmc2, 72 .vmmc2 = &zoom2_vmmc2,
66 .vsim = &zoom2_vsim, 73 .vsim = &zoom2_vsim,
74};
67 75
76static struct i2c_board_info __initdata zoom2_i2c_boardinfo[] = {
77 {
78 I2C_BOARD_INFO("twl4030", 0x48),
79 .flags = I2C_CLIENT_WAKE,
80 .irq = INT_34XX_SYS_NIRQ,
81 .platform_data = &zoom2_twldata,
82 },
68}; 83};
69 84
70#endif 85static int __init omap3_zoom2_i2c_init(void)
86{
87 omap_register_i2c_bus(1, 2600, zoom2_i2c_boardinfo,
88 ARRAY_SIZE(zoom2_i2c_boardinfo));
89 return 0;
90}
91
71 92
72#ifdef CONFIG_OMAP_MUX 93#ifdef CONFIG_OMAP_MUX
73static struct omap_board_mux board_mux[] __initdata = { 94static struct omap_board_mux board_mux[] __initdata = {
@@ -81,6 +102,7 @@ static void __init omap_zoom2_init(void)
81{ 102{
82 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 103 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
83 zoom_peripherals_init(); 104 zoom_peripherals_init();
105 omap3_zoom2_i2c_init();
84 zoom_debugboard_init(); 106 zoom_debugboard_init();
85} 107}
86 108
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 03e6c9ed82a4..f9a5961d23a7 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -29,6 +29,7 @@
29#include <mach/gpio.h> 29#include <mach/gpio.h>
30#include <plat/mmc.h> 30#include <plat/mmc.h>
31#include <plat/dma.h> 31#include <plat/dma.h>
32#include <plat/mcbsp.h>
32 33
33#include "mux.h" 34#include "mux.h"
34 35
@@ -289,6 +290,43 @@ static inline void omap_init_sti(void)
289static inline void omap_init_sti(void) {} 290static inline void omap_init_sti(void) {}
290#endif 291#endif
291 292
293#if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
294
295static struct platform_device omap_pcm = {
296 .name = "omap-pcm-audio",
297 .id = -1,
298};
299
300/*
301 * OMAP2420 has 2 McBSP ports
302 * OMAP2430 has 5 McBSP ports
303 * OMAP3 has 5 McBSP ports
304 * OMAP4 has 4 McBSP ports
305 */
306OMAP_MCBSP_PLATFORM_DEVICE(1);
307OMAP_MCBSP_PLATFORM_DEVICE(2);
308OMAP_MCBSP_PLATFORM_DEVICE(3);
309OMAP_MCBSP_PLATFORM_DEVICE(4);
310OMAP_MCBSP_PLATFORM_DEVICE(5);
311
312static void omap_init_audio(void)
313{
314 platform_device_register(&omap_mcbsp1);
315 platform_device_register(&omap_mcbsp2);
316 if (cpu_is_omap243x() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
317 platform_device_register(&omap_mcbsp3);
318 platform_device_register(&omap_mcbsp4);
319 }
320 if (cpu_is_omap243x() || cpu_is_omap34xx())
321 platform_device_register(&omap_mcbsp5);
322
323 platform_device_register(&omap_pcm);
324}
325
326#else
327static inline void omap_init_audio(void) {}
328#endif
329
292#if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) 330#if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
293 331
294#include <plat/mcspi.h> 332#include <plat/mcspi.h>
@@ -901,6 +939,7 @@ static int __init omap2_init_devices(void)
901 * in alphabetical order so they're easier to sort through. 939 * in alphabetical order so they're easier to sort through.
902 */ 940 */
903 omap_hsmmc_reset(); 941 omap_hsmmc_reset();
942 omap_init_audio();
904 omap_init_camera(); 943 omap_init_camera();
905 omap_init_mbox(); 944 omap_init_mbox();
906 omap_init_mcspi(); 945 omap_init_mcspi();
diff --git a/arch/arm/mach-omap2/include/mach/board-zoom.h b/arch/arm/mach-omap2/include/mach/board-zoom.h
index c93b29e21b78..b6a010fc8bda 100644
--- a/arch/arm/mach-omap2/include/mach/board-zoom.h
+++ b/arch/arm/mach-omap2/include/mach/board-zoom.h
@@ -3,3 +3,5 @@
3 */ 3 */
4extern int __init zoom_debugboard_init(void); 4extern int __init zoom_debugboard_init(void);
5extern void __init zoom_peripherals_init(void); 5extern void __init zoom_peripherals_init(void);
6
7#define ZOOM2_HEADSET_EXTMUTE_GPIO 153
diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c
index 8e10db148f1b..200c31a2730e 100644
--- a/arch/arm/mach-pxa/devices.c
+++ b/arch/arm/mach-pxa/devices.c
@@ -340,6 +340,31 @@ struct platform_device pxa_device_i2s = {
340 .num_resources = ARRAY_SIZE(pxai2s_resources), 340 .num_resources = ARRAY_SIZE(pxai2s_resources),
341}; 341};
342 342
343struct platform_device pxa_device_asoc_ssp1 = {
344 .name = "pxa-ssp-dai",
345 .id = 0,
346};
347
348struct platform_device pxa_device_asoc_ssp2= {
349 .name = "pxa-ssp-dai",
350 .id = 1,
351};
352
353struct platform_device pxa_device_asoc_ssp3 = {
354 .name = "pxa-ssp-dai",
355 .id = 2,
356};
357
358struct platform_device pxa_device_asoc_ssp4 = {
359 .name = "pxa-ssp-dai",
360 .id = 3,
361};
362
363struct platform_device pxa_device_asoc_platform = {
364 .name = "pxa-pcm-audio",
365 .id = -1,
366};
367
343static u64 pxaficp_dmamask = ~(u32)0; 368static u64 pxaficp_dmamask = ~(u32)0;
344 369
345struct platform_device pxa_device_ficp = { 370struct platform_device pxa_device_ficp = {
diff --git a/arch/arm/mach-pxa/devices.h b/arch/arm/mach-pxa/devices.h
index 93817d99761e..506fd5753ccc 100644
--- a/arch/arm/mach-pxa/devices.h
+++ b/arch/arm/mach-pxa/devices.h
@@ -37,4 +37,10 @@ extern struct platform_device pxa3xx_device_i2c_power;
37 37
38extern struct platform_device pxa3xx_device_gcu; 38extern struct platform_device pxa3xx_device_gcu;
39 39
40extern struct platform_device pxa_device_asoc_platform;
41extern struct platform_device pxa_device_asoc_ssp1;
42extern struct platform_device pxa_device_asoc_ssp2;
43extern struct platform_device pxa_device_asoc_ssp3;
44extern struct platform_device pxa_device_asoc_ssp4;
45
40void __init pxa_register_device(struct platform_device *dev, void *data); 46void __init pxa_register_device(struct platform_device *dev, void *data);
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
index 0af36177ff08..465008293a25 100644
--- a/arch/arm/mach-pxa/pxa27x.c
+++ b/arch/arm/mach-pxa/pxa27x.c
@@ -384,6 +384,10 @@ void __init pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info)
384static struct platform_device *devices[] __initdata = { 384static struct platform_device *devices[] __initdata = {
385 &pxa27x_device_udc, 385 &pxa27x_device_udc,
386 &pxa_device_i2s, 386 &pxa_device_i2s,
387 &pxa_device_asoc_ssp1,
388 &pxa_device_asoc_ssp2,
389 &pxa_device_asoc_ssp3,
390 &pxa_device_asoc_platform,
387 &sa1100_device_rtc, 391 &sa1100_device_rtc,
388 &pxa_device_rtc, 392 &pxa_device_rtc,
389 &pxa27x_device_ssp1, 393 &pxa27x_device_ssp1,
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c
index f544e58e1536..f7a3b158ca97 100644
--- a/arch/arm/mach-pxa/pxa3xx.c
+++ b/arch/arm/mach-pxa/pxa3xx.c
@@ -597,6 +597,11 @@ void __init pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info)
597static struct platform_device *devices[] __initdata = { 597static struct platform_device *devices[] __initdata = {
598 &pxa27x_device_udc, 598 &pxa27x_device_udc,
599 &pxa_device_i2s, 599 &pxa_device_i2s,
600 &pxa_device_asoc_ssp1,
601 &pxa_device_asoc_ssp2,
602 &pxa_device_asoc_ssp3,
603 &pxa_device_asoc_ssp4,
604 &pxa_device_asoc_platform,
600 &sa1100_device_rtc, 605 &sa1100_device_rtc,
601 &pxa_device_rtc, 606 &pxa_device_rtc,
602 &pxa27x_device_ssp1, 607 &pxa27x_device_ssp1,
diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c
index c479cbecf784..5ba9d99a1bf6 100644
--- a/arch/arm/mach-pxa/zylonite.c
+++ b/arch/arm/mach-pxa/zylonite.c
@@ -45,6 +45,16 @@ int wm9713_irq;
45int lcd_id; 45int lcd_id;
46int lcd_orientation; 46int lcd_orientation;
47 47
48struct platform_device pxa_device_wm9713_audio = {
49 .name = "wm9713-codec",
50 .id = -1,
51};
52
53static void __init zylonite_init_wm9713_audio(void)
54{
55 platform_device_register(&pxa_device_wm9713_audio);
56}
57
48static struct resource smc91x_resources[] = { 58static struct resource smc91x_resources[] = {
49 [0] = { 59 [0] = {
50 .start = ZYLONITE_ETH_PHYS + 0x300, 60 .start = ZYLONITE_ETH_PHYS + 0x300,
@@ -408,6 +418,7 @@ static void __init zylonite_init(void)
408 zylonite_init_nand(); 418 zylonite_init_nand();
409 zylonite_init_leds(); 419 zylonite_init_leds();
410 zylonite_init_ohci(); 420 zylonite_init_ohci();
421 zylonite_init_wm9713_audio();
411} 422}
412 423
413MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)") 424MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)")
diff --git a/arch/arm/mach-s3c64xx/dev-audio.c b/arch/arm/mach-s3c64xx/dev-audio.c
index c3e9e73bd0f9..55ae1b0afae9 100644
--- a/arch/arm/mach-s3c64xx/dev-audio.c
+++ b/arch/arm/mach-s3c64xx/dev-audio.c
@@ -333,3 +333,16 @@ void __init s3c64xx_ac97_setup_gpio(int num)
333 else 333 else
334 s3c_ac97_pdata.cfg_gpio = s3c64xx_ac97_cfg_gpe; 334 s3c_ac97_pdata.cfg_gpio = s3c64xx_ac97_cfg_gpe;
335} 335}
336
337static u64 s3c_device_audio_dmamask = 0xffffffffUL;
338
339struct platform_device s3c_device_pcm = {
340 .name = "s3c24xx-pcm-audio",
341 .id = -1,
342 .dev = {
343 .dma_mask = &s3c_device_audio_dmamask,
344 .coherent_dma_mask = 0xffffffffUL
345 }
346};
347EXPORT_SYMBOL(s3c_device_pcm);
348
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index d9a03555f88b..362fc76ee726 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -256,6 +256,7 @@ static struct platform_device *smdk6410_devices[] __initdata = {
256 &s3c_device_fb, 256 &s3c_device_fb,
257 &s3c_device_ohci, 257 &s3c_device_ohci,
258 &s3c_device_usb_hsotg, 258 &s3c_device_usb_hsotg,
259 &s3c_device_pcm,
259 &s3c64xx_device_iisv4, 260 &s3c64xx_device_iisv4,
260 261
261#ifdef CONFIG_REGULATOR 262#ifdef CONFIG_REGULATOR
diff --git a/arch/arm/plat-mxc/audmux-v2.c b/arch/arm/plat-mxc/audmux-v2.c
index 0c2cc5cd4d83..7c479e4fa999 100644
--- a/arch/arm/plat-mxc/audmux-v2.c
+++ b/arch/arm/plat-mxc/audmux-v2.c
@@ -49,9 +49,9 @@ static const char *audmux_port_string(int port)
49{ 49{
50 switch (port) { 50 switch (port) {
51 case MX31_AUDMUX_PORT1_SSI0: 51 case MX31_AUDMUX_PORT1_SSI0:
52 return "imx-ssi.0"; 52 return "imx-ssi-dai.0";
53 case MX31_AUDMUX_PORT2_SSI1: 53 case MX31_AUDMUX_PORT2_SSI1:
54 return "imx-ssi.1"; 54 return "imx-ssi-dai.1";
55 case MX31_AUDMUX_PORT3_SSI_PINS_3: 55 case MX31_AUDMUX_PORT3_SSI_PINS_3:
56 return "SSI3"; 56 return "SSI3";
57 case MX31_AUDMUX_PORT4_SSI_PINS_4: 57 case MX31_AUDMUX_PORT4_SSI_PINS_4:
diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
index b4ff6a11a8f2..5b20103e68eb 100644
--- a/arch/arm/plat-omap/include/plat/mcbsp.h
+++ b/arch/arm/plat-omap/include/plat/mcbsp.h
@@ -30,6 +30,13 @@
30#include <mach/hardware.h> 30#include <mach/hardware.h>
31#include <plat/clock.h> 31#include <plat/clock.h>
32 32
33/* macro for building platform_device for McBSP ports */
34#define OMAP_MCBSP_PLATFORM_DEVICE(port_nr) \
35static struct platform_device omap_mcbsp##port_nr = { \
36 .name = "omap-mcbsp-dai", \
37 .id = OMAP_MCBSP##port_nr, \
38}
39
33#define OMAP7XX_MCBSP1_BASE 0xfffb1000 40#define OMAP7XX_MCBSP1_BASE 0xfffb1000
34#define OMAP7XX_MCBSP2_BASE 0xfffb1800 41#define OMAP7XX_MCBSP2_BASE 0xfffb1800
35 42
diff --git a/arch/arm/plat-s3c24xx/devs.c b/arch/arm/plat-s3c24xx/devs.c
index 452e18438b41..9f8ee5e38615 100644
--- a/arch/arm/plat-s3c24xx/devs.c
+++ b/arch/arm/plat-s3c24xx/devs.c
@@ -481,7 +481,7 @@ static struct resource s3c_ac97_resource[] = {
481 }, 481 },
482}; 482};
483 483
484static u64 s3c_device_ac97_dmamask = 0xffffffffUL; 484static u64 s3c_device_audio_dmamask = 0xffffffffUL;
485 485
486struct platform_device s3c_device_ac97 = { 486struct platform_device s3c_device_ac97 = {
487 .name = "s3c-ac97", 487 .name = "s3c-ac97",
@@ -489,11 +489,37 @@ struct platform_device s3c_device_ac97 = {
489 .num_resources = ARRAY_SIZE(s3c_ac97_resource), 489 .num_resources = ARRAY_SIZE(s3c_ac97_resource),
490 .resource = s3c_ac97_resource, 490 .resource = s3c_ac97_resource,
491 .dev = { 491 .dev = {
492 .dma_mask = &s3c_device_ac97_dmamask, 492 .dma_mask = &s3c_device_audio_dmamask,
493 .coherent_dma_mask = 0xffffffffUL 493 .coherent_dma_mask = 0xffffffffUL
494 } 494 }
495}; 495};
496 496
497EXPORT_SYMBOL(s3c_device_ac97); 497EXPORT_SYMBOL(s3c_device_ac97);
498 498
499/* ASoC PCM DMA */
500
501struct platform_device s3c_device_pcm = {
502 .name = "s3c24xx-pcm-audio",
503 .id = -1,
504 .dev = {
505 .dma_mask = &s3c_device_audio_dmamask,
506 .coherent_dma_mask = 0xffffffffUL
507 }
508};
509
510EXPORT_SYMBOL(s3c_device_pcm);
511
512/* ASoC I2S */
513
514struct platform_device s3c2412_device_iis = {
515 .name = "s3c2412-iis",
516 .id = -1,
517 .dev = {
518 .dma_mask = &s3c_device_audio_dmamask,
519 .coherent_dma_mask = 0xffffffffUL
520 }
521};
522
523EXPORT_SYMBOL(s3c2412_device_iis);
524
499#endif // CONFIG_CPU_S32440 525#endif // CONFIG_CPU_S32440
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h
index e6144e4b9118..9ea6786d459d 100644
--- a/arch/arm/plat-samsung/include/plat/devs.h
+++ b/arch/arm/plat-samsung/include/plat/devs.h
@@ -32,6 +32,8 @@ extern struct platform_device s3c64xx_device_iisv4;
32extern struct platform_device s3c64xx_device_spi0; 32extern struct platform_device s3c64xx_device_spi0;
33extern struct platform_device s3c64xx_device_spi1; 33extern struct platform_device s3c64xx_device_spi1;
34 34
35extern struct platform_device s3c_device_pcm;
36
35extern struct platform_device s3c64xx_device_pcm0; 37extern struct platform_device s3c64xx_device_pcm0;
36extern struct platform_device s3c64xx_device_pcm1; 38extern struct platform_device s3c64xx_device_pcm1;
37 39