linux/drivers/acpi/fan.c
<<
>>
Prefs
   1/*
   2 *  acpi_fan.c - ACPI Fan Driver ($Revision: 29 $)
   3 *
   4 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
   5 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   6 *
   7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   8 *
   9 *  This program is free software; you can redistribute it and/or modify
  10 *  it under the terms of the GNU General Public License as published by
  11 *  the Free Software Foundation; either version 2 of the License, or (at
  12 *  your option) any later version.
  13 *
  14 *  This program is distributed in the hope that it will be useful, but
  15 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 *  General Public License for more details.
  18 *
  19 *  You should have received a copy of the GNU General Public License along
  20 *  with this program; if not, write to the Free Software Foundation, Inc.,
  21 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  22 *
  23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  24 */
  25
  26#include <linux/kernel.h>
  27#include <linux/module.h>
  28#include <linux/init.h>
  29#include <linux/types.h>
  30#include <asm/uaccess.h>
  31#include <linux/thermal.h>
  32#include <acpi/acpi_bus.h>
  33#include <acpi/acpi_drivers.h>
  34
  35#define PREFIX "ACPI: "
  36
  37#define ACPI_FAN_CLASS                  "fan"
  38#define ACPI_FAN_FILE_STATE             "state"
  39
  40#define _COMPONENT              ACPI_FAN_COMPONENT
  41ACPI_MODULE_NAME("fan");
  42
  43MODULE_AUTHOR("Paul Diefenbaugh");
  44MODULE_DESCRIPTION("ACPI Fan Driver");
  45MODULE_LICENSE("GPL");
  46
  47static int acpi_fan_add(struct acpi_device *device);
  48static int acpi_fan_remove(struct acpi_device *device, int type);
  49
  50static const struct acpi_device_id fan_device_ids[] = {
  51        {"PNP0C0B", 0},
  52        {"", 0},
  53};
  54MODULE_DEVICE_TABLE(acpi, fan_device_ids);
  55
  56#ifdef CONFIG_PM_SLEEP
  57static int acpi_fan_suspend(struct device *dev);
  58static int acpi_fan_resume(struct device *dev);
  59#endif
  60static SIMPLE_DEV_PM_OPS(acpi_fan_pm, acpi_fan_suspend, acpi_fan_resume);
  61
  62static struct acpi_driver acpi_fan_driver = {
  63        .name = "fan",
  64        .class = ACPI_FAN_CLASS,
  65        .ids = fan_device_ids,
  66        .ops = {
  67                .add = acpi_fan_add,
  68                .remove = acpi_fan_remove,
  69                },
  70        .drv.pm = &acpi_fan_pm,
  71};
  72
  73/* thermal cooling device callbacks */
  74static int fan_get_max_state(struct thermal_cooling_device *cdev, unsigned long
  75                             *state)
  76{
  77        /* ACPI fan device only support two states: ON/OFF */
  78        *state = 1;
  79        return 0;
  80}
  81
  82static int fan_get_cur_state(struct thermal_cooling_device *cdev, unsigned long
  83                             *state)
  84{
  85        struct acpi_device *device = cdev->devdata;
  86        int result;
  87        int acpi_state;
  88
  89        if (!device)
  90                return -EINVAL;
  91
  92        result = acpi_bus_update_power(device->handle, &acpi_state);
  93        if (result)
  94                return result;
  95
  96        *state = (acpi_state == ACPI_STATE_D3 ? 0 :
  97                 (acpi_state == ACPI_STATE_D0 ? 1 : -1));
  98        return 0;
  99}
 100
 101static int
 102fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
 103{
 104        struct acpi_device *device = cdev->devdata;
 105        int result;
 106
 107        if (!device || (state != 0 && state != 1))
 108                return -EINVAL;
 109
 110        result = acpi_bus_set_power(device->handle,
 111                                state ? ACPI_STATE_D0 : ACPI_STATE_D3);
 112
 113        return result;
 114}
 115
 116static const struct thermal_cooling_device_ops fan_cooling_ops = {
 117        .get_max_state = fan_get_max_state,
 118        .get_cur_state = fan_get_cur_state,
 119        .set_cur_state = fan_set_cur_state,
 120};
 121
 122/* --------------------------------------------------------------------------
 123                                 Driver Interface
 124   -------------------------------------------------------------------------- */
 125
 126static int acpi_fan_add(struct acpi_device *device)
 127{
 128        int result = 0;
 129        struct thermal_cooling_device *cdev;
 130
 131        if (!device)
 132                return -EINVAL;
 133
 134        strcpy(acpi_device_name(device), "Fan");
 135        strcpy(acpi_device_class(device), ACPI_FAN_CLASS);
 136
 137        result = acpi_bus_update_power(device->handle, NULL);
 138        if (result) {
 139                printk(KERN_ERR PREFIX "Setting initial power state\n");
 140                goto end;
 141        }
 142
 143        cdev2IX" I.c#L143" id="L143"4/uacc/asm-m32r/uaccess.h|include/asm-m68k/uaccess.h|ipm-m32r/uaccess.h|include/asm-m68k/u=KERN_>"Fan");
