Lines Matching +full:signed +full:- +full:by

5  *	       2004-2007 Matt Reimer
90 1800, /* HP iPAQ hx4700 3.7V 1800mAh (359113-001) */
101 3600, /* HP iPAQ hx4700 3.7V 3600mAh (359114-001) */
119 return array[index] + (((array[index + 1] - array[index]) * dt) / 10); in battery_interpolate()
126 if (di->update_time && time_before(jiffies, di->update_time + in ds2760_battery_read_status()
132 if (di->update_time == 0) { in ds2760_battery_read_status()
137 count = DS2760_TEMP_LSB - start + 1; in ds2760_battery_read_status()
140 ret = w1_ds2760_read(di->w1_dev, di->raw + start, start, count); in ds2760_battery_read_status()
142 dev_warn(di->dev, "call to w1_ds2760_read failed (0x%p)\n", in ds2760_battery_read_status()
143 di->w1_dev); in ds2760_battery_read_status()
147 di->update_time = jiffies; in ds2760_battery_read_status()
150 * reports in units of uV, so convert by multiplying by 4880. */ in ds2760_battery_read_status()
151 di->voltage_raw = (di->raw[DS2760_VOLTAGE_MSB] << 3) | in ds2760_battery_read_status()
152 (di->raw[DS2760_VOLTAGE_LSB] >> 5); in ds2760_battery_read_status()
153 di->voltage_uV = di->voltage_raw * 4880; in ds2760_battery_read_status()
155 /* DS2760 reports current in signed units of 0.625mA, but the battery in ds2760_battery_read_status()
156 * class reports in units of µA, so convert by multiplying by 625. */ in ds2760_battery_read_status()
157 di->current_raw = in ds2760_battery_read_status()
158 (((signed char)di->raw[DS2760_CURRENT_MSB]) << 5) | in ds2760_battery_read_status()
159 (di->raw[DS2760_CURRENT_LSB] >> 3); in ds2760_battery_read_status()
160 di->current_uA = di->current_raw * 625; in ds2760_battery_read_status()
162 /* DS2760 reports accumulated current in signed units of 0.25mAh. */ in ds2760_battery_read_status()
163 di->accum_current_raw = in ds2760_battery_read_status()
164 (((signed char)di->raw[DS2760_CURRENT_ACCUM_MSB]) << 8) | in ds2760_battery_read_status()
165 di->raw[DS2760_CURRENT_ACCUM_LSB]; in ds2760_battery_read_status()
166 di->accum_current_uAh = di->accum_current_raw * 250; in ds2760_battery_read_status()
168 /* DS2760 reports temperature in signed units of 0.125°C, but the in ds2760_battery_read_status()
169 * battery class reports in units of 1/10 °C, so we convert by in ds2760_battery_read_status()
170 * multiplying by .125 * 10 = 1.25. */ in ds2760_battery_read_status()
171 di->temp_raw = (((signed char)di->raw[DS2760_TEMP_MSB]) << 3) | in ds2760_battery_read_status()
172 (di->raw[DS2760_TEMP_LSB] >> 5); in ds2760_battery_read_status()
173 di->temp_C = di->temp_raw + (di->temp_raw / 4); in ds2760_battery_read_status()
177 if (di->raw[DS2760_RATED_CAPACITY] < ARRAY_SIZE(rated_capacities)) in ds2760_battery_read_status()
178 di->rated_capacity = rated_capacities[ in ds2760_battery_read_status()
179 (unsigned int)di->raw[DS2760_RATED_CAPACITY]]; in ds2760_battery_read_status()
181 di->rated_capacity = di->raw[DS2760_RATED_CAPACITY] * 10; in ds2760_battery_read_status()
183 di->rated_capacity *= 1000; /* convert to µAh */ in ds2760_battery_read_status()
186 di->full_active_uAh = di->raw[DS2760_ACTIVE_FULL] << 8 | in ds2760_battery_read_status()
187 di->raw[DS2760_ACTIVE_FULL + 1]; in ds2760_battery_read_status()
192 if (di->full_active_uAh == 0) in ds2760_battery_read_status()
193 di->full_active_uAh = di->rated_capacity / 1000L; in ds2760_battery_read_status()
195 scale[0] = di->full_active_uAh; in ds2760_battery_read_status()
197 scale[i] = scale[i - 1] + di->raw[DS2760_ACTIVE_FULL + 1 + i]; in ds2760_battery_read_status()
199 di->full_active_uAh = battery_interpolate(scale, di->temp_C / 10); in ds2760_battery_read_status()
200 di->full_active_uAh *= 1000; /* convert to µAh */ in ds2760_battery_read_status()
203 scale[4] = di->raw[DS2760_ACTIVE_EMPTY + 4]; in ds2760_battery_read_status()
204 for (i = 3; i >= 0; i--) in ds2760_battery_read_status()
205 scale[i] = scale[i + 1] + di->raw[DS2760_ACTIVE_EMPTY + i]; in ds2760_battery_read_status()
207 di->empty_uAh = battery_interpolate(scale, di->temp_C / 10); in ds2760_battery_read_status()
208 di->empty_uAh *= 1000; /* convert to µAh */ in ds2760_battery_read_status()
210 if (di->full_active_uAh == di->empty_uAh) in ds2760_battery_read_status()
211 di->rem_capacity = 0; in ds2760_battery_read_status()
214 * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */ in ds2760_battery_read_status()
215 di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) / in ds2760_battery_read_status()
216 (di->full_active_uAh - di->empty_uAh); in ds2760_battery_read_status()
218 if (di->rem_capacity < 0) in ds2760_battery_read_status()
219 di->rem_capacity = 0; in ds2760_battery_read_status()
220 if (di->rem_capacity > 100) in ds2760_battery_read_status()
221 di->rem_capacity = 100; in ds2760_battery_read_status()
223 if (di->current_uA < -100L) in ds2760_battery_read_status()
224 di->life_sec = -((di->accum_current_uAh - di->empty_uAh) * 36L) in ds2760_battery_read_status()
225 / (di->current_uA / 100L); in ds2760_battery_read_status()
227 di->life_sec = 0; in ds2760_battery_read_status()
244 if (w1_ds2760_write(di->w1_dev, acr, DS2760_CURRENT_ACCUM_MSB, 2) < 2) in ds2760_battery_set_current_accum()
245 dev_warn(di->dev, "ACR write failed\n"); in ds2760_battery_set_current_accum()
250 int old_charge_status = di->charge_status; in ds2760_battery_update_status()
254 if (di->charge_status == POWER_SUPPLY_STATUS_UNKNOWN) in ds2760_battery_update_status()
255 di->full_counter = 0; in ds2760_battery_update_status()
257 if (power_supply_am_i_supplied(&di->bat)) { in ds2760_battery_update_status()
258 if (di->current_uA > 10000) { in ds2760_battery_update_status()
259 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; in ds2760_battery_update_status()
260 di->full_counter = 0; in ds2760_battery_update_status()
261 } else if (di->current_uA < -5000) { in ds2760_battery_update_status()
262 if (di->charge_status != POWER_SUPPLY_STATUS_NOT_CHARGING) in ds2760_battery_update_status()
263 dev_notice(di->dev, "not enough power to " in ds2760_battery_update_status()
265 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING; in ds2760_battery_update_status()
266 di->full_counter = 0; in ds2760_battery_update_status()
267 } else if (di->current_uA < 10000 && in ds2760_battery_update_status()
268 di->charge_status != POWER_SUPPLY_STATUS_FULL) { in ds2760_battery_update_status()
274 di->full_counter++; in ds2760_battery_update_status()
276 if (di->full_counter < 2) { in ds2760_battery_update_status()
277 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; in ds2760_battery_update_status()
279 di->charge_status = POWER_SUPPLY_STATUS_FULL; in ds2760_battery_update_status()
281 di->full_active_uAh); in ds2760_battery_update_status()
285 di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING; in ds2760_battery_update_status()
286 di->full_counter = 0; in ds2760_battery_update_status()
289 if (di->charge_status != old_charge_status) in ds2760_battery_update_status()
290 power_supply_changed(&di->bat); in ds2760_battery_update_status()
296 if (status == di->raw[DS2760_STATUS_REG]) in ds2760_battery_write_status()
299 w1_ds2760_write(di->w1_dev, &status, DS2760_STATUS_WRITE_REG, 1); in ds2760_battery_write_status()
300 w1_ds2760_store_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_status()
301 w1_ds2760_recall_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_status()
307 if (rated_capacity == di->raw[DS2760_RATED_CAPACITY]) in ds2760_battery_write_rated_capacity()
310 w1_ds2760_write(di->w1_dev, &rated_capacity, DS2760_RATED_CAPACITY, 1); in ds2760_battery_write_rated_capacity()
311 w1_ds2760_store_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_rated_capacity()
312 w1_ds2760_recall_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_write_rated_capacity()
323 if (tmp[0] == di->raw[DS2760_ACTIVE_FULL] && in ds2760_battery_write_active_full()
324 tmp[1] == di->raw[DS2760_ACTIVE_FULL + 1]) in ds2760_battery_write_active_full()
327 w1_ds2760_write(di->w1_dev, tmp, DS2760_ACTIVE_FULL, sizeof(tmp)); in ds2760_battery_write_active_full()
328 w1_ds2760_store_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK0); in ds2760_battery_write_active_full()
329 w1_ds2760_recall_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK0); in ds2760_battery_write_active_full()
331 /* Write to the di->raw[] buffer directly - the DS2760_ACTIVE_FULL in ds2760_battery_write_active_full()
332 * values won't be read back by ds2760_battery_read_status() */ in ds2760_battery_write_active_full()
333 di->raw[DS2760_ACTIVE_FULL] = tmp[0]; in ds2760_battery_write_active_full()
334 di->raw[DS2760_ACTIVE_FULL + 1] = tmp[1]; in ds2760_battery_write_active_full()
343 dev_dbg(di->dev, "%s\n", __func__); in ds2760_battery_work()
346 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, interval); in ds2760_battery_work()
356 dev_dbg(di->dev, "%s\n", __func__); in ds2760_battery_external_power_changed()
358 cancel_delayed_work(&di->monitor_work); in ds2760_battery_external_power_changed()
359 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ/10); in ds2760_battery_external_power_changed()
369 dev_dbg(di->dev, "%s\n", __func__); in ds2760_battery_set_charged_work()
373 /* When we get notified by external circuitry that the battery is in ds2760_battery_set_charged_work()
376 * too inaccurate to rely on - spec say something ~15% failure. in ds2760_battery_set_charged_work()
381 if (!power_supply_am_i_supplied(&di->bat)) in ds2760_battery_set_charged_work()
384 bias = (signed char) di->current_raw + in ds2760_battery_set_charged_work()
385 (signed char) di->raw[DS2760_CURRENT_OFFSET_BIAS]; in ds2760_battery_set_charged_work()
387 dev_dbg(di->dev, "%s: bias = %d\n", __func__, bias); in ds2760_battery_set_charged_work()
389 w1_ds2760_write(di->w1_dev, &bias, DS2760_CURRENT_OFFSET_BIAS, 1); in ds2760_battery_set_charged_work()
390 w1_ds2760_store_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_set_charged_work()
391 w1_ds2760_recall_eeprom(di->w1_dev, DS2760_EEPROM_BLOCK1); in ds2760_battery_set_charged_work()
393 /* Write to the di->raw[] buffer directly - the CURRENT_OFFSET_BIAS in ds2760_battery_set_charged_work()
394 * value won't be read back by ds2760_battery_read_status() */ in ds2760_battery_set_charged_work()
395 di->raw[DS2760_CURRENT_OFFSET_BIAS] = bias; in ds2760_battery_set_charged_work()
402 /* postpone the actual work by 20 secs. This is for debouncing GPIO in ds2760_battery_set_charged()
404 cancel_delayed_work(&di->set_charged_work); in ds2760_battery_set_charged()
405 queue_delayed_work(di->monitor_wqueue, &di->set_charged_work, HZ * 20); in ds2760_battery_set_charged()
416 val->intval = di->charge_status; in ds2760_battery_get_property()
426 val->intval = di->voltage_uV; in ds2760_battery_get_property()
429 val->intval = di->current_uA; in ds2760_battery_get_property()
432 val->intval = di->rated_capacity; in ds2760_battery_get_property()
435 val->intval = di->full_active_uAh; in ds2760_battery_get_property()
438 val->intval = di->empty_uAh; in ds2760_battery_get_property()
441 val->intval = di->accum_current_uAh; in ds2760_battery_get_property()
444 val->intval = di->temp_C; in ds2760_battery_get_property()
447 val->intval = di->life_sec; in ds2760_battery_get_property()
450 val->intval = di->rem_capacity; in ds2760_battery_get_property()
453 return -EINVAL; in ds2760_battery_get_property()
468 ds2760_battery_write_active_full(di, val->intval / 1000L); in ds2760_battery_set_property()
473 ds2760_battery_set_current_accum(di, val->intval); in ds2760_battery_set_property()
477 return -EPERM; in ds2760_battery_set_property()
519 retval = -ENOMEM; in ds2760_battery_probe()
525 di->dev = &pdev->dev; in ds2760_battery_probe()
526 di->w1_dev = pdev->dev.parent; in ds2760_battery_probe()
527 di->bat.name = dev_name(&pdev->dev); in ds2760_battery_probe()
528 di->bat.type = POWER_SUPPLY_TYPE_BATTERY; in ds2760_battery_probe()
529 di->bat.properties = ds2760_battery_props; in ds2760_battery_probe()
530 di->bat.num_properties = ARRAY_SIZE(ds2760_battery_props); in ds2760_battery_probe()
531 di->bat.get_property = ds2760_battery_get_property; in ds2760_battery_probe()
532 di->bat.set_property = ds2760_battery_set_property; in ds2760_battery_probe()
533 di->bat.property_is_writeable = in ds2760_battery_probe()
535 di->bat.set_charged = ds2760_battery_set_charged; in ds2760_battery_probe()
536 di->bat.external_power_changed = in ds2760_battery_probe()
539 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN; in ds2760_battery_probe()
543 status = di->raw[DS2760_STATUS_REG]; in ds2760_battery_probe()
560 retval = power_supply_register(&pdev->dev, &di->bat); in ds2760_battery_probe()
562 dev_err(di->dev, "failed to register battery\n"); in ds2760_battery_probe()
566 INIT_DELAYED_WORK(&di->monitor_work, ds2760_battery_work); in ds2760_battery_probe()
567 INIT_DELAYED_WORK(&di->set_charged_work, in ds2760_battery_probe()
569 di->monitor_wqueue = create_singlethread_workqueue(dev_name(&pdev->dev)); in ds2760_battery_probe()
570 if (!di->monitor_wqueue) { in ds2760_battery_probe()
571 retval = -ESRCH; in ds2760_battery_probe()
574 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ * 1); in ds2760_battery_probe()
579 power_supply_unregister(&di->bat); in ds2760_battery_probe()
591 cancel_delayed_work_sync(&di->monitor_work); in ds2760_battery_remove()
592 cancel_delayed_work_sync(&di->set_charged_work); in ds2760_battery_remove()
593 destroy_workqueue(di->monitor_wqueue); in ds2760_battery_remove()
594 power_supply_unregister(&di->bat); in ds2760_battery_remove()
607 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN; in ds2760_battery_suspend()
616 di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN; in ds2760_battery_resume()
617 power_supply_changed(&di->bat); in ds2760_battery_resume()
619 cancel_delayed_work(&di->monitor_work); in ds2760_battery_resume()
620 queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ); in ds2760_battery_resume()
632 MODULE_ALIAS("platform:ds2760-battery");
636 .name = "ds2760-battery",