diff options
Diffstat (limited to 'drivers/acpi/utils.c')
| -rw-r--r-- | drivers/acpi/utils.c | 42 | 
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index adbbc1c80a26..3e87c9c538aa 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c @@ -412,3 +412,45 @@ out:  	return status;  }  EXPORT_SYMBOL(acpi_get_physical_device_location); + +/** + * acpi_evaluate_hotplug_ost: Evaluate _OST for hotplug operations + * @handle: ACPI device handle + * @source_event: source event code + * @status_code: status code + * @status_buf: optional detailed information (NULL if none) + * + * Evaluate _OST for hotplug operations. All ACPI hotplug handlers + * must call this function when evaluating _OST for hotplug operations. + * When the platform does not support _OST, this function has no effect. + */ +acpi_status +acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event, +		u32 status_code, struct acpi_buffer *status_buf) +{ +#ifdef ACPI_HOTPLUG_OST +	union acpi_object params[3] = { +		{.type = ACPI_TYPE_INTEGER,}, +		{.type = ACPI_TYPE_INTEGER,}, +		{.type = ACPI_TYPE_BUFFER,} +	}; +	struct acpi_object_list arg_list = {3, params}; +	acpi_status status; + +	params[0].integer.value = source_event; +	params[1].integer.value = status_code; +	if (status_buf != NULL) { +		params[2].buffer.pointer = status_buf->pointer; +		params[2].buffer.length = status_buf->length; +	} else { +		params[2].buffer.pointer = NULL; +		params[2].buffer.length = 0; +	} + +	status = acpi_evaluate_object(handle, "_OST", &arg_list, NULL); +	return status; +#else +	return AE_OK; +#endif +} +EXPORT_SYMBOL(acpi_evaluate_hotplug_ost);  | 
