Merge branch 'procfs-cleanup-v2' into release
This commit is contained in:
commit
f3ab69a321
@ -66,7 +66,6 @@ config ACPI_PROCFS
|
||||
config ACPI_PROCFS_POWER
|
||||
bool "Deprecated power /proc/acpi directories"
|
||||
depends on PROC_FS
|
||||
default y
|
||||
help
|
||||
For backwards compatibility, this option allows
|
||||
deprecated power /proc/acpi/ directories to exist, even when
|
||||
@ -90,13 +89,6 @@ config ACPI_POWER_METER
|
||||
To compile this driver as a module, choose M here:
|
||||
the module will be called power-meter.
|
||||
|
||||
config ACPI_SYSFS_POWER
|
||||
bool "Future power /sys interface"
|
||||
select POWER_SUPPLY
|
||||
default y
|
||||
help
|
||||
Say N to disable power /sys interface
|
||||
|
||||
config ACPI_EC_DEBUGFS
|
||||
tristate "EC read/write access through /sys/kernel/debug/ec"
|
||||
default n
|
||||
@ -136,6 +128,7 @@ config ACPI_PROC_EVENT
|
||||
config ACPI_AC
|
||||
tristate "AC Adapter"
|
||||
depends on X86
|
||||
select POWER_SUPPLY
|
||||
default y
|
||||
help
|
||||
This driver supports the AC Adapter object, which indicates
|
||||
@ -148,6 +141,7 @@ config ACPI_AC
|
||||
config ACPI_BATTERY
|
||||
tristate "Battery"
|
||||
depends on X86
|
||||
select POWER_SUPPLY
|
||||
default y
|
||||
help
|
||||
This driver adds support for battery information through
|
||||
@ -364,6 +358,7 @@ config ACPI_HOTPLUG_MEMORY
|
||||
config ACPI_SBS
|
||||
tristate "Smart Battery System"
|
||||
depends on X86
|
||||
select POWER_SUPPLY
|
||||
help
|
||||
This driver supports the Smart Battery System, another
|
||||
type of access to battery information, found on some laptops.
|
||||
|
@ -32,9 +32,7 @@
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
#include <linux/power_supply.h>
|
||||
#endif
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
@ -86,9 +84,7 @@ static struct acpi_driver acpi_ac_driver = {
|
||||
};
|
||||
|
||||
struct acpi_ac {
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
struct power_supply charger;
|
||||
#endif
|
||||
struct acpi_device * device;
|
||||
unsigned long long state;
|
||||
};
|
||||
@ -104,7 +100,6 @@ static const struct file_operations acpi_ac_fops = {
|
||||
.release = single_release,
|
||||
};
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
static int get_ac_property(struct power_supply *psy,
|
||||
enum power_supply_property psp,
|
||||
union power_supply_propval *val)
|
||||
@ -123,7 +118,6 @@ static int get_ac_property(struct power_supply *psy,
|
||||
static enum power_supply_property ac_props[] = {
|
||||
POWER_SUPPLY_PROP_ONLINE,
|
||||
};
|
||||
#endif
|
||||
/* --------------------------------------------------------------------------
|
||||
AC Adapter Management
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -247,9 +241,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event)
|
||||
dev_name(&device->dev), event,
|
||||
(u32) ac->state);
|
||||
acpi_notifier_call_chain(device, event, (u32) ac->state);
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
||||
#endif
|
||||
}
|
||||
|
||||
return;
|
||||
@ -282,14 +274,12 @@ static int acpi_ac_add(struct acpi_device *device)
|
||||
#endif
|
||||
if (result)
|
||||
goto end;
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
ac->charger.name = acpi_device_bid(device);
|
||||
ac->charger.type = POWER_SUPPLY_TYPE_MAINS;
|
||||
ac->charger.properties = ac_props;
|
||||
ac->charger.num_properties = ARRAY_SIZE(ac_props);
|
||||
ac->charger.get_property = get_ac_property;
|
||||
power_supply_register(&ac->device->dev, &ac->charger);
|
||||
#endif
|
||||
|
||||
printk(KERN_INFO PREFIX "%s [%s] (%s)\n",
|
||||
acpi_device_name(device), acpi_device_bid(device),
|
||||
@ -316,10 +306,8 @@ static int acpi_ac_resume(struct acpi_device *device)
|
||||
old_state = ac->state;
|
||||
if (acpi_ac_get_state(ac))
|
||||
return 0;
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
if (old_state != ac->state)
|
||||
kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -333,10 +321,8 @@ static int acpi_ac_remove(struct acpi_device *device, int type)
|
||||
|
||||
ac = acpi_driver_data(device);
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
if (ac->charger.dev)
|
||||
power_supply_unregister(&ac->charger);
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_ac_remove_fs(device);
|
||||
#endif
|
||||
|
@ -42,10 +42,7 @@
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
#include <linux/power_supply.h>
|
||||
#endif
|
||||
|
||||
#define PREFIX "ACPI: "
|
||||
|
||||
@ -102,9 +99,7 @@ enum {
|
||||
|
||||
struct acpi_battery {
|
||||
struct mutex lock;
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
struct power_supply bat;
|
||||
#endif
|
||||
struct acpi_device *device;
|
||||
unsigned long update_time;
|
||||
int rate_now;
|
||||
@ -141,7 +136,6 @@ inline int acpi_battery_present(struct acpi_battery *battery)
|
||||
return battery->device->status.battery_present;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
static int acpi_battery_technology(struct acpi_battery *battery)
|
||||
{
|
||||
if (!strcasecmp("NiCd", battery->type))
|
||||
@ -281,7 +275,6 @@ static enum power_supply_property energy_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_MANUFACTURER,
|
||||
POWER_SUPPLY_PROP_SERIAL_NUMBER,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
inline char *acpi_battery_units(struct acpi_battery *battery)
|
||||
@ -492,7 +485,6 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery)
|
||||
return acpi_battery_set_alarm(battery);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
static ssize_t acpi_battery_alarm_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -552,7 +544,6 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
|
||||
power_supply_unregister(&battery->bat);
|
||||
battery->bat.dev = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void acpi_battery_quirks(struct acpi_battery *battery)
|
||||
{
|
||||
@ -568,9 +559,7 @@ static int acpi_battery_update(struct acpi_battery *battery)
|
||||
if (result)
|
||||
return result;
|
||||
if (!acpi_battery_present(battery)) {
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
sysfs_remove_battery(battery);
|
||||
#endif
|
||||
battery->update_time = 0;
|
||||
return 0;
|
||||
}
|
||||
@ -582,10 +571,8 @@ static int acpi_battery_update(struct acpi_battery *battery)
|
||||
acpi_battery_quirks(battery);
|
||||
acpi_battery_init_alarm(battery);
|
||||
}
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
if (!battery->bat.dev)
|
||||
sysfs_add_battery(battery);
|
||||
#endif
|
||||
return acpi_battery_get_state(battery);
|
||||
}
|
||||
|
||||
@ -867,26 +854,20 @@ static void acpi_battery_remove_fs(struct acpi_device *device)
|
||||
static void acpi_battery_notify(struct acpi_device *device, u32 event)
|
||||
{
|
||||
struct acpi_battery *battery = acpi_driver_data(device);
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
struct device *old;
|
||||
#endif
|
||||
|
||||
if (!battery)
|
||||
return;
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
old = battery->bat.dev;
|
||||
#endif
|
||||
acpi_battery_update(battery);
|
||||
acpi_bus_generate_proc_event(device, event,
|
||||
acpi_battery_present(battery));
|
||||
acpi_bus_generate_netlink_event(device->pnp.device_class,
|
||||
dev_name(&device->dev), event,
|
||||
acpi_battery_present(battery));
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
/* acpi_battery_update could remove power_supply object */
|
||||
if (old && battery->bat.dev)
|
||||
power_supply_changed(&battery->bat);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int acpi_battery_add(struct acpi_device *device)
|
||||
@ -934,9 +915,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type)
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_remove_fs(device);
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
sysfs_remove_battery(battery);
|
||||
#endif
|
||||
mutex_destroy(&battery->lock);
|
||||
kfree(battery);
|
||||
return 0;
|
||||
|
@ -27,8 +27,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/thermal.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
@ -118,122 +116,6 @@ static struct thermal_cooling_device_ops fan_cooling_ops = {
|
||||
.set_cur_state = fan_set_cur_state,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
-------------------------------------------------------------------------- */
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
|
||||
static struct proc_dir_entry *acpi_fan_dir;
|
||||
|
||||
static int acpi_fan_read_state(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_device *device = seq->private;
|
||||
int state = 0;
|
||||
|
||||
|
||||
if (device) {
|
||||
if (acpi_bus_get_power(device->handle, &state))
|
||||
seq_printf(seq, "status: ERROR\n");
|
||||
else
|
||||
seq_printf(seq, "status: %s\n",
|
||||
!state ? "on" : "off");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_fan_state_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_fan_read_state, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_fan_write_state(struct file *file, const char __user * buffer,
|
||||
size_t count, loff_t * ppos)
|
||||
{
|
||||
int result = 0;
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_device *device = m->private;
|
||||
char state_string[3] = { '\0' };
|
||||
|
||||
if (count > sizeof(state_string) - 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(state_string, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
state_string[count] = '\0';
|
||||
if ((state_string[0] < '0') || (state_string[0] > '3'))
|
||||
return -EINVAL;
|
||||
if (state_string[1] == '\n')
|
||||
state_string[1] = '\0';
|
||||
if (state_string[1] != '\0')
|
||||
return -EINVAL;
|
||||
|
||||
result = acpi_bus_set_power(device->handle,
|
||||
simple_strtoul(state_string, NULL, 0));
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations acpi_fan_state_ops = {
|
||||
.open = acpi_fan_state_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_fan_write_state,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static int acpi_fan_add_fs(struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
|
||||
|
||||
if (!device)
|
||||
return -EINVAL;
|
||||
|
||||
if (!acpi_device_dir(device)) {
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
|
||||
acpi_fan_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* 'status' [R/W] */
|
||||
entry = proc_create_data(ACPI_FAN_FILE_STATE,
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
acpi_device_dir(device),
|
||||
&acpi_fan_state_ops,
|
||||
device);
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_fan_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
|
||||
if (acpi_device_dir(device)) {
|
||||
remove_proc_entry(ACPI_FAN_FILE_STATE, acpi_device_dir(device));
|
||||
remove_proc_entry(acpi_device_bid(device), acpi_fan_dir);
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int acpi_fan_add_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_fan_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -284,10 +166,6 @@ static int acpi_fan_add(struct acpi_device *device)
|
||||
dev_err(&device->dev, "Failed to create sysfs link "
|
||||
"'device'\n");
|
||||
|
||||
result = acpi_fan_add_fs(device);
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
printk(KERN_INFO PREFIX "%s [%s] (%s)\n",
|
||||
acpi_device_name(device), acpi_device_bid(device),
|
||||
!device->power.state ? "on" : "off");
|
||||
@ -303,7 +181,6 @@ static int acpi_fan_remove(struct acpi_device *device, int type)
|
||||
if (!device || !cdev)
|
||||
return -EINVAL;
|
||||
|
||||
acpi_fan_remove_fs(device);
|
||||
sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
|
||||
sysfs_remove_link(&cdev->device.kobj, "device");
|
||||
thermal_cooling_device_unregister(cdev);
|
||||
@ -347,19 +224,9 @@ static int __init acpi_fan_init(void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
acpi_fan_dir = proc_mkdir(ACPI_FAN_CLASS, acpi_root_dir);
|
||||
if (!acpi_fan_dir)
|
||||
return -ENODEV;
|
||||
#endif
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_fan_driver);
|
||||
if (result < 0) {
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir);
|
||||
#endif
|
||||
if (result < 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -369,10 +236,6 @@ static void __exit acpi_fan_exit(void)
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_fan_driver);
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pci.h>
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pci.h>
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
@ -40,8 +40,10 @@
|
||||
#include <linux/pm.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#include <linux/cpu.h>
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#endif
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/cpuidle.h>
|
||||
@ -244,6 +246,7 @@ static int acpi_processor_errata(struct acpi_processor *pr)
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
static struct proc_dir_entry *acpi_processor_dir = NULL;
|
||||
|
||||
static int __cpuinit acpi_processor_add_fs(struct acpi_device *device)
|
||||
@ -280,7 +283,16 @@ static int acpi_processor_remove_fs(struct acpi_device *device)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
static inline int acpi_processor_add_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int acpi_processor_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -842,9 +854,11 @@ static int __init acpi_processor_init(void)
|
||||
|
||||
memset(&errata, 0, sizeof(errata));
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir);
|
||||
if (!acpi_processor_dir)
|
||||
return -ENOMEM;
|
||||
#endif
|
||||
|
||||
if (!cpuidle_register_driver(&acpi_idle_driver)) {
|
||||
printk(KERN_DEBUG "ACPI: %s registered with cpuidle\n",
|
||||
@ -871,7 +885,9 @@ static int __init acpi_processor_init(void)
|
||||
out_cpuidle:
|
||||
cpuidle_unregister_driver(&acpi_idle_driver);
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -891,7 +907,9 @@ static void __exit acpi_processor_exit(void)
|
||||
|
||||
cpuidle_unregister_driver(&acpi_idle_driver);
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -32,8 +32,10 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/cpufreq.h>
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#endif
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
@ -1214,6 +1216,7 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
/* proc interface */
|
||||
static int acpi_processor_throttling_seq_show(struct seq_file *seq,
|
||||
void *offset)
|
||||
@ -1322,3 +1325,4 @@ const struct file_operations acpi_processor_throttling_fops = {
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
#endif
|
||||
|
@ -40,10 +40,7 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
#include <linux/power_supply.h>
|
||||
#endif
|
||||
|
||||
#include "sbshc.h"
|
||||
|
||||
@ -85,9 +82,7 @@ static const struct acpi_device_id sbs_device_ids[] = {
|
||||
MODULE_DEVICE_TABLE(acpi, sbs_device_ids);
|
||||
|
||||
struct acpi_battery {
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
struct power_supply bat;
|
||||
#endif
|
||||
struct acpi_sbs *sbs;
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
struct proc_dir_entry *proc_entry;
|
||||
@ -120,9 +115,7 @@ struct acpi_battery {
|
||||
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
|
||||
|
||||
struct acpi_sbs {
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
struct power_supply charger;
|
||||
#endif
|
||||
struct acpi_device *device;
|
||||
struct acpi_smb_hc *hc;
|
||||
struct mutex lock;
|
||||
@ -166,7 +159,6 @@ static inline int acpi_battery_scale(struct acpi_battery *battery)
|
||||
acpi_battery_ipscale(battery);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
static int sbs_get_ac_property(struct power_supply *psy,
|
||||
enum power_supply_property psp,
|
||||
union power_supply_propval *val)
|
||||
@ -313,7 +305,6 @@ static enum power_supply_property sbs_energy_battery_props[] = {
|
||||
POWER_SUPPLY_PROP_MANUFACTURER,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Smart Battery System Management
|
||||
@ -449,7 +440,6 @@ static int acpi_ac_get_present(struct acpi_sbs *sbs)
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
static ssize_t acpi_battery_alarm_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
@ -479,7 +469,6 @@ static struct device_attribute alarm_attr = {
|
||||
.show = acpi_battery_alarm_show,
|
||||
.store = acpi_battery_alarm_store,
|
||||
};
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc/acpi)
|
||||
@ -798,7 +787,6 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||
&acpi_battery_state_fops, &acpi_battery_alarm_fops,
|
||||
battery);
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
battery->bat.name = battery->name;
|
||||
battery->bat.type = POWER_SUPPLY_TYPE_BATTERY;
|
||||
if (!acpi_battery_mode(battery)) {
|
||||
@ -819,7 +807,6 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||
goto end;
|
||||
battery->have_sysfs_alarm = 1;
|
||||
end:
|
||||
#endif
|
||||
printk(KERN_INFO PREFIX "%s [%s]: Battery Slot [%s] (battery %s)\n",
|
||||
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
||||
battery->name, battery->present ? "present" : "absent");
|
||||
@ -828,17 +815,13 @@ static int acpi_battery_add(struct acpi_sbs *sbs, int id)
|
||||
|
||||
static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
|
||||
{
|
||||
#if defined(CONFIG_ACPI_SYSFS_POWER) || defined(CONFIG_ACPI_PROCFS_POWER)
|
||||
struct acpi_battery *battery = &sbs->battery[id];
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
if (battery->bat.dev) {
|
||||
if (battery->have_sysfs_alarm)
|
||||
device_remove_file(battery->bat.dev, &alarm_attr);
|
||||
power_supply_unregister(&battery->bat);
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
if (battery->proc_entry)
|
||||
acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir);
|
||||
@ -859,14 +842,12 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
|
||||
if (result)
|
||||
goto end;
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
sbs->charger.name = "sbs-charger";
|
||||
sbs->charger.type = POWER_SUPPLY_TYPE_MAINS;
|
||||
sbs->charger.properties = sbs_ac_props;
|
||||
sbs->charger.num_properties = ARRAY_SIZE(sbs_ac_props);
|
||||
sbs->charger.get_property = sbs_get_ac_property;
|
||||
power_supply_register(&sbs->device->dev, &sbs->charger);
|
||||
#endif
|
||||
printk(KERN_INFO PREFIX "%s [%s]: AC Adapter [%s] (%s)\n",
|
||||
ACPI_SBS_DEVICE_NAME, acpi_device_bid(sbs->device),
|
||||
ACPI_AC_DIR_NAME, sbs->charger_present ? "on-line" : "off-line");
|
||||
@ -876,10 +857,8 @@ static int acpi_charger_add(struct acpi_sbs *sbs)
|
||||
|
||||
static void acpi_charger_remove(struct acpi_sbs *sbs)
|
||||
{
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
if (sbs->charger.dev)
|
||||
power_supply_unregister(&sbs->charger);
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
if (sbs->charger_entry)
|
||||
acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir);
|
||||
@ -900,9 +879,7 @@ static void acpi_sbs_callback(void *context)
|
||||
ACPI_SBS_NOTIFY_STATUS,
|
||||
sbs->charger_present);
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
kobject_uevent(&sbs->charger.dev->kobj, KOBJ_CHANGE);
|
||||
#endif
|
||||
}
|
||||
if (sbs->manager_present) {
|
||||
for (id = 0; id < MAX_SBS_BAT; ++id) {
|
||||
@ -919,9 +896,7 @@ static void acpi_sbs_callback(void *context)
|
||||
ACPI_SBS_NOTIFY_STATUS,
|
||||
bat->present);
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI_SYSFS_POWER
|
||||
kobject_uevent(&bat->bat.dev->kobj, KOBJ_CHANGE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,12 +37,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#endif
|
||||
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/reboot.h>
|
||||
@ -195,61 +189,6 @@ struct acpi_thermal {
|
||||
struct mutex lock;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file);
|
||||
static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file);
|
||||
static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file);
|
||||
static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file);
|
||||
static ssize_t acpi_thermal_write_cooling_mode(struct file *,
|
||||
const char __user *, size_t,
|
||||
loff_t *);
|
||||
static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file);
|
||||
static ssize_t acpi_thermal_write_polling(struct file *, const char __user *,
|
||||
size_t, loff_t *);
|
||||
|
||||
static const struct file_operations acpi_thermal_state_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_thermal_state_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static const struct file_operations acpi_thermal_temp_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_thermal_temp_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static const struct file_operations acpi_thermal_trip_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_thermal_trip_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static const struct file_operations acpi_thermal_cooling_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_thermal_cooling_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_thermal_write_cooling_mode,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static const struct file_operations acpi_thermal_polling_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_thermal_polling_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_thermal_write_polling,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
#endif /* CONFIG_ACPI_PROCFS*/
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Thermal Zone Management
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -957,358 +896,6 @@ static void acpi_thermal_unregister_thermal_zone(struct acpi_thermal *tz)
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
-------------------------------------------------------------------------- */
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
static struct proc_dir_entry *acpi_thermal_dir;
|
||||
|
||||
static int acpi_thermal_state_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_thermal *tz = seq->private;
|
||||
|
||||
|
||||
if (!tz)
|
||||
goto end;
|
||||
|
||||
seq_puts(seq, "state: ");
|
||||
|
||||
if (!tz->state.critical && !tz->state.hot && !tz->state.passive
|
||||
&& !tz->state.active)
|
||||
seq_puts(seq, "ok\n");
|
||||
else {
|
||||
if (tz->state.critical)
|
||||
seq_puts(seq, "critical ");
|
||||
if (tz->state.hot)
|
||||
seq_puts(seq, "hot ");
|
||||
if (tz->state.passive)
|
||||
seq_puts(seq, "passive ");
|
||||
if (tz->state.active)
|
||||
seq_printf(seq, "active[%d]", tz->state.active_index);
|
||||
seq_puts(seq, "\n");
|
||||
}
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_thermal_state_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_thermal_state_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_thermal_temp_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
int result = 0;
|
||||
struct acpi_thermal *tz = seq->private;
|
||||
|
||||
|
||||
if (!tz)
|
||||
goto end;
|
||||
|
||||
result = acpi_thermal_get_temperature(tz);
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "temperature: %ld C\n",
|
||||
KELVIN_TO_CELSIUS(tz->temperature));
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_thermal_temp_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_thermal *tz = seq->private;
|
||||
struct acpi_device *device;
|
||||
acpi_status status;
|
||||
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
|
||||
|
||||
if (!tz)
|
||||
goto end;
|
||||
|
||||
if (tz->trips.critical.flags.valid)
|
||||
seq_printf(seq, "critical (S5): %ld C%s",
|
||||
KELVIN_TO_CELSIUS(tz->trips.critical.temperature),
|
||||
nocrt ? " <disabled>\n" : "\n");
|
||||
|
||||
if (tz->trips.hot.flags.valid)
|
||||
seq_printf(seq, "hot (S4): %ld C%s",
|
||||
KELVIN_TO_CELSIUS(tz->trips.hot.temperature),
|
||||
nocrt ? " <disabled>\n" : "\n");
|
||||
|
||||
if (tz->trips.passive.flags.valid) {
|
||||
seq_printf(seq,
|
||||
"passive: %ld C: tc1=%lu tc2=%lu tsp=%lu devices=",
|
||||
KELVIN_TO_CELSIUS(tz->trips.passive.temperature),
|
||||
tz->trips.passive.tc1, tz->trips.passive.tc2,
|
||||
tz->trips.passive.tsp);
|
||||
for (j = 0; j < tz->trips.passive.devices.count; j++) {
|
||||
status = acpi_bus_get_device(tz->trips.passive.devices.
|
||||
handles[j], &device);
|
||||
seq_printf(seq, "%4.4s ", status ? "" :
|
||||
acpi_device_bid(device));
|
||||
}
|
||||
seq_puts(seq, "\n");
|
||||
} else {
|
||||
seq_printf(seq, "passive (forced):");
|
||||
if (tz->thermal_zone->forced_passive)
|
||||
seq_printf(seq, " %i C\n",
|
||||
tz->thermal_zone->forced_passive / 1000);
|
||||
else
|
||||
seq_printf(seq, "<not set>\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
|
||||
if (!(tz->trips.active[i].flags.valid))
|
||||
break;
|
||||
seq_printf(seq, "active[%d]: %ld C: devices=",
|
||||
i,
|
||||
KELVIN_TO_CELSIUS(tz->trips.active[i].temperature));
|
||||
for (j = 0; j < tz->trips.active[i].devices.count; j++){
|
||||
status = acpi_bus_get_device(tz->trips.active[i].
|
||||
devices.handles[j],
|
||||
&device);
|
||||
seq_printf(seq, "%4.4s ", status ? "" :
|
||||
acpi_device_bid(device));
|
||||
}
|
||||
seq_puts(seq, "\n");
|
||||
}
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_thermal_trip_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_thermal_trip_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_thermal_cooling_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_thermal *tz = seq->private;
|
||||
|
||||
|
||||
if (!tz)
|
||||
goto end;
|
||||
|
||||
if (!tz->flags.cooling_mode)
|
||||
seq_puts(seq, "<setting not supported>\n");
|
||||
else
|
||||
seq_puts(seq, "0 - Active; 1 - Passive\n");
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_thermal_cooling_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_thermal_cooling_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_thermal_write_cooling_mode(struct file *file,
|
||||
const char __user * buffer,
|
||||
size_t count, loff_t * ppos)
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_thermal *tz = m->private;
|
||||
int result = 0;
|
||||
char mode_string[12] = { '\0' };
|
||||
|
||||
|
||||
if (!tz || (count > sizeof(mode_string) - 1))
|
||||
return -EINVAL;
|
||||
|
||||
if (!tz->flags.cooling_mode)
|
||||
return -ENODEV;
|
||||
|
||||
if (copy_from_user(mode_string, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
mode_string[count] = '\0';
|
||||
|
||||
result = acpi_thermal_set_cooling_mode(tz,
|
||||
simple_strtoul(mode_string, NULL,
|
||||
0));
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
acpi_thermal_check(tz);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int acpi_thermal_polling_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_thermal *tz = seq->private;
|
||||
|
||||
|
||||
if (!tz)
|
||||
goto end;
|
||||
|
||||
if (!tz->thermal_zone->polling_delay) {
|
||||
seq_puts(seq, "<polling disabled>\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
seq_printf(seq, "polling frequency: %d seconds\n",
|
||||
(tz->thermal_zone->polling_delay / 1000));
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_thermal_polling_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_thermal_polling_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_thermal_set_polling(struct acpi_thermal *tz, int seconds)
|
||||
{
|
||||
if (!tz)
|
||||
return -EINVAL;
|
||||
|
||||
/* Convert value to deci-seconds */
|
||||
tz->polling_frequency = seconds * 10;
|
||||
|
||||
tz->thermal_zone->polling_delay = seconds * 1000;
|
||||
|
||||
if (tz->tz_enabled)
|
||||
thermal_zone_device_update(tz->thermal_zone);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Polling frequency set to %lu seconds\n",
|
||||
tz->polling_frequency/10));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_thermal_write_polling(struct file *file,
|
||||
const char __user * buffer,
|
||||
size_t count, loff_t * ppos)
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_thermal *tz = m->private;
|
||||
int result = 0;
|
||||
char polling_string[12] = { '\0' };
|
||||
int seconds = 0;
|
||||
|
||||
|
||||
if (!tz || (count > sizeof(polling_string) - 1))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(polling_string, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
polling_string[count] = '\0';
|
||||
|
||||
seconds = simple_strtoul(polling_string, NULL, 0);
|
||||
|
||||
result = acpi_thermal_set_polling(tz, seconds);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
acpi_thermal_check(tz);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int acpi_thermal_add_fs(struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
|
||||
|
||||
if (!acpi_device_dir(device)) {
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
|
||||
acpi_thermal_dir);
|
||||
if (!acpi_device_dir(device))
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* 'state' [R] */
|
||||
entry = proc_create_data(ACPI_THERMAL_FILE_STATE,
|
||||
S_IRUGO, acpi_device_dir(device),
|
||||
&acpi_thermal_state_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
|
||||
/* 'temperature' [R] */
|
||||
entry = proc_create_data(ACPI_THERMAL_FILE_TEMPERATURE,
|
||||
S_IRUGO, acpi_device_dir(device),
|
||||
&acpi_thermal_temp_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
|
||||
/* 'trip_points' [R] */
|
||||
entry = proc_create_data(ACPI_THERMAL_FILE_TRIP_POINTS,
|
||||
S_IRUGO,
|
||||
acpi_device_dir(device),
|
||||
&acpi_thermal_trip_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
|
||||
/* 'cooling_mode' [R/W] */
|
||||
entry = proc_create_data(ACPI_THERMAL_FILE_COOLING_MODE,
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
acpi_device_dir(device),
|
||||
&acpi_thermal_cooling_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
|
||||
/* 'polling_frequency' [R/W] */
|
||||
entry = proc_create_data(ACPI_THERMAL_FILE_POLLING_FREQ,
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
acpi_device_dir(device),
|
||||
&acpi_thermal_polling_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_thermal_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
|
||||
if (acpi_device_dir(device)) {
|
||||
remove_proc_entry(ACPI_THERMAL_FILE_POLLING_FREQ,
|
||||
acpi_device_dir(device));
|
||||
remove_proc_entry(ACPI_THERMAL_FILE_COOLING_MODE,
|
||||
acpi_device_dir(device));
|
||||
remove_proc_entry(ACPI_THERMAL_FILE_TRIP_POINTS,
|
||||
acpi_device_dir(device));
|
||||
remove_proc_entry(ACPI_THERMAL_FILE_TEMPERATURE,
|
||||
acpi_device_dir(device));
|
||||
remove_proc_entry(ACPI_THERMAL_FILE_STATE,
|
||||
acpi_device_dir(device));
|
||||
remove_proc_entry(acpi_device_bid(device), acpi_thermal_dir);
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int acpi_thermal_add_fs(struct acpi_device *device) { return 0; }
|
||||
static inline int acpi_thermal_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_ACPI_PROCFS */
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -1428,17 +1015,11 @@ static int acpi_thermal_add(struct acpi_device *device)
|
||||
if (result)
|
||||
goto free_memory;
|
||||
|
||||
result = acpi_thermal_add_fs(device);
|
||||
if (result)
|
||||
goto unregister_thermal_zone;
|
||||
|
||||
printk(KERN_INFO PREFIX "%s [%s] (%ld C)\n",
|
||||
acpi_device_name(device), acpi_device_bid(device),
|
||||
KELVIN_TO_CELSIUS(tz->temperature));
|
||||
goto end;
|
||||
|
||||
unregister_thermal_zone:
|
||||
thermal_zone_device_unregister(tz->thermal_zone);
|
||||
free_memory:
|
||||
kfree(tz);
|
||||
end:
|
||||
@ -1454,7 +1035,6 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
|
||||
|
||||
tz = acpi_driver_data(device);
|
||||
|
||||
acpi_thermal_remove_fs(device);
|
||||
acpi_thermal_unregister_thermal_zone(tz);
|
||||
mutex_destroy(&tz->lock);
|
||||
kfree(tz);
|
||||
@ -1580,19 +1160,9 @@ static int __init acpi_thermal_init(void)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
acpi_thermal_dir = proc_mkdir(ACPI_THERMAL_CLASS, acpi_root_dir);
|
||||
if (!acpi_thermal_dir)
|
||||
return -ENODEV;
|
||||
#endif
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_thermal_driver);
|
||||
if (result < 0) {
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
remove_proc_entry(ACPI_THERMAL_CLASS, acpi_root_dir);
|
||||
#endif
|
||||
if (result < 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1602,10 +1172,6 @@ static void __exit acpi_thermal_exit(void)
|
||||
|
||||
acpi_bus_unregister_driver(&acpi_thermal_driver);
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
remove_proc_entry(ACPI_THERMAL_CLASS, acpi_root_dir);
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -30,8 +30,6 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/thermal.h>
|
||||
@ -152,9 +150,6 @@ struct acpi_video_bus {
|
||||
struct acpi_video_bus_flags flags;
|
||||
struct list_head video_device_list;
|
||||
struct mutex device_list_lock; /* protects video_device_list */
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
struct proc_dir_entry *dir;
|
||||
#endif
|
||||
struct input_dev *input;
|
||||
char phys[32]; /* for input device */
|
||||
struct notifier_block pm_nb;
|
||||
@ -210,108 +205,6 @@ struct acpi_video_device {
|
||||
struct output_device *output_dev;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
/* bus */
|
||||
static int acpi_video_bus_info_open_fs(struct inode *inode, struct file *file);
|
||||
static const struct file_operations acpi_video_bus_info_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_bus_info_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int acpi_video_bus_ROM_open_fs(struct inode *inode, struct file *file);
|
||||
static const struct file_operations acpi_video_bus_ROM_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_bus_ROM_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int acpi_video_bus_POST_info_open_fs(struct inode *inode,
|
||||
struct file *file);
|
||||
static const struct file_operations acpi_video_bus_POST_info_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_bus_POST_info_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int acpi_video_bus_POST_open_fs(struct inode *inode, struct file *file);
|
||||
static ssize_t acpi_video_bus_write_POST(struct file *file,
|
||||
const char __user *buffer, size_t count, loff_t *data);
|
||||
static const struct file_operations acpi_video_bus_POST_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_bus_POST_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_video_bus_write_POST,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int acpi_video_bus_DOS_open_fs(struct inode *inode, struct file *file);
|
||||
static ssize_t acpi_video_bus_write_DOS(struct file *file,
|
||||
const char __user *buffer, size_t count, loff_t *data);
|
||||
static const struct file_operations acpi_video_bus_DOS_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_bus_DOS_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_video_bus_write_DOS,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
/* device */
|
||||
static int acpi_video_device_info_open_fs(struct inode *inode,
|
||||
struct file *file);
|
||||
static const struct file_operations acpi_video_device_info_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_device_info_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int acpi_video_device_state_open_fs(struct inode *inode,
|
||||
struct file *file);
|
||||
static ssize_t acpi_video_device_write_state(struct file *file,
|
||||
const char __user *buffer, size_t count, loff_t *data);
|
||||
static const struct file_operations acpi_video_device_state_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_device_state_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_video_device_write_state,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int acpi_video_device_brightness_open_fs(struct inode *inode,
|
||||
struct file *file);
|
||||
static ssize_t acpi_video_device_write_brightness(struct file *file,
|
||||
const char __user *buffer, size_t count, loff_t *data);
|
||||
static const struct file_operations acpi_video_device_brightness_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_device_brightness_open_fs,
|
||||
.read = seq_read,
|
||||
.write = acpi_video_device_write_brightness,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int acpi_video_device_EDID_open_fs(struct inode *inode,
|
||||
struct file *file);
|
||||
static const struct file_operations acpi_video_device_EDID_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = acpi_video_device_EDID_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
#endif /* CONFIG_ACPI_PROCFS */
|
||||
|
||||
static const char device_decode[][30] = {
|
||||
"motherboard VGA device",
|
||||
"PCI VGA device",
|
||||
@ -1110,646 +1003,6 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
|
||||
return status;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
-------------------------------------------------------------------------- */
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
|
||||
static struct proc_dir_entry *acpi_video_dir;
|
||||
|
||||
/* video devices */
|
||||
|
||||
static int acpi_video_device_info_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_device *dev = seq->private;
|
||||
|
||||
|
||||
if (!dev)
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "device_id: 0x%04x\n", (u32) dev->device_id);
|
||||
seq_printf(seq, "type: ");
|
||||
if (dev->flags.crt)
|
||||
seq_printf(seq, "CRT\n");
|
||||
else if (dev->flags.lcd)
|
||||
seq_printf(seq, "LCD\n");
|
||||
else if (dev->flags.tvout)
|
||||
seq_printf(seq, "TVOUT\n");
|
||||
else if (dev->flags.dvi)
|
||||
seq_printf(seq, "DVI\n");
|
||||
else
|
||||
seq_printf(seq, "UNKNOWN\n");
|
||||
|
||||
seq_printf(seq, "known by bios: %s\n", dev->flags.bios ? "yes" : "no");
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_device_info_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_device_info_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_device_query(struct acpi_video_device *device,
|
||||
unsigned long long *state)
|
||||
{
|
||||
int status;
|
||||
|
||||
status = acpi_evaluate_integer(device->dev->handle, "_DGS",
|
||||
NULL, state);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static int acpi_video_device_state_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
int status;
|
||||
struct acpi_video_device *dev = seq->private;
|
||||
unsigned long long state;
|
||||
|
||||
|
||||
if (!dev)
|
||||
goto end;
|
||||
|
||||
status = acpi_video_device_get_state(dev, &state);
|
||||
seq_printf(seq, "state: ");
|
||||
if (ACPI_SUCCESS(status))
|
||||
seq_printf(seq, "0x%02llx\n", state);
|
||||
else
|
||||
seq_printf(seq, "<not supported>\n");
|
||||
|
||||
status = acpi_video_device_query(dev, &state);
|
||||
seq_printf(seq, "query: ");
|
||||
if (ACPI_SUCCESS(status))
|
||||
seq_printf(seq, "0x%02llx\n", state);
|
||||
else
|
||||
seq_printf(seq, "<not supported>\n");
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_device_state_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_device_state_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_video_device_write_state(struct file *file,
|
||||
const char __user * buffer,
|
||||
size_t count, loff_t * data)
|
||||
{
|
||||
int status;
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_video_device *dev = m->private;
|
||||
char str[12] = { 0 };
|
||||
u32 state = 0;
|
||||
|
||||
|
||||
if (!dev || count >= sizeof(str))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(str, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
str[count] = 0;
|
||||
state = simple_strtoul(str, NULL, 0);
|
||||
state &= ((1ul << 31) | (1ul << 30) | (1ul << 0));
|
||||
|
||||
status = acpi_video_device_set_state(dev, state);
|
||||
|
||||
if (status)
|
||||
return -EFAULT;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_device_brightness_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_device *dev = seq->private;
|
||||
int i;
|
||||
|
||||
|
||||
if (!dev || !dev->brightness) {
|
||||
seq_printf(seq, "<not supported>\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
seq_printf(seq, "levels: ");
|
||||
for (i = 2; i < dev->brightness->count; i++)
|
||||
seq_printf(seq, " %d", dev->brightness->levels[i]);
|
||||
seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_device_brightness_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_device_brightness_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_video_device_write_brightness(struct file *file,
|
||||
const char __user * buffer,
|
||||
size_t count, loff_t * data)
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_video_device *dev = m->private;
|
||||
char str[5] = { 0 };
|
||||
unsigned int level = 0;
|
||||
int i;
|
||||
|
||||
|
||||
if (!dev || !dev->brightness || count >= sizeof(str))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(str, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
str[count] = 0;
|
||||
level = simple_strtoul(str, NULL, 0);
|
||||
|
||||
if (level > 100)
|
||||
return -EFAULT;
|
||||
|
||||
/* validate through the list of available levels */
|
||||
for (i = 2; i < dev->brightness->count; i++)
|
||||
if (level == dev->brightness->levels[i]) {
|
||||
if (!acpi_video_device_lcd_set_level(dev, level))
|
||||
return count;
|
||||
break;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int acpi_video_device_EDID_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_device *dev = seq->private;
|
||||
int status;
|
||||
int i;
|
||||
union acpi_object *edid = NULL;
|
||||
|
||||
|
||||
if (!dev)
|
||||
goto out;
|
||||
|
||||
status = acpi_video_device_EDID(dev, &edid, 128);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
status = acpi_video_device_EDID(dev, &edid, 256);
|
||||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (edid && edid->type == ACPI_TYPE_BUFFER) {
|
||||
for (i = 0; i < edid->buffer.length; i++)
|
||||
seq_putc(seq, edid->buffer.pointer[i]);
|
||||
}
|
||||
|
||||
out:
|
||||
if (!edid)
|
||||
seq_printf(seq, "<not supported>\n");
|
||||
else
|
||||
kfree(edid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_device_EDID_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_device_EDID_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_video_device_add_fs(struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry, *device_dir;
|
||||
struct acpi_video_device *vid_dev;
|
||||
|
||||
vid_dev = acpi_driver_data(device);
|
||||
if (!vid_dev)
|
||||
return -ENODEV;
|
||||
|
||||
device_dir = proc_mkdir(acpi_device_bid(device),
|
||||
vid_dev->video->dir);
|
||||
if (!device_dir)
|
||||
return -ENOMEM;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = proc_create_data("info", S_IRUGO, device_dir,
|
||||
&acpi_video_device_info_fops, acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_dir;
|
||||
|
||||
/* 'state' [R/W] */
|
||||
entry = proc_create_data("state", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
device_dir,
|
||||
&acpi_video_device_state_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_info;
|
||||
|
||||
/* 'brightness' [R/W] */
|
||||
entry = proc_create_data("brightness", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
device_dir,
|
||||
&acpi_video_device_brightness_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_state;
|
||||
|
||||
/* 'EDID' [R] */
|
||||
entry = proc_create_data("EDID", S_IRUGO, device_dir,
|
||||
&acpi_video_device_EDID_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_brightness;
|
||||
|
||||
acpi_device_dir(device) = device_dir;
|
||||
|
||||
return 0;
|
||||
|
||||
err_remove_brightness:
|
||||
remove_proc_entry("brightness", device_dir);
|
||||
err_remove_state:
|
||||
remove_proc_entry("state", device_dir);
|
||||
err_remove_info:
|
||||
remove_proc_entry("info", device_dir);
|
||||
err_remove_dir:
|
||||
remove_proc_entry(acpi_device_bid(device), vid_dev->video->dir);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int acpi_video_device_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_video_device *vid_dev;
|
||||
struct proc_dir_entry *device_dir;
|
||||
|
||||
vid_dev = acpi_driver_data(device);
|
||||
if (!vid_dev || !vid_dev->video || !vid_dev->video->dir)
|
||||
return -ENODEV;
|
||||
|
||||
device_dir = acpi_device_dir(device);
|
||||
if (device_dir) {
|
||||
remove_proc_entry("info", device_dir);
|
||||
remove_proc_entry("state", device_dir);
|
||||
remove_proc_entry("brightness", device_dir);
|
||||
remove_proc_entry("EDID", device_dir);
|
||||
remove_proc_entry(acpi_device_bid(device), vid_dev->video->dir);
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* video bus */
|
||||
static int acpi_video_bus_info_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_bus *video = seq->private;
|
||||
|
||||
|
||||
if (!video)
|
||||
goto end;
|
||||
|
||||
seq_printf(seq, "Switching heads: %s\n",
|
||||
video->flags.multihead ? "yes" : "no");
|
||||
seq_printf(seq, "Video ROM: %s\n",
|
||||
video->flags.rom ? "yes" : "no");
|
||||
seq_printf(seq, "Device to be POSTed on boot: %s\n",
|
||||
video->flags.post ? "yes" : "no");
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_info_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_bus_info_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_video_bus_ROM_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_bus *video = seq->private;
|
||||
|
||||
|
||||
if (!video)
|
||||
goto end;
|
||||
|
||||
printk(KERN_INFO PREFIX "Please implement %s\n", __func__);
|
||||
seq_printf(seq, "<TODO>\n");
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_ROM_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_bus_ROM_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_bus_POST_options(struct acpi_video_bus *video,
|
||||
unsigned long long *options)
|
||||
{
|
||||
int status;
|
||||
|
||||
status = acpi_evaluate_integer(video->device->handle, "_VPO",
|
||||
NULL, options);
|
||||
*options &= 3;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_bus *video = seq->private;
|
||||
unsigned long long options;
|
||||
int status;
|
||||
|
||||
|
||||
if (!video)
|
||||
goto end;
|
||||
|
||||
status = acpi_video_bus_POST_options(video, &options);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (!(options & 1)) {
|
||||
printk(KERN_WARNING PREFIX
|
||||
"The motherboard VGA device is not listed as a possible POST device.\n");
|
||||
printk(KERN_WARNING PREFIX
|
||||
"This indicates a BIOS bug. Please contact the manufacturer.\n");
|
||||
}
|
||||
printk(KERN_WARNING "%llx\n", options);
|
||||
seq_printf(seq, "can POST: <integrated video>");
|
||||
if (options & 2)
|
||||
seq_printf(seq, " <PCI video>");
|
||||
if (options & 4)
|
||||
seq_printf(seq, " <AGP video>");
|
||||
seq_putc(seq, '\n');
|
||||
} else
|
||||
seq_printf(seq, "<not supported>\n");
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_bus_POST_info_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_bus_POST_info_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long long *id)
|
||||
{
|
||||
int status;
|
||||
|
||||
status = acpi_evaluate_integer(video->device->handle, "_GPD", NULL, id);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_POST_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_bus *video = seq->private;
|
||||
int status;
|
||||
unsigned long long id;
|
||||
|
||||
|
||||
if (!video)
|
||||
goto end;
|
||||
|
||||
status = acpi_video_bus_get_POST(video, &id);
|
||||
if (!ACPI_SUCCESS(status)) {
|
||||
seq_printf(seq, "<not supported>\n");
|
||||
goto end;
|
||||
}
|
||||
seq_printf(seq, "device POSTed is <%s>\n", device_decode[id & 3]);
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_DOS_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_video_bus *video = seq->private;
|
||||
|
||||
|
||||
seq_printf(seq, "DOS setting: <%d>\n", video->dos_setting);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_POST_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_bus_POST_seq_show,
|
||||
PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_video_bus_DOS_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_video_bus_DOS_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int
|
||||
acpi_video_bus_set_POST(struct acpi_video_bus *video, unsigned long option)
|
||||
{
|
||||
int status;
|
||||
unsigned long long tmp;
|
||||
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
|
||||
struct acpi_object_list args = { 1, &arg0 };
|
||||
|
||||
|
||||
arg0.integer.value = option;
|
||||
|
||||
status = acpi_evaluate_integer(video->device->handle, "_SPD",
|
||||
&args, &tmp);
|
||||
if (ACPI_SUCCESS(status))
|
||||
status = tmp ? (-EINVAL) : (AE_OK);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_video_bus_write_POST(struct file *file,
|
||||
const char __user * buffer,
|
||||
size_t count, loff_t * data)
|
||||
{
|
||||
int status;
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_video_bus *video = m->private;
|
||||
char str[12] = { 0 };
|
||||
unsigned long long opt, options;
|
||||
|
||||
|
||||
if (!video || count >= sizeof(str))
|
||||
return -EINVAL;
|
||||
|
||||
status = acpi_video_bus_POST_options(video, &options);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(str, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
str[count] = 0;
|
||||
opt = strtoul(str, NULL, 0);
|
||||
if (opt > 3)
|
||||
return -EFAULT;
|
||||
|
||||
/* just in case an OEM 'forgot' the motherboard... */
|
||||
options |= 1;
|
||||
|
||||
if (options & (1ul << opt)) {
|
||||
status = acpi_video_bus_set_POST(video, opt);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EFAULT;
|
||||
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
acpi_video_bus_write_DOS(struct file *file,
|
||||
const char __user * buffer,
|
||||
size_t count, loff_t * data)
|
||||
{
|
||||
int status;
|
||||
struct seq_file *m = file->private_data;
|
||||
struct acpi_video_bus *video = m->private;
|
||||
char str[12] = { 0 };
|
||||
unsigned long opt;
|
||||
|
||||
|
||||
if (!video || count >= sizeof(str))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(str, buffer, count))
|
||||
return -EFAULT;
|
||||
|
||||
str[count] = 0;
|
||||
opt = strtoul(str, NULL, 0);
|
||||
if (opt > 7)
|
||||
return -EFAULT;
|
||||
|
||||
status = acpi_video_bus_DOS(video, opt & 0x3, (opt & 0x4) >> 2);
|
||||
|
||||
if (!ACPI_SUCCESS(status))
|
||||
return -EFAULT;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_add_fs(struct acpi_device *device)
|
||||
{
|
||||
struct acpi_video_bus *video = acpi_driver_data(device);
|
||||
struct proc_dir_entry *device_dir;
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
device_dir = proc_mkdir(acpi_device_bid(device), acpi_video_dir);
|
||||
if (!device_dir)
|
||||
return -ENOMEM;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = proc_create_data("info", S_IRUGO, device_dir,
|
||||
&acpi_video_bus_info_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_dir;
|
||||
|
||||
/* 'ROM' [R] */
|
||||
entry = proc_create_data("ROM", S_IRUGO, device_dir,
|
||||
&acpi_video_bus_ROM_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_info;
|
||||
|
||||
/* 'POST_info' [R] */
|
||||
entry = proc_create_data("POST_info", S_IRUGO, device_dir,
|
||||
&acpi_video_bus_POST_info_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_rom;
|
||||
|
||||
/* 'POST' [R/W] */
|
||||
entry = proc_create_data("POST", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
device_dir,
|
||||
&acpi_video_bus_POST_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_post_info;
|
||||
|
||||
/* 'DOS' [R/W] */
|
||||
entry = proc_create_data("DOS", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
device_dir,
|
||||
&acpi_video_bus_DOS_fops,
|
||||
acpi_driver_data(device));
|
||||
if (!entry)
|
||||
goto err_remove_post;
|
||||
|
||||
video->dir = acpi_device_dir(device) = device_dir;
|
||||
return 0;
|
||||
|
||||
err_remove_post:
|
||||
remove_proc_entry("POST", device_dir);
|
||||
err_remove_post_info:
|
||||
remove_proc_entry("POST_info", device_dir);
|
||||
err_remove_rom:
|
||||
remove_proc_entry("ROM", device_dir);
|
||||
err_remove_info:
|
||||
remove_proc_entry("info", device_dir);
|
||||
err_remove_dir:
|
||||
remove_proc_entry(acpi_device_bid(device), acpi_video_dir);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int acpi_video_bus_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *device_dir = acpi_device_dir(device);
|
||||
|
||||
if (device_dir) {
|
||||
remove_proc_entry("info", device_dir);
|
||||
remove_proc_entry("ROM", device_dir);
|
||||
remove_proc_entry("POST_info", device_dir);
|
||||
remove_proc_entry("POST", device_dir);
|
||||
remove_proc_entry("DOS", device_dir);
|
||||
remove_proc_entry(acpi_device_bid(device), acpi_video_dir);
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int acpi_video_device_add_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int acpi_video_device_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int acpi_video_bus_add_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int acpi_video_bus_remove_fs(struct acpi_device *device)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_ACPI_PROCFS */
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
@ -1877,8 +1130,6 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||
list_add_tail(&data->entry, &video->video_device_list);
|
||||
mutex_unlock(&video->device_list_lock);
|
||||
|
||||
acpi_video_device_add_fs(device);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2181,8 +1432,6 @@ static int acpi_video_bus_put_one_device(struct acpi_video_device *device)
|
||||
if (!device || !device->video)
|
||||
return -ENOENT;
|
||||
|
||||
acpi_video_device_remove_fs(device->dev);
|
||||
|
||||
status = acpi_remove_notify_handler(device->dev->handle,
|
||||
ACPI_DEVICE_NOTIFY,
|
||||
acpi_video_device_notify);
|
||||
@ -2466,10 +1715,6 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
||||
if (error)
|
||||
goto err_free_video;
|
||||
|
||||
error = acpi_video_bus_add_fs(device);
|
||||
if (error)
|
||||
goto err_free_video;
|
||||
|
||||
mutex_init(&video->device_list_lock);
|
||||
INIT_LIST_HEAD(&video->video_device_list);
|
||||
|
||||
@ -2522,7 +1767,6 @@ static int acpi_video_bus_add(struct acpi_device *device)
|
||||
acpi_video_bus_stop_devices(video);
|
||||
acpi_video_bus_put_devices(video);
|
||||
kfree(video->attached_array);
|
||||
acpi_video_bus_remove_fs(device);
|
||||
err_free_video:
|
||||
kfree(video);
|
||||
device->driver_data = NULL;
|
||||
@ -2544,7 +1788,6 @@ static int acpi_video_bus_remove(struct acpi_device *device, int type)
|
||||
|
||||
acpi_video_bus_stop_devices(video);
|
||||
acpi_video_bus_put_devices(video);
|
||||
acpi_video_bus_remove_fs(device);
|
||||
|
||||
input_unregister_device(video->input);
|
||||
kfree(video->attached_array);
|
||||
@ -2584,17 +1827,9 @@ int acpi_video_register(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
acpi_video_dir = proc_mkdir(ACPI_VIDEO_CLASS, acpi_root_dir);
|
||||
if (!acpi_video_dir)
|
||||
return -ENODEV;
|
||||
#endif
|
||||
|
||||
result = acpi_bus_register_driver(&acpi_video_bus);
|
||||
if (result < 0) {
|
||||
remove_proc_entry(ACPI_VIDEO_CLASS, acpi_root_dir);
|
||||
if (result < 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* When the acpi_video_bus is loaded successfully, increase
|
||||
@ -2617,10 +1852,6 @@ void acpi_video_unregister(void)
|
||||
}
|
||||
acpi_bus_unregister_driver(&acpi_video_bus);
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS
|
||||
remove_proc_entry(ACPI_VIDEO_CLASS, acpi_root_dir);
|
||||
#endif
|
||||
|
||||
register_count = 0;
|
||||
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user