1/* 2 * Copyright 2012 Texas Instruments 3 * 4 * Author: Milo(Woogyom) Kim <milo.kim@ti.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 */ 11 12#include <linux/module.h> 13#include <linux/slab.h> 14#include <linux/i2c.h> 15#include <linux/regmap.h> 16#include <linux/err.h> 17#include <linux/gpio.h> 18#include <linux/regulator/lp872x.h> 19#include <linux/regulator/driver.h> 20#include <linux/platform_device.h> 21#include <linux/of.h> 22#include <linux/of_gpio.h> 23#include <linux/regulator/of_regulator.h> 24 25/* Registers : LP8720/8725 shared */ 26#define LP872X_GENERAL_CFG 0x00 27#define LP872X_LDO1_VOUT 0x01 28#define LP872X_LDO2_VOUT 0x02 29#define LP872X_LDO3_VOUT 0x03 30#define LP872X_LDO4_VOUT 0x04 31#define LP872X_LDO5_VOUT 0x05 32 33/* Registers : LP8720 */ 34#define LP8720_BUCK_VOUT1 0x06 35#define LP8720_BUCK_VOUT2 0x07 36#define LP8720_ENABLE 0x08 37 38/* Registers : LP8725 */ 39#define LP8725_LILO1_VOUT 0x06 40#define LP8725_LILO2_VOUT 0x07 41#define LP8725_BUCK1_VOUT1 0x08 42#define LP8725_BUCK1_VOUT2 0x09 43#define LP8725_BUCK2_VOUT1 0x0A 44#define LP8725_BUCK2_VOUT2 0x0B 45#define LP8725_BUCK_CTRL 0x0C 46#define LP8725_LDO_CTRL 0x0D 47 48/* Mask/shift : LP8720/LP8725 shared */ 49#define LP872X_VOUT_M 0x1F 50#define LP872X_START_DELAY_M 0xE0 51#define LP872X_START_DELAY_S 5 52#define LP872X_EN_LDO1_M BIT(0) 53#define LP872X_EN_LDO2_M BIT(1) 54#define LP872X_EN_LDO3_M BIT(2) 55#define LP872X_EN_LDO4_M BIT(3) 56#define LP872X_EN_LDO5_M BIT(4) 57 58/* Mask/shift : LP8720 */ 59#define LP8720_TIMESTEP_S 0 /* Addr 00h */ 60#define LP8720_TIMESTEP_M BIT(0) 61#define LP8720_EXT_DVS_M BIT(2) 62#define LP8720_BUCK_FPWM_S 5 /* Addr 07h */ 63#define LP8720_BUCK_FPWM_M BIT(5) 64#define LP8720_EN_BUCK_M BIT(5) /* Addr 08h */ 65#define LP8720_DVS_SEL_M BIT(7) 66 67/* Mask/shift : LP8725 */ 68#define LP8725_TIMESTEP_M 0xC0 /* Addr 00h */ 69#define LP8725_TIMESTEP_S 6 70#define LP8725_BUCK1_EN_M BIT(0) 71#define LP8725_DVS1_M BIT(2) 72#define LP8725_DVS2_M BIT(3) 73#define LP8725_BUCK2_EN_M BIT(4) 74#define LP8725_BUCK_CL_M 0xC0 /* Addr 09h, 0Bh */ 75#define LP8725_BUCK_CL_S 6 76#define LP8725_BUCK1_FPWM_S 1 /* Addr 0Ch */ 77#define LP8725_BUCK1_FPWM_M BIT(1) 78#define LP8725_BUCK2_FPWM_S 5 79#define LP8725_BUCK2_FPWM_M BIT(5) 80#define LP8725_EN_LILO1_M BIT(5) /* Addr 0Dh */ 81#define LP8725_EN_LILO2_M BIT(6) 82 83/* PWM mode */ 84#define LP872X_FORCE_PWM 1 85#define LP872X_AUTO_PWM 0 86 87#define LP8720_NUM_REGULATORS 6 88#define LP8725_NUM_REGULATORS 9 89#define EXTERN_DVS_USED 0 90#define MAX_DELAY 6 91 92/* Default DVS Mode */ 93#define LP8720_DEFAULT_DVS 0 94#define LP8725_DEFAULT_DVS BIT(2) 95 96/* dump registers in regmap-debugfs */ 97#define MAX_REGISTERS 0x0F 98 99enum lp872x_id { 100 LP8720, 101 LP8725, 102}; 103 104struct lp872x { 105 struct regmap *regmap; 106 struct device *dev; 107 enum lp872x_id chipid; 108 struct lp872x_platform_data *pdata; 109 int num_regulators; 110 enum lp872x_dvs_state dvs_pin; 111 int dvs_gpio; 112}; 113 114/* LP8720/LP8725 shared voltage table for LDOs */ 115static const unsigned int lp872x_ldo_vtbl[] = { 116 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000, 1550000, 117 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000, 2000000, 118 2100000, 2200000, 2300000, 2400000, 2500000, 2600000, 2650000, 2700000, 119 2750000, 2800000, 2850000, 2900000, 2950000, 3000000, 3100000, 3300000, 120}; 121 122/* LP8720 LDO4 voltage table */ 123static const unsigned int lp8720_ldo4_vtbl[] = { 124 800000, 850000, 900000, 1000000, 1100000, 1200000, 1250000, 1300000, 125 1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000, 126 1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000, 127 2400000, 2500000, 2600000, 2650000, 2700000, 2750000, 2800000, 2850000, 128}; 129 130/* LP8725 LILO(Low Input Low Output) voltage table */ 131static const unsigned int lp8725_lilo_vtbl[] = { 132 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000, 1150000, 133 1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000, 134 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000, 135 2600000, 2700000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000, 136}; 137 138/* LP8720 BUCK voltage table */ 139#define EXT_R 0 /* external resistor divider */ 140static const unsigned int lp8720_buck_vtbl[] = { 141 EXT_R, 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000, 142 1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000, 143 1550000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000, 144 1950000, 2000000, 2050000, 2100000, 2150000, 2200000, 2250000, 2300000, 145}; 146 147/* LP8725 BUCK voltage table */ 148static const unsigned int lp8725_buck_vtbl[] = { 149 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000, 1150000, 150 1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000, 151 1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000, 152 2400000, 2500000, 2600000, 2700000, 2800000, 2850000, 2900000, 3000000, 153}; 154 155/* LP8725 BUCK current limit */ 156static const unsigned int lp8725_buck_uA[] = { 157 460000, 780000, 1050000, 1370000, 158}; 159 160static int lp872x_read_byte(struct lp872x *lp, u8 addr, u8 *data) 161{ 162 int ret; 163 unsigned int val; 164 165 ret = regmap_read(lp->regmap, addr, &val); 166 if (ret < 0) { 167 dev_err(lp->dev, "failed to read 0x%.2x\n", addr); 168 return ret; 169 } 170 171 *data = (u8)val; 172 return 0; 173} 174 175static inline int lp872x_write_byte(struct lp872x *lp, u8 addr, u8 data) 176{ 177 return regmap_write(lp->regmap, addr, data); 178} 179 180static inline int lp872x_update_bits(struct lp872x *lp, u8 addr, 181 unsigned int mask, u8 data) 182{ 183 return regmap_update_bits(lp->regmap, addr, mask, data); 184} 185 186static int lp872x_get_timestep_usec(struct lp872x *lp) 187{ 188 enum lp872x_id chip = lp->chipid; 189 u8 val, mask, shift; 190 int *time_usec, size, ret; 191 int lp8720_time_usec[] = { 25, 50 }; 192 int lp8725_time_usec[] = { 32, 64, 128, 256 }; 193 194 switch (chip) { 195 case LP8720: 196 mask = LP8720_TIMESTEP_M; 197 shift = LP8720_TIMESTEP_S; 198 time_usec = &lp8720_time_usec[0]; 199 size = ARRAY_SIZE(lp8720_time_usec); 200 break; 201 case LP8725: 202 mask = LP8725_TIMESTEP_M; 203 shift = LP8725_TIMESTEP_S; 204 time_usec = &lp8725_time_usec[0]; 205 size = ARRAY_SIZE(lp8725_time_usec); 206 break; 207 default: 208 return -EINVAL; 209 } 210 211 ret = lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val); 212 if (ret) 213 return ret; 214 215 val = (val & mask) >> shift; 216 if (val >= size) 217 return -EINVAL; 218 219 return *(time_usec + val); 220} 221 222static int lp872x_regulator_enable_time(struct regulator_dev *rdev) 223{ 224 struct lp872x *lp = rdev_get_drvdata(rdev); 225 enum lp872x_regulator_id rid = rdev_get_id(rdev); 226 int time_step_us = lp872x_get_timestep_usec(lp); 227 int ret; 228 u8 addr, val; 229 230 if (time_step_us < 0) 231 return time_step_us; 232 233 switch (rid) { 234 case LP8720_ID_LDO1 ... LP8720_ID_BUCK: 235 addr = LP872X_LDO1_VOUT + rid; 236 break; 237 case LP8725_ID_LDO1 ... LP8725_ID_BUCK1: 238 addr = LP872X_LDO1_VOUT + rid - LP8725_ID_BASE; 239 break; 240 case LP8725_ID_BUCK2: 241 addr = LP8725_BUCK2_VOUT1; 242 break; 243 default: 244 return -EINVAL; 245 } 246 247 ret = lp872x_read_byte(lp, addr, &val); 248 if (ret) 249 return ret; 250 251 val = (val & LP872X_START_DELAY_M) >> LP872X_START_DELAY_S; 252 253 return val > MAX_DELAY ? 0 : val * time_step_us; 254} 255 256static void lp872x_set_dvs(struct lp872x *lp, enum lp872x_dvs_sel dvs_sel, 257 int gpio) 258{ 259 enum lp872x_dvs_state state; 260 261 state = dvs_sel == SEL_V1 ? DVS_HIGH : DVS_LOW; 262 gpio_set_value(gpio, state); 263 lp->dvs_pin = state; 264} 265 266static u8 lp872x_select_buck_vout_addr(struct lp872x *lp, 267 enum lp872x_regulator_id buck) 268{ 269 u8 val, addr; 270 271 if (lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val)) 272 return 0; 273 274 switch (buck) { 275 case LP8720_ID_BUCK: 276 if (val & LP8720_EXT_DVS_M) { 277 addr = (lp->dvs_pin == DVS_HIGH) ? 278 LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2; 279 } else { 280 if (lp872x_read_byte(lp, LP8720_ENABLE, &val)) 281 return 0; 282 283 addr = val & LP8720_DVS_SEL_M ? 284 LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2; 285 } 286 break; 287 case LP8725_ID_BUCK1: 288 if (val & LP8725_DVS1_M) 289 addr = LP8725_BUCK1_VOUT1; 290 else 291 addr = (lp->dvs_pin == DVS_HIGH) ? 292 LP8725_BUCK1_VOUT1 : LP8725_BUCK1_VOUT2; 293 break; 294 case LP8725_ID_BUCK2: 295 addr = val & LP8725_DVS2_M ? 296 LP8725_BUCK2_VOUT1 : LP8725_BUCK2_VOUT2; 297 break; 298 default: 299 return 0; 300 } 301 302 return addr; 303} 304 305static bool lp872x_is_valid_buck_addr(u8 addr) 306{ 307 switch (addr) { 308 case LP8720_BUCK_VOUT1: 309 case LP8720_BUCK_VOUT2: 310 case LP8725_BUCK1_VOUT1: 311 case LP8725_BUCK1_VOUT2: 312 case LP8725_BUCK2_VOUT1: 313 case LP8725_BUCK2_VOUT2: 314 return true; 315 default: 316 return false; 317 } 318} 319 320static int lp872x_buck_set_voltage_sel(struct regulator_dev *rdev, 321 unsigned selector) 322{ 323 struct lp872x *lp = rdev_get_drvdata(rdev); 324 enum lp872x_regulator_id buck = rdev_get_id(rdev); 325 u8 addr, mask = LP872X_VOUT_M; 326 struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL; 327 328 if (dvs && gpio_is_valid(dvs->gpio)) 329 lp872x_set_dvs(lp, dvs->vsel, dvs->gpio); 330 331 addr = lp872x_select_buck_vout_addr(lp, buck); 332 if (!lp872x_is_valid_buck_addr(addr)) 333 return -EINVAL; 334 335 return lp872x_update_bits(lp, addr, mask, selector); 336} 337 338static int lp872x_buck_get_voltage_sel(struct regulator_dev *rdev) 339{ 340 struct lp872x *lp = rdev_get_drvdata(rdev); 341 enum lp872x_regulator_id buck = rdev_get_id(rdev); 342 u8 addr, val; 343 int ret; 344 345 addr = lp872x_select_buck_vout_addr(lp, buck); 346 if (!lp872x_is_valid_buck_addr(addr)) 347 return -EINVAL; 348 349 ret = lp872x_read_byte(lp, addr, &val); 350 if (ret) 351 return ret; 352 353 return val & LP872X_VOUT_M; 354} 355 356static int lp8725_buck_set_current_limit(struct regulator_dev *rdev, 357 int min_uA, int max_uA) 358{ 359 struct lp872x *lp = rdev_get_drvdata(rdev); 360 enum lp872x_regulator_id buck = rdev_get_id(rdev); 361 int i; 362 u8 addr; 363 364 switch (buck) { 365 case LP8725_ID_BUCK1: 366 addr = LP8725_BUCK1_VOUT2; 367 break; 368 case LP8725_ID_BUCK2: 369 addr = LP8725_BUCK2_VOUT2; 370 break; 371 default: 372 return -EINVAL; 373 } 374 375 for (i = ARRAY_SIZE(lp8725_buck_uA) - 1; i >= 0; i--) { 376 if (lp8725_buck_uA[i] >= min_uA && 377 lp8725_buck_uA[i] <= max_uA) 378 return lp872x_update_bits(lp, addr, 379 LP8725_BUCK_CL_M, 380 i << LP8725_BUCK_CL_S); 381 } 382 383 return -EINVAL; 384} 385 386static int lp8725_buck_get_current_limit(struct regulator_dev *rdev) 387{ 388 struct lp872x *lp = rdev_get_drvdata(rdev); 389 enum lp872x_regulator_id buck = rdev_get_id(rdev); 390 u8 addr, val; 391 int ret; 392 393 switch (buck) { 394 case LP8725_ID_BUCK1: 395 addr = LP8725_BUCK1_VOUT2; 396 break; 397 case LP8725_ID_BUCK2: 398 addr = LP8725_BUCK2_VOUT2; 399 break; 400 default: 401 return -EINVAL; 402 } 403 404 ret = lp872x_read_byte(lp, addr, &val); 405 if (ret) 406 return ret; 407 408 val = (val & LP8725_BUCK_CL_M) >> LP8725_BUCK_CL_S; 409 410 return (val < ARRAY_SIZE(lp8725_buck_uA)) ? 411 lp8725_buck_uA[val] : -EINVAL; 412} 413 414static int lp872x_buck_set_mode(struct regulator_dev *rdev, unsigned int mode) 415{ 416 struct lp872x *lp = rdev_get_drvdata(rdev); 417 enum lp872x_regulator_id buck = rdev_get_id(rdev); 418 u8 addr, mask, shift, val; 419 420 switch (buck) { 421 case LP8720_ID_BUCK: 422 addr = LP8720_BUCK_VOUT2; 423 mask = LP8720_BUCK_FPWM_M; 424 shift = LP8720_BUCK_FPWM_S; 425 break; 426 case LP8725_ID_BUCK1: 427 addr = LP8725_BUCK_CTRL; 428 mask = LP8725_BUCK1_FPWM_M; 429 shift = LP8725_BUCK1_FPWM_S; 430 break; 431 case LP8725_ID_BUCK2: 432 addr = LP8725_BUCK_CTRL; 433 mask = LP8725_BUCK2_FPWM_M; 434 shift = LP8725_BUCK2_FPWM_S; 435 break; 436 default: 437 return -EINVAL; 438 } 439 440 if (mode == REGULATOR_MODE_FAST) 441 val = LP872X_FORCE_PWM << shift; 442 else if (mode == REGULATOR_MODE_NORMAL) 443 val = LP872X_AUTO_PWM << shift; 444 else 445 return -EINVAL; 446 447 return lp872x_update_bits(lp, addr, mask, val); 448} 449 450static unsigned int lp872x_buck_get_mode(struct regulator_dev *rdev) 451{ 452 struct lp872x *lp = rdev_get_drvdata(rdev); 453 enum lp872x_regulator_id buck = rdev_get_id(rdev); 454 u8 addr, mask, val; 455 int ret; 456 457 switch (buck) { 458 case LP8720_ID_BUCK: 459 addr = LP8720_BUCK_VOUT2; 460 mask = LP8720_BUCK_FPWM_M; 461 break; 462 case LP8725_ID_BUCK1: 463 addr = LP8725_BUCK_CTRL; 464 mask = LP8725_BUCK1_FPWM_M; 465 break; 466 case LP8725_ID_BUCK2: 467 addr = LP8725_BUCK_CTRL; 468 mask = LP8725_BUCK2_FPWM_M; 469 break; 470 default: 471 return -EINVAL; 472 } 473 474 ret = lp872x_read_byte(lp, addr, &val); 475 if (ret) 476 return ret; 477 478 return val & mask ? REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL; 479} 480 481static struct regulator_ops lp872x_ldo_ops = { 482 .list_voltage = regulator_list_voltage_table, 483 .map_voltage = regulator_map_voltage_ascend, 484 .set_voltage_sel = regulator_set_voltage_sel_regmap, 485 .get_voltage_sel = regulator_get_voltage_sel_regmap, 486 .enable = regulator_enable_regmap, 487 .disable = regulator_disable_regmap, 488 .is_enabled = regulator_is_enabled_regmap, 489 .enable_time = lp872x_regulator_enable_time, 490}; 491 492static struct regulator_ops lp8720_buck_ops = { 493 .list_voltage = regulator_list_voltage_table, 494 .map_voltage = regulator_map_voltage_ascend, 495 .set_voltage_sel = lp872x_buck_set_voltage_sel, 496 .get_voltage_sel = lp872x_buck_get_voltage_sel, 497 .enable = regulator_enable_regmap, 498 .disable = regulator_disable_regmap, 499 .is_enabled = regulator_is_enabled_regmap, 500 .enable_time = lp872x_regulator_enable_time, 501 .set_mode = lp872x_buck_set_mode, 502 .get_mode = lp872x_buck_get_mode, 503}; 504 505static struct regulator_ops lp8725_buck_ops = { 506 .list_voltage = regulator_list_voltage_table, 507 .map_voltage = regulator_map_voltage_ascend, 508 .set_voltage_sel = lp872x_buck_set_voltage_sel, 509 .get_voltage_sel = lp872x_buck_get_voltage_sel, 510 .enable = regulator_enable_regmap, 511 .disable = regulator_disable_regmap, 512 .is_enabled = regulator_is_enabled_regmap, 513 .enable_time = lp872x_regulator_enable_time, 514 .set_mode = lp872x_buck_set_mode, 515 .get_mode = lp872x_buck_get_mode, 516 .set_current_limit = lp8725_buck_set_current_limit, 517 .get_current_limit = lp8725_buck_get_current_limit, 518}; 519 520static struct regulator_desc lp8720_regulator_desc[] = { 521 { 522 .name = "ldo1", 523 .id = LP8720_ID_LDO1, 524 .ops = &lp872x_ldo_ops, 525 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 526 .volt_table = lp872x_ldo_vtbl, 527 .type = REGULATOR_VOLTAGE, 528 .owner = THIS_MODULE, 529 .vsel_reg = LP872X_LDO1_VOUT, 530 .vsel_mask = LP872X_VOUT_M, 531 .enable_reg = LP8720_ENABLE, 532 .enable_mask = LP872X_EN_LDO1_M, 533 }, 534 { 535 .name = "ldo2", 536 .id = LP8720_ID_LDO2, 537 .ops = &lp872x_ldo_ops, 538 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 539 .volt_table = lp872x_ldo_vtbl, 540 .type = REGULATOR_VOLTAGE, 541 .owner = THIS_MODULE, 542 .vsel_reg = LP872X_LDO2_VOUT, 543 .vsel_mask = LP872X_VOUT_M, 544 .enable_reg = LP8720_ENABLE, 545 .enable_mask = LP872X_EN_LDO2_M, 546 }, 547 { 548 .name = "ldo3", 549 .id = LP8720_ID_LDO3, 550 .ops = &lp872x_ldo_ops, 551 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 552 .volt_table = lp872x_ldo_vtbl, 553 .type = REGULATOR_VOLTAGE, 554 .owner = THIS_MODULE, 555 .vsel_reg = LP872X_LDO3_VOUT, 556 .vsel_mask = LP872X_VOUT_M, 557 .enable_reg = LP8720_ENABLE, 558 .enable_mask = LP872X_EN_LDO3_M, 559 }, 560 { 561 .name = "ldo4", 562 .id = LP8720_ID_LDO4, 563 .ops = &lp872x_ldo_ops, 564 .n_voltages = ARRAY_SIZE(lp8720_ldo4_vtbl), 565 .volt_table = lp8720_ldo4_vtbl, 566 .type = REGULATOR_VOLTAGE, 567 .owner = THIS_MODULE, 568 .vsel_reg = LP872X_LDO4_VOUT, 569 .vsel_mask = LP872X_VOUT_M, 570 .enable_reg = LP8720_ENABLE, 571 .enable_mask = LP872X_EN_LDO4_M, 572 }, 573 { 574 .name = "ldo5", 575 .id = LP8720_ID_LDO5, 576 .ops = &lp872x_ldo_ops, 577 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 578 .volt_table = lp872x_ldo_vtbl, 579 .type = REGULATOR_VOLTAGE, 580 .owner = THIS_MODULE, 581 .vsel_reg = LP872X_LDO5_VOUT, 582 .vsel_mask = LP872X_VOUT_M, 583 .enable_reg = LP8720_ENABLE, 584 .enable_mask = LP872X_EN_LDO5_M, 585 }, 586 { 587 .name = "buck", 588 .id = LP8720_ID_BUCK, 589 .ops = &lp8720_buck_ops, 590 .n_voltages = ARRAY_SIZE(lp8720_buck_vtbl), 591 .volt_table = lp8720_buck_vtbl, 592 .type = REGULATOR_VOLTAGE, 593 .owner = THIS_MODULE, 594 .enable_reg = LP8720_ENABLE, 595 .enable_mask = LP8720_EN_BUCK_M, 596 }, 597}; 598 599static struct regulator_desc lp8725_regulator_desc[] = { 600 { 601 .name = "ldo1", 602 .id = LP8725_ID_LDO1, 603 .ops = &lp872x_ldo_ops, 604 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 605 .volt_table = lp872x_ldo_vtbl, 606 .type = REGULATOR_VOLTAGE, 607 .owner = THIS_MODULE, 608 .vsel_reg = LP872X_LDO1_VOUT, 609 .vsel_mask = LP872X_VOUT_M, 610 .enable_reg = LP8725_LDO_CTRL, 611 .enable_mask = LP872X_EN_LDO1_M, 612 }, 613 { 614 .name = "ldo2", 615 .id = LP8725_ID_LDO2, 616 .ops = &lp872x_ldo_ops, 617 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 618 .volt_table = lp872x_ldo_vtbl, 619 .type = REGULATOR_VOLTAGE, 620 .owner = THIS_MODULE, 621 .vsel_reg = LP872X_LDO2_VOUT, 622 .vsel_mask = LP872X_VOUT_M, 623 .enable_reg = LP8725_LDO_CTRL, 624 .enable_mask = LP872X_EN_LDO2_M, 625 }, 626 { 627 .name = "ldo3", 628 .id = LP8725_ID_LDO3, 629 .ops = &lp872x_ldo_ops, 630 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 631 .volt_table = lp872x_ldo_vtbl, 632 .type = REGULATOR_VOLTAGE, 633 .owner = THIS_MODULE, 634 .vsel_reg = LP872X_LDO3_VOUT, 635 .vsel_mask = LP872X_VOUT_M, 636 .enable_reg = LP8725_LDO_CTRL, 637 .enable_mask = LP872X_EN_LDO3_M, 638 }, 639 { 640 .name = "ldo4", 641 .id = LP8725_ID_LDO4, 642 .ops = &lp872x_ldo_ops, 643 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 644 .volt_table = lp872x_ldo_vtbl, 645 .type = REGULATOR_VOLTAGE, 646 .owner = THIS_MODULE, 647 .vsel_reg = LP872X_LDO4_VOUT, 648 .vsel_mask = LP872X_VOUT_M, 649 .enable_reg = LP8725_LDO_CTRL, 650 .enable_mask = LP872X_EN_LDO4_M, 651 }, 652 { 653 .name = "ldo5", 654 .id = LP8725_ID_LDO5, 655 .ops = &lp872x_ldo_ops, 656 .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl), 657 .volt_table = lp872x_ldo_vtbl, 658 .type = REGULATOR_VOLTAGE, 659 .owner = THIS_MODULE, 660 .vsel_reg = LP872X_LDO5_VOUT, 661 .vsel_mask = LP872X_VOUT_M, 662 .enable_reg = LP8725_LDO_CTRL, 663 .enable_mask = LP872X_EN_LDO5_M, 664 }, 665 { 666 .name = "lilo1", 667 .id = LP8725_ID_LILO1, 668 .ops = &lp872x_ldo_ops, 669 .n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl), 670 .volt_table = lp8725_lilo_vtbl, 671 .type = REGULATOR_VOLTAGE, 672 .owner = THIS_MODULE, 673 .vsel_reg = LP8725_LILO1_VOUT, 674 .vsel_mask = LP872X_VOUT_M, 675 .enable_reg = LP8725_LDO_CTRL, 676 .enable_mask = LP8725_EN_LILO1_M, 677 }, 678 { 679 .name = "lilo2", 680 .id = LP8725_ID_LILO2, 681 .ops = &lp872x_ldo_ops, 682 .n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl), 683 .volt_table = lp8725_lilo_vtbl, 684 .type = REGULATOR_VOLTAGE, 685 .owner = THIS_MODULE, 686 .vsel_reg = LP8725_LILO2_VOUT, 687 .vsel_mask = LP872X_VOUT_M, 688 .enable_reg = LP8725_LDO_CTRL, 689 .enable_mask = LP8725_EN_LILO2_M, 690 }, 691 { 692 .name = "buck1", 693 .id = LP8725_ID_BUCK1, 694 .ops = &lp8725_buck_ops, 695 .n_voltages = ARRAY_SIZE(lp8725_buck_vtbl), 696 .volt_table = lp8725_buck_vtbl, 697 .type = REGULATOR_VOLTAGE, 698 .owner = THIS_MODULE, 699 .enable_reg = LP872X_GENERAL_CFG, 700 .enable_mask = LP8725_BUCK1_EN_M, 701 }, 702 { 703 .name = "buck2", 704 .id = LP8725_ID_BUCK2, 705 .ops = &lp8725_buck_ops, 706 .n_voltages = ARRAY_SIZE(lp8725_buck_vtbl), 707 .volt_table = lp8725_buck_vtbl, 708 .type = REGULATOR_VOLTAGE, 709 .owner = THIS_MODULE, 710 .enable_reg = LP872X_GENERAL_CFG, 711 .enable_mask = LP8725_BUCK2_EN_M, 712 }, 713}; 714 715static int lp872x_init_dvs(struct lp872x *lp) 716{ 717 int ret, gpio; 718 struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL; 719 enum lp872x_dvs_state pinstate; 720 u8 mask[] = { LP8720_EXT_DVS_M, LP8725_DVS1_M | LP8725_DVS2_M }; 721 u8 default_dvs_mode[] = { LP8720_DEFAULT_DVS, LP8725_DEFAULT_DVS }; 722 723 if (!dvs) 724 goto set_default_dvs_mode; 725 726 gpio = dvs->gpio; 727 if (!gpio_is_valid(gpio)) { 728 dev_warn(lp->dev, "invalid gpio: %d\n", gpio); 729 goto set_default_dvs_mode; 730 } 731 732 pinstate = dvs->init_state; 733 ret = devm_gpio_request_one(lp->dev, gpio, pinstate, "LP872X DVS"); 734 if (ret) { 735 dev_err(lp->dev, "gpio request err: %d\n", ret); 736 return ret; 737 } 738 739 lp->dvs_pin = pinstate; 740 lp->dvs_gpio = gpio; 741 742 return 0; 743 744set_default_dvs_mode: 745 return lp872x_update_bits(lp, LP872X_GENERAL_CFG, mask[lp->chipid], 746 default_dvs_mode[lp->chipid]); 747} 748 749static int lp872x_config(struct lp872x *lp) 750{ 751 struct lp872x_platform_data *pdata = lp->pdata; 752 int ret; 753 754 if (!pdata || !pdata->update_config) 755 goto init_dvs; 756 757 ret = lp872x_write_byte(lp, LP872X_GENERAL_CFG, pdata->general_config); 758 if (ret) 759 return ret; 760 761init_dvs: 762 return lp872x_init_dvs(lp); 763} 764 765static struct regulator_init_data 766*lp872x_find_regulator_init_data(int id, struct lp872x *lp) 767{ 768 struct lp872x_platform_data *pdata = lp->pdata; 769 int i; 770 771 if (!pdata) 772 return NULL; 773 774 for (i = 0; i < lp->num_regulators; i++) { 775 if (pdata->regulator_data[i].id == id) 776 return pdata->regulator_data[i].init_data; 777 } 778 779 return NULL; 780} 781 782static int lp872x_regulator_register(struct lp872x *lp) 783{ 784 struct regulator_desc *desc; 785 struct regulator_config cfg = { }; 786 struct regulator_dev *rdev; 787 int i; 788 789 for (i = 0; i < lp->num_regulators; i++) { 790 desc = (lp->chipid == LP8720) ? &lp8720_regulator_desc[i] : 791 &lp8725_regulator_desc[i]; 792 793 cfg.dev = lp->dev; 794 cfg.init_data = lp872x_find_regulator_init_data(desc->id, lp); 795 cfg.driver_data = lp; 796 cfg.regmap = lp->regmap; 797 798 rdev = devm_regulator_register(lp->dev, desc, &cfg); 799 if (IS_ERR(rdev)) { 800 dev_err(lp->dev, "regulator register err"); 801 return PTR_ERR(rdev); 802 } 803 } 804 805 return 0; 806} 807 808static const struct regmap_config lp872x_regmap_config = { 809 .reg_bits = 8, 810 .val_bits = 8, 811 .max_register = MAX_REGISTERS, 812}; 813 814#ifdef CONFIG_OF 815 816#define LP872X_VALID_OPMODE (REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL) 817 818static struct of_regulator_match lp8720_matches[] = { 819 { .name = "ldo1", .driver_data = (void *)LP8720_ID_LDO1, }, 820 { .name = "ldo2", .driver_data = (void *)LP8720_ID_LDO2, }, 821 { .name = "ldo3", .driver_data = (void *)LP8720_ID_LDO3, }, 822 { .name = "ldo4", .driver_data = (void *)LP8720_ID_LDO4, }, 823 { .name = "ldo5", .driver_data = (void *)LP8720_ID_LDO5, }, 824 { .name = "buck", .driver_data = (void *)LP8720_ID_BUCK, }, 825}; 826 827static struct of_regulator_match lp8725_matches[] = { 828 { .name = "ldo1", .driver_data = (void *)LP8725_ID_LDO1, }, 829 { .name = "ldo2", .driver_data = (void *)LP8725_ID_LDO2, }, 830 { .name = "ldo3", .driver_data = (void *)LP8725_ID_LDO3, }, 831 { .name = "ldo4", .driver_data = (void *)LP8725_ID_LDO4, }, 832 { .name = "ldo5", .driver_data = (void *)LP8725_ID_LDO5, }, 833 { .name = "lilo1", .driver_data = (void *)LP8725_ID_LILO1, }, 834 { .name = "lilo2", .driver_data = (void *)LP8725_ID_LILO2, }, 835 { .name = "buck1", .driver_data = (void *)LP8725_ID_BUCK1, }, 836 { .name = "buck2", .driver_data = (void *)LP8725_ID_BUCK2, }, 837}; 838 839static struct lp872x_platform_data 840*lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which) 841{ 842 struct device_node *np = dev->of_node; 843 struct lp872x_platform_data *pdata; 844 struct of_regulator_match *match; 845 int num_matches; 846 int count; 847 int i; 848 u8 dvs_state; 849 850 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 851 if (!pdata) 852 goto out; 853 854 of_property_read_u8(np, "ti,general-config", &pdata->general_config); 855 if (of_find_property(np, "ti,update-config", NULL)) 856 pdata->update_config = true; 857 858 pdata->dvs = devm_kzalloc(dev, sizeof(struct lp872x_dvs), GFP_KERNEL); 859 if (!pdata->dvs) 860 goto out; 861 862 pdata->dvs->gpio = of_get_named_gpio(np, "ti,dvs-gpio", 0); 863 of_property_read_u8(np, "ti,dvs-vsel", (u8 *)&pdata->dvs->vsel); 864 of_property_read_u8(np, "ti,dvs-state", &dvs_state); 865 pdata->dvs->init_state = dvs_state ? DVS_HIGH : DVS_LOW; 866 867 if (of_get_child_count(np) == 0) 868 goto out; 869 870 switch (which) { 871 case LP8720: 872 match = lp8720_matches; 873 num_matches = ARRAY_SIZE(lp8720_matches); 874 break; 875 case LP8725: 876 match = lp8725_matches; 877 num_matches = ARRAY_SIZE(lp8725_matches); 878 break; 879 default: 880 goto out; 881 } 882 883 count = of_regulator_match(dev, np, match, num_matches); 884 if (count <= 0) 885 goto out; 886 887 for (i = 0; i < num_matches; i++) { 888 pdata->regulator_data[i].id = 889 (enum lp872x_regulator_id)match[i].driver_data; 890 pdata->regulator_data[i].init_data = match[i].init_data; 891 } 892out: 893 return pdata; 894} 895#else 896static struct lp872x_platform_data 897*lp872x_populate_pdata_from_dt(struct device *dev, enum lp872x_id which) 898{ 899 return NULL; 900} 901#endif 902 903static int lp872x_probe(struct i2c_client *cl, const struct i2c_device_id *id) 904{ 905 struct lp872x *lp; 906 int ret; 907 const int lp872x_num_regulators[] = { 908 [LP8720] = LP8720_NUM_REGULATORS, 909 [LP8725] = LP8725_NUM_REGULATORS, 910 }; 911 912 if (cl->dev.of_node) 913 cl->dev.platform_data = lp872x_populate_pdata_from_dt(&cl->dev, 914 (enum lp872x_id)id->driver_data); 915 916 lp = devm_kzalloc(&cl->dev, sizeof(struct lp872x), GFP_KERNEL); 917 if (!lp) 918 return -ENOMEM; 919 920 lp->num_regulators = lp872x_num_regulators[id->driver_data]; 921 922 lp->regmap = devm_regmap_init_i2c(cl, &lp872x_regmap_config); 923 if (IS_ERR(lp->regmap)) { 924 ret = PTR_ERR(lp->regmap); 925 dev_err(&cl->dev, "regmap init i2c err: %d\n", ret); 926 return ret; 927 } 928 929 lp->dev = &cl->dev; 930 lp->pdata = dev_get_platdata(&cl->dev); 931 lp->chipid = id->driver_data; 932 i2c_set_clientdata(cl, lp); 933 934 ret = lp872x_config(lp); 935 if (ret) 936 return ret; 937 938 return lp872x_regulator_register(lp); 939} 940 941static const struct of_device_id lp872x_dt_ids[] = { 942 { .compatible = "ti,lp8720", }, 943 { .compatible = "ti,lp8725", }, 944 { } 945}; 946MODULE_DEVICE_TABLE(of, lp872x_dt_ids); 947 948static const struct i2c_device_id lp872x_ids[] = { 949 {"lp8720", LP8720}, 950 {"lp8725", LP8725}, 951 { } 952}; 953MODULE_DEVICE_TABLE(i2c, lp872x_ids); 954 955static struct i2c_driver lp872x_driver = { 956 .driver = { 957 .name = "lp872x", 958 .owner = THIS_MODULE, 959 .of_match_table = of_match_ptr(lp872x_dt_ids), 960 }, 961 .probe = lp872x_probe, 962 .id_table = lp872x_ids, 963}; 964 965module_i2c_driver(lp872x_driver); 966 967MODULE_DESCRIPTION("TI/National Semiconductor LP872x PMU Regulator Driver"); 968MODULE_AUTHOR("Milo Kim"); 969MODULE_LICENSE("GPL"); 970