// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
/*
 * Device Tree Source for the R9A08G045S33 SMARC Carrier-II's SoM board.
 *
 * Copyright (C) 2023 Renesas Electronics Corp.
 */

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/rzg2l-pinctrl.h>

/*
 * On-board switches' states:
 * @SW_OFF: switch's state is OFF
 * @SW_ON:  switch's state is ON
 */
#define SW_OFF		0
#define SW_ON		1

/*
 * SW_CONFIG[x] switches' states:
 * @SW_CONFIG2:
 *	SW_OFF - SD0 is connected to eMMC
 *	SW_ON  - SD0 is connected to uSD0 card
 * @SW_CONFIG3:
 *	SW_OFF - SD2 is connected to SoC
 *	SW_ON  - SCIF1, SSI0, IRQ0, IRQ1 connected to SoC
 */
#define SW_CONFIG2	SW_ON
#define SW_CONFIG3	SW_ON

/ {
	compatible = "renesas,rzg3s-smarcm", "renesas,r9a08g045s33", "renesas,r9a08g045";

	aliases {
		mmc0 = &sdhi0;
#if SW_CONFIG3 == SW_OFF
		mmc2 = &sdhi2;
#else
		eth0 = &eth0;
		eth1 = &eth1;
#endif
	};

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

	memory@48000000 {
		device_type = "memory";
		/* First 128MB is reserved for secure area. */
		reg = <0x0 0x48000000 0x0 0x38000000>;
	};

	vcc_sdhi0: regulator0 {
		compatible = "regulator-fixed";
		regulator-name = "SDHI0 Vcc";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		gpios = <&pinctrl RZG2L_GPIO(2, 1) GPIO_ACTIVE_HIGH>;
		enable-active-high;
	};

#if SW_CONFIG2 == SW_ON
	vccq_sdhi0: regulator1 {
		compatible = "regulator-gpio";
		regulator-name = "SDHI0 VccQ";
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <3300000>;
		gpios = <&pinctrl RZG2L_GPIO(2, 2) GPIO_ACTIVE_HIGH>;
		gpios-states = <1>;
		states = <3300000 1>, <1800000 0>;
	};
#else
	reg_1p8v: regulator1 {
		compatible = "regulator-fixed";
		regulator-name = "fixed-1.8V";
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <1800000>;
		regulator-boot-on;
		regulator-always-on;
	};
#endif

	vcc_sdhi2: regulator2 {
		compatible = "regulator-fixed";
		regulator-name = "SDHI2 Vcc";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		gpios = <&pinctrl RZG2L_GPIO(8, 1) GPIO_ACTIVE_HIGH>;
		enable-active-high;
	};
};

#if SW_CONFIG3 == SW_ON
&eth0 {
	pinctrl-0 = <&eth0_pins>;
	pinctrl-names = "default";
	phy-handle = <&phy0>;
	phy-mode = "rgmii-id";
	status = "okay";

	phy0: ethernet-phy@7 {
		reg = <7>;
		interrupt-parent = <&pinctrl>;
		interrupts = <RZG2L_GPIO(12, 0) IRQ_TYPE_EDGE_FALLING>;
		rxc-skew-psec = <0>;
		txc-skew-psec = <0>;
		rxdv-skew-psec = <0>;
		txen-skew-psec = <0>;
		rxd0-skew-psec = <0>;
		rxd1-skew-psec = <0>;
		rxd2-skew-psec = <0>;
		rxd3-skew-psec = <0>;
		txd0-skew-psec = <0>;
		txd1-skew-psec = <0>;
		txd2-skew-psec = <0>;
		txd3-skew-psec = <0>;
	};
};

&eth1 {
	pinctrl-0 = <&eth1_pins>;
	pinctrl-names = "default";
	phy-handle = <&phy1>;
	phy-mode = "rgmii-id";
	status = "okay";

	phy1: ethernet-phy@7 {
		reg = <7>;
		interrupt-parent = <&pinctrl>;
		interrupts = <RZG2L_GPIO(12, 1) IRQ_TYPE_EDGE_FALLING>;
		rxc-skew-psec = <0>;
		txc-skew-psec = <0>;
		rxdv-skew-psec = <0>;
		txen-skew-psec = <0>;
		rxd0-skew-psec = <0>;
		rxd1-skew-psec = <0>;
		rxd2-skew-psec = <0>;
		rxd3-skew-psec = <0>;
		txd0-skew-psec = <0>;
		txd1-skew-psec = <0>;
		txd2-skew-psec = <0>;
		txd3-skew-psec = <0>;
	};
};
#endif

