ath79: preliminary support for TP-Link WDR3600 / WDR4300 (AR9344)
authorJohann Neuhauser <johann@it-neuhauser.de>
Fri, 18 May 2018 16:06:03 +0000 (18:06 +0200)
committerJohn Crispin <john@phrozen.org>
Tue, 22 May 2018 18:53:15 +0000 (20:53 +0200)
working:
 - leds
 - buttons
 - lan / wan
 - usb (hub port 1 + 2)
 - wifi 5g
 - sysupgrade
 - ...

not working:
 - wifi 2g

Signed-off-by: Johann Neuhauser <johann@it-neuhauser.de>
target/linux/ath79/base-files/etc/board.d/02_network
target/linux/ath79/base-files/etc/diag.sh
target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
target/linux/ath79/dts/ar9344.dtsi [new file with mode: 0644]
target/linux/ath79/dts/ar9344_tl-wdr3600.dts [new file with mode: 0644]
target/linux/ath79/dts/ar9344_tl-wdr4300.dts [new file with mode: 0644]
target/linux/ath79/dts/ar9344_tl-wdr4300.dtsi [new file with mode: 0644]
target/linux/ath79/dts/ar934x.dtsi [new file with mode: 0644]
target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
target/linux/ath79/image/generic-tp-link.mk

index 19361f1..12176c1 100755 (executable)
@@ -13,6 +13,12 @@ ath79_setup_interfaces()
                ucidef_set_interface_lan "eth0"
                ;;
 
+       "tplink,tl-wdr3600"|\
+       "tplink,tl-wdr4300")
+               ucidef_add_switch "switch0" \
+                       "0@eth0" "2:lan:1" "3:lan:2" "4:lan:3" "5:lan:4" "1:wan"
+               ;;
+
        "tplink,tl-wr1043nd-v1")
                ucidef_add_switch "switch0" \
                        "1:lan" "2:lan" "3:lan" "4:lan" "0:wan" "5@eth0"
index 8022151..b184634 100644 (file)
@@ -2,6 +2,8 @@
 
 . /lib/functions/leds.sh
 
+status_led="$(get_dt_led status)"
+
 get_status_led() {
        local board=$(board_name)
        local boardname="${board##*,}"
@@ -23,7 +25,7 @@ get_status_led() {
 }
 
 set_state() {
-       get_status_led
+       [ -z "$status_led" ] && get_status_led
 
        case "$1" in
        preinit)
index c2d87f5..c09dca1 100644 (file)
@@ -50,6 +50,10 @@ case "$FIRMWARE" in
        "avm,fritz300e")
                ath9k_eeprom_extract_reverse "urloader" 5441 1088
                ;;
+       "tplink,tl-wdr3600"|\
+       "tplink,tl-wdr4300")
+               ath9k_eeprom_extract "art" 20480 1088
+               ;;
        "ubnt,unifi")
                ath9k_eeprom_extract "art" 4096 2048
                ;;
