power: smb349: add callback to update charger
[linux-2.6.git] / include / linux / gpio_event.h
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         GPIOEDF_PRINT_KEY_UNSTABLE  = 1U << 10,
102 };
103
104 struct gpio_event_direct_entry {
105         uint32_t gpio:16;
106         uint32_t code:10;
107         uint32_t dev:6;
108 };
109
110 /* inputs */
111 extern int gpio_event_input_func(struct gpio_event_input_devs *input_devs,
112                         struct gpio_event_info *info, void **data, int func);
113 struct 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 */
125 extern int gpio_event_output_func(struct gpio_event_input_devs *input_devs,
126                         struct gpio_event_info *info, void **data, int func);
127 extern int gpio_event_output_event(struct gpio_event_input_devs *input_devs,
128                         struct gpio_event_info *info, void **data,
129                         unsigned int dev, unsigned int type,
130                         unsigned int code, int value);
131 struct 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
143 enum 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
149 extern int gpio_event_axis_func(struct gpio_event_input_devs *input_devs,
150                         struct gpio_event_info *info, void **data, int func);
151 struct gpio_event_axis_info {
152         /* initialize to gpio_event_axis_func */
153         struct gpio_event_info info;
154         uint8_t  count; /* number of gpios for this axis */
155         uint8_t  dev; /* device index when using multiple input devices */
156         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
165 uint16_t gpio_axis_4bit_gray_map(
166                         struct gpio_event_axis_info *info, uint16_t in);
167 uint16_t gpio_axis_5bit_singletrack_map(
168                         struct gpio_event_axis_info *info, uint16_t in);
169
170 #endif