2 * Regulator driver for Active-semi act8931 PMIC chip for rk29xx
4 * Copyright (C) 2010, 2011 ROCKCHIP, Inc.
6 * Based on act8891.c that is work by zhangqing<zhangqing@rock-chips.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/bug.h>
14 #include <linux/err.h>
15 #include <linux/i2c.h>
16 #include <linux/kernel.h>
17 #include <linux/regulator/driver.h>
18 #include <linux/regulator/act8931.h>
19 #include <mach/gpio.h>
20 #include <linux/delay.h>
21 #include <mach/iomux.h>
22 #include <linux/slab.h>
25 #define DBG(x...) printk(KERN_INFO x)
30 #define DBG_INFO(x...) printk(KERN_INFO x)
32 #define DBG_INFO(x...)
39 struct i2c_client *i2c;
41 struct regulator_dev **rdev;
44 static u8 act8931_reg_read(struct act8931 *act8931, u8 reg);
45 static int act8931_set_bits(struct act8931 *act8931, u8 reg, u16 mask, u16 val);
48 #define act8931_BUCK1_SET_VOL_BASE 0x20
49 #define act8931_BUCK2_SET_VOL_BASE 0x30
50 #define act8931_BUCK3_SET_VOL_BASE 0x40
51 #define act8931_LDO1_SET_VOL_BASE 0x50
52 #define act8931_LDO2_SET_VOL_BASE 0x54
53 #define act8931_LDO3_SET_VOL_BASE 0x60
54 #define act8931_LDO4_SET_VOL_BASE 0x64
56 #define act8931_BUCK1_CONTR_BASE 0x22
57 #define act8931_BUCK2_CONTR_BASE 0x32
58 #define act8931_BUCK3_CONTR_BASE 0x42
59 #define act8931_LDO1_CONTR_BASE 0x51
60 #define act8931_LDO2_CONTR_BASE 0x55
61 #define act8931_LDO3_CONTR_BASE 0x61
62 #define act8931_LDO4_CONTR_BASE 0x65
64 #define BUCK_VOL_MASK 0x3f
65 #define LDO_VOL_MASK 0x3f
67 #define VOL_MIN_IDX 0x00
68 #define VOL_MAX_IDX 0x3f
70 const static int buck_set_vol_base_addr[] = {
71 act8931_BUCK1_SET_VOL_BASE,
72 act8931_BUCK2_SET_VOL_BASE,
73 act8931_BUCK3_SET_VOL_BASE,
75 const static int buck_contr_base_addr[] = {
76 act8931_BUCK1_CONTR_BASE,
77 act8931_BUCK2_CONTR_BASE,
78 act8931_BUCK3_CONTR_BASE,
80 #define act8931_BUCK_SET_VOL_REG(x) (buck_set_vol_base_addr[x])
81 #define act8931_BUCK_CONTR_REG(x) (buck_contr_base_addr[x])
84 const static int ldo_set_vol_base_addr[] = {
85 act8931_LDO1_SET_VOL_BASE,
86 act8931_LDO2_SET_VOL_BASE,
87 act8931_LDO3_SET_VOL_BASE,
88 act8931_LDO4_SET_VOL_BASE,
90 const static int ldo_contr_base_addr[] = {
91 act8931_LDO1_CONTR_BASE,
92 act8931_LDO2_CONTR_BASE,
93 act8931_LDO3_CONTR_BASE,
94 act8931_LDO4_CONTR_BASE,
96 #define act8931_LDO_SET_VOL_REG(x) (ldo_set_vol_base_addr[x])
97 #define act8931_LDO_CONTR_REG(x) (ldo_contr_base_addr[x])
99 const static int buck_voltage_map[] = {
100 600, 625, 650, 675, 700, 725, 750, 775,
101 800, 825, 850, 875, 900, 925, 950, 975,
102 1000, 1025, 1050, 1075, 1100, 1125, 1150,
103 1175, 1200, 1250, 1300, 1350, 1400, 1450,
104 1500, 1550, 1600, 1650, 1700, 1750, 1800,
105 1850, 1900, 1950, 2000, 2050, 2100, 2150,
106 2200, 2250, 2300, 2350, 2400, 2500, 2600,
107 2700, 2800, 2850, 2900, 3000, 3100, 3200,
108 3300, 3400, 3500, 3600, 3700, 3800, 3900,
111 const static int ldo_voltage_map[] = {
112 600, 625, 650, 675, 700, 725, 750, 775,
113 800, 825, 850, 875, 900, 925, 950, 975,
114 1000, 1025, 1050, 1075, 1100, 1125, 1150,
115 1175, 1200, 1250, 1300, 1350, 1400, 1450,
116 1500, 1550, 1600, 1650, 1700, 1750, 1800,
117 1850, 1900, 1950, 2000, 2050, 2100, 2150,
118 2200, 2250, 2300, 2350, 2400, 2500, 2600,
119 2700, 2800, 2850, 2900, 3000, 3100, 3200,
120 3300, 3400, 3500, 3600, 3700, 3800, 3900,
123 static int act8931_ldo_list_voltage(struct regulator_dev *dev, unsigned index)
125 return 1000 * ldo_voltage_map[index];
127 static int act8931_ldo_is_enabled(struct regulator_dev *dev)
129 struct act8931 *act8931 = rdev_get_drvdata(dev);
130 int ldo = rdev_get_id(dev) -ACT8931_LDO1;
133 val = act8931_reg_read(act8931, act8931_LDO_CONTR_REG(ldo));
142 static int act8931_ldo_enable(struct regulator_dev *dev)
144 struct act8931 *act8931 = rdev_get_drvdata(dev);
145 int ldo= rdev_get_id(dev) -ACT8931_LDO1;
148 return act8931_set_bits(act8931, act8931_LDO_CONTR_REG(ldo), mask, 0x80);
151 static int act8931_ldo_disable(struct regulator_dev *dev)
153 struct act8931 *act8931 = rdev_get_drvdata(dev);
154 int ldo= rdev_get_id(dev) -ACT8931_LDO1;
157 return act8931_set_bits(act8931, act8931_LDO_CONTR_REG(ldo), mask, 0);
160 static int act8931_ldo_get_voltage(struct regulator_dev *dev)
162 struct act8931 *act8931 = rdev_get_drvdata(dev);
163 int ldo= rdev_get_id(dev) -ACT8931_LDO1;
166 reg = act8931_reg_read(act8931,act8931_LDO_SET_VOL_REG(ldo));
168 val = 1000 * ldo_voltage_map[reg];
171 static int act8931_ldo_set_voltage(struct regulator_dev *dev,
172 int min_uV, int max_uV)
174 struct act8931 *act8931 = rdev_get_drvdata(dev);
175 int ldo= rdev_get_id(dev) -ACT8931_LDO1;
176 int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
177 const int *vol_map =ldo_voltage_map;
180 if (min_vol < vol_map[VOL_MIN_IDX] ||
181 min_vol > vol_map[VOL_MAX_IDX])
184 for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX;
186 if (vol_map[val] >= min_vol)
189 if (vol_map[val] > max_vol)
192 ret = act8931_set_bits(act8931, act8931_LDO_SET_VOL_REG(ldo),
198 static int act8931_ldo_get_mode(struct regulator_dev *dev, unsigned index)
200 struct act8931 *act8931 = rdev_get_drvdata(dev);
201 int ldo = rdev_get_id(dev) -ACT8931_LDO1 ;
204 val = act8931_reg_read(act8931, act8931_LDO_CONTR_REG(ldo));
207 return REGULATOR_MODE_NORMAL;
209 return REGULATOR_MODE_STANDBY;
212 static int act8931_ldo_set_mode(struct regulator_dev *dev, unsigned int mode)
214 struct act8931 *act8931 = rdev_get_drvdata(dev);
215 int ldo = rdev_get_id(dev) -ACT8931_LDO1 ;
219 case REGULATOR_MODE_NORMAL:
220 return act8931_set_bits(act8931, act8931_LDO_CONTR_REG(ldo), mask, 0);
221 case REGULATOR_MODE_STANDBY:
222 return act8931_set_bits(act8931, act8931_LDO_CONTR_REG(ldo), mask, mask);
224 printk("error:pmu_act8931 only lowpower and nomal mode\n");
230 static struct regulator_ops act8931_ldo_ops = {
231 .set_voltage = act8931_ldo_set_voltage,
232 .get_voltage = act8931_ldo_get_voltage,
233 .list_voltage = act8931_ldo_list_voltage,
234 .is_enabled = act8931_ldo_is_enabled,
235 .enable = act8931_ldo_enable,
236 .disable = act8931_ldo_disable,
237 .get_mode = act8931_ldo_get_mode,
238 .set_mode = act8931_ldo_set_mode,
242 static int act8931_dcdc_list_voltage(struct regulator_dev *dev, unsigned index)
244 return 1000 * buck_voltage_map[index];
246 static int act8931_dcdc_is_enabled(struct regulator_dev *dev)
248 struct act8931 *act8931 = rdev_get_drvdata(dev);
249 int buck = rdev_get_id(dev) -ACT8931_DCDC1;
252 val = act8931_reg_read(act8931, act8931_BUCK_CONTR_REG(buck));
261 static int act8931_dcdc_enable(struct regulator_dev *dev)
263 struct act8931 *act8931 = rdev_get_drvdata(dev);
264 int buck = rdev_get_id(dev) -ACT8931_DCDC1 ;
266 return act8931_set_bits(act8931, act8931_BUCK_CONTR_REG(buck), mask, 0x80);
269 static int act8931_dcdc_disable(struct regulator_dev *dev)
271 struct act8931 *act8931 = rdev_get_drvdata(dev);
272 int buck = rdev_get_id(dev) -ACT8931_DCDC1 ;
274 return act8931_set_bits(act8931, act8931_BUCK_CONTR_REG(buck), mask, 0);
276 static int act8931_dcdc_get_voltage(struct regulator_dev *dev)
278 struct act8931 *act8931 = rdev_get_drvdata(dev);
279 int buck = rdev_get_id(dev) -ACT8931_DCDC1 ;
282 reg = act8931_reg_read(act8931,act8931_BUCK_SET_VOL_REG(buck));
283 reg &= BUCK_VOL_MASK;
285 val = 1000 * buck_voltage_map[reg];
289 static int act8931_dcdc_set_voltage(struct regulator_dev *dev,
290 int min_uV, int max_uV)
292 struct act8931 *act8931 = rdev_get_drvdata(dev);
293 int buck = rdev_get_id(dev) -ACT8931_DCDC1 ;
294 int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
295 const int *vol_map = buck_voltage_map;
299 DBG("%s, min_uV = %d, max_uV = %d!\n", __func__, min_uV, max_uV);
300 if (min_vol < vol_map[VOL_MIN_IDX] ||
301 min_vol > vol_map[VOL_MAX_IDX])
304 for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX;
306 if (vol_map[val] >= min_vol)
309 if (vol_map[val] > max_vol)
311 ret = act8931_set_bits(act8931, act8931_BUCK_SET_VOL_REG(buck),
313 ret = act8931_set_bits(act8931, act8931_BUCK_SET_VOL_REG(buck) + 0x01,
318 static int act8931_dcdc_get_mode(struct regulator_dev *dev, unsigned index)
320 struct act8931 *act8931 = rdev_get_drvdata(dev);
321 int buck = rdev_get_id(dev) -ACT8931_DCDC1 ;
324 val = act8931_reg_read(act8931, act8931_BUCK_CONTR_REG(buck));
327 return REGULATOR_MODE_STANDBY;
329 return REGULATOR_MODE_NORMAL;
332 static int act8931_dcdc_set_mode(struct regulator_dev *dev, unsigned int mode)
334 struct act8931 *act8931 = rdev_get_drvdata(dev);
335 int buck = rdev_get_id(dev) -ACT8931_DCDC1 ;
339 case REGULATOR_MODE_STANDBY:
340 return act8931_set_bits(act8931, act8931_BUCK_CONTR_REG(buck), mask, 0);
341 case REGULATOR_MODE_NORMAL:
342 return act8931_set_bits(act8931, act8931_BUCK_CONTR_REG(buck), mask, mask);
344 printk("error:pmu_act8931 only powersave and pwm mode\n");
350 static struct regulator_ops act8931_dcdc_ops = {
351 .set_voltage = act8931_dcdc_set_voltage,
352 .get_voltage = act8931_dcdc_get_voltage,
353 .list_voltage= act8931_dcdc_list_voltage,
354 .is_enabled = act8931_dcdc_is_enabled,
355 .enable = act8931_dcdc_enable,
356 .disable = act8931_dcdc_disable,
357 .get_mode = act8931_dcdc_get_mode,
358 .set_mode = act8931_dcdc_set_mode,
360 static struct regulator_desc regulators[] = {
364 .ops = &act8931_ldo_ops,
365 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
366 .type = REGULATOR_VOLTAGE,
367 .owner = THIS_MODULE,
372 .ops = &act8931_ldo_ops,
373 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
374 .type = REGULATOR_VOLTAGE,
375 .owner = THIS_MODULE,
380 .ops = &act8931_ldo_ops,
381 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
382 .type = REGULATOR_VOLTAGE,
383 .owner = THIS_MODULE,
388 .ops = &act8931_ldo_ops,
389 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
390 .type = REGULATOR_VOLTAGE,
391 .owner = THIS_MODULE,
397 .ops = &act8931_dcdc_ops,
398 .n_voltages = ARRAY_SIZE(buck_voltage_map),
399 .type = REGULATOR_VOLTAGE,
400 .owner = THIS_MODULE,
405 .ops = &act8931_dcdc_ops,
406 .n_voltages = ARRAY_SIZE(buck_voltage_map),
407 .type = REGULATOR_VOLTAGE,
408 .owner = THIS_MODULE,
413 .ops = &act8931_dcdc_ops,
414 .n_voltages = ARRAY_SIZE(buck_voltage_map),
415 .type = REGULATOR_VOLTAGE,
416 .owner = THIS_MODULE,
424 static int act8931_i2c_read(struct i2c_client *i2c, char reg, int count, u16 *dest)
427 struct i2c_adapter *adap;
428 struct i2c_msg msgs[2];
438 msgs[0].addr = i2c->addr;
440 msgs[0].flags = i2c->flags;
442 msgs[0].scl_rate = 200*1000;
445 msgs[1].addr = i2c->addr;
446 msgs[1].flags = i2c->flags | I2C_M_RD;
448 msgs[1].scl_rate = 200*1000;
449 ret = i2c_transfer(adap, msgs, 2);
451 DBG("***run in %s %d msgs[1].buf = %d\n",__FUNCTION__,__LINE__,*(msgs[1].buf));
456 static int act8931_i2c_write(struct i2c_client *i2c, char reg, int count, const u16 src)
460 struct i2c_adapter *adap;
473 msg.addr = i2c->addr;
474 msg.buf = &tx_buf[0];
476 msg.flags = i2c->flags;
477 msg.scl_rate = 200*1000;
479 ret = i2c_transfer(adap, &msg, 1);
483 static u8 act8931_reg_read(struct act8931 *act8931, u8 reg)
487 mutex_lock(&act8931->io_lock);
489 act8931_i2c_read(act8931->i2c, reg, 1, &val);
491 DBG("reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff);
493 mutex_unlock(&act8931->io_lock);
498 static int act8931_set_bits(struct act8931 *act8931, u8 reg, u16 mask, u16 val)
503 mutex_lock(&act8931->io_lock);
505 ret = act8931_i2c_read(act8931->i2c, reg, 1, &tmp);
506 DBG("1 reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)tmp&0xff);
507 tmp = (tmp & ~mask) | val;
509 ret = act8931_i2c_write(act8931->i2c, reg, 1, tmp);
510 DBG("reg write 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff);
512 act8931_i2c_read(act8931->i2c, reg, 1, &tmp);
513 DBG("2 reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)tmp&0xff);
514 mutex_unlock(&act8931->io_lock);
518 static int __devinit setup_regulators(struct act8931 *act8931, struct act8931_platform_data *pdata)
522 act8931->num_regulators = pdata->num_regulators;
523 act8931->rdev = kcalloc(pdata->num_regulators,
524 sizeof(struct regulator_dev *), GFP_KERNEL);
525 if (!act8931->rdev) {
528 /* Instantiate the regulators */
529 for (i = 0; i < pdata->num_regulators; i++) {
530 int id = pdata->regulators[i].id;
531 act8931->rdev[i] = regulator_register(®ulators[id],
532 act8931->dev, pdata->regulators[i].initdata, act8931);
534 if (IS_ERR(act8931->rdev[i])) {
535 err = PTR_ERR(act8931->rdev[i]);
536 dev_err(act8931->dev, "regulator init failed: %d\n",
545 regulator_unregister(act8931->rdev[i]);
546 kfree(act8931->rdev);
547 act8931->rdev = NULL;
551 static int __devinit act8931_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
553 struct act8931 *act8931;
554 struct act8931_platform_data *pdata = i2c->dev.platform_data;
556 act8931 = kzalloc(sizeof(struct act8931), GFP_KERNEL);
557 if (act8931 == NULL) {
562 act8931->dev = &i2c->dev;
563 i2c_set_clientdata(i2c, act8931);
564 mutex_init(&act8931->io_lock);
566 ret = act8931_reg_read(act8931,0x22);
567 if ((ret < 0) || (ret == 0xff)){
568 printk("The device is not act8931 \n");
573 ret = setup_regulators(act8931, pdata);
577 dev_warn(act8931->dev, "No platform init data supplied\n");
579 pdata->set_init(act8931);
588 static int __devexit act8931_i2c_remove(struct i2c_client *i2c)
590 struct act8931 *act8931 = i2c_get_clientdata(i2c);
593 for (i = 0; i < act8931->num_regulators; i++)
594 if (act8931->rdev[i])
595 regulator_unregister(act8931->rdev[i]);
596 kfree(act8931->rdev);
597 i2c_set_clientdata(i2c, NULL);
603 static const struct i2c_device_id act8931_i2c_id[] = {
608 MODULE_DEVICE_TABLE(i2c, act8931_i2c_id);
610 static struct i2c_driver act8931_i2c_driver = {
613 .owner = THIS_MODULE,
615 .probe = act8931_i2c_probe,
616 .remove = __devexit_p(act8931_i2c_remove),
617 .id_table = act8931_i2c_id,
620 static int __init act8931_module_init(void)
623 ret = i2c_add_driver(&act8931_i2c_driver);
625 pr_err("Failed to register I2C driver: %d\n", ret);
628 //module_init(act8931_module_init);
629 //subsys_initcall(act8931_module_init);
630 //rootfs_initcall(act8931_module_init);
631 subsys_initcall_sync(act8931_module_init);
633 static void __exit act8931_module_exit(void)
635 i2c_del_driver(&act8931_i2c_driver);
637 module_exit(act8931_module_exit);
639 MODULE_LICENSE("GPL");
640 MODULE_AUTHOR("xhc <xhc@rock-chips.com>");
641 MODULE_DESCRIPTION("act8931 PMIC driver");