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.wall...@linaro.org>
> ---
>  .../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.jo...@linaro.org>

> 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-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to