2 Copyright (C) 2017, The AROS Development Team. All rights reserved.
7 #include <aros/debug.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
,
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
) {
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
;
82 static int ACPIButton_Init(LIBBASETYPEPTR LIBBASE
)
84 struct class_static_data
*csd
= &LIBBASE
->hsi_csd
;
85 struct Library
*OOPBase
= csd
->cs_OOPBase
;
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
)
97 csd
->cs_UtilityBase
= OpenLibrary("utility.library", 36);
98 if (!csd
->cs_UtilityBase
)
100 CloseLibrary(csd
->cs_ACPICABase
);
104 root
= OOP_NewObject(NULL
, CLID_Hidd_System
, NULL
);
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},
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__
));
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__
));
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__
));
164 D(bug("[HiddACPIButton] %s: Finished\n", __func__
));
172 static int ACPIButton_Expunge(LIBBASETYPEPTR LIBBASE
)
174 D(struct class_static_data
*csd
= &LIBBASE
->hsi_csd
;)
176 struct Library
*OOPBase
= csd
->cs_OOPBase
;
178 D(bug("[HiddACPIButton] %s(csd=%p)\n", __func__
, csd
));
183 ADD2INITLIB(ACPIButton_Init
, -2)
184 ADD2EXPUNGELIB(ACPIButton_Expunge
, -2)