Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-v6.11' 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:
- new charging_orange_full_green RGB LED trigger
- simplify and cleanup power-supply LED trigger code
- expose power information via hwmon compatibility layer

New hardware support:
- enable battery support for Qualcomm Snapdragon X Elite
- new battery driver for Maxim MAX17201/MAX17205
- new battery driver for Lenovo Yoga C630 laptop (custom EC)

Cleanups:
- cleanup 'struct i2c_device_id' initializations
- misc small battery driver cleanups and fixes"

* tag 'for-v6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply:
power: supply: sysfs: use power_supply_property_is_writeable()
power: supply: qcom_battmgr: Enable battery support on x1e80100
power: supply: add support for MAX1720x standalone fuel gauge
dt-bindings: power: supply: add support for MAX17201/MAX17205 fuel gauge
power: reset: piix4: add missing MODULE_DESCRIPTION() macro
power: supply: samsung-sdi-battery: Constify struct power_supply_maintenance_charge_table
power: supply: samsung-sdi-battery: Constify struct power_supply_vbat_ri_table
power: supply: lenovo_yoga_c630_battery: add Lenovo C630 driver
power: supply: ingenic: Fix some error handling paths in ingenic_battery_get_property()
power: supply: ab8500: Clean some error messages
power: supply: ab8500: Use iio_read_channel_processed_scale()
power: supply: ab8500: Fix error handling when calling iio_read_channel_processed()
power: supply: hwmon: Add support for power sensors
power: supply: ab8500: remove unused struct 'inst_curr_result_list'
power: supply: bd99954: remove unused struct 'battery_data'
power: supply: leds: Add activate() callback to triggers
power: supply: leds: Share trig pointer for online and charging_full
power: supply: leds: Add power_supply_[un]register_led_trigger()
power: supply: Drop explicit initialization of struct i2c_device_id::driver_data to 0