diff --git a/target/linux/ath79/dts/ar9344.dtsi b/target/linux/ath79/dts/ar9344.dtsi
new file mode 100644 (file)
index 0000000..655ab35
--- /dev/null
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "ar934x.dtsi"
+
+/ {
+       compatible = "qca,ar9344";
+};
+
+&apb {
+       pcie: pcie-controller@180c0000 {
+               compatible = "qcom,ar9340-pci", "qcom,ar7240-pci";
+               #address-cells = <3>;
+               #size-cells = <2>;
+               bus-range = <0x0 0x0>;
+               reg = <0x180c0000 0x1000>, /* CRP */
+                               <0x180f0000 0x100>, /* CTRL */
+                               <0x14000000 0x1000>; /* CFG */
+               reg-names = "crp_base", "ctrl_base", "cfg_base";
+               ranges = <0x2000000 0 0x10000000 0x10000000 0 0x04000000 /* pci memory */
+                               0x1000000 0 0x00000000 0x0000000 0 0x000001>; /* io space */
+               interrupt-parent = <&cpuintc>;
+               interrupts = <2>;
+
+               interrupt-controller;
+               #interrupt-cells = <1>;
+
+               interrupt-map-mask = <0 0 0 1>;
+               interrupt-map = <0 0 0 0 &pcie 0>;
+               
+               status = "disabled";
+       };
+};
diff --git a/target/linux/ath79/dts/ar9344_tl-wdr3600.dts b/target/linux/ath79/dts/ar9344_tl-wdr3600.dts
new file mode 100644 (file)
index 0000000..d0886ee
--- /dev/null
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "ar9344_tl-wdr4300.dtsi"
+
+/ {
+       model = "TP-Link WDR3600";
+       compatible = "tplink,tl-wdr3600";
+};
diff --git a/target/linux/ath79/dts/ar9344_tl-wdr4300.dts b/target/linux/ath79/dts/ar9344_tl-wdr4300.dts
new file mode 100644 (file)
index 0000000..617da57
--- /dev/null
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "ar9344_tl-wdr4300.dtsi"
+
+/ {
+       model = "TP-Link WDR4300";
+       compatible = "tplink,tl-wdr4300";
+};
diff --git a/target/linux/ath79/dts/ar9344_tl-wdr4300.dtsi b/target/linux/ath79/dts/ar9344_tl-wdr4300.dtsi
new file mode 100644 (file)
index 0000000..e7f24bf
--- /dev/null
@@ -0,0 +1,240 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "ar9344.dtsi"
+
+/ {
+       model = "TP-Link WDR4300";
+       compatible = "tplink,tl-wdr4300";
+
+       aliases {
+               led-status = &system;
+       };
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x8000000>;
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               usb1 {
+                       label = "tp-link:green:usb1";
+                       gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+                       trigger-sources = <&hub_port1>;
+                       linux,default-trigger = "usbport";
+               };
+
+               usb2 {
+                       label = "tp-link:green:usb2";
+                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+                       trigger-sources = <&hub_port2>;
+                       linux,default-trigger = "usbport";
+               };
+
+               wlan2g {
+                       label = "tp-link:green:wlan2g";
+                       gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+                       linux,default-trigger = "phy0tpt";
+               };
+
+               system: system {
+                       label = "tp-link:green:system";
+                       gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
+                       default-state = "on";
+               };
+
+               qss {
+                       label = "tp-link:green:qss";
+                       gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+       };
+
+       ath9k-leds {
+               compatible = "gpio-leds";
+
+               wlan5g {
+                       label = "tp-link:green:wlan5g";
+                       gpios = <&ath9k 0 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+                       linux,default-trigger = "phy1tpt";
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys-polled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               poll-interval = <20>;
+
+               button@0 {
+                       label = "reset";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
+                       debounce-interval = <60>;
+               };
+
+               button@1 {
+                       label = "wifi";
+                       linux,code = <KEY_RFKILL>;
+                       linux,input-type = <EV_SW>;
+                       gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+                       debounce-interval = <60>;
+               };
+       };
+
+       gpio-export {
+               compatible = "gpio-export";
+               #size-cells = <0>;
+
+               gpio_usb1_power {
+                       gpio-export,name = "tp-link:power:usb1";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio 22 GPIO_ACTIVE_HIGH>;
+               };
+
+               gpio_usb2_power {
+                       gpio-export,name = "tp-link:power:usb2";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio 21 GPIO_ACTIVE_HIGH>;
+               };
+
+               gpio_ext_lna0 {
+                       gpio-export,name = "tp-link:ext:lna0";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio 18 GPIO_ACTIVE_HIGH>;
+               };
+
+               gpio_ext_lna1 {
+                       gpio-export,name = "tp-link:ext:lna1";
+                       gpio-export,output = <1>;
+                       gpios = <&gpio 19 GPIO_ACTIVE_HIGH>;
+               };
+       };
+};
+
+&ref {
+       clock-frequency = <40000000>;
+};
+
+&uart {
+       status = "okay";
+};
+
+&gpio {
+       status = "okay";
+};
+
+&spi {
+       num-cs = <1>;
+
+       status = "okay";
+
+       flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <25000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       uboot: partition@0 {
+                               label = "u-boot";
+                               reg = <0x000000 0x020000>;
+                               read-only;
+                       };
+
+                       partition@20000 {
+                               label = "firmware";
+                               reg = <0x020000 0x7d0000>;
+                       };
+
+                       partition@7f0000 {
+                               label = "art";
+                               reg = <0x7f0000 0x010000>;
+                               read-only;
+                       };
+               };
+       };
+};
+
+&usb {
+       status = "okay";
+
+       port@1 {
+               reg = <1>;
+               #trigger-source-cells = <0>;
+
+               hub_port1: port@1 {
+                       reg = <1>;
+                       #trigger-source-cells = <0>;
+               };
+
+               hub_port2: port@2 {
+                       reg = <2>;
+                       #trigger-source-cells = <0>;
+               };
+       };
+};
+
+&usb_phy {
+       status = "okay";
+};
+
+&pcie {
+       status = "okay";
+
+       ath9k: wifi@168c,0033 {
+               compatible = "pci168c,0033";
+               reg = <0x0000 0 0 0 0>;
+               mtd-mac-address = <&uboot 0x1fc00>;
+               qca,no-eeprom;
+               #gpio-cells = <2>;
+               gpio-controller;
+       };
+};
+
+&mdio0 {
+       status = "okay";
+
+       phy-mask = <0>;
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+               phy-mode = "rgmii";
+
+               qca,ar8327-initvals = <
+                       0x04 0x07600000 /* PORT0 PAD MODE CTRL */
+                       0x10 0x80000080 /* POWER_ON_STRIP */
+                       0x50 0xc737c737 /* LED_CTRL0 */
+                       0x54 0x00000000 /* LED_CTRL1 */
+                       0x58 0x00000000 /* LED_CTRL2 */
+                       0x5c 0x0030c300 /* LED_CTRL3 */
+                       0x7c 0x0000007e /* PORT0_STATUS */
+                       >;
+       };
+};
+
+&eth0 {
+       status = "okay";
+
+       /* default for ar934x, except for 1000M */
+       pll-data = <0x06000000 0x00000101 0x00001616>;
+
+       mtd-mac-address = <&uboot 0x1fc00>;
+       mtd-mac-address-increment = <(-2)>;
+
+       phy-mode = "rgmii";
+       phy-handle = <&phy0>;
+};
diff --git a/target/linux/ath79/dts/ar934x.dtsi b/target/linux/ath79/dts/ar934x.dtsi
new file mode 100644 (file)
index 0000000..b8a915f
--- /dev/null
@@ -0,0 +1,219 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include <dt-bindings/clock/ath79-clk.h>
+
+#include "ath79.dtsi"
+
+/ {
+       compatible = "qca,ar9340";
+
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       chosen {
+               bootargs = "console=ttyS0,115200";
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "mips,mips74Kc";
+                       clocks = <&pll ATH79_CLK_CPU>;
+                       reg = <0>;
+               };
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               ref: ref {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-output-names = "ref";
+               };
+       };
+
+       ahb {
+               compatible = "simple-bus";
+               ranges;
+
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               apb: apb {
+                       compatible = "simple-bus";
+                       ranges;
+
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       ddr_ctrl: memory-controller@18000000 {
+                               compatible = "qca,ar9340-ddr-controller",
+                                               "qca,ar7240-ddr-controller";
+                               reg = <0x18000000 0x12c>;
+
+                               #qca,ddr-wb-channel-cells = <1>;
+                       };
+
+                       uart: uart@18020000 {
+                               compatible = "ns16550a";
+                               reg = <0x18020000 0x2c>;
+
+                               interrupts = <3>;
+
+                               clocks = <&pll ATH79_CLK_REF>;
+                               clock-names = "uart";
+
+                               reg-io-width = <4>;
+                               reg-shift = <2>;
+                               no-loopback-test;
+
+                               status = "disabled";
+                       };
+
+                       gpio: gpio@18040000 {
+                               compatible = "qca,ar9340-gpio";
+                               reg = <0x18040000 0x2c>;
+
+                               interrupts = <2>;
+                               ngpios = <23>;
+
+                               gpio-controller;
+                               #gpio-cells = <2>;
+
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                       };
+
+                       pinmux: pinmux@1804002c {
+                               compatible = "pinctrl-single";
+
+                               reg = <0x1804002c 0x44>;
+
+                               #size-cells = <0>;
+
+                               pinctrl-single,bit-per-mux;
+                               pinctrl-single,register-width = <32>;
+                               pinctrl-single,function-mask = <0x1>;
+                               #pinctrl-cells = <2>;
+
+                               jtag_disable_pins: pinmux_jtag_disable_pins {
+                                       pinctrl-single,bits = <0x40 0x2 0x2>;
+                               };
+                       };
+
+                       pll: pll-controller@18050000 {
+                               compatible = "qca,ar9340-pll", "syscon";
+                               reg = <0x18050000 0x4c>;
+
+                               #clock-cells = <1>;
+                               clocks = <&ref>;
+                               clock-names = "ref";
+                               clock-output-names = "cpu", "ddr", "ahb";
+                       };
+
+                       wdt: wdt@18060008 {
+                               compatible = "qca,ar9340-wdt", "qca,ar7130-wdt";
+                               reg = <0x18060008 0x8>;
+
+                               interrupts = <4>;
+
+                               clocks = <&pll ATH79_CLK_AHB>;
+                               clock-names = "wdt";
+                       };
+
+                       rst: reset-controller@1806001c {
+                               compatible = "qca,ar9340-reset", "qca,ar7100-reset";
+                               reg = <0x1806001c 0x4>;
+
+                               #reset-cells = <1>;
+                       };
+
+                       gmac: gmac@18070000 {
+                               compatible = "qca,ar9340-gmac", "qca,ar9330-gmac";
+                               reg = <0x18070000 0x14>;
+                       };
+               };
+
+               usb: usb@1b000000 {
+                       compatible = "generic-ehci";
+                       reg = <0x1b000000 0x1d8>;
+
+                       interrupts = <3>;
+                       resets = <&rst 5>;
+                       reset-names = "usb-host";
+
+                       has-transaction-translator;
+                       caps-offset = <0x100>;
+
+                       phy-names = "usb-phy";
+                       phys = <&usb_phy>;
+
+                       status = "disabled";
+               };
+
+               spi: spi@1f000000 {
+                       compatible = "qca,ar9340-spi", "qca,ar7100-spi";
+                       reg = <0x1f000000 0x1c>;
+
+                       clocks = <&pll ATH79_CLK_AHB>;
+                       clock-names = "ahb";
+
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       status = "disabled";
+               };
+       };
+
+       usb_phy: usb-phy {
+               compatible = "qca,ar9340-usb-phy", "qca,ar7200-usb-phy";
+
+               reset-names = "usb-phy", "usb-suspend-override";
+               resets = <&rst 4>, <&rst 3>;
+
+               #phy-cells = <0>;
+
+               status = "disabled";
+       };
+};
+
+&cpuintc {
+       qca,ddr-wb-channel-interrupts = <2>, <3>, <4>, <5>;
+       qca,ddr-wb-channels = <&ddr_ctrl 3>, <&ddr_ctrl 2>,
+                               <&ddr_ctrl 0>, <&ddr_ctrl 1>;
+};
+
+&mdio0 {
+       resets = <&rst 22>;
+       reset-names = "mdio";
+};
+
+&eth0 {
+       compatible = "qca,ar9340-eth", "syscon";
+
+       pll-data = <0x16000000 0x00000101 0x00001616>;
+       pll-reg = <0x4 0x2c 17>;
+       pll-handle = <&pll>;
+
+       resets = <&rst 8>, <&rst 9>;
+       reset-names = "mac", "phy";
+};
+
+&mdio1 {
+       resets = <&rst 23>;
+       reset-names = "mdio";
+       builtin-switch;
+};
+
+&eth1 {
+       compatible = "qca,ar9340-eth", "syscon";
+
+       resets = <&rst 12>, <&rst 13>;
+       reset-names = "mac", "phy";
+};
index 3c07adb..4a966fc 100644 (file)
@@ -625,6 +625,7 @@ __ag71xx_link_adjust(struct ag71xx *ag, bool update)
                        ath79_set_pll(ag);
                } else if (of_device_is_compatible(np, "qca,ar9130-eth")) {
                } else if (of_device_is_compatible(np, "qca,ar9340-eth")) {
+                       ath79_set_pll(ag);
                } else if (of_device_is_compatible(np, "qca,qca9550-eth")) {
                } else if (of_device_is_compatible(np, "qca,qca9560-eth")) {
                }
