0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/slab.h>
0012 #include <linux/err.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/regulator/driver.h>
0015 #include <linux/gpio/consumer.h>
0016 #include <linux/mfd/lp8788.h>
0017
0018
0019 #define LP8788_EN_LDO_A 0x0D
0020 #define LP8788_EN_LDO_B 0x0E
0021 #define LP8788_EN_LDO_C 0x0F
0022 #define LP8788_EN_SEL 0x10
0023 #define LP8788_DLDO1_VOUT 0x2E
0024 #define LP8788_DLDO2_VOUT 0x2F
0025 #define LP8788_DLDO3_VOUT 0x30
0026 #define LP8788_DLDO4_VOUT 0x31
0027 #define LP8788_DLDO5_VOUT 0x32
0028 #define LP8788_DLDO6_VOUT 0x33
0029 #define LP8788_DLDO7_VOUT 0x34
0030 #define LP8788_DLDO8_VOUT 0x35
0031 #define LP8788_DLDO9_VOUT 0x36
0032 #define LP8788_DLDO10_VOUT 0x37
0033 #define LP8788_DLDO11_VOUT 0x38
0034 #define LP8788_DLDO12_VOUT 0x39
0035 #define LP8788_ALDO1_VOUT 0x3A
0036 #define LP8788_ALDO2_VOUT 0x3B
0037 #define LP8788_ALDO3_VOUT 0x3C
0038 #define LP8788_ALDO4_VOUT 0x3D
0039 #define LP8788_ALDO5_VOUT 0x3E
0040 #define LP8788_ALDO6_VOUT 0x3F
0041 #define LP8788_ALDO7_VOUT 0x40
0042 #define LP8788_ALDO8_VOUT 0x41
0043 #define LP8788_ALDO9_VOUT 0x42
0044 #define LP8788_ALDO10_VOUT 0x43
0045 #define LP8788_DLDO1_TIMESTEP 0x44
0046
0047
0048 #define LP8788_EN_DLDO1_M BIT(0)
0049 #define LP8788_EN_DLDO2_M BIT(1)
0050 #define LP8788_EN_DLDO3_M BIT(2)
0051 #define LP8788_EN_DLDO4_M BIT(3)
0052 #define LP8788_EN_DLDO5_M BIT(4)
0053 #define LP8788_EN_DLDO6_M BIT(5)
0054 #define LP8788_EN_DLDO7_M BIT(6)
0055 #define LP8788_EN_DLDO8_M BIT(7)
0056 #define LP8788_EN_DLDO9_M BIT(0)
0057 #define LP8788_EN_DLDO10_M BIT(1)
0058 #define LP8788_EN_DLDO11_M BIT(2)
0059 #define LP8788_EN_DLDO12_M BIT(3)
0060 #define LP8788_EN_ALDO1_M BIT(4)
0061 #define LP8788_EN_ALDO2_M BIT(5)
0062 #define LP8788_EN_ALDO3_M BIT(6)
0063 #define LP8788_EN_ALDO4_M BIT(7)
0064 #define LP8788_EN_ALDO5_M BIT(0)
0065 #define LP8788_EN_ALDO6_M BIT(1)
0066 #define LP8788_EN_ALDO7_M BIT(2)
0067 #define LP8788_EN_ALDO8_M BIT(3)
0068 #define LP8788_EN_ALDO9_M BIT(4)
0069 #define LP8788_EN_ALDO10_M BIT(5)
0070 #define LP8788_EN_SEL_DLDO911_M BIT(0)
0071 #define LP8788_EN_SEL_DLDO7_M BIT(1)
0072 #define LP8788_EN_SEL_ALDO7_M BIT(2)
0073 #define LP8788_EN_SEL_ALDO5_M BIT(3)
0074 #define LP8788_EN_SEL_ALDO234_M BIT(4)
0075 #define LP8788_EN_SEL_ALDO1_M BIT(5)
0076 #define LP8788_VOUT_5BIT_M 0x1F
0077 #define LP8788_VOUT_4BIT_M 0x0F
0078 #define LP8788_VOUT_3BIT_M 0x07
0079 #define LP8788_VOUT_1BIT_M 0x01
0080 #define LP8788_STARTUP_TIME_M 0xF8
0081 #define LP8788_STARTUP_TIME_S 3
0082
0083 #define ENABLE_TIME_USEC 32
0084
0085 enum lp8788_ldo_id {
0086 DLDO1,
0087 DLDO2,
0088 DLDO3,
0089 DLDO4,
0090 DLDO5,
0091 DLDO6,
0092 DLDO7,
0093 DLDO8,
0094 DLDO9,
0095 DLDO10,
0096 DLDO11,
0097 DLDO12,
0098 ALDO1,
0099 ALDO2,
0100 ALDO3,
0101 ALDO4,
0102 ALDO5,
0103 ALDO6,
0104 ALDO7,
0105 ALDO8,
0106 ALDO9,
0107 ALDO10,
0108 };
0109
0110 struct lp8788_ldo {
0111 struct lp8788 *lp;
0112 struct regulator_desc *desc;
0113 struct regulator_dev *regulator;
0114 struct gpio_desc *ena_gpiod;
0115 };
0116
0117
0118 static const int lp8788_dldo1239_vtbl[] = {
0119 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
0120 2600000, 2700000, 2800000, 2900000, 3000000, 2850000, 2850000, 2850000,
0121 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
0122 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
0123 };
0124
0125
0126 static const int lp8788_dldo4_vtbl[] = { 1800000, 3000000 };
0127
0128
0129 static const int lp8788_dldo578_aldo6_vtbl[] = {
0130 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
0131 2600000, 2700000, 2800000, 2900000, 3000000, 3000000, 3000000, 3000000,
0132 };
0133
0134
0135 static const int lp8788_dldo6_vtbl[] = {
0136 3000000, 3100000, 3200000, 3300000, 3400000, 3500000, 3600000, 3600000,
0137 };
0138
0139
0140 static const int lp8788_dldo1011_vtbl[] = {
0141 1100000, 1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000,
0142 1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000,
0143 };
0144
0145
0146 static const int lp8788_aldo1_vtbl[] = { 1800000, 2850000 };
0147
0148
0149 static const int lp8788_aldo7_vtbl[] = {
0150 1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1800000,
0151 };
0152
0153 static int lp8788_ldo_enable_time(struct regulator_dev *rdev)
0154 {
0155 struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
0156 enum lp8788_ldo_id id = rdev_get_id(rdev);
0157 u8 val, addr = LP8788_DLDO1_TIMESTEP + id;
0158
0159 if (lp8788_read_byte(ldo->lp, addr, &val))
0160 return -EINVAL;
0161
0162 val = (val & LP8788_STARTUP_TIME_M) >> LP8788_STARTUP_TIME_S;
0163
0164 return ENABLE_TIME_USEC * val;
0165 }
0166
0167 static const struct regulator_ops lp8788_ldo_voltage_table_ops = {
0168 .list_voltage = regulator_list_voltage_table,
0169 .set_voltage_sel = regulator_set_voltage_sel_regmap,
0170 .get_voltage_sel = regulator_get_voltage_sel_regmap,
0171 .enable = regulator_enable_regmap,
0172 .disable = regulator_disable_regmap,
0173 .is_enabled = regulator_is_enabled_regmap,
0174 .enable_time = lp8788_ldo_enable_time,
0175 };
0176
0177 static const struct regulator_ops lp8788_ldo_voltage_fixed_ops = {
0178 .list_voltage = regulator_list_voltage_linear,
0179 .enable = regulator_enable_regmap,
0180 .disable = regulator_disable_regmap,
0181 .is_enabled = regulator_is_enabled_regmap,
0182 .enable_time = lp8788_ldo_enable_time,
0183 };
0184
0185 static const struct regulator_desc lp8788_dldo_desc[] = {
0186 {
0187 .name = "dldo1",
0188 .id = DLDO1,
0189 .ops = &lp8788_ldo_voltage_table_ops,
0190 .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
0191 .volt_table = lp8788_dldo1239_vtbl,
0192 .type = REGULATOR_VOLTAGE,
0193 .owner = THIS_MODULE,
0194 .vsel_reg = LP8788_DLDO1_VOUT,
0195 .vsel_mask = LP8788_VOUT_5BIT_M,
0196 .enable_reg = LP8788_EN_LDO_A,
0197 .enable_mask = LP8788_EN_DLDO1_M,
0198 },
0199 {
0200 .name = "dldo2",
0201 .id = DLDO2,
0202 .ops = &lp8788_ldo_voltage_table_ops,
0203 .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
0204 .volt_table = lp8788_dldo1239_vtbl,
0205 .type = REGULATOR_VOLTAGE,
0206 .owner = THIS_MODULE,
0207 .vsel_reg = LP8788_DLDO2_VOUT,
0208 .vsel_mask = LP8788_VOUT_5BIT_M,
0209 .enable_reg = LP8788_EN_LDO_A,
0210 .enable_mask = LP8788_EN_DLDO2_M,
0211 },
0212 {
0213 .name = "dldo3",
0214 .id = DLDO3,
0215 .ops = &lp8788_ldo_voltage_table_ops,
0216 .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
0217 .volt_table = lp8788_dldo1239_vtbl,
0218 .type = REGULATOR_VOLTAGE,
0219 .owner = THIS_MODULE,
0220 .vsel_reg = LP8788_DLDO3_VOUT,
0221 .vsel_mask = LP8788_VOUT_5BIT_M,
0222 .enable_reg = LP8788_EN_LDO_A,
0223 .enable_mask = LP8788_EN_DLDO3_M,
0224 },
0225 {
0226 .name = "dldo4",
0227 .id = DLDO4,
0228 .ops = &lp8788_ldo_voltage_table_ops,
0229 .n_voltages = ARRAY_SIZE(lp8788_dldo4_vtbl),
0230 .volt_table = lp8788_dldo4_vtbl,
0231 .type = REGULATOR_VOLTAGE,
0232 .owner = THIS_MODULE,
0233 .vsel_reg = LP8788_DLDO4_VOUT,
0234 .vsel_mask = LP8788_VOUT_1BIT_M,
0235 .enable_reg = LP8788_EN_LDO_A,
0236 .enable_mask = LP8788_EN_DLDO4_M,
0237 },
0238 {
0239 .name = "dldo5",
0240 .id = DLDO5,
0241 .ops = &lp8788_ldo_voltage_table_ops,
0242 .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
0243 .volt_table = lp8788_dldo578_aldo6_vtbl,
0244 .type = REGULATOR_VOLTAGE,
0245 .owner = THIS_MODULE,
0246 .vsel_reg = LP8788_DLDO5_VOUT,
0247 .vsel_mask = LP8788_VOUT_4BIT_M,
0248 .enable_reg = LP8788_EN_LDO_A,
0249 .enable_mask = LP8788_EN_DLDO5_M,
0250 },
0251 {
0252 .name = "dldo6",
0253 .id = DLDO6,
0254 .ops = &lp8788_ldo_voltage_table_ops,
0255 .n_voltages = ARRAY_SIZE(lp8788_dldo6_vtbl),
0256 .volt_table = lp8788_dldo6_vtbl,
0257 .type = REGULATOR_VOLTAGE,
0258 .owner = THIS_MODULE,
0259 .vsel_reg = LP8788_DLDO6_VOUT,
0260 .vsel_mask = LP8788_VOUT_3BIT_M,
0261 .enable_reg = LP8788_EN_LDO_A,
0262 .enable_mask = LP8788_EN_DLDO6_M,
0263 },
0264 {
0265 .name = "dldo7",
0266 .id = DLDO7,
0267 .ops = &lp8788_ldo_voltage_table_ops,
0268 .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
0269 .volt_table = lp8788_dldo578_aldo6_vtbl,
0270 .type = REGULATOR_VOLTAGE,
0271 .owner = THIS_MODULE,
0272 .vsel_reg = LP8788_DLDO7_VOUT,
0273 .vsel_mask = LP8788_VOUT_4BIT_M,
0274 .enable_reg = LP8788_EN_LDO_A,
0275 .enable_mask = LP8788_EN_DLDO7_M,
0276 },
0277 {
0278 .name = "dldo8",
0279 .id = DLDO8,
0280 .ops = &lp8788_ldo_voltage_table_ops,
0281 .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
0282 .volt_table = lp8788_dldo578_aldo6_vtbl,
0283 .type = REGULATOR_VOLTAGE,
0284 .owner = THIS_MODULE,
0285 .vsel_reg = LP8788_DLDO8_VOUT,
0286 .vsel_mask = LP8788_VOUT_4BIT_M,
0287 .enable_reg = LP8788_EN_LDO_A,
0288 .enable_mask = LP8788_EN_DLDO8_M,
0289 },
0290 {
0291 .name = "dldo9",
0292 .id = DLDO9,
0293 .ops = &lp8788_ldo_voltage_table_ops,
0294 .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
0295 .volt_table = lp8788_dldo1239_vtbl,
0296 .type = REGULATOR_VOLTAGE,
0297 .owner = THIS_MODULE,
0298 .vsel_reg = LP8788_DLDO9_VOUT,
0299 .vsel_mask = LP8788_VOUT_5BIT_M,
0300 .enable_reg = LP8788_EN_LDO_B,
0301 .enable_mask = LP8788_EN_DLDO9_M,
0302 },
0303 {
0304 .name = "dldo10",
0305 .id = DLDO10,
0306 .ops = &lp8788_ldo_voltage_table_ops,
0307 .n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
0308 .volt_table = lp8788_dldo1011_vtbl,
0309 .type = REGULATOR_VOLTAGE,
0310 .owner = THIS_MODULE,
0311 .vsel_reg = LP8788_DLDO10_VOUT,
0312 .vsel_mask = LP8788_VOUT_4BIT_M,
0313 .enable_reg = LP8788_EN_LDO_B,
0314 .enable_mask = LP8788_EN_DLDO10_M,
0315 },
0316 {
0317 .name = "dldo11",
0318 .id = DLDO11,
0319 .ops = &lp8788_ldo_voltage_table_ops,
0320 .n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
0321 .volt_table = lp8788_dldo1011_vtbl,
0322 .type = REGULATOR_VOLTAGE,
0323 .owner = THIS_MODULE,
0324 .vsel_reg = LP8788_DLDO11_VOUT,
0325 .vsel_mask = LP8788_VOUT_4BIT_M,
0326 .enable_reg = LP8788_EN_LDO_B,
0327 .enable_mask = LP8788_EN_DLDO11_M,
0328 },
0329 {
0330 .name = "dldo12",
0331 .id = DLDO12,
0332 .ops = &lp8788_ldo_voltage_fixed_ops,
0333 .n_voltages = 1,
0334 .type = REGULATOR_VOLTAGE,
0335 .owner = THIS_MODULE,
0336 .enable_reg = LP8788_EN_LDO_B,
0337 .enable_mask = LP8788_EN_DLDO12_M,
0338 .min_uV = 2500000,
0339 },
0340 };
0341
0342 static const struct regulator_desc lp8788_aldo_desc[] = {
0343 {
0344 .name = "aldo1",
0345 .id = ALDO1,
0346 .ops = &lp8788_ldo_voltage_table_ops,
0347 .n_voltages = ARRAY_SIZE(lp8788_aldo1_vtbl),
0348 .volt_table = lp8788_aldo1_vtbl,
0349 .type = REGULATOR_VOLTAGE,
0350 .owner = THIS_MODULE,
0351 .vsel_reg = LP8788_ALDO1_VOUT,
0352 .vsel_mask = LP8788_VOUT_1BIT_M,
0353 .enable_reg = LP8788_EN_LDO_B,
0354 .enable_mask = LP8788_EN_ALDO1_M,
0355 },
0356 {
0357 .name = "aldo2",
0358 .id = ALDO2,
0359 .ops = &lp8788_ldo_voltage_fixed_ops,
0360 .n_voltages = 1,
0361 .type = REGULATOR_VOLTAGE,
0362 .owner = THIS_MODULE,
0363 .enable_reg = LP8788_EN_LDO_B,
0364 .enable_mask = LP8788_EN_ALDO2_M,
0365 .min_uV = 2850000,
0366 },
0367 {
0368 .name = "aldo3",
0369 .id = ALDO3,
0370 .ops = &lp8788_ldo_voltage_fixed_ops,
0371 .n_voltages = 1,
0372 .type = REGULATOR_VOLTAGE,
0373 .owner = THIS_MODULE,
0374 .enable_reg = LP8788_EN_LDO_B,
0375 .enable_mask = LP8788_EN_ALDO3_M,
0376 .min_uV = 2850000,
0377 },
0378 {
0379 .name = "aldo4",
0380 .id = ALDO4,
0381 .ops = &lp8788_ldo_voltage_fixed_ops,
0382 .n_voltages = 1,
0383 .type = REGULATOR_VOLTAGE,
0384 .owner = THIS_MODULE,
0385 .enable_reg = LP8788_EN_LDO_B,
0386 .enable_mask = LP8788_EN_ALDO4_M,
0387 .min_uV = 2850000,
0388 },
0389 {
0390 .name = "aldo5",
0391 .id = ALDO5,
0392 .ops = &lp8788_ldo_voltage_fixed_ops,
0393 .n_voltages = 1,
0394 .type = REGULATOR_VOLTAGE,
0395 .owner = THIS_MODULE,
0396 .enable_reg = LP8788_EN_LDO_C,
0397 .enable_mask = LP8788_EN_ALDO5_M,
0398 .min_uV = 2850000,
0399 },
0400 {
0401 .name = "aldo6",
0402 .id = ALDO6,
0403 .ops = &lp8788_ldo_voltage_table_ops,
0404 .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
0405 .volt_table = lp8788_dldo578_aldo6_vtbl,
0406 .type = REGULATOR_VOLTAGE,
0407 .owner = THIS_MODULE,
0408 .vsel_reg = LP8788_ALDO6_VOUT,
0409 .vsel_mask = LP8788_VOUT_4BIT_M,
0410 .enable_reg = LP8788_EN_LDO_C,
0411 .enable_mask = LP8788_EN_ALDO6_M,
0412 },
0413 {
0414 .name = "aldo7",
0415 .id = ALDO7,
0416 .ops = &lp8788_ldo_voltage_table_ops,
0417 .n_voltages = ARRAY_SIZE(lp8788_aldo7_vtbl),
0418 .volt_table = lp8788_aldo7_vtbl,
0419 .type = REGULATOR_VOLTAGE,
0420 .owner = THIS_MODULE,
0421 .vsel_reg = LP8788_ALDO7_VOUT,
0422 .vsel_mask = LP8788_VOUT_3BIT_M,
0423 .enable_reg = LP8788_EN_LDO_C,
0424 .enable_mask = LP8788_EN_ALDO7_M,
0425 },
0426 {
0427 .name = "aldo8",
0428 .id = ALDO8,
0429 .ops = &lp8788_ldo_voltage_fixed_ops,
0430 .n_voltages = 1,
0431 .type = REGULATOR_VOLTAGE,
0432 .owner = THIS_MODULE,
0433 .enable_reg = LP8788_EN_LDO_C,
0434 .enable_mask = LP8788_EN_ALDO8_M,
0435 .min_uV = 2500000,
0436 },
0437 {
0438 .name = "aldo9",
0439 .id = ALDO9,
0440 .ops = &lp8788_ldo_voltage_fixed_ops,
0441 .n_voltages = 1,
0442 .type = REGULATOR_VOLTAGE,
0443 .owner = THIS_MODULE,
0444 .enable_reg = LP8788_EN_LDO_C,
0445 .enable_mask = LP8788_EN_ALDO9_M,
0446 .min_uV = 2500000,
0447 },
0448 {
0449 .name = "aldo10",
0450 .id = ALDO10,
0451 .ops = &lp8788_ldo_voltage_fixed_ops,
0452 .n_voltages = 1,
0453 .type = REGULATOR_VOLTAGE,
0454 .owner = THIS_MODULE,
0455 .enable_reg = LP8788_EN_LDO_C,
0456 .enable_mask = LP8788_EN_ALDO10_M,
0457 .min_uV = 1100000,
0458 },
0459 };
0460
0461 static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
0462 struct lp8788_ldo *ldo,
0463 enum lp8788_ldo_id id)
0464 {
0465 struct lp8788 *lp = ldo->lp;
0466 enum lp8788_ext_ldo_en_id enable_id;
0467 static const u8 en_mask[] = {
0468 [EN_ALDO1] = LP8788_EN_SEL_ALDO1_M,
0469 [EN_ALDO234] = LP8788_EN_SEL_ALDO234_M,
0470 [EN_ALDO5] = LP8788_EN_SEL_ALDO5_M,
0471 [EN_ALDO7] = LP8788_EN_SEL_ALDO7_M,
0472 [EN_DLDO7] = LP8788_EN_SEL_DLDO7_M,
0473 [EN_DLDO911] = LP8788_EN_SEL_DLDO911_M,
0474 };
0475
0476 switch (id) {
0477 case DLDO7:
0478 enable_id = EN_DLDO7;
0479 break;
0480 case DLDO9:
0481 case DLDO11:
0482 enable_id = EN_DLDO911;
0483 break;
0484 case ALDO1:
0485 enable_id = EN_ALDO1;
0486 break;
0487 case ALDO2 ... ALDO4:
0488 enable_id = EN_ALDO234;
0489 break;
0490 case ALDO5:
0491 enable_id = EN_ALDO5;
0492 break;
0493 case ALDO7:
0494 enable_id = EN_ALDO7;
0495 break;
0496 default:
0497 return 0;
0498 }
0499
0500
0501
0502
0503
0504
0505 ldo->ena_gpiod = gpiod_get_index_optional(&pdev->dev,
0506 "enable",
0507 enable_id,
0508 GPIOD_OUT_HIGH |
0509 GPIOD_FLAGS_BIT_NONEXCLUSIVE);
0510 if (IS_ERR(ldo->ena_gpiod))
0511 return PTR_ERR(ldo->ena_gpiod);
0512
0513
0514 if (!ldo->ena_gpiod)
0515 goto set_default_ldo_enable_mode;
0516
0517 return 0;
0518
0519 set_default_ldo_enable_mode:
0520 return lp8788_update_bits(lp, LP8788_EN_SEL, en_mask[enable_id], 0);
0521 }
0522
0523 static int lp8788_dldo_probe(struct platform_device *pdev)
0524 {
0525 struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
0526 int id = pdev->id;
0527 struct lp8788_ldo *ldo;
0528 struct regulator_config cfg = { };
0529 struct regulator_dev *rdev;
0530 int ret;
0531
0532 ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
0533 if (!ldo)
0534 return -ENOMEM;
0535
0536 ldo->lp = lp;
0537 ret = lp8788_config_ldo_enable_mode(pdev, ldo, id);
0538 if (ret)
0539 return ret;
0540
0541 if (ldo->ena_gpiod)
0542 cfg.ena_gpiod = ldo->ena_gpiod;
0543
0544 cfg.dev = pdev->dev.parent;
0545 cfg.init_data = lp->pdata ? lp->pdata->dldo_data[id] : NULL;
0546 cfg.driver_data = ldo;
0547 cfg.regmap = lp->regmap;
0548
0549 rdev = devm_regulator_register(&pdev->dev, &lp8788_dldo_desc[id], &cfg);
0550 if (IS_ERR(rdev)) {
0551 ret = PTR_ERR(rdev);
0552 dev_err(&pdev->dev, "DLDO%d regulator register err = %d\n",
0553 id + 1, ret);
0554 return ret;
0555 }
0556
0557 ldo->regulator = rdev;
0558 platform_set_drvdata(pdev, ldo);
0559
0560 return 0;
0561 }
0562
0563 static struct platform_driver lp8788_dldo_driver = {
0564 .probe = lp8788_dldo_probe,
0565 .driver = {
0566 .name = LP8788_DEV_DLDO,
0567 },
0568 };
0569
0570 static int lp8788_aldo_probe(struct platform_device *pdev)
0571 {
0572 struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
0573 int id = pdev->id;
0574 struct lp8788_ldo *ldo;
0575 struct regulator_config cfg = { };
0576 struct regulator_dev *rdev;
0577 int ret;
0578
0579 ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
0580 if (!ldo)
0581 return -ENOMEM;
0582
0583 ldo->lp = lp;
0584 ret = lp8788_config_ldo_enable_mode(pdev, ldo, id + ALDO1);
0585 if (ret)
0586 return ret;
0587
0588 if (ldo->ena_gpiod)
0589 cfg.ena_gpiod = ldo->ena_gpiod;
0590
0591 cfg.dev = pdev->dev.parent;
0592 cfg.init_data = lp->pdata ? lp->pdata->aldo_data[id] : NULL;
0593 cfg.driver_data = ldo;
0594 cfg.regmap = lp->regmap;
0595
0596 rdev = devm_regulator_register(&pdev->dev, &lp8788_aldo_desc[id], &cfg);
0597 if (IS_ERR(rdev)) {
0598 ret = PTR_ERR(rdev);
0599 dev_err(&pdev->dev, "ALDO%d regulator register err = %d\n",
0600 id + 1, ret);
0601 return ret;
0602 }
0603
0604 ldo->regulator = rdev;
0605 platform_set_drvdata(pdev, ldo);
0606
0607 return 0;
0608 }
0609
0610 static struct platform_driver lp8788_aldo_driver = {
0611 .probe = lp8788_aldo_probe,
0612 .driver = {
0613 .name = LP8788_DEV_ALDO,
0614 },
0615 };
0616
0617 static struct platform_driver * const drivers[] = {
0618 &lp8788_dldo_driver,
0619 &lp8788_aldo_driver,
0620 };
0621
0622 static int __init lp8788_ldo_init(void)
0623 {
0624 return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
0625 }
0626 subsys_initcall(lp8788_ldo_init);
0627
0628 static void __exit lp8788_ldo_exit(void)
0629 {
0630 platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
0631 }
0632 module_exit(lp8788_ldo_exit);
0633
0634 MODULE_DESCRIPTION("TI LP8788 LDO Driver");
0635 MODULE_AUTHOR("Milo Kim");
0636 MODULE_LICENSE("GPL");
0637 MODULE_ALIAS("platform:lp8788-dldo");
0638 MODULE_ALIAS("platform:lp8788-aldo");