1da2014a2SPaul Mundt /*
2da2014a2SPaul Mundt  * arch/sh/boards/renesas/x3proto/setup.c
3da2014a2SPaul Mundt  *
4da2014a2SPaul Mundt  * Renesas SH-X3 Prototype Board Support.
5da2014a2SPaul Mundt  *
6e77eb364SPaul Mundt  * Copyright (C) 2007 - 2008 Paul Mundt
7da2014a2SPaul Mundt  *
8da2014a2SPaul Mundt  * This file is subject to the terms and conditions of the GNU General Public
9da2014a2SPaul Mundt  * License.  See the file "COPYING" in the main directory of this archive
10da2014a2SPaul Mundt  * for more details.
11da2014a2SPaul Mundt  */
12da2014a2SPaul Mundt #include <linux/init.h>
13da2014a2SPaul Mundt #include <linux/platform_device.h>
14da2014a2SPaul Mundt #include <linux/kernel.h>
15da2014a2SPaul Mundt #include <linux/io.h>
16e77eb364SPaul Mundt #include <linux/smc91x.h>
17da2014a2SPaul Mundt #include <asm/ilsel.h>
18da2014a2SPaul Mundt 
19da2014a2SPaul Mundt static struct resource heartbeat_resources[] = {
20da2014a2SPaul Mundt 	[0] = {
21da2014a2SPaul Mundt 		.start	= 0xb8140020,
22da2014a2SPaul Mundt 		.end	= 0xb8140020,
23da2014a2SPaul Mundt 		.flags	= IORESOURCE_MEM,
24da2014a2SPaul Mundt 	},
25da2014a2SPaul Mundt };
26da2014a2SPaul Mundt 
27da2014a2SPaul Mundt static struct platform_device heartbeat_device = {
28da2014a2SPaul Mundt 	.name		= "heartbeat",
29da2014a2SPaul Mundt 	.id		= -1,
30da2014a2SPaul Mundt 	.num_resources	= ARRAY_SIZE(heartbeat_resources),
31da2014a2SPaul Mundt 	.resource	= heartbeat_resources,
32da2014a2SPaul Mundt };
33da2014a2SPaul Mundt 
34e77eb364SPaul Mundt static struct smc91x_platdata smc91x_info = {
35e77eb364SPaul Mundt 	.flags	= SMC91X_USE_16BIT | SMC91X_NOWAIT,
36e77eb364SPaul Mundt };
37e77eb364SPaul Mundt 
38da2014a2SPaul Mundt static struct resource smc91x_resources[] = {
39da2014a2SPaul Mundt 	[0] = {
40da2014a2SPaul Mundt 		.start		= 0x18000300,
41da2014a2SPaul Mundt 		.end		= 0x18000300 + 0x10 - 1,
42da2014a2SPaul Mundt 		.flags		= IORESOURCE_MEM,
43da2014a2SPaul Mundt 	},
44da2014a2SPaul Mundt 	[1] = {
45da2014a2SPaul Mundt 		/* Filled in by ilsel */
46da2014a2SPaul Mundt 		.flags		= IORESOURCE_IRQ,
47da2014a2SPaul Mundt 	},
48da2014a2SPaul Mundt };
49da2014a2SPaul Mundt 
50da2014a2SPaul Mundt static struct platform_device smc91x_device = {
51da2014a2SPaul Mundt 	.name		= "smc91x",
52da2014a2SPaul Mundt 	.id		= -1,
53da2014a2SPaul Mundt 	.resource	= smc91x_resources,
54da2014a2SPaul Mundt 	.num_resources	= ARRAY_SIZE(smc91x_resources),
55e77eb364SPaul Mundt 	.dev	= {
56e77eb364SPaul Mundt 		.platform_data = &smc91x_info,
57e77eb364SPaul Mundt 	},
58da2014a2SPaul Mundt };
59da2014a2SPaul Mundt 
60da2014a2SPaul Mundt static struct resource r8a66597_usb_host_resources[] = {
61da2014a2SPaul Mundt 	[0] = {
62da2014a2SPaul Mundt 		.name	= "r8a66597_hcd",
63da2014a2SPaul Mundt 		.start	= 0x18040000,
64da2014a2SPaul Mundt 		.end	= 0x18080000 - 1,
65da2014a2SPaul Mundt 		.flags	= IORESOURCE_MEM,
66da2014a2SPaul Mundt 	},
67da2014a2SPaul Mundt 	[1] = {
68da2014a2SPaul Mundt 		.name	= "r8a66597_hcd",
69da2014a2SPaul Mundt 		/* Filled in by ilsel */
70da2014a2SPaul Mundt 		.flags	= IORESOURCE_IRQ,
71da2014a2SPaul Mundt 	},
72da2014a2SPaul Mundt };
73da2014a2SPaul Mundt 
74da2014a2SPaul Mundt static struct platform_device r8a66597_usb_host_device = {
75da2014a2SPaul Mundt 	.name		= "r8a66597_hcd",
76da2014a2SPaul Mundt 	.id		= -1,
77da2014a2SPaul Mundt 	.dev = {
78da2014a2SPaul Mundt 		.dma_mask		= NULL,		/* don't use dma */
79da2014a2SPaul Mundt 		.coherent_dma_mask	= 0xffffffff,
80da2014a2SPaul Mundt 	},
81da2014a2SPaul Mundt 	.num_resources	= ARRAY_SIZE(r8a66597_usb_host_resources),
82da2014a2SPaul Mundt 	.resource	= r8a66597_usb_host_resources,
83da2014a2SPaul Mundt };
84da2014a2SPaul Mundt 
85da2014a2SPaul Mundt static struct resource m66592_usb_peripheral_resources[] = {
86da2014a2SPaul Mundt 	[0] = {
87da2014a2SPaul Mundt 		.name	= "m66592_udc",
88da2014a2SPaul Mundt 		.start	= 0x18080000,
89da2014a2SPaul Mundt 		.end	= 0x180c0000 - 1,
90da2014a2SPaul Mundt 		.flags	= IORESOURCE_MEM,
91da2014a2SPaul Mundt 	},
92da2014a2SPaul Mundt 	[1] = {
93da2014a2SPaul Mundt 		.name	= "m66592_udc",
94da2014a2SPaul Mundt 		/* Filled in by ilsel */
95da2014a2SPaul Mundt 		.flags	= IORESOURCE_IRQ,
96da2014a2SPaul Mundt 	},
97da2014a2SPaul Mundt };
98da2014a2SPaul Mundt 
99da2014a2SPaul Mundt static struct platform_device m66592_usb_peripheral_device = {
100da2014a2SPaul Mundt 	.name		= "m66592_udc",
101da2014a2SPaul Mundt 	.id		= -1,
102da2014a2SPaul Mundt 	.dev = {
103da2014a2SPaul Mundt 		.dma_mask		= NULL,		/* don't use dma */
104da2014a2SPaul Mundt 		.coherent_dma_mask	= 0xffffffff,
105da2014a2SPaul Mundt 	},
106da2014a2SPaul Mundt 	.num_resources	= ARRAY_SIZE(m66592_usb_peripheral_resources),
107da2014a2SPaul Mundt 	.resource	= m66592_usb_peripheral_resources,
108da2014a2SPaul Mundt };
109da2014a2SPaul Mundt 
110da2014a2SPaul Mundt static struct platform_device *x3proto_devices[] __initdata = {
111da2014a2SPaul Mundt 	&heartbeat_device,
112da2014a2SPaul Mundt 	&smc91x_device,
113da2014a2SPaul Mundt 	&r8a66597_usb_host_device,
114da2014a2SPaul Mundt 	&m66592_usb_peripheral_device,
115da2014a2SPaul Mundt };
116da2014a2SPaul Mundt 
117da2014a2SPaul Mundt static int __init x3proto_devices_setup(void)
118da2014a2SPaul Mundt {
119da2014a2SPaul Mundt 	r8a66597_usb_host_resources[1].start =
120da2014a2SPaul Mundt 		r8a66597_usb_host_resources[1].end = ilsel_enable(ILSEL_USBH_I);
121da2014a2SPaul Mundt 
122da2014a2SPaul Mundt 	m66592_usb_peripheral_resources[1].start =
123da2014a2SPaul Mundt 		m66592_usb_peripheral_resources[1].end = ilsel_enable(ILSEL_USBP_I);
124da2014a2SPaul Mundt 
125da2014a2SPaul Mundt 	smc91x_resources[1].start =
126da2014a2SPaul Mundt 		smc91x_resources[1].end = ilsel_enable(ILSEL_LAN);
127da2014a2SPaul Mundt 
128da2014a2SPaul Mundt 	return platform_add_devices(x3proto_devices,
129da2014a2SPaul Mundt 				    ARRAY_SIZE(x3proto_devices));
130da2014a2SPaul Mundt }
131da2014a2SPaul Mundt device_initcall(x3proto_devices_setup);
132da2014a2SPaul Mundt 
133da2014a2SPaul Mundt static void __init x3proto_init_irq(void)
134da2014a2SPaul Mundt {
135da2014a2SPaul Mundt 	plat_irq_setup_pins(IRQ_MODE_IRL3210);
136da2014a2SPaul Mundt 
137da2014a2SPaul Mundt 	/* Set ICR0.LVLMODE */
138da2014a2SPaul Mundt 	ctrl_outl(ctrl_inl(0xfe410000) | (1 << 21), 0xfe410000);
139da2014a2SPaul Mundt }
140da2014a2SPaul Mundt 
141da2014a2SPaul Mundt static struct sh_machine_vector mv_x3proto __initmv = {
142da2014a2SPaul Mundt 	.mv_name		= "x3proto",
143da2014a2SPaul Mundt 	.mv_init_irq		= x3proto_init_irq,
144da2014a2SPaul Mundt };
145