hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
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;
....@@ -2399,7 +2399,7 @@
23992399 struct ab8500_fg *di = container_of(work, struct ab8500_fg,
24002400 fg_reinit_work.work);
24012401
2402
- if (di->flags.calibrate == false) {
2402
+ if (!di->flags.calibrate) {
24032403 dev_dbg(di->dev, "Resetting FG state machine to init.\n");
24042404 ab8500_fg_clear_cap_samples(di);
24052405 ab8500_fg_calc_cap_discharge_voltage(di, true);
....@@ -2541,8 +2541,10 @@
25412541 ret = kobject_init_and_add(&di->fg_kobject,
25422542 &ab8500_fg_ktype,
25432543 NULL, "battery");
2544
- if (ret < 0)
2544
+ if (ret < 0) {
2545
+ kobject_put(&di->fg_kobject);
25452546 dev_err(di->dev, "failed to create sysfs entry\n");
2547
+ }
25462548
25472549 return ret;
25482550 }
....@@ -2575,11 +2577,12 @@
25752577 const char *buf, size_t count)
25762578 {
25772579 int ret;
2578
- long unsigned reg_value;
2580
+ int reg_value;
25792581 struct power_supply *psy = dev_get_drvdata(dev);
25802582 struct ab8500_fg *di = power_supply_get_drvdata(psy);
25812583
2582
- reg_value = simple_strtoul(buf, NULL, 10);
2584
+ if (kstrtoint(buf, 10, &reg_value))
2585
+ goto fail;
25832586
25842587 if (reg_value > 0x7F) {
25852588 dev_err(dev, "Incorrect parameter, echo 0 (1.98s) - 127 (15.625ms) for flagtime\n");
....@@ -2629,7 +2632,9 @@
26292632 struct power_supply *psy = dev_get_drvdata(dev);
26302633 struct ab8500_fg *di = power_supply_get_drvdata(psy);
26312634
2632
- reg_value = simple_strtoul(buf, NULL, 10);
2635
+ if (kstrtoint(buf, 10, &reg_value))
2636
+ goto fail;
2637
+
26332638 if (reg_value > 0x7F) {
26342639 dev_err(dev, "Incorrect parameter, echo 0 (0.0s) - 127 (1.98s) for maxtime\n");
26352640 goto fail;
....@@ -2677,7 +2682,9 @@
26772682 struct power_supply *psy = dev_get_drvdata(dev);
26782683 struct ab8500_fg *di = power_supply_get_drvdata(psy);
26792684
2680
- reg_value = simple_strtoul(buf, NULL, 10);
2685
+ if (kstrtoint(buf, 10, &reg_value))
2686
+ goto fail;
2687
+
26812688 if (reg_value > 0xF) {
26822689 dev_err(dev, "Incorrect parameter, echo 0 - 15 for number of restart\n");
26832690 goto fail;
....@@ -2770,7 +2777,9 @@
27702777 struct power_supply *psy = dev_get_drvdata(dev);
27712778 struct ab8500_fg *di = power_supply_get_drvdata(psy);
27722779
2773
- reg_value = simple_strtoul(buf, NULL, 10);
2780
+ if (kstrtoint(buf, 10, &reg_value))
2781
+ goto fail;
2782
+
27742783 if (reg_value > 0x1) {
27752784 dev_err(dev, "Incorrect parameter, echo 0/1 to disable/enable Pcut feature\n");
27762785 goto fail;
....@@ -2842,7 +2851,9 @@
28422851 struct power_supply *psy = dev_get_drvdata(dev);
28432852 struct ab8500_fg *di = power_supply_get_drvdata(psy);
28442853
2845
- reg_value = simple_strtoul(buf, NULL, 10);
2854
+ if (kstrtoint(buf, 10, &reg_value))
2855
+ goto fail;
2856
+
28462857 if (reg_value > 0x7) {
28472858 dev_err(dev, "Incorrect parameter, echo 0 to 7 for debounce setting\n");
28482859 goto fail;
....@@ -3057,7 +3068,14 @@
30573068 /* get parent data */
30583069 di->dev = &pdev->dev;
30593070 di->parent = dev_get_drvdata(pdev->dev.parent);
3060
- di->gpadc = ab8500_gpadc_get("ab8500-gpadc.0");
3071
+
3072
+ di->main_bat_v = devm_iio_channel_get(&pdev->dev, "main_bat_v");
3073
+ if (IS_ERR(di->main_bat_v)) {
3074
+ if (PTR_ERR(di->main_bat_v) == -ENODEV)
3075
+ return -EPROBE_DEFER;
3076
+ dev_err(&pdev->dev, "failed to get main battery ADC channel\n");
3077
+ return PTR_ERR(di->main_bat_v);
3078
+ }
30613079
30623080 psy_cfg.supplied_to = supply_interface;
30633081 psy_cfg.num_supplicants = ARRAY_SIZE(supply_interface);
....@@ -3142,6 +3160,11 @@
31423160 /* Register primary interrupt handlers */
31433161 for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq_th); i++) {
31443162 irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
3163
+ if (irq < 0) {
3164
+ ret = irq;
3165
+ goto free_irq_th;
3166
+ }
3167
+
31453168 ret = request_irq(irq, ab8500_fg_irq_th[i].isr,
31463169 IRQF_SHARED | IRQF_NO_SUSPEND,
31473170 ab8500_fg_irq_th[i].name, di);
....@@ -3149,7 +3172,7 @@
31493172 if (ret != 0) {
31503173 dev_err(di->dev, "failed to request %s IRQ %d: %d\n",
31513174 ab8500_fg_irq_th[i].name, irq, ret);
3152
- goto free_irq;
3175
+ goto free_irq_th;
31533176 }
31543177 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
31553178 ab8500_fg_irq_th[i].name, irq, ret);
....@@ -3157,6 +3180,11 @@
31573180
31583181 /* Register threaded interrupt handler */
31593182 irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
3183
+ if (irq < 0) {
3184
+ ret = irq;
3185
+ goto free_irq_th;
3186
+ }
3187
+
31603188 ret = request_threaded_irq(irq, NULL, ab8500_fg_irq_bh[0].isr,
31613189 IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
31623190 ab8500_fg_irq_bh[0].name, di);
....@@ -3164,7 +3192,7 @@
31643192 if (ret != 0) {
31653193 dev_err(di->dev, "failed to request %s IRQ %d: %d\n",
31663194 ab8500_fg_irq_bh[0].name, irq, ret);
3167
- goto free_irq;
3195
+ goto free_irq_th;
31683196 }
31693197 dev_dbg(di->dev, "Requested %s IRQ %d: %d\n",
31703198 ab8500_fg_irq_bh[0].name, irq, ret);
....@@ -3203,15 +3231,17 @@
32033231 return ret;
32043232
32053233 free_irq:
3206
- power_supply_unregister(di->fg_psy);
3207
-
32083234 /* We also have to free all registered irqs */
3209
- for (i = 0; i < ARRAY_SIZE(ab8500_fg_irq_th); i++) {
3235
+ irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
3236
+ free_irq(irq, di);
3237
+free_irq_th:
3238
+ while (--i >= 0) {
3239
+ /* Last assignment of i from primary interrupt handlers */
32103240 irq = platform_get_irq_byname(pdev, ab8500_fg_irq_th[i].name);
32113241 free_irq(irq, di);
32123242 }
3213
- irq = platform_get_irq_byname(pdev, ab8500_fg_irq_bh[0].name);
3214
- free_irq(irq, di);
3243
+
3244
+ power_supply_unregister(di->fg_psy);
32153245 free_inst_curr_wq:
32163246 destroy_workqueue(di->fg_wq);
32173247 return ret;