virtio-mem: don't read big block size in Sub Block Mode
[linux-2.6-microblaze.git] / drivers / regulator / max77802-regulator.c
1 // SPDX-License-Identifier: GPL-2.0+
2 //
3 // max77802.c - Regulator driver for the Maxim 77802
4 //
5 // Copyright (C) 2013-2014 Google, Inc
6 // Simon Glass <sjg@chromium.org>
7 //
8 // Copyright (C) 2012 Samsung Electronics
9 // Chiwoong Byun <woong.byun@samsung.com>
10 // Jonghwa Lee <jonghwa3.lee@samsung.com>
11 //
12 // This driver is based on max8997.c
13
14 #include <linux/kernel.h>
15 #include <linux/bug.h>
16 #include <linux/err.h>
17 #include <linux/slab.h>
18 #include <linux/module.h>
19 #include <linux/platform_device.h>
20 #include <linux/regulator/driver.h>
21 #include <linux/regulator/machine.h>
22 #include <linux/regulator/of_regulator.h>
23 #include <linux/mfd/max77686.h>
24 #include <linux/mfd/max77686-private.h>
25 #include <dt-bindings/regulator/maxim,max77802.h>
26
27 /* Default ramp delay in case it is not manually set */
28 #define MAX77802_RAMP_DELAY             100000          /* uV/us */
29
30 #define MAX77802_OPMODE_SHIFT_LDO       6
31 #define MAX77802_OPMODE_BUCK234_SHIFT   4
32 #define MAX77802_OPMODE_MASK            0x3
33
34 #define MAX77802_VSEL_MASK              0x3F
35 #define MAX77802_DVS_VSEL_MASK          0xFF
36
37 #define MAX77802_RAMP_RATE_MASK_2BIT    0xC0
38 #define MAX77802_RAMP_RATE_SHIFT_2BIT   6
39 #define MAX77802_RAMP_RATE_MASK_4BIT    0xF0
40 #define MAX77802_RAMP_RATE_SHIFT_4BIT   4
41
42 #define MAX77802_STATUS_OFF             0x0
43 #define MAX77802_OFF_PWRREQ             0x1
44 #define MAX77802_LP_PWRREQ              0x2
45
46 static const unsigned int max77802_buck234_ramp_table[] = {
47         12500,
48         25000,
49         50000,
50         100000,
51 };
52
53 static const unsigned int max77802_buck16_ramp_table[] = {
54         1000,   2000,   3030,   4000,
55         5000,   5880,   7140,   8330,
56         9090,   10000,  11110,  12500,
57         16670,  25000,  50000,  100000,
58 };
59
60 struct max77802_regulator_prv {
61         /* Array indexed by regulator id */
62         unsigned int opmode[MAX77802_REG_MAX];
63 };
64
65 static inline unsigned int max77802_map_mode(unsigned int mode)
66 {
67         return mode == MAX77802_OPMODE_NORMAL ?
68                 REGULATOR_MODE_NORMAL : REGULATOR_MODE_STANDBY;
69 }
70
71 static int max77802_get_opmode_shift(int id)
72 {
73         if (id == MAX77802_BUCK1 || (id >= MAX77802_BUCK5 &&
74                                      id <= MAX77802_BUCK10))
75                 return 0;
76
77         if (id >= MAX77802_BUCK2 && id <= MAX77802_BUCK4)
78                 return MAX77802_OPMODE_BUCK234_SHIFT;
79
80         if (id >= MAX77802_LDO1 && id <= MAX77802_LDO35)
81                 return MAX77802_OPMODE_SHIFT_LDO;
82
83         return -EINVAL;
84 }
85
86 /**
87  * max77802_set_suspend_disable - Disable the regulator during system suspend
88  * @rdev: regulator to mark as disabled
89  *
90  * All regulators expect LDO 1, 3, 20 and 21 support OFF by PWRREQ.
91  * Configure the regulator so the PMIC will turn it OFF during system suspend.
92  */
93 static int max77802_set_suspend_disable(struct regulator_dev *rdev)
94 {
95         unsigned int val = MAX77802_OFF_PWRREQ;
96         struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
97         int id = rdev_get_id(rdev);
98         int shift = max77802_get_opmode_shift(id);
99
100         max77802->opmode[id] = val;
101         return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
102                                   rdev->desc->enable_mask, val << shift);
103 }
104
105 /*
106  * Some LDOs support Low Power Mode while the system is running.
107  *
108  * LDOs 1, 3, 20, 21.
109  */
110 static int max77802_set_mode(struct regulator_dev *rdev, unsigned int mode)
111 {
112         struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
113         int id = rdev_get_id(rdev);
114         unsigned int val;
115         int shift = max77802_get_opmode_shift(id);
116
117         switch (mode) {
118         case REGULATOR_MODE_STANDBY:
119                 val = MAX77802_OPMODE_LP;       /* ON in Low Power Mode */
120                 break;
121         case REGULATOR_MODE_NORMAL:
122                 val = MAX77802_OPMODE_NORMAL;   /* ON in Normal Mode */
123                 break;
124         default:
125                 dev_warn(&rdev->dev, "%s: regulator mode: 0x%x not supported\n",
126                          rdev->desc->name, mode);
127                 return -EINVAL;
128         }
129
130         max77802->opmode[id] = val;
131         return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
132                                   rdev->desc->enable_mask, val << shift);
133 }
134
135 static unsigned max77802_get_mode(struct regulator_dev *rdev)
136 {
137         struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
138         int id = rdev_get_id(rdev);
139
140         return max77802_map_mode(max77802->opmode[id]);
141 }
142
143 /**
144  * max77802_set_suspend_mode - set regulator opmode when the system is suspended
145  * @rdev: regulator to change mode
146  * @mode: operating mode to be set
147  *
148  * Will set the operating mode for the regulators during system suspend.
149  * This function is valid for the three different enable control logics:
150  *
151  * Enable Control Logic1 by PWRREQ (BUCK 2-4 and LDOs 2, 4-19, 22-35)
152  * Enable Control Logic2 by PWRREQ (LDOs 1, 20, 21)
153  * Enable Control Logic3 by PWRREQ (LDO 3)
154  *
155  * If setting the regulator mode fails, the function only warns but does
156  * not return an error code to avoid the regulator core to stop setting
157  * the operating mode for the remaining regulators.
158  */
159 static int max77802_set_suspend_mode(struct regulator_dev *rdev,
160                                      unsigned int mode)
161 {
162         struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
163         int id = rdev_get_id(rdev);
164         unsigned int val;
165         int shift = max77802_get_opmode_shift(id);
166
167         /*
168          * If the regulator has been disabled for suspend
169          * then is invalid to try setting a suspend mode.
170          */
171         if (max77802->opmode[id] == MAX77802_OFF_PWRREQ) {
172                 dev_warn(&rdev->dev, "%s: is disabled, mode: 0x%x not set\n",
173                          rdev->desc->name, mode);
174                 return 0;
175         }
176
177         switch (mode) {
178         case REGULATOR_MODE_STANDBY:
179                 /*
180                  * If the regulator opmode is normal then enable
181                  * ON in Low Power Mode by PWRREQ. If the mode is
182                  * already Low Power then no action is required.
183                  */
184                 if (max77802->opmode[id] == MAX77802_OPMODE_NORMAL)
185                         val = MAX77802_LP_PWRREQ;
186                 else
187                         return 0;
188                 break;
189         case REGULATOR_MODE_NORMAL:
190                 /*
191                  * If the regulator operating mode is Low Power then
192                  * normal is not a valid opmode in suspend. If the
193                  * mode is already normal then no action is required.
194                  */
195                 if (max77802->opmode[id] == MAX77802_OPMODE_LP)
196                         dev_warn(&rdev->dev, "%s: in Low Power: 0x%x invalid\n",
197                                  rdev->desc->name, mode);
198                 return 0;
199         default:
200                 dev_warn(&rdev->dev, "%s: regulator mode: 0x%x not supported\n",
201                          rdev->desc->name, mode);
202                 return -EINVAL;
203         }
204
205         return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
206                                   rdev->desc->enable_mask, val << shift);
207 }
208
209 static int max77802_enable(struct regulator_dev *rdev)
210 {
211         struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
212         int id = rdev_get_id(rdev);
213         int shift = max77802_get_opmode_shift(id);
214
215         if (max77802->opmode[id] == MAX77802_OFF_PWRREQ)
216                 max77802->opmode[id] = MAX77802_OPMODE_NORMAL;
217
218         return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
219                                   rdev->desc->enable_mask,
220                                   max77802->opmode[id] << shift);
221 }
222
223 /*
224  * LDOs 2, 4-19, 22-35
225  */
226 static const struct regulator_ops max77802_ldo_ops_logic1 = {
227         .list_voltage           = regulator_list_voltage_linear,
228         .map_voltage            = regulator_map_voltage_linear,
229         .is_enabled             = regulator_is_enabled_regmap,
230         .enable                 = max77802_enable,
231         .disable                = regulator_disable_regmap,
232         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
233         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
234         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
235         .set_suspend_disable    = max77802_set_suspend_disable,
236         .set_suspend_mode       = max77802_set_suspend_mode,
237 };
238
239 /*
240  * LDOs 1, 20, 21, 3
241  */
242 static const struct regulator_ops max77802_ldo_ops_logic2 = {
243         .list_voltage           = regulator_list_voltage_linear,
244         .map_voltage            = regulator_map_voltage_linear,
245         .is_enabled             = regulator_is_enabled_regmap,
246         .enable                 = max77802_enable,
247         .disable                = regulator_disable_regmap,
248         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
249         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
250         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
251         .set_mode               = max77802_set_mode,
252         .get_mode               = max77802_get_mode,
253         .set_suspend_mode       = max77802_set_suspend_mode,
254 };
255
256 /* BUCKS 1, 6 */
257 static const struct regulator_ops max77802_buck_16_dvs_ops = {
258         .list_voltage           = regulator_list_voltage_linear,
259         .map_voltage            = regulator_map_voltage_linear,
260         .is_enabled             = regulator_is_enabled_regmap,
261         .enable                 = max77802_enable,
262         .disable                = regulator_disable_regmap,
263         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
264         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
265         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
266         .set_ramp_delay         = regulator_set_ramp_delay_regmap,
267         .set_suspend_disable    = max77802_set_suspend_disable,
268 };
269
270 /* BUCKs 2-4 */
271 static const struct regulator_ops max77802_buck_234_ops = {
272         .list_voltage           = regulator_list_voltage_linear,
273         .map_voltage            = regulator_map_voltage_linear,
274         .is_enabled             = regulator_is_enabled_regmap,
275         .enable                 = max77802_enable,
276         .disable                = regulator_disable_regmap,
277         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
278         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
279         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
280         .set_ramp_delay         = regulator_set_ramp_delay_regmap,
281         .set_suspend_disable    = max77802_set_suspend_disable,
282         .set_suspend_mode       = max77802_set_suspend_mode,
283 };
284
285 /* BUCKs 5, 7-10 */
286 static const struct regulator_ops max77802_buck_dvs_ops = {
287         .list_voltage           = regulator_list_voltage_linear,
288         .map_voltage            = regulator_map_voltage_linear,
289         .is_enabled             = regulator_is_enabled_regmap,
290         .enable                 = max77802_enable,
291         .disable                = regulator_disable_regmap,
292         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
293         .set_voltage_sel        = regulator_set_voltage_sel_regmap,
294         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
295         .set_suspend_disable    = max77802_set_suspend_disable,
296 };
297
298 /* LDOs 3-7, 9-14, 18-26, 28, 29, 32-34 */
299 #define regulator_77802_desc_p_ldo(num, supply, log)    {               \
300         .name           = "LDO"#num,                                    \
301         .of_match       = of_match_ptr("LDO"#num),                      \
302         .regulators_node        = of_match_ptr("regulators"),           \
303         .id             = MAX77802_LDO##num,                            \
304         .supply_name    = "inl"#supply,                                 \
305         .ops            = &max77802_ldo_ops_logic##log,                 \
306         .type           = REGULATOR_VOLTAGE,                            \
307         .owner          = THIS_MODULE,                                  \
308         .min_uV         = 800000,                                       \
309         .uV_step        = 50000,                                        \
310         .ramp_delay     = MAX77802_RAMP_DELAY,                          \
311         .n_voltages     = 1 << 6,                                       \
312         .vsel_reg       = MAX77802_REG_LDO1CTRL1 + num - 1,             \
313         .vsel_mask      = MAX77802_VSEL_MASK,                           \
314         .enable_reg     = MAX77802_REG_LDO1CTRL1 + num - 1,             \
315         .enable_mask    = MAX77802_OPMODE_MASK << MAX77802_OPMODE_SHIFT_LDO, \
316         .of_map_mode    = max77802_map_mode,                            \
317 }
318
319 /* LDOs 1, 2, 8, 15, 17, 27, 30, 35 */
320 #define regulator_77802_desc_n_ldo(num, supply, log)   {                \
321         .name           = "LDO"#num,                                    \
322         .of_match       = of_match_ptr("LDO"#num),                      \
323         .regulators_node        = of_match_ptr("regulators"),           \
324         .id             = MAX77802_LDO##num,                            \
325         .supply_name    = "inl"#supply,                                 \
326         .ops            = &max77802_ldo_ops_logic##log,                 \
327         .type           = REGULATOR_VOLTAGE,                            \
328         .owner          = THIS_MODULE,                                  \
329         .min_uV         = 800000,                                       \
330         .uV_step        = 25000,                                        \
331         .ramp_delay     = MAX77802_RAMP_DELAY,                          \
332         .n_voltages     = 1 << 6,                                       \
333         .vsel_reg       = MAX77802_REG_LDO1CTRL1 + num - 1,             \
334         .vsel_mask      = MAX77802_VSEL_MASK,                           \
335         .enable_reg     = MAX77802_REG_LDO1CTRL1 + num - 1,             \
336         .enable_mask    = MAX77802_OPMODE_MASK << MAX77802_OPMODE_SHIFT_LDO, \
337         .of_map_mode    = max77802_map_mode,                            \
338 }
339
340 /* BUCKs 1, 6 */
341 #define regulator_77802_desc_16_buck(num)       {               \
342         .name           = "BUCK"#num,                                   \
343         .of_match       = of_match_ptr("BUCK"#num),                     \
344         .regulators_node        = of_match_ptr("regulators"),           \
345         .id             = MAX77802_BUCK##num,                           \
346         .supply_name    = "inb"#num,                                    \
347         .ops            = &max77802_buck_16_dvs_ops,                    \
348         .type           = REGULATOR_VOLTAGE,                            \
349         .owner          = THIS_MODULE,                                  \
350         .min_uV         = 612500,                                       \
351         .uV_step        = 6250,                                         \
352         .ramp_delay     = MAX77802_RAMP_DELAY,                          \
353         .n_voltages     = 1 << 8,                                       \
354         .vsel_reg       = MAX77802_REG_BUCK ## num ## DVS1,             \
355         .vsel_mask      = MAX77802_DVS_VSEL_MASK,                       \
356         .enable_reg     = MAX77802_REG_BUCK ## num ## CTRL,             \
357         .enable_mask    = MAX77802_OPMODE_MASK,                         \
358         .ramp_reg       = MAX77802_REG_BUCK ## num ## CTRL,             \
359         .ramp_mask      = MAX77802_RAMP_RATE_MASK_4BIT,                 \
360         .ramp_delay_table = max77802_buck16_ramp_table,                 \
361         .n_ramp_values  = ARRAY_SIZE(max77802_buck16_ramp_table),       \
362         .of_map_mode    = max77802_map_mode,                            \
363 }
364
365 /* BUCKS 2-4 */
366 #define regulator_77802_desc_234_buck(num)      {               \
367         .name           = "BUCK"#num,                                   \
368         .of_match       = of_match_ptr("BUCK"#num),                     \
369         .regulators_node        = of_match_ptr("regulators"),           \
370         .id             = MAX77802_BUCK##num,                           \
371         .supply_name    = "inb"#num,                                    \
372         .ops            = &max77802_buck_234_ops,                       \
373         .type           = REGULATOR_VOLTAGE,                            \
374         .owner          = THIS_MODULE,                                  \
375         .min_uV         = 600000,                                       \
376         .uV_step        = 6250,                                         \
377         .ramp_delay     = MAX77802_RAMP_DELAY,                          \
378         .n_voltages     = 0x91,                                         \
379         .vsel_reg       = MAX77802_REG_BUCK ## num ## DVS1,             \
380         .vsel_mask      = MAX77802_DVS_VSEL_MASK,                       \
381         .enable_reg     = MAX77802_REG_BUCK ## num ## CTRL1,            \
382         .enable_mask    = MAX77802_OPMODE_MASK <<                       \
383                                 MAX77802_OPMODE_BUCK234_SHIFT,          \
384         .ramp_reg       = MAX77802_REG_BUCK ## num ## CTRL1,            \
385         .ramp_mask      = MAX77802_RAMP_RATE_MASK_2BIT,                 \
386         .ramp_delay_table = max77802_buck234_ramp_table,                \
387         .n_ramp_values  = ARRAY_SIZE(max77802_buck234_ramp_table),      \
388         .of_map_mode    = max77802_map_mode,                            \
389 }
390
391 /* BUCK 5 */
392 #define regulator_77802_desc_buck5(num)         {               \
393         .name           = "BUCK"#num,                                   \
394         .of_match       = of_match_ptr("BUCK"#num),                     \
395         .regulators_node        = of_match_ptr("regulators"),           \
396         .id             = MAX77802_BUCK##num,                           \
397         .supply_name    = "inb"#num,                                    \
398         .ops            = &max77802_buck_dvs_ops,                       \
399         .type           = REGULATOR_VOLTAGE,                            \
400         .owner          = THIS_MODULE,                                  \
401         .min_uV         = 750000,                                       \
402         .uV_step        = 50000,                                        \
403         .ramp_delay     = MAX77802_RAMP_DELAY,                          \
404         .n_voltages     = 1 << 6,                                       \
405         .vsel_reg       = MAX77802_REG_BUCK5OUT,                        \
406         .vsel_mask      = MAX77802_VSEL_MASK,                           \
407         .enable_reg     = MAX77802_REG_BUCK5CTRL,                       \
408         .enable_mask    = MAX77802_OPMODE_MASK,                         \
409         .of_map_mode    = max77802_map_mode,                            \
410 }
411
412 /* BUCKs 7-10 */
413 #define regulator_77802_desc_buck7_10(num)      {               \
414         .name           = "BUCK"#num,                                   \
415         .of_match       = of_match_ptr("BUCK"#num),                     \
416         .regulators_node        = of_match_ptr("regulators"),           \
417         .id             = MAX77802_BUCK##num,                           \
418         .supply_name    = "inb"#num,                                    \
419         .ops            = &max77802_buck_dvs_ops,                       \
420         .type           = REGULATOR_VOLTAGE,                            \
421         .owner          = THIS_MODULE,                                  \
422         .min_uV         = 750000,                                       \
423         .uV_step        = 50000,                                        \
424         .ramp_delay     = MAX77802_RAMP_DELAY,                          \
425         .n_voltages     = 1 << 6,                                       \
426         .vsel_reg       = MAX77802_REG_BUCK7OUT + (num - 7) * 3,        \
427         .vsel_mask      = MAX77802_VSEL_MASK,                           \
428         .enable_reg     = MAX77802_REG_BUCK7CTRL + (num - 7) * 3,       \
429         .enable_mask    = MAX77802_OPMODE_MASK,                         \
430         .of_map_mode    = max77802_map_mode,                            \
431 }
432
433 static const struct regulator_desc regulators[] = {
434         regulator_77802_desc_16_buck(1),
435         regulator_77802_desc_234_buck(2),
436         regulator_77802_desc_234_buck(3),
437         regulator_77802_desc_234_buck(4),
438         regulator_77802_desc_buck5(5),
439         regulator_77802_desc_16_buck(6),
440         regulator_77802_desc_buck7_10(7),
441         regulator_77802_desc_buck7_10(8),
442         regulator_77802_desc_buck7_10(9),
443         regulator_77802_desc_buck7_10(10),
444         regulator_77802_desc_n_ldo(1, 10, 2),
445         regulator_77802_desc_n_ldo(2, 10, 1),
446         regulator_77802_desc_p_ldo(3, 3, 2),
447         regulator_77802_desc_p_ldo(4, 6, 1),
448         regulator_77802_desc_p_ldo(5, 3, 1),
449         regulator_77802_desc_p_ldo(6, 3, 1),
450         regulator_77802_desc_p_ldo(7, 3, 1),
451         regulator_77802_desc_n_ldo(8, 1, 1),
452         regulator_77802_desc_p_ldo(9, 5, 1),
453         regulator_77802_desc_p_ldo(10, 4, 1),
454         regulator_77802_desc_p_ldo(11, 4, 1),
455         regulator_77802_desc_p_ldo(12, 9, 1),
456         regulator_77802_desc_p_ldo(13, 4, 1),
457         regulator_77802_desc_p_ldo(14, 4, 1),
458         regulator_77802_desc_n_ldo(15, 1, 1),
459         regulator_77802_desc_n_ldo(17, 2, 1),
460         regulator_77802_desc_p_ldo(18, 7, 1),
461         regulator_77802_desc_p_ldo(19, 5, 1),
462         regulator_77802_desc_p_ldo(20, 7, 2),
463         regulator_77802_desc_p_ldo(21, 6, 2),
464         regulator_77802_desc_p_ldo(23, 9, 1),
465         regulator_77802_desc_p_ldo(24, 6, 1),
466         regulator_77802_desc_p_ldo(25, 9, 1),
467         regulator_77802_desc_p_ldo(26, 9, 1),
468         regulator_77802_desc_n_ldo(27, 2, 1),
469         regulator_77802_desc_p_ldo(28, 7, 1),
470         regulator_77802_desc_p_ldo(29, 7, 1),
471         regulator_77802_desc_n_ldo(30, 2, 1),
472         regulator_77802_desc_p_ldo(32, 9, 1),
473         regulator_77802_desc_p_ldo(33, 6, 1),
474         regulator_77802_desc_p_ldo(34, 9, 1),
475         regulator_77802_desc_n_ldo(35, 2, 1),
476 };
477
478 static int max77802_pmic_probe(struct platform_device *pdev)
479 {
480         struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
481         struct max77802_regulator_prv *max77802;
482         int i, val;
483         struct regulator_config config = { };
484
485         max77802 = devm_kzalloc(&pdev->dev,
486                                 sizeof(struct max77802_regulator_prv),
487                                 GFP_KERNEL);
488         if (!max77802)
489                 return -ENOMEM;
490
491         config.dev = iodev->dev;
492         config.regmap = iodev->regmap;
493         config.driver_data = max77802;
494         platform_set_drvdata(pdev, max77802);
495
496         for (i = 0; i < MAX77802_REG_MAX; i++) {
497                 struct regulator_dev *rdev;
498                 int id = regulators[i].id;
499                 int shift = max77802_get_opmode_shift(id);
500                 int ret;
501
502                 ret = regmap_read(iodev->regmap, regulators[i].enable_reg, &val);
503                 if (ret < 0) {
504                         dev_warn(&pdev->dev,
505                                 "cannot read current mode for %d\n", i);
506                         val = MAX77802_OPMODE_NORMAL;
507                 } else {
508                         val = val >> shift & MAX77802_OPMODE_MASK;
509                 }
510
511                 /*
512                  * If the regulator is disabled and the system warm rebooted,
513                  * the hardware reports OFF as the regulator operating mode.
514                  * Default to operating mode NORMAL in that case.
515                  */
516                 if (val == MAX77802_STATUS_OFF)
517                         max77802->opmode[id] = MAX77802_OPMODE_NORMAL;
518                 else
519                         max77802->opmode[id] = val;
520
521                 rdev = devm_regulator_register(&pdev->dev,
522                                                &regulators[i], &config);
523                 if (IS_ERR(rdev)) {
524                         ret = PTR_ERR(rdev);
525                         dev_err(&pdev->dev,
526                                 "regulator init failed for %d: %d\n", i, ret);
527                         return ret;
528                 }
529         }
530
531         return 0;
532 }
533
534 static const struct platform_device_id max77802_pmic_id[] = {
535         {"max77802-pmic", 0},
536         { },
537 };
538 MODULE_DEVICE_TABLE(platform, max77802_pmic_id);
539
540 static struct platform_driver max77802_pmic_driver = {
541         .driver = {
542                 .name = "max77802-pmic",
543         },
544         .probe = max77802_pmic_probe,
545         .id_table = max77802_pmic_id,
546 };
547
548 module_platform_driver(max77802_pmic_driver);
549
550 MODULE_DESCRIPTION("MAXIM 77802 Regulator Driver");
551 MODULE_AUTHOR("Simon Glass <sjg@chromium.org>");
552 MODULE_LICENSE("GPL");