/*
 * at91-sama5d4_xplained.dts - Device Tree file for SAMA5D4 Xplained board
 *
 *  Copyright (C) 2015 Atmel,
 *                2015 Josh Wu <josh.wu@atmel.com>
 *
 * This file is dual-licensed: you can use it either under the terms
 * of the GPL or the X11 license, at your option. Note that this dual
 * licensing only applies to this file, and not this project as a
 * whole.
 *
 *  a) This file is free software; you can redistribute it and/or
 *     modify it under the terms of the GNU General Public License as
 *     published by the Free Software Foundation; either version 2 of the
 *     License, or (at your option) any later version.
 *
 *     This file is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU General Public License for more details.
 *
 * Or, alternatively,
 *
 *  b) Permission is hereby granted, free of charge, to any person
 *     obtaining a copy of this software and associated documentation
 *     files (the "Software"), to deal in the Software without
 *     restriction, including without limitation the rights to use,
 *     copy, modify, merge, publish, distribute, sublicense, and/or
 *     sell copies of the Software, and to permit persons to whom the
 *     Software is furnished to do so, subject to the following
 *     conditions:
 *
 *     The above copyright notice and this permission notice shall be
 *     included in all copies or substantial portions of the Software.
 *
 *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *     OTHER DEALINGS IN THE SOFTWARE.
 */
/dts-v1/;
#include "sama5d4.dtsi"

