max77686-regulator.c 16.8 KB
Newer Older
1 2 3 4
/*
 * max77686.c - Regulator driver for the Maxim 77686
 *
 * Copyright (C) 2012 Samsung Electronics
5
 * Chiwoong Byun <woong.byun@samsung.com>
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 * 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>
#include <linux/err.h>
#include <linux/gpio.h>
29
#include <linux/of_gpio.h>
30 31 32 33
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/machine.h>
34
#include <linux/regulator/of_regulator.h>
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
44 45
#define MAX77686_BUCK_ENABLE_TIME	40		/* us */
#define MAX77686_DVS_ENABLE_TIME	22		/* us */
46 47
#define MAX77686_RAMP_DELAY	100000			/* uV/us */
#define MAX77686_DVS_RAMP_DELAY	27500			/* uV/us */
48 49 50
#define MAX77686_DVS_MINUV	600000
#define MAX77686_DVS_UVSTEP	12500

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
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/*
 * 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

73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
#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 {
93
	DECLARE_BITMAP(gpio_enabled, MAX77686_REGULATORS);
94

95
	/* Array indexed by regulator id */
96
	unsigned int opmode[MAX77686_REGULATORS];
97 98
};

99 100 101 102 103 104 105 106 107 108 109 110 111 112
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;
	}
}

113 114 115 116 117 118 119 120 121 122 123 124 125
/*
 * 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:
126
		if (test_bit(id, max77686->gpio_enabled))
127 128 129 130 131 132
			return MAX77686_GPIO_CONTROL;
	}

	return MAX77686_NORMAL;
}

133 134
/* Some BUCKs and LDOs supports Normal[ON/OFF] mode during suspend */
static int max77686_set_suspend_disable(struct regulator_dev *rdev)
135
{
136
	unsigned int val, shift;
137
	struct max77686_data *max77686 = rdev_get_drvdata(rdev);
138
	int ret, id = rdev_get_id(rdev);
139

140 141
	shift = max77686_get_opmode_shift(id);
	val = MAX77686_OFF_PWRREQ;
142

143
	ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
144
				 rdev->desc->enable_mask, val << shift);
145 146 147
	if (ret)
		return ret;

148
	max77686->opmode[id] = val;
149
	return 0;
150 151 152 153 154 155 156 157
}

/* 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;
158
	int ret, id = rdev_get_id(rdev);
159 160

	/* BUCK[5-9] doesn't support this feature */
161
	if (id >= MAX77686_BUCK5)
162 163 164 165
		return 0;

	switch (mode) {
	case REGULATOR_MODE_IDLE:			/* ON in LP Mode */
166
		val = MAX77686_LDO_LOWPOWER_PWRREQ;
167 168
		break;
	case REGULATOR_MODE_NORMAL:			/* ON in Normal Mode */
169
		val = max77686_map_normal_mode(max77686, id);
170 171 172 173 174 175 176
		break;
	default:
		pr_warn("%s: regulator_suspend_mode : 0x%x not supported\n",
			rdev->desc->name, mode);
		return -EINVAL;
	}

177
	ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
178 179
				  rdev->desc->enable_mask,
				  val << MAX77686_OPMODE_SHIFT);
180 181 182
	if (ret)
		return ret;

183
	max77686->opmode[id] = val;
184
	return 0;
185 186 187 188 189 190 191 192
}

/* 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);
193
	int ret, id = rdev_get_id(rdev);
194 195 196

	switch (mode) {
	case REGULATOR_MODE_STANDBY:			/* switch off */
197
		val = MAX77686_OFF_PWRREQ;
198 199
		break;
	case REGULATOR_MODE_IDLE:			/* ON in LP Mode */
200
		val = MAX77686_LDO_LOWPOWER_PWRREQ;
201 202
		break;
	case REGULATOR_MODE_NORMAL:			/* ON in Normal Mode */
203
		val = max77686_map_normal_mode(max77686, id);
204 205 206 207 208 209 210
		break;
	default:
		pr_warn("%s: regulator_suspend_mode : 0x%x not supported\n",
			rdev->desc->name, mode);
		return -EINVAL;
	}

211
	ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
212 213
				 rdev->desc->enable_mask,
				 val << MAX77686_OPMODE_SHIFT);
214 215 216
	if (ret)
		return ret;

217
	max77686->opmode[id] = val;
218
	return 0;
219 220
}

