Re: [PATCH v2] Input: matrix_keypad - check for errors from of_get_named_gpio()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Sun, Nov 11, 2018 at 09:44:28PM +0100, Christian Hoff wrote:
> "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@xxxxxxx>
> Suggested-by: Sebastian Reichel <sre@xxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
> ---

Looks good to me.

Reviewed-by: Sebastian Reichel <sre@xxxxxxxxxx>

-- Sebastian

>  drivers/input/keyboard/matrix_keypad.c | 23 ++++++++++++++---------
>  1 file changed, 14 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c
> index f51ae09596ef..403452ef00e6 100644
> --- a/drivers/input/keyboard/matrix_keypad.c
> +++ b/drivers/input/keyboard/matrix_keypad.c
> @@ -407,7 +407,7 @@ matrix_keypad_parse_dt(struct device *dev)
>  	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");
> @@ -452,12 +452,19 @@ matrix_keypad_parse_dt(struct device *dev)
>  		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];
> @@ -484,10 +491,8 @@ static int matrix_keypad_probe(struct platform_device *pdev)
>  	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;
> -- 
> 2.16.1.2.g9d582f143
> 

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux