// SPDX-License-Identifier: GPL-2.0-or-later

/dts-v1/;

#include <dt-bindings/clock/bcm6358-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/interrupt-controller/bcm6358-interrupt-controller.h>
#include <dt-bindings/reset/bcm6358-reset.h>

/ {
	#address-cells = <1>;
	#size-cells = <1>;
	compatible = "brcm,bcm6358";

	aliases {
		pflash = &pflash;
		pinctrl = &pinctrl;
		serial0 = &uart0;
		serial1 = &uart1;
		spi0 = &lsspi;
	};

	chosen {
		bootargs = "earlycon";
		stdout-path = "serial0:115200n8";
	};

	clocks {
		periph_osc: periph-osc {
			compatible = "fixed-clock";

			#clock-cells = <0>;

			clock-frequency = <50000000>;
			clock-output-names = "periph";
		};
	};

	cpus {
		#address-cells = <1>;
		#size-cells = <0>;
		mips-hpt-frequency = <150000000>;

		cpu@0 {
			compatible = "brcm,bmips4350", "mips,mips4Kc";
			device_type = "cpu";
			reg = <0>;
		};

		cpu@1 {
			compatible = "brcm,bmips4350", "mips,mips4Kc";
			device_type = "cpu";
			reg = <1>;
		};
	};

	cpu_intc: interrupt-controller {
		#address-cells = <0>;
		compatible = "mti,cpu-interrupt-controller";

		interrupt-controller;
		#interrupt-cells = <1>;
	};

	memory@0 {
		device_type = "memory";
		reg = <0 0>;
	};

	pflash: nor@1e000000 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "cfi-flash";
		reg = <0x1e000000 0x2000000>;
		bank-width = <2>;

		status = "disabled";
	};

	ubus {
		#address-cells = <1>;
		#size-cells = <1>;

		compatible = "simple-bus";
		ranges;

		periph_clk: clock-controller@fffe0004 {
			compatible = "brcm,bcm6358-clocks";
			reg = <0xfffe0004 0x4>;
			#clock-cells = <1>;
		};

		pll_cntl: syscon@fffe0008 {
			compatible = "syscon", "simple-mfd";
			reg = <0xfffe0008 0x4>;
			native-endian;

			syscon-reboot {
				compatible = "syscon-reboot";
				offset = <0x0>;
				mask = <0x1>;
			};
		};

		periph_intc: interrupt-controller@fffe000c {
			#address-cells = <1>;
			compatible = "brcm,bcm6345-l1-intc";
			reg = <0xfffe000c 0x8>,
			      <0xfffe0038 0x8>;

			interrupt-controller;
			#interrupt-cells = <1>;

			interrupt-parent = <&cpu_intc>;
			interrupts = <2>, <3>;
		};

		ext_intc0: interrupt-controller@fffe0014 {
			#address-cells = <1>;
			compatible = "brcm,bcm6345-ext-intc";
			reg = <0xfffe0014 0x4>;

			interrupt-controller;
			#interrupt-cells = <2>;

			interrupts = <BCM6358_IRQ_EXT0>,
				     <BCM6358_IRQ_EXT1>,
				     <BCM6358_IRQ_EXT2>,
				     <BCM6358_IRQ_EXT3>;
		};

		ext_intc1: interrupt-controller@fffe001c {
			#address-cells = <1>;
			compatible = "brcm,bcm6345-ext-intc";
			reg = <0xfffe001c 0x4>;

			interrupt-controller;
			#interrupt-cells = <2>;

			interrupts = <BCM6358_IRQ_EXT4>,
				     <BCM6358_IRQ_EXT5>;
		};

		periph_rst: reset-controller@fffe0034 {
			compatible = "brcm,bcm6345-reset";
			reg = <0xfffe0034 0x4>;
			#reset-cells = <1>;
		};

		wdt: watchdog@fffe005c {
			compatible = "brcm,bcm7038-wdt";
			reg = <0xfffe005c 0xc>;

			clocks = <&periph_osc>;

			timeout-sec = <30>;
		};

		gpio: syscon@fffe0080 {
			compatible = "syscon", "simple-mfd";
			reg = <0xfffe0080 0x50>;
			native-endian;

			pinctrl: pin-controller {
				compatible = "brcm,bcm6358-pinctrl";

				gpio-controller;
				#gpio-cells = <2>;

				interrupts-extended = <&ext_intc1 0 0>,
						      <&ext_intc1 1 0>,
						      <&ext_intc0 0 0>,
						      <&ext_intc0 1 0>,
						      <&ext_intc0 2 0>,
						      <&ext_intc0 3 0>;
				interrupt-names = "gpio32",
						  "gpio33",
						  "gpio34",
						  "gpio35",
						  "gpio36",
						  "gpio37";

				pinctrl_ebi_cs: ebi_cs {
					function = "ebi_cs";
					groups = "ebi_cs_grp";
				};

				pinctrl_uart1: uart1 {
					function = "uart1";
					groups = "uart1_grp";
				};

				pinctrl_serial_led: serial_led {
					function = "serial_led";
					groups = "serial_led_grp";
				};

				pinctrl_legacy_led: legacy_led {
					function = "legacy_led";
					groups = "legacy_led_grp";
				};

				pinctrl_led: led {
					function = "led";
					groups = "led_grp";
				};

				pinctrl_spi_cs_23: spi_cs {
					function = "spi_cs";
					groups = "spi_cs_grp";
				};

				pinctrl_utopia: utopia {
					function = "utopia";
					groups = "utopia_grp";
				};

				pinctrl_pwm_syn_clk: pwm_syn_clk {
					function = "pwm_syn_clk";
					groups = "pwm_syn_clk_grp";
				};

				pinctrl_sys_irq: sys_irq {
					function = "sys_irq";
					groups = "sys_irq_grp";
				};
			};
		};

		leds: led-controller@fffe00d0 {
			#address-cells = <1>;
			#size-cells = <0>;
			compatible = "brcm,bcm6358-leds";
			reg = <0xfffe00d0 0x8>;

			status = "disabled";
		};

		uart0: serial@fffe0100 {
			compatible = "brcm,bcm6345-uart";
			reg = <0xfffe0100 0x18>;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_UART0>;

			clocks = <&periph_osc>;
			clock-names = "periph";

			status = "disabled";
		};

		uart1: serial@fffe0120 {
			compatible = "brcm,bcm6345-uart";
			reg = <0xfffe0120 0x18>;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_UART1>;

			clocks = <&periph_osc>;
			clock-names = "periph";

			status = "disabled";
		};

		lsspi: spi@fffe0800 {
			#address-cells = <1>;
			#size-cells = <0>;
			compatible = "brcm,bcm6358-spi";
			reg = <0xfffe0800 0x70c>;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_SPI>;

			clocks = <&periph_clk BCM6358_CLK_SPI>;
			clock-names = "spi";

			resets = <&periph_rst BCM6358_RST_SPI>;

			status = "disabled";
		};

		pci: pci@fffe1000 {
			compatible = "brcm,bcm6348-pci";
			reg = <0xfffe1000 0x200>,
			      <0x08000000 0x10000>;
			reg-names = "pci",
				    "pci-io";
			#address-cells = <3>;
			#size-cells = <2>;

			device_type = "pci";
			bus-range = <0x00 0x01>;
			ranges = <0x2000000 0 0x30000000 0x30000000 0 0x8000000>;
			linux,pci-probe-only = <1>;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_MPI>;

			resets = <&periph_rst BCM6358_RST_MPI>;
			reset-names = "pci";

			brcm,remap;

			status = "disabled";
		};

		ehci: usb@fffe1300 {
			compatible = "brcm,bcm6358-ehci", "generic-ehci";
			reg = <0xfffe1300 0x100>;
			big-endian;
			ignore-oc;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_EHCI>;

			phys = <&usbh 0>;
			phy-names = "usb";

			status = "disabled";
		};

		ohci: usb@fffe1400 {
			compatible = "brcm,bcm6358-ohci", "generic-ohci";
			reg = <0xfffe1400 0x100>;
			big-endian;
			no-big-frame-no;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_OHCI>;

			phys = <&usbh 0>;
			phy-names = "usb";

			status = "disabled";
		};

		usbh: usb-phy@fffe1500 {
			compatible = "brcm,bcm6358-usbh-phy";
			reg = <0xfffe1500 0x38>;

			#phy-cells = <1>;

			resets = <&periph_rst BCM6358_RST_USBH>;

			status = "disabled";
		};
	};
};