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