">device, int   14fan_cooling_ops = {
  45  46
result =   47static 1int <14   (end;
  48static 1int <148ef="drivers/acpi/fan.c#L142" id="L142" class="line" name="L49">  49
  50static 1const15f="+code=result" class="sref3" _dbgce, int device->"Fan");
m-m68k/uU Ges ss.h|include/a%d\ href="driversLL" class="sref">cdev->  51       1 {  52       1 {device->;
cdev->  53};
">result = (device->);
  54evice->);
  55
"Fan");
2r/uaccess.h|inhref="drivers/acpi/fan.c#L140" id="L140" class"line" na1me="L56">  56#ifdef 1result)
  57static 1int <15   (device->"Fan");
FailU Gnd"creef= sysfs 53  58static 1int <15  return -"Fan");
'
2r/uaccess.h|inh#39
a href="drivers/acpi/fan.c#L140" id="L140" class"line" na1me="L59">  59#endif
1  60static 1result = evice->);
  61
device->);
  62static 1struc16  return -"Fan");
lude/a&ref="drivers/acpi/fan.c#L140" id="L140" class"line" na1me="L63">  63       1 .result)
  64       1 .device->"Fan");
FailU Gnd"creef= sysfs 53  65       1 ."Fan");
'
lude/a'
a href="drivers/acpi/fan.c#L140" id="L140" class"line" na1me="L66">  66       1 .  67       1     16f="+code=result" class="sref">printk(KINFO_ERR PREFIX "Setting initial pow%s [%s] (%s)\ href="driversLcpi/fan.c#L137" id="L137" class"line" na1me="L68">  68       1     1   .acpi_device_name(device), bpi_device_id device),   69       1     1   },
device)
 ? "Setting initial powoffhref="drivers/acpi/fan.c#L140" id="L140" class"line" na1me="L70">  70       1 .  71};
end;
  72
result;
  73  74static 1int <17ers/acpi/fan.c#L35" id="L35" class=1"line" na1me="L75">  75       1     1      "+code=acpi_fan_remove" class="sref">acpi_fan_remove(struct acpi_device *device, int type);
  76{
  77       1 thermal_cooling_device *cdev;
;
device),   78       1 *  79       1 retu17a href="+code=device" class="sref">device)
  80}
EINVAL;
  81
  82static 1int <18f="+code=result" class="srefsysfs_a href"53(device->);
"Fan");
2r/uaccess.h|inhref="drivers/acpi/fan.c#L140" id="L140" class"line" na1me="L83">  83       1     18f="+code=cdev" class="sref">sysfs_a href"53(evice->);
"Fan");
lude/a&ref="drivers/acpi/fan.c#L140" id="L140" class"line" na1me="L84">  84{
  85       1 stru18ers/acpi/fan.c#L126" id="L126" class"line" na1me="L86">  86       1 int 1a href="+code=drivers/acpi/fan.c#L99" id="L99" class=1"line" na1me="L87">  87       1 int 1a hrefacpi/fan.c#L142" id="L142" class"line" na1me="L88">  88
  89       1 if (18a href==CONFIG_PM_SLEEP" class="sref">CONFIG_PM_SLEEP
  90       1     19="+code=SIMPacpi_fan_suspend" class="sref">acpi_fan_suspend(struct device *dev);
  91
  92       1 d/a>);
  93       1 if (19               *EINVAL;
  94       1     19ers/acpi/fan.c#L35" id="L35" class=1"line" na1me="L95">  95
acpi_bus_set_power(acpi_device *acpi=fanice" class="sref">d/a>);
handle, s="sref">ACPI_STATE_D0 :   96       1 *  97       1     1    (  98       1 retu1n 0;
  99}
 100
acpi_fan_resume(struct device *dev);
 101static2int
<20ers/aacpi/fan.c#L77" id="L77" class=2="line" n2me="L102"> 102result;
 103{
 104      2 stru2t d/a>);
 105      2 int 20               *EINVAL;
 106
 107      2 if (20f="+code=result" class="sref">result = acpi_bus_update_power(acpi_device *acpi=fanice" class="sref">d/a>);
handle, NULL);
 108      2     20 href="+code=result" class="sref">result) {
 109
printk(KERN_ERR PREFIX "Setting initial powError  hreftate8" ;);
 110      2  111      2     2              de=result" class="sref">result;
 112
 113      2 retu2n  114}
 115
;
;
 116static2const2struct


fook/ua> The original LXR software byviceult" classhttp://sourceforge.net/projects/lxua>LXR ----unitye=NULLthis experi----al 8" iion byvlt" classmailto:lxu@lgt; .no">lxu@lgt; .nocode_
subfook/ua> lxu.lgt; .no ki+coy hosted byvlt" classhttp://www.redpill-lgtpro.no">Redpill Lgtpro Avers/a providpanof Lgtuxef="+rivtate"+c opereft="+ seracpi+ sinced19e5.