• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* include/linux/gpio_event.h
2  *
3  * Copyright (C) 2007 Google, Inc.
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  */
15 
16 #ifndef _LINUX_GPIO_EVENT_H
17 #define _LINUX_GPIO_EVENT_H
18 
19 #include <linux/input.h>
20 
21 struct gpio_event_input_devs {
22 	int count;
23 	struct input_dev *dev[];
24 };
25 enum {
26 	GPIO_EVENT_FUNC_UNINIT  = 0x0,
27 	GPIO_EVENT_FUNC_INIT    = 0x1,
28 	GPIO_EVENT_FUNC_SUSPEND = 0x2,
29 	GPIO_EVENT_FUNC_RESUME  = 0x3,
30 };
31 struct gpio_event_info {
32 	int (*func)(struct gpio_event_input_devs *input_devs,
33 		    struct gpio_event_info *info,
34 		    void **data, int func);
35 	int (*event)(struct gpio_event_input_devs *input_devs,
36 		     struct gpio_event_info *info,
37 		     void **data, unsigned int dev, unsigned int type,
38 		     unsigned int code, int value); /* out events */
39 	bool no_suspend;
40 };
41 
42 struct gpio_event_platform_data {
43 	const char *name;
44 	struct gpio_event_info **info;
45 	size_t info_count;
46 	int (*power)(const struct gpio_event_platform_data *pdata, bool on);
47 	const char *names[]; /* If name is NULL, names contain a NULL */
48 			     /* terminated list of input devices to create */
49 };
50 
51 #define GPIO_EVENT_DEV_NAME "gpio-event"
52 
53 /* Key matrix */
54 
55 enum gpio_event_matrix_flags {
56 	/* unset: drive active output low, set: drive active output high */
57 	GPIOKPF_ACTIVE_HIGH              = 1U << 0,
58 	GPIOKPF_DEBOUNCE                 = 1U << 1,
59 	GPIOKPF_REMOVE_SOME_PHANTOM_KEYS = 1U << 2,
60 	GPIOKPF_REMOVE_PHANTOM_KEYS      = GPIOKPF_REMOVE_SOME_PHANTOM_KEYS |
61 					   GPIOKPF_DEBOUNCE,
62 	GPIOKPF_DRIVE_INACTIVE           = 1U << 3,
63 	GPIOKPF_LEVEL_TRIGGERED_IRQ      = 1U << 4,
64 	GPIOKPF_PRINT_UNMAPPED_KEYS      = 1U << 16,
65 	GPIOKPF_PRINT_MAPPED_KEYS        = 1U << 17,
66 	GPIOKPF_PRINT_PHANTOM_KEYS       = 1U << 18,
67 };
68 
69 #define MATRIX_CODE_BITS (10)
70 #define MATRIX_KEY_MASK ((1U << MATRIX_CODE_BITS) - 1)
71 #define MATRIX_KEY(dev, code) \
72 	(((dev) << MATRIX_CODE_BITS) | (code & MATRIX_KEY_MASK))
73 
74 extern int gpio_event_matrix_func(struct gpio_event_input_devs *input_devs,
75 			struct gpio_event_info *info, void **data, int func);
76 struct gpio_event_matrix_info {
77 	/* initialize to gpio_event_matrix_func */
78 	struct gpio_event_info info;
79 	/* size must be ninputs * noutputs */
80 	const unsigned short *keymap;
81 	unsigned int *input_gpios;
82 	unsigned int *output_gpios;
83 	unsigned int ninputs;
84 	unsigned int noutputs;
85 	/* time to wait before reading inputs after driving each output */
86 	ktime_t settle_time;
87 	/* time to wait before scanning the keypad a second time */
88 	ktime_t debounce_delay;
89 	ktime_t poll_time;
90 	unsigned flags;
91 };
92 
93 /* Directly connected inputs and outputs */
94 
95 enum gpio_event_direct_flags {
96 	GPIOEDF_ACTIVE_HIGH         = 1U << 0,
97 /*	GPIOEDF_USE_DOWN_IRQ        = 1U << 1, */
98 /*	GPIOEDF_USE_IRQ             = (1U << 2) | GPIOIDF_USE_DOWN_IRQ, */
99 	GPIOEDF_PRINT_KEYS          = 1U << 8,
100 	GPIOEDF_PRINT_KEY_DEBOUNCE  = 1U << 9,
101 };
102 
103 struct gpio_event_direct_entry {
104 	uint32_t gpio:16;
105 	uint32_t code:10;
106 	uint32_t dev:6;
107 };
108 
109 /* inputs */
110 extern int gpio_event_input_func(struct gpio_event_input_devs *input_devs,
111 			struct gpio_event_info *info, void **data, int func);
112 struct gpio_event_input_info {
113 	/* initialize to gpio_event_input_func */
114 	struct gpio_event_info info;
115 	ktime_t debounce_time;
116 	ktime_t poll_time;
117 	uint16_t flags;
118 	uint16_t type;
119 	const struct gpio_event_direct_entry *keymap;
120 	size_t keymap_size;
121 };
122 
123 /* outputs */
124 extern int gpio_event_output_func(struct gpio_event_input_devs *input_devs,
125 			struct gpio_event_info *info, void **data, int func);
126 extern int gpio_event_output_event(struct gpio_event_input_devs *input_devs,
127 			struct gpio_event_info *info, void **data,
128 			unsigned int dev, unsigned int type,
129 			unsigned int code, int value);
130 struct gpio_event_output_info {
131 	/* initialize to gpio_event_output_func and gpio_event_output_event */
132 	struct gpio_event_info info;
133 	uint16_t flags;
134 	uint16_t type;
135 	const struct gpio_event_direct_entry *keymap;
136 	size_t keymap_size;
137 };
138 
139 
140 /* axes */
141 
142 enum gpio_event_axis_flags {
143 	GPIOEAF_PRINT_UNKNOWN_DIRECTION  = 1U << 16,
144 	GPIOEAF_PRINT_RAW                = 1U << 17,
145 	GPIOEAF_PRINT_EVENT              = 1U << 18,
146 };
147 
148 extern int gpio_event_axis_func(struct gpio_event_input_devs *input_devs,
149 			struct gpio_event_info *info, void **data, int func);
150 struct gpio_event_axis_info {
151 	/* initialize to gpio_event_axis_func */
152 	struct gpio_event_info info;
153 	uint8_t  count; /* number of gpios for this axis */
154 	uint8_t  dev; /* device index when using multiple input devices */
155 	uint8_t  type; /* EV_REL or EV_ABS */
156 	uint16_t code;
157 	uint16_t decoded_size;
158 	uint16_t (*map)(struct gpio_event_axis_info *info, uint16_t in);
159 	uint32_t *gpio;
160 	uint32_t flags;
161 };
162 #define gpio_axis_2bit_gray_map gpio_axis_4bit_gray_map
163 #define gpio_axis_3bit_gray_map gpio_axis_4bit_gray_map
164 uint16_t gpio_axis_4bit_gray_map(
165 			struct gpio_event_axis_info *info, uint16_t in);
166 uint16_t gpio_axis_5bit_singletrack_map(
167 			struct gpio_event_axis_info *info, uint16_t in);
168 
169 #endif
170