| .. | .. |
|---|
| 14 | 14 | #include <linux/kernel.h> |
|---|
| 15 | 15 | #include <linux/bug.h> |
|---|
| 16 | 16 | #include <linux/err.h> |
|---|
| 17 | | -#include <linux/gpio.h> |
|---|
| 18 | 17 | #include <linux/slab.h> |
|---|
| 19 | | -#include <linux/gpio/consumer.h> |
|---|
| 20 | 18 | #include <linux/module.h> |
|---|
| 21 | 19 | #include <linux/platform_device.h> |
|---|
| 22 | 20 | #include <linux/regulator/driver.h> |
|---|
| .. | .. |
|---|
| 97 | 95 | { |
|---|
| 98 | 96 | unsigned int val = MAX77802_OFF_PWRREQ; |
|---|
| 99 | 97 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 100 | | - int id = rdev_get_id(rdev); |
|---|
| 98 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 101 | 99 | int shift = max77802_get_opmode_shift(id); |
|---|
| 102 | 100 | |
|---|
| 101 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 102 | + return -EINVAL; |
|---|
| 103 | 103 | max77802->opmode[id] = val; |
|---|
| 104 | 104 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, |
|---|
| 105 | 105 | rdev->desc->enable_mask, val << shift); |
|---|
| .. | .. |
|---|
| 113 | 113 | static int max77802_set_mode(struct regulator_dev *rdev, unsigned int mode) |
|---|
| 114 | 114 | { |
|---|
| 115 | 115 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 116 | | - int id = rdev_get_id(rdev); |
|---|
| 116 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 117 | 117 | unsigned int val; |
|---|
| 118 | 118 | int shift = max77802_get_opmode_shift(id); |
|---|
| 119 | 119 | |
|---|
| .. | .. |
|---|
| 130 | 130 | return -EINVAL; |
|---|
| 131 | 131 | } |
|---|
| 132 | 132 | |
|---|
| 133 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 134 | + return -EINVAL; |
|---|
| 135 | + |
|---|
| 133 | 136 | max77802->opmode[id] = val; |
|---|
| 134 | 137 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, |
|---|
| 135 | 138 | rdev->desc->enable_mask, val << shift); |
|---|
| .. | .. |
|---|
| 138 | 141 | static unsigned max77802_get_mode(struct regulator_dev *rdev) |
|---|
| 139 | 142 | { |
|---|
| 140 | 143 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 141 | | - int id = rdev_get_id(rdev); |
|---|
| 144 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 142 | 145 | |
|---|
| 146 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 147 | + return -EINVAL; |
|---|
| 143 | 148 | return max77802_map_mode(max77802->opmode[id]); |
|---|
| 144 | 149 | } |
|---|
| 145 | 150 | |
|---|
| .. | .. |
|---|
| 163 | 168 | unsigned int mode) |
|---|
| 164 | 169 | { |
|---|
| 165 | 170 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 166 | | - int id = rdev_get_id(rdev); |
|---|
| 171 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 167 | 172 | unsigned int val; |
|---|
| 168 | 173 | int shift = max77802_get_opmode_shift(id); |
|---|
| 174 | + |
|---|
| 175 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 176 | + return -EINVAL; |
|---|
| 169 | 177 | |
|---|
| 170 | 178 | /* |
|---|
| 171 | 179 | * If the regulator has been disabled for suspend |
|---|
| .. | .. |
|---|
| 212 | 220 | static int max77802_enable(struct regulator_dev *rdev) |
|---|
| 213 | 221 | { |
|---|
| 214 | 222 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 215 | | - int id = rdev_get_id(rdev); |
|---|
| 223 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 216 | 224 | int shift = max77802_get_opmode_shift(id); |
|---|
| 217 | 225 | |
|---|
| 226 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 227 | + return -EINVAL; |
|---|
| 218 | 228 | if (max77802->opmode[id] == MAX77802_OFF_PWRREQ) |
|---|
| 219 | 229 | max77802->opmode[id] = MAX77802_OPMODE_NORMAL; |
|---|
| 220 | 230 | |
|---|
| .. | .. |
|---|
| 248 | 258 | unsigned int ramp_value; |
|---|
| 249 | 259 | |
|---|
| 250 | 260 | if (id > MAX77802_BUCK4) { |
|---|
| 251 | | - dev_warn(&rdev->dev, |
|---|
| 252 | | - "%s: regulator: ramp delay not supported\n", |
|---|
| 253 | | - rdev->desc->name); |
|---|
| 261 | + dev_warn(&rdev->dev, |
|---|
| 262 | + "%s: regulator: ramp delay not supported\n", |
|---|
| 263 | + rdev->desc->name); |
|---|
| 254 | 264 | return -EINVAL; |
|---|
| 255 | 265 | } |
|---|
| 256 | 266 | ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_2bit, |
|---|
| .. | .. |
|---|
| 543 | 553 | |
|---|
| 544 | 554 | for (i = 0; i < MAX77802_REG_MAX; i++) { |
|---|
| 545 | 555 | struct regulator_dev *rdev; |
|---|
| 546 | | - int id = regulators[i].id; |
|---|
| 556 | + unsigned int id = regulators[i].id; |
|---|
| 547 | 557 | int shift = max77802_get_opmode_shift(id); |
|---|
| 548 | 558 | int ret; |
|---|
| 549 | 559 | |
|---|
| .. | .. |
|---|
| 561 | 571 | * the hardware reports OFF as the regulator operating mode. |
|---|
| 562 | 572 | * Default to operating mode NORMAL in that case. |
|---|
| 563 | 573 | */ |
|---|
| 564 | | - if (val == MAX77802_STATUS_OFF) |
|---|
| 565 | | - max77802->opmode[id] = MAX77802_OPMODE_NORMAL; |
|---|
| 566 | | - else |
|---|
| 567 | | - max77802->opmode[id] = val; |
|---|
| 574 | + if (id < ARRAY_SIZE(max77802->opmode)) { |
|---|
| 575 | + if (val == MAX77802_STATUS_OFF) |
|---|
| 576 | + max77802->opmode[id] = MAX77802_OPMODE_NORMAL; |
|---|
| 577 | + else |
|---|
| 578 | + max77802->opmode[id] = val; |
|---|
| 579 | + } |
|---|
| 568 | 580 | |
|---|
| 569 | 581 | rdev = devm_regulator_register(&pdev->dev, |
|---|
| 570 | 582 | ®ulators[i], &config); |
|---|