Lines Matching refs:ddata
147 cpcap_battery_get_state(struct cpcap_battery_ddata *ddata, in cpcap_battery_get_state() argument
153 return &ddata->state[state]; in cpcap_battery_get_state()
157 cpcap_battery_latest(struct cpcap_battery_ddata *ddata) in cpcap_battery_latest() argument
159 return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_LATEST); in cpcap_battery_latest()
163 cpcap_battery_previous(struct cpcap_battery_ddata *ddata) in cpcap_battery_previous() argument
165 return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_PREVIOUS); in cpcap_battery_previous()
169 cpcap_battery_get_empty(struct cpcap_battery_ddata *ddata) in cpcap_battery_get_empty() argument
171 return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_EMPTY); in cpcap_battery_get_empty()
175 cpcap_battery_get_full(struct cpcap_battery_ddata *ddata) in cpcap_battery_get_full() argument
177 return cpcap_battery_get_state(ddata, CPCAP_BATTERY_STATE_FULL); in cpcap_battery_get_full()
180 static int cpcap_charger_battery_temperature(struct cpcap_battery_ddata *ddata, in cpcap_charger_battery_temperature() argument
186 channel = ddata->channels[CPCAP_BATTERY_IIO_BATTDET]; in cpcap_charger_battery_temperature()
190 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_charger_battery_temperature()
201 static int cpcap_battery_get_voltage(struct cpcap_battery_ddata *ddata) in cpcap_battery_get_voltage() argument
206 channel = ddata->channels[CPCAP_BATTERY_IIO_VOLTAGE]; in cpcap_battery_get_voltage()
209 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_battery_get_voltage()
217 static int cpcap_battery_get_current(struct cpcap_battery_ddata *ddata) in cpcap_battery_get_current() argument
222 channel = ddata->channels[CPCAP_BATTERY_IIO_BATT_CURRENT]; in cpcap_battery_get_current()
225 dev_warn(ddata->dev, "%s failed: %i\n", __func__, error); in cpcap_battery_get_current()
254 static int cpcap_battery_cc_raw_div(struct cpcap_battery_ddata *ddata, in cpcap_battery_cc_raw_div() argument
265 acc *= ddata->cc_lsb; in cpcap_battery_cc_raw_div()
273 static int cpcap_battery_cc_to_uah(struct cpcap_battery_ddata *ddata, in cpcap_battery_cc_to_uah() argument
277 return cpcap_battery_cc_raw_div(ddata, sample, in cpcap_battery_cc_to_uah()
282 static int cpcap_battery_cc_to_ua(struct cpcap_battery_ddata *ddata, in cpcap_battery_cc_to_ua() argument
286 return cpcap_battery_cc_raw_div(ddata, sample, in cpcap_battery_cc_to_ua()
308 cpcap_battery_read_accumulated(struct cpcap_battery_ddata *ddata, in cpcap_battery_read_accumulated() argument
320 error = regmap_bulk_read(ddata->reg, CPCAP_REG_CCS1, in cpcap_battery_read_accumulated()
328 if (ddata->vendor == CPCAP_VENDOR_TI) in cpcap_battery_read_accumulated()
343 if (ddata->vendor == CPCAP_VENDOR_TI) in cpcap_battery_read_accumulated()
348 return cpcap_battery_cc_to_uah(ddata, in cpcap_battery_read_accumulated()
407 static void cpcap_battery_detect_battery_type(struct cpcap_battery_ddata *ddata) in cpcap_battery_detect_battery_type() argument
412 ddata->check_nvmem = false; in cpcap_battery_detect_battery_type()
416 ddata->check_nvmem = true; in cpcap_battery_detect_battery_type()
417 dev_info_once(ddata->dev, "Can not find battery nvmem device. Assuming generic lipo battery\n"); in cpcap_battery_detect_battery_type()
420 ddata->check_nvmem = true; in cpcap_battery_detect_battery_type()
421 dev_warn(ddata->dev, "Can not read battery nvmem device. Assuming generic lipo battery\n"); in cpcap_battery_detect_battery_type()
426 ddata->config = cpcap_battery_eb41_data; in cpcap_battery_detect_battery_type()
429 ddata->config = cpcap_battery_bw8x_data; in cpcap_battery_detect_battery_type()
432 ddata->config = cpcap_battery_unkown_data; in cpcap_battery_detect_battery_type()
440 static int cpcap_battery_cc_get_avg_current(struct cpcap_battery_ddata *ddata) in cpcap_battery_cc_get_avg_current() argument
447 error = regmap_read(ddata->reg, CPCAP_REG_CCI, &value); in cpcap_battery_cc_get_avg_current()
451 if (ddata->vendor == CPCAP_VENDOR_TI) { in cpcap_battery_cc_get_avg_current()
460 error = regmap_read(ddata->reg, CPCAP_REG_CCM, &value); in cpcap_battery_cc_get_avg_current()
466 return cpcap_battery_cc_to_ua(ddata, sample, acc, offset); in cpcap_battery_cc_get_avg_current()
469 static int cpcap_battery_get_charger_status(struct cpcap_battery_ddata *ddata, in cpcap_battery_get_charger_status() argument
492 static bool cpcap_battery_full(struct cpcap_battery_ddata *ddata) in cpcap_battery_full() argument
494 struct cpcap_battery_state_data *state = cpcap_battery_latest(ddata); in cpcap_battery_full()
498 error = cpcap_battery_get_charger_status(ddata, &val); in cpcap_battery_full()
502 dev_dbg(ddata->dev, "charger disconnected\n"); in cpcap_battery_full()
503 ddata->is_full = 0; in cpcap_battery_full()
506 dev_dbg(ddata->dev, "charger full status\n"); in cpcap_battery_full()
507 ddata->is_full = 1; in cpcap_battery_full()
519 vfull = ddata->config.bat.constant_charge_voltage_max_uv - 120000; in cpcap_battery_full()
521 if (ddata->is_full && state->voltage < vfull) in cpcap_battery_full()
522 ddata->is_full = 0; in cpcap_battery_full()
524 return ddata->is_full; in cpcap_battery_full()
527 static bool cpcap_battery_low(struct cpcap_battery_ddata *ddata) in cpcap_battery_low() argument
529 struct cpcap_battery_state_data *state = cpcap_battery_latest(ddata); in cpcap_battery_low()
540 static int cpcap_battery_update_status(struct cpcap_battery_ddata *ddata) in cpcap_battery_update_status() argument
550 latest = cpcap_battery_latest(ddata); in cpcap_battery_update_status()
559 state.voltage = cpcap_battery_get_voltage(ddata); in cpcap_battery_update_status()
560 state.current_ua = cpcap_battery_get_current(ddata); in cpcap_battery_update_status()
561 state.counter_uah = cpcap_battery_read_accumulated(ddata, &state.cc); in cpcap_battery_update_status()
563 error = cpcap_charger_battery_temperature(ddata, in cpcap_battery_update_status()
568 previous = cpcap_battery_previous(ddata); in cpcap_battery_update_status()
572 if (cpcap_battery_full(ddata)) { in cpcap_battery_update_status()
573 full = cpcap_battery_get_full(ddata); in cpcap_battery_update_status()
576 empty = cpcap_battery_get_empty(ddata); in cpcap_battery_update_status()
579 ddata->charge_full = in cpcap_battery_update_status()
581 } else if (ddata->charge_full) { in cpcap_battery_update_status()
584 full->counter_uah + ddata->charge_full; in cpcap_battery_update_status()
586 } else if (cpcap_battery_low(ddata)) { in cpcap_battery_update_status()
587 empty = cpcap_battery_get_empty(ddata); in cpcap_battery_update_status()
590 full = cpcap_battery_get_full(ddata); in cpcap_battery_update_status()
593 ddata->charge_full = in cpcap_battery_update_status()
639 struct cpcap_battery_ddata *ddata = power_supply_get_drvdata(psy); in cpcap_battery_get_property() local
646 cached = cpcap_battery_update_status(ddata); in cpcap_battery_get_property()
650 latest = cpcap_battery_latest(ddata); in cpcap_battery_get_property()
651 previous = cpcap_battery_previous(ddata); in cpcap_battery_get_property()
653 if (ddata->check_nvmem) in cpcap_battery_get_property()
654 cpcap_battery_detect_battery_type(ddata); in cpcap_battery_get_property()
664 if (cpcap_battery_full(ddata)) { in cpcap_battery_get_property()
668 if (cpcap_battery_cc_get_avg_current(ddata) < 0) in cpcap_battery_get_property()
674 val->intval = ddata->config.info.technology; in cpcap_battery_get_property()
677 val->intval = cpcap_battery_get_voltage(ddata); in cpcap_battery_get_property()
680 val->intval = ddata->config.info.voltage_max_design; in cpcap_battery_get_property()
683 val->intval = ddata->config.info.voltage_min_design; in cpcap_battery_get_property()
686 val->intval = ddata->config.bat.constant_charge_voltage_max_uv; in cpcap_battery_get_property()
691 val->intval = cpcap_battery_cc_get_avg_current(ddata); in cpcap_battery_get_property()
695 val->intval = cpcap_battery_cc_to_ua(ddata, sample, in cpcap_battery_get_property()
712 tmp = cpcap_battery_cc_get_avg_current(ddata); in cpcap_battery_get_property()
718 tmp = cpcap_battery_cc_to_ua(ddata, sample, accumulator, in cpcap_battery_get_property()
724 empty = cpcap_battery_get_empty(ddata); in cpcap_battery_get_property()
725 if (!empty->voltage || !ddata->charge_full) in cpcap_battery_get_property()
729 ddata->charge_full / 200; in cpcap_battery_get_property()
730 val->intval = clamp(val->intval, 0, ddata->charge_full); in cpcap_battery_get_property()
731 val->intval = val->intval * 100 / ddata->charge_full; in cpcap_battery_get_property()
734 if (cpcap_battery_full(ddata)) in cpcap_battery_get_property()
748 empty = cpcap_battery_get_empty(ddata); in cpcap_battery_get_property()
754 if (ddata->charge_full && abs(val->intval) > ddata->charge_full/5) { in cpcap_battery_get_property()
756 ddata->charge_full = 0; in cpcap_battery_get_property()
760 } else if (ddata->charge_full && ddata->charge_full < val->intval) { in cpcap_battery_get_property()
762 if (val->intval > (6*ddata->charge_full)/5) { in cpcap_battery_get_property()
764 ddata->charge_full = 0; in cpcap_battery_get_property()
767 val->intval = ddata->charge_full; in cpcap_battery_get_property()
771 if (!ddata->charge_full) in cpcap_battery_get_property()
773 val->intval = ddata->charge_full; in cpcap_battery_get_property()
776 val->intval = ddata->config.info.charge_full_design; in cpcap_battery_get_property()
793 static int cpcap_battery_update_charger(struct cpcap_battery_ddata *ddata, in cpcap_battery_update_charger() argument
830 struct cpcap_battery_ddata *ddata = power_supply_get_drvdata(psy); in cpcap_battery_set_property() local
834 if (val->intval < ddata->config.info.voltage_min_design) in cpcap_battery_set_property()
836 if (val->intval > ddata->config.info.voltage_max_design) in cpcap_battery_set_property()
839 ddata->config.bat.constant_charge_voltage_max_uv = val->intval; in cpcap_battery_set_property()
841 return cpcap_battery_update_charger(ddata, val->intval); in cpcap_battery_set_property()
845 if (val->intval > (6*ddata->config.info.charge_full_design)/5) in cpcap_battery_set_property()
848 ddata->charge_full = val->intval; in cpcap_battery_set_property()
872 struct cpcap_battery_ddata *ddata = data; in cpcap_battery_irq_thread() local
876 if (!atomic_read(&ddata->active)) in cpcap_battery_irq_thread()
879 list_for_each_entry(d, &ddata->irq_list, node) { in cpcap_battery_irq_thread()
884 if (list_entry_is_head(d, &ddata->irq_list, node)) in cpcap_battery_irq_thread()
887 latest = cpcap_battery_latest(ddata); in cpcap_battery_irq_thread()
891 dev_info(ddata->dev, "Coulomb counter calibration done\n"); in cpcap_battery_irq_thread()
895 dev_warn(ddata->dev, "Battery low at %imV!\n", in cpcap_battery_irq_thread()
900 dev_emerg(ddata->dev, in cpcap_battery_irq_thread()
910 power_supply_changed(ddata->psy); in cpcap_battery_irq_thread()
916 struct cpcap_battery_ddata *ddata, in cpcap_battery_init_irq() argument
926 error = devm_request_threaded_irq(ddata->dev, irq, NULL, in cpcap_battery_init_irq()
929 name, ddata); in cpcap_battery_init_irq()
931 dev_err(ddata->dev, "could not get irq %s: %i\n", in cpcap_battery_init_irq()
937 d = devm_kzalloc(ddata->dev, sizeof(*d), GFP_KERNEL); in cpcap_battery_init_irq()
951 list_add(&d->node, &ddata->irq_list); in cpcap_battery_init_irq()
957 struct cpcap_battery_ddata *ddata) in cpcap_battery_init_interrupts() argument
966 error = cpcap_battery_init_irq(pdev, ddata, in cpcap_battery_init_interrupts()
973 cpcap_battery_init_irq(pdev, ddata, "cccal"); in cpcap_battery_init_interrupts()
976 error = regmap_update_bits(ddata->reg, CPCAP_REG_BPEOL, in cpcap_battery_init_interrupts()
985 static int cpcap_battery_init_iio(struct cpcap_battery_ddata *ddata) in cpcap_battery_init_iio() argument
993 ddata->channels[i] = devm_iio_channel_get(ddata->dev, in cpcap_battery_init_iio()
995 if (IS_ERR(ddata->channels[i])) { in cpcap_battery_init_iio()
996 error = PTR_ERR(ddata->channels[i]); in cpcap_battery_init_iio()
1000 if (!ddata->channels[i]->indio_dev) { in cpcap_battery_init_iio()
1009 return dev_err_probe(ddata->dev, error, in cpcap_battery_init_iio()
1014 static int cpcap_battery_calibrate(struct cpcap_battery_ddata *ddata) in cpcap_battery_calibrate() argument
1019 error = regmap_read(ddata->reg, CPCAP_REG_CCC1, &ccc1); in cpcap_battery_calibrate()
1026 error = regmap_update_bits(ddata->reg, CPCAP_REG_CCC1, in cpcap_battery_calibrate()
1033 error = regmap_read(ddata->reg, CPCAP_REG_CCC1, &value); in cpcap_battery_calibrate()
1040 error = regmap_read(ddata->reg, CPCAP_REG_CCM, &value); in cpcap_battery_calibrate()
1048 error = regmap_read(ddata->reg, CPCAP_REG_CCM, &value); in cpcap_battery_calibrate()
1052 dev_info(ddata->dev, "calibration done: 0x%04x\n", value); in cpcap_battery_calibrate()
1056 dev_err(ddata->dev, "%s: error %i\n", __func__, error); in cpcap_battery_calibrate()
1058 error = regmap_update_bits(ddata->reg, CPCAP_REG_CCC1, in cpcap_battery_calibrate()
1061 dev_err(ddata->dev, "%s: restore error %i\n", in cpcap_battery_calibrate()
1090 struct cpcap_battery_ddata *ddata; in cpcap_battery_probe() local
1094 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); in cpcap_battery_probe()
1095 if (!ddata) in cpcap_battery_probe()
1098 cpcap_battery_detect_battery_type(ddata); in cpcap_battery_probe()
1100 INIT_LIST_HEAD(&ddata->irq_list); in cpcap_battery_probe()
1101 ddata->dev = &pdev->dev; in cpcap_battery_probe()
1103 ddata->reg = dev_get_regmap(ddata->dev->parent, NULL); in cpcap_battery_probe()
1104 if (!ddata->reg) in cpcap_battery_probe()
1107 error = cpcap_get_vendor(ddata->dev, ddata->reg, &ddata->vendor); in cpcap_battery_probe()
1111 switch (ddata->vendor) { in cpcap_battery_probe()
1113 ddata->cc_lsb = 95374; /* μAms per LSB */ in cpcap_battery_probe()
1116 ddata->cc_lsb = 91501; /* μAms per LSB */ in cpcap_battery_probe()
1121 ddata->cc_lsb = (ddata->cc_lsb * ddata->config.cd_factor) / 1000; in cpcap_battery_probe()
1123 platform_set_drvdata(pdev, ddata); in cpcap_battery_probe()
1125 error = cpcap_battery_init_interrupts(pdev, ddata); in cpcap_battery_probe()
1129 error = cpcap_battery_init_iio(ddata); in cpcap_battery_probe()
1134 psy_cfg.drv_data = ddata; in cpcap_battery_probe()
1136 ddata->psy = devm_power_supply_register(ddata->dev, in cpcap_battery_probe()
1139 error = PTR_ERR_OR_ZERO(ddata->psy); in cpcap_battery_probe()
1141 dev_err(ddata->dev, "failed to register power supply\n"); in cpcap_battery_probe()
1145 atomic_set(&ddata->active, 1); in cpcap_battery_probe()
1147 error = cpcap_battery_calibrate(ddata); in cpcap_battery_probe()
1156 struct cpcap_battery_ddata *ddata = platform_get_drvdata(pdev); in cpcap_battery_remove() local
1159 atomic_set(&ddata->active, 0); in cpcap_battery_remove()
1160 error = regmap_update_bits(ddata->reg, CPCAP_REG_BPEOL, in cpcap_battery_remove()