[haiku-commits] haiku: hrev53964 - src/add-ons/kernel/drivers/power/acpi_battery headers/private/device src/add-ons/kernel/bus_managers/acpi

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 10 Mar 2020 09:14:25 -0400 (EDT)

hrev53964 adds 2 changesets to branch 'master'
old head: 4f732f12a1ff282dee576e146486634ea95d1c24
new head: a0adb978da0cfda473fb90f86dd55399e962e9d9
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=a0adb978da0c+%5E4f732f12a1ff

----------------------------------------------------------------------------

1b16a232ebb3: acpi_battery: support for _BIX method.
  
  change int types to uint32, as it's more correct.
  
  Change-Id: Iae7043abe4c8b8a121548fe6d6a809f1bd879c8a
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/2334
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

a0adb978da0c: embeddedcontroller: remove child devices if init failed.
  
  Change-Id: I82120ae95936505da06255e6d0cd3b72fb267be5
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/2335
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

3 files changed, 197 insertions(+), 127 deletions(-)
headers/private/device/power_managment.h         |  54 +++--
.../bus_managers/acpi/EmbeddedController.cpp     |  38 +--
.../drivers/power/acpi_battery/acpi_battery.cpp  | 232 +++++++++++--------

############################################################################

Commit:      1b16a232ebb33863789950cb944f42d50d4c43ca
URL:         https://git.haiku-os.org/haiku/commit/?id=1b16a232ebb3
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Tue Mar  3 21:43:56 2020 UTC
Committer:   waddlesplash <waddlesplash@xxxxxxxxx>
Commit-Date: Tue Mar 10 13:14:09 2020 UTC

acpi_battery: support for _BIX method.

change int types to uint32, as it's more correct.

Change-Id: Iae7043abe4c8b8a121548fe6d6a809f1bd879c8a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2334
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/headers/private/device/power_managment.h 
b/headers/private/device/power_managment.h
index 7964a27240..945a9af422 100644
--- a/headers/private/device/power_managment.h
+++ b/headers/private/device/power_managment.h
@@ -31,29 +31,49 @@ const uint32 kMagicACPIBatteryID = 17822;
 #define BATTERY_CHARGING               0x02
 #define BATTERY_CRITICAL_STATE 0x04
 
+#define BATTERY_MAX_STRING_LENGTH      32
+
 
 typedef struct {
-       int             state;
-       int             current_rate;
-       int     capacity;
-       int             voltage;
+       uint32  state;
+       uint32  current_rate;
+       uint32  capacity;
+       uint32  voltage;
 } acpi_battery_info;
 
 
 typedef struct {
-       int             power_unit;
-       int             design_capacity;
-       int             last_full_charge;
-       int             technology;
-       int     design_voltage;
-       int             design_capacity_warning;
-       int             design_capacity_low;
-       int             capacity_granularity_1;
-       int             capacity_granularity_2;
-       char    model_number[32];
-       char    serial_number[32];
-       char    type[32];
-       char    oem_info[32];
+       uint32  power_unit;
+#define ACPI_BATTERY_UNIT_MW   0
+#define ACPI_BATTERY_UNIT_MA   1
+       uint32  design_capacity;
+       uint32  last_full_charge;
+       uint32  technology;
+       uint32  design_voltage;
+       uint32  design_capacity_warning;
+       uint32  design_capacity_low;
+       uint32  capacity_granularity_1;
+       uint32  capacity_granularity_2;
+       char    model_number[BATTERY_MAX_STRING_LENGTH];
+       char    serial_number[BATTERY_MAX_STRING_LENGTH];
+       char    type[BATTERY_MAX_STRING_LENGTH];
+       char    oem_info[BATTERY_MAX_STRING_LENGTH];
+       // ACPI 4.0 and later
+       uint16  revision;
+#define ACPI_BATTERY_REVISION_0                0
+#define ACPI_BATTERY_REVISION_1                1
+#define ACPI_BATTERY_REVISION_BIF      0xffff
+       uint32  cycles;
+       uint32  accuracy;
+       uint32  max_sampling_time;
+       uint32  min_sampling_time;
+       uint32  max_average_interval;
+       uint32  min_average_interval;
+       // ACPI 6.0 and later
+       uint32  swapping_capability;
+#define ACPI_BATTERY_SWAPPING_NO       0
+#define ACPI_BATTERY_SWAPPING_COLD     1
+#define ACPI_BATTERY_SWAPPING_HOT      2
 } acpi_extended_battery_info;
 
 
