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