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(1)
71 #define TPS65023_REG_CTRL2_DCDC3 BIT(0)
73 /* LDO_CTRL bitfields */
74 #define TPS65023_LDO_CTRL_LDOx_SHIFT(ldo_id) ((ldo_id)*4)
75 #define TPS65023_LDO_CTRL_LDOx_MASK(ldo_id) (0xF0 >> ((ldo_id)*4))
77 /* Number of step-down converters available */
78 #define TPS65023_NUM_DCDC 3
79 /* Number of LDO voltage regulators available */
80 #define TPS65023_NUM_LDO 2
81 /* Number of total regulators available */
82 #define TPS65023_NUM_REGULATOR (TPS65023_NUM_DCDC + TPS65023_NUM_LDO)
85 #define TPS65023_DCDC_1 0
86 #define TPS65023_DCDC_2 1
87 #define TPS65023_DCDC_3 2
89 #define TPS65023_LDO_1 3
90 #define TPS65023_LDO_2 4
92 #define TPS65023_MAX_REG_ID TPS65023_LDO_2
94 /* Supported voltage values for regulators */
95 static const u16 VCORE_VSEL_table
[] = {
98 1000, 1025, 1050, 1075,
99 1100, 1125, 1150, 1175,
100 1200, 1225, 1250, 1275,
101 1300, 1325, 1350, 1375,
102 1400, 1425, 1450, 1475,
103 1500, 1525, 1550, 1600,
106 /* Supported voltage values for LDO regulators for tps65020 */
107 static const u16 TPS65020_LDO1_VSEL_table
[] = {
108 1000, 1050, 1100, 1300,
109 1800, 2500, 3000, 3300,
112 static const u16 TPS65020_LDO2_VSEL_table
[] = {
113 1000, 1050, 1100, 1300,
114 1800, 2500, 3000, 3300,
117 /* Supported voltage values for LDO regulators
118 * for tps65021 and tps65023 */
119 static const u16 TPS65023_LDO1_VSEL_table
[] = {
120 1000, 1100, 1300, 1800,
121 2200, 2600, 2800, 3150,
124 static const u16 TPS65023_LDO2_VSEL_table
[] = {
125 1050, 1200, 1300, 1800,
126 2500, 2800, 3000, 3300,
129 /* Regulator specific details */
141 struct regulator_desc desc
[TPS65023_NUM_REGULATOR
];
142 struct i2c_client
*client
;
143 struct regulator_dev
*rdev
[TPS65023_NUM_REGULATOR
];
144 const struct tps_info
*info
[TPS65023_NUM_REGULATOR
];
145 struct regmap
*regmap
;
149 /* Struct passed as driver data */
150 struct tps_driver_data
{
151 const struct tps_info
*info
;
155 static int tps_65023_set_bits(struct tps_pmic
*tps
, u8 reg
, u8 mask
)
157 return regmap_update_bits(tps
->regmap
, reg
, mask
, mask
);
160 static int tps_65023_clear_bits(struct tps_pmic
*tps
, u8 reg
, u8 mask
)
162 return regmap_update_bits(tps
->regmap
, reg
, mask
, 0);
165 static int tps_65023_reg_read(struct tps_pmic
*tps
, u8 reg
)
170 ret
= regmap_read(tps
->regmap
, reg
, &val
);
178 static int tps_65023_reg_write(struct tps_pmic
*tps
, u8 reg
, u8 val
)
180 return regmap_write(tps
->regmap
, reg
, val
);
183 static int tps65023_dcdc_is_enabled(struct regulator_dev
*dev
)
185 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
186 int data
, dcdc
= rdev_get_id(dev
);
189 if (dcdc
< TPS65023_DCDC_1
|| dcdc
> TPS65023_DCDC_3
)
192 shift
= TPS65023_NUM_REGULATOR
- dcdc
;
193 data
= tps_65023_reg_read(tps
, TPS65023_REG_REG_CTRL
);
198 return (data
& 1<<shift
) ? 1 : 0;
201 static int tps65023_ldo_is_enabled(struct regulator_dev
*dev
)
203 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
204 int data
, ldo
= rdev_get_id(dev
);
207 if (ldo
< TPS65023_LDO_1
|| ldo
> TPS65023_LDO_2
)
210 shift
= (ldo
== TPS65023_LDO_1
? 1 : 2);
211 data
= tps_65023_reg_read(tps
, TPS65023_REG_REG_CTRL
);
216 return (data
& 1<<shift
) ? 1 : 0;
219 static int tps65023_dcdc_enable(struct regulator_dev
*dev
)
221 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
222 int dcdc
= rdev_get_id(dev
);
225 if (dcdc
< TPS65023_DCDC_1
|| dcdc
> TPS65023_DCDC_3
)
228 shift
= TPS65023_NUM_REGULATOR
- dcdc
;
229 return tps_65023_set_bits(tps
, TPS65023_REG_REG_CTRL
, 1 << shift
);
232 static int tps65023_dcdc_disable(struct regulator_dev
*dev
)
234 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
235 int dcdc
= rdev_get_id(dev
);
238 if (dcdc
< TPS65023_DCDC_1
|| dcdc
> TPS65023_DCDC_3
)
241 shift
= TPS65023_NUM_REGULATOR
- dcdc
;
242 return tps_65023_clear_bits(tps
, TPS65023_REG_REG_CTRL
, 1 << shift
);
245 static int tps65023_ldo_enable(struct regulator_dev
*dev
)
247 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
248 int ldo
= rdev_get_id(dev
);
251 if (ldo
< TPS65023_LDO_1
|| ldo
> TPS65023_LDO_2
)
254 shift
= (ldo
== TPS65023_LDO_1
? 1 : 2);
255 return tps_65023_set_bits(tps
, TPS65023_REG_REG_CTRL
, 1 << shift
);
258 static int tps65023_ldo_disable(struct regulator_dev
*dev
)
260 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
261 int ldo
= rdev_get_id(dev
);
264 if (ldo
< TPS65023_LDO_1
|| ldo
> TPS65023_LDO_2
)
267 shift
= (ldo
== TPS65023_LDO_1
? 1 : 2);
268 return tps_65023_clear_bits(tps
, TPS65023_REG_REG_CTRL
, 1 << shift
);
271 static int tps65023_dcdc_get_voltage(struct regulator_dev
*dev
)
273 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
274 int data
, dcdc
= rdev_get_id(dev
);
276 if (dcdc
< TPS65023_DCDC_1
|| dcdc
> TPS65023_DCDC_3
)
279 if (dcdc
== tps
->core_regulator
) {
280 data
= tps_65023_reg_read(tps
, TPS65023_REG_DEF_CORE
);
283 data
&= (tps
->info
[dcdc
]->table_len
- 1);
284 return tps
->info
[dcdc
]->table
[data
] * 1000;
286 return tps
->info
[dcdc
]->min_uV
;
289 static int tps65023_dcdc_set_voltage(struct regulator_dev
*dev
,
290 int min_uV
, int max_uV
,
293 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
294 int dcdc
= rdev_get_id(dev
);
298 if (dcdc
!= tps
->core_regulator
)
300 if (min_uV
< tps
->info
[dcdc
]->min_uV
301 || min_uV
> tps
->info
[dcdc
]->max_uV
)
303 if (max_uV
< tps
->info
[dcdc
]->min_uV
304 || max_uV
> tps
->info
[dcdc
]->max_uV
)
307 for (vsel
= 0; vsel
< tps
->info
[dcdc
]->table_len
; vsel
++) {
308 int mV
= tps
->info
[dcdc
]->table
[vsel
];
311 /* Break at the first in-range value */
312 if (min_uV
<= uV
&& uV
<= max_uV
)
318 if (vsel
== tps
->info
[dcdc
]->table_len
)
321 ret
= tps_65023_reg_write(tps
, TPS65023_REG_DEF_CORE
, vsel
);
323 /* Tell the chip that we have changed the value in DEFCORE
324 * and its time to update the core voltage
326 tps_65023_set_bits(tps
, TPS65023_REG_CON_CTRL2
,
327 TPS65023_REG_CTRL2_GO
);
335 static int tps65023_ldo_get_voltage(struct regulator_dev
*dev
)
337 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
338 int data
, ldo
= rdev_get_id(dev
);
340 if (ldo
< TPS65023_LDO_1
|| ldo
> TPS65023_LDO_2
)
343 data
= tps_65023_reg_read(tps
, TPS65023_REG_LDO_CTRL
);
347 data
>>= (TPS65023_LDO_CTRL_LDOx_SHIFT(ldo
- TPS65023_LDO_1
));
348 data
&= (tps
->info
[ldo
]->table_len
- 1);
349 return tps
->info
[ldo
]->table
[data
] * 1000;
352 static int tps65023_ldo_set_voltage(struct regulator_dev
*dev
,
353 int min_uV
, int max_uV
, unsigned *selector
)
355 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
356 int data
, vsel
, ldo
= rdev_get_id(dev
);
358 if (ldo
< TPS65023_LDO_1
|| ldo
> TPS65023_LDO_2
)
361 if (min_uV
< tps
->info
[ldo
]->min_uV
|| min_uV
> tps
->info
[ldo
]->max_uV
)
363 if (max_uV
< tps
->info
[ldo
]->min_uV
|| max_uV
> tps
->info
[ldo
]->max_uV
)
366 for (vsel
= 0; vsel
< tps
->info
[ldo
]->table_len
; vsel
++) {
367 int mV
= tps
->info
[ldo
]->table
[vsel
];
370 /* Break at the first in-range value */
371 if (min_uV
<= uV
&& uV
<= max_uV
)
375 if (vsel
== tps
->info
[ldo
]->table_len
)
380 data
= tps_65023_reg_read(tps
, TPS65023_REG_LDO_CTRL
);
384 data
&= TPS65023_LDO_CTRL_LDOx_MASK(ldo
- TPS65023_LDO_1
);
385 data
|= (vsel
<< (TPS65023_LDO_CTRL_LDOx_SHIFT(ldo
- TPS65023_LDO_1
)));
386 return tps_65023_reg_write(tps
, TPS65023_REG_LDO_CTRL
, data
);
389 static int tps65023_dcdc_list_voltage(struct regulator_dev
*dev
,
392 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
393 int dcdc
= rdev_get_id(dev
);
395 if (dcdc
< TPS65023_DCDC_1
|| dcdc
> TPS65023_DCDC_3
)
398 if (dcdc
== tps
->core_regulator
) {
399 if (selector
>= tps
->info
[dcdc
]->table_len
)
402 return tps
->info
[dcdc
]->table
[selector
] * 1000;
404 return tps
->info
[dcdc
]->min_uV
;
407 static int tps65023_ldo_list_voltage(struct regulator_dev
*dev
,
410 struct tps_pmic
*tps
= rdev_get_drvdata(dev
);
411 int ldo
= rdev_get_id(dev
);
413 if (ldo
< TPS65023_LDO_1
|| ldo
> TPS65023_LDO_2
)
416 if (selector
>= tps
->info
[ldo
]->table_len
)
419 return tps
->info
[ldo
]->table
[selector
] * 1000;
422 /* Operations permitted on VDCDCx */
423 static struct regulator_ops tps65023_dcdc_ops
= {
424 .is_enabled
= tps65023_dcdc_is_enabled
,
425 .enable
= tps65023_dcdc_enable
,
426 .disable
= tps65023_dcdc_disable
,
427 .get_voltage
= tps65023_dcdc_get_voltage
,
428 .set_voltage
= tps65023_dcdc_set_voltage
,
429 .list_voltage
= tps65023_dcdc_list_voltage
,
432 /* Operations permitted on LDOx */
433 static struct regulator_ops tps65023_ldo_ops
= {
434 .is_enabled
= tps65023_ldo_is_enabled
,
435 .enable
= tps65023_ldo_enable
,
436 .disable
= tps65023_ldo_disable
,
437 .get_voltage
= tps65023_ldo_get_voltage
,
438 .set_voltage
= tps65023_ldo_set_voltage
,
439 .list_voltage
= tps65023_ldo_list_voltage
,
442 static struct regmap_config tps65023_regmap_config
= {
447 static int __devinit
tps_65023_probe(struct i2c_client
*client
,
448 const struct i2c_device_id
*id
)
450 const struct tps_driver_data
*drv_data
= (void *)id
->driver_data
;
451 const struct tps_info
*info
= drv_data
->info
;
452 struct regulator_init_data
*init_data
;
453 struct regulator_dev
*rdev
;
454 struct tps_pmic
*tps
;
458 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_SMBUS_BYTE_DATA
))
462 * init_data points to array of regulator_init structures
463 * coming from the board-evm file.
465 init_data
= client
->dev
.platform_data
;
469 tps
= kzalloc(sizeof(*tps
), GFP_KERNEL
);
473 tps
->regmap
= regmap_init_i2c(client
, &tps65023_regmap_config
);
474 if (IS_ERR(tps
->regmap
)) {
475 error
= PTR_ERR(tps
->regmap
);
476 dev_err(&client
->dev
, "Failed to allocate register map: %d\n",
481 /* common for all regulators */
482 tps
->client
= client
;
483 tps
->core_regulator
= drv_data
->core_regulator
;
485 for (i
= 0; i
< TPS65023_NUM_REGULATOR
; i
++, info
++, init_data
++) {
486 /* Store regulator specific information */
489 tps
->desc
[i
].name
= info
->name
;
491 tps
->desc
[i
].n_voltages
= info
->table_len
;
492 tps
->desc
[i
].ops
= (i
> TPS65023_DCDC_3
?
493 &tps65023_ldo_ops
: &tps65023_dcdc_ops
);
494 tps
->desc
[i
].type
= REGULATOR_VOLTAGE
;
495 tps
->desc
[i
].owner
= THIS_MODULE
;
497 /* Register the regulators */
498 rdev
= regulator_register(&tps
->desc
[i
], &client
->dev
,
501 dev_err(&client
->dev
, "failed to register %s\n",
503 error
= PTR_ERR(rdev
);
507 /* Save regulator for cleanup */
511 i2c_set_clientdata(client
, tps
);
513 /* Enable setting output voltage by I2C */
514 tps_65023_clear_bits(tps
, TPS65023_REG_CON_CTRL2
,
515 TPS65023_REG_CTRL2_CORE_ADJ
);
517 /* Enable setting output voltage by I2C */
518 tps_65023_clear_bits(tps
, TPS65023_REG_CON_CTRL2
,
519 TPS65023_REG_CTRL2_CORE_ADJ
);
525 regulator_unregister(tps
->rdev
[i
]);
527 regmap_exit(tps
->regmap
);
534 * tps_65023_remove - TPS65023 driver i2c remove handler
535 * @client: i2c driver client device structure
537 * Unregister TPS driver as an i2c client device driver
539 static int __devexit
tps_65023_remove(struct i2c_client
*client
)
541 struct tps_pmic
*tps
= i2c_get_clientdata(client
);
544 for (i
= 0; i
< TPS65023_NUM_REGULATOR
; i
++)
545 regulator_unregister(tps
->rdev
[i
]);
547 regmap_exit(tps
->regmap
);
553 static const struct tps_info tps65020_regs
[] = {
570 .table_len
= ARRAY_SIZE(VCORE_VSEL_table
),
571 .table
= VCORE_VSEL_table
,
578 .table_len
= ARRAY_SIZE(TPS65020_LDO1_VSEL_table
),
579 .table
= TPS65020_LDO1_VSEL_table
,
585 .table_len
= ARRAY_SIZE(TPS65020_LDO2_VSEL_table
),
586 .table
= TPS65020_LDO2_VSEL_table
,
590 static const struct tps_info tps65021_regs
[] = {
607 .table_len
= ARRAY_SIZE(VCORE_VSEL_table
),
608 .table
= VCORE_VSEL_table
,
614 .table_len
= ARRAY_SIZE(TPS65023_LDO1_VSEL_table
),
615 .table
= TPS65023_LDO1_VSEL_table
,
621 .table_len
= ARRAY_SIZE(TPS65023_LDO2_VSEL_table
),
622 .table
= TPS65023_LDO2_VSEL_table
,
626 static const struct tps_info tps65023_regs
[] = {
631 .table_len
= ARRAY_SIZE(VCORE_VSEL_table
),
632 .table
= VCORE_VSEL_table
,
650 .table_len
= ARRAY_SIZE(TPS65023_LDO1_VSEL_table
),
651 .table
= TPS65023_LDO1_VSEL_table
,
657 .table_len
= ARRAY_SIZE(TPS65023_LDO2_VSEL_table
),
658 .table
= TPS65023_LDO2_VSEL_table
,
662 static struct tps_driver_data tps65020_drv_data
= {
663 .info
= tps65020_regs
,
664 .core_regulator
= TPS65023_DCDC_3
,
667 static struct tps_driver_data tps65021_drv_data
= {
668 .info
= tps65021_regs
,
669 .core_regulator
= TPS65023_DCDC_3
,
672 static struct tps_driver_data tps65023_drv_data
= {
673 .info
= tps65023_regs
,
674 .core_regulator
= TPS65023_DCDC_1
,
677 static const struct i2c_device_id tps_65023_id
[] = {
679 .driver_data
= (unsigned long) &tps65023_drv_data
},
681 .driver_data
= (unsigned long) &tps65021_drv_data
,},
683 .driver_data
= (unsigned long) &tps65020_drv_data
},
687 MODULE_DEVICE_TABLE(i2c
, tps_65023_id
);
689 static struct i2c_driver tps_65023_i2c_driver
= {
692 .owner
= THIS_MODULE
,
694 .probe
= tps_65023_probe
,
695 .remove
= __devexit_p(tps_65023_remove
),
696 .id_table
= tps_65023_id
,
702 * Module init function
704 static int __init
tps_65023_init(void)
706 return i2c_add_driver(&tps_65023_i2c_driver
);
708 subsys_initcall(tps_65023_init
);
713 * Module exit function
715 static void __exit
tps_65023_cleanup(void)
717 i2c_del_driver(&tps_65023_i2c_driver
);
719 module_exit(tps_65023_cleanup
);
721 MODULE_AUTHOR("Texas Instruments");
722 MODULE_DESCRIPTION("TPS65023 voltage regulator driver");
723 MODULE_LICENSE("GPL v2");