// SPDX-License-Identifier: BSD-3-Clause
/*
 * Copyright (c) 2021, Linaro Limited
 */

/dts-v1/;

#include <dt-bindings/regulator/qcom,rpmh-regulator.h>
#include <dt-bindings/gpio/gpio.h>
#include "sa8155p.dtsi"
#include "pmm8155au_1.dtsi"
#include "pmm8155au_2.dtsi"

/ {
	model = "Qualcomm Technologies, Inc. SA8155P ADP";
	compatible = "qcom,sa8155p-adp", "qcom,sa8155p";

	aliases {
		serial0 = &uart2;
		serial1 = &uart9;
	};

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

	vreg_3p3: vreg-3p3-regulator {
		compatible = "regulator-fixed";
		regulator-name = "vreg_3p3";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
	};

	/*
	 * S4A is always on and not controllable through RPMh.
	 * So model it as a fixed regulator.
	 */
	vreg_s4a_1p8: smps4 {
		compatible = "regulator-fixed";
		regulator-name = "vreg_s4a_1p8";

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

		regulator-always-on;
		regulator-boot-on;

		vin-supply = <&vreg_3p3>;
	};
};

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

		vdd-s1-supply = <&vreg_3p3>;
		vdd-s2-supply = <&vreg_3p3>;
		vdd-s3-supply = <&vreg_3p3>;
		vdd-s4-supply = <&vreg_3p3>;
		vdd-s5-supply = <&vreg_3p3>;
		vdd-s6-supply = <&vreg_3p3>;
		vdd-s7-supply = <&vreg_3p3>;
		vdd-s8-supply = <&vreg_3p3>;
		vdd-s9-supply = <&vreg_3p3>;
		vdd-s10-supply = <&vreg_3p3>;

		vdd-l1-l8-l11-supply = <&vreg_s6a_0p92>;
		vdd-l2-l10-supply = <&vreg_3p3>;
		vdd-l3-l4-l5-l18-supply = <&vreg_s6a_0p92>;
		vdd-l6-l9-supply = <&vreg_s6a_0p92>;
		vdd-l7-l12-l14-l15-supply = <&vreg_s5a_2p04>;
		vdd-l13-l16-l17-supply = <&vreg_3p3>;

		vreg_s5a_2p04: smps5 {
			regulator-name = "vreg_s5a_2p04";
			regulator-min-microvolt = <1904000>;
			regulator-max-microvolt = <2000000>;
		};

		vreg_s6a_0p92: smps6 {
			regulator-name = "vreg_s6a_0p92";
			regulator-min-microvolt = <920000>;
			regulator-max-microvolt = <1128000>;
		};

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

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

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

		vdd_usb_hs_core:
		vdda_usb_ss_dp_core_1:
		vreg_l5a_0p88: ldo5 {
			regulator-name = "vreg_l5a_0p88";
			regulator-min-microvolt = <880000>;
			regulator-max-microvolt = <880000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
			regulator-allow-set-load;
			regulator-allowed-modes = <RPMH_REGULATOR_MODE_LPM
						   RPMH_REGULATOR_MODE_HPM>;
		};

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

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

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

		vdda_usb_hs_1p8:
		vreg_l12a_1p8: ldo12 {
			regulator-name = "vreg_l12a_1p8";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <1800000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

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

		vreg_l15a_1p7: ldo15 {
			regulator-name = "vreg_l15a_1p7";
			regulator-min-microvolt = <1704000>;
			regulator-max-microvolt = <1704000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l16a_2p7: ldo16 {
			regulator-name = "vreg_l16a_2p7";
			regulator-min-microvolt = <2704000>;
			regulator-max-microvolt = <2960000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l17a_2p96: ldo17 {
			regulator-name = "vreg_l17a_2p96";
			regulator-min-microvolt = <2504000>;
			regulator-max-microvolt = <2960000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};
	};

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

		vdd-s1-supply = <&vreg_3p3>;
		vdd-s2-supply = <&vreg_3p3>;
		vdd-s3-supply = <&vreg_3p3>;
		vdd-s4-supply = <&vreg_3p3>;
		vdd-s5-supply = <&vreg_3p3>;
		vdd-s6-supply = <&vreg_3p3>;
		vdd-s7-supply = <&vreg_3p3>;
		vdd-s8-supply = <&vreg_3p3>;
		vdd-s9-supply = <&vreg_3p3>;
		vdd-s10-supply = <&vreg_3p3>;

		vdd-l1-l8-l11-supply = <&vreg_s4c_1p352>;
		vdd-l2-l10-supply = <&vreg_3p3>;
		vdd-l3-l4-l5-l18-supply = <&vreg_s4c_1p352>;
		vdd-l6-l9-supply = <&vreg_s6c_1p128>;
		vdd-l7-l12-l14-l15-supply = <&vreg_s5c_2p04>;
		vdd-l13-l16-l17-supply = <&vreg_3p3>;

		vreg_s4c_1p352: smps4 {
			regulator-name = "vreg_s4c_1p352";
			regulator-min-microvolt = <1352000>;
			regulator-max-microvolt = <1352000>;
		};

		vreg_s5c_2p04: smps5 {
			regulator-name = "vreg_s5c_2p04";
			regulator-min-microvolt = <1904000>;
			regulator-max-microvolt = <2000000>;
		};

		vreg_s6c_1p128: smps6 {
			regulator-name = "vreg_s6c_1p128";
			regulator-min-microvolt = <1128000>;
			regulator-max-microvolt = <1128000>;
		};

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

		vreg_l2c_1p808: ldo2 {
			regulator-name = "vreg_l2c_1p808";
			regulator-min-microvolt = <1704000>;
			regulator-max-microvolt = <2928000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l5c_1p2: ldo5 {
			regulator-name = "vreg_l5c_1p2";
			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_1p8: ldo7 {
			regulator-name = "vreg_l7c_1p8";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <1800000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l8c_1p2: ldo8 {
			regulator-name = "vreg_l8c_1p2";
			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_l10c_3p3: ldo10 {
			regulator-name = "vreg_l10c_3p3";
			regulator-min-microvolt = <3000000>;
			regulator-max-microvolt = <3312000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

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

		vreg_l12c_1p808: ldo12 {
			regulator-name = "vreg_l12c_1p808";
			regulator-min-microvolt = <1704000>;
			regulator-max-microvolt = <2928000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l13c_2p96: ldo13 {
			regulator-name = "vreg_l13c_2p96";
			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <2960000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l15c_1p9: ldo15 {
			regulator-name = "vreg_l15c_1p9";
			regulator-min-microvolt = <1704000>;
			regulator-max-microvolt = <2928000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

		vreg_l16c_3p008: ldo16 {
			regulator-name = "vreg_l16c_3p008";
			regulator-min-microvolt = <3008000>;
			regulator-max-microvolt = <3008000>;
			regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
		};

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

&ethernet {
	status = "okay";

	snps,reset-gpio = <&tlmm 79 GPIO_ACTIVE_LOW>;
	snps,reset-active-low;
	snps,reset-delays-us = <0 11000 70000>;

	snps,mtl-rx-config = <&mtl_rx_setup>;
	snps,mtl-tx-config = <&mtl_tx_setup>;

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

	phy-handle = <&rgmii_phy>;
	phy-mode = "rgmii";
	max-speed = <1000>;

	mdio {
		compatible = "snps,dwmac-mdio";
		#address-cells = <1>;
		#size-cells = <0>;

		/* Micrel KSZ9031RNZ PHY */
		rgmii_phy: phy@7 {
			compatible = "ethernet-phy-ieee802.3-c22";
			reg = <0x7>;

			interrupts-extended = <&tlmm 124 IRQ_TYPE_EDGE_FALLING>;
			device_type = "ethernet-phy";
		};
	};

	mtl_rx_setup: rx-queues-config {
		snps,rx-queues-to-use = <1>;
		snps,rx-sched-sp;

		queue0 {
			snps,dcb-algorithm;
			snps,map-to-dma-channel = <0x0>;
			snps,route-up;
			snps,priority = <0x1>;
		};
	};

	mtl_tx_setup: tx-queues-config {
		snps,tx-queues-to-use = <1>;
		snps,tx-sched-wrr;

		queue0 {
			snps,weight = <0x10>;
			snps,dcb-algorithm;
			snps,priority = <0x0>;
		};
	};
};

&pmm8155au_1_gpios {
	pmm8155au_1_sdc2_cd: sdc2-cd-default-state {
		pins = "gpio4";
		function = "normal";
		input-enable;
		bias-pull-up;
		power-source = <0>;
	};
};

&qupv3_id_1 {
	status = "okay";
};

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

&remoteproc_cdsp {
	status = "okay";
	firmware-name = "qcom/sa8155p/cdsp.mdt";
};

&sdhc_2 {
	status = "okay";

	cd-gpios = <&pmm8155au_1_gpios 4 GPIO_ACTIVE_LOW>;
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&sdc2_on &pmm8155au_1_sdc2_cd>;
	pinctrl-1 = <&sdc2_off &pmm8155au_1_sdc2_cd>;
	vqmmc-supply = <&vreg_l13c_2p96>; /* IO line power */
	vmmc-supply = <&vreg_l17a_2p96>;  /* Card power line */
	bus-width = <4>;
	no-sdio;
	no-mmc;
};

&uart2 {
	status = "okay";
};

&uart9 {
	status = "okay";
};

&ufs_mem_hc {
	status = "okay";

	reset-gpios = <&tlmm 175 GPIO_ACTIVE_LOW>;

	vcc-supply = <&vreg_l10a_2p96>;
	vcc-max-microamp = <750000>;
	vccq-supply = <&vreg_l5c_1p2>;
	vccq-max-microamp = <700000>;
	vccq2-supply = <&vreg_s4a_1p8>;
	vccq2-max-microamp = <750000>;
};

&ufs_mem_phy {
	status = "okay";

	vdda-phy-supply = <&vreg_l8c_1p2>;
	vdda-pll-supply = <&vreg_l5a_0p88>;
};

&usb_1 {
	status = "okay";
};

&usb_1_dwc3 {
	dr_mode = "host";

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

&usb_1_hsphy {
	status = "okay";
	vdda-pll-supply = <&vdd_usb_hs_core>;
	vdda33-supply = <&vdda_usb_hs_3p1>;
	vdda18-supply = <&vdda_usb_hs_1p8>;
};

&usb_1_qmpphy {
	status = "disabled";
};

&usb_2 {
	status = "okay";
};

&usb_2_dwc3 {
	dr_mode = "host";

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

&usb_2_hsphy {
	status = "okay";
	vdda-pll-supply = <&vdd_usb_hs_core>;
	vdda33-supply = <&vdda_usb_hs_3p1>;
	vdda18-supply = <&vdda_usb_hs_1p8>;
};

&usb_2_qmpphy {
	status = "okay";
	vdda-phy-supply = <&vreg_l8c_1p2>;
	vdda-pll-supply = <&vdda_usb_ss_dp_core_1>;
};

&pcie0 {
	status = "okay";
};

&pcie0_phy {
	status = "okay";
	vdda-phy-supply = <&vreg_l18c_0p88>;
	vdda-pll-supply = <&vreg_l8c_1p2>;
};

&pcie1_phy {
	vdda-phy-supply = <&vreg_l18c_0p88>;
	vdda-pll-supply = <&vreg_l8c_1p2>;
};

&tlmm {
	gpio-reserved-ranges = <0 4>;

	sdc2_on: sdc2-on-state {
		clk-pins {
			pins = "sdc2_clk";
			bias-disable;		/* No pull */
			drive-strength = <16>;	/* 16 MA */
		};

		cmd-pins {
			pins = "sdc2_cmd";
			bias-pull-up;		/* pull up */
			drive-strength = <16>;	/* 16 MA */
		};

		data-pins {
			pins = "sdc2_data";
			bias-pull-up;		/* pull up */
			drive-strength = <16>;	/* 16 MA */
		};
	};

	sdc2_off: sdc2-off-state {
		clk-pins {
			pins = "sdc2_clk";
			bias-disable;		/* No pull */
			drive-strength = <2>;	/* 2 MA */
		};

		cmd-pins {
			pins = "sdc2_cmd";
			bias-pull-up;		/* pull up */
			drive-strength = <2>;	/* 2 MA */
		};

		data-pins {
			pins = "sdc2_data";
			bias-pull-up;		/* pull up */
			drive-strength = <2>;	/* 2 MA */
		};
	};

	usb2phy_ac_en1_default: usb2phy-ac-en1-default-state {
		pins = "gpio113";
		function = "usb2phy_ac";
		bias-disable;
		drive-strength = <2>;
	};

	usb2phy_ac_en2_default: usb2phy-ac-en2-default-state {
		pins = "gpio123";
		function = "usb2phy_ac";
		bias-disable;
		drive-strength = <2>;
	};

	ethernet_defaults: ethernet-defaults-state {
		mdc-pins {
			pins = "gpio7";
			function = "rgmii";
			bias-pull-up;
		};

		mdio-pins {
			pins = "gpio59";
			function = "rgmii";
			bias-pull-up;
		};

		rgmii-rx-pins {
			pins = "gpio117", "gpio118", "gpio119", "gpio120", "gpio115", "gpio116";
			function = "rgmii";
			bias-disable;
			drive-strength = <2>;
		};

		rgmii-tx-pins {
			pins = "gpio122", "gpio4", "gpio5", "gpio6", "gpio114", "gpio121";
			function = "rgmii";
			bias-pull-up;
			drive-strength = <16>;
		};

		phy-intr-pins {
			pins = "gpio124";
			function = "emac_phy";
			bias-disable;
			drive-strength = <8>;
		};

		pps-pins {
			pins = "gpio81";
			function = "emac_pps";
			bias-disable;
			drive-strength = <8>;
		};

		phy-reset-pins {
			pins = "gpio79";
			function = "gpio";
			bias-pull-up;
			drive-strength = <16>;
		};
	};
};
