/*
 *  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@0 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00000000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 321 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@2100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00002100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

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

		sata1: ahci@10000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00010000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 323 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@12100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00012100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

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

		sata2: ahci@20000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00020000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 325 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@22100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00022100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

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

		sata3: ahci@30000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00030000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 327 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@32100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00032100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

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

		sata4: ahci@100000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00100000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 329 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@102100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00102100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

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

		sata5: ahci@110000 {
			compatible = "brcm,iproc-ahci", "generic-ahci";
			reg = <0x00110000 0x1000>;
			reg-names = "ahci";
			interrupts = <GIC_SPI 331 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@112100 {
			compatible = "brcm,iproc-sr-sata-phy";
			reg = <0x00112100 0x1000>;
			reg-names = "phy";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";

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

		sata6: 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";

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

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

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

		sata7: 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";

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

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

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