1 /* drivers/regulator/act8891.c
3 * Copyright (C) 2011 ROCKCHIP, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 /*******************************************************************/
16 /* COPYRIGHT (C) ROCK-CHIPS FUZHOU . ALL RIGHTS RESERVED. */
17 /*******************************************************************
19 DESC : act8891 PMIC driver
25 ********************************************************************/
28 #include <linux/bug.h>
29 #include <linux/err.h>
30 #include <linux/i2c.h>
31 #include <linux/kernel.h>
32 #include <linux/regulator/driver.h>
33 #include <linux/regulator/act8891.h>
34 #include <mach/gpio.h>
35 #include <linux/delay.h>
36 #include <mach/iomux.h>
39 #define DBG(x...) printk(KERN_INFO x)
44 #define DBG_INFO(x...) printk(KERN_INFO x)
46 #define DBG_INFO(x...)
53 struct i2c_client *i2c;
55 struct regulator_dev **rdev;
58 static u8 act8891_reg_read(struct act8891 *act8891, u8 reg);
59 static int act8891_set_bits(struct act8891 *act8891, u8 reg, u16 mask, u16 val);
62 #define act8891_BUCK1_SET_VOL_BASE 0x20
63 #define act8891_BUCK2_SET_VOL_BASE 0x30
64 #define act8891_BUCK3_SET_VOL_BASE 0x40
65 #define act8891_LDO1_SET_VOL_BASE 0x50
66 #define act8891_LDO2_SET_VOL_BASE 0x54
67 #define act8891_LDO3_SET_VOL_BASE 0x60
68 #define act8891_LDO4_SET_VOL_BASE 0x64
70 #define act8891_BUCK1_CONTR_BASE 0x22
71 #define act8891_BUCK2_CONTR_BASE 0x32
72 #define act8891_BUCK3_CONTR_BASE 0x42
73 #define act8891_LDO1_CONTR_BASE 0x51
74 #define act8891_LDO2_CONTR_BASE 0x55
75 #define act8891_LDO3_CONTR_BASE 0x61
76 #define act8891_LDO4_CONTR_BASE 0x65
78 #define BUCK_VOL_MASK 0x3f
79 #define LDO_VOL_MASK 0x3f
81 #define VOL_MIN_IDX 0x00
82 #define VOL_MAX_IDX 0x3f
84 const static int buck_set_vol_base_addr[] = {
85 act8891_BUCK1_SET_VOL_BASE,
86 act8891_BUCK2_SET_VOL_BASE,
87 act8891_BUCK3_SET_VOL_BASE,
89 const static int buck_contr_base_addr[] = {
90 act8891_BUCK1_CONTR_BASE,
91 act8891_BUCK2_CONTR_BASE,
92 act8891_BUCK3_CONTR_BASE,
94 #define act8891_BUCK_SET_VOL_REG(x) (buck_set_vol_base_addr[x])
95 #define act8891_BUCK_CONTR_REG(x) (buck_contr_base_addr[x])
98 const static int ldo_set_vol_base_addr[] = {
99 act8891_LDO1_SET_VOL_BASE,
100 act8891_LDO2_SET_VOL_BASE,
101 act8891_LDO3_SET_VOL_BASE,
102 act8891_LDO4_SET_VOL_BASE,
104 const static int ldo_contr_base_addr[] = {
105 act8891_LDO1_CONTR_BASE,
106 act8891_LDO2_CONTR_BASE,
107 act8891_LDO3_CONTR_BASE,
108 act8891_LDO4_CONTR_BASE,
110 #define act8891_LDO_SET_VOL_REG(x) (ldo_set_vol_base_addr[x])
111 #define act8891_LDO_CONTR_REG(x) (ldo_contr_base_addr[x])
113 const static int buck_voltage_map[] = {
114 600, 625, 650, 675, 700, 725, 750, 775,
115 800, 825, 850, 875, 900, 925, 950, 975,
116 1000, 1025, 1050, 1075, 1100, 1125, 1150,
117 1175, 1200, 1250, 1300, 1350, 1400, 1450,
118 1500, 1550, 1600, 1650, 1700, 1750, 1800,
119 1850, 1900, 1950, 2000, 2050, 2100, 2150,
120 2200, 2250, 2300, 2350, 2400, 2500, 2600,
121 2700, 2800, 2850, 2900, 3000, 3100, 3200,
122 3300, 3400, 3500, 3600, 3700, 3800, 3900,
125 const static int ldo_voltage_map[] = {
126 600, 625, 650, 675, 700, 725, 750, 775,
127 800, 825, 850, 875, 900, 925, 950, 975,
128 1000, 1025, 1050, 1075, 1100, 1125, 1150,
129 1175, 1200, 1250, 1300, 1350, 1400, 1450,
130 1500, 1550, 1600, 1650, 1700, 1750, 1800,
131 1850, 1900, 1950, 2000, 2050, 2100, 2150,
132 2200, 2250, 2300, 2350, 2400, 2500, 2600,
133 2700, 2800, 2850, 2900, 3000, 3100, 3200,
134 3300, 3400, 3500, 3600, 3700, 3800, 3900,
137 static int act8891_ldo_list_voltage(struct regulator_dev *dev, unsigned index)
139 return 1000 * ldo_voltage_map[index];
141 static int act8891_ldo_is_enabled(struct regulator_dev *dev)
143 struct act8891 *act8891 = rdev_get_drvdata(dev);
144 int ldo = rdev_get_id(dev) -ACT8891_LDO1;
147 val = act8891_reg_read(act8891, act8891_LDO_CONTR_REG(ldo));
156 static int act8891_ldo_enable(struct regulator_dev *dev)
158 struct act8891 *act8891 = rdev_get_drvdata(dev);
159 int ldo= rdev_get_id(dev) -ACT8891_LDO1;
162 return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, 0x80);
165 static int act8891_ldo_disable(struct regulator_dev *dev)
167 struct act8891 *act8891 = rdev_get_drvdata(dev);
168 int ldo= rdev_get_id(dev) -ACT8891_LDO1;
171 return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, 0);
174 static int act8891_ldo_get_voltage(struct regulator_dev *dev)
176 struct act8891 *act8891 = rdev_get_drvdata(dev);
177 int ldo= rdev_get_id(dev) -ACT8891_LDO1;
180 reg = act8891_reg_read(act8891,act8891_LDO_SET_VOL_REG(ldo));
182 val = 1000 * ldo_voltage_map[reg];
185 static int act8891_ldo_set_voltage(struct regulator_dev *dev,
186 int min_uV, int max_uV)
188 struct act8891 *act8891 = rdev_get_drvdata(dev);
189 int ldo= rdev_get_id(dev) -ACT8891_LDO1;
190 int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
191 const int *vol_map =ldo_voltage_map;
194 if (min_vol < vol_map[VOL_MIN_IDX] ||
195 min_vol > vol_map[VOL_MAX_IDX])
198 for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX;
200 if (vol_map[val] >= min_vol)
203 if (vol_map[val] > max_vol)
206 ret = act8891_set_bits(act8891, act8891_LDO_SET_VOL_REG(ldo),
212 static int act8891_ldo_get_mode(struct regulator_dev *dev, unsigned index)
214 struct act8891 *act8891 = rdev_get_drvdata(dev);
215 int ldo = rdev_get_id(dev) -ACT8891_LDO1 ;
218 val = act8891_reg_read(act8891, act8891_LDO_CONTR_REG(ldo));
221 return REGULATOR_MODE_NORMAL;
223 return REGULATOR_MODE_STANDBY;
226 static int act8891_ldo_set_mode(struct regulator_dev *dev, unsigned int mode)
228 struct act8891 *act8891 = rdev_get_drvdata(dev);
229 int ldo = rdev_get_id(dev) -ACT8891_LDO1 ;
233 case REGULATOR_MODE_NORMAL:
234 return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, 0);
235 case REGULATOR_MODE_STANDBY:
236 return act8891_set_bits(act8891, act8891_LDO_CONTR_REG(ldo), mask, mask);
238 printk("error:pmu_act8891 only lowpower and nomal mode\n");
244 static struct regulator_ops act8891_ldo_ops = {
245 .set_voltage = act8891_ldo_set_voltage,
246 .get_voltage = act8891_ldo_get_voltage,
247 .list_voltage = act8891_ldo_list_voltage,
248 .is_enabled = act8891_ldo_is_enabled,
249 .enable = act8891_ldo_enable,
250 .disable = act8891_ldo_disable,
251 .get_mode = act8891_ldo_get_mode,
252 .set_mode = act8891_ldo_set_mode,
256 static int act8891_dcdc_list_voltage(struct regulator_dev *dev, unsigned index)
258 return 1000 * buck_voltage_map[index];
260 static int act8891_dcdc_is_enabled(struct regulator_dev *dev)
262 struct act8891 *act8891 = rdev_get_drvdata(dev);
263 int buck = rdev_get_id(dev) -ACT8891_DCDC1;
266 val = act8891_reg_read(act8891, act8891_BUCK_CONTR_REG(buck));
275 static int act8891_dcdc_enable(struct regulator_dev *dev)
277 struct act8891 *act8891 = rdev_get_drvdata(dev);
278 int buck = rdev_get_id(dev) -ACT8891_DCDC1 ;
280 return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, 0x80);
283 static int act8891_dcdc_disable(struct regulator_dev *dev)
285 struct act8891 *act8891 = rdev_get_drvdata(dev);
286 int buck = rdev_get_id(dev) -ACT8891_DCDC1 ;
288 return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, 0);
290 static int act8891_dcdc_get_voltage(struct regulator_dev *dev)
292 struct act8891 *act8891 = rdev_get_drvdata(dev);
293 int buck = rdev_get_id(dev) -ACT8891_DCDC1 ;
296 reg = act8891_reg_read(act8891,act8891_BUCK_SET_VOL_REG(buck));
297 reg &= BUCK_VOL_MASK;
298 val = 1000 * buck_voltage_map[reg];
301 static int act8891_dcdc_set_voltage(struct regulator_dev *dev,
302 int min_uV, int max_uV)
304 struct act8891 *act8891 = rdev_get_drvdata(dev);
305 int buck = rdev_get_id(dev) -ACT8891_DCDC1 ;
306 int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
307 const int *vol_map = buck_voltage_map;
311 if (min_vol < vol_map[VOL_MIN_IDX] ||
312 min_vol > vol_map[VOL_MAX_IDX])
315 for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX;
317 if (vol_map[val] >= min_vol)
320 if (vol_map[val] > max_vol)
322 ret = act8891_set_bits(act8891, act8891_BUCK_SET_VOL_REG(buck),
327 static int act8891_dcdc_get_mode(struct regulator_dev *dev, unsigned index)
329 struct act8891 *act8891 = rdev_get_drvdata(dev);
330 int buck = rdev_get_id(dev) -ACT8891_DCDC1 ;
333 val = act8891_reg_read(act8891, act8891_BUCK_CONTR_REG(buck));
336 return REGULATOR_MODE_STANDBY;
338 return REGULATOR_MODE_NORMAL;
341 static int act8891_dcdc_set_mode(struct regulator_dev *dev, unsigned int mode)
343 struct act8891 *act8891 = rdev_get_drvdata(dev);
344 int buck = rdev_get_id(dev) -ACT8891_DCDC1 ;
348 case REGULATOR_MODE_STANDBY:
349 return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, 0);
350 case REGULATOR_MODE_NORMAL:
351 return act8891_set_bits(act8891, act8891_BUCK_CONTR_REG(buck), mask, mask);
353 printk("error:pmu_act8891 only powersave and pwm mode\n");
359 static struct regulator_ops act8891_dcdc_ops = {
360 .set_voltage = act8891_dcdc_set_voltage,
361 .get_voltage = act8891_dcdc_get_voltage,
362 .list_voltage= act8891_dcdc_list_voltage,
363 .is_enabled = act8891_dcdc_is_enabled,
364 .enable = act8891_dcdc_enable,
365 .disable = act8891_dcdc_disable,
366 .get_mode = act8891_dcdc_get_mode,
367 .set_mode = act8891_dcdc_set_mode,
369 static struct regulator_desc regulators[] = {
373 .ops = &act8891_ldo_ops,
374 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
375 .type = REGULATOR_VOLTAGE,
376 .owner = THIS_MODULE,
381 .ops = &act8891_ldo_ops,
382 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
383 .type = REGULATOR_VOLTAGE,
384 .owner = THIS_MODULE,
389 .ops = &act8891_ldo_ops,
390 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
391 .type = REGULATOR_VOLTAGE,
392 .owner = THIS_MODULE,
397 .ops = &act8891_ldo_ops,
398 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
399 .type = REGULATOR_VOLTAGE,
400 .owner = THIS_MODULE,
406 .ops = &act8891_dcdc_ops,
407 .n_voltages = ARRAY_SIZE(buck_voltage_map),
408 .type = REGULATOR_VOLTAGE,
409 .owner = THIS_MODULE,
414 .ops = &act8891_dcdc_ops,
415 .n_voltages = ARRAY_SIZE(buck_voltage_map),
416 .type = REGULATOR_VOLTAGE,
417 .owner = THIS_MODULE,
422 .ops = &act8891_dcdc_ops,
423 .n_voltages = ARRAY_SIZE(buck_voltage_map),
424 .type = REGULATOR_VOLTAGE,
425 .owner = THIS_MODULE,
430 static int act8891_i2c_read(struct i2c_client *i2c, char reg, int count, u16 *dest)
433 struct i2c_adapter *adap;
434 struct i2c_msg msgs[2];
444 msgs[0].addr = i2c->addr;
446 msgs[0].flags = i2c->flags;
448 msgs[0].scl_rate = 200*1000;
451 msgs[1].addr = i2c->addr;
452 msgs[1].flags = i2c->flags | I2C_M_RD;
454 msgs[1].scl_rate = 200*1000;
455 ret = i2c_transfer(adap, msgs, 2);
457 DBG("***run in %s %d msgs[1].buf = %d\n",__FUNCTION__,__LINE__,*(msgs[1].buf));
462 static int act8891_i2c_write(struct i2c_client *i2c, char reg, int count, const u16 src)
466 struct i2c_adapter *adap;
479 msg.addr = i2c->addr;
480 msg.buf = &tx_buf[0];
482 msg.flags = i2c->flags;
483 msg.scl_rate = 200*1000;
485 ret = i2c_transfer(adap, &msg, 1);
489 static u8 act8891_reg_read(struct act8891 *act8891, u8 reg)
493 mutex_lock(&act8891->io_lock);
495 act8891_i2c_read(act8891->i2c, reg, 1, &val);
497 DBG("reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff);
499 mutex_unlock(&act8891->io_lock);
504 static int act8891_set_bits(struct act8891 *act8891, u8 reg, u16 mask, u16 val)
509 mutex_lock(&act8891->io_lock);
511 ret = act8891_i2c_read(act8891->i2c, reg, 1, &tmp);
512 tmp = (tmp & ~mask) | val;
514 ret = act8891_i2c_write(act8891->i2c, reg, 1, tmp);
515 DBG("reg write 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff);
517 mutex_unlock(&act8891->io_lock);
521 static int __devinit setup_regulators(struct act8891 *act8891, struct act8891_platform_data *pdata)
525 act8891->num_regulators = pdata->num_regulators;
526 act8891->rdev = kcalloc(pdata->num_regulators,
527 sizeof(struct regulator_dev *), GFP_KERNEL);
528 if (!act8891->rdev) {
531 /* Instantiate the regulators */
532 for (i = 0; i < pdata->num_regulators; i++) {
533 int id = pdata->regulators[i].id;
534 act8891->rdev[i] = regulator_register(®ulators[id],
535 act8891->dev, pdata->regulators[i].initdata, act8891);
537 if (IS_ERR(act8891->rdev[i])) {
538 err = PTR_ERR(act8891->rdev[i]);
539 dev_err(act8891->dev, "regulator init failed: %d\n",
548 regulator_unregister(act8891->rdev[i]);
549 kfree(act8891->rdev);
550 act8891->rdev = NULL;
554 static int __devinit act8891_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
556 struct act8891 *act8891;
557 struct act8891_platform_data *pdata = i2c->dev.platform_data;
559 act8891 = kzalloc(sizeof(struct act8891), GFP_KERNEL);
560 if (act8891 == NULL) {
565 act8891->dev = &i2c->dev;
566 i2c_set_clientdata(i2c, act8891);
567 mutex_init(&act8891->io_lock);
571 ret = setup_regulators(act8891, pdata);
575 dev_warn(act8891->dev, "No platform init data supplied\n");
577 pdata->set_init(act8891);
586 static int __devexit act8891_i2c_remove(struct i2c_client *i2c)
588 struct act8891 *act8891 = i2c_get_clientdata(i2c);
591 for (i = 0; i < act8891->num_regulators; i++)
592 if (act8891->rdev[i])
593 regulator_unregister(act8891->rdev[i]);
594 kfree(act8891->rdev);
595 i2c_set_clientdata(i2c, NULL);
601 static const struct i2c_device_id act8891_i2c_id[] = {
606 MODULE_DEVICE_TABLE(i2c, act8891_i2c_id);
608 static struct i2c_driver act8891_i2c_driver = {
611 .owner = THIS_MODULE,
613 .probe = act8891_i2c_probe,
614 .remove = __devexit_p(act8891_i2c_remove),
615 .id_table = act8891_i2c_id,
618 static int __init act8891_module_init(void)
621 ret = i2c_add_driver(&act8891_i2c_driver);
623 pr_err("Failed to register I2C driver: %d\n", ret);
626 module_init(act8891_module_init);
628 static void __exit act8891_module_exit(void)
630 i2c_del_driver(&act8891_i2c_driver);
632 module_exit(act8891_module_exit);
634 MODULE_LICENSE("GPL");
635 MODULE_AUTHOR("zhangqing <zhangqing@rock-chips.com>");
636 MODULE_DESCRIPTION("act8891 PMIC driver");