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

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

Pull power supply and reset updates from Sebastian Reichel:
"No core patches, only driver updates:

- pwr-mlxbf: new reset driver for Mellanox BlueField

- at91-reset: SAMA7G5 support

- ab8500: continue refurbishing

- misc minor fixes"

* tag 'for-v6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (29 commits)
power: supply: olpc_battery: Hold the reference returned by of_find_compatible_node
power: supply: ab8500: add missing destroy_workqueue in ab8500_charger_bind
power: supply: ab8500: Remove flush_scheduled_work() call.
power: supply: ab8500_fg: drop duplicated 'is' in comment
power: supply: ab8500: Drop external charger leftovers
power: supply: ab8500: Add MAINTAINERS entry
dt-bindings: power: reset: qcom,pshold: convert to dtschema
power: supply: Fix typo in power_supply_check_supplies
power: reset: pwr-mlxbf: change rst_pwr_hid and low_pwr_hid from global to local variables
power: reset: pwr-mlxbf: add missing include
power: reset: at91-reset: add support for SAMA7G5
power: reset: at91-reset: add reset_controller_dev support
power: reset: at91-reset: add at91_reset_data
power: reset: at91-reset: document structures and enums
dt-bindings: reset: add sama7g5 definitions
dt-bindings: reset: atmel,at91sam9260-reset: add sama7g5 bindings
dt-bindings: reset: convert Atmel/Microchip reset controller to YAML
power: reset: pwr-mlxbf: add BlueField SoC power control driver
power: supply: ab8500: Exit maintenance if too low voltage
power: supply: ab8500: Respect charge_restart_voltage_uv
...

