blob: ccff7fc5b5ce92c43705d48f25ab3c65ba1a0477 [file] [log] [blame]
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -07001/* 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
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -070021struct gpio_event_input_devs {
22 int count;
23 struct input_dev *dev[];
24};
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070025enum {
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};
31struct gpio_event_info {
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -070032 int (*func)(struct gpio_event_input_devs *input_devs,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070033 struct gpio_event_info *info,
34 void **data, int func);
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -070035 int (*event)(struct gpio_event_input_devs *input_devs,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070036 struct gpio_event_info *info,
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -070037 void **data, unsigned int dev, unsigned int type,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070038 unsigned int code, int value); /* out events */
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -070039 bool no_suspend;
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070040};
41
42struct 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);
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -070047 const char *names[]; /* If name is NULL, names contain a NULL */
48 /* terminated list of input devices to create */
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070049};
50
51#define GPIO_EVENT_DEV_NAME "gpio-event"
52
53/* Key matrix */
54
55enum 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
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -070069#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
74extern int gpio_event_matrix_func(struct gpio_event_input_devs *input_devs,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070075 struct gpio_event_info *info, void **data, int func);
76struct 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 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070086 struct timespec settle_time;
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070087 /* time to wait before scanning the keypad a second time */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070088 struct timespec debounce_delay;
89 struct timespec poll_time;
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -070090 unsigned flags;
91};
92
93/* Directly connected inputs and outputs */
94
95enum 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,
Dima Zavin050c06e2011-11-08 13:03:11 -0800101 GPIOEDF_PRINT_KEY_UNSTABLE = 1U << 10,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700102};
103
104struct gpio_event_direct_entry {
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -0700105 uint32_t gpio:16;
106 uint32_t code:10;
107 uint32_t dev:6;
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700108};
109
110/* inputs */
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -0700111extern int gpio_event_input_func(struct gpio_event_input_devs *input_devs,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700112 struct gpio_event_info *info, void **data, int func);
113struct gpio_event_input_info {
114 /* initialize to gpio_event_input_func */
115 struct gpio_event_info info;
116 ktime_t debounce_time;
117 ktime_t poll_time;
118 uint16_t flags;
119 uint16_t type;
120 const struct gpio_event_direct_entry *keymap;
121 size_t keymap_size;
122};
123
124/* outputs */
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -0700125extern int gpio_event_output_func(struct gpio_event_input_devs *input_devs,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700126 struct gpio_event_info *info, void **data, int func);
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -0700127extern int gpio_event_output_event(struct gpio_event_input_devs *input_devs,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700128 struct gpio_event_info *info, void **data,
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -0700129 unsigned int dev, unsigned int type,
130 unsigned int code, int value);
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700131struct gpio_event_output_info {
132 /* initialize to gpio_event_output_func and gpio_event_output_event */
133 struct gpio_event_info info;
134 uint16_t flags;
135 uint16_t type;
136 const struct gpio_event_direct_entry *keymap;
137 size_t keymap_size;
138};
139
140
141/* axes */
142
143enum gpio_event_axis_flags {
144 GPIOEAF_PRINT_UNKNOWN_DIRECTION = 1U << 16,
145 GPIOEAF_PRINT_RAW = 1U << 17,
146 GPIOEAF_PRINT_EVENT = 1U << 18,
147};
148
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -0700149extern int gpio_event_axis_func(struct gpio_event_input_devs *input_devs,
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700150 struct gpio_event_info *info, void **data, int func);
151struct gpio_event_axis_info {
152 /* initialize to gpio_event_axis_func */
153 struct gpio_event_info info;
Arve Hjønnevåg0da26bf2009-07-24 15:19:56 -0700154 uint8_t count; /* number of gpios for this axis */
155 uint8_t dev; /* device index when using multiple input devices */
Arve Hjønnevåg72fc6242008-10-15 18:23:47 -0700156 uint8_t type; /* EV_REL or EV_ABS */
157 uint16_t code;
158 uint16_t decoded_size;
159 uint16_t (*map)(struct gpio_event_axis_info *info, uint16_t in);
160 uint32_t *gpio;
161 uint32_t flags;
162};
163#define gpio_axis_2bit_gray_map gpio_axis_4bit_gray_map
164#define gpio_axis_3bit_gray_map gpio_axis_4bit_gray_map
165uint16_t gpio_axis_4bit_gray_map(
166 struct gpio_event_axis_info *info, uint16_t in);
167uint16_t gpio_axis_5bit_singletrack_map(
168 struct gpio_event_axis_info *info, uint16_t in);
169
170#endif