diff mbox series

[OpenWrt-Devel] ath79: Add support for TL-WR740N/NDv2, TL-MR3220v1, TL-MR3420v1

Message ID AM5PR0201MB2417DFDBC5D79A34532D8936A9490@AM5PR0201MB2417.eurprd02.prod.outlook.com
State Changes Requested
Delegated to: John Crispin
Headers show
Series [OpenWrt-Devel] ath79: Add support for TL-WR740N/NDv2, TL-MR3220v1, TL-MR3420v1 | expand

Commit Message

Смирнов Дмитрий June 26, 2018, 2:47 p.m. UTC
From dfcb42807ddd384482ea0dc18d42a8e4774b709e Mon Sep 17 00:00:00 2001
From: Deoptim <dioptimizer@hotmail.com>
Date: Tue, 26 Jun 2018 17:01:47 +0300
Subject: [OpenWrt-Devel] [PATCH] ath79: Add support for TL-WR740N/NDv2,TL-MR3220v1,TL-MR3420v1

Its common AP99(AR7241) platform with following devices:
TP-Link TL-WR740N/ND v2 (SoC AR7241 / Wifi AR9287 / without USB)
TP-Link TL-MR3220 v1 (SoC AR7241 / Wifi AR9285 / USB support)
TP-Link TL-MR3420 v1 (SoC AR7241 / Wifi AR9287 / USB support)

File ar7241_ap99.dtsi have common architecture with those devices
and dts files include it as common configuration.

Signed-off-by: Deoptim <dioptimizer@hotmail.com>
---
 .../ath79/base-files/etc/board.d/02_network   |   7 +
 .../etc/hotplug.d/firmware/10-ath9k-eeprom    |   3 +
 target/linux/ath79/dts/ar7241_ap99.dtsi       | 144 ++++++++++++++++++
 .../linux/ath79/dts/ar7241_tl-mr3220-v1.dts   | 108 +++++++++++++
 .../linux/ath79/dts/ar7241_tl-mr3420-v1.dts   |  44 ++++++
 target/linux/ath79/dts/ar7241_tl-wr841-v7.dts |  12 ++
 target/linux/ath79/image/tiny-tp-link.mk      |  29 ++++
 7 files changed, 347 insertions(+)
 create mode 100644 target/linux/ath79/dts/ar7241_ap99.dtsi
 create mode 100644 target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
 create mode 100644 target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
 create mode 100644 target/linux/ath79/dts/ar7241_tl-wr841-v7.dts

Comments

Mathias Kresin June 26, 2018, 4:28 p.m. UTC | #1
Hey Dmitry,

find my comments inline. Please take care to fix the outlined issues
for all dts.

2018-06-26 16:47 GMT+02:00 Смирнов Дмитрий <dioptimizer@hotmail.com>:
>
> From dfcb42807ddd384482ea0dc18d42a8e4774b709e Mon Sep 17 00:00:00 2001
> From: Deoptim <dioptimizer@hotmail.com>

Please use your full name here.

> Date: Tue, 26 Jun 2018 17:01:47 +0300
> Subject: [OpenWrt-Devel] [PATCH] ath79: Add support for TL-WR740N/NDv2,TL-MR3220v1,TL-MR3420v1
>
> Its common AP99(AR7241) platform with following devices:
> TP-Link TL-WR740N/ND v2 (SoC AR7241 / Wifi AR9287 / without USB)
> TP-Link TL-MR3220 v1 (SoC AR7241 / Wifi AR9285 / USB support)
> TP-Link TL-MR3420 v1 (SoC AR7241 / Wifi AR9287 / USB support)
>
> File ar7241_ap99.dtsi have common architecture with those devices
> and dts files include it as common configuration.

To be honest, I don't like the ar7241_ap99.dtsi filename and I'm not
sure if it really does make sense to use a dtsi here. For instance,
only two of the boards have a usb led and your workaround is to move
the usb led into an extra gpio led node. I prefer to have a complete
gpio-leds in the dts files instead.

The spi node from the dtsi is overwritten by one dts. In that case it
shouldn't be added to dtsi. Instead each dts should have it's own spi
node.

While I love to remove redundant stuff, we need to keep an eye on
maintainability/readability. I would like to ensure that we don't
break something for the boards including the dtsif, we change
something in the dtsi.

>
> Signed-off-by: Deoptim <dioptimizer@hotmail.com>

Full name here. as well

