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

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

Pull power supply and reset updates from Sebastian Reichel:

- New core support:
- battery internal resistance
- battery OCV capacity lookup table
- support for custom sysfs attributes

- Convert all drivers to use power-supply core support for custom sysfs
attributes

- bq24190-charger: bq24196 support

- axp20x-charger: AXP813 support

- sc27xx-battery: new fuel gauge driver

- gpio-poweroff: support for specific active and inactive delays

- Misc fixes

* tag 'for-v4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (53 commits)
power: supply: bq25890: fix BAT_COMP field definition
power: supply: gpio-charger: Do not use deprecated POWER_SUPPLY_TYPE_USB_*
power: supply: ds2781: switch to devm_power_supply_register
power: supply: ds2780: switch to devm_power_supply_register
power: supply: ds2781: fix race-condition in bin attribute registration
power: supply: ds2780: fix race-condition in bin attribute registration
power: supply: pcf50633: fix race-condition in sysfs registration
power: supply: charger-manager: fix race-condition in sysfs registration
power: supply: charger-manager: simplify generation of sysfs attribute group name
power: supply: bq24257: fix race-condition in sysfs registration
power: supply: bq24190_charger: fix race-condition in sysfs registration
power: supply: lp8788: fix race-condition in sysfs registration
power: supply: ds2781: fix race-condition in sysfs registration
power: supply: ds2780: fix race-condition in sysfs registration
power: supply: bq2415x: fix race-condition in sysfs registration
power: supply: core: add support for custom sysfs attributes
power: supply: sc27xx: Save last battery capacity
power: reset: at91-poweroff: move shdwc related data to one structure
power: supply: sc27xx: Add suspend/resume interfaces
power: supply: sc27xx: Add fuel gauge low voltage alarm
...

