aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorJett.Zhou <jtzhou@marvell.com>2012-07-27 04:27:16 -0400
committerAnton Vorontsov <anton.vorontsov@linaro.org>2012-09-20 18:32:55 -0400
commita830d28b48bf92944e57058e87d17cee5a7cd2a1 (patch)
tree304249dfc3d1100114a88e3c01509158a52eb86e /drivers/mfd
parent98a2766493589c18c327ae3dad5243b53fcb5f70 (diff)
power_supply: Enable battery-charger for 88pm860x
There are charger and battery measurement feature for 88pm860x PMIC. For charger, it can support pre-charge with small current when battery is nearly exausted and then changed into fast-charge with CC&CV mode. For battery monitor, it can support battery measurement such as vbat,vsys,vchg and ibat etc,it can aslo accumulating the Coulomb value charged or discharged from battery based on Conlomb Counter, we use it to estimate battery capacity. Signed-off-by: Jett.Zhou <jtzhou@marvell.com> Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/88pm860x-core.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c
index d09918cf1b15..229cb2920089 100644
--- a/drivers/mfd/88pm860x-core.c
+++ b/drivers/mfd/88pm860x-core.c
@@ -18,6 +18,7 @@
18#include <linux/mfd/core.h> 18#include <linux/mfd/core.h>
19#include <linux/mfd/88pm860x.h> 19#include <linux/mfd/88pm860x.h>
20#include <linux/regulator/machine.h> 20#include <linux/regulator/machine.h>
21#include <linux/power/charger-manager.h>
21 22
22#define INT_STATUS_NUM 3 23#define INT_STATUS_NUM 3
23 24
@@ -84,7 +85,8 @@ static struct resource battery_resources[] __devinitdata = {
84static struct resource charger_resources[] __devinitdata = { 85static struct resource charger_resources[] __devinitdata = {
85 {PM8607_IRQ_CHG, PM8607_IRQ_CHG, "charger detect", IORESOURCE_IRQ,}, 86 {PM8607_IRQ_CHG, PM8607_IRQ_CHG, "charger detect", IORESOURCE_IRQ,},
86 {PM8607_IRQ_CHG_DONE, PM8607_IRQ_CHG_DONE, "charging done", IORESOURCE_IRQ,}, 87 {PM8607_IRQ_CHG_DONE, PM8607_IRQ_CHG_DONE, "charging done", IORESOURCE_IRQ,},
87 {PM8607_IRQ_CHG_FAULT, PM8607_IRQ_CHG_FAULT, "charging timeout", IORESOURCE_IRQ,}, 88 {PM8607_IRQ_CHG_FAIL, PM8607_IRQ_CHG_FAIL, "charging timeout", IORESOURCE_IRQ,},
89 {PM8607_IRQ_CHG_FAULT, PM8607_IRQ_CHG_FAULT, "charging fault", IORESOURCE_IRQ,},
88 {PM8607_IRQ_GPADC1, PM8607_IRQ_GPADC1, "battery temperature", IORESOURCE_IRQ,}, 90 {PM8607_IRQ_GPADC1, PM8607_IRQ_GPADC1, "battery temperature", IORESOURCE_IRQ,},
89 {PM8607_IRQ_VBAT, PM8607_IRQ_VBAT, "battery voltage", IORESOURCE_IRQ,}, 91 {PM8607_IRQ_VBAT, PM8607_IRQ_VBAT, "battery voltage", IORESOURCE_IRQ,},
90 {PM8607_IRQ_VCHG, PM8607_IRQ_VCHG, "vchg voltage", IORESOURCE_IRQ,}, 92 {PM8607_IRQ_VCHG, PM8607_IRQ_VCHG, "vchg voltage", IORESOURCE_IRQ,},
@@ -155,10 +157,15 @@ static struct regulator_init_data preg_init_data = {
155 .consumer_supplies = &preg_supply[0], 157 .consumer_supplies = &preg_supply[0],
156}; 158};
157 159
160static struct regulator_bulk_data chg_desc_regulator_data[] = {
161 { .supply = "preg", },
162};
163
158static struct mfd_cell power_devs[] = { 164static struct mfd_cell power_devs[] = {
159 {"88pm860x-battery", -1,}, 165 {"88pm860x-battery", -1,},
160 {"88pm860x-charger", -1,}, 166 {"88pm860x-charger", -1,},
161 {"88pm860x-preg", -1,}, 167 {"88pm860x-preg", -1,},
168 {"charger-manager", -1,},
162}; 169};
163 170
164static struct mfd_cell rtc_devs[] = { 171static struct mfd_cell rtc_devs[] = {
@@ -791,6 +798,19 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
791 &preg_resources[0], chip->irq_base); 798 &preg_resources[0], chip->irq_base);
792 if (ret < 0) 799 if (ret < 0)
793 dev_err(chip->dev, "Failed to add preg subdev\n"); 800 dev_err(chip->dev, "Failed to add preg subdev\n");
801
802 if (pdata->chg_desc) {
803 pdata->chg_desc->charger_regulators =
804 &chg_desc_regulator_data[0];
805 pdata->chg_desc->num_charger_regulators =
806 ARRAY_SIZE(chg_desc_regulator_data),
807 power_devs[3].platform_data = pdata->chg_desc;
808 power_devs[3].pdata_size = sizeof(*pdata->chg_desc);
809 ret = mfd_add_devices(chip->dev, 0, &power_devs[3], 1,
810 NULL, chip->irq_base);
811 if (ret < 0)
812 dev_err(chip->dev, "Failed to add chg-manager subdev\n");
813 }
794} 814}
795 815
796static void __devinit device_onkey_init(struct pm860x_chip *chip, 816static void __devinit device_onkey_init(struct pm860x_chip *chip,