> ---
>  .../ath79/base-files/etc/board.d/02_network   |   7 +
>  .../etc/hotplug.d/firmware/10-ath9k-eeprom    |   3 +
>  target/linux/ath79/dts/ar7241_ap99.dtsi       | 144 ++++++++++++++++++
>  .../linux/ath79/dts/ar7241_tl-mr3220-v1.dts   | 108 +++++++++++++
>  .../linux/ath79/dts/ar7241_tl-mr3420-v1.dts   |  44 ++++++
>  target/linux/ath79/dts/ar7241_tl-wr841-v7.dts |  12 ++
>  target/linux/ath79/image/tiny-tp-link.mk      |  29 ++++
>  7 files changed, 347 insertions(+)
>  create mode 100644 target/linux/ath79/dts/ar7241_ap99.dtsi
>  create mode 100644 target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
>  create mode 100644 target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
>  create mode 100644 target/linux/ath79/dts/ar7241_tl-wr841-v7.dts
>
> diff --git a/target/linux/ath79/base-files/etc/board.d/02_network b/target/linux/ath79/base-files/etc/board.d/02_network
> index e2a45b0526..689ae82ffb 100755
> --- a/target/linux/ath79/base-files/etc/board.d/02_network
> +++ b/target/linux/ath79/base-files/etc/board.d/02_network
> @@ -98,6 +98,13 @@ ath79_setup_interfaces()
>                 ucidef_add_switch "switch0" \
>                         "0@eth0" "3:lan:1" "5:lan:2" "4:wan"
>                 ;;
> +       "tplink,tl-wr841-v7"|\
> +       "tplink,tl-mr3220-v1"|\
> +       "tplink,tl-mr3420-v1")
> +               ucidef_set_interfaces_lan_wan "eth1.1" "eth0"

ucidef_add_switch should already set the lan interface. A
ucidef_set_interface_wan "eth1" should be sufficient here.

