input: matrix-keymap: Add function to read the new DT binding
authorSimon Glass <sjg@chromium.org>
Mon, 25 Feb 2013 22:08:40 +0000 (14:08 -0800)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 5 Apr 2013 09:20:13 +0000 (11:20 +0200)
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>
drivers/input/keyboard/lpc32xx-keys.c
drivers/input/keyboard/omap4-keypad.c
drivers/input/keyboard/tca8418_keypad.c
drivers/input/matrix-keymap.c
include/linux/input/matrix_keypad.h

index 1b8add6cfb9d466cec790ec8e38337e180eaa8ec..42181435fe6759f4302ac8ffdd68f0ea41d1df0f 100644 (file)
@@ -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;
        }
 
index e25b022692cd48d4d1f14f111f54a32adc01e2c8..1b289092f4e30915ce9005678f8ca84991435b3b 100644 (file)
@@ -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;
index a34cc6714e5bc765315039bf3d3bb43a60820766..55c15304ddbce997a1027e319b81e7b3fc8ba98b 100644 (file)
@@ -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");
        }
 
index 3ae496ea5fe6b52d6620443d937dd3ea5bbda44e..619b3824563c9ce4a7751c9a6a14930f2c1340a9 100644 (file)
@@ -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)
index 5f3aa6b11bfae75f985ec45a090f589c3ded99f0..27e06acc509adf25e6ec4463e683efaae78befa5 100644 (file)
@@ -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 */