summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorTom Cherry <tcherry@nvidia.com>2012-05-23 12:06:13 -0700
committerTom Cherry <tcherry@nvidia.com>2012-05-23 12:06:13 -0700
commita168c03bd97fd9761218779623db0cec09fa8f4a (patch)
tree521d2b51904da963d771c24fd9b142cc416f8259 /drivers/power
parent11fb7d0e35d56230919eb91bee1aa138a10b8416 (diff)
parentc7e3189c1802c2a6552eec960f521a1891529892 (diff)
Merge commit 'main-ics-2012.05.22-B3' into HEAD
Conflicts: arch/arm/mach-tegra/pm.c drivers/media/video/tegra/nvavp/nvavp_dev.c drivers/power/smb349-charger.c include/linux/smb349-charger.h include/trace/events/power.h Change-Id: Ia8c82e2acfe3463ae6778bdd03aac8da104f7ad3
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/bq27x00_battery.c6
-rw-r--r--drivers/power/max17048_battery.c31
-rw-r--r--drivers/power/smb349-charger.c42
3 files changed, 63 insertions, 16 deletions
diff --git a/drivers/power/bq27x00_battery.c b/drivers/power/bq27x00_battery.c
index e392f4dc77de..857deb8faa0a 100644
--- a/drivers/power/bq27x00_battery.c
+++ b/drivers/power/bq27x00_battery.c
@@ -885,6 +885,9 @@ static int bq27x00_battery_suspend(struct device *dev)
struct platform_device *pdev = to_platform_device(dev);
struct bq27x00_device_info *di = platform_get_drvdata(pdev);
+ cancel_delayed_work_sync(&di->work);
+ cancel_delayed_work_sync(&di->external_power_changed_work);
+
if (di->chip == BQ27510) {
ret = bq27x00_write(di, BQ27510_CNTL,
BQ27510_CNTL_SET_SLEEP, false);
@@ -920,6 +923,9 @@ static int bq27x00_battery_resume(struct device *dev)
return ret;
}
}
+
+ schedule_delayed_work(&di->work, HZ);
+
return 0;
}
diff --git a/drivers/power/max17048_battery.c b/drivers/power/max17048_battery.c
index e43390984522..c65855f72dba 100644
--- a/drivers/power/max17048_battery.c
+++ b/drivers/power/max17048_battery.c
@@ -177,7 +177,7 @@ static void max17048_get_vcell(struct i2c_client *client)
if (vcell < 0)
dev_err(&client->dev, "%s: err %d\n", __func__, vcell);
else
- chip->vcell = (uint16_t)vcell;
+ chip->vcell = (uint16_t)(((vcell >> 4) * 125) / 100);
}
static void max17048_get_soc(struct i2c_client *client)
@@ -276,13 +276,18 @@ static int max17048_write_rcomp_seg(struct i2c_client *client,
{
uint8_t rs1, rs2;
int ret;
+ uint8_t rcomp_seg_table[16];
rs2 = rcomp_seg | 0x00FF;
rs1 = rcomp_seg >> 8;
- uint8_t rcomp_seg_table[16] = { rs1, rs2, rs1, rs2,
- rs1, rs2, rs1, rs2,
- rs1, rs2, rs1, rs2,
- rs1, rs2, rs1, rs2};
+
+ rcomp_seg_table[0] = rcomp_seg_table[2] = rcomp_seg_table[4] =
+ rcomp_seg_table[6] = rcomp_seg_table[8] = rcomp_seg_table[10] =
+ rcomp_seg_table[12] = rcomp_seg_table[14] = rs1;
+
+ rcomp_seg_table[1] = rcomp_seg_table[3] = rcomp_seg_table[5] =
+ rcomp_seg_table[7] = rcomp_seg_table[9] = rcomp_seg_table[11] =
+ rcomp_seg_table[13] = rcomp_seg_table[15] = rs2;
ret = i2c_smbus_write_i2c_block_data(client, MAX17048_RCOMPSEG1,
16, (uint8_t *)rcomp_seg_table);
@@ -562,14 +567,30 @@ static int max17048_suspend(struct i2c_client *client,
pm_message_t state)
{
struct max17048_chip *chip = i2c_get_clientdata(client);
+ int ret;
cancel_delayed_work(&chip->work);
+
+ ret = max17048_write_word(client, MAX17048_HIBRT, 0xffff);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed in entering hibernate mode\n");
+ return ret;
+ }
+
return 0;
}
static int max17048_resume(struct i2c_client *client)
{
struct max17048_chip *chip = i2c_get_clientdata(client);
+ int ret;
+ struct max17048_battery_model *mdata = chip->model_data;
+
+ ret = max17048_write_word(client, MAX17048_HIBRT, mdata->hibernate);
+ if (ret < 0) {
+ dev_err(&client->dev, "failed in exiting hibernate mode\n");
+ return ret;
+ }
schedule_delayed_work(&chip->work, MAX17048_DELAY);
return 0;
diff --git a/drivers/power/smb349-charger.c b/drivers/power/smb349-charger.c
index 9ee8b288d225..58778409b6ba 100644
--- a/drivers/power/smb349-charger.c
+++ b/drivers/power/smb349-charger.c
@@ -170,17 +170,28 @@ static int smb349_configure_otg(struct i2c_client *client, int enable)
}
if (enable) {
- /* Configure PGOOD to be active low */
- ret = smb349_read(client, SMB349_SYSOK_USB3);
+ /* Configure PGOOD to be active low if no 5V on VBUS */
+ ret = smb349_read(client, SMB349_STS_REG_C);
if (ret < 0) {
dev_err(&client->dev, "%s: err %d\n", __func__, ret);
goto error;
}
- ret = smb349_write(client, SMB349_SYSOK_USB3, (ret & (~(1))));
- if (ret < 0) {
- dev_err(&client->dev, "%s: err %d\n", __func__, ret);
- goto error;
+ if (!(ret & 0x01)) {
+ ret = smb349_read(client, SMB349_SYSOK_USB3);
+ if (ret < 0) {
+ dev_err(&client->dev, "%s: err %d\n",
+ __func__, ret);
+ goto error;
+ }
+
+ ret = smb349_write(client, SMB349_SYSOK_USB3,
+ (ret & (~(1))));
+ if (ret < 0) {
+ dev_err(&client->dev, "%s: err %d\n",
+ __func__, ret);
+ goto error;
+ }
}
/* Enable OTG */
@@ -274,9 +285,14 @@ error:
int update_charger_status(void)
{
- struct i2c_client *client = charger->client;
+ struct i2c_client *client;
int ret, val;
+ if (!charger)
+ return -ENODEV;
+ else
+ client = charger->client;
+
val = smb349_read(client, SMB349_STS_REG_D);
if (val < 0) {
dev_err(&client->dev, "%s(): Failed in reading register"
@@ -383,6 +399,7 @@ static int smb349_enable_charging(struct regulator_dev *rdev,
"charger..\n", __func__);
return ret;
}
+ charger->chrg_type = NONE;
} else {
ret = smb349_read(client, SMB349_STS_REG_D);
if (ret < 0) {
@@ -420,7 +437,7 @@ static int __devinit smb349_probe(struct i2c_client *client,
{
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
struct smb349_charger_platform_data *pdata;
- int ret, irq_num;
+ int ret;
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
return -EIO;
@@ -444,7 +461,7 @@ static int __devinit smb349_probe(struct i2c_client *client,
dev_err(&client->dev, "%s() No Battery present, exiting..\n",
__func__);
ret = -ENODEV;
- goto error;
+ goto regulator_error;
}
charger->reg_desc.name = "vbus_charger";
@@ -480,7 +497,7 @@ static int __devinit smb349_probe(struct i2c_client *client,
dev_err(&client->dev, "failed to register %s\n",
charger->reg_desc.name);
ret = PTR_ERR(charger->rdev);
- goto error;
+ goto regulator_error;
}
/* disable OTG */
@@ -520,7 +537,10 @@ static int __devinit smb349_probe(struct i2c_client *client,
return 0;
error:
+ regulator_unregister(charger->rdev);
+regulator_error:
kfree(charger);
+ charger = NULL;
return ret;
}
@@ -528,7 +548,7 @@ static int __devexit smb349_remove(struct i2c_client *client)
{
struct smb349_charger *charger = i2c_get_clientdata(client);
- free_irq(gpio_to_irq(client->irq), charger);
+ regulator_unregister(charger->rdev);
kfree(charger);
return 0;