From 324df5686110f668a7b9a0f59d5a15da097c66b6 Mon Sep 17 00:00:00 2001 From: Venkat Chimata Date: Wed, 28 Sep 2022 16:13:22 +0530 Subject: [PATCH] ipq50xx: Addp support for Liteon WPX8324 AP Specifications are: * CPU: Qualcomm IPQ5018 * RAM: 512 MB * Storage: 16MB ROR, 128MB NAND-optional. * Ethernet: 2x GBe * UART header * WLAN: QCN6122 + QCN8080 * 3x LED-s Installation instructions: Connect to UART, pins are like this (from the edge on LEDS): -> GND | RX | TX | GND | VCC Settings are 115200 8n1 1. Copy openwrt-ipq807x-liteon_wpx8324-squashfs-nand-factory.bin (attached) onto the board into /tmp/ 2. At board's command prompt, issue sysupgrade -n /tmp/openwrt-ipq807x-liteon_wpx8324-squashfs-nand-factory.bin Fixes: WIFI-10929 Signed-off-by: Venkat Chimata --- .github/workflows/build-dev.yml | 2 +- .../ipq807x/base-files/etc/board.d/01_leds | 5 + .../ipq807x/base-files/etc/board.d/02_network | 1 + .../etc/hotplug.d/firmware/10-ath11k-caldata | 4 +- .../base-files/lib/upgrade/platform.sh | 2 + .../boot/dts/qcom-ipq5018-liteon-wpx8324.dts | 23 + .../dts/qcom/qcom-ipq5018-liteon-wpx8324.dts | 812 ++++++++++++++++++ feeds/ipq807x/ipq807x/image/ipq50xx.mk | 9 + feeds/wifi-ax/ath11k-wifi/Makefile | 2 + .../board-liteon-wpx8324.bin.IPQ5018 | Bin 0 -> 131072 bytes .../board-liteon-wpx8324.bin.QCN6122 | Bin 0 -> 131072 bytes profiles/liteon_wpx8324.yml | 16 + 12 files changed, 874 insertions(+), 2 deletions(-) create mode 100644 feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-liteon-wpx8324.dts create mode 100755 feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-liteon-wpx8324.dts create mode 100644 feeds/wifi-ax/ath11k-wifi/board-liteon-wpx8324.bin.IPQ5018 create mode 100644 feeds/wifi-ax/ath11k-wifi/board-liteon-wpx8324.bin.QCN6122 create mode 100644 profiles/liteon_wpx8324.yml diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index 744784040..c56061029 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf196', 'cig_wf610d', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'indio_um-305ac', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'meshpp_s618_cp03', 'meshpp_s618_cp01', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'x64_vm' ] + target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf196', 'cig_wf610d', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'liteon_wpx8324', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'indio_um-305ac', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'meshpp_s618_cp03', 'meshpp_s618_cp01', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'x64_vm' ] steps: - uses: actions/checkout@v2 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 603bc9b6e..1fb1873e1 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/board.d/01_leds +++ b/feeds/ipq807x/ipq807x/base-files/etc/board.d/01_leds @@ -34,6 +34,11 @@ edgecore,eap104) ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy1tpt" ucidef_set_led_netdev "wan" "wan" "yellow:uplink" "eth0" ;; +liteon,wpx8324) + ucidef_set_led_wlan "wlan2g" "WLAN2G" "orange:wifi2" "phy0tpt" + ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy1tpt" + ucidef_set_led_netdev "wan" "wan" "blue:uplink" "eth0" + ;; hfcl,ion4xi|\ hfcl,ion4xe) ucidef_set_led_wlan "wlan5g" "WLAN5G" "blue:wifi5" "phy0tpt" 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 61b3d77b6..b1eef6cfd 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network +++ b/feeds/ipq807x/ipq807x/base-files/etc/board.d/02_network @@ -50,6 +50,7 @@ qcom_setup_interfaces() ;; edgecore,eap102|\ edgecore,eap104|\ + liteon,wpx8324|\ wallys,dr6018|\ cig,wf188n|\ cig,wf196) 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 a39bf0cbd..e42dae0dc 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 @@ -124,6 +124,7 @@ ath11k/IPQ5018/hw1.0/caldata.bin) case "$board" in cybertan,eww622-a1|\ edgecore,eap104|\ + liteon,wpx8324|\ motorola,q14|\ qcom,ipq5018-mp03.1) caldata_extract "0:ART" 0x1000 0x20000 @@ -140,7 +141,8 @@ ath11k/qcn6122/hw1.0/caldata_1.bin) ath11k/qcn6122/hw1.0/caldata_2.bin) case "$board" in motorola,q14|\ - edgecore,eap104) + edgecore,eap104|\ + liteon,wpx8324) caldata_extract "0:ART" 0x4c000 0x20000 ;; esac diff --git a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh index 22531c43b..9cfc3584d 100755 --- a/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh +++ b/feeds/ipq807x/ipq807x/base-files/lib/upgrade/platform.sh @@ -84,6 +84,7 @@ platform_check_image() { edgecore,eap101|\ edgecore,eap102|\ edgecore,eap104|\ + liteon,wpx8324|\ edgecore,eap106|\ hfcl,ion4xi|\ hfcl,ion4xe|\ @@ -151,6 +152,7 @@ platform_do_upgrade() { nand_upgrade_tar "$1" ;; edgecore,eap104|\ + liteon,wpx8324|\ edgecore,eap106) CI_UBIPART="rootfs1" [ "$(find_mtd_chardev rootfs)" ] && CI_UBIPART="rootfs" diff --git a/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-liteon-wpx8324.dts b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-liteon-wpx8324.dts new file mode 100644 index 000000000..7fbff974a --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm/boot/dts/qcom-ipq5018-liteon-wpx8324.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-liteon-wpx8324.dts" + +/ { + pmuv8: pmu { + compatible = "arm,cortex-a7-pmu"; + }; +}; diff --git a/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-liteon-wpx8324.dts b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-liteon-wpx8324.dts new file mode 100755 index 000000000..dc73934cd --- /dev/null +++ b/feeds/ipq807x/ipq807x/files/arch/arm64/boot/dts/qcom/qcom-ipq5018-liteon-wpx8324.dts @@ -0,0 +1,812 @@ +/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 = "Liteon WPX8324"; + compatible = "liteon,wpx8324", "qcom,ipq5018-mp03.5-c1", "qcom,ipq5018"; + interrupt-parent = <&intc>; + + aliases { + sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ + serial0 = &blsp1_uart1; + /*serial1 = &blsp1_uart2;*/ + ethernet0 = "/soc/dp1"; + ethernet1 = "/soc/dp2"; + }; + + 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 { + serial@78af000 { + status = "ok"; + }; + 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; + }; + }; + + spi_2: spi@78b7000 { /* BLSP1 QUP2 */ + pinctrl-0 = <&blsp2_spi0_pins>; + pinctrl-names = "default"; + cs-select = <0>; + status = "ok"; + + tpm0: slb9670@0 { + #address-cells = <1>; + #size-cells = <1>; + reg = <1>; /* CE1 */ + compatible = "infineon,slb9670"; + linux,modalias = "slb9670", "slb9670a11"; + 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>; + pinctrl-names = "default"; + phy-reset-gpio = <&tlmm 26 0>; + + ethernet-phy@0 { + reg = <28>; + }; + }; + + ess-instance { + num_devices = <0x1>; + ess-switch@0x39c00000 { + 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>; + mdiobus = <&mdio0>; + }; + port@1 { + port_id = <2>; + phy_address = <0x1c>; + mdiobus = <&mdio1>; + port_mac_sel = "QGMAC_PORT"; + }; + }; + led_source@0 { + source = <0>; + mode = "normal"; + speed = "all"; + blink_en = "enable"; + active = "high"; + }; + }; + }; + wifi0: wifi@c000000 { + status = "ok"; + }; + + 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 = <28>; + mdio-bus = <&mdio1>; + local-mac-address = [000000000000]; + phy-mode = "sgmii"; + }; + + qcom,test@0 { + status = "ok"; + }; + }; + + thermal-zones { + status = "ok"; + }; + leds { + compatible = "gpio-leds"; + pinctrl-0 = <&leds_pins>; + pinctrl-names = "default"; + + led_blue: led@19 { + label = "blue:uplink"; + gpios = <&tlmm 19 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + led_orange: led@18 { + label = "orange:wifi2"; + gpios = <&tlmm 18 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + led_green: led@39 { + label = "green:wifi5"; + gpios = <&tlmm 39 GPIO_ACTIVE_HIGH>; + default-state = "on"; + }; + }; +}; + +&tlmm { + pinctrl-0 = <&blsp0_uart_pins &phy_led_pins>; + pinctrl-names = "default"; + + leds_pins: leds_pins { + led_blue { + pins = "gpio19"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + }; + led_orange { + pins = "gpio18"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + }; + led_green { + pins = "gpio39"; + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + }; + }; + blsp0_uart_pins: uart_pins { + blsp0_uart_rx_tx { + pins = "gpio20", "gpio21"; + function = "blsp0_uart0"; + bias-disable; + }; + }; + + blsp0_spi_pins: blsp0_spi_pins { + mux { + pins = "gpio10", "gpio11", "gpio12", "gpio13"; + function = "blsp0_spi"; + drive-strength = <2>; + bias-disable; + }; + }; + + blsp2_spi0_pins: blsp2_spi0_pins { + mux { + pins = "gpio31", "gpio32", "gpio33", "gpio34"; + function = "blsp2_spi0"; + 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; + }; + }; + + 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 = "gpio18", "gpio19", "gpio39"; + /* function = "led0"; */ + function = "gpio"; + drive-strength = <8>; + bias-pull-down; + }; + }; + + i2c_pins: i2c_pins { + i2c_scl { + pins = "gpio25"; + function = "blsp2_i2c1"; + drive-strength = <8>; + bias-disable; + }; + + i2c_sda { + pins = "gpio26"; + function = "blsp2_i2c1"; + drive-strength = <8>; + bias-disable; + }; + }; + + button_pins: button_pins { + wps_button { + pins = "gpio29"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + }; +}; + +&soc { + gpio_keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + + button@1 { + label = "wps"; + linux,code = ; + gpios = <&tlmm 29 GPIO_ACTIVE_LOW>; + linux,input-type = <1>; + debounce-interval = <60>; + }; + }; +}; + +&usb3 { + status = "ok"; + device-power-gpio = <&tlmm 28 0>; +}; + +&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 = <0x1 0x4 0x3 0x0F 0x0 0x0>, + <0x2 0x4 0x2 0x12 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 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 87b599c5f..2f609db64 100644 --- a/feeds/ipq807x/ipq807x/image/ipq50xx.mk +++ b/feeds/ipq807x/ipq807x/image/ipq50xx.mk @@ -18,6 +18,15 @@ define Device/edgecore_eap104 endef TARGET_DEVICES += edgecore_eap104 +define Device/liteon_wpx8324 + DEVICE_TITLE := Liteon WPX8324 + DEVICE_DTS := qcom-ipq5018-liteon-wpx8324 + SUPPORTED_DEVICES := liteon,wpx8324 + DEVICE_PACKAGES := ath11k-wifi-liteon-wpx8324 ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122 + DEVICE_DTS_CONFIG := config@mp03.5-c1 +endef +TARGET_DEVICES += liteon_wpx8324 + 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 3798680d9..aa28d87af 100644 --- a/feeds/wifi-ax/ath11k-wifi/Makefile +++ b/feeds/wifi-ax/ath11k-wifi/Makefile @@ -36,6 +36,7 @@ ALLWIFIBOARDS:= \ sercomm-wallaby \ edgecore-eap102 \ edgecore-eap104 \ + liteon-wpx8324 \ indio-um-310ax-v1 \ indio-um-510axp-v1 \ indio-um-510axm-v1 \ @@ -243,6 +244,7 @@ $(eval $(call generate-ath11k-wifi-package,wallys-dr6018-v4,Wallys DR6018 V4)) $(eval $(call generate-ath11k-wifi-package,edgecore-eap101,EdgeCore EAP101)) $(eval $(call generate-ath11k-wifi-package,edgecore-eap102,Edgecore EAP102)) $(eval $(call generate-ath11k-wifi-package,edgecore-eap104,Edgecore EAP104)) +$(eval $(call generate-ath11k-wifi-package,liteon-wpx8324,Liteon WPX8324)) $(eval $(call generate-ath11k-wifi-package,indio-um-310ax-v1,Indio UM-310AX V1)) $(eval $(call generate-ath11k-wifi-package,indio-um-510axp-v1,Indio UM-510AXP V1)) $(eval $(call generate-ath11k-wifi-package,indio-um-510axm-v1,Indio UM-510AXM V1)) diff --git a/feeds/wifi-ax/ath11k-wifi/board-liteon-wpx8324.bin.IPQ5018 b/feeds/wifi-ax/ath11k-wifi/board-liteon-wpx8324.bin.IPQ5018 new file mode 100644 index 0000000000000000000000000000000000000000..c4cf19c7a6cb36067a5f1f88e7b88b1ede7ecb80 GIT binary patch literal 131072 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