Merge tag 'for-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply

Pull power supply and reset updates from Sebastian Reichel:
"Power-supply core:

- replace power_supply_register_no_ws() with power_supply_register()
and a new "no_wakeup_source" field in struct power_supply_config

- constify battery info tables in the core and all drivers

- switch back to remove callback for all platform drivers

- allow power_supply_put() to be called from atomic context

- mark attribute arrays read-only after init

Power-supply drivers:

- new driver for TWL6030 and TWL6032

- rk817: improve battery capacity calibration

- misc small cleanups and fixes"

* tag 'for-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (42 commits)
power: reset: ep93xx: add AUXILIARY_BUS dependency
dt-bindings: power: reset: Convert mode-.* properties to array
power: supply: sc27xx: Fix battery detect GPIO probe
dt-bindings: power: supply: sc27xx-fg: document deprecated bat-detect-gpio
reset: keystone-reset: remove unused macros
power: supply: axp20x_battery: Use scaled iio_read_channel
power: supply: axp20x_usb_power: Use scaled iio_read_channel
power: supply: generic-adc-battery: change my gmail
power: supply: pmu_battery: Set power supply type to BATTERY
power: Switch back to struct platform_driver::remove()
power: supply: hwmon: move interface to private header
power: supply: rk817: Update battery capacity calibration
power: supply: rk817: stop updating info in suspend
power: supply: rt9471: Use IC status regfield to report real charger status
power: supply: rt9471: Fix wrong WDT function regfield declaration
dt-bindings: power/supply: qcom,pmi8998-charger: Drop incorrect "#interrupt-cells" from example
power: supply: core: mark attribute arrays as ro_after_init
power: supply: core: unexport power_supply_property_is_writeable()
power: supply: core: use device mutex wrappers
power: supply: bq27xxx: Fix registers of bq27426
...

