Blame view

drivers/regulator/max77686-regulator.c 16.8 KB
133d4016f   Jonghwa Lee   regulator: MAX776...
1
2
3
4
  /*
   * max77686.c - Regulator driver for the Maxim 77686
   *
   * Copyright (C) 2012 Samsung Electronics
e4e8ccccf   Fabio Estevam   regulator: max776...
5
   * Chiwoong Byun <woong.byun@samsung.com>
133d4016f   Jonghwa Lee   regulator: MAX776...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
   * Jonghwa Lee <jonghwa3.lee@samsung.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   *
   * This driver is based on max8997.c
   */
  
  #include <linux/kernel.h>
  #include <linux/bug.h>
133d4016f   Jonghwa Lee   regulator: MAX776...
27
28
  #include <linux/err.h>
  #include <linux/gpio.h>
3307e9025   Krzysztof Kozlowski   regulator: max776...
29
  #include <linux/of_gpio.h>
133d4016f   Jonghwa Lee   regulator: MAX776...
30
31
32
33
  #include <linux/slab.h>
  #include <linux/platform_device.h>
  #include <linux/regulator/driver.h>
  #include <linux/regulator/machine.h>
4706fcab9   Yadwinder Singh Brar   regulator: max776...
34
  #include <linux/regulator/of_regulator.h>
133d4016f   Jonghwa Lee   regulator: MAX776...
35
36
37
38
39
40
41
42
43
  #include <linux/mfd/max77686.h>
  #include <linux/mfd/max77686-private.h>
  
  #define MAX77686_LDO_MINUV	800000
  #define MAX77686_LDO_UVSTEP	50000
  #define MAX77686_LDO_LOW_MINUV	800000
  #define MAX77686_LDO_LOW_UVSTEP	25000
  #define MAX77686_BUCK_MINUV	750000
  #define MAX77686_BUCK_UVSTEP	50000
a9597305d   Krzysztof Kozlowski   regulator: max776...
44
45
  #define MAX77686_BUCK_ENABLE_TIME	40		/* us */
  #define MAX77686_DVS_ENABLE_TIME	22		/* us */
852abad23   Yadwinder Singh Brar   regulator: max776...
46
47
  #define MAX77686_RAMP_DELAY	100000			/* uV/us */
  #define MAX77686_DVS_RAMP_DELAY	27500			/* uV/us */
133d4016f   Jonghwa Lee   regulator: MAX776...
48
49
  #define MAX77686_DVS_MINUV	600000
  #define MAX77686_DVS_UVSTEP	12500
7636f19c2   Krzysztof Kozlowski   regulator: max776...
50
  /*
3307e9025   Krzysztof Kozlowski   regulator: max776...
51
52
53
54
55
   * Value for configuring buck[89] and LDO{20,21,22} as GPIO control.
   * It is the same as 'off' for other regulators.
   */
  #define MAX77686_GPIO_CONTROL		0x0
  /*
7636f19c2   Krzysztof Kozlowski   regulator: max776...
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
   * Values used for configuring LDOs and bucks.
   * Forcing low power mode: LDO1, 3-5, 9, 13, 17-26
   */
  #define MAX77686_LDO_LOWPOWER		0x1
  /*
   * On/off controlled by PWRREQ:
   *  - LDO2, 6-8, 10-12, 14-16
   *  - buck[1234]
   */
  #define MAX77686_OFF_PWRREQ		0x1
  /* Low power mode controlled by PWRREQ: All LDOs */
  #define MAX77686_LDO_LOWPOWER_PWRREQ	0x2
  /* Forcing low power mode: buck[234] */
  #define MAX77686_BUCK_LOWPOWER		0x2
  #define MAX77686_NORMAL			0x3
133d4016f   Jonghwa Lee   regulator: MAX776...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  #define MAX77686_OPMODE_SHIFT	6
  #define MAX77686_OPMODE_BUCK234_SHIFT	4
  #define MAX77686_OPMODE_MASK	0x3
  
  #define MAX77686_VSEL_MASK	0x3F
  #define MAX77686_DVS_VSEL_MASK	0xFF
  
  #define MAX77686_RAMP_RATE_MASK	0xC0
  
  #define MAX77686_REGULATORS	MAX77686_REG_MAX
  #define MAX77686_LDOS		26
  
  enum max77686_ramp_rate {
  	RAMP_RATE_13P75MV,
  	RAMP_RATE_27P5MV,
  	RAMP_RATE_55MV,
  	RAMP_RATE_NO_CTRL,	/* 100mV/us */
  };
  
  struct max77686_data {
c53403a37   Joe Perches   regulator: max776...
91
  	DECLARE_BITMAP(gpio_enabled, MAX77686_REGULATORS);
3307e9025   Krzysztof Kozlowski   regulator: max776...
92

eca29da9a   Krzysztof Kozlowski   regulator: max776...
93
  	/* Array indexed by regulator id */
6d2c896b7   Yadwinder Singh Brar   regulator: max776...
94
  	unsigned int opmode[MAX77686_REGULATORS];
133d4016f   Jonghwa Lee   regulator: MAX776...
95
  };
