1 /* 2 * wm831x-ldo.c -- LDO driver for the WM831x series 3 * 4 * Copyright 2009 Wolfson Microelectronics PLC. 5 * 6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 */ 13 14 #include <linux/module.h> 15 #include <linux/moduleparam.h> 16 #include <linux/init.h> 17 #include <linux/bitops.h> 18 #include <linux/err.h> 19 #include <linux/i2c.h> 20 #include <linux/platform_device.h> 21 #include <linux/regulator/driver.h> 22 #include <linux/slab.h> 23 24 #include <linux/mfd/wm831x/core.h> 25 #include <linux/mfd/wm831x/regulator.h> 26 #include <linux/mfd/wm831x/pdata.h> 27 28 #define WM831X_LDO_MAX_NAME 6 29 30 #define WM831X_LDO_CONTROL 0 31 #define WM831X_LDO_ON_CONTROL 1 32 #define WM831X_LDO_SLEEP_CONTROL 2 33 34 #define WM831X_ALIVE_LDO_ON_CONTROL 0 35 #define WM831X_ALIVE_LDO_SLEEP_CONTROL 1 36 37 struct wm831x_ldo { 38 char name[WM831X_LDO_MAX_NAME]; 39 struct regulator_desc desc; 40 int base; 41 struct wm831x *wm831x; 42 struct regulator_dev *regulator; 43 }; 44 45 /* 46 * Shared 47 */ 48 49 static int wm831x_ldo_is_enabled(struct regulator_dev *rdev) 50 { 51 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 52 struct wm831x *wm831x = ldo->wm831x; 53 int mask = 1 << rdev_get_id(rdev); 54 int reg; 55 56 reg = wm831x_reg_read(wm831x, WM831X_LDO_ENABLE); 57 if (reg < 0) 58 return reg; 59 60 if (reg & mask) 61 return 1; 62 else 63 return 0; 64 } 65 66 static int wm831x_ldo_enable(struct regulator_dev *rdev) 67 { 68 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 69 struct wm831x *wm831x = ldo->wm831x; 70 int mask = 1 << rdev_get_id(rdev); 71 72 return wm831x_set_bits(wm831x, WM831X_LDO_ENABLE, mask, mask); 73 } 74 75 static int wm831x_ldo_disable(struct regulator_dev *rdev) 76 { 77 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 78 struct wm831x *wm831x = ldo->wm831x; 79 int mask = 1 << rdev_get_id(rdev); 80 81 return wm831x_set_bits(wm831x, WM831X_LDO_ENABLE, mask, 0); 82 } 83 84 static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data) 85 { 86 struct wm831x_ldo *ldo = data; 87 88 regulator_notifier_call_chain(ldo->regulator, 89 REGULATOR_EVENT_UNDER_VOLTAGE, 90 NULL); 91 92 return IRQ_HANDLED; 93 } 94 95 /* 96 * General purpose LDOs 97 */ 98 99 #define WM831X_GP_LDO_SELECTOR_LOW 0xe 100 #define WM831X_GP_LDO_MAX_SELECTOR 0x1f 101 102 static int wm831x_gp_ldo_list_voltage(struct regulator_dev *rdev, 103 unsigned int selector) 104 { 105 /* 0.9-1.6V in 50mV steps */ 106 if (selector <= WM831X_GP_LDO_SELECTOR_LOW) 107 return 900000 + (selector * 50000); 108 /* 1.7-3.3V in 100mV steps */ 109 if (selector <= WM831X_GP_LDO_MAX_SELECTOR) 110 return 1600000 + ((selector - WM831X_GP_LDO_SELECTOR_LOW) 111 * 100000); 112 return -EINVAL; 113 } 114 115 static int wm831x_gp_ldo_set_voltage_int(struct regulator_dev *rdev, int reg, 116 int min_uV, int max_uV, 117 unsigned *selector) 118 { 119 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 120 struct wm831x *wm831x = ldo->wm831x; 121 int vsel, ret; 122 123 if (min_uV < 900000) 124 vsel = 0; 125 else if (min_uV < 1700000) 126 vsel = ((min_uV - 900000) / 50000); 127 else 128 vsel = ((min_uV - 1700000) / 100000) 129 + WM831X_GP_LDO_SELECTOR_LOW + 1; 130 131 ret = wm831x_gp_ldo_list_voltage(rdev, vsel); 132 if (ret < 0) 133 return ret; 134 if (ret < min_uV || ret > max_uV) 135 return -EINVAL; 136 137 *selector = vsel; 138 139 return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, vsel); 140 } 141 142 static int wm831x_gp_ldo_set_voltage(struct regulator_dev *rdev, 143 int min_uV, int max_uV, 144 unsigned *selector) 145 { 146 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 147 int reg = ldo->base + WM831X_LDO_ON_CONTROL; 148 149 return wm831x_gp_ldo_set_voltage_int(rdev, reg, min_uV, max_uV, 150 selector); 151 } 152 153 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev, 154 int uV) 155 { 156 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 157 int reg = ldo->base + WM831X_LDO_SLEEP_CONTROL; 158 unsigned int selector; 159 160 return wm831x_gp_ldo_set_voltage_int(rdev, reg, uV, uV, &selector); 161 } 162 163 static int wm831x_gp_ldo_get_voltage_sel(struct regulator_dev *rdev) 164 { 165 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 166 struct wm831x *wm831x = ldo->wm831x; 167 int reg = ldo->base + WM831X_LDO_ON_CONTROL; 168 int ret; 169 170 ret = wm831x_reg_read(wm831x, reg); 171 if (ret < 0) 172 return ret; 173 174 ret &= WM831X_LDO1_ON_VSEL_MASK; 175 176 return ret; 177 } 178 179 static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev) 180 { 181 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 182 struct wm831x *wm831x = ldo->wm831x; 183 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL; 184 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL; 185 int ret; 186 187 ret = wm831x_reg_read(wm831x, on_reg); 188 if (ret < 0) 189 return ret; 190 191 if (!(ret & WM831X_LDO1_ON_MODE)) 192 return REGULATOR_MODE_NORMAL; 193 194 ret = wm831x_reg_read(wm831x, ctrl_reg); 195 if (ret < 0) 196 return ret; 197 198 if (ret & WM831X_LDO1_LP_MODE) 199 return REGULATOR_MODE_STANDBY; 200 else 201 return REGULATOR_MODE_IDLE; 202 } 203 204 static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev, 205 unsigned int mode) 206 { 207 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 208 struct wm831x *wm831x = ldo->wm831x; 209 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL; 210 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL; 211 int ret; 212 213 214 switch (mode) { 215 case REGULATOR_MODE_NORMAL: 216 ret = wm831x_set_bits(wm831x, on_reg, 217 WM831X_LDO1_ON_MODE, 0); 218 if (ret < 0) 219 return ret; 220 break; 221 222 case REGULATOR_MODE_IDLE: 223 ret = wm831x_set_bits(wm831x, ctrl_reg, 224 WM831X_LDO1_LP_MODE, 0); 225 if (ret < 0) 226 return ret; 227 228 ret = wm831x_set_bits(wm831x, on_reg, 229 WM831X_LDO1_ON_MODE, 230 WM831X_LDO1_ON_MODE); 231 if (ret < 0) 232 return ret; 233 break; 234 235 case REGULATOR_MODE_STANDBY: 236 ret = wm831x_set_bits(wm831x, ctrl_reg, 237 WM831X_LDO1_LP_MODE, 238 WM831X_LDO1_LP_MODE); 239 if (ret < 0) 240 return ret; 241 242 ret = wm831x_set_bits(wm831x, on_reg, 243 WM831X_LDO1_ON_MODE, 244 WM831X_LDO1_ON_MODE); 245 if (ret < 0) 246 return ret; 247 break; 248 249 default: 250 return -EINVAL; 251 } 252 253 return 0; 254 } 255 256 static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev) 257 { 258 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 259 struct wm831x *wm831x = ldo->wm831x; 260 int mask = 1 << rdev_get_id(rdev); 261 int ret; 262 263 /* Is the regulator on? */ 264 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS); 265 if (ret < 0) 266 return ret; 267 if (!(ret & mask)) 268 return REGULATOR_STATUS_OFF; 269 270 /* Is it reporting under voltage? */ 271 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS); 272 if (ret & mask) 273 return REGULATOR_STATUS_ERROR; 274 275 ret = wm831x_gp_ldo_get_mode(rdev); 276 if (ret < 0) 277 return ret; 278 else 279 return regulator_mode_to_status(ret); 280 } 281 282 static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev, 283 int input_uV, 284 int output_uV, int load_uA) 285 { 286 if (load_uA < 20000) 287 return REGULATOR_MODE_STANDBY; 288 if (load_uA < 50000) 289 return REGULATOR_MODE_IDLE; 290 return REGULATOR_MODE_NORMAL; 291 } 292 293 294 static struct regulator_ops wm831x_gp_ldo_ops = { 295 .list_voltage = wm831x_gp_ldo_list_voltage, 296 .get_voltage_sel = wm831x_gp_ldo_get_voltage_sel, 297 .set_voltage = wm831x_gp_ldo_set_voltage, 298 .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage, 299 .get_mode = wm831x_gp_ldo_get_mode, 300 .set_mode = wm831x_gp_ldo_set_mode, 301 .get_status = wm831x_gp_ldo_get_status, 302 .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode, 303 304 .is_enabled = wm831x_ldo_is_enabled, 305 .enable = wm831x_ldo_enable, 306 .disable = wm831x_ldo_disable, 307 }; 308 309 static __devinit int wm831x_gp_ldo_probe(struct platform_device *pdev) 310 { 311 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); 312 struct wm831x_pdata *pdata = wm831x->dev->platform_data; 313 int id; 314 struct wm831x_ldo *ldo; 315 struct resource *res; 316 int ret, irq; 317 318 if (pdata && pdata->wm831x_num) 319 id = (pdata->wm831x_num * 10) + 1; 320 else 321 id = 0; 322 id = pdev->id - id; 323 324 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1); 325 326 if (pdata == NULL || pdata->ldo[id] == NULL) 327 return -ENODEV; 328 329 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL); 330 if (ldo == NULL) { 331 dev_err(&pdev->dev, "Unable to allocate private data\n"); 332 return -ENOMEM; 333 } 334 335 ldo->wm831x = wm831x; 336 337 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 338 if (res == NULL) { 339 dev_err(&pdev->dev, "No I/O resource\n"); 340 ret = -EINVAL; 341 goto err; 342 } 343 ldo->base = res->start; 344 345 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1); 346 ldo->desc.name = ldo->name; 347 ldo->desc.id = id; 348 ldo->desc.type = REGULATOR_VOLTAGE; 349 ldo->desc.n_voltages = WM831X_GP_LDO_MAX_SELECTOR + 1; 350 ldo->desc.ops = &wm831x_gp_ldo_ops; 351 ldo->desc.owner = THIS_MODULE; 352 353 ldo->regulator = regulator_register(&ldo->desc, &pdev->dev, 354 pdata->ldo[id], ldo, NULL); 355 if (IS_ERR(ldo->regulator)) { 356 ret = PTR_ERR(ldo->regulator); 357 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n", 358 id + 1, ret); 359 goto err; 360 } 361 362 irq = platform_get_irq_byname(pdev, "UV"); 363 ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq, 364 IRQF_TRIGGER_RISING, ldo->name, 365 ldo); 366 if (ret != 0) { 367 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n", 368 irq, ret); 369 goto err_regulator; 370 } 371 372 platform_set_drvdata(pdev, ldo); 373 374 return 0; 375 376 err_regulator: 377 regulator_unregister(ldo->regulator); 378 err: 379 return ret; 380 } 381 382 static __devexit int wm831x_gp_ldo_remove(struct platform_device *pdev) 383 { 384 struct wm831x_ldo *ldo = platform_get_drvdata(pdev); 385 386 platform_set_drvdata(pdev, NULL); 387 388 free_irq(platform_get_irq_byname(pdev, "UV"), ldo); 389 regulator_unregister(ldo->regulator); 390 391 return 0; 392 } 393 394 static struct platform_driver wm831x_gp_ldo_driver = { 395 .probe = wm831x_gp_ldo_probe, 396 .remove = __devexit_p(wm831x_gp_ldo_remove), 397 .driver = { 398 .name = "wm831x-ldo", 399 .owner = THIS_MODULE, 400 }, 401 }; 402 403 /* 404 * Analogue LDOs 405 */ 406 407 408 #define WM831X_ALDO_SELECTOR_LOW 0xc 409 #define WM831X_ALDO_MAX_SELECTOR 0x1f 410 411 static int wm831x_aldo_list_voltage(struct regulator_dev *rdev, 412 unsigned int selector) 413 { 414 /* 1-1.6V in 50mV steps */ 415 if (selector <= WM831X_ALDO_SELECTOR_LOW) 416 return 1000000 + (selector * 50000); 417 /* 1.7-3.5V in 100mV steps */ 418 if (selector <= WM831X_ALDO_MAX_SELECTOR) 419 return 1600000 + ((selector - WM831X_ALDO_SELECTOR_LOW) 420 * 100000); 421 return -EINVAL; 422 } 423 424 static int wm831x_aldo_set_voltage_int(struct regulator_dev *rdev, int reg, 425 int min_uV, int max_uV, 426 unsigned *selector) 427 { 428 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 429 struct wm831x *wm831x = ldo->wm831x; 430 int vsel, ret; 431 432 if (min_uV < 1000000) 433 vsel = 0; 434 else if (min_uV < 1700000) 435 vsel = ((min_uV - 1000000) / 50000); 436 else 437 vsel = ((min_uV - 1700000) / 100000) 438 + WM831X_ALDO_SELECTOR_LOW + 1; 439 440 ret = wm831x_aldo_list_voltage(rdev, vsel); 441 if (ret < 0) 442 return ret; 443 if (ret < min_uV || ret > max_uV) 444 return -EINVAL; 445 446 *selector = vsel; 447 448 return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, vsel); 449 } 450 451 static int wm831x_aldo_set_voltage(struct regulator_dev *rdev, 452 int min_uV, int max_uV, unsigned *selector) 453 { 454 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 455 int reg = ldo->base + WM831X_LDO_ON_CONTROL; 456 457 return wm831x_aldo_set_voltage_int(rdev, reg, min_uV, max_uV, 458 selector); 459 } 460 461 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev, 462 int uV) 463 { 464 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 465 int reg = ldo->base + WM831X_LDO_SLEEP_CONTROL; 466 unsigned int selector; 467 468 return wm831x_aldo_set_voltage_int(rdev, reg, uV, uV, &selector); 469 } 470 471 static int wm831x_aldo_get_voltage_sel(struct regulator_dev *rdev) 472 { 473 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 474 struct wm831x *wm831x = ldo->wm831x; 475 int reg = ldo->base + WM831X_LDO_ON_CONTROL; 476 int ret; 477 478 ret = wm831x_reg_read(wm831x, reg); 479 if (ret < 0) 480 return ret; 481 482 ret &= WM831X_LDO7_ON_VSEL_MASK; 483 484 return ret; 485 } 486 487 static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev) 488 { 489 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 490 struct wm831x *wm831x = ldo->wm831x; 491 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL; 492 int ret; 493 494 ret = wm831x_reg_read(wm831x, on_reg); 495 if (ret < 0) 496 return 0; 497 498 if (ret & WM831X_LDO7_ON_MODE) 499 return REGULATOR_MODE_IDLE; 500 else 501 return REGULATOR_MODE_NORMAL; 502 } 503 504 static int wm831x_aldo_set_mode(struct regulator_dev *rdev, 505 unsigned int mode) 506 { 507 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 508 struct wm831x *wm831x = ldo->wm831x; 509 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL; 510 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL; 511 int ret; 512 513 514 switch (mode) { 515 case REGULATOR_MODE_NORMAL: 516 ret = wm831x_set_bits(wm831x, on_reg, 517 WM831X_LDO7_ON_MODE, 0); 518 if (ret < 0) 519 return ret; 520 break; 521 522 case REGULATOR_MODE_IDLE: 523 ret = wm831x_set_bits(wm831x, ctrl_reg, 524 WM831X_LDO7_ON_MODE, 525 WM831X_LDO7_ON_MODE); 526 if (ret < 0) 527 return ret; 528 break; 529 530 default: 531 return -EINVAL; 532 } 533 534 return 0; 535 } 536 537 static int wm831x_aldo_get_status(struct regulator_dev *rdev) 538 { 539 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 540 struct wm831x *wm831x = ldo->wm831x; 541 int mask = 1 << rdev_get_id(rdev); 542 int ret; 543 544 /* Is the regulator on? */ 545 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS); 546 if (ret < 0) 547 return ret; 548 if (!(ret & mask)) 549 return REGULATOR_STATUS_OFF; 550 551 /* Is it reporting under voltage? */ 552 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS); 553 if (ret & mask) 554 return REGULATOR_STATUS_ERROR; 555 556 ret = wm831x_aldo_get_mode(rdev); 557 if (ret < 0) 558 return ret; 559 else 560 return regulator_mode_to_status(ret); 561 } 562 563 static struct regulator_ops wm831x_aldo_ops = { 564 .list_voltage = wm831x_aldo_list_voltage, 565 .get_voltage_sel = wm831x_aldo_get_voltage_sel, 566 .set_voltage = wm831x_aldo_set_voltage, 567 .set_suspend_voltage = wm831x_aldo_set_suspend_voltage, 568 .get_mode = wm831x_aldo_get_mode, 569 .set_mode = wm831x_aldo_set_mode, 570 .get_status = wm831x_aldo_get_status, 571 572 .is_enabled = wm831x_ldo_is_enabled, 573 .enable = wm831x_ldo_enable, 574 .disable = wm831x_ldo_disable, 575 }; 576 577 static __devinit int wm831x_aldo_probe(struct platform_device *pdev) 578 { 579 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); 580 struct wm831x_pdata *pdata = wm831x->dev->platform_data; 581 int id; 582 struct wm831x_ldo *ldo; 583 struct resource *res; 584 int ret, irq; 585 586 if (pdata && pdata->wm831x_num) 587 id = (pdata->wm831x_num * 10) + 1; 588 else 589 id = 0; 590 id = pdev->id - id; 591 592 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1); 593 594 if (pdata == NULL || pdata->ldo[id] == NULL) 595 return -ENODEV; 596 597 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL); 598 if (ldo == NULL) { 599 dev_err(&pdev->dev, "Unable to allocate private data\n"); 600 return -ENOMEM; 601 } 602 603 ldo->wm831x = wm831x; 604 605 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 606 if (res == NULL) { 607 dev_err(&pdev->dev, "No I/O resource\n"); 608 ret = -EINVAL; 609 goto err; 610 } 611 ldo->base = res->start; 612 613 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1); 614 ldo->desc.name = ldo->name; 615 ldo->desc.id = id; 616 ldo->desc.type = REGULATOR_VOLTAGE; 617 ldo->desc.n_voltages = WM831X_ALDO_MAX_SELECTOR + 1; 618 ldo->desc.ops = &wm831x_aldo_ops; 619 ldo->desc.owner = THIS_MODULE; 620 621 ldo->regulator = regulator_register(&ldo->desc, &pdev->dev, 622 pdata->ldo[id], ldo, NULL); 623 if (IS_ERR(ldo->regulator)) { 624 ret = PTR_ERR(ldo->regulator); 625 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n", 626 id + 1, ret); 627 goto err; 628 } 629 630 irq = platform_get_irq_byname(pdev, "UV"); 631 ret = request_threaded_irq(irq, NULL, wm831x_ldo_uv_irq, 632 IRQF_TRIGGER_RISING, ldo->name, ldo); 633 if (ret != 0) { 634 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n", 635 irq, ret); 636 goto err_regulator; 637 } 638 639 platform_set_drvdata(pdev, ldo); 640 641 return 0; 642 643 err_regulator: 644 regulator_unregister(ldo->regulator); 645 err: 646 return ret; 647 } 648 649 static __devexit int wm831x_aldo_remove(struct platform_device *pdev) 650 { 651 struct wm831x_ldo *ldo = platform_get_drvdata(pdev); 652 653 free_irq(platform_get_irq_byname(pdev, "UV"), ldo); 654 regulator_unregister(ldo->regulator); 655 656 return 0; 657 } 658 659 static struct platform_driver wm831x_aldo_driver = { 660 .probe = wm831x_aldo_probe, 661 .remove = __devexit_p(wm831x_aldo_remove), 662 .driver = { 663 .name = "wm831x-aldo", 664 .owner = THIS_MODULE, 665 }, 666 }; 667 668 /* 669 * Alive LDO 670 */ 671 672 #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf 673 674 static int wm831x_alive_ldo_list_voltage(struct regulator_dev *rdev, 675 unsigned int selector) 676 { 677 /* 0.8-1.55V in 50mV steps */ 678 if (selector <= WM831X_ALIVE_LDO_MAX_SELECTOR) 679 return 800000 + (selector * 50000); 680 return -EINVAL; 681 } 682 683 static int wm831x_alive_ldo_set_voltage_int(struct regulator_dev *rdev, 684 int reg, 685 int min_uV, int max_uV, 686 unsigned *selector) 687 { 688 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 689 struct wm831x *wm831x = ldo->wm831x; 690 int vsel, ret; 691 692 vsel = (min_uV - 800000) / 50000; 693 694 ret = wm831x_alive_ldo_list_voltage(rdev, vsel); 695 if (ret < 0) 696 return ret; 697 if (ret < min_uV || ret > max_uV) 698 return -EINVAL; 699 700 *selector = vsel; 701 702 return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, vsel); 703 } 704 705 static int wm831x_alive_ldo_set_voltage(struct regulator_dev *rdev, 706 int min_uV, int max_uV, 707 unsigned *selector) 708 { 709 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 710 int reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL; 711 712 return wm831x_alive_ldo_set_voltage_int(rdev, reg, min_uV, max_uV, 713 selector); 714 } 715 716 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev, 717 int uV) 718 { 719 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 720 int reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL; 721 unsigned selector; 722 723 return wm831x_alive_ldo_set_voltage_int(rdev, reg, uV, uV, &selector); 724 } 725 726 static int wm831x_alive_ldo_get_voltage_sel(struct regulator_dev *rdev) 727 { 728 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 729 struct wm831x *wm831x = ldo->wm831x; 730 int reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL; 731 int ret; 732 733 ret = wm831x_reg_read(wm831x, reg); 734 if (ret < 0) 735 return ret; 736 737 ret &= WM831X_LDO11_ON_VSEL_MASK; 738 739 return ret; 740 } 741 742 static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev) 743 { 744 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 745 struct wm831x *wm831x = ldo->wm831x; 746 int mask = 1 << rdev_get_id(rdev); 747 int ret; 748 749 /* Is the regulator on? */ 750 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS); 751 if (ret < 0) 752 return ret; 753 if (ret & mask) 754 return REGULATOR_STATUS_ON; 755 else 756 return REGULATOR_STATUS_OFF; 757 } 758 759 static struct regulator_ops wm831x_alive_ldo_ops = { 760 .list_voltage = wm831x_alive_ldo_list_voltage, 761 .get_voltage_sel = wm831x_alive_ldo_get_voltage_sel, 762 .set_voltage = wm831x_alive_ldo_set_voltage, 763 .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage, 764 .get_status = wm831x_alive_ldo_get_status, 765 766 .is_enabled = wm831x_ldo_is_enabled, 767 .enable = wm831x_ldo_enable, 768 .disable = wm831x_ldo_disable, 769 }; 770 771 static __devinit int wm831x_alive_ldo_probe(struct platform_device *pdev) 772 { 773 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); 774 struct wm831x_pdata *pdata = wm831x->dev->platform_data; 775 int id; 776 struct wm831x_ldo *ldo; 777 struct resource *res; 778 int ret; 779 780 if (pdata && pdata->wm831x_num) 781 id = (pdata->wm831x_num * 10) + 1; 782 else 783 id = 0; 784 id = pdev->id - id; 785 786 787 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1); 788 789 if (pdata == NULL || pdata->ldo[id] == NULL) 790 return -ENODEV; 791 792 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL); 793 if (ldo == NULL) { 794 dev_err(&pdev->dev, "Unable to allocate private data\n"); 795 return -ENOMEM; 796 } 797 798 ldo->wm831x = wm831x; 799 800 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 801 if (res == NULL) { 802 dev_err(&pdev->dev, "No I/O resource\n"); 803 ret = -EINVAL; 804 goto err; 805 } 806 ldo->base = res->start; 807 808 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1); 809 ldo->desc.name = ldo->name; 810 ldo->desc.id = id; 811 ldo->desc.type = REGULATOR_VOLTAGE; 812 ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1; 813 ldo->desc.ops = &wm831x_alive_ldo_ops; 814 ldo->desc.owner = THIS_MODULE; 815 816 ldo->regulator = regulator_register(&ldo->desc, &pdev->dev, 817 pdata->ldo[id], ldo, NULL); 818 if (IS_ERR(ldo->regulator)) { 819 ret = PTR_ERR(ldo->regulator); 820 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n", 821 id + 1, ret); 822 goto err; 823 } 824 825 platform_set_drvdata(pdev, ldo); 826 827 return 0; 828 829 err: 830 return ret; 831 } 832 833 static __devexit int wm831x_alive_ldo_remove(struct platform_device *pdev) 834 { 835 struct wm831x_ldo *ldo = platform_get_drvdata(pdev); 836 837 regulator_unregister(ldo->regulator); 838 839 return 0; 840 } 841 842 static struct platform_driver wm831x_alive_ldo_driver = { 843 .probe = wm831x_alive_ldo_probe, 844 .remove = __devexit_p(wm831x_alive_ldo_remove), 845 .driver = { 846 .name = "wm831x-alive-ldo", 847 .owner = THIS_MODULE, 848 }, 849 }; 850 851 static int __init wm831x_ldo_init(void) 852 { 853 int ret; 854 855 ret = platform_driver_register(&wm831x_gp_ldo_driver); 856 if (ret != 0) 857 pr_err("Failed to register WM831x GP LDO driver: %d\n", ret); 858 859 ret = platform_driver_register(&wm831x_aldo_driver); 860 if (ret != 0) 861 pr_err("Failed to register WM831x ALDO driver: %d\n", ret); 862 863 ret = platform_driver_register(&wm831x_alive_ldo_driver); 864 if (ret != 0) 865 pr_err("Failed to register WM831x alive LDO driver: %d\n", 866 ret); 867 868 return 0; 869 } 870 subsys_initcall(wm831x_ldo_init); 871 872 static void __exit wm831x_ldo_exit(void) 873 { 874 platform_driver_unregister(&wm831x_alive_ldo_driver); 875 platform_driver_unregister(&wm831x_aldo_driver); 876 platform_driver_unregister(&wm831x_gp_ldo_driver); 877 } 878 module_exit(wm831x_ldo_exit); 879 880 /* Module information */ 881 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 882 MODULE_DESCRIPTION("WM831x LDO driver"); 883 MODULE_LICENSE("GPL"); 884 MODULE_ALIAS("platform:wm831x-ldo"); 885 MODULE_ALIAS("platform:wm831x-aldo"); 886 MODULE_ALIAS("platform:wm831x-aliveldo"); 887