On Sat, 18 Oct 2014, Linus Walleij wrote: > The STMPE keypad controller is only used with device tree > configured systems, so force the configuration to come from > device tree only, and now actually get the rows and cols from > the device tree too. > > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > --- > .../devicetree/bindings/input/stmpe-keypad.txt | 2 + > drivers/input/keyboard/Kconfig | 1 + > drivers/input/keyboard/stmpe-keypad.c | 104 +++++++++------------ > include/linux/mfd/stmpe.h | 20 ---- > 4 files changed, 48 insertions(+), 79 deletions(-) Acked-by: Lee Jones <lee.jones@xxxxxxxxxx> > diff --git a/Documentation/devicetree/bindings/input/stmpe-keypad.txt b/Documentation/devicetree/bindings/input/stmpe-keypad.txt > index 1b97222e8a0b..12bb771d66d4 100644 > --- a/Documentation/devicetree/bindings/input/stmpe-keypad.txt > +++ b/Documentation/devicetree/bindings/input/stmpe-keypad.txt > @@ -8,6 +8,8 @@ Optional properties: > - debounce-interval : Debouncing interval time in milliseconds > - st,scan-count : Scanning cycles elapsed before key data is updated > - st,no-autorepeat : If specified device will not autorepeat > + - keypad,num-rows : See ./matrix-keymap.txt > + - keypad,num-columns : See ./matrix-keymap.txt > > Example: > > diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig > index a3958c63d7d5..753d61c0a3a9 100644 > --- a/drivers/input/keyboard/Kconfig > +++ b/drivers/input/keyboard/Kconfig > @@ -559,6 +559,7 @@ config KEYBOARD_SH_KEYSC > config KEYBOARD_STMPE > tristate "STMPE keypad support" > depends on MFD_STMPE > + depends on OF > select INPUT_MATRIXKMAP > help > Say Y here if you want to use the keypad controller on STMPE I/O > diff --git a/drivers/input/keyboard/stmpe-keypad.c b/drivers/input/keyboard/stmpe-keypad.c > index ef5e67fb567e..d46391f48310 100644 > --- a/drivers/input/keyboard/stmpe-keypad.c > +++ b/drivers/input/keyboard/stmpe-keypad.c > @@ -45,7 +45,7 @@ > #define STMPE_KEYPAD_MAX_ROWS 8 > #define STMPE_KEYPAD_MAX_COLS 8 > #define STMPE_KEYPAD_ROW_SHIFT 3 > -#define STMPE_KEYPAD_KEYMAP_SIZE \ > +#define STMPE_KEYPAD_KEYMAP_MAX_SIZE \ > (STMPE_KEYPAD_MAX_ROWS * STMPE_KEYPAD_MAX_COLS) > > /** > @@ -99,16 +99,30 @@ static const struct stmpe_keypad_variant stmpe_keypad_variants[] = { > }, > }; > > +/** > + * struct stmpe_keypad - STMPE keypad state container > + * @stmpe: pointer to parent STMPE device > + * @input: spawned input device > + * @variant: STMPE variant > + * @debounce_ms: debounce interval, in ms. Maximum is > + * %STMPE_KEYPAD_MAX_DEBOUNCE. > + * @scan_count: number of key scanning cycles to confirm key data. > + * Maximum is %STMPE_KEYPAD_MAX_SCAN_COUNT. > + * @no_autorepeat: disable key autorepeat > + * @rows: bitmask for the rows > + * @cols: bitmask for the columns > + * @keymap: the keymap > + */ > struct stmpe_keypad { > struct stmpe *stmpe; > struct input_dev *input; > const struct stmpe_keypad_variant *variant; > - const struct stmpe_keypad_platform_data *plat; > - > + unsigned int debounce_ms; > + unsigned int scan_count; > + bool no_autorepeat; > unsigned int rows; > unsigned int cols; > - > - unsigned short keymap[STMPE_KEYPAD_KEYMAP_SIZE]; > + unsigned short keymap[STMPE_KEYPAD_KEYMAP_MAX_SIZE]; > }; > > static int stmpe_keypad_read_data(struct stmpe_keypad *keypad, u8 *data) > @@ -208,15 +222,14 @@ static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) > > static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad) > { > - const struct stmpe_keypad_platform_data *plat = keypad->plat; > const struct stmpe_keypad_variant *variant = keypad->variant; > struct stmpe *stmpe = keypad->stmpe; > int ret; > > - if (plat->debounce_ms > STMPE_KEYPAD_MAX_DEBOUNCE) > + if (keypad->debounce_ms > STMPE_KEYPAD_MAX_DEBOUNCE) > return -EINVAL; > > - if (plat->scan_count > STMPE_KEYPAD_MAX_SCAN_COUNT) > + if (keypad->scan_count > STMPE_KEYPAD_MAX_SCAN_COUNT) > return -EINVAL; > > ret = stmpe_enable(stmpe, STMPE_BLOCK_KEYPAD); > @@ -245,7 +258,7 @@ static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad) > > ret = stmpe_set_bits(stmpe, STMPE_KPC_CTRL_MSB, > STMPE_KPC_CTRL_MSB_SCAN_COUNT, > - plat->scan_count << 4); > + keypad->scan_count << 4); > if (ret < 0) > return ret; > > @@ -253,17 +266,18 @@ static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad) > STMPE_KPC_CTRL_LSB_SCAN | > STMPE_KPC_CTRL_LSB_DEBOUNCE, > STMPE_KPC_CTRL_LSB_SCAN | > - (plat->debounce_ms << 1)); > + (keypad->debounce_ms << 1)); > } > > -static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad) > +static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad, > + u32 used_rows, u32 used_cols) > { > int row, col; > > - for (row = 0; row < STMPE_KEYPAD_MAX_ROWS; row++) { > - for (col = 0; col < STMPE_KEYPAD_MAX_COLS; col++) { > + for (row = 0; row < used_rows; row++) { > + for (col = 0; col < used_cols; col++) { > int code = MATRIX_SCAN_CODE(row, col, > - STMPE_KEYPAD_ROW_SHIFT); > + STMPE_KEYPAD_ROW_SHIFT); > if (keypad->keymap[code] != KEY_RESERVED) { > keypad->rows |= 1 << row; > keypad->cols |= 1 << col; > @@ -272,51 +286,17 @@ static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad) > } > } > > -#ifdef CONFIG_OF > -static const struct stmpe_keypad_platform_data * > -stmpe_keypad_of_probe(struct device *dev) > -{ > - struct device_node *np = dev->of_node; > - struct stmpe_keypad_platform_data *plat; > - > - if (!np) > - return ERR_PTR(-ENODEV); > - > - plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL); > - if (!plat) > - return ERR_PTR(-ENOMEM); > - > - of_property_read_u32(np, "debounce-interval", &plat->debounce_ms); > - of_property_read_u32(np, "st,scan-count", &plat->scan_count); > - > - plat->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat"); > - > - return plat; > -} > -#else > -static inline const struct stmpe_keypad_platform_data * > -stmpe_keypad_of_probe(struct device *dev) > -{ > - return ERR_PTR(-EINVAL); > -} > -#endif > - > static int stmpe_keypad_probe(struct platform_device *pdev) > { > struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); > - const struct stmpe_keypad_platform_data *plat; > + struct device_node *np = pdev->dev.of_node; > struct stmpe_keypad *keypad; > struct input_dev *input; > + u32 rows; > + u32 cols; > int error; > int irq; > > - plat = stmpe->pdata->keypad; > - if (!plat) { > - plat = stmpe_keypad_of_probe(&pdev->dev); > - if (IS_ERR(plat)) > - return PTR_ERR(plat); > - } > - > irq = platform_get_irq(pdev, 0); > if (irq < 0) > return irq; > @@ -326,6 +306,13 @@ static int stmpe_keypad_probe(struct platform_device *pdev) > if (!keypad) > return -ENOMEM; > > + keypad->stmpe = stmpe; > + keypad->variant = &stmpe_keypad_variants[stmpe->partnum]; > + > + of_property_read_u32(np, "debounce-interval", &keypad->debounce_ms); > + of_property_read_u32(np, "st,scan-count", &keypad->scan_count); > + keypad->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat"); > + > input = devm_input_allocate_device(&pdev->dev); > if (!input) > return -ENOMEM; > @@ -334,23 +321,22 @@ static int stmpe_keypad_probe(struct platform_device *pdev) > input->id.bustype = BUS_I2C; > input->dev.parent = &pdev->dev; > > - error = matrix_keypad_build_keymap(plat->keymap_data, NULL, > - STMPE_KEYPAD_MAX_ROWS, > - STMPE_KEYPAD_MAX_COLS, > + error = matrix_keypad_parse_of_params(&pdev->dev, &rows, &cols); > + if (error) > + return error; > + > + error = matrix_keypad_build_keymap(NULL, NULL, rows, cols, > keypad->keymap, input); > if (error) > return error; > > input_set_capability(input, EV_MSC, MSC_SCAN); > - if (!plat->no_autorepeat) > + if (!keypad->no_autorepeat) > __set_bit(EV_REP, input->evbit); > > - stmpe_keypad_fill_used_pins(keypad); > + stmpe_keypad_fill_used_pins(keypad, rows, cols); > > - keypad->stmpe = stmpe; > - keypad->plat = plat; > keypad->input = input; > - keypad->variant = &stmpe_keypad_variants[stmpe->partnum]; > > error = stmpe_keypad_chip_init(keypad); > if (error < 0) > diff --git a/include/linux/mfd/stmpe.h b/include/linux/mfd/stmpe.h > index 976e1a390177..dd908fea8c5b 100644 > --- a/include/linux/mfd/stmpe.h > +++ b/include/linux/mfd/stmpe.h > @@ -116,24 +116,6 @@ extern int stmpe_set_altfunc(struct stmpe *stmpe, u32 pins, > extern int stmpe_enable(struct stmpe *stmpe, unsigned int blocks); > extern int stmpe_disable(struct stmpe *stmpe, unsigned int blocks); > > -struct matrix_keymap_data; > - > -/** > - * struct stmpe_keypad_platform_data - STMPE keypad platform data > - * @keymap_data: key map table and size > - * @debounce_ms: debounce interval, in ms. Maximum is > - * %STMPE_KEYPAD_MAX_DEBOUNCE. > - * @scan_count: number of key scanning cycles to confirm key data. > - * Maximum is %STMPE_KEYPAD_MAX_SCAN_COUNT. > - * @no_autorepeat: disable key autorepeat > - */ > -struct stmpe_keypad_platform_data { > - const struct matrix_keymap_data *keymap_data; > - unsigned int debounce_ms; > - unsigned int scan_count; > - bool no_autorepeat; > -}; > - > #define STMPE_GPIO_NOREQ_811_TOUCH (0xf0) > > /** > @@ -202,7 +184,6 @@ struct stmpe_ts_platform_data { > * @irq_gpio: gpio number over which irq will be requested (significant only if > * irq_over_gpio is true) > * @gpio: GPIO-specific platform data > - * @keypad: keypad-specific platform data > * @ts: touchscreen-specific platform data > */ > struct stmpe_platform_data { > @@ -215,7 +196,6 @@ struct stmpe_platform_data { > int autosleep_timeout; > > struct stmpe_gpio_platform_data *gpio; > - struct stmpe_keypad_platform_data *keypad; > struct stmpe_ts_platform_data *ts; > }; > -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html