&extal_clk {
	clock-frequency = <24000000>;
};

#if SW_CONFIG2 == SW_ON
/* SD0 slot */
&sdhi0 {
	pinctrl-0 = <&sdhi0_pins>;
	pinctrl-1 = <&sdhi0_uhs_pins>;
	pinctrl-names = "default", "state_uhs";
	vmmc-supply = <&vcc_sdhi0>;
	vqmmc-supply = <&vccq_sdhi0>;
	bus-width = <4>;
	sd-uhs-sdr50;
	sd-uhs-sdr104;
	max-frequency = <125000000>;
	status = "okay";
};
#else
/* eMMC */
&sdhi0 {
	pinctrl-0 = <&sdhi0_emmc_pins>;
	pinctrl-1 = <&sdhi0_emmc_pins>;
	pinctrl-names = "default", "state_uhs";
	vmmc-supply = <&vcc_sdhi0>;
	vqmmc-supply = <&reg_1p8v>;
	bus-width = <8>;
	mmc-hs200-1_8v;
	non-removable;
	fixed-emmc-driver-type = <1>;
	max-frequency = <125000000>;
	status = "okay";
};
#endif

#if SW_CONFIG3 == SW_OFF
&sdhi2 {
	pinctrl-0 = <&sdhi2_pins>;
	pinctrl-names = "default";
	vmmc-supply = <&vcc_sdhi2>;
	bus-width = <4>;
	max-frequency = <50000000>;
	status = "okay";
};
#endif

