// 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/interrupt-controller/irq.h>
#include <dt-bindings/leds/common.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-cbr-reg = <0xff400000>;
		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>;

			interrupt-parent = <&periph_intc>;
			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>;

			interrupt-parent = <&periph_intc>;
			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_cntl: syscon@fffe0080 {
			#address-cells = <1>;
			#size-cells = <1>;
			compatible = "brcm,bcm6358-gpio-sysctl",
				     "syscon", "simple-mfd";
			reg = <0xfffe0080 0x50>;
			ranges = <0 0xfffe0080 0x80>;
			native-endian;

			gpio: gpio@0 {
				compatible = "brcm,bcm6358-gpio";
				reg-names = "dirout", "dat";
				reg = <0x0 0x8>, <0x8 0x8>;

				gpio-controller;
				gpio-ranges = <&pinctrl 0 0 40>;
				#gpio-cells = <2>;
			};

			pinctrl: pinctrl@18 {
				compatible = "brcm,bcm6358-pinctrl";
				reg = <0x18 0x4>;

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

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

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

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

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

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

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

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

				pinctrl_sys_irq: sys_irq-pins {
					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>;
			#address-cells = <3>;
			#size-cells = <2>;

			device_type = "pci";
			bus-range = <0x00 0x01>;
			ranges = <0x2000000 0 0x30000000 0x30000000 0 0x8000000>,
				 <0x1000000 0 0x08000000 0x08000000 0 0x0010000>;
			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;
			spurious-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";
		};

		ethernet0: ethernet@fffe4000 {
			compatible = "brcm,bcm6358-emac";
			reg = <0xfffe4000 0x2dc>;

			clocks = <&periph_clk BCM6358_CLK_ENET0>;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_EMAC0>,
					<BCM6358_IRQ_EMAC0_RX_DMA>,
					<BCM6358_IRQ_EMAC0_TX_DMA>;
			interrupt-names = "emac",
					  "rx",
					  "tx";

			brcm,iudma = <&iudma>;

			dma-rx = <0>;
			dma-tx = <1>;

			status = "disabled";

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

		ethernet1: ethernet@fffe4800 {
			compatible = "brcm,bcm6358-emac";
			reg = <0xfffe4800 0x2dc>;

			clocks = <&periph_clk BCM6358_CLK_ENET1>;

			interrupt-parent = <&periph_intc>;
			interrupts = <BCM6358_IRQ_EMAC1>,
				     <BCM6358_IRQ_EMAC1_RX_DMA>,
				     <BCM6358_IRQ_EMAC1_TX_DMA>;
			interrupt-names = "emac",
					  "rx",
					  "tx";

			brcm,iudma = <&iudma>;
			brcm,external-mii;

			dma-rx = <2>;
			dma-tx = <3>;

			status = "disabled";

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

		iudma: dma@fffe5000 {
			#address-cells = <1>;
			#size-cells = <1>;
			compatible = "brcm,bcm6358-iudma";
			reg = <0xfffe5000 0x24>,
			      <0xfffe5100 0x80>,
			      <0xfffe5200 0x80>;
			reg-names = "dma",
				    "dma-channels",
				    "dma-sram";

			dma-channels = <8>;

			clocks = <&periph_clk BCM6358_CLK_EMUSB>,
				 <&periph_clk BCM6358_CLK_USBSU>,
				 <&periph_clk BCM6358_CLK_EPHY>,
				 <&periph_clk BCM6358_CLK_ENET>;

			resets = <&periph_rst BCM6358_RST_ENET>,
				 <&periph_rst BCM6358_RST_EPHY>;

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