Merge tag 'char-misc-3.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[linux-2.6-block.git] / arch / arm / mach-s5p64x0 / dev-audio.c
CommitLineData
e661faa4
KK
1/* linux/arch/arm/mach-s5p64x0/dev-audio.c
2 *
3 * Copyright (c) 2010 Samsung Electronics Co. Ltd
4 * Jaswinder Singh <jassi.brar@samsung.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9*/
10
11#include <linux/platform_device.h>
12#include <linux/dma-mapping.h>
13#include <linux/gpio.h>
14
15#include <plat/gpio-cfg.h>
16#include <plat/audio.h>
17
18#include <mach/map.h>
19#include <mach/dma.h>
20#include <mach/irqs.h>
21
d9a93c34
JB
22static const char *rclksrc[] = {
23 [0] = "iis",
24 [1] = "sclk_audio2",
25};
26
e0b9c88b 27static int s5p6440_cfg_i2s(struct platform_device *pdev)
e661faa4 28{
e661faa4 29 switch (pdev->id) {
d9a93c34 30 case 0:
e0b9c88b
RS
31 s3c_gpio_cfgpin_range(S5P6440_GPC(4), 2, S3C_GPIO_SFN(5));
32 s3c_gpio_cfgpin(S5P6440_GPC(7), S3C_GPIO_SFN(5));
33 s3c_gpio_cfgpin_range(S5P6440_GPH(6), 4, S3C_GPIO_SFN(5));
e661faa4 34 break;
e661faa4
KK
35 default:
36 printk(KERN_ERR "Invalid Device %d\n", pdev->id);
37 return -EINVAL;
38 }
39
40 return 0;
41}
42
e0b9c88b
RS
43static struct s3c_audio_pdata s5p6440_i2s_pdata = {
44 .cfg_gpio = s5p6440_cfg_i2s,
d9a93c34
JB
45 .type = {
46 .i2s = {
47 .quirks = QUIRK_PRI_6CHAN,
48 .src_clk = rclksrc,
49 },
50 },
e661faa4
KK
51};
52
e0b9c88b 53static struct resource s5p64x0_i2s0_resource[] = {
5e9cf656
TB
54 [0] = DEFINE_RES_MEM(S5P64X0_PA_I2S, SZ_256),
55 [1] = DEFINE_RES_DMA(DMACH_I2S0_TX),
56 [2] = DEFINE_RES_DMA(DMACH_I2S0_RX),
e661faa4
KK
57};
58
59struct platform_device s5p6440_device_iis = {
d9a93c34
JB
60 .name = "samsung-i2s",
61 .id = 0,
e0b9c88b
RS
62 .num_resources = ARRAY_SIZE(s5p64x0_i2s0_resource),
63 .resource = s5p64x0_i2s0_resource,
e661faa4 64 .dev = {
e0b9c88b
RS
65 .platform_data = &s5p6440_i2s_pdata,
66 },
67};
68
69static int s5p6450_cfg_i2s(struct platform_device *pdev)
70{
71 switch (pdev->id) {
72 case 0:
73 s3c_gpio_cfgpin_range(S5P6450_GPR(4), 5, S3C_GPIO_SFN(5));
74 s3c_gpio_cfgpin_range(S5P6450_GPR(13), 2, S3C_GPIO_SFN(5));
75 break;
76 case 1:
77 s3c_gpio_cfgpin(S5P6440_GPB(4), S3C_GPIO_SFN(5));
78 s3c_gpio_cfgpin_range(S5P6450_GPC(0), 4, S3C_GPIO_SFN(5));
79 break;
80 case 2:
81 s3c_gpio_cfgpin_range(S5P6450_GPK(0), 5, S3C_GPIO_SFN(5));
82 break;
83 default:
84 printk(KERN_ERR "Invalid Device %d\n", pdev->id);
85 return -EINVAL;
86 }
87
88 return 0;
89}
90
91static struct s3c_audio_pdata s5p6450_i2s0_pdata = {
92 .cfg_gpio = s5p6450_cfg_i2s,
93 .type = {
94 .i2s = {
95 .quirks = QUIRK_PRI_6CHAN,
96 .src_clk = rclksrc,
97 },
e661faa4
KK
98 },
99};
100
101struct platform_device s5p6450_device_iis0 = {
d9a93c34
JB
102 .name = "samsung-i2s",
103 .id = 0,
e0b9c88b
RS
104 .num_resources = ARRAY_SIZE(s5p64x0_i2s0_resource),
105 .resource = s5p64x0_i2s0_resource,
106 .dev = {
107 .platform_data = &s5p6450_i2s0_pdata,
108 },
109};
110
111static struct s3c_audio_pdata s5p6450_i2s_pdata = {
112 .cfg_gpio = s5p6450_cfg_i2s,
113 .type = {
114 .i2s = {
115 .src_clk = rclksrc,
116 },
117 },
118};
119
120static struct resource s5p6450_i2s1_resource[] = {
5e9cf656
TB
121 [0] = DEFINE_RES_MEM(S5P6450_PA_I2S1, SZ_256),
122 [1] = DEFINE_RES_DMA(DMACH_I2S1_TX),
123 [2] = DEFINE_RES_DMA(DMACH_I2S1_RX),
e0b9c88b
RS
124};
125
126struct platform_device s5p6450_device_iis1 = {
127 .name = "samsung-i2s",
128 .id = 1,
129 .num_resources = ARRAY_SIZE(s5p6450_i2s1_resource),
130 .resource = s5p6450_i2s1_resource,
131 .dev = {
132 .platform_data = &s5p6450_i2s_pdata,
133 },
134};
135
136static struct resource s5p6450_i2s2_resource[] = {
5e9cf656
TB
137 [0] = DEFINE_RES_MEM(S5P6450_PA_I2S2, SZ_256),
138 [1] = DEFINE_RES_DMA(DMACH_I2S2_TX),
139 [2] = DEFINE_RES_DMA(DMACH_I2S2_RX),
e0b9c88b
RS
140};
141
142struct platform_device s5p6450_device_iis2 = {
143 .name = "samsung-i2s",
144 .id = 2,
145 .num_resources = ARRAY_SIZE(s5p6450_i2s2_resource),
146 .resource = s5p6450_i2s2_resource,
e661faa4 147 .dev = {
e0b9c88b 148 .platform_data = &s5p6450_i2s_pdata,
e661faa4
KK
149 },
150};
151
152/* PCM Controller platform_devices */
153
154static int s5p6440_pcm_cfg_gpio(struct platform_device *pdev)
155{
156 switch (pdev->id) {
157 case 0:
af94e577
BD
158 s3c_gpio_cfgpin_range(S5P6440_GPR(6), 3, S3C_GPIO_SFN(2));
159 s3c_gpio_cfgpin_range(S5P6440_GPR(13), 2, S3C_GPIO_SFN(2));
e661faa4
KK
160 break;
161
162 default:
163 printk(KERN_DEBUG "Invalid PCM Controller number!");
164 return -EINVAL;
165 }
166
167 return 0;
168}
169
170static struct s3c_audio_pdata s5p6440_pcm_pdata = {
171 .cfg_gpio = s5p6440_pcm_cfg_gpio,
172};
173
174static struct resource s5p6440_pcm0_resource[] = {
5e9cf656
TB
175 [0] = DEFINE_RES_MEM(S5P64X0_PA_PCM, SZ_256),
176 [1] = DEFINE_RES_DMA(DMACH_PCM0_TX),
177 [2] = DEFINE_RES_DMA(DMACH_PCM0_RX),
e661faa4
KK
178};
179
180struct platform_device s5p6440_device_pcm = {
181 .name = "samsung-pcm",
182 .id = 0,
183 .num_resources = ARRAY_SIZE(s5p6440_pcm0_resource),
184 .resource = s5p6440_pcm0_resource,
185 .dev = {
186 .platform_data = &s5p6440_pcm_pdata,
187 },
188};