68c5d1868   Krzysztof Kozlowski   regulator: max776...
96
97
98
99
100
101
102
103
104
105
106
107
108
  static unsigned int max77686_get_opmode_shift(int id)
  {
  	switch (id) {
  	case MAX77686_BUCK1:
  	case MAX77686_BUCK5 ... MAX77686_BUCK9:
  		return 0;
  	case MAX77686_BUCK2 ... MAX77686_BUCK4:
  		return MAX77686_OPMODE_BUCK234_SHIFT;
  	default:
  		/* all LDOs */
  		return MAX77686_OPMODE_SHIFT;
  	}
  }
3307e9025   Krzysztof Kozlowski   regulator: max776...
109
110
111
112
113
114
115
116
117
118
119
120
121
  /*
   * When regulator is configured for GPIO control then it
   * replaces "normal" mode. Any change from low power mode to normal
   * should actually change to GPIO control.
   * Map normal mode to proper value for such regulators.
   */
  static unsigned int max77686_map_normal_mode(struct max77686_data *max77686,
  					     int id)
  {
  	switch (id) {
  	case MAX77686_BUCK8:
  	case MAX77686_BUCK9:
  	case MAX77686_LDO20 ... MAX77686_LDO22:
c53403a37   Joe Perches   regulator: max776...
122
  		if (test_bit(id, max77686->gpio_enabled))
3307e9025   Krzysztof Kozlowski   regulator: max776...
123
124
125
126
127
  			return MAX77686_GPIO_CONTROL;
  	}
  
  	return MAX77686_NORMAL;
  }
78ce61286   Krzysztof Kozlowski   regulator: max776...
128
129
  /* Some BUCKs and LDOs supports Normal[ON/OFF] mode during suspend */
  static int max77686_set_suspend_disable(struct regulator_dev *rdev)
15282ba9e   Yadwinder Singh Brar   regulator: max776...
130
  {
68c5d1868   Krzysztof Kozlowski   regulator: max776...
131
  	unsigned int val, shift;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
132
  	struct max77686_data *max77686 = rdev_get_drvdata(rdev);
3ecf198ea   Axel Lin   regulator: max776...
133
  	int ret, id = rdev_get_id(rdev);
15282ba9e   Yadwinder Singh Brar   regulator: max776...
134

68c5d1868   Krzysztof Kozlowski   regulator: max776...
135
136
  	shift = max77686_get_opmode_shift(id);
  	val = MAX77686_OFF_PWRREQ;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
137

3ecf198ea   Axel Lin   regulator: max776...
138
  	ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
68c5d1868   Krzysztof Kozlowski   regulator: max776...
139
  				 rdev->desc->enable_mask, val << shift);
3ecf198ea   Axel Lin   regulator: max776...
140
141
  	if (ret)
  		return ret;
40e72149a   Thiago Farina   regulator: max776...
142
  	max77686->opmode[id] = val;
3ecf198ea   Axel Lin   regulator: max776...
143
  	return 0;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
144
145
146
147
148
149
150
151
  }
  
  /* Some LDOs supports [LPM/Normal]ON mode during suspend state */
  static int max77686_set_suspend_mode(struct regulator_dev *rdev,
  				     unsigned int mode)
  {
  	struct max77686_data *max77686 = rdev_get_drvdata(rdev);
  	unsigned int val;
3ecf198ea   Axel Lin   regulator: max776...
152
  	int ret, id = rdev_get_id(rdev);
15282ba9e   Yadwinder Singh Brar   regulator: max776...
153
154
  
  	/* BUCK[5-9] doesn't support this feature */
40e72149a   Thiago Farina   regulator: max776...
155
  	if (id >= MAX77686_BUCK5)
15282ba9e   Yadwinder Singh Brar   regulator: max776...
156
157
158
159
  		return 0;
  
  	switch (mode) {
  	case REGULATOR_MODE_IDLE:			/* ON in LP Mode */
68c5d1868   Krzysztof Kozlowski   regulator: max776...
160
  		val = MAX77686_LDO_LOWPOWER_PWRREQ;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
161
162
  		break;
  	case REGULATOR_MODE_NORMAL:			/* ON in Normal Mode */
3307e9025   Krzysztof Kozlowski   regulator: max776...
163
  		val = max77686_map_normal_mode(max77686, id);
15282ba9e   Yadwinder Singh Brar   regulator: max776...
164
165
166
167
168
169
170
  		break;
  	default:
  		pr_warn("%s: regulator_suspend_mode : 0x%x not supported
  ",
  			rdev->desc->name, mode);
  		return -EINVAL;
  	}
3ecf198ea   Axel Lin   regulator: max776...
171
  	ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
68c5d1868   Krzysztof Kozlowski   regulator: max776...
172
173
  				  rdev->desc->enable_mask,
  				  val << MAX77686_OPMODE_SHIFT);
