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