+1129 -163
+58
Documentation/devicetree/bindings/power/supply/maxim,max17201.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/maxim,max17201.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Maxim MAX17201 fuel gauge 8 + 9 + maintainers: 10 + - Dimitri Fedrau <dima.fedrau@gmail.com> 11 + 12 + allOf: 13 + - $ref: power-supply.yaml# 14 + 15 + properties: 16 + compatible: 17 + oneOf: 18 + - const: maxim,max17201 19 + - items: 20 + - enum: 21 + - maxim,max17205 22 + - const: maxim,max17201 23 + 24 + reg: 25 + items: 26 + - description: ModelGauge m5 registers 27 + - description: Nonvolatile registers 28 + 29 + reg-names: 30 + items: 31 + - const: m5 32 + - const: nvmem 33 + 34 + interrupts: 35 + maxItems: 1 36 + 37 + required: 38 + - compatible 39 + - reg 40 + - reg-names 41 + 42 + unevaluatedProperties: false 43 + 44 + examples: 45 + - | 46 + #include <dt-bindings/interrupt-controller/irq.h> 47 + i2c { 48 + #address-cells = <1>; 49 + #size-cells = <0>; 50 + 51 + fuel-gauge@36 { 52 + compatible = "maxim,max17201"; 53 + reg = <0x36>, <0xb>; 54 + reg-names = "m5", "nvmem"; 55 + interrupt-parent = <&gpio0>; 56 + interrupts = <31 IRQ_TYPE_LEVEL_LOW>; 57 + }; 58 + };
+1
drivers/power/reset/piix4-poweroff.c
··· 106 106 107 107 module_pci_driver(piix4_poweroff_driver); 108 108 MODULE_AUTHOR("Paul Burton <paul.burton@mips.com>"); 109 + MODULE_DESCRIPTION("Intel PIIX4 power-off driver"); 109 110 MODULE_LICENSE("GPL");
+21
drivers/power/supply/Kconfig
··· 167 167 help 168 168 Say Y here to enable support for the LEGO MINDSTORMS EV3 battery. 169 169 170 + config BATTERY_LENOVO_YOGA_C630 171 + tristate "Lenovo Yoga C630 battery" 172 + depends on EC_LENOVO_YOGA_C630 173 + help 174 + This driver enables battery support on the Lenovo Yoga C630 laptop. 175 + 176 + To compile the driver as a module, choose M here: the module will be 177 + called lenovo_yoga_c630_battery. 178 + 170 179 config BATTERY_PMU 171 180 tristate "Apple PMU battery" 172 181 depends on PPC32 && ADB_PMU ··· 410 401 max17055, max77693, max77849. 411 402 412 403 Driver can be build as a module (max17042_battery). 404 + 405 + config BATTERY_MAX1720X 406 + tristate "Maxim MAX17201/MAX17205 Fuel Gauge" 407 + depends on I2C 408 + select REGMAP_I2C 409 + help 410 + MAX1720x is a family of fuel-gauge systems for lithium-ion (Li+) 411 + batteries in handheld and portable equipment. MAX17201 are 412 + configured to operate with a single lithium cell, the MAX17205 413 + can operate with multiple cells. 414 + 415 + Say Y to include support for the MAX17201/MAX17205 Fuel Gauges. 413 416 414 417 config BATTERY_MAX1721X 415 418 tristate "MAX17211/MAX17215 standalone gas-gauge"
+2
drivers/power/supply/Makefile
··· 32 32 obj-$(CONFIG_BATTERY_GAUGE_LTC2941) += ltc2941-battery-gauge.o 33 33 obj-$(CONFIG_BATTERY_GOLDFISH) += goldfish_battery.o 34 34 obj-$(CONFIG_BATTERY_LEGO_EV3) += lego_ev3_battery.o 35 + obj-$(CONFIG_BATTERY_LENOVO_YOGA_C630) += lenovo_yoga_c630_battery.o 35 36 obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o 36 37 obj-$(CONFIG_BATTERY_QCOM_BATTMGR) += qcom_battmgr.o 37 38 obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o ··· 53 52 obj-$(CONFIG_BATTERY_DA9150) += da9150-fg.o 54 53 obj-$(CONFIG_BATTERY_MAX17040) += max17040_battery.o 55 54 obj-$(CONFIG_BATTERY_MAX17042) += max17042_battery.o 55 + obj-$(CONFIG_BATTERY_MAX1720X) += max1720x_battery.o 56 56 obj-$(CONFIG_BATTERY_MAX1721X) += max1721x_battery.o 57 57 obj-$(CONFIG_BATTERY_RT5033) += rt5033_battery.o 58 58 obj-$(CONFIG_CHARGER_RT5033) += rt5033_charger.o
+1 -1
drivers/power/supply/ab8500_chargalg.c
··· 1225 1225 */ 1226 1226 static void ab8500_chargalg_algorithm(struct ab8500_chargalg *di) 1227 1227 { 1228 + const struct power_supply_maintenance_charge_table *mt; 1228 1229 struct power_supply_battery_info *bi = di->bm->bi; 1229 - struct power_supply_maintenance_charge_table *mt; 1230 1230 int charger_status; 1231 1231 int ret; 1232 1232
+32 -20
drivers/power/supply/ab8500_charger.c
··· 487 487 488 488 /* Only measure voltage if the charger is connected */ 489 489 if (di->ac.charger_connected) { 490 - ret = iio_read_channel_processed(di->adc_main_charger_v, &vch); 491 - if (ret < 0) 492 - dev_err(di->dev, "%s ADC conv failed,\n", __func__); 490 + /* Convert to microvolt, IIO returns millivolt */ 491 + ret = iio_read_channel_processed_scale(di->adc_main_charger_v, 492 + &vch, 1000); 493 + if (ret < 0) { 494 + dev_err(di->dev, "%s ADC conv failed\n", __func__); 495 + return ret; 496 + } 493 497 } else { 494 498 vch = 0; 495 499 } 496 - /* Convert to microvolt, IIO returns millivolt */ 497 - return vch * 1000; 500 + return vch; 498 501 } 499 502 500 503 /** ··· 542 539 543 540 /* Only measure voltage if the charger is connected */ 544 541 if (di->usb.charger_connected) { 545 - ret = iio_read_channel_processed(di->adc_vbus_v, &vch); 546 - if (ret < 0) 547 - dev_err(di->dev, "%s ADC conv failed,\n", __func__); 542 + /* Convert to microvolt, IIO returns millivolt */ 543 + ret = iio_read_channel_processed_scale(di->adc_vbus_v, 544 + &vch, 1000); 545 + if (ret < 0) { 546 + dev_err(di->dev, "%s ADC conv failed\n", __func__); 547 + return ret; 548 + } 548 549 } else { 549 550 vch = 0; 550 551 } 551 - /* Convert to microvolt, IIO returns millivolt */ 552 - return vch * 1000; 552 + return vch; 553 553 } 554 554 555 555 /** ··· 568 562 569 563 /* Only measure current if the charger is online */ 570 564 if (di->usb.charger_online) { 571 - ret = iio_read_channel_processed(di->adc_usb_charger_c, &ich); 572 - if (ret < 0) 573 - dev_err(di->dev, "%s ADC conv failed,\n", __func__); 565 + /* Return microamperes */ 566 + ret = iio_read_channel_processed_scale(di->adc_usb_charger_c, 567 + &ich, 1000); 568 + if (ret < 0) { 569 + dev_err(di->dev, "%s ADC conv failed\n", __func__); 570 + return ret; 571 + } 574 572 } else { 575 573 ich = 0; 576 574 } 577 - /* Return microamperes */ 578 - return ich * 1000; 575 + return ich; 579 576 } 580 577 581 578 /** ··· 594 585 595 586 /* Only measure current if the charger is online */ 596 587 if (di->ac.charger_online) { 597 - ret = iio_read_channel_processed(di->adc_main_charger_c, &ich); 598 - if (ret < 0) 599 - dev_err(di->dev, "%s ADC conv failed,\n", __func__); 588 + /* Return microamperes */ 589 + ret = iio_read_channel_processed_scale(di->adc_main_charger_c, 590 + &ich, 1000); 591 + if (ret < 0) { 592 + dev_err(di->dev, "%s ADC conv failed\n", __func__); 593 + return ret; 594 + } 600 595 } else { 601 596 ich = 0; 602 597 } 603 - /* Return microamperes */ 604 - return ich * 1000; 598 + return ich; 605 599 } 606 600 607 601 /**
-5
drivers/power/supply/ab8500_fg.c
··· 149 149 bool batt_id_received; 150 150 }; 151 151 152 - struct inst_curr_result_list { 153 - struct list_head list; 154 - int *result; 155 - }; 156 - 157 152 /** 158 153 * struct ab8500_fg - ab8500 FG device information 159 154 * @dev: Pointer to the structure device
+1 -1
drivers/power/supply/adp5061.c
··· 727 727 } 728 728 729 729 static const struct i2c_device_id adp5061_id[] = { 730 - { "adp5061", 0}, 730 + { "adp5061" }, 731 731 { } 732 732 }; 733 733 MODULE_DEVICE_TABLE(i2c, adp5061_id);
-7
drivers/power/supply/bd99954-charger.c
··· 70 70 71 71 #include "bd99954-charger.h" 72 72 73 - struct battery_data { 74 - u16 precharge_current; /* Trickle-charge Current */ 75 - u16 fc_reg_voltage; /* Fast Charging Regulation Voltage */ 76 - u16 voltage_min; 77 - u16 voltage_max; 78 - }; 79 - 80 73 /* Initial field values, converted to initial register values */ 81 74 struct bd9995x_init_data { 82 75 u16 vsysreg_set; /* VSYS Regulation Setting */
+1 -1
drivers/power/supply/bq24735-charger.c
··· 489 489 } 490 490 491 491 static const struct i2c_device_id bq24735_charger_id[] = { 492 - { "bq24735-charger", 0 }, 492 + { "bq24735-charger" }, 493 493 {} 494 494 }; 495 495 MODULE_DEVICE_TABLE(i2c, bq24735_charger_id);
+5 -5
drivers/power/supply/bq25890_charger.c
··· 1617 1617 }; 1618 1618 1619 1619 static const struct i2c_device_id bq25890_i2c_ids[] = { 1620 - { "bq25890", 0 }, 1621 - { "bq25892", 0 }, 1622 - { "bq25895", 0 }, 1623 - { "bq25896", 0 }, 1624 - {}, 1620 + { "bq25890" }, 1621 + { "bq25892" }, 1622 + { "bq25895" }, 1623 + { "bq25896" }, 1624 + {} 1625 1625 }; 1626 1626 MODULE_DEVICE_TABLE(i2c, bq25890_i2c_ids); 1627 1627
+1 -1
drivers/power/supply/cw2015_battery.c
··· 731 731 static SIMPLE_DEV_PM_OPS(cw_bat_pm_ops, cw_bat_suspend, cw_bat_resume); 732 732 733 733 static const struct i2c_device_id cw_bat_id_table[] = { 734 - { "cw2015", 0 }, 734 + { "cw2015" }, 735 735 { } 736 736 }; 737 737
+6 -4
drivers/power/supply/ingenic-battery.c
··· 31 31 32 32 switch (psp) { 33 33 case POWER_SUPPLY_PROP_HEALTH: 34 - ret = iio_read_channel_processed(bat->channel, &val->intval); 35 - val->intval *= 1000; 34 + ret = iio_read_channel_processed_scale(bat->channel, 35 + &val->intval, 36 + 1000); 36 37 if (val->intval < info->voltage_min_design_uv) 37 38 val->intval = POWER_SUPPLY_HEALTH_DEAD; 38 39 else if (val->intval > info->voltage_max_design_uv) ··· 42 41 val->intval = POWER_SUPPLY_HEALTH_GOOD; 43 42 return ret; 44 43 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 45 - ret = iio_read_channel_processed(bat->channel, &val->intval); 46 - val->intval *= 1000; 44 + ret = iio_read_channel_processed_scale(bat->channel, 45 + &val->intval, 46 + 1000); 47 47 return ret; 48 48 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: 49 49 val->intval = info->voltage_min_design_uv;
+501
drivers/power/supply/lenovo_yoga_c630_battery.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (c) 2022-2024, Linaro Ltd 4 + * Authors: 5 + * Bjorn Andersson 6 + * Dmitry Baryshkov 7 + */ 8 + #include <linux/auxiliary_bus.h> 9 + #include <linux/bits.h> 10 + #include <linux/cleanup.h> 11 + #include <linux/delay.h> 12 + #include <linux/jiffies.h> 13 + #include <linux/module.h> 14 + #include <linux/mutex.h> 15 + #include <linux/notifier.h> 16 + #include <linux/power_supply.h> 17 + #include <linux/platform_data/lenovo-yoga-c630.h> 18 + 19 + struct yoga_c630_psy { 20 + struct yoga_c630_ec *ec; 21 + struct device *dev; 22 + struct fwnode_handle *fwnode; 23 + struct notifier_block nb; 24 + 25 + /* guards all battery properties and registration of power supplies */ 26 + struct mutex lock; 27 + 28 + struct power_supply *adp_psy; 29 + struct power_supply *bat_psy; 30 + 31 + unsigned long last_status_update; 32 + 33 + bool adapter_online; 34 + 35 + bool unit_mA; 36 + 37 + bool bat_present; 38 + unsigned int bat_status; 39 + unsigned int design_capacity; 40 + unsigned int design_voltage; 41 + unsigned int full_charge_capacity; 42 + 43 + unsigned int capacity_now; 44 + unsigned int voltage_now; 45 + 46 + int current_now; 47 + int rate_now; 48 + }; 49 + 50 + #define LENOVO_EC_CACHE_TIME (10 * HZ) 51 + 52 + #define LENOVO_EC_ADPT_STATUS 0xa3 53 + #define LENOVO_EC_ADPT_STATUS_PRESENT BIT(7) 54 + #define LENOVO_EC_BAT_ATTRIBUTES 0xc0 55 + #define LENOVO_EC_BAT_ATTRIBUTES_UNIT_IS_MA BIT(1) 56 + #define LENOVO_EC_BAT_STATUS 0xc1 57 + #define LENOVO_EC_BAT_STATUS_DISCHARGING BIT(0) 58 + #define LENOVO_EC_BAT_STATUS_CHARGING BIT(1) 59 + #define LENOVO_EC_BAT_REMAIN_CAPACITY 0xc2 60 + #define LENOVO_EC_BAT_VOLTAGE 0xc6 61 + #define LENOVO_EC_BAT_DESIGN_VOLTAGE 0xc8 62 + #define LENOVO_EC_BAT_DESIGN_CAPACITY 0xca 63 + #define LENOVO_EC_BAT_FULL_CAPACITY 0xcc 64 + #define LENOVO_EC_BAT_CURRENT 0xd2 65 + #define LENOVO_EC_BAT_FULL_FACTORY 0xd6 66 + #define LENOVO_EC_BAT_PRESENT 0xda 67 + #define LENOVO_EC_BAT_PRESENT_IS_PRESENT BIT(0) 68 + #define LENOVO_EC_BAT_FULL_REGISTER 0xdb 69 + #define LENOVO_EC_BAT_FULL_REGISTER_IS_FACTORY BIT(0) 70 + 71 + static int yoga_c630_psy_update_bat_info(struct yoga_c630_psy *ecbat) 72 + { 73 + struct yoga_c630_ec *ec = ecbat->ec; 74 + int val; 75 + 76 + lockdep_assert_held(&ecbat->lock); 77 + 78 + val = yoga_c630_ec_read8(ec, LENOVO_EC_BAT_PRESENT); 79 + if (val < 0) 80 + return val; 81 + ecbat->bat_present = !!(val & LENOVO_EC_BAT_PRESENT_IS_PRESENT); 82 + if (!ecbat->bat_present) 83 + return val; 84 + 85 + val = yoga_c630_ec_read8(ec, LENOVO_EC_BAT_ATTRIBUTES); 86 + if (val < 0) 87 + return val; 88 + ecbat->unit_mA = val & LENOVO_EC_BAT_ATTRIBUTES_UNIT_IS_MA; 89 + 90 + val = yoga_c630_ec_read16(ec, LENOVO_EC_BAT_DESIGN_CAPACITY); 91 + if (val < 0) 92 + return val; 93 + ecbat->design_capacity = val * 1000; 94 + 95 + /* 96 + * DSDT has delays after most of EC reads in these methods. 97 + * Having no documentation for the EC we have to follow and sleep here. 98 + */ 99 + msleep(50); 100 + 101 + val = yoga_c630_ec_read16(ec, LENOVO_EC_BAT_DESIGN_VOLTAGE); 102 + if (val < 0) 103 + return val; 104 + ecbat->design_voltage = val; 105 + 106 + msleep(50); 107 + 108 + val = yoga_c630_ec_read8(ec, LENOVO_EC_BAT_FULL_REGISTER); 109 + if (val < 0) 110 + return val; 111 + val = yoga_c630_ec_read16(ec, 112 + val & LENOVO_EC_BAT_FULL_REGISTER_IS_FACTORY ? 113 + LENOVO_EC_BAT_FULL_FACTORY : 114 + LENOVO_EC_BAT_FULL_CAPACITY); 115 + if (val < 0) 116 + return val; 117 + 118 + ecbat->full_charge_capacity = val * 1000; 119 + 120 + if (!ecbat->unit_mA) { 121 + ecbat->design_capacity *= 10; 122 + ecbat->full_charge_capacity *= 10; 123 + } 124 + 125 + return 0; 126 + } 127 + 128 + static int yoga_c630_psy_maybe_update_bat_status(struct yoga_c630_psy *ecbat) 129 + { 130 + struct yoga_c630_ec *ec = ecbat->ec; 131 + int current_mA; 132 + int val; 133 + 134 + guard(mutex)(&ecbat->lock); 135 + if (time_before(jiffies, ecbat->last_status_update + LENOVO_EC_CACHE_TIME)) 136 + return 0; 137 + 138 + val = yoga_c630_ec_read8(ec, LENOVO_EC_BAT_STATUS); 139 + if (val < 0) 140 + return val; 141 + ecbat->bat_status = val; 142 + 143 + msleep(50); 144 + 145 + val = yoga_c630_ec_read16(ec, LENOVO_EC_BAT_REMAIN_CAPACITY); 146 + if (val < 0) 147 + return val; 148 + ecbat->capacity_now = val * 1000; 149 + 150 + msleep(50); 151 + 152 + val = yoga_c630_ec_read16(ec, LENOVO_EC_BAT_VOLTAGE); 153 + if (val < 0) 154 + return val; 155 + ecbat->voltage_now = val * 1000; 156 + 157 + msleep(50); 158 + 159 + val = yoga_c630_ec_read16(ec, LENOVO_EC_BAT_CURRENT); 160 + if (val < 0) 161 + return val; 162 + current_mA = sign_extend32(val, 15); 163 + ecbat->current_now = current_mA * 1000; 164 + ecbat->rate_now = current_mA * (ecbat->voltage_now / 1000); 165 + 166 + msleep(50); 167 + 168 + if (!ecbat->unit_mA) 169 + ecbat->capacity_now *= 10; 170 + 171 + ecbat->last_status_update = jiffies; 172 + 173 + return 0; 174 + } 175 + 176 + static int yoga_c630_psy_update_adapter_status(struct yoga_c630_psy *ecbat) 177 + { 178 + struct yoga_c630_ec *ec = ecbat->ec; 179 + int val; 180 + 181 + guard(mutex)(&ecbat->lock); 182 + 183 + val = yoga_c630_ec_read8(ec, LENOVO_EC_ADPT_STATUS); 184 + if (val < 0) 185 + return val; 186 + 187 + ecbat->adapter_online = !!(val & LENOVO_EC_ADPT_STATUS_PRESENT); 188 + 189 + return 0; 190 + } 191 + 192 + static bool yoga_c630_psy_is_charged(struct yoga_c630_psy *ecbat) 193 + { 194 + if (ecbat->bat_status != 0) 195 + return false; 196 + 197 + if (ecbat->full_charge_capacity <= ecbat->capacity_now) 198 + return true; 199 + 200 + if (ecbat->design_capacity <= ecbat->capacity_now) 201 + return true; 202 + 203 + return false; 204 + } 205 + 206 + static int yoga_c630_psy_bat_get_property(struct power_supply *psy, 207 + enum power_supply_property psp, 208 + union power_supply_propval *val) 209 + { 210 + struct yoga_c630_psy *ecbat = power_supply_get_drvdata(psy); 211 + int rc = 0; 212 + 213 + if (!ecbat->bat_present && psp != POWER_SUPPLY_PROP_PRESENT) 214 + return -ENODEV; 215 + 216 + rc = yoga_c630_psy_maybe_update_bat_status(ecbat); 217 + if (rc) 218 + return rc; 219 + 220 + switch (psp) { 221 + case POWER_SUPPLY_PROP_STATUS: 222 + if (ecbat->bat_status & LENOVO_EC_BAT_STATUS_DISCHARGING) 223 + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; 224 + else if (ecbat->bat_status & LENOVO_EC_BAT_STATUS_CHARGING) 225 + val->intval = POWER_SUPPLY_STATUS_CHARGING; 226 + else if (yoga_c630_psy_is_charged(ecbat)) 227 + val->intval = POWER_SUPPLY_STATUS_FULL; 228 + else 229 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; 230 + break; 231 + case POWER_SUPPLY_PROP_PRESENT: 232 + val->intval = ecbat->bat_present; 233 + break; 234 + case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: 235 + val->intval = ecbat->design_voltage; 236 + break; 237 + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: 238 + case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: 239 + val->intval = ecbat->design_capacity; 240 + break; 241 + case POWER_SUPPLY_PROP_CHARGE_FULL: 242 + case POWER_SUPPLY_PROP_ENERGY_FULL: 243 + val->intval = ecbat->full_charge_capacity; 244 + break; 245 + case POWER_SUPPLY_PROP_CHARGE_NOW: 246 + case POWER_SUPPLY_PROP_ENERGY_NOW: 247 + val->intval = ecbat->capacity_now; 248 + break; 249 + case POWER_SUPPLY_PROP_CURRENT_NOW: 250 + val->intval = ecbat->current_now; 251 + break; 252 + case POWER_SUPPLY_PROP_POWER_NOW: 253 + val->intval = ecbat->rate_now; 254 + break; 255 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 256 + val->intval = ecbat->voltage_now; 257 + break; 258 + case POWER_SUPPLY_PROP_TECHNOLOGY: 259 + val->intval = POWER_SUPPLY_TECHNOLOGY_LION; 260 + break; 261 + case POWER_SUPPLY_PROP_MODEL_NAME: 262 + val->strval = "PABAS0241231"; 263 + break; 264 + case POWER_SUPPLY_PROP_MANUFACTURER: 265 + val->strval = "Compal"; 266 + break; 267 + case POWER_SUPPLY_PROP_SCOPE: 268 + val->intval = POWER_SUPPLY_SCOPE_SYSTEM; 269 + break; 270 + default: 271 + rc = -EINVAL; 272 + break; 273 + } 274 + 275 + return rc; 276 + } 277 + 278 + static enum power_supply_property yoga_c630_psy_bat_mA_properties[] = { 279 + POWER_SUPPLY_PROP_STATUS, 280 + POWER_SUPPLY_PROP_PRESENT, 281 + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, 282 + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, 283 + POWER_SUPPLY_PROP_CHARGE_FULL, 284 + POWER_SUPPLY_PROP_CHARGE_NOW, 285 + POWER_SUPPLY_PROP_CURRENT_NOW, 286 + POWER_SUPPLY_PROP_POWER_NOW, 287 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 288 + POWER_SUPPLY_PROP_TECHNOLOGY, 289 + POWER_SUPPLY_PROP_MODEL_NAME, 290 + POWER_SUPPLY_PROP_MANUFACTURER, 291 + POWER_SUPPLY_PROP_SCOPE, 292 + }; 293 + 294 + static enum power_supply_property yoga_c630_psy_bat_mWh_properties[] = { 295 + POWER_SUPPLY_PROP_STATUS, 296 + POWER_SUPPLY_PROP_PRESENT, 297 + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, 298 + POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, 299 + POWER_SUPPLY_PROP_ENERGY_FULL, 300 + POWER_SUPPLY_PROP_ENERGY_NOW, 301 + POWER_SUPPLY_PROP_CURRENT_NOW, 302 + POWER_SUPPLY_PROP_POWER_NOW, 303 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 304 + POWER_SUPPLY_PROP_TECHNOLOGY, 305 + POWER_SUPPLY_PROP_MODEL_NAME, 306 + POWER_SUPPLY_PROP_MANUFACTURER, 307 + POWER_SUPPLY_PROP_SCOPE, 308 + }; 309 + 310 + static const struct power_supply_desc yoga_c630_psy_bat_psy_desc_mA = { 311 + .name = "yoga-c630-battery", 312 + .type = POWER_SUPPLY_TYPE_BATTERY, 313 + .properties = yoga_c630_psy_bat_mA_properties, 314 + .num_properties = ARRAY_SIZE(yoga_c630_psy_bat_mA_properties), 315 + .get_property = yoga_c630_psy_bat_get_property, 316 + }; 317 + 318 + static const struct power_supply_desc yoga_c630_psy_bat_psy_desc_mWh = { 319 + .name = "yoga-c630-battery", 320 + .type = POWER_SUPPLY_TYPE_BATTERY, 321 + .properties = yoga_c630_psy_bat_mWh_properties, 322 + .num_properties = ARRAY_SIZE(yoga_c630_psy_bat_mWh_properties), 323 + .get_property = yoga_c630_psy_bat_get_property, 324 + }; 325 + 326 + static int yoga_c630_psy_adpt_get_property(struct power_supply *psy, 327 + enum power_supply_property psp, 328 + union power_supply_propval *val) 329 + { 330 + struct yoga_c630_psy *ecbat = power_supply_get_drvdata(psy); 331 + int ret = 0; 332 + 333 + ret = yoga_c630_psy_update_adapter_status(ecbat); 334 + if (ret < 0) 335 + return ret; 336 + 337 + switch (psp) { 338 + case POWER_SUPPLY_PROP_ONLINE: 339 + val->intval = ecbat->adapter_online; 340 + break; 341 + case POWER_SUPPLY_PROP_USB_TYPE: 342 + val->intval = POWER_SUPPLY_USB_TYPE_C; 343 + break; 344 + default: 345 + return -EINVAL; 346 + } 347 + 348 + return 0; 349 + } 350 + 351 + static enum power_supply_property yoga_c630_psy_adpt_properties[] = { 352 + POWER_SUPPLY_PROP_ONLINE, 353 + POWER_SUPPLY_PROP_USB_TYPE, 354 + }; 355 + 356 + static const enum power_supply_usb_type yoga_c630_psy_adpt_usb_type[] = { 357 + POWER_SUPPLY_USB_TYPE_C, 358 + }; 359 + 360 + static const struct power_supply_desc yoga_c630_psy_adpt_psy_desc = { 361 + .name = "yoga-c630-adapter", 362 + .type = POWER_SUPPLY_TYPE_USB, 363 + .usb_types = yoga_c630_psy_adpt_usb_type, 364 + .num_usb_types = ARRAY_SIZE(yoga_c630_psy_adpt_usb_type), 365 + .properties = yoga_c630_psy_adpt_properties, 366 + .num_properties = ARRAY_SIZE(yoga_c630_psy_adpt_properties), 367 + .get_property = yoga_c630_psy_adpt_get_property, 368 + }; 369 + 370 + static int yoga_c630_psy_register_bat_psy(struct yoga_c630_psy *ecbat) 371 + { 372 + struct power_supply_config bat_cfg = {}; 373 + 374 + bat_cfg.drv_data = ecbat; 375 + bat_cfg.fwnode = ecbat->fwnode; 376 + ecbat->bat_psy = power_supply_register_no_ws(ecbat->dev, 377 + ecbat->unit_mA ? 378 + &yoga_c630_psy_bat_psy_desc_mA : 379 + &yoga_c630_psy_bat_psy_desc_mWh, 380 + &bat_cfg); 381 + if (IS_ERR(ecbat->bat_psy)) { 382 + dev_err(ecbat->dev, "failed to register battery supply\n"); 383 + return PTR_ERR(ecbat->bat_psy); 384 + } 385 + 386 + return 0; 387 + } 388 + 389 + static void yoga_c630_ec_refresh_bat_info(struct yoga_c630_psy *ecbat) 390 + { 391 + bool current_unit; 392 + 393 + guard(mutex)(&ecbat->lock); 394 + 395 + current_unit = ecbat->unit_mA; 396 + 397 + yoga_c630_psy_update_bat_info(ecbat); 398 + 399 + if (current_unit != ecbat->unit_mA) { 400 + power_supply_unregister(ecbat->bat_psy); 401 + yoga_c630_psy_register_bat_psy(ecbat); 402 + } 403 + } 404 + 405 + static int yoga_c630_psy_notify(struct notifier_block *nb, 406 + unsigned long action, void *data) 407 + { 408 + struct yoga_c630_psy *ecbat = container_of(nb, struct yoga_c630_psy, nb); 409 + 410 + switch (action) { 411 + case LENOVO_EC_EVENT_BAT_INFO: 412 + yoga_c630_ec_refresh_bat_info(ecbat); 413 + break; 414 + case LENOVO_EC_EVENT_BAT_ADPT_STATUS: 415 + power_supply_changed(ecbat->adp_psy); 416 + fallthrough; 417 + case LENOVO_EC_EVENT_BAT_STATUS: 418 + power_supply_changed(ecbat->bat_psy); 419 + break; 420 + } 421 + 422 + return NOTIFY_OK; 423 + } 424 + 425 + static int yoga_c630_psy_probe(struct auxiliary_device *adev, 426 + const struct auxiliary_device_id *id) 427 + { 428 + struct yoga_c630_ec *ec = adev->dev.platform_data; 429 + struct power_supply_config adp_cfg = {}; 430 + struct device *dev = &adev->dev; 431 + struct yoga_c630_psy *ecbat; 432 + int ret; 433 + 434 + ecbat = devm_kzalloc(&adev->dev, sizeof(*ecbat), GFP_KERNEL); 435 + if (!ecbat) 436 + return -ENOMEM; 437 + 438 + ecbat->ec = ec; 439 + ecbat->dev = dev; 440 + mutex_init(&ecbat->lock); 441 + ecbat->fwnode = adev->dev.parent->fwnode; 442 + ecbat->nb.notifier_call = yoga_c630_psy_notify; 443 + 444 + auxiliary_set_drvdata(adev, ecbat); 445 + 446 + adp_cfg.drv_data = ecbat; 447 + adp_cfg.fwnode = ecbat->fwnode; 448 + adp_cfg.supplied_to = (char **)&yoga_c630_psy_bat_psy_desc_mA.name; 449 + adp_cfg.num_supplicants = 1; 450 + ecbat->adp_psy = devm_power_supply_register_no_ws(dev, &yoga_c630_psy_adpt_psy_desc, &adp_cfg); 451 + if (IS_ERR(ecbat->adp_psy)) { 452 + dev_err(dev, "failed to register AC adapter supply\n"); 453 + return PTR_ERR(ecbat->adp_psy); 454 + } 455 + 456 + scoped_guard(mutex, &ecbat->lock) { 457 + ret = yoga_c630_psy_update_bat_info(ecbat); 458 + if (ret) 459 + goto err_unreg_bat; 460 + 461 + ret = yoga_c630_psy_register_bat_psy(ecbat); 462 + if (ret) 463 + goto err_unreg_bat; 464 + } 465 + 466 + ret = yoga_c630_ec_register_notify(ecbat->ec, &ecbat->nb); 467 + if (ret) 468 + goto err_unreg_bat; 469 + 470 + return 0; 471 + 472 + err_unreg_bat: 473 + power_supply_unregister(ecbat->bat_psy); 474 + return ret; 475 + } 476 + 477 + static void yoga_c630_psy_remove(struct auxiliary_device *adev) 478 + { 479 + struct yoga_c630_psy *ecbat = auxiliary_get_drvdata(adev); 480 + 481 + yoga_c630_ec_unregister_notify(ecbat->ec, &ecbat->nb); 482 + power_supply_unregister(ecbat->bat_psy); 483 + } 484 + 485 + static const struct auxiliary_device_id yoga_c630_psy_id_table[] = { 486 + { .name = YOGA_C630_MOD_NAME "." YOGA_C630_DEV_PSY, }, 487 + {} 488 + }; 489 + MODULE_DEVICE_TABLE(auxiliary, yoga_c630_psy_id_table); 490 + 491 + static struct auxiliary_driver yoga_c630_psy_driver = { 492 + .name = YOGA_C630_DEV_PSY, 493 + .id_table = yoga_c630_psy_id_table, 494 + .probe = yoga_c630_psy_probe, 495 + .remove = yoga_c630_psy_remove, 496 + }; 497 + 498 + module_auxiliary_driver(yoga_c630_psy_driver); 499 + 500 + MODULE_DESCRIPTION("Lenovo Yoga C630 psy"); 501 + MODULE_LICENSE("GPL");
+1 -1
drivers/power/supply/lp8727_charger.c
··· 584 584 MODULE_DEVICE_TABLE(of, lp8727_dt_ids); 585 585 586 586 static const struct i2c_device_id lp8727_ids[] = { 587 - {"lp8727", 0}, 587 + { "lp8727" }, 588 588 { } 589 589 }; 590 590 MODULE_DEVICE_TABLE(i2c, lp8727_ids);
+2 -2
drivers/power/supply/ltc4162-l-charger.c
··· 903 903 } 904 904 905 905 static const struct i2c_device_id ltc4162l_i2c_id_table[] = { 906 - { "ltc4162-l", 0 }, 907 - { }, 906 + { "ltc4162-l" }, 907 + { } 908 908 }; 909 909 MODULE_DEVICE_TABLE(i2c, ltc4162l_i2c_id_table); 910 910
+1 -1
drivers/power/supply/max14656_charger_detector.c
··· 300 300 } 301 301 302 302 static const struct i2c_device_id max14656_id[] = { 303 - { "max14656", 0 }, 303 + { "max14656" }, 304 304 {} 305 305 }; 306 306 MODULE_DEVICE_TABLE(i2c, max14656_id);
+337
drivers/power/supply/max1720x_battery.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Fuel gauge driver for Maxim 17201/17205 4 + * 5 + * based on max1721x_battery.c 6 + * 7 + * Copyright (C) 2024 Liebherr-Electronics and Drives GmbH 8 + */ 9 + 10 + #include <linux/bitfield.h> 11 + #include <linux/i2c.h> 12 + #include <linux/module.h> 13 + #include <linux/power_supply.h> 14 + #include <linux/regmap.h> 15 + 16 + #include <asm/unaligned.h> 17 + 18 + /* Nonvolatile registers */ 19 + #define MAX1720X_NRSENSE 0xCF /* RSense in 10^-5 Ohm */ 20 + 21 + /* ModelGauge m5 */ 22 + #define MAX172XX_STATUS 0x00 /* Status */ 23 + #define MAX172XX_STATUS_BAT_ABSENT BIT(3) /* Battery absent */ 24 + #define MAX172XX_REPCAP 0x05 /* Average capacity */ 25 + #define MAX172XX_REPSOC 0x06 /* Percentage of charge */ 26 + #define MAX172XX_TEMP 0x08 /* Temperature */ 27 + #define MAX172XX_CURRENT 0x0A /* Actual current */ 28 + #define MAX172XX_AVG_CURRENT 0x0B /* Average current */ 29 + #define MAX172XX_TTE 0x11 /* Time to empty */ 30 + #define MAX172XX_AVG_TA 0x16 /* Average temperature */ 31 + #define MAX172XX_CYCLES 0x17 32 + #define MAX172XX_DESIGN_CAP 0x18 /* Design capacity */ 33 + #define MAX172XX_AVG_VCELL 0x19 34 + #define MAX172XX_TTF 0x20 /* Time to full */ 35 + #define MAX172XX_DEV_NAME 0x21 /* Device name */ 36 + #define MAX172XX_DEV_NAME_TYPE_MASK GENMASK(3, 0) 37 + #define MAX172XX_DEV_NAME_TYPE_MAX17201 BIT(0) 38 + #define MAX172XX_DEV_NAME_TYPE_MAX17205 (BIT(0) | BIT(2)) 39 + #define MAX172XX_QR_TABLE10 0x22 40 + #define MAX172XX_BATT 0xDA /* Battery voltage */ 41 + #define MAX172XX_ATAVCAP 0xDF 42 + 43 + static const char *const max1720x_manufacturer = "Maxim Integrated"; 44 + static const char *const max17201_model = "MAX17201"; 45 + static const char *const max17205_model = "MAX17205"; 46 + 47 + struct max1720x_device_info { 48 + struct regmap *regmap; 49 + int rsense; 50 + }; 51 + 52 + /* 53 + * Model Gauge M5 Algorithm output register 54 + * Volatile data (must not be cached) 55 + */ 56 + static const struct regmap_range max1720x_volatile_allow[] = { 57 + regmap_reg_range(MAX172XX_STATUS, MAX172XX_CYCLES), 58 + regmap_reg_range(MAX172XX_AVG_VCELL, MAX172XX_TTF), 59 + regmap_reg_range(MAX172XX_QR_TABLE10, MAX172XX_ATAVCAP), 60 + }; 61 + 62 + static const struct regmap_range max1720x_readable_allow[] = { 63 + regmap_reg_range(MAX172XX_STATUS, MAX172XX_ATAVCAP), 64 + }; 65 + 66 + static const struct regmap_range max1720x_readable_deny[] = { 67 + /* unused registers */ 68 + regmap_reg_range(0x24, 0x26), 69 + regmap_reg_range(0x30, 0x31), 70 + regmap_reg_range(0x33, 0x34), 71 + regmap_reg_range(0x37, 0x37), 72 + regmap_reg_range(0x3B, 0x3C), 73 + regmap_reg_range(0x40, 0x41), 74 + regmap_reg_range(0x43, 0x44), 75 + regmap_reg_range(0x47, 0x49), 76 + regmap_reg_range(0x4B, 0x4C), 77 + regmap_reg_range(0x4E, 0xAF), 78 + regmap_reg_range(0xB1, 0xB3), 79 + regmap_reg_range(0xB5, 0xB7), 80 + regmap_reg_range(0xBF, 0xD0), 81 + regmap_reg_range(0xDB, 0xDB), 82 + regmap_reg_range(0xE0, 0xFF), 83 + }; 84 + 85 + static const struct regmap_access_table max1720x_readable_regs = { 86 + .yes_ranges = max1720x_readable_allow, 87 + .n_yes_ranges = ARRAY_SIZE(max1720x_readable_allow), 88 + .no_ranges = max1720x_readable_deny, 89 + .n_no_ranges = ARRAY_SIZE(max1720x_readable_deny), 90 + }; 91 + 92 + static const struct regmap_access_table max1720x_volatile_regs = { 93 + .yes_ranges = max1720x_volatile_allow, 94 + .n_yes_ranges = ARRAY_SIZE(max1720x_volatile_allow), 95 + .no_ranges = max1720x_readable_deny, 96 + .n_no_ranges = ARRAY_SIZE(max1720x_readable_deny), 97 + }; 98 + 99 + static const struct regmap_config max1720x_regmap_cfg = { 100 + .reg_bits = 8, 101 + .val_bits = 16, 102 + .max_register = MAX172XX_ATAVCAP, 103 + .val_format_endian = REGMAP_ENDIAN_LITTLE, 104 + .rd_table = &max1720x_readable_regs, 105 + .volatile_table = &max1720x_volatile_regs, 106 + .cache_type = REGCACHE_RBTREE, 107 + }; 108 + 109 + static const enum power_supply_property max1720x_battery_props[] = { 110 + POWER_SUPPLY_PROP_PRESENT, 111 + POWER_SUPPLY_PROP_CAPACITY, 112 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 113 + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, 114 + POWER_SUPPLY_PROP_CHARGE_AVG, 115 + POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, 116 + POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, 117 + POWER_SUPPLY_PROP_TEMP, 118 + POWER_SUPPLY_PROP_CURRENT_NOW, 119 + POWER_SUPPLY_PROP_CURRENT_AVG, 120 + POWER_SUPPLY_PROP_MODEL_NAME, 121 + POWER_SUPPLY_PROP_MANUFACTURER, 122 + }; 123 + 124 + /* Convert regs value to power_supply units */ 125 + 126 + static int max172xx_time_to_ps(unsigned int reg) 127 + { 128 + return reg * 5625 / 1000; /* in sec. */ 129 + } 130 + 131 + static int max172xx_percent_to_ps(unsigned int reg) 132 + { 133 + return reg / 256; /* in percent from 0 to 100 */ 134 + } 135 + 136 + static int max172xx_voltage_to_ps(unsigned int reg) 137 + { 138 + return reg * 1250; /* in uV */ 139 + } 140 + 141 + static int max172xx_capacity_to_ps(unsigned int reg) 142 + { 143 + return reg * 500; /* in uAh */ 144 + } 145 + 146 + /* 147 + * Current and temperature is signed values, so unsigned regs 148 + * value must be converted to signed type 149 + */ 150 + 151 + static int max172xx_temperature_to_ps(unsigned int reg) 152 + { 153 + int val = (int16_t)reg; 154 + 155 + return val * 10 / 256; /* in tenths of deg. C */ 156 + } 157 + 158 + /* 159 + * Calculating current registers resolution: 160 + * 161 + * RSense stored in 10^-5 Ohm, so mesaurment voltage must be 162 + * in 10^-11 Volts for get current in uA. 163 + * 16 bit current reg fullscale +/-51.2mV is 102400 uV. 164 + * So: 102400 / 65535 * 10^5 = 156252 165 + */ 166 + static int max172xx_current_to_voltage(unsigned int reg) 167 + { 168 + int val = (int16_t)reg; 169 + 170 + return val * 156252; 171 + } 172 + 173 + static int max1720x_battery_get_property(struct power_supply *psy, 174 + enum power_supply_property psp, 175 + union power_supply_propval *val) 176 + { 177 + struct max1720x_device_info *info = power_supply_get_drvdata(psy); 178 + unsigned int reg_val; 179 + int ret = 0; 180 + 181 + switch (psp) { 182 + case POWER_SUPPLY_PROP_PRESENT: 183 + /* 184 + * POWER_SUPPLY_PROP_PRESENT will always readable via 185 + * sysfs interface. Value return 0 if battery not 186 + * present or unaccesable via I2c. 187 + */ 188 + ret = regmap_read(info->regmap, MAX172XX_STATUS, &reg_val); 189 + if (ret < 0) { 190 + val->intval = 0; 191 + return 0; 192 + } 193 + 194 + val->intval = !FIELD_GET(MAX172XX_STATUS_BAT_ABSENT, reg_val); 195 + break; 196 + case POWER_SUPPLY_PROP_CAPACITY: 197 + ret = regmap_read(info->regmap, MAX172XX_REPSOC, &reg_val); 198 + val->intval = max172xx_percent_to_ps(reg_val); 199 + break; 200 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 201 + ret = regmap_read(info->regmap, MAX172XX_BATT, &reg_val); 202 + val->intval = max172xx_voltage_to_ps(reg_val); 203 + break; 204 + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: 205 + ret = regmap_read(info->regmap, MAX172XX_DESIGN_CAP, &reg_val); 206 + val->intval = max172xx_capacity_to_ps(reg_val); 207 + break; 208 + case POWER_SUPPLY_PROP_CHARGE_AVG: 209 + ret = regmap_read(info->regmap, MAX172XX_REPCAP, &reg_val); 210 + val->intval = max172xx_capacity_to_ps(reg_val); 211 + break; 212 + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG: 213 + ret = regmap_read(info->regmap, MAX172XX_TTE, &reg_val); 214 + val->intval = max172xx_time_to_ps(reg_val); 215 + break; 216 + case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG: 217 + ret = regmap_read(info->regmap, MAX172XX_TTF, &reg_val); 218 + val->intval = max172xx_time_to_ps(reg_val); 219 + break; 220 + case POWER_SUPPLY_PROP_TEMP: 221 + ret = regmap_read(info->regmap, MAX172XX_TEMP, &reg_val); 222 + val->intval = max172xx_temperature_to_ps(reg_val); 223 + break; 224 + case POWER_SUPPLY_PROP_CURRENT_NOW: 225 + ret = regmap_read(info->regmap, MAX172XX_CURRENT, &reg_val); 226 + val->intval = max172xx_current_to_voltage(reg_val) / info->rsense; 227 + break; 228 + case POWER_SUPPLY_PROP_CURRENT_AVG: 229 + ret = regmap_read(info->regmap, MAX172XX_AVG_CURRENT, &reg_val); 230 + val->intval = max172xx_current_to_voltage(reg_val) / info->rsense; 231 + break; 232 + case POWER_SUPPLY_PROP_MODEL_NAME: 233 + ret = regmap_read(info->regmap, MAX172XX_DEV_NAME, &reg_val); 234 + reg_val = FIELD_GET(MAX172XX_DEV_NAME_TYPE_MASK, reg_val); 235 + if (reg_val == MAX172XX_DEV_NAME_TYPE_MAX17201) 236 + val->strval = max17201_model; 237 + else if (reg_val == MAX172XX_DEV_NAME_TYPE_MAX17205) 238 + val->strval = max17205_model; 239 + else 240 + return -ENODEV; 241 + break; 242 + case POWER_SUPPLY_PROP_MANUFACTURER: 243 + val->strval = max1720x_manufacturer; 244 + break; 245 + default: 246 + return -EINVAL; 247 + } 248 + 249 + return ret; 250 + } 251 + 252 + static int max1720x_probe_sense_resistor(struct i2c_client *client, 253 + struct max1720x_device_info *info) 254 + { 255 + struct device *dev = &client->dev; 256 + struct i2c_client *ancillary; 257 + int ret; 258 + 259 + ancillary = i2c_new_ancillary_device(client, "nvmem", 0xb); 260 + if (IS_ERR(ancillary)) { 261 + dev_err(dev, "Failed to initialize ancillary i2c device\n"); 262 + return PTR_ERR(ancillary); 263 + } 264 + 265 + ret = i2c_smbus_read_word_data(ancillary, MAX1720X_NRSENSE); 266 + i2c_unregister_device(ancillary); 267 + if (ret < 0) 268 + return ret; 269 + 270 + info->rsense = ret; 271 + if (!info->rsense) { 272 + dev_warn(dev, "RSense not calibrated, set 10 mOhms!\n"); 273 + info->rsense = 1000; /* in regs in 10^-5 */ 274 + } 275 + 276 + return 0; 277 + } 278 + 279 + static const struct power_supply_desc max1720x_bat_desc = { 280 + .name = "max1720x", 281 + .no_thermal = true, 282 + .type = POWER_SUPPLY_TYPE_BATTERY, 283 + .properties = max1720x_battery_props, 284 + .num_properties = ARRAY_SIZE(max1720x_battery_props), 285 + .get_property = max1720x_battery_get_property, 286 + }; 287 + 288 + static int max1720x_probe(struct i2c_client *client) 289 + { 290 + struct power_supply_config psy_cfg = {}; 291 + struct device *dev = &client->dev; 292 + struct max1720x_device_info *info; 293 + struct power_supply *bat; 294 + int ret; 295 + 296 + info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); 297 + if (!info) 298 + return -ENOMEM; 299 + 300 + psy_cfg.drv_data = info; 301 + psy_cfg.fwnode = dev_fwnode(dev); 302 + info->regmap = devm_regmap_init_i2c(client, &max1720x_regmap_cfg); 303 + if (IS_ERR(info->regmap)) 304 + return dev_err_probe(dev, PTR_ERR(info->regmap), 305 + "regmap initialization failed\n"); 306 + 307 + ret = max1720x_probe_sense_resistor(client, info); 308 + if (ret) 309 + return dev_err_probe(dev, ret, 310 + "Failed to read sense resistor value\n"); 311 + 312 + bat = devm_power_supply_register(dev, &max1720x_bat_desc, &psy_cfg); 313 + if (IS_ERR(bat)) 314 + return dev_err_probe(dev, PTR_ERR(bat), 315 + "Failed to register power supply\n"); 316 + 317 + return 0; 318 + } 319 + 320 + static const struct of_device_id max1720x_of_match[] = { 321 + { .compatible = "maxim,max17201" }, 322 + {} 323 + }; 324 + MODULE_DEVICE_TABLE(of, max1720x_of_match); 325 + 326 + static struct i2c_driver max1720x_i2c_driver = { 327 + .driver = { 328 + .name = "max1720x", 329 + .of_match_table = max1720x_of_match, 330 + }, 331 + .probe = max1720x_probe, 332 + }; 333 + module_i2c_driver(max1720x_i2c_driver); 334 + 335 + MODULE_LICENSE("GPL"); 336 + MODULE_AUTHOR("Dimitri Fedrau <dima.fedrau@gmail.com>"); 337 + MODULE_DESCRIPTION("Maxim MAX17201/MAX17205 Fuel Gauge IC driver");
+2 -2
drivers/power/supply/max77976_charger.c
··· 483 483 } 484 484 485 485 static const struct i2c_device_id max77976_i2c_id[] = { 486 - { MAX77976_DRIVER_NAME, 0 }, 487 - { }, 486 + { MAX77976_DRIVER_NAME }, 487 + { } 488 488 }; 489 489 MODULE_DEVICE_TABLE(i2c, max77976_i2c_id); 490 490
+1 -1
drivers/power/supply/mm8013.c
··· 284 284 } 285 285 286 286 static const struct i2c_device_id mm8013_id_table[] = { 287 - { "mm8013", 0 }, 287 + { "mm8013" }, 288 288 {} 289 289 }; 290 290 MODULE_DEVICE_TABLE(i2c, mm8013_id_table);
+2 -2
drivers/power/supply/power_supply_core.c
··· 1024 1024 int power_supply_vbat2ri(struct power_supply_battery_info *info, 1025 1025 int vbat_uv, bool charging) 1026 1026 { 1027 - struct power_supply_vbat_ri_table *vbat2ri; 1027 + const struct power_supply_vbat_ri_table *vbat2ri; 1028 1028 int table_len; 1029 1029 int i, high, low; 1030 1030 ··· 1072 1072 } 1073 1073 EXPORT_SYMBOL_GPL(power_supply_vbat2ri); 1074 1074 1075 - struct power_supply_maintenance_charge_table * 1075 + const struct power_supply_maintenance_charge_table * 1076 1076 power_supply_get_maintenance_charging_setting(struct power_supply_battery_info *info, 1077 1077 int index) 1078 1078 {
+25
drivers/power/supply/power_supply_hwmon.c
··· 48 48 } 49 49 } 50 50 51 + static int power_supply_hwmon_power_to_property(u32 attr) 52 + { 53 + switch (attr) { 54 + case hwmon_power_input: 55 + return POWER_SUPPLY_PROP_POWER_NOW; 56 + case hwmon_power_average: 57 + return POWER_SUPPLY_PROP_POWER_AVG; 58 + default: 59 + return -EINVAL; 60 + } 61 + } 62 + 51 63 static int power_supply_hwmon_temp_to_property(u32 attr, int channel) 52 64 { 53 65 if (channel) { ··· 102 90 return power_supply_hwmon_in_to_property(attr); 103 91 case hwmon_curr: 104 92 return power_supply_hwmon_curr_to_property(attr); 93 + case hwmon_power: 94 + return power_supply_hwmon_power_to_property(attr); 105 95 case hwmon_temp: 106 96 return power_supply_hwmon_temp_to_property(attr, channel); 107 97 default: ··· 243 229 case hwmon_in: 244 230 pspval.intval = DIV_ROUND_CLOSEST(pspval.intval, 1000); 245 231 break; 232 + case hwmon_power: 233 + /* 234 + * Power properties are already in microwatts. 235 + */ 236 + break; 246 237 /* 247 238 * Temp needs to be converted from 1/10 C to milli-C 248 239 */ ··· 330 311 HWMON_C_MAX | 331 312 HWMON_C_INPUT), 332 313 314 + HWMON_CHANNEL_INFO(power, 315 + HWMON_P_INPUT | 316 + HWMON_P_AVERAGE), 317 + 333 318 HWMON_CHANNEL_INFO(in, 334 319 HWMON_I_AVERAGE | 335 320 HWMON_I_MIN | ··· 382 359 case POWER_SUPPLY_PROP_CURRENT_AVG: 383 360 case POWER_SUPPLY_PROP_CURRENT_MAX: 384 361 case POWER_SUPPLY_PROP_CURRENT_NOW: 362 + case POWER_SUPPLY_PROP_POWER_AVG: 363 + case POWER_SUPPLY_PROP_POWER_NOW: 385 364 case POWER_SUPPLY_PROP_TEMP: 386 365 case POWER_SUPPLY_PROP_TEMP_MAX: 387 366 case POWER_SUPPLY_PROP_TEMP_MIN:
+102 -76
drivers/power/supply/power_supply_leds.c
··· 19 19 20 20 /* Battery specific LEDs triggers. */ 21 21 22 + struct power_supply_led_trigger { 23 + struct led_trigger trig; 24 + struct power_supply *psy; 25 + }; 26 + 27 + #define trigger_to_psy_trigger(trigger) \ 28 + container_of(trigger, struct power_supply_led_trigger, trig) 29 + 30 + static int power_supply_led_trigger_activate(struct led_classdev *led_cdev) 31 + { 32 + struct power_supply_led_trigger *psy_trig = 33 + trigger_to_psy_trigger(led_cdev->trigger); 34 + 35 + /* Sync current power-supply state to LED being activated */ 36 + power_supply_update_leds(psy_trig->psy); 37 + return 0; 38 + } 39 + 40 + static int power_supply_register_led_trigger(struct power_supply *psy, 41 + const char *name_template, 42 + struct led_trigger **tp, int *err) 43 + { 44 + struct power_supply_led_trigger *psy_trig; 45 + int ret = -ENOMEM; 46 + 47 + /* Bail on previous errors */ 48 + if (err && *err) 49 + return *err; 50 + 51 + psy_trig = kzalloc(sizeof(*psy_trig), GFP_KERNEL); 52 + if (!psy_trig) 53 + goto err_free_trigger; 54 + 55 + psy_trig->trig.name = kasprintf(GFP_KERNEL, name_template, psy->desc->name); 56 + if (!psy_trig->trig.name) 57 + goto err_free_trigger; 58 + 59 + psy_trig->trig.activate = power_supply_led_trigger_activate; 60 + psy_trig->psy = psy; 61 + 62 + ret = led_trigger_register(&psy_trig->trig); 63 + if (ret) 64 + goto err_free_name; 65 + 66 + *tp = &psy_trig->trig; 67 + return 0; 68 + 69 + err_free_name: 70 + kfree(psy_trig->trig.name); 71 + err_free_trigger: 72 + kfree(psy_trig); 73 + if (err) 74 + *err = ret; 75 + 76 + return ret; 77 + } 78 + 79 + static void power_supply_unregister_led_trigger(struct led_trigger *trig) 80 + { 81 + struct power_supply_led_trigger *psy_trig; 82 + 83 + if (!trig) 84 + return; 85 + 86 + psy_trig = trigger_to_psy_trigger(trig); 87 + led_trigger_unregister(&psy_trig->trig); 88 + kfree(psy_trig->trig.name); 89 + kfree(psy_trig); 90 + } 91 + 22 92 static void power_supply_update_bat_leds(struct power_supply *psy) 23 93 { 24 94 union power_supply_propval status; ··· 102 32 103 33 switch (status.intval) { 104 34 case POWER_SUPPLY_STATUS_FULL: 105 - led_trigger_event(psy->charging_full_trig, LED_FULL); 35 + led_trigger_event(psy->trig, LED_FULL); 106 36 led_trigger_event(psy->charging_trig, LED_OFF); 107 37 led_trigger_event(psy->full_trig, LED_FULL); 108 38 /* Going from blink to LED on requires a LED_OFF event to stop blink */ ··· 114 44 LED_FULL); 115 45 break; 116 46 case POWER_SUPPLY_STATUS_CHARGING: 117 - led_trigger_event(psy->charging_full_trig, LED_FULL); 47 + led_trigger_event(psy->trig, LED_FULL); 118 48 led_trigger_event(psy->charging_trig, LED_FULL); 119 49 led_trigger_event(psy->full_trig, LED_OFF); 120 50 led_trigger_blink(psy->charging_blink_full_solid_trig, 0, 0); ··· 124 54 LED_FULL); 125 55 break; 126 56 default: 127 - led_trigger_event(psy->charging_full_trig, LED_OFF); 57 + led_trigger_event(psy->trig, LED_OFF); 128 58 led_trigger_event(psy->charging_trig, LED_OFF); 129 59 led_trigger_event(psy->full_trig, LED_OFF); 130 60 led_trigger_event(psy->charging_blink_full_solid_trig, ··· 135 65 } 136 66 } 137 67 138 - static int power_supply_create_bat_triggers(struct power_supply *psy) 139 - { 140 - psy->charging_full_trig_name = kasprintf(GFP_KERNEL, 141 - "%s-charging-or-full", psy->desc->name); 142 - if (!psy->charging_full_trig_name) 143 - goto charging_full_failed; 144 - 145 - psy->charging_trig_name = kasprintf(GFP_KERNEL, 146 - "%s-charging", psy->desc->name); 147 - if (!psy->charging_trig_name) 148 - goto charging_failed; 149 - 150 - psy->full_trig_name = kasprintf(GFP_KERNEL, "%s-full", psy->desc->name); 151 - if (!psy->full_trig_name) 152 - goto full_failed; 153 - 154 - psy->charging_blink_full_solid_trig_name = kasprintf(GFP_KERNEL, 155 - "%s-charging-blink-full-solid", psy->desc->name); 156 - if (!psy->charging_blink_full_solid_trig_name) 157 - goto charging_blink_full_solid_failed; 158 - 159 - psy->charging_orange_full_green_trig_name = kasprintf(GFP_KERNEL, 160 - "%s-charging-orange-full-green", psy->desc->name); 161 - if (!psy->charging_orange_full_green_trig_name) 162 - goto charging_red_full_green_failed; 163 - 164 - led_trigger_register_simple(psy->charging_full_trig_name, 165 - &psy->charging_full_trig); 166 - led_trigger_register_simple(psy->charging_trig_name, 167 - &psy->charging_trig); 168 - led_trigger_register_simple(psy->full_trig_name, 169 - &psy->full_trig); 170 - led_trigger_register_simple(psy->charging_blink_full_solid_trig_name, 171 - &psy->charging_blink_full_solid_trig); 172 - led_trigger_register_simple(psy->charging_orange_full_green_trig_name, 173 - &psy->charging_orange_full_green_trig); 174 - 175 - return 0; 176 - 177 - charging_red_full_green_failed: 178 - kfree(psy->charging_blink_full_solid_trig_name); 179 - charging_blink_full_solid_failed: 180 - kfree(psy->full_trig_name); 181 - full_failed: 182 - kfree(psy->charging_trig_name); 183 - charging_failed: 184 - kfree(psy->charging_full_trig_name); 185 - charging_full_failed: 186 - return -ENOMEM; 187 - } 188 - 189 68 static void power_supply_remove_bat_triggers(struct power_supply *psy) 190 69 { 191 - led_trigger_unregister_simple(psy->charging_full_trig); 192 - led_trigger_unregister_simple(psy->charging_trig); 193 - led_trigger_unregister_simple(psy->full_trig); 194 - led_trigger_unregister_simple(psy->charging_blink_full_solid_trig); 195 - led_trigger_unregister_simple(psy->charging_orange_full_green_trig); 196 - kfree(psy->charging_blink_full_solid_trig_name); 197 - kfree(psy->full_trig_name); 198 - kfree(psy->charging_trig_name); 199 - kfree(psy->charging_full_trig_name); 200 - kfree(psy->charging_orange_full_green_trig_name); 70 + power_supply_unregister_led_trigger(psy->trig); 71 + power_supply_unregister_led_trigger(psy->charging_trig); 72 + power_supply_unregister_led_trigger(psy->full_trig); 73 + power_supply_unregister_led_trigger(psy->charging_blink_full_solid_trig); 74 + power_supply_unregister_led_trigger(psy->charging_orange_full_green_trig); 75 + } 76 + 77 + static int power_supply_create_bat_triggers(struct power_supply *psy) 78 + { 79 + int err = 0; 80 + 81 + power_supply_register_led_trigger(psy, "%s-charging-or-full", 82 + &psy->trig, &err); 83 + power_supply_register_led_trigger(psy, "%s-charging", 84 + &psy->charging_trig, &err); 85 + power_supply_register_led_trigger(psy, "%s-full", 86 + &psy->full_trig, &err); 87 + power_supply_register_led_trigger(psy, "%s-charging-blink-full-solid", 88 + &psy->charging_blink_full_solid_trig, &err); 89 + power_supply_register_led_trigger(psy, "%s-charging-orange-full-green", 90 + &psy->charging_orange_full_green_trig, &err); 91 + if (err) 92 + power_supply_remove_bat_triggers(psy); 93 + 94 + return err; 201 95 } 202 96 203 97 /* Generated power specific LEDs triggers. */ ··· 176 142 dev_dbg(&psy->dev, "%s %d\n", __func__, online.intval); 177 143 178 144 if (online.intval) 179 - led_trigger_event(psy->online_trig, LED_FULL); 145 + led_trigger_event(psy->trig, LED_FULL); 180 146 else 181 - led_trigger_event(psy->online_trig, LED_OFF); 147 + led_trigger_event(psy->trig, LED_OFF); 182 148 } 183 149 184 150 static int power_supply_create_gen_triggers(struct power_supply *psy) 185 151 { 186 - psy->online_trig_name = kasprintf(GFP_KERNEL, "%s-online", 187 - psy->desc->name); 188 - if (!psy->online_trig_name) 189 - return -ENOMEM; 190 - 191 - led_trigger_register_simple(psy->online_trig_name, &psy->online_trig); 192 - 193 - return 0; 152 + return power_supply_register_led_trigger(psy, "%s-online", &psy->trig, NULL); 194 153 } 195 154 196 155 static void power_supply_remove_gen_triggers(struct power_supply *psy) 197 156 { 198 - led_trigger_unregister_simple(psy->online_trig); 199 - kfree(psy->online_trig_name); 157 + power_supply_unregister_led_trigger(psy->trig); 200 158 } 201 159 202 160 /* Choice what triggers to create&update. */
+1 -2
drivers/power/supply/power_supply_sysfs.c
··· 379 379 int property = psy->desc->properties[i]; 380 380 381 381 if (property == attrno) { 382 - if (psy->desc->property_is_writeable && 383 - psy->desc->property_is_writeable(psy, property) > 0) 382 + if (power_supply_property_is_writeable(psy, property) > 0) 384 383 mode |= S_IWUSR; 385 384 386 385 return mode;
+1
drivers/power/supply/qcom_battmgr.c
··· 1308 1308 static const struct of_device_id qcom_battmgr_of_variants[] = { 1309 1309 { .compatible = "qcom,sc8180x-pmic-glink", .data = (void *)QCOM_BATTMGR_SC8280XP }, 1310 1310 { .compatible = "qcom,sc8280xp-pmic-glink", .data = (void *)QCOM_BATTMGR_SC8280XP }, 1311 + { .compatible = "qcom,x1e80100-pmic-glink", .data = (void *)QCOM_BATTMGR_SC8280XP }, 1311 1312 /* Unmatched devices falls back to QCOM_BATTMGR_SM8350 */ 1312 1313 {} 1313 1314 };
+2 -2
drivers/power/supply/rt9455_charger.c
··· 1718 1718 } 1719 1719 1720 1720 static const struct i2c_device_id rt9455_i2c_id_table[] = { 1721 - { RT9455_DRIVER_NAME, 0 }, 1722 - { }, 1721 + { RT9455_DRIVER_NAME }, 1722 + { } 1723 1723 }; 1724 1724 MODULE_DEVICE_TABLE(i2c, rt9455_i2c_id_table); 1725 1725
+13 -13
drivers/power/supply/samsung-sdi-battery.c
··· 25 25 * tables apply depending on whether we are charging or not. 26 26 */ 27 27 28 - static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb_l1m7flu[] = { 28 + static const struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb_l1m7flu[] = { 29 29 { .vbat_uv = 4240000, .ri_uohm = 160000 }, 30 30 { .vbat_uv = 4210000, .ri_uohm = 179000 }, 31 31 { .vbat_uv = 4180000, .ri_uohm = 183000 }, ··· 53 53 { .vbat_uv = 3300000, .ri_uohm = 339000 }, 54 54 }; 55 55 56 - static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb_l1m7flu[] = { 56 + static const struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb_l1m7flu[] = { 57 57 { .vbat_uv = 4302000, .ri_uohm = 230000 }, 58 58 { .vbat_uv = 4276000, .ri_uohm = 345000 }, 59 59 { .vbat_uv = 4227000, .ri_uohm = 345000 }, ··· 73 73 { .vbat_uv = 3590000, .ri_uohm = 164000 }, 74 74 }; 75 75 76 - static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161la[] = { 76 + static const struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161la[] = { 77 77 { .vbat_uv = 4240000, .ri_uohm = 160000 }, 78 78 { .vbat_uv = 4210000, .ri_uohm = 179000 }, 79 79 { .vbat_uv = 4180000, .ri_uohm = 183000 }, ··· 105 105 { .vbat_uv = 3300000, .ri_uohm = 339000 }, 106 106 }; 107 107 108 - static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161la[] = { 108 + static const struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161la[] = { 109 109 { .vbat_uv = 4345000, .ri_uohm = 230000 }, 110 110 { .vbat_uv = 4329000, .ri_uohm = 238000 }, 111 111 { .vbat_uv = 4314000, .ri_uohm = 225000 }, ··· 182 182 { .vbat_uv = 3590000, .ri_uohm = 164000 }, 183 183 }; 184 184 185 - static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161lu[] = { 185 + static const struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb425161lu[] = { 186 186 { .vbat_uv = 4240000, .ri_uohm = 160000 }, 187 187 { .vbat_uv = 4210000, .ri_uohm = 179000 }, 188 188 { .vbat_uv = 4180000, .ri_uohm = 183000 }, ··· 214 214 { .vbat_uv = 3300000, .ri_uohm = 339000 }, 215 215 }; 216 216 217 - static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161lu[] = { 217 + static const struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb425161lu[] = { 218 218 { .vbat_uv = 4346000, .ri_uohm = 293000 }, 219 219 { .vbat_uv = 4336000, .ri_uohm = 290000 }, 220 220 { .vbat_uv = 4315000, .ri_uohm = 274000 }, ··· 244 244 { .vbat_uv = 3590000, .ri_uohm = 164000 }, 245 245 }; 246 246 247 - static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb485159lu[] = { 247 + static const struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb485159lu[] = { 248 248 { .vbat_uv = 4240000, .ri_uohm = 160000 }, 249 249 { .vbat_uv = 4210000, .ri_uohm = 179000 }, 250 250 { .vbat_uv = 4180000, .ri_uohm = 183000 }, ··· 271 271 { .vbat_uv = 3300000, .ri_uohm = 339000 }, 272 272 }; 273 273 274 - static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb485159lu[] = { 274 + static const struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb485159lu[] = { 275 275 { .vbat_uv = 4302000, .ri_uohm = 200000 }, 276 276 { .vbat_uv = 4258000, .ri_uohm = 206000 }, 277 277 { .vbat_uv = 4200000, .ri_uohm = 231000 }, ··· 291 291 { .vbat_uv = 3590000, .ri_uohm = 164000 }, 292 292 }; 293 293 294 - static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb535151vu[] = { 294 + static const struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb535151vu[] = { 295 295 { .vbat_uv = 4071000, .ri_uohm = 158000 }, 296 296 { .vbat_uv = 4019000, .ri_uohm = 187000 }, 297 297 { .vbat_uv = 3951000, .ri_uohm = 191000 }, ··· 311 311 { .vbat_uv = 3280000, .ri_uohm = 250000 }, 312 312 }; 313 313 314 - static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb535151vu[] = { 314 + static const struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb535151vu[] = { 315 315 { .vbat_uv = 4190000, .ri_uohm = 214000 }, 316 316 { .vbat_uv = 4159000, .ri_uohm = 252000 }, 317 317 { .vbat_uv = 4121000, .ri_uohm = 245000 }, ··· 331 331 { .vbat_uv = 3510000, .ri_uohm = 228000 }, 332 332 }; 333 333 334 - static struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb585157lu[] = { 334 + static const struct power_supply_vbat_ri_table samsung_vbat2res_discharging_eb585157lu[] = { 335 335 { .vbat_uv = 4194000, .ri_uohm = 121000 }, 336 336 { .vbat_uv = 4169000, .ri_uohm = 188000 }, 337 337 { .vbat_uv = 4136000, .ri_uohm = 173000 }, ··· 401 401 { .vbat_uv = 3161000, .ri_uohm = 452000 }, 402 402 }; 403 403 404 - static struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb585157lu[] = { 404 + static const struct power_supply_vbat_ri_table samsung_vbat2res_charging_eb585157lu[] = { 405 405 { .vbat_uv = 4360000, .ri_uohm = 128000 }, 406 406 { .vbat_uv = 4325000, .ri_uohm = 130000 }, 407 407 { .vbat_uv = 4316000, .ri_uohm = 148000 }, ··· 613 613 { .ocv = 3300000, .capacity = 0}, 614 614 }; 615 615 616 - static struct power_supply_maintenance_charge_table samsung_maint_charge_table[] = { 616 + static const struct power_supply_maintenance_charge_table samsung_maint_charge_table[] = { 617 617 { 618 618 /* Maintenance charging phase A, 60 hours */ 619 619 .charge_current_max_ua = 600000,
+1 -1
drivers/power/supply/sbs-charger.c
··· 234 234 #endif 235 235 236 236 static const struct i2c_device_id sbs_id[] = { 237 - { "sbs-charger", 0 }, 237 + { "sbs-charger" }, 238 238 { } 239 239 }; 240 240 MODULE_DEVICE_TABLE(i2c, sbs_id);
+2 -2
drivers/power/supply/sbs-manager.c
··· 389 389 } 390 390 391 391 static const struct i2c_device_id sbsm_ids[] = { 392 - { "sbs-manager", 0 }, 393 - { "ltc1760", 0 }, 392 + { "sbs-manager" }, 393 + { "ltc1760" }, 394 394 { } 395 395 }; 396 396 MODULE_DEVICE_TABLE(i2c, sbsm_ids);
+6 -13
include/linux/power_supply.h
··· 309 309 #endif 310 310 311 311 #ifdef CONFIG_LEDS_TRIGGERS 312 - struct led_trigger *charging_full_trig; 313 - char *charging_full_trig_name; 312 + struct led_trigger *trig; 314 313 struct led_trigger *charging_trig; 315 - char *charging_trig_name; 316 314 struct led_trigger *full_trig; 317 - char *full_trig_name; 318 - struct led_trigger *online_trig; 319 - char *online_trig_name; 320 315 struct led_trigger *charging_blink_full_solid_trig; 321 - char *charging_blink_full_solid_trig_name; 322 316 struct led_trigger *charging_orange_full_green_trig; 323 - char *charging_orange_full_green_trig_name; 324 317 #endif 325 318 }; 326 319 ··· 736 743 int overvoltage_limit_uv; 737 744 int constant_charge_current_max_ua; 738 745 int constant_charge_voltage_max_uv; 739 - struct power_supply_maintenance_charge_table *maintenance_charge; 746 + const struct power_supply_maintenance_charge_table *maintenance_charge; 740 747 int maintenance_charge_size; 741 748 int alert_low_temp_charge_current_ua; 742 749 int alert_low_temp_charge_voltage_uv; ··· 755 762 int ocv_table_size[POWER_SUPPLY_OCV_TEMP_MAX]; 756 763 struct power_supply_resistance_temp_table *resist_table; 757 764 int resist_table_size; 758 - struct power_supply_vbat_ri_table *vbat2ri_discharging; 765 + const struct power_supply_vbat_ri_table *vbat2ri_discharging; 759 766 int vbat2ri_discharging_size; 760 - struct power_supply_vbat_ri_table *vbat2ri_charging; 767 + const struct power_supply_vbat_ri_table *vbat2ri_charging; 761 768 int vbat2ri_charging_size; 762 769 int bti_resistance_ohm; 763 770 int bti_resistance_tolerance; ··· 810 817 int table_len, int temp); 811 818 extern int power_supply_vbat2ri(struct power_supply_battery_info *info, 812 819 int vbat_uv, bool charging); 813 - extern struct power_supply_maintenance_charge_table * 820 + extern const struct power_supply_maintenance_charge_table * 814 821 power_supply_get_maintenance_charging_setting(struct power_supply_battery_info *info, int index); 815 822 extern bool power_supply_battery_bti_in_range(struct power_supply_battery_info *info, 816 823 int resistance); ··· 824 831 static inline bool 825 832 power_supply_supports_maintenance_charging(struct power_supply_battery_info *info) 826 833 { 827 - struct power_supply_maintenance_charge_table *mt; 834 + const struct power_supply_maintenance_charge_table *mt; 828 835 829 836 mt = power_supply_get_maintenance_charging_setting(info, 0); 830 837