/ {
	model = "Atmel SAMA5D4 Xplained";
	compatible = "atmel,sama5d4-xplained", "atmel,sama5d4", "atmel,sama5";

	aliases {
		spi0 = &spi0;
	};

	chosen {
		u-boot,dm-pre-reloc;
		stdout-path = &usart3;
	};

	onewire_tm: onewire {
		gpios = <&pioE 15 GPIO_ACTIVE_LOW>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_onewire_tm_default>;
		status = "okay";

		w1_eeprom: w1_eeprom@0 {
			compatible = "maxim,ds24b33";
			status = "okay";
		};
	};

	memory {
		reg = <0x20000000 0x20000000>;
	};

	clocks {
		slow_xtal {
			clock-frequency = <32768>;
		};

		main_xtal {
			clock-frequency = <12000000>;
		};
	};

	ahb {
		apb {
			hlcdc: hlcdc@f0000000 {
				atmel,vl-bpix = <4>;
				atmel,guard-time = <1>;
				pinctrl-names = "default";
				pinctrl-0 = <&pinctrl_lcd_base &pinctrl_lcd_pwm &pinctrl_lcd_rgb888>;
				status = "okay";
				u-boot,dm-pre-reloc;

				display-timings {
					u-boot,dm-pre-reloc;
					480x272 {
						clock-frequency = <9000000>;
						hactive = <480>;
						vactive = <272>;
						hsync-len = <41>;
						hfront-porch = <2>;
						hback-porch = <2>;
						vfront-porch = <2>;
						vback-porch = <2>;
						vsync-len = <11>;
						u-boot,dm-pre-reloc;
					};
				};
			};

			spi0: spi@f8010000 {
				u-boot,dm-pre-reloc;
				cs-gpios = <&pioC 3 0>, <0>, <0>, <0>;
				status = "okay";
				spi_flash@0 {
					u-boot,dm-pre-reloc;
					compatible = "jedec,spi-nor";
					spi-max-frequency = <50000000>;
					reg = <0>;
				};
			};

			i2c0: i2c@f8014000 {
				status = "okay";

				i2c_eeprom: i2c_eeprom@5c {
					compatible = "atmel,24mac402";
					reg = <0x5c>;
				};
			};

			macb0: ethernet@f8020000 {
				phy-mode = "rmii";
				status = "okay";
				pinctrl-names = "default";
				pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;

				phy0: ethernet-phy@1 {
					interrupt-parent = <&pioE>;
					interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
					reg = <1>;
				};
			};

			mmc1: mmc@fc000000 {
				u-boot,dm-pre-reloc;
				pinctrl-names = "default";
				pinctrl-0 = <&pinctrl_mmc1_clk_cmd_dat0 &pinctrl_mmc1_dat1_3 &pinctrl_mmc1_cd>;
				vmmc-supply = <&vcc_mmc1_reg>;
				vqmmc-supply = <&vcc_3v3_reg>;
				status = "okay";
				slot@0 {
					reg = <0>;
					bus-width = <4>;
					cd-gpios = <&pioE 3 0>;
				};
			};

			usart3: serial@fc00c000 {
				u-boot,dm-pre-reloc;
				status = "okay";
			};

			usart4: serial@fc010000 {
				status = "okay";
			};

			spi1: spi@fc018000 {
				cs-gpios = <&pioB 21 0>;
				status = "okay";
			};

			adc0: adc@fc034000 {
				pinctrl-names = "default";
				pinctrl-0 = <
					/* external trigger conflicts with USBA_VBUS */
					&pinctrl_adc0_ad0
					&pinctrl_adc0_ad1
					&pinctrl_adc0_ad2
					&pinctrl_adc0_ad3
					&pinctrl_adc0_ad4
					>;
				atmel,adc-vref = <3300>;
				status = "okay";
			};

			watchdog@fc068640 {
				status = "okay";
			};

			pinctrl@fc06a000 {
				board {
					u-boot,dm-pre-reloc;
					pinctrl_mmc1_cd: mmc1_cd {
						u-boot,dm-pre-reloc;
						atmel,pins =
							<AT91_PIOE 3 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
					};
					pinctrl_usba_vbus: usba_vbus {
						atmel,pins =
							<AT91_PIOE 31 AT91_PERIPH_GPIO AT91_PINCTRL_DEGLITCH>;
					};
					pinctrl_key_gpio: key_gpio_0 {
						atmel,pins =
							<AT91_PIOE 8 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
					};
					pinctrl_macb0_phy_irq: macb0_phy_irq_0 {
						atmel,pins =
							<AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
					};
					pinctrl_onewire_tm_default: onewire_tm_default {
						atmel,pins =
							<AT91_PIOE 15 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP>;
					};
				};
			};
		};

		usb0: gadget@00400000 {
			atmel,vbus-gpio = <&pioE 31 GPIO_ACTIVE_HIGH>;
			pinctrl-names = "default";
			pinctrl-0 = <&pinctrl_usba_vbus>;
			status = "okay";
		};

		usb1: ohci@00500000 {
			num-ports = <3>;
			atmel,vbus-gpio = <0
					   &pioE 11 GPIO_ACTIVE_HIGH
					   &pioE 14 GPIO_ACTIVE_HIGH
					  >;
			status = "okay";
		};

		usb2: ehci@00600000 {
			status = "okay";
		};

		nand0: nand@80000000 {
			nand-bus-width = <8>;
			nand-ecc-mode = "hw";
			nand-on-flash-bbt;
			atmel,has-pmecc;
			status = "okay";

			at91bootstrap@0 {
				label = "at91bootstrap";
				reg = <0x0 0x40000>;
			};

			bootloader@40000 {
				label = "bootloader";
				reg = <0x40000 0x80000>;
			};

			bootloaderenv@c0000 {
				label = "bootloader env";
				reg = <0xc0000 0xc0000>;
			};

			dtb@180000 {
				label = "device tree";
				reg = <0x180000 0x80000>;
			};

			kernel@200000 {
				label = "kernel";
				reg = <0x200000 0x600000>;
			};

			rootfs@800000 {
				label = "rootfs";
				reg = <0x800000 0x0f800000>;
			};
		};
	};

	gpio_keys {
		compatible = "gpio-keys";

		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_key_gpio>;

		pb_user1 {
			label = "pb_user1";
			gpios = <&pioE 8 GPIO_ACTIVE_HIGH>;
			linux,code = <0x100>;
			wakeup-source;
		};
	};

	leds {
		compatible = "gpio-leds";
		status = "okay";

		d8 {
			label = "d8";
			gpios = <&pioD 30 GPIO_ACTIVE_HIGH>;
			default-state = "on";
		};

		d10 {
			label = "d10";
			gpios = <&pioE 15 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "heartbeat";
		};
	};

	vcc_3v3_reg: fixedregulator@0 {
		compatible = "regulator-fixed";
		regulator-name = "VCC 3V3";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-boot-on;
		regulator-always-on;
		reg = <0 1>;
	};

	vcc_mmc1_reg: fixedregulator@1 {
		compatible = "regulator-fixed";
		gpio = <&pioE 4 GPIO_ACTIVE_LOW>;
		regulator-name = "VDD MCI1";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		vin-supply = <&vcc_3v3_reg>;
		regulator-always-on;
		reg = <1 1>;
	};
};
