diff options
Diffstat (limited to 'drivers/power/ds2760_battery.c')
| -rw-r--r-- | drivers/power/ds2760_battery.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/drivers/power/ds2760_battery.c b/drivers/power/ds2760_battery.c index a52d4a11652d..520b5c49ff30 100644 --- a/drivers/power/ds2760_battery.c +++ b/drivers/power/ds2760_battery.c | |||
| @@ -62,6 +62,10 @@ static unsigned int cache_time = 1000; | |||
| 62 | module_param(cache_time, uint, 0644); | 62 | module_param(cache_time, uint, 0644); |
| 63 | MODULE_PARM_DESC(cache_time, "cache time in milliseconds"); | 63 | MODULE_PARM_DESC(cache_time, "cache time in milliseconds"); |
| 64 | 64 | ||
| 65 | static unsigned int pmod_enabled; | ||
| 66 | module_param(pmod_enabled, bool, 0644); | ||
| 67 | MODULE_PARM_DESC(pmod_enabled, "PMOD enable bit"); | ||
| 68 | |||
| 65 | /* Some batteries have their rated capacity stored a N * 10 mAh, while | 69 | /* Some batteries have their rated capacity stored a N * 10 mAh, while |
| 66 | * others use an index into this table. */ | 70 | * others use an index into this table. */ |
| 67 | static int rated_capacities[] = { | 71 | static int rated_capacities[] = { |
| @@ -259,6 +263,17 @@ static void ds2760_battery_update_status(struct ds2760_device_info *di) | |||
| 259 | power_supply_changed(&di->bat); | 263 | power_supply_changed(&di->bat); |
| 260 | } | 264 | } |
| 261 | 265 | ||
| 266 | static void ds2760_battery_write_status(struct ds2760_device_info *di, | ||
| 267 | char status) | ||
| 268 | { | ||
| 269 | if (status == di->raw[DS2760_STATUS_REG]) | ||
| 270 | return; | ||
| 271 | |||
| 272 | w1_ds2760_write(di->w1_dev, &status, DS2760_STATUS_WRITE_REG, 1); | ||
| 273 | w1_ds2760_store_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); | ||
| 274 | w1_ds2760_recall_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); | ||
| 275 | } | ||
| 276 | |||
| 262 | static void ds2760_battery_work(struct work_struct *work) | 277 | static void ds2760_battery_work(struct work_struct *work) |
| 263 | { | 278 | { |
| 264 | struct ds2760_device_info *di = container_of(work, | 279 | struct ds2760_device_info *di = container_of(work, |
| @@ -342,9 +357,9 @@ static enum power_supply_property ds2760_battery_props[] = { | |||
| 342 | 357 | ||
| 343 | static int ds2760_battery_probe(struct platform_device *pdev) | 358 | static int ds2760_battery_probe(struct platform_device *pdev) |
| 344 | { | 359 | { |
| 360 | char status; | ||
| 345 | int retval = 0; | 361 | int retval = 0; |
| 346 | struct ds2760_device_info *di; | 362 | struct ds2760_device_info *di; |
| 347 | struct ds2760_platform_data *pdata; | ||
| 348 | 363 | ||
| 349 | di = kzalloc(sizeof(*di), GFP_KERNEL); | 364 | di = kzalloc(sizeof(*di), GFP_KERNEL); |
| 350 | if (!di) { | 365 | if (!di) { |
| @@ -354,14 +369,13 @@ static int ds2760_battery_probe(struct platform_device *pdev) | |||
| 354 | 369 | ||
| 355 | platform_set_drvdata(pdev, di); | 370 | platform_set_drvdata(pdev, di); |
| 356 | 371 | ||
| 357 | pdata = pdev->dev.platform_data; | 372 | di->dev = &pdev->dev; |
| 358 | di->dev = &pdev->dev; | 373 | di->w1_dev = pdev->dev.parent; |
| 359 | di->w1_dev = pdev->dev.parent; | 374 | di->bat.name = dev_name(&pdev->dev); |
| 360 | di->bat.name = dev_name(&pdev->dev); | 375 | di->bat.type = POWER_SUPPLY_TYPE_BATTERY; |
| 361 | di->bat.type = POWER_SUPPLY_TYPE_BATTERY; | 376 | di->bat.properties = ds2760_battery_props; |
| 362 | di->bat.properties = ds2760_battery_props; | 377 | di->bat.num_properties = ARRAY_SIZE(ds2760_battery_props); |
| 363 | di->bat.num_properties = ARRAY_SIZE(ds2760_battery_props); | 378 | di->bat.get_property = ds2760_battery_get_property; |
| 364 | di->bat.get_property = ds2760_battery_get_property; | ||
| 365 | di->bat.external_power_changed = | 379 | di->bat.external_power_changed = |
| 366 | ds2760_battery_external_power_changed; | 380 | ds2760_battery_external_power_changed; |
| 367 | 381 | ||
| @@ -373,6 +387,16 @@ static int ds2760_battery_probe(struct platform_device *pdev) | |||
| 373 | goto batt_failed; | 387 | goto batt_failed; |
| 374 | } | 388 | } |
| 375 | 389 | ||
| 390 | /* enable sleep mode feature */ | ||
| 391 | ds2760_battery_read_status(di); | ||
| 392 | status = di->raw[DS2760_STATUS_REG]; | ||
| 393 | if (pmod_enabled) | ||
| 394 | status |= DS2760_STATUS_PMOD; | ||
| 395 | else | ||
| 396 | status &= ~DS2760_STATUS_PMOD; | ||
| 397 | |||
| 398 | ds2760_battery_write_status(di, status); | ||
| 399 | |||
| 376 | INIT_DELAYED_WORK(&di->monitor_work, ds2760_battery_work); | 400 | INIT_DELAYED_WORK(&di->monitor_work, ds2760_battery_work); |
| 377 | di->monitor_wqueue = create_singlethread_workqueue(dev_name(&pdev->dev)); | 401 | di->monitor_wqueue = create_singlethread_workqueue(dev_name(&pdev->dev)); |
| 378 | if (!di->monitor_wqueue) { | 402 | if (!di->monitor_wqueue) { |
