/*
 *  BSD LICENSE
 *
 *  Copyright(c) 2016-2017 Broadcom.  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 Broadcom 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.
 */

	sata {
		compatible = "simple-bus";
		#address-cells = <1>;
		#size-cells = <1>;
		ranges = <0x0 0x0 0x67d00000 0x00800000>;

		sata0: ahci@210000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00210000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 339 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata0_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata0_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy0: sata_phy@212100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00212100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata0_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};

		sata1: ahci@310000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00310000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 347 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata1_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata1_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy1: sata_phy@312100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00312100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata1_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};

		sata2: ahci@120000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00120000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 333 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata2_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata2_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy2: sata_phy@122100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00122100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata2_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};

		sata3: ahci@130000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00130000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 335 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata3_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata3_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy3: sata_phy@132100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00132100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata3_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};

		sata4: ahci@330000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00330000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 351 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata4_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata4_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy4: sata_phy@332100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00332100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata4_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};

		sata5: ahci@400000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00400000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 353 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata5_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata5_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy5: sata_phy@402100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00402100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata5_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};

		sata6: ahci@410000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00410000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 355 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata6_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata6_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy6: sata_phy@412100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00412100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata6_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};

		sata7: ahci@420000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00420000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 357 IRQ_TYPE_LEVEL_HIGH>;
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata7_port0: sata-port@0 {
				reg = <0>;
				phys = <&sata7_phy0>;
				phy-names = "sata-phy";
			};
		};

		sata_phy7: sata_phy@422100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00422100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

			sata7_phy0: sata-phy@0 {
				reg = <0>;
				#phy-cells = <0>;
			};
		};
	};
