4 * Supports TPS65023 Regulator
6 * Copyright (C) 2009 Texas Instrument Incorporated - http://www.ti.com/
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.
12 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
13 * whether express or implied; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/init.h>
21 #include <linux/err.h>
22 #include <linux/platform_device.h>
23 #include <linux/regulator/driver.h>
24 #include <linux/regulator/machine.h>
25 #include <linux/i2c.h>
26 #include <linux/delay.h>
27 #include <linux/slab.h>
28 #include <linux/regmap.h>
30 /* Register definitions */
31 #define TPS65023_REG_VERSION 0
32 #define TPS65023_REG_PGOODZ 1
33 #define TPS65023_REG_MASK 2
34 #define TPS65023_REG_REG_CTRL 3
35 #define TPS65023_REG_CON_CTRL 4
36 #define TPS65023_REG_CON_CTRL2 5
37 #define TPS65023_REG_DEF_CORE 6
38 #define TPS65023_REG_DEFSLEW 7
39 #define TPS65023_REG_LDO_CTRL 8
41 /* PGOODZ bitfields */
42 #define TPS65023_PGOODZ_PWRFAILZ BIT(7)
43 #define TPS65023_PGOODZ_LOWBATTZ BIT(6)
44 #define TPS65023_PGOODZ_VDCDC1 BIT(5)
45 #define TPS65023_PGOODZ_VDCDC2 BIT(4)
46 #define TPS65023_PGOODZ_VDCDC3 BIT(3)
47 #define TPS65023_PGOODZ_LDO2 BIT(2)
48 #define TPS65023_PGOODZ_LDO1 BIT(1)
51 #define TPS65023_MASK_PWRFAILZ BIT(7)
52 #define TPS65023_MASK_LOWBATTZ BIT(6)
53 #define TPS65023_MASK_VDCDC1 BIT(5)
54 #define TPS65023_MASK_VDCDC2 BIT(4)
55 #define TPS65023_MASK_VDCDC3 BIT(3)
56 #define TPS65023_MASK_LDO2 BIT(2)
57 #define TPS65023_MASK_LDO1 BIT(1)
59 /* REG_CTRL bitfields */
60 #define TPS65023_REG_CTRL_VDCDC1_EN BIT(5)
61 #define TPS65023_REG_CTRL_VDCDC2_EN BIT(4)
62 #define TPS65023_REG_CTRL_VDCDC3_EN BIT(3)
63 #define TPS65023_REG_CTRL_LDO2_EN BIT(2)
64 #define TPS65023_REG_CTRL_LDO1_EN BIT(1)
66 /* REG_CTRL2 bitfields */
67 #define TPS65023_REG_CTRL2_GO BIT(7)
68 #define TPS65023_REG_CTRL2_CORE_ADJ BIT(6)
69 #define TPS65023_REG_CTRL2_DCDC2 BIT(2)
70 #define TPS65023_REG_CTRL2_DCDC1 BIT(2)
71 #define TPS65023_REG_CTRL2_DCDC3 BIT(0)
73 /* REG_CTRL2 bitfields */
74 #define TPS65023_REG_CTRL2_GO BIT(7)
75 #define TPS65023_REG_CTRL2_CORE_ADJ BIT(6)
76 #define TPS65023_REG_CTRL2_DCDC2 BIT(2)
77 #define TPS65023_REG_CTRL2_DCDC1 BIT(1)
78 #define TPS65023_REG_CTRL2_DCDC3 BIT(0)
80 /* LDO_CTRL bitfields */
81 #define TPS65023_LDO_CTRL_LDOx_SHIFT(ldo_id) ((ldo_id)*4)
82 #define TPS65023_LDO_CTRL_LDOx_MASK(ldo_id) (0xF0 >> ((ldo_id)*4))
84 /* Number of step-down converters available */
85 #define TPS65023_NUM_DCDC 3
86 /* Number of LDO voltage regulators available */
87 #define TPS65023_NUM_LDO 2
88 /* Number of total regulators available */
89 #define TPS65023_NUM_REGULATOR (TPS65023_NUM_DCDC + TPS65023_NUM_LDO)
92 #define TPS65023_DCDC_1 0
93 #define TPS65023_DCDC_2 1
94 #define TPS65023_DCDC_3 2
96 #define TPS65023_LDO_1 3
97 #define TPS65023_LDO_2 4
99 #define TPS65023_MAX_REG_ID TPS65023_LDO_2
101 /* Supported voltage values for regulators */
102 static const u16 VCORE_VSEL_table[] = {
105 1000, 1025, 1050, 1075,
106 1100, 1125, 1150, 1175,
107 1200, 1225, 1250, 1275,
108 1300, 1325, 1350, 1375,
109 1400, 1425, 1450, 1475,
110 1500, 1525, 1550, 1600,
115 /* Supported voltage values for LDO regulators
116 * for tps65021 and tps65023 */
117 static const u16 TPS65023_LDO1_VSEL_table[] = {
118 1000, 1100, 1300, 1800,
119 2200, 2600, 2800, 3150,
122 static const u16 TPS65023_LDO2_VSEL_table[] = {
123 1050, 1200, 1300, 1800,
124 2500, 2800, 3000, 3300,
127 /* Regulator specific details */
139 struct regulator_desc desc[TPS65023_NUM_REGULATOR];
140 struct i2c_client *client;
141 struct regulator_dev *rdev[TPS65023_NUM_REGULATOR];
142 const struct tps_info *info[TPS65023_NUM_REGULATOR];
143 struct regmap *regmap;
147 /* Struct passed as driver data */
148 struct tps_driver_data {
149 const struct tps_info *info;
153 static int tps_65023_set_bits(struct tps_pmic *tps, u8 reg, u8 mask)
155 return regmap_update_bits(tps->regmap, reg, mask, mask);
158 static int tps_65023_clear_bits(struct tps_pmic *tps, u8 reg, u8 mask)
160 return regmap_update_bits(tps->regmap, reg, mask, 0);
163 static int tps_65023_reg_read(struct tps_pmic *tps, u8 reg)
168 ret = regmap_read(tps->regmap, reg, &val);
176 static int tps_65023_reg_write(struct tps_pmic *tps, u8 reg, u8 val)
178 return regmap_write(tps->regmap, reg, val);
181 static int tps65023_dcdc_is_enabled(struct regulator_dev *dev)
183 struct tps_pmic *tps = rdev_get_drvdata(dev);
184 int data, dcdc = rdev_get_id(dev);
187 if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
190 shift = TPS65023_NUM_REGULATOR - dcdc;
191 data = tps_65023_reg_read(tps, TPS65023_REG_REG_CTRL);
196 return (data & 1<<shift) ? 1 : 0;
199 static int tps65023_ldo_is_enabled(struct regulator_dev *dev)
201 struct tps_pmic *tps = rdev_get_drvdata(dev);
202 int data, ldo = rdev_get_id(dev);
205 if (ldo < TPS65023_LDO_1 || ldo > TPS65023_LDO_2)
208 shift = (ldo == TPS65023_LDO_1 ? 1 : 2);
209 data = tps_65023_reg_read(tps, TPS65023_REG_REG_CTRL);
214 return (data & 1<<shift) ? 1 : 0;
217 static int tps65023_dcdc_enable(struct regulator_dev *dev)
219 struct tps_pmic *tps = rdev_get_drvdata(dev);
220 int dcdc = rdev_get_id(dev);
223 if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
226 shift = TPS65023_NUM_REGULATOR - dcdc;
227 return tps_65023_set_bits(tps, TPS65023_REG_REG_CTRL, 1 << shift);
230 static int tps65023_dcdc_disable(struct regulator_dev *dev)
232 struct tps_pmic *tps = rdev_get_drvdata(dev);
233 int dcdc = rdev_get_id(dev);
236 if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
239 shift = TPS65023_NUM_REGULATOR - dcdc;
240 return tps_65023_clear_bits(tps, TPS65023_REG_REG_CTRL, 1 << shift);
243 static int tps65023_ldo_enable(struct regulator_dev *dev)
245 struct tps_pmic *tps = rdev_get_drvdata(dev);
246 int ldo = rdev_get_id(dev);
249 if (ldo < TPS65023_LDO_1 || ldo > TPS65023_LDO_2)
252 shift = (ldo == TPS65023_LDO_1 ? 1 : 2);
253 return tps_65023_set_bits(tps, TPS65023_REG_REG_CTRL, 1 << shift);
256 static int tps65023_ldo_disable(struct regulator_dev *dev)
258 struct tps_pmic *tps = rdev_get_drvdata(dev);
259 int ldo = rdev_get_id(dev);
262 if (ldo < TPS65023_LDO_1 || ldo > TPS65023_LDO_2)
265 shift = (ldo == TPS65023_LDO_1 ? 1 : 2);
266 return tps_65023_clear_bits(tps, TPS65023_REG_REG_CTRL, 1 << shift);
269 static int tps65023_dcdc_get_voltage(struct regulator_dev *dev)
271 struct tps_pmic *tps = rdev_get_drvdata(dev);
272 int data, dcdc = rdev_get_id(dev);
274 if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
277 if (dcdc == tps->core_regulator) {
278 data = tps_65023_reg_read(tps, TPS65023_REG_DEF_CORE);
281 data &= (tps->info[dcdc]->table_len - 1);
282 return tps->info[dcdc]->table[data] * 1000;
284 return tps->info[dcdc]->min_uV;
287 static int tps65023_dcdc_set_voltage(struct regulator_dev *dev,
288 int min_uV, int max_uV,
291 struct tps_pmic *tps = rdev_get_drvdata(dev);
292 int dcdc = rdev_get_id(dev);
296 if (dcdc != tps->core_regulator)
298 if (min_uV < tps->info[dcdc]->min_uV
299 || min_uV > tps->info[dcdc]->max_uV)
301 if (max_uV < tps->info[dcdc]->min_uV
302 || max_uV > tps->info[dcdc]->max_uV)
305 for (vsel = 0; vsel < tps->info[dcdc]->table_len; vsel++) {
306 int mV = tps->info[dcdc]->table[vsel];
309 /* Break at the first in-range value */
310 if (min_uV <= uV && uV <= max_uV)
316 if (vsel == tps->info[dcdc]->table_len)
319 ret = tps_65023_reg_write(tps, TPS65023_REG_DEF_CORE, vsel);
321 /* Tell the chip that we have changed the value in DEFCORE
322 * and its time to update the core voltage
324 tps_65023_set_bits(tps, TPS65023_REG_CON_CTRL2,
325 TPS65023_REG_CTRL2_GO);
333 static int tps65023_ldo_get_voltage(struct regulator_dev *dev)
335 struct tps_pmic *tps = rdev_get_drvdata(dev);
336 int data, ldo = rdev_get_id(dev);
338 if (ldo < TPS65023_LDO_1 || ldo > TPS65023_LDO_2)
341 data = tps_65023_reg_read(tps, TPS65023_REG_LDO_CTRL);
345 data >>= (TPS65023_LDO_CTRL_LDOx_SHIFT(ldo - TPS65023_LDO_1));
346 data &= (tps->info[ldo]->table_len - 1);
347 return tps->info[ldo]->table[data] * 1000;
350 static int tps65023_ldo_set_voltage(struct regulator_dev *dev,
351 int min_uV, int max_uV, unsigned *selector)
353 struct tps_pmic *tps = rdev_get_drvdata(dev);
354 int data, vsel, ldo = rdev_get_id(dev);
356 if (ldo < TPS65023_LDO_1 || ldo > TPS65023_LDO_2)
359 if (min_uV < tps->info[ldo]->min_uV || min_uV > tps->info[ldo]->max_uV)
361 if (max_uV < tps->info[ldo]->min_uV || max_uV > tps->info[ldo]->max_uV)
364 for (vsel = 0; vsel < tps->info[ldo]->table_len; vsel++) {
365 int mV = tps->info[ldo]->table[vsel];
368 /* Break at the first in-range value */
369 if (min_uV <= uV && uV <= max_uV)
373 if (vsel == tps->info[ldo]->table_len)
378 data = tps_65023_reg_read(tps, TPS65023_REG_LDO_CTRL);
382 data &= TPS65023_LDO_CTRL_LDOx_MASK(ldo - TPS65023_LDO_1);
383 data |= (vsel << (TPS65023_LDO_CTRL_LDOx_SHIFT(ldo - TPS65023_LDO_1)));
384 return tps_65023_reg_write(tps, TPS65023_REG_LDO_CTRL, data);
387 static int tps65023_dcdc_list_voltage(struct regulator_dev *dev,
390 struct tps_pmic *tps = rdev_get_drvdata(dev);
391 int dcdc = rdev_get_id(dev);
393 if (dcdc < TPS65023_DCDC_1 || dcdc > TPS65023_DCDC_3)
396 if (dcdc == tps->core_regulator) {
397 if (selector >= tps->info[dcdc]->table_len)
400 return tps->info[dcdc]->table[selector] * 1000;
402 return tps->info[dcdc]->min_uV;
405 static int tps65023_ldo_list_voltage(struct regulator_dev *dev,
408 struct tps_pmic *tps = rdev_get_drvdata(dev);
409 int ldo = rdev_get_id(dev);
411 if (ldo < TPS65023_LDO_1 || ldo > TPS65023_LDO_2)
414 if (selector >= tps->info[ldo]->table_len)
417 return tps->info[ldo]->table[selector] * 1000;
420 /* Operations permitted on VDCDCx */
421 static struct regulator_ops tps65023_dcdc_ops = {
422 .is_enabled = tps65023_dcdc_is_enabled,
423 .enable = tps65023_dcdc_enable,
424 .disable = tps65023_dcdc_disable,
425 .get_voltage = tps65023_dcdc_get_voltage,
426 .set_voltage = tps65023_dcdc_set_voltage,
427 .list_voltage = tps65023_dcdc_list_voltage,
430 /* Operations permitted on LDOx */
431 static struct regulator_ops tps65023_ldo_ops = {
432 .is_enabled = tps65023_ldo_is_enabled,
433 .enable = tps65023_ldo_enable,
434 .disable = tps65023_ldo_disable,
435 .get_voltage = tps65023_ldo_get_voltage,
436 .set_voltage = tps65023_ldo_set_voltage,
437 .list_voltage = tps65023_ldo_list_voltage,
440 static struct regmap_config tps65023_regmap_config = {
445 static int __devinit tps_65023_probe(struct i2c_client *client,
446 const struct i2c_device_id *id)
448 const struct tps_driver_data *drv_data = (void *)id->driver_data;
449 const struct tps_info *info = drv_data->info;
450 struct regulator_init_data *init_data;
451 struct regulator_dev *rdev;
452 struct tps_pmic *tps;
456 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
460 * init_data points to array of regulator_init structures
461 * coming from the board-evm file.
463 init_data = client->dev.platform_data;
467 tps = kzalloc(sizeof(*tps), GFP_KERNEL);
471 tps->regmap = regmap_init_i2c(client, &tps65023_regmap_config);
472 if (IS_ERR(tps->regmap)) {
473 error = PTR_ERR(tps->regmap);
474 dev_err(&client->dev, "Failed to allocate register map: %d\n",
479 /* common for all regulators */
480 tps->client = client;
481 tps->core_regulator = drv_data->core_regulator;
483 for (i = 0; i < TPS65023_NUM_REGULATOR; i++, info++, init_data++) {
484 /* Store regulator specific information */
487 tps->desc[i].name = info->name;
489 tps->desc[i].n_voltages = info->table_len;
490 tps->desc[i].ops = (i > TPS65023_DCDC_3 ?
491 &tps65023_ldo_ops : &tps65023_dcdc_ops);
492 tps->desc[i].type = REGULATOR_VOLTAGE;
493 tps->desc[i].owner = THIS_MODULE;
495 /* Register the regulators */
496 rdev = regulator_register(&tps->desc[i], &client->dev,
499 dev_err(&client->dev, "failed to register %s\n",
501 error = PTR_ERR(rdev);
505 /* Save regulator for cleanup */
509 i2c_set_clientdata(client, tps);
511 /* Enable setting output voltage by I2C */
512 tps_65023_clear_bits(tps, TPS65023_REG_CON_CTRL2,
513 TPS65023_REG_CTRL2_CORE_ADJ);
515 /* Enable setting output voltage by I2C */
516 tps_65023_clear_bits(tps, TPS65023_REG_CON_CTRL2,
517 TPS65023_REG_CTRL2_CORE_ADJ);
523 regulator_unregister(tps->rdev[i]);
525 regmap_exit(tps->regmap);
532 * tps_65023_remove - TPS65023 driver i2c remove handler
533 * @client: i2c driver client device structure
535 * Unregister TPS driver as an i2c client device driver
537 static int __devexit tps_65023_remove(struct i2c_client *client)
539 struct tps_pmic *tps = i2c_get_clientdata(client);
542 for (i = 0; i < TPS65023_NUM_REGULATOR; i++)
543 regulator_unregister(tps->rdev[i]);
545 regmap_exit(tps->regmap);
551 static const struct tps_info tps65021_regs[] = {
568 .table_len = ARRAY_SIZE(VCORE_VSEL_table),
569 .table = VCORE_VSEL_table,
575 .table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
576 .table = TPS65023_LDO1_VSEL_table,
582 .table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
583 .table = TPS65023_LDO2_VSEL_table,
587 static const struct tps_info tps65023_regs[] = {
592 .table_len = ARRAY_SIZE(VCORE_VSEL_table),
593 .table = VCORE_VSEL_table,
611 .table_len = ARRAY_SIZE(TPS65023_LDO1_VSEL_table),
612 .table = TPS65023_LDO1_VSEL_table,
618 .table_len = ARRAY_SIZE(TPS65023_LDO2_VSEL_table),
619 .table = TPS65023_LDO2_VSEL_table,
623 static struct tps_driver_data tps65021_drv_data = {
624 .info = tps65021_regs,
625 .core_regulator = TPS65023_DCDC_3,
628 static struct tps_driver_data tps65023_drv_data = {
629 .info = tps65023_regs,
630 .core_regulator = TPS65023_DCDC_1,
633 static const struct i2c_device_id tps_65023_id[] = {
635 .driver_data = (unsigned long) &tps65023_drv_data},
637 .driver_data = (unsigned long) &tps65021_drv_data,},
641 MODULE_DEVICE_TABLE(i2c, tps_65023_id);
643 static struct i2c_driver tps_65023_i2c_driver = {
646 .owner = THIS_MODULE,
648 .probe = tps_65023_probe,
649 .remove = __devexit_p(tps_65023_remove),
650 .id_table = tps_65023_id,
656 * Module init function
658 static int __init tps_65023_init(void)
660 return i2c_add_driver(&tps_65023_i2c_driver);
662 subsys_initcall(tps_65023_init);
667 * Module exit function
669 static void __exit tps_65023_cleanup(void)
671 i2c_del_driver(&tps_65023_i2c_driver);
673 module_exit(tps_65023_cleanup);
675 MODULE_AUTHOR("Texas Instruments");
676 MODULE_DESCRIPTION("TPS65023 voltage regulator driver");
677 MODULE_LICENSE("GPL v2");