1/* 2 * da9062-regulator.c - REGULATOR device driver for DA9062 3 * Copyright (C) 2015 Dialog Semiconductor Ltd. 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 */ 30enum { 31 DA9062_ID_BUCK1, 32 DA9062_ID_BUCK2, 33 DA9062_ID_BUCK3, 34 DA9062_ID_BUCK4, 35 DA9062_ID_LDO1, 36 DA9062_ID_LDO2, 37 DA9062_ID_LDO3, 38 DA9062_ID_LDO4, 39 DA9062_MAX_REGULATORS, 40}; 41 42/* Regulator capabilities and registers description */ 43struct da9062_regulator_info { 44 struct regulator_desc desc; 45 /* Current limiting */ 46 unsigned int n_current_limits; 47 const int *current_limits; 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 struct reg_field ilimit; 55 /* Event detection bit */ 56 struct reg_field oc_event; 57}; 58 59/* Single regulator settings */ 60struct da9062_regulator { 61 struct regulator_desc desc; 62 struct regulator_dev *rdev; 63 struct da9062 *hw; 64 const struct da9062_regulator_info *info; 65 66 struct regmap_field *mode; 67 struct regmap_field *suspend; 68 struct regmap_field *sleep; 69 struct regmap_field *suspend_sleep; 70 struct regmap_field *ilimit; 71}; 72 73/* Encapsulates all information for the regulators driver */ 74struct da9062_regulators { 75 int irq_ldo_lim; 76 unsigned n_regulators; 77 /* Array size to be defined during init. Keep at end. */ 78 struct da9062_regulator regulator[0]; 79}; 80 81/* BUCK modes */ 82enum { 83 BUCK_MODE_MANUAL, /* 0 */ 84 BUCK_MODE_SLEEP, /* 1 */ 85 BUCK_MODE_SYNC, /* 2 */ 86 BUCK_MODE_AUTO /* 3 */ 87}; 88 89/* Regulator operations */ 90 91/* Current limits array (in uA) BUCK1 and BUCK3. 92 Entry indexes corresponds to register values. */ 93static const int da9062_buck_a_limits[] = { 94 500000, 600000, 700000, 800000, 900000, 1000000, 1100000, 1200000, 95 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000 96}; 97 98/* Current limits array (in uA) for BUCK2. 99 Entry indexes corresponds to register values. */ 100static const int da9062_buck_b_limits[] = { 101 1500000, 1600000, 1700000, 1800000, 1900000, 2000000, 2100000, 2200000, 102 2300000, 2400000, 2500000, 2600000, 2700000, 2800000, 2900000, 3000000 103}; 104 105static int da9062_set_current_limit(struct regulator_dev *rdev, 106 int min_ua, int max_ua) 107{ 108 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 109 const struct da9062_regulator_info *rinfo = regl->info; 110 int n, tval; 111 112 for (n = 0; n < rinfo->n_current_limits; n++) { 113 tval = rinfo->current_limits[n]; 114 if (tval >= min_ua && tval <= max_ua) 115 return regmap_field_write(regl->ilimit, n); 116 } 117 118 return -EINVAL; 119} 120 121static int da9062_get_current_limit(struct regulator_dev *rdev) 122{ 123 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 124 const struct da9062_regulator_info *rinfo = regl->info; 125 unsigned int sel; 126 int ret; 127 128 ret = regmap_field_read(regl->ilimit, &sel); 129 if (ret < 0) 130 return ret; 131 132 if (sel >= rinfo->n_current_limits) 133 sel = rinfo->n_current_limits - 1; 134 135 return rinfo->current_limits[sel]; 136} 137 138static int da9062_buck_set_mode(struct regulator_dev *rdev, unsigned mode) 139{ 140 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 141 unsigned val; 142 143 switch (mode) { 144 case REGULATOR_MODE_FAST: 145 val = BUCK_MODE_SYNC; 146 break; 147 case REGULATOR_MODE_NORMAL: 148 val = BUCK_MODE_AUTO; 149 break; 150 case REGULATOR_MODE_STANDBY: 151 val = BUCK_MODE_SLEEP; 152 break; 153 default: 154 return -EINVAL; 155 } 156 157 return regmap_field_write(regl->mode, val); 158} 159 160/* 161 * Bucks use single mode register field for normal operation 162 * and suspend state. 163 * There are 3 modes to map to: FAST, NORMAL, and STANDBY. 164 */ 165 166static unsigned da9062_buck_get_mode(struct regulator_dev *rdev) 167{ 168 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 169 struct regmap_field *field; 170 unsigned int val, mode = 0; 171 int ret; 172 173 ret = regmap_field_read(regl->mode, &val); 174 if (ret < 0) 175 return ret; 176 177 switch (val) { 178 default: 179 case BUCK_MODE_MANUAL: 180 mode = REGULATOR_MODE_FAST | REGULATOR_MODE_STANDBY; 181 /* Sleep flag bit decides the mode */ 182 break; 183 case BUCK_MODE_SLEEP: 184 return REGULATOR_MODE_STANDBY; 185 case BUCK_MODE_SYNC: 186 return REGULATOR_MODE_FAST; 187 case BUCK_MODE_AUTO: 188 return REGULATOR_MODE_NORMAL; 189 } 190 191 /* Detect current regulator state */ 192 ret = regmap_field_read(regl->suspend, &val); 193 if (ret < 0) 194 return 0; 195 196 /* Read regulator mode from proper register, depending on state */ 197 if (val) 198 field = regl->suspend_sleep; 199 else 200 field = regl->sleep; 201 202 ret = regmap_field_read(field, &val); 203 if (ret < 0) 204 return 0; 205 206 if (val) 207 mode &= REGULATOR_MODE_STANDBY; 208 else 209 mode &= REGULATOR_MODE_NORMAL | REGULATOR_MODE_FAST; 210 211 return mode; 212} 213 214/* 215 * LDOs use sleep flags - one for normal and one for suspend state. 216 * There are 2 modes to map to: NORMAL and STANDBY (sleep) for each state. 217 */ 218 219static int da9062_ldo_set_mode(struct regulator_dev *rdev, unsigned mode) 220{ 221 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 222 unsigned val; 223 224 switch (mode) { 225 case REGULATOR_MODE_NORMAL: 226 val = 0; 227 break; 228 case REGULATOR_MODE_STANDBY: 229 val = 1; 230 break; 231 default: 232 return -EINVAL; 233 } 234 235 return regmap_field_write(regl->sleep, val); 236} 237 238static unsigned da9062_ldo_get_mode(struct regulator_dev *rdev) 239{ 240 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 241 struct regmap_field *field; 242 int ret, val; 243 244 /* Detect current regulator state */ 245 ret = regmap_field_read(regl->suspend, &val); 246 if (ret < 0) 247 return 0; 248 249 /* Read regulator mode from proper register, depending on state */ 250 if (val) 251 field = regl->suspend_sleep; 252 else 253 field = regl->sleep; 254 255 ret = regmap_field_read(field, &val); 256 if (ret < 0) 257 return 0; 258 259 if (val) 260 return REGULATOR_MODE_STANDBY; 261 else 262 return REGULATOR_MODE_NORMAL; 263} 264 265static int da9062_buck_get_status(struct regulator_dev *rdev) 266{ 267 int ret = regulator_is_enabled_regmap(rdev); 268 269 if (ret == 0) { 270 ret = REGULATOR_STATUS_OFF; 271 } else if (ret > 0) { 272 ret = da9062_buck_get_mode(rdev); 273 if (ret > 0) 274 ret = regulator_mode_to_status(ret); 275 else if (ret == 0) 276 ret = -EIO; 277 } 278 279 return ret; 280} 281 282static int da9062_ldo_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_ldo_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 299static int da9062_set_suspend_voltage(struct regulator_dev *rdev, int uv) 300{ 301 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 302 const struct da9062_regulator_info *rinfo = regl->info; 303 int ret, sel; 304 305 sel = regulator_map_voltage_linear(rdev, uv, uv); 306 if (sel < 0) 307 return sel; 308 309 sel <<= ffs(rdev->desc->vsel_mask) - 1; 310 311 ret = regmap_update_bits(regl->hw->regmap, rinfo->suspend_vsel_reg, 312 rdev->desc->vsel_mask, sel); 313 314 return ret; 315} 316 317static int da9062_suspend_enable(struct regulator_dev *rdev) 318{ 319 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 320 321 return regmap_field_write(regl->suspend, 1); 322} 323 324static int da9062_suspend_disable(struct regulator_dev *rdev) 325{ 326 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 327 328 return regmap_field_write(regl->suspend, 0); 329} 330 331static int da9062_buck_set_suspend_mode(struct regulator_dev *rdev, 332 unsigned mode) 333{ 334 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 335 int val; 336 337 switch (mode) { 338 case REGULATOR_MODE_FAST: 339 val = BUCK_MODE_SYNC; 340 break; 341 case REGULATOR_MODE_NORMAL: 342 val = BUCK_MODE_AUTO; 343 break; 344 case REGULATOR_MODE_STANDBY: 345 val = BUCK_MODE_SLEEP; 346 break; 347 default: 348 return -EINVAL; 349 } 350 351 return regmap_field_write(regl->mode, val); 352} 353 354static int da9062_ldo_set_suspend_mode(struct regulator_dev *rdev, 355 unsigned mode) 356{ 357 struct da9062_regulator *regl = rdev_get_drvdata(rdev); 358 unsigned val; 359 360 switch (mode) { 361 case REGULATOR_MODE_NORMAL: 362 val = 0; 363 break; 364 case REGULATOR_MODE_STANDBY: 365 val = 1; 366 break; 367 default: 368 return -EINVAL; 369 } 370 371 return regmap_field_write(regl->suspend_sleep, val); 372} 373 374static struct regulator_ops da9062_buck_ops = { 375 .enable = regulator_enable_regmap, 376 .disable = regulator_disable_regmap, 377 .is_enabled = regulator_is_enabled_regmap, 378 .get_voltage_sel = regulator_get_voltage_sel_regmap, 379 .set_voltage_sel = regulator_set_voltage_sel_regmap, 380 .list_voltage = regulator_list_voltage_linear, 381 .set_current_limit = da9062_set_current_limit, 382 .get_current_limit = da9062_get_current_limit, 383 .set_mode = da9062_buck_set_mode, 384 .get_mode = da9062_buck_get_mode, 385 .get_status = da9062_buck_get_status, 386 .set_suspend_voltage = da9062_set_suspend_voltage, 387 .set_suspend_enable = da9062_suspend_enable, 388 .set_suspend_disable = da9062_suspend_disable, 389 .set_suspend_mode = da9062_buck_set_suspend_mode, 390}; 391 392static struct regulator_ops da9062_ldo_ops = { 393 .enable = regulator_enable_regmap, 394 .disable = regulator_disable_regmap, 395 .is_enabled = regulator_is_enabled_regmap, 396 .get_voltage_sel = regulator_get_voltage_sel_regmap, 397 .set_voltage_sel = regulator_set_voltage_sel_regmap, 398 .list_voltage = regulator_list_voltage_linear, 399 .set_mode = da9062_ldo_set_mode, 400 .get_mode = da9062_ldo_get_mode, 401 .get_status = da9062_ldo_get_status, 402 .set_suspend_voltage = da9062_set_suspend_voltage, 403 .set_suspend_enable = da9062_suspend_enable, 404 .set_suspend_disable = da9062_suspend_disable, 405 .set_suspend_mode = da9062_ldo_set_suspend_mode, 406}; 407 408/* Regulator information */ 409static const struct da9062_regulator_info local_regulator_info[] = { 410 { 411 .desc.id = DA9062_ID_BUCK1, 412 .desc.name = "DA9062 BUCK1", 413 .desc.of_match = of_match_ptr("buck1"), 414 .desc.regulators_node = of_match_ptr("regulators"), 415 .desc.ops = &da9062_buck_ops, 416 .desc.min_uV = (300) * 1000, 417 .desc.uV_step = (10) * 1000, 418 .desc.n_voltages = ((1570) - (300))/(10) + 1, 419 .current_limits = da9062_buck_a_limits, 420 .n_current_limits = ARRAY_SIZE(da9062_buck_a_limits), 421 .desc.enable_reg = DA9062AA_BUCK1_CONT, 422 .desc.enable_mask = DA9062AA_BUCK1_EN_MASK, 423 .desc.vsel_reg = DA9062AA_VBUCK1_A, 424 .desc.vsel_mask = DA9062AA_VBUCK1_A_MASK, 425 .desc.linear_min_sel = 0, 426 .sleep = REG_FIELD(DA9062AA_VBUCK1_A, 427 __builtin_ffs((int)DA9062AA_BUCK1_SL_A_MASK) - 1, 428 sizeof(unsigned int) * 8 - 429 __builtin_clz((DA9062AA_BUCK1_SL_A_MASK)) - 1), 430 .suspend_sleep = REG_FIELD(DA9062AA_VBUCK1_B, 431 __builtin_ffs((int)DA9062AA_BUCK1_SL_B_MASK) - 1, 432 sizeof(unsigned int) * 8 - 433 __builtin_clz((DA9062AA_BUCK1_SL_B_MASK)) - 1), 434 .suspend_vsel_reg = DA9062AA_VBUCK1_B, 435 .mode = REG_FIELD(DA9062AA_BUCK1_CFG, 436 __builtin_ffs((int)DA9062AA_BUCK1_MODE_MASK) - 1, 437 sizeof(unsigned int) * 8 - 438 __builtin_clz((DA9062AA_BUCK1_MODE_MASK)) - 1), 439 .suspend = REG_FIELD(DA9062AA_DVC_1, 440 __builtin_ffs((int)DA9062AA_VBUCK1_SEL_MASK) - 1, 441 sizeof(unsigned int) * 8 - 442 __builtin_clz((DA9062AA_VBUCK1_SEL_MASK)) - 1), 443 .ilimit = REG_FIELD(DA9062AA_BUCK_ILIM_C, 444 __builtin_ffs((int)DA9062AA_BUCK1_ILIM_MASK) - 1, 445 sizeof(unsigned int) * 8 - 446 __builtin_clz((DA9062AA_BUCK1_ILIM_MASK)) - 1), 447 }, 448 { 449 .desc.id = DA9062_ID_BUCK2, 450 .desc.name = "DA9062 BUCK2", 451 .desc.of_match = of_match_ptr("buck2"), 452 .desc.regulators_node = of_match_ptr("regulators"), 453 .desc.ops = &da9062_buck_ops, 454 .desc.min_uV = (300) * 1000, 455 .desc.uV_step = (10) * 1000, 456 .desc.n_voltages = ((1570) - (300))/(10) + 1, 457 .current_limits = da9062_buck_a_limits, 458 .n_current_limits = ARRAY_SIZE(da9062_buck_a_limits), 459 .desc.enable_reg = DA9062AA_BUCK2_CONT, 460 .desc.enable_mask = DA9062AA_BUCK2_EN_MASK, 461 .desc.vsel_reg = DA9062AA_VBUCK2_A, 462 .desc.vsel_mask = DA9062AA_VBUCK2_A_MASK, 463 .desc.linear_min_sel = 0, 464 .sleep = REG_FIELD(DA9062AA_VBUCK2_A, 465 __builtin_ffs((int)DA9062AA_BUCK2_SL_A_MASK) - 1, 466 sizeof(unsigned int) * 8 - 467 __builtin_clz((DA9062AA_BUCK2_SL_A_MASK)) - 1), 468 .suspend_sleep = REG_FIELD(DA9062AA_VBUCK2_B, 469 __builtin_ffs((int)DA9062AA_BUCK2_SL_B_MASK) - 1, 470 sizeof(unsigned int) * 8 - 471 __builtin_clz((DA9062AA_BUCK2_SL_B_MASK)) - 1), 472 .suspend_vsel_reg = DA9062AA_VBUCK2_B, 473 .mode = REG_FIELD(DA9062AA_BUCK2_CFG, 474 __builtin_ffs((int)DA9062AA_BUCK2_MODE_MASK) - 1, 475 sizeof(unsigned int) * 8 - 476 __builtin_clz((DA9062AA_BUCK2_MODE_MASK)) - 1), 477 .suspend = REG_FIELD(DA9062AA_DVC_1, 478 __builtin_ffs((int)DA9062AA_VBUCK2_SEL_MASK) - 1, 479 sizeof(unsigned int) * 8 - 480 __builtin_clz((DA9062AA_VBUCK2_SEL_MASK)) - 1), 481 .ilimit = REG_FIELD(DA9062AA_BUCK_ILIM_C, 482 __builtin_ffs((int)DA9062AA_BUCK2_ILIM_MASK) - 1, 483 sizeof(unsigned int) * 8 - 484 __builtin_clz((DA9062AA_BUCK2_ILIM_MASK)) - 1), 485 }, 486 { 487 .desc.id = DA9062_ID_BUCK3, 488 .desc.name = "DA9062 BUCK3", 489 .desc.of_match = of_match_ptr("buck3"), 490 .desc.regulators_node = of_match_ptr("regulators"), 491 .desc.ops = &da9062_buck_ops, 492 .desc.min_uV = (800) * 1000, 493 .desc.uV_step = (20) * 1000, 494 .desc.n_voltages = ((3340) - (800))/(20) + 1, 495 .current_limits = da9062_buck_b_limits, 496 .n_current_limits = ARRAY_SIZE(da9062_buck_b_limits), 497 .desc.enable_reg = DA9062AA_BUCK3_CONT, 498 .desc.enable_mask = DA9062AA_BUCK3_EN_MASK, 499 .desc.vsel_reg = DA9062AA_VBUCK3_A, 500 .desc.vsel_mask = DA9062AA_VBUCK3_A_MASK, 501 .desc.linear_min_sel = 0, 502 .sleep = REG_FIELD(DA9062AA_VBUCK3_A, 503 __builtin_ffs((int)DA9062AA_BUCK3_SL_A_MASK) - 1, 504 sizeof(unsigned int) * 8 - 505 __builtin_clz((DA9062AA_BUCK3_SL_A_MASK)) - 1), 506 .suspend_sleep = REG_FIELD(DA9062AA_VBUCK3_B, 507 __builtin_ffs((int)DA9062AA_BUCK3_SL_B_MASK) - 1, 508 sizeof(unsigned int) * 8 - 509 __builtin_clz((DA9062AA_BUCK3_SL_B_MASK)) - 1), 510 .suspend_vsel_reg = DA9062AA_VBUCK3_B, 511 .mode = REG_FIELD(DA9062AA_BUCK3_CFG, 512 __builtin_ffs((int)DA9062AA_BUCK3_MODE_MASK) - 1, 513 sizeof(unsigned int) * 8 - 514 __builtin_clz((DA9062AA_BUCK3_MODE_MASK)) - 1), 515 .suspend = REG_FIELD(DA9062AA_DVC_1, 516 __builtin_ffs((int)DA9062AA_VBUCK3_SEL_MASK) - 1, 517 sizeof(unsigned int) * 8 - 518 __builtin_clz((DA9062AA_VBUCK3_SEL_MASK)) - 1), 519 .ilimit = REG_FIELD(DA9062AA_BUCK_ILIM_A, 520 __builtin_ffs((int)DA9062AA_BUCK3_ILIM_MASK) - 1, 521 sizeof(unsigned int) * 8 - 522 __builtin_clz((DA9062AA_BUCK3_ILIM_MASK)) - 1), 523 }, 524 { 525 .desc.id = DA9062_ID_BUCK4, 526 .desc.name = "DA9062 BUCK4", 527 .desc.of_match = of_match_ptr("buck4"), 528 .desc.regulators_node = of_match_ptr("regulators"), 529 .desc.ops = &da9062_buck_ops, 530 .desc.min_uV = (530) * 1000, 531 .desc.uV_step = (10) * 1000, 532 .desc.n_voltages = ((1800) - (530))/(10) + 1, 533 .current_limits = da9062_buck_a_limits, 534 .n_current_limits = ARRAY_SIZE(da9062_buck_a_limits), 535 .desc.enable_reg = DA9062AA_BUCK4_CONT, 536 .desc.enable_mask = DA9062AA_BUCK4_EN_MASK, 537 .desc.vsel_reg = DA9062AA_VBUCK4_A, 538 .desc.vsel_mask = DA9062AA_VBUCK4_A_MASK, 539 .desc.linear_min_sel = 0, 540 .sleep = REG_FIELD(DA9062AA_VBUCK4_A, 541 __builtin_ffs((int)DA9062AA_BUCK4_SL_A_MASK) - 1, 542 sizeof(unsigned int) * 8 - 543 __builtin_clz((DA9062AA_BUCK4_SL_A_MASK)) - 1), 544 .suspend_sleep = REG_FIELD(DA9062AA_VBUCK4_B, 545 __builtin_ffs((int)DA9062AA_BUCK4_SL_B_MASK) - 1, 546 sizeof(unsigned int) * 8 - 547 __builtin_clz((DA9062AA_BUCK4_SL_B_MASK)) - 1), 548 .suspend_vsel_reg = DA9062AA_VBUCK4_B, 549 .mode = REG_FIELD(DA9062AA_BUCK4_CFG, 550 __builtin_ffs((int)DA9062AA_BUCK4_MODE_MASK) - 1, 551 sizeof(unsigned int) * 8 - 552 __builtin_clz((DA9062AA_BUCK4_MODE_MASK)) - 1), 553 .suspend = REG_FIELD(DA9062AA_DVC_1, 554 __builtin_ffs((int)DA9062AA_VBUCK4_SEL_MASK) - 1, 555 sizeof(unsigned int) * 8 - 556 __builtin_clz((DA9062AA_VBUCK4_SEL_MASK)) - 1), 557 .ilimit = REG_FIELD(DA9062AA_BUCK_ILIM_B, 558 __builtin_ffs((int)DA9062AA_BUCK4_ILIM_MASK) - 1, 559 sizeof(unsigned int) * 8 - 560 __builtin_clz((DA9062AA_BUCK4_ILIM_MASK)) - 1), 561 }, 562 { 563 .desc.id = DA9062_ID_LDO1, 564 .desc.name = "DA9062 LDO1", 565 .desc.of_match = of_match_ptr("ldo1"), 566 .desc.regulators_node = of_match_ptr("regulators"), 567 .desc.ops = &da9062_ldo_ops, 568 .desc.min_uV = (900) * 1000, 569 .desc.uV_step = (50) * 1000, 570 .desc.n_voltages = ((3600) - (900))/(50) + 1, 571 .desc.enable_reg = DA9062AA_LDO1_CONT, 572 .desc.enable_mask = DA9062AA_LDO1_EN_MASK, 573 .desc.vsel_reg = DA9062AA_VLDO1_A, 574 .desc.vsel_mask = DA9062AA_VLDO1_A_MASK, 575 .desc.linear_min_sel = 0, 576 .sleep = REG_FIELD(DA9062AA_VLDO1_A, 577 __builtin_ffs((int)DA9062AA_LDO1_SL_A_MASK) - 1, 578 sizeof(unsigned int) * 8 - 579 __builtin_clz((DA9062AA_LDO1_SL_A_MASK)) - 1), 580 .suspend_sleep = REG_FIELD(DA9062AA_VLDO1_B, 581 __builtin_ffs((int)DA9062AA_LDO1_SL_B_MASK) - 1, 582 sizeof(unsigned int) * 8 - 583 __builtin_clz((DA9062AA_LDO1_SL_B_MASK)) - 1), 584 .suspend_vsel_reg = DA9062AA_VLDO1_B, 585 .suspend = REG_FIELD(DA9062AA_DVC_1, 586 __builtin_ffs((int)DA9062AA_VLDO1_SEL_MASK) - 1, 587 sizeof(unsigned int) * 8 - 588 __builtin_clz((DA9062AA_VLDO1_SEL_MASK)) - 1), 589 .oc_event = REG_FIELD(DA9062AA_STATUS_D, 590 __builtin_ffs((int)DA9062AA_LDO1_ILIM_MASK) - 1, 591 sizeof(unsigned int) * 8 - 592 __builtin_clz((DA9062AA_LDO1_ILIM_MASK)) - 1), 593 }, 594 { 595 .desc.id = DA9062_ID_LDO2, 596 .desc.name = "DA9062 LDO2", 597 .desc.of_match = of_match_ptr("ldo2"), 598 .desc.regulators_node = of_match_ptr("regulators"), 599 .desc.ops = &da9062_ldo_ops, 600 .desc.min_uV = (900) * 1000, 601 .desc.uV_step = (50) * 1000, 602 .desc.n_voltages = ((3600) - (600))/(50) + 1, 603 .desc.enable_reg = DA9062AA_LDO2_CONT, 604 .desc.enable_mask = DA9062AA_LDO2_EN_MASK, 605 .desc.vsel_reg = DA9062AA_VLDO2_A, 606 .desc.vsel_mask = DA9062AA_VLDO2_A_MASK, 607 .desc.linear_min_sel = 0, 608 .sleep = REG_FIELD(DA9062AA_VLDO2_A, 609 __builtin_ffs((int)DA9062AA_LDO2_SL_A_MASK) - 1, 610 sizeof(unsigned int) * 8 - 611 __builtin_clz((DA9062AA_LDO2_SL_A_MASK)) - 1), 612 .suspend_sleep = REG_FIELD(DA9062AA_VLDO2_B, 613 __builtin_ffs((int)DA9062AA_LDO2_SL_B_MASK) - 1, 614 sizeof(unsigned int) * 8 - 615 __builtin_clz((DA9062AA_LDO2_SL_B_MASK)) - 1), 616 .suspend_vsel_reg = DA9062AA_VLDO2_B, 617 .suspend = REG_FIELD(DA9062AA_DVC_1, 618 __builtin_ffs((int)DA9062AA_VLDO2_SEL_MASK) - 1, 619 sizeof(unsigned int) * 8 - 620 __builtin_clz((DA9062AA_VLDO2_SEL_MASK)) - 1), 621 .oc_event = REG_FIELD(DA9062AA_STATUS_D, 622 __builtin_ffs((int)DA9062AA_LDO2_ILIM_MASK) - 1, 623 sizeof(unsigned int) * 8 - 624 __builtin_clz((DA9062AA_LDO2_ILIM_MASK)) - 1), 625 }, 626 { 627 .desc.id = DA9062_ID_LDO3, 628 .desc.name = "DA9062 LDO3", 629 .desc.of_match = of_match_ptr("ldo3"), 630 .desc.regulators_node = of_match_ptr("regulators"), 631 .desc.ops = &da9062_ldo_ops, 632 .desc.min_uV = (900) * 1000, 633 .desc.uV_step = (50) * 1000, 634 .desc.n_voltages = ((3600) - (900))/(50) + 1, 635 .desc.enable_reg = DA9062AA_LDO3_CONT, 636 .desc.enable_mask = DA9062AA_LDO3_EN_MASK, 637 .desc.vsel_reg = DA9062AA_VLDO3_A, 638 .desc.vsel_mask = DA9062AA_VLDO3_A_MASK, 639 .desc.linear_min_sel = 0, 640 .sleep = REG_FIELD(DA9062AA_VLDO3_A, 641 __builtin_ffs((int)DA9062AA_LDO3_SL_A_MASK) - 1, 642 sizeof(unsigned int) * 8 - 643 __builtin_clz((DA9062AA_LDO3_SL_A_MASK)) - 1), 644 .suspend_sleep = REG_FIELD(DA9062AA_VLDO3_B, 645 __builtin_ffs((int)DA9062AA_LDO3_SL_B_MASK) - 1, 646 sizeof(unsigned int) * 8 - 647 __builtin_clz((DA9062AA_LDO3_SL_B_MASK)) - 1), 648 .suspend_vsel_reg = DA9062AA_VLDO3_B, 649 .suspend = REG_FIELD(DA9062AA_DVC_1, 650 __builtin_ffs((int)DA9062AA_VLDO3_SEL_MASK) - 1, 651 sizeof(unsigned int) * 8 - 652 __builtin_clz((DA9062AA_VLDO3_SEL_MASK)) - 1), 653 .oc_event = REG_FIELD(DA9062AA_STATUS_D, 654 __builtin_ffs((int)DA9062AA_LDO3_ILIM_MASK) - 1, 655 sizeof(unsigned int) * 8 - 656 __builtin_clz((DA9062AA_LDO3_ILIM_MASK)) - 1), 657 }, 658 { 659 .desc.id = DA9062_ID_LDO4, 660 .desc.name = "DA9062 LDO4", 661 .desc.of_match = of_match_ptr("ldo4"), 662 .desc.regulators_node = of_match_ptr("regulators"), 663 .desc.ops = &da9062_ldo_ops, 664 .desc.min_uV = (900) * 1000, 665 .desc.uV_step = (50) * 1000, 666 .desc.n_voltages = ((3600) - (900))/(50) + 1, 667 .desc.enable_reg = DA9062AA_LDO4_CONT, 668 .desc.enable_mask = DA9062AA_LDO4_EN_MASK, 669 .desc.vsel_reg = DA9062AA_VLDO4_A, 670 .desc.vsel_mask = DA9062AA_VLDO4_A_MASK, 671 .desc.linear_min_sel = 0, 672 .sleep = REG_FIELD(DA9062AA_VLDO4_A, 673 __builtin_ffs((int)DA9062AA_LDO4_SL_A_MASK) - 1, 674 sizeof(unsigned int) * 8 - 675 __builtin_clz((DA9062AA_LDO4_SL_A_MASK)) - 1), 676 .suspend_sleep = REG_FIELD(DA9062AA_VLDO4_B, 677 __builtin_ffs((int)DA9062AA_LDO4_SL_B_MASK) - 1, 678 sizeof(unsigned int) * 8 - 679 __builtin_clz((DA9062AA_LDO4_SL_B_MASK)) - 1), 680 .suspend_vsel_reg = DA9062AA_VLDO4_B, 681 .suspend = REG_FIELD(DA9062AA_DVC_1, 682 __builtin_ffs((int)DA9062AA_VLDO4_SEL_MASK) - 1, 683 sizeof(unsigned int) * 8 - 684 __builtin_clz((DA9062AA_VLDO4_SEL_MASK)) - 1), 685 .oc_event = REG_FIELD(DA9062AA_STATUS_D, 686 __builtin_ffs((int)DA9062AA_LDO4_ILIM_MASK) - 1, 687 sizeof(unsigned int) * 8 - 688 __builtin_clz((DA9062AA_LDO4_ILIM_MASK)) - 1), 689 }, 690}; 691 692/* Regulator interrupt handlers */ 693static irqreturn_t da9062_ldo_lim_event(int irq, void *data) 694{ 695 struct da9062_regulators *regulators = data; 696 struct da9062 *hw = regulators->regulator[0].hw; 697 struct da9062_regulator *regl; 698 int handled = IRQ_NONE; 699 int bits, i, ret; 700 701 ret = regmap_read(hw->regmap, DA9062AA_STATUS_D, &bits); 702 if (ret < 0) { 703 dev_err(hw->dev, 704 "Failed to read LDO overcurrent indicator\n"); 705 goto ldo_lim_error; 706 } 707 708 for (i = regulators->n_regulators - 1; i >= 0; i--) { 709 regl = ®ulators->regulator[i]; 710 if (regl->info->oc_event.reg != DA9062AA_STATUS_D) 711 continue; 712 713 if (BIT(regl->info->oc_event.lsb) & bits) { 714 regulator_notifier_call_chain(regl->rdev, 715 REGULATOR_EVENT_OVER_CURRENT, NULL); 716 handled = IRQ_HANDLED; 717 } 718 } 719 720ldo_lim_error: 721 return handled; 722} 723 724static int da9062_regulator_probe(struct platform_device *pdev) 725{ 726 struct da9062 *chip = dev_get_drvdata(pdev->dev.parent); 727 struct da9062_regulators *regulators; 728 struct da9062_regulator *regl; 729 struct regulator_config config = { }; 730 int irq, n, ret; 731 size_t size; 732 733 /* Allocate memory required by usable regulators */ 734 size = sizeof(struct da9062_regulators) + 735 DA9062_MAX_REGULATORS * sizeof(struct da9062_regulator); 736 regulators = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); 737 if (!regulators) 738 return -ENOMEM; 739 740 regulators->n_regulators = DA9062_MAX_REGULATORS; 741 platform_set_drvdata(pdev, regulators); 742 743 n = 0; 744 while (n < regulators->n_regulators) { 745 /* Initialise regulator structure */ 746 regl = ®ulators->regulator[n]; 747 regl->hw = chip; 748 regl->info = &local_regulator_info[n]; 749 regl->desc = regl->info->desc; 750 regl->desc.type = REGULATOR_VOLTAGE; 751 regl->desc.owner = THIS_MODULE; 752 753 if (regl->info->mode.reg) 754 regl->mode = devm_regmap_field_alloc( 755 &pdev->dev, 756 chip->regmap, 757 regl->info->mode); 758 if (regl->info->suspend.reg) 759 regl->suspend = devm_regmap_field_alloc( 760 &pdev->dev, 761 chip->regmap, 762 regl->info->suspend); 763 if (regl->info->sleep.reg) 764 regl->sleep = devm_regmap_field_alloc( 765 &pdev->dev, 766 chip->regmap, 767 regl->info->sleep); 768 if (regl->info->suspend_sleep.reg) 769 regl->suspend_sleep = devm_regmap_field_alloc( 770 &pdev->dev, 771 chip->regmap, 772 regl->info->suspend_sleep); 773 if (regl->info->ilimit.reg) 774 regl->ilimit = devm_regmap_field_alloc( 775 &pdev->dev, 776 chip->regmap, 777 regl->info->ilimit); 778 779 /* Register regulator */ 780 memset(&config, 0, sizeof(config)); 781 config.dev = chip->dev; 782 config.driver_data = regl; 783 config.regmap = chip->regmap; 784 785 regl->rdev = devm_regulator_register(&pdev->dev, ®l->desc, 786 &config); 787 if (IS_ERR(regl->rdev)) { 788 dev_err(&pdev->dev, 789 "Failed to register %s regulator\n", 790 regl->desc.name); 791 return PTR_ERR(regl->rdev); 792 } 793 794 n++; 795 } 796 797 /* LDOs overcurrent event support */ 798 irq = platform_get_irq_byname(pdev, "LDO_LIM"); 799 if (irq < 0) { 800 dev_err(&pdev->dev, "Failed to get IRQ.\n"); 801 return irq; 802 } 803 regulators->irq_ldo_lim = irq; 804 805 ret = devm_request_threaded_irq(&pdev->dev, irq, 806 NULL, da9062_ldo_lim_event, 807 IRQF_TRIGGER_LOW | IRQF_ONESHOT, 808 "LDO_LIM", regulators); 809 if (ret) { 810 dev_warn(&pdev->dev, 811 "Failed to request LDO_LIM IRQ.\n"); 812 regulators->irq_ldo_lim = -ENXIO; 813 } 814 815 return 0; 816} 817 818static struct platform_driver da9062_regulator_driver = { 819 .driver = { 820 .name = "da9062-regulators", 821 }, 822 .probe = da9062_regulator_probe, 823}; 824 825static int __init da9062_regulator_init(void) 826{ 827 return platform_driver_register(&da9062_regulator_driver); 828} 829subsys_initcall(da9062_regulator_init); 830 831static void __exit da9062_regulator_cleanup(void) 832{ 833 platform_driver_unregister(&da9062_regulator_driver); 834} 835module_exit(da9062_regulator_cleanup); 836 837/* Module information */ 838MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>"); 839MODULE_DESCRIPTION("REGULATOR device driver for Dialog DA9062"); 840MODULE_LICENSE("GPL"); 841MODULE_ALIAS("platform:da9062-regulators"); 842