diff options
| author | Michael Welling <mwelling@ieee.org> | 2014-04-16 21:00:24 -0400 |
|---|---|---|
| committer | Linus Walleij <linus.walleij@linaro.org> | 2014-05-09 04:28:16 -0400 |
| commit | 99e4b98dbe3ad1fe38a74d12c3b8d44a55930de4 (patch) | |
| tree | 209a4794bec9611e0c0255c5057a541fee6b209d | |
| parent | a7008ee1a423720e755e08f33b63669795c1f072 (diff) | |
gpio: mcp23s08: Bug fix of SPI device tree registration.
The chips variable needs to be incremented for each chip that is
found in the spi_present_mask when registering via device tree.
Without this and the checking a negative index is passed to the
data->chip array in a subsequent loop.
Cc: stable@vger.kernel.org
Signed-off-by: Michael Welling <mwelling@ieee.org>
Acked-by: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
| -rw-r--r-- | drivers/gpio/gpio-mcp23s08.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c index 99a68310e7c0..3d53fd6880d1 100644 --- a/drivers/gpio/gpio-mcp23s08.c +++ b/drivers/gpio/gpio-mcp23s08.c | |||
| @@ -894,9 +894,11 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
| 894 | dev_err(&spi->dev, "invalid spi-present-mask\n"); | 894 | dev_err(&spi->dev, "invalid spi-present-mask\n"); |
| 895 | return -ENODEV; | 895 | return -ENODEV; |
| 896 | } | 896 | } |
| 897 | 897 | for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { | |
| 898 | for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) | 898 | if ((spi_present_mask & (1 << addr))) |
| 899 | chips++; | ||
| 899 | pullups[addr] = 0; | 900 | pullups[addr] = 0; |
| 901 | } | ||
| 900 | } else { | 902 | } else { |
| 901 | type = spi_get_device_id(spi)->driver_data; | 903 | type = spi_get_device_id(spi)->driver_data; |
| 902 | pdata = dev_get_platdata(&spi->dev); | 904 | pdata = dev_get_platdata(&spi->dev); |
| @@ -919,12 +921,12 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
| 919 | pullups[addr] = pdata->chip[addr].pullups; | 921 | pullups[addr] = pdata->chip[addr].pullups; |
| 920 | } | 922 | } |
| 921 | 923 | ||
| 922 | if (!chips) | ||
| 923 | return -ENODEV; | ||
| 924 | |||
| 925 | base = pdata->base; | 924 | base = pdata->base; |
| 926 | } | 925 | } |
| 927 | 926 | ||
| 927 | if (!chips) | ||
| 928 | return -ENODEV; | ||
| 929 | |||
| 928 | data = kzalloc(sizeof(*data) + chips * sizeof(struct mcp23s08), | 930 | data = kzalloc(sizeof(*data) + chips * sizeof(struct mcp23s08), |
| 929 | GFP_KERNEL); | 931 | GFP_KERNEL); |
| 930 | if (!data) | 932 | if (!data) |
