ar71xx: add definitions for RouterBOARD hardware option bits
[openwrt/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);