162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// Regulator device driver for DA9061 and DA9062.
462306a36Sopenharmony_ci// Copyright (C) 2015-2017  Dialog Semiconductor
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/kernel.h>
762306a36Sopenharmony_ci#include <linux/module.h>
862306a36Sopenharmony_ci#include <linux/init.h>
962306a36Sopenharmony_ci#include <linux/err.h>
1062306a36Sopenharmony_ci#include <linux/slab.h>
1162306a36Sopenharmony_ci#include <linux/of.h>
1262306a36Sopenharmony_ci#include <linux/platform_device.h>
1362306a36Sopenharmony_ci#include <linux/regmap.h>
1462306a36Sopenharmony_ci#include <linux/regulator/driver.h>
1562306a36Sopenharmony_ci#include <linux/regulator/machine.h>
1662306a36Sopenharmony_ci#include <linux/regulator/of_regulator.h>
1762306a36Sopenharmony_ci#include <linux/mfd/da9062/core.h>
1862306a36Sopenharmony_ci#include <linux/mfd/da9062/registers.h>
1962306a36Sopenharmony_ci#include <dt-bindings/regulator/dlg,da9063-regulator.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Regulator IDs */
2262306a36Sopenharmony_cienum {
2362306a36Sopenharmony_ci	DA9061_ID_BUCK1,
2462306a36Sopenharmony_ci	DA9061_ID_BUCK2,
2562306a36Sopenharmony_ci	DA9061_ID_BUCK3,
2662306a36Sopenharmony_ci	DA9061_ID_LDO1,
2762306a36Sopenharmony_ci	DA9061_ID_LDO2,
2862306a36Sopenharmony_ci	DA9061_ID_LDO3,
2962306a36Sopenharmony_ci	DA9061_ID_LDO4,
3062306a36Sopenharmony_ci	DA9061_MAX_REGULATORS,
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cienum {
3462306a36Sopenharmony_ci	DA9062_ID_BUCK1,
3562306a36Sopenharmony_ci	DA9062_ID_BUCK2,
3662306a36Sopenharmony_ci	DA9062_ID_BUCK3,
3762306a36Sopenharmony_ci	DA9062_ID_BUCK4,
3862306a36Sopenharmony_ci	DA9062_ID_LDO1,
3962306a36Sopenharmony_ci	DA9062_ID_LDO2,
4062306a36Sopenharmony_ci	DA9062_ID_LDO3,
4162306a36Sopenharmony_ci	DA9062_ID_LDO4,
4262306a36Sopenharmony_ci	DA9062_MAX_REGULATORS,
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/* Regulator capabilities and registers description */
4662306a36Sopenharmony_cistruct da9062_regulator_info {
4762306a36Sopenharmony_ci	struct regulator_desc desc;
4862306a36Sopenharmony_ci	/* Main register fields */
4962306a36Sopenharmony_ci	struct reg_field mode;
5062306a36Sopenharmony_ci	struct reg_field suspend;
5162306a36Sopenharmony_ci	struct reg_field sleep;
5262306a36Sopenharmony_ci	struct reg_field suspend_sleep;
5362306a36Sopenharmony_ci	unsigned int suspend_vsel_reg;
5462306a36Sopenharmony_ci	/* Event detection bit */
5562306a36Sopenharmony_ci	struct reg_field oc_event;
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* Single regulator settings */
5962306a36Sopenharmony_cistruct da9062_regulator {
6062306a36Sopenharmony_ci	struct regulator_desc			desc;
6162306a36Sopenharmony_ci	struct regulator_dev			*rdev;
6262306a36Sopenharmony_ci	struct da9062				*hw;
6362306a36Sopenharmony_ci	const struct da9062_regulator_info	*info;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	struct regmap_field			*mode;
6662306a36Sopenharmony_ci	struct regmap_field			*suspend;
6762306a36Sopenharmony_ci	struct regmap_field			*sleep;
6862306a36Sopenharmony_ci	struct regmap_field			*suspend_sleep;
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* Encapsulates all information for the regulators driver */
7262306a36Sopenharmony_cistruct da9062_regulators {
7362306a36Sopenharmony_ci	int					irq_ldo_lim;
7462306a36Sopenharmony_ci	unsigned				n_regulators;
7562306a36Sopenharmony_ci	/* Array size to be defined during init. Keep at end. */
7662306a36Sopenharmony_ci	struct da9062_regulator			regulator[];
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/* Regulator operations */
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci/* Current limits array (in uA)
8262306a36Sopenharmony_ci * - DA9061_ID_[BUCK1|BUCK3]
8362306a36Sopenharmony_ci * - DA9062_ID_[BUCK1|BUCK2|BUCK4]
8462306a36Sopenharmony_ci * Entry indexes corresponds to register values.
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_cistatic const unsigned int da9062_buck_a_limits[] = {
8762306a36Sopenharmony_ci	 500000,  600000,  700000,  800000,  900000, 1000000, 1100000, 1200000,
8862306a36Sopenharmony_ci	1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* Current limits array (in uA)
9262306a36Sopenharmony_ci * - DA9061_ID_BUCK2
9362306a36Sopenharmony_ci * - DA9062_ID_BUCK3
9462306a36Sopenharmony_ci * Entry indexes corresponds to register values.
9562306a36Sopenharmony_ci */
9662306a36Sopenharmony_cistatic const unsigned int da9062_buck_b_limits[] = {
9762306a36Sopenharmony_ci	1500000, 1600000, 1700000, 1800000, 1900000, 2000000, 2100000, 2200000,
9862306a36Sopenharmony_ci	2300000, 2400000, 2500000, 2600000, 2700000, 2800000, 2900000, 3000000
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistatic unsigned int da9062_map_buck_mode(unsigned int mode)
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	switch (mode) {
10462306a36Sopenharmony_ci	case DA9063_BUCK_MODE_SLEEP:
10562306a36Sopenharmony_ci		return REGULATOR_MODE_STANDBY;
10662306a36Sopenharmony_ci	case DA9063_BUCK_MODE_SYNC:
10762306a36Sopenharmony_ci		return REGULATOR_MODE_FAST;
10862306a36Sopenharmony_ci	case DA9063_BUCK_MODE_AUTO:
10962306a36Sopenharmony_ci		return REGULATOR_MODE_NORMAL;
11062306a36Sopenharmony_ci	default:
11162306a36Sopenharmony_ci		return REGULATOR_MODE_INVALID;
11262306a36Sopenharmony_ci	}
11362306a36Sopenharmony_ci}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistatic int da9062_buck_set_mode(struct regulator_dev *rdev, unsigned mode)
11662306a36Sopenharmony_ci{
11762306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
11862306a36Sopenharmony_ci	unsigned val;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	switch (mode) {
12162306a36Sopenharmony_ci	case REGULATOR_MODE_FAST:
12262306a36Sopenharmony_ci		val = DA9063_BUCK_MODE_SYNC;
12362306a36Sopenharmony_ci		break;
12462306a36Sopenharmony_ci	case REGULATOR_MODE_NORMAL:
12562306a36Sopenharmony_ci		val = DA9063_BUCK_MODE_AUTO;
12662306a36Sopenharmony_ci		break;
12762306a36Sopenharmony_ci	case REGULATOR_MODE_STANDBY:
12862306a36Sopenharmony_ci		val = DA9063_BUCK_MODE_SLEEP;
12962306a36Sopenharmony_ci		break;
13062306a36Sopenharmony_ci	default:
13162306a36Sopenharmony_ci		return -EINVAL;
13262306a36Sopenharmony_ci	}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	return regmap_field_write(regl->mode, val);
13562306a36Sopenharmony_ci}
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/*
13862306a36Sopenharmony_ci * Bucks use single mode register field for normal operation
13962306a36Sopenharmony_ci * and suspend state.
14062306a36Sopenharmony_ci * There are 3 modes to map to: FAST, NORMAL, and STANDBY.
14162306a36Sopenharmony_ci */
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistatic unsigned da9062_buck_get_mode(struct regulator_dev *rdev)
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
14662306a36Sopenharmony_ci	unsigned int val;
14762306a36Sopenharmony_ci	int ret;
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	ret = regmap_field_read(regl->mode, &val);
15062306a36Sopenharmony_ci	if (ret < 0)
15162306a36Sopenharmony_ci		return ret;
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	switch (val) {
15462306a36Sopenharmony_ci	default:
15562306a36Sopenharmony_ci		/* Sleep flag bit decides the mode */
15662306a36Sopenharmony_ci		break;
15762306a36Sopenharmony_ci	case DA9063_BUCK_MODE_SLEEP:
15862306a36Sopenharmony_ci		return REGULATOR_MODE_STANDBY;
15962306a36Sopenharmony_ci	case DA9063_BUCK_MODE_SYNC:
16062306a36Sopenharmony_ci		return REGULATOR_MODE_FAST;
16162306a36Sopenharmony_ci	case DA9063_BUCK_MODE_AUTO:
16262306a36Sopenharmony_ci		return REGULATOR_MODE_NORMAL;
16362306a36Sopenharmony_ci	}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	ret = regmap_field_read(regl->sleep, &val);
16662306a36Sopenharmony_ci	if (ret < 0)
16762306a36Sopenharmony_ci		return 0;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	if (val)
17062306a36Sopenharmony_ci		return REGULATOR_MODE_STANDBY;
17162306a36Sopenharmony_ci	else
17262306a36Sopenharmony_ci		return REGULATOR_MODE_FAST;
17362306a36Sopenharmony_ci}
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci/*
17662306a36Sopenharmony_ci * LDOs use sleep flags - one for normal and one for suspend state.
17762306a36Sopenharmony_ci * There are 2 modes to map to: NORMAL and STANDBY (sleep) for each state.
17862306a36Sopenharmony_ci */
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic int da9062_ldo_set_mode(struct regulator_dev *rdev, unsigned mode)
18162306a36Sopenharmony_ci{
18262306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
18362306a36Sopenharmony_ci	unsigned val;
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	switch (mode) {
18662306a36Sopenharmony_ci	case REGULATOR_MODE_NORMAL:
18762306a36Sopenharmony_ci		val = 0;
18862306a36Sopenharmony_ci		break;
18962306a36Sopenharmony_ci	case REGULATOR_MODE_STANDBY:
19062306a36Sopenharmony_ci		val = 1;
19162306a36Sopenharmony_ci		break;
19262306a36Sopenharmony_ci	default:
19362306a36Sopenharmony_ci		return -EINVAL;
19462306a36Sopenharmony_ci	}
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	return regmap_field_write(regl->sleep, val);
19762306a36Sopenharmony_ci}
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistatic unsigned da9062_ldo_get_mode(struct regulator_dev *rdev)
20062306a36Sopenharmony_ci{
20162306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
20262306a36Sopenharmony_ci	int ret, val;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	ret = regmap_field_read(regl->sleep, &val);
20562306a36Sopenharmony_ci	if (ret < 0)
20662306a36Sopenharmony_ci		return 0;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	if (val)
20962306a36Sopenharmony_ci		return REGULATOR_MODE_STANDBY;
21062306a36Sopenharmony_ci	else
21162306a36Sopenharmony_ci		return REGULATOR_MODE_NORMAL;
21262306a36Sopenharmony_ci}
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_cistatic int da9062_buck_get_status(struct regulator_dev *rdev)
21562306a36Sopenharmony_ci{
21662306a36Sopenharmony_ci	int ret = regulator_is_enabled_regmap(rdev);
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	if (ret == 0) {
21962306a36Sopenharmony_ci		ret = REGULATOR_STATUS_OFF;
22062306a36Sopenharmony_ci	} else if (ret > 0) {
22162306a36Sopenharmony_ci		ret = da9062_buck_get_mode(rdev);
22262306a36Sopenharmony_ci		if (ret > 0)
22362306a36Sopenharmony_ci			ret = regulator_mode_to_status(ret);
22462306a36Sopenharmony_ci		else if (ret == 0)
22562306a36Sopenharmony_ci			ret = -EIO;
22662306a36Sopenharmony_ci	}
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	return ret;
22962306a36Sopenharmony_ci}
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cistatic int da9062_ldo_get_status(struct regulator_dev *rdev)
23262306a36Sopenharmony_ci{
23362306a36Sopenharmony_ci	int ret = regulator_is_enabled_regmap(rdev);
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	if (ret == 0) {
23662306a36Sopenharmony_ci		ret = REGULATOR_STATUS_OFF;
23762306a36Sopenharmony_ci	} else if (ret > 0) {
23862306a36Sopenharmony_ci		ret = da9062_ldo_get_mode(rdev);
23962306a36Sopenharmony_ci		if (ret > 0)
24062306a36Sopenharmony_ci			ret = regulator_mode_to_status(ret);
24162306a36Sopenharmony_ci		else if (ret == 0)
24262306a36Sopenharmony_ci			ret = -EIO;
24362306a36Sopenharmony_ci	}
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	return ret;
24662306a36Sopenharmony_ci}
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic int da9062_set_suspend_voltage(struct regulator_dev *rdev, int uv)
24962306a36Sopenharmony_ci{
25062306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
25162306a36Sopenharmony_ci	const struct da9062_regulator_info *rinfo = regl->info;
25262306a36Sopenharmony_ci	int ret, sel;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	sel = regulator_map_voltage_linear(rdev, uv, uv);
25562306a36Sopenharmony_ci	if (sel < 0)
25662306a36Sopenharmony_ci		return sel;
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	sel <<= ffs(rdev->desc->vsel_mask) - 1;
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci	ret = regmap_update_bits(regl->hw->regmap, rinfo->suspend_vsel_reg,
26162306a36Sopenharmony_ci				 rdev->desc->vsel_mask, sel);
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	return ret;
26462306a36Sopenharmony_ci}
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_cistatic int da9062_suspend_enable(struct regulator_dev *rdev)
26762306a36Sopenharmony_ci{
26862306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	return regmap_field_write(regl->suspend, 1);
27162306a36Sopenharmony_ci}
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_cistatic int da9062_suspend_disable(struct regulator_dev *rdev)
27462306a36Sopenharmony_ci{
27562306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	return regmap_field_write(regl->suspend, 0);
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic int da9062_buck_set_suspend_mode(struct regulator_dev *rdev,
28162306a36Sopenharmony_ci					unsigned mode)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
28462306a36Sopenharmony_ci	int val;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	switch (mode) {
28762306a36Sopenharmony_ci	case REGULATOR_MODE_FAST:
28862306a36Sopenharmony_ci		val = DA9063_BUCK_MODE_SYNC;
28962306a36Sopenharmony_ci		break;
29062306a36Sopenharmony_ci	case REGULATOR_MODE_NORMAL:
29162306a36Sopenharmony_ci		val = DA9063_BUCK_MODE_AUTO;
29262306a36Sopenharmony_ci		break;
29362306a36Sopenharmony_ci	case REGULATOR_MODE_STANDBY:
29462306a36Sopenharmony_ci		val = DA9063_BUCK_MODE_SLEEP;
29562306a36Sopenharmony_ci		break;
29662306a36Sopenharmony_ci	default:
29762306a36Sopenharmony_ci		return -EINVAL;
29862306a36Sopenharmony_ci	}
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	return regmap_field_write(regl->mode, val);
30162306a36Sopenharmony_ci}
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_cistatic int da9062_ldo_set_suspend_mode(struct regulator_dev *rdev,
30462306a36Sopenharmony_ci						unsigned mode)
30562306a36Sopenharmony_ci{
30662306a36Sopenharmony_ci	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
30762306a36Sopenharmony_ci	unsigned val;
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	switch (mode) {
31062306a36Sopenharmony_ci	case REGULATOR_MODE_NORMAL:
31162306a36Sopenharmony_ci		val = 0;
31262306a36Sopenharmony_ci		break;
31362306a36Sopenharmony_ci	case REGULATOR_MODE_STANDBY:
31462306a36Sopenharmony_ci		val = 1;
31562306a36Sopenharmony_ci		break;
31662306a36Sopenharmony_ci	default:
31762306a36Sopenharmony_ci		return -EINVAL;
31862306a36Sopenharmony_ci	}
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	return regmap_field_write(regl->suspend_sleep, val);
32162306a36Sopenharmony_ci}
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cistatic const struct regulator_ops da9062_buck_ops = {
32462306a36Sopenharmony_ci	.enable			= regulator_enable_regmap,
32562306a36Sopenharmony_ci	.disable		= regulator_disable_regmap,
32662306a36Sopenharmony_ci	.is_enabled		= regulator_is_enabled_regmap,
32762306a36Sopenharmony_ci	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
32862306a36Sopenharmony_ci	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
32962306a36Sopenharmony_ci	.list_voltage		= regulator_list_voltage_linear,
33062306a36Sopenharmony_ci	.set_current_limit	= regulator_set_current_limit_regmap,
33162306a36Sopenharmony_ci	.get_current_limit	= regulator_get_current_limit_regmap,
33262306a36Sopenharmony_ci	.set_mode		= da9062_buck_set_mode,
33362306a36Sopenharmony_ci	.get_mode		= da9062_buck_get_mode,
33462306a36Sopenharmony_ci	.get_status		= da9062_buck_get_status,
33562306a36Sopenharmony_ci	.set_suspend_voltage	= da9062_set_suspend_voltage,
33662306a36Sopenharmony_ci	.set_suspend_enable	= da9062_suspend_enable,
33762306a36Sopenharmony_ci	.set_suspend_disable	= da9062_suspend_disable,
33862306a36Sopenharmony_ci	.set_suspend_mode	= da9062_buck_set_suspend_mode,
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_cistatic const struct regulator_ops da9062_ldo_ops = {
34262306a36Sopenharmony_ci	.enable			= regulator_enable_regmap,
34362306a36Sopenharmony_ci	.disable		= regulator_disable_regmap,
34462306a36Sopenharmony_ci	.is_enabled		= regulator_is_enabled_regmap,
34562306a36Sopenharmony_ci	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
34662306a36Sopenharmony_ci	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
34762306a36Sopenharmony_ci	.list_voltage		= regulator_list_voltage_linear,
34862306a36Sopenharmony_ci	.set_mode		= da9062_ldo_set_mode,
34962306a36Sopenharmony_ci	.get_mode		= da9062_ldo_get_mode,
35062306a36Sopenharmony_ci	.get_status		= da9062_ldo_get_status,
35162306a36Sopenharmony_ci	.set_suspend_voltage	= da9062_set_suspend_voltage,
35262306a36Sopenharmony_ci	.set_suspend_enable	= da9062_suspend_enable,
35362306a36Sopenharmony_ci	.set_suspend_disable	= da9062_suspend_disable,
35462306a36Sopenharmony_ci	.set_suspend_mode	= da9062_ldo_set_suspend_mode,
35562306a36Sopenharmony_ci};
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci/* DA9061 Regulator information */
35862306a36Sopenharmony_cistatic const struct da9062_regulator_info local_da9061_regulator_info[] = {
35962306a36Sopenharmony_ci	{
36062306a36Sopenharmony_ci		.desc.id = DA9061_ID_BUCK1,
36162306a36Sopenharmony_ci		.desc.name = "DA9061 BUCK1",
36262306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("buck1"),
36362306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
36462306a36Sopenharmony_ci		.desc.ops = &da9062_buck_ops,
36562306a36Sopenharmony_ci		.desc.min_uV = (300) * 1000,
36662306a36Sopenharmony_ci		.desc.uV_step = (10) * 1000,
36762306a36Sopenharmony_ci		.desc.n_voltages = ((1570) - (300))/(10) + 1,
36862306a36Sopenharmony_ci		.desc.curr_table = da9062_buck_a_limits,
36962306a36Sopenharmony_ci		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
37062306a36Sopenharmony_ci		.desc.csel_reg = DA9062AA_BUCK_ILIM_C,
37162306a36Sopenharmony_ci		.desc.csel_mask = DA9062AA_BUCK1_ILIM_MASK,
37262306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_BUCK1_CONT,
37362306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_BUCK1_EN_MASK,
37462306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VBUCK1_A,
37562306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VBUCK1_A_MASK,
37662306a36Sopenharmony_ci		.desc.linear_min_sel = 0,
37762306a36Sopenharmony_ci		.desc.of_map_mode = da9062_map_buck_mode,
37862306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VBUCK1_A,
37962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_SL_A_MASK) - 1,
38062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
38162306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK1_SL_A_MASK)) - 1),
38262306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK1_B,
38362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_SL_B_MASK) - 1,
38462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
38562306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK1_SL_B_MASK)) - 1),
38662306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VBUCK1_B,
38762306a36Sopenharmony_ci		.mode = REG_FIELD(DA9062AA_BUCK1_CFG,
38862306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_MODE_MASK) - 1,
38962306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
39062306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK1_MODE_MASK)) - 1),
39162306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_BUCK1_CONT,
39262306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_CONF_MASK) - 1,
39362306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
39462306a36Sopenharmony_ci			__builtin_clz(DA9062AA_BUCK1_CONF_MASK) - 1),
39562306a36Sopenharmony_ci	},
39662306a36Sopenharmony_ci	{
39762306a36Sopenharmony_ci		.desc.id = DA9061_ID_BUCK2,
39862306a36Sopenharmony_ci		.desc.name = "DA9061 BUCK2",
39962306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("buck2"),
40062306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
40162306a36Sopenharmony_ci		.desc.ops = &da9062_buck_ops,
40262306a36Sopenharmony_ci		.desc.min_uV = (800) * 1000,
40362306a36Sopenharmony_ci		.desc.uV_step = (20) * 1000,
40462306a36Sopenharmony_ci		.desc.n_voltages = ((3340) - (800))/(20) + 1,
40562306a36Sopenharmony_ci		.desc.curr_table = da9062_buck_b_limits,
40662306a36Sopenharmony_ci		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_b_limits),
40762306a36Sopenharmony_ci		.desc.csel_reg = DA9062AA_BUCK_ILIM_A,
40862306a36Sopenharmony_ci		.desc.csel_mask = DA9062AA_BUCK3_ILIM_MASK,
40962306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_BUCK3_CONT,
41062306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_BUCK3_EN_MASK,
41162306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VBUCK3_A,
41262306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VBUCK3_A_MASK,
41362306a36Sopenharmony_ci		.desc.linear_min_sel = 0,
41462306a36Sopenharmony_ci		.desc.of_map_mode = da9062_map_buck_mode,
41562306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VBUCK3_A,
41662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_SL_A_MASK) - 1,
41762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
41862306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK3_SL_A_MASK)) - 1),
41962306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK3_B,
42062306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_SL_B_MASK) - 1,
42162306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
42262306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK3_SL_B_MASK)) - 1),
42362306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VBUCK3_B,
42462306a36Sopenharmony_ci		.mode = REG_FIELD(DA9062AA_BUCK3_CFG,
42562306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_MODE_MASK) - 1,
42662306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
42762306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK3_MODE_MASK)) - 1),
42862306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_BUCK3_CONT,
42962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_CONF_MASK) - 1,
43062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
43162306a36Sopenharmony_ci			__builtin_clz(DA9062AA_BUCK3_CONF_MASK) - 1),
43262306a36Sopenharmony_ci	},
43362306a36Sopenharmony_ci	{
43462306a36Sopenharmony_ci		.desc.id = DA9061_ID_BUCK3,
43562306a36Sopenharmony_ci		.desc.name = "DA9061 BUCK3",
43662306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("buck3"),
43762306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
43862306a36Sopenharmony_ci		.desc.ops = &da9062_buck_ops,
43962306a36Sopenharmony_ci		.desc.min_uV = (530) * 1000,
44062306a36Sopenharmony_ci		.desc.uV_step = (10) * 1000,
44162306a36Sopenharmony_ci		.desc.n_voltages = ((1800) - (530))/(10) + 1,
44262306a36Sopenharmony_ci		.desc.curr_table = da9062_buck_a_limits,
44362306a36Sopenharmony_ci		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
44462306a36Sopenharmony_ci		.desc.csel_reg = DA9062AA_BUCK_ILIM_B,
44562306a36Sopenharmony_ci		.desc.csel_mask = DA9062AA_BUCK4_ILIM_MASK,
44662306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_BUCK4_CONT,
44762306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_BUCK4_EN_MASK,
44862306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VBUCK4_A,
44962306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VBUCK4_A_MASK,
45062306a36Sopenharmony_ci		.desc.linear_min_sel = 0,
45162306a36Sopenharmony_ci		.desc.of_map_mode = da9062_map_buck_mode,
45262306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VBUCK4_A,
45362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_SL_A_MASK) - 1,
45462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
45562306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK4_SL_A_MASK)) - 1),
45662306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK4_B,
45762306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_SL_B_MASK) - 1,
45862306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
45962306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK4_SL_B_MASK)) - 1),
46062306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VBUCK4_B,
46162306a36Sopenharmony_ci		.mode = REG_FIELD(DA9062AA_BUCK4_CFG,
46262306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_MODE_MASK) - 1,
46362306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
46462306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK4_MODE_MASK)) - 1),
46562306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_BUCK4_CONT,
46662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_CONF_MASK) - 1,
46762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
46862306a36Sopenharmony_ci			__builtin_clz(DA9062AA_BUCK4_CONF_MASK) - 1),
46962306a36Sopenharmony_ci	},
47062306a36Sopenharmony_ci	{
47162306a36Sopenharmony_ci		.desc.id = DA9061_ID_LDO1,
47262306a36Sopenharmony_ci		.desc.name = "DA9061 LDO1",
47362306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo1"),
47462306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
47562306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
47662306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
47762306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
47862306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
47962306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
48062306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO1_CONT,
48162306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO1_EN_MASK,
48262306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO1_A,
48362306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO1_A_MASK,
48462306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
48562306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO1_A,
48662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_SL_A_MASK) - 1,
48762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
48862306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO1_SL_A_MASK)) - 1),
48962306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO1_B,
49062306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_SL_B_MASK) - 1,
49162306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
49262306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO1_SL_B_MASK)) - 1),
49362306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO1_B,
49462306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO1_CONT,
49562306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_CONF_MASK) - 1,
49662306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
49762306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO1_CONF_MASK) - 1),
49862306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
49962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_ILIM_MASK) - 1,
50062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
50162306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO1_ILIM_MASK)) - 1),
50262306a36Sopenharmony_ci	},
50362306a36Sopenharmony_ci	{
50462306a36Sopenharmony_ci		.desc.id = DA9061_ID_LDO2,
50562306a36Sopenharmony_ci		.desc.name = "DA9061 LDO2",
50662306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo2"),
50762306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
50862306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
50962306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
51062306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
51162306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
51262306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
51362306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO2_CONT,
51462306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO2_EN_MASK,
51562306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO2_A,
51662306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO2_A_MASK,
51762306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
51862306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO2_A,
51962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_SL_A_MASK) - 1,
52062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
52162306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO2_SL_A_MASK)) - 1),
52262306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO2_B,
52362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_SL_B_MASK) - 1,
52462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
52562306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO2_SL_B_MASK)) - 1),
52662306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO2_B,
52762306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO2_CONT,
52862306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_CONF_MASK) - 1,
52962306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
53062306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO2_CONF_MASK) - 1),
53162306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
53262306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_ILIM_MASK) - 1,
53362306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
53462306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO2_ILIM_MASK)) - 1),
53562306a36Sopenharmony_ci	},
53662306a36Sopenharmony_ci	{
53762306a36Sopenharmony_ci		.desc.id = DA9061_ID_LDO3,
53862306a36Sopenharmony_ci		.desc.name = "DA9061 LDO3",
53962306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo3"),
54062306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
54162306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
54262306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
54362306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
54462306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
54562306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
54662306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO3_CONT,
54762306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO3_EN_MASK,
54862306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO3_A,
54962306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO3_A_MASK,
55062306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
55162306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO3_A,
55262306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_SL_A_MASK) - 1,
55362306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
55462306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO3_SL_A_MASK)) - 1),
55562306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO3_B,
55662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_SL_B_MASK) - 1,
55762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
55862306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO3_SL_B_MASK)) - 1),
55962306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO3_B,
56062306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO3_CONT,
56162306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_CONF_MASK) - 1,
56262306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
56362306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO3_CONF_MASK) - 1),
56462306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
56562306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_ILIM_MASK) - 1,
56662306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
56762306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO3_ILIM_MASK)) - 1),
56862306a36Sopenharmony_ci	},
56962306a36Sopenharmony_ci	{
57062306a36Sopenharmony_ci		.desc.id = DA9061_ID_LDO4,
57162306a36Sopenharmony_ci		.desc.name = "DA9061 LDO4",
57262306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo4"),
57362306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
57462306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
57562306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
57662306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
57762306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
57862306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
57962306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO4_CONT,
58062306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO4_EN_MASK,
58162306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO4_A,
58262306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO4_A_MASK,
58362306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
58462306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO4_A,
58562306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_SL_A_MASK) - 1,
58662306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
58762306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO4_SL_A_MASK)) - 1),
58862306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO4_B,
58962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_SL_B_MASK) - 1,
59062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
59162306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO4_SL_B_MASK)) - 1),
59262306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO4_B,
59362306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO4_CONT,
59462306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_CONF_MASK) - 1,
59562306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
59662306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO4_CONF_MASK) - 1),
59762306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
59862306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_ILIM_MASK) - 1,
59962306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
60062306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO4_ILIM_MASK)) - 1),
60162306a36Sopenharmony_ci	},
60262306a36Sopenharmony_ci};
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci/* DA9062 Regulator information */
60562306a36Sopenharmony_cistatic const struct da9062_regulator_info local_da9062_regulator_info[] = {
60662306a36Sopenharmony_ci	{
60762306a36Sopenharmony_ci		.desc.id = DA9062_ID_BUCK1,
60862306a36Sopenharmony_ci		.desc.name = "DA9062 BUCK1",
60962306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("buck1"),
61062306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
61162306a36Sopenharmony_ci		.desc.ops = &da9062_buck_ops,
61262306a36Sopenharmony_ci		.desc.min_uV = (300) * 1000,
61362306a36Sopenharmony_ci		.desc.uV_step = (10) * 1000,
61462306a36Sopenharmony_ci		.desc.n_voltages = ((1570) - (300))/(10) + 1,
61562306a36Sopenharmony_ci		.desc.curr_table = da9062_buck_a_limits,
61662306a36Sopenharmony_ci		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
61762306a36Sopenharmony_ci		.desc.csel_reg = DA9062AA_BUCK_ILIM_C,
61862306a36Sopenharmony_ci		.desc.csel_mask = DA9062AA_BUCK1_ILIM_MASK,
61962306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_BUCK1_CONT,
62062306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_BUCK1_EN_MASK,
62162306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VBUCK1_A,
62262306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VBUCK1_A_MASK,
62362306a36Sopenharmony_ci		.desc.linear_min_sel = 0,
62462306a36Sopenharmony_ci		.desc.of_map_mode = da9062_map_buck_mode,
62562306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VBUCK1_A,
62662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_SL_A_MASK) - 1,
62762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
62862306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK1_SL_A_MASK)) - 1),
62962306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK1_B,
63062306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_SL_B_MASK) - 1,
63162306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
63262306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK1_SL_B_MASK)) - 1),
63362306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VBUCK1_B,
63462306a36Sopenharmony_ci		.mode = REG_FIELD(DA9062AA_BUCK1_CFG,
63562306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_MODE_MASK) - 1,
63662306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
63762306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK1_MODE_MASK)) - 1),
63862306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_BUCK1_CONT,
63962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK1_CONF_MASK) - 1,
64062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
64162306a36Sopenharmony_ci			__builtin_clz(DA9062AA_BUCK1_CONF_MASK) - 1),
64262306a36Sopenharmony_ci	},
64362306a36Sopenharmony_ci	{
64462306a36Sopenharmony_ci		.desc.id = DA9062_ID_BUCK2,
64562306a36Sopenharmony_ci		.desc.name = "DA9062 BUCK2",
64662306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("buck2"),
64762306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
64862306a36Sopenharmony_ci		.desc.ops = &da9062_buck_ops,
64962306a36Sopenharmony_ci		.desc.min_uV = (300) * 1000,
65062306a36Sopenharmony_ci		.desc.uV_step = (10) * 1000,
65162306a36Sopenharmony_ci		.desc.n_voltages = ((1570) - (300))/(10) + 1,
65262306a36Sopenharmony_ci		.desc.curr_table = da9062_buck_a_limits,
65362306a36Sopenharmony_ci		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
65462306a36Sopenharmony_ci		.desc.csel_reg = DA9062AA_BUCK_ILIM_C,
65562306a36Sopenharmony_ci		.desc.csel_mask = DA9062AA_BUCK2_ILIM_MASK,
65662306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_BUCK2_CONT,
65762306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_BUCK2_EN_MASK,
65862306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VBUCK2_A,
65962306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VBUCK2_A_MASK,
66062306a36Sopenharmony_ci		.desc.linear_min_sel = 0,
66162306a36Sopenharmony_ci		.desc.of_map_mode = da9062_map_buck_mode,
66262306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VBUCK2_A,
66362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK2_SL_A_MASK) - 1,
66462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
66562306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK2_SL_A_MASK)) - 1),
66662306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK2_B,
66762306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK2_SL_B_MASK) - 1,
66862306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
66962306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK2_SL_B_MASK)) - 1),
67062306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VBUCK2_B,
67162306a36Sopenharmony_ci		.mode = REG_FIELD(DA9062AA_BUCK2_CFG,
67262306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK2_MODE_MASK) - 1,
67362306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
67462306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK2_MODE_MASK)) - 1),
67562306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_BUCK2_CONT,
67662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK2_CONF_MASK) - 1,
67762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
67862306a36Sopenharmony_ci			__builtin_clz(DA9062AA_BUCK2_CONF_MASK) - 1),
67962306a36Sopenharmony_ci	},
68062306a36Sopenharmony_ci	{
68162306a36Sopenharmony_ci		.desc.id = DA9062_ID_BUCK3,
68262306a36Sopenharmony_ci		.desc.name = "DA9062 BUCK3",
68362306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("buck3"),
68462306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
68562306a36Sopenharmony_ci		.desc.ops = &da9062_buck_ops,
68662306a36Sopenharmony_ci		.desc.min_uV = (800) * 1000,
68762306a36Sopenharmony_ci		.desc.uV_step = (20) * 1000,
68862306a36Sopenharmony_ci		.desc.n_voltages = ((3340) - (800))/(20) + 1,
68962306a36Sopenharmony_ci		.desc.curr_table = da9062_buck_b_limits,
69062306a36Sopenharmony_ci		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_b_limits),
69162306a36Sopenharmony_ci		.desc.csel_reg = DA9062AA_BUCK_ILIM_A,
69262306a36Sopenharmony_ci		.desc.csel_mask = DA9062AA_BUCK3_ILIM_MASK,
69362306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_BUCK3_CONT,
69462306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_BUCK3_EN_MASK,
69562306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VBUCK3_A,
69662306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VBUCK3_A_MASK,
69762306a36Sopenharmony_ci		.desc.linear_min_sel = 0,
69862306a36Sopenharmony_ci		.desc.of_map_mode = da9062_map_buck_mode,
69962306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VBUCK3_A,
70062306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_SL_A_MASK) - 1,
70162306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
70262306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK3_SL_A_MASK)) - 1),
70362306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK3_B,
70462306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_SL_B_MASK) - 1,
70562306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
70662306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK3_SL_B_MASK)) - 1),
70762306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VBUCK3_B,
70862306a36Sopenharmony_ci		.mode = REG_FIELD(DA9062AA_BUCK3_CFG,
70962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_MODE_MASK) - 1,
71062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
71162306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK3_MODE_MASK)) - 1),
71262306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_BUCK3_CONT,
71362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK3_CONF_MASK) - 1,
71462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
71562306a36Sopenharmony_ci			__builtin_clz(DA9062AA_BUCK3_CONF_MASK) - 1),
71662306a36Sopenharmony_ci	},
71762306a36Sopenharmony_ci	{
71862306a36Sopenharmony_ci		.desc.id = DA9062_ID_BUCK4,
71962306a36Sopenharmony_ci		.desc.name = "DA9062 BUCK4",
72062306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("buck4"),
72162306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
72262306a36Sopenharmony_ci		.desc.ops = &da9062_buck_ops,
72362306a36Sopenharmony_ci		.desc.min_uV = (530) * 1000,
72462306a36Sopenharmony_ci		.desc.uV_step = (10) * 1000,
72562306a36Sopenharmony_ci		.desc.n_voltages = ((1800) - (530))/(10) + 1,
72662306a36Sopenharmony_ci		.desc.curr_table = da9062_buck_a_limits,
72762306a36Sopenharmony_ci		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
72862306a36Sopenharmony_ci		.desc.csel_reg = DA9062AA_BUCK_ILIM_B,
72962306a36Sopenharmony_ci		.desc.csel_mask = DA9062AA_BUCK4_ILIM_MASK,
73062306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_BUCK4_CONT,
73162306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_BUCK4_EN_MASK,
73262306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VBUCK4_A,
73362306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VBUCK4_A_MASK,
73462306a36Sopenharmony_ci		.desc.linear_min_sel = 0,
73562306a36Sopenharmony_ci		.desc.of_map_mode = da9062_map_buck_mode,
73662306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VBUCK4_A,
73762306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_SL_A_MASK) - 1,
73862306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
73962306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK4_SL_A_MASK)) - 1),
74062306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK4_B,
74162306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_SL_B_MASK) - 1,
74262306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
74362306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK4_SL_B_MASK)) - 1),
74462306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VBUCK4_B,
74562306a36Sopenharmony_ci		.mode = REG_FIELD(DA9062AA_BUCK4_CFG,
74662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_MODE_MASK) - 1,
74762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
74862306a36Sopenharmony_ci			__builtin_clz((DA9062AA_BUCK4_MODE_MASK)) - 1),
74962306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_BUCK4_CONT,
75062306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_BUCK4_CONF_MASK) - 1,
75162306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
75262306a36Sopenharmony_ci			__builtin_clz(DA9062AA_BUCK4_CONF_MASK) - 1),
75362306a36Sopenharmony_ci	},
75462306a36Sopenharmony_ci	{
75562306a36Sopenharmony_ci		.desc.id = DA9062_ID_LDO1,
75662306a36Sopenharmony_ci		.desc.name = "DA9062 LDO1",
75762306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo1"),
75862306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
75962306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
76062306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
76162306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
76262306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
76362306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
76462306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO1_CONT,
76562306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO1_EN_MASK,
76662306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO1_A,
76762306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO1_A_MASK,
76862306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
76962306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO1_A,
77062306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_SL_A_MASK) - 1,
77162306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
77262306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO1_SL_A_MASK)) - 1),
77362306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO1_B,
77462306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_SL_B_MASK) - 1,
77562306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
77662306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO1_SL_B_MASK)) - 1),
77762306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO1_B,
77862306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO1_CONT,
77962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_CONF_MASK) - 1,
78062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
78162306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO1_CONF_MASK) - 1),
78262306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
78362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO1_ILIM_MASK) - 1,
78462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
78562306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO1_ILIM_MASK)) - 1),
78662306a36Sopenharmony_ci	},
78762306a36Sopenharmony_ci	{
78862306a36Sopenharmony_ci		.desc.id = DA9062_ID_LDO2,
78962306a36Sopenharmony_ci		.desc.name = "DA9062 LDO2",
79062306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo2"),
79162306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
79262306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
79362306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
79462306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
79562306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
79662306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
79762306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO2_CONT,
79862306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO2_EN_MASK,
79962306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO2_A,
80062306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO2_A_MASK,
80162306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
80262306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO2_A,
80362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_SL_A_MASK) - 1,
80462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
80562306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO2_SL_A_MASK)) - 1),
80662306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO2_B,
80762306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_SL_B_MASK) - 1,
80862306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
80962306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO2_SL_B_MASK)) - 1),
81062306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO2_B,
81162306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO2_CONT,
81262306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_CONF_MASK) - 1,
81362306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
81462306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO2_CONF_MASK) - 1),
81562306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
81662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO2_ILIM_MASK) - 1,
81762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
81862306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO2_ILIM_MASK)) - 1),
81962306a36Sopenharmony_ci	},
82062306a36Sopenharmony_ci	{
82162306a36Sopenharmony_ci		.desc.id = DA9062_ID_LDO3,
82262306a36Sopenharmony_ci		.desc.name = "DA9062 LDO3",
82362306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo3"),
82462306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
82562306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
82662306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
82762306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
82862306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
82962306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
83062306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO3_CONT,
83162306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO3_EN_MASK,
83262306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO3_A,
83362306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO3_A_MASK,
83462306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
83562306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO3_A,
83662306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_SL_A_MASK) - 1,
83762306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
83862306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO3_SL_A_MASK)) - 1),
83962306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO3_B,
84062306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_SL_B_MASK) - 1,
84162306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
84262306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO3_SL_B_MASK)) - 1),
84362306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO3_B,
84462306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO3_CONT,
84562306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_CONF_MASK) - 1,
84662306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
84762306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO3_CONF_MASK) - 1),
84862306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
84962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO3_ILIM_MASK) - 1,
85062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
85162306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO3_ILIM_MASK)) - 1),
85262306a36Sopenharmony_ci	},
85362306a36Sopenharmony_ci	{
85462306a36Sopenharmony_ci		.desc.id = DA9062_ID_LDO4,
85562306a36Sopenharmony_ci		.desc.name = "DA9062 LDO4",
85662306a36Sopenharmony_ci		.desc.of_match = of_match_ptr("ldo4"),
85762306a36Sopenharmony_ci		.desc.regulators_node = of_match_ptr("regulators"),
85862306a36Sopenharmony_ci		.desc.ops = &da9062_ldo_ops,
85962306a36Sopenharmony_ci		.desc.min_uV = (900) * 1000,
86062306a36Sopenharmony_ci		.desc.uV_step = (50) * 1000,
86162306a36Sopenharmony_ci		.desc.n_voltages = ((3600) - (900))/(50) + 1
86262306a36Sopenharmony_ci				+ DA9062AA_VLDO_A_MIN_SEL,
86362306a36Sopenharmony_ci		.desc.enable_reg = DA9062AA_LDO4_CONT,
86462306a36Sopenharmony_ci		.desc.enable_mask = DA9062AA_LDO4_EN_MASK,
86562306a36Sopenharmony_ci		.desc.vsel_reg = DA9062AA_VLDO4_A,
86662306a36Sopenharmony_ci		.desc.vsel_mask = DA9062AA_VLDO4_A_MASK,
86762306a36Sopenharmony_ci		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
86862306a36Sopenharmony_ci		.sleep = REG_FIELD(DA9062AA_VLDO4_A,
86962306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_SL_A_MASK) - 1,
87062306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
87162306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO4_SL_A_MASK)) - 1),
87262306a36Sopenharmony_ci		.suspend_sleep = REG_FIELD(DA9062AA_VLDO4_B,
87362306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_SL_B_MASK) - 1,
87462306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
87562306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO4_SL_B_MASK)) - 1),
87662306a36Sopenharmony_ci		.suspend_vsel_reg = DA9062AA_VLDO4_B,
87762306a36Sopenharmony_ci		.suspend = REG_FIELD(DA9062AA_LDO4_CONT,
87862306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_CONF_MASK) - 1,
87962306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
88062306a36Sopenharmony_ci			__builtin_clz(DA9062AA_LDO4_CONF_MASK) - 1),
88162306a36Sopenharmony_ci		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
88262306a36Sopenharmony_ci			__builtin_ffs((int)DA9062AA_LDO4_ILIM_MASK) - 1,
88362306a36Sopenharmony_ci			sizeof(unsigned int) * 8 -
88462306a36Sopenharmony_ci			__builtin_clz((DA9062AA_LDO4_ILIM_MASK)) - 1),
88562306a36Sopenharmony_ci	},
88662306a36Sopenharmony_ci};
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci/* Regulator interrupt handlers */
88962306a36Sopenharmony_cistatic irqreturn_t da9062_ldo_lim_event(int irq, void *data)
89062306a36Sopenharmony_ci{
89162306a36Sopenharmony_ci	struct da9062_regulators *regulators = data;
89262306a36Sopenharmony_ci	struct da9062 *hw = regulators->regulator[0].hw;
89362306a36Sopenharmony_ci	struct da9062_regulator *regl;
89462306a36Sopenharmony_ci	int handled = IRQ_NONE;
89562306a36Sopenharmony_ci	int bits, i, ret;
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci	ret = regmap_read(hw->regmap, DA9062AA_STATUS_D, &bits);
89862306a36Sopenharmony_ci	if (ret < 0) {
89962306a36Sopenharmony_ci		dev_err(hw->dev,
90062306a36Sopenharmony_ci			"Failed to read LDO overcurrent indicator\n");
90162306a36Sopenharmony_ci		goto ldo_lim_error;
90262306a36Sopenharmony_ci	}
90362306a36Sopenharmony_ci
90462306a36Sopenharmony_ci	for (i = regulators->n_regulators - 1; i >= 0; i--) {
90562306a36Sopenharmony_ci		regl = &regulators->regulator[i];
90662306a36Sopenharmony_ci		if (regl->info->oc_event.reg != DA9062AA_STATUS_D)
90762306a36Sopenharmony_ci			continue;
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci		if (BIT(regl->info->oc_event.lsb) & bits) {
91062306a36Sopenharmony_ci			regulator_notifier_call_chain(regl->rdev,
91162306a36Sopenharmony_ci					REGULATOR_EVENT_OVER_CURRENT, NULL);
91262306a36Sopenharmony_ci			handled = IRQ_HANDLED;
91362306a36Sopenharmony_ci		}
91462306a36Sopenharmony_ci	}
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_cildo_lim_error:
91762306a36Sopenharmony_ci	return handled;
91862306a36Sopenharmony_ci}
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_cistatic int da9062_regulator_probe(struct platform_device *pdev)
92162306a36Sopenharmony_ci{
92262306a36Sopenharmony_ci	struct da9062 *chip = dev_get_drvdata(pdev->dev.parent);
92362306a36Sopenharmony_ci	struct da9062_regulators *regulators;
92462306a36Sopenharmony_ci	struct da9062_regulator *regl;
92562306a36Sopenharmony_ci	struct regulator_config config = { };
92662306a36Sopenharmony_ci	const struct da9062_regulator_info *rinfo;
92762306a36Sopenharmony_ci	int n, ret;
92862306a36Sopenharmony_ci	int max_regulators;
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_ci	switch (chip->chip_type) {
93162306a36Sopenharmony_ci	case COMPAT_TYPE_DA9061:
93262306a36Sopenharmony_ci		max_regulators = DA9061_MAX_REGULATORS;
93362306a36Sopenharmony_ci		rinfo = local_da9061_regulator_info;
93462306a36Sopenharmony_ci		break;
93562306a36Sopenharmony_ci	case COMPAT_TYPE_DA9062:
93662306a36Sopenharmony_ci		max_regulators = DA9062_MAX_REGULATORS;
93762306a36Sopenharmony_ci		rinfo = local_da9062_regulator_info;
93862306a36Sopenharmony_ci		break;
93962306a36Sopenharmony_ci	default:
94062306a36Sopenharmony_ci		dev_err(chip->dev, "Unrecognised chip type\n");
94162306a36Sopenharmony_ci		return -ENODEV;
94262306a36Sopenharmony_ci	}
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_ci	/* Allocate memory required by usable regulators */
94562306a36Sopenharmony_ci	regulators = devm_kzalloc(&pdev->dev, struct_size(regulators, regulator,
94662306a36Sopenharmony_ci				  max_regulators), GFP_KERNEL);
94762306a36Sopenharmony_ci	if (!regulators)
94862306a36Sopenharmony_ci		return -ENOMEM;
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	regulators->n_regulators = max_regulators;
95162306a36Sopenharmony_ci	platform_set_drvdata(pdev, regulators);
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_ci	for (n = 0; n < regulators->n_regulators; n++) {
95462306a36Sopenharmony_ci		/* Initialise regulator structure */
95562306a36Sopenharmony_ci		regl = &regulators->regulator[n];
95662306a36Sopenharmony_ci		regl->hw = chip;
95762306a36Sopenharmony_ci		regl->info = &rinfo[n];
95862306a36Sopenharmony_ci		regl->desc = regl->info->desc;
95962306a36Sopenharmony_ci		regl->desc.type = REGULATOR_VOLTAGE;
96062306a36Sopenharmony_ci		regl->desc.owner = THIS_MODULE;
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_ci		if (regl->info->mode.reg) {
96362306a36Sopenharmony_ci			regl->mode = devm_regmap_field_alloc(
96462306a36Sopenharmony_ci					&pdev->dev,
96562306a36Sopenharmony_ci					chip->regmap,
96662306a36Sopenharmony_ci					regl->info->mode);
96762306a36Sopenharmony_ci			if (IS_ERR(regl->mode))
96862306a36Sopenharmony_ci				return PTR_ERR(regl->mode);
96962306a36Sopenharmony_ci		}
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci		if (regl->info->suspend.reg) {
97262306a36Sopenharmony_ci			regl->suspend = devm_regmap_field_alloc(
97362306a36Sopenharmony_ci					&pdev->dev,
97462306a36Sopenharmony_ci					chip->regmap,
97562306a36Sopenharmony_ci					regl->info->suspend);
97662306a36Sopenharmony_ci			if (IS_ERR(regl->suspend))
97762306a36Sopenharmony_ci				return PTR_ERR(regl->suspend);
97862306a36Sopenharmony_ci		}
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_ci		if (regl->info->sleep.reg) {
98162306a36Sopenharmony_ci			regl->sleep = devm_regmap_field_alloc(
98262306a36Sopenharmony_ci					&pdev->dev,
98362306a36Sopenharmony_ci					chip->regmap,
98462306a36Sopenharmony_ci					regl->info->sleep);
98562306a36Sopenharmony_ci			if (IS_ERR(regl->sleep))
98662306a36Sopenharmony_ci				return PTR_ERR(regl->sleep);
98762306a36Sopenharmony_ci		}
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_ci		if (regl->info->suspend_sleep.reg) {
99062306a36Sopenharmony_ci			regl->suspend_sleep = devm_regmap_field_alloc(
99162306a36Sopenharmony_ci					&pdev->dev,
99262306a36Sopenharmony_ci					chip->regmap,
99362306a36Sopenharmony_ci					regl->info->suspend_sleep);
99462306a36Sopenharmony_ci			if (IS_ERR(regl->suspend_sleep))
99562306a36Sopenharmony_ci				return PTR_ERR(regl->suspend_sleep);
99662306a36Sopenharmony_ci		}
99762306a36Sopenharmony_ci
99862306a36Sopenharmony_ci		/* Register regulator */
99962306a36Sopenharmony_ci		memset(&config, 0, sizeof(config));
100062306a36Sopenharmony_ci		config.dev = chip->dev;
100162306a36Sopenharmony_ci		config.driver_data = regl;
100262306a36Sopenharmony_ci		config.regmap = chip->regmap;
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_ci		regl->rdev = devm_regulator_register(&pdev->dev, &regl->desc,
100562306a36Sopenharmony_ci						     &config);
100662306a36Sopenharmony_ci		if (IS_ERR(regl->rdev)) {
100762306a36Sopenharmony_ci			dev_err(&pdev->dev,
100862306a36Sopenharmony_ci				"Failed to register %s regulator\n",
100962306a36Sopenharmony_ci				regl->desc.name);
101062306a36Sopenharmony_ci			return PTR_ERR(regl->rdev);
101162306a36Sopenharmony_ci		}
101262306a36Sopenharmony_ci	}
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_ci	/* LDOs overcurrent event support */
101562306a36Sopenharmony_ci	regulators->irq_ldo_lim = platform_get_irq_byname_optional(pdev, "LDO_LIM");
101662306a36Sopenharmony_ci	if (regulators->irq_ldo_lim < 0)
101762306a36Sopenharmony_ci		return 0;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	ret = devm_request_threaded_irq(&pdev->dev, regulators->irq_ldo_lim,
102062306a36Sopenharmony_ci					NULL, da9062_ldo_lim_event,
102162306a36Sopenharmony_ci					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
102262306a36Sopenharmony_ci					"LDO_LIM", regulators);
102362306a36Sopenharmony_ci	if (ret) {
102462306a36Sopenharmony_ci		dev_warn(&pdev->dev,
102562306a36Sopenharmony_ci			 "Failed to request LDO_LIM IRQ.\n");
102662306a36Sopenharmony_ci		regulators->irq_ldo_lim = -ENXIO;
102762306a36Sopenharmony_ci	}
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci	return 0;
103062306a36Sopenharmony_ci}
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_cistatic struct platform_driver da9062_regulator_driver = {
103362306a36Sopenharmony_ci	.driver = {
103462306a36Sopenharmony_ci		.name = "da9062-regulators",
103562306a36Sopenharmony_ci		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
103662306a36Sopenharmony_ci	},
103762306a36Sopenharmony_ci	.probe = da9062_regulator_probe,
103862306a36Sopenharmony_ci};
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_cistatic int __init da9062_regulator_init(void)
104162306a36Sopenharmony_ci{
104262306a36Sopenharmony_ci	return platform_driver_register(&da9062_regulator_driver);
104362306a36Sopenharmony_ci}
104462306a36Sopenharmony_cisubsys_initcall(da9062_regulator_init);
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_cistatic void __exit da9062_regulator_cleanup(void)
104762306a36Sopenharmony_ci{
104862306a36Sopenharmony_ci	platform_driver_unregister(&da9062_regulator_driver);
104962306a36Sopenharmony_ci}
105062306a36Sopenharmony_cimodule_exit(da9062_regulator_cleanup);
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci/* Module information */
105362306a36Sopenharmony_ciMODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
105462306a36Sopenharmony_ciMODULE_DESCRIPTION("REGULATOR device driver for Dialog DA9062 and DA9061");
105562306a36Sopenharmony_ciMODULE_LICENSE("GPL");
105662306a36Sopenharmony_ciMODULE_ALIAS("platform:da9062-regulators");
1057