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

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

Pull power supply and reset updates from Sebastian Reichel:
"Nothing special for the power-supply subystem this time.

- power-supply core: remove faulty cooling logic

- convert all sysfs show() handlers from *printf() use sysfs_emit()

- bq25890: add dual-charger support required by Lenovo Yoga Tab 3 Pro

- bq27xxx: fix reporting critical level

- syscon-reboot: add priority property support

- new rt9467 charger driver

- new rt9471 charger driver

- new Odroid Go Ultra poweroff driver

- misc minor fixes and cleanups"

* tag 'for-v6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply: (32 commits)
power: reset: odroid-go-ultra: fix I2C dependency
power: supply: leds: explicitly include linux/leds.h
dt-bindings: power: supply: pm8941-coincell: Don't require charging properties
dt-bindings: power: supply: pm8941-coincell: Add PM8998 compatible
power: reset: add Odroid Go Ultra poweroff driver
power: supply: rt9467: Fix spelling mistake "attache" -> "attach"
power: supply: rt9471: fix using wrong ce_gpio in rt9471_probe()
power: supply: max77650: Make max77650_charger_disable() return void
Documentation: power: rt9467: Document exported sysfs entries
power: supply: rt9467: Add Richtek RT9467 charger driver
dt-bindings: power: supply: Add Richtek RT9467 battery charger
Documentation: power: rt9471: Document exported sysfs entries
power: supply: rt9471: Add Richtek RT9471 charger driver
dt-bindings: power: supply: Add Richtek RT9471 battery charger
power: supply: max1721x: Use strscpy() is more robust and safer
power: supply: test-power: use strscpy() instead of strncpy()
power: supply: bq27xxx: fix reporting critical level
power: supply: bq256xx: Init ichg/vbat value with chip default value
power: supply: collie_battery: Convert to GPIO descriptors (part 2)
power: supply: remove faulty cooling logic
...

