Skip to content

Commit

Permalink
ASoC: codecs: Fix error handling in power domain init and exit handlers
Browse files Browse the repository at this point in the history
[ Upstream commit 1a8ee4c ]

Update error handling in power domain init and exit handlers, as existing handling
may cause issues in device remove function.
Use appropriate pm core api for power domain get and sync to avoid redundant code.

Fixes: 9e3d83c ("ASoC: codecs: Add power domains support in digital macro codecs")

Signed-off-by: Srinivasa Rao Mandadapu <[email protected]>
Co-developed-by: Venkata Prasad Potturu <[email protected]>
Signed-off-by: Venkata Prasad Potturu <[email protected]>
Reported-by: kernel test robot <[email protected]>
Reported-by: Dan Carpenter <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
Srinivasa Rao Mandadapu authored and gregkh committed Jun 9, 2022
1 parent b740ef5 commit b9e8415
Showing 1 changed file with 19 additions and 16 deletions.
35 changes: 19 additions & 16 deletions sound/soc/codecs/lpass-macro-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,45 @@ struct lpass_macro *lpass_macro_pds_init(struct device *dev)
return ERR_PTR(-ENOMEM);

l_pds->macro_pd = dev_pm_domain_attach_by_name(dev, "macro");
if (IS_ERR_OR_NULL(l_pds->macro_pd))
return NULL;

ret = pm_runtime_get_sync(l_pds->macro_pd);
if (ret < 0) {
pm_runtime_put_noidle(l_pds->macro_pd);
if (IS_ERR_OR_NULL(l_pds->macro_pd)) {
ret = PTR_ERR(l_pds->macro_pd);
goto macro_err;
}

ret = pm_runtime_resume_and_get(l_pds->macro_pd);
if (ret < 0)
goto macro_sync_err;

l_pds->dcodec_pd = dev_pm_domain_attach_by_name(dev, "dcodec");
if (IS_ERR_OR_NULL(l_pds->dcodec_pd))
if (IS_ERR_OR_NULL(l_pds->dcodec_pd)) {
ret = PTR_ERR(l_pds->dcodec_pd);
goto dcodec_err;
}

ret = pm_runtime_get_sync(l_pds->dcodec_pd);
if (ret < 0) {
pm_runtime_put_noidle(l_pds->dcodec_pd);
ret = pm_runtime_resume_and_get(l_pds->dcodec_pd);
if (ret < 0)
goto dcodec_sync_err;
}
return l_pds;

dcodec_sync_err:
dev_pm_domain_detach(l_pds->dcodec_pd, false);
dcodec_err:
pm_runtime_put(l_pds->macro_pd);
macro_err:
macro_sync_err:
dev_pm_domain_detach(l_pds->macro_pd, false);
macro_err:
return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(lpass_macro_pds_init);

void lpass_macro_pds_exit(struct lpass_macro *pds)
{
pm_runtime_put(pds->macro_pd);
dev_pm_domain_detach(pds->macro_pd, false);
pm_runtime_put(pds->dcodec_pd);
dev_pm_domain_detach(pds->dcodec_pd, false);
if (pds) {
pm_runtime_put(pds->macro_pd);
dev_pm_domain_detach(pds->macro_pd, false);
pm_runtime_put(pds->dcodec_pd);
dev_pm_domain_detach(pds->dcodec_pd, false);
}
}
EXPORT_SYMBOL_GPL(lpass_macro_pds_exit);

Expand Down

0 comments on commit b9e8415

Please sign in to comment.