Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0+
   2//
   3// Copyright (c) 2012-2014 Samsung Electronics Co., Ltd
   4//              http://www.samsung.com
   5
   6#include <linux/bug.h>
   7#include <linux/err.h>
   8#include <linux/gpio/consumer.h>
   9#include <linux/slab.h>
  10#include <linux/module.h>
  11#include <linux/of.h>
  12#include <linux/regmap.h>
  13#include <linux/platform_device.h>
  14#include <linux/regulator/driver.h>
  15#include <linux/regulator/machine.h>
  16#include <linux/regulator/of_regulator.h>
  17#include <linux/mfd/samsung/core.h>
  18#include <linux/mfd/samsung/s2mps11.h>
  19#include <linux/mfd/samsung/s2mps13.h>
  20#include <linux/mfd/samsung/s2mps14.h>
  21#include <linux/mfd/samsung/s2mps15.h>
  22#include <linux/mfd/samsung/s2mpu02.h>
  23
  24/* The highest number of possible regulators for supported devices. */
  25#define S2MPS_REGULATOR_MAX		S2MPS13_REGULATOR_MAX
  26struct s2mps11_info {
  27	int ramp_delay2;
  28	int ramp_delay34;
  29	int ramp_delay5;
  30	int ramp_delay16;
  31	int ramp_delay7810;
  32	int ramp_delay9;
  33
  34	enum sec_device_type dev_type;
  35
  36	/*
  37	 * One bit for each S2MPS11/S2MPS13/S2MPS14/S2MPU02 regulator whether
  38	 * the suspend mode was enabled.
  39	 */
  40	DECLARE_BITMAP(suspend_state, S2MPS_REGULATOR_MAX);
  41
  42	/*
  43	 * Array (size: number of regulators) with GPIO-s for external
  44	 * sleep control.
  45	 */
  46	struct gpio_desc **ext_control_gpiod;
  47};
  48
  49static int get_ramp_delay(int ramp_delay)
  50{
  51	unsigned char cnt = 0;
  52
  53	ramp_delay /= 6250;
  54
  55	while (true) {
  56		ramp_delay = ramp_delay >> 1;
  57		if (ramp_delay == 0)
  58			break;
  59		cnt++;
  60	}
  61
  62	if (cnt > 3)
  63		cnt = 3;
  64
  65	return cnt;
  66}
  67
  68static int s2mps11_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
  69				   unsigned int old_selector,
  70				   unsigned int new_selector)
  71{
  72	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
  73	int rdev_id = rdev_get_id(rdev);
  74	unsigned int ramp_delay = 0;
  75	int old_volt, new_volt;
  76
  77	switch (rdev_id) {
  78	case S2MPS11_BUCK2:
  79		ramp_delay = s2mps11->ramp_delay2;
  80		break;
  81	case S2MPS11_BUCK3:
  82	case S2MPS11_BUCK4:
  83		ramp_delay = s2mps11->ramp_delay34;
  84		break;
  85	case S2MPS11_BUCK5:
  86		ramp_delay = s2mps11->ramp_delay5;
  87		break;
  88	case S2MPS11_BUCK6:
  89	case S2MPS11_BUCK1:
  90		ramp_delay = s2mps11->ramp_delay16;
  91		break;
  92	case S2MPS11_BUCK7:
  93	case S2MPS11_BUCK8:
  94	case S2MPS11_BUCK10:
  95		ramp_delay = s2mps11->ramp_delay7810;
  96		break;
  97	case S2MPS11_BUCK9:
  98		ramp_delay = s2mps11->ramp_delay9;
  99	}
 100
 101	if (ramp_delay == 0)
 102		ramp_delay = rdev->desc->ramp_delay;
 103
 104	old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector);
 105	new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector);
 106
 107	return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay);
 108}
 109
 110static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 111{
 112	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
 113	unsigned int ramp_val, ramp_shift, ramp_reg = S2MPS11_REG_RAMP_BUCK;
 114	unsigned int ramp_enable = 1, enable_shift = 0;
 115	int rdev_id = rdev_get_id(rdev);
 116	int ret;
 117
 118	switch (rdev_id) {
 119	case S2MPS11_BUCK1:
 120		if (ramp_delay > s2mps11->ramp_delay16)
 121			s2mps11->ramp_delay16 = ramp_delay;
 122		else
 123			ramp_delay = s2mps11->ramp_delay16;
 124
 125		ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT;
 126		break;
 127	case S2MPS11_BUCK2:
 128		enable_shift = S2MPS11_BUCK2_RAMP_EN_SHIFT;
 129		if (!ramp_delay) {
 130			ramp_enable = 0;
 131			break;
 132		}
 133
 134		s2mps11->ramp_delay2 = ramp_delay;
 135		ramp_shift = S2MPS11_BUCK2_RAMP_SHIFT;
 136		ramp_reg = S2MPS11_REG_RAMP;
 137		break;
 138	case S2MPS11_BUCK3:
 139		enable_shift = S2MPS11_BUCK3_RAMP_EN_SHIFT;
 140		if (!ramp_delay) {
 141			ramp_enable = 0;
 142			break;
 143		}
 144
 145		if (ramp_delay > s2mps11->ramp_delay34)
 146			s2mps11->ramp_delay34 = ramp_delay;
 147		else
 148			ramp_delay = s2mps11->ramp_delay34;
 149
 150		ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT;
 151		ramp_reg = S2MPS11_REG_RAMP;
 152		break;
 153	case S2MPS11_BUCK4:
 154		enable_shift = S2MPS11_BUCK4_RAMP_EN_SHIFT;
 155		if (!ramp_delay) {
 156			ramp_enable = 0;
 157			break;
 158		}
 159
 160		if (ramp_delay > s2mps11->ramp_delay34)
 161			s2mps11->ramp_delay34 = ramp_delay;
 162		else
 163			ramp_delay = s2mps11->ramp_delay34;
 164
 165		ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT;
 166		ramp_reg = S2MPS11_REG_RAMP;
 167		break;
 168	case S2MPS11_BUCK5:
 169		s2mps11->ramp_delay5 = ramp_delay;
 170		ramp_shift = S2MPS11_BUCK5_RAMP_SHIFT;
 171		break;
 172	case S2MPS11_BUCK6:
 173		enable_shift = S2MPS11_BUCK6_RAMP_EN_SHIFT;
 174		if (!ramp_delay) {
 175			ramp_enable = 0;
 176			break;
 177		}
 178
 179		if (ramp_delay > s2mps11->ramp_delay16)
 180			s2mps11->ramp_delay16 = ramp_delay;
 181		else
 182			ramp_delay = s2mps11->ramp_delay16;
 183
 184		ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT;
 185		break;
 186	case S2MPS11_BUCK7:
 187	case S2MPS11_BUCK8:
 188	case S2MPS11_BUCK10:
 189		if (ramp_delay > s2mps11->ramp_delay7810)
 190			s2mps11->ramp_delay7810 = ramp_delay;
 191		else
 192			ramp_delay = s2mps11->ramp_delay7810;
 193
 194		ramp_shift = S2MPS11_BUCK7810_RAMP_SHIFT;
 195		break;
 196	case S2MPS11_BUCK9:
 197		s2mps11->ramp_delay9 = ramp_delay;
 198		ramp_shift = S2MPS11_BUCK9_RAMP_SHIFT;
 199		break;
 200	default:
 201		return 0;
 202	}
 203
 204	if (!ramp_enable)
 205		goto ramp_disable;
 206
 207	/* Ramp delay can be enabled/disabled only for buck[2346] */
 208	if ((rdev_id >= S2MPS11_BUCK2 && rdev_id <= S2MPS11_BUCK4) ||
 209	    rdev_id == S2MPS11_BUCK6)  {
 210		ret = regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
 211					 1 << enable_shift, 1 << enable_shift);
 212		if (ret) {
 213			dev_err(&rdev->dev, "failed to enable ramp rate\n");
 214			return ret;
 215		}
 216	}
 217
 218	ramp_val = get_ramp_delay(ramp_delay);
 219
 220	return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift,
 221				  ramp_val << ramp_shift);
 222
 223ramp_disable:
 224	return regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
 225				  1 << enable_shift, 0);
 226}
 227
 228static int s2mps11_regulator_enable(struct regulator_dev *rdev)
 229{
 230	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
 231	int rdev_id = rdev_get_id(rdev);
 232	unsigned int val;
 233
 234	switch (s2mps11->dev_type) {
 235	case S2MPS11X:
 236		if (test_bit(rdev_id, s2mps11->suspend_state))
 237			val = S2MPS14_ENABLE_SUSPEND;
 238		else
 239			val = rdev->desc->enable_mask;
 240		break;
 241	case S2MPS13X:
 242	case S2MPS14X:
 243		if (test_bit(rdev_id, s2mps11->suspend_state))
 244			val = S2MPS14_ENABLE_SUSPEND;
 245		else if (s2mps11->ext_control_gpiod[rdev_id])
 246			val = S2MPS14_ENABLE_EXT_CONTROL;
 247		else
 248			val = rdev->desc->enable_mask;
 249		break;
 250	case S2MPU02:
 251		if (test_bit(rdev_id, s2mps11->suspend_state))
 252			val = S2MPU02_ENABLE_SUSPEND;
 253		else
 254			val = rdev->desc->enable_mask;
 255		break;
 256	default:
 257		return -EINVAL;
 258	}
 259
 260	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
 261			rdev->desc->enable_mask, val);
 262}
 263
 264static int s2mps11_regulator_set_suspend_disable(struct regulator_dev *rdev)
 265{
 266	int ret;
 267	unsigned int val, state;
 268	struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
 269	int rdev_id = rdev_get_id(rdev);
 270
 271	/* Below LDO should be always on or does not support suspend mode. */
 272	switch (s2mps11->dev_type) {
 273	case S2MPS11X:
 274		switch (rdev_id) {
 275		case S2MPS11_LDO2:
 276		case S2MPS11_LDO36:
 277		case S2MPS11_LDO37:
 278		case S2MPS11_LDO38:
 279			return 0;
 280		default:
 281			state = S2MPS14_ENABLE_SUSPEND;
 282			break;
 283		}
 284		break;
 285	case S2MPS13X:
 286	case S2MPS14X:
 287		switch (rdev_id) {
 288		case S2MPS14_LDO3:
 289			return 0;
 290		default:
 291			state = S2MPS14_ENABLE_SUSPEND;
 292			break;
 293		}
 294		break;
 295	case S2MPU02:
 296		switch (rdev_id) {
 297		case S2MPU02_LDO13:
 298		case S2MPU02_LDO14:
 299		case S2MPU02_LDO15:
 300		case S2MPU02_LDO17:
 301		case S2MPU02_BUCK7:
 302			state = S2MPU02_DISABLE_SUSPEND;
 303			break;
 304		default:
 305			state = S2MPU02_ENABLE_SUSPEND;
 306			break;
 307		}
 308		break;
 309	default:
 310		return -EINVAL;
 311	}
 312
 313	ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
 314	if (ret < 0)
 315		return ret;
 316
 317	set_bit(rdev_id, s2mps11->suspend_state);
 318	/*
 319	 * Don't enable suspend mode if regulator is already disabled because
 320	 * this would effectively for a short time turn on the regulator after
 321	 * resuming.
 322	 * However we still want to toggle the suspend_state bit for regulator
 323	 * in case if it got enabled before suspending the system.
 324	 */
 325	if (!(val & rdev->desc->enable_mask))
 326		return 0;
 327
 328	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
 329				  rdev->desc->enable_mask, state);
 330}
 331
 332static const struct regulator_ops s2mps11_ldo_ops = {
 333	.list_voltage		= regulator_list_voltage_linear,
 334	.map_voltage		= regulator_map_voltage_linear,
 335	.is_enabled		= regulator_is_enabled_regmap,
 336	.enable			= s2mps11_regulator_enable,
 337	.disable		= regulator_disable_regmap,
 338	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
 339	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
 340	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
 341	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
 342};
 343
 344static const struct regulator_ops s2mps11_buck_ops = {
 345	.list_voltage		= regulator_list_voltage_linear,
 346	.map_voltage		= regulator_map_voltage_linear,
 347	.is_enabled		= regulator_is_enabled_regmap,
 348	.enable			= s2mps11_regulator_enable,
 349	.disable		= regulator_disable_regmap,
 350	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
 351	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
 352	.set_voltage_time_sel	= s2mps11_regulator_set_voltage_time_sel,
 353	.set_ramp_delay		= s2mps11_set_ramp_delay,
 354	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
 355};
 356
 357#define regulator_desc_s2mps11_ldo(num, step) {		\
 358	.name		= "LDO"#num,			\
 359	.id		= S2MPS11_LDO##num,		\
 360	.ops		= &s2mps11_ldo_ops,		\
 361	.type		= REGULATOR_VOLTAGE,		\
 362	.owner		= THIS_MODULE,			\
 363	.ramp_delay	= RAMP_DELAY_12_MVUS,		\
 364	.min_uV		= MIN_800_MV,			\
 365	.uV_step	= step,				\
 366	.n_voltages	= S2MPS11_LDO_N_VOLTAGES,	\
 367	.vsel_reg	= S2MPS11_REG_L1CTRL + num - 1,	\
 368	.vsel_mask	= S2MPS11_LDO_VSEL_MASK,	\
 369	.enable_reg	= S2MPS11_REG_L1CTRL + num - 1,	\
 370	.enable_mask	= S2MPS11_ENABLE_MASK		\
 371}
 372
 373#define regulator_desc_s2mps11_buck1_4(num) {			\
 374	.name		= "BUCK"#num,				\
 375	.id		= S2MPS11_BUCK##num,			\
 376	.ops		= &s2mps11_buck_ops,			\
 377	.type		= REGULATOR_VOLTAGE,			\
 378	.owner		= THIS_MODULE,				\
 379	.min_uV		= MIN_650_MV,				\
 380	.uV_step	= STEP_6_25_MV,				\
 381	.linear_min_sel	= 8,					\
 382	.n_voltages	= S2MPS11_BUCK12346_N_VOLTAGES,		\
 383	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
 384	.vsel_reg	= S2MPS11_REG_B1CTRL2 + (num - 1) * 2,	\
 385	.vsel_mask	= S2MPS11_BUCK_VSEL_MASK,		\
 386	.enable_reg	= S2MPS11_REG_B1CTRL1 + (num - 1) * 2,	\
 387	.enable_mask	= S2MPS11_ENABLE_MASK			\
 388}
 389
 390#define regulator_desc_s2mps11_buck5 {				\
 391	.name		= "BUCK5",				\
 392	.id		= S2MPS11_BUCK5,			\
 393	.ops		= &s2mps11_buck_ops,			\
 394	.type		= REGULATOR_VOLTAGE,			\
 395	.owner		= THIS_MODULE,				\
 396	.min_uV		= MIN_650_MV,				\
 397	.uV_step	= STEP_6_25_MV,				\
 398	.linear_min_sel	= 8,					\
 399	.n_voltages	= S2MPS11_BUCK5_N_VOLTAGES,		\
 400	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
 401	.vsel_reg	= S2MPS11_REG_B5CTRL2,			\
 402	.vsel_mask	= S2MPS11_BUCK_VSEL_MASK,		\
 403	.enable_reg	= S2MPS11_REG_B5CTRL1,			\
 404	.enable_mask	= S2MPS11_ENABLE_MASK			\
 405}
 406
 407#define regulator_desc_s2mps11_buck67810(num, min, step, min_sel, voltages) {	\
 408	.name		= "BUCK"#num,				\
 409	.id		= S2MPS11_BUCK##num,			\
 410	.ops		= &s2mps11_buck_ops,			\
 411	.type		= REGULATOR_VOLTAGE,			\
 412	.owner		= THIS_MODULE,				\
 413	.min_uV		= min,					\
 414	.uV_step	= step,					\
 415	.linear_min_sel	= min_sel,				\
 416	.n_voltages	= voltages,				\
 417	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
 418	.vsel_reg	= S2MPS11_REG_B6CTRL2 + (num - 6) * 2,	\
 419	.vsel_mask	= S2MPS11_BUCK_VSEL_MASK,		\
 420	.enable_reg	= S2MPS11_REG_B6CTRL1 + (num - 6) * 2,	\
 421	.enable_mask	= S2MPS11_ENABLE_MASK			\
 422}
 423
 424#define regulator_desc_s2mps11_buck9 {				\
 425	.name		= "BUCK9",				\
 426	.id		= S2MPS11_BUCK9,			\
 427	.ops		= &s2mps11_buck_ops,			\
 428	.type		= REGULATOR_VOLTAGE,			\
 429	.owner		= THIS_MODULE,				\
 430	.min_uV		= MIN_3000_MV,				\
 431	.uV_step	= STEP_25_MV,				\
 432	.n_voltages	= S2MPS11_BUCK9_N_VOLTAGES,		\
 433	.ramp_delay	= S2MPS11_RAMP_DELAY,			\
 434	.vsel_reg	= S2MPS11_REG_B9CTRL2,			\
 435	.vsel_mask	= S2MPS11_BUCK9_VSEL_MASK,		\
 436	.enable_reg	= S2MPS11_REG_B9CTRL1,			\
 437	.enable_mask	= S2MPS11_ENABLE_MASK			\
 438}
 439
 440static const struct regulator_desc s2mps11_regulators[] = {
 441	regulator_desc_s2mps11_ldo(1, STEP_25_MV),
 442	regulator_desc_s2mps11_ldo(2, STEP_50_MV),
 443	regulator_desc_s2mps11_ldo(3, STEP_50_MV),
 444	regulator_desc_s2mps11_ldo(4, STEP_50_MV),
 445	regulator_desc_s2mps11_ldo(5, STEP_50_MV),
 446	regulator_desc_s2mps11_ldo(6, STEP_25_MV),
 447	regulator_desc_s2mps11_ldo(7, STEP_50_MV),
 448	regulator_desc_s2mps11_ldo(8, STEP_50_MV),
 449	regulator_desc_s2mps11_ldo(9, STEP_50_MV),
 450	regulator_desc_s2mps11_ldo(10, STEP_50_MV),
 451	regulator_desc_s2mps11_ldo(11, STEP_25_MV),
 452	regulator_desc_s2mps11_ldo(12, STEP_50_MV),
 453	regulator_desc_s2mps11_ldo(13, STEP_50_MV),
 454	regulator_desc_s2mps11_ldo(14, STEP_50_MV),
 455	regulator_desc_s2mps11_ldo(15, STEP_50_MV),
 456	regulator_desc_s2mps11_ldo(16, STEP_50_MV),
 457	regulator_desc_s2mps11_ldo(17, STEP_50_MV),
 458	regulator_desc_s2mps11_ldo(18, STEP_50_MV),
 459	regulator_desc_s2mps11_ldo(19, STEP_50_MV),
 460	regulator_desc_s2mps11_ldo(20, STEP_50_MV),
 461	regulator_desc_s2mps11_ldo(21, STEP_50_MV),
 462	regulator_desc_s2mps11_ldo(22, STEP_25_MV),
 463	regulator_desc_s2mps11_ldo(23, STEP_25_MV),
 464	regulator_desc_s2mps11_ldo(24, STEP_50_MV),
 465	regulator_desc_s2mps11_ldo(25, STEP_50_MV),
 466	regulator_desc_s2mps11_ldo(26, STEP_50_MV),
 467	regulator_desc_s2mps11_ldo(27, STEP_25_MV),
 468	regulator_desc_s2mps11_ldo(28, STEP_50_MV),
 469	regulator_desc_s2mps11_ldo(29, STEP_50_MV),
 470	regulator_desc_s2mps11_ldo(30, STEP_50_MV),
 471	regulator_desc_s2mps11_ldo(31, STEP_50_MV),
 472	regulator_desc_s2mps11_ldo(32, STEP_50_MV),
 473	regulator_desc_s2mps11_ldo(33, STEP_50_MV),
 474	regulator_desc_s2mps11_ldo(34, STEP_50_MV),
 475	regulator_desc_s2mps11_ldo(35, STEP_25_MV),
 476	regulator_desc_s2mps11_ldo(36, STEP_50_MV),
 477	regulator_desc_s2mps11_ldo(37, STEP_50_MV),
 478	regulator_desc_s2mps11_ldo(38, STEP_50_MV),
 479	regulator_desc_s2mps11_buck1_4(1),
 480	regulator_desc_s2mps11_buck1_4(2),
 481	regulator_desc_s2mps11_buck1_4(3),
 482	regulator_desc_s2mps11_buck1_4(4),
 483	regulator_desc_s2mps11_buck5,
 484	regulator_desc_s2mps11_buck67810(6, MIN_650_MV, STEP_6_25_MV, 8,
 485					 S2MPS11_BUCK12346_N_VOLTAGES),
 486	regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV, 0,
 487					 S2MPS11_BUCK7810_N_VOLTAGES),
 488	regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV, 0,
 489					 S2MPS11_BUCK7810_N_VOLTAGES),
 490	regulator_desc_s2mps11_buck9,
 491	regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV, 0,
 492					 S2MPS11_BUCK7810_N_VOLTAGES),
 493};
 494
 495static const struct regulator_ops s2mps14_reg_ops;
 496
 497#define regulator_desc_s2mps13_ldo(num, min, step, min_sel) {	\
 498	.name		= "LDO"#num,				\
 499	.id		= S2MPS13_LDO##num,			\
 500	.ops		= &s2mps14_reg_ops,			\
 501	.type		= REGULATOR_VOLTAGE,			\
 502	.owner		= THIS_MODULE,				\
 503	.min_uV		= min,					\
 504	.uV_step	= step,					\
 505	.linear_min_sel	= min_sel,				\
 506	.n_voltages	= S2MPS14_LDO_N_VOLTAGES,		\
 507	.vsel_reg	= S2MPS13_REG_L1CTRL + num - 1,		\
 508	.vsel_mask	= S2MPS14_LDO_VSEL_MASK,		\
 509	.enable_reg	= S2MPS13_REG_L1CTRL + num - 1,		\
 510	.enable_mask	= S2MPS14_ENABLE_MASK			\
 511}
 512
 513#define regulator_desc_s2mps13_buck(num, min, step, min_sel) {	\
 514	.name		= "BUCK"#num,				\
 515	.id		= S2MPS13_BUCK##num,			\
 516	.ops		= &s2mps14_reg_ops,			\
 517	.type		= REGULATOR_VOLTAGE,			\
 518	.owner		= THIS_MODULE,				\
 519	.min_uV		= min,					\
 520	.uV_step	= step,					\
 521	.linear_min_sel	= min_sel,				\
 522	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
 523	.ramp_delay	= S2MPS13_BUCK_RAMP_DELAY,		\
 524	.vsel_reg	= S2MPS13_REG_B1OUT + (num - 1) * 2,	\
 525	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
 526	.enable_reg	= S2MPS13_REG_B1CTRL + (num - 1) * 2,	\
 527	.enable_mask	= S2MPS14_ENABLE_MASK			\
 528}
 529
 530#define regulator_desc_s2mps13_buck7(num, min, step, min_sel) {	\
 531	.name		= "BUCK"#num,				\
 532	.id		= S2MPS13_BUCK##num,			\
 533	.ops		= &s2mps14_reg_ops,			\
 534	.type		= REGULATOR_VOLTAGE,			\
 535	.owner		= THIS_MODULE,				\
 536	.min_uV		= min,					\
 537	.uV_step	= step,					\
 538	.linear_min_sel	= min_sel,				\
 539	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
 540	.ramp_delay	= S2MPS13_BUCK_RAMP_DELAY,		\
 541	.vsel_reg	= S2MPS13_REG_B1OUT + (num) * 2 - 1,	\
 542	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
 543	.enable_reg	= S2MPS13_REG_B1CTRL + (num - 1) * 2,	\
 544	.enable_mask	= S2MPS14_ENABLE_MASK			\
 545}
 546
 547#define regulator_desc_s2mps13_buck8_10(num, min, step, min_sel) {	\
 548	.name		= "BUCK"#num,				\
 549	.id		= S2MPS13_BUCK##num,			\
 550	.ops		= &s2mps14_reg_ops,			\
 551	.type		= REGULATOR_VOLTAGE,			\
 552	.owner		= THIS_MODULE,				\
 553	.min_uV		= min,					\
 554	.uV_step	= step,					\
 555	.linear_min_sel	= min_sel,				\
 556	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
 557	.ramp_delay	= S2MPS13_BUCK_RAMP_DELAY,		\
 558	.vsel_reg	= S2MPS13_REG_B1OUT + (num) * 2 - 1,	\
 559	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
 560	.enable_reg	= S2MPS13_REG_B1CTRL + (num) * 2 - 1,	\
 561	.enable_mask	= S2MPS14_ENABLE_MASK			\
 562}
 563
 564static const struct regulator_desc s2mps13_regulators[] = {
 565	regulator_desc_s2mps13_ldo(1,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 566	regulator_desc_s2mps13_ldo(2,  MIN_1400_MV, STEP_50_MV,   0x0C),
 567	regulator_desc_s2mps13_ldo(3,  MIN_1000_MV, STEP_25_MV,   0x08),
 568	regulator_desc_s2mps13_ldo(4,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 569	regulator_desc_s2mps13_ldo(5,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 570	regulator_desc_s2mps13_ldo(6,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 571	regulator_desc_s2mps13_ldo(7,  MIN_1000_MV, STEP_25_MV,   0x08),
 572	regulator_desc_s2mps13_ldo(8,  MIN_1000_MV, STEP_25_MV,   0x08),
 573	regulator_desc_s2mps13_ldo(9,  MIN_1000_MV, STEP_25_MV,   0x08),
 574	regulator_desc_s2mps13_ldo(10, MIN_1400_MV, STEP_50_MV,   0x0C),
 575	regulator_desc_s2mps13_ldo(11, MIN_800_MV,  STEP_25_MV,   0x10),
 576	regulator_desc_s2mps13_ldo(12, MIN_800_MV,  STEP_25_MV,   0x10),
 577	regulator_desc_s2mps13_ldo(13, MIN_800_MV,  STEP_25_MV,   0x10),
 578	regulator_desc_s2mps13_ldo(14, MIN_800_MV,  STEP_12_5_MV, 0x00),
 579	regulator_desc_s2mps13_ldo(15, MIN_800_MV,  STEP_12_5_MV, 0x00),
 580	regulator_desc_s2mps13_ldo(16, MIN_1400_MV, STEP_50_MV,   0x0C),
 581	regulator_desc_s2mps13_ldo(17, MIN_1400_MV, STEP_50_MV,   0x0C),
 582	regulator_desc_s2mps13_ldo(18, MIN_1000_MV, STEP_25_MV,   0x08),
 583	regulator_desc_s2mps13_ldo(19, MIN_1000_MV, STEP_25_MV,   0x08),
 584	regulator_desc_s2mps13_ldo(20, MIN_1400_MV, STEP_50_MV,   0x0C),
 585	regulator_desc_s2mps13_ldo(21, MIN_1000_MV, STEP_25_MV,   0x08),
 586	regulator_desc_s2mps13_ldo(22, MIN_1000_MV, STEP_25_MV,   0x08),
 587	regulator_desc_s2mps13_ldo(23, MIN_800_MV,  STEP_12_5_MV, 0x00),
 588	regulator_desc_s2mps13_ldo(24, MIN_800_MV,  STEP_12_5_MV, 0x00),
 589	regulator_desc_s2mps13_ldo(25, MIN_1400_MV, STEP_50_MV,   0x0C),
 590	regulator_desc_s2mps13_ldo(26, MIN_1400_MV, STEP_50_MV,   0x0C),
 591	regulator_desc_s2mps13_ldo(27, MIN_1400_MV, STEP_50_MV,   0x0C),
 592	regulator_desc_s2mps13_ldo(28, MIN_1000_MV, STEP_25_MV,   0x08),
 593	regulator_desc_s2mps13_ldo(29, MIN_1400_MV, STEP_50_MV,   0x0C),
 594	regulator_desc_s2mps13_ldo(30, MIN_1400_MV, STEP_50_MV,   0x0C),
 595	regulator_desc_s2mps13_ldo(31, MIN_1000_MV, STEP_25_MV,   0x08),
 596	regulator_desc_s2mps13_ldo(32, MIN_1000_MV, STEP_25_MV,   0x08),
 597	regulator_desc_s2mps13_ldo(33, MIN_1400_MV, STEP_50_MV,   0x0C),
 598	regulator_desc_s2mps13_ldo(34, MIN_1000_MV, STEP_25_MV,   0x08),
 599	regulator_desc_s2mps13_ldo(35, MIN_1400_MV, STEP_50_MV,   0x0C),
 600	regulator_desc_s2mps13_ldo(36, MIN_800_MV,  STEP_12_5_MV, 0x00),
 601	regulator_desc_s2mps13_ldo(37, MIN_1000_MV, STEP_25_MV,   0x08),
 602	regulator_desc_s2mps13_ldo(38, MIN_1400_MV, STEP_50_MV,   0x0C),
 603	regulator_desc_s2mps13_ldo(39, MIN_1000_MV, STEP_25_MV,   0x08),
 604	regulator_desc_s2mps13_ldo(40, MIN_1400_MV, STEP_50_MV,   0x0C),
 605	regulator_desc_s2mps13_buck(1,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 606	regulator_desc_s2mps13_buck(2,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 607	regulator_desc_s2mps13_buck(3,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 608	regulator_desc_s2mps13_buck(4,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 609	regulator_desc_s2mps13_buck(5,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 610	regulator_desc_s2mps13_buck(6,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 611	regulator_desc_s2mps13_buck7(7,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 612	regulator_desc_s2mps13_buck8_10(8,  MIN_1000_MV, STEP_12_5_MV, 0x20),
 613	regulator_desc_s2mps13_buck8_10(9,  MIN_1000_MV, STEP_12_5_MV, 0x20),
 614	regulator_desc_s2mps13_buck8_10(10, MIN_500_MV,  STEP_6_25_MV, 0x10),
 615};
 616
 617static const struct regulator_ops s2mps14_reg_ops = {
 618	.list_voltage		= regulator_list_voltage_linear,
 619	.map_voltage		= regulator_map_voltage_linear,
 620	.is_enabled		= regulator_is_enabled_regmap,
 621	.enable			= s2mps11_regulator_enable,
 622	.disable		= regulator_disable_regmap,
 623	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
 624	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
 625	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
 626	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
 627};
 628
 629#define regulator_desc_s2mps14_ldo(num, min, step) {	\
 630	.name		= "LDO"#num,			\
 631	.id		= S2MPS14_LDO##num,		\
 632	.ops		= &s2mps14_reg_ops,		\
 633	.type		= REGULATOR_VOLTAGE,		\
 634	.owner		= THIS_MODULE,			\
 635	.min_uV		= min,				\
 636	.uV_step	= step,				\
 637	.n_voltages	= S2MPS14_LDO_N_VOLTAGES,	\
 638	.vsel_reg	= S2MPS14_REG_L1CTRL + num - 1,	\
 639	.vsel_mask	= S2MPS14_LDO_VSEL_MASK,	\
 640	.enable_reg	= S2MPS14_REG_L1CTRL + num - 1,	\
 641	.enable_mask	= S2MPS14_ENABLE_MASK		\
 642}
 643
 644#define regulator_desc_s2mps14_buck(num, min, step, min_sel) {	\
 645	.name		= "BUCK"#num,				\
 646	.id		= S2MPS14_BUCK##num,			\
 647	.ops		= &s2mps14_reg_ops,			\
 648	.type		= REGULATOR_VOLTAGE,			\
 649	.owner		= THIS_MODULE,				\
 650	.min_uV		= min,					\
 651	.uV_step	= step,					\
 652	.n_voltages	= S2MPS14_BUCK_N_VOLTAGES,		\
 653	.linear_min_sel = min_sel,				\
 654	.ramp_delay	= S2MPS14_BUCK_RAMP_DELAY,		\
 655	.vsel_reg	= S2MPS14_REG_B1CTRL2 + (num - 1) * 2,	\
 656	.vsel_mask	= S2MPS14_BUCK_VSEL_MASK,		\
 657	.enable_reg	= S2MPS14_REG_B1CTRL1 + (num - 1) * 2,	\
 658	.enable_mask	= S2MPS14_ENABLE_MASK			\
 659}
 660
 661static const struct regulator_desc s2mps14_regulators[] = {
 662	regulator_desc_s2mps14_ldo(1, MIN_800_MV, STEP_12_5_MV),
 663	regulator_desc_s2mps14_ldo(2, MIN_800_MV, STEP_12_5_MV),
 664	regulator_desc_s2mps14_ldo(3, MIN_800_MV, STEP_25_MV),
 665	regulator_desc_s2mps14_ldo(4, MIN_800_MV, STEP_25_MV),
 666	regulator_desc_s2mps14_ldo(5, MIN_800_MV, STEP_12_5_MV),
 667	regulator_desc_s2mps14_ldo(6, MIN_800_MV, STEP_12_5_MV),
 668	regulator_desc_s2mps14_ldo(7, MIN_800_MV, STEP_25_MV),
 669	regulator_desc_s2mps14_ldo(8, MIN_1800_MV, STEP_25_MV),
 670	regulator_desc_s2mps14_ldo(9, MIN_800_MV, STEP_12_5_MV),
 671	regulator_desc_s2mps14_ldo(10, MIN_800_MV, STEP_12_5_MV),
 672	regulator_desc_s2mps14_ldo(11, MIN_800_MV, STEP_25_MV),
 673	regulator_desc_s2mps14_ldo(12, MIN_1800_MV, STEP_25_MV),
 674	regulator_desc_s2mps14_ldo(13, MIN_1800_MV, STEP_25_MV),
 675	regulator_desc_s2mps14_ldo(14, MIN_1800_MV, STEP_25_MV),
 676	regulator_desc_s2mps14_ldo(15, MIN_1800_MV, STEP_25_MV),
 677	regulator_desc_s2mps14_ldo(16, MIN_1800_MV, STEP_25_MV),
 678	regulator_desc_s2mps14_ldo(17, MIN_1800_MV, STEP_25_MV),
 679	regulator_desc_s2mps14_ldo(18, MIN_1800_MV, STEP_25_MV),
 680	regulator_desc_s2mps14_ldo(19, MIN_800_MV, STEP_25_MV),
 681	regulator_desc_s2mps14_ldo(20, MIN_800_MV, STEP_25_MV),
 682	regulator_desc_s2mps14_ldo(21, MIN_800_MV, STEP_25_MV),
 683	regulator_desc_s2mps14_ldo(22, MIN_800_MV, STEP_12_5_MV),
 684	regulator_desc_s2mps14_ldo(23, MIN_800_MV, STEP_25_MV),
 685	regulator_desc_s2mps14_ldo(24, MIN_1800_MV, STEP_25_MV),
 686	regulator_desc_s2mps14_ldo(25, MIN_1800_MV, STEP_25_MV),
 687	regulator_desc_s2mps14_buck(1, MIN_600_MV, STEP_6_25_MV,
 688				    S2MPS14_BUCK1235_START_SEL),
 689	regulator_desc_s2mps14_buck(2, MIN_600_MV, STEP_6_25_MV,
 690				    S2MPS14_BUCK1235_START_SEL),
 691	regulator_desc_s2mps14_buck(3, MIN_600_MV, STEP_6_25_MV,
 692				    S2MPS14_BUCK1235_START_SEL),
 693	regulator_desc_s2mps14_buck(4, MIN_1400_MV, STEP_12_5_MV,
 694				    S2MPS14_BUCK4_START_SEL),
 695	regulator_desc_s2mps14_buck(5, MIN_600_MV, STEP_6_25_MV,
 696				    S2MPS14_BUCK1235_START_SEL),
 697};
 698
 699static const struct regulator_ops s2mps15_reg_ldo_ops = {
 700	.list_voltage		= regulator_list_voltage_linear_range,
 701	.map_voltage		= regulator_map_voltage_linear_range,
 702	.is_enabled		= regulator_is_enabled_regmap,
 703	.enable			= regulator_enable_regmap,
 704	.disable		= regulator_disable_regmap,
 705	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
 706	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
 707};
 708
 709static const struct regulator_ops s2mps15_reg_buck_ops = {
 710	.list_voltage		= regulator_list_voltage_linear_range,
 711	.map_voltage		= regulator_map_voltage_linear_range,
 712	.is_enabled		= regulator_is_enabled_regmap,
 713	.enable			= regulator_enable_regmap,
 714	.disable		= regulator_disable_regmap,
 715	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
 716	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
 717	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
 718};
 719
 720#define regulator_desc_s2mps15_ldo(num, range) {	\
 721	.name		= "LDO"#num,			\
 722	.id		= S2MPS15_LDO##num,		\
 723	.ops		= &s2mps15_reg_ldo_ops,		\
 724	.type		= REGULATOR_VOLTAGE,		\
 725	.owner		= THIS_MODULE,			\
 726	.linear_ranges	= range,			\
 727	.n_linear_ranges = ARRAY_SIZE(range),		\
 728	.n_voltages	= S2MPS15_LDO_N_VOLTAGES,	\
 729	.vsel_reg	= S2MPS15_REG_L1CTRL + num - 1,	\
 730	.vsel_mask	= S2MPS15_LDO_VSEL_MASK,	\
 731	.enable_reg	= S2MPS15_REG_L1CTRL + num - 1,	\
 732	.enable_mask	= S2MPS15_ENABLE_MASK		\
 733}
 734
 735#define regulator_desc_s2mps15_buck(num, range) {			\
 736	.name		= "BUCK"#num,					\
 737	.id		= S2MPS15_BUCK##num,				\
 738	.ops		= &s2mps15_reg_buck_ops,			\
 739	.type		= REGULATOR_VOLTAGE,				\
 740	.owner		= THIS_MODULE,					\
 741	.linear_ranges	= range,					\
 742	.n_linear_ranges = ARRAY_SIZE(range),				\
 743	.ramp_delay	= 12500,					\
 744	.n_voltages	= S2MPS15_BUCK_N_VOLTAGES,			\
 745	.vsel_reg	= S2MPS15_REG_B1CTRL2 + ((num - 1) * 2),	\
 746	.vsel_mask	= S2MPS15_BUCK_VSEL_MASK,			\
 747	.enable_reg	= S2MPS15_REG_B1CTRL1 + ((num - 1) * 2),	\
 748	.enable_mask	= S2MPS15_ENABLE_MASK				\
 749}
 750
 751/* voltage range for s2mps15 LDO 3, 5, 15, 16, 18, 20, 23 and 27 */
 752static const struct linear_range s2mps15_ldo_voltage_ranges1[] = {
 753	REGULATOR_LINEAR_RANGE(1000000, 0xc, 0x38, 25000),
 754};
 755
 756/* voltage range for s2mps15 LDO 2, 6, 14, 17, 19, 21, 24 and 25 */
 757static const struct linear_range s2mps15_ldo_voltage_ranges2[] = {
 758	REGULATOR_LINEAR_RANGE(1800000, 0x0, 0x3f, 25000),
 759};
 760
 761/* voltage range for s2mps15 LDO 4, 11, 12, 13, 22 and 26 */
 762static const struct linear_range s2mps15_ldo_voltage_ranges3[] = {
 763	REGULATOR_LINEAR_RANGE(700000, 0x0, 0x34, 12500),
 764};
 765
 766/* voltage range for s2mps15 LDO 7, 8, 9 and 10 */
 767static const struct linear_range s2mps15_ldo_voltage_ranges4[] = {
 768	REGULATOR_LINEAR_RANGE(700000, 0x10, 0x20, 25000),
 769};
 770
 771/* voltage range for s2mps15 LDO 1 */
 772static const struct linear_range s2mps15_ldo_voltage_ranges5[] = {
 773	REGULATOR_LINEAR_RANGE(500000, 0x0, 0x20, 12500),
 774};
 775
 776/* voltage range for s2mps15 BUCK 1, 2, 3, 4, 5, 6 and 7 */
 777static const struct linear_range s2mps15_buck_voltage_ranges1[] = {
 778	REGULATOR_LINEAR_RANGE(500000, 0x20, 0xc0, 6250),
 779};
 780
 781/* voltage range for s2mps15 BUCK 8, 9 and 10 */
 782static const struct linear_range s2mps15_buck_voltage_ranges2[] = {
 783	REGULATOR_LINEAR_RANGE(1000000, 0x20, 0x78, 12500),
 784};
 785
 786static const struct regulator_desc s2mps15_regulators[] = {
 787	regulator_desc_s2mps15_ldo(1, s2mps15_ldo_voltage_ranges5),
 788	regulator_desc_s2mps15_ldo(2, s2mps15_ldo_voltage_ranges2),
 789	regulator_desc_s2mps15_ldo(3, s2mps15_ldo_voltage_ranges1),
 790	regulator_desc_s2mps15_ldo(4, s2mps15_ldo_voltage_ranges3),
 791	regulator_desc_s2mps15_ldo(5, s2mps15_ldo_voltage_ranges1),
 792	regulator_desc_s2mps15_ldo(6, s2mps15_ldo_voltage_ranges2),
 793	regulator_desc_s2mps15_ldo(7, s2mps15_ldo_voltage_ranges4),
 794	regulator_desc_s2mps15_ldo(8, s2mps15_ldo_voltage_ranges4),
 795	regulator_desc_s2mps15_ldo(9, s2mps15_ldo_voltage_ranges4),
 796	regulator_desc_s2mps15_ldo(10, s2mps15_ldo_voltage_ranges4),
 797	regulator_desc_s2mps15_ldo(11, s2mps15_ldo_voltage_ranges3),
 798	regulator_desc_s2mps15_ldo(12, s2mps15_ldo_voltage_ranges3),
 799	regulator_desc_s2mps15_ldo(13, s2mps15_ldo_voltage_ranges3),
 800	regulator_desc_s2mps15_ldo(14, s2mps15_ldo_voltage_ranges2),
 801	regulator_desc_s2mps15_ldo(15, s2mps15_ldo_voltage_ranges1),
 802	regulator_desc_s2mps15_ldo(16, s2mps15_ldo_voltage_ranges1),
 803	regulator_desc_s2mps15_ldo(17, s2mps15_ldo_voltage_ranges2),
 804	regulator_desc_s2mps15_ldo(18, s2mps15_ldo_voltage_ranges1),
 805	regulator_desc_s2mps15_ldo(19, s2mps15_ldo_voltage_ranges2),
 806	regulator_desc_s2mps15_ldo(20, s2mps15_ldo_voltage_ranges1),
 807	regulator_desc_s2mps15_ldo(21, s2mps15_ldo_voltage_ranges2),
 808	regulator_desc_s2mps15_ldo(22, s2mps15_ldo_voltage_ranges3),
 809	regulator_desc_s2mps15_ldo(23, s2mps15_ldo_voltage_ranges1),
 810	regulator_desc_s2mps15_ldo(24, s2mps15_ldo_voltage_ranges2),
 811	regulator_desc_s2mps15_ldo(25, s2mps15_ldo_voltage_ranges2),
 812	regulator_desc_s2mps15_ldo(26, s2mps15_ldo_voltage_ranges3),
 813	regulator_desc_s2mps15_ldo(27, s2mps15_ldo_voltage_ranges1),
 814	regulator_desc_s2mps15_buck(1, s2mps15_buck_voltage_ranges1),
 815	regulator_desc_s2mps15_buck(2, s2mps15_buck_voltage_ranges1),
 816	regulator_desc_s2mps15_buck(3, s2mps15_buck_voltage_ranges1),
 817	regulator_desc_s2mps15_buck(4, s2mps15_buck_voltage_ranges1),
 818	regulator_desc_s2mps15_buck(5, s2mps15_buck_voltage_ranges1),
 819	regulator_desc_s2mps15_buck(6, s2mps15_buck_voltage_ranges1),
 820	regulator_desc_s2mps15_buck(7, s2mps15_buck_voltage_ranges1),
 821	regulator_desc_s2mps15_buck(8, s2mps15_buck_voltage_ranges2),
 822	regulator_desc_s2mps15_buck(9, s2mps15_buck_voltage_ranges2),
 823	regulator_desc_s2mps15_buck(10, s2mps15_buck_voltage_ranges2),
 824};
 825
 826static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
 827		struct regulator_dev *rdev)
 828{
 829	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
 830			rdev->desc->enable_mask, S2MPS14_ENABLE_EXT_CONTROL);
 831}
 832
 833static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
 834		struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
 835{
 836	struct gpio_desc **gpio = s2mps11->ext_control_gpiod;
 837	unsigned int i;
 838	unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,
 839		S2MPS14_LDO12 };
 840
 841	for (i = 0; i < ARRAY_SIZE(valid_regulators); i++) {
 842		unsigned int reg = valid_regulators[i];
 843
 844		if (!rdata[reg].init_data || !rdata[reg].of_node)
 845			continue;
 846
 847		gpio[reg] = devm_fwnode_gpiod_get(&pdev->dev,
 848				of_fwnode_handle(rdata[reg].of_node),
 849				"samsung,ext-control",
 850				GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
 851				"s2mps11-regulator");
 852		if (PTR_ERR(gpio[reg]) == -ENOENT)
 853			gpio[reg] = NULL;
 854		else if (IS_ERR(gpio[reg])) {
 855			dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n",
 856				reg, rdata[reg].name);
 857			gpio[reg] = NULL;
 858			continue;
 859		}
 860		if (gpio[reg])
 861			dev_dbg(&pdev->dev, "Using GPIO for ext-control over %d/%s\n",
 862				reg, rdata[reg].name);
 863	}
 864}
 865
 866static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
 867		struct of_regulator_match *rdata, struct s2mps11_info *s2mps11,
 868		unsigned int rdev_num)
 869{
 870	struct device_node *reg_np;
 871
 872	reg_np = of_get_child_by_name(pdev->dev.parent->of_node, "regulators");
 873	if (!reg_np) {
 874		dev_err(&pdev->dev, "could not find regulators sub-node\n");
 875		return -EINVAL;
 876	}
 877
 878	of_regulator_match(&pdev->dev, reg_np, rdata, rdev_num);
 879	if (s2mps11->dev_type == S2MPS14X)
 880		s2mps14_pmic_dt_parse_ext_control_gpio(pdev, rdata, s2mps11);
 881
 882	of_node_put(reg_np);
 883
 884	return 0;
 885}
 886
 887static int s2mpu02_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 888{
 889	unsigned int ramp_val, ramp_shift, ramp_reg;
 890	int rdev_id = rdev_get_id(rdev);
 891
 892	switch (rdev_id) {
 893	case S2MPU02_BUCK1:
 894		ramp_shift = S2MPU02_BUCK1_RAMP_SHIFT;
 895		break;
 896	case S2MPU02_BUCK2:
 897		ramp_shift = S2MPU02_BUCK2_RAMP_SHIFT;
 898		break;
 899	case S2MPU02_BUCK3:
 900		ramp_shift = S2MPU02_BUCK3_RAMP_SHIFT;
 901		break;
 902	case S2MPU02_BUCK4:
 903		ramp_shift = S2MPU02_BUCK4_RAMP_SHIFT;
 904		break;
 905	default:
 906		return 0;
 907	}
 908	ramp_reg = S2MPU02_REG_RAMP1;
 909	ramp_val = get_ramp_delay(ramp_delay);
 910
 911	return regmap_update_bits(rdev->regmap, ramp_reg,
 912				  S2MPU02_BUCK1234_RAMP_MASK << ramp_shift,
 913				  ramp_val << ramp_shift);
 914}
 915
 916static const struct regulator_ops s2mpu02_ldo_ops = {
 917	.list_voltage		= regulator_list_voltage_linear,
 918	.map_voltage		= regulator_map_voltage_linear,
 919	.is_enabled		= regulator_is_enabled_regmap,
 920	.enable			= s2mps11_regulator_enable,
 921	.disable		= regulator_disable_regmap,
 922	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
 923	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
 924	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
 925	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
 926};
 927
 928static const struct regulator_ops s2mpu02_buck_ops = {
 929	.list_voltage		= regulator_list_voltage_linear,
 930	.map_voltage		= regulator_map_voltage_linear,
 931	.is_enabled		= regulator_is_enabled_regmap,
 932	.enable			= s2mps11_regulator_enable,
 933	.disable		= regulator_disable_regmap,
 934	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
 935	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
 936	.set_voltage_time_sel	= regulator_set_voltage_time_sel,
 937	.set_suspend_disable	= s2mps11_regulator_set_suspend_disable,
 938	.set_ramp_delay		= s2mpu02_set_ramp_delay,
 939};
 940
 941#define regulator_desc_s2mpu02_ldo1(num) {		\
 942	.name		= "LDO"#num,			\
 943	.id		= S2MPU02_LDO##num,		\
 944	.ops		= &s2mpu02_ldo_ops,		\
 945	.type		= REGULATOR_VOLTAGE,		\
 946	.owner		= THIS_MODULE,			\
 947	.min_uV		= S2MPU02_LDO_MIN_900MV,	\
 948	.uV_step	= S2MPU02_LDO_STEP_12_5MV,	\
 949	.linear_min_sel	= S2MPU02_LDO_GROUP1_START_SEL,	\
 950	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
 951	.vsel_reg	= S2MPU02_REG_L1CTRL,		\
 952	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
 953	.enable_reg	= S2MPU02_REG_L1CTRL,		\
 954	.enable_mask	= S2MPU02_ENABLE_MASK		\
 955}
 956#define regulator_desc_s2mpu02_ldo2(num) {		\
 957	.name		= "LDO"#num,			\
 958	.id		= S2MPU02_LDO##num,		\
 959	.ops		= &s2mpu02_ldo_ops,		\
 960	.type		= REGULATOR_VOLTAGE,		\
 961	.owner		= THIS_MODULE,			\
 962	.min_uV		= S2MPU02_LDO_MIN_1050MV,	\
 963	.uV_step	= S2MPU02_LDO_STEP_25MV,	\
 964	.linear_min_sel	= S2MPU02_LDO_GROUP2_START_SEL,	\
 965	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
 966	.vsel_reg	= S2MPU02_REG_L2CTRL1,		\
 967	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
 968	.enable_reg	= S2MPU02_REG_L2CTRL1,		\
 969	.enable_mask	= S2MPU02_ENABLE_MASK		\
 970}
 971#define regulator_desc_s2mpu02_ldo3(num) {		\
 972	.name		= "LDO"#num,			\
 973	.id		= S2MPU02_LDO##num,		\
 974	.ops		= &s2mpu02_ldo_ops,		\
 975	.type		= REGULATOR_VOLTAGE,		\
 976	.owner		= THIS_MODULE,			\
 977	.min_uV		= S2MPU02_LDO_MIN_900MV,	\
 978	.uV_step	= S2MPU02_LDO_STEP_12_5MV,	\
 979	.linear_min_sel	= S2MPU02_LDO_GROUP1_START_SEL,	\
 980	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
 981	.vsel_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
 982	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
 983	.enable_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
 984	.enable_mask	= S2MPU02_ENABLE_MASK		\
 985}
 986#define regulator_desc_s2mpu02_ldo4(num) {		\
 987	.name		= "LDO"#num,			\
 988	.id		= S2MPU02_LDO##num,		\
 989	.ops		= &s2mpu02_ldo_ops,		\
 990	.type		= REGULATOR_VOLTAGE,		\
 991	.owner		= THIS_MODULE,			\
 992	.min_uV		= S2MPU02_LDO_MIN_1050MV,	\
 993	.uV_step	= S2MPU02_LDO_STEP_25MV,	\
 994	.linear_min_sel	= S2MPU02_LDO_GROUP2_START_SEL,	\
 995	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
 996	.vsel_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
 997	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
 998	.enable_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
 999	.enable_mask	= S2MPU02_ENABLE_MASK		\
