diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2021-05-25 21:35:18 +0300 |
---|---|---|
committer | Bartosz Golaszewski <bgolaszewski@baylibre.com> | 2021-05-28 16:15:15 +0200 |
commit | c354c29524eeabba63da51f30a09b85ec9dc853a (patch) | |
tree | d1504a7398802c07e3f203bf9ca42311703ae79d /drivers/gpio | |
parent | c80c44352ddadc257410c89a8e044c1804c4f6d2 (diff) |
gpiolib: Switch to bitmap_alloc()
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>
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpiolib.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 170de786c02f..27c07108496d 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -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; } |