// SPDX-License-Identifier: GPL-2.0-only
/*
 * Device Tree Source for Meraki MR24 (Ikarem)
 *
 * Copyright (C) 2016 Chris Blake <chrisrblake93@gmail.com>
 *
 * Based on Cisco Meraki GPL Release r23-20150601 MR24 DTS
 */

/dts-v1/;

#include "apm82181.dtsi"

/ {
	model = "Meraki MR24 Access Point";
	compatible = "meraki,mr24", "meraki,ikarem", "apm,bluestone";

	aliases {
		serial0 = &UART1;
		led-boot = &status;
		led-failsafe = &failsafe;
		led-running = &status;
		led-upgrade = &status;
	};

	chosen {
		stdout-path = "/plb/opb/serial@ef600400";
	};
};


&CRYPTO {
	status = "okay";
};

&PKA {
	status = "okay";
};

&TRNG {
	status = "okay";
};

&EBC0 {
	/* Ikarem has 32MB of NAND */
	ndfc@1,0 {
		status = "okay";
		/* 32 MiB NAND Flash */
		nand {
			partition@0 {
				label = "u-boot";
				reg = <0x00000000 0x00150000>;
				read-only;
			};

			partition@150000 {
				/*
				 * The u-boot environment size is one NAND
				 * block (16KiB). u-boot allocates four NAND
				 * blocks (64KiB) in order to have spares
				 * around for bad block management
				 */
				label = "u-boot-env";
				reg = <0x00150000 0x00010000>;
				read-only;
			};

			partition@160000 {
				/*
				 * redundant u-boot environment.
				 * has to be kept it in sync with the
				 * data in "u-boot-env".
				 */
				label = "u-boot-env-redundant";
				reg = <0x00160000 0x00010000>;
				read-only;
			};

			partition@170000 {
				label = "oops";
				reg = <0x00170000 0x00010000>;
			};

			partition@180000 {
				label = "ubi";
				reg = <0x00180000 0x01e80000>;
			};
		};
	};
};

&UART1 {
	status = "okay";
};

&GPIO0 {
	status = "okay";
};

&IIC0 {
	status = "okay";
	/* Boot ROM is at 0x52-0x53, do not touch */
	/* Unknown chip at 0x6e, not sure what it is */
};

&EMAC0 {
	status = "okay";

	phy-mode = "rgmii-id";
	phy-map = <0x2>;
	phy-address = <0x1>;
	phy-handle = <&phy>;

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		phy: phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <1>;
		};
	};
};

&POB0 {
	leds {
		compatible = "gpio-leds";

		status: power-green {
			label = "mr24:green:power";
			gpios = <&GPIO0 18 GPIO_ACTIVE_LOW>;
		};

		failsafe: power-orange {
			label = "mr24:orange:power";
			gpios = <&GPIO0 19 GPIO_ACTIVE_LOW>;
		};

		lan {
			label = "mr24:green:wan";
			gpios = <&GPIO0 17 GPIO_ACTIVE_LOW>;
		};

		ssi-0 {
			label = "mr24:green:wifi1";
			gpios = <&GPIO0 23 GPIO_ACTIVE_LOW>;
		};

		ssi-1 {
			label = "mr24:green:wifi2";
			gpios = <&GPIO0 22 GPIO_ACTIVE_LOW>;
		};

		ssi-2 {
			label = "mr24:green:wifi3";
			gpios = <&GPIO0 21 GPIO_ACTIVE_LOW>;
		};

		ssi-3 {
			label = "mr24:green:wifi4";
			gpios = <&GPIO0 20 GPIO_ACTIVE_LOW>;
		};
	};

	keys {
		compatible = "gpio-keys";

		reset {
			/* Label as per Meraki's "MR24 Installation Guide" */
			label = "Factory Reset Button";
			linux,code = <KEY_RESTART>;
			interrupt-parent = <&UIC1>;
			interrupts = <0x15 IRQ_TYPE_EDGE_FALLING>;
			gpios = <&GPIO0 16 GPIO_ACTIVE_LOW>;
			debounce-interval = <60>;
		};
	};
};

&PCIE0 {
	status = "okay";
	/*
	 * relevant lspci topology:
	 *
	 *	-+-[0000:40]---00.0-[41-7f]----00.0-[42-45]--+-02.0-[43]----00.0
	 *	                                             +-03.0-[44]----00.0
	 *
	 */

	bridge@64,0 {
		reg = <0x00400000 0 0 0 0>;
		#address-cells = <3>;
		#size-cells = <2>;
		ranges;

		bridge@65,0 {
			/* IDT PES3T3 PCI Express Switch */
			compatible = "pci111d,8039";
			reg = <0x00410000 0 0 0 0>;
			#address-cells = <3>;
			#size-cells = <2>;
			ranges;

			bridge@66,2 {
				compatible = "pci111d,8039";
				reg = <0x00421000 0 0 0 0>;
				#address-cells = <3>;
				#size-cells = <2>;
				ranges;

				wifi0: wifi@67,0 {
					/* Atheros AR9380 2.4GHz */
					compatible = "pci168c,0030";
					reg = <0x00430000 0 0 0 0>;
					interrupts = <3>; /* INTC 4.1.1 */
				};
			};

			bridge@66,3 {
				compatible = "pci111d,8039";
				reg = <0x00421800 0 0 0 0>;
				#address-cells = <3>;
				#size-cells = <2>;
				ranges;

				wifi1: wifi@68,0 {
					/* Atheros AR9380 5GHz */
					compatible = "pci168c,0030";
					reg = <0x00440000 0 0 0 0>;
					interrupts = <4>; /* INTD 4.1.1 */
				};
			};
		};
	};
};

&MSI {
	status = "okay";
};