From a3d348b66466c3d559d49f55dc379e346c4e4232 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 14 Nov 2022 09:21:06 +0100 Subject: [PATCH] ipq807x: add initial support for MUXI AP3220L Hardware: * SoC: Qcom IPQ5018 * RAM: 512MB * Flash: 4MB Nor + 128MB Nand * Ethernet: 2x GbE * WLAN: 2x2 2.4GHz 574Mbps(builtin) + 2x2 5GHz 2400Mbps(qcn6122) * BT: BT5.1(builtin) / nrf52840(option) * LEDS: 1x power, 1x 2G, 1x 5G * Buttons: 1x reset * USB: 1x 2.0(Type-A) * Power: DC 12V/2A, PoE 48V/0.6A * UART: 1x RJ45 Flash instruction under U-Boot: tftpboot 0x44000000 openwrt-ipq807x-muxi_ap3220l-squashfs-nand-factory.bin imxtract 0x44000000 ubi flash rootfs reset Signed-off-by: angliu-muxi --- .../ipq807x/base-files/etc/board.d/01_leds | 4 + .../ipq807x/base-files/etc/board.d/02_network | 11 +- .../etc/hotplug.d/firmware/10-ath11k-caldata | 4 + .../base-files/lib/upgrade/platform.sh | 2 + .../boot/dts/qcom-ipq5018-muxi-ap3220l.dts | 23 + .../dts/qcom/qcom-ipq5018-muxi-ap3220l.dts | 891 ++++++++++++++++++ feeds/ipq807x/ipq807x/image/ipq50xx.mk | 9 + feeds/wifi-ax/ath11k-wifi/Makefile | 2 + .../board-muxi-ap3220l.bin.IPQ5018 | Bin 0 -> 131072 bytes .../board-muxi-ap3220l.bin.QCN6122 | Bin 0 -> 131072 bytes 10 files changed, 945 insertions(+), 1 deletion(-) create mode 100644 feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-muxi-ap3220l.dts create mode 100755 feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-muxi-ap3220l.dts create mode 100644 feeds/wifi-ax/ath11k-wifi/board-muxi-ap3220l.bin.IPQ5018 create mode 100644 feeds/wifi-ax/ath11k-wifi/board-muxi-ap3220l.bin.QCN6122 diff --git a/feeds/ipq807x/ipq807x/base-files/etc/board.d/01_leds b/feeds/ipq807x/ipq807x/base-files/etc/board.d/01_leds index 900220c7a..6fade4d55 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/board.d/01_leds +++ b/feeds/ipq807x/ipq807x/base-files/etc/board.d/01_leds @@ -50,6 +50,10 @@ glinet,ax1800|\ glinet,axt1800) ucidef_set_led_netdev "wan" "WAN" "blue:wan" "eth0" "tx rx link" ;; +muxi,ap3220l) + ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy0tpt" + ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy1tpt" + ;; esac board_config_flush diff --git a/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network b/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network index bebb40c6d..f48667432 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network +++ b/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network @@ -55,7 +55,8 @@ qcom_setup_interfaces() liteon,wpx8324|\ wallys,dr6018|\ cig,wf188n|\ - cig,wf196) + cig,wf196|\ + muxi,ap3220l) ucidef_set_interface_lan "eth1" ucidef_set_interface_wan "eth0" ;; @@ -123,6 +124,14 @@ qcom_setup_macs() wan_mac=$(cat /sys/class/net/eth1/address) lan_mac=$(macaddr_add "$wan_mac" 1) ;; + muxi,ap3220l) + wan_mac=$(mtd_get_mac_binary 0:Product_Info 0x5b) + lan_mac=$(macaddr_add "$wan_mac" 1) + ucidef_set_network_device_mac eth0 $wan_mac + ucidef_set_network_device_mac eth1 $lan_mac + ip link set eth0 address $wan_mac + ip link set eth1 address $lan_mac + ;; *) wan_mac=$(cat /sys/class/net/eth0/address) lan_mac=$(macaddr_add "$wan_mac" 1) diff --git a/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata b/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata index 4fd4d5002..6413da3e8 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata +++ b/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata @@ -128,6 +128,7 @@ ath11k/IPQ5018/hw1.0/caldata.bin) edgecore,eap104|\ liteon,wpx8324|\ motorola,q14|\ + muxi,ap3220l|\ qcom,ipq5018-mp03.1) caldata_extract "0:ART" 0x1000 0x20000 ;; @@ -147,6 +148,9 @@ ath11k/qcn6122/hw1.0/caldata_2.bin) liteon,wpx8324) caldata_extract "0:ART" 0x4c000 0x20000 ;; + muxi,ap3220l) + caldata_extract "0:ART" 0x26800 0x20000 + ;; esac ;; ath11k/QCN9074/hw1.0/caldata_1.bin) diff --git a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh index eb98cbf66..0531956f7 100755 --- a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh +++ b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh @@ -90,12 +90,14 @@ platform_check_image() { hfcl,ion4x|\ hfcl,ion4x_2|\ hfcl,ion4xe|\ + muxi,ap3220l|\ plasmacloud,pax1800-v1|\ plasmacloud,pax1800-v2|\ tplink,ex227|\ tplink,ex447|\ yuncore,ax840|\ motorola,q14|\ + muxi,ap3220l|\ qcom,ipq6018-cp01|\ qcom,ipq807x-hk01|\ qcom,ipq807x-hk14|\ diff --git a/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-muxi-ap3220l.dts b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-muxi-ap3220l.dts new file mode 100644 index 000000000..9d963770a --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-muxi-ap3220l.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../../../arm64/boot/dts/qcom/qcom-ipq5018-muxi-ap3220l.dts" + +/ { + pmuv8: pmu { + compatible = "arm,cortex-a7-pmu"; + }; +}; diff --git a/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-muxi-ap3220l.dts b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-muxi-ap3220l.dts new file mode 100755 index 000000000..611221719 --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-muxi-ap3220l.dts @@ -0,0 +1,891 @@ +/dts-v1/; +/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "qcom-ipq5018.dtsi" + +/ { + #address-cells = <0x2>; + #size-cells = <0x2>; + model = "MUXI AP3220L"; + compatible = "muxi,ap3220l", "qcom,ipq5018-mp03.5-c1", "qcom,ipq5018"; + interrupt-parent = <&intc>; + + aliases { + serial0 = &blsp1_uart1; + serial1 = &blsp1_uart2; + ethernet0 = "/soc/dp1"; + ethernet1 = "/soc/dp2"; + + led-boot = &led_power; + led-failsafe = &led_power; + led-running = &led_power; + led-upgrade = &led_power; + }; + + chosen { + bootargs = "console=ttyMSM0,115200,n8 rw init=/init"; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + bootargs-append = " swiotlb=1"; + #else + bootargs-append = " swiotlb=1 coherent_pool=2M"; + #endif + stdout-path = "serial0"; + }; + + reserved-memory { + #ifdef __IPQ_MEM_PROFILE_256_MB__ + /* 256 MB Profile + * +==========+==============+=========================+ + * | | | | + * | Region | Start Offset | Size | + * | | | | + * +----------+--------------+-------------------------+ + * | NSS | 0x40000000 | 8MB | + * +----------+--------------+-------------------------+ + * | Linux | 0x40800000 | Depends on total memory | + * +----------+--------------+-------------------------+ + * | uboot | 0x4A600000 | 4MB | + * +----------+--------------+-------------------------+ + * | SBL | 0x4AA00000 | 1MB | + * +----------+--------------+-------------------------+ + * | smem | 0x4AB00000 | 1MB | + * +----------+--------------+-------------------------+ + * | TZ | 0x4AC00000 | 4MB | + * +----------+--------------+-------------------------+ + * | Q6 | | | + * | code/ | 0x4B000000 | 20MB | + * | data | | | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | data | 0x4C400000 | 13MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | M3 Dump | 0x4D100000 | 1MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | QDSS | 0x4D200000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | data | 0x4D300000 | 15MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | M3 Dump | 0x4E200000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | QDSS | 0x4E300000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | data | 0x4E400000 | 15MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | M3 Dump | 0x4F300000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | QDSS | 0x4F400000 | 1MB | + * +----------+--------------+-------------------------+ + * | | + * | Rest of the memory for Linux | + * | | + * +===================================================+ + */ + q6_mem_regions: q6_mem_regions@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x4500000>; + }; + + q6_code_data: q6_code_data@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x1400000>; + }; + + q6_ipq5018_data: q6_ipq5018_data@4C400000 { + no-map; + reg = <0x0 0x4C400000 0x0 0xD00000>; + }; + + m3_dump: m3_dump@4D100000 { + no-map; + reg = <0x0 0x4D100000 0x0 0x100000>; + }; + + q6_etr_region: q6_etr_dump@4D200000 { + no-map; + reg = <0x0 0x4D200000 0x0 0x100000>; + }; + + q6_qcn6122_data1: q6_qcn6122_data1@4D300000 { + no-map; + reg = <0x0 0x4D300000 0x0 0xF00000>; + }; + + m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 { + no-map; + reg = <0x0 0x4E200000 0x0 0x100000>; + }; + + q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 { + no-map; + reg = <0x0 0x4E300000 0x0 0x100000>; + }; + + q6_qcn6122_data2: q6_qcn6122_data2@4E400000 { + no-map; + reg = <0x0 0x4E400000 0x0 0xF00000>; + }; + + m3_dump_qcn6122_2: m3_dump_qcn6122_2@4F300000 { + no-map; + reg = <0x0 0x4F300000 0x0 0x100000>; + }; + + q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F400000 { + no-map; + reg = <0x0 0x4F400000 0x0 0x100000>; + }; + #else + /* 512MB/1GB Profiles + * +==========+==============+=========================+ + * | | | | + * | Region | Start Offset | Size | + * | | | | + * +----------+--------------+-------------------------+ + * | NSS | 0x40000000 | 16MB | + * +----------+--------------+-------------------------+ + * | Linux | 0x41000000 | Depends on total memory | + * +----------+--------------+-------------------------+ + * | uboot | 0x4A600000 | 4MB | + * +----------+--------------+-------------------------+ + * | SBL | 0x4AA00000 | 1MB | + * +----------+--------------+-------------------------+ + * | smem | 0x4AB00000 | 1MB | + * +----------+--------------+-------------------------+ + * | TZ | 0x4AC00000 | 4MB | + * +----------+--------------+-------------------------+ + * | Q6 | | | + * | code/ | 0x4B000000 | 20MB | + * | data | | | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | data | 0x4C400000 | 14MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | M3 Dump | 0x4D200000 | 1MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | QDSS | 0x4D300000 | 1MB | + * +----------+--------------+-------------------------+ + * | IPQ5018 | | | + * | Caldb | 0x4D400000 | 2MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | data | 0x4D600000 | 16MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | M3 Dump | 0x4E600000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | QDSS | 0x4E700000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_1| | | + * | Caldb | 0x4E800000 | 5MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | data | 0x4ED00000 | 16MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | M3 Dump | 0x4FD00000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | QDSS | 0x4FE00000 | 1MB | + * +----------+--------------+-------------------------+ + * | QCN6122_2| | | + * | Caldb | 0x4FF00000 | 5MB | + * +----------+--------------+-------------------------+ + * | | + * | Rest of the memory for Linux | + * | | + * +===================================================+ + */ + q6_mem_regions: q6_mem_regions@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 0x5400000>; + }; + + q6_code_data: q6_code_data@4B000000 { + no-map; + reg = <0x0 0x4B000000 0x0 01400000>; + }; + + q6_ipq5018_data: q6_ipq5018_data@4C400000 { + no-map; + reg = <0x0 0x4C400000 0x0 0xE00000>; + }; + + m3_dump: m3_dump@4D200000 { + no-map; + reg = <0x0 0x4D200000 0x0 0x100000>; + }; + + q6_etr_region: q6_etr_dump@4D300000 { + no-map; + reg = <0x0 0x4D300000 0x0 0x100000>; + }; + + q6_caldb_region: q6_caldb_region@4D400000 { + no-map; + reg = <0x0 0x4D400000 0x0 0x200000>; + }; + + q6_qcn6122_data1: q6_qcn6122_data1@4D600000 { + no-map; + reg = <0x0 0x4D600000 0x0 0x1000000>; + }; + + m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E600000 { + no-map; + reg = <0x0 0x4E600000 0x0 0x100000>; + }; + + q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E700000 { + no-map; + reg = <0x0 0x4E700000 0x0 0x100000>; + }; + + q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E800000 { + no-map; + reg = <0x0 0x4E800000 0x0 0x500000>; + }; + + q6_qcn6122_data2: q6_qcn6122_data2@4E900000 { + no-map; + reg = <0x0 0x4ED00000 0x0 0x1000000>; + }; + + m3_dump_qcn6122_2: m3_dump_qcn6122_2@4FD00000 { + no-map; + reg = <0x0 0x4FD00000 0x0 0x100000>; + }; + + q6_qcn6122_etr_2: q6_qcn6122_etr_2@4FE00000 { + no-map; + reg = <0x0 0x4FE00000 0x0 0x100000>; + }; + + q6_qcn6122_caldb_2: q6_qcn6122_caldb_2@4FF00000 { + no-map; + reg = <0x0 0x4FF00000 0x0 0x500000>; + }; + + #endif + }; + + soc { + + blsp1_uart1: serial@78af000 { + pinctrl-0 = <&blsp0_uart_pins>; + pinctrl-names = "default"; + status = "okay"; + }; + + blsp1_uart2: serial@78b0000 { + pinctrl-0 = <&blsp1_uart_pins>; + pinctrl-names = "default"; + status = "disabled"; + }; + + qpic_bam: dma@7984000{ + status = "ok"; + }; + + nand: qpic-nand@79b0000 { + pinctrl-0 = <&qspi_nand_pins>; + pinctrl-names = "default"; + status = "ok"; + }; + + spi_0: spi@78b5000 { /* BLSP1 QUP0 */ + pinctrl-0 = <&blsp0_spi_pins>; + pinctrl-names = "default"; + cs-select = <0>; + status = "ok"; + + m25p80@0 { + #address-cells = <1>; + #size-cells = <1>; + reg = <0>; + compatible = "n25q128a11"; + linux,modalias = "m25p80", "n25q128a11"; + spi-max-frequency = <50000000>; + use-default-sizes; + }; + }; + + mdio0: mdio@88000 { + status = "ok"; + + ethernet-phy@0 { + reg = <7>; + }; + }; + + mdio1: mdio@90000 { + status = "ok"; + pinctrl-0 = <&mdio1_pins &phy_pins>; + pinctrl-names = "default"; + phy-reset-gpio = <&tlmm 39 0>; + + ethernet-phy@0 { + reg = <0>; + }; + + ethernet-phy@1 { + reg = <1>; + }; + + ethernet-phy@2 { + reg = <2>; + }; + + ethernet-phy@3 { + reg = <3>; + }; + }; + + ess-instance { + num_devices = <0x2>; + ess-switch@0x39c00000 { + compatible = "qcom,ess-switch-ipq50xx"; + device_id = <0>; + switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/ + cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/ + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <7>; + }; + port@1 { + port_id = <2>; + forced-speed = <1000>; + forced-duplex = <1>; + }; + }; + /* + led_source@0 { + source = <0>; + mode = "normal"; + speed = "all"; + blink_en = "enable"; + active = "high"; + }; + */ + }; + ess-switch1@1 { + compatible = "qcom,ess-switch-qca83xx"; + device_id = <1>; + switch_access_mode = "mdio"; + mdio-bus = <&mdio1>; + reset_gpio = <0x27>; + switch_cpu_bmp = <0x40>; /* cpu port bitmap */ + switch_lan_bmp = <0x1e>; /* lan port bitmap */ + switch_wan_bmp = <0x0>; /* wan port bitmap */ + qca,ar8327-initvals = < + 0x00004 0x7600000 /* PAD0_MODE */ + 0x00008 0x1000000 /* PAD5_MODE */ + 0x0000c 0x80 /* PAD6_MODE */ + 0x00010 0x2613a0 /* PORT6 FORCE MODE*/ + 0x000e4 0xaa545 /* MAC_POWER_SEL */ + 0x000e0 0xc74164de /* SGMII_CTRL */ + 0x0007c 0x4e /* PORT0_STATUS */ + 0x00094 0x4e /* PORT6_STATUS */ + >; + qcom,port_phyinfo { + port@0 { + port_id = <1>; + phy_address = <0>; + }; + port@1 { + port_id = <2>; + phy_address = <1>; + }; + port@2 { + port_id = <3>; + phy_address = <2>; + }; + port@3 { + port_id = <4>; + phy_address = <3>; + }; + }; + }; + }; + + ess-uniphy@98000 { + status = "disabled"; + }; + + dp1 { + device_type = "network"; + compatible = "qcom,nss-dp"; + clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>; + clock-names = "nss-snoc-gmac-axi-clk"; + qcom,id = <1>; + reg = <0x39C00000 0x10000>; + interrupts = ; + qcom,mactype = <2>; + qcom,link-poll = <1>; + qcom,phy-mdio-addr = <7>; + mdio-bus = <&mdio0>; + local-mac-address = [000000000000]; + phy-mode = "sgmii"; + }; + + dp2 { + device_type = "network"; + compatible = "qcom,nss-dp"; + clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>; + clock-names = "nss-snoc-gmac-axi-clk"; + qcom,id = <2>; + reg = <0x39D00000 0x10000>; + interrupts = ; + qcom,mactype = <2>; + qcom,link-poll = <1>; + qcom,phy-mdio-addr = <3>; + mdio-bus = <&mdio1>; + local-mac-address = [000000000000]; + phy-mode = "sgmii"; + }; + + qcom,test@0 { + status = "ok"; + }; + + }; + + thermal-zones { + status = "ok"; + }; +}; + +&tlmm { + //pinctrl-0 = <&phy_led_pins>; + pinctrl-names = "default"; + + blsp0_uart_pins: uart_pins { + blsp0_uart_rx_tx { + pins = "gpio20", "gpio21"; + function = "blsp0_uart0"; + bias-disable; + }; + }; + + blsp1_uart_pins: blsp1_uart_pins { + blsp1_uart_rx_tx { + pins = "gpio23", "gpio25"; + function = "blsp1_uart2"; + bias-disable; + }; + }; + + blsp0_spi_pins: blsp0_spi_pins { + mux { + pins = "gpio10", "gpio11", "gpio12", "gpio13"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-disable; + }; + }; + + qspi_nand_pins: qspi_nand_pins { + qspi_clock { + pins = "gpio9"; + function = "qspi_clk"; + drive-strength = <8>; + bias-disable; + }; + qspi_cs { + pins = "gpio8"; + function = "qspi_cs"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_0 { + pins = "gpio7"; + function = "qspi0"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_1 { + pins = "gpio6"; + function = "qspi1"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_2 { + pins = "gpio5"; + function = "qspi2"; + drive-strength = <8>; + bias-disable; + }; + qspi_data_3 { + pins = "gpio4"; + function = "qspi3"; + drive-strength = <8>; + bias-disable; + }; + }; + + phy_pins: phy_pins { + phy_intr { + pins = "gpio29"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + bias-disable; + }; + phy_reset { + pins = "gpio39"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + output-low; + }; + }; + + mdio1_pins: mdio_pinmux { + mux_0 { + pins = "gpio36"; + function = "mdc"; + drive-strength = <8>; + bias-pull-up; + }; + + mux_1 { + pins = "gpio37"; + function = "mdio"; + drive-strength = <8>; + bias-pull-up; + }; + }; + + phy_led_pins: phy_led_pins { + gephy_led_pin { + //pins = "gpio46"; + function = "led0"; + drive-strength = <8>; + bias-pull-down; + }; + }; + + button_pins: button_pins { + reset_button { + pins = "gpio32"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + }; + + led_pins: led_pins { + led_pwr { + pins = "gpio26"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + }; + + led_2g { + pins = "gpio31"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + }; + + led_5g { + pins = "gpio33"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + }; + }; + +}; + +&soc { + gpio_keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + + button@1 { + label = "reset_button"; + linux,code = ; + gpios = <&tlmm 32 GPIO_ACTIVE_LOW>; + linux,input-type = <1>; + debounce-interval = <60>; + }; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <&led_pins>; + pinctrl-names = "default"; + + led_power: led_pwr { + label = "green:led_pwr"; + gpios = <&tlmm 26 GPIO_ACTIVE_HIGH>; + default-state = "on"; + linux,default-trigger = "led_pwr"; + }; + + led_2g { + label = "green:wifi2"; + gpio = <&tlmm 33 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; + + led_5g { + label = "green:wifi5"; + gpio = <&tlmm 31 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; + }; +}; + +&usb3 { + status = "ok"; + device-power-gpio = <&tlmm 30 1>; +}; + +&eud { + status = "ok"; +}; + +&pcie_x1 { + status = "disabled"; + perst-gpio = <&tlmm 18 1>; +}; + +&pcie_x2 { + status = "disabled"; + perst-gpio = <&tlmm 15 1>; +}; + +&dwc_0 { + /delete-property/ #phy-cells; + /delete-property/ phys; + /delete-property/ phy-names; +}; + +&hs_m31phy_0 { + status = "ok"; +}; + +&pcie_x1phy { + status = "disabled"; +}; + +&pcie_x2phy { + status = "disabled"; +}; + +&pcie_x1_rp { + status = "disabled"; + + mhi_0: qcom,mhi@0 { + reg = <0 0 0 0 0 >; + }; +}; + +&pcie_x2_rp { + status = "disabled"; + + mhi_1: qcom,mhi@1 { + reg = <0 0 0 0 0 >; + + }; +}; + +&qfprom { + status = "ok"; +}; + +&tsens { + status = "ok"; +}; + +&qcom_q6v5_wcss { + qcom,multipd_arch; + memory-region = <&q6_mem_regions>; + qcom,share_bootargs; + qcom,bootargs_smem = <507>; + boot-args = <0x2 0x4 0x2 0xF 0x0 0x0>; + + /* IPQ5018 */ + q6v5_wcss_userpd1 { + m3_firmware = "IPQ5018/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 8 0>, + <&wcss_smp2p_in 9 0>, + <&wcss_smp2p_in 12 0>, + <&wcss_smp2p_in 11 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 8>, + <&wcss_smp2p_out 9>, + <&wcss_smp2p_out 10>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <1>; + qca,auto-restart; + qca,int_radio; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_ipq5018_data>, <&m3_dump>, + <&q6_etr_region>; + #else + memory-region = <&q6_ipq5018_data>, <&m3_dump>, + <&q6_etr_region>, <&q6_caldb_region>; + #endif + }; + + /* QCN6122 6G */ + q6v5_wcss_userpd2 { + m3_firmware = "qcn6122/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 16 0>, + <&wcss_smp2p_in 17 0>, + <&wcss_smp2p_in 20 0>, + <&wcss_smp2p_in 19 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 16>, + <&wcss_smp2p_out 17>, + <&wcss_smp2p_out 18>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <2>; + qca,auto-restart; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, + <&q6_qcn6122_etr_1>; + #else + memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>, + <&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>; + #endif + }; + + /* QCN6122 5G */ + q6v5_wcss_userpd3 { + m3_firmware = "qcn6122/m3_fw.mdt"; + interrupts-extended = <&wcss_smp2p_in 24 0>, + <&wcss_smp2p_in 25 0>, + <&wcss_smp2p_in 28 0>, + <&wcss_smp2p_in 27 0>; + interrupt-names ="fatal", + "ready", + "spawn_ack", + "stop-ack"; + qcom,smem-states = <&wcss_smp2p_out 24>, + <&wcss_smp2p_out 25>, + <&wcss_smp2p_out 26>; + qcom,smem-state-names = "shutdown", + "stop", + "spawn"; + qca,asid = <3>; + qca,auto-restart; + #ifdef __IPQ_MEM_PROFILE_256_MB__ + memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>, + <&q6_qcn6122_etr_2>; + #else + memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>, + <&q6_qcn6122_etr_2>, <&q6_qcn6122_caldb_2>; + #endif + }; +}; + +&qgic_msi_0 { + status = "ok"; +}; + +&qgic_msi_1 { + status = "ok"; +}; + +&wifi0 { + /* IPQ5018 */ + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd1"; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0x24>; + qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x4D400000 0x4D400000 0 0 0>; +#else + qcom,caldb-addr = <0x4D400000>; + m3-dump-addr = <0x4D200000>; +#endif + qcom,caldb-size = <0x200000>; + status = "ok"; +}; + +&wifi1 { + /* QCN6122 6G */ + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd2"; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0x60>; + qcom,bdf-addr = <0x4D600000 0x4D600000 0x4D300000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x4E800000 0x4E800000 0 0 0>; +#else + qcom,caldb-addr = <0x4E800000>; + m3-dump-addr = <0x4E600000>; +#endif + qcom,caldb-size = <0x500000>; + status = "disabled"; +}; + +&wifi2 { + /* QCN6122 5G */ + qcom,multipd_arch; + qcom,userpd-subsys-name = "q6v5_wcss_userpd3"; +#ifdef __IPQ_MEM_PROFILE_256_MB__ + qcom,tgt-mem-mode = <2>; +#else + qcom,tgt-mem-mode = <1>; +#endif + qcom,board_id = <0x60>; + qcom,bdf-addr = <0x4ED00000 0x4ED00000 0x4E400000 0x0 0x0>; +#ifdef __CNSS2__ + qcom,caldb-addr = <0x4FF00000 0x4FF00000 0 0 0>; +#else + qcom,caldb-addr = <0x4FF00000>; + m3-dump-addr = <0x4FD00000>; +#endif + qcom,caldb-size = <0x500000>; + status = "ok"; +}; diff --git a/feeds/ipq807x/ipq807x/image/ipq50xx.mk b/feeds/ipq807x/ipq807x/image/ipq50xx.mk index 2f609db64..38e19470a 100644 --- a/feeds/ipq807x/ipq807x/image/ipq50xx.mk +++ b/feeds/ipq807x/ipq807x/image/ipq50xx.mk @@ -27,6 +27,15 @@ define Device/liteon_wpx8324 endef TARGET_DEVICES += liteon_wpx8324 +define Device/muxi_ap3220l + DEVICE_TITLE := MUXI AP3220L + DEVICE_DTS := qcom-ipq5018-muxi-ap3220l + SUPPORTED_DEVICES := muxi,ap3220l + DEVICE_PACKAGES := ath11k-wifi-muxi-ap3220l ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122 + DEVICE_DTS_CONFIG := config@mp03.5-c1 +endef +TARGET_DEVICES += muxi_ap3220l + define Device/motorola_q14 DEVICE_TITLE := Motorola Q14 DEVICE_DTS := qcom-ipq5018-q14 diff --git a/feeds/wifi-ax/ath11k-wifi/Makefile b/feeds/wifi-ax/ath11k-wifi/Makefile index aa28d87af..ee3cbe177 100644 --- a/feeds/wifi-ax/ath11k-wifi/Makefile +++ b/feeds/wifi-ax/ath11k-wifi/Makefile @@ -40,6 +40,7 @@ ALLWIFIBOARDS:= \ indio-um-310ax-v1 \ indio-um-510axp-v1 \ indio-um-510axm-v1 \ + muxi-ap3220l \ plasmacloud-pax1800 \ wallys-dr6018 \ wallys-dr6018-v4 \ @@ -252,6 +253,7 @@ $(eval $(call generate-ath11k-wifi-package,tplink-ex227,TP-Link EX227)) $(eval $(call generate-ath11k-wifi-package,tplink-ex447,TP-Link EX447)) $(eval $(call generate-ath11k-wifi-package,yuncore-ax840,YunCore AX840)) $(eval $(call generate-ath11k-wifi-package,meshpp-s618,Mesh++ S618)) +$(eval $(call generate-ath11k-wifi-package,muxi-ap3220l,MUXI AP3220L)) $(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq5018)) diff --git a/feeds/wifi-ax/ath11k-wifi/board-muxi-ap3220l.bin.IPQ5018 b/feeds/wifi-ax/ath11k-wifi/board-muxi-ap3220l.bin.IPQ5018 new file mode 100644 index 0000000000000000000000000000000000000000..cdae0b9d3d829a8c881bb372e9e1b479e1b1e61a GIT binary patch literal 131072 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 literal 0 HcmV?d00001