gpiolib: Switch to bitmap_alloc()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 25 May 2021 18:35:18 +0000 (21:35 +0300)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Fri, 28 May 2021 14:15:15 +0000 (16:15 +0200)
Switch to bitmap_alloc() to show clearly what we are allocating.
Besides that it returns pointer of bitmap type instead of opaque void *.

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 170de78..27c0710 100644 (file)
@@ -2549,13 +2549,17 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
                        mask = fastpath_mask;
                        bits = fastpath_bits;
                } else {
-                       mask = kmalloc_array(2 * BITS_TO_LONGS(gc->ngpio),
-                                          sizeof(*mask),
-                                          can_sleep ? GFP_KERNEL : GFP_ATOMIC);
+                       gfp_t flags = can_sleep ? GFP_KERNEL : GFP_ATOMIC;
+
+                       mask = bitmap_alloc(gc->ngpio, flags);
                        if (!mask)
                                return -ENOMEM;
 
-                       bits = mask + BITS_TO_LONGS(gc->ngpio);
+                       bits = bitmap_alloc(gc->ngpio, flags);
+                       if (!bits) {
+                               bitmap_free(mask);
+                               return -ENOMEM;
+                       }
                }
 
                bitmap_zero(mask, gc->ngpio);
@@ -2581,7 +2585,9 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
                ret = gpio_chip_get_multiple(gc, mask, bits);
                if (ret) {
                        if (mask != fastpath_mask)
-                               kfree(mask);
+                               bitmap_free(mask);
+                       if (bits != fastpath_bits)
+                               bitmap_free(bits);
                        return ret;
                }
 
@@ -2602,7 +2608,9 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep,
                }
 
                if (mask != fastpath_mask)
-                       kfree(mask);
+                       bitmap_free(mask);
+               if (bits != fastpath_bits)
+                       bitmap_free(bits);
        }
        return 0;
 }
@@ -2835,13 +2843,17 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
                        mask = fastpath_mask;
                        bits = fastpath_bits;
                } else {
-                       mask = kmalloc_array(2 * BITS_TO_LONGS(gc->ngpio),
-                                          sizeof(*mask),
-                                          can_sleep ? GFP_KERNEL : GFP_ATOMIC);
+                       gfp_t flags = can_sleep ? GFP_KERNEL : GFP_ATOMIC;
+
+                       mask = bitmap_alloc(gc->ngpio, flags);
                        if (!mask)
                                return -ENOMEM;
 
-                       bits = mask + BITS_TO_LONGS(gc->ngpio);
+                       bits = bitmap_alloc(gc->ngpio, flags);
+                       if (!bits) {
+                               bitmap_free(mask);
+                               return -ENOMEM;
+                       }
                }
 
                bitmap_zero(mask, gc->ngpio);
@@ -2889,7 +2901,9 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep,
                        gpio_chip_set_multiple(gc, mask, bits);
 
                if (mask != fastpath_mask)
-                       kfree(mask);
+                       bitmap_free(mask);
+               if (bits != fastpath_bits)
+                       bitmap_free(bits);
        }
        return 0;
 }