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 = ®ulators->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 = ®ulators->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, ®l->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