ar71xx: add support for TP-Link RE450

Add full support for TP-Link RE450.
The wireless SoC is similiar to Archer C7: QCA9558 + QCA9880 (pci).
The ethernet interface is AR8035, but the mdio is connected to the gpio and
the chipset builtin mdio bus isn't used, which is unique (and weird), so the
kernel gpio mdio module is used.
The two ethernet leds are connected to the GPIO, so they are both configured,
one to indicate link status and the other to indicate data transfer.

The generation of the image was added to the image Makefile.
The return value of tplink-safeloader is not ignored anymore (to fail on error)

The result factory image is flashable from the stock web ui.

Signed-off-by: Tal Keren <kooolk@gmail.com>
[rd@radekdostal.com: ar71xx: RE450: do not build RE450 for nand]
Signed-off-by: Radek Dostál <rd@radekdostal.com>
[hyniu@o2.pl: ar71xx: RE450: Renaming LED accordance with the standard]
Signed-off-by: Henryk Heisig <hyniu@o2.pl>
[jo@mein.io: squash fixes from Radek and Henryk into original commit]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Tal Keren 2016-01-07 02:40:48 +02:00 committed by Jo-Philipp Wich
parent 236fc232bb
commit 9c475eca3e
13 changed files with 220 additions and 0 deletions

View file

@ -428,6 +428,12 @@ omy-x1)
qihoo-c301)
ucidef_set_led_wlan "wlan2g" "WLAN2G" "qihoo:red:status" "phy1tpt"
;;
re450)
ucidef_set_led_netdev "lan_data" "LAN Data" "$board:green:lan_data" "eth0" "tx rx"
ucidef_set_led_netdev "lan_link" "LAN Link" "$board:green:lan_link" "eth0" "link"
ucidef_set_led_wlan "wlan2g" "WLAN 2.4 GHz" "$board:blue:wlan2g" "phy1tpt"
ucidef_set_led_wlan "wlan5g" "WLAN 5 GHz" "$board:blue:wlan5g" "phy0tpt"
;;
smart-300)
ucidef_set_led_netdev "wan" "WAN" "nc-link:green:wan" "eth0"
ucidef_set_led_switch "lan1" "LAN1" "nc-link:green:lan1" "switch0" "0x04"

View file

@ -91,6 +91,7 @@ ar71xx_setup_interfaces()
rb-912uag-5hpnd|\
rb-sxt2n|\
rb-sxt5n|\
re450|\
rocket-m-xw|\
tl-mr10u|\
tl-mr11u|\

View file

@ -295,6 +295,9 @@ get_status_led() {
rb-sxt5n)
status_led="rb:green:power"
;;
re450)
status_led="$board:blue:power"
;;
routerstation|\
routerstation-pro)
status_led="ubnt:green:rf"

View file

@ -86,6 +86,10 @@ case "$FIRMWARE" in
ath10kcal_extract "caldata" 20480 2116
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) +2)
;;
re450)
ath10kcal_extract "art" 20480 2116
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -2)
;;
tl-wdr6500-v2)
ath10kcal_extract "art" 20480 2116
ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth1/address) -2)

View file

@ -770,6 +770,9 @@ ar71xx_board_detect() {
*"Qihoo 360 C301")
name="qihoo-c301"
;;
*"RE450")
name="re450"
;;
*"RouterBOARD 411/A/AH")
name="rb-411"
;;

View file

