Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vulcan-setup.c
Go to the documentation of this file.
1 /*
2  * arch/arm/mach-ixp4xx/vulcan-setup.c
3  *
4  * Arcom/Eurotech Vulcan board-setup
5  *
6  * Copyright (C) 2010 Marc Zyngier <[email protected]>
7  *
8  * based on fsg-setup.c:
9  * Copyright (C) 2008 Rod Whitby <[email protected]>
10  */
11 
12 #include <linux/if_ether.h>
13 #include <linux/irq.h>
14 #include <linux/serial.h>
15 #include <linux/serial_8250.h>
16 #include <linux/io.h>
17 #include <linux/w1-gpio.h>
18 #include <linux/mtd/plat-ram.h>
19 #include <asm/mach-types.h>
20 #include <asm/mach/arch.h>
21 #include <asm/mach/flash.h>
22 
23 static struct flash_platform_data vulcan_flash_data = {
24  .map_name = "cfi_probe",
25  .width = 2,
26 };
27 
28 static struct resource vulcan_flash_resource = {
29  .flags = IORESOURCE_MEM,
30 };
31 
32 static struct platform_device vulcan_flash = {
33  .name = "IXP4XX-Flash",
34  .id = 0,
35  .dev = {
36  .platform_data = &vulcan_flash_data,
37  },
38  .resource = &vulcan_flash_resource,
39  .num_resources = 1,
40 };
41 
42 static struct platdata_mtd_ram vulcan_sram_data = {
43  .mapname = "Vulcan SRAM",
44  .bankwidth = 1,
45 };
46 
47 static struct resource vulcan_sram_resource = {
48  .flags = IORESOURCE_MEM,
49 };
50 
51 static struct platform_device vulcan_sram = {
52  .name = "mtd-ram",
53  .id = 0,
54  .dev = {
55  .platform_data = &vulcan_sram_data,
56  },
57  .resource = &vulcan_sram_resource,
58  .num_resources = 1,
59 };
60 
61 static struct resource vulcan_uart_resources[] = {
62  [0] = {
63  .start = IXP4XX_UART1_BASE_PHYS,
64  .end = IXP4XX_UART1_BASE_PHYS + 0x0fff,
65  .flags = IORESOURCE_MEM,
66  },
67  [1] = {
68  .start = IXP4XX_UART2_BASE_PHYS,
69  .end = IXP4XX_UART2_BASE_PHYS + 0x0fff,
70  .flags = IORESOURCE_MEM,
71  },
72  [2] = {
73  .flags = IORESOURCE_MEM,
74  },
75 };
76 
77 static struct plat_serial8250_port vulcan_uart_data[] = {
78  [0] = {
79  .mapbase = IXP4XX_UART1_BASE_PHYS,
80  .membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
83  .iotype = UPIO_MEM,
84  .regshift = 2,
86  },
87  [1] = {
88  .mapbase = IXP4XX_UART2_BASE_PHYS,
89  .membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
92  .iotype = UPIO_MEM,
93  .regshift = 2,
95  },
96  [2] = {
97  .irq = IXP4XX_GPIO_IRQ(4),
98  .irqflags = IRQF_TRIGGER_LOW,
100  .iotype = UPIO_MEM,
101  .uartclk = 1843200,
102  },
103  [3] = {
104  .irq = IXP4XX_GPIO_IRQ(4),
105  .irqflags = IRQF_TRIGGER_LOW,
107  .iotype = UPIO_MEM,
108  .uartclk = 1843200,
109  },
110  { }
111 };
112 
113 static struct platform_device vulcan_uart = {
114  .name = "serial8250",
115  .id = PLAT8250_DEV_PLATFORM,
116  .dev = {
117  .platform_data = vulcan_uart_data,
118  },
119  .resource = vulcan_uart_resources,
120  .num_resources = ARRAY_SIZE(vulcan_uart_resources),
121 };
122 
123 static struct eth_plat_info vulcan_plat_eth[] = {
124  [0] = {
125  .phy = 0,
126  .rxq = 3,
127  .txreadyq = 20,
128  },
129  [1] = {
130  .phy = 1,
131  .rxq = 4,
132  .txreadyq = 21,
133  },
134 };
135 
136 static struct platform_device vulcan_eth[] = {
137  [0] = {
138  .name = "ixp4xx_eth",
139  .id = IXP4XX_ETH_NPEB,
140  .dev = {
141  .platform_data = &vulcan_plat_eth[0],
142  },
143  },
144  [1] = {
145  .name = "ixp4xx_eth",
146  .id = IXP4XX_ETH_NPEC,
147  .dev = {
148  .platform_data = &vulcan_plat_eth[1],
149  },
150  },
151 };
152 
153 static struct resource vulcan_max6369_resource = {
154  .flags = IORESOURCE_MEM,
155 };
156 
157 static struct platform_device vulcan_max6369 = {
158  .name = "max6369_wdt",
159  .id = -1,
160  .resource = &vulcan_max6369_resource,
161  .num_resources = 1,
162 };
163 
164 static struct w1_gpio_platform_data vulcan_w1_gpio_pdata = {
165  .pin = 14,
166 };
167 
168 static struct platform_device vulcan_w1_gpio = {
169  .name = "w1-gpio",
170  .id = 0,
171  .dev = {
172  .platform_data = &vulcan_w1_gpio_pdata,
173  },
174 };
175 
176 static struct platform_device *vulcan_devices[] __initdata = {
177  &vulcan_uart,
178  &vulcan_flash,
179  &vulcan_sram,
180  &vulcan_max6369,
181  &vulcan_eth[0],
182  &vulcan_eth[1],
183  &vulcan_w1_gpio,
184 };
185 
186 static void __init vulcan_init(void)
187 {
188  ixp4xx_sys_init();
189 
190  /* Flash is spread over both CS0 and CS1 */
191  vulcan_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
192  vulcan_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1;
195  IXP4XX_EXP_BUS_SIZE(0xF) |
199 
200  /* SRAM on CS2, (256kB, 8bit, writable) */
201  vulcan_sram_resource.start = IXP4XX_EXP_BUS_BASE(2);
202  vulcan_sram_resource.end = IXP4XX_EXP_BUS_BASE(2) + SZ_256K - 1;
210 
211  /* XR16L2551 on CS3 (Moto style, 512 bytes, 8bits, writable) */
212  vulcan_uart_resources[2].start = IXP4XX_EXP_BUS_BASE(3);
213  vulcan_uart_resources[2].end = IXP4XX_EXP_BUS_BASE(3) + 16 - 1;
214  vulcan_uart_data[2].mapbase = vulcan_uart_resources[2].start;
215  vulcan_uart_data[3].mapbase = vulcan_uart_data[2].mapbase + 8;
221 
222  /* GPIOS on CS4 (512 bytes, 8bits, writable) */
226 
227  /* max6369 on CS5 (512 bytes, 8bits, writable) */
228  vulcan_max6369_resource.start = IXP4XX_EXP_BUS_BASE(5);
229  vulcan_max6369_resource.end = IXP4XX_EXP_BUS_BASE(5);
233 
234  platform_add_devices(vulcan_devices, ARRAY_SIZE(vulcan_devices));
235 }
236 
237 MACHINE_START(ARCOM_VULCAN, "Arcom/Eurotech Vulcan")
238  /* Maintainer: Marc Zyngier <[email protected]> */
239  .map_io = ixp4xx_map_io,
240  .init_early = ixp4xx_init_early,
241  .init_irq = ixp4xx_init_irq,
242  .timer = &ixp4xx_timer,
243  .atag_offset = 0x100,
244  .init_machine = vulcan_init,
245 #if defined(CONFIG_PCI)
246  .dma_zone_size = SZ_64M,
247 #endif
248  .restart = ixp4xx_restart,