> +               ucidef_add_switch "switch0" \
> +                       "0@eth1" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1"
> +               ;;
>         *)
>                 ucidef_set_interfaces_lan_wan "eth0" "eth1"
>                 ;;
> diff --git a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
> index 7023fa5e58..e5e2b1f8d3 100644
> --- a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
> +++ b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
> @@ -54,6 +54,9 @@ case "$FIRMWARE" in
>         "tplink,tl-wdr4300")
>                 ath9k_eeprom_extract "art" 20480 1088
>                 ;;
> +       "tplink,tl-wr841-v7"|\
> +       "tplink,tl-mr3220-v1"|\
> +       "tplink,tl-mr3420-v1"|\
>         "netgear,wnr612-v2"|\
>         "on,n150r"|\
>         "tplink,tl-wr740n-v2"|\
> diff --git a/target/linux/ath79/dts/ar7241_ap99.dtsi b/target/linux/ath79/dts/ar7241_ap99.dtsi
> new file mode 100644
> index 0000000000..d3834b4915
> --- /dev/null
> +++ b/target/linux/ath79/dts/ar7241_ap99.dtsi
> @@ -0,0 +1,144 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +
> +#include "ar7241.dtsi"
> +
> +/ {
> +       aliases {
> +               led-status = &led_system;
> +       };
> +
> +       memory@0 {
> +               device_type = "memory";
> +               reg = <0x0 0x2000000>;
> +       };

The pending https://github.com/openwrt/openwrt/pull/1091 is about to
remove all memory nodes in favour of the automatic memory detection.
Would you please test if the correct of amount of memory is detected
without the node. If so, it can be removed.

> +
> +       gpio-keys-polled {
> +               compatible = "gpio-keys-polled";
> +               #address-cells = <1>;
> +               #size-cells = <0>;
> +               poll-interval = <20>;
> +
> +               reset {
> +                       label = "reset";
> +                       linux,code = <KEY_RESTART>;
> +                       gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
> +                       debounce-interval = <60>;
> +               };
> +
> +               qss {
> +                       label = "qss";
> +                       linux,code = <KEY_WPS_BUTTON>;
> +                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
> +                       debounce-interval = <60>;
> +               };
> +       };
> +
> +       gpio-leds {
> +               compatible = "gpio-leds";
> +
> +               led_system: system {
> +                       label = "tp-link:green:system";
> +                       gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
> +                       linux,default-trigger = "heartbeat";

Please remove the heartbeat trigger. Due to the led-status alias the
led is used for status/diag signaling.

> +               };
> +
> +               qss {
> +                       label = "tp-link:green:qss";
> +                       gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
> +               };
> +       };
> +
> +       ath9k-leds {
> +               compatible = "gpio-leds";
> +
> +               wlan {
> +                       label = "ath9k-phy0";

Please use a proper tp-link:<colour>:<function> label as well.

> +                       gpios = <&ath9k 0 GPIO_ACTIVE_LOW>;
> +                       default-state = "off";
> +                       linux,default-trigger = "phy0tpt";
> +               };
> +       };
> +};
> +
> +&spi {
> +       status = "okay";
> +       num-cs = <1>;
> +
> +       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 {
> +                               reg = <0x0 0x20000>;
> +                               label = "u-boot";
> +                               read-only;
> +                       };
> +
> +                       firmware: partition@20000 {
> +                               reg = <0x20000 0x3d0000>;
> +                               label = "firmware";
> +                       };
> +
> +                       art: partition@3f0000 {
> +                               reg = <0x3f0000 0x10000>;
> +                               label = "art";
> +                               read-only;
> +                       };
> +               };
> +       };
> +};
> +
> +&pcie {
> +       status = "okay";
> +
> +       ath9k: wifi@0 {
> +               reg = <0x0000 0 0 0 0>;
> +               #gpio-cells = <2>;
> +               gpio-controller;
> +               qca,no-eeprom;
> +               mtd-mac-address = <&uboot 0x1fc00>;
> +       };
> +};
> +
> +&eth0 {
> +       status = "okay";
> +
> +       mtd-mac-address = <&uboot 0x1fc00>;
> +       mtd-mac-address-increment = <(-1)>;
> +       phy-handle = <&phy4>;
> +};
> +
> +&eth1 {
> +       status = "okay";
> +
> +       mtd-mac-address = <&uboot 0x1fc00>;
> +       mtd-mac-address-increment = <1>;
> +};
> +
> +&mdio0 {
> +       status = "okay";
> +
> +       phy4: ethernet-phy@4 {
> +               reg = <4>;
> +               phy-mode = "mii";
> +       };
> +};
> +
> +&gpio {
> +       status = "okay";
> +};
> +
> +&uart {
> +       status = "okay";
> +};
> diff --git a/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts b/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
> new file mode 100644
> index 0000000000..a5d577749e
> --- /dev/null
> +++ b/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
> @@ -0,0 +1,108 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +/dts-v1/;
> +
> +#include "ar7241_ap99.dtsi"
> +
> +/ {
> +       compatible = "tplink,tl-mr3220-v1", "qca,ar7241";
> +       model = "TP-Link TL-MR3220 v1";
> +
> +       usb-leds {
> +               compatible = "gpio-leds";
> +
> +               led3g {
> +                       label = "tp-link:green:3g";
> +                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
> +                       default-state = "off";
> +                       trigger-sources = <&hub_port>;
> +                       linux,default-trigger = "usbport";
> +               };
> +       };
> +
> +       ath9k-leds {
> +               compatible = "gpio-leds";
> +
> +               wlan {
> +                       label = "ath9k-phy0";
> +                       gpios = <&ath9k 1 GPIO_ACTIVE_LOW>;
> +                       default-state = "off";
> +                       linux,default-trigger = "phy0tpt";
> +               };
> +       };
> +
> +       reg_usb_vbus: reg_usb_vbus {
> +               compatible = "regulator-fixed";
> +               regulator-name = "usb_vbus";
> +               regulator-min-microvolt = <5000000>;
> +               regulator-max-microvolt = <5000000>;
> +               gpio = <&gpio 6 GPIO_ACTIVE_HIGH>;
> +               enable-active-high;
> +       };
> +};
> +
> +&spi {
> +       status = "okay";
> +       num-cs = <2>;
> +       // First value is default pin for flash, second value
> +       // (via comma) the GPIO number for sdcard. But we used
> +       // gpio 2 and it equivalent of internal CS0 line. And
> +       // we use it because we use common bus SPI0.0 for two
> +       // devices (default Low polarity chip-select, custom
> +       // High polarity chip-select).
> +       // In its core, this is a dummy, because internal CS0 line
> +       // is locked by HW and SPI driver, and we can not use it at all.
> +       // We use this to simply switch SPI bus to another device.
> +       cs-gpios = <0>, <&gpio 2 GPIO_ACTIVE_HIGH>;
> +
> +       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 {
> +                               reg = <0x0 0x20000>;
> +                               label = "u-boot";
> +                               read-only;
> +                       };
> +
> +                       firmware: partition@20000 {
> +                               reg = <0x20000 0x3d0000>;
> +                               label = "firmware";
> +                       };
> +
> +                       art: partition@3f0000 {
> +                               reg = <0x3f0000 0x10000>;
> +                               label = "art";
> +                               read-only;
> +                       };
> +               };
> +       };
> +
> +       sdcard@0 {
> +               compatible = "mmc-spi-slot";
> +               reg = <1>;
> +               spi-max-frequency = <25000000>;
> +               voltage-ranges = <3200 3400>;
> +       };
> +};
> +
> +&usb {
> +       vbus-supply = <&reg_usb_vbus>;
> +       status = "okay";
> +
> +       hub_port: port@1 {
> +               reg = <1>;
> +               #trigger-source-cells = <0>;
> +       };
> +};
> +
> +&usb_phy {
> +       status = "okay";
> +};
> diff --git a/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts b/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
> new file mode 100644
> index 0000000000..de2a237d06
> --- /dev/null
> +++ b/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
> @@ -0,0 +1,44 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +/dts-v1/;
> +
> +#include "ar7241_ap99.dtsi"
> +
> +/ {
> +       compatible = "tplink,tl-mr3420-v1", "qca,ar7241";
> +       model = "TP-Link TL-MR3420 v1";
> +
> +       usb-leds {
> +               compatible = "gpio-leds";
> +
> +               led3g {
> +                       label = "tp-link:green:3g";
> +                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
> +                       default-state = "off";
> +                       trigger-sources = <&hub_port>;
> +                       linux,default-trigger = "usbport";
> +               };
> +       };
> +
> +       reg_usb_vbus: reg_usb_vbus {
> +               compatible = "regulator-fixed";
> +               regulator-name = "usb_vbus";
> +               regulator-min-microvolt = <5000000>;
> +               regulator-max-microvolt = <5000000>;
> +               gpio = <&gpio 6 GPIO_ACTIVE_HIGH>;
> +               enable-active-high;
> +       };
> +};
> +
> +&usb {
> +       vbus-supply = <&reg_usb_vbus>;
> +       status = "okay";
> +
> +       hub_port: port@1 {
> +               reg = <1>;
> +               #trigger-source-cells = <0>;
> +       };
> +};
> +
> +&usb_phy {
> +       status = "okay";
> +};
> diff --git a/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts b/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts
> new file mode 100644
> index 0000000000..ecf0fb5577
> --- /dev/null
> +++ b/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts
> @@ -0,0 +1,12 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +/dts-v1/;
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +
> +#include "ar7241_ap99.dtsi"
> +
> +/ {
> +       compatible = "tplink,tl-wr841-v7", "qca,ar7241";
> +       model = "TP-LINK TL-WR841N/ND v7";
> +};
> \ No newline at end of file
> diff --git a/target/linux/ath79/image/tiny-tp-link.mk b/target/linux/ath79/image/tiny-tp-link.mk
> index 1dfed48dba..e4d07143ed 100644
> --- a/target/linux/ath79/image/tiny-tp-link.mk
> +++ b/target/linux/ath79/image/tiny-tp-link.mk
> @@ -39,3 +39,32 @@ define Device/tl-wr740n-v2
>    SUPPORTED_DEVICES := tplink,tl-wr740n-v2 tl-wr740n-v2
>  endef
>  TARGET_DEVICES += tl-wr740n-v2
> +
> +define Device/tl-wr841-v7
> +  $(Device/tplink-4m)
> +  ATH_SOC := ar7241
> +  DEVICE_TITLE := TP-LINK TL-WR841N/ND v7
> +  TPLINK_HWID := 0x08410007
> +  SUPPORTED_DEVICES := tplink,tl-wr841-v7 tl-wr841-v7
> +endef
> +TARGET_DEVICES += tl-wr841-v7
> +
> +define Device/tl-mr3220-v1
> +  $(Device/tplink-4m)
> +  ATH_SOC := ar7241
> +  DEVICE_TITLE := TP-Link TL-MR3220 v1
> +  TPLINK_HWID := 0x32200001
> +  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
> +  SUPPORTED_DEVICES := tplink,tl-mr3220-v1 tl-mr3220-v1
> +endef
> +TARGET_DEVICES += tl-mr3220-v1
> +
> +define Device/tl-mr3420-v1
> +  $(Device/tplink-4m)
> +  ATH_SOC := ar7241
> +  DEVICE_TITLE := TP-Link TL-MR3420 v1
> +  TPLINK_HWID := 0x34200001
> +  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
> +  SUPPORTED_DEVICES := tplink,tl-mr3420-v1 tl-mr3420-v1
> +endef
> +TARGET_DEVICES += tl-mr3420-v1
> --
> 2.17.1
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/listinfo/openwrt-devel
Смирнов Дмитрий June 27, 2018, 11:50 a.m. UTC | #2
Hello Mathias,