1000}
1001#define regulator_desc_s2mpu02_ldo5(num) {		\
1002	.name		= "LDO"#num,			\
1003	.id		= S2MPU02_LDO##num,		\
1004	.ops		= &s2mpu02_ldo_ops,		\
1005	.type		= REGULATOR_VOLTAGE,		\
1006	.owner		= THIS_MODULE,			\
1007	.min_uV		= S2MPU02_LDO_MIN_1600MV,	\
1008	.uV_step	= S2MPU02_LDO_STEP_50MV,	\
1009	.linear_min_sel	= S2MPU02_LDO_GROUP3_START_SEL,	\
1010	.n_voltages	= S2MPU02_LDO_N_VOLTAGES,	\
1011	.vsel_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
1012	.vsel_mask	= S2MPU02_LDO_VSEL_MASK,	\
1013	.enable_reg	= S2MPU02_REG_L3CTRL + num - 3,	\
1014	.enable_mask	= S2MPU02_ENABLE_MASK		\
1015}
1016
1017#define regulator_desc_s2mpu02_buck1234(num) {			\
1018	.name		= "BUCK"#num,				\
1019	.id		= S2MPU02_BUCK##num,			\
1020	.ops		= &s2mpu02_buck_ops,			\
1021	.type		= REGULATOR_VOLTAGE,			\
1022	.owner		= THIS_MODULE,				\
1023	.min_uV		= S2MPU02_BUCK1234_MIN_600MV,		\
1024	.uV_step	= S2MPU02_BUCK1234_STEP_6_25MV,		\
1025	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
1026	.linear_min_sel = S2MPU02_BUCK1234_START_SEL,		\
1027	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
1028	.vsel_reg	= S2MPU02_REG_B1CTRL2 + (num - 1) * 2,	\
1029	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
1030	.enable_reg	= S2MPU02_REG_B1CTRL1 + (num - 1) * 2,	\
1031	.enable_mask	= S2MPU02_ENABLE_MASK			\
1032}
1033#define regulator_desc_s2mpu02_buck5(num) {			\
1034	.name		= "BUCK"#num,				\
1035	.id		= S2MPU02_BUCK##num,			\
1036	.ops		= &s2mpu02_ldo_ops,			\
1037	.type		= REGULATOR_VOLTAGE,			\
1038	.owner		= THIS_MODULE,				\
1039	.min_uV		= S2MPU02_BUCK5_MIN_1081_25MV,		\
1040	.uV_step	= S2MPU02_BUCK5_STEP_6_25MV,		\
1041	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
1042	.linear_min_sel = S2MPU02_BUCK5_START_SEL,		\
1043	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
1044	.vsel_reg	= S2MPU02_REG_B5CTRL2,			\
1045	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
1046	.enable_reg	= S2MPU02_REG_B5CTRL1,			\
1047	.enable_mask	= S2MPU02_ENABLE_MASK			\
1048}
1049#define regulator_desc_s2mpu02_buck6(num) {			\
1050	.name		= "BUCK"#num,				\
1051	.id		= S2MPU02_BUCK##num,			\
1052	.ops		= &s2mpu02_ldo_ops,			\
1053	.type		= REGULATOR_VOLTAGE,			\
1054	.owner		= THIS_MODULE,				\
1055	.min_uV		= S2MPU02_BUCK6_MIN_1700MV,		\
1056	.uV_step	= S2MPU02_BUCK6_STEP_2_50MV,		\
1057	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
1058	.linear_min_sel = S2MPU02_BUCK6_START_SEL,		\
1059	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
1060	.vsel_reg	= S2MPU02_REG_B6CTRL2,			\
1061	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
1062	.enable_reg	= S2MPU02_REG_B6CTRL1,			\
1063	.enable_mask	= S2MPU02_ENABLE_MASK			\
1064}
1065#define regulator_desc_s2mpu02_buck7(num) {			\
1066	.name		= "BUCK"#num,				\
1067	.id		= S2MPU02_BUCK##num,			\
1068	.ops		= &s2mpu02_ldo_ops,			\
1069	.type		= REGULATOR_VOLTAGE,			\
1070	.owner		= THIS_MODULE,				\
1071	.min_uV		= S2MPU02_BUCK7_MIN_900MV,		\
1072	.uV_step	= S2MPU02_BUCK7_STEP_6_25MV,		\
1073	.n_voltages	= S2MPU02_BUCK_N_VOLTAGES,		\
1074	.linear_min_sel = S2MPU02_BUCK7_START_SEL,		\
1075	.ramp_delay	= S2MPU02_BUCK_RAMP_DELAY,		\
1076	.vsel_reg	= S2MPU02_REG_B7CTRL2,			\
1077	.vsel_mask	= S2MPU02_BUCK_VSEL_MASK,		\
1078	.enable_reg	= S2MPU02_REG_B7CTRL1,			\
1079	.enable_mask	= S2MPU02_ENABLE_MASK			\
1080}
1081
1082static const struct regulator_desc s2mpu02_regulators[] = {
1083	regulator_desc_s2mpu02_ldo1(1),
1084	regulator_desc_s2mpu02_ldo2(2),
1085	regulator_desc_s2mpu02_ldo4(3),
1086	regulator_desc_s2mpu02_ldo5(4),
1087	regulator_desc_s2mpu02_ldo4(5),
1088	regulator_desc_s2mpu02_ldo3(6),
1089	regulator_desc_s2mpu02_ldo3(7),
1090	regulator_desc_s2mpu02_ldo4(8),
1091	regulator_desc_s2mpu02_ldo5(9),
1092	regulator_desc_s2mpu02_ldo3(10),
1093	regulator_desc_s2mpu02_ldo4(11),
1094	regulator_desc_s2mpu02_ldo5(12),
1095	regulator_desc_s2mpu02_ldo5(13),
1096	regulator_desc_s2mpu02_ldo5(14),
1097	regulator_desc_s2mpu02_ldo5(15),
1098	regulator_desc_s2mpu02_ldo5(16),
1099	regulator_desc_s2mpu02_ldo4(17),
1100	regulator_desc_s2mpu02_ldo5(18),
1101	regulator_desc_s2mpu02_ldo3(19),
1102	regulator_desc_s2mpu02_ldo4(20),
1103	regulator_desc_s2mpu02_ldo5(21),
1104	regulator_desc_s2mpu02_ldo5(22),
1105	regulator_desc_s2mpu02_ldo5(23),
1106	regulator_desc_s2mpu02_ldo4(24),
1107	regulator_desc_s2mpu02_ldo5(25),
1108	regulator_desc_s2mpu02_ldo4(26),
1109	regulator_desc_s2mpu02_ldo5(27),
1110	regulator_desc_s2mpu02_ldo5(28),
1111	regulator_desc_s2mpu02_buck1234(1),
1112	regulator_desc_s2mpu02_buck1234(2),
1113	regulator_desc_s2mpu02_buck1234(3),
1114	regulator_desc_s2mpu02_buck1234(4),
1115	regulator_desc_s2mpu02_buck5(5),
1116	regulator_desc_s2mpu02_buck6(6),
1117	regulator_desc_s2mpu02_buck7(7),
1118};
1119
1120static int s2mps11_pmic_probe(struct platform_device *pdev)
1121{
1122	struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
1123	struct sec_platform_data *pdata = NULL;
1124	struct of_regulator_match *rdata = NULL;
1125	struct regulator_config config = { };
1126	struct s2mps11_info *s2mps11;
1127	unsigned int rdev_num = 0;
1128	int i, ret = 0;
1129	const struct regulator_desc *regulators;
1130
1131	s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
1132				GFP_KERNEL);
1133	if (!s2mps11)
1134		return -ENOMEM;
1135
1136	s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
1137	switch (s2mps11->dev_type) {
1138	case S2MPS11X:
1139		rdev_num = ARRAY_SIZE(s2mps11_regulators);
1140		regulators = s2mps11_regulators;
1141		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps11_regulators));
1142		break;
1143	case S2MPS13X:
1144		rdev_num = ARRAY_SIZE(s2mps13_regulators);
1145		regulators = s2mps13_regulators;
1146		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps13_regulators));
1147		break;
1148	case S2MPS14X:
1149		rdev_num = ARRAY_SIZE(s2mps14_regulators);
1150		regulators = s2mps14_regulators;
1151		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps14_regulators));
1152		break;
1153	case S2MPS15X:
1154		rdev_num = ARRAY_SIZE(s2mps15_regulators);
1155		regulators = s2mps15_regulators;
1156		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps15_regulators));
1157		break;
1158	case S2MPU02:
1159		rdev_num = ARRAY_SIZE(s2mpu02_regulators);
1160		regulators = s2mpu02_regulators;
1161		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu02_regulators));
1162		break;
1163	default:
1164		dev_err(&pdev->dev, "Invalid device type: %u\n",
1165				    s2mps11->dev_type);
1166		return -EINVAL;
1167	}
1168
1169	s2mps11->ext_control_gpiod = devm_kcalloc(&pdev->dev, rdev_num,
1170			       sizeof(*s2mps11->ext_control_gpiod), GFP_KERNEL);
1171	if (!s2mps11->ext_control_gpiod)
1172		return -ENOMEM;
1173
1174	if (!iodev->dev->of_node) {
1175		if (iodev->pdata) {
1176			pdata = iodev->pdata;
1177			goto common_reg;
1178		} else {
1179			dev_err(pdev->dev.parent,
1180				"Platform data or DT node not supplied\n");
1181			return -ENODEV;
1182		}
1183	}
1184
1185	rdata = kcalloc(rdev_num, sizeof(*rdata), GFP_KERNEL);
1186	if (!rdata)
1187		return -ENOMEM;
1188
1189	for (i = 0; i < rdev_num; i++)
1190		rdata[i].name = regulators[i].name;
1191
1192	ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11, rdev_num);
1193	if (ret)
1194		goto out;
1195
1196common_reg:
1197	platform_set_drvdata(pdev, s2mps11);
1198
1199	config.dev = &pdev->dev;
1200	config.regmap = iodev->regmap_pmic;
1201	config.driver_data = s2mps11;
1202	for (i = 0; i < rdev_num; i++) {
1203		struct regulator_dev *regulator;
1204
1205		if (pdata) {
1206			config.init_data = pdata->regulators[i].initdata;
1207			config.of_node = pdata->regulators[i].reg_node;
1208		} else {
1209			config.init_data = rdata[i].init_data;
1210			config.of_node = rdata[i].of_node;
1211		}
1212		config.ena_gpiod = s2mps11->ext_control_gpiod[i];
1213		/*
1214		 * Hand the GPIO descriptor management over to the regulator
1215		 * core, remove it from devres management.
1216		 */
1217		if (config.ena_gpiod)
1218			devm_gpiod_unhinge(&pdev->dev, config.ena_gpiod);
1219		regulator = devm_regulator_register(&pdev->dev,
1220						&regulators[i], &config);
1221		if (IS_ERR(regulator)) {
1222			ret = PTR_ERR(regulator);
1223			dev_err(&pdev->dev, "regulator init failed for %d\n",
1224				i);
1225			goto out;
1226		}
1227
1228		if (config.ena_gpiod) {
1229			ret = s2mps14_pmic_enable_ext_control(s2mps11,
1230					regulator);
1231			if (ret < 0) {
1232				dev_err(&pdev->dev,
1233						"failed to enable GPIO control over %s: %d\n",
1234						regulator->desc->name, ret);
1235				goto out;
1236			}
1237		}
1238	}
1239
1240out:
1241	kfree(rdata);
1242
1243	return ret;
1244}
1245
1246static const struct platform_device_id s2mps11_pmic_id[] = {
1247	{ "s2mps11-regulator", S2MPS11X},
1248	{ "s2mps13-regulator", S2MPS13X},
1249	{ "s2mps14-regulator", S2MPS14X},
1250	{ "s2mps15-regulator", S2MPS15X},
1251	{ "s2mpu02-regulator", S2MPU02},
1252	{ },
1253};
1254MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
1255
1256static struct platform_driver s2mps11_pmic_driver = {
1257	.driver = {
1258		.name = "s2mps11-pmic",
1259	},
1260	.probe = s2mps11_pmic_probe,
1261	.id_table = s2mps11_pmic_id,
1262};
1263
1264module_platform_driver(s2mps11_pmic_driver);
1265
1266/* Module information */
1267MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
1268MODULE_DESCRIPTION("Samsung S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver");
1269MODULE_LICENSE("GPL");