Loading asoc/codecs/msm-cdc-supply.c +68 −2 Original line number Diff line number Diff line Loading @@ -59,9 +59,22 @@ static int msm_cdc_dt_parse_vreg_info(struct device *dev, } cdc_vreg->optimum_uA = prop_val; dev_info(dev, "%s: %s: vol=[%d %d]uV, curr=[%d]uA, ond %d\n", /* Parse supply - LPM or NOM mode(default NOM) */ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "qcom,%s-lpm-supported", name); rc = of_property_read_u32(dev->of_node, prop_name, &prop_val); if (rc) { dev_dbg(dev, "%s: Looking up %s property in node %s failed", __func__, prop_name, dev->of_node->full_name); cdc_vreg->lpm_supported = 0; rc = 0; } else { cdc_vreg->lpm_supported = prop_val; } dev_info(dev, "%s: %s: vol=[%d %d]uV, curr=[%d]uA, ond %d lpm %d\n", __func__, cdc_vreg->name, cdc_vreg->min_uV, cdc_vreg->max_uV, cdc_vreg->optimum_uA, cdc_vreg->ondemand); cdc_vreg->optimum_uA, cdc_vreg->ondemand, cdc_vreg->lpm_supported); done: return rc; Loading Loading @@ -259,6 +272,59 @@ int msm_cdc_enable_ondemand_supply(struct device *dev, } EXPORT_SYMBOL(msm_cdc_enable_ondemand_supply); /* * msm_cdc_set_supplies_lpm_mode: * Update load for given supply string * * @dev: pointer to codec device * @supplies: pointer to regulator bulk data * @cdc_vreg: pointer to platform regulator data * @num_supplies: number of supplies * @supply_name: supply name to be checked * @min_max: Apply optimum or 0 current * * Return error code if set current fail */ int msm_cdc_set_supplies_lpm_mode(struct device *dev, struct regulator_bulk_data *supplies, struct cdc_regulator *cdc_vreg, int num_supplies, bool flag) { int rc = 0, i; if (!supplies) { pr_err("%s: supplies is NULL\n", __func__); return -EINVAL; } /* input parameter validation */ rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); if (rc) return rc; for (i = 0; i < num_supplies; i++) { if (cdc_vreg[i].lpm_supported) { rc = regulator_set_load( supplies[i].consumer, flag ? 0 : cdc_vreg[i].optimum_uA); if (rc) dev_err(dev, "%s: failed to set supply %s to %s, err:%d\n", __func__, supplies[i].supply, flag ? "LPM" : "NOM", rc); else dev_dbg(dev, "%s: regulator %s load set to %s\n", __func__, supplies[i].supply, flag ? "LPM" : "NOM"); } } return rc; } EXPORT_SYMBOL(msm_cdc_set_supplies_lpm_mode); /* * msm_cdc_disable_static_supplies: * Disable codec static supplies Loading asoc/codecs/rouleur/internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ struct rouleur_priv { bool comp1_enable; bool comp2_enable; bool dapm_bias_off; struct irq_domain *virq; struct wcd_irq_info irq_info; Loading asoc/codecs/rouleur/rouleur.c +59 −4 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ enum { HPH_COMP_DELAY, HPH_PA_DELAY, AMIC2_BCS_ENABLE, WCD_SUPPLIES_LPM_MODE, }; /* TODO: Check on the step values */ Loading Loading @@ -2046,6 +2047,26 @@ static void rouleur_soc_codec_remove(struct snd_soc_component *component) false); } static int rouleur_soc_codec_suspend(struct snd_soc_component *component) { struct rouleur_priv *rouleur = snd_soc_component_get_drvdata(component); if (!rouleur) return 0; rouleur->dapm_bias_off = true; return 0; } static int rouleur_soc_codec_resume(struct snd_soc_component *component) { struct rouleur_priv *rouleur = snd_soc_component_get_drvdata(component); if (!rouleur) return 0; rouleur->dapm_bias_off = false; return 0; } static const struct snd_soc_component_driver soc_codec_dev_rouleur = { .name = DRV_NAME, .probe = rouleur_soc_codec_probe, Loading @@ -2056,6 +2077,8 @@ static const struct snd_soc_component_driver soc_codec_dev_rouleur = { .num_dapm_widgets = ARRAY_SIZE(rouleur_dapm_widgets), .dapm_routes = rouleur_audio_map, .num_dapm_routes = ARRAY_SIZE(rouleur_audio_map), .suspend = rouleur_soc_codec_suspend, .resume = rouleur_soc_codec_resume, }; #ifdef CONFIG_PM_SLEEP Loading Loading @@ -2092,11 +2115,45 @@ static int rouleur_suspend(struct device *dev) } clear_bit(ALLOW_VPOS_DISABLE, &rouleur->status_mask); } if (rouleur->dapm_bias_off) { msm_cdc_set_supplies_lpm_mode(rouleur->dev, rouleur->supplies, pdata->regulator, pdata->num_supplies, true); set_bit(WCD_SUPPLIES_LPM_MODE, &rouleur->status_mask); } return 0; } static int rouleur_resume(struct device *dev) { struct rouleur_priv *rouleur = NULL; struct rouleur_pdata *pdata = NULL; if (!dev) return -ENODEV; rouleur = dev_get_drvdata(dev); if (!rouleur) return -EINVAL; pdata = dev_get_platdata(rouleur->dev); if (!pdata) { dev_err(dev, "%s: pdata is NULL\n", __func__); return -EINVAL; } if (test_bit(WCD_SUPPLIES_LPM_MODE, &rouleur->status_mask)) { msm_cdc_set_supplies_lpm_mode(rouleur->dev, rouleur->supplies, pdata->regulator, pdata->num_supplies, false); clear_bit(WCD_SUPPLIES_LPM_MODE, &rouleur->status_mask); } return 0; } #endif Loading Loading @@ -2527,10 +2584,8 @@ static int rouleur_remove(struct platform_device *pdev) #ifdef CONFIG_PM_SLEEP static const struct dev_pm_ops rouleur_dev_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS( rouleur_suspend, rouleur_resume ) .suspend_late = rouleur_suspend, .resume_early = rouleur_resume }; #endif Loading asoc/codecs/wcd938x/internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ struct wcd938x_priv { bool comp2_enable; bool ldoh; bool bcs_dis; bool dapm_bias_off; struct irq_domain *virq; struct wcd_irq_info irq_info; u32 rx_clk_cnt; Loading asoc/codecs/wcd938x/wcd938x.c +59 −4 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ enum { HPH_COMP_DELAY, HPH_PA_DELAY, AMIC2_BCS_ENABLE, WCD_SUPPLIES_LPM_MODE, }; enum { Loading Loading @@ -3388,6 +3389,26 @@ static void wcd938x_soc_codec_remove(struct snd_soc_component *component) false); } static int wcd938x_soc_codec_suspend(struct snd_soc_component *component) { struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); if (!wcd938x) return 0; wcd938x->dapm_bias_off = true; return 0; } static int wcd938x_soc_codec_resume(struct snd_soc_component *component) { struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); if (!wcd938x) return 0; wcd938x->dapm_bias_off = false; return 0; } static struct snd_soc_component_driver soc_codec_dev_wcd938x = { .name = WCD938X_DRV_NAME, .probe = wcd938x_soc_codec_probe, Loading @@ -3398,6 +3419,8 @@ static struct snd_soc_component_driver soc_codec_dev_wcd938x = { .num_dapm_widgets = ARRAY_SIZE(wcd938x_dapm_widgets), .dapm_routes = wcd938x_audio_map, .num_dapm_routes = ARRAY_SIZE(wcd938x_audio_map), .suspend = wcd938x_soc_codec_suspend, .resume = wcd938x_soc_codec_resume, }; static int wcd938x_reset(struct device *dev) Loading Loading @@ -3909,19 +3932,51 @@ static int wcd938x_suspend(struct device *dev) } clear_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask); } if (wcd938x->dapm_bias_off) { msm_cdc_set_supplies_lpm_mode(wcd938x->dev, wcd938x->supplies, pdata->regulator, pdata->num_supplies, true); set_bit(WCD_SUPPLIES_LPM_MODE, &wcd938x->status_mask); } return 0; } static int wcd938x_resume(struct device *dev) { struct wcd938x_priv *wcd938x = NULL; struct wcd938x_pdata *pdata = NULL; if (!dev) return -ENODEV; wcd938x = dev_get_drvdata(dev); if (!wcd938x) return -EINVAL; pdata = dev_get_platdata(wcd938x->dev); if (!pdata) { dev_err(dev, "%s: pdata is NULL\n", __func__); return -EINVAL; } if (test_bit(WCD_SUPPLIES_LPM_MODE, &wcd938x->status_mask)) { msm_cdc_set_supplies_lpm_mode(wcd938x->dev, wcd938x->supplies, pdata->regulator, pdata->num_supplies, false); clear_bit(WCD_SUPPLIES_LPM_MODE, &wcd938x->status_mask); } return 0; } static const struct dev_pm_ops wcd938x_dev_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS( wcd938x_suspend, wcd938x_resume ) .suspend_late = wcd938x_suspend, .resume_early = wcd938x_resume, }; #endif Loading Loading
asoc/codecs/msm-cdc-supply.c +68 −2 Original line number Diff line number Diff line Loading @@ -59,9 +59,22 @@ static int msm_cdc_dt_parse_vreg_info(struct device *dev, } cdc_vreg->optimum_uA = prop_val; dev_info(dev, "%s: %s: vol=[%d %d]uV, curr=[%d]uA, ond %d\n", /* Parse supply - LPM or NOM mode(default NOM) */ snprintf(prop_name, CODEC_DT_MAX_PROP_SIZE, "qcom,%s-lpm-supported", name); rc = of_property_read_u32(dev->of_node, prop_name, &prop_val); if (rc) { dev_dbg(dev, "%s: Looking up %s property in node %s failed", __func__, prop_name, dev->of_node->full_name); cdc_vreg->lpm_supported = 0; rc = 0; } else { cdc_vreg->lpm_supported = prop_val; } dev_info(dev, "%s: %s: vol=[%d %d]uV, curr=[%d]uA, ond %d lpm %d\n", __func__, cdc_vreg->name, cdc_vreg->min_uV, cdc_vreg->max_uV, cdc_vreg->optimum_uA, cdc_vreg->ondemand); cdc_vreg->optimum_uA, cdc_vreg->ondemand, cdc_vreg->lpm_supported); done: return rc; Loading Loading @@ -259,6 +272,59 @@ int msm_cdc_enable_ondemand_supply(struct device *dev, } EXPORT_SYMBOL(msm_cdc_enable_ondemand_supply); /* * msm_cdc_set_supplies_lpm_mode: * Update load for given supply string * * @dev: pointer to codec device * @supplies: pointer to regulator bulk data * @cdc_vreg: pointer to platform regulator data * @num_supplies: number of supplies * @supply_name: supply name to be checked * @min_max: Apply optimum or 0 current * * Return error code if set current fail */ int msm_cdc_set_supplies_lpm_mode(struct device *dev, struct regulator_bulk_data *supplies, struct cdc_regulator *cdc_vreg, int num_supplies, bool flag) { int rc = 0, i; if (!supplies) { pr_err("%s: supplies is NULL\n", __func__); return -EINVAL; } /* input parameter validation */ rc = msm_cdc_check_supply_param(dev, cdc_vreg, num_supplies); if (rc) return rc; for (i = 0; i < num_supplies; i++) { if (cdc_vreg[i].lpm_supported) { rc = regulator_set_load( supplies[i].consumer, flag ? 0 : cdc_vreg[i].optimum_uA); if (rc) dev_err(dev, "%s: failed to set supply %s to %s, err:%d\n", __func__, supplies[i].supply, flag ? "LPM" : "NOM", rc); else dev_dbg(dev, "%s: regulator %s load set to %s\n", __func__, supplies[i].supply, flag ? "LPM" : "NOM"); } } return rc; } EXPORT_SYMBOL(msm_cdc_set_supplies_lpm_mode); /* * msm_cdc_disable_static_supplies: * Disable codec static supplies Loading
asoc/codecs/rouleur/internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ struct rouleur_priv { bool comp1_enable; bool comp2_enable; bool dapm_bias_off; struct irq_domain *virq; struct wcd_irq_info irq_info; Loading
asoc/codecs/rouleur/rouleur.c +59 −4 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ enum { HPH_COMP_DELAY, HPH_PA_DELAY, AMIC2_BCS_ENABLE, WCD_SUPPLIES_LPM_MODE, }; /* TODO: Check on the step values */ Loading Loading @@ -2046,6 +2047,26 @@ static void rouleur_soc_codec_remove(struct snd_soc_component *component) false); } static int rouleur_soc_codec_suspend(struct snd_soc_component *component) { struct rouleur_priv *rouleur = snd_soc_component_get_drvdata(component); if (!rouleur) return 0; rouleur->dapm_bias_off = true; return 0; } static int rouleur_soc_codec_resume(struct snd_soc_component *component) { struct rouleur_priv *rouleur = snd_soc_component_get_drvdata(component); if (!rouleur) return 0; rouleur->dapm_bias_off = false; return 0; } static const struct snd_soc_component_driver soc_codec_dev_rouleur = { .name = DRV_NAME, .probe = rouleur_soc_codec_probe, Loading @@ -2056,6 +2077,8 @@ static const struct snd_soc_component_driver soc_codec_dev_rouleur = { .num_dapm_widgets = ARRAY_SIZE(rouleur_dapm_widgets), .dapm_routes = rouleur_audio_map, .num_dapm_routes = ARRAY_SIZE(rouleur_audio_map), .suspend = rouleur_soc_codec_suspend, .resume = rouleur_soc_codec_resume, }; #ifdef CONFIG_PM_SLEEP Loading Loading @@ -2092,11 +2115,45 @@ static int rouleur_suspend(struct device *dev) } clear_bit(ALLOW_VPOS_DISABLE, &rouleur->status_mask); } if (rouleur->dapm_bias_off) { msm_cdc_set_supplies_lpm_mode(rouleur->dev, rouleur->supplies, pdata->regulator, pdata->num_supplies, true); set_bit(WCD_SUPPLIES_LPM_MODE, &rouleur->status_mask); } return 0; } static int rouleur_resume(struct device *dev) { struct rouleur_priv *rouleur = NULL; struct rouleur_pdata *pdata = NULL; if (!dev) return -ENODEV; rouleur = dev_get_drvdata(dev); if (!rouleur) return -EINVAL; pdata = dev_get_platdata(rouleur->dev); if (!pdata) { dev_err(dev, "%s: pdata is NULL\n", __func__); return -EINVAL; } if (test_bit(WCD_SUPPLIES_LPM_MODE, &rouleur->status_mask)) { msm_cdc_set_supplies_lpm_mode(rouleur->dev, rouleur->supplies, pdata->regulator, pdata->num_supplies, false); clear_bit(WCD_SUPPLIES_LPM_MODE, &rouleur->status_mask); } return 0; } #endif Loading Loading @@ -2527,10 +2584,8 @@ static int rouleur_remove(struct platform_device *pdev) #ifdef CONFIG_PM_SLEEP static const struct dev_pm_ops rouleur_dev_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS( rouleur_suspend, rouleur_resume ) .suspend_late = rouleur_suspend, .resume_early = rouleur_resume }; #endif Loading
asoc/codecs/wcd938x/internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ struct wcd938x_priv { bool comp2_enable; bool ldoh; bool bcs_dis; bool dapm_bias_off; struct irq_domain *virq; struct wcd_irq_info irq_info; u32 rx_clk_cnt; Loading
asoc/codecs/wcd938x/wcd938x.c +59 −4 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ enum { HPH_COMP_DELAY, HPH_PA_DELAY, AMIC2_BCS_ENABLE, WCD_SUPPLIES_LPM_MODE, }; enum { Loading Loading @@ -3388,6 +3389,26 @@ static void wcd938x_soc_codec_remove(struct snd_soc_component *component) false); } static int wcd938x_soc_codec_suspend(struct snd_soc_component *component) { struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); if (!wcd938x) return 0; wcd938x->dapm_bias_off = true; return 0; } static int wcd938x_soc_codec_resume(struct snd_soc_component *component) { struct wcd938x_priv *wcd938x = snd_soc_component_get_drvdata(component); if (!wcd938x) return 0; wcd938x->dapm_bias_off = false; return 0; } static struct snd_soc_component_driver soc_codec_dev_wcd938x = { .name = WCD938X_DRV_NAME, .probe = wcd938x_soc_codec_probe, Loading @@ -3398,6 +3419,8 @@ static struct snd_soc_component_driver soc_codec_dev_wcd938x = { .num_dapm_widgets = ARRAY_SIZE(wcd938x_dapm_widgets), .dapm_routes = wcd938x_audio_map, .num_dapm_routes = ARRAY_SIZE(wcd938x_audio_map), .suspend = wcd938x_soc_codec_suspend, .resume = wcd938x_soc_codec_resume, }; static int wcd938x_reset(struct device *dev) Loading Loading @@ -3909,19 +3932,51 @@ static int wcd938x_suspend(struct device *dev) } clear_bit(ALLOW_BUCK_DISABLE, &wcd938x->status_mask); } if (wcd938x->dapm_bias_off) { msm_cdc_set_supplies_lpm_mode(wcd938x->dev, wcd938x->supplies, pdata->regulator, pdata->num_supplies, true); set_bit(WCD_SUPPLIES_LPM_MODE, &wcd938x->status_mask); } return 0; } static int wcd938x_resume(struct device *dev) { struct wcd938x_priv *wcd938x = NULL; struct wcd938x_pdata *pdata = NULL; if (!dev) return -ENODEV; wcd938x = dev_get_drvdata(dev); if (!wcd938x) return -EINVAL; pdata = dev_get_platdata(wcd938x->dev); if (!pdata) { dev_err(dev, "%s: pdata is NULL\n", __func__); return -EINVAL; } if (test_bit(WCD_SUPPLIES_LPM_MODE, &wcd938x->status_mask)) { msm_cdc_set_supplies_lpm_mode(wcd938x->dev, wcd938x->supplies, pdata->regulator, pdata->num_supplies, false); clear_bit(WCD_SUPPLIES_LPM_MODE, &wcd938x->status_mask); } return 0; } static const struct dev_pm_ops wcd938x_dev_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS( wcd938x_suspend, wcd938x_resume ) .suspend_late = wcd938x_suspend, .resume_early = wcd938x_resume, }; #endif Loading