diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2020-04-07 20:38:48 +0300 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2020-04-16 15:21:23 +0300 |
commit | 7b04aaaf660be525bf0df892a198a24ad66ac93d (patch) | |
tree | c0c802e543bdd0054de606d7ae270704594d443e /drivers/pinctrl/pinctrl-mcp23s08.c | |
parent | 1ac30db20be2da288131a865b94c772512e9ad47 (diff) | |
download | linux-7b04aaaf660be525bf0df892a198a24ad66ac93d.tar.xz |
pinctrl: mcp23s08: Use for_each_set_bit() and hweight_long()
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>
Diffstat (limited to 'drivers/pinctrl/pinctrl-mcp23s08.c')
-rw-r--r-- | drivers/pinctrl/pinctrl-mcp23s08.c | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index 330c2203e0f2..ea8decc36d50 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -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); |