ACPI: dock: use mutex instead of spinlock

http://bugzilla.kernel.org/show_bug.cgi?id=7303

Use a mutex instead of a spinlock for locking the
hotplug list because we need to call into the ACPI
subsystem which might sleep.

Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Kristen Carlson Accardi
2006-10-30 11:18:45 -08:00
committed by Len Brown
parent c1b707d253
commit 8b0dc866dd

View File

@@ -44,7 +44,7 @@ struct dock_station {
unsigned long last_dock_time; unsigned long last_dock_time;
u32 flags; u32 flags;
spinlock_t dd_lock; spinlock_t dd_lock;
spinlock_t hp_lock; struct mutex hp_lock;
struct list_head dependent_devices; struct list_head dependent_devices;
struct list_head hotplug_devices; struct list_head hotplug_devices;
}; };
@@ -114,9 +114,9 @@ static void
dock_add_hotplug_device(struct dock_station *ds, dock_add_hotplug_device(struct dock_station *ds,
struct dock_dependent_device *dd) struct dock_dependent_device *dd)
{ {
spin_lock(&ds->hp_lock); mutex_lock(&ds->hp_lock);
list_add_tail(&dd->hotplug_list, &ds->hotplug_devices); list_add_tail(&dd->hotplug_list, &ds->hotplug_devices);
spin_unlock(&ds->hp_lock); mutex_unlock(&ds->hp_lock);
} }
/** /**
@@ -130,9 +130,9 @@ static void
dock_del_hotplug_device(struct dock_station *ds, dock_del_hotplug_device(struct dock_station *ds,
struct dock_dependent_device *dd) struct dock_dependent_device *dd)
{ {
spin_lock(&ds->hp_lock); mutex_lock(&ds->hp_lock);
list_del(&dd->hotplug_list); list_del(&dd->hotplug_list);
spin_unlock(&ds->hp_lock); mutex_unlock(&ds->hp_lock);
} }
/** /**
@@ -295,7 +295,7 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
{ {
struct dock_dependent_device *dd; struct dock_dependent_device *dd;
spin_lock(&ds->hp_lock); mutex_lock(&ds->hp_lock);
/* /*
* First call driver specific hotplug functions * First call driver specific hotplug functions
@@ -317,7 +317,7 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
else else
dock_create_acpi_device(dd->handle); dock_create_acpi_device(dd->handle);
} }
spin_unlock(&ds->hp_lock); 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)
@@ -625,7 +625,7 @@ static int dock_add(acpi_handle handle)
INIT_LIST_HEAD(&dock_station->dependent_devices); INIT_LIST_HEAD(&dock_station->dependent_devices);
INIT_LIST_HEAD(&dock_station->hotplug_devices); INIT_LIST_HEAD(&dock_station->hotplug_devices);
spin_lock_init(&dock_station->dd_lock); spin_lock_init(&dock_station->dd_lock);
spin_lock_init(&dock_station->hp_lock); mutex_init(&dock_station->hp_lock);
ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list); ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list);
/* Find dependent devices */ /* Find dependent devices */