// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
 * Copyright (c) 2016 Fuzhou Rockchip Electronics Co., Ltd
 * Copyright (c) 2021 Thomas McKahan
 */

/dts-v1/;
#include <dt-bindings/pwm/pwm.h>
#include <dt-bindings/usb/pd.h>
#include "rk3399.dtsi"
#include "rk3399-op1.dtsi"

/ {
	model = "Asus Tinker Board 2/2S";
	compatible = "rockchip,rk3399-evb", "rockchip,rk3399";

	chosen {
		stdout-path = "serial2:1500000n8";
	};
	
	board_info: board-info {
		compatible = "board-info";

		hw-id0 = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
		hw-id1 = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
		hw-id2 = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>;

		pid-id0 = <&gpio2 RK_PA5 GPIO_ACTIVE_HIGH>;
		pid-id1 = <&gpio2 RK_PA3 GPIO_ACTIVE_HIGH>;
		pid-id2 = <&gpio2 RK_PA2 GPIO_ACTIVE_HIGH>;

		ddr-id1 = <&gpio4 RK_PA4 GPIO_ACTIVE_HIGH>;
		ddr-id2 = <&gpio4 RK_PA0 GPIO_ACTIVE_HIGH>;

		pmic-reset = <&gpio1 RK_PA6 GPIO_ACTIVE_HIGH>;
	};
	
	clkin_gmac: external-gmac-clock {
		compatible = "fixed-clock";
		clock-frequency = <125000000>;
		clock-output-names = "clkin_gmac";
		#clock-cells = <0>;
	};
	
	gpio-leds {
		compatible = "gpio-leds";

		pwr-led {
			gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
			linux,default-trigger = "default-on";
			retain-state-suspended = <1>;
		};

		act-led {
			gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
			linux,default-trigger="mmc0";
		};

		rsv-led {
			gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
			linux,default-trigger="heartbeat";
		};
	};
	
	vcc_lcd: vcc-lcd {
		compatible = "regulator-fixed";
		regulator-name = "vcc_lcd";
		gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
		startup-delay-us = <20000>;
		enable-active-high;
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-boot-on;
		vin-supply = <&vcc5v0_sys>;
	};
	
	vcc3v3_sys: vcc3v3-sys {
		compatible = "regulator-fixed";
		regulator-name = "vcc3v3_sys";
		regulator-always-on;
		regulator-boot-on;
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	vcc5v0_host: vcc5v0-host-regulator {
		compatible = "regulator-fixed";
		enable-active-high;
		gpio = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&vcc5v0_host_en>;
		regulator-name = "vcc5v0_host";
		vin-supply = <&vcc5v0_sys>;
	};

	vcc5v0_sys: vcc5v0-sys {
		compatible = "regulator-fixed";
		regulator-name = "vcc5v0_sys";
		regulator-always-on;
		regulator-boot-on;
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
	};
	
	vcc_phy: vcc-phy-regulator {
		compatible = "regulator-fixed";
		regulator-name = "vcc_phy";
		regulator-always-on;
		regulator-boot-on;
	};
	
	vbus_typec: vbus-5vout {
		compatible = "regulator-fixed";
		enable-active-high;
		gpio = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&vcc5v0_typec0_en_pin>;
		regulator-name = "vbus_5vout";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		vin-supply = <&vcc5v0_sys>;

		regulator-state-mem {
			regulator-off-in-suspend;
		};
	};
	
	vdd_log: vdd-log {
		compatible = "pwm-regulator";
		pwms = <&pwm2 0 25000 1>;
		regulator-name = "vdd_log";
		regulator-min-microvolt = <800000>;
		regulator-max-microvolt = <1400000>;
		regulator-always-on;
		regulator-boot-on;

		/* for rockchip boot on */
		rockchip,pwm_id= <2>;
		rockchip,pwm_voltage = <900000>;
	};
	
	xin32k: xin32k {
		compatible = "fixed-clock";
		clock-frequency = <32768>;
		clock-output-names = "xin32k";
		#clock-cells = <0>;
	};
};

&cdn_dp {
	status = "okay";
	extcon = <&fusb0>;
};

&cpu_l0 {
	cpu-supply = <&vdd_cpu_l>;
};

&cpu_l1 {
	cpu-supply = <&vdd_cpu_l>;
};

&cpu_l2 {
	cpu-supply = <&vdd_cpu_l>;
};

&cpu_l3 {
	cpu-supply = <&vdd_cpu_l>;
};

&cpu_b0 {
	cpu-supply = <&vdd_cpu_b>;
};

&cpu_b1 {
	cpu-supply = <&vdd_cpu_b>;
};

&emmc_phy {
	status = "okay";
};

&gmac {
	assigned-clocks = <&cru SCLK_RMII_SRC>;
	assigned-clock-parents = <&cru SCLK_MAC>;
	clock_in_out = "input";
	assigned-clock-rates = <125000000>;
	phy-supply = <&vcc_phy>;
	phy-mode = "rgmii";
	pinctrl-names = "default";
	pinctrl-0 = <&rgmii_pins>;
	snps,reset-gpio = <&gpio3 15 GPIO_ACTIVE_LOW>;
	snps,reset-active-low;
	snps,reset-delays-us = <0 16000 72000>;
	tx_delay = <0x25>;
	rx_delay = <0x20>;
	wakeup-enable = "0";
	status = "okay";
};
&gpu {
	mali-supply = <&vdd_gpu>;
	status = "okay";
};

&hdmi {
	ddc-i2c-bus = <&i2c3>;
	status = "okay";
};

&hdmi_sound {
	status = "okay";
};

&i2c0 {
	status = "okay";

	rk808: pmic@1b {
		compatible = "rockchip,rk808";
		reg = <0x1b>;
		interrupt-parent = <&gpio1>;
		interrupts = <18 IRQ_TYPE_LEVEL_LOW>;
		pinctrl-names = "default";
		pinctrl-0 = <&pmic_int_l>;
		system-power-controller;
		wakeup-source;
		#clock-cells = <1>;
		clock-output-names = "rk808-clkout1", "rk808-clkout2";

		vcc1-supply = <&vcc3v3_sys>;
		vcc2-supply = <&vcc3v3_sys>;
		vcc3-supply = <&vcc3v3_sys>;
		vcc4-supply = <&vcc3v3_sys>;
		vcc6-supply = <&vcc3v3_sys>;
		vcc7-supply = <&vcc3v3_sys>;
		vcc8-supply = <&vcc3v3_sys>;
		vcc9-supply = <&vcc3v3_sys>;
		vcc10-supply = <&vcc3v3_sys>;
		vcc11-supply = <&vcc3v3_sys>;
		vcc12-supply = <&vcc3v3_sys>;
		vddio-supply = <&vcc1v8_pmu>;

		regulators {
			vdd_center: DCDC_REG1 {
				regulator-name = "vdd_center";
				regulator-min-microvolt = <750000>;
				regulator-max-microvolt = <1350000>;
				regulator-ramp-delay = <6001>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
					regulator-suspend-microvolt = <900000>;
				};
			};

			vdd_cpu_l: DCDC_REG2 {
				regulator-name = "vdd_cpu_l";
				regulator-min-microvolt = <750000>;
				regulator-max-microvolt = <1350000>;
				regulator-ramp-delay = <6001>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-off-in-suspend;
				};
			};

			vcc_ddr: DCDC_REG3 {
				regulator-name = "vcc_ddr";
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
				};
			};

			vcc_1v8: DCDC_REG4 {
				regulator-name = "vcc_1v8";
				regulator-min-microvolt = <1800000>;
				regulator-max-microvolt = <1800000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
					regulator-suspend-microvolt = <1800000>;
				};
			};

			vcc3v3_dsi: LDO_REG1 {
				regulator-name = "vcc3v3_dsi";
				regulator-min-microvolt = <3300000>;
				regulator-max-microvolt = <3300000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-off-in-suspend;
				};
			};

			vcca1v8_hdmi: LDO_REG2 {
				regulator-name = "vcca1v8_hdmi";
				regulator-min-microvolt = <1800000>;
				regulator-max-microvolt = <1800000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-off-in-suspend;
				};
			};

			vcc1v8_pmu: LDO_REG3 {
				regulator-name = "vcc1v8_pmu";
				regulator-min-microvolt = <1800000>;
				regulator-max-microvolt = <1800000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
					regulator-suspend-microvolt = <1800000>;
				};
			};

			vccio_sd: LDO_REG4 {
				regulator-name = "vccio_sd";
				regulator-min-microvolt = <1800000>;
				regulator-max-microvolt = <3300000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
					regulator-suspend-microvolt = <3000000>;
				};
			};

			vcc3v3_csi: LDO_REG5 {
				regulator-name = "vcc3v3_csi";
				regulator-min-microvolt = <3300000>;
				regulator-max-microvolt = <3300000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-off-in-suspend;
				};
			};

			vcc_1v5: LDO_REG6 {
				regulator-name = "vcc_1v5";
				regulator-min-microvolt = <1500000>;
				regulator-max-microvolt = <1500000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
					regulator-suspend-microvolt = <1500000>;
				};
			};

			vcca0v9_hdmi: LDO_REG7 {
				regulator-name = "vcca0v9_hdmi";
				regulator-min-microvolt = <900000>;
				regulator-max-microvolt = <900000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-off-in-suspend;
				};
			};

			vcc_3v0: LDO_REG8 {
				regulator-name = "vcc_3v0";
				regulator-min-microvolt = <3000000>;
				regulator-max-microvolt = <3000000>;
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
					regulator-suspend-microvolt = <3000000>;
				};
			};

			vcc3v3_s3: SWITCH_REG1 {
				regulator-name = "vcc3v3_s3";
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-on-in-suspend;
				};
			};

			vcc3v3_s0: SWITCH_REG2 {
				regulator-name = "vcc3v3_s0";
				regulator-always-on;
				regulator-boot-on;
				regulator-state-mem {
					regulator-off-in-suspend;
				};
			};
		};
	};

	vdd_cpu_b: vdd_cpu_b@60 {
		compatible = "fcs,fan53200";
		reg = <0x60>;
		vin-supply = <&vcc5v0_sys>;
		regulator-compatible = "fan53555-regulator";
		pinctrl-names = "default";
		pinctrl-0 = <&vsel1_gpio>;
		vsel-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>;
		regulator-name = "vdd_cpu_b";
		regulator-min-microvolt = <800000>;
		regulator-max-microvolt = <1250000>;
		regulator-ramp-delay = <1000>;
		fcs,suspend-voltage-selector = <1>;
		regulator-always-on;
		regulator-boot-on;
		status = "okay";
		
		regulator-initial-state = <3>;
			regulator-state-mem {
			regulator-off-in-suspend;
		};
	};
};

