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