hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/drivers/power/supply/ab8500_btemp.c
....@@ -1,9 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) ST-Ericsson SA 2012
34 *
45 * Battery temperature driver for AB8500
56 *
6
- * License Terms: GNU General Public License v2
77 * Author:
88 * Johan Palsson <johan.palsson@stericsson.com>
99 * Karl Komierowski <karl.komierowski@stericsson.com>
....@@ -26,7 +26,7 @@
2626 #include <linux/mfd/abx500.h>
2727 #include <linux/mfd/abx500/ab8500.h>
2828 #include <linux/mfd/abx500/ab8500-bm.h>
29
-#include <linux/mfd/abx500/ab8500-gpadc.h>
29
+#include <linux/iio/consumer.h>
3030
3131 #define VTVOUT_V 1800
3232
....@@ -79,7 +79,8 @@
7979 * @bat_temp: Dispatched battery temperature in degree Celsius
8080 * @prev_bat_temp Last measured battery temperature in degree Celsius
8181 * @parent: Pointer to the struct ab8500
82
- * @gpadc: Pointer to the struct gpadc
82
+ * @adc_btemp_ball: ADC channel for the battery ball temperature
83
+ * @adc_bat_ctrl: ADC channel for the battery control
8384 * @fg: Pointer to the struct fg
8485 * @bm: Platform specific battery management information
8586 * @btemp_psy: Structure for BTEMP specific battery properties
....@@ -96,7 +97,8 @@
9697 int bat_temp;
9798 int prev_bat_temp;
9899 struct ab8500 *parent;
99
- struct ab8500_gpadc *gpadc;
100
+ struct iio_channel *btemp_ball;
101
+ struct iio_channel *bat_ctrl;
100102 struct ab8500_fg *fg;
101103 struct abx500_bm_data *bm;
102104 struct power_supply *btemp_psy;
....@@ -177,13 +179,13 @@
177179 */
178180 static int ab8500_btemp_read_batctrl_voltage(struct ab8500_btemp *di)
179181 {
180
- int vbtemp;
182
+ int vbtemp, ret;
181183 static int prev;
182184
183
- vbtemp = ab8500_gpadc_convert(di->gpadc, BAT_CTRL);
184
- if (vbtemp < 0) {
185
+ ret = iio_read_channel_processed(di->bat_ctrl, &vbtemp);
186
+ if (ret < 0) {
185187 dev_err(di->dev,
186
- "%s gpadc conversion failed, using previous value",
188
+ "%s ADC conversion failed, using previous value",
187189 __func__);
188190 return prev;
189191 }
....@@ -455,7 +457,7 @@
455457 */
456458 static int ab8500_btemp_measure_temp(struct ab8500_btemp *di)
457459 {
458
- int temp;
460
+ int temp, ret;
459461 static int prev;
460462 int rbat, rntc, vntc;
461463 u8 id;
....@@ -480,10 +482,10 @@
480482 di->bm->bat_type[id].r_to_t_tbl,
481483 di->bm->bat_type[id].n_temp_tbl_elements, rbat);
482484 } else {
483
- vntc = ab8500_gpadc_convert(di->gpadc, BTEMP_BALL);
484
- if (vntc < 0) {
485
+ ret = iio_read_channel_processed(di->btemp_ball, &vntc);
486
+ if (ret < 0) {
485487 dev_err(di->dev,
486
- "%s gpadc conversion failed,"
488
+ "%s ADC conversion failed,"
487489 " using previous value\n", __func__);
488490 return prev;
489491 }
....@@ -919,10 +921,8 @@
919921 */
920922 static void ab8500_btemp_external_power_changed(struct power_supply *psy)
921923 {
922
- struct ab8500_btemp *di = power_supply_get_drvdata(psy);
923
-
924
- class_for_each_device(power_supply_class, NULL,
925
- di->btemp_psy, ab8500_btemp_get_ext_psy_data);
924
+ class_for_each_device(power_supply_class, NULL, psy,
925
+ ab8500_btemp_get_ext_psy_data);
926926 }
927927
928928 /* ab8500 btemp driver interrupts and their respective isr */
....@@ -1024,7 +1024,22 @@
10241024 /* get parent data */
10251025 di->dev = &pdev->dev;
10261026 di->parent = dev_get_drvdata(pdev->dev.parent);
1027
- di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
1027
+
1028
+ /* Get ADC channels */
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)
1032
+ return -EPROBE_DEFER;
1033
+ dev_err(&pdev->dev, "failed to get BTEMP BALL ADC channel\n");
1034
+ return PTR_ERR(di->btemp_ball);
1035
+ }
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)
1039
+ return -EPROBE_DEFER;
1040
+ dev_err(&pdev->dev, "failed to get BAT CTRL ADC channel\n");
1041
+ return PTR_ERR(di->bat_ctrl);
1042
+ }
10281043
10291044 di->initialized = false;
10301045
....@@ -1082,6 +1097,11 @@
10821097 /* Register interrupts */
10831098 for (i = 0; i < ARRAY_SIZE(ab8500_btemp_irq); i++) {
10841099 irq = platform_get_irq_byname(pdev, ab8500_btemp_irq[i].name);
1100
+ if (irq < 0) {
1101
+ ret = irq;
1102
+ goto free_irq;
1103
+ }
1104
+
10851105 ret = request_threaded_irq(irq, NULL, ab8500_btemp_irq[i].isr,
10861106 IRQF_SHARED | IRQF_NO_SUSPEND,
10871107 ab8500_btemp_irq[i].name, di);
....@@ -1104,13 +1124,13 @@
11041124 return ret;
11051125
11061126 free_irq:
1107
- power_supply_unregister(di->btemp_psy);
1108
-
11091127 /* We also have to free all successfully registered irqs */
11101128 for (i = i - 1; i >= 0; i--) {
11111129 irq = platform_get_irq_byname(pdev, ab8500_btemp_irq[i].name);
11121130 free_irq(irq, di);
11131131 }
1132
+
1133
+ power_supply_unregister(di->btemp_psy);
11141134 free_btemp_wq:
11151135 destroy_workqueue(di->btemp_wq);
11161136 return ret;