root/drivers/regulator/wm831x-ldo.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. wm831x_ldo_uv_irq
  2. wm831x_gp_ldo_set_suspend_voltage
  3. wm831x_gp_ldo_get_mode
  4. wm831x_gp_ldo_set_mode
  5. wm831x_gp_ldo_get_status
  6. wm831x_gp_ldo_get_optimum_mode
  7. wm831x_gp_ldo_probe
  8. wm831x_aldo_set_suspend_voltage
  9. wm831x_aldo_get_mode
  10. wm831x_aldo_set_mode
  11. wm831x_aldo_get_status
  12. wm831x_aldo_probe
  13. wm831x_alive_ldo_set_suspend_voltage
  14. wm831x_alive_ldo_get_status
  15. wm831x_alive_ldo_probe
  16. wm831x_ldo_init
  17. wm831x_ldo_exit

   1 // SPDX-License-Identifier: GPL-2.0+
   2 //
   3 // wm831x-ldo.c  --  LDO driver for the WM831x series
   4 //
   5 // Copyright 2009 Wolfson Microelectronics PLC.
   6 //
   7 // Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
   8 
   9 #include <linux/module.h>
  10 #include <linux/moduleparam.h>
  11 #include <linux/init.h>
  12 #include <linux/bitops.h>
  13 #include <linux/err.h>
  14 #include <linux/i2c.h>
  15 #include <linux/platform_device.h>
  16 #include <linux/regulator/driver.h>
  17 #include <linux/slab.h>
  18 
  19 #include <linux/mfd/wm831x/core.h>
  20 #include <linux/mfd/wm831x/regulator.h>
  21 #include <linux/mfd/wm831x/pdata.h>
  22 
  23 #define WM831X_LDO_MAX_NAME 9
  24 
  25 #define WM831X_LDO_CONTROL       0
  26 #define WM831X_LDO_ON_CONTROL    1
  27 #define WM831X_LDO_SLEEP_CONTROL 2
  28 
  29 #define WM831X_ALIVE_LDO_ON_CONTROL    0
  30 #define WM831X_ALIVE_LDO_SLEEP_CONTROL 1
  31 
  32 struct wm831x_ldo {
  33         char name[WM831X_LDO_MAX_NAME];
  34         char supply_name[WM831X_LDO_MAX_NAME];
  35         struct regulator_desc desc;
  36         int base;
  37         struct wm831x *wm831x;
  38         struct regulator_dev *regulator;
  39 };
  40 
  41 /*
  42  * Shared
  43  */
  44 
  45 static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data)
  46 {
  47         struct wm831x_ldo *ldo = data;
  48 
  49         regulator_lock(ldo->regulator);
  50         regulator_notifier_call_chain(ldo->regulator,
  51                                       REGULATOR_EVENT_UNDER_VOLTAGE,
  52                                       NULL);
  53         regulator_unlock(ldo->regulator);
  54 
  55         return IRQ_HANDLED;
  56 }
  57 
  58 /*
  59  * General purpose LDOs
  60  */
  61 
  62 static const struct regulator_linear_range wm831x_gp_ldo_ranges[] = {
  63         REGULATOR_LINEAR_RANGE(900000, 0, 14, 50000),
  64         REGULATOR_LINEAR_RANGE(1700000, 15, 31, 100000),
  65 };
  66 
  67 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
  68                                              int uV)
  69 {
  70         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
  71         struct wm831x *wm831x = ldo->wm831x;
  72         int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
  73 
  74         sel = regulator_map_voltage_linear_range(rdev, uV, uV);
  75         if (sel < 0)
  76                 return sel;
  77 
  78         return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
  79 }
  80 
  81 static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
  82 {
  83         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
  84         struct wm831x *wm831x = ldo->wm831x;
  85         int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
  86         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
  87         int ret;
  88 
  89         ret = wm831x_reg_read(wm831x, on_reg);
  90         if (ret < 0)
  91                 return ret;
  92 
  93         if (!(ret & WM831X_LDO1_ON_MODE))
  94                 return REGULATOR_MODE_NORMAL;
  95 
  96         ret = wm831x_reg_read(wm831x, ctrl_reg);
  97         if (ret < 0)
  98                 return ret;
  99 
 100         if (ret & WM831X_LDO1_LP_MODE)
 101                 return REGULATOR_MODE_STANDBY;
 102         else
 103                 return REGULATOR_MODE_IDLE;
 104 }
 105 
 106 static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
 107                                   unsigned int mode)
 108 {
 109         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 110         struct wm831x *wm831x = ldo->wm831x;
 111         int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
 112         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 113         int ret;
 114 
 115 
 116         switch (mode) {
 117         case REGULATOR_MODE_NORMAL:
 118                 ret = wm831x_set_bits(wm831x, on_reg,
 119                                       WM831X_LDO1_ON_MODE, 0);
 120                 if (ret < 0)
 121                         return ret;
 122                 break;
 123 
 124         case REGULATOR_MODE_IDLE:
 125                 ret = wm831x_set_bits(wm831x, ctrl_reg,
 126                                       WM831X_LDO1_LP_MODE, 0);
 127                 if (ret < 0)
 128                         return ret;
 129 
 130                 ret = wm831x_set_bits(wm831x, on_reg,
 131                                       WM831X_LDO1_ON_MODE,
 132                                       WM831X_LDO1_ON_MODE);
 133                 if (ret < 0)
 134                         return ret;
 135                 break;
 136 
 137         case REGULATOR_MODE_STANDBY:
 138                 ret = wm831x_set_bits(wm831x, ctrl_reg,
 139                                       WM831X_LDO1_LP_MODE,
 140                                       WM831X_LDO1_LP_MODE);
 141                 if (ret < 0)
 142                         return ret;
 143 
 144                 ret = wm831x_set_bits(wm831x, on_reg,
 145                                       WM831X_LDO1_ON_MODE,
 146                                       WM831X_LDO1_ON_MODE);
 147                 if (ret < 0)
 148                         return ret;
 149                 break;
 150 
 151         default:
 152                 return -EINVAL;
 153         }
 154 
 155         return 0;
 156 }
 157 
 158 static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
 159 {
 160         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 161         struct wm831x *wm831x = ldo->wm831x;
 162         int mask = 1 << rdev_get_id(rdev);
 163         int ret;
 164 
 165         /* Is the regulator on? */
 166         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
 167         if (ret < 0)
 168                 return ret;
 169         if (!(ret & mask))
 170                 return REGULATOR_STATUS_OFF;
 171 
 172         /* Is it reporting under voltage? */
 173         ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
 174         if (ret < 0)
 175                 return ret;
 176         if (ret & mask)
 177                 return REGULATOR_STATUS_ERROR;
 178 
 179         ret = wm831x_gp_ldo_get_mode(rdev);
 180         if (ret < 0)
 181                 return ret;
 182         else
 183                 return regulator_mode_to_status(ret);
 184 }
 185 
 186 static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
 187                                                    int input_uV,
 188                                                    int output_uV, int load_uA)
 189 {
 190         if (load_uA < 20000)
 191                 return REGULATOR_MODE_STANDBY;
 192         if (load_uA < 50000)
 193                 return REGULATOR_MODE_IDLE;
 194         return REGULATOR_MODE_NORMAL;
 195 }
 196 
 197 
 198 static const struct regulator_ops wm831x_gp_ldo_ops = {
 199         .list_voltage = regulator_list_voltage_linear_range,
 200         .map_voltage = regulator_map_voltage_linear_range,
 201         .get_voltage_sel = regulator_get_voltage_sel_regmap,
 202         .set_voltage_sel = regulator_set_voltage_sel_regmap,
 203         .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
 204         .get_mode = wm831x_gp_ldo_get_mode,
 205         .set_mode = wm831x_gp_ldo_set_mode,
 206         .get_status = wm831x_gp_ldo_get_status,
 207         .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
 208         .get_bypass = regulator_get_bypass_regmap,
 209         .set_bypass = regulator_set_bypass_regmap,
 210 
 211         .is_enabled = regulator_is_enabled_regmap,
 212         .enable = regulator_enable_regmap,
 213         .disable = regulator_disable_regmap,
 214 };
 215 
 216 static int wm831x_gp_ldo_probe(struct platform_device *pdev)
 217 {
 218         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 219         struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
 220         struct regulator_config config = { };
 221         int id;
 222         struct wm831x_ldo *ldo;
 223         struct resource *res;
 224         int ret, irq;
 225 
 226         if (pdata && pdata->wm831x_num)
 227                 id = (pdata->wm831x_num * 10) + 1;
 228         else
 229                 id = 0;
 230         id = pdev->id - id;
 231 
 232         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
 233 
 234         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
 235         if (!ldo)
 236                 return -ENOMEM;
 237 
 238         ldo->wm831x = wm831x;
 239 
 240         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
 241         if (res == NULL) {
 242                 dev_err(&pdev->dev, "No REG resource\n");
 243                 ret = -EINVAL;
 244                 goto err;
 245         }
 246         ldo->base = res->start;
 247 
 248         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
 249         ldo->desc.name = ldo->name;
 250 
 251         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
 252                  "LDO%dVDD", id + 1);
 253         ldo->desc.supply_name = ldo->supply_name;
 254 
 255         ldo->desc.id = id;
 256         ldo->desc.type = REGULATOR_VOLTAGE;
 257         ldo->desc.n_voltages = 32;
 258         ldo->desc.ops = &wm831x_gp_ldo_ops;
 259         ldo->desc.owner = THIS_MODULE;
 260         ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 261         ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
 262         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
 263         ldo->desc.enable_mask = 1 << id;
 264         ldo->desc.bypass_reg = ldo->base;
 265         ldo->desc.bypass_mask = WM831X_LDO1_SWI;
 266         ldo->desc.linear_ranges = wm831x_gp_ldo_ranges;
 267         ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_gp_ldo_ranges);
 268 
 269         config.dev = pdev->dev.parent;
 270         if (pdata)
 271                 config.init_data = pdata->ldo[id];
 272         config.driver_data = ldo;
 273         config.regmap = wm831x->regmap;
 274 
 275         ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
 276                                                  &config);
 277         if (IS_ERR(ldo->regulator)) {
 278                 ret = PTR_ERR(ldo->regulator);
 279                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
 280                         id + 1, ret);
 281                 goto err;
 282         }
 283 
 284         irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
 285         ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
 286                                         wm831x_ldo_uv_irq,
 287                                         IRQF_TRIGGER_RISING | IRQF_ONESHOT,
 288                                         ldo->name,
 289                                         ldo);
 290         if (ret != 0) {
 291                 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 292                         irq, ret);
 293                 goto err;
 294         }
 295 
 296         platform_set_drvdata(pdev, ldo);
 297 
 298         return 0;
 299 
 300 err:
 301         return ret;
 302 }
 303 
 304 static struct platform_driver wm831x_gp_ldo_driver = {
 305         .probe = wm831x_gp_ldo_probe,
 306         .driver         = {
 307                 .name   = "wm831x-ldo",
 308         },
 309 };
 310 
 311 /*
 312  * Analogue LDOs
 313  */
 314 
 315 static const struct regulator_linear_range wm831x_aldo_ranges[] = {
 316         REGULATOR_LINEAR_RANGE(1000000, 0, 12, 50000),
 317         REGULATOR_LINEAR_RANGE(1700000, 13, 31, 100000),
 318 };
 319 
 320 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
 321                                              int uV)
 322 {
 323         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 324         struct wm831x *wm831x = ldo->wm831x;
 325         int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
 326 
 327         sel = regulator_map_voltage_linear_range(rdev, uV, uV);
 328         if (sel < 0)
 329                 return sel;
 330 
 331         return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
 332 }
 333 
 334 static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
 335 {
 336         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 337         struct wm831x *wm831x = ldo->wm831x;
 338         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 339         int ret;
 340 
 341         ret = wm831x_reg_read(wm831x, on_reg);
 342         if (ret < 0)
 343                 return 0;
 344 
 345         if (ret & WM831X_LDO7_ON_MODE)
 346                 return REGULATOR_MODE_IDLE;
 347         else
 348                 return REGULATOR_MODE_NORMAL;
 349 }
 350 
 351 static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
 352                                   unsigned int mode)
 353 {
 354         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 355         struct wm831x *wm831x = ldo->wm831x;
 356         int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 357         int ret;
 358 
 359 
 360         switch (mode) {
 361         case REGULATOR_MODE_NORMAL:
 362                 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
 363                 if (ret < 0)
 364                         return ret;
 365                 break;
 366 
 367         case REGULATOR_MODE_IDLE:
 368                 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
 369                                       WM831X_LDO7_ON_MODE);
 370                 if (ret < 0)
 371                         return ret;
 372                 break;
 373 
 374         default:
 375                 return -EINVAL;
 376         }
 377 
 378         return 0;
 379 }
 380 
 381 static int wm831x_aldo_get_status(struct regulator_dev *rdev)
 382 {
 383         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 384         struct wm831x *wm831x = ldo->wm831x;
 385         int mask = 1 << rdev_get_id(rdev);
 386         int ret;
 387 
 388         /* Is the regulator on? */
 389         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
 390         if (ret < 0)
 391                 return ret;
 392         if (!(ret & mask))
 393                 return REGULATOR_STATUS_OFF;
 394 
 395         /* Is it reporting under voltage? */
 396         ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
 397         if (ret < 0)
 398                 return ret;
 399         if (ret & mask)
 400                 return REGULATOR_STATUS_ERROR;
 401 
 402         ret = wm831x_aldo_get_mode(rdev);
 403         if (ret < 0)
 404                 return ret;
 405         else
 406                 return regulator_mode_to_status(ret);
 407 }
 408 
 409 static const struct regulator_ops wm831x_aldo_ops = {
 410         .list_voltage = regulator_list_voltage_linear_range,
 411         .map_voltage = regulator_map_voltage_linear_range,
 412         .get_voltage_sel = regulator_get_voltage_sel_regmap,
 413         .set_voltage_sel = regulator_set_voltage_sel_regmap,
 414         .set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
 415         .get_mode = wm831x_aldo_get_mode,
 416         .set_mode = wm831x_aldo_set_mode,
 417         .get_status = wm831x_aldo_get_status,
 418         .set_bypass = regulator_set_bypass_regmap,
 419         .get_bypass = regulator_get_bypass_regmap,
 420 
 421         .is_enabled = regulator_is_enabled_regmap,
 422         .enable = regulator_enable_regmap,
 423         .disable = regulator_disable_regmap,
 424 };
 425 
 426 static int wm831x_aldo_probe(struct platform_device *pdev)
 427 {
 428         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 429         struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
 430         struct regulator_config config = { };
 431         int id;
 432         struct wm831x_ldo *ldo;
 433         struct resource *res;
 434         int ret, irq;
 435 
 436         if (pdata && pdata->wm831x_num)
 437                 id = (pdata->wm831x_num * 10) + 1;
 438         else
 439                 id = 0;
 440         id = pdev->id - id;
 441 
 442         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
 443 
 444         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
 445         if (!ldo)
 446                 return -ENOMEM;
 447 
 448         ldo->wm831x = wm831x;
 449 
 450         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
 451         if (res == NULL) {
 452                 dev_err(&pdev->dev, "No REG resource\n");
 453                 ret = -EINVAL;
 454                 goto err;
 455         }
 456         ldo->base = res->start;
 457 
 458         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
 459         ldo->desc.name = ldo->name;
 460 
 461         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
 462                  "LDO%dVDD", id + 1);
 463         ldo->desc.supply_name = ldo->supply_name;
 464 
 465         ldo->desc.id = id;
 466         ldo->desc.type = REGULATOR_VOLTAGE;
 467         ldo->desc.n_voltages = 32;
 468         ldo->desc.linear_ranges = wm831x_aldo_ranges;
 469         ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
 470         ldo->desc.ops = &wm831x_aldo_ops;
 471         ldo->desc.owner = THIS_MODULE;
 472         ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 473         ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
 474         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
 475         ldo->desc.enable_mask = 1 << id;
 476         ldo->desc.bypass_reg = ldo->base;
 477         ldo->desc.bypass_mask = WM831X_LDO7_SWI;
 478 
 479         config.dev = pdev->dev.parent;
 480         if (pdata)
 481                 config.init_data = pdata->ldo[id];
 482         config.driver_data = ldo;
 483         config.regmap = wm831x->regmap;
 484 
 485         ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
 486                                                  &config);
 487         if (IS_ERR(ldo->regulator)) {
 488                 ret = PTR_ERR(ldo->regulator);
 489                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
 490                         id + 1, ret);
 491                 goto err;
 492         }
 493 
 494         irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
 495         ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
 496                                         wm831x_ldo_uv_irq,
 497                                         IRQF_TRIGGER_RISING | IRQF_ONESHOT,
 498                                         ldo->name, ldo);
 499         if (ret != 0) {
 500                 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 501                         irq, ret);
 502                 goto err;
 503         }
 504 
 505         platform_set_drvdata(pdev, ldo);
 506 
 507         return 0;
 508 
 509 err:
 510         return ret;
 511 }
 512 
 513 static struct platform_driver wm831x_aldo_driver = {
 514         .probe = wm831x_aldo_probe,
 515         .driver         = {
 516                 .name   = "wm831x-aldo",
 517         },
 518 };
 519 
 520 /*
 521  * Alive LDO
 522  */
 523 
 524 #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
 525 
 526 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
 527                                              int uV)
 528 {
 529         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 530         struct wm831x *wm831x = ldo->wm831x;
 531         int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
 532 
 533         sel = regulator_map_voltage_linear(rdev, uV, uV);
 534         if (sel < 0)
 535                 return sel;
 536 
 537         return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
 538 }
 539 
 540 static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
 541 {
 542         struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 543         struct wm831x *wm831x = ldo->wm831x;
 544         int mask = 1 << rdev_get_id(rdev);
 545         int ret;
 546 
 547         /* Is the regulator on? */
 548         ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
 549         if (ret < 0)
 550                 return ret;
 551         if (ret & mask)
 552                 return REGULATOR_STATUS_ON;
 553         else
 554                 return REGULATOR_STATUS_OFF;
 555 }
 556 
 557 static const struct regulator_ops wm831x_alive_ldo_ops = {
 558         .list_voltage = regulator_list_voltage_linear,
 559         .map_voltage = regulator_map_voltage_linear,
 560         .get_voltage_sel = regulator_get_voltage_sel_regmap,
 561         .set_voltage_sel = regulator_set_voltage_sel_regmap,
 562         .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
 563         .get_status = wm831x_alive_ldo_get_status,
 564 
 565         .is_enabled = regulator_is_enabled_regmap,
 566         .enable = regulator_enable_regmap,
 567         .disable = regulator_disable_regmap,
 568 };
 569 
 570 static int wm831x_alive_ldo_probe(struct platform_device *pdev)
 571 {
 572         struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 573         struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
 574         struct regulator_config config = { };
 575         int id;
 576         struct wm831x_ldo *ldo;
 577         struct resource *res;
 578         int ret;
 579 
 580         if (pdata && pdata->wm831x_num)
 581                 id = (pdata->wm831x_num * 10) + 1;
 582         else
 583                 id = 0;
 584         id = pdev->id - id;
 585 
 586 
 587         dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
 588 
 589         ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
 590         if (!ldo)
 591                 return -ENOMEM;
 592 
 593         ldo->wm831x = wm831x;
 594 
 595         res = platform_get_resource(pdev, IORESOURCE_REG, 0);
 596         if (res == NULL) {
 597                 dev_err(&pdev->dev, "No REG resource\n");
 598                 ret = -EINVAL;
 599                 goto err;
 600         }
 601         ldo->base = res->start;
 602 
 603         snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
 604         ldo->desc.name = ldo->name;
 605 
 606         snprintf(ldo->supply_name, sizeof(ldo->supply_name),
 607                  "LDO%dVDD", id + 1);
 608         ldo->desc.supply_name = ldo->supply_name;
 609 
 610         ldo->desc.id = id;
 611         ldo->desc.type = REGULATOR_VOLTAGE;
 612         ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
 613         ldo->desc.ops = &wm831x_alive_ldo_ops;
 614         ldo->desc.owner = THIS_MODULE;
 615         ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
 616         ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
 617         ldo->desc.enable_reg = WM831X_LDO_ENABLE;
 618         ldo->desc.enable_mask = 1 << id;
 619         ldo->desc.min_uV = 800000;
 620         ldo->desc.uV_step = 50000;
 621         ldo->desc.enable_time = 1000;
 622 
 623         config.dev = pdev->dev.parent;
 624         if (pdata)
 625                 config.init_data = pdata->ldo[id];
 626         config.driver_data = ldo;
 627         config.regmap = wm831x->regmap;
 628 
 629         ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
 630                                                  &config);
 631         if (IS_ERR(ldo->regulator)) {
 632                 ret = PTR_ERR(ldo->regulator);
 633                 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
 634                         id + 1, ret);
 635                 goto err;
 636         }
 637 
 638         platform_set_drvdata(pdev, ldo);
 639 
 640         return 0;
 641 
 642 err:
 643         return ret;
 644 }
 645 
 646 static struct platform_driver wm831x_alive_ldo_driver = {
 647         .probe = wm831x_alive_ldo_probe,
 648         .driver         = {
 649                 .name   = "wm831x-alive-ldo",
 650         },
 651 };
 652 
 653 static struct platform_driver * const drivers[] = {
 654         &wm831x_gp_ldo_driver,
 655         &wm831x_aldo_driver,
 656         &wm831x_alive_ldo_driver,
 657 };
 658 
 659 static int __init wm831x_ldo_init(void)
 660 {
 661         return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
 662 }
 663 subsys_initcall(wm831x_ldo_init);
 664 
 665 static void __exit wm831x_ldo_exit(void)
 666 {
 667         platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
 668 }
 669 module_exit(wm831x_ldo_exit);
 670 
 671 /* Module information */
 672 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
 673 MODULE_DESCRIPTION("WM831x LDO driver");
 674 MODULE_LICENSE("GPL");
 675 MODULE_ALIAS("platform:wm831x-ldo");
 676 MODULE_ALIAS("platform:wm831x-aldo");
 677 MODULE_ALIAS("platform:wm831x-aliveldo");

/* [<][>][^][v][top][bottom][index][help] */