acpi: create fake acpi devices for FADT power and sleep buttons.
* adjust ACPIDeviceModule to accept nodes without ACPI_DEVICE_PATH_ITEM.
This commit is contained in:
@@ -57,6 +57,8 @@ acpi_get_object_type(acpi_device device)
|
|||||||
static status_t
|
static status_t
|
||||||
acpi_get_object(acpi_device device, const char *path, acpi_object_type **return_value)
|
acpi_get_object(acpi_device device, const char *path, acpi_object_type **return_value)
|
||||||
{
|
{
|
||||||
|
if (device->path == NULL)
|
||||||
|
return B_BAD_VALUE;
|
||||||
if (path) {
|
if (path) {
|
||||||
char objname[255];
|
char objname[255];
|
||||||
snprintf(objname, sizeof(objname), "%s.%s", device->path, path);
|
snprintf(objname, sizeof(objname), "%s.%s", device->path, path);
|
||||||
@@ -86,13 +88,12 @@ static status_t
|
|||||||
acpi_device_init_driver(device_node *node, void **cookie)
|
acpi_device_init_driver(device_node *node, void **cookie)
|
||||||
{
|
{
|
||||||
ACPI_HANDLE handle;
|
ACPI_HANDLE handle;
|
||||||
const char *path;
|
const char *path = NULL;
|
||||||
uint32 type;
|
uint32 type;
|
||||||
|
|
||||||
if (gDeviceManager->get_attr_uint32(node, ACPI_DEVICE_TYPE_ITEM, &type, false) != B_OK)
|
if (gDeviceManager->get_attr_uint32(node, ACPI_DEVICE_TYPE_ITEM, &type, false) != B_OK)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
if (gDeviceManager->get_attr_string(node, ACPI_DEVICE_PATH_ITEM, &path, false) != B_OK)
|
gDeviceManager->get_attr_string(node, ACPI_DEVICE_PATH_ITEM, &path, false);
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
acpi_device_cookie *device = (acpi_device_cookie*)malloc(sizeof(*device));
|
acpi_device_cookie *device = (acpi_device_cookie*)malloc(sizeof(*device));
|
||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
@@ -100,13 +101,13 @@ acpi_device_init_driver(device_node *node, void **cookie)
|
|||||||
|
|
||||||
memset(device, 0, sizeof(*device));
|
memset(device, 0, sizeof(*device));
|
||||||
|
|
||||||
if (AcpiGetHandle(NULL, (ACPI_STRING)path, &handle) != AE_OK) {
|
if (path != NULL && AcpiGetHandle(NULL, (ACPI_STRING)path, &handle) != AE_OK) {
|
||||||
free(device);
|
free(device);
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
device->handle = handle;
|
device->handle = handle;
|
||||||
device->path = strdup(path);
|
device->path = path != NULL ? strdup(path) : NULL;
|
||||||
device->type = type;
|
device->type = type;
|
||||||
device->node = node;
|
device->node = node;
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,11 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "ACPIPrivate.h"
|
|
||||||
|
|
||||||
|
#include "ACPIPrivate.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "acpi.h"
|
||||||
|
}
|
||||||
#include <dpc.h>
|
#include <dpc.h>
|
||||||
#include <PCI.h>
|
#include <PCI.h>
|
||||||
|
|
||||||
@@ -133,6 +136,44 @@ acpi_module_register_child_devices(void* cookie)
|
|||||||
if (status != B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
if ((AcpiGbl_FADT.Flags & ACPI_FADT_POWER_BUTTON) == 0) {
|
||||||
|
dprintf("registering power button\n");
|
||||||
|
device_attr attrs[] = {
|
||||||
|
// info about device
|
||||||
|
{ B_DEVICE_BUS, B_STRING_TYPE, { string: "acpi" }},
|
||||||
|
|
||||||
|
// info about the device
|
||||||
|
{ ACPI_DEVICE_HID_ITEM, B_STRING_TYPE, { string: "ACPI_FPB" }},
|
||||||
|
{ ACPI_DEVICE_TYPE_ITEM, B_UINT32_TYPE, { ui32: ACPI_TYPE_DEVICE }},
|
||||||
|
|
||||||
|
// consumer specification
|
||||||
|
{ B_DEVICE_FLAGS, B_UINT32_TYPE, { ui32: B_FIND_MULTIPLE_CHILDREN }},
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
device_node* deviceNode;
|
||||||
|
gDeviceManager->register_node(node, ACPI_DEVICE_MODULE_NAME, attrs,
|
||||||
|
NULL, &deviceNode);
|
||||||
|
}
|
||||||
|
if ((AcpiGbl_FADT.Flags & ACPI_FADT_SLEEP_BUTTON) == 0) {
|
||||||
|
dprintf("registering sleep button\n");
|
||||||
|
device_attr attrs[] = {
|
||||||
|
// info about device
|
||||||
|
{ B_DEVICE_BUS, B_STRING_TYPE, { string: "acpi" }},
|
||||||
|
|
||||||
|
// info about the device
|
||||||
|
{ ACPI_DEVICE_HID_ITEM, B_STRING_TYPE, { string: "ACPI_FSB" }},
|
||||||
|
{ ACPI_DEVICE_TYPE_ITEM, B_UINT32_TYPE, { ui32: ACPI_TYPE_DEVICE }},
|
||||||
|
|
||||||
|
// consumer specification
|
||||||
|
{ B_DEVICE_FLAGS, B_UINT32_TYPE, { ui32: B_FIND_MULTIPLE_CHILDREN }},
|
||||||
|
{ NULL }
|
||||||
|
};
|
||||||
|
device_node* deviceNode;
|
||||||
|
gDeviceManager->register_node(node, ACPI_DEVICE_MODULE_NAME, attrs,
|
||||||
|
NULL, &deviceNode);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return acpi_enumerate_child_devices(node, "\\");
|
return acpi_enumerate_child_devices(node, "\\");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user