diff options
author | Tom Cherry <tcherry@nvidia.com> | 2012-05-23 12:06:13 -0700 |
---|---|---|
committer | Tom Cherry <tcherry@nvidia.com> | 2012-05-23 12:06:13 -0700 |
commit | a168c03bd97fd9761218779623db0cec09fa8f4a (patch) | |
tree | 521d2b51904da963d771c24fd9b142cc416f8259 /drivers/power | |
parent | 11fb7d0e35d56230919eb91bee1aa138a10b8416 (diff) | |
parent | c7e3189c1802c2a6552eec960f521a1891529892 (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.c | 6 | ||||
-rw-r--r-- | drivers/power/max17048_battery.c | 31 | ||||
-rw-r--r-- | drivers/power/smb349-charger.c | 42 |
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; |