2022-02-26 23:39:18 +05:30
// SPDX-License-Identifier: GPL-2.0-only
// Copyright (c) 2022, The Linux Foundation. All rights reserved.
# include <linux/export.h>
# include <linux/module.h>
# include <linux/init.h>
# include <linux/of_platform.h>
# include <linux/platform_device.h>
# include <linux/pm_domain.h>
# include <linux/pm_runtime.h>
# include "lpass-macro-common.h"
struct lpass_macro * lpass_macro_pds_init ( struct device * dev )
{
struct lpass_macro * l_pds ;
int ret ;
if ( ! of_find_property ( dev - > of_node , " power-domains " , NULL ) )
return NULL ;
l_pds = devm_kzalloc ( dev , sizeof ( * l_pds ) , GFP_KERNEL ) ;
if ( ! l_pds )
return ERR_PTR ( - ENOMEM ) ;
l_pds - > macro_pd = dev_pm_domain_attach_by_name ( dev , " macro " ) ;
2022-03-22 21:48:57 +05:30
if ( IS_ERR_OR_NULL ( l_pds - > macro_pd ) ) {
2022-05-16 20:09:09 +08:00
ret = l_pds - > macro_pd ? PTR_ERR ( l_pds - > macro_pd ) : - ENODATA ;
2022-02-26 23:39:18 +05:30
goto macro_err ;
}
2022-03-22 21:48:57 +05:30
ret = pm_runtime_resume_and_get ( l_pds - > macro_pd ) ;
if ( ret < 0 )
goto macro_sync_err ;
2022-02-26 23:39:18 +05:30
l_pds - > dcodec_pd = dev_pm_domain_attach_by_name ( dev , " dcodec " ) ;
2022-03-22 21:48:57 +05:30
if ( IS_ERR_OR_NULL ( l_pds - > dcodec_pd ) ) {
2022-05-16 20:09:09 +08:00
ret = l_pds - > dcodec_pd ? PTR_ERR ( l_pds - > dcodec_pd ) : - ENODATA ;
2022-02-26 23:39:18 +05:30
goto dcodec_err ;
2022-03-22 21:48:57 +05:30
}
2022-02-26 23:39:18 +05:30
2022-03-22 21:48:57 +05:30
ret = pm_runtime_resume_and_get ( l_pds - > dcodec_pd ) ;
if ( ret < 0 )
2022-02-26 23:39:18 +05:30
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 ) ;
2022-03-22 21:48:57 +05:30
macro_sync_err :
2022-02-26 23:39:18 +05:30
dev_pm_domain_detach ( l_pds - > macro_pd , false ) ;
2022-03-22 21:48:57 +05:30
macro_err :
2022-02-26 23:39:18 +05:30
return ERR_PTR ( ret ) ;
}
EXPORT_SYMBOL_GPL ( lpass_macro_pds_init ) ;
void lpass_macro_pds_exit ( struct lpass_macro * pds )
{
2022-03-22 21:48:57 +05:30
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 ) ;
}
2022-02-26 23:39:18 +05:30
}
EXPORT_SYMBOL_GPL ( lpass_macro_pds_exit ) ;
MODULE_DESCRIPTION ( " Common macro driver " ) ;
MODULE_LICENSE ( " GPL " ) ;