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

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

Pull power supply and reset updates from Sebastian Reichel:
"Battery/charger related:
- cros-peripheral-charger: new driver
- mt6360-charger: new driver
- simple-battery: support reading chemistry info
- max17042-battery: add max77849 support
- sbs-battery: add time_to_empty_now support
- smb347-charger: prepare USB OTG support
- rn5t618: add voltage_now support
- axp288: cleanup & optimizations
- max17042_battery: cleanups
- ab8500: cleanups
- misc minor cleanups and DT binding fixes

reset related:
- tps65086-restart: new driver
- linkstation-poweroff: support NETGEAR ReadyNAS Duo v2"

* tag 'for-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (51 commits)
power: supply: core: Fix parsing of battery chemistry/technology
power: supply: max17042_battery: log SOC threshold using debug log level
power: supply: max17042_battery: more robust chip type checks
power: supply: max17042_battery: fix typo in MAx17042_TOFF
power: supply: max17042_battery: clean up MAX17055_V_empty
power: supply: smb347-charger: Implement USB VBUS regulator
power: supply: smb347-charger: Add missing pin control activation
power: supply: smb347-charger: Utilize generic regmap caching
power: supply: smb347-charger: Make smb347_set_writable() IRQ-safe
dt-bindings: power: supply: smb347-charger: Document USB VBUS regulator
power: reset: Add TPS65086 restart driver
dt-bindings: power: supply: max17042: describe interrupt
power: supply: max17042: remove duplicated STATUS bit defines
power: supply: max17042: handle fails of reading status register
power: supply: core: Parse battery chemistry/technology
dt-bindings: power: Extend battery bindings with chemistry
power: reset: linkstation-poweroff: add new device
power: reset: linkstation-poweroff: prepare for new devices
power: supply: bq24735: reorganize ChargeOption command macros
power: supply: rn5t618: Add voltage_now property
...