@ -343,6 +343,7 @@ platform_check_image() {
omy-x1|\
onion-omega|\
oolite|\
re450|\
smart-300|\
som9331|\
tellstick-znet-lite|\

View file

@ -145,6 +145,7 @@ CONFIG_ATH79_MACH_R6100=y
# CONFIG_ATH79_MACH_RB922 is not set
# CONFIG_ATH79_MACH_RB95X is not set
# CONFIG_ATH79_MACH_RBSXTLITE is not set
CONFIG_ATH79_MACH_RE450=y
CONFIG_ATH79_MACH_RW2458N=y
CONFIG_ATH79_MACH_SMART_300=y
CONFIG_ATH79_MACH_SOM9331=y

View file

@ -1103,6 +1103,16 @@ config ATH79_MACH_MZK_W300NH
select ATH79_DEV_M25P80
select ATH79_DEV_WMAC
config ATH79_MACH_RE450
bool "TP-LINK RE450 board support"
select SOC_QCA955X
select ATH79_DEV_AP9X_PCI if PCI
select ATH79_DEV_ETH
select ATH79_DEV_GPIO_BUTTONS
select ATH79_DEV_LEDS_GPIO
select ATH79_DEV_M25P80
select ATH79_DEV_WMAC
config ATH79_MACH_RW2458N
bool "Redwave RW2458N board support"
select SOC_AR724X

View file

@ -149,6 +149,7 @@ obj-$(CONFIG_ATH79_MACH_RB91X) += mach-rb91x.o
obj-$(CONFIG_ATH79_MACH_RB922) += mach-rb922.o
obj-$(CONFIG_ATH79_MACH_RB95X) += mach-rb95x.o
obj-$(CONFIG_ATH79_MACH_RBSXTLITE) += mach-rbsxtlite.o
obj-$(CONFIG_ATH79_MACH_RE450) += mach-re450.o
obj-$(CONFIG_ATH79_MACH_RW2458N) += mach-rw2458n.o
obj-$(CONFIG_ATH79_MACH_SMART_300) += mach-smart-300.o
obj-$(CONFIG_ATH79_MACH_SOM9331) += mach-som9331.o

View file

@ -0,0 +1,187 @@
/*
* TP-LINK Archer RE450 board support
*
* Copyright (c) 2013 Gabor Juhos <juhosg@openwrt.org>
* Copyright (c) 2016 Tal Keren <kooolk@gmail.com>
*
* Based on the Qualcomm Atheros AP135/AP136 reference board support code
* Copyright (c) 2012 Qualcomm Atheros
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#include <linux/pci.h>
#include <linux/phy.h>
#include <linux/gpio.h>
#include <linux/platform_data/mdio-gpio.h>
#include <linux/platform_device.h>
#include <linux/ar8216_platform.h>
#include <asm/mach-ath79/ath79.h>
#include <asm/mach-ath79/ar71xx_regs.h>
#include "common.h"
#include "dev-ap9x-pci.h"
#include "dev-eth.h"
#include "dev-gpio-buttons.h"
#include "dev-leds-gpio.h"
#include "dev-m25p80.h"
#include "dev-wmac.h"
#include "machtypes.h"
#include "pci.h"
#define RE450_GPIO_LED_SYSTEM 12
#define RE450_GPIO_LED_WLAN2G 13
#define RE450_GPIO_LED_WLAN5G 14
#define RE450_GPIO_LED_LAN_DATA 17
#define RE450_GPIO_LED_JUMPSTART 21
#define RE450_GPIO_LED_JUMPSTART_RED 22
#define RE450_GPIO_LED_LAN_LINK 23
#define RE450_GPIO_BTN_RESET 18
#define RE450_GPIO_BTN_LED 19
#define RE450_GPIO_BTN_JUMPSTART 20
#define RE450_GPIO_SMI_MDIO 1
#define RE450_GPIO_SMI_MDC 3
#define RE450_LAN_PHYADDR 4
#define RE450_KEYS_POLL_INTERVAL 20 /* msecs */
#define RE450_KEYS_DEBOUNCE_INTERVAL (3 * RE450_KEYS_POLL_INTERVAL)
#define RE450_WMAC_CALDATA_OFFSET 0x1000
static const char *tl_re450_part_probes[] = {
"cmdlinepart",
NULL,
};
static struct flash_platform_data tl_re450_flash_data = {
.part_probes = tl_re450_part_probes,
};
static struct gpio_led re450_leds_gpio[] __initdata = {
{
.name = "re450:blue:power",
.gpio = RE450_GPIO_LED_SYSTEM,
.active_low = 1,
},
{
.name = "re450:blue:wlan2g",
.gpio = RE450_GPIO_LED_WLAN2G,
.active_low = 1,
},
{
.name = "re450:blue:wlan5g",
.gpio = RE450_GPIO_LED_WLAN5G,
.active_low = 1,
},
{
.name = "re450:blue:wps",
.gpio = RE450_GPIO_LED_JUMPSTART,
},
{
.name = "re450:red:wps",
.gpio = RE450_GPIO_LED_JUMPSTART_RED,
},
{
.name = "re450:green:lan_data",
.gpio = RE450_GPIO_LED_LAN_DATA,
.active_low = 1,
},
{
.name = "re450:green:lan_link",
.gpio = RE450_GPIO_LED_LAN_LINK,
.active_low = 1,
},
};
static struct gpio_keys_button re450_gpio_keys[] __initdata = {
{
.desc = "Reset button",
.type = EV_KEY,
.code = KEY_WPS_BUTTON,
.debounce_interval = RE450_KEYS_DEBOUNCE_INTERVAL,
.gpio = RE450_GPIO_BTN_RESET,
.active_low = 1,
},
{
.desc = "WPS button",
.type = EV_KEY,
.code = KEY_RESTART,
.debounce_interval = RE450_KEYS_DEBOUNCE_INTERVAL,
.gpio = RE450_GPIO_BTN_JUMPSTART,
.active_low = 1,
},
{
.desc = "Control LED button",
.type = EV_KEY,
.code = BTN_0,
.debounce_interval = RE450_KEYS_DEBOUNCE_INTERVAL,
.gpio = RE450_GPIO_BTN_LED,
.active_low = 1,
},
};
static struct mdio_gpio_platform_data re450_mdio = {
.mdc = RE450_GPIO_SMI_MDC,
.mdio = RE450_GPIO_SMI_MDIO,
.phy_mask = ~BIT(RE450_LAN_PHYADDR),
};
static struct platform_device re450_phy_device = {
.name = "mdio-gpio",
.id = 0,
.dev = {
.platform_data = &re450_mdio,
},
};
static void __init re450_setup(void)
{
u8 *mac = (u8 *) KSEG1ADDR(0x1f610008);
u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
u8 tmpmac[ETH_ALEN];
ath79_register_m25p80(&tl_re450_flash_data);
ath79_register_leds_gpio(-1, ARRAY_SIZE(re450_leds_gpio),
re450_leds_gpio);
ath79_register_gpio_keys_polled(-1, RE450_KEYS_POLL_INTERVAL,
ARRAY_SIZE(re450_gpio_keys),
re450_gpio_keys);
ath79_init_mac(tmpmac, mac, -1);
ath79_register_wmac(art + RE450_WMAC_CALDATA_OFFSET, tmpmac);
ath79_register_pci();
/* MDIO Interface */
platform_device_register(&re450_phy_device);
ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN);
/* GMAC0 is connected to the RGMII interface to an Atheros AR8035-A */
ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
ath79_eth0_data.mii_bus_dev = &re450_phy_device.dev;
ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
ath79_eth0_data.phy_mask = BIT(RE450_LAN_PHYADDR);
ath79_eth0_pll_data.pll_1000 = 0xa6000000;
ath79_eth0_pll_data.pll_100 = 0xa0000101;
ath79_eth0_pll_data.pll_10 = 0x80001313;
ath79_register_eth(0);
}
MIPS_MACHINE(ATH79_MACH_RE450, "RE450", "TP-LINK RE450",
re450_setup)

