Skip to content

Commit

Permalink
ACPI / PCI: Make bus registration and unregistration symmetric
Browse files Browse the repository at this point in the history
Since acpi_pci_slot_enumerate() and acpiphp_enumerate_slots() can get
the ACPI device handle they need from bus->bridge, it is not
necessary to pass that handle to them as an argument.

Drop the second argument of acpi_pci_slot_enumerate() and
acpiphp_enumerate_slots(), rework them to obtain the ACPI handle
from bus->bridge and make acpi_pci_add_bus() and
acpi_pci_remove_bus() entirely symmetrical.

Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
  • Loading branch information
Rafael J. Wysocki committed Jul 23, 2013
1 parent b9eb179 commit be1c9de
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 25 deletions.
14 changes: 9 additions & 5 deletions drivers/acpi/pci_slot.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,16 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
return AE_OK;
}

void acpi_pci_slot_enumerate(struct pci_bus *bus, acpi_handle handle)
void acpi_pci_slot_enumerate(struct pci_bus *bus)
{
mutex_lock(&slot_list_lock);
acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
register_slot, NULL, bus, NULL);
mutex_unlock(&slot_list_lock);
acpi_handle handle = ACPI_HANDLE(bus->bridge);

if (handle) {
mutex_lock(&slot_list_lock);
acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
register_slot, NULL, bus, NULL);
mutex_unlock(&slot_list_lock);
}
}

void acpi_pci_slot_remove(struct pci_bus *bus)
Expand Down
6 changes: 4 additions & 2 deletions drivers/pci/hotplug/acpiphp_glue.c
Original file line number Diff line number Diff line change
Expand Up @@ -1147,14 +1147,16 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,
* Create hotplug slots for the PCI bus.
* It should always return 0 to avoid skipping following notifiers.
*/
void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle)
void acpiphp_enumerate_slots(struct pci_bus *bus)
{
acpi_handle handle;
struct acpiphp_bridge *bridge;

if (acpiphp_disabled)
return;

if (detect_ejectable_slots(handle) <= 0)
handle = ACPI_HANDLE(bus->bridge);
if (!handle || detect_ejectable_slots(handle) <= 0)
return;

bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
Expand Down
16 changes: 4 additions & 12 deletions drivers/pci/pci-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,24 +290,16 @@ static struct pci_platform_pm_ops acpi_pci_platform_pm = {

void acpi_pci_add_bus(struct pci_bus *bus)
{
acpi_handle handle = NULL;

if (bus->bridge)
handle = ACPI_HANDLE(bus->bridge);
if (acpi_pci_disabled || handle == NULL)
if (acpi_pci_disabled || !bus->bridge)
return;

acpi_pci_slot_enumerate(bus, handle);
acpiphp_enumerate_slots(bus, handle);
acpi_pci_slot_enumerate(bus);
acpiphp_enumerate_slots(bus);
}

void acpi_pci_remove_bus(struct pci_bus *bus)
{
/*
* bus->bridge->acpi_node.handle has already been reset to NULL
* when acpi_pci_remove_bus() is called, so don't check ACPI handle.
*/
if (acpi_pci_disabled)
if (acpi_pci_disabled || !bus->bridge)
return;

acpiphp_remove_slots(bus);
Expand Down
10 changes: 4 additions & 6 deletions include/linux/pci-acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,24 +47,22 @@ void acpi_pci_remove_bus(struct pci_bus *bus);

#ifdef CONFIG_ACPI_PCI_SLOT
void acpi_pci_slot_init(void);
void acpi_pci_slot_enumerate(struct pci_bus *bus, acpi_handle handle);
void acpi_pci_slot_enumerate(struct pci_bus *bus);
void acpi_pci_slot_remove(struct pci_bus *bus);
#else
static inline void acpi_pci_slot_init(void) { }
static inline void acpi_pci_slot_enumerate(struct pci_bus *bus,
acpi_handle handle) { }
static inline void acpi_pci_slot_enumerate(struct pci_bus *bus) { }
static inline void acpi_pci_slot_remove(struct pci_bus *bus) { }
#endif

#ifdef CONFIG_HOTPLUG_PCI_ACPI
void acpiphp_init(void);
void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle);
void acpiphp_enumerate_slots(struct pci_bus *bus);
void acpiphp_remove_slots(struct pci_bus *bus);
void acpiphp_check_host_bridge(acpi_handle handle);
#else
static inline void acpiphp_init(void) { }
static inline void acpiphp_enumerate_slots(struct pci_bus *bus,
acpi_handle handle) { }
static inline void acpiphp_enumerate_slots(struct pci_bus *bus) { }
static inline void acpiphp_remove_slots(struct pci_bus *bus) { }
static inline void acpiphp_check_host_bridge(acpi_handle handle) { }
#endif
Expand Down

0 comments on commit be1c9de

Please sign in to comment.