// SPDX-License-Identifier: ISC
/*
 * Copyright (c) 2015 - 2016, The Linux Foundation. All rights reserved.
 * Copyright (c) 2020 Yanase Yuki <dev@zpc.sakura.ne.jp>
 */

#include "qcom-ipq4019.dtsi"
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/soc/qcom,tcsr.h>

/ {
	model = "Buffalo WTR-M2133HP";
	compatible = "buffalo,wtr-m2133hp", "qcom,ipq4019";

	memory {
		device_type = "memory";
		reg = <0x80000000 0x20000000>;
	};

	chosen {
		/*
		 * U-Boot adds "ubi.mtd=rootfs root=mtd:ubi_rootfs" to
		 * kernel command line. But we use different partition names,
		 * so we have to set correct parameters.
		 */
		bootargs-append = " ubi.mtd=ubi root=/dev/ubiblock0_1";
	};

	aliases {
		// TODO: Verify if the ethernet0 alias is needed
		ethernet0 = &gmac;
		led-boot = &led_power_blue;
		led-failsafe = &led_power_orange;
		led-running = &led_power_white;
		led-upgrade = &led_power_blue;
	};

	soc {
		tcsr@1949000 {
			compatible = "qcom,tcsr";
			reg = <0x1949000 0x100>;
			qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
		};

		tcsr@194b000 {
			compatible = "qcom,tcsr";
			reg = <0x194b000 0x100>;
			qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
			status = "okay";
		};

		ess_tcsr@1953000 {
			compatible = "qcom,tcsr";
			reg = <0x1953000 0x1000>;
			qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
		};

		tcsr@1957000 {
			compatible = "qcom,tcsr";
			reg = <0x1957000 0x100>;
			qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
		};
	};

	leds {
		compatible = "gpio-leds";

		led_power_white: power_white {
			function = LED_FUNCTION_POWER;
			color = <LED_COLOR_ID_WHITE>;
			gpios = <&tlmm 40 GPIO_ACTIVE_HIGH>;
		};

		led_power_orange: power_orange {
			function = LED_FUNCTION_POWER;
			color = <LED_COLOR_ID_ORANGE>;
			gpios = <&tlmm 25 GPIO_ACTIVE_HIGH>;
		};

		led_power_blue: power_blue {
			function = LED_FUNCTION_POWER;
			color = <LED_COLOR_ID_BLUE>;
			gpios = <&tlmm 43 GPIO_ACTIVE_HIGH>;
		};

		router_white {
			label = "white:router";
			gpios = <&tlmm 28 GPIO_ACTIVE_HIGH>;
		};

		router_orange {
			label = "orange:router";
			gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>;
		};

		internet_white {
			label = "white:internet";
			gpios = <&tlmm 27 GPIO_ACTIVE_HIGH>;
		};

		internet_orange {
			label = "orange:internet";
			gpios = <&tlmm 45 GPIO_ACTIVE_HIGH>;
		};

		wireless_white {
			label = "white:wireless";
			gpios = <&tlmm 24 GPIO_ACTIVE_HIGH>;
		};

		wireless_orange {
			label = "orange:wireless";
			gpios = <&tlmm 44 GPIO_ACTIVE_HIGH>;
		};
	};

	keys {
		compatible = "gpio-keys";

		auto_mode {
			label = "auto_mode";
			gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_0>;
			linux,input-type = <EV_SW>;
		};

		router_mode {
			label = "router_mode";
			gpios = <&tlmm 10 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_1>;
			linux,input-type = <EV_SW>;
		};

		ap_mode {
			label = "ap_mode";
			gpios = <&tlmm 11 GPIO_ACTIVE_LOW>;
			linux,code = <BTN_2>;
			linux,input-type = <EV_SW>;
		};

		reset {
			label = "reset";
			gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_RESTART>;
		};

		wps {
			label = "AOSS Button";
			gpios = <&tlmm 32 GPIO_ACTIVE_LOW>;
			linux,code = <KEY_WPS_BUTTON>;
		};
	};
};

&watchdog {
	status = "okay";
};

&prng {
	status = "okay";
};

&crypto {
	status = "okay";
};

&tlmm {
	serial_0_pins: serial0_pinmux {
		mux {
			pins = "gpio16", "gpio17";
			function = "blsp_uart0";
			bias-disable;
		};
	};

	mdio_pins: mdio_pinmux {
		mux_1 {
			pins = "gpio6";
			function = "mdio";
			bias-pull-up;
		};

		mux_2 {
			pins = "gpio7";
			function = "mdc";
			bias-pull-up;
		};
	};

	nand_pins: nand_pins {
		pullups {
			pins = "gpio52", "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;
		};
	};

	usb_power {
		line-name = "USB power";
		gpios = <34 GPIO_ACTIVE_HIGH>;
		gpio-hog;
		output-high;
	};
};

&blsp_dma {
	status = "okay";
};

&blsp1_uart1 {
	pinctrl-0 = <&serial_0_pins>;
	pinctrl-names = "default";
	status = "okay";
};

&cryptobam {
	status = "okay";
};

&pcie0 {
	status = "okay";
};

