2 * Support for TP-Link boards:
8 * Copyright (C) 2013 Martijn Zilverschoon <thefriedzombie@gmail.com>
9 * Copyright (C) 2013 Jiri Pirko <jiri@resnulli.us>
10 * Copyright (C) 2017 Piotr Dymacz <pepe2k@gmail.com>
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License version 2 as published
14 * by the Free Software Foundation.
17 #include <linux/gpio.h>
18 #include <linux/platform_device.h>
20 #include <asm/mach-ath79/ath79.h>
21 #include <asm/mach-ath79/ar71xx_regs.h>
25 #include "dev-gpio-buttons.h"
26 #include "dev-leds-gpio.h"
27 #include "dev-m25p80.h"
29 #include "machtypes.h"
31 #define TL_WAX50RE_GPIO_LED_LAN 20
32 #define TL_WAX50RE_GPIO_LED_WLAN 13
33 #define TL_WAX50RE_GPIO_LED_RE 15
34 #define TL_WAX50RE_GPIO_LED_SIGNAL1 0
35 #define TL_WAX50RE_GPIO_LED_SIGNAL2 1
36 #define TL_WAX50RE_GPIO_LED_SIGNAL3 2
37 #define TL_WAX50RE_GPIO_LED_SIGNAL4 3
38 #define TL_WAX50RE_GPIO_LED_SIGNAL5 4
40 #define TL_WA850RE_V2_GPIO_LED_LAN 14
41 #define TL_WA850RE_V2_GPIO_LED_RE 12
42 #define TL_WA850RE_V2_GPIO_LED_SIGNAL1 0
43 #define TL_WA850RE_V2_GPIO_LED_SIGNAL2 1
44 #define TL_WA850RE_V2_GPIO_LED_SIGNAL3 2
45 #define TL_WA850RE_V2_GPIO_LED_SIGNAL4 3
46 #define TL_WA850RE_V2_GPIO_LED_SIGNAL5 4
47 #define TL_WA850RE_V2_GPIO_LED_WLAN 13
49 #define TL_WA850RE_V2_GPIO_ENABLE_LEDS 15
51 #define TL_WA860RE_GPIO_LED_WLAN_ORANGE 0
52 #define TL_WA860RE_GPIO_LED_WLAN_GREEN 2
53 #define TL_WA860RE_GPIO_LED_POWER_ORANGE 12
54 #define TL_WA860RE_GPIO_LED_POWER_GREEN 14
55 #define TL_WA860RE_GPIO_LED_LAN 20
57 #define TL_WA801ND_V2_GPIO_LED_LAN 18
58 #define TL_WA801ND_V2_GPIO_LED_SYSTEM 14
60 #define TL_WAX50RE_GPIO_BTN_RESET 17
61 #define TL_WAX50RE_GPIO_BTN_WPS 16
63 #define TL_WA860RE_GPIO_BTN_RESET 17
64 #define TL_WA860RE_GPIO_BTN_WPS 16
65 #define TL_WA860RE_GPIO_BTN_ONOFF 11
67 #define TL_WAX50RE_KEYS_POLL_INTERVAL 20 /* msecs */
68 #define TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL (3 * TL_WAX50RE_KEYS_POLL_INTERVAL)
70 static const char *tl_wax50re_part_probes
[] = {
75 static struct flash_platform_data tl_wax50re_flash_data
= {
76 .part_probes
= tl_wax50re_part_probes
,
79 static struct gpio_led tl_wa750re_leds_gpio
[] __initdata
= {
81 .name
= "tp-link:orange:lan",
82 .gpio
= TL_WAX50RE_GPIO_LED_LAN
,
85 .name
= "tp-link:orange:wlan",
86 .gpio
= TL_WAX50RE_GPIO_LED_WLAN
,
89 .name
= "tp-link:orange:re",
90 .gpio
= TL_WAX50RE_GPIO_LED_RE
,
93 .name
= "tp-link:orange:signal1",
94 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL1
,
97 .name
= "tp-link:orange:signal2",
98 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL2
,
101 .name
= "tp-link:orange:signal3",
102 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL3
,
105 .name
= "tp-link:orange:signal4",
106 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL4
,
109 .name
= "tp-link:orange:signal5",
110 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL5
,
115 static struct gpio_led tl_wa850re_leds_gpio
[] __initdata
= {
117 .name
= "tp-link:blue:lan",
118 .gpio
= TL_WAX50RE_GPIO_LED_LAN
,
121 .name
= "tp-link:blue:wlan",
122 .gpio
= TL_WAX50RE_GPIO_LED_WLAN
,
125 .name
= "tp-link:blue:re",
126 .gpio
= TL_WAX50RE_GPIO_LED_RE
,
129 .name
= "tp-link:blue:signal1",
130 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL1
,
133 .name
= "tp-link:blue:signal2",
134 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL2
,
137 .name
= "tp-link:blue:signal3",
138 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL3
,
141 .name
= "tp-link:blue:signal4",
142 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL4
,
145 .name
= "tp-link:blue:signal5",
146 .gpio
= TL_WAX50RE_GPIO_LED_SIGNAL5
,
151 static struct gpio_led tl_wa850re_v2_leds_gpio
[] __initdata
= {
153 .name
= "tp-link:blue:lan",
154 .gpio
= TL_WA850RE_V2_GPIO_LED_LAN
,
157 .name
= "tp-link:blue:re",
158 .gpio
= TL_WA850RE_V2_GPIO_LED_RE
,
161 .name
= "tp-link:blue:signal1",
162 .gpio
= TL_WA850RE_V2_GPIO_LED_SIGNAL1
,
165 .name
= "tp-link:blue:signal2",
166 .gpio
= TL_WA850RE_V2_GPIO_LED_SIGNAL2
,
169 .name
= "tp-link:blue:signal3",
170 .gpio
= TL_WA850RE_V2_GPIO_LED_SIGNAL3
,
173 .name
= "tp-link:blue:signal4",
174 .gpio
= TL_WA850RE_V2_GPIO_LED_SIGNAL4
,
177 .name
= "tp-link:blue:signal5",
178 .gpio
= TL_WA850RE_V2_GPIO_LED_SIGNAL5
,
181 .name
= "tp-link:blue:wlan",
182 .gpio
= TL_WA850RE_V2_GPIO_LED_WLAN
,
187 static struct gpio_led tl_wa860re_leds_gpio
[] __initdata
= {
189 .name
= "tp-link:green:lan",
190 .gpio
= TL_WA860RE_GPIO_LED_LAN
,
193 .name
= "tp-link:green:power",
194 .gpio
= TL_WA860RE_GPIO_LED_POWER_GREEN
,
197 .name
= "tp-link:orange:power",
198 .gpio
= TL_WA860RE_GPIO_LED_POWER_ORANGE
,
201 .name
= "tp-link:green:wlan",
202 .gpio
= TL_WA860RE_GPIO_LED_WLAN_GREEN
,
205 .name
= "tp-link:orange:wlan",
206 .gpio
= TL_WA860RE_GPIO_LED_WLAN_ORANGE
,
212 static struct gpio_keys_button tl_wax50re_gpio_keys
[] __initdata
= {
214 .desc
= "Reset button",
217 .debounce_interval
= TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL
,
218 .gpio
= TL_WAX50RE_GPIO_BTN_RESET
,
223 .code
= KEY_WPS_BUTTON
,
224 .debounce_interval
= TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL
,
225 .gpio
= TL_WAX50RE_GPIO_BTN_WPS
,
230 static struct gpio_keys_button tl_wa860re_gpio_keys
[] __initdata
= {
232 .desc
= "Reset button",
235 .debounce_interval
= TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL
,
236 .gpio
= TL_WA860RE_GPIO_BTN_RESET
,
241 .code
= KEY_WPS_BUTTON
,
242 .debounce_interval
= TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL
,
243 .gpio
= TL_WA860RE_GPIO_BTN_WPS
,
249 .debounce_interval
= TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL
,
250 .gpio
= TL_WA860RE_GPIO_BTN_ONOFF
,
255 static struct gpio_led tl_wa801nd_v2_leds_gpio
[] __initdata
= {
257 .name
= "tp-link:green:lan",
258 .gpio
= TL_WA801ND_V2_GPIO_LED_LAN
,
261 .name
= "tp-link:green:wlan",
262 .gpio
= TL_WAX50RE_GPIO_LED_WLAN
,
265 .name
= "tp-link:green:qss",
266 .gpio
= TL_WAX50RE_GPIO_LED_RE
,
269 .name
= "tp-link:green:system",
270 .gpio
= TL_WA801ND_V2_GPIO_LED_SYSTEM
,
275 static void __init
tl_ap123_setup(void)
277 u8
*mac
= (u8
*) KSEG1ADDR(0x1f01fc00);
278 u8
*ee
= (u8
*) KSEG1ADDR(0x1fff1000);
280 ath79_register_m25p80(&tl_wax50re_flash_data
);
282 ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_PHY_SWAP
);
284 ath79_register_mdio(1, 0x0);
286 ath79_init_mac(ath79_eth0_data
.mac_addr
, mac
, 0);
288 ath79_eth0_data
.phy_if_mode
= PHY_INTERFACE_MODE_MII
;
289 ath79_eth0_data
.phy_mask
= BIT(0);
290 ath79_eth0_data
.mii_bus_dev
= &ath79_mdio1_device
.dev
;
291 ath79_register_eth(0);
293 ath79_register_wmac(ee
, mac
);
296 static void __init
tl_ap143_setup(void)
298 u8
*mac
= (u8
*) KSEG1ADDR(0x1f3c0008);
299 u8
*ee
= (u8
*) KSEG1ADDR(0x1fff1000);
302 ath79_register_m25p80(NULL
);
304 ath79_setup_ar933x_phy4_switch(false, false);
306 ath79_register_mdio(0, 0x0);
308 ath79_switch_data
.phy4_mii_en
= 1;
309 ath79_eth0_data
.duplex
= DUPLEX_FULL
;
310 ath79_eth0_data
.phy_if_mode
= PHY_INTERFACE_MODE_MII
;
311 ath79_eth0_data
.phy_mask
= BIT(4);
312 ath79_eth0_data
.speed
= SPEED_100
;
313 ath79_init_mac(ath79_eth0_data
.mac_addr
, mac
, -2);
314 ath79_register_eth(0);
316 ath79_init_mac(tmpmac
, mac
, 0);
317 ath79_register_wmac(ee
, mac
);
320 static void __init
tl_wa750re_setup(void)
323 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa750re_leds_gpio
),
324 tl_wa750re_leds_gpio
);
326 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL
,
327 ARRAY_SIZE(tl_wax50re_gpio_keys
),
328 tl_wax50re_gpio_keys
);
331 MIPS_MACHINE(ATH79_MACH_TL_WA750RE
, "TL-WA750RE", "TP-LINK TL-WA750RE",
334 static void __init
tl_wa801nd_v2_setup(void)
337 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa801nd_v2_leds_gpio
),
338 tl_wa801nd_v2_leds_gpio
);
340 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL
,
341 ARRAY_SIZE(tl_wax50re_gpio_keys
),
342 tl_wax50re_gpio_keys
);
345 MIPS_MACHINE(ATH79_MACH_TL_WA801ND_V2
, "TL-WA801ND-v2", "TP-LINK TL-WA801ND v2",
346 tl_wa801nd_v2_setup
);
348 static void __init
tl_wa850re_setup(void)
351 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa850re_leds_gpio
),
352 tl_wa850re_leds_gpio
);
354 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL
,
355 ARRAY_SIZE(tl_wax50re_gpio_keys
),
356 tl_wax50re_gpio_keys
);
359 MIPS_MACHINE(ATH79_MACH_TL_WA850RE
, "TL-WA850RE", "TP-LINK TL-WA850RE",
362 static void __init
tl_wa850re_v2_setup(void)
367 ath79_gpio_function_setup(AR934X_GPIO_FUNC_JTAG_DISABLE
,
368 AR934X_GPIO_FUNC_CLK_OBS4_EN
);
370 /* Allow to enable/disable all LEDs from userspace */
371 gpio_request_one(TL_WA850RE_V2_GPIO_ENABLE_LEDS
,
372 GPIOF_OUT_INIT_HIGH
| GPIOF_EXPORT_DIR_FIXED
,
375 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa850re_v2_leds_gpio
),
376 tl_wa850re_v2_leds_gpio
);
378 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL
,
379 ARRAY_SIZE(tl_wax50re_gpio_keys
),
380 tl_wax50re_gpio_keys
);
383 MIPS_MACHINE(ATH79_MACH_TL_WA850RE_V2
, "TL-WA850RE-V2",
384 "TP-LINK TL-WA850RE v2", tl_wa850re_v2_setup
);
386 static void __init
tl_wa860re_setup(void)
389 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa860re_leds_gpio
),
390 tl_wa860re_leds_gpio
);
392 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL
,
393 ARRAY_SIZE(tl_wa860re_gpio_keys
),
394 tl_wa860re_gpio_keys
);
397 MIPS_MACHINE(ATH79_MACH_TL_WA860RE
, "TL-WA860RE", "TP-LINK TL-WA860RE",
400 static void __init
tl_wa901nd_v3_setup(void)
403 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa801nd_v2_leds_gpio
),
404 tl_wa801nd_v2_leds_gpio
);
406 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL
,
407 ARRAY_SIZE(tl_wax50re_gpio_keys
) - 1,
408 tl_wax50re_gpio_keys
);
411 MIPS_MACHINE(ATH79_MACH_TL_WA901ND_V3
, "TL-WA901ND-v3", "TP-LINK TL-WA901ND v3",
412 tl_wa901nd_v3_setup
);