3ecf198ea   Axel Lin   regulator: max776...
174
175
  	if (ret)
  		return ret;
40e72149a   Thiago Farina   regulator: max776...
176
  	max77686->opmode[id] = val;
3ecf198ea   Axel Lin   regulator: max776...
177
  	return 0;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
178
179
180
181
182
183
184
185
  }
  
  /* Some LDOs supports LPM-ON/OFF/Normal-ON mode during suspend state */
  static int max77686_ldo_set_suspend_mode(struct regulator_dev *rdev,
  				     unsigned int mode)
  {
  	unsigned int val;
  	struct max77686_data *max77686 = rdev_get_drvdata(rdev);
3307e9025   Krzysztof Kozlowski   regulator: max776...
186
  	int ret, id = rdev_get_id(rdev);
15282ba9e   Yadwinder Singh Brar   regulator: max776...
187
188
189
  
  	switch (mode) {
  	case REGULATOR_MODE_STANDBY:			/* switch off */
68c5d1868   Krzysztof Kozlowski   regulator: max776...
190
  		val = MAX77686_OFF_PWRREQ;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
191
192
  		break;
  	case REGULATOR_MODE_IDLE:			/* ON in LP Mode */
68c5d1868   Krzysztof Kozlowski   regulator: max776...
193
  		val = MAX77686_LDO_LOWPOWER_PWRREQ;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
194
195
  		break;
  	case REGULATOR_MODE_NORMAL:			/* ON in Normal Mode */
3307e9025   Krzysztof Kozlowski   regulator: max776...
196
  		val = max77686_map_normal_mode(max77686, id);
15282ba9e   Yadwinder Singh Brar   regulator: max776...
197
198
199
200
201
202
203
  		break;
  	default:
  		pr_warn("%s: regulator_suspend_mode : 0x%x not supported
  ",
  			rdev->desc->name, mode);
  		return -EINVAL;
  	}
3ecf198ea   Axel Lin   regulator: max776...
204
  	ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
68c5d1868   Krzysztof Kozlowski   regulator: max776...
205
206
  				 rdev->desc->enable_mask,
  				 val << MAX77686_OPMODE_SHIFT);
3ecf198ea   Axel Lin   regulator: max776...
207
208
  	if (ret)
  		return ret;
3307e9025   Krzysztof Kozlowski   regulator: max776...
209
  	max77686->opmode[id] = val;
3ecf198ea   Axel Lin   regulator: max776...
210
  	return 0;
15282ba9e   Yadwinder Singh Brar   regulator: max776...
211
  }
38d34035e   Yadwinder Singh Brar   regulator: max776...
212
  static int max77686_enable(struct regulator_dev *rdev)
6d2c896b7   Yadwinder Singh Brar   regulator: max776...
213
214
  {
  	struct max77686_data *max77686 = rdev_get_drvdata(rdev);
68c5d1868   Krzysztof Kozlowski   regulator: max776...
215
216
217
218
  	unsigned int shift;
  	int id = rdev_get_id(rdev);
  
  	shift = max77686_get_opmode_shift(id);
6d2c896b7   Yadwinder Singh Brar   regulator: max776...
219

78ce61286   Krzysztof Kozlowski   regulator: max776...
220
  	if (max77686->opmode[id] == MAX77686_OFF_PWRREQ)
3307e9025   Krzysztof Kozlowski   regulator: max776...
221
  		max77686->opmode[id] = max77686_map_normal_mode(max77686, id);
78ce61286   Krzysztof Kozlowski   regulator: max776...
222

6d2c896b7   Yadwinder Singh Brar   regulator: max776...
223
224
  	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  				  rdev->desc->enable_mask,
68c5d1868   Krzysztof Kozlowski   regulator: max776...
225
  				  max77686->opmode[id] << shift);
