Commit 96c9ddae authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpi-fixes'

* acpi-fixes:
  libata-acpi: add back ACPI based hotplug functionality
  ACPI / dock / PCI: Synchronous handling of dock events for PCI devices
  PCI / ACPI: Use boot-time resource allocation rules during hotplug
  ACPI / dock: Initialize ACPI dock subsystem upfront
parents 9e895ace 44521527
...@@ -66,20 +66,21 @@ struct dock_station { ...@@ -66,20 +66,21 @@ struct dock_station {
spinlock_t dd_lock; spinlock_t dd_lock;
struct mutex hp_lock; struct mutex hp_lock;
struct list_head dependent_devices; struct list_head dependent_devices;
struct list_head hotplug_devices;
struct list_head sibling; struct list_head sibling;
struct platform_device *dock_device; struct platform_device *dock_device;
}; };
static LIST_HEAD(dock_stations); static LIST_HEAD(dock_stations);
static int dock_station_count; static int dock_station_count;
static DEFINE_MUTEX(hotplug_lock);
struct dock_dependent_device { struct dock_dependent_device {
struct list_head list; struct list_head list;
struct list_head hotplug_list;
acpi_handle handle; acpi_handle handle;
const struct acpi_dock_ops *ops; const struct acpi_dock_ops *hp_ops;
void *context; void *hp_context;
unsigned int hp_refcount;
void (*hp_release)(void *);
}; };
#define DOCK_DOCKING 0x00000001 #define DOCK_DOCKING 0x00000001
...@@ -111,7 +112,6 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle) ...@@ -111,7 +112,6 @@ 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);
INIT_LIST_HEAD(&dd->hotplug_list);
spin_lock(&ds->dd_lock); spin_lock(&ds->dd_lock);
list_add_tail(&dd->list, &ds->dependent_devices); list_add_tail(&dd->list, &ds->dependent_devices);
...@@ -121,35 +121,90 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle) ...@@ -121,35 +121,90 @@ add_dock_dependent_device(struct dock_station *ds, acpi_handle handle)
} }
/** /**
* dock_add_hotplug_device - associate a hotplug handler with the dock station * dock_init_hotplug - Initialize a hotplug device on a docking station.
* @ds: The dock station * @dd: Dock-dependent device.
* @dd: The dependent device struct * @ops: Dock operations to attach to the dependent device.
* * @context: Data to pass to the @ops callbacks and @release.
* Add the dependent device to the dock's hotplug device list * @init: Optional initialization routine to run after setting up context.
* @release: Optional release routine to run on removal.
*/ */
static void static int dock_init_hotplug(struct dock_dependent_device *dd,
dock_add_hotplug_device(struct dock_station *ds, const struct acpi_dock_ops *ops, void *context,
struct dock_dependent_device *dd) void (*init)(void *), void (*release)(void *))
{ {
mutex_lock(&ds->hp_lock); int ret = 0;
list_add_tail(&dd->hotplug_list, &ds->hotplug_devices);
mutex_unlock(&ds->hp_lock); mutex_lock(&hotplug_lock);
if (dd->hp_context) {
ret = -EEXIST;
} else {
dd->hp_refcount = 1;
dd->hp_ops = ops;
dd->hp_context = context;
dd->hp_release = release;
}
if (!WARN_ON(ret) && init)
init(context);
mutex_unlock(&hotplug_lock);
return ret;
} }
/** /**
* dock_del_hotplug_device - remove a hotplug handler from the dock station * dock_release_hotplug - Decrement hotplug reference counter of dock device.
* @ds: The dock station * @dd: Dock-dependent device.
* @dd: the dependent device struct
* *
* Delete the dependent device from the dock's hotplug device list * Decrement the reference counter of @dd and if 0, detach its hotplug
* operations from it, reset its context pointer and run the optional release
* routine if present.
*/ */
static void static void dock_release_hotplug(struct dock_dependent_device *dd)
dock_del_hotplug_device(struct dock_station *ds,
struct dock_dependent_device *dd)
{ {
mutex_lock(&ds->hp_lock); void (*release)(void *) = NULL;
list_del(&dd->hotplug_list); void *context = NULL;
mutex_unlock(&ds->hp_lock);
mutex_lock(&hotplug_lock);
if (dd->hp_context && !--dd->hp_refcount) {
dd->hp_ops = NULL;
context = dd->hp_context;
dd->hp_context = NULL;
release = dd->hp_release;
dd->hp_release = NULL;
}
if (release && context)
release(context);
mutex_unlock(&hotplug_lock);
}
static void dock_hotplug_event(struct dock_dependent_device *dd, u32 event,
bool uevent)
{
acpi_notify_handler cb = NULL;
bool run = false;
mutex_lock(&hotplug_lock);
if (dd->hp_context) {
run = true;
dd->hp_refcount++;
if (dd->hp_ops)
cb = uevent ? dd->hp_ops->uevent : dd->hp_ops->handler;
}
mutex_unlock(&hotplug_lock);
if (!run)
return;
if (cb)
cb(dd->handle, event, dd->hp_context);
dock_release_hotplug(dd);
} }
/** /**
...@@ -360,9 +415,8 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event) ...@@ -360,9 +415,8 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event)
/* /*
* First call driver specific hotplug functions * First call driver specific hotplug functions
*/ */
list_for_each_entry(dd, &ds->hotplug_devices, hotplug_list) list_for_each_entry(dd, &ds->dependent_devices, list)
if (dd->ops && dd->ops->handler) dock_hotplug_event(dd, event, false);
dd->ops->handler(dd->handle, event, dd->context);
/* /*
* Now make sure that an acpi_device is created for each * Now make sure that an acpi_device is created for each
...@@ -398,9 +452,8 @@ static void dock_event(struct dock_station *ds, u32 event, int num) ...@@ -398,9 +452,8 @@ static void dock_event(struct dock_station *ds, u32 event, int num)
if (num == DOCK_EVENT) if (num == DOCK_EVENT)
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
list_for_each_entry(dd, &ds->hotplug_devices, hotplug_list) list_for_each_entry(dd, &ds->dependent_devices, list)
if (dd->ops && dd->ops->uevent) dock_hotplug_event(dd, event, true);
dd->ops->uevent(dd->handle, event, dd->context);
if (num != DOCK_EVENT) if (num != DOCK_EVENT)
kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
...@@ -570,19 +623,24 @@ EXPORT_SYMBOL_GPL(unregister_dock_notifier); ...@@ -570,19 +623,24 @@ EXPORT_SYMBOL_GPL(unregister_dock_notifier);
* @handle: the handle of the device * @handle: the handle of the device
* @ops: handlers to call after docking * @ops: handlers to call after docking
* @context: device specific data * @context: device specific data
* @init: Optional initialization routine to run after registration
* @release: Optional release routine to run on unregistration
* *
* If a driver would like to perform a hotplug operation after a dock * If a driver would like to perform a hotplug operation after a dock
* event, they can register an acpi_notifiy_handler to be called by * event, they can register an acpi_notifiy_handler to be called by
* the dock driver after _DCK is executed. * the dock driver after _DCK is executed.
*/ */
int int register_hotplug_dock_device(acpi_handle handle,
register_hotplug_dock_device(acpi_handle handle, const struct acpi_dock_ops *ops, const struct acpi_dock_ops *ops, void *context,
void *context) void (*init)(void *), void (*release)(void *))
{ {
struct dock_dependent_device *dd; struct dock_dependent_device *dd;
struct dock_station *dock_station; struct dock_station *dock_station;
int ret = -EINVAL; int ret = -EINVAL;
if (WARN_ON(!context))
return -EINVAL;
if (!dock_station_count) if (!dock_station_count)
return -ENODEV; return -ENODEV;
...@@ -597,12 +655,8 @@ register_hotplug_dock_device(acpi_handle handle, const struct acpi_dock_ops *ops ...@@ -597,12 +655,8 @@ register_hotplug_dock_device(acpi_handle handle, const struct acpi_dock_ops *ops
* ops * ops
*/ */
dd = find_dock_dependent_device(dock_station, handle); dd = find_dock_dependent_device(dock_station, handle);
if (dd) { if (dd && !dock_init_hotplug(dd, ops, context, init, release))
dd->ops = ops;
dd->context = context;
dock_add_hotplug_device(dock_station, dd);
ret = 0; ret = 0;
}
} }
return ret; return ret;
...@@ -624,7 +678,7 @@ void unregister_hotplug_dock_device(acpi_handle handle) ...@@ -624,7 +678,7 @@ void unregister_hotplug_dock_device(acpi_handle handle)
list_for_each_entry(dock_station, &dock_stations, sibling) { list_for_each_entry(dock_station, &dock_stations, sibling) {
dd = find_dock_dependent_device(dock_station, handle); dd = find_dock_dependent_device(dock_station, handle);
if (dd) if (dd)
dock_del_hotplug_device(dock_station, dd); dock_release_hotplug(dd);
} }
} }
EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device); EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device);
...@@ -953,7 +1007,6 @@ static int __init dock_add(acpi_handle handle) ...@@ -953,7 +1007,6 @@ static int __init dock_add(acpi_handle handle)
mutex_init(&dock_station->hp_lock); mutex_init(&dock_station->hp_lock);
spin_lock_init(&dock_station->dd_lock); spin_lock_init(&dock_station->dd_lock);
INIT_LIST_HEAD(&dock_station->sibling); INIT_LIST_HEAD(&dock_station->sibling);
INIT_LIST_HEAD(&dock_station->hotplug_devices);
ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list); ATOMIC_INIT_NOTIFIER_HEAD(&dock_notifier_list);
INIT_LIST_HEAD(&dock_station->dependent_devices); INIT_LIST_HEAD(&dock_station->dependent_devices);
...@@ -993,30 +1046,6 @@ static int __init dock_add(acpi_handle handle) ...@@ -993,30 +1046,6 @@ static int __init dock_add(acpi_handle handle)
return ret; return ret;
} }
/**
* dock_remove - free up resources related to the dock station
*/
static int dock_remove(struct dock_station *ds)
{
struct dock_dependent_device *dd, *tmp;
struct platform_device *dock_device = ds->dock_device;
if (!dock_station_count)
return 0;
/* remove dependent devices */
list_for_each_entry_safe(dd, tmp, &ds->dependent_devices, list)
kfree(dd);
list_del(&ds->sibling);
/* cleanup sysfs */
sysfs_remove_group(&dock_device->dev.kobj, &dock_attribute_group);
platform_device_unregister(dock_device);
return 0;
}
/** /**
* find_dock_and_bay - look for dock stations and bays * find_dock_and_bay - look for dock stations and bays
* @handle: acpi handle of a device * @handle: acpi handle of a device
...@@ -1035,7 +1064,7 @@ find_dock_and_bay(acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -1035,7 +1064,7 @@ find_dock_and_bay(acpi_handle handle, u32 lvl, void *context, void **rv)
return AE_OK; return AE_OK;
} }
static int __init dock_init(void) int __init acpi_dock_init(void)
{ {
if (acpi_disabled) if (acpi_disabled)
return 0; return 0;
...@@ -1054,19 +1083,3 @@ static int __init dock_init(void) ...@@ -1054,19 +1083,3 @@ static int __init dock_init(void)
ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count); ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count);
return 0; return 0;
} }
static void __exit dock_exit(void)
{
struct dock_station *tmp, *dock_station;
unregister_acpi_bus_notifier(&dock_acpi_notifier);
list_for_each_entry_safe(dock_station, tmp, &dock_stations, sibling)
dock_remove(dock_station);
}
/*
* Must be called before drivers of devices in dock, otherwise we can't know
* which devices are in a dock
*/
subsys_initcall(dock_init);
module_exit(dock_exit);
...@@ -40,6 +40,11 @@ void acpi_container_init(void); ...@@ -40,6 +40,11 @@ void acpi_container_init(void);
#else #else
static inline void acpi_container_init(void) {} static inline void acpi_container_init(void) {}
#endif #endif
#ifdef CONFIG_ACPI_DOCK
void acpi_dock_init(void);
#else
static inline void acpi_dock_init(void) {}
#endif
#ifdef CONFIG_ACPI_HOTPLUG_MEMORY #ifdef CONFIG_ACPI_HOTPLUG_MEMORY
void acpi_memory_hotplug_init(void); void acpi_memory_hotplug_init(void);
#else #else
......
...@@ -2042,6 +2042,7 @@ int __init acpi_scan_init(void) ...@@ -2042,6 +2042,7 @@ int __init acpi_scan_init(void)
acpi_lpss_init(); acpi_lpss_init();
acpi_container_init(); acpi_container_init();
acpi_memory_hotplug_init(); acpi_memory_hotplug_init();
acpi_dock_init();
mutex_lock(&acpi_scan_lock); mutex_lock(&acpi_scan_lock);
/* /*
......
...@@ -156,8 +156,10 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, ...@@ -156,8 +156,10 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
spin_unlock_irqrestore(ap->lock, flags); spin_unlock_irqrestore(ap->lock, flags);
if (wait) if (wait) {
ata_port_wait_eh(ap); ata_port_wait_eh(ap);
flush_work(&ap->hotplug_task.work);
}
} }
static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data) static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data)
...@@ -214,6 +216,39 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = { ...@@ -214,6 +216,39 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = {
.uevent = ata_acpi_ap_uevent, .uevent = ata_acpi_ap_uevent,
}; };
void ata_acpi_hotplug_init(struct ata_host *host)
{
int i;
for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];
acpi_handle handle;
struct ata_device *dev;
if (!ap)
continue;
handle = ata_ap_acpi_handle(ap);
if (handle) {
/* we might be on a docking station */
register_hotplug_dock_device(handle,
&ata_acpi_ap_dock_ops, ap,
NULL, NULL);
}
ata_for_each_dev(dev, &ap->link, ALL) {
handle = ata_dev_acpi_handle(dev);
if (!handle)
continue;
/* we might be on a docking station */
register_hotplug_dock_device(handle,
&ata_acpi_dev_dock_ops,
dev, NULL, NULL);
}
}
}
/** /**
* ata_acpi_dissociate - dissociate ATA host from ACPI objects * ata_acpi_dissociate - dissociate ATA host from ACPI objects
* @host: target ATA host * @host: target ATA host
......
...@@ -6148,6 +6148,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) ...@@ -6148,6 +6148,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
if (rc) if (rc)
goto err_tadd; goto err_tadd;
ata_acpi_hotplug_init(host);
/* set cable, sata_spd_limit and report */ /* set cable, sata_spd_limit and report */
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
......
...@@ -122,6 +122,7 @@ extern int ata_acpi_register(void); ...@@ -122,6 +122,7 @@ extern int ata_acpi_register(void);
extern void ata_acpi_unregister(void); extern void ata_acpi_unregister(void);
extern void ata_acpi_bind(struct ata_device *dev); extern void ata_acpi_bind(struct ata_device *dev);
extern void ata_acpi_unbind(struct ata_device *dev); extern void ata_acpi_unbind(struct ata_device *dev);
extern void ata_acpi_hotplug_init(struct ata_host *host);
#else #else
static inline void ata_acpi_dissociate(struct ata_host *host) { } static inline void ata_acpi_dissociate(struct ata_host *host) { }
static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; } static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
...@@ -134,6 +135,7 @@ static inline int ata_acpi_register(void) { return 0; } ...@@ -134,6 +135,7 @@ static inline int ata_acpi_register(void) { return 0; }
static inline void ata_acpi_unregister(void) { } static inline void ata_acpi_unregister(void) { }
static inline void ata_acpi_bind(struct ata_device *dev) { } static inline void ata_acpi_bind(struct ata_device *dev) { }
static inline void ata_acpi_unbind(struct ata_device *dev) { } static inline void ata_acpi_unbind(struct ata_device *dev) { }
static inline void ata_acpi_hotplug_init(struct ata_host *host) {}
#endif #endif
/* libata-scsi.c */ /* libata-scsi.c */
......
...@@ -61,6 +61,7 @@ static DEFINE_MUTEX(bridge_mutex); ...@@ -61,6 +61,7 @@ static DEFINE_MUTEX(bridge_mutex);
static void handle_hotplug_event_bridge (acpi_handle, u32, void *); static void handle_hotplug_event_bridge (acpi_handle, u32, void *);
static void acpiphp_sanitize_bus(struct pci_bus *bus); static void acpiphp_sanitize_bus(struct pci_bus *bus);
static void acpiphp_set_hpp_values(struct pci_bus *bus); static void acpiphp_set_hpp_values(struct pci_bus *bus);
static void hotplug_event_func(acpi_handle handle, u32 type, void *context);
static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context); static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context);
static void free_bridge(struct kref *kref); static void free_bridge(struct kref *kref);
...@@ -147,7 +148,7 @@ static int post_dock_fixups(struct notifier_block *nb, unsigned long val, ...@@ -147,7 +148,7 @@ static int post_dock_fixups(struct notifier_block *nb, unsigned long val,
static const struct acpi_dock_ops acpiphp_dock_ops = { static const struct acpi_dock_ops acpiphp_dock_ops = {
.handler = handle_hotplug_event_func, .handler = hotplug_event_func,
}; };
/* Check whether the PCI device is managed by native PCIe hotplug driver */ /* Check whether the PCI device is managed by native PCIe hotplug driver */
...@@ -179,6 +180,20 @@ static bool device_is_managed_by_native_pciehp(struct pci_dev *pdev) ...@@ -179,6 +180,20 @@ static bool device_is_managed_by_native_pciehp(struct pci_dev *pdev)
return true; return true;
} }
static void acpiphp_dock_init(void *data)
{
struct acpiphp_func *func = data;
get_bridge(func->slot->bridge);
}
static void acpiphp_dock_release(void *data)
{
struct acpiphp_func *func = data;
put_bridge(func->slot->bridge);
}
/* callback routine to register each ACPI PCI slot object */ /* callback routine to register each ACPI PCI slot object */
static acpi_status static acpi_status
register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
...@@ -298,7 +313,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -298,7 +313,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
*/ */
newfunc->flags &= ~FUNC_HAS_EJ0; newfunc->flags &= ~FUNC_HAS_EJ0;
if (register_hotplug_dock_device(handle, if (register_hotplug_dock_device(handle,
&acpiphp_dock_ops, newfunc)) &acpiphp_dock_ops, newfunc,
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 /* we need to be notified when dock events happen
...@@ -670,6 +686,7 @@ static int __ref enable_device(struct acpiphp_slot *slot) ...@@ -670,6 +686,7 @@ static int __ref enable_device(struct acpiphp_slot *slot)
struct pci_bus *bus = slot->bridge->pci_bus; struct pci_bus *bus = slot->bridge->pci_bus;
struct acpiphp_func *func; struct acpiphp_func *func;
int num, max, pass; int num, max, pass;
LIST_HEAD(add_list);
if (slot->flags & SLOT_ENABLED) if (slot->flags & SLOT_ENABLED)
goto err_exit; goto err_exit;
...@@ -694,13 +711,15 @@ static int __ref enable_device(struct acpiphp_slot *slot) ...@@ -694,13 +711,15 @@ static int __ref enable_device(struct acpiphp_slot *slot)
max = pci_scan_bridge(bus, dev, max, pass); max = pci_scan_bridge(bus, dev, max, pass);
if (pass && dev->subordinate) { if (pass && dev->subordinate) {
check_hotplug_bridge(slot, dev); check_hotplug_bridge(slot, dev);
pci_bus_size_bridges(dev->subordinate); pcibios_resource_survey_bus(dev->subordinate);
__pci_bus_size_bridges(dev->subordinate,
&add_list);
} }
} }
} }
} }
pci_bus_assign_resources(bus); __pci_bus_assign_resources(bus, &add_list, NULL);
acpiphp_sanitize_bus(bus); acpiphp_sanitize_bus(bus);
acpiphp_set_hpp_values(bus); acpiphp_set_hpp_values(bus);
acpiphp_set_acpi_region(slot); acpiphp_set_acpi_region(slot);
...@@ -1065,22 +1084,12 @@ static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, ...@@ -1065,22 +1084,12 @@ static void handle_hotplug_event_bridge(acpi_handle handle, u32 type,
alloc_acpi_hp_work(handle, type, context, _handle_hotplug_event_bridge); alloc_acpi_hp_work(handle, type, context, _handle_hotplug_event_bridge);
} }
static void _handle_hotplug_event_func(struct work_struct *work) static void hotplug_event_func(acpi_handle handle, u32 type, void *context)
{ {
struct acpiphp_func *func; struct acpiphp_func *func = context;
char objname[64]; char objname[64];
struct acpi_buffer buffer = { .length = sizeof(objname), struct acpi_buffer buffer = { .length = sizeof(objname),
.pointer = objname }; .pointer = objname };
struct acpi_hp_work *hp_work;
acpi_handle handle;
u32 type;
hp_work = container_of(work, struct acpi_hp_work, work);
handle = hp_work->handle;
type = hp_work->type;
func = (struct acpiphp_func *)hp_work->context;
acpi_scan_lock_acquire();
acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
...@@ -1113,6 +1122,18 @@ static void _handle_hotplug_event_func(struct work_struct *work) ...@@ -1113,6 +1122,18 @@ static void _handle_hotplug_event_func(struct work_struct *work)
warn("notify_handler: unknown event type 0x%x for %s\n", type, objname); warn("notify_handler: unknown event type 0x%x for %s\n", type, objname);
break; break;
} }
}
static void _handle_hotplug_event_func(struct work_struct *work)
{
struct acpi_hp_work *hp_work;
struct acpiphp_func *func;
hp_work = container_of(work, struct acpi_hp_work, work);
func = hp_work->context;
acpi_scan_lock_acquire();
hotplug_event_func(hp_work->handle, hp_work->type, func);
acpi_scan_lock_release(); acpi_scan_lock_release();
kfree(hp_work); /* allocated in handle_hotplug_event_func */ kfree(hp_work); /* allocated in handle_hotplug_event_func */
......
...@@ -202,6 +202,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, ...@@ -202,6 +202,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
struct resource *res, unsigned int reg); struct resource *res, unsigned int reg);
int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type); int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type);
void pci_configure_ari(struct pci_dev *dev); void pci_configure_ari(struct pci_dev *dev);
void __ref __pci_bus_size_bridges(struct pci_bus *bus,
struct list_head *realloc_head);
void __ref __pci_bus_assign_resources(const struct pci_bus *bus,
struct list_head *realloc_head,
struct list_head *fail_head);
/** /**
* pci_ari_enabled - query ARI forwarding status * pci_ari_enabled - query ARI forwarding status
......
...@@ -1044,7 +1044,7 @@ static void pci_bus_size_cardbus(struct pci_bus *bus, ...@@ -1044,7 +1044,7 @@ static void pci_bus_size_cardbus(struct pci_bus *bus,
; ;
} }
static void __ref __pci_bus_size_bridges(struct pci_bus *bus, void __ref __pci_bus_size_bridges(struct pci_bus *bus,
struct list_head *realloc_head) struct list_head *realloc_head)
{ {
struct pci_dev *dev; struct pci_dev *dev;
...@@ -1115,9 +1115,9 @@ void __ref pci_bus_size_bridges(struct pci_bus *bus) ...@@ -1115,9 +1115,9 @@ void __ref pci_bus_size_bridges(struct pci_bus *bus)
} }
EXPORT_SYMBOL(pci_bus_size_bridges); EXPORT_SYMBOL(pci_bus_size_bridges);
static void __ref __pci_bus_assign_resources(const struct pci_bus *bus, void __ref __pci_bus_assign_resources(const struct pci_bus *bus,
struct list_head *realloc_head, struct list_head *realloc_head,
struct list_head *fail_head) struct list_head *fail_head)
{ {
struct pci_bus *b; struct pci_bus *b;
struct pci_dev *dev; struct pci_dev *dev;
......
...@@ -123,7 +123,9 @@ extern int register_dock_notifier(struct notifier_block *nb); ...@@ -123,7 +123,9 @@ extern int register_dock_notifier(struct notifier_block *nb);
extern void unregister_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,
void (*init)(void *),
void (*release)(void *));
extern void unregister_hotplug_dock_device(acpi_handle handle); extern void unregister_hotplug_dock_device(acpi_handle handle);
#else #else
static inline int is_dock_device(acpi_handle handle) static inline int is_dock_device(acpi_handle handle)
...@@ -139,7 +141,9 @@ static inline void unregister_dock_notifier(struct notifier_block *nb) ...@@ -139,7 +141,9 @@ 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,
void (*init)(void *),
void (*release)(void *))
{ {
return -ENODEV; return -ENODEV;
} }
......
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