[openwrt/openwrt] ipq806x: add support for Cisco Meraki MR42/MR52

LEDE Commits lede-commits at lists.infradead.org
Sun Nov 28 09:48:34 PST 2021


hauke pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/67f52012760ce553ba6393aaba77359a458deeda

commit 67f52012760ce553ba6393aaba77359a458deeda
Author: Matthew Hagan <mnhagan88 at gmail.com>
AuthorDate: Sun May 9 23:28:04 2021 +0100

    ipq806x: add support for Cisco Meraki MR42/MR52
    
    The MR42 and MR52 are two similar IPQ806x based devices from the Cisco
    Meraki "Cryptid" series.
    
      MR42 main features:
      -  IPQ8068 1.4GHz
      -  512MB RAM
      -  128MB NAND
      -  2x QCA9992 (2.4 & 5GHz)
      -  1x QCA9889 (2.4 & 5GHz)
      -  1x AR8033 PHY
      -  PoE/AC power
    
      MR52 main features:
      -  IPQ8068 1.4GHz
      -  512MB RAM
      -  128MB NAND
      -  2x QCA9994 (2.4 & 5GHz)
      -  1x QCA9889 (2.4 & 5GHz)
      -  2x AR8033 PHYs
      -  PoE/AC power
    
    (MR42 Only) Installation via diagnostic mode:
    
    If you can successfully complete step 1 then you can continue to install
    via this method without having to open the device. Otherwise please use
    the standard UART method. Please note that when booting via TFTP, some
    Ethernet devices, in particular those on laptops, will not connect in
    time, resulting in TFTP boot not succeeding. In this instance it is
    advised to connect via a switch.
    
      1. Hold down reset at power on and keep holding, after around 10 seconds
         if the orange LED changes behaviour to begin flashing, proceed to
         release reset, then press reset two times. Ensure that the LED has
         turned blue. Note that flashing will occur on some devices, but it
         will not be possible to change the LED colour using the reset button.
         In this case it will still be possible to continue with this install
         method.
    
      2. Set your IP to 192.168.1.250. Set up a TFTP server serving
         mr42_u-boot.mbn and
         openwrt-ipq806x-generic-meraki_mr42-initramfs-fit-uImage.itb, obtained
         from [1].
    
      3. Use telnet and connect to 192.168.1.1. Run the following commands to
         install u-boot. Note that all these commands are critical, an error
         will likely render the device unusable.
    
         Option 3.1:
           If you are sure you have set up the TFTP server correctly you can
           run this script on the device. This will download and flash the
           u-boot image immediately:
    
           `/etc/update_uboot.sh 192.168.1.250 mr42_u-boot.mbn`
    
           Once completed successfully, power off the device.
    
         Option 3.2:
           If you are unsure the TFTP server is correctly set up you can
           obtain the image and flash manually:
    
           3.2.1. `cd /tmp`
           3.2.2. `tftp-hpa 192.168.1.250 -m binary -c get mr42_u-boot.mbn`
           3.2.3. Confirm file has downloaded correctly by comparing the
                  md5sum:
    
                `md5sum mr42_u-boot.mbn`
    
           3.2.4. The following are the required commands to write the image.
    
                `echo 1 > /sys/devices/platform/msm_nand/boot_layout
                 mtd erase /dev/mtd1
                 nandwrite -pam /dev/mtd1 mr42_u-boot.mbn
                 echo 0 > /sys/devices/platform/msm_nand/boot_layout`
    
              Important: You must observe the output of the `nandwrite`
              command. Look for the following to verify writing is occurring:
    
                `Writing data to block 0 at offset 0x0
                 Writing data to block 1 at offset 0x20000
                 Writing data to block 2 at offset 0x40000`
    
              If you do not see this then do not power off the device. Check
              your previous commands and that mr42_u-boot.mbn was downloaded
              correctly. Once you are sure the image has been written you
              can proceed to power off the device.
    
      4. Hold the reset button and power on the device. This will immediately
         begin downloading the appropriate initramfs image and boot into it.
    
         Note: If the device does not download the initramfs, this is likely
         due to the interface not being brought up in time. Changing Ethernet
         source to a router or switch will likely resolve this. You can also
         try manually setting the link speed to 10Mb/s Half-Duplex.
    
      5. Once a solid white LED is displayed on the device, continue to the
         UART installation method, step 6.
    
    Standard installation via UART - MR42 & MR52
    
      1. Disassemble the device and connect a UART header. The header pinout
         is as follows:
    
           1 - 3.3v
           2 - TXD
           3 - RXD
           4 - GND
    
         Important: You should only connect TXD, RXD and GND. Connecting
         3.3v may damage the device.
    
      2. Set your IP to 192.168.1.250. Set up a TFTP server serving
         openwrt-ipq806x-generic-meraki_(mr42|mr52)-initramfs-fit-uImage.itb.
         Separately obtain the respective sysupgrade image.
    
      3. Run the following commands, preferably from a Linux host. The
         mentioned files, including ubootwrite.py and u-boot images, can be
         obtained from [1].
    
           `python ubootwrite.py --write=(mr42|mr52)_u-boot.bin`
    
         The default for "--serial" option is /dev/ttyUSB0.
    
      4. Power on the device. The ubootwrite script will upload the image to
         the device and launch it. The second stage u-boot will in turn load
         the initramfs image by TFTP, provided the TFTP server is running
         correctly. This process will take about 13 minutes. Once a solid
         white LED is displayed, the image has successfully finished
         loading. Note: If the image does not load via TFTP, try again with
         the Ethernet link to 10Mb/s Half-Duplex.
    
      5. (MR42 only) Do not connect over the network. Instead connect over
         the UART using minicom or similar tool. To replace u-boot with
         the network enabled version, please run the following commands.
         Note that in the provided initramfs images, the u-boot.mbn file
         is located in /root:
    
         If you have not used the provided initramfs, you must ensure you
         are using an image with "boot_layout" ECC configuration enabled in
         the Kernel. This will be version 5.10 or higher. If you do not do
         this correctly the device will be bricked.
    
           `insmod mtd-rw i_want_a_brick=1
            mtd erase /dev/mtd8
            nandwrite -pam /dev/mtd8 /root/mr42_u-boot.mbn`
    
         After running nandwrite, ensure you observe the following output:
    
           `Writing data to block 0 at offset 0x0
            Writing data to block 1 at offset 0x20000
            Writing data to block 2 at offset 0x40000`
    
      6. (Optional) If you have no further use for the Meraki OS, you can
         remove all other UBI volumes on ubi0 (mtd11), including diagnostic1,
         part.old, storage and part.safe. You must not remove the ubi1 ART
         partition (mtd12).
    
           `for i in diagnostic1 part.old storage part.safe ; do
            ubirmvol /dev/ubi0 -N $i
            done`
    
      7. Proceed to flash the sysupgrade image via luci, or else download or
         scp the image to /tmp and use the sysupgrade command.
    
    [1] The mentioned images and ubootwrite.py script can be found in this repo:
        https://github.com/clayface/openwrt-cryptid
    
    [2] The modified u-boot sources for the MR42 and MR52 are available:
        https://github.com/clayface/U-boot-MR52-20200629
    
    Signed-off-by: Matthew Hagan <mnhagan88 at gmail.com>
