0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/moduleparam.h>
0011 #include <linux/init.h>
0012 #include <linux/bitops.h>
0013 #include <linux/err.h>
0014 #include <linux/i2c.h>
0015 #include <linux/platform_device.h>
0016 #include <linux/regulator/driver.h>
0017 #include <linux/slab.h>
0018
0019 #include <linux/mfd/wm831x/core.h>
0020 #include <linux/mfd/wm831x/regulator.h>
0021 #include <linux/mfd/wm831x/pdata.h>
0022
0023 #define WM831X_LDO_MAX_NAME 9
0024
0025 #define WM831X_LDO_CONTROL 0
0026 #define WM831X_LDO_ON_CONTROL 1
0027 #define WM831X_LDO_SLEEP_CONTROL 2
0028
0029 #define WM831X_ALIVE_LDO_ON_CONTROL 0
0030 #define WM831X_ALIVE_LDO_SLEEP_CONTROL 1
0031
0032 struct wm831x_ldo {
0033 char name[WM831X_LDO_MAX_NAME];
0034 char supply_name[WM831X_LDO_MAX_NAME];
0035 struct regulator_desc desc;
0036 int base;
0037 struct wm831x *wm831x;
0038 struct regulator_dev *regulator;
0039 };
0040
0041
0042
0043
0044
0045 static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data)
0046 {
0047 struct wm831x_ldo *ldo = data;
0048
0049 regulator_notifier_call_chain(ldo->regulator,
0050 REGULATOR_EVENT_UNDER_VOLTAGE,
0051 NULL);
0052
0053 return IRQ_HANDLED;
0054 }
0055
0056
0057
0058
0059
0060 static const struct linear_range wm831x_gp_ldo_ranges[] = {
0061 REGULATOR_LINEAR_RANGE(900000, 0, 14, 50000),
0062 REGULATOR_LINEAR_RANGE(1700000, 15, 31, 100000),
0063 };
0064
0065 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
0066 int uV)
0067 {
0068 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0069 struct wm831x *wm831x = ldo->wm831x;
0070 int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
0071
0072 sel = regulator_map_voltage_linear_range(rdev, uV, uV);
0073 if (sel < 0)
0074 return sel;
0075
0076 return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
0077 }
0078
0079 static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
0080 {
0081 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0082 struct wm831x *wm831x = ldo->wm831x;
0083 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
0084 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
0085 int ret;
0086
0087 ret = wm831x_reg_read(wm831x, on_reg);
0088 if (ret < 0)
0089 return ret;
0090
0091 if (!(ret & WM831X_LDO1_ON_MODE))
0092 return REGULATOR_MODE_NORMAL;
0093
0094 ret = wm831x_reg_read(wm831x, ctrl_reg);
0095 if (ret < 0)
0096 return ret;
0097
0098 if (ret & WM831X_LDO1_LP_MODE)
0099 return REGULATOR_MODE_STANDBY;
0100 else
0101 return REGULATOR_MODE_IDLE;
0102 }
0103
0104 static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
0105 unsigned int mode)
0106 {
0107 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0108 struct wm831x *wm831x = ldo->wm831x;
0109 int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
0110 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
0111 int ret;
0112
0113
0114 switch (mode) {
0115 case REGULATOR_MODE_NORMAL:
0116 ret = wm831x_set_bits(wm831x, on_reg,
0117 WM831X_LDO1_ON_MODE, 0);
0118 if (ret < 0)
0119 return ret;
0120 break;
0121
0122 case REGULATOR_MODE_IDLE:
0123 ret = wm831x_set_bits(wm831x, ctrl_reg,
0124 WM831X_LDO1_LP_MODE, 0);
0125 if (ret < 0)
0126 return ret;
0127
0128 ret = wm831x_set_bits(wm831x, on_reg,
0129 WM831X_LDO1_ON_MODE,
0130 WM831X_LDO1_ON_MODE);
0131 if (ret < 0)
0132 return ret;
0133 break;
0134
0135 case REGULATOR_MODE_STANDBY:
0136 ret = wm831x_set_bits(wm831x, ctrl_reg,
0137 WM831X_LDO1_LP_MODE,
0138 WM831X_LDO1_LP_MODE);
0139 if (ret < 0)
0140 return ret;
0141
0142 ret = wm831x_set_bits(wm831x, on_reg,
0143 WM831X_LDO1_ON_MODE,
0144 WM831X_LDO1_ON_MODE);
0145 if (ret < 0)
0146 return ret;
0147 break;
0148
0149 default:
0150 return -EINVAL;
0151 }
0152
0153 return 0;
0154 }
0155
0156 static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
0157 {
0158 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0159 struct wm831x *wm831x = ldo->wm831x;
0160 int mask = 1 << rdev_get_id(rdev);
0161 int ret;
0162
0163
0164 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
0165 if (ret < 0)
0166 return ret;
0167 if (!(ret & mask))
0168 return REGULATOR_STATUS_OFF;
0169
0170
0171 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
0172 if (ret < 0)
0173 return ret;
0174 if (ret & mask)
0175 return REGULATOR_STATUS_ERROR;
0176
0177 ret = wm831x_gp_ldo_get_mode(rdev);
0178 if (ret < 0)
0179 return ret;
0180 else
0181 return regulator_mode_to_status(ret);
0182 }
0183
0184 static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
0185 int input_uV,
0186 int output_uV, int load_uA)
0187 {
0188 if (load_uA < 20000)
0189 return REGULATOR_MODE_STANDBY;
0190 if (load_uA < 50000)
0191 return REGULATOR_MODE_IDLE;
0192 return REGULATOR_MODE_NORMAL;
0193 }
0194
0195
0196 static const struct regulator_ops wm831x_gp_ldo_ops = {
0197 .list_voltage = regulator_list_voltage_linear_range,
0198 .map_voltage = regulator_map_voltage_linear_range,
0199 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0200 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0201 .set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
0202 .get_mode = wm831x_gp_ldo_get_mode,
0203 .set_mode = wm831x_gp_ldo_set_mode,
0204 .get_status = wm831x_gp_ldo_get_status,
0205 .get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
0206 .get_bypass = regulator_get_bypass_regmap,
0207 .set_bypass = regulator_set_bypass_regmap,
0208
0209 .is_enabled = regulator_is_enabled_regmap,
0210 .enable = regulator_enable_regmap,
0211 .disable = regulator_disable_regmap,
0212 };
0213
0214 static int wm831x_gp_ldo_probe(struct platform_device *pdev)
0215 {
0216 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
0217 struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
0218 struct regulator_config config = { };
0219 int id;
0220 struct wm831x_ldo *ldo;
0221 struct resource *res;
0222 int ret, irq;
0223
0224 if (pdata && pdata->wm831x_num)
0225 id = (pdata->wm831x_num * 10) + 1;
0226 else
0227 id = 0;
0228 id = pdev->id - id;
0229
0230 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
0231
0232 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
0233 if (!ldo)
0234 return -ENOMEM;
0235
0236 ldo->wm831x = wm831x;
0237
0238 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
0239 if (res == NULL) {
0240 dev_err(&pdev->dev, "No REG resource\n");
0241 ret = -EINVAL;
0242 goto err;
0243 }
0244 ldo->base = res->start;
0245
0246 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
0247 ldo->desc.name = ldo->name;
0248
0249 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
0250 "LDO%dVDD", id + 1);
0251 ldo->desc.supply_name = ldo->supply_name;
0252
0253 ldo->desc.id = id;
0254 ldo->desc.type = REGULATOR_VOLTAGE;
0255 ldo->desc.n_voltages = 32;
0256 ldo->desc.ops = &wm831x_gp_ldo_ops;
0257 ldo->desc.owner = THIS_MODULE;
0258 ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
0259 ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
0260 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
0261 ldo->desc.enable_mask = 1 << id;
0262 ldo->desc.bypass_reg = ldo->base;
0263 ldo->desc.bypass_mask = WM831X_LDO1_SWI;
0264 ldo->desc.linear_ranges = wm831x_gp_ldo_ranges;
0265 ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_gp_ldo_ranges);
0266
0267 config.dev = pdev->dev.parent;
0268 if (pdata)
0269 config.init_data = pdata->ldo[id];
0270 config.driver_data = ldo;
0271 config.regmap = wm831x->regmap;
0272
0273 ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
0274 &config);
0275 if (IS_ERR(ldo->regulator)) {
0276 ret = PTR_ERR(ldo->regulator);
0277 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
0278 id + 1, ret);
0279 goto err;
0280 }
0281
0282 irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
0283 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
0284 wm831x_ldo_uv_irq,
0285 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
0286 ldo->name,
0287 ldo);
0288 if (ret != 0) {
0289 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
0290 irq, ret);
0291 goto err;
0292 }
0293
0294 platform_set_drvdata(pdev, ldo);
0295
0296 return 0;
0297
0298 err:
0299 return ret;
0300 }
0301
0302 static struct platform_driver wm831x_gp_ldo_driver = {
0303 .probe = wm831x_gp_ldo_probe,
0304 .driver = {
0305 .name = "wm831x-ldo",
0306 },
0307 };
0308
0309
0310
0311
0312
0313 static const struct linear_range wm831x_aldo_ranges[] = {
0314 REGULATOR_LINEAR_RANGE(1000000, 0, 12, 50000),
0315 REGULATOR_LINEAR_RANGE(1700000, 13, 31, 100000),
0316 };
0317
0318 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
0319 int uV)
0320 {
0321 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0322 struct wm831x *wm831x = ldo->wm831x;
0323 int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
0324
0325 sel = regulator_map_voltage_linear_range(rdev, uV, uV);
0326 if (sel < 0)
0327 return sel;
0328
0329 return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
0330 }
0331
0332 static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
0333 {
0334 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0335 struct wm831x *wm831x = ldo->wm831x;
0336 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
0337 int ret;
0338
0339 ret = wm831x_reg_read(wm831x, on_reg);
0340 if (ret < 0)
0341 return 0;
0342
0343 if (ret & WM831X_LDO7_ON_MODE)
0344 return REGULATOR_MODE_IDLE;
0345 else
0346 return REGULATOR_MODE_NORMAL;
0347 }
0348
0349 static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
0350 unsigned int mode)
0351 {
0352 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0353 struct wm831x *wm831x = ldo->wm831x;
0354 int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
0355 int ret;
0356
0357
0358 switch (mode) {
0359 case REGULATOR_MODE_NORMAL:
0360 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
0361 if (ret < 0)
0362 return ret;
0363 break;
0364
0365 case REGULATOR_MODE_IDLE:
0366 ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
0367 WM831X_LDO7_ON_MODE);
0368 if (ret < 0)
0369 return ret;
0370 break;
0371
0372 default:
0373 return -EINVAL;
0374 }
0375
0376 return 0;
0377 }
0378
0379 static int wm831x_aldo_get_status(struct regulator_dev *rdev)
0380 {
0381 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0382 struct wm831x *wm831x = ldo->wm831x;
0383 int mask = 1 << rdev_get_id(rdev);
0384 int ret;
0385
0386
0387 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
0388 if (ret < 0)
0389 return ret;
0390 if (!(ret & mask))
0391 return REGULATOR_STATUS_OFF;
0392
0393
0394 ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
0395 if (ret < 0)
0396 return ret;
0397 if (ret & mask)
0398 return REGULATOR_STATUS_ERROR;
0399
0400 ret = wm831x_aldo_get_mode(rdev);
0401 if (ret < 0)
0402 return ret;
0403 else
0404 return regulator_mode_to_status(ret);
0405 }
0406
0407 static const struct regulator_ops wm831x_aldo_ops = {
0408 .list_voltage = regulator_list_voltage_linear_range,
0409 .map_voltage = regulator_map_voltage_linear_range,
0410 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0411 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0412 .set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
0413 .get_mode = wm831x_aldo_get_mode,
0414 .set_mode = wm831x_aldo_set_mode,
0415 .get_status = wm831x_aldo_get_status,
0416 .set_bypass = regulator_set_bypass_regmap,
0417 .get_bypass = regulator_get_bypass_regmap,
0418
0419 .is_enabled = regulator_is_enabled_regmap,
0420 .enable = regulator_enable_regmap,
0421 .disable = regulator_disable_regmap,
0422 };
0423
0424 static int wm831x_aldo_probe(struct platform_device *pdev)
0425 {
0426 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
0427 struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
0428 struct regulator_config config = { };
0429 int id;
0430 struct wm831x_ldo *ldo;
0431 struct resource *res;
0432 int ret, irq;
0433
0434 if (pdata && pdata->wm831x_num)
0435 id = (pdata->wm831x_num * 10) + 1;
0436 else
0437 id = 0;
0438 id = pdev->id - id;
0439
0440 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
0441
0442 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
0443 if (!ldo)
0444 return -ENOMEM;
0445
0446 ldo->wm831x = wm831x;
0447
0448 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
0449 if (res == NULL) {
0450 dev_err(&pdev->dev, "No REG resource\n");
0451 ret = -EINVAL;
0452 goto err;
0453 }
0454 ldo->base = res->start;
0455
0456 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
0457 ldo->desc.name = ldo->name;
0458
0459 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
0460 "LDO%dVDD", id + 1);
0461 ldo->desc.supply_name = ldo->supply_name;
0462
0463 ldo->desc.id = id;
0464 ldo->desc.type = REGULATOR_VOLTAGE;
0465 ldo->desc.n_voltages = 32;
0466 ldo->desc.linear_ranges = wm831x_aldo_ranges;
0467 ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
0468 ldo->desc.ops = &wm831x_aldo_ops;
0469 ldo->desc.owner = THIS_MODULE;
0470 ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
0471 ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
0472 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
0473 ldo->desc.enable_mask = 1 << id;
0474 ldo->desc.bypass_reg = ldo->base;
0475 ldo->desc.bypass_mask = WM831X_LDO7_SWI;
0476
0477 config.dev = pdev->dev.parent;
0478 if (pdata)
0479 config.init_data = pdata->ldo[id];
0480 config.driver_data = ldo;
0481 config.regmap = wm831x->regmap;
0482
0483 ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
0484 &config);
0485 if (IS_ERR(ldo->regulator)) {
0486 ret = PTR_ERR(ldo->regulator);
0487 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
0488 id + 1, ret);
0489 goto err;
0490 }
0491
0492 irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
0493 ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
0494 wm831x_ldo_uv_irq,
0495 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
0496 ldo->name, ldo);
0497 if (ret != 0) {
0498 dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
0499 irq, ret);
0500 goto err;
0501 }
0502
0503 platform_set_drvdata(pdev, ldo);
0504
0505 return 0;
0506
0507 err:
0508 return ret;
0509 }
0510
0511 static struct platform_driver wm831x_aldo_driver = {
0512 .probe = wm831x_aldo_probe,
0513 .driver = {
0514 .name = "wm831x-aldo",
0515 },
0516 };
0517
0518
0519
0520
0521
0522 #define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
0523
0524 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
0525 int uV)
0526 {
0527 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0528 struct wm831x *wm831x = ldo->wm831x;
0529 int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
0530
0531 sel = regulator_map_voltage_linear(rdev, uV, uV);
0532 if (sel < 0)
0533 return sel;
0534
0535 return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
0536 }
0537
0538 static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
0539 {
0540 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
0541 struct wm831x *wm831x = ldo->wm831x;
0542 int mask = 1 << rdev_get_id(rdev);
0543 int ret;
0544
0545
0546 ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
0547 if (ret < 0)
0548 return ret;
0549 if (ret & mask)
0550 return REGULATOR_STATUS_ON;
0551 else
0552 return REGULATOR_STATUS_OFF;
0553 }
0554
0555 static const struct regulator_ops wm831x_alive_ldo_ops = {
0556 .list_voltage = regulator_list_voltage_linear,
0557 .map_voltage = regulator_map_voltage_linear,
0558 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0559 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0560 .set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
0561 .get_status = wm831x_alive_ldo_get_status,
0562
0563 .is_enabled = regulator_is_enabled_regmap,
0564 .enable = regulator_enable_regmap,
0565 .disable = regulator_disable_regmap,
0566 };
0567
0568 static int wm831x_alive_ldo_probe(struct platform_device *pdev)
0569 {
0570 struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
0571 struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
0572 struct regulator_config config = { };
0573 int id;
0574 struct wm831x_ldo *ldo;
0575 struct resource *res;
0576 int ret;
0577
0578 if (pdata && pdata->wm831x_num)
0579 id = (pdata->wm831x_num * 10) + 1;
0580 else
0581 id = 0;
0582 id = pdev->id - id;
0583
0584
0585 dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
0586
0587 ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
0588 if (!ldo)
0589 return -ENOMEM;
0590
0591 ldo->wm831x = wm831x;
0592
0593 res = platform_get_resource(pdev, IORESOURCE_REG, 0);
0594 if (res == NULL) {
0595 dev_err(&pdev->dev, "No REG resource\n");
0596 ret = -EINVAL;
0597 goto err;
0598 }
0599 ldo->base = res->start;
0600
0601 snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
0602 ldo->desc.name = ldo->name;
0603
0604 snprintf(ldo->supply_name, sizeof(ldo->supply_name),
0605 "LDO%dVDD", id + 1);
0606 ldo->desc.supply_name = ldo->supply_name;
0607
0608 ldo->desc.id = id;
0609 ldo->desc.type = REGULATOR_VOLTAGE;
0610 ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
0611 ldo->desc.ops = &wm831x_alive_ldo_ops;
0612 ldo->desc.owner = THIS_MODULE;
0613 ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
0614 ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
0615 ldo->desc.enable_reg = WM831X_LDO_ENABLE;
0616 ldo->desc.enable_mask = 1 << id;
0617 ldo->desc.min_uV = 800000;
0618 ldo->desc.uV_step = 50000;
0619 ldo->desc.enable_time = 1000;
0620
0621 config.dev = pdev->dev.parent;
0622 if (pdata)
0623 config.init_data = pdata->ldo[id];
0624 config.driver_data = ldo;
0625 config.regmap = wm831x->regmap;
0626
0627 ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
0628 &config);
0629 if (IS_ERR(ldo->regulator)) {
0630 ret = PTR_ERR(ldo->regulator);
0631 dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
0632 id + 1, ret);
0633 goto err;
0634 }
0635
0636 platform_set_drvdata(pdev, ldo);
0637
0638 return 0;
0639
0640 err:
0641 return ret;
0642 }
0643
0644 static struct platform_driver wm831x_alive_ldo_driver = {
0645 .probe = wm831x_alive_ldo_probe,
0646 .driver = {
0647 .name = "wm831x-alive-ldo",
0648 },
0649 };
0650
0651 static struct platform_driver * const drivers[] = {
0652 &wm831x_gp_ldo_driver,
0653 &wm831x_aldo_driver,
0654 &wm831x_alive_ldo_driver,
0655 };
0656
0657 static int __init wm831x_ldo_init(void)
0658 {
0659 return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
0660 }
0661 subsys_initcall(wm831x_ldo_init);
0662
0663 static void __exit wm831x_ldo_exit(void)
0664 {
0665 platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
0666 }
0667 module_exit(wm831x_ldo_exit);
0668
0669
0670 MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
0671 MODULE_DESCRIPTION("WM831x LDO driver");
0672 MODULE_LICENSE("GPL");
0673 MODULE_ALIAS("platform:wm831x-ldo");
0674 MODULE_ALIAS("platform:wm831x-aldo");
0675 MODULE_ALIAS("platform:wm831x-aliveldo");