aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Guo <shawn.guo@linaro.org>2020-08-28 11:28:59 +0800
committerShawn Guo <shawn.guo@linaro.org>2020-08-28 11:28:59 +0800
commit8364ddc9a1d84ff13b9c732e4d64ea1aa39a696f (patch)
treed235d29c8c8ca3c7c1762d89e374c7e4f953cc57
parent0c16fd6d9387bc1cdc8f87a241ff1e6d0365ae23 (diff)
parent9f86028b929d86d5eb2843aa52f7124e0a410e2c (diff)
Merge branch 'topic/vddmin-devices' into linaro/linux-4.19.ylinaro-m4-2020_08_28
-rw-r--r--drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h4
-rw-r--r--drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c45
-rw-r--r--drivers/gpu/drm/msm/dsi/dsi.c2
-rw-r--r--drivers/gpu/drm/msm/msm_kms.h4
-rw-r--r--drivers/phy/qualcomm/phy-qcom-usb-hs.c38
-rw-r--r--drivers/usb/chipidea/ci_hdrc_msm.c25
-rw-r--r--sound/soc/codecs/msm8916-wcd-analog.c24
-rw-r--r--sound/soc/codecs/msm8916-wcd-digital.c26
-rw-r--r--sound/soc/qcom/lpass-apq8016.c27
9 files changed, 191 insertions, 4 deletions
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
index 66d466628e2b..05c0a3fa0bef 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
@@ -159,10 +159,6 @@ struct vsync_info {
#define to_dpu_kms(x) container_of(x, struct dpu_kms, base)
-/* get struct msm_kms * from drm_device * */
-#define ddev_to_msm_kms(D) ((D) && (D)->dev_private ? \
- ((struct msm_drm_private *)((D)->dev_private))->kms : NULL)
-
/**
* dpu_kms_is_suspend_state - whether or not the system is pm suspended
* @dev: Pointer to drm device
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 62e7129cc0a5..2bef9c6723f5 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -24,6 +24,9 @@
#include "msm_mmu.h"
#include "mdp5_kms.h"
+int mdp5_enable(struct mdp5_kms *mdp5_kms);
+int mdp5_disable(struct mdp5_kms *mdp5_kms);
+
static const char *iommu_ports[] = {
"mdp_0",
};
@@ -292,6 +295,46 @@ static int mdp5_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor)
}
#endif
+static int mdp5_kms_pm_suspend(struct device *dev)
+{
+ struct drm_device *ddev = dev_get_drvdata(dev);
+ struct msm_drm_private *priv = ddev->dev_private;
+ struct msm_kms *msm_kms = ddev_to_msm_kms(ddev);
+ struct mdp_kms *mdp_kms = to_mdp_kms(msm_kms);
+ struct mdp5_kms *mdp5_kms = to_mdp5_kms(mdp_kms);
+ struct msm_mdss *mdss = priv->mdss;
+
+ drm_kms_helper_poll_disable(ddev);
+
+ priv->pm_state = drm_atomic_helper_suspend(ddev);
+ if (IS_ERR(priv->pm_state)) {
+ drm_kms_helper_poll_enable(ddev);
+ return PTR_ERR(priv->pm_state);
+ }
+
+ mdp5_disable(mdp5_kms);
+ mdss->funcs->disable(mdss);
+
+ return 0;
+}
+
+static int mdp5_kms_pm_resume(struct device *dev)
+{
+ struct drm_device *ddev = dev_get_drvdata(dev);
+ struct msm_drm_private *priv = ddev->dev_private;
+ struct msm_kms *msm_kms = ddev_to_msm_kms(ddev);
+ struct mdp_kms *mdp_kms = to_mdp_kms(msm_kms);
+ struct mdp5_kms *mdp5_kms = to_mdp5_kms(mdp_kms);
+ struct msm_mdss *mdss = priv->mdss;
+
+ mdss->funcs->enable(mdss);
+ mdp5_enable(mdp5_kms);
+ drm_atomic_helper_resume(ddev, priv->pm_state);
+ drm_kms_helper_poll_enable(ddev);
+
+ return 0;
+}
+
static const struct mdp_kms_funcs kms_funcs = {
.base = {
.hw_init = mdp5_hw_init,
@@ -312,6 +355,8 @@ static const struct mdp_kms_funcs kms_funcs = {
#ifdef CONFIG_DEBUG_FS
.debugfs_init = mdp5_kms_debugfs_init,
#endif
+ .pm_suspend = mdp5_kms_pm_suspend,
+ .pm_resume = mdp5_kms_pm_resume,
},
.set_irqmask = mdp5_set_irqmask,
};
diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
index ff8164cc6738..bb91e367def4 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.c
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
@@ -162,6 +162,8 @@ static const struct of_device_id dt_match[] = {
};
static const struct dev_pm_ops dsi_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
SET_RUNTIME_PM_OPS(msm_dsi_runtime_suspend, msm_dsi_runtime_resume, NULL)
};
diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h
index e5a3abf8a2af..9d35b8928415 100644
--- a/drivers/gpu/drm/msm/msm_kms.h
+++ b/drivers/gpu/drm/msm/msm_kms.h
@@ -87,6 +87,10 @@ struct msm_kms {
struct msm_gem_address_space *aspace;
};
+/* get struct msm_kms * from drm_device * */
+#define ddev_to_msm_kms(D) ((D) && (D)->dev_private ? \
+ ((struct msm_drm_private *)((D)->dev_private))->kms : NULL)
+
static inline void msm_kms_init(struct msm_kms *kms,
const struct msm_kms_funcs *funcs)
{
diff --git a/drivers/phy/qualcomm/phy-qcom-usb-hs.c b/drivers/phy/qualcomm/phy-qcom-usb-hs.c
index 1af85999909a..20f7ff64b4cd 100644
--- a/drivers/phy/qualcomm/phy-qcom-usb-hs.c
+++ b/drivers/phy/qualcomm/phy-qcom-usb-hs.c
@@ -43,6 +43,7 @@ struct qcom_usb_hs_phy {
struct icc_path *path;
struct notifier_block vbus_notify;
u8 enable_vbus_pullup:1;
+ bool powered;
};
static int qcom_usb_hs_phy_set_mode(struct phy *phy, enum phy_mode mode)
@@ -194,6 +195,8 @@ static int qcom_usb_hs_phy_power_on(struct phy *phy)
goto err_ulpi;
}
+ uphy->powered = true;
+
return 0;
err_ulpi:
regulator_disable(uphy->v3p3);
@@ -229,6 +232,8 @@ static int qcom_usb_hs_phy_power_off(struct phy *phy)
clk_disable_unprepare(uphy->sleep_clk);
clk_disable_unprepare(uphy->ref_clk);
+ uphy->powered = false;
+
return 0;
}
@@ -314,10 +319,42 @@ static int qcom_usb_hs_phy_probe(struct ulpi *ulpi)
uphy->vbus_notify.notifier_call = qcom_usb_hs_phy_vbus_notifier;
phy_set_drvdata(uphy->phy, uphy);
+ dev_set_drvdata(&ulpi->dev, uphy);
+
p = devm_of_phy_provider_register(&ulpi->dev, of_phy_simple_xlate);
return PTR_ERR_OR_ZERO(p);
}
+static int __maybe_unused qcom_usb_hs_phy_pm_suspend(struct device *dev)
+{
+ struct qcom_usb_hs_phy *uphy = dev_get_drvdata(dev);
+
+ /* Only need to manage clock when phy is powered on */
+ if (!uphy->powered)
+ return 0;
+
+ clk_disable_unprepare(uphy->ref_clk);
+
+ return 0;
+}
+
+static int __maybe_unused qcom_usb_hs_phy_pm_resume(struct device *dev)
+{
+ struct qcom_usb_hs_phy *uphy = dev_get_drvdata(dev);
+
+ if (!uphy->powered)
+ return 0;
+
+ clk_prepare_enable(uphy->ref_clk);
+
+ return 0;
+}
+
+static const struct dev_pm_ops qcom_usb_hs_phy_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(qcom_usb_hs_phy_pm_suspend,
+ qcom_usb_hs_phy_pm_resume)
+};
+
static const struct of_device_id qcom_usb_hs_phy_match[] = {
{ .compatible = "qcom,usb-hs-phy", },
{ }
@@ -329,6 +366,7 @@ static struct ulpi_driver qcom_usb_hs_phy_driver = {
.driver = {
.name = "qcom_usb_hs_phy",
.of_match_table = qcom_usb_hs_phy_match,
+ .pm = &qcom_usb_hs_phy_pm_ops,
},
};
module_ulpi_driver(qcom_usb_hs_phy_driver);
diff --git a/drivers/usb/chipidea/ci_hdrc_msm.c b/drivers/usb/chipidea/ci_hdrc_msm.c
index 266b80328ad8..4a0eab73b540 100644
--- a/drivers/usb/chipidea/ci_hdrc_msm.c
+++ b/drivers/usb/chipidea/ci_hdrc_msm.c
@@ -294,6 +294,30 @@ static int ci_hdrc_msm_remove(struct platform_device *pdev)
return 0;
}
+static int __maybe_unused msm_ci_pm_suspend(struct device *dev)
+{
+ struct ci_hdrc_msm *ci = dev_get_drvdata(dev);
+
+ clk_disable_unprepare(ci->iface_clk);
+ clk_disable_unprepare(ci->core_clk);
+
+ return 0;
+}
+
+static int __maybe_unused msm_ci_pm_resume(struct device *dev)
+{
+ struct ci_hdrc_msm *ci = dev_get_drvdata(dev);
+
+ clk_prepare_enable(ci->core_clk);
+ clk_prepare_enable(ci->iface_clk);
+
+ return 0;
+}
+
+static const struct dev_pm_ops msm_ci_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(msm_ci_pm_suspend, msm_ci_pm_resume)
+};
+
static const struct of_device_id msm_ci_dt_match[] = {
{ .compatible = "qcom,ci-hdrc", },
{ }
@@ -306,6 +330,7 @@ static struct platform_driver ci_hdrc_msm_driver = {
.driver = {
.name = "msm_hsusb",
.of_match_table = msm_ci_dt_match,
+ .pm = &msm_ci_pm_ops,
},
};
diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
index cbdb6d4bb91e..e61676ce9a04 100644
--- a/sound/soc/codecs/msm8916-wcd-analog.c
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -1252,6 +1252,29 @@ static int pm8916_wcd_analog_spmi_remove(struct platform_device *pdev)
return 0;
}
+static __maybe_unused int pm8916_wcd_analog_pm_suspend(struct device *dev)
+{
+ struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(dev);
+
+ clk_disable_unprepare(priv->mclk);
+
+ return 0;
+}
+
+static __maybe_unused int pm8916_wcd_analog_pm_resume(struct device *dev)
+{
+ struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(dev);
+
+ clk_prepare_enable(priv->mclk);
+
+ return 0;
+}
+
+static const struct dev_pm_ops pm8916_wcd_analog_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(pm8916_wcd_analog_pm_suspend,
+ pm8916_wcd_analog_pm_resume)
+};
+
static const struct of_device_id pm8916_wcd_analog_spmi_match_table[] = {
{ .compatible = "qcom,pm8916-wcd-analog-codec", },
{ }
@@ -1263,6 +1286,7 @@ static struct platform_driver pm8916_wcd_analog_spmi_driver = {
.driver = {
.name = "qcom,pm8916-wcd-spmi-codec",
.of_match_table = pm8916_wcd_analog_spmi_match_table,
+ .pm = &pm8916_wcd_analog_pm_ops,
},
.probe = pm8916_wcd_analog_spmi_probe,
.remove = pm8916_wcd_analog_spmi_remove,
diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
index 6de2ab6f9706..1610833637b3 100644
--- a/sound/soc/codecs/msm8916-wcd-digital.c
+++ b/sound/soc/codecs/msm8916-wcd-digital.c
@@ -938,6 +938,31 @@ static int msm8916_wcd_digital_remove(struct platform_device *pdev)
return 0;
}
+static __maybe_unused int pm8916_wcd_digtal_pm_suspend(struct device *dev)
+{
+ struct msm8916_wcd_digital_priv *priv = dev_get_drvdata(dev);
+
+ clk_disable_unprepare(priv->mclk);
+ clk_disable_unprepare(priv->ahbclk);
+
+ return 0;
+}
+
+static __maybe_unused int pm8916_wcd_digtal_pm_resume(struct device *dev)
+{
+ struct msm8916_wcd_digital_priv *priv = dev_get_drvdata(dev);
+
+ clk_prepare_enable(priv->ahbclk);
+ clk_prepare_enable(priv->mclk);
+
+ return 0;
+}
+
+static const struct dev_pm_ops pm8916_wcd_digtal_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(pm8916_wcd_digtal_pm_suspend,
+ pm8916_wcd_digtal_pm_resume)
+};
+
static const struct of_device_id msm8916_wcd_digital_match_table[] = {
{ .compatible = "qcom,msm8916-wcd-digital-codec" },
{ }
@@ -949,6 +974,7 @@ static struct platform_driver msm8916_wcd_digital_driver = {
.driver = {
.name = "msm8916-wcd-digital-codec",
.of_match_table = msm8916_wcd_digital_match_table,
+ .pm = &pm8916_wcd_digtal_pm_ops,
},
.probe = msm8916_wcd_digital_probe,
.remove = msm8916_wcd_digital_remove,
diff --git a/sound/soc/qcom/lpass-apq8016.c b/sound/soc/qcom/lpass-apq8016.c
index 8a74844d99e2..f3c4a034db30 100644
--- a/sound/soc/qcom/lpass-apq8016.c
+++ b/sound/soc/qcom/lpass-apq8016.c
@@ -213,6 +213,32 @@ static int apq8016_lpass_exit(struct platform_device *pdev)
return 0;
}
+static __maybe_unused int apq8016_lpass_pm_suspend(struct device *dev)
+{
+ struct lpass_data *drvdata = dev_get_drvdata(dev);
+
+ clk_disable_unprepare(drvdata->ahbix_clk);
+ clk_disable_unprepare(drvdata->pcnoc_sway_clk);
+ clk_disable_unprepare(drvdata->pcnoc_mport_clk);
+
+ return 0;
+}
+
+static __maybe_unused int apq8016_lpass_pm_resume(struct device *dev)
+{
+ struct lpass_data *drvdata = dev_get_drvdata(dev);
+
+ clk_prepare_enable(drvdata->pcnoc_mport_clk);
+ clk_prepare_enable(drvdata->pcnoc_sway_clk);
+ clk_prepare_enable(drvdata->ahbix_clk);
+
+ return 0;
+}
+
+static const struct dev_pm_ops apq8016_lpass_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(apq8016_lpass_pm_suspend,
+ apq8016_lpass_pm_resume)
+};
static struct lpass_variant apq8016_data = {
.i2sctrl_reg_base = 0x1000,
@@ -259,6 +285,7 @@ static struct platform_driver apq8016_lpass_cpu_platform_driver = {
.driver = {
.name = "apq8016-lpass-cpu",
.of_match_table = of_match_ptr(apq8016_lpass_cpu_device_id),
+ .pm = &apq8016_lpass_pm_ops,
},
.probe = asoc_qcom_lpass_cpu_platform_probe,
.remove = asoc_qcom_lpass_cpu_platform_remove,