root/drivers/regulator/tps62360-regulator.c

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

DEFINITIONS

This source file includes following definitions.
  1. find_voltage_set_register
  2. tps62360_dcdc_get_voltage_sel
  3. tps62360_dcdc_set_voltage_sel
  4. tps62360_set_mode
  5. tps62360_get_mode
  6. tps62360_init_dcdc
  7. of_get_tps62360_platform_data
  8. tps62360_probe
  9. tps62360_shutdown
  10. tps62360_init
  11. tps62360_cleanup

   1 /*
   2  * tps62360.c -- TI tps62360
   3  *
   4  * Driver for processor core supply tps62360, tps62361B, tps62362 and tps62363.
   5  *
   6  * Copyright (c) 2012, NVIDIA Corporation.
   7  *
   8  * Author: Laxman Dewangan <ldewangan@nvidia.com>
   9  *
  10  * This program is free software; you can redistribute it and/or
  11  * modify it under the terms of the GNU General Public License as
  12  * published by the Free Software Foundation version 2.
  13  *
  14  * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
  15  * whether express or implied; without even the implied warranty of
  16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17  * General Public License for more details.
  18  *
  19  * You should have received a copy of the GNU General Public License
  20  * along with this program; if not, write to the Free Software
  21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  22  * 02111-1307, USA
  23  */
  24 
  25 #include <linux/kernel.h>
  26 #include <linux/module.h>
  27 #include <linux/init.h>
  28 #include <linux/err.h>
  29 #include <linux/of.h>
  30 #include <linux/of_device.h>
  31 #include <linux/of_gpio.h>
  32 #include <linux/regulator/of_regulator.h>
  33 #include <linux/platform_device.h>
  34 #include <linux/regulator/driver.h>
  35 #include <linux/regulator/machine.h>
  36 #include <linux/regulator/tps62360.h>
  37 #include <linux/gpio.h>
  38 #include <linux/i2c.h>
  39 #include <linux/slab.h>
  40 #include <linux/regmap.h>
  41 
  42 /* Register definitions */
  43 #define REG_VSET0               0
  44 #define REG_VSET1               1
  45 #define REG_VSET2               2
  46 #define REG_VSET3               3
  47 #define REG_CONTROL             4
  48 #define REG_TEMP                5
  49 #define REG_RAMPCTRL            6
  50 #define REG_CHIPID              8
  51 
  52 #define FORCE_PWM_ENABLE        BIT(7)
  53 
  54 enum chips {TPS62360, TPS62361, TPS62362, TPS62363};
  55 
  56 #define TPS62360_BASE_VOLTAGE   770000
  57 #define TPS62360_N_VOLTAGES     64
  58 
  59 #define TPS62361_BASE_VOLTAGE   500000
  60 #define TPS62361_N_VOLTAGES     128
  61 
  62 /* tps 62360 chip information */
  63 struct tps62360_chip {
  64         struct device *dev;
  65         struct regulator_desc desc;
  66         struct regulator_dev *rdev;
  67         struct regmap *regmap;
  68         int vsel0_gpio;
  69         int vsel1_gpio;
  70         u8 voltage_reg_mask;
  71         bool en_internal_pulldn;
  72         bool en_discharge;
  73         bool valid_gpios;
  74         int lru_index[4];
  75         int curr_vset_vsel[4];
  76         int curr_vset_id;
  77 };
  78 
  79 /*
  80  * find_voltage_set_register: Find new voltage configuration register
  81  * (VSET) id.
  82  * The finding of the new VSET register will be based on the LRU mechanism.
  83  * Each VSET register will have different voltage configured . This
  84  * Function will look if any of the VSET register have requested voltage set
  85  * or not.
  86  *     - If it is already there then it will make that register as most
  87  *       recently used and return as found so that caller need not to set
  88  *       the VSET register but need to set the proper gpios to select this
  89  *       VSET register.
  90  *     - If requested voltage is not found then it will use the least
  91  *       recently mechanism to get new VSET register for new configuration
  92  *       and will return not_found so that caller need to set new VSET
  93  *       register and then gpios (both).
  94  */
  95 static bool find_voltage_set_register(struct tps62360_chip *tps,
  96                 int req_vsel, int *vset_reg_id)
  97 {
  98         int i;
  99         bool found = false;
 100         int new_vset_reg = tps->lru_index[3];
 101         int found_index = 3;
 102 
 103         for (i = 0; i < 4; ++i) {
 104                 if (tps->curr_vset_vsel[tps->lru_index[i]] == req_vsel) {
 105                         new_vset_reg = tps->lru_index[i];
 106                         found_index = i;
 107                         found = true;
 108                         goto update_lru_index;
 109                 }
 110         }
 111 
 112 update_lru_index:
 113         for (i = found_index; i > 0; i--)
 114                 tps->lru_index[i] = tps->lru_index[i - 1];
 115 
 116         tps->lru_index[0] = new_vset_reg;
 117         *vset_reg_id = new_vset_reg;
 118         return found;
 119 }
 120 
 121 static int tps62360_dcdc_get_voltage_sel(struct regulator_dev *dev)
 122 {
 123         struct tps62360_chip *tps = rdev_get_drvdata(dev);
 124         int vsel;
 125         unsigned int data;
 126         int ret;
 127 
 128         ret = regmap_read(tps->regmap, REG_VSET0 + tps->curr_vset_id, &data);
 129         if (ret < 0) {
 130                 dev_err(tps->dev, "%s(): register %d read failed with err %d\n",
 131                         __func__, REG_VSET0 + tps->curr_vset_id, ret);
 132                 return ret;
 133         }
 134         vsel = (int)data & tps->voltage_reg_mask;
 135         return vsel;
 136 }
 137 
 138 static int tps62360_dcdc_set_voltage_sel(struct regulator_dev *dev,
 139                                          unsigned selector)
 140 {
 141         struct tps62360_chip *tps = rdev_get_drvdata(dev);
 142         int ret;
 143         bool found = false;
 144         int new_vset_id = tps->curr_vset_id;
 145 
 146         /*
 147          * If gpios are available to select the VSET register then least
 148          * recently used register for new configuration.
 149          */
 150         if (tps->valid_gpios)
 151                 found = find_voltage_set_register(tps, selector, &new_vset_id);
 152 
 153         if (!found) {
 154                 ret = regmap_update_bits(tps->regmap, REG_VSET0 + new_vset_id,
 155                                 tps->voltage_reg_mask, selector);
 156                 if (ret < 0) {
 157                         dev_err(tps->dev,
 158                                 "%s(): register %d update failed with err %d\n",
 159                                  __func__, REG_VSET0 + new_vset_id, ret);
 160                         return ret;
 161                 }
 162                 tps->curr_vset_id = new_vset_id;
 163                 tps->curr_vset_vsel[new_vset_id] = selector;
 164         }
 165 
 166         /* Select proper VSET register vio gpios */
 167         if (tps->valid_gpios) {
 168                 gpio_set_value_cansleep(tps->vsel0_gpio, new_vset_id & 0x1);
 169                 gpio_set_value_cansleep(tps->vsel1_gpio,
 170                                         (new_vset_id >> 1) & 0x1);
 171         }
 172         return 0;
 173 }
 174 
 175 static int tps62360_set_mode(struct regulator_dev *rdev, unsigned int mode)
 176 {
 177         struct tps62360_chip *tps = rdev_get_drvdata(rdev);
 178         int i;
 179         int val;
 180         int ret;
 181 
 182         /* Enable force PWM mode in FAST mode only. */
 183         switch (mode) {
 184         case REGULATOR_MODE_FAST:
 185                 val = FORCE_PWM_ENABLE;
 186                 break;
 187 
 188         case REGULATOR_MODE_NORMAL:
 189                 val = 0;
 190                 break;
 191 
 192         default:
 193                 return -EINVAL;
 194         }
 195 
 196         if (!tps->valid_gpios) {
 197                 ret = regmap_update_bits(tps->regmap,
 198                         REG_VSET0 + tps->curr_vset_id, FORCE_PWM_ENABLE, val);
 199                 if (ret < 0)
 200                         dev_err(tps->dev,
 201                                 "%s(): register %d update failed with err %d\n",
 202                                 __func__, REG_VSET0 + tps->curr_vset_id, ret);
 203                 return ret;
 204         }
 205 
 206         /* If gpios are valid then all register set need to be control */
 207         for (i = 0; i < 4; ++i) {
 208                 ret = regmap_update_bits(tps->regmap,
 209                                         REG_VSET0 + i, FORCE_PWM_ENABLE, val);
 210                 if (ret < 0) {
 211                         dev_err(tps->dev,
 212                                 "%s(): register %d update failed with err %d\n",
 213                                 __func__, REG_VSET0 + i, ret);
 214                         return ret;
 215                 }
 216         }
 217         return ret;
 218 }
 219 
 220 static unsigned int tps62360_get_mode(struct regulator_dev *rdev)
 221 {
 222         struct tps62360_chip *tps = rdev_get_drvdata(rdev);
 223         unsigned int data;
 224         int ret;
 225 
 226         ret = regmap_read(tps->regmap, REG_VSET0 + tps->curr_vset_id, &data);
 227         if (ret < 0) {
 228                 dev_err(tps->dev, "%s(): register %d read failed with err %d\n",
 229                         __func__, REG_VSET0 + tps->curr_vset_id, ret);
 230                 return ret;
 231         }
 232         return (data & FORCE_PWM_ENABLE) ?
 233                                 REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
 234 }
 235 
 236 static struct regulator_ops tps62360_dcdc_ops = {
 237         .get_voltage_sel        = tps62360_dcdc_get_voltage_sel,
 238         .set_voltage_sel        = tps62360_dcdc_set_voltage_sel,
 239         .list_voltage           = regulator_list_voltage_linear,
 240         .map_voltage            = regulator_map_voltage_linear,
 241         .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 242         .set_mode               = tps62360_set_mode,
 243         .get_mode               = tps62360_get_mode,
 244 };
 245 
 246 static int tps62360_init_dcdc(struct tps62360_chip *tps,
 247                 struct tps62360_regulator_platform_data *pdata)
 248 {
 249         int ret;
 250         unsigned int ramp_ctrl;
 251 
 252         /* Initialize internal pull up/down control */
 253         if (tps->en_internal_pulldn)
 254                 ret = regmap_write(tps->regmap, REG_CONTROL, 0xE0);
 255         else
 256                 ret = regmap_write(tps->regmap, REG_CONTROL, 0x0);
 257         if (ret < 0) {
 258                 dev_err(tps->dev,
 259                         "%s(): register %d write failed with err %d\n",
 260                         __func__, REG_CONTROL, ret);
 261                 return ret;
 262         }
 263 
 264         /* Reset output discharge path to reduce power consumption */
 265         ret = regmap_update_bits(tps->regmap, REG_RAMPCTRL, BIT(2), 0);
 266         if (ret < 0) {
 267                 dev_err(tps->dev,
 268                         "%s(): register %d update failed with err %d\n",
 269                         __func__, REG_RAMPCTRL, ret);
 270                 return ret;
 271         }
 272 
 273         /* Get ramp value from ramp control register */
 274         ret = regmap_read(tps->regmap, REG_RAMPCTRL, &ramp_ctrl);
 275         if (ret < 0) {
 276                 dev_err(tps->dev,
 277                         "%s(): register %d read failed with err %d\n",
 278                         __func__, REG_RAMPCTRL, ret);
 279                 return ret;
 280         }
 281         ramp_ctrl = (ramp_ctrl >> 5) & 0x7;
 282 
 283         /* ramp mV/us = 32/(2^ramp_ctrl) */
 284         tps->desc.ramp_delay = DIV_ROUND_UP(32000, BIT(ramp_ctrl));
 285         return ret;
 286 }
 287 
 288 static const struct regmap_config tps62360_regmap_config = {
 289         .reg_bits               = 8,
 290         .val_bits               = 8,
 291         .max_register           = REG_CHIPID,
 292         .cache_type             = REGCACHE_RBTREE,
 293 };
 294 
 295 static struct tps62360_regulator_platform_data *
 296         of_get_tps62360_platform_data(struct device *dev,
 297                                       const struct regulator_desc *desc)
 298 {
 299         struct tps62360_regulator_platform_data *pdata;
 300         struct device_node *np = dev->of_node;
 301 
 302         pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
 303         if (!pdata)
 304                 return NULL;
 305 
 306         pdata->reg_init_data = of_get_regulator_init_data(dev, dev->of_node,
 307                                                           desc);
 308         if (!pdata->reg_init_data) {
 309                 dev_err(dev, "Not able to get OF regulator init data\n");
 310                 return NULL;
 311         }
 312 
 313         pdata->vsel0_gpio = of_get_named_gpio(np, "vsel0-gpio", 0);
 314         pdata->vsel1_gpio = of_get_named_gpio(np, "vsel1-gpio", 0);
 315 
 316         if (of_find_property(np, "ti,vsel0-state-high", NULL))
 317                 pdata->vsel0_def_state = 1;
 318 
 319         if (of_find_property(np, "ti,vsel1-state-high", NULL))
 320                 pdata->vsel1_def_state = 1;
 321 
 322         if (of_find_property(np, "ti,enable-pull-down", NULL))
 323                 pdata->en_internal_pulldn = true;
 324 
 325         if (of_find_property(np, "ti,enable-vout-discharge", NULL))
 326                 pdata->en_discharge = true;
 327 
 328         return pdata;
 329 }
 330 
 331 #if defined(CONFIG_OF)
 332 static const struct of_device_id tps62360_of_match[] = {
 333          { .compatible = "ti,tps62360", .data = (void *)TPS62360},
 334          { .compatible = "ti,tps62361", .data = (void *)TPS62361},
 335          { .compatible = "ti,tps62362", .data = (void *)TPS62362},
 336          { .compatible = "ti,tps62363", .data = (void *)TPS62363},
 337         {},
 338 };
 339 MODULE_DEVICE_TABLE(of, tps62360_of_match);
 340 #endif
 341 
 342 static int tps62360_probe(struct i2c_client *client,
 343                                      const struct i2c_device_id *id)
 344 {
 345         struct regulator_config config = { };
 346         struct tps62360_regulator_platform_data *pdata;
 347         struct regulator_dev *rdev;
 348         struct tps62360_chip *tps;
 349         int ret;
 350         int i;
 351         int chip_id;
 352 
 353         pdata = dev_get_platdata(&client->dev);
 354 
 355         tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
 356         if (!tps)
 357                 return -ENOMEM;
 358 
 359         tps->desc.name = client->name;
 360         tps->desc.id = 0;
 361         tps->desc.ops = &tps62360_dcdc_ops;
 362         tps->desc.type = REGULATOR_VOLTAGE;
 363         tps->desc.owner = THIS_MODULE;
 364         tps->desc.uV_step = 10000;
 365 
 366         if (client->dev.of_node) {
 367                 const struct of_device_id *match;
 368                 match = of_match_device(of_match_ptr(tps62360_of_match),
 369                                 &client->dev);
 370                 if (!match) {
 371                         dev_err(&client->dev, "Error: No device match found\n");
 372                         return -ENODEV;
 373                 }
 374                 chip_id = (int)(long)match->data;
 375                 if (!pdata)
 376                         pdata = of_get_tps62360_platform_data(&client->dev,
 377                                                               &tps->desc);
 378         } else if (id) {
 379                 chip_id = id->driver_data;
 380         } else {
 381                 dev_err(&client->dev, "No device tree match or id table match found\n");
 382                 return -ENODEV;
 383         }
 384 
 385         if (!pdata) {
 386                 dev_err(&client->dev, "%s(): Platform data not found\n",
 387                                                 __func__);
 388                 return -EIO;
 389         }
 390 
 391         tps->en_discharge = pdata->en_discharge;
 392         tps->en_internal_pulldn = pdata->en_internal_pulldn;
 393         tps->vsel0_gpio = pdata->vsel0_gpio;
 394         tps->vsel1_gpio = pdata->vsel1_gpio;
 395         tps->dev = &client->dev;
 396 
 397         switch (chip_id) {
 398         case TPS62360:
 399         case TPS62362:
 400                 tps->desc.min_uV = TPS62360_BASE_VOLTAGE;
 401                 tps->voltage_reg_mask = 0x3F;
 402                 tps->desc.n_voltages = TPS62360_N_VOLTAGES;
 403                 break;
 404         case TPS62361:
 405         case TPS62363:
 406                 tps->desc.min_uV = TPS62361_BASE_VOLTAGE;
 407                 tps->voltage_reg_mask = 0x7F;
 408                 tps->desc.n_voltages = TPS62361_N_VOLTAGES;
 409                 break;
 410         default:
 411                 return -ENODEV;
 412         }
 413 
 414         tps->regmap = devm_regmap_init_i2c(client, &tps62360_regmap_config);
 415         if (IS_ERR(tps->regmap)) {
 416                 ret = PTR_ERR(tps->regmap);
 417                 dev_err(&client->dev,
 418                         "%s(): regmap allocation failed with err %d\n",
 419                         __func__, ret);
 420                 return ret;
 421         }
 422         i2c_set_clientdata(client, tps);
 423 
 424         tps->curr_vset_id = (pdata->vsel1_def_state & 1) * 2 +
 425                                 (pdata->vsel0_def_state & 1);
 426         tps->lru_index[0] = tps->curr_vset_id;
 427         tps->valid_gpios = false;
 428 
 429         if (gpio_is_valid(tps->vsel0_gpio) && gpio_is_valid(tps->vsel1_gpio)) {
 430                 int gpio_flags;
 431                 gpio_flags = (pdata->vsel0_def_state) ?
 432                                 GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
 433                 ret = devm_gpio_request_one(&client->dev, tps->vsel0_gpio,
 434                                 gpio_flags, "tps62360-vsel0");
 435                 if (ret) {
 436                         dev_err(&client->dev,
 437                                 "%s(): Could not obtain vsel0 GPIO %d: %d\n",
 438                                 __func__, tps->vsel0_gpio, ret);
 439                         return ret;
 440                 }
 441 
 442                 gpio_flags = (pdata->vsel1_def_state) ?
 443                                 GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
 444                 ret = devm_gpio_request_one(&client->dev, tps->vsel1_gpio,
 445                                 gpio_flags, "tps62360-vsel1");
 446                 if (ret) {
 447                         dev_err(&client->dev,
 448                                 "%s(): Could not obtain vsel1 GPIO %d: %d\n",
 449                                 __func__, tps->vsel1_gpio, ret);
 450                         return ret;
 451                 }
 452                 tps->valid_gpios = true;
 453 
 454                 /*
 455                  * Initialize the lru index with vset_reg id
 456                  * The index 0 will be most recently used and
 457                  * set with the tps->curr_vset_id */
 458                 for (i = 0; i < 4; ++i)
 459                         tps->lru_index[i] = i;
 460                 tps->lru_index[0] = tps->curr_vset_id;
 461                 tps->lru_index[tps->curr_vset_id] = 0;
 462         }
 463 
 464         ret = tps62360_init_dcdc(tps, pdata);
 465         if (ret < 0) {
 466                 dev_err(tps->dev, "%s(): Init failed with err = %d\n",
 467                                 __func__, ret);
 468                 return ret;
 469         }
 470 
 471         config.dev = &client->dev;
 472         config.init_data = pdata->reg_init_data;
 473         config.driver_data = tps;
 474         config.of_node = client->dev.of_node;
 475 
 476         /* Register the regulators */
 477         rdev = devm_regulator_register(&client->dev, &tps->desc, &config);
 478         if (IS_ERR(rdev)) {
 479                 dev_err(tps->dev,
 480                         "%s(): regulator register failed with err %s\n",
 481                         __func__, id->name);
 482                 return PTR_ERR(rdev);
 483         }
 484 
 485         tps->rdev = rdev;
 486         return 0;
 487 }
 488 
 489 static void tps62360_shutdown(struct i2c_client *client)
 490 {
 491         struct tps62360_chip *tps = i2c_get_clientdata(client);
 492         int st;
 493 
 494         if (!tps->en_discharge)
 495                 return;
 496 
 497         /* Configure the output discharge path */
 498         st = regmap_update_bits(tps->regmap, REG_RAMPCTRL, BIT(2), BIT(2));
 499         if (st < 0)
 500                 dev_err(tps->dev,
 501                         "%s(): register %d update failed with err %d\n",
 502                         __func__, REG_RAMPCTRL, st);
 503 }
 504 
 505 static const struct i2c_device_id tps62360_id[] = {
 506         {.name = "tps62360", .driver_data = TPS62360},
 507         {.name = "tps62361", .driver_data = TPS62361},
 508         {.name = "tps62362", .driver_data = TPS62362},
 509         {.name = "tps62363", .driver_data = TPS62363},
 510         {},
 511 };
 512 
 513 MODULE_DEVICE_TABLE(i2c, tps62360_id);
 514 
 515 static struct i2c_driver tps62360_i2c_driver = {
 516         .driver = {
 517                 .name = "tps62360",
 518                 .of_match_table = of_match_ptr(tps62360_of_match),
 519         },
 520         .probe = tps62360_probe,
 521         .shutdown = tps62360_shutdown,
 522         .id_table = tps62360_id,
 523 };
 524 
 525 static int __init tps62360_init(void)
 526 {
 527         return i2c_add_driver(&tps62360_i2c_driver);
 528 }
 529 subsys_initcall(tps62360_init);
 530 
 531 static void __exit tps62360_cleanup(void)
 532 {
 533         i2c_del_driver(&tps62360_i2c_driver);
 534 }
 535 module_exit(tps62360_cleanup);
 536 
 537 MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
 538 MODULE_DESCRIPTION("TPS6236x voltage regulator driver");
 539 MODULE_LICENSE("GPL v2");

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