6d2c896b7   Yadwinder Singh Brar   regulator: max776...
226
  }
f503071b0   Yadwinder Singh Brar   regulator: max776...
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
  static int max77686_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
  {
  	unsigned int ramp_value = RAMP_RATE_NO_CTRL;
  
  	switch (ramp_delay) {
  	case 1 ... 13750:
  		ramp_value = RAMP_RATE_13P75MV;
  		break;
  	case 13751 ... 27500:
  		ramp_value = RAMP_RATE_27P5MV;
  		break;
  	case 27501 ... 55000:
  		ramp_value = RAMP_RATE_55MV;
  		break;
  	case 55001 ... 100000:
  		break;
  	default:
  		pr_warn("%s: ramp_delay: %d not supported, setting 100000
  ",
  			rdev->desc->name, ramp_delay);
  	}
  
  	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  				  MAX77686_RAMP_RATE_MASK, ramp_value << 6);
  }
3307e9025   Krzysztof Kozlowski   regulator: max776...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  static int max77686_of_parse_cb(struct device_node *np,
  		const struct regulator_desc *desc,
  		struct regulator_config *config)
  {
  	struct max77686_data *max77686 = config->driver_data;
  
  	switch (desc->id) {
  	case MAX77686_BUCK8:
  	case MAX77686_BUCK9:
  	case MAX77686_LDO20 ... MAX77686_LDO22:
  		config->ena_gpio = of_get_named_gpio(np,
  					"maxim,ena-gpios", 0);
  		config->ena_gpio_flags = GPIOF_OUT_INIT_HIGH;
  		config->ena_gpio_initialized = true;
  		break;
  	default:
  		return 0;
  	}
  
  	if (gpio_is_valid(config->ena_gpio)) {
c53403a37   Joe Perches   regulator: max776...
272
  		set_bit(desc->id, max77686->gpio_enabled);
3307e9025   Krzysztof Kozlowski   regulator: max776...
273
274
275
276
277
278
279
280
  
  		return regmap_update_bits(config->regmap, desc->enable_reg,
  					  desc->enable_mask,
  					  MAX77686_GPIO_CONTROL);
  	}
  
  	return 0;
  }
404826cb3   Bhumika Goyal   regulator: max776...
281
  static const struct regulator_ops max77686_ops = {
133d4016f   Jonghwa Lee   regulator: MAX776...
282
  	.list_voltage		= regulator_list_voltage_linear,
2e3f7f26e   Axel Lin   regulator: max776...
283
  	.map_voltage		= regulator_map_voltage_linear,
133d4016f   Jonghwa Lee   regulator: MAX776...
284
  	.is_enabled		= regulator_is_enabled_regmap,
6d2c896b7   Yadwinder Singh Brar   regulator: max776...
285
  	.enable			= max77686_enable,
133d4016f   Jonghwa Lee   regulator: MAX776...
286
287
288
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
852abad23   Yadwinder Singh Brar   regulator: max776...
289
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
15282ba9e   Yadwinder Singh Brar   regulator: max776...
290
291
  	.set_suspend_mode	= max77686_set_suspend_mode,
  };
404826cb3   Bhumika Goyal   regulator: max776...
292
  static const struct regulator_ops max77686_ldo_ops = {
15282ba9e   Yadwinder Singh Brar   regulator: max776...
293
294
295
296
  	.list_voltage		= regulator_list_voltage_linear,
  	.map_voltage		= regulator_map_voltage_linear,
  	.is_enabled		= regulator_is_enabled_regmap,
  	.enable			= max77686_enable,
133d4016f   Jonghwa Lee   regulator: MAX776...
297
298
299
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
852abad23   Yadwinder Singh Brar   regulator: max776...
300
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
15282ba9e   Yadwinder Singh Brar   regulator: max776...
301
  	.set_suspend_mode	= max77686_ldo_set_suspend_mode,
78ce61286   Krzysztof Kozlowski   regulator: max776...
302
  	.set_suspend_disable	= max77686_set_suspend_disable,
15282ba9e   Yadwinder Singh Brar   regulator: max776...
303
  };
