blob: a7b9b9e81c363d19394091f4cbad60a786af54a0 [file] [log] [blame]
Kukjin Kim61c542b2011-10-03 09:46:13 +09001/* linux/arch/arm/plat-samsung/devs.c
2 *
3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
5 *
6 * Base SAMSUNG platform device definitions
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11*/
12
Arnd Bergmann78843722013-04-11 22:42:03 +020013#include <linux/amba/pl330.h>
Kukjin Kim61c542b2011-10-03 09:46:13 +090014#include <linux/kernel.h>
15#include <linux/types.h>
16#include <linux/interrupt.h>
17#include <linux/list.h>
18#include <linux/timer.h>
19#include <linux/init.h>
20#include <linux/serial_core.h>
21#include <linux/platform_device.h>
22#include <linux/io.h>
23#include <linux/slab.h>
24#include <linux/string.h>
25#include <linux/dma-mapping.h>
Kukjin Kim57167142011-10-03 09:46:56 +090026#include <linux/fb.h>
27#include <linux/gfp.h>
Kukjin Kim0523ec32011-10-03 09:46:56 +090028#include <linux/mtd/mtd.h>
29#include <linux/mtd/onenand.h>
Kukjin Kimbad1e6a2011-10-03 09:47:58 +090030#include <linux/mtd/partitions.h>
31#include <linux/mmc/host.h>
Kukjin Kim57167142011-10-03 09:46:56 +090032#include <linux/ioport.h>
Heiko Stübner715a3e42011-12-19 19:39:15 +010033#include <linux/platform_data/s3c-hsudc.h>
Lukasz Majewski126625e2012-05-09 13:16:53 +020034#include <linux/platform_data/s3c-hsotg.h>
Heiko Stuebner7f99ef22013-10-08 06:42:11 +090035#include <linux/platform_data/dma-s3c24xx.h>
Kukjin Kim61c542b2011-10-03 09:46:13 +090036
Tushar Beheraee21ae62012-08-08 13:12:19 +090037#include <media/s5p_hdmi.h>
38
Kukjin Kim61c542b2011-10-03 09:46:13 +090039#include <asm/irq.h>
40#include <asm/mach/arch.h>
41#include <asm/mach/map.h>
42#include <asm/mach/irq.h>
43
44#include <mach/hardware.h>
45#include <mach/dma.h>
46#include <mach/irqs.h>
47#include <mach/map.h>
48
49#include <plat/cpu.h>
50#include <plat/devs.h>
Kukjin Kimbad1e6a2011-10-03 09:47:58 +090051#include <plat/adc.h>
Arnd Bergmann436d42c2012-08-24 15:22:12 +020052#include <linux/platform_data/ata-samsung_cf.h>
53#include <linux/platform_data/usb-ehci-s5p.h>
Kukjin Kim61c542b2011-10-03 09:46:13 +090054#include <plat/fb.h>
55#include <plat/fb-s3c2410.h>
Sachin Kamata8321392012-09-21 08:04:45 +090056#include <plat/hdmi.h>
Arnd Bergmann436d42c2012-08-24 15:22:12 +020057#include <linux/platform_data/hwmon-s3c.h>
58#include <linux/platform_data/i2c-s3c2410.h>
Kukjin Kimbad1e6a2011-10-03 09:47:58 +090059#include <plat/keypad.h>
Arnd Bergmann436d42c2012-08-24 15:22:12 +020060#include <linux/platform_data/mmc-s3cmci.h>
61#include <linux/platform_data/mtd-nand-s3c2410.h>
Tomasz Figa95e43d42013-04-12 21:17:21 +020062#include <plat/pwm-core.h>
Kukjin Kimbad1e6a2011-10-03 09:47:58 +090063#include <plat/sdhci.h>
Arnd Bergmann436d42c2012-08-24 15:22:12 +020064#include <linux/platform_data/touchscreen-s3c2410.h>
65#include <linux/platform_data/usb-s3c2410_udc.h>
66#include <linux/platform_data/usb-ohci-s3c2410.h>
Kukjin Kim57167142011-10-03 09:46:56 +090067#include <plat/usb-phy.h>
Kukjin Kim61c542b2011-10-03 09:46:13 +090068#include <plat/regs-serial.h>
69#include <plat/regs-spi.h>
Arnd Bergmann436d42c2012-08-24 15:22:12 +020070#include <linux/platform_data/spi-s3c64xx.h>
Kukjin Kim61c542b2011-10-03 09:46:13 +090071
72static u64 samsung_device_dma_mask = DMA_BIT_MASK(32);
73
74/* AC97 */
75#ifdef CONFIG_CPU_S3C2440
76static struct resource s3c_ac97_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +090077 [0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97),
78 [1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97),
79 [2] = DEFINE_RES_DMA_NAMED(DMACH_PCM_OUT, "PCM out"),
80 [3] = DEFINE_RES_DMA_NAMED(DMACH_PCM_IN, "PCM in"),
81 [4] = DEFINE_RES_DMA_NAMED(DMACH_MIC_IN, "Mic in"),
Kukjin Kim61c542b2011-10-03 09:46:13 +090082};
83
84struct platform_device s3c_device_ac97 = {
85 .name = "samsung-ac97",
86 .id = -1,
87 .num_resources = ARRAY_SIZE(s3c_ac97_resource),
88 .resource = s3c_ac97_resource,
89 .dev = {
90 .dma_mask = &samsung_device_dma_mask,
91 .coherent_dma_mask = DMA_BIT_MASK(32),
92 }
93};
94#endif /* CONFIG_CPU_S3C2440 */
95
96/* ADC */
97
98#ifdef CONFIG_PLAT_S3C24XX
99static struct resource s3c_adc_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900100 [0] = DEFINE_RES_MEM(S3C24XX_PA_ADC, S3C24XX_SZ_ADC),
101 [1] = DEFINE_RES_IRQ(IRQ_TC),
102 [2] = DEFINE_RES_IRQ(IRQ_ADC),
Kukjin Kim61c542b2011-10-03 09:46:13 +0900103};
104
105struct platform_device s3c_device_adc = {
106 .name = "s3c24xx-adc",
107 .id = -1,
108 .num_resources = ARRAY_SIZE(s3c_adc_resource),
109 .resource = s3c_adc_resource,
110};
111#endif /* CONFIG_PLAT_S3C24XX */
112
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900113#if defined(CONFIG_SAMSUNG_DEV_ADC)
114static struct resource s3c_adc_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900115 [0] = DEFINE_RES_MEM(SAMSUNG_PA_ADC, SZ_256),
116 [1] = DEFINE_RES_IRQ(IRQ_TC),
117 [2] = DEFINE_RES_IRQ(IRQ_ADC),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900118};
119
120struct platform_device s3c_device_adc = {
121 .name = "samsung-adc",
122 .id = -1,
123 .num_resources = ARRAY_SIZE(s3c_adc_resource),
124 .resource = s3c_adc_resource,
125};
126#endif /* CONFIG_SAMSUNG_DEV_ADC */
127
Kukjin Kim61c542b2011-10-03 09:46:13 +0900128/* Camif Controller */
129
130#ifdef CONFIG_CPU_S3C2440
131static struct resource s3c_camif_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900132 [0] = DEFINE_RES_MEM(S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF),
Sylwester Nawrocki705c75e2012-07-13 17:48:56 +0900133 [1] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_C),
134 [2] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_P),
Kukjin Kim61c542b2011-10-03 09:46:13 +0900135};
136
137struct platform_device s3c_device_camif = {
138 .name = "s3c2440-camif",
139 .id = -1,
140 .num_resources = ARRAY_SIZE(s3c_camif_resource),
141 .resource = s3c_camif_resource,
142 .dev = {
143 .dma_mask = &samsung_device_dma_mask,
144 .coherent_dma_mask = DMA_BIT_MASK(32),
145 }
146};
147#endif /* CONFIG_CPU_S3C2440 */
148
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900149/* ASOC DMA */
150
Arnd Bergmanncb00e3a2013-04-11 02:05:01 +0200151#ifdef CONFIG_PLAT_S5P
152static struct resource samsung_asoc_idma_resource = DEFINE_RES_IRQ(IRQ_I2S0);
153
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900154struct platform_device samsung_asoc_idma = {
155 .name = "samsung-idma",
156 .id = -1,
Arnd Bergmanncb00e3a2013-04-11 02:05:01 +0200157 .num_resources = 1,
158 .resource = &samsung_asoc_idma_resource,
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900159 .dev = {
160 .dma_mask = &samsung_device_dma_mask,
161 .coherent_dma_mask = DMA_BIT_MASK(32),
162 }
163};
Arnd Bergmanncb00e3a2013-04-11 02:05:01 +0200164#endif
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900165
166/* FB */
167
168#ifdef CONFIG_S3C_DEV_FB
169static struct resource s3c_fb_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900170 [0] = DEFINE_RES_MEM(S3C_PA_FB, SZ_16K),
171 [1] = DEFINE_RES_IRQ(IRQ_LCD_VSYNC),
172 [2] = DEFINE_RES_IRQ(IRQ_LCD_FIFO),
173 [3] = DEFINE_RES_IRQ(IRQ_LCD_SYSTEM),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900174};
175
176struct platform_device s3c_device_fb = {
177 .name = "s3c-fb",
178 .id = -1,
179 .num_resources = ARRAY_SIZE(s3c_fb_resource),
180 .resource = s3c_fb_resource,
181 .dev = {
182 .dma_mask = &samsung_device_dma_mask,
183 .coherent_dma_mask = DMA_BIT_MASK(32),
184 },
185};
186
187void __init s3c_fb_set_platdata(struct s3c_fb_platdata *pd)
188{
189 s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
190 &s3c_device_fb);
191}
192#endif /* CONFIG_S3C_DEV_FB */
193
Kukjin Kim57167142011-10-03 09:46:56 +0900194/* FIMC */
195
196#ifdef CONFIG_S5P_DEV_FIMC0
197static struct resource s5p_fimc0_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900198 [0] = DEFINE_RES_MEM(S5P_PA_FIMC0, SZ_4K),
199 [1] = DEFINE_RES_IRQ(IRQ_FIMC0),
Kukjin Kim57167142011-10-03 09:46:56 +0900200};
201
202struct platform_device s5p_device_fimc0 = {
203 .name = "s5p-fimc",
204 .id = 0,
205 .num_resources = ARRAY_SIZE(s5p_fimc0_resource),
206 .resource = s5p_fimc0_resource,
207 .dev = {
208 .dma_mask = &samsung_device_dma_mask,
209 .coherent_dma_mask = DMA_BIT_MASK(32),
210 },
211};
Sylwester Nawrocki07e87e12011-10-13 15:41:51 +0900212
213struct platform_device s5p_device_fimc_md = {
214 .name = "s5p-fimc-md",
215 .id = -1,
216};
Kukjin Kim57167142011-10-03 09:46:56 +0900217#endif /* CONFIG_S5P_DEV_FIMC0 */
218
219#ifdef CONFIG_S5P_DEV_FIMC1
220static struct resource s5p_fimc1_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900221 [0] = DEFINE_RES_MEM(S5P_PA_FIMC1, SZ_4K),
222 [1] = DEFINE_RES_IRQ(IRQ_FIMC1),
Kukjin Kim57167142011-10-03 09:46:56 +0900223};
224
225struct platform_device s5p_device_fimc1 = {
226 .name = "s5p-fimc",
227 .id = 1,
228 .num_resources = ARRAY_SIZE(s5p_fimc1_resource),
229 .resource = s5p_fimc1_resource,
230 .dev = {
231 .dma_mask = &samsung_device_dma_mask,
232 .coherent_dma_mask = DMA_BIT_MASK(32),
233 },
234};
235#endif /* CONFIG_S5P_DEV_FIMC1 */
236
237#ifdef CONFIG_S5P_DEV_FIMC2
238static struct resource s5p_fimc2_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900239 [0] = DEFINE_RES_MEM(S5P_PA_FIMC2, SZ_4K),
240 [1] = DEFINE_RES_IRQ(IRQ_FIMC2),
Kukjin Kim57167142011-10-03 09:46:56 +0900241};
242
243struct platform_device s5p_device_fimc2 = {
244 .name = "s5p-fimc",
245 .id = 2,
246 .num_resources = ARRAY_SIZE(s5p_fimc2_resource),
247 .resource = s5p_fimc2_resource,
248 .dev = {
249 .dma_mask = &samsung_device_dma_mask,
250 .coherent_dma_mask = DMA_BIT_MASK(32),
251 },
252};
253#endif /* CONFIG_S5P_DEV_FIMC2 */
254
255#ifdef CONFIG_S5P_DEV_FIMC3
256static struct resource s5p_fimc3_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900257 [0] = DEFINE_RES_MEM(S5P_PA_FIMC3, SZ_4K),
258 [1] = DEFINE_RES_IRQ(IRQ_FIMC3),
Kukjin Kim57167142011-10-03 09:46:56 +0900259};
260
261struct platform_device s5p_device_fimc3 = {
262 .name = "s5p-fimc",
263 .id = 3,
264 .num_resources = ARRAY_SIZE(s5p_fimc3_resource),
265 .resource = s5p_fimc3_resource,
266 .dev = {
267 .dma_mask = &samsung_device_dma_mask,
268 .coherent_dma_mask = DMA_BIT_MASK(32),
269 },
270};
271#endif /* CONFIG_S5P_DEV_FIMC3 */
272
Kamil Debski561ab532011-12-27 17:16:44 +0900273/* G2D */
274
275#ifdef CONFIG_S5P_DEV_G2D
276static struct resource s5p_g2d_resource[] = {
Tushar Behera24eec602012-05-12 16:12:19 +0900277 [0] = DEFINE_RES_MEM(S5P_PA_G2D, SZ_4K),
278 [1] = DEFINE_RES_IRQ(IRQ_2D),
Kamil Debski561ab532011-12-27 17:16:44 +0900279};
280
281struct platform_device s5p_device_g2d = {
282 .name = "s5p-g2d",
283 .id = 0,
284 .num_resources = ARRAY_SIZE(s5p_g2d_resource),
285 .resource = s5p_g2d_resource,
286 .dev = {
287 .dma_mask = &samsung_device_dma_mask,
288 .coherent_dma_mask = DMA_BIT_MASK(32),
289 },
290};
291#endif /* CONFIG_S5P_DEV_G2D */
292
Andrzej Pietrasiewicz3dbe6d42012-03-10 02:45:42 -0800293#ifdef CONFIG_S5P_DEV_JPEG
294static struct resource s5p_jpeg_resource[] = {
295 [0] = DEFINE_RES_MEM(S5P_PA_JPEG, SZ_4K),
296 [1] = DEFINE_RES_IRQ(IRQ_JPEG),
297};
298
299struct platform_device s5p_device_jpeg = {
300 .name = "s5p-jpeg",
301 .id = 0,
302 .num_resources = ARRAY_SIZE(s5p_jpeg_resource),
303 .resource = s5p_jpeg_resource,
304 .dev = {
305 .dma_mask = &samsung_device_dma_mask,
306 .coherent_dma_mask = DMA_BIT_MASK(32),
307 },
308};
309#endif /* CONFIG_S5P_DEV_JPEG */
310
Kukjin Kim57167142011-10-03 09:46:56 +0900311/* FIMD0 */
312
313#ifdef CONFIG_S5P_DEV_FIMD0
314static struct resource s5p_fimd0_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900315 [0] = DEFINE_RES_MEM(S5P_PA_FIMD0, SZ_32K),
Tomasz Figa15f504f2013-05-25 06:49:43 +0900316 [1] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_VSYNC, "vsync"),
317 [2] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_FIFO, "fifo"),
318 [3] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_SYSTEM, "lcd_sys"),
Kukjin Kim57167142011-10-03 09:46:56 +0900319};
320
321struct platform_device s5p_device_fimd0 = {
322 .name = "s5p-fb",
323 .id = 0,
324 .num_resources = ARRAY_SIZE(s5p_fimd0_resource),
325 .resource = s5p_fimd0_resource,
326 .dev = {
327 .dma_mask = &samsung_device_dma_mask,
328 .coherent_dma_mask = DMA_BIT_MASK(32),
329 },
330};
331
332void __init s5p_fimd0_set_platdata(struct s3c_fb_platdata *pd)
333{
334 s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
335 &s5p_device_fimd0);
336}
337#endif /* CONFIG_S5P_DEV_FIMD0 */
338
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900339/* HWMON */
340
341#ifdef CONFIG_S3C_DEV_HWMON
342struct platform_device s3c_device_hwmon = {
343 .name = "s3c-hwmon",
344 .id = -1,
345 .dev.parent = &s3c_device_adc.dev,
346};
347
348void __init s3c_hwmon_set_platdata(struct s3c_hwmon_pdata *pd)
349{
350 s3c_set_platdata(pd, sizeof(struct s3c_hwmon_pdata),
351 &s3c_device_hwmon);
352}
353#endif /* CONFIG_S3C_DEV_HWMON */
354
355/* HSMMC */
356
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900357#ifdef CONFIG_S3C_DEV_HSMMC
358static struct resource s3c_hsmmc_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900359 [0] = DEFINE_RES_MEM(S3C_PA_HSMMC0, SZ_4K),
360 [1] = DEFINE_RES_IRQ(IRQ_HSMMC0),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900361};
362
363struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata = {
364 .max_width = 4,
365 .host_caps = (MMC_CAP_4_BIT_DATA |
366 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900367};
368
369struct platform_device s3c_device_hsmmc0 = {
370 .name = "s3c-sdhci",
371 .id = 0,
372 .num_resources = ARRAY_SIZE(s3c_hsmmc_resource),
373 .resource = s3c_hsmmc_resource,
374 .dev = {
375 .dma_mask = &samsung_device_dma_mask,
376 .coherent_dma_mask = DMA_BIT_MASK(32),
377 .platform_data = &s3c_hsmmc0_def_platdata,
378 },
379};
380
381void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd)
382{
383 s3c_sdhci_set_platdata(pd, &s3c_hsmmc0_def_platdata);
384}
385#endif /* CONFIG_S3C_DEV_HSMMC */
386
387#ifdef CONFIG_S3C_DEV_HSMMC1
388static struct resource s3c_hsmmc1_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900389 [0] = DEFINE_RES_MEM(S3C_PA_HSMMC1, SZ_4K),
390 [1] = DEFINE_RES_IRQ(IRQ_HSMMC1),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900391};
392
393struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata = {
394 .max_width = 4,
395 .host_caps = (MMC_CAP_4_BIT_DATA |
396 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900397};
398
399struct platform_device s3c_device_hsmmc1 = {
400 .name = "s3c-sdhci",
401 .id = 1,
402 .num_resources = ARRAY_SIZE(s3c_hsmmc1_resource),
403 .resource = s3c_hsmmc1_resource,
404 .dev = {
405 .dma_mask = &samsung_device_dma_mask,
406 .coherent_dma_mask = DMA_BIT_MASK(32),
407 .platform_data = &s3c_hsmmc1_def_platdata,
408 },
409};
410
411void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd)
412{
413 s3c_sdhci_set_platdata(pd, &s3c_hsmmc1_def_platdata);
414}
415#endif /* CONFIG_S3C_DEV_HSMMC1 */
416
417/* HSMMC2 */
418
419#ifdef CONFIG_S3C_DEV_HSMMC2
420static struct resource s3c_hsmmc2_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900421 [0] = DEFINE_RES_MEM(S3C_PA_HSMMC2, SZ_4K),
422 [1] = DEFINE_RES_IRQ(IRQ_HSMMC2),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900423};
424
425struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata = {
426 .max_width = 4,
427 .host_caps = (MMC_CAP_4_BIT_DATA |
428 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900429};
430
431struct platform_device s3c_device_hsmmc2 = {
432 .name = "s3c-sdhci",
433 .id = 2,
434 .num_resources = ARRAY_SIZE(s3c_hsmmc2_resource),
435 .resource = s3c_hsmmc2_resource,
436 .dev = {
437 .dma_mask = &samsung_device_dma_mask,
438 .coherent_dma_mask = DMA_BIT_MASK(32),
439 .platform_data = &s3c_hsmmc2_def_platdata,
440 },
441};
442
443void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd)
444{
445 s3c_sdhci_set_platdata(pd, &s3c_hsmmc2_def_platdata);
446}
447#endif /* CONFIG_S3C_DEV_HSMMC2 */
448
449#ifdef CONFIG_S3C_DEV_HSMMC3
450static struct resource s3c_hsmmc3_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900451 [0] = DEFINE_RES_MEM(S3C_PA_HSMMC3, SZ_4K),
452 [1] = DEFINE_RES_IRQ(IRQ_HSMMC3),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900453};
454
455struct s3c_sdhci_platdata s3c_hsmmc3_def_platdata = {
456 .max_width = 4,
457 .host_caps = (MMC_CAP_4_BIT_DATA |
458 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900459};
460
461struct platform_device s3c_device_hsmmc3 = {
462 .name = "s3c-sdhci",
463 .id = 3,
464 .num_resources = ARRAY_SIZE(s3c_hsmmc3_resource),
465 .resource = s3c_hsmmc3_resource,
466 .dev = {
467 .dma_mask = &samsung_device_dma_mask,
468 .coherent_dma_mask = DMA_BIT_MASK(32),
469 .platform_data = &s3c_hsmmc3_def_platdata,
470 },
471};
472
473void s3c_sdhci3_set_platdata(struct s3c_sdhci_platdata *pd)
474{
475 s3c_sdhci_set_platdata(pd, &s3c_hsmmc3_def_platdata);
476}
477#endif /* CONFIG_S3C_DEV_HSMMC3 */
478
479/* I2C */
480
481static struct resource s3c_i2c0_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900482 [0] = DEFINE_RES_MEM(S3C_PA_IIC, SZ_4K),
483 [1] = DEFINE_RES_IRQ(IRQ_IIC),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900484};
485
486struct platform_device s3c_device_i2c0 = {
487 .name = "s3c2410-i2c",
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900488 .id = 0,
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900489 .num_resources = ARRAY_SIZE(s3c_i2c0_resource),
490 .resource = s3c_i2c0_resource,
491};
492
493struct s3c2410_platform_i2c default_i2c_data __initdata = {
494 .flags = 0,
495 .slave_addr = 0x10,
496 .frequency = 100*1000,
497 .sda_delay = 100,
498};
499
500void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)
501{
502 struct s3c2410_platform_i2c *npd;
503
Sylwester Nawrocki693cec92012-01-27 14:51:21 +0900504 if (!pd) {
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900505 pd = &default_i2c_data;
Sylwester Nawrocki693cec92012-01-27 14:51:21 +0900506 pd->bus_num = 0;
507 }
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900508
509 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
510 &s3c_device_i2c0);
511
512 if (!npd->cfg_gpio)
513 npd->cfg_gpio = s3c_i2c0_cfg_gpio;
514}
515
516#ifdef CONFIG_S3C_DEV_I2C1
517static struct resource s3c_i2c1_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900518 [0] = DEFINE_RES_MEM(S3C_PA_IIC1, SZ_4K),
519 [1] = DEFINE_RES_IRQ(IRQ_IIC1),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900520};
521
522struct platform_device s3c_device_i2c1 = {
523 .name = "s3c2410-i2c",
524 .id = 1,
525 .num_resources = ARRAY_SIZE(s3c_i2c1_resource),
526 .resource = s3c_i2c1_resource,
527};
528
529void __init s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *pd)
530{
531 struct s3c2410_platform_i2c *npd;
532
533 if (!pd) {
534 pd = &default_i2c_data;
535 pd->bus_num = 1;
536 }
537
538 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
539 &s3c_device_i2c1);
540
541 if (!npd->cfg_gpio)
542 npd->cfg_gpio = s3c_i2c1_cfg_gpio;
543}
544#endif /* CONFIG_S3C_DEV_I2C1 */
545
546#ifdef CONFIG_S3C_DEV_I2C2
547static struct resource s3c_i2c2_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900548 [0] = DEFINE_RES_MEM(S3C_PA_IIC2, SZ_4K),
549 [1] = DEFINE_RES_IRQ(IRQ_IIC2),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900550};
551
552struct platform_device s3c_device_i2c2 = {
553 .name = "s3c2410-i2c",
554 .id = 2,
555 .num_resources = ARRAY_SIZE(s3c_i2c2_resource),
556 .resource = s3c_i2c2_resource,
557};
558
559void __init s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *pd)
560{
561 struct s3c2410_platform_i2c *npd;
562
563 if (!pd) {
564 pd = &default_i2c_data;
565 pd->bus_num = 2;
566 }
567
568 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
569 &s3c_device_i2c2);
570
571 if (!npd->cfg_gpio)
572 npd->cfg_gpio = s3c_i2c2_cfg_gpio;
573}
574#endif /* CONFIG_S3C_DEV_I2C2 */
575
576#ifdef CONFIG_S3C_DEV_I2C3
577static struct resource s3c_i2c3_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900578 [0] = DEFINE_RES_MEM(S3C_PA_IIC3, SZ_4K),
579 [1] = DEFINE_RES_IRQ(IRQ_IIC3),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900580};
581
582struct platform_device s3c_device_i2c3 = {
583 .name = "s3c2440-i2c",
584 .id = 3,
585 .num_resources = ARRAY_SIZE(s3c_i2c3_resource),
586 .resource = s3c_i2c3_resource,
587};
588
589void __init s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *pd)
590{
591 struct s3c2410_platform_i2c *npd;
592
593 if (!pd) {
594 pd = &default_i2c_data;
595 pd->bus_num = 3;
596 }
597
598 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
599 &s3c_device_i2c3);
600
601 if (!npd->cfg_gpio)
602 npd->cfg_gpio = s3c_i2c3_cfg_gpio;
603}
604#endif /*CONFIG_S3C_DEV_I2C3 */
605
606#ifdef CONFIG_S3C_DEV_I2C4
607static struct resource s3c_i2c4_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900608 [0] = DEFINE_RES_MEM(S3C_PA_IIC4, SZ_4K),
609 [1] = DEFINE_RES_IRQ(IRQ_IIC4),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900610};
611
612struct platform_device s3c_device_i2c4 = {
613 .name = "s3c2440-i2c",
614 .id = 4,
615 .num_resources = ARRAY_SIZE(s3c_i2c4_resource),
616 .resource = s3c_i2c4_resource,
617};
618
619void __init s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *pd)
620{
621 struct s3c2410_platform_i2c *npd;
622
623 if (!pd) {
624 pd = &default_i2c_data;
625 pd->bus_num = 4;
626 }
627
628 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
629 &s3c_device_i2c4);
630
631 if (!npd->cfg_gpio)
632 npd->cfg_gpio = s3c_i2c4_cfg_gpio;
633}
634#endif /*CONFIG_S3C_DEV_I2C4 */
635
636#ifdef CONFIG_S3C_DEV_I2C5
637static struct resource s3c_i2c5_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900638 [0] = DEFINE_RES_MEM(S3C_PA_IIC5, SZ_4K),
639 [1] = DEFINE_RES_IRQ(IRQ_IIC5),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900640};
641
642struct platform_device s3c_device_i2c5 = {
643 .name = "s3c2440-i2c",
644 .id = 5,
645 .num_resources = ARRAY_SIZE(s3c_i2c5_resource),
646 .resource = s3c_i2c5_resource,
647};
648
649void __init s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *pd)
650{
651 struct s3c2410_platform_i2c *npd;
652
653 if (!pd) {
654 pd = &default_i2c_data;
655 pd->bus_num = 5;
656 }
657
658 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
659 &s3c_device_i2c5);
660
661 if (!npd->cfg_gpio)
662 npd->cfg_gpio = s3c_i2c5_cfg_gpio;
663}
664#endif /*CONFIG_S3C_DEV_I2C5 */
665
666#ifdef CONFIG_S3C_DEV_I2C6
667static struct resource s3c_i2c6_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900668 [0] = DEFINE_RES_MEM(S3C_PA_IIC6, SZ_4K),
669 [1] = DEFINE_RES_IRQ(IRQ_IIC6),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900670};
671
672struct platform_device s3c_device_i2c6 = {
673 .name = "s3c2440-i2c",
674 .id = 6,
675 .num_resources = ARRAY_SIZE(s3c_i2c6_resource),
676 .resource = s3c_i2c6_resource,
677};
678
679void __init s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *pd)
680{
681 struct s3c2410_platform_i2c *npd;
682
683 if (!pd) {
684 pd = &default_i2c_data;
685 pd->bus_num = 6;
686 }
687
688 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
689 &s3c_device_i2c6);
690
691 if (!npd->cfg_gpio)
692 npd->cfg_gpio = s3c_i2c6_cfg_gpio;
693}
694#endif /* CONFIG_S3C_DEV_I2C6 */
695
696#ifdef CONFIG_S3C_DEV_I2C7
697static struct resource s3c_i2c7_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900698 [0] = DEFINE_RES_MEM(S3C_PA_IIC7, SZ_4K),
699 [1] = DEFINE_RES_IRQ(IRQ_IIC7),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900700};
701
702struct platform_device s3c_device_i2c7 = {
703 .name = "s3c2440-i2c",
704 .id = 7,
705 .num_resources = ARRAY_SIZE(s3c_i2c7_resource),
706 .resource = s3c_i2c7_resource,
707};
708
709void __init s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *pd)
710{
711 struct s3c2410_platform_i2c *npd;
712
713 if (!pd) {
714 pd = &default_i2c_data;
715 pd->bus_num = 7;
716 }
717
718 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
719 &s3c_device_i2c7);
720
721 if (!npd->cfg_gpio)
722 npd->cfg_gpio = s3c_i2c7_cfg_gpio;
723}
724#endif /* CONFIG_S3C_DEV_I2C7 */
725
Kukjin Kim57167142011-10-03 09:46:56 +0900726/* I2C HDMIPHY */
727
728#ifdef CONFIG_S5P_DEV_I2C_HDMIPHY
729static struct resource s5p_i2c_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900730 [0] = DEFINE_RES_MEM(S5P_PA_IIC_HDMIPHY, SZ_4K),
731 [1] = DEFINE_RES_IRQ(IRQ_IIC_HDMIPHY),
Kukjin Kim57167142011-10-03 09:46:56 +0900732};
733
734struct platform_device s5p_device_i2c_hdmiphy = {
735 .name = "s3c2440-hdmiphy-i2c",
736 .id = -1,
737 .num_resources = ARRAY_SIZE(s5p_i2c_resource),
738 .resource = s5p_i2c_resource,
739};
740
741void __init s5p_i2c_hdmiphy_set_platdata(struct s3c2410_platform_i2c *pd)
742{
743 struct s3c2410_platform_i2c *npd;
744
745 if (!pd) {
746 pd = &default_i2c_data;
747
Sachin Kamat70d291b2012-08-08 13:12:19 +0900748 if (soc_is_exynos4210() ||
749 soc_is_exynos4212() || soc_is_exynos4412())
Kukjin Kim57167142011-10-03 09:46:56 +0900750 pd->bus_num = 8;
751 else if (soc_is_s5pv210())
752 pd->bus_num = 3;
753 else
754 pd->bus_num = 0;
755 }
756
757 npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
758 &s5p_device_i2c_hdmiphy);
759}
Tushar Beheraee21ae62012-08-08 13:12:19 +0900760
Sachin Kamata8321392012-09-21 08:04:45 +0900761static struct s5p_hdmi_platform_data s5p_hdmi_def_platdata;
Tushar Beheraee21ae62012-08-08 13:12:19 +0900762
763void __init s5p_hdmi_set_platdata(struct i2c_board_info *hdmiphy_info,
764 struct i2c_board_info *mhl_info, int mhl_bus)
765{
766 struct s5p_hdmi_platform_data *pd = &s5p_hdmi_def_platdata;
767
768 if (soc_is_exynos4210() ||
769 soc_is_exynos4212() || soc_is_exynos4412())
770 pd->hdmiphy_bus = 8;
771 else if (soc_is_s5pv210())
772 pd->hdmiphy_bus = 3;
773 else
774 pd->hdmiphy_bus = 0;
775
776 pd->hdmiphy_info = hdmiphy_info;
777 pd->mhl_info = mhl_info;
778 pd->mhl_bus = mhl_bus;
779
780 s3c_set_platdata(pd, sizeof(struct s5p_hdmi_platform_data),
781 &s5p_device_hdmi);
782}
783
Kukjin Kim57167142011-10-03 09:46:56 +0900784#endif /* CONFIG_S5P_DEV_I2C_HDMIPHY */
785
Kukjin Kim61c542b2011-10-03 09:46:13 +0900786/* I2S */
787
788#ifdef CONFIG_PLAT_S3C24XX
789static struct resource s3c_iis_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900790 [0] = DEFINE_RES_MEM(S3C24XX_PA_IIS, S3C24XX_SZ_IIS),
Kukjin Kim61c542b2011-10-03 09:46:13 +0900791};
792
793struct platform_device s3c_device_iis = {
794 .name = "s3c24xx-iis",
795 .id = -1,
796 .num_resources = ARRAY_SIZE(s3c_iis_resource),
797 .resource = s3c_iis_resource,
798 .dev = {
799 .dma_mask = &samsung_device_dma_mask,
800 .coherent_dma_mask = DMA_BIT_MASK(32),
801 }
802};
803#endif /* CONFIG_PLAT_S3C24XX */
804
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900805/* IDE CFCON */
806
807#ifdef CONFIG_SAMSUNG_DEV_IDE
808static struct resource s3c_cfcon_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900809 [0] = DEFINE_RES_MEM(SAMSUNG_PA_CFCON, SZ_16K),
810 [1] = DEFINE_RES_IRQ(IRQ_CFCON),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900811};
812
813struct platform_device s3c_device_cfcon = {
814 .id = 0,
815 .num_resources = ARRAY_SIZE(s3c_cfcon_resource),
816 .resource = s3c_cfcon_resource,
817};
818
Tushar Beheraeff4c582012-03-09 08:03:17 -0800819void __init s3c_ide_set_platdata(struct s3c_ide_platdata *pdata)
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900820{
821 s3c_set_platdata(pdata, sizeof(struct s3c_ide_platdata),
822 &s3c_device_cfcon);
823}
824#endif /* CONFIG_SAMSUNG_DEV_IDE */
825
826/* KEYPAD */
827
828#ifdef CONFIG_SAMSUNG_DEV_KEYPAD
829static struct resource samsung_keypad_resources[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900830 [0] = DEFINE_RES_MEM(SAMSUNG_PA_KEYPAD, SZ_32),
831 [1] = DEFINE_RES_IRQ(IRQ_KEYPAD),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900832};
833
834struct platform_device samsung_device_keypad = {
835 .name = "samsung-keypad",
836 .id = -1,
837 .num_resources = ARRAY_SIZE(samsung_keypad_resources),
838 .resource = samsung_keypad_resources,
839};
840
841void __init samsung_keypad_set_platdata(struct samsung_keypad_platdata *pd)
842{
843 struct samsung_keypad_platdata *npd;
844
845 npd = s3c_set_platdata(pd, sizeof(struct samsung_keypad_platdata),
846 &samsung_device_keypad);
847
848 if (!npd->cfg_gpio)
849 npd->cfg_gpio = samsung_keypad_cfg_gpio;
850}
851#endif /* CONFIG_SAMSUNG_DEV_KEYPAD */
852
Kukjin Kim61c542b2011-10-03 09:46:13 +0900853/* LCD Controller */
854
855#ifdef CONFIG_PLAT_S3C24XX
856static struct resource s3c_lcd_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900857 [0] = DEFINE_RES_MEM(S3C24XX_PA_LCD, S3C24XX_SZ_LCD),
858 [1] = DEFINE_RES_IRQ(IRQ_LCD),
Kukjin Kim61c542b2011-10-03 09:46:13 +0900859};
860
861struct platform_device s3c_device_lcd = {
862 .name = "s3c2410-lcd",
863 .id = -1,
864 .num_resources = ARRAY_SIZE(s3c_lcd_resource),
865 .resource = s3c_lcd_resource,
866 .dev = {
867 .dma_mask = &samsung_device_dma_mask,
868 .coherent_dma_mask = DMA_BIT_MASK(32),
869 }
870};
871
872void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
873{
874 struct s3c2410fb_mach_info *npd;
875
876 npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_lcd);
877 if (npd) {
878 npd->displays = kmemdup(pd->displays,
879 sizeof(struct s3c2410fb_display) * npd->num_displays,
880 GFP_KERNEL);
881 if (!npd->displays)
882 printk(KERN_ERR "no memory for LCD display data\n");
883 } else {
884 printk(KERN_ERR "no memory for LCD platform data\n");
885 }
886}
887#endif /* CONFIG_PLAT_S3C24XX */
888
Kukjin Kim57167142011-10-03 09:46:56 +0900889/* MIPI CSIS */
890
891#ifdef CONFIG_S5P_DEV_CSIS0
892static struct resource s5p_mipi_csis0_resource[] = {
Sylwester Nawrocki75ac7282012-03-09 08:38:41 -0800893 [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS0, SZ_16K),
Kukjin Kime663cb72011-10-03 11:34:26 +0900894 [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS0),
Kukjin Kim57167142011-10-03 09:46:56 +0900895};
896
897struct platform_device s5p_device_mipi_csis0 = {
898 .name = "s5p-mipi-csis",
899 .id = 0,
900 .num_resources = ARRAY_SIZE(s5p_mipi_csis0_resource),
901 .resource = s5p_mipi_csis0_resource,
902};
903#endif /* CONFIG_S5P_DEV_CSIS0 */
904
905#ifdef CONFIG_S5P_DEV_CSIS1
906static struct resource s5p_mipi_csis1_resource[] = {
Sylwester Nawrocki75ac7282012-03-09 08:38:41 -0800907 [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS1, SZ_16K),
Kukjin Kime663cb72011-10-03 11:34:26 +0900908 [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS1),
Kukjin Kim57167142011-10-03 09:46:56 +0900909};
910
911struct platform_device s5p_device_mipi_csis1 = {
912 .name = "s5p-mipi-csis",
913 .id = 1,
914 .num_resources = ARRAY_SIZE(s5p_mipi_csis1_resource),
915 .resource = s5p_mipi_csis1_resource,
916};
917#endif
918
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900919/* NAND */
920
921#ifdef CONFIG_S3C_DEV_NAND
922static struct resource s3c_nand_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +0900923 [0] = DEFINE_RES_MEM(S3C_PA_NAND, SZ_1M),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +0900924};
925
926struct platform_device s3c_device_nand = {
927 .name = "s3c2410-nand",
928 .id = -1,
929 .num_resources = ARRAY_SIZE(s3c_nand_resource),
930 .resource = s3c_nand_resource,
931};
932
933/*
934 * s3c_nand_copy_set() - copy nand set data
935 * @set: The new structure, directly copied from the old.
936 *
937 * Copy all the fields from the NAND set field from what is probably __initdata
938 * to new kernel memory. The code returns 0 if the copy happened correctly or
939 * an error code for the calling function to display.
940 *
941 * Note, we currently do not try and look to see if we've already copied the
942 * data in a previous set.
943 */
944static int __init s3c_nand_copy_set(struct s3c2410_nand_set *set)
945{
946 void *ptr;
947 int size;
948
949 size = sizeof(struct mtd_partition) * set->nr_partitions;
950 if (size) {
951 ptr = kmemdup(set->partitions, size, GFP_KERNEL);
952 set->partitions = ptr;
953
954 if (!ptr)
955 return -ENOMEM;
956 }
957
958 if (set->nr_map && set->nr_chips) {
959 size = sizeof(int) * set->nr_chips;
960 ptr = kmemdup(set->nr_map, size, GFP_KERNEL);
961 set->nr_map = ptr;
962
963 if (!ptr)
964 return -ENOMEM;
965 }
966
967 if (set->ecc_layout) {
968 ptr = kmemdup(set->ecc_layout,
969 sizeof(struct nand_ecclayout), GFP_KERNEL);
970 set->ecc_layout = ptr;
971
972 if (!ptr)
973 return -ENOMEM;
974 }
975
976 return 0;
977}
978
979void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand)
980{
981 struct s3c2410_platform_nand *npd;
982 int size;
983 int ret;
984
985 /* note, if we get a failure in allocation, we simply drop out of the
986 * function. If there is so little memory available at initialisation
987 * time then there is little chance the system is going to run.
988 */
989
990 npd = s3c_set_platdata(nand, sizeof(struct s3c2410_platform_nand),
991 &s3c_device_nand);
992 if (!npd)
993 return;
994
995 /* now see if we need to copy any of the nand set data */
996
997 size = sizeof(struct s3c2410_nand_set) * npd->nr_sets;
998 if (size) {
999 struct s3c2410_nand_set *from = npd->sets;
1000 struct s3c2410_nand_set *to;
1001 int i;
1002
1003 to = kmemdup(from, size, GFP_KERNEL);
1004 npd->sets = to; /* set, even if we failed */
1005
1006 if (!to) {
1007 printk(KERN_ERR "%s: no memory for sets\n", __func__);
1008 return;
1009 }
1010
1011 for (i = 0; i < npd->nr_sets; i++) {
1012 ret = s3c_nand_copy_set(to);
1013 if (ret) {
1014 printk(KERN_ERR "%s: failed to copy set %d\n",
1015 __func__, i);
1016 return;
1017 }
1018 to++;
1019 }
1020 }
1021}
1022#endif /* CONFIG_S3C_DEV_NAND */
1023
1024/* ONENAND */
1025
1026#ifdef CONFIG_S3C_DEV_ONENAND
1027static struct resource s3c_onenand_resources[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001028 [0] = DEFINE_RES_MEM(S3C_PA_ONENAND, SZ_1K),
1029 [1] = DEFINE_RES_MEM(S3C_PA_ONENAND_BUF, S3C_SZ_ONENAND_BUF),
1030 [2] = DEFINE_RES_IRQ(IRQ_ONENAND),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001031};
1032
1033struct platform_device s3c_device_onenand = {
1034 .name = "samsung-onenand",
1035 .id = 0,
1036 .num_resources = ARRAY_SIZE(s3c_onenand_resources),
1037 .resource = s3c_onenand_resources,
1038};
1039#endif /* CONFIG_S3C_DEV_ONENAND */
1040
Kukjin Kim0523ec32011-10-03 09:46:56 +09001041#ifdef CONFIG_S3C64XX_DEV_ONENAND1
1042static struct resource s3c64xx_onenand1_resources[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001043 [0] = DEFINE_RES_MEM(S3C64XX_PA_ONENAND1, SZ_1K),
1044 [1] = DEFINE_RES_MEM(S3C64XX_PA_ONENAND1_BUF, S3C64XX_SZ_ONENAND1_BUF),
1045 [2] = DEFINE_RES_IRQ(IRQ_ONENAND1),
Kukjin Kim0523ec32011-10-03 09:46:56 +09001046};
1047
1048struct platform_device s3c64xx_device_onenand1 = {
1049 .name = "samsung-onenand",
1050 .id = 1,
1051 .num_resources = ARRAY_SIZE(s3c64xx_onenand1_resources),
1052 .resource = s3c64xx_onenand1_resources,
1053};
1054
Tushar Beheraeff4c582012-03-09 08:03:17 -08001055void __init s3c64xx_onenand1_set_platdata(struct onenand_platform_data *pdata)
Kukjin Kim0523ec32011-10-03 09:46:56 +09001056{
1057 s3c_set_platdata(pdata, sizeof(struct onenand_platform_data),
1058 &s3c64xx_device_onenand1);
1059}
1060#endif /* CONFIG_S3C64XX_DEV_ONENAND1 */
1061
Kukjin Kim57167142011-10-03 09:46:56 +09001062#ifdef CONFIG_S5P_DEV_ONENAND
1063static struct resource s5p_onenand_resources[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001064 [0] = DEFINE_RES_MEM(S5P_PA_ONENAND, SZ_128K),
1065 [1] = DEFINE_RES_MEM(S5P_PA_ONENAND_DMA, SZ_8K),
1066 [2] = DEFINE_RES_IRQ(IRQ_ONENAND_AUDI),
Kukjin Kim57167142011-10-03 09:46:56 +09001067};
1068
1069struct platform_device s5p_device_onenand = {
1070 .name = "s5pc110-onenand",
1071 .id = -1,
1072 .num_resources = ARRAY_SIZE(s5p_onenand_resources),
1073 .resource = s5p_onenand_resources,
1074};
1075#endif /* CONFIG_S5P_DEV_ONENAND */
1076
1077/* PMU */
1078
Chanho Parkb7bbdbe2012-12-12 14:03:54 +09001079#if defined(CONFIG_PLAT_S5P) && !defined(CONFIG_ARCH_EXYNOS)
Kukjin Kime663cb72011-10-03 11:34:26 +09001080static struct resource s5p_pmu_resource[] = {
1081 DEFINE_RES_IRQ(IRQ_PMU)
Kukjin Kim57167142011-10-03 09:46:56 +09001082};
1083
Kukjin Kim6d259a22012-01-21 12:00:13 +09001084static struct platform_device s5p_device_pmu = {
Kukjin Kim57167142011-10-03 09:46:56 +09001085 .name = "arm-pmu",
Sudeep KarkadaNageshadf3d17e2012-07-19 09:50:21 +01001086 .id = -1,
Kukjin Kime663cb72011-10-03 11:34:26 +09001087 .num_resources = ARRAY_SIZE(s5p_pmu_resource),
1088 .resource = s5p_pmu_resource,
Kukjin Kim57167142011-10-03 09:46:56 +09001089};
1090
1091static int __init s5p_pmu_init(void)
1092{
1093 platform_device_register(&s5p_device_pmu);
1094 return 0;
1095}
1096arch_initcall(s5p_pmu_init);
1097#endif /* CONFIG_PLAT_S5P */
1098
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001099/* PWM Timer */
1100
1101#ifdef CONFIG_SAMSUNG_DEV_PWM
Tomasz Figa95e43d42013-04-12 21:17:21 +02001102static struct resource samsung_pwm_resource[] = {
1103 DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
1104};
1105
1106struct platform_device samsung_device_pwm = {
1107 .name = "samsung-pwm",
1108 .id = -1,
1109 .num_resources = ARRAY_SIZE(samsung_pwm_resource),
1110 .resource = samsung_pwm_resource,
1111};
1112
1113void __init samsung_pwm_set_platdata(struct samsung_pwm_variant *pd)
1114{
1115 samsung_device_pwm.dev.platform_data = pd;
1116}
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001117#endif /* CONFIG_SAMSUNG_DEV_PWM */
1118
Kukjin Kim61c542b2011-10-03 09:46:13 +09001119/* RTC */
1120
1121#ifdef CONFIG_PLAT_S3C24XX
1122static struct resource s3c_rtc_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001123 [0] = DEFINE_RES_MEM(S3C24XX_PA_RTC, SZ_256),
1124 [1] = DEFINE_RES_IRQ(IRQ_RTC),
1125 [2] = DEFINE_RES_IRQ(IRQ_TICK),
Kukjin Kim61c542b2011-10-03 09:46:13 +09001126};
1127
1128struct platform_device s3c_device_rtc = {
1129 .name = "s3c2410-rtc",
1130 .id = -1,
1131 .num_resources = ARRAY_SIZE(s3c_rtc_resource),
1132 .resource = s3c_rtc_resource,
1133};
1134#endif /* CONFIG_PLAT_S3C24XX */
1135
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001136#ifdef CONFIG_S3C_DEV_RTC
1137static struct resource s3c_rtc_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001138 [0] = DEFINE_RES_MEM(S3C_PA_RTC, SZ_256),
1139 [1] = DEFINE_RES_IRQ(IRQ_RTC_ALARM),
1140 [2] = DEFINE_RES_IRQ(IRQ_RTC_TIC),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001141};
1142
1143struct platform_device s3c_device_rtc = {
1144 .name = "s3c64xx-rtc",
1145 .id = -1,
1146 .num_resources = ARRAY_SIZE(s3c_rtc_resource),
1147 .resource = s3c_rtc_resource,
1148};
1149#endif /* CONFIG_S3C_DEV_RTC */
1150
Kukjin Kim61c542b2011-10-03 09:46:13 +09001151/* SDI */
1152
1153#ifdef CONFIG_PLAT_S3C24XX
1154static struct resource s3c_sdi_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001155 [0] = DEFINE_RES_MEM(S3C24XX_PA_SDI, S3C24XX_SZ_SDI),
1156 [1] = DEFINE_RES_IRQ(IRQ_SDI),
Kukjin Kim61c542b2011-10-03 09:46:13 +09001157};
1158
1159struct platform_device s3c_device_sdi = {
1160 .name = "s3c2410-sdi",
1161 .id = -1,
1162 .num_resources = ARRAY_SIZE(s3c_sdi_resource),
1163 .resource = s3c_sdi_resource,
1164};
1165
1166void __init s3c24xx_mci_set_platdata(struct s3c24xx_mci_pdata *pdata)
1167{
1168 s3c_set_platdata(pdata, sizeof(struct s3c24xx_mci_pdata),
1169 &s3c_device_sdi);
1170}
1171#endif /* CONFIG_PLAT_S3C24XX */
1172
1173/* SPI */
1174
1175#ifdef CONFIG_PLAT_S3C24XX
1176static struct resource s3c_spi0_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001177 [0] = DEFINE_RES_MEM(S3C24XX_PA_SPI, SZ_32),
1178 [1] = DEFINE_RES_IRQ(IRQ_SPI0),
Kukjin Kim61c542b2011-10-03 09:46:13 +09001179};
1180
1181struct platform_device s3c_device_spi0 = {
1182 .name = "s3c2410-spi",
1183 .id = 0,
1184 .num_resources = ARRAY_SIZE(s3c_spi0_resource),
1185 .resource = s3c_spi0_resource,
1186 .dev = {
1187 .dma_mask = &samsung_device_dma_mask,
1188 .coherent_dma_mask = DMA_BIT_MASK(32),
1189 }
1190};
1191
1192static struct resource s3c_spi1_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001193 [0] = DEFINE_RES_MEM(S3C24XX_PA_SPI1, SZ_32),
1194 [1] = DEFINE_RES_IRQ(IRQ_SPI1),
Kukjin Kim61c542b2011-10-03 09:46:13 +09001195};
1196
1197struct platform_device s3c_device_spi1 = {
1198 .name = "s3c2410-spi",
1199 .id = 1,
1200 .num_resources = ARRAY_SIZE(s3c_spi1_resource),
1201 .resource = s3c_spi1_resource,
1202 .dev = {
1203 .dma_mask = &samsung_device_dma_mask,
1204 .coherent_dma_mask = DMA_BIT_MASK(32),
1205 }
1206};
1207#endif /* CONFIG_PLAT_S3C24XX */
1208
1209/* Touchscreen */
1210
1211#ifdef CONFIG_PLAT_S3C24XX
1212static struct resource s3c_ts_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001213 [0] = DEFINE_RES_MEM(S3C24XX_PA_ADC, S3C24XX_SZ_ADC),
1214 [1] = DEFINE_RES_IRQ(IRQ_TC),
Kukjin Kim61c542b2011-10-03 09:46:13 +09001215};
1216
1217struct platform_device s3c_device_ts = {
1218 .name = "s3c2410-ts",
1219 .id = -1,
1220 .dev.parent = &s3c_device_adc.dev,
1221 .num_resources = ARRAY_SIZE(s3c_ts_resource),
1222 .resource = s3c_ts_resource,
1223};
1224
1225void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
1226{
1227 s3c_set_platdata(hard_s3c2410ts_info,
1228 sizeof(struct s3c2410_ts_mach_info), &s3c_device_ts);
1229}
1230#endif /* CONFIG_PLAT_S3C24XX */
1231
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001232#ifdef CONFIG_SAMSUNG_DEV_TS
1233static struct resource s3c_ts_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001234 [0] = DEFINE_RES_MEM(SAMSUNG_PA_ADC, SZ_256),
1235 [1] = DEFINE_RES_IRQ(IRQ_TC),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001236};
1237
1238static struct s3c2410_ts_mach_info default_ts_data __initdata = {
1239 .delay = 10000,
1240 .presc = 49,
1241 .oversampling_shift = 2,
1242};
1243
1244struct platform_device s3c_device_ts = {
1245 .name = "s3c64xx-ts",
1246 .id = -1,
1247 .num_resources = ARRAY_SIZE(s3c_ts_resource),
1248 .resource = s3c_ts_resource,
1249};
1250
1251void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)
1252{
1253 if (!pd)
1254 pd = &default_ts_data;
1255
1256 s3c_set_platdata(pd, sizeof(struct s3c2410_ts_mach_info),
1257 &s3c_device_ts);
1258}
1259#endif /* CONFIG_SAMSUNG_DEV_TS */
1260
Kukjin Kim57167142011-10-03 09:46:56 +09001261/* TV */
1262
1263#ifdef CONFIG_S5P_DEV_TV
1264
1265static struct resource s5p_hdmi_resources[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001266 [0] = DEFINE_RES_MEM(S5P_PA_HDMI, SZ_1M),
1267 [1] = DEFINE_RES_IRQ(IRQ_HDMI),
Kukjin Kim57167142011-10-03 09:46:56 +09001268};
1269
1270struct platform_device s5p_device_hdmi = {
1271 .name = "s5p-hdmi",
1272 .id = -1,
1273 .num_resources = ARRAY_SIZE(s5p_hdmi_resources),
1274 .resource = s5p_hdmi_resources,
1275};
1276
1277static struct resource s5p_sdo_resources[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001278 [0] = DEFINE_RES_MEM(S5P_PA_SDO, SZ_64K),
1279 [1] = DEFINE_RES_IRQ(IRQ_SDO),
Kukjin Kim57167142011-10-03 09:46:56 +09001280};
1281
1282struct platform_device s5p_device_sdo = {
1283 .name = "s5p-sdo",
1284 .id = -1,
1285 .num_resources = ARRAY_SIZE(s5p_sdo_resources),
1286 .resource = s5p_sdo_resources,
1287};
1288
1289static struct resource s5p_mixer_resources[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001290 [0] = DEFINE_RES_MEM_NAMED(S5P_PA_MIXER, SZ_64K, "mxr"),
1291 [1] = DEFINE_RES_MEM_NAMED(S5P_PA_VP, SZ_64K, "vp"),
1292 [2] = DEFINE_RES_IRQ_NAMED(IRQ_MIXER, "irq"),
Kukjin Kim57167142011-10-03 09:46:56 +09001293};
1294
1295struct platform_device s5p_device_mixer = {
1296 .name = "s5p-mixer",
1297 .id = -1,
1298 .num_resources = ARRAY_SIZE(s5p_mixer_resources),
1299 .resource = s5p_mixer_resources,
1300 .dev = {
1301 .dma_mask = &samsung_device_dma_mask,
1302 .coherent_dma_mask = DMA_BIT_MASK(32),
1303 }
1304};
1305#endif /* CONFIG_S5P_DEV_TV */
1306
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001307/* USB */
1308
1309#ifdef CONFIG_S3C_DEV_USB_HOST
1310static struct resource s3c_usb_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001311 [0] = DEFINE_RES_MEM(S3C_PA_USBHOST, SZ_256),
1312 [1] = DEFINE_RES_IRQ(IRQ_USBH),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001313};
1314
1315struct platform_device s3c_device_ohci = {
1316 .name = "s3c2410-ohci",
1317 .id = -1,
1318 .num_resources = ARRAY_SIZE(s3c_usb_resource),
1319 .resource = s3c_usb_resource,
1320 .dev = {
1321 .dma_mask = &samsung_device_dma_mask,
1322 .coherent_dma_mask = DMA_BIT_MASK(32),
1323 }
1324};
1325
1326/*
1327 * s3c_ohci_set_platdata - initialise OHCI device platform data
1328 * @info: The platform data.
1329 *
1330 * This call copies the @info passed in and sets the device .platform_data
1331 * field to that copy. The @info is copied so that the original can be marked
1332 * __initdata.
1333 */
1334
1335void __init s3c_ohci_set_platdata(struct s3c2410_hcd_info *info)
1336{
1337 s3c_set_platdata(info, sizeof(struct s3c2410_hcd_info),
1338 &s3c_device_ohci);
1339}
1340#endif /* CONFIG_S3C_DEV_USB_HOST */
1341
Kukjin Kim61c542b2011-10-03 09:46:13 +09001342/* USB Device (Gadget) */
1343
1344#ifdef CONFIG_PLAT_S3C24XX
1345static struct resource s3c_usbgadget_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001346 [0] = DEFINE_RES_MEM(S3C24XX_PA_USBDEV, S3C24XX_SZ_USBDEV),
1347 [1] = DEFINE_RES_IRQ(IRQ_USBD),
Kukjin Kim61c542b2011-10-03 09:46:13 +09001348};
1349
1350struct platform_device s3c_device_usbgadget = {
1351 .name = "s3c2410-usbgadget",
1352 .id = -1,
1353 .num_resources = ARRAY_SIZE(s3c_usbgadget_resource),
1354 .resource = s3c_usbgadget_resource,
1355};
1356
1357void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *pd)
1358{
1359 s3c_set_platdata(pd, sizeof(*pd), &s3c_device_usbgadget);
1360}
1361#endif /* CONFIG_PLAT_S3C24XX */
1362
Kukjin Kim57167142011-10-03 09:46:56 +09001363/* USB EHCI Host Controller */
1364
1365#ifdef CONFIG_S5P_DEV_USB_EHCI
1366static struct resource s5p_ehci_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001367 [0] = DEFINE_RES_MEM(S5P_PA_EHCI, SZ_256),
1368 [1] = DEFINE_RES_IRQ(IRQ_USB_HOST),
Kukjin Kim57167142011-10-03 09:46:56 +09001369};
1370
1371struct platform_device s5p_device_ehci = {
1372 .name = "s5p-ehci",
1373 .id = -1,
1374 .num_resources = ARRAY_SIZE(s5p_ehci_resource),
1375 .resource = s5p_ehci_resource,
1376 .dev = {
1377 .dma_mask = &samsung_device_dma_mask,
1378 .coherent_dma_mask = DMA_BIT_MASK(32),
1379 }
1380};
1381
1382void __init s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd)
1383{
1384 struct s5p_ehci_platdata *npd;
1385
1386 npd = s3c_set_platdata(pd, sizeof(struct s5p_ehci_platdata),
1387 &s5p_device_ehci);
1388
1389 if (!npd->phy_init)
1390 npd->phy_init = s5p_usb_phy_init;
1391 if (!npd->phy_exit)
1392 npd->phy_exit = s5p_usb_phy_exit;
1393}
1394#endif /* CONFIG_S5P_DEV_USB_EHCI */
1395
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001396/* USB HSOTG */
1397
1398#ifdef CONFIG_S3C_DEV_USB_HSOTG
1399static struct resource s3c_usb_hsotg_resources[] = {
Joonyoung Shimc65d8ef2012-03-01 13:19:21 +09001400 [0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_128K),
Kukjin Kime663cb72011-10-03 11:34:26 +09001401 [1] = DEFINE_RES_IRQ(IRQ_OTG),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001402};
1403
1404struct platform_device s3c_device_usb_hsotg = {
1405 .name = "s3c-hsotg",
1406 .id = -1,
1407 .num_resources = ARRAY_SIZE(s3c_usb_hsotg_resources),
1408 .resource = s3c_usb_hsotg_resources,
1409 .dev = {
1410 .dma_mask = &samsung_device_dma_mask,
1411 .coherent_dma_mask = DMA_BIT_MASK(32),
1412 },
1413};
Joonyoung Shim99f6e1f2012-03-07 04:23:47 -08001414
1415void __init s3c_hsotg_set_platdata(struct s3c_hsotg_plat *pd)
1416{
1417 struct s3c_hsotg_plat *npd;
1418
1419 npd = s3c_set_platdata(pd, sizeof(struct s3c_hsotg_plat),
1420 &s3c_device_usb_hsotg);
1421
1422 if (!npd->phy_init)
1423 npd->phy_init = s5p_usb_phy_init;
1424 if (!npd->phy_exit)
1425 npd->phy_exit = s5p_usb_phy_exit;
1426}
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001427#endif /* CONFIG_S3C_DEV_USB_HSOTG */
1428
Kukjin Kim61c542b2011-10-03 09:46:13 +09001429/* USB High Spped 2.0 Device (Gadget) */
1430
1431#ifdef CONFIG_PLAT_S3C24XX
1432static struct resource s3c_hsudc_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001433 [0] = DEFINE_RES_MEM(S3C2416_PA_HSUDC, S3C2416_SZ_HSUDC),
1434 [1] = DEFINE_RES_IRQ(IRQ_USBD),
Kukjin Kim61c542b2011-10-03 09:46:13 +09001435};
1436
1437struct platform_device s3c_device_usb_hsudc = {
1438 .name = "s3c-hsudc",
1439 .id = -1,
1440 .num_resources = ARRAY_SIZE(s3c_hsudc_resource),
1441 .resource = s3c_hsudc_resource,
1442 .dev = {
1443 .dma_mask = &samsung_device_dma_mask,
1444 .coherent_dma_mask = DMA_BIT_MASK(32),
1445 },
1446};
1447
1448void __init s3c24xx_hsudc_set_platdata(struct s3c24xx_hsudc_platdata *pd)
1449{
1450 s3c_set_platdata(pd, sizeof(*pd), &s3c_device_usb_hsudc);
1451}
1452#endif /* CONFIG_PLAT_S3C24XX */
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001453
1454/* WDT */
1455
1456#ifdef CONFIG_S3C_DEV_WDT
1457static struct resource s3c_wdt_resource[] = {
Kukjin Kime663cb72011-10-03 11:34:26 +09001458 [0] = DEFINE_RES_MEM(S3C_PA_WDT, SZ_1K),
1459 [1] = DEFINE_RES_IRQ(IRQ_WDT),
Kukjin Kimbad1e6a2011-10-03 09:47:58 +09001460};
1461
1462struct platform_device s3c_device_wdt = {
1463 .name = "s3c2410-wdt",
1464 .id = -1,
1465 .num_resources = ARRAY_SIZE(s3c_wdt_resource),
1466 .resource = s3c_wdt_resource,
1467};
1468#endif /* CONFIG_S3C_DEV_WDT */
Padmavathi Venna875a5932011-12-23 10:14:31 +09001469
1470#ifdef CONFIG_S3C64XX_DEV_SPI0
1471static struct resource s3c64xx_spi0_resource[] = {
1472 [0] = DEFINE_RES_MEM(S3C_PA_SPI0, SZ_256),
1473 [1] = DEFINE_RES_DMA(DMACH_SPI0_TX),
1474 [2] = DEFINE_RES_DMA(DMACH_SPI0_RX),
1475 [3] = DEFINE_RES_IRQ(IRQ_SPI0),
1476};
1477
1478struct platform_device s3c64xx_device_spi0 = {
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001479 .name = "s3c6410-spi",
Padmavathi Venna875a5932011-12-23 10:14:31 +09001480 .id = 0,
1481 .num_resources = ARRAY_SIZE(s3c64xx_spi0_resource),
1482 .resource = s3c64xx_spi0_resource,
1483 .dev = {
1484 .dma_mask = &samsung_device_dma_mask,
1485 .coherent_dma_mask = DMA_BIT_MASK(32),
1486 },
1487};
1488
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001489void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr,
1490 int num_cs)
Padmavathi Venna875a5932011-12-23 10:14:31 +09001491{
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001492 struct s3c64xx_spi_info pd;
Padmavathi Venna875a5932011-12-23 10:14:31 +09001493
1494 /* Reject invalid configuration */
1495 if (!num_cs || src_clk_nr < 0) {
1496 pr_err("%s: Invalid SPI configuration\n", __func__);
1497 return;
1498 }
1499
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001500 pd.num_cs = num_cs;
1501 pd.src_clk_nr = src_clk_nr;
1502 pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio;
Heiko Stuebner7f99ef22013-10-08 06:42:11 +09001503#if defined(CONFIG_PL330_DMA)
Arnd Bergmann78843722013-04-11 22:42:03 +02001504 pd.filter = pl330_filter;
Heiko Stuebner7f99ef22013-10-08 06:42:11 +09001505#elif defined(CONFIG_S3C24XX_DMAC)
1506 pd.filter = s3c24xx_dma_filter;
Arnd Bergmann78843722013-04-11 22:42:03 +02001507#endif
Padmavathi Venna4566c7f2011-12-23 10:14:36 +09001508
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001509 s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi0);
Padmavathi Venna875a5932011-12-23 10:14:31 +09001510}
1511#endif /* CONFIG_S3C64XX_DEV_SPI0 */
1512
1513#ifdef CONFIG_S3C64XX_DEV_SPI1
1514static struct resource s3c64xx_spi1_resource[] = {
1515 [0] = DEFINE_RES_MEM(S3C_PA_SPI1, SZ_256),
1516 [1] = DEFINE_RES_DMA(DMACH_SPI1_TX),
1517 [2] = DEFINE_RES_DMA(DMACH_SPI1_RX),
1518 [3] = DEFINE_RES_IRQ(IRQ_SPI1),
1519};
1520
1521struct platform_device s3c64xx_device_spi1 = {
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001522 .name = "s3c6410-spi",
Padmavathi Venna875a5932011-12-23 10:14:31 +09001523 .id = 1,
1524 .num_resources = ARRAY_SIZE(s3c64xx_spi1_resource),
1525 .resource = s3c64xx_spi1_resource,
1526 .dev = {
1527 .dma_mask = &samsung_device_dma_mask,
1528 .coherent_dma_mask = DMA_BIT_MASK(32),
1529 },
1530};
1531
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001532void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr,
1533 int num_cs)
Padmavathi Venna875a5932011-12-23 10:14:31 +09001534{
Sylwester Nawrockifb997a42012-09-21 11:21:17 +09001535 struct s3c64xx_spi_info pd;
1536
Padmavathi Venna875a5932011-12-23 10:14:31 +09001537 /* Reject invalid configuration */
1538 if (!num_cs || src_clk_nr < 0) {
1539 pr_err("%s: Invalid SPI configuration\n", __func__);
1540 return;
1541 }
1542
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001543 pd.num_cs = num_cs;
1544 pd.src_clk_nr = src_clk_nr;
1545 pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio;
Arnd Bergmann78843722013-04-11 22:42:03 +02001546#ifdef CONFIG_PL330_DMA
1547 pd.filter = pl330_filter;
1548#endif
Padmavathi Venna4566c7f2011-12-23 10:14:36 +09001549
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001550 s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1);
Padmavathi Venna875a5932011-12-23 10:14:31 +09001551}
1552#endif /* CONFIG_S3C64XX_DEV_SPI1 */
1553
1554#ifdef CONFIG_S3C64XX_DEV_SPI2
1555static struct resource s3c64xx_spi2_resource[] = {
1556 [0] = DEFINE_RES_MEM(S3C_PA_SPI2, SZ_256),
1557 [1] = DEFINE_RES_DMA(DMACH_SPI2_TX),
1558 [2] = DEFINE_RES_DMA(DMACH_SPI2_RX),
1559 [3] = DEFINE_RES_IRQ(IRQ_SPI2),
1560};
1561
1562struct platform_device s3c64xx_device_spi2 = {
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001563 .name = "s3c6410-spi",
Padmavathi Venna875a5932011-12-23 10:14:31 +09001564 .id = 2,
1565 .num_resources = ARRAY_SIZE(s3c64xx_spi2_resource),
1566 .resource = s3c64xx_spi2_resource,
1567 .dev = {
1568 .dma_mask = &samsung_device_dma_mask,
1569 .coherent_dma_mask = DMA_BIT_MASK(32),
1570 },
1571};
1572
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001573void __init s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr,
1574 int num_cs)
Padmavathi Venna875a5932011-12-23 10:14:31 +09001575{
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001576 struct s3c64xx_spi_info pd;
Padmavathi Venna875a5932011-12-23 10:14:31 +09001577
1578 /* Reject invalid configuration */
1579 if (!num_cs || src_clk_nr < 0) {
1580 pr_err("%s: Invalid SPI configuration\n", __func__);
1581 return;
1582 }
1583
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001584 pd.num_cs = num_cs;
1585 pd.src_clk_nr = src_clk_nr;
1586 pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio;
Arnd Bergmann78843722013-04-11 22:42:03 +02001587#ifdef CONFIG_PL330_DMA
1588 pd.filter = pl330_filter;
1589#endif
Padmavathi Venna323d7712011-12-23 10:14:45 +09001590
Thomas Abraham4d0efdd2012-07-13 07:15:14 +09001591 s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2);
Padmavathi Venna875a5932011-12-23 10:14:31 +09001592}
1593#endif /* CONFIG_S3C64XX_DEV_SPI2 */