From 7561633b58e648a798182f6e520f70f79a5ea36d Mon Sep 17 00:00:00 2001 From: Vara Reddy Date: Tue, 22 Feb 2022 23:22:08 -0800 Subject: [PATCH] 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 --- msm/dp/dp_power.c | 27 +++++++++++++++++++++++++++ msm/dp/dp_power.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/msm/dp/dp_power.c b/msm/dp/dp_power.c index 0c1df94c6f..de8ba05b2f 100644 --- a/msm/dp/dp_power.c +++ b/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) { 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. */ 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", enable ? "enable" : "disable", 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; struct dp_power_private *power; struct dp_power *dp_power; + struct device *dev; if (!parser || !pll) { 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; dp_power = &power->dp_power; + dev = &power->pdev->dev; dp_power->init = dp_power_init; 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_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; error: return ERR_PTR(rc); diff --git a/msm/dp/dp_power.h b/msm/dp/dp_power.h index 86d7247a38..e9984f0546 100644 --- a/msm/dp/dp_power.h +++ b/msm/dp/dp_power.h @@ -1,5 +1,6 @@ /* 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. */ @@ -13,6 +14,7 @@ /** * sruct dp_power - DisplayPort's power related data * + * @dp_phy_gdsc: GDSC regulator * @init: initializes the regulators/core clocks/GPIOs/pinctrl * @deinit: turns off the regulators/core clocks/GPIOs/pinctrl * @clk_enable: enable/disable the DP clocks @@ -27,6 +29,7 @@ struct dp_power { struct drm_device *drm_dev; struct sde_power_handle *phandle; + struct regulator *dp_phy_gdsc; int (*init)(struct dp_power *power, bool flip); int (*deinit)(struct dp_power *power); int (*clk_enable)(struct dp_power *power, enum dp_pm_type pm_type,