404826cb3   Bhumika Goyal   regulator: max776...
304
  static const struct regulator_ops max77686_buck1_ops = {
15282ba9e   Yadwinder Singh Brar   regulator: max776...
305
306
307
308
309
310
311
312
  	.list_voltage		= regulator_list_voltage_linear,
  	.map_voltage		= regulator_map_voltage_linear,
  	.is_enabled		= regulator_is_enabled_regmap,
  	.enable			= max77686_enable,
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
78ce61286   Krzysztof Kozlowski   regulator: max776...
313
  	.set_suspend_disable	= max77686_set_suspend_disable,
133d4016f   Jonghwa Lee   regulator: MAX776...
314
  };
404826cb3   Bhumika Goyal   regulator: max776...
315
  static const struct regulator_ops max77686_buck_dvs_ops = {
133d4016f   Jonghwa Lee   regulator: MAX776...
316
  	.list_voltage		= regulator_list_voltage_linear,
2e3f7f26e   Axel Lin   regulator: max776...
317
  	.map_voltage		= regulator_map_voltage_linear,
133d4016f   Jonghwa Lee   regulator: MAX776...
318
  	.is_enabled		= regulator_is_enabled_regmap,
6d2c896b7   Yadwinder Singh Brar   regulator: max776...
319
  	.enable			= max77686_enable,
133d4016f   Jonghwa Lee   regulator: MAX776...
320
321
322
  	.disable		= regulator_disable_regmap,
  	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
  	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
852abad23   Yadwinder Singh Brar   regulator: max776...
323
  	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
f503071b0   Yadwinder Singh Brar   regulator: max776...
324
  	.set_ramp_delay		= max77686_set_ramp_delay,
78ce61286   Krzysztof Kozlowski   regulator: max776...
325
  	.set_suspend_disable	= max77686_set_suspend_disable,
133d4016f   Jonghwa Lee   regulator: MAX776...
326
327
328
329
  };
  
  #define regulator_desc_ldo(num)		{				\
  	.name		= "LDO"#num,					\
048039526   Krzysztof Kozlowski   regulator: max776...
330
331
  	.of_match	= of_match_ptr("LDO"#num),			\
  	.regulators_node	= of_match_ptr("voltage-regulators"),	\
3307e9025   Krzysztof Kozlowski   regulator: max776...
332
  	.of_parse_cb	= max77686_of_parse_cb,				\
133d4016f   Jonghwa Lee   regulator: MAX776...
333
334
335
336
337
338
  	.id		= MAX77686_LDO##num,				\
  	.ops		= &max77686_ops,				\
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.min_uV		= MAX77686_LDO_MINUV,				\
  	.uV_step	= MAX77686_LDO_UVSTEP,				\
852abad23   Yadwinder Singh Brar   regulator: max776...
339
  	.ramp_delay	= MAX77686_RAMP_DELAY,				\
133d4016f   Jonghwa Lee   regulator: MAX776...
340
341
342
343
344
345
346
  	.n_voltages	= MAX77686_VSEL_MASK + 1,			\
  	.vsel_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.vsel_mask	= MAX77686_VSEL_MASK,				\
  	.enable_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.enable_mask	= MAX77686_OPMODE_MASK				\
  			<< MAX77686_OPMODE_SHIFT,			\
  }
15282ba9e   Yadwinder Singh Brar   regulator: max776...
347
348
  #define regulator_desc_lpm_ldo(num)	{				\
  	.name		= "LDO"#num,					\
048039526   Krzysztof Kozlowski   regulator: max776...
349
350
  	.of_match	= of_match_ptr("LDO"#num),			\
  	.regulators_node	= of_match_ptr("voltage-regulators"),	\
15282ba9e   Yadwinder Singh Brar   regulator: max776...
351
352
353
354
355
356
357
358
359
360
361
362
363
364
  	.id		= MAX77686_LDO##num,				\
  	.ops		= &max77686_ldo_ops,				\
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.min_uV		= MAX77686_LDO_MINUV,				\
  	.uV_step	= MAX77686_LDO_UVSTEP,				\
  	.ramp_delay	= MAX77686_RAMP_DELAY,				\
  	.n_voltages	= MAX77686_VSEL_MASK + 1,			\
  	.vsel_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.vsel_mask	= MAX77686_VSEL_MASK,				\
  	.enable_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.enable_mask	= MAX77686_OPMODE_MASK				\
  			<< MAX77686_OPMODE_SHIFT,			\
  }
133d4016f   Jonghwa Lee   regulator: MAX776...
365
366
  #define regulator_desc_ldo_low(num)		{			\
  	.name		= "LDO"#num,					\
