// SPDX-License-Identifier: GPL-2.0+
/*
 * Device Tree file for the Kontron SMARC-sAL28 board.
 *
 * Copyright (C) 2021 Michael Walle <michael@walle.cc>
 *
 */

/dts-v1/;
#include "fsl-ls1028a.dtsi"
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>

/ {
	model = "Kontron SMARC-sAL28";
	compatible = "kontron,sl28", "fsl,ls1028a";

	aliases {
		crypto = &crypto;
		serial0 = &duart0;
		serial1 = &duart1;
		serial2 = &lpuart1;
		spi0 = &fspi;
		spi1 = &dspi2;
		mmc0 = &esdhc1;
		mmc1 = &esdhc;
		rtc0 = &rtc;
		rtc1 = &ftm_alarm0;
	};

	buttons0 {
		compatible = "gpio-keys";

		power-button {
			interrupts-extended = <&sl28cpld_intc
					       4 IRQ_TYPE_EDGE_BOTH>;
			linux,code = <KEY_POWER>;
			label = "Power";
		};

		sleep-button {
			interrupts-extended = <&sl28cpld_intc
					       5 IRQ_TYPE_EDGE_BOTH>;
			linux,code = <KEY_SLEEP>;
			label = "Sleep";
		};
	};

	buttons1 {
		compatible = "gpio-keys-polled";
		poll-interval = <200>;

		lid-switch {
			linux,input-type = <EV_SW>;
			linux,code = <SW_LID>;
			gpios = <&sl28cpld_gpio3 4 GPIO_ACTIVE_LOW>;
			label = "Lid";
		};
	};

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

&can0 {
	status = "okay";
};

&dspi2 {
	status = "okay";
};

&duart0 {
	status = "okay";
};

&duart1 {
	status = "okay";
};

&enetc_mdio_pf3 {
	phy0: ethernet-phy@5 {
		reg = <0x5>;
		eee-broken-1000t;
		eee-broken-100tx;
	};
};

&enetc_port0 {
	phy-handle = <&phy0>;
	phy-mode = "sgmii";
	managed = "in-band-status";
	nvmem-cells = <&base_mac_address 0>;
	nvmem-cell-names = "mac-address";
	status = "okay";
};

&esdhc {
	sd-uhs-sdr104;
	sd-uhs-sdr50;
	sd-uhs-sdr25;
	sd-uhs-sdr12;
	status = "okay";
};

&esdhc1 {
	mmc-hs200-1_8v;
	mmc-hs400-1_8v;
	bus-width = <8>;
	status = "okay";
};

&fspi {
	status = "okay";

	flash@0 {
		compatible = "jedec,spi-nor";
		m25p,fast-read;
		spi-max-frequency = <133000000>;
		reg = <0>;
		/* The following setting enables 1-1-2 (CMD-ADDR-DATA) mode */
		spi-rx-bus-width = <2>; /* 2 SPI Rx lines */
		spi-tx-bus-width = <1>; /* 1 SPI Tx line */

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

			partition@0 {
				reg = <0x000000 0x010000>;
				label = "rcw";
				read-only;
			};

			partition@10000 {
				reg = <0x010000 0x1d0000>;
				label = "failsafe bootloader";
				read-only;
			};

			partition@200000 {
				reg = <0x200000 0x010000>;
				label = "configuration store";
			};

			partition@210000 {
				reg = <0x210000 0x1d0000>;
				label = "bootloader";
			};

			partition@3e0000 {
				reg = <0x3e0000 0x020000>;
				label = "bootloader environment";
			};
		};

		otp-1 {
			compatible = "user-otp";

			nvmem-layout {
				compatible = "kontron,sl28-vpd";

				serial_number: serial-number {
				};

				base_mac_address: base-mac-address {
					#nvmem-cell-cells = <1>;
				};
			};
		};
	};
};

&ftm_alarm0 {
	status = "okay";
};

&gpio1 {
	gpio-line-names =
		"", "", "", "", "", "", "", "",
		"", "", "", "", "", "", "", "",
		"", "", "", "", "", "", "TDO", "TCK",
		"", "", "", "", "", "", "", "";
};