---
 .../linux/ipq806x/base-files/etc/board.d/01_leds   |   4 +
 .../ipq806x/base-files/etc/board.d/02_network      |   6 +
 .../etc/hotplug.d/firmware/11-ath10k-caldata       |  29 +++
 .../ipq806x/base-files/lib/upgrade/platform.sh     |   5 +
 .../arm/boot/dts/qcom-ipq8068-cryptid-common.dtsi  | 239 +++++++++++++++++++++
 .../files/arch/arm/boot/dts/qcom-ipq8068-mr42.dts  | 204 ++++++++++++++++++
 .../files/arch/arm/boot/dts/qcom-ipq8068-mr52.dts  | 230 ++++++++++++++++++++
 target/linux/ipq806x/image/Makefile                |  35 +++
 .../patches-5.10/0069-arm-boot-add-dts-files.patch |   4 +-
 9 files changed, 755 insertions(+), 1 deletion(-)

diff --git a/target/linux/ipq806x/base-files/etc/board.d/01_leds b/target/linux/ipq806x/base-files/etc/board.d/01_leds
index 097ba0afe1..2b259b9036 100644
--- a/target/linux/ipq806x/base-files/etc/board.d/01_leds
+++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds
@@ -21,6 +21,10 @@ edgecore,ecw5410)
 	ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy1tpt"
 	ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wlan5g" "phy0tpt"
 	;;