048039526   Krzysztof Kozlowski   regulator: max776...
367
368
  	.of_match	= of_match_ptr("LDO"#num),			\
  	.regulators_node	= of_match_ptr("voltage-regulators"),	\
133d4016f   Jonghwa Lee   regulator: MAX776...
369
  	.id		= MAX77686_LDO##num,				\
15282ba9e   Yadwinder Singh Brar   regulator: max776...
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
  	.ops		= &max77686_ldo_ops,				\
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.min_uV		= MAX77686_LDO_LOW_MINUV,			\
  	.uV_step	= MAX77686_LDO_LOW_UVSTEP,			\
  	.ramp_delay	= MAX77686_RAMP_DELAY,				\
  	.n_voltages	= MAX77686_VSEL_MASK + 1,			\
  	.vsel_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.vsel_mask	= MAX77686_VSEL_MASK,				\
  	.enable_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.enable_mask	= MAX77686_OPMODE_MASK				\
  			<< MAX77686_OPMODE_SHIFT,			\
  }
  #define regulator_desc_ldo1_low(num)		{			\
  	.name		= "LDO"#num,					\
048039526   Krzysztof Kozlowski   regulator: max776...
385
386
  	.of_match	= of_match_ptr("LDO"#num),			\
  	.regulators_node	= of_match_ptr("voltage-regulators"),	\
15282ba9e   Yadwinder Singh Brar   regulator: max776...
387
  	.id		= MAX77686_LDO##num,				\
133d4016f   Jonghwa Lee   regulator: MAX776...
388
389
390
391
392
  	.ops		= &max77686_ops,				\
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.min_uV		= MAX77686_LDO_LOW_MINUV,			\
  	.uV_step	= MAX77686_LDO_LOW_UVSTEP,			\
852abad23   Yadwinder Singh Brar   regulator: max776...
393
  	.ramp_delay	= MAX77686_RAMP_DELAY,				\
133d4016f   Jonghwa Lee   regulator: MAX776...
394
395
396
397
398
399
400
401
402
  	.n_voltages	= MAX77686_VSEL_MASK + 1,			\
  	.vsel_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.vsel_mask	= MAX77686_VSEL_MASK,				\
  	.enable_reg	= MAX77686_REG_LDO1CTRL1 + num - 1,		\
  	.enable_mask	= MAX77686_OPMODE_MASK				\
  			<< MAX77686_OPMODE_SHIFT,			\
  }
  #define regulator_desc_buck(num)		{			\
  	.name		= "BUCK"#num,					\
048039526   Krzysztof Kozlowski   regulator: max776...
403
404
  	.of_match	= of_match_ptr("BUCK"#num),			\
  	.regulators_node	= of_match_ptr("voltage-regulators"),	\
3307e9025   Krzysztof Kozlowski   regulator: max776...
405
  	.of_parse_cb	= max77686_of_parse_cb,				\
133d4016f   Jonghwa Lee   regulator: MAX776...
406
407
408
409
410
411
  	.id		= MAX77686_BUCK##num,				\
  	.ops		= &max77686_ops,				\
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.min_uV		= MAX77686_BUCK_MINUV,				\
  	.uV_step	= MAX77686_BUCK_UVSTEP,				\
852abad23   Yadwinder Singh Brar   regulator: max776...
412
  	.ramp_delay	= MAX77686_RAMP_DELAY,				\
a9597305d   Krzysztof Kozlowski   regulator: max776...
413
  	.enable_time	= MAX77686_BUCK_ENABLE_TIME,			\
133d4016f   Jonghwa Lee   regulator: MAX776...
414
415
416
417
418
419
420
421
  	.n_voltages	= MAX77686_VSEL_MASK + 1,			\
  	.vsel_reg	= MAX77686_REG_BUCK5OUT + (num - 5) * 2,	\
  	.vsel_mask	= MAX77686_VSEL_MASK,				\
  	.enable_reg	= MAX77686_REG_BUCK5CTRL + (num - 5) * 2,	\
  	.enable_mask	= MAX77686_OPMODE_MASK,				\
  }
  #define regulator_desc_buck1(num)		{			\
  	.name		= "BUCK"#num,					\
