root/drivers/regulator/tps65217-regulator.c

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

DEFINITIONS

This source file includes following definitions.
  1. tps65217_pmic_enable
  2. tps65217_pmic_disable
  3. tps65217_pmic_set_voltage_sel
  4. tps65217_pmic_set_suspend_enable
  5. tps65217_pmic_set_suspend_disable
  6. tps65217_regulator_probe
  7. tps65217_regulator_init
  8. tps65217_regulator_exit

   1 /*
   2  * tps65217-regulator.c
   3  *
   4  * Regulator driver for TPS65217 PMIC
   5  *
   6  * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
   7  *
   8  * This program is free software; you can redistribute it and/or
   9  * modify it under the terms of the GNU General Public License as
  10  * published by the Free Software Foundation version 2.
  11  *
  12  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  13  * kind, whether express or implied; without even the implied warranty
  14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15  * GNU General Public License for more details.
  16  */
  17 
  18 #include <linux/kernel.h>
  19 #include <linux/module.h>
  20 #include <linux/device.h>
  21 #include <linux/init.h>
  22 #include <linux/err.h>
  23 #include <linux/platform_device.h>
  24 
  25 #include <linux/regulator/of_regulator.h>
  26 #include <linux/regulator/driver.h>
  27 #include <linux/regulator/machine.h>
  28 #include <linux/mfd/tps65217.h>
  29 
  30 #define TPS65217_REGULATOR(_name, _id, _of_match, _ops, _n, _vr, _vm, _em, \
  31                            _t, _lr, _nlr,  _sr, _sm)    \
  32         {                                               \
  33                 .name           = _name,                \
  34                 .id             = _id,                  \
  35                 .of_match       = of_match_ptr(_of_match),    \
  36                 .regulators_node= of_match_ptr("regulators"), \
  37                 .ops            = &_ops,                \
  38                 .n_voltages     = _n,                   \
  39                 .type           = REGULATOR_VOLTAGE,    \
  40                 .owner          = THIS_MODULE,          \
  41                 .vsel_reg       = _vr,                  \
  42                 .vsel_mask      = _vm,                  \
  43                 .enable_reg     = TPS65217_REG_ENABLE,  \
  44                 .enable_mask    = _em,                  \
  45                 .volt_table     = _t,                   \
  46                 .linear_ranges  = _lr,                  \
  47                 .n_linear_ranges = _nlr,                \
  48                 .bypass_reg     = _sr,                  \
  49                 .bypass_mask    = _sm,                  \
  50         }                                               \
  51 
  52 static const unsigned int LDO1_VSEL_table[] = {
  53         1000000, 1100000, 1200000, 1250000,
  54         1300000, 1350000, 1400000, 1500000,
  55         1600000, 1800000, 2500000, 2750000,
  56         2800000, 3000000, 3100000, 3300000,
  57 };
  58 
  59 static const struct regulator_linear_range tps65217_uv1_ranges[] = {
  60         REGULATOR_LINEAR_RANGE(900000, 0, 24, 25000),
  61         REGULATOR_LINEAR_RANGE(1550000, 25, 52, 50000),
  62         REGULATOR_LINEAR_RANGE(3000000, 53, 55, 100000),
  63         REGULATOR_LINEAR_RANGE(3300000, 56, 63, 0),
  64 };
  65 
  66 static const struct regulator_linear_range tps65217_uv2_ranges[] = {
  67         REGULATOR_LINEAR_RANGE(1500000, 0, 8, 50000),
  68         REGULATOR_LINEAR_RANGE(2000000, 9, 13, 100000),
  69         REGULATOR_LINEAR_RANGE(2450000, 14, 31, 50000),
  70 };
  71 
  72 static int tps65217_pmic_enable(struct regulator_dev *dev)
  73 {
  74         struct tps65217 *tps = rdev_get_drvdata(dev);
  75         int rid = rdev_get_id(dev);
  76 
  77         if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
  78                 return -EINVAL;
  79 
  80         /* Enable the regulator and password protection is level 1 */
  81         return tps65217_set_bits(tps, TPS65217_REG_ENABLE,
  82                                  dev->desc->enable_mask, dev->desc->enable_mask,
  83                                  TPS65217_PROTECT_L1);
  84 }
  85 
  86 static int tps65217_pmic_disable(struct regulator_dev *dev)
  87 {
  88         struct tps65217 *tps = rdev_get_drvdata(dev);
  89         int rid = rdev_get_id(dev);
  90 
  91         if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
  92                 return -EINVAL;
  93 
  94         /* Disable the regulator and password protection is level 1 */
  95         return tps65217_clear_bits(tps, TPS65217_REG_ENABLE,
  96                                    dev->desc->enable_mask, TPS65217_PROTECT_L1);
  97 }
  98 
  99 static int tps65217_pmic_set_voltage_sel(struct regulator_dev *dev,
 100                                          unsigned selector)
 101 {
 102         int ret;
 103         struct tps65217 *tps = rdev_get_drvdata(dev);
 104         unsigned int rid = rdev_get_id(dev);
 105 
 106         /* Set the voltage based on vsel value and write protect level is 2 */
 107         ret = tps65217_set_bits(tps, dev->desc->vsel_reg, dev->desc->vsel_mask,
 108                                 selector, TPS65217_PROTECT_L2);
 109 
 110         /* Set GO bit for DCDCx to initiate voltage transistion */
 111         switch (rid) {
 112         case TPS65217_DCDC_1 ... TPS65217_DCDC_3:
 113                 ret = tps65217_set_bits(tps, TPS65217_REG_DEFSLEW,
 114                                        TPS65217_DEFSLEW_GO, TPS65217_DEFSLEW_GO,
 115                                        TPS65217_PROTECT_L2);
 116                 break;
 117         }
 118 
 119         return ret;
 120 }
 121 
 122 static int tps65217_pmic_set_suspend_enable(struct regulator_dev *dev)
 123 {
 124         struct tps65217 *tps = rdev_get_drvdata(dev);
 125         unsigned int rid = rdev_get_id(dev);
 126 
 127         if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
 128                 return -EINVAL;
 129 
 130         return tps65217_clear_bits(tps, dev->desc->bypass_reg,
 131                                    dev->desc->bypass_mask,
 132                                    TPS65217_PROTECT_L1);
 133 }
 134 
 135 static int tps65217_pmic_set_suspend_disable(struct regulator_dev *dev)
 136 {
 137         struct tps65217 *tps = rdev_get_drvdata(dev);
 138         unsigned int rid = rdev_get_id(dev);
 139 
 140         if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4)
 141                 return -EINVAL;
 142 
 143         if (!tps->strobes[rid])
 144                 return -EINVAL;
 145 
 146         return tps65217_set_bits(tps, dev->desc->bypass_reg,
 147                                  dev->desc->bypass_mask,
 148                                  tps->strobes[rid], TPS65217_PROTECT_L1);
 149 }
 150 
 151 /* Operations permitted on DCDCx, LDO2, LDO3 and LDO4 */
 152 static const struct regulator_ops tps65217_pmic_ops = {
 153         .is_enabled             = regulator_is_enabled_regmap,
 154         .enable                 = tps65217_pmic_enable,
 155         .disable                = tps65217_pmic_disable,
 156         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 157         .set_voltage_sel        = tps65217_pmic_set_voltage_sel,
 158         .list_voltage           = regulator_list_voltage_linear_range,
 159         .map_voltage            = regulator_map_voltage_linear_range,
 160         .set_suspend_enable     = tps65217_pmic_set_suspend_enable,
 161         .set_suspend_disable    = tps65217_pmic_set_suspend_disable,
 162 };
 163 
 164 /* Operations permitted on LDO1 */
 165 static const struct regulator_ops tps65217_pmic_ldo1_ops = {
 166         .is_enabled             = regulator_is_enabled_regmap,
 167         .enable                 = tps65217_pmic_enable,
 168         .disable                = tps65217_pmic_disable,
 169         .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 170         .set_voltage_sel        = tps65217_pmic_set_voltage_sel,
 171         .list_voltage           = regulator_list_voltage_table,
 172         .map_voltage            = regulator_map_voltage_ascend,
 173         .set_suspend_enable     = tps65217_pmic_set_suspend_enable,
 174         .set_suspend_disable    = tps65217_pmic_set_suspend_disable,
 175 };
 176 
 177 static const struct regulator_desc regulators[] = {
 178         TPS65217_REGULATOR("DCDC1", TPS65217_DCDC_1, "dcdc1",
 179                            tps65217_pmic_ops, 64, TPS65217_REG_DEFDCDC1,
 180                            TPS65217_DEFDCDCX_DCDC_MASK, TPS65217_ENABLE_DC1_EN,
 181                            NULL, tps65217_uv1_ranges,
 182                            ARRAY_SIZE(tps65217_uv1_ranges), TPS65217_REG_SEQ1,
 183                            TPS65217_SEQ1_DC1_SEQ_MASK),
 184         TPS65217_REGULATOR("DCDC2", TPS65217_DCDC_2, "dcdc2",
 185                            tps65217_pmic_ops, 64, TPS65217_REG_DEFDCDC2,
 186                            TPS65217_DEFDCDCX_DCDC_MASK, TPS65217_ENABLE_DC2_EN,
 187                            NULL, tps65217_uv1_ranges,
 188                            ARRAY_SIZE(tps65217_uv1_ranges), TPS65217_REG_SEQ1,
 189                            TPS65217_SEQ1_DC2_SEQ_MASK),
 190         TPS65217_REGULATOR("DCDC3", TPS65217_DCDC_3, "dcdc3",
 191                            tps65217_pmic_ops, 64, TPS65217_REG_DEFDCDC3,
 192                            TPS65217_DEFDCDCX_DCDC_MASK, TPS65217_ENABLE_DC3_EN,
 193                            NULL, tps65217_uv1_ranges,
 194                            ARRAY_SIZE(tps65217_uv1_ranges), TPS65217_REG_SEQ2,
 195                            TPS65217_SEQ2_DC3_SEQ_MASK),
 196         TPS65217_REGULATOR("LDO1", TPS65217_LDO_1, "ldo1",
 197                            tps65217_pmic_ldo1_ops, 16, TPS65217_REG_DEFLDO1,
 198                            TPS65217_DEFLDO1_LDO1_MASK, TPS65217_ENABLE_LDO1_EN,
 199                            LDO1_VSEL_table, NULL, 0, TPS65217_REG_SEQ2,
 200                            TPS65217_SEQ2_LDO1_SEQ_MASK),
 201         TPS65217_REGULATOR("LDO2", TPS65217_LDO_2, "ldo2", tps65217_pmic_ops,
 202                            64, TPS65217_REG_DEFLDO2,
 203                            TPS65217_DEFLDO2_LDO2_MASK, TPS65217_ENABLE_LDO2_EN,
 204                            NULL, tps65217_uv1_ranges,
 205                            ARRAY_SIZE(tps65217_uv1_ranges), TPS65217_REG_SEQ3,
 206                            TPS65217_SEQ3_LDO2_SEQ_MASK),
 207         TPS65217_REGULATOR("LDO3", TPS65217_LDO_3, "ldo3", tps65217_pmic_ops,
 208                            32, TPS65217_REG_DEFLS1, TPS65217_DEFLDO3_LDO3_MASK,
 209                            TPS65217_ENABLE_LS1_EN | TPS65217_DEFLDO3_LDO3_EN,
 210                            NULL, tps65217_uv2_ranges,
 211                            ARRAY_SIZE(tps65217_uv2_ranges), TPS65217_REG_SEQ3,
 212                            TPS65217_SEQ3_LDO3_SEQ_MASK),
 213         TPS65217_REGULATOR("LDO4", TPS65217_LDO_4, "ldo4", tps65217_pmic_ops,
 214                            32, TPS65217_REG_DEFLS2, TPS65217_DEFLDO4_LDO4_MASK,
 215                            TPS65217_ENABLE_LS2_EN | TPS65217_DEFLDO4_LDO4_EN,
 216                            NULL, tps65217_uv2_ranges,
 217                            ARRAY_SIZE(tps65217_uv2_ranges), TPS65217_REG_SEQ4,
 218                            TPS65217_SEQ4_LDO4_SEQ_MASK),
 219 };
 220 
 221 static int tps65217_regulator_probe(struct platform_device *pdev)
 222 {
 223         struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent);
 224         struct tps65217_board *pdata = dev_get_platdata(tps->dev);
 225         struct regulator_dev *rdev;
 226         struct regulator_config config = { };
 227         int i, ret;
 228         unsigned int val;
 229 
 230         /* Allocate memory for strobes */
 231         tps->strobes = devm_kcalloc(&pdev->dev,
 232                                     TPS65217_NUM_REGULATOR, sizeof(u8),
 233                                     GFP_KERNEL);
 234         if (!tps->strobes)
 235                 return -ENOMEM;
 236 
 237         platform_set_drvdata(pdev, tps);
 238 
 239         for (i = 0; i < TPS65217_NUM_REGULATOR; i++) {
 240                 /* Register the regulators */
 241                 config.dev = tps->dev;
 242                 if (pdata)
 243                         config.init_data = pdata->tps65217_init_data[i];
 244                 config.driver_data = tps;
 245                 config.regmap = tps->regmap;
 246 
 247                 rdev = devm_regulator_register(&pdev->dev, &regulators[i],
 248                                                &config);
 249                 if (IS_ERR(rdev)) {
 250                         dev_err(tps->dev, "failed to register %s regulator\n",
 251                                 pdev->name);
 252                         return PTR_ERR(rdev);
 253                 }
 254 
 255                 /* Store default strobe info */
 256                 ret = tps65217_reg_read(tps, regulators[i].bypass_reg, &val);
 257                 tps->strobes[i] = val & regulators[i].bypass_mask;
 258         }
 259 
 260         return 0;
 261 }
 262 
 263 static struct platform_driver tps65217_regulator_driver = {
 264         .driver = {
 265                 .name = "tps65217-pmic",
 266         },
 267         .probe = tps65217_regulator_probe,
 268 };
 269 
 270 static int __init tps65217_regulator_init(void)
 271 {
 272         return platform_driver_register(&tps65217_regulator_driver);
 273 }
 274 subsys_initcall(tps65217_regulator_init);
 275 
 276 static void __exit tps65217_regulator_exit(void)
 277 {
 278         platform_driver_unregister(&tps65217_regulator_driver);
 279 }
 280 module_exit(tps65217_regulator_exit);
 281 
 282 MODULE_AUTHOR("AnilKumar Ch <anilkumar@ti.com>");
 283 MODULE_DESCRIPTION("TPS65217 voltage regulator driver");
 284 MODULE_ALIAS("platform:tps65217-pmic");
 285 MODULE_LICENSE("GPL v2");

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