mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-06 17:43:43 +00:00
Merge branch 'acpi-cleanup'
Subsequent commits depend on the 'acpi-cleanup' material.
This commit is contained in:
commit
b9eb179fe6
@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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 "
|
|||||||
" 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 {
|
|||||||
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 {
|
|||||||
#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 {
|
|||||||
*
|
*
|
||||||
* 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)
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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)
|
|||||||
{
|
{
|
||||||
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. */
|
||||||
|
list_for_each_entry(dd, &ds->dependent_devices, list)
|
||||||
|
dock_hotplug_event(dd, event, DOCK_CALL_HANDLER);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First call driver specific hotplug functions
|
* Now make sure that an acpi_device is created for each dependent
|
||||||
|
* device. That will cause scan handlers to be attached to device
|
||||||
|
* objects or acpi_drivers to be stopped/started if they are present.
|
||||||
*/
|
*/
|
||||||
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_create_acpi_device(dd->handle);
|
||||||
|
|
||||||
/*
|
|
||||||
* Now make sure that an acpi_device is created for each
|
|
||||||
* dependent device, or removed if this is an eject request.
|
|
||||||
* This will cause acpi_drivers to be stopped/started if they
|
|
||||||
* exist
|
|
||||||
*/
|
|
||||||
list_for_each_entry(dd, &ds->dependent_devices, list) {
|
|
||||||
if (event == ACPI_NOTIFY_EJECT_REQUEST)
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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();
|
dd = kmalloc(sizeof(*dd), GFP_KERNEL);
|
||||||
|
if (dd) {
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
list_for_each_entry(dock_station, &dock_stations, sibling) {
|
dd->ds = data;
|
||||||
if (dock_station->handle == handle) {
|
dd->event = event;
|
||||||
struct dock_data *dd;
|
status = acpi_os_hotplug_execute(acpi_dock_deferred_cb, dd);
|
||||||
acpi_status status;
|
if (ACPI_FAILURE(status))
|
||||||
|
kfree(dd);
|
||||||
dd = kmalloc(sizeof(*dd), GFP_KERNEL);
|
|
||||||
if (!dd)
|
|
||||||
break;
|
|
||||||
|
|
||||||
dd->handle = handle;
|
|
||||||
dd->event = event;
|
|
||||||
dd->ds = dock_station;
|
|
||||||
status = acpi_os_hotplug_execute(acpi_dock_deferred_cb,
|
|
||||||
dd);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
kfree(dd);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 = {
|
|||||||
* 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 = {
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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)
|
|||||||
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 @@ err_unregister:
|
|||||||
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)
|
|||||||
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)
|
|||||||
* 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
{.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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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, ¬_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,
|
|||||||
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)
|
|||||||
put_device(&device->dev);
|
put_device(&device->dev);
|
||||||
device = NULL;
|
device = NULL;
|
||||||
|
|
||||||
if (ACPI_SUCCESS(acpi_get_handle(handle, "_LCK", ¬_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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
* 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 @@ end:
|
|||||||
|
|
||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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_FAILURE(acpi_get_parent(handle, &phandle)))
|
||||||
|
return false;
|
||||||
|
|
||||||
if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) ||
|
return acpi_ata_match(phandle);
|
||||||
(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 0;
|
|
||||||
|
|
||||||
if (acpi_get_parent(handle, &phandle))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
if ((ACPI_SUCCESS(acpi_get_handle(phandle, "_GTF", &tmp))) ||
|
|
||||||
(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)
|
|||||||
* 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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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,
|
|||||||
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];
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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, ...)
|
|||||||
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
|
|||||||
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
|
|||||||
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 @@ out:
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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 {
|
|||||||
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)
|
|||||||
* 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,
|
|||||||
| ((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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
&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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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,
|
|||||||
|
|
||||||
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);
|
|||||||
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);
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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__*/
|
||||||
|
Loading…
Reference in New Issue
Block a user