diff options
Diffstat (limited to 'arch/arm/mach-kirkwood/board-dnskw.c')
-rw-r--r-- | arch/arm/mach-kirkwood/board-dnskw.c | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/arch/arm/mach-kirkwood/board-dnskw.c b/arch/arm/mach-kirkwood/board-dnskw.c new file mode 100644 index 000000000000..58c2d68f9443 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-dnskw.c | |||
@@ -0,0 +1,275 @@ | |||
1 | /* | ||
2 | * Copyright 2012 (C), Jamie Lentin <jm@lentin.co.uk> | ||
3 | * | ||
4 | * arch/arm/mach-kirkwood/board-dnskw.c | ||
5 | * | ||
6 | * D-link DNS-320 & DNS-325 NAS Init for drivers not converted to | ||
7 | * flattened device tree yet. | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/i2c.h> | ||
18 | #include <linux/ata_platform.h> | ||
19 | #include <linux/mv643xx_eth.h> | ||
20 | #include <linux/of.h> | ||
21 | #include <linux/gpio.h> | ||
22 | #include <linux/input.h> | ||
23 | #include <linux/gpio_keys.h> | ||
24 | #include <linux/gpio-fan.h> | ||
25 | #include <linux/leds.h> | ||
26 | #include <asm/mach-types.h> | ||
27 | #include <asm/mach/arch.h> | ||
28 | #include <asm/mach/map.h> | ||
29 | #include <mach/kirkwood.h> | ||
30 | #include <mach/bridge-regs.h> | ||
31 | #include "common.h" | ||
32 | #include "mpp.h" | ||
33 | |||
34 | static struct mv643xx_eth_platform_data dnskw_ge00_data = { | ||
35 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | ||
36 | }; | ||
37 | |||
38 | static struct mv_sata_platform_data dnskw_sata_data = { | ||
39 | .n_ports = 2, | ||
40 | }; | ||
41 | |||
42 | static unsigned int dnskw_mpp_config[] __initdata = { | ||
43 | MPP13_UART1_TXD, /* Custom ... */ | ||
44 | MPP14_UART1_RXD, /* ... Controller (DNS-320 only) */ | ||
45 | MPP20_SATA1_ACTn, /* LED: White Right HDD */ | ||
46 | MPP21_SATA0_ACTn, /* LED: White Left HDD */ | ||
47 | MPP24_GPIO, | ||
48 | MPP25_GPIO, | ||
49 | MPP26_GPIO, /* LED: Power */ | ||
50 | MPP27_GPIO, /* LED: Red Right HDD */ | ||
51 | MPP28_GPIO, /* LED: Red Left HDD */ | ||
52 | MPP29_GPIO, /* LED: Red USB (DNS-325 only) */ | ||
53 | MPP30_GPIO, | ||
54 | MPP31_GPIO, | ||
55 | MPP32_GPIO, | ||
56 | MPP33_GPO, | ||
57 | MPP34_GPIO, /* Button: Front power */ | ||
58 | MPP35_GPIO, /* LED: Red USB (DNS-320 only) */ | ||
59 | MPP36_GPIO, /* Power: Turn off board */ | ||
60 | MPP37_GPIO, /* Power: Turn back on after power failure */ | ||
61 | MPP38_GPIO, | ||
62 | MPP39_GPIO, /* Power: SATA0 */ | ||
63 | MPP40_GPIO, /* Power: SATA1 */ | ||
64 | MPP41_GPIO, /* SATA0 present */ | ||
65 | MPP42_GPIO, /* SATA1 present */ | ||
66 | MPP43_GPIO, /* LED: White USB */ | ||
67 | MPP44_GPIO, /* Fan: Tachometer Pin */ | ||
68 | MPP45_GPIO, /* Fan: high speed */ | ||
69 | MPP46_GPIO, /* Fan: low speed */ | ||
70 | MPP47_GPIO, /* Button: Back unmount */ | ||
71 | MPP48_GPIO, /* Button: Back reset */ | ||
72 | MPP49_GPIO, /* Temp Alarm (DNS-325) Pin of U5 (DNS-320) */ | ||
73 | 0 | ||
74 | }; | ||
75 | |||
76 | static struct gpio_led dns325_led_pins[] = { | ||
77 | { | ||
78 | .name = "dns325:white:power", | ||
79 | .gpio = 26, | ||
80 | .active_low = 1, | ||
81 | .default_trigger = "default-on", | ||
82 | }, | ||
83 | { | ||
84 | .name = "dns325:white:usb", | ||
85 | .gpio = 43, | ||
86 | .active_low = 1, | ||
87 | }, | ||
88 | { | ||
89 | .name = "dns325:red:l_hdd", | ||
90 | .gpio = 28, | ||
91 | .active_low = 1, | ||
92 | }, | ||
93 | { | ||
94 | .name = "dns325:red:r_hdd", | ||
95 | .gpio = 27, | ||
96 | .active_low = 1, | ||
97 | }, | ||
98 | { | ||
99 | .name = "dns325:red:usb", | ||
100 | .gpio = 29, | ||
101 | .active_low = 1, | ||
102 | }, | ||
103 | }; | ||
104 | |||
105 | static struct gpio_led_platform_data dns325_led_data = { | ||
106 | .num_leds = ARRAY_SIZE(dns325_led_pins), | ||
107 | .leds = dns325_led_pins, | ||
108 | }; | ||
109 | |||
110 | static struct platform_device dns325_led_device = { | ||
111 | .name = "leds-gpio", | ||
112 | .id = -1, | ||
113 | .dev = { | ||
114 | .platform_data = &dns325_led_data, | ||
115 | }, | ||
116 | }; | ||
117 | |||
118 | static struct gpio_led dns320_led_pins[] = { | ||
119 | { | ||
120 | .name = "dns320:blue:power", | ||
121 | .gpio = 26, | ||
122 | .active_low = 1, | ||
123 | .default_trigger = "default-on", | ||
124 | }, | ||
125 | { | ||
126 | .name = "dns320:blue:usb", | ||
127 | .gpio = 43, | ||
128 | .active_low = 1, | ||
129 | }, | ||
130 | { | ||
131 | .name = "dns320:orange:l_hdd", | ||
132 | .gpio = 28, | ||
133 | .active_low = 1, | ||
134 | }, | ||
135 | { | ||
136 | .name = "dns320:orange:r_hdd", | ||
137 | .gpio = 27, | ||
138 | .active_low = 1, | ||
139 | }, | ||
140 | { | ||
141 | .name = "dns320:orange:usb", | ||
142 | .gpio = 35, | ||
143 | .active_low = 1, | ||
144 | }, | ||
145 | }; | ||
146 | |||
147 | static struct gpio_led_platform_data dns320_led_data = { | ||
148 | .num_leds = ARRAY_SIZE(dns320_led_pins), | ||
149 | .leds = dns320_led_pins, | ||
150 | }; | ||
151 | |||
152 | static struct platform_device dns320_led_device = { | ||
153 | .name = "leds-gpio", | ||
154 | .id = -1, | ||
155 | .dev = { | ||
156 | .platform_data = &dns320_led_data, | ||
157 | }, | ||
158 | }; | ||
159 | |||
160 | static struct i2c_board_info dns325_i2c_board_info[] __initdata = { | ||
161 | { | ||
162 | I2C_BOARD_INFO("lm75", 0x48), | ||
163 | }, | ||
164 | /* Something at 0x0c also */ | ||
165 | }; | ||
166 | |||
167 | static struct gpio_keys_button dnskw_button_pins[] = { | ||
168 | { | ||
169 | .code = KEY_POWER, | ||
170 | .gpio = 34, | ||
171 | .desc = "Power button", | ||
172 | .active_low = 1, | ||
173 | }, | ||
174 | { | ||
175 | .code = KEY_EJECTCD, | ||
176 | .gpio = 47, | ||
177 | .desc = "USB unmount button", | ||
178 | .active_low = 1, | ||
179 | }, | ||
180 | { | ||
181 | .code = KEY_RESTART, | ||
182 | .gpio = 48, | ||
183 | .desc = "Reset button", | ||
184 | .active_low = 1, | ||
185 | }, | ||
186 | }; | ||
187 | |||
188 | static struct gpio_keys_platform_data dnskw_button_data = { | ||
189 | .buttons = dnskw_button_pins, | ||
190 | .nbuttons = ARRAY_SIZE(dnskw_button_pins), | ||
191 | }; | ||
192 | |||
193 | static struct platform_device dnskw_button_device = { | ||
194 | .name = "gpio-keys", | ||
195 | .id = -1, | ||
196 | .num_resources = 0, | ||
197 | .dev = { | ||
198 | .platform_data = &dnskw_button_data, | ||
199 | } | ||
200 | }; | ||
201 | |||
202 | /* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */ | ||
203 | static struct gpio_fan_speed dnskw_fan_speed[] = { | ||
204 | { 0, 0 }, | ||
205 | { 3000, 1 }, | ||
206 | { 6000, 2 }, | ||
207 | }; | ||
208 | static unsigned dnskw_fan_pins[] = {46, 45}; | ||
209 | |||
210 | static struct gpio_fan_platform_data dnskw_fan_data = { | ||
211 | .num_ctrl = ARRAY_SIZE(dnskw_fan_pins), | ||
212 | .ctrl = dnskw_fan_pins, | ||
213 | .num_speed = ARRAY_SIZE(dnskw_fan_speed), | ||
214 | .speed = dnskw_fan_speed, | ||
215 | }; | ||
216 | |||
217 | static struct platform_device dnskw_fan_device = { | ||
218 | .name = "gpio-fan", | ||
219 | .id = -1, | ||
220 | .dev = { | ||
221 | .platform_data = &dnskw_fan_data, | ||
222 | }, | ||
223 | }; | ||
224 | |||
225 | static void dnskw_power_off(void) | ||
226 | { | ||
227 | gpio_set_value(36, 1); | ||
228 | } | ||
229 | |||
230 | /* Register any GPIO for output and set the value */ | ||
231 | static void __init dnskw_gpio_register(unsigned gpio, char *name, int def) | ||
232 | { | ||
233 | if (gpio_request(gpio, name) == 0 && | ||
234 | gpio_direction_output(gpio, 0) == 0) { | ||
235 | gpio_set_value(gpio, def); | ||
236 | if (gpio_export(gpio, 0) != 0) | ||
237 | pr_err("dnskw: Failed to export GPIO %s\n", name); | ||
238 | } else | ||
239 | pr_err("dnskw: Failed to register %s\n", name); | ||
240 | } | ||
241 | |||
242 | void __init dnskw_init(void) | ||
243 | { | ||
244 | kirkwood_mpp_conf(dnskw_mpp_config); | ||
245 | |||
246 | kirkwood_ehci_init(); | ||
247 | kirkwood_ge00_init(&dnskw_ge00_data); | ||
248 | kirkwood_sata_init(&dnskw_sata_data); | ||
249 | kirkwood_i2c_init(); | ||
250 | |||
251 | platform_device_register(&dnskw_button_device); | ||
252 | platform_device_register(&dnskw_fan_device); | ||
253 | |||
254 | if (of_machine_is_compatible("dlink,dns-325")) { | ||
255 | i2c_register_board_info(0, dns325_i2c_board_info, | ||
256 | ARRAY_SIZE(dns325_i2c_board_info)); | ||
257 | platform_device_register(&dns325_led_device); | ||
258 | |||
259 | } else if (of_machine_is_compatible("dlink,dns-320")) | ||
260 | platform_device_register(&dns320_led_device); | ||
261 | |||
262 | /* Register power-off GPIO. */ | ||
263 | if (gpio_request(36, "dnskw:power:off") == 0 | ||
264 | && gpio_direction_output(36, 0) == 0) | ||
265 | pm_power_off = dnskw_power_off; | ||
266 | else | ||
267 | pr_err("dnskw: failed to configure power-off GPIO\n"); | ||
268 | |||
269 | /* Ensure power is supplied to both HDDs */ | ||
270 | dnskw_gpio_register(39, "dnskw:power:sata0", 1); | ||
271 | dnskw_gpio_register(40, "dnskw:power:sata1", 1); | ||
272 | |||
273 | /* Set NAS to turn back on after a power failure */ | ||
274 | dnskw_gpio_register(37, "dnskw:power:recover", 1); | ||
275 | } | ||