cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

s2mps11.c (42094B)


      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 of_regulator_match *rdata = NULL;
   1124	struct regulator_config config = { };
   1125	struct s2mps11_info *s2mps11;
   1126	unsigned int rdev_num = 0;
   1127	int i, ret = 0;
   1128	const struct regulator_desc *regulators;
   1129
   1130	s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
   1131				GFP_KERNEL);
   1132	if (!s2mps11)
   1133		return -ENOMEM;
   1134
   1135	s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
   1136	switch (s2mps11->dev_type) {
   1137	case S2MPS11X:
   1138		rdev_num = ARRAY_SIZE(s2mps11_regulators);
   1139		regulators = s2mps11_regulators;
   1140		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps11_regulators));
   1141		break;
   1142	case S2MPS13X:
   1143		rdev_num = ARRAY_SIZE(s2mps13_regulators);
   1144		regulators = s2mps13_regulators;
   1145		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps13_regulators));
   1146		break;
   1147	case S2MPS14X:
   1148		rdev_num = ARRAY_SIZE(s2mps14_regulators);
   1149		regulators = s2mps14_regulators;
   1150		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps14_regulators));
   1151		break;
   1152	case S2MPS15X:
   1153		rdev_num = ARRAY_SIZE(s2mps15_regulators);
   1154		regulators = s2mps15_regulators;
   1155		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps15_regulators));
   1156		break;
   1157	case S2MPU02:
   1158		rdev_num = ARRAY_SIZE(s2mpu02_regulators);
   1159		regulators = s2mpu02_regulators;
   1160		BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu02_regulators));
   1161		break;
   1162	default:
   1163		dev_err(&pdev->dev, "Invalid device type: %u\n",
   1164				    s2mps11->dev_type);
   1165		return -EINVAL;
   1166	}
   1167
   1168	s2mps11->ext_control_gpiod = devm_kcalloc(&pdev->dev, rdev_num,
   1169			       sizeof(*s2mps11->ext_control_gpiod), GFP_KERNEL);
   1170	if (!s2mps11->ext_control_gpiod)
   1171		return -ENOMEM;
   1172
   1173	rdata = kcalloc(rdev_num, sizeof(*rdata), GFP_KERNEL);
   1174	if (!rdata)
   1175		return -ENOMEM;
   1176
   1177	for (i = 0; i < rdev_num; i++)
   1178		rdata[i].name = regulators[i].name;
   1179
   1180	ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11, rdev_num);
   1181	if (ret)
   1182		goto out;
   1183
   1184	platform_set_drvdata(pdev, s2mps11);
   1185
   1186	config.dev = &pdev->dev;
   1187	config.regmap = iodev->regmap_pmic;
   1188	config.driver_data = s2mps11;
   1189	for (i = 0; i < rdev_num; i++) {
   1190		struct regulator_dev *regulator;
   1191
   1192		config.init_data = rdata[i].init_data;
   1193		config.of_node = rdata[i].of_node;
   1194		config.ena_gpiod = s2mps11->ext_control_gpiod[i];
   1195		/*
   1196		 * Hand the GPIO descriptor management over to the regulator
   1197		 * core, remove it from devres management.
   1198		 */
   1199		if (config.ena_gpiod)
   1200			devm_gpiod_unhinge(&pdev->dev, config.ena_gpiod);
   1201		regulator = devm_regulator_register(&pdev->dev,
   1202						&regulators[i], &config);
   1203		if (IS_ERR(regulator)) {
   1204			ret = PTR_ERR(regulator);
   1205			dev_err(&pdev->dev, "regulator init failed for %d\n",
   1206				i);
   1207			goto out;
   1208		}
   1209
   1210		if (config.ena_gpiod) {
   1211			ret = s2mps14_pmic_enable_ext_control(s2mps11,
   1212					regulator);
   1213			if (ret < 0) {
   1214				dev_err(&pdev->dev,
   1215						"failed to enable GPIO control over %s: %d\n",
   1216						regulator->desc->name, ret);
   1217				goto out;
   1218			}
   1219		}
   1220	}
   1221
   1222out:
   1223	kfree(rdata);
   1224
   1225	return ret;
   1226}
   1227
   1228static const struct platform_device_id s2mps11_pmic_id[] = {
   1229	{ "s2mps11-regulator", S2MPS11X},
   1230	{ "s2mps13-regulator", S2MPS13X},
   1231	{ "s2mps14-regulator", S2MPS14X},
   1232	{ "s2mps15-regulator", S2MPS15X},
   1233	{ "s2mpu02-regulator", S2MPU02},
   1234	{ },
   1235};
   1236MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
   1237
   1238static struct platform_driver s2mps11_pmic_driver = {
   1239	.driver = {
   1240		.name = "s2mps11-pmic",
   1241	},
   1242	.probe = s2mps11_pmic_probe,
   1243	.id_table = s2mps11_pmic_id,
   1244};
   1245
   1246module_platform_driver(s2mps11_pmic_driver);
   1247
   1248/* Module information */
   1249MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
   1250MODULE_DESCRIPTION("Samsung S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver");
   1251MODULE_LICENSE("GPL");