• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * arch/arm/mach-ixp4xx/omixp-setup.c
3  *
4  * omicron ixp4xx board setup
5  *      Copyright (C) 2009 OMICRON electronics GmbH
6  *
7  * based nslu2-setup.c, ixdp425-setup.c:
8  *      Copyright (C) 2003-2004 MontaVista Software, Inc.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14 
15 #include <linux/kernel.h>
16 #include <linux/serial.h>
17 #include <linux/serial_8250.h>
18 #include <linux/mtd/mtd.h>
19 #include <linux/mtd/partitions.h>
20 #include <linux/leds.h>
21 
22 #include <asm/setup.h>
23 #include <asm/memory.h>
24 #include <asm/mach-types.h>
25 #include <asm/mach/arch.h>
26 #include <asm/mach/flash.h>
27 
28 #include <mach/hardware.h>
29 
30 static struct resource omixp_flash_resources[] = {
31 	{
32 		.flags	= IORESOURCE_MEM,
33 	}, {
34 		.flags	= IORESOURCE_MEM,
35 	},
36 };
37 
38 static struct mtd_partition omixp_partitions[] = {
39 	{
40 		.name =		"Recovery Bootloader",
41 		.size =		0x00020000,
42 		.offset =	0,
43 	}, {
44 		.name =		"Calibration Data",
45 		.size =		0x00020000,
46 		.offset =	0x00020000,
47 	}, {
48 		.name =		"Recovery FPGA",
49 		.size =		0x00020000,
50 		.offset =	0x00040000,
51 	}, {
52 		.name =		"Release Bootloader",
53 		.size =		0x00020000,
54 		.offset =	0x00060000,
55 	}, {
56 		.name =		"Release FPGA",
57 		.size =		0x00020000,
58 		.offset =	0x00080000,
59 	}, {
60 		.name =		"Kernel",
61 		.size =		0x00160000,
62 		.offset =	0x000a0000,
63 	}, {
64 		.name =		"Filesystem",
65 		.size =		0x00C00000,
66 		.offset =	0x00200000,
67 	}, {
68 		.name =		"Persistent Storage",
69 		.size =		0x00200000,
70 		.offset =	0x00E00000,
71 	},
72 };
73 
74 static struct flash_platform_data omixp_flash_data[] = {
75 	{
76 		.map_name	= "cfi_probe",
77 		.parts		= omixp_partitions,
78 		.nr_parts	= ARRAY_SIZE(omixp_partitions),
79 	}, {
80 		.map_name	= "cfi_probe",
81 		.parts		= NULL,
82 		.nr_parts	= 0,
83 	},
84 };
85 
86 static struct platform_device omixp_flash_device[] = {
87 	{
88 		.name		= "IXP4XX-Flash",
89 		.id		= 0,
90 		.dev = {
91 			.platform_data = &omixp_flash_data[0],
92 		},
93 		.resource = &omixp_flash_resources[0],
94 		.num_resources = 1,
95 	}, {
96 		.name		= "IXP4XX-Flash",
97 		.id		= 1,
98 		.dev = {
99 			.platform_data = &omixp_flash_data[1],
100 		},
101 		.resource = &omixp_flash_resources[1],
102 		.num_resources = 1,
103 	},
104 };
105 
106 /* Swap UART's - These boards have the console on UART2. The following
107  * configuration is used:
108  *      ttyS0 .. UART2
109  *      ttyS1 .. UART1
110  * This way standard images can be used with the kernel that expect
111  * the console on ttyS0.
112  */
113 static struct resource omixp_uart_resources[] = {
114 	{
115 		.start		= IXP4XX_UART2_BASE_PHYS,
116 		.end		= IXP4XX_UART2_BASE_PHYS + 0x0fff,
117 		.flags		= IORESOURCE_MEM,
118 	}, {
119 		.start		= IXP4XX_UART1_BASE_PHYS,
120 		.end		= IXP4XX_UART1_BASE_PHYS + 0x0fff,
121 		.flags		= IORESOURCE_MEM,
122 	},
123 };
124 
125 static struct plat_serial8250_port omixp_uart_data[] = {
126 	{
127 		.mapbase	= IXP4XX_UART2_BASE_PHYS,
128 		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
129 		.irq		= IRQ_IXP4XX_UART2,
130 		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
131 		.iotype		= UPIO_MEM,
132 		.regshift	= 2,
133 		.uartclk	= IXP4XX_UART_XTAL,
134 	}, {
135 		.mapbase	= IXP4XX_UART1_BASE_PHYS,
136 		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
137 		.irq		= IRQ_IXP4XX_UART1,
138 		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
139 		.iotype		= UPIO_MEM,
140 		.regshift	= 2,
141 		.uartclk	= IXP4XX_UART_XTAL,
142 	}, {
143 		/* list termination */
144 	}
145 };
146 
147 static struct platform_device omixp_uart = {
148 	.name			= "serial8250",
149 	.id			= PLAT8250_DEV_PLATFORM,
150 	.dev.platform_data	= omixp_uart_data,
151 	.num_resources		= 2,
152 	.resource		= omixp_uart_resources,
153 };
154 
155 static struct gpio_led mic256_led_pins[] = {
156 	{
157 		.name		= "LED-A",
158 		.gpio		= 7,
159 	},
160 };
161 
162 static struct gpio_led_platform_data mic256_led_data = {
163 	.num_leds		= ARRAY_SIZE(mic256_led_pins),
164 	.leds			= mic256_led_pins,
165 };
166 
167 static struct platform_device mic256_leds = {
168 	.name			= "leds-gpio",
169 	.id			= -1,
170 	.dev.platform_data	= &mic256_led_data,
171 };
172 
173 /* Built-in 10/100 Ethernet MAC interfaces */
174 static struct eth_plat_info ixdp425_plat_eth[] = {
175 	{
176 		.phy		= 0,
177 		.rxq		= 3,
178 		.txreadyq	= 20,
179 	}, {
180 		.phy		= 1,
181 		.rxq		= 4,
182 		.txreadyq	= 21,
183 	},
184 };
185 
186 static struct platform_device ixdp425_eth[] = {
187 	{
188 		.name			= "ixp4xx_eth",
189 		.id			= IXP4XX_ETH_NPEB,
190 		.dev.platform_data	= ixdp425_plat_eth,
191 	}, {
192 		.name			= "ixp4xx_eth",
193 		.id			= IXP4XX_ETH_NPEC,
194 		.dev.platform_data	= ixdp425_plat_eth + 1,
195 	},
196 };
197 
198 
199 static struct platform_device *devixp_pldev[] __initdata = {
200 	&omixp_uart,
201 	&omixp_flash_device[0],
202 	&ixdp425_eth[0],
203 	&ixdp425_eth[1],
204 };
205 
206 static struct platform_device *mic256_pldev[] __initdata = {
207 	&omixp_uart,
208 	&omixp_flash_device[0],
209 	&mic256_leds,
210 	&ixdp425_eth[0],
211 	&ixdp425_eth[1],
212 };
213 
214 static struct platform_device *miccpt_pldev[] __initdata = {
215 	&omixp_uart,
216 	&omixp_flash_device[0],
217 	&omixp_flash_device[1],
218 	&ixdp425_eth[0],
219 	&ixdp425_eth[1],
220 };
221 
omixp_init(void)222 static void __init omixp_init(void)
223 {
224 	ixp4xx_sys_init();
225 
226 	/* 16MiB Boot Flash */
227 	omixp_flash_resources[0].start = IXP4XX_EXP_BUS_BASE(0);
228 	omixp_flash_resources[0].end   = IXP4XX_EXP_BUS_END(0);
229 
230 	/* 32 MiB Data Flash */
231 	omixp_flash_resources[1].start = IXP4XX_EXP_BUS_BASE(2);
232 	omixp_flash_resources[1].end   = IXP4XX_EXP_BUS_END(2);
233 
234 	if (machine_is_devixp())
235 		platform_add_devices(devixp_pldev, ARRAY_SIZE(devixp_pldev));
236 	else if (machine_is_miccpt())
237 		platform_add_devices(miccpt_pldev, ARRAY_SIZE(miccpt_pldev));
238 	else if (machine_is_mic256())
239 		platform_add_devices(mic256_pldev, ARRAY_SIZE(mic256_pldev));
240 }
241 
242 #ifdef CONFIG_MACH_DEVIXP
243 MACHINE_START(DEVIXP, "Omicron DEVIXP")
244 	.atag_offset    = 0x100,
245 	.map_io		= ixp4xx_map_io,
246 	.init_early	= ixp4xx_init_early,
247 	.init_irq	= ixp4xx_init_irq,
248 	.init_time	= ixp4xx_timer_init,
249 	.init_machine	= omixp_init,
250 	.restart	= ixp4xx_restart,
251 MACHINE_END
252 #endif
253 
254 #ifdef CONFIG_MACH_MICCPT
255 MACHINE_START(MICCPT, "Omicron MICCPT")
256 	.atag_offset    = 0x100,
257 	.map_io		= ixp4xx_map_io,
258 	.init_early	= ixp4xx_init_early,
259 	.init_irq	= ixp4xx_init_irq,
260 	.init_time	= ixp4xx_timer_init,
261 	.init_machine	= omixp_init,
262 #if defined(CONFIG_PCI)
263 	.dma_zone_size	= SZ_64M,
264 #endif
265 	.restart	= ixp4xx_restart,
266 MACHINE_END
267 #endif
268 
269 #ifdef CONFIG_MACH_MIC256
270 MACHINE_START(MIC256, "Omicron MIC256")
271 	.atag_offset    = 0x100,
272 	.map_io		= ixp4xx_map_io,
273 	.init_early	= ixp4xx_init_early,
274 	.init_irq	= ixp4xx_init_irq,
275 	.init_time	= ixp4xx_timer_init,
276 	.init_machine	= omixp_init,
277 	.restart	= ixp4xx_restart,
278 MACHINE_END
279 #endif
280