try to detect the button devices.
[AROS.git] / rom / hidds / acpi / button / acpibutton_init.c
blob013a241cea26539559c5756186f91a7ef5e49136
1 /*
2 Copyright (C) 2017, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 1
7 #include <aros/debug.h>
9 #include <stddef.h>
10 #include <exec/types.h>
12 #include <proto/exec.h>
13 #include <proto/oop.h>
15 #include <aros/symbolsets.h>
16 #include <hidd/hidd.h>
17 #include <hidd/system.h>
19 #include "acpibutton_intern.h"
21 #include LC_LIBDEFS_FILE
23 static ACPI_STATUS ACPIButton_DeviceQuery(ACPI_HANDLE handle,
24 UINT32 level,
25 void *context,
26 void **retval)
28 struct class_static_data *csd = (struct class_static_data *)context;
29 ACPI_DEVICE_INFO *acpiDevInfo = NULL;
30 ACPI_STATUS acpiStatus;
32 D(bug("[HiddACPIButton] %s(0x%p)\n", __func__, handle));
34 acpiStatus = AcpiGetObjectInfo(handle, &acpiDevInfo);
35 if (acpiStatus != AE_OK) {
36 if (acpiDevInfo) {
37 FreeVec(acpiDevInfo);
39 return acpiStatus;
42 if (acpiDevInfo->Valid & ACPI_VALID_HID)
44 D(bug("[HiddACPIButton] %s: HardwareID = '%s'\n", __func__, acpiDevInfo->HardwareId.String));
46 if (!strcmp(acpiDevInfo->HardwareId.String, "PNP0C0C"))
48 D(bug("[HiddACPIButton] %s: Power Button Device Found\n", __func__));
49 csd->acpiPowerBHandle = handle;
50 csd->acpiPowerBType = vHidd_ACPIButton_Power;
52 else if (!strcmp(acpiDevInfo->HardwareId.String, "ACPI_FPB"))
54 D(bug("[HiddACPIButton] %s: Fixed Power Button Device Found\n", __func__));
55 csd->acpiPowerBHandle = handle;
56 csd->acpiPowerBType = vHidd_ACPIButton_PowerF;
58 else if (!strcmp(acpiDevInfo->HardwareId.String, "PNP0C0E"))
60 D(bug("[HiddACPIButton] %s: Sleep Button Device Found\n", __func__));
61 csd->acpiSleepBHandle = handle;
62 csd->acpiSleepBType = vHidd_ACPIButton_Sleep;
64 else if (!strcmp(acpiDevInfo->HardwareId.String, "ACPI_FSB"))
66 D(bug("[HiddACPIButton] %s: Fixed Sleep Button Device Found\n", __func__));
67 csd->acpiSleepBHandle = handle;
68 csd->acpiSleepBType = vHidd_ACPIButton_SleepF;
70 else if (!strcmp(acpiDevInfo->HardwareId.String, "PNP0C0D"))
72 D(bug("[HiddACPIButton] %s: Lid Button Device Found\n", __func__));
73 csd->acpibLidBHandle = handle;
77 FreeVec(acpiDevInfo);
79 return AE_OK;
82 static int ACPIButton_Init(LIBBASETYPEPTR LIBBASE)
84 struct class_static_data *csd = &LIBBASE->hsi_csd;
85 struct Library *OOPBase = csd->cs_OOPBase;
86 OOP_Object *root;
87 int buttonCount = 0;
88 int retVal = FALSE;
89 __unused ACPI_STATUS acpiStatus;
91 D(bug("[HiddACPIButton] %s()\n", __func__));
93 csd->cs_ACPICABase = OpenLibrary("acpica.library", 0);
94 if (!csd->cs_ACPICABase)
95 return FALSE;
97 csd->cs_UtilityBase = OpenLibrary("utility.library", 36);
98 if (!csd->cs_UtilityBase)
100 CloseLibrary(csd->cs_ACPICABase);
101 return FALSE;
104 root = OOP_NewObject(NULL, CLID_Hidd_System, NULL);
105 if (!root)
106 root = OOP_NewObject(NULL, CLID_HW_Root, NULL);
108 csd->hwAB = OOP_ObtainAttrBase(IID_HW);
109 csd->hiddAB = OOP_ObtainAttrBase(IID_Hidd);
110 csd->hiddACPIButtonAB = OOP_ObtainAttrBase(IID_Hidd_ACPIButton);
113 struct TagItem instanceTags[] =
115 { csd->hiddACPIButtonAB + aoHidd_ACPIButton_Type, 0},
116 { csd->hiddACPIButtonAB + aoHidd_ACPIButton_Handle, 0},
117 { csd->hiddACPIButtonAB + aoHidd_ACPIButton_Hook, 0},
118 { TAG_DONE, 0}
121 acpiStatus = AcpiGetDevices(NULL, ACPIButton_DeviceQuery, csd, NULL);
122 if (acpiStatus == AE_OK)
124 if (csd->acpiPowerBHandle != NULL)
126 instanceTags[0].ti_Data = (IPTR)csd->acpiPowerBType;
127 instanceTags[1].ti_Data = (IPTR)csd->acpiPowerBHandle;
128 instanceTags[2].ti_Data = 0;
130 if (HW_AddDriver(root, csd->oopclass, instanceTags))
132 D(bug("[HiddACPIButton] %s: Power-Button initialised\n", __func__));
133 buttonCount++;
137 if (csd->acpiSleepBHandle != NULL)
139 instanceTags[0].ti_Data = (IPTR)csd->acpiSleepBType;
140 instanceTags[1].ti_Data = (IPTR)csd->acpiSleepBHandle;
141 instanceTags[2].ti_Data = 0;
143 if (HW_AddDriver(root, csd->oopclass, instanceTags))
145 D(bug("[HiddACPIButton] %s: Sleep-Button initialised\n", __func__));
146 buttonCount++;
150 if (csd->acpibLidBHandle != NULL)
152 instanceTags[0].ti_Data = vHidd_ACPIButton_Lid;
153 instanceTags[1].ti_Data = (IPTR)csd->acpibLidBHandle;
154 instanceTags[2].ti_Data = 0;
156 if (HW_AddDriver(root, csd->oopclass, instanceTags))
158 D(bug("[HiddACPIButton] %s: Lid-Button initialised\n", __func__));
159 buttonCount++;
164 D(bug("[HiddACPIButton] %s: Finished\n", __func__));
166 if (buttonCount > 0)
167 retVal = TRUE;
169 return retVal;
172 static int ACPIButton_Expunge(LIBBASETYPEPTR LIBBASE)
174 D(struct class_static_data *csd = &LIBBASE->hsi_csd;)
175 #if (0)
176 struct Library *OOPBase = csd->cs_OOPBase;
177 #endif
178 D(bug("[HiddACPIButton] %s(csd=%p)\n", __func__, csd));
180 return TRUE;
183 ADD2INITLIB(ACPIButton_Init, -2)
184 ADD2EXPUNGELIB(ACPIButton_Expunge, -2)