/*
 * Copyright (c) 2015-2017, 2019 ARM Limited
 * All rights reserved
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Authors: Andreas Sandberg
 */

/ {
	arm,hbi = <0x0>;
	arm,vexpress,site = <0xf>;
	interrupt-parent = <&gic>;
	#address-cells = <2>;
	#size-cells = <2>;

	gic: interrupt-controller@2c000000 {
		compatible = "arm,gic-v3";
		#interrupt-cells = <0x3>;
		#address-cells = <0x2>;
		ranges;
		interrupt-controller;
		redistributor-stride = <0x0 0x40000>; // 256kB stride
		reg = <0x0 0x2c000000 0x0 0x10000
		       0x0 0x2c010000 0x0 0x2000000 // room for 128 redistributors using 128K each (256K strided...)
		       0x0 0x0 0x0 0x0>;
		interrupts = <1 9 0xf04>;
		#size-cells = <0x2>;
		linux,phandle = <0x1>;
		phandle = <0x1>;

		gic-its@2e010000 {
			compatible = "arm,gic-v3-its";
			msi-controller;
			#msi-cells = <1>;
			reg = <0x0 0x2e010000 0 0x20000>;
		};
	};

	timer {
		compatible = "arm,cortex-a15-timer",
			     "arm,armv7-timer";
		interrupts = <1 13 0xf08>,
		             <1 14 0xf08>,
			     <1 11 0xf08>,
		             <1 10 0xf08>;
		clocks = <&osc_sys>;
		clock-names="apb_pclk";
	};

	pci {
		compatible = "pci-host-ecam-generic";
		device_type = "pci";
		#address-cells = <0x3>;
		#size-cells = <0x2>;
		#interrupt-cells = <0x1>;

		reg = <0x0 0x30000000 0x0 0x10000000>;

		ranges = <0x01000000 0x0 0x00000000  0x0 0x2f000000  0x0 0x00010000>,
		         <0x02000000 0x0 0x40000000  0x0 0x40000000  0x0 0x40000000>;

	/*
	  child unit address, #cells = #address-cells
	  child interrupt specifier, #cells = #interrupt-cells (INTA = 1, INTB = 2, INTC = 3 and INTD = 4)
	  interrupt-parent, phandle
	  parent unit address, #cells = #address-cells@gic
	  parent interrupt specifier, #cells = #interrupt-cells@gic
	*/
	interrupt-map = <0x0    0x0 0x0  0x1  &gic  0x0 0x0  0x0 0x44 0x1
		         0x800  0x0 0x0  0x1  &gic  0x0 0x0  0x0 0x45 0x1
		         0x1000 0x0 0x0  0x1  &gic  0x0 0x0  0x0 0x46 0x1
		         0x1800 0x0 0x0  0x1  &gic  0x0 0x0  0x0 0x47 0x1>;

	interrupt-map-mask = <0x001800 0x0 0x0 0x0>;
	dma-coherent;
	};

	kmi@1c060000 {
		compatible = "arm,pl050", "arm,primecell";
		reg = <0x0 0x1c060000 0x0 0x1000>;
		interrupts = <0 12 4>;
		clocks = <&v2m_clk24mhz>, <&osc_smb>;
		clock-names = "KMIREFCLK", "apb_pclk";
	};

	kmi@1c070000 {
		compatible = "arm,pl050", "arm,primecell";
		reg = <0x0 0x1c070000 0x0 0x1000>;
		interrupts = <0 13 4>;
		clocks = <&v2m_clk24mhz>, <&osc_smb>;
		clock-names = "KMIREFCLK", "apb_pclk";
	};

	uart0: uart@1c090000 {
		compatible = "arm,pl011", "arm,primecell";
		reg = <0x0 0x1c090000 0x0 0x1000>;
		interrupts = <0 5 4>;
		clocks = <&osc_peripheral>, <&osc_smb>;
		clock-names = "uartclk", "apb_pclk";
	};

	rtc@1c170000 {
		compatible = "arm,pl031", "arm,primecell";
		reg = <0x0 0x1c170000 0x0 0x1000>;
		interrupts = <0 4 4>;
		clocks = <&osc_smb>;
		clock-names = "apb_pclk";
	};

	v2m_clk24mhz: clk24mhz {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <24000000>;
		clock-output-names = "v2m:clk24mhz";
	};


	v2m_sysreg: sysreg@1c010000 {
		compatible = "arm,vexpress-sysreg";
		reg = <0 0x1c010000 0x0 0x1000>;
		gpio-controller;
		#gpio-cells = <2>;
	};

	vio@1c130000 {
		compatible = "virtio,mmio";
		reg = <0 0x1c130000 0x0 0x1000>;
		interrupts = <0 42 4>;
	};

	vio@1c140000 {
		compatible = "virtio,mmio";
		reg = <0 0x1c140000 0x0 0x1000>;
		interrupts = <0 43 4>;
	};

	dcc {
		compatible = "arm,vexpress,config-bus";
		arm,vexpress,config-bridge = <&v2m_sysreg>;

		osc_pxl: osc@5 {
			compatible = "arm,vexpress-osc";
			arm,vexpress-sysreg,func = <1 5>;
			freq-range = <23750000 1000000000>;
			#clock-cells = <0>;
			clock-output-names = "oscclk5";
		};

		osc_smb: osc@6 {
			compatible = "arm,vexpress-osc";
			arm,vexpress-sysreg,func = <1 6>;
			freq-range = <20000000 50000000>;
			#clock-cells = <0>;
			clock-output-names = "oscclk6";
		};

		osc_sys: osc@7 {
			compatible = "arm,vexpress-osc";
			arm,vexpress-sysreg,func = <1 7>;
			freq-range = <20000000 60000000>;
			#clock-cells = <0>;
			clock-output-names = "oscclk7";
		};
	};


	mcc {
		compatible = "arm,vexpress,config-bus";
		arm,vexpress,config-bridge = <&v2m_sysreg>;
		arm,vexpress,site = <0>;

		osc_peripheral: osc@2 {
			compatible = "arm,vexpress-osc";
			arm,vexpress-sysreg,func = <1 2>;
			freq-range = <24000000 24000000>;
			#clock-cells = <0>;
			clock-output-names = "v2m:oscclk2";
		};
	};
};
