Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: of_keymap - add device tree bindings for simple key matrices

This adds a simple device tree binding for simple key matrix data and
a helper to fill in the platform data.

Signed-off-by: Olof Johansson <olof@lixom.net>
Acked-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

authored by

Olof Johansson and committed by
Dmitry Torokhov
2cd36877 b51425be

+131
+19
Documentation/devicetree/bindings/input/matrix-keymap.txt
··· 1 + A simple common binding for matrix-connected key boards. Currently targeted at 2 + defining the keys in the scope of linux key codes since that is a stable and 3 + standardized interface at this time. 4 + 5 + Required properties: 6 + - linux,keymap: an array of packed 1-cell entries containing the equivalent 7 + of row, column and linux key-code. The 32-bit big endian cell is packed 8 + as: 9 + row << 24 | column << 16 | key-code 10 + 11 + Optional properties: 12 + Some users of this binding might choose to specify secondary keymaps for 13 + cases where there is a modifier key such as a Fn key. Proposed names 14 + for said properties are "linux,fn-keymap" or with another descriptive 15 + word for the modifier other from "Fn". 16 + 17 + Example: 18 + linux,keymap = < 0x00030012 19 + 0x0102003a >;
+4
drivers/input/Kconfig
··· 25 25 26 26 if INPUT 27 27 28 + config INPUT_OF_MATRIX_KEYMAP 29 + depends on USE_OF 30 + bool 31 + 28 32 config INPUT_FF_MEMLESS 29 33 tristate "Support for memoryless force-feedback devices" 30 34 help
+1
drivers/input/Makefile
··· 24 24 obj-$(CONFIG_INPUT_MISC) += misc/ 25 25 26 26 obj-$(CONFIG_INPUT_APMPOWER) += apm-power.o 27 + obj-$(CONFIG_INPUT_OF_MATRIX_KEYMAP) += of_keymap.o
+1
drivers/input/keyboard/Kconfig
··· 394 394 config KEYBOARD_TEGRA 395 395 tristate "NVIDIA Tegra internal matrix keyboard controller support" 396 396 depends on ARCH_TEGRA 397 + select INPUT_OF_MATRIX_KEYMAP if USE_OF 397 398 help 398 399 Say Y here if you want to use a matrix keyboard connected directly 399 400 to the internal keyboard controller on Tegra SoCs.
+87
drivers/input/of_keymap.c
··· 1 + /* 2 + * Helpers for open firmware matrix keyboard bindings 3 + * 4 + * Copyright (C) 2012 Google, Inc 5 + * 6 + * Author: 7 + * Olof Johansson <olof@lixom.net> 8 + * 9 + * This software is licensed under the terms of the GNU General Public 10 + * License version 2, as published by the Free Software Foundation, and 11 + * may be copied, distributed, and modified under those terms. 12 + * 13 + * This program is distributed in the hope that it will be useful, 14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 + * GNU General Public License for more details. 17 + * 18 + */ 19 + 20 + #include <linux/kernel.h> 21 + #include <linux/types.h> 22 + #include <linux/input.h> 23 + #include <linux/of.h> 24 + #include <linux/input/matrix_keypad.h> 25 + #include <linux/export.h> 26 + #include <linux/gfp.h> 27 + #include <linux/slab.h> 28 + 29 + struct matrix_keymap_data * 30 + matrix_keyboard_of_fill_keymap(struct device_node *np, 31 + const char *propname) 32 + { 33 + struct matrix_keymap_data *kd; 34 + u32 *keymap; 35 + int proplen, i; 36 + const __be32 *prop; 37 + 38 + if (!np) 39 + return NULL; 40 + 41 + if (!propname) 42 + propname = "linux,keymap"; 43 + 44 + prop = of_get_property(np, propname, &proplen); 45 + if (!prop) 46 + return NULL; 47 + 48 + if (proplen % sizeof(u32)) { 49 + pr_warn("Malformed keymap property %s in %s\n", 50 + propname, np->full_name); 51 + return NULL; 52 + } 53 + 54 + kd = kzalloc(sizeof(*kd), GFP_KERNEL); 55 + if (!kd) 56 + return NULL; 57 + 58 + kd->keymap = keymap = kzalloc(proplen, GFP_KERNEL); 59 + if (!kd->keymap) { 60 + kfree(kd); 61 + return NULL; 62 + } 63 + 64 + kd->keymap_size = proplen / sizeof(u32); 65 + 66 + for (i = 0; i < kd->keymap_size; i++) { 67 + u32 tmp = be32_to_cpup(prop + i); 68 + int key_code, row, col; 69 + 70 + row = (tmp >> 24) & 0xff; 71 + col = (tmp >> 16) & 0xff; 72 + key_code = tmp & 0xffff; 73 + keymap[i] = KEY(row, col, key_code); 74 + } 75 + 76 + return kd; 77 + } 78 + EXPORT_SYMBOL_GPL(matrix_keyboard_of_fill_keymap); 79 + 80 + void matrix_keyboard_of_free_keymap(const struct matrix_keymap_data *kd) 81 + { 82 + if (kd) { 83 + kfree(kd->keymap); 84 + kfree(kd); 85 + } 86 + } 87 + EXPORT_SYMBOL_GPL(matrix_keyboard_of_free_keymap);
+19
include/linux/input/matrix_keypad.h
··· 3 3 4 4 #include <linux/types.h> 5 5 #include <linux/input.h> 6 + #include <linux/of.h> 6 7 7 8 #define MATRIX_MAX_ROWS 32 8 9 #define MATRIX_MAX_COLS 32 ··· 106 105 } 107 106 __clear_bit(KEY_RESERVED, keybit); 108 107 } 108 + 109 + #ifdef CONFIG_INPUT_OF_MATRIX_KEYMAP 110 + struct matrix_keymap_data * 111 + matrix_keyboard_of_fill_keymap(struct device_node *np, const char *propname); 112 + 113 + void matrix_keyboard_of_free_keymap(const struct matrix_keymap_data *kd); 114 + #else 115 + static inline struct matrix_keymap_data * 116 + matrix_keyboard_of_fill_keymap(struct device_node *np, const char *propname) 117 + { 118 + return NULL; 119 + } 120 + 121 + static inline void 122 + matrix_keyboard_of_free_keymap(const struct matrix_keymap_data *kd) 123 + { 124 + } 125 + #endif 109 126 110 127 #endif /* _MATRIX_KEYPAD_H */