// SPDX-License-Identifier: BSD-3-Clause
/*
 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
 * Copyright (c) 2022, Linaro Limited
 */

/dts-v1/;

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
#include <dt-bindings/spmi/spmi.h>

#include "sa8540p.dtsi"
#include "sa8540p-pmics.dtsi"

/ {
	model = "Qualcomm SA8295P ADP";
	compatible = "qcom,sa8295p-adp", "qcom,sa8540p";

	aliases {
		serial0 = &uart17;
	};

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

	dp2-connector {
		compatible = "dp-connector";
		label = "DP2";
		type = "mini";

		hpd-gpios = <&tlmm 20 GPIO_ACTIVE_HIGH>;

		port {
			dp2_connector_in: endpoint {
				remote-endpoint = <&mdss1_dp0_phy_out>;
			};
		};
	};

	dp3-connector {
		compatible = "dp-connector";
		label = "DP3";
		type = "mini";

		hpd-gpios = <&tlmm 45 GPIO_ACTIVE_HIGH>;

		port {
			dp3_connector_in: endpoint {
				remote-endpoint = <&mdss1_dp1_phy_out>;
			};
		};
	};

	edp0-connector {
		compatible = "dp-connector";
		label = "EDP0";
		type = "mini";

		hpd-gpios = <&tlmm 2 GPIO_ACTIVE_HIGH>;

		port {
			edp0_connector_in: endpoint {
				remote-endpoint = <&mdss0_dp2_phy_out>;
			};
		};
	};

	edp1-connector {
		compatible = "dp-connector";
		label = "EDP1";
		type = "mini";

		hpd-gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>;

		port {
			edp1_connector_in: endpoint {
				remote-endpoint = <&mdss0_dp3_phy_out>;
			};
		};
	};

	edp2-connector {
		compatible = "dp-connector";
		label = "EDP2";
		type = "mini";

		hpd-gpios = <&tlmm 7 GPIO_ACTIVE_HIGH>;

		port {
			edp2_connector_in: endpoint {
				remote-endpoint = <&mdss1_dp2_phy_out>;
			};
		};
	};

	edp3-connector {
		compatible = "dp-connector";
		label = "EDP3";
		type = "mini";

		hpd-gpios = <&tlmm 6 GPIO_ACTIVE_HIGH>;

		port {
			edp3_connector_in: endpoint {
				remote-endpoint = <&mdss1_dp3_phy_out>;
			};
		};
	};

	reserved-memory {
		gpu_mem: gpu-mem@8bf00000 {
			reg = <0 0x8bf00000 0 0x2000>;
			no-map;
		};
	};
};

