// SPDX-License-Identifier: (GPL-2.0-or-later OR X11)
/*
 * Copyright 2013-2014 Freescale Semiconductor, Inc.
 * Copyright 2018-2023 TQ-Systems GmbH <linux@ew.tq-group.com>,
 * D-82229 Seefeld, Germany.
 * Author: Alexander Stein
 */

/dts-v1/;

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/linux-event-codes.h>
#include <dt-bindings/leds/common.h>
#include <dt-bindings/leds/leds-pca9532.h>
#include <dt-bindings/net/ti-dp83867.h>

#include "ls1021a-tqmls1021a.dtsi"

/ {
	model = "TQMLS102xA SOM on MBLS102xA";
	compatible = "tq,ls1021a-tqmls1021a-mbls102xa", "tq,ls1021a-tqmls1021a", "fsl,ls1021a";

	audio_mclk: audio-clock {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <25000000>;
	};

	backlight_dcu: backlight {
		compatible = "gpio-backlight";
		gpios = <&pca9530 0 GPIO_ACTIVE_LOW>;
		status = "disabled";
	};

	gpio-keys {
		compatible = "gpio-keys";
		autorepeat;

		switch-1 {
			label = "S6";
			linux,code = <BTN_0>;
			gpios = <&pca9554_0 0 GPIO_ACTIVE_LOW>;
		};

		btn2: switch-2 {
			label = "S7";
			linux,code = <BTN_1>;
			gpios = <&pca9554_0 1 GPIO_ACTIVE_LOW>;
		};

		switch-3 {
			label = "S8";
			linux,code = <BTN_2>;
			gpios = <&pca9554_0 2 GPIO_ACTIVE_LOW>;
		};
	};

	gpio_leds: gpio-leds {
		compatible = "gpio-leds";

		led-0 {
			color = <LED_COLOR_ID_GREEN>;
			function = LED_FUNCTION_STATUS;
			function-enumerator = <0>;
			gpios = <&pca9554_2 4 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "default-on";
		};

		led-1 {
			color = <LED_COLOR_ID_GREEN>;
			function = LED_FUNCTION_STATUS;
			function-enumerator = <1>;
			gpios = <&pca9554_2 5 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "default-on";
		};

		led-2 {
			color = <LED_COLOR_ID_GREEN>;
			function = LED_FUNCTION_STATUS;
			function-enumerator = <2>;
			gpios = <&pca9554_2 6 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "default-on";
		};

		led-3 {
			color = <LED_COLOR_ID_GREEN>;
			function = LED_FUNCTION_HEARTBEAT;
			function-enumerator = <0>;
			gpios = <&pca9554_2 7 GPIO_ACTIVE_LOW>;
			linux,default-trigger = "heartbeat";
		};
	};

	lvds_encoder: lvds-encoder {
		compatible = "ti,sn75lvds83", "lvds-encoder";
		power-supply = <&reg_3p3v>;
		status = "disabled";

		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;

				lvds_encoder_in: endpoint {};
			};

			port@1 {
				reg = <1>;

				lvds_encoder_out: endpoint {};
			};
		};
	};

	reg_1p2v: regulator-1p2v {
		compatible = "regulator-fixed";
		regulator-name = "1P2V";
		regulator-min-microvolt = <1200000>;
		regulator-max-microvolt = <1200000>;
		regulator-always-on;
		vin-supply = <&reg_3p3v>;
	};

	reg_3p3v: regulator-3p3v {
		compatible = "regulator-fixed";
		regulator-name = "3P3V";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-always-on;
	};

	hdmi_out: hdmi {
		compatible = "hdmi-connector";
		type = "a";
		ddc-i2c-bus = <&i2c0>;
		status = "disabled";

		port {
			hdmi_in: endpoint {
				remote-endpoint = <&sii9022a_out>;
			};
		};
	};

	display: panel {
		backlight = <&backlight_dcu>;
		enable-gpios = <&pca9554_1 3 GPIO_ACTIVE_HIGH>;
		status = "disabled";

		port {
			panel_in: endpoint {};
		};
	};

	sound {
		compatible = "fsl,imx-audio-tlv320aic32x4";
		model = "ls1021a-mbls1021a-tlv320aic32";
		ssi-controller = <&sai1>;
		audio-codec = <&tlv320aic32x4>;
	};

};

&can0 {
	xceiver-supply = <&reg_3p3v>;
	status = "okay";
};

&can1 {
	xceiver-supply = <&reg_3p3v>;
	status = "okay";
};

&dspi0 {
	status = "okay";
};

&enet0 {
	phy-handle = <&rgmii_phy0c>;
	phy-mode = "rgmii-id";
	mac-address = [ 00 00 00 00 00 00 ];
	status = "okay";
};

&enet1 {
	tbi-handle = <&tbi1>;
	phy-handle = <&sgmii_phy03>;
	phy-mode = "sgmii";
	mac-address = [ 00 00 00 00 00 00 ];
	status = "okay";
};

&enet2 {
	phy-handle = <&rgmii_phy04>;
	phy-mode = "rgmii-id";
	mac-address = [ 00 00 00 00 00 00 ];
	status = "okay";
};

