pinctrl: mcp23s08: Use for_each_set_bit() and hweight_long()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 7 Apr 2020 17:38:48 +0000 (20:38 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 16 Apr 2020 12:21:23 +0000 (14:21 +0200)
Here is a simplification of SPI code by using for_each_set_bit() and
hweight_long() library functions.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20200407173849.43628-8-andriy.shevchenko@linux.intel.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-mcp23s08.c

index 330c220..ea8decc 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /* MCP23S08 SPI/I2C GPIO driver */
 
+#include <linux/bitops.h>
 #include <linux/kernel.h>
 #include <linux/device.h>
 #include <linux/mutex.h>
@@ -940,13 +941,14 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
 static int mcp23s08_probe(struct spi_device *spi)
 {
        struct device *dev = &spi->dev;
+       unsigned long spi_present_mask;
        const void *match;
+       int chips;
+       u32 v;
        unsigned                        addr;
-       int                             chips = 0;
        struct mcp23s08_driver_data     *data;
        int                             status, type;
        unsigned                        ngpio = 0;
-       u32                             spi_present_mask;
 
        match = device_get_match_data(dev);
        if (match)
@@ -954,29 +956,22 @@ static int mcp23s08_probe(struct spi_device *spi)
        else
                type = spi_get_device_id(spi)->driver_data;
 
-       status = device_property_read_u32(&spi->dev,
-                       "microchip,spi-present-mask", &spi_present_mask);
+       status = device_property_read_u32(dev, "microchip,spi-present-mask", &v);
        if (status) {
-               status = device_property_read_u32(&spi->dev,
-                               "mcp,spi-present-mask", &spi_present_mask);
+               status = device_property_read_u32(dev, "mcp,spi-present-mask", &v);
                if (status) {
                        dev_err(&spi->dev, "missing spi-present-mask");
                        return status;
                }
        }
+       spi_present_mask = v;
 
-       if (!spi_present_mask || spi_present_mask > 0xff) {
+       if (!spi_present_mask || spi_present_mask >= BIT(MCP_MAX_DEV_PER_CS)) {
                dev_err(&spi->dev, "invalid spi-present-mask");
                return -ENODEV;
        }
 
-       for (addr = 0; addr < MCP_MAX_DEV_PER_CS; addr++) {
-               if (spi_present_mask & BIT(addr))
-                       chips++;
-       }
-
-       if (!chips)
-               return -ENODEV;
+       chips = hweight_long(spi_present_mask);
 
        data = devm_kzalloc(&spi->dev,
                            struct_size(data, chip, chips), GFP_KERNEL);
@@ -985,11 +980,8 @@ static int mcp23s08_probe(struct spi_device *spi)
 
        spi_set_drvdata(spi, data);
 
-       for (addr = 0; addr < MCP_MAX_DEV_PER_CS; addr++) {
-               if (!(spi_present_mask & BIT(addr)))
-                       continue;
-               chips--;
-               data->mcp[addr] = &data->chip[chips];
+       for_each_set_bit(addr, &spi_present_mask, MCP_MAX_DEV_PER_CS) {
+               data->mcp[addr] = &data->chip[--chips];
                data->mcp[addr]->irq = spi->irq;
 
                status = mcp23s08_spi_regmap_init(data->mcp[addr], dev, addr, type);