summaryrefslogtreecommitdiff
path: root/drivers/pinctrl/pinctrl-mcp23s08.c
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2020-04-07 20:38:48 +0300
committerLinus Walleij <linus.walleij@linaro.org>2020-04-16 15:21:23 +0300
commit7b04aaaf660be525bf0df892a198a24ad66ac93d (patch)
treec0c802e543bdd0054de606d7ae270704594d443e /drivers/pinctrl/pinctrl-mcp23s08.c
parent1ac30db20be2da288131a865b94c772512e9ad47 (diff)
downloadlinux-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.c30
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);