1/* 2 * NETGEAR WNR2000v3/WNR612v2/WNR1000v2/WPN824N board support 3 * 4 * Copyright (C) 2015 Hartmut Knaack <knaack.h@gmx.de> 5 * Copyright (C) 2013 Mathieu Olivari <mathieu.olivari@gmail.com> 6 * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org> 7 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 8 * Copyright (C) 2008-2009 Andy Boyett <agb@openwrt.org> 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/mtd/mtd.h> 16#include <linux/mtd/partitions.h> 17#include <linux/kernel.h> /* for max() macro */ 18#include <linux/platform_device.h> /* PLATFORM_DEVID_AUTO is defined here */ 19 20#include <asm/mach-ath79/ath79.h> 21#include <asm/mach-ath79/ar71xx_regs.h> /* needed to disable switch LEDs */ 22#include "common.h" /* needed to disable switch LEDs */ 23 24#include "dev-ap9x-pci.h" 25#include "dev-eth.h" 26#include "dev-gpio-buttons.h" 27#include "dev-leds-gpio.h" 28#include "dev-m25p80.h" 29#include "machtypes.h" 30 31/* WNR2000v3 - connected through AR7241 */ 32#define WNR2000V3_GPIO_LED_WAN_GREEN 0 33#define WNR2000V3_GPIO_LED_LAN1_AMBER 1 34#define WNR2000V3_GPIO_LED_LAN2_AMBER 6 35#define WNR2000V3_GPIO_LED_WPS_GREEN 7 36#define WNR2000V3_GPIO_LED_LAN3_AMBER 8 37#define WNR2000V3_GPIO_BTN_WPS 11 38#define WNR2000V3_GPIO_LED_LAN4_AMBER 12 39#define WNR2000V3_GPIO_LED_LAN1_GREEN 13 40#define WNR2000V3_GPIO_LED_LAN2_GREEN 14 41#define WNR2000V3_GPIO_LED_LAN3_GREEN 15 42#define WNR2000V3_GPIO_LED_LAN4_GREEN 16 43#define WNR2000V3_GPIO_LED_WAN_AMBER 17 44 45/* WNR2000v3 - connected through AR9287 */ 46#define WNR2000V3_GPIO_WMAC_LED_WLAN_BLUE 1 47#define WNR2000V3_GPIO_WMAC_LED_TEST_AMBER 2 48#define WNR2000V3_GPIO_WMAC_LED_POWER_GREEN 3 49#define WNR2000V3_GPIO_WMAC_BTN_RESET 8 50#define WNR2000V3_GPIO_WMAC_BTN_RFKILL 9 51 52/* WNR612v2 - connected through AR7241 */ 53#define WNR612V2_GPIO_LED_POWER_GREEN 11 54#define WNR612V2_GPIO_LED_LAN1_GREEN 13 55#define WNR612V2_GPIO_LED_LAN2_GREEN 14 56#define WNR612V2_GPIO_LED_WAN_GREEN 17 57 58/* WNR612v2 - connected through AR9285 */ 59#define WNR612V2_GPIO_WMAC_LED_WLAN_GREEN 1 60#define WNR612V2_GPIO_WMAC_BTN_RESET 7 61 62/* WNR1000v2 - connected through AR7240 */ 63#define WNR1000V2_GPIO_LED_WAN_AMBER 0 64#define WNR1000V2_GPIO_LED_TEST_AMBER 1 65#define WNR1000V2_GPIO_LED_LAN1_AMBER 6 /* AR724X_GPIO_FUNC_JTAG_DISABLE */ 66#define WNR1000V2_GPIO_LED_LAN2_AMBER 7 /* AR724X_GPIO_FUNC_JTAG_DISABLE */ 67#define WNR1000V2_GPIO_LED_LAN3_AMBER 8 /* AR724X_GPIO_FUNC_JTAG_DISABLE */ 68#define WNR1000V2_GPIO_LED_POWER_GREEN 11 69#define WNR1000V2_GPIO_LED_LAN4_AMBER 12 70#define WNR1000V2_GPIO_LED_LAN1_GREEN 13 /* AR724X_..._ETH_SWITCH_LED0 */ 71#define WNR1000V2_GPIO_LED_LAN2_GREEN 14 /* AR724X_..._ETH_SWITCH_LED1 */ 72#define WNR1000V2_GPIO_LED_LAN3_GREEN 15 /* AR724X_..._ETH_SWITCH_LED2 */ 73#define WNR1000V2_GPIO_LED_LAN4_GREEN 16 /* AR724X_..._ETH_SWITCH_LED3 */ 74#define WNR1000V2_GPIO_LED_WAN_GREEN 17 /* AR724X_..._ETH_SWITCH_LED4 */ 75 76/* WNR1000v2 - connected through AR9285 */ 77#define WNR1000V2_GPIO_WMAC_LED_WLAN_BLUE 1 78#define WNR1000V2_GPIO_WMAC_LED_WPS_GREEN 5 79#define WNR1000V2_GPIO_WMAC_BTN_WPS 6 80#define WNR1000V2_GPIO_WMAC_BTN_RESET 7 81#define WNR1000V2_GPIO_WMAC_BTN_RFKILL 8 82 83/* WPN824N - connected through AR7240 */ 84#define WPN824N_GPIO_LED_WAN_AMBER 0 85#define WPN824N_GPIO_LED_STATUS_AMBER 1 86#define WPN824N_GPIO_LED_LAN1_AMBER 6 /* AR724X_GPIO_FUNC_JTAG_DISABLE */ 87#define WPN824N_GPIO_LED_LAN2_AMBER 7 /* AR724X_GPIO_FUNC_JTAG_DISABLE */ 88#define WPN824N_GPIO_LED_LAN3_AMBER 8 /* AR724X_GPIO_FUNC_JTAG_DISABLE */ 89#define WPN824N_GPIO_LED_LAN4_AMBER 12 90#define WPN824N_GPIO_LED_LAN1_GREEN 13 91#define WPN824N_GPIO_LED_LAN2_GREEN 14 92#define WPN824N_GPIO_LED_LAN3_GREEN 15 /* AR724X_GPIO_FUNC_CLK_OBS3_EN */ 93#define WPN824N_GPIO_LED_LAN4_GREEN 16 94#define WPN824N_GPIO_LED_WAN_GREEN 17 95 96/* WPN824N - connected through AR9285 */ 97#define WPN824N_WGPIO_LED_PWR_GREEN 0 98#define WPN824N_WGPIO_LED_WLAN_BLUE 1 99#define WPN824N_WGPIO_LED_WPS1_BLUE 5 100#define WPN824N_WGPIO_LED_WPS2_BLUE 9 101#define WPN824N_WGPIO_LED_TEST_AMBER 10 102#define WPN824N_WGPIO_BTN_WPS 6 103#define WPN824N_WGPIO_BTN_RESET 7 104#define WPN824N_WGPIO_BTN_WLAN 8 105 106#define WNR2000V3_KEYS_POLL_INTERVAL 20 /* msecs */ 107#define WNR2000V3_KEYS_DEBOUNCE_INTERVAL (3 * WNR2000V3_KEYS_POLL_INTERVAL) 108 109/* ART offsets for: WNR2000v3, WNR612v2, WNR1000v2 */ 110#define WNR2000V3_MAC0_OFFSET 0 111#define WNR2000V3_MAC1_OFFSET 6 112#define WNR2000V3_PCIE_CALDATA_OFFSET 0x1000 113#define WNR2000V3_WMAC_OFFSET 0x108c /* wireless MAC is inside ART */ 114 115static struct gpio_led wnr2000v3_leds_gpio[] __initdata = { 116 { 117 .name = "netgear:green:wan", 118 .gpio = WNR2000V3_GPIO_LED_WAN_GREEN, 119 .active_low = 1, 120 }, { 121 .name = "netgear:amber:lan1", 122 .gpio = WNR2000V3_GPIO_LED_LAN1_AMBER, 123 .active_low = 1, 124 }, { 125 .name = "netgear:amber:lan2", 126 .gpio = WNR2000V3_GPIO_LED_LAN2_AMBER, 127 .active_low = 1, 128 }, { 129 .name = "netgear:amber:lan3", 130 .gpio = WNR2000V3_GPIO_LED_LAN3_AMBER, 131 .active_low = 1, 132 }, { 133 .name = "netgear:amber:lan4", 134 .gpio = WNR2000V3_GPIO_LED_LAN4_AMBER, 135 .active_low = 1, 136 }, { 137 .name = "netgear:green:wps", 138 .gpio = WNR2000V3_GPIO_LED_WPS_GREEN, 139 .active_low = 1, 140 }, { 141 .name = "netgear:green:lan1", 142 .gpio = WNR2000V3_GPIO_LED_LAN1_GREEN, 143 .active_low = 1, 144 }, { 145 .name = "netgear:green:lan2", 146 .gpio = WNR2000V3_GPIO_LED_LAN2_GREEN, 147 .active_low = 1, 148 }, { 149 .name = "netgear:green:lan3", 150 .gpio = WNR2000V3_GPIO_LED_LAN3_GREEN, 151 .active_low = 1, 152 }, { 153 .name = "netgear:green:lan4", 154 .gpio = WNR2000V3_GPIO_LED_LAN4_GREEN, 155 .active_low = 1, 156 }, { 157 .name = "netgear:amber:wan", 158 .gpio = WNR2000V3_GPIO_LED_WAN_AMBER, 159 .active_low = 1, 160 } 161}; 162 163static struct gpio_led wnr2000v3_wmac_leds_gpio[] = { 164 { 165 .name = "netgear:green:power", 166 .gpio = WNR2000V3_GPIO_WMAC_LED_POWER_GREEN, 167 .active_low = 1, 168 .default_state = LEDS_GPIO_DEFSTATE_ON, 169 }, { 170 .name = "netgear:amber:test", 171 .gpio = WNR2000V3_GPIO_WMAC_LED_TEST_AMBER, 172 .active_low = 1, 173 } 174}; 175 176/* Blue WLAN LED for: WNR2000v3, WNR1000v2, WPN824N */ 177static const char *wnr2000v3_wmac_led_name = "netgear:blue:wlan"; 178 179static struct gpio_led wnr612v2_leds_gpio[] __initdata = { 180 { 181 .name = "netgear:green:power", 182 .gpio = WNR612V2_GPIO_LED_POWER_GREEN, 183 .active_low = 1, 184 }, { 185 .name = "netgear:green:lan1", 186 .gpio = WNR612V2_GPIO_LED_LAN1_GREEN, 187 .active_low = 1, 188 }, { 189 .name = "netgear:green:lan2", 190 .gpio = WNR612V2_GPIO_LED_LAN2_GREEN, 191 .active_low = 1, 192 }, { 193 .name = "netgear:green:wan", 194 .gpio = WNR612V2_GPIO_LED_WAN_GREEN, 195 .active_low = 1, 196 } 197}; 198 199static const char *wnr612v2_wmac_led_name = "netgear:green:wlan"; 200 201static struct gpio_led wnr1000v2_leds_gpio[] __initdata = { 202 { 203 .name = "netgear:amber:lan1", 204 .gpio = WNR1000V2_GPIO_LED_LAN1_AMBER, 205 .active_low = 1, 206 }, { 207 .name = "netgear:amber:lan2", 208 .gpio = WNR1000V2_GPIO_LED_LAN2_AMBER, 209 .active_low = 1, 210 }, { 211 .name = "netgear:amber:lan3", 212 .gpio = WNR1000V2_GPIO_LED_LAN3_AMBER, 213 .active_low = 1, 214 }, { 215 .name = "netgear:amber:lan4", 216 .gpio = WNR1000V2_GPIO_LED_LAN4_AMBER, 217 .active_low = 1, 218 }, { 219 .name = "netgear:amber:test", 220 .gpio = WNR1000V2_GPIO_LED_TEST_AMBER, 221 .active_low = 1, 222 }, { 223 .name = "netgear:amber:wan", 224 .gpio = WNR1000V2_GPIO_LED_WAN_AMBER, 225 .active_low = 1, 226 }, { 227 .name = "netgear:green:lan1", 228 .gpio = WNR1000V2_GPIO_LED_LAN1_GREEN, 229 .active_low = 1, 230 }, { 231 .name = "netgear:green:lan2", 232 .gpio = WNR1000V2_GPIO_LED_LAN2_GREEN, 233 .active_low = 1, 234 }, { 235 .name = "netgear:green:lan3", 236 .gpio = WNR1000V2_GPIO_LED_LAN3_GREEN, 237 .active_low = 1, 238 }, { 239 .name = "netgear:green:lan4", 240 .gpio = WNR1000V2_GPIO_LED_LAN4_GREEN, 241 .active_low = 1, 242 }, { 243 .name = "netgear:green:power", 244 .gpio = WNR1000V2_GPIO_LED_POWER_GREEN, 245 .active_low = 1, 246 }, { 247 .name = "netgear:green:wan", 248 .gpio = WNR1000V2_GPIO_LED_WAN_GREEN, 249 .active_low = 1, 250 } 251}; 252 253static struct gpio_led wnr1000v2_wmac_leds_gpio[] = { 254 { 255 .name = "netgear:green:wps", 256 .gpio = WNR1000V2_GPIO_WMAC_LED_WPS_GREEN, 257 .active_low = 1, 258 } 259}; 260 261static struct gpio_led wpn824n_leds_gpio[] __initdata = { 262 { 263 .name = "netgear:amber:wan", 264 .gpio = WPN824N_GPIO_LED_WAN_AMBER, 265 .active_low = 1, 266 }, { 267 .name = "netgear:amber:status", 268 .gpio = WPN824N_GPIO_LED_STATUS_AMBER, 269 .active_low = 1, 270 }, { 271 .name = "netgear:amber:lan1", 272 .gpio = WPN824N_GPIO_LED_LAN1_AMBER, 273 .active_low = 1, 274 }, { 275 .name = "netgear:amber:lan2", 276 .gpio = WPN824N_GPIO_LED_LAN2_AMBER, 277 .active_low = 1, 278 }, { 279 .name = "netgear:amber:lan3", 280 .gpio = WPN824N_GPIO_LED_LAN3_AMBER, 281 .active_low = 1, 282 }, { 283 .name = "netgear:amber:lan4", 284 .gpio = WPN824N_GPIO_LED_LAN4_AMBER, 285 .active_low = 1, 286 }, { 287 .name = "netgear:green:lan1", 288 .gpio = WPN824N_GPIO_LED_LAN1_GREEN, 289 .active_low = 1, 290 }, { 291 .name = "netgear:green:lan2", 292 .gpio = WPN824N_GPIO_LED_LAN2_GREEN, 293 .active_low = 1, 294 }, { 295 .name = "netgear:green:lan3", 296 .gpio = WPN824N_GPIO_LED_LAN3_GREEN, 297 .active_low = 1, 298 }, { 299 .name = "netgear:green:lan4", 300 .gpio = WPN824N_GPIO_LED_LAN4_GREEN, 301 .active_low = 1, 302 }, { 303 .name = "netgear:green:wan", 304 .gpio = WPN824N_GPIO_LED_WAN_GREEN, 305 .active_low = 1, 306 } 307}; 308 309static struct gpio_led wpn824n_wmac_leds_gpio[] = { 310 { 311 .name = "netgear:green:power", 312 .gpio = WPN824N_WGPIO_LED_PWR_GREEN, 313 .active_low = 1, 314 }, { 315 .name = "netgear:blue:wps1", 316 .gpio = WPN824N_WGPIO_LED_WPS1_BLUE, 317 .active_low = 1, 318 }, { 319 .name = "netgear:blue:wps2", 320 .gpio = WPN824N_WGPIO_LED_WPS2_BLUE, 321 .active_low = 1, 322 }, { 323 .name = "netgear:amber:test", 324 .gpio = WPN824N_WGPIO_LED_TEST_AMBER, 325 .active_low = 1, 326 } 327}; 328 329static struct gpio_keys_button wnr2000v3_keys_gpio[] __initdata = { 330 { 331 .desc = "wps", 332 .type = EV_KEY, 333 .code = KEY_WPS_BUTTON, 334 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 335 .gpio = WNR2000V3_GPIO_BTN_WPS, 336 .active_low = 1, 337 } 338}; 339 340static struct gpio_keys_button wnr2000v3_wmac_keys_gpio[] = { 341 { 342 .desc = "reset", 343 .type = EV_KEY, 344 .code = KEY_RESTART, 345 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 346 .gpio = WNR2000V3_GPIO_WMAC_BTN_RESET, 347 .active_low = 1, 348 }, { 349 .desc = "rfkill", 350 .type = EV_KEY, 351 .code = KEY_RFKILL, 352 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 353 .gpio = WNR2000V3_GPIO_WMAC_BTN_RFKILL, 354 .active_low = 1, 355 } 356}; 357 358static struct gpio_keys_button wnr612v2_wmac_keys_gpio[] = { 359 { 360 .desc = "reset", 361 .type = EV_KEY, 362 .code = KEY_RESTART, 363 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 364 .gpio = WNR612V2_GPIO_WMAC_BTN_RESET, 365 .active_low = 1, 366 } 367}; 368 369static struct gpio_keys_button wnr1000v2_wmac_keys_gpio[] = { 370 { 371 .desc = "reset", 372 .type = EV_KEY, 373 .code = KEY_RESTART, 374 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 375 .gpio = WNR1000V2_GPIO_WMAC_BTN_RESET, 376 .active_low = 1, 377 }, { 378 .desc = "rfkill", 379 .type = EV_KEY, 380 .code = KEY_RFKILL, 381 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 382 .gpio = WNR1000V2_GPIO_WMAC_BTN_RFKILL, 383 .active_low = 1, 384 }, { 385 .desc = "wps", 386 .type = EV_KEY, 387 .code = KEY_WPS_BUTTON, 388 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 389 .gpio = WNR1000V2_GPIO_WMAC_BTN_WPS, 390 .active_low = 1, 391 } 392}; 393 394static struct gpio_keys_button wpn824n_wmac_keys_gpio[] = { 395 { 396 .desc = "reset", 397 .type = EV_KEY, 398 .code = KEY_RESTART, 399 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 400 .gpio = WPN824N_WGPIO_BTN_RESET, 401 .active_low = 1, 402 }, { 403 .desc = "rfkill", 404 .type = EV_KEY, 405 .code = KEY_RFKILL, 406 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 407 .gpio = WPN824N_WGPIO_BTN_WLAN, 408 .active_low = 1, 409 }, { 410 .desc = "wps", 411 .type = EV_KEY, 412 .code = KEY_WPS_BUTTON, 413 .debounce_interval = WNR2000V3_KEYS_DEBOUNCE_INTERVAL, 414 .gpio = WPN824N_WGPIO_BTN_WPS, 415 .active_low = 1, 416 } 417}; 418 419/* 420 * For WNR2000v3 ART flash area used for WLAN MAC is usually empty (0xff) 421 * so ath9k driver uses random MAC instead each time module is loaded. 422 * To fix that, assign permanent WLAN MAC equal to ethN's MAC plus 1, 423 * so network interfaces get sequential addresses. 424 * If ART wireless MAC address field has been filled by user, use it. 425 */ 426static void __init wnr_get_wmac(u8 *wmac_gen_addr, int mac0_art_offset, 427 int mac1_art_offset, int wmac_art_offset) 428{ 429 u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); 430 u8 *eth0_mac_addr = (u8 *) (art + mac0_art_offset); 431 u8 *eth1_mac_addr = (u8 *) (art + mac1_art_offset); 432 u8 *wlan_mac_addr = (u8 *) (art + wmac_art_offset); 433 434 /* only 0xff if all bits are set - address is invalid, empty area */ 435 if ((wlan_mac_addr[0] & wlan_mac_addr[1] & wlan_mac_addr[2] & 436 wlan_mac_addr[3] & wlan_mac_addr[4] & wlan_mac_addr[5]) == 0xff) { 437 memcpy(wmac_gen_addr, eth0_mac_addr, 5); 438 wmac_gen_addr[5] = max(eth0_mac_addr[5], eth1_mac_addr[5]) + 1; 439 440 /* Avoid potential conflict in case max(0xff,0x00)+1==0x00 */ 441 if (!wmac_gen_addr[5]) 442 wmac_gen_addr[5] = 1; 443 } else 444 memcpy(wmac_gen_addr, wlan_mac_addr, 6); 445} 446 447static void __init wnr_common_setup(u8 *wmac_addr) 448{ 449 u8 *art = (u8 *) KSEG1ADDR(0x1fff0000); 450 451 ath79_register_mdio(0, 0x0); 452 453 ath79_init_mac(ath79_eth0_data.mac_addr, art+WNR2000V3_MAC0_OFFSET, 0); 454 ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; 455 ath79_eth0_data.speed = SPEED_100; 456 ath79_eth0_data.duplex = DUPLEX_FULL; 457 458 ath79_init_mac(ath79_eth1_data.mac_addr, art+WNR2000V3_MAC1_OFFSET, 0); 459 ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; 460 ath79_eth1_data.phy_mask = 0x10; 461 462 ath79_register_eth(0); 463 ath79_register_eth(1); 464 465 ath79_register_m25p80(NULL); 466 ap91_pci_init(art + WNR2000V3_PCIE_CALDATA_OFFSET, wmac_addr); 467} 468 469static void __init wnr2000v3_setup(void) 470{ 471 u8 wlan_mac_addr[6]; 472 473 /* 474 * Disable JTAG to use all AR724X GPIO LEDs. 475 * Also disable CLKs and bit 20 as u-boot does. 476 * Finally, allow OS to control all link LEDs. 477 */ 478 ath79_gpio_function_setup(AR724X_GPIO_FUNC_JTAG_DISABLE | 479 AR724X_GPIO_FUNC_UART_EN, 480 AR724X_GPIO_FUNC_CLK_OBS1_EN | 481 AR724X_GPIO_FUNC_CLK_OBS2_EN | 482 AR724X_GPIO_FUNC_CLK_OBS3_EN | 483 AR724X_GPIO_FUNC_CLK_OBS4_EN | 484 AR724X_GPIO_FUNC_CLK_OBS5_EN | 485 AR724X_GPIO_FUNC_GE0_MII_CLK_EN | 486 AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN | 487 AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN | 488 AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN | 489 AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN | 490 AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN | 491 BIT(20)); 492 493 wnr_get_wmac(wlan_mac_addr, WNR2000V3_MAC0_OFFSET, 494 WNR2000V3_MAC1_OFFSET, WNR2000V3_WMAC_OFFSET); 495 496 wnr_common_setup(wlan_mac_addr); 497 498 ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr2000v3_leds_gpio), 499 wnr2000v3_leds_gpio); 500 501 /* Do not use id=-1, we can have more GPIO key-polled devices */ 502 ath79_register_gpio_keys_polled(PLATFORM_DEVID_AUTO, 503 WNR2000V3_KEYS_POLL_INTERVAL, 504 ARRAY_SIZE(wnr2000v3_keys_gpio), 505 wnr2000v3_keys_gpio); 506 507 ap9x_pci_setup_wmac_led_pin(0, WNR2000V3_GPIO_WMAC_LED_WLAN_BLUE); 508 ap9x_pci_setup_wmac_led_name(0, wnr2000v3_wmac_led_name); 509 510 ap9x_pci_setup_wmac_leds(0, wnr2000v3_wmac_leds_gpio, 511 ARRAY_SIZE(wnr2000v3_wmac_leds_gpio)); 512 513 ap9x_pci_setup_wmac_btns(0, wnr2000v3_wmac_keys_gpio, 514 ARRAY_SIZE(wnr2000v3_wmac_keys_gpio), 515 WNR2000V3_KEYS_POLL_INTERVAL); 516} 517 518MIPS_MACHINE(ATH79_MACH_WNR2000_V3, "WNR2000V3", "NETGEAR WNR2000 V3", wnr2000v3_setup); 519 520static void __init wnr612v2_setup(void) 521{ 522 u8 wlan_mac_addr[6]; 523 524 /* 525 * Disable JTAG and CLKs. Allow OS to control all link LEDs. 526 * Note: U-Boot for WNR612v2 sets undocumented bit 15 but 527 * we leave it for now. 528 */ 529 ath79_gpio_function_setup(AR724X_GPIO_FUNC_JTAG_DISABLE | 530 AR724X_GPIO_FUNC_UART_EN, 531 AR724X_GPIO_FUNC_CLK_OBS1_EN | 532 AR724X_GPIO_FUNC_CLK_OBS2_EN | 533 AR724X_GPIO_FUNC_CLK_OBS3_EN | 534 AR724X_GPIO_FUNC_CLK_OBS4_EN | 535 AR724X_GPIO_FUNC_CLK_OBS5_EN | 536 AR724X_GPIO_FUNC_GE0_MII_CLK_EN | 537 AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN | 538 AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN | 539 AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN | 540 AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN | 541 AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN); 542 543 wnr_get_wmac(wlan_mac_addr, WNR2000V3_MAC0_OFFSET, 544 WNR2000V3_MAC1_OFFSET, WNR2000V3_WMAC_OFFSET); 545 546 wnr_common_setup(wlan_mac_addr); 547 548 ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr612v2_leds_gpio), 549 wnr612v2_leds_gpio); 550 551 /* 552 * This device has no buttons on AR7241 GPIO and no extra LEDs 553 * connected to AR9285 so setup is simpler than for WNR2000v3. 554 */ 555 ap9x_pci_setup_wmac_led_pin(0, WNR612V2_GPIO_WMAC_LED_WLAN_GREEN); 556 ap9x_pci_setup_wmac_led_name(0, wnr612v2_wmac_led_name); 557 558 ap9x_pci_setup_wmac_leds(0, NULL, 0); 559 560 ap9x_pci_setup_wmac_btns(0, wnr612v2_wmac_keys_gpio, 561 ARRAY_SIZE(wnr612v2_wmac_keys_gpio), 562 WNR2000V3_KEYS_POLL_INTERVAL); 563} 564 565MIPS_MACHINE(ATH79_MACH_WNR612_V2, "WNR612V2", "NETGEAR WNR612 V2", wnr612v2_setup); 566 567static void __init wnr1000v2_setup(void) 568{ 569 u8 wlan_mac_addr[6]; 570 571 /* 572 * Disable JTAG and CLKs. Allow OS to control all link LEDs. 573 * Note: U-Boot for WNR1000v2 sets undocumented bit 15 but 574 * we leave it for now. 575 */ 576 ath79_gpio_function_setup(AR724X_GPIO_FUNC_JTAG_DISABLE | 577 AR724X_GPIO_FUNC_UART_EN, 578 AR724X_GPIO_FUNC_CLK_OBS1_EN | 579 AR724X_GPIO_FUNC_CLK_OBS2_EN | 580 AR724X_GPIO_FUNC_CLK_OBS3_EN | 581 AR724X_GPIO_FUNC_CLK_OBS4_EN | 582 AR724X_GPIO_FUNC_CLK_OBS5_EN | 583 AR724X_GPIO_FUNC_GE0_MII_CLK_EN | 584 AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN | 585 AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN | 586 AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN | 587 AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN | 588 AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN); 589 590 wnr_get_wmac(wlan_mac_addr, WNR2000V3_MAC0_OFFSET, 591 WNR2000V3_MAC1_OFFSET, WNR2000V3_WMAC_OFFSET); 592 593 wnr_common_setup(wlan_mac_addr); 594 595 ath79_register_leds_gpio(-1, ARRAY_SIZE(wnr1000v2_leds_gpio), 596 wnr1000v2_leds_gpio); 597 598 ap9x_pci_setup_wmac_led_pin(0, WNR1000V2_GPIO_WMAC_LED_WLAN_BLUE); 599 ap9x_pci_setup_wmac_led_name(0, wnr2000v3_wmac_led_name); 600 601 ap9x_pci_setup_wmac_leds(0, wnr1000v2_wmac_leds_gpio, 602 ARRAY_SIZE(wnr1000v2_wmac_leds_gpio)); 603 604 /* All 3 buttons are connected to wireless chip */ 605 ap9x_pci_setup_wmac_btns(0, wnr1000v2_wmac_keys_gpio, 606 ARRAY_SIZE(wnr1000v2_wmac_keys_gpio), 607 WNR2000V3_KEYS_POLL_INTERVAL); 608} 609 610MIPS_MACHINE(ATH79_MACH_WNR1000_V2, "WNR1000V2", "NETGEAR WNR1000 V2", wnr1000v2_setup); 611 612static void __init wpn824n_setup(void) 613{ 614 ath79_gpio_function_setup(AR724X_GPIO_FUNC_JTAG_DISABLE, 615 AR724X_GPIO_FUNC_ETH_SWITCH_LED0_EN | 616 AR724X_GPIO_FUNC_ETH_SWITCH_LED1_EN | 617 AR724X_GPIO_FUNC_ETH_SWITCH_LED2_EN | 618 AR724X_GPIO_FUNC_ETH_SWITCH_LED3_EN | 619 AR724X_GPIO_FUNC_ETH_SWITCH_LED4_EN | 620 AR724X_GPIO_FUNC_CLK_OBS3_EN); 621 622 wnr_common_setup(NULL); 623 624 ath79_register_leds_gpio(-1, ARRAY_SIZE(wpn824n_leds_gpio), 625 wpn824n_leds_gpio); 626 627 ap9x_pci_setup_wmac_led_pin(0, WPN824N_WGPIO_LED_WLAN_BLUE); 628 ap9x_pci_setup_wmac_led_name(0, wnr2000v3_wmac_led_name); 629 ap9x_pci_setup_wmac_leds(0, wpn824n_wmac_leds_gpio, 630 ARRAY_SIZE(wpn824n_wmac_leds_gpio)); 631 ap9x_pci_setup_wmac_btns(0, wpn824n_wmac_keys_gpio, 632 ARRAY_SIZE(wpn824n_wmac_keys_gpio), 633 WNR2000V3_KEYS_POLL_INTERVAL); 634} 635 636MIPS_MACHINE(ATH79_MACH_WPN824N, "WPN824N", "NETGEAR WPN824N", wpn824n_setup); 637