summaryrefslogtreecommitdiff
path: root/drivers/hid/i2c-hid/i2c-hid-acpi.h
blob: 0bbed1853313dc5b9e9e42d24fee1a8be8684ecc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* SPDX-License-Identifier: GPL-2.0-only */

#ifndef _I2C_HID_ACPI_H
#define _I2C_HID_ACPI_H

#include <linux/acpi.h>
#include <linux/uuid.h>

static inline int i2c_hid_acpi_get_descriptor(struct acpi_device *adev)
{
	/* HID I²C Device: 3cdff6f7-4267-4555-ad05-b30a3d8938de */
	static const guid_t i2c_hid_guid =
		GUID_INIT(0x3CDFF6F7, 0x4267, 0x4555,
			  0xAD, 0x05, 0xB3, 0x0A, 0x3D, 0x89, 0x38, 0xDE);

	acpi_handle handle = acpi_device_handle(adev);
	union acpi_object *obj;
	u16 addr;

	obj = acpi_evaluate_dsm_typed(handle, &i2c_hid_guid,
				      1, 1, NULL, ACPI_TYPE_INTEGER);
	if (!obj) {
		acpi_handle_err(handle,
				"Error _DSM call to get HID descriptor address failed\n");
		return -ENODEV;
	}

	addr = obj->integer.value;
	ACPI_FREE(obj);
	return addr;
}

#endif