048039526   Krzysztof Kozlowski   regulator: max776...
422
423
  	.of_match	= of_match_ptr("BUCK"#num),			\
  	.regulators_node	= of_match_ptr("voltage-regulators"),	\
133d4016f   Jonghwa Lee   regulator: MAX776...
424
  	.id		= MAX77686_BUCK##num,				\
15282ba9e   Yadwinder Singh Brar   regulator: max776...
425
  	.ops		= &max77686_buck1_ops,				\
133d4016f   Jonghwa Lee   regulator: MAX776...
426
427
428
429
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.min_uV		= MAX77686_BUCK_MINUV,				\
  	.uV_step	= MAX77686_BUCK_UVSTEP,				\
852abad23   Yadwinder Singh Brar   regulator: max776...
430
  	.ramp_delay	= MAX77686_RAMP_DELAY,				\
a9597305d   Krzysztof Kozlowski   regulator: max776...
431
  	.enable_time	= MAX77686_BUCK_ENABLE_TIME,			\
133d4016f   Jonghwa Lee   regulator: MAX776...
432
433
434
435
436
437
438
439
  	.n_voltages	= MAX77686_VSEL_MASK + 1,			\
  	.vsel_reg	= MAX77686_REG_BUCK1OUT,			\
  	.vsel_mask	= MAX77686_VSEL_MASK,				\
  	.enable_reg	= MAX77686_REG_BUCK1CTRL,			\
  	.enable_mask	= MAX77686_OPMODE_MASK,				\
  }
  #define regulator_desc_buck_dvs(num)		{			\
  	.name		= "BUCK"#num,					\
048039526   Krzysztof Kozlowski   regulator: max776...
440
441
  	.of_match	= of_match_ptr("BUCK"#num),			\
  	.regulators_node	= of_match_ptr("voltage-regulators"),	\
133d4016f   Jonghwa Lee   regulator: MAX776...
442
  	.id		= MAX77686_BUCK##num,				\
74adfee53   Axel Lin   regulator: max776...
443
  	.ops		= &max77686_buck_dvs_ops,			\
133d4016f   Jonghwa Lee   regulator: MAX776...
444
445
446
447
  	.type		= REGULATOR_VOLTAGE,				\
  	.owner		= THIS_MODULE,					\
  	.min_uV		= MAX77686_DVS_MINUV,				\
  	.uV_step	= MAX77686_DVS_UVSTEP,				\
852abad23   Yadwinder Singh Brar   regulator: max776...
448
  	.ramp_delay	= MAX77686_DVS_RAMP_DELAY,			\
a9597305d   Krzysztof Kozlowski   regulator: max776...
449
  	.enable_time	= MAX77686_DVS_ENABLE_TIME,			\
133d4016f   Jonghwa Lee   regulator: MAX776...
450
451
452
453
454
455
456
  	.n_voltages	= MAX77686_DVS_VSEL_MASK + 1,			\
  	.vsel_reg	= MAX77686_REG_BUCK2DVS1 + (num - 2) * 10,	\
  	.vsel_mask	= MAX77686_DVS_VSEL_MASK,			\
  	.enable_reg	= MAX77686_REG_BUCK2CTRL1 + (num - 2) * 10,	\
  	.enable_mask	= MAX77686_OPMODE_MASK				\
  			<< MAX77686_OPMODE_BUCK234_SHIFT,		\
  }
73dbdf8ff   Krzysztof Kozlowski   regulator: max776...
457
  static const struct regulator_desc regulators[] = {
15282ba9e   Yadwinder Singh Brar   regulator: max776...
458
  	regulator_desc_ldo1_low(1),
133d4016f   Jonghwa Lee   regulator: MAX776...
459
460
461
462
463
464
465
466
  	regulator_desc_ldo_low(2),
  	regulator_desc_ldo(3),
  	regulator_desc_ldo(4),
  	regulator_desc_ldo(5),
  	regulator_desc_ldo_low(6),
  	regulator_desc_ldo_low(7),
  	regulator_desc_ldo_low(8),
  	regulator_desc_ldo(9),
15282ba9e   Yadwinder Singh Brar   regulator: max776...
467
468
469
  	regulator_desc_lpm_ldo(10),
  	regulator_desc_lpm_ldo(11),
  	regulator_desc_lpm_ldo(12),
133d4016f   Jonghwa Lee   regulator: MAX776...
470
  	regulator_desc_ldo(13),
15282ba9e   Yadwinder Singh Brar   regulator: max776...
471
  	regulator_desc_lpm_ldo(14),
133d4016f   Jonghwa Lee   regulator: MAX776...
472
  	regulator_desc_ldo_low(15),
15282ba9e   Yadwinder Singh Brar   regulator: max776...
473
  	regulator_desc_lpm_ldo(16),
133d4016f   Jonghwa Lee   regulator: MAX776...
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
  	regulator_desc_ldo(17),
  	regulator_desc_ldo(18),
  	regulator_desc_ldo(19),
  	regulator_desc_ldo(20),
  	regulator_desc_ldo(21),
  	regulator_desc_ldo(22),
  	regulator_desc_ldo(23),
  	regulator_desc_ldo(24),
  	regulator_desc_ldo(25),
  	regulator_desc_ldo(26),
  	regulator_desc_buck1(1),
  	regulator_desc_buck_dvs(2),
  	regulator_desc_buck_dvs(3),
  	regulator_desc_buck_dvs(4),
  	regulator_desc_buck(5),
  	regulator_desc_buck(6),
  	regulator_desc_buck(7),
  	regulator_desc_buck(8),
  	regulator_desc_buck(9),
  };