+meraki,mr52)
+	ucidef_set_led_netdev "eth0" "eth0" "green:lan1" "eth0"
+	ucidef_set_led_netdev "eth1" "eth1" "green:lan2" "eth1"
+	;;
 nec,wg2600hp)
 	ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy1tpt"
 	ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wlan5g" "phy0tpt"
diff --git a/target/linux/ipq806x/base-files/etc/board.d/02_network b/target/linux/ipq806x/base-files/etc/board.d/02_network
index 65a0e98b3b..4cb691f32e 100644
--- a/target/linux/ipq806x/base-files/etc/board.d/02_network
+++ b/target/linux/ipq806x/base-files/etc/board.d/02_network
@@ -44,6 +44,12 @@ linksys,ea8500)
 	ucidef_set_interface_macaddr "lan" "$hw_mac_addr"
 	ucidef_set_interface_macaddr "wan" "$hw_mac_addr"
 	;;
+meraki,mr42)
+	ucidef_set_interface_lan "eth0"
+	;;
+meraki,mr52)
+	ucidef_set_interfaces_lan_wan "eth0" "eth1"
+	;;
 nec,wg2600hp3)
 	ucidef_add_switch "switch0" \
 		"2:lan" "3:lan" "4:lan" "5:lan" "0 at eth1" "1:wan" "6 at eth0"
diff --git a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index 8de4e052cc..78315d4516 100644
--- a/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ipq806x/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -7,6 +7,14 @@
 board=$(board_name)
 
 case "$FIRMWARE" in
+"ath10k/cal-pci-0000:01:00.0.bin")
+	case "$board" in
+	meraki,mr52)
+		CI_UBIPART=art
+		caldata_extract_ubi "ART" 0x1000 0x844
+		;;
+	esac
+	;;
 "ath10k/pre-cal-pci-0000:01:00.0.bin")
 	case $board in
 	askey,rt4230w-rev6)
@@ -26,6 +34,10 @@ case "$FIRMWARE" in
 		caldata_extract "art" 0x1000 0x2f20
 		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) 1)
 		;;
+	meraki,mr42)
+		CI_UBIPART=art
+		caldata_extract_ubi "ART" 0x1000 0x2f20
+		;;
 	netgear,d7800 |\
 	netgear,r7500v2 |\
 	netgear,r7800 |\
@@ -64,6 +76,11 @@ case "$FIRMWARE" in
 		caldata_extract "art" 0x5000 0x2f20
 		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii devinfo hw_mac_addr) 2)
 		;;
+	meraki,mr42 |\
+	meraki,mr52)
+		CI_UBIPART=art
+		caldata_extract_ubi "ART" 0x5000 0x2f20
+		;;
 	netgear,d7800 |\
 	netgear,r7500v2 |\
 	netgear,r7800 |\
@@ -80,11 +97,23 @@ case "$FIRMWARE" in
 		;;
 	esac
 	;;
+"ath10k/cal-pci-0002:01:00.0.bin")
+	case "$board" in
+	meraki,mr42)
+		CI_UBIPART=art
+		caldata_extract_ubi "ART" 0x9000 0x844
+		;;
+	esac
+	;;
 "ath10k/pre-cal-pci-0002:01:00.0.bin")
 	case $board in
 	edgecore,ecw5410)
 		caldata_extract "0:art" 0x5000 0x2f20
 		;;
