linux/arch/arm/mach-ixp4xx/vulcan-setup.c
<<
>>
Prefs
   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