&i2c3 { 
	status = "okay";
};

&i2c4 {

	status = "okay";
	i2c-scl-rising-time-ns = <475>;
	i2c-scl-falling-time-ns = <26>;
	fusb0: fusb30x@22 {
		compatible = "fcs,fusb302";
		reg = <0x22>;
		pinctrl-names = "default";
		pinctrl-0 = <&fusb0_int>;
		interrupt-parent = <&gpio1>;
		interrupts = <RK_PA2 IRQ_TYPE_LEVEL_LOW>;
		vbus-supply = <&vbus_typec>;
		status = "okay";
		
		connector {
			compatible = "usb-c-connector";
			data-role = "dual";
			label = "USB-C";
			op-sink-microwatt = <1000000>;
			power-role = "dual";
			sink-pdos =
				<PDO_FIXED(5000, 2500, PDO_FIXED_USB_COMM)>;
			source-pdos =
				<PDO_FIXED(5000, 1400, PDO_FIXED_USB_COMM)>;
			try-power-role = "sink";

			extcon-cables = <1 2 5 6 9 10 12 44>;
			typec-altmodes = <0xff01 1 0x001c0000 1>;

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

				port@0 {
					reg = <0>;

					usbc_hs: endpoint {
						remote-endpoint =
							<&u2phy0_typec_hs>;
					};
				};

				port@1 {
					reg = <1>;

					usbc_ss: endpoint {
						remote-endpoint =
							<&tcphy0_typec_ss>;
					};
				};

				port@2 {
					reg = <2>;

					usbc_dp: endpoint {
						remote-endpoint =
							<&tcphy0_typec_dp>;
					};
				};
			};
		};
		
		
		
		
	};
	
	vdd_gpu: vdd_gpu@60 {
		compatible = "fcs,fan53200";
		reg = <0x60>;
		vin-supply = <&vcc5v0_sys>;
		regulator-compatible = "fan53555-regulator";
		pinctrl-names = "default";
		pinctrl-0 = <&vsel2_gpio>;
		vsel-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>;
		regulator-name = "vdd_gpu";
		regulator-min-microvolt = <800000>;
		regulator-max-microvolt = <1200000>;
		regulator-ramp-delay = <1000>;
		fcs,suspend-voltage-selector = <1>;
		regulator-always-on;
		regulator-boot-on;
		status = "okay";
		
		regulator-initial-state = <3>;
			regulator-state-mem {
			regulator-off-in-suspend;
		};
	};
};	