+	meraki,mr52)
+		CI_UBIPART=art
+		caldata_extract_ubi "ART" 0x9000 0x2f20
+		;;
 	esac
 	;;
 *)
diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
index 308d7017b3..3d96457dbd 100644
--- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh
@@ -45,6 +45,11 @@ platform_do_upgrade() {
 	linksys,ea8500)
 		platform_do_upgrade_linksys "$1"
 		;;
+	meraki,mr42 |\
+	meraki,mr52)
+		CI_KERNPART="bootkernel2"
+		nand_do_upgrade "$1"
+		;;
 	tplink,ad7200 |\
 	tplink,c2600)
 		PART_NAME="os-image:rootfs"
diff --git a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-cryptid-common.dtsi b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-cryptid-common.dtsi
new file mode 100644
index 0000000000..10ab4821e8
--- /dev/null
+++ b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-cryptid-common.dtsi
@@ -0,0 +1,239 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
+
+#include "qcom-ipq8064-v2.0.dtsi"
+
+/ {
+	memory {
+		device_type = "memory";
+		linux,usable-memory = <0x41500000 0x1ea00000>;
+		reg = <0x40000000 0x20000000>;
+	};
+
+	cpus {
+		idle-states {
+			CPU_SPC: spc {
+				status = "disabled";
+			};
+		};
+	};
+
+	chosen {
+		bootargs-append = " console=ttyMSM0,115200n8 ubi.mtd=ubi ubi.mtd=art";
+	};
+};
+
+&qcom_pinmux {
+	mdio0_pins_active: mdio0_pins_active {
+		mux {
+			pins = "gpio0", "gpio1";
+			function = "mdio";
+			drive-strength = <2>;
+			bias-pull-down;
+			output-low;
+		};
+
+		clk {
+			pins = "gpio1";
+			input-disable;
+		};
+	};
+
+	phy_active: phy_active {
+		phy {
+			pins = "gpio6", "gpio7";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-pull-down;
+			output-high;
+		};
+	};
+
+	uart1_pins: uart1_pins {
+		mux {
+			pins = "gpio51", "gpio52";
+			function = "gsbi1";
+			drive-strength = <4>;
+			bias-disable;
+		};
+	};
+};
+
+&gsbi1 {
+	status = "okay";
+	qcom,mode = <GSBI_PROT_UART_W_FC>;
+
+	serial at 12450000 {
+		status = "okay";
+
+		pinctrl-0 = <&uart1_pins>;
+		pinctrl-names = "default";
+	};
+};
+
+&pcie0 {
+	status = "okay";
+
+	/delete-property/ pinctrl-0;
+	/delete-property/ pinctrl-names;
+	/delete-property/ perst-gpios;
+
+	bridge at 0,0 {
+		reg = <0x0 0 0 0 0>;
+		#address-cells = <3>;
+		#size-cells = <2>;
+		ranges;
+
+		wifi0: wifi at 1,0 {
+			compatible = "qcom,ath10k";
+			status = "okay";
+			reg = <0x10000 0 0 0 0>;
+		};
+	};
+};
+
+&pcie1 {
+	status = "okay";
+
+	/delete-property/ pinctrl-0;
+	/delete-property/ pinctrl-names;
+	/delete-property/ perst-gpios;
+
+	bridge at 0,0 {
+		reg = <0x0 0 0 0 0>;
+		#address-cells = <3>;
+		#size-cells = <2>;
+		ranges;
+
+		wifi1: wifi at 1,0 {
+			compatible = "qcom,ath10k";
+			status = "okay";
+			reg = <0x10000 0 0 0 0>;
+		};
+	};
+};
+
+&pcie2 {
+	status = "okay";
+
+	/delete-property/ pinctrl-0;
+	/delete-property/ pinctrl-names;
+	/delete-property/ perst-gpios;
+
+	bridge at 0,0 {
+		reg = <0x0 0 0 0 0>;
+		#address-cells = <3>;
+		#size-cells = <2>;
+		ranges;
+
+		wifi2: wifi at 1,0 {
+			compatible = "qcom,ath10k";
+			status = "okay";
+			reg = <0x10000 0 0 0 0>;
+		};
+	};
+};
+
+&adm_dma {
+	status = "okay";
+};
+
+&nand_controller {
+	status = "okay";
+
+	pinctrl-0 = <&nand_pins>;
+	pinctrl-names = "default";
+
+	nand at 0 {
+		compatible = "qcom,nandcs";
+
+		reg = <0>;
+
+		nand-ecc-strength = <4>;
+		nand-bus-width = <8>;
+		nand-ecc-step-size = <512>;
+
+		nand-is-boot-medium;
+		qcom,boot_pages_size = <0x2140000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition at 0 {
+				label = "sbl1";
+				reg = <0x0 0x40000>;
+				read-only;
+			};
+
+			partition at 40000 {
+				label = "mibib";
+				reg = <0x40000 0x140000>;
+				read-only;
+			};
+
+			partition at 180000 {
+				label = "sbl2";
+				reg = <0x180000 0x140000>;
+				read-only;
+			};
+
+			partition at 2c0000 {
+				label = "sbl3";
+				reg = <0x2c0000 0x280000>;
+				read-only;
+			};
+
+			partition at 540000 {
+				label = "ddrconfig";
+				reg = <0x540000 0x120000>;
+				read-only;
+			};
+
+			partition at 660000 {
+				label = "ssd";
+				reg = <0x660000 0x120000>;
+				read-only;
+			};
+
+			partition at 780000 {
+				label = "tz";
+				reg = <0x780000 0x280000>;
+				read-only;
+			};
+
+			partition at a00000 {
+				label = "rpm";
+				reg = <0xa00000 0x280000>;
+				read-only;
+			};
+
+			partition at 1fc0000 {
+				label = "u-boot";
+				reg = <0x1fc0000 0x180000>;
+				read-only;
+			};
+
+			partition at 21c0000 {
+				label = "bootkernel1";
+				reg = <0x21c0000 0xa80000>;
+			};
+
+			partition at 2c40000 {
+				label = "bootkernel2";
+				reg = <0x2c40000 0xa80000>;
+			};
+
+			partition at 36c0000 {
+				label = "ubi";
+				reg = <0x36c0000 0x46c0000>;
+			};
+
+			partition at 7d80000 {
+				label = "art";
+				reg = <0x7d80000 0x200000>;
+				read-only;
+			};
+		};
+	};
+};
diff --git a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-mr42.dts b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-mr42.dts
new file mode 100644
index 0000000000..ccf2554ca3
--- /dev/null
+++ b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-mr42.dts
@@ -0,0 +1,204 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
+
+#include "qcom-ipq8068-cryptid-common.dtsi"
+
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "Meraki MR42";
+	compatible = "meraki,mr42", "qcom,ipq8064";
+
+	aliases {
+		serial1 = &gsbi1_serial;
+		ethernet0 = &gmac3;
+
+		led-boot = &led_active;
+		led-failsafe = &led_power;
+		led-running = &led_active;
+		led-upgrade = &led_active;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+		pinctrl-0 = <&button_pins>;
+		pinctrl-names = "default";
+
+		reset {
+			label = "reset";
+			gpios = <&qcom_pinmux 26 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+			debounce-interval = <60>;
+			wakeup-source;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+		pinctrl-0 = <&led_pins>;
+		pinctrl-names = "default";
+
+		led_power: power {
+			label = "orange:power";
+			gpios = <&qcom_pinmux 31 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_active: active {
+			label = "white:active";
+			gpios = <&qcom_pinmux 32 GPIO_ACTIVE_HIGH>;
+		};
+	};
+};
+
+&gmac3 {
+	status = "okay";
+
+	qcom,id = <3>;
+	mdiobus = <&mdio0>;
+
+	phy-mode = "sgmii";
+	phy-handle = <&phy2>;
+
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+};
+
+&gsbi2 {
+	status = "okay";
+	qcom,mode = <GSBI_PROT_I2C>;
+};
+
+&gsbi2_i2c {
+	status = "okay";
+
+	pinctrl-0 = <&i2c0_pins>;
+	pinctrl-names = "default";
+
+	ina2xx at 40 {
+		compatible = "ina219";
+		shunt-resistor = <40000>;
+		reg = <0x40>;
+	};
+
+	eeprom at 56 {
+		compatible = "atmel,24c64";
+		pagesize = <32>;
+		reg = <0x56>;
+		read-only;
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		mac_address: mac-address at 66 {
+			reg = <0x66 0x6>;
+		};
+	};
+};
+
+&gsbi6 {
+	qcom,mode = <GSBI_PROT_I2C>;
+	status = "okay";
+};
+
+&gsbi6_i2c {
+	status = "okay";
+
+	pinctrl-0 = <&i2c1_pins>;
+	pinctrl-names = "default";
+
+	tlc591xx at 40 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		compatible = "ti,tlc59108";
+		reg = <0x40>;
+
+		red at 0 {
+			label = "red:user";
+			reg = <0x0>;
+		};
+
+		green at 1 {
+			label = "green:user";
+			reg = <0x1>;
+		};
+
+		blue at 2 {
+			label = "blue:user";
+			reg = <0x2>;
+		};
+	};
+};
+
+&mdio0 {
+	status = "okay";
+
+	pinctrl-0 = <&mdio0_pins_active>, <&phy_active>;
+	pinctrl-names = "default";
+
+	phy2: ethernet-phy2 {
+		reg = <2>;
+
+		reset-gpios = <&qcom_pinmux 6 GPIO_ACTIVE_LOW>;
+		reset-assert-us = <24000>;
+
+		eee-broken-100tx;
+		eee-broken-1000t;
+	};
+};
+
+&qcom_pinmux {
+	i2c0_pins: i2c0_pins {
+		mux {
+			pins = "gpio24", "gpio25";
+			function = "gsbi2";
+			drive-strength = <2>;
+			bias-pull-up;
+			input;
+		};
+	};
+
+	button_pins: button_pins {
+		mux {
+			pins = "gpio26";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-pull-up;
+		};
+	};
+
+	i2c1_pins: i2c1_pins {
+		mux {
+			pins = "gpio29", "gpio30";
+			function = "gsbi6";
+			drive-strength = <2>;
+			bias-pull-up;
+			input;
+		};
+	};
+
+	led_pins: led_pins {
+		mux {
+			pins = "gpio31", "gpio32";
+			function = "gpio";
+			drive-strength = <12>;
+			bias-pull-down;
+			output-low;
+		};
+	};
+};
+
+&wifi0 {
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <1>;
+};
+
+&wifi1 {
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <2>;
+};
+
+&wifi2 {
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <3>;
+};
diff --git a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-mr52.dts b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-mr52.dts
new file mode 100644
index 0000000000..e1c233254d
--- /dev/null
+++ b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8068-mr52.dts
@@ -0,0 +1,230 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
+
+#include "qcom-ipq8068-cryptid-common.dtsi"
+
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "Meraki MR52";
+	compatible = "meraki,mr52", "qcom,ipq8064";
+
+	aliases {
+		serial1 = &gsbi1_serial;
+		mdio-gpio0 = &mdio_gpio0;
+		ethernet0 = &gmac2;
+		ethernet1 = &gmac3;
+
+		led-boot = &led_active;
+		led-failsafe = &led_power;
+		led-running = &led_active;
+		led-upgrade = &led_active;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+		pinctrl-0 = <&button_pins>;
+		pinctrl-names = "default";
+
+		reset {
+			label = "reset";
+			gpios = <&qcom_pinmux 25 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+			debounce-interval = <60>;
+			wakeup-source;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+		pinctrl-0 = <&led_pins>;
+		pinctrl-names = "default";
+
+		led_power: power {
+			label = "orange:power";
+			gpios = <&qcom_pinmux 19 GPIO_ACTIVE_HIGH>;
+		};
+
+		lan2_green {
+			label = "green:lan2";
+			gpios = <&qcom_pinmux 23 GPIO_ACTIVE_HIGH>;
+		};
+
+		lan1_green {
+			label = "green:lan1";
+			gpios = <&qcom_pinmux 24 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_active: active {
+			label = "white:active";
+			gpios = <&qcom_pinmux 26 GPIO_ACTIVE_LOW>;
+		};
+
+		lan2_orange {
+			label = "orange:lan2";
+			gpios = <&qcom_pinmux 60 GPIO_ACTIVE_HIGH>;
+		};
+
+		lan1_orange {
+			label = "orange:lan1";
+			gpios = <&qcom_pinmux 62 GPIO_ACTIVE_HIGH>;
+		};
+	};
+};
+
+&gmac2 {
+	status = "okay";
+
+	qcom,id = <2>;
+	mdiobus = <&mdio0>;
+
+	phy-mode = "sgmii";
+	phy-handle = <&phy0>;
+
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+};
+
+&gmac3 {
+	status = "okay";
+
+	qcom,id = <3>;
+	mdiobus = <&mdio_gpio0>;
+
+	phy-mode = "sgmii";
+	phy-handle = <&phy4>;
+
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <1>;
+};
+
+&gsbi7 {
+	status = "okay";
+	qcom,mode = <GSBI_PROT_I2C>;
+};
+
+&gsbi7_i2c {
+	status = "okay";
+
+	pinctrl-0 = <&i2c_pins>;
+	pinctrl-names = "default";
+
+	ina2xx at 45 {
+		compatible = "ina219";
+		shunt-resistor = <80000>;
+		reg = <0x45>;
+	};
+
+	tlc591xx at 49 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		compatible = "ti,tlc59108";
+		reg = <0x49>;
+
+		red at 0 {
+			label = "red:user";
+			reg = <0x0>;
+		};
+
+		green at 1 {
+			label = "green:user";
+			reg = <0x1>;
+		};
+
+		blue at 2 {
+			label = "blue:user";
+			reg = <0x2>;
+		};
+	};
+
+	eeprom at 52 {
+		compatible = "atmel,24c64";
+		pagesize = <32>;
+		reg = <0x52>;
+		read-only;
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		mac_address: mac-address at 66 {
+			reg = <0x66 0x6>;
+		};
+	};
+};
+
+&qcom_pinmux {
+	i2c_pins: i2c_pins {
+		mux {
+			pins = "gpio8", "gpio9";
+			function = "gsbi7";
+			drive-strength = <2>;
+			bias-pull-up;
+			input;
+		};
+	};
+
+	led_pins: led_pins {
+		mux {
+			pins = "gpio19", "gpio26";
+			function = "gpio";
+			drive-strength = <12>;
+			bias-pull-down;
+			output-low;
+		};
+	};
+
+	button_pins: button_pins {
+		mux {
+			pins = "gpio25";
+			function = "gpio";
+			drive-strength = <2>;
+			bias-pull-up;
+			input;
+		};
+	};
+};
+
+&soc {
+	mdio_gpio0: mdio {
+		compatible = "virtual,mdio-gpio";
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		status = "okay";
+
+		pinctrl-0 = <&mdio0_pins_active>, <&phy_active>;
+		pinctrl-names = "default";
+
+		gpios = <&qcom_pinmux 1 GPIO_ACTIVE_HIGH
+			 &qcom_pinmux 0 GPIO_ACTIVE_HIGH>;
+
+		phy0: ethernet-phy0 {
+			reg = <0>;
+			reset-gpios = <&qcom_pinmux 7 GPIO_ACTIVE_LOW>;
+			reset-assert-us = <24000>;
+		};
+
+		phy4: ethernet-phy4 {
+			reg = <4>;
+			reset-gpios = <&qcom_pinmux 6 GPIO_ACTIVE_LOW>;
+			reset-assert-us = <24000>;
+		};
+	};
+};
+
+&wifi0 {
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <4>;
+};
+
+&wifi1 {
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <3>;
+};
+
+&wifi2 {
+	nvmem-cells = <&mac_address>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <2>;
+};
diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile
index acb95347bf..fc0080cf84 100644
--- a/target/linux/ipq806x/image/Makefile
+++ b/target/linux/ipq806x/image/Makefile
@@ -192,6 +192,41 @@ define Device/linksys_ea8500
 endef
 TARGET_DEVICES += linksys_ea8500
 
