// SPDX-License-Identifier: GPL-2.0

/dts-v1/;

#include <dt-bindings/input/gpio-keys.h>
#include <dt-bindings/input/input.h>

#include "tegra114.dtsi"

/ {
	model = "Asus Transformer Pad TF701T";
	compatible = "asus,tf701t", "nvidia,tegra114";
	chassis-type = "convertible";

	aliases {
		mmc0 = "/mmc@78000600"; /* eMMC */
		mmc1 = "/mmc@78000400"; /* uSD slot */
		mmc2 = "/mmc@78000000"; /* WiFi */

		rtc0 = &palmas;
		rtc1 = "/rtc@7000e000";

		serial0 = &uartd; /* Console */
		serial1 = &uartc; /* Bluetooth */
		serial2 = &uartb; /* GPS */
	};

	firmware {
		trusted-foundations {
			compatible = "tlm,trusted-foundations";
			tlm,version-major = <2>;
			tlm,version-minor = <8>;
		};
	};

	memory@80000000 {
		reg = <0x80000000 0x80000000>;
	};

	reserved-memory {
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;

		linux,cma@80000000 {
			compatible = "shared-dma-pool";
			alloc-ranges = <0x80000000 0x30000000>;
			size = <0x10000000>;
			linux,cma-default;
			reusable;
		};

		trustzone@bfe00000 {
			reg = <0xbfe00000 0x200000>;
			no-map;
		};
	};

	host1x@50000000 {
		dsi@54300000 {
			status = "okay";

			avdd-dsi-csi-supply = <&tps65913_ldo2>;

			nvidia,ganged-mode = <&dsib>;

			panel_primary: panel@0 {
				compatible = "sharp,lq101r1sx01";
				reg = <0>;

				link2 = <&panel_secondary>;

				power-supply = <&vdd_lcd>;
				backlight = <&backlight>;
			};
		};

		dsi@54400000 {
			status = "okay";

			avdd-dsi-csi-supply = <&tps65913_ldo2>;

			panel_secondary: panel@0 {
				compatible = "sharp,lq101r1sx01";
				reg = <0>;
			};
		};
	};

	pinmux@70000868 {
		asus_pad_ec_default: pinmux-asus-pad-ec-default {
			ec-interrupt {
				nvidia,pins = "kb_col5_pq5";
				nvidia,function = "kbc";
				nvidia,pull = <TEGRA_PIN_PULL_UP>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};

			ec-request {
				nvidia,pins = "kb_col2_pq2";
				nvidia,function = "kbc";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};
		};

		backlight_default: pinmux-backlight-default {
			backlight-enable {
				nvidia,pins = "gmi_ad10_ph2";
				nvidia,function = "gmi";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};
		};

		codec_default: pinmux-codec-default {
			interrupt {
				nvidia,pins = "gpio_w2_aud_pw2",
						"gpio_w3_aud_pw3";
				nvidia,function = "spi6";
				nvidia,pull = <TEGRA_PIN_PULL_UP>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};

			ldo1-en {
				nvidia,pins = "sdmmc1_wp_n_pv3";
				nvidia,function = "sdmmc1";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};
		};

		gpio_hall_sensor_default: pinmux-gpio-hall-sensor-default {
			ulpi_data4_po5 {
				nvidia,pins = "ulpi_data4_po5";
				nvidia,function = "spi2";
				nvidia,pull = <TEGRA_PIN_PULL_UP>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};
		};

		gpio_keys_default: pinmux-gpio-keys-default {
			power {
				nvidia,pins = "kb_col0_pq0";
				nvidia,function = "kbc";
				nvidia,pull = <TEGRA_PIN_PULL_UP>;
				nvidia,tristate = <TEGRA_PIN_ENABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};

			volume {
				nvidia,pins = "kb_row1_pr1",
						"kb_row2_pr2";
				nvidia,function = "rsvd2";
				nvidia,pull = <TEGRA_PIN_PULL_UP>;
				nvidia,tristate = <TEGRA_PIN_ENABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};
		};

		hp_det_default: pinmux-hp-det-default {
			gmi_iordy_pi5 {
				nvidia,pins = "kb_row7_pr7";
				nvidia,function = "rsvd2";
				nvidia,pull = <TEGRA_PIN_PULL_UP>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};
		};

		imu_default: pinmux-imu-default {
			kb_row3_pr3 {
				nvidia,pins = "kb_row3_pr3";
				nvidia,function = "rsvd3";
				nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};
		};

		pwm_default: pinmux-pwm-default {
			gmi_ad9_ph1 {
				nvidia,pins = "gmi_ad9_ph1";
				nvidia,function = "pwm1";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};
		};

		/* XXX make this something more sensible */
		pwm_sleep: pinmux-pwm-sleep {
			gmi_ad9_ph1 {
				nvidia,pins = "gmi_ad9_ph1";
				nvidia,function = "pwm1";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};
		};

		sdmmc3_default: pinmux-sdmmc3-default {
			drive_sdio3 {
				nvidia,pins = "drive_sdio3";
				nvidia,high-speed-mode = <TEGRA_PIN_ENABLE>;
				nvidia,schmitt = <TEGRA_PIN_DISABLE>;
				nvidia,pull-down-strength = <22>;
				nvidia,pull-up-strength = <36>;
				nvidia,slew-rate-rising = <TEGRA_PIN_SLEW_RATE_FASTEST>;
				nvidia,slew-rate-falling = <TEGRA_PIN_SLEW_RATE_FASTEST>;
			};

			sdmmc3_clk_pa6 {
				nvidia,pins = "sdmmc3_clk_pa6";
				nvidia,function = "sdmmc3";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};

			sdmmc3_cmd_pa7 {
				nvidia,pins = "sdmmc3_cmd_pa7",
						"sdmmc3_dat0_pb7",
						"sdmmc3_dat1_pb6",
						"sdmmc3_dat2_pb5",
						"sdmmc3_dat3_pb4",
						"kb_col4_pq4",
						"sdmmc3_clk_lb_out_pee4",
						"sdmmc3_clk_lb_in_pee5",
						"sdmmc3_cd_n_pv2";
				nvidia,function = "sdmmc3";
				nvidia,pull = <TEGRA_PIN_PULL_UP>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_ENABLE>;
			};
		};

		sdmmc3_vdd_default: pinmux-sdmmc3-vdd-default {
			gmi_clk_pk1 {
				nvidia,pins = "gmi_clk_pk1";
				nvidia,function = "gmi";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};
		};

		vdd_lcd_default: pinmux-vdd-lcd-default {
			sdmmc4_clk_pcc4 {
				nvidia,pins = "sdmmc4_clk_pcc4";
				nvidia,function = "sdmmc4";
				nvidia,pull = <TEGRA_PIN_PULL_NONE>;
				nvidia,tristate = <TEGRA_PIN_DISABLE>;
				nvidia,enable-input = <TEGRA_PIN_DISABLE>;
			};
		};
	};

	serial@70006040 {
		/* GPS */
	};

	serial@70006200 {
		/* Bluetooth */
	};

	serial@70006300 {
		/delete-property/ dmas;
		/delete-property/ dma-names;
		status = "okay";
	};

	pwm@7000a000 {
		status = "okay";

		pinctrl-names = "default", "sleep";
		pinctrl-0 = <&pwm_default>;
		pinctrl-1 = <&pwm_sleep>;
	};

	i2c@7000c000 {
		status = "okay";
		clock-frequency = <100000>;

		magnetometer@c {
			compatible = "asahi-kasei,ak09911";
			reg = <0xc>;

			vdd-supply = <&vdd_3v3_sys>;
		};

		rt5639: audio-codec@1c {
			compatible = "realtek,rt5639";
			reg = <0x1c>;

			interrupt-parent = <&gpio>;
			interrupts = <TEGRA_GPIO(W, 3) IRQ_TYPE_EDGE_FALLING>;

			realtek,ldo1-en-gpios = <&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;

			pinctrl-names = "default";
			pinctrl-0 = <&codec_default>;
		};

		temp_sensor: temperature-sensor@4c {
			compatible = "onnn,nct1008";
			reg = <0x4c>;

			vcc-supply = <&vdd_3v3_sys>;
			#thermal-sensor-cells = <1>;
		};

		motion-tracker@68 {
			compatible = "invensense,mpu6500";
			reg = <0x68>;

			interrupt-parent = <&gpio>;
			interrupts = <TEGRA_GPIO(R, 3) IRQ_TYPE_LEVEL_HIGH>;

			mount-matrix =  "0", "-1", "0",
					"1",  "0", "0",
					"0",  "0", "1";

			pinctrl-names = "default";
			pinctrl-0 = <&imu_default>;
		};
	};

	i2c@7000c400 {
		status = "okay";
		clock-frequency = <100000>;

		power-sensor@44 {
			compatible = "ti,ina230";
			reg = <0x44>;
		};
	};

	i2c@7000c500 {
		status = "okay";
		clock-frequency = <400000>;

		light-sensor@1c {
			compatible = "dynaimage,al3320a";
			reg = <0x1c>;

			vdd-supply = <&vdd_3v3_sys>;
		};
	};

	i2c@7000c700 {
		/* HDMI DDC */
	};

	i2c@7000d000 {
		status = "okay";
		clock-frequency = <400000>;

		palmas: pmic@58 {
			compatible = "ti,tps65913", "ti,palmas";
			reg = <0x58>;
			interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;

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

			ti,system-power-controller;

			palmas_gpio: gpio {
				compatible = "ti,palmas-gpio";
				gpio-controller;
				#gpio-cells = <2>;
			};

			pinmux {
				compatible = "ti,tps65913-pinctrl";
				ti,palmas-enable-dvfs1;

				pinctrl-names = "default";
				pinctrl-0 = <&palmas_default>;

				palmas_default: pinmux {
					pin_gpio0 {
						pins = "gpio0";
						function = "gpio";
					};

					pin_gpio1 {
						pins = "gpio1";
						function = "gpio";
					};

					pin_gpio2 {
						pins = "gpio2";
						function = "gpio";
					};

					pin_gpio3 {
						pins = "gpio3";
						function = "gpio";
					};

					pin_gpio4 {
						pins = "gpio4";
						function = "gpio";
					};

					pin_gpio5 {
						pins = "gpio5";
						function = "gpio";
					};

					pin_gpio6 {
						pins = "gpio6";
						function = "gpio";
					};

					pin_gpio7 {
						pins = "gpio7";
						function = "gpio";
					};

					pin_powergood {
						pins = "powergood";
						function = "powergood";
					};

					pin_vac {
						pins = "vac";
						function = "vac";
					};
				};
			};

			pmic {
				compatible = "ti,tps65913-pmic", "ti,palmas-pmic";

				ldo1-in-supply = <&tps65913_smps7>;
				ldo2-in-supply = <&tps65913_smps7>;
				ldo4-in-supply = <&tps65913_smps8>;
				ldo5-in-supply = <&tps65913_smps9>;
				ldo6-in-supply = <&tps65913_smps9>;
				ldo7-in-supply = <&tps65913_smps9>;
				ldo9-in-supply = <&tps65913_smps9>;

				regulators {
					tps65913_smps123: smps123 {
						regulator-name = "vdd-cpu";
						regulator-min-microvolt = <900000>;
						regulator-max-microvolt = <1350000>;
						regulator-always-on;
						regulator-boot-on;
						ti,roof-floor = <1>;
						ti,mode-sleep = <3>;
					};

					tps65913_smps45: smps45 {
						regulator-name = "vdd-core";
						regulator-min-microvolt = <900000>;
						regulator-max-microvolt = <1400000>;
						regulator-always-on;
						regulator-boot-on;
						ti,roof-floor = <3>;
					};

					smps6 {
						regulator-name = "va-lcd-hv";
						regulator-min-microvolt = <1000000>;
						regulator-max-microvolt = <1000000>;
						regulator-always-on;
						regulator-boot-on;
					};

					tps65913_smps7: smps7 {
						regulator-name = "vdd-ddr";
						regulator-min-microvolt = <1350000>;
						regulator-max-microvolt = <1350000>;
						regulator-always-on;
						regulator-boot-on;
					};

					tps65913_smps8: smps8 {
						regulator-name = "vdd-1v8";
						regulator-min-microvolt = <1800000>;
						regulator-max-microvolt = <1800000>;
						regulator-always-on;
						regulator-boot-on;
					};

					tps65913_smps9: smps9 {
						regulator-name = "vdd-sd";
						regulator-min-microvolt = <2900000>;
						regulator-max-microvolt = <2900000>;
						regulator-always-on;
					};

					tps65913_smps10_out1: smps10_out1 {
						regulator-name = "vd-smps10-out1";
						regulator-min-microvolt = <5000000>;
						regulator-max-microvolt = <5000000>;
						regulator-always-on;
						regulator-boot-on;
					};

					tps65913_smps10_out2: smps10_out2 {
						regulator-name = "vd-smps10-out2";
						regulator-min-microvolt = <5000000>;
						regulator-max-microvolt = <5000000>;
						regulator-always-on;
						regulator-boot-on;
					};

					tps65913_ldo1: ldo1 {
						regulator-name = "vdd-hdmi-pll";
						regulator-min-microvolt = <1050000>;
						regulator-max-microvolt = <1050000>;
						regulator-always-on;
						ti,roof-floor = <3>;
					};

					tps65913_ldo2: ldo2 {
						regulator-name = "vdd-2v8-dsi-csi";
						regulator-min-microvolt = <1200000>;
						regulator-max-microvolt = <1200000>;
						regulator-boot-on;
					};

					ldo3 {
						regulator-name = "vpp-fuse";
						regulator-min-microvolt = <1800000>;
						regulator-max-microvolt = <1800000>;
					};

					ldo4 {
						regulator-name = "vdd-1v2-cam";
						regulator-min-microvolt = <1200000>;
						regulator-max-microvolt = <1200000>;
					};

					ldo5 {
						regulator-name = "vdd-cam";
						regulator-min-microvolt = <2800000>;
						regulator-max-microvolt = <2800000>;
					};

					ldo6 {
						regulator-name = "vdd-dev";
						regulator-min-microvolt = <2850000>;
						regulator-max-microvolt = <2850000>;
						regulator-boot-on;
					};

					ldo7 {
						regulator-name = "vdd-2v8-cam";
						regulator-min-microvolt = <2800000>;
						regulator-max-microvolt = <2800000>;
					};

					tps65913_ldo8: ldo8 {
						regulator-name = "vdd-rtc";
						regulator-min-microvolt = <950000>;
						regulator-max-microvolt = <950000>;
						regulator-always-on;
						regulator-boot-on;
						ti,enable-ldo8-tracking;
					};

					tps65913_ldo9: ldo9 {
						regulator-name = "vdd-sdmmc";
						regulator-min-microvolt = <1800000>;
						regulator-max-microvolt = <2900000>;
					};

					tps65913_ldoln: ldoln {
						regulator-name = "vdd-hdmi";
						regulator-min-microvolt = <3300000>;
						regulator-max-microvolt = <3300000>;
					};

					ldousb {
						regulator-name = "vdd-usb";
						regulator-min-microvolt = <3300000>;
						regulator-max-microvolt = <3300000>;
						regulator-always-on;
						regulator-boot-on;
					};
				};
			};

			rtc {
				compatible = "ti,palmas-rtc";
				interrupt-parent = <&palmas>;
				interrupts = <8 0>;
			};
		};
	};

	ahub@70080000 {
		i2s@70080300 {
			status = "okay";
		};
	};

	mmc@78000000 {
		/* WiFi */
	};

	/* MicroSD card */
	mmc@78000400 {
		status = "okay";

		bus-width = <4>;
		cd-gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_LOW>;

		nvidia,default-tap = <0x3>;
		nvidia,default-trim = <0x3>;

		vmmc-supply = <&vdd_usd>;
		vqmmc-supply = <&tps65913_ldo9>;

		pinctrl-names = "default";
		pinctrl-0 = <&sdmmc3_default>;
	};

	mmc@78000600 {
		/* eMMC */
	};

	usb@7d000000 {
		compatible = "nvidia,tegra114-udc";
		status = "okay";
		dr_mode = "peripheral";

		/* Peripheral USB via ASUS connector */
	};

	usb-phy@7d000000 {
		status = "okay";
	};

	usb@7d008000 {
		status = "okay";

		/* Host USB via dock */
	};

	usb-phy@7d008000 {
		status = "okay";
		vbus-supply = <&vdd_5v0_sys>;
	};

	backlight: backlight {
		compatible = "pwm-backlight";

		enable-gpios = <&gpio TEGRA_GPIO(H, 2) GPIO_ACTIVE_HIGH>;
		power-supply = <&vdd_5v0_sys>;
		pwms = <&pwm 1 1000000>;

		brightness-levels = <1 255>;
		num-interpolated-steps = <254>;
		default-brightness-level = <224>;

		pinctrl-names = "default";
		pinctrl-0 = <&backlight_default>;
	};

	/* PMIC has a built-in 32KHz oscillator which is used by PMC */
	clk32k_in: clock-32k {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <32768>;
		clock-output-names = "pmic-oscillator";
	};

	gpio-hall-sensor {
		compatible = "gpio-keys";

		label = "GPIO Hall Effect Sensor";

		pinctrl-names = "default";
		pinctrl-0 = <&gpio_hall_sensor_default>;

		switch-hall-sensor {
			label = "Hall Effect Sensor";
			gpios = <&gpio TEGRA_GPIO(O, 5) GPIO_ACTIVE_LOW>;
			linux,input-type = <EV_SW>;
			linux,code = <SW_LID>;
			linux,can-disable;
			wakeup-source;
		};
	};

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

		label = "GPIO Buttons";

		pinctrl-names = "default";
		pinctrl-0 = <&gpio_keys_default>;

		button-power {
			label = "Power";
			gpios = <&gpio TEGRA_GPIO(Q, 0) GPIO_ACTIVE_LOW>;
			linux,code = <KEY_POWER>;
			debounce-interval = <10>;
			wakeup-source;
		};

		button-volume-down {
			label = "Volume Down";
			gpios = <&gpio TEGRA_GPIO(R, 1) GPIO_ACTIVE_LOW>;
			linux,code = <KEY_VOLUMEDOWN>;
			debounce-interval = <10>;
		};

		button-volume-up {
			label = "Volume Up";
			gpios = <&gpio TEGRA_GPIO(R, 2) GPIO_ACTIVE_LOW>;
			linux,code = <KEY_VOLUMEUP>;
			debounce-interval = <10>;
		};
	};

	sound {
		compatible = "asus,tegra-audio-rt5639-tf701t",
			     "nvidia,tegra-audio-rt5640";
		nvidia,model = "Asus Transformer Pad TF701T RT5639";

		nvidia,audio-routing =
			"Headphones", "HPOR",
			"Headphones", "HPOL",
			"Speakers", "SPORP",
			"Speakers", "SPORN",
			"Speakers", "SPOLP",
			"Speakers", "SPOLN",
			"Mic Jack", "MICBIAS1",
			"IN2P", "Mic Jack";

		nvidia,i2s-controller = <&tegra_i2s0>;
		nvidia,audio-codec = <&rt5639>;

		nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(R, 7) GPIO_ACTIVE_LOW>;

		clocks = <&tegra_car TEGRA114_CLK_PLL_A>,
			 <&tegra_car TEGRA114_CLK_PLL_A_OUT0>,
			 <&tegra_pmc TEGRA_PMC_CLK_OUT_1>;
		clock-names = "pll_a", "pll_a_out0", "mclk";

		assigned-clocks = <&tegra_car TEGRA114_CLK_EXTERN1>,
				  <&tegra_pmc TEGRA_PMC_CLK_OUT_1>;

		assigned-clock-parents = <&tegra_car TEGRA114_CLK_PLL_A_OUT0>,
					 <&tegra_car TEGRA114_CLK_EXTERN1>;

		pinctrl-names = "default";
		pinctrl-0 = <&hp_det_default>;
	};

	vdd_5v0_sys: regulator-5v0-sys {
		compatible = "regulator-fixed";
		regulator-name = "vdd_5v0";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		regulator-always-on;
		regulator-boot-on;
	};

	vdd_3v3_sys: regulator-3v3-sys {
		compatible = "regulator-fixed";
		regulator-name = "vdd_3v3";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		regulator-always-on;
		regulator-boot-on;
	};

	vdd_lcd: regulator-vdd-lcd {
		compatible = "regulator-fixed";
		regulator-name = "vdd_lcd_1v8";
		regulator-min-microvolt = <1800000>;
		regulator-max-microvolt = <1800000>;
		vin-supply = <&tps65913_smps8>;
		enable-active-high;
		gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>;
		regulator-boot-on;

		pinctrl-names = "default";
		pinctrl-0 = <&vdd_lcd_default>;
	};

	vdd_usd: regulator-vdd-usd {
		compatible = "regulator-fixed";
		regulator-name = "vdd_sd_slot";
		regulator-min-microvolt = <2900000>;
		regulator-max-microvolt = <2900000>;
		vin-supply = <&tps65913_smps9>;
		enable-active-high;
		gpio = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;

		pinctrl-names = "default";
		pinctrl-0 = <&sdmmc3_vdd_default>;
	};
};