+2681 -973
+14
Documentation/devicetree/bindings/power/supply/battery.yaml
··· 31 31 compatible: 32 32 const: simple-battery 33 33 34 + device-chemistry: 35 + description: This describes the chemical technology of the battery. 36 + oneOf: 37 + - const: nickel-cadmium 38 + - const: nickel-metal-hydride 39 + - const: lithium-ion 40 + description: This is a blanket type for all lithium-ion batteries, 41 + including those below. If possible, a precise compatible string 42 + from below should be used, but sometimes it is unknown which specific 43 + lithium ion battery is employed and this wide compatible can be used. 44 + - const: lithium-ion-polymer 45 + - const: lithium-ion-iron-phosphate 46 + - const: lithium-ion-manganese-oxide 47 + 34 48 over-voltage-threshold-microvolt: 35 49 description: battery over-voltage limit 36 50
+3
Documentation/devicetree/bindings/power/supply/maxim,max17042.yaml
··· 19 19 - maxim,max17047 20 20 - maxim,max17050 21 21 - maxim,max17055 22 + - maxim,max77849-battery 22 23 23 24 reg: 24 25 maxItems: 1 25 26 26 27 interrupts: 27 28 maxItems: 1 29 + description: | 30 + The ALRT pin, an open-drain interrupt. 28 31 29 32 maxim,rsns-microohm: 30 33 $ref: /schemas/types.yaml#/definitions/uint32
+48
Documentation/devicetree/bindings/power/supply/mt6360_charger.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/power/supply/mt6360_charger.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Battery charger driver for MT6360 PMIC from MediaTek Integrated. 8 + 9 + maintainers: 10 + - Gene Chen <gene_chen@richtek.com> 11 + 12 + description: | 13 + This module is part of the MT6360 MFD device. 14 + Provides Battery Charger, Boost for OTG devices and BC1.2 detection. 15 + 16 + properties: 17 + compatible: 18 + const: mediatek,mt6360-chg 19 + 20 + richtek,vinovp-microvolt: 21 + description: Maximum CHGIN regulation voltage in uV. 22 + enum: [ 5500000, 6500000, 11000000, 14500000 ] 23 + 24 + 25 + usb-otg-vbus-regulator: 26 + type: object 27 + description: OTG boost regulator. 28 + $ref: /schemas/regulator/regulator.yaml# 29 + 30 + required: 31 + - compatible 32 + 33 + additionalProperties: false 34 + 35 + examples: 36 + - | 37 + mt6360_charger: charger { 38 + compatible = "mediatek,mt6360-chg"; 39 + richtek,vinovp-microvolt = <14500000>; 40 + 41 + otg_vbus_regulator: usb-otg-vbus-regulator { 42 + regulator-compatible = "usb-otg-vbus"; 43 + regulator-name = "usb-otg-vbus"; 44 + regulator-min-microvolt = <4425000>; 45 + regulator-max-microvolt = <5825000>; 46 + }; 47 + }; 48 + ...
+30
Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml
··· 73 73 - 1 # SMB3XX_SOFT_TEMP_COMPENSATE_CURRENT Current compensation 74 74 - 2 # SMB3XX_SOFT_TEMP_COMPENSATE_VOLTAGE Voltage compensation 75 75 76 + summit,inok-polarity: 77 + description: | 78 + Polarity of INOK signal indicating presence of external power supply. 79 + $ref: /schemas/types.yaml#/definitions/uint32 80 + enum: 81 + - 0 # SMB3XX_SYSOK_INOK_ACTIVE_LOW 82 + - 1 # SMB3XX_SYSOK_INOK_ACTIVE_HIGH 83 + 84 + usb-vbus: 85 + $ref: "../../regulator/regulator.yaml#" 86 + type: object 87 + 88 + properties: 89 + summit,needs-inok-toggle: 90 + type: boolean 91 + description: INOK signal is fixed and polarity needs to be toggled 92 + in order to enable/disable output mode. 93 + 94 + unevaluatedProperties: false 95 + 76 96 allOf: 77 97 - if: 78 98 properties: ··· 154 134 reg = <0x7f>; 155 135 156 136 summit,enable-charge-control = <SMB3XX_CHG_ENABLE_PIN_ACTIVE_HIGH>; 137 + summit,inok-polarity = <SMB3XX_SYSOK_INOK_ACTIVE_LOW>; 157 138 summit,chip-temperature-threshold-celsius = <110>; 158 139 summit,mains-current-limit-microamp = <2000000>; 159 140 summit,usb-current-limit-microamp = <500000>; ··· 162 141 summit,enable-mains-charging; 163 142 164 143 monitored-battery = <&battery>; 144 + 145 + usb-vbus { 146 + regulator-name = "usb_vbus"; 147 + regulator-min-microvolt = <5000000>; 148 + regulator-max-microvolt = <5000000>; 149 + regulator-min-microamp = <750000>; 150 + regulator-max-microamp = <750000>; 151 + summit,needs-inok-toggle; 152 + }; 165 153 }; 166 154 }; 167 155
+7 -4
Documentation/devicetree/bindings/power/supply/x-powers,axp20x-ac-power-supply.yaml
··· 21 21 22 22 properties: 23 23 compatible: 24 - enum: 25 - - x-powers,axp202-ac-power-supply 26 - - x-powers,axp221-ac-power-supply 27 - - x-powers,axp813-ac-power-supply 24 + oneOf: 25 + - const: x-powers,axp202-ac-power-supply 26 + - const: x-powers,axp221-ac-power-supply 27 + - items: 28 + - const: x-powers,axp803-ac-power-supply 29 + - const: x-powers,axp813-ac-power-supply 30 + - const: x-powers,axp813-ac-power-supply 28 31 29 32 required: 30 33 - compatible
+8 -4
Documentation/devicetree/bindings/power/supply/x-powers,axp20x-battery-power-supply.yaml
··· 19 19 20 20 properties: 21 21 compatible: 22 - enum: 23 - - x-powers,axp209-battery-power-supply 24 - - x-powers,axp221-battery-power-supply 25 - - x-powers,axp813-battery-power-supply 22 + oneOf: 23 + - const: x-powers,axp202-battery-power-supply 24 + - const: x-powers,axp209-battery-power-supply 25 + - const: x-powers,axp221-battery-power-supply 26 + - items: 27 + - const: x-powers,axp803-battery-power-supply 28 + - const: x-powers,axp813-battery-power-supply 29 + - const: x-powers,axp813-battery-power-supply 26 30 27 31 required: 28 32 - compatible
+9 -5
Documentation/devicetree/bindings/power/supply/x-powers,axp20x-usb-power-supply.yaml
··· 20 20 21 21 properties: 22 22 compatible: 23 - enum: 24 - - x-powers,axp202-usb-power-supply 25 - - x-powers,axp221-usb-power-supply 26 - - x-powers,axp223-usb-power-supply 27 - - x-powers,axp813-usb-power-supply 23 + oneOf: 24 + - enum: 25 + - x-powers,axp202-usb-power-supply 26 + - x-powers,axp221-usb-power-supply 27 + - x-powers,axp223-usb-power-supply 28 + - x-powers,axp813-usb-power-supply 29 + - items: 30 + - const: x-powers,axp803-usb-power-supply 31 + - const: x-powers,axp813-usb-power-supply 28 32 29 33 30 34 required:
+23
drivers/iio/adc/rn5t618-adc.c
··· 16 16 #include <linux/completion.h> 17 17 #include <linux/regmap.h> 18 18 #include <linux/iio/iio.h> 19 + #include <linux/iio/driver.h> 20 + #include <linux/iio/machine.h> 19 21 #include <linux/slab.h> 20 22 21 23 #define RN5T618_ADC_CONVERSION_TIMEOUT (msecs_to_jiffies(500)) ··· 191 189 RN5T618_ADC_CHANNEL(AIN0, IIO_VOLTAGE, "AIN0") 192 190 }; 193 191 192 + static struct iio_map rn5t618_maps[] = { 193 + IIO_MAP("VADP", "rn5t618-power", "vadp"), 194 + IIO_MAP("VUSB", "rn5t618-power", "vusb"), 195 + { /* sentinel */ } 196 + }; 197 + 198 + static void unregister_map(void *data) 199 + { 200 + struct iio_dev *iio_dev = (struct iio_dev *) data; 201 + 202 + iio_map_array_unregister(iio_dev); 203 + } 204 + 194 205 static int rn5t618_adc_probe(struct platform_device *pdev) 195 206 { 196 207 int ret; ··· 253 238 dev_err(adc->dev, "request irq %d failed: %d\n", adc->irq, ret); 254 239 return ret; 255 240 } 241 + 242 + ret = iio_map_array_register(iio_dev, rn5t618_maps); 243 + if (ret < 0) 244 + return ret; 245 + 246 + ret = devm_add_action_or_reset(adc->dev, unregister_map, iio_dev); 247 + if (ret < 0) 248 + return ret; 256 249 257 250 return devm_iio_device_register(adc->dev, iio_dev); 258 251 }
+6
drivers/power/reset/Kconfig
··· 204 204 help 205 205 Reset support for STMicroelectronics boards. 206 206 207 + config POWER_RESET_TPS65086 208 + bool "TPS65086 restart driver" 209 + depends on MFD_TPS65086 210 + help 211 + This driver adds support for resetting the TPS65086 PMIC on restart. 212 + 207 213 config POWER_RESET_VERSATILE 208 214 bool "ARM Versatile family reboot driver" 209 215 depends on ARM
+1
drivers/power/reset/Makefile
··· 23 23 obj-$(CONFIG_POWER_RESET_REGULATOR) += regulator-poweroff.o 24 24 obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o 25 25 obj-$(CONFIG_POWER_RESET_ST) += st-poweroff.o 26 + obj-$(CONFIG_POWER_RESET_TPS65086) += tps65086-restart.o 26 27 obj-$(CONFIG_POWER_RESET_VERSATILE) += arm-versatile-reboot.o 27 28 obj-$(CONFIG_POWER_RESET_VEXPRESS) += vexpress-poweroff.o 28 29 obj-$(CONFIG_POWER_RESET_XGENE) += xgene-reboot.o
+72 -7
drivers/power/reset/linkstation-poweroff.c
··· 19 19 #define MII_MARVELL_PHY_PAGE 22 20 20 21 21 #define MII_PHY_LED_CTRL 16 22 + #define MII_PHY_LED_POL_CTRL 17 22 23 #define MII_88E1318S_PHY_LED_TCR 18 23 24 #define MII_88E1318S_PHY_WOL_CTRL 16 24 25 #define MII_M1011_IEVENT 19 ··· 30 29 #define LED2_FORCE_ON (0x8 << 8) 31 30 #define LEDMASK GENMASK(11,8) 32 31 33 - static struct phy_device *phydev; 32 + #define MII_88E1318S_PHY_LED_POL_LED2 BIT(4) 34 33 35 - static void mvphy_reg_intn(u16 data) 34 + struct power_off_cfg { 35 + char *mdio_node_name; 36 + void (*phy_set_reg)(bool restart); 37 + }; 38 + 39 + static struct phy_device *phydev; 40 + static const struct power_off_cfg *cfg; 41 + 42 + static void linkstation_mvphy_reg_intn(bool restart) 36 43 { 37 44 int rc = 0, saved_page; 45 + u16 data = 0; 46 + 47 + if (restart) 48 + data = MII_88E1318S_PHY_LED_TCR_FORCE_INT; 38 49 39 50 saved_page = phy_select_page(phydev, MII_MARVELL_LED_PAGE); 40 51 if (saved_page < 0) ··· 79 66 dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc); 80 67 } 81 68 69 + static void readynas_mvphy_set_reg(bool restart) 70 + { 71 + int rc = 0, saved_page; 72 + u16 data = 0; 73 + 74 + if (restart) 75 + data = MII_88E1318S_PHY_LED_POL_LED2; 76 + 77 + saved_page = phy_select_page(phydev, MII_MARVELL_LED_PAGE); 78 + if (saved_page < 0) 79 + goto err; 80 + 81 + /* Set the LED[2].0 Polarity bit to the required state */ 82 + __phy_modify(phydev, MII_PHY_LED_POL_CTRL, 83 + MII_88E1318S_PHY_LED_POL_LED2, data); 84 + 85 + if (!data) { 86 + /* If WOL was enabled and a magic packet was received before powering 87 + * off, we won't be able to wake up by sending another magic packet. 88 + * Clear WOL status. 89 + */ 90 + __phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_MARVELL_WOL_PAGE); 91 + __phy_set_bits(phydev, MII_88E1318S_PHY_WOL_CTRL, 92 + MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS); 93 + } 94 + err: 95 + rc = phy_restore_page(phydev, saved_page, rc); 96 + if (rc < 0) 97 + dev_err(&phydev->mdio.dev, "Write register failed, %d\n", rc); 98 + } 99 + 100 + static const struct power_off_cfg linkstation_power_off_cfg = { 101 + .mdio_node_name = "mdio", 102 + .phy_set_reg = linkstation_mvphy_reg_intn, 103 + }; 104 + 105 + static const struct power_off_cfg readynas_power_off_cfg = { 106 + .mdio_node_name = "mdio-bus", 107 + .phy_set_reg = readynas_mvphy_set_reg, 108 + }; 109 + 82 110 static int linkstation_reboot_notifier(struct notifier_block *nb, 83 111 unsigned long action, void *unused) 84 112 { 85 113 if (action == SYS_RESTART) 86 - mvphy_reg_intn(MII_88E1318S_PHY_LED_TCR_FORCE_INT); 114 + cfg->phy_set_reg(true); 87 115 88 116 return NOTIFY_DONE; 89 117 } ··· 136 82 static void linkstation_poweroff(void) 137 83 { 138 84 unregister_reboot_notifier(&linkstation_reboot_nb); 139 - mvphy_reg_intn(0); 85 + cfg->phy_set_reg(false); 140 86 141 87 kernel_restart("Power off"); 142 88 } 143 89 144 90 static const struct of_device_id ls_poweroff_of_match[] = { 145 - { .compatible = "buffalo,ls421d" }, 146 - { .compatible = "buffalo,ls421de" }, 91 + { .compatible = "buffalo,ls421d", 92 + .data = &linkstation_power_off_cfg, 93 + }, 94 + { .compatible = "buffalo,ls421de", 95 + .data = &linkstation_power_off_cfg, 96 + }, 97 + { .compatible = "netgear,readynas-duo-v2", 98 + .data = &readynas_power_off_cfg, 99 + }, 147 100 { }, 148 101 }; 149 102 ··· 158 97 { 159 98 struct mii_bus *bus; 160 99 struct device_node *dn; 100 + const struct of_device_id *match; 161 101 162 102 dn = of_find_matching_node(NULL, ls_poweroff_of_match); 163 103 if (!dn) 164 104 return -ENODEV; 165 105 of_node_put(dn); 166 106 167 - dn = of_find_node_by_name(NULL, "mdio"); 107 + match = of_match_node(ls_poweroff_of_match, dn); 108 + cfg = match->data; 109 + 110 + dn = of_find_node_by_name(NULL, cfg->mdio_node_name); 168 111 if (!dn) 169 112 return -ENODEV; 170 113
+98
drivers/power/reset/tps65086-restart.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (C) 2021 Emil Renner Berthing 4 + */ 5 + 6 + #include <linux/mfd/tps65086.h> 7 + #include <linux/mod_devicetable.h> 8 + #include <linux/module.h> 9 + #include <linux/platform_device.h> 10 + #include <linux/reboot.h> 11 + 12 + struct tps65086_restart { 13 + struct notifier_block handler; 14 + struct device *dev; 15 + }; 16 + 17 + static int tps65086_restart_notify(struct notifier_block *this, 18 + unsigned long mode, void *cmd) 19 + { 20 + struct tps65086_restart *tps65086_restart = 21 + container_of(this, struct tps65086_restart, handler); 22 + struct tps65086 *tps65086 = dev_get_drvdata(tps65086_restart->dev->parent); 23 + int ret; 24 + 25 + ret = regmap_write(tps65086->regmap, TPS65086_FORCESHUTDN, 1); 26 + if (ret) { 27 + dev_err(tps65086_restart->dev, "%s: error writing to tps65086 pmic: %d\n", 28 + __func__, ret); 29 + return NOTIFY_DONE; 30 + } 31 + 32 + /* give it a little time */ 33 + mdelay(200); 34 + 35 + WARN_ON(1); 36 + 37 + return NOTIFY_DONE; 38 + } 39 + 40 + static int tps65086_restart_probe(struct platform_device *pdev) 41 + { 42 + struct tps65086_restart *tps65086_restart; 43 + int ret; 44 + 45 + tps65086_restart = devm_kzalloc(&pdev->dev, sizeof(*tps65086_restart), GFP_KERNEL); 46 + if (!tps65086_restart) 47 + return -ENOMEM; 48 + 49 + platform_set_drvdata(pdev, tps65086_restart); 50 + 51 + tps65086_restart->handler.notifier_call = tps65086_restart_notify; 52 + tps65086_restart->handler.priority = 192; 53 + tps65086_restart->dev = &pdev->dev; 54 + 55 + ret = register_restart_handler(&tps65086_restart->handler); 56 + if (ret) { 57 + dev_err(&pdev->dev, "%s: cannot register restart handler: %d\n", 58 + __func__, ret); 59 + return -ENODEV; 60 + } 61 + 62 + return 0; 63 + } 64 + 65 + static int tps65086_restart_remove(struct platform_device *pdev) 66 + { 67 + struct tps65086_restart *tps65086_restart = platform_get_drvdata(pdev); 68 + int ret; 69 + 70 + ret = unregister_restart_handler(&tps65086_restart->handler); 71 + if (ret) { 72 + dev_err(&pdev->dev, "%s: cannot unregister restart handler: %d\n", 73 + __func__, ret); 74 + return -ENODEV; 75 + } 76 + 77 + return 0; 78 + } 79 + 80 + static const struct platform_device_id tps65086_restart_id_table[] = { 81 + { "tps65086-reset", }, 82 + { /* sentinel */ } 83 + }; 84 + MODULE_DEVICE_TABLE(platform, tps65086_restart_id_table); 85 + 86 + static struct platform_driver tps65086_restart_driver = { 87 + .driver = { 88 + .name = "tps65086-restart", 89 + }, 90 + .probe = tps65086_restart_probe, 91 + .remove = tps65086_restart_remove, 92 + .id_table = tps65086_restart_id_table, 93 + }; 94 + module_platform_driver(tps65086_restart_driver); 95 + 96 + MODULE_AUTHOR("Emil Renner Berthing <kernel@esmil.dk>"); 97 + MODULE_DESCRIPTION("TPS65086 restart driver"); 98 + MODULE_LICENSE("GPL v2");
+25 -1
drivers/power/supply/Kconfig
··· 358 358 359 359 config AXP288_FUEL_GAUGE 360 360 tristate "X-Powers AXP288 Fuel Gauge" 361 - depends on MFD_AXP20X && IIO 361 + depends on MFD_AXP20X && IIO && IOSF_MBI 362 362 help 363 363 Say yes here to have support for X-Power power management IC (PMIC) 364 364 Fuel Gauge. The device provides battery statistics and status ··· 577 577 Battery charger. This driver provides Battery charger power management 578 578 functions on the systems. 579 579 580 + config CHARGER_MT6360 581 + tristate "Mediatek MT6360 Charger Driver" 582 + depends on MFD_MT6360 583 + depends on REGULATOR 584 + select LINEAR_RANGES 585 + help 586 + Say Y here to enable MT6360 Charger Part. 587 + The device supports High-Accuracy Voltage/Current Regulation, 588 + Average Input Current Regulation, Battery Temperature Sensing, 589 + Over-Temperature Protection, DPDM Detection for BC1.2. 590 + 580 591 config CHARGER_QCOM_SMBB 581 592 tristate "Qualcomm Switch-Mode Battery Charger and Boost" 582 593 depends on MFD_SPMI_PMIC || COMPILE_TEST ··· 680 669 config CHARGER_SMB347 681 670 tristate "Summit Microelectronics SMB3XX Battery Charger" 682 671 depends on I2C 672 + depends on REGULATOR 683 673 select REGMAP_I2C 684 674 help 685 675 Say Y to include support for Summit Microelectronics SMB345, ··· 748 736 what is connected to USB PD ports from the EC and converts 749 737 that into power_supply properties. 750 738 739 + config CHARGER_CROS_PCHG 740 + tristate "ChromeOS EC based peripheral charger" 741 + depends on MFD_CROS_EC_DEV 742 + default MFD_CROS_EC_DEV 743 + help 744 + Say Y here to enable ChromeOS EC based peripheral charge driver. 745 + This driver gets various information about the devices connected to 746 + the peripheral charge ports from the EC and converts that into 747 + power_supply properties. 748 + 751 749 config CHARGER_SC2731 752 750 tristate "Spreadtrum SC2731 charger driver" 753 751 depends on MFD_SC27XX_PMIC || COMPILE_TEST ··· 804 782 config RN5T618_POWER 805 783 tristate "RN5T618 charger/fuel gauge support" 806 784 depends on MFD_RN5T618 785 + depends on RN5T618_ADC 786 + depends on IIO 807 787 help 808 788 Say Y here to have support for RN5T618 PMIC family fuel gauge and charger. 809 789 This driver can also be built as a module. If so, the module will be
+3 -1
drivers/power/supply/Makefile
··· 60 60 obj-$(CONFIG_CHARGER_88PM860X) += 88pm860x_charger.o 61 61 obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o 62 62 obj-$(CONFIG_BATTERY_RX51) += rx51_battery.o 63 - obj-$(CONFIG_AB8500_BM) += ab8500_bmdata.o ab8500_charger.o ab8500_fg.o ab8500_btemp.o abx500_chargalg.o 63 + obj-$(CONFIG_AB8500_BM) += ab8500_bmdata.o ab8500_charger.o ab8500_fg.o ab8500_btemp.o ab8500_chargalg.o 64 64 obj-$(CONFIG_CHARGER_CPCAP) += cpcap-charger.o 65 65 obj-$(CONFIG_CHARGER_ISP1704) += isp1704_charger.o 66 66 obj-$(CONFIG_CHARGER_MAX8903) += max8903_charger.o ··· 78 78 obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o 79 79 obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o 80 80 obj-$(CONFIG_CHARGER_MP2629) += mp2629_charger.o 81 + obj-$(CONFIG_CHARGER_MT6360) += mt6360_charger.o 81 82 obj-$(CONFIG_CHARGER_QCOM_SMBB) += qcom_smbb.o 82 83 obj-$(CONFIG_CHARGER_BQ2415X) += bq2415x_charger.o 83 84 obj-$(CONFIG_CHARGER_BQ24190) += bq24190_charger.o ··· 94 93 obj-$(CONFIG_AXP288_FUEL_GAUGE) += axp288_fuel_gauge.o 95 94 obj-$(CONFIG_AXP288_CHARGER) += axp288_charger.o 96 95 obj-$(CONFIG_CHARGER_CROS_USBPD) += cros_usbpd-charger.o 96 + obj-$(CONFIG_CHARGER_CROS_PCHG) += cros_peripheral_charger.o 97 97 obj-$(CONFIG_CHARGER_SC2731) += sc2731_charger.o 98 98 obj-$(CONFIG_FUEL_GAUGE_SC27XX) += sc27xx_fuel_gauge.o 99 99 obj-$(CONFIG_CHARGER_UCS1002) += ucs1002_power.o
+67 -220
drivers/power/supply/ab8500-bm.h
··· 269 269 270 270 /* 271 271 * ADC for the battery thermistor. 272 - * When using the ABx500_ADC_THERM_BATCTRL the battery ID resistor is combined 272 + * When using the AB8500_ADC_THERM_BATCTRL the battery ID resistor is combined 273 273 * with a NTC resistor to both identify the battery and to measure its 274 274 * temperature. Different phone manufactures uses different techniques to both 275 275 * identify the battery and to read its temperature. 276 276 */ 277 - enum abx500_adc_therm { 278 - ABx500_ADC_THERM_BATCTRL, 279 - ABx500_ADC_THERM_BATTEMP, 277 + enum ab8500_adc_therm { 278 + AB8500_ADC_THERM_BATCTRL, 279 + AB8500_ADC_THERM_BATTEMP, 280 280 }; 281 281 282 282 /** 283 - * struct abx500_res_to_temp - defines one point in a temp to res curve. To 283 + * struct ab8500_res_to_temp - defines one point in a temp to res curve. To 284 284 * be used in battery packs that combines the identification resistor with a 285 285 * NTC resistor. 286 286 * @temp: battery pack temperature in Celsius 287 287 * @resist: NTC resistor net total resistance 288 288 */ 289 - struct abx500_res_to_temp { 289 + struct ab8500_res_to_temp { 290 290 int temp; 291 291 int resist; 292 292 }; 293 293 294 294 /** 295 - * struct abx500_v_to_cap - Table for translating voltage to capacity 295 + * struct ab8500_v_to_cap - Table for translating voltage to capacity 296 296 * @voltage: Voltage in mV 297 297 * @capacity: Capacity in percent 298 298 */ 299 - struct abx500_v_to_cap { 299 + struct ab8500_v_to_cap { 300 300 int voltage; 301 301 int capacity; 302 302 }; 303 303 304 304 /* Forward declaration */ 305 - struct abx500_fg; 305 + struct ab8500_fg; 306 306 307 307 /** 308 - * struct abx500_fg_parameters - Fuel gauge algorithm parameters, in seconds 308 + * struct ab8500_fg_parameters - Fuel gauge algorithm parameters, in seconds 309 309 * if not specified 310 310 * @recovery_sleep_timer: Time between measurements while recovering 311 311 * @recovery_total_time: Total recovery time ··· 333 333 * @pcut_max_restart: Max number of restarts 334 334 * @pcut_debounce_time: Sets battery debounce time 335 335 */ 336 - struct abx500_fg_parameters { 336 + struct ab8500_fg_parameters { 337 337 int recovery_sleep_timer; 338 338 int recovery_total_time; 339 339 int init_timer; ··· 357 357 }; 358 358 359 359 /** 360 - * struct abx500_charger_maximization - struct used by the board config. 360 + * struct ab8500_charger_maximization - struct used by the board config. 361 361 * @use_maxi: Enable maximization for this battery type 362 362 * @maxi_chg_curr: Maximum charger current allowed 363 363 * @maxi_wait_cycles: cycles to wait before setting charger current 364 364 * @charger_curr_step delta between two charger current settings (mA) 365 365 */ 366 - struct abx500_maxim_parameters { 366 + struct ab8500_maxim_parameters { 367 367 bool ena_maxi; 368 368 int chg_curr; 369 369 int wait_cycles; ··· 371 371 }; 372 372 373 373 /** 374 - * struct abx500_battery_type - different batteries supported 374 + * struct ab8500_battery_type - different batteries supported 375 375 * @name: battery technology 376 376 * @resis_high: battery upper resistance limit 377 377 * @resis_low: battery lower resistance limit ··· 400 400 * @n_batres_tbl_elements number of elements in the batres_tbl 401 401 * @batres_tbl battery internal resistance vs temperature table 402 402 */ 403 - struct abx500_battery_type { 403 + struct ab8500_battery_type { 404 404 int name; 405 405 int resis_high; 406 406 int resis_low; ··· 421 421 int low_high_vol_lvl; 422 422 int battery_resistance; 423 423 int n_temp_tbl_elements; 424 - const struct abx500_res_to_temp *r_to_t_tbl; 424 + const struct ab8500_res_to_temp *r_to_t_tbl; 425 425 int n_v_cap_tbl_elements; 426 - const struct abx500_v_to_cap *v_to_cap_tbl; 426 + const struct ab8500_v_to_cap *v_to_cap_tbl; 427 427 int n_batres_tbl_elements; 428 428 const struct batres_vs_temp *batres_tbl; 429 - }; 430 - 431 - /** 432 - * struct abx500_bm_capacity_levels - abx500 capacity level data 433 - * @critical: critical capacity level in percent 434 - * @low: low capacity level in percent 435 - * @normal: normal capacity level in percent 436 - * @high: high capacity level in percent 437 - * @full: full capacity level in percent 438 - */ 439 - struct abx500_bm_capacity_levels { 440 - int critical; 441 - int low; 442 - int normal; 443 - int high; 444 - int full; 445 - }; 446 - 447 - /** 448 - * struct abx500_bm_charger_parameters - Charger specific parameters 449 - * @usb_volt_max: maximum allowed USB charger voltage in mV 450 - * @usb_curr_max: maximum allowed USB charger current in mA 451 - * @ac_volt_max: maximum allowed AC charger voltage in mV 452 - * @ac_curr_max: maximum allowed AC charger current in mA 453 - */ 454 - struct abx500_bm_charger_parameters { 455 - int usb_volt_max; 456 - int usb_curr_max; 457 - int ac_volt_max; 458 - int ac_curr_max; 459 - }; 460 - 461 - /** 462 - * struct abx500_bm_data - abx500 battery management data 463 - * @temp_under under this temp, charging is stopped 464 - * @temp_low between this temp and temp_under charging is reduced 465 - * @temp_high between this temp and temp_over charging is reduced 466 - * @temp_over over this temp, charging is stopped 467 - * @temp_now present battery temperature 468 - * @temp_interval_chg temperature measurement interval in s when charging 469 - * @temp_interval_nochg temperature measurement interval in s when not charging 470 - * @main_safety_tmr_h safety timer for main charger 471 - * @usb_safety_tmr_h safety timer for usb charger 472 - * @bkup_bat_v voltage which we charge the backup battery with 473 - * @bkup_bat_i current which we charge the backup battery with 474 - * @no_maintenance indicates that maintenance charging is disabled 475 - * @capacity_scaling indicates whether capacity scaling is to be used 476 - * @abx500_adc_therm placement of thermistor, batctrl or battemp adc 477 - * @chg_unknown_bat flag to enable charging of unknown batteries 478 - * @enable_overshoot flag to enable VBAT overshoot control 479 - * @auto_trig flag to enable auto adc trigger 480 - * @fg_res resistance of FG resistor in 0.1mOhm 481 - * @n_btypes number of elements in array bat_type 482 - * @batt_id index of the identified battery in array bat_type 483 - * @interval_charging charge alg cycle period time when charging (sec) 484 - * @interval_not_charging charge alg cycle period time when not charging (sec) 485 - * @temp_hysteresis temperature hysteresis 486 - * @gnd_lift_resistance Battery ground to phone ground resistance (mOhm) 487 - * @n_chg_out_curr number of elements in array chg_output_curr 488 - * @n_chg_in_curr number of elements in array chg_input_curr 489 - * @chg_output_curr charger output current level map 490 - * @chg_input_curr charger input current level map 491 - * @maxi maximization parameters 492 - * @cap_levels capacity in percent for the different capacity levels 493 - * @bat_type table of supported battery types 494 - * @chg_params charger parameters 495 - * @fg_params fuel gauge parameters 496 - */ 497 - struct abx500_bm_data { 498 - int temp_under; 499 - int temp_low; 500 - int temp_high; 501 - int temp_over; 502 - int temp_now; 503 - int temp_interval_chg; 504 - int temp_interval_nochg; 505 - int main_safety_tmr_h; 506 - int usb_safety_tmr_h; 507 - int bkup_bat_v; 508 - int bkup_bat_i; 509 - bool no_maintenance; 510 - bool capacity_scaling; 511 - bool chg_unknown_bat; 512 - bool enable_overshoot; 513 - bool auto_trig; 514 - enum abx500_adc_therm adc_therm; 515 - int fg_res; 516 - int n_btypes; 517 - int batt_id; 518 - int interval_charging; 519 - int interval_not_charging; 520 - int temp_hysteresis; 521 - int gnd_lift_resistance; 522 - int n_chg_out_curr; 523 - int n_chg_in_curr; 524 - int *chg_output_curr; 525 - int *chg_input_curr; 526 - const struct abx500_maxim_parameters *maxi; 527 - const struct abx500_bm_capacity_levels *cap_levels; 528 - struct abx500_battery_type *bat_type; 529 - const struct abx500_bm_charger_parameters *chg_params; 530 - const struct abx500_fg_parameters *fg_params; 531 - }; 532 - 533 - enum { 534 - NTC_EXTERNAL = 0, 535 - NTC_INTERNAL, 536 - }; 537 - 538 - /** 539 - * struct res_to_temp - defines one point in a temp to res curve. To 540 - * be used in battery packs that combines the identification resistor with a 541 - * NTC resistor. 542 - * @temp: battery pack temperature in Celsius 543 - * @resist: NTC resistor net total resistance 544 - */ 545 - struct res_to_temp { 546 - int temp; 547 - int resist; 548 - }; 549 - 550 - /** 551 - * struct batres_vs_temp - defines one point in a temp vs battery internal 552 - * resistance curve. 553 - * @temp: battery pack temperature in Celsius 554 - * @resist: battery internal reistance in mOhm 555 - */ 556 - struct batres_vs_temp { 557 - int temp; 558 - int resist; 559 - }; 560 - 561 - /* Forward declaration */ 562 - struct ab8500_fg; 563 - 564 - /** 565 - * struct ab8500_fg_parameters - Fuel gauge algorithm parameters, in seconds 566 - * if not specified 567 - * @recovery_sleep_timer: Time between measurements while recovering 568 - * @recovery_total_time: Total recovery time 569 - * @init_timer: Measurement interval during startup 570 - * @init_discard_time: Time we discard voltage measurement at startup 571 - * @init_total_time: Total init time during startup 572 - * @high_curr_time: Time current has to be high to go to recovery 573 - * @accu_charging: FG accumulation time while charging 574 - * @accu_high_curr: FG accumulation time in high current mode 575 - * @high_curr_threshold: High current threshold, in mA 576 - * @lowbat_threshold: Low battery threshold, in mV 577 - * @battok_falling_th_sel0 Threshold in mV for battOk signal sel0 578 - * Resolution in 50 mV step. 579 - * @battok_raising_th_sel1 Threshold in mV for battOk signal sel1 580 - * Resolution in 50 mV step. 581 - * @user_cap_limit Capacity reported from user must be within this 582 - * limit to be considered as sane, in percentage 583 - * points. 584 - * @maint_thres This is the threshold where we stop reporting 585 - * battery full while in maintenance, in per cent 586 - * @pcut_enable: Enable power cut feature in ab8505 587 - * @pcut_max_time: Max time threshold 588 - * @pcut_flag_time: Flagtime threshold 589 - * @pcut_max_restart: Max number of restarts 590 - * @pcut_debunce_time: Sets battery debounce time 591 - */ 592 - struct ab8500_fg_parameters { 593 - int recovery_sleep_timer; 594 - int recovery_total_time; 595 - int init_timer; 596 - int init_discard_time; 597 - int init_total_time; 598 - int high_curr_time; 599 - int accu_charging; 600 - int accu_high_curr; 601 - int high_curr_threshold; 602 - int lowbat_threshold; 603 - int battok_falling_th_sel0; 604 - int battok_raising_th_sel1; 605 - int user_cap_limit; 606 - int maint_thres; 607 - bool pcut_enable; 608 - u8 pcut_max_time; 609 - u8 pcut_flag_time; 610 - u8 pcut_max_restart; 611 - u8 pcut_debunce_time; 612 - }; 613 - 614 - /** 615 - * struct ab8500_charger_maximization - struct used by the board config. 616 - * @use_maxi: Enable maximization for this battery type 617 - * @maxi_chg_curr: Maximum charger current allowed 618 - * @maxi_wait_cycles: cycles to wait before setting charger current 619 - * @charger_curr_step delta between two charger current settings (mA) 620 - */ 621 - struct ab8500_maxim_parameters { 622 - bool ena_maxi; 623 - int chg_curr; 624 - int wait_cycles; 625 - int charger_curr_step; 626 429 }; 627 430 628 431 /** ··· 464 661 * @temp_low between this temp and temp_under charging is reduced 465 662 * @temp_high between this temp and temp_over charging is reduced 466 663 * @temp_over over this temp, charging is stopped 664 + * @temp_now present battery temperature 467 665 * @temp_interval_chg temperature measurement interval in s when charging 468 666 * @temp_interval_nochg temperature measurement interval in s when not charging 469 667 * @main_safety_tmr_h safety timer for main charger ··· 473 669 * @bkup_bat_i current which we charge the backup battery with 474 670 * @no_maintenance indicates that maintenance charging is disabled 475 671 * @capacity_scaling indicates whether capacity scaling is to be used 476 - * @adc_therm placement of thermistor, batctrl or battemp adc 672 + * @ab8500_adc_therm placement of thermistor, batctrl or battemp adc 477 673 * @chg_unknown_bat flag to enable charging of unknown batteries 478 674 * @enable_overshoot flag to enable VBAT overshoot control 675 + * @auto_trig flag to enable auto adc trigger 479 676 * @fg_res resistance of FG resistor in 0.1mOhm 480 677 * @n_btypes number of elements in array bat_type 481 678 * @batt_id index of the identified battery in array bat_type ··· 484 679 * @interval_not_charging charge alg cycle period time when not charging (sec) 485 680 * @temp_hysteresis temperature hysteresis 486 681 * @gnd_lift_resistance Battery ground to phone ground resistance (mOhm) 487 - * @maxi: maximization parameters 682 + * @n_chg_out_curr number of elements in array chg_output_curr 683 + * @n_chg_in_curr number of elements in array chg_input_curr 684 + * @chg_output_curr charger output current level map 685 + * @chg_input_curr charger input current level map 686 + * @maxi maximization parameters 488 687 * @cap_levels capacity in percent for the different capacity levels 489 688 * @bat_type table of supported battery types 490 689 * @chg_params charger parameters ··· 499 690 int temp_low; 500 691 int temp_high; 501 692 int temp_over; 693 + int temp_now; 502 694 int temp_interval_chg; 503 695 int temp_interval_nochg; 504 696 int main_safety_tmr_h; ··· 510 700 bool capacity_scaling; 511 701 bool chg_unknown_bat; 512 702 bool enable_overshoot; 513 - enum abx500_adc_therm adc_therm; 703 + bool auto_trig; 704 + enum ab8500_adc_therm adc_therm; 514 705 int fg_res; 515 706 int n_btypes; 516 707 int batt_id; ··· 519 708 int interval_not_charging; 520 709 int temp_hysteresis; 521 710 int gnd_lift_resistance; 711 + int n_chg_out_curr; 712 + int n_chg_in_curr; 713 + int *chg_output_curr; 714 + int *chg_input_curr; 522 715 const struct ab8500_maxim_parameters *maxi; 523 716 const struct ab8500_bm_capacity_levels *cap_levels; 717 + struct ab8500_battery_type *bat_type; 524 718 const struct ab8500_bm_charger_parameters *chg_params; 525 719 const struct ab8500_fg_parameters *fg_params; 526 720 }; 527 721 528 - extern struct abx500_bm_data ab8500_bm_data; 722 + enum { 723 + NTC_EXTERNAL = 0, 724 + NTC_INTERNAL, 725 + }; 726 + 727 + /** 728 + * struct res_to_temp - defines one point in a temp to res curve. To 729 + * be used in battery packs that combines the identification resistor with a 730 + * NTC resistor. 731 + * @temp: battery pack temperature in Celsius 732 + * @resist: NTC resistor net total resistance 733 + */ 734 + struct res_to_temp { 735 + int temp; 736 + int resist; 737 + }; 738 + 739 + /** 740 + * struct batres_vs_temp - defines one point in a temp vs battery internal 741 + * resistance curve. 742 + * @temp: battery pack temperature in Celsius 743 + * @resist: battery internal reistance in mOhm 744 + */ 745 + struct batres_vs_temp { 746 + int temp; 747 + int resist; 748 + }; 749 + 750 + /* Forward declaration */ 751 + struct ab8500_fg; 752 + 753 + extern struct ab8500_bm_data ab8500_bm_data; 529 754 530 755 void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA); 531 756 struct ab8500_fg *ab8500_fg_get(void); ··· 572 725 int ab8500_fg_inst_curr_done(struct ab8500_fg *di); 573 726 int ab8500_bm_of_probe(struct device *dev, 574 727 struct device_node *np, 575 - struct abx500_bm_data *bm); 728 + struct ab8500_bm_data *bm); 576 729 577 730 extern struct platform_driver ab8500_fg_driver; 578 731 extern struct platform_driver ab8500_btemp_driver; 579 - extern struct platform_driver abx500_chargalg_driver; 732 + extern struct platform_driver ab8500_chargalg_driver; 580 733 581 734 #endif /* _AB8500_CHARGER_H_ */
+16 -18
drivers/power/supply/ab8500_bmdata.c
··· 2 2 #include <linux/export.h> 3 3 #include <linux/power_supply.h> 4 4 #include <linux/of.h> 5 - #include <linux/mfd/abx500.h> 6 - #include <linux/mfd/abx500/ab8500.h> 7 5 8 6 #include "ab8500-bm.h" 9 7 ··· 11 13 * Note that the res_to_temp table must be strictly sorted by falling resistance 12 14 * values to work. 13 15 */ 14 - const struct abx500_res_to_temp ab8500_temp_tbl_a_thermistor[] = { 16 + const struct ab8500_res_to_temp ab8500_temp_tbl_a_thermistor[] = { 15 17 {-5, 53407}, 16 18 { 0, 48594}, 17 19 { 5, 43804}, ··· 33 35 const int ab8500_temp_tbl_a_size = ARRAY_SIZE(ab8500_temp_tbl_a_thermistor); 34 36 EXPORT_SYMBOL(ab8500_temp_tbl_a_size); 35 37 36 - const struct abx500_res_to_temp ab8500_temp_tbl_b_thermistor[] = { 38 + const struct ab8500_res_to_temp ab8500_temp_tbl_b_thermistor[] = { 37 39 {-5, 200000}, 38 40 { 0, 159024}, 39 41 { 5, 151921}, ··· 55 57 const int ab8500_temp_tbl_b_size = ARRAY_SIZE(ab8500_temp_tbl_b_thermistor); 56 58 EXPORT_SYMBOL(ab8500_temp_tbl_b_size); 57 59 58 - static const struct abx500_v_to_cap cap_tbl_a_thermistor[] = { 60 + static const struct ab8500_v_to_cap cap_tbl_a_thermistor[] = { 59 61 {4171, 100}, 60 62 {4114, 95}, 61 63 {4009, 83}, ··· 78 80 {3247, 0}, 79 81 }; 80 82 81 - static const struct abx500_v_to_cap cap_tbl_b_thermistor[] = { 83 + static const struct ab8500_v_to_cap cap_tbl_b_thermistor[] = { 82 84 {4161, 100}, 83 85 {4124, 98}, 84 86 {4044, 90}, ··· 101 103 {3250, 0}, 102 104 }; 103 105 104 - static const struct abx500_v_to_cap cap_tbl[] = { 106 + static const struct ab8500_v_to_cap cap_tbl[] = { 105 107 {4186, 100}, 106 108 {4163, 99}, 107 109 {4114, 95}, ··· 132 134 * Note that the res_to_temp table must be strictly sorted by falling 133 135 * resistance values to work. 134 136 */ 135 - static const struct abx500_res_to_temp temp_tbl[] = { 137 + static const struct ab8500_res_to_temp temp_tbl[] = { 136 138 {-5, 214834}, 137 139 { 0, 162943}, 138 140 { 5, 124820}, ··· 189 191 {-20, 180}, 190 192 }; 191 193 192 - static struct abx500_battery_type bat_type_thermistor[] = { 194 + static struct ab8500_battery_type bat_type_thermistor[] = { 193 195 [BATTERY_UNKNOWN] = { 194 196 /* First element always represent the UNKNOWN battery */ 195 197 .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN, ··· 275 277 }, 276 278 }; 277 279 278 - static struct abx500_battery_type bat_type_ext_thermistor[] = { 280 + static struct ab8500_battery_type bat_type_ext_thermistor[] = { 279 281 [BATTERY_UNKNOWN] = { 280 282 /* First element always represent the UNKNOWN battery */ 281 283 .name = POWER_SUPPLY_TECHNOLOGY_UNKNOWN, ··· 392 394 }, 393 395 }; 394 396 395 - static const struct abx500_bm_capacity_levels cap_levels = { 397 + static const struct ab8500_bm_capacity_levels cap_levels = { 396 398 .critical = 2, 397 399 .low = 10, 398 400 .normal = 70, ··· 400 402 .full = 100, 401 403 }; 402 404 403 - static const struct abx500_fg_parameters fg = { 405 + static const struct ab8500_fg_parameters fg = { 404 406 .recovery_sleep_timer = 10, 405 407 .recovery_total_time = 100, 406 408 .init_timer = 1, ··· 422 424 .pcut_debounce_time = 2, 423 425 }; 424 426 425 - static const struct abx500_maxim_parameters ab8500_maxi_params = { 427 + static const struct ab8500_maxim_parameters ab8500_maxi_params = { 426 428 .ena_maxi = true, 427 429 .chg_curr = 910, 428 430 .wait_cycles = 10, 429 431 .charger_curr_step = 100, 430 432 }; 431 433 432 - static const struct abx500_bm_charger_parameters chg = { 434 + static const struct ab8500_bm_charger_parameters chg = { 433 435 .usb_volt_max = 5500, 434 436 .usb_curr_max = 1500, 435 437 .ac_volt_max = 7500, ··· 454 456 700, 800, 900, 1000, 1100, 1300, 1400, 1500, 455 457 }; 456 458 457 - struct abx500_bm_data ab8500_bm_data = { 459 + struct ab8500_bm_data ab8500_bm_data = { 458 460 .temp_under = 3, 459 461 .temp_low = 8, 460 462 .temp_high = 43, ··· 467 469 .bkup_bat_i = BUP_ICH_SEL_150UA, 468 470 .no_maintenance = false, 469 471 .capacity_scaling = false, 470 - .adc_therm = ABx500_ADC_THERM_BATCTRL, 472 + .adc_therm = AB8500_ADC_THERM_BATCTRL, 471 473 .chg_unknown_bat = false, 472 474 .enable_overshoot = false, 473 475 .fg_res = 100, ··· 490 492 491 493 int ab8500_bm_of_probe(struct device *dev, 492 494 struct device_node *np, 493 - struct abx500_bm_data *bm) 495 + struct ab8500_bm_data *bm) 494 496 { 495 497 const struct batres_vs_temp *tmp_batres_tbl; 496 498 struct device_node *battery_node; ··· 529 531 } else { 530 532 bm->n_btypes = 4; 531 533 bm->bat_type = bat_type_ext_thermistor; 532 - bm->adc_therm = ABx500_ADC_THERM_BATTEMP; 534 + bm->adc_therm = AB8500_ADC_THERM_BATTEMP; 533 535 tmp_batres_tbl = temp_to_batres_tbl_ext_thermistor; 534 536 } 535 537
+12 -10
drivers/power/supply/ab8500_btemp.c
··· 27 27 #include <linux/mfd/abx500.h> 28 28 #include <linux/mfd/abx500/ab8500.h> 29 29 #include <linux/iio/consumer.h> 30 + #include <linux/fixp-arith.h> 30 31 31 32 #include "ab8500-bm.h" 32 33 ··· 103 102 struct iio_channel *btemp_ball; 104 103 struct iio_channel *bat_ctrl; 105 104 struct ab8500_fg *fg; 106 - struct abx500_bm_data *bm; 105 + struct ab8500_bm_data *bm; 107 106 struct power_supply *btemp_psy; 108 107 struct ab8500_btemp_events events; 109 108 struct ab8500_btemp_ranges btemp_ranges; ··· 145 144 return (450000 * (v_batctrl)) / (1800 - v_batctrl); 146 145 } 147 146 148 - if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL) { 147 + if (di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL) { 149 148 /* 150 149 * If the battery has internal NTC, we use the current 151 150 * source to calculate the resistance. ··· 207 206 return 0; 208 207 209 208 /* Only do this for batteries with internal NTC */ 210 - if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && enable) { 209 + if (di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL && enable) { 211 210 212 211 if (di->curr_source == BTEMP_BATCTRL_CURR_SRC_7UA) 213 212 curr = BAT_CTRL_7U_ENA; ··· 240 239 __func__); 241 240 goto disable_curr_source; 242 241 } 243 - } else if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && !enable) { 242 + } else if (di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL && !enable) { 244 243 dev_dbg(di->dev, "Disable BATCTRL curr source\n"); 245 244 246 245 /* Write 0 to the curr bits */ ··· 418 417 * based on the NTC resistance. 419 418 */ 420 419 static int ab8500_btemp_res_to_temp(struct ab8500_btemp *di, 421 - const struct abx500_res_to_temp *tbl, int tbl_size, int res) 420 + const struct ab8500_res_to_temp *tbl, int tbl_size, int res) 422 421 { 423 422 int i; 424 423 /* ··· 438 437 i++; 439 438 } 440 439 441 - return tbl[i].temp + ((tbl[i + 1].temp - tbl[i].temp) * 442 - (res - tbl[i].resist)) / (tbl[i + 1].resist - tbl[i].resist); 440 + return fixp_linear_interpolate(tbl[i].resist, tbl[i].temp, 441 + tbl[i + 1].resist, tbl[i + 1].temp, 442 + res); 443 443 } 444 444 445 445 /** ··· 458 456 459 457 id = di->bm->batt_id; 460 458 461 - if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && 459 + if (di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL && 462 460 id != BATTERY_UNKNOWN) { 463 461 464 462 rbat = ab8500_btemp_get_batctrl_res(di); ··· 527 525 dev_dbg(di->dev, "Battery detected on %s" 528 526 " low %d < res %d < high: %d" 529 527 " index: %d\n", 530 - di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL ? 528 + di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL ? 531 529 "BATCTRL" : "BATTEMP", 532 530 di->bm->bat_type[i].resis_low, res, 533 531 di->bm->bat_type[i].resis_high, i); ··· 547 545 * We only have to change current source if the 548 546 * detected type is Type 1. 549 547 */ 550 - if (di->bm->adc_therm == ABx500_ADC_THERM_BATCTRL && 548 + if (di->bm->adc_therm == AB8500_ADC_THERM_BATCTRL && 551 549 di->bm->batt_id == 1) { 552 550 dev_dbg(di->dev, "Set BATCTRL current source to 20uA\n"); 553 551 di->curr_source = BTEMP_BATCTRL_CURR_SRC_20UA;
+2 -2
drivers/power/supply/ab8500_charger.c
··· 292 292 struct iio_channel *adc_main_charger_c; 293 293 struct iio_channel *adc_vbus_v; 294 294 struct iio_channel *adc_usb_charger_c; 295 - struct abx500_bm_data *bm; 295 + struct ab8500_bm_data *bm; 296 296 struct ab8500_charger_event_flags flags; 297 297 struct ab8500_charger_usb_state usb_state; 298 298 struct ab8500_charger_max_usb_in_curr max_usb_in_curr; ··· 3388 3388 static struct platform_driver *const ab8500_charger_component_drivers[] = { 3389 3389 &ab8500_fg_driver, 3390 3390 &ab8500_btemp_driver, 3391 - &abx500_chargalg_driver, 3391 + &ab8500_chargalg_driver, 3392 3392 }; 3393 3393 3394 3394 static int ab8500_charger_compare_dev(struct device *dev, void *data)
+10 -10
drivers/power/supply/ab8500_fg.c
··· 34 34 #include <linux/mfd/abx500/ab8500.h> 35 35 #include <linux/iio/consumer.h> 36 36 #include <linux/kernel.h> 37 + #include <linux/fixp-arith.h> 37 38 38 39 #include "ab8500-bm.h" 39 40 ··· 56 55 57 56 /* FG constants */ 58 57 #define BATT_OVV 0x01 59 - 60 - #define interpolate(x, x1, y1, x2, y2) \ 61 - ((y1) + ((((y2) - (y1)) * ((x) - (x1))) / ((x2) - (x1)))); 62 58 63 59 /** 64 60 * struct ab8500_fg_interrupts - ab8500 fg interrupts ··· 225 227 struct ab8500_fg_avg_cap avg_cap; 226 228 struct ab8500 *parent; 227 229 struct iio_channel *main_bat_v; 228 - struct abx500_bm_data *bm; 230 + struct ab8500_bm_data *bm; 229 231 struct power_supply *fg_psy; 230 232 struct workqueue_struct *fg_wq; 231 233 struct delayed_work fg_periodic_work; ··· 854 856 static int ab8500_fg_volt_to_capacity(struct ab8500_fg *di, int voltage) 855 857 { 856 858 int i, tbl_size; 857 - const struct abx500_v_to_cap *tbl; 859 + const struct ab8500_v_to_cap *tbl; 858 860 int cap = 0; 859 861 860 862 tbl = di->bm->bat_type[di->bm->batt_id].v_to_cap_tbl; ··· 866 868 } 867 869 868 870 if ((i > 0) && (i < tbl_size)) { 869 - cap = interpolate(voltage, 871 + cap = fixp_linear_interpolate( 870 872 tbl[i].voltage, 871 873 tbl[i].capacity * 10, 872 874 tbl[i-1].voltage, 873 - tbl[i-1].capacity * 10); 875 + tbl[i-1].capacity * 10, 876 + voltage); 874 877 } else if (i == 0) { 875 878 cap = 1000; 876 879 } else { ··· 919 920 } 920 921 921 922 if ((i > 0) && (i < tbl_size)) { 922 - resist = interpolate(di->bat_temp / 10, 923 + resist = fixp_linear_interpolate( 923 924 tbl[i].temp, 924 925 tbl[i].resist, 925 926 tbl[i-1].temp, 926 - tbl[i-1].resist); 927 + tbl[i-1].resist, 928 + di->bat_temp / 10); 927 929 } else if (i == 0) { 928 930 resist = tbl[0].resist; 929 931 } else { ··· 2235 2235 case POWER_SUPPLY_TYPE_BATTERY: 2236 2236 if (!di->flags.batt_id_received && 2237 2237 di->bm->batt_id != BATTERY_UNKNOWN) { 2238 - const struct abx500_battery_type *b; 2238 + const struct ab8500_battery_type *b; 2239 2239 2240 2240 b = &(di->bm->bat_type[di->bm->batt_id]); 2241 2241
+299 -302
drivers/power/supply/abx500_chargalg.c drivers/power/supply/ab8500_chargalg.c
··· 3 3 * Copyright (C) ST-Ericsson SA 2012 4 4 * Copyright (c) 2012 Sony Mobile Communications AB 5 5 * 6 - * Charging algorithm driver for abx500 variants 6 + * Charging algorithm driver for AB8500 7 7 * 8 8 * Authors: 9 9 * Johan Palsson <johan.palsson@stericsson.com> ··· 49 49 #define CHARGALG_CURR_STEP_LOW 0 50 50 #define CHARGALG_CURR_STEP_HIGH 100 51 51 52 - enum abx500_chargers { 52 + enum ab8500_chargers { 53 53 NO_CHG, 54 54 AC_CHG, 55 55 USB_CHG, 56 56 }; 57 57 58 - struct abx500_chargalg_charger_info { 59 - enum abx500_chargers conn_chg; 60 - enum abx500_chargers prev_conn_chg; 61 - enum abx500_chargers online_chg; 62 - enum abx500_chargers prev_online_chg; 63 - enum abx500_chargers charger_type; 58 + struct ab8500_chargalg_charger_info { 59 + enum ab8500_chargers conn_chg; 60 + enum ab8500_chargers prev_conn_chg; 61 + enum ab8500_chargers online_chg; 62 + enum ab8500_chargers prev_online_chg; 63 + enum ab8500_chargers charger_type; 64 64 bool usb_chg_ok; 65 65 bool ac_chg_ok; 66 66 int usb_volt; ··· 73 73 int ac_iset; 74 74 }; 75 75 76 - struct abx500_chargalg_suspension_status { 76 + struct ab8500_chargalg_suspension_status { 77 77 bool suspended_change; 78 78 bool ac_suspended; 79 79 bool usb_suspended; 80 80 }; 81 81 82 - struct abx500_chargalg_current_step_status { 82 + struct ab8500_chargalg_current_step_status { 83 83 bool curr_step_change; 84 84 int curr_step; 85 85 }; 86 86 87 - struct abx500_chargalg_battery_data { 87 + struct ab8500_chargalg_battery_data { 88 88 int temp; 89 89 int volt; 90 90 int avg_curr; ··· 92 92 int percent; 93 93 }; 94 94 95 - enum abx500_chargalg_states { 95 + enum ab8500_chargalg_states { 96 96 STATE_HANDHELD_INIT, 97 97 STATE_HANDHELD, 98 98 STATE_CHG_NOT_OK_INIT, ··· 123 123 STATE_WD_EXPIRED, 124 124 }; 125 125 126 - static const char *states[] = { 126 + static const char * const states[] = { 127 127 "HANDHELD_INIT", 128 128 "HANDHELD", 129 129 "CHG_NOT_OK_INIT", ··· 154 154 "WD_EXPIRED", 155 155 }; 156 156 157 - struct abx500_chargalg_events { 157 + struct ab8500_chargalg_events { 158 158 bool batt_unknown; 159 159 bool mainextchnotok; 160 160 bool batt_ovv; ··· 176 176 }; 177 177 178 178 /** 179 - * struct abx500_charge_curr_maximization - Charger maximization parameters 179 + * struct ab8500_charge_curr_maximization - Charger maximization parameters 180 180 * @original_iset: the non optimized/maximised charger current 181 181 * @current_iset: the charging current used at this moment 182 182 * @test_delta_i: the delta between the current we want to charge and the ··· 190 190 * @level: tells in how many steps the charging current has been 191 191 increased 192 192 */ 193 - struct abx500_charge_curr_maximization { 193 + struct ab8500_charge_curr_maximization { 194 194 int original_iset; 195 195 int current_iset; 196 196 int test_delta_i; ··· 207 207 }; 208 208 209 209 /** 210 - * struct abx500_chargalg - abx500 Charging algorithm device information 210 + * struct ab8500_chargalg - ab8500 Charging algorithm device information 211 211 * @dev: pointer to the structure device 212 212 * @charge_status: battery operating status 213 213 * @eoc_cnt: counter used to determine end-of_charge ··· 223 223 * @susp_status: current charger suspension status 224 224 * @bm: Platform specific battery management information 225 225 * @curr_status: Current step status for over-current protection 226 - * @parent: pointer to the struct abx500 226 + * @parent: pointer to the struct ab8500 227 227 * @chargalg_psy: structure that holds the battery properties exposed by 228 228 * the charging algorithm 229 229 * @events: structure for information about events triggered ··· 235 235 * @maintenance_timer: maintenance charging timer 236 236 * @chargalg_kobject: structure of type kobject 237 237 */ 238 - struct abx500_chargalg { 238 + struct ab8500_chargalg { 239 239 struct device *dev; 240 240 int charge_status; 241 241 int eoc_cnt; 242 242 bool maintenance_chg; 243 243 int t_hyst_norm; 244 244 int t_hyst_lowhigh; 245 - enum abx500_chargalg_states charge_state; 246 - struct abx500_charge_curr_maximization ccm; 247 - struct abx500_chargalg_charger_info chg_info; 248 - struct abx500_chargalg_battery_data batt_data; 249 - struct abx500_chargalg_suspension_status susp_status; 245 + enum ab8500_chargalg_states charge_state; 246 + struct ab8500_charge_curr_maximization ccm; 247 + struct ab8500_chargalg_charger_info chg_info; 248 + struct ab8500_chargalg_battery_data batt_data; 249 + struct ab8500_chargalg_suspension_status susp_status; 250 250 struct ab8500 *parent; 251 - struct abx500_chargalg_current_step_status curr_status; 252 - struct abx500_bm_data *bm; 251 + struct ab8500_chargalg_current_step_status curr_status; 252 + struct ab8500_bm_data *bm; 253 253 struct power_supply *chargalg_psy; 254 254 struct ux500_charger *ac_chg; 255 255 struct ux500_charger *usb_chg; 256 - struct abx500_chargalg_events events; 256 + struct ab8500_chargalg_events events; 257 257 struct workqueue_struct *chargalg_wq; 258 258 struct delayed_work chargalg_periodic_work; 259 259 struct delayed_work chargalg_wd_work; ··· 267 267 BLOCKING_NOTIFIER_HEAD(charger_notifier_list); 268 268 269 269 /* Main battery properties */ 270 - static enum power_supply_property abx500_chargalg_props[] = { 270 + static enum power_supply_property ab8500_chargalg_props[] = { 271 271 POWER_SUPPLY_PROP_STATUS, 272 272 POWER_SUPPLY_PROP_HEALTH, 273 273 }; 274 274 275 - struct abx500_chargalg_sysfs_entry { 275 + struct ab8500_chargalg_sysfs_entry { 276 276 struct attribute attr; 277 - ssize_t (*show)(struct abx500_chargalg *, char *); 278 - ssize_t (*store)(struct abx500_chargalg *, const char *, size_t); 277 + ssize_t (*show)(struct ab8500_chargalg *di, char *buf); 278 + ssize_t (*store)(struct ab8500_chargalg *di, const char *buf, size_t length); 279 279 }; 280 280 281 281 /** 282 - * abx500_chargalg_safety_timer_expired() - Expiration of the safety timer 282 + * ab8500_chargalg_safety_timer_expired() - Expiration of the safety timer 283 283 * @timer: pointer to the hrtimer structure 284 284 * 285 285 * This function gets called when the safety timer for the charger 286 286 * expires 287 287 */ 288 288 static enum hrtimer_restart 289 - abx500_chargalg_safety_timer_expired(struct hrtimer *timer) 289 + ab8500_chargalg_safety_timer_expired(struct hrtimer *timer) 290 290 { 291 - struct abx500_chargalg *di = container_of(timer, struct abx500_chargalg, 291 + struct ab8500_chargalg *di = container_of(timer, struct ab8500_chargalg, 292 292 safety_timer); 293 293 dev_err(di->dev, "Safety timer expired\n"); 294 294 di->events.safety_timer_expired = true; ··· 300 300 } 301 301 302 302 /** 303 - * abx500_chargalg_maintenance_timer_expired() - Expiration of 303 + * ab8500_chargalg_maintenance_timer_expired() - Expiration of 304 304 * the maintenance timer 305 305 * @timer: pointer to the timer structure 306 306 * ··· 308 308 * expires 309 309 */ 310 310 static enum hrtimer_restart 311 - abx500_chargalg_maintenance_timer_expired(struct hrtimer *timer) 311 + ab8500_chargalg_maintenance_timer_expired(struct hrtimer *timer) 312 312 { 313 313 314 - struct abx500_chargalg *di = container_of(timer, struct abx500_chargalg, 314 + struct ab8500_chargalg *di = container_of(timer, struct ab8500_chargalg, 315 315 maintenance_timer); 316 316 317 317 dev_dbg(di->dev, "Maintenance timer expired\n"); ··· 324 324 } 325 325 326 326 /** 327 - * abx500_chargalg_state_to() - Change charge state 328 - * @di: pointer to the abx500_chargalg structure 327 + * ab8500_chargalg_state_to() - Change charge state 328 + * @di: pointer to the ab8500_chargalg structure 329 329 * 330 330 * This function gets called when a charge state change should occur 331 331 */ 332 - static void abx500_chargalg_state_to(struct abx500_chargalg *di, 333 - enum abx500_chargalg_states state) 332 + static void ab8500_chargalg_state_to(struct ab8500_chargalg *di, 333 + enum ab8500_chargalg_states state) 334 334 { 335 335 dev_dbg(di->dev, 336 336 "State changed: %s (From state: [%d] %s =to=> [%d] %s )\n", ··· 343 343 di->charge_state = state; 344 344 } 345 345 346 - static int abx500_chargalg_check_charger_enable(struct abx500_chargalg *di) 346 + static int ab8500_chargalg_check_charger_enable(struct ab8500_chargalg *di) 347 347 { 348 348 switch (di->charge_state) { 349 349 case STATE_NORMAL: ··· 368 368 } 369 369 370 370 /** 371 - * abx500_chargalg_check_charger_connection() - Check charger connection change 372 - * @di: pointer to the abx500_chargalg structure 371 + * ab8500_chargalg_check_charger_connection() - Check charger connection change 372 + * @di: pointer to the ab8500_chargalg structure 373 373 * 374 374 * This function will check if there is a change in the charger connection 375 375 * and change charge state accordingly. AC has precedence over USB. 376 376 */ 377 - static int abx500_chargalg_check_charger_connection(struct abx500_chargalg *di) 377 + static int ab8500_chargalg_check_charger_connection(struct ab8500_chargalg *di) 378 378 { 379 379 if (di->chg_info.conn_chg != di->chg_info.prev_conn_chg || 380 380 di->susp_status.suspended_change) { ··· 387 387 dev_dbg(di->dev, "Charging source is AC\n"); 388 388 if (di->chg_info.charger_type != AC_CHG) { 389 389 di->chg_info.charger_type = AC_CHG; 390 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 390 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 391 391 } 392 392 } else if ((di->chg_info.conn_chg & USB_CHG) && 393 393 !di->susp_status.usb_suspended) { 394 394 dev_dbg(di->dev, "Charging source is USB\n"); 395 395 di->chg_info.charger_type = USB_CHG; 396 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 396 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 397 397 } else if (di->chg_info.conn_chg && 398 398 (di->susp_status.ac_suspended || 399 399 di->susp_status.usb_suspended)) { 400 400 dev_dbg(di->dev, "Charging is suspended\n"); 401 401 di->chg_info.charger_type = NO_CHG; 402 - abx500_chargalg_state_to(di, STATE_SUSPENDED_INIT); 402 + ab8500_chargalg_state_to(di, STATE_SUSPENDED_INIT); 403 403 } else { 404 404 dev_dbg(di->dev, "Charging source is OFF\n"); 405 405 di->chg_info.charger_type = NO_CHG; 406 - abx500_chargalg_state_to(di, STATE_HANDHELD_INIT); 406 + ab8500_chargalg_state_to(di, STATE_HANDHELD_INIT); 407 407 } 408 408 di->chg_info.prev_conn_chg = di->chg_info.conn_chg; 409 409 di->susp_status.suspended_change = false; ··· 412 412 } 413 413 414 414 /** 415 - * abx500_chargalg_check_current_step_status() - Check charging current 415 + * ab8500_chargalg_check_current_step_status() - Check charging current 416 416 * step status. 417 - * @di: pointer to the abx500_chargalg structure 417 + * @di: pointer to the ab8500_chargalg structure 418 418 * 419 419 * This function will check if there is a change in the charging current step 420 420 * and change charge state accordingly. 421 421 */ 422 - static void abx500_chargalg_check_current_step_status 423 - (struct abx500_chargalg *di) 422 + static void ab8500_chargalg_check_current_step_status 423 + (struct ab8500_chargalg *di) 424 424 { 425 425 if (di->curr_status.curr_step_change) 426 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 426 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 427 427 di->curr_status.curr_step_change = false; 428 428 } 429 429 430 430 /** 431 - * abx500_chargalg_start_safety_timer() - Start charging safety timer 432 - * @di: pointer to the abx500_chargalg structure 431 + * ab8500_chargalg_start_safety_timer() - Start charging safety timer 432 + * @di: pointer to the ab8500_chargalg structure 433 433 * 434 434 * The safety timer is used to avoid overcharging of old or bad batteries. 435 435 * There are different timers for AC and USB 436 436 */ 437 - static void abx500_chargalg_start_safety_timer(struct abx500_chargalg *di) 437 + static void ab8500_chargalg_start_safety_timer(struct ab8500_chargalg *di) 438 438 { 439 439 /* Charger-dependent expiration time in hours*/ 440 440 int timer_expiration = 0; ··· 461 461 } 462 462 463 463 /** 464 - * abx500_chargalg_stop_safety_timer() - Stop charging safety timer 465 - * @di: pointer to the abx500_chargalg structure 464 + * ab8500_chargalg_stop_safety_timer() - Stop charging safety timer 465 + * @di: pointer to the ab8500_chargalg structure 466 466 * 467 467 * The safety timer is stopped whenever the NORMAL state is exited 468 468 */ 469 - static void abx500_chargalg_stop_safety_timer(struct abx500_chargalg *di) 469 + static void ab8500_chargalg_stop_safety_timer(struct ab8500_chargalg *di) 470 470 { 471 471 if (hrtimer_try_to_cancel(&di->safety_timer) >= 0) 472 472 di->events.safety_timer_expired = false; 473 473 } 474 474 475 475 /** 476 - * abx500_chargalg_start_maintenance_timer() - Start charging maintenance timer 477 - * @di: pointer to the abx500_chargalg structure 476 + * ab8500_chargalg_start_maintenance_timer() - Start charging maintenance timer 477 + * @di: pointer to the ab8500_chargalg structure 478 478 * @duration: duration of ther maintenance timer in hours 479 479 * 480 480 * The maintenance timer is used to maintain the charge in the battery once 481 481 * the battery is considered full. These timers are chosen to match the 482 482 * discharge curve of the battery 483 483 */ 484 - static void abx500_chargalg_start_maintenance_timer(struct abx500_chargalg *di, 484 + static void ab8500_chargalg_start_maintenance_timer(struct ab8500_chargalg *di, 485 485 int duration) 486 486 { 487 487 hrtimer_set_expires_range(&di->maintenance_timer, ··· 492 492 } 493 493 494 494 /** 495 - * abx500_chargalg_stop_maintenance_timer() - Stop maintenance timer 496 - * @di: pointer to the abx500_chargalg structure 495 + * ab8500_chargalg_stop_maintenance_timer() - Stop maintenance timer 496 + * @di: pointer to the ab8500_chargalg structure 497 497 * 498 498 * The maintenance timer is stopped whenever maintenance ends or when another 499 499 * state is entered 500 500 */ 501 - static void abx500_chargalg_stop_maintenance_timer(struct abx500_chargalg *di) 501 + static void ab8500_chargalg_stop_maintenance_timer(struct ab8500_chargalg *di) 502 502 { 503 503 if (hrtimer_try_to_cancel(&di->maintenance_timer) >= 0) 504 504 di->events.maintenance_timer_expired = false; 505 505 } 506 506 507 507 /** 508 - * abx500_chargalg_kick_watchdog() - Kick charger watchdog 509 - * @di: pointer to the abx500_chargalg structure 508 + * ab8500_chargalg_kick_watchdog() - Kick charger watchdog 509 + * @di: pointer to the ab8500_chargalg structure 510 510 * 511 511 * The charger watchdog have to be kicked periodically whenever the charger is 512 512 * on, else the ABB will reset the system 513 513 */ 514 - static int abx500_chargalg_kick_watchdog(struct abx500_chargalg *di) 514 + static int ab8500_chargalg_kick_watchdog(struct ab8500_chargalg *di) 515 515 { 516 516 /* Check if charger exists and kick watchdog if charging */ 517 517 if (di->ac_chg && di->ac_chg->ops.kick_wd && ··· 526 526 di->usb_chg->ops.kick_wd(di->usb_chg); 527 527 528 528 return di->ac_chg->ops.kick_wd(di->ac_chg); 529 - } 530 - else if (di->usb_chg && di->usb_chg->ops.kick_wd && 529 + } else if (di->usb_chg && di->usb_chg->ops.kick_wd && 531 530 di->chg_info.online_chg & USB_CHG) 532 531 return di->usb_chg->ops.kick_wd(di->usb_chg); 533 532 ··· 534 535 } 535 536 536 537 /** 537 - * abx500_chargalg_ac_en() - Turn on/off the AC charger 538 - * @di: pointer to the abx500_chargalg structure 538 + * ab8500_chargalg_ac_en() - Turn on/off the AC charger 539 + * @di: pointer to the ab8500_chargalg structure 539 540 * @enable: charger on/off 540 541 * @vset: requested charger output voltage 541 542 * @iset: requested charger output current ··· 543 544 * The AC charger will be turned on/off with the requested charge voltage and 544 545 * current 545 546 */ 546 - static int abx500_chargalg_ac_en(struct abx500_chargalg *di, int enable, 547 + static int ab8500_chargalg_ac_en(struct ab8500_chargalg *di, int enable, 547 548 int vset, int iset) 548 549 { 549 - static int abx500_chargalg_ex_ac_enable_toggle; 550 + static int ab8500_chargalg_ex_ac_enable_toggle; 550 551 551 552 if (!di->ac_chg || !di->ac_chg->ops.enable) 552 553 return -ENXIO; ··· 562 563 563 564 /* Enable external charger */ 564 565 if (enable && di->ac_chg->external && 565 - !abx500_chargalg_ex_ac_enable_toggle) { 566 + !ab8500_chargalg_ex_ac_enable_toggle) { 566 567 blocking_notifier_call_chain(&charger_notifier_list, 567 568 0, di->dev); 568 - abx500_chargalg_ex_ac_enable_toggle++; 569 + ab8500_chargalg_ex_ac_enable_toggle++; 569 570 } 570 571 571 572 return di->ac_chg->ops.enable(di->ac_chg, enable, vset, iset); 572 573 } 573 574 574 575 /** 575 - * abx500_chargalg_usb_en() - Turn on/off the USB charger 576 - * @di: pointer to the abx500_chargalg structure 576 + * ab8500_chargalg_usb_en() - Turn on/off the USB charger 577 + * @di: pointer to the ab8500_chargalg structure 577 578 * @enable: charger on/off 578 579 * @vset: requested charger output voltage 579 580 * @iset: requested charger output current ··· 581 582 * The USB charger will be turned on/off with the requested charge voltage and 582 583 * current 583 584 */ 584 - static int abx500_chargalg_usb_en(struct abx500_chargalg *di, int enable, 585 + static int ab8500_chargalg_usb_en(struct ab8500_chargalg *di, int enable, 585 586 int vset, int iset) 586 587 { 587 588 if (!di->usb_chg || !di->usb_chg->ops.enable) ··· 600 601 } 601 602 602 603 /** 603 - * abx500_chargalg_update_chg_curr() - Update charger current 604 - * @di: pointer to the abx500_chargalg structure 604 + * ab8500_chargalg_update_chg_curr() - Update charger current 605 + * @di: pointer to the ab8500_chargalg structure 605 606 * @iset: requested charger output current 606 607 * 607 608 * The charger output current will be updated for the charger 608 609 * that is currently in use 609 610 */ 610 - static int abx500_chargalg_update_chg_curr(struct abx500_chargalg *di, 611 + static int ab8500_chargalg_update_chg_curr(struct ab8500_chargalg *di, 611 612 int iset) 612 613 { 613 614 /* Check if charger exists and update current if charging */ ··· 641 642 } 642 643 643 644 /** 644 - * abx500_chargalg_stop_charging() - Stop charging 645 - * @di: pointer to the abx500_chargalg structure 645 + * ab8500_chargalg_stop_charging() - Stop charging 646 + * @di: pointer to the ab8500_chargalg structure 646 647 * 647 648 * This function is called from any state where charging should be stopped. 648 649 * All charging is disabled and all status parameters and timers are changed 649 650 * accordingly 650 651 */ 651 - static void abx500_chargalg_stop_charging(struct abx500_chargalg *di) 652 + static void ab8500_chargalg_stop_charging(struct ab8500_chargalg *di) 652 653 { 653 - abx500_chargalg_ac_en(di, false, 0, 0); 654 - abx500_chargalg_usb_en(di, false, 0, 0); 655 - abx500_chargalg_stop_safety_timer(di); 656 - abx500_chargalg_stop_maintenance_timer(di); 654 + ab8500_chargalg_ac_en(di, false, 0, 0); 655 + ab8500_chargalg_usb_en(di, false, 0, 0); 656 + ab8500_chargalg_stop_safety_timer(di); 657 + ab8500_chargalg_stop_maintenance_timer(di); 657 658 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING; 658 659 di->maintenance_chg = false; 659 660 cancel_delayed_work(&di->chargalg_wd_work); ··· 661 662 } 662 663 663 664 /** 664 - * abx500_chargalg_hold_charging() - Pauses charging 665 - * @di: pointer to the abx500_chargalg structure 665 + * ab8500_chargalg_hold_charging() - Pauses charging 666 + * @di: pointer to the ab8500_chargalg structure 666 667 * 667 668 * This function is called in the case where maintenance charging has been 668 669 * disabled and instead a battery voltage mode is entered to check when the 669 670 * battery voltage has reached a certain recharge voltage 670 671 */ 671 - static void abx500_chargalg_hold_charging(struct abx500_chargalg *di) 672 + static void ab8500_chargalg_hold_charging(struct ab8500_chargalg *di) 672 673 { 673 - abx500_chargalg_ac_en(di, false, 0, 0); 674 - abx500_chargalg_usb_en(di, false, 0, 0); 675 - abx500_chargalg_stop_safety_timer(di); 676 - abx500_chargalg_stop_maintenance_timer(di); 674 + ab8500_chargalg_ac_en(di, false, 0, 0); 675 + ab8500_chargalg_usb_en(di, false, 0, 0); 676 + ab8500_chargalg_stop_safety_timer(di); 677 + ab8500_chargalg_stop_maintenance_timer(di); 677 678 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; 678 679 di->maintenance_chg = false; 679 680 cancel_delayed_work(&di->chargalg_wd_work); ··· 681 682 } 682 683 683 684 /** 684 - * abx500_chargalg_start_charging() - Start the charger 685 - * @di: pointer to the abx500_chargalg structure 685 + * ab8500_chargalg_start_charging() - Start the charger 686 + * @di: pointer to the ab8500_chargalg structure 686 687 * @vset: requested charger output voltage 687 688 * @iset: requested charger output current 688 689 * 689 690 * A charger will be enabled depending on the requested charger type that was 690 691 * detected previously. 691 692 */ 692 - static void abx500_chargalg_start_charging(struct abx500_chargalg *di, 693 + static void ab8500_chargalg_start_charging(struct ab8500_chargalg *di, 693 694 int vset, int iset) 694 695 { 695 696 switch (di->chg_info.charger_type) { 696 697 case AC_CHG: 697 698 dev_dbg(di->dev, 698 699 "AC parameters: Vset %d, Ich %d\n", vset, iset); 699 - abx500_chargalg_usb_en(di, false, 0, 0); 700 - abx500_chargalg_ac_en(di, true, vset, iset); 700 + ab8500_chargalg_usb_en(di, false, 0, 0); 701 + ab8500_chargalg_ac_en(di, true, vset, iset); 701 702 break; 702 703 703 704 case USB_CHG: 704 705 dev_dbg(di->dev, 705 706 "USB parameters: Vset %d, Ich %d\n", vset, iset); 706 - abx500_chargalg_ac_en(di, false, 0, 0); 707 - abx500_chargalg_usb_en(di, true, vset, iset); 707 + ab8500_chargalg_ac_en(di, false, 0, 0); 708 + ab8500_chargalg_usb_en(di, true, vset, iset); 708 709 break; 709 710 710 711 default: ··· 714 715 } 715 716 716 717 /** 717 - * abx500_chargalg_check_temp() - Check battery temperature ranges 718 - * @di: pointer to the abx500_chargalg structure 718 + * ab8500_chargalg_check_temp() - Check battery temperature ranges 719 + * @di: pointer to the ab8500_chargalg structure 719 720 * 720 721 * The battery temperature is checked against the predefined limits and the 721 722 * charge state is changed accordingly 722 723 */ 723 - static void abx500_chargalg_check_temp(struct abx500_chargalg *di) 724 + static void ab8500_chargalg_check_temp(struct ab8500_chargalg *di) 724 725 { 725 726 if (di->batt_data.temp > (di->bm->temp_low + di->t_hyst_norm) && 726 727 di->batt_data.temp < (di->bm->temp_high - di->t_hyst_norm)) { ··· 749 750 di->t_hyst_norm = 0; 750 751 di->t_hyst_lowhigh = di->bm->temp_hysteresis; 751 752 } else { 752 - /* Within hysteresis */ 753 - dev_dbg(di->dev, "Within hysteresis limit temp: %d " 753 + /* Within hysteresis */ 754 + dev_dbg(di->dev, "Within hysteresis limit temp: %d " 754 755 "hyst_lowhigh %d, hyst normal %d\n", 755 756 di->batt_data.temp, di->t_hyst_lowhigh, 756 757 di->t_hyst_norm); ··· 759 760 } 760 761 761 762 /** 762 - * abx500_chargalg_check_charger_voltage() - Check charger voltage 763 - * @di: pointer to the abx500_chargalg structure 763 + * ab8500_chargalg_check_charger_voltage() - Check charger voltage 764 + * @di: pointer to the ab8500_chargalg structure 764 765 * 765 766 * Charger voltage is checked against maximum limit 766 767 */ 767 - static void abx500_chargalg_check_charger_voltage(struct abx500_chargalg *di) 768 + static void ab8500_chargalg_check_charger_voltage(struct ab8500_chargalg *di) 768 769 { 769 770 if (di->chg_info.usb_volt > di->bm->chg_params->usb_volt_max) 770 771 di->chg_info.usb_chg_ok = false; ··· 779 780 } 780 781 781 782 /** 782 - * abx500_chargalg_end_of_charge() - Check if end-of-charge criteria is fulfilled 783 - * @di: pointer to the abx500_chargalg structure 783 + * ab8500_chargalg_end_of_charge() - Check if end-of-charge criteria is fulfilled 784 + * @di: pointer to the ab8500_chargalg structure 784 785 * 785 786 * End-of-charge criteria is fulfilled when the battery voltage is above a 786 787 * certain limit and the battery current is below a certain limit for a 787 788 * predefined number of consecutive seconds. If true, the battery is full 788 789 */ 789 - static void abx500_chargalg_end_of_charge(struct abx500_chargalg *di) 790 + static void ab8500_chargalg_end_of_charge(struct ab8500_chargalg *di) 790 791 { 791 792 if (di->charge_status == POWER_SUPPLY_STATUS_CHARGING && 792 793 di->charge_state == STATE_NORMAL && ··· 814 815 } 815 816 } 816 817 817 - static void init_maxim_chg_curr(struct abx500_chargalg *di) 818 + static void init_maxim_chg_curr(struct ab8500_chargalg *di) 818 819 { 819 820 di->ccm.original_iset = 820 821 di->bm->bat_type[di->bm->batt_id].normal_cur_lvl; ··· 827 828 } 828 829 829 830 /** 830 - * abx500_chargalg_chg_curr_maxim - increases the charger current to 831 + * ab8500_chargalg_chg_curr_maxim - increases the charger current to 831 832 * compensate for the system load 832 - * @di pointer to the abx500_chargalg structure 833 + * @di pointer to the ab8500_chargalg structure 833 834 * 834 835 * This maximization function is used to raise the charger current to get the 835 836 * battery current as close to the optimal value as possible. The battery 836 837 * current during charging is affected by the system load 837 838 */ 838 - static enum maxim_ret abx500_chargalg_chg_curr_maxim(struct abx500_chargalg *di) 839 + static enum maxim_ret ab8500_chargalg_chg_curr_maxim(struct ab8500_chargalg *di) 839 840 { 840 841 int delta_i; 841 842 ··· 866 867 867 868 di->ccm.wait_cnt = 0; 868 869 869 - if ((di->batt_data.inst_curr > di->ccm.original_iset)) { 870 + if (di->batt_data.inst_curr > di->ccm.original_iset) { 870 871 dev_dbg(di->dev, " Maximization Ibat (%dmA) too high" 871 872 " (limit %dmA) (current iset: %dmA)!\n", 872 873 di->batt_data.inst_curr, di->ccm.original_iset, ··· 907 908 } 908 909 } 909 910 910 - static void handle_maxim_chg_curr(struct abx500_chargalg *di) 911 + static void handle_maxim_chg_curr(struct ab8500_chargalg *di) 911 912 { 912 913 enum maxim_ret ret; 913 914 int result; 914 915 915 - ret = abx500_chargalg_chg_curr_maxim(di); 916 + ret = ab8500_chargalg_chg_curr_maxim(di); 916 917 switch (ret) { 917 918 case MAXIM_RET_CHANGE: 918 - result = abx500_chargalg_update_chg_curr(di, 919 + result = ab8500_chargalg_update_chg_curr(di, 919 920 di->ccm.current_iset); 920 921 if (result) 921 922 dev_err(di->dev, "failed to set chg curr\n"); 922 923 break; 923 924 case MAXIM_RET_IBAT_TOO_HIGH: 924 - result = abx500_chargalg_update_chg_curr(di, 925 + result = ab8500_chargalg_update_chg_curr(di, 925 926 di->bm->bat_type[di->bm->batt_id].normal_cur_lvl); 926 927 if (result) 927 928 dev_err(di->dev, "failed to set chg curr\n"); ··· 934 935 } 935 936 } 936 937 937 - static int abx500_chargalg_get_ext_psy_data(struct device *dev, void *data) 938 + static int ab8500_chargalg_get_ext_psy_data(struct device *dev, void *data) 938 939 { 939 940 struct power_supply *psy; 940 941 struct power_supply *ext = dev_get_drvdata(dev); 941 942 const char **supplicants = (const char **)ext->supplied_to; 942 - struct abx500_chargalg *di; 943 + struct ab8500_chargalg *di; 943 944 union power_supply_propval ret; 944 945 int j; 945 946 bool capacity_updated = false; ··· 1259 1260 } 1260 1261 1261 1262 /** 1262 - * abx500_chargalg_external_power_changed() - callback for power supply changes 1263 + * ab8500_chargalg_external_power_changed() - callback for power supply changes 1263 1264 * @psy: pointer to the structure power_supply 1264 1265 * 1265 1266 * This function is the entry point of the pointer external_power_changed ··· 1267 1268 * This function gets executed when there is a change in any external power 1268 1269 * supply that this driver needs to be notified of. 1269 1270 */ 1270 - static void abx500_chargalg_external_power_changed(struct power_supply *psy) 1271 + static void ab8500_chargalg_external_power_changed(struct power_supply *psy) 1271 1272 { 1272 - struct abx500_chargalg *di = power_supply_get_drvdata(psy); 1273 + struct ab8500_chargalg *di = power_supply_get_drvdata(psy); 1273 1274 1274 1275 /* 1275 1276 * Trigger execution of the algorithm instantly and read 1276 1277 * all power_supply properties there instead 1277 1278 */ 1278 - queue_work(di->chargalg_wq, &di->chargalg_work); 1279 + if (di->chargalg_wq) 1280 + queue_work(di->chargalg_wq, &di->chargalg_work); 1279 1281 } 1280 1282 1281 1283 /** 1282 - * abx500_chargalg_algorithm() - Main function for the algorithm 1283 - * @di: pointer to the abx500_chargalg structure 1284 + * ab8500_chargalg_algorithm() - Main function for the algorithm 1285 + * @di: pointer to the ab8500_chargalg structure 1284 1286 * 1285 1287 * This is the main control function for the charging algorithm. 1286 1288 * It is called periodically or when something happens that will 1287 1289 * trigger a state change 1288 1290 */ 1289 - static void abx500_chargalg_algorithm(struct abx500_chargalg *di) 1291 + static void ab8500_chargalg_algorithm(struct ab8500_chargalg *di) 1290 1292 { 1291 1293 int charger_status; 1292 1294 int ret; ··· 1295 1295 1296 1296 /* Collect data from all power_supply class devices */ 1297 1297 class_for_each_device(power_supply_class, NULL, 1298 - di->chargalg_psy, abx500_chargalg_get_ext_psy_data); 1298 + di->chargalg_psy, ab8500_chargalg_get_ext_psy_data); 1299 1299 1300 - abx500_chargalg_end_of_charge(di); 1301 - abx500_chargalg_check_temp(di); 1302 - abx500_chargalg_check_charger_voltage(di); 1300 + ab8500_chargalg_end_of_charge(di); 1301 + ab8500_chargalg_check_temp(di); 1302 + ab8500_chargalg_check_charger_voltage(di); 1303 1303 1304 - charger_status = abx500_chargalg_check_charger_connection(di); 1305 - abx500_chargalg_check_current_step_status(di); 1304 + charger_status = ab8500_chargalg_check_charger_connection(di); 1305 + ab8500_chargalg_check_current_step_status(di); 1306 1306 1307 1307 if (is_ab8500(di->parent)) { 1308 - ret = abx500_chargalg_check_charger_enable(di); 1308 + ret = ab8500_chargalg_check_charger_enable(di); 1309 1309 if (ret < 0) 1310 1310 dev_err(di->dev, "Checking charger is enabled error" 1311 1311 ": Returned Value %d\n", ret); ··· 1320 1320 (di->events.batt_unknown && !di->bm->chg_unknown_bat)) { 1321 1321 if (di->charge_state != STATE_HANDHELD) { 1322 1322 di->events.safety_timer_expired = false; 1323 - abx500_chargalg_state_to(di, STATE_HANDHELD_INIT); 1323 + ab8500_chargalg_state_to(di, STATE_HANDHELD_INIT); 1324 1324 } 1325 1325 } 1326 1326 ··· 1333 1333 /* Safety timer expiration */ 1334 1334 else if (di->events.safety_timer_expired) { 1335 1335 if (di->charge_state != STATE_SAFETY_TIMER_EXPIRED) 1336 - abx500_chargalg_state_to(di, 1336 + ab8500_chargalg_state_to(di, 1337 1337 STATE_SAFETY_TIMER_EXPIRED_INIT); 1338 1338 } 1339 1339 /* ··· 1344 1344 /* Battery removed */ 1345 1345 else if (di->events.batt_rem) { 1346 1346 if (di->charge_state != STATE_BATT_REMOVED) 1347 - abx500_chargalg_state_to(di, STATE_BATT_REMOVED_INIT); 1347 + ab8500_chargalg_state_to(di, STATE_BATT_REMOVED_INIT); 1348 1348 } 1349 1349 /* Main or USB charger not ok. */ 1350 1350 else if (di->events.mainextchnotok || di->events.usbchargernotok) { ··· 1354 1354 */ 1355 1355 if (di->charge_state != STATE_CHG_NOT_OK && 1356 1356 !di->events.vbus_collapsed) 1357 - abx500_chargalg_state_to(di, STATE_CHG_NOT_OK_INIT); 1357 + ab8500_chargalg_state_to(di, STATE_CHG_NOT_OK_INIT); 1358 1358 } 1359 1359 /* VBUS, Main or VBAT OVV. */ 1360 1360 else if (di->events.vbus_ovv || ··· 1363 1363 !di->chg_info.usb_chg_ok || 1364 1364 !di->chg_info.ac_chg_ok) { 1365 1365 if (di->charge_state != STATE_OVV_PROTECT) 1366 - abx500_chargalg_state_to(di, STATE_OVV_PROTECT_INIT); 1366 + ab8500_chargalg_state_to(di, STATE_OVV_PROTECT_INIT); 1367 1367 } 1368 1368 /* USB Thermal, stop charging */ 1369 1369 else if (di->events.main_thermal_prot || 1370 1370 di->events.usb_thermal_prot) { 1371 1371 if (di->charge_state != STATE_HW_TEMP_PROTECT) 1372 - abx500_chargalg_state_to(di, 1372 + ab8500_chargalg_state_to(di, 1373 1373 STATE_HW_TEMP_PROTECT_INIT); 1374 1374 } 1375 1375 /* Battery temp over/under */ 1376 1376 else if (di->events.btemp_underover) { 1377 1377 if (di->charge_state != STATE_TEMP_UNDEROVER) 1378 - abx500_chargalg_state_to(di, 1378 + ab8500_chargalg_state_to(di, 1379 1379 STATE_TEMP_UNDEROVER_INIT); 1380 1380 } 1381 1381 /* Watchdog expired */ 1382 1382 else if (di->events.ac_wd_expired || 1383 1383 di->events.usb_wd_expired) { 1384 1384 if (di->charge_state != STATE_WD_EXPIRED) 1385 - abx500_chargalg_state_to(di, STATE_WD_EXPIRED_INIT); 1385 + ab8500_chargalg_state_to(di, STATE_WD_EXPIRED_INIT); 1386 1386 } 1387 1387 /* Battery temp high/low */ 1388 1388 else if (di->events.btemp_lowhigh) { 1389 1389 if (di->charge_state != STATE_TEMP_LOWHIGH) 1390 - abx500_chargalg_state_to(di, STATE_TEMP_LOWHIGH_INIT); 1390 + ab8500_chargalg_state_to(di, STATE_TEMP_LOWHIGH_INIT); 1391 1391 } 1392 1392 1393 1393 dev_dbg(di->dev, ··· 1419 1419 1420 1420 switch (di->charge_state) { 1421 1421 case STATE_HANDHELD_INIT: 1422 - abx500_chargalg_stop_charging(di); 1422 + ab8500_chargalg_stop_charging(di); 1423 1423 di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING; 1424 - abx500_chargalg_state_to(di, STATE_HANDHELD); 1424 + ab8500_chargalg_state_to(di, STATE_HANDHELD); 1425 1425 fallthrough; 1426 1426 1427 1427 case STATE_HANDHELD: ··· 1429 1429 1430 1430 case STATE_SUSPENDED_INIT: 1431 1431 if (di->susp_status.ac_suspended) 1432 - abx500_chargalg_ac_en(di, false, 0, 0); 1432 + ab8500_chargalg_ac_en(di, false, 0, 0); 1433 1433 if (di->susp_status.usb_suspended) 1434 - abx500_chargalg_usb_en(di, false, 0, 0); 1435 - abx500_chargalg_stop_safety_timer(di); 1436 - abx500_chargalg_stop_maintenance_timer(di); 1434 + ab8500_chargalg_usb_en(di, false, 0, 0); 1435 + ab8500_chargalg_stop_safety_timer(di); 1436 + ab8500_chargalg_stop_maintenance_timer(di); 1437 1437 di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING; 1438 1438 di->maintenance_chg = false; 1439 - abx500_chargalg_state_to(di, STATE_SUSPENDED); 1439 + ab8500_chargalg_state_to(di, STATE_SUSPENDED); 1440 1440 power_supply_changed(di->chargalg_psy); 1441 1441 fallthrough; 1442 1442 ··· 1445 1445 break; 1446 1446 1447 1447 case STATE_BATT_REMOVED_INIT: 1448 - abx500_chargalg_stop_charging(di); 1449 - abx500_chargalg_state_to(di, STATE_BATT_REMOVED); 1448 + ab8500_chargalg_stop_charging(di); 1449 + ab8500_chargalg_state_to(di, STATE_BATT_REMOVED); 1450 1450 fallthrough; 1451 1451 1452 1452 case STATE_BATT_REMOVED: 1453 1453 if (!di->events.batt_rem) 1454 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1454 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1455 1455 break; 1456 1456 1457 1457 case STATE_HW_TEMP_PROTECT_INIT: 1458 - abx500_chargalg_stop_charging(di); 1459 - abx500_chargalg_state_to(di, STATE_HW_TEMP_PROTECT); 1458 + ab8500_chargalg_stop_charging(di); 1459 + ab8500_chargalg_state_to(di, STATE_HW_TEMP_PROTECT); 1460 1460 fallthrough; 1461 1461 1462 1462 case STATE_HW_TEMP_PROTECT: 1463 1463 if (!di->events.main_thermal_prot && 1464 1464 !di->events.usb_thermal_prot) 1465 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1465 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1466 1466 break; 1467 1467 1468 1468 case STATE_OVV_PROTECT_INIT: 1469 - abx500_chargalg_stop_charging(di); 1470 - abx500_chargalg_state_to(di, STATE_OVV_PROTECT); 1469 + ab8500_chargalg_stop_charging(di); 1470 + ab8500_chargalg_state_to(di, STATE_OVV_PROTECT); 1471 1471 fallthrough; 1472 1472 1473 1473 case STATE_OVV_PROTECT: ··· 1476 1476 !di->events.batt_ovv && 1477 1477 di->chg_info.usb_chg_ok && 1478 1478 di->chg_info.ac_chg_ok) 1479 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1479 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1480 1480 break; 1481 1481 1482 1482 case STATE_CHG_NOT_OK_INIT: 1483 - abx500_chargalg_stop_charging(di); 1484 - abx500_chargalg_state_to(di, STATE_CHG_NOT_OK); 1483 + ab8500_chargalg_stop_charging(di); 1484 + ab8500_chargalg_state_to(di, STATE_CHG_NOT_OK); 1485 1485 fallthrough; 1486 1486 1487 1487 case STATE_CHG_NOT_OK: 1488 1488 if (!di->events.mainextchnotok && 1489 1489 !di->events.usbchargernotok) 1490 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1490 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1491 1491 break; 1492 1492 1493 1493 case STATE_SAFETY_TIMER_EXPIRED_INIT: 1494 - abx500_chargalg_stop_charging(di); 1495 - abx500_chargalg_state_to(di, STATE_SAFETY_TIMER_EXPIRED); 1494 + ab8500_chargalg_stop_charging(di); 1495 + ab8500_chargalg_state_to(di, STATE_SAFETY_TIMER_EXPIRED); 1496 1496 fallthrough; 1497 1497 1498 1498 case STATE_SAFETY_TIMER_EXPIRED: ··· 1501 1501 1502 1502 case STATE_NORMAL_INIT: 1503 1503 if (di->curr_status.curr_step == CHARGALG_CURR_STEP_LOW) 1504 - abx500_chargalg_stop_charging(di); 1504 + ab8500_chargalg_stop_charging(di); 1505 1505 else { 1506 1506 curr_step_lvl = di->bm->bat_type[ 1507 1507 di->bm->batt_id].normal_cur_lvl 1508 1508 * di->curr_status.curr_step 1509 1509 / CHARGALG_CURR_STEP_HIGH; 1510 - abx500_chargalg_start_charging(di, 1510 + ab8500_chargalg_start_charging(di, 1511 1511 di->bm->bat_type[di->bm->batt_id] 1512 1512 .normal_vol_lvl, curr_step_lvl); 1513 1513 } 1514 1514 1515 - abx500_chargalg_state_to(di, STATE_NORMAL); 1516 - abx500_chargalg_start_safety_timer(di); 1517 - abx500_chargalg_stop_maintenance_timer(di); 1515 + ab8500_chargalg_state_to(di, STATE_NORMAL); 1516 + ab8500_chargalg_start_safety_timer(di); 1517 + ab8500_chargalg_stop_maintenance_timer(di); 1518 1518 init_maxim_chg_curr(di); 1519 1519 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; 1520 1520 di->eoc_cnt = 0; ··· 1528 1528 if (di->charge_status == POWER_SUPPLY_STATUS_FULL && 1529 1529 di->maintenance_chg) { 1530 1530 if (di->bm->no_maintenance) 1531 - abx500_chargalg_state_to(di, 1531 + ab8500_chargalg_state_to(di, 1532 1532 STATE_WAIT_FOR_RECHARGE_INIT); 1533 1533 else 1534 - abx500_chargalg_state_to(di, 1534 + ab8500_chargalg_state_to(di, 1535 1535 STATE_MAINTENANCE_A_INIT); 1536 1536 } 1537 1537 break; 1538 1538 1539 1539 /* This state will be used when the maintenance state is disabled */ 1540 1540 case STATE_WAIT_FOR_RECHARGE_INIT: 1541 - abx500_chargalg_hold_charging(di); 1542 - abx500_chargalg_state_to(di, STATE_WAIT_FOR_RECHARGE); 1541 + ab8500_chargalg_hold_charging(di); 1542 + ab8500_chargalg_state_to(di, STATE_WAIT_FOR_RECHARGE); 1543 1543 fallthrough; 1544 1544 1545 1545 case STATE_WAIT_FOR_RECHARGE: 1546 1546 if (di->batt_data.percent <= 1547 - di->bm->bat_type[di->bm->batt_id]. 1548 - recharge_cap) 1549 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1547 + di->bm->bat_type[di->bm->batt_id].recharge_cap) 1548 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1550 1549 break; 1551 1550 1552 1551 case STATE_MAINTENANCE_A_INIT: 1553 - abx500_chargalg_stop_safety_timer(di); 1554 - abx500_chargalg_start_maintenance_timer(di, 1552 + ab8500_chargalg_stop_safety_timer(di); 1553 + ab8500_chargalg_start_maintenance_timer(di, 1555 1554 di->bm->bat_type[ 1556 1555 di->bm->batt_id].maint_a_chg_timer_h); 1557 - abx500_chargalg_start_charging(di, 1556 + ab8500_chargalg_start_charging(di, 1558 1557 di->bm->bat_type[ 1559 1558 di->bm->batt_id].maint_a_vol_lvl, 1560 1559 di->bm->bat_type[ 1561 1560 di->bm->batt_id].maint_a_cur_lvl); 1562 - abx500_chargalg_state_to(di, STATE_MAINTENANCE_A); 1561 + ab8500_chargalg_state_to(di, STATE_MAINTENANCE_A); 1563 1562 power_supply_changed(di->chargalg_psy); 1564 1563 fallthrough; 1565 1564 1566 1565 case STATE_MAINTENANCE_A: 1567 1566 if (di->events.maintenance_timer_expired) { 1568 - abx500_chargalg_stop_maintenance_timer(di); 1569 - abx500_chargalg_state_to(di, STATE_MAINTENANCE_B_INIT); 1567 + ab8500_chargalg_stop_maintenance_timer(di); 1568 + ab8500_chargalg_state_to(di, STATE_MAINTENANCE_B_INIT); 1570 1569 } 1571 1570 break; 1572 1571 1573 1572 case STATE_MAINTENANCE_B_INIT: 1574 - abx500_chargalg_start_maintenance_timer(di, 1573 + ab8500_chargalg_start_maintenance_timer(di, 1575 1574 di->bm->bat_type[ 1576 1575 di->bm->batt_id].maint_b_chg_timer_h); 1577 - abx500_chargalg_start_charging(di, 1576 + ab8500_chargalg_start_charging(di, 1578 1577 di->bm->bat_type[ 1579 1578 di->bm->batt_id].maint_b_vol_lvl, 1580 1579 di->bm->bat_type[ 1581 1580 di->bm->batt_id].maint_b_cur_lvl); 1582 - abx500_chargalg_state_to(di, STATE_MAINTENANCE_B); 1581 + ab8500_chargalg_state_to(di, STATE_MAINTENANCE_B); 1583 1582 power_supply_changed(di->chargalg_psy); 1584 1583 fallthrough; 1585 1584 1586 1585 case STATE_MAINTENANCE_B: 1587 1586 if (di->events.maintenance_timer_expired) { 1588 - abx500_chargalg_stop_maintenance_timer(di); 1589 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1587 + ab8500_chargalg_stop_maintenance_timer(di); 1588 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1590 1589 } 1591 1590 break; 1592 1591 1593 1592 case STATE_TEMP_LOWHIGH_INIT: 1594 - abx500_chargalg_start_charging(di, 1593 + ab8500_chargalg_start_charging(di, 1595 1594 di->bm->bat_type[ 1596 1595 di->bm->batt_id].low_high_vol_lvl, 1597 1596 di->bm->bat_type[ 1598 1597 di->bm->batt_id].low_high_cur_lvl); 1599 - abx500_chargalg_stop_maintenance_timer(di); 1598 + ab8500_chargalg_stop_maintenance_timer(di); 1600 1599 di->charge_status = POWER_SUPPLY_STATUS_CHARGING; 1601 - abx500_chargalg_state_to(di, STATE_TEMP_LOWHIGH); 1600 + ab8500_chargalg_state_to(di, STATE_TEMP_LOWHIGH); 1602 1601 power_supply_changed(di->chargalg_psy); 1603 1602 fallthrough; 1604 1603 1605 1604 case STATE_TEMP_LOWHIGH: 1606 1605 if (!di->events.btemp_lowhigh) 1607 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1606 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1608 1607 break; 1609 1608 1610 1609 case STATE_WD_EXPIRED_INIT: 1611 - abx500_chargalg_stop_charging(di); 1612 - abx500_chargalg_state_to(di, STATE_WD_EXPIRED); 1610 + ab8500_chargalg_stop_charging(di); 1611 + ab8500_chargalg_state_to(di, STATE_WD_EXPIRED); 1613 1612 fallthrough; 1614 1613 1615 1614 case STATE_WD_EXPIRED: 1616 1615 if (!di->events.ac_wd_expired && 1617 1616 !di->events.usb_wd_expired) 1618 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1617 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1619 1618 break; 1620 1619 1621 1620 case STATE_TEMP_UNDEROVER_INIT: 1622 - abx500_chargalg_stop_charging(di); 1623 - abx500_chargalg_state_to(di, STATE_TEMP_UNDEROVER); 1621 + ab8500_chargalg_stop_charging(di); 1622 + ab8500_chargalg_state_to(di, STATE_TEMP_UNDEROVER); 1624 1623 fallthrough; 1625 1624 1626 1625 case STATE_TEMP_UNDEROVER: 1627 1626 if (!di->events.btemp_underover) 1628 - abx500_chargalg_state_to(di, STATE_NORMAL_INIT); 1627 + ab8500_chargalg_state_to(di, STATE_NORMAL_INIT); 1629 1628 break; 1630 1629 } 1631 1630 ··· 1636 1637 } 1637 1638 1638 1639 /** 1639 - * abx500_chargalg_periodic_work() - Periodic work for the algorithm 1640 + * ab8500_chargalg_periodic_work() - Periodic work for the algorithm 1640 1641 * @work: pointer to the work_struct structure 1641 1642 * 1642 1643 * Work queue function for the charging algorithm 1643 1644 */ 1644 - static void abx500_chargalg_periodic_work(struct work_struct *work) 1645 + static void ab8500_chargalg_periodic_work(struct work_struct *work) 1645 1646 { 1646 - struct abx500_chargalg *di = container_of(work, 1647 - struct abx500_chargalg, chargalg_periodic_work.work); 1647 + struct ab8500_chargalg *di = container_of(work, 1648 + struct ab8500_chargalg, chargalg_periodic_work.work); 1648 1649 1649 - abx500_chargalg_algorithm(di); 1650 + ab8500_chargalg_algorithm(di); 1650 1651 1651 1652 /* 1652 1653 * If a charger is connected then the battery has to be monitored ··· 1663 1664 } 1664 1665 1665 1666 /** 1666 - * abx500_chargalg_wd_work() - periodic work to kick the charger watchdog 1667 + * ab8500_chargalg_wd_work() - periodic work to kick the charger watchdog 1667 1668 * @work: pointer to the work_struct structure 1668 1669 * 1669 1670 * Work queue function for kicking the charger watchdog 1670 1671 */ 1671 - static void abx500_chargalg_wd_work(struct work_struct *work) 1672 + static void ab8500_chargalg_wd_work(struct work_struct *work) 1672 1673 { 1673 1674 int ret; 1674 - struct abx500_chargalg *di = container_of(work, 1675 - struct abx500_chargalg, chargalg_wd_work.work); 1675 + struct ab8500_chargalg *di = container_of(work, 1676 + struct ab8500_chargalg, chargalg_wd_work.work); 1676 1677 1677 - dev_dbg(di->dev, "abx500_chargalg_wd_work\n"); 1678 - 1679 - ret = abx500_chargalg_kick_watchdog(di); 1678 + ret = ab8500_chargalg_kick_watchdog(di); 1680 1679 if (ret < 0) 1681 1680 dev_err(di->dev, "failed to kick watchdog\n"); 1682 1681 ··· 1683 1686 } 1684 1687 1685 1688 /** 1686 - * abx500_chargalg_work() - Work to run the charging algorithm instantly 1689 + * ab8500_chargalg_work() - Work to run the charging algorithm instantly 1687 1690 * @work: pointer to the work_struct structure 1688 1691 * 1689 1692 * Work queue function for calling the charging algorithm 1690 1693 */ 1691 - static void abx500_chargalg_work(struct work_struct *work) 1694 + static void ab8500_chargalg_work(struct work_struct *work) 1692 1695 { 1693 - struct abx500_chargalg *di = container_of(work, 1694 - struct abx500_chargalg, chargalg_work); 1696 + struct ab8500_chargalg *di = container_of(work, 1697 + struct ab8500_chargalg, chargalg_work); 1695 1698 1696 - abx500_chargalg_algorithm(di); 1699 + ab8500_chargalg_algorithm(di); 1697 1700 } 1698 1701 1699 1702 /** 1700 - * abx500_chargalg_get_property() - get the chargalg properties 1703 + * ab8500_chargalg_get_property() - get the chargalg properties 1701 1704 * @psy: pointer to the power_supply structure 1702 1705 * @psp: pointer to the power_supply_property structure 1703 1706 * @val: pointer to the power_supply_propval union ··· 1708 1711 * health: health of the battery 1709 1712 * Returns error code in case of failure else 0 on success 1710 1713 */ 1711 - static int abx500_chargalg_get_property(struct power_supply *psy, 1714 + static int ab8500_chargalg_get_property(struct power_supply *psy, 1712 1715 enum power_supply_property psp, 1713 1716 union power_supply_propval *val) 1714 1717 { 1715 - struct abx500_chargalg *di = power_supply_get_drvdata(psy); 1718 + struct ab8500_chargalg *di = power_supply_get_drvdata(psy); 1716 1719 1717 1720 switch (psp) { 1718 1721 case POWER_SUPPLY_PROP_STATUS: ··· 1741 1744 1742 1745 /* Exposure to the sysfs interface */ 1743 1746 1744 - static ssize_t abx500_chargalg_curr_step_show(struct abx500_chargalg *di, 1747 + static ssize_t ab8500_chargalg_curr_step_show(struct ab8500_chargalg *di, 1745 1748 char *buf) 1746 1749 { 1747 1750 return sprintf(buf, "%d\n", di->curr_status.curr_step); 1748 1751 } 1749 1752 1750 - static ssize_t abx500_chargalg_curr_step_store(struct abx500_chargalg *di, 1753 + static ssize_t ab8500_chargalg_curr_step_store(struct ab8500_chargalg *di, 1751 1754 const char *buf, size_t length) 1752 1755 { 1753 - long int param; 1756 + long param; 1754 1757 int ret; 1755 1758 1756 1759 ret = kstrtol(buf, 10, &param); ··· 1772 1775 } 1773 1776 1774 1777 1775 - static ssize_t abx500_chargalg_en_show(struct abx500_chargalg *di, 1778 + static ssize_t ab8500_chargalg_en_show(struct ab8500_chargalg *di, 1776 1779 char *buf) 1777 1780 { 1778 1781 return sprintf(buf, "%d\n", ··· 1780 1783 di->susp_status.usb_suspended); 1781 1784 } 1782 1785 1783 - static ssize_t abx500_chargalg_en_store(struct abx500_chargalg *di, 1786 + static ssize_t ab8500_chargalg_en_store(struct ab8500_chargalg *di, 1784 1787 const char *buf, size_t length) 1785 1788 { 1786 - long int param; 1789 + long param; 1787 1790 int ac_usb; 1788 1791 int ret; 1789 1792 ··· 1827 1830 return strlen(buf); 1828 1831 } 1829 1832 1830 - static struct abx500_chargalg_sysfs_entry abx500_chargalg_en_charger = 1831 - __ATTR(chargalg, 0644, abx500_chargalg_en_show, 1832 - abx500_chargalg_en_store); 1833 + static struct ab8500_chargalg_sysfs_entry ab8500_chargalg_en_charger = 1834 + __ATTR(chargalg, 0644, ab8500_chargalg_en_show, 1835 + ab8500_chargalg_en_store); 1833 1836 1834 - static struct abx500_chargalg_sysfs_entry abx500_chargalg_curr_step = 1835 - __ATTR(chargalg_curr_step, 0644, abx500_chargalg_curr_step_show, 1836 - abx500_chargalg_curr_step_store); 1837 + static struct ab8500_chargalg_sysfs_entry ab8500_chargalg_curr_step = 1838 + __ATTR(chargalg_curr_step, 0644, ab8500_chargalg_curr_step_show, 1839 + ab8500_chargalg_curr_step_store); 1837 1840 1838 - static ssize_t abx500_chargalg_sysfs_show(struct kobject *kobj, 1841 + static ssize_t ab8500_chargalg_sysfs_show(struct kobject *kobj, 1839 1842 struct attribute *attr, char *buf) 1840 1843 { 1841 - struct abx500_chargalg_sysfs_entry *entry = container_of(attr, 1842 - struct abx500_chargalg_sysfs_entry, attr); 1844 + struct ab8500_chargalg_sysfs_entry *entry = container_of(attr, 1845 + struct ab8500_chargalg_sysfs_entry, attr); 1843 1846 1844 - struct abx500_chargalg *di = container_of(kobj, 1845 - struct abx500_chargalg, chargalg_kobject); 1847 + struct ab8500_chargalg *di = container_of(kobj, 1848 + struct ab8500_chargalg, chargalg_kobject); 1846 1849 1847 1850 if (!entry->show) 1848 1851 return -EIO; ··· 1850 1853 return entry->show(di, buf); 1851 1854 } 1852 1855 1853 - static ssize_t abx500_chargalg_sysfs_charger(struct kobject *kobj, 1856 + static ssize_t ab8500_chargalg_sysfs_charger(struct kobject *kobj, 1854 1857 struct attribute *attr, const char *buf, size_t length) 1855 1858 { 1856 - struct abx500_chargalg_sysfs_entry *entry = container_of(attr, 1857 - struct abx500_chargalg_sysfs_entry, attr); 1859 + struct ab8500_chargalg_sysfs_entry *entry = container_of(attr, 1860 + struct ab8500_chargalg_sysfs_entry, attr); 1858 1861 1859 - struct abx500_chargalg *di = container_of(kobj, 1860 - struct abx500_chargalg, chargalg_kobject); 1862 + struct ab8500_chargalg *di = container_of(kobj, 1863 + struct ab8500_chargalg, chargalg_kobject); 1861 1864 1862 1865 if (!entry->store) 1863 1866 return -EIO; ··· 1865 1868 return entry->store(di, buf, length); 1866 1869 } 1867 1870 1868 - static struct attribute *abx500_chargalg_chg[] = { 1869 - &abx500_chargalg_en_charger.attr, 1870 - &abx500_chargalg_curr_step.attr, 1871 + static struct attribute *ab8500_chargalg_chg[] = { 1872 + &ab8500_chargalg_en_charger.attr, 1873 + &ab8500_chargalg_curr_step.attr, 1871 1874 NULL, 1872 1875 }; 1873 1876 1874 - static const struct sysfs_ops abx500_chargalg_sysfs_ops = { 1875 - .show = abx500_chargalg_sysfs_show, 1876 - .store = abx500_chargalg_sysfs_charger, 1877 + static const struct sysfs_ops ab8500_chargalg_sysfs_ops = { 1878 + .show = ab8500_chargalg_sysfs_show, 1879 + .store = ab8500_chargalg_sysfs_charger, 1877 1880 }; 1878 1881 1879 - static struct kobj_type abx500_chargalg_ktype = { 1880 - .sysfs_ops = &abx500_chargalg_sysfs_ops, 1881 - .default_attrs = abx500_chargalg_chg, 1882 + static struct kobj_type ab8500_chargalg_ktype = { 1883 + .sysfs_ops = &ab8500_chargalg_sysfs_ops, 1884 + .default_attrs = ab8500_chargalg_chg, 1882 1885 }; 1883 1886 1884 1887 /** 1885 - * abx500_chargalg_sysfs_exit() - de-init of sysfs entry 1886 - * @di: pointer to the struct abx500_chargalg 1888 + * ab8500_chargalg_sysfs_exit() - de-init of sysfs entry 1889 + * @di: pointer to the struct ab8500_chargalg 1887 1890 * 1888 1891 * This function removes the entry in sysfs. 1889 1892 */ 1890 - static void abx500_chargalg_sysfs_exit(struct abx500_chargalg *di) 1893 + static void ab8500_chargalg_sysfs_exit(struct ab8500_chargalg *di) 1891 1894 { 1892 1895 kobject_del(&di->chargalg_kobject); 1893 1896 } 1894 1897 1895 1898 /** 1896 - * abx500_chargalg_sysfs_init() - init of sysfs entry 1897 - * @di: pointer to the struct abx500_chargalg 1899 + * ab8500_chargalg_sysfs_init() - init of sysfs entry 1900 + * @di: pointer to the struct ab8500_chargalg 1898 1901 * 1899 1902 * This function adds an entry in sysfs. 1900 1903 * Returns error code in case of failure else 0(on success) 1901 1904 */ 1902 - static int abx500_chargalg_sysfs_init(struct abx500_chargalg *di) 1905 + static int ab8500_chargalg_sysfs_init(struct ab8500_chargalg *di) 1903 1906 { 1904 1907 int ret = 0; 1905 1908 1906 1909 ret = kobject_init_and_add(&di->chargalg_kobject, 1907 - &abx500_chargalg_ktype, 1908 - NULL, "abx500_chargalg"); 1910 + &ab8500_chargalg_ktype, 1911 + NULL, "ab8500_chargalg"); 1909 1912 if (ret < 0) 1910 1913 dev_err(di->dev, "failed to create sysfs entry\n"); 1911 1914 ··· 1913 1916 } 1914 1917 /* Exposure to the sysfs interface <<END>> */ 1915 1918 1916 - static int __maybe_unused abx500_chargalg_resume(struct device *dev) 1919 + static int __maybe_unused ab8500_chargalg_resume(struct device *dev) 1917 1920 { 1918 - struct abx500_chargalg *di = dev_get_drvdata(dev); 1921 + struct ab8500_chargalg *di = dev_get_drvdata(dev); 1919 1922 1920 1923 /* Kick charger watchdog if charging (any charger online) */ 1921 1924 if (di->chg_info.online_chg) ··· 1930 1933 return 0; 1931 1934 } 1932 1935 1933 - static int __maybe_unused abx500_chargalg_suspend(struct device *dev) 1936 + static int __maybe_unused ab8500_chargalg_suspend(struct device *dev) 1934 1937 { 1935 - struct abx500_chargalg *di = dev_get_drvdata(dev); 1938 + struct ab8500_chargalg *di = dev_get_drvdata(dev); 1936 1939 1937 1940 if (di->chg_info.online_chg) 1938 1941 cancel_delayed_work_sync(&di->chargalg_wd_work); ··· 1946 1949 "ab8500_fg", 1947 1950 }; 1948 1951 1949 - static const struct power_supply_desc abx500_chargalg_desc = { 1950 - .name = "abx500_chargalg", 1952 + static const struct power_supply_desc ab8500_chargalg_desc = { 1953 + .name = "ab8500_chargalg", 1951 1954 .type = POWER_SUPPLY_TYPE_BATTERY, 1952 - .properties = abx500_chargalg_props, 1953 - .num_properties = ARRAY_SIZE(abx500_chargalg_props), 1954 - .get_property = abx500_chargalg_get_property, 1955 - .external_power_changed = abx500_chargalg_external_power_changed, 1955 + .properties = ab8500_chargalg_props, 1956 + .num_properties = ARRAY_SIZE(ab8500_chargalg_props), 1957 + .get_property = ab8500_chargalg_get_property, 1958 + .external_power_changed = ab8500_chargalg_external_power_changed, 1956 1959 }; 1957 1960 1958 - static int abx500_chargalg_bind(struct device *dev, struct device *master, 1961 + static int ab8500_chargalg_bind(struct device *dev, struct device *master, 1959 1962 void *data) 1960 1963 { 1961 - struct abx500_chargalg *di = dev_get_drvdata(dev); 1964 + struct ab8500_chargalg *di = dev_get_drvdata(dev); 1962 1965 1963 1966 /* Create a work queue for the chargalg */ 1964 - di->chargalg_wq = alloc_ordered_workqueue("abx500_chargalg_wq", 1967 + di->chargalg_wq = alloc_ordered_workqueue("ab8500_chargalg_wq", 1965 1968 WQ_MEM_RECLAIM); 1966 1969 if (di->chargalg_wq == NULL) { 1967 1970 dev_err(di->dev, "failed to create work queue\n"); ··· 1974 1977 return 0; 1975 1978 } 1976 1979 1977 - static void abx500_chargalg_unbind(struct device *dev, struct device *master, 1980 + static void ab8500_chargalg_unbind(struct device *dev, struct device *master, 1978 1981 void *data) 1979 1982 { 1980 - struct abx500_chargalg *di = dev_get_drvdata(dev); 1983 + struct ab8500_chargalg *di = dev_get_drvdata(dev); 1981 1984 1982 1985 /* Stop all timers and work */ 1983 1986 hrtimer_cancel(&di->safety_timer); ··· 1992 1995 flush_scheduled_work(); 1993 1996 } 1994 1997 1995 - static const struct component_ops abx500_chargalg_component_ops = { 1996 - .bind = abx500_chargalg_bind, 1997 - .unbind = abx500_chargalg_unbind, 1998 + static const struct component_ops ab8500_chargalg_component_ops = { 1999 + .bind = ab8500_chargalg_bind, 2000 + .unbind = ab8500_chargalg_unbind, 1998 2001 }; 1999 2002 2000 - static int abx500_chargalg_probe(struct platform_device *pdev) 2003 + static int ab8500_chargalg_probe(struct platform_device *pdev) 2001 2004 { 2002 2005 struct device *dev = &pdev->dev; 2003 2006 struct power_supply_config psy_cfg = {}; 2004 - struct abx500_chargalg *di; 2007 + struct ab8500_chargalg *di; 2005 2008 int ret = 0; 2006 2009 2007 2010 di = devm_kzalloc(dev, sizeof(*di), GFP_KERNEL); ··· 2020 2023 2021 2024 /* Initilialize safety timer */ 2022 2025 hrtimer_init(&di->safety_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); 2023 - di->safety_timer.function = abx500_chargalg_safety_timer_expired; 2026 + di->safety_timer.function = ab8500_chargalg_safety_timer_expired; 2024 2027 2025 2028 /* Initilialize maintenance timer */ 2026 2029 hrtimer_init(&di->maintenance_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); 2027 2030 di->maintenance_timer.function = 2028 - abx500_chargalg_maintenance_timer_expired; 2031 + ab8500_chargalg_maintenance_timer_expired; 2029 2032 2030 2033 /* Init work for chargalg */ 2031 2034 INIT_DEFERRABLE_WORK(&di->chargalg_periodic_work, 2032 - abx500_chargalg_periodic_work); 2035 + ab8500_chargalg_periodic_work); 2033 2036 INIT_DEFERRABLE_WORK(&di->chargalg_wd_work, 2034 - abx500_chargalg_wd_work); 2037 + ab8500_chargalg_wd_work); 2035 2038 2036 2039 /* Init work for chargalg */ 2037 - INIT_WORK(&di->chargalg_work, abx500_chargalg_work); 2040 + INIT_WORK(&di->chargalg_work, ab8500_chargalg_work); 2038 2041 2039 2042 /* To detect charger at startup */ 2040 2043 di->chg_info.prev_conn_chg = -1; 2041 2044 2042 2045 /* Register chargalg power supply class */ 2043 2046 di->chargalg_psy = devm_power_supply_register(di->dev, 2044 - &abx500_chargalg_desc, 2047 + &ab8500_chargalg_desc, 2045 2048 &psy_cfg); 2046 2049 if (IS_ERR(di->chargalg_psy)) { 2047 2050 dev_err(di->dev, "failed to register chargalg psy\n"); ··· 2051 2054 platform_set_drvdata(pdev, di); 2052 2055 2053 2056 /* sysfs interface to enable/disable charging from user space */ 2054 - ret = abx500_chargalg_sysfs_init(di); 2057 + ret = ab8500_chargalg_sysfs_init(di); 2055 2058 if (ret) { 2056 2059 dev_err(di->dev, "failed to create sysfs entry\n"); 2057 2060 return ret; ··· 2059 2062 di->curr_status.curr_step = CHARGALG_CURR_STEP_HIGH; 2060 2063 2061 2064 dev_info(di->dev, "probe success\n"); 2062 - return component_add(dev, &abx500_chargalg_component_ops); 2065 + return component_add(dev, &ab8500_chargalg_component_ops); 2063 2066 } 2064 2067 2065 - static int abx500_chargalg_remove(struct platform_device *pdev) 2068 + static int ab8500_chargalg_remove(struct platform_device *pdev) 2066 2069 { 2067 - struct abx500_chargalg *di = platform_get_drvdata(pdev); 2070 + struct ab8500_chargalg *di = platform_get_drvdata(pdev); 2068 2071 2069 - component_del(&pdev->dev, &abx500_chargalg_component_ops); 2072 + component_del(&pdev->dev, &ab8500_chargalg_component_ops); 2070 2073 2071 2074 /* sysfs interface to enable/disable charging from user space */ 2072 - abx500_chargalg_sysfs_exit(di); 2075 + ab8500_chargalg_sysfs_exit(di); 2073 2076 2074 2077 return 0; 2075 2078 } 2076 2079 2077 - static SIMPLE_DEV_PM_OPS(abx500_chargalg_pm_ops, abx500_chargalg_suspend, abx500_chargalg_resume); 2080 + static SIMPLE_DEV_PM_OPS(ab8500_chargalg_pm_ops, ab8500_chargalg_suspend, ab8500_chargalg_resume); 2078 2081 2079 2082 static const struct of_device_id ab8500_chargalg_match[] = { 2080 2083 { .compatible = "stericsson,ab8500-chargalg", }, 2081 2084 { }, 2082 2085 }; 2083 2086 2084 - struct platform_driver abx500_chargalg_driver = { 2085 - .probe = abx500_chargalg_probe, 2086 - .remove = abx500_chargalg_remove, 2087 + struct platform_driver ab8500_chargalg_driver = { 2088 + .probe = ab8500_chargalg_probe, 2089 + .remove = ab8500_chargalg_remove, 2087 2090 .driver = { 2088 - .name = "ab8500-chargalg", 2091 + .name = "ab8500_chargalg", 2089 2092 .of_match_table = ab8500_chargalg_match, 2090 - .pm = &abx500_chargalg_pm_ops, 2093 + .pm = &ab8500_chargalg_pm_ops, 2091 2094 }, 2092 2095 }; 2093 2096 MODULE_LICENSE("GPL v2"); 2094 2097 MODULE_AUTHOR("Johan Palsson, Karl Komierowski"); 2095 - MODULE_ALIAS("platform:abx500-chargalg"); 2096 - MODULE_DESCRIPTION("abx500 battery charging algorithm"); 2098 + MODULE_ALIAS("platform:ab8500-chargalg"); 2099 + MODULE_DESCRIPTION("ab8500 battery charging algorithm");
+5 -6
drivers/power/supply/axp288_charger.c
··· 813 813 if (val == 0) 814 814 return -ENODEV; 815 815 816 - info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); 816 + info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); 817 817 if (!info) 818 818 return -ENOMEM; 819 819 ··· 823 823 824 824 info->cable.edev = extcon_get_extcon_dev(AXP288_EXTCON_DEV_NAME); 825 825 if (info->cable.edev == NULL) { 826 - dev_dbg(&pdev->dev, "%s is not ready, probe deferred\n", 826 + dev_dbg(dev, "%s is not ready, probe deferred\n", 827 827 AXP288_EXTCON_DEV_NAME); 828 828 return -EPROBE_DEFER; 829 829 } ··· 834 834 dev_dbg(dev, "EXTCON_USB_HOST is not ready, probe deferred\n"); 835 835 return -EPROBE_DEFER; 836 836 } 837 - dev_info(&pdev->dev, 838 - "Using " USB_HOST_EXTCON_HID " extcon for usb-id\n"); 837 + dev_info(dev, "Using " USB_HOST_EXTCON_HID " extcon for usb-id\n"); 839 838 } 840 839 841 840 platform_set_drvdata(pdev, info); ··· 873 874 INIT_WORK(&info->otg.work, axp288_charger_otg_evt_worker); 874 875 info->otg.id_nb.notifier_call = axp288_charger_handle_otg_evt; 875 876 if (info->otg.cable) { 876 - ret = devm_extcon_register_notifier(&pdev->dev, info->otg.cable, 877 + ret = devm_extcon_register_notifier(dev, info->otg.cable, 877 878 EXTCON_USB_HOST, &info->otg.id_nb); 878 879 if (ret) { 879 880 dev_err(dev, "failed to register EXTCON_USB_HOST notifier\n"); ··· 898 899 NULL, axp288_charger_irq_thread_handler, 899 900 IRQF_ONESHOT, info->pdev->name, info); 900 901 if (ret) { 901 - dev_err(&pdev->dev, "failed to request interrupt=%d\n", 902 + dev_err(dev, "failed to request interrupt=%d\n", 902 903 info->irq[i]); 903 904 return ret; 904 905 }
+187 -304
drivers/power/supply/axp288_fuel_gauge.c
··· 2 2 /* 3 3 * axp288_fuel_gauge.c - Xpower AXP288 PMIC Fuel Gauge Driver 4 4 * 5 - * Copyright (C) 2016-2017 Hans de Goede <hdegoede@redhat.com> 5 + * Copyright (C) 2020-2021 Andrejus Basovas <xxx@yyy.tld> 6 + * Copyright (C) 2016-2021 Hans de Goede <hdegoede@redhat.com> 6 7 * Copyright (C) 2014 Intel Corporation 7 8 * 8 9 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ··· 20 19 #include <linux/platform_device.h> 21 20 #include <linux/power_supply.h> 22 21 #include <linux/iio/consumer.h> 23 - #include <linux/debugfs.h> 24 - #include <linux/seq_file.h> 25 22 #include <asm/unaligned.h> 23 + #include <asm/iosf_mbi.h> 26 24 27 - #define PS_STAT_VBUS_TRIGGER (1 << 0) 28 - #define PS_STAT_BAT_CHRG_DIR (1 << 2) 29 - #define PS_STAT_VBAT_ABOVE_VHOLD (1 << 3) 30 - #define PS_STAT_VBUS_VALID (1 << 4) 31 - #define PS_STAT_VBUS_PRESENT (1 << 5) 25 + #define PS_STAT_VBUS_TRIGGER (1 << 0) 26 + #define PS_STAT_BAT_CHRG_DIR (1 << 2) 27 + #define PS_STAT_VBAT_ABOVE_VHOLD (1 << 3) 28 + #define PS_STAT_VBUS_VALID (1 << 4) 29 + #define PS_STAT_VBUS_PRESENT (1 << 5) 32 30 33 - #define CHRG_STAT_BAT_SAFE_MODE (1 << 3) 31 + #define CHRG_STAT_BAT_SAFE_MODE (1 << 3) 34 32 #define CHRG_STAT_BAT_VALID (1 << 4) 35 - #define CHRG_STAT_BAT_PRESENT (1 << 5) 33 + #define CHRG_STAT_BAT_PRESENT (1 << 5) 36 34 #define CHRG_STAT_CHARGING (1 << 6) 37 35 #define CHRG_STAT_PMIC_OTP (1 << 7) 38 36 39 37 #define CHRG_CCCV_CC_MASK 0xf /* 4 bits */ 40 - #define CHRG_CCCV_CC_BIT_POS 0 38 + #define CHRG_CCCV_CC_BIT_POS 0 41 39 #define CHRG_CCCV_CC_OFFSET 200 /* 200mA */ 42 - #define CHRG_CCCV_CC_LSB_RES 200 /* 200mA */ 40 + #define CHRG_CCCV_CC_LSB_RES 200 /* 200mA */ 43 41 #define CHRG_CCCV_ITERM_20P (1 << 4) /* 20% of CC */ 44 42 #define CHRG_CCCV_CV_MASK 0x60 /* 2 bits */ 45 - #define CHRG_CCCV_CV_BIT_POS 5 43 + #define CHRG_CCCV_CV_BIT_POS 5 46 44 #define CHRG_CCCV_CV_4100MV 0x0 /* 4.10V */ 47 45 #define CHRG_CCCV_CV_4150MV 0x1 /* 4.15V */ 48 46 #define CHRG_CCCV_CV_4200MV 0x2 /* 4.20V */ 49 47 #define CHRG_CCCV_CV_4350MV 0x3 /* 4.35V */ 50 48 #define CHRG_CCCV_CHG_EN (1 << 7) 51 49 52 - #define FG_CNTL_OCV_ADJ_STAT (1 << 2) 50 + #define FG_CNTL_OCV_ADJ_STAT (1 << 2) 53 51 #define FG_CNTL_OCV_ADJ_EN (1 << 3) 54 - #define FG_CNTL_CAP_ADJ_STAT (1 << 4) 52 + #define FG_CNTL_CAP_ADJ_STAT (1 << 4) 55 53 #define FG_CNTL_CAP_ADJ_EN (1 << 5) 56 54 #define FG_CNTL_CC_EN (1 << 6) 57 55 #define FG_CNTL_GAUGE_EN (1 << 7) ··· 71 71 #define FG_CC_CAP_VALID (1 << 7) 72 72 #define FG_CC_CAP_VAL_MASK 0x7F 73 73 74 - #define FG_LOW_CAP_THR1_MASK 0xf0 /* 5% tp 20% */ 74 + #define FG_LOW_CAP_THR1_MASK 0xf0 /* 5% tp 20% */ 75 75 #define FG_LOW_CAP_THR1_VAL 0xa0 /* 15 perc */ 76 - #define FG_LOW_CAP_THR2_MASK 0x0f /* 0% to 15% */ 76 + #define FG_LOW_CAP_THR2_MASK 0x0f /* 0% to 15% */ 77 77 #define FG_LOW_CAP_WARN_THR 14 /* 14 perc */ 78 78 #define FG_LOW_CAP_CRIT_THR 4 /* 4 perc */ 79 79 #define FG_LOW_CAP_SHDN_THR 0 /* 0 perc */ 80 80 81 - #define NR_RETRY_CNT 3 82 - #define DEV_NAME "axp288_fuel_gauge" 81 + #define DEV_NAME "axp288_fuel_gauge" 83 82 84 83 /* 1.1mV per LSB expressed in uV */ 85 84 #define VOLTAGE_FROM_ADC(a) ((a * 11) / 10) 86 85 /* properties converted to uV, uA */ 87 - #define PROP_VOLT(a) ((a) * 1000) 88 - #define PROP_CURR(a) ((a) * 1000) 86 + #define PROP_VOLT(a) ((a) * 1000) 87 + #define PROP_CURR(a) ((a) * 1000) 89 88 90 - #define AXP288_FG_INTR_NUM 6 89 + #define AXP288_REG_UPDATE_INTERVAL (60 * HZ) 90 + #define AXP288_FG_INTR_NUM 6 91 91 enum { 92 92 QWBTU_IRQ = 0, 93 93 WBTU_IRQ, ··· 98 98 }; 99 99 100 100 enum { 101 - BAT_TEMP = 0, 102 - PMIC_TEMP, 103 - SYSTEM_TEMP, 104 101 BAT_CHRG_CURR, 105 102 BAT_D_CURR, 106 103 BAT_VOLT, ··· 105 108 }; 106 109 107 110 struct axp288_fg_info { 108 - struct platform_device *pdev; 111 + struct device *dev; 109 112 struct regmap *regmap; 110 113 struct regmap_irq_chip_data *regmap_irqc; 111 114 int irq[AXP288_FG_INTR_NUM]; ··· 114 117 struct mutex lock; 115 118 int status; 116 119 int max_volt; 120 + int pwr_op; 121 + int low_cap; 117 122 struct dentry *debug_file; 123 + 124 + char valid; /* zero until following fields are valid */ 125 + unsigned long last_updated; /* in jiffies */ 126 + 127 + int pwr_stat; 128 + int fg_res; 129 + int bat_volt; 130 + int d_curr; 131 + int c_curr; 132 + int ocv; 133 + int fg_cc_mtr1; 134 + int fg_des_cap1; 118 135 }; 119 136 120 137 static enum power_supply_property fuel_gauge_props[] = { ··· 148 137 149 138 static int fuel_gauge_reg_readb(struct axp288_fg_info *info, int reg) 150 139 { 151 - int ret, i; 152 140 unsigned int val; 141 + int ret; 153 142 154 - for (i = 0; i < NR_RETRY_CNT; i++) { 155 - ret = regmap_read(info->regmap, reg, &val); 156 - if (ret != -EBUSY) 157 - break; 158 - } 159 - 143 + ret = regmap_read(info->regmap, reg, &val); 160 144 if (ret < 0) { 161 - dev_err(&info->pdev->dev, "axp288 reg read err:%d\n", ret); 145 + dev_err(info->dev, "Error reading reg 0x%02x err: %d\n", reg, ret); 162 146 return ret; 163 147 } 164 148 ··· 167 161 ret = regmap_write(info->regmap, reg, (unsigned int)val); 168 162 169 163 if (ret < 0) 170 - dev_err(&info->pdev->dev, "axp288 reg write err:%d\n", ret); 164 + dev_err(info->dev, "Error writing reg 0x%02x err: %d\n", reg, ret); 171 165 172 166 return ret; 173 167 } ··· 179 173 180 174 ret = regmap_bulk_read(info->regmap, reg, buf, 2); 181 175 if (ret < 0) { 182 - dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n", 183 - reg, ret); 176 + dev_err(info->dev, "Error reading reg 0x%02x err: %d\n", reg, ret); 184 177 return ret; 185 178 } 186 179 187 180 ret = get_unaligned_be16(buf); 188 181 if (!(ret & FG_15BIT_WORD_VALID)) { 189 - dev_err(&info->pdev->dev, "Error reg 0x%02x contents not valid\n", 190 - reg); 182 + dev_err(info->dev, "Error reg 0x%02x contents not valid\n", reg); 191 183 return -ENXIO; 192 184 } 193 185 ··· 199 195 200 196 ret = regmap_bulk_read(info->regmap, reg, buf, 2); 201 197 if (ret < 0) { 202 - dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n", 203 - reg, ret); 198 + dev_err(info->dev, "Error reading reg 0x%02x err: %d\n", reg, ret); 204 199 return ret; 205 200 } 206 201 ··· 207 204 return (buf[0] << 4) | ((buf[1] >> 4) & 0x0f); 208 205 } 209 206 210 - #ifdef CONFIG_DEBUG_FS 211 - static int fuel_gauge_debug_show(struct seq_file *s, void *data) 207 + static int fuel_gauge_update_registers(struct axp288_fg_info *info) 212 208 { 213 - struct axp288_fg_info *info = s->private; 214 - int raw_val, ret; 209 + int ret; 215 210 216 - seq_printf(s, " PWR_STATUS[%02x] : %02x\n", 217 - AXP20X_PWR_INPUT_STATUS, 218 - fuel_gauge_reg_readb(info, AXP20X_PWR_INPUT_STATUS)); 219 - seq_printf(s, "PWR_OP_MODE[%02x] : %02x\n", 220 - AXP20X_PWR_OP_MODE, 221 - fuel_gauge_reg_readb(info, AXP20X_PWR_OP_MODE)); 222 - seq_printf(s, " CHRG_CTRL1[%02x] : %02x\n", 223 - AXP20X_CHRG_CTRL1, 224 - fuel_gauge_reg_readb(info, AXP20X_CHRG_CTRL1)); 225 - seq_printf(s, " VLTF[%02x] : %02x\n", 226 - AXP20X_V_LTF_DISCHRG, 227 - fuel_gauge_reg_readb(info, AXP20X_V_LTF_DISCHRG)); 228 - seq_printf(s, " VHTF[%02x] : %02x\n", 229 - AXP20X_V_HTF_DISCHRG, 230 - fuel_gauge_reg_readb(info, AXP20X_V_HTF_DISCHRG)); 231 - seq_printf(s, " CC_CTRL[%02x] : %02x\n", 232 - AXP20X_CC_CTRL, 233 - fuel_gauge_reg_readb(info, AXP20X_CC_CTRL)); 234 - seq_printf(s, "BATTERY CAP[%02x] : %02x\n", 235 - AXP20X_FG_RES, 236 - fuel_gauge_reg_readb(info, AXP20X_FG_RES)); 237 - seq_printf(s, " FG_RDC1[%02x] : %02x\n", 238 - AXP288_FG_RDC1_REG, 239 - fuel_gauge_reg_readb(info, AXP288_FG_RDC1_REG)); 240 - seq_printf(s, " FG_RDC0[%02x] : %02x\n", 241 - AXP288_FG_RDC0_REG, 242 - fuel_gauge_reg_readb(info, AXP288_FG_RDC0_REG)); 243 - seq_printf(s, " FG_OCV[%02x] : %04x\n", 244 - AXP288_FG_OCVH_REG, 245 - fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG)); 246 - seq_printf(s, " FG_DES_CAP[%02x] : %04x\n", 247 - AXP288_FG_DES_CAP1_REG, 248 - fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG)); 249 - seq_printf(s, " FG_CC_MTR[%02x] : %04x\n", 250 - AXP288_FG_CC_MTR1_REG, 251 - fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG)); 252 - seq_printf(s, " FG_OCV_CAP[%02x] : %02x\n", 253 - AXP288_FG_OCV_CAP_REG, 254 - fuel_gauge_reg_readb(info, AXP288_FG_OCV_CAP_REG)); 255 - seq_printf(s, " FG_CC_CAP[%02x] : %02x\n", 256 - AXP288_FG_CC_CAP_REG, 257 - fuel_gauge_reg_readb(info, AXP288_FG_CC_CAP_REG)); 258 - seq_printf(s, " FG_LOW_CAP[%02x] : %02x\n", 259 - AXP288_FG_LOW_CAP_REG, 260 - fuel_gauge_reg_readb(info, AXP288_FG_LOW_CAP_REG)); 261 - seq_printf(s, "TUNING_CTL0[%02x] : %02x\n", 262 - AXP288_FG_TUNE0, 263 - fuel_gauge_reg_readb(info, AXP288_FG_TUNE0)); 264 - seq_printf(s, "TUNING_CTL1[%02x] : %02x\n", 265 - AXP288_FG_TUNE1, 266 - fuel_gauge_reg_readb(info, AXP288_FG_TUNE1)); 267 - seq_printf(s, "TUNING_CTL2[%02x] : %02x\n", 268 - AXP288_FG_TUNE2, 269 - fuel_gauge_reg_readb(info, AXP288_FG_TUNE2)); 270 - seq_printf(s, "TUNING_CTL3[%02x] : %02x\n", 271 - AXP288_FG_TUNE3, 272 - fuel_gauge_reg_readb(info, AXP288_FG_TUNE3)); 273 - seq_printf(s, "TUNING_CTL4[%02x] : %02x\n", 274 - AXP288_FG_TUNE4, 275 - fuel_gauge_reg_readb(info, AXP288_FG_TUNE4)); 276 - seq_printf(s, "TUNING_CTL5[%02x] : %02x\n", 277 - AXP288_FG_TUNE5, 278 - fuel_gauge_reg_readb(info, AXP288_FG_TUNE5)); 211 + if (info->valid && time_before(jiffies, info->last_updated + AXP288_REG_UPDATE_INTERVAL)) 212 + return 0; 279 213 280 - ret = iio_read_channel_raw(info->iio_channel[BAT_TEMP], &raw_val); 281 - if (ret >= 0) 282 - seq_printf(s, "axp288-batttemp : %d\n", raw_val); 283 - ret = iio_read_channel_raw(info->iio_channel[PMIC_TEMP], &raw_val); 284 - if (ret >= 0) 285 - seq_printf(s, "axp288-pmictemp : %d\n", raw_val); 286 - ret = iio_read_channel_raw(info->iio_channel[SYSTEM_TEMP], &raw_val); 287 - if (ret >= 0) 288 - seq_printf(s, "axp288-systtemp : %d\n", raw_val); 289 - ret = iio_read_channel_raw(info->iio_channel[BAT_CHRG_CURR], &raw_val); 290 - if (ret >= 0) 291 - seq_printf(s, "axp288-chrgcurr : %d\n", raw_val); 292 - ret = iio_read_channel_raw(info->iio_channel[BAT_D_CURR], &raw_val); 293 - if (ret >= 0) 294 - seq_printf(s, "axp288-dchrgcur : %d\n", raw_val); 295 - ret = iio_read_channel_raw(info->iio_channel[BAT_VOLT], &raw_val); 296 - if (ret >= 0) 297 - seq_printf(s, "axp288-battvolt : %d\n", raw_val); 214 + dev_dbg(info->dev, "Fuel Gauge updating register values...\n"); 298 215 299 - return 0; 216 + ret = iosf_mbi_block_punit_i2c_access(); 217 + if (ret < 0) 218 + return ret; 219 + 220 + ret = fuel_gauge_reg_readb(info, AXP20X_PWR_INPUT_STATUS); 221 + if (ret < 0) 222 + goto out; 223 + info->pwr_stat = ret; 224 + 225 + ret = fuel_gauge_reg_readb(info, AXP20X_FG_RES); 226 + if (ret < 0) 227 + goto out; 228 + info->fg_res = ret; 229 + 230 + ret = iio_read_channel_raw(info->iio_channel[BAT_VOLT], &info->bat_volt); 231 + if (ret < 0) 232 + goto out; 233 + 234 + if (info->pwr_stat & PS_STAT_BAT_CHRG_DIR) { 235 + info->d_curr = 0; 236 + ret = iio_read_channel_raw(info->iio_channel[BAT_CHRG_CURR], &info->c_curr); 237 + if (ret < 0) 238 + goto out; 239 + } else { 240 + info->c_curr = 0; 241 + ret = iio_read_channel_raw(info->iio_channel[BAT_D_CURR], &info->d_curr); 242 + if (ret < 0) 243 + goto out; 244 + } 245 + 246 + ret = fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG); 247 + if (ret < 0) 248 + goto out; 249 + info->ocv = ret; 250 + 251 + ret = fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG); 252 + if (ret < 0) 253 + goto out; 254 + info->fg_cc_mtr1 = ret; 255 + 256 + ret = fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG); 257 + if (ret < 0) 258 + goto out; 259 + info->fg_des_cap1 = ret; 260 + 261 + info->last_updated = jiffies; 262 + info->valid = 1; 263 + ret = 0; 264 + out: 265 + iosf_mbi_unblock_punit_i2c_access(); 266 + return ret; 300 267 } 301 - 302 - DEFINE_SHOW_ATTRIBUTE(fuel_gauge_debug); 303 - 304 - static void fuel_gauge_create_debugfs(struct axp288_fg_info *info) 305 - { 306 - info->debug_file = debugfs_create_file("fuelgauge", 0666, NULL, 307 - info, &fuel_gauge_debug_fops); 308 - } 309 - 310 - static void fuel_gauge_remove_debugfs(struct axp288_fg_info *info) 311 - { 312 - debugfs_remove(info->debug_file); 313 - } 314 - #else 315 - static inline void fuel_gauge_create_debugfs(struct axp288_fg_info *info) 316 - { 317 - } 318 - static inline void fuel_gauge_remove_debugfs(struct axp288_fg_info *info) 319 - { 320 - } 321 - #endif 322 268 323 269 static void fuel_gauge_get_status(struct axp288_fg_info *info) 324 270 { 325 - int pwr_stat, fg_res, curr, ret; 326 - 327 - pwr_stat = fuel_gauge_reg_readb(info, AXP20X_PWR_INPUT_STATUS); 328 - if (pwr_stat < 0) { 329 - dev_err(&info->pdev->dev, 330 - "PWR STAT read failed:%d\n", pwr_stat); 331 - return; 332 - } 271 + int pwr_stat = info->pwr_stat; 272 + int fg_res = info->fg_res; 273 + int curr = info->d_curr; 333 274 334 275 /* Report full if Vbus is valid and the reported capacity is 100% */ 335 276 if (!(pwr_stat & PS_STAT_VBUS_VALID)) 336 277 goto not_full; 337 278 338 - fg_res = fuel_gauge_reg_readb(info, AXP20X_FG_RES); 339 - if (fg_res < 0) { 340 - dev_err(&info->pdev->dev, "FG RES read failed: %d\n", fg_res); 341 - return; 342 - } 343 279 if (!(fg_res & FG_REP_CAP_VALID)) 344 280 goto not_full; 345 281 ··· 296 354 if (fg_res < 90 || (pwr_stat & PS_STAT_BAT_CHRG_DIR)) 297 355 goto not_full; 298 356 299 - ret = iio_read_channel_raw(info->iio_channel[BAT_D_CURR], &curr); 300 - if (ret < 0) { 301 - dev_err(&info->pdev->dev, "FG get current failed: %d\n", ret); 302 - return; 303 - } 304 357 if (curr == 0) { 305 358 info->status = POWER_SUPPLY_STATUS_FULL; 306 359 return; ··· 308 371 info->status = POWER_SUPPLY_STATUS_DISCHARGING; 309 372 } 310 373 311 - static int fuel_gauge_get_vbatt(struct axp288_fg_info *info, int *vbatt) 312 - { 313 - int ret = 0, raw_val; 314 - 315 - ret = iio_read_channel_raw(info->iio_channel[BAT_VOLT], &raw_val); 316 - if (ret < 0) 317 - goto vbatt_read_fail; 318 - 319 - *vbatt = VOLTAGE_FROM_ADC(raw_val); 320 - vbatt_read_fail: 321 - return ret; 322 - } 323 - 324 - static int fuel_gauge_get_current(struct axp288_fg_info *info, int *cur) 325 - { 326 - int ret, discharge; 327 - 328 - /* First check discharge current, so that we do only 1 read on bat. */ 329 - ret = iio_read_channel_raw(info->iio_channel[BAT_D_CURR], &discharge); 330 - if (ret < 0) 331 - return ret; 332 - 333 - if (discharge > 0) { 334 - *cur = -1 * discharge; 335 - return 0; 336 - } 337 - 338 - return iio_read_channel_raw(info->iio_channel[BAT_CHRG_CURR], cur); 339 - } 340 - 341 - static int fuel_gauge_get_vocv(struct axp288_fg_info *info, int *vocv) 342 - { 343 - int ret; 344 - 345 - ret = fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG); 346 - if (ret >= 0) 347 - *vocv = VOLTAGE_FROM_ADC(ret); 348 - 349 - return ret; 350 - } 351 - 352 374 static int fuel_gauge_battery_health(struct axp288_fg_info *info) 353 375 { 354 - int ret, vocv, health = POWER_SUPPLY_HEALTH_UNKNOWN; 355 - 356 - ret = fuel_gauge_get_vocv(info, &vocv); 357 - if (ret < 0) 358 - goto health_read_fail; 376 + int vocv = VOLTAGE_FROM_ADC(info->ocv); 377 + int health = POWER_SUPPLY_HEALTH_UNKNOWN; 359 378 360 379 if (vocv > info->max_volt) 361 380 health = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 362 381 else 363 382 health = POWER_SUPPLY_HEALTH_GOOD; 364 383 365 - health_read_fail: 366 384 return health; 367 385 } 368 386 ··· 326 434 union power_supply_propval *val) 327 435 { 328 436 struct axp288_fg_info *info = power_supply_get_drvdata(ps); 329 - int ret = 0, value; 437 + int ret, value; 330 438 331 439 mutex_lock(&info->lock); 440 + 441 + ret = fuel_gauge_update_registers(info); 442 + if (ret < 0) 443 + goto out; 444 + 332 445 switch (prop) { 333 446 case POWER_SUPPLY_PROP_STATUS: 334 447 fuel_gauge_get_status(info); ··· 343 446 val->intval = fuel_gauge_battery_health(info); 344 447 break; 345 448 case POWER_SUPPLY_PROP_VOLTAGE_NOW: 346 - ret = fuel_gauge_get_vbatt(info, &value); 347 - if (ret < 0) 348 - goto fuel_gauge_read_err; 449 + value = VOLTAGE_FROM_ADC(info->bat_volt); 349 450 val->intval = PROP_VOLT(value); 350 451 break; 351 452 case POWER_SUPPLY_PROP_VOLTAGE_OCV: 352 - ret = fuel_gauge_get_vocv(info, &value); 353 - if (ret < 0) 354 - goto fuel_gauge_read_err; 453 + value = VOLTAGE_FROM_ADC(info->ocv); 355 454 val->intval = PROP_VOLT(value); 356 455 break; 357 456 case POWER_SUPPLY_PROP_CURRENT_NOW: 358 - ret = fuel_gauge_get_current(info, &value); 359 - if (ret < 0) 360 - goto fuel_gauge_read_err; 457 + if (info->d_curr > 0) 458 + value = -1 * info->d_curr; 459 + else 460 + value = info->c_curr; 461 + 361 462 val->intval = PROP_CURR(value); 362 463 break; 363 464 case POWER_SUPPLY_PROP_PRESENT: 364 - ret = fuel_gauge_reg_readb(info, AXP20X_PWR_OP_MODE); 365 - if (ret < 0) 366 - goto fuel_gauge_read_err; 367 - 368 - if (ret & CHRG_STAT_BAT_PRESENT) 465 + if (info->pwr_op & CHRG_STAT_BAT_PRESENT) 369 466 val->intval = 1; 370 467 else 371 468 val->intval = 0; 372 469 break; 373 470 case POWER_SUPPLY_PROP_CAPACITY: 374 - ret = fuel_gauge_reg_readb(info, AXP20X_FG_RES); 375 - if (ret < 0) 376 - goto fuel_gauge_read_err; 377 - 378 - if (!(ret & FG_REP_CAP_VALID)) 379 - dev_err(&info->pdev->dev, 380 - "capacity measurement not valid\n"); 381 - val->intval = (ret & FG_REP_CAP_VAL_MASK); 471 + if (!(info->fg_res & FG_REP_CAP_VALID)) 472 + dev_err(info->dev, "capacity measurement not valid\n"); 473 + val->intval = (info->fg_res & FG_REP_CAP_VAL_MASK); 382 474 break; 383 475 case POWER_SUPPLY_PROP_CAPACITY_ALERT_MIN: 384 - ret = fuel_gauge_reg_readb(info, AXP288_FG_LOW_CAP_REG); 385 - if (ret < 0) 386 - goto fuel_gauge_read_err; 387 - val->intval = (ret & 0x0f); 476 + val->intval = (info->low_cap & 0x0f); 388 477 break; 389 478 case POWER_SUPPLY_PROP_TECHNOLOGY: 390 479 val->intval = POWER_SUPPLY_TECHNOLOGY_LION; 391 480 break; 392 481 case POWER_SUPPLY_PROP_CHARGE_NOW: 393 - ret = fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG); 394 - if (ret < 0) 395 - goto fuel_gauge_read_err; 396 - 397 - val->intval = ret * FG_DES_CAP_RES_LSB; 482 + val->intval = info->fg_cc_mtr1 * FG_DES_CAP_RES_LSB; 398 483 break; 399 484 case POWER_SUPPLY_PROP_CHARGE_FULL: 400 - ret = fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG); 401 - if (ret < 0) 402 - goto fuel_gauge_read_err; 403 - 404 - val->intval = ret * FG_DES_CAP_RES_LSB; 485 + val->intval = info->fg_des_cap1 * FG_DES_CAP_RES_LSB; 405 486 break; 406 487 case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: 407 488 val->intval = PROP_VOLT(info->max_volt); 408 489 break; 409 490 default: 410 - mutex_unlock(&info->lock); 411 - return -EINVAL; 491 + ret = -EINVAL; 412 492 } 413 493 414 - mutex_unlock(&info->lock); 415 - return 0; 416 - 417 - fuel_gauge_read_err: 494 + out: 418 495 mutex_unlock(&info->lock); 419 496 return ret; 420 497 } ··· 398 527 const union power_supply_propval *val) 399 528 { 400 529 struct axp288_fg_info *info = power_supply_get_drvdata(ps); 401 - int ret = 0; 530 + int new_low_cap, ret = 0; 402 531 403 532 mutex_lock(&info->lock); 404 533 switch (prop) { ··· 407 536 ret = -EINVAL; 408 537 break; 409 538 } 410 - ret = fuel_gauge_reg_readb(info, AXP288_FG_LOW_CAP_REG); 411 - if (ret < 0) 412 - break; 413 - ret &= 0xf0; 414 - ret |= (val->intval & 0xf); 415 - ret = fuel_gauge_reg_writeb(info, AXP288_FG_LOW_CAP_REG, ret); 539 + new_low_cap = info->low_cap; 540 + new_low_cap &= 0xf0; 541 + new_low_cap |= (val->intval & 0xf); 542 + ret = fuel_gauge_reg_writeb(info, AXP288_FG_LOW_CAP_REG, new_low_cap); 543 + if (ret == 0) 544 + info->low_cap = new_low_cap; 416 545 break; 417 546 default: 418 547 ret = -EINVAL; ··· 450 579 } 451 580 452 581 if (i >= AXP288_FG_INTR_NUM) { 453 - dev_warn(&info->pdev->dev, "spurious interrupt!!\n"); 582 + dev_warn(info->dev, "spurious interrupt!!\n"); 454 583 return IRQ_NONE; 455 584 } 456 585 457 586 switch (i) { 458 587 case QWBTU_IRQ: 459 - dev_info(&info->pdev->dev, 460 - "Quit Battery under temperature in work mode IRQ (QWBTU)\n"); 588 + dev_info(info->dev, "Quit Battery under temperature in work mode IRQ (QWBTU)\n"); 461 589 break; 462 590 case WBTU_IRQ: 463 - dev_info(&info->pdev->dev, 464 - "Battery under temperature in work mode IRQ (WBTU)\n"); 591 + dev_info(info->dev, "Battery under temperature in work mode IRQ (WBTU)\n"); 465 592 break; 466 593 case QWBTO_IRQ: 467 - dev_info(&info->pdev->dev, 468 - "Quit Battery over temperature in work mode IRQ (QWBTO)\n"); 594 + dev_info(info->dev, "Quit Battery over temperature in work mode IRQ (QWBTO)\n"); 469 595 break; 470 596 case WBTO_IRQ: 471 - dev_info(&info->pdev->dev, 472 - "Battery over temperature in work mode IRQ (WBTO)\n"); 597 + dev_info(info->dev, "Battery over temperature in work mode IRQ (WBTO)\n"); 473 598 break; 474 599 case WL2_IRQ: 475 - dev_info(&info->pdev->dev, "Low Batt Warning(2) INTR\n"); 600 + dev_info(info->dev, "Low Batt Warning(2) INTR\n"); 476 601 break; 477 602 case WL1_IRQ: 478 - dev_info(&info->pdev->dev, "Low Batt Warning(1) INTR\n"); 603 + dev_info(info->dev, "Low Batt Warning(1) INTR\n"); 479 604 break; 480 605 default: 481 - dev_warn(&info->pdev->dev, "Spurious Interrupt!!!\n"); 606 + dev_warn(info->dev, "Spurious Interrupt!!!\n"); 482 607 } 608 + 609 + info->valid = 0; /* Force updating of the cached registers */ 483 610 484 611 power_supply_changed(info->bat); 485 612 return IRQ_HANDLED; ··· 487 618 { 488 619 struct axp288_fg_info *info = power_supply_get_drvdata(psy); 489 620 621 + info->valid = 0; /* Force updating of the cached registers */ 490 622 power_supply_changed(info->bat); 491 623 } 492 624 ··· 502 632 .external_power_changed = fuel_gauge_external_power_changed, 503 633 }; 504 634 505 - static void fuel_gauge_init_irq(struct axp288_fg_info *info) 635 + static void fuel_gauge_init_irq(struct axp288_fg_info *info, struct platform_device *pdev) 506 636 { 507 637 int ret, i, pirq; 508 638 509 639 for (i = 0; i < AXP288_FG_INTR_NUM; i++) { 510 - pirq = platform_get_irq(info->pdev, i); 640 + pirq = platform_get_irq(pdev, i); 511 641 info->irq[i] = regmap_irq_get_virq(info->regmap_irqc, pirq); 512 642 if (info->irq[i] < 0) { 513 - dev_warn(&info->pdev->dev, 514 - "regmap_irq get virq failed for IRQ %d: %d\n", 643 + dev_warn(info->dev, "regmap_irq get virq failed for IRQ %d: %d\n", 515 644 pirq, info->irq[i]); 516 645 info->irq[i] = -1; 517 646 goto intr_failed; ··· 519 650 NULL, fuel_gauge_thread_handler, 520 651 IRQF_ONESHOT, DEV_NAME, info); 521 652 if (ret) { 522 - dev_warn(&info->pdev->dev, 523 - "request irq failed for IRQ %d: %d\n", 653 + dev_warn(info->dev, "request irq failed for IRQ %d: %d\n", 524 654 pirq, info->irq[i]); 525 655 info->irq[i] = -1; 526 656 goto intr_failed; 527 - } else { 528 - dev_info(&info->pdev->dev, "HW IRQ %d -> VIRQ %d\n", 529 - pirq, info->irq[i]); 530 657 } 531 658 } 532 659 return; ··· 618 753 struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); 619 754 struct power_supply_config psy_cfg = {}; 620 755 static const char * const iio_chan_name[] = { 621 - [BAT_TEMP] = "axp288-batt-temp", 622 - [PMIC_TEMP] = "axp288-pmic-temp", 623 - [SYSTEM_TEMP] = "axp288-system-temp", 624 756 [BAT_CHRG_CURR] = "axp288-chrg-curr", 625 757 [BAT_D_CURR] = "axp288-chrg-d-curr", 626 758 [BAT_VOLT] = "axp288-batt-volt", ··· 627 765 if (dmi_check_system(axp288_no_battery_list)) 628 766 return -ENODEV; 629 767 630 - /* 631 - * On some devices the fuelgauge and charger parts of the axp288 are 632 - * not used, check that the fuelgauge is enabled (CC_CTRL != 0). 633 - */ 634 - ret = regmap_read(axp20x->regmap, AXP20X_CC_CTRL, &val); 635 - if (ret < 0) 636 - return ret; 637 - if (val == 0) 638 - return -ENODEV; 639 - 640 768 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); 641 769 if (!info) 642 770 return -ENOMEM; 643 771 644 - info->pdev = pdev; 772 + info->dev = &pdev->dev; 645 773 info->regmap = axp20x->regmap; 646 774 info->regmap_irqc = axp20x->regmap_irqc; 647 775 info->status = POWER_SUPPLY_STATUS_UNKNOWN; 776 + info->valid = 0; 648 777 649 778 platform_set_drvdata(pdev, info); 650 779 ··· 661 808 } 662 809 } 663 810 664 - ret = fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP1_REG); 811 + ret = iosf_mbi_block_punit_i2c_access(); 665 812 if (ret < 0) 666 813 goto out_free_iio_chan; 814 + 815 + /* 816 + * On some devices the fuelgauge and charger parts of the axp288 are 817 + * not used, check that the fuelgauge is enabled (CC_CTRL != 0). 818 + */ 819 + ret = regmap_read(axp20x->regmap, AXP20X_CC_CTRL, &val); 820 + if (ret < 0) 821 + goto unblock_punit_i2c_access; 822 + if (val == 0) { 823 + ret = -ENODEV; 824 + goto unblock_punit_i2c_access; 825 + } 826 + 827 + ret = fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP1_REG); 828 + if (ret < 0) 829 + goto unblock_punit_i2c_access; 667 830 668 831 if (!(ret & FG_DES_CAP1_VALID)) { 669 832 dev_err(&pdev->dev, "axp288 not configured by firmware\n"); 670 833 ret = -ENODEV; 671 - goto out_free_iio_chan; 834 + goto unblock_punit_i2c_access; 672 835 } 673 836 674 837 ret = fuel_gauge_reg_readb(info, AXP20X_CHRG_CTRL1); 675 838 if (ret < 0) 676 - goto out_free_iio_chan; 839 + goto unblock_punit_i2c_access; 677 840 switch ((ret & CHRG_CCCV_CV_MASK) >> CHRG_CCCV_CV_BIT_POS) { 678 841 case CHRG_CCCV_CV_4100MV: 679 842 info->max_volt = 4100; ··· 705 836 break; 706 837 } 707 838 839 + ret = fuel_gauge_reg_readb(info, AXP20X_PWR_OP_MODE); 840 + if (ret < 0) 841 + goto unblock_punit_i2c_access; 842 + info->pwr_op = ret; 843 + 844 + ret = fuel_gauge_reg_readb(info, AXP288_FG_LOW_CAP_REG); 845 + if (ret < 0) 846 + goto unblock_punit_i2c_access; 847 + info->low_cap = ret; 848 + 849 + unblock_punit_i2c_access: 850 + iosf_mbi_unblock_punit_i2c_access(); 851 + /* In case we arrive here by goto because of a register access error */ 852 + if (ret < 0) 853 + goto out_free_iio_chan; 854 + 708 855 psy_cfg.drv_data = info; 709 856 info->bat = power_supply_register(&pdev->dev, &fuel_gauge_desc, &psy_cfg); 710 857 if (IS_ERR(info->bat)) { ··· 729 844 goto out_free_iio_chan; 730 845 } 731 846 732 - fuel_gauge_create_debugfs(info); 733 - fuel_gauge_init_irq(info); 847 + fuel_gauge_init_irq(info, pdev); 734 848 735 849 return 0; 736 850 ··· 753 869 int i; 754 870 755 871 power_supply_unregister(info->bat); 756 - fuel_gauge_remove_debugfs(info); 757 872 758 873 for (i = 0; i < AXP288_FG_INTR_NUM; i++) 759 874 if (info->irq[i] >= 0)
+15 -12
drivers/power/supply/bq24735-charger.c
··· 31 31 32 32 #include <linux/power/bq24735-charger.h> 33 33 34 - #define BQ24735_CHG_OPT 0x12 35 - #define BQ24735_CHG_OPT_CHARGE_DISABLE (1 << 0) 36 - #define BQ24735_CHG_OPT_AC_PRESENT (1 << 4) 34 + /* BQ24735 available commands and their respective masks */ 35 + #define BQ24735_CHARGE_OPT 0x12 37 36 #define BQ24735_CHARGE_CURRENT 0x14 38 37 #define BQ24735_CHARGE_CURRENT_MASK 0x1fc0 39 38 #define BQ24735_CHARGE_VOLTAGE 0x15 ··· 41 42 #define BQ24735_INPUT_CURRENT_MASK 0x1f80 42 43 #define BQ24735_MANUFACTURER_ID 0xfe 43 44 #define BQ24735_DEVICE_ID 0xff 45 + 46 + /* ChargeOptions bits of interest */ 47 + #define BQ24735_CHARGE_OPT_CHG_DISABLE (1 << 0) 48 + #define BQ24735_CHARGE_OPT_AC_PRESENT (1 << 4) 44 49 45 50 struct bq24735 { 46 51 struct power_supply *charger; ··· 170 167 if (ret) 171 168 return ret; 172 169 173 - return bq24735_update_word(charger->client, BQ24735_CHG_OPT, 174 - BQ24735_CHG_OPT_CHARGE_DISABLE, 0); 170 + return bq24735_update_word(charger->client, BQ24735_CHARGE_OPT, 171 + BQ24735_CHARGE_OPT_CHG_DISABLE, 0); 175 172 } 176 173 177 174 static inline int bq24735_disable_charging(struct bq24735 *charger) ··· 179 176 if (charger->pdata->ext_control) 180 177 return 0; 181 178 182 - return bq24735_update_word(charger->client, BQ24735_CHG_OPT, 183 - BQ24735_CHG_OPT_CHARGE_DISABLE, 184 - BQ24735_CHG_OPT_CHARGE_DISABLE); 179 + return bq24735_update_word(charger->client, BQ24735_CHARGE_OPT, 180 + BQ24735_CHARGE_OPT_CHG_DISABLE, 181 + BQ24735_CHARGE_OPT_CHG_DISABLE); 185 182 } 186 183 187 184 static bool bq24735_charger_is_present(struct bq24735 *charger) ··· 191 188 } else { 192 189 int ac = 0; 193 190 194 - ac = bq24735_read_word(charger->client, BQ24735_CHG_OPT); 191 + ac = bq24735_read_word(charger->client, BQ24735_CHARGE_OPT); 195 192 if (ac < 0) { 196 193 dev_dbg(&charger->client->dev, 197 194 "Failed to read charger options : %d\n", 198 195 ac); 199 196 return false; 200 197 } 201 - return (ac & BQ24735_CHG_OPT_AC_PRESENT) ? true : false; 198 + return (ac & BQ24735_CHARGE_OPT_AC_PRESENT) ? true : false; 202 199 } 203 200 204 201 return false; ··· 211 208 if (!bq24735_charger_is_present(charger)) 212 209 return 0; 213 210 214 - ret = bq24735_read_word(charger->client, BQ24735_CHG_OPT); 211 + ret = bq24735_read_word(charger->client, BQ24735_CHARGE_OPT); 215 212 if (ret < 0) 216 213 return ret; 217 214 218 - return !(ret & BQ24735_CHG_OPT_CHARGE_DISABLE); 215 + return !(ret & BQ24735_CHARGE_OPT_CHG_DISABLE); 219 216 } 220 217 221 218 static void bq24735_update(struct bq24735 *charger)
+386
drivers/power/supply/cros_peripheral_charger.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Power supply driver for ChromeOS EC based Peripheral Device Charger. 4 + * 5 + * Copyright 2020 Google LLC. 6 + */ 7 + 8 + #include <linux/module.h> 9 + #include <linux/notifier.h> 10 + #include <linux/platform_data/cros_ec_commands.h> 11 + #include <linux/platform_data/cros_ec_proto.h> 12 + #include <linux/platform_device.h> 13 + #include <linux/power_supply.h> 14 + #include <linux/slab.h> 15 + #include <linux/stringify.h> 16 + #include <linux/types.h> 17 + 18 + #define DRV_NAME "cros-ec-pchg" 19 + #define PCHG_DIR_PREFIX "peripheral" 20 + #define PCHG_DIR_NAME PCHG_DIR_PREFIX "%d" 21 + #define PCHG_DIR_NAME_LENGTH \ 22 + sizeof(PCHG_DIR_PREFIX __stringify(EC_PCHG_MAX_PORTS)) 23 + #define PCHG_CACHE_UPDATE_DELAY msecs_to_jiffies(500) 24 + 25 + struct port_data { 26 + int port_number; 27 + char name[PCHG_DIR_NAME_LENGTH]; 28 + struct power_supply *psy; 29 + struct power_supply_desc psy_desc; 30 + int psy_status; 31 + int battery_percentage; 32 + int charge_type; 33 + struct charger_data *charger; 34 + unsigned long last_update; 35 + }; 36 + 37 + struct charger_data { 38 + struct device *dev; 39 + struct cros_ec_dev *ec_dev; 40 + struct cros_ec_device *ec_device; 41 + int num_registered_psy; 42 + struct port_data *ports[EC_PCHG_MAX_PORTS]; 43 + struct notifier_block notifier; 44 + }; 45 + 46 + static enum power_supply_property cros_pchg_props[] = { 47 + POWER_SUPPLY_PROP_STATUS, 48 + POWER_SUPPLY_PROP_CHARGE_TYPE, 49 + POWER_SUPPLY_PROP_CAPACITY, 50 + POWER_SUPPLY_PROP_SCOPE, 51 + }; 52 + 53 + static int cros_pchg_ec_command(const struct charger_data *charger, 54 + unsigned int version, 55 + unsigned int command, 56 + const void *outdata, 57 + unsigned int outsize, 58 + void *indata, 59 + unsigned int insize) 60 + { 61 + struct cros_ec_dev *ec_dev = charger->ec_dev; 62 + struct cros_ec_command *msg; 63 + int ret; 64 + 65 + msg = kzalloc(sizeof(*msg) + max(outsize, insize), GFP_KERNEL); 66 + if (!msg) 67 + return -ENOMEM; 68 + 69 + msg->version = version; 70 + msg->command = ec_dev->cmd_offset + command; 71 + msg->outsize = outsize; 72 + msg->insize = insize; 73 + 74 + if (outsize) 75 + memcpy(msg->data, outdata, outsize); 76 + 77 + ret = cros_ec_cmd_xfer_status(charger->ec_device, msg); 78 + if (ret >= 0 && insize) 79 + memcpy(indata, msg->data, insize); 80 + 81 + kfree(msg); 82 + return ret; 83 + } 84 + 85 + static const unsigned int pchg_cmd_version = 1; 86 + 87 + static bool cros_pchg_cmd_ver_check(const struct charger_data *charger) 88 + { 89 + struct ec_params_get_cmd_versions_v1 req; 90 + struct ec_response_get_cmd_versions rsp; 91 + int ret; 92 + 93 + req.cmd = EC_CMD_PCHG; 94 + ret = cros_pchg_ec_command(charger, 1, EC_CMD_GET_CMD_VERSIONS, 95 + &req, sizeof(req), &rsp, sizeof(rsp)); 96 + if (ret < 0) { 97 + dev_warn(charger->dev, 98 + "Unable to get versions of EC_CMD_PCHG (err:%d)\n", 99 + ret); 100 + return false; 101 + } 102 + 103 + return !!(rsp.version_mask & BIT(pchg_cmd_version)); 104 + } 105 + 106 + static int cros_pchg_port_count(const struct charger_data *charger) 107 + { 108 + struct ec_response_pchg_count rsp; 109 + int ret; 110 + 111 + ret = cros_pchg_ec_command(charger, 0, EC_CMD_PCHG_COUNT, 112 + NULL, 0, &rsp, sizeof(rsp)); 113 + if (ret < 0) { 114 + dev_warn(charger->dev, 115 + "Unable to get number or ports (err:%d)\n", ret); 116 + return ret; 117 + } 118 + 119 + return rsp.port_count; 120 + } 121 + 122 + static int cros_pchg_get_status(struct port_data *port) 123 + { 124 + struct charger_data *charger = port->charger; 125 + struct ec_params_pchg req; 126 + struct ec_response_pchg rsp; 127 + struct device *dev = charger->dev; 128 + int old_status = port->psy_status; 129 + int old_percentage = port->battery_percentage; 130 + int ret; 131 + 132 + req.port = port->port_number; 133 + ret = cros_pchg_ec_command(charger, pchg_cmd_version, EC_CMD_PCHG, 134 + &req, sizeof(req), &rsp, sizeof(rsp)); 135 + if (ret < 0) { 136 + dev_err(dev, "Unable to get port.%d status (err:%d)\n", 137 + port->port_number, ret); 138 + return ret; 139 + } 140 + 141 + switch (rsp.state) { 142 + case PCHG_STATE_RESET: 143 + case PCHG_STATE_INITIALIZED: 144 + case PCHG_STATE_ENABLED: 145 + default: 146 + port->psy_status = POWER_SUPPLY_STATUS_UNKNOWN; 147 + port->charge_type = POWER_SUPPLY_CHARGE_TYPE_NONE; 148 + break; 149 + case PCHG_STATE_DETECTED: 150 + port->psy_status = POWER_SUPPLY_STATUS_CHARGING; 151 + port->charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; 152 + break; 153 + case PCHG_STATE_CHARGING: 154 + port->psy_status = POWER_SUPPLY_STATUS_CHARGING; 155 + port->charge_type = POWER_SUPPLY_CHARGE_TYPE_STANDARD; 156 + break; 157 + case PCHG_STATE_FULL: 158 + port->psy_status = POWER_SUPPLY_STATUS_FULL; 159 + port->charge_type = POWER_SUPPLY_CHARGE_TYPE_NONE; 160 + break; 161 + } 162 + 163 + port->battery_percentage = rsp.battery_percentage; 164 + 165 + if (port->psy_status != old_status || 166 + port->battery_percentage != old_percentage) 167 + power_supply_changed(port->psy); 168 + 169 + dev_dbg(dev, 170 + "Port %d: state=%d battery=%d%%\n", 171 + port->port_number, rsp.state, rsp.battery_percentage); 172 + 173 + return 0; 174 + } 175 + 176 + static int cros_pchg_get_port_status(struct port_data *port, bool ratelimit) 177 + { 178 + int ret; 179 + 180 + if (ratelimit && 181 + time_is_after_jiffies(port->last_update + PCHG_CACHE_UPDATE_DELAY)) 182 + return 0; 183 + 184 + ret = cros_pchg_get_status(port); 185 + if (ret < 0) 186 + return ret; 187 + 188 + port->last_update = jiffies; 189 + 190 + return ret; 191 + } 192 + 193 + static int cros_pchg_get_prop(struct power_supply *psy, 194 + enum power_supply_property psp, 195 + union power_supply_propval *val) 196 + { 197 + struct port_data *port = power_supply_get_drvdata(psy); 198 + 199 + switch (psp) { 200 + case POWER_SUPPLY_PROP_STATUS: 201 + case POWER_SUPPLY_PROP_CAPACITY: 202 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 203 + cros_pchg_get_port_status(port, true); 204 + break; 205 + default: 206 + break; 207 + } 208 + 209 + switch (psp) { 210 + case POWER_SUPPLY_PROP_STATUS: 211 + val->intval = port->psy_status; 212 + break; 213 + case POWER_SUPPLY_PROP_CAPACITY: 214 + val->intval = port->battery_percentage; 215 + break; 216 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 217 + val->intval = port->charge_type; 218 + break; 219 + case POWER_SUPPLY_PROP_SCOPE: 220 + val->intval = POWER_SUPPLY_SCOPE_DEVICE; 221 + break; 222 + default: 223 + return -EINVAL; 224 + } 225 + 226 + return 0; 227 + } 228 + 229 + static int cros_pchg_event(const struct charger_data *charger, 230 + unsigned long host_event) 231 + { 232 + int i; 233 + 234 + for (i = 0; i < charger->num_registered_psy; i++) 235 + cros_pchg_get_port_status(charger->ports[i], false); 236 + 237 + return NOTIFY_OK; 238 + } 239 + 240 + static u32 cros_get_device_event(const struct charger_data *charger) 241 + { 242 + struct ec_params_device_event req; 243 + struct ec_response_device_event rsp; 244 + struct device *dev = charger->dev; 245 + int ret; 246 + 247 + req.param = EC_DEVICE_EVENT_PARAM_GET_CURRENT_EVENTS; 248 + ret = cros_pchg_ec_command(charger, 0, EC_CMD_DEVICE_EVENT, 249 + &req, sizeof(req), &rsp, sizeof(rsp)); 250 + if (ret < 0) { 251 + dev_warn(dev, "Unable to get device events (err:%d)\n", ret); 252 + return 0; 253 + } 254 + 255 + return rsp.event_mask; 256 + } 257 + 258 + static int cros_ec_notify(struct notifier_block *nb, 259 + unsigned long queued_during_suspend, 260 + void *data) 261 + { 262 + struct cros_ec_device *ec_dev = (struct cros_ec_device *)data; 263 + u32 host_event = cros_ec_get_host_event(ec_dev); 264 + struct charger_data *charger = 265 + container_of(nb, struct charger_data, notifier); 266 + u32 device_event_mask; 267 + 268 + if (!host_event) 269 + return NOTIFY_DONE; 270 + 271 + if (!(host_event & EC_HOST_EVENT_MASK(EC_HOST_EVENT_DEVICE))) 272 + return NOTIFY_DONE; 273 + 274 + /* 275 + * todo: Retrieve device event mask in common place 276 + * (e.g. cros_ec_proto.c). 277 + */ 278 + device_event_mask = cros_get_device_event(charger); 279 + if (!(device_event_mask & EC_DEVICE_EVENT_MASK(EC_DEVICE_EVENT_WLC))) 280 + return NOTIFY_DONE; 281 + 282 + return cros_pchg_event(charger, host_event); 283 + } 284 + 285 + static int cros_pchg_probe(struct platform_device *pdev) 286 + { 287 + struct device *dev = &pdev->dev; 288 + struct cros_ec_dev *ec_dev = dev_get_drvdata(dev->parent); 289 + struct cros_ec_device *ec_device = ec_dev->ec_dev; 290 + struct power_supply_desc *psy_desc; 291 + struct charger_data *charger; 292 + struct power_supply *psy; 293 + struct port_data *port; 294 + struct notifier_block *nb; 295 + int num_ports; 296 + int ret; 297 + int i; 298 + 299 + charger = devm_kzalloc(dev, sizeof(*charger), GFP_KERNEL); 300 + if (!charger) 301 + return -ENOMEM; 302 + 303 + charger->dev = dev; 304 + charger->ec_dev = ec_dev; 305 + charger->ec_device = ec_device; 306 + 307 + ret = cros_pchg_port_count(charger); 308 + if (ret <= 0) { 309 + /* 310 + * This feature is enabled by the EC and the kernel driver is 311 + * included by default for CrOS devices. Don't need to be loud 312 + * since this error can be normal. 313 + */ 314 + dev_info(dev, "No peripheral charge ports (err:%d)\n", ret); 315 + return -ENODEV; 316 + } 317 + 318 + if (!cros_pchg_cmd_ver_check(charger)) { 319 + dev_err(dev, "EC_CMD_PCHG version %d isn't available.\n", 320 + pchg_cmd_version); 321 + return -EOPNOTSUPP; 322 + } 323 + 324 + num_ports = ret; 325 + if (num_ports > EC_PCHG_MAX_PORTS) { 326 + dev_err(dev, "Too many peripheral charge ports (%d)\n", 327 + num_ports); 328 + return -ENOBUFS; 329 + } 330 + 331 + dev_info(dev, "%d peripheral charge ports found\n", num_ports); 332 + 333 + for (i = 0; i < num_ports; i++) { 334 + struct power_supply_config psy_cfg = {}; 335 + 336 + port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL); 337 + if (!port) 338 + return -ENOMEM; 339 + 340 + port->charger = charger; 341 + port->port_number = i; 342 + snprintf(port->name, sizeof(port->name), PCHG_DIR_NAME, i); 343 + 344 + psy_desc = &port->psy_desc; 345 + psy_desc->name = port->name; 346 + psy_desc->type = POWER_SUPPLY_TYPE_BATTERY; 347 + psy_desc->get_property = cros_pchg_get_prop; 348 + psy_desc->external_power_changed = NULL; 349 + psy_desc->properties = cros_pchg_props; 350 + psy_desc->num_properties = ARRAY_SIZE(cros_pchg_props); 351 + psy_cfg.drv_data = port; 352 + 353 + psy = devm_power_supply_register(dev, psy_desc, &psy_cfg); 354 + if (IS_ERR(psy)) 355 + return dev_err_probe(dev, PTR_ERR(psy), 356 + "Failed to register power supply\n"); 357 + port->psy = psy; 358 + 359 + charger->ports[charger->num_registered_psy++] = port; 360 + } 361 + 362 + if (!charger->num_registered_psy) 363 + return -ENODEV; 364 + 365 + nb = &charger->notifier; 366 + nb->notifier_call = cros_ec_notify; 367 + ret = blocking_notifier_chain_register(&ec_dev->ec_dev->event_notifier, 368 + nb); 369 + if (ret < 0) 370 + dev_err(dev, "Failed to register notifier (err:%d)\n", ret); 371 + 372 + return 0; 373 + } 374 + 375 + static struct platform_driver cros_pchg_driver = { 376 + .driver = { 377 + .name = DRV_NAME, 378 + }, 379 + .probe = cros_pchg_probe 380 + }; 381 + 382 + module_platform_driver(cros_pchg_driver); 383 + 384 + MODULE_LICENSE("GPL"); 385 + MODULE_DESCRIPTION("ChromeOS EC peripheral device charger"); 386 + MODULE_ALIAS("platform:" DRV_NAME);
+3 -1
drivers/power/supply/cw2015_battery.c
··· 679 679 &cw2015_bat_desc, 680 680 &psy_cfg); 681 681 if (IS_ERR(cw_bat->rk_bat)) { 682 - dev_err(cw_bat->dev, "Failed to register power supply\n"); 682 + /* try again if this happens */ 683 + dev_err_probe(&client->dev, PTR_ERR(cw_bat->rk_bat), 684 + "Failed to register power supply\n"); 683 685 return PTR_ERR(cw_bat->rk_bat); 684 686 } 685 687
+31 -30
drivers/power/supply/max17042_battery.c
··· 36 36 37 37 /* Interrupt mask bits */ 38 38 #define CONFIG_ALRT_BIT_ENBL (1 << 2) 39 - #define STATUS_INTR_SOCMIN_BIT (1 << 10) 40 - #define STATUS_INTR_SOCMAX_BIT (1 << 14) 41 39 42 40 #define VFSOC0_LOCK 0x0000 43 41 #define VFSOC0_UNLOCK 0x0080 ··· 283 285 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: 284 286 if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) 285 287 ret = regmap_read(map, MAX17042_V_empty, &data); 286 - else if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055) 287 - ret = regmap_read(map, MAX17055_V_empty, &data); 288 288 else 289 289 ret = regmap_read(map, MAX17047_V_empty, &data); 290 290 if (ret < 0) ··· 744 748 struct max17042_config_data *config = chip->pdata->config_data; 745 749 746 750 max17042_override_por(map, MAX17042_TGAIN, config->tgain); 747 - max17042_override_por(map, MAx17042_TOFF, config->toff); 751 + max17042_override_por(map, MAX17042_TOFF, config->toff); 748 752 max17042_override_por(map, MAX17042_CGAIN, config->cgain); 749 753 max17042_override_por(map, MAX17042_COFF, config->coff); 750 754 ··· 763 767 max17042_override_por(map, MAX17042_FilterCFG, config->filter_cfg); 764 768 max17042_override_por(map, MAX17042_RelaxCFG, config->relax_cfg); 765 769 max17042_override_por(map, MAX17042_MiscCFG, config->misc_cfg); 766 - max17042_override_por(map, MAX17042_MaskSOC, config->masksoc); 767 770 768 771 max17042_override_por(map, MAX17042_FullCAP, config->fullcap); 769 772 max17042_override_por(map, MAX17042_FullCAPNom, config->fullcapnom); 770 - if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) 771 - max17042_override_por(map, MAX17042_SOC_empty, 772 - config->socempty); 773 - max17042_override_por(map, MAX17042_LAvg_empty, config->lavg_empty); 774 773 max17042_override_por(map, MAX17042_dQacc, config->dqacc); 775 774 max17042_override_por(map, MAX17042_dPacc, config->dpacc); 776 775 777 - if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) 778 - max17042_override_por(map, MAX17042_V_empty, config->vempty); 779 - if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055) 780 - max17042_override_por(map, MAX17055_V_empty, config->vempty); 781 - else 782 - max17042_override_por(map, MAX17047_V_empty, config->vempty); 783 - max17042_override_por(map, MAX17042_TempNom, config->temp_nom); 784 - max17042_override_por(map, MAX17042_TempLim, config->temp_lim); 785 - max17042_override_por(map, MAX17042_FCTC, config->fctc); 786 776 max17042_override_por(map, MAX17042_RCOMP0, config->rcomp0); 787 777 max17042_override_por(map, MAX17042_TempCo, config->tcompc0); 788 - if (chip->chip_type && 789 - ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) || 778 + 779 + if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) { 780 + max17042_override_por(map, MAX17042_MaskSOC, config->masksoc); 781 + max17042_override_por(map, MAX17042_SOC_empty, config->socempty); 782 + max17042_override_por(map, MAX17042_V_empty, config->vempty); 783 + max17042_override_por(map, MAX17042_EmptyTempCo, config->empty_tempco); 784 + max17042_override_por(map, MAX17042_K_empty0, config->kempty0); 785 + } 786 + 787 + if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17042) || 790 788 (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) || 791 - (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050))) { 792 - max17042_override_por(map, MAX17042_EmptyTempCo, 793 - config->empty_tempco); 794 - max17042_override_por(map, MAX17042_K_empty0, 795 - config->kempty0); 789 + (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050)) { 790 + max17042_override_por(map, MAX17042_LAvg_empty, config->lavg_empty); 791 + max17042_override_por(map, MAX17042_TempNom, config->temp_nom); 792 + max17042_override_por(map, MAX17042_TempLim, config->temp_lim); 793 + max17042_override_por(map, MAX17042_FCTC, config->fctc); 794 + } 795 + 796 + if ((chip->chip_type == MAXIM_DEVICE_TYPE_MAX17047) || 797 + (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17050) || 798 + (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055)) { 799 + max17042_override_por(map, MAX17047_V_empty, config->vempty); 796 800 } 797 801 } 798 802 ··· 865 869 { 866 870 struct max17042_chip *chip = dev; 867 871 u32 val; 872 + int ret; 868 873 869 - regmap_read(chip->regmap, MAX17042_STATUS, &val); 870 - if ((val & STATUS_INTR_SOCMIN_BIT) || 871 - (val & STATUS_INTR_SOCMAX_BIT)) { 872 - dev_info(&chip->client->dev, "SOC threshold INTR\n"); 874 + ret = regmap_read(chip->regmap, MAX17042_STATUS, &val); 875 + if (ret) 876 + return IRQ_HANDLED; 877 + 878 + if ((val & STATUS_SMN_BIT) || (val & STATUS_SMX_BIT)) { 879 + dev_dbg(&chip->client->dev, "SOC threshold INTR\n"); 873 880 max17042_set_soc_threshold(chip, 1); 874 881 } 875 882 ··· 1195 1196 { .compatible = "maxim,max17047" }, 1196 1197 { .compatible = "maxim,max17050" }, 1197 1198 { .compatible = "maxim,max17055" }, 1199 + { .compatible = "maxim,max77849-battery" }, 1198 1200 { }, 1199 1201 }; 1200 1202 MODULE_DEVICE_TABLE(of, max17042_dt_match); ··· 1206 1206 { "max17047", MAXIM_DEVICE_TYPE_MAX17047 }, 1207 1207 { "max17050", MAXIM_DEVICE_TYPE_MAX17050 }, 1208 1208 { "max17055", MAXIM_DEVICE_TYPE_MAX17055 }, 1209 + { "max77849-battery", MAXIM_DEVICE_TYPE_MAX17047 }, 1209 1210 { } 1210 1211 }; 1211 1212 MODULE_DEVICE_TABLE(i2c, max17042_id);
+867
drivers/power/supply/mt6360_charger.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Copyright (c) 2021 MediaTek Inc. 4 + */ 5 + 6 + #include <linux/devm-helpers.h> 7 + #include <linux/init.h> 8 + #include <linux/interrupt.h> 9 + #include <linux/kernel.h> 10 + #include <linux/linear_range.h> 11 + #include <linux/module.h> 12 + #include <linux/of.h> 13 + #include <linux/platform_device.h> 14 + #include <linux/power_supply.h> 15 + #include <linux/property.h> 16 + #include <linux/regmap.h> 17 + #include <linux/regulator/driver.h> 18 + 19 + #define MT6360_PMU_CHG_CTRL1 0x311 20 + #define MT6360_PMU_CHG_CTRL2 0x312 21 + #define MT6360_PMU_CHG_CTRL3 0x313 22 + #define MT6360_PMU_CHG_CTRL4 0x314 23 + #define MT6360_PMU_CHG_CTRL5 0x315 24 + #define MT6360_PMU_CHG_CTRL6 0x316 25 + #define MT6360_PMU_CHG_CTRL7 0x317 26 + #define MT6360_PMU_CHG_CTRL8 0x318 27 + #define MT6360_PMU_CHG_CTRL9 0x319 28 + #define MT6360_PMU_CHG_CTRL10 0x31A 29 + #define MT6360_PMU_DEVICE_TYPE 0x322 30 + #define MT6360_PMU_USB_STATUS1 0x327 31 + #define MT6360_PMU_CHG_STAT 0x34A 32 + #define MT6360_PMU_CHG_CTRL19 0x361 33 + #define MT6360_PMU_FOD_STAT 0x3E7 34 + 35 + /* MT6360_PMU_CHG_CTRL1 */ 36 + #define MT6360_FSLP_SHFT (3) 37 + #define MT6360_FSLP_MASK BIT(MT6360_FSLP_SHFT) 38 + #define MT6360_OPA_MODE_SHFT (0) 39 + #define MT6360_OPA_MODE_MASK BIT(MT6360_OPA_MODE_SHFT) 40 + /* MT6360_PMU_CHG_CTRL2 */ 41 + #define MT6360_IINLMTSEL_SHFT (2) 42 + #define MT6360_IINLMTSEL_MASK GENMASK(3, 2) 43 + /* MT6360_PMU_CHG_CTRL3 */ 44 + #define MT6360_IAICR_SHFT (2) 45 + #define MT6360_IAICR_MASK GENMASK(7, 2) 46 + #define MT6360_ILIM_EN_MASK BIT(0) 47 + /* MT6360_PMU_CHG_CTRL4 */ 48 + #define MT6360_VOREG_SHFT (1) 49 + #define MT6360_VOREG_MASK GENMASK(7, 1) 50 + /* MT6360_PMU_CHG_CTRL5 */ 51 + #define MT6360_VOBST_MASK GENMASK(7, 2) 52 + /* MT6360_PMU_CHG_CTRL6 */ 53 + #define MT6360_VMIVR_SHFT (1) 54 + #define MT6360_VMIVR_MASK GENMASK(7, 1) 55 + /* MT6360_PMU_CHG_CTRL7 */ 56 + #define MT6360_ICHG_SHFT (2) 57 + #define MT6360_ICHG_MASK GENMASK(7, 2) 58 + /* MT6360_PMU_CHG_CTRL8 */ 59 + #define MT6360_IPREC_SHFT (0) 60 + #define MT6360_IPREC_MASK GENMASK(3, 0) 61 + /* MT6360_PMU_CHG_CTRL9 */ 62 + #define MT6360_IEOC_SHFT (4) 63 + #define MT6360_IEOC_MASK GENMASK(7, 4) 64 + /* MT6360_PMU_CHG_CTRL10 */ 65 + #define MT6360_OTG_OC_MASK GENMASK(3, 0) 66 + /* MT6360_PMU_DEVICE_TYPE */ 67 + #define MT6360_USBCHGEN_MASK BIT(7) 68 + /* MT6360_PMU_USB_STATUS1 */ 69 + #define MT6360_USB_STATUS_SHFT (4) 70 + #define MT6360_USB_STATUS_MASK GENMASK(6, 4) 71 + /* MT6360_PMU_CHG_STAT */ 72 + #define MT6360_CHG_STAT_SHFT (6) 73 + #define MT6360_CHG_STAT_MASK GENMASK(7, 6) 74 + #define MT6360_VBAT_LVL_MASK BIT(5) 75 + /* MT6360_PMU_CHG_CTRL19 */ 76 + #define MT6360_VINOVP_SHFT (5) 77 + #define MT6360_VINOVP_MASK GENMASK(6, 5) 78 + /* MT6360_PMU_FOD_STAT */ 79 + #define MT6360_CHRDET_EXT_MASK BIT(4) 80 + 81 + /* uV */ 82 + #define MT6360_VMIVR_MIN 3900000 83 + #define MT6360_VMIVR_MAX 13400000 84 + #define MT6360_VMIVR_STEP 100000 85 + /* uA */ 86 + #define MT6360_ICHG_MIN 100000 87 + #define MT6360_ICHG_MAX 5000000 88 + #define MT6360_ICHG_STEP 100000 89 + /* uV */ 90 + #define MT6360_VOREG_MIN 3900000 91 + #define MT6360_VOREG_MAX 4710000 92 + #define MT6360_VOREG_STEP 10000 93 + /* uA */ 94 + #define MT6360_AICR_MIN 100000 95 + #define MT6360_AICR_MAX 3250000 96 + #define MT6360_AICR_STEP 50000 97 + /* uA */ 98 + #define MT6360_IPREC_MIN 100000 99 + #define MT6360_IPREC_MAX 850000 100 + #define MT6360_IPREC_STEP 50000 101 + /* uA */ 102 + #define MT6360_IEOC_MIN 100000 103 + #define MT6360_IEOC_MAX 850000 104 + #define MT6360_IEOC_STEP 50000 105 + 106 + enum { 107 + MT6360_RANGE_VMIVR, 108 + MT6360_RANGE_ICHG, 109 + MT6360_RANGE_VOREG, 110 + MT6360_RANGE_AICR, 111 + MT6360_RANGE_IPREC, 112 + MT6360_RANGE_IEOC, 113 + MT6360_RANGE_MAX, 114 + }; 115 + 116 + #define MT6360_LINEAR_RANGE(idx, _min, _min_sel, _max_sel, _step) \ 117 + [idx] = REGULATOR_LINEAR_RANGE(_min, _min_sel, _max_sel, _step) 118 + 119 + static const struct linear_range mt6360_chg_range[MT6360_RANGE_MAX] = { 120 + MT6360_LINEAR_RANGE(MT6360_RANGE_VMIVR, 3900000, 0, 0x5F, 100000), 121 + MT6360_LINEAR_RANGE(MT6360_RANGE_ICHG, 100000, 0, 0x31, 100000), 122 + MT6360_LINEAR_RANGE(MT6360_RANGE_VOREG, 3900000, 0, 0x51, 10000), 123 + MT6360_LINEAR_RANGE(MT6360_RANGE_AICR, 100000, 0, 0x3F, 50000), 124 + MT6360_LINEAR_RANGE(MT6360_RANGE_IPREC, 100000, 0, 0x0F, 50000), 125 + MT6360_LINEAR_RANGE(MT6360_RANGE_IEOC, 100000, 0, 0x0F, 50000), 126 + }; 127 + 128 + struct mt6360_chg_info { 129 + struct device *dev; 130 + struct regmap *regmap; 131 + struct power_supply_desc psy_desc; 132 + struct power_supply *psy; 133 + struct regulator_dev *otg_rdev; 134 + struct mutex chgdet_lock; 135 + u32 vinovp; 136 + bool pwr_rdy; 137 + bool bc12_en; 138 + int psy_usb_type; 139 + struct work_struct chrdet_work; 140 + }; 141 + 142 + enum mt6360_iinlmtsel { 143 + MT6360_IINLMTSEL_AICR_3250 = 0, 144 + MT6360_IINLMTSEL_CHG_TYPE, 145 + MT6360_IINLMTSEL_AICR, 146 + MT6360_IINLMTSEL_LOWER_LEVEL, 147 + }; 148 + 149 + enum mt6360_pmu_chg_type { 150 + MT6360_CHG_TYPE_NOVBUS = 0, 151 + MT6360_CHG_TYPE_UNDER_GOING, 152 + MT6360_CHG_TYPE_SDP, 153 + MT6360_CHG_TYPE_SDPNSTD, 154 + MT6360_CHG_TYPE_DCP, 155 + MT6360_CHG_TYPE_CDP, 156 + MT6360_CHG_TYPE_DISABLE_BC12, 157 + MT6360_CHG_TYPE_MAX, 158 + }; 159 + 160 + static enum power_supply_usb_type mt6360_charger_usb_types[] = { 161 + POWER_SUPPLY_USB_TYPE_UNKNOWN, 162 + POWER_SUPPLY_USB_TYPE_SDP, 163 + POWER_SUPPLY_USB_TYPE_DCP, 164 + POWER_SUPPLY_USB_TYPE_CDP, 165 + }; 166 + 167 + static int mt6360_get_chrdet_ext_stat(struct mt6360_chg_info *mci, 168 + bool *pwr_rdy) 169 + { 170 + int ret; 171 + unsigned int regval; 172 + 173 + ret = regmap_read(mci->regmap, MT6360_PMU_FOD_STAT, &regval); 174 + if (ret < 0) 175 + return ret; 176 + *pwr_rdy = (regval & MT6360_CHRDET_EXT_MASK) ? true : false; 177 + return 0; 178 + } 179 + 180 + static int mt6360_charger_get_online(struct mt6360_chg_info *mci, 181 + union power_supply_propval *val) 182 + { 183 + int ret; 184 + bool pwr_rdy; 185 + 186 + ret = mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); 187 + if (ret < 0) 188 + return ret; 189 + val->intval = pwr_rdy ? true : false; 190 + return 0; 191 + } 192 + 193 + static int mt6360_charger_get_status(struct mt6360_chg_info *mci, 194 + union power_supply_propval *val) 195 + { 196 + int status, ret; 197 + unsigned int regval; 198 + bool pwr_rdy; 199 + 200 + ret = mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); 201 + if (ret < 0) 202 + return ret; 203 + if (!pwr_rdy) { 204 + status = POWER_SUPPLY_STATUS_DISCHARGING; 205 + goto out; 206 + } 207 + 208 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, &regval); 209 + if (ret < 0) 210 + return ret; 211 + regval &= MT6360_CHG_STAT_MASK; 212 + regval >>= MT6360_CHG_STAT_SHFT; 213 + switch (regval) { 214 + case 0x0: 215 + status = POWER_SUPPLY_STATUS_NOT_CHARGING; 216 + break; 217 + case 0x1: 218 + status = POWER_SUPPLY_STATUS_CHARGING; 219 + break; 220 + case 0x2: 221 + status = POWER_SUPPLY_STATUS_FULL; 222 + break; 223 + default: 224 + ret = -EIO; 225 + } 226 + out: 227 + if (!ret) 228 + val->intval = status; 229 + return ret; 230 + } 231 + 232 + static int mt6360_charger_get_charge_type(struct mt6360_chg_info *mci, 233 + union power_supply_propval *val) 234 + { 235 + int type, ret; 236 + unsigned int regval; 237 + u8 chg_stat; 238 + 239 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, &regval); 240 + if (ret < 0) 241 + return ret; 242 + 243 + chg_stat = (regval & MT6360_CHG_STAT_MASK) >> MT6360_CHG_STAT_SHFT; 244 + switch (chg_stat) { 245 + case 0x01: /* Charge in Progress */ 246 + if (regval & MT6360_VBAT_LVL_MASK) 247 + type = POWER_SUPPLY_CHARGE_TYPE_FAST; 248 + else 249 + type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; 250 + break; 251 + case 0x00: /* Not Charging */ 252 + case 0x02: /* Charge Done */ 253 + case 0x03: /* Charge Fault */ 254 + default: 255 + type = POWER_SUPPLY_CHARGE_TYPE_NONE; 256 + break; 257 + } 258 + 259 + val->intval = type; 260 + return 0; 261 + } 262 + 263 + static int mt6360_charger_get_ichg(struct mt6360_chg_info *mci, 264 + union power_supply_propval *val) 265 + { 266 + int ret; 267 + u32 sel, value; 268 + 269 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL7, &sel); 270 + if (ret < 0) 271 + return ret; 272 + sel = (sel & MT6360_ICHG_MASK) >> MT6360_ICHG_SHFT; 273 + ret = linear_range_get_value(&mt6360_chg_range[MT6360_RANGE_ICHG], sel, &value); 274 + if (!ret) 275 + val->intval = value; 276 + return ret; 277 + } 278 + 279 + static int mt6360_charger_get_max_ichg(struct mt6360_chg_info *mci, 280 + union power_supply_propval *val) 281 + { 282 + val->intval = MT6360_ICHG_MAX; 283 + return 0; 284 + } 285 + 286 + static int mt6360_charger_get_cv(struct mt6360_chg_info *mci, 287 + union power_supply_propval *val) 288 + { 289 + int ret; 290 + u32 sel, value; 291 + 292 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL4, &sel); 293 + if (ret < 0) 294 + return ret; 295 + sel = (sel & MT6360_VOREG_MASK) >> MT6360_VOREG_SHFT; 296 + ret = linear_range_get_value(&mt6360_chg_range[MT6360_RANGE_VOREG], sel, &value); 297 + if (!ret) 298 + val->intval = value; 299 + return ret; 300 + } 301 + 302 + static int mt6360_charger_get_max_cv(struct mt6360_chg_info *mci, 303 + union power_supply_propval *val) 304 + { 305 + val->intval = MT6360_VOREG_MAX; 306 + return 0; 307 + } 308 + 309 + static int mt6360_charger_get_aicr(struct mt6360_chg_info *mci, 310 + union power_supply_propval *val) 311 + { 312 + int ret; 313 + u32 sel, value; 314 + 315 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL3, &sel); 316 + if (ret < 0) 317 + return ret; 318 + sel = (sel & MT6360_IAICR_MASK) >> MT6360_IAICR_SHFT; 319 + ret = linear_range_get_value(&mt6360_chg_range[MT6360_RANGE_AICR], sel, &value); 320 + if (!ret) 321 + val->intval = value; 322 + return ret; 323 + } 324 + 325 + static int mt6360_charger_get_mivr(struct mt6360_chg_info *mci, 326 + union power_supply_propval *val) 327 + { 328 + int ret; 329 + u32 sel, value; 330 + 331 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL6, &sel); 332 + if (ret < 0) 333 + return ret; 334 + sel = (sel & MT6360_VMIVR_MASK) >> MT6360_VMIVR_SHFT; 335 + ret = linear_range_get_value(&mt6360_chg_range[MT6360_RANGE_VMIVR], sel, &value); 336 + if (!ret) 337 + val->intval = value; 338 + return ret; 339 + } 340 + 341 + static int mt6360_charger_get_iprechg(struct mt6360_chg_info *mci, 342 + union power_supply_propval *val) 343 + { 344 + int ret; 345 + u32 sel, value; 346 + 347 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL8, &sel); 348 + if (ret < 0) 349 + return ret; 350 + sel = (sel & MT6360_IPREC_MASK) >> MT6360_IPREC_SHFT; 351 + ret = linear_range_get_value(&mt6360_chg_range[MT6360_RANGE_IPREC], sel, &value); 352 + if (!ret) 353 + val->intval = value; 354 + return ret; 355 + } 356 + 357 + static int mt6360_charger_get_ieoc(struct mt6360_chg_info *mci, 358 + union power_supply_propval *val) 359 + { 360 + int ret; 361 + u32 sel, value; 362 + 363 + ret = regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL9, &sel); 364 + if (ret < 0) 365 + return ret; 366 + sel = (sel & MT6360_IEOC_MASK) >> MT6360_IEOC_SHFT; 367 + ret = linear_range_get_value(&mt6360_chg_range[MT6360_RANGE_IEOC], sel, &value); 368 + if (!ret) 369 + val->intval = value; 370 + return ret; 371 + } 372 + 373 + static int mt6360_charger_set_online(struct mt6360_chg_info *mci, 374 + const union power_supply_propval *val) 375 + { 376 + u8 force_sleep = val->intval ? 0 : 1; 377 + 378 + return regmap_update_bits(mci->regmap, 379 + MT6360_PMU_CHG_CTRL1, 380 + MT6360_FSLP_MASK, 381 + force_sleep << MT6360_FSLP_SHFT); 382 + } 383 + 384 + static int mt6360_charger_set_ichg(struct mt6360_chg_info *mci, 385 + const union power_supply_propval *val) 386 + { 387 + u32 sel; 388 + 389 + linear_range_get_selector_within(&mt6360_chg_range[MT6360_RANGE_ICHG], val->intval, &sel); 390 + return regmap_update_bits(mci->regmap, 391 + MT6360_PMU_CHG_CTRL7, 392 + MT6360_ICHG_MASK, 393 + sel << MT6360_ICHG_SHFT); 394 + } 395 + 396 + static int mt6360_charger_set_cv(struct mt6360_chg_info *mci, 397 + const union power_supply_propval *val) 398 + { 399 + u32 sel; 400 + 401 + linear_range_get_selector_within(&mt6360_chg_range[MT6360_RANGE_VOREG], val->intval, &sel); 402 + return regmap_update_bits(mci->regmap, 403 + MT6360_PMU_CHG_CTRL4, 404 + MT6360_VOREG_MASK, 405 + sel << MT6360_VOREG_SHFT); 406 + } 407 + 408 + static int mt6360_charger_set_aicr(struct mt6360_chg_info *mci, 409 + const union power_supply_propval *val) 410 + { 411 + u32 sel; 412 + 413 + linear_range_get_selector_within(&mt6360_chg_range[MT6360_RANGE_AICR], val->intval, &sel); 414 + return regmap_update_bits(mci->regmap, 415 + MT6360_PMU_CHG_CTRL3, 416 + MT6360_IAICR_MASK, 417 + sel << MT6360_IAICR_SHFT); 418 + } 419 + 420 + static int mt6360_charger_set_mivr(struct mt6360_chg_info *mci, 421 + const union power_supply_propval *val) 422 + { 423 + u32 sel; 424 + 425 + linear_range_get_selector_within(&mt6360_chg_range[MT6360_RANGE_VMIVR], val->intval, &sel); 426 + return regmap_update_bits(mci->regmap, 427 + MT6360_PMU_CHG_CTRL3, 428 + MT6360_VMIVR_MASK, 429 + sel << MT6360_VMIVR_SHFT); 430 + } 431 + 432 + static int mt6360_charger_set_iprechg(struct mt6360_chg_info *mci, 433 + const union power_supply_propval *val) 434 + { 435 + u32 sel; 436 + 437 + linear_range_get_selector_within(&mt6360_chg_range[MT6360_RANGE_IPREC], val->intval, &sel); 438 + return regmap_update_bits(mci->regmap, 439 + MT6360_PMU_CHG_CTRL8, 440 + MT6360_IPREC_MASK, 441 + sel << MT6360_IPREC_SHFT); 442 + } 443 + 444 + static int mt6360_charger_set_ieoc(struct mt6360_chg_info *mci, 445 + const union power_supply_propval *val) 446 + { 447 + u32 sel; 448 + 449 + linear_range_get_selector_within(&mt6360_chg_range[MT6360_RANGE_IEOC], val->intval, &sel); 450 + return regmap_update_bits(mci->regmap, 451 + MT6360_PMU_CHG_CTRL9, 452 + MT6360_IEOC_MASK, 453 + sel << MT6360_IEOC_SHFT); 454 + } 455 + 456 + static int mt6360_charger_get_property(struct power_supply *psy, 457 + enum power_supply_property psp, 458 + union power_supply_propval *val) 459 + { 460 + struct mt6360_chg_info *mci = power_supply_get_drvdata(psy); 461 + int ret = 0; 462 + 463 + switch (psp) { 464 + case POWER_SUPPLY_PROP_ONLINE: 465 + ret = mt6360_charger_get_online(mci, val); 466 + break; 467 + case POWER_SUPPLY_PROP_STATUS: 468 + ret = mt6360_charger_get_status(mci, val); 469 + break; 470 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 471 + ret = mt6360_charger_get_charge_type(mci, val); 472 + break; 473 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 474 + ret = mt6360_charger_get_ichg(mci, val); 475 + break; 476 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: 477 + ret = mt6360_charger_get_max_ichg(mci, val); 478 + break; 479 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 480 + ret = mt6360_charger_get_cv(mci, val); 481 + break; 482 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX: 483 + ret = mt6360_charger_get_max_cv(mci, val); 484 + break; 485 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 486 + ret = mt6360_charger_get_aicr(mci, val); 487 + break; 488 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 489 + ret = mt6360_charger_get_mivr(mci, val); 490 + break; 491 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 492 + ret = mt6360_charger_get_iprechg(mci, val); 493 + break; 494 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 495 + ret = mt6360_charger_get_ieoc(mci, val); 496 + break; 497 + case POWER_SUPPLY_PROP_USB_TYPE: 498 + val->intval = mci->psy_usb_type; 499 + break; 500 + default: 501 + ret = -ENODATA; 502 + } 503 + return ret; 504 + } 505 + 506 + static int mt6360_charger_set_property(struct power_supply *psy, 507 + enum power_supply_property psp, 508 + const union power_supply_propval *val) 509 + { 510 + struct mt6360_chg_info *mci = power_supply_get_drvdata(psy); 511 + int ret; 512 + 513 + switch (psp) { 514 + case POWER_SUPPLY_PROP_ONLINE: 515 + ret = mt6360_charger_set_online(mci, val); 516 + break; 517 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 518 + ret = mt6360_charger_set_ichg(mci, val); 519 + break; 520 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 521 + ret = mt6360_charger_set_cv(mci, val); 522 + break; 523 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 524 + ret = mt6360_charger_set_aicr(mci, val); 525 + break; 526 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 527 + ret = mt6360_charger_set_mivr(mci, val); 528 + break; 529 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 530 + ret = mt6360_charger_set_iprechg(mci, val); 531 + break; 532 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 533 + ret = mt6360_charger_set_ieoc(mci, val); 534 + break; 535 + default: 536 + ret = -EINVAL; 537 + } 538 + return ret; 539 + } 540 + 541 + static int mt6360_charger_property_is_writeable(struct power_supply *psy, 542 + enum power_supply_property psp) 543 + { 544 + switch (psp) { 545 + case POWER_SUPPLY_PROP_ONLINE: 546 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 547 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 548 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 549 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 550 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 551 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 552 + return 1; 553 + default: 554 + return 0; 555 + } 556 + } 557 + 558 + static enum power_supply_property mt6360_charger_properties[] = { 559 + POWER_SUPPLY_PROP_ONLINE, 560 + POWER_SUPPLY_PROP_STATUS, 561 + POWER_SUPPLY_PROP_CHARGE_TYPE, 562 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 563 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, 564 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 565 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX, 566 + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 567 + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT, 568 + POWER_SUPPLY_PROP_PRECHARGE_CURRENT, 569 + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, 570 + POWER_SUPPLY_PROP_USB_TYPE, 571 + }; 572 + 573 + static const struct power_supply_desc mt6360_charger_desc = { 574 + .type = POWER_SUPPLY_TYPE_USB, 575 + .properties = mt6360_charger_properties, 576 + .num_properties = ARRAY_SIZE(mt6360_charger_properties), 577 + .get_property = mt6360_charger_get_property, 578 + .set_property = mt6360_charger_set_property, 579 + .property_is_writeable = mt6360_charger_property_is_writeable, 580 + .usb_types = mt6360_charger_usb_types, 581 + .num_usb_types = ARRAY_SIZE(mt6360_charger_usb_types), 582 + }; 583 + 584 + static const struct regulator_ops mt6360_chg_otg_ops = { 585 + .list_voltage = regulator_list_voltage_linear, 586 + .enable = regulator_enable_regmap, 587 + .disable = regulator_disable_regmap, 588 + .is_enabled = regulator_is_enabled_regmap, 589 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 590 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 591 + }; 592 + 593 + static const struct regulator_desc mt6360_otg_rdesc = { 594 + .of_match = "usb-otg-vbus", 595 + .name = "usb-otg-vbus", 596 + .ops = &mt6360_chg_otg_ops, 597 + .owner = THIS_MODULE, 598 + .type = REGULATOR_VOLTAGE, 599 + .min_uV = 4425000, 600 + .uV_step = 25000, 601 + .n_voltages = 57, 602 + .vsel_reg = MT6360_PMU_CHG_CTRL5, 603 + .vsel_mask = MT6360_VOBST_MASK, 604 + .enable_reg = MT6360_PMU_CHG_CTRL1, 605 + .enable_mask = MT6360_OPA_MODE_MASK, 606 + }; 607 + 608 + static irqreturn_t mt6360_pmu_attach_i_handler(int irq, void *data) 609 + { 610 + struct mt6360_chg_info *mci = data; 611 + int ret; 612 + unsigned int usb_status; 613 + int last_usb_type; 614 + 615 + mutex_lock(&mci->chgdet_lock); 616 + if (!mci->bc12_en) { 617 + dev_warn(mci->dev, "Received attach interrupt, bc12 disabled, ignore irq\n"); 618 + goto out; 619 + } 620 + last_usb_type = mci->psy_usb_type; 621 + /* Plug in */ 622 + ret = regmap_read(mci->regmap, MT6360_PMU_USB_STATUS1, &usb_status); 623 + if (ret < 0) 624 + goto out; 625 + usb_status &= MT6360_USB_STATUS_MASK; 626 + usb_status >>= MT6360_USB_STATUS_SHFT; 627 + switch (usb_status) { 628 + case MT6360_CHG_TYPE_NOVBUS: 629 + dev_dbg(mci->dev, "Received attach interrupt, no vbus\n"); 630 + goto out; 631 + case MT6360_CHG_TYPE_UNDER_GOING: 632 + dev_dbg(mci->dev, "Received attach interrupt, under going...\n"); 633 + goto out; 634 + case MT6360_CHG_TYPE_SDP: 635 + mci->psy_usb_type = POWER_SUPPLY_USB_TYPE_SDP; 636 + break; 637 + case MT6360_CHG_TYPE_SDPNSTD: 638 + mci->psy_usb_type = POWER_SUPPLY_USB_TYPE_SDP; 639 + break; 640 + case MT6360_CHG_TYPE_CDP: 641 + mci->psy_usb_type = POWER_SUPPLY_USB_TYPE_CDP; 642 + break; 643 + case MT6360_CHG_TYPE_DCP: 644 + mci->psy_usb_type = POWER_SUPPLY_USB_TYPE_DCP; 645 + break; 646 + case MT6360_CHG_TYPE_DISABLE_BC12: 647 + dev_dbg(mci->dev, "Received attach interrupt, bc12 detect not enable\n"); 648 + goto out; 649 + default: 650 + mci->psy_usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN; 651 + dev_dbg(mci->dev, "Received attach interrupt, reserved address\n"); 652 + goto out; 653 + } 654 + 655 + dev_dbg(mci->dev, "Received attach interrupt, chg_type = %d\n", mci->psy_usb_type); 656 + if (last_usb_type != mci->psy_usb_type) 657 + power_supply_changed(mci->psy); 658 + out: 659 + mutex_unlock(&mci->chgdet_lock); 660 + return IRQ_HANDLED; 661 + } 662 + 663 + static void mt6360_handle_chrdet_ext_evt(struct mt6360_chg_info *mci) 664 + { 665 + int ret; 666 + bool pwr_rdy; 667 + 668 + mutex_lock(&mci->chgdet_lock); 669 + ret = mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); 670 + if (ret < 0) 671 + goto out; 672 + if (mci->pwr_rdy == pwr_rdy) { 673 + dev_dbg(mci->dev, "Received vbus interrupt, pwr_rdy is same(%d)\n", pwr_rdy); 674 + goto out; 675 + } 676 + mci->pwr_rdy = pwr_rdy; 677 + dev_dbg(mci->dev, "Received vbus interrupt, pwr_rdy = %d\n", pwr_rdy); 678 + if (!pwr_rdy) { 679 + mci->psy_usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN; 680 + power_supply_changed(mci->psy); 681 + 682 + } 683 + ret = regmap_update_bits(mci->regmap, 684 + MT6360_PMU_DEVICE_TYPE, 685 + MT6360_USBCHGEN_MASK, 686 + pwr_rdy ? MT6360_USBCHGEN_MASK : 0); 687 + if (ret < 0) 688 + goto out; 689 + mci->bc12_en = pwr_rdy; 690 + out: 691 + mutex_unlock(&mci->chgdet_lock); 692 + } 693 + 694 + static void mt6360_chrdet_work(struct work_struct *work) 695 + { 696 + struct mt6360_chg_info *mci = (struct mt6360_chg_info *)container_of( 697 + work, struct mt6360_chg_info, chrdet_work); 698 + 699 + mt6360_handle_chrdet_ext_evt(mci); 700 + } 701 + 702 + static irqreturn_t mt6360_pmu_chrdet_ext_evt_handler(int irq, void *data) 703 + { 704 + struct mt6360_chg_info *mci = data; 705 + 706 + mt6360_handle_chrdet_ext_evt(mci); 707 + return IRQ_HANDLED; 708 + } 709 + 710 + static int mt6360_chg_irq_register(struct platform_device *pdev) 711 + { 712 + const struct { 713 + const char *name; 714 + irq_handler_t handler; 715 + } irq_descs[] = { 716 + { "attach_i", mt6360_pmu_attach_i_handler }, 717 + { "chrdet_ext_evt", mt6360_pmu_chrdet_ext_evt_handler } 718 + }; 719 + int i, ret; 720 + 721 + for (i = 0; i < ARRAY_SIZE(irq_descs); i++) { 722 + ret = platform_get_irq_byname(pdev, irq_descs[i].name); 723 + if (ret < 0) 724 + return ret; 725 + 726 + ret = devm_request_threaded_irq(&pdev->dev, ret, NULL, 727 + irq_descs[i].handler, 728 + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 729 + irq_descs[i].name, 730 + platform_get_drvdata(pdev)); 731 + if (ret < 0) 732 + return dev_err_probe(&pdev->dev, ret, "Failed to request %s irq\n", 733 + irq_descs[i].name); 734 + } 735 + 736 + return 0; 737 + } 738 + 739 + static u32 mt6360_vinovp_trans_to_sel(u32 val) 740 + { 741 + u32 vinovp_tbl[] = { 5500000, 6500000, 11000000, 14500000 }; 742 + int i; 743 + 744 + /* Select the smaller and equal supported value */ 745 + for (i = 0; i < ARRAY_SIZE(vinovp_tbl)-1; i++) { 746 + if (val < vinovp_tbl[i+1]) 747 + break; 748 + } 749 + return i; 750 + } 751 + 752 + static int mt6360_chg_init_setting(struct mt6360_chg_info *mci) 753 + { 754 + int ret; 755 + u32 sel; 756 + 757 + sel = mt6360_vinovp_trans_to_sel(mci->vinovp); 758 + ret = regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL19, 759 + MT6360_VINOVP_MASK, sel << MT6360_VINOVP_SHFT); 760 + if (ret) 761 + return dev_err_probe(mci->dev, ret, "%s: Failed to apply vinovp\n", __func__); 762 + ret = regmap_update_bits(mci->regmap, MT6360_PMU_DEVICE_TYPE, 763 + MT6360_USBCHGEN_MASK, 0); 764 + if (ret) 765 + return dev_err_probe(mci->dev, ret, "%s: Failed to disable bc12\n", __func__); 766 + ret = regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL2, 767 + MT6360_IINLMTSEL_MASK, 768 + MT6360_IINLMTSEL_AICR << 769 + MT6360_IINLMTSEL_SHFT); 770 + if (ret) 771 + return dev_err_probe(mci->dev, ret, 772 + "%s: Failed to switch iinlmtsel to aicr\n", __func__); 773 + usleep_range(5000, 6000); 774 + ret = regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL3, 775 + MT6360_ILIM_EN_MASK, 0); 776 + if (ret) 777 + return dev_err_probe(mci->dev, ret, 778 + "%s: Failed to disable ilim\n", __func__); 779 + ret = regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL10, 780 + MT6360_OTG_OC_MASK, MT6360_OTG_OC_MASK); 781 + if (ret) 782 + return dev_err_probe(mci->dev, ret, 783 + "%s: Failed to config otg oc to 3A\n", __func__); 784 + return 0; 785 + } 786 + 787 + static int mt6360_charger_probe(struct platform_device *pdev) 788 + { 789 + struct mt6360_chg_info *mci; 790 + struct power_supply_config charger_cfg = {}; 791 + struct regulator_config config = { }; 792 + int ret; 793 + 794 + mci = devm_kzalloc(&pdev->dev, sizeof(*mci), GFP_KERNEL); 795 + if (!mci) 796 + return -ENOMEM; 797 + 798 + mci->dev = &pdev->dev; 799 + mci->vinovp = 6500000; 800 + mutex_init(&mci->chgdet_lock); 801 + platform_set_drvdata(pdev, mci); 802 + devm_work_autocancel(&pdev->dev, &mci->chrdet_work, mt6360_chrdet_work); 803 + 804 + ret = device_property_read_u32(&pdev->dev, "richtek,vinovp-microvolt", &mci->vinovp); 805 + if (ret) 806 + dev_warn(&pdev->dev, "Failed to parse vinovp in DT, keep default 6.5v\n"); 807 + 808 + mci->regmap = dev_get_regmap(pdev->dev.parent, NULL); 809 + if (!mci->regmap) 810 + return dev_err_probe(&pdev->dev, -ENODEV, "Failed to get parent regmap\n"); 811 + 812 + ret = mt6360_chg_init_setting(mci); 813 + if (ret) 814 + return dev_err_probe(&pdev->dev, ret, "Failed to initial setting\n"); 815 + 816 + memcpy(&mci->psy_desc, &mt6360_charger_desc, sizeof(mci->psy_desc)); 817 + mci->psy_desc.name = dev_name(&pdev->dev); 818 + charger_cfg.drv_data = mci; 819 + charger_cfg.of_node = pdev->dev.of_node; 820 + mci->psy = devm_power_supply_register(&pdev->dev, 821 + &mci->psy_desc, &charger_cfg); 822 + if (IS_ERR(mci->psy)) 823 + return dev_err_probe(&pdev->dev, PTR_ERR(mci->psy), 824 + "Failed to register power supply dev\n"); 825 + 826 + 827 + ret = mt6360_chg_irq_register(pdev); 828 + if (ret) 829 + return dev_err_probe(&pdev->dev, ret, "Failed to register irqs\n"); 830 + 831 + config.dev = &pdev->dev; 832 + config.regmap = mci->regmap; 833 + mci->otg_rdev = devm_regulator_register(&pdev->dev, &mt6360_otg_rdesc, 834 + &config); 835 + if (IS_ERR(mci->otg_rdev)) 836 + return PTR_ERR(mci->otg_rdev); 837 + 838 + schedule_work(&mci->chrdet_work); 839 + 840 + return 0; 841 + } 842 + 843 + static const struct of_device_id __maybe_unused mt6360_charger_of_id[] = { 844 + { .compatible = "mediatek,mt6360-chg", }, 845 + {}, 846 + }; 847 + MODULE_DEVICE_TABLE(of, mt6360_charger_of_id); 848 + 849 + static const struct platform_device_id mt6360_charger_id[] = { 850 + { "mt6360-chg", 0 }, 851 + {}, 852 + }; 853 + MODULE_DEVICE_TABLE(platform, mt6360_charger_id); 854 + 855 + static struct platform_driver mt6360_charger_driver = { 856 + .driver = { 857 + .name = "mt6360-chg", 858 + .of_match_table = of_match_ptr(mt6360_charger_of_id), 859 + }, 860 + .probe = mt6360_charger_probe, 861 + .id_table = mt6360_charger_id, 862 + }; 863 + module_platform_driver(mt6360_charger_driver); 864 + 865 + MODULE_AUTHOR("Gene Chen <gene_chen@richtek.com>"); 866 + MODULE_DESCRIPTION("MT6360 Charger Driver"); 867 + MODULE_LICENSE("GPL");
+19
drivers/power/supply/power_supply_core.c
··· 571 571 int err, len, index; 572 572 const __be32 *list; 573 573 574 + info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; 574 575 info->energy_full_design_uwh = -EINVAL; 575 576 info->charge_full_design_uah = -EINVAL; 576 577 info->voltage_min_design_uv = -EINVAL; ··· 618 617 * in enum power_supply_property. For reasoning, see 619 618 * Documentation/power/power_supply_class.rst. 620 619 */ 620 + 621 + if (!of_property_read_string(battery_np, "device-chemistry", &value)) { 622 + if (!strcmp("nickel-cadmium", value)) 623 + info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; 624 + else if (!strcmp("nickel-metal-hydride", value)) 625 + info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; 626 + else if (!strcmp("lithium-ion", value)) 627 + /* Imprecise lithium-ion type */ 628 + info->technology = POWER_SUPPLY_TECHNOLOGY_LION; 629 + else if (!strcmp("lithium-ion-polymer", value)) 630 + info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; 631 + else if (!strcmp("lithium-ion-iron-phosphate", value)) 632 + info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; 633 + else if (!strcmp("lithium-ion-manganese-oxide", value)) 634 + info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; 635 + else 636 + dev_warn(&psy->dev, "%s unknown battery type\n", value); 637 + } 621 638 622 639 of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", 623 640 &info->energy_full_design_uwh);
+1 -4
drivers/power/supply/qcom_smbb.c
··· 929 929 int irq; 930 930 931 931 irq = platform_get_irq_byname(pdev, smbb_charger_irqs[i].name); 932 - if (irq < 0) { 933 - dev_err(&pdev->dev, "failed to get irq '%s'\n", 934 - smbb_charger_irqs[i].name); 932 + if (irq < 0) 935 933 return irq; 936 - } 937 934 938 935 smbb_charger_irqs[i].handler(irq, chg); 939 936
+38
drivers/power/supply/rn5t618_power.c
··· 9 9 #include <linux/device.h> 10 10 #include <linux/bitops.h> 11 11 #include <linux/errno.h> 12 + #include <linux/iio/consumer.h> 12 13 #include <linux/init.h> 13 14 #include <linux/interrupt.h> 14 15 #include <linux/module.h> 15 16 #include <linux/mfd/rn5t618.h> 17 + #include <linux/of_device.h> 16 18 #include <linux/platform_device.h> 17 19 #include <linux/power_supply.h> 18 20 #include <linux/regmap.h> ··· 66 64 struct power_supply *battery; 67 65 struct power_supply *usb; 68 66 struct power_supply *adp; 67 + struct iio_channel *channel_vusb; 68 + struct iio_channel *channel_vadp; 69 69 int irq; 70 70 }; 71 71 ··· 81 77 static enum power_supply_property rn5t618_usb_props[] = { 82 78 /* input current limit is not very accurate */ 83 79 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 80 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 84 81 POWER_SUPPLY_PROP_STATUS, 85 82 POWER_SUPPLY_PROP_USB_TYPE, 86 83 POWER_SUPPLY_PROP_ONLINE, ··· 90 85 static enum power_supply_property rn5t618_adp_props[] = { 91 86 /* input current limit is not very accurate */ 92 87 POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 88 + POWER_SUPPLY_PROP_VOLTAGE_NOW, 93 89 POWER_SUPPLY_PROP_STATUS, 94 90 POWER_SUPPLY_PROP_ONLINE, 95 91 }; ··· 470 464 471 465 val->intval = FROM_CUR_REG(regval); 472 466 break; 467 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 468 + if (!info->channel_vadp) 469 + return -ENODATA; 470 + 471 + ret = iio_read_channel_processed_scale(info->channel_vadp, &val->intval, 1000); 472 + if (ret < 0) 473 + return ret; 474 + 475 + break; 473 476 default: 474 477 return -EINVAL; 475 478 } ··· 604 589 val->intval = FROM_CUR_REG(regval); 605 590 } 606 591 break; 592 + case POWER_SUPPLY_PROP_VOLTAGE_NOW: 593 + if (!info->channel_vusb) 594 + return -ENODATA; 595 + 596 + ret = iio_read_channel_processed_scale(info->channel_vusb, &val->intval, 1000); 597 + if (ret < 0) 598 + return ret; 599 + 600 + break; 607 601 default: 608 602 return -EINVAL; 609 603 } ··· 734 710 info->irq = -1; 735 711 736 712 platform_set_drvdata(pdev, info); 713 + 714 + info->channel_vusb = devm_iio_channel_get(&pdev->dev, "vusb"); 715 + if (IS_ERR(info->channel_vusb)) { 716 + if (PTR_ERR(info->channel_vusb) == -ENODEV) 717 + return -EPROBE_DEFER; 718 + return PTR_ERR(info->channel_vusb); 719 + } 720 + 721 + info->channel_vadp = devm_iio_channel_get(&pdev->dev, "vadp"); 722 + if (IS_ERR(info->channel_vadp)) { 723 + if (PTR_ERR(info->channel_vadp) == -ENODEV) 724 + return -EPROBE_DEFER; 725 + return PTR_ERR(info->channel_vadp); 726 + } 737 727 738 728 ret = regmap_read(info->rn5t618->regmap, RN5T618_CONTROL, &v); 739 729 if (ret)
+11 -5
drivers/power/supply/sbs-battery.c
··· 31 31 REG_CURRENT_AVG, 32 32 REG_MAX_ERR, 33 33 REG_CAPACITY, 34 - REG_TIME_TO_EMPTY, 35 - REG_TIME_TO_FULL, 34 + REG_TIME_TO_EMPTY_NOW, 35 + REG_TIME_TO_EMPTY_AVG, 36 + REG_TIME_TO_FULL_AVG, 36 37 REG_STATUS, 37 38 REG_CAPACITY_LEVEL, 38 39 REG_CYCLE_COUNT, ··· 103 102 [REG_TEMPERATURE] = 104 103 SBS_DATA(POWER_SUPPLY_PROP_TEMP, 0x08, 0, 65535), 105 104 [REG_VOLTAGE] = 106 - SBS_DATA(POWER_SUPPLY_PROP_VOLTAGE_NOW, 0x09, 0, 20000), 105 + SBS_DATA(POWER_SUPPLY_PROP_VOLTAGE_NOW, 0x09, 0, 65535), 107 106 [REG_CURRENT_NOW] = 108 107 SBS_DATA(POWER_SUPPLY_PROP_CURRENT_NOW, 0x0A, -32768, 32767), 109 108 [REG_CURRENT_AVG] = ··· 120 119 SBS_DATA(POWER_SUPPLY_PROP_ENERGY_FULL, 0x10, 0, 65535), 121 120 [REG_FULL_CHARGE_CAPACITY_CHARGE] = 122 121 SBS_DATA(POWER_SUPPLY_PROP_CHARGE_FULL, 0x10, 0, 65535), 123 - [REG_TIME_TO_EMPTY] = 122 + [REG_TIME_TO_EMPTY_NOW] = 123 + SBS_DATA(POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, 0x11, 0, 65535), 124 + [REG_TIME_TO_EMPTY_AVG] = 124 125 SBS_DATA(POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, 0x12, 0, 65535), 125 - [REG_TIME_TO_FULL] = 126 + [REG_TIME_TO_FULL_AVG] = 126 127 SBS_DATA(POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, 0x13, 0, 65535), 127 128 [REG_CHARGE_CURRENT] = 128 129 SBS_DATA(POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, 0x14, 0, 65535), ··· 168 165 POWER_SUPPLY_PROP_CAPACITY, 169 166 POWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN, 170 167 POWER_SUPPLY_PROP_TEMP, 168 + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, 171 169 POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, 172 170 POWER_SUPPLY_PROP_TIME_TO_FULL_AVG, 173 171 POWER_SUPPLY_PROP_SERIAL_NUMBER, ··· 752 748 val->intval -= TEMP_KELVIN_TO_CELSIUS; 753 749 break; 754 750 751 + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: 755 752 case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG: 756 753 case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG: 757 754 /* sbs provides time to empty and time to full in minutes. ··· 971 966 case POWER_SUPPLY_PROP_CURRENT_NOW: 972 967 case POWER_SUPPLY_PROP_CURRENT_AVG: 973 968 case POWER_SUPPLY_PROP_TEMP: 969 + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: 974 970 case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG: 975 971 case POWER_SUPPLY_PROP_TIME_TO_FULL_AVG: 976 972 case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
+1 -3
drivers/power/supply/sc27xx_fuel_gauge.c
··· 1229 1229 } 1230 1230 1231 1231 irq = platform_get_irq(pdev, 0); 1232 - if (irq < 0) { 1233 - dev_err(dev, "no irq resource specified\n"); 1232 + if (irq < 0) 1234 1233 return irq; 1235 - } 1236 1234 1237 1235 ret = devm_request_threaded_irq(data->dev, irq, NULL, 1238 1236 sc27xx_fgu_interrupt,
+252 -19
drivers/power/supply/smb347-charger.c
··· 18 18 #include <linux/power_supply.h> 19 19 #include <linux/property.h> 20 20 #include <linux/regmap.h> 21 + #include <linux/regulator/driver.h> 21 22 22 23 #include <dt-bindings/power/summit,smb347-charger.h> 23 24 ··· 56 55 #define CFG_PIN_EN_CTRL_ACTIVE_LOW 0x60 57 56 #define CFG_PIN_EN_APSD_IRQ BIT(1) 58 57 #define CFG_PIN_EN_CHARGER_ERROR BIT(2) 58 + #define CFG_PIN_EN_CTRL BIT(4) 59 59 #define CFG_THERM 0x07 60 60 #define CFG_THERM_SOFT_HOT_COMPENSATION_MASK 0x03 61 61 #define CFG_THERM_SOFT_HOT_COMPENSATION_SHIFT 0 ··· 64 62 #define CFG_THERM_SOFT_COLD_COMPENSATION_SHIFT 2 65 63 #define CFG_THERM_MONITOR_DISABLED BIT(4) 66 64 #define CFG_SYSOK 0x08 65 + #define CFG_SYSOK_INOK_ACTIVE_HIGH BIT(0) 67 66 #define CFG_SYSOK_SUSPEND_HARD_LIMIT_DISABLED BIT(2) 68 67 #define CFG_OTHER 0x09 69 68 #define CFG_OTHER_RID_MASK 0xc0 70 69 #define CFG_OTHER_RID_ENABLED_AUTO_OTG 0xc0 71 70 #define CFG_OTG 0x0a 72 71 #define CFG_OTG_TEMP_THRESHOLD_MASK 0x30 72 + #define CFG_OTG_CURRENT_LIMIT_250mA BIT(2) 73 + #define CFG_OTG_CURRENT_LIMIT_750mA BIT(3) 73 74 #define CFG_OTG_TEMP_THRESHOLD_SHIFT 4 74 75 #define CFG_OTG_CC_COMPENSATION_MASK 0xc0 75 76 #define CFG_OTG_CC_COMPENSATION_SHIFT 6 ··· 96 91 #define CMD_A 0x30 97 92 #define CMD_A_CHG_ENABLED BIT(1) 98 93 #define CMD_A_SUSPEND_ENABLED BIT(2) 94 + #define CMD_A_OTG_ENABLED BIT(4) 99 95 #define CMD_A_ALLOW_WRITE BIT(7) 100 96 #define CMD_B 0x31 101 97 #define CMD_C 0x33 ··· 138 132 * @regmap: pointer to driver regmap 139 133 * @mains: power_supply instance for AC/DC power 140 134 * @usb: power_supply instance for USB power 135 + * @usb_rdev: USB VBUS regulator device 141 136 * @id: SMB charger ID 142 137 * @mains_online: is AC/DC input connected 143 138 * @usb_online: is USB input connected 144 - * @charging_enabled: is charging enabled 145 139 * @irq_unsupported: is interrupt unsupported by SMB hardware 140 + * @usb_vbus_enabled: is USB VBUS powered by SMB charger 146 141 * @max_charge_current: maximum current (in uA) the battery can be charged 147 142 * @max_charge_voltage: maximum voltage (in uV) the battery can be charged 148 143 * @pre_charge_current: current (in uA) to use in pre-charging phase ··· 174 167 * @use_usb_otg: USB OTG output can be used (not implemented yet) 175 168 * @enable_control: how charging enable/disable is controlled 176 169 * (driver/pin controls) 170 + * @inok_polarity: polarity of INOK signal which denotes presence of external 171 + * power supply 177 172 * 178 173 * @use_main, @use_usb, and @use_usb_otg are means to enable/disable 179 174 * hardware support for these. This is useful when we want to have for ··· 198 189 struct regmap *regmap; 199 190 struct power_supply *mains; 200 191 struct power_supply *usb; 192 + struct regulator_dev *usb_rdev; 201 193 unsigned int id; 202 194 bool mains_online; 203 195 bool usb_online; 204 - bool charging_enabled; 205 196 bool irq_unsupported; 197 + bool usb_vbus_enabled; 206 198 207 199 unsigned int max_charge_current; 208 200 unsigned int max_charge_voltage; ··· 224 214 bool use_usb; 225 215 bool use_usb_otg; 226 216 unsigned int enable_control; 217 + unsigned int inok_polarity; 227 218 }; 228 219 229 220 enum smb_charger_chipid { ··· 369 358 370 359 static int smb347_charging_set(struct smb347_charger *smb, bool enable) 371 360 { 372 - int ret = 0; 373 - 374 361 if (smb->enable_control != SMB3XX_CHG_ENABLE_SW) { 375 362 dev_dbg(smb->dev, "charging enable/disable in SW disabled\n"); 376 363 return 0; 377 364 } 378 365 379 - if (smb->charging_enabled != enable) { 380 - ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED, 381 - enable ? CMD_A_CHG_ENABLED : 0); 382 - if (!ret) 383 - smb->charging_enabled = enable; 366 + if (enable && smb->usb_vbus_enabled) { 367 + dev_dbg(smb->dev, "charging not enabled because USB is in host mode\n"); 368 + return 0; 384 369 } 385 370 386 - return ret; 371 + return regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED, 372 + enable ? CMD_A_CHG_ENABLED : 0); 387 373 } 388 374 389 375 static inline int smb347_charging_enable(struct smb347_charger *smb) ··· 679 671 * 680 672 * Returns %0 on success and negative errno in case of failure. 681 673 */ 682 - static int smb347_set_writable(struct smb347_charger *smb, bool writable) 674 + static int smb347_set_writable(struct smb347_charger *smb, bool writable, 675 + bool irq_toggle) 683 676 { 684 - return regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE, 685 - writable ? CMD_A_ALLOW_WRITE : 0); 677 + struct i2c_client *client = to_i2c_client(smb->dev); 678 + int ret; 679 + 680 + if (writable && irq_toggle && !smb->irq_unsupported) 681 + disable_irq(client->irq); 682 + 683 + ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE, 684 + writable ? CMD_A_ALLOW_WRITE : 0); 685 + 686 + if ((!writable || ret) && irq_toggle && !smb->irq_unsupported) 687 + enable_irq(client->irq); 688 + 689 + return ret; 686 690 } 687 691 688 692 static int smb347_hw_init(struct smb347_charger *smb) ··· 702 682 unsigned int val; 703 683 int ret; 704 684 705 - ret = smb347_set_writable(smb, true); 685 + ret = smb347_set_writable(smb, true, false); 706 686 if (ret < 0) 707 687 return ret; 708 688 ··· 744 724 if (ret < 0) 745 725 goto fail; 746 726 727 + /* Activate pin control, making it writable. */ 728 + switch (smb->enable_control) { 729 + case SMB3XX_CHG_ENABLE_PIN_ACTIVE_LOW: 730 + case SMB3XX_CHG_ENABLE_PIN_ACTIVE_HIGH: 731 + ret = regmap_set_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL); 732 + if (ret < 0) 733 + goto fail; 734 + } 735 + 747 736 /* 748 737 * Make the charging functionality controllable by a write to the 749 738 * command register unless pin control is specified in the platform ··· 787 758 ret = smb347_start_stop_charging(smb); 788 759 789 760 fail: 790 - smb347_set_writable(smb, false); 761 + smb347_set_writable(smb, false, false); 791 762 return ret; 792 763 } 793 764 ··· 895 866 if (smb->irq_unsupported) 896 867 return 0; 897 868 898 - ret = smb347_set_writable(smb, true); 869 + ret = smb347_set_writable(smb, true, true); 899 870 if (ret < 0) 900 871 return ret; 901 872 ··· 920 891 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CHARGER_ERROR, 921 892 enable ? CFG_PIN_EN_CHARGER_ERROR : 0); 922 893 fail: 923 - smb347_set_writable(smb, false); 894 + smb347_set_writable(smb, false, true); 924 895 return ret; 925 896 } 926 897 ··· 948 919 if (!client->irq) 949 920 return 0; 950 921 951 - ret = smb347_set_writable(smb, true); 922 + ret = smb347_set_writable(smb, true, false); 952 923 if (ret < 0) 953 924 return ret; 954 925 ··· 960 931 CFG_STAT_ACTIVE_HIGH | CFG_STAT_DISABLED, 961 932 CFG_STAT_DISABLED); 962 933 963 - smb347_set_writable(smb, false); 934 + smb347_set_writable(smb, false, false); 964 935 965 936 if (ret < 0) { 966 937 dev_warn(smb->dev, "failed to initialize IRQ: %d\n", ret); ··· 1270 1241 /* Select charging control */ 1271 1242 device_property_read_u32(dev, "summit,enable-charge-control", 1272 1243 &smb->enable_control); 1244 + 1245 + /* 1246 + * Polarity of INOK signal indicating presence of external power 1247 + * supply connected to the charger. 1248 + */ 1249 + device_property_read_u32(dev, "summit,inok-polarity", 1250 + &smb->inok_polarity); 1273 1251 } 1274 1252 1275 1253 static int smb347_get_battery_info(struct smb347_charger *smb) ··· 1328 1292 return 0; 1329 1293 } 1330 1294 1295 + static int smb347_usb_vbus_get_current_limit(struct regulator_dev *rdev) 1296 + { 1297 + struct smb347_charger *smb = rdev_get_drvdata(rdev); 1298 + unsigned int val; 1299 + int ret; 1300 + 1301 + ret = regmap_read(smb->regmap, CFG_OTG, &val); 1302 + if (ret < 0) 1303 + return ret; 1304 + 1305 + /* 1306 + * It's unknown what happens if this bit is unset due to lack of 1307 + * access to the datasheet, assume it's limit-enable. 1308 + */ 1309 + if (!(val & CFG_OTG_CURRENT_LIMIT_250mA)) 1310 + return 0; 1311 + 1312 + return val & CFG_OTG_CURRENT_LIMIT_750mA ? 750000 : 250000; 1313 + } 1314 + 1315 + static int smb347_usb_vbus_set_new_current_limit(struct smb347_charger *smb, 1316 + int max_uA) 1317 + { 1318 + const unsigned int mask = CFG_OTG_CURRENT_LIMIT_750mA | 1319 + CFG_OTG_CURRENT_LIMIT_250mA; 1320 + unsigned int val = CFG_OTG_CURRENT_LIMIT_250mA; 1321 + int ret; 1322 + 1323 + if (max_uA >= 750000) 1324 + val |= CFG_OTG_CURRENT_LIMIT_750mA; 1325 + 1326 + ret = regmap_update_bits(smb->regmap, CFG_OTG, mask, val); 1327 + if (ret < 0) 1328 + dev_err(smb->dev, "failed to change USB current limit\n"); 1329 + 1330 + return ret; 1331 + } 1332 + 1333 + static int smb347_usb_vbus_set_current_limit(struct regulator_dev *rdev, 1334 + int min_uA, int max_uA) 1335 + { 1336 + struct smb347_charger *smb = rdev_get_drvdata(rdev); 1337 + int ret; 1338 + 1339 + ret = smb347_set_writable(smb, true, true); 1340 + if (ret < 0) 1341 + return ret; 1342 + 1343 + ret = smb347_usb_vbus_set_new_current_limit(smb, max_uA); 1344 + smb347_set_writable(smb, false, true); 1345 + 1346 + return ret; 1347 + } 1348 + 1349 + static int smb347_usb_vbus_regulator_enable(struct regulator_dev *rdev) 1350 + { 1351 + struct smb347_charger *smb = rdev_get_drvdata(rdev); 1352 + int ret, max_uA; 1353 + 1354 + ret = smb347_set_writable(smb, true, true); 1355 + if (ret < 0) 1356 + return ret; 1357 + 1358 + smb347_charging_disable(smb); 1359 + 1360 + if (device_property_read_bool(&rdev->dev, "summit,needs-inok-toggle")) { 1361 + unsigned int sysok = 0; 1362 + 1363 + if (smb->inok_polarity == SMB3XX_SYSOK_INOK_ACTIVE_LOW) 1364 + sysok = CFG_SYSOK_INOK_ACTIVE_HIGH; 1365 + 1366 + /* 1367 + * VBUS won't be powered if INOK is active, so we need to 1368 + * manually disable INOK on some platforms. 1369 + */ 1370 + ret = regmap_update_bits(smb->regmap, CFG_SYSOK, 1371 + CFG_SYSOK_INOK_ACTIVE_HIGH, sysok); 1372 + if (ret < 0) { 1373 + dev_err(smb->dev, "failed to disable INOK\n"); 1374 + goto done; 1375 + } 1376 + } 1377 + 1378 + ret = smb347_usb_vbus_get_current_limit(rdev); 1379 + if (ret < 0) { 1380 + dev_err(smb->dev, "failed to get USB VBUS current limit\n"); 1381 + goto done; 1382 + } 1383 + 1384 + max_uA = ret; 1385 + 1386 + ret = smb347_usb_vbus_set_new_current_limit(smb, 250000); 1387 + if (ret < 0) { 1388 + dev_err(smb->dev, "failed to preset USB VBUS current limit\n"); 1389 + goto done; 1390 + } 1391 + 1392 + ret = regmap_set_bits(smb->regmap, CMD_A, CMD_A_OTG_ENABLED); 1393 + if (ret < 0) { 1394 + dev_err(smb->dev, "failed to enable USB VBUS\n"); 1395 + goto done; 1396 + } 1397 + 1398 + smb->usb_vbus_enabled = true; 1399 + 1400 + ret = smb347_usb_vbus_set_new_current_limit(smb, max_uA); 1401 + if (ret < 0) { 1402 + dev_err(smb->dev, "failed to restore USB VBUS current limit\n"); 1403 + goto done; 1404 + } 1405 + done: 1406 + smb347_set_writable(smb, false, true); 1407 + 1408 + return ret; 1409 + } 1410 + 1411 + static int smb347_usb_vbus_regulator_disable(struct regulator_dev *rdev) 1412 + { 1413 + struct smb347_charger *smb = rdev_get_drvdata(rdev); 1414 + int ret; 1415 + 1416 + ret = smb347_set_writable(smb, true, true); 1417 + if (ret < 0) 1418 + return ret; 1419 + 1420 + ret = regmap_clear_bits(smb->regmap, CMD_A, CMD_A_OTG_ENABLED); 1421 + if (ret < 0) { 1422 + dev_err(smb->dev, "failed to disable USB VBUS\n"); 1423 + goto done; 1424 + } 1425 + 1426 + smb->usb_vbus_enabled = false; 1427 + 1428 + if (device_property_read_bool(&rdev->dev, "summit,needs-inok-toggle")) { 1429 + unsigned int sysok = 0; 1430 + 1431 + if (smb->inok_polarity == SMB3XX_SYSOK_INOK_ACTIVE_HIGH) 1432 + sysok = CFG_SYSOK_INOK_ACTIVE_HIGH; 1433 + 1434 + ret = regmap_update_bits(smb->regmap, CFG_SYSOK, 1435 + CFG_SYSOK_INOK_ACTIVE_HIGH, sysok); 1436 + if (ret < 0) { 1437 + dev_err(smb->dev, "failed to enable INOK\n"); 1438 + goto done; 1439 + } 1440 + } 1441 + 1442 + smb347_start_stop_charging(smb); 1443 + done: 1444 + smb347_set_writable(smb, false, true); 1445 + 1446 + return ret; 1447 + } 1448 + 1331 1449 static const struct regmap_config smb347_regmap = { 1332 1450 .reg_bits = 8, 1333 1451 .val_bits = 8, 1334 1452 .max_register = SMB347_MAX_REGISTER, 1335 1453 .volatile_reg = smb347_volatile_reg, 1336 1454 .readable_reg = smb347_readable_reg, 1455 + .cache_type = REGCACHE_FLAT, 1456 + .num_reg_defaults_raw = SMB347_MAX_REGISTER, 1457 + }; 1458 + 1459 + static const struct regulator_ops smb347_usb_vbus_regulator_ops = { 1460 + .is_enabled = regulator_is_enabled_regmap, 1461 + .enable = smb347_usb_vbus_regulator_enable, 1462 + .disable = smb347_usb_vbus_regulator_disable, 1463 + .get_current_limit = smb347_usb_vbus_get_current_limit, 1464 + .set_current_limit = smb347_usb_vbus_set_current_limit, 1337 1465 }; 1338 1466 1339 1467 static const struct power_supply_desc smb347_mains_desc = { ··· 1516 1316 .num_properties = ARRAY_SIZE(smb347_properties), 1517 1317 }; 1518 1318 1319 + static const struct regulator_desc smb347_usb_vbus_regulator_desc = { 1320 + .name = "smb347-usb-vbus", 1321 + .of_match = of_match_ptr("usb-vbus"), 1322 + .ops = &smb347_usb_vbus_regulator_ops, 1323 + .type = REGULATOR_VOLTAGE, 1324 + .owner = THIS_MODULE, 1325 + .enable_reg = CMD_A, 1326 + .enable_mask = CMD_A_OTG_ENABLED, 1327 + .enable_val = CMD_A_OTG_ENABLED, 1328 + .fixed_uV = 5000000, 1329 + .n_voltages = 1, 1330 + }; 1331 + 1519 1332 static int smb347_probe(struct i2c_client *client, 1520 1333 const struct i2c_device_id *id) 1521 1334 { 1522 1335 struct power_supply_config mains_usb_cfg = {}; 1336 + struct regulator_config usb_rdev_cfg = {}; 1523 1337 struct device *dev = &client->dev; 1524 1338 struct smb347_charger *smb; 1525 1339 int ret; ··· 1581 1367 if (ret) 1582 1368 return ret; 1583 1369 1370 + usb_rdev_cfg.dev = dev; 1371 + usb_rdev_cfg.driver_data = smb; 1372 + usb_rdev_cfg.regmap = smb->regmap; 1373 + 1374 + smb->usb_rdev = devm_regulator_register(dev, 1375 + &smb347_usb_vbus_regulator_desc, 1376 + &usb_rdev_cfg); 1377 + if (IS_ERR(smb->usb_rdev)) { 1378 + smb347_irq_disable(smb); 1379 + return PTR_ERR(smb->usb_rdev); 1380 + } 1381 + 1584 1382 return 0; 1585 1383 } 1586 1384 ··· 1600 1374 { 1601 1375 struct smb347_charger *smb = i2c_get_clientdata(client); 1602 1376 1377 + smb347_usb_vbus_regulator_disable(smb->usb_rdev); 1603 1378 smb347_irq_disable(smb); 1604 1379 1605 1380 return 0; 1381 + } 1382 + 1383 + static void smb347_shutdown(struct i2c_client *client) 1384 + { 1385 + smb347_remove(client); 1606 1386 } 1607 1387 1608 1388 static const struct i2c_device_id smb347_id[] = { ··· 1634 1402 }, 1635 1403 .probe = smb347_probe, 1636 1404 .remove = smb347_remove, 1405 + .shutdown = smb347_shutdown, 1637 1406 .id_table = smb347_id, 1638 1407 }; 1639 1408 module_i2c_driver(smb347_driver);
+4
include/dt-bindings/power/summit,smb347-charger.h
··· 16 16 #define SMB3XX_CHG_ENABLE_PIN_ACTIVE_LOW 1 17 17 #define SMB3XX_CHG_ENABLE_PIN_ACTIVE_HIGH 2 18 18 19 + /* Polarity of INOK signal */ 20 + #define SMB3XX_SYSOK_INOK_ACTIVE_LOW 0 21 + #define SMB3XX_SYSOK_INOK_ACTIVE_HIGH 1 22 + 19 23 #endif
+2
include/linux/linear_range.h
··· 41 41 int linear_range_get_selector_high(const struct linear_range *r, 42 42 unsigned int val, unsigned int *selector, 43 43 bool *found); 44 + void linear_range_get_selector_within(const struct linear_range *r, 45 + unsigned int val, unsigned int *selector); 44 46 int linear_range_get_selector_low_array(const struct linear_range *r, 45 47 int ranges, unsigned int val, 46 48 unsigned int *selector, bool *found);
+67
include/linux/platform_data/cros_ec_commands.h
··· 4228 4228 EC_DEVICE_EVENT_TRACKPAD, 4229 4229 EC_DEVICE_EVENT_DSP, 4230 4230 EC_DEVICE_EVENT_WIFI, 4231 + EC_DEVICE_EVENT_WLC, 4231 4232 }; 4232 4233 4233 4234 enum ec_device_event_param { ··· 5460 5459 5461 5460 /* Issue AP reset */ 5462 5461 #define EC_CMD_AP_RESET 0x0125 5462 + 5463 + /** 5464 + * Get the number of peripheral charge ports 5465 + */ 5466 + #define EC_CMD_PCHG_COUNT 0x0134 5467 + 5468 + #define EC_PCHG_MAX_PORTS 8 5469 + 5470 + struct ec_response_pchg_count { 5471 + uint8_t port_count; 5472 + } __ec_align1; 5473 + 5474 + /** 5475 + * Get the status of a peripheral charge port 5476 + */ 5477 + #define EC_CMD_PCHG 0x0135 5478 + 5479 + struct ec_params_pchg { 5480 + uint8_t port; 5481 + } __ec_align1; 5482 + 5483 + struct ec_response_pchg { 5484 + uint32_t error; /* enum pchg_error */ 5485 + uint8_t state; /* enum pchg_state state */ 5486 + uint8_t battery_percentage; 5487 + uint8_t unused0; 5488 + uint8_t unused1; 5489 + /* Fields added in version 1 */ 5490 + uint32_t fw_version; 5491 + uint32_t dropped_event_count; 5492 + } __ec_align2; 5493 + 5494 + enum pchg_state { 5495 + /* Charger is reset and not initialized. */ 5496 + PCHG_STATE_RESET = 0, 5497 + /* Charger is initialized or disabled. */ 5498 + PCHG_STATE_INITIALIZED, 5499 + /* Charger is enabled and ready to detect a device. */ 5500 + PCHG_STATE_ENABLED, 5501 + /* Device is in proximity. */ 5502 + PCHG_STATE_DETECTED, 5503 + /* Device is being charged. */ 5504 + PCHG_STATE_CHARGING, 5505 + /* Device is fully charged. It implies DETECTED (& not charging). */ 5506 + PCHG_STATE_FULL, 5507 + /* In download (a.k.a. firmware update) mode */ 5508 + PCHG_STATE_DOWNLOAD, 5509 + /* In download mode. Ready for receiving data. */ 5510 + PCHG_STATE_DOWNLOADING, 5511 + /* Device is ready for data communication. */ 5512 + PCHG_STATE_CONNECTED, 5513 + /* Put no more entry below */ 5514 + PCHG_STATE_COUNT, 5515 + }; 5516 + 5517 + #define EC_PCHG_STATE_TEXT { \ 5518 + [PCHG_STATE_RESET] = "RESET", \ 5519 + [PCHG_STATE_INITIALIZED] = "INITIALIZED", \ 5520 + [PCHG_STATE_ENABLED] = "ENABLED", \ 5521 + [PCHG_STATE_DETECTED] = "DETECTED", \ 5522 + [PCHG_STATE_CHARGING] = "CHARGING", \ 5523 + [PCHG_STATE_FULL] = "FULL", \ 5524 + [PCHG_STATE_DOWNLOAD] = "DOWNLOAD", \ 5525 + [PCHG_STATE_DOWNLOADING] = "DOWNLOADING", \ 5526 + [PCHG_STATE_CONNECTED] = "CONNECTED", \ 5527 + } 5463 5528 5464 5529 /*****************************************************************************/ 5465 5530 /* Voltage regulator controls */
+7 -5
include/linux/power/max17042_battery.h
··· 69 69 MAX17042_RelaxCFG = 0x2A, 70 70 MAX17042_MiscCFG = 0x2B, 71 71 MAX17042_TGAIN = 0x2C, 72 - MAx17042_TOFF = 0x2D, 72 + MAX17042_TOFF = 0x2D, 73 73 MAX17042_CGAIN = 0x2E, 74 74 MAX17042_COFF = 0x2F, 75 75 ··· 110 110 MAX17042_VFSOC = 0xFF, 111 111 }; 112 112 113 + /* Registers specific to max17055 only */ 113 114 enum max17055_register { 114 115 MAX17055_QRes = 0x0C, 116 + MAX17055_RCell = 0x14, 115 117 MAX17055_TTF = 0x20, 116 - MAX17055_V_empty = 0x3A, 117 - MAX17055_TIMER = 0x3E, 118 + MAX17055_DieTemp = 0x34, 118 119 MAX17055_USER_MEM = 0x40, 119 - MAX17055_RGAIN = 0x42, 120 + MAX17055_RGAIN = 0x43, 120 121 121 122 MAX17055_ConvgCfg = 0x49, 122 123 MAX17055_VFRemCap = 0x4A, ··· 156 155 MAX17055_AtAvCap = 0xDF, 157 156 }; 158 157 159 - /* Registers specific to max17047/50 */ 158 + /* Registers specific to max17047/50/55 */ 160 159 enum max17047_register { 161 160 MAX17047_QRTbl00 = 0x12, 162 161 MAX17047_FullSOCThr = 0x13, 163 162 MAX17047_QRTbl10 = 0x22, 164 163 MAX17047_QRTbl20 = 0x32, 165 164 MAX17047_V_empty = 0x3A, 165 + MAX17047_TIMER = 0x3E, 166 166 MAX17047_QRTbl30 = 0x42, 167 167 }; 168 168
+1
include/linux/power_supply.h
··· 352 352 */ 353 353 354 354 struct power_supply_battery_info { 355 + unsigned int technology; /* from the enum above */ 355 356 int energy_full_design_uwh; /* microWatt-hours */ 356 357 int charge_full_design_uah; /* microAmp-hours */ 357 358 int voltage_min_design_uv; /* microVolts */
+31
lib/linear_ranges.c
··· 241 241 } 242 242 EXPORT_SYMBOL_GPL(linear_range_get_selector_high); 243 243 244 + /** 245 + * linear_range_get_selector_within - return linear range selector for value 246 + * @r: pointer to linear range where selector is looked from 247 + * @val: value for which the selector is searched 248 + * @selector: address where found selector value is updated 249 + * 250 + * Return selector for which range value is closest match for given 251 + * input value. Value is matching if it is equal or lower than given 252 + * value. But return maximum selector if given value is higher than 253 + * maximum value. 254 + */ 255 + void linear_range_get_selector_within(const struct linear_range *r, 256 + unsigned int val, unsigned int *selector) 257 + { 258 + if (r->min > val) { 259 + *selector = r->min_sel; 260 + return; 261 + } 262 + 263 + if (linear_range_get_max_value(r) < val) { 264 + *selector = r->max_sel; 265 + return; 266 + } 267 + 268 + if (r->step == 0) 269 + *selector = r->min_sel; 270 + else 271 + *selector = (val - r->min) / r->step + r->min_sel; 272 + } 273 + EXPORT_SYMBOL_GPL(linear_range_get_selector_within); 274 + 244 275 MODULE_DESCRIPTION("linear-ranges helper"); 245 276 MODULE_LICENSE("GPL");