+define Device/meraki_mr42
+	$(call Device/FitImage)
+	DEVICE_VENDOR := Cisco Meraki
+	DEVICE_MODEL := MR42
+	SOC := qcom-ipq8068
+	BLOCKSIZE := 128k
+	PAGESIZE := 2048
+	KERNEL_LOADADDR = 0x44208000
+	DEVICE_PACKAGES := -swconfig -kmod-ata-ahci -kmod-ata-ahci-platform \
+		-kmod-usb-ohci -kmod-usb2 -kmod-usb-ledtrig-usbport \
+		-kmod-phy-qcom-ipq806x-usb -kmod-usb3 -kmod-usb-dwc3-qcom \
+		-uboot-envtools ath10k-firmware-qca9887-ct \
+		ath10k-firmware-qca99x0-ct kmod-eeprom-at24 kmod-hwmon-ina2xx \
+		kmod-leds-tlc591xx
+endef
+TARGET_DEVICES += meraki_mr42
+
+define Device/meraki_mr52
+	$(call Device/FitImage)
+	DEVICE_VENDOR := Cisco Meraki
+	DEVICE_MODEL := MR52
+	SOC := qcom-ipq8068
+	BLOCKSIZE := 128k
+	PAGESIZE := 2048
+	KERNEL_LOADADDR = 0x44208000
+	DEVICE_DTS_CONFIG := config at 2
+	DEVICE_PACKAGES := -swconfig -kmod-ata-ahci -kmod-ata-ahci-platform \
+		-kmod-usb-ohci -kmod-usb2 -kmod-usb-ledtrig-usbport \
+		-kmod-phy-qcom-ipq806x-usb -kmod-usb3 -kmod-usb-dwc3-qcom \
+		-uboot-envtools ath10k-firmware-qca9887-ct \
+		ath10k-firmware-qca9984-ct kmod-eeprom-at24 kmod-hwmon-ina2xx \
+		kmod-leds-tlc591xx
+endef
+TARGET_DEVICES += meraki_mr52
+
 define Device/nec_wg2600hp
 	$(call Device/LegacyImage)
 	DEVICE_VENDOR := NEC
