* [PATCH 4/4] ARM: S5PV310: Add audio platform devices
@ 2010-10-19 7:15 Jassi Brar
2010-10-20 8:35 ` Kukjin Kim
0 siblings, 1 reply; 3+ messages in thread
From: Jassi Brar @ 2010-10-19 7:15 UTC (permalink / raw)
To: linux-arm-kernel
From: Jassi Brar <jassi.brar@samsung.com>
Define platform devices for all audio devices found on S5PV310
Signed-off-by: Jassi Brar <jassi.brar@samsung.com>
---
arch/arm/mach-s5pv310/Makefile | 1 +
arch/arm/mach-s5pv310/dev-audio.c | 356 +++++++++++++++++++++++++++++++++++++
2 files changed, 357 insertions(+), 0 deletions(-)
create mode 100644 arch/arm/mach-s5pv310/dev-audio.c
diff --git a/arch/arm/mach-s5pv310/Makefile b/arch/arm/mach-s5pv310/Makefile
index d5b51c7..b511650 100644
--- a/arch/arm/mach-s5pv310/Makefile
+++ b/arch/arm/mach-s5pv310/Makefile
@@ -26,5 +26,6 @@ obj-$(CONFIG_MACH_UNIVERSAL_C210) += mach-universal_c210.o
# device support
+obj-y += dev-audio.o
obj-$(CONFIG_S5PV310_SETUP_I2C1) += setup-i2c1.o
obj-$(CONFIG_S5PV310_SETUP_I2C2) += setup-i2c2.o
diff --git a/arch/arm/mach-s5pv310/dev-audio.c b/arch/arm/mach-s5pv310/dev-audio.c
new file mode 100644
index 0000000..ebb9f73
--- /dev/null
+++ b/arch/arm/mach-s5pv310/dev-audio.c
@@ -0,0 +1,356 @@
+/* linux/arch/arm/mach-s5pv310/dev-audio.c
+ *
+ * Copyright (c) 2010 Samsung Electronics Co. Ltd
+ * Jaswinder Singh <jassi.brar@samsung.com>
+ *
+ * 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 <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/gpio.h>
+
+#include <plat/gpio-cfg.h>
+#include <plat/audio.h>
+
+#include <mach/map.h>
+#include <mach/dma.h>
+#include <mach/irqs.h>
+
+static const char *rclksrc_v5[] = {
+ [0] = "busclk",
+ [1] = "i2sclk",
+};
+
+static int s5pv310_cfg_i2s(struct platform_device *pdev)
+{
+ /* configure GPIO for i2s port */
+ switch (pdev->id) {
+ case 0:
+ s3c_gpio_cfgpin(S5PV310_GPZ(0), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPZ(1), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPZ(2), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPZ(3), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPZ(4), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPZ(5), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPZ(6), S3C_GPIO_SFN(2));
+ break;
+ case 1:
+ s3c_gpio_cfgpin(S5PV310_GPC0(0), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPC0(1), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPC0(2), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPC0(3), S3C_GPIO_SFN(2));
+ s3c_gpio_cfgpin(S5PV310_GPC0(4), S3C_GPIO_SFN(2));
+ break;
+ case 2:
+ s3c_gpio_cfgpin(S5PV310_GPC1(0), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC1(1), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC1(2), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC1(3), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC1(4), S3C_GPIO_SFN(4));
+ break;
+ default:
+ printk(KERN_ERR "Invalid Device %d\n", pdev->id);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static struct s3c_audio_pdata i2sv5_pdata = {
+ .cfg_gpio = s5pv310_cfg_i2s,
+ .type = {
+ .i2s = {
+ .quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI
+ | QUIRK_NEED_RSTCLR,
+ .src_clk = rclksrc_v5,
+ },
+ },
+};
+
+static struct resource s5pv310_iis0_resource[] = {
+ [0] = {
+ .start = S5PV310_PA_IIS0,
+ .end = S5PV310_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,
+ },
+ [3] = {
+ .start = DMACH_I2S0S_TX,
+ .end = DMACH_I2S0S_TX,
+ .flags = IORESOURCE_DMA,
+ },
+};
+
+struct platform_device s5pv310_device_iis0 = {
+ .name = "samsung-i2s",
+ .id = 0,
+ .num_resources = ARRAY_SIZE(s5pv310_iis0_resource),
+ .resource = s5pv310_iis0_resource,
+ .dev = {
+ .platform_data = &i2sv5_pdata,
+ },
+};
+
+static const char *rclksrc_v3[] = {
+ [0] = "sclk_i2s",
+ [1] = "no_such_clock",
+};
+
+static struct s3c_audio_pdata i2sv3_pdata = {
+ .cfg_gpio = s5pv310_cfg_i2s,
+ .type = {
+ .i2s = {
+ .quirks = QUIRK_NO_MUXPSR,
+ .src_clk = rclksrc_v3,
+ },
+ },
+};
+
+static struct resource s5pv310_iis1_resource[] = {
+ [0] = {
+ .start = S5PV310_PA_IIS1,
+ .end = S5PV310_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 s5pv310_device_iis1 = {
+ .name = "samsung-i2s",
+ .id = 1,
+ .num_resources = ARRAY_SIZE(s5pv310_iis1_resource),
+ .resource = s5pv310_iis1_resource,
+ .dev = {
+ .platform_data = &i2sv3_pdata,
+ },
+};
+
+static struct resource s5pv310_iis2_resource[] = {
+ [0] = {
+ .start = S5PV310_PA_IIS2,
+ .end = S5PV310_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 s5pv310_device_iis2 = {
+ .name = "samsung-i2s",
+ .id = 2,
+ .num_resources = ARRAY_SIZE(s5pv310_iis2_resource),
+ .resource = s5pv310_iis2_resource,
+ .dev = {
+ .platform_data = &i2sv3_pdata,
+ },
+};
+
+/* PCM Controller platform_devices */
+
+static int s5pv310_pcm_cfg_gpio(struct platform_device *pdev)
+{
+ switch (pdev->id) {
+ case 0:
+ s3c_gpio_cfgpin(S5PV310_GPZ(0), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPZ(1), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPZ(2), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPZ(3), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPZ(4), S3C_GPIO_SFN(3));
+ break;
+ case 1:
+ s3c_gpio_cfgpin(S5PV310_GPC0(0), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC0(1), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC0(2), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC0(3), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC0(4), S3C_GPIO_SFN(3));
+ break;
+ case 2:
+ s3c_gpio_cfgpin(S5PV310_GPC1(0), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC1(1), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC1(2), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC1(3), S3C_GPIO_SFN(3));
+ s3c_gpio_cfgpin(S5PV310_GPC1(4), S3C_GPIO_SFN(3));
+ break;
+ default:
+ printk(KERN_DEBUG "Invalid PCM Controller number!");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static struct s3c_audio_pdata s3c_pcm_pdata = {
+ .cfg_gpio = s5pv310_pcm_cfg_gpio,
+};
+
+static struct resource s5pv310_pcm0_resource[] = {
+ [0] = {
+ .start = S5PV310_PA_PCM0,
+ .end = S5PV310_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 s5pv310_device_pcm0 = {
+ .name = "samsung-pcm",
+ .id = 0,
+ .num_resources = ARRAY_SIZE(s5pv310_pcm0_resource),
+ .resource = s5pv310_pcm0_resource,
+ .dev = {
+ .platform_data = &s3c_pcm_pdata,
+ },
+};
+
+static struct resource s5pv310_pcm1_resource[] = {
+ [0] = {
+ .start = S5PV310_PA_PCM1,
+ .end = S5PV310_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 s5pv310_device_pcm1 = {
+ .name = "samsung-pcm",
+ .id = 1,
+ .num_resources = ARRAY_SIZE(s5pv310_pcm1_resource),
+ .resource = s5pv310_pcm1_resource,
+ .dev = {
+ .platform_data = &s3c_pcm_pdata,
+ },
+};
+
+static struct resource s5pv310_pcm2_resource[] = {
+ [0] = {
+ .start = S5PV310_PA_PCM2,
+ .end = S5PV310_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 s5pv310_device_pcm2 = {
+ .name = "samsung-pcm",
+ .id = 2,
+ .num_resources = ARRAY_SIZE(s5pv310_pcm2_resource),
+ .resource = s5pv310_pcm2_resource,
+ .dev = {
+ .platform_data = &s3c_pcm_pdata,
+ },
+};
+
+/* AC97 Controller platform devices */
+
+static int s5pv310_ac97_cfg_gpio(struct platform_device *pdev)
+{
+ s3c_gpio_cfgpin(S5PV310_GPC0(0), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC0(1), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC0(2), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC0(3), S3C_GPIO_SFN(4));
+ s3c_gpio_cfgpin(S5PV310_GPC0(4), S3C_GPIO_SFN(4));
+
+ return 0;
+}
+
+static struct resource s5pv310_ac97_resource[] = {
+ [0] = {
+ .start = S5PV310_PA_AC97,
+ .end = S5PV310_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 = s5pv310_ac97_cfg_gpio,
+};
+
+static u64 s5pv310_ac97_dmamask = DMA_BIT_MASK(32);
+
+struct platform_device s5pv310_device_ac97 = {
+ .name = "samsung-ac97",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(s5pv310_ac97_resource),
+ .resource = s5pv310_ac97_resource,
+ .dev = {
+ .platform_data = &s3c_ac97_pdata,
+ .dma_mask = &s5pv310_ac97_dmamask,
+ .coherent_dma_mask = DMA_BIT_MASK(32),
+ },
+};
--
1.6.2.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 4/4] ARM: S5PV310: Add audio platform devices
2010-10-19 7:15 [PATCH 4/4] ARM: S5PV310: Add audio platform devices Jassi Brar
@ 2010-10-20 8:35 ` Kukjin Kim
2010-10-20 9:13 ` Jassi Brar
0 siblings, 1 reply; 3+ messages in thread
From: Kukjin Kim @ 2010-10-20 8:35 UTC (permalink / raw)
To: linux-arm-kernel
Jassi Brar wrote:
>
> From: Jassi Brar <jassi.brar@samsung.com>
>
> Define platform devices for all audio devices found on S5PV310
>
> Signed-off-by: Jassi Brar <jassi.brar@samsung.com>
> ---
> arch/arm/mach-s5pv310/Makefile | 1 +
> arch/arm/mach-s5pv310/dev-audio.c | 356
> +++++++++++++++++++++++++++++++++++++
> 2 files changed, 357 insertions(+), 0 deletions(-)
> create mode 100644 arch/arm/mach-s5pv310/dev-audio.c
>
(snip)
> +static int s5pv310_cfg_i2s(struct platform_device *pdev)
> +{
> + /* configure GPIO for i2s port */
> + switch (pdev->id) {
> + case 0:
> + s3c_gpio_cfgpin(S5PV310_GPZ(0), S3C_GPIO_SFN(2));
> + s3c_gpio_cfgpin(S5PV310_GPZ(1), S3C_GPIO_SFN(2));
> + s3c_gpio_cfgpin(S5PV310_GPZ(2), S3C_GPIO_SFN(2));
> + s3c_gpio_cfgpin(S5PV310_GPZ(3), S3C_GPIO_SFN(2));
> + s3c_gpio_cfgpin(S5PV310_GPZ(4), S3C_GPIO_SFN(2));
> + s3c_gpio_cfgpin(S5PV310_GPZ(5), S3C_GPIO_SFN(2));
> + s3c_gpio_cfgpin(S5PV310_GPZ(6), S3C_GPIO_SFN(2));
s3c_gpio_cfgpin_range(S5PV310_GPZ(0), 7, S3C_GPIO_SFN(2));
(snip)
> +
> +static struct resource s5pv310_iis0_resource[] = {
> + [0] = {
> + .start = S5PV310_PA_IIS0,
^
> + .end = S5PV310_PA_IIS0 + 0x100 - 1,
^^^
> + .flags = IORESOURCE_MEM,
^
It would be better if you could use tab above like following.
.start = S5PV310_PA_IIS0,
.end = S5PV310_PA_IIS0 + 0x100 - 1,
.flags = IORESOURCE_MEM,
(snip)
> +
> +struct platform_device s5pv310_device_iis0 = {
> + .name = "samsung-i2s",
> + .id = 0,
> + .num_resources = ARRAY_SIZE(s5pv310_iis0_resource),
> + .resource = s5pv310_iis0_resource,
> + .dev = {
> + .platform_data = &i2sv5_pdata,
> + },
> +};
> +
I'm thinking about the name of IIS/I2S...Hmm...
(snip)
Thanks.
Best regards,
Kgene.
--
Kukjin Kim <kgene.kim@samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 4/4] ARM: S5PV310: Add audio platform devices
2010-10-20 8:35 ` Kukjin Kim
@ 2010-10-20 9:13 ` Jassi Brar
0 siblings, 0 replies; 3+ messages in thread
From: Jassi Brar @ 2010-10-20 9:13 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Oct 20, 2010 at 5:35 PM, Kukjin Kim <kgene.kim@samsung.com> wrote:
>> + ? ? /* configure GPIO for i2s port */
>> + ? ? switch (pdev->id) {
>> + ? ? case 0:
>> + ? ? ? ? ? ? s3c_gpio_cfgpin(S5PV310_GPZ(0), S3C_GPIO_SFN(2));
>> + ? ? ? ? ? ? s3c_gpio_cfgpin(S5PV310_GPZ(1), S3C_GPIO_SFN(2));
>> + ? ? ? ? ? ? s3c_gpio_cfgpin(S5PV310_GPZ(2), S3C_GPIO_SFN(2));
>> + ? ? ? ? ? ? s3c_gpio_cfgpin(S5PV310_GPZ(3), S3C_GPIO_SFN(2));
>> + ? ? ? ? ? ? s3c_gpio_cfgpin(S5PV310_GPZ(4), S3C_GPIO_SFN(2));
>> + ? ? ? ? ? ? s3c_gpio_cfgpin(S5PV310_GPZ(5), S3C_GPIO_SFN(2));
>> + ? ? ? ? ? ? s3c_gpio_cfgpin(S5PV310_GPZ(6), S3C_GPIO_SFN(2));
>
> s3c_gpio_cfgpin_range(S5PV310_GPZ(0), 7, S3C_GPIO_SFN(2));
OK
>> +static struct resource s5pv310_iis0_resource[] = {
>> + ? ? [0] = {
>> + ? ? ? ? ? ? .start = S5PV310_PA_IIS0,
> ? ? ? ? ? ? ? ? ? ? ?^
>> + ? ? ? ? ? ? .end ? = S5PV310_PA_IIS0 + 0x100 - 1,
> ? ? ? ? ? ? ? ? ? ?^^^
>> + ? ? ? ? ? ? .flags = IORESOURCE_MEM,
> ? ? ? ? ? ? ? ? ? ? ?^
>
> It would be better if you could use tab above like following.
OK
>> +
>> +struct platform_device s5pv310_device_iis0 = {
>> + ? ? .name ? ? ? ? ? ? = "samsung-i2s",
>> + ? ? .id ? ? ? ? ? ? ? = 0,
>> + ? ? .num_resources ? ?= ARRAY_SIZE(s5pv310_iis0_resource),
>> + ? ? .resource ? ? ? ? = s5pv310_iis0_resource,
>> + ? ? .dev = {
>> + ? ? ? ? ? ? .platform_data = &i2sv5_pdata,
>> + ? ? },
>> +};
>> +
>
> I'm thinking about the name of IIS/I2S...Hmm...
I2S is more popular, but our manuals use both I2S and IIS.
IIS is present in code mostly due to historical reason.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-10-20 9:13 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-19 7:15 [PATCH 4/4] ARM: S5PV310: Add audio platform devices Jassi Brar
2010-10-20 8:35 ` Kukjin Kim
2010-10-20 9:13 ` Jassi Brar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).