Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bda46dbb authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

ACPI / hotplug / PCI: Store parent in functions and bus in slots



To avoid chasing more pointers than necessary in some situations,
move the bridge pointer from struct acpiphp_slot to struct
acpiphp_func (and call it 'parent') and add a bus pointer to
struct acpiphp_slot.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 89373a55
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -97,7 +97,7 @@ struct acpiphp_bridge {
 */
struct acpiphp_slot {
	struct list_head node;
	struct acpiphp_bridge *bridge;	/* parent */
	struct pci_bus *bus;
	struct list_head funcs;		/* one slot may have different
					   objects (i.e. for each function) */
	struct slot *slot;
@@ -115,7 +115,8 @@ struct acpiphp_slot {
 * typically 8 objects per slot (i.e. for each PCI function)
 */
struct acpiphp_func {
	struct acpiphp_slot *slot;	/* parent */
	struct acpiphp_bridge *parent;
	struct acpiphp_slot *slot;

	struct list_head sibling;

+2 −4
Original line number Diff line number Diff line
@@ -321,10 +321,8 @@ int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot,
	slot->sun = sun;
	snprintf(name, SLOT_NAME_SIZE, "%u", sun);

	retval = pci_hp_register(slot->hotplug_slot,
					acpiphp_slot->bridge->pci_bus,
					acpiphp_slot->device,
					name);
	retval = pci_hp_register(slot->hotplug_slot, acpiphp_slot->bus,
				 acpiphp_slot->device, name);
	if (retval == -EBUSY)
		goto error_hpslot;
	if (retval) {
+13 −12
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ static void free_bridge(struct kref *kref)
	/* Root bridges will not have hotplug context. */
	if (context) {
		/* Release the reference taken by acpiphp_enumerate_slots(). */
		put_bridge(context->func.slot->bridge);
		put_bridge(context->func.parent);
		context->bridge = NULL;
		acpiphp_put_context(context);
	}
@@ -187,7 +187,7 @@ static void free_bridge(struct kref *kref)
static void post_dock_fixups(acpi_handle not_used, u32 event, void *data)
{
	struct acpiphp_context *context = data;
	struct pci_bus *bus = context->func.slot->bridge->pci_bus;
	struct pci_bus *bus = context->func.slot->bus;
	u32 buses;

	if (!bus->self)
@@ -248,14 +248,14 @@ static void acpiphp_dock_init(void *data)
{
	struct acpiphp_context *context = data;

	get_bridge(context->func.slot->bridge);
	get_bridge(context->func.parent);
}

static void acpiphp_dock_release(void *data)
{
	struct acpiphp_context *context = data;

	put_bridge(context->func.slot->bridge);
	put_bridge(context->func.parent);
}

/* callback routine to register each ACPI PCI slot object */
@@ -294,6 +294,7 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,
	}
	newfunc = &context->func;
	newfunc->function = function;
	newfunc->parent = bridge;
	mutex_unlock(&acpiphp_context_lock);

	if (acpi_has_method(handle, "_EJ0"))
@@ -322,7 +323,7 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,
		goto err;
	}

	slot->bridge = bridge;
	slot->bus = bridge->pci_bus;
	slot->device = device;
	INIT_LIST_HEAD(&slot->funcs);
	mutex_init(&slot->crit_sect);
@@ -639,7 +640,7 @@ static void check_hotplug_bridge(struct acpiphp_slot *slot, struct pci_dev *dev)
static int __ref enable_device(struct acpiphp_slot *slot)
{
	struct pci_dev *dev;
	struct pci_bus *bus = slot->bridge->pci_bus;
	struct pci_bus *bus = slot->bus;
	struct acpiphp_func *func;
	int num, max, pass;
	LIST_HEAD(add_list);
@@ -709,7 +710,7 @@ static int __ref enable_device(struct acpiphp_slot *slot)
/* return first device in slot, acquiring a reference on it */
static struct pci_dev *dev_in_slot(struct acpiphp_slot *slot)
{
	struct pci_bus *bus = slot->bridge->pci_bus;
	struct pci_bus *bus = slot->bus;
	struct pci_dev *dev;
	struct pci_dev *ret = NULL;

@@ -781,7 +782,7 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)
		} else {
			u32 dvid;

			pci_bus_read_config_dword(slot->bridge->pci_bus,
			pci_bus_read_config_dword(slot->bus,
						  PCI_DEVFN(slot->device,
							    func->function),
						  PCI_VENDOR_ID, &dvid);
@@ -970,7 +971,7 @@ static void hotplug_event(acpi_handle handle, u32 type, void *data)
		if (bridge)
			acpiphp_check_bridge(bridge);
		else
			acpiphp_check_bridge(func->slot->bridge);
			acpiphp_check_bridge(func->parent);

		break;

@@ -1025,7 +1026,7 @@ static void hotplug_event_work(struct work_struct *work)

	acpi_scan_lock_release();
	kfree(hp_work); /* allocated in handle_hotplug_event() */
	put_bridge(context->func.slot->bridge);
	put_bridge(context->func.parent);
}

/**
@@ -1043,7 +1044,7 @@ static void handle_hotplug_event(acpi_handle handle, u32 type, void *data)
	mutex_lock(&acpiphp_context_lock);
	context = acpiphp_get_context(handle);
	if (context) {
		get_bridge(context->func.slot->bridge);
		get_bridge(context->func.parent);
		acpiphp_put_context(context);
	}
	mutex_unlock(&acpiphp_context_lock);
@@ -1113,7 +1114,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus)
		bridge->context = context;
		context->bridge = bridge;
		/* Get a reference to the parent bridge. */
		get_bridge(context->func.slot->bridge);
		get_bridge(context->func.parent);
		mutex_unlock(&acpiphp_context_lock);
	}