&pinctrl {
	eth0-phy-irq-hog {
		gpio-hog;
		gpios = <RZG2L_GPIO(12, 0) GPIO_ACTIVE_LOW>;
		input;
		line-name = "eth0-phy-irq";
	};

	eth0_pins: eth0 {
		txc {
			pinmux = <RZG2L_PORT_PINMUX(1, 0, 1)>;  /* ET0_TXC */
			power-source = <1800>;
			output-enable;
			input-enable;
			drive-strength-microamp = <5200>;
		};

		tx_ctl {
			pinmux = <RZG2L_PORT_PINMUX(1, 1, 1)>;  /* ET0_TX_CTL */
			power-source = <1800>;
			output-enable;
			drive-strength-microamp = <5200>;
		};

		mux {
			pinmux = <RZG2L_PORT_PINMUX(1, 2, 1)>,	/* ET0_TXD0 */
				 <RZG2L_PORT_PINMUX(1, 3, 1)>,	/* ET0_TXD1 */
				 <RZG2L_PORT_PINMUX(1, 4, 1)>,	/* ET0_TXD2 */
				 <RZG2L_PORT_PINMUX(2, 0, 1)>,	/* ET0_TXD3 */
				 <RZG2L_PORT_PINMUX(3, 0, 1)>,	/* ET0_RXC */
				 <RZG2L_PORT_PINMUX(3, 1, 1)>,	/* ET0_RX_CTL */
				 <RZG2L_PORT_PINMUX(3, 2, 1)>,	/* ET0_RXD0 */
				 <RZG2L_PORT_PINMUX(3, 3, 1)>,	/* ET0_RXD1 */
				 <RZG2L_PORT_PINMUX(4, 0, 1)>,	/* ET0_RXD2 */
				 <RZG2L_PORT_PINMUX(4, 1, 1)>,	/* ET0_RXD3 */
				 <RZG2L_PORT_PINMUX(4, 3, 1)>,	/* ET0_MDC */
				 <RZG2L_PORT_PINMUX(4, 4, 1)>,	/* ET0_MDIO */
				 <RZG2L_PORT_PINMUX(4, 5, 1)>;	/* ET0_LINKSTA */
			power-source = <1800>;
		};
	};

	eth1-phy-irq-hog {
		gpio-hog;
		gpios = <RZG2L_GPIO(12, 1) GPIO_ACTIVE_LOW>;
		input;
		line-name = "eth1-phy-irq";
	};

	eth1_pins: eth1 {
		txc {
			pinmux = <RZG2L_PORT_PINMUX(7, 0, 1)>;	/* ET1_TXC */
			power-source = <1800>;
			output-enable;
			input-enable;
			drive-strength-microamp = <5200>;
		};

		tx_ctl {
			pinmux = <RZG2L_PORT_PINMUX(7, 1, 1)>;	/* ET1_TX_CTL */
			power-source = <1800>;
			output-enable;
			drive-strength-microamp = <5200>;
		};

		mux {
			pinmux = <RZG2L_PORT_PINMUX(7, 2, 1)>,	/* ET1_TXD0 */
				 <RZG2L_PORT_PINMUX(7, 3, 1)>,	/* ET1_TXD1 */
				 <RZG2L_PORT_PINMUX(7, 4, 1)>,	/* ET1_TXD2 */
				 <RZG2L_PORT_PINMUX(8, 0, 1)>,	/* ET1_TXD3 */
				 <RZG2L_PORT_PINMUX(8, 4, 1)>,	/* ET1_RXC */
				 <RZG2L_PORT_PINMUX(9, 0, 1)>,	/* ET1_RX_CTL */
				 <RZG2L_PORT_PINMUX(9, 1, 1)>,	/* ET1_RXD0 */
				 <RZG2L_PORT_PINMUX(9, 2, 1)>,	/* ET1_RXD1 */
				 <RZG2L_PORT_PINMUX(9, 3, 1)>,	/* ET1_RXD2 */
				 <RZG2L_PORT_PINMUX(10, 0, 1)>,	/* ET1_RXD3 */
				 <RZG2L_PORT_PINMUX(10, 2, 1)>,	/* ET1_MDC */
				 <RZG2L_PORT_PINMUX(10, 3, 1)>,	/* ET1_MDIO */
				 <RZG2L_PORT_PINMUX(10, 4, 1)>;	/* ET1_LINKSTA */
			power-source = <1800>;
		};
	};

	sdhi0_pins: sd0 {
		data {
			pins = "SD0_DATA0", "SD0_DATA1", "SD0_DATA2", "SD0_DATA3";
			power-source = <3300>;
		};

		ctrl {
			pins = "SD0_CLK", "SD0_CMD";
			power-source = <3300>;
		};

		cd {
			pinmux = <RZG2L_PORT_PINMUX(0, 0, 1)>; /* SD0_CD */
		};
	};

	sdhi0_uhs_pins: sd0-uhs {
		data {
			pins = "SD0_DATA0", "SD0_DATA1", "SD0_DATA2", "SD0_DATA3";
			power-source = <1800>;
		};

		ctrl {
			pins = "SD0_CLK", "SD0_CMD";
			power-source = <1800>;
		};

		cd {
			pinmux = <RZG2L_PORT_PINMUX(0, 0, 1)>; /* SD0_CD */
		};
	};

	sdhi0_emmc_pins: sd0-emmc {
		pins = "SD0_DATA0", "SD0_DATA1", "SD0_DATA2", "SD0_DATA3",
		       "SD0_DATA4", "SD0_DATA5", "SD0_DATA6", "SD0_DATA7",
		       "SD0_CLK", "SD0_CMD", "SD0_RST#";
		power-source = <1800>;
	};

	sdhi2_pins: sd2 {
		data {
			pins = "P11_2", "P11_3", "P12_0", "P12_1";
			input-enable;
		};

		ctrl {
			pins = "P11_1";
			input-enable;
		};

		mux {
			pinmux = <RZG2L_PORT_PINMUX(11, 0, 8)>, /* SD2_CLK */
				 <RZG2L_PORT_PINMUX(11, 1, 8)>, /* SD2_CMD */
				 <RZG2L_PORT_PINMUX(11, 2, 8)>, /* SD2_DATA0 */
				 <RZG2L_PORT_PINMUX(11, 3, 8)>, /* SD2_DATA1 */
				 <RZG2L_PORT_PINMUX(12, 0, 8)>, /* SD2_DATA2 */
				 <RZG2L_PORT_PINMUX(12, 1, 8)>, /* SD2_DATA3 */
				 <RZG2L_PORT_PINMUX(14, 1, 7)>; /* SD2_CD# */
		};
	};
};