+2909 -233
+19
Documentation/ABI/testing/sysfs-class-power-rt9467
··· 1 + What: /sys/class/power_supply/rt9467-*/sysoff_enable 2 + Date: Feb 2023 3 + KernelVersion: 6.3 4 + Contact: ChiaEn Wu <chiaen_wu@richtek.com> 5 + Description: 6 + This entry allows enabling the sysoff mode of rt9467 charger 7 + devices. 8 + If enabled and the input is removed, the internal battery FET 9 + is turned off to reduce the leakage from the BAT pin. See 10 + device datasheet for details. It's commonly used when the 11 + product enter shipping stage. After entering shipping mode, 12 + only 'VBUS' or 'Power key" pressed can make it leave this mode. 13 + 'Disable' also can help to leave it, but it's more like to 14 + abort the action before the device really enter shipping mode. 15 + 16 + Access: Read, Write 17 + Valid values: 18 + - 1: enabled 19 + - 0: disabled
+32
Documentation/ABI/testing/sysfs-class-power-rt9471
··· 1 + What: /sys/class/power_supply/rt9471-*/sysoff_enable 2 + Date: Feb 2023 3 + KernelVersion: 6.3 4 + Contact: ChiYuan Huang <cy_huang@richtek.com> 5 + Description: 6 + This entry allows enabling the sysoff mode of rt9471 charger devices. 7 + If enabled and the input is removed, the internal battery FET is turned 8 + off to reduce the leakage from the BAT pin. See device datasheet for details. 9 + It's commonly used when the product enter shipping stage. After entering 10 + shipping mode, only 'VBUS' or 'Power key" pressed can make it leave this 11 + mode. 'Disable' also can help to leave it, but it's more like to abort 12 + the action before the device really enter shipping mode. 13 + 14 + Access: Read, Write 15 + Valid values: 16 + - 1: enabled 17 + - 0: disabled 18 + 19 + What: /sys/class/power_supply/rt9471-*/port_detect_enable 20 + Date: Feb 2023 21 + KernelVersion: 6.3 22 + Contact: ChiYuan Huang <cy_huang@richtek.com> 23 + Description: 24 + This entry allows enabling the USB BC12 port detect function of rt9471 charger 25 + devices. If enabled and VBUS is inserted, device will start to do the BC12 26 + port detect and report the usb port type when port detect is done. See 27 + datasheet for details. Normally controlled when TypeC/USBPD port integrated. 28 + 29 + Access: Read, Write 30 + Valid values: 31 + - 1: enabled 32 + - 0: disabled
+4
Documentation/devicetree/bindings/power/reset/syscon-reboot.yaml
··· 42 42 $ref: /schemas/types.yaml#/definitions/uint32 43 43 description: The reset value written to the reboot register (32 bit access). 44 44 45 + priority: 46 + default: 192 47 + 45 48 required: 46 49 - compatible 47 50 - offset ··· 52 49 additionalProperties: false 53 50 54 51 allOf: 52 + - $ref: restart-handler.yaml# 55 53 - if: 56 54 not: 57 55 required:
+15 -5
Documentation/devicetree/bindings/power/supply/qcom,pm8941-coincell.yaml
··· 16 16 17 17 properties: 18 18 compatible: 19 - const: qcom,pm8941-coincell 19 + oneOf: 20 + - items: 21 + - enum: 22 + - qcom,pm8998-coincell 23 + - const: qcom,pm8941-coincell 24 + 25 + - const: qcom,pm8941-coincell 20 26 21 27 reg: 22 28 maxItems: 1 23 29 24 30 qcom,rset-ohms: 25 - description: resistance (in ohms) for current-limiting resistor 31 + description: | 32 + Resistance (in ohms) for current-limiting resistor. If unspecified, 33 + inherit the previous configuration (e.g. from bootloader or hardware 34 + default value). 26 35 enum: [ 800, 1200, 1700, 2100 ] 27 36 28 37 qcom,vset-millivolts: 29 38 $ref: /schemas/types.yaml#/definitions/uint32 30 - description: voltage (in millivolts) to apply for charging 39 + description: | 40 + Voltage (in millivolts) to apply for charging. If unspecified, inherit 41 + the previous configuration (e.g. from bootloader or hardware default 42 + value). 31 43 enum: [ 2500, 3000, 3100, 3200 ] 32 44 33 45 qcom,charger-disable: ··· 49 37 required: 50 38 - compatible 51 39 - reg 52 - - qcom,rset-ohms 53 - - qcom,vset-millivolts 54 40 55 41 additionalProperties: false 56 42
+82
Documentation/devicetree/bindings/power/supply/richtek,rt9467-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/richtek,rt9467-charger.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Richtek RT9467 Switching Battery Charger with Power Path Management 8 + 9 + maintainers: 10 + - ChiYuan Huang <cy_huang@richtek.com> 11 + - ChiaEn Wu <chiaen_wu@richtek.com> 12 + 13 + description: | 14 + RT9467 is a switch-mode single cell Li-Ion/Li-Polymer battery charger for 15 + portable applications. It integrates a synchronous PWM controller, power 16 + MOSFETs, input current sensing and regulation, high-accuracy voltage 17 + regulation, and charge termination. The charge current is regulated through 18 + integrated sensing resistors. 19 + 20 + The RT9467 also features USB On-The-Go (OTG) support. It also integrates 21 + D+/D- pin for USB host/charging port detection. 22 + 23 + Datasheet is available at 24 + https://www.richtek.com/assets/product_file/RT9467/DS9467-01.pdf 25 + 26 + properties: 27 + compatible: 28 + const: richtek,rt9467-charger 29 + 30 + reg: 31 + maxItems: 1 32 + 33 + wakeup-source: true 34 + 35 + interrupts: 36 + maxItems: 1 37 + 38 + charge-enable-gpios: 39 + description: GPIO is used to turn on and off charging. 40 + maxItems: 1 41 + 42 + usb-otg-vbus-regulator: 43 + type: object 44 + description: OTG boost regulator. 45 + unevaluatedProperties: false 46 + $ref: /schemas/regulator/regulator.yaml# 47 + 48 + properties: 49 + enable-gpios: true 50 + 51 + required: 52 + - compatible 53 + - reg 54 + - wakeup-source 55 + - interrupts 56 + 57 + additionalProperties: false 58 + 59 + examples: 60 + - | 61 + #include <dt-bindings/interrupt-controller/irq.h> 62 + #include <dt-bindings/gpio/gpio.h> 63 + i2c { 64 + #address-cells = <1>; 65 + #size-cells = <0>; 66 + 67 + charger@5b { 68 + compatible = "richtek,rt9467-charger"; 69 + reg = <0x5b>; 70 + wakeup-source; 71 + interrupts-extended = <&gpio_intc 32 IRQ_TYPE_LEVEL_LOW>; 72 + charge-enable-gpios = <&gpio26 1 GPIO_ACTIVE_LOW>; 73 + 74 + rt9467_otg_vbus: usb-otg-vbus-regulator { 75 + regulator-name = "rt9467-usb-otg-vbus"; 76 + regulator-min-microvolt = <4425000>; 77 + regulator-max-microvolt = <5825000>; 78 + regulator-min-microamp = <500000>; 79 + regulator-max-microamp = <3000000>; 80 + }; 81 + }; 82 + };
+73
Documentation/devicetree/bindings/power/supply/richtek,rt9471.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/richtek,rt9471.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Richtek RT9471 3A Single Cell Switching Battery charger 8 + 9 + maintainers: 10 + - Alina Yu <alina_yu@richtek.com> 11 + - ChiYuan Huang <cy_huang@richtek.com> 12 + 13 + description: | 14 + RT9471 is a switch-mode single cell Li-Ion/Li-Polymer battery charger for 15 + portable applications. It supports USB BC1.2 port detection, current and 16 + voltage regulations in both charging and boost mode. 17 + 18 + Datasheet is available at 19 + https://www.richtek.com/assets/product_file/RT9471=RT9471D/DS9471D-02.pdf 20 + 21 + properties: 22 + compatible: 23 + const: richtek,rt9471 24 + 25 + reg: 26 + maxItems: 1 27 + 28 + charge-enable-gpios: 29 + description: GPIO used to turn on and off charging. 30 + maxItems: 1 31 + 32 + wakeup-source: true 33 + 34 + interrupts: 35 + maxItems: 1 36 + 37 + usb-otg-vbus-regulator: 38 + type: object 39 + $ref: /schemas/regulator/regulator.yaml# 40 + unevaluatedProperties: false 41 + 42 + required: 43 + - compatible 44 + - reg 45 + - wakeup-source 46 + - interrupts 47 + 48 + additionalProperties: false 49 + 50 + examples: 51 + - | 52 + #include <dt-bindings/interrupt-controller/irq.h> 53 + #include <dt-bindings/gpio/gpio.h> 54 + i2c { 55 + #address-cells = <1>; 56 + #size-cells = <0>; 57 + 58 + charger@53 { 59 + compatible = "richtek,rt9471"; 60 + reg = <0x53>; 61 + charge-enable-gpios = <&gpio26 1 GPIO_ACTIVE_LOW>; 62 + wakeup-source; 63 + interrupts-extended = <&gpio_intc 32 IRQ_TYPE_EDGE_FALLING>; 64 + 65 + usb-otg-vbus-regulator { 66 + regulator-name = "usb-otg-vbus"; 67 + regulator-min-microvolt = <4850000>; 68 + regulator-max-microvolt = <5300000>; 69 + regulator-min-microamp = <500000>; 70 + regulator-max-microamp = <1200000>; 71 + }; 72 + }; 73 + };
+1 -1
drivers/platform/x86/x86-android-tablets.c
··· 187 187 /* Generic / shared charger / battery settings */ 188 188 static const char * const tusb1211_chg_det_psy[] = { "tusb1211-charger-detect" }; 189 189 static const char * const bq24190_psy[] = { "bq24190-charger" }; 190 - static const char * const bq25890_psy[] = { "bq25890-charger" }; 190 + static const char * const bq25890_psy[] = { "bq25890-charger-0" }; 191 191 192 192 static const struct property_entry fg_bq24190_supply_props[] = { 193 193 PROPERTY_ENTRY_STRING_ARRAY("supplied-from", bq24190_psy),
+7
drivers/power/reset/Kconfig
··· 141 141 help 142 142 This driver supports restart for Microsemi Ocelot SoC and similar. 143 143 144 + config POWER_RESET_ODROID_GO_ULTRA_POWEROFF 145 + bool "Odroid Go Ultra power-off driver" 146 + depends on ARCH_MESON || COMPILE_TEST 147 + depends on I2C=y && OF 148 + help 149 + This driver supports Power off for Odroid Go Ultra device. 150 + 144 151 config POWER_RESET_OXNAS 145 152 bool "OXNAS SoC restart driver" 146 153 depends on ARCH_OXNAS
+1
drivers/power/reset/Makefile
··· 17 17 obj-$(CONFIG_POWER_RESET_OXNAS) += oxnas-restart.o 18 18 obj-$(CONFIG_POWER_RESET_QCOM_PON) += qcom-pon.o 19 19 obj-$(CONFIG_POWER_RESET_OCELOT_RESET) += ocelot-reset.o 20 + obj-$(CONFIG_POWER_RESET_ODROID_GO_ULTRA_POWEROFF) += odroid-go-ultra-poweroff.o 20 21 obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o 21 22 obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o 22 23 obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
+177
drivers/power/reset/odroid-go-ultra-poweroff.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Copyright (c) 2023 Neil Armstrong <neil.armstrong@linaro.org> 4 + */ 5 + #include <linux/kernel.h> 6 + #include <linux/init.h> 7 + #include <linux/of_platform.h> 8 + #include <linux/mfd/rk808.h> 9 + #include <linux/regmap.h> 10 + #include <linux/module.h> 11 + #include <linux/reboot.h> 12 + #include <linux/i2c.h> 13 + 14 + /* 15 + * The Odroid Go Ultra has 2 PMICs: 16 + * - RK818 (manages the battery and USB-C power supply) 17 + * - RK817 18 + * Both PMICs feeds power to the S922X SoC, so they must be powered-off in sequence. 19 + * Vendor does power-off the RK817 first, then the RK818 so here we follow this sequence. 20 + */ 21 + 22 + struct odroid_go_ultra_poweroff_data { 23 + struct device *dev; 24 + struct device *rk817; 25 + struct device *rk818; 26 + }; 27 + 28 + static int odroid_go_ultra_poweroff_prepare(struct sys_off_data *data) 29 + { 30 + struct odroid_go_ultra_poweroff_data *poweroff_data = data->cb_data; 31 + struct regmap *rk817, *rk818; 32 + int ret; 33 + 34 + /* RK817 Regmap */ 35 + rk817 = dev_get_regmap(poweroff_data->rk817, NULL); 36 + if (!rk817) { 37 + dev_err(poweroff_data->dev, "failed to get rk817 regmap\n"); 38 + return notifier_from_errno(-EINVAL); 39 + } 40 + 41 + /* RK818 Regmap */ 42 + rk818 = dev_get_regmap(poweroff_data->rk818, NULL); 43 + if (!rk818) { 44 + dev_err(poweroff_data->dev, "failed to get rk818 regmap\n"); 45 + return notifier_from_errno(-EINVAL); 46 + } 47 + 48 + dev_info(poweroff_data->dev, "Setting PMICs for power off"); 49 + 50 + /* RK817 */ 51 + ret = regmap_update_bits(rk817, RK817_SYS_CFG(3), DEV_OFF, DEV_OFF); 52 + if (ret) { 53 + dev_err(poweroff_data->dev, "failed to poweroff rk817\n"); 54 + return notifier_from_errno(ret); 55 + } 56 + 57 + /* RK818 */ 58 + ret = regmap_update_bits(rk818, RK818_DEVCTRL_REG, DEV_OFF, DEV_OFF); 59 + if (ret) { 60 + dev_err(poweroff_data->dev, "failed to poweroff rk818\n"); 61 + return notifier_from_errno(ret); 62 + } 63 + 64 + return NOTIFY_OK; 65 + } 66 + 67 + static void odroid_go_ultra_poweroff_put_pmic_device(void *data) 68 + { 69 + struct device *dev = data; 70 + 71 + put_device(dev); 72 + } 73 + 74 + static int odroid_go_ultra_poweroff_get_pmic_device(struct device *dev, const char *compatible, 75 + struct device **pmic) 76 + { 77 + struct device_node *pmic_node; 78 + struct i2c_client *pmic_client; 79 + 80 + pmic_node = of_find_compatible_node(NULL, NULL, compatible); 81 + if (!pmic_node) 82 + return -ENODEV; 83 + 84 + pmic_client = of_find_i2c_device_by_node(pmic_node); 85 + of_node_put(pmic_node); 86 + if (!pmic_client) 87 + return -EPROBE_DEFER; 88 + 89 + *pmic = &pmic_client->dev; 90 + 91 + return devm_add_action_or_reset(dev, odroid_go_ultra_poweroff_put_pmic_device, *pmic); 92 + } 93 + 94 + static int odroid_go_ultra_poweroff_probe(struct platform_device *pdev) 95 + { 96 + struct odroid_go_ultra_poweroff_data *poweroff_data; 97 + int ret; 98 + 99 + poweroff_data = devm_kzalloc(&pdev->dev, sizeof(*poweroff_data), GFP_KERNEL); 100 + if (!poweroff_data) 101 + return -ENOMEM; 102 + 103 + dev_set_drvdata(&pdev->dev, poweroff_data); 104 + 105 + /* RK818 PMIC Device */ 106 + ret = odroid_go_ultra_poweroff_get_pmic_device(&pdev->dev, "rockchip,rk818", 107 + &poweroff_data->rk818); 108 + if (ret) 109 + return dev_err_probe(&pdev->dev, ret, "failed to get rk818 mfd data\n"); 110 + 111 + /* RK817 PMIC Device */ 112 + ret = odroid_go_ultra_poweroff_get_pmic_device(&pdev->dev, "rockchip,rk817", 113 + &poweroff_data->rk817); 114 + if (ret) 115 + return dev_err_probe(&pdev->dev, ret, "failed to get rk817 mfd data\n"); 116 + 117 + /* Register as SYS_OFF_MODE_POWER_OFF_PREPARE because regmap_update_bits may sleep */ 118 + ret = devm_register_sys_off_handler(&pdev->dev, 119 + SYS_OFF_MODE_POWER_OFF_PREPARE, 120 + SYS_OFF_PRIO_DEFAULT, 121 + odroid_go_ultra_poweroff_prepare, 122 + poweroff_data); 123 + if (ret) 124 + return dev_err_probe(&pdev->dev, ret, "failed to register sys-off handler\n"); 125 + 126 + dev_info(&pdev->dev, "Registered Power-Off handler\n"); 127 + 128 + return 0; 129 + } 130 + static struct platform_device *pdev; 131 + 132 + static struct platform_driver odroid_go_ultra_poweroff_driver = { 133 + .driver = { 134 + .name = "odroid-go-ultra-poweroff", 135 + }, 136 + .probe = odroid_go_ultra_poweroff_probe, 137 + }; 138 + 139 + static int __init odroid_go_ultra_poweroff_init(void) 140 + { 141 + int ret; 142 + 143 + /* Only create when running on the Odroid Go Ultra device */ 144 + if (!of_device_is_compatible(of_root, "hardkernel,odroid-go-ultra")) 145 + return -ENODEV; 146 + 147 + ret = platform_driver_register(&odroid_go_ultra_poweroff_driver); 148 + if (ret) 149 + return ret; 150 + 151 + pdev = platform_device_register_resndata(NULL, "odroid-go-ultra-poweroff", -1, 152 + NULL, 0, NULL, 0); 153 + 154 + if (IS_ERR(pdev)) { 155 + platform_driver_unregister(&odroid_go_ultra_poweroff_driver); 156 + return PTR_ERR(pdev); 157 + } 158 + 159 + return 0; 160 + } 161 + 162 + static void __exit odroid_go_ultra_poweroff_exit(void) 163 + { 164 + /* Only delete when running on the Odroid Go Ultra device */ 165 + if (!of_device_is_compatible(of_root, "hardkernel,odroid-go-ultra")) 166 + return; 167 + 168 + platform_device_unregister(pdev); 169 + platform_driver_unregister(&odroid_go_ultra_poweroff_driver); 170 + } 171 + 172 + module_init(odroid_go_ultra_poweroff_init); 173 + module_exit(odroid_go_ultra_poweroff_exit); 174 + 175 + MODULE_AUTHOR("Neil Armstrong <neil.armstrong@linaro.org>"); 176 + MODULE_DESCRIPTION("Odroid Go Ultra poweroff driver"); 177 + MODULE_LICENSE("GPL");
+5 -1
drivers/power/reset/syscon-reboot.c
··· 44 44 struct syscon_reboot_context *ctx; 45 45 struct device *dev = &pdev->dev; 46 46 int mask_err, value_err; 47 + int priority; 47 48 int err; 48 49 49 50 ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); ··· 57 56 if (IS_ERR(ctx->map)) 58 57 return PTR_ERR(ctx->map); 59 58 } 59 + 60 + if (of_property_read_s32(pdev->dev.of_node, "priority", &priority)) 61 + priority = 192; 60 62 61 63 if (of_property_read_u32(pdev->dev.of_node, "offset", &ctx->offset)) 62 64 return -EINVAL; ··· 81 77 } 82 78 83 79 ctx->restart_handler.notifier_call = syscon_restart_handle; 84 - ctx->restart_handler.priority = 192; 80 + ctx->restart_handler.priority = priority; 85 81 err = register_restart_handler(&ctx->restart_handler); 86 82 if (err) 87 83 dev_err(dev, "can't register restart notifier (err=%d)\n", err);
+35
drivers/power/supply/Kconfig
··· 765 765 help 766 766 Say Y to enable support for Richtek RT9455 battery charger. 767 767 768 + config CHARGER_RT9467 769 + tristate "Richtek RT9467 Battery Charger Driver" 770 + depends on I2C && GPIOLIB && REGULATOR 771 + select REGMAP_I2C 772 + select REGMAP_IRQ 773 + select LINEAR_RANGES 774 + help 775 + Say Y here to enable RT9467 Battery Charger. 776 + RT9467 is a switch-mode single cell Li-Ion/Li-Polymer battery charger 777 + for portable applications. It integrates a synchronous PWM controller, 778 + power MOSFETs, input current sensing and regulation, high-accuracy 779 + voltage regulation, and charge termination. The charge current is 780 + regulated through integrated sensing resistors. It also features 781 + USB On-The-Go (OTG) support and integrates D+/D- pin for USB 782 + host/charging port detection. 783 + 784 + This driver can also be built as a module. If so, the module 785 + will be called "rt9467-charger". 786 + 787 + config CHARGER_RT9471 788 + tristate "Richtek RT9471 battery charger driver" 789 + depends on I2C && GPIOLIB && REGULATOR 790 + select REGMAP_I2C 791 + select REGMAP_IRQ 792 + select LINEAR_RANGES 793 + help 794 + This adds support for Richtek RT9471 battery charger. RT9471 is 795 + highly-integrated switch mode battery charger which is system power 796 + patch manageable device for single cell Li-Ion and Li-polymer battery. 797 + It can support BC12 detection on DPDM, and current and voltage 798 + regulation on both charging and boost mode. 799 + 800 + This driver can also be built as a module. If so, the module will be 801 + called rt9471. 802 + 768 803 config CHARGER_CROS_USBPD 769 804 tristate "ChromeOS EC based USBPD charger" 770 805 depends on CROS_USBPD_NOTIFY
+2
drivers/power/supply/Makefile
··· 54 54 obj-$(CONFIG_BATTERY_MAX1721X) += max1721x_battery.o 55 55 obj-$(CONFIG_BATTERY_RT5033) += rt5033_battery.o 56 56 obj-$(CONFIG_CHARGER_RT9455) += rt9455_charger.o 57 + obj-$(CONFIG_CHARGER_RT9467) += rt9467-charger.o 58 + obj-$(CONFIG_CHARGER_RT9471) += rt9471.o 57 59 obj-$(CONFIG_BATTERY_TWL4030_MADC) += twl4030_madc_battery.o 58 60 obj-$(CONFIG_CHARGER_88PM860X) += 88pm860x_charger.o 59 61 obj-$(CONFIG_CHARGER_PCF50633) += pcf50633-charger.o
+11 -11
drivers/power/supply/ab8500_fg.c
··· 2453 2453 2454 2454 static ssize_t charge_full_show(struct ab8500_fg *di, char *buf) 2455 2455 { 2456 - return sprintf(buf, "%d\n", di->bat_cap.max_mah); 2456 + return sysfs_emit(buf, "%d\n", di->bat_cap.max_mah); 2457 2457 } 2458 2458 2459 2459 static ssize_t charge_full_store(struct ab8500_fg *di, const char *buf, ··· 2472 2472 2473 2473 static ssize_t charge_now_show(struct ab8500_fg *di, char *buf) 2474 2474 { 2475 - return sprintf(buf, "%d\n", di->bat_cap.prev_mah); 2475 + return sysfs_emit(buf, "%d\n", di->bat_cap.prev_mah); 2476 2476 } 2477 2477 2478 2478 static ssize_t charge_now_store(struct ab8500_fg *di, const char *buf, ··· 2594 2594 goto fail; 2595 2595 } 2596 2596 2597 - return scnprintf(buf, PAGE_SIZE, "%d\n", (reg_value & 0x7F)); 2597 + return sysfs_emit(buf, "%d\n", (reg_value & 0x7F)); 2598 2598 2599 2599 fail: 2600 2600 return ret; ··· 2644 2644 goto fail; 2645 2645 } 2646 2646 2647 - return scnprintf(buf, PAGE_SIZE, "%d\n", (reg_value & 0x7F)); 2647 + return sysfs_emit(buf, "%d\n", (reg_value & 0x7F)); 2648 2648 2649 2649 fail: 2650 2650 return ret; ··· 2695 2695 goto fail; 2696 2696 } 2697 2697 2698 - return scnprintf(buf, PAGE_SIZE, "%d\n", (reg_value & 0xF)); 2698 + return sysfs_emit(buf, "%d\n", (reg_value & 0xF)); 2699 2699 2700 2700 fail: 2701 2701 return ret; ··· 2746 2746 goto fail; 2747 2747 } 2748 2748 2749 - return scnprintf(buf, PAGE_SIZE, "%d\n", (reg_value & 0x7F)); 2749 + return sysfs_emit(buf, "%d\n", (reg_value & 0x7F)); 2750 2750 2751 2751 fail: 2752 2752 return ret; ··· 2769 2769 goto fail; 2770 2770 } 2771 2771 2772 - return scnprintf(buf, PAGE_SIZE, "%d\n", (reg_value & 0xF0) >> 4); 2772 + return sysfs_emit(buf, "%d\n", (reg_value & 0xF0) >> 4); 2773 2773 2774 2774 fail: 2775 2775 return ret; ··· 2790 2790 if (ret < 0) 2791 2791 goto fail; 2792 2792 2793 - return scnprintf(buf, PAGE_SIZE, "%d\n", (reg_value & 0x1)); 2793 + return sysfs_emit(buf, "%d\n", (reg_value & 0x1)); 2794 2794 2795 2795 fail: 2796 2796 return ret; ··· 2841 2841 goto fail; 2842 2842 } 2843 2843 2844 - return scnprintf(buf, PAGE_SIZE, "%d\n", ((reg_value & 0x10) >> 4)); 2844 + return sysfs_emit(buf, "%d\n", ((reg_value & 0x10) >> 4)); 2845 2845 2846 2846 fail: 2847 2847 return ret; ··· 2864 2864 goto fail; 2865 2865 } 2866 2866 2867 - return scnprintf(buf, PAGE_SIZE, "%d\n", (reg_value & 0x7)); 2867 + return sysfs_emit(buf, "%d\n", (reg_value & 0x7)); 2868 2868 2869 2869 fail: 2870 2870 return ret; ··· 2914 2914 goto fail; 2915 2915 } 2916 2916 2917 - return scnprintf(buf, PAGE_SIZE, "%d\n", ((reg_value & 0x20) >> 5)); 2917 + return sysfs_emit(buf, "%d\n", ((reg_value & 0x20) >> 5)); 2918 2918 2919 2919 fail: 2920 2920 return ret;
+21 -21
drivers/power/supply/bq2415x_charger.c
··· 1059 1059 ret = bq2415x_exec_command(bq, command); 1060 1060 if (ret < 0) 1061 1061 return ret; 1062 - return sprintf(buf, "%d\n", ret); 1062 + return sysfs_emit(buf, "%d\n", ret); 1063 1063 } 1064 1064 1065 1065 /* ··· 1098 1098 struct bq2415x_device *bq = power_supply_get_drvdata(psy); 1099 1099 1100 1100 if (bq->timer_error) 1101 - return sprintf(buf, "%s\n", bq->timer_error); 1101 + return sysfs_emit(buf, "%s\n", bq->timer_error); 1102 1102 1103 1103 if (bq->autotimer) 1104 - return sprintf(buf, "auto\n"); 1105 - return sprintf(buf, "off\n"); 1104 + return sysfs_emit(buf, "auto\n"); 1105 + return sysfs_emit(buf, "off\n"); 1106 1106 } 1107 1107 1108 1108 /* ··· 1175 1175 ssize_t ret = 0; 1176 1176 1177 1177 if (bq->automode > 0) 1178 - ret += sprintf(buf+ret, "auto ("); 1178 + ret += sysfs_emit_at(buf, ret, "auto ("); 1179 1179 1180 1180 switch (bq->mode) { 1181 1181 case BQ2415X_MODE_OFF: 1182 - ret += sprintf(buf+ret, "off"); 1182 + ret += sysfs_emit_at(buf, ret, "off"); 1183 1183 break; 1184 1184 case BQ2415X_MODE_NONE: 1185 - ret += sprintf(buf+ret, "none"); 1185 + ret += sysfs_emit_at(buf, ret, "none"); 1186 1186 break; 1187 1187 case BQ2415X_MODE_HOST_CHARGER: 1188 - ret += sprintf(buf+ret, "host"); 1188 + ret += sysfs_emit_at(buf, ret, "host"); 1189 1189 break; 1190 1190 case BQ2415X_MODE_DEDICATED_CHARGER: 1191 - ret += sprintf(buf+ret, "dedicated"); 1191 + ret += sysfs_emit_at(buf, ret, "dedicated"); 1192 1192 break; 1193 1193 case BQ2415X_MODE_BOOST: 1194 - ret += sprintf(buf+ret, "boost"); 1194 + ret += sysfs_emit_at(buf, ret, "boost"); 1195 1195 break; 1196 1196 } 1197 1197 1198 1198 if (bq->automode > 0) 1199 - ret += sprintf(buf+ret, ")"); 1199 + ret += sysfs_emit_at(buf, ret, ")"); 1200 1200 1201 - ret += sprintf(buf+ret, "\n"); 1201 + ret += sysfs_emit_at(buf, ret, "\n"); 1202 1202 return ret; 1203 1203 } 1204 1204 ··· 1215 1215 1216 1216 switch (bq->reported_mode) { 1217 1217 case BQ2415X_MODE_OFF: 1218 - return sprintf(buf, "off\n"); 1218 + return sysfs_emit(buf, "off\n"); 1219 1219 case BQ2415X_MODE_NONE: 1220 - return sprintf(buf, "none\n"); 1220 + return sysfs_emit(buf, "none\n"); 1221 1221 case BQ2415X_MODE_HOST_CHARGER: 1222 - return sprintf(buf, "host\n"); 1222 + return sysfs_emit(buf, "host\n"); 1223 1223 case BQ2415X_MODE_DEDICATED_CHARGER: 1224 - return sprintf(buf, "dedicated\n"); 1224 + return sysfs_emit(buf, "dedicated\n"); 1225 1225 case BQ2415X_MODE_BOOST: 1226 - return sprintf(buf, "boost\n"); 1226 + return sysfs_emit(buf, "boost\n"); 1227 1227 } 1228 1228 1229 1229 return -EINVAL; ··· 1261 1261 int ret = bq2415x_i2c_read(bq, reg); 1262 1262 1263 1263 if (ret < 0) 1264 - return sprintf(buf, "%#.2x=error %d\n", reg, ret); 1265 - return sprintf(buf, "%#.2x=%#.2x\n", reg, ret); 1264 + return sysfs_emit(buf, "%#.2x=error %d\n", reg, ret); 1265 + return sysfs_emit(buf, "%#.2x=%#.2x\n", reg, ret); 1266 1266 } 1267 1267 1268 1268 /* show all raw values of chip register, format per line: 'register=value' */ ··· 1338 1338 1339 1339 if (ret < 0) 1340 1340 return ret; 1341 - return sprintf(buf, "%d\n", ret); 1341 + return sysfs_emit(buf, "%d\n", ret); 1342 1342 } 1343 1343 1344 1344 /* set *_enable entries */ ··· 1401 1401 ret = bq2415x_exec_command(bq, command); 1402 1402 if (ret < 0) 1403 1403 return ret; 1404 - return sprintf(buf, "%d\n", ret); 1404 + return sysfs_emit(buf, "%d\n", ret); 1405 1405 } 1406 1406 1407 1407 static DEVICE_ATTR(current_limit, S_IWUSR | S_IRUGO,
+1 -1
drivers/power/supply/bq24190_charger.c
··· 463 463 if (ret) 464 464 count = ret; 465 465 else 466 - count = scnprintf(buf, PAGE_SIZE, "%hhx\n", v); 466 + count = sysfs_emit(buf, "%hhx\n", v); 467 467 468 468 pm_runtime_mark_last_busy(bdi->dev); 469 469 pm_runtime_put_autosuspend(bdi->dev);
+3 -5
drivers/power/supply/bq24257_charger.c
··· 767 767 struct power_supply *psy = dev_get_drvdata(dev); 768 768 struct bq24257_device *bq = power_supply_get_drvdata(psy); 769 769 770 - return scnprintf(buf, PAGE_SIZE, "%u\n", 771 - bq24257_vovp_map[bq->init_data.vovp]); 770 + return sysfs_emit(buf, "%u\n", bq24257_vovp_map[bq->init_data.vovp]); 772 771 } 773 772 774 773 static ssize_t bq24257_show_in_dpm_voltage(struct device *dev, ··· 777 778 struct power_supply *psy = dev_get_drvdata(dev); 778 779 struct bq24257_device *bq = power_supply_get_drvdata(psy); 779 780 780 - return scnprintf(buf, PAGE_SIZE, "%u\n", 781 - bq24257_vindpm_map[bq->init_data.vindpm]); 781 + return sysfs_emit(buf, "%u\n", bq24257_vindpm_map[bq->init_data.vindpm]); 782 782 } 783 783 784 784 static ssize_t bq24257_sysfs_show_enable(struct device *dev, ··· 798 800 if (ret < 0) 799 801 return ret; 800 802 801 - return scnprintf(buf, PAGE_SIZE, "%d\n", ret); 803 + return sysfs_emit(buf, "%d\n", ret); 802 804 } 803 805 804 806 static ssize_t bq24257_sysfs_set_enable(struct device *dev,
+2 -2
drivers/power/supply/bq256xx_charger.c
··· 1563 1563 return ret; 1564 1564 1565 1565 ret = bq->chip_info->bq256xx_set_ichg(bq, 1566 - bat_info->constant_charge_current_max_ua); 1566 + bq->chip_info->bq256xx_def_ichg); 1567 1567 if (ret) 1568 1568 return ret; 1569 1569 ··· 1573 1573 return ret; 1574 1574 1575 1575 ret = bq->chip_info->bq256xx_set_vbatreg(bq, 1576 - bat_info->constant_charge_voltage_max_uv); 1576 + bq->chip_info->bq256xx_def_vbatreg); 1577 1577 if (ret) 1578 1578 return ret; 1579 1579
+151 -30
drivers/power/supply/bq25890_charger.c
··· 95 95 96 96 struct bq25890_state { 97 97 u8 online; 98 + u8 hiz; 98 99 u8 chrg_status; 99 100 u8 chrg_fault; 100 101 u8 vsys_status; ··· 108 107 struct i2c_client *client; 109 108 struct device *dev; 110 109 struct power_supply *charger; 110 + struct power_supply *secondary_chrg; 111 + struct power_supply_desc desc; 112 + char name[28]; /* "bq25890-charger-%d" */ 113 + int id; 111 114 112 115 struct usb_phy *usb_phy; 113 116 struct notifier_block usb_nb; ··· 124 119 125 120 bool skip_reset; 126 121 bool read_back_init_data; 122 + bool force_hiz; 127 123 u32 pump_express_vbus_max; 124 + u32 iinlim_percentage; 128 125 enum bq25890_chip_version chip_version; 129 126 struct bq25890_init_data init_data; 130 127 struct bq25890_state state; 131 128 132 129 struct mutex lock; /* protect state data */ 133 130 }; 131 + 132 + static DEFINE_IDR(bq25890_id); 133 + static DEFINE_MUTEX(bq25890_id_mutex); 134 134 135 135 static const struct regmap_range bq25890_readonly_reg_ranges[] = { 136 136 regmap_reg_range(0x0b, 0x0c), ··· 464 454 return bq25890_find_val(ret, TBL_VBUSV); 465 455 } 466 456 467 - static int bq25890_power_supply_get_property(struct power_supply *psy, 468 - enum power_supply_property psp, 469 - union power_supply_propval *val) 457 + static void bq25890_update_state(struct bq25890_device *bq, 458 + enum power_supply_property psp, 459 + struct bq25890_state *state) 470 460 { 471 - struct bq25890_device *bq = power_supply_get_drvdata(psy); 472 - struct bq25890_state state; 473 461 bool do_adc_conv; 474 462 int ret; 475 463 476 464 mutex_lock(&bq->lock); 477 465 /* update state in case we lost an interrupt */ 478 466 __bq25890_handle_irq(bq); 479 - state = bq->state; 480 - do_adc_conv = !state.online && bq25890_is_adc_property(psp); 467 + *state = bq->state; 468 + do_adc_conv = (!state->online || state->hiz) && bq25890_is_adc_property(psp); 481 469 if (do_adc_conv) 482 470 bq25890_field_write(bq, F_CONV_START, 1); 483 471 mutex_unlock(&bq->lock); ··· 483 475 if (do_adc_conv) 484 476 regmap_field_read_poll_timeout(bq->rmap_fields[F_CONV_START], 485 477 ret, !ret, 25000, 1000000); 478 + } 479 + 480 + static int bq25890_power_supply_get_property(struct power_supply *psy, 481 + enum power_supply_property psp, 482 + union power_supply_propval *val) 483 + { 484 + struct bq25890_device *bq = power_supply_get_drvdata(psy); 485 + struct bq25890_state state; 486 + int ret; 487 + 488 + bq25890_update_state(bq, psp, &state); 486 489 487 490 switch (psp) { 488 491 case POWER_SUPPLY_PROP_STATUS: 489 - if (!state.online) 492 + if (!state.online || state.hiz) 490 493 val->intval = POWER_SUPPLY_STATUS_DISCHARGING; 491 494 else if (state.chrg_status == STATUS_NOT_CHARGING) 492 495 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; ··· 512 493 break; 513 494 514 495 case POWER_SUPPLY_PROP_CHARGE_TYPE: 515 - if (!state.online || state.chrg_status == STATUS_NOT_CHARGING || 496 + if (!state.online || state.hiz || 497 + state.chrg_status == STATUS_NOT_CHARGING || 516 498 state.chrg_status == STATUS_TERMINATION_DONE) 517 499 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; 518 500 else if (state.chrg_status == STATUS_PRE_CHARGING) ··· 533 513 break; 534 514 535 515 case POWER_SUPPLY_PROP_ONLINE: 536 - val->intval = state.online; 516 + val->intval = state.online && !state.hiz; 537 517 break; 538 518 539 519 case POWER_SUPPLY_PROP_HEALTH: ··· 687 667 const union power_supply_propval *val) 688 668 { 689 669 struct bq25890_device *bq = power_supply_get_drvdata(psy); 690 - int maxval; 670 + struct bq25890_state state; 671 + int maxval, ret; 691 672 u8 lval; 692 673 693 674 switch (psp) { ··· 703 682 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 704 683 lval = bq25890_find_idx(val->intval, TBL_IINLIM); 705 684 return bq25890_field_write(bq, F_IINLIM, lval); 685 + case POWER_SUPPLY_PROP_ONLINE: 686 + ret = bq25890_field_write(bq, F_EN_HIZ, !val->intval); 687 + if (!ret) 688 + bq->force_hiz = !val->intval; 689 + bq25890_update_state(bq, psp, &state); 690 + return ret; 706 691 default: 707 692 return -EINVAL; 708 693 } ··· 721 694 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 722 695 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 723 696 case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 697 + case POWER_SUPPLY_PROP_ONLINE: 724 698 return true; 725 699 default: 726 700 return false; 727 701 } 702 + } 703 + 704 + /* 705 + * If there are multiple chargers the maximum current the external power-supply 706 + * can deliver needs to be divided over the chargers. This is done according 707 + * to the bq->iinlim_percentage setting. 708 + */ 709 + static int bq25890_charger_get_scaled_iinlim_regval(struct bq25890_device *bq, 710 + int iinlim_ua) 711 + { 712 + iinlim_ua = iinlim_ua * bq->iinlim_percentage / 100; 713 + return bq25890_find_idx(iinlim_ua, TBL_IINLIM); 728 714 } 729 715 730 716 /* On the BQ25892 try to get charger-type info from our supplier */ ··· 758 718 759 719 switch (val.intval) { 760 720 case POWER_SUPPLY_USB_TYPE_DCP: 761 - input_current_limit = bq25890_find_idx(2000000, TBL_IINLIM); 721 + input_current_limit = bq25890_charger_get_scaled_iinlim_regval(bq, 2000000); 762 722 if (bq->pump_express_vbus_max) { 763 723 queue_delayed_work(system_power_efficient_wq, 764 724 &bq->pump_express_work, ··· 767 727 break; 768 728 case POWER_SUPPLY_USB_TYPE_CDP: 769 729 case POWER_SUPPLY_USB_TYPE_ACA: 770 - input_current_limit = bq25890_find_idx(1500000, TBL_IINLIM); 730 + input_current_limit = bq25890_charger_get_scaled_iinlim_regval(bq, 1500000); 771 731 break; 772 732 case POWER_SUPPLY_USB_TYPE_SDP: 773 733 default: 774 - input_current_limit = bq25890_find_idx(500000, TBL_IINLIM); 734 + input_current_limit = bq25890_charger_get_scaled_iinlim_regval(bq, 500000); 775 735 } 776 736 777 737 bq25890_field_write(bq, F_IINLIM, input_current_limit); ··· 788 748 } state_fields[] = { 789 749 {F_CHG_STAT, &state->chrg_status}, 790 750 {F_PG_STAT, &state->online}, 751 + {F_EN_HIZ, &state->hiz}, 791 752 {F_VSYS_STAT, &state->vsys_status}, 792 753 {F_BOOST_FAULT, &state->boost_fault}, 793 754 {F_BAT_FAULT, &state->bat_fault}, ··· 804 763 *state_fields[i].data = ret; 805 764 } 806 765 807 - dev_dbg(bq->dev, "S:CHG/PG/VSYS=%d/%d/%d, F:CHG/BOOST/BAT/NTC=%d/%d/%d/%d\n", 808 - state->chrg_status, state->online, state->vsys_status, 809 - state->chrg_fault, state->boost_fault, state->bat_fault, 810 - state->ntc_fault); 766 + dev_dbg(bq->dev, "S:CHG/PG/HIZ/VSYS=%d/%d/%d/%d, F:CHG/BOOST/BAT/NTC=%d/%d/%d/%d\n", 767 + state->chrg_status, state->online, 768 + state->hiz, state->vsys_status, 769 + state->chrg_fault, state->boost_fault, 770 + state->bat_fault, state->ntc_fault); 811 771 812 772 return 0; 813 773 } 814 774 815 775 static irqreturn_t __bq25890_handle_irq(struct bq25890_device *bq) 816 776 { 777 + bool adc_conv_rate, new_adc_conv_rate; 817 778 struct bq25890_state new_state; 818 779 int ret; 819 780 ··· 826 783 if (!memcmp(&bq->state, &new_state, sizeof(new_state))) 827 784 return IRQ_NONE; 828 785 829 - if (!new_state.online && bq->state.online) { /* power removed */ 830 - /* disable ADC */ 831 - ret = bq25890_field_write(bq, F_CONV_RATE, 0); 786 + /* 787 + * Restore HiZ bit in case it was set by user. The chip does not retain 788 + * this bit on cable replug, hence the bit must be reset manually here. 789 + */ 790 + if (new_state.online && !bq->state.online && bq->force_hiz) { 791 + ret = bq25890_field_write(bq, F_EN_HIZ, bq->force_hiz); 832 792 if (ret < 0) 833 793 goto error; 834 - } else if (new_state.online && !bq->state.online) { /* power inserted */ 835 - /* enable ADC, to have control of charge current/voltage */ 836 - ret = bq25890_field_write(bq, F_CONV_RATE, 1); 794 + new_state.hiz = 1; 795 + } 796 + 797 + /* Should period ADC sampling be enabled? */ 798 + adc_conv_rate = bq->state.online && !bq->state.hiz; 799 + new_adc_conv_rate = new_state.online && !new_state.hiz; 800 + 801 + if (new_adc_conv_rate != adc_conv_rate) { 802 + ret = bq25890_field_write(bq, F_CONV_RATE, new_adc_conv_rate); 837 803 if (ret < 0) 838 804 goto error; 839 805 } ··· 976 924 } 977 925 978 926 /* Configure ADC for continuous conversions when charging */ 979 - ret = bq25890_field_write(bq, F_CONV_RATE, !!bq->state.online); 927 + ret = bq25890_field_write(bq, F_CONV_RATE, bq->state.online && !bq->state.hiz); 980 928 if (ret < 0) { 981 929 dev_dbg(bq->dev, "Config ADC failed %d\n", ret); 982 930 return ret; ··· 1009 957 }; 1010 958 1011 959 static const struct power_supply_desc bq25890_power_supply_desc = { 1012 - .name = "bq25890-charger", 1013 960 .type = POWER_SUPPLY_TYPE_USB, 1014 961 .properties = bq25890_power_supply_props, 1015 962 .num_properties = ARRAY_SIZE(bq25890_power_supply_props), ··· 1022 971 { 1023 972 struct power_supply_config psy_cfg = { .drv_data = bq, }; 1024 973 974 + /* Get ID for the device */ 975 + mutex_lock(&bq25890_id_mutex); 976 + bq->id = idr_alloc(&bq25890_id, bq, 0, 0, GFP_KERNEL); 977 + mutex_unlock(&bq25890_id_mutex); 978 + if (bq->id < 0) 979 + return bq->id; 980 + 981 + snprintf(bq->name, sizeof(bq->name), "bq25890-charger-%d", bq->id); 982 + bq->desc = bq25890_power_supply_desc; 983 + bq->desc.name = bq->name; 984 + 1025 985 psy_cfg.supplied_to = bq25890_charger_supplied_to; 1026 986 psy_cfg.num_supplicants = ARRAY_SIZE(bq25890_charger_supplied_to); 1027 987 1028 - bq->charger = devm_power_supply_register(bq->dev, 1029 - &bq25890_power_supply_desc, 1030 - &psy_cfg); 988 + bq->charger = devm_power_supply_register(bq->dev, &bq->desc, &psy_cfg); 1031 989 1032 990 return PTR_ERR_OR_ZERO(bq->charger); 1033 991 } ··· 1056 996 { 1057 997 struct bq25890_device *bq = 1058 998 container_of(data, struct bq25890_device, pump_express_work.work); 999 + union power_supply_propval value; 1059 1000 int voltage, i, ret; 1060 1001 1061 1002 dev_dbg(bq->dev, "Start to request input voltage increasing\n"); 1003 + 1004 + /* If there is a second charger put in Hi-Z mode */ 1005 + if (bq->secondary_chrg) { 1006 + value.intval = 0; 1007 + power_supply_set_property(bq->secondary_chrg, POWER_SUPPLY_PROP_ONLINE, &value); 1008 + } 1062 1009 1063 1010 /* Enable current pulse voltage control protocol */ 1064 1011 ret = bq25890_field_write(bq, F_PUMPX_EN, 1); ··· 1097 1030 } 1098 1031 1099 1032 bq25890_field_write(bq, F_PUMPX_EN, 0); 1033 + 1034 + if (bq->secondary_chrg) { 1035 + value.intval = 1; 1036 + power_supply_set_property(bq->secondary_chrg, POWER_SUPPLY_PROP_ONLINE, &value); 1037 + } 1100 1038 1101 1039 dev_info(bq->dev, "Hi-voltage charging requested, input voltage is %d mV\n", 1102 1040 voltage); ··· 1149 1077 static int bq25890_vbus_enable(struct regulator_dev *rdev) 1150 1078 { 1151 1079 struct bq25890_device *bq = rdev_get_drvdata(rdev); 1080 + union power_supply_propval val = { 1081 + .intval = 0, 1082 + }; 1083 + 1084 + /* 1085 + * When enabling 5V boost / Vbus output, we need to put the secondary 1086 + * charger in Hi-Z mode to avoid it trying to charge the secondary 1087 + * battery from the 5V boost output. 1088 + */ 1089 + if (bq->secondary_chrg) 1090 + power_supply_set_property(bq->secondary_chrg, POWER_SUPPLY_PROP_ONLINE, &val); 1152 1091 1153 1092 return bq25890_set_otg_cfg(bq, 1); 1154 1093 } ··· 1167 1084 static int bq25890_vbus_disable(struct regulator_dev *rdev) 1168 1085 { 1169 1086 struct bq25890_device *bq = rdev_get_drvdata(rdev); 1087 + union power_supply_propval val = { 1088 + .intval = 1, 1089 + }; 1090 + int ret; 1170 1091 1171 - return bq25890_set_otg_cfg(bq, 0); 1092 + ret = bq25890_set_otg_cfg(bq, 0); 1093 + if (ret) 1094 + return ret; 1095 + 1096 + if (bq->secondary_chrg) 1097 + power_supply_set_property(bq->secondary_chrg, POWER_SUPPLY_PROP_ONLINE, &val); 1098 + 1099 + return 0; 1172 1100 } 1173 1101 1174 1102 static int bq25890_vbus_is_enabled(struct regulator_dev *rdev) ··· 1390 1296 { 1391 1297 int ret; 1392 1298 struct bq25890_init_data *init = &bq->init_data; 1299 + const char *str; 1300 + u32 val; 1301 + 1302 + ret = device_property_read_string(bq->dev, "linux,secondary-charger-name", &str); 1303 + if (ret == 0) { 1304 + bq->secondary_chrg = power_supply_get_by_name(str); 1305 + if (!bq->secondary_chrg) 1306 + return -EPROBE_DEFER; 1307 + } 1393 1308 1394 1309 /* Optional, left at 0 if property is not present */ 1395 1310 device_property_read_u32(bq->dev, "linux,pump-express-vbus-max", 1396 1311 &bq->pump_express_vbus_max); 1312 + 1313 + ret = device_property_read_u32(bq->dev, "linux,iinlim-percentage", &val); 1314 + if (ret == 0) { 1315 + if (val > 100) { 1316 + dev_err(bq->dev, "Error linux,iinlim-percentage %u > 100\n", val); 1317 + return -EINVAL; 1318 + } 1319 + bq->iinlim_percentage = val; 1320 + } else { 1321 + bq->iinlim_percentage = 100; 1322 + } 1397 1323 1398 1324 bq->skip_reset = device_property_read_bool(bq->dev, "linux,skip-reset"); 1399 1325 bq->read_back_init_data = device_property_read_bool(bq->dev, ··· 1436 1322 struct bq25890_device *bq = data; 1437 1323 1438 1324 cancel_delayed_work_sync(&bq->pump_express_work); 1325 + 1326 + if (bq->id >= 0) { 1327 + mutex_lock(&bq25890_id_mutex); 1328 + idr_remove(&bq25890_id, bq->id); 1329 + mutex_unlock(&bq25890_id_mutex); 1330 + } 1439 1331 } 1440 1332 1441 1333 static int bq25890_probe(struct i2c_client *client) ··· 1456 1336 1457 1337 bq->client = client; 1458 1338 bq->dev = dev; 1339 + bq->id = -1; 1459 1340 1460 1341 mutex_init(&bq->lock); 1461 1342 INIT_DELAYED_WORK(&bq->pump_express_work, bq25890_pump_express_work);
+4 -4
drivers/power/supply/bq27xxx_battery.c
··· 1917 1917 if (di->opts & BQ27XXX_O_ZERO) { 1918 1918 if (di->cache.flags & BQ27000_FLAG_FC) 1919 1919 level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; 1920 - else if (di->cache.flags & BQ27000_FLAG_EDV1) 1921 - level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1922 1920 else if (di->cache.flags & BQ27000_FLAG_EDVF) 1923 1921 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; 1922 + else if (di->cache.flags & BQ27000_FLAG_EDV1) 1923 + level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1924 1924 else 1925 1925 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; 1926 1926 } else if (di->opts & BQ27Z561_O_BITS) { ··· 1933 1933 } else { 1934 1934 if (di->cache.flags & BQ27XXX_FLAG_FC) 1935 1935 level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; 1936 - else if (di->cache.flags & BQ27XXX_FLAG_SOC1) 1937 - level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1938 1936 else if (di->cache.flags & BQ27XXX_FLAG_SOCF) 1939 1937 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; 1938 + else if (di->cache.flags & BQ27XXX_FLAG_SOC1) 1939 + level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; 1940 1940 else 1941 1941 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; 1942 1942 }
+3 -3
drivers/power/supply/charger-manager.c
··· 1075 1075 struct charger_regulator *charger 1076 1076 = container_of(attr, struct charger_regulator, attr_name); 1077 1077 1078 - return sprintf(buf, "%s\n", charger->regulator_name); 1078 + return sysfs_emit(buf, "%s\n", charger->regulator_name); 1079 1079 } 1080 1080 1081 1081 static ssize_t charger_state_show(struct device *dev, ··· 1088 1088 if (!charger->externally_control) 1089 1089 state = regulator_is_enabled(charger->consumer); 1090 1090 1091 - return sprintf(buf, "%s\n", state ? "enabled" : "disabled"); 1091 + return sysfs_emit(buf, "%s\n", state ? "enabled" : "disabled"); 1092 1092 } 1093 1093 1094 1094 static ssize_t charger_externally_control_show(struct device *dev, ··· 1097 1097 struct charger_regulator *charger = container_of(attr, 1098 1098 struct charger_regulator, attr_externally_control); 1099 1099 1100 - return sprintf(buf, "%d\n", charger->externally_control); 1100 + return sysfs_emit(buf, "%d\n", charger->externally_control); 1101 1101 } 1102 1102 1103 1103 static ssize_t charger_externally_control_store(struct device *dev,
+2 -2
drivers/power/supply/collie_battery.c
··· 404 404 goto err_psy_reg_bu; 405 405 } 406 406 407 - ret = request_irq(gpio_to_irq(COLLIE_GPIO_CO), 407 + ret = request_irq(gpiod_to_irq(collie_bat_main.gpio_full), 408 408 collie_bat_gpio_isr, 409 409 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, 410 410 "main full", &collie_bat_main); ··· 440 440 441 441 static void collie_bat_remove(struct ucb1x00_dev *dev) 442 442 { 443 - free_irq(gpio_to_irq(COLLIE_GPIO_CO), &collie_bat_main); 443 + free_irq(gpiod_to_irq(collie_bat_main.gpio_full), &collie_bat_main); 444 444 power_supply_unregister(collie_bat_bu.psy); 445 445 power_supply_unregister(collie_bat_main.psy); 446 446
+2 -7
drivers/power/supply/da9150-charger.c
··· 466 466 int irq, ret; 467 467 468 468 irq = platform_get_irq_byname(pdev, irq_name); 469 - if (irq < 0) { 470 - dev_err(dev, "Failed to get IRQ CHG_STATUS: %d\n", irq); 469 + if (irq < 0) 471 470 return irq; 472 - } 473 471 474 472 ret = request_threaded_irq(irq, NULL, handler, IRQF_ONESHOT, irq_name, 475 473 charger); ··· 480 482 static void da9150_charger_unregister_irq(struct platform_device *pdev, 481 483 const char *irq_name) 482 484 { 483 - struct device *dev = &pdev->dev; 484 485 struct da9150_charger *charger = platform_get_drvdata(pdev); 485 486 int irq; 486 487 487 488 irq = platform_get_irq_byname(pdev, irq_name); 488 - if (irq < 0) { 489 - dev_err(dev, "Failed to get IRQ CHG_STATUS: %d\n", irq); 489 + if (irq < 0) 490 490 return; 491 - } 492 491 493 492 free_irq(irq, charger); 494 493 }
+4 -4
drivers/power/supply/ds2780_battery.c
··· 454 454 if (ret < 0) 455 455 return ret; 456 456 457 - return sprintf(buf, "%d\n", 457 + return sysfs_emit(buf, "%d\n", 458 458 !!(control_reg & DS2780_CONTROL_REG_PMOD)); 459 459 } 460 460 ··· 507 507 if (ret < 0) 508 508 return ret; 509 509 510 - ret = sprintf(buf, "%d\n", sense_resistor); 510 + ret = sysfs_emit(buf, "%d\n", sense_resistor); 511 511 return ret; 512 512 } 513 513 ··· 545 545 if (ret < 0) 546 546 return ret; 547 547 548 - return sprintf(buf, "%d\n", rsgain); 548 + return sysfs_emit(buf, "%d\n", rsgain); 549 549 } 550 550 551 551 static ssize_t ds2780_set_rsgain_setting(struct device *dev, ··· 588 588 if (ret < 0) 589 589 return ret; 590 590 591 - ret = sprintf(buf, "%d\n", sfr & DS2780_SFR_REG_PIOSC); 591 + ret = sysfs_emit(buf, "%d\n", sfr & DS2780_SFR_REG_PIOSC); 592 592 return ret; 593 593 } 594 594
+4 -4
drivers/power/supply/ds2781_battery.c
··· 456 456 if (ret < 0) 457 457 return ret; 458 458 459 - return sprintf(buf, "%d\n", 459 + return sysfs_emit(buf, "%d\n", 460 460 !!(control_reg & DS2781_CONTROL_PMOD)); 461 461 } 462 462 ··· 509 509 if (ret < 0) 510 510 return ret; 511 511 512 - ret = sprintf(buf, "%d\n", sense_resistor); 512 + ret = sysfs_emit(buf, "%d\n", sense_resistor); 513 513 return ret; 514 514 } 515 515 ··· 547 547 if (ret < 0) 548 548 return ret; 549 549 550 - return sprintf(buf, "%d\n", rsgain); 550 + return sysfs_emit(buf, "%d\n", rsgain); 551 551 } 552 552 553 553 static ssize_t ds2781_set_rsgain_setting(struct device *dev, ··· 590 590 if (ret < 0) 591 591 return ret; 592 592 593 - ret = sprintf(buf, "%d\n", sfr & DS2781_SFR_PIOSC); 593 + ret = sysfs_emit(buf, "%d\n", sfr & DS2781_SFR_PIOSC); 594 594 return ret; 595 595 } 596 596
+3 -4
drivers/power/supply/lp8788-charger.c
··· 602 602 lp8788_read_byte(pchg->lp, LP8788_CHG_STATUS, &data); 603 603 state = (data & LP8788_CHG_STATE_M) >> LP8788_CHG_STATE_S; 604 604 605 - return scnprintf(buf, PAGE_SIZE, "%s\n", desc[state]); 605 + return sysfs_emit(buf, "%s\n", desc[state]); 606 606 } 607 607 608 608 static ssize_t lp8788_show_eoc_time(struct device *dev, ··· 618 618 lp8788_read_byte(pchg->lp, LP8788_CHG_EOC, &val); 619 619 val = (val & LP8788_CHG_EOC_TIME_M) >> LP8788_CHG_EOC_TIME_S; 620 620 621 - return scnprintf(buf, PAGE_SIZE, "End Of Charge Time: %s\n", 622 - stime[val]); 621 + return sysfs_emit(buf, "End Of Charge Time: %s\n", stime[val]); 623 622 } 624 623 625 624 static ssize_t lp8788_show_eoc_level(struct device *dev, ··· 641 642 val = (val & LP8788_CHG_EOC_LEVEL_M) >> LP8788_CHG_EOC_LEVEL_S; 642 643 level = mode ? abs_level[val] : relative_level[val]; 643 644 644 - return scnprintf(buf, PAGE_SIZE, "End Of Charge Level: %s\n", level); 645 + return sysfs_emit(buf, "End Of Charge Level: %s\n", level); 645 646 } 646 647 647 648 static DEVICE_ATTR(charger_status, S_IRUSR, lp8788_show_charger_status, NULL);
+6 -6
drivers/power/supply/ltc4162-l-charger.c
··· 525 525 } 526 526 } 527 527 528 - return sprintf(buf, "%s\n", result); 528 + return sysfs_emit(buf, "%s\n", result); 529 529 } 530 530 static DEVICE_ATTR_RO(charge_status); 531 531 ··· 541 541 if (ret) 542 542 return ret; 543 543 544 - return sprintf(buf, "%d\n", val.intval); 544 + return sysfs_emit(buf, "%d\n", val.intval); 545 545 } 546 546 static DEVICE_ATTR_RO(vbat); 547 547 ··· 557 557 if (ret) 558 558 return ret; 559 559 560 - return sprintf(buf, "%d\n", val.intval); 560 + return sysfs_emit(buf, "%d\n", val.intval); 561 561 } 562 562 static DEVICE_ATTR_RO(vbat_avg); 563 563 ··· 573 573 if (ret) 574 574 return ret; 575 575 576 - return sprintf(buf, "%d\n", val.intval); 576 + return sysfs_emit(buf, "%d\n", val.intval); 577 577 } 578 578 static DEVICE_ATTR_RO(ibat); 579 579 ··· 589 589 if (ret) 590 590 return ret; 591 591 592 - return sprintf(buf, "%u\n", regval & BIT(2) ? 1 : 0); 592 + return sysfs_emit(buf, "%u\n", regval & BIT(2) ? 1 : 0); 593 593 } 594 594 595 595 static ssize_t force_telemetry_store(struct device *dev, ··· 628 628 if (ret) 629 629 return ret; 630 630 631 - return sprintf(buf, "%u\n", 631 + return sysfs_emit(buf, "%u\n", 632 632 regval == LTC4162L_ARM_SHIP_MODE_MAGIC ? 1 : 0); 633 633 } 634 634
+1 -1
drivers/power/supply/max14577_charger.c
··· 532 532 break; 533 533 } 534 534 535 - return scnprintf(buf, PAGE_SIZE, "%u\n", val); 535 + return sysfs_emit(buf, "%u\n", val); 536 536 } 537 537 538 538 static ssize_t store_fast_charge_timer(struct device *dev,
+4 -4
drivers/power/supply/max1721x_battery.c
··· 384 384 } 385 385 386 386 if (!info->ManufacturerName[0]) 387 - strncpy(info->ManufacturerName, DEF_MFG_NAME, 387 + strscpy(info->ManufacturerName, DEF_MFG_NAME, 388 388 2 * MAX1721X_REG_MFG_NUMB); 389 389 390 390 if (get_string(info, MAX1721X_REG_DEV_STR, ··· 403 403 404 404 switch (dev_name & MAX172XX_DEV_MASK) { 405 405 case MAX172X1_DEV: 406 - strncpy(info->DeviceName, DEF_DEV_NAME_MAX17211, 406 + strscpy(info->DeviceName, DEF_DEV_NAME_MAX17211, 407 407 2 * MAX1721X_REG_DEV_NUMB); 408 408 break; 409 409 case MAX172X5_DEV: 410 - strncpy(info->DeviceName, DEF_DEV_NAME_MAX17215, 410 + strscpy(info->DeviceName, DEF_DEV_NAME_MAX17215, 411 411 2 * MAX1721X_REG_DEV_NUMB); 412 412 break; 413 413 default: 414 - strncpy(info->DeviceName, DEF_DEV_NAME_UNKNOWN, 414 + strscpy(info->DeviceName, DEF_DEV_NAME_UNKNOWN, 415 415 2 * MAX1721X_REG_DEV_NUMB); 416 416 } 417 417 }
+4 -4
drivers/power/supply/max77650-charger.c
··· 141 141 return rv; 142 142 } 143 143 144 - static int max77650_charger_disable(struct max77650_charger_data *chg) 144 + static void max77650_charger_disable(struct max77650_charger_data *chg) 145 145 { 146 146 int rv; 147 147 ··· 151 151 MAX77650_CHARGER_DISABLED); 152 152 if (rv) 153 153 dev_err(chg->dev, "unable to disable the charger: %d\n", rv); 154 - 155 - return rv; 156 154 } 157 155 158 156 static irqreturn_t max77650_charger_check_status(int irq, void *data) ··· 349 351 { 350 352 struct max77650_charger_data *chg = platform_get_drvdata(pdev); 351 353 352 - return max77650_charger_disable(chg); 354 + max77650_charger_disable(chg); 355 + 356 + return 0; 353 357 } 354 358 355 359 static const struct of_device_id max77650_charger_of_match[] = {
+3 -3
drivers/power/supply/max77693_charger.c
··· 296 296 break; 297 297 } 298 298 299 - return scnprintf(buf, PAGE_SIZE, "%u\n", val); 299 + return sysfs_emit(buf, "%u\n", val); 300 300 } 301 301 302 302 static int max77693_set_fast_charge_timer(struct max77693_charger *chg, ··· 357 357 else 358 358 val = data * 50000; 359 359 360 - return scnprintf(buf, PAGE_SIZE, "%u\n", val); 360 + return sysfs_emit(buf, "%u\n", val); 361 361 } 362 362 363 363 static int max77693_set_top_off_threshold_current(struct max77693_charger *chg, ··· 405 405 406 406 val = data * 10; 407 407 408 - return scnprintf(buf, PAGE_SIZE, "%u\n", val); 408 + return sysfs_emit(buf, "%u\n", val); 409 409 } 410 410 411 411 static int max77693_set_top_off_timer(struct max77693_charger *chg,
+1 -1
drivers/power/supply/mp2629_charger.c
··· 519 519 return ret; 520 520 521 521 rval = (rval >> 4) * 10; 522 - return sprintf(buf, "%d mohm\n", rval); 522 + return sysfs_emit(buf, "%d mohm\n", rval); 523 523 } 524 524 525 525 static ssize_t batt_impedance_compensation_store(struct device *dev,
+1 -1
drivers/power/supply/olpc_battery.c
··· 568 568 if (ret < 0) 569 569 return ret; 570 570 571 - return sprintf(buf, "%d\n", ec_byte); 571 + return sysfs_emit(buf, "%d\n", ec_byte); 572 572 } 573 573 574 574 static struct device_attribute olpc_bat_error = {
+3 -3
drivers/power/supply/pcf50633-charger.c
··· 153 153 u8 mbcs2 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS2); 154 154 u8 chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK); 155 155 156 - return sprintf(buf, "%d\n", chgmod); 156 + return sysfs_emit(buf, "%d\n", chgmod); 157 157 } 158 158 static DEVICE_ATTR(chgmode, S_IRUGO, show_chgmode, NULL); 159 159 ··· 174 174 else 175 175 ma = 0; 176 176 177 - return sprintf(buf, "%u\n", ma); 177 + return sysfs_emit(buf, "%u\n", ma); 178 178 } 179 179 180 180 static ssize_t set_usblim(struct device *dev, ··· 207 207 208 208 ma = (mbc->pcf->pdata->charger_reference_current_ma * mbcc5) >> 8; 209 209 210 - return sprintf(buf, "%u\n", ma); 210 + return sysfs_emit(buf, "%u\n", ma); 211 211 } 212 212 213 213 static ssize_t set_chglim(struct device *dev,
-93
drivers/power/supply/power_supply_core.c
··· 1186 1186 thermal_zone_device_unregister(psy->tzd); 1187 1187 } 1188 1188 1189 - /* thermal cooling device callbacks */ 1190 - static int ps_get_max_charge_cntl_limit(struct thermal_cooling_device *tcd, 1191 - unsigned long *state) 1192 - { 1193 - struct power_supply *psy; 1194 - union power_supply_propval val; 1195 - int ret; 1196 - 1197 - psy = tcd->devdata; 1198 - ret = power_supply_get_property(psy, 1199 - POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, &val); 1200 - if (ret) 1201 - return ret; 1202 - 1203 - *state = val.intval; 1204 - 1205 - return ret; 1206 - } 1207 - 1208 - static int ps_get_cur_charge_cntl_limit(struct thermal_cooling_device *tcd, 1209 - unsigned long *state) 1210 - { 1211 - struct power_supply *psy; 1212 - union power_supply_propval val; 1213 - int ret; 1214 - 1215 - psy = tcd->devdata; 1216 - ret = power_supply_get_property(psy, 1217 - POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, &val); 1218 - if (ret) 1219 - return ret; 1220 - 1221 - *state = val.intval; 1222 - 1223 - return ret; 1224 - } 1225 - 1226 - static int ps_set_cur_charge_cntl_limit(struct thermal_cooling_device *tcd, 1227 - unsigned long state) 1228 - { 1229 - struct power_supply *psy; 1230 - union power_supply_propval val; 1231 - int ret; 1232 - 1233 - psy = tcd->devdata; 1234 - val.intval = state; 1235 - ret = psy->desc->set_property(psy, 1236 - POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, &val); 1237 - 1238 - return ret; 1239 - } 1240 - 1241 - static const struct thermal_cooling_device_ops psy_tcd_ops = { 1242 - .get_max_state = ps_get_max_charge_cntl_limit, 1243 - .get_cur_state = ps_get_cur_charge_cntl_limit, 1244 - .set_cur_state = ps_set_cur_charge_cntl_limit, 1245 - }; 1246 - 1247 - static int psy_register_cooler(struct power_supply *psy) 1248 - { 1249 - /* Register for cooling device if psy can control charging */ 1250 - if (psy_has_property(psy->desc, POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT)) { 1251 - psy->tcd = thermal_cooling_device_register( 1252 - (char *)psy->desc->name, 1253 - psy, &psy_tcd_ops); 1254 - return PTR_ERR_OR_ZERO(psy->tcd); 1255 - } 1256 - 1257 - return 0; 1258 - } 1259 - 1260 - static void psy_unregister_cooler(struct power_supply *psy) 1261 - { 1262 - if (IS_ERR_OR_NULL(psy->tcd)) 1263 - return; 1264 - thermal_cooling_device_unregister(psy->tcd); 1265 - } 1266 1189 #else 1267 1190 static int psy_register_thermal(struct power_supply *psy) 1268 1191 { ··· 1193 1270 } 1194 1271 1195 1272 static void psy_unregister_thermal(struct power_supply *psy) 1196 - { 1197 - } 1198 - 1199 - static int psy_register_cooler(struct power_supply *psy) 1200 - { 1201 - return 0; 1202 - } 1203 - 1204 - static void psy_unregister_cooler(struct power_supply *psy) 1205 1273 { 1206 1274 } 1207 1275 #endif ··· 1268 1354 if (rc) 1269 1355 goto register_thermal_failed; 1270 1356 1271 - rc = psy_register_cooler(psy); 1272 - if (rc) 1273 - goto register_cooler_failed; 1274 - 1275 1357 rc = power_supply_create_triggers(psy); 1276 1358 if (rc) 1277 1359 goto create_triggers_failed; ··· 1297 1387 add_hwmon_sysfs_failed: 1298 1388 power_supply_remove_triggers(psy); 1299 1389 create_triggers_failed: 1300 - psy_unregister_cooler(psy); 1301 - register_cooler_failed: 1302 1390 psy_unregister_thermal(psy); 1303 1391 register_thermal_failed: 1304 1392 wakeup_init_failed: ··· 1448 1540 sysfs_remove_link(&psy->dev.kobj, "powers"); 1449 1541 power_supply_remove_hwmon_sysfs(psy); 1450 1542 power_supply_remove_triggers(psy); 1451 - psy_unregister_cooler(psy); 1452 1543 psy_unregister_thermal(psy); 1453 1544 device_init_wakeup(&psy->dev, false); 1454 1545 device_unregister(&psy->dev);
+1
drivers/power/supply/power_supply_leds.c
··· 13 13 #include <linux/device.h> 14 14 #include <linux/power_supply.h> 15 15 #include <linux/slab.h> 16 + #include <linux/leds.h> 16 17 17 18 #include "power_supply.h" 18 19
+5 -5
drivers/power/supply/power_supply_sysfs.c
··· 249 249 usb_type = desc->usb_types[i]; 250 250 251 251 if (value->intval == usb_type) { 252 - count += sprintf(buf + count, "[%s] ", 252 + count += sysfs_emit_at(buf, count, "[%s] ", 253 253 POWER_SUPPLY_USB_TYPE_TEXT[usb_type]); 254 254 match = true; 255 255 } else { 256 - count += sprintf(buf + count, "%s ", 256 + count += sysfs_emit_at(buf, count, "%s ", 257 257 POWER_SUPPLY_USB_TYPE_TEXT[usb_type]); 258 258 } 259 259 } ··· 297 297 298 298 if (ps_attr->text_values_len > 0 && 299 299 value.intval < ps_attr->text_values_len && value.intval >= 0) { 300 - return sprintf(buf, "%s\n", ps_attr->text_values[value.intval]); 300 + return sysfs_emit(buf, "%s\n", ps_attr->text_values[value.intval]); 301 301 } 302 302 303 303 switch (psp) { ··· 306 306 &value, buf); 307 307 break; 308 308 case POWER_SUPPLY_PROP_MODEL_NAME ... POWER_SUPPLY_PROP_SERIAL_NUMBER: 309 - ret = sprintf(buf, "%s\n", value.strval); 309 + ret = sysfs_emit(buf, "%s\n", value.strval); 310 310 break; 311 311 default: 312 - ret = sprintf(buf, "%d\n", value.intval); 312 + ret = sysfs_emit(buf, "%d\n", value.intval); 313 313 } 314 314 315 315 return ret;
+1282
drivers/power/supply/rt9467-charger.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (C) 2022 Richtek Technology Corp. 4 + * 5 + * Author: ChiYuan Huang <cy_huang@richtek.com> 6 + * ChiaEn Wu <chiaen_wu@richtek.com> 7 + */ 8 + 9 + #include <linux/bits.h> 10 + #include <linux/bitfield.h> 11 + #include <linux/completion.h> 12 + #include <linux/delay.h> 13 + #include <linux/gpio/consumer.h> 14 + #include <linux/i2c.h> 15 + #include <linux/interrupt.h> 16 + #include <linux/kernel.h> 17 + #include <linux/kstrtox.h> 18 + #include <linux/linear_range.h> 19 + #include <linux/module.h> 20 + #include <linux/mod_devicetable.h> 21 + #include <linux/mutex.h> 22 + #include <linux/of.h> 23 + #include <linux/power_supply.h> 24 + #include <linux/regmap.h> 25 + #include <linux/regulator/driver.h> 26 + #include <linux/units.h> 27 + #include <linux/sysfs.h> 28 + 29 + #define RT9467_REG_CORE_CTRL0 0x00 30 + #define RT9467_REG_CHG_CTRL1 0x01 31 + #define RT9467_REG_CHG_CTRL2 0x02 32 + #define RT9467_REG_CHG_CTRL3 0x03 33 + #define RT9467_REG_CHG_CTRL4 0x04 34 + #define RT9467_REG_CHG_CTRL5 0x05 35 + #define RT9467_REG_CHG_CTRL6 0x06 36 + #define RT9467_REG_CHG_CTRL7 0x07 37 + #define RT9467_REG_CHG_CTRL8 0x08 38 + #define RT9467_REG_CHG_CTRL9 0x09 39 + #define RT9467_REG_CHG_CTRL10 0x0A 40 + #define RT9467_REG_CHG_CTRL12 0x0C 41 + #define RT9467_REG_CHG_CTRL13 0x0D 42 + #define RT9467_REG_CHG_CTRL14 0x0E 43 + #define RT9467_REG_CHG_ADC 0x11 44 + #define RT9467_REG_CHG_DPDM1 0x12 45 + #define RT9467_REG_CHG_DPDM2 0x13 46 + #define RT9467_REG_DEVICE_ID 0x40 47 + #define RT9467_REG_CHG_STAT 0x42 48 + #define RT9467_REG_ADC_DATA_H 0x44 49 + #define RT9467_REG_CHG_STATC 0x50 50 + #define RT9467_REG_CHG_IRQ1 0x53 51 + #define RT9467_REG_CHG_STATC_CTRL 0x60 52 + #define RT9467_REG_CHG_IRQ1_CTRL 0x63 53 + 54 + #define RT9467_MASK_PWR_RDY BIT(7) 55 + #define RT9467_MASK_MIVR_STAT BIT(6) 56 + #define RT9467_MASK_OTG_CSEL GENMASK(2, 0) 57 + #define RT9467_MASK_OTG_VSEL GENMASK(7, 2) 58 + #define RT9467_MASK_OTG_EN BIT(0) 59 + #define RT9467_MASK_ADC_IN_SEL GENMASK(7, 4) 60 + #define RT9467_MASK_ADC_START BIT(0) 61 + 62 + #define RT9467_NUM_IRQ_REGS 4 63 + #define RT9467_ICHG_MIN_uA 100000 64 + #define RT9467_ICHG_MAX_uA 5000000 65 + #define RT9467_CV_MAX_uV 4710000 66 + #define RT9467_OTG_MIN_uV 4425000 67 + #define RT9467_OTG_MAX_uV 5825000 68 + #define RT9467_OTG_STEP_uV 25000 69 + #define RT9467_NUM_VOTG (RT9467_OTG_MAX_uV - RT9467_OTG_MIN_uV + 1) 70 + #define RT9467_AICLVTH_GAP_uV 200000 71 + #define RT9467_ADCCONV_TIME_MS 35 72 + 73 + #define RT9466_VID 0x8 74 + #define RT9467_VID 0x9 75 + 76 + /* IRQ number */ 77 + #define RT9467_IRQ_TS_STATC 0 78 + #define RT9467_IRQ_CHG_FAULT 1 79 + #define RT9467_IRQ_CHG_STATC 2 80 + #define RT9467_IRQ_CHG_TMR 3 81 + #define RT9467_IRQ_CHG_BATABS 4 82 + #define RT9467_IRQ_CHG_ADPBAD 5 83 + #define RT9467_IRQ_CHG_RVP 6 84 + #define RT9467_IRQ_OTP 7 85 + 86 + #define RT9467_IRQ_CHG_AICLM 8 87 + #define RT9467_IRQ_CHG_ICHGM 9 88 + #define RT9467_IRQ_WDTMR 11 89 + #define RT9467_IRQ_SSFINISH 12 90 + #define RT9467_IRQ_CHG_RECHG 13 91 + #define RT9467_IRQ_CHG_TERM 14 92 + #define RT9467_IRQ_CHG_IEOC 15 93 + 94 + #define RT9467_IRQ_ADC_DONE 16 95 + #define RT9467_IRQ_PUMPX_DONE 17 96 + #define RT9467_IRQ_BST_BATUV 21 97 + #define RT9467_IRQ_BST_MIDOV 22 98 + #define RT9467_IRQ_BST_OLP 23 99 + 100 + #define RT9467_IRQ_ATTACH 24 101 + #define RT9467_IRQ_DETACH 25 102 + #define RT9467_IRQ_HVDCP_DET 29 103 + #define RT9467_IRQ_CHGDET 30 104 + #define RT9467_IRQ_DCDT 31 105 + 106 + enum rt9467_fields { 107 + /* RT9467_REG_CORE_CTRL0 */ 108 + F_RST = 0, 109 + /* RT9467_REG_CHG_CTRL1 */ 110 + F_HZ, F_OTG_PIN_EN, F_OPA_MODE, 111 + /* RT9467_REG_CHG_CTRL2 */ 112 + F_SHIP_MODE, F_TE, F_IINLMTSEL, F_CFO_EN, F_CHG_EN, 113 + /* RT9467_REG_CHG_CTRL3 */ 114 + F_IAICR, F_ILIM_EN, 115 + /* RT9467_REG_CHG_CTRL4 */ 116 + F_VOREG, 117 + /* RT9467_REG_CHG_CTRL6 */ 118 + F_VMIVR, 119 + /* RT9467_REG_CHG_CTRL7 */ 120 + F_ICHG, 121 + /* RT9467_REG_CHG_CTRL8 */ 122 + F_IPREC, 123 + /* RT9467_REG_CHG_CTRL9 */ 124 + F_IEOC, 125 + /* RT9467_REG_CHG_CTRL12 */ 126 + F_WT_FC, 127 + /* RT9467_REG_CHG_CTRL13 */ 128 + F_OCP, 129 + /* RT9467_REG_CHG_CTRL14 */ 130 + F_AICL_MEAS, F_AICL_VTH, 131 + /* RT9467_REG_CHG_DPDM1 */ 132 + F_USBCHGEN, 133 + /* RT9467_REG_CHG_DPDM2 */ 134 + F_USB_STATUS, 135 + /* RT9467_REG_DEVICE_ID */ 136 + F_VENDOR, 137 + /* RT9467_REG_CHG_STAT */ 138 + F_CHG_STAT, 139 + /* RT9467_REG_CHG_STATC */ 140 + F_PWR_RDY, F_CHG_MIVR, 141 + F_MAX_FIELDS 142 + }; 143 + 144 + static const struct regmap_irq rt9467_irqs[] = { 145 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_TS_STATC, 8), 146 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_FAULT, 8), 147 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_STATC, 8), 148 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_TMR, 8), 149 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_BATABS, 8), 150 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_ADPBAD, 8), 151 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_RVP, 8), 152 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_OTP, 8), 153 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_AICLM, 8), 154 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_ICHGM, 8), 155 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_WDTMR, 8), 156 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_SSFINISH, 8), 157 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_RECHG, 8), 158 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_TERM, 8), 159 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHG_IEOC, 8), 160 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_ADC_DONE, 8), 161 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_PUMPX_DONE, 8), 162 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_BST_BATUV, 8), 163 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_BST_MIDOV, 8), 164 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_BST_OLP, 8), 165 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_ATTACH, 8), 166 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_DETACH, 8), 167 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_HVDCP_DET, 8), 168 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_CHGDET, 8), 169 + REGMAP_IRQ_REG_LINE(RT9467_IRQ_DCDT, 8) 170 + }; 171 + 172 + static const struct regmap_irq_chip rt9467_irq_chip = { 173 + .name = "rt9467-irqs", 174 + .status_base = RT9467_REG_CHG_IRQ1, 175 + .mask_base = RT9467_REG_CHG_IRQ1_CTRL, 176 + .num_regs = RT9467_NUM_IRQ_REGS, 177 + .irqs = rt9467_irqs, 178 + .num_irqs = ARRAY_SIZE(rt9467_irqs), 179 + }; 180 + 181 + enum rt9467_ranges { 182 + RT9467_RANGE_IAICR = 0, 183 + RT9467_RANGE_VOREG, 184 + RT9467_RANGE_VMIVR, 185 + RT9467_RANGE_ICHG, 186 + RT9467_RANGE_IPREC, 187 + RT9467_RANGE_IEOC, 188 + RT9467_RANGE_AICL_VTH, 189 + RT9467_RANGES_MAX 190 + }; 191 + 192 + static const struct linear_range rt9467_ranges[RT9467_RANGES_MAX] = { 193 + LINEAR_RANGE_IDX(RT9467_RANGE_IAICR, 100000, 0x0, 0x3F, 50000), 194 + LINEAR_RANGE_IDX(RT9467_RANGE_VOREG, 3900000, 0x0, 0x51, 10000), 195 + LINEAR_RANGE_IDX(RT9467_RANGE_VMIVR, 3900000, 0x0, 0x5F, 100000), 196 + LINEAR_RANGE_IDX(RT9467_RANGE_ICHG, 900000, 0x08, 0x31, 100000), 197 + LINEAR_RANGE_IDX(RT9467_RANGE_IPREC, 100000, 0x0, 0x0F, 50000), 198 + LINEAR_RANGE_IDX(RT9467_RANGE_IEOC, 100000, 0x0, 0x0F, 50000), 199 + LINEAR_RANGE_IDX(RT9467_RANGE_AICL_VTH, 4100000, 0x0, 0x7, 100000), 200 + }; 201 + 202 + static const struct reg_field rt9467_chg_fields[] = { 203 + [F_RST] = REG_FIELD(RT9467_REG_CORE_CTRL0, 7, 7), 204 + [F_HZ] = REG_FIELD(RT9467_REG_CHG_CTRL1, 2, 2), 205 + [F_OTG_PIN_EN] = REG_FIELD(RT9467_REG_CHG_CTRL1, 1, 1), 206 + [F_OPA_MODE] = REG_FIELD(RT9467_REG_CHG_CTRL1, 0, 0), 207 + [F_SHIP_MODE] = REG_FIELD(RT9467_REG_CHG_CTRL2, 7, 7), 208 + [F_TE] = REG_FIELD(RT9467_REG_CHG_CTRL2, 4, 4), 209 + [F_IINLMTSEL] = REG_FIELD(RT9467_REG_CHG_CTRL2, 2, 3), 210 + [F_CFO_EN] = REG_FIELD(RT9467_REG_CHG_CTRL2, 1, 1), 211 + [F_CHG_EN] = REG_FIELD(RT9467_REG_CHG_CTRL2, 0, 0), 212 + [F_IAICR] = REG_FIELD(RT9467_REG_CHG_CTRL3, 2, 7), 213 + [F_ILIM_EN] = REG_FIELD(RT9467_REG_CHG_CTRL3, 0, 0), 214 + [F_VOREG] = REG_FIELD(RT9467_REG_CHG_CTRL4, 1, 7), 215 + [F_VMIVR] = REG_FIELD(RT9467_REG_CHG_CTRL6, 1, 7), 216 + [F_ICHG] = REG_FIELD(RT9467_REG_CHG_CTRL7, 2, 7), 217 + [F_IPREC] = REG_FIELD(RT9467_REG_CHG_CTRL8, 0, 3), 218 + [F_IEOC] = REG_FIELD(RT9467_REG_CHG_CTRL9, 4, 7), 219 + [F_WT_FC] = REG_FIELD(RT9467_REG_CHG_CTRL12, 5, 7), 220 + [F_OCP] = REG_FIELD(RT9467_REG_CHG_CTRL13, 2, 2), 221 + [F_AICL_MEAS] = REG_FIELD(RT9467_REG_CHG_CTRL14, 7, 7), 222 + [F_AICL_VTH] = REG_FIELD(RT9467_REG_CHG_CTRL14, 0, 2), 223 + [F_USBCHGEN] = REG_FIELD(RT9467_REG_CHG_DPDM1, 7, 7), 224 + [F_USB_STATUS] = REG_FIELD(RT9467_REG_CHG_DPDM2, 0, 2), 225 + [F_VENDOR] = REG_FIELD(RT9467_REG_DEVICE_ID, 4, 7), 226 + [F_CHG_STAT] = REG_FIELD(RT9467_REG_CHG_STAT, 6, 7), 227 + [F_PWR_RDY] = REG_FIELD(RT9467_REG_CHG_STATC, 7, 7), 228 + [F_CHG_MIVR] = REG_FIELD(RT9467_REG_CHG_STATC, 6, 6), 229 + }; 230 + 231 + enum { 232 + RT9467_STAT_READY = 0, 233 + RT9467_STAT_PROGRESS, 234 + RT9467_STAT_CHARGE_DONE, 235 + RT9467_STAT_FAULT 236 + }; 237 + 238 + enum rt9467_adc_chan { 239 + RT9467_ADC_VBUS_DIV5 = 0, 240 + RT9467_ADC_VBUS_DIV2, 241 + RT9467_ADC_VSYS, 242 + RT9467_ADC_VBAT, 243 + RT9467_ADC_TS_BAT, 244 + RT9467_ADC_IBUS, 245 + RT9467_ADC_IBAT, 246 + RT9467_ADC_REGN, 247 + RT9467_ADC_TEMP_JC 248 + }; 249 + 250 + enum rt9467_chg_type { 251 + RT9467_CHG_TYPE_NOVBUS = 0, 252 + RT9467_CHG_TYPE_UNDER_GOING, 253 + RT9467_CHG_TYPE_SDP, 254 + RT9467_CHG_TYPE_SDPNSTD, 255 + RT9467_CHG_TYPE_DCP, 256 + RT9467_CHG_TYPE_CDP, 257 + RT9467_CHG_TYPE_MAX 258 + }; 259 + 260 + enum rt9467_iin_limit_sel { 261 + RT9467_IINLMTSEL_3_2A = 0, 262 + RT9467_IINLMTSEL_CHG_TYP, 263 + RT9467_IINLMTSEL_AICR, 264 + RT9467_IINLMTSEL_LOWER_LEVEL, /* lower of above three */ 265 + }; 266 + 267 + struct rt9467_chg_data { 268 + struct device *dev; 269 + struct regmap *regmap; 270 + struct regmap_field *rm_field[F_MAX_FIELDS]; 271 + struct regmap_irq_chip_data *irq_chip_data; 272 + struct power_supply *psy; 273 + struct mutex adc_lock; 274 + struct mutex attach_lock; 275 + struct mutex ichg_ieoc_lock; 276 + struct regulator_dev *rdev; 277 + struct completion aicl_done; 278 + enum power_supply_usb_type psy_usb_type; 279 + unsigned int old_stat; 280 + unsigned int vid; 281 + int ichg_ua; 282 + int ieoc_ua; 283 + }; 284 + 285 + static int rt9467_otg_of_parse_cb(struct device_node *of, 286 + const struct regulator_desc *desc, 287 + struct regulator_config *cfg) 288 + { 289 + struct rt9467_chg_data *data = cfg->driver_data; 290 + 291 + cfg->ena_gpiod = fwnode_gpiod_get_index(of_fwnode_handle(of), 292 + "enable", 0, GPIOD_OUT_LOW | 293 + GPIOD_FLAGS_BIT_NONEXCLUSIVE, 294 + desc->name); 295 + if (IS_ERR(cfg->ena_gpiod)) { 296 + cfg->ena_gpiod = NULL; 297 + return 0; 298 + } 299 + 300 + return regmap_field_write(data->rm_field[F_OTG_PIN_EN], 1); 301 + } 302 + 303 + static const struct regulator_ops rt9467_otg_regulator_ops = { 304 + .enable = regulator_enable_regmap, 305 + .disable = regulator_disable_regmap, 306 + .is_enabled = regulator_is_enabled_regmap, 307 + .list_voltage = regulator_list_voltage_linear, 308 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 309 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 310 + .set_current_limit = regulator_set_current_limit_regmap, 311 + .get_current_limit = regulator_get_current_limit_regmap, 312 + }; 313 + 314 + static const u32 rt9467_otg_microamp[] = { 315 + 500000, 700000, 1100000, 1300000, 1800000, 2100000, 2400000, 3000000 316 + }; 317 + 318 + static const struct regulator_desc rt9467_otg_desc = { 319 + .name = "rt9476-usb-otg-vbus", 320 + .of_match = "usb-otg-vbus-regulator", 321 + .of_parse_cb = rt9467_otg_of_parse_cb, 322 + .type = REGULATOR_VOLTAGE, 323 + .owner = THIS_MODULE, 324 + .min_uV = RT9467_OTG_MIN_uV, 325 + .uV_step = RT9467_OTG_STEP_uV, 326 + .n_voltages = RT9467_NUM_VOTG, 327 + .curr_table = rt9467_otg_microamp, 328 + .n_current_limits = ARRAY_SIZE(rt9467_otg_microamp), 329 + .csel_reg = RT9467_REG_CHG_CTRL10, 330 + .csel_mask = RT9467_MASK_OTG_CSEL, 331 + .vsel_reg = RT9467_REG_CHG_CTRL5, 332 + .vsel_mask = RT9467_MASK_OTG_VSEL, 333 + .enable_reg = RT9467_REG_CHG_CTRL1, 334 + .enable_mask = RT9467_MASK_OTG_EN, 335 + .ops = &rt9467_otg_regulator_ops, 336 + }; 337 + 338 + static int rt9467_register_otg_regulator(struct rt9467_chg_data *data) 339 + { 340 + struct regulator_config cfg = { 341 + .dev = data->dev, 342 + .regmap = data->regmap, 343 + .driver_data = data, 344 + }; 345 + 346 + data->rdev = devm_regulator_register(data->dev, &rt9467_otg_desc, &cfg); 347 + return PTR_ERR_OR_ZERO(data->rdev); 348 + } 349 + 350 + static int rt9467_get_value_from_ranges(struct rt9467_chg_data *data, 351 + enum rt9467_fields field, 352 + enum rt9467_ranges rsel, 353 + int *value) 354 + { 355 + const struct linear_range *range = rt9467_ranges + rsel; 356 + unsigned int sel; 357 + int ret; 358 + 359 + ret = regmap_field_read(data->rm_field[field], &sel); 360 + if (ret) 361 + return ret; 362 + 363 + return linear_range_get_value(range, sel, value); 364 + } 365 + 366 + static int rt9467_set_value_from_ranges(struct rt9467_chg_data *data, 367 + enum rt9467_fields field, 368 + enum rt9467_ranges rsel, 369 + int value) 370 + { 371 + const struct linear_range *range = rt9467_ranges + rsel; 372 + unsigned int sel; 373 + bool found; 374 + int ret; 375 + 376 + if (rsel == RT9467_RANGE_VMIVR) { 377 + ret = linear_range_get_selector_high(range, value, &sel, &found); 378 + if (ret) 379 + value = range->max_sel; 380 + } else { 381 + linear_range_get_selector_within(range, value, &sel); 382 + } 383 + 384 + return regmap_field_write(data->rm_field[field], sel); 385 + } 386 + 387 + static int rt9467_get_adc_sel(enum rt9467_adc_chan chan, int *sel) 388 + { 389 + switch (chan) { 390 + case RT9467_ADC_VBUS_DIV5: 391 + case RT9467_ADC_VBUS_DIV2: 392 + case RT9467_ADC_VSYS: 393 + case RT9467_ADC_VBAT: 394 + *sel = chan + 1; 395 + return 0; 396 + case RT9467_ADC_TS_BAT: 397 + *sel = chan + 2; 398 + return 0; 399 + case RT9467_ADC_IBUS: 400 + case RT9467_ADC_IBAT: 401 + *sel = chan + 3; 402 + return 0; 403 + case RT9467_ADC_REGN: 404 + case RT9467_ADC_TEMP_JC: 405 + *sel = chan + 4; 406 + return 0; 407 + default: 408 + return -EINVAL; 409 + } 410 + } 411 + 412 + static int rt9467_get_adc_raw_data(struct rt9467_chg_data *data, 413 + enum rt9467_adc_chan chan, int *val) 414 + { 415 + unsigned int adc_stat, reg_val, adc_sel; 416 + __be16 chan_raw_data; 417 + int ret; 418 + 419 + mutex_lock(&data->adc_lock); 420 + 421 + ret = rt9467_get_adc_sel(chan, &adc_sel); 422 + if (ret) 423 + goto adc_unlock; 424 + 425 + ret = regmap_write(data->regmap, RT9467_REG_CHG_ADC, 0); 426 + if (ret) { 427 + dev_err(data->dev, "Failed to clear ADC enable\n"); 428 + goto adc_unlock; 429 + } 430 + 431 + reg_val = RT9467_MASK_ADC_START | FIELD_PREP(RT9467_MASK_ADC_IN_SEL, adc_sel); 432 + ret = regmap_write(data->regmap, RT9467_REG_CHG_ADC, reg_val); 433 + if (ret) 434 + goto adc_unlock; 435 + 436 + /* Minimum wait time for one channel processing */ 437 + msleep(RT9467_ADCCONV_TIME_MS); 438 + 439 + ret = regmap_read_poll_timeout(data->regmap, RT9467_REG_CHG_ADC, 440 + adc_stat, 441 + !(adc_stat & RT9467_MASK_ADC_START), 442 + MILLI, RT9467_ADCCONV_TIME_MS * MILLI); 443 + if (ret) { 444 + dev_err(data->dev, "Failed to wait ADC conversion, chan = %d\n", chan); 445 + goto adc_unlock; 446 + } 447 + 448 + ret = regmap_raw_read(data->regmap, RT9467_REG_ADC_DATA_H, 449 + &chan_raw_data, sizeof(chan_raw_data)); 450 + if (ret) 451 + goto adc_unlock; 452 + 453 + *val = be16_to_cpu(chan_raw_data); 454 + 455 + adc_unlock: 456 + mutex_unlock(&data->adc_lock); 457 + return ret; 458 + } 459 + 460 + static int rt9467_get_adc(struct rt9467_chg_data *data, 461 + enum rt9467_adc_chan chan, int *val) 462 + { 463 + unsigned int aicr_ua, ichg_ua; 464 + int ret; 465 + 466 + ret = rt9467_get_adc_raw_data(data, chan, val); 467 + if (ret) 468 + return ret; 469 + 470 + switch (chan) { 471 + case RT9467_ADC_VBUS_DIV5: 472 + *val *= 25000; 473 + return 0; 474 + case RT9467_ADC_VBUS_DIV2: 475 + *val *= 10000; 476 + return 0; 477 + case RT9467_ADC_VBAT: 478 + case RT9467_ADC_VSYS: 479 + case RT9467_ADC_REGN: 480 + *val *= 5000; 481 + return 0; 482 + case RT9467_ADC_TS_BAT: 483 + *val /= 400; 484 + return 0; 485 + case RT9467_ADC_IBUS: 486 + /* UUG MOS turn-on ratio will affect the IBUS adc scale */ 487 + ret = rt9467_get_value_from_ranges(data, F_IAICR, 488 + RT9467_RANGE_IAICR, &aicr_ua); 489 + if (ret) 490 + return ret; 491 + 492 + *val *= aicr_ua < 400000 ? 29480 : 50000; 493 + return 0; 494 + case RT9467_ADC_IBAT: 495 + /* PP MOS turn-on ratio will affect the ICHG adc scale */ 496 + ret = rt9467_get_value_from_ranges(data, F_ICHG, 497 + RT9467_RANGE_ICHG, &ichg_ua); 498 + if (ret) 499 + return ret; 500 + 501 + *val *= ichg_ua <= 400000 ? 28500 : 502 + ichg_ua <= 800000 ? 31500 : 500000; 503 + return 0; 504 + case RT9467_ADC_TEMP_JC: 505 + *val = ((*val * 2) - 40) * 10; 506 + return 0; 507 + default: 508 + return -EINVAL; 509 + } 510 + } 511 + 512 + static int rt9467_psy_get_status(struct rt9467_chg_data *data, int *state) 513 + { 514 + unsigned int status; 515 + int ret; 516 + 517 + ret = regmap_field_read(data->rm_field[F_CHG_STAT], &status); 518 + if (ret) 519 + return ret; 520 + 521 + switch (status) { 522 + case RT9467_STAT_READY: 523 + *state = POWER_SUPPLY_STATUS_NOT_CHARGING; 524 + return 0; 525 + case RT9467_STAT_PROGRESS: 526 + *state = POWER_SUPPLY_STATUS_CHARGING; 527 + return 0; 528 + case RT9467_STAT_CHARGE_DONE: 529 + *state = POWER_SUPPLY_STATUS_FULL; 530 + return 0; 531 + default: 532 + *state = POWER_SUPPLY_STATUS_UNKNOWN; 533 + return 0; 534 + } 535 + } 536 + 537 + static int rt9467_psy_set_ichg(struct rt9467_chg_data *data, int microamp) 538 + { 539 + int ret; 540 + 541 + mutex_lock(&data->ichg_ieoc_lock); 542 + 543 + if (microamp < 500000) { 544 + dev_err(data->dev, "Minimum value must be 500mA\n"); 545 + microamp = 500000; 546 + } 547 + 548 + ret = rt9467_set_value_from_ranges(data, F_ICHG, RT9467_RANGE_ICHG, microamp); 549 + if (ret) 550 + goto out; 551 + 552 + ret = rt9467_get_value_from_ranges(data, F_ICHG, RT9467_RANGE_ICHG, 553 + &data->ichg_ua); 554 + if (ret) 555 + goto out; 556 + 557 + out: 558 + mutex_unlock(&data->ichg_ieoc_lock); 559 + return ret; 560 + } 561 + 562 + static int rt9467_run_aicl(struct rt9467_chg_data *data) 563 + { 564 + unsigned int statc, aicl_vth; 565 + int mivr_vth, aicr_get; 566 + int ret = 0; 567 + 568 + 569 + ret = regmap_read(data->regmap, RT9467_REG_CHG_STATC, &statc); 570 + if (ret) { 571 + dev_err(data->dev, "Failed to read status\n"); 572 + return ret; 573 + } 574 + 575 + if (!(statc & RT9467_MASK_PWR_RDY) || !(statc & RT9467_MASK_MIVR_STAT)) { 576 + dev_info(data->dev, "Condition not matched %d\n", statc); 577 + return 0; 578 + } 579 + 580 + ret = rt9467_get_value_from_ranges(data, F_VMIVR, RT9467_RANGE_VMIVR, 581 + &mivr_vth); 582 + if (ret) { 583 + dev_err(data->dev, "Failed to get mivr\n"); 584 + return ret; 585 + } 586 + 587 + /* AICL_VTH = MIVR_VTH + 200mV */ 588 + aicl_vth = mivr_vth + RT9467_AICLVTH_GAP_uV; 589 + ret = rt9467_set_value_from_ranges(data, F_AICL_VTH, 590 + RT9467_RANGE_AICL_VTH, aicl_vth); 591 + 592 + /* Trigger AICL function */ 593 + ret = regmap_field_write(data->rm_field[F_AICL_MEAS], 1); 594 + if (ret) { 595 + dev_err(data->dev, "Failed to set aicl measurement\n"); 596 + return ret; 597 + } 598 + 599 + reinit_completion(&data->aicl_done); 600 + ret = wait_for_completion_timeout(&data->aicl_done, msecs_to_jiffies(3500)); 601 + if (ret) 602 + return ret; 603 + 604 + ret = rt9467_get_value_from_ranges(data, F_IAICR, RT9467_RANGE_IAICR, &aicr_get); 605 + if (ret) { 606 + dev_err(data->dev, "Failed to get aicr\n"); 607 + return ret; 608 + } 609 + 610 + dev_info(data->dev, "aicr get = %d uA\n", aicr_get); 611 + return 0; 612 + } 613 + 614 + static int rt9467_psy_set_ieoc(struct rt9467_chg_data *data, int microamp) 615 + { 616 + int ret; 617 + 618 + mutex_lock(&data->ichg_ieoc_lock); 619 + 620 + ret = rt9467_set_value_from_ranges(data, F_IEOC, RT9467_RANGE_IEOC, microamp); 621 + if (ret) 622 + goto out; 623 + 624 + ret = rt9467_get_value_from_ranges(data, F_IEOC, RT9467_RANGE_IEOC, &data->ieoc_ua); 625 + if (ret) 626 + goto out; 627 + 628 + out: 629 + mutex_unlock(&data->ichg_ieoc_lock); 630 + return ret; 631 + } 632 + 633 + static const enum power_supply_usb_type rt9467_chg_usb_types[] = { 634 + POWER_SUPPLY_USB_TYPE_UNKNOWN, 635 + POWER_SUPPLY_USB_TYPE_SDP, 636 + POWER_SUPPLY_USB_TYPE_DCP, 637 + POWER_SUPPLY_USB_TYPE_CDP, 638 + }; 639 + 640 + static const enum power_supply_property rt9467_chg_properties[] = { 641 + POWER_SUPPLY_PROP_STATUS, 642 + POWER_SUPPLY_PROP_ONLINE, 643 + POWER_SUPPLY_PROP_CURRENT_MAX, 644 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 645 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, 646 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 647 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX, 648 + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 649 + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT, 650 + POWER_SUPPLY_PROP_USB_TYPE, 651 + POWER_SUPPLY_PROP_PRECHARGE_CURRENT, 652 + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, 653 + }; 654 + 655 + static int rt9467_psy_get_property(struct power_supply *psy, 656 + enum power_supply_property psp, 657 + union power_supply_propval *val) 658 + { 659 + struct rt9467_chg_data *data = power_supply_get_drvdata(psy); 660 + 661 + switch (psp) { 662 + case POWER_SUPPLY_PROP_STATUS: 663 + return rt9467_psy_get_status(data, &val->intval); 664 + case POWER_SUPPLY_PROP_ONLINE: 665 + return regmap_field_read(data->rm_field[F_PWR_RDY], &val->intval); 666 + case POWER_SUPPLY_PROP_CURRENT_MAX: 667 + mutex_lock(&data->attach_lock); 668 + if (data->psy_usb_type == POWER_SUPPLY_USB_TYPE_UNKNOWN || 669 + data->psy_usb_type == POWER_SUPPLY_USB_TYPE_SDP) 670 + val->intval = 500000; 671 + else 672 + val->intval = 1500000; 673 + mutex_unlock(&data->attach_lock); 674 + return 0; 675 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 676 + mutex_lock(&data->ichg_ieoc_lock); 677 + val->intval = data->ichg_ua; 678 + mutex_unlock(&data->ichg_ieoc_lock); 679 + return 0; 680 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: 681 + val->intval = RT9467_ICHG_MAX_uA; 682 + return 0; 683 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 684 + return rt9467_get_value_from_ranges(data, F_VOREG, 685 + RT9467_RANGE_VOREG, 686 + &val->intval); 687 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX: 688 + val->intval = RT9467_CV_MAX_uV; 689 + return 0; 690 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 691 + return rt9467_get_value_from_ranges(data, F_IAICR, 692 + RT9467_RANGE_IAICR, 693 + &val->intval); 694 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 695 + return rt9467_get_value_from_ranges(data, F_VMIVR, 696 + RT9467_RANGE_VMIVR, 697 + &val->intval); 698 + case POWER_SUPPLY_PROP_USB_TYPE: 699 + mutex_lock(&data->attach_lock); 700 + val->intval = data->psy_usb_type; 701 + mutex_unlock(&data->attach_lock); 702 + return 0; 703 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 704 + return rt9467_get_value_from_ranges(data, F_IPREC, 705 + RT9467_RANGE_IPREC, 706 + &val->intval); 707 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 708 + mutex_lock(&data->ichg_ieoc_lock); 709 + val->intval = data->ieoc_ua; 710 + mutex_unlock(&data->ichg_ieoc_lock); 711 + return 0; 712 + default: 713 + return -ENODATA; 714 + } 715 + } 716 + 717 + static int rt9467_psy_set_property(struct power_supply *psy, 718 + enum power_supply_property psp, 719 + const union power_supply_propval *val) 720 + { 721 + struct rt9467_chg_data *data = power_supply_get_drvdata(psy); 722 + 723 + switch (psp) { 724 + case POWER_SUPPLY_PROP_STATUS: 725 + return regmap_field_write(data->rm_field[F_CHG_EN], val->intval); 726 + case POWER_SUPPLY_PROP_ONLINE: 727 + return regmap_field_write(data->rm_field[F_HZ], val->intval); 728 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 729 + return rt9467_psy_set_ichg(data, val->intval); 730 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 731 + return rt9467_set_value_from_ranges(data, F_VOREG, 732 + RT9467_RANGE_VOREG, val->intval); 733 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 734 + if (val->intval == -1) 735 + return rt9467_run_aicl(data); 736 + else 737 + return rt9467_set_value_from_ranges(data, F_IAICR, 738 + RT9467_RANGE_IAICR, 739 + val->intval); 740 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 741 + return rt9467_set_value_from_ranges(data, F_VMIVR, 742 + RT9467_RANGE_VMIVR, val->intval); 743 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 744 + return rt9467_set_value_from_ranges(data, F_IPREC, 745 + RT9467_RANGE_IPREC, val->intval); 746 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 747 + return rt9467_psy_set_ieoc(data, val->intval); 748 + case POWER_SUPPLY_PROP_USB_TYPE: 749 + return regmap_field_write(data->rm_field[F_USBCHGEN], val->intval); 750 + default: 751 + return -EINVAL; 752 + } 753 + } 754 + 755 + static int rt9467_chg_prop_is_writeable(struct power_supply *psy, 756 + enum power_supply_property psp) 757 + { 758 + switch (psp) { 759 + case POWER_SUPPLY_PROP_STATUS: 760 + case POWER_SUPPLY_PROP_ONLINE: 761 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 762 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 763 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 764 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 765 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 766 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 767 + case POWER_SUPPLY_PROP_USB_TYPE: 768 + return 1; 769 + default: 770 + return 0; 771 + } 772 + } 773 + 774 + static const struct power_supply_desc rt9467_chg_psy_desc = { 775 + .name = "rt9467-charger", 776 + .type = POWER_SUPPLY_TYPE_USB, 777 + .usb_types = rt9467_chg_usb_types, 778 + .num_usb_types = ARRAY_SIZE(rt9467_chg_usb_types), 779 + .properties = rt9467_chg_properties, 780 + .num_properties = ARRAY_SIZE(rt9467_chg_properties), 781 + .property_is_writeable = rt9467_chg_prop_is_writeable, 782 + .get_property = rt9467_psy_get_property, 783 + .set_property = rt9467_psy_set_property, 784 + }; 785 + 786 + static inline struct rt9467_chg_data *psy_device_to_chip(struct device *dev) 787 + { 788 + return power_supply_get_drvdata(to_power_supply(dev)); 789 + } 790 + 791 + static ssize_t sysoff_enable_show(struct device *dev, 792 + struct device_attribute *attr, char *buf) 793 + { 794 + struct rt9467_chg_data *data = psy_device_to_chip(dev); 795 + unsigned int sysoff_enable; 796 + int ret; 797 + 798 + ret = regmap_field_read(data->rm_field[F_SHIP_MODE], &sysoff_enable); 799 + if (ret) 800 + return ret; 801 + 802 + return sysfs_emit(buf, "%d\n", sysoff_enable); 803 + } 804 + 805 + static ssize_t sysoff_enable_store(struct device *dev, 806 + struct device_attribute *attr, 807 + const char *buf, size_t count) 808 + { 809 + struct rt9467_chg_data *data = psy_device_to_chip(dev); 810 + unsigned int tmp; 811 + int ret; 812 + 813 + ret = kstrtouint(buf, 10, &tmp); 814 + if (ret) 815 + return ret; 816 + 817 + ret = regmap_field_write(data->rm_field[F_SHIP_MODE], !!tmp); 818 + if (ret) 819 + return ret; 820 + 821 + return count; 822 + } 823 + 824 + static DEVICE_ATTR_RW(sysoff_enable); 825 + 826 + static struct attribute *rt9467_sysfs_attrs[] = { 827 + &dev_attr_sysoff_enable.attr, 828 + NULL 829 + }; 830 + 831 + ATTRIBUTE_GROUPS(rt9467_sysfs); 832 + 833 + static int rt9467_register_psy(struct rt9467_chg_data *data) 834 + { 835 + struct power_supply_config cfg = { 836 + .drv_data = data, 837 + .of_node = dev_of_node(data->dev), 838 + .attr_grp = rt9467_sysfs_groups, 839 + }; 840 + 841 + data->psy = devm_power_supply_register(data->dev, &rt9467_chg_psy_desc, 842 + &cfg); 843 + return PTR_ERR_OR_ZERO(data->psy); 844 + } 845 + 846 + static int rt9467_mivr_handler(struct rt9467_chg_data *data) 847 + { 848 + unsigned int mivr_act; 849 + int ret, ibus_ma; 850 + 851 + /* 852 + * back-boost workaround 853 + * If (mivr_active & ibus < 100mA), toggle cfo bit 854 + */ 855 + ret = regmap_field_read(data->rm_field[F_CHG_MIVR], &mivr_act); 856 + if (ret) { 857 + dev_err(data->dev, "Failed to read MIVR stat\n"); 858 + return ret; 859 + } 860 + 861 + if (!mivr_act) 862 + return 0; 863 + 864 + ret = rt9467_get_adc(data, RT9467_ADC_IBUS, &ibus_ma); 865 + if (ret) { 866 + dev_err(data->dev, "Failed to get IBUS\n"); 867 + return ret; 868 + } 869 + 870 + if (ibus_ma < 100000) { 871 + ret = regmap_field_write(data->rm_field[F_CFO_EN], 0); 872 + ret |= regmap_field_write(data->rm_field[F_CFO_EN], 1); 873 + if (ret) 874 + dev_err(data->dev, "Failed to toggle cfo\n"); 875 + } 876 + 877 + return ret; 878 + } 879 + 880 + static irqreturn_t rt9467_statc_handler(int irq, void *priv) 881 + { 882 + struct rt9467_chg_data *data = priv; 883 + unsigned int new_stat, evts = 0; 884 + int ret; 885 + 886 + ret = regmap_read(data->regmap, RT9467_REG_CHG_STATC, &new_stat); 887 + if (ret) { 888 + dev_err(data->dev, "Failed to read chg_statc\n"); 889 + return IRQ_NONE; 890 + } 891 + 892 + evts = data->old_stat ^ new_stat; 893 + data->old_stat = new_stat; 894 + 895 + if ((evts & new_stat) & RT9467_MASK_MIVR_STAT) { 896 + ret = rt9467_mivr_handler(data); 897 + if (ret) 898 + dev_err(data->dev, "Failed to handle mivr stat\n"); 899 + } 900 + 901 + return IRQ_HANDLED; 902 + } 903 + 904 + static irqreturn_t rt9467_wdt_handler(int irq, void *priv) 905 + { 906 + struct rt9467_chg_data *data = priv; 907 + unsigned int dev_id; 908 + int ret; 909 + 910 + /* Any i2c communication can kick watchdog timer */ 911 + ret = regmap_read(data->regmap, RT9467_REG_DEVICE_ID, &dev_id); 912 + if (ret) { 913 + dev_err(data->dev, "Failed to kick wdt (%d)\n", ret); 914 + return IRQ_NONE; 915 + } 916 + 917 + return IRQ_HANDLED; 918 + } 919 + 920 + static int rt9467_report_usb_state(struct rt9467_chg_data *data) 921 + { 922 + unsigned int usb_stat, power_ready; 923 + bool psy_changed = true; 924 + int ret; 925 + 926 + ret = regmap_field_read(data->rm_field[F_USB_STATUS], &usb_stat); 927 + ret |= regmap_field_read(data->rm_field[F_PWR_RDY], &power_ready); 928 + if (ret) 929 + return ret; 930 + 931 + if (!power_ready) 932 + usb_stat = RT9467_CHG_TYPE_NOVBUS; 933 + 934 + mutex_lock(&data->attach_lock); 935 + 936 + switch (usb_stat) { 937 + case RT9467_CHG_TYPE_NOVBUS: 938 + data->psy_usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN; 939 + break; 940 + case RT9467_CHG_TYPE_SDP: 941 + data->psy_usb_type = POWER_SUPPLY_USB_TYPE_SDP; 942 + break; 943 + case RT9467_CHG_TYPE_SDPNSTD: 944 + data->psy_usb_type = POWER_SUPPLY_USB_TYPE_DCP; 945 + break; 946 + case RT9467_CHG_TYPE_DCP: 947 + data->psy_usb_type = POWER_SUPPLY_USB_TYPE_DCP; 948 + break; 949 + case RT9467_CHG_TYPE_CDP: 950 + data->psy_usb_type = POWER_SUPPLY_USB_TYPE_CDP; 951 + break; 952 + case RT9467_CHG_TYPE_UNDER_GOING: 953 + default: 954 + psy_changed = false; 955 + break; 956 + } 957 + 958 + mutex_unlock(&data->attach_lock); 959 + 960 + if (psy_changed) 961 + power_supply_changed(data->psy); 962 + 963 + return 0; 964 + } 965 + 966 + static irqreturn_t rt9467_usb_state_handler(int irq, void *priv) 967 + { 968 + struct rt9467_chg_data *data = priv; 969 + int ret; 970 + 971 + ret = rt9467_report_usb_state(data); 972 + if (ret) { 973 + dev_err(data->dev, "Failed to report attach type (%d)\n", ret); 974 + return IRQ_NONE; 975 + } 976 + 977 + return IRQ_HANDLED; 978 + } 979 + 980 + static irqreturn_t rt9467_aiclmeas_handler(int irq, void *priv) 981 + { 982 + struct rt9467_chg_data *data = priv; 983 + 984 + complete(&data->aicl_done); 985 + return IRQ_HANDLED; 986 + } 987 + 988 + #define RT9467_IRQ_DESC(_name, _handler_func, _hwirq) \ 989 + { \ 990 + .name = #_name, \ 991 + .handler = rt9467_##_handler_func##_handler, \ 992 + .hwirq = _hwirq, \ 993 + } 994 + 995 + static int rt9467_request_interrupt(struct rt9467_chg_data *data) 996 + { 997 + struct device *dev = data->dev; 998 + static const struct { 999 + const char *name; 1000 + int hwirq; 1001 + irq_handler_t handler; 1002 + } rt9467_exclusive_irqs[] = { 1003 + RT9467_IRQ_DESC(statc, statc, RT9467_IRQ_TS_STATC), 1004 + RT9467_IRQ_DESC(wdt, wdt, RT9467_IRQ_WDTMR), 1005 + RT9467_IRQ_DESC(attach, usb_state, RT9467_IRQ_ATTACH), 1006 + RT9467_IRQ_DESC(detach, usb_state, RT9467_IRQ_DETACH), 1007 + RT9467_IRQ_DESC(aiclmeas, aiclmeas, RT9467_IRQ_CHG_AICLM), 1008 + }, rt9466_exclusive_irqs[] = { 1009 + RT9467_IRQ_DESC(statc, statc, RT9467_IRQ_TS_STATC), 1010 + RT9467_IRQ_DESC(wdt, wdt, RT9467_IRQ_WDTMR), 1011 + RT9467_IRQ_DESC(aiclmeas, aiclmeas, RT9467_IRQ_CHG_AICLM), 1012 + }, *chg_irqs; 1013 + int num_chg_irqs, i, virq, ret; 1014 + 1015 + if (data->vid == RT9466_VID) { 1016 + chg_irqs = rt9466_exclusive_irqs; 1017 + num_chg_irqs = ARRAY_SIZE(rt9466_exclusive_irqs); 1018 + } else { 1019 + chg_irqs = rt9467_exclusive_irqs; 1020 + num_chg_irqs = ARRAY_SIZE(rt9467_exclusive_irqs); 1021 + } 1022 + 1023 + for (i = 0; i < num_chg_irqs; i++) { 1024 + virq = regmap_irq_get_virq(data->irq_chip_data, chg_irqs[i].hwirq); 1025 + if (virq <= 0) 1026 + return dev_err_probe(dev, virq, "Failed to get (%s) irq\n", 1027 + chg_irqs[i].name); 1028 + 1029 + ret = devm_request_threaded_irq(dev, virq, NULL, chg_irqs[i].handler, 1030 + IRQF_ONESHOT, chg_irqs[i].name, data); 1031 + if (ret) 1032 + return dev_err_probe(dev, ret, "Failed to request (%s) irq\n", 1033 + chg_irqs[i].name); 1034 + } 1035 + 1036 + return 0; 1037 + } 1038 + 1039 + static int rt9467_do_charger_init(struct rt9467_chg_data *data) 1040 + { 1041 + struct device *dev = data->dev; 1042 + int ret; 1043 + 1044 + ret = regmap_write(data->regmap, RT9467_REG_CHG_ADC, 0); 1045 + if (ret) 1046 + return dev_err_probe(dev, ret, "Failed to reset ADC\n"); 1047 + 1048 + ret = rt9467_get_value_from_ranges(data, F_ICHG, RT9467_RANGE_ICHG, 1049 + &data->ichg_ua); 1050 + ret |= rt9467_get_value_from_ranges(data, F_IEOC, RT9467_RANGE_IEOC, 1051 + &data->ieoc_ua); 1052 + if (ret) 1053 + return dev_err_probe(dev, ret, "Failed to init ichg/ieoc value\n"); 1054 + 1055 + ret = regmap_update_bits(data->regmap, RT9467_REG_CHG_STATC_CTRL, 1056 + RT9467_MASK_PWR_RDY | RT9467_MASK_MIVR_STAT, 0); 1057 + if (ret) 1058 + return dev_err_probe(dev, ret, "Failed to make statc unmask\n"); 1059 + 1060 + /* Select IINLMTSEL to use AICR */ 1061 + ret = regmap_field_write(data->rm_field[F_IINLMTSEL], 1062 + RT9467_IINLMTSEL_AICR); 1063 + if (ret) 1064 + return dev_err_probe(dev, ret, "Failed to set iinlmtsel to AICR\n"); 1065 + 1066 + /* Wait for AICR Rampping */ 1067 + msleep(150); 1068 + 1069 + /* Disable hardware ILIM */ 1070 + ret = regmap_field_write(data->rm_field[F_ILIM_EN], 0); 1071 + if (ret) 1072 + return dev_err_probe(dev, ret, "Failed to disable hardware ILIM\n"); 1073 + 1074 + /* Set inductor OCP to high level */ 1075 + ret = regmap_field_write(data->rm_field[F_OCP], 1); 1076 + if (ret) 1077 + return dev_err_probe(dev, ret, "Failed to set higher inductor OCP level\n"); 1078 + 1079 + /* Set charge termination default enable */ 1080 + ret = regmap_field_write(data->rm_field[F_TE], 1); 1081 + if (ret) 1082 + return dev_err_probe(dev, ret, "Failed to set TE=1\n"); 1083 + 1084 + /* Set 12hrs fast charger timer */ 1085 + ret = regmap_field_write(data->rm_field[F_WT_FC], 4); 1086 + if (ret) 1087 + return dev_err_probe(dev, ret, "Failed to set WT_FC\n"); 1088 + 1089 + /* Toggle BC12 function */ 1090 + ret = regmap_field_write(data->rm_field[F_USBCHGEN], 0); 1091 + if (ret) 1092 + return dev_err_probe(dev, ret, "Failed to disable BC12\n"); 1093 + 1094 + return regmap_field_write(data->rm_field[F_USBCHGEN], 1); 1095 + } 1096 + 1097 + static bool rt9467_is_accessible_reg(struct device *dev, unsigned int reg) 1098 + { 1099 + switch (reg) { 1100 + case 0x00 ... 0x1A: 1101 + case 0x20 ... 0x38: 1102 + case 0x40 ... 0x49: 1103 + case 0x50 ... 0x57: 1104 + case 0x60 ... 0x67: 1105 + case 0x70 ... 0x79: 1106 + case 0x82 ... 0x85: 1107 + return true; 1108 + default: 1109 + return false; 1110 + } 1111 + } 1112 + 1113 + static const struct regmap_config rt9467_regmap_config = { 1114 + .reg_bits = 8, 1115 + .val_bits = 8, 1116 + .max_register = 0x85, 1117 + .writeable_reg = rt9467_is_accessible_reg, 1118 + .readable_reg = rt9467_is_accessible_reg, 1119 + }; 1120 + 1121 + static int rt9467_check_vendor_info(struct rt9467_chg_data *data) 1122 + { 1123 + unsigned int vid; 1124 + int ret; 1125 + 1126 + ret = regmap_field_read(data->rm_field[F_VENDOR], &vid); 1127 + if (ret) { 1128 + dev_err(data->dev, "Failed to get vid\n"); 1129 + return ret; 1130 + } 1131 + 1132 + if ((vid != RT9466_VID) && (vid != RT9467_VID)) 1133 + return dev_err_probe(data->dev, -ENODEV, 1134 + "VID not correct [0x%02X]\n", vid); 1135 + 1136 + data->vid = vid; 1137 + return 0; 1138 + } 1139 + 1140 + static int rt9467_reset_chip(struct rt9467_chg_data *data) 1141 + { 1142 + int ret; 1143 + 1144 + /* Disable HZ before reset chip */ 1145 + ret = regmap_field_write(data->rm_field[F_HZ], 0); 1146 + if (ret) 1147 + return ret; 1148 + 1149 + return regmap_field_write(data->rm_field[F_RST], 1); 1150 + } 1151 + 1152 + static void rt9467_chg_destroy_adc_lock(void *data) 1153 + { 1154 + struct mutex *adc_lock = data; 1155 + 1156 + mutex_destroy(adc_lock); 1157 + } 1158 + 1159 + static void rt9467_chg_destroy_attach_lock(void *data) 1160 + { 1161 + struct mutex *attach_lock = data; 1162 + 1163 + mutex_destroy(attach_lock); 1164 + } 1165 + 1166 + static void rt9467_chg_destroy_ichg_ieoc_lock(void *data) 1167 + { 1168 + struct mutex *ichg_ieoc_lock = data; 1169 + 1170 + mutex_destroy(ichg_ieoc_lock); 1171 + } 1172 + 1173 + static void rt9467_chg_complete_aicl_done(void *data) 1174 + { 1175 + struct completion *aicl_done = data; 1176 + 1177 + complete(aicl_done); 1178 + } 1179 + 1180 + static int rt9467_charger_probe(struct i2c_client *i2c) 1181 + { 1182 + struct device *dev = &i2c->dev; 1183 + struct rt9467_chg_data *data; 1184 + struct gpio_desc *ceb_gpio; 1185 + int ret; 1186 + 1187 + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); 1188 + if (!data) 1189 + return -ENOMEM; 1190 + 1191 + data->dev = &i2c->dev; 1192 + i2c_set_clientdata(i2c, data); 1193 + 1194 + /* Default pull charge enable gpio to make 'CHG_EN' by SW control only */ 1195 + ceb_gpio = devm_gpiod_get_optional(dev, "charge-enable", GPIOD_OUT_LOW); 1196 + if (IS_ERR(ceb_gpio)) 1197 + return dev_err_probe(dev, PTR_ERR(ceb_gpio), 1198 + "Failed to config charge enable gpio\n"); 1199 + 1200 + data->regmap = devm_regmap_init_i2c(i2c, &rt9467_regmap_config); 1201 + if (IS_ERR(data->regmap)) 1202 + return dev_err_probe(dev, PTR_ERR(data->regmap), 1203 + "Failed to init regmap\n"); 1204 + 1205 + ret = devm_regmap_field_bulk_alloc(dev, data->regmap, 1206 + data->rm_field, rt9467_chg_fields, 1207 + ARRAY_SIZE(rt9467_chg_fields)); 1208 + if (ret) 1209 + return dev_err_probe(dev, ret, "Failed to alloc regmap fields\n"); 1210 + 1211 + ret = rt9467_check_vendor_info(data); 1212 + if (ret) 1213 + return dev_err_probe(dev, ret, "Failed to check vendor info"); 1214 + 1215 + ret = rt9467_reset_chip(data); 1216 + if (ret) 1217 + return dev_err_probe(dev, ret, "Failed to reset chip\n"); 1218 + 1219 + ret = devm_regmap_add_irq_chip(dev, data->regmap, i2c->irq, 1220 + IRQF_TRIGGER_LOW | IRQF_ONESHOT, 0, 1221 + &rt9467_irq_chip, &data->irq_chip_data); 1222 + if (ret) 1223 + return dev_err_probe(dev, ret, "Failed to add irq chip\n"); 1224 + 1225 + mutex_init(&data->adc_lock); 1226 + ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_adc_lock, 1227 + &data->adc_lock); 1228 + if (ret) 1229 + return dev_err_probe(dev, ret, "Failed to init ADC lock\n"); 1230 + 1231 + mutex_init(&data->attach_lock); 1232 + ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_attach_lock, 1233 + &data->attach_lock); 1234 + if (ret) 1235 + return dev_err_probe(dev, ret, "Failed to init attach lock\n"); 1236 + 1237 + mutex_init(&data->ichg_ieoc_lock); 1238 + ret = devm_add_action_or_reset(dev, rt9467_chg_destroy_ichg_ieoc_lock, 1239 + &data->ichg_ieoc_lock); 1240 + if (ret) 1241 + return dev_err_probe(dev, ret, "Failed to init ICHG/IEOC lock\n"); 1242 + 1243 + init_completion(&data->aicl_done); 1244 + ret = devm_add_action_or_reset(dev, rt9467_chg_complete_aicl_done, 1245 + &data->aicl_done); 1246 + if (ret) 1247 + return dev_err_probe(dev, ret, "Failed to init AICL done completion\n"); 1248 + 1249 + ret = rt9467_do_charger_init(data); 1250 + if (ret) 1251 + return ret; 1252 + 1253 + ret = rt9467_register_otg_regulator(data); 1254 + if (ret) 1255 + return ret; 1256 + 1257 + ret = rt9467_register_psy(data); 1258 + if (ret) 1259 + return ret; 1260 + 1261 + return rt9467_request_interrupt(data); 1262 + } 1263 + 1264 + static const struct of_device_id rt9467_charger_of_match_table[] = { 1265 + { .compatible = "richtek,rt9467", }, 1266 + {} 1267 + }; 1268 + MODULE_DEVICE_TABLE(of, rt9467_charger_of_match_table); 1269 + 1270 + static struct i2c_driver rt9467_charger_driver = { 1271 + .driver = { 1272 + .name = "rt9467-charger", 1273 + .of_match_table = rt9467_charger_of_match_table, 1274 + }, 1275 + .probe_new = rt9467_charger_probe, 1276 + }; 1277 + module_i2c_driver(rt9467_charger_driver); 1278 + 1279 + MODULE_DESCRIPTION("Richtek RT9467 Charger Driver"); 1280 + MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>"); 1281 + MODULE_AUTHOR("ChiaEn Wu <chiaen_wu@richtek.com>"); 1282 + MODULE_LICENSE("GPL");
+930
drivers/power/supply/rt9471.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright (C) 2022 Richtek Technology Corp. 4 + * 5 + * Authors: Alina Yu <alina_yu@richtek.com> 6 + * ChiYuan Huang <cy_huang@richtek.com> 7 + */ 8 + 9 + #include <linux/bits.h> 10 + #include <linux/gpio/consumer.h> 11 + #include <linux/i2c.h> 12 + #include <linux/interrupt.h> 13 + #include <linux/kstrtox.h> 14 + #include <linux/linear_range.h> 15 + #include <linux/mod_devicetable.h> 16 + #include <linux/module.h> 17 + #include <linux/mutex.h> 18 + #include <linux/of.h> 19 + #include <linux/power_supply.h> 20 + #include <linux/regmap.h> 21 + #include <linux/regulator/driver.h> 22 + #include <linux/sysfs.h> 23 + 24 + #define RT9471_REG_OTGCFG 0x00 25 + #define RT9471_REG_TOP 0x01 26 + #define RT9471_REG_FUNC 0x02 27 + #define RT9471_REG_IBUS 0x03 28 + #define RT9471_REG_VBUS 0x04 29 + #define RT9471_REG_PRECHG 0x05 30 + #define RT9471_REG_VCHG 0x07 31 + #define RT9471_REG_ICHG 0x08 32 + #define RT9471_REG_CHGTMR 0x09 33 + #define RT9471_REG_EOC 0x0A 34 + #define RT9471_REG_INFO 0x0B 35 + #define RT9471_REG_JEITA 0x0C 36 + #define RT9471_REG_PUMP_EXP 0x0D 37 + #define RT9471_REG_DPDMDET 0x0E 38 + #define RT9471_REG_ICSTAT 0x0F 39 + #define RT9471_REG_STAT0 0x10 40 + #define RT9471_REG_STAT1 0x11 41 + #define RT9471_REG_STAT2 0x12 42 + #define RT9471_REG_IRQ0 0x20 43 + #define RT9471_REG_MASK0 0x30 44 + 45 + #define RT9471_OTGCV_MASK GENMASK(7, 6) 46 + #define RT9471_OTGCC_MASK BIT(0) 47 + #define RT9471_OTGEN_MASK BIT(1) 48 + #define RT9471_CHGFAULT_MASK GENMASK(4, 1) 49 + 50 + #define RT9471_NUM_IRQ_REGS 4 51 + #define RT9471_OTGCV_MINUV 4850000 52 + #define RT9471_OTGCV_STEPUV 150000 53 + #define RT9471_NUM_VOTG 4 54 + #define RT9471_VCHG_MAXUV 4700000 55 + #define RT9471_ICHG_MAXUA 3150000 56 + 57 + /* Device ID */ 58 + #define RT9470_DEVID 0x09 59 + #define RT9470D_DEVID 0x0A 60 + #define RT9471_DEVID 0x0D 61 + #define RT9471D_DEVID 0x0E 62 + 63 + /* IRQ number */ 64 + #define RT9471_IRQ_BC12_DONE 0 65 + #define RT9471_IRQ_DETACH 1 66 + #define RT9471_IRQ_RECHG 2 67 + #define RT9471_IRQ_CHG_DONE 3 68 + #define RT9471_IRQ_BG_CHG 4 69 + #define RT9471_IRQ_IE0C 5 70 + #define RT9471_IRQ_CHG_RDY 6 71 + #define RT9471_IRQ_VBUS_GD 7 72 + #define RT9471_IRQ_CHG_BATOV 9 73 + #define RT9471_IRQ_CHG_SYSOV 10 74 + #define RT9471_IRQ_CHG_TOUT 11 75 + #define RT9471_IRQ_CHG_BUSUV 12 76 + #define RT9471_IRQ_CHG_THREG 13 77 + #define RT9471_IRQ_CHG_AICR 14 78 + #define RT9471_IRQ_CHG_MIVR 15 79 + #define RT9471_IRQ_SYS_SHORT 16 80 + #define RT9471_IRQ_SYS_MIN 17 81 + #define RT9471_IRQ_AICC_DONE 18 82 + #define RT9471_IRQ_PE_DONE 19 83 + #define RT9471_IRQ_JEITA_COLD 20 84 + #define RT9471_IRQ_JEITA_COOL 21 85 + #define RT9471_IRQ_JEITA_WARM 22 86 + #define RT9471_IRQ_JEITA_HOT 23 87 + #define RT9471_IRQ_OTG_FAULT 24 88 + #define RT9471_IRQ_OTG_LBP 25 89 + #define RT9471_IRQ_OTG_CC 26 90 + #define RT9471_IRQ_WDT 29 91 + #define RT9471_IRQ_VAC_OV 30 92 + #define RT9471_IRQ_OTP 31 93 + 94 + enum rt9471_fields { 95 + F_WDT = 0, 96 + F_WDT_RST, 97 + F_CHG_EN, 98 + F_HZ, 99 + F_BATFET_DIS, 100 + F_AICR, 101 + F_AICC_EN, 102 + F_MIVR, 103 + F_IPRE_CHG, 104 + F_VPRE_CHG, 105 + F_VBAT_REG, 106 + F_ICHG_REG, 107 + F_EOC_RST, 108 + F_TE, 109 + F_IEOC_CHG, 110 + F_DEVICE_ID, 111 + F_REG_RST, 112 + F_BC12_EN, 113 + F_IC_STAT, 114 + F_PORT_STAT, 115 + F_ST_CHG_DONE, 116 + F_ST_CHG_RDY, 117 + F_ST_VBUS_GD, 118 + F_MAX_FIELDS 119 + }; 120 + 121 + enum rt9471_ranges { 122 + RT9471_RANGE_AICR = 0, 123 + RT9471_RANGE_MIVR, 124 + RT9471_RANGE_IPRE, 125 + RT9471_RANGE_VCHG, 126 + RT9471_RANGE_ICHG, 127 + RT9471_RANGE_IEOC, 128 + RT9471_MAX_RANGES 129 + }; 130 + 131 + enum { 132 + RT9471_PORTSTAT_APPLE_10W = 8, 133 + RT9471_PORTSTAT_SAMSUNG_10W, 134 + RT9471_PORTSTAT_APPLE_5W, 135 + RT9471_PORTSTAT_APPLE_12W, 136 + RT9471_PORTSTAT_NSTD, 137 + RT9471_PORTSTAT_SDP, 138 + RT9471_PORTSTAT_CDP, 139 + RT9471_PORTSTAT_DCP, 140 + }; 141 + 142 + struct rt9471_chip { 143 + struct device *dev; 144 + struct regmap *regmap; 145 + struct regmap_field *rm_fields[F_MAX_FIELDS]; 146 + struct regmap_irq_chip_data *irq_chip_data; 147 + struct regulator_dev *otg_rdev; 148 + struct power_supply *psy; 149 + struct power_supply_desc psy_desc; 150 + struct mutex var_lock; 151 + enum power_supply_usb_type psy_usb_type; 152 + int psy_usb_curr; 153 + }; 154 + 155 + static const struct reg_field rt9471_reg_fields[F_MAX_FIELDS] = { 156 + [F_WDT] = REG_FIELD(RT9471_REG_TOP, 0, 0), 157 + [F_WDT_RST] = REG_FIELD(RT9471_REG_TOP, 1, 1), 158 + [F_CHG_EN] = REG_FIELD(RT9471_REG_FUNC, 0, 0), 159 + [F_HZ] = REG_FIELD(RT9471_REG_FUNC, 5, 5), 160 + [F_BATFET_DIS] = REG_FIELD(RT9471_REG_FUNC, 7, 7), 161 + [F_AICR] = REG_FIELD(RT9471_REG_IBUS, 0, 5), 162 + [F_AICC_EN] = REG_FIELD(RT9471_REG_IBUS, 7, 7), 163 + [F_MIVR] = REG_FIELD(RT9471_REG_VBUS, 0, 3), 164 + [F_IPRE_CHG] = REG_FIELD(RT9471_REG_PRECHG, 0, 3), 165 + [F_VPRE_CHG] = REG_FIELD(RT9471_REG_PRECHG, 4, 6), 166 + [F_VBAT_REG] = REG_FIELD(RT9471_REG_VCHG, 0, 6), 167 + [F_ICHG_REG] = REG_FIELD(RT9471_REG_ICHG, 0, 5), 168 + [F_EOC_RST] = REG_FIELD(RT9471_REG_EOC, 0, 0), 169 + [F_TE] = REG_FIELD(RT9471_REG_EOC, 1, 1), 170 + [F_IEOC_CHG] = REG_FIELD(RT9471_REG_EOC, 4, 7), 171 + [F_DEVICE_ID] = REG_FIELD(RT9471_REG_INFO, 3, 6), 172 + [F_REG_RST] = REG_FIELD(RT9471_REG_INFO, 7, 7), 173 + [F_BC12_EN] = REG_FIELD(RT9471_REG_DPDMDET, 7, 7), 174 + [F_IC_STAT] = REG_FIELD(RT9471_REG_ICSTAT, 0, 3), 175 + [F_PORT_STAT] = REG_FIELD(RT9471_REG_ICSTAT, 4, 7), 176 + [F_ST_CHG_DONE] = REG_FIELD(RT9471_REG_STAT0, 3, 3), 177 + [F_ST_CHG_RDY] = REG_FIELD(RT9471_REG_STAT0, 6, 6), 178 + [F_ST_VBUS_GD] = REG_FIELD(RT9471_REG_STAT0, 7, 7), 179 + }; 180 + 181 + static const struct linear_range rt9471_chg_ranges[RT9471_MAX_RANGES] = { 182 + [RT9471_RANGE_AICR] = { .min = 50000, .min_sel = 1, .max_sel = 63, .step = 50000 }, 183 + [RT9471_RANGE_MIVR] = { .min = 3900000, .min_sel = 0, .max_sel = 15, .step = 100000 }, 184 + [RT9471_RANGE_IPRE] = { .min = 50000, .min_sel = 0, .max_sel = 15, .step = 50000 }, 185 + [RT9471_RANGE_VCHG] = { .min = 3900000, .min_sel = 0, .max_sel = 80, .step = 10000 }, 186 + [RT9471_RANGE_ICHG] = { .min = 0, .min_sel = 0, .max_sel = 63, .step = 50000 }, 187 + [RT9471_RANGE_IEOC] = { .min = 50000, .min_sel = 0, .max_sel = 15, .step = 50000 }, 188 + }; 189 + 190 + static int rt9471_set_value_by_field_range(struct rt9471_chip *chip, 191 + enum rt9471_fields field, 192 + enum rt9471_ranges range, int val) 193 + { 194 + unsigned int sel; 195 + 196 + if (val < 0) 197 + return -EINVAL; 198 + 199 + linear_range_get_selector_within(rt9471_chg_ranges + range, val, &sel); 200 + 201 + return regmap_field_write(chip->rm_fields[field], sel); 202 + } 203 + 204 + 205 + static int rt9471_get_value_by_field_range(struct rt9471_chip *chip, 206 + enum rt9471_fields field, 207 + enum rt9471_ranges range, int *val) 208 + { 209 + unsigned int sel, rvalue; 210 + int ret; 211 + 212 + ret = regmap_field_read(chip->rm_fields[field], &sel); 213 + if (ret) 214 + return ret; 215 + 216 + ret = linear_range_get_value(rt9471_chg_ranges + range, sel, &rvalue); 217 + if (ret) 218 + return ret; 219 + 220 + *val = rvalue; 221 + return 0; 222 + } 223 + 224 + static int rt9471_set_ieoc(struct rt9471_chip *chip, int microamp) 225 + { 226 + int ret; 227 + 228 + if (microamp == 0) 229 + return regmap_field_write(chip->rm_fields[F_TE], 0); 230 + 231 + ret = rt9471_set_value_by_field_range(chip, F_IEOC_CHG, RT9471_RANGE_IEOC, microamp); 232 + if (ret) 233 + return ret; 234 + 235 + /* After applying the new IEOC value, enable charge termination */ 236 + return regmap_field_write(chip->rm_fields[F_TE], 1); 237 + } 238 + 239 + static int rt9471_get_ieoc(struct rt9471_chip *chip, int *microamp) 240 + { 241 + unsigned int chg_term_enable; 242 + int ret; 243 + 244 + ret = regmap_field_read(chip->rm_fields[F_TE], &chg_term_enable); 245 + if (ret) 246 + return ret; 247 + 248 + if (!chg_term_enable) { 249 + *microamp = 0; 250 + return 0; 251 + } 252 + 253 + return rt9471_get_value_by_field_range(chip, F_IEOC_CHG, RT9471_RANGE_IEOC, microamp); 254 + } 255 + 256 + static int rt9471_get_status(struct rt9471_chip *chip, int *status) 257 + { 258 + unsigned int chg_ready, chg_done, fault_stat; 259 + int ret; 260 + 261 + ret = regmap_field_read(chip->rm_fields[F_ST_CHG_RDY], &chg_ready); 262 + if (ret) 263 + return ret; 264 + 265 + ret = regmap_field_read(chip->rm_fields[F_ST_CHG_DONE], &chg_done); 266 + if (ret) 267 + return ret; 268 + 269 + ret = regmap_read(chip->regmap, RT9471_REG_STAT1, &fault_stat); 270 + if (ret) 271 + return ret; 272 + 273 + fault_stat &= RT9471_CHGFAULT_MASK; 274 + 275 + if (chg_ready && chg_done) 276 + *status = POWER_SUPPLY_STATUS_FULL; 277 + else if (chg_ready && fault_stat) 278 + *status = POWER_SUPPLY_STATUS_NOT_CHARGING; 279 + else if (chg_ready && !fault_stat) 280 + *status = POWER_SUPPLY_STATUS_CHARGING; 281 + else 282 + *status = POWER_SUPPLY_STATUS_DISCHARGING; 283 + 284 + return 0; 285 + } 286 + 287 + static int rt9471_get_vbus_good(struct rt9471_chip *chip, int *stat) 288 + { 289 + unsigned int vbus_gd; 290 + int ret; 291 + 292 + ret = regmap_field_read(chip->rm_fields[F_ST_VBUS_GD], &vbus_gd); 293 + if (ret) 294 + return ret; 295 + 296 + *stat = vbus_gd; 297 + return 0; 298 + } 299 + 300 + static int rt9471_get_usb_type(struct rt9471_chip *chip, int *usb_type) 301 + { 302 + mutex_lock(&chip->var_lock); 303 + *usb_type = chip->psy_usb_type; 304 + mutex_unlock(&chip->var_lock); 305 + 306 + return 0; 307 + } 308 + 309 + static int rt9471_get_usb_type_current(struct rt9471_chip *chip, 310 + int *microamp) 311 + { 312 + mutex_lock(&chip->var_lock); 313 + *microamp = chip->psy_usb_curr; 314 + mutex_unlock(&chip->var_lock); 315 + 316 + return 0; 317 + } 318 + 319 + static enum power_supply_property rt9471_charger_properties[] = { 320 + POWER_SUPPLY_PROP_STATUS, 321 + POWER_SUPPLY_PROP_ONLINE, 322 + POWER_SUPPLY_PROP_CURRENT_MAX, 323 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 324 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, 325 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 326 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX, 327 + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 328 + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT, 329 + POWER_SUPPLY_PROP_USB_TYPE, 330 + POWER_SUPPLY_PROP_PRECHARGE_CURRENT, 331 + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, 332 + POWER_SUPPLY_PROP_MODEL_NAME, 333 + POWER_SUPPLY_PROP_MANUFACTURER, 334 + }; 335 + 336 + static enum power_supply_usb_type rt9471_charger_usb_types[] = { 337 + POWER_SUPPLY_USB_TYPE_UNKNOWN, 338 + POWER_SUPPLY_USB_TYPE_SDP, 339 + POWER_SUPPLY_USB_TYPE_DCP, 340 + POWER_SUPPLY_USB_TYPE_CDP, 341 + POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID, 342 + }; 343 + 344 + static int rt9471_charger_property_is_writeable(struct power_supply *psy, 345 + enum power_supply_property psp) 346 + { 347 + switch (psp) { 348 + case POWER_SUPPLY_PROP_STATUS: 349 + case POWER_SUPPLY_PROP_ONLINE: 350 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 351 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 352 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 353 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 354 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 355 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 356 + return 1; 357 + default: 358 + return 0; 359 + } 360 + } 361 + 362 + static int rt9471_charger_set_property(struct power_supply *psy, 363 + enum power_supply_property psp, 364 + const union power_supply_propval *val) 365 + { 366 + struct rt9471_chip *chip = power_supply_get_drvdata(psy); 367 + int value = val->intval; 368 + 369 + switch (psp) { 370 + case POWER_SUPPLY_PROP_STATUS: 371 + return regmap_field_write(chip->rm_fields[F_CHG_EN], !!value); 372 + case POWER_SUPPLY_PROP_ONLINE: 373 + return regmap_field_write(chip->rm_fields[F_HZ], !value); 374 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 375 + return rt9471_set_value_by_field_range(chip, F_ICHG_REG, RT9471_RANGE_ICHG, value); 376 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 377 + return rt9471_set_value_by_field_range(chip, F_VBAT_REG, RT9471_RANGE_VCHG, value); 378 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 379 + return rt9471_set_value_by_field_range(chip, F_AICR, RT9471_RANGE_AICR, value); 380 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 381 + return rt9471_set_value_by_field_range(chip, F_MIVR, RT9471_RANGE_MIVR, value); 382 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 383 + return rt9471_set_value_by_field_range(chip, F_IPRE_CHG, RT9471_RANGE_IPRE, value); 384 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 385 + return rt9471_set_ieoc(chip, val->intval); 386 + default: 387 + return -EINVAL; 388 + } 389 + } 390 + 391 + static const char * const rt9471_manufacturer = "Richtek Technology Corp."; 392 + static const char * const rt9471_model = "RT9471"; 393 + 394 + static int rt9471_charger_get_property(struct power_supply *psy, 395 + enum power_supply_property psp, 396 + union power_supply_propval *val) 397 + { 398 + struct rt9471_chip *chip = power_supply_get_drvdata(psy); 399 + int *pvalue = &val->intval; 400 + 401 + switch (psp) { 402 + case POWER_SUPPLY_PROP_STATUS: 403 + return rt9471_get_status(chip, pvalue); 404 + case POWER_SUPPLY_PROP_ONLINE: 405 + return rt9471_get_vbus_good(chip, pvalue); 406 + case POWER_SUPPLY_PROP_CURRENT_MAX: 407 + return rt9471_get_usb_type_current(chip, pvalue); 408 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 409 + return rt9471_get_value_by_field_range(chip, F_ICHG_REG, RT9471_RANGE_ICHG, pvalue); 410 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: 411 + *pvalue = RT9471_ICHG_MAXUA; 412 + return 0; 413 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 414 + return rt9471_get_value_by_field_range(chip, F_VBAT_REG, RT9471_RANGE_VCHG, pvalue); 415 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX: 416 + val->intval = RT9471_VCHG_MAXUV; 417 + return 0; 418 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 419 + return rt9471_get_value_by_field_range(chip, F_AICR, RT9471_RANGE_AICR, pvalue); 420 + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: 421 + return rt9471_get_value_by_field_range(chip, F_MIVR, RT9471_RANGE_MIVR, pvalue); 422 + case POWER_SUPPLY_PROP_USB_TYPE: 423 + return rt9471_get_usb_type(chip, pvalue); 424 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 425 + return rt9471_get_value_by_field_range(chip, F_IPRE_CHG, RT9471_RANGE_IPRE, pvalue); 426 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 427 + return rt9471_get_ieoc(chip, pvalue); 428 + case POWER_SUPPLY_PROP_MODEL_NAME: 429 + val->strval = rt9471_model; 430 + return 0; 431 + case POWER_SUPPLY_PROP_MANUFACTURER: 432 + val->strval = rt9471_manufacturer; 433 + return 0; 434 + default: 435 + return -ENODATA; 436 + } 437 + } 438 + 439 + static irqreturn_t rt9471_vbus_gd_handler(int irqno, void *devid) 440 + { 441 + struct rt9471_chip *chip = devid; 442 + 443 + power_supply_changed(chip->psy); 444 + 445 + return IRQ_HANDLED; 446 + } 447 + 448 + static irqreturn_t rt9471_detach_handler(int irqno, void *devid) 449 + { 450 + struct rt9471_chip *chip = devid; 451 + unsigned int vbus_gd; 452 + int ret; 453 + 454 + ret = regmap_field_read(chip->rm_fields[F_ST_VBUS_GD], &vbus_gd); 455 + if (ret) 456 + return IRQ_NONE; 457 + 458 + /* Only focus on really detached */ 459 + if (vbus_gd) 460 + return IRQ_HANDLED; 461 + 462 + mutex_lock(&chip->var_lock); 463 + chip->psy_usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN; 464 + chip->psy_usb_curr = 0; 465 + mutex_unlock(&chip->var_lock); 466 + 467 + power_supply_changed(chip->psy); 468 + 469 + return IRQ_HANDLED; 470 + } 471 + 472 + static irqreturn_t rt9471_bc12_done_handler(int irqno, void *devid) 473 + { 474 + struct rt9471_chip *chip = devid; 475 + enum power_supply_usb_type usb_type; 476 + unsigned int port_stat; 477 + int usb_curr, ret; 478 + 479 + ret = regmap_field_read(chip->rm_fields[F_PORT_STAT], &port_stat); 480 + if (ret) 481 + return IRQ_NONE; 482 + 483 + switch (port_stat) { 484 + case RT9471_PORTSTAT_APPLE_10W: 485 + usb_type = POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID; 486 + usb_curr = 2000000; 487 + break; 488 + case RT9471_PORTSTAT_APPLE_5W: 489 + usb_type = POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID; 490 + usb_curr = 1000000; 491 + break; 492 + case RT9471_PORTSTAT_APPLE_12W: 493 + usb_type = POWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID; 494 + usb_curr = 2400000; 495 + break; 496 + case RT9471_PORTSTAT_SAMSUNG_10W: 497 + usb_type = POWER_SUPPLY_USB_TYPE_DCP; 498 + usb_curr = 2000000; 499 + break; 500 + case RT9471_PORTSTAT_DCP: 501 + usb_type = POWER_SUPPLY_USB_TYPE_DCP; 502 + usb_curr = 1500000; 503 + break; 504 + case RT9471_PORTSTAT_NSTD: 505 + case RT9471_PORTSTAT_SDP: 506 + usb_type = POWER_SUPPLY_USB_TYPE_SDP; 507 + usb_curr = 500000; 508 + break; 509 + case RT9471_PORTSTAT_CDP: 510 + usb_type = POWER_SUPPLY_USB_TYPE_CDP; 511 + usb_curr = 1500000; 512 + break; 513 + default: 514 + usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN; 515 + usb_curr = 0; 516 + break; 517 + } 518 + 519 + mutex_lock(&chip->var_lock); 520 + chip->psy_usb_type = usb_type; 521 + chip->psy_usb_curr = usb_curr; 522 + mutex_unlock(&chip->var_lock); 523 + 524 + power_supply_changed(chip->psy); 525 + 526 + return IRQ_HANDLED; 527 + } 528 + 529 + static irqreturn_t rt9471_wdt_handler(int irqno, void *devid) 530 + { 531 + struct rt9471_chip *chip = devid; 532 + int ret; 533 + 534 + ret = regmap_field_write(chip->rm_fields[F_WDT_RST], 1); 535 + 536 + return ret ? IRQ_NONE : IRQ_HANDLED; 537 + } 538 + 539 + static irqreturn_t rt9471_otg_fault_handler(int irqno, void *devid) 540 + { 541 + struct rt9471_chip *chip = devid; 542 + 543 + regulator_notifier_call_chain(chip->otg_rdev, REGULATOR_EVENT_FAIL, NULL); 544 + 545 + return IRQ_HANDLED; 546 + } 547 + 548 + #define RT9471_IRQ_DESC(_name, _hwirq) \ 549 + { \ 550 + .name = #_name, \ 551 + .hwirq = _hwirq, \ 552 + .handler = rt9471_##_name##_handler, \ 553 + } 554 + 555 + static int rt9471_register_interrupts(struct rt9471_chip *chip) 556 + { 557 + struct device *dev = chip->dev; 558 + static const struct { 559 + char *name; 560 + int hwirq; 561 + irq_handler_t handler; 562 + } chg_irqs[] = { 563 + RT9471_IRQ_DESC(vbus_gd, RT9471_IRQ_VBUS_GD), 564 + RT9471_IRQ_DESC(detach, RT9471_IRQ_DETACH), 565 + RT9471_IRQ_DESC(bc12_done, RT9471_IRQ_BC12_DONE), 566 + RT9471_IRQ_DESC(wdt, RT9471_IRQ_WDT), 567 + RT9471_IRQ_DESC(otg_fault, RT9471_IRQ_OTG_FAULT), 568 + }, *curr; 569 + int i, virq, ret; 570 + 571 + for (i = 0; i < ARRAY_SIZE(chg_irqs); i++) { 572 + curr = chg_irqs + i; 573 + 574 + virq = regmap_irq_get_virq(chip->irq_chip_data, curr->hwirq); 575 + if (virq <= 0) 576 + return virq; 577 + 578 + ret = devm_request_threaded_irq(dev, virq, NULL, curr->handler, 579 + IRQF_ONESHOT, curr->name, chip); 580 + if (ret) 581 + return dev_err_probe(dev, ret, "Failed to register IRQ (%s)\n", 582 + curr->name); 583 + } 584 + 585 + return 0; 586 + } 587 + 588 + static const struct regulator_ops rt9471_otg_ops = { 589 + .enable = regulator_enable_regmap, 590 + .disable = regulator_disable_regmap, 591 + .is_enabled = regulator_is_enabled_regmap, 592 + .list_voltage = regulator_list_voltage_linear, 593 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 594 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 595 + .set_current_limit = regulator_set_current_limit_regmap, 596 + .get_current_limit = regulator_get_current_limit_regmap, 597 + }; 598 + 599 + static const unsigned int rt9471_otg_microamp[] = { 500000, 1200000, }; 600 + 601 + static const struct regulator_desc rt9471_otg_rdesc = { 602 + .of_match = of_match_ptr("usb-otg-vbus-regulator"), 603 + .name = "rt9471-otg-vbus", 604 + .owner = THIS_MODULE, 605 + .type = REGULATOR_VOLTAGE, 606 + .ops = &rt9471_otg_ops, 607 + .min_uV = RT9471_OTGCV_MINUV, 608 + .uV_step = RT9471_OTGCV_STEPUV, 609 + .n_voltages = RT9471_NUM_VOTG, 610 + .curr_table = rt9471_otg_microamp, 611 + .n_current_limits = ARRAY_SIZE(rt9471_otg_microamp), 612 + .enable_mask = RT9471_OTGEN_MASK, 613 + .enable_reg = RT9471_REG_FUNC, 614 + .vsel_reg = RT9471_REG_OTGCFG, 615 + .vsel_mask = RT9471_OTGCV_MASK, 616 + .csel_reg = RT9471_REG_OTGCFG, 617 + .csel_mask = RT9471_OTGCC_MASK, 618 + }; 619 + 620 + static int rt9471_register_otg_regulator(struct rt9471_chip *chip) 621 + { 622 + struct device *dev = chip->dev; 623 + struct regulator_config cfg = { .dev = dev, .driver_data = chip }; 624 + 625 + chip->otg_rdev = devm_regulator_register(dev, &rt9471_otg_rdesc, &cfg); 626 + 627 + return PTR_ERR_OR_ZERO(chip->otg_rdev); 628 + } 629 + 630 + static inline struct rt9471_chip *psy_device_to_chip(struct device *dev) 631 + { 632 + return power_supply_get_drvdata(to_power_supply(dev)); 633 + } 634 + 635 + static ssize_t sysoff_enable_show(struct device *dev, 636 + struct device_attribute *attr, char *buf) 637 + { 638 + struct rt9471_chip *chip = psy_device_to_chip(dev); 639 + unsigned int sysoff_enable; 640 + int ret; 641 + 642 + ret = regmap_field_read(chip->rm_fields[F_BATFET_DIS], &sysoff_enable); 643 + if (ret) 644 + return ret; 645 + 646 + return sysfs_emit(buf, "%d\n", sysoff_enable); 647 + } 648 + 649 + static ssize_t sysoff_enable_store(struct device *dev, 650 + struct device_attribute *attr, 651 + const char *buf, size_t count) 652 + { 653 + struct rt9471_chip *chip = psy_device_to_chip(dev); 654 + unsigned int tmp; 655 + int ret; 656 + 657 + ret = kstrtouint(buf, 10, &tmp); 658 + if (ret) 659 + return ret; 660 + 661 + ret = regmap_field_write(chip->rm_fields[F_BATFET_DIS], !!tmp); 662 + if (ret) 663 + return ret; 664 + 665 + return count; 666 + } 667 + 668 + static ssize_t port_detect_enable_show(struct device *dev, 669 + struct device_attribute *attr, char *buf) 670 + { 671 + struct rt9471_chip *chip = psy_device_to_chip(dev); 672 + unsigned int bc12_enable; 673 + int ret; 674 + 675 + ret = regmap_field_read(chip->rm_fields[F_BC12_EN], &bc12_enable); 676 + if (ret) 677 + return ret; 678 + 679 + return sysfs_emit(buf, "%d\n", bc12_enable); 680 + } 681 + 682 + static ssize_t port_detect_enable_store(struct device *dev, 683 + struct device_attribute *attr, 684 + const char *buf, size_t count) 685 + { 686 + struct rt9471_chip *chip = psy_device_to_chip(dev); 687 + unsigned int tmp; 688 + int ret; 689 + 690 + ret = kstrtouint(buf, 10, &tmp); 691 + if (ret) 692 + return ret; 693 + 694 + ret = regmap_field_write(chip->rm_fields[F_BC12_EN], !!tmp); 695 + if (ret) 696 + return ret; 697 + 698 + return count; 699 + } 700 + 701 + static DEVICE_ATTR_RW(sysoff_enable); 702 + static DEVICE_ATTR_RW(port_detect_enable); 703 + 704 + static struct attribute *rt9471_sysfs_attrs[] = { 705 + &dev_attr_sysoff_enable.attr, 706 + &dev_attr_port_detect_enable.attr, 707 + NULL 708 + }; 709 + 710 + ATTRIBUTE_GROUPS(rt9471_sysfs); 711 + 712 + static int rt9471_register_psy(struct rt9471_chip *chip) 713 + { 714 + struct device *dev = chip->dev; 715 + struct power_supply_desc *desc = &chip->psy_desc; 716 + struct power_supply_config cfg = {}; 717 + char *psy_name; 718 + 719 + cfg.drv_data = chip; 720 + cfg.of_node = dev->of_node; 721 + cfg.attr_grp = rt9471_sysfs_groups; 722 + 723 + psy_name = devm_kasprintf(dev, GFP_KERNEL, "rt9471-%s", dev_name(dev)); 724 + if (!psy_name) 725 + return -ENOMEM; 726 + 727 + desc->name = psy_name; 728 + desc->type = POWER_SUPPLY_TYPE_USB; 729 + desc->usb_types = rt9471_charger_usb_types; 730 + desc->num_usb_types = ARRAY_SIZE(rt9471_charger_usb_types); 731 + desc->properties = rt9471_charger_properties; 732 + desc->num_properties = ARRAY_SIZE(rt9471_charger_properties); 733 + desc->get_property = rt9471_charger_get_property; 734 + desc->set_property = rt9471_charger_set_property; 735 + desc->property_is_writeable = rt9471_charger_property_is_writeable; 736 + 737 + chip->psy = devm_power_supply_register(dev, desc, &cfg); 738 + 739 + return PTR_ERR_OR_ZERO(chip->psy); 740 + } 741 + 742 + static const struct regmap_irq rt9471_regmap_irqs[] = { 743 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_BC12_DONE, 8), 744 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_DETACH, 8), 745 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_RECHG, 8), 746 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_DONE, 8), 747 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_BG_CHG, 8), 748 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_IE0C, 8), 749 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_RDY, 8), 750 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_VBUS_GD, 8), 751 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_BATOV, 8), 752 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_SYSOV, 8), 753 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_TOUT, 8), 754 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_BUSUV, 8), 755 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_THREG, 8), 756 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_AICR, 8), 757 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_CHG_MIVR, 8), 758 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_SYS_SHORT, 8), 759 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_SYS_MIN, 8), 760 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_AICC_DONE, 8), 761 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_PE_DONE, 8), 762 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_JEITA_COLD, 8), 763 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_JEITA_COOL, 8), 764 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_JEITA_WARM, 8), 765 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_JEITA_HOT, 8), 766 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_OTG_FAULT, 8), 767 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_OTG_LBP, 8), 768 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_OTG_CC, 8), 769 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_WDT, 8), 770 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_VAC_OV, 8), 771 + REGMAP_IRQ_REG_LINE(RT9471_IRQ_OTP, 8), 772 + }; 773 + 774 + static const struct regmap_irq_chip rt9471_irq_chip = { 775 + .name = "rt9471-irqs", 776 + .status_base = RT9471_REG_IRQ0, 777 + .mask_base = RT9471_REG_MASK0, 778 + .num_regs = RT9471_NUM_IRQ_REGS, 779 + .irqs = rt9471_regmap_irqs, 780 + .num_irqs = ARRAY_SIZE(rt9471_regmap_irqs), 781 + }; 782 + 783 + static const struct reg_sequence rt9471_init_regs[] = { 784 + REG_SEQ0(RT9471_REG_INFO, 0x80), /* REG_RST */ 785 + REG_SEQ0(RT9471_REG_TOP, 0xC0), /* WDT = 0 */ 786 + REG_SEQ0(RT9471_REG_FUNC, 0x01), /* BATFET_DIS_DLY = 0 */ 787 + REG_SEQ0(RT9471_REG_IBUS, 0x0A), /* AUTO_AICR = 0 */ 788 + REG_SEQ0(RT9471_REG_VBUS, 0xC6), /* VAC_OVP = 14V */ 789 + REG_SEQ0(RT9471_REG_JEITA, 0x38), /* JEITA = 0 */ 790 + REG_SEQ0(RT9471_REG_DPDMDET, 0x31), /* BC12_EN = 0, DCP_DP_OPT = 1 */ 791 + }; 792 + 793 + static int rt9471_check_devinfo(struct rt9471_chip *chip) 794 + { 795 + struct device *dev = chip->dev; 796 + unsigned int dev_id; 797 + int ret; 798 + 799 + ret = regmap_field_read(chip->rm_fields[F_DEVICE_ID], &dev_id); 800 + if (ret) 801 + return dev_err_probe(dev, ret, "Failed to read device_id\n"); 802 + 803 + switch (dev_id) { 804 + case RT9470_DEVID: 805 + case RT9470D_DEVID: 806 + case RT9471_DEVID: 807 + case RT9471D_DEVID: 808 + return 0; 809 + default: 810 + return dev_err_probe(dev, -ENODEV, "Incorrect device id\n"); 811 + } 812 + } 813 + 814 + static bool rt9471_accessible_reg(struct device *dev, unsigned int reg) 815 + { 816 + switch (reg) { 817 + case 0x00 ... 0x0F: 818 + case 0x10 ... 0x13: 819 + case 0x20 ... 0x33: 820 + case 0x40 ... 0xA1: 821 + return true; 822 + default: 823 + return false; 824 + } 825 + } 826 + 827 + static const struct regmap_config rt9471_regmap_config = { 828 + .reg_bits = 8, 829 + .val_bits = 8, 830 + .max_register = 0xA1, 831 + .writeable_reg = rt9471_accessible_reg, 832 + .readable_reg = rt9471_accessible_reg, 833 + }; 834 + 835 + static int rt9471_probe(struct i2c_client *i2c) 836 + { 837 + struct device *dev = &i2c->dev; 838 + struct rt9471_chip *chip; 839 + struct gpio_desc *ce_gpio; 840 + struct regmap *regmap; 841 + int ret; 842 + 843 + chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); 844 + if (!chip) 845 + return -ENOMEM; 846 + 847 + chip->dev = dev; 848 + mutex_init(&chip->var_lock); 849 + i2c_set_clientdata(i2c, chip); 850 + 851 + /* Default pull charge enable gpio to make 'CHG_EN' by SW control only */ 852 + ce_gpio = devm_gpiod_get_optional(dev, "charge-enable", GPIOD_OUT_HIGH); 853 + if (IS_ERR(ce_gpio)) 854 + return dev_err_probe(dev, PTR_ERR(ce_gpio), 855 + "Failed to config charge enable gpio\n"); 856 + 857 + regmap = devm_regmap_init_i2c(i2c, &rt9471_regmap_config); 858 + if (IS_ERR(regmap)) 859 + return dev_err_probe(dev, PTR_ERR(regmap), "Failed to init regmap\n"); 860 + 861 + chip->regmap = regmap; 862 + 863 + ret = devm_regmap_field_bulk_alloc(dev, regmap, chip->rm_fields, 864 + rt9471_reg_fields, 865 + ARRAY_SIZE(rt9471_reg_fields)); 866 + if (ret) 867 + return dev_err_probe(dev, ret, "Failed to alloc regmap field\n"); 868 + 869 + ret = rt9471_check_devinfo(chip); 870 + if (ret) 871 + return ret; 872 + 873 + ret = regmap_register_patch(regmap, rt9471_init_regs, 874 + ARRAY_SIZE(rt9471_init_regs)); 875 + if (ret) 876 + return dev_err_probe(dev, ret, "Failed to init registers\n"); 877 + 878 + ret = devm_regmap_add_irq_chip(dev, regmap, i2c->irq, 879 + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 0, 880 + &rt9471_irq_chip, &chip->irq_chip_data); 881 + if (ret) 882 + return dev_err_probe(dev, ret, "Failed to add IRQ chip\n"); 883 + 884 + ret = rt9471_register_psy(chip); 885 + if (ret) 886 + return dev_err_probe(dev, ret, "Failed to register psy\n"); 887 + 888 + ret = rt9471_register_otg_regulator(chip); 889 + if (ret) 890 + return dev_err_probe(dev, ret, "Failed to register otg\n"); 891 + 892 + ret = rt9471_register_interrupts(chip); 893 + if (ret) 894 + return ret; 895 + 896 + /* After IRQs are all initialized, enable port detection by default */ 897 + return regmap_field_write(chip->rm_fields[F_BC12_EN], 1); 898 + } 899 + 900 + static void rt9471_shutdown(struct i2c_client *i2c) 901 + { 902 + struct rt9471_chip *chip = i2c_get_clientdata(i2c); 903 + 904 + /* 905 + * There's no external reset pin. Do register reset to guarantee charger 906 + * function is normal after shutdown 907 + */ 908 + regmap_field_write(chip->rm_fields[F_REG_RST], 1); 909 + } 910 + 911 + static const struct of_device_id rt9471_of_device_id[] = { 912 + { .compatible = "richtek,rt9471" }, 913 + {} 914 + }; 915 + MODULE_DEVICE_TABLE(of, rt9471_of_device_id); 916 + 917 + static struct i2c_driver rt9471_driver = { 918 + .driver = { 919 + .name = "rt9471", 920 + .of_match_table = rt9471_of_device_id, 921 + }, 922 + .probe_new = rt9471_probe, 923 + .shutdown = rt9471_shutdown, 924 + }; 925 + module_i2c_driver(rt9471_driver); 926 + 927 + MODULE_DESCRIPTION("Richtek RT9471 charger driver"); 928 + MODULE_AUTHOR("Alina Yu <alina_yu@richtek.com>"); 929 + MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>"); 930 + MODULE_LICENSE("GPL");
+1 -2
drivers/power/supply/test_power.c
··· 306 306 char buf[MAX_KEYLENGTH]; 307 307 int cr; 308 308 309 - strncpy(buf, key, MAX_KEYLENGTH); 310 - buf[MAX_KEYLENGTH-1] = '\0'; 309 + strscpy(buf, key, MAX_KEYLENGTH); 311 310 312 311 cr = strnlen(buf, MAX_KEYLENGTH) - 1; 313 312 if (cr < 0)
+2 -4
drivers/power/supply/twl4030_charger.c
··· 726 726 727 727 for (i = 0; i < ARRAY_SIZE(modes); i++) 728 728 if (mode == i) 729 - len += scnprintf(buf+len, PAGE_SIZE-len, 730 - "[%s] ", modes[i]); 729 + len += sysfs_emit_at(buf, len, "[%s] ", modes[i]); 731 730 else 732 - len += scnprintf(buf+len, PAGE_SIZE-len, 733 - "%s ", modes[i]); 731 + len += sysfs_emit_at(buf, len, "%s ", modes[i]); 734 732 buf[len-1] = '\n'; 735 733 return len; 736 734 }
+1 -1
drivers/power/supply/wm8350_power.c
··· 176 176 return 0; 177 177 } 178 178 179 - return sprintf(buf, "%s\n", charge); 179 + return sysfs_emit(buf, "%s\n", charge); 180 180 } 181 181 182 182 static DEVICE_ATTR_RO(charger_state);