Lines Matching refs:info

157 static int measure_12bit_voltage(struct pm860x_battery_info *info,  in measure_12bit_voltage()  argument
163 ret = pm860x_bulk_read(info->i2c, offset, 2, buf); in measure_12bit_voltage()
173 static int measure_vbatt(struct pm860x_battery_info *info, int state, in measure_vbatt() argument
181 ret = measure_12bit_voltage(info, PM8607_VBAT_MEAS1, data); in measure_vbatt()
197 ret = pm860x_bulk_read(info->i2c, PM8607_LDO5, 5, buf); in measure_vbatt()
216 static int measure_current(struct pm860x_battery_info *info, int *data) in measure_current() argument
222 ret = pm860x_bulk_read(info->i2c, PM8607_IBAT_MEAS1, 2, buf); in measure_current()
232 static int set_charger_current(struct pm860x_battery_info *info, int data, in set_charger_current() argument
241 *old = pm860x_reg_read(info->i2c, PM8607_CHG_CTRL2); in set_charger_current()
243 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL2, 0x1f, data); in set_charger_current()
249 static int read_ccnt(struct pm860x_battery_info *info, int offset, in read_ccnt() argument
255 ret = pm860x_set_bits(info->i2c, PM8607_CCNT, 7, offset & 7); in read_ccnt()
258 ret = pm860x_bulk_read(info->i2c, PM8607_CCNT_MEAS1, 2, buf); in read_ccnt()
267 static int calc_ccnt(struct pm860x_battery_info *info, struct ccnt *ccnt) in calc_ccnt() argument
273 ret = read_ccnt(info, CCNT_POS1, &data); in calc_ccnt()
277 ret = read_ccnt(info, CCNT_POS2, &data); in calc_ccnt()
283 ret = read_ccnt(info, CCNT_NEG1, &data); in calc_ccnt()
287 ret = read_ccnt(info, CCNT_NEG2, &data); in calc_ccnt()
294 ret = read_ccnt(info, CCNT_SPOS, &data); in calc_ccnt()
298 ret = read_ccnt(info, CCNT_SNEG, &data); in calc_ccnt()
314 static int clear_ccnt(struct pm860x_battery_info *info, struct ccnt *ccnt) in clear_ccnt() argument
320 read_ccnt(info, CCNT_POS1, &data); in clear_ccnt()
321 read_ccnt(info, CCNT_POS2, &data); in clear_ccnt()
322 read_ccnt(info, CCNT_NEG1, &data); in clear_ccnt()
323 read_ccnt(info, CCNT_NEG2, &data); in clear_ccnt()
324 read_ccnt(info, CCNT_SPOS, &data); in clear_ccnt()
325 read_ccnt(info, CCNT_SNEG, &data); in clear_ccnt()
330 static int calc_ocv(struct pm860x_battery_info *info, int *ocv) in calc_ocv() argument
344 ret = measure_vbatt(info, OCV_MODE_ACTIVE, &data); in calc_ocv()
348 ret = measure_current(info, &data); in calc_ocv()
356 mutex_lock(&info->lock); in calc_ocv()
357 if (info->present) in calc_ocv()
358 *ocv = vbatt_avg - ibatt_avg * info->resistor / 1000; in calc_ocv()
361 mutex_unlock(&info->lock); in calc_ocv()
362 dev_dbg(info->dev, "VBAT average:%d, OCV:%d\n", vbatt_avg, *ocv); in calc_ocv()
369 static int calc_soc(struct pm860x_battery_info *info, int state, int *soc) in calc_soc() argument
381 ret = calc_ocv(info, &ocv); in calc_soc()
384 ret = measure_vbatt(info, OCV_MODE_SLEEP, &ocv); in calc_soc()
407 struct pm860x_battery_info *info = data; in pm860x_coulomb_handler() local
409 calc_ccnt(info, &ccnt_data); in pm860x_coulomb_handler()
415 struct pm860x_battery_info *info = data; in pm860x_batt_handler() local
418 mutex_lock(&info->lock); in pm860x_batt_handler()
419 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2); in pm860x_batt_handler()
421 info->present = 1; in pm860x_batt_handler()
422 info->temp_type = PM860X_TEMP_TBAT; in pm860x_batt_handler()
424 info->present = 0; in pm860x_batt_handler()
425 info->temp_type = PM860X_TEMP_TINT; in pm860x_batt_handler()
427 mutex_unlock(&info->lock); in pm860x_batt_handler()
429 clear_ccnt(info, &ccnt_data); in pm860x_batt_handler()
433 static void pm860x_init_battery(struct pm860x_battery_info *info) in pm860x_init_battery() argument
443 if (info->temp_type == PM860X_TEMP_TINT) in pm860x_init_battery()
445 ret = pm860x_set_bits(info->i2c, PM8607_MEAS_EN1, data, data); in pm860x_init_battery()
451 ret = pm860x_set_bits(info->i2c, PM8607_MEAS_EN3, data, data); in pm860x_init_battery()
456 ret = pm860x_reg_write(info->i2c, PM8607_MEAS_OFF_TIME1, 0x82); in pm860x_init_battery()
459 ret = pm860x_reg_write(info->i2c, PM8607_MEAS_OFF_TIME2, 0x6c); in pm860x_init_battery()
464 ret = pm860x_set_bits(info->i2c, PM8607_GPADC_MISC1, in pm860x_init_battery()
470 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL6, in pm860x_init_battery()
475 ret = pm860x_set_bits(info->i2c, PM8607_CCNT, 7 << 3, in pm860x_init_battery()
481 ret = pm860x_set_bits(info->i2c, PM8607_GP_BIAS2, 0xF << 4, in pm860x_init_battery()
487 mutex_lock(&info->lock); in pm860x_init_battery()
488 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2); in pm860x_init_battery()
490 mutex_unlock(&info->lock); in pm860x_init_battery()
494 info->present = 1; in pm860x_init_battery()
495 info->temp_type = PM860X_TEMP_TBAT; in pm860x_init_battery()
497 info->present = 0; in pm860x_init_battery()
498 info->temp_type = PM860X_TEMP_TINT; in pm860x_init_battery()
500 mutex_unlock(&info->lock); in pm860x_init_battery()
502 calc_soc(info, OCV_MODE_ACTIVE, &soc); in pm860x_init_battery()
504 data = pm860x_reg_read(info->i2c, PM8607_POWER_UP_LOG); in pm860x_init_battery()
507 dev_dbg(info->dev, "battery wake up? %s\n", in pm860x_init_battery()
512 buf[0] = pm860x_reg_read(info->i2c, PM8607_RTC_MISC2); in pm860x_init_battery()
513 buf[1] = pm860x_reg_read(info->i2c, PM8607_RTC1); in pm860x_init_battery()
516 info->start_soc = soc; in pm860x_init_battery()
518 info->start_soc = soc; in pm860x_init_battery()
520 info->start_soc = data; in pm860x_init_battery()
521 dev_dbg(info->dev, "soc_rtc %d, soc_ocv :%d\n", data, soc); in pm860x_init_battery()
523 pm860x_set_bits(info->i2c, PM8607_POWER_UP_LOG, in pm860x_init_battery()
525 info->start_soc = soc; in pm860x_init_battery()
527 info->last_capacity = info->start_soc; in pm860x_init_battery()
528 dev_dbg(info->dev, "init soc : %d\n", info->last_capacity); in pm860x_init_battery()
533 static void set_temp_threshold(struct pm860x_battery_info *info, in set_temp_threshold() argument
543 pm860x_reg_write(info->i2c, PM8607_GPADC1_HIGHTH, data); in set_temp_threshold()
544 dev_dbg(info->dev, "TEMP_HIGHTH : min: %d, 0x%x\n", min, data); in set_temp_threshold()
550 pm860x_reg_write(info->i2c, PM8607_GPADC1_LOWTH, data); in set_temp_threshold()
551 dev_dbg(info->dev, "TEMP_LOWTH:max : %d, 0x%x\n", max, data); in set_temp_threshold()
554 static int measure_temp(struct pm860x_battery_info *info, int *data) in measure_temp() argument
561 if (info->temp_type == PM860X_TEMP_TINT) { in measure_temp()
562 ret = measure_12bit_voltage(info, PM8607_TINT_MEAS1, data); in measure_temp()
567 ret = measure_12bit_voltage(info, PM8607_GPADC1_MEAS1, data); in measure_temp()
576 set_temp_threshold(info, 0, max); in measure_temp()
580 set_temp_threshold(info, 0, max); in measure_temp()
585 set_temp_threshold(info, min, max); in measure_temp()
590 set_temp_threshold(info, min, max); in measure_temp()
595 set_temp_threshold(info, min, max); in measure_temp()
600 set_temp_threshold(info, min, max); in measure_temp()
605 set_temp_threshold(info, min, max); in measure_temp()
608 set_temp_threshold(info, min, 0); in measure_temp()
612 dev_dbg(info->dev, "temp_C:%d C,temp_mv:%d mv\n", temp, *data); in measure_temp()
618 static int calc_resistor(struct pm860x_battery_info *info) in calc_resistor() argument
629 ret = measure_current(info, &data); in calc_resistor()
634 ret = measure_vbatt(info, OCV_MODE_ACTIVE, &data); in calc_resistor()
642 if (set_charger_current(info, 500, &chg_current)) in calc_resistor()
652 ret = measure_vbatt(info, OCV_MODE_ACTIVE, &data); in calc_resistor()
656 ret = measure_current(info, &data); in calc_resistor()
666 if (set_charger_current(info, 100, &ret)) in calc_resistor()
675 ret = measure_vbatt(info, OCV_MODE_ACTIVE, &data); in calc_resistor()
679 ret = measure_current(info, &data); in calc_resistor()
690 if (set_charger_current(info, chg_current, &ret)) in calc_resistor()
698 if ((data - info->resistor > 0) && in calc_resistor()
699 (data - info->resistor < info->resistor)) in calc_resistor()
700 info->resistor = data; in calc_resistor()
701 if ((info->resistor - data > 0) && in calc_resistor()
702 (info->resistor - data < data)) in calc_resistor()
703 info->resistor = data; in calc_resistor()
708 set_charger_current(info, chg_current, &ret); in calc_resistor()
713 static int calc_capacity(struct pm860x_battery_info *info, int *cap) in calc_capacity() argument
721 ret = calc_ccnt(info, &ccnt_data); in calc_capacity()
725 data = info->max_capacity * info->start_soc / 100; in calc_capacity()
730 clear_ccnt(info, &ccnt_data); in calc_capacity()
731 calc_soc(info, OCV_MODE_ACTIVE, &info->start_soc); in calc_capacity()
732 dev_dbg(info->dev, "restart soc = %d !\n", in calc_capacity()
733 info->start_soc); in calc_capacity()
737 cap_cc = cap_cc * 100 / info->max_capacity; in calc_capacity()
743 dev_dbg(info->dev, "%s, last cap : %d", __func__, in calc_capacity()
744 info->last_capacity); in calc_capacity()
746 ret = measure_current(info, &ibat); in calc_capacity()
751 ret = calc_soc(info, OCV_MODE_ACTIVE, &cap_ocv); in calc_capacity()
753 cap_ocv = info->last_capacity; in calc_capacity()
754 ret = measure_vbatt(info, OCV_MODE_ACTIVE, &data); in calc_capacity()
776 if (*cap > info->last_capacity) in calc_capacity()
777 *cap = info->last_capacity; in calc_capacity()
781 info->last_capacity = *cap; in calc_capacity()
783 dev_dbg(info->dev, "%s, cap_ocv:%d cap_cc:%d, cap:%d\n", in calc_capacity()
790 pm860x_set_bits(info->i2c, PM8607_RTC_MISC2, RTC_SOC_5LSB, in calc_capacity()
792 pm860x_set_bits(info->i2c, PM8607_RTC1, RTC_SOC_3MSB, in calc_capacity()
801 struct pm860x_battery_info *info = dev_get_drvdata(psy->dev.parent); in pm860x_external_power_changed() local
803 calc_resistor(info); in pm860x_external_power_changed()
810 struct pm860x_battery_info *info = dev_get_drvdata(psy->dev.parent); in pm860x_batt_get_prop() local
816 val->intval = info->present; in pm860x_batt_get_prop()
819 ret = calc_capacity(info, &data); in pm860x_batt_get_prop()
827 if (!info->present) in pm860x_batt_get_prop()
836 ret = measure_vbatt(info, OCV_MODE_ACTIVE, &data); in pm860x_batt_get_prop()
843 ret = calc_ocv(info, &data); in pm860x_batt_get_prop()
849 ret = measure_current(info, &data); in pm860x_batt_get_prop()
855 if (info->present) { in pm860x_batt_get_prop()
856 ret = measure_temp(info, &data); in pm860x_batt_get_prop()
876 struct pm860x_battery_info *info = dev_get_drvdata(psy->dev.parent); in pm860x_batt_set_prop() local
880 clear_ccnt(info, &ccnt_data); in pm860x_batt_set_prop()
881 info->start_soc = 100; in pm860x_batt_set_prop()
882 dev_dbg(info->dev, "chg done, update soc = %d\n", in pm860x_batt_set_prop()
883 info->start_soc); in pm860x_batt_set_prop()
916 struct pm860x_battery_info *info; in pm860x_battery_probe() local
920 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in pm860x_battery_probe()
921 if (!info) in pm860x_battery_probe()
924 info->irq_cc = platform_get_irq(pdev, 0); in pm860x_battery_probe()
925 if (info->irq_cc <= 0) { in pm860x_battery_probe()
930 info->irq_batt = platform_get_irq(pdev, 1); in pm860x_battery_probe()
931 if (info->irq_batt <= 0) { in pm860x_battery_probe()
936 info->chip = chip; in pm860x_battery_probe()
937 info->i2c = in pm860x_battery_probe()
939 info->dev = &pdev->dev; in pm860x_battery_probe()
940 info->status = POWER_SUPPLY_STATUS_UNKNOWN; in pm860x_battery_probe()
943 mutex_init(&info->lock); in pm860x_battery_probe()
944 platform_set_drvdata(pdev, info); in pm860x_battery_probe()
946 pm860x_init_battery(info); in pm860x_battery_probe()
949 info->max_capacity = pdata->max_capacity; in pm860x_battery_probe()
951 info->max_capacity = 1500; /* set default capacity */ in pm860x_battery_probe()
953 info->resistor = pdata->resistor; in pm860x_battery_probe()
955 info->resistor = 300; /* set default internal resistor */ in pm860x_battery_probe()
957 info->battery = devm_power_supply_register(&pdev->dev, in pm860x_battery_probe()
960 if (IS_ERR(info->battery)) in pm860x_battery_probe()
961 return PTR_ERR(info->battery); in pm860x_battery_probe()
962 info->battery->dev.parent = &pdev->dev; in pm860x_battery_probe()
964 ret = devm_request_threaded_irq(chip->dev, info->irq_cc, NULL, in pm860x_battery_probe()
966 "coulomb", info); in pm860x_battery_probe()
969 info->irq_cc, ret); in pm860x_battery_probe()
973 ret = devm_request_threaded_irq(chip->dev, info->irq_batt, NULL, in pm860x_battery_probe()
975 IRQF_ONESHOT, "battery", info); in pm860x_battery_probe()
978 info->irq_batt, ret); in pm860x_battery_probe()