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

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

ACPI / hotplug: Move container-specific code out of the core



Move container-specific uevents from the core hotplug code to the
container scan handler's .attach() and .detach() callbacks.

This way the core will not have to special-case containers and
the uevents will be guaranteed to happen every time a container
is either scanned or trimmed as appropriate.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 3338db00
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -44,19 +44,24 @@ static const struct acpi_device_id container_device_ids[] = {
	{"", 0},
};

static int container_device_attach(struct acpi_device *device,
static int container_device_attach(struct acpi_device *adev,
				   const struct acpi_device_id *not_used)
{
	/* This is necessary for container hotplug to work. */
	kobject_uevent(&adev->dev.kobj, KOBJ_ONLINE);
	return 1;
}

static void container_device_detach(struct acpi_device *adev)
{
	kobject_uevent(&adev->dev.kobj, KOBJ_OFFLINE);
}

static struct acpi_scan_handler container_handler = {
	.ids = container_device_ids,
	.attach = container_device_attach,
	.detach = container_device_detach,
	.hotplug = {
		.enabled = true,
		.mode = AHM_CONTAINER,
	},
};

+1 −7
Original line number Diff line number Diff line
@@ -206,9 +206,6 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
	acpi_status status;
	unsigned long long sta;

	if (device->handler && device->handler->hotplug.mode == AHM_CONTAINER)
		kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);

	/*
	 * Carry out two passes here and ignore errors in the first pass,
	 * because if the devices in question are memory blocks and
@@ -288,10 +285,7 @@ static int acpi_scan_device_check(struct acpi_device *adev)
		dev_warn(&adev->dev, "Namespace scan failure\n");
		return error;
	}
	if (adev->handler) {
		if (adev->handler->hotplug.mode == AHM_CONTAINER)
			kobject_uevent(&adev->dev.kobj, KOBJ_ONLINE);
	} else {
	if (!adev->handler) {
		dev_warn(&adev->dev, "Enumeration failure\n");
		return -ENODEV;
	}
+0 −7
Original line number Diff line number Diff line
@@ -91,16 +91,9 @@ struct acpi_device;
 * -----------------
 */

enum acpi_hotplug_mode {
	AHM_GENERIC = 0,
	AHM_CONTAINER,
	AHM_COUNT
};

struct acpi_hotplug_profile {
	struct kobject kobj;
	bool enabled:1;
	enum acpi_hotplug_mode mode;
	int (*scan_dependent)(struct acpi_device *adev);
};