0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/init.h>
0014 #include <linux/err.h>
0015 #include <linux/platform_device.h>
0016 #include <linux/regulator/driver.h>
0017 #include <linux/regulator/machine.h>
0018 #include <linux/slab.h>
0019 #include <linux/regmap.h>
0020 #include <linux/mfd/palmas.h>
0021 #include <linux/of.h>
0022 #include <linux/of_platform.h>
0023 #include <linux/regulator/of_regulator.h>
0024
0025 static const struct linear_range smps_low_ranges[] = {
0026 REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0),
0027 REGULATOR_LINEAR_RANGE(500000, 0x1, 0x6, 0),
0028 REGULATOR_LINEAR_RANGE(510000, 0x7, 0x79, 10000),
0029 REGULATOR_LINEAR_RANGE(1650000, 0x7A, 0x7f, 0),
0030 };
0031
0032 static const struct linear_range smps_high_ranges[] = {
0033 REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0),
0034 REGULATOR_LINEAR_RANGE(1000000, 0x1, 0x6, 0),
0035 REGULATOR_LINEAR_RANGE(1020000, 0x7, 0x79, 20000),
0036 REGULATOR_LINEAR_RANGE(3300000, 0x7A, 0x7f, 0),
0037 };
0038
0039 static struct palmas_regs_info palmas_generic_regs_info[] = {
0040 {
0041 .name = "SMPS12",
0042 .sname = "smps1-in",
0043 .vsel_addr = PALMAS_SMPS12_VOLTAGE,
0044 .ctrl_addr = PALMAS_SMPS12_CTRL,
0045 .tstep_addr = PALMAS_SMPS12_TSTEP,
0046 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS12,
0047 },
0048 {
0049 .name = "SMPS123",
0050 .sname = "smps1-in",
0051 .vsel_addr = PALMAS_SMPS12_VOLTAGE,
0052 .ctrl_addr = PALMAS_SMPS12_CTRL,
0053 .tstep_addr = PALMAS_SMPS12_TSTEP,
0054 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS12,
0055 },
0056 {
0057 .name = "SMPS3",
0058 .sname = "smps3-in",
0059 .vsel_addr = PALMAS_SMPS3_VOLTAGE,
0060 .ctrl_addr = PALMAS_SMPS3_CTRL,
0061 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS3,
0062 },
0063 {
0064 .name = "SMPS45",
0065 .sname = "smps4-in",
0066 .vsel_addr = PALMAS_SMPS45_VOLTAGE,
0067 .ctrl_addr = PALMAS_SMPS45_CTRL,
0068 .tstep_addr = PALMAS_SMPS45_TSTEP,
0069 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS45,
0070 },
0071 {
0072 .name = "SMPS457",
0073 .sname = "smps4-in",
0074 .vsel_addr = PALMAS_SMPS45_VOLTAGE,
0075 .ctrl_addr = PALMAS_SMPS45_CTRL,
0076 .tstep_addr = PALMAS_SMPS45_TSTEP,
0077 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS45,
0078 },
0079 {
0080 .name = "SMPS6",
0081 .sname = "smps6-in",
0082 .vsel_addr = PALMAS_SMPS6_VOLTAGE,
0083 .ctrl_addr = PALMAS_SMPS6_CTRL,
0084 .tstep_addr = PALMAS_SMPS6_TSTEP,
0085 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS6,
0086 },
0087 {
0088 .name = "SMPS7",
0089 .sname = "smps7-in",
0090 .vsel_addr = PALMAS_SMPS7_VOLTAGE,
0091 .ctrl_addr = PALMAS_SMPS7_CTRL,
0092 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS7,
0093 },
0094 {
0095 .name = "SMPS8",
0096 .sname = "smps8-in",
0097 .vsel_addr = PALMAS_SMPS8_VOLTAGE,
0098 .ctrl_addr = PALMAS_SMPS8_CTRL,
0099 .tstep_addr = PALMAS_SMPS8_TSTEP,
0100 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS8,
0101 },
0102 {
0103 .name = "SMPS9",
0104 .sname = "smps9-in",
0105 .vsel_addr = PALMAS_SMPS9_VOLTAGE,
0106 .ctrl_addr = PALMAS_SMPS9_CTRL,
0107 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS9,
0108 },
0109 {
0110 .name = "SMPS10_OUT2",
0111 .sname = "smps10-in",
0112 .ctrl_addr = PALMAS_SMPS10_CTRL,
0113 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS10,
0114 },
0115 {
0116 .name = "SMPS10_OUT1",
0117 .sname = "smps10-out2",
0118 .ctrl_addr = PALMAS_SMPS10_CTRL,
0119 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SMPS10,
0120 },
0121 {
0122 .name = "LDO1",
0123 .sname = "ldo1-in",
0124 .vsel_addr = PALMAS_LDO1_VOLTAGE,
0125 .ctrl_addr = PALMAS_LDO1_CTRL,
0126 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO1,
0127 },
0128 {
0129 .name = "LDO2",
0130 .sname = "ldo2-in",
0131 .vsel_addr = PALMAS_LDO2_VOLTAGE,
0132 .ctrl_addr = PALMAS_LDO2_CTRL,
0133 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO2,
0134 },
0135 {
0136 .name = "LDO3",
0137 .sname = "ldo3-in",
0138 .vsel_addr = PALMAS_LDO3_VOLTAGE,
0139 .ctrl_addr = PALMAS_LDO3_CTRL,
0140 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO3,
0141 },
0142 {
0143 .name = "LDO4",
0144 .sname = "ldo4-in",
0145 .vsel_addr = PALMAS_LDO4_VOLTAGE,
0146 .ctrl_addr = PALMAS_LDO4_CTRL,
0147 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO4,
0148 },
0149 {
0150 .name = "LDO5",
0151 .sname = "ldo5-in",
0152 .vsel_addr = PALMAS_LDO5_VOLTAGE,
0153 .ctrl_addr = PALMAS_LDO5_CTRL,
0154 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO5,
0155 },
0156 {
0157 .name = "LDO6",
0158 .sname = "ldo6-in",
0159 .vsel_addr = PALMAS_LDO6_VOLTAGE,
0160 .ctrl_addr = PALMAS_LDO6_CTRL,
0161 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO6,
0162 },
0163 {
0164 .name = "LDO7",
0165 .sname = "ldo7-in",
0166 .vsel_addr = PALMAS_LDO7_VOLTAGE,
0167 .ctrl_addr = PALMAS_LDO7_CTRL,
0168 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO7,
0169 },
0170 {
0171 .name = "LDO8",
0172 .sname = "ldo8-in",
0173 .vsel_addr = PALMAS_LDO8_VOLTAGE,
0174 .ctrl_addr = PALMAS_LDO8_CTRL,
0175 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO8,
0176 },
0177 {
0178 .name = "LDO9",
0179 .sname = "ldo9-in",
0180 .vsel_addr = PALMAS_LDO9_VOLTAGE,
0181 .ctrl_addr = PALMAS_LDO9_CTRL,
0182 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDO9,
0183 },
0184 {
0185 .name = "LDOLN",
0186 .sname = "ldoln-in",
0187 .vsel_addr = PALMAS_LDOLN_VOLTAGE,
0188 .ctrl_addr = PALMAS_LDOLN_CTRL,
0189 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDOLN,
0190 },
0191 {
0192 .name = "LDOUSB",
0193 .sname = "ldousb-in",
0194 .vsel_addr = PALMAS_LDOUSB_VOLTAGE,
0195 .ctrl_addr = PALMAS_LDOUSB_CTRL,
0196 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_LDOUSB,
0197 },
0198 {
0199 .name = "REGEN1",
0200 .ctrl_addr = PALMAS_REGEN1_CTRL,
0201 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN1,
0202 },
0203 {
0204 .name = "REGEN2",
0205 .ctrl_addr = PALMAS_REGEN2_CTRL,
0206 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN2,
0207 },
0208 {
0209 .name = "REGEN3",
0210 .ctrl_addr = PALMAS_REGEN3_CTRL,
0211 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_REGEN3,
0212 },
0213 {
0214 .name = "SYSEN1",
0215 .ctrl_addr = PALMAS_SYSEN1_CTRL,
0216 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SYSEN1,
0217 },
0218 {
0219 .name = "SYSEN2",
0220 .ctrl_addr = PALMAS_SYSEN2_CTRL,
0221 .sleep_id = PALMAS_EXTERNAL_REQSTR_ID_SYSEN2,
0222 },
0223 };
0224
0225 static struct palmas_regs_info tps65917_regs_info[] = {
0226 {
0227 .name = "SMPS1",
0228 .sname = "smps1-in",
0229 .vsel_addr = TPS65917_SMPS1_VOLTAGE,
0230 .ctrl_addr = TPS65917_SMPS1_CTRL,
0231 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS1,
0232 },
0233 {
0234 .name = "SMPS2",
0235 .sname = "smps2-in",
0236 .vsel_addr = TPS65917_SMPS2_VOLTAGE,
0237 .ctrl_addr = TPS65917_SMPS2_CTRL,
0238 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS2,
0239 },
0240 {
0241 .name = "SMPS3",
0242 .sname = "smps3-in",
0243 .vsel_addr = TPS65917_SMPS3_VOLTAGE,
0244 .ctrl_addr = TPS65917_SMPS3_CTRL,
0245 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS3,
0246 },
0247 {
0248 .name = "SMPS4",
0249 .sname = "smps4-in",
0250 .vsel_addr = TPS65917_SMPS4_VOLTAGE,
0251 .ctrl_addr = TPS65917_SMPS4_CTRL,
0252 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS4,
0253 },
0254 {
0255 .name = "SMPS5",
0256 .sname = "smps5-in",
0257 .vsel_addr = TPS65917_SMPS5_VOLTAGE,
0258 .ctrl_addr = TPS65917_SMPS5_CTRL,
0259 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS5,
0260 },
0261 {
0262 .name = "SMPS12",
0263 .sname = "smps1-in",
0264 .vsel_addr = TPS65917_SMPS1_VOLTAGE,
0265 .ctrl_addr = TPS65917_SMPS1_CTRL,
0266 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_SMPS12,
0267 },
0268 {
0269 .name = "LDO1",
0270 .sname = "ldo1-in",
0271 .vsel_addr = TPS65917_LDO1_VOLTAGE,
0272 .ctrl_addr = TPS65917_LDO1_CTRL,
0273 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO1,
0274 },
0275 {
0276 .name = "LDO2",
0277 .sname = "ldo2-in",
0278 .vsel_addr = TPS65917_LDO2_VOLTAGE,
0279 .ctrl_addr = TPS65917_LDO2_CTRL,
0280 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO2,
0281 },
0282 {
0283 .name = "LDO3",
0284 .sname = "ldo3-in",
0285 .vsel_addr = TPS65917_LDO3_VOLTAGE,
0286 .ctrl_addr = TPS65917_LDO3_CTRL,
0287 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO3,
0288 },
0289 {
0290 .name = "LDO4",
0291 .sname = "ldo4-in",
0292 .vsel_addr = TPS65917_LDO4_VOLTAGE,
0293 .ctrl_addr = TPS65917_LDO4_CTRL,
0294 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO4,
0295 },
0296 {
0297 .name = "LDO5",
0298 .sname = "ldo5-in",
0299 .vsel_addr = TPS65917_LDO5_VOLTAGE,
0300 .ctrl_addr = TPS65917_LDO5_CTRL,
0301 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_LDO5,
0302 },
0303 {
0304 .name = "REGEN1",
0305 .ctrl_addr = TPS65917_REGEN1_CTRL,
0306 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_REGEN1,
0307 },
0308 {
0309 .name = "REGEN2",
0310 .ctrl_addr = TPS65917_REGEN2_CTRL,
0311 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_REGEN2,
0312 },
0313 {
0314 .name = "REGEN3",
0315 .ctrl_addr = TPS65917_REGEN3_CTRL,
0316 .sleep_id = TPS65917_EXTERNAL_REQSTR_ID_REGEN3,
0317 },
0318 };
0319
0320 #define EXTERNAL_REQUESTOR(_id, _offset, _pos) \
0321 [PALMAS_EXTERNAL_REQSTR_ID_##_id] = { \
0322 .id = PALMAS_EXTERNAL_REQSTR_ID_##_id, \
0323 .reg_offset = _offset, \
0324 .bit_pos = _pos, \
0325 }
0326
0327 static struct palmas_sleep_requestor_info palma_sleep_req_info[] = {
0328 EXTERNAL_REQUESTOR(REGEN1, 0, 0),
0329 EXTERNAL_REQUESTOR(REGEN2, 0, 1),
0330 EXTERNAL_REQUESTOR(SYSEN1, 0, 2),
0331 EXTERNAL_REQUESTOR(SYSEN2, 0, 3),
0332 EXTERNAL_REQUESTOR(CLK32KG, 0, 4),
0333 EXTERNAL_REQUESTOR(CLK32KGAUDIO, 0, 5),
0334 EXTERNAL_REQUESTOR(REGEN3, 0, 6),
0335 EXTERNAL_REQUESTOR(SMPS12, 1, 0),
0336 EXTERNAL_REQUESTOR(SMPS3, 1, 1),
0337 EXTERNAL_REQUESTOR(SMPS45, 1, 2),
0338 EXTERNAL_REQUESTOR(SMPS6, 1, 3),
0339 EXTERNAL_REQUESTOR(SMPS7, 1, 4),
0340 EXTERNAL_REQUESTOR(SMPS8, 1, 5),
0341 EXTERNAL_REQUESTOR(SMPS9, 1, 6),
0342 EXTERNAL_REQUESTOR(SMPS10, 1, 7),
0343 EXTERNAL_REQUESTOR(LDO1, 2, 0),
0344 EXTERNAL_REQUESTOR(LDO2, 2, 1),
0345 EXTERNAL_REQUESTOR(LDO3, 2, 2),
0346 EXTERNAL_REQUESTOR(LDO4, 2, 3),
0347 EXTERNAL_REQUESTOR(LDO5, 2, 4),
0348 EXTERNAL_REQUESTOR(LDO6, 2, 5),
0349 EXTERNAL_REQUESTOR(LDO7, 2, 6),
0350 EXTERNAL_REQUESTOR(LDO8, 2, 7),
0351 EXTERNAL_REQUESTOR(LDO9, 3, 0),
0352 EXTERNAL_REQUESTOR(LDOLN, 3, 1),
0353 EXTERNAL_REQUESTOR(LDOUSB, 3, 2),
0354 };
0355
0356 #define EXTERNAL_REQUESTOR_TPS65917(_id, _offset, _pos) \
0357 [TPS65917_EXTERNAL_REQSTR_ID_##_id] = { \
0358 .id = TPS65917_EXTERNAL_REQSTR_ID_##_id, \
0359 .reg_offset = _offset, \
0360 .bit_pos = _pos, \
0361 }
0362
0363 static struct palmas_sleep_requestor_info tps65917_sleep_req_info[] = {
0364 EXTERNAL_REQUESTOR_TPS65917(REGEN1, 0, 0),
0365 EXTERNAL_REQUESTOR_TPS65917(REGEN2, 0, 1),
0366 EXTERNAL_REQUESTOR_TPS65917(REGEN3, 0, 6),
0367 EXTERNAL_REQUESTOR_TPS65917(SMPS1, 1, 0),
0368 EXTERNAL_REQUESTOR_TPS65917(SMPS2, 1, 1),
0369 EXTERNAL_REQUESTOR_TPS65917(SMPS3, 1, 2),
0370 EXTERNAL_REQUESTOR_TPS65917(SMPS4, 1, 3),
0371 EXTERNAL_REQUESTOR_TPS65917(SMPS5, 1, 4),
0372 EXTERNAL_REQUESTOR_TPS65917(SMPS12, 1, 5),
0373 EXTERNAL_REQUESTOR_TPS65917(LDO1, 2, 0),
0374 EXTERNAL_REQUESTOR_TPS65917(LDO2, 2, 1),
0375 EXTERNAL_REQUESTOR_TPS65917(LDO3, 2, 2),
0376 EXTERNAL_REQUESTOR_TPS65917(LDO4, 2, 3),
0377 EXTERNAL_REQUESTOR_TPS65917(LDO5, 2, 4),
0378 };
0379
0380 static const unsigned int palmas_smps_ramp_delay[4] = {0, 10000, 5000, 2500};
0381
0382 #define SMPS_CTRL_MODE_OFF 0x00
0383 #define SMPS_CTRL_MODE_ON 0x01
0384 #define SMPS_CTRL_MODE_ECO 0x02
0385 #define SMPS_CTRL_MODE_PWM 0x03
0386
0387 #define PALMAS_SMPS_NUM_VOLTAGES 122
0388 #define PALMAS_SMPS10_NUM_VOLTAGES 2
0389 #define PALMAS_LDO_NUM_VOLTAGES 50
0390
0391 #define SMPS10_VSEL (1<<3)
0392 #define SMPS10_BOOST_EN (1<<2)
0393 #define SMPS10_BYPASS_EN (1<<1)
0394 #define SMPS10_SWITCH_EN (1<<0)
0395
0396 #define REGULATOR_SLAVE 0
0397
0398 static int palmas_smps_read(struct palmas *palmas, unsigned int reg,
0399 unsigned int *dest)
0400 {
0401 unsigned int addr;
0402
0403 addr = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, reg);
0404
0405 return regmap_read(palmas->regmap[REGULATOR_SLAVE], addr, dest);
0406 }
0407
0408 static int palmas_smps_write(struct palmas *palmas, unsigned int reg,
0409 unsigned int value)
0410 {
0411 unsigned int addr;
0412
0413 addr = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, reg);
0414
0415 return regmap_write(palmas->regmap[REGULATOR_SLAVE], addr, value);
0416 }
0417
0418 static int palmas_ldo_read(struct palmas *palmas, unsigned int reg,
0419 unsigned int *dest)
0420 {
0421 unsigned int addr;
0422
0423 addr = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, reg);
0424
0425 return regmap_read(palmas->regmap[REGULATOR_SLAVE], addr, dest);
0426 }
0427
0428 static int palmas_ldo_write(struct palmas *palmas, unsigned int reg,
0429 unsigned int value)
0430 {
0431 unsigned int addr;
0432
0433 addr = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE, reg);
0434
0435 return regmap_write(palmas->regmap[REGULATOR_SLAVE], addr, value);
0436 }
0437
0438 static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode)
0439 {
0440 int id = rdev_get_id(dev);
0441 int ret;
0442 struct palmas_pmic *pmic = rdev_get_drvdata(dev);
0443 struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata;
0444 struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];
0445 unsigned int reg;
0446 bool rail_enable = true;
0447
0448 ret = palmas_smps_read(pmic->palmas, rinfo->ctrl_addr, ®);
0449 if (ret)
0450 return ret;
0451
0452 reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
0453
0454 if (reg == SMPS_CTRL_MODE_OFF)
0455 rail_enable = false;
0456
0457 switch (mode) {
0458 case REGULATOR_MODE_NORMAL:
0459 reg |= SMPS_CTRL_MODE_ON;
0460 break;
0461 case REGULATOR_MODE_IDLE:
0462 reg |= SMPS_CTRL_MODE_ECO;
0463 break;
0464 case REGULATOR_MODE_FAST:
0465 reg |= SMPS_CTRL_MODE_PWM;
0466 break;
0467 default:
0468 return -EINVAL;
0469 }
0470
0471 pmic->current_reg_mode[id] = reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
0472 if (rail_enable)
0473 palmas_smps_write(pmic->palmas, rinfo->ctrl_addr, reg);
0474
0475
0476 pmic->desc[id].enable_val = pmic->current_reg_mode[id];
0477
0478 return 0;
0479 }
0480
0481 static unsigned int palmas_get_mode_smps(struct regulator_dev *dev)
0482 {
0483 struct palmas_pmic *pmic = rdev_get_drvdata(dev);
0484 int id = rdev_get_id(dev);
0485 unsigned int reg;
0486
0487 reg = pmic->current_reg_mode[id] & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
0488
0489 switch (reg) {
0490 case SMPS_CTRL_MODE_ON:
0491 return REGULATOR_MODE_NORMAL;
0492 case SMPS_CTRL_MODE_ECO:
0493 return REGULATOR_MODE_IDLE;
0494 case SMPS_CTRL_MODE_PWM:
0495 return REGULATOR_MODE_FAST;
0496 }
0497
0498 return 0;
0499 }
0500
0501 static int palmas_smps_set_ramp_delay(struct regulator_dev *rdev,
0502 int ramp_delay)
0503 {
0504 int id = rdev_get_id(rdev);
0505 struct palmas_pmic *pmic = rdev_get_drvdata(rdev);
0506 struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata;
0507 struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];
0508 unsigned int reg = 0;
0509 int ret;
0510
0511
0512 switch (id) {
0513 case PALMAS_REG_SMPS3:
0514 case PALMAS_REG_SMPS7:
0515 return 0;
0516 }
0517
0518 if (ramp_delay <= 0)
0519 reg = 0;
0520 else if (ramp_delay <= 2500)
0521 reg = 3;
0522 else if (ramp_delay <= 5000)
0523 reg = 2;
0524 else
0525 reg = 1;
0526
0527 ret = palmas_smps_write(pmic->palmas, rinfo->tstep_addr, reg);
0528 if (ret < 0) {
0529 dev_err(pmic->palmas->dev, "TSTEP write failed: %d\n", ret);
0530 return ret;
0531 }
0532
0533 pmic->ramp_delay[id] = palmas_smps_ramp_delay[reg];
0534 return ret;
0535 }
0536
0537 static const struct regulator_ops palmas_ops_smps = {
0538 .is_enabled = regulator_is_enabled_regmap,
0539 .enable = regulator_enable_regmap,
0540 .disable = regulator_disable_regmap,
0541 .set_mode = palmas_set_mode_smps,
0542 .get_mode = palmas_get_mode_smps,
0543 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0544 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0545 .list_voltage = regulator_list_voltage_linear_range,
0546 .map_voltage = regulator_map_voltage_linear_range,
0547 .set_voltage_time_sel = regulator_set_voltage_time_sel,
0548 .set_ramp_delay = palmas_smps_set_ramp_delay,
0549 };
0550
0551 static const struct regulator_ops palmas_ops_ext_control_smps = {
0552 .set_mode = palmas_set_mode_smps,
0553 .get_mode = palmas_get_mode_smps,
0554 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0555 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0556 .list_voltage = regulator_list_voltage_linear_range,
0557 .map_voltage = regulator_map_voltage_linear_range,
0558 .set_voltage_time_sel = regulator_set_voltage_time_sel,
0559 .set_ramp_delay = palmas_smps_set_ramp_delay,
0560 };
0561
0562 static const struct regulator_ops palmas_ops_smps10 = {
0563 .is_enabled = regulator_is_enabled_regmap,
0564 .enable = regulator_enable_regmap,
0565 .disable = regulator_disable_regmap,
0566 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0567 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0568 .list_voltage = regulator_list_voltage_linear,
0569 .map_voltage = regulator_map_voltage_linear,
0570 .set_bypass = regulator_set_bypass_regmap,
0571 .get_bypass = regulator_get_bypass_regmap,
0572 };
0573
0574 static const struct regulator_ops tps65917_ops_smps = {
0575 .is_enabled = regulator_is_enabled_regmap,
0576 .enable = regulator_enable_regmap,
0577 .disable = regulator_disable_regmap,
0578 .set_mode = palmas_set_mode_smps,
0579 .get_mode = palmas_get_mode_smps,
0580 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0581 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0582 .list_voltage = regulator_list_voltage_linear_range,
0583 .map_voltage = regulator_map_voltage_linear_range,
0584 .set_voltage_time_sel = regulator_set_voltage_time_sel,
0585 };
0586
0587 static const struct regulator_ops tps65917_ops_ext_control_smps = {
0588 .set_mode = palmas_set_mode_smps,
0589 .get_mode = palmas_get_mode_smps,
0590 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0591 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0592 .list_voltage = regulator_list_voltage_linear_range,
0593 .map_voltage = regulator_map_voltage_linear_range,
0594 };
0595
0596 static int palmas_is_enabled_ldo(struct regulator_dev *dev)
0597 {
0598 int id = rdev_get_id(dev);
0599 struct palmas_pmic *pmic = rdev_get_drvdata(dev);
0600 struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata;
0601 struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];
0602 unsigned int reg;
0603
0604 palmas_ldo_read(pmic->palmas, rinfo->ctrl_addr, ®);
0605
0606 reg &= PALMAS_LDO1_CTRL_STATUS;
0607
0608 return !!(reg);
0609 }
0610
0611 static const struct regulator_ops palmas_ops_ldo = {
0612 .is_enabled = palmas_is_enabled_ldo,
0613 .enable = regulator_enable_regmap,
0614 .disable = regulator_disable_regmap,
0615 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0616 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0617 .list_voltage = regulator_list_voltage_linear,
0618 .map_voltage = regulator_map_voltage_linear,
0619 };
0620
0621 static const struct regulator_ops palmas_ops_ldo9 = {
0622 .is_enabled = palmas_is_enabled_ldo,
0623 .enable = regulator_enable_regmap,
0624 .disable = regulator_disable_regmap,
0625 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0626 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0627 .list_voltage = regulator_list_voltage_linear,
0628 .map_voltage = regulator_map_voltage_linear,
0629 .set_bypass = regulator_set_bypass_regmap,
0630 .get_bypass = regulator_get_bypass_regmap,
0631 };
0632
0633 static const struct regulator_ops palmas_ops_ext_control_ldo = {
0634 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0635 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0636 .list_voltage = regulator_list_voltage_linear,
0637 .map_voltage = regulator_map_voltage_linear,
0638 };
0639
0640 static const struct regulator_ops palmas_ops_extreg = {
0641 .is_enabled = regulator_is_enabled_regmap,
0642 .enable = regulator_enable_regmap,
0643 .disable = regulator_disable_regmap,
0644 };
0645
0646 static const struct regulator_ops palmas_ops_ext_control_extreg = {
0647 };
0648
0649 static const struct regulator_ops tps65917_ops_ldo = {
0650 .is_enabled = palmas_is_enabled_ldo,
0651 .enable = regulator_enable_regmap,
0652 .disable = regulator_disable_regmap,
0653 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0654 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0655 .list_voltage = regulator_list_voltage_linear,
0656 .map_voltage = regulator_map_voltage_linear,
0657 .set_voltage_time_sel = regulator_set_voltage_time_sel,
0658 };
0659
0660 static const struct regulator_ops tps65917_ops_ldo_1_2 = {
0661 .is_enabled = palmas_is_enabled_ldo,
0662 .enable = regulator_enable_regmap,
0663 .disable = regulator_disable_regmap,
0664 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0665 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0666 .list_voltage = regulator_list_voltage_linear,
0667 .map_voltage = regulator_map_voltage_linear,
0668 .set_voltage_time_sel = regulator_set_voltage_time_sel,
0669 .set_bypass = regulator_set_bypass_regmap,
0670 .get_bypass = regulator_get_bypass_regmap,
0671 };
0672
0673 static int palmas_regulator_config_external(struct palmas *palmas, int id,
0674 struct palmas_reg_init *reg_init)
0675 {
0676 struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata;
0677 struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];
0678 int ret;
0679
0680 ret = palmas_ext_control_req_config(palmas, rinfo->sleep_id,
0681 reg_init->roof_floor, true);
0682 if (ret < 0)
0683 dev_err(palmas->dev,
0684 "Ext control config for regulator %d failed %d\n",
0685 id, ret);
0686 return ret;
0687 }
0688
0689
0690
0691
0692
0693
0694
0695 static int palmas_smps_init(struct palmas *palmas, int id,
0696 struct palmas_reg_init *reg_init)
0697 {
0698 unsigned int reg;
0699 int ret;
0700 struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata;
0701 struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];
0702 unsigned int addr = rinfo->ctrl_addr;
0703
0704 ret = palmas_smps_read(palmas, addr, ®);
0705 if (ret)
0706 return ret;
0707
0708 switch (id) {
0709 case PALMAS_REG_SMPS10_OUT1:
0710 case PALMAS_REG_SMPS10_OUT2:
0711 reg &= ~PALMAS_SMPS10_CTRL_MODE_SLEEP_MASK;
0712 if (reg_init->mode_sleep)
0713 reg |= reg_init->mode_sleep <<
0714 PALMAS_SMPS10_CTRL_MODE_SLEEP_SHIFT;
0715 break;
0716 default:
0717 if (reg_init->warm_reset)
0718 reg |= PALMAS_SMPS12_CTRL_WR_S;
0719 else
0720 reg &= ~PALMAS_SMPS12_CTRL_WR_S;
0721
0722 if (reg_init->roof_floor)
0723 reg |= PALMAS_SMPS12_CTRL_ROOF_FLOOR_EN;
0724 else
0725 reg &= ~PALMAS_SMPS12_CTRL_ROOF_FLOOR_EN;
0726
0727 reg &= ~PALMAS_SMPS12_CTRL_MODE_SLEEP_MASK;
0728 if (reg_init->mode_sleep)
0729 reg |= reg_init->mode_sleep <<
0730 PALMAS_SMPS12_CTRL_MODE_SLEEP_SHIFT;
0731 }
0732
0733 ret = palmas_smps_write(palmas, addr, reg);
0734 if (ret)
0735 return ret;
0736
0737 if (rinfo->vsel_addr && reg_init->vsel) {
0738
0739 reg = reg_init->vsel;
0740
0741 ret = palmas_smps_write(palmas, rinfo->vsel_addr, reg);
0742 if (ret)
0743 return ret;
0744 }
0745
0746 if (reg_init->roof_floor && (id != PALMAS_REG_SMPS10_OUT1) &&
0747 (id != PALMAS_REG_SMPS10_OUT2)) {
0748
0749 ret = palmas_smps_read(palmas, addr, ®);
0750 if (ret < 0)
0751 return ret;
0752
0753 if (!(reg & PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK)) {
0754 reg |= SMPS_CTRL_MODE_ON;
0755 ret = palmas_smps_write(palmas, addr, reg);
0756 if (ret < 0)
0757 return ret;
0758 }
0759 return palmas_regulator_config_external(palmas, id, reg_init);
0760 }
0761 return 0;
0762 }
0763
0764 static int palmas_ldo_init(struct palmas *palmas, int id,
0765 struct palmas_reg_init *reg_init)
0766 {
0767 unsigned int reg;
0768 unsigned int addr;
0769 int ret;
0770 struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata;
0771 struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];
0772
0773 addr = rinfo->ctrl_addr;
0774
0775 ret = palmas_ldo_read(palmas, addr, ®);
0776 if (ret)
0777 return ret;
0778
0779 if (reg_init->warm_reset)
0780 reg |= PALMAS_LDO1_CTRL_WR_S;
0781 else
0782 reg &= ~PALMAS_LDO1_CTRL_WR_S;
0783
0784 if (reg_init->mode_sleep)
0785 reg |= PALMAS_LDO1_CTRL_MODE_SLEEP;
0786 else
0787 reg &= ~PALMAS_LDO1_CTRL_MODE_SLEEP;
0788
0789 ret = palmas_ldo_write(palmas, addr, reg);
0790 if (ret)
0791 return ret;
0792
0793 if (reg_init->roof_floor) {
0794
0795 ret = palmas_update_bits(palmas, PALMAS_LDO_BASE,
0796 addr, PALMAS_LDO1_CTRL_MODE_ACTIVE,
0797 PALMAS_LDO1_CTRL_MODE_ACTIVE);
0798 if (ret < 0) {
0799 dev_err(palmas->dev,
0800 "LDO Register 0x%02x update failed %d\n",
0801 addr, ret);
0802 return ret;
0803 }
0804 return palmas_regulator_config_external(palmas, id, reg_init);
0805 }
0806 return 0;
0807 }
0808
0809 static int palmas_extreg_init(struct palmas *palmas, int id,
0810 struct palmas_reg_init *reg_init)
0811 {
0812 unsigned int addr;
0813 int ret;
0814 unsigned int val = 0;
0815 struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata;
0816 struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id];
0817
0818 addr = rinfo->ctrl_addr;
0819
0820 if (reg_init->mode_sleep)
0821 val = PALMAS_REGEN1_CTRL_MODE_SLEEP;
0822
0823 ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE,
0824 addr, PALMAS_REGEN1_CTRL_MODE_SLEEP, val);
0825 if (ret < 0) {
0826 dev_err(palmas->dev, "Resource reg 0x%02x update failed %d\n",
0827 addr, ret);
0828 return ret;
0829 }
0830
0831 if (reg_init->roof_floor) {
0832
0833 ret = palmas_update_bits(palmas, PALMAS_RESOURCE_BASE,
0834 addr, PALMAS_REGEN1_CTRL_MODE_ACTIVE,
0835 PALMAS_REGEN1_CTRL_MODE_ACTIVE);
0836 if (ret < 0) {
0837 dev_err(palmas->dev,
0838 "Resource Register 0x%02x update failed %d\n",
0839 addr, ret);
0840 return ret;
0841 }
0842 return palmas_regulator_config_external(palmas, id, reg_init);
0843 }
0844 return 0;
0845 }
0846
0847 static void palmas_enable_ldo8_track(struct palmas *palmas)
0848 {
0849 unsigned int reg;
0850 unsigned int addr;
0851 int ret;
0852 struct palmas_pmic_driver_data *ddata = palmas->pmic_ddata;
0853 struct palmas_regs_info *rinfo;
0854
0855 rinfo = &ddata->palmas_regs_info[PALMAS_REG_LDO8];
0856 addr = rinfo->ctrl_addr;
0857
0858 ret = palmas_ldo_read(palmas, addr, ®);
0859 if (ret) {
0860 dev_err(palmas->dev, "Error in reading ldo8 control reg\n");
0861 return;
0862 }
0863
0864 reg |= PALMAS_LDO8_CTRL_LDO_TRACKING_EN;
0865 ret = palmas_ldo_write(palmas, addr, reg);
0866 if (ret < 0) {
0867 dev_err(palmas->dev, "Error in enabling tracking mode\n");
0868 return;
0869 }
0870
0871
0872
0873
0874
0875 addr = rinfo->vsel_addr;
0876 ret = palmas_ldo_read(palmas, addr, ®);
0877 if (ret) {
0878 dev_err(palmas->dev, "Error in reading ldo8 voltage reg\n");
0879 return;
0880 }
0881
0882 reg = (reg << 1) & PALMAS_LDO8_VOLTAGE_VSEL_MASK;
0883 ret = palmas_ldo_write(palmas, addr, reg);
0884 if (ret < 0)
0885 dev_err(palmas->dev, "Error in setting ldo8 voltage reg\n");
0886
0887 return;
0888 }
0889
0890 static int palmas_ldo_registration(struct palmas_pmic *pmic,
0891 struct palmas_pmic_driver_data *ddata,
0892 struct palmas_pmic_platform_data *pdata,
0893 const char *pdev_name,
0894 struct regulator_config config)
0895 {
0896 int id, ret;
0897 struct regulator_dev *rdev;
0898 struct palmas_reg_init *reg_init;
0899 struct palmas_regs_info *rinfo;
0900 struct regulator_desc *desc;
0901
0902 for (id = ddata->ldo_begin; id < ddata->max_reg; id++) {
0903 if (pdata && pdata->reg_init[id])
0904 reg_init = pdata->reg_init[id];
0905 else
0906 reg_init = NULL;
0907
0908 rinfo = &ddata->palmas_regs_info[id];
0909
0910
0911
0912
0913
0914 desc = &pmic->desc[id];
0915 desc->name = rinfo->name;
0916 desc->id = id;
0917 desc->type = REGULATOR_VOLTAGE;
0918 desc->owner = THIS_MODULE;
0919
0920 if (id < PALMAS_REG_REGEN1) {
0921 desc->n_voltages = PALMAS_LDO_NUM_VOLTAGES;
0922 if (reg_init && reg_init->roof_floor)
0923 desc->ops = &palmas_ops_ext_control_ldo;
0924 else
0925 desc->ops = &palmas_ops_ldo;
0926 desc->min_uV = 900000;
0927 desc->uV_step = 50000;
0928 desc->linear_min_sel = 1;
0929 desc->enable_time = 500;
0930 desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE,
0931 rinfo->vsel_addr);
0932 desc->vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK;
0933 desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE,
0934 rinfo->ctrl_addr);
0935 desc->enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE;
0936
0937
0938 if (pdata && (id == PALMAS_REG_LDO8) &&
0939 pdata->enable_ldo8_tracking) {
0940 palmas_enable_ldo8_track(pmic->palmas);
0941 desc->min_uV = 450000;
0942 desc->uV_step = 25000;
0943 }
0944
0945
0946 if (pdata && pdata->ldo6_vibrator &&
0947 (id == PALMAS_REG_LDO6))
0948 desc->enable_time = 2000;
0949
0950 if (id == PALMAS_REG_LDO9) {
0951 desc->ops = &palmas_ops_ldo9;
0952 desc->bypass_reg = desc->enable_reg;
0953 desc->bypass_val_on =
0954 PALMAS_LDO9_CTRL_LDO_BYPASS_EN;
0955 desc->bypass_mask =
0956 PALMAS_LDO9_CTRL_LDO_BYPASS_EN;
0957 }
0958 } else {
0959 if (!ddata->has_regen3 && id == PALMAS_REG_REGEN3)
0960 continue;
0961
0962 desc->n_voltages = 1;
0963 if (reg_init && reg_init->roof_floor)
0964 desc->ops = &palmas_ops_ext_control_extreg;
0965 else
0966 desc->ops = &palmas_ops_extreg;
0967 desc->enable_reg =
0968 PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE,
0969 rinfo->ctrl_addr);
0970 desc->enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE;
0971 }
0972
0973 if (pdata)
0974 config.init_data = pdata->reg_data[id];
0975 else
0976 config.init_data = NULL;
0977
0978 desc->supply_name = rinfo->sname;
0979 config.of_node = ddata->palmas_matches[id].of_node;
0980
0981 rdev = devm_regulator_register(pmic->dev, desc, &config);
0982 if (IS_ERR(rdev)) {
0983 dev_err(pmic->dev,
0984 "failed to register %s regulator\n",
0985 pdev_name);
0986 return PTR_ERR(rdev);
0987 }
0988
0989
0990 if (pdata) {
0991 reg_init = pdata->reg_init[id];
0992 if (reg_init) {
0993 if (id <= ddata->ldo_end)
0994 ret = palmas_ldo_init(pmic->palmas, id,
0995 reg_init);
0996 else
0997 ret = palmas_extreg_init(pmic->palmas,
0998 id, reg_init);
0999 if (ret)
1000 return ret;
1001 }
1002 }
1003 }
1004
1005 return 0;
1006 }
1007
1008 static int tps65917_ldo_registration(struct palmas_pmic *pmic,
1009 struct palmas_pmic_driver_data *ddata,
1010 struct palmas_pmic_platform_data *pdata,
1011 const char *pdev_name,
1012 struct regulator_config config)
1013 {
1014 int id, ret;
1015 struct regulator_dev *rdev;
1016 struct palmas_reg_init *reg_init;
1017 struct palmas_regs_info *rinfo;
1018 struct regulator_desc *desc;
1019
1020 for (id = ddata->ldo_begin; id < ddata->max_reg; id++) {
1021 if (pdata && pdata->reg_init[id])
1022 reg_init = pdata->reg_init[id];
1023 else
1024 reg_init = NULL;
1025
1026
1027
1028
1029 rinfo = &ddata->palmas_regs_info[id];
1030
1031
1032 desc = &pmic->desc[id];
1033 desc->name = rinfo->name;
1034 desc->id = id;
1035 desc->type = REGULATOR_VOLTAGE;
1036 desc->owner = THIS_MODULE;
1037
1038 if (id < TPS65917_REG_REGEN1) {
1039 desc->n_voltages = PALMAS_LDO_NUM_VOLTAGES;
1040 if (reg_init && reg_init->roof_floor)
1041 desc->ops = &palmas_ops_ext_control_ldo;
1042 else
1043 desc->ops = &tps65917_ops_ldo;
1044 desc->min_uV = 900000;
1045 desc->uV_step = 50000;
1046 desc->linear_min_sel = 1;
1047 desc->enable_time = 500;
1048 desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE,
1049 rinfo->vsel_addr);
1050 desc->vsel_mask = PALMAS_LDO1_VOLTAGE_VSEL_MASK;
1051 desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_LDO_BASE,
1052 rinfo->ctrl_addr);
1053 desc->enable_mask = PALMAS_LDO1_CTRL_MODE_ACTIVE;
1054
1055
1056
1057
1058 desc->ramp_delay = 2500;
1059 if (id == TPS65917_REG_LDO1 ||
1060 id == TPS65917_REG_LDO2) {
1061 desc->ops = &tps65917_ops_ldo_1_2;
1062 desc->bypass_reg = desc->enable_reg;
1063 desc->bypass_val_on =
1064 TPS65917_LDO1_CTRL_BYPASS_EN;
1065 desc->bypass_mask =
1066 TPS65917_LDO1_CTRL_BYPASS_EN;
1067 }
1068 } else {
1069 desc->n_voltages = 1;
1070 if (reg_init && reg_init->roof_floor)
1071 desc->ops = &palmas_ops_ext_control_extreg;
1072 else
1073 desc->ops = &palmas_ops_extreg;
1074 desc->enable_reg =
1075 PALMAS_BASE_TO_REG(PALMAS_RESOURCE_BASE,
1076 rinfo->ctrl_addr);
1077 desc->enable_mask = PALMAS_REGEN1_CTRL_MODE_ACTIVE;
1078 }
1079
1080 if (pdata)
1081 config.init_data = pdata->reg_data[id];
1082 else
1083 config.init_data = NULL;
1084
1085 desc->supply_name = rinfo->sname;
1086 config.of_node = ddata->palmas_matches[id].of_node;
1087
1088 rdev = devm_regulator_register(pmic->dev, desc, &config);
1089 if (IS_ERR(rdev)) {
1090 dev_err(pmic->dev,
1091 "failed to register %s regulator\n",
1092 pdev_name);
1093 return PTR_ERR(rdev);
1094 }
1095
1096
1097 if (pdata) {
1098 reg_init = pdata->reg_init[id];
1099 if (reg_init) {
1100 if (id < TPS65917_REG_REGEN1)
1101 ret = palmas_ldo_init(pmic->palmas,
1102 id, reg_init);
1103 else
1104 ret = palmas_extreg_init(pmic->palmas,
1105 id, reg_init);
1106 if (ret)
1107 return ret;
1108 }
1109 }
1110 }
1111
1112 return 0;
1113 }
1114
1115 static int palmas_smps_registration(struct palmas_pmic *pmic,
1116 struct palmas_pmic_driver_data *ddata,
1117 struct palmas_pmic_platform_data *pdata,
1118 const char *pdev_name,
1119 struct regulator_config config)
1120 {
1121 int id, ret;
1122 unsigned int addr, reg;
1123 struct regulator_dev *rdev;
1124 struct palmas_reg_init *reg_init;
1125 struct palmas_regs_info *rinfo;
1126 struct regulator_desc *desc;
1127
1128 for (id = ddata->smps_start; id <= ddata->smps_end; id++) {
1129 bool ramp_delay_support = false;
1130
1131
1132
1133
1134
1135 switch (id) {
1136 case PALMAS_REG_SMPS12:
1137 case PALMAS_REG_SMPS3:
1138 if (pmic->smps123)
1139 continue;
1140 if (id == PALMAS_REG_SMPS12)
1141 ramp_delay_support = true;
1142 break;
1143 case PALMAS_REG_SMPS123:
1144 if (!pmic->smps123)
1145 continue;
1146 ramp_delay_support = true;
1147 break;
1148 case PALMAS_REG_SMPS45:
1149 case PALMAS_REG_SMPS7:
1150 if (pmic->smps457)
1151 continue;
1152 if (id == PALMAS_REG_SMPS45)
1153 ramp_delay_support = true;
1154 break;
1155 case PALMAS_REG_SMPS457:
1156 if (!pmic->smps457)
1157 continue;
1158 ramp_delay_support = true;
1159 break;
1160 case PALMAS_REG_SMPS10_OUT1:
1161 case PALMAS_REG_SMPS10_OUT2:
1162 if (!PALMAS_PMIC_HAS(pmic->palmas, SMPS10_BOOST))
1163 continue;
1164 }
1165 rinfo = &ddata->palmas_regs_info[id];
1166 desc = &pmic->desc[id];
1167
1168 if ((id == PALMAS_REG_SMPS6) || (id == PALMAS_REG_SMPS8))
1169 ramp_delay_support = true;
1170
1171 if (ramp_delay_support) {
1172 addr = rinfo->tstep_addr;
1173 ret = palmas_smps_read(pmic->palmas, addr, ®);
1174 if (ret < 0) {
1175 dev_err(pmic->dev,
1176 "reading TSTEP reg failed: %d\n", ret);
1177 return ret;
1178 }
1179 desc->ramp_delay = palmas_smps_ramp_delay[reg & 0x3];
1180 pmic->ramp_delay[id] = desc->ramp_delay;
1181 }
1182
1183
1184 if (pdata && pdata->reg_init[id]) {
1185 reg_init = pdata->reg_init[id];
1186 ret = palmas_smps_init(pmic->palmas, id, reg_init);
1187 if (ret)
1188 return ret;
1189 } else {
1190 reg_init = NULL;
1191 }
1192
1193
1194 desc->name = rinfo->name;
1195 desc->id = id;
1196
1197 switch (id) {
1198 case PALMAS_REG_SMPS10_OUT1:
1199 case PALMAS_REG_SMPS10_OUT2:
1200 desc->n_voltages = PALMAS_SMPS10_NUM_VOLTAGES;
1201 desc->ops = &palmas_ops_smps10;
1202 desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
1203 PALMAS_SMPS10_CTRL);
1204 desc->vsel_mask = SMPS10_VSEL;
1205 desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
1206 PALMAS_SMPS10_CTRL);
1207 if (id == PALMAS_REG_SMPS10_OUT1)
1208 desc->enable_mask = SMPS10_SWITCH_EN;
1209 else
1210 desc->enable_mask = SMPS10_BOOST_EN;
1211 desc->bypass_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
1212 PALMAS_SMPS10_CTRL);
1213 desc->bypass_val_on = SMPS10_BYPASS_EN;
1214 desc->bypass_mask = SMPS10_BYPASS_EN;
1215 desc->min_uV = 3750000;
1216 desc->uV_step = 1250000;
1217 break;
1218 default:
1219
1220
1221
1222
1223
1224
1225 addr = rinfo->vsel_addr;
1226 desc->n_linear_ranges = 3;
1227
1228 ret = palmas_smps_read(pmic->palmas, addr, ®);
1229 if (ret)
1230 return ret;
1231 if (reg & PALMAS_SMPS12_VOLTAGE_RANGE)
1232 pmic->range[id] = 1;
1233 if (pmic->range[id])
1234 desc->linear_ranges = smps_high_ranges;
1235 else
1236 desc->linear_ranges = smps_low_ranges;
1237
1238 if (reg_init && reg_init->roof_floor)
1239 desc->ops = &palmas_ops_ext_control_smps;
1240 else
1241 desc->ops = &palmas_ops_smps;
1242 desc->n_voltages = PALMAS_SMPS_NUM_VOLTAGES;
1243 desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
1244 rinfo->vsel_addr);
1245 desc->vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK;
1246
1247
1248 addr = rinfo->ctrl_addr;
1249 ret = palmas_smps_read(pmic->palmas, addr, ®);
1250 if (ret)
1251 return ret;
1252 pmic->current_reg_mode[id] = reg &
1253 PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
1254
1255 desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
1256 rinfo->ctrl_addr);
1257 desc->enable_mask = PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
1258
1259 desc->enable_val = SMPS_CTRL_MODE_ON;
1260 }
1261
1262 desc->type = REGULATOR_VOLTAGE;
1263 desc->owner = THIS_MODULE;
1264
1265 if (pdata)
1266 config.init_data = pdata->reg_data[id];
1267 else
1268 config.init_data = NULL;
1269
1270 desc->supply_name = rinfo->sname;
1271 config.of_node = ddata->palmas_matches[id].of_node;
1272
1273 rdev = devm_regulator_register(pmic->dev, desc, &config);
1274 if (IS_ERR(rdev)) {
1275 dev_err(pmic->dev,
1276 "failed to register %s regulator\n",
1277 pdev_name);
1278 return PTR_ERR(rdev);
1279 }
1280 }
1281
1282 return 0;
1283 }
1284
1285 static int tps65917_smps_registration(struct palmas_pmic *pmic,
1286 struct palmas_pmic_driver_data *ddata,
1287 struct palmas_pmic_platform_data *pdata,
1288 const char *pdev_name,
1289 struct regulator_config config)
1290 {
1291 int id, ret;
1292 unsigned int addr, reg;
1293 struct regulator_dev *rdev;
1294 struct palmas_reg_init *reg_init;
1295 struct palmas_regs_info *rinfo;
1296 struct regulator_desc *desc;
1297
1298 for (id = ddata->smps_start; id <= ddata->smps_end; id++) {
1299
1300
1301
1302
1303 desc = &pmic->desc[id];
1304 desc->n_linear_ranges = 3;
1305 if ((id == TPS65917_REG_SMPS2 || id == TPS65917_REG_SMPS1) &&
1306 pmic->smps12)
1307 continue;
1308
1309
1310 if (pdata && pdata->reg_init[id]) {
1311 reg_init = pdata->reg_init[id];
1312 ret = palmas_smps_init(pmic->palmas, id, reg_init);
1313 if (ret)
1314 return ret;
1315 } else {
1316 reg_init = NULL;
1317 }
1318 rinfo = &ddata->palmas_regs_info[id];
1319
1320
1321 desc->name = rinfo->name;
1322 desc->id = id;
1323
1324
1325
1326
1327
1328
1329
1330 addr = rinfo->vsel_addr;
1331
1332 ret = palmas_smps_read(pmic->palmas, addr, ®);
1333 if (ret)
1334 return ret;
1335 if (reg & TPS65917_SMPS1_VOLTAGE_RANGE)
1336 pmic->range[id] = 1;
1337
1338 if (pmic->range[id])
1339 desc->linear_ranges = smps_high_ranges;
1340 else
1341 desc->linear_ranges = smps_low_ranges;
1342
1343 if (reg_init && reg_init->roof_floor)
1344 desc->ops = &tps65917_ops_ext_control_smps;
1345 else
1346 desc->ops = &tps65917_ops_smps;
1347 desc->n_voltages = PALMAS_SMPS_NUM_VOLTAGES;
1348 desc->vsel_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
1349 rinfo->vsel_addr);
1350 desc->vsel_mask = PALMAS_SMPS12_VOLTAGE_VSEL_MASK;
1351 desc->ramp_delay = 2500;
1352
1353
1354 addr = rinfo->ctrl_addr;
1355 ret = palmas_smps_read(pmic->palmas, addr, ®);
1356 if (ret)
1357 return ret;
1358 pmic->current_reg_mode[id] = reg &
1359 PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
1360 desc->enable_reg = PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE,
1361 rinfo->ctrl_addr);
1362 desc->enable_mask = PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
1363
1364 desc->enable_val = SMPS_CTRL_MODE_ON;
1365
1366 desc->type = REGULATOR_VOLTAGE;
1367 desc->owner = THIS_MODULE;
1368
1369 if (pdata)
1370 config.init_data = pdata->reg_data[id];
1371 else
1372 config.init_data = NULL;
1373
1374 desc->supply_name = rinfo->sname;
1375 config.of_node = ddata->palmas_matches[id].of_node;
1376
1377 rdev = devm_regulator_register(pmic->dev, desc, &config);
1378 if (IS_ERR(rdev)) {
1379 dev_err(pmic->dev,
1380 "failed to register %s regulator\n",
1381 pdev_name);
1382 return PTR_ERR(rdev);
1383 }
1384 }
1385
1386 return 0;
1387 }
1388
1389 static struct of_regulator_match palmas_matches[] = {
1390 { .name = "smps12", },
1391 { .name = "smps123", },
1392 { .name = "smps3", },
1393 { .name = "smps45", },
1394 { .name = "smps457", },
1395 { .name = "smps6", },
1396 { .name = "smps7", },
1397 { .name = "smps8", },
1398 { .name = "smps9", },
1399 { .name = "smps10_out2", },
1400 { .name = "smps10_out1", },
1401 { .name = "ldo1", },
1402 { .name = "ldo2", },
1403 { .name = "ldo3", },
1404 { .name = "ldo4", },
1405 { .name = "ldo5", },
1406 { .name = "ldo6", },
1407 { .name = "ldo7", },
1408 { .name = "ldo8", },
1409 { .name = "ldo9", },
1410 { .name = "ldoln", },
1411 { .name = "ldousb", },
1412 { .name = "regen1", },
1413 { .name = "regen2", },
1414 { .name = "regen3", },
1415 { .name = "sysen1", },
1416 { .name = "sysen2", },
1417 };
1418
1419 static struct of_regulator_match tps65917_matches[] = {
1420 { .name = "smps1", },
1421 { .name = "smps2", },
1422 { .name = "smps3", },
1423 { .name = "smps4", },
1424 { .name = "smps5", },
1425 { .name = "smps12",},
1426 { .name = "ldo1", },
1427 { .name = "ldo2", },
1428 { .name = "ldo3", },
1429 { .name = "ldo4", },
1430 { .name = "ldo5", },
1431 { .name = "regen1", },
1432 { .name = "regen2", },
1433 { .name = "regen3", },
1434 { .name = "sysen1", },
1435 { .name = "sysen2", },
1436 };
1437
1438 static struct palmas_pmic_driver_data palmas_ddata = {
1439 .smps_start = PALMAS_REG_SMPS12,
1440 .smps_end = PALMAS_REG_SMPS10_OUT1,
1441 .ldo_begin = PALMAS_REG_LDO1,
1442 .ldo_end = PALMAS_REG_LDOUSB,
1443 .max_reg = PALMAS_NUM_REGS,
1444 .has_regen3 = true,
1445 .palmas_regs_info = palmas_generic_regs_info,
1446 .palmas_matches = palmas_matches,
1447 .sleep_req_info = palma_sleep_req_info,
1448 .smps_register = palmas_smps_registration,
1449 .ldo_register = palmas_ldo_registration,
1450 };
1451
1452 static struct palmas_pmic_driver_data tps65917_ddata = {
1453 .smps_start = TPS65917_REG_SMPS1,
1454 .smps_end = TPS65917_REG_SMPS12,
1455 .ldo_begin = TPS65917_REG_LDO1,
1456 .ldo_end = TPS65917_REG_LDO5,
1457 .max_reg = TPS65917_NUM_REGS,
1458 .has_regen3 = true,
1459 .palmas_regs_info = tps65917_regs_info,
1460 .palmas_matches = tps65917_matches,
1461 .sleep_req_info = tps65917_sleep_req_info,
1462 .smps_register = tps65917_smps_registration,
1463 .ldo_register = tps65917_ldo_registration,
1464 };
1465
1466 static int palmas_dt_to_pdata(struct device *dev,
1467 struct device_node *node,
1468 struct palmas_pmic_platform_data *pdata,
1469 struct palmas_pmic_driver_data *ddata)
1470 {
1471 struct device_node *regulators;
1472 u32 prop;
1473 int idx, ret;
1474
1475 regulators = of_get_child_by_name(node, "regulators");
1476 if (!regulators) {
1477 dev_info(dev, "regulator node not found\n");
1478 return 0;
1479 }
1480
1481 ret = of_regulator_match(dev, regulators, ddata->palmas_matches,
1482 ddata->max_reg);
1483 of_node_put(regulators);
1484 if (ret < 0) {
1485 dev_err(dev, "Error parsing regulator init data: %d\n", ret);
1486 return 0;
1487 }
1488
1489 for (idx = 0; idx < ddata->max_reg; idx++) {
1490 struct of_regulator_match *match;
1491 struct palmas_reg_init *rinit;
1492 struct device_node *np;
1493
1494 match = &ddata->palmas_matches[idx];
1495 np = match->of_node;
1496
1497 if (!match->init_data || !np)
1498 continue;
1499
1500 rinit = devm_kzalloc(dev, sizeof(*rinit), GFP_KERNEL);
1501 if (!rinit)
1502 return -ENOMEM;
1503
1504 pdata->reg_data[idx] = match->init_data;
1505 pdata->reg_init[idx] = rinit;
1506
1507 rinit->warm_reset = of_property_read_bool(np, "ti,warm-reset");
1508 ret = of_property_read_u32(np, "ti,roof-floor", &prop);
1509
1510 if (ret != -EINVAL) {
1511 int econtrol;
1512
1513
1514 econtrol = PALMAS_EXT_CONTROL_NSLEEP;
1515 if (!ret) {
1516 switch (prop) {
1517 case 1:
1518 econtrol = PALMAS_EXT_CONTROL_ENABLE1;
1519 break;
1520 case 2:
1521 econtrol = PALMAS_EXT_CONTROL_ENABLE2;
1522 break;
1523 case 3:
1524 econtrol = PALMAS_EXT_CONTROL_NSLEEP;
1525 break;
1526 default:
1527 WARN_ON(1);
1528 dev_warn(dev,
1529 "%s: Invalid roof-floor option: %u\n",
1530 match->name, prop);
1531 break;
1532 }
1533 }
1534 rinit->roof_floor = econtrol;
1535 }
1536
1537 ret = of_property_read_u32(np, "ti,mode-sleep", &prop);
1538 if (!ret)
1539 rinit->mode_sleep = prop;
1540
1541 ret = of_property_read_bool(np, "ti,smps-range");
1542 if (ret)
1543 rinit->vsel = PALMAS_SMPS12_VOLTAGE_RANGE;
1544
1545 if (idx == PALMAS_REG_LDO8)
1546 pdata->enable_ldo8_tracking = of_property_read_bool(
1547 np, "ti,enable-ldo8-tracking");
1548 }
1549
1550 pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator");
1551
1552 return 0;
1553 }
1554
1555 static const struct of_device_id of_palmas_match_tbl[] = {
1556 {
1557 .compatible = "ti,palmas-pmic",
1558 .data = &palmas_ddata,
1559 },
1560 {
1561 .compatible = "ti,twl6035-pmic",
1562 .data = &palmas_ddata,
1563 },
1564 {
1565 .compatible = "ti,twl6036-pmic",
1566 .data = &palmas_ddata,
1567 },
1568 {
1569 .compatible = "ti,twl6037-pmic",
1570 .data = &palmas_ddata,
1571 },
1572 {
1573 .compatible = "ti,tps65913-pmic",
1574 .data = &palmas_ddata,
1575 },
1576 {
1577 .compatible = "ti,tps65914-pmic",
1578 .data = &palmas_ddata,
1579 },
1580 {
1581 .compatible = "ti,tps80036-pmic",
1582 .data = &palmas_ddata,
1583 },
1584 {
1585 .compatible = "ti,tps659038-pmic",
1586 .data = &palmas_ddata,
1587 },
1588 {
1589 .compatible = "ti,tps65917-pmic",
1590 .data = &tps65917_ddata,
1591 },
1592 { }
1593 };
1594
1595 static int palmas_regulators_probe(struct platform_device *pdev)
1596 {
1597 struct palmas *palmas = dev_get_drvdata(pdev->dev.parent);
1598 struct palmas_pmic_platform_data *pdata = dev_get_platdata(&pdev->dev);
1599 struct device_node *node = pdev->dev.of_node;
1600 struct palmas_pmic_driver_data *driver_data;
1601 struct regulator_config config = { };
1602 struct palmas_pmic *pmic;
1603 const char *pdev_name;
1604 const struct of_device_id *match;
1605 int ret = 0;
1606 unsigned int reg;
1607
1608 match = of_match_device(of_match_ptr(of_palmas_match_tbl), &pdev->dev);
1609
1610 if (!match)
1611 return -ENODATA;
1612
1613 driver_data = (struct palmas_pmic_driver_data *)match->data;
1614 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1615 if (!pdata)
1616 return -ENOMEM;
1617
1618 pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL);
1619 if (!pmic)
1620 return -ENOMEM;
1621
1622 if (of_device_is_compatible(node, "ti,tps659038-pmic")) {
1623 palmas_generic_regs_info[PALMAS_REG_REGEN2].ctrl_addr =
1624 TPS659038_REGEN2_CTRL;
1625 palmas_ddata.has_regen3 = false;
1626 }
1627
1628 pmic->dev = &pdev->dev;
1629 pmic->palmas = palmas;
1630 palmas->pmic = pmic;
1631 platform_set_drvdata(pdev, pmic);
1632 pmic->palmas->pmic_ddata = driver_data;
1633
1634 ret = palmas_dt_to_pdata(&pdev->dev, node, pdata, driver_data);
1635 if (ret)
1636 return ret;
1637
1638 ret = palmas_smps_read(palmas, PALMAS_SMPS_CTRL, ®);
1639 if (ret)
1640 return ret;
1641
1642 if (reg & PALMAS_SMPS_CTRL_SMPS12_SMPS123_EN) {
1643 pmic->smps123 = 1;
1644 pmic->smps12 = 1;
1645 }
1646
1647 if (reg & PALMAS_SMPS_CTRL_SMPS45_SMPS457_EN)
1648 pmic->smps457 = 1;
1649
1650 config.regmap = palmas->regmap[REGULATOR_SLAVE];
1651 config.dev = &pdev->dev;
1652 config.driver_data = pmic;
1653 pdev_name = pdev->name;
1654
1655 ret = driver_data->smps_register(pmic, driver_data, pdata, pdev_name,
1656 config);
1657 if (ret)
1658 return ret;
1659
1660 ret = driver_data->ldo_register(pmic, driver_data, pdata, pdev_name,
1661 config);
1662
1663 return ret;
1664 }
1665
1666 static struct platform_driver palmas_driver = {
1667 .driver = {
1668 .name = "palmas-pmic",
1669 .of_match_table = of_palmas_match_tbl,
1670 },
1671 .probe = palmas_regulators_probe,
1672 };
1673
1674 static int __init palmas_init(void)
1675 {
1676 return platform_driver_register(&palmas_driver);
1677 }
1678 subsys_initcall(palmas_init);
1679
1680 static void __exit palmas_exit(void)
1681 {
1682 platform_driver_unregister(&palmas_driver);
1683 }
1684 module_exit(palmas_exit);
1685
1686 MODULE_AUTHOR("Graeme Gregory <gg@slimlogic.co.uk>");
1687 MODULE_DESCRIPTION("Palmas voltage regulator driver");
1688 MODULE_LICENSE("GPL");
1689 MODULE_ALIAS("platform:palmas-pmic");
1690 MODULE_DEVICE_TABLE(of, of_palmas_match_tbl);