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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
/*
* Driver model for vib triggers
*
* Copyright (C) 2013 HTC Corporation.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __LINUX_VIB_H_INCLUDED
#define __LINUX_VIB_H_INCLUDED
#include <linux/rwsem.h>
/* TODO: a simple usage example for vibrator trigger */
/* Vibrator driver to implement trigger: */
/* 1. Setup "struct vib_trigger_enabler", especially name/default_trigger/enable/trigger_data. */
/* 2. Register it by "vib_trigger_enabler_register()". */
/* 3. Unregister when module unloaded, by "vib_trigger_enabler_unregister()". */
/* 4. Release "struct vib_trigger_enabler" if necessary. */
/* Other drivers to use trigger: */
/* 1. Setup "struct vib_trigger", refer to led trigger. */
/* 2. Register it by "vib_trigger_register_simple()". */
/* 3. Control vibrator by "vib_trigger_event()". */
/* 4. Unregister when module unloaded, by "vib_trigger_unregister_simple()". */
/* 5. Release "struct vib_trigger", refer to led trigger. */
/*
* Vibrator Triggers
*/
#ifdef CONFIG_VIB_TRIGGERS
struct vib_trigger_enabler {
const char *name;
const char *default_trigger; /* Trigger to use */
/* Protects the "trigger" field below */
struct rw_semaphore trigger_lock;
void (*enable)(struct vib_trigger_enabler *enabler, int value);
struct vib_trigger *trigger;
void *trigger_data;
};
struct vib_trigger {
/* Trigger Properties */
const char *name;
/* enabler under control by this trigger */
rwlock_t trig_container_lock;
struct vib_trigger_enabler *enabler;
};
/* Registration functions for simple triggers */
#define DEFINE_VIB_TRIGGER(x) static struct vib_trigger *x;
#define DEFINE_VIB_TRIGGER_GLOBAL(x) struct vib_trigger *x;
extern void vib_trigger_enabler_register(struct vib_trigger_enabler *enabler);
extern void vib_trigger_enabler_unregister(struct vib_trigger_enabler *enabler);
extern void vib_trigger_set(struct vib_trigger_enabler *enabler, struct vib_trigger *trigger);
extern void vib_trigger_set_default(struct vib_trigger_enabler *enabler);
extern void vib_trigger_register_simple(const char *name, struct vib_trigger **trigger);
extern void vib_trigger_unregister_simple(struct vib_trigger *trigger);
extern void vib_trigger_event(struct vib_trigger *trigger, int value);
#else
/* Triggers aren't active - null macros */
#define DEFINE_VIB_TRIGGER(x)
#define DEFINE_VIB_TRIGGER_GLOBAL(x)
#define vib_trigger_enabler_register(x) do {} while (0)
#define vib_trigger_enabler_unregister(x) do {} while (0)
#define vib_trigger_set(x, y) do {} while(0)
#define vib_trigger_set_default(x) do {} while(0)
#define vib_trigger_register_simple(x, y) do {} while(0)
#define vib_trigger_unregister_simple(x) do {} while(0)
#define vib_trigger_event(x, y) do {} while(0)
#endif
#endif /* __LINUX_VIB_H_INCLUDED */
|