Lines Matching +full:resistance +full:- +full:temp +full:- +full:table

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2012
28 #include <linux/mfd/abx500/ab8500-bm.h>
33 #define BTEMP_THERMAL_LOW_LIMIT -10
49 * struct ab8500_btemp_interrupts - ab8500 interrupts
75 * struct ab8500_btemp - ab8500 BTEMP device information
123 * ab8500_btemp_get() - returns a reference to the primary AB8500 BTEMP
133 * ab8500_btemp_batctrl_volt_to_res() - convert batctrl voltage to resistance
138 * This function returns the battery resistance that is
147 if (is_ab8500_1p1_or_earlier(di->parent)) { in ab8500_btemp_batctrl_volt_to_res()
152 return (450000 * (v_batctrl)) / (1800 - v_batctrl); in ab8500_btemp_batctrl_volt_to_res()
155 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL) { in ab8500_btemp_batctrl_volt_to_res()
158 * source to calculate the resistance. in ab8500_btemp_batctrl_volt_to_res()
161 - di->bm->gnd_lift_resistance * inst_curr) in ab8500_btemp_batctrl_volt_to_res()
162 / di->curr_source; in ab8500_btemp_batctrl_volt_to_res()
168 rbs = (80000 * (v_batctrl)) / (1800 - v_batctrl); in ab8500_btemp_batctrl_volt_to_res()
175 * ab8500_btemp_read_batctrl_voltage() - measure batctrl voltage
185 ret = iio_read_channel_processed(di->bat_ctrl, &vbtemp); in ab8500_btemp_read_batctrl_voltage()
187 dev_err(di->dev, in ab8500_btemp_read_batctrl_voltage()
197 * ab8500_btemp_curr_source_enable() - enable/disable batctrl current source
213 if (is_ab8500_1p1_or_earlier(di->parent)) in ab8500_btemp_curr_source_enable()
217 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && enable) { in ab8500_btemp_curr_source_enable()
219 if (di->curr_source == BTEMP_BATCTRL_CURR_SRC_7UA) in ab8500_btemp_curr_source_enable()
224 dev_dbg(di->dev, "Set BATCTRL %duA\n", di->curr_source); in ab8500_btemp_curr_source_enable()
226 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_btemp_curr_source_enable()
230 dev_err(di->dev, "%s failed setting cmp_force\n", in ab8500_btemp_curr_source_enable()
242 ret = abx500_set_register_interruptible(di->dev, in ab8500_btemp_curr_source_enable()
246 dev_err(di->dev, "%s failed enabling current source\n", in ab8500_btemp_curr_source_enable()
250 } else if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && !enable) { in ab8500_btemp_curr_source_enable()
251 dev_dbg(di->dev, "Disable BATCTRL curr source\n"); in ab8500_btemp_curr_source_enable()
255 di->dev, in ab8500_btemp_curr_source_enable()
261 dev_err(di->dev, "%s failed disabling current source\n", in ab8500_btemp_curr_source_enable()
266 /* Enable Pull-Up and comparator */ in ab8500_btemp_curr_source_enable()
267 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_btemp_curr_source_enable()
272 dev_err(di->dev, "%s failed enabling PU and comp\n", in ab8500_btemp_curr_source_enable()
285 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_btemp_curr_source_enable()
289 dev_err(di->dev, "%s failed disabling force comp\n", in ab8500_btemp_curr_source_enable()
302 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_btemp_curr_source_enable()
308 dev_err(di->dev, "%s failed disabling current source\n", in ab8500_btemp_curr_source_enable()
313 /* Enable Pull-Up and comparator */ in ab8500_btemp_curr_source_enable()
314 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_btemp_curr_source_enable()
319 dev_err(di->dev, "%s failed enabling PU and comp\n", in ab8500_btemp_curr_source_enable()
333 ret = abx500_mask_and_set_register_interruptible(di->dev, in ab8500_btemp_curr_source_enable()
337 dev_err(di->dev, "%s failed disabling force comp\n", in ab8500_btemp_curr_source_enable()
346 * ab8500_btemp_get_batctrl_res() - get battery resistance
349 * This function returns the battery pack identification resistance.
366 dev_err(di->dev, "%s curr source enabled failed\n", __func__); in ab8500_btemp_get_batctrl_res()
370 if (!di->fg) in ab8500_btemp_get_batctrl_res()
371 di->fg = ab8500_fg_get(); in ab8500_btemp_get_batctrl_res()
372 if (!di->fg) { in ab8500_btemp_get_batctrl_res()
373 dev_err(di->dev, "No fg found\n"); in ab8500_btemp_get_batctrl_res()
374 return -EINVAL; in ab8500_btemp_get_batctrl_res()
377 ret = ab8500_fg_inst_curr_start(di->fg); in ab8500_btemp_get_batctrl_res()
380 dev_err(di->dev, "Failed to start current measurement\n"); in ab8500_btemp_get_batctrl_res()
386 } while (!ab8500_fg_inst_curr_started(di->fg)); in ab8500_btemp_get_batctrl_res()
394 } while (!ab8500_fg_inst_curr_done(di->fg)); in ab8500_btemp_get_batctrl_res()
397 ret = ab8500_fg_inst_curr_finalize(di->fg, &inst_curr); in ab8500_btemp_get_batctrl_res()
399 dev_err(di->dev, "Failed to finalize current measurement\n"); in ab8500_btemp_get_batctrl_res()
407 dev_err(di->dev, "%s curr source disable failed\n", __func__); in ab8500_btemp_get_batctrl_res()
411 dev_dbg(di->dev, "%s batctrl: %d res: %d inst_curr: %d samples: %d\n", in ab8500_btemp_get_batctrl_res()
418 * ab8500_btemp_res_to_temp() - resistance to temperature
420 * @tbl: pointer to the resiatance to temperature table
421 * @tbl_size: size of the resistance to temperature table
422 * @res: resistance to calculate the temperature from
425 * based on the NTC resistance.
434 * the resistance table limits, extrapolate in ab8500_btemp_res_to_temp()
435 * if resistance is outside the limits. in ab8500_btemp_res_to_temp()
439 else if (res <= tbl[tbl_size - 1].resist) in ab8500_btemp_res_to_temp()
440 i = tbl_size - 2; in ab8500_btemp_res_to_temp()
448 return tbl[i].temp + ((tbl[i + 1].temp - tbl[i].temp) * in ab8500_btemp_res_to_temp()
449 (res - tbl[i].resist)) / (tbl[i + 1].resist - tbl[i].resist); in ab8500_btemp_res_to_temp()
453 * ab8500_btemp_measure_temp() - measure battery temperature
460 int temp, ret; in ab8500_btemp_measure_temp() local
465 id = di->bm->batt_id; in ab8500_btemp_measure_temp()
467 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && in ab8500_btemp_measure_temp()
472 dev_err(di->dev, "%s get batctrl res failed\n", in ab8500_btemp_measure_temp()
475 * Return out-of-range temperature so that in ab8500_btemp_measure_temp()
481 temp = ab8500_btemp_res_to_temp(di, in ab8500_btemp_measure_temp()
482 di->bm->bat_type[id].r_to_t_tbl, in ab8500_btemp_measure_temp()
483 di->bm->bat_type[id].n_temp_tbl_elements, rbat); in ab8500_btemp_measure_temp()
485 ret = iio_read_channel_processed(di->btemp_ball, &vntc); in ab8500_btemp_measure_temp()
487 dev_err(di->dev, in ab8500_btemp_measure_temp()
496 rntc = 230000 * vntc / (VTVOUT_V - vntc); in ab8500_btemp_measure_temp()
498 temp = ab8500_btemp_res_to_temp(di, in ab8500_btemp_measure_temp()
499 di->bm->bat_type[id].r_to_t_tbl, in ab8500_btemp_measure_temp()
500 di->bm->bat_type[id].n_temp_tbl_elements, rntc); in ab8500_btemp_measure_temp()
501 prev = temp; in ab8500_btemp_measure_temp()
503 dev_dbg(di->dev, "Battery temperature is %d\n", temp); in ab8500_btemp_measure_temp()
504 return temp; in ab8500_btemp_measure_temp()
508 * ab8500_btemp_id() - Identify the connected battery
520 di->curr_source = BTEMP_BATCTRL_CURR_SRC_7UA; in ab8500_btemp_id()
521 di->bm->batt_id = BATTERY_UNKNOWN; in ab8500_btemp_id()
525 dev_err(di->dev, "%s get batctrl res failed\n", __func__); in ab8500_btemp_id()
526 return -ENXIO; in ab8500_btemp_id()
530 for (i = BATTERY_UNKNOWN + 1; i < di->bm->n_btypes; i++) { in ab8500_btemp_id()
531 if ((res <= di->bm->bat_type[i].resis_high) && in ab8500_btemp_id()
532 (res >= di->bm->bat_type[i].resis_low)) { in ab8500_btemp_id()
533 dev_dbg(di->dev, "Battery detected on %s" in ab8500_btemp_id()
536 di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL ? in ab8500_btemp_id()
538 di->bm->bat_type[i].resis_low, res, in ab8500_btemp_id()
539 di->bm->bat_type[i].resis_high, i); in ab8500_btemp_id()
541 di->bm->batt_id = i; in ab8500_btemp_id()
546 if (di->bm->batt_id == BATTERY_UNKNOWN) { in ab8500_btemp_id()
547 dev_warn(di->dev, "Battery identified as unknown" in ab8500_btemp_id()
548 ", resistance %d Ohm\n", res); in ab8500_btemp_id()
549 return -ENXIO; in ab8500_btemp_id()
556 if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && in ab8500_btemp_id()
557 di->bm->batt_id == 1) { in ab8500_btemp_id()
558 dev_dbg(di->dev, "Set BATCTRL current source to 20uA\n"); in ab8500_btemp_id()
559 di->curr_source = BTEMP_BATCTRL_CURR_SRC_20UA; in ab8500_btemp_id()
562 return di->bm->batt_id; in ab8500_btemp_id()
566 * ab8500_btemp_periodic_work() - Measuring the temperature periodically
578 if (!di->initialized) { in ab8500_btemp_periodic_work()
581 dev_warn(di->dev, "failed to identify the battery\n"); in ab8500_btemp_periodic_work()
591 if ((bat_temp == di->prev_bat_temp) || !di->initialized) { in ab8500_btemp_periodic_work()
592 if ((di->bat_temp != di->prev_bat_temp) || !di->initialized) { in ab8500_btemp_periodic_work()
593 di->initialized = true; in ab8500_btemp_periodic_work()
594 di->bat_temp = bat_temp; in ab8500_btemp_periodic_work()
595 power_supply_changed(di->btemp_psy); in ab8500_btemp_periodic_work()
597 } else if (bat_temp < di->prev_bat_temp) { in ab8500_btemp_periodic_work()
598 di->bat_temp--; in ab8500_btemp_periodic_work()
599 power_supply_changed(di->btemp_psy); in ab8500_btemp_periodic_work()
600 } else if (bat_temp > di->prev_bat_temp) { in ab8500_btemp_periodic_work()
601 di->bat_temp++; in ab8500_btemp_periodic_work()
602 power_supply_changed(di->btemp_psy); in ab8500_btemp_periodic_work()
604 di->prev_bat_temp = bat_temp; in ab8500_btemp_periodic_work()
606 if (di->events.ac_conn || di->events.usb_conn) in ab8500_btemp_periodic_work()
607 interval = di->bm->temp_interval_chg; in ab8500_btemp_periodic_work()
609 interval = di->bm->temp_interval_nochg; in ab8500_btemp_periodic_work()
612 queue_delayed_work(di->btemp_wq, in ab8500_btemp_periodic_work()
613 &di->btemp_periodic_work, in ab8500_btemp_periodic_work()
618 * ab8500_btemp_batctrlindb_handler() - battery removal detected
627 dev_err(di->dev, "Battery removal detected!\n"); in ab8500_btemp_batctrlindb_handler()
629 di->events.batt_rem = true; in ab8500_btemp_batctrlindb_handler()
630 power_supply_changed(di->btemp_psy); in ab8500_btemp_batctrlindb_handler()
636 * ab8500_btemp_templow_handler() - battery temp lower than 10 degrees
646 if (is_ab8500_3p3_or_earlier(di->parent)) { in ab8500_btemp_templow_handler()
647 dev_dbg(di->dev, "Ignore false btemp low irq" in ab8500_btemp_templow_handler()
650 dev_crit(di->dev, "Battery temperature lower than -10deg c\n"); in ab8500_btemp_templow_handler()
652 di->events.btemp_low = true; in ab8500_btemp_templow_handler()
653 di->events.btemp_high = false; in ab8500_btemp_templow_handler()
654 di->events.btemp_medhigh = false; in ab8500_btemp_templow_handler()
655 di->events.btemp_lowmed = false; in ab8500_btemp_templow_handler()
656 power_supply_changed(di->btemp_psy); in ab8500_btemp_templow_handler()
663 * ab8500_btemp_temphigh_handler() - battery temp higher than max temp
673 dev_crit(di->dev, "Battery temperature is higher than MAX temp\n"); in ab8500_btemp_temphigh_handler()
675 di->events.btemp_high = true; in ab8500_btemp_temphigh_handler()
676 di->events.btemp_medhigh = false; in ab8500_btemp_temphigh_handler()
677 di->events.btemp_lowmed = false; in ab8500_btemp_temphigh_handler()
678 di->events.btemp_low = false; in ab8500_btemp_temphigh_handler()
679 power_supply_changed(di->btemp_psy); in ab8500_btemp_temphigh_handler()
685 * ab8500_btemp_lowmed_handler() - battery temp between low and medium
695 dev_dbg(di->dev, "Battery temperature is between low and medium\n"); in ab8500_btemp_lowmed_handler()
697 di->events.btemp_lowmed = true; in ab8500_btemp_lowmed_handler()
698 di->events.btemp_medhigh = false; in ab8500_btemp_lowmed_handler()
699 di->events.btemp_high = false; in ab8500_btemp_lowmed_handler()
700 di->events.btemp_low = false; in ab8500_btemp_lowmed_handler()
701 power_supply_changed(di->btemp_psy); in ab8500_btemp_lowmed_handler()
707 * ab8500_btemp_medhigh_handler() - battery temp between medium and high
717 dev_dbg(di->dev, "Battery temperature is between medium and high\n"); in ab8500_btemp_medhigh_handler()
719 di->events.btemp_medhigh = true; in ab8500_btemp_medhigh_handler()
720 di->events.btemp_lowmed = false; in ab8500_btemp_medhigh_handler()
721 di->events.btemp_high = false; in ab8500_btemp_medhigh_handler()
722 di->events.btemp_low = false; in ab8500_btemp_medhigh_handler()
723 power_supply_changed(di->btemp_psy); in ab8500_btemp_medhigh_handler()
729 * ab8500_btemp_periodic() - Periodic temperature measurements
739 dev_dbg(di->dev, "Enable periodic temperature measurements: %d\n", in ab8500_btemp_periodic()
745 cancel_delayed_work_sync(&di->btemp_periodic_work); in ab8500_btemp_periodic()
748 queue_delayed_work(di->btemp_wq, &di->btemp_periodic_work, 0); in ab8500_btemp_periodic()
752 * ab8500_btemp_get_temp() - get battery temperature
759 int temp = 0; in ab8500_btemp_get_temp() local
765 if (is_ab8500_3p3_or_earlier(di->parent)) { in ab8500_btemp_get_temp()
766 temp = di->bat_temp * 10; in ab8500_btemp_get_temp()
768 if (di->events.btemp_low) { in ab8500_btemp_get_temp()
769 if (temp > di->btemp_ranges.btemp_low_limit) in ab8500_btemp_get_temp()
770 temp = di->btemp_ranges.btemp_low_limit * 10; in ab8500_btemp_get_temp()
772 temp = di->bat_temp * 10; in ab8500_btemp_get_temp()
773 } else if (di->events.btemp_high) { in ab8500_btemp_get_temp()
774 if (temp < di->btemp_ranges.btemp_high_limit) in ab8500_btemp_get_temp()
775 temp = di->btemp_ranges.btemp_high_limit * 10; in ab8500_btemp_get_temp()
777 temp = di->bat_temp * 10; in ab8500_btemp_get_temp()
778 } else if (di->events.btemp_lowmed) { in ab8500_btemp_get_temp()
779 if (temp > di->btemp_ranges.btemp_med_limit) in ab8500_btemp_get_temp()
780 temp = di->btemp_ranges.btemp_med_limit * 10; in ab8500_btemp_get_temp()
782 temp = di->bat_temp * 10; in ab8500_btemp_get_temp()
783 } else if (di->events.btemp_medhigh) { in ab8500_btemp_get_temp()
784 if (temp < di->btemp_ranges.btemp_med_limit) in ab8500_btemp_get_temp()
785 temp = di->btemp_ranges.btemp_med_limit * 10; in ab8500_btemp_get_temp()
787 temp = di->bat_temp * 10; in ab8500_btemp_get_temp()
789 temp = di->bat_temp * 10; in ab8500_btemp_get_temp()
791 return temp; in ab8500_btemp_get_temp()
796 * ab8500_btemp_get_batctrl_temp() - get the temperature
803 return btemp->bat_temp * 1000; in ab8500_btemp_get_batctrl_temp()
808 * ab8500_btemp_get_property() - get the btemp properties
818 * temp: battery temperature
830 if (di->events.batt_rem) in ab8500_btemp_get_property()
831 val->intval = 0; in ab8500_btemp_get_property()
833 val->intval = 1; in ab8500_btemp_get_property()
836 val->intval = di->bm->bat_type[di->bm->batt_id].name; in ab8500_btemp_get_property()
839 val->intval = ab8500_btemp_get_temp(di); in ab8500_btemp_get_property()
842 return -EINVAL; in ab8500_btemp_get_property()
851 const char **supplicants = (const char **)ext->supplied_to; in ab8500_btemp_get_ext_psy_data()
863 j = match_string(supplicants, ext->num_supplicants, psy->desc->name); in ab8500_btemp_get_ext_psy_data()
868 for (j = 0; j < ext->desc->num_properties; j++) { in ab8500_btemp_get_ext_psy_data()
870 prop = ext->desc->properties[j]; in ab8500_btemp_get_ext_psy_data()
877 switch (ext->desc->type) { in ab8500_btemp_get_ext_psy_data()
880 if (!ret.intval && di->events.ac_conn) { in ab8500_btemp_get_ext_psy_data()
881 di->events.ac_conn = false; in ab8500_btemp_get_ext_psy_data()
884 else if (ret.intval && !di->events.ac_conn) { in ab8500_btemp_get_ext_psy_data()
885 di->events.ac_conn = true; in ab8500_btemp_get_ext_psy_data()
886 if (!di->events.usb_conn) in ab8500_btemp_get_ext_psy_data()
892 if (!ret.intval && di->events.usb_conn) { in ab8500_btemp_get_ext_psy_data()
893 di->events.usb_conn = false; in ab8500_btemp_get_ext_psy_data()
896 else if (ret.intval && !di->events.usb_conn) { in ab8500_btemp_get_ext_psy_data()
897 di->events.usb_conn = true; in ab8500_btemp_get_ext_psy_data()
898 if (!di->events.ac_conn) in ab8500_btemp_get_ext_psy_data()
914 * ab8500_btemp_external_power_changed() - callback for power supply changes
927 di->btemp_psy, ab8500_btemp_get_ext_psy_data); in ab8500_btemp_external_power_changed()
975 destroy_workqueue(di->btemp_wq); in ab8500_btemp_remove()
978 power_supply_unregister(di->btemp_psy); in ab8500_btemp_remove()
999 struct device_node *np = pdev->dev.of_node; in ab8500_btemp_probe()
1000 struct abx500_bm_data *plat = pdev->dev.platform_data; in ab8500_btemp_probe()
1006 di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); in ab8500_btemp_probe()
1008 dev_err(&pdev->dev, "%s no mem for ab8500_btemp\n", __func__); in ab8500_btemp_probe()
1009 return -ENOMEM; in ab8500_btemp_probe()
1013 dev_err(&pdev->dev, "no battery management data supplied\n"); in ab8500_btemp_probe()
1014 return -EINVAL; in ab8500_btemp_probe()
1016 di->bm = plat; in ab8500_btemp_probe()
1019 ret = ab8500_bm_of_probe(&pdev->dev, np, di->bm); in ab8500_btemp_probe()
1021 dev_err(&pdev->dev, "failed to get battery information\n"); in ab8500_btemp_probe()
1027 di->dev = &pdev->dev; in ab8500_btemp_probe()
1028 di->parent = dev_get_drvdata(pdev->dev.parent); in ab8500_btemp_probe()
1031 di->btemp_ball = devm_iio_channel_get(&pdev->dev, "btemp_ball"); in ab8500_btemp_probe()
1032 if (IS_ERR(di->btemp_ball)) { in ab8500_btemp_probe()
1033 if (PTR_ERR(di->btemp_ball) == -ENODEV) in ab8500_btemp_probe()
1034 return -EPROBE_DEFER; in ab8500_btemp_probe()
1035 dev_err(&pdev->dev, "failed to get BTEMP BALL ADC channel\n"); in ab8500_btemp_probe()
1036 return PTR_ERR(di->btemp_ball); in ab8500_btemp_probe()
1038 di->bat_ctrl = devm_iio_channel_get(&pdev->dev, "bat_ctrl"); in ab8500_btemp_probe()
1039 if (IS_ERR(di->bat_ctrl)) { in ab8500_btemp_probe()
1040 if (PTR_ERR(di->bat_ctrl) == -ENODEV) in ab8500_btemp_probe()
1041 return -EPROBE_DEFER; in ab8500_btemp_probe()
1042 dev_err(&pdev->dev, "failed to get BAT CTRL ADC channel\n"); in ab8500_btemp_probe()
1043 return PTR_ERR(di->bat_ctrl); in ab8500_btemp_probe()
1046 di->initialized = false; in ab8500_btemp_probe()
1053 di->btemp_wq = in ab8500_btemp_probe()
1055 if (di->btemp_wq == NULL) { in ab8500_btemp_probe()
1056 dev_err(di->dev, "failed to create work queue\n"); in ab8500_btemp_probe()
1057 return -ENOMEM; in ab8500_btemp_probe()
1061 INIT_DEFERRABLE_WORK(&di->btemp_periodic_work, in ab8500_btemp_probe()
1065 di->btemp_ranges.btemp_low_limit = BTEMP_THERMAL_LOW_LIMIT; in ab8500_btemp_probe()
1066 di->btemp_ranges.btemp_med_limit = BTEMP_THERMAL_MED_LIMIT; in ab8500_btemp_probe()
1068 ret = abx500_get_register_interruptible(di->dev, AB8500_CHARGER, in ab8500_btemp_probe()
1071 dev_err(di->dev, "%s ab8500 read failed\n", __func__); in ab8500_btemp_probe()
1077 di->btemp_ranges.btemp_high_limit = in ab8500_btemp_probe()
1081 di->btemp_ranges.btemp_high_limit = in ab8500_btemp_probe()
1085 di->btemp_ranges.btemp_high_limit = in ab8500_btemp_probe()
1091 di->btemp_psy = power_supply_register(di->dev, &ab8500_btemp_desc, in ab8500_btemp_probe()
1093 if (IS_ERR(di->btemp_psy)) { in ab8500_btemp_probe()
1094 dev_err(di->dev, "failed to register BTEMP psy\n"); in ab8500_btemp_probe()
1095 ret = PTR_ERR(di->btemp_psy); in ab8500_btemp_probe()
1112 dev_err(di->dev, "failed to request %s IRQ %d: %d\n" in ab8500_btemp_probe()
1116 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n", in ab8500_btemp_probe()
1124 list_add_tail(&di->node, &ab8500_btemp_list); in ab8500_btemp_probe()
1130 for (i = i - 1; i >= 0; i--) { in ab8500_btemp_probe()
1135 power_supply_unregister(di->btemp_psy); in ab8500_btemp_probe()
1137 destroy_workqueue(di->btemp_wq); in ab8500_btemp_probe()
1142 { .compatible = "stericsson,ab8500-btemp", },
1152 .name = "ab8500-btemp",
1172 MODULE_ALIAS("platform:ab8500-btemp");