/*
 * Copyright (c) 2017 Piotr Mienkowski
 * Copyright (c) 2017 Justin Watson
 * Copyright (c) 2020 Stephanos Ioannidis <root@stephanos.io>
 * Copyright (c) 2019-2022 Gerson Fernando Budke <nandojve@gmail.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "sam_v71_xult-pinctrl.dtsi"

/ {
	aliases {
		i2c-0 = &twihs0;
		i2c-1 = &twihs2;
		led0 = &yellow_led1;
		pwm-led0 = &pwm_led0;
		pwm-0 = &pwm0;
		sw0 = &sw0_user_button;
		sw1 = &sw1_user_button;
		watchdog0 = &wdt;
	};

	chosen {
		zephyr,console = &usart1;
		zephyr,shell-uart = &usart1;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
		zephyr,canbus = &can1;
	};

	leds {
		compatible = "gpio-leds";
		yellow_led0: led_0 {
			gpios = <&pioa 23 GPIO_ACTIVE_LOW>;
			label = "User LED 0";
			status = "disabled";
		};
		yellow_led1: led_1 {
			gpios = <&pioc 9 GPIO_ACTIVE_LOW>;
			label = "User LED 1";
		};
	};

	pwmleds {
		compatible = "pwm-leds";
		pwm_led0: pwm_led_0 {
			pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>;
		};
	};

	gpio_keys {
		compatible = "gpio-keys";

		/* The switch is labeled SW300/301 in the schematic, and
		 * labeled SW0 on the board, and labeled ERASE User Button
		 * on docs
		 */
		sw0_user_button: button_1 {
			label = "User Button 0";
			gpios = <&pioa 9 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
		};
		sw1_user_button: button_2 {
			label = "User Button 1";
			gpios = <&piob 12 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
		};
	};

	ext1_header: xplained-pro-connector1 {
		compatible = "atmel-xplained-pro-header";
		#gpio-cells = <2>;
		gpio-map-mask = <0xffffffff 0xffffffc0>;
		gpio-map-pass-thru = <0 0x3f>;		/*           Shared */
		gpio-map =	<0  0 &pioc 31 0>,	/* AFE1 AD6         */
				<1  0 &pioa 19 0>,	/* AFE0 AD8         */
				<2  0 &piob  3 0>,	/* RTS0             */
				<3  0 &piob  2 0>,	/* CTS0             */
				<4  0 &pioa  0 0>,	/* PWMC0_H0         */
				<5  0 &pioc 30 0>,	/* TIOB5            */
				<6  0 &piod 28 0>,	/* WKUP5            */
				<7  0 &pioa  5 0>,	/* GPIO             */
				<8  0 &pioa  3 0>,	/* TWD0        EXT2 */
				<9  0 &pioa  4 0>,	/* TWCK0       EXT2 */
				<10 0 &piob  0 0>,	/* RXD0             */
				<11 0 &piob  1 0>,	/* TXD0             */
				<12 0 &piod 25 0>,	/* SPI0(NPCS1)      */
				<13 0 &piod 21 0>,	/* SPI0(MOSI)  EXT2 */
				<14 0 &piod 20 0>,	/* SPI0(MISO)  EXT2 */
				<15 0 &piod 22 0>;	/* SPI0(SCK)   EXT2 */
							/* GND              */
							/* +3.3V            */
	};

	ext2_header: xplained-pro-connector2 {
		compatible = "atmel-xplained-pro-header";
		#gpio-cells = <2>;
		gpio-map-mask = <0xffffffff 0xffffffc0>;
		gpio-map-pass-thru = <0 0x3f>;		/*           Shared */
		gpio-map =	<0  0 &piod 30 0>,	/* AFE0 AD0         */
				<1  0 &pioc 13 0>,	/* AFE1 AD1         */
				<2  0 &pioa  6 0>,	/* GPIO             */
				<3  0 &piod 11 0>,	/* GPIO             */
				<4  0 &pioc 19 0>,	/* PWMC0_H2         */
				<5  0 &piod 26 0>,	/* PWMC0_L2         */
				<6  0 &pioa  2 0>,	/* WKUP2            */
				<7  0 &pioa 24 0>,	/* GPIO             */
				<8  0 &pioa  3 0>,	/* TWD0        EXT1 */
				<9  0 &pioa  4 0>,	/* TWCK0       EXT1 */
				<10 0 &pioa 21 0>,	/* RXD1             */
				<11 0 &piob  4 0>,	/* TXD1             */
				<12 0 &piod 27 0>,	/* SPI0(NPCS3)      */
				<13 0 &piod 21 0>,	/* SPI0(MOSI)  EXT1 */
				<14 0 &piod 20 0>,	/* SPI0(MISO)  EXT1 */
				<15 0 &piod 22 0>;	/* SPI0(SCK)   EXT1 */
							/* GND              */
							/* +3.3V            */
	};

	arduino_header: connector {
		compatible = "arduino-header-r3";
		#gpio-cells = <2>;
		gpio-map-mask = <0xffffffff 0xffffffc0>;
		gpio-map-pass-thru = <0 0x3f>;		/*           Shared */
		gpio-map =	<0  0 &piod 26 0>,	/*  A0-TD           */
				<1  0 &pioc 31 0>,	/*  A1-AFE1 AD6   y */
				<2  0 &pioa 19 0>,	/*  A2-AFE0 AD8   y */
				<3  0 &piod 30 0>,	/*  A3-AFE0 AD0   y */
				<4  0 &pioc 13 0>,	/*  A4-AFE1 AD1   y */
				<5  0 &pioe  0 0>,	/*  A5-AFE1 AD11    */
				<6  0 &piod 28 0>,	/*  D0-URXD3        */
				<7  0 &piod 30 0>,	/*  D1-UTXD3        */
				<8  0 &pioa  0 0>,	/*  D2-PWMC0_H0     */
				<9  0 &pioa  6 0>,	/*  D3-GPIO         */
				<10 0 &piod 27 0>,	/*  D4-SPI0_NPCS3 y */
				<11 0 &piod 11 0>,	/*  D5-PWMC0_H0     */
				<12 0 &pioc 19 0>,	/*  D6-PWMC0_H2     */
				<13 0 &pioa  2 0>,	/*  D7-PWMC0_H1     */
				<14 0 &pioa  5 0>,	/*  D8-PWMC1_PWML3  */
				<15 0 &pioc  9 0>,	/*  D9-TIOB7        */
				<16 0 &piod 25 0>,	/* D10-SPI0_NPCS1 y */
				<17 0 &piod 21 0>,	/* D11-SPI0_MOSI  y */
				<18 0 &piod 20 0>,	/* D12-SPI0_MISO  y */
				<19 0 &piod 22 0>,	/* D13-SPI0_SPCK  y */
				<20 0 &pioa  3 0>,	/* D14-TWD0       y */
				<21 0 &pioa  4 0>;	/* D15-TWCK0      y */
	};
};