> Please use your full name here.
Fixed.

> To be honest, I don't like the ar7241_ap99.dtsi filename and I'm not
> sure if it really does make sense to use a dtsi here. For instance,
> only two of the boards have a usb led and your workaround is to move
> the usb led into an extra gpio led node. I prefer to have a complete
> gpio-leds in the dts files instead.

> The spi node from the dtsi is overwritten by one dts. In that case it
> shouldn't be added to dtsi. Instead each dts should have it's own spi
> node.

> While I love to remove redundant stuff, we need to keep an eye on
> maintainability/readability. I would like to ensure that we don't
> break something for the boards including the dtsif, we change
> something in the dtsi.

Sorry, but I had to use the dsti file (I renamed it to an readability name),
because it is suitable for three devices and to save space...
Like this https://patchwork.ozlabs.org/patch/928529/
(common dtsi for two devices)
By the way, what was the spi sdcard - its was my mod, and I deleted it
because in the original it is not present.
Sorry))))

> Full name here. as well
Fixed.

> ucidef_add_switch should already set the lan interface. A
> ucidef_set_interface_wan "eth1" should be sufficient here.
Fixed.
By the way, here is used eth0 as wan and eth1 as lan ports.
Otherwise it does not work...


> The pending https://github.com/openwrt/openwrt/pull/1091 is about to
> remove all memory nodes in favour of the automatic memory detection.
> Would you please test if the correct of amount of memory is detected
> without the node. If so, it can be removed.
Memory node was removed.

> Please remove the heartbeat trigger. Due to the led-status alias the
> led is used for status/diag signaling.
Fixed.

> Please use a proper tp-link:<colour>:<function> label as well.
Fixed.
Смирнов Дмитрий June 27, 2018, 11:52 a.m. UTC | #3
From ba345cc5fe00775b279eda5af998cfbdc88e458e Mon Sep 17 00:00:00 2001
From: Dmytro Smyrnov <dioptimizer@hotmail.com>
Date: Tue, 26 Jun 2018 17:01:47 +0300
Subject: [PATCH] ath79: Add support for TP-LINK TL-WR841N/ND
 v7,TL-MR3220v1,TL-MR3420v1

Its common AP99(AR7241) platform with following devices:
TP-Link TL-WR841N/ND v7 (SoC AR7241 / Wifi AR9287 / without USB)
TP-Link TL-MR3220 v1 (SoC AR7241 / Wifi AR9285 / USB support)
TP-Link TL-MR3420 v1 (SoC AR7241 / Wifi AR9287 / USB support)

Patches has been Fixed and Updated.

