History

Input: matrix-keypad - switch to using generic device properties

Instead of being OF-specific, let's switch to using generic device properties, which will make this code usable on ACPI, device tree and legacy boards that use property sets. As part of the change let's rename matrix_keypad_parse_of_params() to matrix_keypad_parse_properties().

Dmitry Torokhov committed 10 years ago

Commit aef01aa1 parent b1fe0cf12 files · +73 −84Browse files

Unified · Split

12 files
  1. drivers/input/keyboard/bcm-keypad.c +1 −1
  2. drivers/input/keyboard/cros_ec_keyb.c +2 −1
  3. drivers/input/keyboard/lpc32xx-keys.c +1 −1
  4. drivers/input/keyboard/omap4-keypad.c +2 −2
  5. drivers/input/keyboard/pmic8xxx-keypad.c +1 −1
  6. drivers/input/keyboard/pxa27x_keypad.c +1 −1
  7. drivers/input/keyboard/st-keyscan.c +2 −2
  8. drivers/input/keyboard/stmpe-keypad.c +1 −1
  9. drivers/input/keyboard/tca8418_keypad.c +1 −1
  10. drivers/input/keyboard/twl4030_keypad.c +2 −2
  11. drivers/input/matrix-keymap.c +56 −53
  12. include/linux/input/matrix_keypad.h +3 −18
