2 * Regulator driver for Active-semi act8846 PMIC chip for rk29xx
4 * Copyright (C) 2010, 2011 ROCKCHIP, Inc.
6 * Based on act8846.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.
14 #include <linux/bug.h>
15 #include <linux/err.h>
16 #include <linux/i2c.h>
17 #include <linux/kernel.h>
18 #include <linux/regulator/driver.h>
19 #include <linux/regulator/act8846.h>
20 #include <linux/delay.h>
21 #include <linux/slab.h>
22 #include <linux/mutex.h>
23 #include <linux/mfd/core.h>
24 #ifdef CONFIG_HAS_EARLYSUSPEND
25 #include <linux/earlysuspend.h>
27 #include <linux/interrupt.h>
28 #include <linux/module.h>
29 #include <linux/of_irq.h>
30 #include <linux/of_gpio.h>
32 #include <linux/of_device.h>
33 #include <linux/regulator/of_regulator.h>
34 #include <linux/regulator/driver.h>
35 #include <linux/regulator/machine.h>
36 #include <linux/regmap.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;
56 // struct early_suspend act8846_suspend;
59 int pmic_sleep_gpio; /* */
60 unsigned int dcdc_slp_voltage[3]; /* buckx_voltage in uV */
62 struct regmap *regmap;
65 struct act8846_regulator {
67 struct regulator_desc *desc;
68 struct regulator_dev *rdev;
72 struct act8846 *g_act8846;
74 static u8 act8846_reg_read(struct act8846 *act8846, u8 reg);
75 static int act8846_set_bits(struct act8846 *act8846, u8 reg, u16 mask, u16 val);
78 #define act8846_BUCK1_SET_VOL_BASE 0x10
79 #define act8846_BUCK2_SET_VOL_BASE 0x20
80 #define act8846_BUCK3_SET_VOL_BASE 0x30
81 #define act8846_BUCK4_SET_VOL_BASE 0x40
83 #define act8846_BUCK2_SLP_VOL_BASE 0x21
84 #define act8846_BUCK3_SLP_VOL_BASE 0x31
85 #define act8846_BUCK4_SLP_VOL_BASE 0x41
87 #define act8846_LDO1_SET_VOL_BASE 0x50
88 #define act8846_LDO2_SET_VOL_BASE 0x58
89 #define act8846_LDO3_SET_VOL_BASE 0x60
90 #define act8846_LDO4_SET_VOL_BASE 0x68
91 #define act8846_LDO5_SET_VOL_BASE 0x70
92 #define act8846_LDO6_SET_VOL_BASE 0x80
93 #define act8846_LDO7_SET_VOL_BASE 0x90
94 #define act8846_LDO8_SET_VOL_BASE 0xa0
95 //#define act8846_LDO9_SET_VOL_BASE 0xb1
97 #define act8846_BUCK1_CONTR_BASE 0x12
98 #define act8846_BUCK2_CONTR_BASE 0x22
99 #define act8846_BUCK3_CONTR_BASE 0x32
100 #define act8846_BUCK4_CONTR_BASE 0x42
102 #define act8846_LDO1_CONTR_BASE 0x51
103 #define act8846_LDO2_CONTR_BASE 0x59
104 #define act8846_LDO3_CONTR_BASE 0x61
105 #define act8846_LDO4_CONTR_BASE 0x69
106 #define act8846_LDO5_CONTR_BASE 0x71
107 #define act8846_LDO6_CONTR_BASE 0x81
108 #define act8846_LDO7_CONTR_BASE 0x91
109 #define act8846_LDO8_CONTR_BASE 0xa1
110 //#define act8846_LDO9_CONTR_BASE 0xb1
112 #define BUCK_VOL_MASK 0x3f
113 #define LDO_VOL_MASK 0x3f
115 #define VOL_MIN_IDX 0x00
116 #define VOL_MAX_IDX 0x3f
118 const static int buck_set_vol_base_addr[] = {
119 act8846_BUCK1_SET_VOL_BASE,
120 act8846_BUCK2_SET_VOL_BASE,
121 act8846_BUCK3_SET_VOL_BASE,
122 act8846_BUCK4_SET_VOL_BASE,
124 const static int buck_contr_base_addr[] = {
125 act8846_BUCK1_CONTR_BASE,
126 act8846_BUCK2_CONTR_BASE,
127 act8846_BUCK3_CONTR_BASE,
128 act8846_BUCK4_CONTR_BASE,
130 #define act8846_BUCK_SET_VOL_REG(x) (buck_set_vol_base_addr[x])
131 #define act8846_BUCK_CONTR_REG(x) (buck_contr_base_addr[x])
134 const static int ldo_set_vol_base_addr[] = {
135 act8846_LDO1_SET_VOL_BASE,
136 act8846_LDO2_SET_VOL_BASE,
137 act8846_LDO3_SET_VOL_BASE,
138 act8846_LDO4_SET_VOL_BASE,
139 act8846_LDO5_SET_VOL_BASE,
140 act8846_LDO6_SET_VOL_BASE,
141 act8846_LDO7_SET_VOL_BASE,
142 act8846_LDO8_SET_VOL_BASE,
143 // act8846_LDO9_SET_VOL_BASE,
145 const static int ldo_contr_base_addr[] = {
146 act8846_LDO1_CONTR_BASE,
147 act8846_LDO2_CONTR_BASE,
148 act8846_LDO3_CONTR_BASE,
149 act8846_LDO4_CONTR_BASE,
150 act8846_LDO5_CONTR_BASE,
151 act8846_LDO6_CONTR_BASE,
152 act8846_LDO7_CONTR_BASE,
153 act8846_LDO8_CONTR_BASE,
154 // act8846_LDO9_CONTR_BASE,
156 #define act8846_LDO_SET_VOL_REG(x) (ldo_set_vol_base_addr[x])
157 #define act8846_LDO_CONTR_REG(x) (ldo_contr_base_addr[x])
159 const static int buck_voltage_map[] = {
160 600, 625, 650, 675, 700, 725, 750, 775,
161 800, 825, 850, 875, 900, 925, 950, 975,
162 1000, 1025, 1050, 1075, 1100, 1125, 1150,
163 1175, 1200, 1250, 1300, 1350, 1400, 1450,
164 1500, 1550, 1600, 1650, 1700, 1750, 1800,
165 1850, 1900, 1950, 2000, 2050, 2100, 2150,
166 2200, 2250, 2300, 2350, 2400, 2500, 2600,
167 2700, 2800, 2900, 3000, 3100, 3200,
168 3300, 3400, 3500, 3600, 3700, 3800, 3900,
171 const static int ldo_voltage_map[] = {
172 600, 625, 650, 675, 700, 725, 750, 775,
173 800, 825, 850, 875, 900, 925, 950, 975,
174 1000, 1025, 1050, 1075, 1100, 1125, 1150,
175 1175, 1200, 1250, 1300, 1350, 1400, 1450,
176 1500, 1550, 1600, 1650, 1700, 1750, 1800,
177 1850, 1900, 1950, 2000, 2050, 2100, 2150,
178 2200, 2250, 2300, 2350, 2400, 2500, 2600,
179 2700, 2800, 2900, 3000, 3100, 3200,
180 3300, 3400, 3500, 3600, 3700, 3800, 3900,
183 static int act8846_ldo_list_voltage(struct regulator_dev *dev, unsigned index)
185 if (index >= ARRAY_SIZE(ldo_voltage_map))
187 return 1000 * ldo_voltage_map[index];
189 static int act8846_ldo_is_enabled(struct regulator_dev *dev)
191 struct act8846 *act8846 = rdev_get_drvdata(dev);
192 int ldo = rdev_get_id(dev) - ACT8846_LDO1;
195 val = act8846_reg_read(act8846, act8846_LDO_CONTR_REG(ldo));
204 static int act8846_ldo_enable(struct regulator_dev *dev)
206 struct act8846 *act8846 = rdev_get_drvdata(dev);
207 int ldo= rdev_get_id(dev) - ACT8846_LDO1;
210 return act8846_set_bits(act8846, act8846_LDO_CONTR_REG(ldo), mask, 0x80);
213 static int act8846_ldo_disable(struct regulator_dev *dev)
215 struct act8846 *act8846 = rdev_get_drvdata(dev);
216 int ldo= rdev_get_id(dev) - ACT8846_LDO1;
219 return act8846_set_bits(act8846, act8846_LDO_CONTR_REG(ldo), mask, 0);
222 static int act8846_ldo_get_voltage(struct regulator_dev *dev)
224 struct act8846 *act8846 = rdev_get_drvdata(dev);
225 int ldo= rdev_get_id(dev) - ACT8846_LDO1;
228 reg = act8846_reg_read(act8846,act8846_LDO_SET_VOL_REG(ldo));
230 val = 1000 * ldo_voltage_map[reg];
233 static int act8846_ldo_set_voltage(struct regulator_dev *dev,
234 int min_uV, int max_uV,unsigned *selector)
236 struct act8846 *act8846 = rdev_get_drvdata(dev);
237 int ldo= rdev_get_id(dev) - ACT8846_LDO1;
238 int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
239 const int *vol_map =ldo_voltage_map;
243 if (min_vol < vol_map[VOL_MIN_IDX] ||
244 min_vol > vol_map[VOL_MAX_IDX])
247 for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX; val++){
248 if (vol_map[val] >= min_vol)
252 if (vol_map[val] > max_vol)
255 ret = act8846_set_bits(act8846, act8846_LDO_SET_VOL_REG(ldo),
260 static unsigned int act8846_ldo_get_mode(struct regulator_dev *dev)
262 struct act8846 *act8846 = rdev_get_drvdata(dev);
263 int ldo = rdev_get_id(dev) - ACT8846_LDO1;
266 val = act8846_reg_read(act8846, act8846_LDO_CONTR_REG(ldo));
272 return REGULATOR_MODE_NORMAL;
274 return REGULATOR_MODE_STANDBY;
277 static int act8846_ldo_set_mode(struct regulator_dev *dev, unsigned int mode)
279 struct act8846 *act8846 = rdev_get_drvdata(dev);
280 int ldo = rdev_get_id(dev) - ACT8846_LDO1;
284 case REGULATOR_MODE_NORMAL:
285 return act8846_set_bits(act8846, act8846_LDO_CONTR_REG(ldo), mask, mask);
286 case REGULATOR_MODE_STANDBY:
287 return act8846_set_bits(act8846, act8846_LDO_CONTR_REG(ldo), mask, 0);
289 printk("error:pmu_act8846 only lowpower and nomal mode\n");
295 static struct regulator_ops act8846_ldo_ops = {
296 .set_voltage = act8846_ldo_set_voltage,
297 .get_voltage = act8846_ldo_get_voltage,
298 .list_voltage = act8846_ldo_list_voltage,
299 .is_enabled = act8846_ldo_is_enabled,
300 .enable = act8846_ldo_enable,
301 .disable = act8846_ldo_disable,
302 .get_mode = act8846_ldo_get_mode,
303 .set_mode = act8846_ldo_set_mode,
307 static int act8846_dcdc_list_voltage(struct regulator_dev *dev, unsigned index)
309 if (index >= ARRAY_SIZE(buck_voltage_map))
311 return 1000 * buck_voltage_map[index];
313 static int act8846_dcdc_is_enabled(struct regulator_dev *dev)
315 struct act8846 *act8846 = rdev_get_drvdata(dev);
316 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
319 val = act8846_reg_read(act8846, act8846_BUCK_CONTR_REG(buck));
328 static int act8846_dcdc_enable(struct regulator_dev *dev)
330 struct act8846 *act8846 = rdev_get_drvdata(dev);
331 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
334 return act8846_set_bits(act8846, act8846_BUCK_CONTR_REG(buck), mask, 0x80);
337 static int act8846_dcdc_disable(struct regulator_dev *dev)
339 struct act8846 *act8846 = rdev_get_drvdata(dev);
340 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
342 return act8846_set_bits(act8846, act8846_BUCK_CONTR_REG(buck), mask, 0);
344 static int act8846_dcdc_get_voltage(struct regulator_dev *dev)
346 struct act8846 *act8846 = rdev_get_drvdata(dev);
347 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
350 #ifdef CONFIG_ACT8846_SUPPORT_RESET
351 reg = act8846_reg_read(act8846,(act8846_BUCK_SET_VOL_REG(buck)+0x1));
353 reg = act8846_reg_read(act8846,act8846_BUCK_SET_VOL_REG(buck));
355 reg &= BUCK_VOL_MASK;
356 val = 1000 * buck_voltage_map[reg];
359 static int act8846_dcdc_set_voltage(struct regulator_dev *dev,
360 int min_uV, int max_uV,unsigned *selector)
362 struct act8846 *act8846 = rdev_get_drvdata(dev);
363 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
364 int min_vol = min_uV / 1000, max_vol = max_uV / 1000;
365 const int *vol_map = buck_voltage_map;
369 if (min_vol < vol_map[VOL_MIN_IDX] ||
370 min_vol > vol_map[VOL_MAX_IDX])
373 for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX; val++){
374 if (vol_map[val] >= min_vol)
378 if (vol_map[val] > max_vol)
379 printk("WARNING:this voltage is not support!voltage set is %d mv\n",vol_map[val]);
381 #ifdef CONFIG_ACT8846_SUPPORT_RESET
382 ret = act8846_set_bits(act8846, (act8846_BUCK_SET_VOL_REG(buck) +0x1),BUCK_VOL_MASK, val);
384 ret = act8846_set_bits(act8846, act8846_BUCK_SET_VOL_REG(buck) ,BUCK_VOL_MASK, val);
389 static int act8846_dcdc_set_sleep_voltage(struct regulator_dev *dev,
392 struct act8846 *act8846 = rdev_get_drvdata(dev);
393 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
394 int min_vol = uV / 1000,max_vol = uV / 1000;
395 const int *vol_map = buck_voltage_map;
399 if (min_vol < vol_map[VOL_MIN_IDX] ||
400 min_vol > vol_map[VOL_MAX_IDX])
403 for (val = VOL_MIN_IDX; val <= VOL_MAX_IDX; val++){
404 if (vol_map[val] >= min_vol)
408 if (vol_map[val] > max_vol)
409 printk("WARNING:this voltage is not support!voltage set is %d mv\n",vol_map[val]);
410 #ifdef CONFIG_ACT8846_SUPPORT_RESET
411 ret = act8846_set_bits(act8846, (act8846_BUCK_SET_VOL_REG(buck) ),BUCK_VOL_MASK, val);
413 ret = act8846_set_bits(act8846, (act8846_BUCK_SET_VOL_REG(buck) +0x01),BUCK_VOL_MASK, val);
418 static unsigned int act8846_dcdc_get_mode(struct regulator_dev *dev)
420 struct act8846 *act8846 = rdev_get_drvdata(dev);
421 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
424 val = act8846_reg_read(act8846, act8846_BUCK_CONTR_REG(buck));
430 return REGULATOR_MODE_NORMAL;
432 return REGULATOR_MODE_STANDBY;
435 static int act8846_dcdc_set_mode(struct regulator_dev *dev, unsigned int mode)
437 struct act8846 *act8846 = rdev_get_drvdata(dev);
438 int buck = rdev_get_id(dev) - ACT8846_DCDC1;
443 case REGULATOR_MODE_STANDBY:
444 return act8846_set_bits(act8846, act8846_BUCK_CONTR_REG(buck), mask, 0);
445 case REGULATOR_MODE_NORMAL:
446 return act8846_set_bits(act8846, act8846_BUCK_CONTR_REG(buck), mask, mask);
448 printk("error:pmu_act8846 only powersave and pwm mode\n");
454 static int act8846_dcdc_set_voltage_time_sel(struct regulator_dev *dev, unsigned int old_selector,
455 unsigned int new_selector)
457 struct act8846 *act8846 = rdev_get_drvdata(dev);
458 int ret =0,old_volt, new_volt;
460 old_volt = act8846_dcdc_list_voltage(dev, old_selector);
464 new_volt = act8846_dcdc_list_voltage(dev, new_selector);
468 return DIV_ROUND_UP(abs(old_volt - new_volt)*2, 25000);
471 static struct regulator_ops act8846_dcdc_ops = {
472 .set_voltage = act8846_dcdc_set_voltage,
473 .get_voltage = act8846_dcdc_get_voltage,
474 .list_voltage= act8846_dcdc_list_voltage,
475 .is_enabled = act8846_dcdc_is_enabled,
476 .enable = act8846_dcdc_enable,
477 .disable = act8846_dcdc_disable,
478 .get_mode = act8846_dcdc_get_mode,
479 .set_mode = act8846_dcdc_set_mode,
480 .set_suspend_voltage = act8846_dcdc_set_sleep_voltage,
481 .set_voltage_time_sel = act8846_dcdc_set_voltage_time_sel,
483 static struct regulator_desc regulators[] = {
488 .ops = &act8846_dcdc_ops,
489 .n_voltages = ARRAY_SIZE(buck_voltage_map),
490 .type = REGULATOR_VOLTAGE,
491 .owner = THIS_MODULE,
496 .ops = &act8846_dcdc_ops,
497 .n_voltages = ARRAY_SIZE(buck_voltage_map),
498 .type = REGULATOR_VOLTAGE,
499 .owner = THIS_MODULE,
504 .ops = &act8846_dcdc_ops,
505 .n_voltages = ARRAY_SIZE(buck_voltage_map),
506 .type = REGULATOR_VOLTAGE,
507 .owner = THIS_MODULE,
512 .ops = &act8846_dcdc_ops,
513 .n_voltages = ARRAY_SIZE(buck_voltage_map),
514 .type = REGULATOR_VOLTAGE,
515 .owner = THIS_MODULE,
521 .ops = &act8846_ldo_ops,
522 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
523 .type = REGULATOR_VOLTAGE,
524 .owner = THIS_MODULE,
529 .ops = &act8846_ldo_ops,
530 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
531 .type = REGULATOR_VOLTAGE,
532 .owner = THIS_MODULE,
537 .ops = &act8846_ldo_ops,
538 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
539 .type = REGULATOR_VOLTAGE,
540 .owner = THIS_MODULE,
545 .ops = &act8846_ldo_ops,
546 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
547 .type = REGULATOR_VOLTAGE,
548 .owner = THIS_MODULE,
554 .ops = &act8846_ldo_ops,
555 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
556 .type = REGULATOR_VOLTAGE,
557 .owner = THIS_MODULE,
562 .ops = &act8846_ldo_ops,
563 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
564 .type = REGULATOR_VOLTAGE,
565 .owner = THIS_MODULE,
570 .ops = &act8846_ldo_ops,
571 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
572 .type = REGULATOR_VOLTAGE,
573 .owner = THIS_MODULE,
578 .ops = &act8846_ldo_ops,
579 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
580 .type = REGULATOR_VOLTAGE,
581 .owner = THIS_MODULE,
586 .ops = &act8846_ldo_ops,
587 .n_voltages = ARRAY_SIZE(ldo_voltage_map),
588 .type = REGULATOR_VOLTAGE,
589 .owner = THIS_MODULE,
596 static int act8846_i2c_read(struct i2c_client *i2c, char reg, int count, u16 *dest)
599 struct i2c_adapter *adap;
600 struct i2c_msg msgs[2];
610 msgs[0].addr = i2c->addr;
612 msgs[0].flags = i2c->flags;
614 msgs[0].scl_rate = 200*1000;
616 msgs[1].buf = (u8 *)dest;
617 msgs[1].addr = i2c->addr;
618 msgs[1].flags = i2c->flags | I2C_M_RD;
620 msgs[1].scl_rate = 200*1000;
621 ret = i2c_transfer(adap, msgs, 2);
623 DBG("***run in %s %d msgs[1].buf = %d\n",__FUNCTION__,__LINE__,*(msgs[1].buf));
628 static int act8846_i2c_write(struct i2c_client *i2c, char reg, int count, const u16 src)
632 struct i2c_adapter *adap;
645 msg.addr = i2c->addr;
646 msg.buf = &tx_buf[0];
648 msg.flags = i2c->flags;
649 msg.scl_rate = 200*1000;
651 ret = i2c_transfer(adap, &msg, 1);
655 static u8 act8846_reg_read(struct act8846 *act8846, u8 reg)
659 mutex_lock(&act8846->io_lock);
661 act8846_i2c_read(act8846->i2c, reg, 1, &val);
663 DBG("reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff);
665 mutex_unlock(&act8846->io_lock);
670 static int act8846_set_bits(struct act8846 *act8846, u8 reg, u16 mask, u16 val)
675 mutex_lock(&act8846->io_lock);
677 ret = act8846_i2c_read(act8846->i2c, reg, 1, &tmp);
678 DBG("1 reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)tmp&0xff);
679 tmp = (tmp & ~mask) | val;
681 ret = act8846_i2c_write(act8846->i2c, reg, 1, tmp);
682 DBG("reg write 0x%02x -> 0x%02x\n", (int)reg, (unsigned)val&0xff);
684 act8846_i2c_read(act8846->i2c, reg, 1, &tmp);
685 DBG("2 reg read 0x%02x -> 0x%02x\n", (int)reg, (unsigned)tmp&0xff);
686 mutex_unlock(&act8846->io_lock);
692 static struct of_device_id act8846_of_match[] = {
693 { .compatible = "act,act8846"},
696 MODULE_DEVICE_TABLE(of, act8846_of_match);
699 static struct of_regulator_match act8846_reg_matches[] = {
700 { .name = "act_dcdc1" ,.driver_data = (void *)0},
701 { .name = "act_dcdc2" ,.driver_data = (void *)1},
702 { .name = "act_dcdc3", .driver_data = (void *)2 },
703 { .name = "act_dcdc4", .driver_data = (void *)3 },
704 { .name = "act_ldo1", .driver_data = (void *)4 },
705 { .name = "act_ldo2", .driver_data = (void *)5 },
706 { .name = "act_ldo3", .driver_data = (void *)6 },
707 { .name = "act_ldo4", .driver_data = (void *)7 },
708 { .name = "act_ldo5", .driver_data = (void *)8 },
709 { .name = "act_ldo6", .driver_data = (void *)9 },
710 { .name = "act_ldo7", .driver_data = (void *)10 },
711 { .name = "act_ldo8", .driver_data = (void *)11 },
714 static struct act8846_board *act8846_parse_dt(struct act8846 *act8846)
716 // struct act8846 *act8846 = i2c->dev.parent;
717 struct act8846_board *pdata;
718 struct device_node *regs;
719 struct device_node *act8846_pmic_np;
722 printk("%s,line=%d\n", __func__,__LINE__);
724 act8846_pmic_np = of_node_get(act8846->dev->of_node);
725 if (!act8846_pmic_np) {
726 printk("could not find pmic sub-node\n");
730 regs = of_find_node_by_name(act8846_pmic_np, "regulators");
734 count = of_regulator_match(act8846->dev, regs, act8846_reg_matches,act8846_NUM_REGULATORS);
737 if ((count < 0) || (count > act8846_NUM_REGULATORS))
740 pdata = devm_kzalloc(act8846->dev, sizeof(*pdata), GFP_KERNEL);
743 for (i = 0; i < count; i++) {
744 if (!act8846_reg_matches[i].init_data || !act8846_reg_matches[i].of_node)
746 pdata->act8846_init_data[i] = act8846_reg_matches[i].init_data;
747 pdata->of_node[i] = act8846_reg_matches[i].of_node;
749 pdata->irq = act8846->chip_irq;
750 pdata->irq_base = -1;
752 gpio = of_get_named_gpio(act8846_pmic_np,"gpios", 0);
753 if (!gpio_is_valid(gpio))
754 printk("invalid gpio: %d\n",gpio);
755 pdata->pmic_sleep_gpio = gpio;
756 pdata->pmic_sleep = true;
762 static struct act8846_board *act8846_parse_dt(struct i2c_client *i2c)
769 int act8846_device_shutdown(void)
773 struct act8846 *act8846 = g_act8846;
775 printk("%s\n",__func__);
777 ret = act8846_reg_read(act8846,0xc3);
778 ret = act8846_set_bits(act8846, 0xc3,(0x1<<3),(0x1<<3));
779 ret = act8846_set_bits(act8846, 0xc3,(0x1<<4),(0x1<<4));
781 printk("act8846 set 0xc3 error!\n");
786 EXPORT_SYMBOL_GPL(act8846_device_shutdown);
788 __weak void act8846_device_suspend(void) {}
789 __weak void act8846_device_resume(void) {}
791 static int act8846_suspend(struct i2c_client *i2c, pm_message_t mesg)
793 act8846_device_suspend();
797 static int act8846_resume(struct i2c_client *i2c)
799 act8846_device_resume();
803 static int act8846_suspend(struct i2c_client *i2c, pm_message_t mesg)
808 static int act8846_resume(struct i2c_client *i2c)
815 #ifdef CONFIG_HAS_EARLYSUSPEND
816 __weak void act8846_early_suspend(struct early_suspend *h) {}
817 __weak void act8846_late_resume(struct early_suspend *h) {}
820 static bool is_volatile_reg(struct device *dev, unsigned int reg)
823 if ((reg >= act8846_BUCK1_SET_VOL_BASE) && (reg <= act8846_LDO8_CONTR_BASE)) {
829 static const struct regmap_config act8846_regmap_config = {
832 .volatile_reg = is_volatile_reg,
833 .max_register = act8846_NUM_REGULATORS - 1,
834 .cache_type = REGCACHE_RBTREE,
836 static int act8846_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
838 struct act8846 *act8846;
839 struct act8846_board *pdev ;
840 const struct of_device_id *match;
841 struct regulator_config config = { };
842 struct regulator_dev *act_rdev;
843 struct regulator_init_data *reg_data;
844 const char *rail_name = NULL;
847 printk("%s,line=%d\n", __func__,__LINE__);
849 if (i2c->dev.of_node) {
850 match = of_match_device(act8846_of_match, &i2c->dev);
852 printk("Failed to find matching dt id\n");
857 act8846 = devm_kzalloc(&i2c->dev,sizeof(struct act8846), GFP_KERNEL);
858 if (act8846 == NULL) {
863 act8846->dev = &i2c->dev;
864 i2c_set_clientdata(i2c, act8846);
867 act8846->regmap = devm_regmap_init_i2c(i2c, &act8846_regmap_config);
868 if (IS_ERR(act8846->regmap)) {
869 ret = PTR_ERR(act8846->regmap);
870 printk("regmap initialization failed: %d\n", ret);
874 mutex_init(&act8846->io_lock);
876 ret = act8846_reg_read(act8846,0x22);
877 if ((ret < 0) || (ret == 0xff)){
878 printk("The device is not act8846 %x \n",ret);
882 ret = act8846_set_bits(act8846, 0xf4,(0x1<<7),(0x0<<7));
884 printk("act8846 set 0xf4 error!\n");
888 if (act8846->dev->of_node)
889 pdev = act8846_parse_dt(act8846);
891 /******************************set sleep vol & dcdc mode******************/
893 act8846->pmic_sleep_gpio = pdev->pmic_sleep_gpio;
894 if (act8846->pmic_sleep_gpio) {
895 ret = gpio_request(act8846->pmic_sleep_gpio, "act8846_pmic_sleep");
897 dev_err(act8846->dev,"Failed to request gpio %d with ret:""%d\n", act8846->pmic_sleep_gpio, ret);
900 gpio_direction_output(act8846->pmic_sleep_gpio,0);
901 ret = gpio_get_value(act8846->pmic_sleep_gpio);
902 gpio_free(act8846->pmic_sleep_gpio);
903 printk("%s: act8846_pmic_sleep=%x\n", __func__, ret);
908 act8846->num_regulators = act8846_NUM_REGULATORS;
909 act8846->rdev = kcalloc(act8846_NUM_REGULATORS,sizeof(struct regulator_dev *), GFP_KERNEL);
910 if (!act8846->rdev) {
913 /* Instantiate the regulators */
914 for (i = 0; i < act8846_NUM_REGULATORS; i++) {
915 reg_data = pdev->act8846_init_data[i];
918 config.dev = act8846->dev;
919 config.driver_data = act8846;
920 config.regmap = act8846->regmap;
921 if (act8846->dev->of_node)
922 config.of_node = pdev->of_node[i];
924 if (reg_data && reg_data->constraints.name)
925 rail_name = reg_data->constraints.name;
927 rail_name = regulators[i].name;
928 reg_data->supply_regulator = rail_name;
930 config.init_data =reg_data;
932 act_rdev = regulator_register(®ulators[i],&config);
933 if (IS_ERR(act_rdev)) {
934 printk("failed to register %d regulator\n",i);
937 act8846->rdev[i] = act_rdev;
941 #ifdef CONFIG_HAS_EARLYSUSPEND
942 act8846->act8846_suspend.suspend = act8846_early_suspend,
943 act8846->act8846_suspend.resume = act8846_late_resume,
944 act8846->act8846_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1,
945 register_early_suspend(&act8846->act8846_suspend);
955 static int act8846_i2c_remove(struct i2c_client *i2c)
957 struct act8846 *act8846 = i2c_get_clientdata(i2c);
960 for (i = 0; i < act8846->num_regulators; i++)
961 if (act8846->rdev[i])
962 regulator_unregister(act8846->rdev[i]);
963 kfree(act8846->rdev);
964 i2c_set_clientdata(i2c, NULL);
970 static const struct i2c_device_id act8846_i2c_id[] = {
975 MODULE_DEVICE_TABLE(i2c, act8846_i2c_id);
977 static struct i2c_driver act8846_i2c_driver = {
980 .owner = THIS_MODULE,
981 .of_match_table =of_match_ptr(act8846_of_match),
983 .probe = act8846_i2c_probe,
984 .remove = act8846_i2c_remove,
985 .id_table = act8846_i2c_id,
987 .suspend = act8846_suspend,
988 .resume = act8846_resume,
992 static int __init act8846_module_init(void)
995 ret = i2c_add_driver(&act8846_i2c_driver);
997 pr_err("Failed to register I2C driver: %d\n", ret);
1000 //module_init(act8846_module_init);
1001 //subsys_initcall(act8846_module_init);
1002 //rootfs_initcall(act8846_module_init);
1003 subsys_initcall_sync(act8846_module_init);
1005 static void __exit act8846_module_exit(void)
1007 i2c_del_driver(&act8846_i2c_driver);
1009 module_exit(act8846_module_exit);
1011 MODULE_LICENSE("GPL");
1012 MODULE_AUTHOR("zhangqing <zhangqing@rock-chips.com>");
1013 MODULE_DESCRIPTION("act8846 PMIC driver");