ASoC: tegra: Enable/Disable parent runtime pm

Instead of using duplicate clock of "d_audio" for all AHUB modules
get/put runtime pm reference of the parent module from runtime_pm
suspend/resume routine of all AHUB modules. This will ensure AHUB
xbar is up before other drivers tries to access any register. Also
it will ensure both d_audio and APE clocks are enabled when needed.

Bug 200042312

Change-Id: I0346728f15b135bb619de40fbd3fc440a5505940
Signed-off-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-on: http://git-master/r/554863
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Arun Shamanna Lakshmi <aruns@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Sumit Bhattacharya
2014-10-09 11:18:01 +05:30
committed by Sameer Pujar
parent 5066fe1a3a
commit 36359cf890
12 changed files with 108 additions and 161 deletions

View File

@@ -180,8 +180,8 @@ static int tegra210_admaif_runtime_suspend(struct device *dev)
struct tegra210_admaif *admaif = dev_get_drvdata(dev); struct tegra210_admaif *admaif = dev_get_drvdata(dev);
regcache_cache_only(admaif->regmap, true); regcache_cache_only(admaif->regmap, true);
clk_disable(admaif->clk); clk_disable(admaif->clk);
pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -191,6 +191,12 @@ static int tegra210_admaif_runtime_resume(struct device *dev)
struct tegra210_admaif *admaif = dev_get_drvdata(dev); struct tegra210_admaif *admaif = dev_get_drvdata(dev);
int ret; int ret;
ret = pm_runtime_get_sync(dev->parent);
if (ret < 0) {
dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret;
}
ret = clk_enable(admaif->clk); ret = clk_enable(admaif->clk);
if (ret) { if (ret) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "clk_enable failed: %d\n", ret);

View File

