1/* 2 * Linksys WRT160NL board support 3 * 4 * Copyright (C) 2009-2012 Gabor Juhos <juhosg@openwrt.org> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 as published 8 * by the Free Software Foundation. 9 */ 10 11#include <asm/mach-ath79/ath79.h> 12 13#include "dev-eth.h" 14#include "dev-gpio-buttons.h" 15#include "dev-leds-gpio.h" 16#include "dev-m25p80.h" 17#include "dev-usb.h" 18#include "dev-wmac.h" 19#include "nvram.h" 20#include "machtypes.h" 21 22#define WRT160NL_GPIO_LED_POWER 14 23#define WRT160NL_GPIO_LED_WPS_AMBER 9 24#define WRT160NL_GPIO_LED_WPS_BLUE 8 25#define WRT160NL_GPIO_LED_WLAN 6 26 27#define WRT160NL_GPIO_BTN_WPS 7 28#define WRT160NL_GPIO_BTN_RESET 21 29 30#define WRT160NL_KEYS_POLL_INTERVAL 20 /* msecs */ 31#define WRT160NL_KEYS_DEBOUNCE_INTERVAL (3 * WRT160NL_KEYS_POLL_INTERVAL) 32 33#define WRT160NL_NVRAM_ADDR 0x1f7e0000 34#define WRT160NL_NVRAM_SIZE 0x10000 35 36static const char *wrt160nl_part_probes[] = { 37 "wrt160nl", 38 NULL, 39}; 40 41static struct flash_platform_data wrt160nl_flash_data = { 42 .part_probes = wrt160nl_part_probes, 43}; 44 45static struct gpio_led wrt160nl_leds_gpio[] __initdata = { 46 { 47 .name = "wrt160nl:blue:power", 48 .gpio = WRT160NL_GPIO_LED_POWER, 49 .active_low = 1, 50 .default_trigger = "default-on", 51 }, { 52 .name = "wrt160nl:amber:wps", 53 .gpio = WRT160NL_GPIO_LED_WPS_AMBER, 54 .active_low = 1, 55 }, { 56 .name = "wrt160nl:blue:wps", 57 .gpio = WRT160NL_GPIO_LED_WPS_BLUE, 58 .active_low = 1, 59 }, { 60 .name = "wrt160nl:blue:wlan", 61 .gpio = WRT160NL_GPIO_LED_WLAN, 62 .active_low = 1, 63 } 64}; 65 66static struct gpio_keys_button wrt160nl_gpio_keys[] __initdata = { 67 { 68 .desc = "reset", 69 .type = EV_KEY, 70 .code = KEY_RESTART, 71 .debounce_interval = WRT160NL_KEYS_DEBOUNCE_INTERVAL, 72 .gpio = WRT160NL_GPIO_BTN_RESET, 73 .active_low = 1, 74 }, { 75 .desc = "wps", 76 .type = EV_KEY, 77 .code = KEY_WPS_BUTTON, 78 .debounce_interval = WRT160NL_KEYS_DEBOUNCE_INTERVAL, 79 .gpio = WRT160NL_GPIO_BTN_WPS, 80 .active_low = 1, 81 } 82}; 83 84static void __init wrt160nl_setup(void) 85{ 86 const char *nvram = (char *) KSEG1ADDR(WRT160NL_NVRAM_ADDR); 87 u8 *eeprom = (u8 *) KSEG1ADDR(0x1fff1000); 88 u8 mac[6]; 89 90 if (ath79_nvram_parse_mac_addr(nvram, WRT160NL_NVRAM_SIZE, 91 "lan_hwaddr=", mac) == 0) { 92 ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0); 93 ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1); 94 } 95 96 ath79_register_mdio(0, 0x0); 97 98 ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; 99 ath79_eth0_data.phy_mask = 0x01; 100 101 ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; 102 ath79_eth1_data.phy_mask = 0x10; 103 104 ath79_register_eth(0); 105 ath79_register_eth(1); 106 107 ath79_register_m25p80(&wrt160nl_flash_data); 108 109 ath79_register_usb(); 110 111 if (ath79_nvram_parse_mac_addr(nvram, WRT160NL_NVRAM_SIZE, 112 "wl0_hwaddr=", mac) == 0) 113 ath79_register_wmac(eeprom, mac); 114 else 115 ath79_register_wmac(eeprom, NULL); 116 117 ath79_register_leds_gpio(-1, ARRAY_SIZE(wrt160nl_leds_gpio), 118 wrt160nl_leds_gpio); 119 120 ath79_register_gpio_keys_polled(-1, WRT160NL_KEYS_POLL_INTERVAL, 121 ARRAY_SIZE(wrt160nl_gpio_keys), 122 wrt160nl_gpio_keys); 123} 124 125MIPS_MACHINE(ATH79_MACH_WRT160NL, "WRT160NL", "Linksys WRT160NL", 126 wrt160nl_setup); 127