blob: 5801579ae95912821daf0469954f746a95ee71f7 [file] [log] [blame]
Rod Whitby3145d8a2006-01-04 17:17:11 +00001/*
2 * arch/arm/mach-ixp4xx/nas100d-setup.c
3 *
4 * NAS 100d board-setup
5 *
6 * based ixdp425-setup.c:
7 * Copyright (C) 2003-2004 MontaVista Software, Inc.
8 *
9 * Author: Alessandro Zummo <a.zummo@towertech.it>
10 * Author: Rod Whitby <rod@whitby.id.au>
11 * Maintainers: http://www.nslu2-linux.org/
12 *
13 */
14
15#include <linux/kernel.h>
16#include <linux/serial.h>
17#include <linux/serial_8250.h>
Rod Whitbydf6934b2006-06-22 22:21:01 +010018#include <linux/leds.h>
Rod Whitby400d8232008-01-29 00:38:44 +010019#include <linux/i2c.h>
Michael-Luke Jones5a4a2382008-01-27 18:14:46 +010020#include <linux/i2c-gpio.h>
Rod Whitby3145d8a2006-01-04 17:17:11 +000021
22#include <asm/mach-types.h>
23#include <asm/mach/arch.h>
24#include <asm/mach/flash.h>
25
26static struct flash_platform_data nas100d_flash_data = {
27 .map_name = "cfi_probe",
28 .width = 2,
29};
30
31static struct resource nas100d_flash_resource = {
Rod Whitby3145d8a2006-01-04 17:17:11 +000032 .flags = IORESOURCE_MEM,
33};
34
35static struct platform_device nas100d_flash = {
36 .name = "IXP4XX-Flash",
37 .id = 0,
38 .dev.platform_data = &nas100d_flash_data,
39 .num_resources = 1,
40 .resource = &nas100d_flash_resource,
41};
42
Rod Whitby400d8232008-01-29 00:38:44 +010043static struct i2c_board_info __initdata nas100d_i2c_board_info [] = {
44 {
45 I2C_BOARD_INFO("rtc-pcf8563", 0x51),
46 },
47};
48
Rod Whitby1208ebf2008-02-02 00:03:56 +010049static struct gpio_led nas100d_led_pins[] = {
Rod Whitbydf6934b2006-06-22 22:21:01 +010050 {
51 .name = "wlan", /* green led */
Rod Whitby1208ebf2008-02-02 00:03:56 +010052 .gpio = NAS100D_LED_WLAN_GPIO,
53 .active_low = true,
Rod Whitbydf6934b2006-06-22 22:21:01 +010054 },
55 {
Rod Whitby14645eb2008-01-29 00:29:38 +010056 .name = "power", /* blue power led (off=flashing) */
Rod Whitby1208ebf2008-02-02 00:03:56 +010057 .gpio = NAS100D_LED_PWR_GPIO,
58 .active_low = true,
Rod Whitbydf6934b2006-06-22 22:21:01 +010059 },
60 {
61 .name = "disk", /* yellow led */
Rod Whitby1208ebf2008-02-02 00:03:56 +010062 .gpio = NAS100D_LED_DISK_GPIO,
63 .active_low = true,
Rod Whitbydf6934b2006-06-22 22:21:01 +010064 },
65};
66
Rod Whitby1208ebf2008-02-02 00:03:56 +010067static struct gpio_led_platform_data nas100d_led_data = {
68 .num_leds = ARRAY_SIZE(nas100d_led_pins),
69 .leds = nas100d_led_pins,
Rod Whitbydf6934b2006-06-22 22:21:01 +010070};
Rod Whitby1208ebf2008-02-02 00:03:56 +010071
72static struct platform_device nas100d_leds = {
73 .name = "leds-gpio",
74 .id = -1,
75 .dev.platform_data = &nas100d_led_data,
76};
Rod Whitbydf6934b2006-06-22 22:21:01 +010077
Michael-Luke Jones5a4a2382008-01-27 18:14:46 +010078static struct i2c_gpio_platform_data nas100d_i2c_gpio_data = {
Rod Whitby3145d8a2006-01-04 17:17:11 +000079 .sda_pin = NAS100D_SDA_PIN,
80 .scl_pin = NAS100D_SCL_PIN,
81};
82
Michael-Luke Jones5a4a2382008-01-27 18:14:46 +010083static struct platform_device nas100d_i2c_gpio = {
84 .name = "i2c-gpio",
Rod Whitby3145d8a2006-01-04 17:17:11 +000085 .id = 0,
Michael-Luke Jones5a4a2382008-01-27 18:14:46 +010086 .dev = {
87 .platform_data = &nas100d_i2c_gpio_data,
88 },
Rod Whitby3145d8a2006-01-04 17:17:11 +000089};
90
91static struct resource nas100d_uart_resources[] = {
92 {
93 .start = IXP4XX_UART1_BASE_PHYS,
94 .end = IXP4XX_UART1_BASE_PHYS + 0x0fff,
95 .flags = IORESOURCE_MEM,
96 },
97 {
98 .start = IXP4XX_UART2_BASE_PHYS,
99 .end = IXP4XX_UART2_BASE_PHYS + 0x0fff,
100 .flags = IORESOURCE_MEM,
101 }
102};
103
104static struct plat_serial8250_port nas100d_uart_data[] = {
105 {
106 .mapbase = IXP4XX_UART1_BASE_PHYS,
107 .membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
108 .irq = IRQ_IXP4XX_UART1,
109 .flags = UPF_BOOT_AUTOCONF,
110 .iotype = UPIO_MEM,
111 .regshift = 2,
112 .uartclk = IXP4XX_UART_XTAL,
113 },
114 {
115 .mapbase = IXP4XX_UART2_BASE_PHYS,
116 .membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
117 .irq = IRQ_IXP4XX_UART2,
118 .flags = UPF_BOOT_AUTOCONF,
119 .iotype = UPIO_MEM,
120 .regshift = 2,
121 .uartclk = IXP4XX_UART_XTAL,
122 },
123 { }
124};
125
126static struct platform_device nas100d_uart = {
127 .name = "serial8250",
128 .id = PLAT8250_DEV_PLATFORM,
129 .dev.platform_data = nas100d_uart_data,
130 .num_resources = 2,
131 .resource = nas100d_uart_resources,
132};
133
134static struct platform_device *nas100d_devices[] __initdata = {
Michael-Luke Jones5a4a2382008-01-27 18:14:46 +0100135 &nas100d_i2c_gpio,
Rod Whitby3145d8a2006-01-04 17:17:11 +0000136 &nas100d_flash,
Rod Whitbydf6934b2006-06-22 22:21:01 +0100137 &nas100d_leds,
Rod Whitby3145d8a2006-01-04 17:17:11 +0000138};
139
140static void nas100d_power_off(void)
141{
142 /* This causes the box to drop the power and go dead. */
143
144 /* enable the pwr cntl gpio */
145 gpio_line_config(NAS100D_PO_GPIO, IXP4XX_GPIO_OUT);
146
147 /* do the deed */
148 gpio_line_set(NAS100D_PO_GPIO, IXP4XX_GPIO_HIGH);
149}
150
151static void __init nas100d_init(void)
152{
153 ixp4xx_sys_init();
154
Alessandro Zummodcc8fa52006-03-08 23:45:10 +0000155 /* gpio 14 and 15 are _not_ clocks */
156 *IXP4XX_GPIO_GPCLKR = 0;
157
Deepak Saxena54e269e2006-01-05 20:59:29 +0000158 nas100d_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
159 nas100d_flash_resource.end =
160 IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;
161
Rod Whitby3145d8a2006-01-04 17:17:11 +0000162 pm_power_off = nas100d_power_off;
163
Rod Whitby400d8232008-01-29 00:38:44 +0100164 i2c_register_board_info(0, nas100d_i2c_board_info,
165 ARRAY_SIZE(nas100d_i2c_board_info));
166
Michael-Luke Jonescc50a0d2007-05-23 22:41:53 +0100167 /*
168 * This is only useful on a modified machine, but it is valuable
Rod Whitbydf6934b2006-06-22 22:21:01 +0100169 * to have it first in order to see debug messages, and so that
170 * it does *not* get removed if platform_add_devices fails!
171 */
172 (void)platform_device_register(&nas100d_uart);
173
Rod Whitby3145d8a2006-01-04 17:17:11 +0000174 platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices));
175}
176
177MACHINE_START(NAS100D, "Iomega NAS 100d")
178 /* Maintainer: www.nslu2-linux.org */
Rod Whitby3145d8a2006-01-04 17:17:11 +0000179 .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
180 .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC,
181 .boot_params = 0x00000100,
182 .map_io = ixp4xx_map_io,
183 .init_irq = ixp4xx_init_irq,
184 .timer = &ixp4xx_timer,
185 .init_machine = nas100d_init,
186MACHINE_END