Merge tag 'arm-defconfig-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / hid / surface-hid / surface_hid_core.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Common/core components for the Surface System Aggregator Module (SSAM) HID
4  * transport driver. Provides support for integrated HID devices on Microsoft
5  * Surface models.
6  *
7  * Copyright (C) 2019-2021 Maximilian Luz <luzmaximilian@gmail.com>
8  */
9
10 #ifndef SURFACE_HID_CORE_H
11 #define SURFACE_HID_CORE_H
12
13 #include <linux/hid.h>
14 #include <linux/pm.h>
15 #include <linux/types.h>
16
17 #include <linux/surface_aggregator/controller.h>
18 #include <linux/surface_aggregator/device.h>
19
20 enum surface_hid_descriptor_entry {
21         SURFACE_HID_DESC_HID    = 0,
22         SURFACE_HID_DESC_REPORT = 1,
23         SURFACE_HID_DESC_ATTRS  = 2,
24 };
25
26 struct surface_hid_descriptor {
27         __u8 desc_len;                  /* = 9 */
28         __u8 desc_type;                 /* = HID_DT_HID */
29         __le16 hid_version;
30         __u8 country_code;
31         __u8 num_descriptors;           /* = 1 */
32
33         __u8 report_desc_type;          /* = HID_DT_REPORT */
34         __le16 report_desc_len;
35 } __packed;
36
37 static_assert(sizeof(struct surface_hid_descriptor) == 9);
38
39 struct surface_hid_attributes {
40         __le32 length;
41         __le16 vendor;
42         __le16 product;
43         __le16 version;
44         __u8 _unknown[22];
45 } __packed;
46
47 static_assert(sizeof(struct surface_hid_attributes) == 32);
48
49 struct surface_hid_device;
50
51 struct surface_hid_device_ops {
52         int (*get_descriptor)(struct surface_hid_device *shid, u8 entry, u8 *buf, size_t len);
53         int (*output_report)(struct surface_hid_device *shid, u8 rprt_id, u8 *buf, size_t len);
54         int (*get_feature_report)(struct surface_hid_device *shid, u8 rprt_id, u8 *buf, size_t len);
55         int (*set_feature_report)(struct surface_hid_device *shid, u8 rprt_id, u8 *buf, size_t len);
56 };
57
58 struct surface_hid_device {
59         struct device *dev;
60         struct ssam_controller *ctrl;
61         struct ssam_device_uid uid;
62
63         struct surface_hid_descriptor hid_desc;
64         struct surface_hid_attributes attrs;
65
66         struct ssam_event_notifier notif;
67         struct hid_device *hid;
68
69         struct surface_hid_device_ops ops;
70 };
71
72 int surface_hid_device_add(struct surface_hid_device *shid);
73 void surface_hid_device_destroy(struct surface_hid_device *shid);
74
75 extern const struct dev_pm_ops surface_hid_pm_ops;
76
77 #endif /* SURFACE_HID_CORE_H */