hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/regulator/max77802-regulator.c
....@@ -95,9 +95,11 @@
9595 {
9696 unsigned int val = MAX77802_OFF_PWRREQ;
9797 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
98
- int id = rdev_get_id(rdev);
98
+ unsigned int id = rdev_get_id(rdev);
9999 int shift = max77802_get_opmode_shift(id);
100100
101
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
102
+ return -EINVAL;
101103 max77802->opmode[id] = val;
102104 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
103105 rdev->desc->enable_mask, val << shift);
....@@ -111,7 +113,7 @@
111113 static int max77802_set_mode(struct regulator_dev *rdev, unsigned int mode)
112114 {
113115 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
114
- int id = rdev_get_id(rdev);
116
+ unsigned int id = rdev_get_id(rdev);
115117 unsigned int val;
116118 int shift = max77802_get_opmode_shift(id);
117119
....@@ -128,6 +130,9 @@
128130 return -EINVAL;
129131 }
130132
133
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
134
+ return -EINVAL;
135
+
131136 max77802->opmode[id] = val;
132137 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
133138 rdev->desc->enable_mask, val << shift);
....@@ -136,8 +141,10 @@
136141 static unsigned max77802_get_mode(struct regulator_dev *rdev)
137142 {
138143 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
139
- int id = rdev_get_id(rdev);
144
+ unsigned int id = rdev_get_id(rdev);
140145
146
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
147
+ return -EINVAL;
141148 return max77802_map_mode(max77802->opmode[id]);
142149 }
143150
....@@ -161,9 +168,12 @@
161168 unsigned int mode)
162169 {
163170 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
164
- int id = rdev_get_id(rdev);
171
+ unsigned int id = rdev_get_id(rdev);
165172 unsigned int val;
166173 int shift = max77802_get_opmode_shift(id);
174
+
175
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
176
+ return -EINVAL;
167177
168178 /*
169179 * If the regulator has been disabled for suspend
....@@ -210,9 +220,11 @@
210220 static int max77802_enable(struct regulator_dev *rdev)
211221 {
212222 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
213
- int id = rdev_get_id(rdev);
223
+ unsigned int id = rdev_get_id(rdev);
214224 int shift = max77802_get_opmode_shift(id);
215225
226
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
227
+ return -EINVAL;
216228 if (max77802->opmode[id] == MAX77802_OFF_PWRREQ)
217229 max77802->opmode[id] = MAX77802_OPMODE_NORMAL;
218230
....@@ -541,7 +553,7 @@
541553
542554 for (i = 0; i < MAX77802_REG_MAX; i++) {
543555 struct regulator_dev *rdev;
544
- int id = regulators[i].id;
556
+ unsigned int id = regulators[i].id;
545557 int shift = max77802_get_opmode_shift(id);
546558 int ret;
547559
....@@ -559,10 +571,12 @@
559571 * the hardware reports OFF as the regulator operating mode.
560572 * Default to operating mode NORMAL in that case.
561573 */
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
+ }
566580
567581 rdev = devm_regulator_register(&pdev->dev,
568582 &regulators[i], &config);