&cpu0 {
	clock-frequency = <300000000>;
};

&afec0 {
	status = "okay";

	pinctrl-0 = <&afec0_default>;
	pinctrl-names = "default";
};

&afec1 {
	status = "okay";

	pinctrl-0 = <&afec1_default>;
	pinctrl-names = "default";
};

&dacc {
	status = "okay";
};

&twihs0 {
	status = "okay";

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

	eeprom: eeprom@5f {
		compatible = "atmel,24mac402";
		reg = <0x5f>;
	};
};

&twihs2 {
	status = "okay";

	pinctrl-0 = <&twihs2_default>;
	pinctrl-names = "default";
};

&spi0 {
	status = "okay";

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

	cs-gpios = <&piod 25 GPIO_ACTIVE_LOW>,
		   <&piod 27 GPIO_ACTIVE_LOW>;

	dmas = <&xdmac 1 DMA_PERID_SPI0_TX>, <&xdmac 2 DMA_PERID_SPI0_RX>;
	dma-names = "tx", "rx";
};

&usart1 {
	status = "okay";
	current-speed = <115200>;

	pinctrl-0 = <&usart1_default>;
	pinctrl-names = "default";
};

&uart3 {
	status = "okay";
	current-speed = <115200>;


	pinctrl-0 = <&uart3_default>;
	pinctrl-names = "default";
};

&wdt {
	status = "okay";
};

zephyr_udc0: &usbhs {
	status = "okay";
};

&gmac {
	status = "okay";

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

	mac-eeprom = <&eeprom>;

	phy: phy {
		compatible = "ethernet-phy";
		status = "okay";
		address = <0>;
		mdio = <&mdio>;
	};
};

&mdio {
	status = "okay";

	pinctrl-0 = <&mdio_default>;
	pinctrl-names = "default";
};

&pwm0 {
	status = "okay";

	pinctrl-0 = <&pwm_default>;
	pinctrl-names = "default";
};

&pioa {
	status = "okay";
};

&piob {
	status = "okay";
};

&pioc {
	status = "okay";
};

&piod {
	status = "okay";
};

&pioe {
	status = "okay";
};

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

		/*
		 * The first half of sector 0 (64 kbytes)
		 * is reserved for the bootloader
		 */
		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x0 0x00010000>;
			read-only;
		};

		/* From sector 1 to sector 7 (included): slot0 (896 kbytes) */
		slot0_partition: partition@20000 {
			label = "image-0";
			reg = <0x00020000 0x000e0000>;
		};

		/* From sector 8 to sector 14 (included): slot1 (896 kbytes) */
		slot1_partition: partition@100000 {
			label = "image-1";
			reg = <0x00100000 0x000e0000>;
		};

		/* Sector 15: scratch (128 kbytes) */
		scratch_partition: partition@1e0000 {
			label = "image-scratch";
			reg = <0x001e0000 0x00020000>;
		};
	};
};

&ssc {
	status = "okay";

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

	dma-names = "rx", "tx";
	dmas = <&xdmac 22 DMA_PERID_SSC_RX>, <&xdmac 23 DMA_PERID_SSC_TX>;
};

&can1 {
	status = "okay";

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

	bus-speed = <125000>;
	bus-speed-data = <1000000>;

	can-transceiver {
		max-bitrate = <5000000>;
	};
};

ext1_spi: &spi0 {
};

ext1_i2c: &twihs0 {
};

ext1_serial: &usart0 {
};

ext2_spi: &spi0 {
};

ext2_i2c: &twihs0 {
};

ext2_serial: &usart1 {
};

arduino_spi: &spi0 {
};

arduino_i2c: &twihs0 {
};

arduino_serial: &uart3 {
};
