--- t/linux-2.6.9-rc3/drivers/macintosh/apm_emu.c 2004-09-30 05:05:41.000000000 +0200 +++ linux-2.6.9-rc3-sonne/drivers/macintosh/apm_emu.c 2004-10-10 08:46:33.000000000 +0200 @@ -440,6 +440,7 @@ char * p = buf; char charging = 0; long charge = -1; + long max_charge = -1; long amperage = 0; unsigned long btype = 0; @@ -450,9 +451,12 @@ percentage = 0; if (charge < 0) charge = 0; + if (max_charge < 0) + max_charge = 0; percentage += (pmu_batteries[i].charge * 100) / pmu_batteries[i].max_charge; charge += pmu_batteries[i].charge; + max_charge += pmu_batteries[i].max_charge; amperage += pmu_batteries[i].amperage; if (btype == 0) btype = (pmu_batteries[i].flags & PMU_BATT_TYPE_MASK); @@ -461,13 +465,27 @@ charging++; } } + if (real_count) { if (amperage < 0) { + /* when less than 100mA are used the machine must be on AC and as it is + not charging the battery is only slightly self decharging and thus full be definition */ + if (amperage < -100) { + if (btype == PMU_BATT_TYPE_SMART) + time_units = (charge * 59) / (amperage * -1); + else + time_units = (charge * 16440) / (amperage * -60); + } + else + time_units = 0; + } + else if (amperage > 0 && max_charge >= charge) { if (btype == PMU_BATT_TYPE_SMART) - time_units = (charge * 59) / (amperage * -1); + time_units = ( (max_charge - charge) * 59) / amperage; else - time_units = (charge * 16440) / (amperage * -60); + time_units = ( (max_charge - charge) * 16440) / amperage; } + percentage /= real_count; if (charging > 0) { battery_status = 0x03; @@ -483,6 +501,7 @@ battery_flag = 0x01; } } + p += sprintf(p, "%s %d.%d 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n", driver_version, (FAKE_APM_BIOS_VERSION >> 8) & 0xff,