Linux runtime PM automatically handles the runtime resuming and
suspending of a parent device and therefore, it is not necessary
for a child device to explicitly runtime resume or suspend the
parent.
The various Tegra ASoC codec drivers explicitly runtime resume
and suspend the parent device from within their runtime PM callback
handler. This should not be necessary.
Furthermore, currently the various Tegra ASoC codec drivers are
not suspended correctly if active when system suspend occurs. During
system suspend it is common to directly call the runtime PM callbacks
to suspend and resume the device if active from the system suspend
callbacks. However, the APIs, pm_runtime_get/put(), cannot be called
during system suspend and so the runtime PM callbacks for these codec
drivers cannot be called from the context of the system suspend
callbacks.
Remove the calls to runtime resume and suspend the parent device from
the runtime PM callbacks for the various Tegra ASoC drivers. This will
allow us to fix suspending and resuming of the Tegra ASoC drivers
across system suspend.
Bug
200275736
Change-Id: Ia2c954f206ed0276c6d54627f274e6a713d88a6f
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-on: http://git-master/r/
1487805
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Ravindra Lokhande <rlokhande@nvidia.com>
Reviewed-by: Mohan Kumar D <mkumard@nvidia.com>
Reviewed-by: Bibek Basu <bbasu@nvidia.com>
regcache_cache_only(admaif->regmap, true);
regcache_mark_dirty(admaif->regmap);
- pm_runtime_put_sync(dev->parent);
return 0;
}
static int tegra210_admaif_runtime_resume(struct device *dev)
{
struct tegra210_admaif *admaif = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(admaif->regmap, false);
if (!admaif->is_shutdown)
regcache_cache_only(adx->regmap, true);
regcache_mark_dirty(adx->regmap);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
static int tegra210_adx_runtime_resume(struct device *dev)
{
struct tegra210_adx *adx = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(adx->regmap, false);
regcache_cache_only(afc->regmap, true);
regcache_mark_dirty(afc->regmap);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
static int tegra210_afc_runtime_resume(struct device *dev)
{
struct tegra210_afc *afc = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(afc->regmap, false);
regcache_cache_only(amx->regmap, true);
regcache_mark_dirty(amx->regmap);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
static int tegra210_amx_runtime_resume(struct device *dev)
{
struct tegra210_amx *amx = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(amx->regmap, false);
clk_disable_unprepare(dmic->clk_dmic);
}
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
struct tegra210_dmic *dmic = dev_get_drvdata(dev);
int ret;
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
-
if (!(tegra_platform_is_unit_fpga() || tegra_platform_is_fpga())) {
if (!IS_ERR(dmic->pin_active_state) && dmic->is_pinctrl) {
ret = pinctrl_select_state(dmic->pinctrl,
} else
regcache_cache_only(i2s->regmap, true);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
struct tegra210_i2s *i2s = dev_get_drvdata(dev);
int ret;
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
-
if (!(tegra_platform_is_unit_fpga() || tegra_platform_is_fpga())) {
if (!IS_ERR(i2s->pin_default_state)) {
ret = pinctrl_select_state(i2s->pinctrl,
/*
* tegra210_iqc.c - Tegra210 IQC driver
*
- * Copyright (c) 2014-2016 NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2014-2017 NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
#ifndef CONFIG_MACH_GRENADA
clk_disable_unprepare(iqc->clk_iqc);
#endif
- pm_runtime_put_sync(dev->parent);
return 0;
}
struct tegra210_iqc *iqc = dev_get_drvdata(dev);
int ret;
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
-
#ifndef CONFIG_MACH_GRENADA
ret = clk_prepare_enable(iqc->clk_iqc);
if (ret) {
regcache_cache_only(mixer->regmap, true);
regcache_mark_dirty(mixer->regmap);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
static int tegra210_mixer_runtime_resume(struct device *dev)
{
struct tegra210_mixer *mixer = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(mixer->regmap, false);
regcache_cache_only(mvc->regmap, true);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
static int tegra210_mvc_runtime_resume(struct device *dev)
{
struct tegra210_mvc *mvc = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(mvc->regmap, false);
regcache_mark_dirty(ope->peq_regmap);
regcache_mark_dirty(ope->mbdrc_regmap);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
static int tegra210_ope_runtime_resume(struct device *dev)
{
struct tegra210_ope *ope = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(ope->regmap, false);
regcache_cache_only(ope->peq_regmap, false);
regcache_cache_only(sfc->regmap, true);
regcache_mark_dirty(sfc->regmap);
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
static int tegra210_sfc_runtime_resume(struct device *dev)
{
struct tegra210_sfc *sfc = dev_get_drvdata(dev);
- int ret;
-
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
regcache_cache_only(sfc->regmap, false);
clk_disable_unprepare(spdif->clk_spdif_in);
}
- pm_runtime_put_sync(dev->parent);
-
return 0;
}
struct tegra210_spdif *spdif = dev_get_drvdata(dev);
int ret;
- ret = pm_runtime_get_sync(dev->parent);
- if (ret < 0) {
- dev_err(dev, "parent get_sync failed: %d\n", ret);
- return ret;
- }
-
if (!(tegra_platform_is_unit_fpga() || tegra_platform_is_fpga())) {
if (!IS_ERR(spdif->pin_active_state) && spdif->is_pinctrl) {
ret = pinctrl_select_state(spdif->pinctrl,