2019-05-27 09:55:06 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2014-05-04 07:07:24 +04:00
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/init.h>
# include <linux/acpi.h>
# include <linux/types.h>
# include <linux/proc_fs.h>
# include <linux/seq_file.h>
# include <acpi/acpi_bus.h>
# include <acpi/acpi_drivers.h>
# define PREFIX "ACPI: "
ACPI_MODULE_NAME ( " cm_sbs " ) ;
# define ACPI_AC_CLASS "ac_adapter"
# define ACPI_BATTERY_CLASS "battery"
# define _COMPONENT ACPI_SBS_COMPONENT
static struct proc_dir_entry * acpi_ac_dir ;
static struct proc_dir_entry * acpi_battery_dir ;
static DEFINE_MUTEX ( cm_sbs_mutex ) ;
static int lock_ac_dir_cnt ;
static int lock_battery_dir_cnt ;
struct proc_dir_entry * acpi_lock_ac_dir ( void )
{
mutex_lock ( & cm_sbs_mutex ) ;
if ( ! acpi_ac_dir )
acpi_ac_dir = proc_mkdir ( ACPI_AC_CLASS , acpi_root_dir ) ;
if ( acpi_ac_dir ) {
lock_ac_dir_cnt + + ;
} else {
printk ( KERN_ERR PREFIX
" Cannot create %s \n " , ACPI_AC_CLASS ) ;
}
mutex_unlock ( & cm_sbs_mutex ) ;
return acpi_ac_dir ;
}
EXPORT_SYMBOL ( acpi_lock_ac_dir ) ;
void acpi_unlock_ac_dir ( struct proc_dir_entry * acpi_ac_dir_param )
{
mutex_lock ( & cm_sbs_mutex ) ;
if ( acpi_ac_dir_param )
lock_ac_dir_cnt - - ;
if ( lock_ac_dir_cnt = = 0 & & acpi_ac_dir_param & & acpi_ac_dir ) {
remove_proc_entry ( ACPI_AC_CLASS , acpi_root_dir ) ;
acpi_ac_dir = NULL ;
}
mutex_unlock ( & cm_sbs_mutex ) ;
}
EXPORT_SYMBOL ( acpi_unlock_ac_dir ) ;
struct proc_dir_entry * acpi_lock_battery_dir ( void )
{
mutex_lock ( & cm_sbs_mutex ) ;
if ( ! acpi_battery_dir ) {
acpi_battery_dir =
proc_mkdir ( ACPI_BATTERY_CLASS , acpi_root_dir ) ;
}
if ( acpi_battery_dir ) {
lock_battery_dir_cnt + + ;
} else {
printk ( KERN_ERR PREFIX
" Cannot create %s \n " , ACPI_BATTERY_CLASS ) ;
}
mutex_unlock ( & cm_sbs_mutex ) ;
return acpi_battery_dir ;
}
EXPORT_SYMBOL ( acpi_lock_battery_dir ) ;
void acpi_unlock_battery_dir ( struct proc_dir_entry * acpi_battery_dir_param )
{
mutex_lock ( & cm_sbs_mutex ) ;
if ( acpi_battery_dir_param )
lock_battery_dir_cnt - - ;
if ( lock_battery_dir_cnt = = 0 & & acpi_battery_dir_param
& & acpi_battery_dir ) {
remove_proc_entry ( ACPI_BATTERY_CLASS , acpi_root_dir ) ;
acpi_battery_dir = NULL ;
}
mutex_unlock ( & cm_sbs_mutex ) ;
return ;
}
EXPORT_SYMBOL ( acpi_unlock_battery_dir ) ;