Commit b9eb179f authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpi-cleanup'

Subsequent commits depend on the 'acpi-cleanup' material.
parents c70d6505 2efbca4d
...@@ -525,18 +525,14 @@ static int acpi_battery_get_state(struct acpi_battery *battery) ...@@ -525,18 +525,14 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
static int acpi_battery_set_alarm(struct acpi_battery *battery) static int acpi_battery_set_alarm(struct acpi_battery *battery)
{ {
acpi_status status = 0; acpi_status status = 0;
union acpi_object arg0 = { .type = ACPI_TYPE_INTEGER };
struct acpi_object_list arg_list = { 1, &arg0 };
if (!acpi_battery_present(battery) || if (!acpi_battery_present(battery) ||
!test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags)) !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags))
return -ENODEV; return -ENODEV;
arg0.integer.value = battery->alarm;
mutex_lock(&battery->lock); mutex_lock(&battery->lock);
status = acpi_evaluate_object(battery->device->handle, "_BTP", status = acpi_execute_simple_method(battery->device->handle, "_BTP",
&arg_list, NULL); battery->alarm);
mutex_unlock(&battery->lock); mutex_unlock(&battery->lock);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
...@@ -548,12 +544,8 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery) ...@@ -548,12 +544,8 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery)
static int acpi_battery_init_alarm(struct acpi_battery *battery) static int acpi_battery_init_alarm(struct acpi_battery *battery)
{ {
acpi_status status = AE_OK;
acpi_handle handle = NULL;
/* See if alarms are supported, and if so, set default */ /* See if alarms are supported, and if so, set default */
status = acpi_get_handle(battery->device->handle, "_BTP", &handle); if (!acpi_has_method(battery->device->handle, "_BTP")) {
if (ACPI_FAILURE(status)) {
clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags); clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags);
return 0; return 0;
} }
...@@ -1066,7 +1058,7 @@ static int acpi_battery_add(struct acpi_device *device) ...@@ -1066,7 +1058,7 @@ static int acpi_battery_add(struct acpi_device *device)
{ {
int result = 0; int result = 0;
struct acpi_battery *battery = NULL; struct acpi_battery *battery = NULL;
acpi_handle handle;
if (!device) if (!device)
return -EINVAL; return -EINVAL;
battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL); battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL);
...@@ -1078,8 +1070,7 @@ static int acpi_battery_add(struct acpi_device *device) ...@@ -1078,8 +1070,7 @@ static int acpi_battery_add(struct acpi_device *device)
device->driver_data = battery; device->driver_data = battery;
mutex_init(&battery->lock); mutex_init(&battery->lock);
mutex_init(&battery->sysfs_lock); mutex_init(&battery->sysfs_lock);
if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, if (acpi_has_method(battery->device->handle, "_BIX"))
"_BIX", &handle)))
set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
result = acpi_battery_update(battery); result = acpi_battery_update(battery);
if (result) if (result)
......
...@@ -499,19 +499,6 @@ static void acpi_bus_check_scope(acpi_handle handle) ...@@ -499,19 +499,6 @@ static void acpi_bus_check_scope(acpi_handle handle)
*/ */
} }
static BLOCKING_NOTIFIER_HEAD(acpi_bus_notify_list);
int register_acpi_bus_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_register(&acpi_bus_notify_list, nb);
}
EXPORT_SYMBOL_GPL(register_acpi_bus_notifier);
void unregister_acpi_bus_notifier(struct notifier_block *nb)
{
blocking_notifier_chain_unregister(&acpi_bus_notify_list, nb);
}
EXPORT_SYMBOL_GPL(unregister_acpi_bus_notifier);
/** /**
* acpi_bus_notify * acpi_bus_notify
* --------------- * ---------------
...@@ -525,9 +512,6 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) ...@@ -525,9 +512,6 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Notification %#02x to handle %p\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Notification %#02x to handle %p\n",
type, handle)); type, handle));
blocking_notifier_call_chain(&acpi_bus_notify_list,
type, (void *)handle);
switch (type) { switch (type) {
case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_BUS_CHECK:
...@@ -593,8 +577,6 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) ...@@ -593,8 +577,6 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
static int __init acpi_bus_init_irq(void) static int __init acpi_bus_init_irq(void)
{ {
acpi_status status; acpi_status status;
union acpi_object arg = { ACPI_TYPE_INTEGER };
struct acpi_object_list arg_list = { 1, &arg };
char *message = NULL; char *message = NULL;
...@@ -623,9 +605,7 @@ static int __init acpi_bus_init_irq(void) ...@@ -623,9 +605,7 @@ static int __init acpi_bus_init_irq(void)
printk(KERN_INFO PREFIX "Using %s for interrupt routing\n", message); printk(KERN_INFO PREFIX "Using %s for interrupt routing\n", message);
arg.integer.value = acpi_irq_model; status = acpi_execute_simple_method(NULL, "\\_PIC", acpi_irq_model);
status = acpi_evaluate_object(NULL, "\\_PIC", &arg_list, NULL);
if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {
ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PIC")); ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PIC"));
return -ENODEV; return -ENODEV;
......
...@@ -51,8 +51,6 @@ MODULE_PARM_DESC(immediate_undock, "1 (default) will cause the driver to " ...@@ -51,8 +51,6 @@ MODULE_PARM_DESC(immediate_undock, "1 (default) will cause the driver to "
" the driver to wait for userspace to write the undock sysfs file " " the driver to wait for userspace to write the undock sysfs file "
" before undocking"); " before undocking");
static struct atomic_notifier_head dock_notifier_list;
static const struct acpi_device_id dock_device_ids[] = { static const struct acpi_device_id dock_device_ids[] = {
{"LNXDOCK", 0}, {"LNXDOCK", 0},
{"", 0}, {"", 0},
...@@ -63,8 +61,6 @@ struct dock_station { ...@@ -63,8 +61,6 @@ struct dock_station {
acpi_handle handle; acpi_handle handle;
unsigned long last_dock_time; unsigned long last_dock_time;
u32 flags; u32 flags;
spinlock_t dd_lock;
struct mutex hp_lock;
struct list_head dependent_devices; struct list_head dependent_devices;
struct list_head sibling; struct list_head sibling;
...@@ -91,6 +87,12 @@ struct dock_dependent_device { ...@@ -91,6 +87,12 @@ struct dock_dependent_device {
#define DOCK_EVENT 3 #define DOCK_EVENT 3
#define UNDOCK_EVENT 2 #define UNDOCK_EVENT 2
enum dock_callback_type {
DOCK_CALL_HANDLER,
DOCK_CALL_FIXUP,
DOCK_CALL_UEVENT,
};
/***************************************************************************** /*****************************************************************************
* Dock Dependent device functions * * Dock Dependent device functions *
*****************************************************************************/ *****************************************************************************/
...@@ -101,7 +103,7 @@ struct dock_dependent_device { ...@@ -101,7 +103,7 @@ struct dock_dependent_device {
* *
* Add the dependent device to the dock's dependent device list. * Add the dependent device to the dock's dependent device list.
*/ */
static int static int __init
add_dock_dependent_device(struct dock_station *ds, acpi_handle handle) add_dock_dependent_device(struct dock_station *ds, acpi_handle handle)
{ {
struct dock_dependent_device *dd; struct dock_dependent_device *dd;
...@@ -112,14 +114,21 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle) ...@@ -112,14 +114,21 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle)
dd->handle = handle; dd->handle = handle;
INIT_LIST_HEAD(&dd->list); INIT_LIST_HEAD(&dd->list);
spin_lock(&ds->dd_lock);
list_add_tail(&dd->list, &ds->dependent_devices); list_add_tail(&dd->list, &ds->dependent_devices);
spin_unlock(&ds->dd_lock);
return 0; return 0;
} }
static void remove_dock_dependent_devices(struct dock_station *ds)
{
struct dock_dependent_device *dd, *aux;
list_for_each_entry_safe(dd, aux, &ds->dependent_devices, list) {
list_del(&dd->list);
kfree(dd);
}
}
/** /**
* dock_init_hotplug - Initialize a hotplug device on a docking station. * dock_init_hotplug - Initialize a hotplug device on a docking station.
* @dd: Dock-dependent device. * @dd: Dock-dependent device.
...@@ -135,19 +144,16 @@ static int dock_init_hotplug(struct dock_dependent_device *dd, ...@@ -135,19 +144,16 @@ static int dock_init_hotplug(struct dock_dependent_device *dd,
int ret = 0; int ret = 0;
mutex_lock(&hotplug_lock); mutex_lock(&hotplug_lock);
if (WARN_ON(dd->hp_context)) {
if (dd->hp_context) {
ret = -EEXIST; ret = -EEXIST;
} else { } else {
dd->hp_refcount = 1; dd->hp_refcount = 1;
dd->hp_ops = ops; dd->hp_ops = ops;
dd->hp_context = context; dd->hp_context = context;
dd->hp_release = release; dd->hp_release = release;
if (init)
init(context);
} }
if (!WARN_ON(ret) && init)
init(context);
mutex_unlock(&hotplug_lock); mutex_unlock(&hotplug_lock);
return ret; return ret;
} }
...@@ -162,27 +168,22 @@ static int dock_init_hotplug(struct dock_dependent_device *dd, ...@@ -162,27 +168,22 @@ static int dock_init_hotplug(struct dock_dependent_device *dd,
*/ */
static void dock_release_hotplug(struct dock_dependent_device *dd) static void dock_release_hotplug(struct dock_dependent_device *dd)
{ {
void (*release)(void *) = NULL;
void *context = NULL;
mutex_lock(&hotplug_lock); mutex_lock(&hotplug_lock);
if (dd->hp_context && !--dd->hp_refcount) { if (dd->hp_context && !--dd->hp_refcount) {
void (*release)(void *) = dd->hp_release;
void *context = dd->hp_context;
dd->hp_ops = NULL; dd->hp_ops = NULL;
context = dd->hp_context;
dd->hp_context = NULL; dd->hp_context = NULL;
release = dd->hp_release;
dd->hp_release = NULL; dd->hp_release = NULL;
if (release)
release(context);
} }
if (release && context)
release(context);
mutex_unlock(&hotplug_lock); mutex_unlock(&hotplug_lock);
} }
static void dock_hotplug_event(struct dock_dependent_device *dd, u32 event, static void dock_hotplug_event(struct dock_dependent_device *dd, u32 event,
bool uevent) enum dock_callback_type cb_type)
{ {
acpi_notify_handler cb = NULL; acpi_notify_handler cb = NULL;
bool run = false; bool run = false;
...@@ -192,8 +193,18 @@ static void dock_hotplug_event(struct dock_dependent_device *dd, u32 event, ...@@ -192,8 +193,18 @@ static void dock_hotplug_event(struct dock_dependent_device *dd, u32 event,
if (dd->hp_context) { if (dd->hp_context) {
run = true; run = true;
dd->hp_refcount++; dd->hp_refcount++;
if (dd->hp_ops) if (dd->hp_ops) {
cb = uevent ? dd->hp_ops->uevent : dd->hp_ops->handler; switch (cb_type) {
case DOCK_CALL_FIXUP:
cb = dd->hp_ops->fixup;
break;
case DOCK_CALL_UEVENT:
cb = dd->hp_ops->uevent;
break;
default:
cb = dd->hp_ops->handler;
}
}
} }
mutex_unlock(&hotplug_lock); mutex_unlock(&hotplug_lock);
...@@ -220,63 +231,17 @@ find_dock_dependent_device(struct dock_station *ds, acpi_handle handle) ...@@ -220,63 +231,17 @@ find_dock_dependent_device(struct dock_station *ds, acpi_handle handle)
{ {
struct dock_dependent_device *dd; struct dock_dependent_device *dd;
spin_lock(&ds->dd_lock); list_for_each_entry(dd, &ds->dependent_devices, list)
list_for_each_entry(dd, &ds->dependent_devices, list) { if (handle == dd->handle)
if (handle == dd->handle) {
spin_unlock(&ds->dd_lock);
return dd; return dd;
}
}
spin_unlock(&ds->dd_lock);
return NULL; return NULL;
} }
/***************************************************************************** /*****************************************************************************
* Dock functions * * Dock functions *
*****************************************************************************/ *****************************************************************************/
/** static int __init is_battery(acpi_handle handle)
* is_dock - see if a device is a dock station
* @handle: acpi handle of the device
*
* If an acpi object has a _DCK method, then it is by definition a dock
* station, so return true.
*/
static int is_dock(acpi_handle handle)
{
acpi_status status;
acpi_handle tmp;
status = acpi_get_handle(handle, "_DCK", &tmp);
if (ACPI_FAILURE(status))
return 0;
return 1;
}
static int is_ejectable(acpi_handle handle)
{
acpi_status status;
acpi_handle tmp;
status = acpi_get_handle(handle, "_EJ0", &tmp);
if (ACPI_FAILURE(status))
return 0;
return 1;
}
static int is_ata(acpi_handle handle)
{
acpi_handle tmp;
if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) ||
(ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) ||
(ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) ||
(ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp))))
return 1;
return 0;
}
static int is_battery(acpi_handle handle)
{ {
struct acpi_device_info *info; struct acpi_device_info *info;
int ret = 1; int ret = 1;
...@@ -292,17 +257,13 @@ static int is_battery(acpi_handle handle) ...@@ -292,17 +257,13 @@ static int is_battery(acpi_handle handle)
return ret; return ret;
} }
static int is_ejectable_bay(acpi_handle handle) /* Check whether ACPI object is an ejectable battery or disk bay */
static bool __init is_ejectable_bay(acpi_handle handle)
{ {
acpi_handle phandle; if (acpi_has_method(handle, "_EJ0") && is_battery(handle))
return true;
if (!is_ejectable(handle)) return acpi_bay_match(handle);
return 0;
if (is_battery(handle) || is_ata(handle))
return 1;
if (!acpi_get_parent(handle, &phandle) && is_ata(phandle))
return 1;
return 0;
} }
/** /**
...@@ -320,7 +281,7 @@ int is_dock_device(acpi_handle handle) ...@@ -320,7 +281,7 @@ int is_dock_device(acpi_handle handle)
if (!dock_station_count) if (!dock_station_count)
return 0; return 0;
if (is_dock(handle)) if (acpi_dock_match(handle))
return 1; return 1;
list_for_each_entry(dock_station, &dock_stations, sibling) list_for_each_entry(dock_station, &dock_stations, sibling)
...@@ -359,10 +320,8 @@ static int dock_present(struct dock_station *ds) ...@@ -359,10 +320,8 @@ static int dock_present(struct dock_station *ds)
* handle if one does not exist already. This should cause * handle if one does not exist already. This should cause
* acpi to scan for drivers for the given devices, and call * acpi to scan for drivers for the given devices, and call
* matching driver's add routine. * matching driver's add routine.
*
* Returns a pointer to the acpi_device corresponding to the handle.
*/ */
static struct acpi_device * dock_create_acpi_device(acpi_handle handle) static void dock_create_acpi_device(acpi_handle handle)
{ {
struct acpi_device *device; struct acpi_device *device;
int ret; int ret;
...@@ -375,10 +334,7 @@ static struct acpi_device * dock_create_acpi_device(acpi_handle handle) ...@@ -375,10 +334,7 @@ static struct acpi_device * dock_create_acpi_device(acpi_handle handle)
ret = acpi_bus_scan(handle); ret = acpi_bus_scan(handle);
if (ret) if (ret)
pr_debug("error adding bus, %x\n", -ret); pr_debug("error adding bus, %x\n", -ret);
acpi_bus_get_device(handle, &device);
} }
return device;
} }
/** /**
...@@ -397,9 +353,29 @@ static void dock_remove_acpi_device(acpi_handle handle) ...@@ -397,9 +353,29 @@ static void dock_remove_acpi_device(acpi_handle handle)
} }
/** /**
* hotplug_dock_devices - insert or remove devices on the dock station * hot_remove_dock_devices - Remove dock station devices.
* @ds: Dock station.
*/
static void hot_remove_dock_devices(struct dock_station *ds)
{
struct dock_dependent_device *dd;
/*
* Walk the list in reverse order so that devices that have been added
* last are removed first (in case there are some indirect dependencies
* between them).
*/
list_for_each_entry_reverse(dd, &ds->dependent_devices, list)
dock_hotplug_event(dd, ACPI_NOTIFY_EJECT_REQUEST, false);
list_for_each_entry_reverse(dd, &ds->dependent_devices, list)
dock_remove_acpi_device(dd->handle);
}
/**
* hotplug_dock_devices - Insert devices on a dock station.
* @ds: the dock station * @ds: the dock station
* @event: either bus check or eject request * @event: either bus check or device check request
* *
* Some devices on the dock station need to have drivers called * Some devices on the dock station need to have drivers called
* to perform hotplug operations after a dock event has occurred. * to perform hotplug operations after a dock event has occurred.
...@@ -410,27 +386,21 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event) ...@@ -410,27 +386,21 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
{ {
struct dock_dependent_device *dd; struct dock_dependent_device *dd;
mutex_lock(&ds->hp_lock); /* Call driver specific post-dock fixups. */
list_for_each_entry(dd, &ds->dependent_devices, list)
dock_hotplug_event(dd, event, DOCK_CALL_FIXUP);
/* /* Call driver specific hotplug functions. */
* First call driver specific hotplug functions
*/
list_for_each_entry(dd, &ds->dependent_devices, list) list_for_each_entry(dd, &ds->dependent_devices, list)
dock_hotplug_event(dd, event, false); dock_hotplug_event(dd, event, DOCK_CALL_HANDLER);
/* /*
* Now make sure that an acpi_device is created for each * Now make sure that an acpi_device is created for each dependent
* dependent device, or removed if this is an eject request. * device. That will cause scan handlers to be attached to device
* This will cause acpi_drivers to be stopped/started if they * objects or acpi_drivers to be stopped/started if they are present.
* exist
*/ */
list_for_each_entry(dd, &ds->dependent_devices, list) { list_for_each_entry(dd, &ds->dependent_devices, list)
if (event == ACPI_NOTIFY_EJECT_REQUEST) dock_create_acpi_device(dd->handle);
dock_remove_acpi_device(dd->handle);
else
dock_create_acpi_device(dd->handle);
}
mutex_unlock(&ds->hp_lock);
} }
static void dock_event(struct dock_station *ds, u32 event, int num) static void dock_event(struct dock_station *ds, u32 event, int num)
...@@ -453,43 +423,12 @@ static void dock_event(struct dock_station *ds, u32 event, int num) ...@@ -453,43 +423,12 @@ static void dock_event(struct dock_station *ds, u32 event, int num)
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
list_for_each_entry(dd, &ds->dependent_devices, list) list_for_each_entry(dd, &ds->dependent_devices, list)
dock_hotplug_event(dd, event, true); dock_hotplug_event(dd, event, DOCK_CALL_UEVENT);
if (num != DOCK_EVENT) if (num != DOCK_EVENT)
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
} }
/**
* eject_dock - respond to a dock eject request
* @ds: the dock station
*
* This is called after _DCK is called, to execute the dock station's
* _EJ0 method.
*/
static void eject_dock(struct dock_station *ds)
{
struct acpi_object_list arg_list;
union acpi_object arg;
acpi_status status;
acpi_handle tmp;
/* all dock devices should have _EJ0, but check anyway */
status = acpi_get_handle(ds->handle, "_EJ0", &tmp);
if (ACPI_FAILURE(status)) {
pr_debug("No _EJ0 support for dock device\n");
return;
}
arg_list.count = 1;
arg_list.pointer = &arg;
arg.type = ACPI_TYPE_INTEGER;
arg.integer.value = 1;
status = acpi_evaluate_object(ds->handle, "_EJ0", &arg_list, NULL);
if (ACPI_FAILURE(status))
pr_debug("Failed to evaluate _EJ0!\n");
}
/** /**
* handle_dock - handle a dock event * handle_dock - handle a dock event
* @ds: the dock station * @ds: the dock station
...@@ -550,27 +489,6 @@ static inline void complete_undock(struct dock_station *ds) ...@@ -550,27 +489,6 @@ static inline void complete_undock(struct dock_station *ds)
ds->flags &= ~(DOCK_UNDOCKING); ds->flags &= ~(DOCK_UNDOCKING);
} }
static void dock_lock(struct dock_station *ds, int lock)
{
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 = !!lock;
status = acpi_evaluate_object(ds->handle, "_LCK", &arg_list, NULL);
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
if (lock)
acpi_handle_warn(ds->handle,
"Locking device failed (0x%x)\n", status);
else
acpi_handle_warn(ds->handle,
"Unlocking device failed (0x%x)\n", status);
}
}
/** /**
* dock_in_progress - see if we are in the middle of handling a dock event * dock_in_progress - see if we are in the middle of handling a dock event
* @ds: the dock station * @ds: the dock station
...@@ -587,37 +505,6 @@ static int dock_in_progress(struct dock_station *ds) ...@@ -587,37 +505,6 @@ static int dock_in_progress(struct dock_station *ds)
return 0; return 0;
} }
/**
* register_dock_notifier - add yourself to the dock notifier list
* @nb: the callers notifier block
*
* If a driver wishes to be notified about dock events, they can
* use this function to put a notifier block on the dock notifier list.
* this notifier call chain will be called after a dock event, but
* before hotplugging any new devices.
*/
int register_dock_notifier(struct notifier_block *nb)
{
if (!dock_station_count)
return -ENODEV;
return atomic_notifier_chain_register(&dock_notifier_list, nb);
}
EXPORT_SYMBOL_GPL(register_dock_notifier);
/**
* unregister_dock_notifier - remove yourself from the dock notifier list
* @nb: the callers notifier block
*/
void unregister_dock_notifier(struct notifier_block *nb)
{
if (!dock_station_count)
return;
atomic_notifier_chain_unregister(&dock_notifier_list, nb);
}
EXPORT_SYMBOL_GPL(unregister_dock_notifier);
/** /**
* register_hotplug_dock_device - register a hotplug function * register_hotplug_dock_device - register a hotplug function
* @handle: the handle of the device * @handle: the handle of the device
...@@ -703,10 +590,10 @@ static int handle_eject_request(struct dock_station *ds, u32 event) ...@@ -703,10 +590,10 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
*/ */
dock_event(ds, event, UNDOCK_EVENT); dock_event(ds, event, UNDOCK_EVENT);
hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST); hot_remove_dock_devices(ds);
undock(ds); undock(ds);
dock_lock(ds, 0); acpi_evaluate_lck(ds->handle, 0);
eject_dock(ds); acpi_evaluate_ej0(ds->handle);
if (dock_present(ds)) { if (dock_present(ds)) {
acpi_handle_err(ds->handle, "Unable to undock!\n"); acpi_handle_err(ds->handle, "Unable to undock!\n");
return -EBUSY; return -EBUSY;
...@@ -717,18 +604,17 @@ static int handle_eject_request(struct dock_station *ds, u32 event) ...@@ -717,18 +604,17 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
/** /**
* dock_notify - act upon an acpi dock notification * dock_notify - act upon an acpi dock notification
* @handle: the dock station handle * @ds: dock station
* @event: the acpi event * @event: the acpi event
* @data: our driver data struct
* *
* If we are notified to dock, then check to see if the dock is * If we are notified to dock, then check to see if the dock is
* present and then dock. Notify all drivers of the dock event, * present and then dock. Notify all drivers of the dock event,
* and then hotplug and devices that may need hotplugging. * and then hotplug and devices that may need hotplugging.
*/ */
static void dock_notify(acpi_handle handle, u32 event, void *data) static void dock_notify(struct dock_station *ds, u32 event)
{ {
struct dock_station *ds = data; acpi_handle handle = ds->handle;
struct acpi_device *tmp; struct acpi_device *ad;
int surprise_removal = 0; int surprise_removal = 0;
/* /*
...@@ -751,8 +637,7 @@ static void dock_notify(acpi_handle handle, u32 event, void *data) ...@@ -751,8 +637,7 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
switch (event) { switch (event) {
case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_BUS_CHECK:
case ACPI_NOTIFY_DEVICE_CHECK: case ACPI_NOTIFY_DEVICE_CHECK:
if (!dock_in_progress(ds) && acpi_bus_get_device(ds->handle, if (!dock_in_progress(ds) && acpi_bus_get_device(handle, &ad)) {
&tmp)) {
begin_dock(ds); begin_dock(ds);
dock(ds); dock(ds);
if (!dock_present(ds)) { if (!dock_present(ds)) {
...@@ -760,12 +645,10 @@ static void dock_notify(acpi_handle handle, u32 event, void *data) ...@@ -760,12 +645,10 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
complete_dock(ds); complete_dock(ds);
break; break;
} }
atomic_notifier_call_chain(&dock_notifier_list,
event, NULL);
hotplug_dock_devices(ds, event); hotplug_dock_devices(ds, event);
complete_dock(ds); complete_dock(ds);
dock_event(ds, event, DOCK_EVENT); dock_event(ds, event, DOCK_EVENT);
dock_lock(ds, 1); acpi_evaluate_lck(ds->handle, 1);
acpi_update_all_gpes(); acpi_update_all_gpes();
break; break;
} }
...@@ -789,9 +672,8 @@ static void dock_notify(acpi_handle handle, u32 event, void *data) ...@@ -789,9 +672,8 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
} }
struct dock_data { struct dock_data {
acpi_handle handle;
unsigned long event;
struct dock_station *ds; struct dock_station *ds;
u32 event;
}; };
static void acpi_dock_deferred_cb(void *context) static void acpi_dock_deferred_cb(void *context)
...@@ -799,52 +681,31 @@ static void acpi_dock_deferred_cb(void *context) ...@@ -799,52 +681,31 @@ static void acpi_dock_deferred_cb(void *context)
struct dock_data *data = context; struct dock_data *data = context;
acpi_scan_lock_acquire(); acpi_scan_lock_acquire();
dock_notify(data->handle, data->event, data->ds); dock_notify(data->ds, data->event);
acpi_scan_lock_release(); acpi_scan_lock_release();
kfree(data); kfree(data);
} }
static int acpi_dock_notifier_call(struct notifier_block *this, static void dock_notify_handler(acpi_handle handle, u32 event, void *data)
unsigned long event, void *data)
{ {
struct dock_station *dock_station; struct dock_data *dd;
acpi_handle handle = data;
if (event != ACPI_NOTIFY_BUS_CHECK && event != ACPI_NOTIFY_DEVICE_CHECK if (event != ACPI_NOTIFY_BUS_CHECK && event != ACPI_NOTIFY_DEVICE_CHECK
&& event != ACPI_NOTIFY_EJECT_REQUEST) && event != ACPI_NOTIFY_EJECT_REQUEST)
return 0; return;
acpi_scan_lock_acquire();
list_for_each_entry(dock_station, &dock_stations, sibling) {
if (dock_station->handle == handle) {
struct dock_data *dd;
acpi_status status;
dd = kmalloc(sizeof(*dd), GFP_KERNEL);
if (!dd)
break;
dd->handle = handle; dd = kmalloc(sizeof(*dd), GFP_KERNEL);
dd->event = event; if (dd) {
dd->ds = dock_station; acpi_status status;
status = acpi_os_hotplug_execute(acpi_dock_deferred_cb,
dd);
if (ACPI_FAILURE(status))
kfree(dd);
break; dd->ds = data;
} dd->event = event;
status = acpi_os_hotplug_execute(acpi_dock_deferred_cb, dd);
if (ACPI_FAILURE(status))
kfree(dd);
} }
acpi_scan_lock_release();
return 0;
} }
static struct notifier_block dock_acpi_notifier = {
.notifier_call = acpi_dock_notifier_call,
};
/** /**
* find_dock_devices - find devices on the dock station * find_dock_devices - find devices on the dock station
* @handle: the handle of the device we are examining * @handle: the handle of the device we are examining
...@@ -856,29 +717,16 @@ static struct notifier_block dock_acpi_notifier = { ...@@ -856,29 +717,16 @@ static struct notifier_block dock_acpi_notifier = {
* check to see if an object has an _EJD method. If it does, then it * check to see if an object has an _EJD method. If it does, then it
* will see if it is dependent on the dock station. * will see if it is dependent on the dock station.
*/ */
static acpi_status static acpi_status __init find_dock_devices(acpi_handle handle, u32 lvl,
find_dock_devices(acpi_handle handle, u32 lvl, void *context, void **rv) void *context, void **rv)
{ {
acpi_status status;
acpi_handle tmp, parent;
struct dock_station *ds = context; struct dock_station *ds = context;
acpi_handle ejd = NULL;
status = acpi_bus_get_ejd(handle, &tmp); acpi_bus_get_ejd(handle, &ejd);
if (ACPI_FAILURE(status)) { if (ejd == ds->handle)
/* try the parent device as well */
status = acpi_get_parent(handle, &parent);
if (ACPI_FAILURE(status))
goto fdd_out;
/* see if parent is dependent on dock */
status = acpi_bus_get_ejd(parent, &tmp);
if (ACPI_FAILURE(status))
goto fdd_out;
}
if (tmp == ds->handle)
add_dock_dependent_device(ds, handle); add_dock_dependent_device(ds, handle);
fdd_out:
return AE_OK; return AE_OK;
} }
...@@ -988,13 +836,13 @@ static struct attribute_group dock_attribute_group = { ...@@ -988,13 +836,13 @@ static struct attribute_group dock_attribute_group = {
*/ */
static int __init dock_add(acpi_handle handle) static int __init dock_add(acpi_handle handle)
{ {
int ret, id; struct dock_station *dock_station, ds = { NULL, };
struct dock_station ds, *dock_station;
struct platform_device *dd; struct platform_device *dd;
acpi_status status;
int ret;
id = dock_station_count; dd = platform_device_register_data(NULL, "dock", dock_station_count,
memset(&ds, 0, sizeof(ds)); &ds, sizeof(ds));
dd = platform_device_register_data(NULL, "dock", id, &ds, sizeof(ds));
if (IS_ERR(dd)) if (IS_ERR(dd))
return PTR_ERR(dd); return PTR_ERR(dd);
...@@ -1004,18 +852,15 @@ static int __init dock_add(acpi_handle handle) ...@@ -1004,18 +852,15 @@ static int __init dock_add(acpi_handle handle)
dock_station->dock_device = dd; dock_station->dock_device = dd;
dock_station->last_dock_time = jiffies - HZ; dock_station->last_dock_time = jiffies - HZ;
mutex_init(&dock_station->hp_lock);
spin_lock_init(&dock_station->dd_lock);
INIT_LIST_HEAD(&dock_station->sibling); INIT_LIST_HEAD(&dock_station->sibling);
ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list);
INIT_LIST_HEAD(&dock_station->dependent_devices); INIT_LIST_HEAD(&dock_station->dependent_devices);
/* we want the dock device to send uevents */ /* we want the dock device to send uevents */
dev_set_uevent_suppress(&dd->dev, 0); dev_set_uevent_suppress(&dd->dev, 0);
if (is_dock(handle)) if (acpi_dock_match(handle))
dock_station->flags |= DOCK_IS_DOCK; dock_station->flags |= DOCK_IS_DOCK;
if (is_ata(handle)) if (acpi_ata_match(handle))
dock_station->flags |= DOCK_IS_ATA; dock_station->flags |= DOCK_IS_ATA;
if (is_battery(handle)) if (is_battery(handle))
dock_station->flags |= DOCK_IS_BAT; dock_station->flags |= DOCK_IS_BAT;
...@@ -1034,11 +879,17 @@ static int __init dock_add(acpi_handle handle) ...@@ -1034,11 +879,17 @@ static int __init dock_add(acpi_handle handle)
if (ret) if (ret)
goto err_rmgroup; goto err_rmgroup;
status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
dock_notify_handler, dock_station);
if (ACPI_FAILURE(status))
goto err_rmgroup;
dock_station_count++; dock_station_count++;
list_add(&dock_station->sibling, &dock_stations); list_add(&dock_station->sibling, &dock_stations);
return 0; return 0;
err_rmgroup: err_rmgroup:
remove_dock_dependent_devices(dock_station);
sysfs_remove_group(&dd->dev.kobj, &dock_attribute_group); sysfs_remove_group(&dd->dev.kobj, &dock_attribute_group);
err_unregister: err_unregister:
platform_device_unregister(dd); platform_device_unregister(dd);
...@@ -1058,7 +909,7 @@ static int __init dock_add(acpi_handle handle) ...@@ -1058,7 +909,7 @@ static int __init dock_add(acpi_handle handle)
static __init acpi_status static __init acpi_status
find_dock_and_bay(acpi_handle handle, u32 lvl, void *context, void **rv) find_dock_and_bay(acpi_handle handle, u32 lvl, void *context, void **rv)
{ {
if (is_dock(handle) || is_ejectable_bay(handle)) if (acpi_dock_match(handle) || is_ejectable_bay(handle))
dock_add(handle); dock_add(handle);
return AE_OK; return AE_OK;
...@@ -1078,7 +929,6 @@ void __init acpi_dock_init(void) ...@@ -1078,7 +929,6 @@ void __init acpi_dock_init(void)
return; return;
} }
register_acpi_bus_notifier(&dock_acpi_notifier);
pr_info(PREFIX "%s: %d docks/bays found\n", pr_info(PREFIX "%s: %d docks/bays found\n",
ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count); ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count);
} }
...@@ -1049,10 +1049,8 @@ int __init acpi_ec_ecdt_probe(void) ...@@ -1049,10 +1049,8 @@ int __init acpi_ec_ecdt_probe(void)
* which needs it, has fake EC._INI method, so use it as flag. * which needs it, has fake EC._INI method, so use it as flag.
* Keep boot_ec struct as it will be needed soon. * Keep boot_ec struct as it will be needed soon.
*/ */
acpi_handle dummy;
if (!dmi_name_in_vendors("ASUS") || if (!dmi_name_in_vendors("ASUS") ||
ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", !acpi_has_method(boot_ec->handle, "_INI"))
&dummy)))
return -ENODEV; return -ENODEV;
} }
install: install:
......
...@@ -637,9 +637,7 @@ int acpi_device_sleep_wake(struct acpi_device *dev, ...@@ -637,9 +637,7 @@ int acpi_device_sleep_wake(struct acpi_device *dev,
} }
/* Execute _PSW */ /* Execute _PSW */
arg_list.count = 1; status = acpi_execute_simple_method(dev->handle, "_PSW", enable);
in_arg[0].integer.value = enable;
status = acpi_evaluate_object(dev->handle, "_PSW", &arg_list, NULL);
if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {
printk(KERN_ERR PREFIX "_PSW execution failed\n"); printk(KERN_ERR PREFIX "_PSW execution failed\n");
dev->wakeup.flags.valid = 0; dev->wakeup.flags.valid = 0;
......
...@@ -164,17 +164,12 @@ static void acpi_processor_ppc_ost(acpi_handle handle, int status) ...@@ -164,17 +164,12 @@ static void acpi_processor_ppc_ost(acpi_handle handle, int status)
{.type = ACPI_TYPE_INTEGER,}, {.type = ACPI_TYPE_INTEGER,},
}; };
struct acpi_object_list arg_list = {2, params}; struct acpi_object_list arg_list = {2, params};
acpi_handle temp;
params[0].integer.value = ACPI_PROCESSOR_NOTIFY_PERFORMANCE; if (acpi_has_method(handle, "_OST")) {
params[1].integer.value = status; params[0].integer.value = ACPI_PROCESSOR_NOTIFY_PERFORMANCE;
params[1].integer.value = status;
/* when there is no _OST , skip it */ acpi_evaluate_object(handle, "_OST", &arg_list, NULL);
if (ACPI_FAILURE(acpi_get_handle(handle, "_OST", &temp))) }
return;
acpi_evaluate_object(handle, "_OST", &arg_list, NULL);
return;
} }
int acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag) int acpi_processor_ppc_has_changed(struct acpi_processor *pr, int event_flag)
...@@ -468,14 +463,11 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr) ...@@ -468,14 +463,11 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)
int acpi_processor_get_performance_info(struct acpi_processor *pr) int acpi_processor_get_performance_info(struct acpi_processor *pr)
{ {
int result = 0; int result = 0;
acpi_status status = AE_OK;
acpi_handle handle = NULL;
if (!pr || !pr->performance || !pr->handle) if (!pr || !pr->performance || !pr->handle)
return -EINVAL; return -EINVAL;
status = acpi_get_handle(pr->handle, "_PCT", &handle); if (!acpi_has_method(pr->handle, "_PCT")) {
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"ACPI-based processor performance control unavailable\n")); "ACPI-based processor performance control unavailable\n"));
return -ENODEV; return -ENODEV;
...@@ -501,7 +493,7 @@ int acpi_processor_get_performance_info(struct acpi_processor *pr) ...@@ -501,7 +493,7 @@ int acpi_processor_get_performance_info(struct acpi_processor *pr)
*/ */
update_bios: update_bios:
#ifdef CONFIG_X86 #ifdef CONFIG_X86
if (ACPI_SUCCESS(acpi_get_handle(pr->handle, "_PPC", &handle))){ if (acpi_has_method(pr->handle, "_PPC")) {
if(boot_cpu_has(X86_FEATURE_EST)) if(boot_cpu_has(X86_FEATURE_EST))
printk(KERN_WARNING FW_BUG "BIOS needs update for CPU " printk(KERN_WARNING FW_BUG "BIOS needs update for CPU "
"frequency support\n"); "frequency support\n");
......
...@@ -505,14 +505,12 @@ int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list, ...@@ -505,14 +505,12 @@ int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list,
void *preproc_data) void *preproc_data)
{ {
struct res_proc_context c; struct res_proc_context c;
acpi_handle not_used;
acpi_status status; acpi_status status;
if (!adev || !adev->handle || !list_empty(list)) if (!adev || !adev->handle || !list_empty(list))
return -EINVAL; return -EINVAL;
status = acpi_get_handle(adev->handle, METHOD_NAME__CRS, &not_used); if (!acpi_has_method(adev->handle, METHOD_NAME__CRS))
if (ACPI_FAILURE(status))
return 0; return 0;
c.list = list; c.list = list;
......
...@@ -193,9 +193,6 @@ static acpi_status acpi_bus_online_companions(acpi_handle handle, u32 lvl, ...@@ -193,9 +193,6 @@ static acpi_status acpi_bus_online_companions(acpi_handle handle, u32 lvl,
static int acpi_scan_hot_remove(struct acpi_device *device) static int acpi_scan_hot_remove(struct acpi_device *device)
{ {
acpi_handle handle = device->handle; acpi_handle handle = device->handle;
acpi_handle not_used;
struct acpi_object_list arg_list;
union acpi_object arg;
struct device *errdev; struct device *errdev;
acpi_status status; acpi_status status;
unsigned long long sta; unsigned long long sta;
...@@ -258,32 +255,15 @@ static int acpi_scan_hot_remove(struct acpi_device *device) ...@@ -258,32 +255,15 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
put_device(&device->dev); put_device(&device->dev);
device = NULL; device = NULL;
if (ACPI_SUCCESS(acpi_get_handle(handle, "_LCK", &not_used))) { acpi_evaluate_lck(handle, 0);
arg_list.count = 1;
arg_list.pointer = &arg;
arg.type = ACPI_TYPE_INTEGER;
arg.integer.value = 0;
acpi_evaluate_object(handle, "_LCK", &arg_list, NULL);
}
arg_list.count = 1;
arg_list.pointer = &arg;
arg.type = ACPI_TYPE_INTEGER;
arg.integer.value = 1;
/* /*
* TBD: _EJD support. * TBD: _EJD support.
*/ */
status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL); status = acpi_evaluate_ej0(handle);
if (ACPI_FAILURE(status)) { if (status == AE_NOT_FOUND)
if (status == AE_NOT_FOUND) { return -ENODEV;
return -ENODEV; else if (ACPI_FAILURE(status))
} else { return -EIO;
acpi_handle_warn(handle, "Eject failed (0x%x)\n",
status);
return -EIO;
}
}
/* /*
* Verify if eject was indeed successful. If not, log an error * Verify if eject was indeed successful. If not, log an error
...@@ -654,7 +634,6 @@ static int acpi_device_setup_files(struct acpi_device *dev) ...@@ -654,7 +634,6 @@ static int acpi_device_setup_files(struct acpi_device *dev)
{ {
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
acpi_status status; acpi_status status;
acpi_handle temp;
unsigned long long sun; unsigned long long sun;
int result = 0; int result = 0;
...@@ -680,8 +659,7 @@ static int acpi_device_setup_files(struct acpi_device *dev) ...@@ -680,8 +659,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
/* /*
* If device has _STR, 'description' file is created * If device has _STR, 'description' file is created
*/ */
status = acpi_get_handle(dev->handle, "_STR", &temp); if (acpi_has_method(dev->handle, "_STR")) {
if (ACPI_SUCCESS(status)) {
status = acpi_evaluate_object(dev->handle, "_STR", status = acpi_evaluate_object(dev->handle, "_STR",
NULL, &buffer); NULL, &buffer);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
...@@ -711,8 +689,7 @@ static int acpi_device_setup_files(struct acpi_device *dev) ...@@ -711,8 +689,7 @@ static int acpi_device_setup_files(struct acpi_device *dev)
* If device has _EJ0, 'eject' file is created that is used to trigger * If device has _EJ0, 'eject' file is created that is used to trigger
* hot-removal function from userland. * hot-removal function from userland.
*/ */
status = acpi_get_handle(dev->handle, "_EJ0", &temp); if (acpi_has_method(dev->handle, "_EJ0")) {
if (ACPI_SUCCESS(status)) {
result = device_create_file(&dev->dev, &dev_attr_eject); result = device_create_file(&dev->dev, &dev_attr_eject);
if (result) if (result)
return result; return result;
...@@ -734,9 +711,6 @@ static int acpi_device_setup_files(struct acpi_device *dev) ...@@ -734,9 +711,6 @@ static int acpi_device_setup_files(struct acpi_device *dev)
static void acpi_device_remove_files(struct acpi_device *dev) static void acpi_device_remove_files(struct acpi_device *dev)
{ {
acpi_status status;
acpi_handle temp;
if (dev->flags.power_manageable) { if (dev->flags.power_manageable) {
device_remove_file(&dev->dev, &dev_attr_power_state); device_remove_file(&dev->dev, &dev_attr_power_state);
if (dev->power.flags.power_resources) if (dev->power.flags.power_resources)
...@@ -747,20 +721,17 @@ static void acpi_device_remove_files(struct acpi_device *dev) ...@@ -747,20 +721,17 @@ static void acpi_device_remove_files(struct acpi_device *dev)
/* /*
* If device has _STR, remove 'description' file * If device has _STR, remove 'description' file
*/ */
status = acpi_get_handle(dev->handle, "_STR", &temp); if (acpi_has_method(dev->handle, "_STR")) {
if (ACPI_SUCCESS(status)) {
kfree(dev->pnp.str_obj); kfree(dev->pnp.str_obj);
device_remove_file(&dev->dev, &dev_attr_description); device_remove_file(&dev->dev, &dev_attr_description);
} }
/* /*
* If device has _EJ0, remove 'eject' file. * If device has _EJ0, remove 'eject' file.
*/ */
status = acpi_get_handle(dev->handle, "_EJ0", &temp); if (acpi_has_method(dev->handle, "_EJ0"))
if (ACPI_SUCCESS(status))
device_remove_file(&dev->dev, &dev_attr_eject); device_remove_file(&dev->dev, &dev_attr_eject);
status = acpi_get_handle(dev->handle, "_SUN", &temp); if (acpi_has_method(dev->handle, "_SUN"))
if (ACPI_SUCCESS(status))
device_remove_file(&dev->dev, &dev_attr_sun); device_remove_file(&dev->dev, &dev_attr_sun);
if (dev->pnp.unique_id) if (dev->pnp.unique_id)
...@@ -1336,13 +1307,10 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device) ...@@ -1336,13 +1307,10 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device) static void acpi_bus_get_wakeup_device_flags(struct acpi_device *device)
{ {
acpi_handle temp;
acpi_status status = 0;
int err; int err;
/* Presence of _PRW indicates wake capable */ /* Presence of _PRW indicates wake capable */
status = acpi_get_handle(device->handle, "_PRW", &temp); if (!acpi_has_method(device->handle, "_PRW"))
if (ACPI_FAILURE(status))
return; return;
err = acpi_bus_extract_wakeup_device_power_package(device->handle, err = acpi_bus_extract_wakeup_device_power_package(device->handle,
...@@ -1372,7 +1340,6 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state) ...@@ -1372,7 +1340,6 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
struct acpi_device_power_state *ps = &device->power.states[state]; struct acpi_device_power_state *ps = &device->power.states[state];
char pathname[5] = { '_', 'P', 'R', '0' + state, '\0' }; char pathname[5] = { '_', 'P', 'R', '0' + state, '\0' };
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
acpi_handle handle;
acpi_status status; acpi_status status;
INIT_LIST_HEAD(&ps->resources); INIT_LIST_HEAD(&ps->resources);
...@@ -1395,8 +1362,7 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state) ...@@ -1395,8 +1362,7 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
/* Evaluate "_PSx" to see if we can do explicit sets */ /* Evaluate "_PSx" to see if we can do explicit sets */
pathname[2] = 'S'; pathname[2] = 'S';
status = acpi_get_handle(device->handle, pathname, &handle); if (acpi_has_method(device->handle, pathname))
if (ACPI_SUCCESS(status))
ps->flags.explicit_set = 1; ps->flags.explicit_set = 1;
/* /*
...@@ -1415,28 +1381,21 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state) ...@@ -1415,28 +1381,21 @@ static void acpi_bus_init_power_state(struct acpi_device *device, int state)
static void acpi_bus_get_power_flags(struct acpi_device *device) static void acpi_bus_get_power_flags(struct acpi_device *device)
{ {
acpi_status status;
acpi_handle handle;
u32 i; u32 i;
/* Presence of _PS0|_PR0 indicates 'power manageable' */ /* Presence of _PS0|_PR0 indicates 'power manageable' */
status = acpi_get_handle(device->handle, "_PS0", &handle); if (!acpi_has_method(device->handle, "_PS0") &&
if (ACPI_FAILURE(status)) { !acpi_has_method(device->handle, "_PR0"))
status = acpi_get_handle(device->handle, "_PR0", &handle); return;
if (ACPI_FAILURE(status))
return;
}
device->flags.power_manageable = 1; device->flags.power_manageable = 1;
/* /*
* Power Management Flags * Power Management Flags
*/ */
status = acpi_get_handle(device->handle, "_PSC", &handle); if (acpi_has_method(device->handle, "_PSC"))
if (ACPI_SUCCESS(status))
device->power.flags.explicit_get = 1; device->power.flags.explicit_get = 1;
status = acpi_get_handle(device->handle, "_IRC", &handle); if (acpi_has_method(device->handle, "_IRC"))
if (ACPI_SUCCESS(status))
device->power.flags.inrush_current = 1; device->power.flags.inrush_current = 1;
/* /*
...@@ -1470,28 +1429,18 @@ static void acpi_bus_get_power_flags(struct acpi_device *device) ...@@ -1470,28 +1429,18 @@ static void acpi_bus_get_power_flags(struct acpi_device *device)
static void acpi_bus_get_flags(struct acpi_device *device) static void acpi_bus_get_flags(struct acpi_device *device)
{ {
acpi_status status = AE_OK;
acpi_handle temp = NULL;
/* Presence of _STA indicates 'dynamic_status' */ /* Presence of _STA indicates 'dynamic_status' */
status = acpi_get_handle(device->handle, "_STA", &temp); if (acpi_has_method(device->handle, "_STA"))
if (ACPI_SUCCESS(status))
device->flags.dynamic_status = 1; device->flags.dynamic_status = 1;
/* Presence of _RMV indicates 'removable' */ /* Presence of _RMV indicates 'removable' */
status = acpi_get_handle(device->handle, "_RMV", &temp); if (acpi_has_method(device->handle, "_RMV"))
if (ACPI_SUCCESS(status))
device->flags.removable = 1; device->flags.removable = 1;
/* Presence of _EJD|_EJ0 indicates 'ejectable' */ /* Presence of _EJD|_EJ0 indicates 'ejectable' */
status = acpi_get_handle(device->handle, "_EJD", &temp); if (acpi_has_method(device->handle, "_EJD") ||
if (ACPI_SUCCESS(status)) acpi_has_method(device->handle, "_EJ0"))
device->flags.ejectable = 1; device->flags.ejectable = 1;
else {
status = acpi_get_handle(device->handle, "_EJ0", &temp);
if (ACPI_SUCCESS(status))
device->flags.ejectable = 1;
}
} }
static void acpi_device_get_busid(struct acpi_device *device) static void acpi_device_get_busid(struct acpi_device *device)
...@@ -1532,47 +1481,46 @@ static void acpi_device_get_busid(struct acpi_device *device) ...@@ -1532,47 +1481,46 @@ static void acpi_device_get_busid(struct acpi_device *device)
} }
} }
/*
* acpi_ata_match - see if an acpi object is an ATA device
*
* If an acpi object has one of the ACPI ATA methods defined,
* then we can safely call it an ATA device.
*/
bool acpi_ata_match(acpi_handle handle)
{
return acpi_has_method(handle, "_GTF") ||
acpi_has_method(handle, "_GTM") ||
acpi_has_method(handle, "_STM") ||
acpi_has_method(handle, "_SDD");
}
/* /*
* acpi_bay_match - see if an acpi object is an ejectable driver bay * acpi_bay_match - see if an acpi object is an ejectable driver bay
* *
* If an acpi object is ejectable and has one of the ACPI ATA methods defined, * If an acpi object is ejectable and has one of the ACPI ATA methods defined,
* then we can safely call it an ejectable drive bay * then we can safely call it an ejectable drive bay
*/ */
static int acpi_bay_match(acpi_handle handle) bool acpi_bay_match(acpi_handle handle)
{ {
acpi_status status;
acpi_handle tmp;
acpi_handle phandle; acpi_handle phandle;
status = acpi_get_handle(handle, "_EJ0", &tmp); if (!acpi_has_method(handle, "_EJ0"))
if (ACPI_FAILURE(status)) return false;
return -ENODEV; if (acpi_ata_match(handle))
return true;
if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) || if (ACPI_FAILURE(acpi_get_parent(handle, &phandle)))
(ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) || return false;
(ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) ||
(ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp))))
return 0;
if (acpi_get_parent(handle, &phandle))
return -ENODEV;
if ((ACPI_SUCCESS(acpi_get_handle(phandle, "_GTF", &tmp))) || return acpi_ata_match(phandle);
(ACPI_SUCCESS(acpi_get_handle(phandle, "_GTM", &tmp))) ||
(ACPI_SUCCESS(acpi_get_handle(phandle, "_STM", &tmp))) ||
(ACPI_SUCCESS(acpi_get_handle(phandle, "_SDD", &tmp))))
return 0;
return -ENODEV;
} }
/* /*
* acpi_dock_match - see if an acpi object has a _DCK method * acpi_dock_match - see if an acpi object has a _DCK method
*/ */
static int acpi_dock_match(acpi_handle handle) bool acpi_dock_match(acpi_handle handle)
{ {
acpi_handle tmp; return acpi_has_method(handle, "_DCK");
return acpi_get_handle(handle, "_DCK", &tmp);
} }
const char *acpi_device_hid(struct acpi_device *device) const char *acpi_device_hid(struct acpi_device *device)
...@@ -1610,34 +1558,26 @@ static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id) ...@@ -1610,34 +1558,26 @@ static void acpi_add_id(struct acpi_device_pnp *pnp, const char *dev_id)
* lacks the SMBUS01 HID and the methods do not have the necessary "_" * lacks the SMBUS01 HID and the methods do not have the necessary "_"
* prefix. Work around this. * prefix. Work around this.
*/ */
static int acpi_ibm_smbus_match(acpi_handle handle) static bool acpi_ibm_smbus_match(acpi_handle handle)
{ {
acpi_handle h_dummy; char node_name[ACPI_PATH_SEGMENT_LENGTH];
struct acpi_buffer path = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer path = { sizeof(node_name), node_name };
int result;
if (!dmi_name_in_vendors("IBM")) if (!dmi_name_in_vendors("IBM"))
return -ENODEV; return false;
/* Look for SMBS object */ /* Look for SMBS object */
result = acpi_get_name(handle, ACPI_SINGLE_NAME, &path); if (ACPI_FAILURE(acpi_get_name(handle, ACPI_SINGLE_NAME, &path)) ||
if (result) strcmp("SMBS", path.pointer))
return result; return false;
if (strcmp("SMBS", path.pointer)) {
result = -ENODEV;
goto out;
}
/* Does it have the necessary (but misnamed) methods? */ /* Does it have the necessary (but misnamed) methods? */
result = -ENODEV; if (acpi_has_method(handle, "SBI") &&
if (ACPI_SUCCESS(acpi_get_handle(handle, "SBI", &h_dummy)) && acpi_has_method(handle, "SBR") &&
ACPI_SUCCESS(acpi_get_handle(handle, "SBR", &h_dummy)) && acpi_has_method(handle, "SBW"))
ACPI_SUCCESS(acpi_get_handle(handle, "SBW", &h_dummy))) return true;
result = 0;
out: return false;
kfree(path.pointer);
return result;
} }
static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp, static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
...@@ -1685,11 +1625,11 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp, ...@@ -1685,11 +1625,11 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
*/ */
if (acpi_is_video_device(handle)) if (acpi_is_video_device(handle))
acpi_add_id(pnp, ACPI_VIDEO_HID); acpi_add_id(pnp, ACPI_VIDEO_HID);
else if (ACPI_SUCCESS(acpi_bay_match(handle))) else if (acpi_bay_match(handle))
acpi_add_id(pnp, ACPI_BAY_HID); acpi_add_id(pnp, ACPI_BAY_HID);
else if (ACPI_SUCCESS(acpi_dock_match(handle))) else if (acpi_dock_match(handle))
acpi_add_id(pnp, ACPI_DOCK_HID); acpi_add_id(pnp, ACPI_DOCK_HID);
else if (!acpi_ibm_smbus_match(handle)) else if (acpi_ibm_smbus_match(handle))
acpi_add_id(pnp, ACPI_SMBUS_IBM_HID); acpi_add_id(pnp, ACPI_SMBUS_IBM_HID);
else if (list_empty(&pnp->ids) && handle == ACPI_ROOT_OBJECT) { else if (list_empty(&pnp->ids) && handle == ACPI_ROOT_OBJECT) {
acpi_add_id(pnp, ACPI_BUS_HID); /* \_SB, LNXSYBUS */ acpi_add_id(pnp, ACPI_BUS_HID); /* \_SB, LNXSYBUS */
...@@ -1900,7 +1840,6 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used, ...@@ -1900,7 +1840,6 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
struct acpi_device *device = NULL; struct acpi_device *device = NULL;
int type; int type;
unsigned long long sta; unsigned long long sta;
acpi_status status;
int result; int result;
acpi_bus_get_device(handle, &device); acpi_bus_get_device(handle, &device);
...@@ -1921,10 +1860,8 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used, ...@@ -1921,10 +1860,8 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
if (!(sta & ACPI_STA_DEVICE_PRESENT) && if (!(sta & ACPI_STA_DEVICE_PRESENT) &&
!(sta & ACPI_STA_DEVICE_FUNCTIONING)) { !(sta & ACPI_STA_DEVICE_FUNCTIONING)) {
struct acpi_device_wakeup wakeup; struct acpi_device_wakeup wakeup;
acpi_handle temp;
status = acpi_get_handle(handle, "_PRW", &temp); if (acpi_has_method(handle, "_PRW")) {
if (ACPI_SUCCESS(status)) {
acpi_bus_extract_wakeup_device_power_package(handle, acpi_bus_extract_wakeup_device_power_package(handle,
&wakeup); &wakeup);
acpi_power_resources_list_free(&wakeup.resources); acpi_power_resources_list_free(&wakeup.resources);
......
...@@ -31,12 +31,9 @@ static u8 sleep_states[ACPI_S_STATE_COUNT]; ...@@ -31,12 +31,9 @@ static u8 sleep_states[ACPI_S_STATE_COUNT];
static void acpi_sleep_tts_switch(u32 acpi_state) static void acpi_sleep_tts_switch(u32 acpi_state)
{ {
union acpi_object in_arg = { ACPI_TYPE_INTEGER }; acpi_status status;
struct acpi_object_list arg_list = { 1, &in_arg };
acpi_status status = AE_OK;
in_arg.integer.value = acpi_state; status = acpi_execute_simple_method(NULL, "\\_TTS", acpi_state);
status = acpi_evaluate_object(NULL, "\\_TTS", &arg_list, NULL);
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
/* /*
* OS can't evaluate the _TTS object correctly. Some warning * OS can't evaluate the _TTS object correctly. Some warning
......
...@@ -239,26 +239,16 @@ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz) ...@@ -239,26 +239,16 @@ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
static int acpi_thermal_set_cooling_mode(struct acpi_thermal *tz, int mode) static int acpi_thermal_set_cooling_mode(struct acpi_thermal *tz, int mode)
{ {
acpi_status status = AE_OK;
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
struct acpi_object_list arg_list = { 1, &arg0 };
acpi_handle handle = NULL;
if (!tz) if (!tz)
return -EINVAL; return -EINVAL;
status = acpi_get_handle(tz->device->handle, "_SCP", &handle); if (!acpi_has_method(tz->device->handle, "_SCP")) {
if (ACPI_FAILURE(status)) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "_SCP not present\n")); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "_SCP not present\n"));
return -ENODEV; return -ENODEV;
} } else if (ACPI_FAILURE(acpi_execute_simple_method(tz->device->handle,
"_SCP", mode))) {
arg0.integer.value = mode;
status = acpi_evaluate_object(handle, NULL, &arg_list, NULL);
if (ACPI_FAILURE(status))
return -ENODEV; return -ENODEV;
}
return 0; return 0;
} }
......
...@@ -495,3 +495,73 @@ acpi_handle_printk(const char *level, acpi_handle handle, const char *fmt, ...) ...@@ -495,3 +495,73 @@ acpi_handle_printk(const char *level, acpi_handle handle, const char *fmt, ...)
kfree(buffer.pointer); kfree(buffer.pointer);
} }
EXPORT_SYMBOL(acpi_handle_printk); EXPORT_SYMBOL(acpi_handle_printk);
/**
* acpi_has_method: Check whether @handle has a method named @name
* @handle: ACPI device handle
* @name: name of object or method
*
* Check whether @handle has a method named @name.
*/
bool acpi_has_method(acpi_handle handle, char *name)
{
acpi_handle tmp;
return ACPI_SUCCESS(acpi_get_handle(handle, name, &tmp));
}
EXPORT_SYMBOL(acpi_has_method);
acpi_status acpi_execute_simple_method(acpi_handle handle, char *method,
u64 arg)
{
union acpi_object obj = { .type = ACPI_TYPE_INTEGER };
struct acpi_object_list arg_list = { .count = 1, .pointer = &obj, };
obj.integer.value = arg;
return acpi_evaluate_object(handle, method, &arg_list, NULL);
}
EXPORT_SYMBOL(acpi_execute_simple_method);
/**
* acpi_evaluate_ej0: Evaluate _EJ0 method for hotplug operations
* @handle: ACPI device handle
*
* Evaluate device's _EJ0 method for hotplug operations.
*/
acpi_status acpi_evaluate_ej0(acpi_handle handle)
{
acpi_status status;
status = acpi_execute_simple_method(handle, "_EJ0", 1);
if (status == AE_NOT_FOUND)
acpi_handle_warn(handle, "No _EJ0 support for device\n");
else if (ACPI_FAILURE(status))
acpi_handle_warn(handle, "Eject failed (0x%x)\n", status);
return status;
}
/**
* acpi_evaluate_lck: Evaluate _LCK method to lock/unlock device
* @handle: ACPI device handle
* @lock: lock device if non-zero, otherwise unlock device
*
* Evaluate device's _LCK method if present to lock/unlock device
*/
acpi_status acpi_evaluate_lck(acpi_handle handle, int lock)
{
acpi_status status;
status = acpi_execute_simple_method(handle, "_LCK", !!lock);
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
if (lock)
acpi_handle_warn(handle,
"Locking device failed (0x%x)\n", status);
else
acpi_handle_warn(handle,
"Unlocking device failed (0x%x)\n", status);
}
return status;
}
...@@ -355,14 +355,10 @@ static int ...@@ -355,14 +355,10 @@ static int
acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level) acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
{ {
int status; int status;
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
struct acpi_object_list args = { 1, &arg0 };
int state; int state;
arg0.integer.value = level; status = acpi_execute_simple_method(device->dev->handle,
"_BCM", level);
status = acpi_evaluate_object(device->dev->handle, "_BCM",
&args, NULL);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_ERROR((AE_INFO, "Evaluating _BCM failed")); ACPI_ERROR((AE_INFO, "Evaluating _BCM failed"));
return -EIO; return -EIO;
...@@ -638,18 +634,15 @@ static int ...@@ -638,18 +634,15 @@ static int
acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag) acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
{ {
acpi_status status; acpi_status status;
union acpi_object arg0 = { ACPI_TYPE_INTEGER };
struct acpi_object_list args = { 1, &arg0 };
if (!video->cap._DOS) if (!video->cap._DOS)
return 0; return 0;
if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1) if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1)
return -EINVAL; return -EINVAL;
arg0.integer.value = (lcd_flag << 2) | bios_flag; video->dos_setting = (lcd_flag << 2) | bios_flag;
video->dos_setting = arg0.integer.value; status = acpi_execute_simple_method(video->device->handle, "_DOS",
status = acpi_evaluate_object(video->device->handle, "_DOS", (lcd_flag << 2) | bios_flag);
&args, NULL);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -EIO; return -EIO;
...@@ -885,28 +878,21 @@ acpi_video_init_brightness(struct acpi_video_device *device) ...@@ -885,28 +878,21 @@ acpi_video_init_brightness(struct acpi_video_device *device)
static void acpi_video_device_find_cap(struct acpi_video_device *device) static void acpi_video_device_find_cap(struct acpi_video_device *device)
{ {
acpi_handle h_dummy1; if (acpi_has_method(device->dev->handle, "_ADR"))
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_ADR", &h_dummy1))) {
device->cap._ADR = 1; device->cap._ADR = 1;
} if (acpi_has_method(device->dev->handle, "_BCL"))
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCL", &h_dummy1))) {
device->cap._BCL = 1; device->cap._BCL = 1;
} if (acpi_has_method(device->dev->handle, "_BCM"))
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCM", &h_dummy1))) {
device->cap._BCM = 1; device->cap._BCM = 1;
} if (acpi_has_method(device->dev->handle, "_BQC")) {
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle,"_BQC",&h_dummy1)))
device->cap._BQC = 1; device->cap._BQC = 1;
else if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_BCQ", } else if (acpi_has_method(device->dev->handle, "_BCQ")) {
&h_dummy1))) {
printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n"); printk(KERN_WARNING FW_BUG "_BCQ is used instead of _BQC\n");
device->cap._BCQ = 1; device->cap._BCQ = 1;
} }
if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_DDC", &h_dummy1))) { if (acpi_has_method(device->dev->handle, "_DDC"))
device->cap._DDC = 1; device->cap._DDC = 1;
}
if (acpi_video_init_brightness(device)) if (acpi_video_init_brightness(device))
return; return;
...@@ -999,26 +985,18 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) ...@@ -999,26 +985,18 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
static void acpi_video_bus_find_cap(struct acpi_video_bus *video) static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
{ {
acpi_handle h_dummy1; if (acpi_has_method(video->device->handle, "_DOS"))
if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_DOS", &h_dummy1))) {
video->cap._DOS = 1; video->cap._DOS = 1;
} if (acpi_has_method(video->device->handle, "_DOD"))
if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_DOD", &h_dummy1))) {
video->cap._DOD = 1; video->cap._DOD = 1;
} if (acpi_has_method(video->device->handle, "_ROM"))
if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_ROM", &h_dummy1))) {
video->cap._ROM = 1; video->cap._ROM = 1;
} if (acpi_has_method(video->device->handle, "_GPD"))
if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_GPD", &h_dummy1))) {
video->cap._GPD = 1; video->cap._GPD = 1;
} if (acpi_has_method(video->device->handle, "_SPD"))
if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_SPD", &h_dummy1))) {
video->cap._SPD = 1; video->cap._SPD = 1;
} if (acpi_has_method(video->device->handle, "_VPO"))
if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_VPO", &h_dummy1))) {
video->cap._VPO = 1; video->cap._VPO = 1;
}
} }
/* /*
......
...@@ -53,14 +53,13 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context, ...@@ -53,14 +53,13 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
void **retyurn_value) void **retyurn_value)
{ {
long *cap = context; long *cap = context;
acpi_handle h_dummy;
if (ACPI_SUCCESS(acpi_get_handle(handle, "_BCM", &h_dummy)) && if (acpi_has_method(handle, "_BCM") &&
ACPI_SUCCESS(acpi_get_handle(handle, "_BCL", &h_dummy))) { acpi_has_method(handle, "_BCL")) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight " ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight "
"support\n")); "support\n"));
*cap |= ACPI_VIDEO_BACKLIGHT; *cap |= ACPI_VIDEO_BACKLIGHT;
if (ACPI_FAILURE(acpi_get_handle(handle, "_BQC", &h_dummy))) if (!acpi_has_method(handle, "_BQC"))
printk(KERN_WARNING FW_BUG PREFIX "No _BQC method, " printk(KERN_WARNING FW_BUG PREFIX "No _BQC method, "
"cannot determine initial brightness\n"); "cannot determine initial brightness\n");
/* We have backlight support, no need to scan further */ /* We have backlight support, no need to scan further */
...@@ -79,22 +78,20 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context, ...@@ -79,22 +78,20 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
*/ */
long acpi_is_video_device(acpi_handle handle) long acpi_is_video_device(acpi_handle handle)
{ {
acpi_handle h_dummy;
long video_caps = 0; long video_caps = 0;
/* Is this device able to support video switching ? */ /* Is this device able to support video switching ? */
if (ACPI_SUCCESS(acpi_get_handle(handle, "_DOD", &h_dummy)) || if (acpi_has_method(handle, "_DOD") || acpi_has_method(handle, "_DOS"))
ACPI_SUCCESS(acpi_get_handle(handle, "_DOS", &h_dummy)))
video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING; video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
/* Is this device able to retrieve a video ROM ? */ /* Is this device able to retrieve a video ROM ? */
if (ACPI_SUCCESS(acpi_get_handle(handle, "_ROM", &h_dummy))) if (acpi_has_method(handle, "_ROM"))
video_caps |= ACPI_VIDEO_ROM_AVAILABLE; video_caps |= ACPI_VIDEO_ROM_AVAILABLE;
/* Is this device able to configure which video head to be POSTed ? */ /* Is this device able to configure which video head to be POSTed ? */
if (ACPI_SUCCESS(acpi_get_handle(handle, "_VPO", &h_dummy)) && if (acpi_has_method(handle, "_VPO") &&
ACPI_SUCCESS(acpi_get_handle(handle, "_GPD", &h_dummy)) && acpi_has_method(handle, "_GPD") &&
ACPI_SUCCESS(acpi_get_handle(handle, "_SPD", &h_dummy))) acpi_has_method(handle, "_SPD"))
video_caps |= ACPI_VIDEO_DEVICE_POSTING; video_caps |= ACPI_VIDEO_DEVICE_POSTING;
/* Only check for backlight functionality if one of the above hit. */ /* Only check for backlight functionality if one of the above hit. */
......
...@@ -122,7 +122,6 @@ struct acpiphp_func { ...@@ -122,7 +122,6 @@ struct acpiphp_func {
struct acpiphp_slot *slot; /* parent */ struct acpiphp_slot *slot; /* parent */
struct list_head sibling; struct list_head sibling;
struct notifier_block nb;
acpi_handle handle; acpi_handle handle;
u8 function; /* pci function# */ u8 function; /* pci function# */
......
...@@ -119,15 +119,14 @@ static void free_bridge(struct kref *kref) ...@@ -119,15 +119,14 @@ static void free_bridge(struct kref *kref)
* TBD - figure out a way to only call fixups for * TBD - figure out a way to only call fixups for
* systems that require them. * systems that require them.
*/ */
static int post_dock_fixups(struct notifier_block *nb, unsigned long val, static void post_dock_fixups(acpi_handle not_used, u32 event, void *data)
void *v)
{ {
struct acpiphp_func *func = container_of(nb, struct acpiphp_func, nb); struct acpiphp_func *func = data;
struct pci_bus *bus = func->slot->bridge->pci_bus; struct pci_bus *bus = func->slot->bridge->pci_bus;
u32 buses; u32 buses;
if (!bus->self) if (!bus->self)
return NOTIFY_OK; return;
/* fixup bad _DCK function that rewrites /* fixup bad _DCK function that rewrites
* secondary bridge on slot * secondary bridge on slot
...@@ -143,11 +142,11 @@ static int post_dock_fixups(struct notifier_block *nb, unsigned long val, ...@@ -143,11 +142,11 @@ static int post_dock_fixups(struct notifier_block *nb, unsigned long val,
| ((unsigned int)(bus->busn_res.end) << 16); | ((unsigned int)(bus->busn_res.end) << 16);
pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses); pci_write_config_dword(bus->self, PCI_PRIMARY_BUS, buses);
} }
return NOTIFY_OK;
} }
static const struct acpi_dock_ops acpiphp_dock_ops = { static const struct acpi_dock_ops acpiphp_dock_ops = {
.fixup = post_dock_fixups,
.handler = hotplug_event_func, .handler = hotplug_event_func,
}; };
...@@ -201,7 +200,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -201,7 +200,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context; struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context;
struct acpiphp_slot *slot; struct acpiphp_slot *slot;
struct acpiphp_func *newfunc; struct acpiphp_func *newfunc;
acpi_handle tmp;
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long long adr, sun; unsigned long long adr, sun;
int device, function, retval, found = 0; int device, function, retval, found = 0;
...@@ -232,19 +230,19 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -232,19 +230,19 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
newfunc->handle = handle; newfunc->handle = handle;
newfunc->function = function; newfunc->function = function;
if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp))) if (acpi_has_method(handle, "_EJ0"))
newfunc->flags = FUNC_HAS_EJ0; newfunc->flags = FUNC_HAS_EJ0;
if (ACPI_SUCCESS(acpi_get_handle(handle, "_STA", &tmp))) if (acpi_has_method(handle, "_STA"))
newfunc->flags |= FUNC_HAS_STA; newfunc->flags |= FUNC_HAS_STA;
if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS0", &tmp))) if (acpi_has_method(handle, "_PS0"))
newfunc->flags |= FUNC_HAS_PS0; newfunc->flags |= FUNC_HAS_PS0;
if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS3", &tmp))) if (acpi_has_method(handle, "_PS3"))
newfunc->flags |= FUNC_HAS_PS3; newfunc->flags |= FUNC_HAS_PS3;
if (ACPI_SUCCESS(acpi_get_handle(handle, "_DCK", &tmp))) if (acpi_has_method(handle, "_DCK"))
newfunc->flags |= FUNC_HAS_DCK; newfunc->flags |= FUNC_HAS_DCK;
status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun); status = acpi_evaluate_integer(handle, "_SUN", NULL, &sun);
...@@ -316,14 +314,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -316,14 +314,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
&acpiphp_dock_ops, newfunc, &acpiphp_dock_ops, newfunc,
acpiphp_dock_init, acpiphp_dock_release)) acpiphp_dock_init, acpiphp_dock_release))
dbg("failed to register dock device\n"); dbg("failed to register dock device\n");
/* we need to be notified when dock events happen
* outside of the hotplug operation, since we may
* need to do fixups before we can hotplug.
*/
newfunc->nb.notifier_call = post_dock_fixups;
if (register_dock_notifier(&newfunc->nb))
dbg("failed to register a dock notifier");
} }
/* install notify handler */ /* install notify handler */
...@@ -473,7 +463,6 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge) ...@@ -473,7 +463,6 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
list_for_each_entry(func, &slot->funcs, sibling) { list_for_each_entry(func, &slot->funcs, sibling) {
if (is_dock_device(func->handle)) { if (is_dock_device(func->handle)) {
unregister_hotplug_dock_device(func->handle); unregister_hotplug_dock_device(func->handle);
unregister_dock_notifier(&func->nb);
} }
if (!(func->flags & FUNC_HAS_DCK)) { if (!(func->flags & FUNC_HAS_DCK)) {
status = acpi_remove_notify_handler(func->handle, status = acpi_remove_notify_handler(func->handle,
...@@ -843,25 +832,14 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot) ...@@ -843,25 +832,14 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)
*/ */
int acpiphp_eject_slot(struct acpiphp_slot *slot) int acpiphp_eject_slot(struct acpiphp_slot *slot)
{ {
acpi_status status;
struct acpiphp_func *func; struct acpiphp_func *func;
struct acpi_object_list arg_list;
union acpi_object arg;
list_for_each_entry(func, &slot->funcs, sibling) { list_for_each_entry(func, &slot->funcs, sibling) {
/* We don't want to call _EJ0 on non-existing functions. */ /* We don't want to call _EJ0 on non-existing functions. */
if ((func->flags & FUNC_HAS_EJ0)) { if ((func->flags & FUNC_HAS_EJ0)) {
/* _EJ0 method take one argument */ if (ACPI_FAILURE(acpi_evaluate_ej0(func->handle)))
arg_list.count = 1;
arg_list.pointer = &arg;
arg.type = ACPI_TYPE_INTEGER;
arg.integer.value = 1;
status = acpi_evaluate_object(func->handle, "_EJ0", &arg_list, NULL);
if (ACPI_FAILURE(status)) {
warn("%s: _EJ0 failed\n", __func__);
return -1; return -1;
} else else
break; break;
} }
} }
...@@ -1171,7 +1149,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, ...@@ -1171,7 +1149,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,
*/ */
void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle) void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle)
{ {
acpi_handle dummy_handle;
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
if (acpiphp_disabled) if (acpiphp_disabled)
...@@ -1200,8 +1177,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle) ...@@ -1200,8 +1177,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle)
get_device(&bus->dev); get_device(&bus->dev);
if (!pci_is_root_bus(bridge->pci_bus) && if (!pci_is_root_bus(bridge->pci_bus) &&
ACPI_SUCCESS(acpi_get_handle(bridge->handle, acpi_has_method(bridge->handle, "_EJ0")) {
"_EJ0", &dummy_handle))) {
dbg("found ejectable p2p bridge\n"); dbg("found ejectable p2p bridge\n");
bridge->flags |= BRIDGE_HAS_EJ0; bridge->flags |= BRIDGE_HAS_EJ0;
bridge->func = acpiphp_bridge_handle_to_function(handle); bridge->func = acpiphp_bridge_handle_to_function(handle);
......
...@@ -56,6 +56,16 @@ acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event, ...@@ -56,6 +56,16 @@ acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,
acpi_status acpi_status
acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld); acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld);
bool acpi_has_method(acpi_handle handle, char *name);
acpi_status acpi_execute_simple_method(acpi_handle handle, char *method,
u64 arg);
acpi_status acpi_evaluate_ej0(acpi_handle handle);
acpi_status acpi_evaluate_lck(acpi_handle handle, int lock);
bool acpi_ata_match(acpi_handle handle);
bool acpi_bay_match(acpi_handle handle);
bool acpi_dock_match(acpi_handle handle);
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
...@@ -356,8 +366,6 @@ extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32); ...@@ -356,8 +366,6 @@ extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
extern int register_acpi_notifier(struct notifier_block *); extern int register_acpi_notifier(struct notifier_block *);
extern int unregister_acpi_notifier(struct notifier_block *); extern int unregister_acpi_notifier(struct notifier_block *);
extern int register_acpi_bus_notifier(struct notifier_block *nb);
extern void unregister_acpi_bus_notifier(struct notifier_block *nb);
/* /*
* External Functions * External Functions
*/ */
......
...@@ -113,14 +113,13 @@ void pci_acpi_crs_quirks(void); ...@@ -113,14 +113,13 @@ void pci_acpi_crs_quirks(void);
Dock Station Dock Station
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
struct acpi_dock_ops { struct acpi_dock_ops {
acpi_notify_handler fixup;
acpi_notify_handler handler; acpi_notify_handler handler;
acpi_notify_handler uevent; acpi_notify_handler uevent;
}; };
#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE) #ifdef CONFIG_ACPI_DOCK
extern int is_dock_device(acpi_handle handle); extern int is_dock_device(acpi_handle handle);
extern int register_dock_notifier(struct notifier_block *nb);
extern void unregister_dock_notifier(struct notifier_block *nb);
extern int register_hotplug_dock_device(acpi_handle handle, extern int register_hotplug_dock_device(acpi_handle handle,
const struct acpi_dock_ops *ops, const struct acpi_dock_ops *ops,
void *context, void *context,
...@@ -132,13 +131,6 @@ static inline int is_dock_device(acpi_handle handle) ...@@ -132,13 +131,6 @@ static inline int is_dock_device(acpi_handle handle)
{ {
return 0; return 0;
} }
static inline int register_dock_notifier(struct notifier_block *nb)
{
return -ENODEV;
}
static inline void unregister_dock_notifier(struct notifier_block *nb)
{
}
static inline int register_hotplug_dock_device(acpi_handle handle, static inline int register_hotplug_dock_device(acpi_handle handle,
const struct acpi_dock_ops *ops, const struct acpi_dock_ops *ops,
void *context, void *context,
...@@ -150,6 +142,6 @@ static inline int register_hotplug_dock_device(acpi_handle handle, ...@@ -150,6 +142,6 @@ static inline int register_hotplug_dock_device(acpi_handle handle,
static inline void unregister_hotplug_dock_device(acpi_handle handle) static inline void unregister_hotplug_dock_device(acpi_handle handle)
{ {
} }
#endif #endif /* CONFIG_ACPI_DOCK */
#endif /*__ACPI_DRIVERS_H__*/ #endif /*__ACPI_DRIVERS_H__*/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment