gpiolib: Split fastpath array to two
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 25 May 2021 18:35:17 +0000 (21:35 +0300)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Fri, 28 May 2021 14:13:07 +0000 (16:13 +0200)
Split fastpath array to two, i.e. for mask and for bits.
At the same time declare them as bitmaps.

This makes code better to read and gives a clue about use of
bitmap API.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
drivers/gpio/gpiolib.c

index 220a9d8..170de78 100644 (file)
@@ -2540,21 +2540,24 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 
        while (i < array_size) {
                struct gpio_chip *gc = desc_array[i]->gdev->chip;
-               unsigned long fastpath[2 * BITS_TO_LONGS(FASTPATH_NGPIO)];
+               DECLARE_BITMAP(fastpath_mask, FASTPATH_NGPIO);
+               DECLARE_BITMAP(fastpath_bits, FASTPATH_NGPIO);
                unsigned long *mask, *bits;
                int first, j;
 
                if (likely(gc->ngpio <= FASTPATH_NGPIO)) {
-                       mask = fastpath;
+                       mask = fastpath_mask;
+                       bits = fastpath_bits;
                } else {
                        mask = kmalloc_array(2 * BITS_TO_LONGS(gc->ngpio),
                                           sizeof(*mask),
                                           can_sleep ? GFP_KERNEL : GFP_ATOMIC);
                        if (!mask)
                                return -ENOMEM;
+
+                       bits = mask + BITS_TO_LONGS(gc->ngpio);
                }
 
-               bits = mask + BITS_TO_LONGS(gc->ngpio);
                bitmap_zero(mask, gc->ngpio);
 
                if (!can_sleep)
@@ -2577,7 +2580,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
 
                ret = gpio_chip_get_multiple(gc, mask, bits);
                if (ret) {
-                       if (mask != fastpath)
+                       if (mask != fastpath_mask)
                                kfree(mask);
                        return ret;
                }
@@ -2598,7 +2601,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
                                                       j);
                }
 
-               if (mask != fastpath)
+               if (mask != fastpath_mask)
                        kfree(mask);
        }
        return 0;
@@ -2823,21 +2826,24 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
 
        while (i < array_size) {
                struct gpio_chip *gc = desc_array[i]->gdev->chip;
-               unsigned long fastpath[2 * BITS_TO_LONGS(FASTPATH_NGPIO)];
+               DECLARE_BITMAP(fastpath_mask, FASTPATH_NGPIO);
+               DECLARE_BITMAP(fastpath_bits, FASTPATH_NGPIO);
                unsigned long *mask, *bits;
                int count = 0;
 
                if (likely(gc->ngpio <= FASTPATH_NGPIO)) {
-                       mask = fastpath;
+                       mask = fastpath_mask;
+                       bits = fastpath_bits;
                } else {
                        mask = kmalloc_array(2 * BITS_TO_LONGS(gc->ngpio),
                                           sizeof(*mask),
                                           can_sleep ? GFP_KERNEL : GFP_ATOMIC);
                        if (!mask)
                                return -ENOMEM;
+
+                       bits = mask + BITS_TO_LONGS(gc->ngpio);
                }
 
-               bits = mask + BITS_TO_LONGS(gc->ngpio);
                bitmap_zero(mask, gc->ngpio);
 
                if (!can_sleep)
@@ -2882,7 +2888,7 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
                if (count != 0)
                        gpio_chip_set_multiple(gc, mask, bits);
 
-               if (mask != fastpath)
+               if (mask != fastpath_mask)
                        kfree(mask);
        }
        return 0;