&gpio2 {
	gpio-line-names =
		"", "", "", "", "", "", "TMS", "TDI",
		"", "", "", "", "", "", "", "",
		"", "", "", "", "", "", "", "",
		"", "", "", "", "", "", "", "";
};

&i2c0 {
	status = "okay";

	rtc: rtc@32 {
		compatible = "microcrystal,rv8803";
		reg = <0x32>;
	};

	sl28cpld@4a {
		compatible = "kontron,sl28cpld";
		reg = <0x4a>;
		#address-cells = <1>;
		#size-cells = <0>;

		watchdog@4 {
			compatible = "kontron,sl28cpld-wdt";
			reg = <0x4>;
			kontron,assert-wdt-timeout-pin;
		};

		hwmon@b {
			compatible = "kontron,sl28cpld-fan";
			reg = <0xb>;
		};

		sl28cpld_pwm0: pwm@c {
			compatible = "kontron,sl28cpld-pwm";
			reg = <0xc>;
			#pwm-cells = <2>;
		};

		sl28cpld_pwm1: pwm@e {
			compatible = "kontron,sl28cpld-pwm";
			reg = <0xe>;
			#pwm-cells = <2>;
		};

		sl28cpld_gpio0: gpio@10 {
			compatible = "kontron,sl28cpld-gpio";
			reg = <0x10>;
			interrupts-extended = <&gpio2 6
					       IRQ_TYPE_EDGE_FALLING>;

			gpio-controller;
			#gpio-cells = <2>;
			gpio-line-names =
				"GPIO0_CAM0_PWR_N", "GPIO1_CAM1_PWR_N",
				"GPIO2_CAM0_RST_N", "GPIO3_CAM1_RST_N",
				"GPIO4_HDA_RST_N", "GPIO5_PWM_OUT",
				"GPIO6_TACHIN", "GPIO7";

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		sl28cpld_gpio1: gpio@15 {
			compatible = "kontron,sl28cpld-gpio";
			reg = <0x15>;
			interrupts-extended = <&gpio2 6
					       IRQ_TYPE_EDGE_FALLING>;

			gpio-controller;
			#gpio-cells = <2>;
			gpio-line-names =
				"GPIO8", "GPIO9", "GPIO10", "GPIO11",
				"", "", "", "";

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		sl28cpld_gpio2: gpio@1a {
			compatible = "kontron,sl28cpld-gpo";
			reg = <0x1a>;

			gpio-controller;
			#gpio-cells = <2>;
			gpio-line-names =
				"LCD0 voltage enable",
				"LCD0 backlight enable",
				"eMMC reset", "LVDS bridge reset",
				"LVDS bridge power-down",
				"SDIO power enable",
				"", "";
		};

		sl28cpld_gpio3: gpio@1b {
			compatible = "kontron,sl28cpld-gpi";
			reg = <0x1b>;

			gpio-controller;
			#gpio-cells = <2>;
			gpio-line-names =
				"Power button", "Force recovery", "Sleep",
				"Battery low", "Lid state", "Charging",
				"Charger present", "";
		};

		sl28cpld_intc: interrupt-controller@1c {
			compatible = "kontron,sl28cpld-intc";
			reg = <0x1c>;
			interrupts-extended = <&gpio2 6
					       IRQ_TYPE_EDGE_FALLING>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};
	};

	eeprom@50 {
		compatible = "atmel,24c32";
		reg = <0x50>;
		pagesize = <32>;
	};
};

&i2c3 {
	status = "okay";
};

&i2c4 {
	status = "okay";

	eeprom@50 {
		compatible = "atmel,24c32";
		reg = <0x50>;
		pagesize = <32>;
	};
};

&lpuart1 {
	status = "okay";
};

&mscc_felix_port4 {
	dsa-tag-protocol = "ocelot-8021q";
};

&mscc_felix_port5 {
	dsa-tag-protocol = "ocelot-8021q";
};

&usb0 {
	status = "okay";
};

&usb1 {
	dr_mode = "host";
	status = "okay";
};