diff options
-rw-r--r-- | arch/arm/mach-orion5x/Kconfig | 6 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/mv2120-setup.c | 194 |
3 files changed, 201 insertions, 0 deletions
diff --git a/arch/arm/mach-orion5x/Kconfig b/arch/arm/mach-orion5x/Kconfig index 4d3ce4dffe26..a8f732b6131c 100644 --- a/arch/arm/mach-orion5x/Kconfig +++ b/arch/arm/mach-orion5x/Kconfig | |||
@@ -56,6 +56,12 @@ config MACH_WRT350N_V2 | |||
56 | Say 'Y' here if you want your kernel to support the | 56 | Say 'Y' here if you want your kernel to support the |
57 | Linksys WRT350N v2 platform. | 57 | Linksys WRT350N v2 platform. |
58 | 58 | ||
59 | config MACH_MV2120 | ||
60 | bool "HP Media Vault mv2120" | ||
61 | help | ||
62 | Say 'Y' here if you want your kernel to support the | ||
63 | HP Media Vault mv2120 or mv5100. | ||
64 | |||
59 | endmenu | 65 | endmenu |
60 | 66 | ||
61 | endif | 67 | endif |
diff --git a/arch/arm/mach-orion5x/Makefile b/arch/arm/mach-orion5x/Makefile index 469e10633234..c333cd7baed9 100644 --- a/arch/arm/mach-orion5x/Makefile +++ b/arch/arm/mach-orion5x/Makefile | |||
@@ -7,3 +7,4 @@ obj-$(CONFIG_MACH_DNS323) += dns323-setup.o | |||
7 | obj-$(CONFIG_MACH_TS209) += ts209-setup.o | 7 | obj-$(CONFIG_MACH_TS209) += ts209-setup.o |
8 | obj-$(CONFIG_MACH_TS409) += ts409-setup.o | 8 | obj-$(CONFIG_MACH_TS409) += ts409-setup.o |
9 | obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o | 9 | obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o |
10 | obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o | ||
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c new file mode 100644 index 000000000000..d838bdbc1976 --- /dev/null +++ b/arch/arm/mach-orion5x/mv2120-setup.c | |||
@@ -0,0 +1,194 @@ | |||
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("rtc-pcf8563", 0x51), | ||
137 | .irq = 0, | ||
138 | }; | ||
139 | |||
140 | static void mv2120_power_off(void) | ||
141 | { | ||
142 | pr_info("%s: triggering power-off...\n", __func__); | ||
143 | gpio_set_value(MV2120_GPIO_POWER_OFF, 0); | ||
144 | } | ||
145 | |||
146 | static void __init mv2120_init(void) | ||
147 | { | ||
148 | /* Setup basic Orion functions. Need to be called early. */ | ||
149 | orion5x_init(); | ||
150 | |||
151 | orion5x_mpp_conf(mv2120_mpp_modes); | ||
152 | |||
153 | /* | ||
154 | * Configure peripherals. | ||
155 | */ | ||
156 | orion5x_ehci0_init(); | ||
157 | orion5x_ehci1_init(); | ||
158 | orion5x_eth_init(&mv2120_eth_data); | ||
159 | orion5x_i2c_init(); | ||
160 | orion5x_sata_init(&mv2120_sata_data); | ||
161 | orion5x_uart0_init(); | ||
162 | |||
163 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); | ||
164 | platform_device_register(&mv2120_nor_flash); | ||
165 | |||
166 | platform_device_register(&mv2120_button_device); | ||
167 | |||
168 | if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) { | ||
169 | if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0) | ||
170 | mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ); | ||
171 | else | ||
172 | gpio_free(MV2120_GPIO_RTC_IRQ); | ||
173 | } | ||
174 | i2c_register_board_info(0, &mv2120_i2c_rtc, 1); | ||
175 | |||
176 | /* register mv2120 specific power-off method */ | ||
177 | if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 || | ||
178 | gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0) | ||
179 | pr_err("mv2120: failed to setup power-off GPIO\n"); | ||
180 | pm_power_off = mv2120_power_off; | ||
181 | } | ||
182 | |||
183 | /* Warning: HP uses a wrong mach-type (=526) in their bootloader */ | ||
184 | MACHINE_START(MV2120, "HP Media Vault mv2120") | ||
185 | /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */ | ||
186 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
187 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
188 | .boot_params = 0x00000100, | ||
189 | .init_machine = mv2120_init, | ||
190 | .map_io = orion5x_map_io, | ||
191 | .init_irq = orion5x_init_irq, | ||
192 | .timer = &orion5x_timer, | ||
193 | .fixup = tag_fixup_mem32 | ||
194 | MACHINE_END | ||