Эх сурвалжийг харах

disp: msm: dp: Add support for USB3 GDSC vote from displayport driver

On kailua onwards USB3 DP SSPHY power is control using GDSC.
This change adds support to vote for GDSC when displayport
driver is active.

Change-Id: I2e741f2091018f5dae9a1e7e886179bc6b982d40
Signed-off-by: Vara Reddy <[email protected]>
Vara Reddy 3 жил өмнө
parent
commit
7561633b58

+ 27 - 0
msm/dp/dp_power.c

@@ -81,6 +81,23 @@ static void dp_power_regulator_deinit(struct dp_power_private *power)
 	}
 	}
 }
 }
 
 
+static void dp_power_phy_gdsc(struct dp_power *dp_power, bool on)
+{
+	int rc = 0;
+
+	if (IS_ERR_OR_NULL(dp_power->dp_phy_gdsc))
+		return;
+
+	if (on)
+		rc = regulator_enable(dp_power->dp_phy_gdsc);
+	else
+		rc = regulator_disable(dp_power->dp_phy_gdsc);
+
+	if (rc)
+		DP_ERR("Fail to %s dp_phy_gdsc regulator ret =%d\n",
+				on ? "enable" : "disable", rc);
+}
+
 static int dp_power_regulator_ctrl(struct dp_power_private *power, bool enable)
 static int dp_power_regulator_ctrl(struct dp_power_private *power, bool enable)
 {
 {
 	int rc = 0, i = 0, j = 0;
 	int rc = 0, i = 0, j = 0;
@@ -94,6 +111,8 @@ static int dp_power_regulator_ctrl(struct dp_power_private *power, bool enable)
 		 * on the link configuration.
 		 * on the link configuration.
 		 */
 		 */
 		if (i == DP_PLL_PM) {
 		if (i == DP_PLL_PM) {
+			/* DP GDSC vote is needed for new chipsets, define gdsc phandle if needed */
+			dp_power_phy_gdsc(&power->dp_power, enable);
 			DP_DEBUG("skipping: '%s' vregs for %s\n",
 			DP_DEBUG("skipping: '%s' vregs for %s\n",
 					enable ? "enable" : "disable",
 					enable ? "enable" : "disable",
 					dp_parser_pm_name(i));
 					dp_parser_pm_name(i));
@@ -822,6 +841,7 @@ struct dp_power *dp_power_get(struct dp_parser *parser, struct dp_pll *pll)
 	int rc = 0;
 	int rc = 0;
 	struct dp_power_private *power;
 	struct dp_power_private *power;
 	struct dp_power *dp_power;
 	struct dp_power *dp_power;
+	struct device *dev;
 
 
 	if (!parser || !pll) {
 	if (!parser || !pll) {
 		DP_ERR("invalid input\n");
 		DP_ERR("invalid input\n");
@@ -840,6 +860,7 @@ struct dp_power *dp_power_get(struct dp_parser *parser, struct dp_pll *pll)
 	power->pdev = parser->pdev;
 	power->pdev = parser->pdev;
 
 
 	dp_power = &power->dp_power;
 	dp_power = &power->dp_power;
+	dev = &power->pdev->dev;
 
 
 	dp_power->init = dp_power_init;
 	dp_power->init = dp_power_init;
 	dp_power->deinit = dp_power_deinit;
 	dp_power->deinit = dp_power_deinit;
@@ -852,6 +873,12 @@ struct dp_power *dp_power_get(struct dp_parser *parser, struct dp_pll *pll)
 	dp_power->power_client_deinit = dp_power_client_deinit;
 	dp_power->power_client_deinit = dp_power_client_deinit;
 	dp_power->power_mmrm_init = dp_power_mmrm_init;
 	dp_power->power_mmrm_init = dp_power_mmrm_init;
 
 
+	dp_power->dp_phy_gdsc = devm_regulator_get(dev, "dp_phy_gdsc");
+	if (IS_ERR(dp_power->dp_phy_gdsc)) {
+		dp_power->dp_phy_gdsc = NULL;
+		DP_DEBUG("Optional GDSC regulator is missing\n");
+	}
+
 	return dp_power;
 	return dp_power;
 error:
 error:
 	return ERR_PTR(rc);
 	return ERR_PTR(rc);

+ 3 - 0
msm/dp/dp_power.h

@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
 /*
+ * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved.
  * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
  * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
  */
  */
 
 
@@ -13,6 +14,7 @@
 /**
 /**
  * sruct dp_power - DisplayPort's power related data
  * sruct dp_power - DisplayPort's power related data
  *
  *
+ * @dp_phy_gdsc: GDSC regulator
  * @init: initializes the regulators/core clocks/GPIOs/pinctrl
  * @init: initializes the regulators/core clocks/GPIOs/pinctrl
  * @deinit: turns off the regulators/core clocks/GPIOs/pinctrl
  * @deinit: turns off the regulators/core clocks/GPIOs/pinctrl
  * @clk_enable: enable/disable the DP clocks
  * @clk_enable: enable/disable the DP clocks
@@ -27,6 +29,7 @@
 struct dp_power {
 struct dp_power {
 	struct drm_device *drm_dev;
 	struct drm_device *drm_dev;
 	struct sde_power_handle *phandle;
 	struct sde_power_handle *phandle;
+	struct regulator *dp_phy_gdsc;
 	int (*init)(struct dp_power *power, bool flip);
 	int (*init)(struct dp_power *power, bool flip);
 	int (*deinit)(struct dp_power *power);
 	int (*deinit)(struct dp_power *power);
 	int (*clk_enable)(struct dp_power *power, enum dp_pm_type pm_type,
 	int (*clk_enable)(struct dp_power *power, enum dp_pm_type pm_type,