+462 -630
-15
Documentation/devicetree/bindings/arm/atmel-sysregs.txt
··· 25 25 Its subnodes can be: 26 26 - watchdog: compatible should be "atmel,at91rm9200-wdt" 27 27 28 - RSTC Reset Controller required properties: 29 - - compatible: Should be "atmel,<chip>-rstc". 30 - <chip> can be "at91sam9260", "at91sam9g45", "sama5d3" or "samx7" 31 - it also can be "microchip,sam9x60-rstc" 32 - - reg: Should contain registers location and length 33 - - clocks: phandle to input clock. 34 - 35 - Example: 36 - 37 - rstc@fffffd00 { 38 - compatible = "atmel,at91sam9260-rstc"; 39 - reg = <0xfffffd00 0x10>; 40 - clocks = <&clk32k>; 41 - }; 42 - 43 28 RAMC SDRAM/DDR Controller required properties: 44 29 - compatible: Should be "atmel,at91rm9200-sdramc", "syscon" 45 30 "atmel,at91sam9260-sdramc",
-17
Documentation/devicetree/bindings/power/reset/msm-poweroff.txt
··· 1 - MSM Restart Driver 2 - 3 - A power supply hold (ps-hold) bit is set to power the msm chipsets. 4 - Clearing that bit allows us to restart/poweroff. The difference 5 - between poweroff and restart is determined by unique power manager IC 6 - settings. 7 - 8 - Required Properties: 9 - -compatible: "qcom,pshold" 10 - -reg: Specifies the physical address of the ps-hold register 11 - 12 - Example: 13 - 14 - restart@fc4ab000 { 15 - compatible = "qcom,pshold"; 16 - reg = <0xfc4ab000 0x4>; 17 - };
+35
Documentation/devicetree/bindings/power/reset/qcom,pshold.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/power/reset/qcom,pshold.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm SoC restart and power off 8 + 9 + maintainers: 10 + - Bjorn Andersson <bjorn.andersson@linaro.org> 11 + 12 + description: 13 + A power supply hold (ps-hold) bit is set to power the Qualcomm chipsets. 14 + Clearing that bit allows us to restart/power off. The difference between 15 + power off and restart is determined by unique power manager IC settings. 16 + 17 + properties: 18 + compatible: 19 + const: qcom,pshold 20 + 21 + reg: 22 + maxItems: 1 23 + 24 + required: 25 + - compatible 26 + - reg 27 + 28 + additionalProperties: false 29 + 30 + examples: 31 + - | 32 + reset-controller@fc4ab000 { 33 + compatible = "qcom,pshold"; 34 + reg = <0xfc4ab000 0x4>; 35 + };
+1 -1
Documentation/devicetree/bindings/power/supply/bq24190.yaml
··· 28 28 maxItems: 1 29 29 30 30 usb-otg-vbus: 31 - type: object 31 + $ref: /schemas/regulator/regulator.yaml# 32 32 description: | 33 33 Regulator that is used to control the VBUS voltage direction for 34 34 either USB host mode or for charging on the OTG port
+8 -1
Documentation/devicetree/bindings/power/supply/qcom,pm8941-charger.yaml
··· 117 117 be done externally to fully comply with the JEITA safety guidelines if this flag 118 118 is set. 119 119 120 + usb-charge-current-limit: 121 + $ref: /schemas/types.yaml#/definitions/uint32 122 + minimum: 100000 123 + maximum: 2500000 124 + description: | 125 + Default USB charge current limit in uA. 126 + 120 127 usb-otg-in-supply: 121 128 description: Reference to the regulator supplying power to the USB_OTG_IN pin. 122 129 123 130 otg-vbus: 124 - type: object 131 + $ref: /schemas/regulator/regulator.yaml# 125 132 description: | 126 133 This node defines a regulator used to control the direction of VBUS voltage. 127 134 Specifically whether to supply voltage to VBUS for host mode operation of the OTG port,
+1 -1
Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml
··· 82 82 - 1 # SMB3XX_SYSOK_INOK_ACTIVE_HIGH 83 83 84 84 usb-vbus: 85 - $ref: "../../regulator/regulator.yaml#" 85 + $ref: /schemas/regulator/regulator.yaml# 86 86 type: object 87 87 88 88 properties:
+68
Documentation/devicetree/bindings/reset/atmel,at91sam9260-reset.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/reset/atmel,at91sam9260-reset.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Atmel/Microchip System Reset Controller 8 + 9 + maintainers: 10 + - Claudiu Beznea <claudiu.beznea@microchip.com> 11 + 12 + description: | 13 + The system reset controller can be used to reset the CPU. In case of 14 + SAMA7G5 it can also reset some devices (e.g. USB PHYs). 15 + 16 + properties: 17 + compatible: 18 + oneOf: 19 + - items: 20 + - enum: 21 + - atmel,at91sam9260-rstc 22 + - atmel,at91sam9g45-rstc 23 + - atmel,sama5d3-rstc 24 + - microchip,sam9x60-rstc 25 + - microchip,sama7g5-rstc 26 + - items: 27 + - const: atmel,sama5d3-rstc 28 + - const: atmel,at91sam9g45-rstc 29 + 30 + reg: 31 + minItems: 1 32 + items: 33 + - description: base registers for system reset control 34 + - description: registers for device specific reset control 35 + 36 + clocks: 37 + maxItems: 1 38 + 39 + "#reset-cells": 40 + const: 1 41 + 42 + required: 43 + - compatible 44 + - reg 45 + - clocks 46 + 47 + allOf: 48 + - if: 49 + properties: 50 + compatible: 51 + contains: 52 + enum: 53 + - microchip,sama7g5-rstc 54 + then: 55 + required: 56 + - "#reset-cells" 57 + 58 + additionalProperties: false 59 + 60 + examples: 61 + - | 62 + #include <dt-bindings/clock/at91.h> 63 + 64 + reset-controller@fffffd00 { 65 + compatible = "atmel,at91sam9260-rstc"; 66 + reg = <0xfffffd00 0x10>; 67 + clocks = <&pmc PMC_TYPE_CORE PMC_SLOW>; 68 + };
+5
MAINTAINERS
··· 264 264 F: Documentation/scsi/aacraid.rst 265 265 F: drivers/scsi/aacraid/ 266 266 267 + AB8500 BATTERY AND CHARGER DRIVERS 268 + M: Linus Walleij <linus.walleij@linaro.org> 269 + F: Documentation/devicetree/bindings/power/supply/*ab8500* 270 + F: drivers/power/supply/*ab8500* 271 + 267 272 ABI/API 268 273 L: linux-api@vger.kernel.org 269 274 F: include/linux/syscalls.h
+6
drivers/power/reset/Kconfig
··· 297 297 then the bootloader can read it and take different 298 298 action according to the mode. 299 299 300 + config POWER_MLXBF 301 + tristate "Mellanox BlueField power handling driver" 302 + depends on (GPIO_MLXBF2 && ACPI) 303 + help 304 + This driver supports reset or low power mode handling for Mellanox BlueField. 305 + 300 306 endif
+1
drivers/power/reset/Makefile
··· 35 35 obj-$(CONFIG_SYSCON_REBOOT_MODE) += syscon-reboot-mode.o 36 36 obj-$(CONFIG_POWER_RESET_SC27XX) += sc27xx-poweroff.o 37 37 obj-$(CONFIG_NVMEM_REBOOT_MODE) += nvmem-reboot-mode.o 38 + obj-$(CONFIG_POWER_MLXBF) += pwr-mlxbf.o
+169 -15
drivers/power/reset/at91-reset.c
··· 17 17 #include <linux/of_address.h> 18 18 #include <linux/platform_device.h> 19 19 #include <linux/reboot.h> 20 + #include <linux/reset-controller.h> 20 21 21 22 #include <soc/at91/at91sam9_ddrsdr.h> 22 23 #include <soc/at91/at91sam9_sdramc.h> 24 + 25 + #include <dt-bindings/reset/sama7g5-reset.h> 23 26 24 27 #define AT91_RSTC_CR 0x00 /* Reset Controller Control Register */ 25 28 #define AT91_RSTC_PROCRST BIT(0) /* Processor Reset */ ··· 42 39 #define AT91_RSTC_URSTIEN BIT(4) /* User Reset Interrupt Enable */ 43 40 #define AT91_RSTC_ERSTL GENMASK(11, 8) /* External Reset Length */ 44 41 42 + /** 43 + * enum reset_type - reset types 44 + * @RESET_TYPE_GENERAL: first power-up reset 45 + * @RESET_TYPE_WAKEUP: return from backup mode 46 + * @RESET_TYPE_WATCHDOG: watchdog fault 47 + * @RESET_TYPE_SOFTWARE: processor reset required by software 48 + * @RESET_TYPE_USER: NRST pin detected low 49 + * @RESET_TYPE_CPU_FAIL: CPU clock failure detection 50 + * @RESET_TYPE_XTAL_FAIL: 32KHz crystal failure dectection fault 51 + * @RESET_TYPE_ULP2: ULP2 reset 52 + */ 45 53 enum reset_type { 46 54 RESET_TYPE_GENERAL = 0, 47 55 RESET_TYPE_WAKEUP = 1, ··· 64 50 RESET_TYPE_ULP2 = 8, 65 51 }; 66 52 53 + /** 54 + * struct at91_reset - AT91 reset specific data structure 55 + * @rstc_base: base address for system reset 56 + * @ramc_base: array with base addresses of RAM controllers 57 + * @dev_base: base address for devices reset 58 + * @sclk: slow clock 59 + * @data: platform specific reset data 60 + * @rcdev: reset controller device 61 + * @lock: lock for devices reset register access 62 + * @nb: reset notifier block 63 + * @args: SoC specific system reset arguments 64 + * @ramc_lpr: SDRAM Controller Low Power Register 65 + */ 67 66 struct at91_reset { 68 67 void __iomem *rstc_base; 69 68 void __iomem *ramc_base[2]; 69 + void __iomem *dev_base; 70 70 struct clk *sclk; 71 + const struct at91_reset_data *data; 72 + struct reset_controller_dev rcdev; 73 + spinlock_t lock; 71 74 struct notifier_block nb; 72 75 u32 args; 73 76 u32 ramc_lpr; 77 + }; 78 + 79 + #define to_at91_reset(r) container_of(r, struct at91_reset, rcdev) 80 + 81 + /** 82 + * struct at91_reset_data - AT91 reset data 83 + * @reset_args: SoC specific system reset arguments 84 + * @n_device_reset: number of device resets 85 + * @device_reset_min_id: min id for device reset 86 + * @device_reset_max_id: max id for device reset 87 + */ 88 + struct at91_reset_data { 89 + u32 reset_args; 90 + u32 n_device_reset; 91 + u8 device_reset_min_id; 92 + u8 device_reset_max_id; 74 93 }; 75 94 76 95 /* ··· 142 95 "r" (reset->rstc_base), 143 96 "r" (1), 144 97 "r" cpu_to_le32(AT91_DDRSDRC_LPCB_POWER_DOWN), 145 - "r" (reset->args), 98 + "r" (reset->data->reset_args), 146 99 "r" (reset->ramc_lpr) 147 100 : "r4"); 148 101 ··· 200 153 { /* sentinel */ } 201 154 }; 202 155 156 + static const struct at91_reset_data sam9260 = { 157 + .reset_args = AT91_RSTC_KEY | AT91_RSTC_PERRST | AT91_RSTC_PROCRST, 158 + }; 159 + 160 + static const struct at91_reset_data samx7 = { 161 + .reset_args = AT91_RSTC_KEY | AT91_RSTC_PROCRST, 162 + }; 163 + 164 + static const struct at91_reset_data sama7g5 = { 165 + .reset_args = AT91_RSTC_KEY | AT91_RSTC_PROCRST, 166 + .n_device_reset = 3, 167 + .device_reset_min_id = SAMA7G5_RESET_USB_PHY1, 168 + .device_reset_max_id = SAMA7G5_RESET_USB_PHY3, 169 + }; 170 + 203 171 static const struct of_device_id at91_reset_of_match[] = { 204 172 { 205 173 .compatible = "atmel,at91sam9260-rstc", 206 - .data = (void *)(AT91_RSTC_KEY | AT91_RSTC_PERRST | 207 - AT91_RSTC_PROCRST), 174 + .data = &sam9260, 208 175 }, 209 176 { 210 177 .compatible = "atmel,at91sam9g45-rstc", 211 - .data = (void *)(AT91_RSTC_KEY | AT91_RSTC_PERRST | 212 - AT91_RSTC_PROCRST) 178 + .data = &sam9260, 213 179 }, 214 180 { 215 181 .compatible = "atmel,sama5d3-rstc", 216 - .data = (void *)(AT91_RSTC_KEY | AT91_RSTC_PERRST | 217 - AT91_RSTC_PROCRST) 182 + .data = &sam9260, 218 183 }, 219 184 { 220 185 .compatible = "atmel,samx7-rstc", 221 - .data = (void *)(AT91_RSTC_KEY | AT91_RSTC_PROCRST) 186 + .data = &samx7, 222 187 }, 223 188 { 224 189 .compatible = "microchip,sam9x60-rstc", 225 - .data = (void *)(AT91_RSTC_KEY | AT91_RSTC_PROCRST) 190 + .data = &samx7, 191 + }, 192 + { 193 + .compatible = "microchip,sama7g5-rstc", 194 + .data = &sama7g5, 226 195 }, 227 196 { /* sentinel */ } 228 197 }; 229 198 MODULE_DEVICE_TABLE(of, at91_reset_of_match); 199 + 200 + static int at91_reset_update(struct reset_controller_dev *rcdev, 201 + unsigned long id, bool assert) 202 + { 203 + struct at91_reset *reset = to_at91_reset(rcdev); 204 + unsigned long flags; 205 + u32 val; 206 + 207 + spin_lock_irqsave(&reset->lock, flags); 208 + val = readl_relaxed(reset->dev_base); 209 + if (assert) 210 + val |= BIT(id); 211 + else 212 + val &= ~BIT(id); 213 + writel_relaxed(val, reset->dev_base); 214 + spin_unlock_irqrestore(&reset->lock, flags); 215 + 216 + return 0; 217 + } 218 + 219 + static int at91_reset_assert(struct reset_controller_dev *rcdev, 220 + unsigned long id) 221 + { 222 + return at91_reset_update(rcdev, id, true); 223 + } 224 + 225 + static int at91_reset_deassert(struct reset_controller_dev *rcdev, 226 + unsigned long id) 227 + { 228 + return at91_reset_update(rcdev, id, false); 229 + } 230 + 231 + static int at91_reset_dev_status(struct reset_controller_dev *rcdev, 232 + unsigned long id) 233 + { 234 + struct at91_reset *reset = to_at91_reset(rcdev); 235 + u32 val; 236 + 237 + val = readl_relaxed(reset->dev_base); 238 + 239 + return !!(val & BIT(id)); 240 + } 241 + 242 + static const struct reset_control_ops at91_reset_ops = { 243 + .assert = at91_reset_assert, 244 + .deassert = at91_reset_deassert, 245 + .status = at91_reset_dev_status, 246 + }; 247 + 248 + static int at91_reset_of_xlate(struct reset_controller_dev *rcdev, 249 + const struct of_phandle_args *reset_spec) 250 + { 251 + struct at91_reset *reset = to_at91_reset(rcdev); 252 + 253 + if (!reset->data->n_device_reset || 254 + (reset_spec->args[0] < reset->data->device_reset_min_id || 255 + reset_spec->args[0] > reset->data->device_reset_max_id)) 256 + return -EINVAL; 257 + 258 + return reset_spec->args[0]; 259 + } 260 + 261 + static int at91_rcdev_init(struct at91_reset *reset, 262 + struct platform_device *pdev) 263 + { 264 + if (!reset->data->n_device_reset) 265 + return 0; 266 + 267 + reset->dev_base = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 1, 268 + NULL); 269 + if (IS_ERR(reset->dev_base)) 270 + return -ENODEV; 271 + 272 + spin_lock_init(&reset->lock); 273 + reset->rcdev.ops = &at91_reset_ops; 274 + reset->rcdev.owner = THIS_MODULE; 275 + reset->rcdev.of_node = pdev->dev.of_node; 276 + reset->rcdev.nr_resets = reset->data->n_device_reset; 277 + reset->rcdev.of_reset_n_cells = 1; 278 + reset->rcdev.of_xlate = at91_reset_of_xlate; 279 + 280 + return devm_reset_controller_register(&pdev->dev, &reset->rcdev); 281 + } 230 282 231 283 static int __init at91_reset_probe(struct platform_device *pdev) 232 284 { ··· 358 212 } 359 213 } 360 214 361 - match = of_match_node(at91_reset_of_match, pdev->dev.of_node); 215 + reset->data = device_get_match_data(&pdev->dev); 216 + if (!reset->data) 217 + return -ENODEV; 218 + 362 219 reset->nb.notifier_call = at91_reset; 363 220 reset->nb.priority = 192; 364 - reset->args = (u32)match->data; 365 221 366 222 reset->sclk = devm_clk_get(&pdev->dev, NULL); 367 223 if (IS_ERR(reset->sclk)) ··· 377 229 378 230 platform_set_drvdata(pdev, reset); 379 231 232 + ret = at91_rcdev_init(reset, pdev); 233 + if (ret) 234 + goto disable_clk; 235 + 380 236 if (of_device_is_compatible(pdev->dev.of_node, "microchip,sam9x60-rstc")) { 381 237 u32 val = readl(reset->rstc_base + AT91_RSTC_MR); 382 238 ··· 389 237 } 390 238 391 239 ret = register_restart_handler(&reset->nb); 392 - if (ret) { 393 - clk_disable_unprepare(reset->sclk); 394 - return ret; 395 - } 240 + if (ret) 241 + goto disable_clk; 396 242 397 243 at91_reset_status(pdev, reset->rstc_base); 398 244 399 245 return 0; 246 + 247 + disable_clk: 248 + clk_disable_unprepare(reset->sclk); 249 + return ret; 400 250 } 401 251 402 252 static int __exit at91_reset_remove(struct platform_device *pdev)
+97
drivers/power/reset/pwr-mlxbf.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only or BSD-3-Clause 2 + 3 + /* 4 + * Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. 5 + */ 6 + 7 + #include <linux/acpi.h> 8 + #include <linux/device.h> 9 + #include <linux/devm-helpers.h> 10 + #include <linux/interrupt.h> 11 + #include <linux/kernel.h> 12 + #include <linux/mod_devicetable.h> 13 + #include <linux/module.h> 14 + #include <linux/platform_device.h> 15 + #include <linux/pm.h> 16 + #include <linux/reboot.h> 17 + #include <linux/types.h> 18 + 19 + struct pwr_mlxbf { 20 + struct work_struct send_work; 21 + const char *hid; 22 + }; 23 + 24 + static void pwr_mlxbf_send_work(struct work_struct *work) 25 + { 26 + acpi_bus_generate_netlink_event("button/power.*", "Power Button", 0x80, 1); 27 + } 28 + 29 + static irqreturn_t pwr_mlxbf_irq(int irq, void *ptr) 30 + { 31 + const char *rst_pwr_hid = "MLNXBF24"; 32 + const char *low_pwr_hid = "MLNXBF29"; 33 + struct pwr_mlxbf *priv = ptr; 34 + 35 + if (!strncmp(priv->hid, rst_pwr_hid, 8)) 36 + emergency_restart(); 37 + 38 + if (!strncmp(priv->hid, low_pwr_hid, 8)) 39 + schedule_work(&priv->send_work); 40 + 41 + return IRQ_HANDLED; 42 + } 43 + 44 + static int pwr_mlxbf_probe(struct platform_device *pdev) 45 + { 46 + struct device *dev = &pdev->dev; 47 + struct acpi_device *adev; 48 + struct pwr_mlxbf *priv; 49 + const char *hid; 50 + int irq, err; 51 + 52 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 53 + if (!priv) 54 + return -ENOMEM; 55 + 56 + adev = ACPI_COMPANION(dev); 57 + if (!adev) 58 + return -ENXIO; 59 + 60 + hid = acpi_device_hid(adev); 61 + priv->hid = hid; 62 + 63 + irq = acpi_dev_gpio_irq_get(ACPI_COMPANION(dev), 0); 64 + if (irq < 0) 65 + return dev_err_probe(dev, irq, "Error getting %s irq.\n", priv->hid); 66 + 67 + err = devm_work_autocancel(dev, &priv->send_work, pwr_mlxbf_send_work); 68 + if (err) 69 + return err; 70 + 71 + err = devm_request_irq(dev, irq, pwr_mlxbf_irq, 0, hid, priv); 72 + if (err) 73 + dev_err(dev, "Failed request of %s irq\n", priv->hid); 74 + 75 + return err; 76 + } 77 + 78 + static const struct acpi_device_id __maybe_unused pwr_mlxbf_acpi_match[] = { 79 + { "MLNXBF24", 0 }, 80 + { "MLNXBF29", 0 }, 81 + {}, 82 + }; 83 + MODULE_DEVICE_TABLE(acpi, pwr_mlxbf_acpi_match); 84 + 85 + static struct platform_driver pwr_mlxbf_driver = { 86 + .driver = { 87 + .name = "pwr_mlxbf", 88 + .acpi_match_table = pwr_mlxbf_acpi_match, 89 + }, 90 + .probe = pwr_mlxbf_probe, 91 + }; 92 + 93 + module_platform_driver(pwr_mlxbf_driver); 94 + 95 + MODULE_DESCRIPTION("Mellanox BlueField power driver"); 96 + MODULE_AUTHOR("Asmaa Mnebhi <asmaa@nvidia.com>"); 97 + MODULE_LICENSE("Dual BSD/GPL");
-4
drivers/power/supply/ab8500-chargalg.h
··· 34 34 * @max_out_volt_uv maximum output charger voltage in uV 35 35 * @max_out_curr_ua maximum output charger current in uA 36 36 * @enabled indicates if this charger is used or not 37 - * @external external charger unit (pm2xxx) 38 37 */ 39 38 struct ux500_charger { 40 39 struct power_supply *psy; ··· 42 43 int max_out_curr_ua; 43 44 int wdt_refresh; 44 45 bool enabled; 45 - bool external; 46 46 }; 47 - 48 - extern struct blocking_notifier_head charger_notifier_list; 49 47 50 48 #endif /* _AB8500_CHARGALG_H_ */
-1
drivers/power/supply/ab8500_btemp.c
··· 697 697 698 698 /* Delete the work queue */ 699 699 destroy_workqueue(di->btemp_wq); 700 - flush_scheduled_work(); 701 700 } 702 701 703 702 static const struct component_ops ab8500_btemp_component_ops = {
+46 -24
drivers/power/supply/ab8500_chargalg.c
··· 246 246 struct kobject chargalg_kobject; 247 247 }; 248 248 249 - /*External charger prepare notifier*/ 250 - BLOCKING_NOTIFIER_HEAD(charger_notifier_list); 251 - 252 249 /* Main battery properties */ 253 250 static enum power_supply_property ab8500_chargalg_props[] = { 254 251 POWER_SUPPLY_PROP_STATUS, ··· 340 343 return di->usb_chg->ops.check_enable(di->usb_chg, 341 344 bi->constant_charge_voltage_max_uv, 342 345 bi->constant_charge_current_max_ua); 343 - } else if ((di->chg_info.charger_type & AC_CHG) && 344 - !(di->ac_chg->external)) { 346 + } else if (di->chg_info.charger_type & AC_CHG) { 345 347 return di->ac_chg->ops.check_enable(di->ac_chg, 346 348 bi->constant_charge_voltage_max_uv, 347 349 bi->constant_charge_current_max_ua); ··· 469 473 /* Check if charger exists and kick watchdog if charging */ 470 474 if (di->ac_chg && di->ac_chg->ops.kick_wd && 471 475 di->chg_info.online_chg & AC_CHG) { 472 - /* 473 - * If AB charger watchdog expired, pm2xxx charging 474 - * gets disabled. To be safe, kick both AB charger watchdog 475 - * and pm2xxx watchdog. 476 - */ 477 - if (di->ac_chg->external && 478 - di->usb_chg && di->usb_chg->ops.kick_wd) 479 - di->usb_chg->ops.kick_wd(di->usb_chg); 480 - 481 476 return di->ac_chg->ops.kick_wd(di->ac_chg); 482 477 } else if (di->usb_chg && di->usb_chg->ops.kick_wd && 483 478 di->chg_info.online_chg & USB_CHG) ··· 503 516 504 517 di->chg_info.ac_iset_ua = iset_ua; 505 518 di->chg_info.ac_vset_uv = vset_uv; 506 - 507 - /* Enable external charger */ 508 - if (enable && di->ac_chg->external && 509 - !ab8500_chargalg_ex_ac_enable_toggle) { 510 - blocking_notifier_call_chain(&charger_notifier_list, 511 - 0, di->dev); 512 - ab8500_chargalg_ex_ac_enable_toggle++; 513 - } 514 519 515 520 return di->ac_chg->ops.enable(di->ac_chg, enable, vset_uv, iset_ua); 516 521 } ··· 1196 1217 } 1197 1218 1198 1219 /** 1220 + * ab8500_chargalg_time_to_restart() - time to restart CC/CV charging? 1221 + * @di: charging algorithm state 1222 + * 1223 + * This checks if the voltage or capacity of the battery has fallen so 1224 + * low that we need to restart the CC/CV charge cycle. 1225 + */ 1226 + static bool ab8500_chargalg_time_to_restart(struct ab8500_chargalg *di) 1227 + { 1228 + struct power_supply_battery_info *bi = di->bm->bi; 1229 + 1230 + /* Sanity check - these need to have some reasonable values */ 1231 + if (!di->batt_data.volt_uv || !di->batt_data.percent) 1232 + return false; 1233 + 1234 + /* Some batteries tell us at which voltage we should restart charging */ 1235 + if (bi->charge_restart_voltage_uv > 0) { 1236 + if (di->batt_data.volt_uv <= bi->charge_restart_voltage_uv) 1237 + return true; 1238 + /* Else we restart as we reach a certain capacity */ 1239 + } else { 1240 + if (di->batt_data.percent <= AB8500_RECHARGE_CAP) 1241 + return true; 1242 + } 1243 + 1244 + return false; 1245 + } 1246 + 1247 + /** 1199 1248 * ab8500_chargalg_algorithm() - Main function for the algorithm 1200 1249 * @di: pointer to the ab8500_chargalg structure 1201 1250 * ··· 1466 1459 fallthrough; 1467 1460 1468 1461 case STATE_WAIT_FOR_RECHARGE: 1469 - if (di->batt_data.percent <= AB8500_RECHARGE_CAP) 1462 + if (ab8500_chargalg_time_to_restart(di)) 1470 1463 ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1471 1464 break; 1472 1465 ··· 1493 1486 ab8500_chargalg_stop_maintenance_timer(di); 1494 1487 ab8500_chargalg_state_to(di, STATE_MAINTENANCE_B_INIT); 1495 1488 } 1489 + /* 1490 + * This happens if the voltage drops too quickly during 1491 + * maintenance charging, especially in older batteries. 1492 + */ 1493 + if (ab8500_chargalg_time_to_restart(di)) { 1494 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1495 + dev_info(di->dev, "restarted charging from maintenance state A - battery getting old?\n"); 1496 + } 1496 1497 break; 1497 1498 1498 1499 case STATE_MAINTENANCE_B_INIT: ··· 1524 1509 if (di->events.maintenance_timer_expired) { 1525 1510 ab8500_chargalg_stop_maintenance_timer(di); 1526 1511 ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1512 + } 1513 + /* 1514 + * This happens if the voltage drops too quickly during 1515 + * maintenance charging, especially in older batteries. 1516 + */ 1517 + if (ab8500_chargalg_time_to_restart(di)) { 1518 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1519 + dev_info(di->dev, "restarted charging from maintenance state B - battery getting old?\n"); 1527 1520 } 1528 1521 break; 1529 1522 ··· 1769 1746 1770 1747 /* Delete the work queue */ 1771 1748 destroy_workqueue(di->chargalg_wq); 1772 - flush_scheduled_work(); 1773 1749 } 1774 1750 1775 1751 static const struct component_ops ab8500_chargalg_component_ops = {
+2 -46
drivers/power/supply/ab8500_charger.c
··· 1716 1716 return ret; 1717 1717 } 1718 1718 1719 - static int ab8500_external_charger_prepare(struct notifier_block *charger_nb, 1720 - unsigned long event, void *data) 1721 - { 1722 - int ret; 1723 - struct device *dev = data; 1724 - /*Toggle External charger control pin*/ 1725 - ret = abx500_set_register_interruptible(dev, AB8500_SYS_CTRL1_BLOCK, 1726 - AB8500_SYS_CHARGER_CONTROL_REG, 1727 - EXTERNAL_CHARGER_DISABLE_REG_VAL); 1728 - if (ret < 0) { 1729 - dev_err(dev, "write reg failed %d\n", ret); 1730 - goto out; 1731 - } 1732 - ret = abx500_set_register_interruptible(dev, AB8500_SYS_CTRL1_BLOCK, 1733 - AB8500_SYS_CHARGER_CONTROL_REG, 1734 - EXTERNAL_CHARGER_ENABLE_REG_VAL); 1735 - if (ret < 0) 1736 - dev_err(dev, "Write reg failed %d\n", ret); 1737 - 1738 - out: 1739 - return ret; 1740 - } 1741 - 1742 1719 /** 1743 1720 * ab8500_charger_usb_check_enable() - enable usb charging 1744 1721 * @charger: pointer to the ux500_charger structure ··· 3293 3316 return 0; 3294 3317 } 3295 3318 3296 - static struct notifier_block charger_nb = { 3297 - .notifier_call = ab8500_external_charger_prepare, 3298 - }; 3299 - 3300 3319 static char *supply_interface[] = { 3301 3320 "ab8500_chargalg", 3302 3321 "ab8500_fg", ··· 3351 3378 ret = component_bind_all(dev, di); 3352 3379 if (ret) { 3353 3380 dev_err(dev, "can't bind component devices\n"); 3381 + destroy_workqueue(di->charger_wq); 3354 3382 return ret; 3355 3383 } 3356 3384 ··· 3377 3403 3378 3404 /* Delete the work queue */ 3379 3405 destroy_workqueue(di->charger_wq); 3380 - 3381 - flush_scheduled_work(); 3382 3406 3383 3407 /* Unbind fg, btemp, algorithm */ 3384 3408 component_unbind_all(dev, di); ··· 3512 3540 */ 3513 3541 if (!is_ab8505(di->parent)) 3514 3542 di->ac_chg.enabled = true; 3515 - di->ac_chg.external = false; 3516 3543 3517 3544 /* USB supply */ 3518 3545 /* ux500_charger sub-class */ ··· 3524 3553 di->usb_chg.max_out_curr_ua = 3525 3554 ab8500_charge_output_curr_map[ARRAY_SIZE(ab8500_charge_output_curr_map) - 1]; 3526 3555 di->usb_chg.wdt_refresh = CHG_WD_INTERVAL; 3527 - di->usb_chg.external = false; 3528 3556 di->usb_state.usb_current_ua = -1; 3529 3557 3530 3558 mutex_init(&di->charger_attached_mutex); ··· 3647 3677 goto remove_ab8500_bm; 3648 3678 } 3649 3679 3650 - /* Notifier for external charger enabling */ 3651 - if (!di->ac_chg.enabled) 3652 - blocking_notifier_chain_register( 3653 - &charger_notifier_list, &charger_nb); 3654 - 3655 - 3656 3680 di->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2); 3657 3681 if (IS_ERR_OR_NULL(di->usb_phy)) { 3658 3682 dev_err(dev, "failed to get usb transceiver\n"); 3659 3683 ret = -EINVAL; 3660 - goto out_charger_notifier; 3684 + goto remove_ab8500_bm; 3661 3685 } 3662 3686 di->nb.notifier_call = ab8500_charger_usb_notifier_call; 3663 3687 ret = usb_register_notifier(di->usb_phy, &di->nb); ··· 3659 3695 dev_err(dev, "failed to register usb notifier\n"); 3660 3696 goto put_usb_phy; 3661 3697 } 3662 - 3663 3698 3664 3699 ret = component_master_add_with_match(&pdev->dev, 3665 3700 &ab8500_charger_comp_ops, ··· 3674 3711 usb_unregister_notifier(di->usb_phy, &di->nb); 3675 3712 put_usb_phy: 3676 3713 usb_put_phy(di->usb_phy); 3677 - out_charger_notifier: 3678 - if (!di->ac_chg.enabled) 3679 - blocking_notifier_chain_unregister( 3680 - &charger_notifier_list, &charger_nb); 3681 3714 remove_ab8500_bm: 3682 3715 ab8500_bm_of_remove(di->usb_chg.psy, di->bm); 3683 3716 return ret; ··· 3688 3729 usb_unregister_notifier(di->usb_phy, &di->nb); 3689 3730 ab8500_bm_of_remove(di->usb_chg.psy, di->bm); 3690 3731 usb_put_phy(di->usb_phy); 3691 - if (!di->ac_chg.enabled) 3692 - blocking_notifier_chain_unregister( 3693 - &charger_notifier_list, &charger_nb); 3694 3732 3695 3733 return 0; 3696 3734 }
+1 -2
drivers/power/supply/ab8500_fg.c
··· 412 412 * ab8500_fg_clear_cap_samples() - Clear average filter 413 413 * @di: pointer to the ab8500_fg structure 414 414 * 415 - * The capacity filter is is reset to zero. 415 + * The capacity filter is reset to zero. 416 416 */ 417 417 static void ab8500_fg_clear_cap_samples(struct ab8500_fg *di) 418 418 { ··· 3234 3234 struct ab8500_fg *di = platform_get_drvdata(pdev); 3235 3235 3236 3236 destroy_workqueue(di->fg_wq); 3237 - flush_scheduled_work(); 3238 3237 component_del(&pdev->dev, &ab8500_fg_component_ops); 3239 3238 list_del(&di->node); 3240 3239 ab8500_fg_sysfs_exit(di);
+1 -1
drivers/power/supply/bq24257_charger.c
··· 287 287 { 288 288 /* 289 289 * Address the case where the user manually sets an input current limit 290 - * while the charger auto-detection mechanism is is active. In this 290 + * while the charger auto-detection mechanism is active. In this 291 291 * case we want to abort and go straight to the user-specified value. 292 292 */ 293 293 if (bq->iilimit_autoset_enable)
+1 -1
drivers/power/supply/cros_peripheral_charger.c
··· 63 63 struct cros_ec_command *msg; 64 64 int ret; 65 65 66 - msg = kzalloc(sizeof(*msg) + max(outsize, insize), GFP_KERNEL); 66 + msg = kzalloc(struct_size(msg, data, max(outsize, insize)), GFP_KERNEL); 67 67 if (!msg) 68 68 return -ENOMEM; 69 69
+1 -3
drivers/power/supply/goldfish_battery.c
··· 221 221 } 222 222 223 223 data->irq = platform_get_irq(pdev, 0); 224 - if (data->irq < 0) { 225 - dev_err(&pdev->dev, "platform_get_irq failed\n"); 224 + if (data->irq < 0) 226 225 return -ENODEV; 227 - } 228 226 229 227 ret = devm_request_irq(&pdev->dev, data->irq, 230 228 goldfish_battery_interrupt,
+1 -1
drivers/power/supply/lp8788-charger.c
··· 376 376 return 0; 377 377 } 378 378 379 - /* settting charging parameters */ 379 + /* setting charging parameters */ 380 380 for (i = 0; i < pdata->num_chg_params; i++) { 381 381 param = pdata->chg_params + i; 382 382
+2 -2
drivers/power/supply/max77976_charger.c
··· 3 3 * max77976_charger.c - Driver for the Maxim MAX77976 battery charger 4 4 * 5 5 * Copyright (C) 2021 Luca Ceresoli 6 - * Author: Luca Ceresoli <luca@lucaceresoli.net> 6 + * Author: Luca Ceresoli <luca.ceresoli@bootlin.com> 7 7 */ 8 8 9 9 #include <linux/i2c.h> ··· 504 504 }; 505 505 module_i2c_driver(max77976_driver); 506 506 507 - MODULE_AUTHOR("Luca Ceresoli <luca@lucaceresoli.net>"); 507 + MODULE_AUTHOR("Luca Ceresoli <luca.ceresoli@bootlin.com>"); 508 508 MODULE_DESCRIPTION("Maxim MAX77976 charger driver"); 509 509 MODULE_LICENSE("GPL v2");
+4 -1
drivers/power/supply/olpc_battery.c
··· 635 635 struct power_supply_config bat_psy_cfg = {}; 636 636 struct power_supply_config ac_psy_cfg = {}; 637 637 struct olpc_battery_data *data; 638 + struct device_node *np; 638 639 uint8_t status; 639 640 uint8_t ecver; 640 641 int ret; ··· 650 649 if (ret) 651 650 return ret; 652 651 653 - if (of_find_compatible_node(NULL, NULL, "olpc,xo1.75-ec")) { 652 + np = of_find_compatible_node(NULL, NULL, "olpc,xo1.75-ec"); 653 + if (np) { 654 + of_node_put(np); 654 655 /* XO 1.75 */ 655 656 data->new_proto = true; 656 657 data->little_endian = true;
-492
drivers/power/supply/pm2301_charger.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * Copyright (C) ST-Ericsson SA 2012 4 - * 5 - * PM2301 power supply interface 6 - */ 7 - 8 - #ifndef PM2301_CHARGER_H 9 - #define PM2301_CHARGER_H 10 - 11 - /* Watchdog timeout constant */ 12 - #define WD_TIMER 0x30 /* 4min */ 13 - #define WD_KICK_INTERVAL (30 * HZ) 14 - 15 - #define PM2XXX_NUM_INT_REG 0x6 16 - 17 - /* Constant voltage/current */ 18 - #define PM2XXX_CONST_CURR 0x0 19 - #define PM2XXX_CONST_VOLT 0x1 20 - 21 - /* Lowest charger voltage is 3.39V -> 0x4E */ 22 - #define LOW_VOLT_REG 0x4E 23 - 24 - #define PM2XXX_BATT_CTRL_REG1 0x00 25 - #define PM2XXX_BATT_CTRL_REG2 0x01 26 - #define PM2XXX_BATT_CTRL_REG3 0x02 27 - #define PM2XXX_BATT_CTRL_REG4 0x03 28 - #define PM2XXX_BATT_CTRL_REG5 0x04 29 - #define PM2XXX_BATT_CTRL_REG6 0x05 30 - #define PM2XXX_BATT_CTRL_REG7 0x06 31 - #define PM2XXX_BATT_CTRL_REG8 0x07 32 - #define PM2XXX_NTC_CTRL_REG1 0x08 33 - #define PM2XXX_NTC_CTRL_REG2 0x09 34 - #define PM2XXX_BATT_CTRL_REG9 0x0A 35 - #define PM2XXX_BATT_STAT_REG1 0x0B 36 - #define PM2XXX_INP_VOLT_VPWR2 0x11 37 - #define PM2XXX_INP_DROP_VPWR2 0x13 38 - #define PM2XXX_INP_VOLT_VPWR1 0x15 39 - #define PM2XXX_INP_DROP_VPWR1 0x17 40 - #define PM2XXX_INP_MODE_VPWR 0x18 41 - #define PM2XXX_BATT_WD_KICK 0x70 42 - #define PM2XXX_DEV_VER_STAT 0x0C 43 - #define PM2XXX_THERM_WARN_CTRL_REG 0x20 44 - #define PM2XXX_BATT_DISC_REG 0x21 45 - #define PM2XXX_BATT_LOW_LEV_COMP_REG 0x22 46 - #define PM2XXX_BATT_LOW_LEV_VAL_REG 0x23 47 - #define PM2XXX_I2C_PAD_CTRL_REG 0x24 48 - #define PM2XXX_SW_CTRL_REG 0x26 49 - #define PM2XXX_LED_CTRL_REG 0x28 50 - 51 - #define PM2XXX_REG_INT1 0x40 52 - #define PM2XXX_MASK_REG_INT1 0x50 53 - #define PM2XXX_SRCE_REG_INT1 0x60 54 - #define PM2XXX_REG_INT2 0x41 55 - #define PM2XXX_MASK_REG_INT2 0x51 56 - #define PM2XXX_SRCE_REG_INT2 0x61 57 - #define PM2XXX_REG_INT3 0x42 58 - #define PM2XXX_MASK_REG_INT3 0x52 59 - #define PM2XXX_SRCE_REG_INT3 0x62 60 - #define PM2XXX_REG_INT4 0x43 61 - #define PM2XXX_MASK_REG_INT4 0x53 62 - #define PM2XXX_SRCE_REG_INT4 0x63 63 - #define PM2XXX_REG_INT5 0x44 64 - #define PM2XXX_MASK_REG_INT5 0x54 65 - #define PM2XXX_SRCE_REG_INT5 0x64 66 - #define PM2XXX_REG_INT6 0x45 67 - #define PM2XXX_MASK_REG_INT6 0x55 68 - #define PM2XXX_SRCE_REG_INT6 0x65 69 - 70 - #define VPWR_OVV 0x0 71 - #define VSYSTEM_OVV 0x1 72 - 73 - /* control Reg 1 */ 74 - #define PM2XXX_CH_RESUME_EN 0x1 75 - #define PM2XXX_CH_RESUME_DIS 0x0 76 - 77 - /* control Reg 2 */ 78 - #define PM2XXX_CH_AUTO_RESUME_EN 0X2 79 - #define PM2XXX_CH_AUTO_RESUME_DIS 0X0 80 - #define PM2XXX_CHARGER_ENA 0x4 81 - #define PM2XXX_CHARGER_DIS 0x0 82 - 83 - /* control Reg 3 */ 84 - #define PM2XXX_CH_WD_CC_PHASE_OFF 0x0 85 - #define PM2XXX_CH_WD_CC_PHASE_5MIN 0x1 86 - #define PM2XXX_CH_WD_CC_PHASE_10MIN 0x2 87 - #define PM2XXX_CH_WD_CC_PHASE_30MIN 0x3 88 - #define PM2XXX_CH_WD_CC_PHASE_60MIN 0x4 89 - #define PM2XXX_CH_WD_CC_PHASE_120MIN 0x5 90 - #define PM2XXX_CH_WD_CC_PHASE_240MIN 0x6 91 - #define PM2XXX_CH_WD_CC_PHASE_360MIN 0x7 92 - 93 - #define PM2XXX_CH_WD_CV_PHASE_OFF (0x0<<3) 94 - #define PM2XXX_CH_WD_CV_PHASE_5MIN (0x1<<3) 95 - #define PM2XXX_CH_WD_CV_PHASE_10MIN (0x2<<3) 96 - #define PM2XXX_CH_WD_CV_PHASE_30MIN (0x3<<3) 97 - #define PM2XXX_CH_WD_CV_PHASE_60MIN (0x4<<3) 98 - #define PM2XXX_CH_WD_CV_PHASE_120MIN (0x5<<3) 99 - #define PM2XXX_CH_WD_CV_PHASE_240MIN (0x6<<3) 100 - #define PM2XXX_CH_WD_CV_PHASE_360MIN (0x7<<3) 101 - 102 - /* control Reg 4 */ 103 - #define PM2XXX_CH_WD_PRECH_PHASE_OFF 0x0 104 - #define PM2XXX_CH_WD_PRECH_PHASE_1MIN 0x1 105 - #define PM2XXX_CH_WD_PRECH_PHASE_5MIN 0x2 106 - #define PM2XXX_CH_WD_PRECH_PHASE_10MIN 0x3 107 - #define PM2XXX_CH_WD_PRECH_PHASE_30MIN 0x4 108 - #define PM2XXX_CH_WD_PRECH_PHASE_60MIN 0x5 109 - #define PM2XXX_CH_WD_PRECH_PHASE_120MIN 0x6 110 - #define PM2XXX_CH_WD_PRECH_PHASE_240MIN 0x7 111 - 112 - /* control Reg 5 */ 113 - #define PM2XXX_CH_WD_AUTO_TIMEOUT_NONE 0x0 114 - #define PM2XXX_CH_WD_AUTO_TIMEOUT_20MIN 0x1 115 - 116 - /* control Reg 6 */ 117 - #define PM2XXX_DIR_CH_CC_CURRENT_MASK 0x0F 118 - #define PM2XXX_DIR_CH_CC_CURRENT_200MA 0x0 119 - #define PM2XXX_DIR_CH_CC_CURRENT_400MA 0x2 120 - #define PM2XXX_DIR_CH_CC_CURRENT_600MA 0x3 121 - #define PM2XXX_DIR_CH_CC_CURRENT_800MA 0x4 122 - #define PM2XXX_DIR_CH_CC_CURRENT_1000MA 0x5 123 - #define PM2XXX_DIR_CH_CC_CURRENT_1200MA 0x6 124 - #define PM2XXX_DIR_CH_CC_CURRENT_1400MA 0x7 125 - #define PM2XXX_DIR_CH_CC_CURRENT_1600MA 0x8 126 - #define PM2XXX_DIR_CH_CC_CURRENT_1800MA 0x9 127 - #define PM2XXX_DIR_CH_CC_CURRENT_2000MA 0xA 128 - #define PM2XXX_DIR_CH_CC_CURRENT_2200MA 0xB 129 - #define PM2XXX_DIR_CH_CC_CURRENT_2400MA 0xC 130 - #define PM2XXX_DIR_CH_CC_CURRENT_2600MA 0xD 131 - #define PM2XXX_DIR_CH_CC_CURRENT_2800MA 0xE 132 - #define PM2XXX_DIR_CH_CC_CURRENT_3000MA 0xF 133 - 134 - #define PM2XXX_CH_PRECH_CURRENT_MASK 0x30 135 - #define PM2XXX_CH_PRECH_CURRENT_25MA (0x0<<4) 136 - #define PM2XXX_CH_PRECH_CURRENT_50MA (0x1<<4) 137 - #define PM2XXX_CH_PRECH_CURRENT_75MA (0x2<<4) 138 - #define PM2XXX_CH_PRECH_CURRENT_100MA (0x3<<4) 139 - 140 - #define PM2XXX_CH_EOC_CURRENT_MASK 0xC0 141 - #define PM2XXX_CH_EOC_CURRENT_100MA (0x0<<6) 142 - #define PM2XXX_CH_EOC_CURRENT_150MA (0x1<<6) 143 - #define PM2XXX_CH_EOC_CURRENT_300MA (0x2<<6) 144 - #define PM2XXX_CH_EOC_CURRENT_400MA (0x3<<6) 145 - 146 - /* control Reg 7 */ 147 - #define PM2XXX_CH_PRECH_VOL_2_5 0x0 148 - #define PM2XXX_CH_PRECH_VOL_2_7 0x1 149 - #define PM2XXX_CH_PRECH_VOL_2_9 0x2 150 - #define PM2XXX_CH_PRECH_VOL_3_1 0x3 151 - 152 - #define PM2XXX_CH_VRESUME_VOL_3_2 (0x0<<2) 153 - #define PM2XXX_CH_VRESUME_VOL_3_4 (0x1<<2) 154 - #define PM2XXX_CH_VRESUME_VOL_3_6 (0x2<<2) 155 - #define PM2XXX_CH_VRESUME_VOL_3_8 (0x3<<2) 156 - 157 - /* control Reg 8 */ 158 - #define PM2XXX_CH_VOLT_MASK 0x3F 159 - #define PM2XXX_CH_VOLT_3_5 0x0 160 - #define PM2XXX_CH_VOLT_3_5225 0x1 161 - #define PM2XXX_CH_VOLT_3_6 0x4 162 - #define PM2XXX_CH_VOLT_3_7 0x8 163 - #define PM2XXX_CH_VOLT_4_0 0x14 164 - #define PM2XXX_CH_VOLT_4_175 0x1B 165 - #define PM2XXX_CH_VOLT_4_2 0x1C 166 - #define PM2XXX_CH_VOLT_4_275 0x1F 167 - #define PM2XXX_CH_VOLT_4_3 0x20 168 - 169 - /*NTC control register 1*/ 170 - #define PM2XXX_BTEMP_HIGH_TH_45 0x0 171 - #define PM2XXX_BTEMP_HIGH_TH_50 0x1 172 - #define PM2XXX_BTEMP_HIGH_TH_55 0x2 173 - #define PM2XXX_BTEMP_HIGH_TH_60 0x3 174 - #define PM2XXX_BTEMP_HIGH_TH_65 0x4 175 - 176 - #define PM2XXX_BTEMP_LOW_TH_N5 (0x0<<3) 177 - #define PM2XXX_BTEMP_LOW_TH_0 (0x1<<3) 178 - #define PM2XXX_BTEMP_LOW_TH_5 (0x2<<3) 179 - #define PM2XXX_BTEMP_LOW_TH_10 (0x3<<3) 180 - 181 - /*NTC control register 2*/ 182 - #define PM2XXX_NTC_BETA_COEFF_3477 0x0 183 - #define PM2XXX_NTC_BETA_COEFF_3964 0x1 184 - 185 - #define PM2XXX_NTC_RES_10K (0x0<<2) 186 - #define PM2XXX_NTC_RES_47K (0x1<<2) 187 - #define PM2XXX_NTC_RES_100K (0x2<<2) 188 - #define PM2XXX_NTC_RES_NO_NTC (0x3<<2) 189 - 190 - /* control Reg 9 */ 191 - #define PM2XXX_CH_CC_MODEDROP_EN 1 192 - #define PM2XXX_CH_CC_MODEDROP_DIS 0 193 - 194 - #define PM2XXX_CH_CC_REDUCED_CURRENT_100MA (0x0<<1) 195 - #define PM2XXX_CH_CC_REDUCED_CURRENT_200MA (0x1<<1) 196 - #define PM2XXX_CH_CC_REDUCED_CURRENT_400MA (0x2<<1) 197 - #define PM2XXX_CH_CC_REDUCED_CURRENT_IDENT (0x3<<1) 198 - 199 - #define PM2XXX_CHARCHING_INFO_DIS (0<<3) 200 - #define PM2XXX_CHARCHING_INFO_EN (1<<3) 201 - 202 - #define PM2XXX_CH_150MV_DROP_300MV (0<<4) 203 - #define PM2XXX_CH_150MV_DROP_150MV (1<<4) 204 - 205 - 206 - /* charger status register */ 207 - #define PM2XXX_CHG_STATUS_OFF 0x0 208 - #define PM2XXX_CHG_STATUS_ON 0x1 209 - #define PM2XXX_CHG_STATUS_FULL 0x2 210 - #define PM2XXX_CHG_STATUS_ERR 0x3 211 - #define PM2XXX_CHG_STATUS_WAIT 0x4 212 - #define PM2XXX_CHG_STATUS_NOBAT 0x5 213 - 214 - /* Input charger voltage VPWR2 */ 215 - #define PM2XXX_VPWR2_OVV_6_0 0x0 216 - #define PM2XXX_VPWR2_OVV_6_3 0x1 217 - #define PM2XXX_VPWR2_OVV_10 0x2 218 - #define PM2XXX_VPWR2_OVV_NONE 0x3 219 - 220 - /* Input charger drop VPWR2 */ 221 - #define PM2XXX_VPWR2_HW_OPT_EN (0x1<<4) 222 - #define PM2XXX_VPWR2_HW_OPT_DIS (0x0<<4) 223 - 224 - #define PM2XXX_VPWR2_VALID_EN (0x1<<3) 225 - #define PM2XXX_VPWR2_VALID_DIS (0x0<<3) 226 - 227 - #define PM2XXX_VPWR2_DROP_EN (0x1<<2) 228 - #define PM2XXX_VPWR2_DROP_DIS (0x0<<2) 229 - 230 - /* Input charger voltage VPWR1 */ 231 - #define PM2XXX_VPWR1_OVV_6_0 0x0 232 - #define PM2XXX_VPWR1_OVV_6_3 0x1 233 - #define PM2XXX_VPWR1_OVV_10 0x2 234 - #define PM2XXX_VPWR1_OVV_NONE 0x3 235 - 236 - /* Input charger drop VPWR1 */ 237 - #define PM2XXX_VPWR1_HW_OPT_EN (0x1<<4) 238 - #define PM2XXX_VPWR1_HW_OPT_DIS (0x0<<4) 239 - 240 - #define PM2XXX_VPWR1_VALID_EN (0x1<<3) 241 - #define PM2XXX_VPWR1_VALID_DIS (0x0<<3) 242 - 243 - #define PM2XXX_VPWR1_DROP_EN (0x1<<2) 244 - #define PM2XXX_VPWR1_DROP_DIS (0x0<<2) 245 - 246 - /* Battery low level comparator control register */ 247 - #define PM2XXX_VBAT_LOW_MONITORING_DIS 0x0 248 - #define PM2XXX_VBAT_LOW_MONITORING_ENA 0x1 249 - 250 - /* Battery low level value control register */ 251 - #define PM2XXX_VBAT_LOW_LEVEL_2_3 0x0 252 - #define PM2XXX_VBAT_LOW_LEVEL_2_4 0x1 253 - #define PM2XXX_VBAT_LOW_LEVEL_2_5 0x2 254 - #define PM2XXX_VBAT_LOW_LEVEL_2_6 0x3 255 - #define PM2XXX_VBAT_LOW_LEVEL_2_7 0x4 256 - #define PM2XXX_VBAT_LOW_LEVEL_2_8 0x5 257 - #define PM2XXX_VBAT_LOW_LEVEL_2_9 0x6 258 - #define PM2XXX_VBAT_LOW_LEVEL_3_0 0x7 259 - #define PM2XXX_VBAT_LOW_LEVEL_3_1 0x8 260 - #define PM2XXX_VBAT_LOW_LEVEL_3_2 0x9 261 - #define PM2XXX_VBAT_LOW_LEVEL_3_3 0xA 262 - #define PM2XXX_VBAT_LOW_LEVEL_3_4 0xB 263 - #define PM2XXX_VBAT_LOW_LEVEL_3_5 0xC 264 - #define PM2XXX_VBAT_LOW_LEVEL_3_6 0xD 265 - #define PM2XXX_VBAT_LOW_LEVEL_3_7 0xE 266 - #define PM2XXX_VBAT_LOW_LEVEL_3_8 0xF 267 - #define PM2XXX_VBAT_LOW_LEVEL_3_9 0x10 268 - #define PM2XXX_VBAT_LOW_LEVEL_4_0 0x11 269 - #define PM2XXX_VBAT_LOW_LEVEL_4_1 0x12 270 - #define PM2XXX_VBAT_LOW_LEVEL_4_2 0x13 271 - 272 - /* SW CTRL */ 273 - #define PM2XXX_SWCTRL_HW 0x0 274 - #define PM2XXX_SWCTRL_SW 0x1 275 - 276 - 277 - /* LED Driver Control */ 278 - #define PM2XXX_LED_CURRENT_MASK 0x0C 279 - #define PM2XXX_LED_CURRENT_2_5MA (0X0<<2) 280 - #define PM2XXX_LED_CURRENT_1MA (0X1<<2) 281 - #define PM2XXX_LED_CURRENT_5MA (0X2<<2) 282 - #define PM2XXX_LED_CURRENT_10MA (0X3<<2) 283 - 284 - #define PM2XXX_LED_SELECT_MASK 0x02 285 - #define PM2XXX_LED_SELECT_EN (0X0<<1) 286 - #define PM2XXX_LED_SELECT_DIS (0X1<<1) 287 - 288 - #define PM2XXX_ANTI_OVERSHOOT_MASK 0x01 289 - #define PM2XXX_ANTI_OVERSHOOT_DIS 0X0 290 - #define PM2XXX_ANTI_OVERSHOOT_EN 0X1 291 - 292 - enum pm2xxx_reg_int1 { 293 - PM2XXX_INT1_ITVBATDISCONNECT = 0x02, 294 - PM2XXX_INT1_ITVBATLOWR = 0x04, 295 - PM2XXX_INT1_ITVBATLOWF = 0x08, 296 - }; 297 - 298 - enum pm2xxx_mask_reg_int1 { 299 - PM2XXX_INT1_M_ITVBATDISCONNECT = 0x02, 300 - PM2XXX_INT1_M_ITVBATLOWR = 0x04, 301 - PM2XXX_INT1_M_ITVBATLOWF = 0x08, 302 - }; 303 - 304 - enum pm2xxx_source_reg_int1 { 305 - PM2XXX_INT1_S_ITVBATDISCONNECT = 0x02, 306 - PM2XXX_INT1_S_ITVBATLOWR = 0x04, 307 - PM2XXX_INT1_S_ITVBATLOWF = 0x08, 308 - }; 309 - 310 - enum pm2xxx_reg_int2 { 311 - PM2XXX_INT2_ITVPWR2PLUG = 0x01, 312 - PM2XXX_INT2_ITVPWR2UNPLUG = 0x02, 313 - PM2XXX_INT2_ITVPWR1PLUG = 0x04, 314 - PM2XXX_INT2_ITVPWR1UNPLUG = 0x08, 315 - }; 316 - 317 - enum pm2xxx_mask_reg_int2 { 318 - PM2XXX_INT2_M_ITVPWR2PLUG = 0x01, 319 - PM2XXX_INT2_M_ITVPWR2UNPLUG = 0x02, 320 - PM2XXX_INT2_M_ITVPWR1PLUG = 0x04, 321 - PM2XXX_INT2_M_ITVPWR1UNPLUG = 0x08, 322 - }; 323 - 324 - enum pm2xxx_source_reg_int2 { 325 - PM2XXX_INT2_S_ITVPWR2PLUG = 0x03, 326 - PM2XXX_INT2_S_ITVPWR1PLUG = 0x0c, 327 - }; 328 - 329 - enum pm2xxx_reg_int3 { 330 - PM2XXX_INT3_ITCHPRECHARGEWD = 0x01, 331 - PM2XXX_INT3_ITCHCCWD = 0x02, 332 - PM2XXX_INT3_ITCHCVWD = 0x04, 333 - PM2XXX_INT3_ITAUTOTIMEOUTWD = 0x08, 334 - }; 335 - 336 - enum pm2xxx_mask_reg_int3 { 337 - PM2XXX_INT3_M_ITCHPRECHARGEWD = 0x01, 338 - PM2XXX_INT3_M_ITCHCCWD = 0x02, 339 - PM2XXX_INT3_M_ITCHCVWD = 0x04, 340 - PM2XXX_INT3_M_ITAUTOTIMEOUTWD = 0x08, 341 - }; 342 - 343 - enum pm2xxx_source_reg_int3 { 344 - PM2XXX_INT3_S_ITCHPRECHARGEWD = 0x01, 345 - PM2XXX_INT3_S_ITCHCCWD = 0x02, 346 - PM2XXX_INT3_S_ITCHCVWD = 0x04, 347 - PM2XXX_INT3_S_ITAUTOTIMEOUTWD = 0x08, 348 - }; 349 - 350 - enum pm2xxx_reg_int4 { 351 - PM2XXX_INT4_ITBATTEMPCOLD = 0x01, 352 - PM2XXX_INT4_ITBATTEMPHOT = 0x02, 353 - PM2XXX_INT4_ITVPWR2OVV = 0x04, 354 - PM2XXX_INT4_ITVPWR1OVV = 0x08, 355 - PM2XXX_INT4_ITCHARGINGON = 0x10, 356 - PM2XXX_INT4_ITVRESUME = 0x20, 357 - PM2XXX_INT4_ITBATTFULL = 0x40, 358 - PM2XXX_INT4_ITCVPHASE = 0x80, 359 - }; 360 - 361 - enum pm2xxx_mask_reg_int4 { 362 - PM2XXX_INT4_M_ITBATTEMPCOLD = 0x01, 363 - PM2XXX_INT4_M_ITBATTEMPHOT = 0x02, 364 - PM2XXX_INT4_M_ITVPWR2OVV = 0x04, 365 - PM2XXX_INT4_M_ITVPWR1OVV = 0x08, 366 - PM2XXX_INT4_M_ITCHARGINGON = 0x10, 367 - PM2XXX_INT4_M_ITVRESUME = 0x20, 368 - PM2XXX_INT4_M_ITBATTFULL = 0x40, 369 - PM2XXX_INT4_M_ITCVPHASE = 0x80, 370 - }; 371 - 372 - enum pm2xxx_source_reg_int4 { 373 - PM2XXX_INT4_S_ITBATTEMPCOLD = 0x01, 374 - PM2XXX_INT4_S_ITBATTEMPHOT = 0x02, 375 - PM2XXX_INT4_S_ITVPWR2OVV = 0x04, 376 - PM2XXX_INT4_S_ITVPWR1OVV = 0x08, 377 - PM2XXX_INT4_S_ITCHARGINGON = 0x10, 378 - PM2XXX_INT4_S_ITVRESUME = 0x20, 379 - PM2XXX_INT4_S_ITBATTFULL = 0x40, 380 - PM2XXX_INT4_S_ITCVPHASE = 0x80, 381 - }; 382 - 383 - enum pm2xxx_reg_int5 { 384 - PM2XXX_INT5_ITTHERMALSHUTDOWNRISE = 0x01, 385 - PM2XXX_INT5_ITTHERMALSHUTDOWNFALL = 0x02, 386 - PM2XXX_INT5_ITTHERMALWARNINGRISE = 0x04, 387 - PM2XXX_INT5_ITTHERMALWARNINGFALL = 0x08, 388 - PM2XXX_INT5_ITVSYSTEMOVV = 0x10, 389 - }; 390 - 391 - enum pm2xxx_mask_reg_int5 { 392 - PM2XXX_INT5_M_ITTHERMALSHUTDOWNRISE = 0x01, 393 - PM2XXX_INT5_M_ITTHERMALSHUTDOWNFALL = 0x02, 394 - PM2XXX_INT5_M_ITTHERMALWARNINGRISE = 0x04, 395 - PM2XXX_INT5_M_ITTHERMALWARNINGFALL = 0x08, 396 - PM2XXX_INT5_M_ITVSYSTEMOVV = 0x10, 397 - }; 398 - 399 - enum pm2xxx_source_reg_int5 { 400 - PM2XXX_INT5_S_ITTHERMALSHUTDOWNRISE = 0x01, 401 - PM2XXX_INT5_S_ITTHERMALSHUTDOWNFALL = 0x02, 402 - PM2XXX_INT5_S_ITTHERMALWARNINGRISE = 0x04, 403 - PM2XXX_INT5_S_ITTHERMALWARNINGFALL = 0x08, 404 - PM2XXX_INT5_S_ITVSYSTEMOVV = 0x10, 405 - }; 406 - 407 - enum pm2xxx_reg_int6 { 408 - PM2XXX_INT6_ITVPWR2DROP = 0x01, 409 - PM2XXX_INT6_ITVPWR1DROP = 0x02, 410 - PM2XXX_INT6_ITVPWR2VALIDRISE = 0x04, 411 - PM2XXX_INT6_ITVPWR2VALIDFALL = 0x08, 412 - PM2XXX_INT6_ITVPWR1VALIDRISE = 0x10, 413 - PM2XXX_INT6_ITVPWR1VALIDFALL = 0x20, 414 - }; 415 - 416 - enum pm2xxx_mask_reg_int6 { 417 - PM2XXX_INT6_M_ITVPWR2DROP = 0x01, 418 - PM2XXX_INT6_M_ITVPWR1DROP = 0x02, 419 - PM2XXX_INT6_M_ITVPWR2VALIDRISE = 0x04, 420 - PM2XXX_INT6_M_ITVPWR2VALIDFALL = 0x08, 421 - PM2XXX_INT6_M_ITVPWR1VALIDRISE = 0x10, 422 - PM2XXX_INT6_M_ITVPWR1VALIDFALL = 0x20, 423 - }; 424 - 425 - enum pm2xxx_source_reg_int6 { 426 - PM2XXX_INT6_S_ITVPWR2DROP = 0x01, 427 - PM2XXX_INT6_S_ITVPWR1DROP = 0x02, 428 - PM2XXX_INT6_S_ITVPWR2VALIDRISE = 0x04, 429 - PM2XXX_INT6_S_ITVPWR2VALIDFALL = 0x08, 430 - PM2XXX_INT6_S_ITVPWR1VALIDRISE = 0x10, 431 - PM2XXX_INT6_S_ITVPWR1VALIDFALL = 0x20, 432 - }; 433 - 434 - struct pm2xxx_charger_info { 435 - int charger_connected; 436 - int charger_online; 437 - int cv_active; 438 - bool wd_expired; 439 - }; 440 - 441 - struct pm2xxx_charger_event_flags { 442 - bool mainextchnotok; 443 - bool main_thermal_prot; 444 - bool ovv; 445 - bool chgwdexp; 446 - }; 447 - 448 - struct pm2xxx_interrupts { 449 - u8 reg[PM2XXX_NUM_INT_REG]; 450 - int (*handler[PM2XXX_NUM_INT_REG])(void *, int); 451 - }; 452 - 453 - struct pm2xxx_config { 454 - struct i2c_client *pm2xxx_i2c; 455 - struct i2c_device_id *pm2xxx_id; 456 - }; 457 - 458 - struct pm2xxx_irq { 459 - char *name; 460 - irqreturn_t (*isr)(int irq, void *data); 461 - }; 462 - 463 - struct pm2xxx_charger { 464 - struct device *dev; 465 - u8 chip_id; 466 - bool vddadc_en_ac; 467 - struct pm2xxx_config config; 468 - bool ac_conn; 469 - unsigned int gpio_irq; 470 - int vbat; 471 - int old_vbat; 472 - int failure_case; 473 - int failure_input_ovv; 474 - unsigned int lpn_pin; 475 - struct pm2xxx_interrupts *pm2_int; 476 - struct regulator *regu; 477 - struct pm2xxx_bm_data *bat; 478 - struct mutex lock; 479 - struct ab8500 *parent; 480 - struct pm2xxx_charger_info ac; 481 - struct pm2xxx_charger_platform_data *pdata; 482 - struct workqueue_struct *charger_wq; 483 - struct delayed_work check_vbat_work; 484 - struct work_struct ac_work; 485 - struct work_struct check_main_thermal_prot_work; 486 - struct delayed_work check_hw_failure_work; 487 - struct ux500_charger ac_chg; 488 - struct power_supply_desc ac_chg_desc; 489 - struct pm2xxx_charger_event_flags flags; 490 - }; 491 - 492 - #endif /* PM2301_CHARGER_H */
+2 -2
drivers/power/supply/power_supply_core.c
··· 263 263 return 0; 264 264 265 265 /* All supplies found, allocate char ** array for filling */ 266 - psy->supplied_from = devm_kzalloc(&psy->dev, sizeof(psy->supplied_from), 266 + psy->supplied_from = devm_kzalloc(&psy->dev, sizeof(*psy->supplied_from), 267 267 GFP_KERNEL); 268 268 if (!psy->supplied_from) 269 269 return -ENOMEM; 270 270 271 271 *psy->supplied_from = devm_kcalloc(&psy->dev, 272 - cnt - 1, sizeof(char *), 272 + cnt - 1, sizeof(**psy->supplied_from), 273 273 GFP_KERNEL); 274 274 if (!*psy->supplied_from) 275 275 return -ENOMEM;
+10
include/dt-bindings/reset/sama7g5-reset.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + 3 + #ifndef __DT_BINDINGS_RESET_SAMA7G5_H 4 + #define __DT_BINDINGS_RESET_SAMA7G5_H 5 + 6 + #define SAMA7G5_RESET_USB_PHY1 4 7 + #define SAMA7G5_RESET_USB_PHY2 5 8 + #define SAMA7G5_RESET_USB_PHY3 6 9 + 10 + #endif /* __DT_BINDINGS_RESET_SAMA7G5_H */