Path: blob/master/arch/arm/mach-ixp4xx/fsg-setup.c
10817 views
/*1* arch/arm/mach-ixp4xx/fsg-setup.c2*3* FSG board-setup4*5* Copyright (C) 2008 Rod Whitby <[email protected]>6*7* based on ixdp425-setup.c:8* Copyright (C) 2003-2004 MontaVista Software, Inc.9* based on nslu2-power.c10* Copyright (C) 2005 Tower Technologies11*12* Author: Rod Whitby <[email protected]>13* Maintainers: http://www.nslu2-linux.org/14*15*/1617#include <linux/if_ether.h>18#include <linux/irq.h>19#include <linux/serial.h>20#include <linux/serial_8250.h>21#include <linux/leds.h>22#include <linux/reboot.h>23#include <linux/i2c.h>24#include <linux/i2c-gpio.h>25#include <linux/io.h>26#include <asm/mach-types.h>27#include <asm/mach/arch.h>28#include <asm/mach/flash.h>29#include <asm/gpio.h>3031#define FSG_SDA_PIN 1232#define FSG_SCL_PIN 133334#define FSG_SB_GPIO 4 /* sync button */35#define FSG_RB_GPIO 9 /* reset button */36#define FSG_UB_GPIO 10 /* usb button */3738static struct flash_platform_data fsg_flash_data = {39.map_name = "cfi_probe",40.width = 2,41};4243static struct resource fsg_flash_resource = {44.flags = IORESOURCE_MEM,45};4647static struct platform_device fsg_flash = {48.name = "IXP4XX-Flash",49.id = 0,50.dev = {51.platform_data = &fsg_flash_data,52},53.num_resources = 1,54.resource = &fsg_flash_resource,55};5657static struct i2c_gpio_platform_data fsg_i2c_gpio_data = {58.sda_pin = FSG_SDA_PIN,59.scl_pin = FSG_SCL_PIN,60};6162static struct platform_device fsg_i2c_gpio = {63.name = "i2c-gpio",64.id = 0,65.dev = {66.platform_data = &fsg_i2c_gpio_data,67},68};6970static struct i2c_board_info __initdata fsg_i2c_board_info [] = {71{72I2C_BOARD_INFO("isl1208", 0x6f),73},74};7576static struct resource fsg_uart_resources[] = {77{78.start = IXP4XX_UART1_BASE_PHYS,79.end = IXP4XX_UART1_BASE_PHYS + 0x0fff,80.flags = IORESOURCE_MEM,81},82{83.start = IXP4XX_UART2_BASE_PHYS,84.end = IXP4XX_UART2_BASE_PHYS + 0x0fff,85.flags = IORESOURCE_MEM,86}87};8889static struct plat_serial8250_port fsg_uart_data[] = {90{91.mapbase = IXP4XX_UART1_BASE_PHYS,92.membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,93.irq = IRQ_IXP4XX_UART1,94.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,95.iotype = UPIO_MEM,96.regshift = 2,97.uartclk = IXP4XX_UART_XTAL,98},99{100.mapbase = IXP4XX_UART2_BASE_PHYS,101.membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,102.irq = IRQ_IXP4XX_UART2,103.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,104.iotype = UPIO_MEM,105.regshift = 2,106.uartclk = IXP4XX_UART_XTAL,107},108{ }109};110111static struct platform_device fsg_uart = {112.name = "serial8250",113.id = PLAT8250_DEV_PLATFORM,114.dev = {115.platform_data = fsg_uart_data,116},117.num_resources = ARRAY_SIZE(fsg_uart_resources),118.resource = fsg_uart_resources,119};120121static struct platform_device fsg_leds = {122.name = "fsg-led",123.id = -1,124};125126/* Built-in 10/100 Ethernet MAC interfaces */127static struct eth_plat_info fsg_plat_eth[] = {128{129.phy = 5,130.rxq = 3,131.txreadyq = 20,132}, {133.phy = 4,134.rxq = 4,135.txreadyq = 21,136}137};138139static struct platform_device fsg_eth[] = {140{141.name = "ixp4xx_eth",142.id = IXP4XX_ETH_NPEB,143.dev = {144.platform_data = fsg_plat_eth,145},146}, {147.name = "ixp4xx_eth",148.id = IXP4XX_ETH_NPEC,149.dev = {150.platform_data = fsg_plat_eth + 1,151},152}153};154155static struct platform_device *fsg_devices[] __initdata = {156&fsg_i2c_gpio,157&fsg_flash,158&fsg_leds,159&fsg_eth[0],160&fsg_eth[1],161};162163static irqreturn_t fsg_power_handler(int irq, void *dev_id)164{165/* Signal init to do the ctrlaltdel action, this will bypass init if166* it hasn't started and do a kernel_restart.167*/168ctrl_alt_del();169170return IRQ_HANDLED;171}172173static irqreturn_t fsg_reset_handler(int irq, void *dev_id)174{175/* This is the paper-clip reset which does an emergency reboot. */176printk(KERN_INFO "Restarting system.\n");177machine_restart(NULL);178179/* This should never be reached. */180return IRQ_HANDLED;181}182183static void __init fsg_init(void)184{185uint8_t __iomem *f;186187ixp4xx_sys_init();188189fsg_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);190fsg_flash_resource.end =191IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;192193*IXP4XX_EXP_CS0 |= IXP4XX_FLASH_WRITABLE;194*IXP4XX_EXP_CS1 = *IXP4XX_EXP_CS0;195196/* Configure CS2 for operation, 8bit and writable */197*IXP4XX_EXP_CS2 = 0xbfff0002;198199i2c_register_board_info(0, fsg_i2c_board_info,200ARRAY_SIZE(fsg_i2c_board_info));201202/* This is only useful on a modified machine, but it is valuable203* to have it first in order to see debug messages, and so that204* it does *not* get removed if platform_add_devices fails!205*/206(void)platform_device_register(&fsg_uart);207208platform_add_devices(fsg_devices, ARRAY_SIZE(fsg_devices));209210if (request_irq(gpio_to_irq(FSG_RB_GPIO), &fsg_reset_handler,211IRQF_DISABLED | IRQF_TRIGGER_LOW,212"FSG reset button", NULL) < 0) {213214printk(KERN_DEBUG "Reset Button IRQ %d not available\n",215gpio_to_irq(FSG_RB_GPIO));216}217218if (request_irq(gpio_to_irq(FSG_SB_GPIO), &fsg_power_handler,219IRQF_DISABLED | IRQF_TRIGGER_LOW,220"FSG power button", NULL) < 0) {221222printk(KERN_DEBUG "Power Button IRQ %d not available\n",223gpio_to_irq(FSG_SB_GPIO));224}225226/*227* Map in a portion of the flash and read the MAC addresses.228* Since it is stored in BE in the flash itself, we need to229* byteswap it if we're in LE mode.230*/231f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000);232if (f) {233#ifdef __ARMEB__234int i;235for (i = 0; i < 6; i++) {236fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i);237fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i);238}239#else240241/*242Endian-swapped reads from unaligned addresses are243required to extract the two MACs from the big-endian244Redboot config area in flash.245*/246247fsg_plat_eth[0].hwaddr[0] = readb(f + 0x3C0421);248fsg_plat_eth[0].hwaddr[1] = readb(f + 0x3C0420);249fsg_plat_eth[0].hwaddr[2] = readb(f + 0x3C0427);250fsg_plat_eth[0].hwaddr[3] = readb(f + 0x3C0426);251fsg_plat_eth[0].hwaddr[4] = readb(f + 0x3C0425);252fsg_plat_eth[0].hwaddr[5] = readb(f + 0x3C0424);253254fsg_plat_eth[1].hwaddr[0] = readb(f + 0x3C0439);255fsg_plat_eth[1].hwaddr[1] = readb(f + 0x3C043F);256fsg_plat_eth[1].hwaddr[2] = readb(f + 0x3C043E);257fsg_plat_eth[1].hwaddr[3] = readb(f + 0x3C043D);258fsg_plat_eth[1].hwaddr[4] = readb(f + 0x3C043C);259fsg_plat_eth[1].hwaddr[5] = readb(f + 0x3C0443);260#endif261iounmap(f);262}263printk(KERN_INFO "FSG: Using MAC address %pM for port 0\n",264fsg_plat_eth[0].hwaddr);265printk(KERN_INFO "FSG: Using MAC address %pM for port 1\n",266fsg_plat_eth[1].hwaddr);267268}269270MACHINE_START(FSG, "Freecom FSG-3")271/* Maintainer: www.nslu2-linux.org */272.map_io = ixp4xx_map_io,273.init_irq = ixp4xx_init_irq,274.timer = &ixp4xx_timer,275.boot_params = 0x0100,276.init_machine = fsg_init,277MACHINE_END278279280281