aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power
diff options
context:
space:
mode:
authorGraeme Gregory <gg@slimlogic.co.uk>2011-12-07 11:00:05 +0200
committerDan Murphy <dmurphy@ti.com>2012-02-01 08:51:05 -0600
commit386612bab47785bec041e98ccbd04308e9d0ab01 (patch)
tree843790af8887e392159e42ff02749c649cf2f723 /drivers/power
parent9e2a190b3da0964496783f78bbcb4881ee18d61b (diff)
downloadkernel_samsung_espresso10-386612bab47785bec041e98ccbd04308e9d0ab01.zip
kernel_samsung_espresso10-386612bab47785bec041e98ccbd04308e9d0ab01.tar.gz
kernel_samsung_espresso10-386612bab47785bec041e98ccbd04308e9d0ab01.tar.bz2
POWER: TWL6030_BCI: Initialize parameters by EEPROM values
This patch allow to initialize charger parameters from values stored in TWL EEPROM. Change-Id: Iaa1fd4337d7df4922983c38838248e6f15e9c5a8 Signed-off-by: Volodymyr Riazantsev <v.riazantsev@ti.com>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/twl6030_bci_battery.c95
1 files changed, 93 insertions, 2 deletions
diff --git a/drivers/power/twl6030_bci_battery.c b/drivers/power/twl6030_bci_battery.c
index 821facdf..c65a227 100644
--- a/drivers/power/twl6030_bci_battery.c
+++ b/drivers/power/twl6030_bci_battery.c
@@ -352,6 +352,22 @@ static void twl6030_config_iterm_reg(struct twl6030_bci_device_info *di,
pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
}
+static unsigned int twl6030_get_iterm_reg(struct twl6030_bci_device_info *di)
+{
+ int ret;
+ unsigned int currentmA;
+ u8 val = 0;
+
+ ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &val, CHARGERUSB_CTRL2);
+ if (ret) {
+ pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
+ currentmA = 0;
+ } else
+ currentmA = 50 + (val >> 5) * 50;
+
+ return currentmA;
+}
+
static void twl6030_config_voreg_reg(struct twl6030_bci_device_info *di,
unsigned int voltagemV)
{
@@ -369,6 +385,22 @@ static void twl6030_config_voreg_reg(struct twl6030_bci_device_info *di,
pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
}
+static unsigned int twl6030_get_voreg_reg(struct twl6030_bci_device_info *di)
+{
+ int ret;
+ unsigned int voltagemV;
+ u8 val = 0;
+
+ ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &val, CHARGERUSB_VOREG);
+ if (ret) {
+ pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
+ voltagemV = 0;
+ } else
+ voltagemV = 3500 + (val * 20);
+
+ return voltagemV;
+}
+
static void twl6030_config_vichrg_reg(struct twl6030_bci_device_info *di,
unsigned int currentmA)
{
@@ -431,6 +463,23 @@ static void twl6030_config_limit1_reg(struct twl6030_bci_device_info *di,
pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
}
+static unsigned int twl6030_get_limit1_reg(struct twl6030_bci_device_info *di)
+{
+ int ret;
+ unsigned int voltagemV;
+ u8 val = 0;
+
+ ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &val,
+ CHARGERUSB_CTRLLIMIT1);
+ if (ret) {
+ pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
+ voltagemV = 0;
+ } else
+ voltagemV = 3500 + (val * 20);
+
+ return voltagemV;
+}
+
static void twl6030_config_limit2_reg(struct twl6030_bci_device_info *di,
unsigned int currentmA)
{
@@ -452,6 +501,28 @@ static void twl6030_config_limit2_reg(struct twl6030_bci_device_info *di,
pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
}
+static const int vichrg[] = {
+ 300, 350, 400, 450, 500, 600, 700, 800,
+ 900, 1000, 1100, 1200, 1300, 1400, 1500, 300
+};
+
+static unsigned int twl6030_get_limit2_reg(struct twl6030_bci_device_info *di)
+{
+ int ret;
+ unsigned int currentmA;
+ u8 val = 0;
+
+ ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &val,
+ CHARGERUSB_CTRLLIMIT2);
+ if (ret) {
+ pr_err("%s: Error access to TWL6030 (%d)\n", __func__, ret);
+ currentmA = 0;
+ } else
+ currentmA = vichrg[val & 0xF];
+
+ return currentmA;
+}
+
/*
* Return channel value
* Or < 0 on failure.
@@ -532,6 +603,10 @@ static void twl6030_start_usb_charger(struct twl6030_bci_device_info *di)
if (di->charger_source == POWER_SUPPLY_TYPE_MAINS)
return;
+ if ((di->features & TWL6032_SUBCLASS) &&
+ di->platform_data->use_eeprom_config)
+ goto enable;
+
dev_dbg(di->dev, "USB input current limit %dmA\n",
di->charger_incurrentmA);
if (di->charger_incurrentmA < 50) {
@@ -548,6 +623,7 @@ static void twl6030_start_usb_charger(struct twl6030_bci_device_info *di)
twl6030_config_voreg_reg(di, di->platform_data->max_bat_voltagemV);
twl6030_config_iterm_reg(di, di->platform_data->termination_currentmA);
+enable:
if (di->charger_incurrentmA >= 50) {
ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER,
CONTROLLER_CTRL1_EN_CHARGER |
@@ -2101,6 +2177,18 @@ static int __devinit twl6030_bci_battery_probe(struct platform_device *pdev)
di->platform_data = pdata;
di->features = pdata->features;
+ if (pdata->use_eeprom_config &&
+ di->features & TWL6032_SUBCLASS) {
+ di->platform_data->max_charger_currentmA =
+ twl6030_get_limit2_reg(di);
+ di->platform_data->max_charger_voltagemV =
+ twl6030_get_limit1_reg(di);
+ di->platform_data->termination_currentmA =
+ twl6030_get_iterm_reg(di);
+ di->platform_data->max_bat_voltagemV =
+ twl6030_get_voreg_reg(di);
+ }
+
di->dev = &pdev->dev;
di->bat.name = "twl6030_battery";
di->bat.supplied_to = twl6030_bci_supplied_to;
@@ -2209,8 +2297,11 @@ static int __devinit twl6030_bci_battery_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "current measurement setup failed\n");
/* initialize for USB charging */
- twl6030_config_limit1_reg(di, pdata->max_charger_voltagemV);
- twl6030_config_limit2_reg(di, di->platform_data->max_charger_currentmA);
+ if (!pdata->use_eeprom_config) {
+ twl6030_config_limit1_reg(di, pdata->max_charger_voltagemV);
+ twl6030_config_limit2_reg(di,
+ di->platform_data->max_charger_currentmA);
+ }
ret = twl_i2c_write_u8(TWL6030_MODULE_CHARGER, MBAT_TEMP,
CONTROLLER_INT_MASK);
if (ret)