a5023574d   Bill Pemberton   regulator: remove...
494
  static int max77686_pmic_probe(struct platform_device *pdev)
133d4016f   Jonghwa Lee   regulator: MAX776...
495
496
  {
  	struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
133d4016f   Jonghwa Lee   regulator: MAX776...
497
  	struct max77686_data *max77686;
048039526   Krzysztof Kozlowski   regulator: max776...
498
  	int i;
c59d2a6b2   Axel Lin   regulator: max776...
499
  	struct regulator_config config = { };
133d4016f   Jonghwa Lee   regulator: MAX776...
500
501
502
503
504
505
506
507
  
  	dev_dbg(&pdev->dev, "%s
  ", __func__);
  
  	max77686 = devm_kzalloc(&pdev->dev, sizeof(struct max77686_data),
  				GFP_KERNEL);
  	if (!max77686)
  		return -ENOMEM;
048039526   Krzysztof Kozlowski   regulator: max776...
508
  	config.dev = iodev->dev;
f503071b0   Yadwinder Singh Brar   regulator: max776...
509
  	config.regmap = iodev->regmap;
6d2c896b7   Yadwinder Singh Brar   regulator: max776...
510
  	config.driver_data = max77686;
133d4016f   Jonghwa Lee   regulator: MAX776...
511
  	platform_set_drvdata(pdev, max77686);
ab0d1cbe5   Axel Lin   regulator: max776...
512
  	for (i = 0; i < MAX77686_REGULATORS; i++) {
b0c13e803   Krzysztof Kozlowski   regulator: max776...
513
  		struct regulator_dev *rdev;
eca29da9a   Krzysztof Kozlowski   regulator: max776...
514
  		int id = regulators[i].id;
b0c13e803   Krzysztof Kozlowski   regulator: max776...
515

4524df83c   Krzysztof Kozlowski   regulator: max776...
516
  		max77686->opmode[id] = MAX77686_NORMAL;
b0c13e803   Krzysztof Kozlowski   regulator: max776...
517
  		rdev = devm_regulator_register(&pdev->dev,
44815b4a6   Sachin Kamat   regulator: max776...
518
  						&regulators[i], &config);
b0c13e803   Krzysztof Kozlowski   regulator: max776...
519
  		if (IS_ERR(rdev)) {
048039526   Krzysztof Kozlowski   regulator: max776...
520
  			int ret = PTR_ERR(rdev);
f503071b0   Yadwinder Singh Brar   regulator: max776...
521
  			dev_err(&pdev->dev,
048039526   Krzysztof Kozlowski   regulator: max776...
522
523
524
  				"regulator init failed for %d: %d
  ", i, ret);
  			return ret;
133d4016f   Jonghwa Lee   regulator: MAX776...
525
  		}
133d4016f   Jonghwa Lee   regulator: MAX776...
526
  	}
ab0d1cbe5   Axel Lin   regulator: max776...
527

133d4016f   Jonghwa Lee   regulator: MAX776...
528
  	return 0;
133d4016f   Jonghwa Lee   regulator: MAX776...
529
530
531
532
533
534
535
536
537
538
539
  }
  
  static const struct platform_device_id max77686_pmic_id[] = {
  	{"max77686-pmic", 0},
  	{ },
  };
  MODULE_DEVICE_TABLE(platform, max77686_pmic_id);
  
  static struct platform_driver max77686_pmic_driver = {
  	.driver = {
  		.name = "max77686-pmic",
133d4016f   Jonghwa Lee   regulator: MAX776...
540
541
  	},
  	.probe = max77686_pmic_probe,
133d4016f   Jonghwa Lee   regulator: MAX776...
542
543
  	.id_table = max77686_pmic_id,
  };
314a8203b   Javier Martinez Canillas   regulator: max776...
544
  module_platform_driver(max77686_pmic_driver);
133d4016f   Jonghwa Lee   regulator: MAX776...
545
546
547
548
  
  MODULE_DESCRIPTION("MAXIM 77686 Regulator Driver");
  MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>");
  MODULE_LICENSE("GPL");