drivers/input/keyboard/bcm-keypad.c+1−1
@@ -213,7 +213,7 @@ static int bcm_kp_matrix_key_parse_dt(struct bcm_kp *kp) · 212 unmodified lines
213213 /* Initialize the KPCR Keypad Configuration Register */
214214 kp->kpcr = KPCR_STATUSFILTERENABLE | KPCR_COLFILTERENABLE;
215215
216− error = matrix_keypad_parse_of_params(dev, &kp->n_rows, &kp->n_cols);
216+ error = matrix_keypad_parse_properties(dev, &kp->n_rows, &kp->n_cols);
217217 if (error) {
218218 dev_err(dev, "failed to parse kp params\n");
219219 return error;
drivers/input/keyboard/cros_ec_keyb.c+2−1
@@ -229,7 +229,8 @@ static int cros_ec_keyb_probe(struct platform_device *pdev) · 228 unmodified lines
229229 ckdev = devm_kzalloc(dev, sizeof(*ckdev), GFP_KERNEL);
230230 if (!ckdev)
231231 return -ENOMEM;
232− err = matrix_keypad_parse_of_params(dev, &ckdev->rows, &ckdev->cols);
232+
233+ err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols);
233234 if (err)
234235 return err;
235236
drivers/input/keyboard/lpc32xx-keys.c+1−1
@@ -145,7 +145,7 @@ static int lpc32xx_parse_dt(struct device *dev, · 144 unmodified lines
145145 u32 rows = 0, columns = 0;
146146 int err;
147147
148− err = matrix_keypad_parse_of_params(dev, &rows, &columns);
148+ err = matrix_keypad_parse_properties(dev, &rows, &columns);
149149 if (err)
150150 return err;
151151 if (rows != columns) {
drivers/input/keyboard/omap4-keypad.c+2−2
@@ -223,8 +223,8 @@ static int omap4_keypad_parse_dt(struct device *dev, · 222 unmodified lines
223223 struct device_node *np = dev->of_node;
224224 int err;
225225
226− err = matrix_keypad_parse_of_params(dev, &keypad_data->rows,
227− &keypad_data->cols);
226+ err = matrix_keypad_parse_properties(dev, &keypad_data->rows,
227+ &keypad_data->cols);
228228 if (err)
229229 return err;
230230
drivers/input/keyboard/pmic8xxx-keypad.c+1−1
@@ -515,7 +515,7 @@ static int pmic8xxx_kp_probe(struct platform_device *pdev) · 514 unmodified lines
515515 int rc;
516516 unsigned int ctrl_val;
517517
518− rc = matrix_keypad_parse_of_params(&pdev->dev, &rows, &cols);
518+ rc = matrix_keypad_parse_properties(&pdev->dev, &rows, &cols);
519519 if (rc)
520520 return rc;
521521
drivers/input/keyboard/pxa27x_keypad.c+1−1
@@ -126,7 +126,7 @@ static int pxa27x_keypad_matrix_key_parse_dt(struct pxa27x_keypad *keypad, · 125 unmodified lines
126126 u32 rows, cols;
127127 int error;
128128
129− error = matrix_keypad_parse_of_params(dev, &rows, &cols);
129+ error = matrix_keypad_parse_properties(dev, &rows, &cols);
130130 if (error)
131131 return error;
132132
drivers/input/keyboard/st-keyscan.c+2−2
@@ -106,8 +106,8 @@ static int keypad_matrix_key_parse_dt(struct st_keyscan *keypad_data) · 105 unmodified lines
106106 struct device_node *np = dev->of_node;
107107 int error;
108108
109− error = matrix_keypad_parse_of_params(dev, &keypad_data->n_rows,
110− &keypad_data->n_cols);
109+ error = matrix_keypad_parse_properties(dev, &keypad_data->n_rows,
110+ &keypad_data->n_cols);
111111 if (error) {
112112 dev_err(dev, "failed to parse keypad params\n");
113113 return error;
drivers/input/keyboard/stmpe-keypad.c+1−1
@@ -354,7 +354,7 @@ static int stmpe_keypad_probe(struct platform_device *pdev) · 353 unmodified lines
354354 input->id.bustype = BUS_I2C;
355355 input->dev.parent = &pdev->dev;
356356
357− error = matrix_keypad_parse_of_params(&pdev->dev, &rows, &cols);
357+ error = matrix_keypad_parse_properties(&pdev->dev, &rows, &cols);
358358 if (error)
359359 return error;
360360
drivers/input/keyboard/tca8418_keypad.c+1−1
@@ -295,7 +295,7 @@ static int tca8418_keypad_probe(struct i2c_client *client, · 294 unmodified lines
295295 struct device_node *np = dev->of_node;
296296 int err;
297297
298− err = matrix_keypad_parse_of_params(dev, &rows, &cols);
298+ err = matrix_keypad_parse_properties(dev, &rows, &cols);
299299 if (err)
300300 return err;
301301 rep = of_property_read_bool(np, "keypad,autorepeat");
drivers/input/keyboard/twl4030_keypad.c+2−2
@@ -374,8 +374,8 @@ static int twl4030_kp_probe(struct platform_device *pdev) · 373 unmodified lines
374374 kp->autorepeat = pdata->rep;
375375 keymap_data = pdata->keymap_data;
376376 } else {
377− error = matrix_keypad_parse_of_params(&pdev->dev, &kp->n_rows,
378− &kp->n_cols);
377+ error = matrix_keypad_parse_properties(&pdev->dev, &kp->n_rows,
378+ &kp->n_cols);
379379 if (error)
380380 return error;
381381
drivers/input/matrix-keymap.c+56−53
@@ -14,18 +14,18 @@ · 13 unmodified lines
1414 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1515 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1616 * GNU General Public License for more details.
17− *
1817 */
1918
2019 #include <linux/device.h>
20+#include <linux/export.h>
2121 #include <linux/gfp.h>
22−#include <linux/kernel.h>
23−#include <linux/types.h>
2422 #include <linux/input.h>
25−#include <linux/of.h>
26−#include <linux/export.h>
27−#include <linux/module.h>
2823 #include <linux/input/matrix_keypad.h>
24+#include <linux/kernel.h>
25+#include <linux/module.h>
26+#include <linux/property.h>
27+#include <linux/slab.h>
28+#include <linux/types.h>
2929
3030 static bool matrix_keypad_map_key(struct input_dev *input_dev,
3131 unsigned int rows, unsigned int cols,
@@ -49,18 +49,22 @@ static bool matrix_keypad_map_key(struct input_dev *input_dev, · 17 unmodified lines
4949 return true;
5050 }
5151
52−#ifdef CONFIG_OF
53−int matrix_keypad_parse_of_params(struct device *dev,
54− unsigned int *rows, unsigned int *cols)
52+/**
53+ * matrix_keypad_parse_properties() - Read properties of matrix keypad
54+ *
55+ * @dev: Device containing properties
56+ * @rows: Returns number of matrix rows
57+ * @cols: Returns number of matrix columns
58+ * @return 0 if OK, <0 on error
59+ */
60+int matrix_keypad_parse_properties(struct device *dev,
61+ unsigned int *rows, unsigned int *cols)
5562 {
56− struct device_node *np = dev->of_node;
63+ *rows = *cols = 0;
64+
65+ device_property_read_u32(dev, "keypad,num-rows", rows);
66+ device_property_read_u32(dev, "keypad,num-columns", cols);
5767
58− if (!np) {
59− dev_err(dev, "missing DT data");
60− return -EINVAL;
61− }
62− of_property_read_u32(np, "keypad,num-rows", rows);
63− of_property_read_u32(np, "keypad,num-columns", cols);
6468 if (!*rows || !*cols) {
6569 dev_err(dev, "number of keypad rows/columns not specified\n");
6670 return -EINVAL;
@@ -68,62 +72,61 @@ int matrix_keypad_parse_of_params(struct device *dev, · 1 unmodified line
6872
6973 return 0;
7074 }
71−EXPORT_SYMBOL_GPL(matrix_keypad_parse_of_params);
75+EXPORT_SYMBOL_GPL(matrix_keypad_parse_properties);
7276
73−static int matrix_keypad_parse_of_keymap(const char *propname,
74− unsigned int rows, unsigned int cols,
75− struct input_dev *input_dev)
77+static int matrix_keypad_parse_keymap(const char *propname,
78+ unsigned int rows, unsigned int cols,
79+ struct input_dev *input_dev)
7680 {
7781 struct device *dev = input_dev->dev.parent;
78− struct device_node *np = dev->of_node;
7982 unsigned int row_shift = get_count_order(cols);
8083 unsigned int max_keys = rows << row_shift;
81− unsigned int proplen, i, size;
82− const __be32 *prop;
83−
84− if (!np)
85− return -ENOENT;
84+ u32 *keys;
85+ int i;
86+ int size;
87+ int retval;
8688
8789 if (!propname)
8890 propname = "linux,keymap";
8991
90− prop = of_get_property(np, propname, &proplen);
91− if (!prop) {
92− dev_err(dev, "OF: %s property not defined in %s\n",
93− propname, np->full_name);
94− return -ENOENT;
92+ size = device_property_read_u32_array(dev, propname, NULL, 0);
93+ if (size <= 0) {
94+ dev_err(dev, "missing or malformed property %s: %d\n",
95+ propname, size);
96+ return size < 0 ? size : -EINVAL;
9597 }
9698
97− if (proplen % sizeof(u32)) {
98− dev_err(dev, "OF: Malformed keycode property %s in %s\n",
99− propname, np->full_name);
99+ if (size > max_keys) {
100+ dev_err(dev, "%s size overflow (%d vs max %u)\n",
101+ propname, size, max_keys);
100102 return -EINVAL;
101103 }
102104
103− size = proplen / sizeof(u32);
104− if (size > max_keys) {
105− dev_err(dev, "OF: %s size overflow\n", propname);
106− return -EINVAL;
105+ keys = kmalloc_array(size, sizeof(u32), GFP_KERNEL);
106+ if (!keys)
107+ return -ENOMEM;
108+
109+ retval = device_property_read_u32_array(dev, propname, keys, size);
110+ if (retval) {
111+ dev_err(dev, "failed to read %s property: %d\n",
112+ propname, retval);
113+ goto out;
107114 }
108115
109116 for (i = 0; i < size; i++) {
110− unsigned int key = be32_to_cpup(prop + i);
111−
112117 if (!matrix_keypad_map_key(input_dev, rows, cols,
113− row_shift, key))
114− return -EINVAL;
118+ row_shift, keys[i])) {
119+ retval = -EINVAL;
120+ goto out;
121+ }
115122 }
116123
117− return 0;
118−}
119−#else
120−static int matrix_keypad_parse_of_keymap(const char *propname,
121− unsigned int rows, unsigned int cols,
122− struct input_dev *input_dev)
123−{
124− return -ENOSYS;
124+ retval = 0;
125+
126+out:
127+ kfree(keys);
128+ return retval;
125129 }
126−#endif
127130
128131 /**
129132 * matrix_keypad_build_keymap - convert platform keymap into matrix keymap
@@ -192,8 +195,8 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, · 62 unmodified lines
192195 return -EINVAL;
193196 }
194197 } else {
195− error = matrix_keypad_parse_of_keymap(keymap_name, rows, cols,
196− input_dev);
198+ error = matrix_keypad_parse_keymap(keymap_name, rows, cols,
199+ input_dev);
197200 if (error)
198201 return error;
199202 }
include/linux/input/matrix_keypad.h+3−18
@@ -80,24 +80,9 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, · 79 unmodified lines
8080 unsigned int rows, unsigned int cols,
8181 unsigned short *keymap,
8282 struct input_dev *input_dev);
83+int matrix_keypad_parse_properties(struct device *dev,
84+ unsigned int *rows, unsigned int *cols);
8385
84−#ifdef CONFIG_OF
85−/**
86− * matrix_keypad_parse_of_params() - Read parameters from matrix-keypad node
87− *
88− * @dev: Device containing of_node
89− * @rows: Returns number of matrix rows
90− * @cols: Returns number of matrix columns
91− * @return 0 if OK, <0 on error
92− */
93−int matrix_keypad_parse_of_params(struct device *dev,
94− unsigned int *rows, unsigned int *cols);
95−#else
96−static inline int matrix_keypad_parse_of_params(struct device *dev,
97− unsigned int *rows, unsigned int *cols)
98−{
99− return -ENOSYS;
100−}
101−#endif /* CONFIG_OF */
86+#define matrix_keypad_parse_of_params matrix_keypad_parse_properties
10287
10388 #endif /* _MATRIX_KEYPAD_H */