xref: /openbmc/linux/arch/arm/mach-s3c/devs.c (revision 0d297df0)
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/mmc/host.h>
2571b9114dSArnd Bergmann #include <linux/ioport.h>
2671b9114dSArnd Bergmann #include <linux/sizes.h>
2771b9114dSArnd Bergmann #include <linux/platform_data/s3c-hsotg.h>
2871b9114dSArnd Bergmann 
2971b9114dSArnd Bergmann #include <asm/irq.h>
3071b9114dSArnd Bergmann #include <asm/mach/arch.h>
3171b9114dSArnd Bergmann #include <asm/mach/map.h>
3271b9114dSArnd Bergmann #include <asm/mach/irq.h>
3371b9114dSArnd Bergmann 
34*c78a41fcSArnd Bergmann #include "irqs.h"
35c6ff132dSArnd Bergmann #include "map.h"
36c6ff132dSArnd Bergmann #include "gpio-samsung.h"
37c6ff132dSArnd Bergmann #include "gpio-cfg.h"
3871b9114dSArnd Bergmann 
39c6ff132dSArnd Bergmann #include "cpu.h"
40c6ff132dSArnd Bergmann #include "devs.h"
41c6ff132dSArnd Bergmann #include "fb.h"
4271b9114dSArnd Bergmann #include <linux/platform_data/i2c-s3c2410.h>
43c6ff132dSArnd Bergmann #include "keypad.h"
44c6ff132dSArnd Bergmann #include "pwm-core.h"
45c6ff132dSArnd Bergmann #include "sdhci.h"
46c6ff132dSArnd Bergmann #include "usb-phy.h"
4771b9114dSArnd Bergmann #include <linux/platform_data/asoc-s3c.h>
4871b9114dSArnd Bergmann #include <linux/platform_data/spi-s3c64xx.h>
4971b9114dSArnd Bergmann 
5071b9114dSArnd Bergmann #define samsung_device_dma_mask (*((u64[]) { DMA_BIT_MASK(32) }))
5171b9114dSArnd Bergmann 
5271b9114dSArnd Bergmann /* FB */
5371b9114dSArnd Bergmann 
5471b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_FB
5571b9114dSArnd Bergmann static struct resource s3c_fb_resource[] = {
5671b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_FB, SZ_16K),
5771b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_LCD_VSYNC),
5871b9114dSArnd Bergmann 	[2] = DEFINE_RES_IRQ(IRQ_LCD_FIFO),
5971b9114dSArnd Bergmann 	[3] = DEFINE_RES_IRQ(IRQ_LCD_SYSTEM),
6071b9114dSArnd Bergmann };
6171b9114dSArnd Bergmann 
6271b9114dSArnd Bergmann struct platform_device s3c_device_fb = {
6371b9114dSArnd Bergmann 	.name		= "s3c-fb",
6471b9114dSArnd Bergmann 	.id		= -1,
6571b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_fb_resource),
6671b9114dSArnd Bergmann 	.resource	= s3c_fb_resource,
6771b9114dSArnd Bergmann 	.dev		= {
6871b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
6971b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
7071b9114dSArnd Bergmann 	},
7171b9114dSArnd Bergmann };
7271b9114dSArnd Bergmann 
s3c_fb_set_platdata(struct s3c_fb_platdata * pd)7371b9114dSArnd Bergmann void __init s3c_fb_set_platdata(struct s3c_fb_platdata *pd)
7471b9114dSArnd Bergmann {
7571b9114dSArnd Bergmann 	s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
7671b9114dSArnd Bergmann 			 &s3c_device_fb);
7771b9114dSArnd Bergmann }
7871b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_FB */
7971b9114dSArnd Bergmann 
8071b9114dSArnd Bergmann /* HSMMC */
8171b9114dSArnd Bergmann 
8271b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC
8371b9114dSArnd Bergmann static struct resource s3c_hsmmc_resource[] = {
8471b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC0, SZ_4K),
8571b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC0),
8671b9114dSArnd Bergmann };
8771b9114dSArnd Bergmann 
8871b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata = {
8971b9114dSArnd Bergmann 	.max_width	= 4,
9071b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
9171b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
9271b9114dSArnd Bergmann };
9371b9114dSArnd Bergmann 
9471b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc0 = {
9571b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
9671b9114dSArnd Bergmann 	.id		= 0,
9771b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc_resource),
9871b9114dSArnd Bergmann 	.resource	= s3c_hsmmc_resource,
9971b9114dSArnd Bergmann 	.dev		= {
10071b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
10171b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
10271b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc0_def_platdata,
10371b9114dSArnd Bergmann 	},
10471b9114dSArnd Bergmann };
10571b9114dSArnd Bergmann 
s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata * pd)10671b9114dSArnd Bergmann void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd)
10771b9114dSArnd Bergmann {
10871b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc0_def_platdata);
10971b9114dSArnd Bergmann }
11071b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC */
11171b9114dSArnd Bergmann 
11271b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC1
11371b9114dSArnd Bergmann static struct resource s3c_hsmmc1_resource[] = {
11471b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC1, SZ_4K),
11571b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC1),
11671b9114dSArnd Bergmann };
11771b9114dSArnd Bergmann 
11871b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata = {
11971b9114dSArnd Bergmann 	.max_width	= 4,
12071b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
12171b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
12271b9114dSArnd Bergmann };
12371b9114dSArnd Bergmann 
12471b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc1 = {
12571b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
12671b9114dSArnd Bergmann 	.id		= 1,
12771b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc1_resource),
12871b9114dSArnd Bergmann 	.resource	= s3c_hsmmc1_resource,
12971b9114dSArnd Bergmann 	.dev		= {
13071b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
13171b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
13271b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc1_def_platdata,
13371b9114dSArnd Bergmann 	},
13471b9114dSArnd Bergmann };
13571b9114dSArnd Bergmann 
s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata * pd)13671b9114dSArnd Bergmann void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd)
13771b9114dSArnd Bergmann {
13871b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc1_def_platdata);
13971b9114dSArnd Bergmann }
14071b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC1 */
14171b9114dSArnd Bergmann 
14271b9114dSArnd Bergmann /* HSMMC2 */
14371b9114dSArnd Bergmann 
14471b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC2
14571b9114dSArnd Bergmann static struct resource s3c_hsmmc2_resource[] = {
14671b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC2, SZ_4K),
14771b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC2),
14871b9114dSArnd Bergmann };
14971b9114dSArnd Bergmann 
15071b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata = {
15171b9114dSArnd Bergmann 	.max_width	= 4,
15271b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
15371b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
15471b9114dSArnd Bergmann };
15571b9114dSArnd Bergmann 
15671b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc2 = {
15771b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
15871b9114dSArnd Bergmann 	.id		= 2,
15971b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc2_resource),
16071b9114dSArnd Bergmann 	.resource	= s3c_hsmmc2_resource,
16171b9114dSArnd Bergmann 	.dev		= {
16271b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
16371b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
16471b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc2_def_platdata,
16571b9114dSArnd Bergmann 	},
16671b9114dSArnd Bergmann };
16771b9114dSArnd Bergmann 
s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata * pd)16871b9114dSArnd Bergmann void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd)
16971b9114dSArnd Bergmann {
17071b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc2_def_platdata);
17171b9114dSArnd Bergmann }
17271b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC2 */
17371b9114dSArnd Bergmann 
17471b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_HSMMC3
17571b9114dSArnd Bergmann static struct resource s3c_hsmmc3_resource[] = {
17671b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_HSMMC3, SZ_4K),
17771b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_HSMMC3),
17871b9114dSArnd Bergmann };
17971b9114dSArnd Bergmann 
18071b9114dSArnd Bergmann struct s3c_sdhci_platdata s3c_hsmmc3_def_platdata = {
18171b9114dSArnd Bergmann 	.max_width	= 4,
18271b9114dSArnd Bergmann 	.host_caps	= (MMC_CAP_4_BIT_DATA |
18371b9114dSArnd Bergmann 			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
18471b9114dSArnd Bergmann };
18571b9114dSArnd Bergmann 
18671b9114dSArnd Bergmann struct platform_device s3c_device_hsmmc3 = {
18771b9114dSArnd Bergmann 	.name		= "s3c-sdhci",
18871b9114dSArnd Bergmann 	.id		= 3,
18971b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_hsmmc3_resource),
19071b9114dSArnd Bergmann 	.resource	= s3c_hsmmc3_resource,
19171b9114dSArnd Bergmann 	.dev		= {
19271b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
19371b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
19471b9114dSArnd Bergmann 		.platform_data		= &s3c_hsmmc3_def_platdata,
19571b9114dSArnd Bergmann 	},
19671b9114dSArnd Bergmann };
19771b9114dSArnd Bergmann 
s3c_sdhci3_set_platdata(struct s3c_sdhci_platdata * pd)19871b9114dSArnd Bergmann void s3c_sdhci3_set_platdata(struct s3c_sdhci_platdata *pd)
19971b9114dSArnd Bergmann {
20071b9114dSArnd Bergmann 	s3c_sdhci_set_platdata(pd, &s3c_hsmmc3_def_platdata);
20171b9114dSArnd Bergmann }
20271b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_HSMMC3 */
20371b9114dSArnd Bergmann 
20471b9114dSArnd Bergmann /* I2C */
20571b9114dSArnd Bergmann 
20671b9114dSArnd Bergmann static struct resource s3c_i2c0_resource[] = {
20771b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC, SZ_4K),
20871b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC),
20971b9114dSArnd Bergmann };
21071b9114dSArnd Bergmann 
21171b9114dSArnd Bergmann struct platform_device s3c_device_i2c0 = {
21271b9114dSArnd Bergmann 	.name		= "s3c2410-i2c",
21371b9114dSArnd Bergmann 	.id		= 0,
21471b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c0_resource),
21571b9114dSArnd Bergmann 	.resource	= s3c_i2c0_resource,
21671b9114dSArnd Bergmann };
21771b9114dSArnd Bergmann 
21871b9114dSArnd Bergmann struct s3c2410_platform_i2c default_i2c_data __initdata = {
21971b9114dSArnd Bergmann 	.flags		= 0,
22071b9114dSArnd Bergmann 	.slave_addr	= 0x10,
22171b9114dSArnd Bergmann 	.frequency	= 100*1000,
22271b9114dSArnd Bergmann 	.sda_delay	= 100,
22371b9114dSArnd Bergmann };
22471b9114dSArnd Bergmann 
s3c_i2c0_set_platdata(struct s3c2410_platform_i2c * pd)22571b9114dSArnd Bergmann void __init s3c_i2c0_set_platdata(struct s3c2410_platform_i2c *pd)
22671b9114dSArnd Bergmann {
22771b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
22871b9114dSArnd Bergmann 
22971b9114dSArnd Bergmann 	if (!pd) {
23071b9114dSArnd Bergmann 		pd = &default_i2c_data;
23171b9114dSArnd Bergmann 		pd->bus_num = 0;
23271b9114dSArnd Bergmann 	}
23371b9114dSArnd Bergmann 
23471b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c0);
23571b9114dSArnd Bergmann 
23671b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
23771b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c0_cfg_gpio;
23871b9114dSArnd Bergmann }
23971b9114dSArnd Bergmann 
24071b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_I2C1
24171b9114dSArnd Bergmann static struct resource s3c_i2c1_resource[] = {
24271b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_IIC1, SZ_4K),
24371b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_IIC1),
24471b9114dSArnd Bergmann };
24571b9114dSArnd Bergmann 
24671b9114dSArnd Bergmann struct platform_device s3c_device_i2c1 = {
24771b9114dSArnd Bergmann 	.name		= "s3c2410-i2c",
24871b9114dSArnd Bergmann 	.id		= 1,
24971b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_i2c1_resource),
25071b9114dSArnd Bergmann 	.resource	= s3c_i2c1_resource,
25171b9114dSArnd Bergmann };
25271b9114dSArnd Bergmann 
s3c_i2c1_set_platdata(struct s3c2410_platform_i2c * pd)25371b9114dSArnd Bergmann void __init s3c_i2c1_set_platdata(struct s3c2410_platform_i2c *pd)
25471b9114dSArnd Bergmann {
25571b9114dSArnd Bergmann 	struct s3c2410_platform_i2c *npd;
25671b9114dSArnd Bergmann 
25771b9114dSArnd Bergmann 	if (!pd) {
25871b9114dSArnd Bergmann 		pd = &default_i2c_data;
25971b9114dSArnd Bergmann 		pd->bus_num = 1;
26071b9114dSArnd Bergmann 	}
26171b9114dSArnd Bergmann 
26271b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_i2c1);
26371b9114dSArnd Bergmann 
26471b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
26571b9114dSArnd Bergmann 		npd->cfg_gpio = s3c_i2c1_cfg_gpio;
26671b9114dSArnd Bergmann }
26771b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_I2C1 */
26871b9114dSArnd Bergmann 
26971b9114dSArnd Bergmann /* KEYPAD */
27071b9114dSArnd Bergmann 
27171b9114dSArnd Bergmann #ifdef CONFIG_SAMSUNG_DEV_KEYPAD
27271b9114dSArnd Bergmann static struct resource samsung_keypad_resources[] = {
27371b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(SAMSUNG_PA_KEYPAD, SZ_32),
27471b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_KEYPAD),
27571b9114dSArnd Bergmann };
27671b9114dSArnd Bergmann 
27771b9114dSArnd Bergmann struct platform_device samsung_device_keypad = {
27871b9114dSArnd Bergmann 	.name		= "samsung-keypad",
27971b9114dSArnd Bergmann 	.id		= -1,
28071b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(samsung_keypad_resources),
28171b9114dSArnd Bergmann 	.resource	= samsung_keypad_resources,
28271b9114dSArnd Bergmann };
28371b9114dSArnd Bergmann 
samsung_keypad_set_platdata(struct samsung_keypad_platdata * pd)28471b9114dSArnd Bergmann void __init samsung_keypad_set_platdata(struct samsung_keypad_platdata *pd)
28571b9114dSArnd Bergmann {
28671b9114dSArnd Bergmann 	struct samsung_keypad_platdata *npd;
28771b9114dSArnd Bergmann 
28871b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &samsung_device_keypad);
28971b9114dSArnd Bergmann 
29071b9114dSArnd Bergmann 	if (!npd->cfg_gpio)
29171b9114dSArnd Bergmann 		npd->cfg_gpio = samsung_keypad_cfg_gpio;
29271b9114dSArnd Bergmann }
29371b9114dSArnd Bergmann #endif /* CONFIG_SAMSUNG_DEV_KEYPAD */
29471b9114dSArnd Bergmann 
29571b9114dSArnd Bergmann /* PWM Timer */
29671b9114dSArnd Bergmann 
29771b9114dSArnd Bergmann #ifdef CONFIG_SAMSUNG_DEV_PWM
29871b9114dSArnd Bergmann static struct resource samsung_pwm_resource[] = {
29971b9114dSArnd Bergmann 	DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
30071b9114dSArnd Bergmann };
30171b9114dSArnd Bergmann 
30271b9114dSArnd Bergmann struct platform_device samsung_device_pwm = {
30371b9114dSArnd Bergmann 	.name		= "samsung-pwm",
30471b9114dSArnd Bergmann 	.id		= -1,
30571b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(samsung_pwm_resource),
30671b9114dSArnd Bergmann 	.resource	= samsung_pwm_resource,
30771b9114dSArnd Bergmann };
30871b9114dSArnd Bergmann 
samsung_pwm_set_platdata(struct samsung_pwm_variant * pd)30971b9114dSArnd Bergmann void __init samsung_pwm_set_platdata(struct samsung_pwm_variant *pd)
31071b9114dSArnd Bergmann {
31171b9114dSArnd Bergmann 	samsung_device_pwm.dev.platform_data = pd;
31271b9114dSArnd Bergmann }
31371b9114dSArnd Bergmann #endif /* CONFIG_SAMSUNG_DEV_PWM */
31471b9114dSArnd Bergmann 
31571b9114dSArnd Bergmann /* USB */
31671b9114dSArnd Bergmann 
31771b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_USB_HOST
31871b9114dSArnd Bergmann static struct resource s3c_usb_resource[] = {
31971b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_USBHOST, SZ_256),
32071b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_USBH),
32171b9114dSArnd Bergmann };
32271b9114dSArnd Bergmann 
32371b9114dSArnd Bergmann struct platform_device s3c_device_ohci = {
32471b9114dSArnd Bergmann 	.name		= "s3c2410-ohci",
32571b9114dSArnd Bergmann 	.id		= -1,
32671b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_usb_resource),
32771b9114dSArnd Bergmann 	.resource	= s3c_usb_resource,
32871b9114dSArnd Bergmann 	.dev		= {
32971b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
33071b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
33171b9114dSArnd Bergmann 	}
33271b9114dSArnd Bergmann };
33371b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_USB_HOST */
33471b9114dSArnd Bergmann 
33571b9114dSArnd Bergmann /* USB HSOTG */
33671b9114dSArnd Bergmann 
33771b9114dSArnd Bergmann #ifdef CONFIG_S3C_DEV_USB_HSOTG
33871b9114dSArnd Bergmann static struct resource s3c_usb_hsotg_resources[] = {
33971b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_USB_HSOTG, SZ_128K),
34071b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_OTG),
34171b9114dSArnd Bergmann };
34271b9114dSArnd Bergmann 
34371b9114dSArnd Bergmann struct platform_device s3c_device_usb_hsotg = {
34471b9114dSArnd Bergmann 	.name		= "s3c-hsotg",
34571b9114dSArnd Bergmann 	.id		= -1,
34671b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c_usb_hsotg_resources),
34771b9114dSArnd Bergmann 	.resource	= s3c_usb_hsotg_resources,
34871b9114dSArnd Bergmann 	.dev		= {
34971b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
35071b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
35171b9114dSArnd Bergmann 	},
35271b9114dSArnd Bergmann };
35371b9114dSArnd Bergmann 
dwc2_hsotg_set_platdata(struct dwc2_hsotg_plat * pd)35471b9114dSArnd Bergmann void __init dwc2_hsotg_set_platdata(struct dwc2_hsotg_plat *pd)
35571b9114dSArnd Bergmann {
35671b9114dSArnd Bergmann 	struct dwc2_hsotg_plat *npd;
35771b9114dSArnd Bergmann 
35871b9114dSArnd Bergmann 	npd = s3c_set_platdata(pd, sizeof(*npd), &s3c_device_usb_hsotg);
35971b9114dSArnd Bergmann 
36071b9114dSArnd Bergmann 	if (!npd->phy_init)
36171b9114dSArnd Bergmann 		npd->phy_init = s3c_usb_phy_init;
36271b9114dSArnd Bergmann 	if (!npd->phy_exit)
36371b9114dSArnd Bergmann 		npd->phy_exit = s3c_usb_phy_exit;
36471b9114dSArnd Bergmann }
36571b9114dSArnd Bergmann #endif /* CONFIG_S3C_DEV_USB_HSOTG */
36671b9114dSArnd Bergmann 
36771b9114dSArnd Bergmann #ifdef CONFIG_S3C64XX_DEV_SPI0
36871b9114dSArnd Bergmann static struct resource s3c64xx_spi0_resource[] = {
36971b9114dSArnd Bergmann 	[0] = DEFINE_RES_MEM(S3C_PA_SPI0, SZ_256),
37071b9114dSArnd Bergmann 	[1] = DEFINE_RES_IRQ(IRQ_SPI0),
37171b9114dSArnd Bergmann };
37271b9114dSArnd Bergmann 
37371b9114dSArnd Bergmann struct platform_device s3c64xx_device_spi0 = {
37471b9114dSArnd Bergmann 	.name		= "s3c6410-spi",
37571b9114dSArnd Bergmann 	.id		= 0,
37671b9114dSArnd Bergmann 	.num_resources	= ARRAY_SIZE(s3c64xx_spi0_resource),
37771b9114dSArnd Bergmann 	.resource	= s3c64xx_spi0_resource,
37871b9114dSArnd Bergmann 	.dev = {
37971b9114dSArnd Bergmann 		.dma_mask		= &samsung_device_dma_mask,
38071b9114dSArnd Bergmann 		.coherent_dma_mask	= DMA_BIT_MASK(32),
38171b9114dSArnd Bergmann 	},
38271b9114dSArnd Bergmann };
38371b9114dSArnd Bergmann 
s3c64xx_spi0_set_platdata(int src_clk_nr,int num_cs)3843b5529aeSLinus Walleij void __init s3c64xx_spi0_set_platdata(int src_clk_nr, int num_cs)
38571b9114dSArnd Bergmann {
38671b9114dSArnd Bergmann 	struct s3c64xx_spi_info pd;
38771b9114dSArnd Bergmann 
38871b9114dSArnd Bergmann 	/* Reject invalid configuration */
38971b9114dSArnd Bergmann 	if (!num_cs || src_clk_nr < 0) {
39071b9114dSArnd Bergmann 		pr_err("%s: Invalid SPI configuration\n", __func__);
39171b9114dSArnd Bergmann 		return;
39271b9114dSArnd Bergmann 	}
39371b9114dSArnd Bergmann 
39471b9114dSArnd Bergmann 	pd.num_cs = num_cs;
39571b9114dSArnd Bergmann 	pd.src_clk_nr = src_clk_nr;
3963b5529aeSLinus Walleij 	pd.cfg_gpio = s3c64xx_spi0_cfg_gpio;
39771b9114dSArnd Bergmann 
39871b9114dSArnd Bergmann 	s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi0);
39971b9114dSArnd Bergmann }
40071b9114dSArnd Bergmann #endif /* CONFIG_S3C64XX_DEV_SPI0 */
401