&i2c0 {
	status = "okay";

	tlv320aic32x4: audio-codec@18 {
		compatible = "ti,tlv320aic32x4";
		reg = <0x18>;
		clocks = <&audio_mclk>;
		clock-names = "mclk";
		ldoin-supply = <&reg_3p3v>;
		iov-supply = <&reg_3p3v>;
	};

	pca9554_0: gpio-expander@20 {
		compatible = "nxp,pca9554";
		reg = <0x20>;
		gpio-controller;
		#gpio-cells = <2>;
		interrupt-parent = <&gpio0>;
		interrupts = <24 IRQ_TYPE_EDGE_FALLING>;
		interrupt-controller;
		#interrupt-cells = <2>;
		vcc-supply = <&reg_3p3v>;
		gpio-line-names = "BUTTON0", "BUTTON1",
				  "BUTTON2", "EMMC_SEL",
				  "DIP2", "DIP3",
				  "EXT_TOUCH_INT", "GPIO_1";
	};

	pca9554_1: gpio-expander@21 {
		compatible = "nxp,pca9554";
		reg = <0x21>;
		gpio-controller;
		#gpio-cells = <2>;
		interrupt-parent = <&gpio0>;
		interrupts = <25 IRQ_TYPE_EDGE_FALLING>;
		interrupt-controller;
		#interrupt-cells = <2>;
		vcc-supply = <&reg_3p3v>;
		gpio-line-names = "PCIE_PWR_EN", "MPCIE_DISABLE#",
				  "MPCIE_WAKE#", "LCD_BLT_EN",
				  "LCD_PWR_EN", "EC1_PHY_PWDN",
				  "EC3_PHY_PWDN", "SGMII_PHY_PWDN";
	};

	pca9554_2: gpio-expander@22 {
		compatible = "nxp,pca9554";
		reg = <0x22>;
		gpio-controller;
		#gpio-cells = <2>;
		interrupt-parent = <&extirq>;
		interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
		interrupt-controller;
		#interrupt-cells = <2>;
		vcc-supply = <&reg_3p3v>;
		gpio-line-names = "MUX_SEL0", "MUX_SEL1",
				  "MUX_SEL2", "MUX_SEL3",
				  "V95", "V96", "V97", "V98";
	};

	sii9022a: hdmi-transmitter@3b {
		compatible = "sil,sii9022";
		reg = <0x3b>;
		iovcc-supply = <&reg_3p3v>;
		cvcc12-supply = <&reg_1p2v>;
		interrupts = <GIC_SPI 167 IRQ_TYPE_EDGE_RISING>;
		#sound-dai-cells = <0>;
		sil,i2s-data-lanes = <0>;
		status = "disabled";

		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;

				sii9022a_in: endpoint {};
			};

			port@1 {
				reg = <1>;

				sii9022a_out: endpoint {
					remote-endpoint = <&hdmi_in>;
				};
			};
		};
	};

	stmpe811: port-expander@41 {
		compatible = "st,stmpe811";
		reg = <0x41>;
		interrupt-parent = <&gpio0>;
		interrupts = <23 IRQ_TYPE_EDGE_FALLING>;
		vcc-supply = <&reg_3p3v>;
		vio-supply = <&reg_3p3v>;

		gpio {
			compatible = "st,stmpe-gpio";
			gpio-controller;
			#gpio-cells = <2>;
			interrupt-controller;
			#interrupt-cells = <2>;
			/* GPIO 5-7 used for touch */
			st,norequest-mask = <0xf0>;
			gpio-line-names = "GPIO_ADC_I2C1_1",
					  "GPIO_ADC_I2C1_2",
					  "GPIO_ADC_I2C1_3",
					  "GPIO_ADC_I2C1_4";
		};

		touchscreen {
			compatible = "st,stmpe-ts";
			status = "disabled";
		};
	};

	pca9530: leds@60 {
		compatible = "nxp,pca9530";
		reg = <0x60>;
		gpio-controller;
		#gpio-cells = <2>;
		gpio-line-names = "PWM_0", "PWM_1";

		led-0 {
			type = <PCA9532_TYPE_GPIO>;
		};

		led-1 {
			type = <PCA9532_TYPE_GPIO>;
		};
	};

};

&i2c1 {
	status = "okay";
};

&lpuart0 {
	linux,rs485-enabled-at-boot-time;
	status = "okay";
};

&mdio0 {
	sgmii_phy03: ethernet-phy@3 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0x03>;
		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
		ti,clk-output-sel = <DP83867_CLK_O_SEL_OFF>;
		ti,dp83867-rxctrl-strap-quirk;
	};

	rgmii_phy04: ethernet-phy@4 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0x04>;
		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_50_NS>;
		ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
		ti,clk-output-sel = <DP83867_CLK_O_SEL_OFF>;
	};

	rgmii_phy0c: ethernet-phy@c {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <0x0c>;
		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_50_NS>;
		ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
		ti,clk-output-sel = <DP83867_CLK_O_SEL_OFF>;
	};
};

&pwm6 {
	status = "okay";
};

&pwm7 {
	status = "okay";
};

&sai1 {
	status = "okay";
};

&sata {
	status = "okay";
};

&uart0 {
	status = "okay";
};

&uart1 {
	status = "okay";
};

&usb3 {
	/*
	 * Although DR connector, VBUS is always driven, so
	 * restrict to host mode.
	 */
	dr_mode = "host";
	status = "okay";
};