linux/drivers/acpi/cm_sbs.c
<<
>>
Prefs
   1/*
   2 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   3 *
   4 *  This program is free software; you can redistribute it and/or modify
   5 *  it under the terms of the GNU General Public License as published by
   6 *  the Free Software Foundation; either version 2 of the License, or (at
   7 *  your option) any later version.
   8 *
   9 *  This program is distributed in the hope that it will be useful, but
  10 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12 *  General Public License for more details.
  13 *
  14 *  You should have received a copy of the GNU General Public License along
  15 *  with this program; if not, write to the Free Software Foundation, Inc.,
  16 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  17 *
  18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19 */
  20
  21#include <linux/kernel.h>
  22#include <linux/module.h>
  23#include <linux/init.h>
  24#include <linux/acpi.h>
  25#include <linux/types.h>
  26#include <linux/proc_fs.h>
  27#include <linux/seq_file.h>
  28#include <acpi/acpi_bus.h>
  29#include <acpi/acpi_drivers.h>
  30
  31ACPI_MODULE_NAME("cm_sbs");
  32#define ACPI_AC_CLASS           "ac_adapter"
  33#define ACPI_BATTERY_CLASS      "battery"
  34#define _COMPONENT              ACPI_SBS_COMPONENT
  35static struct proc_dir_entry *acpi_ac_dir;
  36static struct proc_dir_entry *acpi_battery_dir;
  37
  38static DEFINE_MUTEX(cm_sbs_mutex);
  39
  40static int lock_ac_dir_cnt;
  41static int lock_battery_dir_cnt;
  42
  43struct proc_dir_entry *acpi_lock_ac_dir(void)
  44{
  45        mutex_lock(&cm_sbs_mutex);
  46        if (!acpi_ac_dir)
  47                acpi_ac_dir = proc_mkdir(ACPI_AC_CLASS, acpi_root_dir);
  48        if (acpi_ac_dir) {
  49                lock_ac_dir_cnt++;
  50        } else {
  51                printk(KERN_ERR PREFIX
  52                                  "Cannot create %s\n", ACPI_AC_CLASS);
  53        }
  54        mutex_unlock(&cm_sbs_mutex);
  55        return acpi_ac_dir;
  56}
  57EXPORT_SYMBOL(acpi_lock_ac_dir);
  58
  59void acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir_param)
  60{
  61        mutex_lock(&cm_sbs_mutex);
  62        if (acpi_ac_dir_param)
  63                lock_ac_dir_cnt--;
  64        if (lock_ac_dir_cnt == 0 && acpi_ac_dir_param && acpi_ac_dir) {
  65                remove_proc_entry(ACPI_AC_CLASS, acpi_root_dir);
  66                acpi_ac_dir = NULL;
  67        }
  68        mutex_unlock(&cm_sbs_mutex);
  69}
  70EXPORT_SYMBOL(acpi_unlock_ac_dir);
  71
  72struct proc_dir_entry *acpi_lock_battery_dir(void)
  73{
  74        mutex_lock(&cm_sbs_mutex);
  75        if (!acpi_battery_dir) {
  76                acpi_battery_dir =
  77                    proc_mkdir(ACPI_BATTERY_CLASS, acpi_root_dir);
  78        }
  79        if (acpi_battery_dir) {
  80                lock_battery_dir_cnt++;
  81        } else {
  82                printk(KERN_ERR PREFIX
  83                                  "Cannot create %s\n", ACPI_BATTERY_CLASS);
  84        }
  85        mutex_unlock(&cm_sbs_mutex);
  86        return acpi_battery_dir;
  87}
  88EXPORT_SYMBOL(acpi_lock_battery_dir);
  89
  90void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir_param)
  91{
  92        mutex_lock(&cm_sbs_mutex);
  93        if (acpi_battery_dir_param)
  94                lock_battery_dir_cnt--;
  95        if (lock_battery_dir_cnt == 0 && acpi_battery_dir_param
  96            && acpi_battery_dir) {
  97                remove_proc_entry(ACPI_BATTERY_CLASS, acpi_root_dir);
  98                acpi_battery_dir = NULL;
  99        }
 100        mutex_unlock(&cm_sbs_mutex);
 101        return;
 102}
 103EXPORT_SYMBOL(acpi_unlock_battery_dir);
 104