mirror of https://github.com/OpenIPC/firmware.git
175 lines
5.6 KiB
Diff
175 lines
5.6 KiB
Diff
diff -drupN a/include/linux/gpio_event.h b/include/linux/gpio_event.h
|
|
--- a/include/linux/gpio_event.h 1970-01-01 03:00:00.000000000 +0300
|
|
+++ b/include/linux/gpio_event.h 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -0,0 +1,170 @@
|
|
+/* include/linux/gpio_event.h
|
|
+ *
|
|
+ * Copyright (C) 2007 Google, Inc.
|
|
+ *
|
|
+ * 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_GPIO_EVENT_H
|
|
+#define _LINUX_GPIO_EVENT_H
|
|
+
|
|
+#include <linux/input.h>
|
|
+
|
|
+struct gpio_event_input_devs {
|
|
+ int count;
|
|
+ struct input_dev *dev[];
|
|
+};
|
|
+enum {
|
|
+ GPIO_EVENT_FUNC_UNINIT = 0x0,
|
|
+ GPIO_EVENT_FUNC_INIT = 0x1,
|
|
+ GPIO_EVENT_FUNC_SUSPEND = 0x2,
|
|
+ GPIO_EVENT_FUNC_RESUME = 0x3,
|
|
+};
|
|
+struct gpio_event_info {
|
|
+ int (*func)(struct gpio_event_input_devs *input_devs,
|
|
+ struct gpio_event_info *info,
|
|
+ void **data, int func);
|
|
+ int (*event)(struct gpio_event_input_devs *input_devs,
|
|
+ struct gpio_event_info *info,
|
|
+ void **data, unsigned int dev, unsigned int type,
|
|
+ unsigned int code, int value); /* out events */
|
|
+ bool no_suspend;
|
|
+};
|
|
+
|
|
+struct gpio_event_platform_data {
|
|
+ const char *name;
|
|
+ struct gpio_event_info **info;
|
|
+ size_t info_count;
|
|
+ int (*power)(const struct gpio_event_platform_data *pdata, bool on);
|
|
+ const char *names[]; /* If name is NULL, names contain a NULL */
|
|
+ /* terminated list of input devices to create */
|
|
+};
|
|
+
|
|
+#define GPIO_EVENT_DEV_NAME "gpio-event"
|
|
+
|
|
+/* Key matrix */
|
|
+
|
|
+enum gpio_event_matrix_flags {
|
|
+ /* unset: drive active output low, set: drive active output high */
|
|
+ GPIOKPF_ACTIVE_HIGH = 1U << 0,
|
|
+ GPIOKPF_DEBOUNCE = 1U << 1,
|
|
+ GPIOKPF_REMOVE_SOME_PHANTOM_KEYS = 1U << 2,
|
|
+ GPIOKPF_REMOVE_PHANTOM_KEYS = GPIOKPF_REMOVE_SOME_PHANTOM_KEYS |
|
|
+ GPIOKPF_DEBOUNCE,
|
|
+ GPIOKPF_DRIVE_INACTIVE = 1U << 3,
|
|
+ GPIOKPF_LEVEL_TRIGGERED_IRQ = 1U << 4,
|
|
+ GPIOKPF_PRINT_UNMAPPED_KEYS = 1U << 16,
|
|
+ GPIOKPF_PRINT_MAPPED_KEYS = 1U << 17,
|
|
+ GPIOKPF_PRINT_PHANTOM_KEYS = 1U << 18,
|
|
+};
|
|
+
|
|
+#define MATRIX_CODE_BITS (10)
|
|
+#define MATRIX_KEY_MASK ((1U << MATRIX_CODE_BITS) - 1)
|
|
+#define MATRIX_KEY(dev, code) \
|
|
+ (((dev) << MATRIX_CODE_BITS) | (code & MATRIX_KEY_MASK))
|
|
+
|
|
+extern int gpio_event_matrix_func(struct gpio_event_input_devs *input_devs,
|
|
+ struct gpio_event_info *info, void **data, int func);
|
|
+struct gpio_event_matrix_info {
|
|
+ /* initialize to gpio_event_matrix_func */
|
|
+ struct gpio_event_info info;
|
|
+ /* size must be ninputs * noutputs */
|
|
+ const unsigned short *keymap;
|
|
+ unsigned int *input_gpios;
|
|
+ unsigned int *output_gpios;
|
|
+ unsigned int ninputs;
|
|
+ unsigned int noutputs;
|
|
+ /* time to wait before reading inputs after driving each output */
|
|
+ ktime_t settle_time;
|
|
+ /* time to wait before scanning the keypad a second time */
|
|
+ ktime_t debounce_delay;
|
|
+ ktime_t poll_time;
|
|
+ unsigned flags;
|
|
+};
|
|
+
|
|
+/* Directly connected inputs and outputs */
|
|
+
|
|
+enum gpio_event_direct_flags {
|
|
+ GPIOEDF_ACTIVE_HIGH = 1U << 0,
|
|
+/* GPIOEDF_USE_DOWN_IRQ = 1U << 1, */
|
|
+/* GPIOEDF_USE_IRQ = (1U << 2) | GPIOIDF_USE_DOWN_IRQ, */
|
|
+ GPIOEDF_PRINT_KEYS = 1U << 8,
|
|
+ GPIOEDF_PRINT_KEY_DEBOUNCE = 1U << 9,
|
|
+ GPIOEDF_PRINT_KEY_UNSTABLE = 1U << 10,
|
|
+};
|
|
+
|
|
+struct gpio_event_direct_entry {
|
|
+ uint32_t gpio:16;
|
|
+ uint32_t code:10;
|
|
+ uint32_t dev:6;
|
|
+};
|
|
+
|
|
+/* inputs */
|
|
+extern int gpio_event_input_func(struct gpio_event_input_devs *input_devs,
|
|
+ struct gpio_event_info *info, void **data, int func);
|
|
+struct gpio_event_input_info {
|
|
+ /* initialize to gpio_event_input_func */
|
|
+ struct gpio_event_info info;
|
|
+ ktime_t debounce_time;
|
|
+ ktime_t poll_time;
|
|
+ uint16_t flags;
|
|
+ uint16_t type;
|
|
+ const struct gpio_event_direct_entry *keymap;
|
|
+ size_t keymap_size;
|
|
+};
|
|
+
|
|
+/* outputs */
|
|
+extern int gpio_event_output_func(struct gpio_event_input_devs *input_devs,
|
|
+ struct gpio_event_info *info, void **data, int func);
|
|
+extern int gpio_event_output_event(struct gpio_event_input_devs *input_devs,
|
|
+ struct gpio_event_info *info, void **data,
|
|
+ unsigned int dev, unsigned int type,
|
|
+ unsigned int code, int value);
|
|
+struct gpio_event_output_info {
|
|
+ /* initialize to gpio_event_output_func and gpio_event_output_event */
|
|
+ struct gpio_event_info info;
|
|
+ uint16_t flags;
|
|
+ uint16_t type;
|
|
+ const struct gpio_event_direct_entry *keymap;
|
|
+ size_t keymap_size;
|
|
+};
|
|
+
|
|
+
|
|
+/* axes */
|
|
+
|
|
+enum gpio_event_axis_flags {
|
|
+ GPIOEAF_PRINT_UNKNOWN_DIRECTION = 1U << 16,
|
|
+ GPIOEAF_PRINT_RAW = 1U << 17,
|
|
+ GPIOEAF_PRINT_EVENT = 1U << 18,
|
|
+};
|
|
+
|
|
+extern int gpio_event_axis_func(struct gpio_event_input_devs *input_devs,
|
|
+ struct gpio_event_info *info, void **data, int func);
|
|
+struct gpio_event_axis_info {
|
|
+ /* initialize to gpio_event_axis_func */
|
|
+ struct gpio_event_info info;
|
|
+ uint8_t count; /* number of gpios for this axis */
|
|
+ uint8_t dev; /* device index when using multiple input devices */
|
|
+ uint8_t type; /* EV_REL or EV_ABS */
|
|
+ uint16_t code;
|
|
+ uint16_t decoded_size;
|
|
+ uint16_t (*map)(struct gpio_event_axis_info *info, uint16_t in);
|
|
+ uint32_t *gpio;
|
|
+ uint32_t flags;
|
|
+};
|
|
+#define gpio_axis_2bit_gray_map gpio_axis_4bit_gray_map
|
|
+#define gpio_axis_3bit_gray_map gpio_axis_4bit_gray_map
|
|
+uint16_t gpio_axis_4bit_gray_map(
|
|
+ struct gpio_event_axis_info *info, uint16_t in);
|
|
+uint16_t gpio_axis_5bit_singletrack_map(
|
|
+ struct gpio_event_axis_info *info, uint16_t in);
|
|
+
|
|
+#endif
|