brintos

brintos / linux-shallow public Read only

0
0
Text · 64.2 KiB · 01a8d04 Raw
1967 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Regulator driver for Rockchip RK805/RK808/RK8184 *5 * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd6 * Copyright (c) 2021 Rockchip Electronics Co., Ltd.7 *8 * Author: Chris Zhong <zyw@rock-chips.com>9 * Author: Zhang Qing <zhangqing@rock-chips.com>10 * Author: Xu Shengfei <xsf@rock-chips.com>11 *12 * Copyright (C) 2016 PHYTEC Messtechnik GmbH13 *14 * Author: Wadim Egorov <w.egorov@phytec.de>15 */16 17#include <linux/delay.h>18#include <linux/module.h>19#include <linux/of.h>20#include <linux/mfd/rk808.h>21#include <linux/platform_device.h>22#include <linux/regulator/driver.h>23#include <linux/regulator/of_regulator.h>24#include <linux/gpio/consumer.h>25 26/* Field Definitions */27#define RK808_BUCK_VSEL_MASK	0x3f28#define RK808_BUCK4_VSEL_MASK	0xf29#define RK808_LDO_VSEL_MASK	0x1f30 31#define RK809_BUCK5_VSEL_MASK		0x732 33#define RK817_LDO_VSEL_MASK		0x7f34#define RK817_BOOST_VSEL_MASK		0x735#define RK817_BUCK_VSEL_MASK		0x7f36 37#define RK818_BUCK_VSEL_MASK		0x3f38#define RK818_BUCK4_VSEL_MASK		0x1f39#define RK818_LDO_VSEL_MASK		0x1f40#define RK818_LDO3_ON_VSEL_MASK		0xf41#define RK818_BOOST_ON_VSEL_MASK	0xe042 43#define RK806_DCDC_SLP_REG_OFFSET	0x0A44#define RK806_NLDO_SLP_REG_OFFSET	0x0545#define RK806_PLDO_SLP_REG_OFFSET	0x0646 47#define RK806_BUCK_SEL_CNT		0xff48#define RK806_LDO_SEL_CNT		0xff49 50/* Ramp rate definitions for buck1 / buck2 only */51#define RK808_RAMP_RATE_OFFSET		352#define RK808_RAMP_RATE_MASK		(3 << RK808_RAMP_RATE_OFFSET)53#define RK808_RAMP_RATE_2MV_PER_US	(0 << RK808_RAMP_RATE_OFFSET)54#define RK808_RAMP_RATE_4MV_PER_US	(1 << RK808_RAMP_RATE_OFFSET)55#define RK808_RAMP_RATE_6MV_PER_US	(2 << RK808_RAMP_RATE_OFFSET)56#define RK808_RAMP_RATE_10MV_PER_US	(3 << RK808_RAMP_RATE_OFFSET)57 58#define RK808_DVS2_POL		BIT(2)59#define RK808_DVS1_POL		BIT(1)60 61/* Offset from XXX_ON_VSEL to XXX_SLP_VSEL */62#define RK808_SLP_REG_OFFSET 163 64/* Offset from XXX_ON_VSEL to XXX_DVS_VSEL */65#define RK808_DVS_REG_OFFSET 266 67/* Offset from XXX_EN_REG to SLEEP_SET_OFF_XXX */68#define RK808_SLP_SET_OFF_REG_OFFSET 269 70/* max steps for increase voltage of Buck1/2, equal 100mv*/71#define MAX_STEPS_ONE_TIME 872 73#define ENABLE_MASK(id)			(BIT(id) | BIT(4 + (id)))74#define DISABLE_VAL(id)			(BIT(4 + (id)))75 76#define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg,\77	_vmask, _ereg, _emask, _enval, _disval, _etime, m_drop)		\78	{							\79		.name		= (_match),				\80		.supply_name	= (_supply),				\81		.of_match	= of_match_ptr(_match),			\82		.regulators_node = of_match_ptr("regulators"),		\83		.type		= REGULATOR_VOLTAGE,			\84		.id		= (_id),				\85		.n_voltages	= (((_max) - (_min)) / (_step) + 1),	\86		.owner		= THIS_MODULE,				\87		.min_uV		= (_min) * 1000,			\88		.uV_step	= (_step) * 1000,			\89		.vsel_reg	= (_vreg),				\90		.vsel_mask	= (_vmask),				\91		.enable_reg	= (_ereg),				\92		.enable_mask	= (_emask),				\93		.enable_val     = (_enval),				\94		.disable_val     = (_disval),				\95		.enable_time	= (_etime),				\96		.min_dropout_uV = (m_drop) * 1000,			\97		.ops		= &rk817_boost_ops,			\98	}99 100#define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,	\101	_vmask, _ereg, _emask, _enval, _disval, _etime, _ops)		\102	{								\103		.name		= (_match),				\104		.supply_name	= (_supply),				\105		.of_match	= of_match_ptr(_match),			\106		.regulators_node = of_match_ptr("regulators"),		\107		.type		= REGULATOR_VOLTAGE,			\108		.id		= (_id),				\109		.n_voltages	= (((_max) - (_min)) / (_step) + 1),	\110		.owner		= THIS_MODULE,				\111		.min_uV		= (_min) * 1000,			\112		.uV_step	= (_step) * 1000,			\113		.vsel_reg	= (_vreg),				\114		.vsel_mask	= (_vmask),				\115		.enable_reg	= (_ereg),				\116		.enable_mask	= (_emask),				\117		.enable_val     = (_enval),				\118		.disable_val     = (_disval),				\119		.enable_time	= (_etime),				\120		.ops		= _ops,			\121	}122 123#define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg,	\124	_vmask, _ereg, _emask, _etime)					\125	RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,	\126	_vmask, _ereg, _emask, 0, 0, _etime, &rk805_reg_ops)127 128#define RK806_REGULATOR(_name, _supply_name, _id, _ops,\129			_n_voltages, _vr, _er, _lr, ctrl_bit,\130			_rr, _rm, _rt)\131[_id] = {\132		.name = _name,\133		.supply_name = _supply_name,\134		.of_match = of_match_ptr(_name),\135		.regulators_node = of_match_ptr("regulators"),\136		.id = _id,\137		.ops = &_ops,\138		.type = REGULATOR_VOLTAGE,\139		.n_voltages = _n_voltages,\140		.linear_ranges = _lr,\141		.n_linear_ranges = ARRAY_SIZE(_lr),\142		.vsel_reg = _vr,\143		.vsel_mask = 0xff,\144		.enable_reg = _er,\145		.enable_mask = ENABLE_MASK(ctrl_bit),\146		.enable_val = ENABLE_MASK(ctrl_bit),\147		.disable_val = DISABLE_VAL(ctrl_bit),\148		.of_map_mode = rk8xx_regulator_of_map_mode,\149		.ramp_reg = _rr,\150		.ramp_mask = _rm,\151		.ramp_delay_table = _rt, \152		.n_ramp_values = ARRAY_SIZE(_rt), \153		.owner = THIS_MODULE,\154	}155 156#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg,	\157	_vmask, _ereg, _emask, _etime)					\158	RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,	\159	_vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops)160 161#define RK816_DESC(_id, _match, _supply, _min, _max, _step, _vreg,	\162	_vmask, _ereg, _emask, _disval, _etime)				\163	RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,	\164	_vmask, _ereg, _emask, _emask, _disval, _etime, &rk816_reg_ops)165 166#define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg,	\167	_vmask, _ereg, _emask, _disval, _etime)				\168	RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,	\169	_vmask, _ereg, _emask, _emask, _disval, _etime, &rk817_reg_ops)170 171#define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,	\172	_enval, _disval, _ops)						\173	{								\174		.name		= (_match),				\175		.supply_name	= (_supply),				\176		.of_match	= of_match_ptr(_match),			\177		.regulators_node = of_match_ptr("regulators"),		\178		.type		= REGULATOR_VOLTAGE,			\179		.id		= (_id),				\180		.enable_reg	= (_ereg),				\181		.enable_mask	= (_emask),				\182		.enable_val     = (_enval),				\183		.disable_val     = (_disval),				\184		.owner		= THIS_MODULE,				\185		.ops		= _ops					\186	}187 188#define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask,		\189	_disval)							\190	RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,	\191	_emask, _disval, &rk817_switch_ops)192 193#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask)		\194	RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,	\195	0, 0, &rk808_switch_ops)196 197struct rk8xx_register_bit {198	u8 reg;199	u8 bit;200};201 202#define RK8XX_REG_BIT(_reg, _bit)					\203	{								\204		.reg = _reg,						\205		.bit = BIT(_bit),						\206	}207 208struct rk808_regulator_data {209	struct gpio_desc *dvs_gpio[2];210};211 212static const struct linear_range rk808_ldo3_voltage_ranges[] = {213	REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),214	REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),215};216 217#define RK809_BUCK5_SEL_CNT		(8)218 219static const struct linear_range rk809_buck5_voltage_ranges[] = {220	REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0),221	REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000),222	REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000),223	REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000),224};225 226#define RK817_BUCK1_MIN0 500000227#define RK817_BUCK1_MAX0 1500000228 229#define RK817_BUCK1_MIN1 1600000230#define RK817_BUCK1_MAX1 2400000231 232#define RK817_BUCK3_MAX1 3400000233 234#define RK817_BUCK1_STP0 12500235#define RK817_BUCK1_STP1 100000236 237#define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) /\238						  RK817_BUCK1_STP0)239#define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) /\240						  RK817_BUCK1_STP1)241 242#define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) /\243						  RK817_BUCK1_STP1)244 245#define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1)246#define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1)247 248static const struct linear_range rk817_buck1_voltage_ranges[] = {249	REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,250			       RK817_BUCK1_SEL0, RK817_BUCK1_STP0),251	REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,252			       RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1),253};254 255static const struct linear_range rk817_buck3_voltage_ranges[] = {256	REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,257			       RK817_BUCK1_SEL0, RK817_BUCK1_STP0),258	REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,259			       RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1),260};261 262static const unsigned int rk808_buck1_2_ramp_table[] = {263	2000, 4000, 6000, 10000264};265 266/* RK817/RK809/RK816 (buck 1/2 only) */267static const unsigned int rk817_buck1_4_ramp_table[] = {268	3000, 6300, 12500, 25000269};270 271static int rk806_set_mode_dcdc(struct regulator_dev *rdev, unsigned int mode)272{273	int rid = rdev_get_id(rdev);274	int ctr_bit, reg;275 276	reg = RK806_POWER_FPWM_EN0 + rid / 8;277	ctr_bit = rid % 8;278 279	switch (mode) {280	case REGULATOR_MODE_FAST:281		return regmap_update_bits(rdev->regmap, reg,282					  PWM_MODE_MSK << ctr_bit,283					  FPWM_MODE << ctr_bit);284	case REGULATOR_MODE_NORMAL:285		return regmap_update_bits(rdev->regmap, reg,286					  PWM_MODE_MSK << ctr_bit,287					  AUTO_PWM_MODE << ctr_bit);288	default:289		dev_err(rdev_get_dev(rdev), "mode unsupported: %u\n", mode);290		return -EINVAL;291	}292 293	return 0;294}295 296static unsigned int rk806_get_mode_dcdc(struct regulator_dev *rdev)297{298	int rid = rdev_get_id(rdev);299	int ctr_bit, reg;300	unsigned int val;301	int err;302 303	reg = RK806_POWER_FPWM_EN0 + rid / 8;304	ctr_bit = rid % 8;305 306	err = regmap_read(rdev->regmap, reg, &val);307	if (err)308		return err;309 310	if ((val >> ctr_bit) & FPWM_MODE)311		return REGULATOR_MODE_FAST;312	else313		return REGULATOR_MODE_NORMAL;314}315 316static const struct rk8xx_register_bit rk806_dcdc_rate2[] = {317	RK8XX_REG_BIT(0xEB, 0),318	RK8XX_REG_BIT(0xEB, 1),319	RK8XX_REG_BIT(0xEB, 2),320	RK8XX_REG_BIT(0xEB, 3),321	RK8XX_REG_BIT(0xEB, 4),322	RK8XX_REG_BIT(0xEB, 5),323	RK8XX_REG_BIT(0xEB, 6),324	RK8XX_REG_BIT(0xEB, 7),325	RK8XX_REG_BIT(0xEA, 0),326	RK8XX_REG_BIT(0xEA, 1),327};328 329static const unsigned int rk806_ramp_delay_table_dcdc[] = {330	50000, 25000, 12500, 6250, 3125, 1560, 961, 390331};332 333static int rk806_set_ramp_delay_dcdc(struct regulator_dev *rdev, int ramp_delay)334{335	int rid = rdev_get_id(rdev);336	int regval, ramp_value, ret;337 338	ret = regulator_find_closest_bigger(ramp_delay, rdev->desc->ramp_delay_table,339					    rdev->desc->n_ramp_values, &ramp_value);340	if (ret) {341		dev_warn(rdev_get_dev(rdev),342			 "Can't set ramp-delay %u, setting %u\n", ramp_delay,343			 rdev->desc->ramp_delay_table[ramp_value]);344	}345 346	regval = ramp_value << (ffs(rdev->desc->ramp_mask) - 1);347 348	ret = regmap_update_bits(rdev->regmap, rdev->desc->ramp_reg,349				 rdev->desc->ramp_mask, regval);350	if (ret)351		return ret;352 353	/*354	 * The above is effectively a copy of regulator_set_ramp_delay_regmap(),355	 * but that only stores the lower 2 bits for rk806 DCDC ramp. The MSB must356	 * be stored in a separate register, so this open codes the implementation357	 * to have access to the ramp_value.358	 */359 360	regval = (ramp_value >> 2) & 0x1 ? rk806_dcdc_rate2[rid].bit : 0;361	return regmap_update_bits(rdev->regmap, rk806_dcdc_rate2[rid].reg,362				  rk806_dcdc_rate2[rid].bit,363				  regval);364}365 366static const unsigned int rk806_ramp_delay_table_ldo[] = {367	100000, 50000, 25000, 12500, 6280, 3120, 1900, 780368};369 370static int rk806_set_suspend_voltage_range(struct regulator_dev *rdev, int reg_offset, int uv)371{372	int sel = regulator_map_voltage_linear_range(rdev, uv, uv);373	unsigned int reg;374 375	if (sel < 0)376		return -EINVAL;377 378	reg = rdev->desc->vsel_reg + reg_offset;379 380	return regmap_update_bits(rdev->regmap, reg, rdev->desc->vsel_mask, sel);381}382 383static int rk806_set_suspend_voltage_range_dcdc(struct regulator_dev *rdev, int uv)384{385	return rk806_set_suspend_voltage_range(rdev, RK806_DCDC_SLP_REG_OFFSET, uv);386}387 388static int rk806_set_suspend_voltage_range_nldo(struct regulator_dev *rdev, int uv)389{390	return rk806_set_suspend_voltage_range(rdev, RK806_NLDO_SLP_REG_OFFSET, uv);391}392 393static int rk806_set_suspend_voltage_range_pldo(struct regulator_dev *rdev, int uv)394{395	return rk806_set_suspend_voltage_range(rdev, RK806_PLDO_SLP_REG_OFFSET, uv);396}397 398static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)399{400	struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);401	int id = rdev_get_id(rdev);402	struct gpio_desc *gpio = pdata->dvs_gpio[id];403	unsigned int val;404	int ret;405 406	if (!gpio || gpiod_get_value(gpio) == 0)407		return regulator_get_voltage_sel_regmap(rdev);408 409	ret = regmap_read(rdev->regmap,410			  rdev->desc->vsel_reg + RK808_DVS_REG_OFFSET,411			  &val);412	if (ret != 0)413		return ret;414 415	val &= rdev->desc->vsel_mask;416	val >>= ffs(rdev->desc->vsel_mask) - 1;417 418	return val;419}420 421static int rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev,422					     unsigned sel)423{424	int ret, delta_sel;425	unsigned int old_sel, tmp, val, mask = rdev->desc->vsel_mask;426 427	ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);428	if (ret != 0)429		return ret;430 431	tmp = val & ~mask;432	old_sel = val & mask;433	old_sel >>= ffs(mask) - 1;434	delta_sel = sel - old_sel;435 436	/*437	 * If directly modify the register to change the voltage, we will face438	 * the risk of overshoot. Put it into a multi-step, can effectively439	 * avoid this problem, a step is 100mv here.440	 */441	while (delta_sel > MAX_STEPS_ONE_TIME) {442		old_sel += MAX_STEPS_ONE_TIME;443		val = old_sel << (ffs(mask) - 1);444		val |= tmp;445 446		/*447		 * i2c is 400kHz (2.5us per bit) and we must transmit _at least_448		 * 3 bytes (24 bits) plus start and stop so 26 bits.  So we've449		 * got more than 65 us between each voltage change and thus450		 * won't ramp faster than ~1500 uV / us.451		 */452		ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);453		delta_sel = sel - old_sel;454	}455 456	sel <<= ffs(mask) - 1;457	val = tmp | sel;458	ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);459 460	/*461	 * When we change the voltage register directly, the ramp rate is about462	 * 100000uv/us, wait 1us to make sure the target voltage to be stable,463	 * so we needn't wait extra time after that.464	 */465	udelay(1);466 467	return ret;468}469 470static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,471					 unsigned sel)472{473	struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);474	int id = rdev_get_id(rdev);475	struct gpio_desc *gpio = pdata->dvs_gpio[id];476	unsigned int reg = rdev->desc->vsel_reg;477	unsigned old_sel;478	int ret, gpio_level;479 480	if (!gpio)481		return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);482 483	gpio_level = gpiod_get_value(gpio);484	if (gpio_level == 0) {485		reg += RK808_DVS_REG_OFFSET;486		ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &old_sel);487	} else {488		ret = regmap_read(rdev->regmap,489				  reg + RK808_DVS_REG_OFFSET,490				  &old_sel);491	}492 493	if (ret != 0)494		return ret;495 496	sel <<= ffs(rdev->desc->vsel_mask) - 1;497	sel |= old_sel & ~rdev->desc->vsel_mask;498 499	ret = regmap_write(rdev->regmap, reg, sel);500	if (ret)501		return ret;502 503	gpiod_set_value(gpio, !gpio_level);504 505	return ret;506}507 508static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,509				       unsigned int old_selector,510				       unsigned int new_selector)511{512	struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);513	int id = rdev_get_id(rdev);514	struct gpio_desc *gpio = pdata->dvs_gpio[id];515 516	/* if there is no dvs1/2 pin, we don't need wait extra time here. */517	if (!gpio)518		return 0;519 520	return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);521}522 523static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)524{525	unsigned int reg;526	int sel = regulator_map_voltage_linear(rdev, uv, uv);527 528	if (sel < 0)529		return -EINVAL;530 531	reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;532 533	return regmap_update_bits(rdev->regmap, reg,534				  rdev->desc->vsel_mask,535				  sel);536}537 538static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)539{540	unsigned int reg;541	int sel = regulator_map_voltage_linear_range(rdev, uv, uv);542	int ret;543 544	if (sel < 0)545		return -EINVAL;546 547	reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;548 549	ret = regmap_update_bits(rdev->regmap, reg,550				 rdev->desc->vsel_mask,551				 sel);552	if (ret)553		return ret;554 555	if (rdev->desc->apply_bit)556		ret = regmap_update_bits(rdev->regmap, rdev->desc->apply_reg,557					 rdev->desc->apply_bit,558					 rdev->desc->apply_bit);559 560	return ret;561}562 563static int rk805_set_suspend_enable(struct regulator_dev *rdev)564{565	unsigned int reg;566 567	reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;568 569	return regmap_update_bits(rdev->regmap, reg,570				  rdev->desc->enable_mask,571				  rdev->desc->enable_mask);572}573 574static int rk805_set_suspend_disable(struct regulator_dev *rdev)575{576	unsigned int reg;577 578	reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;579 580	return regmap_update_bits(rdev->regmap, reg,581				  rdev->desc->enable_mask,582				  0);583}584 585static const struct rk8xx_register_bit rk806_suspend_bits[] = {586	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 0),587	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 1),588	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 2),589	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 3),590	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 4),591	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 5),592	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 6),593	RK8XX_REG_BIT(RK806_POWER_SLP_EN0, 7),594	RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 6),595	RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 7),596	RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 0),597	RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 1),598	RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 2),599	RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 3),600	RK8XX_REG_BIT(RK806_POWER_SLP_EN1, 4),601	RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 1),602	RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 2),603	RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 3),604	RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 4),605	RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 5),606	RK8XX_REG_BIT(RK806_POWER_SLP_EN2, 0),607};608 609static int rk806_set_suspend_enable(struct regulator_dev *rdev)610{611	int rid = rdev_get_id(rdev);612 613	return regmap_update_bits(rdev->regmap, rk806_suspend_bits[rid].reg,614				  rk806_suspend_bits[rid].bit,615				  rk806_suspend_bits[rid].bit);616}617 618static int rk806_set_suspend_disable(struct regulator_dev *rdev)619{620	int rid = rdev_get_id(rdev);621 622	return regmap_update_bits(rdev->regmap, rk806_suspend_bits[rid].reg,623				  rk806_suspend_bits[rid].bit, 0);624}625 626static int rk808_set_suspend_enable(struct regulator_dev *rdev)627{628	unsigned int reg;629 630	reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;631 632	return regmap_update_bits(rdev->regmap, reg,633				  rdev->desc->enable_mask,634				  0);635}636 637static int rk808_set_suspend_disable(struct regulator_dev *rdev)638{639	unsigned int reg;640 641	reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;642 643	return regmap_update_bits(rdev->regmap, reg,644				  rdev->desc->enable_mask,645				  rdev->desc->enable_mask);646}647 648static const struct rk8xx_register_bit rk816_suspend_bits[] = {649	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG1, 0),650	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG1, 1),651	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG1, 2),652	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG1, 3),653	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG2, 0),654	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG2, 1),655	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG2, 2),656	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG2, 3),657	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG2, 4),658	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG2, 5),659	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG1, 5),660	RK8XX_REG_BIT(RK818_SLEEP_SET_OFF_REG1, 6),661};662 663static int rk816_set_suspend_enable(struct regulator_dev *rdev)664{665	int rid = rdev_get_id(rdev);666 667	return regmap_update_bits(rdev->regmap, rk816_suspend_bits[rid].reg,668				  rk816_suspend_bits[rid].bit,669				  rk816_suspend_bits[rid].bit);670}671 672static int rk816_set_suspend_disable(struct regulator_dev *rdev)673{674	int rid = rdev_get_id(rdev);675 676	return regmap_update_bits(rdev->regmap, rk816_suspend_bits[rid].reg,677				  rk816_suspend_bits[rid].bit, 0);678}679 680static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev,681					 unsigned int en)682{683	unsigned int reg;684	int id = rdev_get_id(rdev);685	unsigned int id_slp, msk, val;686 687	if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4)688		id_slp = id;689	else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8)690		id_slp = 8 + (id - RK817_ID_LDO1);691	else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2)692		id_slp = 4 + (id - RK817_ID_LDO9);693	else694		return -EINVAL;695 696	reg = RK817_POWER_SLP_EN_REG(id_slp / 8);697 698	msk = BIT(id_slp % 8);699	if (en)700		val = msk;701	else702		val = 0;703 704	return regmap_update_bits(rdev->regmap, reg, msk, val);705}706 707static int rk817_set_suspend_enable(struct regulator_dev *rdev)708{709	return rk817_set_suspend_enable_ctrl(rdev, 1);710}711 712static int rk817_set_suspend_disable(struct regulator_dev *rdev)713{714	return rk817_set_suspend_enable_ctrl(rdev, 0);715}716 717static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)718{719	unsigned int reg;720 721	reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;722 723	switch (mode) {724	case REGULATOR_MODE_FAST:725		return regmap_update_bits(rdev->regmap, reg,726					  PWM_MODE_MSK, FPWM_MODE);727	case REGULATOR_MODE_NORMAL:728		return regmap_update_bits(rdev->regmap, reg,729					  PWM_MODE_MSK, AUTO_PWM_MODE);730	default:731		dev_err(&rdev->dev, "do not support this mode\n");732		return -EINVAL;733	}734 735	return 0;736}737 738static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)739{740	switch (mode) {741	case REGULATOR_MODE_FAST:742		return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,743					  PWM_MODE_MSK, FPWM_MODE);744	case REGULATOR_MODE_NORMAL:745		return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,746					  PWM_MODE_MSK, AUTO_PWM_MODE);747	default:748		dev_err(&rdev->dev, "do not support this mode\n");749		return -EINVAL;750	}751 752	return 0;753}754 755static unsigned int rk8xx_get_mode(struct regulator_dev *rdev)756{757	unsigned int val;758	int err;759 760	err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);761	if (err)762		return err;763 764	if (val & FPWM_MODE)765		return REGULATOR_MODE_FAST;766	else767		return REGULATOR_MODE_NORMAL;768}769 770static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)771{772	unsigned int val;773	int ret;774 775	ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);776	if (ret != 0)777		return ret;778 779	/* add write mask bit */780	val |= (rdev->desc->enable_mask & 0xf0);781	val &= rdev->desc->enable_mask;782 783	if (rdev->desc->enable_is_inverted) {784		if (rdev->desc->enable_val)785			return val != rdev->desc->enable_val;786		return (val == 0);787	}788	if (rdev->desc->enable_val)789		return val == rdev->desc->enable_val;790	return val != 0;791}792 793static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode)794{795	switch (mode) {796	case 1:797		return REGULATOR_MODE_FAST;798	case 2:799		return REGULATOR_MODE_NORMAL;800	default:801		return REGULATOR_MODE_INVALID;802	}803}804 805static const struct regulator_ops rk805_reg_ops = {806	.list_voltage           = regulator_list_voltage_linear,807	.map_voltage            = regulator_map_voltage_linear,808	.get_voltage_sel        = regulator_get_voltage_sel_regmap,809	.set_voltage_sel        = regulator_set_voltage_sel_regmap,810	.enable                 = regulator_enable_regmap,811	.disable                = regulator_disable_regmap,812	.is_enabled             = regulator_is_enabled_regmap,813	.set_suspend_voltage    = rk808_set_suspend_voltage,814	.set_suspend_enable     = rk805_set_suspend_enable,815	.set_suspend_disable    = rk805_set_suspend_disable,816};817 818static const struct regulator_ops rk805_switch_ops = {819	.enable                 = regulator_enable_regmap,820	.disable                = regulator_disable_regmap,821	.is_enabled             = regulator_is_enabled_regmap,822	.set_suspend_enable     = rk805_set_suspend_enable,823	.set_suspend_disable    = rk805_set_suspend_disable,824};825 826static const struct regulator_ops rk806_ops_dcdc = {827	.list_voltage		= regulator_list_voltage_linear_range,828	.map_voltage		= regulator_map_voltage_linear_range,829	.get_voltage_sel	= regulator_get_voltage_sel_regmap,830	.set_voltage_sel        = regulator_set_voltage_sel_regmap,831	.set_voltage_time_sel	= regulator_set_voltage_time_sel,832	.set_mode		= rk806_set_mode_dcdc,833	.get_mode		= rk806_get_mode_dcdc,834 835	.enable			= regulator_enable_regmap,836	.disable		= regulator_disable_regmap,837	.is_enabled		= rk8xx_is_enabled_wmsk_regmap,838 839	.set_suspend_mode	= rk806_set_mode_dcdc,840	.set_ramp_delay		= rk806_set_ramp_delay_dcdc,841 842	.set_suspend_voltage	= rk806_set_suspend_voltage_range_dcdc,843	.set_suspend_enable	= rk806_set_suspend_enable,844	.set_suspend_disable	= rk806_set_suspend_disable,845};846 847static const struct regulator_ops rk806_ops_nldo = {848	.list_voltage		= regulator_list_voltage_linear_range,849	.map_voltage		= regulator_map_voltage_linear_range,850	.get_voltage_sel	= regulator_get_voltage_sel_regmap,851	.set_voltage_sel        = regulator_set_voltage_sel_regmap,852	.set_voltage_time_sel	= regulator_set_voltage_time_sel,853 854	.enable			= regulator_enable_regmap,855	.disable		= regulator_disable_regmap,856	.is_enabled		= regulator_is_enabled_regmap,857 858	.set_ramp_delay		= regulator_set_ramp_delay_regmap,859 860	.set_suspend_voltage	= rk806_set_suspend_voltage_range_nldo,861	.set_suspend_enable	= rk806_set_suspend_enable,862	.set_suspend_disable	= rk806_set_suspend_disable,863};864 865static const struct regulator_ops rk806_ops_pldo = {866	.list_voltage		= regulator_list_voltage_linear_range,867	.map_voltage		= regulator_map_voltage_linear_range,868 869	.get_voltage_sel	= regulator_get_voltage_sel_regmap,870	.set_voltage_sel        = regulator_set_voltage_sel_regmap,871	.set_voltage_time_sel	= regulator_set_voltage_time_sel,872 873	.enable			= regulator_enable_regmap,874	.disable		= regulator_disable_regmap,875	.is_enabled		= regulator_is_enabled_regmap,876 877	.set_ramp_delay		= regulator_set_ramp_delay_regmap,878 879	.set_suspend_voltage	= rk806_set_suspend_voltage_range_pldo,880	.set_suspend_enable	= rk806_set_suspend_enable,881	.set_suspend_disable	= rk806_set_suspend_disable,882};883 884static const struct regulator_ops rk808_buck1_2_ops = {885	.list_voltage		= regulator_list_voltage_linear,886	.map_voltage		= regulator_map_voltage_linear,887	.get_voltage_sel	= rk808_buck1_2_get_voltage_sel_regmap,888	.set_voltage_sel	= rk808_buck1_2_set_voltage_sel,889	.set_voltage_time_sel	= rk808_buck1_2_set_voltage_time_sel,890	.enable			= regulator_enable_regmap,891	.disable		= regulator_disable_regmap,892	.is_enabled		= regulator_is_enabled_regmap,893	.set_ramp_delay		= regulator_set_ramp_delay_regmap,894	.set_suspend_voltage	= rk808_set_suspend_voltage,895	.set_suspend_enable	= rk808_set_suspend_enable,896	.set_suspend_disable	= rk808_set_suspend_disable,897};898 899static const struct regulator_ops rk808_reg_ops = {900	.list_voltage		= regulator_list_voltage_linear,901	.map_voltage		= regulator_map_voltage_linear,902	.get_voltage_sel	= regulator_get_voltage_sel_regmap,903	.set_voltage_sel	= regulator_set_voltage_sel_regmap,904	.enable			= regulator_enable_regmap,905	.disable		= regulator_disable_regmap,906	.is_enabled		= regulator_is_enabled_regmap,907	.set_suspend_voltage	= rk808_set_suspend_voltage,908	.set_suspend_enable	= rk808_set_suspend_enable,909	.set_suspend_disable	= rk808_set_suspend_disable,910};911 912static const struct regulator_ops rk808_reg_ops_ranges = {913	.list_voltage		= regulator_list_voltage_linear_range,914	.map_voltage		= regulator_map_voltage_linear_range,915	.get_voltage_sel	= regulator_get_voltage_sel_regmap,916	.set_voltage_sel	= regulator_set_voltage_sel_regmap,917	.enable			= regulator_enable_regmap,918	.disable		= regulator_disable_regmap,919	.is_enabled		= regulator_is_enabled_regmap,920	.set_suspend_voltage	= rk808_set_suspend_voltage_range,921	.set_suspend_enable	= rk808_set_suspend_enable,922	.set_suspend_disable	= rk808_set_suspend_disable,923};924 925static const struct regulator_ops rk808_switch_ops = {926	.enable			= regulator_enable_regmap,927	.disable		= regulator_disable_regmap,928	.is_enabled		= regulator_is_enabled_regmap,929	.set_suspend_enable	= rk808_set_suspend_enable,930	.set_suspend_disable	= rk808_set_suspend_disable,931};932 933static const struct linear_range rk805_buck_1_2_voltage_ranges[] = {934	REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),935	REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000),936	REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),937};938 939static const struct regulator_ops rk809_buck5_ops_range = {940	.list_voltage		= regulator_list_voltage_linear_range,941	.map_voltage		= regulator_map_voltage_linear_range,942	.get_voltage_sel	= regulator_get_voltage_sel_regmap,943	.set_voltage_sel	= regulator_set_voltage_sel_regmap,944	.set_voltage_time_sel	= regulator_set_voltage_time_sel,945	.enable			= regulator_enable_regmap,946	.disable		= regulator_disable_regmap,947	.is_enabled		= rk8xx_is_enabled_wmsk_regmap,948	.set_suspend_voltage	= rk808_set_suspend_voltage_range,949	.set_suspend_enable	= rk817_set_suspend_enable,950	.set_suspend_disable	= rk817_set_suspend_disable,951};952 953static const struct regulator_ops rk816_buck1_2_ops_ranges = {954	.list_voltage		= regulator_list_voltage_linear_range,955	.map_voltage		= regulator_map_voltage_linear_range,956	.get_voltage_sel	= regulator_get_voltage_sel_regmap,957	.set_voltage_sel	= regulator_set_voltage_sel_regmap,958	.set_voltage_time_sel	= regulator_set_voltage_time_sel,959	.enable			= regulator_enable_regmap,960	.disable		= regulator_disable_regmap,961	.is_enabled		= regulator_is_enabled_regmap,962	.set_mode		= rk8xx_set_mode,963	.get_mode		= rk8xx_get_mode,964	.set_suspend_mode	= rk8xx_set_suspend_mode,965	.set_ramp_delay		= regulator_set_ramp_delay_regmap,966	.set_suspend_voltage	= rk808_set_suspend_voltage_range,967	.set_suspend_enable	= rk816_set_suspend_enable,968	.set_suspend_disable	= rk816_set_suspend_disable,969};970 971static const struct regulator_ops rk816_buck4_ops_ranges = {972	.list_voltage		= regulator_list_voltage_linear_range,973	.map_voltage		= regulator_map_voltage_linear_range,974	.get_voltage_sel	= regulator_get_voltage_sel_regmap,975	.set_voltage_sel	= regulator_set_voltage_sel_regmap,976	.set_voltage_time_sel	= regulator_set_voltage_time_sel,977	.enable			= regulator_enable_regmap,978	.disable		= regulator_disable_regmap,979	.is_enabled		= regulator_is_enabled_regmap,980	.set_mode		= rk8xx_set_mode,981	.get_mode		= rk8xx_get_mode,982	.set_suspend_mode	= rk8xx_set_suspend_mode,983	.set_suspend_voltage	= rk808_set_suspend_voltage_range,984	.set_suspend_enable	= rk816_set_suspend_enable,985	.set_suspend_disable	= rk816_set_suspend_disable,986};987 988static const struct regulator_ops rk816_reg_ops = {989	.list_voltage		= regulator_list_voltage_linear,990	.map_voltage		= regulator_map_voltage_linear,991	.get_voltage_sel	= regulator_get_voltage_sel_regmap,992	.set_voltage_sel	= regulator_set_voltage_sel_regmap,993	.enable			= regulator_enable_regmap,994	.disable		= regulator_disable_regmap,995	.is_enabled		= rk8xx_is_enabled_wmsk_regmap,996	.set_suspend_voltage	= rk808_set_suspend_voltage,997	.set_suspend_enable	= rk816_set_suspend_enable,998	.set_suspend_disable	= rk816_set_suspend_disable,999};1000 1001static const struct regulator_ops rk817_reg_ops = {1002	.list_voltage		= regulator_list_voltage_linear,1003	.map_voltage		= regulator_map_voltage_linear,1004	.get_voltage_sel	= regulator_get_voltage_sel_regmap,1005	.set_voltage_sel	= regulator_set_voltage_sel_regmap,1006	.enable			= regulator_enable_regmap,1007	.disable		= regulator_disable_regmap,1008	.is_enabled		= rk8xx_is_enabled_wmsk_regmap,1009	.set_suspend_voltage	= rk808_set_suspend_voltage,1010	.set_suspend_enable	= rk817_set_suspend_enable,1011	.set_suspend_disable	= rk817_set_suspend_disable,1012};1013 1014static const struct regulator_ops rk817_boost_ops = {1015	.list_voltage		= regulator_list_voltage_linear,1016	.map_voltage		= regulator_map_voltage_linear,1017	.get_voltage_sel	= regulator_get_voltage_sel_regmap,1018	.set_voltage_sel	= regulator_set_voltage_sel_regmap,1019	.enable			= regulator_enable_regmap,1020	.disable		= regulator_disable_regmap,1021	.is_enabled		= rk8xx_is_enabled_wmsk_regmap,1022	.set_suspend_enable	= rk817_set_suspend_enable,1023	.set_suspend_disable	= rk817_set_suspend_disable,1024};1025 1026static const struct regulator_ops rk817_buck_ops_range = {1027	.list_voltage		= regulator_list_voltage_linear_range,1028	.map_voltage		= regulator_map_voltage_linear_range,1029	.get_voltage_sel	= regulator_get_voltage_sel_regmap,1030	.set_voltage_sel	= regulator_set_voltage_sel_regmap,1031	.set_voltage_time_sel	= regulator_set_voltage_time_sel,1032	.enable			= regulator_enable_regmap,1033	.disable		= regulator_disable_regmap,1034	.is_enabled		= rk8xx_is_enabled_wmsk_regmap,1035	.set_mode		= rk8xx_set_mode,1036	.get_mode		= rk8xx_get_mode,1037	.set_suspend_mode	= rk8xx_set_suspend_mode,1038	.set_ramp_delay		= regulator_set_ramp_delay_regmap,1039	.set_suspend_voltage	= rk808_set_suspend_voltage_range,1040	.set_suspend_enable	= rk817_set_suspend_enable,1041	.set_suspend_disable	= rk817_set_suspend_disable,1042};1043 1044static const struct regulator_ops rk817_switch_ops = {1045	.enable			= regulator_enable_regmap,1046	.disable		= regulator_disable_regmap,1047	.is_enabled		= rk8xx_is_enabled_wmsk_regmap,1048	.set_suspend_enable	= rk817_set_suspend_enable,1049	.set_suspend_disable	= rk817_set_suspend_disable,1050};1051 1052static const struct regulator_desc rk805_reg[] = {1053	{1054		.name = "DCDC_REG1",1055		.supply_name = "vcc1",1056		.of_match = of_match_ptr("DCDC_REG1"),1057		.regulators_node = of_match_ptr("regulators"),1058		.id = RK805_ID_DCDC1,1059		.ops = &rk808_reg_ops_ranges,1060		.type = REGULATOR_VOLTAGE,1061		.n_voltages = 64,1062		.linear_ranges = rk805_buck_1_2_voltage_ranges,1063		.n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),1064		.vsel_reg = RK805_BUCK1_ON_VSEL_REG,1065		.vsel_mask = RK818_BUCK_VSEL_MASK,1066		.enable_reg = RK805_DCDC_EN_REG,1067		.enable_mask = BIT(0),1068		.owner = THIS_MODULE,1069	}, {1070		.name = "DCDC_REG2",1071		.supply_name = "vcc2",1072		.of_match = of_match_ptr("DCDC_REG2"),1073		.regulators_node = of_match_ptr("regulators"),1074		.id = RK805_ID_DCDC2,1075		.ops = &rk808_reg_ops_ranges,1076		.type = REGULATOR_VOLTAGE,1077		.n_voltages = 64,1078		.linear_ranges = rk805_buck_1_2_voltage_ranges,1079		.n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),1080		.vsel_reg = RK805_BUCK2_ON_VSEL_REG,1081		.vsel_mask = RK818_BUCK_VSEL_MASK,1082		.enable_reg = RK805_DCDC_EN_REG,1083		.enable_mask = BIT(1),1084		.owner = THIS_MODULE,1085	}, {1086		.name = "DCDC_REG3",1087		.supply_name = "vcc3",1088		.of_match = of_match_ptr("DCDC_REG3"),1089		.regulators_node = of_match_ptr("regulators"),1090		.id = RK805_ID_DCDC3,1091		.ops = &rk805_switch_ops,1092		.type = REGULATOR_VOLTAGE,1093		.n_voltages = 1,1094		.enable_reg = RK805_DCDC_EN_REG,1095		.enable_mask = BIT(2),1096		.owner = THIS_MODULE,1097	},1098 1099	RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100,1100		RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,1101		RK805_DCDC_EN_REG, BIT(3), 0),1102 1103	RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100,1104		RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,1105		BIT(0), 400),1106	RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100,1107		RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,1108		BIT(1), 400),1109	RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100,1110		RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,1111		BIT(2), 400),1112};1113 1114static const struct linear_range rk806_buck_voltage_ranges[] = {1115	REGULATOR_LINEAR_RANGE(500000, 0, 159, 6250), /* 500mV ~ 1500mV */1116	REGULATOR_LINEAR_RANGE(1500000, 160, 235, 25000), /* 1500mV ~ 3400mV */1117	REGULATOR_LINEAR_RANGE(3400000, 236, 255, 0),1118};1119 1120static const struct linear_range rk806_ldo_voltage_ranges[] = {1121	REGULATOR_LINEAR_RANGE(500000, 0, 231, 12500), /* 500mV ~ 3400mV */1122	REGULATOR_LINEAR_RANGE(3400000, 232, 255, 0),1123};1124 1125static const struct regulator_desc rk806_reg[] = {1126	RK806_REGULATOR("dcdc-reg1", "vcc1", RK806_ID_DCDC1, rk806_ops_dcdc,1127			RK806_BUCK_SEL_CNT, RK806_BUCK1_ON_VSEL,1128			RK806_POWER_EN0, rk806_buck_voltage_ranges, 0,1129			RK806_BUCK1_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1130	RK806_REGULATOR("dcdc-reg2", "vcc2", RK806_ID_DCDC2, rk806_ops_dcdc,1131			RK806_BUCK_SEL_CNT, RK806_BUCK2_ON_VSEL,1132			RK806_POWER_EN0, rk806_buck_voltage_ranges, 1,1133			RK806_BUCK2_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1134	RK806_REGULATOR("dcdc-reg3", "vcc3", RK806_ID_DCDC3, rk806_ops_dcdc,1135			RK806_BUCK_SEL_CNT, RK806_BUCK3_ON_VSEL,1136			RK806_POWER_EN0, rk806_buck_voltage_ranges, 2,1137			RK806_BUCK3_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1138	RK806_REGULATOR("dcdc-reg4", "vcc4", RK806_ID_DCDC4, rk806_ops_dcdc,1139			RK806_BUCK_SEL_CNT, RK806_BUCK4_ON_VSEL,1140			RK806_POWER_EN0, rk806_buck_voltage_ranges, 3,1141			RK806_BUCK4_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1142 1143	RK806_REGULATOR("dcdc-reg5", "vcc5", RK806_ID_DCDC5, rk806_ops_dcdc,1144			RK806_BUCK_SEL_CNT, RK806_BUCK5_ON_VSEL,1145			RK806_POWER_EN1, rk806_buck_voltage_ranges, 0,1146			RK806_BUCK5_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1147	RK806_REGULATOR("dcdc-reg6", "vcc6", RK806_ID_DCDC6, rk806_ops_dcdc,1148			RK806_BUCK_SEL_CNT, RK806_BUCK6_ON_VSEL,1149			RK806_POWER_EN1, rk806_buck_voltage_ranges, 1,1150			RK806_BUCK6_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1151	RK806_REGULATOR("dcdc-reg7", "vcc7", RK806_ID_DCDC7, rk806_ops_dcdc,1152			RK806_BUCK_SEL_CNT, RK806_BUCK7_ON_VSEL,1153			RK806_POWER_EN1, rk806_buck_voltage_ranges, 2,1154			RK806_BUCK7_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1155	RK806_REGULATOR("dcdc-reg8", "vcc8", RK806_ID_DCDC8, rk806_ops_dcdc,1156			RK806_BUCK_SEL_CNT, RK806_BUCK8_ON_VSEL,1157			RK806_POWER_EN1, rk806_buck_voltage_ranges, 3,1158			RK806_BUCK8_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1159 1160	RK806_REGULATOR("dcdc-reg9", "vcc9", RK806_ID_DCDC9, rk806_ops_dcdc,1161			RK806_BUCK_SEL_CNT, RK806_BUCK9_ON_VSEL,1162			RK806_POWER_EN2, rk806_buck_voltage_ranges, 0,1163			RK806_BUCK9_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1164	RK806_REGULATOR("dcdc-reg10", "vcc10", RK806_ID_DCDC10, rk806_ops_dcdc,1165			RK806_BUCK_SEL_CNT, RK806_BUCK10_ON_VSEL,1166			RK806_POWER_EN2, rk806_buck_voltage_ranges, 1,1167			RK806_BUCK10_CONFIG, 0xc0, rk806_ramp_delay_table_dcdc),1168 1169	RK806_REGULATOR("nldo-reg1", "vcc13", RK806_ID_NLDO1, rk806_ops_nldo,1170			RK806_LDO_SEL_CNT, RK806_NLDO1_ON_VSEL,1171			RK806_POWER_EN3, rk806_ldo_voltage_ranges, 0,1172			0xEA, 0x38, rk806_ramp_delay_table_ldo),1173	RK806_REGULATOR("nldo-reg2", "vcc13", RK806_ID_NLDO2, rk806_ops_nldo,1174			RK806_LDO_SEL_CNT, RK806_NLDO2_ON_VSEL,1175			RK806_POWER_EN3, rk806_ldo_voltage_ranges, 1,1176			0xEA, 0x38, rk806_ramp_delay_table_ldo),1177	RK806_REGULATOR("nldo-reg3", "vcc13", RK806_ID_NLDO3, rk806_ops_nldo,1178			RK806_LDO_SEL_CNT, RK806_NLDO3_ON_VSEL,1179			RK806_POWER_EN3, rk806_ldo_voltage_ranges, 2,1180			0xEA, 0x38, rk806_ramp_delay_table_ldo),1181	RK806_REGULATOR("nldo-reg4", "vcc14", RK806_ID_NLDO4, rk806_ops_nldo,1182			RK806_LDO_SEL_CNT, RK806_NLDO4_ON_VSEL,1183			RK806_POWER_EN3, rk806_ldo_voltage_ranges, 3,1184			0xEA, 0x38, rk806_ramp_delay_table_ldo),1185 1186	RK806_REGULATOR("nldo-reg5", "vcc14", RK806_ID_NLDO5, rk806_ops_nldo,1187			RK806_LDO_SEL_CNT, RK806_NLDO5_ON_VSEL,1188			RK806_POWER_EN5, rk806_ldo_voltage_ranges, 2,1189			0xEA, 0x38, rk806_ramp_delay_table_ldo),1190 1191	RK806_REGULATOR("pldo-reg1", "vcc11", RK806_ID_PLDO1, rk806_ops_pldo,1192			RK806_LDO_SEL_CNT, RK806_PLDO1_ON_VSEL,1193			RK806_POWER_EN4, rk806_ldo_voltage_ranges, 1,1194			0xEA, 0x38, rk806_ramp_delay_table_ldo),1195	RK806_REGULATOR("pldo-reg2", "vcc11", RK806_ID_PLDO2, rk806_ops_pldo,1196			RK806_LDO_SEL_CNT, RK806_PLDO2_ON_VSEL,1197			RK806_POWER_EN4, rk806_ldo_voltage_ranges, 2,1198			0xEA, 0x38, rk806_ramp_delay_table_ldo),1199	RK806_REGULATOR("pldo-reg3", "vcc11", RK806_ID_PLDO3, rk806_ops_pldo,1200			RK806_LDO_SEL_CNT, RK806_PLDO3_ON_VSEL,1201			RK806_POWER_EN4, rk806_ldo_voltage_ranges, 3,1202			0xEA, 0x38, rk806_ramp_delay_table_ldo),1203 1204	RK806_REGULATOR("pldo-reg4", "vcc12", RK806_ID_PLDO4, rk806_ops_pldo,1205			RK806_LDO_SEL_CNT, RK806_PLDO4_ON_VSEL,1206			RK806_POWER_EN5, rk806_ldo_voltage_ranges, 0,1207			0xEA, 0x38, rk806_ramp_delay_table_ldo),1208	RK806_REGULATOR("pldo-reg5", "vcc12", RK806_ID_PLDO5, rk806_ops_pldo,1209			RK806_LDO_SEL_CNT, RK806_PLDO5_ON_VSEL,1210			RK806_POWER_EN5, rk806_ldo_voltage_ranges, 1,1211			0xEA, 0x38, rk806_ramp_delay_table_ldo),1212 1213	RK806_REGULATOR("pldo-reg6", "vcca", RK806_ID_PLDO6, rk806_ops_pldo,1214			RK806_LDO_SEL_CNT, RK806_PLDO6_ON_VSEL,1215			RK806_POWER_EN4, rk806_ldo_voltage_ranges, 0,1216			0xEA, 0x38, rk806_ramp_delay_table_ldo),1217};1218 1219 1220static const struct regulator_desc rk808_reg[] = {1221	{1222		.name = "DCDC_REG1",1223		.supply_name = "vcc1",1224		.of_match = of_match_ptr("DCDC_REG1"),1225		.regulators_node = of_match_ptr("regulators"),1226		.id = RK808_ID_DCDC1,1227		.ops = &rk808_buck1_2_ops,1228		.type = REGULATOR_VOLTAGE,1229		.min_uV = 712500,1230		.uV_step = 12500,1231		.n_voltages = 64,1232		.vsel_reg = RK808_BUCK1_ON_VSEL_REG,1233		.vsel_mask = RK808_BUCK_VSEL_MASK,1234		.enable_reg = RK808_DCDC_EN_REG,1235		.enable_mask = BIT(0),1236		.ramp_reg = RK808_BUCK1_CONFIG_REG,1237		.ramp_mask = RK808_RAMP_RATE_MASK,1238		.ramp_delay_table = rk808_buck1_2_ramp_table,1239		.n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),1240		.owner = THIS_MODULE,1241	}, {1242		.name = "DCDC_REG2",1243		.supply_name = "vcc2",1244		.of_match = of_match_ptr("DCDC_REG2"),1245		.regulators_node = of_match_ptr("regulators"),1246		.id = RK808_ID_DCDC2,1247		.ops = &rk808_buck1_2_ops,1248		.type = REGULATOR_VOLTAGE,1249		.min_uV = 712500,1250		.uV_step = 12500,1251		.n_voltages = 64,1252		.vsel_reg = RK808_BUCK2_ON_VSEL_REG,1253		.vsel_mask = RK808_BUCK_VSEL_MASK,1254		.enable_reg = RK808_DCDC_EN_REG,1255		.enable_mask = BIT(1),1256		.ramp_reg = RK808_BUCK2_CONFIG_REG,1257		.ramp_mask = RK808_RAMP_RATE_MASK,1258		.ramp_delay_table = rk808_buck1_2_ramp_table,1259		.n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),1260		.owner = THIS_MODULE,1261	}, {1262		.name = "DCDC_REG3",1263		.supply_name = "vcc3",1264		.of_match = of_match_ptr("DCDC_REG3"),1265		.regulators_node = of_match_ptr("regulators"),1266		.id = RK808_ID_DCDC3,1267		.ops = &rk808_switch_ops,1268		.type = REGULATOR_VOLTAGE,1269		.n_voltages = 1,1270		.enable_reg = RK808_DCDC_EN_REG,1271		.enable_mask = BIT(2),1272		.owner = THIS_MODULE,1273	},1274	RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,1275		RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,1276		RK808_DCDC_EN_REG, BIT(3), 0),1277	RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,1278		RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,1279		BIT(0), 400),1280	RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,1281		RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,1282		BIT(1), 400),1283	{1284		.name = "LDO_REG3",1285		.supply_name = "vcc7",1286		.of_match = of_match_ptr("LDO_REG3"),1287		.regulators_node = of_match_ptr("regulators"),1288		.id = RK808_ID_LDO3,1289		.ops = &rk808_reg_ops_ranges,1290		.type = REGULATOR_VOLTAGE,1291		.n_voltages = 16,1292		.linear_ranges = rk808_ldo3_voltage_ranges,1293		.n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),1294		.vsel_reg = RK808_LDO3_ON_VSEL_REG,1295		.vsel_mask = RK808_BUCK4_VSEL_MASK,1296		.enable_reg = RK808_LDO_EN_REG,1297		.enable_mask = BIT(2),1298		.enable_time = 400,1299		.owner = THIS_MODULE,1300	},1301	RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,1302		RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,1303		BIT(3), 400),1304	RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,1305		RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,1306		BIT(4), 400),1307	RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,1308		RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,1309		BIT(5), 400),1310	RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,1311		RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,1312		BIT(6), 400),1313	RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,1314		RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,1315		BIT(7), 400),1316	RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",1317		RK808_DCDC_EN_REG, BIT(5)),1318	RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",1319		RK808_DCDC_EN_REG, BIT(6)),1320};1321 1322static const struct regulator_desc rk809_reg[] = {1323	{1324		.name = "DCDC_REG1",1325		.supply_name = "vcc1",1326		.of_match = of_match_ptr("DCDC_REG1"),1327		.regulators_node = of_match_ptr("regulators"),1328		.id = RK817_ID_DCDC1,1329		.ops = &rk817_buck_ops_range,1330		.type = REGULATOR_VOLTAGE,1331		.n_voltages = RK817_BUCK1_SEL_CNT + 1,1332		.linear_ranges = rk817_buck1_voltage_ranges,1333		.n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),1334		.vsel_reg = RK817_BUCK1_ON_VSEL_REG,1335		.vsel_mask = RK817_BUCK_VSEL_MASK,1336		.enable_reg = RK817_POWER_EN_REG(0),1337		.enable_mask = ENABLE_MASK(RK817_ID_DCDC1),1338		.enable_val = ENABLE_MASK(RK817_ID_DCDC1),1339		.disable_val = DISABLE_VAL(RK817_ID_DCDC1),1340		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),1341		.ramp_mask = RK817_RAMP_RATE_MASK,1342		.ramp_delay_table = rk817_buck1_4_ramp_table,1343		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1344		.of_map_mode = rk8xx_regulator_of_map_mode,1345		.owner = THIS_MODULE,1346	}, {1347		.name = "DCDC_REG2",1348		.supply_name = "vcc2",1349		.of_match = of_match_ptr("DCDC_REG2"),1350		.regulators_node = of_match_ptr("regulators"),1351		.id = RK817_ID_DCDC2,1352		.ops = &rk817_buck_ops_range,1353		.type = REGULATOR_VOLTAGE,1354		.n_voltages = RK817_BUCK1_SEL_CNT + 1,1355		.linear_ranges = rk817_buck1_voltage_ranges,1356		.n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),1357		.vsel_reg = RK817_BUCK2_ON_VSEL_REG,1358		.vsel_mask = RK817_BUCK_VSEL_MASK,1359		.enable_reg = RK817_POWER_EN_REG(0),1360		.enable_mask = ENABLE_MASK(RK817_ID_DCDC2),1361		.enable_val = ENABLE_MASK(RK817_ID_DCDC2),1362		.disable_val = DISABLE_VAL(RK817_ID_DCDC2),1363		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),1364		.ramp_mask = RK817_RAMP_RATE_MASK,1365		.ramp_delay_table = rk817_buck1_4_ramp_table,1366		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1367		.of_map_mode = rk8xx_regulator_of_map_mode,1368		.owner = THIS_MODULE,1369	}, {1370		.name = "DCDC_REG3",1371		.supply_name = "vcc3",1372		.of_match = of_match_ptr("DCDC_REG3"),1373		.regulators_node = of_match_ptr("regulators"),1374		.id = RK817_ID_DCDC3,1375		.ops = &rk817_buck_ops_range,1376		.type = REGULATOR_VOLTAGE,1377		.n_voltages = RK817_BUCK1_SEL_CNT + 1,1378		.linear_ranges = rk817_buck1_voltage_ranges,1379		.n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),1380		.vsel_reg = RK817_BUCK3_ON_VSEL_REG,1381		.vsel_mask = RK817_BUCK_VSEL_MASK,1382		.apply_reg = RK817_POWER_CONFIG,1383		.apply_bit = RK817_BUCK3_FB_RES_INTER,1384		.enable_reg = RK817_POWER_EN_REG(0),1385		.enable_mask = ENABLE_MASK(RK817_ID_DCDC3),1386		.enable_val = ENABLE_MASK(RK817_ID_DCDC3),1387		.disable_val = DISABLE_VAL(RK817_ID_DCDC3),1388		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),1389		.ramp_mask = RK817_RAMP_RATE_MASK,1390		.ramp_delay_table = rk817_buck1_4_ramp_table,1391		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1392		.of_map_mode = rk8xx_regulator_of_map_mode,1393		.owner = THIS_MODULE,1394	}, {1395		.name = "DCDC_REG4",1396		.supply_name = "vcc4",1397		.of_match = of_match_ptr("DCDC_REG4"),1398		.regulators_node = of_match_ptr("regulators"),1399		.id = RK817_ID_DCDC4,1400		.ops = &rk817_buck_ops_range,1401		.type = REGULATOR_VOLTAGE,1402		.n_voltages = RK817_BUCK3_SEL_CNT + 1,1403		.linear_ranges = rk817_buck3_voltage_ranges,1404		.n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),1405		.vsel_reg = RK817_BUCK4_ON_VSEL_REG,1406		.vsel_mask = RK817_BUCK_VSEL_MASK,1407		.enable_reg = RK817_POWER_EN_REG(0),1408		.enable_mask = ENABLE_MASK(RK817_ID_DCDC4),1409		.enable_val = ENABLE_MASK(RK817_ID_DCDC4),1410		.disable_val = DISABLE_VAL(RK817_ID_DCDC4),1411		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),1412		.ramp_mask = RK817_RAMP_RATE_MASK,1413		.ramp_delay_table = rk817_buck1_4_ramp_table,1414		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1415		.of_map_mode = rk8xx_regulator_of_map_mode,1416		.owner = THIS_MODULE,1417	},1418	{1419		.name = "DCDC_REG5",1420		.supply_name = "vcc9",1421		.of_match = of_match_ptr("DCDC_REG5"),1422		.regulators_node = of_match_ptr("regulators"),1423		.id = RK809_ID_DCDC5,1424		.ops = &rk809_buck5_ops_range,1425		.type = REGULATOR_VOLTAGE,1426		.n_voltages = RK809_BUCK5_SEL_CNT,1427		.linear_ranges = rk809_buck5_voltage_ranges,1428		.n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges),1429		.vsel_reg = RK809_BUCK5_CONFIG(0),1430		.vsel_mask = RK809_BUCK5_VSEL_MASK,1431		.enable_reg = RK817_POWER_EN_REG(3),1432		.enable_mask = ENABLE_MASK(1),1433		.enable_val = ENABLE_MASK(1),1434		.disable_val = DISABLE_VAL(1),1435		.of_map_mode = rk8xx_regulator_of_map_mode,1436		.owner = THIS_MODULE,1437	},1438	RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,1439		   RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,1440		   RK817_POWER_EN_REG(1), ENABLE_MASK(0),1441		   DISABLE_VAL(0), 400),1442	RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,1443		   RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,1444		   RK817_POWER_EN_REG(1), ENABLE_MASK(1),1445		   DISABLE_VAL(1), 400),1446	RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,1447		   RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,1448		   RK817_POWER_EN_REG(1), ENABLE_MASK(2),1449		   DISABLE_VAL(2), 400),1450	RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,1451		   RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,1452		   RK817_POWER_EN_REG(1), ENABLE_MASK(3),1453		   DISABLE_VAL(3), 400),1454	RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,1455		   RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,1456		   RK817_POWER_EN_REG(2), ENABLE_MASK(0),1457		   DISABLE_VAL(0), 400),1458	RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,1459		   RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,1460		   RK817_POWER_EN_REG(2), ENABLE_MASK(1),1461		   DISABLE_VAL(1), 400),1462	RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,1463		   RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,1464		   RK817_POWER_EN_REG(2), ENABLE_MASK(2),1465		   DISABLE_VAL(2), 400),1466	RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,1467		   RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,1468		   RK817_POWER_EN_REG(2), ENABLE_MASK(3),1469		   DISABLE_VAL(3), 400),1470	RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,1471		   RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,1472		   RK817_POWER_EN_REG(3), ENABLE_MASK(0),1473		   DISABLE_VAL(0), 400),1474	RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9",1475			  RK817_POWER_EN_REG(3), ENABLE_MASK(2),1476			  DISABLE_VAL(2)),1477	RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8",1478			  RK817_POWER_EN_REG(3), ENABLE_MASK(3),1479			  DISABLE_VAL(3)),1480};1481 1482static const struct linear_range rk816_buck_4_voltage_ranges[] = {1483	REGULATOR_LINEAR_RANGE(800000, 0, 26, 100000),1484	REGULATOR_LINEAR_RANGE(3500000, 27, 31, 0),1485};1486 1487static const struct regulator_desc rk816_reg[] = {1488	{1489		.name = "dcdc1",1490		.supply_name = "vcc1",1491		.of_match = of_match_ptr("dcdc1"),1492		.regulators_node = of_match_ptr("regulators"),1493		.id = RK816_ID_DCDC1,1494		.ops = &rk816_buck1_2_ops_ranges,1495		.type = REGULATOR_VOLTAGE,1496		.n_voltages = 64,1497		.linear_ranges = rk805_buck_1_2_voltage_ranges,1498		.n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),1499		.vsel_reg = RK818_BUCK1_ON_VSEL_REG,1500		.vsel_mask = RK818_BUCK_VSEL_MASK,1501		.apply_reg = RK816_DCDC_EN_REG2,1502		.apply_bit = RK816_BUCK_DVS_CONFIRM,1503		.enable_reg = RK816_DCDC_EN_REG1,1504		.enable_mask = BIT(4) | BIT(0),1505		.enable_val = BIT(4) | BIT(0),1506		.disable_val = BIT(4),1507		.ramp_reg = RK818_BUCK1_CONFIG_REG,1508		.ramp_mask = RK808_RAMP_RATE_MASK,1509		.ramp_delay_table = rk817_buck1_4_ramp_table,1510		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1511		.of_map_mode = rk8xx_regulator_of_map_mode,1512		.owner = THIS_MODULE,1513	}, {1514		.name = "dcdc2",1515		.supply_name = "vcc2",1516		.of_match = of_match_ptr("dcdc2"),1517		.regulators_node = of_match_ptr("regulators"),1518		.id = RK816_ID_DCDC2,1519		.ops = &rk816_buck1_2_ops_ranges,1520		.type = REGULATOR_VOLTAGE,1521		.n_voltages = 64,1522		.linear_ranges = rk805_buck_1_2_voltage_ranges,1523		.n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),1524		.vsel_reg = RK818_BUCK2_ON_VSEL_REG,1525		.vsel_mask = RK818_BUCK_VSEL_MASK,1526		.apply_reg = RK816_DCDC_EN_REG2,1527		.apply_bit = RK816_BUCK_DVS_CONFIRM,1528		.enable_reg = RK816_DCDC_EN_REG1,1529		.enable_mask = BIT(5) | BIT(1),1530		.enable_val = BIT(5) | BIT(1),1531		.disable_val = BIT(5),1532		.ramp_reg = RK818_BUCK2_CONFIG_REG,1533		.ramp_mask = RK808_RAMP_RATE_MASK,1534		.ramp_delay_table = rk817_buck1_4_ramp_table,1535		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1536		.of_map_mode = rk8xx_regulator_of_map_mode,1537		.owner = THIS_MODULE,1538	}, {1539		.name = "dcdc3",1540		.supply_name = "vcc3",1541		.of_match = of_match_ptr("dcdc3"),1542		.regulators_node = of_match_ptr("regulators"),1543		.id = RK816_ID_DCDC3,1544		.ops = &rk808_switch_ops,1545		.type = REGULATOR_VOLTAGE,1546		.n_voltages = 1,1547		.enable_reg = RK816_DCDC_EN_REG1,1548		.enable_mask = BIT(6) | BIT(2),1549		.enable_val =  BIT(6) | BIT(2),1550		.disable_val = BIT(6),1551		.of_map_mode = rk8xx_regulator_of_map_mode,1552		.owner = THIS_MODULE,1553	}, {1554		.name = "dcdc4",1555		.supply_name = "vcc4",1556		.of_match = of_match_ptr("dcdc4"),1557		.regulators_node = of_match_ptr("regulators"),1558		.id = RK816_ID_DCDC4,1559		.ops = &rk816_buck4_ops_ranges,1560		.type = REGULATOR_VOLTAGE,1561		.n_voltages = 32,1562		.linear_ranges = rk816_buck_4_voltage_ranges,1563		.n_linear_ranges = ARRAY_SIZE(rk816_buck_4_voltage_ranges),1564		.vsel_reg = RK818_BUCK4_ON_VSEL_REG,1565		.vsel_mask = RK818_BUCK4_VSEL_MASK,1566		.enable_reg = RK816_DCDC_EN_REG1,1567		.enable_mask = BIT(7) | BIT(3),1568		.enable_val = BIT(7) | BIT(3),1569		.disable_val = BIT(7),1570		.of_map_mode = rk8xx_regulator_of_map_mode,1571		.owner = THIS_MODULE,1572	},1573	RK816_DESC(RK816_ID_LDO1, "ldo1", "vcc5", 800, 3400, 100,1574		   RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK,1575		   RK816_LDO_EN_REG1, ENABLE_MASK(0), DISABLE_VAL(0), 400),1576	RK816_DESC(RK816_ID_LDO2, "ldo2", "vcc5", 800, 3400, 100,1577		   RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK,1578		   RK816_LDO_EN_REG1, ENABLE_MASK(1), DISABLE_VAL(1), 400),1579	RK816_DESC(RK816_ID_LDO3, "ldo3", "vcc5", 800, 3400, 100,1580		   RK818_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK,1581		   RK816_LDO_EN_REG1, ENABLE_MASK(2), DISABLE_VAL(2), 400),1582	RK816_DESC(RK816_ID_LDO4, "ldo4", "vcc6", 800, 3400, 100,1583		   RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK,1584		   RK816_LDO_EN_REG1, ENABLE_MASK(3), DISABLE_VAL(3), 400),1585	RK816_DESC(RK816_ID_LDO5, "ldo5", "vcc6", 800, 3400, 100,1586		   RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK,1587		   RK816_LDO_EN_REG2, ENABLE_MASK(0), DISABLE_VAL(0), 400),1588	RK816_DESC(RK816_ID_LDO6, "ldo6", "vcc6", 800, 3400, 100,1589		   RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK,1590		   RK816_LDO_EN_REG2, ENABLE_MASK(1), DISABLE_VAL(1), 400),1591};1592 1593static const struct regulator_desc rk817_reg[] = {1594	{1595		.name = "DCDC_REG1",1596		.supply_name = "vcc1",1597		.of_match = of_match_ptr("DCDC_REG1"),1598		.regulators_node = of_match_ptr("regulators"),1599		.id = RK817_ID_DCDC1,1600		.ops = &rk817_buck_ops_range,1601		.type = REGULATOR_VOLTAGE,1602		.n_voltages = RK817_BUCK1_SEL_CNT + 1,1603		.linear_ranges = rk817_buck1_voltage_ranges,1604		.n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),1605		.vsel_reg = RK817_BUCK1_ON_VSEL_REG,1606		.vsel_mask = RK817_BUCK_VSEL_MASK,1607		.enable_reg = RK817_POWER_EN_REG(0),1608		.enable_mask = ENABLE_MASK(RK817_ID_DCDC1),1609		.enable_val = ENABLE_MASK(RK817_ID_DCDC1),1610		.disable_val = DISABLE_VAL(RK817_ID_DCDC1),1611		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),1612		.ramp_mask = RK817_RAMP_RATE_MASK,1613		.ramp_delay_table = rk817_buck1_4_ramp_table,1614		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1615		.of_map_mode = rk8xx_regulator_of_map_mode,1616		.owner = THIS_MODULE,1617	}, {1618		.name = "DCDC_REG2",1619		.supply_name = "vcc2",1620		.of_match = of_match_ptr("DCDC_REG2"),1621		.regulators_node = of_match_ptr("regulators"),1622		.id = RK817_ID_DCDC2,1623		.ops = &rk817_buck_ops_range,1624		.type = REGULATOR_VOLTAGE,1625		.n_voltages = RK817_BUCK1_SEL_CNT + 1,1626		.linear_ranges = rk817_buck1_voltage_ranges,1627		.n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),1628		.vsel_reg = RK817_BUCK2_ON_VSEL_REG,1629		.vsel_mask = RK817_BUCK_VSEL_MASK,1630		.enable_reg = RK817_POWER_EN_REG(0),1631		.enable_mask = ENABLE_MASK(RK817_ID_DCDC2),1632		.enable_val = ENABLE_MASK(RK817_ID_DCDC2),1633		.disable_val = DISABLE_VAL(RK817_ID_DCDC2),1634		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),1635		.ramp_mask = RK817_RAMP_RATE_MASK,1636		.ramp_delay_table = rk817_buck1_4_ramp_table,1637		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1638		.of_map_mode = rk8xx_regulator_of_map_mode,1639		.owner = THIS_MODULE,1640	}, {1641		.name = "DCDC_REG3",1642		.supply_name = "vcc3",1643		.of_match = of_match_ptr("DCDC_REG3"),1644		.regulators_node = of_match_ptr("regulators"),1645		.id = RK817_ID_DCDC3,1646		.ops = &rk817_buck_ops_range,1647		.type = REGULATOR_VOLTAGE,1648		.n_voltages = RK817_BUCK1_SEL_CNT + 1,1649		.linear_ranges = rk817_buck1_voltage_ranges,1650		.n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),1651		.vsel_reg = RK817_BUCK3_ON_VSEL_REG,1652		.vsel_mask = RK817_BUCK_VSEL_MASK,1653		.enable_reg = RK817_POWER_EN_REG(0),1654		.enable_mask = ENABLE_MASK(RK817_ID_DCDC3),1655		.enable_val = ENABLE_MASK(RK817_ID_DCDC3),1656		.disable_val = DISABLE_VAL(RK817_ID_DCDC3),1657		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),1658		.ramp_mask = RK817_RAMP_RATE_MASK,1659		.ramp_delay_table = rk817_buck1_4_ramp_table,1660		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1661		.of_map_mode = rk8xx_regulator_of_map_mode,1662		.owner = THIS_MODULE,1663	}, {1664		.name = "DCDC_REG4",1665		.supply_name = "vcc4",1666		.of_match = of_match_ptr("DCDC_REG4"),1667		.regulators_node = of_match_ptr("regulators"),1668		.id = RK817_ID_DCDC4,1669		.ops = &rk817_buck_ops_range,1670		.type = REGULATOR_VOLTAGE,1671		.n_voltages = RK817_BUCK3_SEL_CNT + 1,1672		.linear_ranges = rk817_buck3_voltage_ranges,1673		.n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),1674		.vsel_reg = RK817_BUCK4_ON_VSEL_REG,1675		.vsel_mask = RK817_BUCK_VSEL_MASK,1676		.enable_reg = RK817_POWER_EN_REG(0),1677		.enable_mask = ENABLE_MASK(RK817_ID_DCDC4),1678		.enable_val = ENABLE_MASK(RK817_ID_DCDC4),1679		.disable_val = DISABLE_VAL(RK817_ID_DCDC4),1680		.ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),1681		.ramp_mask = RK817_RAMP_RATE_MASK,1682		.ramp_delay_table = rk817_buck1_4_ramp_table,1683		.n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),1684		.of_map_mode = rk8xx_regulator_of_map_mode,1685		.owner = THIS_MODULE,1686	},1687	RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,1688		   RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,1689		   RK817_POWER_EN_REG(1), ENABLE_MASK(0),1690		   DISABLE_VAL(0), 400),1691	RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,1692		   RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,1693		   RK817_POWER_EN_REG(1), ENABLE_MASK(1),1694		   DISABLE_VAL(1), 400),1695	RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,1696		   RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,1697		   RK817_POWER_EN_REG(1), ENABLE_MASK(2),1698		   DISABLE_VAL(2), 400),1699	RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,1700		   RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,1701		   RK817_POWER_EN_REG(1), ENABLE_MASK(3),1702		   DISABLE_VAL(3), 400),1703	RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,1704		   RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,1705		   RK817_POWER_EN_REG(2), ENABLE_MASK(0),1706		   DISABLE_VAL(0), 400),1707	RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,1708		   RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,1709		   RK817_POWER_EN_REG(2), ENABLE_MASK(1),1710		   DISABLE_VAL(1), 400),1711	RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,1712		   RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,1713		   RK817_POWER_EN_REG(2), ENABLE_MASK(2),1714		   DISABLE_VAL(2), 400),1715	RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,1716		   RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,1717		   RK817_POWER_EN_REG(2), ENABLE_MASK(3),1718		   DISABLE_VAL(3), 400),1719	RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,1720		   RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,1721		   RK817_POWER_EN_REG(3), ENABLE_MASK(0),1722		   DISABLE_VAL(0), 400),1723	RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100,1724			 RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK,1725			 RK817_POWER_EN_REG(3), ENABLE_MASK(1), ENABLE_MASK(1),1726		   DISABLE_VAL(1), 400, 3500 - 5400),1727	RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9",1728			  RK817_POWER_EN_REG(3), ENABLE_MASK(2),1729			  DISABLE_VAL(2)),1730};1731 1732static const struct regulator_desc rk818_reg[] = {1733	{1734		.name = "DCDC_REG1",1735		.supply_name = "vcc1",1736		.of_match = of_match_ptr("DCDC_REG1"),1737		.regulators_node = of_match_ptr("regulators"),1738		.id = RK818_ID_DCDC1,1739		.ops = &rk808_reg_ops,1740		.type = REGULATOR_VOLTAGE,1741		.min_uV = 712500,1742		.uV_step = 12500,1743		.n_voltages = 64,1744		.vsel_reg = RK818_BUCK1_ON_VSEL_REG,1745		.vsel_mask = RK818_BUCK_VSEL_MASK,1746		.enable_reg = RK818_DCDC_EN_REG,1747		.enable_mask = BIT(0),1748		.owner = THIS_MODULE,1749	}, {1750		.name = "DCDC_REG2",1751		.supply_name = "vcc2",1752		.of_match = of_match_ptr("DCDC_REG2"),1753		.regulators_node = of_match_ptr("regulators"),1754		.id = RK818_ID_DCDC2,1755		.ops = &rk808_reg_ops,1756		.type = REGULATOR_VOLTAGE,1757		.min_uV = 712500,1758		.uV_step = 12500,1759		.n_voltages = 64,1760		.vsel_reg = RK818_BUCK2_ON_VSEL_REG,1761		.vsel_mask = RK818_BUCK_VSEL_MASK,1762		.enable_reg = RK818_DCDC_EN_REG,1763		.enable_mask = BIT(1),1764		.owner = THIS_MODULE,1765	}, {1766		.name = "DCDC_REG3",1767		.supply_name = "vcc3",1768		.of_match = of_match_ptr("DCDC_REG3"),1769		.regulators_node = of_match_ptr("regulators"),1770		.id = RK818_ID_DCDC3,1771		.ops = &rk808_switch_ops,1772		.type = REGULATOR_VOLTAGE,1773		.n_voltages = 1,1774		.enable_reg = RK818_DCDC_EN_REG,1775		.enable_mask = BIT(2),1776		.owner = THIS_MODULE,1777	},1778	RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,1779		RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,1780		RK818_DCDC_EN_REG, BIT(3), 0),1781	RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,1782		RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,1783		RK818_DCDC_EN_REG, BIT(4), 0),1784	RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,1785		RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,1786		BIT(0), 400),1787	RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,1788		RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,1789		BIT(1), 400),1790	{1791		.name = "LDO_REG3",1792		.supply_name = "vcc7",1793		.of_match = of_match_ptr("LDO_REG3"),1794		.regulators_node = of_match_ptr("regulators"),1795		.id = RK818_ID_LDO3,1796		.ops = &rk808_reg_ops_ranges,1797		.type = REGULATOR_VOLTAGE,1798		.n_voltages = 16,1799		.linear_ranges = rk808_ldo3_voltage_ranges,1800		.n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),1801		.vsel_reg = RK818_LDO3_ON_VSEL_REG,1802		.vsel_mask = RK818_LDO3_ON_VSEL_MASK,1803		.enable_reg = RK818_LDO_EN_REG,1804		.enable_mask = BIT(2),1805		.enable_time = 400,1806		.owner = THIS_MODULE,1807	},1808	RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,1809		RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,1810		BIT(3), 400),1811	RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,1812		RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,1813		BIT(4), 400),1814	RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,1815		RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,1816		BIT(5), 400),1817	RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,1818		RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,1819		BIT(6), 400),1820	RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,1821		RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,1822		BIT(7), 400),1823	RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,1824		RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,1825		RK818_DCDC_EN_REG, BIT(5), 400),1826	RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",1827		RK818_DCDC_EN_REG, BIT(6)),1828	RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",1829		RK818_H5V_EN_REG, BIT(0)),1830	RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",1831		RK818_DCDC_EN_REG, BIT(7)),1832};1833 1834static int rk808_regulator_dt_parse_pdata(struct device *dev,1835				   struct regmap *map,1836				   struct rk808_regulator_data *pdata)1837{1838	struct device_node *np;1839	int tmp, ret = 0, i;1840 1841	np = of_get_child_by_name(dev->of_node, "regulators");1842	if (!np)1843		return -ENXIO;1844 1845	for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {1846		pdata->dvs_gpio[i] =1847			devm_gpiod_get_index_optional(dev, "dvs", i,1848						      GPIOD_OUT_LOW);1849		if (IS_ERR(pdata->dvs_gpio[i])) {1850			ret = PTR_ERR(pdata->dvs_gpio[i]);1851			dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);1852			goto dt_parse_end;1853		}1854 1855		if (!pdata->dvs_gpio[i]) {1856			dev_info(dev, "there is no dvs%d gpio\n", i);1857			continue;1858		}1859 1860		tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;1861		ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,1862				gpiod_is_active_low(pdata->dvs_gpio[i]) ?1863				0 : tmp);1864	}1865 1866dt_parse_end:1867	of_node_put(np);1868	return ret;1869}1870 1871static int rk808_regulator_probe(struct platform_device *pdev)1872{1873	struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);1874	struct regulator_config config = {};1875	struct regulator_dev *rk808_rdev;1876	struct rk808_regulator_data *pdata;1877	const struct regulator_desc *regulators;1878	struct regmap *regmap;1879	int ret, i, nregulators;1880 1881	pdev->dev.of_node = pdev->dev.parent->of_node;1882	pdev->dev.of_node_reused = true;1883 1884	regmap = dev_get_regmap(pdev->dev.parent, NULL);1885	if (!regmap)1886		return -ENODEV;1887 1888	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);1889	if (!pdata)1890		return -ENOMEM;1891 1892	ret = rk808_regulator_dt_parse_pdata(&pdev->dev, regmap, pdata);1893	if (ret < 0)1894		return ret;1895 1896	platform_set_drvdata(pdev, pdata);1897 1898	switch (rk808->variant) {1899	case RK805_ID:1900		regulators = rk805_reg;1901		nregulators = RK805_NUM_REGULATORS;1902		break;1903	case RK806_ID:1904		regulators = rk806_reg;1905		nregulators = ARRAY_SIZE(rk806_reg);1906		break;1907	case RK808_ID:1908		regulators = rk808_reg;1909		nregulators = RK808_NUM_REGULATORS;1910		break;1911	case RK809_ID:1912		regulators = rk809_reg;1913		nregulators = RK809_NUM_REGULATORS;1914		break;1915	case RK816_ID:1916		regulators = rk816_reg;1917		nregulators = ARRAY_SIZE(rk816_reg);1918		break;1919	case RK817_ID:1920		regulators = rk817_reg;1921		nregulators = RK817_NUM_REGULATORS;1922		break;1923	case RK818_ID:1924		regulators = rk818_reg;1925		nregulators = RK818_NUM_REGULATORS;1926		break;1927	default:1928		dev_err(&pdev->dev, "unsupported RK8XX ID %lu\n",1929			rk808->variant);1930		return -EINVAL;1931	}1932 1933	config.dev = &pdev->dev;1934	config.driver_data = pdata;1935	config.regmap = regmap;1936 1937	/* Instantiate the regulators */1938	for (i = 0; i < nregulators; i++) {1939		rk808_rdev = devm_regulator_register(&pdev->dev,1940						     &regulators[i], &config);1941		if (IS_ERR(rk808_rdev))1942			return dev_err_probe(&pdev->dev, PTR_ERR(rk808_rdev),1943					     "failed to register %d regulator\n", i);1944	}1945 1946	return 0;1947}1948 1949static struct platform_driver rk808_regulator_driver = {1950	.probe = rk808_regulator_probe,1951	.driver = {1952		.name = "rk808-regulator",1953		.probe_type = PROBE_FORCE_SYNCHRONOUS,1954	},1955};1956 1957module_platform_driver(rk808_regulator_driver);1958 1959MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");1960MODULE_AUTHOR("Tony xie <tony.xie@rock-chips.com>");1961MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");1962MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");1963MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");1964MODULE_AUTHOR("Xu Shengfei <xsf@rock-chips.com>");1965MODULE_LICENSE("GPL");1966MODULE_ALIAS("platform:rk808-regulator");1967