1/* 2 * TP-LINK TL-WDR6500 v2 3 * 4 * Copyright (C) 2015 Weijie Gao <hackpascal@gmail.com> 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 <linux/pci.h> 12#include <linux/gpio.h> 13#include <linux/platform_device.h> 14 15#include <asm/mach-ath79/ath79.h> 16#include <asm/mach-ath79/ar71xx_regs.h> 17 18#include "common.h" 19#include "dev-eth.h" 20#include "dev-ap9x-pci.h" 21#include "dev-gpio-buttons.h" 22#include "dev-leds-gpio.h" 23#include "dev-m25p80.h" 24#include "dev-usb.h" 25#include "dev-wmac.h" 26#include "machtypes.h" 27#include "pci.h" 28 29#define TL_WDR6500_V2_GPIO_LED_SYS 21 30#define TL_WDR6500_V2_GPIO_LED_WAN 18 31#define TL_WDR6500_V2_GPIO_LED_LAN1 17 32#define TL_WDR6500_V2_GPIO_LED_LAN2 16 33#define TL_WDR6500_V2_GPIO_LED_LAN3 15 34#define TL_WDR6500_V2_GPIO_LED_LAN4 14 35 36#define TL_WDR6500_V2_GPIO_BTN_RESET 1 37 38#define TL_WDR6500_V2_KEYS_POLL_INTERVAL 20 /* msecs */ 39#define TL_WDR6500_V2_KEYS_DEBOUNCE_INTERVAL (3 * TL_WDR6500_V2_KEYS_POLL_INTERVAL) 40 41#define TL_WDR6500_V2_WMAC_CALDATA_OFFSET 0x1000 42#define TL_WDR6500_V2_PCIE_CALDATA_OFFSET 0x5000 43 44static const char *tl_wdr6500_v2_part_probes[] = { 45 "tp-link-64k", 46 NULL, 47}; 48 49static struct flash_platform_data tl_wdr6500_v2_flash_data = { 50 .part_probes = tl_wdr6500_v2_part_probes, 51}; 52 53static struct gpio_led tl_wdr6500_v2_leds_gpio[] __initdata = { 54 { 55 .name = "tp-link:green:lan1", 56 .gpio = TL_WDR6500_V2_GPIO_LED_LAN1, 57 .active_low = 1, 58 }, { 59 .name = "tp-link:green:lan2", 60 .gpio = TL_WDR6500_V2_GPIO_LED_LAN2, 61 .active_low = 1, 62 }, { 63 .name = "tp-link:green:lan3", 64 .gpio = TL_WDR6500_V2_GPIO_LED_LAN3, 65 .active_low = 1, 66 }, { 67 .name = "tp-link:green:lan4", 68 .gpio = TL_WDR6500_V2_GPIO_LED_LAN4, 69 .active_low = 1, 70 }, { 71 .name = "tp-link:green:wan", 72 .gpio = TL_WDR6500_V2_GPIO_LED_WAN, 73 .active_low = 1, 74 }, { 75 .name = "tp-link:white:system", 76 .gpio = TL_WDR6500_V2_GPIO_LED_SYS, 77 .active_low = 0, 78 }, 79}; 80 81static struct gpio_keys_button tl_wdr6500_v2_gpio_keys[] __initdata = { 82 { 83 .desc = "Reset button", 84 .type = EV_KEY, 85 .code = KEY_RESTART, 86 .debounce_interval = TL_WDR6500_V2_KEYS_DEBOUNCE_INTERVAL, 87 .gpio = TL_WDR6500_V2_GPIO_BTN_RESET, 88 .active_low = 1, 89 } 90}; 91 92 93static void __init tl_ap151_setup(void) 94{ 95 u8 *mac = (u8 *) KSEG1ADDR(0x1f00fc00); 96 u8 *ee = (u8 *) KSEG1ADDR(0x1fff0000); 97 u8 tmpmac[ETH_ALEN]; 98 99 ath79_register_m25p80(&tl_wdr6500_v2_flash_data); 100 101 ath79_setup_ar933x_phy4_switch(false, false); 102 103 ath79_register_mdio(1, 0x0); 104 105 /* WAN */ 106 ath79_switch_data.phy4_mii_en = 1; 107 ath79_switch_data.phy_poll_mask = BIT(4); 108 ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII; 109 ath79_eth0_data.phy_mask = BIT(4); 110 ath79_eth0_data.mii_bus_dev = &ath79_mdio1_device.dev; 111 ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1); 112 ath79_register_eth(0); 113 114 /* LAN */ 115 ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII; 116 ath79_eth1_data.duplex = DUPLEX_FULL; 117 ath79_eth1_data.speed = SPEED_1000; 118 ath79_init_mac(ath79_eth1_data.mac_addr, mac, 0); 119 ath79_register_eth(1); 120 121 ath79_init_mac(tmpmac, mac, -1); 122 ath79_register_wmac(ee + TL_WDR6500_V2_WMAC_CALDATA_OFFSET, tmpmac); 123 124 ath79_register_pci(); 125 126 ath79_register_usb(); 127} 128 129static void __init tl_wdr6500_v2_setup(void) 130{ 131 tl_ap151_setup(); 132 133 ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wdr6500_v2_leds_gpio), 134 tl_wdr6500_v2_leds_gpio); 135 136 ath79_register_gpio_keys_polled(1, TL_WDR6500_V2_KEYS_POLL_INTERVAL, 137 ARRAY_SIZE(tl_wdr6500_v2_gpio_keys), 138 tl_wdr6500_v2_gpio_keys); 139} 140 141MIPS_MACHINE(ATH79_MACH_TL_WDR6500_V2, "TL-WDR6500-v2", "TP-LINK TL-WDR6500 v2", 142 tl_wdr6500_v2_setup); 143