diff options
author | Shawn Guo <shawn.guo@linaro.org> | 2020-08-28 11:28:59 +0800 |
---|---|---|
committer | Shawn Guo <shawn.guo@linaro.org> | 2020-08-28 11:28:59 +0800 |
commit | 8364ddc9a1d84ff13b9c732e4d64ea1aa39a696f (patch) | |
tree | d235d29c8c8ca3c7c1762d89e374c7e4f953cc57 | |
parent | 0c16fd6d9387bc1cdc8f87a241ff1e6d0365ae23 (diff) | |
parent | 9f86028b929d86d5eb2843aa52f7124e0a410e2c (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.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 45 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_kms.h | 4 | ||||
-rw-r--r-- | drivers/phy/qualcomm/phy-qcom-usb-hs.c | 38 | ||||
-rw-r--r-- | drivers/usb/chipidea/ci_hdrc_msm.c | 25 | ||||
-rw-r--r-- | sound/soc/codecs/msm8916-wcd-analog.c | 24 | ||||
-rw-r--r-- | sound/soc/codecs/msm8916-wcd-digital.c | 26 | ||||
-rw-r--r-- | sound/soc/qcom/lpass-apq8016.c | 27 |
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, |