| .. | .. |
|---|
| 95 | 95 | { |
|---|
| 96 | 96 | unsigned int val = MAX77802_OFF_PWRREQ; |
|---|
| 97 | 97 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 98 | | - int id = rdev_get_id(rdev); |
|---|
| 98 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 99 | 99 | int shift = max77802_get_opmode_shift(id); |
|---|
| 100 | 100 | |
|---|
| 101 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 102 | + return -EINVAL; |
|---|
| 101 | 103 | max77802->opmode[id] = val; |
|---|
| 102 | 104 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, |
|---|
| 103 | 105 | rdev->desc->enable_mask, val << shift); |
|---|
| .. | .. |
|---|
| 111 | 113 | static int max77802_set_mode(struct regulator_dev *rdev, unsigned int mode) |
|---|
| 112 | 114 | { |
|---|
| 113 | 115 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 114 | | - int id = rdev_get_id(rdev); |
|---|
| 116 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 115 | 117 | unsigned int val; |
|---|
| 116 | 118 | int shift = max77802_get_opmode_shift(id); |
|---|
| 117 | 119 | |
|---|
| .. | .. |
|---|
| 128 | 130 | return -EINVAL; |
|---|
| 129 | 131 | } |
|---|
| 130 | 132 | |
|---|
| 133 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 134 | + return -EINVAL; |
|---|
| 135 | + |
|---|
| 131 | 136 | max77802->opmode[id] = val; |
|---|
| 132 | 137 | return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, |
|---|
| 133 | 138 | rdev->desc->enable_mask, val << shift); |
|---|
| .. | .. |
|---|
| 136 | 141 | static unsigned max77802_get_mode(struct regulator_dev *rdev) |
|---|
| 137 | 142 | { |
|---|
| 138 | 143 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 139 | | - int id = rdev_get_id(rdev); |
|---|
| 144 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 140 | 145 | |
|---|
| 146 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 147 | + return -EINVAL; |
|---|
| 141 | 148 | return max77802_map_mode(max77802->opmode[id]); |
|---|
| 142 | 149 | } |
|---|
| 143 | 150 | |
|---|
| .. | .. |
|---|
| 161 | 168 | unsigned int mode) |
|---|
| 162 | 169 | { |
|---|
| 163 | 170 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 164 | | - int id = rdev_get_id(rdev); |
|---|
| 171 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 165 | 172 | unsigned int val; |
|---|
| 166 | 173 | int shift = max77802_get_opmode_shift(id); |
|---|
| 174 | + |
|---|
| 175 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 176 | + return -EINVAL; |
|---|
| 167 | 177 | |
|---|
| 168 | 178 | /* |
|---|
| 169 | 179 | * If the regulator has been disabled for suspend |
|---|
| .. | .. |
|---|
| 210 | 220 | static int max77802_enable(struct regulator_dev *rdev) |
|---|
| 211 | 221 | { |
|---|
| 212 | 222 | struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); |
|---|
| 213 | | - int id = rdev_get_id(rdev); |
|---|
| 223 | + unsigned int id = rdev_get_id(rdev); |
|---|
| 214 | 224 | int shift = max77802_get_opmode_shift(id); |
|---|
| 215 | 225 | |
|---|
| 226 | + if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode))) |
|---|
| 227 | + return -EINVAL; |
|---|
| 216 | 228 | if (max77802->opmode[id] == MAX77802_OFF_PWRREQ) |
|---|
| 217 | 229 | max77802->opmode[id] = MAX77802_OPMODE_NORMAL; |
|---|
| 218 | 230 | |
|---|
| .. | .. |
|---|
| 541 | 553 | |
|---|
| 542 | 554 | for (i = 0; i < MAX77802_REG_MAX; i++) { |
|---|
| 543 | 555 | struct regulator_dev *rdev; |
|---|
| 544 | | - int id = regulators[i].id; |
|---|
| 556 | + unsigned int id = regulators[i].id; |
|---|
| 545 | 557 | int shift = max77802_get_opmode_shift(id); |
|---|
| 546 | 558 | int ret; |
|---|
| 547 | 559 | |
|---|
| .. | .. |
|---|
| 559 | 571 | * the hardware reports OFF as the regulator operating mode. |
|---|
| 560 | 572 | * Default to operating mode NORMAL in that case. |
|---|
| 561 | 573 | */ |
|---|
| 562 | | - if (val == MAX77802_STATUS_OFF) |
|---|
| 563 | | - max77802->opmode[id] = MAX77802_OPMODE_NORMAL; |
|---|
| 564 | | - else |
|---|
| 565 | | - 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 | + } |
|---|
| 566 | 580 | |
|---|
| 567 | 581 | rdev = devm_regulator_register(&pdev->dev, |
|---|
| 568 | 582 | ®ulators[i], &config); |
|---|