From mboxrd@z Thu Jan 1 00:00:00 1970 From: ben-linux@fluff.org (Ben Dooks) Date: Tue, 18 May 2010 06:24:19 +0100 Subject: [PATCH 1/9] ARM: S5PV210: Add audio platform devices In-Reply-To: <1274159414-19297-1-git-send-email-jassi.brar@samsung.com> References: <1274159402-19265-1-git-send-email-jassi.brar@samsung.com> <1274159414-19297-1-git-send-email-jassi.brar@samsung.com> Message-ID: <20100518052419.GM27571@trinity.fluff.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Tue, May 18, 2010 at 02:10:14PM +0900, Jassi Brar wrote: > Define platform devices for all audio devices found on S5PV210 > > Signed-off-by: Jassi Brar > --- > arch/arm/mach-s5pv210/Makefile | 4 + > arch/arm/mach-s5pv210/dev-audio.c | 334 +++++++++++++++++++++++++++++ > arch/arm/mach-s5pv210/include/mach/map.h | 13 ++ > arch/arm/plat-samsung/include/plat/devs.h | 8 + > 4 files changed, 359 insertions(+), 0 deletions(-) > create mode 100644 arch/arm/mach-s5pv210/dev-audio.c > > diff --git a/arch/arm/mach-s5pv210/Makefile b/arch/arm/mach-s5pv210/Makefile > index f7f1cdc..6ecfa9d 100644 > --- a/arch/arm/mach-s5pv210/Makefile > +++ b/arch/arm/mach-s5pv210/Makefile > @@ -18,3 +18,7 @@ obj-$(CONFIG_CPU_S5PV210) += cpu.o init.o clock.o dma.o > > obj-$(CONFIG_MACH_SMDKV210) += mach-smdkv210.o > obj-$(CONFIG_MACH_SMDKC110) += mach-smdkc110.o > + > +# device support > + > +obj-y += dev-audio.o > diff --git a/arch/arm/mach-s5pv210/dev-audio.c b/arch/arm/mach-s5pv210/dev-audio.c > new file mode 100644 > index 0000000..bdaa926 > --- /dev/null > +++ b/arch/arm/mach-s5pv210/dev-audio.c > @@ -0,0 +1,327 @@ > +/* linux/arch/arm/mach-s5pv210/dev-audio.c > + * > + * Copyright (c) 2010 Samsung Electronics Co. Ltd > + * Jaswinder Singh > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + */ > + > +#include > +#include > + > +#include > +#include > + > +#include > +#include > +#include > +#include > + > +static int s5pv210_cfg_i2s(struct platform_device *pdev) > +{ > + /* configure GPIO for i2s port */ > + switch (pdev->id) { > + case 1: > + s3c_gpio_cfgpin(S5PV210_GPC0(0), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC0(1), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC0(2), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC0(3), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC0(4), S3C_GPIO_SFN(2)); > + break; > + > + case 2: > + s3c_gpio_cfgpin(S5PV210_GPC1(0), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC1(1), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC1(2), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC1(3), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC1(4), S3C_GPIO_SFN(4)); > + break; > + > + case -1: > + s3c_gpio_cfgpin(S5PV210_GPI(0), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPI(1), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPI(2), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPI(3), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPI(4), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPI(5), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPI(6), S3C_GPIO_SFN(2)); > + break; > + > + default: > + printk(KERN_ERR "Invalid Device %d\n", pdev->id); > + return -EINVAL; > + } > + > + return 0; > +} > + > +static struct s3c_audio_pdata s3c_i2s_pdata = { > + .cfg_gpio = s5pv210_cfg_i2s, > +}; > + > +static struct resource s5pv210_iis0_resource[] = { > + [0] = { > + .start = S5PV210_PA_IIS0, > + .end = S5PV210_PA_IIS0 + 0x100 - 1, > + .flags = IORESOURCE_MEM, > + }, > + [1] = { > + .start = DMACH_I2S0_TX, > + .end = DMACH_I2S0_TX, > + .flags = IORESOURCE_DMA, > + }, > + [2] = { > + .start = DMACH_I2S0_RX, > + .end = DMACH_I2S0_RX, > + .flags = IORESOURCE_DMA, > + }, > +}; > + > +struct platform_device s5pv210_device_iis0 = { > + .name = "s3c64xx-iis-v4", > + .id = -1, > + .num_resources = ARRAY_SIZE(s5pv210_iis0_resource), > + .resource = s5pv210_iis0_resource, > + .dev = { > + .platform_data = &s3c_i2s_pdata, > + }, > +}; EXPORT_SYMBOL(s5pv210_device_iis0); do we really need to be exporting these devices like this, how much is needed otuside of machine support? > +static struct resource s5pv210_iis1_resource[] = { > + [0] = { > + .start = S5PV210_PA_IIS1, > + .end = S5PV210_PA_IIS1 + 0x100 - 1, > + .flags = IORESOURCE_MEM, > + }, > + [1] = { > + .start = DMACH_I2S1_TX, > + .end = DMACH_I2S1_TX, > + .flags = IORESOURCE_DMA, > + }, > + [2] = { > + .start = DMACH_I2S1_RX, > + .end = DMACH_I2S1_RX, > + .flags = IORESOURCE_DMA, > + }, > +}; > + > +struct platform_device s5pv210_device_iis1 = { > + .name = "s3c64xx-iis", > + .id = 1, > + .num_resources = ARRAY_SIZE(s5pv210_iis1_resource), > + .resource = s5pv210_iis1_resource, > + .dev = { > + .platform_data = &s3c_i2s_pdata, > + }, > +}; EXPORT_SYMBOL(s5pv210_device_iis1); > + > +static struct resource s5pv210_iis2_resource[] = { > + [0] = { > + .start = S5PV210_PA_IIS2, > + .end = S5PV210_PA_IIS2 + 0x100 - 1, > + .flags = IORESOURCE_MEM, > + }, > + [1] = { > + .start = DMACH_I2S2_TX, > + .end = DMACH_I2S2_TX, > + .flags = IORESOURCE_DMA, > + }, > + [2] = { > + .start = DMACH_I2S2_RX, > + .end = DMACH_I2S2_RX, > + .flags = IORESOURCE_DMA, > + }, > +}; > + > +struct platform_device s5pv210_device_iis2 = { > + .name = "s3c64xx-iis", > + .id = 2, > + .num_resources = ARRAY_SIZE(s5pv210_iis2_resource), > + .resource = s5pv210_iis2_resource, > + .dev = { > + .platform_data = &s3c_i2s_pdata, > + }, > +}; EXPORT_SYMBOL(s5pv210_device_iis2); > + > +/* PCM Controller platform_devices */ > + > +static int s5pv210_pcm_cfg_gpio(struct platform_device *pdev) > +{ > + switch (pdev->id) { > + case 0: > + s3c_gpio_cfgpin(S5PV210_GPI(0), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPI(1), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPI(2), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPI(3), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPI(4), S3C_GPIO_SFN(3)); > + break; > + case 1: > + s3c_gpio_cfgpin(S5PV210_GPC0(0), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPC0(1), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPC0(2), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPC0(3), S3C_GPIO_SFN(3)); > + s3c_gpio_cfgpin(S5PV210_GPC0(4), S3C_GPIO_SFN(3)); > + break; > + case 2: > + s3c_gpio_cfgpin(S5PV210_GPC1(0), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC1(1), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC1(2), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC1(3), S3C_GPIO_SFN(2)); > + s3c_gpio_cfgpin(S5PV210_GPC1(4), S3C_GPIO_SFN(2)); > + break; > + default: > + printk(KERN_DEBUG "Invalid PCM Controller number!"); > + return -EINVAL; > + } > + > + return 0; > +} > + > +static struct s3c_audio_pdata s3c_pcm_pdata = { > + .cfg_gpio = s5pv210_pcm_cfg_gpio, > +}; > + > +static struct resource s5pv210_pcm0_resource[] = { > + [0] = { > + .start = S5PV210_PA_PCM0, > + .end = S5PV210_PA_PCM0 + 0x100 - 1, > + .flags = IORESOURCE_MEM, > + }, > + [1] = { > + .start = DMACH_PCM0_TX, > + .end = DMACH_PCM0_TX, > + .flags = IORESOURCE_DMA, > + }, > + [2] = { > + .start = DMACH_PCM0_RX, > + .end = DMACH_PCM0_RX, > + .flags = IORESOURCE_DMA, > + }, > +}; > + > +struct platform_device s5pv210_device_pcm0 = { > + .name = "samsung-pcm", > + .id = 0, > + .num_resources = ARRAY_SIZE(s5pv210_pcm0_resource), > + .resource = s5pv210_pcm0_resource, > + .dev = { > + .platform_data = &s3c_pcm_pdata, > + }, > +}; EXPORT_SYMBOL(s5pv210_device_pcm0); > + > +static struct resource s5pv210_pcm1_resource[] = { > + [0] = { > + .start = S5PV210_PA_PCM1, > + .end = S5PV210_PA_PCM1 + 0x100 - 1, > + .flags = IORESOURCE_MEM, > + }, > + [1] = { > + .start = DMACH_PCM1_TX, > + .end = DMACH_PCM1_TX, > + .flags = IORESOURCE_DMA, > + }, > + [2] = { > + .start = DMACH_PCM1_RX, > + .end = DMACH_PCM1_RX, > + .flags = IORESOURCE_DMA, > + }, > +}; > + > +struct platform_device s5pv210_device_pcm1 = { > + .name = "samsung-pcm", > + .id = 1, > + .num_resources = ARRAY_SIZE(s5pv210_pcm1_resource), > + .resource = s5pv210_pcm1_resource, > + .dev = { > + .platform_data = &s3c_pcm_pdata, > + }, > +}; EXPORT_SYMBOL(s5pv210_device_pcm1); > + > +static struct resource s5pv210_pcm2_resource[] = { > + [0] = { > + .start = S5PV210_PA_PCM2, > + .end = S5PV210_PA_PCM2 + 0x100 - 1, > + .flags = IORESOURCE_MEM, > + }, > + [1] = { > + .start = DMACH_PCM2_TX, > + .end = DMACH_PCM2_TX, > + .flags = IORESOURCE_DMA, > + }, > + [2] = { > + .start = DMACH_PCM2_RX, > + .end = DMACH_PCM2_RX, > + .flags = IORESOURCE_DMA, > + }, > +}; > + > +struct platform_device s5pv210_device_pcm2 = { > + .name = "samsung-pcm", > + .id = 2, > + .num_resources = ARRAY_SIZE(s5pv210_pcm2_resource), > + .resource = s5pv210_pcm2_resource, > + .dev = { > + .platform_data = &s3c_pcm_pdata, > + }, > +}; EXPORT_SYMBOL(s5pv210_device_pcm2); > + > +/* AC97 Controller platform devices */ > + > +static int s5pv210_ac97_cfg_gpio(struct platform_device *pdev) > +{ > + s3c_gpio_cfgpin(S5PV210_GPC0(0), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC0(1), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC0(2), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC0(3), S3C_GPIO_SFN(4)); > + s3c_gpio_cfgpin(S5PV210_GPC0(4), S3C_GPIO_SFN(4)); > + > + return 0; > +} > + > +static struct resource s5pv210_ac97_resource[] = { > + [0] = { > + .start = S5PV210_PA_AC97, > + .end = S5PV210_PA_AC97 + 0x100 - 1, > + .flags = IORESOURCE_MEM, > + }, > + [1] = { > + .start = DMACH_AC97_PCMOUT, > + .end = DMACH_AC97_PCMOUT, > + .flags = IORESOURCE_DMA, > + }, > + [2] = { > + .start = DMACH_AC97_PCMIN, > + .end = DMACH_AC97_PCMIN, > + .flags = IORESOURCE_DMA, > + }, > + [3] = { > + .start = DMACH_AC97_MICIN, > + .end = DMACH_AC97_MICIN, > + .flags = IORESOURCE_DMA, > + }, > + [4] = { > + .start = IRQ_AC97, > + .end = IRQ_AC97, > + .flags = IORESOURCE_IRQ, > + }, > +}; > + > +static struct s3c_audio_pdata s3c_ac97_pdata = { > + .cfg_gpio = s5pv210_ac97_cfg_gpio, > +}; > + > +static u64 s5pv210_ac97_dmamask = DMA_BIT_MASK(32); > + > +struct platform_device s5pv210_device_ac97 = { > + .name = "s3c-ac97", > + .id = -1, > + .num_resources = ARRAY_SIZE(s5pv210_ac97_resource), > + .resource = s5pv210_ac97_resource, > + .dev = { > + .platform_data = &s3c_ac97_pdata, > + .dma_mask = &s5pv210_ac97_dmamask, > + .coherent_dma_mask = DMA_BIT_MASK(32), > + }, > +}; EXPORT_SYMBOL(s5pv210_device_ac97); > diff --git a/arch/arm/mach-s5pv210/include/mach/map.h b/arch/arm/mach-s5pv210/include/mach/map.h > index c038585..5adcb9f 100644 > --- a/arch/arm/mach-s5pv210/include/mach/map.h > +++ b/arch/arm/mach-s5pv210/include/mach/map.h > @@ -62,6 +62,19 @@ > #define S5PV210_PA_SDRAM (0x20000000) > #define S5P_PA_SDRAM S5PV210_PA_SDRAM > > +/* I2S */ > +#define S5PV210_PA_IIS0 0xEEE30000 > +#define S5PV210_PA_IIS1 0xE2100000 > +#define S5PV210_PA_IIS2 0xE2A00000 > + > +/* PCM */ > +#define S5PV210_PA_PCM0 0xE2300000 > +#define S5PV210_PA_PCM1 0xE1200000 > +#define S5PV210_PA_PCM2 0xE2B00000 > + > +/* AC97 */ > +#define S5PV210_PA_AC97 0xE2200000 > + > /* compatibiltiy defines. */ > #define S3C_PA_UART S5PV210_PA_UART > #define S3C_PA_IIC S5PV210_PA_IIC0 > diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h > index 796d242..d8fda3a 100644 > --- a/arch/arm/plat-samsung/include/plat/devs.h > +++ b/arch/arm/plat-samsung/include/plat/devs.h > @@ -64,6 +64,14 @@ extern struct platform_device s3c_device_nand; > extern struct platform_device s3c_device_usbgadget; > extern struct platform_device s3c_device_usb_hsotg; > > +extern struct platform_device s5pv210_device_ac97; > +extern struct platform_device s5pv210_device_pcm0; > +extern struct platform_device s5pv210_device_pcm1; > +extern struct platform_device s5pv210_device_pcm2; > +extern struct platform_device s5pv210_device_iis0; > +extern struct platform_device s5pv210_device_iis1; > +extern struct platform_device s5pv210_device_iis2; > + > /* s3c2440 specific devices */ > > #ifdef CONFIG_CPU_S3C2440 > -- > 1.6.2.5 > -- -- Ben Q: What's a light-year? A: One-third less calories than a regular year.