xref: /haiku/src/add-ons/kernel/drivers/wmi/WMIDevice.cpp (revision 1baf45b64bf05bb58c5f1b0d191aec1e9c13c07e)
1 /*
2  * Copyright 2020, Jérôme Duval, jerome.duval@gmail.com.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "WMIPrivate.h"
8 
9 
WMIDevice(device_node * node)10 WMIDevice::WMIDevice(device_node *node)
11 	:
12 	fNode(node),
13 	fBus(NULL),
14 	fBusCookie(UINT32_MAX),
15 	fInitStatus(B_OK)
16 {
17 	CALLED();
18 
19 	{
20 		device_node *parent = gDeviceManager->get_parent_node(node);
21 		gDeviceManager->get_driver(parent, NULL, (void **)&fBus);
22 		gDeviceManager->put_node(parent);
23 	}
24 
25 	fInitStatus = gDeviceManager->get_attr_uint32(node, WMI_BUS_COOKIE,
26 		&fBusCookie, false);
27 }
28 
29 
~WMIDevice()30 WMIDevice::~WMIDevice()
31 {
32 }
33 
34 
35 status_t
InitCheck()36 WMIDevice::InitCheck()
37 {
38 	return fInitStatus;
39 }
40 
41 
42 status_t
EvaluateMethod(uint8 instance,uint32 methodId,const acpi_data * in,acpi_data * out)43 WMIDevice::EvaluateMethod(uint8 instance, uint32 methodId, const acpi_data* in,
44 	acpi_data* out)
45 {
46 	CALLED();
47 	return fBus->EvaluateMethod(fBusCookie, instance, methodId, in, out);
48 }
49 
50 
51 status_t
InstallEventHandler(const char * guidString,acpi_notify_handler handler,void * context)52 WMIDevice::InstallEventHandler(const char* guidString,
53 	acpi_notify_handler handler, void* context)
54 {
55 	CALLED();
56 	if (guidString == NULL || handler == NULL)
57 		return B_BAD_VALUE;
58 
59 	return fBus->InstallEventHandler(guidString, handler, context);
60 }
61 
62 
63 status_t
RemoveEventHandler(const char * guidString)64 WMIDevice::RemoveEventHandler(const char* guidString)
65 {
66 	CALLED();
67 	if (guidString == NULL)
68 		return B_BAD_VALUE;
69 
70 	return fBus->RemoveEventHandler(guidString);
71 }
72 
73 
74 status_t
GetEventData(uint32 notify,acpi_data * out)75 WMIDevice::GetEventData(uint32 notify, acpi_data* out)
76 {
77 	CALLED();
78 	return fBus->GetEventData(notify, out);
79 }
80 
81 
82 const char*
GetUid()83 WMIDevice::GetUid()
84 {
85 	CALLED();
86 	return fBus->GetUid(fBusCookie);
87 }
88 
89 
90 //	#pragma mark - driver module API
91 
92 
93 static status_t
wmi_init_device(device_node * node,void ** _device)94 wmi_init_device(device_node *node, void **_device)
95 {
96 	CALLED();
97 	WMIDevice *device = new(std::nothrow) WMIDevice(node);
98 	if (device == NULL)
99 		return B_NO_MEMORY;
100 
101 	status_t result = device->InitCheck();
102 	if (result != B_OK) {
103 		ERROR("failed to set up wmi device object\n");
104 		return result;
105 	}
106 
107 	*_device = device;
108 
109 	return B_OK;
110 }
111 
112 
113 static void
wmi_uninit_device(void * _device)114 wmi_uninit_device(void *_device)
115 {
116 	CALLED();
117 	WMIDevice *device = (WMIDevice *)_device;
118 	delete device;
119 }
120 
121 
122 static status_t
wmi_evaluate_method(wmi_device _device,uint8 instance,uint32 methodId,const acpi_data * in,acpi_data * out)123 wmi_evaluate_method(wmi_device _device, uint8 instance, uint32 methodId,
124 	const acpi_data* in, acpi_data* out)
125 {
126 	WMIDevice *device = (WMIDevice *)_device;
127 	return device->EvaluateMethod(instance, methodId, in, out);
128 }
129 
130 
131 static status_t
wmi_install_event_handler(wmi_device _device,const char * guidString,acpi_notify_handler handler,void * context)132 wmi_install_event_handler(wmi_device _device, const char* guidString,
133 	acpi_notify_handler handler, void* context)
134 {
135 	WMIDevice *device = (WMIDevice *)_device;
136 	return device->InstallEventHandler(guidString, handler, context);
137 }
138 
139 
140 static status_t
wmi_remove_event_handler(wmi_device _device,const char * guidString)141 wmi_remove_event_handler(wmi_device _device, const char* guidString)
142 {
143 	WMIDevice *device = (WMIDevice *)_device;
144 	return device->RemoveEventHandler(guidString);
145 }
146 
147 
148 static status_t
wmi_get_event_data(wmi_device _device,uint32 notify,acpi_data * out)149 wmi_get_event_data(wmi_device _device, uint32 notify, acpi_data* out)
150 {
151 	WMIDevice *device = (WMIDevice *)_device;
152 	return device->GetEventData(notify, out);
153 }
154 
155 
156 static const char*
wmi_get_uid(wmi_device _device)157 wmi_get_uid(wmi_device _device)
158 {
159 	WMIDevice *device = (WMIDevice *)_device;
160 	return device->GetUid();
161 }
162 
163 
164 static status_t
std_ops(int32 op,...)165 std_ops(int32 op, ...)
166 {
167 	switch (op) {
168 		case B_MODULE_INIT:
169 		case B_MODULE_UNINIT:
170 			return B_OK;
171 
172 		default:
173 			return B_ERROR;
174 	}
175 }
176 
177 
178 wmi_device_interface gWMIDeviceModule = {
179 	{
180 		{
181 			WMI_DEVICE_MODULE_NAME,
182 			0,
183 			std_ops
184 		},
185 
186 		NULL,	// supported devices
187 		NULL,	// register node
188 		wmi_init_device,
189 		wmi_uninit_device,
190 		NULL,	// register child devices
191 		NULL,	// rescan
192 		NULL, 	// device_removed
193 	},
194 
195 	wmi_evaluate_method,
196 	wmi_install_event_handler,
197 	wmi_remove_event_handler,
198 	wmi_get_event_data,
199 	wmi_get_uid,
200 };
201