mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 09:13:55 +08:00
Merge branch 'acpi-cleanup'
* acpi-cleanup: (34 commits) ACPI / proc: Remove alarm proc file ACPI: Remove CONFIG_ACPI_PROCFS_POWER and cm_sbsc.c ACPI / SBS: Remove SBS's proc directory ACPI / Battery: Remove battery's proc directory ACP / fan: trivial style cleanup ACPI / processor: remove superfluous pr == NULL checks ACPI / mm: use NUMA_NO_NODE toshiba_acpi: convert acpi_evaluate_object() to acpi_evaluate_integer() intel-smartconnect: convert acpi_evaluate_object() to acpi_evaluate_integer() intel-rst: convert acpi_evaluate_object() to acpi_evaluate_integer() fujitsu-laptop: convert acpi_evaluate_object() to acpi_evaluate_integer() i2c-hid: convert acpi_evaluate_object() to acpi_evaluate_integer() ACPI: dock: convert acpi_evaluate_object() to acpi_evaluate_integer() acpi_processor: convert acpi_evaluate_object() to acpi_evaluate_integer() pnpacpi: convert acpi_get_handle() to acpi_has_method() wmi: convert acpi_get_handle() to acpi_has_method() toshiba_acpi: convert acpi_get_handle() to acpi_has_method() sony-laptop: convert acpi_get_handle() to acpi_has_method() intel_menlow: convert acpi_get_handle() to acpi_has_method() fujitsu-laptop: convert acpi_get_handle() to acpi_has_method() ...
This commit is contained in:
commit
8e32e47dbb
@ -40,16 +40,9 @@ static bool lid_wake_on_close;
|
||||
*/
|
||||
static int set_lid_wake_behavior(bool wake_on_close)
|
||||
{
|
||||
struct acpi_object_list arg_list;
|
||||
union acpi_object arg;
|
||||
acpi_status status;
|
||||
|
||||
arg_list.count = 1;
|
||||
arg_list.pointer = &arg;
|
||||
arg.type = ACPI_TYPE_INTEGER;
|
||||
arg.integer.value = wake_on_close;
|
||||
|
||||
status = acpi_evaluate_object(NULL, "\\_SB.PCI0.LID.LIDW", &arg_list, NULL);
|
||||
status = acpi_execute_simple_method(NULL, "\\_SB.PCI0.LID.LIDW", wake_on_close);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_warning(PFX "failed to set lid behavior\n");
|
||||
return 1;
|
||||
|
@ -56,23 +56,6 @@ config ACPI_PROCFS
|
||||
|
||||
Say N to delete /proc/acpi/ files that have moved to /sys/
|
||||
|
||||
config ACPI_PROCFS_POWER
|
||||
bool "Deprecated power /proc/acpi directories"
|
||||
depends on PROC_FS
|
||||
help
|
||||
For backwards compatibility, this option allows
|
||||
deprecated power /proc/acpi/ directories to exist, even when
|
||||
they have been replaced by functions in /sys.
|
||||
The deprecated directories (and their replacements) include:
|
||||
/proc/acpi/battery/* (/sys/class/power_supply/*)
|
||||
/proc/acpi/ac_adapter/* (sys/class/power_supply/*)
|
||||
This option has no effect on /proc/acpi/ directories
|
||||
and functions, which do not yet exist in /sys
|
||||
This option, together with the proc directories, will be
|
||||
deleted in 2.6.39.
|
||||
|
||||
Say N to delete power /proc/acpi/ directories that have moved to /sys/
|
||||
|
||||
config ACPI_EC_DEBUGFS
|
||||
tristate "EC read/write access through /sys/kernel/debug/ec"
|
||||
default n
|
||||
|
@ -47,7 +47,6 @@ acpi-y += sysfs.o
|
||||
acpi-$(CONFIG_X86) += acpi_cmos_rtc.o
|
||||
acpi-$(CONFIG_DEBUG_FS) += debugfs.o
|
||||
acpi-$(CONFIG_ACPI_NUMA) += numa.o
|
||||
acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o
|
||||
ifdef CONFIG_ACPI_VIDEO
|
||||
acpi-y += video_detect.o
|
||||
endif
|
||||
|
@ -281,7 +281,7 @@ static void acpi_memory_remove_memory(struct acpi_memory_device *mem_device)
|
||||
if (!info->enabled)
|
||||
continue;
|
||||
|
||||
if (nid < 0)
|
||||
if (nid == NUMA_NO_NODE)
|
||||
nid = memory_add_physaddr_to_nid(info->start_addr);
|
||||
|
||||
acpi_unbind_memory_blocks(info, handle);
|
||||
|
@ -219,6 +219,7 @@ static int acpi_processor_get_info(struct acpi_device *device)
|
||||
int cpu_index, device_declaration = 0;
|
||||
acpi_status status = AE_OK;
|
||||
static int cpu0_initialized;
|
||||
unsigned long long value;
|
||||
|
||||
if (num_online_cpus() > 1)
|
||||
errata.smp = TRUE;
|
||||
@ -258,7 +259,6 @@ static int acpi_processor_get_info(struct acpi_device *device)
|
||||
* Declared with "Device" statement; match _UID.
|
||||
* Note that we don't handle string _UIDs yet.
|
||||
*/
|
||||
unsigned long long value;
|
||||
status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
|
||||
NULL, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -332,9 +332,9 @@ static int acpi_processor_get_info(struct acpi_device *device)
|
||||
* ensure we get the right value in the "physical id" field
|
||||
* of /proc/cpuinfo
|
||||
*/
|
||||
status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer);
|
||||
status = acpi_evaluate_integer(pr->handle, "_SUN", NULL, &value);
|
||||
if (ACPI_SUCCESS(status))
|
||||
arch_fix_phys_package_id(pr->id, object.integer.value);
|
||||
arch_fix_phys_package_id(pr->id, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -36,12 +36,6 @@
|
||||
#include <linux/suspend.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/uaccess.h>
|
||||
#endif
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <linux/power_supply.h>
|
||||
@ -72,19 +66,6 @@ static unsigned int cache_time = 1000;
|
||||
module_param(cache_time, uint, 0644);
|
||||
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
extern struct proc_dir_entry *acpi_lock_battery_dir(void);
|
||||
extern void *acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir);
|
||||
|
||||
enum acpi_battery_files {
|
||||
info_tag = 0,
|
||||
state_tag,
|
||||
alarm_tag,
|
||||
ACPI_BATTERY_NUMFILES,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
static const struct acpi_device_id battery_device_ids[] = {
|
||||
{"PNP0C0A", 0},
|
||||
{"", 0},
|
||||
@ -320,14 +301,6 @@ static enum power_supply_property energy_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_SERIAL_NUMBER,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
inline char *acpi_battery_units(struct acpi_battery *battery)
|
||||
{
|
||||
return (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) ?
|
||||
"mA" : "mW";
|
||||
}
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Battery Management
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -740,279 +713,6 @@ static void acpi_battery_refresh(struct acpi_battery *battery)
|
||||
sysfs_add_battery(battery);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
static struct proc_dir_entry *acpi_battery_dir;
|
||||
|
||||
static int acpi_battery_print_info(struct seq_file *seq, int result)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "present: %s\n",
|
||||
acpi_battery_present(battery) ? "yes" : "no");
|
||||
if (!acpi_battery_present(battery))
|
||||
goto end;
|
||||
if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "design capacity: unknown\n");
|
||||
else
|
||||
seq_printf(seq, "design capacity: %d %sh\n",
|
||||
battery->design_capacity,
|
||||
acpi_battery_units(battery));
|
||||
|
||||
if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "last full capacity: unknown\n");
|
||||
else
|
||||
seq_printf(seq, "last full capacity: %d %sh\n",
|
||||
battery->full_charge_capacity,
|
||||
acpi_battery_units(battery));
|
||||
|
||||
seq_printf(seq, "battery technology: %srechargeable\n",
|
||||
(!battery->technology)?"non-":"");
|
||||
|
||||
if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "design voltage: unknown\n");
|
||||
else
|
||||
seq_printf(seq, "design voltage: %d mV\n",
|
||||
battery->design_voltage);
|
||||
seq_printf(seq, "design capacity warning: %d %sh\n",
|
||||
battery->design_capacity_warning,
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "design capacity low: %d %sh\n",
|
||||
battery->design_capacity_low,
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "cycle count: %i\n", battery->cycle_count);
|
||||
seq_printf(seq, "capacity granularity 1: %d %sh\n",
|
||||
battery->capacity_granularity_1,
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "capacity granularity 2: %d %sh\n",
|
||||
battery->capacity_granularity_2,
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "model number: %s\n", battery->model_number);
|
||||
seq_printf(seq, "serial number: %s\n", battery->serial_number);
|
||||
seq_printf(seq, "battery type: %s\n", battery->type);
|
||||
seq_printf(seq, "OEM info: %s\n", battery->oem_info);
|
||||
end:
|
||||
if (result)
|
||||
seq_printf(seq, "ERROR: Unable to read battery info\n");
|
||||
return result;
|
||||
}
|
||||
|
||||
static int acpi_battery_print_state(struct seq_file *seq, int result)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "present: %s\n",
|
||||
acpi_battery_present(battery) ? "yes" : "no");
|
||||
if (!acpi_battery_present(battery))
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "capacity state: %s\n",
|
||||
(battery->state & 0x04) ? "critical" : "ok");
|
||||
if ((battery->state & 0x01) && (battery->state & 0x02))
|
||||
seq_printf(seq,
|
||||
"charging state: charging/discharging\n");
|
||||
else if (battery->state & 0x01)
|
||||
seq_printf(seq, "charging state: discharging\n");
|
||||
else if (battery->state & 0x02)
|
||||
seq_printf(seq, "charging state: charging\n");
|
||||
else
|
||||
seq_printf(seq, "charging state: charged\n");
|
||||
|
||||
if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "present rate: unknown\n");
|
||||
else
|
||||
seq_printf(seq, "present rate: %d %s\n",
|
||||
battery->rate_now, acpi_battery_units(battery));
|
||||
|
||||
if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "remaining capacity: unknown\n");
|
||||
else
|
||||
seq_printf(seq, "remaining capacity: %d %sh\n",
|
||||
battery->capacity_now, acpi_battery_units(battery));
|
||||
if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "present voltage: unknown\n");
|
||||
else
|
||||
seq_printf(seq, "present voltage: %d mV\n",
|
||||
battery->voltage_now);
|
||||
end:
|
||||
if (result)
|
||||
seq_printf(seq, "ERROR: Unable to read battery state\n");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int acpi_battery_print_alarm(struct seq_file *seq, int result)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
if (!acpi_battery_present(battery)) {
|
||||
seq_printf(seq, "present: no\n");
|
||||
goto end;
|
||||
}
|
||||
seq_printf(seq, "alarm: ");
|
||||
if (!battery->alarm)
|
||||
seq_printf(seq, "unsupported\n");
|
||||
else
|
||||
seq_printf(seq, "%u %sh\n", battery->alarm,
|
||||
acpi_battery_units(battery));
|
||||
end:
|
||||
if (result)
|
||||
seq_printf(seq, "ERROR: Unable to read battery alarm\n");
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t acpi_battery_write_alarm(struct file *file,
|
||||
const char __user * buffer,
|
||||
size_t count, loff_t * ppos)
|
||||
{
|
||||
int result = 0;
|
||||
char alarm_string[12] = { '\0' };
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_battery *battery = m->private;
|
||||
|
||||
if (!battery || (count > sizeof(alarm_string) - 1))
|
||||
return -EINVAL;
|
||||
if (!acpi_battery_present(battery)) {
|
||||
result = -ENODEV;
|
||||
goto end;
|
||||
}
|
||||
if (copy_from_user(alarm_string, buffer, count)) {
|
||||
result = -EFAULT;
|
||||
goto end;
|
||||
}
|
||||
alarm_string[count] = '\0';
|
||||
battery->alarm = simple_strtol(alarm_string, NULL, 0);
|
||||
result = acpi_battery_set_alarm(battery);
|
||||
end:
|
||||
if (!result)
|
||||
return count;
|
||||
return result;
|
||||
}
|
||||
|
||||
typedef int(*print_func)(struct seq_file *seq, int result);
|
||||
|
||||
static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = {
|
||||
acpi_battery_print_info,
|
||||
acpi_battery_print_state,
|
||||
acpi_battery_print_alarm,
|
||||
};
|
||||
|
||||
static int acpi_battery_read(int fid, struct seq_file *seq)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
int result = acpi_battery_update(battery);
|
||||
return acpi_print_funcs[fid](seq, result);
|
||||
}
|
||||
|
||||
#define DECLARE_FILE_FUNCTIONS(_name) \
|
||||
static int acpi_battery_read_##_name(struct seq_file *seq, void *offset) \
|
||||
{ \
|
||||
return acpi_battery_read(_name##_tag, seq); \
|
||||
} \
|
||||
static int acpi_battery_##_name##_open_fs(struct inode *inode, struct file *file) \
|
||||
{ \
|
||||
return single_open(file, acpi_battery_read_##_name, PDE_DATA(inode)); \
|
||||
}
|
||||
|
||||
DECLARE_FILE_FUNCTIONS(info);
|
||||
DECLARE_FILE_FUNCTIONS(state);
|
||||
DECLARE_FILE_FUNCTIONS(alarm);
|
||||
|
||||
#undef DECLARE_FILE_FUNCTIONS
|
||||
|
||||
#define FILE_DESCRIPTION_RO(_name) \
|
||||
{ \
|
||||
.name = __stringify(_name), \
|
||||
.mode = S_IRUGO, \
|
||||
.ops = { \
|
||||
.open = acpi_battery_##_name##_open_fs, \
|
||||
.read = seq_read, \
|
||||
.llseek = seq_lseek, \
|
||||
.release = single_release, \
|
||||
.owner = THIS_MODULE, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define FILE_DESCRIPTION_RW(_name) \
|
||||
{ \
|
||||
.name = __stringify(_name), \
|
||||
.mode = S_IFREG | S_IRUGO | S_IWUSR, \
|
||||
.ops = { \
|
||||
.open = acpi_battery_##_name##_open_fs, \
|
||||
.read = seq_read, \
|
||||
.llseek = seq_lseek, \
|
||||
.write = acpi_battery_write_##_name, \
|
||||
.release = single_release, \
|
||||
.owner = THIS_MODULE, \
|
||||
}, \
|
||||
}
|
||||
|
||||
static const struct battery_file {
|
||||
struct file_operations ops;
|
||||
umode_t mode;
|
||||
const char *name;
|
||||
} acpi_battery_file[] = {
|
||||
FILE_DESCRIPTION_RO(info),
|
||||
FILE_DESCRIPTION_RO(state),
|
||||
FILE_DESCRIPTION_RW(alarm),
|
||||
};
|
||||
|
||||
#undef FILE_DESCRIPTION_RO
|
||||
#undef FILE_DESCRIPTION_RW
|
||||
|
||||
static int acpi_battery_add_fs(struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
int i;
|
||||
|
||||
printk(KERN_WARNING PREFIX "Deprecated procfs I/F for battery is loaded,"
|
||||
" please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
|
||||
if (!acpi_device_dir(device)) {
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
|
||||
acpi_battery_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
for (i = 0; i < ACPI_BATTERY_NUMFILES; ++i) {
|
||||
entry = proc_create_data(acpi_battery_file[i].name,
|
||||
acpi_battery_file[i].mode,
|
||||
acpi_device_dir(device),
|
||||
&acpi_battery_file[i].ops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_battery_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
int i;
|
||||
if (!acpi_device_dir(device))
|
||||
return;
|
||||
for (i = 0; i < ACPI_BATTERY_NUMFILES; ++i)
|
||||
remove_proc_entry(acpi_battery_file[i].name,
|
||||
acpi_device_dir(device));
|
||||
|
||||
remove_proc_entry(acpi_device_bid(device), acpi_battery_dir);
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -1075,15 +775,6 @@ static int acpi_battery_add(struct acpi_device *device)
|
||||
result = acpi_battery_update(battery);
|
||||
if (result)
|
||||
goto fail;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
result = acpi_battery_add_fs(device);
|
||||
#endif
|
||||
if (result) {
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_remove_fs(device);
|
||||
#endif
|
||||
goto fail;
|
||||
}
|
||||
|
||||
printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n",
|
||||
ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
|
||||
@ -1110,9 +801,6 @@ static int acpi_battery_remove(struct acpi_device *device)
|
||||
return -EINVAL;
|
||||
battery = acpi_driver_data(device);
|
||||
unregister_pm_notifier(&battery->pm_nb);
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_remove_fs(device);
|
||||
#endif
|
||||
sysfs_remove_battery(battery);
|
||||
mutex_destroy(&battery->lock);
|
||||
mutex_destroy(&battery->sysfs_lock);
|
||||
@ -1158,18 +846,7 @@ static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_dir = acpi_lock_battery_dir();
|
||||
if (!acpi_battery_dir)
|
||||
return;
|
||||
#endif
|
||||
if (acpi_bus_register_driver(&acpi_battery_driver) < 0) {
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_unlock_battery_dir(acpi_battery_dir);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
return;
|
||||
acpi_bus_register_driver(&acpi_battery_driver);
|
||||
}
|
||||
|
||||
static int __init acpi_battery_init(void)
|
||||
@ -1181,9 +858,6 @@ static int __init acpi_battery_init(void)
|
||||
static void __exit acpi_battery_exit(void)
|
||||
{
|
||||
acpi_bus_unregister_driver(&acpi_battery_driver);
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_unlock_battery_dir(acpi_battery_dir);
|
||||
#endif
|
||||
}
|
||||
|
||||
module_init(acpi_battery_init);
|
||||
|
@ -1,105 +0,0 @@
|
||||
/*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
*/
|
||||
|
||||
#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);
|
@ -441,7 +441,7 @@ static void handle_dock(struct dock_station *ds, int dock)
|
||||
acpi_status status;
|
||||
struct acpi_object_list arg_list;
|
||||
union acpi_object arg;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
unsigned long long value;
|
||||
|
||||
acpi_handle_info(ds->handle, "%s\n", dock ? "docking" : "undocking");
|
||||
|
||||
@ -450,12 +450,10 @@ static void handle_dock(struct dock_station *ds, int dock)
|
||||
arg_list.pointer = &arg;
|
||||
arg.type = ACPI_TYPE_INTEGER;
|
||||
arg.integer.value = dock;
|
||||
status = acpi_evaluate_object(ds->handle, "_DCK", &arg_list, &buffer);
|
||||
status = acpi_evaluate_integer(ds->handle, "_DCK", &arg_list, &value);
|
||||
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND)
|
||||
acpi_handle_err(ds->handle, "Failed to execute _DCK (0x%x)\n",
|
||||
status);
|
||||
|
||||
kfree(buffer.pointer);
|
||||
}
|
||||
|
||||
static inline void dock(struct dock_station *ds)
|
||||
|
@ -168,7 +168,7 @@ static int acpi_fan_add(struct acpi_device *device)
|
||||
acpi_device_name(device), acpi_device_bid(device),
|
||||
!device->power.state ? "on" : "off");
|
||||
|
||||
end:
|
||||
end:
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ int acpi_map_pxm_to_node(int pxm)
|
||||
{
|
||||
int node = pxm_to_node_map[pxm];
|
||||
|
||||
if (node < 0) {
|
||||
if (node == NUMA_NO_NODE) {
|
||||
if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
|
||||
return NUMA_NO_NODE;
|
||||
node = first_unset_node(nodes_found_map);
|
||||
@ -334,7 +334,7 @@ int acpi_get_pxm(acpi_handle h)
|
||||
|
||||
int acpi_get_node(acpi_handle *handle)
|
||||
{
|
||||
int pxm, node = -1;
|
||||
int pxm, node = NUMA_NO_NODE;
|
||||
|
||||
pxm = acpi_get_pxm(handle);
|
||||
if (pxm >= 0 && pxm < MAX_PXM_DOMAINS)
|
||||
|
@ -8,289 +8,17 @@
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#include <linux/mc146818rtc.h>
|
||||
#endif
|
||||
|
||||
#include "sleep.h"
|
||||
|
||||
#define _COMPONENT ACPI_SYSTEM_COMPONENT
|
||||
|
||||
/*
|
||||
* this file provides support for:
|
||||
* /proc/acpi/alarm
|
||||
* /proc/acpi/wakeup
|
||||
*/
|
||||
|
||||
ACPI_MODULE_NAME("sleep")
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_CMOS) || defined(CONFIG_RTC_DRV_CMOS_MODULE) || !defined(CONFIG_X86)
|
||||
/* use /sys/class/rtc/rtcX/wakealarm instead; it's not ACPI-specific */
|
||||
#else
|
||||
#define HAVE_ACPI_LEGACY_ALARM
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ACPI_LEGACY_ALARM
|
||||
|
||||
static u32 cmos_bcd_read(int offset, int rtc_control);
|
||||
|
||||
static int acpi_system_alarm_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
u32 sec, min, hr;
|
||||
u32 day, mo, yr, cent = 0;
|
||||
u32 today = 0;
|
||||
unsigned char rtc_control = 0;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rtc_lock, flags);
|
||||
|
||||
rtc_control = CMOS_READ(RTC_CONTROL);
|
||||
sec = cmos_bcd_read(RTC_SECONDS_ALARM, rtc_control);
|
||||
min = cmos_bcd_read(RTC_MINUTES_ALARM, rtc_control);
|
||||
hr = cmos_bcd_read(RTC_HOURS_ALARM, rtc_control);
|
||||
|
||||
/* If we ever get an FACP with proper values... */
|
||||
if (acpi_gbl_FADT.day_alarm) {
|
||||
/* ACPI spec: only low 6 its should be cared */
|
||||
day = CMOS_READ(acpi_gbl_FADT.day_alarm) & 0x3F;
|
||||
if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
|
||||
day = bcd2bin(day);
|
||||
} else
|
||||
day = cmos_bcd_read(RTC_DAY_OF_MONTH, rtc_control);
|
||||
if (acpi_gbl_FADT.month_alarm)
|
||||
mo = cmos_bcd_read(acpi_gbl_FADT.month_alarm, rtc_control);
|
||||
else {
|
||||
mo = cmos_bcd_read(RTC_MONTH, rtc_control);
|
||||
today = cmos_bcd_read(RTC_DAY_OF_MONTH, rtc_control);
|
||||
}
|
||||
if (acpi_gbl_FADT.century)
|
||||
cent = cmos_bcd_read(acpi_gbl_FADT.century, rtc_control);
|
||||
|
||||
yr = cmos_bcd_read(RTC_YEAR, rtc_control);
|
||||
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
|
||||
/* we're trusting the FADT (see above) */
|
||||
if (!acpi_gbl_FADT.century)
|
||||
/* If we're not trusting the FADT, we should at least make it
|
||||
* right for _this_ century... ehm, what is _this_ century?
|
||||
*
|
||||
* TBD:
|
||||
* ASAP: find piece of code in the kernel, e.g. star tracker driver,
|
||||
* which we can trust to determine the century correctly. Atom
|
||||
* watch driver would be nice, too...
|
||||
*
|
||||
* if that has not happened, change for first release in 2050:
|
||||
* if (yr<50)
|
||||
* yr += 2100;
|
||||
* else
|
||||
* yr += 2000; // current line of code
|
||||
*
|
||||
* if that has not happened either, please do on 2099/12/31:23:59:59
|
||||
* s/2000/2100
|
||||
*
|
||||
*/
|
||||
yr += 2000;
|
||||
else
|
||||
yr += cent * 100;
|
||||
|
||||
/*
|
||||
* Show correct dates for alarms up to a month into the future.
|
||||
* This solves issues for nearly all situations with the common
|
||||
* 30-day alarm clocks in PC hardware.
|
||||
*/
|
||||
if (day < today) {
|
||||
if (mo < 12) {
|
||||
mo += 1;
|
||||
} else {
|
||||
mo = 1;
|
||||
yr += 1;
|
||||
}
|
||||
}
|
||||
|
||||
seq_printf(seq, "%4.4u-", yr);
|
||||
(mo > 12) ? seq_puts(seq, "**-") : seq_printf(seq, "%2.2u-", mo);
|
||||
(day > 31) ? seq_puts(seq, "** ") : seq_printf(seq, "%2.2u ", day);
|
||||
(hr > 23) ? seq_puts(seq, "**:") : seq_printf(seq, "%2.2u:", hr);
|
||||
(min > 59) ? seq_puts(seq, "**:") : seq_printf(seq, "%2.2u:", min);
|
||||
(sec > 59) ? seq_puts(seq, "**\n") : seq_printf(seq, "%2.2u\n", sec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_system_alarm_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_system_alarm_seq_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static int get_date_field(char **p, u32 * value)
|
||||
{
|
||||
char *next = NULL;
|
||||
char *string_end = NULL;
|
||||
int result = -EINVAL;
|
||||
|
||||
/*
|
||||
* Try to find delimeter, only to insert null. The end of the
|
||||
* string won't have one, but is still valid.
|
||||
*/
|
||||
if (*p == NULL)
|
||||
return result;
|
||||
|
||||
next = strpbrk(*p, "- :");
|
||||
if (next)
|
||||
*next++ = '\0';
|
||||
|
||||
*value = simple_strtoul(*p, &string_end, 10);
|
||||
|
||||
/* Signal success if we got a good digit */
|
||||
if (string_end != *p)
|
||||
result = 0;
|
||||
|
||||
if (next)
|
||||
*p = next;
|
||||
else
|
||||
*p = NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Read a possibly BCD register, always return binary */
|
||||
static u32 cmos_bcd_read(int offset, int rtc_control)
|
||||
{
|
||||
u32 val = CMOS_READ(offset);
|
||||
if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
|
||||
val = bcd2bin(val);
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Write binary value into possibly BCD register */
|
||||
static void cmos_bcd_write(u32 val, int offset, int rtc_control)
|
||||
{
|
||||
if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
|
||||
val = bin2bcd(val);
|
||||
CMOS_WRITE(val, offset);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_system_write_alarm(struct file *file,
|
||||
const char __user * buffer, size_t count, loff_t * ppos)
|
||||
{
|
||||
int result = 0;
|
||||
char alarm_string[30] = { '\0' };
|
||||
char *p = alarm_string;
|
||||
u32 sec, min, hr, day, mo, yr;
|
||||
int adjust = 0;
|
||||
unsigned char rtc_control = 0;
|
||||
|
||||
if (count > sizeof(alarm_string) - 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(alarm_string, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
alarm_string[count] = '\0';
|
||||
|
||||
/* check for time adjustment */
|
||||
if (alarm_string[0] == '+') {
|
||||
p++;
|
||||
adjust = 1;
|
||||
}
|
||||
|
||||
if ((result = get_date_field(&p, &yr)))
|
||||
goto end;
|
||||
if ((result = get_date_field(&p, &mo)))
|
||||
goto end;
|
||||
if ((result = get_date_field(&p, &day)))
|
||||
goto end;
|
||||
if ((result = get_date_field(&p, &hr)))
|
||||
goto end;
|
||||
if ((result = get_date_field(&p, &min)))
|
||||
goto end;
|
||||
if ((result = get_date_field(&p, &sec)))
|
||||
goto end;
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
|
||||
rtc_control = CMOS_READ(RTC_CONTROL);
|
||||
|
||||
if (adjust) {
|
||||
yr += cmos_bcd_read(RTC_YEAR, rtc_control);
|
||||
mo += cmos_bcd_read(RTC_MONTH, rtc_control);
|
||||
day += cmos_bcd_read(RTC_DAY_OF_MONTH, rtc_control);
|
||||
hr += cmos_bcd_read(RTC_HOURS, rtc_control);
|
||||
min += cmos_bcd_read(RTC_MINUTES, rtc_control);
|
||||
sec += cmos_bcd_read(RTC_SECONDS, rtc_control);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
|
||||
if (sec > 59) {
|
||||
min += sec/60;
|
||||
sec = sec%60;
|
||||
}
|
||||
if (min > 59) {
|
||||
hr += min/60;
|
||||
min = min%60;
|
||||
}
|
||||
if (hr > 23) {
|
||||
day += hr/24;
|
||||
hr = hr%24;
|
||||
}
|
||||
if (day > 31) {
|
||||
mo += day/32;
|
||||
day = day%32;
|
||||
}
|
||||
if (mo > 12) {
|
||||
yr += mo/13;
|
||||
mo = mo%13;
|
||||
}
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
/*
|
||||
* Disable alarm interrupt before setting alarm timer or else
|
||||
* when ACPI_EVENT_RTC is enabled, a spurious ACPI interrupt occurs
|
||||
*/
|
||||
rtc_control &= ~RTC_AIE;
|
||||
CMOS_WRITE(rtc_control, RTC_CONTROL);
|
||||
CMOS_READ(RTC_INTR_FLAGS);
|
||||
|
||||
/* write the fields the rtc knows about */
|
||||
cmos_bcd_write(hr, RTC_HOURS_ALARM, rtc_control);
|
||||
cmos_bcd_write(min, RTC_MINUTES_ALARM, rtc_control);
|
||||
cmos_bcd_write(sec, RTC_SECONDS_ALARM, rtc_control);
|
||||
|
||||
/*
|
||||
* If the system supports an enhanced alarm it will have non-zero
|
||||
* offsets into the CMOS RAM here -- which for some reason are pointing
|
||||
* to the RTC area of memory.
|
||||
*/
|
||||
if (acpi_gbl_FADT.day_alarm)
|
||||
cmos_bcd_write(day, acpi_gbl_FADT.day_alarm, rtc_control);
|
||||
if (acpi_gbl_FADT.month_alarm)
|
||||
cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm, rtc_control);
|
||||
if (acpi_gbl_FADT.century) {
|
||||
if (adjust)
|
||||
yr += cmos_bcd_read(acpi_gbl_FADT.century, rtc_control) * 100;
|
||||
cmos_bcd_write(yr / 100, acpi_gbl_FADT.century, rtc_control);
|
||||
}
|
||||
/* enable the rtc alarm interrupt */
|
||||
rtc_control |= RTC_AIE;
|
||||
CMOS_WRITE(rtc_control, RTC_CONTROL);
|
||||
CMOS_READ(RTC_INTR_FLAGS);
|
||||
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
|
||||
acpi_clear_event(ACPI_EVENT_RTC);
|
||||
acpi_enable_event(ACPI_EVENT_RTC, 0);
|
||||
|
||||
*ppos += count;
|
||||
|
||||
result = 0;
|
||||
end:
|
||||
return result ? result : count;
|
||||
}
|
||||
#endif /* HAVE_ACPI_LEGACY_ALARM */
|
||||
|
||||
static int
|
||||
acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
@ -417,41 +145,8 @@ static const struct file_operations acpi_system_wakeup_device_fops = {
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
#ifdef HAVE_ACPI_LEGACY_ALARM
|
||||
static const struct file_operations acpi_system_alarm_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_system_alarm_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_system_write_alarm,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static u32 rtc_handler(void *context)
|
||||
{
|
||||
acpi_clear_event(ACPI_EVENT_RTC);
|
||||
acpi_disable_event(ACPI_EVENT_RTC, 0);
|
||||
|
||||
return ACPI_INTERRUPT_HANDLED;
|
||||
}
|
||||
#endif /* HAVE_ACPI_LEGACY_ALARM */
|
||||
|
||||
int __init acpi_sleep_proc_init(void)
|
||||
{
|
||||
#ifdef HAVE_ACPI_LEGACY_ALARM
|
||||
/* 'alarm' [R/W] */
|
||||
proc_create("alarm", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
acpi_root_dir, &acpi_system_alarm_fops);
|
||||
|
||||
acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, NULL);
|
||||
/*
|
||||
* Disable the RTC event after installing RTC handler.
|
||||
* Only when RTC alarm is set will it be enabled.
|
||||
*/
|
||||
acpi_clear_event(ACPI_EVENT_RTC);
|
||||
acpi_disable_event(ACPI_EVENT_RTC, 0);
|
||||
#endif /* HAVE_ACPI_LEGACY_ALARM */
|
||||
|
||||
/* 'wakeup device' [R/W] */
|
||||
proc_create("wakeup", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
acpi_root_dir, &acpi_system_wakeup_device_fops);
|
||||
|
@ -272,9 +272,6 @@ static void tsc_check_state(int state) { return; }
|
||||
static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
|
||||
{
|
||||
|
||||
if (!pr)
|
||||
return -EINVAL;
|
||||
|
||||
if (!pr->pblk)
|
||||
return -ENODEV;
|
||||
|
||||
@ -1076,12 +1073,8 @@ int acpi_processor_hotplug(struct acpi_processor *pr)
|
||||
if (disabled_by_idle_boot_param())
|
||||
return 0;
|
||||
|
||||
if (!pr)
|
||||
return -EINVAL;
|
||||
|
||||
if (nocst) {
|
||||
if (nocst)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!pr->flags.power_setup_done)
|
||||
return -ENODEV;
|
||||
@ -1108,9 +1101,6 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr)
|
||||
if (disabled_by_idle_boot_param())
|
||||
return 0;
|
||||
|
||||
if (!pr)
|
||||
return -EINVAL;
|
||||
|
||||
if (nocst)
|
||||
return -ENODEV;
|
||||
|
||||
@ -1183,9 +1173,6 @@ int acpi_processor_power_init(struct acpi_processor *pr)
|
||||
first_run++;
|
||||
}
|
||||
|
||||
if (!pr)
|
||||
return -EINVAL;
|
||||
|
||||
if (acpi_gbl_FADT.cst_control && !nocst) {
|
||||
status =
|
||||
acpi_os_write_port(acpi_gbl_FADT.smi_command, acpi_gbl_FADT.cst_control, 8);
|
||||
|
@ -30,12 +30,6 @@
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/uaccess.h>
|
||||
#endif
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/jiffies.h>
|
||||
@ -67,11 +61,6 @@ static unsigned int cache_time = 1000;
|
||||
module_param(cache_time, uint, 0644);
|
||||
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
|
||||
|
||||
extern struct proc_dir_entry *acpi_lock_ac_dir(void);
|
||||
extern struct proc_dir_entry *acpi_lock_battery_dir(void);
|
||||
extern void acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir);
|
||||
extern void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir);
|
||||
|
||||
#define MAX_SBS_BAT 4
|
||||
#define ACPI_SBS_BLOCK_MAX 32
|
||||
|
||||
@ -84,9 +73,6 @@ MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
|
||||
struct acpi_battery {
|
||||
struct power_supply bat;
|
||||
struct acpi_sbs *sbs;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
struct proc_dir_entry *proc_entry;
|
||||
#endif
|
||||
unsigned long update_time;
|
||||
char name[8];
|
||||
char manufacturer_name[ACPI_SBS_BLOCK_MAX];
|
||||
@ -119,9 +105,6 @@ struct acpi_sbs {
|
||||
struct acpi_device *device;
|
||||
struct acpi_smb_hc *hc;
|
||||
struct mutex lock;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
struct proc_dir_entry *charger_entry;
|
||||
#endif
|
||||
struct acpi_battery battery[MAX_SBS_BAT];
|
||||
u8 batteries_supported:4;
|
||||
u8 manager_present:1;
|
||||
@ -481,261 +464,6 @@ static struct device_attribute alarm_attr = {
|
||||
.store = acpi_battery_alarm_store,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc/acpi)
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
/* Generic Routines */
|
||||
static int
|
||||
acpi_sbs_add_fs(struct proc_dir_entry **dir,
|
||||
struct proc_dir_entry *parent_dir,
|
||||
char *dir_name,
|
||||
const struct file_operations *info_fops,
|
||||
const struct file_operations *state_fops,
|
||||
const struct file_operations *alarm_fops, void *data)
|
||||
{
|
||||
printk(KERN_WARNING PREFIX "Deprecated procfs I/F for SBS is loaded,"
|
||||
" please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
|
||||
if (!*dir) {
|
||||
*dir = proc_mkdir(dir_name, parent_dir);
|
||||
if (!*dir) {
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
/* 'info' [R] */
|
||||
if (info_fops)
|
||||
proc_create_data(ACPI_SBS_FILE_INFO, S_IRUGO, *dir,
|
||||
info_fops, data);
|
||||
|
||||
/* 'state' [R] */
|
||||
if (state_fops)
|
||||
proc_create_data(ACPI_SBS_FILE_STATE, S_IRUGO, *dir,
|
||||
state_fops, data);
|
||||
|
||||
/* 'alarm' [R/W] */
|
||||
if (alarm_fops)
|
||||
proc_create_data(ACPI_SBS_FILE_ALARM, S_IRUGO, *dir,
|
||||
alarm_fops, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Smart Battery Interface */
|
||||
static struct proc_dir_entry *acpi_battery_dir = NULL;
|
||||
|
||||
static inline char *acpi_battery_units(struct acpi_battery *battery)
|
||||
{
|
||||
return acpi_battery_mode(battery) ? " mW" : " mA";
|
||||
}
|
||||
|
||||
|
||||
static int acpi_battery_read_info(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
struct acpi_sbs *sbs = battery->sbs;
|
||||
int result = 0;
|
||||
|
||||
mutex_lock(&sbs->lock);
|
||||
|
||||
seq_printf(seq, "present: %s\n",
|
||||
(battery->present) ? "yes" : "no");
|
||||
if (!battery->present)
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "design capacity: %i%sh\n",
|
||||
battery->design_capacity * acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "last full capacity: %i%sh\n",
|
||||
battery->full_charge_capacity * acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "battery technology: rechargeable\n");
|
||||
seq_printf(seq, "design voltage: %i mV\n",
|
||||
battery->design_voltage * acpi_battery_vscale(battery));
|
||||
seq_printf(seq, "design capacity warning: unknown\n");
|
||||
seq_printf(seq, "design capacity low: unknown\n");
|
||||
seq_printf(seq, "cycle count: %i\n", battery->cycle_count);
|
||||
seq_printf(seq, "capacity granularity 1: unknown\n");
|
||||
seq_printf(seq, "capacity granularity 2: unknown\n");
|
||||
seq_printf(seq, "model number: %s\n", battery->device_name);
|
||||
seq_printf(seq, "serial number: %i\n",
|
||||
battery->serial_number);
|
||||
seq_printf(seq, "battery type: %s\n",
|
||||
battery->device_chemistry);
|
||||
seq_printf(seq, "OEM info: %s\n",
|
||||
battery->manufacturer_name);
|
||||
end:
|
||||
mutex_unlock(&sbs->lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int acpi_battery_info_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_battery_read_info, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static int acpi_battery_read_state(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
struct acpi_sbs *sbs = battery->sbs;
|
||||
int rate;
|
||||
|
||||
mutex_lock(&sbs->lock);
|
||||
seq_printf(seq, "present: %s\n",
|
||||
(battery->present) ? "yes" : "no");
|
||||
if (!battery->present)
|
||||
goto end;
|
||||
|
||||
acpi_battery_get_state(battery);
|
||||
seq_printf(seq, "capacity state: %s\n",
|
||||
(battery->state & 0x0010) ? "critical" : "ok");
|
||||
seq_printf(seq, "charging state: %s\n",
|
||||
(battery->rate_now < 0) ? "discharging" :
|
||||
((battery->rate_now > 0) ? "charging" : "charged"));
|
||||
rate = abs(battery->rate_now) * acpi_battery_ipscale(battery);
|
||||
rate *= (acpi_battery_mode(battery))?(battery->voltage_now *
|
||||
acpi_battery_vscale(battery)/1000):1;
|
||||
seq_printf(seq, "present rate: %d%s\n", rate,
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "remaining capacity: %i%sh\n",
|
||||
battery->capacity_now * acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
seq_printf(seq, "present voltage: %i mV\n",
|
||||
battery->voltage_now * acpi_battery_vscale(battery));
|
||||
|
||||
end:
|
||||
mutex_unlock(&sbs->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_battery_state_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_battery_read_state, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static int acpi_battery_read_alarm(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_battery *battery = seq->private;
|
||||
struct acpi_sbs *sbs = battery->sbs;
|
||||
int result = 0;
|
||||
|
||||
mutex_lock(&sbs->lock);
|
||||
|
||||
if (!battery->present) {
|
||||
seq_printf(seq, "present: no\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
acpi_battery_get_alarm(battery);
|
||||
seq_printf(seq, "alarm: ");
|
||||
if (battery->alarm_capacity)
|
||||
seq_printf(seq, "%i%sh\n",
|
||||
battery->alarm_capacity *
|
||||
acpi_battery_scale(battery),
|
||||
acpi_battery_units(battery));
|
||||
else
|
||||
seq_printf(seq, "disabled\n");
|
||||
end:
|
||||
mutex_unlock(&sbs->lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_battery_write_alarm(struct file *file, const char __user * buffer,
|
||||
size_t count, loff_t * ppos)
|
||||
{
|
||||
struct seq_file *seq = file->private_data;
|
||||
struct acpi_battery *battery = seq->private;
|
||||
struct acpi_sbs *sbs = battery->sbs;
|
||||
char alarm_string[12] = { '\0' };
|
||||
int result = 0;
|
||||
mutex_lock(&sbs->lock);
|
||||
if (!battery->present) {
|
||||
result = -ENODEV;
|
||||
goto end;
|
||||
}
|
||||
if (count > sizeof(alarm_string) - 1) {
|
||||
result = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
if (copy_from_user(alarm_string, buffer, count)) {
|
||||
result = -EFAULT;
|
||||
goto end;
|
||||
}
|
||||
alarm_string[count] = 0;
|
||||
battery->alarm_capacity = simple_strtoul(alarm_string, NULL, 0) /
|
||||
acpi_battery_scale(battery);
|
||||
acpi_battery_set_alarm(battery);
|
||||
end:
|
||||
mutex_unlock(&sbs->lock);
|
||||
if (result)
|
||||
return result;
|
||||
return count;
|
||||
}
|
||||
|
||||
static int acpi_battery_alarm_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_battery_read_alarm, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static const struct file_operations acpi_battery_info_fops = {
|
||||
.open = acpi_battery_info_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static const struct file_operations acpi_battery_state_fops = {
|
||||
.open = acpi_battery_state_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static const struct file_operations acpi_battery_alarm_fops = {
|
||||
.open = acpi_battery_alarm_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_battery_write_alarm,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
/* Legacy AC Adapter Interface */
|
||||
|
||||
static struct proc_dir_entry *acpi_ac_dir = NULL;
|
||||
|
||||
static int acpi_ac_read_state(struct seq_file *seq, void *offset)
|
||||
{
|
||||
|
||||
struct acpi_sbs *sbs = seq->private;
|
||||
|
||||
mutex_lock(&sbs->lock);
|
||||
|
||||
seq_printf(seq, "state: %s\n",
|
||||
sbs->charger_present ? "on-line" : "off-line");
|
||||
|
||||
mutex_unlock(&sbs->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_ac_state_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_ac_read_state, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
static const struct file_operations acpi_ac_state_fops = {
|
||||
.open = acpi_ac_state_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -781,12 +509,6 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||
return result;
|
||||
|
||||
sprintf(battery->name, ACPI_BATTERY_DIR_NAME, id);
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_sbs_add_fs(&battery->proc_entry, acpi_battery_dir,
|
||||
battery->name, &acpi_battery_info_fops,
|
||||
&acpi_battery_state_fops, &acpi_battery_alarm_fops,
|
||||
battery);
|
||||
#endif
|
||||
battery->bat.name = battery->name;
|
||||
battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
|
||||
if (!acpi_battery_mode(battery)) {
|
||||
@ -822,10 +544,6 @@ static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
|
||||
device_remove_file(battery->bat.dev, &alarm_attr);
|
||||
power_supply_unregister(&battery->bat);
|
||||
}
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
proc_remove(battery->proc_entry);
|
||||
battery->proc_entry = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int acpi_charger_add(struct acpi_sbs *sbs)
|
||||
@ -835,13 +553,7 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
|
||||
result = acpi_ac_get_present(sbs);
|
||||
if (result)
|
||||
goto end;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
result = acpi_sbs_add_fs(&sbs->charger_entry, acpi_ac_dir,
|
||||
ACPI_AC_DIR_NAME, NULL,
|
||||
&acpi_ac_state_fops, NULL, sbs);
|
||||
if (result)
|
||||
goto end;
|
||||
#endif
|
||||
|
||||
sbs->charger.name = "sbs-charger";
|
||||
sbs->charger.type = POWER_SUPPLY_TYPE_MAINS;
|
||||
sbs->charger.properties = sbs_ac_props;
|
||||
@ -859,10 +571,6 @@ static void acpi_charger_remove(struct acpi_sbs *sbs)
|
||||
{
|
||||
if (sbs->charger.dev)
|
||||
power_supply_unregister(&sbs->charger);
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
proc_remove(sbs->charger_entry);
|
||||
sbs->charger_entry = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void acpi_sbs_callback(void *context)
|
||||
@ -950,20 +658,6 @@ static int acpi_sbs_remove(struct acpi_device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_sbs_rmdirs(void)
|
||||
{
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
if (acpi_ac_dir) {
|
||||
acpi_unlock_ac_dir(acpi_ac_dir);
|
||||
acpi_ac_dir = NULL;
|
||||
}
|
||||
if (acpi_battery_dir) {
|
||||
acpi_unlock_battery_dir(acpi_battery_dir);
|
||||
acpi_battery_dir = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int acpi_sbs_resume(struct device *dev)
|
||||
{
|
||||
@ -995,28 +689,17 @@ static int __init acpi_sbs_init(void)
|
||||
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_ac_dir = acpi_lock_ac_dir();
|
||||
if (!acpi_ac_dir)
|
||||
return -ENODEV;
|
||||
acpi_battery_dir = acpi_lock_battery_dir();
|
||||
if (!acpi_battery_dir) {
|
||||
acpi_sbs_rmdirs();
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_sbs_driver);
|
||||
if (result < 0) {
|
||||
acpi_sbs_rmdirs();
|
||||
if (result < 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit acpi_sbs_exit(void)
|
||||
{
|
||||
acpi_bus_unregister_driver(&acpi_sbs_driver);
|
||||
acpi_sbs_rmdirs();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -396,15 +396,14 @@ static int __init pcc_cpufreq_probe(void)
|
||||
struct pcc_memory_resource *mem_resource;
|
||||
struct pcc_register_resource *reg_resource;
|
||||
union acpi_object *out_obj, *member;
|
||||
acpi_handle handle, osc_handle, pcch_handle;
|
||||
acpi_handle handle, osc_handle;
|
||||
int ret = 0;
|
||||
|
||||
status = acpi_get_handle(NULL, "\\_SB", &handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
||||
status = acpi_get_handle(handle, "PCCH", &pcch_handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (!acpi_has_method(handle, "PCCH"))
|
||||
return -ENODEV;
|
||||
|
||||
status = acpi_get_handle(handle, "_OSC", &osc_handle);
|
||||
|
@ -73,15 +73,8 @@ static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
|
||||
static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data)
|
||||
{
|
||||
struct acpi_gpio_evt_pin *evt_pin = data;
|
||||
struct acpi_object_list args;
|
||||
union acpi_object arg;
|
||||
|
||||
arg.type = ACPI_TYPE_INTEGER;
|
||||
arg.integer.value = evt_pin->pin;
|
||||
args.count = 1;
|
||||
args.pointer = &arg;
|
||||
|
||||
acpi_evaluate_object(evt_pin->evt_handle, NULL, &args, NULL);
|
||||
acpi_execute_simple_method(evt_pin->evt_handle, NULL, evt_pin->pin);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -193,16 +193,14 @@ out:
|
||||
|
||||
static bool intel_dsm_pci_probe(struct pci_dev *pdev)
|
||||
{
|
||||
acpi_handle dhandle, intel_handle;
|
||||
acpi_status status;
|
||||
acpi_handle dhandle;
|
||||
int ret;
|
||||
|
||||
dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
if (!dhandle)
|
||||
return false;
|
||||
|
||||
status = acpi_get_handle(dhandle, "_DSM", &intel_handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (!acpi_has_method(dhandle, "_DSM")) {
|
||||
DRM_DEBUG_KMS("no _DSM method for intel device\n");
|
||||
return false;
|
||||
}
|
||||
|
@ -253,18 +253,15 @@ static struct vga_switcheroo_handler nouveau_dsm_handler = {
|
||||
|
||||
static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
|
||||
{
|
||||
acpi_handle dhandle, nvidia_handle;
|
||||
acpi_status status;
|
||||
acpi_handle dhandle;
|
||||
int retval = 0;
|
||||
|
||||
dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
|
||||
if (!dhandle)
|
||||
return false;
|
||||
|
||||
status = acpi_get_handle(dhandle, "_DSM", &nvidia_handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (!acpi_has_method(dhandle, "_DSM"))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (nouveau_test_dsm(dhandle, nouveau_dsm, NOUVEAU_DSM_POWER))
|
||||
retval |= NOUVEAU_DSM_HAS_MUX;
|
||||
|
@ -854,10 +854,10 @@ static int i2c_hid_acpi_pdata(struct i2c_client *client,
|
||||
0xF7, 0xF6, 0xDF, 0x3C, 0x67, 0x42, 0x55, 0x45,
|
||||
0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE,
|
||||
};
|
||||
struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object params[4], *obj;
|
||||
union acpi_object params[4];
|
||||
struct acpi_object_list input;
|
||||
struct acpi_device *adev;
|
||||
unsigned long long value;
|
||||
acpi_handle handle;
|
||||
|
||||
handle = ACPI_HANDLE(&client->dev);
|
||||
@ -878,22 +878,14 @@ static int i2c_hid_acpi_pdata(struct i2c_client *client,
|
||||
params[3].package.count = 0;
|
||||
params[3].package.elements = NULL;
|
||||
|
||||
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DSM", &input, &buf))) {
|
||||
if (ACPI_FAILURE(acpi_evaluate_integer(handle, "_DSM", &input,
|
||||
&value))) {
|
||||
dev_err(&client->dev, "device _DSM execution failed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
obj = (union acpi_object *)buf.pointer;
|
||||
if (obj->type != ACPI_TYPE_INTEGER) {
|
||||
dev_err(&client->dev, "device _DSM returned invalid type: %d\n",
|
||||
obj->type);
|
||||
kfree(buf.pointer);
|
||||
return -EINVAL;
|
||||
}
|
||||
pdata->hid_descriptor_address = value;
|
||||
|
||||
pdata->hid_descriptor_address = obj->integer.value;
|
||||
|
||||
kfree(buf.pointer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -411,13 +411,10 @@ EXPORT_SYMBOL(acpi_get_hp_hw_control_from_firmware);
|
||||
static int pcihp_is_ejectable(acpi_handle handle)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_handle tmp;
|
||||
unsigned long long removable;
|
||||
status = acpi_get_handle(handle, "_ADR", &tmp);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (!acpi_has_method(handle, "_ADR"))
|
||||
return 0;
|
||||
status = acpi_get_handle(handle, "_EJ0", &tmp);
|
||||
if (ACPI_SUCCESS(status))
|
||||
if (acpi_has_method(handle, "_EJ0"))
|
||||
return 1;
|
||||
status = acpi_evaluate_integer(handle, "_RMV", NULL, &removable);
|
||||
if (ACPI_SUCCESS(status) && removable)
|
||||
|
@ -181,7 +181,6 @@ static bool acpi_pci_power_manageable(struct pci_dev *dev)
|
||||
static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||
{
|
||||
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||
acpi_handle tmp;
|
||||
static const u8 state_conv[] = {
|
||||
[PCI_D0] = ACPI_STATE_D0,
|
||||
[PCI_D1] = ACPI_STATE_D1,
|
||||
@ -192,7 +191,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||
int error = -EINVAL;
|
||||
|
||||
/* If the ACPI device has _EJ0, ignore the device */
|
||||
if (!handle || ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp)))
|
||||
if (!handle || acpi_has_method(handle, "_EJ0"))
|
||||
return -ENODEV;
|
||||
|
||||
switch (state) {
|
||||
|
@ -190,16 +190,10 @@ struct eeepc_laptop {
|
||||
*/
|
||||
static int write_acpi_int(acpi_handle handle, const char *method, int val)
|
||||
{
|
||||
struct acpi_object_list params;
|
||||
union acpi_object in_obj;
|
||||
acpi_status status;
|
||||
|
||||
params.count = 1;
|
||||
params.pointer = &in_obj;
|
||||
in_obj.type = ACPI_TYPE_INTEGER;
|
||||
in_obj.integer.value = val;
|
||||
status = acpi_execute_simple_method(handle, (char *)method, val);
|
||||
|
||||
status = acpi_evaluate_object(handle, (char *)method, ¶ms, NULL);
|
||||
return (status == AE_OK ? 0 : -1);
|
||||
}
|
||||
|
||||
|
@ -219,8 +219,7 @@ static int call_fext_func(int cmd, int arg0, int arg1, int arg2)
|
||||
{ .type = ACPI_TYPE_INTEGER }
|
||||
};
|
||||
struct acpi_object_list arg_list = { 4, ¶ms[0] };
|
||||
struct acpi_buffer output;
|
||||
union acpi_object out_obj;
|
||||
unsigned long long value;
|
||||
acpi_handle handle = NULL;
|
||||
|
||||
status = acpi_get_handle(fujitsu_hotkey->acpi_handle, "FUNC", &handle);
|
||||
@ -235,10 +234,7 @@ static int call_fext_func(int cmd, int arg0, int arg1, int arg2)
|
||||
params[2].integer.value = arg1;
|
||||
params[3].integer.value = arg2;
|
||||
|
||||
output.length = sizeof(out_obj);
|
||||
output.pointer = &out_obj;
|
||||
|
||||
status = acpi_evaluate_object(handle, NULL, &arg_list, &output);
|
||||
status = acpi_evaluate_integer(handle, NULL, &arg_list, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
vdbg_printk(FUJLAPTOP_DBG_WARN,
|
||||
"FUNC 0x%x (args 0x%x, 0x%x, 0x%x) call failed\n",
|
||||
@ -246,18 +242,10 @@ static int call_fext_func(int cmd, int arg0, int arg1, int arg2)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (out_obj.type != ACPI_TYPE_INTEGER) {
|
||||
vdbg_printk(FUJLAPTOP_DBG_WARN,
|
||||
"FUNC 0x%x (args 0x%x, 0x%x, 0x%x) did not "
|
||||
"return an integer\n",
|
||||
cmd, arg0, arg1, arg2);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
vdbg_printk(FUJLAPTOP_DBG_TRACE,
|
||||
"FUNC 0x%x (args 0x%x, 0x%x, 0x%x) returned 0x%x\n",
|
||||
cmd, arg0, arg1, arg2, (int)out_obj.integer.value);
|
||||
return out_obj.integer.value;
|
||||
cmd, arg0, arg1, arg2, (int)value);
|
||||
return value;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
|
||||
@ -317,8 +305,6 @@ static enum led_brightness kblamps_get(struct led_classdev *cdev)
|
||||
static int set_lcd_level(int level)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
|
||||
struct acpi_object_list arg_list = { 1, &arg0 };
|
||||
acpi_handle handle = NULL;
|
||||
|
||||
vdbg_printk(FUJLAPTOP_DBG_TRACE, "set lcd level via SBLL [%d]\n",
|
||||
@ -333,9 +319,8 @@ static int set_lcd_level(int level)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
arg0.integer.value = level;
|
||||
|
||||
status = acpi_evaluate_object(handle, NULL, &arg_list, NULL);
|
||||
status = acpi_execute_simple_method(handle, NULL, level);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
||||
@ -345,8 +330,6 @@ static int set_lcd_level(int level)
|
||||
static int set_lcd_level_alt(int level)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
|
||||
struct acpi_object_list arg_list = { 1, &arg0 };
|
||||
acpi_handle handle = NULL;
|
||||
|
||||
vdbg_printk(FUJLAPTOP_DBG_TRACE, "set lcd level via SBL2 [%d]\n",
|
||||
@ -361,9 +344,7 @@ static int set_lcd_level_alt(int level)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
arg0.integer.value = level;
|
||||
|
||||
status = acpi_evaluate_object(handle, NULL, &arg_list, NULL);
|
||||
status = acpi_execute_simple_method(handle, NULL, level);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
|
||||
@ -586,11 +567,10 @@ static struct platform_driver fujitsupf_driver = {
|
||||
|
||||
static void dmi_check_cb_common(const struct dmi_system_id *id)
|
||||
{
|
||||
acpi_handle handle;
|
||||
pr_info("Identified laptop model '%s'\n", id->ident);
|
||||
if (use_alt_lcd_levels == -1) {
|
||||
if (ACPI_SUCCESS(acpi_get_handle(NULL,
|
||||
"\\_SB.PCI0.LPCB.FJEX.SBL2", &handle)))
|
||||
if (acpi_has_method(NULL,
|
||||
"\\_SB.PCI0.LPCB.FJEX.SBL2"))
|
||||
use_alt_lcd_levels = 1;
|
||||
else
|
||||
use_alt_lcd_levels = 0;
|
||||
@ -653,7 +633,6 @@ static struct dmi_system_id fujitsu_dmi_table[] = {
|
||||
|
||||
static int acpi_fujitsu_add(struct acpi_device *device)
|
||||
{
|
||||
acpi_handle handle;
|
||||
int result = 0;
|
||||
int state = 0;
|
||||
struct input_dev *input;
|
||||
@ -702,8 +681,7 @@ static int acpi_fujitsu_add(struct acpi_device *device)
|
||||
|
||||
fujitsu->dev = device;
|
||||
|
||||
if (ACPI_SUCCESS
|
||||
(acpi_get_handle(device->handle, METHOD_NAME__INI, &handle))) {
|
||||
if (acpi_has_method(device->handle, METHOD_NAME__INI)) {
|
||||
vdbg_printk(FUJLAPTOP_DBG_INFO, "Invoking _INI\n");
|
||||
if (ACPI_FAILURE
|
||||
(acpi_evaluate_object
|
||||
@ -803,7 +781,6 @@ static void acpi_fujitsu_notify(struct acpi_device *device, u32 event)
|
||||
|
||||
static int acpi_fujitsu_hotkey_add(struct acpi_device *device)
|
||||
{
|
||||
acpi_handle handle;
|
||||
int result = 0;
|
||||
int state = 0;
|
||||
struct input_dev *input;
|
||||
@ -866,8 +843,7 @@ static int acpi_fujitsu_hotkey_add(struct acpi_device *device)
|
||||
|
||||
fujitsu_hotkey->dev = device;
|
||||
|
||||
if (ACPI_SUCCESS
|
||||
(acpi_get_handle(device->handle, METHOD_NAME__INI, &handle))) {
|
||||
if (acpi_has_method(device->handle, METHOD_NAME__INI)) {
|
||||
vdbg_printk(FUJLAPTOP_DBG_INFO, "Invoking _INI\n");
|
||||
if (ACPI_FAILURE
|
||||
(acpi_evaluate_object
|
||||
|
@ -29,24 +29,16 @@ static ssize_t irst_show_wakeup_events(struct device *dev,
|
||||
char *buf)
|
||||
{
|
||||
struct acpi_device *acpi;
|
||||
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *result;
|
||||
unsigned long long value;
|
||||
acpi_status status;
|
||||
|
||||
acpi = to_acpi_device(dev);
|
||||
|
||||
status = acpi_evaluate_object(acpi->handle, "GFFS", NULL, &output);
|
||||
status = acpi_evaluate_integer(acpi->handle, "GFFS", NULL, &value);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EINVAL;
|
||||
|
||||
result = output.pointer;
|
||||
|
||||
if (result->type != ACPI_TYPE_INTEGER) {
|
||||
kfree(result);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%lld\n", result->integer.value);
|
||||
return sprintf(buf, "%lld\n", value);
|
||||
}
|
||||
|
||||
static ssize_t irst_store_wakeup_events(struct device *dev,
|
||||
@ -54,8 +46,6 @@ static ssize_t irst_store_wakeup_events(struct device *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct acpi_device *acpi;
|
||||
struct acpi_object_list input;
|
||||
union acpi_object param;
|
||||
acpi_status status;
|
||||
unsigned long value;
|
||||
int error;
|
||||
@ -67,13 +57,7 @@ static ssize_t irst_store_wakeup_events(struct device *dev,
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
param.type = ACPI_TYPE_INTEGER;
|
||||
param.integer.value = value;
|
||||
|
||||
input.count = 1;
|
||||
input.pointer = ¶m;
|
||||
|
||||
status = acpi_evaluate_object(acpi->handle, "SFFS", &input, NULL);
|
||||
status = acpi_execute_simple_method(acpi->handle, "SFFS", value);
|
||||
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EINVAL;
|
||||
@ -91,24 +75,16 @@ static ssize_t irst_show_wakeup_time(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct acpi_device *acpi;
|
||||
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *result;
|
||||
unsigned long long value;
|
||||
acpi_status status;
|
||||
|
||||
acpi = to_acpi_device(dev);
|
||||
|
||||
status = acpi_evaluate_object(acpi->handle, "GFTV", NULL, &output);
|
||||
status = acpi_evaluate_integer(acpi->handle, "GFTV", NULL, &value);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EINVAL;
|
||||
|
||||
result = output.pointer;
|
||||
|
||||
if (result->type != ACPI_TYPE_INTEGER) {
|
||||
kfree(result);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%lld\n", result->integer.value);
|
||||
return sprintf(buf, "%lld\n", value);
|
||||
}
|
||||
|
||||
static ssize_t irst_store_wakeup_time(struct device *dev,
|
||||
@ -116,8 +92,6 @@ static ssize_t irst_store_wakeup_time(struct device *dev,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct acpi_device *acpi;
|
||||
struct acpi_object_list input;
|
||||
union acpi_object param;
|
||||
acpi_status status;
|
||||
unsigned long value;
|
||||
int error;
|
||||
@ -129,13 +103,7 @@ static ssize_t irst_store_wakeup_time(struct device *dev,
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
param.type = ACPI_TYPE_INTEGER;
|
||||
param.integer.value = value;
|
||||
|
||||
input.count = 1;
|
||||
input.pointer = ¶m;
|
||||
|
||||
status = acpi_evaluate_object(acpi->handle, "SFTV", &input, NULL);
|
||||
status = acpi_execute_simple_method(acpi->handle, "SFTV", value);
|
||||
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EINVAL;
|
||||
|
@ -25,37 +25,18 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
static int smartconnect_acpi_init(struct acpi_device *acpi)
|
||||
{
|
||||
struct acpi_object_list input;
|
||||
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *result;
|
||||
union acpi_object param;
|
||||
unsigned long long value;
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_evaluate_object(acpi->handle, "GAOS", NULL, &output);
|
||||
status = acpi_evaluate_integer(acpi->handle, "GAOS", NULL, &value);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EINVAL;
|
||||
|
||||
result = output.pointer;
|
||||
|
||||
if (result->type != ACPI_TYPE_INTEGER) {
|
||||
kfree(result);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (result->integer.value & 0x1) {
|
||||
param.type = ACPI_TYPE_INTEGER;
|
||||
param.integer.value = 0;
|
||||
|
||||
input.count = 1;
|
||||
input.pointer = ¶m;
|
||||
|
||||
if (value & 0x1) {
|
||||
dev_info(&acpi->dev, "Disabling Intel Smart Connect\n");
|
||||
status = acpi_evaluate_object(acpi->handle, "SAOS", &input,
|
||||
NULL);
|
||||
status = acpi_execute_simple_method(acpi->handle, "SAOS", 0);
|
||||
}
|
||||
|
||||
kfree(result);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -156,19 +156,15 @@ static struct thermal_cooling_device_ops memory_cooling_ops = {
|
||||
static int intel_menlow_memory_add(struct acpi_device *device)
|
||||
{
|
||||
int result = -ENODEV;
|
||||
acpi_status status = AE_OK;
|
||||
acpi_handle dummy;
|
||||
struct thermal_cooling_device *cdev;
|
||||
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
|
||||
status = acpi_get_handle(device->handle, MEMORY_GET_BANDWIDTH, &dummy);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (!acpi_has_method(device->handle, MEMORY_GET_BANDWIDTH))
|
||||
goto end;
|
||||
|
||||
status = acpi_get_handle(device->handle, MEMORY_SET_BANDWIDTH, &dummy);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (!acpi_has_method(device->handle, MEMORY_SET_BANDWIDTH))
|
||||
goto end;
|
||||
|
||||
cdev = thermal_cooling_device_register("Memory controller", device,
|
||||
|
@ -1508,7 +1508,6 @@ static void sony_nc_function_resume(void)
|
||||
static int sony_nc_resume(struct device *dev)
|
||||
{
|
||||
struct sony_nc_value *item;
|
||||
acpi_handle handle;
|
||||
|
||||
for (item = sony_nc_values; item->name; item++) {
|
||||
int ret;
|
||||
@ -1523,15 +1522,13 @@ static int sony_nc_resume(struct device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "ECON",
|
||||
&handle))) {
|
||||
if (acpi_has_method(sony_nc_acpi_handle, "ECON")) {
|
||||
int arg = 1;
|
||||
if (sony_nc_int_call(sony_nc_acpi_handle, "ECON", &arg, NULL))
|
||||
dprintk("ECON Method failed\n");
|
||||
}
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "SN00",
|
||||
&handle)))
|
||||
if (acpi_has_method(sony_nc_acpi_handle, "SN00"))
|
||||
sony_nc_function_resume();
|
||||
|
||||
return 0;
|
||||
@ -2682,7 +2679,6 @@ static void sony_nc_backlight_ng_read_limits(int handle,
|
||||
|
||||
static void sony_nc_backlight_setup(void)
|
||||
{
|
||||
acpi_handle unused;
|
||||
int max_brightness = 0;
|
||||
const struct backlight_ops *ops = NULL;
|
||||
struct backlight_properties props;
|
||||
@ -2717,8 +2713,7 @@ static void sony_nc_backlight_setup(void)
|
||||
sony_nc_backlight_ng_read_limits(0x14c, &sony_bl_props);
|
||||
max_brightness = sony_bl_props.maxlvl - sony_bl_props.offset;
|
||||
|
||||
} else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT",
|
||||
&unused))) {
|
||||
} else if (acpi_has_method(sony_nc_acpi_handle, "GBRT")) {
|
||||
ops = &sony_backlight_ops;
|
||||
max_brightness = SONY_MAX_BRIGHTNESS - 1;
|
||||
|
||||
@ -2750,7 +2745,6 @@ static int sony_nc_add(struct acpi_device *device)
|
||||
{
|
||||
acpi_status status;
|
||||
int result = 0;
|
||||
acpi_handle handle;
|
||||
struct sony_nc_value *item;
|
||||
|
||||
pr_info("%s v%s\n", SONY_NC_DRIVER_NAME, SONY_LAPTOP_DRIVER_VERSION);
|
||||
@ -2790,15 +2784,13 @@ static int sony_nc_add(struct acpi_device *device)
|
||||
goto outplatform;
|
||||
}
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "ECON",
|
||||
&handle))) {
|
||||
if (acpi_has_method(sony_nc_acpi_handle, "ECON")) {
|
||||
int arg = 1;
|
||||
if (sony_nc_int_call(sony_nc_acpi_handle, "ECON", &arg, NULL))
|
||||
dprintk("ECON Method failed\n");
|
||||
}
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "SN00",
|
||||
&handle))) {
|
||||
if (acpi_has_method(sony_nc_acpi_handle, "SN00")) {
|
||||
dprintk("Doing SNC setup\n");
|
||||
/* retrieve the available handles */
|
||||
result = sony_nc_handles_setup(sony_pf_device);
|
||||
@ -2821,9 +2813,8 @@ static int sony_nc_add(struct acpi_device *device)
|
||||
|
||||
/* find the available acpiget as described in the DSDT */
|
||||
for (; item->acpiget && *item->acpiget; ++item->acpiget) {
|
||||
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle,
|
||||
*item->acpiget,
|
||||
&handle))) {
|
||||
if (acpi_has_method(sony_nc_acpi_handle,
|
||||
*item->acpiget)) {
|
||||
dprintk("Found %s getter: %s\n",
|
||||
item->name, *item->acpiget);
|
||||
item->devattr.attr.mode |= S_IRUGO;
|
||||
@ -2833,9 +2824,8 @@ static int sony_nc_add(struct acpi_device *device)
|
||||
|
||||
/* find the available acpiset as described in the DSDT */
|
||||
for (; item->acpiset && *item->acpiset; ++item->acpiset) {
|
||||
if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle,
|
||||
*item->acpiset,
|
||||
&handle))) {
|
||||
if (acpi_has_method(sony_nc_acpi_handle,
|
||||
*item->acpiset)) {
|
||||
dprintk("Found %s setter: %s\n",
|
||||
item->name, *item->acpiset);
|
||||
item->devattr.attr.mode |= S_IWUSR;
|
||||
|
@ -80,13 +80,9 @@ static void acpi_topstar_notify(struct acpi_device *device, u32 event)
|
||||
static int acpi_topstar_fncx_switch(struct acpi_device *device, bool state)
|
||||
{
|
||||
acpi_status status;
|
||||
union acpi_object fncx_params[1] = {
|
||||
{ .type = ACPI_TYPE_INTEGER }
|
||||
};
|
||||
struct acpi_object_list fncx_arg_list = { 1, &fncx_params[0] };
|
||||
|
||||
fncx_params[0].integer.value = state ? 0x86 : 0x87;
|
||||
status = acpi_evaluate_object(device->handle, "FNCX", &fncx_arg_list, NULL);
|
||||
status = acpi_execute_simple_method(device->handle, "FNCX",
|
||||
state ? 0x86 : 0x87);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_err("Unable to switch FNCX notifications\n");
|
||||
return -ENODEV;
|
||||
|
@ -191,16 +191,9 @@ static __inline__ void _set_bit(u32 * word, u32 mask, int value)
|
||||
|
||||
static int write_acpi_int(const char *methodName, int val)
|
||||
{
|
||||
struct acpi_object_list params;
|
||||
union acpi_object in_objs[1];
|
||||
acpi_status status;
|
||||
|
||||
params.count = ARRAY_SIZE(in_objs);
|
||||
params.pointer = in_objs;
|
||||
in_objs[0].type = ACPI_TYPE_INTEGER;
|
||||
in_objs[0].integer.value = val;
|
||||
|
||||
status = acpi_evaluate_object(NULL, (char *)methodName, ¶ms, NULL);
|
||||
status = acpi_execute_simple_method(NULL, (char *)methodName, val);
|
||||
return (status == AE_OK) ? 0 : -EIO;
|
||||
}
|
||||
|
||||
@ -947,21 +940,17 @@ static void toshiba_acpi_hotkey_work(struct work_struct *work)
|
||||
*/
|
||||
static int toshiba_acpi_query_hotkey(struct toshiba_acpi_dev *dev)
|
||||
{
|
||||
struct acpi_buffer buf;
|
||||
union acpi_object out_obj;
|
||||
unsigned long long value;
|
||||
acpi_status status;
|
||||
|
||||
buf.pointer = &out_obj;
|
||||
buf.length = sizeof(out_obj);
|
||||
|
||||
status = acpi_evaluate_object(dev->acpi_dev->handle, "INFO",
|
||||
NULL, &buf);
|
||||
if (ACPI_FAILURE(status) || out_obj.type != ACPI_TYPE_INTEGER) {
|
||||
status = acpi_evaluate_integer(dev->acpi_dev->handle, "INFO",
|
||||
NULL, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_err("ACPI INFO method execution failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return out_obj.integer.value;
|
||||
return value;
|
||||
}
|
||||
|
||||
static void toshiba_acpi_report_hotkey(struct toshiba_acpi_dev *dev,
|
||||
@ -981,7 +970,7 @@ static void toshiba_acpi_report_hotkey(struct toshiba_acpi_dev *dev,
|
||||
static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_handle ec_handle, handle;
|
||||
acpi_handle ec_handle;
|
||||
int error;
|
||||
u32 hci_result;
|
||||
|
||||
@ -1008,10 +997,7 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
|
||||
*/
|
||||
status = AE_ERROR;
|
||||
ec_handle = ec_get_handle();
|
||||
if (ec_handle)
|
||||
status = acpi_get_handle(ec_handle, "NTFY", &handle);
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (ec_handle && acpi_has_method(ec_handle, "NTFY")) {
|
||||
INIT_WORK(&dev->hotkey_work, toshiba_acpi_hotkey_work);
|
||||
|
||||
error = i8042_install_filter(toshiba_acpi_i8042_filter);
|
||||
@ -1027,10 +1013,9 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
|
||||
* Determine hotkey query interface. Prefer using the INFO
|
||||
* method when it is available.
|
||||
*/
|
||||
status = acpi_get_handle(dev->acpi_dev->handle, "INFO", &handle);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (acpi_has_method(dev->acpi_dev->handle, "INFO"))
|
||||
dev->info_supported = 1;
|
||||
} else {
|
||||
else {
|
||||
hci_write1(dev, HCI_SYSTEM_EVENT, 1, &hci_result);
|
||||
if (hci_result == HCI_SUCCESS)
|
||||
dev->system_event_supported = 1;
|
||||
@ -1155,15 +1140,10 @@ static int toshiba_acpi_remove(struct acpi_device *acpi_dev)
|
||||
|
||||
static const char *find_hci_method(acpi_handle handle)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_handle hci_handle;
|
||||
|
||||
status = acpi_get_handle(handle, "GHCI", &hci_handle);
|
||||
if (ACPI_SUCCESS(status))
|
||||
if (acpi_has_method(handle, "GHCI"))
|
||||
return "GHCI";
|
||||
|
||||
status = acpi_get_handle(handle, "SPFC", &hci_handle);
|
||||
if (ACPI_SUCCESS(status))
|
||||
if (acpi_has_method(handle, "SPFC"))
|
||||
return "SPFC";
|
||||
|
||||
return NULL;
|
||||
|
@ -252,8 +252,6 @@ static acpi_status wmi_method_enable(struct wmi_block *wblock, int enable)
|
||||
{
|
||||
struct guid_block *block = NULL;
|
||||
char method[5];
|
||||
struct acpi_object_list input;
|
||||
union acpi_object params[1];
|
||||
acpi_status status;
|
||||
acpi_handle handle;
|
||||
|
||||
@ -263,13 +261,9 @@ static acpi_status wmi_method_enable(struct wmi_block *wblock, int enable)
|
||||
if (!block)
|
||||
return AE_NOT_EXIST;
|
||||
|
||||
input.count = 1;
|
||||
input.pointer = params;
|
||||
params[0].type = ACPI_TYPE_INTEGER;
|
||||
params[0].integer.value = enable;
|
||||
|
||||
snprintf(method, 5, "WE%02X", block->notify_id);
|
||||
status = acpi_evaluate_object(handle, method, &input, NULL);
|
||||
status = acpi_execute_simple_method(handle, method, enable);
|
||||
|
||||
if (status != AE_OK && status != AE_NOT_FOUND)
|
||||
return status;
|
||||
@ -353,10 +347,10 @@ struct acpi_buffer *out)
|
||||
{
|
||||
struct guid_block *block = NULL;
|
||||
struct wmi_block *wblock = NULL;
|
||||
acpi_handle handle, wc_handle;
|
||||
acpi_handle handle;
|
||||
acpi_status status, wc_status = AE_ERROR;
|
||||
struct acpi_object_list input, wc_input;
|
||||
union acpi_object wc_params[1], wq_params[1];
|
||||
struct acpi_object_list input;
|
||||
union acpi_object wq_params[1];
|
||||
char method[5];
|
||||
char wc_method[5] = "WC";
|
||||
|
||||
@ -386,11 +380,6 @@ struct acpi_buffer *out)
|
||||
* enable collection.
|
||||
*/
|
||||
if (block->flags & ACPI_WMI_EXPENSIVE) {
|
||||
wc_input.count = 1;
|
||||
wc_input.pointer = wc_params;
|
||||
wc_params[0].type = ACPI_TYPE_INTEGER;
|
||||
wc_params[0].integer.value = 1;
|
||||
|
||||
strncat(wc_method, block->object_id, 2);
|
||||
|
||||
/*
|
||||
@ -398,10 +387,9 @@ struct acpi_buffer *out)
|
||||
* expensive, but have no corresponding WCxx method. So we
|
||||
* should not fail if this happens.
|
||||
*/
|
||||
wc_status = acpi_get_handle(handle, wc_method, &wc_handle);
|
||||
if (ACPI_SUCCESS(wc_status))
|
||||
wc_status = acpi_evaluate_object(handle, wc_method,
|
||||
&wc_input, NULL);
|
||||
if (acpi_has_method(handle, wc_method))
|
||||
wc_status = acpi_execute_simple_method(handle,
|
||||
wc_method, 1);
|
||||
}
|
||||
|
||||
strcpy(method, "WQ");
|
||||
@ -414,9 +402,7 @@ struct acpi_buffer *out)
|
||||
* the WQxx method failed - we should disable collection anyway.
|
||||
*/
|
||||
if ((block->flags & ACPI_WMI_EXPENSIVE) && ACPI_SUCCESS(wc_status)) {
|
||||
wc_params[0].integer.value = 0;
|
||||
status = acpi_evaluate_object(handle,
|
||||
wc_method, &wc_input, NULL);
|
||||
status = acpi_execute_simple_method(handle, wc_method, 0);
|
||||
}
|
||||
|
||||
return status;
|
||||
|
@ -239,8 +239,6 @@ static char *__init pnpacpi_get_id(struct acpi_device *device)
|
||||
|
||||
static int __init pnpacpi_add_device(struct acpi_device *device)
|
||||
{
|
||||
acpi_handle temp = NULL;
|
||||
acpi_status status;
|
||||
struct pnp_dev *dev;
|
||||
char *pnpid;
|
||||
struct acpi_hardware_id *id;
|
||||
@ -253,8 +251,7 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
|
||||
* If a PnPacpi device is not present , the device
|
||||
* driver should not be loaded.
|
||||
*/
|
||||
status = acpi_get_handle(device->handle, "_CRS", &temp);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (!acpi_has_method(device->handle, "_CRS"))
|
||||
return 0;
|
||||
|
||||
pnpid = pnpacpi_get_id(device);
|
||||
@ -271,16 +268,14 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
|
||||
dev->data = device;
|
||||
/* .enabled means the device can decode the resources */
|
||||
dev->active = device->status.enabled;
|
||||
status = acpi_get_handle(device->handle, "_SRS", &temp);
|
||||
if (ACPI_SUCCESS(status))
|
||||
if (acpi_has_method(device->handle, "_SRS"))
|
||||
dev->capabilities |= PNP_CONFIGURABLE;
|
||||
dev->capabilities |= PNP_READ;
|
||||
if (device->flags.dynamic_status && (dev->capabilities & PNP_CONFIGURABLE))
|
||||
dev->capabilities |= PNP_WRITE;
|
||||
if (device->flags.removable)
|
||||
dev->capabilities |= PNP_REMOVABLE;
|
||||
status = acpi_get_handle(device->handle, "_DIS", &temp);
|
||||
if (ACPI_SUCCESS(status))
|
||||
if (acpi_has_method(device->handle, "_DIS"))
|
||||
dev->capabilities |= PNP_DISABLE;
|
||||
|
||||
if (strlen(acpi_device_name(device)))
|
||||
|
Loading…
Reference in New Issue
Block a user