1/* 2 * arch/arm/mach-ixp4xx/vulcan-setup.c 3 * 4 * Arcom/Eurotech Vulcan board-setup 5 * 6 * Copyright (C) 2010 Marc Zyngier <maz@misterjones.org> 7 * 8 * based on fsg-setup.c: 9 * Copyright (C) 2008 Rod Whitby <rod@whitby.id.au> 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 23static struct flash_platform_data vulcan_flash_data = { 24 .map_name = "cfi_probe", 25 .width = 2, 26}; 27 28static struct resource vulcan_flash_resource = { 29 .flags = IORESOURCE_MEM, 30}; 31 32static 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 42static struct platdata_mtd_ram vulcan_sram_data = { 43 .mapname = "Vulcan SRAM", 44 .bankwidth = 1, 45}; 46 47static struct resource vulcan_sram_resource = { 48 .flags = IORESOURCE_MEM, 49}; 50 51static 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 61static 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 77static struct plat_serial8250_port vulcan_uart_data[] = { 78 [0] = { 79 .mapbase = IXP4XX_UART1_BASE_PHYS, 80 .membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET, 81 .irq = IRQ_IXP4XX_UART1, 82 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 83 .iotype = UPIO_MEM, 84 .regshift = 2, 85 .uartclk = IXP4XX_UART_XTAL, 86 }, 87 [1] = { 88 .mapbase = IXP4XX_UART2_BASE_PHYS, 89 .membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET, 90 .irq = IRQ_IXP4XX_UART2, 91 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 92 .iotype = UPIO_MEM, 93 .regshift = 2, 94 .uartclk = IXP4XX_UART_XTAL, 95 }, 96 [2] = { 97 .irq = IXP4XX_GPIO_IRQ(4), 98 .irqflags = IRQF_TRIGGER_LOW, 99 .flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 100 .iotype = UPIO_MEM, 101 .uartclk = 1843200, 102 }, 103 [3] = { 104 .irq = IXP4XX_GPIO_IRQ(4), 105 .irqflags = IRQF_TRIGGER_LOW, 106 .flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, 107 .iotype = UPIO_MEM, 108 .uartclk = 1843200, 109 }, 110 { } 111}; 112 113static 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 123static 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 136static 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 153static struct resource vulcan_max6369_resource = { 154 .flags = IORESOURCE_MEM, 155}; 156 157static struct platform_device vulcan_max6369 = { 158 .name = "max6369_wdt", 159 .id = -1, 160 .resource = &vulcan_max6369_resource, 161 .num_resources = 1, 162}; 163 164static struct w1_gpio_platform_data vulcan_w1_gpio_pdata = { 165 .pin = 14, 166 .ext_pullup_enable_pin = -EINVAL, 167}; 168 169static struct platform_device vulcan_w1_gpio = { 170 .name = "w1-gpio", 171 .id = 0, 172 .dev = { 173 .platform_data = &vulcan_w1_gpio_pdata, 174 }, 175}; 176 177static struct platform_device *vulcan_devices[] __initdata = { 178 &vulcan_uart, 179 &vulcan_flash, 180 &vulcan_sram, 181 &vulcan_max6369, 182 &vulcan_eth[0], 183 &vulcan_eth[1], 184 &vulcan_w1_gpio, 185}; 186 187static void __init vulcan_init(void) 188{ 189 ixp4xx_sys_init(); 190 191 /* Flash is spread over both CS0 and CS1 */ 192 vulcan_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); 193 vulcan_flash_resource.end = IXP4XX_EXP_BUS_BASE(0) + SZ_32M - 1; 194 *IXP4XX_EXP_CS0 = IXP4XX_EXP_BUS_CS_EN | 195 IXP4XX_EXP_BUS_STROBE_T(3) | 196 IXP4XX_EXP_BUS_SIZE(0xF) | 197 IXP4XX_EXP_BUS_BYTE_RD16 | 198 IXP4XX_EXP_BUS_WR_EN; 199 *IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0; 200 201 /* SRAM on CS2, (256kB, 8bit, writable) */ 202 vulcan_sram_resource.start = IXP4XX_EXP_BUS_BASE(2); 203 vulcan_sram_resource.end = IXP4XX_EXP_BUS_BASE(2) + SZ_256K - 1; 204 *IXP4XX_EXP_CS2 = IXP4XX_EXP_BUS_CS_EN | 205 IXP4XX_EXP_BUS_STROBE_T(1) | 206 IXP4XX_EXP_BUS_HOLD_T(2) | 207 IXP4XX_EXP_BUS_SIZE(9) | 208 IXP4XX_EXP_BUS_SPLT_EN | 209 IXP4XX_EXP_BUS_WR_EN | 210 IXP4XX_EXP_BUS_BYTE_EN; 211 212 /* XR16L2551 on CS3 (Moto style, 512 bytes, 8bits, writable) */ 213 vulcan_uart_resources[2].start = IXP4XX_EXP_BUS_BASE(3); 214 vulcan_uart_resources[2].end = IXP4XX_EXP_BUS_BASE(3) + 16 - 1; 215 vulcan_uart_data[2].mapbase = vulcan_uart_resources[2].start; 216 vulcan_uart_data[3].mapbase = vulcan_uart_data[2].mapbase + 8; 217 *IXP4XX_EXP_CS3 = IXP4XX_EXP_BUS_CS_EN | 218 IXP4XX_EXP_BUS_STROBE_T(3) | 219 IXP4XX_EXP_BUS_CYCLES(IXP4XX_EXP_BUS_CYCLES_MOTOROLA)| 220 IXP4XX_EXP_BUS_WR_EN | 221 IXP4XX_EXP_BUS_BYTE_EN; 222 223 /* GPIOS on CS4 (512 bytes, 8bits, writable) */ 224 *IXP4XX_EXP_CS4 = IXP4XX_EXP_BUS_CS_EN | 225 IXP4XX_EXP_BUS_WR_EN | 226 IXP4XX_EXP_BUS_BYTE_EN; 227 228 /* max6369 on CS5 (512 bytes, 8bits, writable) */ 229 vulcan_max6369_resource.start = IXP4XX_EXP_BUS_BASE(5); 230 vulcan_max6369_resource.end = IXP4XX_EXP_BUS_BASE(5); 231 *IXP4XX_EXP_CS5 = IXP4XX_EXP_BUS_CS_EN | 232 IXP4XX_EXP_BUS_WR_EN | 233 IXP4XX_EXP_BUS_BYTE_EN; 234 235 platform_add_devices(vulcan_devices, ARRAY_SIZE(vulcan_devices)); 236} 237 238MACHINE_START(ARCOM_VULCAN, "Arcom/Eurotech Vulcan") 239 /* Maintainer: Marc Zyngier <maz@misterjones.org> */ 240 .map_io = ixp4xx_map_io, 241 .init_early = ixp4xx_init_early, 242 .init_irq = ixp4xx_init_irq, 243 .init_time = ixp4xx_timer_init, 244 .atag_offset = 0x100, 245 .init_machine = vulcan_init, 246#if defined(CONFIG_PCI) 247 .dma_zone_size = SZ_64M, 248#endif 249 .restart = ixp4xx_restart, 250MACHINE_END 251