ASoC: codecs: Fix error handling in power domain init and exit handlers

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>
This commit is contained in:
Srinivasa Rao Mandadapu 2022-03-22 21:48:57 +05:30 committed by Mark Brown
parent 9b014266ef
commit 1a8ee4cf84
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -24,42 +24,45 @@ struct lpass_macro *lpass_macro_pds_init(struct device *dev)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
l_pds->macro_pd = dev_pm_domain_attach_by_name(dev, "macro"); l_pds->macro_pd = dev_pm_domain_attach_by_name(dev, "macro");
if (IS_ERR_OR_NULL(l_pds->macro_pd)) if (IS_ERR_OR_NULL(l_pds->macro_pd)) {
return NULL; ret = PTR_ERR(l_pds->macro_pd);
ret = pm_runtime_get_sync(l_pds->macro_pd);
if (ret < 0) {
pm_runtime_put_noidle(l_pds->macro_pd);
goto macro_err; goto macro_err;
} }
l_pds->dcodec_pd = dev_pm_domain_attach_by_name(dev, "dcodec"); ret = pm_runtime_resume_and_get(l_pds->macro_pd);
if (IS_ERR_OR_NULL(l_pds->dcodec_pd)) if (ret < 0)
goto dcodec_err; goto macro_sync_err;
ret = pm_runtime_get_sync(l_pds->dcodec_pd); l_pds->dcodec_pd = dev_pm_domain_attach_by_name(dev, "dcodec");
if (ret < 0) { if (IS_ERR_OR_NULL(l_pds->dcodec_pd)) {
pm_runtime_put_noidle(l_pds->dcodec_pd); ret = PTR_ERR(l_pds->dcodec_pd);
goto dcodec_sync_err; goto dcodec_err;
} }
ret = pm_runtime_resume_and_get(l_pds->dcodec_pd);
if (ret < 0)
goto dcodec_sync_err;
return l_pds; return l_pds;
dcodec_sync_err: dcodec_sync_err:
dev_pm_domain_detach(l_pds->dcodec_pd, false); dev_pm_domain_detach(l_pds->dcodec_pd, false);
dcodec_err: dcodec_err:
pm_runtime_put(l_pds->macro_pd); pm_runtime_put(l_pds->macro_pd);
macro_err: macro_sync_err:
dev_pm_domain_detach(l_pds->macro_pd, false); dev_pm_domain_detach(l_pds->macro_pd, false);
macro_err:
return ERR_PTR(ret); return ERR_PTR(ret);
} }
EXPORT_SYMBOL_GPL(lpass_macro_pds_init); EXPORT_SYMBOL_GPL(lpass_macro_pds_init);
void lpass_macro_pds_exit(struct lpass_macro *pds) void lpass_macro_pds_exit(struct lpass_macro *pds)
{ {
pm_runtime_put(pds->macro_pd); if (pds) {
dev_pm_domain_detach(pds->macro_pd, false); pm_runtime_put(pds->macro_pd);
pm_runtime_put(pds->dcodec_pd); dev_pm_domain_detach(pds->macro_pd, false);
dev_pm_domain_detach(pds->dcodec_pd, false); pm_runtime_put(pds->dcodec_pd);
dev_pm_domain_detach(pds->dcodec_pd, false);
}
} }
EXPORT_SYMBOL_GPL(lpass_macro_pds_exit); EXPORT_SYMBOL_GPL(lpass_macro_pds_exit);