Signed-off-by: Dmytro Smyrnov <dioptimizer@hotmail.com>
---
 .../ath79/base-files/etc/board.d/02_network   |   7 +
 .../etc/hotplug.d/firmware/10-ath9k-eeprom    |   3 +
 target/linux/ath79/dts/ar7241_ap99.dtsi       | 144 +++++++++++++++
 .../linux/ath79/dts/ar7241_tl-mr3220-v1.dts   |  14 ++
 .../linux/ath79/dts/ar7241_tl-mr3420-v1.dts   |   9 +
 .../dts/ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi  | 166 ++++++++++++++++++
 target/linux/ath79/dts/ar7241_tl-wr841-v7.dts |  28 +++
 target/linux/ath79/image/tiny-tp-link.mk      |  29 +++
 8 files changed, 400 insertions(+)
 create mode 100644 target/linux/ath79/dts/ar7241_ap99.dtsi
 create mode 100644 target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
 create mode 100644 target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
 create mode 100644 target/linux/ath79/dts/ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi
 create mode 100644 target/linux/ath79/dts/ar7241_tl-wr841-v7.dts

diff --git a/target/linux/ath79/base-files/etc/board.d/02_network b/target/linux/ath79/base-files/etc/board.d/02_network
index e2a45b0526..cf0f406d25 100755
--- a/target/linux/ath79/base-files/etc/board.d/02_network
+++ b/target/linux/ath79/base-files/etc/board.d/02_network
@@ -98,6 +98,13 @@ ath79_setup_interfaces()
 		ucidef_add_switch "switch0" \
 			"0@eth0" "3:lan:1" "5:lan:2" "4:wan"
 		;;
+	"tplink,tl-wr841-v7"|\
+	"tplink,tl-mr3220-v1"|\
+	"tplink,tl-mr3420-v1")
+		ucidef_set_interfaces_wan "eth0"
+		ucidef_add_switch "switch0" \
+			"0@eth1" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1"
+		;;
 	*)
 		ucidef_set_interfaces_lan_wan "eth0" "eth1"
 		;;
diff --git a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
index 7023fa5e58..e5e2b1f8d3 100644
--- a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
+++ b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
@@ -54,6 +54,9 @@ case "$FIRMWARE" in
 	"tplink,tl-wdr4300")
 		ath9k_eeprom_extract "art" 20480 1088
 		;;
+	"tplink,tl-wr841-v7"|\
+	"tplink,tl-mr3220-v1"|\
+	"tplink,tl-mr3420-v1"|\
 	"netgear,wnr612-v2"|\
 	"on,n150r"|\
 	"tplink,tl-wr740n-v2"|\
