ar71xx: add support for TP-Link RE450
authorTal Keren <kooolk@gmail.com>
Thu, 7 Jan 2016 00:40:48 +0000 (02:40 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 22 Dec 2016 13:50:05 +0000 (14:50 +0100)
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>
13 files changed:
target/linux/ar71xx/base-files/etc/board.d/01_leds
target/linux/ar71xx/base-files/etc/board.d/02_network
target/linux/ar71xx/base-files/etc/diag.sh
target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ar71xx/base-files/lib/ar71xx.sh
target/linux/ar71xx/base-files/lib/upgrade/platform.sh
target/linux/ar71xx/config-4.4
target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
target/linux/ar71xx/files/arch/mips/ath79/Makefile
target/linux/ar71xx/files/arch/mips/ath79/mach-re450.c [new file with mode: 0644]
target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
target/linux/ar71xx/mikrotik/config-default
target/linux/ar71xx/nand/config-default

index 8db964fc6bde3a90b0c52005610929919f716341..c6dcf36fed408683d2025fbcc273d37fb17a28a4 100755 (executable)
@@ -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"
index d163f6035f7d00ad0b933fa7cabd7cb99297dffe..8acd214ced6a1569fb5c6d0cfc74daa9fb2bf6fc 100755 (executable)
@@ -91,6 +91,7 @@ ar71xx_setup_interfaces()
        rb-912uag-5hpnd|\
        rb-sxt2n|\
        rb-sxt5n|\
+       re450|\
        rocket-m-xw|\
        tl-mr10u|\
        tl-mr11u|\
index ff605ae0c415e13306d0e4431f4185c64e1caeca..d060ccf6e27b12b7c42fb3ca6e1220c9da560520 100644 (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"
index b458ca313dff98d4dc73feac4604051cb85b3985..a4f426e142d59a2316ddf5237a23fb54425fefbd 100644 (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)
index 104b1de05c43556ab6d97cf562c2891da1995d0b..3241100198b05b125c8f3eee8452a615f988a67c 100755 (executable)
@@ -770,6 +770,9 @@ ar71xx_board_detect() {
        *"Qihoo 360 C301")
                name="qihoo-c301"
                ;;
+       *"RE450")
+               name="re450"
+               ;;
        *"RouterBOARD 411/A/AH")
                name="rb-411"
                ;;
index d4b141046780ba8e4cbb4fc0c929aad715d73e9d..570aa686e3e52887ca96e1f77fc5eac7b60700fb 100755 (executable)
@@ -343,6 +343,7 @@ platform_check_image() {
        omy-x1|\
        onion-omega|\
        oolite|\
+       re450|\
        smart-300|\
        som9331|\
        tellstick-znet-lite|\
index 3dad21a8860be98a1fd248242cb031c2340f0d16..4b2f736a86d34c42ab7ba689fc87b4456abbddf4 100644 (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
index 5bfb1624ba4551e6e9a12a47f79ac7fbc8c9022c..21d6b51897ecf0395ce87f3b15e8930c80dcabca 100644 (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
index 30657016932acff7b5e1c9b3f2cea658a282f849..6384c0604c87241417c843261fd32788abb3c8e5 100644 (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
diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-re450.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-re450.c
new file mode 100644 (file)
index 0000000..25de6e7
--- /dev/null
@@ -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)
index 6ead9117eb9ddc567cc522cace74273df1d436e6..d18a71cf38d54daa961a20c88b48b534a0aed1ac 100644 (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 */
index e980c2f38c12e7abf28cb8866713459ff3fb0cba..3e7cfd5f278d2cca62c0306345fc93916a110c7d 100644 (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
index a6871825b71e36d287c459c97b08c2aa86088547..515266b0f8386fa44a3c872ff7356d5a7bfb8dd2 100644 (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