xref: /linux/drivers/hid/i2c-hid/i2c-hid-acpi.h (revision a93f3bf4e1d60777b1659b812c9e818cfc53b449)
1*fd7c67d0S谢致邦 (XIE Zhibang) /* SPDX-License-Identifier: GPL-2.0-only */
2*fd7c67d0S谢致邦 (XIE Zhibang) 
3*fd7c67d0S谢致邦 (XIE Zhibang) #ifndef _I2C_HID_ACPI_H
4*fd7c67d0S谢致邦 (XIE Zhibang) #define _I2C_HID_ACPI_H
5*fd7c67d0S谢致邦 (XIE Zhibang) 
6*fd7c67d0S谢致邦 (XIE Zhibang) #include <linux/acpi.h>
7*fd7c67d0S谢致邦 (XIE Zhibang) #include <linux/uuid.h>
8*fd7c67d0S谢致邦 (XIE Zhibang) 
9*fd7c67d0S谢致邦 (XIE Zhibang) static inline int i2c_hid_acpi_get_descriptor(struct acpi_device *adev)
10*fd7c67d0S谢致邦 (XIE Zhibang) {
11*fd7c67d0S谢致邦 (XIE Zhibang) 	/* HID I²C Device: 3cdff6f7-4267-4555-ad05-b30a3d8938de */
12*fd7c67d0S谢致邦 (XIE Zhibang) 	static const guid_t i2c_hid_guid =
13*fd7c67d0S谢致邦 (XIE Zhibang) 		GUID_INIT(0x3CDFF6F7, 0x4267, 0x4555,
14*fd7c67d0S谢致邦 (XIE Zhibang) 			  0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE);
15*fd7c67d0S谢致邦 (XIE Zhibang) 
16*fd7c67d0S谢致邦 (XIE Zhibang) 	acpi_handle handle = acpi_device_handle(adev);
17*fd7c67d0S谢致邦 (XIE Zhibang) 	union acpi_object *obj;
18*fd7c67d0S谢致邦 (XIE Zhibang) 	u16 addr;
19*fd7c67d0S谢致邦 (XIE Zhibang) 
20*fd7c67d0S谢致邦 (XIE Zhibang) 	obj = acpi_evaluate_dsm_typed(handle, &i2c_hid_guid,
21*fd7c67d0S谢致邦 (XIE Zhibang) 				      1, 1, NULL, ACPI_TYPE_INTEGER);
22*fd7c67d0S谢致邦 (XIE Zhibang) 	if (!obj) {
23*fd7c67d0S谢致邦 (XIE Zhibang) 		acpi_handle_err(handle,
24*fd7c67d0S谢致邦 (XIE Zhibang) 				"Error _DSM call to get HID descriptor address failed\n");
25*fd7c67d0S谢致邦 (XIE Zhibang) 		return -ENODEV;
26*fd7c67d0S谢致邦 (XIE Zhibang) 	}
27*fd7c67d0S谢致邦 (XIE Zhibang) 
28*fd7c67d0S谢致邦 (XIE Zhibang) 	addr = obj->integer.value;
29*fd7c67d0S谢致邦 (XIE Zhibang) 	ACPI_FREE(obj);
30*fd7c67d0S谢致邦 (XIE Zhibang) 	return addr;
31*fd7c67d0S谢致邦 (XIE Zhibang) }
32*fd7c67d0S谢致邦 (XIE Zhibang) 
33*fd7c67d0S谢致邦 (XIE Zhibang) #endif
34