Lines Matching refs:di
125 * @di: pointer to the ab8500_btemp structure
133 static int ab8500_btemp_batctrl_volt_to_res(struct ab8500_btemp *di,
136 if (is_ab8500_1p1_or_earlier(di->parent)) {
153 * @di: pointer to the ab8500_btemp structure
157 static int ab8500_btemp_read_batctrl_voltage(struct ab8500_btemp *di)
162 ret = iio_read_channel_processed(di->bat_ctrl, &vbtemp);
164 dev_err(di->dev,
175 * @di: pointer to the ab8500_btemp structure
180 static int ab8500_btemp_get_batctrl_res(struct ab8500_btemp *di)
188 if (!di->fg)
189 di->fg = ab8500_fg_get();
190 if (!di->fg) {
191 dev_err(di->dev, "No fg found\n");
195 ret = ab8500_fg_inst_curr_start(di->fg);
198 dev_err(di->dev, "Failed to start current measurement\n");
204 } while (!ab8500_fg_inst_curr_started(di->fg));
209 batctrl += ab8500_btemp_read_batctrl_voltage(di);
212 } while (!ab8500_fg_inst_curr_done(di->fg));
215 ret = ab8500_fg_inst_curr_finalize(di->fg, &inst_curr);
217 dev_err(di->dev, "Failed to finalize current measurement\n");
221 res = ab8500_btemp_batctrl_volt_to_res(di, batctrl, inst_curr);
223 dev_dbg(di->dev, "%s batctrl: %d res: %d inst_curr: %d samples: %d\n",
231 * @di: pointer to the ab8500_btemp structure
237 static int ab8500_btemp_id(struct ab8500_btemp *di)
239 struct power_supply_battery_info *bi = di->bm->bi;
242 di->curr_source = BTEMP_BATCTRL_CURR_SRC_7UA;
244 res = ab8500_btemp_get_batctrl_res(di);
246 dev_err(di->dev, "%s get batctrl res failed\n", __func__);
251 dev_info(di->dev, "Battery detected on BATCTRL (pin C3)"
256 dev_warn(di->dev, "Battery identified as unknown"
274 struct ab8500_btemp *di = container_of(work,
280 if (!di->initialized) {
282 if (ab8500_btemp_id(di) < 0)
283 dev_warn(di->dev, "failed to identify the battery\n");
287 ret = thermal_zone_get_temp(di->tz, &bat_temp);
289 dev_err(di->dev, "error reading temperature\n");
303 if ((bat_temp == di->prev_bat_temp) || !di->initialized) {
304 if ((di->bat_temp != di->prev_bat_temp) || !di->initialized) {
305 di->initialized = true;
306 di->bat_temp = bat_temp;
307 power_supply_changed(di->btemp_psy);
309 } else if (bat_temp < di->prev_bat_temp) {
310 di->bat_temp--;
311 power_supply_changed(di->btemp_psy);
312 } else if (bat_temp > di->prev_bat_temp) {
313 di->bat_temp++;
314 power_supply_changed(di->btemp_psy);
316 di->prev_bat_temp = bat_temp;
318 if (di->events.ac_conn || di->events.usb_conn)
319 interval = di->bm->temp_interval_chg;
321 interval = di->bm->temp_interval_nochg;
324 queue_delayed_work(di->btemp_wq,
325 &di->btemp_periodic_work,
338 struct ab8500_btemp *di = _di;
339 dev_err(di->dev, "Battery removal detected!\n");
341 di->events.batt_rem = true;
342 power_supply_changed(di->btemp_psy);
356 struct ab8500_btemp *di = _di;
358 if (is_ab8500_3p3_or_earlier(di->parent)) {
359 dev_dbg(di->dev, "Ignore false btemp low irq"
362 dev_crit(di->dev, "Battery temperature lower than -10deg c\n");
364 di->events.btemp_low = true;
365 di->events.btemp_high = false;
366 di->events.btemp_medhigh = false;
367 di->events.btemp_lowmed = false;
368 power_supply_changed(di->btemp_psy);
383 struct ab8500_btemp *di = _di;
385 dev_crit(di->dev, "Battery temperature is higher than MAX temp\n");
387 di->events.btemp_high = true;
388 di->events.btemp_medhigh = false;
389 di->events.btemp_lowmed = false;
390 di->events.btemp_low = false;
391 power_supply_changed(di->btemp_psy);
405 struct ab8500_btemp *di = _di;
407 dev_dbg(di->dev, "Battery temperature is between low and medium\n");
409 di->events.btemp_lowmed = true;
410 di->events.btemp_medhigh = false;
411 di->events.btemp_high = false;
412 di->events.btemp_low = false;
413 power_supply_changed(di->btemp_psy);
427 struct ab8500_btemp *di = _di;
429 dev_dbg(di->dev, "Battery temperature is between medium and high\n");
431 di->events.btemp_medhigh = true;
432 di->events.btemp_lowmed = false;
433 di->events.btemp_high = false;
434 di->events.btemp_low = false;
435 power_supply_changed(di->btemp_psy);
442 * @di: pointer to the ab8500_btemp structure
448 static void ab8500_btemp_periodic(struct ab8500_btemp *di,
451 dev_dbg(di->dev, "Enable periodic temperature measurements: %d\n",
457 cancel_delayed_work_sync(&di->btemp_periodic_work);
460 queue_delayed_work(di->btemp_wq, &di->btemp_periodic_work, 0);
465 * @di: pointer to the ab8500_btemp structure
469 static int ab8500_btemp_get_temp(struct ab8500_btemp *di)
477 if (is_ab8500_3p3_or_earlier(di->parent)) {
478 temp = di->bat_temp * 10;
480 if (di->events.btemp_low) {
481 if (temp > di->btemp_ranges.btemp_low_limit)
482 temp = di->btemp_ranges.btemp_low_limit * 10;
484 temp = di->bat_temp * 10;
485 } else if (di->events.btemp_high) {
486 if (temp < di->btemp_ranges.btemp_high_limit)
487 temp = di->btemp_ranges.btemp_high_limit * 10;
489 temp = di->bat_temp * 10;
490 } else if (di->events.btemp_lowmed) {
491 if (temp > di->btemp_ranges.btemp_med_limit)
492 temp = di->btemp_ranges.btemp_med_limit * 10;
494 temp = di->bat_temp * 10;
495 } else if (di->events.btemp_medhigh) {
496 if (temp < di->btemp_ranges.btemp_med_limit)
497 temp = di->btemp_ranges.btemp_med_limit * 10;
499 temp = di->bat_temp * 10;
501 temp = di->bat_temp * 10;
524 struct ab8500_btemp *di = power_supply_get_drvdata(psy);
529 if (di->events.batt_rem)
535 val->intval = ab8500_btemp_get_temp(di);
548 struct ab8500_btemp *di;
553 di = power_supply_get_drvdata(psy);
576 if (!ret.intval && di->events.ac_conn) {
577 di->events.ac_conn = false;
580 else if (ret.intval && !di->events.ac_conn) {
581 di->events.ac_conn = true;
582 if (!di->events.usb_conn)
583 ab8500_btemp_periodic(di, true);
588 if (!ret.intval && di->events.usb_conn) {
589 di->events.usb_conn = false;
592 else if (ret.intval && !di->events.usb_conn) {
593 di->events.usb_conn = true;
594 if (!di->events.ac_conn)
595 ab8500_btemp_periodic(di, true);
635 struct ab8500_btemp *di = dev_get_drvdata(dev);
637 ab8500_btemp_periodic(di, true);
644 struct ab8500_btemp *di = dev_get_drvdata(dev);
646 ab8500_btemp_periodic(di, false);
668 struct ab8500_btemp *di = dev_get_drvdata(dev);
671 di->btemp_wq =
673 if (di->btemp_wq == NULL) {
679 ab8500_btemp_periodic(di, true);
687 struct ab8500_btemp *di = dev_get_drvdata(dev);
690 destroy_workqueue(di->btemp_wq);
702 struct ab8500_btemp *di;
706 di = devm_kzalloc(dev, sizeof(*di), GFP_KERNEL);
707 if (!di)
710 di->bm = &ab8500_bm_data;
713 di->dev = dev;
714 di->parent = dev_get_drvdata(pdev->dev.parent);
717 di->tz = thermal_zone_get_zone_by_name("battery-thermal");
718 if (IS_ERR(di->tz)) {
719 ret = PTR_ERR(di->tz);
729 di->bat_ctrl = devm_iio_channel_get(dev, "bat_ctrl");
730 if (IS_ERR(di->bat_ctrl)) {
731 ret = dev_err_probe(dev, PTR_ERR(di->bat_ctrl),
736 di->initialized = false;
740 psy_cfg.drv_data = di;
743 INIT_DEFERRABLE_WORK(&di->btemp_periodic_work,
747 di->btemp_ranges.btemp_low_limit = BTEMP_THERMAL_LOW_LIMIT;
748 di->btemp_ranges.btemp_med_limit = BTEMP_THERMAL_MED_LIMIT;
759 di->btemp_ranges.btemp_high_limit =
763 di->btemp_ranges.btemp_high_limit =
767 di->btemp_ranges.btemp_high_limit =
773 di->btemp_psy = devm_power_supply_register(dev, &ab8500_btemp_desc,
775 if (IS_ERR(di->btemp_psy)) {
777 return PTR_ERR(di->btemp_psy);
789 ab8500_btemp_irq[i].name, di);
800 platform_set_drvdata(pdev, di);
802 list_add_tail(&di->node, &ab8500_btemp_list);