lkml.org 
[lkml]   [2018]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 46/91] Input: matrix_keypad - check for errors from of_get_named_gpio()
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Christian Hoff <christian_hoff@gmx.net>

    commit d55bda1b3e7c5a87f10da54fdda866a9a9cef30b upstream.

    "of_get_named_gpio()" returns a negative error value if it fails
    and drivers should check for this. This missing check was now
    added to the matrix_keypad driver.

    In my case "of_get_named_gpio()" returned -EPROBE_DEFER because
    the referenced GPIOs belong to an I/O expander, which was not yet
    probed at the point in time when the matrix_keypad driver was
    loading. Because the driver did not check for errors from the
    "of_get_named_gpio()" routine, it was assuming that "-EPROBE_DEFER"
    is actually a GPIO number and continued as usual, which led to further
    errors like this later on:

    WARNING: CPU: 3 PID: 167 at drivers/gpio/gpiolib.c:114
    gpio_to_desc+0xc8/0xd0
    invalid GPIO -517

    Note that the "GPIO number" -517 in the error message above is
    actually "-EPROBE_DEFER".

    As part of the patch a misleading error message "no platform data defined"
    was also removed. This does not lead to information loss because the other
    error paths in matrix_keypad_parse_dt() already print an error.

    Signed-off-by: Christian Hoff <christian_hoff@gmx.net>
    Suggested-by: Sebastian Reichel <sre@kernel.org>
    Reviewed-by: Sebastian Reichel <sre@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/input/keyboard/matrix_keypad.c | 23 ++++++++++++++---------
    1 file changed, 14 insertions(+), 9 deletions(-)

    --- a/drivers/input/keyboard/matrix_keypad.c
    +++ b/drivers/input/keyboard/matrix_keypad.c
    @@ -405,7 +405,7 @@ matrix_keypad_parse_dt(struct device *de
    struct matrix_keypad_platform_data *pdata;
    struct device_node *np = dev->of_node;
    unsigned int *gpios;
    - int i, nrow, ncol;
    + int ret, i, nrow, ncol;

    if (!np) {
    dev_err(dev, "device lacks DT data\n");
    @@ -447,12 +447,19 @@ matrix_keypad_parse_dt(struct device *de
    return ERR_PTR(-ENOMEM);
    }

    - for (i = 0; i < pdata->num_row_gpios; i++)
    - gpios[i] = of_get_named_gpio(np, "row-gpios", i);
    + for (i = 0; i < nrow; i++) {
    + ret = of_get_named_gpio(np, "row-gpios", i);
    + if (ret < 0)
    + return ERR_PTR(ret);
    + gpios[i] = ret;
    + }

    - for (i = 0; i < pdata->num_col_gpios; i++)
    - gpios[pdata->num_row_gpios + i] =
    - of_get_named_gpio(np, "col-gpios", i);
    + for (i = 0; i < ncol; i++) {
    + ret = of_get_named_gpio(np, "col-gpios", i);
    + if (ret < 0)
    + return ERR_PTR(ret);
    + gpios[nrow + i] = ret;
    + }

    pdata->row_gpios = gpios;
    pdata->col_gpios = &gpios[pdata->num_row_gpios];
    @@ -479,10 +486,8 @@ static int matrix_keypad_probe(struct pl
    pdata = dev_get_platdata(&pdev->dev);
    if (!pdata) {
    pdata = matrix_keypad_parse_dt(&pdev->dev);
    - if (IS_ERR(pdata)) {
    - dev_err(&pdev->dev, "no platform data defined\n");
    + if (IS_ERR(pdata))
    return PTR_ERR(pdata);
    - }
    } else if (!pdata->keymap_data) {
    dev_err(&pdev->dev, "no keymap data defined\n");
    return -EINVAL;

    \
     
     \ /
      Last update: 2018-12-11 17:19    [W:4.759 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site