View file

@ -166,6 +166,7 @@ enum ath79_mach_type {
ATH79_MACH_RB_951U, /* Mikrotik RouterBOARD 951Ui-2HnD */
ATH79_MACH_RB_SXTLITE2ND, /* Mikrotik RouterBOARD SXT Lite 2nD */
ATH79_MACH_RB_SXTLITE5ND, /* Mikrotik RouterBOARD SXT Lite 5nD */
ATH79_MACH_RE450, /* TP-LINK RE450 */
ATH79_MACH_RW2458N, /* Redwave RW2458N */
ATH79_MACH_SMART_300, /* NC-LINK SMART-300 */
ATH79_MACH_SOM9331, /* OpenEmbed SOM9331 */

View file

@ -68,6 +68,7 @@ CONFIG_ATH79_MACH_RB91X=y
CONFIG_ATH79_MACH_RB922=y
CONFIG_ATH79_MACH_RB95X=y
CONFIG_ATH79_MACH_RBSXTLITE=y
# CONFIG_ATH79_MACH_RE450 is not set
# CONFIG_ATH79_MACH_RW2458N is not set
# CONFIG_ATH79_MACH_SMART_300 is not set
# CONFIG_ATH79_MACH_TEW_632BRP is not set

View file

@ -35,6 +35,7 @@
# CONFIG_ATH79_MACH_OM2P is not set
# CONFIG_ATH79_MACH_PB42 is not set
# CONFIG_ATH79_MACH_PB44 is not set
# CONFIG_ATH79_MACH_RE450 is not set
# CONFIG_ATH79_MACH_RW2458N is not set
# CONFIG_ATH79_MACH_TEW_632BRP is not set
# CONFIG_ATH79_MACH_TEW_673GRU is not set