aboutsummaryrefslogtreecommitdiff
path: root/include/linux/vibtrig.h
blob: edbabd454e6e3e3a67a784b95c4e5b2274a452c3 (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
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 */