// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright (C) 2025 Toradex
 *
 * https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx95
 * https://www.toradex.com/products/carrier-board/smarc-development-board-kit
 */

/dts-v1/;

#include <dt-bindings/pwm/pwm.h>
#include "imx95-toradex-smarc.dtsi"

/ {
	model = "Toradex SMARC iMX95 on Toradex SMARC Development Board";
	compatible = "toradex,smarc-imx95-dev",
		     "toradex,smarc-imx95",
		     "fsl,imx95";

	reg_carrier_1p8v: regulator-carrier-1p8v {
		compatible = "regulator-fixed";
		regulator-max-microvolt = <1800000>;
		regulator-min-microvolt = <1800000>;
		regulator-name = "On-carrier 1V8";
	};

	sound {
		compatible = "simple-audio-card";
		simple-audio-card,bitclock-master = <&codec_dai>;
		simple-audio-card,format = "i2s";
		simple-audio-card,frame-master = <&codec_dai>;
		simple-audio-card,mclk-fs = <256>;
		simple-audio-card,name = "tdx-smarc-wm8904";
		simple-audio-card,routing =
			"Headphone Jack", "HPOUTL",
			"Headphone Jack", "HPOUTR",
			"IN2L", "Line In Jack",
			"IN2R", "Line In Jack",
			"Microphone Jack", "MICBIAS",
			"IN1L", "Microphone Jack";
		simple-audio-card,widgets =
			"Microphone", "Microphone Jack",
			"Headphone", "Headphone Jack",
			"Line", "Line In Jack";

		codec_dai: simple-audio-card,codec {
			clocks = <&scmi_clk IMX95_CLK_SAI3>;
			sound-dai = <&wm8904_1a>;
		};

		simple-audio-card,cpu {
			sound-dai = <&sai3>;
		};
	};
};

/* SMARC GBE0 */
&enetc_port0 {
	status = "okay";
};

/* SMARC GBE1 */
&enetc_port1 {
	status = "okay";
};

/* SMARC CAN0 */
&flexcan1 {
	status = "okay";
};

/* SMARC CAN1 */
&flexcan2 {
	status = "okay";
};

&gpio2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_gpio12>, <&pinctrl_gpio13>;
};

&gpio4 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_gpio10>, <&pinctrl_gpio11>;
};

&gpio5 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_gpio2>,
		    <&pinctrl_gpio3>,
		    <&pinctrl_gpio4>,
		    <&pinctrl_gpio6>,
		    <&pinctrl_gpio8>,
		    <&pinctrl_gpio9>;
};

/* SMARC I2C_CAM0 */
&i2c_cam0 {
	status = "okay";
};

/* SMARC I2C_CAM1 */
&i2c_cam1 {
	status = "okay";
};

/* SMARC I2C_GP */
&lpi2c2 {
	status = "okay";

	wm8904_1a: audio-codec@1a {
		compatible = "wlf,wm8904";
		reg = <0x1a>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_sai3>, <&pinctrl_sai3_mclk>;
		#sound-dai-cells = <0>;
		clocks = <&scmi_clk IMX95_CLK_SAI3>;
		clock-names = "mclk";
		AVDD-supply = <&reg_carrier_1p8v>;
		CPVDD-supply = <&reg_carrier_1p8v>;
		DBVDD-supply = <&reg_carrier_1p8v>;
		DCVDD-supply = <&reg_carrier_1p8v>;
		MICVDD-supply = <&reg_carrier_1p8v>;
	};

	temperature-sensor@4f {
		compatible = "ti,tmp1075";
		reg = <0x4f>;
	};

	eeprom@57 {
		compatible = "st,24c02", "atmel,24c02";
		reg = <0x57>;
		pagesize = <16>;
	};

};

/* SMARC I2C_PM */
&lpi2c3 {
	clock-frequency = <100000>;
	status = "okay";

	fan_controller: fan@18 {
		compatible = "ti,amc6821";
		reg = <0x18>;
		#pwm-cells = <2>;

		fan {
			cooling-levels = <255>;
			pwms = <&fan_controller 40000 PWM_POLARITY_INVERTED>;
		};
	};

	/* Current measurement into module VCC */
	hwmon@40 {
		compatible = "ti,ina226";
		reg = <0x40>;
		shunt-resistor = <5000>;
	};
};

/* SMARC I2C_LCD */
&lpi2c5 {
	status = "okay";

	i2c-mux@70 {
		compatible = "nxp,pca9543";
		reg = <0x70>;
		i2c-mux-idle-disconnect;
		#address-cells = <1>;
		#size-cells = <0>;

		/* I2C on DSI Connector Pins 4/6 */
		i2c_dsi_0: i2c@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;
		};

		/* I2C on DSI Connector Pins 52/54 */
		i2c_dsi_1: i2c@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;
		};
	};
};

/* SMARC SPI0 */
&lpspi6 {
	status = "okay";
};

/* SMARC SER1, used as the Linux Console */
&lpuart1 {
	status = "okay";
};

/* SMARC SER0, RS485 */
&lpuart2 {
	linux,rs485-enabled-at-boot-time;
	rs485-rts-active-low;
	rs485-rx-during-tx;
	status = "okay";
};

/* SMARC SER3, RS232 */
&lpuart3 {
	status = "okay";
};

/* SMARC MDIO, shared between all ethernet ports */
&netc_emdio {
	status = "okay";

	ethphy3: ethernet-phy@4 {
		reg = <4>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_gpio7>;
		interrupt-parent = <&gpio5>;
		interrupts = <9 IRQ_TYPE_LEVEL_LOW>;
	};
};

/* SMARC PCIE_A / M2 Key B */
&pcie0 {
	status = "okay";
};

/* SMARC PCIE_B /  M2 Key E */
&pcie1 {
	status = "okay";
};

/* SMARC I2S0 */
&sai3 {
	status = "okay";
};

/* SMARC LCD0_BKLT_PWM */
&tpm3 {
	status = "okay";
};

/* SMARC LCD1_BKLT_PWM */
&tpm4 {
	status = "okay";
};

/* SMARC GPIO5 as PWM */
&tpm5 {
	status = "okay";
};

/* SMARC USB0 */
&usb2 {
	status = "okay";
};

/* SMARC USB1..4 */
&usb3 {
	status = "okay";
};

&usb3_dwc3 {
	status = "okay";
};

&usb3_phy {
	status = "okay";
};

/* SMARC SDIO */
&usdhc2 {
	status = "okay";
};
