ar71xx: add support for TP-Link TL-WA850RE v2
[openwrt/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-WA901ND v3
7 *
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>
11 *
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.
15 */
16
17 #include <linux/gpio.h>
18 #include <linux/platform_device.h>
19
20 #include <asm/mach-ath79/ath79.h>
21 #include <asm/mach-ath79/ar71xx_regs.h>
22
23 #include "common.h"
24 #include "dev-eth.h"
25 #include "dev-gpio-buttons.h"
26 #include "dev-leds-gpio.h"
27 #include "dev-m25p80.h"
28 #include "dev-wmac.h"
29 #include "machtypes.h"
30
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
39
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
48
49 #define TL_WA850RE_V2_GPIO_ENABLE_LEDS 15
50
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
56
57 #define TL_WA801ND_V2_GPIO_LED_LAN 18
58 #define TL_WA801ND_V2_GPIO_LED_SYSTEM 14
59
60 #define TL_WAX50RE_GPIO_BTN_RESET 17
61 #define TL_WAX50RE_GPIO_BTN_WPS 16
62
63 #define TL_WA860RE_GPIO_BTN_RESET 17
64 #define TL_WA860RE_GPIO_BTN_WPS 16
65 #define TL_WA860RE_GPIO_BTN_ONOFF 11
66
67 #define TL_WAX50RE_KEYS_POLL_INTERVAL 20 /* msecs */
68 #define TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL (3 * TL_WAX50RE_KEYS_POLL_INTERVAL)
69
70 static const char *tl_wax50re_part_probes[] = {
71 "tp-link",
72 NULL,
73 };
74
75 static struct flash_platform_data tl_wax50re_flash_data = {
76 .part_probes = tl_wax50re_part_probes,
77 };
78
79 static struct gpio_led tl_wa750re_leds_gpio[] __initdata = {
80 {
81 .name = "tp-link:orange:lan",
82 .gpio = TL_WAX50RE_GPIO_LED_LAN,
83 .active_low = 1,
84 }, {
85 .name = "tp-link:orange:wlan",
86 .gpio = TL_WAX50RE_GPIO_LED_WLAN,
87 .active_low = 1,
88 }, {
89 .name = "tp-link:orange:re",
90 .gpio = TL_WAX50RE_GPIO_LED_RE,
91 .active_low = 1,
92 }, {
93 .name = "tp-link:orange:signal1",
94 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL1,
95 .active_low = 1,
96 }, {
97 .name = "tp-link:orange:signal2",
98 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL2,
99 .active_low = 1,
100 }, {
101 .name = "tp-link:orange:signal3",
102 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL3,
103 .active_low = 1,
104 }, {
105 .name = "tp-link:orange:signal4",
106 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL4,
107 .active_low = 1,
108 }, {
109 .name = "tp-link:orange:signal5",
110 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL5,
111 .active_low = 1,
112 },
113 };
114
115 static struct gpio_led tl_wa850re_leds_gpio[] __initdata = {
116 {
117 .name = "tp-link:blue:lan",
118 .gpio = TL_WAX50RE_GPIO_LED_LAN,
119 .active_low = 1,
120 }, {
121 .name = "tp-link:blue:wlan",
122 .gpio = TL_WAX50RE_GPIO_LED_WLAN,
123 .active_low = 1,
124 }, {
125 .name = "tp-link:blue:re",
126 .gpio = TL_WAX50RE_GPIO_LED_RE,
127 .active_low = 1,
128 }, {
129 .name = "tp-link:blue:signal1",
130 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL1,
131 .active_low = 1,
132 }, {
133 .name = "tp-link:blue:signal2",
134 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL2,
135 .active_low = 1,
136 }, {
137 .name = "tp-link:blue:signal3",
138 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL3,
139 .active_low = 1,
140 }, {
141 .name = "tp-link:blue:signal4",
142 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL4,
143 .active_low = 1,
144 }, {
145 .name = "tp-link:blue:signal5",
146 .gpio = TL_WAX50RE_GPIO_LED_SIGNAL5,
147 .active_low = 1,
148 },
149 };
150
151 static struct gpio_led tl_wa850re_v2_leds_gpio[] __initdata = {
152 {
153 .name = "tp-link:blue:lan",
154 .gpio = TL_WA850RE_V2_GPIO_LED_LAN,
155 .active_low = 1,
156 }, {
157 .name = "tp-link:blue:re",
158 .gpio = TL_WA850RE_V2_GPIO_LED_RE,
159 .active_low = 1,
160 }, {
161 .name = "tp-link:blue:signal1",
162 .gpio = TL_WA850RE_V2_GPIO_LED_SIGNAL1,
163 .active_low = 1,
164 }, {
165 .name = "tp-link:blue:signal2",
166 .gpio = TL_WA850RE_V2_GPIO_LED_SIGNAL2,
167 .active_low = 1,
168 }, {
169 .name = "tp-link:blue:signal3",
170 .gpio = TL_WA850RE_V2_GPIO_LED_SIGNAL3,
171 .active_low = 1,
172 }, {
173 .name = "tp-link:blue:signal4",
174 .gpio = TL_WA850RE_V2_GPIO_LED_SIGNAL4,
175 .active_low = 1,
176 }, {
177 .name = "tp-link:blue:signal5",
178 .gpio = TL_WA850RE_V2_GPIO_LED_SIGNAL5,
179 .active_low = 1,
180 }, {
181 .name = "tp-link:blue:wlan",
182 .gpio = TL_WA850RE_V2_GPIO_LED_WLAN,
183 .active_low = 1,
184 },
185 };
186
187 static struct gpio_led tl_wa860re_leds_gpio[] __initdata = {
188 {
189 .name = "tp-link:green:lan",
190 .gpio = TL_WA860RE_GPIO_LED_LAN,
191 .active_low = 1,
192 }, {
193 .name = "tp-link:green:power",
194 .gpio = TL_WA860RE_GPIO_LED_POWER_GREEN,
195 .active_low = 1,
196 }, {
197 .name = "tp-link:orange:power",
198 .gpio = TL_WA860RE_GPIO_LED_POWER_ORANGE,
199 .active_low = 1,
200 }, {
201 .name = "tp-link:green:wlan",
202 .gpio = TL_WA860RE_GPIO_LED_WLAN_GREEN,
203 .active_low = 1,
204 }, {
205 .name = "tp-link:orange:wlan",
206 .gpio = TL_WA860RE_GPIO_LED_WLAN_ORANGE,
207 .active_low = 1,
208 },
209 };
210
211
212 static struct gpio_keys_button tl_wax50re_gpio_keys[] __initdata = {
213 {
214 .desc = "Reset button",
215 .type = EV_KEY,
216 .code = KEY_RESTART,
217 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
218 .gpio = TL_WAX50RE_GPIO_BTN_RESET,
219 .active_low = 1,
220 }, {
221 .desc = "WPS",
222 .type = EV_KEY,
223 .code = KEY_WPS_BUTTON,
224 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
225 .gpio = TL_WAX50RE_GPIO_BTN_WPS,
226 .active_low = 1,
227 },
228 };
229
230 static struct gpio_keys_button tl_wa860re_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_WA860RE_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_WA860RE_GPIO_BTN_WPS,
244 .active_low = 1,
245 }, {
246 .desc = "ONOFF",
247 .type = EV_KEY,
248 .code = BTN_1,
249 .debounce_interval = TL_WAX50RE_KEYS_DEBOUNCE_INTERVAL,
250 .gpio = TL_WA860RE_GPIO_BTN_ONOFF,
251 .active_low = 1,
252 },
253 };
254
255 static struct gpio_led tl_wa801nd_v2_leds_gpio[] __initdata = {
256 {
257 .name = "tp-link:green:lan",
258 .gpio = TL_WA801ND_V2_GPIO_LED_LAN,
259 .active_low = 1,
260 }, {
261 .name = "tp-link:green:wlan",
262 .gpio = TL_WAX50RE_GPIO_LED_WLAN,
263 .active_low = 1,
264 }, {
265 .name = "tp-link:green:qss",
266 .gpio = TL_WAX50RE_GPIO_LED_RE,
267 .active_low = 1,
268 }, {
269 .name = "tp-link:green:system",
270 .gpio = TL_WA801ND_V2_GPIO_LED_SYSTEM,
271 .active_low = 1,
272 },
273 };
274
275 static void __init tl_ap123_setup(void)
276 {
277 u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
278 u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
279
280 ath79_register_m25p80(&tl_wax50re_flash_data);
281
282 ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_PHY_SWAP);
283
284 ath79_register_mdio(1, 0x0);
285
286 ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
287
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);
292
293 ath79_register_wmac(ee, mac);
294 }
295
296 static void __init tl_ap143_setup(void)
297 {
298 u8 *mac = (u8 *) KSEG1ADDR(0x1f3c0008);
299 u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000);
300 u8 tmpmac[ETH_ALEN];
301
302 ath79_register_m25p80(NULL);
303
304 ath79_setup_ar933x_phy4_switch(false, false);
305
306 ath79_register_mdio(0, 0x0);
307
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);
315
316 ath79_init_mac(tmpmac, mac, 0);
317 ath79_register_wmac(ee, mac);
318 }
319
320 static void __init tl_wa750re_setup(void)
321 {
322 tl_ap123_setup();
323 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa750re_leds_gpio),
324 tl_wa750re_leds_gpio);
325
326 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
327 ARRAY_SIZE(tl_wax50re_gpio_keys),
328 tl_wax50re_gpio_keys);
329 }
330
331 MIPS_MACHINE(ATH79_MACH_TL_WA750RE, "TL-WA750RE", "TP-LINK TL-WA750RE",
332 tl_wa750re_setup);
333
334 static void __init tl_wa801nd_v2_setup(void)
335 {
336 tl_ap123_setup();
337 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa801nd_v2_leds_gpio),
338 tl_wa801nd_v2_leds_gpio);
339
340 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
341 ARRAY_SIZE(tl_wax50re_gpio_keys),
342 tl_wax50re_gpio_keys);
343 }
344
345 MIPS_MACHINE(ATH79_MACH_TL_WA801ND_V2, "TL-WA801ND-v2", "TP-LINK TL-WA801ND v2",
346 tl_wa801nd_v2_setup);
347
348 static void __init tl_wa850re_setup(void)
349 {
350 tl_ap123_setup();
351 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa850re_leds_gpio),
352 tl_wa850re_leds_gpio);
353
354 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
355 ARRAY_SIZE(tl_wax50re_gpio_keys),
356 tl_wax50re_gpio_keys);
357 }
358
359 MIPS_MACHINE(ATH79_MACH_TL_WA850RE, "TL-WA850RE", "TP-LINK TL-WA850RE",
360 tl_wa850re_setup);
361
362 static void __init tl_wa850re_v2_setup(void)
363 {
364 tl_ap143_setup();
365
366 /* For GPIO 0~4 */
367 ath79_gpio_function_setup(AR934X_GPIO_FUNC_JTAG_DISABLE,
368 AR934X_GPIO_FUNC_CLK_OBS4_EN);
369
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,
373 "LEDs enable");
374
375 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa850re_v2_leds_gpio),
376 tl_wa850re_v2_leds_gpio);
377
378 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
379 ARRAY_SIZE(tl_wax50re_gpio_keys),
380 tl_wax50re_gpio_keys);
381 }
382
383 MIPS_MACHINE(ATH79_MACH_TL_WA850RE_V2, "TL-WA850RE-V2",
384 "TP-LINK TL-WA850RE v2", tl_wa850re_v2_setup);
385
386 static void __init tl_wa860re_setup(void)
387 {
388 tl_ap123_setup();
389 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa860re_leds_gpio),
390 tl_wa860re_leds_gpio);
391
392 ath79_register_gpio_keys_polled(-1, TL_WAX50RE_KEYS_POLL_INTERVAL,
393 ARRAY_SIZE(tl_wa860re_gpio_keys),
394 tl_wa860re_gpio_keys);
395 }
396
397 MIPS_MACHINE(ATH79_MACH_TL_WA860RE, "TL-WA860RE", "TP-LINK TL-WA860RE",
398 tl_wa860re_setup);
399
400 static void __init tl_wa901nd_v3_setup(void)
401 {
402 tl_ap123_setup();
403 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wa801nd_v2_leds_gpio),
404 tl_wa801nd_v2_leds_gpio);
405
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);
409 }
410
411 MIPS_MACHINE(ATH79_MACH_TL_WA901ND_V3, "TL-WA901ND-v3", "TP-LINK TL-WA901ND v3",
412 tl_wa901nd_v3_setup);