221
static int max77686_enable(struct regulator_dev *rdev)
222 223
{
	struct max77686_data *max77686 = rdev_get_drvdata(rdev);
224 225 226 227
	unsigned int shift;
	int id = rdev_get_id(rdev);

	shift = max77686_get_opmode_shift(id);
228

229
	if (max77686->opmode[id] == MAX77686_OFF_PWRREQ)
230
		max77686->opmode[id] = max77686_map_normal_mode(max77686, id);
231

232 233
	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
				  rdev->desc->enable_mask,
234
				  max77686->opmode[id] << shift);
235 236
}

237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
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\n",
			rdev->desc->name, ramp_delay);
	}

	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
				  MAX77686_RAMP_RATE_MASK, ramp_value << 6);
}

262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
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)) {
282
		set_bit(desc->id, max77686->gpio_enabled);
283 284 285 286 287 288 289 290 291

		return regmap_update_bits(config->regmap, desc->enable_reg,
					  desc->enable_mask,
					  MAX77686_GPIO_CONTROL);
	}

	return 0;
}

292 293
static struct regulator_ops max77686_ops = {
	.list_voltage		= regulator_list_voltage_linear,
294
	.map_voltage		= regulator_map_voltage_linear,
295
	.is_enabled		= regulator_is_enabled_regmap,
296
	.enable			= max77686_enable,
297 298 299
	.disable		= regulator_disable_regmap,
	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
300
	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
301 302 303 304 305 306 307 308
	.set_suspend_mode	= max77686_set_suspend_mode,
};

static struct regulator_ops max77686_ldo_ops = {
	.list_voltage		= regulator_list_voltage_linear,
	.map_voltage		= regulator_map_voltage_linear,
	.is_enabled		= regulator_is_enabled_regmap,
	.enable			= max77686_enable,
309 310 311
	.disable		= regulator_disable_regmap,
	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
312
	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
313
	.set_suspend_mode	= max77686_ldo_set_suspend_mode,
314
	.set_suspend_disable	= max77686_set_suspend_disable,
315 316 317 318 319 320 321 322 323 324 325
};

static struct regulator_ops max77686_buck1_ops = {
	.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,
326
	.set_suspend_disable	= max77686_set_suspend_disable,
327 328 329 330
};

static struct regulator_ops max77686_buck_dvs_ops = {
	.list_voltage		= regulator_list_voltage_linear,
331
	.map_voltage		= regulator_map_voltage_linear,
332
	.is_enabled		= regulator_is_enabled_regmap,
333
	.enable			= max77686_enable,
334 335 336
	.disable		= regulator_disable_regmap,
	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
337
	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
338
	.set_ramp_delay		= max77686_set_ramp_delay,
339
	.set_suspend_disable	= max77686_set_suspend_disable,
340 341 342 343
};

#define regulator_desc_ldo(num)		{				\
	.name		= "LDO"#num,					\
344 345
	.of_match	= of_match_ptr("LDO"#num),			\
	.regulators_node	= of_match_ptr("voltage-regulators"),	\
346
	.of_parse_cb	= max77686_of_parse_cb,				\
347 348 349 350 351 352
	.id		= MAX77686_LDO##num,				\
	.ops		= &max77686_ops,				\
	.type		= REGULATOR_VOLTAGE,				\
	.owner		= THIS_MODULE,					\
	.min_uV		= MAX77686_LDO_MINUV,				\
	.uV_step	= MAX77686_LDO_UVSTEP,				\
353
	.ramp_delay	= MAX77686_RAMP_DELAY,				\
354 355 356 357 358 359 360
	.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,			\
}
361 362
#define regulator_desc_lpm_ldo(num)	{				\
	.name		= "LDO"#num,					\
363 364
	.of_match	= of_match_ptr("LDO"#num),			\
	.regulators_node	= of_match_ptr("voltage-regulators"),	\
365 366 367 368 369 370 371 372 373 374 375 376 377 378
	.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,			\
}
379
#define regulator_desc_ldo_low(num)		{			\
380
	.name		= "LDO"#num,					\