diff --git a/target/linux/ath79/dts/ar7241_ap99.dtsi b/target/linux/ath79/dts/ar7241_ap99.dtsi
new file mode 100644
index 0000000000..d3834b4915
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_ap99.dtsi
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "ar7241.dtsi"
+
+/ {
+	aliases {
+		led-status = &led_system;
+	};
+
+	memory@0 {
+		device_type = "memory";
+		reg = <0x0 0x2000000>;
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		reset {
+			label = "reset";
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+
+		qss {
+			label = "qss";
+			linux,code = <KEY_WPS_BUTTON>;
+			gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		led_system: system {
+			label = "tp-link:green:system";
+			gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "heartbeat";
+		};
+
+		qss {
+			label = "tp-link:green:qss";
+			gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	ath9k-leds {
+		compatible = "gpio-leds";
+
+		wlan {
+			label = "ath9k-phy0";
+			gpios = <&ath9k 0 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+			linux,default-trigger = "phy0tpt";
+		};
+	};
+};
+
+&spi {
+	status = "okay";
+	num-cs = <1>;
+
+	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 {
+				reg = <0x0 0x20000>;
+				label = "u-boot";
+				read-only;
+			};
+
+			firmware: partition@20000 {
+				reg = <0x20000 0x3d0000>;
+				label = "firmware";
+			};
+
+			art: partition@3f0000 {
+				reg = <0x3f0000 0x10000>;
+				label = "art";
+				read-only;
+			};
+		};
+	};
+};
+
+&pcie {
+	status = "okay";
+
+	ath9k: wifi@0 {
+		reg = <0x0000 0 0 0 0>;
+		#gpio-cells = <2>;
+		gpio-controller;
+		qca,no-eeprom;
+		mtd-mac-address = <&uboot 0x1fc00>;
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	mtd-mac-address = <&uboot 0x1fc00>;
+	mtd-mac-address-increment = <(-1)>;
+	phy-handle = <&phy4>;
+};
+
+&eth1 {
+	status = "okay";
+
+	mtd-mac-address = <&uboot 0x1fc00>;
+	mtd-mac-address-increment = <1>;
+};
+
+&mdio0 {
+	status = "okay";
+
+	phy4: ethernet-phy@4 {
+		reg = <4>;
+		phy-mode = "mii";
+	};
+};
+
+&gpio {
+	status = "okay";
+};
+
+&uart {
+	status = "okay";
+};
diff --git a/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts b/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
new file mode 100644
index 0000000000..f365c3db56
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi"
+
+/ {
+	compatible = "tplink,tl-mr3220-v1", "qca,ar7241";
+	model = "TP-Link TL-MR3220 v1";
+};
+
+// Just overwrite the gpio led for other wifi chip.
+&wlan {
+	gpios = <&ath9k 1 GPIO_ACTIVE_LOW>;
+};
diff --git a/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts b/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
new file mode 100644
index 0000000000..ef2c2e3429
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi"
+
+/ {
+	compatible = "tplink,tl-mr3420-v1", "qca,ar7241";
+	model = "TP-Link TL-MR3420 v1";
+};
diff --git a/target/linux/ath79/dts/ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi b/target/linux/ath79/dts/ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi
new file mode 100644
index 0000000000..f38771e2e7
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi
@@ -0,0 +1,166 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "ar7241.dtsi"
+
+/ {
+	aliases {
+		led-status = &led_system;
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		reset {
+			label = "reset";
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+
+		qss {
+			label = "qss";
+			linux,code = <KEY_WPS_BUTTON>;
+			gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		led_system: system {
+			label = "tp-link:green:system";
+			gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
+		};
+
+		wlan: wlan {
+			label = "tp-link:green:wlan";
+			gpios = <&ath9k 0 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+			linux,default-trigger = "phy0tpt";
+		};
+
+		led3g: led3g {
+			label = "tp-link:green:3g";
+			gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+			trigger-sources = <&hub_port>;
+			linux,default-trigger = "usbport";
+		};
+
+		qss {
+			label = "tp-link:green:qss";
+			gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	reg_usb_vbus: reg_usb_vbus {
+		compatible = "regulator-fixed";
+		regulator-name = "usb_vbus";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio 6 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+	};
+};
+
+&spi {
+	status = "okay";
+	num-cs = <1>;
+
+	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 {
+				reg = <0x0 0x20000>;
+				label = "u-boot";
+				read-only;
+			};
+
+			firmware: partition@20000 {
+				reg = <0x20000 0x3d0000>;
+				label = "firmware";
+			};
+
+			art: partition@3f0000 {
+				reg = <0x3f0000 0x10000>;
+				label = "art";
+				read-only;
+			};
+		};
+	};
+};
+
+&pcie {
+	status = "okay";
+
+	ath9k: wifi@0 {
+		reg = <0x0000 0 0 0 0>;
+		#gpio-cells = <2>;
+		gpio-controller;
+		qca,no-eeprom;
+		mtd-mac-address = <&uboot 0x1fc00>;
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	phy-handle = <&phy4>;
+
+	mtd-mac-address = <&uboot 0x1fc00>;
+	mtd-mac-address-increment = <(-1)>;
+};
+
+&eth1 {
+	status = "okay";
+
+	mtd-mac-address = <&uboot 0x1fc00>;
+	mtd-mac-address-increment = <1>;
+};
+
+&mdio0 {
+	status = "okay";
+
+	phy4: ethernet-phy@4 {
+		reg = <4>;
+		phy-mode = "mii";
+	};
+};
+
+&gpio {
+	status = "okay";
+};
+
+&uart {
+	status = "okay";
+};
+
+&usb {
+	vbus-supply = <&reg_usb_vbus>;
+	status = "okay";
+
+	hub_port: port@1 {
+		reg = <1>;
+		#trigger-source-cells = <0>;
+	};
+};
+
+&usb_phy {
+	status = "okay";
+};
diff --git a/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts b/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts
new file mode 100644
index 0000000000..c6dd187b06
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "ar7241_tl-mr3x20-v1_tl-wr841-v7.dtsi"
+
+/ {
+	compatible = "tplink,tl-wr841-v7", "qca,ar7241";
+	model = "TP-LINK TL-WR841N/ND v7";
+};
+
+// Disabling everything that related with USB port,
+// since the device does not have it.
+
+&led3g {
+	status = "disabled";
+};
+
+&reg_usb_vbus {
+	status = "disabled";
+};
+
+&usb {
+	status = "disabled";
+};
+
+&usb_phy {
+	status = "disabled";
+};
diff --git a/target/linux/ath79/image/tiny-tp-link.mk b/target/linux/ath79/image/tiny-tp-link.mk
index 1dfed48dba..e4d07143ed 100644
--- a/target/linux/ath79/image/tiny-tp-link.mk
+++ b/target/linux/ath79/image/tiny-tp-link.mk
@@ -39,3 +39,32 @@ define Device/tl-wr740n-v2
   SUPPORTED_DEVICES := tplink,tl-wr740n-v2 tl-wr740n-v2
 endef
 TARGET_DEVICES += tl-wr740n-v2
+
+define Device/tl-wr841-v7
+  $(Device/tplink-4m)
+  ATH_SOC := ar7241
+  DEVICE_TITLE := TP-LINK TL-WR841N/ND v7
+  TPLINK_HWID := 0x08410007
+  SUPPORTED_DEVICES := tplink,tl-wr841-v7 tl-wr841-v7
+endef
+TARGET_DEVICES += tl-wr841-v7
+
+define Device/tl-mr3220-v1
+  $(Device/tplink-4m)
+  ATH_SOC := ar7241
+  DEVICE_TITLE := TP-Link TL-MR3220 v1
+  TPLINK_HWID := 0x32200001
+  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
+  SUPPORTED_DEVICES := tplink,tl-mr3220-v1 tl-mr3220-v1
+endef
+TARGET_DEVICES += tl-mr3220-v1
+
+define Device/tl-mr3420-v1
+  $(Device/tplink-4m)
+  ATH_SOC := ar7241
+  DEVICE_TITLE := TP-Link TL-MR3420 v1
+  TPLINK_HWID := 0x34200001
+  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
+  SUPPORTED_DEVICES := tplink,tl-mr3420-v1 tl-mr3420-v1
+endef
+TARGET_DEVICES += tl-mr3420-v1
diff mbox series

Patch

diff --git a/target/linux/ath79/base-files/etc/board.d/02_network b/target/linux/ath79/base-files/etc/board.d/02_network
index e2a45b0526..689ae82ffb 100755
--- a/target/linux/ath79/base-files/etc/board.d/02_network
+++ b/target/linux/ath79/base-files/etc/board.d/02_network
@@ -98,6 +98,13 @@  ath79_setup_interfaces()
 		ucidef_add_switch "switch0" \
 			"0@eth0" "3:lan:1" "5:lan:2" "4:wan"
 		;;
+	"tplink,tl-wr841-v7"|\
+	"tplink,tl-mr3220-v1"|\
+	"tplink,tl-mr3420-v1")
+		ucidef_set_interfaces_lan_wan "eth1.1" "eth0"
+		ucidef_add_switch "switch0" \
+			"0@eth1" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1"
+		;;
 	*)
 		ucidef_set_interfaces_lan_wan "eth0" "eth1"
 		;;
diff --git a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
index 7023fa5e58..e5e2b1f8d3 100644
--- a/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
+++ b/target/linux/ath79/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
@@ -54,6 +54,9 @@  case "$FIRMWARE" in
 	"tplink,tl-wdr4300")
 		ath9k_eeprom_extract "art" 20480 1088
 		;;
+	"tplink,tl-wr841-v7"|\
+	"tplink,tl-mr3220-v1"|\
+	"tplink,tl-mr3420-v1"|\
 	"netgear,wnr612-v2"|\
 	"on,n150r"|\
 	"tplink,tl-wr740n-v2"|\
diff --git a/target/linux/ath79/dts/ar7241_ap99.dtsi b/target/linux/ath79/dts/ar7241_ap99.dtsi
new file mode 100644
index 0000000000..d3834b4915
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_ap99.dtsi
@@ -0,0 +1,144 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "ar7241.dtsi"
+
+/ {
+	aliases {
+		led-status = &led_system;
+	};
+
+	memory@0 {
+		device_type = "memory";
+		reg = <0x0 0x2000000>;
+	};
+
+	gpio-keys-polled {
+		compatible = "gpio-keys-polled";
+		#address-cells = <1>;
+		#size-cells = <0>;
+		poll-interval = <20>;
+
+		reset {
+			label = "reset";
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 11 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+
+		qss {
+			label = "qss";
+			linux,code = <KEY_WPS_BUTTON>;
+			gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		led_system: system {
+			label = "tp-link:green:system";
+			gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "heartbeat";
+		};
+
+		qss {
+			label = "tp-link:green:qss";
+			gpios = <&gpio 0 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	ath9k-leds {
+		compatible = "gpio-leds";
+
+		wlan {
+			label = "ath9k-phy0";
+			gpios = <&ath9k 0 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+			linux,default-trigger = "phy0tpt";
+		};
+	};
+};
+
+&spi {
+	status = "okay";
+	num-cs = <1>;
+
+	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 {
+				reg = <0x0 0x20000>;
+				label = "u-boot";
+				read-only;
+			};
+
+			firmware: partition@20000 {
+				reg = <0x20000 0x3d0000>;
+				label = "firmware";
+			};
+
+			art: partition@3f0000 {
+				reg = <0x3f0000 0x10000>;
+				label = "art";
+				read-only;
+			};
+		};
+	};
+};
+
+&pcie {
+	status = "okay";
+
+	ath9k: wifi@0 {
+		reg = <0x0000 0 0 0 0>;
+		#gpio-cells = <2>;
+		gpio-controller;
+		qca,no-eeprom;
+		mtd-mac-address = <&uboot 0x1fc00>;
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	mtd-mac-address = <&uboot 0x1fc00>;
+	mtd-mac-address-increment = <(-1)>;
+	phy-handle = <&phy4>;
+};
+
+&eth1 {
+	status = "okay";
+
+	mtd-mac-address = <&uboot 0x1fc00>;
+	mtd-mac-address-increment = <1>;
+};
+
+&mdio0 {
+	status = "okay";
+
+	phy4: ethernet-phy@4 {
+		reg = <4>;
+		phy-mode = "mii";
+	};
+};
+
+&gpio {
+	status = "okay";
+};
+
+&uart {
+	status = "okay";
+};
diff --git a/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts b/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
new file mode 100644
index 0000000000..a5d577749e
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_tl-mr3220-v1.dts
@@ -0,0 +1,108 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "ar7241_ap99.dtsi"
+
+/ {
+	compatible = "tplink,tl-mr3220-v1", "qca,ar7241";
+	model = "TP-Link TL-MR3220 v1";
+
+	usb-leds {
+		compatible = "gpio-leds";
+
+		led3g {
+			label = "tp-link:green:3g";
+			gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+			trigger-sources = <&hub_port>;
+			linux,default-trigger = "usbport";
+		};
+	};
+
+	ath9k-leds {
+		compatible = "gpio-leds";
+
+		wlan {
+			label = "ath9k-phy0";
+			gpios = <&ath9k 1 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+			linux,default-trigger = "phy0tpt";
+		};
+	};
+
+	reg_usb_vbus: reg_usb_vbus {
+		compatible = "regulator-fixed";
+		regulator-name = "usb_vbus";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio 6 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+	};
+};
+
+&spi {
+	status = "okay";
+	num-cs = <2>;
+	// First value is default pin for flash, second value
+	// (via comma) the GPIO number for sdcard. But we used
+	// gpio 2 and it equivalent of internal CS0 line. And
+	// we use it because we use common bus SPI0.0 for two
+	// devices (default Low polarity chip-select, custom
+	// High polarity chip-select).
+	// In its core, this is a dummy, because internal CS0 line
+	// is locked by HW and SPI driver, and we can not use it at all.
+	// We use this to simply switch SPI bus to another device.
+	cs-gpios = <0>, <&gpio 2 GPIO_ACTIVE_HIGH>;
+
+	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 {
+				reg = <0x0 0x20000>;
+				label = "u-boot";
+				read-only;
+			};
+
+			firmware: partition@20000 {
+				reg = <0x20000 0x3d0000>;
+				label = "firmware";
+			};
+
+			art: partition@3f0000 {
+				reg = <0x3f0000 0x10000>;
+				label = "art";
+				read-only;
+			};
+		};
+	};
+
+	sdcard@0 {
+		compatible = "mmc-spi-slot";
+		reg = <1>;
+		spi-max-frequency = <25000000>;
+		voltage-ranges = <3200 3400>;
+	};
+};
+
+&usb {
+	vbus-supply = <&reg_usb_vbus>;
+	status = "okay";
+
+	hub_port: port@1 {
+		reg = <1>;
+		#trigger-source-cells = <0>;
+	};
+};
+
+&usb_phy {
+	status = "okay";
+};
diff --git a/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts b/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
new file mode 100644
index 0000000000..de2a237d06
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_tl-mr3420-v1.dts
@@ -0,0 +1,44 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include "ar7241_ap99.dtsi"
+
+/ {
+	compatible = "tplink,tl-mr3420-v1", "qca,ar7241";
+	model = "TP-Link TL-MR3420 v1";
+
+	usb-leds {
+		compatible = "gpio-leds";
+
+		led3g {
+			label = "tp-link:green:3g";
+			gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
+			default-state = "off";
+			trigger-sources = <&hub_port>;
+			linux,default-trigger = "usbport";
+		};
+	};
+
+	reg_usb_vbus: reg_usb_vbus {
+		compatible = "regulator-fixed";
+		regulator-name = "usb_vbus";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio 6 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+	};
+};
+
+&usb {
+	vbus-supply = <&reg_usb_vbus>;
+	status = "okay";
+
+	hub_port: port@1 {
+		reg = <1>;
+		#trigger-source-cells = <0>;
+	};
+};
+
+&usb_phy {
+	status = "okay";
+};
diff --git a/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts b/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts
new file mode 100644
index 0000000000..ecf0fb5577
--- /dev/null
+++ b/target/linux/ath79/dts/ar7241_tl-wr841-v7.dts
@@ -0,0 +1,12 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "ar7241_ap99.dtsi"
+
+/ {
+	compatible = "tplink,tl-wr841-v7", "qca,ar7241";
+	model = "TP-LINK TL-WR841N/ND v7";
+};
\ No newline at end of file
diff --git a/target/linux/ath79/image/tiny-tp-link.mk b/target/linux/ath79/image/tiny-tp-link.mk
index 1dfed48dba..e4d07143ed 100644
--- a/target/linux/ath79/image/tiny-tp-link.mk
+++ b/target/linux/ath79/image/tiny-tp-link.mk
@@ -39,3 +39,32 @@  define Device/tl-wr740n-v2
   SUPPORTED_DEVICES := tplink,tl-wr740n-v2 tl-wr740n-v2
 endef
 TARGET_DEVICES += tl-wr740n-v2
+
+define Device/tl-wr841-v7
+  $(Device/tplink-4m)
+  ATH_SOC := ar7241
+  DEVICE_TITLE := TP-LINK TL-WR841N/ND v7
+  TPLINK_HWID := 0x08410007
+  SUPPORTED_DEVICES := tplink,tl-wr841-v7 tl-wr841-v7
+endef
+TARGET_DEVICES += tl-wr841-v7
+
+define Device/tl-mr3220-v1
+  $(Device/tplink-4m)
+  ATH_SOC := ar7241
+  DEVICE_TITLE := TP-Link TL-MR3220 v1
+  TPLINK_HWID := 0x32200001
+  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
+  SUPPORTED_DEVICES := tplink,tl-mr3220-v1 tl-mr3220-v1
+endef
+TARGET_DEVICES += tl-mr3220-v1
+
+define Device/tl-mr3420-v1
+  $(Device/tplink-4m)
+  ATH_SOC := ar7241
+  DEVICE_TITLE := TP-Link TL-MR3420 v1
+  TPLINK_HWID := 0x34200001
+  DEVICE_PACKAGES := kmod-usb-core kmod-usb2 kmod-usb-ledtrig-usbport
+  SUPPORTED_DEVICES := tplink,tl-mr3420-v1 tl-mr3420-v1
+endef
+TARGET_DEVICES += tl-mr3420-v1