nas100d-setup.c 4.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * arch/arm/mach-ixp4xx/nas100d-setup.c
 *
 * NAS 100d board-setup
 *
 * based ixdp425-setup.c:
 *      Copyright (C) 2003-2004 MontaVista Software, Inc.
 *
 * Author: Alessandro Zummo <a.zummo@towertech.it>
 * Author: Rod Whitby <rod@whitby.id.au>
 * Maintainers: http://www.nslu2-linux.org/
 *
 */

#include <linux/kernel.h>
#include <linux/serial.h>
#include <linux/serial_8250.h>
18
#include <linux/leds.h>
19
#include <linux/i2c.h>
M
Michael-Luke Jones 已提交
20
#include <linux/i2c-gpio.h>
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/flash.h>

static struct flash_platform_data nas100d_flash_data = {
	.map_name		= "cfi_probe",
	.width			= 2,
};

static struct resource nas100d_flash_resource = {
	.flags			= IORESOURCE_MEM,
};

static struct platform_device nas100d_flash = {
	.name			= "IXP4XX-Flash",
	.id			= 0,
	.dev.platform_data	= &nas100d_flash_data,
	.num_resources		= 1,
	.resource		= &nas100d_flash_resource,
};

43 44 45 46 47 48
static struct i2c_board_info __initdata nas100d_i2c_board_info [] = {
	{
		I2C_BOARD_INFO("rtc-pcf8563", 0x51),
	},
};

49 50 51 52
#ifdef CONFIG_LEDS_IXP4XX
static struct resource nas100d_led_resources[] = {
	{
		.name		= "wlan",   /* green led */
53 54
		.start		= NAS100D_LED_WLAN_GPIO,
		.end		= NAS100D_LED_WLAN_GPIO,
55 56 57
		.flags		= IXP4XX_GPIO_LOW,
	},
	{
58 59 60
		.name		= "power",  /* blue power led (off=flashing) */
		.start		= NAS100D_LED_PWR_GPIO,
		.end		= NAS100D_LED_PWR_GPIO,
61 62 63 64
		.flags		= IXP4XX_GPIO_LOW,
	},
	{
		.name		= "disk",   /* yellow led */
65 66
		.start		= NAS100D_LED_DISK_GPIO,
		.end		= NAS100D_LED_DISK_GPIO,
67 68 69 70 71 72 73 74 75 76 77 78
		.flags		= IXP4XX_GPIO_LOW,
	},
};

static struct platform_device nas100d_leds = {
	.name			= "IXP4XX-GPIO-LED",
	.id			= -1,
	.num_resources		= ARRAY_SIZE(nas100d_led_resources),
	.resource		= nas100d_led_resources,
};
#endif

M
Michael-Luke Jones 已提交
79
static struct i2c_gpio_platform_data nas100d_i2c_gpio_data = {
80 81 82 83
	.sda_pin		= NAS100D_SDA_PIN,
	.scl_pin		= NAS100D_SCL_PIN,
};

M
Michael-Luke Jones 已提交
84 85
static struct platform_device nas100d_i2c_gpio = {
	.name			= "i2c-gpio",
86
	.id			= 0,
M
Michael-Luke Jones 已提交
87 88 89
	.dev	 = {
		.platform_data	= &nas100d_i2c_gpio_data,
	},
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
};

static struct resource nas100d_uart_resources[] = {
	{
		.start		= IXP4XX_UART1_BASE_PHYS,
		.end		= IXP4XX_UART1_BASE_PHYS + 0x0fff,
		.flags		= IORESOURCE_MEM,
	},
	{
		.start		= IXP4XX_UART2_BASE_PHYS,
		.end		= IXP4XX_UART2_BASE_PHYS + 0x0fff,
		.flags		= IORESOURCE_MEM,
	}
};

static struct plat_serial8250_port nas100d_uart_data[] = {
	{
		.mapbase	= IXP4XX_UART1_BASE_PHYS,
		.membase	= (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
		.irq		= IRQ_IXP4XX_UART1,
		.flags		= UPF_BOOT_AUTOCONF,
		.iotype		= UPIO_MEM,
		.regshift	= 2,
		.uartclk	= IXP4XX_UART_XTAL,
	},
	{
		.mapbase	= IXP4XX_UART2_BASE_PHYS,
		.membase	= (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
		.irq		= IRQ_IXP4XX_UART2,
		.flags		= UPF_BOOT_AUTOCONF,
		.iotype		= UPIO_MEM,
		.regshift	= 2,
		.uartclk	= IXP4XX_UART_XTAL,
	},
	{ }
};

static struct platform_device nas100d_uart = {
	.name			= "serial8250",
	.id			= PLAT8250_DEV_PLATFORM,
	.dev.platform_data	= nas100d_uart_data,
	.num_resources		= 2,
	.resource		= nas100d_uart_resources,
};

static struct platform_device *nas100d_devices[] __initdata = {
M
Michael-Luke Jones 已提交
136
	&nas100d_i2c_gpio,
137
	&nas100d_flash,
138 139 140
#ifdef CONFIG_LEDS_IXP4XX
	&nas100d_leds,
#endif
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
};

static void nas100d_power_off(void)
{
	/* This causes the box to drop the power and go dead. */

	/* enable the pwr cntl gpio */
	gpio_line_config(NAS100D_PO_GPIO, IXP4XX_GPIO_OUT);

	/* do the deed */
	gpio_line_set(NAS100D_PO_GPIO, IXP4XX_GPIO_HIGH);
}

static void __init nas100d_init(void)
{
	ixp4xx_sys_init();

158 159 160
	/* gpio 14 and 15 are _not_ clocks */
	*IXP4XX_GPIO_GPCLKR = 0;

161 162 163 164
	nas100d_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
	nas100d_flash_resource.end =
		IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;

165 166
	pm_power_off = nas100d_power_off;

167 168 169
	i2c_register_board_info(0, nas100d_i2c_board_info,
				ARRAY_SIZE(nas100d_i2c_board_info));

170 171
	/*
	 * This is only useful on a modified machine, but it is valuable
172 173 174 175 176
	 * to have it first in order to see debug messages, and so that
	 * it does *not* get removed if platform_add_devices fails!
	 */
	(void)platform_device_register(&nas100d_uart);

177 178 179 180 181 182 183 184 185 186 187 188 189
	platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices));
}

MACHINE_START(NAS100D, "Iomega NAS 100d")
	/* Maintainer: www.nslu2-linux.org */
	.phys_io	= IXP4XX_PERIPHERAL_BASE_PHYS,
	.io_pg_offst	= ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC,
	.boot_params	= 0x00000100,
	.map_io		= ixp4xx_map_io,
	.init_irq	= ixp4xx_init_irq,
	.timer          = &ixp4xx_timer,
	.init_machine	= nas100d_init,
MACHINE_END