2 * TP-LINK TL-WR840N v2/v3 / TL-WR841N/ND v9/v11 / TL-WR842N/ND v3
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>
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.
15 #include <linux/gpio.h>
16 #include <linux/platform_device.h>
18 #include <asm/mach-ath79/ath79.h>
19 #include <asm/mach-ath79/ar71xx_regs.h>
23 #include "dev-gpio-buttons.h"
24 #include "dev-leds-gpio.h"
25 #include "dev-m25p80.h"
28 #include "machtypes.h"
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
36 #define TL_WR840NV2_GPIO_BTN_RESET 12
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
46 #define TL_WR841NV9_GPIO_BTN_RESET 12
47 #define TL_WR841NV9_GPIO_BTN_WIFI 17
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
59 #define TL_WR841NV11_GPIO_BTN_RESET 12
60 #define TL_WR841NV11_GPIO_BTN_WIFI 17
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
73 #define TL_WR842NV3_GPIO_BTN_RESET 1
74 #define TL_WR842NV3_GPIO_BTN_WIFI 0
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
86 #define TL_WR740NV6_GPIO_BTN_RESET 12
87 #define TL_WR740NV6_GPIO_BTN_WIFI 17
89 #define TL_WR841NV9_KEYS_POLL_INTERVAL 20 /* msecs */
90 #define TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL (3 * TL_WR841NV9_KEYS_POLL_INTERVAL)
92 static const char *tl_wr841n_v9_part_probes
[] = {
97 static struct flash_platform_data tl_wr841n_v9_flash_data
= {
98 .part_probes
= tl_wr841n_v9_part_probes
,
101 static struct gpio_led tl_wr840n_v2_leds_gpio
[] __initdata
= {
103 .name
= "tp-link:green:system",
104 .gpio
= TL_WR840NV2_GPIO_LED_SYSTEM
,
107 .name
= "tp-link:green:lan",
108 .gpio
= TL_WR840NV2_GPIO_LED_LAN
,
111 .name
= "tp-link:green:wps",
112 .gpio
= TL_WR840NV2_GPIO_LED_WPS
,
115 .name
= "tp-link:green:wan",
116 .gpio
= TL_WR840NV2_GPIO_LED_WAN
,
119 .name
= "tp-link:green:wlan",
120 .gpio
= TL_WR840NV2_GPIO_LED_WLAN
,
125 static struct gpio_keys_button tl_wr840n_v2_gpio_keys
[] __initdata
= {
127 .desc
= "Reset button",
130 .debounce_interval
= TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL
,
131 .gpio
= TL_WR840NV2_GPIO_BTN_RESET
,
136 static struct gpio_led tl_wr841n_v9_leds_gpio
[] __initdata
= {
138 .name
= "tp-link:green:lan1",
139 .gpio
= TL_WR841NV9_GPIO_LED_LAN1
,
142 .name
= "tp-link:green:lan2",
143 .gpio
= TL_WR841NV9_GPIO_LED_LAN2
,
146 .name
= "tp-link:green:lan3",
147 .gpio
= TL_WR841NV9_GPIO_LED_LAN3
,
150 .name
= "tp-link:green:lan4",
151 .gpio
= TL_WR841NV9_GPIO_LED_LAN4
,
154 .name
= "tp-link:green:qss",
155 .gpio
= TL_WR841NV9_GPIO_LED_QSS
,
158 .name
= "tp-link:green:wan",
159 .gpio
= TL_WR841NV9_GPIO_LED_WAN
,
162 .name
= "tp-link:green:wlan",
163 .gpio
= TL_WR841NV9_GPIO_LED_WLAN
,
168 static struct gpio_keys_button tl_wr841n_v9_gpio_keys
[] __initdata
= {
170 .desc
= "Reset button",
173 .debounce_interval
= TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL
,
174 .gpio
= TL_WR841NV9_GPIO_BTN_RESET
,
177 .desc
= "WIFI button",
180 .debounce_interval
= TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL
,
181 .gpio
= TL_WR841NV9_GPIO_BTN_WIFI
,
186 static struct gpio_led tl_wr841n_v11_leds_gpio
[] __initdata
= {
188 .name
= "tp-link:green:lan1",
189 .gpio
= TL_WR841NV9_GPIO_LED_LAN1
,
192 .name
= "tp-link:green:lan2",
193 .gpio
= TL_WR841NV9_GPIO_LED_LAN2
,
196 .name
= "tp-link:green:lan3",
197 .gpio
= TL_WR841NV9_GPIO_LED_LAN3
,
200 .name
= "tp-link:green:lan4",
201 .gpio
= TL_WR841NV9_GPIO_LED_LAN4
,
204 .name
= "tp-link:green:qss",
205 .gpio
= TL_WR841NV9_GPIO_LED_QSS
,
208 .name
= "tp-link:green:system",
209 .gpio
= TL_WR841NV11_GPIO_LED_SYSTEM
,
212 .name
= "tp-link:green:wan",
213 .gpio
= TL_WR841NV9_GPIO_LED_WAN
,
216 .name
= "tp-link:green:wan_status",
217 .gpio
= TL_WR841NV11_GPIO_LED_WAN_STATUS
,
220 .name
= "tp-link:green:wlan",
221 .gpio
= TL_WR841NV9_GPIO_LED_WLAN
,
226 static struct gpio_led tl_wr842n_v3_leds_gpio
[] __initdata
= {
228 .name
= "tp-link:green:lan1",
229 .gpio
= TL_WR842NV3_GPIO_LED_LAN1
,
232 .name
= "tp-link:green:lan2",
233 .gpio
= TL_WR842NV3_GPIO_LED_LAN2
,
236 .name
= "tp-link:green:lan3",
237 .gpio
= TL_WR842NV3_GPIO_LED_LAN3
,
240 .name
= "tp-link:green:lan4",
241 .gpio
= TL_WR842NV3_GPIO_LED_LAN4
,
244 .name
= "tp-link:green:wan",
245 .gpio
= TL_WR842NV3_GPIO_LED_WAN_GREEN
,
248 .name
= "tp-link:red:wan",
249 .gpio
= TL_WR842NV3_GPIO_LED_WAN_RED
,
252 .name
= "tp-link:green:wlan",
253 .gpio
= TL_WR842NV3_GPIO_LED_WLAN
,
256 .name
= "tp-link:green:system",
257 .gpio
= TL_WR842NV3_GPIO_LED_SYSTEM
,
260 .name
= "tp-link:green:3g",
261 .gpio
= TL_WR842NV3_GPIO_LED_3G
,
264 .name
= "tp-link:green:wps",
265 .gpio
= TL_WR842NV3_GPIO_LED_WPS
,
270 static struct gpio_keys_button tl_wr842n_v3_gpio_keys
[] __initdata
= {
272 .desc
= "Reset button",
275 .debounce_interval
= TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL
,
276 .gpio
= TL_WR842NV3_GPIO_BTN_RESET
,
279 .desc
= "WIFI button",
282 .debounce_interval
= TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL
,
283 .gpio
= TL_WR842NV3_GPIO_BTN_WIFI
,
288 static struct gpio_led tl_wr740n_v6_leds_gpio
[] __initdata
= {
290 .name
= "tp-link:green:lan1",
291 .gpio
= TL_WR740NV6_GPIO_LED_LAN1
,
294 .name
= "tp-link:green:lan2",
295 .gpio
= TL_WR740NV6_GPIO_LED_LAN2
,
298 .name
= "tp-link:green:lan3",
299 .gpio
= TL_WR740NV6_GPIO_LED_LAN3
,
302 .name
= "tp-link:green:lan4",
303 .gpio
= TL_WR740NV6_GPIO_LED_LAN4
,
306 .name
= "tp-link:green:system",
307 .gpio
= TL_WR740NV6_GPIO_LED_SYSTEM
,
310 .name
= "tp-link:green:qss",
311 .gpio
= TL_WR740NV6_GPIO_LED_QSS
,
314 .name
= "tp-link:green:wan",
315 .gpio
= TL_WR740NV6_GPIO_LED_WAN_GREEN
,
318 .name
= "tp-link:orange:wan",
319 .gpio
= TL_WR740NV6_GPIO_LED_WAN_ORANGE
,
322 .name
= "tp-link:green:wlan",
323 .gpio
= TL_WR740NV6_GPIO_LED_WLAN
,
328 static struct gpio_keys_button tl_wr740n_v6_gpio_keys
[] __initdata
= {
330 .desc
= "Reset button",
333 .debounce_interval
= TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL
,
334 .gpio
= TL_WR740NV6_GPIO_BTN_RESET
,
337 .desc
= "WIFI button",
340 .debounce_interval
= TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL
,
341 .gpio
= TL_WR740NV6_GPIO_BTN_WIFI
,
346 static void __init
tl_ap143_setup(void)
348 u8
*mac
= (u8
*) KSEG1ADDR(0x1f01fc00);
349 u8
*ee
= (u8
*) KSEG1ADDR(0x1fff1000);
352 ath79_register_m25p80(&tl_wr841n_v9_flash_data
);
354 ath79_setup_ar933x_phy4_switch(false, false);
356 ath79_register_mdio(0, 0x0);
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);
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);
374 ath79_init_mac(tmpmac
, mac
, 0);
375 ath79_register_wmac(ee
, tmpmac
);
379 static void __init
tl_wr840n_v2_setup(void)
383 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr840n_v2_leds_gpio
),
384 tl_wr840n_v2_leds_gpio
);
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
);
391 MIPS_MACHINE(ATH79_MACH_TL_WR840N_V2
, "TL-WR840N-v2", "TP-LINK TL-WR840N v2",
394 MIPS_MACHINE(ATH79_MACH_TL_WR840N_V3
, "TL-WR840N-v3", "TP-LINK TL-WR840N v3",
397 static void __init
tl_wr841n_v9_setup(void)
401 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr841n_v9_leds_gpio
),
402 tl_wr841n_v9_leds_gpio
);
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
);
409 MIPS_MACHINE(ATH79_MACH_TL_WR841N_V9
, "TL-WR841N-v9", "TP-LINK TL-WR841N/ND v9",
412 static void __init
tl_wr841n_v11_setup(void)
416 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr841n_v11_leds_gpio
),
417 tl_wr841n_v11_leds_gpio
);
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
);
424 MIPS_MACHINE(ATH79_MACH_TL_WR841N_V11
, "TL-WR841N-v11", "TP-LINK TL-WR841N/ND v11",
425 tl_wr841n_v11_setup
);
427 static void __init
tl_wr842n_v3_setup(void)
431 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr842n_v3_leds_gpio
),
432 tl_wr842n_v3_leds_gpio
);
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
);
438 ath79_register_usb();
441 MIPS_MACHINE(ATH79_MACH_TL_WR842N_V3
, "TL-WR842N-v3", "TP-LINK TL-WR842N/ND v3",
444 static void __init
tl_wr740n_v6_setup(void)
448 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr740n_v6_leds_gpio
),
449 tl_wr740n_v6_leds_gpio
);
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
);
456 MIPS_MACHINE(ATH79_MACH_TL_WR740N_V6
, "TL-WR740N-v6", "TP-LINK TL-WR740N/ND v6",