From 2bfcd7d31d0860c28e6c35688302e48eb2b3e2ae Mon Sep 17 00:00:00 2001
From: John Crispin <john@phrozen.org>
Date: Thu, 26 Aug 2021 17:34:47 +0200
Subject: [PATCH 01/14] ipq40xx: add HFCL ION4 support

Signed-off-by: John Crispin <john@phrozen.org>
---
 package/boot/uboot-envtools/files/ipq40xx     |   4 +
 package/firmware/ipq-wifi/Makefile            |   4 +-
 .../ipq40xx/base-files/etc/board.d/01_leds    |   4 +
 .../ipq40xx/base-files/etc/board.d/02_network |   1 +
 .../etc/hotplug.d/firmware/11-ath10k-caldata  |   8 +
 .../base-files/lib/upgrade/platform.sh        |   1 +
 .../arm/boot/dts/qcom-ipq4019-hfcl-ion4.dts   | 236 ++++++++++++++++++
 target/linux/ipq40xx/image/generic.mk         |  18 ++
 .../ipq40xx/patches-5.4/999-hfcl_ion.patch    |  12 +
 9 files changed, 287 insertions(+), 1 deletion(-)
 create mode 100644 target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hfcl-ion4.dts
 create mode 100644 target/linux/ipq40xx/patches-5.4/999-hfcl_ion.patch

diff --git a/package/boot/uboot-envtools/files/ipq40xx b/package/boot/uboot-envtools/files/ipq40xx
index ab489a6e18..fd7ad69eff 100644
--- a/package/boot/uboot-envtools/files/ipq40xx
+++ b/package/boot/uboot-envtools/files/ipq40xx
@@ -64,6 +64,10 @@ tp-link,ec420-g1 |\
 zyxel,nbg6617)
 	ubootenv_add_uci_config "/dev/mtd6" "0x0" "0x10000" "0x10000"
 	;;
+hfcl,ion4)
+	env=$(ubootenv_mtdinfo)
+	ubootenv_add_uci_config $env
+	;;
 esac
 
 config_load ubootenv
diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
index b222ce30d6..cd7bfc3c82 100644
--- a/package/firmware/ipq-wifi/Makefile
+++ b/package/firmware/ipq-wifi/Makefile
@@ -52,7 +52,8 @@ ALLWIFIBOARDS:= \
 	qxwlan_e2600ac \
 	cig_wf610d \
 	wallys_dr40x9 \
-	tp-link_ec420-g1
+	tp-link_ec420-g1 \
+	hfcl_ion4
 
 ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ipq-wifi-$(BOARD))
 
@@ -141,5 +142,6 @@ $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac,Qxwlan E2600AC))
 $(eval $(call generate-ipq-wifi-package,cig_wf610d,CIG WF_610D))
 $(eval $(call generate-ipq-wifi-package,tp-link_ec420-g1,tp-link EC420-G1))
 $(eval $(call generate-ipq-wifi-package,wallys_dr40x9,Wallys DR40X9))
+$(eval $(call generate-ipq-wifi-package,hfcl_ion4,HFCL ION4))
 
 $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE))))
diff --git a/target/linux/ipq40xx/base-files/etc/board.d/01_leds b/target/linux/ipq40xx/base-files/etc/board.d/01_leds
index d473448137..d944d72184 100755
--- a/target/linux/ipq40xx/base-files/etc/board.d/01_leds
+++ b/target/linux/ipq40xx/base-files/etc/board.d/01_leds
@@ -78,6 +78,10 @@ zyxel,wre6606)
 	ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy0tpt"
 	ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wlan5g" "phy1tpt"
 	;;
+hfcl,ion4)
+	ucidef_set_led_wlan "wlan2g" "WLAN2G" "yellow:wlan2g" "phy0tpt"
+	ucidef_set_led_wlan "wlan5g" "WLAN5G" "red:wlan5g" "phy1tpt"
+	;;
 esac
 
 board_config_flush
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 5a2a3a47f7..e4b009bf93 100755
--- a/target/linux/ipq40xx/base-files/etc/board.d/02_network
+++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network
@@ -34,6 +34,7 @@ ipq40xx_setup_interfaces()
 	netgear,ex6100v2|\
 	netgear,ex6150v2|\
 	tp-link,ec420-g1|\
+	hfcl,ion4|\
 	zyxel,wre6606)
 		ucidef_set_interface_wan "eth0"
 		;;
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 64bb4efaf8..211e7cfda1 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
@@ -167,6 +167,10 @@ case "$FIRMWARE" in
 	tp-link,ec420-g1)
 		caldata_extract "0:ART" 0x1000 0x2f20
 		;;