diff --git a/target/linux/ipq806x/patches-5.10/0069-arm-boot-add-dts-files.patch b/target/linux/ipq806x/patches-5.10/0069-arm-boot-add-dts-files.patch
index ca43a759ef..49ff218040 100644
--- a/target/linux/ipq806x/patches-5.10/0069-arm-boot-add-dts-files.patch
+++ b/target/linux/ipq806x/patches-5.10/0069-arm-boot-add-dts-files.patch
@@ -10,7 +10,7 @@ Signed-off-by: John Crispin <john at phrozen.org>
 
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -907,8 +907,27 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -907,8 +907,29 @@ dtb-$(CONFIG_ARCH_QCOM) += \
  	qcom-ipq4019-ap.dk04.1-c3.dtb \
  	qcom-ipq4019-ap.dk07.1-c1.dtb \
  	qcom-ipq4019-ap.dk07.1-c2.dtb \
@@ -35,6 +35,8 @@ Signed-off-by: John Crispin <john at phrozen.org>
 +	qcom-ipq8065-rt4230w-rev6.dtb \
 +	qcom-ipq8065-xr500.dtb \
 +	qcom-ipq8068-ecw5410.dtb \
++	qcom-ipq8068-mr42.dtb \
++	qcom-ipq8068-mr52.dtb \
  	qcom-msm8660-surf.dtb \
  	qcom-msm8960-cdp.dtb \
  	qcom-msm8974-fairphone-fp2.dtb \



More information about the lede-commits mailing list