381 382
	.of_match	= of_match_ptr("LDO"#num),			\
	.regulators_node	= of_match_ptr("voltage-regulators"),	\
383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
	.id		= MAX77686_LDO##num,				\
	.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)		{			\
398
	.name		= "LDO"#num,					\
399 400
	.of_match	= of_match_ptr("LDO"#num),			\
	.regulators_node	= of_match_ptr("voltage-regulators"),	\
401 402 403 404 405 406
	.id		= MAX77686_LDO##num,				\
	.ops		= &max77686_ops,				\
	.type		= REGULATOR_VOLTAGE,				\
	.owner		= THIS_MODULE,					\
	.min_uV		= MAX77686_LDO_LOW_MINUV,			\
	.uV_step	= MAX77686_LDO_LOW_UVSTEP,			\
407
	.ramp_delay	= MAX77686_RAMP_DELAY,				\
408 409 410 411 412 413 414 415 416
	.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,					\
417 418
	.of_match	= of_match_ptr("BUCK"#num),			\
	.regulators_node	= of_match_ptr("voltage-regulators"),	\
419
	.of_parse_cb	= max77686_of_parse_cb,				\
420 421 422 423 424 425
	.id		= MAX77686_BUCK##num,				\
	.ops		= &max77686_ops,				\
	.type		= REGULATOR_VOLTAGE,				\
	.owner		= THIS_MODULE,					\
	.min_uV		= MAX77686_BUCK_MINUV,				\
	.uV_step	= MAX77686_BUCK_UVSTEP,				\
426
	.ramp_delay	= MAX77686_RAMP_DELAY,				\
427
	.enable_time	= MAX77686_BUCK_ENABLE_TIME,			\
428 429 430 431 432 433 434 435
	.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,					\
436 437
	.of_match	= of_match_ptr("BUCK"#num),			\
	.regulators_node	= of_match_ptr("voltage-regulators"),	\
438
	.id		= MAX77686_BUCK##num,				\
439
	.ops		= &max77686_buck1_ops,				\
440 441 442 443
	.type		= REGULATOR_VOLTAGE,				\
	.owner		= THIS_MODULE,					\
	.min_uV		= MAX77686_BUCK_MINUV,				\
	.uV_step	= MAX77686_BUCK_UVSTEP,				\
444
	.ramp_delay	= MAX77686_RAMP_DELAY,				\
445
	.enable_time	= MAX77686_BUCK_ENABLE_TIME,			\
446 447 448 449 450 451 452 453
	.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,					\
454 455
	.of_match	= of_match_ptr("BUCK"#num),			\
	.regulators_node	= of_match_ptr("voltage-regulators"),	\
456
	.id		= MAX77686_BUCK##num,				\
457
	.ops		= &max77686_buck_dvs_ops,			\
458 459 460 461
	.type		= REGULATOR_VOLTAGE,				\
	.owner		= THIS_MODULE,					\
	.min_uV		= MAX77686_DVS_MINUV,				\
	.uV_step	= MAX77686_DVS_UVSTEP,				\
462
	.ramp_delay	= MAX77686_DVS_RAMP_DELAY,			\
463
	.enable_time	= MAX77686_DVS_ENABLE_TIME,			\
464 465 466 467 468 469 470 471
	.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,		\
}

472
static const struct regulator_desc regulators[] = {
473
	regulator_desc_ldo1_low(1),
474 475 476 477 478 479 480 481
	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),
482 483 484
	regulator_desc_lpm_ldo(10),
	regulator_desc_lpm_ldo(11),
	regulator_desc_lpm_ldo(12),
485
	regulator_desc_ldo(13),
486
	regulator_desc_lpm_ldo(14),
487
	regulator_desc_ldo_low(15),
488
	regulator_desc_lpm_ldo(16),
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
	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),
};

510
static int max77686_pmic_probe(struct platform_device *pdev)
511 512 513
{
	struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
	struct max77686_data *max77686;
514
	int i;
515
	struct regulator_config config = { };
516 517 518 519 520 521 522 523

	dev_dbg(&pdev->dev, "%s\n", __func__);

	max77686 = devm_kzalloc(&pdev->dev, sizeof(struct max77686_data),
				GFP_KERNEL);
	if (!max77686)
		return -ENOMEM;

524
	config.dev = iodev->dev;
525
	config.regmap = iodev->regmap;
526
	config.driver_data = max77686;
527 528
	platform_set_drvdata(pdev, max77686);

529
	for (i = 0; i < MAX77686_REGULATORS; i++) {
530
		struct regulator_dev *rdev;
531
		int id = regulators[i].id;
532

533
		max77686->opmode[id] = MAX77686_NORMAL;
534
		rdev = devm_regulator_register(&pdev->dev,
535
						&regulators[i], &config);
536
		if (IS_ERR(rdev)) {
537
			int ret = PTR_ERR(rdev);
538
			dev_err(&pdev->dev,
539 540
				"regulator init failed for %d: %d\n", i, ret);
			return ret;
541 542
		}
	}
543

544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
	return 0;
}

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",
	},
	.probe = max77686_pmic_probe,
	.id_table = max77686_pmic_id,
};

561
module_platform_driver(max77686_pmic_driver);
562 563 564 565

MODULE_DESCRIPTION("MAXIM 77686 Regulator Driver");
MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>");
MODULE_LICENSE("GPL");