/*
 * 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 = "spi-flash";
					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>;
	};
};
