Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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().

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+75 -86
+1 -1
drivers/input/keyboard/bcm-keypad.c
··· 213 213 /* Initialize the KPCR Keypad Configuration Register */ 214 214 kp->kpcr = KPCR_STATUSFILTERENABLE | KPCR_COLFILTERENABLE; 215 215 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); 217 217 if (error) { 218 218 dev_err(dev, "failed to parse kp params\n"); 219 219 return error;
+2 -1
drivers/input/keyboard/cros_ec_keyb.c
··· 229 229 ckdev = devm_kzalloc(dev, sizeof(*ckdev), GFP_KERNEL); 230 230 if (!ckdev) 231 231 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); 233 234 if (err) 234 235 return err; 235 236
+1 -1
drivers/input/keyboard/lpc32xx-keys.c
··· 145 145 u32 rows = 0, columns = 0; 146 146 int err; 147 147 148 - err = matrix_keypad_parse_of_params(dev, &rows, &columns); 148 + err = matrix_keypad_parse_properties(dev, &rows, &columns); 149 149 if (err) 150 150 return err; 151 151 if (rows != columns) {
+2 -2
drivers/input/keyboard/omap4-keypad.c
··· 223 223 struct device_node *np = dev->of_node; 224 224 int err; 225 225 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); 228 228 if (err) 229 229 return err; 230 230
+1 -1
drivers/input/keyboard/pmic8xxx-keypad.c
··· 515 515 int rc; 516 516 unsigned int ctrl_val; 517 517 518 - rc = matrix_keypad_parse_of_params(&pdev->dev, &rows, &cols); 518 + rc = matrix_keypad_parse_properties(&pdev->dev, &rows, &cols); 519 519 if (rc) 520 520 return rc; 521 521
+1 -1
drivers/input/keyboard/pxa27x_keypad.c
··· 126 126 u32 rows, cols; 127 127 int error; 128 128 129 - error = matrix_keypad_parse_of_params(dev, &rows, &cols); 129 + error = matrix_keypad_parse_properties(dev, &rows, &cols); 130 130 if (error) 131 131 return error; 132 132
+2 -2
drivers/input/keyboard/st-keyscan.c
··· 106 106 struct device_node *np = dev->of_node; 107 107 int error; 108 108 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); 111 111 if (error) { 112 112 dev_err(dev, "failed to parse keypad params\n"); 113 113 return error;
+1 -1
drivers/input/keyboard/stmpe-keypad.c
··· 354 354 input->id.bustype = BUS_I2C; 355 355 input->dev.parent = &pdev->dev; 356 356 357 - error = matrix_keypad_parse_of_params(&pdev->dev, &rows, &cols); 357 + error = matrix_keypad_parse_properties(&pdev->dev, &rows, &cols); 358 358 if (error) 359 359 return error; 360 360
+1 -1
drivers/input/keyboard/tca8418_keypad.c
··· 295 295 struct device_node *np = dev->of_node; 296 296 int err; 297 297 298 - err = matrix_keypad_parse_of_params(dev, &rows, &cols); 298 + err = matrix_keypad_parse_properties(dev, &rows, &cols); 299 299 if (err) 300 300 return err; 301 301 rep = of_property_read_bool(np, "keypad,autorepeat");
+2 -2
drivers/input/keyboard/twl4030_keypad.c
··· 374 374 kp->autorepeat = pdata->rep; 375 375 keymap_data = pdata->keymap_data; 376 376 } 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); 379 379 if (error) 380 380 return error; 381 381
+58 -55
drivers/input/matrix-keymap.c
··· 14 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 16 * GNU General Public License for more details. 17 - * 18 17 */ 19 18 20 19 #include <linux/device.h> 21 - #include <linux/gfp.h> 22 - #include <linux/kernel.h> 23 - #include <linux/types.h> 24 - #include <linux/input.h> 25 - #include <linux/of.h> 26 20 #include <linux/export.h> 27 - #include <linux/module.h> 21 + #include <linux/gfp.h> 22 + #include <linux/input.h> 28 23 #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> 29 29 30 30 static bool matrix_keypad_map_key(struct input_dev *input_dev, 31 31 unsigned int rows, unsigned int cols, ··· 49 49 return true; 50 50 } 51 51 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) 55 62 { 56 - struct device_node *np = dev->of_node; 63 + *rows = *cols = 0; 57 64 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); 65 + device_property_read_u32(dev, "keypad,num-rows", rows); 66 + device_property_read_u32(dev, "keypad,num-columns", cols); 67 + 64 68 if (!*rows || !*cols) { 65 69 dev_err(dev, "number of keypad rows/columns not specified\n"); 66 70 return -EINVAL; ··· 72 68 73 69 return 0; 74 70 } 75 - EXPORT_SYMBOL_GPL(matrix_keypad_parse_of_params); 71 + EXPORT_SYMBOL_GPL(matrix_keypad_parse_properties); 76 72 77 - static int matrix_keypad_parse_of_keymap(const char *propname, 78 - unsigned int rows, unsigned int cols, 79 - struct input_dev *input_dev) 73 + static int matrix_keypad_parse_keymap(const char *propname, 74 + unsigned int rows, unsigned int cols, 75 + struct input_dev *input_dev) 80 76 { 81 77 struct device *dev = input_dev->dev.parent; 82 - struct device_node *np = dev->of_node; 83 78 unsigned int row_shift = get_count_order(cols); 84 79 unsigned int max_keys = rows << row_shift; 85 - unsigned int proplen, i, size; 86 - const __be32 *prop; 87 - 88 - if (!np) 89 - return -ENOENT; 80 + u32 *keys; 81 + int i; 82 + int size; 83 + int retval; 90 84 91 85 if (!propname) 92 86 propname = "linux,keymap"; 93 87 94 - prop = of_get_property(np, propname, &proplen); 95 - if (!prop) { 96 - dev_err(dev, "OF: %s property not defined in %s\n", 97 - propname, np->full_name); 98 - return -ENOENT; 88 + size = device_property_read_u32_array(dev, propname, NULL, 0); 89 + if (size <= 0) { 90 + dev_err(dev, "missing or malformed property %s: %d\n", 91 + propname, size); 92 + return size < 0 ? size : -EINVAL; 99 93 } 100 94 101 - if (proplen % sizeof(u32)) { 102 - dev_err(dev, "OF: Malformed keycode property %s in %s\n", 103 - propname, np->full_name); 104 - return -EINVAL; 105 - } 106 - 107 - size = proplen / sizeof(u32); 108 95 if (size > max_keys) { 109 - dev_err(dev, "OF: %s size overflow\n", propname); 96 + dev_err(dev, "%s size overflow (%d vs max %u)\n", 97 + propname, size, max_keys); 110 98 return -EINVAL; 99 + } 100 + 101 + keys = kmalloc_array(size, sizeof(u32), GFP_KERNEL); 102 + if (!keys) 103 + return -ENOMEM; 104 + 105 + retval = device_property_read_u32_array(dev, propname, keys, size); 106 + if (retval) { 107 + dev_err(dev, "failed to read %s property: %d\n", 108 + propname, retval); 109 + goto out; 111 110 } 112 111 113 112 for (i = 0; i < size; i++) { 114 - unsigned int key = be32_to_cpup(prop + i); 115 - 116 113 if (!matrix_keypad_map_key(input_dev, rows, cols, 117 - row_shift, key)) 118 - return -EINVAL; 114 + row_shift, keys[i])) { 115 + retval = -EINVAL; 116 + goto out; 117 + } 119 118 } 120 119 121 - return 0; 120 + retval = 0; 121 + 122 + out: 123 + kfree(keys); 124 + return retval; 122 125 } 123 - #else 124 - static int matrix_keypad_parse_of_keymap(const char *propname, 125 - unsigned int rows, unsigned int cols, 126 - struct input_dev *input_dev) 127 - { 128 - return -ENOSYS; 129 - } 130 - #endif 131 126 132 127 /** 133 128 * matrix_keypad_build_keymap - convert platform keymap into matrix keymap ··· 195 192 return -EINVAL; 196 193 } 197 194 } else { 198 - error = matrix_keypad_parse_of_keymap(keymap_name, rows, cols, 199 - input_dev); 195 + error = matrix_keypad_parse_keymap(keymap_name, rows, cols, 196 + input_dev); 200 197 if (error) 201 198 return error; 202 199 }
+3 -18
include/linux/input/matrix_keypad.h
··· 80 80 unsigned int rows, unsigned int cols, 81 81 unsigned short *keymap, 82 82 struct input_dev *input_dev); 83 + int matrix_keypad_parse_properties(struct device *dev, 84 + unsigned int *rows, unsigned int *cols); 83 85 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 102 87 103 88 #endif /* _MATRIX_KEYPAD_H */