+4
Documentation/devicetree/bindings/power/reset/nvmem-reboot-mode.yaml
··· 31 31 allOf: 32 32 - $ref: reboot-mode.yaml# 33 33 34 + patternProperties: 35 + "^mode-.*$": 36 + maxItems: 1 37 + 34 38 required: 35 39 - compatible 36 40 - nvmem-cells
+7
Documentation/devicetree/bindings/power/reset/qcom,pon.yaml
··· 54 54 - compatible 55 55 - reg 56 56 57 + patternProperties: 58 + "^mode-.*$": 59 + maxItems: 1 60 + 57 61 unevaluatedProperties: false 58 62 59 63 allOf: ··· 79 75 reg-names: 80 76 items: 81 77 - const: pon 78 + else: 79 + patternProperties: 80 + "^mode-.*$": false 82 81 83 82 # Special case for pm8941, which doesn't store reset mode 84 83 - if:
+2 -2
Documentation/devicetree/bindings/power/reset/reboot-mode.yaml
··· 28 28 29 29 properties: 30 30 mode-normal: 31 - $ref: /schemas/types.yaml#/definitions/uint32 31 + $ref: /schemas/types.yaml#/definitions/uint32-array 32 32 description: 33 33 Default value to set on a reboot if no command was provided. 34 34 35 35 patternProperties: 36 36 "^mode-.*$": 37 - $ref: /schemas/types.yaml#/definitions/uint32 37 + $ref: /schemas/types.yaml#/definitions/uint32-array 38 38 39 39 additionalProperties: true 40 40
+4
Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.yaml
··· 32 32 allOf: 33 33 - $ref: reboot-mode.yaml# 34 34 35 + patternProperties: 36 + "^mode-.*$": 37 + maxItems: 1 38 + 35 39 unevaluatedProperties: false 36 40 37 41 required:
+10 -1
Documentation/devicetree/bindings/power/reset/syscon-reboot.yaml
··· 31 31 $ref: /schemas/types.yaml#/definitions/uint32 32 32 description: Offset in the register map for the reboot register (in bytes). 33 33 34 + reg: 35 + maxItems: 1 36 + description: Base address and size for the reboot register. 37 + 34 38 regmap: 35 39 $ref: /schemas/types.yaml#/definitions/phandle 36 40 deprecated: true ··· 49 45 priority: 50 46 default: 192 51 47 48 + oneOf: 49 + - required: 50 + - offset 51 + - required: 52 + - reg 53 + 52 54 required: 53 55 - compatible 54 - - offset 55 56 56 57 additionalProperties: false 57 58
-1
Documentation/devicetree/bindings/power/supply/qcom,pmi8998-charger.yaml
··· 60 60 pmic { 61 61 #address-cells = <1>; 62 62 #size-cells = <0>; 63 - #interrupt-cells = <4>; 64 63 65 64 charger@1000 { 66 65 compatible = "qcom,pmi8998-charger";
+5
Documentation/devicetree/bindings/power/supply/sc27xx-fg.yaml
··· 27 27 battery-detect-gpios: 28 28 maxItems: 1 29 29 30 + bat-detect-gpio: 31 + maxItems: 1 32 + deprecated: true 33 + description: use battery-detect-gpios instead 34 + 30 35 interrupts: 31 36 maxItems: 1 32 37
+48
Documentation/devicetree/bindings/power/supply/ti,twl6030-charger.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/power/supply/ti,twl6030-charger.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: TWL6030/32 BCI (Battery Charger Interface) 8 + 9 + description: 10 + The battery charger needs to be configured to do any charging besides of 11 + precharging. The GPADC in the PMIC has to be used to get the related 12 + voltages. 13 + 14 + maintainers: 15 + - Andreas Kemnade <andreas@kemnade.info> 16 + 17 + allOf: 18 + - $ref: power-supply.yaml# 19 + 20 + properties: 21 + compatible: 22 + oneOf: 23 + - const: ti,twl6030-charger 24 + - items: 25 + - const: ti,twl6032-charger 26 + - const: ti,twl6030-charger 27 + 28 + interrupts: 29 + items: 30 + - description: Charger Control Interrupt 31 + - description: Charger Fault Interrupt 32 + 33 + io-channels: 34 + items: 35 + - description: VBUS Voltage Channel 36 + 37 + io-channel-names: 38 + items: 39 + - const: vusb 40 + 41 + monitored-battery: true 42 + 43 + required: 44 + - compatible 45 + - interrupts 46 + - monitored-battery 47 + 48 + additionalProperties: false
+2 -1
drivers/acpi/battery.c
··· 853 853 struct power_supply_config psy_cfg = { 854 854 .drv_data = battery, 855 855 .attr_grp = acpi_battery_groups, 856 + .no_wakeup_source = true, 856 857 }; 857 858 bool full_cap_broken = false; 858 859 ··· 889 888 battery->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY; 890 889 battery->bat_desc.get_property = acpi_battery_get_property; 891 890 892 - battery->bat = power_supply_register_no_ws(&battery->device->dev, 891 + battery->bat = power_supply_register(&battery->device->dev, 893 892 &battery->bat_desc, &psy_cfg); 894 893 895 894 if (IS_ERR(battery->bat)) {
+1
drivers/power/reset/Kconfig
··· 79 79 bool "Cirrus EP93XX reset driver" if COMPILE_TEST 80 80 depends on MFD_SYSCON 81 81 default ARCH_EP93XX 82 + select AUXILIARY_BUS 82 83 help 83 84 This driver provides restart support for Cirrus EP93XX SoC. 84 85
+1 -1
drivers/power/reset/at91-poweroff.c
··· 223 223 224 224 static struct platform_driver at91_poweroff_driver = { 225 225 .probe = at91_poweroff_probe, 226 - .remove_new = at91_poweroff_remove, 226 + .remove = at91_poweroff_remove, 227 227 .driver = { 228 228 .name = "at91-poweroff", 229 229 .of_match_table = at91_poweroff_of_match,
+1 -1
drivers/power/reset/at91-reset.c
··· 427 427 428 428 static struct platform_driver at91_reset_driver = { 429 429 .probe = at91_reset_probe, 430 - .remove_new = at91_reset_remove, 430 + .remove = at91_reset_remove, 431 431 .driver = { 432 432 .name = "at91-reset", 433 433 .of_match_table = at91_reset_of_match,
+1 -1
drivers/power/reset/at91-sama5d2_shdwc.c
··· 441 441 442 442 static struct platform_driver at91_shdwc_driver = { 443 443 .probe = at91_shdwc_probe, 444 - .remove_new = at91_shdwc_remove, 444 + .remove = at91_shdwc_remove, 445 445 .driver = { 446 446 .name = "at91-shdwc", 447 447 .of_match_table = at91_shdwc_of_match,
-2
drivers/power/reset/keystone-reset.c
··· 16 16 #include <linux/mfd/syscon.h> 17 17 #include <linux/of.h> 18 18 19 - #define RSTYPE_RG 0x0 20 19 #define RSCTRL_RG 0x4 21 20 #define RSCFG_RG 0x8 22 21 #define RSISO_RG 0xc ··· 27 28 #define RSMUX_OMODE_MASK 0xe 28 29 #define RSMUX_OMODE_RESET_ON 0xa 29 30 #define RSMUX_OMODE_RESET_OFF 0x0 30 - #define RSMUX_LOCK_MASK 0x1 31 31 #define RSMUX_LOCK_SET 0x1 32 32 33 33 #define RSCFG_RSTYPE_SOFT 0x300f
+1 -1
drivers/power/reset/ltc2952-poweroff.c
··· 305 305 306 306 static struct platform_driver ltc2952_poweroff_driver = { 307 307 .probe = ltc2952_poweroff_probe, 308 - .remove_new = ltc2952_poweroff_remove, 308 + .remove = ltc2952_poweroff_remove, 309 309 .driver = { 310 310 .name = "ltc2952-poweroff", 311 311 .of_match_table = of_ltc2952_poweroff_match,
+1 -1
drivers/power/reset/qnap-poweroff.c
··· 118 118 119 119 static struct platform_driver qnap_power_off_driver = { 120 120 .probe = qnap_power_off_probe, 121 - .remove_new = qnap_power_off_remove, 121 + .remove = qnap_power_off_remove, 122 122 .driver = { 123 123 .name = "qnap_power_off", 124 124 .of_match_table = of_match_ptr(qnap_power_off_of_match_table),
+2 -1
drivers/power/reset/syscon-reboot.c
··· 61 61 priority = 192; 62 62 63 63 if (of_property_read_u32(pdev->dev.of_node, "offset", &ctx->offset)) 64 - return -EINVAL; 64 + if (of_property_read_u32(pdev->dev.of_node, "reg", &ctx->offset)) 65 + return -EINVAL; 65 66 66 67 value_err = of_property_read_u32(pdev->dev.of_node, "value", &ctx->value); 67 68 mask_err = of_property_read_u32(pdev->dev.of_node, "mask", &ctx->mask);
+2 -2
drivers/power/supply/88pm860x_battery.c
··· 422 422 info->temp_type = PM860X_TEMP_TINT; 423 423 } 424 424 mutex_unlock(&info->lock); 425 - /* clear ccnt since battery is attached or dettached */ 425 + /* clear ccnt since battery is attached or detached */ 426 426 clear_ccnt(info, &ccnt_data); 427 427 return IRQ_HANDLED; 428 428 } ··· 566 566 ret = measure_12bit_voltage(info, PM8607_GPADC1_MEAS1, data); 567 567 if (ret) 568 568 return ret; 569 - /* meausered Vtbat(mV) / Ibias_current(11uA)*/ 569 + /* measured Vtbat(mV) / Ibias_current(11uA)*/ 570 570 *data = (*data * 1000) / GPBIAS2_GPADC1_UA; 571 571 572 572 if (*data > TBAT_NEG_25D) {
+10
drivers/power/supply/Kconfig
··· 493 493 help 494 494 Say Y here to enable support for TWL4030 Battery Charge Interface. 495 495 496 + config CHARGER_TWL6030 497 + tristate "OMAP TWL6030 BCI charger driver" 498 + depends on IIO && TWL4030_CORE 499 + help 500 + Say Y here to enable support for TWL6030/6032 Battery Charge 501 + Interface. 502 + 503 + This driver can be build as a module. If so, the module will be 504 + called twl6030_charger. 505 + 496 506 config CHARGER_LP8727 497 507 tristate "TI/National Semiconductor LP8727 charger driver" 498 508 depends on I2C
+1
drivers/power/supply/Makefile
··· 69 69 obj-$(CONFIG_CHARGER_ISP1704) += isp1704_charger.o 70 70 obj-$(CONFIG_CHARGER_MAX8903) += max8903_charger.o 71 71 obj-$(CONFIG_CHARGER_TWL4030) += twl4030_charger.o 72 + obj-$(CONFIG_CHARGER_TWL6030) += twl6030_charger.o 72 73 obj-$(CONFIG_CHARGER_LP8727) += lp8727_charger.o 73 74 obj-$(CONFIG_CHARGER_LP8788) += lp8788-charger.o 74 75 obj-$(CONFIG_CHARGER_GPIO) += gpio-charger.o
+2 -2
drivers/power/supply/ab8500_bmdata.c
··· 16 16 /* Default: temperature hysteresis */ 17 17 #define AB8500_TEMP_HYSTERESIS 3 18 18 19 - static struct power_supply_battery_ocv_table ocv_cap_tbl[] = { 19 + static const struct power_supply_battery_ocv_table ocv_cap_tbl[] = { 20 20 { .ocv = 4186000, .capacity = 100}, 21 21 { .ocv = 4163000, .capacity = 99}, 22 22 { .ocv = 4114000, .capacity = 95}, ··· 48 48 * temperature values to work. Factory resistance is 300 mOhm and the 49 49 * resistance values to the right are percentages of 300 mOhm. 50 50 */ 51 - static struct power_supply_resistance_temp_table temp_to_batres_tbl_thermistor[] = { 51 + static const struct power_supply_resistance_temp_table temp_to_batres_tbl_thermistor[] = { 52 52 { .temp = 40, .resistance = 40 /* 120 mOhm */ }, 53 53 { .temp = 30, .resistance = 45 /* 135 mOhm */ }, 54 54 { .temp = 20, .resistance = 55 /* 165 mOhm */ },
+2 -2
drivers/power/supply/ab8500_btemp.c
··· 283 283 dev_warn(di->dev, "failed to identify the battery\n"); 284 284 } 285 285 286 - /* Failover if a reading is erroneous, use last meausurement */ 286 + /* Failover if a reading is erroneous, use last measurement */ 287 287 ret = thermal_zone_get_temp(di->tz, &bat_temp); 288 288 if (ret) { 289 289 dev_err(di->dev, "error reading temperature\n"); ··· 818 818 819 819 struct platform_driver ab8500_btemp_driver = { 820 820 .probe = ab8500_btemp_probe, 821 - .remove_new = ab8500_btemp_remove, 821 + .remove = ab8500_btemp_remove, 822 822 .driver = { 823 823 .name = "ab8500-btemp", 824 824 .of_match_table = ab8500_btemp_match,
+1 -1
drivers/power/supply/ab8500_chargalg.c
··· 1837 1837 1838 1838 struct platform_driver ab8500_chargalg_driver = { 1839 1839 .probe = ab8500_chargalg_probe, 1840 - .remove_new = ab8500_chargalg_remove, 1840 + .remove = ab8500_chargalg_remove, 1841 1841 .driver = { 1842 1842 .name = "ab8500_chargalg", 1843 1843 .of_match_table = ab8500_chargalg_match,
+1 -1
drivers/power/supply/ab8500_charger.c
··· 3711 3711 3712 3712 static struct platform_driver ab8500_charger_driver = { 3713 3713 .probe = ab8500_charger_probe, 3714 - .remove_new = ab8500_charger_remove, 3714 + .remove = ab8500_charger_remove, 3715 3715 .driver = { 3716 3716 .name = "ab8500-charger", 3717 3717 .of_match_table = ab8500_charger_match,
+1 -1
drivers/power/supply/ab8500_fg.c
··· 3242 3242 3243 3243 struct platform_driver ab8500_fg_driver = { 3244 3244 .probe = ab8500_fg_probe, 3245 - .remove_new = ab8500_fg_remove, 3245 + .remove = ab8500_fg_remove, 3246 3246 .driver = { 3247 3247 .name = "ab8500-fg", 3248 3248 .of_match_table = ab8500_fg_match,
+5 -4
drivers/power/supply/acer_a500_battery.c
··· 233 233 234 234 psy_cfg.of_node = pdev->dev.parent->of_node; 235 235 psy_cfg.drv_data = bat; 236 + psy_cfg.no_wakeup_source = true; 236 237 237 238 bat->regmap = dev_get_regmap(pdev->dev.parent, "KB930"); 238 239 if (!bat->regmap) 239 240 return -EINVAL; 240 241 241 - bat->psy = devm_power_supply_register_no_ws(&pdev->dev, 242 - &a500_battery_desc, 243 - &psy_cfg); 242 + bat->psy = devm_power_supply_register(&pdev->dev, 243 + &a500_battery_desc, 244 + &psy_cfg); 244 245 if (IS_ERR(bat->psy)) 245 246 return dev_err_probe(&pdev->dev, PTR_ERR(bat->psy), 246 247 "failed to register battery\n"); ··· 286 285 .pm = &a500_battery_pm_ops, 287 286 }, 288 287 .probe = a500_battery_probe, 289 - .remove_new = a500_battery_remove, 288 + .remove = a500_battery_remove, 290 289 }; 291 290 module_platform_driver(a500_battery_driver); 292 291
+1 -1
drivers/power/supply/act8945a_charger.c
··· 651 651 .name = "act8945a-charger", 652 652 }, 653 653 .probe = act8945a_charger_probe, 654 - .remove_new = act8945a_charger_remove, 654 + .remove = act8945a_charger_remove, 655 655 }; 656 656 module_platform_driver(act8945a_charger_driver); 657 657
+1 -1
drivers/power/supply/adp5061.c
··· 590 590 case POWER_SUPPLY_PROP_VOLTAGE_AVG: 591 591 /* 592 592 * This property is used to set the VWEAK threshold 593 - * bellow this value, weak charge mode is entered 593 + * below this value, weak charge mode is entered 594 594 * above this value, fast chargerge mode is entered 595 595 */ 596 596 return adp5061_get_vweak_th(st, val);
+17 -16
drivers/power/supply/axp20x_battery.c
··· 354 354 if (ret) 355 355 return ret; 356 356 357 + /* IIO framework gives mA but Power Supply framework gives uA */ 357 358 if (reg & AXP20X_PWR_STATUS_BAT_CHARGING) { 358 - ret = iio_read_channel_processed(axp20x_batt->batt_chrg_i, &val->intval); 359 + ret = iio_read_channel_processed_scale(axp20x_batt->batt_chrg_i, 360 + &val->intval, 1000); 359 361 } else { 360 - ret = iio_read_channel_processed(axp20x_batt->batt_dischrg_i, &val1); 362 + ret = iio_read_channel_processed_scale(axp20x_batt->batt_dischrg_i, 363 + &val1, 1000); 361 364 val->intval = -val1; 362 365 } 363 366 if (ret) 364 367 return ret; 365 368 366 - /* IIO framework gives mA but Power Supply framework gives uA */ 367 - val->intval *= 1000; 368 369 break; 369 370 370 371 case POWER_SUPPLY_PROP_CAPACITY: ··· 407 406 break; 408 407 409 408 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 410 - ret = iio_read_channel_processed(axp20x_batt->batt_v, 411 - &val->intval); 409 + /* IIO framework gives mV but Power Supply framework gives uV */ 410 + ret = iio_read_channel_processed_scale(axp20x_batt->batt_v, 411 + &val->intval, 1000); 412 412 if (ret) 413 413 return ret; 414 414 415 - /* IIO framework gives mV but Power Supply framework gives uV */ 416 - val->intval *= 1000; 417 415 break; 418 416 419 417 default: ··· 519 519 * The offset of this value is currently unknown and is 520 520 * not documented in the datasheet. Based on 521 521 * observation it's assumed to be somewhere around 522 - * 450ma. I will leave the value raw for now. 522 + * 450ma. I will leave the value raw for now. Note that 523 + * IIO framework gives mA but Power Supply framework 524 + * gives uA. 523 525 */ 524 - ret = iio_read_channel_processed(axp20x_batt->batt_chrg_i, &val->intval); 526 + ret = iio_read_channel_processed_scale(axp20x_batt->batt_chrg_i, 527 + &val->intval, 1000); 525 528 if (ret) 526 529 return ret; 527 - /* IIO framework gives mA but Power Supply framework gives uA */ 528 - val->intval *= 1000; 530 + 529 531 return 0; 530 532 531 533 case POWER_SUPPLY_PROP_CAPACITY: ··· 566 564 return 0; 567 565 568 566 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 569 - ret = iio_read_channel_processed(axp20x_batt->batt_v, 570 - &val->intval); 567 + /* IIO framework gives mV but Power Supply framework gives uV */ 568 + ret = iio_read_channel_processed_scale(axp20x_batt->batt_v, 569 + &val->intval, 1000); 571 570 if (ret) 572 571 return ret; 573 572 574 - /* IIO framework gives mV but Power Supply framework gives uV */ 575 - val->intval *= 1000; 576 573 return 0; 577 574 578 575 case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
+15 -18
drivers/power/supply/axp20x_usb_power.c
··· 220 220 return 0; 221 221 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 222 222 if (IS_ENABLED(CONFIG_AXP20X_ADC)) { 223 - ret = iio_read_channel_processed(power->vbus_v, 224 - &val->intval); 225 - if (ret) 226 - return ret; 227 - 228 223 /* 229 224 * IIO framework gives mV but Power Supply framework 230 225 * gives uV. 231 226 */ 232 - val->intval *= 1000; 227 + ret = iio_read_channel_processed_scale(power->vbus_v, 228 + &val->intval, 1000); 229 + if (ret) 230 + return ret; 231 + 233 232 return 0; 234 233 } 235 234 ··· 252 253 return 0; 253 254 case POWER_SUPPLY_PROP_CURRENT_NOW: 254 255 if (IS_ENABLED(CONFIG_AXP20X_ADC)) { 255 - ret = iio_read_channel_processed(power->vbus_i, 256 - &val->intval); 257 - if (ret) 258 - return ret; 259 - 260 256 /* 261 257 * IIO framework gives mA but Power Supply framework 262 258 * gives uA. 263 259 */ 264 - val->intval *= 1000; 260 + ret = iio_read_channel_processed_scale(power->vbus_i, 261 + &val->intval, 1000); 262 + if (ret) 263 + return ret; 264 + 265 265 return 0; 266 266 } 267 267 ··· 372 374 break; 373 375 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 374 376 if (IS_ENABLED(CONFIG_AXP20X_ADC)) { 375 - ret = iio_read_channel_processed(power->vbus_v, 376 - &val->intval); 377 - if (ret) 378 - return ret; 379 - 380 377 /* 381 378 * IIO framework gives mV but Power Supply framework 382 379 * gives uV. 383 380 */ 384 - val->intval *= 1000; 381 + ret = iio_read_channel_processed_scale(power->vbus_v, 382 + &val->intval, 1000); 383 + if (ret) 384 + return ret; 385 + 385 386 return 0; 386 387 } 387 388
+37 -3
drivers/power/supply/bq27xxx_battery.c
··· 449 449 [BQ27XXX_REG_AP] = 0x18, 450 450 BQ27XXX_DM_REG_ROWS, 451 451 }, 452 + bq27426_regs[BQ27XXX_REG_MAX] = { 453 + [BQ27XXX_REG_CTRL] = 0x00, 454 + [BQ27XXX_REG_TEMP] = 0x02, 455 + [BQ27XXX_REG_INT_TEMP] = 0x1e, 456 + [BQ27XXX_REG_VOLT] = 0x04, 457 + [BQ27XXX_REG_AI] = 0x10, 458 + [BQ27XXX_REG_FLAGS] = 0x06, 459 + [BQ27XXX_REG_TTE] = INVALID_REG_ADDR, 460 + [BQ27XXX_REG_TTF] = INVALID_REG_ADDR, 461 + [BQ27XXX_REG_TTES] = INVALID_REG_ADDR, 462 + [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR, 463 + [BQ27XXX_REG_NAC] = 0x08, 464 + [BQ27XXX_REG_RC] = 0x0c, 465 + [BQ27XXX_REG_FCC] = 0x0e, 466 + [BQ27XXX_REG_CYCT] = INVALID_REG_ADDR, 467 + [BQ27XXX_REG_AE] = INVALID_REG_ADDR, 468 + [BQ27XXX_REG_SOC] = 0x1c, 469 + [BQ27XXX_REG_DCAP] = INVALID_REG_ADDR, 470 + [BQ27XXX_REG_AP] = 0x18, 471 + BQ27XXX_DM_REG_ROWS, 472 + }, 452 473 #define bq27411_regs bq27421_regs 453 474 #define bq27425_regs bq27421_regs 454 - #define bq27426_regs bq27421_regs 455 475 #define bq27441_regs bq27421_regs 456 476 #define bq27621_regs bq27421_regs 457 477 bq27z561_regs[BQ27XXX_REG_MAX] = { ··· 789 769 }; 790 770 #define bq27411_props bq27421_props 791 771 #define bq27425_props bq27421_props 792 - #define bq27426_props bq27421_props 793 772 #define bq27441_props bq27421_props 794 773 #define bq27621_props bq27421_props 774 + 775 + static enum power_supply_property bq27426_props[] = { 776 + POWER_SUPPLY_PROP_STATUS, 777 + POWER_SUPPLY_PROP_PRESENT, 778 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 779 + POWER_SUPPLY_PROP_CURRENT_NOW, 780 + POWER_SUPPLY_PROP_CAPACITY, 781 + POWER_SUPPLY_PROP_CAPACITY_LEVEL, 782 + POWER_SUPPLY_PROP_TEMP, 783 + POWER_SUPPLY_PROP_TECHNOLOGY, 784 + POWER_SUPPLY_PROP_CHARGE_FULL, 785 + POWER_SUPPLY_PROP_CHARGE_NOW, 786 + POWER_SUPPLY_PROP_MANUFACTURER, 787 + }; 795 788 796 789 static enum power_supply_property bq27z561_props[] = { 797 790 POWER_SUPPLY_PROP_STATUS, ··· 2164 2131 struct power_supply_config psy_cfg = { 2165 2132 .of_node = di->dev->of_node, 2166 2133 .drv_data = di, 2134 + .no_wakeup_source = true, 2167 2135 }; 2168 2136 int ret; 2169 2137 ··· 2191 2157 psy_desc->get_property = bq27xxx_battery_get_property; 2192 2158 psy_desc->external_power_changed = bq27xxx_external_power_changed; 2193 2159 2194 - di->bat = devm_power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg); 2160 + di->bat = devm_power_supply_register(di->dev, psy_desc, &psy_cfg); 2195 2161 if (IS_ERR(di->bat)) 2196 2162 return dev_err_probe(di->dev, PTR_ERR(di->bat), 2197 2163 "failed to register battery\n");
+2 -2
drivers/power/supply/charger-manager.c
··· 221 221 222 222 /* If at least one of the charger is charging, return yes */ 223 223 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { 224 - /* 1. The charger sholuld not be DISABLED */ 224 + /* 1. The charger should not be DISABLED */ 225 225 if (cm->emergency_stop) 226 226 continue; 227 227 if (!cm->charger_enabled) ··· 1739 1739 .of_match_table = charger_manager_match, 1740 1740 }, 1741 1741 .probe = charger_manager_probe, 1742 - .remove_new = charger_manager_remove, 1742 + .remove = charger_manager_remove, 1743 1743 .id_table = charger_manager_id, 1744 1744 }; 1745 1745
+1 -1
drivers/power/supply/cpcap-battery.c
··· 1169 1169 .of_match_table = of_match_ptr(cpcap_battery_id_table), 1170 1170 }, 1171 1171 .probe = cpcap_battery_probe, 1172 - .remove_new = cpcap_battery_remove, 1172 + .remove = cpcap_battery_remove, 1173 1173 }; 1174 1174 module_platform_driver(cpcap_battery_driver); 1175 1175
+1 -1
drivers/power/supply/cpcap-charger.c
··· 969 969 .of_match_table = cpcap_charger_id_table, 970 970 }, 971 971 .shutdown = cpcap_charger_shutdown, 972 - .remove_new = cpcap_charger_remove, 972 + .remove = cpcap_charger_remove, 973 973 }; 974 974 module_platform_driver(cpcap_charger_driver); 975 975
+2 -2
drivers/power/supply/cros_usbpd-charger.c
··· 618 618 psy_desc->external_power_changed = 619 619 cros_usbpd_charger_power_changed; 620 620 psy_cfg.drv_data = port; 621 + psy_cfg.no_wakeup_source = true; 621 622 622 623 if (cros_usbpd_charger_port_is_dedicated(port)) { 623 624 sprintf(port->name, CHARGER_DEDICATED_DIR_NAME); ··· 645 644 646 645 psy_desc->name = port->name; 647 646 648 - psy = devm_power_supply_register_no_ws(dev, psy_desc, 649 - &psy_cfg); 647 + psy = devm_power_supply_register(dev, psy_desc, &psy_cfg); 650 648 if (IS_ERR(psy)) { 651 649 dev_err(dev, "Failed to register power supply\n"); 652 650 continue;
+3 -3
drivers/power/supply/da9030_battery.c
··· 269 269 } 270 270 if (charger->adc.vchmax_res > charger->thresholds.vcharge_max || 271 271 charger->adc.vchmin_res < charger->thresholds.vcharge_min || 272 - /* Tempreture readings are negative */ 272 + /* Temperature readings are negative */ 273 273 charger->adc.tbat_res < charger->thresholds.tbat_high || 274 274 charger->adc.tbat_res > charger->thresholds.tbat_low) { 275 275 /* disable charger */ ··· 470 470 if (ret) 471 471 return ret; 472 472 473 - /* enable auto ADC measuremnts */ 473 + /* enable auto ADC measurements */ 474 474 return da903x_write(charger->master, DA9030_ADC_AUTO_CONTROL, 475 475 DA9030_ADC_TBAT_ENABLE | DA9030_ADC_VBAT_IN_TXON | 476 476 DA9030_ADC_VCH_ENABLE | DA9030_ADC_ICH_ENABLE | ··· 571 571 .name = "da903x-battery", 572 572 }, 573 573 .probe = da9030_battery_probe, 574 - .remove_new = da9030_battery_remove, 574 + .remove = da9030_battery_remove, 575 575 }; 576 576 577 577 module_platform_driver(da903x_battery_driver);
+1 -1
drivers/power/supply/da9052-battery.c
··· 648 648 649 649 static struct platform_driver da9052_bat_driver = { 650 650 .probe = da9052_bat_probe, 651 - .remove_new = da9052_bat_remove, 651 + .remove = da9052_bat_remove, 652 652 .driver = { 653 653 .name = "da9052-bat", 654 654 },
+1 -1
drivers/power/supply/da9150-charger.c
··· 636 636 .name = "da9150-charger", 637 637 }, 638 638 .probe = da9150_charger_probe, 639 - .remove_new = da9150_charger_remove, 639 + .remove = da9150_charger_remove, 640 640 }; 641 641 642 642 module_platform_driver(da9150_charger_driver);
+2 -2
drivers/power/supply/generic-adc-battery.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 /* 3 3 * Generic battery driver using IIO 4 - * Copyright (C) 2012, Anish Kumar <anish198519851985@gmail.com> 4 + * Copyright (C) 2012, Anish Kumar <yesanishhere@gmail.com> 5 5 * Copyright (c) 2023, Sebastian Reichel <sre@kernel.org> 6 6 */ 7 7 #include <linux/interrupt.h> ··· 295 295 }; 296 296 module_platform_driver(gab_driver); 297 297 298 - MODULE_AUTHOR("anish kumar <anish198519851985@gmail.com>"); 298 + MODULE_AUTHOR("anish kumar <yesanishhere@gmail.com>"); 299 299 MODULE_DESCRIPTION("generic battery driver using IIO"); 300 300 MODULE_LICENSE("GPL");
+1 -1
drivers/power/supply/ipaq_micro_battery.c
··· 302 302 .pm = &micro_batt_dev_pm_ops, 303 303 }, 304 304 .probe = micro_batt_probe, 305 - .remove_new = micro_batt_remove, 305 + .remove = micro_batt_remove, 306 306 }; 307 307 module_platform_driver(micro_batt_device_driver); 308 308
+1 -1
drivers/power/supply/isp1704_charger.c
··· 501 501 .of_match_table = of_match_ptr(omap_isp1704_of_match), 502 502 }, 503 503 .probe = isp1704_charger_probe, 504 - .remove_new = isp1704_charger_remove, 504 + .remove = isp1704_charger_remove, 505 505 }; 506 506 507 507 module_platform_driver(isp1704_charger_driver);
+8 -6
drivers/power/supply/lenovo_yoga_c630_battery.c
··· 368 368 369 369 bat_cfg.drv_data = ecbat; 370 370 bat_cfg.fwnode = ecbat->fwnode; 371 - ecbat->bat_psy = power_supply_register_no_ws(ecbat->dev, 372 - ecbat->unit_mA ? 373 - &yoga_c630_psy_bat_psy_desc_mA : 374 - &yoga_c630_psy_bat_psy_desc_mWh, 375 - &bat_cfg); 371 + bat_cfg.no_wakeup_source = true; 372 + ecbat->bat_psy = power_supply_register(ecbat->dev, 373 + ecbat->unit_mA ? 374 + &yoga_c630_psy_bat_psy_desc_mA : 375 + &yoga_c630_psy_bat_psy_desc_mWh, 376 + &bat_cfg); 376 377 if (IS_ERR(ecbat->bat_psy)) { 377 378 dev_err(ecbat->dev, "failed to register battery supply\n"); 378 379 return PTR_ERR(ecbat->bat_psy); ··· 443 442 adp_cfg.fwnode = ecbat->fwnode; 444 443 adp_cfg.supplied_to = (char **)&yoga_c630_psy_bat_psy_desc_mA.name; 445 444 adp_cfg.num_supplicants = 1; 446 - ecbat->adp_psy = devm_power_supply_register_no_ws(dev, &yoga_c630_psy_adpt_psy_desc, &adp_cfg); 445 + adp_cfg.no_wakeup_source = true; 446 + ecbat->adp_psy = devm_power_supply_register(dev, &yoga_c630_psy_adpt_psy_desc, &adp_cfg); 447 447 if (IS_ERR(ecbat->adp_psy)) { 448 448 dev_err(dev, "failed to register AC adapter supply\n"); 449 449 return PTR_ERR(ecbat->adp_psy);
+1 -1
drivers/power/supply/lp8788-charger.c
··· 716 716 717 717 static struct platform_driver lp8788_charger_driver = { 718 718 .probe = lp8788_charger_probe, 719 - .remove_new = lp8788_charger_remove, 719 + .remove = lp8788_charger_remove, 720 720 .driver = { 721 721 .name = LP8788_DEV_CHARGER, 722 722 },
+1 -1
drivers/power/supply/max14577_charger.c
··· 634 634 .of_match_table = of_max14577_charger_dt_match, 635 635 }, 636 636 .probe = max14577_charger_probe, 637 - .remove_new = max14577_charger_remove, 637 + .remove = max14577_charger_remove, 638 638 .id_table = max14577_charger_id, 639 639 }; 640 640 module_platform_driver(max14577_charger_driver);
+1 -1
drivers/power/supply/max77650-charger.c
··· 364 364 .of_match_table = max77650_charger_of_match, 365 365 }, 366 366 .probe = max77650_charger_probe, 367 - .remove_new = max77650_charger_remove, 367 + .remove = max77650_charger_remove, 368 368 }; 369 369 module_platform_driver(max77650_charger_driver); 370 370
+1 -1
drivers/power/supply/max77693_charger.c
··· 798 798 .name = "max77693-charger", 799 799 }, 800 800 .probe = max77693_charger_probe, 801 - .remove_new = max77693_charger_remove, 801 + .remove = max77693_charger_remove, 802 802 .id_table = max77693_charger_id, 803 803 }; 804 804 module_platform_driver(max77693_charger_driver);
+2 -1
drivers/power/supply/max77976_charger.c
··· 452 452 453 453 i2c_set_clientdata(client, chg); 454 454 psy_cfg.drv_data = chg; 455 + psy_cfg.no_wakeup_source = true; 455 456 chg->client = client; 456 457 457 458 chg->regmap = devm_regmap_init_i2c(client, &max77976_regmap_config); ··· 476 475 if (err) 477 476 return err; 478 477 479 - psy = devm_power_supply_register_no_ws(dev, &max77976_psy_desc, &psy_cfg); 478 + psy = devm_power_supply_register(dev, &max77976_psy_desc, &psy_cfg); 480 479 if (IS_ERR(psy)) 481 480 return dev_err_probe(dev, PTR_ERR(psy), "cannot register\n"); 482 481
+2 -2
drivers/power/supply/max8925_power.c
··· 73 73 unsigned usb_online:1; 74 74 unsigned bat_online:1; 75 75 unsigned chg_mode:2; 76 - unsigned batt_detect:1; /* detecing MB by ID pin */ 76 + unsigned batt_detect:1; /* detecting MB by ID pin */ 77 77 unsigned topoff_threshold:2; 78 78 unsigned fast_charge:3; 79 79 unsigned no_temp_support:1; ··· 563 563 564 564 static struct platform_driver max8925_power_driver = { 565 565 .probe = max8925_power_probe, 566 - .remove_new = max8925_power_remove, 566 + .remove = max8925_power_remove, 567 567 .driver = { 568 568 .name = "max8925-power", 569 569 },
+1 -1
drivers/power/supply/pcf50633-charger.c
··· 455 455 .name = "pcf50633-mbc", 456 456 }, 457 457 .probe = pcf50633_mbc_probe, 458 - .remove_new = pcf50633_mbc_remove, 458 + .remove = pcf50633_mbc_remove, 459 459 }; 460 460 461 461 module_platform_driver(pcf50633_mbc_driver);
+1
drivers/power/supply/pmu_battery.c
··· 170 170 pbat->bat_desc.properties = pmu_bat_props; 171 171 pbat->bat_desc.num_properties = ARRAY_SIZE(pmu_bat_props); 172 172 pbat->bat_desc.get_property = pmu_bat_get_property; 173 + pbat->bat_desc.type = POWER_SUPPLY_TYPE_BATTERY; 173 174 pbat->pbi = &pmu_batteries[i]; 174 175 psy_cfg.drv_data = pbat; 175 176
+21 -1
drivers/power/supply/power_supply.h
··· 13 13 struct device_type; 14 14 struct power_supply; 15 15 16 + extern int power_supply_property_is_writeable(struct power_supply *psy, 17 + enum power_supply_property psp); 18 + 16 19 #ifdef CONFIG_SYSFS 17 20 18 - extern void power_supply_init_attrs(void); 21 + extern void __init power_supply_init_attrs(void); 19 22 extern int power_supply_uevent(const struct device *dev, struct kobj_uevent_env *env); 20 23 extern const struct attribute_group *power_supply_attr_groups[]; 21 24 ··· 44 41 static inline void power_supply_remove_triggers(struct power_supply *psy) {} 45 42 46 43 #endif /* CONFIG_LEDS_TRIGGERS */ 44 + 45 + #ifdef CONFIG_POWER_SUPPLY_HWMON 46 + 47 + int power_supply_add_hwmon_sysfs(struct power_supply *psy); 48 + void power_supply_remove_hwmon_sysfs(struct power_supply *psy); 49 + 50 + #else 51 + 52 + static inline int power_supply_add_hwmon_sysfs(struct power_supply *psy) 53 + { 54 + return 0; 55 + } 56 + 57 + static inline 58 + void power_supply_remove_hwmon_sysfs(struct power_supply *psy) {} 59 + 60 + #endif /* CONFIG_POWER_SUPPLY_HWMON */
+12 -75
drivers/power/supply/power_supply_core.c
··· 152 152 deferred_register_work.work); 153 153 154 154 if (psy->dev.parent) { 155 - while (!mutex_trylock(&psy->dev.parent->mutex)) { 155 + while (!device_trylock(psy->dev.parent)) { 156 156 if (psy->removing) 157 157 return; 158 158 msleep(10); ··· 162 162 power_supply_changed(psy); 163 163 164 164 if (psy->dev.parent) 165 - mutex_unlock(&psy->dev.parent->mutex); 165 + device_unlock(psy->dev.parent); 166 166 } 167 167 168 168 #ifdef CONFIG_OF ··· 484 484 */ 485 485 void power_supply_put(struct power_supply *psy) 486 486 { 487 - might_sleep(); 488 - 489 487 atomic_dec(&psy->use_cnt); 490 488 put_device(&psy->dev); 491 489 } ··· 775 777 tab_len = size / (2 * sizeof(__be32)); 776 778 info->ocv_table_size[index] = tab_len; 777 779 778 - table = info->ocv_table[index] = 780 + info->ocv_table[index] = table = 779 781 devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); 780 782 if (!info->ocv_table[index]) { 781 783 power_supply_put_battery_info(psy, info); ··· 796 798 goto out_ret_pointer; 797 799 798 800 info->resist_table_size = len / (2 * sizeof(__be32)); 799 - resist_table = info->resist_table = devm_kcalloc(&psy->dev, 801 + info->resist_table = resist_table = devm_kcalloc(&psy->dev, 800 802 info->resist_table_size, 801 803 sizeof(*resist_table), 802 804 GFP_KERNEL); ··· 980 982 * 981 983 * Return: the battery internal resistance percent 982 984 */ 983 - int power_supply_temp2resist_simple(struct power_supply_resistance_temp_table *table, 985 + int power_supply_temp2resist_simple(const struct power_supply_resistance_temp_table *table, 984 986 int table_len, int temp) 985 987 { 986 988 int i, high, low; ··· 1091 1093 * 1092 1094 * Return: the battery capacity. 1093 1095 */ 1094 - int power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table *table, 1096 + int power_supply_ocv2cap_simple(const struct power_supply_battery_ocv_table *table, 1095 1097 int table_len, int ocv) 1096 1098 { 1097 1099 int i, high, low; ··· 1116 1118 } 1117 1119 EXPORT_SYMBOL_GPL(power_supply_ocv2cap_simple); 1118 1120 1119 - struct power_supply_battery_ocv_table * 1121 + const struct power_supply_battery_ocv_table * 1120 1122 power_supply_find_ocv2cap_table(struct power_supply_battery_info *info, 1121 1123 int temp, int *table_len) 1122 1124 { ··· 1147 1149 int power_supply_batinfo_ocv2cap(struct power_supply_battery_info *info, 1148 1150 int ocv, int temp) 1149 1151 { 1150 - struct power_supply_battery_ocv_table *table; 1152 + const struct power_supply_battery_ocv_table *table; 1151 1153 int table_len; 1152 1154 1153 1155 table = power_supply_find_ocv2cap_table(info, temp, &table_len); ··· 1231 1233 { 1232 1234 return psy->desc->property_is_writeable && psy->desc->property_is_writeable(psy, psp); 1233 1235 } 1234 - EXPORT_SYMBOL_GPL(power_supply_property_is_writeable); 1235 1236 1236 1237 void power_supply_external_power_changed(struct power_supply *psy) 1237 1238 { ··· 1339 1342 static struct power_supply *__must_check 1340 1343 __power_supply_register(struct device *parent, 1341 1344 const struct power_supply_desc *desc, 1342 - const struct power_supply_config *cfg, 1343 - bool ws) 1345 + const struct power_supply_config *cfg) 1344 1346 { 1345 1347 struct device *dev; 1346 1348 struct power_supply *psy; ··· 1406 1410 if (rc) 1407 1411 goto device_add_failed; 1408 1412 1409 - rc = device_init_wakeup(dev, ws); 1413 + rc = device_init_wakeup(dev, cfg ? !cfg->no_wakeup_source : true); 1410 1414 if (rc) 1411 1415 goto wakeup_init_failed; 1412 1416 ··· 1472 1476 const struct power_supply_desc *desc, 1473 1477 const struct power_supply_config *cfg) 1474 1478 { 1475 - return __power_supply_register(parent, desc, cfg, true); 1479 + return __power_supply_register(parent, desc, cfg); 1476 1480 } 1477 1481 EXPORT_SYMBOL_GPL(power_supply_register); 1478 - 1479 - /** 1480 - * power_supply_register_no_ws() - Register new non-waking-source power supply 1481 - * @parent: Device to be a parent of power supply's device, usually 1482 - * the device which probe function calls this 1483 - * @desc: Description of power supply, must be valid through whole 1484 - * lifetime of this power supply 1485 - * @cfg: Run-time specific configuration accessed during registering, 1486 - * may be NULL 1487 - * 1488 - * Return: A pointer to newly allocated power_supply on success 1489 - * or ERR_PTR otherwise. 1490 - * Use power_supply_unregister() on returned power_supply pointer to release 1491 - * resources. 1492 - */ 1493 - struct power_supply *__must_check 1494 - power_supply_register_no_ws(struct device *parent, 1495 - const struct power_supply_desc *desc, 1496 - const struct power_supply_config *cfg) 1497 - { 1498 - return __power_supply_register(parent, desc, cfg, false); 1499 - } 1500 - EXPORT_SYMBOL_GPL(power_supply_register_no_ws); 1501 1482 1502 1483 static void devm_power_supply_release(struct device *dev, void *res) 1503 1484 { ··· 1508 1535 1509 1536 if (!ptr) 1510 1537 return ERR_PTR(-ENOMEM); 1511 - psy = __power_supply_register(parent, desc, cfg, true); 1538 + psy = __power_supply_register(parent, desc, cfg); 1512 1539 if (IS_ERR(psy)) { 1513 1540 devres_free(ptr); 1514 1541 } else { ··· 1518 1545 return psy; 1519 1546 } 1520 1547 EXPORT_SYMBOL_GPL(devm_power_supply_register); 1521 - 1522 - /** 1523 - * devm_power_supply_register_no_ws() - Register managed non-waking-source power supply 1524 - * @parent: Device to be a parent of power supply's device, usually 1525 - * the device which probe function calls this 1526 - * @desc: Description of power supply, must be valid through whole 1527 - * lifetime of this power supply 1528 - * @cfg: Run-time specific configuration accessed during registering, 1529 - * may be NULL 1530 - * 1531 - * Return: A pointer to newly allocated power_supply on success 1532 - * or ERR_PTR otherwise. 1533 - * The returned power_supply pointer will be automatically unregistered 1534 - * on driver detach. 1535 - */ 1536 - struct power_supply *__must_check 1537 - devm_power_supply_register_no_ws(struct device *parent, 1538 - const struct power_supply_desc *desc, 1539 - const struct power_supply_config *cfg) 1540 - { 1541 - struct power_supply **ptr, *psy; 1542 - 1543 - ptr = devres_alloc(devm_power_supply_release, sizeof(*ptr), GFP_KERNEL); 1544 - 1545 - if (!ptr) 1546 - return ERR_PTR(-ENOMEM); 1547 - psy = __power_supply_register(parent, desc, cfg, false); 1548 - if (IS_ERR(psy)) { 1549 - devres_free(ptr); 1550 - } else { 1551 - *ptr = psy; 1552 - devres_add(parent, ptr); 1553 - } 1554 - return psy; 1555 - } 1556 - EXPORT_SYMBOL_GPL(devm_power_supply_register_no_ws); 1557 1548 1558 1549 /** 1559 1550 * power_supply_unregister() - Remove this power supply from system
+1
drivers/power/supply/power_supply_hwmon.c
··· 7 7 #include <linux/hwmon.h> 8 8 #include <linux/power_supply.h> 9 9 #include <linux/slab.h> 10 + #include "power_supply.h" 10 11 11 12 struct power_supply_hwmon { 12 13 struct power_supply *psy;
+6 -6
drivers/power/supply/power_supply_sysfs.c
··· 142 142 [POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE] = "force-discharge", 143 143 }; 144 144 145 - static struct power_supply_attr power_supply_attrs[] = { 145 + static struct power_supply_attr power_supply_attrs[] __ro_after_init = { 146 146 /* Properties of type `int' */ 147 147 POWER_SUPPLY_ENUM_ATTR(STATUS), 148 148 POWER_SUPPLY_ENUM_ATTR(CHARGE_TYPE), ··· 225 225 #define POWER_SUPPLY_ATTR_CNT ARRAY_SIZE(power_supply_attrs) 226 226 227 227 static struct attribute * 228 - __power_supply_attrs[POWER_SUPPLY_ATTR_CNT + 1]; 228 + __power_supply_attrs[POWER_SUPPLY_ATTR_CNT + 1] __ro_after_init; 229 229 230 - static struct power_supply_attr *to_ps_attr(struct device_attribute *attr) 230 + static const struct power_supply_attr *to_ps_attr(struct device_attribute *attr) 231 231 { 232 232 return container_of(attr, struct power_supply_attr, dev_attr); 233 233 } ··· 273 273 char *buf) { 274 274 ssize_t ret; 275 275 struct power_supply *psy = dev_get_drvdata(dev); 276 - struct power_supply_attr *ps_attr = to_ps_attr(attr); 276 + const struct power_supply_attr *ps_attr = to_ps_attr(attr); 277 277 enum power_supply_property psp = dev_attr_psp(attr); 278 278 union power_supply_propval value; 279 279 ··· 326 326 const char *buf, size_t count) { 327 327 ssize_t ret; 328 328 struct power_supply *psy = dev_get_drvdata(dev); 329 - struct power_supply_attr *ps_attr = to_ps_attr(attr); 329 + const struct power_supply_attr *ps_attr = to_ps_attr(attr); 330 330 enum power_supply_property psp = dev_attr_psp(attr); 331 331 union power_supply_propval value; 332 332 ··· 401 401 NULL 402 402 }; 403 403 404 - void power_supply_init_attrs(void) 404 + void __init power_supply_init_attrs(void) 405 405 { 406 406 int i; 407 407
+1 -1
drivers/power/supply/qcom_battmgr.c
··· 151 151 __le32 capacity_low; 152 152 __le32 capacity_warning; 153 153 __le32 cycle_count; 154 - /* thousandth of persent */ 154 + /* thousandth of percent */ 155 155 __le32 accuracy; 156 156 __le32 max_sample_time_ms; 157 157 __le32 min_sample_time_ms;
+1 -1
drivers/power/supply/qcom_pmi8998_charger.c
··· 832 832 AUTO_RECHG_BIT | EN_ANALOG_DROP_IN_VBATT_BIT | 833 833 CHARGER_INHIBIT_BIT, 834 834 .val = CHARGER_INHIBIT_BIT }, 835 - /* STAT pin software override, match downstream. Parallell charging? */ 835 + /* STAT pin software override, match downstream. Parallel charging? */ 836 836 { .addr = STAT_CFG, 837 837 .mask = STAT_SW_OVERRIDE_CFG_BIT, 838 838 .val = STAT_SW_OVERRIDE_CFG_BIT },
+4 -4
drivers/power/supply/qcom_smbb.c
··· 1017 1017 MODULE_DEVICE_TABLE(of, smbb_charger_id_table); 1018 1018 1019 1019 static struct platform_driver smbb_charger_driver = { 1020 - .probe = smbb_charger_probe, 1021 - .remove_new = smbb_charger_remove, 1022 - .driver = { 1023 - .name = "qcom-smbb", 1020 + .probe = smbb_charger_probe, 1021 + .remove = smbb_charger_remove, 1022 + .driver = { 1023 + .name = "qcom-smbb", 1024 1024 .of_match_table = smbb_charger_id_table, 1025 1025 }, 1026 1026 };
+65 -47
drivers/power/supply/rk817_charger.c
··· 240 240 static int rk817_bat_calib_cap(struct rk817_charger *charger) 241 241 { 242 242 struct rk808 *rk808 = charger->rk808; 243 - int tmp, charge_now, charge_now_adc, volt_avg; 243 + int charge_now, charge_now_adc; 244 244 u8 bulk_reg[4]; 245 + 246 + /* Don't do anything if there's no battery. */ 247 + if (!charger->battery_present) 248 + return 0; 249 + 250 + /* 251 + * When resuming from suspend, sometimes the voltage value would be 252 + * incorrect. BSP would simply wait two seconds and try reading the 253 + * values again. Do not do any sort of calibration activity when the 254 + * reported value is incorrect. The next scheduled update of battery 255 + * vaules should then return valid data and the driver can continue. 256 + * Use 2.7v as the sanity value because per the datasheet the PMIC 257 + * can in no way support a battery voltage lower than this. BSP only 258 + * checked for values too low, but I'm adding in a check for values 259 + * too high just in case; again the PMIC can in no way support 260 + * voltages above 4.45v, so this seems like a good value. 261 + */ 262 + if ((charger->volt_avg_uv < 2700000) || (charger->volt_avg_uv > 4450000)) { 263 + dev_dbg(charger->dev, 264 + "Battery voltage of %d is invalid, ignoring.\n", 265 + charger->volt_avg_uv); 266 + return -EINVAL; 267 + } 245 268 246 269 /* Calibrate the soc and fcc on a fully charged battery */ 247 270 ··· 326 303 bulk_reg, 4); 327 304 } 328 305 } 329 - 330 - /* 331 - * Calibrate the fully charged capacity when we previously had a full 332 - * battery (soc_cal = 1) and are now empty (at or below minimum design 333 - * voltage). If our columb counter is still positive, subtract that 334 - * from our fcc value to get a calibrated fcc, and if our columb 335 - * counter is negative add that to our fcc (but not to exceed our 336 - * design capacity). 337 - */ 338 - regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_VOL_H, 339 - bulk_reg, 2); 340 - tmp = get_unaligned_be16(bulk_reg); 341 - volt_avg = (charger->voltage_k * tmp) + 1000 * charger->voltage_b; 342 - if (volt_avg <= charger->bat_voltage_min_design_uv && 343 - charger->soc_cal) { 344 - regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3, 345 - bulk_reg, 4); 346 - charge_now_adc = get_unaligned_be32(bulk_reg); 347 - charge_now = ADC_TO_CHARGE_UAH(charge_now_adc, 348 - charger->res_div); 349 - /* 350 - * Note, if charge_now is negative this will add it (what we 351 - * want) and if it's positive this will subtract (also what 352 - * we want). 353 - */ 354 - charger->fcc_mah = charger->fcc_mah - (charge_now / 1000); 355 - 356 - dev_dbg(charger->dev, 357 - "Recalibrating full charge capacity to %d uah\n", 358 - charger->fcc_mah * 1000); 359 - } 360 - 361 - /* 362 - * Set the SOC to 0 if we are below the minimum system voltage. 363 - */ 364 - if (volt_avg <= charger->bat_voltage_min_design_uv) { 365 - charger->soc = 0; 366 - charge_now_adc = CHARGE_TO_ADC(0, charger->res_div); 367 - put_unaligned_be32(charge_now_adc, bulk_reg); 368 - regmap_bulk_write(rk808->regmap, 369 - RK817_GAS_GAUGE_Q_INIT_H3, bulk_reg, 4); 370 - dev_warn(charger->dev, 371 - "Battery voltage %d below minimum voltage %d\n", 372 - volt_avg, charger->bat_voltage_min_design_uv); 373 - } 374 306 375 307 rk817_record_battery_nvram_values(charger); 376 308 ··· 626 648 return IRQ_HANDLED; 627 649 } 628 650 651 + static int rk817_bat_set_prop(struct power_supply *ps, 652 + enum power_supply_property prop, 653 + const union power_supply_propval *val) 654 + { 655 + struct rk817_charger *charger = power_supply_get_drvdata(ps); 656 + 657 + switch (prop) { 658 + case POWER_SUPPLY_PROP_CHARGE_FULL: 659 + if ((val->intval < 500000) || 660 + (val->intval > charger->bat_charge_full_design_uah)) 661 + return -EINVAL; 662 + charger->fcc_mah = val->intval / 1000; 663 + return rk817_bat_calib_cap(charger); 664 + default: 665 + return -EINVAL; 666 + } 667 + } 668 + 629 669 static enum power_supply_property rk817_bat_props[] = { 630 670 POWER_SUPPLY_PROP_PRESENT, 631 671 POWER_SUPPLY_PROP_STATUS, ··· 669 673 POWER_SUPPLY_PROP_VOLTAGE_AVG, 670 674 }; 671 675 676 + static int rk817_bat_prop_writeable(struct power_supply *psy, 677 + enum power_supply_property psp) 678 + { 679 + switch (psp) { 680 + case POWER_SUPPLY_PROP_CHARGE_FULL: 681 + return 1; 682 + default: 683 + return 0; 684 + } 685 + } 686 + 672 687 static const struct power_supply_desc rk817_bat_desc = { 673 688 .name = "rk817-battery", 674 689 .type = POWER_SUPPLY_TYPE_BATTERY, 675 690 .properties = rk817_bat_props, 691 + .property_is_writeable = rk817_bat_prop_writeable, 676 692 .num_properties = ARRAY_SIZE(rk817_bat_props), 677 693 .get_property = rk817_bat_get_prop, 694 + .set_property = rk817_bat_set_prop, 678 695 }; 679 696 680 697 static const struct power_supply_desc rk817_chg_desc = { ··· 1211 1202 return 0; 1212 1203 } 1213 1204 1205 + static int __maybe_unused rk817_suspend(struct device *dev) 1206 + { 1207 + struct rk817_charger *charger = dev_get_drvdata(dev); 1208 + 1209 + cancel_delayed_work_sync(&charger->work); 1210 + 1211 + return 0; 1212 + } 1213 + 1214 1214 static int __maybe_unused rk817_resume(struct device *dev) 1215 1215 { 1216 1216 ··· 1231 1213 return 0; 1232 1214 } 1233 1215 1234 - static SIMPLE_DEV_PM_OPS(rk817_charger_pm, NULL, rk817_resume); 1216 + static SIMPLE_DEV_PM_OPS(rk817_charger_pm, rk817_suspend, rk817_resume); 1235 1217 1236 1218 static struct platform_driver rk817_charger_driver = { 1237 1219 .probe = rk817_charger_probe,
+33 -19
drivers/power/supply/rt9471.c
··· 139 139 RT9471_PORTSTAT_DCP, 140 140 }; 141 141 142 + enum { 143 + RT9471_ICSTAT_SLEEP = 0, 144 + RT9471_ICSTAT_VBUSRDY, 145 + RT9471_ICSTAT_TRICKLECHG, 146 + RT9471_ICSTAT_PRECHG, 147 + RT9471_ICSTAT_FASTCHG, 148 + RT9471_ICSTAT_IEOC, 149 + RT9471_ICSTAT_BGCHG, 150 + RT9471_ICSTAT_CHGDONE, 151 + RT9471_ICSTAT_CHGFAULT, 152 + RT9471_ICSTAT_OTG = 15, 153 + }; 154 + 142 155 struct rt9471_chip { 143 156 struct device *dev; 144 157 struct regmap *regmap; ··· 166 153 }; 167 154 168 155 static const struct reg_field rt9471_reg_fields[F_MAX_FIELDS] = { 169 - [F_WDT] = REG_FIELD(RT9471_REG_TOP, 0, 0), 170 - [F_WDT_RST] = REG_FIELD(RT9471_REG_TOP, 1, 1), 156 + [F_WDT] = REG_FIELD(RT9471_REG_TOP, 0, 1), 157 + [F_WDT_RST] = REG_FIELD(RT9471_REG_TOP, 2, 2), 171 158 [F_CHG_EN] = REG_FIELD(RT9471_REG_FUNC, 0, 0), 172 159 [F_HZ] = REG_FIELD(RT9471_REG_FUNC, 5, 5), 173 160 [F_BATFET_DIS] = REG_FIELD(RT9471_REG_FUNC, 7, 7), ··· 268 255 269 256 static int rt9471_get_status(struct rt9471_chip *chip, int *status) 270 257 { 271 - unsigned int chg_ready, chg_done, fault_stat; 258 + unsigned int ic_stat; 272 259 int ret; 273 260 274 - ret = regmap_field_read(chip->rm_fields[F_ST_CHG_RDY], &chg_ready); 261 + ret = regmap_field_read(chip->rm_fields[F_IC_STAT], &ic_stat); 275 262 if (ret) 276 263 return ret; 277 264 278 - ret = regmap_field_read(chip->rm_fields[F_ST_CHG_DONE], &chg_done); 279 - if (ret) 280 - return ret; 281 - 282 - ret = regmap_read(chip->regmap, RT9471_REG_STAT1, &fault_stat); 283 - if (ret) 284 - return ret; 285 - 286 - fault_stat &= RT9471_CHGFAULT_MASK; 287 - 288 - if (chg_ready && chg_done) 289 - *status = POWER_SUPPLY_STATUS_FULL; 290 - else if (chg_ready && fault_stat) 265 + switch (ic_stat) { 266 + case RT9471_ICSTAT_VBUSRDY: 267 + case RT9471_ICSTAT_CHGFAULT: 291 268 *status = POWER_SUPPLY_STATUS_NOT_CHARGING; 292 - else if (chg_ready && !fault_stat) 269 + break; 270 + case RT9471_ICSTAT_TRICKLECHG ... RT9471_ICSTAT_BGCHG: 293 271 *status = POWER_SUPPLY_STATUS_CHARGING; 294 - else 272 + break; 273 + case RT9471_ICSTAT_CHGDONE: 274 + *status = POWER_SUPPLY_STATUS_FULL; 275 + break; 276 + case RT9471_ICSTAT_SLEEP: 277 + case RT9471_ICSTAT_OTG: 295 278 *status = POWER_SUPPLY_STATUS_DISCHARGING; 279 + break; 280 + default: 281 + *status = POWER_SUPPLY_STATUS_UNKNOWN; 282 + break; 283 + } 296 284 297 285 return 0; 298 286 }
+5 -5
drivers/power/supply/samsung-sdi-battery.c
··· 431 431 * temperature compensation tables so we just state 100% for every temperature. 432 432 * If you have the datasheets, please provide these tables. 433 433 */ 434 - static struct power_supply_resistance_temp_table samsung_temp2res[] = { 434 + static const struct power_supply_resistance_temp_table samsung_temp2res[] = { 435 435 { .temp = 50, .resistance = 100 }, 436 436 { .temp = 40, .resistance = 100 }, 437 437 { .temp = 30, .resistance = 100 }, ··· 447 447 * These must be sorted by falling OCV value. 448 448 */ 449 449 450 - static struct power_supply_battery_ocv_table samsung_ocv_cap_eb485159lu[] = { 450 + static const struct power_supply_battery_ocv_table samsung_ocv_cap_eb485159lu[] = { 451 451 { .ocv = 4330000, .capacity = 100}, 452 452 { .ocv = 4320000, .capacity = 99}, 453 453 { .ocv = 4283000, .capacity = 95}, ··· 499 499 }; 500 500 501 501 /* Same capacity table is used by eb-l1m7flu, eb425161la, eb425161lu */ 502 - static struct power_supply_battery_ocv_table samsung_ocv_cap_1500mah[] = { 502 + static const struct power_supply_battery_ocv_table samsung_ocv_cap_1500mah[] = { 503 503 { .ocv = 4328000, .capacity = 100}, 504 504 { .ocv = 4299000, .capacity = 99}, 505 505 { .ocv = 4281000, .capacity = 98}, ··· 540 540 { .ocv = 3300000, .capacity = 0}, 541 541 }; 542 542 543 - static struct power_supply_battery_ocv_table samsung_ocv_cap_eb535151vu[] = { 543 + static const struct power_supply_battery_ocv_table samsung_ocv_cap_eb535151vu[] = { 544 544 { .ocv = 4178000, .capacity = 100}, 545 545 { .ocv = 4148000, .capacity = 99}, 546 546 { .ocv = 4105000, .capacity = 95}, ··· 572 572 { .ocv = 3300000, .capacity = 0}, 573 573 }; 574 574 575 - static struct power_supply_battery_ocv_table samsung_ocv_cap_eb585157lu[] = { 575 + static const struct power_supply_battery_ocv_table samsung_ocv_cap_eb585157lu[] = { 576 576 { .ocv = 4320000, .capacity = 100}, 577 577 { .ocv = 4296000, .capacity = 99}, 578 578 { .ocv = 4283000, .capacity = 98},
+1 -1
drivers/power/supply/sc2731_charger.c
··· 530 530 .of_match_table = sc2731_charger_of_match, 531 531 }, 532 532 .probe = sc2731_charger_probe, 533 - .remove_new = sc2731_charger_remove, 533 + .remove = sc2731_charger_remove, 534 534 }; 535 535 536 536 module_platform_driver(sc2731_charger_driver);
+8 -4
drivers/power/supply/sc27xx_fuel_gauge.c
··· 992 992 static int sc27xx_fgu_hw_init(struct sc27xx_fgu_data *data) 993 993 { 994 994 struct power_supply_battery_info *info; 995 - struct power_supply_battery_ocv_table *table; 995 + const struct power_supply_battery_ocv_table *table; 996 996 int ret, delta_clbcnt, alarm_adc; 997 997 998 998 ret = power_supply_get_battery_info(data->battery, &info); ··· 1183 1183 return PTR_ERR(data->charge_chan); 1184 1184 } 1185 1185 1186 - data->gpiod = devm_gpiod_get(dev, "bat-detect", GPIOD_IN); 1186 + data->gpiod = devm_gpiod_get(dev, "battery-detect", GPIOD_IN); 1187 1187 if (IS_ERR(data->gpiod)) { 1188 - dev_err(dev, "failed to get battery detection GPIO\n"); 1189 - return PTR_ERR(data->gpiod); 1188 + data->gpiod = devm_gpiod_get(dev, "bat-detect", GPIOD_IN); 1189 + if (IS_ERR(data->gpiod)) { 1190 + dev_err(dev, "failed to get battery detection GPIO\n"); 1191 + return PTR_ERR(data->gpiod); 1192 + } 1193 + dev_warn(dev, "bat-detect is deprecated, please use battery-detect\n"); 1190 1194 } 1191 1195 1192 1196 ret = gpiod_get_value_cansleep(data->gpiod);
+1 -1
drivers/power/supply/tps65090-charger.c
··· 343 343 .of_match_table = of_tps65090_charger_match, 344 344 }, 345 345 .probe = tps65090_charger_probe, 346 - .remove_new = tps65090_charger_remove, 346 + .remove = tps65090_charger_remove, 347 347 }; 348 348 module_platform_driver(tps65090_charger_driver); 349 349
+1 -1
drivers/power/supply/tps65217_charger.c
··· 269 269 270 270 static struct platform_driver tps65217_charger_driver = { 271 271 .probe = tps65217_charger_probe, 272 - .remove_new = tps65217_charger_remove, 272 + .remove = tps65217_charger_remove, 273 273 .driver = { 274 274 .name = "tps65217-charger", 275 275 .of_match_table = of_match_ptr(tps65217_charger_match_table),
+1 -1
drivers/power/supply/twl4030_charger.c
··· 1133 1133 1134 1134 static struct platform_driver twl4030_bci_driver = { 1135 1135 .probe = twl4030_bci_probe, 1136 - .remove_new = twl4030_bci_remove, 1136 + .remove = twl4030_bci_remove, 1137 1137 .driver = { 1138 1138 .name = "twl4030_bci", 1139 1139 .of_match_table = of_match_ptr(twl_bci_of_match),
+581
drivers/power/supply/twl6030_charger.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * TWL6030 charger 4 + * 5 + * Copyright (C) 2024 Andreas Kemnade <andreas@kemnade.info> 6 + * 7 + * based on older 6030 driver found in a v3.0 vendor kernel 8 + * 9 + * based on twl4030_bci_battery.c by TI 10 + * Copyright (C) 2008 Texas Instruments, Inc. 11 + */ 12 + 13 + #include <linux/init.h> 14 + #include <linux/module.h> 15 + #include <linux/slab.h> 16 + #include <linux/err.h> 17 + #include <linux/of.h> 18 + #include <linux/bits.h> 19 + #include <linux/platform_device.h> 20 + #include <linux/interrupt.h> 21 + #include <linux/mfd/twl.h> 22 + #include <linux/power_supply.h> 23 + #include <linux/notifier.h> 24 + #include <linux/usb/otg.h> 25 + #include <linux/iio/consumer.h> 26 + #include <linux/devm-helpers.h> 27 + 28 + #define CONTROLLER_INT_MASK 0x00 29 + #define CONTROLLER_CTRL1 0x01 30 + #define CONTROLLER_WDG 0x02 31 + #define CONTROLLER_STAT1 0x03 32 + #define CHARGERUSB_INT_STATUS 0x04 33 + #define CHARGERUSB_INT_MASK 0x05 34 + #define CHARGERUSB_STATUS_INT1 0x06 35 + #define CHARGERUSB_STATUS_INT2 0x07 36 + #define CHARGERUSB_CTRL1 0x08 37 + #define CHARGERUSB_CTRL2 0x09 38 + #define CHARGERUSB_CTRL3 0x0A 39 + #define CHARGERUSB_STAT1 0x0B 40 + #define CHARGERUSB_VOREG 0x0C 41 + #define CHARGERUSB_VICHRG 0x0D 42 + #define CHARGERUSB_CINLIMIT 0x0E 43 + #define CHARGERUSB_CTRLLIMIT1 0x0F 44 + #define CHARGERUSB_CTRLLIMIT2 0x10 45 + #define ANTICOLLAPSE_CTRL1 0x11 46 + #define ANTICOLLAPSE_CTRL2 0x12 47 + 48 + /* TWL6032 registers 0xDA to 0xDE - TWL6032_MODULE_CHARGER */ 49 + #define CONTROLLER_CTRL2 0x00 50 + #define CONTROLLER_VSEL_COMP 0x01 51 + #define CHARGERUSB_VSYSREG 0x02 52 + #define CHARGERUSB_VICHRG_PC 0x03 53 + #define LINEAR_CHRG_STS 0x04 54 + 55 + #define LINEAR_CHRG_STS_CRYSTL_OSC_OK 0x40 56 + #define LINEAR_CHRG_STS_END_OF_CHARGE 0x20 57 + #define LINEAR_CHRG_STS_VBATOV 0x10 58 + #define LINEAR_CHRG_STS_VSYSOV 0x08 59 + #define LINEAR_CHRG_STS_DPPM_STS 0x04 60 + #define LINEAR_CHRG_STS_CV_STS 0x02 61 + #define LINEAR_CHRG_STS_CC_STS 0x01 62 + 63 + #define FG_REG_00 0x00 64 + #define FG_REG_01 0x01 65 + #define FG_REG_02 0x02 66 + #define FG_REG_03 0x03 67 + #define FG_REG_04 0x04 68 + #define FG_REG_05 0x05 69 + #define FG_REG_06 0x06 70 + #define FG_REG_07 0x07 71 + #define FG_REG_08 0x08 72 + #define FG_REG_09 0x09 73 + #define FG_REG_10 0x0A 74 + #define FG_REG_11 0x0B 75 + 76 + /* CONTROLLER_INT_MASK */ 77 + #define MVAC_FAULT BIT(7) 78 + #define MAC_EOC BIT(6) 79 + #define LINCH_GATED BIT(5) 80 + #define MBAT_REMOVED BIT(4) 81 + #define MFAULT_WDG BIT(3) 82 + #define MBAT_TEMP BIT(2) 83 + #define MVBUS_DET BIT(1) 84 + #define MVAC_DET BIT(0) 85 + 86 + /* CONTROLLER_CTRL1 */ 87 + #define CONTROLLER_CTRL1_EN_LINCH BIT(5) 88 + #define CONTROLLER_CTRL1_EN_CHARGER BIT(4) 89 + #define CONTROLLER_CTRL1_SEL_CHARGER BIT(3) 90 + 91 + /* CONTROLLER_STAT1 */ 92 + #define CONTROLLER_STAT1_EXTCHRG_STATZ BIT(7) 93 + #define CONTROLLER_STAT1_LINCH_GATED BIT(6) 94 + #define CONTROLLER_STAT1_CHRG_DET_N BIT(5) 95 + #define CONTROLLER_STAT1_FAULT_WDG BIT(4) 96 + #define CONTROLLER_STAT1_VAC_DET BIT(3) 97 + #define VAC_DET BIT(3) 98 + #define CONTROLLER_STAT1_VBUS_DET BIT(2) 99 + #define VBUS_DET BIT(2) 100 + #define CONTROLLER_STAT1_BAT_REMOVED BIT(1) 101 + #define CONTROLLER_STAT1_BAT_TEMP_OVRANGE BIT(0) 102 + 103 + /* CHARGERUSB_INT_STATUS */ 104 + #define EN_LINCH BIT(4) 105 + #define CURRENT_TERM_INT BIT(3) 106 + #define CHARGERUSB_STAT BIT(2) 107 + #define CHARGERUSB_THMREG BIT(1) 108 + #define CHARGERUSB_FAULT BIT(0) 109 + 110 + /* CHARGERUSB_INT_MASK */ 111 + #define MASK_MCURRENT_TERM BIT(3) 112 + #define MASK_MCHARGERUSB_STAT BIT(2) 113 + #define MASK_MCHARGERUSB_THMREG BIT(1) 114 + #define MASK_MCHARGERUSB_FAULT BIT(0) 115 + 116 + /* CHARGERUSB_STATUS_INT1 */ 117 + #define CHARGERUSB_STATUS_INT1_TMREG BIT(7) 118 + #define CHARGERUSB_STATUS_INT1_NO_BAT BIT(6) 119 + #define CHARGERUSB_STATUS_INT1_BST_OCP BIT(5) 120 + #define CHARGERUSB_STATUS_INT1_TH_SHUTD BIT(4) 121 + #define CHARGERUSB_STATUS_INT1_BAT_OVP BIT(3) 122 + #define CHARGERUSB_STATUS_INT1_POOR_SRC BIT(2) 123 + #define CHARGERUSB_STATUS_INT1_SLP_MODE BIT(1) 124 + #define CHARGERUSB_STATUS_INT1_VBUS_OVP BIT(0) 125 + 126 + /* CHARGERUSB_STATUS_INT2 */ 127 + #define ICCLOOP BIT(3) 128 + #define CURRENT_TERM BIT(2) 129 + #define CHARGE_DONE BIT(1) 130 + #define ANTICOLLAPSE BIT(0) 131 + 132 + /* CHARGERUSB_CTRL1 */ 133 + #define SUSPEND_BOOT BIT(7) 134 + #define OPA_MODE BIT(6) 135 + #define HZ_MODE BIT(5) 136 + #define TERM BIT(4) 137 + 138 + /* CHARGERUSB_CTRL2 */ 139 + #define UA_TO_VITERM(x) (((x) / 50000 - 1) << 5) 140 + 141 + /* CHARGERUSB_CTRL3 */ 142 + #define VBUSCHRG_LDO_OVRD BIT(7) 143 + #define CHARGE_ONCE BIT(6) 144 + #define BST_HW_PR_DIS BIT(5) 145 + #define AUTOSUPPLY BIT(3) 146 + #define BUCK_HSILIM BIT(0) 147 + 148 + /* CHARGERUSB_VOREG */ 149 + #define UV_TO_VOREG(x) (((x) - 3500000) / 20000) 150 + #define VOREG_TO_UV(x) (((x) & 0x3F) * 20000 + 3500000) 151 + #define CHARGERUSB_VOREG_3P52 0x01 152 + #define CHARGERUSB_VOREG_4P0 0x19 153 + #define CHARGERUSB_VOREG_4P2 0x23 154 + #define CHARGERUSB_VOREG_4P76 0x3F 155 + 156 + /* CHARGERUSB_VICHRG */ 157 + /* 158 + * might be inaccurate for < 500 mA, diffent scale might apply, 159 + * either starting from 100 mA or 300 mA 160 + */ 161 + #define UA_TO_VICHRG(x) (((x) / 100000) - 1) 162 + #define VICHRG_TO_UA(x) (((x) & 0xf) * 100000 + 100000) 163 + 164 + /* CHARGERUSB_CINLIMIT */ 165 + #define CHARGERUSB_CIN_LIMIT_100 0x1 166 + #define CHARGERUSB_CIN_LIMIT_300 0x5 167 + #define CHARGERUSB_CIN_LIMIT_500 0x9 168 + #define CHARGERUSB_CIN_LIMIT_NONE 0xF 169 + 170 + /* CHARGERUSB_CTRLLIMIT2 */ 171 + #define CHARGERUSB_CTRLLIMIT2_1500 0x0E 172 + #define LOCK_LIMIT BIT(4) 173 + 174 + /* ANTICOLLAPSE_CTRL2 */ 175 + #define BUCK_VTH_SHIFT 5 176 + 177 + /* FG_REG_00 */ 178 + #define CC_ACTIVE_MODE_SHIFT 6 179 + #define CC_AUTOCLEAR BIT(2) 180 + #define CC_CAL_EN BIT(1) 181 + #define CC_PAUSE BIT(0) 182 + 183 + #define REG_TOGGLE1 0x90 184 + #define REG_PWDNSTATUS1 0x93 185 + #define FGDITHS BIT(7) 186 + #define FGDITHR BIT(6) 187 + #define FGS BIT(5) 188 + #define FGR BIT(4) 189 + #define BBSPOR_CFG 0xE6 190 + #define BB_CHG_EN BIT(3) 191 + 192 + struct twl6030_charger_info { 193 + struct device *dev; 194 + struct power_supply *usb; 195 + struct power_supply_battery_info *binfo; 196 + struct work_struct work; 197 + int irq_chg; 198 + int input_current_limit; 199 + struct iio_channel *channel_vusb; 200 + struct delayed_work charger_monitor; 201 + bool extended_current_range; 202 + }; 203 + 204 + struct twl6030_charger_chip_data { 205 + bool extended_current_range; 206 + }; 207 + 208 + static int twl6030_charger_read(u8 reg, u8 *val) 209 + { 210 + return twl_i2c_read_u8(TWL_MODULE_MAIN_CHARGE, val, reg); 211 + } 212 + 213 + static int twl6030_charger_write(u8 reg, u8 val) 214 + { 215 + return twl_i2c_write_u8(TWL_MODULE_MAIN_CHARGE, val, reg); 216 + } 217 + 218 + static int twl6030_config_cinlimit_reg(struct twl6030_charger_info *charger, 219 + unsigned int ua) 220 + { 221 + if (ua >= 50000 && ua <= 750000) { 222 + ua = (ua - 50000) / 50000; 223 + } else if ((ua > 750000) && (ua <= 1500000) && charger->extended_current_range) { 224 + ua = ((ua % 100000) ? 0x30 : 0x20) + ((ua - 100000) / 100000); 225 + } else { 226 + if (ua < 50000) { 227 + dev_err(charger->dev, "invalid input current limit\n"); 228 + return -EINVAL; 229 + } 230 + /* This is no current limit */ 231 + ua = 0x0F; 232 + } 233 + 234 + return twl6030_charger_write(CHARGERUSB_CINLIMIT, ua); 235 + } 236 + 237 + /* 238 + * rewriting all stuff here, resets to extremely conservative defaults were 239 + * seen under some circumstances, like charge voltage to 3.5V 240 + */ 241 + static int twl6030_enable_usb(struct twl6030_charger_info *charger) 242 + { 243 + int ret; 244 + 245 + ret = twl6030_charger_write(CHARGERUSB_VICHRG, 246 + UA_TO_VICHRG(charger->binfo->constant_charge_current_max_ua)); 247 + if (ret < 0) 248 + return ret; 249 + 250 + ret = twl6030_charger_write(CONTROLLER_WDG, 0xff); 251 + if (ret < 0) 252 + return ret; 253 + 254 + charger->input_current_limit = 500000; 255 + ret = twl6030_config_cinlimit_reg(charger, charger->input_current_limit); 256 + if (ret < 0) 257 + return ret; 258 + 259 + ret = twl6030_charger_write(CHARGERUSB_CINLIMIT, CHARGERUSB_CIN_LIMIT_500); 260 + if (ret < 0) 261 + return ret; 262 + 263 + ret = twl6030_charger_write(CHARGERUSB_VOREG, 264 + UV_TO_VOREG(charger->binfo->constant_charge_voltage_max_uv)); 265 + if (ret < 0) 266 + return ret; 267 + 268 + ret = twl6030_charger_write(CHARGERUSB_CTRL1, TERM); 269 + if (ret < 0) 270 + return ret; 271 + 272 + if (charger->binfo->charge_term_current_ua != -EINVAL) { 273 + ret = twl6030_charger_write(CHARGERUSB_CTRL2, 274 + UA_TO_VITERM(charger->binfo->charge_term_current_ua)); 275 + if (ret < 0) 276 + return ret; 277 + } 278 + 279 + return twl6030_charger_write(CONTROLLER_CTRL1, CONTROLLER_CTRL1_EN_CHARGER); 280 + } 281 + 282 + static void twl6030_charger_wdg(struct work_struct *data) 283 + { 284 + struct twl6030_charger_info *charger = 285 + container_of(data, struct twl6030_charger_info, 286 + charger_monitor.work); 287 + 288 + u8 val; 289 + u8 int_stat; 290 + u8 stat_int1; 291 + u8 stat_int2; 292 + 293 + twl6030_charger_read(CONTROLLER_STAT1, &val); 294 + twl6030_charger_read(CHARGERUSB_INT_STATUS, &int_stat); 295 + twl6030_charger_read(CHARGERUSB_STATUS_INT1, &stat_int1); 296 + twl6030_charger_read(CHARGERUSB_STATUS_INT2, &stat_int2); 297 + dev_dbg(charger->dev, 298 + "wdg: stat1: %02x %s INT_STATUS %02x STATUS_INT1 %02x STATUS_INT2 %02x\n", 299 + val, (val & VBUS_DET) ? "usb online" : "usb offline", 300 + int_stat, stat_int1, stat_int2); 301 + 302 + twl6030_charger_write(CONTROLLER_WDG, 0xff); 303 + schedule_delayed_work(&charger->charger_monitor, 304 + msecs_to_jiffies(10000)); 305 + } 306 + 307 + static irqreturn_t twl6030_charger_interrupt(int irq, void *arg) 308 + { 309 + struct twl6030_charger_info *charger = arg; 310 + u8 val; 311 + u8 int_stat; 312 + u8 stat_int1; 313 + u8 stat_int2; 314 + 315 + if (twl6030_charger_read(CONTROLLER_STAT1, &val) < 0) 316 + return IRQ_HANDLED; 317 + 318 + if (twl6030_charger_read(CHARGERUSB_INT_STATUS, &int_stat) < 0) 319 + return IRQ_HANDLED; 320 + 321 + if (twl6030_charger_read(CHARGERUSB_STATUS_INT1, &stat_int1) < 0) 322 + return IRQ_HANDLED; 323 + 324 + if (twl6030_charger_read(CHARGERUSB_STATUS_INT2, &stat_int2) < 0) 325 + return IRQ_HANDLED; 326 + 327 + dev_dbg(charger->dev, 328 + "charger irq: stat1: %02x %s INT_STATUS %02x STATUS_INT1 %02x STATUS_INT2 %02x\n", 329 + val, (val & VBUS_DET) ? "usb online" : "usb offline", 330 + int_stat, stat_int1, stat_int2); 331 + power_supply_changed(charger->usb); 332 + 333 + if (val & VBUS_DET) { 334 + if (twl6030_charger_read(CONTROLLER_CTRL1, &val) < 0) 335 + return IRQ_HANDLED; 336 + 337 + if (!(val & CONTROLLER_CTRL1_EN_CHARGER)) { 338 + if (twl6030_enable_usb(charger) < 0) 339 + return IRQ_HANDLED; 340 + 341 + schedule_delayed_work(&charger->charger_monitor, 342 + msecs_to_jiffies(10000)); 343 + } 344 + } else { 345 + cancel_delayed_work(&charger->charger_monitor); 346 + } 347 + return IRQ_HANDLED; 348 + } 349 + 350 + static int twl6030_charger_usb_get_property(struct power_supply *psy, 351 + enum power_supply_property psp, 352 + union power_supply_propval *val) 353 + { 354 + struct twl6030_charger_info *charger = power_supply_get_drvdata(psy); 355 + int ret; 356 + u8 stat1; 357 + u8 intstat; 358 + 359 + ret = twl6030_charger_read(CONTROLLER_STAT1, &stat1); 360 + if (ret) 361 + return ret; 362 + 363 + switch (psp) { 364 + case POWER_SUPPLY_PROP_STATUS: 365 + if (!(stat1 & VBUS_DET)) { 366 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; 367 + break; 368 + } 369 + ret = twl6030_charger_read(CHARGERUSB_STATUS_INT2, &intstat); 370 + if (ret) 371 + return ret; 372 + 373 + if (intstat & CHARGE_DONE) 374 + val->intval = POWER_SUPPLY_STATUS_FULL; 375 + else if (intstat & CURRENT_TERM) 376 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; 377 + else 378 + val->intval = POWER_SUPPLY_STATUS_CHARGING; 379 + break; 380 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 381 + if (!charger->channel_vusb) 382 + return -ENODATA; 383 + 384 + ret = iio_read_channel_processed_scale(charger->channel_vusb, &val->intval, 1000); 385 + if (ret < 0) 386 + return ret; 387 + 388 + break; 389 + case POWER_SUPPLY_PROP_ONLINE: 390 + val->intval = !!(stat1 & VBUS_DET); 391 + break; 392 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 393 + val->intval = charger->input_current_limit; 394 + break; 395 + default: 396 + return -EINVAL; 397 + } 398 + 399 + return 0; 400 + } 401 + 402 + static int twl6030_charger_usb_set_property(struct power_supply *psy, 403 + enum power_supply_property psp, 404 + const union power_supply_propval *val) 405 + { 406 + struct twl6030_charger_info *charger = power_supply_get_drvdata(psy); 407 + 408 + switch (psp) { 409 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 410 + charger->input_current_limit = val->intval; 411 + return twl6030_config_cinlimit_reg(charger, charger->input_current_limit); 412 + default: 413 + return -EINVAL; 414 + } 415 + 416 + return 0; 417 + } 418 + 419 + static int twl6030_charger_usb_property_is_writeable(struct power_supply *psy, 420 + enum power_supply_property psp) 421 + { 422 + dev_info(&psy->dev, "is %d writeable?\n", (int)psp); 423 + switch (psp) { 424 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 425 + return true; 426 + default: 427 + return false; 428 + } 429 + } 430 + 431 + static enum power_supply_property twl6030_charger_props[] = { 432 + POWER_SUPPLY_PROP_STATUS, 433 + POWER_SUPPLY_PROP_ONLINE, 434 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 435 + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 436 + }; 437 + 438 + static const struct power_supply_desc twl6030_charger_usb_desc = { 439 + .name = "twl6030_usb", 440 + .type = POWER_SUPPLY_TYPE_USB, 441 + .properties = twl6030_charger_props, 442 + .num_properties = ARRAY_SIZE(twl6030_charger_props), 443 + .get_property = twl6030_charger_usb_get_property, 444 + .set_property = twl6030_charger_usb_set_property, 445 + .property_is_writeable = twl6030_charger_usb_property_is_writeable, 446 + }; 447 + 448 + static int twl6030_charger_probe(struct platform_device *pdev) 449 + { 450 + struct twl6030_charger_info *charger; 451 + const struct twl6030_charger_chip_data *chip_data; 452 + struct power_supply_config psy_cfg = {}; 453 + int ret; 454 + u8 val; 455 + 456 + charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL); 457 + if (!charger) 458 + return -ENOMEM; 459 + 460 + charger->dev = &pdev->dev; 461 + charger->irq_chg = platform_get_irq(pdev, 0); 462 + 463 + chip_data = device_get_match_data(&pdev->dev); 464 + if (!chip_data) 465 + return dev_err_probe(&pdev->dev, -EINVAL, "missing chip data\n"); 466 + 467 + charger->extended_current_range = chip_data->extended_current_range; 468 + platform_set_drvdata(pdev, charger); 469 + psy_cfg.drv_data = charger; 470 + psy_cfg.fwnode = dev_fwnode(&pdev->dev); 471 + 472 + charger->channel_vusb = devm_iio_channel_get(&pdev->dev, "vusb"); 473 + if (IS_ERR(charger->channel_vusb)) { 474 + ret = PTR_ERR(charger->channel_vusb); 475 + if (ret == -EPROBE_DEFER) 476 + return ret; /* iio not ready */ 477 + dev_warn(&pdev->dev, "could not request vusb iio channel (%d)", 478 + ret); 479 + charger->channel_vusb = NULL; 480 + } 481 + 482 + charger->usb = devm_power_supply_register(&pdev->dev, 483 + &twl6030_charger_usb_desc, 484 + &psy_cfg); 485 + if (IS_ERR(charger->usb)) 486 + return dev_err_probe(&pdev->dev, PTR_ERR(charger->usb), 487 + "Failed to register usb\n"); 488 + 489 + ret = power_supply_get_battery_info(charger->usb, &charger->binfo); 490 + if (ret < 0) 491 + return dev_err_probe(&pdev->dev, ret, 492 + "Failed to get battery info\n"); 493 + 494 + dev_info(&pdev->dev, "battery with vmax %d imax: %d\n", 495 + charger->binfo->constant_charge_voltage_max_uv, 496 + charger->binfo->constant_charge_current_max_ua); 497 + 498 + if (charger->binfo->constant_charge_voltage_max_uv == -EINVAL) { 499 + ret = twl6030_charger_read(CHARGERUSB_CTRLLIMIT1, &val); 500 + if (ret < 0) 501 + return ret; 502 + 503 + charger->binfo->constant_charge_voltage_max_uv = 504 + VOREG_TO_UV(val); 505 + } 506 + 507 + if (charger->binfo->constant_charge_voltage_max_uv > 4760000 || 508 + charger->binfo->constant_charge_voltage_max_uv < 350000) 509 + return dev_err_probe(&pdev->dev, -EINVAL, 510 + "Invalid charge voltage\n"); 511 + 512 + if (charger->binfo->constant_charge_current_max_ua == -EINVAL) { 513 + ret = twl6030_charger_read(CHARGERUSB_CTRLLIMIT2, &val); 514 + if (ret < 0) 515 + return ret; 516 + 517 + charger->binfo->constant_charge_current_max_ua = VICHRG_TO_UA(val); 518 + } 519 + 520 + if (charger->binfo->constant_charge_current_max_ua < 100000 || 521 + charger->binfo->constant_charge_current_max_ua > 1500000) { 522 + return dev_err_probe(&pdev->dev, -EINVAL, 523 + "Invalid charge current\n"); 524 + } 525 + 526 + if ((charger->binfo->charge_term_current_ua != -EINVAL) && 527 + (charger->binfo->charge_term_current_ua > 400000 || 528 + charger->binfo->charge_term_current_ua < 50000)) { 529 + return dev_err_probe(&pdev->dev, -EINVAL, 530 + "Invalid charge termination current\n"); 531 + } 532 + 533 + ret = devm_delayed_work_autocancel(&pdev->dev, 534 + &charger->charger_monitor, 535 + twl6030_charger_wdg); 536 + if (ret < 0) 537 + return dev_err_probe(&pdev->dev, ret, 538 + "Failed to register delayed work\n"); 539 + 540 + ret = devm_request_threaded_irq(&pdev->dev, charger->irq_chg, NULL, 541 + twl6030_charger_interrupt, 542 + IRQF_ONESHOT, pdev->name, 543 + charger); 544 + if (ret < 0) 545 + return dev_err_probe(&pdev->dev, ret, 546 + "could not request irq %d\n", 547 + charger->irq_chg); 548 + 549 + /* turing to charging to configure things */ 550 + twl6030_charger_write(CONTROLLER_CTRL1, 0); 551 + twl6030_charger_interrupt(0, charger); 552 + 553 + return 0; 554 + } 555 + 556 + static const struct twl6030_charger_chip_data twl6030_data = { 557 + .extended_current_range = false, 558 + }; 559 + 560 + static const struct twl6030_charger_chip_data twl6032_data = { 561 + .extended_current_range = true, 562 + }; 563 + 564 + static const struct of_device_id twl_charger_of_match[] = { 565 + {.compatible = "ti,twl6030-charger", .data = &twl6030_data}, 566 + {.compatible = "ti,twl6032-charger", .data = &twl6032_data}, 567 + { } 568 + }; 569 + MODULE_DEVICE_TABLE(of, twl_charger_of_match); 570 + 571 + static struct platform_driver twl6030_charger_driver = { 572 + .probe = twl6030_charger_probe, 573 + .driver = { 574 + .name = "twl6030_charger", 575 + .of_match_table = twl_charger_of_match, 576 + }, 577 + }; 578 + module_platform_driver(twl6030_charger_driver); 579 + 580 + MODULE_DESCRIPTION("TWL6030 Battery Charger Interface driver"); 581 + MODULE_LICENSE("GPL");
+1 -1
drivers/power/supply/wm831x_power.c
··· 720 720 721 721 static struct platform_driver wm831x_power_driver = { 722 722 .probe = wm831x_power_probe, 723 - .remove_new = wm831x_power_remove, 723 + .remove = wm831x_power_remove, 724 724 .driver = { 725 725 .name = "wm831x-power", 726 726 },
+1 -1
drivers/power/supply/wm8350_power.c
··· 577 577 578 578 static struct platform_driver wm8350_power_driver = { 579 579 .probe = wm8350_power_probe, 580 - .remove_new = wm8350_power_remove, 580 + .remove = wm8350_power_remove, 581 581 .driver = { 582 582 .name = "wm8350-power", 583 583 },
+1 -1
drivers/power/supply/wm97xx_battery.c
··· 265 265 #endif 266 266 }, 267 267 .probe = wm97xx_bat_probe, 268 - .remove_new = wm97xx_bat_remove, 268 + .remove = wm97xx_bat_remove, 269 269 }; 270 270 271 271 module_platform_driver(wm97xx_bat_driver);
+7 -28
include/linux/power_supply.h
··· 236 236 237 237 char **supplied_to; 238 238 size_t num_supplicants; 239 + 240 + bool no_wakeup_source; 239 241 }; 240 242 241 243 /* Description of power supply */ ··· 752 750 int temp_alert_max; 753 751 int temp_min; 754 752 int temp_max; 755 - struct power_supply_battery_ocv_table *ocv_table[POWER_SUPPLY_OCV_TEMP_MAX]; 753 + const struct power_supply_battery_ocv_table *ocv_table[POWER_SUPPLY_OCV_TEMP_MAX]; 756 754 int ocv_table_size[POWER_SUPPLY_OCV_TEMP_MAX]; 757 - struct power_supply_resistance_temp_table *resist_table; 755 + const struct power_supply_resistance_temp_table *resist_table; 758 756 int resist_table_size; 759 757 const struct power_supply_vbat_ri_table *vbat2ri_discharging; 760 758 int vbat2ri_discharging_size; ··· 799 797 extern int power_supply_battery_info_get_prop(struct power_supply_battery_info *info, 800 798 enum power_supply_property psp, 801 799 union power_supply_propval *val); 802 - extern int power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table *table, 800 + extern int power_supply_ocv2cap_simple(const struct power_supply_battery_ocv_table *table, 803 801 int table_len, int ocv); 804 - extern struct power_supply_battery_ocv_table * 802 + extern const struct power_supply_battery_ocv_table * 805 803 power_supply_find_ocv2cap_table(struct power_supply_battery_info *info, 806 804 int temp, int *table_len); 807 805 extern int power_supply_batinfo_ocv2cap(struct power_supply_battery_info *info, 808 806 int ocv, int temp); 809 807 extern int 810 - power_supply_temp2resist_simple(struct power_supply_resistance_temp_table *table, 808 + power_supply_temp2resist_simple(const struct power_supply_resistance_temp_table *table, 811 809 int table_len, int temp); 812 810 extern int power_supply_vbat2ri(struct power_supply_battery_info *info, 813 811 int vbat_uv, bool charging); ··· 865 863 const union power_supply_propval *val) 866 864 { return 0; } 867 865 #endif 868 - extern int power_supply_property_is_writeable(struct power_supply *psy, 869 - enum power_supply_property psp); 870 866 extern void power_supply_external_power_changed(struct power_supply *psy); 871 867 872 868 extern struct power_supply *__must_check ··· 872 872 const struct power_supply_desc *desc, 873 873 const struct power_supply_config *cfg); 874 874 extern struct power_supply *__must_check 875 - power_supply_register_no_ws(struct device *parent, 876 - const struct power_supply_desc *desc, 877 - const struct power_supply_config *cfg); 878 - extern struct power_supply *__must_check 879 875 devm_power_supply_register(struct device *parent, 880 - const struct power_supply_desc *desc, 881 - const struct power_supply_config *cfg); 882 - extern struct power_supply *__must_check 883 - devm_power_supply_register_no_ws(struct device *parent, 884 876 const struct power_supply_desc *desc, 885 877 const struct power_supply_config *cfg); 886 878 extern void power_supply_unregister(struct power_supply *psy); ··· 936 944 937 945 return false; 938 946 } 939 - 940 - #ifdef CONFIG_POWER_SUPPLY_HWMON 941 - int power_supply_add_hwmon_sysfs(struct power_supply *psy); 942 - void power_supply_remove_hwmon_sysfs(struct power_supply *psy); 943 - #else 944 - static inline int power_supply_add_hwmon_sysfs(struct power_supply *psy) 945 - { 946 - return 0; 947 - } 948 - 949 - static inline 950 - void power_supply_remove_hwmon_sysfs(struct power_supply *psy) {} 951 - #endif 952 947 953 948 #ifdef CONFIG_SYSFS 954 949 ssize_t power_supply_charge_behaviour_show(struct device *dev,