Commit 43840415 authored by Simon Glass's avatar Simon Glass Committed by Samuel Ortiz

input: matrix-keymap: Add function to read the new DT binding

We now have a binding which adds two parameters to the matrix keypad DT
node. This is separate from the GPIO-driven matrix keypad binding, and
unfortunately incompatible, since that uses row-gpios/col-gpios for the
row and column counts.

So the easiest option here is to provide a function for non-GPIO drivers
to use to decode the binding.

Note: We could in fact create an entirely separate structure to hold
these two fields, but it does not seem worth it, yet. If we have more
parameters then we can add this, and then refactor each driver to hold
such a structure.
Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
Acked-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Tested-by: Sourav Poddar <sourav.poddar@ti.com> (v2)
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent a17d94f0
...@@ -144,12 +144,13 @@ static int lpc32xx_parse_dt(struct device *dev, ...@@ -144,12 +144,13 @@ static int lpc32xx_parse_dt(struct device *dev,
{ {
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
u32 rows = 0, columns = 0; u32 rows = 0, columns = 0;
int err;
of_property_read_u32(np, "keypad,num-rows", &rows); err = matrix_keypad_parse_of_params(dev, &rows, &columns);
of_property_read_u32(np, "keypad,num-columns", &columns); if (err)
if (!rows || rows != columns) { return err;
dev_err(dev, if (rows != columns) {
"rows and columns must be specified and be equal!\n"); dev_err(dev, "rows and columns must be equal!\n");
return -EINVAL; return -EINVAL;
} }
......
...@@ -215,18 +215,12 @@ static int omap4_keypad_parse_dt(struct device *dev, ...@@ -215,18 +215,12 @@ static int omap4_keypad_parse_dt(struct device *dev,
struct omap4_keypad *keypad_data) struct omap4_keypad *keypad_data)
{ {
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
int err;
if (!np) { err = matrix_keypad_parse_of_params(dev, &keypad_data->rows,
dev_err(dev, "missing DT data"); &keypad_data->cols);
return -EINVAL; if (err)
} return err;
of_property_read_u32(np, "keypad,num-rows", &keypad_data->rows);
of_property_read_u32(np, "keypad,num-columns", &keypad_data->cols);
if (!keypad_data->rows || !keypad_data->cols) {
dev_err(dev, "number of keypad rows/columns not specified\n");
return -EINVAL;
}
if (of_get_property(np, "linux,input-no-autorepeat", NULL)) if (of_get_property(np, "linux,input-no-autorepeat", NULL))
keypad_data->no_autorepeat = true; keypad_data->no_autorepeat = true;
......
...@@ -288,8 +288,11 @@ static int tca8418_keypad_probe(struct i2c_client *client, ...@@ -288,8 +288,11 @@ static int tca8418_keypad_probe(struct i2c_client *client,
irq_is_gpio = pdata->irq_is_gpio; irq_is_gpio = pdata->irq_is_gpio;
} else { } else {
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
of_property_read_u32(np, "keypad,num-rows", &rows); int err;
of_property_read_u32(np, "keypad,num-columns", &cols);
err = matrix_keypad_parse_of_params(dev, &rows, &cols);
if (err)
return err;
rep = of_property_read_bool(np, "keypad,autorepeat"); rep = of_property_read_bool(np, "keypad,autorepeat");
} }
......
...@@ -50,6 +50,25 @@ static bool matrix_keypad_map_key(struct input_dev *input_dev, ...@@ -50,6 +50,25 @@ static bool matrix_keypad_map_key(struct input_dev *input_dev,
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
int matrix_keypad_parse_of_params(struct device *dev,
unsigned int *rows, unsigned int *cols)
{
struct device_node *np = dev->of_node;
if (!np) {
dev_err(dev, "missing DT data");
return -EINVAL;
}
of_property_read_u32(np, "keypad,num-rows", rows);
of_property_read_u32(np, "keypad,num-columns", cols);
if (!*rows || !*cols) {
dev_err(dev, "number of keypad rows/columns not specified\n");
return -EINVAL;
}
return 0;
}
static int matrix_keypad_parse_of_keymap(const char *propname, static int matrix_keypad_parse_of_keymap(const char *propname,
unsigned int rows, unsigned int cols, unsigned int rows, unsigned int cols,
struct input_dev *input_dev) struct input_dev *input_dev)
......
...@@ -81,4 +81,23 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, ...@@ -81,4 +81,23 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
unsigned short *keymap, unsigned short *keymap,
struct input_dev *input_dev); struct input_dev *input_dev);
#ifdef CONFIG_OF
/**
* matrix_keypad_parse_of_params() - Read parameters from matrix-keypad node
*
* @dev: Device containing of_node
* @rows: Returns number of matrix rows
* @cols: Returns number of matrix columns
* @return 0 if OK, <0 on error
*/
int matrix_keypad_parse_of_params(struct device *dev,
unsigned int *rows, unsigned int *cols);
#else
static inline int matrix_keypad_parse_of_params(struct device *dev,
unsigned int *rows, unsigned int *cols)
{
return -ENOSYS;
}
#endif /* CONFIG_OF */
#endif /* _MATRIX_KEYPAD_H */ #endif /* _MATRIX_KEYPAD_H */
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