+	hfcl,ion4)
+		caldata_extract "0:ART" 4096 12064
+		ath10k_patch_mac $(mtd_get_mac_ascii 0:ART WLAN0_BASEMAC)
+		;;
 	esac
 	;;
 "ath10k/pre-cal-ahb-a800000.wifi.bin")
@@ -283,6 +287,10 @@ case "$FIRMWARE" in
 		caldata_extract "ART" 0x5000 0x2f20
 		ath10k_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) -1)
 		;;
+	hfcl,ion4)
+		caldata_extract "0:ART" 20480 12064
+		ath10k_patch_mac $(mtd_get_mac_ascii 0:ART WLAN1_BASEMAC)
+		;;
 	esac
 	;;
 *)
diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
index fc64807d74..806b3edb66 100644
--- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
@@ -74,6 +74,7 @@ platform_do_upgrade() {
 	mobipromo,cm520-79f |\
 	qxwlan,e2600ac-c2 |\
 	wallys,dr40x9 |\
+	hfcl,ion4 |\
 	tp-link,ec420-g1)
 		nand_do_upgrade "$1"
 		;;
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hfcl-ion4.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hfcl-ion4.dts
new file mode 100644
index 0000000000..bb247c5b79
--- /dev/null
+++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-hfcl-ion4.dts
@@ -0,0 +1,236 @@
+// SPDX-License-Identifier: GPL-2.0-or-later 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 = "HFCL Ltd, ION4";
+	compatible = "hfcl,ion4";
+
+	aliases {
+/*		led-boot = &power_green;
+		led-failsafe = &power_red;
+		led-running = &power_green;
+		led-upgrade = &power_red;
+		label-mac-device = &wifi0;
+		*/
+	};
+
+	soc {
+		rng@22000 {
+			status = "okay";
+		};
+
+		mdio@90000 {
+			status = "okay";
+			pinctrl-0 = <&mdio_pins>;
+			pinctrl-names = "default";
+
+			/delete-node/ ethernet-phy@1;
+			/delete-node/ ethernet-phy@2;
+			/delete-node/ ethernet-phy@3;
+			/delete-node/ ethernet-phy@4;
+			/delete-node/ psgmii-phy@5;
+		};
+
+		tcsr@1949000 {
+			compatible = "qcom,tcsr";
+			reg = <0x1949000 0x100>;
+			qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
+		};
+
+		ess_tcsr@1953000 {
+			compatible = "qcom,tcsr";
+			reg = <0x1953000 0x1000>;
+			qcom,ess-interface-select = <TCSR_ESS_PSGMII_RGMII5>;
+		};
+
+		tcsr@1957000 {
+			compatible = "qcom,tcsr";
+			reg = <0x1957000 0x100>;
+			qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
+		};
+
+		crypto@8e3a000 {
+			status = "okay";
+		};
+
+		watchdog@b017000 {
+			status = "okay";
+		};
+
+		ess-switch@c000000 {
+			switch_mac_mode = <0x3>; /* mac mode for RGMII RMII */
+			switch_lan_bmp = <0x0>; /* lan port bitmap */
+			switch_wan_bmp = <0x10>; /* wan port bitmap */
+		};
+
+		edma@c080000 {
+			status = "okay";
+			phy-mode = "rgmii-id";
+			qcom,num_gmac = <1>;
+			qcom,single-phy;
+		};
+	};
+
+	gpio_key {
+		compatible = "gpio-keys";
+		button@1 {
+			label = "reset";
+			linux,code = <KEY_RESTART>;
+			gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
+			linux,input-type = <1>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		power_red: power_red {
+			label = "yellow:wlan2g";
+			gpios = <&tlmm 45 GPIO_ACTIVE_HIGH>;
+		};
+
+		power_green: power_green {
+			label = "red:wlan5g";
+			gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>;
+		};
+	};
+};
+
+&tlmm {
+	serial_0_pins: serial_pinmux {
+		mux {
+			pins = "gpio16", "gpio17";
+			function = "blsp_uart0";
+			bias-disable;
+		};
+	};
+
+	nand_pins: nand_pins {
+		pullups {
+			pins = "gpio53", "gpio58", "gpio59";
+			function = "qpic";
+			bias-pull-up;
+		};
+
+		pulldowns {
+			pins = "gpio54", "gpio55", "gpio56",
+				"gpio57", "gpio60", "gpio61",
+				"gpio62", "gpio63", "gpio64",
+				"gpio65", "gpio66", "gpio67",
+				"gpio68", "gpio69";
+			function = "qpic";
+			bias-pull-down;
+		};
+	};
+
+	mdio_pins: mdio_pinmux {
+		mux_1 {
+			pins = "gpio6";
+			function = "mdio";
+			bias-pull-up;
+		};
+		mux_2 {
+			pins = "gpio7";
+			function = "mdc";
+			bias-pull-up;
+		};
+	};
+};
+
+&nand {
+	pinctrl-0 = <&nand_pins>;
+	pinctrl-names = "default";
+	status = "okay";
+
+	nand@0 {
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition0@0 {
+				label = "0:SBL1";
+				reg = <0x00000000 0x00100000>;
+				read-only;
+			};
+			partition1@100000 {
+				label = "0:MIBIB";
+				reg = <0x00100000 0x00100000>;
+				read-only;
+			};
+			partition2@200000 {
+				label = "0:BOOTCONFIG";
+				reg = <0x00200000 0x00100000>;
+				read-only;
+			};
+			partition3@300000 {
+				label = "0:QSEE";
+				reg = <0x00300000 0x00200000>;
+				read-only;
+			};
+			partition4@500000 {
+				label = "0:CDT";
+				reg = <0x00500000 0x00180000>;
+				read-only;
+			};
+			partition5@680000 {
+				label = "0:APPSBLENV";
+				reg = <0x00680000 0x00080000>;
+			};
+			partition6@700000 {
+				label = "0:APPSBL";
+				reg = <0x00700000 0x00400000>;
+				read-only;
+			};
+			partition7@b00000 {
+				label = "0:ART";
+				reg = <0x00b00000 0x00080000>;
+				read-only;
+			};
+			partition8@b80000 {
+				label = "kernel";
+				reg = <0x00b80000 0x1000000>;
+			};
+			partition8@180000 {
+				label = "ubi";
+				reg = <0x02b80000 0x5480000>;
+			};
+		};
+	};
+};
+
+&cryptobam {
+	status = "okay";
+};
+
+&blsp_dma {
+	status = "okay";
+};
+
+&blsp1_uart1 {
+	pinctrl-0 = <&serial_0_pins>;
+	pinctrl-names = "default";
+	status = "okay";
+};
+
+&qpic_bam {
+	status = "okay";
+};
+
+&wifi0 {
+	status = "okay";
+};
+
+&wifi1 {
+	status = "okay";
+};
+
+&gmac0 {
+	qcom,phy_mdio_addr = <0>;
+	qcom,poll_required = <1>;
+	vlan_tag = <0 0x20>;
+};
diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk
index 540f1f2778..ae1e2e49cf 100644
--- a/target/linux/ipq40xx/image/generic.mk
+++ b/target/linux/ipq40xx/image/generic.mk
@@ -857,3 +857,21 @@ define Device/tp-link_ec420_g1
 	DEVICE_PACKAGES := ath10k-firmware-qca9984-ct ipq-wifi-tp-link_ec420-g1 uboot-envtools
 endef
 TARGET_DEVICES += tp-link_ec420_g1
