1/* 2 * TP-LINK TL-MR3020 board support 3 * 4 * Copyright (C) 2011 dongyuqi <729650915@qq.com> 5 * Copyright (C) 2011-2012 Gabor Juhos <juhosg@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 <linux/gpio.h> 13 14#include <asm/mach-ath79/ath79.h> 15#include <asm/mach-ath79/ar71xx_regs.h> 16 17#include "dev-eth.h" 18#include "dev-gpio-buttons.h" 19#include "dev-leds-gpio.h" 20#include "dev-m25p80.h" 21#include "dev-usb.h" 22#include "dev-wmac.h" 23#include "machtypes.h" 24 25#define TL_MR3020_GPIO_LED_3G 27 26#define TL_MR3020_GPIO_LED_WLAN 0 27#define TL_MR3020_GPIO_LED_LAN 17 28#define TL_MR3020_GPIO_LED_WPS 26 29 30#define TL_MR3020_GPIO_BTN_WPS 11 31#define TL_MR3020_GPIO_BTN_SW1 18 32#define TL_MR3020_GPIO_BTN_SW2 20 33 34#define TL_MR3020_GPIO_USB_POWER 8 35 36#define TL_MR3020_KEYS_POLL_INTERVAL 20 /* msecs */ 37#define TL_MR3020_KEYS_DEBOUNCE_INTERVAL (3 * TL_MR3020_KEYS_POLL_INTERVAL) 38 39static const char *tl_mr3020_part_probes[] = { 40 "tp-link", 41 NULL, 42}; 43 44static struct flash_platform_data tl_mr3020_flash_data = { 45 .part_probes = tl_mr3020_part_probes, 46}; 47 48static struct gpio_led tl_mr3020_leds_gpio[] __initdata = { 49 { 50 .name = "tp-link:green:3g", 51 .gpio = TL_MR3020_GPIO_LED_3G, 52 .active_low = 1, 53 }, 54 { 55 .name = "tp-link:green:wlan", 56 .gpio = TL_MR3020_GPIO_LED_WLAN, 57 .active_low = 0, 58 }, 59 { 60 .name = "tp-link:green:lan", 61 .gpio = TL_MR3020_GPIO_LED_LAN, 62 .active_low = 1, 63 }, 64 { 65 .name = "tp-link:green:wps", 66 .gpio = TL_MR3020_GPIO_LED_WPS, 67 .active_low = 1, 68 }, 69}; 70 71static struct gpio_keys_button tl_mr3020_gpio_keys[] __initdata = { 72 { 73 .desc = "wps", 74 .type = EV_KEY, 75 .code = KEY_WPS_BUTTON, 76 .debounce_interval = TL_MR3020_KEYS_DEBOUNCE_INTERVAL, 77 .gpio = TL_MR3020_GPIO_BTN_WPS, 78 .active_low = 0, 79 }, 80 { 81 .desc = "sw1", 82 .type = EV_KEY, 83 .code = BTN_0, 84 .debounce_interval = TL_MR3020_KEYS_DEBOUNCE_INTERVAL, 85 .gpio = TL_MR3020_GPIO_BTN_SW1, 86 .active_low = 0, 87 }, 88 { 89 .desc = "sw2", 90 .type = EV_KEY, 91 .code = BTN_1, 92 .debounce_interval = TL_MR3020_KEYS_DEBOUNCE_INTERVAL, 93 .gpio = TL_MR3020_GPIO_BTN_SW2, 94 .active_low = 0, 95 } 96}; 97 98static void __init tl_mr3020_setup(void) 99{ 100 u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00); 101 u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); 102 103 /* disable PHY_SWAP and PHY_ADDR_SWAP bits */ 104 ath79_setup_ar933x_phy4_switch(false, false); 105 106 ath79_register_m25p80(&tl_mr3020_flash_data); 107 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_mr3020_leds_gpio), 108 tl_mr3020_leds_gpio); 109 ath79_register_gpio_keys_polled(-1, TL_MR3020_KEYS_POLL_INTERVAL, 110 ARRAY_SIZE(tl_mr3020_gpio_keys), 111 tl_mr3020_gpio_keys); 112 113 gpio_request_one(TL_MR3020_GPIO_USB_POWER, 114 GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED, 115 "USB power"); 116 ath79_register_usb(); 117 118 ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0); 119 120 ath79_register_mdio(0, 0x0); 121 ath79_register_eth(0); 122 ath79_register_wmac(ee, mac); 123} 124 125MIPS_MACHINE(ATH79_MACH_TL_MR3020, "TL-MR3020", "TP-LINK TL-MR3020", 126 tl_mr3020_setup); 127