diff options
Diffstat (limited to 'arch/arm/mach-orion5x/mv2120-setup.c')
-rw-r--r-- | arch/arm/mach-orion5x/mv2120-setup.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c new file mode 100644 index 000000000000..55f3b0fdef8b --- /dev/null +++ b/arch/arm/mach-orion5x/mv2120-setup.c | |||
@@ -0,0 +1,239 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org> | ||
3 | * Copyright (C) 2008 Martin Michlmayr <tbm@cyrius.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU Lesser General Public License as | ||
7 | * published by the Free Software Foundation; either version 2 of the | ||
8 | * License, or (at your option) any later version. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <linux/mtd/physmap.h> | ||
16 | #include <linux/mv643xx_eth.h> | ||
17 | #include <linux/leds.h> | ||
18 | #include <linux/gpio_keys.h> | ||
19 | #include <linux/input.h> | ||
20 | #include <linux/i2c.h> | ||
21 | #include <linux/ata_platform.h> | ||
22 | #include <asm/mach-types.h> | ||
23 | #include <asm/gpio.h> | ||
24 | #include <asm/mach/arch.h> | ||
25 | #include <asm/arch/orion5x.h> | ||
26 | #include "common.h" | ||
27 | #include "mpp.h" | ||
28 | |||
29 | #define MV2120_NOR_BOOT_BASE 0xf4000000 | ||
30 | #define MV2120_NOR_BOOT_SIZE SZ_512K | ||
31 | |||
32 | #define MV2120_GPIO_RTC_IRQ 3 | ||
33 | #define MV2120_GPIO_KEY_RESET 17 | ||
34 | #define MV2120_GPIO_KEY_POWER 18 | ||
35 | #define MV2120_GPIO_POWER_OFF 19 | ||
36 | |||
37 | |||
38 | /***************************************************************************** | ||
39 | * Ethernet | ||
40 | ****************************************************************************/ | ||
41 | static struct mv643xx_eth_platform_data mv2120_eth_data = { | ||
42 | .phy_addr = 8, | ||
43 | }; | ||
44 | |||
45 | static struct mv_sata_platform_data mv2120_sata_data = { | ||
46 | .n_ports = 2, | ||
47 | }; | ||
48 | |||
49 | static struct mtd_partition mv2120_partitions[] = { | ||
50 | { | ||
51 | .name = "firmware", | ||
52 | .size = 0x00080000, | ||
53 | .offset = 0, | ||
54 | }, | ||
55 | }; | ||
56 | |||
57 | static struct physmap_flash_data mv2120_nor_flash_data = { | ||
58 | .width = 1, | ||
59 | .parts = mv2120_partitions, | ||
60 | .nr_parts = ARRAY_SIZE(mv2120_partitions) | ||
61 | }; | ||
62 | |||
63 | static struct resource mv2120_nor_flash_resource = { | ||
64 | .flags = IORESOURCE_MEM, | ||
65 | .start = MV2120_NOR_BOOT_BASE, | ||
66 | .end = MV2120_NOR_BOOT_BASE + MV2120_NOR_BOOT_SIZE - 1, | ||
67 | }; | ||
68 | |||
69 | static struct platform_device mv2120_nor_flash = { | ||
70 | .name = "physmap-flash", | ||
71 | .id = 0, | ||
72 | .dev = { | ||
73 | .platform_data = &mv2120_nor_flash_data, | ||
74 | }, | ||
75 | .resource = &mv2120_nor_flash_resource, | ||
76 | .num_resources = 1, | ||
77 | }; | ||
78 | |||
79 | static struct gpio_keys_button mv2120_buttons[] = { | ||
80 | { | ||
81 | .code = KEY_RESTART, | ||
82 | .gpio = MV2120_GPIO_KEY_RESET, | ||
83 | .desc = "reset", | ||
84 | .active_low = 1, | ||
85 | }, { | ||
86 | .code = KEY_POWER, | ||
87 | .gpio = MV2120_GPIO_KEY_POWER, | ||
88 | .desc = "power", | ||
89 | .active_low = 1, | ||
90 | }, | ||
91 | }; | ||
92 | |||
93 | static struct gpio_keys_platform_data mv2120_button_data = { | ||
94 | .buttons = mv2120_buttons, | ||
95 | .nbuttons = ARRAY_SIZE(mv2120_buttons), | ||
96 | }; | ||
97 | |||
98 | static struct platform_device mv2120_button_device = { | ||
99 | .name = "gpio-keys", | ||
100 | .id = -1, | ||
101 | .num_resources = 0, | ||
102 | .dev = { | ||
103 | .platform_data = &mv2120_button_data, | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | |||
108 | /**************************************************************************** | ||
109 | * General Setup | ||
110 | ****************************************************************************/ | ||
111 | static struct orion5x_mpp_mode mv2120_mpp_modes[] __initdata = { | ||
112 | { 0, MPP_GPIO }, /* Sys status LED */ | ||
113 | { 1, MPP_GPIO }, /* Sys error LED */ | ||
114 | { 2, MPP_GPIO }, /* OverTemp interrupt */ | ||
115 | { 3, MPP_GPIO }, /* RTC interrupt */ | ||
116 | { 4, MPP_GPIO }, /* V_LED 5V */ | ||
117 | { 5, MPP_GPIO }, /* V_LED 3.3V */ | ||
118 | { 6, MPP_UNUSED }, | ||
119 | { 7, MPP_UNUSED }, | ||
120 | { 8, MPP_GPIO }, /* SATA 0 fail LED */ | ||
121 | { 9, MPP_GPIO }, /* SATA 1 fail LED */ | ||
122 | { 10, MPP_UNUSED }, | ||
123 | { 11, MPP_UNUSED }, | ||
124 | { 12, MPP_SATA_LED }, /* SATA 0 presence */ | ||
125 | { 13, MPP_SATA_LED }, /* SATA 1 presence */ | ||
126 | { 14, MPP_SATA_LED }, /* SATA 0 active */ | ||
127 | { 15, MPP_SATA_LED }, /* SATA 1 active */ | ||
128 | { 16, MPP_UNUSED }, | ||
129 | { 17, MPP_GPIO }, /* Reset button */ | ||
130 | { 18, MPP_GPIO }, /* Power button */ | ||
131 | { 19, MPP_GPIO }, /* Power off */ | ||
132 | { -1 }, | ||
133 | }; | ||
134 | |||
135 | static struct i2c_board_info __initdata mv2120_i2c_rtc = { | ||
136 | I2C_BOARD_INFO("pcf8563", 0x51), | ||
137 | .irq = 0, | ||
138 | }; | ||
139 | |||
140 | static struct gpio_led mv2120_led_pins[] = { | ||
141 | { | ||
142 | .name = "mv2120:blue:health", | ||
143 | .gpio = 0, | ||
144 | }, | ||
145 | { | ||
146 | .name = "mv2120:red:health", | ||
147 | .gpio = 1, | ||
148 | }, | ||
149 | { | ||
150 | .name = "mv2120:led:bright", | ||
151 | .gpio = 4, | ||
152 | .default_trigger = "default-on", | ||
153 | }, | ||
154 | { | ||
155 | .name = "mv2120:led:dimmed", | ||
156 | .gpio = 5, | ||
157 | }, | ||
158 | { | ||
159 | .name = "mv2120:red:sata0", | ||
160 | .gpio = 8, | ||
161 | .active_low = 1, | ||
162 | }, | ||
163 | { | ||
164 | .name = "mv2120:red:sata1", | ||
165 | .gpio = 9, | ||
166 | .active_low = 1, | ||
167 | }, | ||
168 | |||
169 | }; | ||
170 | |||
171 | static struct gpio_led_platform_data mv2120_led_data = { | ||
172 | .leds = mv2120_led_pins, | ||
173 | .num_leds = ARRAY_SIZE(mv2120_led_pins), | ||
174 | }; | ||
175 | |||
176 | static struct platform_device mv2120_leds = { | ||
177 | .name = "leds-gpio", | ||
178 | .id = -1, | ||
179 | .dev = { | ||
180 | .platform_data = &mv2120_led_data, | ||
181 | } | ||
182 | }; | ||
183 | |||
184 | static void mv2120_power_off(void) | ||
185 | { | ||
186 | pr_info("%s: triggering power-off...\n", __func__); | ||
187 | gpio_set_value(MV2120_GPIO_POWER_OFF, 0); | ||
188 | } | ||
189 | |||
190 | static void __init mv2120_init(void) | ||
191 | { | ||
192 | /* Setup basic Orion functions. Need to be called early. */ | ||
193 | orion5x_init(); | ||
194 | |||
195 | orion5x_mpp_conf(mv2120_mpp_modes); | ||
196 | |||
197 | /* | ||
198 | * Configure peripherals. | ||
199 | */ | ||
200 | orion5x_ehci0_init(); | ||
201 | orion5x_ehci1_init(); | ||
202 | orion5x_eth_init(&mv2120_eth_data); | ||
203 | orion5x_i2c_init(); | ||
204 | orion5x_sata_init(&mv2120_sata_data); | ||
205 | orion5x_uart0_init(); | ||
206 | |||
207 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); | ||
208 | platform_device_register(&mv2120_nor_flash); | ||
209 | |||
210 | platform_device_register(&mv2120_button_device); | ||
211 | |||
212 | if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) { | ||
213 | if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0) | ||
214 | mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ); | ||
215 | else | ||
216 | gpio_free(MV2120_GPIO_RTC_IRQ); | ||
217 | } | ||
218 | i2c_register_board_info(0, &mv2120_i2c_rtc, 1); | ||
219 | platform_device_register(&mv2120_leds); | ||
220 | |||
221 | /* register mv2120 specific power-off method */ | ||
222 | if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 || | ||
223 | gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0) | ||
224 | pr_err("mv2120: failed to setup power-off GPIO\n"); | ||
225 | pm_power_off = mv2120_power_off; | ||
226 | } | ||
227 | |||
228 | /* Warning: HP uses a wrong mach-type (=526) in their bootloader */ | ||
229 | MACHINE_START(MV2120, "HP Media Vault mv2120") | ||
230 | /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */ | ||
231 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
232 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
233 | .boot_params = 0x00000100, | ||
234 | .init_machine = mv2120_init, | ||
235 | .map_io = orion5x_map_io, | ||
236 | .init_irq = orion5x_init_irq, | ||
237 | .timer = &orion5x_timer, | ||
238 | .fixup = tag_fixup_mem32 | ||
239 | MACHINE_END | ||