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, _ops, _n, _vr, _vm, _em, _t) \ 31 { \ 32 .name = _name, \ 33 .id = _id, \ 34 .ops = &_ops, \ 35 .n_voltages = _n, \ 36 .type = REGULATOR_VOLTAGE, \ 37 .owner = THIS_MODULE, \ 38 .vsel_reg = _vr, \ 39 .vsel_mask = _vm, \ 40 .enable_reg = TPS65217_REG_ENABLE, \ 41 .enable_mask = _em, \ 42 .volt_table = _t, \ 43 } \ 44 45 #define TPS65217_INFO(_nm, _min, _max, _f1, _f2) \ 46 { \ 47 .name = _nm, \ 48 .min_uV = _min, \ 49 .max_uV = _max, \ 50 .vsel_to_uv = _f1, \ 51 .uv_to_vsel = _f2, \ 52 } 53 54 static const unsigned int LDO1_VSEL_table[] = { 55 1000000, 1100000, 1200000, 1250000, 56 1300000, 1350000, 1400000, 1500000, 57 1600000, 1800000, 2500000, 2750000, 58 2800000, 3000000, 3100000, 3300000, 59 }; 60 61 static int tps65217_vsel_to_uv1(unsigned int vsel) 62 { 63 int uV = 0; 64 65 if (vsel > 63) 66 return -EINVAL; 67 68 if (vsel <= 24) 69 uV = vsel * 25000 + 900000; 70 else if (vsel <= 52) 71 uV = (vsel - 24) * 50000 + 1500000; 72 else if (vsel < 56) 73 uV = (vsel - 52) * 100000 + 2900000; 74 else 75 uV = 3300000; 76 77 return uV; 78 } 79 80 static int tps65217_uv_to_vsel1(int uV, unsigned int *vsel) 81 { 82 if (uV < 0 || uV > 3300000) 83 return -EINVAL; 84 85 if (uV <= 1500000) 86 *vsel = DIV_ROUND_UP(uV - 900000, 25000); 87 else if (uV <= 2900000) 88 *vsel = 24 + DIV_ROUND_UP(uV - 1500000, 50000); 89 else if (uV < 3300000) 90 *vsel = 52 + DIV_ROUND_UP(uV - 2900000, 100000); 91 else 92 *vsel = 56; 93 94 return 0; 95 } 96 97 static int tps65217_vsel_to_uv2(unsigned int vsel) 98 { 99 int uV = 0; 100 101 if (vsel > 31) 102 return -EINVAL; 103 104 if (vsel <= 8) 105 uV = vsel * 50000 + 1500000; 106 else if (vsel <= 13) 107 uV = (vsel - 8) * 100000 + 1900000; 108 else 109 uV = (vsel - 13) * 50000 + 2400000; 110 111 return uV; 112 } 113 114 static int tps65217_uv_to_vsel2(int uV, unsigned int *vsel) 115 { 116 if (uV < 0 || uV > 3300000) 117 return -EINVAL; 118 119 if (uV <= 1900000) 120 *vsel = DIV_ROUND_UP(uV - 1500000, 50000); 121 else if (uV <= 2400000) 122 *vsel = 8 + DIV_ROUND_UP(uV - 1900000, 100000); 123 else 124 *vsel = 13 + DIV_ROUND_UP(uV - 2400000, 50000); 125 126 return 0; 127 } 128 129 static struct tps_info tps65217_pmic_regs[] = { 130 TPS65217_INFO("DCDC1", 900000, 1800000, tps65217_vsel_to_uv1, 131 tps65217_uv_to_vsel1), 132 TPS65217_INFO("DCDC2", 900000, 3300000, tps65217_vsel_to_uv1, 133 tps65217_uv_to_vsel1), 134 TPS65217_INFO("DCDC3", 900000, 1500000, tps65217_vsel_to_uv1, 135 tps65217_uv_to_vsel1), 136 TPS65217_INFO("LDO1", 1000000, 3300000, NULL, NULL), 137 TPS65217_INFO("LDO2", 900000, 3300000, tps65217_vsel_to_uv1, 138 tps65217_uv_to_vsel1), 139 TPS65217_INFO("LDO3", 1800000, 3300000, tps65217_vsel_to_uv2, 140 tps65217_uv_to_vsel2), 141 TPS65217_INFO("LDO4", 1800000, 3300000, tps65217_vsel_to_uv2, 142 tps65217_uv_to_vsel2), 143 }; 144 145 static int tps65217_pmic_enable(struct regulator_dev *dev) 146 { 147 struct tps65217 *tps = rdev_get_drvdata(dev); 148 unsigned int rid = rdev_get_id(dev); 149 150 if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4) 151 return -EINVAL; 152 153 /* Enable the regulator and password protection is level 1 */ 154 return tps65217_set_bits(tps, TPS65217_REG_ENABLE, 155 dev->desc->enable_mask, dev->desc->enable_mask, 156 TPS65217_PROTECT_L1); 157 } 158 159 static int tps65217_pmic_disable(struct regulator_dev *dev) 160 { 161 struct tps65217 *tps = rdev_get_drvdata(dev); 162 unsigned int rid = rdev_get_id(dev); 163 164 if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4) 165 return -EINVAL; 166 167 /* Disable the regulator and password protection is level 1 */ 168 return tps65217_clear_bits(tps, TPS65217_REG_ENABLE, 169 dev->desc->enable_mask, TPS65217_PROTECT_L1); 170 } 171 172 static int tps65217_pmic_set_voltage_sel(struct regulator_dev *dev, 173 unsigned selector) 174 { 175 int ret; 176 struct tps65217 *tps = rdev_get_drvdata(dev); 177 unsigned int rid = rdev_get_id(dev); 178 179 /* Set the voltage based on vsel value and write protect level is 2 */ 180 ret = tps65217_set_bits(tps, dev->desc->vsel_reg, dev->desc->vsel_mask, 181 selector, TPS65217_PROTECT_L2); 182 183 /* Set GO bit for DCDCx to initiate voltage transistion */ 184 switch (rid) { 185 case TPS65217_DCDC_1 ... TPS65217_DCDC_3: 186 ret = tps65217_set_bits(tps, TPS65217_REG_DEFSLEW, 187 TPS65217_DEFSLEW_GO, TPS65217_DEFSLEW_GO, 188 TPS65217_PROTECT_L2); 189 break; 190 } 191 192 return ret; 193 } 194 195 static int tps65217_pmic_map_voltage(struct regulator_dev *dev, 196 int min_uV, int max_uV) 197 { 198 199 struct tps65217 *tps = rdev_get_drvdata(dev); 200 unsigned int sel, rid = rdev_get_id(dev); 201 int ret; 202 203 /* LDO1 uses regulator_map_voltage_iterate() */ 204 if (rid == TPS65217_LDO_1) 205 return -EINVAL; 206 207 if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4) 208 return -EINVAL; 209 210 if (min_uV < tps->info[rid]->min_uV) 211 min_uV = tps->info[rid]->min_uV; 212 213 if (max_uV < tps->info[rid]->min_uV || min_uV > tps->info[rid]->max_uV) 214 return -EINVAL; 215 216 ret = tps->info[rid]->uv_to_vsel(min_uV, &sel); 217 if (ret) 218 return ret; 219 220 return sel; 221 } 222 223 static int tps65217_pmic_list_voltage(struct regulator_dev *dev, 224 unsigned selector) 225 { 226 struct tps65217 *tps = rdev_get_drvdata(dev); 227 unsigned int rid = rdev_get_id(dev); 228 229 if (rid < TPS65217_DCDC_1 || rid > TPS65217_LDO_4) 230 return -EINVAL; 231 232 if (selector >= dev->desc->n_voltages) 233 return -EINVAL; 234 235 return tps->info[rid]->vsel_to_uv(selector); 236 } 237 238 /* Operations permitted on DCDCx, LDO2, LDO3 and LDO4 */ 239 static struct regulator_ops tps65217_pmic_ops = { 240 .is_enabled = regulator_is_enabled_regmap, 241 .enable = tps65217_pmic_enable, 242 .disable = tps65217_pmic_disable, 243 .get_voltage_sel = regulator_get_voltage_sel_regmap, 244 .set_voltage_sel = tps65217_pmic_set_voltage_sel, 245 .list_voltage = tps65217_pmic_list_voltage, 246 .map_voltage = tps65217_pmic_map_voltage, 247 }; 248 249 /* Operations permitted on LDO1 */ 250 static struct regulator_ops tps65217_pmic_ldo1_ops = { 251 .is_enabled = regulator_is_enabled_regmap, 252 .enable = tps65217_pmic_enable, 253 .disable = tps65217_pmic_disable, 254 .get_voltage_sel = regulator_get_voltage_sel_regmap, 255 .set_voltage_sel = tps65217_pmic_set_voltage_sel, 256 .list_voltage = regulator_list_voltage_table, 257 }; 258 259 static const struct regulator_desc regulators[] = { 260 TPS65217_REGULATOR("DCDC1", TPS65217_DCDC_1, tps65217_pmic_ops, 64, 261 TPS65217_REG_DEFDCDC1, TPS65217_DEFDCDCX_DCDC_MASK, 262 TPS65217_ENABLE_DC1_EN, NULL), 263 TPS65217_REGULATOR("DCDC2", TPS65217_DCDC_2, tps65217_pmic_ops, 64, 264 TPS65217_REG_DEFDCDC2, TPS65217_DEFDCDCX_DCDC_MASK, 265 TPS65217_ENABLE_DC2_EN, NULL), 266 TPS65217_REGULATOR("DCDC3", TPS65217_DCDC_3, tps65217_pmic_ops, 64, 267 TPS65217_REG_DEFDCDC3, TPS65217_DEFDCDCX_DCDC_MASK, 268 TPS65217_ENABLE_DC3_EN, NULL), 269 TPS65217_REGULATOR("LDO1", TPS65217_LDO_1, tps65217_pmic_ldo1_ops, 16, 270 TPS65217_REG_DEFLDO1, TPS65217_DEFLDO1_LDO1_MASK, 271 TPS65217_ENABLE_LDO1_EN, LDO1_VSEL_table), 272 TPS65217_REGULATOR("LDO2", TPS65217_LDO_2, tps65217_pmic_ops, 64, 273 TPS65217_REG_DEFLDO2, TPS65217_DEFLDO2_LDO2_MASK, 274 TPS65217_ENABLE_LDO2_EN, NULL), 275 TPS65217_REGULATOR("LDO3", TPS65217_LDO_3, tps65217_pmic_ops, 32, 276 TPS65217_REG_DEFLS1, TPS65217_DEFLDO3_LDO3_MASK, 277 TPS65217_ENABLE_LS1_EN | TPS65217_DEFLDO3_LDO3_EN, 278 NULL), 279 TPS65217_REGULATOR("LDO4", TPS65217_LDO_4, tps65217_pmic_ops, 32, 280 TPS65217_REG_DEFLS2, TPS65217_DEFLDO4_LDO4_MASK, 281 TPS65217_ENABLE_LS2_EN | TPS65217_DEFLDO4_LDO4_EN, 282 NULL), 283 }; 284 285 #ifdef CONFIG_OF 286 static struct of_regulator_match reg_matches[] = { 287 { .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 }, 288 { .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 }, 289 { .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 }, 290 { .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 }, 291 { .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 }, 292 { .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 }, 293 { .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 }, 294 }; 295 296 static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev) 297 { 298 struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent); 299 struct device_node *node = tps->dev->of_node; 300 struct tps65217_board *pdata; 301 struct device_node *regs; 302 int i, count; 303 304 regs = of_find_node_by_name(node, "regulators"); 305 if (!regs) 306 return NULL; 307 308 count = of_regulator_match(&pdev->dev, regs, reg_matches, 309 TPS65217_NUM_REGULATOR); 310 of_node_put(regs); 311 if ((count < 0) || (count > TPS65217_NUM_REGULATOR)) 312 return NULL; 313 314 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); 315 if (!pdata) 316 return NULL; 317 318 for (i = 0; i < count; i++) { 319 if (!reg_matches[i].init_data || !reg_matches[i].of_node) 320 continue; 321 322 pdata->tps65217_init_data[i] = reg_matches[i].init_data; 323 pdata->of_node[i] = reg_matches[i].of_node; 324 } 325 326 return pdata; 327 } 328 #else 329 static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev) 330 { 331 return NULL; 332 } 333 #endif 334 335 static int tps65217_regulator_probe(struct platform_device *pdev) 336 { 337 struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent); 338 struct tps65217_board *pdata = dev_get_platdata(tps->dev); 339 struct regulator_init_data *reg_data; 340 struct regulator_dev *rdev; 341 struct regulator_config config = { }; 342 int i, ret; 343 344 if (tps->dev->of_node) 345 pdata = tps65217_parse_dt(pdev); 346 347 if (!pdata) { 348 dev_err(&pdev->dev, "Platform data not found\n"); 349 return -EINVAL; 350 } 351 352 if (tps65217_chip_id(tps) != TPS65217) { 353 dev_err(&pdev->dev, "Invalid tps chip version\n"); 354 return -ENODEV; 355 } 356 357 platform_set_drvdata(pdev, tps); 358 359 for (i = 0; i < TPS65217_NUM_REGULATOR; i++) { 360 361 reg_data = pdata->tps65217_init_data[i]; 362 363 /* 364 * Regulator API handles empty constraints but not NULL 365 * constraints 366 */ 367 if (!reg_data) 368 continue; 369 370 /* Register the regulators */ 371 tps->info[i] = &tps65217_pmic_regs[i]; 372 373 config.dev = tps->dev; 374 config.init_data = reg_data; 375 config.driver_data = tps; 376 config.regmap = tps->regmap; 377 if (tps->dev->of_node) 378 config.of_node = pdata->of_node[i]; 379 380 rdev = regulator_register(®ulators[i], &config); 381 if (IS_ERR(rdev)) { 382 dev_err(tps->dev, "failed to register %s regulator\n", 383 pdev->name); 384 ret = PTR_ERR(rdev); 385 goto err_unregister_regulator; 386 } 387 388 /* Save regulator for cleanup */ 389 tps->rdev[i] = rdev; 390 } 391 return 0; 392 393 err_unregister_regulator: 394 while (--i >= 0) 395 regulator_unregister(tps->rdev[i]); 396 397 return ret; 398 } 399 400 static int tps65217_regulator_remove(struct platform_device *pdev) 401 { 402 struct tps65217 *tps = platform_get_drvdata(pdev); 403 unsigned int i; 404 405 for (i = 0; i < TPS65217_NUM_REGULATOR; i++) 406 regulator_unregister(tps->rdev[i]); 407 408 platform_set_drvdata(pdev, NULL); 409 410 return 0; 411 } 412 413 static struct platform_driver tps65217_regulator_driver = { 414 .driver = { 415 .name = "tps65217-pmic", 416 }, 417 .probe = tps65217_regulator_probe, 418 .remove = tps65217_regulator_remove, 419 }; 420 421 static int __init tps65217_regulator_init(void) 422 { 423 return platform_driver_register(&tps65217_regulator_driver); 424 } 425 subsys_initcall(tps65217_regulator_init); 426 427 static void __exit tps65217_regulator_exit(void) 428 { 429 platform_driver_unregister(&tps65217_regulator_driver); 430 } 431 module_exit(tps65217_regulator_exit); 432 433 MODULE_AUTHOR("AnilKumar Ch <anilkumar@ti.com>"); 434 MODULE_DESCRIPTION("TPS65217 voltage regulator driver"); 435 MODULE_ALIAS("platform:tps65217-pmic"); 436 MODULE_LICENSE("GPL v2"); 437