mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
ASoC: codecs: Fix error handling in power domain init and exit handlers
[ Upstream commit1a8ee4cf84
] 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:9e3d83c528
("ASoC: codecs: Add power domains support in digital macro codecs") Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com> Co-developed-by: Venkata Prasad Potturu <quic_potturu@quicinc.com> Signed-off-by: Venkata Prasad Potturu <quic_potturu@quicinc.com> Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Link: https://lore.kernel.org/r/1647965937-32203-1-git-send-email-quic_srivasam@quicinc.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
b740ef5cf2
commit
b9e8415ffc
1 changed files with 21 additions and 18 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
l_pds->dcodec_pd = dev_pm_domain_attach_by_name(dev, "dcodec");
|
||||
if (IS_ERR_OR_NULL(l_pds->dcodec_pd))
|
||||
goto dcodec_err;
|
||||
ret = pm_runtime_resume_and_get(l_pds->macro_pd);
|
||||
if (ret < 0)
|
||||
goto macro_sync_err;
|
||||
|
||||
ret = pm_runtime_get_sync(l_pds->dcodec_pd);
|
||||
if (ret < 0) {
|
||||
pm_runtime_put_noidle(l_pds->dcodec_pd);
|
||||
goto dcodec_sync_err;
|
||||
l_pds->dcodec_pd = dev_pm_domain_attach_by_name(dev, "dcodec");
|
||||
if (IS_ERR_OR_NULL(l_pds->dcodec_pd)) {
|
||||
ret = PTR_ERR(l_pds->dcodec_pd);
|
||||
goto dcodec_err;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue