// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * at91-sama5d3_xplained.dts - Device Tree file for the SAMA5D3 Xplained board
 *
 *  Copyright (C) 2014 Atmel,
 *		  2014 Nicolas Ferre <nicolas.ferre@atmel.com>
 */
/dts-v1/;
#include "sama5d36.dtsi"

/ {
	model = "SAMA5D3 Xplained";
	compatible = "atmel,sama5d3-xplained", "atmel,sama5d3", "atmel,sama5";

	chosen {
		stdout-path = "serial0:115200n8";
	};

	memory@20000000 {
		reg = <0x20000000 0x10000000>;
	};

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

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

	ahb {
		apb {
			mmc0: mmc@f0000000 {
				pinctrl-0 = <&pinctrl_mmc0_clk_cmd_dat0 &pinctrl_mmc0_dat1_3 &pinctrl_mmc0_dat4_7 &pinctrl_mmc0_cd>;
				vmmc-supply = <&vcc_mmc0_reg>;
				vqmmc-supply = <&vcc_3v3_reg>;
				status = "okay";
				slot@0 {
					reg = <0>;
					bus-width = <8>;
					cd-gpios = <&pioE 0 GPIO_ACTIVE_LOW>;
				};
			};

			mmc1: mmc@f8000000 {
				vmmc-supply = <&vcc_3v3_reg>;
				vqmmc-supply = <&vcc_3v3_reg>;
				status = "disabled";
				slot@0 {
					reg = <0>;
					bus-width = <4>;
					cd-gpios = <&pioE 1 GPIO_ACTIVE_LOW>;
				};
			};

			spi0: spi@f0004000 {
				cs-gpios = <&pioD 13 0>, <0>, <0>, <&pioD 16 0>;
				status = "okay";
			};

			can0: can@f000c000 {
				status = "okay";
			};

			tcb0: timer@f0010000 {
				timer0: timer@0 {
					compatible = "atmel,tcb-timer";
					reg = <0>;
				};

				timer1: timer@1 {
					compatible = "atmel,tcb-timer";
					reg = <1>;
				};
			};

			i2c0: i2c@f0014000 {
				pinctrl-0 = <&pinctrl_i2c0_pu>;
				status = "okay";
			};

			i2c1: i2c@f0018000 {
				status = "okay";

				pmic: act8865@5b {
					compatible = "active-semi,act8865";
					reg = <0x5b>;
					status = "disabled";

					regulators {
						vcc_1v8_reg: DCDC_REG1 {
							regulator-name = "VCC_1V8";
							regulator-min-microvolt = <1800000>;
							regulator-max-microvolt = <1800000>;
							regulator-always-on;
						};

						vcc_1v2_reg: DCDC_REG2 {
							regulator-name = "VCC_1V2";
							regulator-min-microvolt = <1200000>;
							regulator-max-microvolt = <1200000>;
							regulator-always-on;
						};

						vcc_3v3_reg: DCDC_REG3 {
							regulator-name = "VCC_3V3";
							regulator-min-microvolt = <3300000>;
							regulator-max-microvolt = <3300000>;
							regulator-always-on;
						};

						vddfuse_reg: LDO_REG1 {
							regulator-name = "FUSE_2V5";
							regulator-min-microvolt = <2500000>;
							regulator-max-microvolt = <2500000>;
						};

						vddana_reg: LDO_REG2 {
							regulator-name = "VDDANA";
							regulator-min-microvolt = <3300000>;
							regulator-max-microvolt = <3300000>;
							regulator-always-on;
						};
					};
				};
			};

			macb0: ethernet@f0028000 {
				phy-mode = "rgmii-rxid";
				#address-cells = <1>;
				#size-cells = <0>;
				status = "okay";

				ethernet-phy@7 {
					reg = <0x7>;
				};
			};

			pwm0: pwm@f002c000 {
				pinctrl-names = "default";
				pinctrl-0 = <&pinctrl_pwm0_pwmh0_0 &pinctrl_pwm0_pwmh1_0>;
				status = "okay";
			};

			usart0: serial@f001c000 {
				status = "okay";
			};

			usart1: serial@f0020000 {
				pinctrl-0 = <&pinctrl_usart1 &pinctrl_usart1_rts_cts>;
				status = "okay";
			};

			uart0: serial@f0024000 {
				status = "okay";
			};

			mmc1: mmc@f8000000 {
				pinctrl-0 = <&pinctrl_mmc1_clk_cmd_dat0 &pinctrl_mmc1_dat1_3 &pinctrl_mmc1_cd>;
				status = "okay";
				slot@0 {
					reg = <0>;
					bus-width = <4>;
					cd-gpios = <&pioE 1 GPIO_ACTIVE_HIGH>;
				};
			};

			spi1: spi@f8008000 {
				cs-gpios = <&pioC 25 0>;
				status = "okay";
			};

			adc0: adc@f8018000 {
				atmel,adc-vref = <3300>;
				atmel,adc-channels-used = <0xfe>;
				pinctrl-0 = <
					&pinctrl_adc0_adtrg
					&pinctrl_adc0_ad1
					&pinctrl_adc0_ad2
					&pinctrl_adc0_ad3
					&pinctrl_adc0_ad4
					&pinctrl_adc0_ad5
					&pinctrl_adc0_ad6
					&pinctrl_adc0_ad7
					>;
				status = "okay";
			};

			i2c2: i2c@f801c000 {
				dmas = <0>, <0>;	/* Do not use DMA for i2c2 */
				pinctrl-0 = <&pinctrl_i2c2_pu>;
				status = "okay";
			};

			macb1: ethernet@f802c000 {
				phy-mode = "rmii";
				#address-cells = <1>;
				#size-cells = <0>;
				status = "okay";

				ethernet-phy@1 {
					reg = <0x1>;
				};
			};

			dbgu: serial@ffffee00 {
				status = "okay";
			};

			pinctrl@fffff200 {
				board {
					pinctrl_i2c0_pu: i2c0_pu {
						atmel,pins =
							<AT91_PIOA 30 AT91_PERIPH_A AT91_PINCTRL_PULL_UP>,
							<AT91_PIOA 31 AT91_PERIPH_A AT91_PINCTRL_PULL_UP>;
					};

					pinctrl_i2c2_pu: i2c2_pu {
						atmel,pins =
							<AT91_PIOA 18 AT91_PERIPH_B AT91_PINCTRL_PULL_UP>,
							<AT91_PIOA 19 AT91_PERIPH_B AT91_PINCTRL_PULL_UP>;
					};

					pinctrl_key_gpio: key_gpio_0 {
						atmel,pins =
							<AT91_PIOE 29 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
					};

					pinctrl_mmc0_cd: mmc0_cd {
						atmel,pins =
							<AT91_PIOE 0 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
					};

					pinctrl_mmc1_cd: mmc1_cd {
						atmel,pins =
							<AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
					};

					pinctrl_usba_vbus: usba_vbus {
						atmel,pins =
							<AT91_PIOE 9 AT91_PERIPH_GPIO AT91_PINCTRL_DEGLITCH>;	/* PE9, conflicts with A9 */
					};
					pinctrl_usb_default: usb_default {
						atmel,pins =
							<AT91_PIOE 3 AT91_PERIPH_GPIO AT91_PINCTRL_NONE
							 AT91_PIOE 4 AT91_PERIPH_GPIO AT91_PINCTRL_NONE>;
					};
				};
			};
		};

		usb0: gadget@500000 {
			atmel,vbus-gpio = <&pioE 9 GPIO_ACTIVE_HIGH>;	/* PE9, conflicts with A9 */
			pinctrl-names = "default";
			pinctrl-0 = <&pinctrl_usba_vbus>;
			status = "okay";
		};

		usb1: ohci@600000 {
			num-ports = <3>;
			atmel,vbus-gpio = <0
					   &pioE 3 GPIO_ACTIVE_LOW
					   &pioE 4 GPIO_ACTIVE_LOW
					  >;
			pinctrl-names = "default";
			pinctrl-0 = <&pinctrl_usb_default>;
			status = "okay";
		};

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

		ebi: ebi@10000000 {
			pinctrl-0 = <&pinctrl_ebi_nand_addr>;
			pinctrl-names = "default";
			status = "okay";

			nand_controller: nand-controller {
				status = "okay";

				nand@3 {
					reg = <0x3 0x0 0x2>;
					atmel,rb = <0>;
					nand-bus-width = <8>;
					nand-ecc-mode = "hw";
					nand-ecc-strength = <4>;
					nand-ecc-step-size = <512>;
					nand-on-flash-bbt;
					label = "atmel_nand";

					partitions {
						compatible = "fixed-partitions";
						#address-cells = <1>;
						#size-cells = <1>;

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

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

						bootloaderenvred@100000 {
							label = "bootloader env redundant";
							reg = <0x100000 0x40000>;
						};

						bootloaderenv@140000 {
							label = "bootloader env";
							reg = <0x140000 0x40000>;
						};

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

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

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

	vcc_mmc0_reg: fixedregulator_mmc0 {
		compatible = "regulator-fixed";
		gpio = <&pioE 2 GPIO_ACTIVE_LOW>;
		regulator-name = "mmc0-card-supply";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-always-on;
	};

	gpio_keys {
		compatible = "gpio-keys";

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

		bp3 {
			label = "PB_USER";
			gpios = <&pioE 29 GPIO_ACTIVE_LOW>;
			linux,code = <0x104>;
			wakeup-source;
		};
	};

	leds {
		compatible = "gpio-leds";

		d2 {
			label = "d2";
			gpios = <&pioE 23 GPIO_ACTIVE_LOW>;	/* PE23, conflicts with A23, CTS2 */
			linux,default-trigger = "heartbeat";
		};

		d3 {
			label = "d3";
			gpios = <&pioE 24 GPIO_ACTIVE_HIGH>;
		};
	};
};
