forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-09 05e59e5fb0064c97a1c10921ecd549f2d4a58565
kernel/drivers/regulator/max77802-regulator.c
....@@ -14,9 +14,7 @@
1414 #include <linux/kernel.h>
1515 #include <linux/bug.h>
1616 #include <linux/err.h>
17
-#include <linux/gpio.h>
1817 #include <linux/slab.h>
19
-#include <linux/gpio/consumer.h>
2018 #include <linux/module.h>
2119 #include <linux/platform_device.h>
2220 #include <linux/regulator/driver.h>
....@@ -97,9 +95,11 @@
9795 {
9896 unsigned int val = MAX77802_OFF_PWRREQ;
9997 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
100
- int id = rdev_get_id(rdev);
98
+ unsigned int id = rdev_get_id(rdev);
10199 int shift = max77802_get_opmode_shift(id);
102100
101
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
102
+ return -EINVAL;
103103 max77802->opmode[id] = val;
104104 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
105105 rdev->desc->enable_mask, val << shift);
....@@ -113,7 +113,7 @@
113113 static int max77802_set_mode(struct regulator_dev *rdev, unsigned int mode)
114114 {
115115 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
116
- int id = rdev_get_id(rdev);
116
+ unsigned int id = rdev_get_id(rdev);
117117 unsigned int val;
118118 int shift = max77802_get_opmode_shift(id);
119119
....@@ -130,6 +130,9 @@
130130 return -EINVAL;
131131 }
132132
133
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
134
+ return -EINVAL;
135
+
133136 max77802->opmode[id] = val;
134137 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
135138 rdev->desc->enable_mask, val << shift);
....@@ -138,8 +141,10 @@
138141 static unsigned max77802_get_mode(struct regulator_dev *rdev)
139142 {
140143 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
141
- int id = rdev_get_id(rdev);
144
+ unsigned int id = rdev_get_id(rdev);
142145
146
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
147
+ return -EINVAL;
143148 return max77802_map_mode(max77802->opmode[id]);
144149 }
145150
....@@ -163,9 +168,12 @@
163168 unsigned int mode)
164169 {
165170 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
166
- int id = rdev_get_id(rdev);
171
+ unsigned int id = rdev_get_id(rdev);
167172 unsigned int val;
168173 int shift = max77802_get_opmode_shift(id);
174
+
175
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
176
+ return -EINVAL;
169177
170178 /*
171179 * If the regulator has been disabled for suspend
....@@ -212,9 +220,11 @@
212220 static int max77802_enable(struct regulator_dev *rdev)
213221 {
214222 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
215
- int id = rdev_get_id(rdev);
223
+ unsigned int id = rdev_get_id(rdev);
216224 int shift = max77802_get_opmode_shift(id);
217225
226
+ if (WARN_ON_ONCE(id >= ARRAY_SIZE(max77802->opmode)))
227
+ return -EINVAL;
218228 if (max77802->opmode[id] == MAX77802_OFF_PWRREQ)
219229 max77802->opmode[id] = MAX77802_OPMODE_NORMAL;
220230
....@@ -248,9 +258,9 @@
248258 unsigned int ramp_value;
249259
250260 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);
254264 return -EINVAL;
255265 }
256266 ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_2bit,
....@@ -543,7 +553,7 @@
543553
544554 for (i = 0; i < MAX77802_REG_MAX; i++) {
545555 struct regulator_dev *rdev;
546
- int id = regulators[i].id;
556
+ unsigned int id = regulators[i].id;
547557 int shift = max77802_get_opmode_shift(id);
548558 int ret;
549559
....@@ -561,10 +571,12 @@
561571 * the hardware reports OFF as the regulator operating mode.
562572 * Default to operating mode NORMAL in that case.
563573 */
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
+ }
568580
569581 rdev = devm_regulator_register(&pdev->dev,
570582 &regulators[i], &config);