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

Commit ff754e2e authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Len Brown
Browse files

ACPI: use handle, not device, in system notification path



This patch changes the global system notification path so it uses the
acpi_handle, not the acpi_device.

System notifications often deal with device presence and status change.
In these cases, we may not have an acpi_device.  For example, we may
get a Device Check notification on an object that previously was not
present.  Since the object was not present, we would not have had an
acpi_device for it.

Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent cdd5b8ca
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -450,11 +450,14 @@ int acpi_bus_receive_event(struct acpi_bus_event *event)
                             Notification Handling
   -------------------------------------------------------------------------- */

static void acpi_bus_check_device(struct acpi_device *device)
static void acpi_bus_check_device(acpi_handle handle)
{
	struct acpi_device *device;
	acpi_status status;
	struct acpi_device_status old_status;

	if (acpi_bus_get_device(handle, &device))
		return;
	if (!device)
		return;

@@ -488,13 +491,10 @@ static void acpi_bus_check_device(struct acpi_device *device)
	}
}

static void acpi_bus_check_scope(struct acpi_device *device)
static void acpi_bus_check_scope(acpi_handle handle)
{
	if (!device)
		return;

	/* Status Change? */
	acpi_bus_check_device(device);
	acpi_bus_check_device(handle);

	/*
	 * TBD: Enumerate child devices within this device's scope and
@@ -531,13 +531,10 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
	blocking_notifier_call_chain(&acpi_bus_notify_list,
		type, (void *)handle);

	if (acpi_bus_get_device(handle, &device))
		return;

	switch (type) {

	case ACPI_NOTIFY_BUS_CHECK:
		acpi_bus_check_scope(device);
		acpi_bus_check_scope(handle);
		/*
		 * TBD: We'll need to outsource certain events to non-ACPI
		 *      drivers via the device manager (device.c).
@@ -545,7 +542,7 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
		break;

	case ACPI_NOTIFY_DEVICE_CHECK:
		acpi_bus_check_device(device);
		acpi_bus_check_device(handle);
		/*
		 * TBD: We'll need to outsource certain events to non-ACPI
		 *      drivers via the device manager (device.c).
@@ -583,11 +580,14 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
		break;
	}

	acpi_bus_get_device(handle, &device);
	if (device) {
		driver = device->driver;
		if (driver && driver->ops.notify &&
		    (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
			driver->ops.notify(device, type);
	}
}

/* --------------------------------------------------------------------------
                             Initialization/Cleanup