+
+define Device/hfcl_ion4
+	$(call Device/FitImage)
+	$(call Device/UbiFit)
+	DEVICE_VENDOR := HFCL
+	DEVICE_MODEL := ION4
+	SOC := qcom-ipq4019
+	DEVICE_DTS := qcom-ipq4019-hfcl-ion4
+	KERNEL_INSTALL := 1
+	KERNEL_SIZE := 4048k
+	BLOCKSIZE := 128k
+	PAGESIZE := 2048
+	BOARD_NAME := hfcl-ion4
+	IMAGES := nand-sysupgrade.bin
+	IMAGE/nand-sysupgrade.bin := sysupgrade-tar | append-metadata
+	DEVICE_PACKAGES := uboot-envtools
+endef
+TARGET_DEVICES += hfcl_ion4
diff --git a/target/linux/ipq40xx/patches-5.4/999-hfcl_ion.patch b/target/linux/ipq40xx/patches-5.4/999-hfcl_ion.patch
new file mode 100644
index 0000000000..2b45b47521
--- /dev/null
+++ b/target/linux/ipq40xx/patches-5.4/999-hfcl_ion.patch
@@ -0,0 +1,12 @@
+Index: linux-5.4.111/arch/arm/boot/dts/Makefile
+===================================================================
+--- linux-5.4.111.orig/arch/arm/boot/dts/Makefile
++++ linux-5.4.111/arch/arm/boot/dts/Makefile
+@@ -885,6 +885,7 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+ 	qcom-ipq4019-wpj419.dtb \
+ 	qcom-ipq4019-wtr-m2133hp.dtb \
+ 	qcom-ipq4019-tp-link-ec420-g1.dtb \
++	qcom-ipq4019-hfcl-ion4.dtb \
+ 	qcom-ipq4028-wpj428.dtb \
+ 	qcom-ipq4029-ap-303.dtb \
+ 	qcom-ipq4029-ap-303h.dtb \
-- 
2.25.1

