1/* 2 * D-Link DIR-615 rev C1 board support 3 * 4 * Copyright (C) 2008-2012 Gabor Juhos <juhosg@openwrt.org> 5 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 as published 9 * by the Free Software Foundation. 10 */ 11 12#include <asm/mach-ath79/ath79.h> 13 14#include "dev-eth.h" 15#include "dev-gpio-buttons.h" 16#include "dev-leds-gpio.h" 17#include "dev-m25p80.h" 18#include "dev-wmac.h" 19#include "machtypes.h" 20#include "nvram.h" 21 22#define DIR_615C1_GPIO_LED_ORANGE_STATUS 1 /* ORANGE:STATUS:TRICOLOR */ 23#define DIR_615C1_GPIO_LED_BLUE_WPS 3 /* BLUE:WPS */ 24#define DIR_615C1_GPIO_LED_GREEN_WAN 4 /* GREEN:WAN:TRICOLOR */ 25#define DIR_615C1_GPIO_LED_GREEN_WANCPU 5 /* GREEN:WAN:CPU:TRICOLOR */ 26#define DIR_615C1_GPIO_LED_GREEN_WLAN 6 /* GREEN:WLAN */ 27#define DIR_615C1_GPIO_LED_GREEN_STATUS 14 /* GREEN:STATUS:TRICOLOR */ 28#define DIR_615C1_GPIO_LED_ORANGE_WAN 15 /* ORANGE:WAN:TRICOLOR */ 29 30/* buttons may need refinement */ 31 32#define DIR_615C1_GPIO_BTN_WPS 12 33#define DIR_615C1_GPIO_BTN_RESET 21 34 35#define DIR_615C1_KEYS_POLL_INTERVAL 20 /* msecs */ 36#define DIR_615C1_KEYS_DEBOUNCE_INTERVAL (3 * DIR_615C1_KEYS_POLL_INTERVAL) 37 38#define DIR_615C1_CONFIG_ADDR 0x1f020000 39#define DIR_615C1_CONFIG_SIZE 0x10000 40 41static struct gpio_led dir_615c1_leds_gpio[] __initdata = { 42 { 43 .name = "d-link:orange:status", 44 .gpio = DIR_615C1_GPIO_LED_ORANGE_STATUS, 45 .active_low = 1, 46 }, { 47 .name = "d-link:blue:wps", 48 .gpio = DIR_615C1_GPIO_LED_BLUE_WPS, 49 .active_low = 1, 50 }, { 51 .name = "d-link:green:wan", 52 .gpio = DIR_615C1_GPIO_LED_GREEN_WAN, 53 .active_low = 1, 54 }, { 55 .name = "d-link:green:wancpu", 56 .gpio = DIR_615C1_GPIO_LED_GREEN_WANCPU, 57 .active_low = 1, 58 }, { 59 .name = "d-link:green:wlan", 60 .gpio = DIR_615C1_GPIO_LED_GREEN_WLAN, 61 .active_low = 1, 62 }, { 63 .name = "d-link:green:status", 64 .gpio = DIR_615C1_GPIO_LED_GREEN_STATUS, 65 .active_low = 1, 66 }, { 67 .name = "d-link:orange:wan", 68 .gpio = DIR_615C1_GPIO_LED_ORANGE_WAN, 69 .active_low = 1, 70 } 71 72}; 73 74static struct gpio_keys_button dir_615c1_gpio_keys[] __initdata = { 75 { 76 .desc = "reset", 77 .type = EV_KEY, 78 .code = KEY_RESTART, 79 .debounce_interval = DIR_615C1_KEYS_DEBOUNCE_INTERVAL, 80 .gpio = DIR_615C1_GPIO_BTN_RESET, 81 }, { 82 .desc = "wps", 83 .type = EV_KEY, 84 .code = KEY_WPS_BUTTON, 85 .debounce_interval = DIR_615C1_KEYS_DEBOUNCE_INTERVAL, 86 .gpio = DIR_615C1_GPIO_BTN_WPS, 87 } 88}; 89 90#define DIR_615C1_LAN_PHYMASK BIT(0) 91#define DIR_615C1_WAN_PHYMASK BIT(4) 92#define DIR_615C1_MDIO_MASK (~(DIR_615C1_LAN_PHYMASK | \ 93 DIR_615C1_WAN_PHYMASK)) 94 95static void __init dir_615c1_setup(void) 96{ 97 const char *config = (char *) KSEG1ADDR(DIR_615C1_CONFIG_ADDR); 98 u8 *eeprom = (u8 *) KSEG1ADDR(0x1fff1000); 99 u8 mac[6]; 100 u8 *wlan_mac = NULL; 101 102 if (ath79_nvram_parse_mac_addr(config, DIR_615C1_CONFIG_SIZE, 103 "lan_mac=", mac) == 0) { 104 ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0); 105 ath79_init_mac(ath79_eth1_data.mac_addr, mac, 1); 106 wlan_mac = mac; 107 } 108 109 ath79_register_mdio(0, DIR_615C1_MDIO_MASK); 110 111 ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; 112 ath79_eth0_data.phy_mask = DIR_615C1_LAN_PHYMASK; 113 114 ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RMII; 115 ath79_eth1_data.phy_mask = DIR_615C1_WAN_PHYMASK; 116 117 ath79_register_eth(0); 118 ath79_register_eth(1); 119 120 ath79_register_m25p80(NULL); 121 122 ath79_register_leds_gpio(-1, ARRAY_SIZE(dir_615c1_leds_gpio), 123 dir_615c1_leds_gpio); 124 125 ath79_register_gpio_keys_polled(-1, DIR_615C1_KEYS_POLL_INTERVAL, 126 ARRAY_SIZE(dir_615c1_gpio_keys), 127 dir_615c1_gpio_keys); 128 129 ath79_register_wmac(eeprom, wlan_mac); 130} 131 132MIPS_MACHINE(ATH79_MACH_DIR_615_C1, "DIR-615-C1", "D-Link DIR-615 rev. C1", 133 dir_615c1_setup); 134