mirror of https://gitee.com/openkylin/linux.git
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: Simon Glass <sjg@chromium.org> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Tested-by: Sourav Poddar <sourav.poddar@ti.com> (v2) Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
a17d94f0b6
commit
4384041533
|
@ -144,12 +144,13 @@ static int lpc32xx_parse_dt(struct device *dev,
|
|||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
u32 rows = 0, columns = 0;
|
||||
int err;
|
||||
|
||||
of_property_read_u32(np, "keypad,num-rows", &rows);
|
||||
of_property_read_u32(np, "keypad,num-columns", &columns);
|
||||
if (!rows || rows != columns) {
|
||||
dev_err(dev,
|
||||
"rows and columns must be specified and be equal!\n");
|
||||
err = matrix_keypad_parse_of_params(dev, &rows, &columns);
|
||||
if (err)
|
||||
return err;
|
||||
if (rows != columns) {
|
||||
dev_err(dev, "rows and columns must be equal!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -215,18 +215,12 @@ static int omap4_keypad_parse_dt(struct device *dev,
|
|||
struct omap4_keypad *keypad_data)
|
||||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
int err;
|
||||
|
||||
if (!np) {
|
||||
dev_err(dev, "missing DT data");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
err = matrix_keypad_parse_of_params(dev, &keypad_data->rows,
|
||||
&keypad_data->cols);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (of_get_property(np, "linux,input-no-autorepeat", NULL))
|
||||
keypad_data->no_autorepeat = true;
|
||||
|
|
|
@ -288,8 +288,11 @@ static int tca8418_keypad_probe(struct i2c_client *client,
|
|||
irq_is_gpio = pdata->irq_is_gpio;
|
||||
} else {
|
||||
struct device_node *np = dev->of_node;
|
||||
of_property_read_u32(np, "keypad,num-rows", &rows);
|
||||
of_property_read_u32(np, "keypad,num-columns", &cols);
|
||||
int err;
|
||||
|
||||
err = matrix_keypad_parse_of_params(dev, &rows, &cols);
|
||||
if (err)
|
||||
return err;
|
||||
rep = of_property_read_bool(np, "keypad,autorepeat");
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,25 @@ static bool matrix_keypad_map_key(struct input_dev *input_dev,
|
|||
}
|
||||
|
||||
#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,
|
||||
unsigned int rows, unsigned int cols,
|
||||
struct input_dev *input_dev)
|
||||
|
|
|
@ -81,4 +81,23 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data,
|
|||
unsigned short *keymap,
|
||||
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 */
|
||||
|
|
Loading…
Reference in New Issue