aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>2014-04-14 05:17:20 -0400
committerLee Jones <lee.jones@linaro.org>2014-04-23 09:09:45 -0400
commit8a82b408acad29161c43072727151d373e68116a (patch)
tree8a60ebe3f77eb9b59ccd31f0a87f17b2f5a190b4
parent4706a5253bcc502a5889feb98392ea7b15dd936e (diff)
regulator: max14577: Add support for MAX77836 regulators
Add support for MAX77836 chipset and its additional two LDO regulators. These LDO regulators are controlled by the PMIC block with additional regmap (different I2C slave address). The MAX77836 charger and safeout regulators are almost identical to MAX14577. The registers layout is the same, except values for charger's current. The patch adds simple mapping between device type and supported current by the charger regulator. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Reviewed-by: Mark Brown <broonie@linaro.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/regulator/Kconfig7
-rw-r--r--drivers/regulator/max14577.c277
-rw-r--r--include/linux/mfd/max14577-private.h32
-rw-r--r--include/linux/mfd/max14577.h12
4 files changed, 289 insertions, 39 deletions
diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
index 903eb37f047a..f0cc9e6dac3a 100644
--- a/drivers/regulator/Kconfig
+++ b/drivers/regulator/Kconfig
@@ -266,11 +266,12 @@ config REGULATOR_LP8788
266 This driver supports LP8788 voltage regulator chip. 266 This driver supports LP8788 voltage regulator chip.
267 267
268config REGULATOR_MAX14577 268config REGULATOR_MAX14577
269 tristate "Maxim 14577 regulator" 269 tristate "Maxim 14577/77836 regulator"
270 depends on MFD_MAX14577 270 depends on MFD_MAX14577
271 help 271 help
272 This driver controls a Maxim 14577 regulator via I2C bus. 272 This driver controls a Maxim MAX14577/77836 regulator via I2C bus.
273 The regulators include safeout LDO and current regulator 'CHARGER'. 273 The MAX14577 regulators include safeout LDO and charger current
274 regulator. The MAX77836 has two additional LDOs.
274 275
275config REGULATOR_MAX1586 276config REGULATOR_MAX1586
276 tristate "Maxim 1586/1587 voltage regulator" 277 tristate "Maxim 1586/1587 voltage regulator"
diff --git a/drivers/regulator/max14577.c b/drivers/regulator/max14577.c
index ed60baaeceec..5d9c605cf534 100644
--- a/drivers/regulator/max14577.c
+++ b/drivers/regulator/max14577.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * max14577.c - Regulator driver for the Maxim 14577 2 * max14577.c - Regulator driver for the Maxim 14577/77836
3 * 3 *
4 * Copyright (C) 2013,2014 Samsung Electronics 4 * Copyright (C) 2013,2014 Samsung Electronics
5 * Krzysztof Kozlowski <k.kozlowski@samsung.com> 5 * Krzysztof Kozlowski <k.kozlowski@samsung.com>
@@ -22,6 +22,42 @@
22#include <linux/mfd/max14577-private.h> 22#include <linux/mfd/max14577-private.h>
23#include <linux/regulator/of_regulator.h> 23#include <linux/regulator/of_regulator.h>
24 24
25/*
26 * Valid limits of current for max14577 and max77836 chargers.
27 * They must correspond to MBCICHWRCL and MBCICHWRCH fields in CHGCTRL4
28 * register for given chipset.
29 */
30struct maxim_charger_current {
31 /* Minimal current, set in CHGCTRL4/MBCICHWRCL, uA */
32 unsigned int min;
33 /*
34 * Minimal current when high setting is active,
35 * set in CHGCTRL4/MBCICHWRCH, uA
36 */
37 unsigned int high_start;
38 /* Value of one step in high setting, uA */
39 unsigned int high_step;
40 /* Maximum current of high setting, uA */
41 unsigned int max;
42};
43
44/* Table of valid charger currents for different Maxim chipsets */
45static const struct maxim_charger_current maxim_charger_currents[] = {
46 [MAXIM_DEVICE_TYPE_UNKNOWN] = { 0, 0, 0, 0 },
47 [MAXIM_DEVICE_TYPE_MAX14577] = {
48 .min = MAX14577_REGULATOR_CURRENT_LIMIT_MIN,
49 .high_start = MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START,
50 .high_step = MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP,
51 .max = MAX14577_REGULATOR_CURRENT_LIMIT_MAX,
52 },
53 [MAXIM_DEVICE_TYPE_MAX77836] = {
54 .min = MAX77836_REGULATOR_CURRENT_LIMIT_MIN,
55 .high_start = MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START,
56 .high_step = MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP,
57 .max = MAX77836_REGULATOR_CURRENT_LIMIT_MAX,
58 },
59};
60
25static int max14577_reg_is_enabled(struct regulator_dev *rdev) 61static int max14577_reg_is_enabled(struct regulator_dev *rdev)
26{ 62{
27 int rid = rdev_get_id(rdev); 63 int rid = rdev_get_id(rdev);
@@ -47,6 +83,9 @@ static int max14577_reg_get_current_limit(struct regulator_dev *rdev)
47{ 83{
48 u8 reg_data; 84 u8 reg_data;
49 struct regmap *rmap = rdev->regmap; 85 struct regmap *rmap = rdev->regmap;
86 struct max14577 *max14577 = rdev_get_drvdata(rdev);
87 const struct maxim_charger_current *limits =
88 &maxim_charger_currents[max14577->dev_type];
50 89
51 if (rdev_get_id(rdev) != MAX14577_CHARGER) 90 if (rdev_get_id(rdev) != MAX14577_CHARGER)
52 return -EINVAL; 91 return -EINVAL;
@@ -54,12 +93,11 @@ static int max14577_reg_get_current_limit(struct regulator_dev *rdev)
54 max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL4, &reg_data); 93 max14577_read_reg(rmap, MAX14577_CHG_REG_CHG_CTRL4, &reg_data);
55 94
56 if ((reg_data & CHGCTRL4_MBCICHWRCL_MASK) == 0) 95 if ((reg_data & CHGCTRL4_MBCICHWRCL_MASK) == 0)
57 return MAX14577_REGULATOR_CURRENT_LIMIT_MIN; 96 return limits->min;
58 97
59 reg_data = ((reg_data & CHGCTRL4_MBCICHWRCH_MASK) >> 98 reg_data = ((reg_data & CHGCTRL4_MBCICHWRCH_MASK) >>
60 CHGCTRL4_MBCICHWRCH_SHIFT); 99 CHGCTRL4_MBCICHWRCH_SHIFT);
61 return MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START + 100 return limits->high_start + reg_data * limits->high_step;
62 reg_data * MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP;
63} 101}
64 102
65static int max14577_reg_set_current_limit(struct regulator_dev *rdev, 103static int max14577_reg_set_current_limit(struct regulator_dev *rdev,
@@ -67,33 +105,39 @@ static int max14577_reg_set_current_limit(struct regulator_dev *rdev,
67{ 105{
68 int i, current_bits = 0xf; 106 int i, current_bits = 0xf;
69 u8 reg_data; 107 u8 reg_data;
108 struct max14577 *max14577 = rdev_get_drvdata(rdev);
109 const struct maxim_charger_current *limits =
110 &maxim_charger_currents[max14577->dev_type];
70 111
71 if (rdev_get_id(rdev) != MAX14577_CHARGER) 112 if (rdev_get_id(rdev) != MAX14577_CHARGER)
72 return -EINVAL; 113 return -EINVAL;
73 114
74 if (min_uA > MAX14577_REGULATOR_CURRENT_LIMIT_MAX || 115 if (min_uA > limits->max || max_uA < limits->min)
75 max_uA < MAX14577_REGULATOR_CURRENT_LIMIT_MIN)
76 return -EINVAL; 116 return -EINVAL;
77 117
78 if (max_uA < MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START) { 118 if (max_uA < limits->high_start) {
79 /* Less than 200 mA, so set 90mA (turn only Low Bit off) */ 119 /*
120 * Less than high_start,
121 * so set the minimal current (turn only Low Bit off)
122 */
80 u8 reg_data = 0x0 << CHGCTRL4_MBCICHWRCL_SHIFT; 123 u8 reg_data = 0x0 << CHGCTRL4_MBCICHWRCL_SHIFT;
81 return max14577_update_reg(rdev->regmap, 124 return max14577_update_reg(rdev->regmap,
82 MAX14577_CHG_REG_CHG_CTRL4, 125 MAX14577_CHG_REG_CHG_CTRL4,
83 CHGCTRL4_MBCICHWRCL_MASK, reg_data); 126 CHGCTRL4_MBCICHWRCL_MASK, reg_data);
84 } 127 }
85 128
86 /* max_uA is in range: <LIMIT_HIGH_START, inifinite>, so search for 129 /*
87 * valid current starting from LIMIT_MAX. */ 130 * max_uA is in range: <high_start, inifinite>, so search for
88 for (i = MAX14577_REGULATOR_CURRENT_LIMIT_MAX; 131 * valid current starting from maximum current.
89 i >= MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START; 132 */
90 i -= MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP) { 133 for (i = limits->max; i >= limits->high_start; i -= limits->high_step) {
91 if (i <= max_uA) 134 if (i <= max_uA)
92 break; 135 break;
93 current_bits--; 136 current_bits--;
94 } 137 }
95 BUG_ON(current_bits < 0); /* Cannot happen */ 138 BUG_ON(current_bits < 0); /* Cannot happen */
96 /* Turn Low Bit on (use range 200mA-950 mA) */ 139
140 /* Turn Low Bit on (use range high_start-max)... */
97 reg_data = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT; 141 reg_data = 0x1 << CHGCTRL4_MBCICHWRCL_SHIFT;
98 /* and set proper High Bits */ 142 /* and set proper High Bits */
99 reg_data |= current_bits << CHGCTRL4_MBCICHWRCH_SHIFT; 143 reg_data |= current_bits << CHGCTRL4_MBCICHWRCH_SHIFT;
@@ -118,7 +162,7 @@ static struct regulator_ops max14577_charger_ops = {
118 .set_current_limit = max14577_reg_set_current_limit, 162 .set_current_limit = max14577_reg_set_current_limit,
119}; 163};
120 164
121static const struct regulator_desc supported_regulators[] = { 165static const struct regulator_desc max14577_supported_regulators[] = {
122 [MAX14577_SAFEOUT] = { 166 [MAX14577_SAFEOUT] = {
123 .name = "SAFEOUT", 167 .name = "SAFEOUT",
124 .id = MAX14577_SAFEOUT, 168 .id = MAX14577_SAFEOUT,
@@ -141,16 +185,88 @@ static const struct regulator_desc supported_regulators[] = {
141 }, 185 },
142}; 186};
143 187
188static struct regulator_ops max77836_ldo_ops = {
189 .is_enabled = regulator_is_enabled_regmap,
190 .enable = regulator_enable_regmap,
191 .disable = regulator_disable_regmap,
192 .list_voltage = regulator_list_voltage_linear,
193 .map_voltage = regulator_map_voltage_linear,
194 .get_voltage_sel = regulator_get_voltage_sel_regmap,
195 .set_voltage_sel = regulator_set_voltage_sel_regmap,
196 /* TODO: add .set_suspend_mode */
197};
198
199static const struct regulator_desc max77836_supported_regulators[] = {
200 [MAX14577_SAFEOUT] = {
201 .name = "SAFEOUT",
202 .id = MAX14577_SAFEOUT,
203 .ops = &max14577_safeout_ops,
204 .type = REGULATOR_VOLTAGE,
205 .owner = THIS_MODULE,
206 .n_voltages = 1,
207 .min_uV = MAX14577_REGULATOR_SAFEOUT_VOLTAGE,
208 .enable_reg = MAX14577_REG_CONTROL2,
209 .enable_mask = CTRL2_SFOUTORD_MASK,
210 },
211 [MAX14577_CHARGER] = {
212 .name = "CHARGER",
213 .id = MAX14577_CHARGER,
214 .ops = &max14577_charger_ops,
215 .type = REGULATOR_CURRENT,
216 .owner = THIS_MODULE,
217 .enable_reg = MAX14577_CHG_REG_CHG_CTRL2,
218 .enable_mask = CHGCTRL2_MBCHOSTEN_MASK,
219 },
220 [MAX77836_LDO1] = {
221 .name = "LDO1",
222 .id = MAX77836_LDO1,
223 .ops = &max77836_ldo_ops,
224 .type = REGULATOR_VOLTAGE,
225 .owner = THIS_MODULE,
226 .n_voltages = MAX77836_REGULATOR_LDO_VOLTAGE_STEPS_NUM,
227 .min_uV = MAX77836_REGULATOR_LDO_VOLTAGE_MIN,
228 .uV_step = MAX77836_REGULATOR_LDO_VOLTAGE_STEP,
229 .enable_reg = MAX77836_LDO_REG_CNFG1_LDO1,
230 .enable_mask = MAX77836_CNFG1_LDO_PWRMD_MASK,
231 .vsel_reg = MAX77836_LDO_REG_CNFG1_LDO1,
232 .vsel_mask = MAX77836_CNFG1_LDO_TV_MASK,
233 },
234 [MAX77836_LDO2] = {
235 .name = "LDO2",
236 .id = MAX77836_LDO2,
237 .ops = &max77836_ldo_ops,
238 .type = REGULATOR_VOLTAGE,
239 .owner = THIS_MODULE,
240 .n_voltages = MAX77836_REGULATOR_LDO_VOLTAGE_STEPS_NUM,
241 .min_uV = MAX77836_REGULATOR_LDO_VOLTAGE_MIN,
242 .uV_step = MAX77836_REGULATOR_LDO_VOLTAGE_STEP,
243 .enable_reg = MAX77836_LDO_REG_CNFG1_LDO2,
244 .enable_mask = MAX77836_CNFG1_LDO_PWRMD_MASK,
245 .vsel_reg = MAX77836_LDO_REG_CNFG1_LDO2,
246 .vsel_mask = MAX77836_CNFG1_LDO_TV_MASK,
247 },
248};
249
144#ifdef CONFIG_OF 250#ifdef CONFIG_OF
145static struct of_regulator_match max14577_regulator_matches[] = { 251static struct of_regulator_match max14577_regulator_matches[] = {
146 { .name = "SAFEOUT", }, 252 { .name = "SAFEOUT", },
147 { .name = "CHARGER", }, 253 { .name = "CHARGER", },
148}; 254};
149 255
150static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev) 256static struct of_regulator_match max77836_regulator_matches[] = {
257 { .name = "SAFEOUT", },
258 { .name = "CHARGER", },
259 { .name = "LDO1", },
260 { .name = "LDO2", },
261};
262
263static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev,
264 enum maxim_device_type dev_type)
151{ 265{
152 int ret; 266 int ret;
153 struct device_node *np; 267 struct device_node *np;
268 struct of_regulator_match *regulator_matches;
269 unsigned int regulator_matches_size;
154 270
155 np = of_get_child_by_name(pdev->dev.parent->of_node, "regulators"); 271 np = of_get_child_by_name(pdev->dev.parent->of_node, "regulators");
156 if (!np) { 272 if (!np) {
@@ -158,8 +274,19 @@ static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev)
158 return -EINVAL; 274 return -EINVAL;
159 } 275 }
160 276
161 ret = of_regulator_match(&pdev->dev, np, max14577_regulator_matches, 277 switch (dev_type) {
162 MAX14577_REG_MAX); 278 case MAXIM_DEVICE_TYPE_MAX77836:
279 regulator_matches = max77836_regulator_matches;
280 regulator_matches_size = ARRAY_SIZE(max77836_regulator_matches);
281 break;
282 case MAXIM_DEVICE_TYPE_MAX14577:
283 default:
284 regulator_matches = max14577_regulator_matches;
285 regulator_matches_size = ARRAY_SIZE(max14577_regulator_matches);
286 }
287
288 ret = of_regulator_match(&pdev->dev, np, regulator_matches,
289 regulator_matches_size);
163 if (ret < 0) 290 if (ret < 0)
164 dev_err(&pdev->dev, "Error parsing regulator init data: %d\n", ret); 291 dev_err(&pdev->dev, "Error parsing regulator init data: %d\n", ret);
165 else 292 else
@@ -170,31 +297,74 @@ static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev)
170 return ret; 297 return ret;
171} 298}
172 299
173static inline struct regulator_init_data *match_init_data(int index) 300static inline struct regulator_init_data *match_init_data(int index,
301 enum maxim_device_type dev_type)
174{ 302{
175 return max14577_regulator_matches[index].init_data; 303 switch (dev_type) {
304 case MAXIM_DEVICE_TYPE_MAX77836:
305 return max77836_regulator_matches[index].init_data;
306
307 case MAXIM_DEVICE_TYPE_MAX14577:
308 default:
309 return max14577_regulator_matches[index].init_data;
310 }
176} 311}
177 312
178static inline struct device_node *match_of_node(int index) 313static inline struct device_node *match_of_node(int index,
314 enum maxim_device_type dev_type)
179{ 315{
180 return max14577_regulator_matches[index].of_node; 316 switch (dev_type) {
317 case MAXIM_DEVICE_TYPE_MAX77836:
318 return max77836_regulator_matches[index].of_node;
319
320 case MAXIM_DEVICE_TYPE_MAX14577:
321 default:
322 return max14577_regulator_matches[index].of_node;
323 }
181} 324}
182#else /* CONFIG_OF */ 325#else /* CONFIG_OF */
183static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev) 326static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev,
327 enum maxim_device_type dev_type)
184{ 328{
185 return 0; 329 return 0;
186} 330}
187static inline struct regulator_init_data *match_init_data(int index) 331static inline struct regulator_init_data *match_init_data(int index,
332 enum maxim_device_type dev_type)
188{ 333{
189 return NULL; 334 return NULL;
190} 335}
191 336
192static inline struct device_node *match_of_node(int index) 337static inline struct device_node *match_of_node(int index,
338 enum maxim_device_type dev_type)
193{ 339{
194 return NULL; 340 return NULL;
195} 341}
196#endif /* CONFIG_OF */ 342#endif /* CONFIG_OF */
197 343
344/**
345 * Registers for regulators of max77836 use different I2C slave addresses so
346 * different regmaps must be used for them.
347 *
348 * Returns proper regmap for accessing regulator passed by id.
349 */
350static struct regmap *max14577_get_regmap(struct max14577 *max14577,
351 int reg_id)
352{
353 switch (max14577->dev_type) {
354 case MAXIM_DEVICE_TYPE_MAX77836:
355 switch (reg_id) {
356 case MAX77836_SAFEOUT ... MAX77836_CHARGER:
357 return max14577->regmap;
358 default:
359 /* MAX77836_LDO1 ... MAX77836_LDO2 */
360 return max14577->regmap_pmic;
361 }
362
363 case MAXIM_DEVICE_TYPE_MAX14577:
364 default:
365 return max14577->regmap;
366 }
367}
198 368
199static int max14577_regulator_probe(struct platform_device *pdev) 369static int max14577_regulator_probe(struct platform_device *pdev)
200{ 370{
@@ -202,15 +372,29 @@ static int max14577_regulator_probe(struct platform_device *pdev)
202 struct max14577_platform_data *pdata = dev_get_platdata(max14577->dev); 372 struct max14577_platform_data *pdata = dev_get_platdata(max14577->dev);
203 int i, ret; 373 int i, ret;
204 struct regulator_config config = {}; 374 struct regulator_config config = {};
375 const struct regulator_desc *supported_regulators;
376 unsigned int supported_regulators_size;
377 enum maxim_device_type dev_type = max14577->dev_type;
205 378
206 ret = max14577_regulator_dt_parse_pdata(pdev); 379 ret = max14577_regulator_dt_parse_pdata(pdev, dev_type);
207 if (ret) 380 if (ret)
208 return ret; 381 return ret;
209 382
383 switch (dev_type) {
384 case MAXIM_DEVICE_TYPE_MAX77836:
385 supported_regulators = max77836_supported_regulators;
386 supported_regulators_size = ARRAY_SIZE(max77836_supported_regulators);
387 break;
388 case MAXIM_DEVICE_TYPE_MAX14577:
389 default:
390 supported_regulators = max14577_supported_regulators;
391 supported_regulators_size = ARRAY_SIZE(max14577_supported_regulators);
392 }
393
210 config.dev = &pdev->dev; 394 config.dev = &pdev->dev;
211 config.regmap = max14577->regmap; 395 config.driver_data = max14577;
212 396
213 for (i = 0; i < ARRAY_SIZE(supported_regulators); i++) { 397 for (i = 0; i < supported_regulators_size; i++) {
214 struct regulator_dev *regulator; 398 struct regulator_dev *regulator;
215 /* 399 /*
216 * Index of supported_regulators[] is also the id and must 400 * Index of supported_regulators[] is also the id and must
@@ -220,17 +404,19 @@ static int max14577_regulator_probe(struct platform_device *pdev)
220 config.init_data = pdata->regulators[i].initdata; 404 config.init_data = pdata->regulators[i].initdata;
221 config.of_node = pdata->regulators[i].of_node; 405 config.of_node = pdata->regulators[i].of_node;
222 } else { 406 } else {
223 config.init_data = match_init_data(i); 407 config.init_data = match_init_data(i, dev_type);
224 config.of_node = match_of_node(i); 408 config.of_node = match_of_node(i, dev_type);
225 } 409 }
410 config.regmap = max14577_get_regmap(max14577,
411 supported_regulators[i].id);
226 412
227 regulator = devm_regulator_register(&pdev->dev, 413 regulator = devm_regulator_register(&pdev->dev,
228 &supported_regulators[i], &config); 414 &supported_regulators[i], &config);
229 if (IS_ERR(regulator)) { 415 if (IS_ERR(regulator)) {
230 ret = PTR_ERR(regulator); 416 ret = PTR_ERR(regulator);
231 dev_err(&pdev->dev, 417 dev_err(&pdev->dev,
232 "Regulator init failed for ID %d with error: %d\n", 418 "Regulator init failed for %d/%s with error: %d\n",
233 i, ret); 419 i, supported_regulators[i].name, ret);
234 return ret; 420 return ret;
235 } 421 }
236 } 422 }
@@ -238,20 +424,41 @@ static int max14577_regulator_probe(struct platform_device *pdev)
238 return ret; 424 return ret;
239} 425}
240 426
427static const struct platform_device_id max14577_regulator_id[] = {
428 { "max14577-regulator", MAXIM_DEVICE_TYPE_MAX14577, },
429 { "max77836-regulator", MAXIM_DEVICE_TYPE_MAX77836, },
430 { }
431};
432MODULE_DEVICE_TABLE(platform, max14577_regulator_id);
433
241static struct platform_driver max14577_regulator_driver = { 434static struct platform_driver max14577_regulator_driver = {
242 .driver = { 435 .driver = {
243 .owner = THIS_MODULE, 436 .owner = THIS_MODULE,
244 .name = "max14577-regulator", 437 .name = "max14577-regulator",
245 }, 438 },
246 .probe = max14577_regulator_probe, 439 .probe = max14577_regulator_probe,
440 .id_table = max14577_regulator_id,
247}; 441};
248 442
249static int __init max14577_regulator_init(void) 443static int __init max14577_regulator_init(void)
250{ 444{
445 /* Check for valid values for charger */
251 BUILD_BUG_ON(MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START + 446 BUILD_BUG_ON(MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_START +
252 MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP * 0xf != 447 MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP * 0xf !=
253 MAX14577_REGULATOR_CURRENT_LIMIT_MAX); 448 MAX14577_REGULATOR_CURRENT_LIMIT_MAX);
254 BUILD_BUG_ON(ARRAY_SIZE(supported_regulators) != MAX14577_REG_MAX); 449 BUILD_BUG_ON(MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START +
450 MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP * 0xf !=
451 MAX77836_REGULATOR_CURRENT_LIMIT_MAX);
452 /* Valid charger current values must be provided for each chipset */
453 BUILD_BUG_ON(ARRAY_SIZE(maxim_charger_currents) != MAXIM_DEVICE_TYPE_NUM);
454
455 BUILD_BUG_ON(ARRAY_SIZE(max14577_supported_regulators) != MAX14577_REGULATOR_NUM);
456 BUILD_BUG_ON(ARRAY_SIZE(max77836_supported_regulators) != MAX77836_REGULATOR_NUM);
457
458 BUILD_BUG_ON(MAX77836_REGULATOR_LDO_VOLTAGE_MIN +
459 (MAX77836_REGULATOR_LDO_VOLTAGE_STEP *
460 (MAX77836_REGULATOR_LDO_VOLTAGE_STEPS_NUM - 1)) !=
461 MAX77836_REGULATOR_LDO_VOLTAGE_MAX);
255 462
256 return platform_driver_register(&max14577_regulator_driver); 463 return platform_driver_register(&max14577_regulator_driver);
257} 464}
@@ -264,6 +471,6 @@ static void __exit max14577_regulator_exit(void)
264module_exit(max14577_regulator_exit); 471module_exit(max14577_regulator_exit);
265 472
266MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@samsung.com>"); 473MODULE_AUTHOR("Krzysztof Kozlowski <k.kozlowski@samsung.com>");
267MODULE_DESCRIPTION("MAXIM 14577 regulator driver"); 474MODULE_DESCRIPTION("Maxim 14577/77836 regulator driver");
268MODULE_LICENSE("GPL"); 475MODULE_LICENSE("GPL");
269MODULE_ALIAS("platform:max14577-regulator"); 476MODULE_ALIAS("platform:max14577-regulator");
diff --git a/include/linux/mfd/max14577-private.h b/include/linux/mfd/max14577-private.h
index a557ae27d8a8..499253604026 100644
--- a/include/linux/mfd/max14577-private.h
+++ b/include/linux/mfd/max14577-private.h
@@ -261,9 +261,21 @@ enum max14577_charger_reg {
261#define MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP 50000 261#define MAX14577_REGULATOR_CURRENT_LIMIT_HIGH_STEP 50000
262#define MAX14577_REGULATOR_CURRENT_LIMIT_MAX 950000 262#define MAX14577_REGULATOR_CURRENT_LIMIT_MAX 950000
263 263
264/* MAX77836 regulator current limits (as in CHGCTRL4 register), uA */
265#define MAX77836_REGULATOR_CURRENT_LIMIT_MIN 45000
266#define MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_START 100000
267#define MAX77836_REGULATOR_CURRENT_LIMIT_HIGH_STEP 25000
268#define MAX77836_REGULATOR_CURRENT_LIMIT_MAX 475000
269
264/* MAX14577 regulator SFOUT LDO voltage, fixed, uV */ 270/* MAX14577 regulator SFOUT LDO voltage, fixed, uV */
265#define MAX14577_REGULATOR_SAFEOUT_VOLTAGE 4900000 271#define MAX14577_REGULATOR_SAFEOUT_VOLTAGE 4900000
266 272
273/* MAX77836 regulator LDOx voltage, uV */
274#define MAX77836_REGULATOR_LDO_VOLTAGE_MIN 800000
275#define MAX77836_REGULATOR_LDO_VOLTAGE_MAX 3950000
276#define MAX77836_REGULATOR_LDO_VOLTAGE_STEP 50000
277#define MAX77836_REGULATOR_LDO_VOLTAGE_STEPS_NUM 64
278
267/* Slave addr = 0x46: PMIC */ 279/* Slave addr = 0x46: PMIC */
268enum max77836_pmic_reg { 280enum max77836_pmic_reg {
269 MAX77836_PMIC_REG_PMIC_ID = 0x20, 281 MAX77836_PMIC_REG_PMIC_ID = 0x20,
@@ -298,6 +310,26 @@ enum max77836_pmic_reg {
298#define MAX77836_TOPSYS_INT_T120C_MASK BIT(MAX77836_TOPSYS_INT_T120C_SHIFT) 310#define MAX77836_TOPSYS_INT_T120C_MASK BIT(MAX77836_TOPSYS_INT_T120C_SHIFT)
299#define MAX77836_TOPSYS_INT_T140C_MASK BIT(MAX77836_TOPSYS_INT_T140C_SHIFT) 311#define MAX77836_TOPSYS_INT_T140C_MASK BIT(MAX77836_TOPSYS_INT_T140C_SHIFT)
300 312
313/* LDO1/LDO2 CONFIG1 register */
314#define MAX77836_CNFG1_LDO_PWRMD_SHIFT 6
315#define MAX77836_CNFG1_LDO_TV_SHIFT 0
316#define MAX77836_CNFG1_LDO_PWRMD_MASK (0x3 << MAX77836_CNFG1_LDO_PWRMD_SHIFT)
317#define MAX77836_CNFG1_LDO_TV_MASK (0x3f << MAX77836_CNFG1_LDO_TV_SHIFT)
318
319/* LDO1/LDO2 CONFIG2 register */
320#define MAX77836_CNFG2_LDO_OVCLMPEN_SHIFT 7
321#define MAX77836_CNFG2_LDO_ALPMEN_SHIFT 6
322#define MAX77836_CNFG2_LDO_COMP_SHIFT 4
323#define MAX77836_CNFG2_LDO_POK_SHIFT 3
324#define MAX77836_CNFG2_LDO_ADE_SHIFT 1
325#define MAX77836_CNFG2_LDO_SS_SHIFT 0
326#define MAX77836_CNFG2_LDO_OVCLMPEN_MASK BIT(MAX77836_CNFG2_LDO_OVCLMPEN_SHIFT)
327#define MAX77836_CNFG2_LDO_ALPMEN_MASK BIT(MAX77836_CNFG2_LDO_ALPMEN_SHIFT)
328#define MAX77836_CNFG2_LDO_COMP_MASK (0x3 << MAX77836_CNFG2_LDO_COMP_SHIFT)
329#define MAX77836_CNFG2_LDO_POK_MASK BIT(MAX77836_CNFG2_LDO_POK_SHIFT)
330#define MAX77836_CNFG2_LDO_ADE_MASK BIT(MAX77836_CNFG2_LDO_ADE_SHIFT)
331#define MAX77836_CNFG2_LDO_SS_MASK BIT(MAX77836_CNFG2_LDO_SS_SHIFT)
332
301/* Slave addr = 0x6C: Fuel-Gauge/Battery */ 333/* Slave addr = 0x6C: Fuel-Gauge/Battery */
302enum max77836_fg_reg { 334enum max77836_fg_reg {
303 MAX77836_FG_REG_VCELL_MSB = 0x02, 335 MAX77836_FG_REG_VCELL_MSB = 0x02,
diff --git a/include/linux/mfd/max14577.h b/include/linux/mfd/max14577.h
index 08b449159fd1..c83fbed1c7b6 100644
--- a/include/linux/mfd/max14577.h
+++ b/include/linux/mfd/max14577.h
@@ -35,7 +35,17 @@ enum max14577_regulators {
35 MAX14577_SAFEOUT = 0, 35 MAX14577_SAFEOUT = 0,
36 MAX14577_CHARGER, 36 MAX14577_CHARGER,
37 37
38 MAX14577_REG_MAX, 38 MAX14577_REGULATOR_NUM,
39};
40
41/* MAX77836 regulator IDs */
42enum max77836_regulators {
43 MAX77836_SAFEOUT = 0,
44 MAX77836_CHARGER,
45 MAX77836_LDO1,
46 MAX77836_LDO2,
47
48 MAX77836_REGULATOR_NUM,
39}; 49};
40 50
41struct max14577_regulator_platform_data { 51struct max14577_regulator_platform_data {