cachepc-linux

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

da9062-regulator.c (33862B)


      1// SPDX-License-Identifier: GPL-2.0+
      2//
      3// Regulator device driver for DA9061 and DA9062.
      4// Copyright (C) 2015-2017  Dialog Semiconductor
      5
      6#include <linux/kernel.h>
      7#include <linux/module.h>
      8#include <linux/init.h>
      9#include <linux/err.h>
     10#include <linux/slab.h>
     11#include <linux/of.h>
     12#include <linux/platform_device.h>
     13#include <linux/regmap.h>
     14#include <linux/regulator/driver.h>
     15#include <linux/regulator/machine.h>
     16#include <linux/regulator/of_regulator.h>
     17#include <linux/mfd/da9062/core.h>
     18#include <linux/mfd/da9062/registers.h>
     19#include <dt-bindings/regulator/dlg,da9063-regulator.h>
     20
     21/* Regulator IDs */
     22enum {
     23	DA9061_ID_BUCK1,
     24	DA9061_ID_BUCK2,
     25	DA9061_ID_BUCK3,
     26	DA9061_ID_LDO1,
     27	DA9061_ID_LDO2,
     28	DA9061_ID_LDO3,
     29	DA9061_ID_LDO4,
     30	DA9061_MAX_REGULATORS,
     31};
     32
     33enum {
     34	DA9062_ID_BUCK1,
     35	DA9062_ID_BUCK2,
     36	DA9062_ID_BUCK3,
     37	DA9062_ID_BUCK4,
     38	DA9062_ID_LDO1,
     39	DA9062_ID_LDO2,
     40	DA9062_ID_LDO3,
     41	DA9062_ID_LDO4,
     42	DA9062_MAX_REGULATORS,
     43};
     44
     45/* Regulator capabilities and registers description */
     46struct da9062_regulator_info {
     47	struct regulator_desc desc;
     48	/* Main register fields */
     49	struct reg_field mode;
     50	struct reg_field suspend;
     51	struct reg_field sleep;
     52	struct reg_field suspend_sleep;
     53	unsigned int suspend_vsel_reg;
     54	/* Event detection bit */
     55	struct reg_field oc_event;
     56};
     57
     58/* Single regulator settings */
     59struct da9062_regulator {
     60	struct regulator_desc			desc;
     61	struct regulator_dev			*rdev;
     62	struct da9062				*hw;
     63	const struct da9062_regulator_info	*info;
     64
     65	struct regmap_field			*mode;
     66	struct regmap_field			*suspend;
     67	struct regmap_field			*sleep;
     68	struct regmap_field			*suspend_sleep;
     69};
     70
     71/* Encapsulates all information for the regulators driver */
     72struct da9062_regulators {
     73	int					irq_ldo_lim;
     74	unsigned				n_regulators;
     75	/* Array size to be defined during init. Keep at end. */
     76	struct da9062_regulator			regulator[];
     77};
     78
     79/* Regulator operations */
     80
     81/* Current limits array (in uA)
     82 * - DA9061_ID_[BUCK1|BUCK3]
     83 * - DA9062_ID_[BUCK1|BUCK2|BUCK4]
     84 * Entry indexes corresponds to register values.
     85 */
     86static const unsigned int da9062_buck_a_limits[] = {
     87	 500000,  600000,  700000,  800000,  900000, 1000000, 1100000, 1200000,
     88	1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000
     89};
     90
     91/* Current limits array (in uA)
     92 * - DA9061_ID_BUCK2
     93 * - DA9062_ID_BUCK3
     94 * Entry indexes corresponds to register values.
     95 */
     96static const unsigned int da9062_buck_b_limits[] = {
     97	1500000, 1600000, 1700000, 1800000, 1900000, 2000000, 2100000, 2200000,
     98	2300000, 2400000, 2500000, 2600000, 2700000, 2800000, 2900000, 3000000
     99};
    100
    101static unsigned int da9062_map_buck_mode(unsigned int mode)
    102{
    103	switch (mode) {
    104	case DA9063_BUCK_MODE_SLEEP:
    105		return REGULATOR_MODE_STANDBY;
    106	case DA9063_BUCK_MODE_SYNC:
    107		return REGULATOR_MODE_FAST;
    108	case DA9063_BUCK_MODE_AUTO:
    109		return REGULATOR_MODE_NORMAL;
    110	default:
    111		return REGULATOR_MODE_INVALID;
    112	}
    113}
    114
    115static int da9062_buck_set_mode(struct regulator_dev *rdev, unsigned mode)
    116{
    117	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    118	unsigned val;
    119
    120	switch (mode) {
    121	case REGULATOR_MODE_FAST:
    122		val = DA9063_BUCK_MODE_SYNC;
    123		break;
    124	case REGULATOR_MODE_NORMAL:
    125		val = DA9063_BUCK_MODE_AUTO;
    126		break;
    127	case REGULATOR_MODE_STANDBY:
    128		val = DA9063_BUCK_MODE_SLEEP;
    129		break;
    130	default:
    131		return -EINVAL;
    132	}
    133
    134	return regmap_field_write(regl->mode, val);
    135}
    136
    137/*
    138 * Bucks use single mode register field for normal operation
    139 * and suspend state.
    140 * There are 3 modes to map to: FAST, NORMAL, and STANDBY.
    141 */
    142
    143static unsigned da9062_buck_get_mode(struct regulator_dev *rdev)
    144{
    145	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    146	unsigned int val;
    147	int ret;
    148
    149	ret = regmap_field_read(regl->mode, &val);
    150	if (ret < 0)
    151		return ret;
    152
    153	switch (val) {
    154	default:
    155		/* Sleep flag bit decides the mode */
    156		break;
    157	case DA9063_BUCK_MODE_SLEEP:
    158		return REGULATOR_MODE_STANDBY;
    159	case DA9063_BUCK_MODE_SYNC:
    160		return REGULATOR_MODE_FAST;
    161	case DA9063_BUCK_MODE_AUTO:
    162		return REGULATOR_MODE_NORMAL;
    163	}
    164
    165	ret = regmap_field_read(regl->sleep, &val);
    166	if (ret < 0)
    167		return 0;
    168
    169	if (val)
    170		return REGULATOR_MODE_STANDBY;
    171	else
    172		return REGULATOR_MODE_FAST;
    173}
    174
    175/*
    176 * LDOs use sleep flags - one for normal and one for suspend state.
    177 * There are 2 modes to map to: NORMAL and STANDBY (sleep) for each state.
    178 */
    179
    180static int da9062_ldo_set_mode(struct regulator_dev *rdev, unsigned mode)
    181{
    182	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    183	unsigned val;
    184
    185	switch (mode) {
    186	case REGULATOR_MODE_NORMAL:
    187		val = 0;
    188		break;
    189	case REGULATOR_MODE_STANDBY:
    190		val = 1;
    191		break;
    192	default:
    193		return -EINVAL;
    194	}
    195
    196	return regmap_field_write(regl->sleep, val);
    197}
    198
    199static unsigned da9062_ldo_get_mode(struct regulator_dev *rdev)
    200{
    201	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    202	int ret, val;
    203
    204	ret = regmap_field_read(regl->sleep, &val);
    205	if (ret < 0)
    206		return 0;
    207
    208	if (val)
    209		return REGULATOR_MODE_STANDBY;
    210	else
    211		return REGULATOR_MODE_NORMAL;
    212}
    213
    214static int da9062_buck_get_status(struct regulator_dev *rdev)
    215{
    216	int ret = regulator_is_enabled_regmap(rdev);
    217
    218	if (ret == 0) {
    219		ret = REGULATOR_STATUS_OFF;
    220	} else if (ret > 0) {
    221		ret = da9062_buck_get_mode(rdev);
    222		if (ret > 0)
    223			ret = regulator_mode_to_status(ret);
    224		else if (ret == 0)
    225			ret = -EIO;
    226	}
    227
    228	return ret;
    229}
    230
    231static int da9062_ldo_get_status(struct regulator_dev *rdev)
    232{
    233	int ret = regulator_is_enabled_regmap(rdev);
    234
    235	if (ret == 0) {
    236		ret = REGULATOR_STATUS_OFF;
    237	} else if (ret > 0) {
    238		ret = da9062_ldo_get_mode(rdev);
    239		if (ret > 0)
    240			ret = regulator_mode_to_status(ret);
    241		else if (ret == 0)
    242			ret = -EIO;
    243	}
    244
    245	return ret;
    246}
    247
    248static int da9062_set_suspend_voltage(struct regulator_dev *rdev, int uv)
    249{
    250	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    251	const struct da9062_regulator_info *rinfo = regl->info;
    252	int ret, sel;
    253
    254	sel = regulator_map_voltage_linear(rdev, uv, uv);
    255	if (sel < 0)
    256		return sel;
    257
    258	sel <<= ffs(rdev->desc->vsel_mask) - 1;
    259
    260	ret = regmap_update_bits(regl->hw->regmap, rinfo->suspend_vsel_reg,
    261				 rdev->desc->vsel_mask, sel);
    262
    263	return ret;
    264}
    265
    266static int da9062_suspend_enable(struct regulator_dev *rdev)
    267{
    268	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    269
    270	return regmap_field_write(regl->suspend, 1);
    271}
    272
    273static int da9062_suspend_disable(struct regulator_dev *rdev)
    274{
    275	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    276
    277	return regmap_field_write(regl->suspend, 0);
    278}
    279
    280static int da9062_buck_set_suspend_mode(struct regulator_dev *rdev,
    281					unsigned mode)
    282{
    283	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    284	int val;
    285
    286	switch (mode) {
    287	case REGULATOR_MODE_FAST:
    288		val = DA9063_BUCK_MODE_SYNC;
    289		break;
    290	case REGULATOR_MODE_NORMAL:
    291		val = DA9063_BUCK_MODE_AUTO;
    292		break;
    293	case REGULATOR_MODE_STANDBY:
    294		val = DA9063_BUCK_MODE_SLEEP;
    295		break;
    296	default:
    297		return -EINVAL;
    298	}
    299
    300	return regmap_field_write(regl->mode, val);
    301}
    302
    303static int da9062_ldo_set_suspend_mode(struct regulator_dev *rdev,
    304						unsigned mode)
    305{
    306	struct da9062_regulator *regl = rdev_get_drvdata(rdev);
    307	unsigned val;
    308
    309	switch (mode) {
    310	case REGULATOR_MODE_NORMAL:
    311		val = 0;
    312		break;
    313	case REGULATOR_MODE_STANDBY:
    314		val = 1;
    315		break;
    316	default:
    317		return -EINVAL;
    318	}
    319
    320	return regmap_field_write(regl->suspend_sleep, val);
    321}
    322
    323static const struct regulator_ops da9062_buck_ops = {
    324	.enable			= regulator_enable_regmap,
    325	.disable		= regulator_disable_regmap,
    326	.is_enabled		= regulator_is_enabled_regmap,
    327	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
    328	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
    329	.list_voltage		= regulator_list_voltage_linear,
    330	.set_current_limit	= regulator_set_current_limit_regmap,
    331	.get_current_limit	= regulator_get_current_limit_regmap,
    332	.set_mode		= da9062_buck_set_mode,
    333	.get_mode		= da9062_buck_get_mode,
    334	.get_status		= da9062_buck_get_status,
    335	.set_suspend_voltage	= da9062_set_suspend_voltage,
    336	.set_suspend_enable	= da9062_suspend_enable,
    337	.set_suspend_disable	= da9062_suspend_disable,
    338	.set_suspend_mode	= da9062_buck_set_suspend_mode,
    339};
    340
    341static const struct regulator_ops da9062_ldo_ops = {
    342	.enable			= regulator_enable_regmap,
    343	.disable		= regulator_disable_regmap,
    344	.is_enabled		= regulator_is_enabled_regmap,
    345	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
    346	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
    347	.list_voltage		= regulator_list_voltage_linear,
    348	.set_mode		= da9062_ldo_set_mode,
    349	.get_mode		= da9062_ldo_get_mode,
    350	.get_status		= da9062_ldo_get_status,
    351	.set_suspend_voltage	= da9062_set_suspend_voltage,
    352	.set_suspend_enable	= da9062_suspend_enable,
    353	.set_suspend_disable	= da9062_suspend_disable,
    354	.set_suspend_mode	= da9062_ldo_set_suspend_mode,
    355};
    356
    357/* DA9061 Regulator information */
    358static const struct da9062_regulator_info local_da9061_regulator_info[] = {
    359	{
    360		.desc.id = DA9061_ID_BUCK1,
    361		.desc.name = "DA9061 BUCK1",
    362		.desc.of_match = of_match_ptr("buck1"),
    363		.desc.regulators_node = of_match_ptr("regulators"),
    364		.desc.ops = &da9062_buck_ops,
    365		.desc.min_uV = (300) * 1000,
    366		.desc.uV_step = (10) * 1000,
    367		.desc.n_voltages = ((1570) - (300))/(10) + 1,
    368		.desc.curr_table = da9062_buck_a_limits,
    369		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
    370		.desc.csel_reg = DA9062AA_BUCK_ILIM_C,
    371		.desc.csel_mask = DA9062AA_BUCK1_ILIM_MASK,
    372		.desc.enable_reg = DA9062AA_BUCK1_CONT,
    373		.desc.enable_mask = DA9062AA_BUCK1_EN_MASK,
    374		.desc.vsel_reg = DA9062AA_VBUCK1_A,
    375		.desc.vsel_mask = DA9062AA_VBUCK1_A_MASK,
    376		.desc.linear_min_sel = 0,
    377		.desc.of_map_mode = da9062_map_buck_mode,
    378		.sleep = REG_FIELD(DA9062AA_VBUCK1_A,
    379			__builtin_ffs((int)DA9062AA_BUCK1_SL_A_MASK) - 1,
    380			sizeof(unsigned int) * 8 -
    381			__builtin_clz((DA9062AA_BUCK1_SL_A_MASK)) - 1),
    382		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK1_B,
    383			__builtin_ffs((int)DA9062AA_BUCK1_SL_B_MASK) - 1,
    384			sizeof(unsigned int) * 8 -
    385			__builtin_clz((DA9062AA_BUCK1_SL_B_MASK)) - 1),
    386		.suspend_vsel_reg = DA9062AA_VBUCK1_B,
    387		.mode = REG_FIELD(DA9062AA_BUCK1_CFG,
    388			__builtin_ffs((int)DA9062AA_BUCK1_MODE_MASK) - 1,
    389			sizeof(unsigned int) * 8 -
    390			__builtin_clz((DA9062AA_BUCK1_MODE_MASK)) - 1),
    391		.suspend = REG_FIELD(DA9062AA_BUCK1_CONT,
    392			__builtin_ffs((int)DA9062AA_BUCK1_CONF_MASK) - 1,
    393			sizeof(unsigned int) * 8 -
    394			__builtin_clz(DA9062AA_BUCK1_CONF_MASK) - 1),
    395	},
    396	{
    397		.desc.id = DA9061_ID_BUCK2,
    398		.desc.name = "DA9061 BUCK2",
    399		.desc.of_match = of_match_ptr("buck2"),
    400		.desc.regulators_node = of_match_ptr("regulators"),
    401		.desc.ops = &da9062_buck_ops,
    402		.desc.min_uV = (800) * 1000,
    403		.desc.uV_step = (20) * 1000,
    404		.desc.n_voltages = ((3340) - (800))/(20) + 1,
    405		.desc.curr_table = da9062_buck_b_limits,
    406		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_b_limits),
    407		.desc.csel_reg = DA9062AA_BUCK_ILIM_A,
    408		.desc.csel_mask = DA9062AA_BUCK3_ILIM_MASK,
    409		.desc.enable_reg = DA9062AA_BUCK3_CONT,
    410		.desc.enable_mask = DA9062AA_BUCK3_EN_MASK,
    411		.desc.vsel_reg = DA9062AA_VBUCK3_A,
    412		.desc.vsel_mask = DA9062AA_VBUCK3_A_MASK,
    413		.desc.linear_min_sel = 0,
    414		.desc.of_map_mode = da9062_map_buck_mode,
    415		.sleep = REG_FIELD(DA9062AA_VBUCK3_A,
    416			__builtin_ffs((int)DA9062AA_BUCK3_SL_A_MASK) - 1,
    417			sizeof(unsigned int) * 8 -
    418			__builtin_clz((DA9062AA_BUCK3_SL_A_MASK)) - 1),
    419		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK3_B,
    420			__builtin_ffs((int)DA9062AA_BUCK3_SL_B_MASK) - 1,
    421			sizeof(unsigned int) * 8 -
    422			__builtin_clz((DA9062AA_BUCK3_SL_B_MASK)) - 1),
    423		.suspend_vsel_reg = DA9062AA_VBUCK3_B,
    424		.mode = REG_FIELD(DA9062AA_BUCK3_CFG,
    425			__builtin_ffs((int)DA9062AA_BUCK3_MODE_MASK) - 1,
    426			sizeof(unsigned int) * 8 -
    427			__builtin_clz((DA9062AA_BUCK3_MODE_MASK)) - 1),
    428		.suspend = REG_FIELD(DA9062AA_BUCK3_CONT,
    429			__builtin_ffs((int)DA9062AA_BUCK3_CONF_MASK) - 1,
    430			sizeof(unsigned int) * 8 -
    431			__builtin_clz(DA9062AA_BUCK3_CONF_MASK) - 1),
    432	},
    433	{
    434		.desc.id = DA9061_ID_BUCK3,
    435		.desc.name = "DA9061 BUCK3",
    436		.desc.of_match = of_match_ptr("buck3"),
    437		.desc.regulators_node = of_match_ptr("regulators"),
    438		.desc.ops = &da9062_buck_ops,
    439		.desc.min_uV = (530) * 1000,
    440		.desc.uV_step = (10) * 1000,
    441		.desc.n_voltages = ((1800) - (530))/(10) + 1,
    442		.desc.curr_table = da9062_buck_a_limits,
    443		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
    444		.desc.csel_reg = DA9062AA_BUCK_ILIM_B,
    445		.desc.csel_mask = DA9062AA_BUCK4_ILIM_MASK,
    446		.desc.enable_reg = DA9062AA_BUCK4_CONT,
    447		.desc.enable_mask = DA9062AA_BUCK4_EN_MASK,
    448		.desc.vsel_reg = DA9062AA_VBUCK4_A,
    449		.desc.vsel_mask = DA9062AA_VBUCK4_A_MASK,
    450		.desc.linear_min_sel = 0,
    451		.desc.of_map_mode = da9062_map_buck_mode,
    452		.sleep = REG_FIELD(DA9062AA_VBUCK4_A,
    453			__builtin_ffs((int)DA9062AA_BUCK4_SL_A_MASK) - 1,
    454			sizeof(unsigned int) * 8 -
    455			__builtin_clz((DA9062AA_BUCK4_SL_A_MASK)) - 1),
    456		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK4_B,
    457			__builtin_ffs((int)DA9062AA_BUCK4_SL_B_MASK) - 1,
    458			sizeof(unsigned int) * 8 -
    459			__builtin_clz((DA9062AA_BUCK4_SL_B_MASK)) - 1),
    460		.suspend_vsel_reg = DA9062AA_VBUCK4_B,
    461		.mode = REG_FIELD(DA9062AA_BUCK4_CFG,
    462			__builtin_ffs((int)DA9062AA_BUCK4_MODE_MASK) - 1,
    463			sizeof(unsigned int) * 8 -
    464			__builtin_clz((DA9062AA_BUCK4_MODE_MASK)) - 1),
    465		.suspend = REG_FIELD(DA9062AA_BUCK4_CONT,
    466			__builtin_ffs((int)DA9062AA_BUCK4_CONF_MASK) - 1,
    467			sizeof(unsigned int) * 8 -
    468			__builtin_clz(DA9062AA_BUCK4_CONF_MASK) - 1),
    469	},
    470	{
    471		.desc.id = DA9061_ID_LDO1,
    472		.desc.name = "DA9061 LDO1",
    473		.desc.of_match = of_match_ptr("ldo1"),
    474		.desc.regulators_node = of_match_ptr("regulators"),
    475		.desc.ops = &da9062_ldo_ops,
    476		.desc.min_uV = (900) * 1000,
    477		.desc.uV_step = (50) * 1000,
    478		.desc.n_voltages = ((3600) - (900))/(50) + 1
    479				+ DA9062AA_VLDO_A_MIN_SEL,
    480		.desc.enable_reg = DA9062AA_LDO1_CONT,
    481		.desc.enable_mask = DA9062AA_LDO1_EN_MASK,
    482		.desc.vsel_reg = DA9062AA_VLDO1_A,
    483		.desc.vsel_mask = DA9062AA_VLDO1_A_MASK,
    484		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    485		.sleep = REG_FIELD(DA9062AA_VLDO1_A,
    486			__builtin_ffs((int)DA9062AA_LDO1_SL_A_MASK) - 1,
    487			sizeof(unsigned int) * 8 -
    488			__builtin_clz((DA9062AA_LDO1_SL_A_MASK)) - 1),
    489		.suspend_sleep = REG_FIELD(DA9062AA_VLDO1_B,
    490			__builtin_ffs((int)DA9062AA_LDO1_SL_B_MASK) - 1,
    491			sizeof(unsigned int) * 8 -
    492			__builtin_clz((DA9062AA_LDO1_SL_B_MASK)) - 1),
    493		.suspend_vsel_reg = DA9062AA_VLDO1_B,
    494		.suspend = REG_FIELD(DA9062AA_LDO1_CONT,
    495			__builtin_ffs((int)DA9062AA_LDO1_CONF_MASK) - 1,
    496			sizeof(unsigned int) * 8 -
    497			__builtin_clz(DA9062AA_LDO1_CONF_MASK) - 1),
    498		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    499			__builtin_ffs((int)DA9062AA_LDO1_ILIM_MASK) - 1,
    500			sizeof(unsigned int) * 8 -
    501			__builtin_clz((DA9062AA_LDO1_ILIM_MASK)) - 1),
    502	},
    503	{
    504		.desc.id = DA9061_ID_LDO2,
    505		.desc.name = "DA9061 LDO2",
    506		.desc.of_match = of_match_ptr("ldo2"),
    507		.desc.regulators_node = of_match_ptr("regulators"),
    508		.desc.ops = &da9062_ldo_ops,
    509		.desc.min_uV = (900) * 1000,
    510		.desc.uV_step = (50) * 1000,
    511		.desc.n_voltages = ((3600) - (900))/(50) + 1
    512				+ DA9062AA_VLDO_A_MIN_SEL,
    513		.desc.enable_reg = DA9062AA_LDO2_CONT,
    514		.desc.enable_mask = DA9062AA_LDO2_EN_MASK,
    515		.desc.vsel_reg = DA9062AA_VLDO2_A,
    516		.desc.vsel_mask = DA9062AA_VLDO2_A_MASK,
    517		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    518		.sleep = REG_FIELD(DA9062AA_VLDO2_A,
    519			__builtin_ffs((int)DA9062AA_LDO2_SL_A_MASK) - 1,
    520			sizeof(unsigned int) * 8 -
    521			__builtin_clz((DA9062AA_LDO2_SL_A_MASK)) - 1),
    522		.suspend_sleep = REG_FIELD(DA9062AA_VLDO2_B,
    523			__builtin_ffs((int)DA9062AA_LDO2_SL_B_MASK) - 1,
    524			sizeof(unsigned int) * 8 -
    525			__builtin_clz((DA9062AA_LDO2_SL_B_MASK)) - 1),
    526		.suspend_vsel_reg = DA9062AA_VLDO2_B,
    527		.suspend = REG_FIELD(DA9062AA_LDO2_CONT,
    528			__builtin_ffs((int)DA9062AA_LDO2_CONF_MASK) - 1,
    529			sizeof(unsigned int) * 8 -
    530			__builtin_clz(DA9062AA_LDO2_CONF_MASK) - 1),
    531		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    532			__builtin_ffs((int)DA9062AA_LDO2_ILIM_MASK) - 1,
    533			sizeof(unsigned int) * 8 -
    534			__builtin_clz((DA9062AA_LDO2_ILIM_MASK)) - 1),
    535	},
    536	{
    537		.desc.id = DA9061_ID_LDO3,
    538		.desc.name = "DA9061 LDO3",
    539		.desc.of_match = of_match_ptr("ldo3"),
    540		.desc.regulators_node = of_match_ptr("regulators"),
    541		.desc.ops = &da9062_ldo_ops,
    542		.desc.min_uV = (900) * 1000,
    543		.desc.uV_step = (50) * 1000,
    544		.desc.n_voltages = ((3600) - (900))/(50) + 1
    545				+ DA9062AA_VLDO_A_MIN_SEL,
    546		.desc.enable_reg = DA9062AA_LDO3_CONT,
    547		.desc.enable_mask = DA9062AA_LDO3_EN_MASK,
    548		.desc.vsel_reg = DA9062AA_VLDO3_A,
    549		.desc.vsel_mask = DA9062AA_VLDO3_A_MASK,
    550		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    551		.sleep = REG_FIELD(DA9062AA_VLDO3_A,
    552			__builtin_ffs((int)DA9062AA_LDO3_SL_A_MASK) - 1,
    553			sizeof(unsigned int) * 8 -
    554			__builtin_clz((DA9062AA_LDO3_SL_A_MASK)) - 1),
    555		.suspend_sleep = REG_FIELD(DA9062AA_VLDO3_B,
    556			__builtin_ffs((int)DA9062AA_LDO3_SL_B_MASK) - 1,
    557			sizeof(unsigned int) * 8 -
    558			__builtin_clz((DA9062AA_LDO3_SL_B_MASK)) - 1),
    559		.suspend_vsel_reg = DA9062AA_VLDO3_B,
    560		.suspend = REG_FIELD(DA9062AA_LDO3_CONT,
    561			__builtin_ffs((int)DA9062AA_LDO3_CONF_MASK) - 1,
    562			sizeof(unsigned int) * 8 -
    563			__builtin_clz(DA9062AA_LDO3_CONF_MASK) - 1),
    564		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    565			__builtin_ffs((int)DA9062AA_LDO3_ILIM_MASK) - 1,
    566			sizeof(unsigned int) * 8 -
    567			__builtin_clz((DA9062AA_LDO3_ILIM_MASK)) - 1),
    568	},
    569	{
    570		.desc.id = DA9061_ID_LDO4,
    571		.desc.name = "DA9061 LDO4",
    572		.desc.of_match = of_match_ptr("ldo4"),
    573		.desc.regulators_node = of_match_ptr("regulators"),
    574		.desc.ops = &da9062_ldo_ops,
    575		.desc.min_uV = (900) * 1000,
    576		.desc.uV_step = (50) * 1000,
    577		.desc.n_voltages = ((3600) - (900))/(50) + 1
    578				+ DA9062AA_VLDO_A_MIN_SEL,
    579		.desc.enable_reg = DA9062AA_LDO4_CONT,
    580		.desc.enable_mask = DA9062AA_LDO4_EN_MASK,
    581		.desc.vsel_reg = DA9062AA_VLDO4_A,
    582		.desc.vsel_mask = DA9062AA_VLDO4_A_MASK,
    583		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    584		.sleep = REG_FIELD(DA9062AA_VLDO4_A,
    585			__builtin_ffs((int)DA9062AA_LDO4_SL_A_MASK) - 1,
    586			sizeof(unsigned int) * 8 -
    587			__builtin_clz((DA9062AA_LDO4_SL_A_MASK)) - 1),
    588		.suspend_sleep = REG_FIELD(DA9062AA_VLDO4_B,
    589			__builtin_ffs((int)DA9062AA_LDO4_SL_B_MASK) - 1,
    590			sizeof(unsigned int) * 8 -
    591			__builtin_clz((DA9062AA_LDO4_SL_B_MASK)) - 1),
    592		.suspend_vsel_reg = DA9062AA_VLDO4_B,
    593		.suspend = REG_FIELD(DA9062AA_LDO4_CONT,
    594			__builtin_ffs((int)DA9062AA_LDO4_CONF_MASK) - 1,
    595			sizeof(unsigned int) * 8 -
    596			__builtin_clz(DA9062AA_LDO4_CONF_MASK) - 1),
    597		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    598			__builtin_ffs((int)DA9062AA_LDO4_ILIM_MASK) - 1,
    599			sizeof(unsigned int) * 8 -
    600			__builtin_clz((DA9062AA_LDO4_ILIM_MASK)) - 1),
    601	},
    602};
    603
    604/* DA9062 Regulator information */
    605static const struct da9062_regulator_info local_da9062_regulator_info[] = {
    606	{
    607		.desc.id = DA9062_ID_BUCK1,
    608		.desc.name = "DA9062 BUCK1",
    609		.desc.of_match = of_match_ptr("buck1"),
    610		.desc.regulators_node = of_match_ptr("regulators"),
    611		.desc.ops = &da9062_buck_ops,
    612		.desc.min_uV = (300) * 1000,
    613		.desc.uV_step = (10) * 1000,
    614		.desc.n_voltages = ((1570) - (300))/(10) + 1,
    615		.desc.curr_table = da9062_buck_a_limits,
    616		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
    617		.desc.csel_reg = DA9062AA_BUCK_ILIM_C,
    618		.desc.csel_mask = DA9062AA_BUCK1_ILIM_MASK,
    619		.desc.enable_reg = DA9062AA_BUCK1_CONT,
    620		.desc.enable_mask = DA9062AA_BUCK1_EN_MASK,
    621		.desc.vsel_reg = DA9062AA_VBUCK1_A,
    622		.desc.vsel_mask = DA9062AA_VBUCK1_A_MASK,
    623		.desc.linear_min_sel = 0,
    624		.desc.of_map_mode = da9062_map_buck_mode,
    625		.sleep = REG_FIELD(DA9062AA_VBUCK1_A,
    626			__builtin_ffs((int)DA9062AA_BUCK1_SL_A_MASK) - 1,
    627			sizeof(unsigned int) * 8 -
    628			__builtin_clz((DA9062AA_BUCK1_SL_A_MASK)) - 1),
    629		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK1_B,
    630			__builtin_ffs((int)DA9062AA_BUCK1_SL_B_MASK) - 1,
    631			sizeof(unsigned int) * 8 -
    632			__builtin_clz((DA9062AA_BUCK1_SL_B_MASK)) - 1),
    633		.suspend_vsel_reg = DA9062AA_VBUCK1_B,
    634		.mode = REG_FIELD(DA9062AA_BUCK1_CFG,
    635			__builtin_ffs((int)DA9062AA_BUCK1_MODE_MASK) - 1,
    636			sizeof(unsigned int) * 8 -
    637			__builtin_clz((DA9062AA_BUCK1_MODE_MASK)) - 1),
    638		.suspend = REG_FIELD(DA9062AA_BUCK1_CONT,
    639			__builtin_ffs((int)DA9062AA_BUCK1_CONF_MASK) - 1,
    640			sizeof(unsigned int) * 8 -
    641			__builtin_clz(DA9062AA_BUCK1_CONF_MASK) - 1),
    642	},
    643	{
    644		.desc.id = DA9062_ID_BUCK2,
    645		.desc.name = "DA9062 BUCK2",
    646		.desc.of_match = of_match_ptr("buck2"),
    647		.desc.regulators_node = of_match_ptr("regulators"),
    648		.desc.ops = &da9062_buck_ops,
    649		.desc.min_uV = (300) * 1000,
    650		.desc.uV_step = (10) * 1000,
    651		.desc.n_voltages = ((1570) - (300))/(10) + 1,
    652		.desc.curr_table = da9062_buck_a_limits,
    653		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
    654		.desc.csel_reg = DA9062AA_BUCK_ILIM_C,
    655		.desc.csel_mask = DA9062AA_BUCK2_ILIM_MASK,
    656		.desc.enable_reg = DA9062AA_BUCK2_CONT,
    657		.desc.enable_mask = DA9062AA_BUCK2_EN_MASK,
    658		.desc.vsel_reg = DA9062AA_VBUCK2_A,
    659		.desc.vsel_mask = DA9062AA_VBUCK2_A_MASK,
    660		.desc.linear_min_sel = 0,
    661		.desc.of_map_mode = da9062_map_buck_mode,
    662		.sleep = REG_FIELD(DA9062AA_VBUCK2_A,
    663			__builtin_ffs((int)DA9062AA_BUCK2_SL_A_MASK) - 1,
    664			sizeof(unsigned int) * 8 -
    665			__builtin_clz((DA9062AA_BUCK2_SL_A_MASK)) - 1),
    666		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK2_B,
    667			__builtin_ffs((int)DA9062AA_BUCK2_SL_B_MASK) - 1,
    668			sizeof(unsigned int) * 8 -
    669			__builtin_clz((DA9062AA_BUCK2_SL_B_MASK)) - 1),
    670		.suspend_vsel_reg = DA9062AA_VBUCK2_B,
    671		.mode = REG_FIELD(DA9062AA_BUCK2_CFG,
    672			__builtin_ffs((int)DA9062AA_BUCK2_MODE_MASK) - 1,
    673			sizeof(unsigned int) * 8 -
    674			__builtin_clz((DA9062AA_BUCK2_MODE_MASK)) - 1),
    675		.suspend = REG_FIELD(DA9062AA_BUCK2_CONT,
    676			__builtin_ffs((int)DA9062AA_BUCK2_CONF_MASK) - 1,
    677			sizeof(unsigned int) * 8 -
    678			__builtin_clz(DA9062AA_BUCK2_CONF_MASK) - 1),
    679	},
    680	{
    681		.desc.id = DA9062_ID_BUCK3,
    682		.desc.name = "DA9062 BUCK3",
    683		.desc.of_match = of_match_ptr("buck3"),
    684		.desc.regulators_node = of_match_ptr("regulators"),
    685		.desc.ops = &da9062_buck_ops,
    686		.desc.min_uV = (800) * 1000,
    687		.desc.uV_step = (20) * 1000,
    688		.desc.n_voltages = ((3340) - (800))/(20) + 1,
    689		.desc.curr_table = da9062_buck_b_limits,
    690		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_b_limits),
    691		.desc.csel_reg = DA9062AA_BUCK_ILIM_A,
    692		.desc.csel_mask = DA9062AA_BUCK3_ILIM_MASK,
    693		.desc.enable_reg = DA9062AA_BUCK3_CONT,
    694		.desc.enable_mask = DA9062AA_BUCK3_EN_MASK,
    695		.desc.vsel_reg = DA9062AA_VBUCK3_A,
    696		.desc.vsel_mask = DA9062AA_VBUCK3_A_MASK,
    697		.desc.linear_min_sel = 0,
    698		.desc.of_map_mode = da9062_map_buck_mode,
    699		.sleep = REG_FIELD(DA9062AA_VBUCK3_A,
    700			__builtin_ffs((int)DA9062AA_BUCK3_SL_A_MASK) - 1,
    701			sizeof(unsigned int) * 8 -
    702			__builtin_clz((DA9062AA_BUCK3_SL_A_MASK)) - 1),
    703		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK3_B,
    704			__builtin_ffs((int)DA9062AA_BUCK3_SL_B_MASK) - 1,
    705			sizeof(unsigned int) * 8 -
    706			__builtin_clz((DA9062AA_BUCK3_SL_B_MASK)) - 1),
    707		.suspend_vsel_reg = DA9062AA_VBUCK3_B,
    708		.mode = REG_FIELD(DA9062AA_BUCK3_CFG,
    709			__builtin_ffs((int)DA9062AA_BUCK3_MODE_MASK) - 1,
    710			sizeof(unsigned int) * 8 -
    711			__builtin_clz((DA9062AA_BUCK3_MODE_MASK)) - 1),
    712		.suspend = REG_FIELD(DA9062AA_BUCK3_CONT,
    713			__builtin_ffs((int)DA9062AA_BUCK3_CONF_MASK) - 1,
    714			sizeof(unsigned int) * 8 -
    715			__builtin_clz(DA9062AA_BUCK3_CONF_MASK) - 1),
    716	},
    717	{
    718		.desc.id = DA9062_ID_BUCK4,
    719		.desc.name = "DA9062 BUCK4",
    720		.desc.of_match = of_match_ptr("buck4"),
    721		.desc.regulators_node = of_match_ptr("regulators"),
    722		.desc.ops = &da9062_buck_ops,
    723		.desc.min_uV = (530) * 1000,
    724		.desc.uV_step = (10) * 1000,
    725		.desc.n_voltages = ((1800) - (530))/(10) + 1,
    726		.desc.curr_table = da9062_buck_a_limits,
    727		.desc.n_current_limits = ARRAY_SIZE(da9062_buck_a_limits),
    728		.desc.csel_reg = DA9062AA_BUCK_ILIM_B,
    729		.desc.csel_mask = DA9062AA_BUCK4_ILIM_MASK,
    730		.desc.enable_reg = DA9062AA_BUCK4_CONT,
    731		.desc.enable_mask = DA9062AA_BUCK4_EN_MASK,
    732		.desc.vsel_reg = DA9062AA_VBUCK4_A,
    733		.desc.vsel_mask = DA9062AA_VBUCK4_A_MASK,
    734		.desc.linear_min_sel = 0,
    735		.desc.of_map_mode = da9062_map_buck_mode,
    736		.sleep = REG_FIELD(DA9062AA_VBUCK4_A,
    737			__builtin_ffs((int)DA9062AA_BUCK4_SL_A_MASK) - 1,
    738			sizeof(unsigned int) * 8 -
    739			__builtin_clz((DA9062AA_BUCK4_SL_A_MASK)) - 1),
    740		.suspend_sleep = REG_FIELD(DA9062AA_VBUCK4_B,
    741			__builtin_ffs((int)DA9062AA_BUCK4_SL_B_MASK) - 1,
    742			sizeof(unsigned int) * 8 -
    743			__builtin_clz((DA9062AA_BUCK4_SL_B_MASK)) - 1),
    744		.suspend_vsel_reg = DA9062AA_VBUCK4_B,
    745		.mode = REG_FIELD(DA9062AA_BUCK4_CFG,
    746			__builtin_ffs((int)DA9062AA_BUCK4_MODE_MASK) - 1,
    747			sizeof(unsigned int) * 8 -
    748			__builtin_clz((DA9062AA_BUCK4_MODE_MASK)) - 1),
    749		.suspend = REG_FIELD(DA9062AA_BUCK4_CONT,
    750			__builtin_ffs((int)DA9062AA_BUCK4_CONF_MASK) - 1,
    751			sizeof(unsigned int) * 8 -
    752			__builtin_clz(DA9062AA_BUCK4_CONF_MASK) - 1),
    753	},
    754	{
    755		.desc.id = DA9062_ID_LDO1,
    756		.desc.name = "DA9062 LDO1",
    757		.desc.of_match = of_match_ptr("ldo1"),
    758		.desc.regulators_node = of_match_ptr("regulators"),
    759		.desc.ops = &da9062_ldo_ops,
    760		.desc.min_uV = (900) * 1000,
    761		.desc.uV_step = (50) * 1000,
    762		.desc.n_voltages = ((3600) - (900))/(50) + 1
    763				+ DA9062AA_VLDO_A_MIN_SEL,
    764		.desc.enable_reg = DA9062AA_LDO1_CONT,
    765		.desc.enable_mask = DA9062AA_LDO1_EN_MASK,
    766		.desc.vsel_reg = DA9062AA_VLDO1_A,
    767		.desc.vsel_mask = DA9062AA_VLDO1_A_MASK,
    768		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    769		.sleep = REG_FIELD(DA9062AA_VLDO1_A,
    770			__builtin_ffs((int)DA9062AA_LDO1_SL_A_MASK) - 1,
    771			sizeof(unsigned int) * 8 -
    772			__builtin_clz((DA9062AA_LDO1_SL_A_MASK)) - 1),
    773		.suspend_sleep = REG_FIELD(DA9062AA_VLDO1_B,
    774			__builtin_ffs((int)DA9062AA_LDO1_SL_B_MASK) - 1,
    775			sizeof(unsigned int) * 8 -
    776			__builtin_clz((DA9062AA_LDO1_SL_B_MASK)) - 1),
    777		.suspend_vsel_reg = DA9062AA_VLDO1_B,
    778		.suspend = REG_FIELD(DA9062AA_LDO1_CONT,
    779			__builtin_ffs((int)DA9062AA_LDO1_CONF_MASK) - 1,
    780			sizeof(unsigned int) * 8 -
    781			__builtin_clz(DA9062AA_LDO1_CONF_MASK) - 1),
    782		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    783			__builtin_ffs((int)DA9062AA_LDO1_ILIM_MASK) - 1,
    784			sizeof(unsigned int) * 8 -
    785			__builtin_clz((DA9062AA_LDO1_ILIM_MASK)) - 1),
    786	},
    787	{
    788		.desc.id = DA9062_ID_LDO2,
    789		.desc.name = "DA9062 LDO2",
    790		.desc.of_match = of_match_ptr("ldo2"),
    791		.desc.regulators_node = of_match_ptr("regulators"),
    792		.desc.ops = &da9062_ldo_ops,
    793		.desc.min_uV = (900) * 1000,
    794		.desc.uV_step = (50) * 1000,
    795		.desc.n_voltages = ((3600) - (900))/(50) + 1
    796				+ DA9062AA_VLDO_A_MIN_SEL,
    797		.desc.enable_reg = DA9062AA_LDO2_CONT,
    798		.desc.enable_mask = DA9062AA_LDO2_EN_MASK,
    799		.desc.vsel_reg = DA9062AA_VLDO2_A,
    800		.desc.vsel_mask = DA9062AA_VLDO2_A_MASK,
    801		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    802		.sleep = REG_FIELD(DA9062AA_VLDO2_A,
    803			__builtin_ffs((int)DA9062AA_LDO2_SL_A_MASK) - 1,
    804			sizeof(unsigned int) * 8 -
    805			__builtin_clz((DA9062AA_LDO2_SL_A_MASK)) - 1),
    806		.suspend_sleep = REG_FIELD(DA9062AA_VLDO2_B,
    807			__builtin_ffs((int)DA9062AA_LDO2_SL_B_MASK) - 1,
    808			sizeof(unsigned int) * 8 -
    809			__builtin_clz((DA9062AA_LDO2_SL_B_MASK)) - 1),
    810		.suspend_vsel_reg = DA9062AA_VLDO2_B,
    811		.suspend = REG_FIELD(DA9062AA_LDO2_CONT,
    812			__builtin_ffs((int)DA9062AA_LDO2_CONF_MASK) - 1,
    813			sizeof(unsigned int) * 8 -
    814			__builtin_clz(DA9062AA_LDO2_CONF_MASK) - 1),
    815		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    816			__builtin_ffs((int)DA9062AA_LDO2_ILIM_MASK) - 1,
    817			sizeof(unsigned int) * 8 -
    818			__builtin_clz((DA9062AA_LDO2_ILIM_MASK)) - 1),
    819	},
    820	{
    821		.desc.id = DA9062_ID_LDO3,
    822		.desc.name = "DA9062 LDO3",
    823		.desc.of_match = of_match_ptr("ldo3"),
    824		.desc.regulators_node = of_match_ptr("regulators"),
    825		.desc.ops = &da9062_ldo_ops,
    826		.desc.min_uV = (900) * 1000,
    827		.desc.uV_step = (50) * 1000,
    828		.desc.n_voltages = ((3600) - (900))/(50) + 1
    829				+ DA9062AA_VLDO_A_MIN_SEL,
    830		.desc.enable_reg = DA9062AA_LDO3_CONT,
    831		.desc.enable_mask = DA9062AA_LDO3_EN_MASK,
    832		.desc.vsel_reg = DA9062AA_VLDO3_A,
    833		.desc.vsel_mask = DA9062AA_VLDO3_A_MASK,
    834		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    835		.sleep = REG_FIELD(DA9062AA_VLDO3_A,
    836			__builtin_ffs((int)DA9062AA_LDO3_SL_A_MASK) - 1,
    837			sizeof(unsigned int) * 8 -
    838			__builtin_clz((DA9062AA_LDO3_SL_A_MASK)) - 1),
    839		.suspend_sleep = REG_FIELD(DA9062AA_VLDO3_B,
    840			__builtin_ffs((int)DA9062AA_LDO3_SL_B_MASK) - 1,
    841			sizeof(unsigned int) * 8 -
    842			__builtin_clz((DA9062AA_LDO3_SL_B_MASK)) - 1),
    843		.suspend_vsel_reg = DA9062AA_VLDO3_B,
    844		.suspend = REG_FIELD(DA9062AA_LDO3_CONT,
    845			__builtin_ffs((int)DA9062AA_LDO3_CONF_MASK) - 1,
    846			sizeof(unsigned int) * 8 -
    847			__builtin_clz(DA9062AA_LDO3_CONF_MASK) - 1),
    848		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    849			__builtin_ffs((int)DA9062AA_LDO3_ILIM_MASK) - 1,
    850			sizeof(unsigned int) * 8 -
    851			__builtin_clz((DA9062AA_LDO3_ILIM_MASK)) - 1),
    852	},
    853	{
    854		.desc.id = DA9062_ID_LDO4,
    855		.desc.name = "DA9062 LDO4",
    856		.desc.of_match = of_match_ptr("ldo4"),
    857		.desc.regulators_node = of_match_ptr("regulators"),
    858		.desc.ops = &da9062_ldo_ops,
    859		.desc.min_uV = (900) * 1000,
    860		.desc.uV_step = (50) * 1000,
    861		.desc.n_voltages = ((3600) - (900))/(50) + 1
    862				+ DA9062AA_VLDO_A_MIN_SEL,
    863		.desc.enable_reg = DA9062AA_LDO4_CONT,
    864		.desc.enable_mask = DA9062AA_LDO4_EN_MASK,
    865		.desc.vsel_reg = DA9062AA_VLDO4_A,
    866		.desc.vsel_mask = DA9062AA_VLDO4_A_MASK,
    867		.desc.linear_min_sel = DA9062AA_VLDO_A_MIN_SEL,
    868		.sleep = REG_FIELD(DA9062AA_VLDO4_A,
    869			__builtin_ffs((int)DA9062AA_LDO4_SL_A_MASK) - 1,
    870			sizeof(unsigned int) * 8 -
    871			__builtin_clz((DA9062AA_LDO4_SL_A_MASK)) - 1),
    872		.suspend_sleep = REG_FIELD(DA9062AA_VLDO4_B,
    873			__builtin_ffs((int)DA9062AA_LDO4_SL_B_MASK) - 1,
    874			sizeof(unsigned int) * 8 -
    875			__builtin_clz((DA9062AA_LDO4_SL_B_MASK)) - 1),
    876		.suspend_vsel_reg = DA9062AA_VLDO4_B,
    877		.suspend = REG_FIELD(DA9062AA_LDO4_CONT,
    878			__builtin_ffs((int)DA9062AA_LDO4_CONF_MASK) - 1,
    879			sizeof(unsigned int) * 8 -
    880			__builtin_clz(DA9062AA_LDO4_CONF_MASK) - 1),
    881		.oc_event = REG_FIELD(DA9062AA_STATUS_D,
    882			__builtin_ffs((int)DA9062AA_LDO4_ILIM_MASK) - 1,
    883			sizeof(unsigned int) * 8 -
    884			__builtin_clz((DA9062AA_LDO4_ILIM_MASK)) - 1),
    885	},
    886};
    887
    888/* Regulator interrupt handlers */
    889static irqreturn_t da9062_ldo_lim_event(int irq, void *data)
    890{
    891	struct da9062_regulators *regulators = data;
    892	struct da9062 *hw = regulators->regulator[0].hw;
    893	struct da9062_regulator *regl;
    894	int handled = IRQ_NONE;
    895	int bits, i, ret;
    896
    897	ret = regmap_read(hw->regmap, DA9062AA_STATUS_D, &bits);
    898	if (ret < 0) {
    899		dev_err(hw->dev,
    900			"Failed to read LDO overcurrent indicator\n");
    901		goto ldo_lim_error;
    902	}
    903
    904	for (i = regulators->n_regulators - 1; i >= 0; i--) {
    905		regl = &regulators->regulator[i];
    906		if (regl->info->oc_event.reg != DA9062AA_STATUS_D)
    907			continue;
    908
    909		if (BIT(regl->info->oc_event.lsb) & bits) {
    910			regulator_notifier_call_chain(regl->rdev,
    911					REGULATOR_EVENT_OVER_CURRENT, NULL);
    912			handled = IRQ_HANDLED;
    913		}
    914	}
    915
    916ldo_lim_error:
    917	return handled;
    918}
    919
    920static int da9062_regulator_probe(struct platform_device *pdev)
    921{
    922	struct da9062 *chip = dev_get_drvdata(pdev->dev.parent);
    923	struct da9062_regulators *regulators;
    924	struct da9062_regulator *regl;
    925	struct regulator_config config = { };
    926	const struct da9062_regulator_info *rinfo;
    927	int irq, n, ret;
    928	int max_regulators;
    929
    930	switch (chip->chip_type) {
    931	case COMPAT_TYPE_DA9061:
    932		max_regulators = DA9061_MAX_REGULATORS;
    933		rinfo = local_da9061_regulator_info;
    934		break;
    935	case COMPAT_TYPE_DA9062:
    936		max_regulators = DA9062_MAX_REGULATORS;
    937		rinfo = local_da9062_regulator_info;
    938		break;
    939	default:
    940		dev_err(chip->dev, "Unrecognised chip type\n");
    941		return -ENODEV;
    942	}
    943
    944	/* Allocate memory required by usable regulators */
    945	regulators = devm_kzalloc(&pdev->dev, struct_size(regulators, regulator,
    946				  max_regulators), GFP_KERNEL);
    947	if (!regulators)
    948		return -ENOMEM;
    949
    950	regulators->n_regulators = max_regulators;
    951	platform_set_drvdata(pdev, regulators);
    952
    953	for (n = 0; n < regulators->n_regulators; n++) {
    954		/* Initialise regulator structure */
    955		regl = &regulators->regulator[n];
    956		regl->hw = chip;
    957		regl->info = &rinfo[n];
    958		regl->desc = regl->info->desc;
    959		regl->desc.type = REGULATOR_VOLTAGE;
    960		regl->desc.owner = THIS_MODULE;
    961
    962		if (regl->info->mode.reg) {
    963			regl->mode = devm_regmap_field_alloc(
    964					&pdev->dev,
    965					chip->regmap,
    966					regl->info->mode);
    967			if (IS_ERR(regl->mode))
    968				return PTR_ERR(regl->mode);
    969		}
    970
    971		if (regl->info->suspend.reg) {
    972			regl->suspend = devm_regmap_field_alloc(
    973					&pdev->dev,
    974					chip->regmap,
    975					regl->info->suspend);
    976			if (IS_ERR(regl->suspend))
    977				return PTR_ERR(regl->suspend);
    978		}
    979
    980		if (regl->info->sleep.reg) {
    981			regl->sleep = devm_regmap_field_alloc(
    982					&pdev->dev,
    983					chip->regmap,
    984					regl->info->sleep);
    985			if (IS_ERR(regl->sleep))
    986				return PTR_ERR(regl->sleep);
    987		}
    988
    989		if (regl->info->suspend_sleep.reg) {
    990			regl->suspend_sleep = devm_regmap_field_alloc(
    991					&pdev->dev,
    992					chip->regmap,
    993					regl->info->suspend_sleep);
    994			if (IS_ERR(regl->suspend_sleep))
    995				return PTR_ERR(regl->suspend_sleep);
    996		}
    997
    998		/* Register regulator */
    999		memset(&config, 0, sizeof(config));
   1000		config.dev = chip->dev;
   1001		config.driver_data = regl;
   1002		config.regmap = chip->regmap;
   1003
   1004		regl->rdev = devm_regulator_register(&pdev->dev, &regl->desc,
   1005						     &config);
   1006		if (IS_ERR(regl->rdev)) {
   1007			dev_err(&pdev->dev,
   1008				"Failed to register %s regulator\n",
   1009				regl->desc.name);
   1010			return PTR_ERR(regl->rdev);
   1011		}
   1012	}
   1013
   1014	/* LDOs overcurrent event support */
   1015	irq = platform_get_irq_byname(pdev, "LDO_LIM");
   1016	if (irq < 0)
   1017		return irq;
   1018	regulators->irq_ldo_lim = irq;
   1019
   1020	ret = devm_request_threaded_irq(&pdev->dev, irq,
   1021					NULL, da9062_ldo_lim_event,
   1022					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
   1023					"LDO_LIM", regulators);
   1024	if (ret) {
   1025		dev_warn(&pdev->dev,
   1026			 "Failed to request LDO_LIM IRQ.\n");
   1027		regulators->irq_ldo_lim = -ENXIO;
   1028	}
   1029
   1030	return 0;
   1031}
   1032
   1033static struct platform_driver da9062_regulator_driver = {
   1034	.driver = {
   1035		.name = "da9062-regulators",
   1036	},
   1037	.probe = da9062_regulator_probe,
   1038};
   1039
   1040static int __init da9062_regulator_init(void)
   1041{
   1042	return platform_driver_register(&da9062_regulator_driver);
   1043}
   1044subsys_initcall(da9062_regulator_init);
   1045
   1046static void __exit da9062_regulator_cleanup(void)
   1047{
   1048	platform_driver_unregister(&da9062_regulator_driver);
   1049}
   1050module_exit(da9062_regulator_cleanup);
   1051
   1052/* Module information */
   1053MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
   1054MODULE_DESCRIPTION("REGULATOR device driver for Dialog DA9062 and DA9061");
   1055MODULE_LICENSE("GPL");
   1056MODULE_ALIAS("platform:da9062-regulators");