gpio: mcp23s08: Bug fix of SPI device tree registration.
authorMichael Welling <mwelling@ieee.org>
Thu, 17 Apr 2014 01:00:24 +0000 (20:00 -0500)
committerJiri Slaby <jslaby@suse.cz>
Fri, 20 Jun 2014 15:34:13 +0000 (17:34 +0200)
commit 99e4b98dbe3ad1fe38a74d12c3b8d44a55930de4 upstream.

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.

Signed-off-by: Michael Welling <mwelling@ieee.org>
Acked-by: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
drivers/gpio/gpio-mcp23s08.c

index 2deb0c5e54a443a7546c7e4c63bf1e6a833c0d50..380fedb7d93c869d2b69720bcade36a1bed7f243 100644 (file)
@@ -657,8 +657,11 @@ static int mcp23s08_probe(struct spi_device *spi)
                        return -ENODEV;
                }
 
-               for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++)
+               for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) {
                        pullups[addr] = 0;
+                       if (spi_present_mask & (1 << addr))
+                               chips++;
+               }
        } else {
                type = spi_get_device_id(spi)->driver_data;
                pdata = dev_get_platdata(&spi->dev);
@@ -681,12 +684,12 @@ static int mcp23s08_probe(struct spi_device *spi)
                        pullups[addr] = pdata->chip[addr].pullups;
                }
 
-               if (!chips)
-                       return -ENODEV;
-
                base = pdata->base;
        }
 
+       if (!chips)
+               return -ENODEV;
+
        data = kzalloc(sizeof *data + chips * sizeof(struct mcp23s08),
                        GFP_KERNEL);
        if (!data)