Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/hid/hid-haptic.h
29509 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
3
* HID Haptic support for Linux
4
*
5
* Copyright (c) 2021 Angela Czubak <[email protected]>
6
*/
7
8
#include <linux/hid.h>
9
10
#define HID_HAPTIC_ORDINAL_WAVEFORMNONE 1
11
#define HID_HAPTIC_ORDINAL_WAVEFORMSTOP 2
12
13
#define HID_HAPTIC_MODE_DEVICE 0
14
#define HID_HAPTIC_MODE_HOST 1
15
16
struct hid_haptic_effect {
17
u8 *report_buf;
18
struct input_dev *input_dev;
19
struct work_struct work;
20
struct list_head control;
21
struct mutex control_mutex;
22
};
23
24
struct hid_haptic_effect_node {
25
struct list_head node;
26
struct file *file;
27
};
28
29
struct hid_haptic_device {
30
struct input_dev *input_dev;
31
struct hid_device *hdev;
32
struct hid_report *auto_trigger_report;
33
struct mutex auto_trigger_mutex;
34
struct workqueue_struct *wq;
35
struct hid_report *manual_trigger_report;
36
struct mutex manual_trigger_mutex;
37
size_t manual_trigger_report_len;
38
int pressed_state;
39
s32 pressure_sum;
40
s32 force_logical_minimum;
41
s32 force_physical_minimum;
42
s32 force_resolution;
43
u32 mode;
44
u32 default_auto_trigger;
45
u32 vendor_page;
46
u32 vendor_id;
47
u32 max_waveform_id;
48
u32 max_duration_id;
49
u16 *hid_usage_map;
50
u32 *duration_map;
51
u16 press_ordinal;
52
u16 release_ordinal;
53
struct hid_haptic_effect *effect;
54
struct hid_haptic_effect stop_effect;
55
};
56
57
#if IS_ENABLED(CONFIG_HID_HAPTIC)
58
void hid_haptic_feature_mapping(struct hid_device *hdev,
59
struct hid_haptic_device *haptic,
60
struct hid_field *field, struct hid_usage
61
*usage);
62
bool hid_haptic_check_pressure_unit(struct hid_haptic_device *haptic,
63
struct hid_input *hi, struct hid_field *field);
64
int hid_haptic_input_mapping(struct hid_device *hdev,
65
struct hid_haptic_device *haptic,
66
struct hid_input *hi,
67
struct hid_field *field, struct hid_usage *usage,
68
unsigned long **bit, int *max);
69
int hid_haptic_input_configured(struct hid_device *hdev,
70
struct hid_haptic_device *haptic,
71
struct hid_input *hi);
72
int hid_haptic_init(struct hid_device *hdev, struct hid_haptic_device **haptic_ptr);
73
void hid_haptic_handle_press_release(struct hid_haptic_device *haptic);
74
void hid_haptic_pressure_reset(struct hid_haptic_device *haptic);
75
void hid_haptic_pressure_increase(struct hid_haptic_device *haptic,
76
__s32 pressure);
77
#else
78
static inline
79
void hid_haptic_feature_mapping(struct hid_device *hdev,
80
struct hid_haptic_device *haptic,
81
struct hid_field *field, struct hid_usage
82
*usage)
83
{}
84
static inline
85
bool hid_haptic_check_pressure_unit(struct hid_haptic_device *haptic,
86
struct hid_input *hi, struct hid_field *field)
87
{
88
return false;
89
}
90
static inline
91
int hid_haptic_input_mapping(struct hid_device *hdev,
92
struct hid_haptic_device *haptic,
93
struct hid_input *hi,
94
struct hid_field *field, struct hid_usage *usage,
95
unsigned long **bit, int *max)
96
{
97
return 0;
98
}
99
static inline
100
int hid_haptic_input_configured(struct hid_device *hdev,
101
struct hid_haptic_device *haptic,
102
struct hid_input *hi)
103
{
104
return 0;
105
}
106
static inline
107
void hid_haptic_reset(struct hid_device *hdev, struct hid_haptic_device *haptic)
108
{}
109
static inline
110
int hid_haptic_init(struct hid_device *hdev, struct hid_haptic_device **haptic_ptr)
111
{
112
return 0;
113
}
114
static inline
115
void hid_haptic_handle_press_release(struct hid_haptic_device *haptic) {}
116
static inline
117
bool hid_haptic_handle_input(struct hid_haptic_device *haptic)
118
{
119
return false;
120
}
121
static inline
122
void hid_haptic_pressure_reset(struct hid_haptic_device *haptic) {}
123
static inline
124
void hid_haptic_pressure_increase(struct hid_haptic_device *haptic,
125
__s32 pressure)
126
{}
127
#endif
128
129