+1794 -422
+2
Documentation/devicetree/bindings/power/reset/gpio-poweroff.txt
··· 27 27 it to an output when the power-off handler is called. If this optional 28 28 property is not specified, the GPIO is initialized as an output in its 29 29 inactive state. 30 + - active-delay-ms: Delay (default 100) to wait after driving gpio active 31 + - inactive-delay-ms: Delay (default 100) to wait after driving gpio inactive 30 32 - timeout-ms: Time to wait before asserting a WARN_ON(1). If nothing is 31 33 specified, 3000 ms is used. 32 34
+3
Documentation/devicetree/bindings/power/supply/axp20x_ac_power.txt
··· 4 4 - compatible: One of: 5 5 "x-powers,axp202-ac-power-supply" 6 6 "x-powers,axp221-ac-power-supply" 7 + "x-powers,axp813-ac-power-supply" 7 8 8 9 This node is a subnode of the axp20x PMIC. 9 10 ··· 13 12 14 13 The AXP22X is only able to tell if an AC power supply is present and 15 14 usable. 15 + 16 + AXP813/AXP803 are able to limit current and supply voltage 16 17 17 18 Example: 18 19
+17
Documentation/devicetree/bindings/power/supply/battery.txt
··· 22 22 - charge-term-current-microamp: current for charge termination phase 23 23 - constant-charge-current-max-microamp: maximum constant input current 24 24 - constant-charge-voltage-max-microvolt: maximum constant input voltage 25 + - factory-internal-resistance-micro-ohms: battery factory internal resistance 26 + - ocv-capacity-table-0: An array providing the open circuit voltage (OCV) 27 + of the battery and corresponding battery capacity percent, which is used 28 + to look up battery capacity according to current OCV value. And the open 29 + circuit voltage unit is microvolt. 30 + - ocv-capacity-table-1: Same as ocv-capacity-table-0 31 + ...... 32 + - ocv-capacity-table-n: Same as ocv-capacity-table-0 33 + - ocv-capacity-celsius: An array containing the temperature in degree Celsius, 34 + for each of the battery capacity lookup table. The first temperature value 35 + specifies the OCV table 0, and the second temperature value specifies the 36 + OCV table 1, and so on. 25 37 26 38 Battery properties are named, where possible, for the corresponding 27 39 elements in enum power_supply_property, defined in ··· 54 42 charge-term-current-microamp = <128000>; 55 43 constant-charge-current-max-microamp = <900000>; 56 44 constant-charge-voltage-max-microvolt = <4200000>; 45 + factory-internal-resistance-micro-ohms = <250000>; 46 + ocv-capacity-celsius = <(-10) 0 10>; 47 + ocv-capacity-table-0 = <4185000 100>, <4113000 95>, <4066000 90>, ...; 48 + ocv-capacity-table-1 = <4200000 100>, <4185000 95>, <4113000 90>, ...; 49 + ocv-capacity-table-2 = <4250000 100>, <4200000 95>, <4185000 90>, ...; 57 50 }; 58 51 59 52 charger: charger@11 {
+10
Documentation/devicetree/bindings/power/supply/bq24190.txt
··· 3 3 Required properties: 4 4 - compatible: contains one of the following: 5 5 * "ti,bq24190" 6 + * "ti,bq24192" 6 7 * "ti,bq24192i" 8 + * "ti,bq24196" 7 9 - reg: integer, I2C address of the charger. 8 10 - interrupts[-extended]: configuration for charger INT pin. 9 11 ··· 20 18 See also Documentation/devicetree/bindings/power/supply/battery.txt 21 19 - ti,system-minimum-microvolt: when power is connected and the battery is below 22 20 minimum system voltage, the system will be regulated above this setting. 21 + 22 + child nodes: 23 + - usb-otg-vbus: 24 + Usage: optional 25 + Description: Regulator that is used to control the VBUS voltage direction for 26 + either USB host mode or for charging on the OTG port. 23 27 24 28 Notes: 25 29 - Some circuit boards wire the chip's "OTG" pin high (enabling 500mA default ··· 47 39 interrupts-extended = <&gpiochip 10 IRQ_TYPE_EDGE_FALLING>; 48 40 monitored-battery = <&bat>; 49 41 ti,system-minimum-microvolt = <3200000>; 42 + 43 + usb_otg_vbus: usb-otg-vbus { }; 50 44 }; 51 45 52 46 &twl_gpio {
+56
Documentation/devicetree/bindings/power/supply/sc27xx-fg.txt
··· 1 + Spreadtrum SC27XX PMICs Fuel Gauge Unit Power Supply Bindings 2 + 3 + Required properties: 4 + - compatible: Should be one of the following: 5 + "sprd,sc2720-fgu", 6 + "sprd,sc2721-fgu", 7 + "sprd,sc2723-fgu", 8 + "sprd,sc2730-fgu", 9 + "sprd,sc2731-fgu". 10 + - reg: The address offset of fuel gauge unit. 11 + - battery-detect-gpios: GPIO for battery detection. 12 + - io-channels: Specify the IIO ADC channel to get temperature. 13 + - io-channel-names: Should be "bat-temp". 14 + - nvmem-cells: A phandle to the calibration cells provided by eFuse device. 15 + - nvmem-cell-names: Should be "fgu_calib". 16 + - monitored-battery: Phandle of battery characteristics devicetree node. 17 + See Documentation/devicetree/bindings/power/supply/battery.txt 18 + 19 + Example: 20 + 21 + bat: battery { 22 + compatible = "simple-battery"; 23 + charge-full-design-microamp-hours = <1900000>; 24 + constant-charge-voltage-max-microvolt = <4350000>; 25 + ocv-capacity-celsius = <20>; 26 + ocv-capacity-table-0 = <4185000 100>, <4113000 95>, <4066000 90>, 27 + <4022000 85>, <3983000 80>, <3949000 75>, 28 + <3917000 70>, <3889000 65>, <3864000 60>, 29 + <3835000 55>, <3805000 50>, <3787000 45>, 30 + <3777000 40>, <3773000 35>, <3770000 30>, 31 + <3765000 25>, <3752000 20>, <3724000 15>, 32 + <3680000 10>, <3605000 5>, <3400000 0>; 33 + ...... 34 + }; 35 + 36 + sc2731_pmic: pmic@0 { 37 + compatible = "sprd,sc2731"; 38 + reg = <0>; 39 + spi-max-frequency = <26000000>; 40 + interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; 41 + interrupt-controller; 42 + #interrupt-cells = <2>; 43 + #address-cells = <1>; 44 + #size-cells = <0>; 45 + 46 + fgu@a00 { 47 + compatible = "sprd,sc2731-fgu"; 48 + reg = <0xa00>; 49 + battery-detect-gpios = <&pmic_eic 9 GPIO_ACTIVE_HIGH>; 50 + io-channels = <&pmic_adc 5>; 51 + io-channel-names = "bat-temp"; 52 + nvmem-cells = <&fgu_calib>; 53 + nvmem-cell-names = "fgu_calib"; 54 + monitored-battery = <&bat>; 55 + }; 56 + };
+47 -45
drivers/power/reset/at91-poweroff.c
··· 51 51 [AT91_SHDW_WKMODE0_ANYLEVEL] = "any", 52 52 }; 53 53 54 - static void __iomem *at91_shdwc_base; 55 - static struct clk *sclk; 56 - static void __iomem *mpddrc_base; 54 + static struct shdwc { 55 + struct clk *sclk; 56 + void __iomem *shdwc_base; 57 + void __iomem *mpddrc_base; 58 + } at91_shdwc; 57 59 58 60 static void __init at91_wakeup_status(struct platform_device *pdev) 59 61 { 60 62 const char *reason; 61 - u32 reg = readl(at91_shdwc_base + AT91_SHDW_SR); 63 + u32 reg = readl(at91_shdwc.shdwc_base + AT91_SHDW_SR); 62 64 63 65 /* Simple power-on, just bail out */ 64 66 if (!reg) ··· 78 76 79 77 static void at91_poweroff(void) 80 78 { 81 - writel(AT91_SHDW_KEY | AT91_SHDW_SHDW, at91_shdwc_base + AT91_SHDW_CR); 82 - } 83 - 84 - static void at91_lpddr_poweroff(void) 85 - { 86 79 asm volatile( 87 80 /* Align to cache lines */ 88 81 ".balign 32\n\t" ··· 86 89 " ldr r6, [%2, #" __stringify(AT91_SHDW_CR) "]\n\t" 87 90 88 91 /* Power down SDRAM0 */ 92 + " tst %0, #0\n\t" 93 + " beq 1f\n\t" 89 94 " str %1, [%0, #" __stringify(AT91_DDRSDRC_LPR) "]\n\t" 90 95 /* Shutdown CPU */ 91 - " str %3, [%2, #" __stringify(AT91_SHDW_CR) "]\n\t" 96 + "1: str %3, [%2, #" __stringify(AT91_SHDW_CR) "]\n\t" 92 97 93 98 " b .\n\t" 94 99 : 95 - : "r" (mpddrc_base), 100 + : "r" (at91_shdwc.mpddrc_base), 96 101 "r" cpu_to_le32(AT91_DDRSDRC_LPDDR2_PWOFF), 97 - "r" (at91_shdwc_base), 102 + "r" (at91_shdwc.shdwc_base), 98 103 "r" cpu_to_le32(AT91_SHDW_KEY | AT91_SHDW_SHDW) 99 104 : "r6"); 100 105 } ··· 146 147 if (of_property_read_bool(np, "atmel,wakeup-rtt-timer")) 147 148 mode |= AT91_SHDW_RTTWKEN; 148 149 149 - writel(wakeup_mode | mode, at91_shdwc_base + AT91_SHDW_MR); 150 + writel(wakeup_mode | mode, at91_shdwc.shdwc_base + AT91_SHDW_MR); 150 151 } 151 152 152 153 static int __init at91_poweroff_probe(struct platform_device *pdev) ··· 157 158 int ret; 158 159 159 160 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 160 - at91_shdwc_base = devm_ioremap_resource(&pdev->dev, res); 161 - if (IS_ERR(at91_shdwc_base)) 162 - return PTR_ERR(at91_shdwc_base); 161 + at91_shdwc.shdwc_base = devm_ioremap_resource(&pdev->dev, res); 162 + if (IS_ERR(at91_shdwc.shdwc_base)) 163 + return PTR_ERR(at91_shdwc.shdwc_base); 163 164 164 - sclk = devm_clk_get(&pdev->dev, NULL); 165 - if (IS_ERR(sclk)) 166 - return PTR_ERR(sclk); 165 + at91_shdwc.sclk = devm_clk_get(&pdev->dev, NULL); 166 + if (IS_ERR(at91_shdwc.sclk)) 167 + return PTR_ERR(at91_shdwc.sclk); 167 168 168 - ret = clk_prepare_enable(sclk); 169 + ret = clk_prepare_enable(at91_shdwc.sclk); 169 170 if (ret) { 170 171 dev_err(&pdev->dev, "Could not enable slow clock\n"); 171 172 return ret; ··· 176 177 if (pdev->dev.of_node) 177 178 at91_poweroff_dt_set_wakeup_mode(pdev); 178 179 180 + np = of_find_compatible_node(NULL, NULL, "atmel,sama5d3-ddramc"); 181 + if (np) { 182 + at91_shdwc.mpddrc_base = of_iomap(np, 0); 183 + of_node_put(np); 184 + 185 + if (!at91_shdwc.mpddrc_base) { 186 + ret = -ENOMEM; 187 + goto clk_disable; 188 + } 189 + 190 + ddr_type = readl(at91_shdwc.mpddrc_base + AT91_DDRSDRC_MDR) & 191 + AT91_DDRSDRC_MD; 192 + if (ddr_type != AT91_DDRSDRC_MD_LPDDR2 && 193 + ddr_type != AT91_DDRSDRC_MD_LPDDR3) { 194 + iounmap(at91_shdwc.mpddrc_base); 195 + at91_shdwc.mpddrc_base = NULL; 196 + } 197 + } 198 + 179 199 pm_power_off = at91_poweroff; 180 200 181 - np = of_find_compatible_node(NULL, NULL, "atmel,sama5d3-ddramc"); 182 - if (!np) 183 - return 0; 184 - 185 - mpddrc_base = of_iomap(np, 0); 186 - of_node_put(np); 187 - 188 - if (!mpddrc_base) 189 - return 0; 190 - 191 - ddr_type = readl(mpddrc_base + AT91_DDRSDRC_MDR) & AT91_DDRSDRC_MD; 192 - if ((ddr_type == AT91_DDRSDRC_MD_LPDDR2) || 193 - (ddr_type == AT91_DDRSDRC_MD_LPDDR3)) 194 - pm_power_off = at91_lpddr_poweroff; 195 - else 196 - iounmap(mpddrc_base); 197 - 198 201 return 0; 202 + 203 + clk_disable: 204 + clk_disable_unprepare(at91_shdwc.sclk); 205 + return ret; 199 206 } 200 207 201 208 static int __exit at91_poweroff_remove(struct platform_device *pdev) 202 209 { 203 - if (pm_power_off == at91_poweroff || 204 - pm_power_off == at91_lpddr_poweroff) 210 + if (pm_power_off == at91_poweroff) 205 211 pm_power_off = NULL; 206 212 207 - clk_disable_unprepare(sclk); 213 + if (at91_shdwc.mpddrc_base) 214 + iounmap(at91_shdwc.mpddrc_base); 215 + 216 + clk_disable_unprepare(at91_shdwc.sclk); 208 217 209 218 return 0; 210 219 } 211 - 212 - static const struct of_device_id at91_ramc_of_match[] = { 213 - { .compatible = "atmel,sama5d3-ddramc", }, 214 - { /* sentinel */ } 215 - }; 216 220 217 221 static const struct of_device_id at91_poweroff_of_match[] = { 218 222 { .compatible = "atmel,at91sam9260-shdwc", },
+8 -2
drivers/power/reset/gpio-poweroff.c
··· 26 26 */ 27 27 static struct gpio_desc *reset_gpio; 28 28 static u32 timeout = DEFAULT_TIMEOUT_MS; 29 + static u32 active_delay = 100; 30 + static u32 inactive_delay = 100; 29 31 30 32 static void gpio_poweroff_do_poweroff(void) 31 33 { ··· 35 33 36 34 /* drive it active, also inactive->active edge */ 37 35 gpiod_direction_output(reset_gpio, 1); 38 - mdelay(100); 36 + mdelay(active_delay); 37 + 39 38 /* drive inactive, also active->inactive edge */ 40 39 gpiod_set_value_cansleep(reset_gpio, 0); 41 - mdelay(100); 40 + mdelay(inactive_delay); 42 41 43 42 /* drive it active, also inactive->active edge */ 44 43 gpiod_set_value_cansleep(reset_gpio, 1); ··· 69 66 else 70 67 flags = GPIOD_OUT_LOW; 71 68 69 + device_property_read_u32(&pdev->dev, "active-delay-ms", &active_delay); 70 + device_property_read_u32(&pdev->dev, "inactive-delay-ms", 71 + &inactive_delay); 72 72 device_property_read_u32(&pdev->dev, "timeout-ms", &timeout); 73 73 74 74 reset_gpio = devm_gpiod_get(&pdev->dev, NULL, flags);
+12
drivers/power/reset/ocelot-reset.c
··· 26 26 27 27 #define SOFT_CHIP_RST BIT(0) 28 28 29 + #define ICPU_CFG_CPU_SYSTEM_CTRL_GENERAL_CTRL 0x24 30 + #define IF_SI_OWNER_MASK GENMASK(1, 0) 31 + #define IF_SI_OWNER_SISL 0 32 + #define IF_SI_OWNER_SIBM 1 33 + #define IF_SI_OWNER_SIMC 2 34 + #define IF_SI_OWNER_OFFSET 4 35 + 29 36 static int ocelot_restart_handle(struct notifier_block *this, 30 37 unsigned long mode, void *cmd) 31 38 { ··· 43 36 /* Make sure the core is not protected from reset */ 44 37 regmap_update_bits(ctx->cpu_ctrl, ICPU_CFG_CPU_SYSTEM_CTRL_RESET, 45 38 CORE_RST_PROTECT, 0); 39 + 40 + /* Make the SI back to boot mode */ 41 + regmap_update_bits(ctx->cpu_ctrl, ICPU_CFG_CPU_SYSTEM_CTRL_GENERAL_CTRL, 42 + IF_SI_OWNER_MASK << IF_SI_OWNER_OFFSET, 43 + IF_SI_OWNER_SIBM << IF_SI_OWNER_OFFSET); 46 44 47 45 writel(SOFT_CHIP_RST, ctx->base); 48 46
+8
drivers/power/supply/Kconfig
··· 652 652 Say Y here to enable support for battery charging with SC2731 653 653 PMIC chips. 654 654 655 + config FUEL_GAUGE_SC27XX 656 + tristate "Spreadtrum SC27XX fuel gauge driver" 657 + depends on MFD_SC27XX_PMIC || COMPILE_TEST 658 + depends on IIO 659 + help 660 + Say Y here to enable support for fuel gauge with SC27XX 661 + PMIC chips. 662 + 655 663 endif # POWER_SUPPLY
+1
drivers/power/supply/Makefile
··· 86 86 obj-$(CONFIG_AXP288_CHARGER) += axp288_charger.o 87 87 obj-$(CONFIG_CHARGER_CROS_USBPD) += cros_usbpd-charger.o 88 88 obj-$(CONFIG_CHARGER_SC2731) += sc2731_charger.o 89 + obj-$(CONFIG_FUEL_GAUGE_SC27XX) += sc27xx_fuel_gauge.o
+94
drivers/power/supply/axp20x_ac_power.c
··· 27 27 #define AXP20X_PWR_STATUS_ACIN_PRESENT BIT(7) 28 28 #define AXP20X_PWR_STATUS_ACIN_AVAIL BIT(6) 29 29 30 + #define AXP813_VHOLD_MASK GENMASK(5, 3) 31 + #define AXP813_VHOLD_UV_TO_BIT(x) ((((x) / 100000) - 40) << 3) 32 + #define AXP813_VHOLD_REG_TO_UV(x) \ 33 + (((((x) & AXP813_VHOLD_MASK) >> 3) + 40) * 100000) 34 + 35 + #define AXP813_CURR_LIMIT_MASK GENMASK(2, 0) 36 + #define AXP813_CURR_LIMIT_UA_TO_BIT(x) (((x) / 500000) - 3) 37 + #define AXP813_CURR_LIMIT_REG_TO_UA(x) \ 38 + ((((x) & AXP813_CURR_LIMIT_MASK) + 3) * 500000) 39 + 30 40 #define DRVNAME "axp20x-ac-power-supply" 31 41 32 42 struct axp20x_ac_power { ··· 112 102 113 103 return 0; 114 104 105 + case POWER_SUPPLY_PROP_VOLTAGE_MIN: 106 + ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, &reg); 107 + if (ret) 108 + return ret; 109 + 110 + val->intval = AXP813_VHOLD_REG_TO_UV(reg); 111 + 112 + return 0; 113 + 114 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 115 + ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, &reg); 116 + if (ret) 117 + return ret; 118 + 119 + val->intval = AXP813_CURR_LIMIT_REG_TO_UA(reg); 120 + /* AXP813 datasheet defines values 11x as 4000mA */ 121 + if (val->intval > 4000000) 122 + val->intval = 4000000; 123 + 124 + return 0; 125 + 115 126 default: 116 127 return -EINVAL; 117 128 } 118 129 119 130 return -EINVAL; 131 + } 132 + 133 + static int axp813_ac_power_set_property(struct power_supply *psy, 134 + enum power_supply_property psp, 135 + const union power_supply_propval *val) 136 + { 137 + struct axp20x_ac_power *power = power_supply_get_drvdata(psy); 138 + 139 + switch (psp) { 140 + case POWER_SUPPLY_PROP_VOLTAGE_MIN: 141 + if (val->intval < 4000000 || val->intval > 4700000) 142 + return -EINVAL; 143 + 144 + return regmap_update_bits(power->regmap, AXP813_ACIN_PATH_CTRL, 145 + AXP813_VHOLD_MASK, 146 + AXP813_VHOLD_UV_TO_BIT(val->intval)); 147 + 148 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 149 + if (val->intval < 1500000 || val->intval > 4000000) 150 + return -EINVAL; 151 + 152 + return regmap_update_bits(power->regmap, AXP813_ACIN_PATH_CTRL, 153 + AXP813_CURR_LIMIT_MASK, 154 + AXP813_CURR_LIMIT_UA_TO_BIT(val->intval)); 155 + 156 + default: 157 + return -EINVAL; 158 + } 159 + 160 + return -EINVAL; 161 + } 162 + 163 + static int axp813_ac_power_prop_writeable(struct power_supply *psy, 164 + enum power_supply_property psp) 165 + { 166 + return psp == POWER_SUPPLY_PROP_VOLTAGE_MIN || 167 + psp == POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT; 120 168 } 121 169 122 170 static enum power_supply_property axp20x_ac_power_properties[] = { ··· 189 121 POWER_SUPPLY_PROP_HEALTH, 190 122 POWER_SUPPLY_PROP_PRESENT, 191 123 POWER_SUPPLY_PROP_ONLINE, 124 + }; 125 + 126 + static enum power_supply_property axp813_ac_power_properties[] = { 127 + POWER_SUPPLY_PROP_HEALTH, 128 + POWER_SUPPLY_PROP_PRESENT, 129 + POWER_SUPPLY_PROP_ONLINE, 130 + POWER_SUPPLY_PROP_VOLTAGE_MIN, 131 + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 192 132 }; 193 133 194 134 static const struct power_supply_desc axp20x_ac_power_desc = { ··· 215 139 .get_property = axp20x_ac_power_get_property, 216 140 }; 217 141 142 + static const struct power_supply_desc axp813_ac_power_desc = { 143 + .name = "axp813-ac", 144 + .type = POWER_SUPPLY_TYPE_MAINS, 145 + .properties = axp813_ac_power_properties, 146 + .num_properties = ARRAY_SIZE(axp813_ac_power_properties), 147 + .property_is_writeable = axp813_ac_power_prop_writeable, 148 + .get_property = axp20x_ac_power_get_property, 149 + .set_property = axp813_ac_power_set_property, 150 + }; 151 + 218 152 struct axp_data { 219 153 const struct power_supply_desc *power_desc; 220 154 bool acin_adc; ··· 237 151 238 152 static const struct axp_data axp22x_data = { 239 153 .power_desc = &axp22x_ac_power_desc, 154 + .acin_adc = false, 155 + }; 156 + 157 + static const struct axp_data axp813_data = { 158 + .power_desc = &axp813_ac_power_desc, 240 159 .acin_adc = false, 241 160 }; 242 161 ··· 325 234 }, { 326 235 .compatible = "x-powers,axp221-ac-power-supply", 327 236 .data = &axp22x_data, 237 + }, { 238 + .compatible = "x-powers,axp813-ac-power-supply", 239 + .data = &axp813_data, 328 240 }, { /* sentinel */ } 329 241 }; 330 242 MODULE_DEVICE_TABLE(of, axp20x_ac_power_match);
+1
drivers/power/supply/axp20x_usb_power.c
··· 10 10 * option) any later version. 11 11 */ 12 12 13 + #include <linux/bitops.h> 13 14 #include <linux/device.h> 14 15 #include <linux/init.h> 15 16 #include <linux/interrupt.h>
+18 -17
drivers/power/supply/axp288_charger.c
··· 16 16 */ 17 17 18 18 #include <linux/acpi.h> 19 + #include <linux/bitops.h> 19 20 #include <linux/module.h> 20 21 #include <linux/device.h> 21 22 #include <linux/regmap.h> ··· 30 29 #include <linux/mfd/axp20x.h> 31 30 #include <linux/extcon.h> 32 31 33 - #define PS_STAT_VBUS_TRIGGER (1 << 0) 34 - #define PS_STAT_BAT_CHRG_DIR (1 << 2) 35 - #define PS_STAT_VBAT_ABOVE_VHOLD (1 << 3) 36 - #define PS_STAT_VBUS_VALID (1 << 4) 37 - #define PS_STAT_VBUS_PRESENT (1 << 5) 32 + #define PS_STAT_VBUS_TRIGGER BIT(0) 33 + #define PS_STAT_BAT_CHRG_DIR BIT(2) 34 + #define PS_STAT_VBAT_ABOVE_VHOLD BIT(3) 35 + #define PS_STAT_VBUS_VALID BIT(4) 36 + #define PS_STAT_VBUS_PRESENT BIT(5) 38 37 39 - #define CHRG_STAT_BAT_SAFE_MODE (1 << 3) 40 - #define CHRG_STAT_BAT_VALID (1 << 4) 41 - #define CHRG_STAT_BAT_PRESENT (1 << 5) 42 - #define CHRG_STAT_CHARGING (1 << 6) 43 - #define CHRG_STAT_PMIC_OTP (1 << 7) 38 + #define CHRG_STAT_BAT_SAFE_MODE BIT(3) 39 + #define CHRG_STAT_BAT_VALID BIT(4) 40 + #define CHRG_STAT_BAT_PRESENT BIT(5) 41 + #define CHRG_STAT_CHARGING BIT(6) 42 + #define CHRG_STAT_PMIC_OTP BIT(7) 44 43 45 44 #define VBUS_ISPOUT_CUR_LIM_MASK 0x03 46 45 #define VBUS_ISPOUT_CUR_LIM_BIT_POS 0 ··· 53 52 #define VBUS_ISPOUT_VHOLD_SET_OFFSET 4000 /* 4000mV */ 54 53 #define VBUS_ISPOUT_VHOLD_SET_LSB_RES 100 /* 100mV */ 55 54 #define VBUS_ISPOUT_VHOLD_SET_4300MV 0x3 /* 4300mV */ 56 - #define VBUS_ISPOUT_VBUS_PATH_DIS (1 << 7) 55 + #define VBUS_ISPOUT_VBUS_PATH_DIS BIT(7) 57 56 58 57 #define CHRG_CCCV_CC_MASK 0xf /* 4 bits */ 59 58 #define CHRG_CCCV_CC_BIT_POS 0 60 59 #define CHRG_CCCV_CC_OFFSET 200 /* 200mA */ 61 60 #define CHRG_CCCV_CC_LSB_RES 200 /* 200mA */ 62 - #define CHRG_CCCV_ITERM_20P (1 << 4) /* 20% of CC */ 61 + #define CHRG_CCCV_ITERM_20P BIT(4) /* 20% of CC */ 63 62 #define CHRG_CCCV_CV_MASK 0x60 /* 2 bits */ 64 63 #define CHRG_CCCV_CV_BIT_POS 5 65 64 #define CHRG_CCCV_CV_4100MV 0x0 /* 4.10V */ 66 65 #define CHRG_CCCV_CV_4150MV 0x1 /* 4.15V */ 67 66 #define CHRG_CCCV_CV_4200MV 0x2 /* 4.20V */ 68 67 #define CHRG_CCCV_CV_4350MV 0x3 /* 4.35V */ 69 - #define CHRG_CCCV_CHG_EN (1 << 7) 68 + #define CHRG_CCCV_CHG_EN BIT(7) 70 69 71 70 #define CNTL2_CC_TIMEOUT_MASK 0x3 /* 2 bits */ 72 71 #define CNTL2_CC_TIMEOUT_OFFSET 6 /* 6 Hrs */ 73 72 #define CNTL2_CC_TIMEOUT_LSB_RES 2 /* 2 Hrs */ 74 73 #define CNTL2_CC_TIMEOUT_12HRS 0x3 /* 12 Hrs */ 75 - #define CNTL2_CHGLED_TYPEB (1 << 4) 76 - #define CNTL2_CHG_OUT_TURNON (1 << 5) 74 + #define CNTL2_CHGLED_TYPEB BIT(4) 75 + #define CNTL2_CHG_OUT_TURNON BIT(5) 77 76 #define CNTL2_PC_TIMEOUT_MASK 0xC0 78 77 #define CNTL2_PC_TIMEOUT_OFFSET 40 /* 40 mins */ 79 78 #define CNTL2_PC_TIMEOUT_LSB_RES 10 /* 10 mins */ 80 79 #define CNTL2_PC_TIMEOUT_70MINS 0x3 81 80 82 - #define CHRG_ILIM_TEMP_LOOP_EN (1 << 3) 81 + #define CHRG_ILIM_TEMP_LOOP_EN BIT(3) 83 82 #define CHRG_VBUS_ILIM_MASK 0xf0 84 83 #define CHRG_VBUS_ILIM_BIT_POS 4 85 84 #define CHRG_VBUS_ILIM_100MA 0x0 /* 100mA */ ··· 95 94 #define CHRG_VLTFC_0C 0xA5 /* 0 DegC */ 96 95 #define CHRG_VHTFC_45C 0x1F /* 45 DegC */ 97 96 98 - #define FG_CNTL_OCV_ADJ_EN (1 << 3) 97 + #define FG_CNTL_OCV_ADJ_EN BIT(3) 99 98 100 99 #define CV_4100MV 4100 /* 4100mV */ 101 100 #define CV_4150MV 4150 /* 4150mV */
+49 -70
drivers/power/supply/bq2415x_charger.c
··· 1032 1032 return 0; 1033 1033 } 1034 1034 1035 - static int bq2415x_power_supply_init(struct bq2415x_device *bq) 1036 - { 1037 - int ret; 1038 - int chip; 1039 - char revstr[8]; 1040 - struct power_supply_config psy_cfg = { 1041 - .drv_data = bq, 1042 - .of_node = bq->dev->of_node, 1043 - }; 1044 - 1045 - bq->charger_desc.name = bq->name; 1046 - bq->charger_desc.type = POWER_SUPPLY_TYPE_USB; 1047 - bq->charger_desc.properties = bq2415x_power_supply_props; 1048 - bq->charger_desc.num_properties = 1049 - ARRAY_SIZE(bq2415x_power_supply_props); 1050 - bq->charger_desc.get_property = bq2415x_power_supply_get_property; 1051 - 1052 - ret = bq2415x_detect_chip(bq); 1053 - if (ret < 0) 1054 - chip = BQUNKNOWN; 1055 - else 1056 - chip = ret; 1057 - 1058 - ret = bq2415x_detect_revision(bq); 1059 - if (ret < 0) 1060 - strcpy(revstr, "unknown"); 1061 - else 1062 - sprintf(revstr, "1.%d", ret); 1063 - 1064 - bq->model = kasprintf(GFP_KERNEL, 1065 - "chip %s, revision %s, vender code %.3d", 1066 - bq2415x_chip_name[chip], revstr, 1067 - bq2415x_get_vender_code(bq)); 1068 - if (!bq->model) { 1069 - dev_err(bq->dev, "failed to allocate model name\n"); 1070 - return -ENOMEM; 1071 - } 1072 - 1073 - bq->charger = power_supply_register(bq->dev, &bq->charger_desc, 1074 - &psy_cfg); 1075 - if (IS_ERR(bq->charger)) { 1076 - kfree(bq->model); 1077 - return PTR_ERR(bq->charger); 1078 - } 1079 - 1080 - return 0; 1081 - } 1082 - 1083 1035 static void bq2415x_power_supply_exit(struct bq2415x_device *bq) 1084 1036 { 1085 1037 bq->autotimer = 0; ··· 1448 1496 static DEVICE_ATTR(boost_status, S_IRUGO, bq2415x_sysfs_show_status, NULL); 1449 1497 static DEVICE_ATTR(fault_status, S_IRUGO, bq2415x_sysfs_show_status, NULL); 1450 1498 1451 - static struct attribute *bq2415x_sysfs_attributes[] = { 1499 + static struct attribute *bq2415x_sysfs_attrs[] = { 1452 1500 /* 1453 1501 * TODO: some (appropriate) of these attrs should be switched to 1454 1502 * use power supply class props. ··· 1477 1525 NULL, 1478 1526 }; 1479 1527 1480 - static const struct attribute_group bq2415x_sysfs_attr_group = { 1481 - .attrs = bq2415x_sysfs_attributes, 1482 - }; 1528 + ATTRIBUTE_GROUPS(bq2415x_sysfs); 1483 1529 1484 - static int bq2415x_sysfs_init(struct bq2415x_device *bq) 1530 + static int bq2415x_power_supply_init(struct bq2415x_device *bq) 1485 1531 { 1486 - return sysfs_create_group(&bq->charger->dev.kobj, 1487 - &bq2415x_sysfs_attr_group); 1488 - } 1532 + int ret; 1533 + int chip; 1534 + char revstr[8]; 1535 + struct power_supply_config psy_cfg = { 1536 + .drv_data = bq, 1537 + .of_node = bq->dev->of_node, 1538 + .attr_grp = bq2415x_sysfs_groups, 1539 + }; 1489 1540 1490 - static void bq2415x_sysfs_exit(struct bq2415x_device *bq) 1491 - { 1492 - sysfs_remove_group(&bq->charger->dev.kobj, &bq2415x_sysfs_attr_group); 1541 + bq->charger_desc.name = bq->name; 1542 + bq->charger_desc.type = POWER_SUPPLY_TYPE_USB; 1543 + bq->charger_desc.properties = bq2415x_power_supply_props; 1544 + bq->charger_desc.num_properties = 1545 + ARRAY_SIZE(bq2415x_power_supply_props); 1546 + bq->charger_desc.get_property = bq2415x_power_supply_get_property; 1547 + 1548 + ret = bq2415x_detect_chip(bq); 1549 + if (ret < 0) 1550 + chip = BQUNKNOWN; 1551 + else 1552 + chip = ret; 1553 + 1554 + ret = bq2415x_detect_revision(bq); 1555 + if (ret < 0) 1556 + strcpy(revstr, "unknown"); 1557 + else 1558 + sprintf(revstr, "1.%d", ret); 1559 + 1560 + bq->model = kasprintf(GFP_KERNEL, 1561 + "chip %s, revision %s, vender code %.3d", 1562 + bq2415x_chip_name[chip], revstr, 1563 + bq2415x_get_vender_code(bq)); 1564 + if (!bq->model) { 1565 + dev_err(bq->dev, "failed to allocate model name\n"); 1566 + return -ENOMEM; 1567 + } 1568 + 1569 + bq->charger = power_supply_register(bq->dev, &bq->charger_desc, 1570 + &psy_cfg); 1571 + if (IS_ERR(bq->charger)) { 1572 + kfree(bq->model); 1573 + return PTR_ERR(bq->charger); 1574 + } 1575 + 1576 + return 0; 1493 1577 } 1494 1578 1495 1579 /* main bq2415x probe function */ ··· 1639 1651 goto error_2; 1640 1652 } 1641 1653 1642 - ret = bq2415x_sysfs_init(bq); 1643 - if (ret) { 1644 - dev_err(bq->dev, "failed to create sysfs entries: %d\n", ret); 1645 - goto error_3; 1646 - } 1647 - 1648 1654 ret = bq2415x_set_defaults(bq); 1649 1655 if (ret) { 1650 1656 dev_err(bq->dev, "failed to set default values: %d\n", ret); 1651 - goto error_4; 1657 + goto error_3; 1652 1658 } 1653 1659 1654 1660 if (bq->notify_node || bq->init_data.notify_device) { ··· 1650 1668 ret = power_supply_reg_notifier(&bq->nb); 1651 1669 if (ret) { 1652 1670 dev_err(bq->dev, "failed to reg notifier: %d\n", ret); 1653 - goto error_4; 1671 + goto error_3; 1654 1672 } 1655 1673 1656 1674 bq->automode = 1; ··· 1689 1707 dev_info(bq->dev, "driver registered\n"); 1690 1708 return 0; 1691 1709 1692 - error_4: 1693 - bq2415x_sysfs_exit(bq); 1694 1710 error_3: 1695 1711 bq2415x_power_supply_exit(bq); 1696 1712 error_2: ··· 1713 1733 power_supply_unreg_notifier(&bq->nb); 1714 1734 1715 1735 of_node_put(bq->notify_node); 1716 - bq2415x_sysfs_exit(bq); 1717 1736 bq2415x_power_supply_exit(bq); 1718 1737 1719 1738 bq2415x_reset_chip(bq);
+54 -37
drivers/power/supply/bq24190_charger.c
··· 21 21 #include <linux/workqueue.h> 22 22 #include <linux/gpio.h> 23 23 #include <linux/i2c.h> 24 + #include <linux/extcon-provider.h> 24 25 25 26 #define BQ24190_MANUFACTURER "Texas Instruments" 26 27 ··· 143 142 #define BQ24190_REG_VPRS_PN_MASK (BIT(5) | BIT(4) | BIT(3)) 144 143 #define BQ24190_REG_VPRS_PN_SHIFT 3 145 144 #define BQ24190_REG_VPRS_PN_24190 0x4 146 - #define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193 */ 145 + #define BQ24190_REG_VPRS_PN_24192 0x5 /* Also 24193, 24196 */ 147 146 #define BQ24190_REG_VPRS_PN_24192I 0x3 148 147 #define BQ24190_REG_VPRS_TS_PROFILE_MASK BIT(2) 149 148 #define BQ24190_REG_VPRS_TS_PROFILE_SHIFT 2 ··· 160 159 struct bq24190_dev_info { 161 160 struct i2c_client *client; 162 161 struct device *dev; 162 + struct extcon_dev *edev; 163 163 struct power_supply *charger; 164 164 struct power_supply *battery; 165 165 struct delayed_work input_current_limit_work; ··· 174 172 u8 f_reg; 175 173 u8 ss_reg; 176 174 u8 watchdog; 175 + }; 176 + 177 + static const unsigned int bq24190_usb_extcon_cable[] = { 178 + EXTCON_USB, 179 + EXTCON_NONE, 177 180 }; 178 181 179 182 /* ··· 409 402 static struct attribute * 410 403 bq24190_sysfs_attrs[ARRAY_SIZE(bq24190_sysfs_field_tbl) + 1]; 411 404 412 - static const struct attribute_group bq24190_sysfs_attr_group = { 413 - .attrs = bq24190_sysfs_attrs, 414 - }; 405 + ATTRIBUTE_GROUPS(bq24190_sysfs); 415 406 416 407 static void bq24190_sysfs_init_attrs(void) 417 408 { ··· 496 491 497 492 return count; 498 493 } 499 - 500 - static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi) 501 - { 502 - bq24190_sysfs_init_attrs(); 503 - 504 - return sysfs_create_group(&bdi->charger->dev.kobj, 505 - &bq24190_sysfs_attr_group); 506 - } 507 - 508 - static void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi) 509 - { 510 - sysfs_remove_group(&bdi->charger->dev.kobj, &bq24190_sysfs_attr_group); 511 - } 512 - #else 513 - static int bq24190_sysfs_create_group(struct bq24190_dev_info *bdi) 514 - { 515 - return 0; 516 - } 517 - 518 - static inline void bq24190_sysfs_remove_group(struct bq24190_dev_info *bdi) {} 519 494 #endif 520 495 521 496 #ifdef CONFIG_REGULATOR ··· 562 577 563 578 static const struct regulator_desc bq24190_vbus_desc = { 564 579 .name = "usb_otg_vbus", 580 + .of_match = "usb-otg-vbus", 565 581 .type = REGULATOR_VOLTAGE, 566 582 .owner = THIS_MODULE, 567 583 .ops = &bq24190_vbus_ops, ··· 1513 1527 .property_is_writeable = bq24190_battery_property_is_writeable, 1514 1528 }; 1515 1529 1530 + static int bq24190_configure_usb_otg(struct bq24190_dev_info *bdi, u8 ss_reg) 1531 + { 1532 + bool otg_enabled; 1533 + int ret; 1534 + 1535 + otg_enabled = !!(ss_reg & BQ24190_REG_SS_VBUS_STAT_MASK); 1536 + ret = extcon_set_state_sync(bdi->edev, EXTCON_USB, otg_enabled); 1537 + if (ret < 0) 1538 + dev_err(bdi->dev, "Can't set extcon state to %d: %d\n", 1539 + otg_enabled, ret); 1540 + 1541 + return ret; 1542 + } 1543 + 1516 1544 static void bq24190_check_status(struct bq24190_dev_info *bdi) 1517 1545 { 1518 1546 const u8 battery_mask_ss = BQ24190_REG_SS_CHRG_STAT_MASK; ··· 1596 1596 bdi->ss_reg = ss_reg; 1597 1597 } 1598 1598 1599 - if (alert_charger || alert_battery) 1599 + if (alert_charger || alert_battery) { 1600 1600 power_supply_changed(bdi->charger); 1601 + bq24190_configure_usb_otg(bdi, ss_reg); 1602 + } 1601 1603 if (alert_battery && bdi->battery) 1602 1604 power_supply_changed(bdi->battery); 1603 1605 ··· 1639 1637 if (ret < 0) 1640 1638 return ret; 1641 1639 1642 - if (v != BQ24190_REG_VPRS_PN_24190 && 1643 - v != BQ24190_REG_VPRS_PN_24192I) { 1640 + switch (v) { 1641 + case BQ24190_REG_VPRS_PN_24190: 1642 + case BQ24190_REG_VPRS_PN_24192: 1643 + case BQ24190_REG_VPRS_PN_24192I: 1644 + break; 1645 + default: 1644 1646 dev_err(bdi->dev, "Error unknown model: 0x%02x\n", v); 1645 1647 return -ENODEV; 1646 1648 } ··· 1733 1727 return -EINVAL; 1734 1728 } 1735 1729 1730 + bdi->edev = devm_extcon_dev_allocate(dev, bq24190_usb_extcon_cable); 1731 + if (IS_ERR(bdi->edev)) 1732 + return PTR_ERR(bdi->edev); 1733 + 1734 + ret = devm_extcon_dev_register(dev, bdi->edev); 1735 + if (ret < 0) 1736 + return ret; 1737 + 1736 1738 pm_runtime_enable(dev); 1737 1739 pm_runtime_use_autosuspend(dev); 1738 1740 pm_runtime_set_autosuspend_delay(dev, 600); ··· 1749 1735 dev_err(dev, "pm_runtime_get failed: %i\n", ret); 1750 1736 goto out_pmrt; 1751 1737 } 1738 + 1739 + #ifdef CONFIG_SYSFS 1740 + bq24190_sysfs_init_attrs(); 1741 + charger_cfg.attr_grp = bq24190_sysfs_groups; 1742 + #endif 1752 1743 1753 1744 charger_cfg.drv_data = bdi; 1754 1745 charger_cfg.of_node = dev->of_node; ··· 1792 1773 goto out_charger; 1793 1774 } 1794 1775 1795 - ret = bq24190_sysfs_create_group(bdi); 1796 - if (ret < 0) { 1797 - dev_err(dev, "Can't create sysfs entries\n"); 1776 + ret = bq24190_configure_usb_otg(bdi, bdi->ss_reg); 1777 + if (ret < 0) 1798 1778 goto out_charger; 1799 - } 1800 1779 1801 1780 bdi->initialized = true; 1802 1781 ··· 1804 1787 "bq24190-charger", bdi); 1805 1788 if (ret < 0) { 1806 1789 dev_err(dev, "Can't set up irq handler\n"); 1807 - goto out_sysfs; 1790 + goto out_charger; 1808 1791 } 1809 1792 1810 1793 ret = bq24190_register_vbus_regulator(bdi); 1811 1794 if (ret < 0) 1812 - goto out_sysfs; 1795 + goto out_charger; 1813 1796 1814 1797 enable_irq_wake(client->irq); 1815 1798 ··· 1817 1800 pm_runtime_put_autosuspend(dev); 1818 1801 1819 1802 return 0; 1820 - 1821 - out_sysfs: 1822 - bq24190_sysfs_remove_group(bdi); 1823 1803 1824 1804 out_charger: 1825 1805 if (!IS_ERR_OR_NULL(bdi->battery)) ··· 1842 1828 } 1843 1829 1844 1830 bq24190_register_reset(bdi); 1845 - bq24190_sysfs_remove_group(bdi); 1846 1831 if (bdi->battery) 1847 1832 power_supply_unregister(bdi->battery); 1848 1833 power_supply_unregister(bdi->charger); ··· 1944 1931 1945 1932 static const struct i2c_device_id bq24190_i2c_ids[] = { 1946 1933 { "bq24190" }, 1934 + { "bq24192" }, 1947 1935 { "bq24192i" }, 1936 + { "bq24196" }, 1948 1937 { }, 1949 1938 }; 1950 1939 MODULE_DEVICE_TABLE(i2c, bq24190_i2c_ids); ··· 1954 1939 #ifdef CONFIG_OF 1955 1940 static const struct of_device_id bq24190_of_match[] = { 1956 1941 { .compatible = "ti,bq24190", }, 1942 + { .compatible = "ti,bq24192", }, 1957 1943 { .compatible = "ti,bq24192i", }, 1944 + { .compatible = "ti,bq24196", }, 1958 1945 { }, 1959 1946 }; 1960 1947 MODULE_DEVICE_TABLE(of, bq24190_of_match);
+3 -12
drivers/power/supply/bq24257_charger.c
··· 845 845 static DEVICE_ATTR(sysoff_enable, S_IWUSR | S_IRUGO, 846 846 bq24257_sysfs_show_enable, bq24257_sysfs_set_enable); 847 847 848 - static struct attribute *bq24257_charger_attr[] = { 848 + static struct attribute *bq24257_charger_sysfs_attrs[] = { 849 849 &dev_attr_ovp_voltage.attr, 850 850 &dev_attr_in_dpm_voltage.attr, 851 851 &dev_attr_high_impedance_enable.attr, ··· 853 853 NULL, 854 854 }; 855 855 856 - static const struct attribute_group bq24257_attr_group = { 857 - .attrs = bq24257_charger_attr, 858 - }; 856 + ATTRIBUTE_GROUPS(bq24257_charger_sysfs); 859 857 860 858 static int bq24257_power_supply_init(struct bq24257_device *bq) 861 859 { 862 860 struct power_supply_config psy_cfg = { .drv_data = bq, }; 863 861 862 + psy_cfg.attr_grp = bq24257_charger_sysfs_groups; 864 863 psy_cfg.supplied_to = bq24257_charger_supplied_to; 865 864 psy_cfg.num_supplicants = ARRAY_SIZE(bq24257_charger_supplied_to); 866 865 ··· 1083 1084 return ret; 1084 1085 } 1085 1086 1086 - ret = sysfs_create_group(&bq->charger->dev.kobj, &bq24257_attr_group); 1087 - if (ret < 0) { 1088 - dev_err(dev, "Can't create sysfs entries\n"); 1089 - return ret; 1090 - } 1091 - 1092 1087 return 0; 1093 1088 } 1094 1089 ··· 1092 1099 1093 1100 if (bq->iilimit_autoset_enable) 1094 1101 cancel_delayed_work_sync(&bq->iilimit_setup_work); 1095 - 1096 - sysfs_remove_group(&bq->charger->dev.kobj, &bq24257_attr_group); 1097 1102 1098 1103 bq24257_field_write(bq, F_RESET, 1); /* reset to defaults */ 1099 1104
+1 -1
drivers/power/supply/bq25890_charger.c
··· 183 183 [F_CHG_TMR] = REG_FIELD(0x07, 1, 2), 184 184 [F_JEITA_ISET] = REG_FIELD(0x07, 0, 0), 185 185 /* REG08 */ 186 - [F_BATCMP] = REG_FIELD(0x08, 6, 7), // 5-7 on BQ25896 186 + [F_BATCMP] = REG_FIELD(0x08, 5, 7), 187 187 [F_VCLAMP] = REG_FIELD(0x08, 2, 4), 188 188 [F_TREG] = REG_FIELD(0x08, 0, 1), 189 189 /* REG09 */
+36 -53
drivers/power/supply/charger-manager.c
··· 363 363 int err = 0, i; 364 364 struct charger_desc *desc = cm->desc; 365 365 366 - /* Ignore if it's redundent command */ 366 + /* Ignore if it's redundant command */ 367 367 if (enable == cm->charger_enabled) 368 368 return 0; 369 369 ··· 1212 1212 if (ret < 0) { 1213 1213 pr_info("Cannot register extcon_dev for %s(cable: %s)\n", 1214 1214 cable->extcon_name, cable->name); 1215 - ret = -EINVAL; 1216 1215 } 1217 1216 1218 1217 return ret; ··· 1351 1352 } 1352 1353 1353 1354 /** 1354 - * charger_manager_register_sysfs - Register sysfs entry for each charger 1355 + * charger_manager_prepare_sysfs - Prepare sysfs entry for each charger 1355 1356 * @cm: the Charger Manager representing the battery. 1356 1357 * 1357 1358 * This function add sysfs entry for charger(regulator) to control charger from ··· 1363 1364 * externally_control, this charger isn't controlled from charger-manager and 1364 1365 * always stay off state of regulator. 1365 1366 */ 1366 - static int charger_manager_register_sysfs(struct charger_manager *cm) 1367 + static int charger_manager_prepare_sysfs(struct charger_manager *cm) 1367 1368 { 1368 1369 struct charger_desc *desc = cm->desc; 1369 1370 struct charger_regulator *charger; 1370 1371 int chargers_externally_control = 1; 1371 - char buf[11]; 1372 - char *str; 1373 - int ret; 1372 + char *name; 1374 1373 int i; 1375 1374 1376 1375 /* Create sysfs entry to control charger(regulator) */ 1377 1376 for (i = 0; i < desc->num_charger_regulators; i++) { 1378 1377 charger = &desc->charger_regulators[i]; 1379 1378 1380 - snprintf(buf, 10, "charger.%d", i); 1381 - str = devm_kzalloc(cm->dev, 1382 - strlen(buf) + 1, GFP_KERNEL); 1383 - if (!str) 1379 + name = devm_kasprintf(cm->dev, GFP_KERNEL, "charger.%d", i); 1380 + if (!name) 1384 1381 return -ENOMEM; 1385 - 1386 - strcpy(str, buf); 1387 1382 1388 1383 charger->attrs[0] = &charger->attr_name.attr; 1389 1384 charger->attrs[1] = &charger->attr_state.attr; 1390 1385 charger->attrs[2] = &charger->attr_externally_control.attr; 1391 1386 charger->attrs[3] = NULL; 1392 - charger->attr_g.name = str; 1393 - charger->attr_g.attrs = charger->attrs; 1387 + 1388 + charger->attr_grp.name = name; 1389 + charger->attr_grp.attrs = charger->attrs; 1390 + desc->sysfs_groups[i] = &charger->attr_grp; 1394 1391 1395 1392 sysfs_attr_init(&charger->attr_name.attr); 1396 1393 charger->attr_name.attr.name = "name"; ··· 1413 1418 1414 1419 dev_info(cm->dev, "'%s' regulator's externally_control is %d\n", 1415 1420 charger->regulator_name, charger->externally_control); 1416 - 1417 - ret = sysfs_create_group(&cm->charger_psy->dev.kobj, 1418 - &charger->attr_g); 1419 - if (ret < 0) { 1420 - dev_err(cm->dev, "Cannot create sysfs entry of %s regulator\n", 1421 - charger->regulator_name); 1422 - return ret; 1423 - } 1424 1421 } 1425 1422 1426 1423 if (chargers_externally_control) { ··· 1508 1521 /* chargers */ 1509 1522 of_property_read_u32(np, "cm-num-chargers", &num_chgs); 1510 1523 if (num_chgs) { 1524 + int i; 1525 + 1511 1526 /* Allocate empty bin at the tail of array */ 1512 1527 desc->psy_charger_stat = devm_kcalloc(dev, 1513 1528 num_chgs + 1, 1514 1529 sizeof(char *), 1515 1530 GFP_KERNEL); 1516 - if (desc->psy_charger_stat) { 1517 - int i; 1518 - for (i = 0; i < num_chgs; i++) 1519 - of_property_read_string_index(np, "cm-chargers", 1520 - i, &desc->psy_charger_stat[i]); 1521 - } else { 1531 + if (!desc->psy_charger_stat) 1522 1532 return ERR_PTR(-ENOMEM); 1523 - } 1533 + 1534 + for (i = 0; i < num_chgs; i++) 1535 + of_property_read_string_index(np, "cm-chargers", 1536 + i, &desc->psy_charger_stat[i]); 1524 1537 } 1525 1538 1526 1539 of_property_read_string(np, "cm-fuel-gauge", &desc->psy_fuel_gauge); ··· 1552 1565 return ERR_PTR(-ENOMEM); 1553 1566 1554 1567 desc->charger_regulators = chg_regs; 1568 + 1569 + desc->sysfs_groups = devm_kcalloc(dev, 1570 + desc->num_charger_regulators + 1, 1571 + sizeof(*desc->sysfs_groups), 1572 + GFP_KERNEL); 1573 + if (!desc->sysfs_groups) 1574 + return ERR_PTR(-ENOMEM); 1555 1575 1556 1576 for_each_child_of_node(np, child) { 1557 1577 struct charger_cable *cables; ··· 1627 1633 1628 1634 if (IS_ERR(desc)) { 1629 1635 dev_err(&pdev->dev, "No platform data (desc) found\n"); 1630 - return -ENODEV; 1636 + return PTR_ERR(desc); 1631 1637 } 1632 1638 1633 1639 cm = devm_kzalloc(&pdev->dev, sizeof(*cm), GFP_KERNEL); ··· 1680 1686 dev_err(&pdev->dev, "No fuel gauge power supply defined\n"); 1681 1687 return -EINVAL; 1682 1688 } 1683 - 1684 - /* Counting index only */ 1685 - while (desc->psy_charger_stat[i]) 1686 - i++; 1687 1689 1688 1690 /* Check if charger's supplies are present at probe */ 1689 1691 for (i = 0; desc->psy_charger_stat[i]; i++) { ··· 1762 1772 1763 1773 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk); 1764 1774 1775 + /* Register sysfs entry for charger(regulator) */ 1776 + ret = charger_manager_prepare_sysfs(cm); 1777 + if (ret < 0) { 1778 + dev_err(&pdev->dev, 1779 + "Cannot prepare sysfs entry of regulators\n"); 1780 + return ret; 1781 + } 1782 + psy_cfg.attr_grp = desc->sysfs_groups; 1783 + 1765 1784 cm->charger_psy = power_supply_register(&pdev->dev, 1766 1785 &cm->charger_psy_desc, 1767 1786 &psy_cfg); ··· 1787 1788 goto err_reg_extcon; 1788 1789 } 1789 1790 1790 - /* Register sysfs entry for charger(regulator) */ 1791 - ret = charger_manager_register_sysfs(cm); 1792 - if (ret < 0) { 1793 - dev_err(&pdev->dev, 1794 - "Cannot initialize sysfs entry of regulator\n"); 1795 - goto err_reg_sysfs; 1796 - } 1797 - 1798 1791 /* Add to the list */ 1799 1792 mutex_lock(&cm_list_mtx); 1800 1793 list_add(&cm->entry, &cm_list); ··· 1794 1803 1795 1804 /* 1796 1805 * Charger-manager is capable of waking up the systme from sleep 1797 - * when event is happend through cm_notify_event() 1806 + * when event is happened through cm_notify_event() 1798 1807 */ 1799 1808 device_init_wakeup(&pdev->dev, true); 1800 1809 device_set_wakeup_capable(&pdev->dev, false); ··· 1810 1819 1811 1820 return 0; 1812 1821 1813 - err_reg_sysfs: 1814 - for (i = 0; i < desc->num_charger_regulators; i++) { 1815 - struct charger_regulator *charger; 1816 - 1817 - charger = &desc->charger_regulators[i]; 1818 - sysfs_remove_group(&cm->charger_psy->dev.kobj, 1819 - &charger->attr_g); 1820 - } 1821 1822 err_reg_extcon: 1822 1823 for (i = 0; i < desc->num_charger_regulators; i++) { 1823 1824 struct charger_regulator *charger; ··· 2006 2023 * cm_notify_event - charger driver notify Charger Manager of charger event 2007 2024 * @psy: pointer to instance of charger's power_supply 2008 2025 * @type: type of charger event 2009 - * @msg: optional message passed to uevent_notify fuction 2026 + * @msg: optional message passed to uevent_notify function 2010 2027 */ 2011 2028 void cm_notify_event(struct power_supply *psy, enum cm_event_types type, 2012 2029 char *msg)
+1 -1
drivers/power/supply/cpcap-battery.c
··· 620 620 static int cpcap_battery_init_interrupts(struct platform_device *pdev, 621 621 struct cpcap_battery_ddata *ddata) 622 622 { 623 - const char * const cpcap_battery_irqs[] = { 623 + static const char * const cpcap_battery_irqs[] = { 624 624 "eol", "lowbph", "lowbpl", 625 625 "chrgcurr1", "battdetb" 626 626 };
+1 -1
drivers/power/supply/cpcap-charger.c
··· 544 544 if (IS_ERR(ddata->gpio[i])) { 545 545 dev_info(ddata->dev, "no mode change GPIO%i: %li\n", 546 546 i, PTR_ERR(ddata->gpio[i])); 547 - ddata->gpio[i] = NULL; 547 + ddata->gpio[i] = NULL; 548 548 } 549 549 } 550 550 }
+24 -63
drivers/power/supply/ds2780_battery.c
··· 658 658 return count; 659 659 } 660 660 661 - static const struct bin_attribute ds2780_param_eeprom_bin_attr = { 661 + static struct bin_attribute ds2780_param_eeprom_bin_attr = { 662 662 .attr = { 663 663 .name = "param_eeprom", 664 664 .mode = S_IRUGO | S_IWUSR, ··· 703 703 return count; 704 704 } 705 705 706 - static const struct bin_attribute ds2780_user_eeprom_bin_attr = { 706 + static struct bin_attribute ds2780_user_eeprom_bin_attr = { 707 707 .attr = { 708 708 .name = "user_eeprom", 709 709 .mode = S_IRUGO | S_IWUSR, ··· 722 722 static DEVICE_ATTR(pio_pin, S_IRUGO | S_IWUSR, ds2780_get_pio_pin, 723 723 ds2780_set_pio_pin); 724 724 725 - 726 - static struct attribute *ds2780_attributes[] = { 725 + static struct attribute *ds2780_sysfs_attrs[] = { 727 726 &dev_attr_pmod_enabled.attr, 728 727 &dev_attr_sense_resistor_value.attr, 729 728 &dev_attr_rsgain_setting.attr, ··· 730 731 NULL 731 732 }; 732 733 733 - static const struct attribute_group ds2780_attr_group = { 734 - .attrs = ds2780_attributes, 734 + static struct bin_attribute *ds2780_sysfs_bin_attrs[] = { 735 + &ds2780_param_eeprom_bin_attr, 736 + &ds2780_user_eeprom_bin_attr, 737 + NULL 738 + }; 739 + 740 + static const struct attribute_group ds2780_sysfs_group = { 741 + .attrs = ds2780_sysfs_attrs, 742 + .bin_attrs = ds2780_sysfs_bin_attrs, 743 + }; 744 + 745 + static const struct attribute_group *ds2780_sysfs_groups[] = { 746 + &ds2780_sysfs_group, 747 + NULL, 735 748 }; 736 749 737 750 static int ds2780_battery_probe(struct platform_device *pdev) 738 751 { 739 752 struct power_supply_config psy_cfg = {}; 740 - int ret = 0; 741 753 struct ds2780_device_info *dev_info; 742 754 743 755 dev_info = devm_kzalloc(&pdev->dev, sizeof(*dev_info), GFP_KERNEL); 744 - if (!dev_info) { 745 - ret = -ENOMEM; 746 - goto fail; 747 - } 756 + if (!dev_info) 757 + return -ENOMEM; 748 758 749 759 platform_set_drvdata(pdev, dev_info); 750 760 ··· 766 758 dev_info->bat_desc.get_property = ds2780_battery_get_property; 767 759 768 760 psy_cfg.drv_data = dev_info; 761 + psy_cfg.attr_grp = ds2780_sysfs_groups; 769 762 770 - dev_info->bat = power_supply_register(&pdev->dev, &dev_info->bat_desc, 771 - &psy_cfg); 763 + dev_info->bat = devm_power_supply_register(&pdev->dev, 764 + &dev_info->bat_desc, 765 + &psy_cfg); 772 766 if (IS_ERR(dev_info->bat)) { 773 767 dev_err(dev_info->dev, "failed to register battery\n"); 774 - ret = PTR_ERR(dev_info->bat); 775 - goto fail; 768 + return PTR_ERR(dev_info->bat); 776 769 } 777 - 778 - ret = sysfs_create_group(&dev_info->bat->dev.kobj, &ds2780_attr_group); 779 - if (ret) { 780 - dev_err(dev_info->dev, "failed to create sysfs group\n"); 781 - goto fail_unregister; 782 - } 783 - 784 - ret = sysfs_create_bin_file(&dev_info->bat->dev.kobj, 785 - &ds2780_param_eeprom_bin_attr); 786 - if (ret) { 787 - dev_err(dev_info->dev, 788 - "failed to create param eeprom bin file"); 789 - goto fail_remove_group; 790 - } 791 - 792 - ret = sysfs_create_bin_file(&dev_info->bat->dev.kobj, 793 - &ds2780_user_eeprom_bin_attr); 794 - if (ret) { 795 - dev_err(dev_info->dev, 796 - "failed to create user eeprom bin file"); 797 - goto fail_remove_bin_file; 798 - } 799 - 800 - return 0; 801 - 802 - fail_remove_bin_file: 803 - sysfs_remove_bin_file(&dev_info->bat->dev.kobj, 804 - &ds2780_param_eeprom_bin_attr); 805 - fail_remove_group: 806 - sysfs_remove_group(&dev_info->bat->dev.kobj, &ds2780_attr_group); 807 - fail_unregister: 808 - power_supply_unregister(dev_info->bat); 809 - fail: 810 - return ret; 811 - } 812 - 813 - static int ds2780_battery_remove(struct platform_device *pdev) 814 - { 815 - struct ds2780_device_info *dev_info = platform_get_drvdata(pdev); 816 - 817 - /* 818 - * Remove attributes before unregistering power supply 819 - * because 'bat' will be freed on power_supply_unregister() call. 820 - */ 821 - sysfs_remove_group(&dev_info->bat->dev.kobj, &ds2780_attr_group); 822 - 823 - power_supply_unregister(dev_info->bat); 824 770 825 771 return 0; 826 772 } ··· 784 822 .name = "ds2780-battery", 785 823 }, 786 824 .probe = ds2780_battery_probe, 787 - .remove = ds2780_battery_remove, 788 825 }; 789 826 790 827 module_platform_driver(ds2780_battery_driver);
+23 -59
drivers/power/supply/ds2781_battery.c
··· 660 660 return count; 661 661 } 662 662 663 - static const struct bin_attribute ds2781_param_eeprom_bin_attr = { 663 + static struct bin_attribute ds2781_param_eeprom_bin_attr = { 664 664 .attr = { 665 665 .name = "param_eeprom", 666 666 .mode = S_IRUGO | S_IWUSR, ··· 706 706 return count; 707 707 } 708 708 709 - static const struct bin_attribute ds2781_user_eeprom_bin_attr = { 709 + static struct bin_attribute ds2781_user_eeprom_bin_attr = { 710 710 .attr = { 711 711 .name = "user_eeprom", 712 712 .mode = S_IRUGO | S_IWUSR, ··· 725 725 static DEVICE_ATTR(pio_pin, S_IRUGO | S_IWUSR, ds2781_get_pio_pin, 726 726 ds2781_set_pio_pin); 727 727 728 - 729 - static struct attribute *ds2781_attributes[] = { 728 + static struct attribute *ds2781_sysfs_attrs[] = { 730 729 &dev_attr_pmod_enabled.attr, 731 730 &dev_attr_sense_resistor_value.attr, 732 731 &dev_attr_rsgain_setting.attr, ··· 733 734 NULL 734 735 }; 735 736 736 - static const struct attribute_group ds2781_attr_group = { 737 - .attrs = ds2781_attributes, 737 + static struct bin_attribute *ds2781_sysfs_bin_attrs[] = { 738 + &ds2781_param_eeprom_bin_attr, 739 + &ds2781_user_eeprom_bin_attr, 740 + NULL, 741 + }; 742 + 743 + static const struct attribute_group ds2781_sysfs_group = { 744 + .attrs = ds2781_sysfs_attrs, 745 + .bin_attrs = ds2781_sysfs_bin_attrs, 746 + 747 + }; 748 + 749 + static const struct attribute_group *ds2781_sysfs_groups[] = { 750 + &ds2781_sysfs_group, 751 + NULL, 738 752 }; 739 753 740 754 static int ds2781_battery_probe(struct platform_device *pdev) 741 755 { 742 756 struct power_supply_config psy_cfg = {}; 743 - int ret = 0; 744 757 struct ds2781_device_info *dev_info; 745 758 746 759 dev_info = devm_kzalloc(&pdev->dev, sizeof(*dev_info), GFP_KERNEL); ··· 770 759 dev_info->bat_desc.get_property = ds2781_battery_get_property; 771 760 772 761 psy_cfg.drv_data = dev_info; 762 + psy_cfg.attr_grp = ds2781_sysfs_groups; 773 763 774 - dev_info->bat = power_supply_register(&pdev->dev, &dev_info->bat_desc, 775 - &psy_cfg); 764 + dev_info->bat = devm_power_supply_register(&pdev->dev, 765 + &dev_info->bat_desc, 766 + &psy_cfg); 776 767 if (IS_ERR(dev_info->bat)) { 777 768 dev_err(dev_info->dev, "failed to register battery\n"); 778 - ret = PTR_ERR(dev_info->bat); 779 - goto fail; 769 + return PTR_ERR(dev_info->bat); 780 770 } 781 - 782 - ret = sysfs_create_group(&dev_info->bat->dev.kobj, &ds2781_attr_group); 783 - if (ret) { 784 - dev_err(dev_info->dev, "failed to create sysfs group\n"); 785 - goto fail_unregister; 786 - } 787 - 788 - ret = sysfs_create_bin_file(&dev_info->bat->dev.kobj, 789 - &ds2781_param_eeprom_bin_attr); 790 - if (ret) { 791 - dev_err(dev_info->dev, 792 - "failed to create param eeprom bin file"); 793 - goto fail_remove_group; 794 - } 795 - 796 - ret = sysfs_create_bin_file(&dev_info->bat->dev.kobj, 797 - &ds2781_user_eeprom_bin_attr); 798 - if (ret) { 799 - dev_err(dev_info->dev, 800 - "failed to create user eeprom bin file"); 801 - goto fail_remove_bin_file; 802 - } 803 - 804 - return 0; 805 - 806 - fail_remove_bin_file: 807 - sysfs_remove_bin_file(&dev_info->bat->dev.kobj, 808 - &ds2781_param_eeprom_bin_attr); 809 - fail_remove_group: 810 - sysfs_remove_group(&dev_info->bat->dev.kobj, &ds2781_attr_group); 811 - fail_unregister: 812 - power_supply_unregister(dev_info->bat); 813 - fail: 814 - return ret; 815 - } 816 - 817 - static int ds2781_battery_remove(struct platform_device *pdev) 818 - { 819 - struct ds2781_device_info *dev_info = platform_get_drvdata(pdev); 820 - 821 - /* 822 - * Remove attributes before unregistering power supply 823 - * because 'bat' will be freed on power_supply_unregister() call. 824 - */ 825 - sysfs_remove_group(&dev_info->bat->dev.kobj, &ds2781_attr_group); 826 - 827 - power_supply_unregister(dev_info->bat); 828 771 829 772 return 0; 830 773 } ··· 788 823 .name = "ds2781-battery", 789 824 }, 790 825 .probe = ds2781_battery_probe, 791 - .remove = ds2781_battery_remove, 792 826 }; 793 827 module_platform_driver(ds2781_battery_driver); 794 828
+3 -3
drivers/power/supply/gpio-charger.c
··· 82 82 if (!strcmp("usb-sdp", chargetype)) 83 83 return POWER_SUPPLY_TYPE_USB; 84 84 if (!strcmp("usb-dcp", chargetype)) 85 - return POWER_SUPPLY_TYPE_USB_DCP; 85 + return POWER_SUPPLY_TYPE_USB; 86 86 if (!strcmp("usb-cdp", chargetype)) 87 - return POWER_SUPPLY_TYPE_USB_CDP; 87 + return POWER_SUPPLY_TYPE_USB; 88 88 if (!strcmp("usb-aca", chargetype)) 89 - return POWER_SUPPLY_TYPE_USB_ACA; 89 + return POWER_SUPPLY_TYPE_USB; 90 90 } 91 91 dev_warn(dev, "unknown charger type %s\n", chargetype); 92 92
+27 -35
drivers/power/supply/lp8788-charger.c
··· 410 410 .get_property = lp8788_battery_get_property, 411 411 }; 412 412 413 - static int lp8788_psy_register(struct platform_device *pdev, 414 - struct lp8788_charger *pchg) 415 - { 416 - struct power_supply_config charger_cfg = {}; 417 - 418 - charger_cfg.supplied_to = battery_supplied_to; 419 - charger_cfg.num_supplicants = ARRAY_SIZE(battery_supplied_to); 420 - 421 - pchg->charger = power_supply_register(&pdev->dev, 422 - &lp8788_psy_charger_desc, 423 - &charger_cfg); 424 - if (IS_ERR(pchg->charger)) 425 - return -EPERM; 426 - 427 - pchg->battery = power_supply_register(&pdev->dev, 428 - &lp8788_psy_battery_desc, NULL); 429 - if (IS_ERR(pchg->battery)) { 430 - power_supply_unregister(pchg->charger); 431 - return -EPERM; 432 - } 433 - 434 - return 0; 435 - } 436 - 437 413 static void lp8788_psy_unregister(struct lp8788_charger *pchg) 438 414 { 439 415 power_supply_unregister(pchg->battery); ··· 666 690 static DEVICE_ATTR(eoc_time, S_IRUSR, lp8788_show_eoc_time, NULL); 667 691 static DEVICE_ATTR(eoc_level, S_IRUSR, lp8788_show_eoc_level, NULL); 668 692 669 - static struct attribute *lp8788_charger_attr[] = { 693 + static struct attribute *lp8788_charger_sysfs_attrs[] = { 670 694 &dev_attr_charger_status.attr, 671 695 &dev_attr_eoc_time.attr, 672 696 &dev_attr_eoc_level.attr, 673 697 NULL, 674 698 }; 675 699 676 - static const struct attribute_group lp8788_attr_group = { 677 - .attrs = lp8788_charger_attr, 678 - }; 700 + ATTRIBUTE_GROUPS(lp8788_charger_sysfs); 701 + 702 + static int lp8788_psy_register(struct platform_device *pdev, 703 + struct lp8788_charger *pchg) 704 + { 705 + struct power_supply_config charger_cfg = {}; 706 + 707 + charger_cfg.attr_grp = lp8788_charger_sysfs_groups; 708 + charger_cfg.supplied_to = battery_supplied_to; 709 + charger_cfg.num_supplicants = ARRAY_SIZE(battery_supplied_to); 710 + 711 + pchg->charger = power_supply_register(&pdev->dev, 712 + &lp8788_psy_charger_desc, 713 + &charger_cfg); 714 + if (IS_ERR(pchg->charger)) 715 + return -EPERM; 716 + 717 + pchg->battery = power_supply_register(&pdev->dev, 718 + &lp8788_psy_battery_desc, NULL); 719 + if (IS_ERR(pchg->battery)) { 720 + power_supply_unregister(pchg->charger); 721 + return -EPERM; 722 + } 723 + 724 + return 0; 725 + } 679 726 680 727 static int lp8788_charger_probe(struct platform_device *pdev) 681 728 { ··· 725 726 if (ret) 726 727 return ret; 727 728 728 - ret = sysfs_create_group(&pdev->dev.kobj, &lp8788_attr_group); 729 - if (ret) { 730 - lp8788_psy_unregister(pchg); 731 - return ret; 732 - } 733 - 734 729 ret = lp8788_irq_register(pdev, pchg); 735 730 if (ret) 736 731 dev_warn(dev, "failed to register charger irq: %d\n", ret); ··· 738 745 739 746 flush_work(&pchg->charger_work); 740 747 lp8788_irq_unregister(pdev, pchg); 741 - sysfs_remove_group(&pdev->dev.kobj, &lp8788_attr_group); 742 748 lp8788_psy_unregister(pchg); 743 749 lp8788_release_adc_channel(pchg); 744 750
+2 -2
drivers/power/supply/olpc_battery.c
··· 428 428 if (ret) 429 429 return ret; 430 430 431 - val->intval = (s16)be16_to_cpu(ec_word) * 100 / 256; 431 + val->intval = (s16)be16_to_cpu(ec_word) * 10 / 256; 432 432 break; 433 433 case POWER_SUPPLY_PROP_TEMP_AMBIENT: 434 434 ret = olpc_ec_cmd(EC_AMB_TEMP, NULL, 0, (void *)&ec_word, 2); 435 435 if (ret) 436 436 return ret; 437 437 438 - val->intval = (int)be16_to_cpu(ec_word) * 100 / 256; 438 + val->intval = (int)be16_to_cpu(ec_word) * 10 / 256; 439 439 break; 440 440 case POWER_SUPPLY_PROP_CHARGE_COUNTER: 441 441 ret = olpc_ec_cmd(EC_BAT_ACR, NULL, 0, (void *)&ec_word, 2);
+7 -10
drivers/power/supply/pcf50633-charger.c
··· 245 245 */ 246 246 static DEVICE_ATTR(chg_curlim, S_IRUGO | S_IWUSR, show_chglim, set_chglim); 247 247 248 - static struct attribute *pcf50633_mbc_sysfs_entries[] = { 248 + static struct attribute *pcf50633_mbc_sysfs_attrs[] = { 249 249 &dev_attr_chgmode.attr, 250 250 &dev_attr_usb_curlim.attr, 251 251 &dev_attr_chg_curlim.attr, 252 252 NULL, 253 253 }; 254 254 255 - static const struct attribute_group mbc_attr_group = { 256 - .name = NULL, /* put in device directory */ 257 - .attrs = pcf50633_mbc_sysfs_entries, 258 - }; 255 + ATTRIBUTE_GROUPS(pcf50633_mbc_sysfs); 259 256 260 257 static void 261 258 pcf50633_mbc_irq_handler(int irq, void *data) ··· 387 390 static int pcf50633_mbc_probe(struct platform_device *pdev) 388 391 { 389 392 struct power_supply_config psy_cfg = {}; 393 + struct power_supply_config usb_psy_cfg; 390 394 struct pcf50633_mbc *mbc; 391 395 int i; 392 396 u8 mbcs1; ··· 417 419 return PTR_ERR(mbc->adapter); 418 420 } 419 421 422 + usb_psy_cfg = psy_cfg; 423 + usb_psy_cfg.attr_grp = pcf50633_mbc_sysfs_groups; 424 + 420 425 mbc->usb = power_supply_register(&pdev->dev, &pcf50633_mbc_usb_desc, 421 - &psy_cfg); 426 + &usb_psy_cfg); 422 427 if (IS_ERR(mbc->usb)) { 423 428 dev_err(mbc->pcf->dev, "failed to register usb\n"); 424 429 power_supply_unregister(mbc->adapter); ··· 436 435 power_supply_unregister(mbc->usb); 437 436 return PTR_ERR(mbc->ac); 438 437 } 439 - 440 - if (sysfs_create_group(&pdev->dev.kobj, &mbc_attr_group)) 441 - dev_err(mbc->pcf->dev, "failed to create sysfs entries\n"); 442 438 443 439 mbcs1 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS1); 444 440 if (mbcs1 & PCF50633_MBCS1_USBPRES) ··· 455 457 for (i = 0; i < ARRAY_SIZE(mbc_irq_handlers); i++) 456 458 pcf50633_free_irq(mbc->pcf, mbc_irq_handlers[i]); 457 459 458 - sysfs_remove_group(&pdev->dev.kobj, &mbc_attr_group); 459 460 power_supply_unregister(mbc->usb); 460 461 power_supply_unregister(mbc->adapter); 461 462 power_supply_unregister(mbc->ac);
+140 -1
drivers/power/supply/power_supply_core.c
··· 570 570 { 571 571 struct device_node *battery_np; 572 572 const char *value; 573 - int err; 573 + int err, len, index; 574 574 575 575 info->energy_full_design_uwh = -EINVAL; 576 576 info->charge_full_design_uah = -EINVAL; ··· 579 579 info->charge_term_current_ua = -EINVAL; 580 580 info->constant_charge_current_max_ua = -EINVAL; 581 581 info->constant_charge_voltage_max_uv = -EINVAL; 582 + info->factory_internal_resistance_uohm = -EINVAL; 583 + 584 + for (index = 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) { 585 + info->ocv_table[index] = NULL; 586 + info->ocv_temp[index] = -EINVAL; 587 + info->ocv_table_size[index] = -EINVAL; 588 + } 582 589 583 590 if (!psy->of_node) { 584 591 dev_warn(&psy->dev, "%s currently only supports devicetree\n", ··· 623 616 &info->constant_charge_current_max_ua); 624 617 of_property_read_u32(battery_np, "constant_charge_voltage_max_microvolt", 625 618 &info->constant_charge_voltage_max_uv); 619 + of_property_read_u32(battery_np, "factory-internal-resistance-micro-ohms", 620 + &info->factory_internal_resistance_uohm); 621 + 622 + len = of_property_count_u32_elems(battery_np, "ocv-capacity-celsius"); 623 + if (len < 0 && len != -EINVAL) { 624 + return len; 625 + } else if (len > POWER_SUPPLY_OCV_TEMP_MAX) { 626 + dev_err(&psy->dev, "Too many temperature values\n"); 627 + return -EINVAL; 628 + } else if (len > 0) { 629 + of_property_read_u32_array(battery_np, "ocv-capacity-celsius", 630 + info->ocv_temp, len); 631 + } 632 + 633 + for (index = 0; index < len; index++) { 634 + struct power_supply_battery_ocv_table *table; 635 + char *propname; 636 + const __be32 *list; 637 + int i, tab_len, size; 638 + 639 + propname = kasprintf(GFP_KERNEL, "ocv-capacity-table-%d", index); 640 + list = of_get_property(battery_np, propname, &size); 641 + if (!list || !size) { 642 + dev_err(&psy->dev, "failed to get %s\n", propname); 643 + kfree(propname); 644 + power_supply_put_battery_info(psy, info); 645 + return -EINVAL; 646 + } 647 + 648 + kfree(propname); 649 + tab_len = size / (2 * sizeof(__be32)); 650 + info->ocv_table_size[index] = tab_len; 651 + 652 + table = info->ocv_table[index] = 653 + devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); 654 + if (!info->ocv_table[index]) { 655 + power_supply_put_battery_info(psy, info); 656 + return -ENOMEM; 657 + } 658 + 659 + for (i = 0; i < tab_len; i++) { 660 + table[i].ocv = be32_to_cpu(*list++); 661 + table[i].capacity = be32_to_cpu(*list++); 662 + } 663 + } 626 664 627 665 return 0; 628 666 } 629 667 EXPORT_SYMBOL_GPL(power_supply_get_battery_info); 668 + 669 + void power_supply_put_battery_info(struct power_supply *psy, 670 + struct power_supply_battery_info *info) 671 + { 672 + int i; 673 + 674 + for (i = 0; i < POWER_SUPPLY_OCV_TEMP_MAX; i++) { 675 + if (info->ocv_table[i]) 676 + devm_kfree(&psy->dev, info->ocv_table[i]); 677 + } 678 + } 679 + EXPORT_SYMBOL_GPL(power_supply_put_battery_info); 680 + 681 + /** 682 + * power_supply_ocv2cap_simple() - find the battery capacity 683 + * @table: Pointer to battery OCV lookup table 684 + * @table_len: OCV table length 685 + * @ocv: Current OCV value 686 + * 687 + * This helper function is used to look up battery capacity according to 688 + * current OCV value from one OCV table, and the OCV table must be ordered 689 + * descending. 690 + * 691 + * Return: the battery capacity. 692 + */ 693 + int power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table *table, 694 + int table_len, int ocv) 695 + { 696 + int i, cap, tmp; 697 + 698 + for (i = 0; i < table_len; i++) 699 + if (ocv > table[i].ocv) 700 + break; 701 + 702 + if (i > 0 && i < table_len) { 703 + tmp = (table[i - 1].capacity - table[i].capacity) * 704 + (ocv - table[i].ocv); 705 + tmp /= table[i - 1].ocv - table[i].ocv; 706 + cap = tmp + table[i].capacity; 707 + } else if (i == 0) { 708 + cap = table[0].capacity; 709 + } else { 710 + cap = table[table_len - 1].capacity; 711 + } 712 + 713 + return cap; 714 + } 715 + EXPORT_SYMBOL_GPL(power_supply_ocv2cap_simple); 716 + 717 + struct power_supply_battery_ocv_table * 718 + power_supply_find_ocv2cap_table(struct power_supply_battery_info *info, 719 + int temp, int *table_len) 720 + { 721 + int best_temp_diff = INT_MAX, temp_diff; 722 + u8 i, best_index = 0; 723 + 724 + if (!info->ocv_table[0]) 725 + return NULL; 726 + 727 + for (i = 0; i < POWER_SUPPLY_OCV_TEMP_MAX; i++) { 728 + temp_diff = abs(info->ocv_temp[i] - temp); 729 + 730 + if (temp_diff < best_temp_diff) { 731 + best_temp_diff = temp_diff; 732 + best_index = i; 733 + } 734 + } 735 + 736 + *table_len = info->ocv_table_size[best_index]; 737 + return info->ocv_table[best_index]; 738 + } 739 + EXPORT_SYMBOL_GPL(power_supply_find_ocv2cap_table); 740 + 741 + int power_supply_batinfo_ocv2cap(struct power_supply_battery_info *info, 742 + int ocv, int temp) 743 + { 744 + struct power_supply_battery_ocv_table *table; 745 + int table_len; 746 + 747 + table = power_supply_find_ocv2cap_table(info, temp, &table_len); 748 + if (!table) 749 + return -EINVAL; 750 + 751 + return power_supply_ocv2cap_simple(table, table_len, ocv); 752 + } 753 + EXPORT_SYMBOL_GPL(power_supply_batinfo_ocv2cap); 630 754 631 755 int power_supply_get_property(struct power_supply *psy, 632 756 enum power_supply_property psp, ··· 1018 880 dev_set_drvdata(dev, psy); 1019 881 psy->desc = desc; 1020 882 if (cfg) { 883 + dev->groups = cfg->attr_grp; 1021 884 psy->drv_data = cfg->drv_data; 1022 885 psy->of_node = 1023 886 cfg->fwnode ? to_of_node(cfg->fwnode) : cfg->of_node;
+45 -9
drivers/power/supply/sc2731_charger.c
··· 57 57 struct usb_phy *usb_phy; 58 58 struct notifier_block usb_notify; 59 59 struct power_supply *psy_usb; 60 + struct work_struct work; 60 61 struct mutex lock; 61 62 bool charging; 62 63 u32 base; 64 + u32 limit; 63 65 }; 64 66 65 67 static void sc2731_charger_stop_charge(struct sc2731_charger_info *info) ··· 320 318 .property_is_writeable = sc2731_charger_property_is_writeable, 321 319 }; 322 320 323 - static int sc2731_charger_usb_change(struct notifier_block *nb, 324 - unsigned long limit, void *data) 321 + static void sc2731_charger_work(struct work_struct *data) 325 322 { 326 323 struct sc2731_charger_info *info = 327 - container_of(nb, struct sc2731_charger_info, usb_notify); 328 - int ret = 0; 324 + container_of(data, struct sc2731_charger_info, work); 325 + int ret; 329 326 330 327 mutex_lock(&info->lock); 331 328 332 - if (limit > 0) { 329 + if (info->limit > 0 && !info->charging) { 333 330 /* set current limitation and start to charge */ 334 - ret = sc2731_charger_set_current_limit(info, limit); 331 + ret = sc2731_charger_set_current_limit(info, info->limit); 335 332 if (ret) 336 333 goto out; 337 334 338 - ret = sc2731_charger_set_current(info, limit); 335 + ret = sc2731_charger_set_current(info, info->limit); 339 336 if (ret) 340 337 goto out; 341 338 ··· 343 342 goto out; 344 343 345 344 info->charging = true; 346 - } else { 345 + } else if (!info->limit && info->charging) { 347 346 /* Stop charging */ 348 347 info->charging = false; 349 348 sc2731_charger_stop_charge(info); ··· 351 350 352 351 out: 353 352 mutex_unlock(&info->lock); 354 - return ret; 353 + } 354 + 355 + static int sc2731_charger_usb_change(struct notifier_block *nb, 356 + unsigned long limit, void *data) 357 + { 358 + struct sc2731_charger_info *info = 359 + container_of(nb, struct sc2731_charger_info, usb_notify); 360 + 361 + info->limit = limit; 362 + 363 + schedule_work(&info->work); 364 + 365 + return NOTIFY_OK; 355 366 } 356 367 357 368 static int sc2731_charger_hw_init(struct sc2731_charger_info *info) ··· 408 395 vol_val = (term_voltage - 4200) / 100; 409 396 else 410 397 vol_val = 0; 398 + 399 + power_supply_put_battery_info(info->psy_usb, &bat_info); 411 400 } 412 401 413 402 /* Set charge termination current */ ··· 434 419 return ret; 435 420 } 436 421 422 + static void sc2731_charger_detect_status(struct sc2731_charger_info *info) 423 + { 424 + unsigned int min, max; 425 + 426 + /* 427 + * If the USB charger status has been USB_CHARGER_PRESENT before 428 + * registering the notifier, we should start to charge with getting 429 + * the charge current. 430 + */ 431 + if (info->usb_phy->chg_state != USB_CHARGER_PRESENT) 432 + return; 433 + 434 + usb_phy_get_charger_current(info->usb_phy, &min, &max); 435 + info->limit = min; 436 + 437 + schedule_work(&info->work); 438 + } 439 + 437 440 static int sc2731_charger_probe(struct platform_device *pdev) 438 441 { 439 442 struct device_node *np = pdev->dev.of_node; ··· 465 432 466 433 mutex_init(&info->lock); 467 434 info->dev = &pdev->dev; 435 + INIT_WORK(&info->work, sc2731_charger_work); 468 436 469 437 info->regmap = dev_get_regmap(pdev->dev.parent, NULL); 470 438 if (!info->regmap) { ··· 505 471 dev_err(&pdev->dev, "failed to register notifier: %d\n", ret); 506 472 return ret; 507 473 } 474 + 475 + sc2731_charger_detect_status(info); 508 476 509 477 return 0; 510 478 }
+1075
drivers/power/supply/sc27xx_fuel_gauge.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // Copyright (C) 2018 Spreadtrum Communications Inc. 3 + 4 + #include <linux/gpio/consumer.h> 5 + #include <linux/iio/consumer.h> 6 + #include <linux/interrupt.h> 7 + #include <linux/kernel.h> 8 + #include <linux/module.h> 9 + #include <linux/nvmem-consumer.h> 10 + #include <linux/of.h> 11 + #include <linux/platform_device.h> 12 + #include <linux/power_supply.h> 13 + #include <linux/regmap.h> 14 + #include <linux/slab.h> 15 + 16 + /* PMIC global control registers definition */ 17 + #define SC27XX_MODULE_EN0 0xc08 18 + #define SC27XX_CLK_EN0 0xc18 19 + #define SC27XX_FGU_EN BIT(7) 20 + #define SC27XX_FGU_RTC_EN BIT(6) 21 + 22 + /* FGU registers definition */ 23 + #define SC27XX_FGU_START 0x0 24 + #define SC27XX_FGU_CONFIG 0x4 25 + #define SC27XX_FGU_ADC_CONFIG 0x8 26 + #define SC27XX_FGU_STATUS 0xc 27 + #define SC27XX_FGU_INT_EN 0x10 28 + #define SC27XX_FGU_INT_CLR 0x14 29 + #define SC27XX_FGU_INT_STS 0x1c 30 + #define SC27XX_FGU_VOLTAGE 0x20 31 + #define SC27XX_FGU_OCV 0x24 32 + #define SC27XX_FGU_POCV 0x28 33 + #define SC27XX_FGU_CURRENT 0x2c 34 + #define SC27XX_FGU_LOW_OVERLOAD 0x34 35 + #define SC27XX_FGU_CLBCNT_SETH 0x50 36 + #define SC27XX_FGU_CLBCNT_SETL 0x54 37 + #define SC27XX_FGU_CLBCNT_DELTH 0x58 38 + #define SC27XX_FGU_CLBCNT_DELTL 0x5c 39 + #define SC27XX_FGU_CLBCNT_VALH 0x68 40 + #define SC27XX_FGU_CLBCNT_VALL 0x6c 41 + #define SC27XX_FGU_CLBCNT_QMAXL 0x74 42 + #define SC27XX_FGU_USER_AREA_SET 0xa0 43 + #define SC27XX_FGU_USER_AREA_CLEAR 0xa4 44 + #define SC27XX_FGU_USER_AREA_STATUS 0xa8 45 + 46 + #define SC27XX_WRITE_SELCLB_EN BIT(0) 47 + #define SC27XX_FGU_CLBCNT_MASK GENMASK(15, 0) 48 + #define SC27XX_FGU_CLBCNT_SHIFT 16 49 + #define SC27XX_FGU_LOW_OVERLOAD_MASK GENMASK(12, 0) 50 + 51 + #define SC27XX_FGU_INT_MASK GENMASK(9, 0) 52 + #define SC27XX_FGU_LOW_OVERLOAD_INT BIT(0) 53 + #define SC27XX_FGU_CLBCNT_DELTA_INT BIT(2) 54 + 55 + #define SC27XX_FGU_MODE_AREA_MASK GENMASK(15, 12) 56 + #define SC27XX_FGU_CAP_AREA_MASK GENMASK(11, 0) 57 + #define SC27XX_FGU_MODE_AREA_SHIFT 12 58 + 59 + #define SC27XX_FGU_FIRST_POWERTON GENMASK(3, 0) 60 + #define SC27XX_FGU_DEFAULT_CAP GENMASK(11, 0) 61 + #define SC27XX_FGU_NORMAIL_POWERTON 0x5 62 + 63 + #define SC27XX_FGU_CUR_BASIC_ADC 8192 64 + #define SC27XX_FGU_SAMPLE_HZ 2 65 + 66 + /* 67 + * struct sc27xx_fgu_data: describe the FGU device 68 + * @regmap: regmap for register access 69 + * @dev: platform device 70 + * @battery: battery power supply 71 + * @base: the base offset for the controller 72 + * @lock: protect the structure 73 + * @gpiod: GPIO for battery detection 74 + * @channel: IIO channel to get battery temperature 75 + * @internal_resist: the battery internal resistance in mOhm 76 + * @total_cap: the total capacity of the battery in mAh 77 + * @init_cap: the initial capacity of the battery in mAh 78 + * @alarm_cap: the alarm capacity 79 + * @init_clbcnt: the initial coulomb counter 80 + * @max_volt: the maximum constant input voltage in millivolt 81 + * @min_volt: the minimum drained battery voltage in microvolt 82 + * @table_len: the capacity table length 83 + * @cur_1000ma_adc: ADC value corresponding to 1000 mA 84 + * @vol_1000mv_adc: ADC value corresponding to 1000 mV 85 + * @cap_table: capacity table with corresponding ocv 86 + */ 87 + struct sc27xx_fgu_data { 88 + struct regmap *regmap; 89 + struct device *dev; 90 + struct power_supply *battery; 91 + u32 base; 92 + struct mutex lock; 93 + struct gpio_desc *gpiod; 94 + struct iio_channel *channel; 95 + bool bat_present; 96 + int internal_resist; 97 + int total_cap; 98 + int init_cap; 99 + int alarm_cap; 100 + int init_clbcnt; 101 + int max_volt; 102 + int min_volt; 103 + int table_len; 104 + int cur_1000ma_adc; 105 + int vol_1000mv_adc; 106 + struct power_supply_battery_ocv_table *cap_table; 107 + }; 108 + 109 + static int sc27xx_fgu_cap_to_clbcnt(struct sc27xx_fgu_data *data, int capacity); 110 + 111 + static const char * const sc27xx_charger_supply_name[] = { 112 + "sc2731_charger", 113 + "sc2720_charger", 114 + "sc2721_charger", 115 + "sc2723_charger", 116 + }; 117 + 118 + static int sc27xx_fgu_adc_to_current(struct sc27xx_fgu_data *data, int adc) 119 + { 120 + return DIV_ROUND_CLOSEST(adc * 1000, data->cur_1000ma_adc); 121 + } 122 + 123 + static int sc27xx_fgu_adc_to_voltage(struct sc27xx_fgu_data *data, int adc) 124 + { 125 + return DIV_ROUND_CLOSEST(adc * 1000, data->vol_1000mv_adc); 126 + } 127 + 128 + static int sc27xx_fgu_voltage_to_adc(struct sc27xx_fgu_data *data, int vol) 129 + { 130 + return DIV_ROUND_CLOSEST(vol * data->vol_1000mv_adc, 1000); 131 + } 132 + 133 + static bool sc27xx_fgu_is_first_poweron(struct sc27xx_fgu_data *data) 134 + { 135 + int ret, status, cap, mode; 136 + 137 + ret = regmap_read(data->regmap, 138 + data->base + SC27XX_FGU_USER_AREA_STATUS, &status); 139 + if (ret) 140 + return false; 141 + 142 + /* 143 + * We use low 4 bits to save the last battery capacity and high 12 bits 144 + * to save the system boot mode. 145 + */ 146 + mode = (status & SC27XX_FGU_MODE_AREA_MASK) >> SC27XX_FGU_MODE_AREA_SHIFT; 147 + cap = status & SC27XX_FGU_CAP_AREA_MASK; 148 + 149 + /* 150 + * When FGU has been powered down, the user area registers became 151 + * default value (0xffff), which can be used to valid if the system is 152 + * first power on or not. 153 + */ 154 + if (mode == SC27XX_FGU_FIRST_POWERTON || cap == SC27XX_FGU_DEFAULT_CAP) 155 + return true; 156 + 157 + return false; 158 + } 159 + 160 + static int sc27xx_fgu_save_boot_mode(struct sc27xx_fgu_data *data, 161 + int boot_mode) 162 + { 163 + int ret; 164 + 165 + ret = regmap_update_bits(data->regmap, 166 + data->base + SC27XX_FGU_USER_AREA_CLEAR, 167 + SC27XX_FGU_MODE_AREA_MASK, 168 + SC27XX_FGU_MODE_AREA_MASK); 169 + if (ret) 170 + return ret; 171 + 172 + return regmap_update_bits(data->regmap, 173 + data->base + SC27XX_FGU_USER_AREA_SET, 174 + SC27XX_FGU_MODE_AREA_MASK, 175 + boot_mode << SC27XX_FGU_MODE_AREA_SHIFT); 176 + } 177 + 178 + static int sc27xx_fgu_save_last_cap(struct sc27xx_fgu_data *data, int cap) 179 + { 180 + int ret; 181 + 182 + ret = regmap_update_bits(data->regmap, 183 + data->base + SC27XX_FGU_USER_AREA_CLEAR, 184 + SC27XX_FGU_CAP_AREA_MASK, 185 + SC27XX_FGU_CAP_AREA_MASK); 186 + if (ret) 187 + return ret; 188 + 189 + return regmap_update_bits(data->regmap, 190 + data->base + SC27XX_FGU_USER_AREA_SET, 191 + SC27XX_FGU_CAP_AREA_MASK, cap); 192 + } 193 + 194 + static int sc27xx_fgu_read_last_cap(struct sc27xx_fgu_data *data, int *cap) 195 + { 196 + int ret, value; 197 + 198 + ret = regmap_read(data->regmap, 199 + data->base + SC27XX_FGU_USER_AREA_STATUS, &value); 200 + if (ret) 201 + return ret; 202 + 203 + *cap = value & SC27XX_FGU_CAP_AREA_MASK; 204 + return 0; 205 + } 206 + 207 + /* 208 + * When system boots on, we can not read battery capacity from coulomb 209 + * registers, since now the coulomb registers are invalid. So we should 210 + * calculate the battery open circuit voltage, and get current battery 211 + * capacity according to the capacity table. 212 + */ 213 + static int sc27xx_fgu_get_boot_capacity(struct sc27xx_fgu_data *data, int *cap) 214 + { 215 + int volt, cur, oci, ocv, ret; 216 + bool is_first_poweron = sc27xx_fgu_is_first_poweron(data); 217 + 218 + /* 219 + * If system is not the first power on, we should use the last saved 220 + * battery capacity as the initial battery capacity. Otherwise we should 221 + * re-calculate the initial battery capacity. 222 + */ 223 + if (!is_first_poweron) { 224 + ret = sc27xx_fgu_read_last_cap(data, cap); 225 + if (ret) 226 + return ret; 227 + 228 + return sc27xx_fgu_save_boot_mode(data, SC27XX_FGU_NORMAIL_POWERTON); 229 + } 230 + 231 + /* 232 + * After system booting on, the SC27XX_FGU_CLBCNT_QMAXL register saved 233 + * the first sampled open circuit current. 234 + */ 235 + ret = regmap_read(data->regmap, data->base + SC27XX_FGU_CLBCNT_QMAXL, 236 + &cur); 237 + if (ret) 238 + return ret; 239 + 240 + cur <<= 1; 241 + oci = sc27xx_fgu_adc_to_current(data, cur - SC27XX_FGU_CUR_BASIC_ADC); 242 + 243 + /* 244 + * Should get the OCV from SC27XX_FGU_POCV register at the system 245 + * beginning. It is ADC values reading from registers which need to 246 + * convert the corresponding voltage. 247 + */ 248 + ret = regmap_read(data->regmap, data->base + SC27XX_FGU_POCV, &volt); 249 + if (ret) 250 + return ret; 251 + 252 + volt = sc27xx_fgu_adc_to_voltage(data, volt); 253 + ocv = volt * 1000 - oci * data->internal_resist; 254 + 255 + /* 256 + * Parse the capacity table to look up the correct capacity percent 257 + * according to current battery's corresponding OCV values. 258 + */ 259 + *cap = power_supply_ocv2cap_simple(data->cap_table, data->table_len, 260 + ocv); 261 + 262 + ret = sc27xx_fgu_save_last_cap(data, *cap); 263 + if (ret) 264 + return ret; 265 + 266 + return sc27xx_fgu_save_boot_mode(data, SC27XX_FGU_NORMAIL_POWERTON); 267 + } 268 + 269 + static int sc27xx_fgu_set_clbcnt(struct sc27xx_fgu_data *data, int clbcnt) 270 + { 271 + int ret; 272 + 273 + clbcnt *= SC27XX_FGU_SAMPLE_HZ; 274 + 275 + ret = regmap_update_bits(data->regmap, 276 + data->base + SC27XX_FGU_CLBCNT_SETL, 277 + SC27XX_FGU_CLBCNT_MASK, clbcnt); 278 + if (ret) 279 + return ret; 280 + 281 + ret = regmap_update_bits(data->regmap, 282 + data->base + SC27XX_FGU_CLBCNT_SETH, 283 + SC27XX_FGU_CLBCNT_MASK, 284 + clbcnt >> SC27XX_FGU_CLBCNT_SHIFT); 285 + if (ret) 286 + return ret; 287 + 288 + return regmap_update_bits(data->regmap, data->base + SC27XX_FGU_START, 289 + SC27XX_WRITE_SELCLB_EN, 290 + SC27XX_WRITE_SELCLB_EN); 291 + } 292 + 293 + static int sc27xx_fgu_get_clbcnt(struct sc27xx_fgu_data *data, int *clb_cnt) 294 + { 295 + int ccl, cch, ret; 296 + 297 + ret = regmap_read(data->regmap, data->base + SC27XX_FGU_CLBCNT_VALL, 298 + &ccl); 299 + if (ret) 300 + return ret; 301 + 302 + ret = regmap_read(data->regmap, data->base + SC27XX_FGU_CLBCNT_VALH, 303 + &cch); 304 + if (ret) 305 + return ret; 306 + 307 + *clb_cnt = ccl & SC27XX_FGU_CLBCNT_MASK; 308 + *clb_cnt |= (cch & SC27XX_FGU_CLBCNT_MASK) << SC27XX_FGU_CLBCNT_SHIFT; 309 + *clb_cnt /= SC27XX_FGU_SAMPLE_HZ; 310 + 311 + return 0; 312 + } 313 + 314 + static int sc27xx_fgu_get_capacity(struct sc27xx_fgu_data *data, int *cap) 315 + { 316 + int ret, cur_clbcnt, delta_clbcnt, delta_cap, temp; 317 + 318 + /* Get current coulomb counters firstly */ 319 + ret = sc27xx_fgu_get_clbcnt(data, &cur_clbcnt); 320 + if (ret) 321 + return ret; 322 + 323 + delta_clbcnt = cur_clbcnt - data->init_clbcnt; 324 + 325 + /* 326 + * Convert coulomb counter to delta capacity (mAh), and set multiplier 327 + * as 100 to improve the precision. 328 + */ 329 + temp = DIV_ROUND_CLOSEST(delta_clbcnt, 360); 330 + temp = sc27xx_fgu_adc_to_current(data, temp); 331 + 332 + /* 333 + * Convert to capacity percent of the battery total capacity, 334 + * and multiplier is 100 too. 335 + */ 336 + delta_cap = DIV_ROUND_CLOSEST(temp * 100, data->total_cap); 337 + *cap = delta_cap + data->init_cap; 338 + 339 + return 0; 340 + } 341 + 342 + static int sc27xx_fgu_get_vbat_vol(struct sc27xx_fgu_data *data, int *val) 343 + { 344 + int ret, vol; 345 + 346 + ret = regmap_read(data->regmap, data->base + SC27XX_FGU_VOLTAGE, &vol); 347 + if (ret) 348 + return ret; 349 + 350 + /* 351 + * It is ADC values reading from registers which need to convert to 352 + * corresponding voltage values. 353 + */ 354 + *val = sc27xx_fgu_adc_to_voltage(data, vol); 355 + 356 + return 0; 357 + } 358 + 359 + static int sc27xx_fgu_get_current(struct sc27xx_fgu_data *data, int *val) 360 + { 361 + int ret, cur; 362 + 363 + ret = regmap_read(data->regmap, data->base + SC27XX_FGU_CURRENT, &cur); 364 + if (ret) 365 + return ret; 366 + 367 + /* 368 + * It is ADC values reading from registers which need to convert to 369 + * corresponding current values. 370 + */ 371 + *val = sc27xx_fgu_adc_to_current(data, cur - SC27XX_FGU_CUR_BASIC_ADC); 372 + 373 + return 0; 374 + } 375 + 376 + static int sc27xx_fgu_get_vbat_ocv(struct sc27xx_fgu_data *data, int *val) 377 + { 378 + int vol, cur, ret; 379 + 380 + ret = sc27xx_fgu_get_vbat_vol(data, &vol); 381 + if (ret) 382 + return ret; 383 + 384 + ret = sc27xx_fgu_get_current(data, &cur); 385 + if (ret) 386 + return ret; 387 + 388 + /* Return the battery OCV in micro volts. */ 389 + *val = vol * 1000 - cur * data->internal_resist; 390 + 391 + return 0; 392 + } 393 + 394 + static int sc27xx_fgu_get_temp(struct sc27xx_fgu_data *data, int *temp) 395 + { 396 + return iio_read_channel_processed(data->channel, temp); 397 + } 398 + 399 + static int sc27xx_fgu_get_health(struct sc27xx_fgu_data *data, int *health) 400 + { 401 + int ret, vol; 402 + 403 + ret = sc27xx_fgu_get_vbat_vol(data, &vol); 404 + if (ret) 405 + return ret; 406 + 407 + if (vol > data->max_volt) 408 + *health = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 409 + else 410 + *health = POWER_SUPPLY_HEALTH_GOOD; 411 + 412 + return 0; 413 + } 414 + 415 + static int sc27xx_fgu_get_status(struct sc27xx_fgu_data *data, int *status) 416 + { 417 + union power_supply_propval val; 418 + struct power_supply *psy; 419 + int i, ret = -EINVAL; 420 + 421 + for (i = 0; i < ARRAY_SIZE(sc27xx_charger_supply_name); i++) { 422 + psy = power_supply_get_by_name(sc27xx_charger_supply_name[i]); 423 + if (!psy) 424 + continue; 425 + 426 + ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, 427 + &val); 428 + power_supply_put(psy); 429 + if (ret) 430 + return ret; 431 + 432 + *status = val.intval; 433 + } 434 + 435 + return ret; 436 + } 437 + 438 + static int sc27xx_fgu_get_property(struct power_supply *psy, 439 + enum power_supply_property psp, 440 + union power_supply_propval *val) 441 + { 442 + struct sc27xx_fgu_data *data = power_supply_get_drvdata(psy); 443 + int ret = 0; 444 + int value; 445 + 446 + mutex_lock(&data->lock); 447 + 448 + switch (psp) { 449 + case POWER_SUPPLY_PROP_STATUS: 450 + ret = sc27xx_fgu_get_status(data, &value); 451 + if (ret) 452 + goto error; 453 + 454 + val->intval = value; 455 + break; 456 + 457 + case POWER_SUPPLY_PROP_HEALTH: 458 + ret = sc27xx_fgu_get_health(data, &value); 459 + if (ret) 460 + goto error; 461 + 462 + val->intval = value; 463 + break; 464 + 465 + case POWER_SUPPLY_PROP_PRESENT: 466 + val->intval = data->bat_present; 467 + break; 468 + 469 + case POWER_SUPPLY_PROP_TEMP: 470 + ret = sc27xx_fgu_get_temp(data, &value); 471 + if (ret) 472 + goto error; 473 + 474 + val->intval = value; 475 + break; 476 + 477 + case POWER_SUPPLY_PROP_TECHNOLOGY: 478 + val->intval = POWER_SUPPLY_TECHNOLOGY_LION; 479 + break; 480 + 481 + case POWER_SUPPLY_PROP_CAPACITY: 482 + ret = sc27xx_fgu_get_capacity(data, &value); 483 + if (ret) 484 + goto error; 485 + 486 + val->intval = value; 487 + break; 488 + 489 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 490 + ret = sc27xx_fgu_get_vbat_vol(data, &value); 491 + if (ret) 492 + goto error; 493 + 494 + val->intval = value * 1000; 495 + break; 496 + 497 + case POWER_SUPPLY_PROP_VOLTAGE_OCV: 498 + ret = sc27xx_fgu_get_vbat_ocv(data, &value); 499 + if (ret) 500 + goto error; 501 + 502 + val->intval = value; 503 + break; 504 + 505 + case POWER_SUPPLY_PROP_CURRENT_NOW: 506 + case POWER_SUPPLY_PROP_CURRENT_AVG: 507 + ret = sc27xx_fgu_get_current(data, &value); 508 + if (ret) 509 + goto error; 510 + 511 + val->intval = value * 1000; 512 + break; 513 + 514 + default: 515 + ret = -EINVAL; 516 + break; 517 + } 518 + 519 + error: 520 + mutex_unlock(&data->lock); 521 + return ret; 522 + } 523 + 524 + static int sc27xx_fgu_set_property(struct power_supply *psy, 525 + enum power_supply_property psp, 526 + const union power_supply_propval *val) 527 + { 528 + struct sc27xx_fgu_data *data = power_supply_get_drvdata(psy); 529 + int ret; 530 + 531 + if (psp != POWER_SUPPLY_PROP_CAPACITY) 532 + return -EINVAL; 533 + 534 + mutex_lock(&data->lock); 535 + 536 + ret = sc27xx_fgu_save_last_cap(data, val->intval); 537 + 538 + mutex_unlock(&data->lock); 539 + 540 + if (ret < 0) 541 + dev_err(data->dev, "failed to save battery capacity\n"); 542 + 543 + return ret; 544 + } 545 + 546 + static void sc27xx_fgu_external_power_changed(struct power_supply *psy) 547 + { 548 + struct sc27xx_fgu_data *data = power_supply_get_drvdata(psy); 549 + 550 + power_supply_changed(data->battery); 551 + } 552 + 553 + static int sc27xx_fgu_property_is_writeable(struct power_supply *psy, 554 + enum power_supply_property psp) 555 + { 556 + return psp == POWER_SUPPLY_PROP_CAPACITY; 557 + } 558 + 559 + static enum power_supply_property sc27xx_fgu_props[] = { 560 + POWER_SUPPLY_PROP_STATUS, 561 + POWER_SUPPLY_PROP_HEALTH, 562 + POWER_SUPPLY_PROP_PRESENT, 563 + POWER_SUPPLY_PROP_TEMP, 564 + POWER_SUPPLY_PROP_TECHNOLOGY, 565 + POWER_SUPPLY_PROP_CAPACITY, 566 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 567 + POWER_SUPPLY_PROP_VOLTAGE_OCV, 568 + POWER_SUPPLY_PROP_CURRENT_NOW, 569 + POWER_SUPPLY_PROP_CURRENT_AVG, 570 + }; 571 + 572 + static const struct power_supply_desc sc27xx_fgu_desc = { 573 + .name = "sc27xx-fgu", 574 + .type = POWER_SUPPLY_TYPE_BATTERY, 575 + .properties = sc27xx_fgu_props, 576 + .num_properties = ARRAY_SIZE(sc27xx_fgu_props), 577 + .get_property = sc27xx_fgu_get_property, 578 + .set_property = sc27xx_fgu_set_property, 579 + .external_power_changed = sc27xx_fgu_external_power_changed, 580 + .property_is_writeable = sc27xx_fgu_property_is_writeable, 581 + }; 582 + 583 + static void sc27xx_fgu_adjust_cap(struct sc27xx_fgu_data *data, int cap) 584 + { 585 + data->init_cap = cap; 586 + data->init_clbcnt = sc27xx_fgu_cap_to_clbcnt(data, data->init_cap); 587 + } 588 + 589 + static irqreturn_t sc27xx_fgu_interrupt(int irq, void *dev_id) 590 + { 591 + struct sc27xx_fgu_data *data = dev_id; 592 + int ret, cap, ocv, adc; 593 + u32 status; 594 + 595 + mutex_lock(&data->lock); 596 + 597 + ret = regmap_read(data->regmap, data->base + SC27XX_FGU_INT_STS, 598 + &status); 599 + if (ret) 600 + goto out; 601 + 602 + ret = regmap_update_bits(data->regmap, data->base + SC27XX_FGU_INT_CLR, 603 + status, status); 604 + if (ret) 605 + goto out; 606 + 607 + /* 608 + * When low overload voltage interrupt happens, we should calibrate the 609 + * battery capacity in lower voltage stage. 610 + */ 611 + if (!(status & SC27XX_FGU_LOW_OVERLOAD_INT)) 612 + goto out; 613 + 614 + ret = sc27xx_fgu_get_capacity(data, &cap); 615 + if (ret) 616 + goto out; 617 + 618 + ret = sc27xx_fgu_get_vbat_ocv(data, &ocv); 619 + if (ret) 620 + goto out; 621 + 622 + /* 623 + * If current OCV value is less than the minimum OCV value in OCV table, 624 + * which means now battery capacity is 0%, and we should adjust the 625 + * inititial capacity to 0. 626 + */ 627 + if (ocv <= data->cap_table[data->table_len - 1].ocv) { 628 + sc27xx_fgu_adjust_cap(data, 0); 629 + } else if (ocv <= data->min_volt) { 630 + /* 631 + * If current OCV value is less than the low alarm voltage, but 632 + * current capacity is larger than the alarm capacity, we should 633 + * adjust the inititial capacity to alarm capacity. 634 + */ 635 + if (cap > data->alarm_cap) { 636 + sc27xx_fgu_adjust_cap(data, data->alarm_cap); 637 + } else if (cap <= 0) { 638 + int cur_cap; 639 + 640 + /* 641 + * If current capacity is equal with 0 or less than 0 642 + * (some error occurs), we should adjust inititial 643 + * capacity to the capacity corresponding to current OCV 644 + * value. 645 + */ 646 + cur_cap = power_supply_ocv2cap_simple(data->cap_table, 647 + data->table_len, 648 + ocv); 649 + sc27xx_fgu_adjust_cap(data, cur_cap); 650 + } 651 + 652 + /* 653 + * After adjusting the battery capacity, we should set the 654 + * lowest alarm voltage instead. 655 + */ 656 + data->min_volt = data->cap_table[data->table_len - 1].ocv; 657 + adc = sc27xx_fgu_voltage_to_adc(data, data->min_volt / 1000); 658 + regmap_update_bits(data->regmap, data->base + SC27XX_FGU_LOW_OVERLOAD, 659 + SC27XX_FGU_LOW_OVERLOAD_MASK, adc); 660 + } 661 + 662 + out: 663 + mutex_unlock(&data->lock); 664 + 665 + power_supply_changed(data->battery); 666 + return IRQ_HANDLED; 667 + } 668 + 669 + static irqreturn_t sc27xx_fgu_bat_detection(int irq, void *dev_id) 670 + { 671 + struct sc27xx_fgu_data *data = dev_id; 672 + int state; 673 + 674 + mutex_lock(&data->lock); 675 + 676 + state = gpiod_get_value_cansleep(data->gpiod); 677 + if (state < 0) { 678 + dev_err(data->dev, "failed to get gpio state\n"); 679 + mutex_unlock(&data->lock); 680 + return IRQ_RETVAL(state); 681 + } 682 + 683 + data->bat_present = !!state; 684 + 685 + mutex_unlock(&data->lock); 686 + 687 + power_supply_changed(data->battery); 688 + return IRQ_HANDLED; 689 + } 690 + 691 + static void sc27xx_fgu_disable(void *_data) 692 + { 693 + struct sc27xx_fgu_data *data = _data; 694 + 695 + regmap_update_bits(data->regmap, SC27XX_CLK_EN0, SC27XX_FGU_RTC_EN, 0); 696 + regmap_update_bits(data->regmap, SC27XX_MODULE_EN0, SC27XX_FGU_EN, 0); 697 + } 698 + 699 + static int sc27xx_fgu_cap_to_clbcnt(struct sc27xx_fgu_data *data, int capacity) 700 + { 701 + /* 702 + * Get current capacity (mAh) = battery total capacity (mAh) * 703 + * current capacity percent (capacity / 100). 704 + */ 705 + int cur_cap = DIV_ROUND_CLOSEST(data->total_cap * capacity, 100); 706 + 707 + /* 708 + * Convert current capacity (mAh) to coulomb counter according to the 709 + * formula: 1 mAh =3.6 coulomb. 710 + */ 711 + return DIV_ROUND_CLOSEST(cur_cap * 36, 10); 712 + } 713 + 714 + static int sc27xx_fgu_calibration(struct sc27xx_fgu_data *data) 715 + { 716 + struct nvmem_cell *cell; 717 + int calib_data, cal_4200mv; 718 + void *buf; 719 + size_t len; 720 + 721 + cell = nvmem_cell_get(data->dev, "fgu_calib"); 722 + if (IS_ERR(cell)) 723 + return PTR_ERR(cell); 724 + 725 + buf = nvmem_cell_read(cell, &len); 726 + nvmem_cell_put(cell); 727 + 728 + if (IS_ERR(buf)) 729 + return PTR_ERR(buf); 730 + 731 + memcpy(&calib_data, buf, min(len, sizeof(u32))); 732 + 733 + /* 734 + * Get the ADC value corresponding to 4200 mV from eFuse controller 735 + * according to below formula. Then convert to ADC values corresponding 736 + * to 1000 mV and 1000 mA. 737 + */ 738 + cal_4200mv = (calib_data & 0x1ff) + 6963 - 4096 - 256; 739 + data->vol_1000mv_adc = DIV_ROUND_CLOSEST(cal_4200mv * 10, 42); 740 + data->cur_1000ma_adc = data->vol_1000mv_adc * 4; 741 + 742 + kfree(buf); 743 + return 0; 744 + } 745 + 746 + static int sc27xx_fgu_hw_init(struct sc27xx_fgu_data *data) 747 + { 748 + struct power_supply_battery_info info = { }; 749 + struct power_supply_battery_ocv_table *table; 750 + int ret, delta_clbcnt, alarm_adc; 751 + 752 + ret = power_supply_get_battery_info(data->battery, &info); 753 + if (ret) { 754 + dev_err(data->dev, "failed to get battery information\n"); 755 + return ret; 756 + } 757 + 758 + data->total_cap = info.charge_full_design_uah / 1000; 759 + data->max_volt = info.constant_charge_voltage_max_uv / 1000; 760 + data->internal_resist = info.factory_internal_resistance_uohm / 1000; 761 + data->min_volt = info.voltage_min_design_uv; 762 + 763 + /* 764 + * For SC27XX fuel gauge device, we only use one ocv-capacity 765 + * table in normal temperature 20 Celsius. 766 + */ 767 + table = power_supply_find_ocv2cap_table(&info, 20, &data->table_len); 768 + if (!table) 769 + return -EINVAL; 770 + 771 + data->cap_table = devm_kmemdup(data->dev, table, 772 + data->table_len * sizeof(*table), 773 + GFP_KERNEL); 774 + if (!data->cap_table) { 775 + power_supply_put_battery_info(data->battery, &info); 776 + return -ENOMEM; 777 + } 778 + 779 + data->alarm_cap = power_supply_ocv2cap_simple(data->cap_table, 780 + data->table_len, 781 + data->min_volt); 782 + 783 + power_supply_put_battery_info(data->battery, &info); 784 + 785 + ret = sc27xx_fgu_calibration(data); 786 + if (ret) 787 + return ret; 788 + 789 + /* Enable the FGU module */ 790 + ret = regmap_update_bits(data->regmap, SC27XX_MODULE_EN0, 791 + SC27XX_FGU_EN, SC27XX_FGU_EN); 792 + if (ret) { 793 + dev_err(data->dev, "failed to enable fgu\n"); 794 + return ret; 795 + } 796 + 797 + /* Enable the FGU RTC clock to make it work */ 798 + ret = regmap_update_bits(data->regmap, SC27XX_CLK_EN0, 799 + SC27XX_FGU_RTC_EN, SC27XX_FGU_RTC_EN); 800 + if (ret) { 801 + dev_err(data->dev, "failed to enable fgu RTC clock\n"); 802 + goto disable_fgu; 803 + } 804 + 805 + ret = regmap_update_bits(data->regmap, data->base + SC27XX_FGU_INT_CLR, 806 + SC27XX_FGU_INT_MASK, SC27XX_FGU_INT_MASK); 807 + if (ret) { 808 + dev_err(data->dev, "failed to clear interrupt status\n"); 809 + goto disable_clk; 810 + } 811 + 812 + /* 813 + * Set the voltage low overload threshold, which means when the battery 814 + * voltage is lower than this threshold, the controller will generate 815 + * one interrupt to notify. 816 + */ 817 + alarm_adc = sc27xx_fgu_voltage_to_adc(data, data->min_volt / 1000); 818 + ret = regmap_update_bits(data->regmap, data->base + SC27XX_FGU_LOW_OVERLOAD, 819 + SC27XX_FGU_LOW_OVERLOAD_MASK, alarm_adc); 820 + if (ret) { 821 + dev_err(data->dev, "failed to set fgu low overload\n"); 822 + goto disable_clk; 823 + } 824 + 825 + /* 826 + * Set the coulomb counter delta threshold, that means when the coulomb 827 + * counter change is multiples of the delta threshold, the controller 828 + * will generate one interrupt to notify the users to update the battery 829 + * capacity. Now we set the delta threshold as a counter value of 1% 830 + * capacity. 831 + */ 832 + delta_clbcnt = sc27xx_fgu_cap_to_clbcnt(data, 1); 833 + 834 + ret = regmap_update_bits(data->regmap, data->base + SC27XX_FGU_CLBCNT_DELTL, 835 + SC27XX_FGU_CLBCNT_MASK, delta_clbcnt); 836 + if (ret) { 837 + dev_err(data->dev, "failed to set low delta coulomb counter\n"); 838 + goto disable_clk; 839 + } 840 + 841 + ret = regmap_update_bits(data->regmap, data->base + SC27XX_FGU_CLBCNT_DELTH, 842 + SC27XX_FGU_CLBCNT_MASK, 843 + delta_clbcnt >> SC27XX_FGU_CLBCNT_SHIFT); 844 + if (ret) { 845 + dev_err(data->dev, "failed to set high delta coulomb counter\n"); 846 + goto disable_clk; 847 + } 848 + 849 + /* 850 + * Get the boot battery capacity when system powers on, which is used to 851 + * initialize the coulomb counter. After that, we can read the coulomb 852 + * counter to measure the battery capacity. 853 + */ 854 + ret = sc27xx_fgu_get_boot_capacity(data, &data->init_cap); 855 + if (ret) { 856 + dev_err(data->dev, "failed to get boot capacity\n"); 857 + goto disable_clk; 858 + } 859 + 860 + /* 861 + * Convert battery capacity to the corresponding initial coulomb counter 862 + * and set into coulomb counter registers. 863 + */ 864 + data->init_clbcnt = sc27xx_fgu_cap_to_clbcnt(data, data->init_cap); 865 + ret = sc27xx_fgu_set_clbcnt(data, data->init_clbcnt); 866 + if (ret) { 867 + dev_err(data->dev, "failed to initialize coulomb counter\n"); 868 + goto disable_clk; 869 + } 870 + 871 + return 0; 872 + 873 + disable_clk: 874 + regmap_update_bits(data->regmap, SC27XX_CLK_EN0, SC27XX_FGU_RTC_EN, 0); 875 + disable_fgu: 876 + regmap_update_bits(data->regmap, SC27XX_MODULE_EN0, SC27XX_FGU_EN, 0); 877 + 878 + return ret; 879 + } 880 + 881 + static int sc27xx_fgu_probe(struct platform_device *pdev) 882 + { 883 + struct device_node *np = pdev->dev.of_node; 884 + struct power_supply_config fgu_cfg = { }; 885 + struct sc27xx_fgu_data *data; 886 + int ret, irq; 887 + 888 + data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); 889 + if (!data) 890 + return -ENOMEM; 891 + 892 + data->regmap = dev_get_regmap(pdev->dev.parent, NULL); 893 + if (!data->regmap) { 894 + dev_err(&pdev->dev, "failed to get regmap\n"); 895 + return -ENODEV; 896 + } 897 + 898 + ret = device_property_read_u32(&pdev->dev, "reg", &data->base); 899 + if (ret) { 900 + dev_err(&pdev->dev, "failed to get fgu address\n"); 901 + return ret; 902 + } 903 + 904 + data->channel = devm_iio_channel_get(&pdev->dev, "bat-temp"); 905 + if (IS_ERR(data->channel)) { 906 + dev_err(&pdev->dev, "failed to get IIO channel\n"); 907 + return PTR_ERR(data->channel); 908 + } 909 + 910 + data->gpiod = devm_gpiod_get(&pdev->dev, "bat-detect", GPIOD_IN); 911 + if (IS_ERR(data->gpiod)) { 912 + dev_err(&pdev->dev, "failed to get battery detection GPIO\n"); 913 + return PTR_ERR(data->gpiod); 914 + } 915 + 916 + ret = gpiod_get_value_cansleep(data->gpiod); 917 + if (ret < 0) { 918 + dev_err(&pdev->dev, "failed to get gpio state\n"); 919 + return ret; 920 + } 921 + 922 + data->bat_present = !!ret; 923 + mutex_init(&data->lock); 924 + data->dev = &pdev->dev; 925 + platform_set_drvdata(pdev, data); 926 + 927 + fgu_cfg.drv_data = data; 928 + fgu_cfg.of_node = np; 929 + data->battery = devm_power_supply_register(&pdev->dev, &sc27xx_fgu_desc, 930 + &fgu_cfg); 931 + if (IS_ERR(data->battery)) { 932 + dev_err(&pdev->dev, "failed to register power supply\n"); 933 + return PTR_ERR(data->battery); 934 + } 935 + 936 + ret = sc27xx_fgu_hw_init(data); 937 + if (ret) { 938 + dev_err(&pdev->dev, "failed to initialize fgu hardware\n"); 939 + return ret; 940 + } 941 + 942 + ret = devm_add_action(&pdev->dev, sc27xx_fgu_disable, data); 943 + if (ret) { 944 + sc27xx_fgu_disable(data); 945 + dev_err(&pdev->dev, "failed to add fgu disable action\n"); 946 + return ret; 947 + } 948 + 949 + irq = platform_get_irq(pdev, 0); 950 + if (irq < 0) { 951 + dev_err(&pdev->dev, "no irq resource specified\n"); 952 + return irq; 953 + } 954 + 955 + ret = devm_request_threaded_irq(data->dev, irq, NULL, 956 + sc27xx_fgu_interrupt, 957 + IRQF_NO_SUSPEND | IRQF_ONESHOT, 958 + pdev->name, data); 959 + if (ret) { 960 + dev_err(data->dev, "failed to request fgu IRQ\n"); 961 + return ret; 962 + } 963 + 964 + irq = gpiod_to_irq(data->gpiod); 965 + if (irq < 0) { 966 + dev_err(&pdev->dev, "failed to translate GPIO to IRQ\n"); 967 + return irq; 968 + } 969 + 970 + ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, 971 + sc27xx_fgu_bat_detection, 972 + IRQF_ONESHOT | IRQF_TRIGGER_RISING | 973 + IRQF_TRIGGER_FALLING, 974 + pdev->name, data); 975 + if (ret) { 976 + dev_err(&pdev->dev, "failed to request IRQ\n"); 977 + return ret; 978 + } 979 + 980 + return 0; 981 + } 982 + 983 + #ifdef CONFIG_PM_SLEEP 984 + static int sc27xx_fgu_resume(struct device *dev) 985 + { 986 + struct sc27xx_fgu_data *data = dev_get_drvdata(dev); 987 + int ret; 988 + 989 + ret = regmap_update_bits(data->regmap, data->base + SC27XX_FGU_INT_EN, 990 + SC27XX_FGU_LOW_OVERLOAD_INT | 991 + SC27XX_FGU_CLBCNT_DELTA_INT, 0); 992 + if (ret) { 993 + dev_err(data->dev, "failed to disable fgu interrupts\n"); 994 + return ret; 995 + } 996 + 997 + return 0; 998 + } 999 + 1000 + static int sc27xx_fgu_suspend(struct device *dev) 1001 + { 1002 + struct sc27xx_fgu_data *data = dev_get_drvdata(dev); 1003 + int ret, status, ocv; 1004 + 1005 + ret = sc27xx_fgu_get_status(data, &status); 1006 + if (ret) 1007 + return ret; 1008 + 1009 + /* 1010 + * If we are charging, then no need to enable the FGU interrupts to 1011 + * adjust the battery capacity. 1012 + */ 1013 + if (status != POWER_SUPPLY_STATUS_NOT_CHARGING) 1014 + return 0; 1015 + 1016 + ret = regmap_update_bits(data->regmap, data->base + SC27XX_FGU_INT_EN, 1017 + SC27XX_FGU_LOW_OVERLOAD_INT, 1018 + SC27XX_FGU_LOW_OVERLOAD_INT); 1019 + if (ret) { 1020 + dev_err(data->dev, "failed to enable low voltage interrupt\n"); 1021 + return ret; 1022 + } 1023 + 1024 + ret = sc27xx_fgu_get_vbat_ocv(data, &ocv); 1025 + if (ret) 1026 + goto disable_int; 1027 + 1028 + /* 1029 + * If current OCV is less than the minimum voltage, we should enable the 1030 + * coulomb counter threshold interrupt to notify events to adjust the 1031 + * battery capacity. 1032 + */ 1033 + if (ocv < data->min_volt) { 1034 + ret = regmap_update_bits(data->regmap, 1035 + data->base + SC27XX_FGU_INT_EN, 1036 + SC27XX_FGU_CLBCNT_DELTA_INT, 1037 + SC27XX_FGU_CLBCNT_DELTA_INT); 1038 + if (ret) { 1039 + dev_err(data->dev, 1040 + "failed to enable coulomb threshold int\n"); 1041 + goto disable_int; 1042 + } 1043 + } 1044 + 1045 + return 0; 1046 + 1047 + disable_int: 1048 + regmap_update_bits(data->regmap, data->base + SC27XX_FGU_INT_EN, 1049 + SC27XX_FGU_LOW_OVERLOAD_INT, 0); 1050 + return ret; 1051 + } 1052 + #endif 1053 + 1054 + static const struct dev_pm_ops sc27xx_fgu_pm_ops = { 1055 + SET_SYSTEM_SLEEP_PM_OPS(sc27xx_fgu_suspend, sc27xx_fgu_resume) 1056 + }; 1057 + 1058 + static const struct of_device_id sc27xx_fgu_of_match[] = { 1059 + { .compatible = "sprd,sc2731-fgu", }, 1060 + { } 1061 + }; 1062 + 1063 + static struct platform_driver sc27xx_fgu_driver = { 1064 + .probe = sc27xx_fgu_probe, 1065 + .driver = { 1066 + .name = "sc27xx-fgu", 1067 + .of_match_table = sc27xx_fgu_of_match, 1068 + .pm = &sc27xx_fgu_pm_ops, 1069 + } 1070 + }; 1071 + 1072 + module_platform_driver(sc27xx_fgu_driver); 1073 + 1074 + MODULE_DESCRIPTION("Spreadtrum SC27XX PMICs Fual Gauge Unit Driver"); 1075 + MODULE_LICENSE("GPL v2");
+1
include/linux/mfd/axp20x.h
··· 266 266 #define AXP288_RT_BATT_V_H 0xa0 267 267 #define AXP288_RT_BATT_V_L 0xa1 268 268 269 + #define AXP813_ACIN_PATH_CTRL 0x3a 269 270 #define AXP813_ADC_RATE 0x85 270 271 271 272 /* Fuel Gauge */
+2 -1
include/linux/power/charger-manager.h
··· 119 119 struct charger_cable *cables; 120 120 int num_cables; 121 121 122 - struct attribute_group attr_g; 122 + struct attribute_group attr_grp; 123 123 struct device_attribute attr_name; 124 124 struct device_attribute attr_state; 125 125 struct device_attribute attr_externally_control; ··· 186 186 187 187 int num_charger_regulators; 188 188 struct charger_regulator *charger_regulators; 189 + const struct attribute_group **sysfs_groups; 189 190 190 191 const char *psy_fuel_gauge; 191 192
+23
include/linux/power_supply.h
··· 204 204 /* Driver private data */ 205 205 void *drv_data; 206 206 207 + /* Device specific sysfs attributes */ 208 + const struct attribute_group **attr_grp; 209 + 207 210 char **supplied_to; 208 211 size_t num_supplicants; 209 212 }; ··· 312 309 int use_for_apm; 313 310 }; 314 311 312 + struct power_supply_battery_ocv_table { 313 + int ocv; /* microVolts */ 314 + int capacity; /* percent */ 315 + }; 316 + 317 + #define POWER_SUPPLY_OCV_TEMP_MAX 20 318 + 315 319 /* 316 320 * This is the recommended struct to manage static battery parameters, 317 321 * populated by power_supply_get_battery_info(). Most platform drivers should ··· 336 326 int charge_term_current_ua; /* microAmps */ 337 327 int constant_charge_current_max_ua; /* microAmps */ 338 328 int constant_charge_voltage_max_uv; /* microVolts */ 329 + int factory_internal_resistance_uohm; /* microOhms */ 330 + int ocv_temp[POWER_SUPPLY_OCV_TEMP_MAX];/* celsius */ 331 + struct power_supply_battery_ocv_table *ocv_table[POWER_SUPPLY_OCV_TEMP_MAX]; 332 + int ocv_table_size[POWER_SUPPLY_OCV_TEMP_MAX]; 339 333 }; 340 334 341 335 extern struct atomic_notifier_head power_supply_notifier; ··· 363 349 364 350 extern int power_supply_get_battery_info(struct power_supply *psy, 365 351 struct power_supply_battery_info *info); 352 + extern void power_supply_put_battery_info(struct power_supply *psy, 353 + struct power_supply_battery_info *info); 354 + extern int power_supply_ocv2cap_simple(struct power_supply_battery_ocv_table *table, 355 + int table_len, int ocv); 356 + extern struct power_supply_battery_ocv_table * 357 + power_supply_find_ocv2cap_table(struct power_supply_battery_info *info, 358 + int temp, int *table_len); 359 + extern int power_supply_batinfo_ocv2cap(struct power_supply_battery_info *info, 360 + int ocv, int temp); 366 361 extern void power_supply_changed(struct power_supply *psy); 367 362 extern int power_supply_am_i_supplied(struct power_supply *psy); 368 363 extern int power_supply_set_input_current_limit_from_supplier(