index dd1a983..a368662 100644 (file)
@@ -47,7 +47,7 @@ define Device/tplink
   KERNEL := kernel-bin | append-dtb | lzma
   KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | tplink-v1-header
   IMAGES := sysupgrade.bin factory.bin
-  IMAGE/sysupgrade.bin := append-rootfs | mktplinkfw sysupgrade
+  IMAGE/sysupgrade.bin := append-rootfs | mktplinkfw sysupgrade | append-metadata
   IMAGE/factory.bin := append-rootfs | mktplinkfw factory
 endef
 
@@ -72,6 +72,12 @@ define Device/tplink-8m
   IMAGE_SIZE := 7936k
 endef
 
+define Device/tplink-8mlzma
+$(Device/tplink)
+  TPLINK_FLASHLAYOUT := 8Mlzma
+  IMAGE_SIZE := 7936k
+endef
+
 define Device/tl_wr1043nd_v1
   $(Device/tplink-8m)
   ATH_SOC := ar9132
@@ -81,3 +87,21 @@ define Device/tl_wr1043nd_v1
   SUPPORTED_DEVICES := tplink,tl-wr1043nd-v1 tl-wr1043nd
 endef
 #TARGET_DEVICES += tl_wr1043nd_v1
+
+define Device/tl-wdr3600
+  $(Device/tplink-8mlzma)
+  ATH_SOC := ar9344
+  DEVICE_TITLE := TP-LINK TL-WDR3600
+  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
+  TPLINK_HWID := 0x36000001
+  SUPPORTED_DEVICES := tplink,tl-wdr3600 tl-wdr3600
+endef
+TARGET_DEVICES += tl-wdr3600
+
+define Device/tl-wdr4300
+  $(Device/tl-wdr3600)
+  DEVICE_TITLE := TP-LINK TL-WDR4300
+  TPLINK_HWID := 0x43000001
+  SUPPORTED_DEVICES := tplink,tl-wdr4300 tl-wdr4300
+endef
+TARGET_DEVICES += tl-wdr4300