&pcie_bridge0 {
	wifi@0,0 {
		compatible = "qcom,ath10k";
		reg = <0x00010000 0 0 0 0>;
		nvmem-cell-names = "pre-calibration", "mac-address";
		nvmem-cells = <&precal_art_9000>, <&macaddr_orgdata_32>;
		qcom,ath10k-calibration-variant = "Buffalo-WTR-M2133HP";
	};
};

&qpic_bam {
	status = "okay";
};

&nand {
	pinctrl-0 = <&nand_pins>;
	pinctrl-names = "default";
	status = "okay";

	nand@0 {
		partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;

			partition@0 {
				label = "SBL1";
				reg = <0x0000000 0x0100000>;
				read-only;
			};

			partition@100000 {
				label = "MIBIB";
				reg = <0x0100000 0x0100000>;
				read-only;
			};

			partition@200000 {
				label = "BOOTCONFIG";
				reg = <0x0200000 0x0100000>;
				read-only;
			};

			partition@300000 {
				label = "QSEE";
				reg = <0x0300000 0x0100000>;
				read-only;
			};

			partition@400000 {
				label = "QSEE_1";
				reg = <0x0400000 0x0100000>;
				read-only;
			};

			partition@500000 {
				label = "CDT";
				reg = <0x0500000 0x0080000>;
				read-only;
			};

			partition@580000 {
				label = "CDT_1";
				reg = <0x0580000 0x0080000>;
				read-only;
			};

			partition@600000 {
				label = "BOOTCONFIG1";
				reg = <0x0600000 0x0080000>;
				read-only;
			};

			partition@680000 {
				label = "APPSBLENV";
				reg = <0x0680000 0x0080000>;
			};

			partition@700000 {
				label = "APPSBL";
				reg = <0x0700000 0x0200000>;
				read-only;
			};

			partition@900000 {
				label = "APPSBL_1";
				reg = <0x0900000 0x0200000>;
				read-only;
			};

			partition@b00000 {
				label = "ART";
				reg = <0x0b00000 0x0080000>;
				read-only;

				nvmem-layout {
					compatible = "fixed-layout";
					#address-cells = <1>;
					#size-cells = <1>;

					precal_art_1000: precal@1000 {
						reg = <0x1000 0x2f20>;
					};

					precal_art_5000: precal@5000 {
						reg = <0x5000 0x2f20>;
					};

					precal_art_9000: precal@9000 {
						reg = <0x5000 0x2f20>;
					};
				};
			};

			partition@b80000 {
				label = "ART_1";
				reg = <0x0b80000 0x0080000>;
				read-only;
			};

			orgdata: partition@c00000 {
				label = "ORGDATA";
				reg = <0x0c00000 0x0080000>;
				read-only;

				nvmem-layout {
					compatible = "fixed-layout";
					#address-cells = <1>;
					#size-cells = <1>;

					macaddr_orgdata_20: macaddr@20 {
						reg = <0x20 0x6>;
					};
					macaddr_orgdata_26: macaddr@26 {
						reg = <0x26 0x6>;
					};
					macaddr_orgdata_2c: macaddr@2c {
						reg = <0x2c 0x6>;
					};
					macaddr_orgdata_32: macaddr@32 {
						reg = <0x32 0x6>;
					};
				};
			};

			partition@c80000 {
				label = "ORGDATA_1";
				reg = <0x0c80000 0x0080000>;
				read-only;
			};

			partition@d00000 {
				label = "ubi";
				reg = <0x0d00000 0x2900000>;
			};

			partition@3600000 {
				label = "rootfs_recover";
				reg = <0x3600000 0x2900000>;
				read-only;
			};

			partition@5f00000 {
				label = "user_property";
				reg = <0x5f00000 0x1a20000>;
				read-only;
			};
		};
	};
};

&wifi0 {
	status = "okay";
	nvmem-cell-names = "pre-calibration", "mac-address";
	nvmem-cells = <&precal_art_1000>, <&macaddr_orgdata_26>;
	qcom,ath10k-calibration-variant = "Buffalo-WTR-M2133HP";
	ieee80211-freq-limit = <2400000 2483000>;
};

&wifi1 {
	status = "okay";
	nvmem-cell-names = "pre-calibration", "mac-address";
	nvmem-cells = <&precal_art_5000>, <&macaddr_orgdata_2c>;
	qcom,ath10k-calibration-variant = "Buffalo-WTR-M2133HP";
};

&switch {
	status = "okay";
};

&swport2 {
	status = "okay";
	label = "lan3";
};

&swport3 {
	status = "okay";
	label = "lan2";
};

&swport4 {
	status = "okay";
	label = "lan1";
};

&swport5 {
	status = "okay";
};

&gmac {
	status = "okay";
	nvmem-cell-names = "mac-address";
	nvmem-cells = <&macaddr_orgdata_20>;
};

&mdio {
	status = "okay";
	pinctrl-0 = <&mdio_pins>;
	pinctrl-names = "default";
	reset-gpios = <&tlmm 47 GPIO_ACTIVE_LOW>;
};

&usb3_ss_phy {
	status = "okay";
};

&usb3_hs_phy {
	status = "okay";
};

&usb3 {
	status = "okay";
};