&i2c8 {

	m24c08: m24c08@50 {
		compatible = "atmel,24c08";
		reg = <0x50>;
	};
};

&i2s0 {
	rockchip,playback-channels = <8>;
	rockchip,capture-channels = <8>;
	status = "okay";
};

&i2s2 {
	status = "okay";
};

&pcie_phy {
	status = "okay";
};

&pcie0 {
	ep-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
	num-lanes = <4>;
	pinctrl-names = "default";
	pinctrl-0 = <&pcie_clkreqn_cpm>;
	status = "okay";
};

&pwm0 {
	status = "disabled";
};

&pwm2 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pwm2_pin_pull_down>;
};

&pwm3 {
	status = "disabled";
};

&saradc {
	status = "okay";
};

&sdhci {
	bus-width = <8>;
	mmc-hs200-1_8v;
	supports-emmc;
	//mmc-hs400-enhanced-strobe;
	non-removable;
	keep-power-in-suspend;
	status = "okay";
};

&sdmmc {
	clock-frequency = <150000000>;
	clock-freq-min-max = <100000 150000000>;
	supports-sd;
	bus-width = <4>;
	cap-mmc-highspeed;
	cap-sd-highspeed;
	disable-wp;
	num-slots = <1>;
	//sd-uhs-sdr104;
	vmmc-supply = <&vcc3v3_s3>;
	vqmmc-supply = <&vccio_sd>;
	pinctrl-names = "default";
	pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
	status = "okay";
};

