linux/drivers/regulator/lp872x.c
<<
>>
Prefs
   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