hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/drivers/power/supply/ab8500_fg.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) ST-Ericsson AB 2012
34 *
....@@ -8,7 +9,6 @@
89 * battery management is not used and the supported code is available in this
910 * driver.
1011 *
11
- * License Terms: GNU General Public License v2
1212 * Author:
1313 * Johan Palsson <johan.palsson@stericsson.com>
1414 * Karl Komierowski <karl.komierowski@stericsson.com>
....@@ -32,7 +32,7 @@
3232 #include <linux/mfd/abx500.h>
3333 #include <linux/mfd/abx500/ab8500.h>
3434 #include <linux/mfd/abx500/ab8500-bm.h>
35
-#include <linux/mfd/abx500/ab8500-gpadc.h>
35
+#include <linux/iio/consumer.h>
3636 #include <linux/kernel.h>
3737
3838 #define MILLI_TO_MICRO 1000
....@@ -182,7 +182,7 @@
182182 * @bat_cap: Structure for battery capacity specific parameters
183183 * @avg_cap: Average capacity filter
184184 * @parent: Pointer to the struct ab8500
185
- * @gpadc: Pointer to the struct gpadc
185
+ * @main_bat_v: ADC channel for the main battery voltage
186186 * @bm: Platform specific battery management information
187187 * @fg_psy: Structure that holds the FG specific battery properties
188188 * @fg_wq: Work queue for running the FG algorithm
....@@ -224,7 +224,7 @@
224224 struct ab8500_fg_battery_capacity bat_cap;
225225 struct ab8500_fg_avg_cap avg_cap;
226226 struct ab8500 *parent;
227
- struct ab8500_gpadc *gpadc;
227
+ struct iio_channel *main_bat_v;
228228 struct abx500_bm_data *bm;
229229 struct power_supply *fg_psy;
230230 struct workqueue_struct *fg_wq;
....@@ -653,7 +653,7 @@
653653
654654 /*
655655 * negative value for Discharging
656
- * convert 2's compliment into decimal
656
+ * convert 2's complement into decimal
657657 */
658658 if (high & 0x10)
659659 val = (low | (high << 8) | 0xFFFFE000);
....@@ -781,7 +781,7 @@
781781 if (ret < 0)
782782 goto exit;
783783
784
- /* Check for sign bit in case of negative value, 2's compliment */
784
+ /* Check for sign bit in case of negative value, 2's complement */
785785 if (high & 0x10)
786786 val = (low | (med << 8) | (high << 16) | 0xFFE00000);
787787 else
....@@ -829,13 +829,13 @@
829829 */
830830 static int ab8500_fg_bat_voltage(struct ab8500_fg *di)
831831 {
832
- int vbat;
832
+ int vbat, ret;
833833 static int prev;
834834
835
- vbat = ab8500_gpadc_convert(di->gpadc, MAIN_BAT_V);
836
- if (vbat < 0) {
835
+ ret = iio_read_channel_processed(di->main_bat_v, &vbat);
836
+ if (ret < 0) {
837837 dev_err(di->dev,
838
- "%s gpadc conversion failed, using previous value\n",
838
+ "%s ADC conversion failed, using previous value\n",
839839 __func__);
840840 return prev;
841841 }
....@@ -1542,7 +1542,7 @@
15421542 ab8500_fg_discharge_state_to(di,
15431543 AB8500_FG_DISCHARGE_INITMEASURING);
15441544
1545
- /* Intentional fallthrough */
1545
+ fallthrough;
15461546 case AB8500_FG_DISCHARGE_INITMEASURING:
15471547 /*
15481548 * Discard a number of samples during startup.
....@@ -1572,7 +1572,7 @@
15721572 ab8500_fg_discharge_state_to(di,
15731573 AB8500_FG_DISCHARGE_RECOVERY);
15741574
1575
- /* Intentional fallthrough */
1575
+ fallthrough;
15761576
15771577 case AB8500_FG_DISCHARGE_RECOVERY:
15781578 sleep_time = di->bm->fg_params->recovery_sleep_timer;
....@@ -2221,10 +2221,10 @@
22212221 ab8500_fg_update_cap_scalers(di);
22222222 queue_work(di->fg_wq, &di->fg_work);
22232223 break;
2224
- };
2224
+ }
22252225 default:
22262226 break;
2227
- };
2227
+ }
22282228 break;
22292229 case POWER_SUPPLY_PROP_TECHNOLOGY:
22302230 switch (ext->desc->type) {
....@@ -2331,7 +2331,7 @@
23312331 if (ret) {
23322332 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_MAX_TIME_REG\n", __func__);
23332333 goto out;
2334
- };
2334
+ }
23352335
23362336 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
23372337 AB8505_RTC_PCUT_FLAG_TIME_REG, di->bm->fg_params->pcut_flag_time);
....@@ -2339,7 +2339,7 @@
23392339 if (ret) {
23402340 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_FLAG_TIME_REG\n", __func__);
23412341 goto out;
2342
- };
2342
+ }
23432343
23442344 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
23452345 AB8505_RTC_PCUT_RESTART_REG, di->bm->fg_params->pcut_max_restart);
....@@ -2347,7 +2347,7 @@
23472347 if (ret) {
23482348 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_RESTART_REG\n", __func__);
23492349 goto out;
2350
- };
2350
+ }
23512351
23522352 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
23532353 AB8505_RTC_PCUT_DEBOUNCE_REG, di->bm->fg_params->pcut_debounce_time);
....@@ -2355,7 +2355,7 @@
23552355 if (ret) {
23562356 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_DEBOUNCE_REG\n", __func__);
23572357 goto out;
2358
- };
2358
+ }
23592359
23602360 ret = abx500_set_register_interruptible(di->dev, AB8500_RTC,
23612361 AB8505_RTC_PCUT_CTL_STATUS_REG, di->bm->fg_params->pcut_enable);
....@@ -2363,7 +2363,7 @@
23632363 if (ret) {
23642364 dev_err(di->dev, "%s write failed AB8505_RTC_PCUT_CTL_STATUS_REG\n", __func__);
23652365 goto out;
2366
- };
2366
+ }
23672367 }
23682368 out:
23692369 return ret;
....@@ -2380,10 +2380,8 @@
23802380 */
23812381 static void ab8500_fg_external_power_changed(struct power_supply *psy)
23822382 {
2383
- struct ab8500_fg *di = power_supply_get_drvdata(psy);
2384
-
2385
- class_for_each_device(power_supply_class, NULL,
2386
- di->fg_psy, ab8500_fg_get_ext_psy_data);
2383
+ class_for_each_device(power_supply_class, NULL, psy,
2384
+ ab8500_fg_get_ext_psy_data);
23872385 }
23882386
23892387 /**
....@@ -2399,7 +2397,7 @@
23992397 struct ab8500_fg *di = container_of(work, struct ab8500_fg,
24002398 fg_reinit_work.work);
24012399
2402
- if (di->flags.calibrate == false) {
2400
+ if (!di->flags.calibrate) {
24032401 dev_dbg(di->dev, "Resetting FG state machine to init.\n");
24042402 ab8500_fg_clear_cap_samples(di);
24052403 ab8500_fg_calc_cap_discharge_voltage(di, true);
....@@ -2541,8 +2539,10 @@
25412539 ret = kobject_init_and_add(&di->fg_kobject,
25422540 &ab8500_fg_ktype,
25432541 NULL, "battery");
2544
- if (ret < 0)
2542
+ if (ret < 0) {
2543
+ kobject_put(&di->fg_kobject);
25452544 dev_err(di->dev, "failed to create sysfs entry\n");
2545
+ }
25462546
25472547 return ret;
25482548 }
....@@ -2575,11 +2575,12 @@
25752575 const char *buf, size_t count)
25762576 {
25772577 int ret;
2578
- long unsigned reg_value;
2578
+ int reg_value;
25792579 struct power_supply *psy = dev_get_drvdata(dev);
25802580 struct ab8500_fg *di = power_supply_get_drvdata(psy);
25812581
2582
- reg_value = simple_strtoul(buf, NULL, 10);
2582
+ if (kstrtoint(buf, 10, &reg_value))
2583
+ goto fail;
25832584
25842585 if (reg_value > 0x7F) {
25852586 dev_err(dev, "Incorrect parameter, echo 0 (1.98s) - 127 (15.625ms) for flagtime\n");
....@@ -2629,7 +2630,9 @@
26292630 struct power_supply *psy = dev_get_drvdata(dev);
26302631 struct ab8500_fg *di = power_supply_get_drvdata(psy);
26312632
2632
- reg_value = simple_strtoul(buf, NULL, 10);
2633
+ if (kstrtoint(buf, 10, &reg_value))
2634
+ goto fail;
2635
+
26332636 if (reg_value > 0x7F) {
26342637 dev_err(dev, "Incorrect parameter, echo 0 (0.0s) - 127 (1.98s) for maxtime\n");
26352638 goto fail;
....@@ -2677,7 +2680,9 @@
26772680 struct power_supply *psy = dev_get_drvdata(dev);
26782681 struct ab8500_fg *di = power_supply_get_drvdata(psy);
26792682
2680
- reg_value = simple_strtoul(buf, NULL, 10);
2683
+ if (kstrtoint(buf, 10, &reg_value))
2684
+ goto fail;
2685
+
26812686 if (reg_value > 0xF) {
26822687 dev_err(dev, "Incorrect parameter, echo 0 - 15 for number of restart\n");
26832688 goto fail;
....@@ -2770,7 +2775,9 @@
27702775 struct power_supply *psy = dev_get_drvdata(dev);
27712776 struct ab8500_fg *di = power_supply_get_drvdata(psy);
27722777
2773
- reg_value = simple_strtoul(buf, NULL, 10);
2778
+ if (kstrtoint(buf, 10, &reg_value))
2779
+ goto fail;
2780
+
27742781 if (reg_value > 0x1) {
27752782 dev_err(dev, "Incorrect parameter, echo 0/1 to disable/enable Pcut feature\n");
27762783 goto fail;
....@@ -2842,7 +2849,9 @@
28422849 struct power_supply *psy = dev_get_drvdata(dev);
28432850 struct ab8500_fg *di = power_supply_get_drvdata(psy);
28442851
2845
- reg_value = simple_strtoul(buf, NULL, 10);
2852
+ if (kstrtoint(buf, 10, &reg_value))
2853
+ goto fail;
2854
+
28462855 if (reg_value > 0x7) {
28472856 dev_err(dev, "Incorrect parameter, echo 0 to 7 for debounce setting\n");
28482857 goto fail;
....@@ -3057,7 +3066,14 @@
30573066 /* get parent data */
30583067 di->dev = &pdev->dev;
30593068 di->parent = dev_get_drvdata(pdev->dev.parent);
3060
- di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
3069
+
3070
+ di->main_bat_v = devm_iio_channel_get(&pdev->dev, "main_bat_v");
3071
+ if (IS_ERR(di->main_bat_v)) {
3072
+ if (PTR_ERR(di->main_bat_v) == -ENODEV)
3073
+ return -EPROBE_DEFER;
3074
+ dev_err(&pdev->dev, "failed to get main battery ADC channel\n");
3075
+ return PTR_ERR(di->main_bat_v);
3076
+ }
30613077
30623078 psy_cfg.supplied_to = supply_interface;
30633079 psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
....@@ -3142,6 +3158,11 @@
31423158 /* Register primary interrupt handlers */
31433159 for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq_th); i++) {
31443160 irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
3161
+ if (irq < 0) {
3162
+ ret = irq;
3163
+ goto free_irq_th;
3164
+ }
3165
+
31453166 ret = request_irq(irq, ab8500_fg_irq_th[i].isr,
31463167 IRQF_SHARED | IRQF_NO_SUSPEND,
31473168 ab8500_fg_irq_th[i].name, di);
....@@ -3149,7 +3170,7 @@
31493170 if (ret != 0) {
31503171 dev_err(di->dev, "failed to request %s IRQ %d: %d\n",
31513172 ab8500_fg_irq_th[i].name, irq, ret);
3152
- goto free_irq;
3173
+ goto free_irq_th;
31533174 }
31543175 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
31553176 ab8500_fg_irq_th[i].name, irq, ret);
....@@ -3157,6 +3178,11 @@
31573178
31583179 /* Register threaded interrupt handler */
31593180 irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
3181
+ if (irq < 0) {
3182
+ ret = irq;
3183
+ goto free_irq_th;
3184
+ }
3185
+
31603186 ret = request_threaded_irq(irq, NULL, ab8500_fg_irq_bh[0].isr,
31613187 IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
31623188 ab8500_fg_irq_bh[0].name, di);
....@@ -3164,7 +3190,7 @@
31643190 if (ret != 0) {
31653191 dev_err(di->dev, "failed to request %s IRQ %d: %d\n",
31663192 ab8500_fg_irq_bh[0].name, irq, ret);
3167
- goto free_irq;
3193
+ goto free_irq_th;
31683194 }
31693195 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
31703196 ab8500_fg_irq_bh[0].name, irq, ret);
....@@ -3203,15 +3229,17 @@
32033229 return ret;
32043230
32053231 free_irq:
3206
- power_supply_unregister(di->fg_psy);
3207
-
32083232 /* We also have to free all registered irqs */
3209
- for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq_th); i++) {
3233
+ irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
3234
+ free_irq(irq, di);
3235
+free_irq_th:
3236
+ while (--i >= 0) {
3237
+ /* Last assignment of i from primary interrupt handlers */
32103238 irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
32113239 free_irq(irq, di);
32123240 }
3213
- irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
3214
- free_irq(irq, di);
3241
+
3242
+ power_supply_unregister(di->fg_psy);
32153243 free_inst_curr_wq:
32163244 destroy_workqueue(di->fg_wq);
32173245 return ret;