diff mbox series

[V2] ipq40xx: add support for GL.iNet GL-B2200

Message ID 20211122183602.626886-1-mrkiko.rs@gmail.com
State Superseded
Headers show
Series [V2] ipq40xx: add support for GL.iNet GL-B2200 | expand

Commit Message

Enrico Mioso Nov. 22, 2021, 6:36 p.m. UTC
From: TruongSinh Tran-Nguyen <i@truongsinh.pro>

This patch adds supports for the GL-B2200 router.

Specifications:
  - SOC: Qualcomm IPQ4019 ARM Quad-Core
  - RAM: 512 MiB
  - Flash: 16 MiB NOR - SPI0
  - EMMC: 8GB EMMC
  - ETH: Qualcomm QCA8075
  - WLAN1: Qualcomm Atheros QCA4019 2.4GHz 802.11b/g/n 2x2
  - WLAN2: Qualcomm Atheros QCA4019 5GHz 802.11n/ac W2 2x2
  - WLAN3: Qualcomm Atheros QCA9886 5GHz 802.11n/ac W2 2x2
  - INPUT: Reset, WPS
  - LED: Power, Internet
  - UART1: On board pin header near to LED (3.3V, TX, RX, GND), 3.3V without pin - 115200 8N1
  - UART2: On board with BLE module
  - SPI1: On board socket for Zigbee module