&apps_rsc {
	regulators-0 {
		compatible = "qcom,pm8150-rpmh-regulators";
		qcom,pmic-id = "a";

		vreg_l3a: ldo3 {
			regulator-name = "vreg_l3a";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <1208000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l5a: ldo5 {
			regulator-name = "vreg_l5a";
			regulator-min-microvolt = <912000>;
			regulator-max-microvolt = <912000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l7a: ldo7 {
			regulator-name = "vreg_l7a";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <1800000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l13a: ldo13 {
			regulator-name = "vreg_l13a";
			regulator-min-microvolt = <3072000>;
			regulator-max-microvolt = <3072000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l11a: ldo11 {
			regulator-name = "vreg_l11a";
			regulator-min-microvolt = <880000>;
			regulator-max-microvolt = <880000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};
	};

	regulators-1 {
		compatible = "qcom,pm8150-rpmh-regulators";
		qcom,pmic-id = "c";

		vreg_l1c: ldo1 {
			regulator-name = "vreg_l1c";
			regulator-min-microvolt = <912000>;
			regulator-max-microvolt = <912000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l2c: ldo2 {
			regulator-name = "vreg_l2c";
			regulator-min-microvolt = <3072000>;
			regulator-max-microvolt = <3072000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l3c: ldo3 {
			regulator-name = "vreg_l3c";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <1200000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
			regulator-allow-set-load;
			regulator-allowed-modes = <RPMH_REGULATOR_MODE_LPM
						   RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l4c: ldo4 {
			regulator-name = "vreg_l4c";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <1208000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l6c: ldo6 {
			regulator-name = "vreg_l6c";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <1200000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
			regulator-allow-set-load;
			regulator-allowed-modes = <RPMH_REGULATOR_MODE_LPM
						   RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l7c: ldo7 {
			regulator-name = "vreg_l7c";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <1800000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l10c: ldo10 {
			regulator-name = "vreg_l10c";
			regulator-min-microvolt = <2504000>;
			regulator-max-microvolt = <2504000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
			regulator-allow-set-load;
			regulator-allowed-modes = <RPMH_REGULATOR_MODE_LPM
						   RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l17c: ldo17 {
			regulator-name = "vreg_l17c";
			regulator-min-microvolt = <2504000>;
			regulator-max-microvolt = <2504000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
			regulator-allow-set-load;
			regulator-allowed-modes = <RPMH_REGULATOR_MODE_LPM
						   RPMH_REGULATOR_MODE_HPM>;
		};
	};

	regulators-2 {
		compatible = "qcom,pm8150-rpmh-regulators";
		qcom,pmic-id = "g";

		vreg_l3g: ldo3 {
			regulator-name = "vreg_l3g";
			regulator-min-microvolt = <1200000>;
			regulator-max-microvolt = <1200000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l7g: ldo7 {
			regulator-name = "vreg_l7g";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <1800000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l8g: ldo8 {
			regulator-name = "vreg_l8g";
			regulator-min-microvolt = <912000>;
			regulator-max-microvolt = <912000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l11g: ldo11 {
			regulator-name = "vreg_l11g";
			regulator-min-microvolt = <912000>;
			regulator-max-microvolt = <912000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};
	};
};

&dispcc0 {
	status = "okay";
};

&dispcc1 {
	status = "okay";
};

&i2c12 {
	pinctrl-0 = <&qup1_i2c4_state>;
	pinctrl-names = "default";

	status = "okay";

	vdd_gfx: regulator@39 {
		compatible = "maxim,max20411";
		reg = <0x39>;

		regulator-min-microvolt = <800000>;
		regulator-max-microvolt = <800000>;

		enable-gpios = <&pmm8540a_gpios 2 GPIO_ACTIVE_HIGH>;

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

&gpucc {
	vdd-gfx-supply = <&vdd_gfx>;
	status = "okay";
};

&gmu {
	status = "okay";
};

&gpu {
	status = "okay";

	zap-shader {
		memory-region = <&gpu_mem>;
		firmware-name = "qcom/sa8295p/a690_zap.mbn";
	};
};

&gpu_smmu {
	status = "okay";
};

&mdss0 {
	status = "okay";
};

&mdss0_dp2 {
	data-lanes = <0 1 2 3>;

	status = "okay";

	ports {
		port@1 {
			reg = <1>;
			mdss0_dp2_phy_out: endpoint {
				remote-endpoint = <&edp0_connector_in>;
			};
		};
	};
};

&mdss0_dp2_phy {
	vdda-phy-supply = <&vreg_l8g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&mdss0_dp3 {
	data-lanes = <0 1 2 3>;

	status = "okay";

	ports {
		port@1 {
			reg = <1>;
			mdss0_dp3_phy_out: endpoint {
				remote-endpoint = <&edp1_connector_in>;
			};
		};
	};
};

&mdss0_dp3_phy {
	vdda-phy-supply = <&vreg_l8g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&mdss1 {
	status = "okay";
};

&mdss1_dp0 {
	data-lanes = <0 1 2 3>;

	status = "okay";

	ports {
		port@1 {
			reg = <1>;
			mdss1_dp0_phy_out: endpoint {
				remote-endpoint = <&dp2_connector_in>;
			};
		};
	};
};

&mdss1_dp0_phy {
	vdda-phy-supply = <&vreg_l11g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&mdss1_dp1 {
	data-lanes = <0 1 2 3>;

	status = "okay";

	ports {
		port@1 {
			reg = <1>;
			mdss1_dp1_phy_out: endpoint {
				remote-endpoint = <&dp3_connector_in>;
			};
		};
	};
};

&mdss1_dp1_phy {
	vdda-phy-supply = <&vreg_l11g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&mdss1_dp2 {
	data-lanes = <0 1 2 3>;

	status = "okay";

	ports {
		port@1 {
			reg = <1>;
			mdss1_dp2_phy_out: endpoint {
				remote-endpoint = <&edp2_connector_in>;
			};
		};
	};
};

&mdss1_dp2_phy {
	vdda-phy-supply = <&vreg_l11g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&mdss1_dp3 {
	data-lanes = <0 1 2 3>;

	status = "okay";

	ports {
		port@1 {
			reg = <1>;
			mdss1_dp3_phy_out: endpoint {
				remote-endpoint = <&edp3_connector_in>;
			};
		};
	};
};

&mdss1_dp3_phy {
	vdda-phy-supply = <&vreg_l11g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&pcie2a {
	perst-gpios = <&tlmm 143 GPIO_ACTIVE_LOW>;
	wake-gpios = <&tlmm 145 GPIO_ACTIVE_LOW>;

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

	status = "okay";
};

&pcie2a_phy {
	vdda-phy-supply = <&vreg_l11a>;
	vdda-pll-supply = <&vreg_l3a>;

	status = "okay";
};

&pcie3a {
	num-lanes = <2>;

	perst-gpios = <&tlmm 151 GPIO_ACTIVE_LOW>;
	wake-gpios = <&tlmm 56 GPIO_ACTIVE_LOW>;

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

	status = "okay";
};

&pcie3a_phy {
	vdda-phy-supply = <&vreg_l11a>;
	vdda-pll-supply = <&vreg_l3a>;

	status = "okay";
};

&pcie3b {
	perst-gpios = <&tlmm 153 GPIO_ACTIVE_LOW>;
	wake-gpios = <&tlmm 130 GPIO_ACTIVE_LOW>;

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

	status = "okay";
};

&pcie3b_phy {
	vdda-phy-supply = <&vreg_l11a>;
	vdda-pll-supply = <&vreg_l3a>;

	status = "okay";
};

&pcie4 {
	perst-gpios = <&tlmm 141 GPIO_ACTIVE_LOW>;
	wake-gpios = <&tlmm 139 GPIO_ACTIVE_LOW>;

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

	status = "okay";
};

&pcie4_phy {
	vdda-phy-supply = <&vreg_l11a>;
	vdda-pll-supply = <&vreg_l3a>;

	status = "okay";
};

&qup1 {
	status = "okay";
};

&qup2 {
	status = "okay";
};

&remoteproc_adsp {
	firmware-name = "qcom/sa8540p/adsp.mbn";
	status = "okay";
};

&remoteproc_nsp0 {
	firmware-name = "qcom/sa8540p/cdsp.mbn";
	status = "okay";
};

&remoteproc_nsp1 {
	firmware-name = "qcom/sa8540p/cdsp1.mbn";
	status = "okay";
};

&uart17 {
	compatible = "qcom,geni-debug-uart";
	status = "okay";
};

&ufs_mem_hc {
	reset-gpios = <&tlmm 228 GPIO_ACTIVE_LOW>;

	vcc-supply = <&vreg_l17c>;
	vcc-max-microamp = <800000>;
	vccq-supply = <&vreg_l6c>;
	vccq-max-microamp = <900000>;

	status = "okay";
};

&ufs_mem_phy {
	vdda-phy-supply = <&vreg_l8g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&ufs_card_hc {
	reset-gpios = <&tlmm 229 GPIO_ACTIVE_LOW>;

	vcc-supply = <&vreg_l10c>;
	vcc-max-microamp = <800000>;
	vccq-supply = <&vreg_l3c>;
	vccq-max-microamp = <900000>;

	status = "okay";
};

&ufs_card_phy {
	vdda-phy-supply = <&vreg_l8g>;
	vdda-pll-supply = <&vreg_l3g>;

	status = "okay";
};

&usb_0 {
	status = "okay";
};

&usb_0_dwc3 {
	/* TODO: Define USB-C connector properly */
	dr_mode = "peripheral";
};

&usb_0_hsphy {
	vdda-pll-supply = <&vreg_l5a>;
	vdda18-supply = <&vreg_l7a>;
	vdda33-supply = <&vreg_l13a>;

	status = "okay";
};

&usb_0_qmpphy {
	vdda-phy-supply = <&vreg_l3a>;
	vdda-pll-supply = <&vreg_l5a>;

	status = "okay";
};

&usb_1 {
	status = "okay";
};

&usb_1_dwc3 {
	/* TODO: Define USB-C connector properly */
	dr_mode = "host";
};

&usb_1_hsphy {
	vdda-pll-supply = <&vreg_l1c>;
	vdda18-supply = <&vreg_l7c>;
	vdda33-supply = <&vreg_l2c>;

	status = "okay";
};

&usb_1_qmpphy {
	vdda-phy-supply = <&vreg_l4c>;
	vdda-pll-supply = <&vreg_l1c>;

	status = "okay";
};

&usb_2_hsphy0 {
	vdda-pll-supply = <&vreg_l5a>;
	vdda18-supply = <&vreg_l7g>;
	vdda33-supply = <&vreg_l13a>;

	status = "okay";
};

&usb_2_hsphy1 {
	vdda-pll-supply = <&vreg_l5a>;
	vdda18-supply = <&vreg_l7g>;
	vdda33-supply = <&vreg_l13a>;

	status = "okay";
};

&usb_2_hsphy2 {
	vdda-pll-supply = <&vreg_l5a>;
	vdda18-supply = <&vreg_l7g>;
	vdda33-supply = <&vreg_l13a>;

	status = "okay";
};

&usb_2_hsphy3 {
	vdda-pll-supply = <&vreg_l5a>;
	vdda18-supply = <&vreg_l7g>;
	vdda33-supply = <&vreg_l13a>;

	status = "okay";
};

&usb_2_qmpphy0 {
	vdda-phy-supply = <&vreg_l3a>;
	vdda-pll-supply = <&vreg_l5a>;

	status = "okay";
};

&usb_2_qmpphy1 {
	vdda-phy-supply = <&vreg_l3a>;
	vdda-pll-supply = <&vreg_l5a>;

	status = "okay";
};

&xo_board_clk {
	clock-frequency = <38400000>;
};

/* PINCTRL */

&pmm8540a_gpios {
	max20411_en: max20411-en-state {
		pins = "gpio2";
		function = "normal";
		output-enable;
	};
};

&tlmm {
	pcie2a_default: pcie2a-default-state {
		clkreq-n-pins {
			pins = "gpio142";
			function = "pcie2a_clkreq";
			drive-strength = <2>;
			bias-pull-up;
		};

		perst-n-pins {
			pins = "gpio143";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-down;
		};

		wake-n-pins {
			pins = "gpio145";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};

	pcie3a_default: pcie3a-default-state {
		clkreq-n-pins {
			pins = "gpio150";
			function = "pcie3a_clkreq";
			drive-strength = <2>;
			bias-pull-up;
		};

		perst-n-pins {
			pins = "gpio151";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-down;
		};

		wake-n-pins {
			pins = "gpio56";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};

	pcie3b_default: pcie3b-default-state {
		clkreq-n-pins {
			pins = "gpio152";
			function = "pcie3b_clkreq";
			drive-strength = <2>;
			bias-pull-up;
		};

		perst-n-pins {
			pins = "gpio153";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-down;
		};

		wake-n-pins {
			pins = "gpio130";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};

	pcie4_default: pcie4-default-state {
		clkreq-n-pins {
			pins = "gpio140";
			function = "pcie4_clkreq";
			drive-strength = <2>;
			bias-pull-up;
		};

		perst-n-pins {
			pins = "gpio141";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-down;
		};

		wake-n-pins {
			pins = "gpio139";
			function = "gpio";
			drive-strength = <2>;
			bias-pull-up;
		};
	};

	qup1_i2c4_state: qup1-i2c4-state {
		pins = "gpio0", "gpio1";
		function = "qup12";
		drive-strength = <2>;
		bias-pull-up;
	};
};
