| From c53403a37cf083ce85da720f18918f73580d0064 Mon Sep 17 00:00:00 2001 |
| From: Joe Perches <joe@perches.com> |
| Date: Mon, 18 May 2015 10:01:03 -0700 |
| Subject: regulator: max77686: fix gpio_enabled shift wrapping bug |
| |
| From: Joe Perches <joe@perches.com> |
| |
| commit c53403a37cf083ce85da720f18918f73580d0064 upstream. |
| |
| The code should handle more than 32 bits here because "id" |
| can be a value up to MAX77686_REGULATORS (currently 34). |
| |
| Convert the gpio_enabled type to DECLARE_BITMAP and use |
| test_bit/set_bit. |
| |
| Fixes: 3307e9025d29 ("regulator: max77686: Add GPIO control") |
| Reported-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Joe Perches <joe@perches.com> |
| Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/regulator/max77686.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/regulator/max77686.c |
| +++ b/drivers/regulator/max77686.c |
| @@ -88,7 +88,7 @@ enum max77686_ramp_rate { |
| }; |
| |
| struct max77686_data { |
| - u64 gpio_enabled:MAX77686_REGULATORS; |
| + DECLARE_BITMAP(gpio_enabled, MAX77686_REGULATORS); |
| |
| /* Array indexed by regulator id */ |
| unsigned int opmode[MAX77686_REGULATORS]; |
| @@ -121,7 +121,7 @@ static unsigned int max77686_map_normal_ |
| case MAX77686_BUCK8: |
| case MAX77686_BUCK9: |
| case MAX77686_LDO20 ... MAX77686_LDO22: |
| - if (max77686->gpio_enabled & (1 << id)) |
| + if (test_bit(id, max77686->gpio_enabled)) |
| return MAX77686_GPIO_CONTROL; |
| } |
| |
| @@ -277,7 +277,7 @@ static int max77686_of_parse_cb(struct d |
| } |
| |
| if (gpio_is_valid(config->ena_gpio)) { |
| - max77686->gpio_enabled |= (1 << desc->id); |
| + set_bit(desc->id, max77686->gpio_enabled); |
| |
| return regmap_update_bits(config->regmap, desc->enable_reg, |
| desc->enable_mask, |