xref: /openbmc/linux/arch/arm/mach-s3c/devs.c (revision 71b9114d)
171b9114dSArnd Bergmann // SPDX-License-Identifier: GPL-2.0
271b9114dSArnd Bergmann //
371b9114dSArnd Bergmann // Copyright (c) 2011 Samsung Electronics Co., Ltd.
471b9114dSArnd Bergmann //		http://www.samsung.com
571b9114dSArnd Bergmann //
671b9114dSArnd Bergmann // Base Samsung platform device definitions
771b9114dSArnd Bergmann 
871b9114dSArnd Bergmann #include <linux/gpio.h>
971b9114dSArnd Bergmann #include <linux/kernel.h>
1071b9114dSArnd Bergmann #include <linux/types.h>
1171b9114dSArnd Bergmann #include <linux/interrupt.h>
1271b9114dSArnd Bergmann #include <linux/list.h>
1371b9114dSArnd Bergmann #include <linux/timer.h>
1471b9114dSArnd Bergmann #include <linux/init.h>
1571b9114dSArnd Bergmann #include <linux/serial_core.h>
1671b9114dSArnd Bergmann #include <linux/serial_s3c.h>
1771b9114dSArnd Bergmann #include <linux/platform_device.h>
1871b9114dSArnd Bergmann #include <linux/io.h>
1971b9114dSArnd Bergmann #include <linux/slab.h>
2071b9114dSArnd Bergmann #include <linux/string.h>
2171b9114dSArnd Bergmann #include <linux/dma-mapping.h>
2271b9114dSArnd Bergmann #include <linux/fb.h>
2371b9114dSArnd Bergmann #include <linux/gfp.h>
2471b9114dSArnd Bergmann #include <linux/mtd/mtd.h>
2571b9114dSArnd Bergmann #include <linux/mtd/onenand.h>
2671b9114dSArnd Bergmann #include <linux/mtd/partitions.h>
2771b9114dSArnd Bergmann #include <linux/mmc/host.h>
2871b9114dSArnd Bergmann #include <linux/ioport.h>
2971b9114dSArnd Bergmann #include <linux/sizes.h>
3071b9114dSArnd Bergmann #include <linux/platform_data/s3c-hsudc.h>
3171b9114dSArnd Bergmann #include <linux/platform_data/s3c-hsotg.h>
3271b9114dSArnd Bergmann #include <linux/platform_data/dma-s3c24xx.h>
3371b9114dSArnd Bergmann 
3471b9114dSArnd Bergmann #include <linux/platform_data/media/s5p_hdmi.h>
3571b9114dSArnd Bergmann 
3671b9114dSArnd Bergmann #include <asm/irq.h>
3771b9114dSArnd Bergmann #include <asm/mach/arch.h>
3871b9114dSArnd Bergmann #include <asm/mach/map.h>
3971b9114dSArnd Bergmann #include <asm/mach/irq.h>
4071b9114dSArnd Bergmann 
4171b9114dSArnd Bergmann #include <mach/irqs.h>
4271b9114dSArnd Bergmann #include <mach/map.h>
4371b9114dSArnd Bergmann #include <mach/gpio-samsung.h>
4471b9114dSArnd Bergmann 
4571b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
4671b9114dSArnd Bergmann #include <mach/regs-s3c2443-clock.h>
4771b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
4871b9114dSArnd Bergmann 
4971b9114dSArnd Bergmann #include <plat/cpu.h>
5071b9114dSArnd Bergmann #include <plat/devs.h>
5171b9114dSArnd Bergmann #include <plat/gpio-cfg.h>
5271b9114dSArnd Bergmann #include <linux/soc/samsung/s3c-adc.h>
5371b9114dSArnd Bergmann #include <linux/platform_data/ata-samsung_cf.h>
5471b9114dSArnd Bergmann #include <plat/fb.h>
5571b9114dSArnd Bergmann #include <linux/platform_data/fb-s3c2410.h>
5671b9114dSArnd Bergmann #include <linux/platform_data/hwmon-s3c.h>
5771b9114dSArnd Bergmann #include <linux/platform_data/i2c-s3c2410.h>
5871b9114dSArnd Bergmann #include <plat/keypad.h>
5971b9114dSArnd Bergmann #include <linux/platform_data/mmc-s3cmci.h>
6071b9114dSArnd Bergmann #include <linux/platform_data/mtd-nand-s3c2410.h>
6171b9114dSArnd Bergmann #include <plat/pwm-core.h>
6271b9114dSArnd Bergmann #include <plat/sdhci.h>
6371b9114dSArnd Bergmann #include <linux/platform_data/touchscreen-s3c2410.h>
6471b9114dSArnd Bergmann #include <linux/platform_data/usb-s3c2410_udc.h>
6571b9114dSArnd Bergmann #include <linux/platform_data/usb-ohci-s3c2410.h>
6671b9114dSArnd Bergmann #include <plat/usb-phy.h>
6771b9114dSArnd Bergmann #include <linux/platform_data/asoc-s3c.h>
6871b9114dSArnd Bergmann #include <linux/platform_data/spi-s3c64xx.h>
6971b9114dSArnd Bergmann 
7071b9114dSArnd Bergmann #define samsung_device_dma_mask (*((u64[]) { DMA_BIT_MASK(32) }))
7171b9114dSArnd Bergmann 
7271b9114dSArnd Bergmann /* AC97 */
7371b9114dSArnd Bergmann #ifdef CONFIG_CPU_S3C2440
7471b9114dSArnd Bergmann static struct resource s3c_ac97_resource[] = {
7571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C2440_PA_AC97, S3C2440_SZ_AC97),
7671b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_S3C244X_AC97),
7771b9114dSArnd Bergmann };
7871b9114dSArnd Bergmann 
7971b9114dSArnd Bergmann struct platform_device s3c_device_ac97 = {
8071b9114dSArnd Bergmann 	.name		= "samsung-ac97",
8171b9114dSArnd Bergmann 	.id		= -1,
8271b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_ac97_resource),
8371b9114dSArnd Bergmann 	.resource	= s3c_ac97_resource,
8471b9114dSArnd Bergmann 	.dev		= {
8571b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
8671b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
8771b9114dSArnd Bergmann 	}
8871b9114dSArnd Bergmann };
8971b9114dSArnd Bergmann #endif /* CONFIG_CPU_S3C2440 */
9071b9114dSArnd Bergmann 
9171b9114dSArnd Bergmann /* ADC */
9271b9114dSArnd Bergmann 
9371b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
9471b9114dSArnd Bergmann static struct resource s3c_adc_resource[] = {
9571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_ADC, S3C24XX_SZ_ADC),
9671b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_TC),
9771b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_ADC),
9871b9114dSArnd Bergmann };
9971b9114dSArnd Bergmann 
10071b9114dSArnd Bergmann struct platform_device s3c_device_adc = {
10171b9114dSArnd Bergmann 	.name		= "s3c24xx-adc",
10271b9114dSArnd Bergmann 	.id		= -1,
10371b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_adc_resource),
10471b9114dSArnd Bergmann 	.resource	= s3c_adc_resource,
10571b9114dSArnd Bergmann };
10671b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
10771b9114dSArnd Bergmann 
10871b9114dSArnd Bergmann #if defined(CONFIG_SAMSUNG_DEV_ADC)
10971b9114dSArnd Bergmann static struct resource s3c_adc_resource[] = {
11071b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(SAMSUNG_PA_ADC, SZ_256),
11171b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_ADC),
11271b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_TC),
11371b9114dSArnd Bergmann };
11471b9114dSArnd Bergmann 
11571b9114dSArnd Bergmann struct platform_device s3c_device_adc = {
11671b9114dSArnd Bergmann 	.name		= "exynos-adc",
11771b9114dSArnd Bergmann 	.id		= -1,
11871b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_adc_resource),
11971b9114dSArnd Bergmann 	.resource	= s3c_adc_resource,
12071b9114dSArnd Bergmann };
12171b9114dSArnd Bergmann #endif /* CONFIG_SAMSUNG_DEV_ADC */
12271b9114dSArnd Bergmann 
12371b9114dSArnd Bergmann /* Camif Controller */
12471b9114dSArnd Bergmann 
12571b9114dSArnd Bergmann #ifdef CONFIG_CPU_S3C2440
12671b9114dSArnd Bergmann static struct resource s3c_camif_resource[] = {
12771b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF),
12871b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_C),
12971b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_P),
13071b9114dSArnd Bergmann };
13171b9114dSArnd Bergmann 
13271b9114dSArnd Bergmann struct platform_device s3c_device_camif = {
13371b9114dSArnd Bergmann 	.name		= "s3c2440-camif",
13471b9114dSArnd Bergmann 	.id		= -1,
13571b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_camif_resource),
13671b9114dSArnd Bergmann 	.resource	= s3c_camif_resource,
13771b9114dSArnd Bergmann 	.dev		= {
13871b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
13971b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
14071b9114dSArnd Bergmann 	}
14171b9114dSArnd Bergmann };
14271b9114dSArnd Bergmann #endif /* CONFIG_CPU_S3C2440 */
14371b9114dSArnd Bergmann 
14471b9114dSArnd Bergmann /* FB */
14571b9114dSArnd Bergmann 
14671b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_FB
14771b9114dSArnd Bergmann static struct resource s3c_fb_resource[] = {
14871b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_FB, SZ_16K),
14971b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_LCD_VSYNC),
15071b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_LCD_FIFO),
15171b9114dSArnd Bergmann 	[3] = DEFINE_RES_IRQ(IRQ_LCD_SYSTEM),
15271b9114dSArnd Bergmann };
15371b9114dSArnd Bergmann 
15471b9114dSArnd Bergmann struct platform_device s3c_device_fb = {
15571b9114dSArnd Bergmann 	.name		= "s3c-fb",
15671b9114dSArnd Bergmann 	.id		= -1,
15771b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_fb_resource),
15871b9114dSArnd Bergmann 	.resource	= s3c_fb_resource,
15971b9114dSArnd Bergmann 	.dev		= {
16071b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
16171b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
16271b9114dSArnd Bergmann 	},
16371b9114dSArnd Bergmann };
16471b9114dSArnd Bergmann 
16571b9114dSArnd Bergmann void __init s3c_fb_set_platdata(struct s3c_fb_platdata *pd)
16671b9114dSArnd Bergmann {
16771b9114dSArnd Bergmann 	s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
16871b9114dSArnd Bergmann 			 &s3c_device_fb);
16971b9114dSArnd Bergmann }
17071b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_FB */
17171b9114dSArnd Bergmann 
17271b9114dSArnd Bergmann /* HWMON */
17371b9114dSArnd Bergmann 
17471b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HWMON
17571b9114dSArnd Bergmann struct platform_device s3c_device_hwmon = {
17671b9114dSArnd Bergmann 	.name		= "s3c-hwmon",
17771b9114dSArnd Bergmann 	.id		= -1,
17871b9114dSArnd Bergmann 	.dev.parent	= &s3c_device_adc.dev,
17971b9114dSArnd Bergmann };
18071b9114dSArnd Bergmann 
18171b9114dSArnd Bergmann void __init s3c_hwmon_set_platdata(struct s3c_hwmon_pdata *pd)
18271b9114dSArnd Bergmann {
18371b9114dSArnd Bergmann 	s3c_set_platdata(pd, sizeof(struct s3c_hwmon_pdata),
18471b9114dSArnd Bergmann 			 &s3c_device_hwmon);
18571b9114dSArnd Bergmann }
18671b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HWMON */
18771b9114dSArnd Bergmann 
18871b9114dSArnd Bergmann /* HSMMC */
18971b9114dSArnd Bergmann 
19071b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC
19171b9114dSArnd Bergmann static struct resource s3c_hsmmc_resource[] = {
19271b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC0, SZ_4K),
19371b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC0),
19471b9114dSArnd Bergmann };
19571b9114dSArnd Bergmann 
19671b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata = {
19771b9114dSArnd Bergmann 	.max_width	= 4,
19871b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
19971b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
20071b9114dSArnd Bergmann };
20171b9114dSArnd Bergmann 
20271b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc0 = {
20371b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
20471b9114dSArnd Bergmann 	.id		= 0,
20571b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc_resource),
20671b9114dSArnd Bergmann 	.resource	= s3c_hsmmc_resource,
20771b9114dSArnd Bergmann 	.dev		= {
20871b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
20971b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
21071b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc0_def_platdata,
21171b9114dSArnd Bergmann 	},
21271b9114dSArnd Bergmann };
21371b9114dSArnd Bergmann 
21471b9114dSArnd Bergmann void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd)
21571b9114dSArnd Bergmann {
21671b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc0_def_platdata);
21771b9114dSArnd Bergmann }
21871b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC */
21971b9114dSArnd Bergmann 
22071b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC1
22171b9114dSArnd Bergmann static struct resource s3c_hsmmc1_resource[] = {
22271b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC1, SZ_4K),
22371b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC1),
22471b9114dSArnd Bergmann };
22571b9114dSArnd Bergmann 
22671b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata = {
22771b9114dSArnd Bergmann 	.max_width	= 4,
22871b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
22971b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
23071b9114dSArnd Bergmann };
23171b9114dSArnd Bergmann 
23271b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc1 = {
23371b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
23471b9114dSArnd Bergmann 	.id		= 1,
23571b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc1_resource),
23671b9114dSArnd Bergmann 	.resource	= s3c_hsmmc1_resource,
23771b9114dSArnd Bergmann 	.dev		= {
23871b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
23971b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
24071b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc1_def_platdata,
24171b9114dSArnd Bergmann 	},
24271b9114dSArnd Bergmann };
24371b9114dSArnd Bergmann 
24471b9114dSArnd Bergmann void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd)
24571b9114dSArnd Bergmann {
24671b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc1_def_platdata);
24771b9114dSArnd Bergmann }
24871b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC1 */
24971b9114dSArnd Bergmann 
25071b9114dSArnd Bergmann /* HSMMC2 */
25171b9114dSArnd Bergmann 
25271b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC2
25371b9114dSArnd Bergmann static struct resource s3c_hsmmc2_resource[] = {
25471b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC2, SZ_4K),
25571b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC2),
25671b9114dSArnd Bergmann };
25771b9114dSArnd Bergmann 
25871b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata = {
25971b9114dSArnd Bergmann 	.max_width	= 4,
26071b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
26171b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
26271b9114dSArnd Bergmann };
26371b9114dSArnd Bergmann 
26471b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc2 = {
26571b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
26671b9114dSArnd Bergmann 	.id		= 2,
26771b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc2_resource),
26871b9114dSArnd Bergmann 	.resource	= s3c_hsmmc2_resource,
26971b9114dSArnd Bergmann 	.dev		= {
27071b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
27171b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
27271b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc2_def_platdata,
27371b9114dSArnd Bergmann 	},
27471b9114dSArnd Bergmann };
27571b9114dSArnd Bergmann 
27671b9114dSArnd Bergmann void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd)
27771b9114dSArnd Bergmann {
27871b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc2_def_platdata);
27971b9114dSArnd Bergmann }
28071b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC2 */
28171b9114dSArnd Bergmann 
28271b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC3
28371b9114dSArnd Bergmann static struct resource s3c_hsmmc3_resource[] = {
28471b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC3, SZ_4K),
28571b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC3),
28671b9114dSArnd Bergmann };
28771b9114dSArnd Bergmann 
28871b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc3_def_platdata = {
28971b9114dSArnd Bergmann 	.max_width	= 4,
29071b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
29171b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
29271b9114dSArnd Bergmann };
29371b9114dSArnd Bergmann 
29471b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc3 = {
29571b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
29671b9114dSArnd Bergmann 	.id		= 3,
29771b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc3_resource),
29871b9114dSArnd Bergmann 	.resource	= s3c_hsmmc3_resource,
29971b9114dSArnd Bergmann 	.dev		= {
30071b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
30171b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
30271b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc3_def_platdata,
30371b9114dSArnd Bergmann 	},
30471b9114dSArnd Bergmann };
30571b9114dSArnd Bergmann 
30671b9114dSArnd Bergmann void s3c_sdhci3_set_platdata(struct s3c_sdhci_platdata *pd)
30771b9114dSArnd Bergmann {
30871b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc3_def_platdata);
30971b9114dSArnd Bergmann }
31071b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC3 */
31171b9114dSArnd Bergmann 
31271b9114dSArnd Bergmann /* I2C */
31371b9114dSArnd Bergmann 
31471b9114dSArnd Bergmann static struct resource s3c_i2c0_resource[] = {
31571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC, SZ_4K),
31671b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC),
31771b9114dSArnd Bergmann };
31871b9114dSArnd Bergmann 
31971b9114dSArnd Bergmann struct platform_device s3c_device_i2c0 = {
32071b9114dSArnd Bergmann 	.name		= "s3c2410-i2c",
32171b9114dSArnd Bergmann 	.id		= 0,
32271b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c0_resource),
32371b9114dSArnd Bergmann 	.resource	= s3c_i2c0_resource,
32471b9114dSArnd Bergmann };
32571b9114dSArnd Bergmann 
32671b9114dSArnd Bergmann struct s3c2410_platform_i2c default_i2c_data __initdata = {
32771b9114dSArnd Bergmann 	.flags		= 0,
32871b9114dSArnd Bergmann 	.slave_addr	= 0x10,
32971b9114dSArnd Bergmann 	.frequency	= 100*1000,
33071b9114dSArnd Bergmann 	.sda_delay	= 100,
33171b9114dSArnd Bergmann };
33271b9114dSArnd Bergmann 
33371b9114dSArnd Bergmann void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)
33471b9114dSArnd Bergmann {
33571b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
33671b9114dSArnd Bergmann 
33771b9114dSArnd Bergmann 	if (!pd) {
33871b9114dSArnd Bergmann 		pd = &default_i2c_data;
33971b9114dSArnd Bergmann 		pd->bus_num = 0;
34071b9114dSArnd Bergmann 	}
34171b9114dSArnd Bergmann 
34271b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c0);
34371b9114dSArnd Bergmann 
34471b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
34571b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c0_cfg_gpio;
34671b9114dSArnd Bergmann }
34771b9114dSArnd Bergmann 
34871b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C1
34971b9114dSArnd Bergmann static struct resource s3c_i2c1_resource[] = {
35071b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC1, SZ_4K),
35171b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC1),
35271b9114dSArnd Bergmann };
35371b9114dSArnd Bergmann 
35471b9114dSArnd Bergmann struct platform_device s3c_device_i2c1 = {
35571b9114dSArnd Bergmann 	.name		= "s3c2410-i2c",
35671b9114dSArnd Bergmann 	.id		= 1,
35771b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c1_resource),
35871b9114dSArnd Bergmann 	.resource	= s3c_i2c1_resource,
35971b9114dSArnd Bergmann };
36071b9114dSArnd Bergmann 
36171b9114dSArnd Bergmann void __init s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *pd)
36271b9114dSArnd Bergmann {
36371b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
36471b9114dSArnd Bergmann 
36571b9114dSArnd Bergmann 	if (!pd) {
36671b9114dSArnd Bergmann 		pd = &default_i2c_data;
36771b9114dSArnd Bergmann 		pd->bus_num = 1;
36871b9114dSArnd Bergmann 	}
36971b9114dSArnd Bergmann 
37071b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c1);
37171b9114dSArnd Bergmann 
37271b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
37371b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c1_cfg_gpio;
37471b9114dSArnd Bergmann }
37571b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_I2C1 */
37671b9114dSArnd Bergmann 
37771b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C2
37871b9114dSArnd Bergmann static struct resource s3c_i2c2_resource[] = {
37971b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC2, SZ_4K),
38071b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC2),
38171b9114dSArnd Bergmann };
38271b9114dSArnd Bergmann 
38371b9114dSArnd Bergmann struct platform_device s3c_device_i2c2 = {
38471b9114dSArnd Bergmann 	.name		= "s3c2410-i2c",
38571b9114dSArnd Bergmann 	.id		= 2,
38671b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c2_resource),
38771b9114dSArnd Bergmann 	.resource	= s3c_i2c2_resource,
38871b9114dSArnd Bergmann };
38971b9114dSArnd Bergmann 
39071b9114dSArnd Bergmann void __init s3c_i2c2_set_platdata(struct s3c2410_platform_i2c *pd)
39171b9114dSArnd Bergmann {
39271b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
39371b9114dSArnd Bergmann 
39471b9114dSArnd Bergmann 	if (!pd) {
39571b9114dSArnd Bergmann 		pd = &default_i2c_data;
39671b9114dSArnd Bergmann 		pd->bus_num = 2;
39771b9114dSArnd Bergmann 	}
39871b9114dSArnd Bergmann 
39971b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c2);
40071b9114dSArnd Bergmann 
40171b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
40271b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c2_cfg_gpio;
40371b9114dSArnd Bergmann }
40471b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_I2C2 */
40571b9114dSArnd Bergmann 
40671b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C3
40771b9114dSArnd Bergmann static struct resource s3c_i2c3_resource[] = {
40871b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC3, SZ_4K),
40971b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC3),
41071b9114dSArnd Bergmann };
41171b9114dSArnd Bergmann 
41271b9114dSArnd Bergmann struct platform_device s3c_device_i2c3 = {
41371b9114dSArnd Bergmann 	.name		= "s3c2440-i2c",
41471b9114dSArnd Bergmann 	.id		= 3,
41571b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c3_resource),
41671b9114dSArnd Bergmann 	.resource	= s3c_i2c3_resource,
41771b9114dSArnd Bergmann };
41871b9114dSArnd Bergmann 
41971b9114dSArnd Bergmann void __init s3c_i2c3_set_platdata(struct s3c2410_platform_i2c *pd)
42071b9114dSArnd Bergmann {
42171b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
42271b9114dSArnd Bergmann 
42371b9114dSArnd Bergmann 	if (!pd) {
42471b9114dSArnd Bergmann 		pd = &default_i2c_data;
42571b9114dSArnd Bergmann 		pd->bus_num = 3;
42671b9114dSArnd Bergmann 	}
42771b9114dSArnd Bergmann 
42871b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c3);
42971b9114dSArnd Bergmann 
43071b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
43171b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c3_cfg_gpio;
43271b9114dSArnd Bergmann }
43371b9114dSArnd Bergmann #endif /*CONFIG_S3C_DEV_I2C3 */
43471b9114dSArnd Bergmann 
43571b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C4
43671b9114dSArnd Bergmann static struct resource s3c_i2c4_resource[] = {
43771b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC4, SZ_4K),
43871b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC4),
43971b9114dSArnd Bergmann };
44071b9114dSArnd Bergmann 
44171b9114dSArnd Bergmann struct platform_device s3c_device_i2c4 = {
44271b9114dSArnd Bergmann 	.name		= "s3c2440-i2c",
44371b9114dSArnd Bergmann 	.id		= 4,
44471b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c4_resource),
44571b9114dSArnd Bergmann 	.resource	= s3c_i2c4_resource,
44671b9114dSArnd Bergmann };
44771b9114dSArnd Bergmann 
44871b9114dSArnd Bergmann void __init s3c_i2c4_set_platdata(struct s3c2410_platform_i2c *pd)
44971b9114dSArnd Bergmann {
45071b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
45171b9114dSArnd Bergmann 
45271b9114dSArnd Bergmann 	if (!pd) {
45371b9114dSArnd Bergmann 		pd = &default_i2c_data;
45471b9114dSArnd Bergmann 		pd->bus_num = 4;
45571b9114dSArnd Bergmann 	}
45671b9114dSArnd Bergmann 
45771b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c4);
45871b9114dSArnd Bergmann 
45971b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
46071b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c4_cfg_gpio;
46171b9114dSArnd Bergmann }
46271b9114dSArnd Bergmann #endif /*CONFIG_S3C_DEV_I2C4 */
46371b9114dSArnd Bergmann 
46471b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C5
46571b9114dSArnd Bergmann static struct resource s3c_i2c5_resource[] = {
46671b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC5, SZ_4K),
46771b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC5),
46871b9114dSArnd Bergmann };
46971b9114dSArnd Bergmann 
47071b9114dSArnd Bergmann struct platform_device s3c_device_i2c5 = {
47171b9114dSArnd Bergmann 	.name		= "s3c2440-i2c",
47271b9114dSArnd Bergmann 	.id		= 5,
47371b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c5_resource),
47471b9114dSArnd Bergmann 	.resource	= s3c_i2c5_resource,
47571b9114dSArnd Bergmann };
47671b9114dSArnd Bergmann 
47771b9114dSArnd Bergmann void __init s3c_i2c5_set_platdata(struct s3c2410_platform_i2c *pd)
47871b9114dSArnd Bergmann {
47971b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
48071b9114dSArnd Bergmann 
48171b9114dSArnd Bergmann 	if (!pd) {
48271b9114dSArnd Bergmann 		pd = &default_i2c_data;
48371b9114dSArnd Bergmann 		pd->bus_num = 5;
48471b9114dSArnd Bergmann 	}
48571b9114dSArnd Bergmann 
48671b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c5);
48771b9114dSArnd Bergmann 
48871b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
48971b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c5_cfg_gpio;
49071b9114dSArnd Bergmann }
49171b9114dSArnd Bergmann #endif /*CONFIG_S3C_DEV_I2C5 */
49271b9114dSArnd Bergmann 
49371b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C6
49471b9114dSArnd Bergmann static struct resource s3c_i2c6_resource[] = {
49571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC6, SZ_4K),
49671b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC6),
49771b9114dSArnd Bergmann };
49871b9114dSArnd Bergmann 
49971b9114dSArnd Bergmann struct platform_device s3c_device_i2c6 = {
50071b9114dSArnd Bergmann 	.name		= "s3c2440-i2c",
50171b9114dSArnd Bergmann 	.id		= 6,
50271b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c6_resource),
50371b9114dSArnd Bergmann 	.resource	= s3c_i2c6_resource,
50471b9114dSArnd Bergmann };
50571b9114dSArnd Bergmann 
50671b9114dSArnd Bergmann void __init s3c_i2c6_set_platdata(struct s3c2410_platform_i2c *pd)
50771b9114dSArnd Bergmann {
50871b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
50971b9114dSArnd Bergmann 
51071b9114dSArnd Bergmann 	if (!pd) {
51171b9114dSArnd Bergmann 		pd = &default_i2c_data;
51271b9114dSArnd Bergmann 		pd->bus_num = 6;
51371b9114dSArnd Bergmann 	}
51471b9114dSArnd Bergmann 
51571b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c6);
51671b9114dSArnd Bergmann 
51771b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
51871b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c6_cfg_gpio;
51971b9114dSArnd Bergmann }
52071b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_I2C6 */
52171b9114dSArnd Bergmann 
52271b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C7
52371b9114dSArnd Bergmann static struct resource s3c_i2c7_resource[] = {
52471b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC7, SZ_4K),
52571b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC7),
52671b9114dSArnd Bergmann };
52771b9114dSArnd Bergmann 
52871b9114dSArnd Bergmann struct platform_device s3c_device_i2c7 = {
52971b9114dSArnd Bergmann 	.name		= "s3c2440-i2c",
53071b9114dSArnd Bergmann 	.id		= 7,
53171b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c7_resource),
53271b9114dSArnd Bergmann 	.resource	= s3c_i2c7_resource,
53371b9114dSArnd Bergmann };
53471b9114dSArnd Bergmann 
53571b9114dSArnd Bergmann void __init s3c_i2c7_set_platdata(struct s3c2410_platform_i2c *pd)
53671b9114dSArnd Bergmann {
53771b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
53871b9114dSArnd Bergmann 
53971b9114dSArnd Bergmann 	if (!pd) {
54071b9114dSArnd Bergmann 		pd = &default_i2c_data;
54171b9114dSArnd Bergmann 		pd->bus_num = 7;
54271b9114dSArnd Bergmann 	}
54371b9114dSArnd Bergmann 
54471b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c7);
54571b9114dSArnd Bergmann 
54671b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
54771b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c7_cfg_gpio;
54871b9114dSArnd Bergmann }
54971b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_I2C7 */
55071b9114dSArnd Bergmann 
55171b9114dSArnd Bergmann /* I2S */
55271b9114dSArnd Bergmann 
55371b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
55471b9114dSArnd Bergmann static struct resource s3c_iis_resource[] = {
55571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_IIS, S3C24XX_SZ_IIS),
55671b9114dSArnd Bergmann };
55771b9114dSArnd Bergmann 
55871b9114dSArnd Bergmann struct platform_device s3c_device_iis = {
55971b9114dSArnd Bergmann 	.name		= "s3c24xx-iis",
56071b9114dSArnd Bergmann 	.id		= -1,
56171b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_iis_resource),
56271b9114dSArnd Bergmann 	.resource	= s3c_iis_resource,
56371b9114dSArnd Bergmann 	.dev		= {
56471b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
56571b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
56671b9114dSArnd Bergmann 	}
56771b9114dSArnd Bergmann };
56871b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
56971b9114dSArnd Bergmann 
57071b9114dSArnd Bergmann /* IDE CFCON */
57171b9114dSArnd Bergmann 
57271b9114dSArnd Bergmann #ifdef CONFIG_SAMSUNG_DEV_IDE
57371b9114dSArnd Bergmann static struct resource s3c_cfcon_resource[] = {
57471b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(SAMSUNG_PA_CFCON, SZ_16K),
57571b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_CFCON),
57671b9114dSArnd Bergmann };
57771b9114dSArnd Bergmann 
57871b9114dSArnd Bergmann struct platform_device s3c_device_cfcon = {
57971b9114dSArnd Bergmann 	.id		= 0,
58071b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_cfcon_resource),
58171b9114dSArnd Bergmann 	.resource	= s3c_cfcon_resource,
58271b9114dSArnd Bergmann };
58371b9114dSArnd Bergmann 
58471b9114dSArnd Bergmann void __init s3c_ide_set_platdata(struct s3c_ide_platdata *pdata)
58571b9114dSArnd Bergmann {
58671b9114dSArnd Bergmann 	s3c_set_platdata(pdata, sizeof(struct s3c_ide_platdata),
58771b9114dSArnd Bergmann 			 &s3c_device_cfcon);
58871b9114dSArnd Bergmann }
58971b9114dSArnd Bergmann #endif /* CONFIG_SAMSUNG_DEV_IDE */
59071b9114dSArnd Bergmann 
59171b9114dSArnd Bergmann /* KEYPAD */
59271b9114dSArnd Bergmann 
59371b9114dSArnd Bergmann #ifdef CONFIG_SAMSUNG_DEV_KEYPAD
59471b9114dSArnd Bergmann static struct resource samsung_keypad_resources[] = {
59571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(SAMSUNG_PA_KEYPAD, SZ_32),
59671b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_KEYPAD),
59771b9114dSArnd Bergmann };
59871b9114dSArnd Bergmann 
59971b9114dSArnd Bergmann struct platform_device samsung_device_keypad = {
60071b9114dSArnd Bergmann 	.name		= "samsung-keypad",
60171b9114dSArnd Bergmann 	.id		= -1,
60271b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(samsung_keypad_resources),
60371b9114dSArnd Bergmann 	.resource	= samsung_keypad_resources,
60471b9114dSArnd Bergmann };
60571b9114dSArnd Bergmann 
60671b9114dSArnd Bergmann void __init samsung_keypad_set_platdata(struct samsung_keypad_platdata *pd)
60771b9114dSArnd Bergmann {
60871b9114dSArnd Bergmann 	struct samsung_keypad_platdata *npd;
60971b9114dSArnd Bergmann 
61071b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &samsung_device_keypad);
61171b9114dSArnd Bergmann 
61271b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
61371b9114dSArnd Bergmann 		npd->cfg_gpio = samsung_keypad_cfg_gpio;
61471b9114dSArnd Bergmann }
61571b9114dSArnd Bergmann #endif /* CONFIG_SAMSUNG_DEV_KEYPAD */
61671b9114dSArnd Bergmann 
61771b9114dSArnd Bergmann /* LCD Controller */
61871b9114dSArnd Bergmann 
61971b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
62071b9114dSArnd Bergmann static struct resource s3c_lcd_resource[] = {
62171b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_LCD, S3C24XX_SZ_LCD),
62271b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_LCD),
62371b9114dSArnd Bergmann };
62471b9114dSArnd Bergmann 
62571b9114dSArnd Bergmann struct platform_device s3c_device_lcd = {
62671b9114dSArnd Bergmann 	.name		= "s3c2410-lcd",
62771b9114dSArnd Bergmann 	.id		= -1,
62871b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_lcd_resource),
62971b9114dSArnd Bergmann 	.resource	= s3c_lcd_resource,
63071b9114dSArnd Bergmann 	.dev		= {
63171b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
63271b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
63371b9114dSArnd Bergmann 	}
63471b9114dSArnd Bergmann };
63571b9114dSArnd Bergmann 
63671b9114dSArnd Bergmann void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
63771b9114dSArnd Bergmann {
63871b9114dSArnd Bergmann 	struct s3c2410fb_mach_info *npd;
63971b9114dSArnd Bergmann 
64071b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_lcd);
64171b9114dSArnd Bergmann 	if (npd) {
64271b9114dSArnd Bergmann 		npd->displays = kmemdup(pd->displays,
64371b9114dSArnd Bergmann 			sizeof(struct s3c2410fb_display) * npd->num_displays,
64471b9114dSArnd Bergmann 			GFP_KERNEL);
64571b9114dSArnd Bergmann 		if (!npd->displays)
64671b9114dSArnd Bergmann 			printk(KERN_ERR "no memory for LCD display data\n");
64771b9114dSArnd Bergmann 	} else {
64871b9114dSArnd Bergmann 		printk(KERN_ERR "no memory for LCD platform data\n");
64971b9114dSArnd Bergmann 	}
65071b9114dSArnd Bergmann }
65171b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
65271b9114dSArnd Bergmann 
65371b9114dSArnd Bergmann /* NAND */
65471b9114dSArnd Bergmann 
65571b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_NAND
65671b9114dSArnd Bergmann static struct resource s3c_nand_resource[] = {
65771b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_NAND, SZ_1M),
65871b9114dSArnd Bergmann };
65971b9114dSArnd Bergmann 
66071b9114dSArnd Bergmann struct platform_device s3c_device_nand = {
66171b9114dSArnd Bergmann 	.name		= "s3c2410-nand",
66271b9114dSArnd Bergmann 	.id		= -1,
66371b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_nand_resource),
66471b9114dSArnd Bergmann 	.resource	= s3c_nand_resource,
66571b9114dSArnd Bergmann };
66671b9114dSArnd Bergmann 
66771b9114dSArnd Bergmann /*
66871b9114dSArnd Bergmann  * s3c_nand_copy_set() - copy nand set data
66971b9114dSArnd Bergmann  * @set: The new structure, directly copied from the old.
67071b9114dSArnd Bergmann  *
67171b9114dSArnd Bergmann  * Copy all the fields from the NAND set field from what is probably __initdata
67271b9114dSArnd Bergmann  * to new kernel memory. The code returns 0 if the copy happened correctly or
67371b9114dSArnd Bergmann  * an error code for the calling function to display.
67471b9114dSArnd Bergmann  *
67571b9114dSArnd Bergmann  * Note, we currently do not try and look to see if we've already copied the
67671b9114dSArnd Bergmann  * data in a previous set.
67771b9114dSArnd Bergmann  */
67871b9114dSArnd Bergmann static int __init s3c_nand_copy_set(struct s3c2410_nand_set *set)
67971b9114dSArnd Bergmann {
68071b9114dSArnd Bergmann 	void *ptr;
68171b9114dSArnd Bergmann 	int size;
68271b9114dSArnd Bergmann 
68371b9114dSArnd Bergmann 	size = sizeof(struct mtd_partition) * set->nr_partitions;
68471b9114dSArnd Bergmann 	if (size) {
68571b9114dSArnd Bergmann 		ptr = kmemdup(set->partitions, size, GFP_KERNEL);
68671b9114dSArnd Bergmann 		set->partitions = ptr;
68771b9114dSArnd Bergmann 
68871b9114dSArnd Bergmann 		if (!ptr)
68971b9114dSArnd Bergmann 			return -ENOMEM;
69071b9114dSArnd Bergmann 	}
69171b9114dSArnd Bergmann 
69271b9114dSArnd Bergmann 	if (set->nr_map && set->nr_chips) {
69371b9114dSArnd Bergmann 		size = sizeof(int) * set->nr_chips;
69471b9114dSArnd Bergmann 		ptr = kmemdup(set->nr_map, size, GFP_KERNEL);
69571b9114dSArnd Bergmann 		set->nr_map = ptr;
69671b9114dSArnd Bergmann 
69771b9114dSArnd Bergmann 		if (!ptr)
69871b9114dSArnd Bergmann 			return -ENOMEM;
69971b9114dSArnd Bergmann 	}
70071b9114dSArnd Bergmann 
70171b9114dSArnd Bergmann 	return 0;
70271b9114dSArnd Bergmann }
70371b9114dSArnd Bergmann 
70471b9114dSArnd Bergmann void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand)
70571b9114dSArnd Bergmann {
70671b9114dSArnd Bergmann 	struct s3c2410_platform_nand *npd;
70771b9114dSArnd Bergmann 	int size;
70871b9114dSArnd Bergmann 	int ret;
70971b9114dSArnd Bergmann 
71071b9114dSArnd Bergmann 	/* note, if we get a failure in allocation, we simply drop out of the
71171b9114dSArnd Bergmann 	 * function. If there is so little memory available at initialisation
71271b9114dSArnd Bergmann 	 * time then there is little chance the system is going to run.
71371b9114dSArnd Bergmann 	 */
71471b9114dSArnd Bergmann 
71571b9114dSArnd Bergmann 	npd = s3c_set_platdata(nand, sizeof(*npd), &s3c_device_nand);
71671b9114dSArnd Bergmann 	if (!npd)
71771b9114dSArnd Bergmann 		return;
71871b9114dSArnd Bergmann 
71971b9114dSArnd Bergmann 	/* now see if we need to copy any of the nand set data */
72071b9114dSArnd Bergmann 
72171b9114dSArnd Bergmann 	size = sizeof(struct s3c2410_nand_set) * npd->nr_sets;
72271b9114dSArnd Bergmann 	if (size) {
72371b9114dSArnd Bergmann 		struct s3c2410_nand_set *from = npd->sets;
72471b9114dSArnd Bergmann 		struct s3c2410_nand_set *to;
72571b9114dSArnd Bergmann 		int i;
72671b9114dSArnd Bergmann 
72771b9114dSArnd Bergmann 		to = kmemdup(from, size, GFP_KERNEL);
72871b9114dSArnd Bergmann 		npd->sets = to;	/* set, even if we failed */
72971b9114dSArnd Bergmann 
73071b9114dSArnd Bergmann 		if (!to) {
73171b9114dSArnd Bergmann 			printk(KERN_ERR "%s: no memory for sets\n", __func__);
73271b9114dSArnd Bergmann 			return;
73371b9114dSArnd Bergmann 		}
73471b9114dSArnd Bergmann 
73571b9114dSArnd Bergmann 		for (i = 0; i < npd->nr_sets; i++) {
73671b9114dSArnd Bergmann 			ret = s3c_nand_copy_set(to);
73771b9114dSArnd Bergmann 			if (ret) {
73871b9114dSArnd Bergmann 				printk(KERN_ERR "%s: failed to copy set %d\n",
73971b9114dSArnd Bergmann 				__func__, i);
74071b9114dSArnd Bergmann 				return;
74171b9114dSArnd Bergmann 			}
74271b9114dSArnd Bergmann 			to++;
74371b9114dSArnd Bergmann 		}
74471b9114dSArnd Bergmann 	}
74571b9114dSArnd Bergmann }
74671b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_NAND */
74771b9114dSArnd Bergmann 
74871b9114dSArnd Bergmann /* ONENAND */
74971b9114dSArnd Bergmann 
75071b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_ONENAND
75171b9114dSArnd Bergmann static struct resource s3c_onenand_resources[] = {
75271b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_ONENAND, SZ_1K),
75371b9114dSArnd Bergmann 	[1] = DEFINE_RES_MEM(S3C_PA_ONENAND_BUF, S3C_SZ_ONENAND_BUF),
75471b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_ONENAND),
75571b9114dSArnd Bergmann };
75671b9114dSArnd Bergmann 
75771b9114dSArnd Bergmann struct platform_device s3c_device_onenand = {
75871b9114dSArnd Bergmann 	.name		= "samsung-onenand",
75971b9114dSArnd Bergmann 	.id		= 0,
76071b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_onenand_resources),
76171b9114dSArnd Bergmann 	.resource	= s3c_onenand_resources,
76271b9114dSArnd Bergmann };
76371b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_ONENAND */
76471b9114dSArnd Bergmann 
76571b9114dSArnd Bergmann #ifdef CONFIG_S3C64XX_DEV_ONENAND1
76671b9114dSArnd Bergmann static struct resource s3c64xx_onenand1_resources[] = {
76771b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C64XX_PA_ONENAND1, SZ_1K),
76871b9114dSArnd Bergmann 	[1] = DEFINE_RES_MEM(S3C64XX_PA_ONENAND1_BUF, S3C64XX_SZ_ONENAND1_BUF),
76971b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_ONENAND1),
77071b9114dSArnd Bergmann };
77171b9114dSArnd Bergmann 
77271b9114dSArnd Bergmann struct platform_device s3c64xx_device_onenand1 = {
77371b9114dSArnd Bergmann 	.name		= "samsung-onenand",
77471b9114dSArnd Bergmann 	.id		= 1,
77571b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c64xx_onenand1_resources),
77671b9114dSArnd Bergmann 	.resource	= s3c64xx_onenand1_resources,
77771b9114dSArnd Bergmann };
77871b9114dSArnd Bergmann 
77971b9114dSArnd Bergmann void __init s3c64xx_onenand1_set_platdata(struct onenand_platform_data *pdata)
78071b9114dSArnd Bergmann {
78171b9114dSArnd Bergmann 	s3c_set_platdata(pdata, sizeof(struct onenand_platform_data),
78271b9114dSArnd Bergmann 			 &s3c64xx_device_onenand1);
78371b9114dSArnd Bergmann }
78471b9114dSArnd Bergmann #endif /* CONFIG_S3C64XX_DEV_ONENAND1 */
78571b9114dSArnd Bergmann 
78671b9114dSArnd Bergmann /* PWM Timer */
78771b9114dSArnd Bergmann 
78871b9114dSArnd Bergmann #ifdef CONFIG_SAMSUNG_DEV_PWM
78971b9114dSArnd Bergmann static struct resource samsung_pwm_resource[] = {
79071b9114dSArnd Bergmann 	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
79171b9114dSArnd Bergmann };
79271b9114dSArnd Bergmann 
79371b9114dSArnd Bergmann struct platform_device samsung_device_pwm = {
79471b9114dSArnd Bergmann 	.name		= "samsung-pwm",
79571b9114dSArnd Bergmann 	.id		= -1,
79671b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(samsung_pwm_resource),
79771b9114dSArnd Bergmann 	.resource	= samsung_pwm_resource,
79871b9114dSArnd Bergmann };
79971b9114dSArnd Bergmann 
80071b9114dSArnd Bergmann void __init samsung_pwm_set_platdata(struct samsung_pwm_variant *pd)
80171b9114dSArnd Bergmann {
80271b9114dSArnd Bergmann 	samsung_device_pwm.dev.platform_data = pd;
80371b9114dSArnd Bergmann }
80471b9114dSArnd Bergmann #endif /* CONFIG_SAMSUNG_DEV_PWM */
80571b9114dSArnd Bergmann 
80671b9114dSArnd Bergmann /* RTC */
80771b9114dSArnd Bergmann 
80871b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
80971b9114dSArnd Bergmann static struct resource s3c_rtc_resource[] = {
81071b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_RTC, SZ_256),
81171b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_RTC),
81271b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_TICK),
81371b9114dSArnd Bergmann };
81471b9114dSArnd Bergmann 
81571b9114dSArnd Bergmann struct platform_device s3c_device_rtc = {
81671b9114dSArnd Bergmann 	.name		= "s3c2410-rtc",
81771b9114dSArnd Bergmann 	.id		= -1,
81871b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_rtc_resource),
81971b9114dSArnd Bergmann 	.resource	= s3c_rtc_resource,
82071b9114dSArnd Bergmann };
82171b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
82271b9114dSArnd Bergmann 
82371b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_RTC
82471b9114dSArnd Bergmann static struct resource s3c_rtc_resource[] = {
82571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_RTC, SZ_256),
82671b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_RTC_ALARM),
82771b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_RTC_TIC),
82871b9114dSArnd Bergmann };
82971b9114dSArnd Bergmann 
83071b9114dSArnd Bergmann struct platform_device s3c_device_rtc = {
83171b9114dSArnd Bergmann 	.name		= "s3c64xx-rtc",
83271b9114dSArnd Bergmann 	.id		= -1,
83371b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_rtc_resource),
83471b9114dSArnd Bergmann 	.resource	= s3c_rtc_resource,
83571b9114dSArnd Bergmann };
83671b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_RTC */
83771b9114dSArnd Bergmann 
83871b9114dSArnd Bergmann /* SDI */
83971b9114dSArnd Bergmann 
84071b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
84171b9114dSArnd Bergmann void s3c24xx_mci_def_set_power(unsigned char power_mode, unsigned short vdd)
84271b9114dSArnd Bergmann {
84371b9114dSArnd Bergmann 	switch (power_mode) {
84471b9114dSArnd Bergmann 	case MMC_POWER_ON:
84571b9114dSArnd Bergmann 	case MMC_POWER_UP:
84671b9114dSArnd Bergmann 		/* Configure GPE5...GPE10 pins in SD mode */
84771b9114dSArnd Bergmann 		s3c_gpio_cfgall_range(S3C2410_GPE(5), 6, S3C_GPIO_SFN(2),
84871b9114dSArnd Bergmann 				      S3C_GPIO_PULL_NONE);
84971b9114dSArnd Bergmann 		break;
85071b9114dSArnd Bergmann 
85171b9114dSArnd Bergmann 	case MMC_POWER_OFF:
85271b9114dSArnd Bergmann 	default:
85371b9114dSArnd Bergmann 		gpio_direction_output(S3C2410_GPE(5), 0);
85471b9114dSArnd Bergmann 		break;
85571b9114dSArnd Bergmann 	}
85671b9114dSArnd Bergmann }
85771b9114dSArnd Bergmann 
85871b9114dSArnd Bergmann static struct resource s3c_sdi_resource[] = {
85971b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_SDI, S3C24XX_SZ_SDI),
86071b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_SDI),
86171b9114dSArnd Bergmann };
86271b9114dSArnd Bergmann 
86371b9114dSArnd Bergmann static struct s3c24xx_mci_pdata s3cmci_def_pdata = {
86471b9114dSArnd Bergmann 	/* This is currently here to avoid a number of if (host->pdata)
86571b9114dSArnd Bergmann 	 * checks. Any zero fields to ensure reasonable defaults are picked. */
86671b9114dSArnd Bergmann 	.no_wprotect = 1,
86771b9114dSArnd Bergmann 	.no_detect = 1,
86871b9114dSArnd Bergmann 	.set_power = s3c24xx_mci_def_set_power,
86971b9114dSArnd Bergmann };
87071b9114dSArnd Bergmann 
87171b9114dSArnd Bergmann struct platform_device s3c_device_sdi = {
87271b9114dSArnd Bergmann 	.name		= "s3c2410-sdi",
87371b9114dSArnd Bergmann 	.id		= -1,
87471b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_sdi_resource),
87571b9114dSArnd Bergmann 	.resource	= s3c_sdi_resource,
87671b9114dSArnd Bergmann 	.dev.platform_data = &s3cmci_def_pdata,
87771b9114dSArnd Bergmann };
87871b9114dSArnd Bergmann 
87971b9114dSArnd Bergmann void __init s3c24xx_mci_set_platdata(struct s3c24xx_mci_pdata *pdata)
88071b9114dSArnd Bergmann {
88171b9114dSArnd Bergmann 	s3c_set_platdata(pdata, sizeof(struct s3c24xx_mci_pdata),
88271b9114dSArnd Bergmann 			 &s3c_device_sdi);
88371b9114dSArnd Bergmann }
88471b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
88571b9114dSArnd Bergmann 
88671b9114dSArnd Bergmann /* SPI */
88771b9114dSArnd Bergmann 
88871b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
88971b9114dSArnd Bergmann static struct resource s3c_spi0_resource[] = {
89071b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_SPI, SZ_32),
89171b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_SPI0),
89271b9114dSArnd Bergmann };
89371b9114dSArnd Bergmann 
89471b9114dSArnd Bergmann struct platform_device s3c_device_spi0 = {
89571b9114dSArnd Bergmann 	.name		= "s3c2410-spi",
89671b9114dSArnd Bergmann 	.id		= 0,
89771b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_spi0_resource),
89871b9114dSArnd Bergmann 	.resource	= s3c_spi0_resource,
89971b9114dSArnd Bergmann 	.dev		= {
90071b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
90171b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
90271b9114dSArnd Bergmann 	}
90371b9114dSArnd Bergmann };
90471b9114dSArnd Bergmann 
90571b9114dSArnd Bergmann static struct resource s3c_spi1_resource[] = {
90671b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_SPI1, SZ_32),
90771b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_SPI1),
90871b9114dSArnd Bergmann };
90971b9114dSArnd Bergmann 
91071b9114dSArnd Bergmann struct platform_device s3c_device_spi1 = {
91171b9114dSArnd Bergmann 	.name		= "s3c2410-spi",
91271b9114dSArnd Bergmann 	.id		= 1,
91371b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_spi1_resource),
91471b9114dSArnd Bergmann 	.resource	= s3c_spi1_resource,
91571b9114dSArnd Bergmann 	.dev		= {
91671b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
91771b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
91871b9114dSArnd Bergmann 	}
91971b9114dSArnd Bergmann };
92071b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
92171b9114dSArnd Bergmann 
92271b9114dSArnd Bergmann /* Touchscreen */
92371b9114dSArnd Bergmann 
92471b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
92571b9114dSArnd Bergmann static struct resource s3c_ts_resource[] = {
92671b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_ADC, S3C24XX_SZ_ADC),
92771b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_TC),
92871b9114dSArnd Bergmann };
92971b9114dSArnd Bergmann 
93071b9114dSArnd Bergmann struct platform_device s3c_device_ts = {
93171b9114dSArnd Bergmann 	.name		= "s3c2410-ts",
93271b9114dSArnd Bergmann 	.id		= -1,
93371b9114dSArnd Bergmann 	.dev.parent	= &s3c_device_adc.dev,
93471b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_ts_resource),
93571b9114dSArnd Bergmann 	.resource	= s3c_ts_resource,
93671b9114dSArnd Bergmann };
93771b9114dSArnd Bergmann 
93871b9114dSArnd Bergmann void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
93971b9114dSArnd Bergmann {
94071b9114dSArnd Bergmann 	s3c_set_platdata(hard_s3c2410ts_info,
94171b9114dSArnd Bergmann 			 sizeof(struct s3c2410_ts_mach_info), &s3c_device_ts);
94271b9114dSArnd Bergmann }
94371b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
94471b9114dSArnd Bergmann 
94571b9114dSArnd Bergmann #ifdef CONFIG_SAMSUNG_DEV_TS
94671b9114dSArnd Bergmann static struct s3c2410_ts_mach_info default_ts_data __initdata = {
94771b9114dSArnd Bergmann 	.delay			= 10000,
94871b9114dSArnd Bergmann 	.presc			= 49,
94971b9114dSArnd Bergmann 	.oversampling_shift	= 2,
95071b9114dSArnd Bergmann };
95171b9114dSArnd Bergmann 
95271b9114dSArnd Bergmann void __init s3c64xx_ts_set_platdata(struct s3c2410_ts_mach_info *pd)
95371b9114dSArnd Bergmann {
95471b9114dSArnd Bergmann 	if (!pd)
95571b9114dSArnd Bergmann 		pd = &default_ts_data;
95671b9114dSArnd Bergmann 
95771b9114dSArnd Bergmann 	s3c_set_platdata(pd, sizeof(struct s3c2410_ts_mach_info),
95871b9114dSArnd Bergmann 			 &s3c_device_adc);
95971b9114dSArnd Bergmann }
96071b9114dSArnd Bergmann #endif /* CONFIG_SAMSUNG_DEV_TS */
96171b9114dSArnd Bergmann 
96271b9114dSArnd Bergmann /* USB */
96371b9114dSArnd Bergmann 
96471b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_USB_HOST
96571b9114dSArnd Bergmann static struct resource s3c_usb_resource[] = {
96671b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_USBHOST, SZ_256),
96771b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_USBH),
96871b9114dSArnd Bergmann };
96971b9114dSArnd Bergmann 
97071b9114dSArnd Bergmann struct platform_device s3c_device_ohci = {
97171b9114dSArnd Bergmann 	.name		= "s3c2410-ohci",
97271b9114dSArnd Bergmann 	.id		= -1,
97371b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_usb_resource),
97471b9114dSArnd Bergmann 	.resource	= s3c_usb_resource,
97571b9114dSArnd Bergmann 	.dev		= {
97671b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
97771b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
97871b9114dSArnd Bergmann 	}
97971b9114dSArnd Bergmann };
98071b9114dSArnd Bergmann 
98171b9114dSArnd Bergmann /*
98271b9114dSArnd Bergmann  * s3c_ohci_set_platdata - initialise OHCI device platform data
98371b9114dSArnd Bergmann  * @info: The platform data.
98471b9114dSArnd Bergmann  *
98571b9114dSArnd Bergmann  * This call copies the @info passed in and sets the device .platform_data
98671b9114dSArnd Bergmann  * field to that copy. The @info is copied so that the original can be marked
98771b9114dSArnd Bergmann  * __initdata.
98871b9114dSArnd Bergmann  */
98971b9114dSArnd Bergmann 
99071b9114dSArnd Bergmann void __init s3c_ohci_set_platdata(struct s3c2410_hcd_info *info)
99171b9114dSArnd Bergmann {
99271b9114dSArnd Bergmann 	s3c_set_platdata(info, sizeof(struct s3c2410_hcd_info),
99371b9114dSArnd Bergmann 			 &s3c_device_ohci);
99471b9114dSArnd Bergmann }
99571b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_USB_HOST */
99671b9114dSArnd Bergmann 
99771b9114dSArnd Bergmann /* USB Device (Gadget) */
99871b9114dSArnd Bergmann 
99971b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
100071b9114dSArnd Bergmann static struct resource s3c_usbgadget_resource[] = {
100171b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C24XX_PA_USBDEV, S3C24XX_SZ_USBDEV),
100271b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_USBD),
100371b9114dSArnd Bergmann };
100471b9114dSArnd Bergmann 
100571b9114dSArnd Bergmann struct platform_device s3c_device_usbgadget = {
100671b9114dSArnd Bergmann 	.name		= "s3c2410-usbgadget",
100771b9114dSArnd Bergmann 	.id		= -1,
100871b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_usbgadget_resource),
100971b9114dSArnd Bergmann 	.resource	= s3c_usbgadget_resource,
101071b9114dSArnd Bergmann };
101171b9114dSArnd Bergmann 
101271b9114dSArnd Bergmann void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *pd)
101371b9114dSArnd Bergmann {
101471b9114dSArnd Bergmann 	s3c_set_platdata(pd, sizeof(*pd), &s3c_device_usbgadget);
101571b9114dSArnd Bergmann }
101671b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
101771b9114dSArnd Bergmann 
101871b9114dSArnd Bergmann /* USB HSOTG */
101971b9114dSArnd Bergmann 
102071b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_USB_HSOTG
102171b9114dSArnd Bergmann static struct resource s3c_usb_hsotg_resources[] = {
102271b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_128K),
102371b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_OTG),
102471b9114dSArnd Bergmann };
102571b9114dSArnd Bergmann 
102671b9114dSArnd Bergmann struct platform_device s3c_device_usb_hsotg = {
102771b9114dSArnd Bergmann 	.name		= "s3c-hsotg",
102871b9114dSArnd Bergmann 	.id		= -1,
102971b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_usb_hsotg_resources),
103071b9114dSArnd Bergmann 	.resource	= s3c_usb_hsotg_resources,
103171b9114dSArnd Bergmann 	.dev		= {
103271b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
103371b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
103471b9114dSArnd Bergmann 	},
103571b9114dSArnd Bergmann };
103671b9114dSArnd Bergmann 
103771b9114dSArnd Bergmann void __init dwc2_hsotg_set_platdata(struct dwc2_hsotg_plat *pd)
103871b9114dSArnd Bergmann {
103971b9114dSArnd Bergmann 	struct dwc2_hsotg_plat *npd;
104071b9114dSArnd Bergmann 
104171b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_usb_hsotg);
104271b9114dSArnd Bergmann 
104371b9114dSArnd Bergmann 	if (!npd->phy_init)
104471b9114dSArnd Bergmann 		npd->phy_init = s3c_usb_phy_init;
104571b9114dSArnd Bergmann 	if (!npd->phy_exit)
104671b9114dSArnd Bergmann 		npd->phy_exit = s3c_usb_phy_exit;
104771b9114dSArnd Bergmann }
104871b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_USB_HSOTG */
104971b9114dSArnd Bergmann 
105071b9114dSArnd Bergmann /* USB High Spped 2.0 Device (Gadget) */
105171b9114dSArnd Bergmann 
105271b9114dSArnd Bergmann #ifdef CONFIG_PLAT_S3C24XX
105371b9114dSArnd Bergmann static struct resource s3c_hsudc_resource[] = {
105471b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C2416_PA_HSUDC, S3C2416_SZ_HSUDC),
105571b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_USBD),
105671b9114dSArnd Bergmann };
105771b9114dSArnd Bergmann 
105871b9114dSArnd Bergmann struct platform_device s3c_device_usb_hsudc = {
105971b9114dSArnd Bergmann 	.name		= "s3c-hsudc",
106071b9114dSArnd Bergmann 	.id		= -1,
106171b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsudc_resource),
106271b9114dSArnd Bergmann 	.resource	= s3c_hsudc_resource,
106371b9114dSArnd Bergmann 	.dev		= {
106471b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
106571b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
106671b9114dSArnd Bergmann 	},
106771b9114dSArnd Bergmann };
106871b9114dSArnd Bergmann 
106971b9114dSArnd Bergmann void __init s3c24xx_hsudc_set_platdata(struct s3c24xx_hsudc_platdata *pd)
107071b9114dSArnd Bergmann {
107171b9114dSArnd Bergmann 	s3c_set_platdata(pd, sizeof(*pd), &s3c_device_usb_hsudc);
107271b9114dSArnd Bergmann 	pd->phy_init = s3c_hsudc_init_phy;
107371b9114dSArnd Bergmann 	pd->phy_uninit = s3c_hsudc_uninit_phy;
107471b9114dSArnd Bergmann }
107571b9114dSArnd Bergmann #endif /* CONFIG_PLAT_S3C24XX */
107671b9114dSArnd Bergmann 
107771b9114dSArnd Bergmann /* WDT */
107871b9114dSArnd Bergmann 
107971b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_WDT
108071b9114dSArnd Bergmann static struct resource s3c_wdt_resource[] = {
108171b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_WDT, SZ_1K),
108271b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_WDT),
108371b9114dSArnd Bergmann };
108471b9114dSArnd Bergmann 
108571b9114dSArnd Bergmann struct platform_device s3c_device_wdt = {
108671b9114dSArnd Bergmann 	.name		= "s3c2410-wdt",
108771b9114dSArnd Bergmann 	.id		= -1,
108871b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_wdt_resource),
108971b9114dSArnd Bergmann 	.resource	= s3c_wdt_resource,
109071b9114dSArnd Bergmann };
109171b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_WDT */
109271b9114dSArnd Bergmann 
109371b9114dSArnd Bergmann #ifdef CONFIG_S3C64XX_DEV_SPI0
109471b9114dSArnd Bergmann static struct resource s3c64xx_spi0_resource[] = {
109571b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_SPI0, SZ_256),
109671b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_SPI0),
109771b9114dSArnd Bergmann };
109871b9114dSArnd Bergmann 
109971b9114dSArnd Bergmann struct platform_device s3c64xx_device_spi0 = {
110071b9114dSArnd Bergmann 	.name		= "s3c6410-spi",
110171b9114dSArnd Bergmann 	.id		= 0,
110271b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c64xx_spi0_resource),
110371b9114dSArnd Bergmann 	.resource	= s3c64xx_spi0_resource,
110471b9114dSArnd Bergmann 	.dev = {
110571b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
110671b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
110771b9114dSArnd Bergmann 	},
110871b9114dSArnd Bergmann };
110971b9114dSArnd Bergmann 
111071b9114dSArnd Bergmann void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr,
111171b9114dSArnd Bergmann 						int num_cs)
111271b9114dSArnd Bergmann {
111371b9114dSArnd Bergmann 	struct s3c64xx_spi_info pd;
111471b9114dSArnd Bergmann 
111571b9114dSArnd Bergmann 	/* Reject invalid configuration */
111671b9114dSArnd Bergmann 	if (!num_cs || src_clk_nr < 0) {
111771b9114dSArnd Bergmann 		pr_err("%s: Invalid SPI configuration\n", __func__);
111871b9114dSArnd Bergmann 		return;
111971b9114dSArnd Bergmann 	}
112071b9114dSArnd Bergmann 
112171b9114dSArnd Bergmann 	pd.num_cs = num_cs;
112271b9114dSArnd Bergmann 	pd.src_clk_nr = src_clk_nr;
112371b9114dSArnd Bergmann 	pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio;
112471b9114dSArnd Bergmann 
112571b9114dSArnd Bergmann 	s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi0);
112671b9114dSArnd Bergmann }
112771b9114dSArnd Bergmann #endif /* CONFIG_S3C64XX_DEV_SPI0 */
112871b9114dSArnd Bergmann 
112971b9114dSArnd Bergmann #ifdef CONFIG_S3C64XX_DEV_SPI1
113071b9114dSArnd Bergmann static struct resource s3c64xx_spi1_resource[] = {
113171b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_SPI1, SZ_256),
113271b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_SPI1),
113371b9114dSArnd Bergmann };
113471b9114dSArnd Bergmann 
113571b9114dSArnd Bergmann struct platform_device s3c64xx_device_spi1 = {
113671b9114dSArnd Bergmann 	.name		= "s3c6410-spi",
113771b9114dSArnd Bergmann 	.id		= 1,
113871b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c64xx_spi1_resource),
113971b9114dSArnd Bergmann 	.resource	= s3c64xx_spi1_resource,
114071b9114dSArnd Bergmann 	.dev = {
114171b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
114271b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
114371b9114dSArnd Bergmann 	},
114471b9114dSArnd Bergmann };
114571b9114dSArnd Bergmann 
114671b9114dSArnd Bergmann void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr,
114771b9114dSArnd Bergmann 						int num_cs)
114871b9114dSArnd Bergmann {
114971b9114dSArnd Bergmann 	struct s3c64xx_spi_info pd;
115071b9114dSArnd Bergmann 
115171b9114dSArnd Bergmann 	/* Reject invalid configuration */
115271b9114dSArnd Bergmann 	if (!num_cs || src_clk_nr < 0) {
115371b9114dSArnd Bergmann 		pr_err("%s: Invalid SPI configuration\n", __func__);
115471b9114dSArnd Bergmann 		return;
115571b9114dSArnd Bergmann 	}
115671b9114dSArnd Bergmann 
115771b9114dSArnd Bergmann 	pd.num_cs = num_cs;
115871b9114dSArnd Bergmann 	pd.src_clk_nr = src_clk_nr;
115971b9114dSArnd Bergmann 	pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio;
116071b9114dSArnd Bergmann 
116171b9114dSArnd Bergmann 	s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1);
116271b9114dSArnd Bergmann }
116371b9114dSArnd Bergmann #endif /* CONFIG_S3C64XX_DEV_SPI1 */
116471b9114dSArnd Bergmann 
116571b9114dSArnd Bergmann #ifdef CONFIG_S3C64XX_DEV_SPI2
116671b9114dSArnd Bergmann static struct resource s3c64xx_spi2_resource[] = {
116771b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_SPI2, SZ_256),
116871b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_SPI2),
116971b9114dSArnd Bergmann };
117071b9114dSArnd Bergmann 
117171b9114dSArnd Bergmann struct platform_device s3c64xx_device_spi2 = {
117271b9114dSArnd Bergmann 	.name		= "s3c6410-spi",
117371b9114dSArnd Bergmann 	.id		= 2,
117471b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c64xx_spi2_resource),
117571b9114dSArnd Bergmann 	.resource	= s3c64xx_spi2_resource,
117671b9114dSArnd Bergmann 	.dev = {
117771b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
117871b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
117971b9114dSArnd Bergmann 	},
118071b9114dSArnd Bergmann };
118171b9114dSArnd Bergmann 
118271b9114dSArnd Bergmann void __init s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr,
118371b9114dSArnd Bergmann 						int num_cs)
118471b9114dSArnd Bergmann {
118571b9114dSArnd Bergmann 	struct s3c64xx_spi_info pd;
118671b9114dSArnd Bergmann 
118771b9114dSArnd Bergmann 	/* Reject invalid configuration */
118871b9114dSArnd Bergmann 	if (!num_cs || src_clk_nr < 0) {
118971b9114dSArnd Bergmann 		pr_err("%s: Invalid SPI configuration\n", __func__);
119071b9114dSArnd Bergmann 		return;
119171b9114dSArnd Bergmann 	}
119271b9114dSArnd Bergmann 
119371b9114dSArnd Bergmann 	pd.num_cs = num_cs;
119471b9114dSArnd Bergmann 	pd.src_clk_nr = src_clk_nr;
119571b9114dSArnd Bergmann 	pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio;
119671b9114dSArnd Bergmann 
119771b9114dSArnd Bergmann 	s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2);
119871b9114dSArnd Bergmann }
119971b9114dSArnd Bergmann #endif /* CONFIG_S3C64XX_DEV_SPI2 */
1200