upload tizen1.0 source
[kernel/linux-2.6.36.git] / arch / arm / mach-s5pv310 / dev-audio.c
1 /* linux/arch/arm/mach-s5pv310/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
14 #include <plat/gpio-cfg.h>
15 #include <plat/audio.h>
16
17 #include <mach/gpio.h>
18 #include <mach/map.h>
19 #include <mach/dma.h>
20 #include <mach/irqs.h>
21
22 static int s5pv310_cfg_i2s(struct platform_device *pdev)
23 {
24         /* configure GPIO for i2s port */
25         switch (pdev->id) {
26         case 1:
27                 s3c_gpio_cfgpin(S5PV310_GPC0(0), S3C_GPIO_SFN(2));
28                 s3c_gpio_cfgpin(S5PV310_GPC0(1), S3C_GPIO_SFN(2));
29                 s3c_gpio_cfgpin(S5PV310_GPC0(2), S3C_GPIO_SFN(2));
30                 s3c_gpio_cfgpin(S5PV310_GPC0(3), S3C_GPIO_SFN(2));
31                 s3c_gpio_cfgpin(S5PV310_GPC0(4), S3C_GPIO_SFN(2));
32                 break;
33         case 2:
34                 s3c_gpio_cfgpin(S5PV310_GPC1(0), S3C_GPIO_SFN(2));
35                 s3c_gpio_cfgpin(S5PV310_GPC1(1), S3C_GPIO_SFN(2));
36                 s3c_gpio_cfgpin(S5PV310_GPC1(2), S3C_GPIO_SFN(2));
37                 s3c_gpio_cfgpin(S5PV310_GPC1(3), S3C_GPIO_SFN(2));
38                 s3c_gpio_cfgpin(S5PV310_GPC1(4), S3C_GPIO_SFN(2));
39                 break;
40         case -1:
41                 s3c_gpio_cfgpin(S5PV310_GPZ(0), S3C_GPIO_SFN(2));
42 #ifdef USE_FULL_AUDIO_PINS
43                 s3c_gpio_cfgpin(S5PV310_GPZ(1), S3C_GPIO_SFN(2));
44 #endif
45                 s3c_gpio_cfgpin(S5PV310_GPZ(2), S3C_GPIO_SFN(2));
46                 s3c_gpio_cfgpin(S5PV310_GPZ(3), S3C_GPIO_SFN(2));
47                 s3c_gpio_cfgpin(S5PV310_GPZ(4), S3C_GPIO_SFN(2));
48 #ifdef USE_FULL_AUDIO_PINS
49                 s3c_gpio_cfgpin(S5PV310_GPZ(5), S3C_GPIO_SFN(2));
50                 s3c_gpio_cfgpin(S5PV310_GPZ(6), S3C_GPIO_SFN(2));
51 #endif
52                 break;
53
54         default:
55                 printk(KERN_ERR "Invalid Device %d\n", pdev->id);
56                 return -EINVAL;
57         }
58
59         return 0;
60 }
61
62 static struct s3c_audio_pdata s3c_i2s_pdata = {
63         .cfg_gpio = s5pv310_cfg_i2s,
64 };
65
66 static struct resource s5pv310_iis0_resource[] = {
67         [0] = {
68                .start = S5PV310_PA_I2S0,
69                .end = S5PV310_PA_I2S0 + 0x100 - 1,
70                .flags = IORESOURCE_MEM,
71                },
72         [1] = {
73                .start = DMACH_I2S0_TX,
74                .end = DMACH_I2S0_TX,
75                .flags = IORESOURCE_DMA,
76                },
77         [2] = {
78                .start = DMACH_I2S0_RX,
79                .end = DMACH_I2S0_RX,
80                .flags = IORESOURCE_DMA,
81                },
82 };
83
84 struct platform_device s5pv310_device_iis0 = {
85         .name = "s3c64xx-iis-v4",
86         .id = -1,
87         .num_resources = ARRAY_SIZE(s5pv310_iis0_resource),
88         .resource = s5pv310_iis0_resource,
89         .dev = {
90                 .platform_data = &s3c_i2s_pdata,
91                 },
92 };
93
94 static int s5pv310_pcm_cfg_gpio(struct platform_device *pdev)
95 {
96         switch (pdev->id) {
97         case 1:
98                 s3c_gpio_cfgpin(S5PV310_GPC0(0), S3C_GPIO_SFN(3));
99                 s3c_gpio_cfgpin(S5PV310_GPC0(1), S3C_GPIO_SFN(3));
100                 s3c_gpio_cfgpin(S5PV310_GPC0(2), S3C_GPIO_SFN(3));
101                 s3c_gpio_cfgpin(S5PV310_GPC0(3), S3C_GPIO_SFN(3));
102                 s3c_gpio_cfgpin(S5PV310_GPC0(4), S3C_GPIO_SFN(3));
103                 break;
104         case 2:
105                 s3c_gpio_cfgpin(S5PV310_GPC1(0), S3C_GPIO_SFN(3));
106                 s3c_gpio_cfgpin(S5PV310_GPC1(1), S3C_GPIO_SFN(3));
107                 s3c_gpio_cfgpin(S5PV310_GPC1(2), S3C_GPIO_SFN(3));
108                 s3c_gpio_cfgpin(S5PV310_GPC1(3), S3C_GPIO_SFN(3));
109                 s3c_gpio_cfgpin(S5PV310_GPC1(4), S3C_GPIO_SFN(3));
110                 break;
111         case 0:
112                 s3c_gpio_cfgpin(S5PV310_GPZ(0), S3C_GPIO_SFN(3));
113                 s3c_gpio_cfgpin(S5PV310_GPZ(1), S3C_GPIO_SFN(3));
114                 s3c_gpio_cfgpin(S5PV310_GPZ(2), S3C_GPIO_SFN(3));
115                 s3c_gpio_cfgpin(S5PV310_GPZ(3), S3C_GPIO_SFN(3));
116                 s3c_gpio_cfgpin(S5PV310_GPZ(4), S3C_GPIO_SFN(3));
117                 break;
118         default:
119                 printk(KERN_DEBUG "Invalid PCM Controller number!");
120                 return -EINVAL;
121         }
122
123         return 0;
124 }
125
126 static struct s3c_audio_pdata s3c_pcm_pdata = {
127         .cfg_gpio = s5pv310_pcm_cfg_gpio,
128 };
129
130 static struct resource s5pv310_pcm1_resource[] = {
131         [0] = {
132                 .start = S5PV310_PA_PCM1,
133                 .end   = S5PV310_PA_PCM1 + 0x100 - 1,
134                 .flags = IORESOURCE_MEM,
135         },
136         [1] = {
137                 .start = DMACH_PCM1_TX,
138                 .end   = DMACH_PCM1_TX,
139                 .flags = IORESOURCE_DMA,
140         },
141         [2] = {
142                 .start = DMACH_PCM1_RX,
143                 .end   = DMACH_PCM1_RX,
144                 .flags = IORESOURCE_DMA,
145         },
146 };
147
148 struct platform_device s5pv310_device_pcm1 = {
149         .name             = "samsung-pcm",
150         .id               = 1,
151         .num_resources    = ARRAY_SIZE(s5pv310_pcm1_resource),
152         .resource         = s5pv310_pcm1_resource,
153         .dev = {
154                 .platform_data = &s3c_pcm_pdata,
155         },
156 };
157
158
159 static int s5pv310_ac97_cfg_gpio(struct platform_device *pdev)
160 {
161         s3c_gpio_cfgpin(S5PV310_GPC0(0), S3C_GPIO_SFN(4));
162         s3c_gpio_cfgpin(S5PV310_GPC0(1), S3C_GPIO_SFN(4));
163         s3c_gpio_cfgpin(S5PV310_GPC0(2), S3C_GPIO_SFN(4));
164         s3c_gpio_cfgpin(S5PV310_GPC0(3), S3C_GPIO_SFN(4));
165         s3c_gpio_cfgpin(S5PV310_GPC0(4), S3C_GPIO_SFN(4));
166
167         return 0;
168 }
169
170 static struct resource s5pv310_ac97_resource[] = {
171         [0] = {
172                 .start = S5PV310_PA_AC97,
173                 .end   = S5PV310_PA_AC97 + 0x100 - 1,
174                 .flags = IORESOURCE_MEM,
175         },
176         [1] = {
177                 .start = DMACH_AC97_PCMOUT,
178                 .end   = DMACH_AC97_PCMOUT,
179                 .flags = IORESOURCE_DMA,
180         },
181         [2] = {
182                 .start = DMACH_AC97_PCMIN,
183                 .end   = DMACH_AC97_PCMIN,
184                 .flags = IORESOURCE_DMA,
185         },
186         [3] = {
187                 .start = DMACH_AC97_MICIN,
188                 .end   = DMACH_AC97_MICIN,
189                 .flags = IORESOURCE_DMA,
190         },
191         [4] = {
192                 .start = IRQ_AC97,
193                 .end   = IRQ_AC97,
194                 .flags = IORESOURCE_IRQ,
195         },
196 };
197
198 static struct s3c_audio_pdata s3c_ac97_pdata = {
199         .cfg_gpio = s5pv310_ac97_cfg_gpio,
200 };
201
202 static u64 s5pv310_ac97_dmamask = DMA_BIT_MASK(32);
203
204 struct platform_device s5pv310_device_ac97 = {
205         .name             = "s3c-ac97",
206         .id               = -1,
207         .num_resources    = ARRAY_SIZE(s5pv310_ac97_resource),
208         .resource         = s5pv310_ac97_resource,
209         .dev = {
210                 .platform_data = &s3c_ac97_pdata,
211                 .dma_mask = &s5pv310_ac97_dmamask,
212                 .coherent_dma_mask = DMA_BIT_MASK(32),
213         },
214 };
215
216 static int s5pv310_spdif_cfg_gpio(struct platform_device *pdev)
217 {
218         s3c_gpio_cfgpin(S5PV310_GPC1(0), S3C_GPIO_SFN(4));
219         s3c_gpio_cfgpin(S5PV310_GPC1(1), S3C_GPIO_SFN(4));
220
221         return 0;
222 }
223
224 static struct resource s5pv310_spdif_resource[] = {
225         [0] = {
226                 .start = S5PV310_PA_SPDIF,
227                 .end   = S5PV310_PA_SPDIF + 0x100 - 1,
228                 .flags = IORESOURCE_MEM,
229         },
230         [1] = {
231                 .start = DMACH_SPDIF,
232                 .end   = DMACH_SPDIF,
233                 .flags = IORESOURCE_DMA,
234         },
235 };
236
237 static struct s3c_audio_pdata s5p_spdif_pdata = {
238         .cfg_gpio = s5pv310_spdif_cfg_gpio,
239 };
240
241 static u64 s5pv310_spdif_dmamask = DMA_BIT_MASK(32);
242
243 struct platform_device s5pv310_device_spdif = {
244         .name            = "samsung-spdif",
245         .id              = -1,
246         .num_resources   = ARRAY_SIZE(s5pv310_spdif_resource),
247         .resource        = s5pv310_spdif_resource,
248         .dev = {
249                 .platform_data = &s5p_spdif_pdata,
250                 .dma_mask = &s5pv310_spdif_dmamask,
251                 .coherent_dma_mask = DMA_BIT_MASK(32),
252         },
253 };
254
255 static struct resource s5pv310_rp_resource[] = {
256 };
257
258 struct platform_device s5pv310_device_rp = {
259         .name             = "s5p-rp",
260         .id               = -1,
261         .num_resources    = ARRAY_SIZE(s5pv310_rp_resource),
262         .resource         = s5pv310_rp_resource,
263 };
264 EXPORT_SYMBOL(s5pv310_device_rp);