@@ -235,7 +235,7 @@ static int tegra210_adx_runtime_suspend(struct device *dev)
regcache_cache_only(adx->regmap, true); regcache_cache_only(adx->regmap, true);
clk_disable_unprepare(adx->clk_adx); pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -245,9 +245,9 @@ static int tegra210_adx_runtime_resume(struct device *dev)
struct tegra210_adx *adx = dev_get_drvdata(dev); struct tegra210_adx *adx = dev_get_drvdata(dev);
int ret; int ret;
ret = clk_prepare_enable(adx->clk_adx); ret = pm_runtime_get_sync(dev->parent);
if (ret) { if (ret < 0) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret; return ret;
} }
@@ -631,13 +631,6 @@ static int tegra210_adx_platform_probe(struct platform_device *pdev)
adx->soc_data = soc_data; adx->soc_data = soc_data;
adx->clk_adx = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(adx->clk_adx)) {
dev_err(&pdev->dev, "Can't retrieve adx clock\n");
ret = PTR_ERR(adx->clk_adx);
goto err;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) { if (!mem) {
dev_err(&pdev->dev, "No memory resource\n"); dev_err(&pdev->dev, "No memory resource\n");
@@ -650,14 +643,14 @@ static int tegra210_adx_platform_probe(struct platform_device *pdev)
if (!memregion) { if (!memregion) {
dev_err(&pdev->dev, "Memory region already claimed\n"); dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY; ret = -EBUSY;
goto err_clk_put; goto err;
} }
regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
if (!regs) { if (!regs) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk_put; goto err;
} }
adx->regmap = devm_regmap_init_mmio(&pdev->dev, regs, adx->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -665,7 +658,7 @@ static int tegra210_adx_platform_probe(struct platform_device *pdev)
if (IS_ERR(adx->regmap)) { if (IS_ERR(adx->regmap)) {
dev_err(&pdev->dev, "regmap init failed\n"); dev_err(&pdev->dev, "regmap init failed\n");
ret = PTR_ERR(adx->regmap); ret = PTR_ERR(adx->regmap);
goto err_clk_put; goto err;
} }
regcache_cache_only(adx->regmap, true); regcache_cache_only(adx->regmap, true);
@@ -675,7 +668,7 @@ static int tegra210_adx_platform_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing property nvidia,ahub-adx-id\n"); "Missing property nvidia,ahub-adx-id\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@@ -700,23 +693,18 @@ err_suspend:
tegra210_adx_runtime_suspend(&pdev->dev); tegra210_adx_runtime_suspend(&pdev->dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
err_clk_put:
devm_clk_put(&pdev->dev, adx->clk_adx);
err: err:
return ret; return ret;
} }
static int tegra210_adx_platform_remove(struct platform_device *pdev) static int tegra210_adx_platform_remove(struct platform_device *pdev)
{ {
struct tegra210_adx *adx = dev_get_drvdata(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
tegra210_adx_runtime_suspend(&pdev->dev); tegra210_adx_runtime_suspend(&pdev->dev);
devm_clk_put(&pdev->dev, adx->clk_adx);
return 0; return 0;
} }

View File

@@ -43,7 +43,7 @@ static int tegra210_afc_runtime_suspend(struct device *dev)
regcache_cache_only(afc->regmap, true); regcache_cache_only(afc->regmap, true);
clk_disable_unprepare(afc->clk_afc); pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -53,9 +53,9 @@ static int tegra210_afc_runtime_resume(struct device *dev)
struct tegra210_afc *afc = dev_get_drvdata(dev); struct tegra210_afc *afc = dev_get_drvdata(dev);
int ret; int ret;
ret = clk_prepare_enable(afc->clk_afc); ret = pm_runtime_get_sync(dev->parent);
if (ret) { if (ret < 0) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret; return ret;
} }
@@ -367,18 +367,11 @@ static int tegra210_afc_platform_probe(struct platform_device *pdev)
/* initialize default destination I2S */ /* initialize default destination I2S */
afc->destination_i2s = 1; afc->destination_i2s = 1;
afc->clk_afc = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(afc->clk_afc)) {
dev_err(&pdev->dev, "Can't retrieve afc clock\n");
ret = PTR_ERR(afc->clk_afc);
goto err;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) { if (!mem) {
dev_err(&pdev->dev, "No memory resource\n"); dev_err(&pdev->dev, "No memory resource\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
memregion = devm_request_mem_region(&pdev->dev, mem->start, memregion = devm_request_mem_region(&pdev->dev, mem->start,
@@ -386,14 +379,14 @@ static int tegra210_afc_platform_probe(struct platform_device *pdev)
if (!memregion) { if (!memregion) {
dev_err(&pdev->dev, "Memory region already claimed\n"); dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY; ret = -EBUSY;
goto err_clk_put; goto err;
} }
regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
if (!regs) { if (!regs) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk_put; goto err;
} }
afc->regmap = devm_regmap_init_mmio(&pdev->dev, regs, afc->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -401,7 +394,7 @@ static int tegra210_afc_platform_probe(struct platform_device *pdev)
if (IS_ERR(afc->regmap)) { if (IS_ERR(afc->regmap)) {
dev_err(&pdev->dev, "regmap init failed\n"); dev_err(&pdev->dev, "regmap init failed\n");
ret = PTR_ERR(afc->regmap); ret = PTR_ERR(afc->regmap);
goto err_clk_put; goto err;
} }
regcache_cache_only(afc->regmap, true); regcache_cache_only(afc->regmap, true);
@@ -411,7 +404,7 @@ static int tegra210_afc_platform_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing property nvidia,ahub-afc-id\n"); "Missing property nvidia,ahub-afc-id\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@@ -440,23 +433,18 @@ err_suspend:
tegra210_afc_runtime_suspend(&pdev->dev); tegra210_afc_runtime_suspend(&pdev->dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
err_clk_put:
devm_clk_put(&pdev->dev, afc->clk_afc);
err: err:
return ret; return ret;
} }
static int tegra210_afc_platform_remove(struct platform_device *pdev) static int tegra210_afc_platform_remove(struct platform_device *pdev)
{ {
struct tegra210_afc *afc = dev_get_drvdata(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
tegra210_afc_runtime_suspend(&pdev->dev); tegra210_afc_runtime_suspend(&pdev->dev);
devm_clk_put(&pdev->dev, afc->clk_afc);
return 0; return 0;
} }

View File

@@ -230,7 +230,7 @@ static int tegra210_amx_runtime_suspend(struct device *dev)
regcache_cache_only(amx->regmap, true); regcache_cache_only(amx->regmap, true);
clk_disable_unprepare(amx->clk_amx); pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -271,9 +271,9 @@ static int tegra210_amx_runtime_resume(struct device *dev)
struct tegra210_amx *amx = dev_get_drvdata(dev); struct tegra210_amx *amx = dev_get_drvdata(dev);
int ret; int ret;
ret = clk_prepare_enable(amx->clk_amx); ret = pm_runtime_get_sync(dev->parent);
if (ret) { if (ret < 0) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret; return ret;
} }
@@ -664,18 +664,11 @@ static int tegra210_amx_platform_probe(struct platform_device *pdev)
amx->soc_data = soc_data; amx->soc_data = soc_data;
amx->clk_amx = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(amx->clk_amx)) {
dev_err(&pdev->dev, "Can't retrieve tegra210_amx clock\n");
ret = PTR_ERR(amx->clk_amx);
goto err;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) { if (!mem) {
dev_err(&pdev->dev, "No memory resource\n"); dev_err(&pdev->dev, "No memory resource\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
memregion = devm_request_mem_region(&pdev->dev, mem->start, memregion = devm_request_mem_region(&pdev->dev, mem->start,
@@ -683,14 +676,14 @@ static int tegra210_amx_platform_probe(struct platform_device *pdev)
if (!memregion) { if (!memregion) {
dev_err(&pdev->dev, "Memory region already claimed\n"); dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY; ret = -EBUSY;
goto err_clk_put; goto err;
} }
regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
if (!regs) { if (!regs) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk_put; goto err;
} }
amx->regmap = devm_regmap_init_mmio(&pdev->dev, regs, amx->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -698,7 +691,7 @@ static int tegra210_amx_platform_probe(struct platform_device *pdev)
if (IS_ERR(amx->regmap)) { if (IS_ERR(amx->regmap)) {
dev_err(&pdev->dev, "regmap init failed\n"); dev_err(&pdev->dev, "regmap init failed\n");
ret = PTR_ERR(amx->regmap); ret = PTR_ERR(amx->regmap);
goto err_clk_put; goto err;
} }
regcache_cache_only(amx->regmap, true); regcache_cache_only(amx->regmap, true);
@@ -708,7 +701,7 @@ static int tegra210_amx_platform_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing property nvidia,ahub-amx-id\n"); "Missing property nvidia,ahub-amx-id\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@@ -733,24 +726,18 @@ err_suspend:
tegra210_amx_runtime_suspend(&pdev->dev); tegra210_amx_runtime_suspend(&pdev->dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
err_clk_put:
devm_clk_put(&pdev->dev, amx->clk_amx);
err: err:
return ret; return ret;
} }
static int tegra210_amx_platform_remove(struct platform_device *pdev) static int tegra210_amx_platform_remove(struct platform_device *pdev)
{ {
struct tegra210_amx *amx = dev_get_drvdata(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
tegra210_amx_runtime_suspend(&pdev->dev); tegra210_amx_runtime_suspend(&pdev->dev);
devm_clk_put(&pdev->dev, amx->clk_amx);
return 0; return 0;
} }

View File

@@ -45,16 +45,23 @@ static int tegra210_dmic_runtime_suspend(struct device *dev)
#ifndef CONFIG_MACH_GRENADA #ifndef CONFIG_MACH_GRENADA
clk_disable_unprepare(dmic->clk_dmic); clk_disable_unprepare(dmic->clk_dmic);
#endif #endif
pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
static int tegra210_dmic_runtime_resume(struct device *dev) static int tegra210_dmic_runtime_resume(struct device *dev)
{ {
struct tegra210_dmic *dmic = dev_get_drvdata(dev); struct tegra210_dmic *dmic = dev_get_drvdata(dev);
#ifndef CONFIG_MACH_GRENADA
int ret; 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(dmic->clk_dmic); ret = clk_prepare_enable(dmic->clk_dmic);
if (ret) { if (ret) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "clk_enable failed: %d\n", ret);

View File

@@ -224,6 +224,7 @@ static int tegra210_i2s_runtime_suspend(struct device *dev)
regcache_cache_only(i2s->regmap, true); regcache_cache_only(i2s->regmap, true);
clk_disable_unprepare(i2s->clk_i2s); clk_disable_unprepare(i2s->clk_i2s);
pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -233,6 +234,12 @@ static int tegra210_i2s_runtime_resume(struct device *dev)
struct tegra210_i2s *i2s = dev_get_drvdata(dev); struct tegra210_i2s *i2s = dev_get_drvdata(dev);
int ret; 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 (!IS_ERR(i2s->pin_default_state)) { if (!IS_ERR(i2s->pin_default_state)) {
ret = pinctrl_select_state(i2s->pinctrl, ret = pinctrl_select_state(i2s->pinctrl,
i2s->pin_default_state); i2s->pin_default_state);

View File

@@ -46,6 +46,7 @@ static int tegra210_iqc_runtime_suspend(struct device *dev)
#ifndef CONFIG_MACH_GRENADA #ifndef CONFIG_MACH_GRENADA
clk_disable_unprepare(iqc->clk_iqc); clk_disable_unprepare(iqc->clk_iqc);
#endif #endif
pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -53,10 +54,15 @@ static int tegra210_iqc_runtime_suspend(struct device *dev)
static int tegra210_iqc_runtime_resume(struct device *dev) static int tegra210_iqc_runtime_resume(struct device *dev)
{ {
struct tegra210_iqc *iqc = dev_get_drvdata(dev); struct tegra210_iqc *iqc = dev_get_drvdata(dev);
#ifndef CONFIG_MACH_GRENADA
int ret; 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); ret = clk_prepare_enable(iqc->clk_iqc);
if (ret) { if (ret) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "clk_enable failed: %d\n", ret);

View File

@@ -46,7 +46,7 @@ static int tegra210_mixer_runtime_suspend(struct device *dev)
regcache_cache_only(mixer->regmap, true); regcache_cache_only(mixer->regmap, true);
clk_disable_unprepare(mixer->clk_mixer); pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -56,9 +56,9 @@ static int tegra210_mixer_runtime_resume(struct device *dev)
struct tegra210_mixer *mixer = dev_get_drvdata(dev); struct tegra210_mixer *mixer = dev_get_drvdata(dev);
int ret; int ret;
ret = clk_prepare_enable(mixer->clk_mixer); ret = pm_runtime_get_sync(dev->parent);
if (ret) { if (ret < 0) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret; return ret;
} }
@@ -578,18 +578,11 @@ static int tegra210_mixer_platform_probe(struct platform_device *pdev)
mixer->gain_coeff[12] = 0x3e80; mixer->gain_coeff[12] = 0x3e80;
mixer->gain_coeff[13] = 0x83126E; mixer->gain_coeff[13] = 0x83126E;
mixer->clk_mixer = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(mixer->clk_mixer)) {
dev_err(&pdev->dev, "Can't retrieve tegra210_mixer clock\n");
ret = PTR_ERR(mixer->clk_mixer);
goto err;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) { if (!mem) {
dev_err(&pdev->dev, "No memory resource\n"); dev_err(&pdev->dev, "No memory resource\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
memregion = devm_request_mem_region(&pdev->dev, mem->start, memregion = devm_request_mem_region(&pdev->dev, mem->start,
@@ -597,14 +590,14 @@ static int tegra210_mixer_platform_probe(struct platform_device *pdev)
if (!memregion) { if (!memregion) {
dev_err(&pdev->dev, "Memory region already claimed\n"); dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY; ret = -EBUSY;
goto err_clk_put; goto err;
} }
regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
if (!regs) { if (!regs) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk_put; goto err;
} }
mixer->regmap = devm_regmap_init_mmio(&pdev->dev, regs, mixer->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -612,7 +605,7 @@ static int tegra210_mixer_platform_probe(struct platform_device *pdev)
if (IS_ERR(mixer->regmap)) { if (IS_ERR(mixer->regmap)) {
dev_err(&pdev->dev, "regmap init failed\n"); dev_err(&pdev->dev, "regmap init failed\n");
ret = PTR_ERR(mixer->regmap); ret = PTR_ERR(mixer->regmap);
goto err_clk_put; goto err;
} }
regcache_cache_only(mixer->regmap, true); regcache_cache_only(mixer->regmap, true);
@@ -622,7 +615,7 @@ static int tegra210_mixer_platform_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing property nvidia,ahub-amixer-id\n"); "Missing property nvidia,ahub-amixer-id\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@@ -647,24 +640,18 @@ err_suspend:
tegra210_mixer_runtime_suspend(&pdev->dev); tegra210_mixer_runtime_suspend(&pdev->dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
err_clk_put:
devm_clk_put(&pdev->dev, mixer->clk_mixer);
err: err:
return ret; return ret;
} }
static int tegra210_mixer_platform_remove(struct platform_device *pdev) static int tegra210_mixer_platform_remove(struct platform_device *pdev)
{ {
struct tegra210_mixer *mixer = dev_get_drvdata(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
tegra210_mixer_runtime_suspend(&pdev->dev); tegra210_mixer_runtime_suspend(&pdev->dev);
devm_clk_put(&pdev->dev, mixer->clk_mixer);
return 0; return 0;
} }

View File

@@ -42,7 +42,7 @@ static int tegra210_mvc_runtime_suspend(struct device *dev)
regcache_cache_only(mvc->regmap, true); regcache_cache_only(mvc->regmap, true);
clk_disable_unprepare(mvc->clk_mvc); pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -50,12 +50,11 @@ static int tegra210_mvc_runtime_suspend(struct device *dev)
static int tegra210_mvc_runtime_resume(struct device *dev) static int tegra210_mvc_runtime_resume(struct device *dev)
{ {
struct tegra210_mvc *mvc = dev_get_drvdata(dev); struct tegra210_mvc *mvc = dev_get_drvdata(dev);
int ret; int ret;
ret = clk_prepare_enable(mvc->clk_mvc); ret = pm_runtime_get_sync(dev->parent);
if (ret) { if (ret < 0) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret; return ret;
} }
@@ -422,18 +421,11 @@ static int tegra210_mvc_platform_probe(struct platform_device *pdev)
mvc->poly_coeff[7] = 5527252; mvc->poly_coeff[7] = 5527252;
mvc->poly_coeff[8] = -785042; mvc->poly_coeff[8] = -785042;
mvc->clk_mvc = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(mvc->clk_mvc)) {
dev_err(&pdev->dev, "Can't retrieve mvc clock\n");
ret = PTR_ERR(mvc->clk_mvc);
goto err;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) { if (!mem) {
dev_err(&pdev->dev, "No memory resource\n"); dev_err(&pdev->dev, "No memory resource\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
memregion = devm_request_mem_region(&pdev->dev, mem->start, memregion = devm_request_mem_region(&pdev->dev, mem->start,
@@ -441,14 +433,14 @@ static int tegra210_mvc_platform_probe(struct platform_device *pdev)
if (!memregion) { if (!memregion) {
dev_err(&pdev->dev, "Memory region already claimed\n"); dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY; ret = -EBUSY;
goto err_clk_put; goto err;
} }
regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
if (!regs) { if (!regs) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk_put; goto err;
} }
mvc->regmap = devm_regmap_init_mmio(&pdev->dev, regs, mvc->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -456,7 +448,7 @@ static int tegra210_mvc_platform_probe(struct platform_device *pdev)
if (IS_ERR(mvc->regmap)) { if (IS_ERR(mvc->regmap)) {
dev_err(&pdev->dev, "regmap init failed\n"); dev_err(&pdev->dev, "regmap init failed\n");
ret = PTR_ERR(mvc->regmap); ret = PTR_ERR(mvc->regmap);
goto err_clk_put; goto err;
} }
regcache_cache_only(mvc->regmap, true); regcache_cache_only(mvc->regmap, true);
@@ -466,7 +458,7 @@ static int tegra210_mvc_platform_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing property nvidia,ahub-mvc-id\n"); "Missing property nvidia,ahub-mvc-id\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@@ -491,24 +483,18 @@ err_suspend:
tegra210_mvc_runtime_suspend(&pdev->dev); tegra210_mvc_runtime_suspend(&pdev->dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
err_clk_put:
devm_clk_put(&pdev->dev, mvc->clk_mvc);
err: err:
return ret; return ret;
} }
static int tegra210_mvc_platform_remove(struct platform_device *pdev) static int tegra210_mvc_platform_remove(struct platform_device *pdev)
{ {
struct tegra210_mvc *mvc = dev_get_drvdata(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
tegra210_mvc_runtime_suspend(&pdev->dev); tegra210_mvc_runtime_suspend(&pdev->dev);
devm_clk_put(&pdev->dev, mvc->clk_mvc);
return 0; return 0;
} }

View File

@@ -44,7 +44,9 @@ static int tegra210_ope_runtime_suspend(struct device *dev)
regcache_cache_only(ope->mbdrc_regmap, true); regcache_cache_only(ope->mbdrc_regmap, true);
regcache_cache_only(ope->peq_regmap, true); regcache_cache_only(ope->peq_regmap, true);
regcache_cache_only(ope->regmap, true); regcache_cache_only(ope->regmap, true);
clk_disable_unprepare(ope->clk_ope);
pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -53,11 +55,12 @@ static int tegra210_ope_runtime_resume(struct device *dev)
struct tegra210_ope *ope = dev_get_drvdata(dev); struct tegra210_ope *ope = dev_get_drvdata(dev);
int ret; int ret;
ret = clk_prepare_enable(ope->clk_ope); ret = pm_runtime_get_sync(dev->parent);
if (ret) { if (ret < 0) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret; return ret;
} }
regcache_cache_only(ope->regmap, false); regcache_cache_only(ope->regmap, false);
regcache_cache_only(ope->peq_regmap, false); regcache_cache_only(ope->peq_regmap, false);
regcache_cache_only(ope->mbdrc_regmap, false); regcache_cache_only(ope->mbdrc_regmap, false);
@@ -332,18 +335,11 @@ static int tegra210_ope_platform_probe(struct platform_device *pdev)
ope->soc_data = soc_data; ope->soc_data = soc_data;
ope->clk_ope = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(ope->clk_ope)) {
dev_err(&pdev->dev, "Can't retrieve ope clock\n");
ret = PTR_ERR(ope->clk_ope);
goto err;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) { if (!mem) {
dev_err(&pdev->dev, "No memory resource\n"); dev_err(&pdev->dev, "No memory resource\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
memregion = devm_request_mem_region(&pdev->dev, mem->start, memregion = devm_request_mem_region(&pdev->dev, mem->start,
@@ -351,14 +347,14 @@ static int tegra210_ope_platform_probe(struct platform_device *pdev)
if (!memregion) { if (!memregion) {
dev_err(&pdev->dev, "Memory region already claimed\n"); dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY; ret = -EBUSY;
goto err_clk_put; goto err;
} }
regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
if (!regs) { if (!regs) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk_put; goto err;
} }
ope->regmap = devm_regmap_init_mmio(&pdev->dev, regs, ope->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -366,7 +362,7 @@ static int tegra210_ope_platform_probe(struct platform_device *pdev)
if (IS_ERR(ope->regmap)) { if (IS_ERR(ope->regmap)) {
dev_err(&pdev->dev, "regmap init failed\n"); dev_err(&pdev->dev, "regmap init failed\n");
ret = PTR_ERR(ope->regmap); ret = PTR_ERR(ope->regmap);
goto err_clk_put; goto err;
} }
regcache_cache_only(ope->regmap, true); regcache_cache_only(ope->regmap, true);
@@ -374,7 +370,7 @@ static int tegra210_ope_platform_probe(struct platform_device *pdev)
TEGRA210_PEQ_IORESOURCE_MEM); TEGRA210_PEQ_IORESOURCE_MEM);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "peq init failed\n"); dev_err(&pdev->dev, "peq init failed\n");
goto err_clk_put; goto err;
} }
regcache_cache_only(ope->peq_regmap, true); regcache_cache_only(ope->peq_regmap, true);
@@ -382,7 +378,7 @@ static int tegra210_ope_platform_probe(struct platform_device *pdev)
TEGRA210_MBDRC_IORESOURCE_MEM); TEGRA210_MBDRC_IORESOURCE_MEM);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "mbdrc init failed\n"); dev_err(&pdev->dev, "mbdrc init failed\n");
goto err_clk_put; goto err;
} }
regcache_cache_only(ope->mbdrc_regmap, true); regcache_cache_only(ope->mbdrc_regmap, true);
@@ -392,7 +388,7 @@ static int tegra210_ope_platform_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing property nvidia,ahub-ope-id\n"); "Missing property nvidia,ahub-ope-id\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@@ -419,22 +415,18 @@ err_suspend:
tegra210_ope_runtime_suspend(&pdev->dev); tegra210_ope_runtime_suspend(&pdev->dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
err_clk_put:
devm_clk_put(&pdev->dev, ope->clk_ope);
err: err:
return ret; return ret;
} }
static int tegra210_ope_platform_remove(struct platform_device *pdev) static int tegra210_ope_platform_remove(struct platform_device *pdev)
{ {
struct tegra210_ope *ope = dev_get_drvdata(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
tegra210_ope_runtime_suspend(&pdev->dev); tegra210_ope_runtime_suspend(&pdev->dev);
devm_clk_put(&pdev->dev, ope->clk_ope);
return 0; return 0;
} }

View File

@@ -42,7 +42,7 @@ static int tegra210_sfc_runtime_suspend(struct device *dev)
regcache_cache_only(sfc->regmap, true); regcache_cache_only(sfc->regmap, true);
clk_disable_unprepare(sfc->clk_sfc); pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -50,12 +50,11 @@ static int tegra210_sfc_runtime_suspend(struct device *dev)
static int tegra210_sfc_runtime_resume(struct device *dev) static int tegra210_sfc_runtime_resume(struct device *dev)
{ {
struct tegra210_sfc *sfc = dev_get_drvdata(dev); struct tegra210_sfc *sfc = dev_get_drvdata(dev);
int ret; int ret;
ret = clk_prepare_enable(sfc->clk_sfc); ret = pm_runtime_get_sync(dev->parent);
if (ret) { if (ret < 0) {
dev_err(dev, "clk_enable failed: %d\n", ret); dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret; return ret;
} }
@@ -469,18 +468,11 @@ static int tegra210_sfc_platform_probe(struct platform_device *pdev)
/* initialize default output srate */ /* initialize default output srate */
sfc->srate_out = TEGRA210_SFC_FS48; sfc->srate_out = TEGRA210_SFC_FS48;
sfc->clk_sfc = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(sfc->clk_sfc)) {
dev_err(&pdev->dev, "Can't retrieve sfc clock\n");
ret = PTR_ERR(sfc->clk_sfc);
goto err;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) { if (!mem) {
dev_err(&pdev->dev, "No memory resource\n"); dev_err(&pdev->dev, "No memory resource\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
memregion = devm_request_mem_region(&pdev->dev, mem->start, memregion = devm_request_mem_region(&pdev->dev, mem->start,
@@ -488,14 +480,14 @@ static int tegra210_sfc_platform_probe(struct platform_device *pdev)
if (!memregion) { if (!memregion) {
dev_err(&pdev->dev, "Memory region already claimed\n"); dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY; ret = -EBUSY;
goto err_clk_put; goto err;
} }
regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
if (!regs) { if (!regs) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_clk_put; goto err;
} }
sfc->regmap = devm_regmap_init_mmio(&pdev->dev, regs, sfc->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
@@ -503,7 +495,7 @@ static int tegra210_sfc_platform_probe(struct platform_device *pdev)
if (IS_ERR(sfc->regmap)) { if (IS_ERR(sfc->regmap)) {
dev_err(&pdev->dev, "regmap init failed\n"); dev_err(&pdev->dev, "regmap init failed\n");
ret = PTR_ERR(sfc->regmap); ret = PTR_ERR(sfc->regmap);
goto err_clk_put; goto err;
} }
regcache_cache_only(sfc->regmap, true); regcache_cache_only(sfc->regmap, true);
@@ -513,7 +505,7 @@ static int tegra210_sfc_platform_probe(struct platform_device *pdev)
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing property nvidia,ahub-sfc-id\n"); "Missing property nvidia,ahub-sfc-id\n");
ret = -ENODEV; ret = -ENODEV;
goto err_clk_put; goto err;
} }
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
@@ -538,24 +530,18 @@ err_suspend:
tegra210_sfc_runtime_suspend(&pdev->dev); tegra210_sfc_runtime_suspend(&pdev->dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
err_clk_put:
devm_clk_put(&pdev->dev, sfc->clk_sfc);
err: err:
return ret; return ret;
} }
static int tegra210_sfc_platform_remove(struct platform_device *pdev) static int tegra210_sfc_platform_remove(struct platform_device *pdev)
{ {
struct tegra210_sfc *sfc = dev_get_drvdata(&pdev->dev);
snd_soc_unregister_codec(&pdev->dev); snd_soc_unregister_codec(&pdev->dev);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
if (!pm_runtime_status_suspended(&pdev->dev)) if (!pm_runtime_status_suspended(&pdev->dev))
tegra210_sfc_runtime_suspend(&pdev->dev); tegra210_sfc_runtime_suspend(&pdev->dev);
devm_clk_put(&pdev->dev, sfc->clk_sfc);
return 0; return 0;
} }

View File

@@ -44,6 +44,7 @@ static int tegra210_spdif_runtime_suspend(struct device *dev)
clk_disable_unprepare(spdif->clk_spdif_out); clk_disable_unprepare(spdif->clk_spdif_out);
clk_disable_unprepare(spdif->clk_spdif_in); clk_disable_unprepare(spdif->clk_spdif_in);
pm_runtime_put_sync(dev->parent);
return 0; return 0;
} }
@@ -53,6 +54,12 @@ static int tegra210_spdif_runtime_resume(struct device *dev)
struct tegra210_spdif *spdif = dev_get_drvdata(dev); struct tegra210_spdif *spdif = dev_get_drvdata(dev);
int ret = 0; int ret = 0;
ret = pm_runtime_get_sync(dev->parent);
if (ret < 0) {
dev_err(dev, "parent get_sync failed: %d\n", ret);
return ret;
}
ret = clk_prepare_enable(spdif->clk_spdif_out); ret = clk_prepare_enable(spdif->clk_spdif_out);
if (ret) { if (ret) {
dev_err(dev, "spdif_out_clk_enable failed: %d\n", ret); dev_err(dev, "spdif_out_clk_enable failed: %d\n", ret);