diff --git a/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp 
b/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp
index 18bbf3a2bf..98931e3c8a 100644
--- a/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp
+++ b/src/add-ons/kernel/drivers/power/acpi_battery/acpi_battery.cpp
@@ -48,20 +48,38 @@ struct battery_device_cookie {
 
 //#define TRACE_BATTERY
 #ifdef TRACE_BATTERY
-#      define TRACE(x...) dprintf("acpi_battery: "x)
+#      define TRACE(x...) dprintf("acpi_battery: " x)
 #else
 #      define TRACE(x...)
 #endif
+#define ERROR(x...) dprintf("acpi_battery: " x)
 
 
 static device_manager_info *sDeviceManager;
 static ConditionVariable sBatteryCondition;
 
 
+inline uint32
+GetUint32(acpi_object_type* pointer)
+{
+       return (pointer->object_type == ACPI_TYPE_INTEGER)
+               ? pointer->integer.integer : UINT32_MAX;
+}
+
+
+inline void
+GetString(char* buffer, size_t length, acpi_object_type* pointer)
+{
+       strlcpy(buffer, (pointer->object_type == ACPI_TYPE_STRING)
+               ? pointer->string.string : "", length);
+}
+
+
 status_t
 ReadBatteryStatus(battery_driver_cookie* cookie,
        acpi_battery_info* batteryStatus)
 {
+       TRACE("ReadBatteryStatus\n");
        status_t status = B_ERROR;
 
        acpi_data buffer;
@@ -84,27 +102,19 @@ ReadBatteryStatus(battery_driver_cookie* cookie,
        }
 
        pointer = object->package.objects;
-       batteryStatus->state = (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : BATTERY_CRITICAL_STATE;
-
-       pointer++;
-       batteryStatus->current_rate = (pointer->object_type == 
ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryStatus->capacity = (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryStatus->voltage = (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
+       batteryStatus->state = GetUint32(pointer++);
+       if (batteryStatus->state == UINT32_MAX)
+               batteryStatus->state = BATTERY_CRITICAL_STATE;
+       batteryStatus->current_rate = GetUint32(pointer++);
+       batteryStatus->capacity = GetUint32(pointer++);
+       batteryStatus->voltage = GetUint32(pointer++);
 
        /* If key values are all < 0, it is likely that the battery slot is 
empty
         * or the battery is damaged.  Set BATTERY_CRITICAL_STATE
         */
-       if (batteryStatus->voltage < 0
-               && batteryStatus->current_rate < 0
-               && batteryStatus->capacity < 0) {
+       if (batteryStatus->voltage == UINT32_MAX
+               && batteryStatus->current_rate == UINT32_MAX
+               && batteryStatus->capacity == UINT32_MAX) {
                batteryStatus->state = BATTERY_CRITICAL_STATE;
        }
 
@@ -119,6 +129,7 @@ status_t
 ReadBatteryInfo(battery_driver_cookie* cookie,
        acpi_extended_battery_info* batteryInfo)
 {
+       TRACE("ReadBatteryInfo\n");
        acpi_data buffer;
        buffer.pointer = NULL;
        buffer.length = ACPI_ALLOCATE_BUFFER;
@@ -126,76 +137,77 @@ ReadBatteryInfo(battery_driver_cookie* cookie,
        acpi_object_type* object;
        acpi_object_type* pointer;
 
+       bool isBIF = false;
        status_t status = cookie->acpi->evaluate_method(cookie->acpi_cookie,
-               "_BIF", NULL, &buffer);
-       if (status != B_OK)
-               goto exit;
+               "_BIX", NULL, &buffer);
+       if (status != B_OK) {
+               isBIF = true;
+               free(buffer.pointer);
+               buffer.pointer = NULL;
+               buffer.length = ACPI_ALLOCATE_BUFFER;
+               status = cookie->acpi->evaluate_method(cookie->acpi_cookie,
+                       "_BIF", NULL, &buffer);
+               if (status != B_OK)
+                       goto exit;
+       }
 
        object = (acpi_object_type*)buffer.pointer;
+       TRACE("ReadBatteryInfo %d %u\n", object->object_type,
+               object->package.count);
        if (object->object_type != ACPI_TYPE_PACKAGE
-               || object->package.count < 13) {
+               || (isBIF && object->package.count < 13)) {
                status = B_ERROR;
                goto exit;
        }
 
        pointer = object->package.objects;
-       batteryInfo->power_unit = (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->design_capacity = (pointer->object_type == 
ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->last_full_charge = (pointer->object_type == 
ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->technology = (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->design_voltage = (pointer->object_type == 
ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->design_capacity_warning =
-               (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->design_capacity_low =
-               (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->capacity_granularity_1 =
-               (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       batteryInfo->capacity_granularity_2 =
-               (pointer->object_type == ACPI_TYPE_INTEGER)
-               ? pointer->integer.integer : -1;
-
-       pointer++;
-       strlcpy(batteryInfo->model_number,
-               (pointer->object_type == ACPI_TYPE_STRING)
-               ? pointer->string.string : "", 
sizeof(batteryInfo->model_number));
-
-       pointer++;
-       strlcpy(batteryInfo->serial_number,
-               (pointer->object_type == ACPI_TYPE_STRING)
-               ? pointer->string.string : "", 
sizeof(batteryInfo->serial_number));
-
-       pointer++;
-       strlcpy(batteryInfo->type, (pointer->object_type == ACPI_TYPE_STRING)
-               ? pointer->string.string : "", sizeof(batteryInfo->type));
-
-       pointer++;
-       strlcpy(batteryInfo->oem_info, (pointer->object_type == 
ACPI_TYPE_STRING)
-               ? pointer->string.string : "", sizeof(batteryInfo->oem_info));
+       if (isBIF) {
+               batteryInfo->revision = ACPI_BATTERY_REVISION_BIF;
+       } else {
+               batteryInfo->revision = GetUint32(pointer++);
+               TRACE("ReadBatteryInfo revision %u\n", batteryInfo->revision);
+
+               if (batteryInfo->revision == ACPI_BATTERY_REVISION_0) {
+                       if (object->package.count < 20) {
+                               status = B_ERROR;
+                               goto exit;
+                       }
+               } else if (object->package.count < 21) {
+                       status = B_ERROR;
+                       goto exit;
+               }
 
+       }
+       batteryInfo->power_unit = GetUint32(pointer++);
+       batteryInfo->design_capacity = GetUint32(pointer++);
+       batteryInfo->last_full_charge = GetUint32(pointer++);
+       batteryInfo->technology = GetUint32(pointer++);
+       batteryInfo->design_voltage = GetUint32(pointer++);
+       batteryInfo->design_capacity_warning = GetUint32(pointer++);
+       batteryInfo->design_capacity_low = GetUint32(pointer++);
+
+       if (batteryInfo->revision != ACPI_BATTERY_REVISION_BIF) {
+               batteryInfo->cycles = GetUint32(pointer++);
+               batteryInfo->accuracy = GetUint32(pointer++);
+               batteryInfo->max_sampling_time = GetUint32(pointer++);
+               batteryInfo->min_sampling_time = GetUint32(pointer++);
+               batteryInfo->max_average_interval = GetUint32(pointer++);
+               batteryInfo->min_average_interval = GetUint32(pointer++);
+       }
+
+       batteryInfo->capacity_granularity_1 = GetUint32(pointer++);
+       batteryInfo->capacity_granularity_2 = GetUint32(pointer++);
+       GetString(batteryInfo->model_number, sizeof(batteryInfo->model_number),
+               pointer++);
+       GetString(batteryInfo->serial_number, 
sizeof(batteryInfo->serial_number),
+               pointer++);
+       GetString(batteryInfo->type, sizeof(batteryInfo->type), pointer++);
+       GetString(batteryInfo->oem_info, sizeof(batteryInfo->oem_info), 
pointer++);
+
+       if (batteryInfo->revision != ACPI_BATTERY_REVISION_BIF
+               && batteryInfo->revision >= ACPI_BATTERY_REVISION_1) {
+               batteryInfo->swapping_capability = GetUint32(pointer++);
+       }
 exit:
        free(buffer.pointer);
        return status;
@@ -255,14 +267,32 @@ TraceBatteryInfo(acpi_extended_battery_info* batteryInfo)
        TRACE("BIF last full charge %i\n", batteryInfo->last_full_charge);
        TRACE("BIF technology %i\n", batteryInfo->technology);
        TRACE("BIF design voltage %i\n", batteryInfo->design_voltage);
-       TRACE("BIF design capacity warning %i\n", 
batteryInfo->design_capacity_warning);
+       TRACE("BIF design capacity warning %i\n",
+               batteryInfo->design_capacity_warning);
        TRACE("BIF design capacity low %i\n", batteryInfo->design_capacity_low);
-       TRACE("BIF capacity granularity 1 %i\n", 
batteryInfo->capacity_granularity_1);
-       TRACE("BIF capacity granularity 2 %i\n", 
batteryInfo->capacity_granularity_2);
+       TRACE("BIF capacity granularity 1 %i\n",
+               batteryInfo->capacity_granularity_1);
+       TRACE("BIF capacity granularity 2 %i\n",
+               batteryInfo->capacity_granularity_2);
+       if (batteryInfo->revision != ACPI_BATTERY_REVISION_BIF) {
+               TRACE("BIX cycles %i\n", batteryInfo->cycles);
+               TRACE("BIX accuracy %i\n", batteryInfo->accuracy);
+               TRACE("BIX max_sampling_time %i\n", 
batteryInfo->max_sampling_time);
+               TRACE("BIX min_sampling_time %i\n", 
batteryInfo->min_sampling_time);
+               TRACE("BIX max_average_interval %i\n",
+                       batteryInfo->max_average_interval);
+               TRACE("BIX min_average_interval %i\n",
+                       batteryInfo->min_average_interval);
+       }
        TRACE("BIF model number %s\n", batteryInfo->model_number);
        TRACE("BIF serial number %s\n", batteryInfo->serial_number);
        TRACE("BIF type %s\n", batteryInfo->type);
        TRACE("BIF oem info %s\n", batteryInfo->oem_info);
+       if (batteryInfo->revision != ACPI_BATTERY_REVISION_BIF
+               && batteryInfo->revision >= ACPI_BATTERY_REVISION_1) {
+               TRACE("BIX swapping_capability %i\n",
+                       batteryInfo->swapping_capability);
+       }
 }
 
 
@@ -330,8 +360,9 @@ acpi_battery_read(void* _cookie, off_t position, void 
*buffer, size_t* numBytes)
                max_len -= strlen(str);
                str += strlen(str);
 
-               snprintf(str, max_len, " State %i, Current Rate %i, Capacity 
%i, "
-                       "Voltage %i\n", batteryStatus.state, 
batteryStatus.current_rate,
+               snprintf(str, max_len, " State %" B_PRIu32 ", Current Rate %" 
B_PRIu32
+                       ", Capacity %" B_PRIu32 ", Voltage %" B_PRIu32 "\n",
+                       batteryStatus.state, batteryStatus.current_rate,
                        batteryStatus.capacity, batteryStatus.voltage);
                max_len -= strlen(str);
                str += strlen(str);
@@ -340,17 +371,20 @@ acpi_battery_read(void* _cookie, off_t position, void 
*buffer, size_t* numBytes)
                max_len -= strlen(str);
                str += strlen(str);
 
-               snprintf(str, max_len, " Power Unit %i, Design Capacity %i, "
-                       "Last Full Charge %i, Technology %i\n", 
batteryInfo.power_unit,
-                       batteryInfo.design_capacity, 
batteryInfo.last_full_charge,
-                       batteryInfo.technology);
+               snprintf(str, max_len, " Power Unit %" B_PRIu32 ", Design 
Capacity %"
+                       B_PRIu32 ", Last Full Charge %" B_PRIu32 ", Technology 
%" B_PRIu32
+                       "\n", batteryInfo.power_unit, 
batteryInfo.design_capacity,
+                       batteryInfo.last_full_charge, batteryInfo.technology);
                max_len -= strlen(str);
                str += strlen(str);
-               snprintf(str, max_len, " Design Voltage %i, Design Capacity 
Warning %i, "
-                       "Design Capacity Low %i, Capacity Granularity1 %i, "
-                       "Capacity Granularity1 %i\n", 
batteryInfo.design_voltage,
-                       batteryInfo.design_capacity_warning, 
batteryInfo.design_capacity_low,
-                       batteryInfo.capacity_granularity_1, 
batteryInfo.capacity_granularity_1);
+               snprintf(str, max_len, " Design Voltage %" B_PRIu32 ", Design 
Capacity"
+                       " Warning %" B_PRIu32 ", Design Capacity Low %" 
B_PRIu32 ", "
+                       "Capacity Granularity1 %" B_PRIu32 ", Capacity 
Granularity2 %"
+                       B_PRIu32 "\n", batteryInfo.design_voltage,
+                       batteryInfo.design_capacity_warning,
+                       batteryInfo.design_capacity_low,
+                       batteryInfo.capacity_granularity_1,
+                       batteryInfo.capacity_granularity_2);
                max_len -= strlen(str);
                str += strlen(str);
                snprintf(str, max_len, " Model Number %s, Serial Number %s, "
@@ -371,7 +405,8 @@ acpi_battery_read(void* _cookie, off_t position, void 
*buffer, size_t* numBytes)
 
 
 static status_t
-acpi_battery_write(void* cookie, off_t position, const void* buffer, size_t* 
numBytes)
+acpi_battery_write(void* cookie, off_t position, const void* buffer,
+       size_t* numBytes)
 {
        return B_ERROR;
 }
@@ -517,6 +552,15 @@ acpi_battery_init_driver(device_node *node, void 
**driverCookie)
        parent = sDeviceManager->get_parent_node(node);
        sDeviceManager->get_driver(parent, (driver_module_info **)&device->acpi,
                (void **)&device->acpi_cookie);
+
+#ifdef TRACE_BATTERY
+       const char* device_path;
+       if (sDeviceManager->get_attr_string(parent, ACPI_DEVICE_PATH_ITEM,
+               &device_path, false) == B_OK) {
+               TRACE("acpi_battery_init_driver %s\n", device_path);
+       }
+#endif
+
        sDeviceManager->put_node(parent);
 
        // install notify handler
@@ -547,7 +591,7 @@ acpi_battery_register_child_devices(void *cookie)
 
        int pathID = sDeviceManager->create_id(ACPI_BATTERY_PATHID_GENERATOR);
        if (pathID < 0) {
-               TRACE("register_child_devices: couldn't create a path_id\n");
+               ERROR("register_child_devices: couldn't create a path_id\n");
                return B_ERROR;
        }
 

############################################################################

Revision:    hrev53964
Commit:      a0adb978da0cfda473fb90f86dd55399e962e9d9
URL:         https://git.haiku-os.org/haiku/commit/?id=a0adb978da0c
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Sat Mar  7 11:57:22 2020 UTC
Committer:   waddlesplash <waddlesplash@xxxxxxxxx>
Commit-Date: Tue Mar 10 13:14:09 2020 UTC

embeddedcontroller: remove child devices if init failed.

Change-Id: I82120ae95936505da06255e6d0cd3b72fb267be5
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2335
Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp 
b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp
index 011da58345..3d2ec16d03 100644
--- a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp
+++ b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp
@@ -324,14 +324,14 @@ embedded_controller_init_driver(device_node* dev, void** 
_driverCookie)
        // and GPE bit, similar to _PRW.
        status = sc->ec_acpi->evaluate_method(sc->ec_handle, "_GPE", NULL, 
&buf);
        if (status != B_OK) {
-               ERROR("can't evaluate _GPE\n");
-               goto error;
+               ERROR("can't evaluate _GPE %s\n", strerror(status));
+               goto error2;
        }
 
        acpi_object_type* obj;
        obj = (acpi_object_type*)buf.pointer;
        if (obj == NULL)
-               goto error;
+               goto error2;
 
        switch (obj->object_type) {
                case ACPI_TYPE_INTEGER:
@@ -340,16 +340,16 @@ embedded_controller_init_driver(device_node* dev, void** 
_driverCookie)
                        break;
                case ACPI_TYPE_PACKAGE:
                        if (!ACPI_PKG_VALID(obj, 2))
-                               goto error;
+                               goto error2;
                        sc->ec_gpehandle = 
acpi_GetReference(sc->ec_acpi_module, NULL,
                                &obj->package.objects[0]);
                        if (sc->ec_gpehandle == NULL
                                || acpi_PkgInt32(obj, 1, 
(uint32*)&sc->ec_gpebit) != B_OK)
-                               goto error;
+                               goto error2;
                        break;
                default:
                        ERROR("_GPE has invalid type %i\n", 
int(obj->object_type));
-                       goto error;
+                       goto error2;
        }
 
        sc->ec_suspending = FALSE;
@@ -359,7 +359,7 @@ embedded_controller_init_driver(device_node* dev, void** 
_driverCookie)
                embedded_controller_io_ports_parse_callback, sc);
        if (status != B_OK) {
                ERROR("Error while getting IO ports addresses\n");
-               goto error;
+               goto error2;
        }
 
        // Install a handler for this EC's GPE bit.  We want edge-triggered
@@ -369,7 +369,7 @@ embedded_controller_init_driver(device_node* dev, void** 
_driverCookie)
                sc->ec_gpebit, ACPI_GPE_EDGE_TRIGGERED, &EcGpeHandler, sc);
        if (status != B_OK) {
                TRACE("can't install ec GPE handler\n");
-               goto error;
+               goto error1;
        }
 
        // Install address space handler
@@ -378,26 +378,33 @@ embedded_controller_init_driver(device_node* dev, void** 
_driverCookie)
                ACPI_ADR_SPACE_EC, &EcSpaceHandler, &EcSpaceSetup, sc);
        if (status != B_OK) {
                ERROR("can't install address space handler\n");
-               goto error;
+               goto error1;
        }
 
        // Enable runtime GPEs for the handler.
        status = sc->ec_acpi_module->enable_gpe(sc->ec_gpehandle, 
sc->ec_gpebit);
        if (status != B_OK) {
                ERROR("AcpiEnableGpe failed.\n");
-               goto error;
+               goto error1;
        }
 
        return 0;
 
-error:
-       free(buf.pointer);
-
+error1:
        sc->ec_acpi_module->remove_gpe_handler(sc->ec_gpehandle, sc->ec_gpebit,
                &EcGpeHandler);
        sc->ec_acpi->remove_address_space_handler(sc->ec_handle, 
ACPI_ADR_SPACE_EC,
                EcSpaceHandler);
 
+error2:
+       free(buf.pointer);
+
+       // remove child nodes
+       device_node *child = NULL;
+       const device_attr attrs[] = { { NULL } };
+       while (gDeviceManager->get_next_child_node(dev, attrs, &child) == B_OK)
+               gDeviceManager->unregister_node(child);
+
        return ENXIO;
 }
 
@@ -433,15 +440,14 @@ embedded_controller_register_child_devices(void* _cookie)
 static status_t
 embedded_controller_init_device(void* driverCookie, void** cookie)
 {
-       return B_ERROR;
+       *cookie = driverCookie;
+       return B_OK;
 }
 
 
 static void
 embedded_controller_uninit_device(void* _cookie)
 {
-       acpi_ec_cookie* device = (acpi_ec_cookie*)_cookie;
-       free(device);
 }
 
 


Other related posts:

  • » [haiku-commits] haiku: hrev53964 - src/add-ons/kernel/drivers/power/acpi_battery headers/private/device src/add-ons/kernel/bus_managers/acpi - waddlesplash