ar71xx: mach-rbspi: simplify reset button registration
[oweals/openwrt.git] / target / linux / ar71xx / files / arch / mips / ath79 / mach-tl-wax50re.c
1 /*
2  *  Support for TP-Link boards:
3  *  - TL-WA750RE v1
4  *  - TL-WA801ND v2
5  *  - TL-WA850RE v1/v2
6  *  - TL-WA855RE v1
7  *  - TL-WA901ND v3
8  *
9  *  Copyright (C) 2013 Martijn Zilverschoon <thefriedzombie@gmail.com>
10  *  Copyright (C) 2013 Jiri Pirko <jiri@resnulli.us>
11  *  Copyright (C) 2017 Piotr Dymacz <pepe2k@gmail.com>
12  *  Copyright (C) 2017 Federico Cappon <dududede371@gmail.com>
13  *  Copyright (C) 2017 Nicolò Veronese <nicveronese@gmail.com>
14  *
15  *  This program is free software; you can redistribute it and/or modify it
16  *  under the terms of the GNU General Public License version 2 as published
17  *  by the Free Software Foundation.
18  */
19
20 #include <linux/gpio.h>
21 #include <linux/platform_device.h>
22
23 #include <asm/mach-ath79/ath79.h>
24 #include <asm/mach-ath79/ar71xx_regs.h>
25
26 #include "common.h"
27 #include "dev-eth.h"
28 #include "dev-gpio-buttons.h"
29 #include "dev-leds-gpio.h"
30 #include "dev-m25p80.h"
31 #include "dev-wmac.h"
32 #include "machtypes.h"
33
34 #define TL_WAX50RE_GPIO_LED_LAN         20
35 #define TL_WAX50RE_GPIO_LED_WLAN        13
36 #define TL_WAX50RE_GPIO_LED_RE          15
37 #define TL_WAX50RE_GPIO_LED_SIGNAL1     0
38 #define TL_WAX50RE_GPIO_LED_SIGNAL2     1
39 #define TL_WAX50RE_GPIO_LED_SIGNAL3     2
40 #define TL_WAX50RE_GPIO_LED_SIGNAL4     3
41 #define TL_WAX50RE_GPIO_LED_SIGNAL5     4
42
43 #define TL_WA850RE_V2_GPIO_LED_LAN      14
44 #define TL_WA850RE_V2_GPIO_LED_RE       12
45 #define TL_WA850RE_V2_GPIO_LED_SIGNAL1  0
46 #define TL_WA850RE_V2_GPIO_LED_SIGNAL2  1
47 #define TL_WA850RE_V2_GPIO_LED_SIGNAL3  2
48 #define TL_WA850RE_V2_GPIO_LED_SIGNAL4  3
49 #define TL_WA850RE_V2_GPIO_LED_SIGNAL5  4
50 #define TL_WA850RE_V2_GPIO_LED_WLAN     13
51
52 #define TL_WA850RE_V2_GPIO_ENABLE_LEDS  15
53
54 #define TL_WA855REV1_GPIO_LED_RED       11
55 #define TL_WA855REV1_GPIO_LED_GREEN     12
56
57 #define TL_WA860RE_GPIO_LED_WLAN_ORANGE 0
58 #define TL_WA860RE_GPIO_LED_WLAN_GREEN  2
59 #define TL_WA860RE_GPIO_LED_POWER_ORANGE        12
60 #define TL_WA860RE_GPIO_LED_POWER_GREEN 14
61 #define TL_WA860RE_GPIO_LED_LAN         20
62
63 #define TL_WA801ND_V2_GPIO_LED_LAN      18
64 #define TL_WA801ND_V2_GPIO_LED_SYSTEM   14
65
66 #define TL_WAX50RE_GPIO_BTN_RESET       17
67 #define TL_WAX50RE_GPIO_BTN_WPS         16
68
69 #define TL_WA860RE_GPIO_BTN_RESET       17
70 #define TL_WA860RE_GPIO_BTN_WPS         16
71 #define TL_WA860RE_GPIO_BTN_ONOFF       11
72
73 #define TL_WAX50RE_KEYS_POLL_INTERVAL   20      /* msecs */
74 #define TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL (3 * TL_WAX50RE_KEYS_POLL_INTERVAL)
75
76 static const char *tl_wax50re_part_probes[] = {
77         "tp-link",
78         NULL,
79 };
80
81 static struct flash_platform_data tl_wax50re_flash_data = {
82         .part_probes    = tl_wax50re_part_probes,
83 };
84
85 static struct gpio_led tl_wa750re_leds_gpio[] __initdata = {
86         {
87                 .name           = "tp-link:orange:lan",
88                 .gpio           = TL_WAX50RE_GPIO_LED_LAN,
89                 .active_low     = 1,
90         }, {
91                 .name           = "tp-link:orange:wlan",
92                 .gpio           = TL_WAX50RE_GPIO_LED_WLAN,
93                 .active_low     = 1,
94         }, {
95                 .name           = "tp-link:orange:re",
96                 .gpio           = TL_WAX50RE_GPIO_LED_RE,
97                 .active_low     = 1,
98         }, {
99                 .name           = "tp-link:orange:signal1",
100                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL1,
101                 .active_low     = 1,
102         }, {
103                 .name           = "tp-link:orange:signal2",
104                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL2,
105                 .active_low     = 1,
106         }, {
107                 .name           = "tp-link:orange:signal3",
108                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL3,
109                 .active_low     = 1,
110         }, {
111                 .name           = "tp-link:orange:signal4",
112                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL4,
113                 .active_low     = 1,
114         }, {
115                 .name           = "tp-link:orange:signal5",
116                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL5,
117                 .active_low     = 1,
118         },
119 };
120
121 static struct gpio_led tl_wa850re_leds_gpio[] __initdata = {
122         {
123                 .name           = "tp-link:blue:lan",
124                 .gpio           = TL_WAX50RE_GPIO_LED_LAN,
125                 .active_low     = 1,
126         }, {
127                 .name           = "tp-link:blue:wlan",
128                 .gpio           = TL_WAX50RE_GPIO_LED_WLAN,
129                 .active_low     = 1,
130         }, {
131                 .name           = "tp-link:blue:re",
132                 .gpio           = TL_WAX50RE_GPIO_LED_RE,
133                 .active_low     = 1,
134         }, {
135                 .name           = "tp-link:blue:signal1",
136                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL1,
137                 .active_low     = 1,
138         }, {
139                 .name           = "tp-link:blue:signal2",
140                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL2,
141                 .active_low     = 1,
142         }, {
143                 .name           = "tp-link:blue:signal3",
144                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL3,
145                 .active_low     = 1,
146         }, {
147                 .name           = "tp-link:blue:signal4",
148                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL4,
149                 .active_low     = 1,
150         }, {
151                 .name           = "tp-link:blue:signal5",
152                 .gpio           = TL_WAX50RE_GPIO_LED_SIGNAL5,
153                 .active_low     = 1,
154         },
155 };
156
157 static struct gpio_led tl_wa850re_v2_leds_gpio[] __initdata = {
158         {
159                 .name           = "tp-link:blue:lan",
160                 .gpio           = TL_WA850RE_V2_GPIO_LED_LAN,
161                 .active_low     = 1,
162         }, {
163                 .name           = "tp-link:blue:re",
164                 .gpio           = TL_WA850RE_V2_GPIO_LED_RE,
165                 .active_low     = 1,
166         }, {
167                 .name           = "tp-link:blue:signal1",
168                 .gpio           = TL_WA850RE_V2_GPIO_LED_SIGNAL1,
169                 .active_low     = 1,
170         }, {
171                 .name           = "tp-link:blue:signal2",
172                 .gpio           = TL_WA850RE_V2_GPIO_LED_SIGNAL2,
173                 .active_low     = 1,
174         }, {
175                 .name           = "tp-link:blue:signal3",
176                 .gpio           = TL_WA850RE_V2_GPIO_LED_SIGNAL3,
177                 .active_low     = 1,
178         }, {
179                 .name           = "tp-link:blue:signal4",
180                 .gpio           = TL_WA850RE_V2_GPIO_LED_SIGNAL4,
181                 .active_low     = 1,
182         }, {
183                 .name           = "tp-link:blue:signal5",
184                 .gpio           = TL_WA850RE_V2_GPIO_LED_SIGNAL5,
185                 .active_low     = 1,
186         }, {
187                 .name           = "tp-link:blue:wlan",
188                 .gpio           = TL_WA850RE_V2_GPIO_LED_WLAN,
189                 .active_low     = 1,
190         },
191 };
192
193 static struct gpio_led tl_wa855re_v1_leds_gpio[] __initdata = {
194          {
195                 .name           = "tp-link:green:power",
196                 .gpio           = TL_WA855REV1_GPIO_LED_GREEN,
197                 .active_low     = 0,
198         }, {
199                 .name           = "tp-link:red:power",
200                 .gpio           = TL_WA855REV1_GPIO_LED_RED,
201                 .active_low     = 0,
202         },
203 };
204
205 static struct gpio_led tl_wa860re_leds_gpio[] __initdata = {
206         {
207                 .name           = "tp-link:green:lan",
208                 .gpio           = TL_WA860RE_GPIO_LED_LAN,
209                 .active_low     = 1,
210         }, {
211                 .name           = "tp-link:green:power",
212                 .gpio           = TL_WA860RE_GPIO_LED_POWER_GREEN,
213                 .active_low     = 1,
214         }, {
215                 .name           = "tp-link:orange:power",
216                 .gpio           = TL_WA860RE_GPIO_LED_POWER_ORANGE,
217                 .active_low     = 1,
218         }, {
219                 .name           = "tp-link:green:wlan",
220                 .gpio           = TL_WA860RE_GPIO_LED_WLAN_GREEN,
221                 .active_low     = 1,
222         }, {
223                 .name           = "tp-link:orange:wlan",
224                 .gpio           = TL_WA860RE_GPIO_LED_WLAN_ORANGE,
225                 .active_low     = 1,
226         },
227 };
228
229
230 static struct gpio_keys_button tl_wax50re_gpio_keys[] __initdata = {
231         {
232                 .desc              = "Reset button",
233                 .type              = EV_KEY,
234                 .code              = KEY_RESTART,
235                 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
236                 .gpio              = TL_WAX50RE_GPIO_BTN_RESET,
237                 .active_low        = 1,
238         }, {
239                 .desc              = "WPS",
240                 .type              = EV_KEY,
241                 .code              = KEY_WPS_BUTTON,
242                 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
243                 .gpio              = TL_WAX50RE_GPIO_BTN_WPS,
244                 .active_low        = 1,
245         },
246 };
247
248 static struct gpio_keys_button tl_wa860re_gpio_keys[] __initdata = {
249         {
250                 .desc              = "Reset button",
251                 .type              = EV_KEY,
252                 .code              = KEY_RESTART,
253                 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
254                 .gpio              = TL_WA860RE_GPIO_BTN_RESET,
255                 .active_low        = 1,
256         }, {
257                 .desc              = "WPS",
258                 .type              = EV_KEY,
259                 .code              = KEY_WPS_BUTTON,
260                 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
261                 .gpio              = TL_WA860RE_GPIO_BTN_WPS,
262                 .active_low        = 1,
263         }, {
264                 .desc              = "ONOFF",
265                 .type              = EV_KEY,
266                 .code              = BTN_1,
267                 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
268                 .gpio              = TL_WA860RE_GPIO_BTN_ONOFF,
269                 .active_low        = 1,
270         },
271 };
272
273 static struct gpio_led tl_wa801nd_v2_leds_gpio[] __initdata = {
274         {
275                 .name           = "tp-link:green:lan",
276                 .gpio           = TL_WA801ND_V2_GPIO_LED_LAN,
277                 .active_low     = 1,
278         }, {
279                 .name           = "tp-link:green:wlan",
280                 .gpio           = TL_WAX50RE_GPIO_LED_WLAN,
281                 .active_low     = 1,
282         }, {
283                 .name           = "tp-link:green:qss",
284                 .gpio           = TL_WAX50RE_GPIO_LED_RE,
285                 .active_low     = 1,
286         }, {
287                 .name           = "tp-link:green:system",
288                 .gpio           = TL_WA801ND_V2_GPIO_LED_SYSTEM,
289                 .active_low     = 1,
290         },
291 };
292
293 static void __init tl_ap123_setup(void)
294 {
295         u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
296         u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
297
298         ath79_register_m25p80(&tl_wax50re_flash_data);
299
300         ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_PHY_SWAP);
301
302         ath79_register_mdio(1, 0x0);
303
304         ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
305
306         ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
307         ath79_eth0_data.phy_mask = BIT(0);
308         ath79_eth0_data.mii_bus_dev = &ath79_mdio1_device.dev;
309         ath79_register_eth(0);
310
311         ath79_register_wmac(ee, mac);
312 }
313
314 static void __init tl_ap143_setup(void)
315 {
316         u8 *mac = (u8 *) KSEG1ADDR(0x1f3c0008);
317         u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
318         u8 tmpmac[ETH_ALEN];
319
320         ath79_register_m25p80(NULL);
321
322         ath79_setup_ar933x_phy4_switch(false, false);
323
324         ath79_register_mdio(0, 0x0);
325
326         ath79_switch_data.phy4_mii_en = 1;
327         ath79_eth0_data.duplex = DUPLEX_FULL;
328         ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
329         ath79_eth0_data.phy_mask = BIT(4);
330         ath79_eth0_data.speed = SPEED_100;
331         ath79_init_mac(ath79_eth0_data.mac_addr, mac, -2);
332         ath79_register_eth(0);
333
334         ath79_init_mac(tmpmac, mac, 0);
335         ath79_register_wmac(ee, mac);
336 }
337
338 static void  __init tl_wa750re_setup(void)
339 {
340         tl_ap123_setup();
341         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa750re_leds_gpio),
342                                  tl_wa750re_leds_gpio);
343
344         ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
345                                         ARRAY_SIZE(tl_wax50re_gpio_keys),
346                                         tl_wax50re_gpio_keys);
347 }
348
349 MIPS_MACHINE(ATH79_MACH_TL_WA750RE, "TL-WA750RE", "TP-LINK TL-WA750RE",
350              tl_wa750re_setup);
351
352 static void __init tl_wa801nd_v2_setup(void)
353 {
354         tl_ap123_setup();
355         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa801nd_v2_leds_gpio),
356                         tl_wa801nd_v2_leds_gpio);
357
358         ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
359                                         ARRAY_SIZE(tl_wax50re_gpio_keys),
360                                         tl_wax50re_gpio_keys);
361 }
362
363 MIPS_MACHINE(ATH79_MACH_TL_WA801ND_V2, "TL-WA801ND-v2", "TP-LINK TL-WA801ND v2",
364              tl_wa801nd_v2_setup);
365
366 static void  __init tl_wa850re_setup(void)
367 {
368         tl_ap123_setup();
369         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa850re_leds_gpio),
370                                  tl_wa850re_leds_gpio);
371
372         ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
373                                         ARRAY_SIZE(tl_wax50re_gpio_keys),
374                                         tl_wax50re_gpio_keys);
375 }
376
377 MIPS_MACHINE(ATH79_MACH_TL_WA850RE, "TL-WA850RE", "TP-LINK TL-WA850RE",
378              tl_wa850re_setup);
379
380 static void  __init tl_wa850re_v2_setup(void)
381 {
382         tl_ap143_setup();
383
384         /* For GPIO 0~4 */
385         ath79_gpio_function_setup(AR934X_GPIO_FUNC_JTAG_DISABLE,
386                                   AR934X_GPIO_FUNC_CLK_OBS4_EN);
387
388         /* Allow to enable/disable all LEDs from userspace */
389         gpio_request_one(TL_WA850RE_V2_GPIO_ENABLE_LEDS,
390                          GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED,
391                          "LEDs enable");
392
393         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa850re_v2_leds_gpio),
394                                  tl_wa850re_v2_leds_gpio);
395
396         ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
397                                         ARRAY_SIZE(tl_wax50re_gpio_keys),
398                                         tl_wax50re_gpio_keys);
399 }
400
401 MIPS_MACHINE(ATH79_MACH_TL_WA850RE_V2, "TL-WA850RE-V2",
402              "TP-LINK TL-WA850RE v2", tl_wa850re_v2_setup);
403
404 static void __init tl_wa855re_v1_setup(void)
405 {
406         tl_ap143_setup();
407
408         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa855re_v1_leds_gpio),
409                                  tl_wa855re_v1_leds_gpio);
410
411         ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
412                                         ARRAY_SIZE(tl_wax50re_gpio_keys),
413                                         tl_wax50re_gpio_keys);
414 }
415
416 MIPS_MACHINE(ATH79_MACH_TL_WA855RE_V1, "TL-WA855RE-v1", "TP-LINK TL-WA855RE v1",
417              tl_wa855re_v1_setup);
418
419 static void  __init tl_wa860re_setup(void)
420 {
421         tl_ap123_setup();
422         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa860re_leds_gpio),
423                                  tl_wa860re_leds_gpio);
424
425         ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
426                                         ARRAY_SIZE(tl_wa860re_gpio_keys),
427                                         tl_wa860re_gpio_keys);
428 }
429
430 MIPS_MACHINE(ATH79_MACH_TL_WA860RE, "TL-WA860RE", "TP-LINK TL-WA860RE",
431              tl_wa860re_setup);
432
433 static void __init tl_wa901nd_v3_setup(void)
434 {
435         tl_ap123_setup();
436         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa801nd_v2_leds_gpio),
437                         tl_wa801nd_v2_leds_gpio);
438
439         ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
440                                         ARRAY_SIZE(tl_wax50re_gpio_keys) - 1,
441                                         tl_wax50re_gpio_keys);
442 }
443
444 MIPS_MACHINE(ATH79_MACH_TL_WA901ND_V3, "TL-WA901ND-v3", "TP-LINK TL-WA901ND v3",
445              tl_wa901nd_v3_setup);