--- ds2760_battery.c.old 2007-04-13 18:18:11.000000000 +0200 +++ ds2760_battery.c 2007-04-18 18:13:25.000000000 +0200 @@ -125,6 +125,10 @@ (unsigned int)di->w1_dev); return 1; } + + if ((di->raw[DS2760_VOLTAGE_MSB] == 0xff && di->raw[DS2760_VOLTAGE_LSB] == 0xff) || + (di->raw[DS2760_VOLTAGE_MSB] == 0x00 && di->raw[DS2760_VOLTAGE_LSB] == 0x00)) + return 1; di->update_time = jiffies; @@ -140,7 +144,7 @@ di->current_raw = (((signed char)di->raw[DS2760_CURRENT_MSB]) << 5) | (di->raw[DS2760_CURRENT_LSB] >> 3); - di->current_mA = (di->current_raw / 2) + (di->current_raw / 8); + di->current_mA = - (di->current_raw / 2) + (di->current_raw / 8); /* DS2760 reports accumulated current in signed units of 0.25mAh. */ di->accum_current_raw = @@ -192,7 +196,7 @@ di->rem_capacity = 100; if (di->current_mA) - di->life_min = -((di->accum_current_mAh - di->empty_mAh) * + di->life_min = ((di->accum_current_mAh - di->empty_mAh) * 60) / di->current_mA; else di->life_min = 0; @@ -210,18 +214,18 @@ di->full_counter = 0; if (battery_is_external_power_supplied(&di->batt_cdev)) { - if (di->current_mA > 10) { + if (di->current_mA < -10) { di->charge_status = BATTERY_STATUS_CHARGING; di->full_counter = 0; } - else if (di->current_mA < -5) { + else if (di->current_mA > 5) { if (di->charge_status != BATTERY_STATUS_DISCHARGING) printk(KERN_WARNING "%s: not enough power to " "charge\n", di->bi->name); di->charge_status = BATTERY_STATUS_DISCHARGING; di->full_counter = 0; } - else if (di->current_mA < 10 && + else if (di->current_mA > -10 && di->charge_status != BATTERY_STATUS_FULL) { /* Don't consider the battery to be full unless