Commit 5383116b authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: marix-keymap - automatically allocate memory for keymap

In device tree enabled setups requiring preallocated memory for storing keymap
is quite often awkward, so let's provide an option of allocating it directly
in matrix_keypad_build_keymap().
Reviewed-by: default avatarAlban Bedel <alban.bedel@avionic-design.de>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 544a46c9
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
#include <linux/device.h> #include <linux/device.h>
#include <linux/gfp.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/input.h> #include <linux/input.h>
...@@ -122,6 +123,11 @@ static int matrix_keypad_parse_of_keymap(const char *propname, ...@@ -122,6 +123,11 @@ static int matrix_keypad_parse_of_keymap(const char *propname,
* it will attempt load the keymap from property specified by @keymap_name * it will attempt load the keymap from property specified by @keymap_name
* argument (or "linux,keymap" if @keymap_name is %NULL). * argument (or "linux,keymap" if @keymap_name is %NULL).
* *
* If @keymap is %NULL the function will automatically allocate managed
* block of memory to store the keymap. This memory will be associated with
* the parent device and automatically freed when device unbinds from the
* driver.
*
* Callers are expected to set up input_dev->dev.parent before calling this * Callers are expected to set up input_dev->dev.parent before calling this
* function. * function.
*/ */
...@@ -132,12 +138,27 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, ...@@ -132,12 +138,27 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
struct input_dev *input_dev) struct input_dev *input_dev)
{ {
unsigned int row_shift = get_count_order(cols); unsigned int row_shift = get_count_order(cols);
size_t max_keys = rows << row_shift;
int i; int i;
int error; int error;
if (WARN_ON(!input_dev->dev.parent))
return -EINVAL;
if (!keymap) {
keymap = devm_kzalloc(input_dev->dev.parent,
max_keys * sizeof(*keymap),
GFP_KERNEL);
if (!keymap) {
dev_err(input_dev->dev.parent,
"Unable to allocate memory for keymap");
return -ENOMEM;
}
}
input_dev->keycode = keymap; input_dev->keycode = keymap;
input_dev->keycodesize = sizeof(*keymap); input_dev->keycodesize = sizeof(*keymap);
input_dev->keycodemax = rows << row_shift; input_dev->keycodemax = max_keys;
__set_bit(EV_KEY, input_dev->evbit); __set_bit(EV_KEY, input_dev->evbit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment