.. | .. |
---|
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); |
---|