diff options
author | Graeme Gregory <gg@slimlogic.co.uk> | 2011-12-07 11:00:05 +0200 |
---|---|---|
committer | Dan Murphy <dmurphy@ti.com> | 2012-02-01 08:51:05 -0600 |
commit | 386612bab47785bec041e98ccbd04308e9d0ab01 (patch) | |
tree | 843790af8887e392159e42ff02749c649cf2f723 /drivers/power | |
parent | 9e2a190b3da0964496783f78bbcb4881ee18d61b (diff) | |
download | kernel_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.c | 95 |
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) |