ar71xx: mach-rbspi: simplify reset button registration
[oweals/openwrt.git] / target / linux / ar71xx / files / arch / mips / ath79 / mach-tl-wr841n-v9.c
1 /*
2  *  TP-LINK TL-WR840N v2/v3 / TL-WR841N/ND v9/v11 / TL-WR842N/ND v3
3  *
4  *  Copyright (C) 2014 Matthias Schiffer <mschiffer@universe-factory.net>
5  *  Copyright (C) 2016 Cezary Jackiewicz <cezary@eko.one.pl>
6  *  Copyright (C) 2016 Stijn Segers <francesco.borromini@gmail.com>
7  *  Copyright (C) 2017 Vaclav Svoboda <svoboda@neng.cz>
8  *  Copyright (C) 2017 Andrey Polischuk <androld.b@gmail.com>
9  *
10  *  This program is free software; you can redistribute it and/or modify it
11  *  under the terms of the GNU General Public License version 2 as published
12  *  by the Free Software Foundation.
13  */
14
15 #include <linux/gpio.h>
16 #include <linux/platform_device.h>
17
18 #include <asm/mach-ath79/ath79.h>
19 #include <asm/mach-ath79/ar71xx_regs.h>
20
21 #include "common.h"
22 #include "dev-eth.h"
23 #include "dev-gpio-buttons.h"
24 #include "dev-leds-gpio.h"
25 #include "dev-m25p80.h"
26 #include "dev-usb.h"
27 #include "dev-wmac.h"
28 #include "machtypes.h"
29
30 #define TL_WR840NV2_GPIO_LED_SYSTEM     15
31 #define TL_WR840NV2_GPIO_LED_WLAN       13
32 #define TL_WR840NV2_GPIO_LED_WPS        3
33 #define TL_WR840NV2_GPIO_LED_WAN        4
34 #define TL_WR840NV2_GPIO_LED_LAN        16
35
36 #define TL_WR840NV2_GPIO_BTN_RESET      12
37
38 #define TL_WR841NV9_GPIO_LED_WLAN       13
39 #define TL_WR841NV9_GPIO_LED_QSS        3
40 #define TL_WR841NV9_GPIO_LED_WAN        4
41 #define TL_WR841NV9_GPIO_LED_LAN1       16
42 #define TL_WR841NV9_GPIO_LED_LAN2       15
43 #define TL_WR841NV9_GPIO_LED_LAN3       14
44 #define TL_WR841NV9_GPIO_LED_LAN4       11
45
46 #define TL_WR841NV9_GPIO_BTN_RESET      12
47 #define TL_WR841NV9_GPIO_BTN_WIFI       17
48
49 #define TL_WR841NV11_GPIO_LED_SYSTEM    1
50 #define TL_WR841NV11_GPIO_LED_QSS       3
51 #define TL_WR841NV11_GPIO_LED_WAN       4
52 #define TL_WR841NV11_GPIO_LED_WAN_STATUS        2
53 #define TL_WR841NV11_GPIO_LED_WLAN      13
54 #define TL_WR841NV11_GPIO_LED_LAN1      16
55 #define TL_WR841NV11_GPIO_LED_LAN2      15
56 #define TL_WR841NV11_GPIO_LED_LAN3      14
57 #define TL_WR841NV11_GPIO_LED_LAN4      11
58
59 #define TL_WR841NV11_GPIO_BTN_RESET     12
60 #define TL_WR841NV11_GPIO_BTN_WIFI      17
61
62 #define TL_WR842NV3_GPIO_LED_SYSTEM     2
63 #define TL_WR842NV3_GPIO_LED_WLAN       3
64 #define TL_WR842NV3_GPIO_LED_WAN_RED    4
65 #define TL_WR842NV3_GPIO_LED_WAN_GREEN  11
66 #define TL_WR842NV3_GPIO_LED_LAN1       12
67 #define TL_WR842NV3_GPIO_LED_LAN2       13
68 #define TL_WR842NV3_GPIO_LED_LAN3       14
69 #define TL_WR842NV3_GPIO_LED_LAN4       15
70 #define TL_WR842NV3_GPIO_LED_3G         16
71 #define TL_WR842NV3_GPIO_LED_WPS        17
72
73 #define TL_WR842NV3_GPIO_BTN_RESET      1
74 #define TL_WR842NV3_GPIO_BTN_WIFI       0
75
76 #define TL_WR740NV6_GPIO_LED_SYSTEM     1
77 #define TL_WR740NV6_GPIO_LED_QSS        3
78 #define TL_WR740NV6_GPIO_LED_WAN_ORANGE 2
79 #define TL_WR740NV6_GPIO_LED_WAN_GREEN  4
80 #define TL_WR740NV6_GPIO_LED_LAN1       16
81 #define TL_WR740NV6_GPIO_LED_LAN2       15
82 #define TL_WR740NV6_GPIO_LED_LAN3       14
83 #define TL_WR740NV6_GPIO_LED_LAN4       11
84 #define TL_WR740NV6_GPIO_LED_WLAN       13
85
86 #define TL_WR740NV6_GPIO_BTN_RESET      12
87 #define TL_WR740NV6_GPIO_BTN_WIFI       17
88
89 #define TL_WR841NV9_KEYS_POLL_INTERVAL  20      /* msecs */
90 #define TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL (3 * TL_WR841NV9_KEYS_POLL_INTERVAL)
91
92 static const char *tl_wr841n_v9_part_probes[] = {
93         "tp-link",
94         NULL,
95 };
96
97 static struct flash_platform_data tl_wr841n_v9_flash_data = {
98         .part_probes    = tl_wr841n_v9_part_probes,
99 };
100
101 static struct gpio_led tl_wr840n_v2_leds_gpio[] __initdata = {
102         {
103                 .name           = "tp-link:green:system",
104                 .gpio           = TL_WR840NV2_GPIO_LED_SYSTEM,
105                 .active_low     = 1,
106         }, {
107                 .name           = "tp-link:green:lan",
108                 .gpio           = TL_WR840NV2_GPIO_LED_LAN,
109                 .active_low     = 1,
110         }, {
111                 .name           = "tp-link:green:wps",
112                 .gpio           = TL_WR840NV2_GPIO_LED_WPS,
113                 .active_low     = 1,
114         }, {
115                 .name           = "tp-link:green:wan",
116                 .gpio           = TL_WR840NV2_GPIO_LED_WAN,
117                 .active_low     = 1,
118         }, {
119                 .name           = "tp-link:green:wlan",
120                 .gpio           = TL_WR840NV2_GPIO_LED_WLAN,
121                 .active_low     = 1,
122         },
123 };
124
125 static struct gpio_keys_button tl_wr840n_v2_gpio_keys[] __initdata = {
126         {
127                 .desc           = "Reset button",
128                 .type           = EV_KEY,
129                 .code           = KEY_RESTART,
130                 .debounce_interval = TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL,
131                 .gpio           = TL_WR840NV2_GPIO_BTN_RESET,
132                 .active_low     = 1,
133         }
134 };
135
136 static struct gpio_led tl_wr841n_v9_leds_gpio[] __initdata = {
137         {
138                 .name           = "tp-link:green:lan1",
139                 .gpio           = TL_WR841NV9_GPIO_LED_LAN1,
140                 .active_low     = 1,
141         }, {
142                 .name           = "tp-link:green:lan2",
143                 .gpio           = TL_WR841NV9_GPIO_LED_LAN2,
144                 .active_low     = 1,
145         }, {
146                 .name           = "tp-link:green:lan3",
147                 .gpio           = TL_WR841NV9_GPIO_LED_LAN3,
148                 .active_low     = 1,
149         }, {
150                 .name           = "tp-link:green:lan4",
151                 .gpio           = TL_WR841NV9_GPIO_LED_LAN4,
152                 .active_low     = 1,
153         }, {
154                 .name           = "tp-link:green:qss",
155                 .gpio           = TL_WR841NV9_GPIO_LED_QSS,
156                 .active_low     = 1,
157         }, {
158                 .name           = "tp-link:green:wan",
159                 .gpio           = TL_WR841NV9_GPIO_LED_WAN,
160                 .active_low     = 1,
161         }, {
162                 .name           = "tp-link:green:wlan",
163                 .gpio           = TL_WR841NV9_GPIO_LED_WLAN,
164                 .active_low     = 1,
165         },
166 };
167
168 static struct gpio_keys_button tl_wr841n_v9_gpio_keys[] __initdata = {
169         {
170                 .desc           = "Reset button",
171                 .type           = EV_KEY,
172                 .code           = KEY_RESTART,
173                 .debounce_interval = TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL,
174                 .gpio           = TL_WR841NV9_GPIO_BTN_RESET,
175                 .active_low     = 1,
176         }, {
177                 .desc           = "WIFI button",
178                 .type           = EV_KEY,
179                 .code           = KEY_RFKILL,
180                 .debounce_interval = TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL,
181                 .gpio           = TL_WR841NV9_GPIO_BTN_WIFI,
182                 .active_low     = 1,
183         }
184 };
185
186 static struct gpio_led tl_wr841n_v11_leds_gpio[] __initdata = {
187         {
188                 .name           = "tp-link:green:lan1",
189                 .gpio           = TL_WR841NV9_GPIO_LED_LAN1,
190                 .active_low     = 1,
191         }, {
192                 .name           = "tp-link:green:lan2",
193                 .gpio           = TL_WR841NV9_GPIO_LED_LAN2,
194                 .active_low     = 1,
195         }, {
196                 .name           = "tp-link:green:lan3",
197                 .gpio           = TL_WR841NV9_GPIO_LED_LAN3,
198                 .active_low     = 1,
199         }, {
200                 .name           = "tp-link:green:lan4",
201                 .gpio           = TL_WR841NV9_GPIO_LED_LAN4,
202                 .active_low     = 1,
203         }, {
204                 .name           = "tp-link:green:qss",
205                 .gpio           = TL_WR841NV9_GPIO_LED_QSS,
206                 .active_low     = 1,
207         }, {
208                 .name           = "tp-link:green:system",
209                 .gpio           = TL_WR841NV11_GPIO_LED_SYSTEM,
210                 .active_low     = 1,
211         }, {
212                 .name           = "tp-link:green:wan",
213                 .gpio           = TL_WR841NV9_GPIO_LED_WAN,
214                 .active_low     = 1,
215         }, {
216                 .name           = "tp-link:green:wan_status",
217                 .gpio           = TL_WR841NV11_GPIO_LED_WAN_STATUS,
218                 .active_low     = 1,
219         }, {
220                 .name           = "tp-link:green:wlan",
221                 .gpio           = TL_WR841NV9_GPIO_LED_WLAN,
222                 .active_low     = 1,
223         },
224 };
225
226 static struct gpio_led tl_wr842n_v3_leds_gpio[] __initdata = {
227         {
228                 .name           = "tp-link:green:lan1",
229                 .gpio           = TL_WR842NV3_GPIO_LED_LAN1,
230                 .active_low     = 1,
231         }, {
232                 .name           = "tp-link:green:lan2",
233                 .gpio           = TL_WR842NV3_GPIO_LED_LAN2,
234                 .active_low     = 1,
235         }, {
236                 .name           = "tp-link:green:lan3",
237                 .gpio           = TL_WR842NV3_GPIO_LED_LAN3,
238                 .active_low     = 1,
239         }, {
240                 .name           = "tp-link:green:lan4",
241                 .gpio           = TL_WR842NV3_GPIO_LED_LAN4,
242                 .active_low     = 1,
243         }, {
244                 .name           = "tp-link:green:wan",
245                 .gpio           = TL_WR842NV3_GPIO_LED_WAN_GREEN,
246                 .active_low     = 1,
247         }, {
248                 .name           = "tp-link:red:wan",
249                 .gpio           = TL_WR842NV3_GPIO_LED_WAN_RED,
250                 .active_low     = 1,
251         }, {
252                 .name           = "tp-link:green:wlan",
253                 .gpio           = TL_WR842NV3_GPIO_LED_WLAN,
254                 .active_low     = 1,
255         }, {
256                 .name           = "tp-link:green:system",
257                 .gpio           = TL_WR842NV3_GPIO_LED_SYSTEM,
258                 .active_low     = 1,
259         }, {
260                 .name           = "tp-link:green:3g",
261                 .gpio           = TL_WR842NV3_GPIO_LED_3G,
262                 .active_low     = 1,
263         }, {
264                 .name           = "tp-link:green:wps",
265                 .gpio           = TL_WR842NV3_GPIO_LED_WPS,
266                 .active_low     = 1,
267         },
268 };
269
270 static struct gpio_keys_button tl_wr842n_v3_gpio_keys[] __initdata = {
271         {
272                 .desc           = "Reset button",
273                 .type           = EV_KEY,
274                 .code           = KEY_RESTART,
275                 .debounce_interval = TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL,
276                 .gpio           = TL_WR842NV3_GPIO_BTN_RESET,
277                 .active_low     = 1,
278         }, {
279                 .desc           = "WIFI button",
280                 .type           = EV_KEY,
281                 .code           = KEY_RFKILL,
282                 .debounce_interval = TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL,
283                 .gpio           = TL_WR842NV3_GPIO_BTN_WIFI,
284                 .active_low     = 1,
285         }
286 };
287
288 static struct gpio_led tl_wr740n_v6_leds_gpio[] __initdata = {
289         {
290                 .name           = "tp-link:green:lan1",
291                 .gpio           = TL_WR740NV6_GPIO_LED_LAN1,
292                 .active_low     = 1,
293         }, {
294                 .name           = "tp-link:green:lan2",
295                 .gpio           = TL_WR740NV6_GPIO_LED_LAN2,
296                 .active_low     = 1,
297         }, {
298                 .name           = "tp-link:green:lan3",
299                 .gpio           = TL_WR740NV6_GPIO_LED_LAN3,
300                 .active_low     = 1,
301         }, {
302                 .name           = "tp-link:green:lan4",
303                 .gpio           = TL_WR740NV6_GPIO_LED_LAN4,
304                 .active_low     = 1,
305         }, {
306                 .name           = "tp-link:green:system",
307                 .gpio           = TL_WR740NV6_GPIO_LED_SYSTEM,
308                 .active_low     = 1,
309         }, {
310                 .name           = "tp-link:green:qss",
311                 .gpio           = TL_WR740NV6_GPIO_LED_QSS,
312                 .active_low     = 1,
313         }, {
314                 .name           = "tp-link:green:wan",
315                 .gpio           = TL_WR740NV6_GPIO_LED_WAN_GREEN,
316                 .active_low     = 1,
317         }, {
318                 .name           = "tp-link:orange:wan",
319                 .gpio           = TL_WR740NV6_GPIO_LED_WAN_ORANGE,
320                 .active_low     = 1,
321         }, {
322                 .name           = "tp-link:green:wlan",
323                 .gpio           = TL_WR740NV6_GPIO_LED_WLAN,
324                 .active_low     = 1,
325         },
326 };
327
328 static struct gpio_keys_button tl_wr740n_v6_gpio_keys[] __initdata = {
329         {
330                 .desc           = "Reset button",
331                 .type           = EV_KEY,
332                 .code           = KEY_RESTART,
333                 .debounce_interval = TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL,
334                 .gpio           = TL_WR740NV6_GPIO_BTN_RESET,
335                 .active_low     = 1,
336         }, {
337                 .desc           = "WIFI button",
338                 .type           = EV_KEY,
339                 .code           = KEY_RFKILL,
340                 .debounce_interval = TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL,
341                 .gpio           = TL_WR740NV6_GPIO_BTN_WIFI,
342                 .active_low     = 1,
343         }
344 };
345
346 static void __init tl_ap143_setup(void)
347 {
348         u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
349         u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
350         u8 tmpmac[ETH_ALEN];
351
352         ath79_register_m25p80(&tl_wr841n_v9_flash_data);
353
354         ath79_setup_ar933x_phy4_switch(false, false);
355
356         ath79_register_mdio(0, 0x0);
357
358         /* LAN */
359         ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
360         ath79_eth1_data.duplex = DUPLEX_FULL;
361         ath79_switch_data.phy_poll_mask |= BIT(4);
362         ath79_init_mac(ath79_eth1_data.mac_addr, mac, 0);
363         ath79_register_eth(1);
364
365         /* WAN */
366         ath79_switch_data.phy4_mii_en = 1;
367         ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
368         ath79_eth0_data.duplex = DUPLEX_FULL;
369         ath79_eth0_data.speed = SPEED_100;
370         ath79_eth0_data.phy_mask = BIT(4);
371         ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);
372         ath79_register_eth(0);
373
374         ath79_init_mac(tmpmac, mac, 0);
375         ath79_register_wmac(ee, tmpmac);
376 }
377
378
379 static void __init tl_wr840n_v2_setup(void)
380 {
381         tl_ap143_setup();
382
383         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr840n_v2_leds_gpio),
384                                  tl_wr840n_v2_leds_gpio);
385
386         ath79_register_gpio_keys_polled(1, TL_WR841NV9_KEYS_POLL_INTERVAL,
387                                         ARRAY_SIZE(tl_wr840n_v2_gpio_keys),
388                                         tl_wr840n_v2_gpio_keys);
389 }
390
391 MIPS_MACHINE(ATH79_MACH_TL_WR840N_V2, "TL-WR840N-v2", "TP-LINK TL-WR840N v2",
392              tl_wr840n_v2_setup);
393
394 MIPS_MACHINE(ATH79_MACH_TL_WR840N_V3, "TL-WR840N-v3", "TP-LINK TL-WR840N v3",
395              tl_wr840n_v2_setup);
396
397 static void __init tl_wr841n_v9_setup(void)
398 {
399         tl_ap143_setup();
400
401         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr841n_v9_leds_gpio),
402                                  tl_wr841n_v9_leds_gpio);
403
404         ath79_register_gpio_keys_polled(1, TL_WR841NV9_KEYS_POLL_INTERVAL,
405                                         ARRAY_SIZE(tl_wr841n_v9_gpio_keys),
406                                         tl_wr841n_v9_gpio_keys);
407 }
408
409 MIPS_MACHINE(ATH79_MACH_TL_WR841N_V9, "TL-WR841N-v9", "TP-LINK TL-WR841N/ND v9",
410              tl_wr841n_v9_setup);
411
412 static void __init tl_wr841n_v11_setup(void)
413 {
414         tl_ap143_setup();
415
416         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr841n_v11_leds_gpio),
417                                  tl_wr841n_v11_leds_gpio);
418
419         ath79_register_gpio_keys_polled(1, TL_WR841NV9_KEYS_POLL_INTERVAL,
420                                         ARRAY_SIZE(tl_wr841n_v9_gpio_keys),
421                                         tl_wr841n_v9_gpio_keys);
422 }
423
424 MIPS_MACHINE(ATH79_MACH_TL_WR841N_V11, "TL-WR841N-v11", "TP-LINK TL-WR841N/ND v11",
425              tl_wr841n_v11_setup);
426
427 static void __init tl_wr842n_v3_setup(void)
428 {
429         tl_ap143_setup();
430
431         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr842n_v3_leds_gpio),
432                                  tl_wr842n_v3_leds_gpio);
433
434         ath79_register_gpio_keys_polled(1, TL_WR841NV9_KEYS_POLL_INTERVAL,
435                                         ARRAY_SIZE(tl_wr842n_v3_gpio_keys),
436                                         tl_wr842n_v3_gpio_keys);
437
438         ath79_register_usb();
439 }
440
441 MIPS_MACHINE(ATH79_MACH_TL_WR842N_V3, "TL-WR842N-v3", "TP-LINK TL-WR842N/ND v3",
442              tl_wr842n_v3_setup);
443
444 static void __init tl_wr740n_v6_setup(void)
445 {
446         tl_ap143_setup();
447
448         ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr740n_v6_leds_gpio),
449                                  tl_wr740n_v6_leds_gpio);
450
451         ath79_register_gpio_keys_polled(1, TL_WR841NV9_KEYS_POLL_INTERVAL,
452                                         ARRAY_SIZE(tl_wr740n_v6_gpio_keys),
453                                         tl_wr740n_v6_gpio_keys);
454 }
455
456 MIPS_MACHINE(ATH79_MACH_TL_WR740N_V6, "TL-WR740N-v6", "TP-LINK TL-WR740N/ND v6",
457              tl_wr740n_v6_setup);