Update firmware instructions:
Please update the firmware via U-Boot web UI (by default at 192.168.1.1, following instructions found at
https://docs.gl-inet.com/en/3/troubleshooting/debrick/).
Normal sysupgrade, either via CLI or LuCI, is not possible from stock firmware.

What's working:
- WiFi 2G, 5G
- WPA2/WPA3

Not tested:
- Bluetooth LE/Zigbee

Credits goes to the original authors of this patch.

V1->V2:
- updates *arm-boot-add-dts-files.patch correctly
- add uboot-envtools support

Signed-off-by: TruongSinh Tran-Nguyen <i@truongsinh.pro>
[fix tab and trailing space, document what's working and what's not]
Signed-off-by: Enrico Mioso <mrkiko.rs@gmail.com>
[rebase on top of master, address remaining comments]
Signed-off-by: Li Zhang <li.zhang@gl-inet.com>
---
 package/boot/uboot-envtools/files/ipq40xx     |   1 +
 package/firmware/ipq-wifi/Makefile            |   2 +
 .../ipq-wifi/board-glinet_gl-b2200.qca4019    | Bin 0 -> 24308 bytes
 .../ipq-wifi/board-glinet_gl-b2200.qca9888    | Bin 0 -> 12200 bytes
 target/linux/ipq40xx/Makefile                 |   2 +-
 .../ipq40xx/base-files/etc/board.d/02_network |   5 +
 .../etc/hotplug.d/firmware/11-ath10k-caldata  |   3 +
 .../arm/boot/dts/qcom-ipq4019-gl-b2200.dts    | 364 ++++++++++++++++++
 target/linux/ipq40xx/image/generic.mk         |  28 ++
 .../901-arm-boot-add-dts-files.patch          |   3 +-
 .../901-arm-boot-add-dts-files.patch          |   3 +-
 11 files changed, 408 insertions(+), 3 deletions(-)
 create mode 100644 package/firmware/ipq-wifi/board-glinet_gl-b2200.qca4019
 create mode 100644 package/firmware/ipq-wifi/board-glinet_gl-b2200.qca9888
 create mode 100644 target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts

Comments

Enrico Mioso Nov. 22, 2021, 7:10 p.m. UTC | #1
Note:
The patch breakage that caused me to send V2 in the first place is my own fault, original PR doesn't have this issue. Sorry, forgot to mention it.


On Mon, 22 Nov 2021, Enrico Mioso wrote:

> Date: Mon, 22 Nov 2021 19:36:02
> From: Enrico Mioso <mrkiko.rs@gmail.com>
> To: openwrt-devel@lists.openwrt.org
> Cc: TruongSinh Tran-Nguyen <i@truongsinh.pro>,
>     Enrico Mioso <mrkiko.rs@gmail.com>, Li Zhang <li.zhang@gl-inet.com>
> Subject: [PATCH V2] ipq40xx: add support for GL.iNet GL-B2200
> 
> From: TruongSinh Tran-Nguyen <i@truongsinh.pro>
>
> This patch adds supports for the GL-B2200 router.
>
> Specifications:
>  - SOC: Qualcomm IPQ4019 ARM Quad-Core
>  - RAM: 512 MiB
>  - Flash: 16 MiB NOR - SPI0
>  - EMMC: 8GB EMMC
>  - ETH: Qualcomm QCA8075
>  - WLAN1: Qualcomm Atheros QCA4019 2.4GHz 802.11b/g/n 2x2
>  - WLAN2: Qualcomm Atheros QCA4019 5GHz 802.11n/ac W2 2x2
>  - WLAN3: Qualcomm Atheros QCA9886 5GHz 802.11n/ac W2 2x2
>  - INPUT: Reset, WPS
>  - LED: Power, Internet
>  - UART1: On board pin header near to LED (3.3V, TX, RX, GND), 3.3V without pin - 115200 8N1
>  - UART2: On board with BLE module
>  - SPI1: On board socket for Zigbee module
>
> Update firmware instructions:
> Please update the firmware via U-Boot web UI (by default at 192.168.1.1, following instructions found at
> https://docs.gl-inet.com/en/3/troubleshooting/debrick/).
> Normal sysupgrade, either via CLI or LuCI, is not possible from stock firmware.
>
> What's working:
> - WiFi 2G, 5G
> - WPA2/WPA3
>
> Not tested:
> - Bluetooth LE/Zigbee
>
> Credits goes to the original authors of this patch.
>
> V1->V2:
> - updates *arm-boot-add-dts-files.patch correctly
> - add uboot-envtools support
>
> Signed-off-by: TruongSinh Tran-Nguyen <i@truongsinh.pro>
> [fix tab and trailing space, document what's working and what's not]
> Signed-off-by: Enrico Mioso <mrkiko.rs@gmail.com>
> [rebase on top of master, address remaining comments]
> Signed-off-by: Li Zhang <li.zhang@gl-inet.com>
> ---
> package/boot/uboot-envtools/files/ipq40xx     |   1 +
> package/firmware/ipq-wifi/Makefile            |   2 +
> .../ipq-wifi/board-glinet_gl-b2200.qca4019    | Bin 0 -> 24308 bytes
> .../ipq-wifi/board-glinet_gl-b2200.qca9888    | Bin 0 -> 12200 bytes
> target/linux/ipq40xx/Makefile                 |   2 +-
> .../ipq40xx/base-files/etc/board.d/02_network |   5 +
> .../etc/hotplug.d/firmware/11-ath10k-caldata  |   3 +
> .../arm/boot/dts/qcom-ipq4019-gl-b2200.dts    | 364 ++++++++++++++++++
> target/linux/ipq40xx/image/generic.mk         |  28 ++
> .../901-arm-boot-add-dts-files.patch          |   3 +-
> .../901-arm-boot-add-dts-files.patch          |   3 +-
> 11 files changed, 408 insertions(+), 3 deletions(-)
> create mode 100644 package/firmware/ipq-wifi/board-glinet_gl-b2200.qca4019
> create mode 100644 package/firmware/ipq-wifi/board-glinet_gl-b2200.qca9888
> create mode 100644 target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts
>
> diff --git a/package/boot/uboot-envtools/files/ipq40xx b/package/boot/uboot-envtools/files/ipq40xx
> index 1462aa991d..9a71a622f7 100644
> --- a/package/boot/uboot-envtools/files/ipq40xx
> +++ b/package/boot/uboot-envtools/files/ipq40xx
> @@ -35,6 +35,7 @@ devolo,magic-2-wifi-next|\
> edgecore,ecw5211|\
> glinet,gl-ap1300|\
> glinet,gl-b1300|\
> +glinet,gl-b2200|\
> luma,wrtq-329acn|\
> netgear,wac510|\
> openmesh,a42|\
> diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
> index da0949b887..1467b032da 100644
> --- a/package/firmware/ipq-wifi/Makefile
> +++ b/package/firmware/ipq-wifi/Makefile
> @@ -39,6 +39,7 @@ ALLWIFIBOARDS:= \
> 	engenius_emr3500 \
> 	ezviz_cs-w3-wd1200g-eup \
> 	glinet_gl-ap1300 \
> +	glinet_gl-b2200 \
> 	glinet_gl-s1300 \
> 	linksys_ea8300 \
> 	linksys_mr8300-v0 \
> @@ -125,6 +126,7 @@ $(eval $(call generate-ipq-wifi-package,engenius_emd1,EnGenius EMD1))
> $(eval $(call generate-ipq-wifi-package,engenius_emr3500,EnGenius EMR3500))
> $(eval $(call generate-ipq-wifi-package,ezviz_cs-w3-wd1200g-eup,EZVIZ CS-W3-WD1200G EUP))
> $(eval $(call generate-ipq-wifi-package,glinet_gl-ap1300,GL.iNet GL-AP1300))
> +$(eval $(call generate-ipq-wifi-package,glinet_gl-b2200,GL.iNet GL-B2200))
> $(eval $(call generate-ipq-wifi-package,glinet_gl-s1300,GL.iNet GL-S1300))
> $(eval $(call generate-ipq-wifi-package,linksys_ea8300,Linksys EA8300))
> $(eval $(call generate-ipq-wifi-package,linksys_mr8300-v0,Linksys MR8300))
> diff --git a/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca4019 b/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca4019
> new file mode 100644
> index 0000000000000000000000000000000000000000..ac1850160aead29cee0fb96664272b8a620a4e6a
> GIT binary patch
> literal 24308
> zcmeHPdr(tX8b1jj>SE!BfCzXAAv{7MK%g2V@)iT6U{R3(i$E30tx+C^hoKAYC{l=s
> zKrI*|Xc?48Q$)ta7qM7dJEP40v48CBA8ltJ-I;aQcC<U~%<kfzdy@+xB$^0pdE76Y
> zbG~!#_nq^d-#tn0&G~WPN{9=N+an4KO%0AukIP5|GMNlODGtGN0JgwXC@<e$P+S;P
> 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
>
> literal 0
> HcmV?d00001
>
> diff --git a/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca9888 b/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca9888
> new file mode 100644
> index 0000000000000000000000000000000000000000..4f0a521f35935d4be1fb01b66dd9954a48eade52
> GIT binary patch
> literal 12200
> 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
>
> literal 0
> HcmV?d00001
>
> diff --git a/target/linux/ipq40xx/Makefile b/target/linux/ipq40xx/Makefile
> index fb003243cc..a3270379d4 100644
> --- a/target/linux/ipq40xx/Makefile
> +++ b/target/linux/ipq40xx/Makefile
> @@ -3,7 +3,7 @@ include $(TOPDIR)/rules.mk
> ARCH:=arm
> BOARD:=ipq40xx
> BOARDNAME:=Qualcomm Atheros IPQ40XX
> -FEATURES:=squashfs fpu ramdisk nand
> +FEATURES:=squashfs fpu ramdisk nand boot-part rootfs-part
> CPU_TYPE:=cortex-a7
> CPU_SUBTYPE:=neon-vfpv4
> SUBTARGETS:=generic mikrotik
> diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network
> index 5d123109a2..c674186b44 100644
> --- a/target/linux/ipq40xx/base-files/etc/board.d/02_network
> +++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network
> @@ -103,6 +103,11 @@ ipq40xx_setup_interfaces()
> 		ucidef_add_switch "switch0" \
> 			"0u@eth0" "3:lan" "4:lan"
> 		;;
> +	glinet,gl-b2200)
> +		ucidef_set_interfaces_lan_wan "eth0" "eth1"
> +		ucidef_add_switch "switch0" \
> +			"0u@eth0" "1:lan" "2:lan" "3:lan" "5:lan" "0u@eth1" "4:wan"
> +		;;
> 	mobipromo,cm520-79f)
> 		ucidef_add_switch "switch0" \
> 			"0u@eth0" "3:lan:2" "4:lan:1"
> diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> index 35862ce3bc..6899723a74 100644
> --- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> @@ -35,6 +35,7 @@ case "$FIRMWARE" in
> 		caldata_extract "ART" 0x9000 0x2f20
> 		ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 0x32)
> 		;;
> +	glinet,gl-b2200 |\
> 	engenius,eap2200 |\
> 	openmesh,a62 |\
> 	plasmacloud,pa2200)
> @@ -64,6 +65,7 @@ case "$FIRMWARE" in
> 	ezviz,cs-w3-wd1200g-eup |\
> 	glinet,gl-ap1300 |\
> 	glinet,gl-b1300 |\
> +	glinet,gl-b2200 |\
> 	glinet,gl-s1300 |\
> 	linksys,ea6350v3 |\
> 	mobipromo,cm520-79f |\
> @@ -186,6 +188,7 @@ case "$FIRMWARE" in
> 	ezviz,cs-w3-wd1200g-eup |\
> 	glinet,gl-ap1300 |\
> 	glinet,gl-b1300 |\
> +	glinet,gl-b2200 |\
> 	glinet,gl-s1300 |\
> 	linksys,ea6350v3 |\
> 	mobipromo,cm520-79f |\
> diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts
> new file mode 100644
> index 0000000000..6b84f78dc4
> --- /dev/null
> +++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts
> @@ -0,0 +1,364 @@
> +// SPDX-License-Identifier: GPL-2.0-only OR MIT
> +
> +#include "qcom-ipq4019.dtsi"
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +#include <dt-bindings/soc/qcom,tcsr.h>
> +
> +/ {
> +	model = "GL.iNet GL-B2200";
> +	compatible = "glinet,gl-b2200", "qcom,ipq4019";
> +
> +	memory {
> +		device_type = "memory";
> +		reg = <0x80000000 0x10000000>;
> +	};
> +
> +	chosen {
> +		bootargs-append = " root=/dev/mmcblk0p2 rw rootwait clk_ignore_unused";
> +	};
> +
> +	soc {
> +		rng@22000 {
> +			status = "okay";
> +		};
> +
> +		mdio@90000 {
> +			status = "okay";
> +		};
> +
> +		ess-psgmii@98000 {
> +			status = "okay";
> +		};
> +
> +		tcsr@1949000 {
> +			compatible = "qcom,tcsr";
> +			reg = <0x1949000 0x100>;
> +			qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
> +		};
> +
> +		tcsr@194b000 {
> +			/* select hostmode */
> +			compatible = "qcom,tcsr";
> +			reg = <0x194b000 0x100>;
> +			qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
> +			status = "okay";
> +		};
> +
> +		ess_tcsr@1953000 {
> +			compatible = "qcom,tcsr";
> +			reg = <0x1953000 0x1000>;
> +			qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
> +		};
> +
> +		tcsr@1957000 {
> +			compatible = "qcom,tcsr";
> +			reg = <0x1957000 0x100>;
> +			qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
> +		};
> +
> +		crypto@8e3a000 {
> +			status = "okay";
> +		};
> +
> +		ess-switch@c000000 {
> +			status = "okay";
> +			switch_lan_bmp = <0x2e>;
> +			switch_wan_bmp = <0x10>;
> +		};
> +
> +		edma@c080000 {
> +			status = "okay";
> +		};
> +	};
> +
> +	keys {
> +		compatible = "gpio-keys";
> +
> +		wps {
> +			label = "wps";
> +			gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_WPS_BUTTON>;
> +			linux,input-type = <1>;
> +		};
> +
> +		reset {
> +			label = "reset";
> +			gpios = <&tlmm 43 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_RESTART>;
> +			linux,input-type = <1>;
> +		};
> +	};
> +
> +	leds {
> +		compatible = "gpio-leds";
> +
> +		power_blue {
> +			label = "blue:power";
> +			gpios = <&tlmm 57 GPIO_ACTIVE_HIGH>;
> +			default-state = "on";
> +		};
> +		internet_blue {
> +			label = "blue:internet";
> +			gpios = <&tlmm 60 GPIO_ACTIVE_HIGH>;
> +		};
> +		power_white {
> +			label = "white:power";
> +			gpios = <&tlmm 61 GPIO_ACTIVE_LOW>;
> +		};
> +		internet_white {
> +			label = "white:internet";
> +			gpios = <&tlmm 66 GPIO_ACTIVE_LOW>;
> +		};
> +	};
> +};
> +
> +&gmac1 {
> +	qcom,phy_mdio_addr = <3>;
> +	qcom,poll_required = <1>;
> +	qcom,forced_speed = <1000>;
> +	qcom,forced_duplex = <1>;
> +	vlan_tag = <2 0x10>;
> +};
> +
> +&gmac0 {
> +	vlan_tag = <1 0x2e>;
> +};
> +
> +&vqmmc {
> +	status = "okay";
> +};
> +
> +&sdhci {
> +	status = "okay";
> +	pinctrl-0 = <&sd_pins>;
> +	pinctrl-names = "default";
> +	cd-gpios = <&tlmm 3 GPIO_ACTIVE_LOW>;
> +	vqmmc-supply = <&vqmmc>;
> +};
> +
> +&blsp_dma {
> +	status = "okay";
> +};
> +
> +&cryptobam {
> +	status = "okay";
> +};
> +
> +&blsp1_spi1 {
> +	pinctrl-0 = <&spi_0_pins>;
> +	pinctrl-names = "default";
> +	status = "okay";
> +	cs-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>;
> +
> +	flash@0 {
> +		compatible = "jedec,spi-nor";
> +		reg = <0>;
> +		spi-max-frequency = <24000000>;
> +
> +		partitions {
> +			compatible = "fixed-partitions";
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +
> +			partition@0 {
> +				label = "SBL1";
> +				reg = <0x0 0x40000>;
> +				read-only;
> +			};
> +
> +			partition@40000 {
> +				label = "MIBIB";
> +				reg = <0x40000 0x20000>;
> +				read-only;
> +			};
> +
> +			partition@60000 {
> +				label = "QSEE";
> +				reg = <0x60000 0x60000>;
> +				read-only;
> +			};
> +
> +			partition@c0000 {
> +				label = "CDT";
> +				reg = <0xc0000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition@d0000 {
> +				label = "DDRPARAMS";
> +				reg = <0xd0000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition@e0000 {
> +				label = "APPSBLENV";
> +				reg = <0xe0000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition@f0000 {
> +				label = "APPSBL";
> +				reg = <0xf0000 0x80000>;
> +				read-only;
> +			};
> +
> +			partition@170000 {
> +				label = "ART";
> +				reg = <0x170000 0x10000>;
> +				read-only;
> +			};
> +		};
> +	};
> +};
> +
> +&blsp1_spi2 {
> +	pinctrl-0 = <&spi_1_pins>;
> +	pinctrl-names = "default";
> +	status = "okay";
> +
> +	spidev1: spi@0 {
> +		compatible = "siliconlabs,si3210";
> +		reg = <0>;
> +		spi-max-frequency = <24000000>;
> +	};
> +};
> +
> +&blsp1_uart1 {
> +	pinctrl-0 = <&serial_pins>;
> +	pinctrl-names = "default";
> +	status = "okay";
> +};
> +
> +&blsp1_uart2 {
> +	pinctrl-0 = <&serial_1_pins>;
> +	pinctrl-names = "default";
> +	status = "okay";
> +};
> +
> +&tlmm {
> +	serial_pins: serial_pinmux {
> +		mux {
> +			pins = "gpio16", "gpio17";
> +			function = "blsp_uart0";
> +			bias-disable;
> +		};
> +	};
> +
> +	serial_1_pins: serial1_pinmux {
> +		mux {
> +			pins = "gpio8", "gpio9",
> +				"gpio10", "gpio11";
> +			function = "blsp_uart1";
> +			bias-disable;
> +		};
> +	};
> +
> +	spi_0_pins: spi_0_pinmux {
> +		pinmux {
> +			function = "blsp_spi0";
> +			pins = "gpio13", "gpio14", "gpio15";
> +		};
> +		pinmux_cs {
> +			function = "gpio";
> +			pins = "gpio12";
> +		};
> +		pinconf {
> +			pins = "gpio13", "gpio14", "gpio15";
> +			drive-strength = <12>;
> +			bias-disable;
> +		};
> +		pinconf_cs {
> +			pins = "gpio12";
> +			drive-strength = <2>;
> +			bias-disable;
> +			output-high;
> +		};
> +	};
> +
> +	spi_1_pins: spi_1_pinmux {
> +		mux {
> +			pins = "gpio44", "gpio46", "gpio47";
> +			function = "blsp_spi1";
> +			bias-disable;
> +		};
> +		cs {
> +			pins = "gpio45";
> +			function = "gpio";
> +			bias-pull-up;
> +		};
> +		reset {
> +			pins = "gpio43";
> +			function = "gpio";
> +			output-high;
> +		};
> +		mux_2 {
> +			pins = "gpio35";
> +			function = "gpio";
> +			output-high;
> +		};
> +		host_int {
> +			pins = "gpio2";
> +			function = "gpio";
> +			input;
> +		};
> +		wake {
> +			pins = "gpio48";
> +			function = "gpio";
> +			output-high;
> +		};
> +	};
> +
> +	sd_pins: sd_pins {
> +		pinmux {
> +			function = "sdio";
> +			pins = "gpio23", "gpio24", "gpio25", "gpio26",
> +				"gpio29", "gpio30", "gpio31", "gpio32";
> +			drive-strength = <10>;
> +		};
> +
> +		pinmux_sd_clk {
> +			function = "sdio";
> +			pins = "gpio27";
> +			drive-strength = <16>;
> +		};
> +
> +		pinmux_sd7 {
> +			function = "sdio";
> +			pins = "gpio28";
> +			drive-strength = <10>;
> +			bias-disable;
> +		};
> +	};
> +
> +};
> +
> +&pcie0 {
> +	status = "okay";
> +	perst-gpio = <&tlmm 38 GPIO_ACTIVE_LOW>;
> +	wake-gpio = <&tlmm 50 GPIO_ACTIVE_LOW>;
> +
> +	bridge@0,0 {
> +		reg = <0x00000000 0 0 0 0>;
> +		#address-cells = <3>;
> +		#size-cells = <2>;
> +		ranges;
> +
> +		wifi2: wifi@1,0 {
> +			status = "okay";
> +			compatible = "qcom,ath10k";
> +			reg = <0x00010000 0 0 0 0>;
> +			qcom,ath10k-calibration-variant = "GL-B2200";
> +		};
> +	};
> +};
> +
> +&wifi0 {
> +	status = "okay";
> +	qcom,ath10k-calibration-variant = "GL-B2200";
> +};
> +
> +&wifi1 {
> +	status = "okay";
> +	qcom,ath10k-calibration-variant = "GL-B2200";
> +};
> diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk
> index c24eb28523..1184b7d533 100644
> --- a/target/linux/ipq40xx/image/generic.mk
> +++ b/target/linux/ipq40xx/image/generic.mk
> @@ -81,6 +81,17 @@ define Build/qsdk-ipq-factory-nand-askey
> 	@mv $@.new $@
> endef
>
> +define Build/qsdk-ipq-app-gpt
> +	cp $@ $@.tmp 2>/dev/null || true
> +	ptgen -g -o $@.tmp -a 1 -l 1024 \
> +			-t 0x2e -N 0:HLOS -r -p 32M \
> +			-t 0x83 -N rootfs -r -p 128M \
> +				-N rootfs_data -p 512M \
> +				-N user_data -p 6766M
> +	cat $@.tmp >> $@
> +	rm $@.tmp
> +endef
> +
> define Build/SenaoFW
> 	-$(STAGING_DIR_HOST)/bin/mksenaofw \
> 		-n $(BOARD_NAME) -r $(VENDOR_ID) -p $(1) \
> @@ -509,6 +520,23 @@ define Device/glinet_gl-b1300
> endef
> TARGET_DEVICES += glinet_gl-b1300
>
> +define Device/glinet_gl-b2200
> +	$(call Device/FitzImage)
> +	DEVICE_VENDOR := GL.iNet
> +	DEVICE_MODEL := GL-B2200
> +	SOC := qcom-ipq4019
> +	DEVICE_DTS_CONFIG := config@ap.dk04.1-c3
> +	KERNEL_INITRAMFS_SUFFIX := -recovery.itb
> +	IMAGES := sdcard.img.gz
> +	IMAGE/sdcard.img.gz := qsdk-ipq-app-gpt |\
> +		pad-to 1024k | append-kernel |\
> +		pad-to 33792k | append-rootfs |\
> +		append-metadata | gzip
> +	DEVICE_PACKAGES := ath10k-firmware-qca9888-ct ipq-wifi-glinet_gl-b2200 \
> +		kmod-fs-ext4 kmod-mmc kmod-spi-dev mkf2fs e2fsprogs kmod-fs-f2fs
> +endef
> +TARGET_DEVICES += glinet_gl-b2200
> +
> define Device/glinet_gl-s1300
> 	$(call Device/FitzImage)
> 	DEVICE_VENDOR := GL.iNet
> diff --git a/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch b/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch
> index 436f5a74f5..030e0d6b45 100644
> --- a/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch
> +++ b/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch
> @@ -10,7 +10,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
>
> --- a/arch/arm/boot/dts/Makefile
> +++ b/arch/arm/boot/dts/Makefile
> -@@ -902,11 +902,67 @@ dtb-$(CONFIG_ARCH_QCOM) += \
> +@@ -902,11 +902,68 @@ dtb-$(CONFIG_ARCH_QCOM) += \
>  	qcom-apq8074-dragonboard.dtb \
>  	qcom-apq8084-ifc6540.dtb \
>  	qcom-apq8084-mtp.dtb \
> @@ -73,6 +73,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
> +	qcom-ipq4029-ap-303h.dtb \
> +	qcom-ipq4029-ap-365.dtb \
> +	qcom-ipq4029-gl-b1300.dtb \
> ++ qcom-ipq4019-gl-b2200.dtb \
> +	qcom-ipq4029-gl-s1300.dtb \
> +	qcom-ipq4029-mr33.dtb \
>  	qcom-ipq8064-ap148.dtb \
> diff --git a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch
> index bb63c1c4fb..ac53337855 100644
> --- a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch
> +++ b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch
> @@ -10,7 +10,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
>
> --- a/arch/arm/boot/dts/Makefile
> +++ b/arch/arm/boot/dts/Makefile
> -@@ -837,11 +837,65 @@ dtb-$(CONFIG_ARCH_QCOM) += \
> +@@ -837,11 +837,66 @@ dtb-$(CONFIG_ARCH_QCOM) += \
>  	qcom-apq8074-dragonboard.dtb \
>  	qcom-apq8084-ifc6540.dtb \
>  	qcom-apq8084-mtp.dtb \
> @@ -71,6 +71,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
> +	qcom-ipq4029-ap-303h.dtb \
> +	qcom-ipq4029-ap-365.dtb \
> +	qcom-ipq4029-gl-b1300.dtb \
> ++ qcom-ipq4019-gl-b2200.dtb \
> +	qcom-ipq4029-gl-s1300.dtb \
> +	qcom-ipq4029-mr33.dtb \
>  	qcom-ipq8064-ap148.dtb \
> -- 
> 2.34.0
>
>
diff mbox series

Patch

diff --git a/package/boot/uboot-envtools/files/ipq40xx b/package/boot/uboot-envtools/files/ipq40xx
index 1462aa991d..9a71a622f7 100644
--- a/package/boot/uboot-envtools/files/ipq40xx
+++ b/package/boot/uboot-envtools/files/ipq40xx
@@ -35,6 +35,7 @@  devolo,magic-2-wifi-next|\
 edgecore,ecw5211|\
 glinet,gl-ap1300|\
 glinet,gl-b1300|\
+glinet,gl-b2200|\
 luma,wrtq-329acn|\
 netgear,wac510|\
 openmesh,a42|\
diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
index da0949b887..1467b032da 100644
--- a/package/firmware/ipq-wifi/Makefile
+++ b/package/firmware/ipq-wifi/Makefile
@@ -39,6 +39,7 @@  ALLWIFIBOARDS:= \
 	engenius_emr3500 \
 	ezviz_cs-w3-wd1200g-eup \
 	glinet_gl-ap1300 \
+	glinet_gl-b2200 \
 	glinet_gl-s1300 \
 	linksys_ea8300 \
 	linksys_mr8300-v0 \
@@ -125,6 +126,7 @@  $(eval $(call generate-ipq-wifi-package,engenius_emd1,EnGenius EMD1))
 $(eval $(call generate-ipq-wifi-package,engenius_emr3500,EnGenius EMR3500))
 $(eval $(call generate-ipq-wifi-package,ezviz_cs-w3-wd1200g-eup,EZVIZ CS-W3-WD1200G EUP))
 $(eval $(call generate-ipq-wifi-package,glinet_gl-ap1300,GL.iNet GL-AP1300))
+$(eval $(call generate-ipq-wifi-package,glinet_gl-b2200,GL.iNet GL-B2200))
 $(eval $(call generate-ipq-wifi-package,glinet_gl-s1300,GL.iNet GL-S1300))
 $(eval $(call generate-ipq-wifi-package,linksys_ea8300,Linksys EA8300))
 $(eval $(call generate-ipq-wifi-package,linksys_mr8300-v0,Linksys MR8300))
diff --git a/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca4019 b/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca4019
new file mode 100644
index 0000000000000000000000000000000000000000..ac1850160aead29cee0fb96664272b8a620a4e6a
GIT binary patch
literal 24308
zcmeHPdr(tX8b1jj>SE!BfCzXAAv{7MK%g2V@)iT6U{R3(i$E30tx+C^hoKAYC{l=s
zKrI*|Xc?48Q$)ta7qM7dJEP40v48CBA8ltJ-I;aQcC<U~%<kfzdy@+xB$^0pdE76Y
zbG~!#_nq^d-#tn0&G~WPN{9=N+an4KO%0AukIP5|GMNlODGtGN0JgwXC@<e$P+S;P
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

literal 0
HcmV?d00001

diff --git a/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca9888 b/package/firmware/ipq-wifi/board-glinet_gl-b2200.qca9888
new file mode 100644
index 0000000000000000000000000000000000000000..4f0a521f35935d4be1fb01b66dd9954a48eade52
GIT binary patch
literal 12200
zcmeHNT~HHO6uyZ%qC#Pp0P^Dsh-5(sVex0>pJ+8D3jzj85S3pID+VNxf)UhC)x=qn
z6hu*pVibldri{aMtZm0Sj1_0p=|dl!=}RB_?1Ob2UrKs6Vfj-usnGhfXLI+Sd+zzp
zx%b-*>~hH8log+)lqX6R@v?1M1)IVC{rdqFCV@QzPzqZ`lQylsvL;Sft*NSONK0H#
zR>oCT>uM^i)1=aM>*KUd71|bUWA*;{aSth!Db@*JXw{WB)Rb!))3#FaGJ=pw1u%X%
z%oU#S=Pv>Qy0)m<g0gu7{s2Ny20+snLUsuJ01zgzig3{awwo!Hm4FQeKvGiDv!_o5
z3XwN(I2;*VTOgW=aC`jwOizn5lYouym^nB5*w;BV^1vJJ#dUDL>>61;co}D5`;0|G
zrw9as1)Kmd<jnZy&D@w+*-~dvHgEX&F*OUTPmh){eK^zEov}zH0&L?XFfb6XjS~;Y
zK2SL5``)wn%%uGL-LydQ2+afBp^Il}URZJ`DDT5Fz%#%z;3)%rW&!XL2!sp0;0G%1
z;Hk1I#`5cLk6GWx4)&SqmO}&^dvN$hhs^QFQRY|*hCwepI9Upx!A`?g1bzD*9TWZ*
zi>^eeq_&X2&(G_r%bSc@y(%(tB^-zrKYuYc763JujWw?DUMyU=@NZ~a3?E)0zRZR9
z@ez*W_v|Sta@j&c{QX@q=ki=XSZ^AH0qYN&2HD2Oj+-K}v3N9wv4(d~dle4|h9Fs3
z7Ltf1BK1uN4}WDeb#}k3fYfpM(IW-LPzm|~MMAI;NeJbK`60_O877m+9>|bvEL)OI
zWn!6#93wD7LOdXlWGq>dOi3{*LShq(u-aa&POK?4bz)V#`qK4rhZ29x|A{{miiJu-
zsZH3XCz}ujrjRJ8BrNGk5|V<YNKz=*MVNYargBj~@8?(DyKie_OdY*9ZjL;he7l&g
zy(vCpr#n<SGJkoj-bQ!H)nwuFIA(x0sA|b<JkfehZ>06|0y6Uj6d=aMfccj0WC8dF
zeII>B)dB&r%yqh5RYxjtDPz-{>7#NbDRTmF7GR@Ks5E2_PB2$#GlVLauYnq)(vo@j
zI_q`)N&1j{`#2y*j05X{-lS5?Rd^iJPa7eW!V_T-Bg_DU*oPPsU8ho#NfS%5_A+L=
zo;6v&(HrPyxq?iFK@9Xk`8G1me#zRdSJNeOi4zbbjs;d5(@7s-0n8=6iEfkUkm>fT
z3`1*Fg(PwNvh^6#NGs*IYY$>Eun#g8IGIOEVFn}JBF`o_+WVN}bPa2JG-&^tsikvN
zgbNUh1A9MQQUi>ZXuYCuhZ%Col-o9|QC~~%mXnYA>_&#B6)LF{5R1pW=`u~5=U-Q*
z(J{+_XK5B<rkQz`rqMCWfM;nIVt6ypz-t&db8&A+f^J1MlHb$yX>*)9xX?TG%hR75
z@Y>*=pJbowDK*OUE6M{3u3gl25<09B&A)y|(IVL!R_L?wO3%J_NnO}3KgBJZ#{AjQ
z@M@9rl8rv4I1!}@+Sz56>k{^cDSeWM&K+WswNVuTd0iJuPG%emt3<b->`|FAj;>UT
zRQ+9A;|5LSu0U$Uw$m727q%P8869e|=9&^(eU&}ERpyj7aXqTM*R3^B%@I2S6sOLq
z3~2|U-?owKx$O!1P&Ha|-d5h3d^q|5qC8~EZ(FrHFvlnT?D;AtQ@=(NQ270gmdgpp
zutvWM>xF7dYO7d-<}t>dEqG~Aw(rIhUB$=ACcMT!?}x!JtkPDj7Ts~DztWt3B&Go^
zywYCRCM{o)i=+&n)fsd3L@m12+_le`bug9=R=tK=eu`&+XW$)YVA0|w%Y1wh|A3(2
z(CP1GuF=~rf5=cq`i-{c5!mY0QSh@WG9r9cL_}mn5%6Lwqv5!e%#`O9m#OQUj~Fc7
zy#qrxe;yqj<<|1H`Q5<>5kbgGbStqH*@kW)HXs?O7bl>gqQiD$Wa^oF_4llQImZ%C
z<}8Ohd*yw223Q83KY#x0*|Wc<$P8ZG`g=9R%(dT)WqfQys#MJkKLh~w%}np`!<jt}
zB|17PDl(GScn<#i``}~yKJxpWWWX`xEm|n70>#|}cLng@-_Ag}1cmds3FU2UT%7sp
zsbcuUwRiabY`r*ob=3daT$MXlt<F`Qqw<u+rDauW#&W8=r}xUh;Lz~RpYGhf|IqV^
zDRn&0o?PD>Z{VzhQmBEeggR@Wl+3_YL7nwaiZE~$P|r!674hM-``+9JAJ#(MsTt=M
z?b>5HeWBm}-R*m`=^qv=le-a(iI6ZXOcF+kz~-^d2!&A+irNg;j;%#fu~bPawRX<l
muP3v5q6HFx2!?JUwjjCadSX42j+UHbkC$W2*YCagjQbD3Sk|Nf

literal 0
HcmV?d00001

diff --git a/target/linux/ipq40xx/Makefile b/target/linux/ipq40xx/Makefile
index fb003243cc..a3270379d4 100644
--- a/target/linux/ipq40xx/Makefile
+++ b/target/linux/ipq40xx/Makefile
@@ -3,7 +3,7 @@  include $(TOPDIR)/rules.mk
 ARCH:=arm
 BOARD:=ipq40xx
 BOARDNAME:=Qualcomm Atheros IPQ40XX
-FEATURES:=squashfs fpu ramdisk nand
+FEATURES:=squashfs fpu ramdisk nand boot-part rootfs-part
 CPU_TYPE:=cortex-a7
 CPU_SUBTYPE:=neon-vfpv4
 SUBTARGETS:=generic mikrotik
diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network
index 5d123109a2..c674186b44 100644
--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network
+++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network
@@ -103,6 +103,11 @@  ipq40xx_setup_interfaces()
 		ucidef_add_switch "switch0" \
 			"0u@eth0" "3:lan" "4:lan"
 		;;
+	glinet,gl-b2200)
+		ucidef_set_interfaces_lan_wan "eth0" "eth1"
+		ucidef_add_switch "switch0" \
+			"0u@eth0" "1:lan" "2:lan" "3:lan" "5:lan" "0u@eth1" "4:wan"
+		;;
 	mobipromo,cm520-79f)
 		ucidef_add_switch "switch0" \
 			"0u@eth0" "3:lan:2" "4:lan:1"
diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index 35862ce3bc..6899723a74 100644
--- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -35,6 +35,7 @@  case "$FIRMWARE" in
 		caldata_extract "ART" 0x9000 0x2f20
 		ath10k_patch_mac $(mtd_get_mac_binary ORGDATA 0x32)
 		;;
+	glinet,gl-b2200 |\
 	engenius,eap2200 |\
 	openmesh,a62 |\
 	plasmacloud,pa2200)
@@ -64,6 +65,7 @@  case "$FIRMWARE" in
 	ezviz,cs-w3-wd1200g-eup |\
 	glinet,gl-ap1300 |\
 	glinet,gl-b1300 |\
+	glinet,gl-b2200 |\
 	glinet,gl-s1300 |\
 	linksys,ea6350v3 |\
 	mobipromo,cm520-79f |\
@@ -186,6 +188,7 @@  case "$FIRMWARE" in
 	ezviz,cs-w3-wd1200g-eup |\
 	glinet,gl-ap1300 |\
 	glinet,gl-b1300 |\
+	glinet,gl-b2200 |\
 	glinet,gl-s1300 |\
 	linksys,ea6350v3 |\
 	mobipromo,cm520-79f |\
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts
new file mode 100644
index 0000000000..6b84f78dc4
--- /dev/null
+++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-gl-b2200.dts
@@ -0,0 +1,364 @@ 
+// SPDX-License-Identifier: GPL-2.0-only OR MIT
+
+#include "qcom-ipq4019.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/soc/qcom,tcsr.h>
+
+/ {
+	model = "GL.iNet GL-B2200";
+	compatible = "glinet,gl-b2200", "qcom,ipq4019";
+
+	memory {
+		device_type = "memory";
+		reg = <0x80000000 0x10000000>;
+	};
+
+	chosen {
+		bootargs-append = " root=/dev/mmcblk0p2 rw rootwait clk_ignore_unused";
+	};
+
+	soc {
+		rng@22000 {
+			status = "okay";
+		};
+
+		mdio@90000 {
+			status = "okay";
+		};
+
+		ess-psgmii@98000 {
+			status = "okay";
+		};
+
+		tcsr@1949000 {
+			compatible = "qcom,tcsr";
+			reg = <0x1949000 0x100>;
+			qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
+		};
+
+		tcsr@194b000 {
+			/* select hostmode */
+			compatible = "qcom,tcsr";
+			reg = <0x194b000 0x100>;
+			qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
+			status = "okay";
+		};
+
+		ess_tcsr@1953000 {
+			compatible = "qcom,tcsr";
+			reg = <0x1953000 0x1000>;
+			qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
+		};
+
+		tcsr@1957000 {
+			compatible = "qcom,tcsr";
+			reg = <0x1957000 0x100>;
+			qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
+		};
+
+		crypto@8e3a000 {
+			status = "okay";
+		};
+
+		ess-switch@c000000 {
+			status = "okay";
+			switch_lan_bmp = <0x2e>;
+			switch_wan_bmp = <0x10>;
+		};
+
+		edma@c080000 {
+			status = "okay";
+		};
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		wps {
+			label = "wps";
+			gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_WPS_BUTTON>;
+			linux,input-type = <1>;
+		};
+
+		reset {
+			label = "reset";
+			gpios = <&tlmm 43 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+			linux,input-type = <1>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		power_blue {
+			label = "blue:power";
+			gpios = <&tlmm 57 GPIO_ACTIVE_HIGH>;
+			default-state = "on";
+		};
+		internet_blue {
+			label = "blue:internet";
+			gpios = <&tlmm 60 GPIO_ACTIVE_HIGH>;
+		};
+		power_white {
+			label = "white:power";
+			gpios = <&tlmm 61 GPIO_ACTIVE_LOW>;
+		};
+		internet_white {
+			label = "white:internet";
+			gpios = <&tlmm 66 GPIO_ACTIVE_LOW>;
+		};
+	};
+};
+
+&gmac1 {
+	qcom,phy_mdio_addr = <3>;
+	qcom,poll_required = <1>;
+	qcom,forced_speed = <1000>;
+	qcom,forced_duplex = <1>;
+	vlan_tag = <2 0x10>;
+};
+
+&gmac0 {
+	vlan_tag = <1 0x2e>;
+};
+
+&vqmmc {
+	status = "okay";
+};
+
+&sdhci {
+	status = "okay";
+	pinctrl-0 = <&sd_pins>;
+	pinctrl-names = "default";
+	cd-gpios = <&tlmm 3 GPIO_ACTIVE_LOW>;
+	vqmmc-supply = <&vqmmc>;
+};
+
+&blsp_dma {
+	status = "okay";
+};
+
+&cryptobam {
+	status = "okay";
+};
+
+&blsp1_spi1 {
+	pinctrl-0 = <&spi_0_pins>;
+	pinctrl-names = "default";
+	status = "okay";
+	cs-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>;
+
+	flash@0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <24000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				label = "SBL1";
+				reg = <0x0 0x40000>;
+				read-only;
+			};
+
+			partition@40000 {
+				label = "MIBIB";
+				reg = <0x40000 0x20000>;
+				read-only;
+			};
+
+			partition@60000 {
+				label = "QSEE";
+				reg = <0x60000 0x60000>;
+				read-only;
+			};
+
+			partition@c0000 {
+				label = "CDT";
+				reg = <0xc0000 0x10000>;
+				read-only;
+			};
+
+			partition@d0000 {
+				label = "DDRPARAMS";
+				reg = <0xd0000 0x10000>;
+				read-only;
+			};
+
+			partition@e0000 {
+				label = "APPSBLENV";
+				reg = <0xe0000 0x10000>;
+				read-only;
+			};
+
+			partition@f0000 {
+				label = "APPSBL";
+				reg = <0xf0000 0x80000>;
+				read-only;
+			};
+
+			partition@170000 {
+				label = "ART";
+				reg = <0x170000 0x10000>;
+				read-only;
+			};
+		};
+	};
+};
+
+&blsp1_spi2 {
+	pinctrl-0 = <&spi_1_pins>;
+	pinctrl-names = "default";
+	status = "okay";
+
+	spidev1: spi@0 {
+		compatible = "siliconlabs,si3210";
+		reg = <0>;
+		spi-max-frequency = <24000000>;
+	};
+};
+
+&blsp1_uart1 {
+	pinctrl-0 = <&serial_pins>;
+	pinctrl-names = "default";
+	status = "okay";
+};
+
+&blsp1_uart2 {
+	pinctrl-0 = <&serial_1_pins>;
+	pinctrl-names = "default";
+	status = "okay";
+};
+
+&tlmm {
+	serial_pins: serial_pinmux {
+		mux {
+			pins = "gpio16", "gpio17";
+			function = "blsp_uart0";
+			bias-disable;
+		};
+	};
+
+	serial_1_pins: serial1_pinmux {
+		mux {
+			pins = "gpio8", "gpio9",
+				"gpio10", "gpio11";
+			function = "blsp_uart1";
+			bias-disable;
+		};
+	};
+
+	spi_0_pins: spi_0_pinmux {
+		pinmux {
+			function = "blsp_spi0";
+			pins = "gpio13", "gpio14", "gpio15";
+		};
+		pinmux_cs {
+			function = "gpio";
+			pins = "gpio12";
+		};
+		pinconf {
+			pins = "gpio13", "gpio14", "gpio15";
+			drive-strength = <12>;
+			bias-disable;
+		};
+		pinconf_cs {
+			pins = "gpio12";
+			drive-strength = <2>;
+			bias-disable;
+			output-high;
+		};
+	};
+
+	spi_1_pins: spi_1_pinmux {
+		mux {
+			pins = "gpio44", "gpio46", "gpio47";
+			function = "blsp_spi1";
+			bias-disable;
+		};
+		cs {
+			pins = "gpio45";
+			function = "gpio";
+			bias-pull-up;
+		};
+		reset {
+			pins = "gpio43";
+			function = "gpio";
+			output-high;
+		};
+		mux_2 {
+			pins = "gpio35";
+			function = "gpio";
+			output-high;
+		};
+		host_int {
+			pins = "gpio2";
+			function = "gpio";
+			input;
+		};
+		wake {
+			pins = "gpio48";
+			function = "gpio";
+			output-high;
+		};
+	};
+
+	sd_pins: sd_pins {
+		pinmux {
+			function = "sdio";
+			pins = "gpio23", "gpio24", "gpio25", "gpio26",
+				"gpio29", "gpio30", "gpio31", "gpio32";
+			drive-strength = <10>;
+		};
+
+		pinmux_sd_clk {
+			function = "sdio";
+			pins = "gpio27";
+			drive-strength = <16>;
+		};
+
+		pinmux_sd7 {
+			function = "sdio";
+			pins = "gpio28";
+			drive-strength = <10>;
+			bias-disable;
+		};
+	};
+
+};
+
+&pcie0 {
+	status = "okay";
+	perst-gpio = <&tlmm 38 GPIO_ACTIVE_LOW>;
+	wake-gpio = <&tlmm 50 GPIO_ACTIVE_LOW>;
+
+	bridge@0,0 {
+		reg = <0x00000000 0 0 0 0>;
+		#address-cells = <3>;
+		#size-cells = <2>;
+		ranges;
+
+		wifi2: wifi@1,0 {
+			status = "okay";
+			compatible = "qcom,ath10k";
+			reg = <0x00010000 0 0 0 0>;
+			qcom,ath10k-calibration-variant = "GL-B2200";
+		};
+	};
+};
+
+&wifi0 {
+	status = "okay";
+	qcom,ath10k-calibration-variant = "GL-B2200";
+};
+
+&wifi1 {
+	status = "okay";
+	qcom,ath10k-calibration-variant = "GL-B2200";
+};
diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk
index c24eb28523..1184b7d533 100644
--- a/target/linux/ipq40xx/image/generic.mk
+++ b/target/linux/ipq40xx/image/generic.mk
@@ -81,6 +81,17 @@  define Build/qsdk-ipq-factory-nand-askey
 	@mv $@.new $@
 endef
 
+define Build/qsdk-ipq-app-gpt
+	cp $@ $@.tmp 2>/dev/null || true
+	ptgen -g -o $@.tmp -a 1 -l 1024 \
+			-t 0x2e -N 0:HLOS -r -p 32M \
+			-t 0x83 -N rootfs -r -p 128M \
+				-N rootfs_data -p 512M \
+				-N user_data -p 6766M
+	cat $@.tmp >> $@
+	rm $@.tmp
+endef
+
 define Build/SenaoFW
 	-$(STAGING_DIR_HOST)/bin/mksenaofw \
 		-n $(BOARD_NAME) -r $(VENDOR_ID) -p $(1) \
@@ -509,6 +520,23 @@  define Device/glinet_gl-b1300
 endef
 TARGET_DEVICES += glinet_gl-b1300
 
+define Device/glinet_gl-b2200
+	$(call Device/FitzImage)
+	DEVICE_VENDOR := GL.iNet
+	DEVICE_MODEL := GL-B2200
+	SOC := qcom-ipq4019
+	DEVICE_DTS_CONFIG := config@ap.dk04.1-c3
+	KERNEL_INITRAMFS_SUFFIX := -recovery.itb
+	IMAGES := sdcard.img.gz
+	IMAGE/sdcard.img.gz := qsdk-ipq-app-gpt |\
+		pad-to 1024k | append-kernel |\
+		pad-to 33792k | append-rootfs |\
+		append-metadata | gzip
+	DEVICE_PACKAGES := ath10k-firmware-qca9888-ct ipq-wifi-glinet_gl-b2200 \
+		kmod-fs-ext4 kmod-mmc kmod-spi-dev mkf2fs e2fsprogs kmod-fs-f2fs
+endef
+TARGET_DEVICES += glinet_gl-b2200
+
 define Device/glinet_gl-s1300
 	$(call Device/FitzImage)
 	DEVICE_VENDOR := GL.iNet
diff --git a/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch b/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch
index 436f5a74f5..030e0d6b45 100644
--- a/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch
+++ b/target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch
@@ -10,7 +10,7 @@  Signed-off-by: John Crispin <john@phrozen.org>
 
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -902,11 +902,67 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -902,11 +902,68 @@ dtb-$(CONFIG_ARCH_QCOM) += \
  	qcom-apq8074-dragonboard.dtb \
  	qcom-apq8084-ifc6540.dtb \
  	qcom-apq8084-mtp.dtb \
@@ -73,6 +73,7 @@  Signed-off-by: John Crispin <john@phrozen.org>
 +	qcom-ipq4029-ap-303h.dtb \
 +	qcom-ipq4029-ap-365.dtb \
 +	qcom-ipq4029-gl-b1300.dtb \
++ qcom-ipq4019-gl-b2200.dtb \
 +	qcom-ipq4029-gl-s1300.dtb \
 +	qcom-ipq4029-mr33.dtb \
  	qcom-ipq8064-ap148.dtb \
diff --git a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch
index bb63c1c4fb..ac53337855 100644
--- a/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch
+++ b/target/linux/ipq40xx/patches-5.4/901-arm-boot-add-dts-files.patch
@@ -10,7 +10,7 @@  Signed-off-by: John Crispin <john@phrozen.org>
 
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -837,11 +837,65 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -837,11 +837,66 @@ dtb-$(CONFIG_ARCH_QCOM) += \
  	qcom-apq8074-dragonboard.dtb \
  	qcom-apq8084-ifc6540.dtb \
  	qcom-apq8084-mtp.dtb \
@@ -71,6 +71,7 @@  Signed-off-by: John Crispin <john@phrozen.org>
 +	qcom-ipq4029-ap-303h.dtb \
 +	qcom-ipq4029-ap-365.dtb \
 +	qcom-ipq4029-gl-b1300.dtb \
++ qcom-ipq4019-gl-b2200.dtb \
 +	qcom-ipq4029-gl-s1300.dtb \
 +	qcom-ipq4029-mr33.dtb \
  	qcom-ipq8064-ap148.dtb \