&tcphy0 {
	extcon = <&fusb0>;
	status = "okay";
};

&tcphy0_dp {
	port {
		tcphy0_typec_dp: endpoint {
			remote-endpoint = <&usbc_dp>;
		};
	};
};

&tcphy0_usb3 {
	port {
		tcphy0_typec_ss: endpoint {
			remote-endpoint = <&usbc_ss>;
		};
	};
};

&tcphy1 {
	status = "okay";
};

&tsadc {
	/* tshut mode 0:CRU 1:GPIO */
	rockchip,hw-tshut-mode = <1>;
	/* tshut polarity 0:LOW 1:HIGH */
	rockchip,hw-tshut-polarity = <1>;
	status = "okay";
};

&u2phy0 {
	status = "okay";

	u2phy0_otg: otg-port {
		status = "okay";
	};

	u2phy0_host: host-port {
		phy-supply = <&vcc5v0_host>;
		status = "okay";
	};

	port {
		u2phy0_typec_hs: endpoint {
			remote-endpoint = <&usbc_hs>;
		};
	};
};

&u2phy1 {
	status = "okay";

	u2phy1_otg: otg-port {
		status = "okay";
	};

	u2phy1_host: host-port {
		phy-supply = <&vcc5v0_host>;
		status = "okay";
	};
};

&usbdrd3_0 {
	status = "okay";
};

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

&usbdrd3_1 {
	status = "okay";
};

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

&uart2 {
	status = "okay";
};

&usb_host0_ehci {
	status = "okay";
};

&usb_host0_ohci {
	status = "okay";
};

&usb_host1_ehci {
	status = "okay";
};

&usb_host1_ohci {
	status = "okay";
};

&pinctrl {

	pmic {
		pmic_int_l: pmic-int-l {
			rockchip,pins =
				<1 18 RK_FUNC_GPIO &pcfg_pull_up>,
				<0 9 RK_FUNC_GPIO &pcfg_pull_none>; /* GPIO0_B1 */
		};
		vsel1_gpio: vsel1-gpio {
			rockchip,pins =
				<1 17 RK_FUNC_GPIO &pcfg_pull_down>;
		};
		vsel2_gpio: vsel2-gpio {
			rockchip,pins =
				<1 14 RK_FUNC_GPIO &pcfg_pull_down>;
		};	
	};

	usb2 {
		vcc5v0_host_en: vcc5v0-host-en {
			rockchip,pins =
				<4 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
	
	usb-typec {
		vcc5v0_typec0_en_pin: vcc5v0-typec0-en-pin {
			rockchip,pins = <1 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
		};
	};
	
	fusb30x {
		fusb0_int: fusb0-int {
			rockchip,pins = <1 2 RK_FUNC_GPIO &pcfg_pull_up>;
		};
	};
};

&vopl {
	status = "okay";	
};

&vopl_mmu {
	status = "okay";
};

&vopb {
	status = "okay";
};

&vopb_mmu {
	status = "okay";
}; 
