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

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

ACPI / hotplug / PCI: Embed function struct into struct acpiphp_context



Since there has to be a struct acpiphp_func object for every struct
acpiphp_context created by register_slot(), the struct acpiphp_func
one can be embedded into the struct acpiphp_context one, which allows
some code simplifications to be made.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 75a33ed1
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -116,7 +116,6 @@ struct acpiphp_slot {
 * typically 8 objects per slot (i.e. for each PCI function)
 */
struct acpiphp_func {
	struct acpiphp_context *context;
	struct acpiphp_slot *slot;	/* parent */

	struct list_head sibling;
@@ -128,11 +127,16 @@ struct acpiphp_func {

struct acpiphp_context {
	acpi_handle handle;
	struct acpiphp_func *func;
	struct acpiphp_func func;
	struct acpiphp_bridge *bridge;
	unsigned int refcount;
};

static inline struct acpiphp_context *func_to_context(struct acpiphp_func *func)
{
	return container_of(func, struct acpiphp_context, func);
}

/*
 * struct acpiphp_attention_info - device specific attention registration
 *
+16 −28
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ static void acpiphp_put_context(struct acpiphp_context *context)
	if (--context->refcount)
		return;

	WARN_ON(context->func || context->bridge);
	WARN_ON(context->bridge);
	acpi_detach_data(context->handle, acpiphp_context_handler);
	kfree(context);
}
@@ -155,12 +155,9 @@ static void free_bridge(struct kref *kref)
	bridge = container_of(kref, struct acpiphp_bridge, ref);

	list_for_each_entry_safe(slot, next, &bridge->slots, node) {
		list_for_each_entry_safe(func, tmp, &slot->funcs, sibling) {
			context = func->context;
			context->func = NULL;
			acpiphp_put_context(context);
			kfree(func);
		}
		list_for_each_entry_safe(func, tmp, &slot->funcs, sibling)
			acpiphp_put_context(func_to_context(func));

		kfree(slot);
	}

@@ -168,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.slot->bridge);
		context->bridge = NULL;
		acpiphp_put_context(context);
	}
@@ -190,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->bridge->pci_bus;
	u32 buses;

	if (!bus->self)
@@ -251,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.slot->bridge);
}

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

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

/* callback routine to register each ACPI PCI slot object */
@@ -288,23 +285,16 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,
	device = (adr >> 16) & 0xffff;
	function = adr & 0xffff;

	newfunc = kzalloc(sizeof(struct acpiphp_func), GFP_KERNEL);
	if (!newfunc)
		return AE_NO_MEMORY;

	newfunc->handle = handle;
	newfunc->function = function;

	mutex_lock(&acpiphp_context_lock);
	context = acpiphp_init_context(handle);
	if (!context) {
		mutex_unlock(&acpiphp_context_lock);
		acpi_handle_err(handle, "No hotplug context\n");
		kfree(newfunc);
		return AE_NOT_EXIST;
	}
	newfunc->context = context;
	context->func = newfunc;
	newfunc = &context->func;
	newfunc->handle = handle;
	newfunc->function = function;
	mutex_unlock(&acpiphp_context_lock);

	if (acpi_has_method(handle, "_EJ0"))
@@ -404,10 +394,8 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,

 err:
	mutex_lock(&acpiphp_context_lock);
	context->func = NULL;
	acpiphp_put_context(context);
	mutex_unlock(&acpiphp_context_lock);
	kfree(newfunc);
	return status;
}

@@ -938,7 +926,7 @@ void acpiphp_check_host_bridge(acpi_handle handle)
static void hotplug_event(acpi_handle handle, u32 type, void *data)
{
	struct acpiphp_context *context = data;
	struct acpiphp_func *func = context->func;
	struct acpiphp_func *func = &context->func;
	struct acpiphp_bridge *bridge;
	char objname[64];
	struct acpi_buffer buffer = { .length = sizeof(objname),
@@ -1029,7 +1017,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.slot->bridge);
}

/**
@@ -1047,7 +1035,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.slot->bridge);
		acpiphp_put_context(context);
	}
	mutex_unlock(&acpiphp_context_lock);
@@ -1109,7 +1097,7 @@ void acpiphp_enumerate_slots(struct pci_bus *bus)
		 */
		mutex_lock(&acpiphp_context_lock);
		context = acpiphp_get_context(handle);
		if (WARN_ON(!context || !context->func)) {
		if (WARN_ON(!context)) {
			mutex_unlock(&acpiphp_context_lock);
			put_device(&bus->dev);
			kfree(bridge);
@@ -1118,7 +1106,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.slot->bridge);
		mutex_unlock(&acpiphp_context_lock);
	}