Lines Matching refs:di

134  * @di:		pointer to the ab8500_btemp structure
142 static int ab8500_btemp_batctrl_volt_to_res(struct ab8500_btemp *di,
147 if (is_ab8500_1p1_or_earlier(di->parent)) {
155 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL) {
161 - di->bm->gnd_lift_resistance * inst_curr)
162 / di->curr_source;
176 * @di: pointer to the ab8500_btemp structure
180 static int ab8500_btemp_read_batctrl_voltage(struct ab8500_btemp *di)
185 ret = iio_read_channel_processed(di->bat_ctrl, &vbtemp);
187 dev_err(di->dev,
198 * @di: pointer to the ab8500_btemp structure
203 static int ab8500_btemp_curr_source_enable(struct ab8500_btemp *di,
213 if (is_ab8500_1p1_or_earlier(di->parent))
217 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && enable) {
219 if (di->curr_source == BTEMP_BATCTRL_CURR_SRC_7UA)
224 dev_dbg(di->dev, "Set BATCTRL %duA\n", di->curr_source);
226 ret = abx500_mask_and_set_register_interruptible(di->dev,
230 dev_err(di->dev, "%s failed setting cmp_force\n",
242 ret = abx500_set_register_interruptible(di->dev,
246 dev_err(di->dev, "%s failed enabling current source\n",
250 } else if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && !enable) {
251 dev_dbg(di->dev, "Disable BATCTRL curr source\n");
255 di->dev,
261 dev_err(di->dev, "%s failed disabling current source\n",
267 ret = abx500_mask_and_set_register_interruptible(di->dev,
272 dev_err(di->dev, "%s failed enabling PU and comp\n",
285 ret = abx500_mask_and_set_register_interruptible(di->dev,
289 dev_err(di->dev, "%s failed disabling force comp\n",
302 ret = abx500_mask_and_set_register_interruptible(di->dev,
308 dev_err(di->dev, "%s failed disabling current source\n",
314 ret = abx500_mask_and_set_register_interruptible(di->dev,
319 dev_err(di->dev, "%s failed enabling PU and comp\n",
333 ret = abx500_mask_and_set_register_interruptible(di->dev,
337 dev_err(di->dev, "%s failed disabling force comp\n",
347 * @di: pointer to the ab8500_btemp structure
352 static int ab8500_btemp_get_batctrl_res(struct ab8500_btemp *di)
364 ret = ab8500_btemp_curr_source_enable(di, true);
366 dev_err(di->dev, "%s curr source enabled failed\n", __func__);
370 if (!di->fg)
371 di->fg = ab8500_fg_get();
372 if (!di->fg) {
373 dev_err(di->dev, "No fg found\n");
377 ret = ab8500_fg_inst_curr_start(di->fg);
380 dev_err(di->dev, "Failed to start current measurement\n");
386 } while (!ab8500_fg_inst_curr_started(di->fg));
391 batctrl += ab8500_btemp_read_batctrl_voltage(di);
394 } while (!ab8500_fg_inst_curr_done(di->fg));
397 ret = ab8500_fg_inst_curr_finalize(di->fg, &inst_curr);
399 dev_err(di->dev, "Failed to finalize current measurement\n");
403 res = ab8500_btemp_batctrl_volt_to_res(di, batctrl, inst_curr);
405 ret = ab8500_btemp_curr_source_enable(di, false);
407 dev_err(di->dev, "%s curr source disable failed\n", __func__);
411 dev_dbg(di->dev, "%s batctrl: %d res: %d inst_curr: %d samples: %d\n",
419 * @di: pointer to the ab8500_btemp structure
427 static int ab8500_btemp_res_to_temp(struct ab8500_btemp *di,
454 * @di: pointer to the ab8500_btemp structure
458 static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
465 id = di->bm->batt_id;
467 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL &&
470 rbat = ab8500_btemp_get_batctrl_res(di);
472 dev_err(di->dev, "%s get batctrl res failed\n",
481 temp = ab8500_btemp_res_to_temp(di,
482 di->bm->bat_type[id].r_to_t_tbl,
483 di->bm->bat_type[id].n_temp_tbl_elements, rbat);
485 ret = iio_read_channel_processed(di->btemp_ball, &vntc);
487 dev_err(di->dev,
498 temp = ab8500_btemp_res_to_temp(di,
499 di->bm->bat_type[id].r_to_t_tbl,
500 di->bm->bat_type[id].n_temp_tbl_elements, rntc);
503 dev_dbg(di->dev, "Battery temperature is %d\n", temp);
509 * @di: pointer to the ab8500_btemp structure
515 static int ab8500_btemp_id(struct ab8500_btemp *di)
520 di->curr_source = BTEMP_BATCTRL_CURR_SRC_7UA;
521 di->bm->batt_id = BATTERY_UNKNOWN;
523 res = ab8500_btemp_get_batctrl_res(di);
525 dev_err(di->dev, "%s get batctrl res failed\n", __func__);
530 for (i = BATTERY_UNKNOWN + 1; i < di->bm->n_btypes; i++) {
531 if ((res <= di->bm->bat_type[i].resis_high) &&
532 (res >= di->bm->bat_type[i].resis_low)) {
533 dev_dbg(di->dev, "Battery detected on %s"
536 di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL ?
538 di->bm->bat_type[i].resis_low, res,
539 di->bm->bat_type[i].resis_high, i);
541 di->bm->batt_id = i;
546 if (di->bm->batt_id == BATTERY_UNKNOWN) {
547 dev_warn(di->dev, "Battery identified as unknown"
556 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL &&
557 di->bm->batt_id == 1) {
558 dev_dbg(di->dev, "Set BATCTRL current source to 20uA\n");
559 di->curr_source = BTEMP_BATCTRL_CURR_SRC_20UA;
562 return di->bm->batt_id;
575 struct ab8500_btemp *di = container_of(work,
578 if (!di->initialized) {
580 if (ab8500_btemp_id(di) < 0)
581 dev_warn(di->dev, "failed to identify the battery\n");
584 bat_temp = ab8500_btemp_measure_temp(di);
591 if ((bat_temp == di->prev_bat_temp) || !di->initialized) {
592 if ((di->bat_temp != di->prev_bat_temp) || !di->initialized) {
593 di->initialized = true;
594 di->bat_temp = bat_temp;
595 power_supply_changed(di->btemp_psy);
597 } else if (bat_temp < di->prev_bat_temp) {
598 di->bat_temp--;
599 power_supply_changed(di->btemp_psy);
600 } else if (bat_temp > di->prev_bat_temp) {
601 di->bat_temp++;
602 power_supply_changed(di->btemp_psy);
604 di->prev_bat_temp = bat_temp;
606 if (di->events.ac_conn || di->events.usb_conn)
607 interval = di->bm->temp_interval_chg;
609 interval = di->bm->temp_interval_nochg;
612 queue_delayed_work(di->btemp_wq,
613 &di->btemp_periodic_work,
626 struct ab8500_btemp *di = _di;
627 dev_err(di->dev, "Battery removal detected!\n");
629 di->events.batt_rem = true;
630 power_supply_changed(di->btemp_psy);
644 struct ab8500_btemp *di = _di;
646 if (is_ab8500_3p3_or_earlier(di->parent)) {
647 dev_dbg(di->dev, "Ignore false btemp low irq"
650 dev_crit(di->dev, "Battery temperature lower than -10deg c\n");
652 di->events.btemp_low = true;
653 di->events.btemp_high = false;
654 di->events.btemp_medhigh = false;
655 di->events.btemp_lowmed = false;
656 power_supply_changed(di->btemp_psy);
671 struct ab8500_btemp *di = _di;
673 dev_crit(di->dev, "Battery temperature is higher than MAX temp\n");
675 di->events.btemp_high = true;
676 di->events.btemp_medhigh = false;
677 di->events.btemp_lowmed = false;
678 di->events.btemp_low = false;
679 power_supply_changed(di->btemp_psy);
693 struct ab8500_btemp *di = _di;
695 dev_dbg(di->dev, "Battery temperature is between low and medium\n");
697 di->events.btemp_lowmed = true;
698 di->events.btemp_medhigh = false;
699 di->events.btemp_high = false;
700 di->events.btemp_low = false;
701 power_supply_changed(di->btemp_psy);
715 struct ab8500_btemp *di = _di;
717 dev_dbg(di->dev, "Battery temperature is between medium and high\n");
719 di->events.btemp_medhigh = true;
720 di->events.btemp_lowmed = false;
721 di->events.btemp_high = false;
722 di->events.btemp_low = false;
723 power_supply_changed(di->btemp_psy);
730 * @di: pointer to the ab8500_btemp structure
736 static void ab8500_btemp_periodic(struct ab8500_btemp *di,
739 dev_dbg(di->dev, "Enable periodic temperature measurements: %d\n",
745 cancel_delayed_work_sync(&di->btemp_periodic_work);
748 queue_delayed_work(di->btemp_wq, &di->btemp_periodic_work, 0);
753 * @di: pointer to the ab8500_btemp structure
757 int ab8500_btemp_get_temp(struct ab8500_btemp *di)
765 if (is_ab8500_3p3_or_earlier(di->parent)) {
766 temp = di->bat_temp * 10;
768 if (di->events.btemp_low) {
769 if (temp > di->btemp_ranges.btemp_low_limit)
770 temp = di->btemp_ranges.btemp_low_limit * 10;
772 temp = di->bat_temp * 10;
773 } else if (di->events.btemp_high) {
774 if (temp < di->btemp_ranges.btemp_high_limit)
775 temp = di->btemp_ranges.btemp_high_limit * 10;
777 temp = di->bat_temp * 10;
778 } else if (di->events.btemp_lowmed) {
779 if (temp > di->btemp_ranges.btemp_med_limit)
780 temp = di->btemp_ranges.btemp_med_limit * 10;
782 temp = di->bat_temp * 10;
783 } else if (di->events.btemp_medhigh) {
784 if (temp < di->btemp_ranges.btemp_med_limit)
785 temp = di->btemp_ranges.btemp_med_limit * 10;
787 temp = di->bat_temp * 10;
789 temp = di->bat_temp * 10;
825 struct ab8500_btemp *di = power_supply_get_drvdata(psy);
830 if (di->events.batt_rem)
836 val->intval = di->bm->bat_type[di->bm->batt_id].name;
839 val->intval = ab8500_btemp_get_temp(di);
852 struct ab8500_btemp *di;
857 di = power_supply_get_drvdata(psy);
880 if (!ret.intval && di->events.ac_conn) {
881 di->events.ac_conn = false;
884 else if (ret.intval && !di->events.ac_conn) {
885 di->events.ac_conn = true;
886 if (!di->events.usb_conn)
887 ab8500_btemp_periodic(di, true);
892 if (!ret.intval && di->events.usb_conn) {
893 di->events.usb_conn = false;
896 else if (ret.intval && !di->events.usb_conn) {
897 di->events.usb_conn = true;
898 if (!di->events.ac_conn)
899 ab8500_btemp_periodic(di, true);
940 struct ab8500_btemp *di = platform_get_drvdata(pdev);
942 ab8500_btemp_periodic(di, true);
950 struct ab8500_btemp *di = platform_get_drvdata(pdev);
952 ab8500_btemp_periodic(di, false);
963 struct ab8500_btemp *di = platform_get_drvdata(pdev);
969 free_irq(irq, di);
973 destroy_workqueue(di->btemp_wq);
976 power_supply_unregister(di->btemp_psy);
1000 struct ab8500_btemp *di;
1004 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL);
1005 if (!di) {
1014 di->bm = plat;
1017 ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm);
1025 di->dev = &pdev->dev;
1026 di->parent = dev_get_drvdata(pdev->dev.parent);
1029 di->btemp_ball = devm_iio_channel_get(&pdev->dev, "btemp_ball");
1030 if (IS_ERR(di->btemp_ball)) {
1031 if (PTR_ERR(di->btemp_ball) == -ENODEV)
1034 return PTR_ERR(di->btemp_ball);
1036 di->bat_ctrl = devm_iio_channel_get(&pdev->dev, "bat_ctrl");
1037 if (IS_ERR(di->bat_ctrl)) {
1038 if (PTR_ERR(di->bat_ctrl) == -ENODEV)
1041 return PTR_ERR(di->bat_ctrl);
1044 di->initialized = false;
1048 psy_cfg.drv_data = di;
1051 di->btemp_wq =
1053 if (di->btemp_wq == NULL) {
1054 dev_err(di->dev, "failed to create work queue\n");
1059 INIT_DEFERRABLE_WORK(&di->btemp_periodic_work,
1063 di->btemp_ranges.btemp_low_limit = BTEMP_THERMAL_LOW_LIMIT;
1064 di->btemp_ranges.btemp_med_limit = BTEMP_THERMAL_MED_LIMIT;
1066 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER,
1069 dev_err(di->dev, "%s ab8500 read failed\n", __func__);
1075 di->btemp_ranges.btemp_high_limit =
1079 di->btemp_ranges.btemp_high_limit =
1083 di->btemp_ranges.btemp_high_limit =
1089 di->btemp_psy = power_supply_register(di->dev, &ab8500_btemp_desc,
1091 if (IS_ERR(di->btemp_psy)) {
1092 dev_err(di->dev, "failed to register BTEMP psy\n");
1093 ret = PTR_ERR(di->btemp_psy);
1107 ab8500_btemp_irq[i].name, di);
1110 dev_err(di->dev, "failed to request %s IRQ %d: %d\n"
1114 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
1118 platform_set_drvdata(pdev, di);
1121 ab8500_btemp_periodic(di, true);
1122 list_add_tail(&di->node, &ab8500_btemp_list);
1130 free_irq(irq, di);
1133 power_supply_unregister(di->btemp_psy);
1135 destroy_workqueue(di->btemp_wq);