Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
omixp-setup.c
Go to the documentation of this file.
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 #ifdef CONFIG_LEDS_CLASS
21 #include <linux/leds.h>
22 #endif
23 
24 #include <asm/setup.h>
25 #include <asm/memory.h>
26 #include <asm/mach-types.h>
27 #include <asm/mach/arch.h>
28 #include <asm/mach/flash.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,
131  .iotype = UPIO_MEM,
132  .regshift = 2,
134  }, {
135  .mapbase = IXP4XX_UART1_BASE_PHYS,
136  .membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
139  .iotype = UPIO_MEM,
140  .regshift = 2,
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 
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  .timer = &ixp4xx_timer,
249  .init_machine = omixp_init,
250  .restart = ixp4xx_restart,
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  .timer = &ixp4xx_timer,
261  .init_machine = omixp_init,
262 #if defined(CONFIG_PCI)
263  .dma_zone_size = SZ_64M,
264 #endif
265  .restart = ixp4xx_restart,
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  .timer = &ixp4xx_timer,
276  .init_machine = omixp_init,
277  .restart = ixp4xx_restart,
279 #endif