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

Merge tag 'mfd-next-6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd

Pull MFD updates from Lee Jones:
"Maxim MAX77705:
- Added core MFD driver.
- Added charger driver.
- Added devicetree bindings for the charger and MFD core.
- Added Haptic controller support via the input subsystem.
- Added LED support.
- Added support to simple-mfd-i2c for fuel gauge and hwmon.

Samsung S2MPU05 (Exynos7870 PMIC):
- Added core MFD support.
- Added Regulator support for 21 LDOs and 5 BUCKs.
- Added devicetree bindings for regulators and the PMIC core.

TI TPS65215 & TPS65214:
- Added support to the existing TPS65219 driver.
- Added devicetree bindings.

STMicroelectronics STM32MP25:
- Added support to the stm32-timers MFD driver.
- Added devicetree bindings.

Congatec Board Controller (CGBC):
- Added HWMON support for internal sensors.
- Added support for the conga-SA8 module.

Microchip LAN969X:
- Enabled the at91-usart MFD driver for this architecture.

MediaTek MT6359:
- Added mfd_cell for mt6359-accdet to allow its driver to probe.

Other misc driver updates:
- AXP20X (AXP717): Added AXP717_TS_PIN_CFG register to writeable regs
for temperature sensor configuration.
- SM501: Switched to using BIT() macro to mitigate potential integer
overflows in GPIO functions.
- ENE KB3930: Added a NULL pointer check for off_gpios during probe
to prevent potential dereference.
- SYSCON: Added a check for invalid resource size to prevent issues
from DT misconfiguration.
- CGBC: Corrected signedness issues in cgbc_session_request
- intel_soc_pmic_chtdc_ti / intel_soc_pmic_crc: Removed unneeded
explicit assignment to REGCACHE_NONE.
- ipaq-micro / tps65010: Switched to using str_enable_disable()
helpers for clarity and potential size reduction.
- upboard-fpga: Removed unnecessary ACPI_PTR() annotation.
- max8997: Removed unused max8997_irq_exit() function, using devm_*
helpers instead.
- lp3943: Dropped unused #include <linux/pwm.h> from the header file.
- db8500-prcmu: Removed needless return statements in void APIs.
- qnap-mcu: Replaced commas with semicolons between expressions for
correctness.
- STA2X11: Removed the core MFD driver as the underlying platform
support was removed.
- EZX-PCAP: Removed the unused pcap_adc_sync function.
- PCF50633 (OpenMoko PMIC): Removed the entire driver (core, adc,
gpio, irq) as the underlying s3c24xx platform support was removed.

Devicetree updates:
- Converted fsl,mcu-mpc8349emitx binding to YAML
- Added qcom,msm8937-tcsr compatible
- Added microchip,sama7d65-flexcom compatible
- Added rockchip,rk3528-qos syscon compatible
- Added airoha,en7581-pbus-csr syscon compatible
- Added microchip,sama7d65-ddr3phy syscon compatible
- Added microchip,sama7d65-sfrbu syscon compatible"

* tag 'mfd-next-6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (49 commits)
mfd: cgbc-core: Add support for conga-SA8
dt-bindings: mfd: syscon: Add microchip,sama7d65-sfrbu
dt-bindings: mfd: syscon: Add microchip,sama7d65-ddr3phy
mfd: cgbc: Add support for HWMON
dt-bindings: mfd: syscon: Add the pbus-csr node for Airoha EN7581 SoC
mfd: cgbc-core: Cleanup signedness in cgbc_session_request()
mfd: pcf50633: Remove remaining PCF50633 support
mfd: pcf50633: Remove unused platform IRQ code
mfd: pcF50633-gpio: Remove unused driver
mfd: pcf50633-adc: Remove unused driver
mfd: qnap-mcu: Convert commas to semicolons in qnap_mcu_exec()
mfd: mt6397-core: Add mfd_cell for mt6359-accdet
dt-bindings: mfd: syscon: Add rk3528 QoS register compatible
dt-bindings: mfd: atmel,sama5d2-flexcom: Add microchip,sama7d65-flexcom
mfd: ezx-pcap: Remove unused pcap_adc_sync
mfd: db8500-prcmu: Remove needless return in three void APIs
mfd: Remove STA2x11 core driver
mfd: max77620: Allow building as a module
mfd: ene-kb3930: Fix a potential NULL pointer dereference
dt-bindings: mfd: qcom,tcsr: Add compatible for MSM8937
...

+2722 -2599
+4 -5
Documentation/devicetree/bindings/mfd/atmel,sama5d2-flexcom.yaml
··· 19 19 oneOf: 20 20 - const: atmel,sama5d2-flexcom 21 21 - items: 22 - - const: microchip,sam9x7-flexcom 22 + - enum: 23 + - microchip,sam9x7-flexcom 24 + - microchip,sama7d65-flexcom 25 + - microchip,sama7g5-flexcom 23 26 - const: atmel,sama5d2-flexcom 24 - - items: 25 - - const: microchip,sama7g5-flexcom 26 - - const: atmel,sama5d2-flexcom 27 - 28 27 29 28 reg: 30 29 maxItems: 1
+53
Documentation/devicetree/bindings/mfd/fsl,mcu-mpc8349emitx.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/mfd/fsl,mcu-mpc8349emitx.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Freescale MPC8349E-mITX-compatible Power Management Micro Controller Unit (MCU) 8 + 9 + maintainers: 10 + - J. Neuschäfer <j.ne@posteo.net> 11 + 12 + properties: 13 + compatible: 14 + oneOf: 15 + - items: 16 + - enum: 17 + - fsl,mc9s08qg8-mpc8315erdb 18 + - fsl,mc9s08qg8-mpc8349emitx 19 + - fsl,mc9s08qg8-mpc8377erdb 20 + - fsl,mc9s08qg8-mpc8378erdb 21 + - fsl,mc9s08qg8-mpc8379erdb 22 + - const: fsl,mcu-mpc8349emitx 23 + 24 + reg: 25 + maxItems: 1 26 + 27 + "#gpio-cells": 28 + const: 2 29 + 30 + gpio-controller: true 31 + 32 + required: 33 + - compatible 34 + - reg 35 + - "#gpio-cells" 36 + - gpio-controller 37 + 38 + additionalProperties: false 39 + 40 + examples: 41 + - | 42 + i2c { 43 + #address-cells = <1>; 44 + #size-cells = <0>; 45 + 46 + mcu@a { 47 + #gpio-cells = <2>; 48 + compatible = "fsl,mc9s08qg8-mpc8349emitx", 49 + "fsl,mcu-mpc8349emitx"; 50 + reg = <0x0a>; 51 + gpio-controller; 52 + }; 53 + };
+158
Documentation/devicetree/bindings/mfd/maxim,max77705.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/mfd/maxim,max77705.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Maxim MAX77705 Companion Power Management and USB Type-C interface 8 + 9 + maintainers: 10 + - Dzmitry Sankouski <dsankouski@gmail.com> 11 + 12 + description: | 13 + This is a part of device tree bindings for Maxim MAX77705. 14 + 15 + Maxim MAX77705 is a Companion Power Management and Type-C 16 + interface IC which includes charger, fuelgauge, LED, haptic motor driver and 17 + Type-C management. 18 + 19 + properties: 20 + compatible: 21 + const: maxim,max77705 22 + 23 + reg: 24 + maxItems: 1 25 + 26 + interrupts: 27 + maxItems: 1 28 + 29 + haptic: 30 + type: object 31 + additionalProperties: false 32 + 33 + properties: 34 + compatible: 35 + const: maxim,max77705-haptic 36 + 37 + haptic-supply: true 38 + 39 + pwms: 40 + maxItems: 1 41 + 42 + required: 43 + - compatible 44 + - haptic-supply 45 + - pwms 46 + 47 + leds: 48 + type: object 49 + additionalProperties: false 50 + description: 51 + Up to 4 LED channels supported. 52 + 53 + properties: 54 + compatible: 55 + const: maxim,max77705-rgb 56 + 57 + "#address-cells": 58 + const: 1 59 + 60 + "#size-cells": 61 + const: 0 62 + 63 + multi-led: 64 + type: object 65 + $ref: /schemas/leds/leds-class-multicolor.yaml# 66 + unevaluatedProperties: false 67 + 68 + properties: 69 + "#address-cells": 70 + const: 1 71 + 72 + "#size-cells": 73 + const: 0 74 + 75 + patternProperties: 76 + "^led@[0-3]$": 77 + type: object 78 + $ref: /schemas/leds/common.yaml# 79 + unevaluatedProperties: false 80 + 81 + properties: 82 + reg: 83 + maxItems: 1 84 + 85 + required: 86 + - reg 87 + 88 + patternProperties: 89 + "^led@[0-3]$": 90 + type: object 91 + $ref: /schemas/leds/common.yaml# 92 + unevaluatedProperties: false 93 + 94 + properties: 95 + reg: 96 + maxItems: 1 97 + 98 + required: 99 + - reg 100 + 101 + required: 102 + - compatible 103 + 104 + required: 105 + - compatible 106 + 107 + additionalProperties: false 108 + 109 + examples: 110 + - | 111 + #include <dt-bindings/interrupt-controller/irq.h> 112 + #include <dt-bindings/leds/common.h> 113 + 114 + i2c { 115 + #address-cells = <1>; 116 + #size-cells = <0>; 117 + 118 + pmic@66 { 119 + compatible = "maxim,max77705"; 120 + reg = <0x66>; 121 + interrupt-parent = <&pm8998_gpios>; 122 + interrupts = <11 IRQ_TYPE_LEVEL_LOW>; 123 + pinctrl-0 = <&chg_int_default>; 124 + pinctrl-names = "default"; 125 + 126 + leds { 127 + compatible = "maxim,max77705-rgb"; 128 + 129 + multi-led { 130 + color = <LED_COLOR_ID_RGB>; 131 + function = LED_FUNCTION_STATUS; 132 + #address-cells = <1>; 133 + #size-cells = <0>; 134 + 135 + led@1 { 136 + reg = <1>; 137 + color = <LED_COLOR_ID_RED>; 138 + }; 139 + 140 + led@2 { 141 + reg = <2>; 142 + color = <LED_COLOR_ID_GREEN>; 143 + }; 144 + 145 + led@3 { 146 + reg = <3>; 147 + color = <LED_COLOR_ID_BLUE>; 148 + }; 149 + }; 150 + }; 151 + 152 + haptic { 153 + compatible = "maxim,max77705-haptic"; 154 + haptic-supply = <&vib_regulator>; 155 + pwms = <&vib_pwm 0 50000>; 156 + }; 157 + }; 158 + };
+1
Documentation/devicetree/bindings/mfd/qcom,tcsr.yaml
··· 52 52 - qcom,tcsr-msm8660 53 53 - qcom,tcsr-msm8916 54 54 - qcom,tcsr-msm8917 55 + - qcom,tcsr-msm8937 55 56 - qcom,tcsr-msm8953 56 57 - qcom,tcsr-msm8960 57 58 - qcom,tcsr-msm8974
+13
Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml
··· 25 25 - samsung,s2mps14-pmic 26 26 - samsung,s2mps15-pmic 27 27 - samsung,s2mpu02-pmic 28 + - samsung,s2mpu05-pmic 28 29 29 30 clocks: 30 31 $ref: /schemas/clock/samsung,s2mps11.yaml ··· 123 122 properties: 124 123 regulators: 125 124 $ref: /schemas/regulator/samsung,s2mpu02.yaml 125 + samsung,s2mps11-acokb-ground: false 126 + samsung,s2mps11-wrstbi-ground: false 127 + 128 + - if: 129 + properties: 130 + compatible: 131 + contains: 132 + const: samsung,s2mpu05-pmic 133 + then: 134 + properties: 135 + regulators: 136 + $ref: /schemas/regulator/samsung,s2mpu05.yaml 126 137 samsung,s2mps11-acokb-ground: false 127 138 samsung,s2mps11-wrstbi-ground: false 128 139
+14 -4
Documentation/devicetree/bindings/mfd/st,stm32-timers.yaml
··· 21 21 22 22 properties: 23 23 compatible: 24 - const: st,stm32-timers 24 + enum: 25 + - st,stm32-timers 26 + - st,stm32mp25-timers 25 27 26 28 reg: 27 29 maxItems: 1 ··· 36 34 - const: int 37 35 38 36 resets: 37 + maxItems: 1 38 + 39 + power-domains: 39 40 maxItems: 1 40 41 41 42 dmas: ··· 82 77 83 78 properties: 84 79 compatible: 85 - const: st,stm32-pwm 80 + enum: 81 + - st,stm32-pwm 82 + - st,stm32mp25-pwm 86 83 87 84 "#pwm-cells": 88 85 const: 3 ··· 120 113 121 114 properties: 122 115 compatible: 123 - const: st,stm32-timer-counter 116 + enum: 117 + - st,stm32-timer-counter 118 + - st,stm32mp25-timer-counter 124 119 125 120 required: 126 121 - compatible ··· 137 128 enum: 138 129 - st,stm32-timer-trigger 139 130 - st,stm32h7-timer-trigger 131 + - st,stm32mp25-timer-trigger 140 132 141 133 reg: 142 134 description: Identify trigger hardware block. 143 135 items: 144 136 minimum: 0 145 - maximum: 16 137 + maximum: 19 146 138 147 139 required: 148 140 - compatible
+6
Documentation/devicetree/bindings/mfd/syscon.yaml
··· 27 27 compatible: 28 28 contains: 29 29 enum: 30 + - airoha,en7581-pbus-csr 30 31 - al,alpine-sysfabric-service 31 32 - allwinner,sun8i-a83t-system-controller 32 33 - allwinner,sun8i-h3-system-controller ··· 91 90 - microchip,lan966x-cpu-syscon 92 91 - microchip,mpfs-sysreg-scb 93 92 - microchip,sam9x60-sfr 93 + - microchip,sama7d65-ddr3phy 94 + - microchip,sama7d65-sfrbu 94 95 - microchip,sama7g5-ddr3phy 95 96 - mscc,ocelot-cpu-syscon 96 97 - mstar,msc313-pmsleep ··· 130 127 compatible: 131 128 items: 132 129 - enum: 130 + - airoha,en7581-pbus-csr 133 131 - al,alpine-sysfabric-service 134 132 - allwinner,sun8i-a83t-system-controller 135 133 - allwinner,sun8i-h3-system-controller ··· 194 190 - microchip,lan966x-cpu-syscon 195 191 - microchip,mpfs-sysreg-scb 196 192 - microchip,sam9x60-sfr 193 + - microchip,sama7d65-ddr3phy 194 + - microchip,sama7d65-sfrbu 197 195 - microchip,sama7g5-ddr3phy 198 196 - mscc,ocelot-cpu-syscon 199 197 - mstar,msc313-pmsleep
+50
Documentation/devicetree/bindings/power/supply/maxim,max77705.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/power/supply/maxim,max77705.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Maxim MAX777705 charger 8 + 9 + maintainers: 10 + - Dzmitry Sankouski <dsankouski@gmail.com> 11 + 12 + description: | 13 + This is a device tree bindings for charger found in Maxim MAX77705 chip. 14 + 15 + allOf: 16 + - $ref: power-supply.yaml# 17 + 18 + properties: 19 + compatible: 20 + const: maxim,max77705-charger 21 + 22 + interrupts: 23 + maxItems: 1 24 + 25 + reg: 26 + maxItems: 1 27 + 28 + required: 29 + - compatible 30 + - reg 31 + - monitored-battery 32 + 33 + unevaluatedProperties: false 34 + 35 + examples: 36 + - | 37 + #include <dt-bindings/interrupt-controller/irq.h> 38 + 39 + i2c { 40 + #address-cells = <1>; 41 + #size-cells = <0>; 42 + 43 + charger@69 { 44 + compatible = "maxim,max77705-charger"; 45 + reg = <0x69>; 46 + monitored-battery = <&battery>; 47 + interrupt-parent = <&pm8998_gpios>; 48 + interrupts = <11 IRQ_TYPE_LEVEL_LOW>; 49 + }; 50 + };
-17
Documentation/devicetree/bindings/powerpc/fsl/mcu-mpc8349emitx.txt
··· 1 - Freescale MPC8349E-mITX-compatible Power Management Micro Controller Unit (MCU) 2 - 3 - Required properties: 4 - - compatible : "fsl,<mcu-chip>-<board>", "fsl,mcu-mpc8349emitx". 5 - - reg : should specify I2C address (0x0a). 6 - - #gpio-cells : should be 2. 7 - - gpio-controller : should be present. 8 - 9 - Example: 10 - 11 - mcu@a { 12 - #gpio-cells = <2>; 13 - compatible = "fsl,mc9s08qg8-mpc8349emitx", 14 - "fsl,mcu-mpc8349emitx"; 15 - reg = <0x0a>; 16 - gpio-controller; 17 - };
+47
Documentation/devicetree/bindings/regulator/samsung,s2mpu05.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/regulator/samsung,s2mpu05.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Samsung S2MPU05 Power Management IC regulators 8 + 9 + maintainers: 10 + - Kaustabh Chakraborty <kauschluss@disroot.org> 11 + 12 + description: | 13 + This is a part of device tree bindings for S2M and S5M family of Power 14 + Management IC (PMIC). 15 + 16 + The S2MPU05 provides buck and LDO regulators. 17 + 18 + See also Documentation/devicetree/bindings/mfd/samsung,s2mps11.yaml for 19 + additional information and example. 20 + 21 + patternProperties: 22 + # 21 LDOs 23 + "^ldo([1-9]|10|2[5-9]|3[0-5])$": 24 + type: object 25 + $ref: regulator.yaml# 26 + unevaluatedProperties: false 27 + description: 28 + Properties for single LDO regulator. 29 + 30 + LDOs 11-24 are used for CP, and they're left unimplemented due to lack 31 + of documentation on these regulators. 32 + 33 + required: 34 + - regulator-name 35 + 36 + # 5 bucks 37 + "^buck[1-5]$": 38 + type: object 39 + $ref: regulator.yaml# 40 + unevaluatedProperties: false 41 + description: 42 + Properties for single buck regulator. 43 + 44 + required: 45 + - regulator-name 46 + 47 + additionalProperties: false
+26 -1
Documentation/devicetree/bindings/regulator/ti,tps65219.yaml
··· 4 4 $id: http://devicetree.org/schemas/regulator/ti,tps65219.yaml# 5 5 $schema: http://devicetree.org/meta-schemas/core.yaml# 6 6 7 - title: TI tps65219 Power Management Integrated Circuit regulators 7 + title: TI TPS65214/TPS65215/TPS65219 Power Management Integrated Circuit 8 8 9 9 maintainers: 10 10 - Jerome Neanne <jerome.neanne@baylibre.com> ··· 12 12 description: | 13 13 Regulator nodes should be named to buck<number> and ldo<number>. 14 14 15 + TI TPS65219 is a Power Management IC with 3 Buck regulators, 4 Low 16 + Drop-out Regulators (LDOs), 1 GPIO, 2 GPOs, and power-button. 17 + 18 + TI TPS65215 is a derivative of TPS65219 with 3 Buck regulators, 2 Low 19 + Drop-out Regulators (LDOs), 1 GPIO, 1 GPO, and power-button. 20 + 21 + TI TPS65214 is a derivative of TPS65219 with 3 Buck regulators, 2 Low 22 + Drop-out Regulators (LDOs), 1 GPIO, 1 GPO, and power-button. 23 + 15 24 properties: 16 25 compatible: 17 26 enum: 27 + - ti,tps65214 28 + - ti,tps65215 18 29 - ti,tps65219 19 30 20 31 reg: ··· 100 89 - regulators 101 90 102 91 additionalProperties: false 92 + 93 + allOf: 94 + - if: 95 + properties: 96 + compatible: 97 + contains: 98 + enum: 99 + - ti,tps65214 100 + - ti,tps65215 101 + then: 102 + properties: 103 + regulators: 104 + patternProperties: 105 + "^ldo[3-4]$": false 103 106 104 107 examples: 105 108 - |
+4
MAINTAINERS
··· 14524 14524 F: Documentation/devicetree/bindings/*/maxim,max14577.yaml 14525 14525 F: Documentation/devicetree/bindings/*/maxim,max77686.yaml 14526 14526 F: Documentation/devicetree/bindings/*/maxim,max77693.yaml 14527 + F: Documentation/devicetree/bindings/*/maxim,max77705*.yaml 14527 14528 F: Documentation/devicetree/bindings/*/maxim,max77843.yaml 14528 14529 F: Documentation/devicetree/bindings/clock/maxim,max77686.txt 14530 + F: drivers/leds/leds-max77705.c 14529 14531 F: drivers/*/*max77843.c 14530 14532 F: drivers/*/max14577*.c 14531 14533 F: drivers/*/max77686*.c 14532 14534 F: drivers/*/max77693*.c 14535 + F: drivers/*/max77705*.c 14533 14536 F: drivers/clk/clk-max77686.c 14534 14537 F: drivers/extcon/extcon-max14577.c 14535 14538 F: drivers/extcon/extcon-max77693.c ··· 14540 14537 F: include/linux/mfd/max14577*.h 14541 14538 F: include/linux/mfd/max77686*.h 14542 14539 F: include/linux/mfd/max77693*.h 14540 + F: include/linux/mfd/max77705*.h 14543 14541 14544 14542 MAXIRADIO FM RADIO RECEIVER DRIVER 14545 14543 M: Hans Verkuil <hverkuil@xs4all.nl>
-3
arch/mips/configs/ip27_defconfig
··· 254 254 CONFIG_I2C_STUB=m 255 255 # CONFIG_HWMON is not set 256 256 CONFIG_THERMAL=y 257 - CONFIG_MFD_PCF50633=m 258 - CONFIG_PCF50633_ADC=m 259 - CONFIG_PCF50633_GPIO=m 260 257 # CONFIG_VGA_ARB is not set 261 258 CONFIG_LEDS_LP3944=m 262 259 CONFIG_LEDS_PCA955X=m
+3 -3
drivers/input/misc/Kconfig
··· 240 240 will be called max77650-onkey. 241 241 242 242 config INPUT_MAX77693_HAPTIC 243 - tristate "MAXIM MAX77693/MAX77843 haptic controller support" 244 - depends on (MFD_MAX77693 || MFD_MAX77843) && PWM 243 + tristate "MAXIM MAX77693/MAX77705/MAX77843 haptic controller support" 244 + depends on (MFD_MAX77693 || MFD_MAX77705 || MFD_MAX77843) && PWM 245 245 select INPUT_FF_MEMLESS 246 246 help 247 247 This option enables support for the haptic controller on 248 - MAXIM MAX77693 and MAX77843 chips. 248 + MAXIM MAX77693, MAX77705 and MAX77843 chips. 249 249 250 250 To compile this driver as module, choose M here: the 251 251 module will be called max77693-haptic.
+12 -1
drivers/input/misc/max77693-haptic.c
··· 24 24 #include <linux/mfd/max77693.h> 25 25 #include <linux/mfd/max77693-common.h> 26 26 #include <linux/mfd/max77693-private.h> 27 + #include <linux/mfd/max77705-private.h> 27 28 #include <linux/mfd/max77843-private.h> 28 29 29 30 #define MAX_MAGNITUDE_SHIFT 16 ··· 116 115 (haptic->mode << MAX77693_CONFIG2_HTYP) | 117 116 MAX77693_HAPTIC_PWM_DIVISOR_128); 118 117 config_reg = MAX77693_HAPTIC_REG_CONFIG2; 118 + break; 119 + case TYPE_MAX77705: 120 + value = ((haptic->type << MAX77693_CONFIG2_MODE) | 121 + (enable << MAX77693_CONFIG2_MEN) | 122 + (haptic->mode << MAX77693_CONFIG2_HTYP) | 123 + MAX77693_HAPTIC_PWM_DIVISOR_128); 124 + config_reg = MAX77705_PMIC_REG_MCONFIG; 119 125 break; 120 126 case TYPE_MAX77843: 121 127 value = (haptic->type << MCONFIG_MODE_SHIFT) | ··· 321 313 case TYPE_MAX77693: 322 314 haptic->regmap_haptic = max77693->regmap_haptic; 323 315 break; 316 + case TYPE_MAX77705: 324 317 case TYPE_MAX77843: 325 318 haptic->regmap_haptic = max77693->regmap; 326 319 break; ··· 417 408 418 409 static const struct platform_device_id max77693_haptic_id[] = { 419 410 { "max77693-haptic", }, 411 + { "max77705-haptic", }, 420 412 { "max77843-haptic", }, 421 413 {}, 422 414 }; ··· 425 415 426 416 static const struct of_device_id of_max77693_haptic_dt_match[] = { 427 417 { .compatible = "maxim,max77693-haptic", }, 418 + { .compatible = "maxim,max77705-haptic", }, 428 419 { .compatible = "maxim,max77843-haptic", }, 429 420 { /* sentinel */ }, 430 421 }; ··· 444 433 445 434 MODULE_AUTHOR("Jaewon Kim <jaewon02.kim@samsung.com>"); 446 435 MODULE_AUTHOR("Krzysztof Kozlowski <krzk@kernel.org>"); 447 - MODULE_DESCRIPTION("MAXIM 77693/77843 Haptic driver"); 436 + MODULE_DESCRIPTION("MAXIM 77693/77705/77843 Haptic driver"); 448 437 MODULE_LICENSE("GPL");
+8
drivers/leds/Kconfig
··· 778 778 help 779 779 LEDs driver for MAX77650 family of PMICs from Maxim Integrated. 780 780 781 + config LEDS_MAX77705 782 + tristate "LED support for Maxim MAX77705 PMIC" 783 + depends on MFD_MAX77705 784 + depends on LEDS_CLASS 785 + depends on LEDS_CLASS_MULTICOLOR 786 + help 787 + LED driver for MAX77705 PMIC from Maxim Integrated. 788 + 781 789 config LEDS_MAX8997 782 790 tristate "LED support for MAX8997 PMIC" 783 791 depends on LEDS_CLASS && MFD_MAX8997
+1
drivers/leds/Makefile
··· 61 61 obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o 62 62 obj-$(CONFIG_LEDS_MAX5970) += leds-max5970.o 63 63 obj-$(CONFIG_LEDS_MAX77650) += leds-max77650.o 64 + obj-$(CONFIG_LEDS_MAX77705) += leds-max77705.o 64 65 obj-$(CONFIG_LEDS_MAX8997) += leds-max8997.o 65 66 obj-$(CONFIG_LEDS_MC13783) += leds-mc13783.o 66 67 obj-$(CONFIG_LEDS_MENF21BMC) += leds-menf21bmc.o
+275
drivers/leds/leds-max77705.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Based on leds-max77650 driver 4 + * 5 + * LED driver for MAXIM 77705 PMIC. 6 + * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.org> 7 + */ 8 + 9 + #include <linux/i2c.h> 10 + #include <linux/led-class-multicolor.h> 11 + #include <linux/leds.h> 12 + #include <linux/mfd/max77705-private.h> 13 + #include <linux/module.h> 14 + #include <linux/platform_device.h> 15 + #include <linux/regmap.h> 16 + 17 + #define MAX77705_LED_NUM_LEDS 4 18 + #define MAX77705_LED_EN_MASK GENMASK(1, 0) 19 + #define MAX77705_LED_MAX_BRIGHTNESS 0xff 20 + #define MAX77705_LED_EN_SHIFT(reg) (reg * MAX77705_RGBLED_EN_WIDTH) 21 + #define MAX77705_LED_REG_BRIGHTNESS(reg) (reg + MAX77705_RGBLED_REG_LED0BRT) 22 + 23 + struct max77705_led { 24 + struct led_classdev cdev; 25 + struct led_classdev_mc mcdev; 26 + struct regmap *regmap; 27 + 28 + struct mc_subled *subled_info; 29 + }; 30 + 31 + static const struct regmap_config max77705_leds_regmap_config = { 32 + .reg_base = MAX77705_RGBLED_REG_BASE, 33 + .reg_bits = 8, 34 + .val_bits = 8, 35 + .max_register = MAX77705_LED_REG_END, 36 + }; 37 + 38 + static int max77705_rgb_blink(struct led_classdev *cdev, 39 + unsigned long *delay_on, 40 + unsigned long *delay_off) 41 + { 42 + struct max77705_led *led = container_of(cdev, struct max77705_led, cdev); 43 + int value, on_value, off_value; 44 + 45 + if (*delay_on < MAX77705_RGB_DELAY_100_STEP) 46 + on_value = 0; 47 + else if (*delay_on < MAX77705_RGB_DELAY_100_STEP_LIM) 48 + on_value = *delay_on / MAX77705_RGB_DELAY_100_STEP - 1; 49 + else if (*delay_on < MAX77705_RGB_DELAY_250_STEP_LIM) 50 + on_value = (*delay_on - MAX77705_RGB_DELAY_100_STEP_LIM) / 51 + MAX77705_RGB_DELAY_250_STEP + 52 + MAX77705_RGB_DELAY_100_STEP_COUNT; 53 + else 54 + on_value = 15; 55 + 56 + on_value <<= 4; 57 + 58 + if (*delay_off < 1) 59 + off_value = 0; 60 + else if (*delay_off < MAX77705_RGB_DELAY_500_STEP) 61 + off_value = 1; 62 + else if (*delay_off < MAX77705_RGB_DELAY_500_STEP_LIM) 63 + off_value = *delay_off / MAX77705_RGB_DELAY_500_STEP; 64 + else if (*delay_off < MAX77705_RGB_DELAY_1000_STEP_LIM) 65 + off_value = (*delay_off - MAX77705_RGB_DELAY_1000_STEP_LIM) / 66 + MAX77705_RGB_DELAY_1000_STEP + 67 + MAX77705_RGB_DELAY_500_STEP_COUNT; 68 + else if (*delay_off < MAX77705_RGB_DELAY_2000_STEP_LIM) 69 + off_value = (*delay_off - MAX77705_RGB_DELAY_2000_STEP_LIM) / 70 + MAX77705_RGB_DELAY_2000_STEP + 71 + MAX77705_RGB_DELAY_1000_STEP_COUNT; 72 + else 73 + off_value = 15; 74 + 75 + value = on_value | off_value; 76 + return regmap_write(led->regmap, MAX77705_RGBLED_REG_LEDBLNK, value); 77 + } 78 + 79 + static int max77705_led_brightness_set(struct regmap *regmap, struct mc_subled *subled, 80 + int num_colors) 81 + { 82 + int ret; 83 + 84 + for (int i = 0; i < num_colors; i++) { 85 + unsigned int channel, brightness; 86 + 87 + channel = subled[i].channel; 88 + brightness = subled[i].brightness; 89 + 90 + if (brightness == LED_OFF) { 91 + /* Flash OFF */ 92 + ret = regmap_update_bits(regmap, 93 + MAX77705_RGBLED_REG_LEDEN, 94 + MAX77705_LED_EN_MASK << MAX77705_LED_EN_SHIFT(channel), 0); 95 + } else { 96 + /* Set current */ 97 + ret = regmap_write(regmap, MAX77705_LED_REG_BRIGHTNESS(channel), 98 + brightness); 99 + if (ret < 0) 100 + return ret; 101 + 102 + ret = regmap_update_bits(regmap, 103 + MAX77705_RGBLED_REG_LEDEN, 104 + LED_ON << MAX77705_LED_EN_SHIFT(channel), 105 + MAX77705_LED_EN_MASK << MAX77705_LED_EN_SHIFT(channel)); 106 + } 107 + } 108 + 109 + return ret; 110 + } 111 + 112 + static int max77705_led_brightness_set_single(struct led_classdev *cdev, 113 + enum led_brightness brightness) 114 + { 115 + struct max77705_led *led = container_of(cdev, struct max77705_led, cdev); 116 + 117 + led->subled_info->brightness = brightness; 118 + 119 + return max77705_led_brightness_set(led->regmap, led->subled_info, 1); 120 + } 121 + 122 + static int max77705_led_brightness_set_multi(struct led_classdev *cdev, 123 + enum led_brightness brightness) 124 + { 125 + struct led_classdev_mc *mcdev = lcdev_to_mccdev(cdev); 126 + struct max77705_led *led = container_of(mcdev, struct max77705_led, mcdev); 127 + 128 + led_mc_calc_color_components(mcdev, brightness); 129 + 130 + return max77705_led_brightness_set(led->regmap, led->mcdev.subled_info, mcdev->num_colors); 131 + } 132 + 133 + static int max77705_parse_subled(struct device *dev, struct fwnode_handle *np, 134 + struct mc_subled *info) 135 + { 136 + u32 color = LED_COLOR_ID_GREEN; 137 + u32 reg; 138 + int ret; 139 + 140 + ret = fwnode_property_read_u32(np, "reg", &reg); 141 + if (ret || !reg || reg >= MAX77705_LED_NUM_LEDS) 142 + return dev_err_probe(dev, -EINVAL, "invalid \"reg\" of %pOFn\n", np); 143 + 144 + info->channel = reg; 145 + 146 + ret = fwnode_property_read_u32(np, "color", &color); 147 + if (ret < 0 && ret != -EINVAL) 148 + return dev_err_probe(dev, ret, 149 + "failed to parse \"color\" of %pOF\n", np); 150 + 151 + info->color_index = color; 152 + 153 + return 0; 154 + } 155 + 156 + static int max77705_add_led(struct device *dev, struct regmap *regmap, struct fwnode_handle *np) 157 + { 158 + int ret, i = 0; 159 + unsigned int color, reg; 160 + struct max77705_led *led; 161 + struct led_classdev *cdev; 162 + struct mc_subled *info; 163 + struct fwnode_handle *child; 164 + struct led_init_data init_data = {}; 165 + 166 + led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL); 167 + if (!led) 168 + return -ENOMEM; 169 + 170 + ret = fwnode_property_read_u32(np, "color", &color); 171 + if (ret < 0 && ret != -EINVAL) 172 + return dev_err_probe(dev, ret, 173 + "failed to parse \"color\" of %pOF\n", np); 174 + 175 + led->regmap = regmap; 176 + init_data.fwnode = np; 177 + 178 + if (color == LED_COLOR_ID_RGB) { 179 + int num_channels = of_get_available_child_count(to_of_node(np)); 180 + 181 + ret = fwnode_property_read_u32(np, "reg", &reg); 182 + if (ret || reg >= MAX77705_LED_NUM_LEDS) 183 + ret = -EINVAL; 184 + 185 + info = devm_kcalloc(dev, num_channels, sizeof(*info), GFP_KERNEL); 186 + if (!info) 187 + return -ENOMEM; 188 + 189 + cdev = &led->mcdev.led_cdev; 190 + cdev->max_brightness = MAX77705_LED_MAX_BRIGHTNESS; 191 + cdev->brightness_set_blocking = max77705_led_brightness_set_multi; 192 + cdev->blink_set = max77705_rgb_blink; 193 + 194 + fwnode_for_each_available_child_node(np, child) { 195 + ret = max77705_parse_subled(dev, child, &info[i]); 196 + if (ret < 0) 197 + return ret; 198 + 199 + info[i].intensity = 0; 200 + i++; 201 + } 202 + 203 + led->mcdev.subled_info = info; 204 + led->mcdev.num_colors = num_channels; 205 + led->cdev = *cdev; 206 + 207 + ret = devm_led_classdev_multicolor_register_ext(dev, &led->mcdev, &init_data); 208 + if (ret) 209 + return ret; 210 + 211 + ret = max77705_led_brightness_set_multi(&led->cdev, LED_OFF); 212 + if (ret) 213 + return ret; 214 + } else { 215 + info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); 216 + if (!info) 217 + return -ENOMEM; 218 + 219 + max77705_parse_subled(dev, np, info); 220 + 221 + led->subled_info = info; 222 + led->cdev.brightness_set_blocking = max77705_led_brightness_set_single; 223 + led->cdev.blink_set = max77705_rgb_blink; 224 + led->cdev.max_brightness = MAX77705_LED_MAX_BRIGHTNESS; 225 + 226 + ret = devm_led_classdev_register_ext(dev, &led->cdev, &init_data); 227 + if (ret) 228 + return ret; 229 + 230 + ret = max77705_led_brightness_set_single(&led->cdev, LED_OFF); 231 + if (ret) 232 + return ret; 233 + } 234 + 235 + return 0; 236 + } 237 + 238 + static int max77705_led_probe(struct platform_device *pdev) 239 + { 240 + struct device *dev = &pdev->dev; 241 + struct i2c_client *i2c = to_i2c_client(pdev->dev.parent); 242 + struct regmap *regmap; 243 + int ret; 244 + 245 + regmap = devm_regmap_init_i2c(i2c, &max77705_leds_regmap_config); 246 + if (IS_ERR(regmap)) 247 + return dev_err_probe(dev, PTR_ERR(regmap), "Failed to register LEDs regmap\n"); 248 + 249 + device_for_each_child_node_scoped(dev, child) { 250 + ret = max77705_add_led(dev, regmap, child); 251 + if (ret) 252 + return ret; 253 + } 254 + 255 + return 0; 256 + } 257 + 258 + static const struct of_device_id max77705_led_of_match[] = { 259 + { .compatible = "maxim,max77705-rgb" }, 260 + { } 261 + }; 262 + MODULE_DEVICE_TABLE(of, max77705_led_of_match); 263 + 264 + static struct platform_driver max77705_led_driver = { 265 + .driver = { 266 + .name = "max77705-led", 267 + .of_match_table = max77705_led_of_match, 268 + }, 269 + .probe = max77705_led_probe, 270 + }; 271 + module_platform_driver(max77705_led_driver); 272 + 273 + MODULE_DESCRIPTION("Maxim MAX77705 LED driver"); 274 + MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>"); 275 + MODULE_LICENSE("GPL");
+15 -32
drivers/mfd/Kconfig
··· 138 138 config MFD_AT91_USART 139 139 tristate "AT91 USART Driver" 140 140 select MFD_CORE 141 - depends on ARCH_AT91 || COMPILE_TEST 141 + depends on ARCH_AT91 || ARCH_LAN969X || COMPILE_TEST 142 142 help 143 143 Select this to get support for AT91 USART IP. This is a wrapper 144 144 over at91-usart-serial driver and usart-spi-driver. Only one function ··· 858 858 There are regulators and adc. 859 859 860 860 config MFD_MAX77620 861 - bool "Maxim Semiconductor MAX77620 and MAX20024 PMIC Support" 861 + tristate "Maxim Semiconductor MAX77620 and MAX20024 PMIC Support" 862 862 depends on I2C=y 863 863 depends on OF 864 864 select MFD_CORE ··· 912 912 Say yes here to add support for Maxim Semiconductor MAX77693. 913 913 This is a companion Power Management IC with Flash, Haptic, Charger, 914 914 and MUIC(Micro USB Interface Controller) controls on chip. 915 + This driver provides common support for accessing the device; 916 + additional drivers must be enabled in order to use the functionality 917 + of the device. 918 + 919 + config MFD_MAX77705 920 + tristate "Maxim MAX77705 PMIC Support" 921 + depends on I2C 922 + select MFD_CORE 923 + select MFD_SIMPLE_MFD_I2C 924 + help 925 + Say yes here to add support for Maxim Integrated MAX77705 PMIC. 926 + This is a Power Management IC with Charger, safe LDOs, Flash, Haptic 927 + and MUIC controls on chip. 915 928 This driver provides common support for accessing the device; 916 929 additional drivers must be enabled in order to use the functionality 917 930 of the device. ··· 1131 1118 help 1132 1119 Retu and Tahvo are a multi-function devices found on Nokia 1133 1120 Internet Tablets (770, N800 and N810). 1134 - 1135 - config MFD_PCF50633 1136 - tristate "NXP PCF50633" 1137 - depends on I2C 1138 - select REGMAP_I2C 1139 - help 1140 - Say yes here if you have NXP PCF50633 chip on your board. 1141 - This core driver provides register access and IRQ handling 1142 - facilities, and registers devices for the various functions 1143 - so that function-specific drivers can bind to them. 1144 - 1145 - config PCF50633_ADC 1146 - tristate "NXP PCF50633 ADC" 1147 - depends on MFD_PCF50633 1148 - help 1149 - Say yes here if you want to include support for ADC in the 1150 - NXP PCF50633 chip. 1151 - 1152 - config PCF50633_GPIO 1153 - tristate "NXP PCF50633 GPIO" 1154 - depends on MFD_PCF50633 1155 - help 1156 - Say yes here if you want to include support GPIO for pins on 1157 - the PCF50633 chip. 1158 1121 1159 1122 config MFD_PM8XXX 1160 1123 tristate "Qualcomm PM8xxx PMIC chips driver" ··· 1483 1494 help 1484 1495 This is used to enable SPI interface of STMPE 1485 1496 endmenu 1486 - 1487 - config MFD_STA2X11 1488 - bool "STMicroelectronics STA2X11" 1489 - depends on STA2X11 1490 - select MFD_CORE 1491 - select REGMAP_MMIO 1492 1497 1493 1498 config MFD_SUN6I_PRCM 1494 1499 bool "Allwinner A31/A23/A33 PRCM controller"
+1 -5
drivers/mfd/Makefile
··· 26 26 obj-$(CONFIG_MFD_TI_LP87565) += lp87565.o 27 27 obj-$(CONFIG_MFD_TI_AM335X_TSCADC) += ti_am335x_tscadc.o 28 28 29 - obj-$(CONFIG_MFD_STA2X11) += sta2x11-mfd.o 30 29 obj-$(CONFIG_MFD_STMPE) += stmpe.o 31 30 obj-$(CONFIG_STMPE_I2C) += stmpe-i2c.o 32 31 obj-$(CONFIG_STMPE_SPI) += stmpe-spi.o ··· 167 168 obj-$(CONFIG_MFD_MAX77650) += max77650.o 168 169 obj-$(CONFIG_MFD_MAX77686) += max77686.o 169 170 obj-$(CONFIG_MFD_MAX77693) += max77693.o 171 + obj-$(CONFIG_MFD_MAX77705) += max77705.o 170 172 obj-$(CONFIG_MFD_MAX77714) += max77714.o 171 173 obj-$(CONFIG_MFD_MAX77843) += max77843.o 172 174 obj-$(CONFIG_MFD_MAX8907) += max8907.o ··· 183 183 mt6397-objs := mt6397-core.o mt6397-irq.o mt6358-irq.o 184 184 obj-$(CONFIG_MFD_MT6397) += mt6397.o 185 185 186 - pcf50633-objs := pcf50633-core.o pcf50633-irq.o 187 - obj-$(CONFIG_MFD_PCF50633) += pcf50633.o 188 - obj-$(CONFIG_PCF50633_ADC) += pcf50633-adc.o 189 - obj-$(CONFIG_PCF50633_GPIO) += pcf50633-gpio.o 190 186 obj-$(CONFIG_RZ_MTU3) += rz-mtu3.o 191 187 obj-$(CONFIG_ABX500_CORE) += abx500-core.o 192 188 obj-$(CONFIG_MFD_DB8500_PRCMU) += db8500-prcmu.o
+1
drivers/mfd/axp20x.c
··· 224 224 regmap_reg_range(AXP717_VSYS_V_POWEROFF, AXP717_VSYS_V_POWEROFF), 225 225 regmap_reg_range(AXP717_IRQ0_EN, AXP717_IRQ4_EN), 226 226 regmap_reg_range(AXP717_IRQ0_STATE, AXP717_IRQ4_STATE), 227 + regmap_reg_range(AXP717_TS_PIN_CFG, AXP717_TS_PIN_CFG), 227 228 regmap_reg_range(AXP717_ICC_CHG_SET, AXP717_CV_CHG_SET), 228 229 regmap_reg_range(AXP717_DCDC_OUTPUT_CONTROL, AXP717_CPUSLDO_CONTROL), 229 230 regmap_reg_range(AXP717_ADC_CH_EN_CONTROL, AXP717_ADC_CH_EN_CONTROL),
+9 -1
drivers/mfd/cgbc-core.c
··· 96 96 97 97 static int cgbc_session_request(struct cgbc_device_data *cgbc) 98 98 { 99 - unsigned int ret; 99 + int ret; 100 100 101 101 ret = cgbc_wait_device(cgbc); 102 102 ··· 236 236 { .name = "cgbc-gpio" }, 237 237 { .name = "cgbc-i2c", .id = 1 }, 238 238 { .name = "cgbc-i2c", .id = 2 }, 239 + { .name = "cgbc-hwmon" }, 239 240 }; 240 241 241 242 static int cgbc_map(struct cgbc_device_data *cgbc) ··· 383 382 .matches = { 384 383 DMI_MATCH(DMI_BOARD_VENDOR, "congatec"), 385 384 DMI_MATCH(DMI_BOARD_NAME, "conga-SA7"), 385 + }, 386 + }, 387 + { 388 + .ident = "SA8", 389 + .matches = { 390 + DMI_MATCH(DMI_BOARD_VENDOR, "congatec"), 391 + DMI_MATCH(DMI_BOARD_NAME, "conga-SA8"), 386 392 }, 387 393 }, 388 394 {}
+1 -1
drivers/mfd/ene-kb3930.c
··· 162 162 devm_gpiod_get_array_optional(dev, "off", GPIOD_IN); 163 163 if (IS_ERR(ddata->off_gpios)) 164 164 return PTR_ERR(ddata->off_gpios); 165 - if (ddata->off_gpios->ndescs < 2) { 165 + if (ddata->off_gpios && ddata->off_gpios->ndescs < 2) { 166 166 dev_err(dev, "invalid off-gpios property\n"); 167 167 return -EINVAL; 168 168 }
-33
drivers/mfd/ezx-pcap.c
··· 25 25 void *data; 26 26 }; 27 27 28 - struct pcap_adc_sync_request { 29 - u16 res[2]; 30 - struct completion completion; 31 - }; 32 - 33 28 struct pcap_chip { 34 29 struct spi_device *spi; 35 30 ··· 329 334 return 0; 330 335 } 331 336 EXPORT_SYMBOL_GPL(pcap_adc_async); 332 - 333 - static void pcap_adc_sync_cb(void *param, u16 res[]) 334 - { 335 - struct pcap_adc_sync_request *req = param; 336 - 337 - req->res[0] = res[0]; 338 - req->res[1] = res[1]; 339 - complete(&req->completion); 340 - } 341 - 342 - int pcap_adc_sync(struct pcap_chip *pcap, u8 bank, u32 flags, u8 ch[], 343 - u16 res[]) 344 - { 345 - struct pcap_adc_sync_request sync_data; 346 - int ret; 347 - 348 - init_completion(&sync_data.completion); 349 - ret = pcap_adc_async(pcap, bank, flags, ch, pcap_adc_sync_cb, 350 - &sync_data); 351 - if (ret) 352 - return ret; 353 - wait_for_completion(&sync_data.completion); 354 - res[0] = sync_data.res[0]; 355 - res[1] = sync_data.res[1]; 356 - 357 - return 0; 358 - } 359 - EXPORT_SYMBOL_GPL(pcap_adc_sync); 360 337 361 338 /* subdevs */ 362 339 static int pcap_remove_subdev(struct device *dev, void *unused)
-1
drivers/mfd/intel_soc_pmic_chtdc_ti.c
··· 82 82 .reg_bits = 8, 83 83 .val_bits = 8, 84 84 .max_register = 0xff, 85 - .cache_type = REGCACHE_NONE, 86 85 }; 87 86 88 87 static const struct regmap_irq chtdc_ti_irqs[] = {
-1
drivers/mfd/intel_soc_pmic_crc.c
··· 113 113 .val_bits = 8, 114 114 115 115 .max_register = CRYSTAL_COVE_MAX_REGISTER, 116 - .cache_type = REGCACHE_NONE, 117 116 }; 118 117 119 118 static const struct regmap_irq crystal_cove_irqs[] = {
+2 -1
drivers/mfd/ipaq-micro.c
··· 22 22 #include <linux/mfd/core.h> 23 23 #include <linux/mfd/ipaq-micro.h> 24 24 #include <linux/string.h> 25 + #include <linux/string_choices.h> 25 26 #include <linux/random.h> 26 27 #include <linux/slab.h> 27 28 #include <linux/list.h> ··· 268 267 dev_info(micro->dev, "page mode: %u\n", ipaq_micro_to_u16(dump+84)); 269 268 dev_info(micro->dev, "country ID: %u\n", ipaq_micro_to_u16(dump+86)); 270 269 dev_info(micro->dev, "color display: %s\n", 271 - ipaq_micro_to_u16(dump+88) ? "yes" : "no"); 270 + str_yes_no(ipaq_micro_to_u16(dump + 88))); 272 271 dev_info(micro->dev, "ROM size: %u MiB\n", ipaq_micro_to_u16(dump+90)); 273 272 dev_info(micro->dev, "RAM size: %u KiB\n", ipaq_micro_to_u16(dump+92)); 274 273 dev_info(micro->dev, "screen: %u x %u\n",
+5
drivers/mfd/max77620.c
··· 29 29 #include <linux/mfd/core.h> 30 30 #include <linux/mfd/max77620.h> 31 31 #include <linux/init.h> 32 + #include <linux/module.h> 32 33 #include <linux/of.h> 33 34 #include <linux/regmap.h> 34 35 #include <linux/slab.h> ··· 701 700 .id_table = max77620_id, 702 701 }; 703 702 builtin_i2c_driver(max77620_driver); 703 + 704 + MODULE_DESCRIPTION("Maxim Semiconductor MAX77620 and MAX20024 PMIC Support"); 705 + MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>"); 706 + MODULE_LICENSE("GPL");
+182
drivers/mfd/max77705.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Maxim MAX77705 PMIC core driver 4 + * 5 + * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.com> 6 + **/ 7 + #include <linux/i2c.h> 8 + #include <linux/interrupt.h> 9 + #include <linux/mfd/core.h> 10 + #include <linux/mfd/max77705-private.h> 11 + #include <linux/mfd/max77693-common.h> 12 + #include <linux/pm.h> 13 + #include <linux/power/max17042_battery.h> 14 + #include <linux/module.h> 15 + #include <linux/regmap.h> 16 + #include <linux/of.h> 17 + 18 + static struct mfd_cell max77705_devs[] = { 19 + MFD_CELL_OF("max77705-rgb", NULL, NULL, 0, 0, "maxim,max77705-rgb"), 20 + MFD_CELL_OF("max77705-charger", NULL, NULL, 0, 0, "maxim,max77705-charger"), 21 + MFD_CELL_OF("max77705-haptic", NULL, NULL, 0, 0, "maxim,max77705-haptic"), 22 + }; 23 + 24 + static const struct regmap_range max77705_readable_ranges[] = { 25 + regmap_reg_range(MAX77705_PMIC_REG_PMICID1, MAX77705_PMIC_REG_BSTOUT_MASK), 26 + regmap_reg_range(MAX77705_PMIC_REG_INTSRC, MAX77705_PMIC_REG_RESERVED_29), 27 + regmap_reg_range(MAX77705_PMIC_REG_BOOSTCONTROL1, MAX77705_PMIC_REG_BOOSTCONTROL1), 28 + regmap_reg_range(MAX77705_PMIC_REG_MCONFIG, MAX77705_PMIC_REG_MCONFIG2), 29 + regmap_reg_range(MAX77705_PMIC_REG_FORCE_EN_MASK, MAX77705_PMIC_REG_FORCE_EN_MASK), 30 + regmap_reg_range(MAX77705_PMIC_REG_BOOSTCONTROL1, MAX77705_PMIC_REG_BOOSTCONTROL1), 31 + regmap_reg_range(MAX77705_PMIC_REG_BOOSTCONTROL2, MAX77705_PMIC_REG_BOOSTCONTROL2), 32 + regmap_reg_range(MAX77705_PMIC_REG_SW_RESET, MAX77705_PMIC_REG_USBC_RESET), 33 + }; 34 + 35 + static const struct regmap_range max77705_writable_ranges[] = { 36 + regmap_reg_range(MAX77705_PMIC_REG_MAINCTRL1, MAX77705_PMIC_REG_BSTOUT_MASK), 37 + regmap_reg_range(MAX77705_PMIC_REG_INTSRC, MAX77705_PMIC_REG_RESERVED_29), 38 + regmap_reg_range(MAX77705_PMIC_REG_BOOSTCONTROL1, MAX77705_PMIC_REG_BOOSTCONTROL1), 39 + regmap_reg_range(MAX77705_PMIC_REG_MCONFIG, MAX77705_PMIC_REG_MCONFIG2), 40 + regmap_reg_range(MAX77705_PMIC_REG_FORCE_EN_MASK, MAX77705_PMIC_REG_FORCE_EN_MASK), 41 + regmap_reg_range(MAX77705_PMIC_REG_BOOSTCONTROL1, MAX77705_PMIC_REG_BOOSTCONTROL1), 42 + regmap_reg_range(MAX77705_PMIC_REG_BOOSTCONTROL2, MAX77705_PMIC_REG_BOOSTCONTROL2), 43 + regmap_reg_range(MAX77705_PMIC_REG_SW_RESET, MAX77705_PMIC_REG_USBC_RESET), 44 + }; 45 + 46 + static const struct regmap_access_table max77705_readable_table = { 47 + .yes_ranges = max77705_readable_ranges, 48 + .n_yes_ranges = ARRAY_SIZE(max77705_readable_ranges), 49 + }; 50 + 51 + static const struct regmap_access_table max77705_writable_table = { 52 + .yes_ranges = max77705_writable_ranges, 53 + .n_yes_ranges = ARRAY_SIZE(max77705_writable_ranges), 54 + }; 55 + 56 + static const struct regmap_config max77705_regmap_config = { 57 + .reg_bits = 8, 58 + .val_bits = 8, 59 + .rd_table = &max77705_readable_table, 60 + .wr_table = &max77705_writable_table, 61 + .max_register = MAX77705_PMIC_REG_USBC_RESET, 62 + }; 63 + 64 + static const struct regmap_irq max77705_topsys_irqs[] = { 65 + { .mask = MAX77705_SYSTEM_IRQ_BSTEN_INT, }, 66 + { .mask = MAX77705_SYSTEM_IRQ_SYSUVLO_INT, }, 67 + { .mask = MAX77705_SYSTEM_IRQ_SYSOVLO_INT, }, 68 + { .mask = MAX77705_SYSTEM_IRQ_TSHDN_INT, }, 69 + { .mask = MAX77705_SYSTEM_IRQ_TM_INT, }, 70 + }; 71 + 72 + static const struct regmap_irq_chip max77705_topsys_irq_chip = { 73 + .name = "max77705-topsys", 74 + .status_base = MAX77705_PMIC_REG_SYSTEM_INT, 75 + .mask_base = MAX77705_PMIC_REG_SYSTEM_INT_MASK, 76 + .num_regs = 1, 77 + .irqs = max77705_topsys_irqs, 78 + .num_irqs = ARRAY_SIZE(max77705_topsys_irqs), 79 + }; 80 + 81 + static int max77705_i2c_probe(struct i2c_client *i2c) 82 + { 83 + struct device *dev = &i2c->dev; 84 + struct max77693_dev *max77705; 85 + struct regmap_irq_chip_data *irq_data; 86 + struct irq_domain *domain; 87 + enum max77705_hw_rev pmic_rev; 88 + unsigned int pmic_rev_value; 89 + int ret; 90 + 91 + max77705 = devm_kzalloc(dev, sizeof(*max77705), GFP_KERNEL); 92 + if (!max77705) 93 + return -ENOMEM; 94 + 95 + max77705->i2c = i2c; 96 + max77705->type = TYPE_MAX77705; 97 + i2c_set_clientdata(i2c, max77705); 98 + 99 + max77705->regmap = devm_regmap_init_i2c(i2c, &max77705_regmap_config); 100 + if (IS_ERR(max77705->regmap)) 101 + return PTR_ERR(max77705->regmap); 102 + 103 + ret = regmap_read(max77705->regmap, MAX77705_PMIC_REG_PMICREV, &pmic_rev_value); 104 + if (ret < 0) 105 + return -ENODEV; 106 + 107 + pmic_rev = pmic_rev_value & MAX77705_REVISION_MASK; 108 + if (pmic_rev != MAX77705_PASS3) 109 + return dev_err_probe(dev, -ENODEV, "Rev.0x%x is not tested\n", pmic_rev); 110 + 111 + ret = devm_regmap_add_irq_chip(dev, max77705->regmap, 112 + i2c->irq, 113 + IRQF_ONESHOT | IRQF_SHARED, 0, 114 + &max77705_topsys_irq_chip, 115 + &irq_data); 116 + if (ret) 117 + return dev_err_probe(dev, ret, "Failed to add IRQ chip\n"); 118 + 119 + /* Unmask interrupts from all blocks in interrupt source register */ 120 + ret = regmap_update_bits(max77705->regmap, 121 + MAX77705_PMIC_REG_INTSRC_MASK, 122 + MAX77705_SRC_IRQ_ALL, (unsigned int)~MAX77705_SRC_IRQ_ALL); 123 + if (ret < 0) 124 + return dev_err_probe(dev, ret, "Could not unmask interrupts in INTSRC\n"); 125 + 126 + domain = regmap_irq_get_domain(irq_data); 127 + 128 + ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, 129 + max77705_devs, ARRAY_SIZE(max77705_devs), 130 + NULL, 0, domain); 131 + if (ret) 132 + return dev_err_probe(dev, ret, "Failed to register child devices\n"); 133 + 134 + device_init_wakeup(dev, true); 135 + 136 + return 0; 137 + } 138 + 139 + static int max77705_suspend(struct device *dev) 140 + { 141 + struct i2c_client *i2c = to_i2c_client(dev); 142 + 143 + disable_irq(i2c->irq); 144 + 145 + if (device_may_wakeup(dev)) 146 + enable_irq_wake(i2c->irq); 147 + 148 + return 0; 149 + } 150 + 151 + static int max77705_resume(struct device *dev) 152 + { 153 + struct i2c_client *i2c = to_i2c_client(dev); 154 + 155 + if (device_may_wakeup(dev)) 156 + disable_irq_wake(i2c->irq); 157 + 158 + enable_irq(i2c->irq); 159 + 160 + return 0; 161 + } 162 + DEFINE_SIMPLE_DEV_PM_OPS(max77705_pm_ops, max77705_suspend, max77705_resume); 163 + 164 + static const struct of_device_id max77705_i2c_of_match[] = { 165 + { .compatible = "maxim,max77705" }, 166 + { } 167 + }; 168 + MODULE_DEVICE_TABLE(of, max77705_i2c_of_match); 169 + 170 + static struct i2c_driver max77705_i2c_driver = { 171 + .driver = { 172 + .name = "max77705", 173 + .of_match_table = max77705_i2c_of_match, 174 + .pm = pm_sleep_ptr(&max77705_pm_ops), 175 + }, 176 + .probe = max77705_i2c_probe 177 + }; 178 + module_i2c_driver(max77705_i2c_driver); 179 + 180 + MODULE_DESCRIPTION("Maxim MAX77705 PMIC core driver"); 181 + MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>"); 182 + MODULE_LICENSE("GPL");
+4 -11
drivers/mfd/max8997-irq.c
··· 335 335 } 336 336 max8997->irq_domain = domain; 337 337 338 - ret = request_threaded_irq(max8997->irq, NULL, max8997_irq_thread, 338 + ret = devm_request_threaded_irq(max8997->dev, max8997->irq, NULL, 339 + max8997_irq_thread, 339 340 IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 340 341 "max8997-irq", max8997); 341 342 ··· 349 348 if (!max8997->ono) 350 349 return 0; 351 350 352 - ret = request_threaded_irq(max8997->ono, NULL, max8997_irq_thread, 351 + ret = devm_request_threaded_irq(max8997->dev, max8997->ono, NULL, 352 + max8997_irq_thread, 353 353 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | 354 354 IRQF_ONESHOT, "max8997-ono", max8997); 355 355 ··· 359 357 max8997->ono, ret); 360 358 361 359 return 0; 362 - } 363 - 364 - void max8997_irq_exit(struct max8997_dev *max8997) 365 - { 366 - if (max8997->ono) 367 - free_irq(max8997->ono, max8997); 368 - 369 - if (max8997->irq) 370 - free_irq(max8997->irq, max8997); 371 360 }
+12
drivers/mfd/mt6397-core.c
··· 84 84 DEFINE_RES_IRQ_NAMED(MT6359_IRQ_HOMEKEY_R, "homekey_r"), 85 85 }; 86 86 87 + static const struct resource mt6359_accdet_resources[] = { 88 + DEFINE_RES_IRQ_NAMED(MT6359_IRQ_ACCDET, "accdet_irq"), 89 + DEFINE_RES_IRQ_NAMED(MT6359_IRQ_ACCDET_EINT0, "accdet_eint0"), 90 + DEFINE_RES_IRQ_NAMED(MT6359_IRQ_ACCDET_EINT1, "accdet_eint1"), 91 + }; 92 + 87 93 static const struct resource mt6323_keys_resources[] = { 88 94 DEFINE_RES_IRQ_NAMED(MT6323_IRQ_STATUS_PWRKEY, "powerkey"), 89 95 DEFINE_RES_IRQ_NAMED(MT6323_IRQ_STATUS_FCHRKEY, "homekey"), ··· 244 238 .num_resources = ARRAY_SIZE(mt6359_keys_resources), 245 239 .resources = mt6359_keys_resources, 246 240 .of_compatible = "mediatek,mt6359-keys" 241 + }, 242 + { 243 + .name = "mt6359-accdet", 244 + .of_compatible = "mediatek,mt6359-accdet", 245 + .num_resources = ARRAY_SIZE(mt6359_accdet_resources), 246 + .resources = mt6359_accdet_resources, 247 247 }, 248 248 }; 249 249
-255
drivers/mfd/pcf50633-adc.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* NXP PCF50633 ADC Driver 3 - * 4 - * (C) 2006-2008 by Openmoko, Inc. 5 - * Author: Balaji Rao <balajirrao@openmoko.org> 6 - * All rights reserved. 7 - * 8 - * Broken down from monstrous PCF50633 driver mainly by 9 - * Harald Welte, Andy Green and Werner Almesberger 10 - * 11 - * NOTE: This driver does not yet support subtractive ADC mode, which means 12 - * you can do only one measurement per read request. 13 - */ 14 - 15 - #include <linux/kernel.h> 16 - #include <linux/slab.h> 17 - #include <linux/module.h> 18 - #include <linux/device.h> 19 - #include <linux/platform_device.h> 20 - #include <linux/completion.h> 21 - 22 - #include <linux/mfd/pcf50633/core.h> 23 - #include <linux/mfd/pcf50633/adc.h> 24 - 25 - struct pcf50633_adc_request { 26 - int mux; 27 - int avg; 28 - void (*callback)(struct pcf50633 *, void *, int); 29 - void *callback_param; 30 - }; 31 - 32 - struct pcf50633_adc_sync_request { 33 - int result; 34 - struct completion completion; 35 - }; 36 - 37 - #define PCF50633_MAX_ADC_FIFO_DEPTH 8 38 - 39 - struct pcf50633_adc { 40 - struct pcf50633 *pcf; 41 - 42 - /* Private stuff */ 43 - struct pcf50633_adc_request *queue[PCF50633_MAX_ADC_FIFO_DEPTH]; 44 - int queue_head; 45 - int queue_tail; 46 - struct mutex queue_mutex; 47 - }; 48 - 49 - static inline struct pcf50633_adc *__to_adc(struct pcf50633 *pcf) 50 - { 51 - return platform_get_drvdata(pcf->adc_pdev); 52 - } 53 - 54 - static void adc_setup(struct pcf50633 *pcf, int channel, int avg) 55 - { 56 - channel &= PCF50633_ADCC1_ADCMUX_MASK; 57 - 58 - /* kill ratiometric, but enable ACCSW biasing */ 59 - pcf50633_reg_write(pcf, PCF50633_REG_ADCC2, 0x00); 60 - pcf50633_reg_write(pcf, PCF50633_REG_ADCC3, 0x01); 61 - 62 - /* start ADC conversion on selected channel */ 63 - pcf50633_reg_write(pcf, PCF50633_REG_ADCC1, channel | avg | 64 - PCF50633_ADCC1_ADCSTART | PCF50633_ADCC1_RES_10BIT); 65 - } 66 - 67 - static void trigger_next_adc_job_if_any(struct pcf50633 *pcf) 68 - { 69 - struct pcf50633_adc *adc = __to_adc(pcf); 70 - int head; 71 - 72 - head = adc->queue_head; 73 - 74 - if (!adc->queue[head]) 75 - return; 76 - 77 - adc_setup(pcf, adc->queue[head]->mux, adc->queue[head]->avg); 78 - } 79 - 80 - static int 81 - adc_enqueue_request(struct pcf50633 *pcf, struct pcf50633_adc_request *req) 82 - { 83 - struct pcf50633_adc *adc = __to_adc(pcf); 84 - int head, tail; 85 - 86 - mutex_lock(&adc->queue_mutex); 87 - 88 - head = adc->queue_head; 89 - tail = adc->queue_tail; 90 - 91 - if (adc->queue[tail]) { 92 - mutex_unlock(&adc->queue_mutex); 93 - dev_err(pcf->dev, "ADC queue is full, dropping request\n"); 94 - return -EBUSY; 95 - } 96 - 97 - adc->queue[tail] = req; 98 - if (head == tail) 99 - trigger_next_adc_job_if_any(pcf); 100 - adc->queue_tail = (tail + 1) & (PCF50633_MAX_ADC_FIFO_DEPTH - 1); 101 - 102 - mutex_unlock(&adc->queue_mutex); 103 - 104 - return 0; 105 - } 106 - 107 - static void pcf50633_adc_sync_read_callback(struct pcf50633 *pcf, void *param, 108 - int result) 109 - { 110 - struct pcf50633_adc_sync_request *req = param; 111 - 112 - req->result = result; 113 - complete(&req->completion); 114 - } 115 - 116 - int pcf50633_adc_sync_read(struct pcf50633 *pcf, int mux, int avg) 117 - { 118 - struct pcf50633_adc_sync_request req; 119 - int ret; 120 - 121 - init_completion(&req.completion); 122 - 123 - ret = pcf50633_adc_async_read(pcf, mux, avg, 124 - pcf50633_adc_sync_read_callback, &req); 125 - if (ret) 126 - return ret; 127 - 128 - wait_for_completion(&req.completion); 129 - 130 - return req.result; 131 - } 132 - EXPORT_SYMBOL_GPL(pcf50633_adc_sync_read); 133 - 134 - int pcf50633_adc_async_read(struct pcf50633 *pcf, int mux, int avg, 135 - void (*callback)(struct pcf50633 *, void *, int), 136 - void *callback_param) 137 - { 138 - struct pcf50633_adc_request *req; 139 - int ret; 140 - 141 - /* req is freed when the result is ready, in interrupt handler */ 142 - req = kmalloc(sizeof(*req), GFP_KERNEL); 143 - if (!req) 144 - return -ENOMEM; 145 - 146 - req->mux = mux; 147 - req->avg = avg; 148 - req->callback = callback; 149 - req->callback_param = callback_param; 150 - 151 - ret = adc_enqueue_request(pcf, req); 152 - if (ret) 153 - kfree(req); 154 - 155 - return ret; 156 - } 157 - EXPORT_SYMBOL_GPL(pcf50633_adc_async_read); 158 - 159 - static int adc_result(struct pcf50633 *pcf) 160 - { 161 - u8 adcs1, adcs3; 162 - u16 result; 163 - 164 - adcs1 = pcf50633_reg_read(pcf, PCF50633_REG_ADCS1); 165 - adcs3 = pcf50633_reg_read(pcf, PCF50633_REG_ADCS3); 166 - result = (adcs1 << 2) | (adcs3 & PCF50633_ADCS3_ADCDAT1L_MASK); 167 - 168 - dev_dbg(pcf->dev, "adc result = %d\n", result); 169 - 170 - return result; 171 - } 172 - 173 - static void pcf50633_adc_irq(int irq, void *data) 174 - { 175 - struct pcf50633_adc *adc = data; 176 - struct pcf50633 *pcf = adc->pcf; 177 - struct pcf50633_adc_request *req; 178 - int head, res; 179 - 180 - mutex_lock(&adc->queue_mutex); 181 - head = adc->queue_head; 182 - 183 - req = adc->queue[head]; 184 - if (WARN_ON(!req)) { 185 - dev_err(pcf->dev, "pcf50633-adc irq: ADC queue empty!\n"); 186 - mutex_unlock(&adc->queue_mutex); 187 - return; 188 - } 189 - adc->queue[head] = NULL; 190 - adc->queue_head = (head + 1) & 191 - (PCF50633_MAX_ADC_FIFO_DEPTH - 1); 192 - 193 - res = adc_result(pcf); 194 - trigger_next_adc_job_if_any(pcf); 195 - 196 - mutex_unlock(&adc->queue_mutex); 197 - 198 - req->callback(pcf, req->callback_param, res); 199 - kfree(req); 200 - } 201 - 202 - static int pcf50633_adc_probe(struct platform_device *pdev) 203 - { 204 - struct pcf50633_adc *adc; 205 - 206 - adc = devm_kzalloc(&pdev->dev, sizeof(*adc), GFP_KERNEL); 207 - if (!adc) 208 - return -ENOMEM; 209 - 210 - adc->pcf = dev_to_pcf50633(pdev->dev.parent); 211 - platform_set_drvdata(pdev, adc); 212 - 213 - pcf50633_register_irq(adc->pcf, PCF50633_IRQ_ADCRDY, 214 - pcf50633_adc_irq, adc); 215 - 216 - mutex_init(&adc->queue_mutex); 217 - 218 - return 0; 219 - } 220 - 221 - static void pcf50633_adc_remove(struct platform_device *pdev) 222 - { 223 - struct pcf50633_adc *adc = platform_get_drvdata(pdev); 224 - int i, head; 225 - 226 - pcf50633_free_irq(adc->pcf, PCF50633_IRQ_ADCRDY); 227 - 228 - mutex_lock(&adc->queue_mutex); 229 - head = adc->queue_head; 230 - 231 - if (WARN_ON(adc->queue[head])) 232 - dev_err(adc->pcf->dev, 233 - "adc driver removed with request pending\n"); 234 - 235 - for (i = 0; i < PCF50633_MAX_ADC_FIFO_DEPTH; i++) 236 - kfree(adc->queue[i]); 237 - 238 - mutex_unlock(&adc->queue_mutex); 239 - } 240 - 241 - static struct platform_driver pcf50633_adc_driver = { 242 - .driver = { 243 - .name = "pcf50633-adc", 244 - }, 245 - .probe = pcf50633_adc_probe, 246 - .remove = pcf50633_adc_remove, 247 - }; 248 - 249 - module_platform_driver(pcf50633_adc_driver); 250 - 251 - MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>"); 252 - MODULE_DESCRIPTION("PCF50633 adc driver"); 253 - MODULE_LICENSE("GPL"); 254 - MODULE_ALIAS("platform:pcf50633-adc"); 255 -
-304
drivers/mfd/pcf50633-core.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* NXP PCF50633 Power Management Unit (PMU) driver 3 - * 4 - * (C) 2006-2008 by Openmoko, Inc. 5 - * Author: Harald Welte <laforge@openmoko.org> 6 - * Balaji Rao <balajirrao@openmoko.org> 7 - * All rights reserved. 8 - */ 9 - 10 - #include <linux/kernel.h> 11 - #include <linux/device.h> 12 - #include <linux/sysfs.h> 13 - #include <linux/module.h> 14 - #include <linux/types.h> 15 - #include <linux/interrupt.h> 16 - #include <linux/workqueue.h> 17 - #include <linux/platform_device.h> 18 - #include <linux/i2c.h> 19 - #include <linux/pm.h> 20 - #include <linux/slab.h> 21 - #include <linux/regmap.h> 22 - #include <linux/err.h> 23 - 24 - #include <linux/mfd/pcf50633/core.h> 25 - 26 - /* Read a block of up to 32 regs */ 27 - int pcf50633_read_block(struct pcf50633 *pcf, u8 reg, 28 - int nr_regs, u8 *data) 29 - { 30 - int ret; 31 - 32 - ret = regmap_raw_read(pcf->regmap, reg, data, nr_regs); 33 - if (ret != 0) 34 - return ret; 35 - 36 - return nr_regs; 37 - } 38 - EXPORT_SYMBOL_GPL(pcf50633_read_block); 39 - 40 - /* Write a block of up to 32 regs */ 41 - int pcf50633_write_block(struct pcf50633 *pcf , u8 reg, 42 - int nr_regs, u8 *data) 43 - { 44 - return regmap_raw_write(pcf->regmap, reg, data, nr_regs); 45 - } 46 - EXPORT_SYMBOL_GPL(pcf50633_write_block); 47 - 48 - u8 pcf50633_reg_read(struct pcf50633 *pcf, u8 reg) 49 - { 50 - unsigned int val; 51 - int ret; 52 - 53 - ret = regmap_read(pcf->regmap, reg, &val); 54 - if (ret < 0) 55 - return -1; 56 - 57 - return val; 58 - } 59 - EXPORT_SYMBOL_GPL(pcf50633_reg_read); 60 - 61 - int pcf50633_reg_write(struct pcf50633 *pcf, u8 reg, u8 val) 62 - { 63 - return regmap_write(pcf->regmap, reg, val); 64 - } 65 - EXPORT_SYMBOL_GPL(pcf50633_reg_write); 66 - 67 - int pcf50633_reg_set_bit_mask(struct pcf50633 *pcf, u8 reg, u8 mask, u8 val) 68 - { 69 - return regmap_update_bits(pcf->regmap, reg, mask, val); 70 - } 71 - EXPORT_SYMBOL_GPL(pcf50633_reg_set_bit_mask); 72 - 73 - int pcf50633_reg_clear_bits(struct pcf50633 *pcf, u8 reg, u8 val) 74 - { 75 - return regmap_update_bits(pcf->regmap, reg, val, 0); 76 - } 77 - EXPORT_SYMBOL_GPL(pcf50633_reg_clear_bits); 78 - 79 - /* sysfs attributes */ 80 - static ssize_t dump_regs_show(struct device *dev, 81 - struct device_attribute *attr, char *buf) 82 - { 83 - struct pcf50633 *pcf = dev_get_drvdata(dev); 84 - u8 dump[16]; 85 - int n, n1, idx = 0; 86 - char *buf1 = buf; 87 - static u8 address_no_read[] = { /* must be ascending */ 88 - PCF50633_REG_INT1, 89 - PCF50633_REG_INT2, 90 - PCF50633_REG_INT3, 91 - PCF50633_REG_INT4, 92 - PCF50633_REG_INT5, 93 - 0 /* terminator */ 94 - }; 95 - 96 - for (n = 0; n < 256; n += sizeof(dump)) { 97 - for (n1 = 0; n1 < sizeof(dump); n1++) 98 - if (n == address_no_read[idx]) { 99 - idx++; 100 - dump[n1] = 0x00; 101 - } else 102 - dump[n1] = pcf50633_reg_read(pcf, n + n1); 103 - 104 - buf1 += sprintf(buf1, "%*ph\n", (int)sizeof(dump), dump); 105 - } 106 - 107 - return buf1 - buf; 108 - } 109 - static DEVICE_ATTR_ADMIN_RO(dump_regs); 110 - 111 - static ssize_t resume_reason_show(struct device *dev, 112 - struct device_attribute *attr, char *buf) 113 - { 114 - struct pcf50633 *pcf = dev_get_drvdata(dev); 115 - int n; 116 - 117 - n = sprintf(buf, "%02x%02x%02x%02x%02x\n", 118 - pcf->resume_reason[0], 119 - pcf->resume_reason[1], 120 - pcf->resume_reason[2], 121 - pcf->resume_reason[3], 122 - pcf->resume_reason[4]); 123 - 124 - return n; 125 - } 126 - static DEVICE_ATTR_ADMIN_RO(resume_reason); 127 - 128 - static struct attribute *pcf_sysfs_entries[] = { 129 - &dev_attr_dump_regs.attr, 130 - &dev_attr_resume_reason.attr, 131 - NULL, 132 - }; 133 - 134 - static struct attribute_group pcf_attr_group = { 135 - .name = NULL, /* put in device directory */ 136 - .attrs = pcf_sysfs_entries, 137 - }; 138 - 139 - static void 140 - pcf50633_client_dev_register(struct pcf50633 *pcf, const char *name, 141 - struct platform_device **pdev) 142 - { 143 - int ret; 144 - 145 - *pdev = platform_device_alloc(name, -1); 146 - if (!*pdev) { 147 - dev_err(pcf->dev, "Failed to allocate %s\n", name); 148 - return; 149 - } 150 - 151 - (*pdev)->dev.parent = pcf->dev; 152 - 153 - ret = platform_device_add(*pdev); 154 - if (ret) { 155 - dev_err(pcf->dev, "Failed to register %s: %d\n", name, ret); 156 - platform_device_put(*pdev); 157 - *pdev = NULL; 158 - } 159 - } 160 - 161 - static const struct regmap_config pcf50633_regmap_config = { 162 - .reg_bits = 8, 163 - .val_bits = 8, 164 - }; 165 - 166 - static int pcf50633_probe(struct i2c_client *client) 167 - { 168 - struct pcf50633 *pcf; 169 - struct platform_device *pdev; 170 - struct pcf50633_platform_data *pdata = dev_get_platdata(&client->dev); 171 - int i, j, ret; 172 - int version, variant; 173 - 174 - if (!client->irq) { 175 - dev_err(&client->dev, "Missing IRQ\n"); 176 - return -ENOENT; 177 - } 178 - 179 - pcf = devm_kzalloc(&client->dev, sizeof(*pcf), GFP_KERNEL); 180 - if (!pcf) 181 - return -ENOMEM; 182 - 183 - i2c_set_clientdata(client, pcf); 184 - pcf->dev = &client->dev; 185 - pcf->pdata = pdata; 186 - 187 - mutex_init(&pcf->lock); 188 - 189 - pcf->regmap = devm_regmap_init_i2c(client, &pcf50633_regmap_config); 190 - if (IS_ERR(pcf->regmap)) { 191 - ret = PTR_ERR(pcf->regmap); 192 - dev_err(pcf->dev, "Failed to allocate register map: %d\n", ret); 193 - return ret; 194 - } 195 - 196 - version = pcf50633_reg_read(pcf, 0); 197 - variant = pcf50633_reg_read(pcf, 1); 198 - if (version < 0 || variant < 0) { 199 - dev_err(pcf->dev, "Unable to probe pcf50633\n"); 200 - ret = -ENODEV; 201 - return ret; 202 - } 203 - 204 - dev_info(pcf->dev, "Probed device version %d variant %d\n", 205 - version, variant); 206 - 207 - pcf50633_irq_init(pcf, client->irq); 208 - 209 - /* Create sub devices */ 210 - pcf50633_client_dev_register(pcf, "pcf50633-input", &pcf->input_pdev); 211 - pcf50633_client_dev_register(pcf, "pcf50633-rtc", &pcf->rtc_pdev); 212 - pcf50633_client_dev_register(pcf, "pcf50633-mbc", &pcf->mbc_pdev); 213 - pcf50633_client_dev_register(pcf, "pcf50633-adc", &pcf->adc_pdev); 214 - pcf50633_client_dev_register(pcf, "pcf50633-backlight", &pcf->bl_pdev); 215 - 216 - 217 - for (i = 0; i < PCF50633_NUM_REGULATORS; i++) { 218 - pdev = platform_device_alloc("pcf50633-regulator", i); 219 - if (!pdev) { 220 - ret = -ENOMEM; 221 - goto err2; 222 - } 223 - 224 - pdev->dev.parent = pcf->dev; 225 - ret = platform_device_add_data(pdev, &pdata->reg_init_data[i], 226 - sizeof(pdata->reg_init_data[i])); 227 - if (ret) 228 - goto err; 229 - 230 - ret = platform_device_add(pdev); 231 - if (ret) 232 - goto err; 233 - 234 - pcf->regulator_pdev[i] = pdev; 235 - } 236 - 237 - ret = sysfs_create_group(&client->dev.kobj, &pcf_attr_group); 238 - if (ret) 239 - dev_warn(pcf->dev, "error creating sysfs entries\n"); 240 - 241 - if (pdata->probe_done) 242 - pdata->probe_done(pcf); 243 - 244 - return 0; 245 - 246 - err: 247 - platform_device_put(pdev); 248 - err2: 249 - for (j = 0; j < i; j++) 250 - platform_device_put(pcf->regulator_pdev[j]); 251 - 252 - return ret; 253 - } 254 - 255 - static void pcf50633_remove(struct i2c_client *client) 256 - { 257 - struct pcf50633 *pcf = i2c_get_clientdata(client); 258 - int i; 259 - 260 - sysfs_remove_group(&client->dev.kobj, &pcf_attr_group); 261 - pcf50633_irq_free(pcf); 262 - 263 - platform_device_unregister(pcf->input_pdev); 264 - platform_device_unregister(pcf->rtc_pdev); 265 - platform_device_unregister(pcf->mbc_pdev); 266 - platform_device_unregister(pcf->adc_pdev); 267 - platform_device_unregister(pcf->bl_pdev); 268 - 269 - for (i = 0; i < PCF50633_NUM_REGULATORS; i++) 270 - platform_device_unregister(pcf->regulator_pdev[i]); 271 - } 272 - 273 - static const struct i2c_device_id pcf50633_id_table[] = { 274 - {"pcf50633", 0x73}, 275 - {/* end of list */} 276 - }; 277 - MODULE_DEVICE_TABLE(i2c, pcf50633_id_table); 278 - 279 - static struct i2c_driver pcf50633_driver = { 280 - .driver = { 281 - .name = "pcf50633", 282 - .pm = pm_sleep_ptr(&pcf50633_pm), 283 - }, 284 - .id_table = pcf50633_id_table, 285 - .probe = pcf50633_probe, 286 - .remove = pcf50633_remove, 287 - }; 288 - 289 - static int __init pcf50633_init(void) 290 - { 291 - return i2c_add_driver(&pcf50633_driver); 292 - } 293 - 294 - static void __exit pcf50633_exit(void) 295 - { 296 - i2c_del_driver(&pcf50633_driver); 297 - } 298 - 299 - MODULE_DESCRIPTION("I2C chip driver for NXP PCF50633 PMU"); 300 - MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>"); 301 - MODULE_LICENSE("GPL"); 302 - 303 - subsys_initcall(pcf50633_init); 304 - module_exit(pcf50633_exit);
-92
drivers/mfd/pcf50633-gpio.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* NXP PCF50633 GPIO Driver 3 - * 4 - * (C) 2006-2008 by Openmoko, Inc. 5 - * Author: Balaji Rao <balajirrao@openmoko.org> 6 - * All rights reserved. 7 - * 8 - * Broken down from monstrous PCF50633 driver mainly by 9 - * Harald Welte, Andy Green and Werner Almesberger 10 - */ 11 - 12 - #include <linux/kernel.h> 13 - #include <linux/module.h> 14 - 15 - #include <linux/mfd/pcf50633/core.h> 16 - #include <linux/mfd/pcf50633/gpio.h> 17 - #include <linux/mfd/pcf50633/pmic.h> 18 - 19 - static const u8 pcf50633_regulator_registers[PCF50633_NUM_REGULATORS] = { 20 - [PCF50633_REGULATOR_AUTO] = PCF50633_REG_AUTOOUT, 21 - [PCF50633_REGULATOR_DOWN1] = PCF50633_REG_DOWN1OUT, 22 - [PCF50633_REGULATOR_DOWN2] = PCF50633_REG_DOWN2OUT, 23 - [PCF50633_REGULATOR_MEMLDO] = PCF50633_REG_MEMLDOOUT, 24 - [PCF50633_REGULATOR_LDO1] = PCF50633_REG_LDO1OUT, 25 - [PCF50633_REGULATOR_LDO2] = PCF50633_REG_LDO2OUT, 26 - [PCF50633_REGULATOR_LDO3] = PCF50633_REG_LDO3OUT, 27 - [PCF50633_REGULATOR_LDO4] = PCF50633_REG_LDO4OUT, 28 - [PCF50633_REGULATOR_LDO5] = PCF50633_REG_LDO5OUT, 29 - [PCF50633_REGULATOR_LDO6] = PCF50633_REG_LDO6OUT, 30 - [PCF50633_REGULATOR_HCLDO] = PCF50633_REG_HCLDOOUT, 31 - }; 32 - 33 - int pcf50633_gpio_set(struct pcf50633 *pcf, int gpio, u8 val) 34 - { 35 - u8 reg; 36 - 37 - reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG; 38 - 39 - return pcf50633_reg_set_bit_mask(pcf, reg, 0x07, val); 40 - } 41 - EXPORT_SYMBOL_GPL(pcf50633_gpio_set); 42 - 43 - u8 pcf50633_gpio_get(struct pcf50633 *pcf, int gpio) 44 - { 45 - u8 reg, val; 46 - 47 - reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG; 48 - val = pcf50633_reg_read(pcf, reg) & 0x07; 49 - 50 - return val; 51 - } 52 - EXPORT_SYMBOL_GPL(pcf50633_gpio_get); 53 - 54 - int pcf50633_gpio_invert_set(struct pcf50633 *pcf, int gpio, int invert) 55 - { 56 - u8 val, reg; 57 - 58 - reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG; 59 - val = !!invert << 3; 60 - 61 - return pcf50633_reg_set_bit_mask(pcf, reg, 1 << 3, val); 62 - } 63 - EXPORT_SYMBOL_GPL(pcf50633_gpio_invert_set); 64 - 65 - int pcf50633_gpio_invert_get(struct pcf50633 *pcf, int gpio) 66 - { 67 - u8 reg, val; 68 - 69 - reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG; 70 - val = pcf50633_reg_read(pcf, reg); 71 - 72 - return val & (1 << 3); 73 - } 74 - EXPORT_SYMBOL_GPL(pcf50633_gpio_invert_get); 75 - 76 - int pcf50633_gpio_power_supply_set(struct pcf50633 *pcf, 77 - int gpio, int regulator, int on) 78 - { 79 - u8 reg, val, mask; 80 - 81 - /* the *ENA register is always one after the *OUT register */ 82 - reg = pcf50633_regulator_registers[regulator] + 1; 83 - 84 - val = !!on << (gpio - PCF50633_GPIO1); 85 - mask = 1 << (gpio - PCF50633_GPIO1); 86 - 87 - return pcf50633_reg_set_bit_mask(pcf, reg, mask, val); 88 - } 89 - EXPORT_SYMBOL_GPL(pcf50633_gpio_power_supply_set); 90 - 91 - MODULE_DESCRIPTION("NXP PCF50633 GPIO Driver"); 92 - MODULE_LICENSE("GPL");
-312
drivers/mfd/pcf50633-irq.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* NXP PCF50633 Power Management Unit (PMU) driver 3 - * 4 - * (C) 2006-2008 by Openmoko, Inc. 5 - * Author: Harald Welte <laforge@openmoko.org> 6 - * Balaji Rao <balajirrao@openmoko.org> 7 - * All rights reserved. 8 - */ 9 - 10 - #include <linux/i2c.h> 11 - #include <linux/interrupt.h> 12 - #include <linux/kernel.h> 13 - #include <linux/mutex.h> 14 - #include <linux/export.h> 15 - #include <linux/slab.h> 16 - 17 - #include <linux/mfd/pcf50633/core.h> 18 - #include <linux/mfd/pcf50633/mbc.h> 19 - 20 - int pcf50633_register_irq(struct pcf50633 *pcf, int irq, 21 - void (*handler) (int, void *), void *data) 22 - { 23 - if (irq < 0 || irq >= PCF50633_NUM_IRQ || !handler) 24 - return -EINVAL; 25 - 26 - if (WARN_ON(pcf->irq_handler[irq].handler)) 27 - return -EBUSY; 28 - 29 - mutex_lock(&pcf->lock); 30 - pcf->irq_handler[irq].handler = handler; 31 - pcf->irq_handler[irq].data = data; 32 - mutex_unlock(&pcf->lock); 33 - 34 - return 0; 35 - } 36 - EXPORT_SYMBOL_GPL(pcf50633_register_irq); 37 - 38 - int pcf50633_free_irq(struct pcf50633 *pcf, int irq) 39 - { 40 - if (irq < 0 || irq >= PCF50633_NUM_IRQ) 41 - return -EINVAL; 42 - 43 - mutex_lock(&pcf->lock); 44 - pcf->irq_handler[irq].handler = NULL; 45 - mutex_unlock(&pcf->lock); 46 - 47 - return 0; 48 - } 49 - EXPORT_SYMBOL_GPL(pcf50633_free_irq); 50 - 51 - static int __pcf50633_irq_mask_set(struct pcf50633 *pcf, int irq, u8 mask) 52 - { 53 - u8 reg, bit; 54 - int idx; 55 - 56 - idx = irq >> 3; 57 - reg = PCF50633_REG_INT1M + idx; 58 - bit = 1 << (irq & 0x07); 59 - 60 - pcf50633_reg_set_bit_mask(pcf, reg, bit, mask ? bit : 0); 61 - 62 - mutex_lock(&pcf->lock); 63 - 64 - if (mask) 65 - pcf->mask_regs[idx] |= bit; 66 - else 67 - pcf->mask_regs[idx] &= ~bit; 68 - 69 - mutex_unlock(&pcf->lock); 70 - 71 - return 0; 72 - } 73 - 74 - int pcf50633_irq_mask(struct pcf50633 *pcf, int irq) 75 - { 76 - dev_dbg(pcf->dev, "Masking IRQ %d\n", irq); 77 - 78 - return __pcf50633_irq_mask_set(pcf, irq, 1); 79 - } 80 - EXPORT_SYMBOL_GPL(pcf50633_irq_mask); 81 - 82 - int pcf50633_irq_unmask(struct pcf50633 *pcf, int irq) 83 - { 84 - dev_dbg(pcf->dev, "Unmasking IRQ %d\n", irq); 85 - 86 - return __pcf50633_irq_mask_set(pcf, irq, 0); 87 - } 88 - EXPORT_SYMBOL_GPL(pcf50633_irq_unmask); 89 - 90 - int pcf50633_irq_mask_get(struct pcf50633 *pcf, int irq) 91 - { 92 - u8 reg, bits; 93 - 94 - reg = irq >> 3; 95 - bits = 1 << (irq & 0x07); 96 - 97 - return pcf->mask_regs[reg] & bits; 98 - } 99 - EXPORT_SYMBOL_GPL(pcf50633_irq_mask_get); 100 - 101 - static void pcf50633_irq_call_handler(struct pcf50633 *pcf, int irq) 102 - { 103 - if (pcf->irq_handler[irq].handler) 104 - pcf->irq_handler[irq].handler(irq, pcf->irq_handler[irq].data); 105 - } 106 - 107 - /* Maximum amount of time ONKEY is held before emergency action is taken */ 108 - #define PCF50633_ONKEY1S_TIMEOUT 8 109 - 110 - static irqreturn_t pcf50633_irq(int irq, void *data) 111 - { 112 - struct pcf50633 *pcf = data; 113 - int ret, i, j; 114 - u8 pcf_int[5], chgstat; 115 - 116 - /* Read the 5 INT regs in one transaction */ 117 - ret = pcf50633_read_block(pcf, PCF50633_REG_INT1, 118 - ARRAY_SIZE(pcf_int), pcf_int); 119 - if (ret != ARRAY_SIZE(pcf_int)) { 120 - dev_err(pcf->dev, "Error reading INT registers\n"); 121 - 122 - /* 123 - * If this doesn't ACK the interrupt to the chip, we'll be 124 - * called once again as we're level triggered. 125 - */ 126 - goto out; 127 - } 128 - 129 - /* defeat 8s death from lowsys on A5 */ 130 - pcf50633_reg_write(pcf, PCF50633_REG_OOCSHDWN, 0x04); 131 - 132 - /* We immediately read the usb and adapter status. We thus make sure 133 - * only of USBINS/USBREM IRQ handlers are called */ 134 - if (pcf_int[0] & (PCF50633_INT1_USBINS | PCF50633_INT1_USBREM)) { 135 - chgstat = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2); 136 - if (chgstat & (0x3 << 4)) 137 - pcf_int[0] &= ~PCF50633_INT1_USBREM; 138 - else 139 - pcf_int[0] &= ~PCF50633_INT1_USBINS; 140 - } 141 - 142 - /* Make sure only one of ADPINS or ADPREM is set */ 143 - if (pcf_int[0] & (PCF50633_INT1_ADPINS | PCF50633_INT1_ADPREM)) { 144 - chgstat = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2); 145 - if (chgstat & (0x3 << 4)) 146 - pcf_int[0] &= ~PCF50633_INT1_ADPREM; 147 - else 148 - pcf_int[0] &= ~PCF50633_INT1_ADPINS; 149 - } 150 - 151 - dev_dbg(pcf->dev, "INT1=0x%02x INT2=0x%02x INT3=0x%02x " 152 - "INT4=0x%02x INT5=0x%02x\n", pcf_int[0], 153 - pcf_int[1], pcf_int[2], pcf_int[3], pcf_int[4]); 154 - 155 - /* Some revisions of the chip don't have a 8s standby mode on 156 - * ONKEY1S press. We try to manually do it in such cases. */ 157 - if ((pcf_int[0] & PCF50633_INT1_SECOND) && pcf->onkey1s_held) { 158 - dev_info(pcf->dev, "ONKEY1S held for %d secs\n", 159 - pcf->onkey1s_held); 160 - if (pcf->onkey1s_held++ == PCF50633_ONKEY1S_TIMEOUT) 161 - if (pcf->pdata->force_shutdown) 162 - pcf->pdata->force_shutdown(pcf); 163 - } 164 - 165 - if (pcf_int[2] & PCF50633_INT3_ONKEY1S) { 166 - dev_info(pcf->dev, "ONKEY1S held\n"); 167 - pcf->onkey1s_held = 1 ; 168 - 169 - /* Unmask IRQ_SECOND */ 170 - pcf50633_reg_clear_bits(pcf, PCF50633_REG_INT1M, 171 - PCF50633_INT1_SECOND); 172 - 173 - /* Unmask IRQ_ONKEYR */ 174 - pcf50633_reg_clear_bits(pcf, PCF50633_REG_INT2M, 175 - PCF50633_INT2_ONKEYR); 176 - } 177 - 178 - if ((pcf_int[1] & PCF50633_INT2_ONKEYR) && pcf->onkey1s_held) { 179 - pcf->onkey1s_held = 0; 180 - 181 - /* Mask SECOND and ONKEYR interrupts */ 182 - if (pcf->mask_regs[0] & PCF50633_INT1_SECOND) 183 - pcf50633_reg_set_bit_mask(pcf, 184 - PCF50633_REG_INT1M, 185 - PCF50633_INT1_SECOND, 186 - PCF50633_INT1_SECOND); 187 - 188 - if (pcf->mask_regs[1] & PCF50633_INT2_ONKEYR) 189 - pcf50633_reg_set_bit_mask(pcf, 190 - PCF50633_REG_INT2M, 191 - PCF50633_INT2_ONKEYR, 192 - PCF50633_INT2_ONKEYR); 193 - } 194 - 195 - /* Have we just resumed ? */ 196 - if (pcf->is_suspended) { 197 - pcf->is_suspended = 0; 198 - 199 - /* Set the resume reason filtering out non resumers */ 200 - for (i = 0; i < ARRAY_SIZE(pcf_int); i++) 201 - pcf->resume_reason[i] = pcf_int[i] & 202 - pcf->pdata->resumers[i]; 203 - 204 - /* Make sure we don't pass on any ONKEY events to 205 - * userspace now */ 206 - pcf_int[1] &= ~(PCF50633_INT2_ONKEYR | PCF50633_INT2_ONKEYF); 207 - } 208 - 209 - for (i = 0; i < ARRAY_SIZE(pcf_int); i++) { 210 - /* Unset masked interrupts */ 211 - pcf_int[i] &= ~pcf->mask_regs[i]; 212 - 213 - for (j = 0; j < 8 ; j++) 214 - if (pcf_int[i] & (1 << j)) 215 - pcf50633_irq_call_handler(pcf, (i * 8) + j); 216 - } 217 - 218 - out: 219 - return IRQ_HANDLED; 220 - } 221 - 222 - static int pcf50633_suspend(struct device *dev) 223 - { 224 - struct i2c_client *client = to_i2c_client(dev); 225 - struct pcf50633 *pcf = i2c_get_clientdata(client); 226 - int ret; 227 - int i; 228 - u8 res[5]; 229 - 230 - 231 - /* Make sure our interrupt handlers are not called 232 - * henceforth */ 233 - disable_irq(pcf->irq); 234 - 235 - /* Save the masks */ 236 - ret = pcf50633_read_block(pcf, PCF50633_REG_INT1M, 237 - ARRAY_SIZE(pcf->suspend_irq_masks), 238 - pcf->suspend_irq_masks); 239 - if (ret < 0) { 240 - dev_err(pcf->dev, "error saving irq masks\n"); 241 - goto out; 242 - } 243 - 244 - /* Write wakeup irq masks */ 245 - for (i = 0; i < ARRAY_SIZE(res); i++) 246 - res[i] = ~pcf->pdata->resumers[i]; 247 - 248 - ret = pcf50633_write_block(pcf, PCF50633_REG_INT1M, 249 - ARRAY_SIZE(res), &res[0]); 250 - if (ret < 0) { 251 - dev_err(pcf->dev, "error writing wakeup irq masks\n"); 252 - goto out; 253 - } 254 - 255 - pcf->is_suspended = 1; 256 - 257 - out: 258 - return ret; 259 - } 260 - 261 - static int pcf50633_resume(struct device *dev) 262 - { 263 - struct i2c_client *client = to_i2c_client(dev); 264 - struct pcf50633 *pcf = i2c_get_clientdata(client); 265 - int ret; 266 - 267 - /* Write the saved mask registers */ 268 - ret = pcf50633_write_block(pcf, PCF50633_REG_INT1M, 269 - ARRAY_SIZE(pcf->suspend_irq_masks), 270 - pcf->suspend_irq_masks); 271 - if (ret < 0) 272 - dev_err(pcf->dev, "Error restoring saved suspend masks\n"); 273 - 274 - enable_irq(pcf->irq); 275 - 276 - return ret; 277 - } 278 - 279 - EXPORT_GPL_SIMPLE_DEV_PM_OPS(pcf50633_pm, pcf50633_suspend, pcf50633_resume); 280 - 281 - int pcf50633_irq_init(struct pcf50633 *pcf, int irq) 282 - { 283 - int ret; 284 - 285 - pcf->irq = irq; 286 - 287 - /* Enable all interrupts except RTC SECOND */ 288 - pcf->mask_regs[0] = 0x80; 289 - pcf50633_reg_write(pcf, PCF50633_REG_INT1M, pcf->mask_regs[0]); 290 - pcf50633_reg_write(pcf, PCF50633_REG_INT2M, 0x00); 291 - pcf50633_reg_write(pcf, PCF50633_REG_INT3M, 0x00); 292 - pcf50633_reg_write(pcf, PCF50633_REG_INT4M, 0x00); 293 - pcf50633_reg_write(pcf, PCF50633_REG_INT5M, 0x00); 294 - 295 - ret = request_threaded_irq(irq, NULL, pcf50633_irq, 296 - IRQF_TRIGGER_LOW | IRQF_ONESHOT, 297 - "pcf50633", pcf); 298 - 299 - if (ret) 300 - dev_err(pcf->dev, "Failed to request IRQ %d\n", ret); 301 - 302 - if (enable_irq_wake(irq) < 0) 303 - dev_err(pcf->dev, "IRQ %u cannot be enabled as wake-up source" 304 - "in this hardware revision", irq); 305 - 306 - return ret; 307 - } 308 - 309 - void pcf50633_irq_free(struct pcf50633 *pcf) 310 - { 311 - free_irq(pcf->irq, pcf); 312 - }
+3 -3
drivers/mfd/qnap-mcu.c
··· 158 158 159 159 mutex_lock(&mcu->bus_lock); 160 160 161 - reply->data = rx, 162 - reply->length = length, 163 - reply->received = 0, 161 + reply->data = rx; 162 + reply->length = length; 163 + reply->received = 0; 164 164 reinit_completion(&reply->done); 165 165 166 166 qnap_mcu_write(mcu, cmd_data, cmd_data_size);
+12
drivers/mfd/sec-core.c
··· 83 83 { .name = "s2mpu02-regulator", }, 84 84 }; 85 85 86 + static const struct mfd_cell s2mpu05_devs[] = { 87 + { .name = "s2mpu05-regulator", }, 88 + { .name = "s2mps15-rtc", }, 89 + }; 90 + 86 91 static const struct of_device_id sec_dt_match[] = { 87 92 { 88 93 .compatible = "samsung,s5m8767-pmic", ··· 113 108 }, { 114 109 .compatible = "samsung,s2mpu02-pmic", 115 110 .data = (void *)S2MPU02, 111 + }, { 112 + .compatible = "samsung,s2mpu05-pmic", 113 + .data = (void *)S2MPU05, 116 114 }, { 117 115 /* Sentinel */ 118 116 }, ··· 381 373 case S2MPU02: 382 374 sec_devs = s2mpu02_devs; 383 375 num_sec_devs = ARRAY_SIZE(s2mpu02_devs); 376 + break; 377 + case S2MPU05: 378 + sec_devs = s2mpu05_devs; 379 + num_sec_devs = ARRAY_SIZE(s2mpu05_devs); 384 380 break; 385 381 default: 386 382 dev_err(&i2c->dev, "Unsupported device type (%lu)\n",
+34
drivers/mfd/sec-irq.c
··· 14 14 #include <linux/mfd/samsung/s2mps11.h> 15 15 #include <linux/mfd/samsung/s2mps14.h> 16 16 #include <linux/mfd/samsung/s2mpu02.h> 17 + #include <linux/mfd/samsung/s2mpu05.h> 17 18 #include <linux/mfd/samsung/s5m8767.h> 18 19 19 20 static const struct regmap_irq s2mps11_irqs[] = { ··· 226 225 }, 227 226 }; 228 227 228 + static const struct regmap_irq s2mpu05_irqs[] = { 229 + REGMAP_IRQ_REG(S2MPU05_IRQ_PWRONF, 0, S2MPU05_IRQ_PWRONF_MASK), 230 + REGMAP_IRQ_REG(S2MPU05_IRQ_PWRONR, 0, S2MPU05_IRQ_PWRONR_MASK), 231 + REGMAP_IRQ_REG(S2MPU05_IRQ_JIGONBF, 0, S2MPU05_IRQ_JIGONBF_MASK), 232 + REGMAP_IRQ_REG(S2MPU05_IRQ_JIGONBR, 0, S2MPU05_IRQ_JIGONBR_MASK), 233 + REGMAP_IRQ_REG(S2MPU05_IRQ_ACOKF, 0, S2MPU05_IRQ_ACOKF_MASK), 234 + REGMAP_IRQ_REG(S2MPU05_IRQ_ACOKR, 0, S2MPU05_IRQ_ACOKR_MASK), 235 + REGMAP_IRQ_REG(S2MPU05_IRQ_PWRON1S, 0, S2MPU05_IRQ_PWRON1S_MASK), 236 + REGMAP_IRQ_REG(S2MPU05_IRQ_MRB, 0, S2MPU05_IRQ_MRB_MASK), 237 + REGMAP_IRQ_REG(S2MPU05_IRQ_RTC60S, 1, S2MPU05_IRQ_RTC60S_MASK), 238 + REGMAP_IRQ_REG(S2MPU05_IRQ_RTCA1, 1, S2MPU05_IRQ_RTCA1_MASK), 239 + REGMAP_IRQ_REG(S2MPU05_IRQ_RTCA0, 1, S2MPU05_IRQ_RTCA0_MASK), 240 + REGMAP_IRQ_REG(S2MPU05_IRQ_SMPL, 1, S2MPU05_IRQ_SMPL_MASK), 241 + REGMAP_IRQ_REG(S2MPU05_IRQ_RTC1S, 1, S2MPU05_IRQ_RTC1S_MASK), 242 + REGMAP_IRQ_REG(S2MPU05_IRQ_WTSR, 1, S2MPU05_IRQ_WTSR_MASK), 243 + REGMAP_IRQ_REG(S2MPU05_IRQ_INT120C, 2, S2MPU05_IRQ_INT120C_MASK), 244 + REGMAP_IRQ_REG(S2MPU05_IRQ_INT140C, 2, S2MPU05_IRQ_INT140C_MASK), 245 + REGMAP_IRQ_REG(S2MPU05_IRQ_TSD, 2, S2MPU05_IRQ_TSD_MASK), 246 + }; 247 + 229 248 static const struct regmap_irq s5m8767_irqs[] = { 230 249 [S5M8767_IRQ_PWRR] = { 231 250 .reg_offset = 0, ··· 360 339 .ack_base = S2MPU02_REG_INT1, 361 340 }; 362 341 342 + static const struct regmap_irq_chip s2mpu05_irq_chip = { 343 + .name = "s2mpu05", 344 + .irqs = s2mpu05_irqs, 345 + .num_irqs = ARRAY_SIZE(s2mpu05_irqs), 346 + .num_regs = 3, 347 + .status_base = S2MPU05_REG_INT1, 348 + .mask_base = S2MPU05_REG_INT1M, 349 + .ack_base = S2MPU05_REG_INT1, 350 + }; 351 + 363 352 static const struct regmap_irq_chip s5m8767_irq_chip = { 364 353 .name = "s5m8767", 365 354 .irqs = s5m8767_irqs, ··· 413 382 break; 414 383 case S2MPU02: 415 384 sec_irq_chip = &s2mpu02_irq_chip; 385 + break; 386 + case S2MPU05: 387 + sec_irq_chip = &s2mpu05_irq_chip; 416 388 break; 417 389 default: 418 390 dev_err(sec_pmic->dev, "Unknown device type %lu\n",
+11
drivers/mfd/simple-mfd-i2c.c
··· 83 83 .mfd_cell_size = ARRAY_SIZE(max5970_cells), 84 84 }; 85 85 86 + static const struct mfd_cell max77705_sensor_cells[] = { 87 + { .name = "max77705-battery" }, 88 + { .name = "max77705-hwmon", }, 89 + }; 90 + 91 + static const struct simple_mfd_data maxim_mon_max77705 = { 92 + .mfd_cell = max77705_sensor_cells, 93 + .mfd_cell_size = ARRAY_SIZE(max77705_sensor_cells), 94 + }; 95 + 86 96 static const struct of_device_id simple_mfd_i2c_of_match[] = { 87 97 { .compatible = "kontron,sl28cpld" }, 88 98 { .compatible = "silergy,sy7636a", .data = &silergy_sy7636a}, 89 99 { .compatible = "maxim,max5970", .data = &maxim_max5970}, 90 100 { .compatible = "maxim,max5978", .data = &maxim_max5970}, 101 + { .compatible = "maxim,max77705-battery", .data = &maxim_mon_max77705}, 91 102 {} 92 103 }; 93 104 MODULE_DEVICE_TABLE(of, simple_mfd_i2c_of_match);
+3 -3
drivers/mfd/sm501.c
··· 920 920 { 921 921 struct sm501_gpio_chip *smchip = gpiochip_get_data(chip); 922 922 struct sm501_gpio *smgpio = smchip->ourgpio; 923 - unsigned long bit = 1 << offset; 923 + unsigned long bit = BIT(offset); 924 924 void __iomem *regs = smchip->regbase; 925 925 unsigned long save; 926 926 unsigned long val; ··· 946 946 struct sm501_gpio_chip *smchip = gpiochip_get_data(chip); 947 947 struct sm501_gpio *smgpio = smchip->ourgpio; 948 948 void __iomem *regs = smchip->regbase; 949 - unsigned long bit = 1 << offset; 949 + unsigned long bit = BIT(offset); 950 950 unsigned long save; 951 951 unsigned long ddr; 952 952 ··· 971 971 { 972 972 struct sm501_gpio_chip *smchip = gpiochip_get_data(chip); 973 973 struct sm501_gpio *smgpio = smchip->ourgpio; 974 - unsigned long bit = 1 << offset; 974 + unsigned long bit = BIT(offset); 975 975 void __iomem *regs = smchip->regbase; 976 976 unsigned long save; 977 977 unsigned long val;
-645
drivers/mfd/sta2x11-mfd.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-only 2 - /* 3 - * STA2x11 mfd for GPIO, SCTL and APBREG 4 - * 5 - * Copyright (c) 2009-2011 Wind River Systems, Inc. 6 - * Copyright (c) 2011 ST Microelectronics (Alessandro Rubini, Davide Ciminaghi) 7 - */ 8 - 9 - #include <linux/kernel.h> 10 - #include <linux/init.h> 11 - #include <linux/export.h> 12 - #include <linux/spinlock.h> 13 - #include <linux/errno.h> 14 - #include <linux/device.h> 15 - #include <linux/slab.h> 16 - #include <linux/list.h> 17 - #include <linux/io.h> 18 - #include <linux/ioport.h> 19 - #include <linux/pci.h> 20 - #include <linux/seq_file.h> 21 - #include <linux/platform_device.h> 22 - #include <linux/mfd/core.h> 23 - #include <linux/mfd/sta2x11-mfd.h> 24 - #include <linux/regmap.h> 25 - 26 - #include <asm/sta2x11.h> 27 - 28 - static inline int __reg_within_range(unsigned int r, 29 - unsigned int start, 30 - unsigned int end) 31 - { 32 - return ((r >= start) && (r <= end)); 33 - } 34 - 35 - /* This describes STA2X11 MFD chip for us, we may have several */ 36 - struct sta2x11_mfd { 37 - struct sta2x11_instance *instance; 38 - struct regmap *regmap[sta2x11_n_mfd_plat_devs]; 39 - spinlock_t lock[sta2x11_n_mfd_plat_devs]; 40 - struct list_head list; 41 - void __iomem *regs[sta2x11_n_mfd_plat_devs]; 42 - }; 43 - 44 - static LIST_HEAD(sta2x11_mfd_list); 45 - 46 - /* Three functions to act on the list */ 47 - static struct sta2x11_mfd *sta2x11_mfd_find(struct pci_dev *pdev) 48 - { 49 - struct sta2x11_instance *instance; 50 - struct sta2x11_mfd *mfd; 51 - 52 - if (!pdev && !list_empty(&sta2x11_mfd_list)) { 53 - pr_warn("%s: Unspecified device, using first instance\n", 54 - __func__); 55 - return list_entry(sta2x11_mfd_list.next, 56 - struct sta2x11_mfd, list); 57 - } 58 - 59 - instance = sta2x11_get_instance(pdev); 60 - if (!instance) 61 - return NULL; 62 - list_for_each_entry(mfd, &sta2x11_mfd_list, list) { 63 - if (mfd->instance == instance) 64 - return mfd; 65 - } 66 - return NULL; 67 - } 68 - 69 - static int sta2x11_mfd_add(struct pci_dev *pdev, gfp_t flags) 70 - { 71 - int i; 72 - struct sta2x11_mfd *mfd = sta2x11_mfd_find(pdev); 73 - struct sta2x11_instance *instance; 74 - 75 - if (mfd) 76 - return -EBUSY; 77 - instance = sta2x11_get_instance(pdev); 78 - if (!instance) 79 - return -EINVAL; 80 - mfd = kzalloc(sizeof(*mfd), flags); 81 - if (!mfd) 82 - return -ENOMEM; 83 - INIT_LIST_HEAD(&mfd->list); 84 - for (i = 0; i < ARRAY_SIZE(mfd->lock); i++) 85 - spin_lock_init(&mfd->lock[i]); 86 - mfd->instance = instance; 87 - list_add(&mfd->list, &sta2x11_mfd_list); 88 - return 0; 89 - } 90 - 91 - /* This function is exported and is not expected to fail */ 92 - u32 __sta2x11_mfd_mask(struct pci_dev *pdev, u32 reg, u32 mask, u32 val, 93 - enum sta2x11_mfd_plat_dev index) 94 - { 95 - struct sta2x11_mfd *mfd = sta2x11_mfd_find(pdev); 96 - u32 r; 97 - unsigned long flags; 98 - void __iomem *regs; 99 - 100 - if (!mfd) { 101 - dev_warn(&pdev->dev, ": can't access sctl regs\n"); 102 - return 0; 103 - } 104 - 105 - regs = mfd->regs[index]; 106 - if (!regs) { 107 - dev_warn(&pdev->dev, ": system ctl not initialized\n"); 108 - return 0; 109 - } 110 - spin_lock_irqsave(&mfd->lock[index], flags); 111 - r = readl(regs + reg); 112 - r &= ~mask; 113 - r |= val; 114 - if (mask) 115 - writel(r, regs + reg); 116 - spin_unlock_irqrestore(&mfd->lock[index], flags); 117 - return r; 118 - } 119 - EXPORT_SYMBOL(__sta2x11_mfd_mask); 120 - 121 - int sta2x11_mfd_get_regs_data(struct platform_device *dev, 122 - enum sta2x11_mfd_plat_dev index, 123 - void __iomem **regs, 124 - spinlock_t **lock) 125 - { 126 - struct pci_dev *pdev = *(struct pci_dev **)dev_get_platdata(&dev->dev); 127 - struct sta2x11_mfd *mfd; 128 - 129 - if (!pdev) 130 - return -ENODEV; 131 - mfd = sta2x11_mfd_find(pdev); 132 - if (!mfd) 133 - return -ENODEV; 134 - if (index >= sta2x11_n_mfd_plat_devs) 135 - return -ENODEV; 136 - *regs = mfd->regs[index]; 137 - *lock = &mfd->lock[index]; 138 - pr_debug("%s %d *regs = %p\n", __func__, __LINE__, *regs); 139 - return *regs ? 0 : -ENODEV; 140 - } 141 - EXPORT_SYMBOL(sta2x11_mfd_get_regs_data); 142 - 143 - /* 144 - * Special sta2x11-mfd regmap lock/unlock functions 145 - */ 146 - 147 - static void sta2x11_regmap_lock(void *__lock) 148 - { 149 - spinlock_t *lock = __lock; 150 - spin_lock(lock); 151 - } 152 - 153 - static void sta2x11_regmap_unlock(void *__lock) 154 - { 155 - spinlock_t *lock = __lock; 156 - spin_unlock(lock); 157 - } 158 - 159 - /* OTP (one time programmable registers do not require locking */ 160 - static void sta2x11_regmap_nolock(void *__lock) 161 - { 162 - } 163 - 164 - static const char *sta2x11_mfd_names[sta2x11_n_mfd_plat_devs] = { 165 - [sta2x11_sctl] = STA2X11_MFD_SCTL_NAME, 166 - [sta2x11_apbreg] = STA2X11_MFD_APBREG_NAME, 167 - [sta2x11_apb_soc_regs] = STA2X11_MFD_APB_SOC_REGS_NAME, 168 - [sta2x11_scr] = STA2X11_MFD_SCR_NAME, 169 - }; 170 - 171 - static bool sta2x11_sctl_writeable_reg(struct device *dev, unsigned int reg) 172 - { 173 - return !__reg_within_range(reg, SCTL_SCPCIECSBRST, SCTL_SCRSTSTA); 174 - } 175 - 176 - static struct regmap_config sta2x11_sctl_regmap_config = { 177 - .reg_bits = 32, 178 - .reg_stride = 4, 179 - .val_bits = 32, 180 - .lock = sta2x11_regmap_lock, 181 - .unlock = sta2x11_regmap_unlock, 182 - .max_register = SCTL_SCRSTSTA, 183 - .writeable_reg = sta2x11_sctl_writeable_reg, 184 - }; 185 - 186 - static bool sta2x11_scr_readable_reg(struct device *dev, unsigned int reg) 187 - { 188 - return (reg == STA2X11_SECR_CR) || 189 - __reg_within_range(reg, STA2X11_SECR_FVR0, STA2X11_SECR_FVR1); 190 - } 191 - 192 - static bool sta2x11_scr_writeable_reg(struct device *dev, unsigned int reg) 193 - { 194 - return false; 195 - } 196 - 197 - static struct regmap_config sta2x11_scr_regmap_config = { 198 - .reg_bits = 32, 199 - .reg_stride = 4, 200 - .val_bits = 32, 201 - .lock = sta2x11_regmap_nolock, 202 - .unlock = sta2x11_regmap_nolock, 203 - .max_register = STA2X11_SECR_FVR1, 204 - .readable_reg = sta2x11_scr_readable_reg, 205 - .writeable_reg = sta2x11_scr_writeable_reg, 206 - }; 207 - 208 - static bool sta2x11_apbreg_readable_reg(struct device *dev, unsigned int reg) 209 - { 210 - /* Two blocks (CAN and MLB, SARAC) 0x100 bytes apart */ 211 - if (reg >= APBREG_BSR_SARAC) 212 - reg -= APBREG_BSR_SARAC; 213 - switch (reg) { 214 - case APBREG_BSR: 215 - case APBREG_PAER: 216 - case APBREG_PWAC: 217 - case APBREG_PRAC: 218 - case APBREG_PCG: 219 - case APBREG_PUR: 220 - case APBREG_EMU_PCG: 221 - return true; 222 - default: 223 - return false; 224 - } 225 - } 226 - 227 - static bool sta2x11_apbreg_writeable_reg(struct device *dev, unsigned int reg) 228 - { 229 - if (reg >= APBREG_BSR_SARAC) 230 - reg -= APBREG_BSR_SARAC; 231 - if (!sta2x11_apbreg_readable_reg(dev, reg)) 232 - return false; 233 - return reg != APBREG_PAER; 234 - } 235 - 236 - static struct regmap_config sta2x11_apbreg_regmap_config = { 237 - .reg_bits = 32, 238 - .reg_stride = 4, 239 - .val_bits = 32, 240 - .lock = sta2x11_regmap_lock, 241 - .unlock = sta2x11_regmap_unlock, 242 - .max_register = APBREG_EMU_PCG_SARAC, 243 - .readable_reg = sta2x11_apbreg_readable_reg, 244 - .writeable_reg = sta2x11_apbreg_writeable_reg, 245 - }; 246 - 247 - static bool sta2x11_apb_soc_regs_readable_reg(struct device *dev, 248 - unsigned int reg) 249 - { 250 - return reg <= PCIE_SoC_INT_ROUTER_STATUS3_REG || 251 - __reg_within_range(reg, DMA_IP_CTRL_REG, SPARE3_RESERVED) || 252 - __reg_within_range(reg, MASTER_LOCK_REG, 253 - SYSTEM_CONFIG_STATUS_REG) || 254 - reg == MSP_CLK_CTRL_REG || 255 - __reg_within_range(reg, COMPENSATION_REG1, TEST_CTL_REG); 256 - } 257 - 258 - static bool sta2x11_apb_soc_regs_writeable_reg(struct device *dev, 259 - unsigned int reg) 260 - { 261 - if (!sta2x11_apb_soc_regs_readable_reg(dev, reg)) 262 - return false; 263 - switch (reg) { 264 - case PCIE_COMMON_CLOCK_CONFIG_0_4_0: 265 - case SYSTEM_CONFIG_STATUS_REG: 266 - case COMPENSATION_REG1: 267 - case PCIE_SoC_INT_ROUTER_STATUS0_REG...PCIE_SoC_INT_ROUTER_STATUS3_REG: 268 - case PCIE_PM_STATUS_0_PORT_0_4...PCIE_PM_STATUS_7_0_EP4: 269 - return false; 270 - default: 271 - return true; 272 - } 273 - } 274 - 275 - static struct regmap_config sta2x11_apb_soc_regs_regmap_config = { 276 - .reg_bits = 32, 277 - .reg_stride = 4, 278 - .val_bits = 32, 279 - .lock = sta2x11_regmap_lock, 280 - .unlock = sta2x11_regmap_unlock, 281 - .max_register = TEST_CTL_REG, 282 - .readable_reg = sta2x11_apb_soc_regs_readable_reg, 283 - .writeable_reg = sta2x11_apb_soc_regs_writeable_reg, 284 - }; 285 - 286 - static struct regmap_config * 287 - sta2x11_mfd_regmap_configs[sta2x11_n_mfd_plat_devs] = { 288 - [sta2x11_sctl] = &sta2x11_sctl_regmap_config, 289 - [sta2x11_apbreg] = &sta2x11_apbreg_regmap_config, 290 - [sta2x11_apb_soc_regs] = &sta2x11_apb_soc_regs_regmap_config, 291 - [sta2x11_scr] = &sta2x11_scr_regmap_config, 292 - }; 293 - 294 - /* Probe for the four platform devices */ 295 - 296 - static int sta2x11_mfd_platform_probe(struct platform_device *dev, 297 - enum sta2x11_mfd_plat_dev index) 298 - { 299 - struct pci_dev **pdev; 300 - struct sta2x11_mfd *mfd; 301 - struct resource *res; 302 - const char *name = sta2x11_mfd_names[index]; 303 - struct regmap_config *regmap_config = sta2x11_mfd_regmap_configs[index]; 304 - 305 - pdev = dev_get_platdata(&dev->dev); 306 - mfd = sta2x11_mfd_find(*pdev); 307 - if (!mfd) 308 - return -ENODEV; 309 - if (!regmap_config) 310 - return -ENODEV; 311 - 312 - res = platform_get_resource(dev, IORESOURCE_MEM, 0); 313 - if (!res) 314 - return -ENOMEM; 315 - 316 - if (!request_mem_region(res->start, resource_size(res), name)) 317 - return -EBUSY; 318 - 319 - mfd->regs[index] = ioremap(res->start, resource_size(res)); 320 - if (!mfd->regs[index]) { 321 - release_mem_region(res->start, resource_size(res)); 322 - return -ENOMEM; 323 - } 324 - regmap_config->lock_arg = &mfd->lock; 325 - /* 326 - No caching, registers could be reached both via regmap and via 327 - void __iomem * 328 - */ 329 - regmap_config->cache_type = REGCACHE_NONE; 330 - mfd->regmap[index] = devm_regmap_init_mmio(&dev->dev, mfd->regs[index], 331 - regmap_config); 332 - WARN_ON(IS_ERR(mfd->regmap[index])); 333 - 334 - return 0; 335 - } 336 - 337 - static int sta2x11_sctl_probe(struct platform_device *dev) 338 - { 339 - return sta2x11_mfd_platform_probe(dev, sta2x11_sctl); 340 - } 341 - 342 - static int sta2x11_apbreg_probe(struct platform_device *dev) 343 - { 344 - return sta2x11_mfd_platform_probe(dev, sta2x11_apbreg); 345 - } 346 - 347 - static int sta2x11_apb_soc_regs_probe(struct platform_device *dev) 348 - { 349 - return sta2x11_mfd_platform_probe(dev, sta2x11_apb_soc_regs); 350 - } 351 - 352 - static int sta2x11_scr_probe(struct platform_device *dev) 353 - { 354 - return sta2x11_mfd_platform_probe(dev, sta2x11_scr); 355 - } 356 - 357 - /* The three platform drivers */ 358 - static struct platform_driver sta2x11_sctl_platform_driver = { 359 - .driver = { 360 - .name = STA2X11_MFD_SCTL_NAME, 361 - }, 362 - .probe = sta2x11_sctl_probe, 363 - }; 364 - 365 - static struct platform_driver sta2x11_platform_driver = { 366 - .driver = { 367 - .name = STA2X11_MFD_APBREG_NAME, 368 - }, 369 - .probe = sta2x11_apbreg_probe, 370 - }; 371 - 372 - static struct platform_driver sta2x11_apb_soc_regs_platform_driver = { 373 - .driver = { 374 - .name = STA2X11_MFD_APB_SOC_REGS_NAME, 375 - }, 376 - .probe = sta2x11_apb_soc_regs_probe, 377 - }; 378 - 379 - static struct platform_driver sta2x11_scr_platform_driver = { 380 - .driver = { 381 - .name = STA2X11_MFD_SCR_NAME, 382 - }, 383 - .probe = sta2x11_scr_probe, 384 - }; 385 - 386 - static struct platform_driver * const drivers[] = { 387 - &sta2x11_platform_driver, 388 - &sta2x11_sctl_platform_driver, 389 - &sta2x11_apb_soc_regs_platform_driver, 390 - &sta2x11_scr_platform_driver, 391 - }; 392 - 393 - static int __init sta2x11_drivers_init(void) 394 - { 395 - return platform_register_drivers(drivers, ARRAY_SIZE(drivers)); 396 - } 397 - 398 - /* 399 - * What follows are the PCI devices that host the above pdevs. 400 - * Each logic block is 4kB and they are all consecutive: we use this info. 401 - */ 402 - 403 - /* Mfd 0 device */ 404 - 405 - /* Mfd 0, Bar 0 */ 406 - enum mfd0_bar0_cells { 407 - STA2X11_GPIO_0 = 0, 408 - STA2X11_GPIO_1, 409 - STA2X11_GPIO_2, 410 - STA2X11_GPIO_3, 411 - STA2X11_SCTL, 412 - STA2X11_SCR, 413 - STA2X11_TIME, 414 - }; 415 - /* Mfd 0 , Bar 1 */ 416 - enum mfd0_bar1_cells { 417 - STA2X11_APBREG = 0, 418 - }; 419 - #define CELL_4K(_name, _cell) { \ 420 - .name = _name, \ 421 - .start = _cell * 4096, .end = _cell * 4096 + 4095, \ 422 - .flags = IORESOURCE_MEM, \ 423 - } 424 - 425 - static const struct resource gpio_resources[] = { 426 - { 427 - /* 4 consecutive cells, 1 driver */ 428 - .name = STA2X11_MFD_GPIO_NAME, 429 - .start = 0, 430 - .end = (4 * 4096) - 1, 431 - .flags = IORESOURCE_MEM, 432 - } 433 - }; 434 - static const struct resource sctl_resources[] = { 435 - CELL_4K(STA2X11_MFD_SCTL_NAME, STA2X11_SCTL), 436 - }; 437 - static const struct resource scr_resources[] = { 438 - CELL_4K(STA2X11_MFD_SCR_NAME, STA2X11_SCR), 439 - }; 440 - static const struct resource time_resources[] = { 441 - CELL_4K(STA2X11_MFD_TIME_NAME, STA2X11_TIME), 442 - }; 443 - 444 - static const struct resource apbreg_resources[] = { 445 - CELL_4K(STA2X11_MFD_APBREG_NAME, STA2X11_APBREG), 446 - }; 447 - 448 - #define DEV(_name, _r) \ 449 - { .name = _name, .num_resources = ARRAY_SIZE(_r), .resources = _r, } 450 - 451 - static struct mfd_cell sta2x11_mfd0_bar0[] = { 452 - /* offset 0: we add pdata later */ 453 - DEV(STA2X11_MFD_GPIO_NAME, gpio_resources), 454 - DEV(STA2X11_MFD_SCTL_NAME, sctl_resources), 455 - DEV(STA2X11_MFD_SCR_NAME, scr_resources), 456 - DEV(STA2X11_MFD_TIME_NAME, time_resources), 457 - }; 458 - 459 - static struct mfd_cell sta2x11_mfd0_bar1[] = { 460 - DEV(STA2X11_MFD_APBREG_NAME, apbreg_resources), 461 - }; 462 - 463 - /* Mfd 1 devices */ 464 - 465 - /* Mfd 1, Bar 0 */ 466 - enum mfd1_bar0_cells { 467 - STA2X11_VIC = 0, 468 - }; 469 - 470 - /* Mfd 1, Bar 1 */ 471 - enum mfd1_bar1_cells { 472 - STA2X11_APB_SOC_REGS = 0, 473 - }; 474 - 475 - static const struct resource vic_resources[] = { 476 - CELL_4K(STA2X11_MFD_VIC_NAME, STA2X11_VIC), 477 - }; 478 - 479 - static const struct resource apb_soc_regs_resources[] = { 480 - CELL_4K(STA2X11_MFD_APB_SOC_REGS_NAME, STA2X11_APB_SOC_REGS), 481 - }; 482 - 483 - static struct mfd_cell sta2x11_mfd1_bar0[] = { 484 - DEV(STA2X11_MFD_VIC_NAME, vic_resources), 485 - }; 486 - 487 - static struct mfd_cell sta2x11_mfd1_bar1[] = { 488 - DEV(STA2X11_MFD_APB_SOC_REGS_NAME, apb_soc_regs_resources), 489 - }; 490 - 491 - 492 - static int sta2x11_mfd_suspend(struct pci_dev *pdev, pm_message_t state) 493 - { 494 - pci_save_state(pdev); 495 - pci_disable_device(pdev); 496 - pci_set_power_state(pdev, pci_choose_state(pdev, state)); 497 - 498 - return 0; 499 - } 500 - 501 - static int sta2x11_mfd_resume(struct pci_dev *pdev) 502 - { 503 - int err; 504 - 505 - pci_set_power_state(pdev, PCI_D0); 506 - err = pci_enable_device(pdev); 507 - if (err) 508 - return err; 509 - pci_restore_state(pdev); 510 - 511 - return 0; 512 - } 513 - 514 - struct sta2x11_mfd_bar_setup_data { 515 - struct mfd_cell *cells; 516 - int ncells; 517 - }; 518 - 519 - struct sta2x11_mfd_setup_data { 520 - struct sta2x11_mfd_bar_setup_data bars[2]; 521 - }; 522 - 523 - #define STA2X11_MFD0 0 524 - #define STA2X11_MFD1 1 525 - 526 - static struct sta2x11_mfd_setup_data mfd_setup_data[] = { 527 - /* Mfd 0: gpio, sctl, scr, timers / apbregs */ 528 - [STA2X11_MFD0] = { 529 - .bars = { 530 - [0] = { 531 - .cells = sta2x11_mfd0_bar0, 532 - .ncells = ARRAY_SIZE(sta2x11_mfd0_bar0), 533 - }, 534 - [1] = { 535 - .cells = sta2x11_mfd0_bar1, 536 - .ncells = ARRAY_SIZE(sta2x11_mfd0_bar1), 537 - }, 538 - }, 539 - }, 540 - /* Mfd 1: vic / apb-soc-regs */ 541 - [STA2X11_MFD1] = { 542 - .bars = { 543 - [0] = { 544 - .cells = sta2x11_mfd1_bar0, 545 - .ncells = ARRAY_SIZE(sta2x11_mfd1_bar0), 546 - }, 547 - [1] = { 548 - .cells = sta2x11_mfd1_bar1, 549 - .ncells = ARRAY_SIZE(sta2x11_mfd1_bar1), 550 - }, 551 - }, 552 - }, 553 - }; 554 - 555 - static void sta2x11_mfd_setup(struct pci_dev *pdev, 556 - struct sta2x11_mfd_setup_data *sd) 557 - { 558 - int i, j; 559 - for (i = 0; i < ARRAY_SIZE(sd->bars); i++) 560 - for (j = 0; j < sd->bars[i].ncells; j++) { 561 - sd->bars[i].cells[j].pdata_size = sizeof(pdev); 562 - sd->bars[i].cells[j].platform_data = &pdev; 563 - } 564 - } 565 - 566 - static int sta2x11_mfd_probe(struct pci_dev *pdev, 567 - const struct pci_device_id *pci_id) 568 - { 569 - int err, i; 570 - struct sta2x11_mfd_setup_data *setup_data; 571 - 572 - dev_info(&pdev->dev, "%s\n", __func__); 573 - 574 - err = pci_enable_device(pdev); 575 - if (err) { 576 - dev_err(&pdev->dev, "Can't enable device.\n"); 577 - return err; 578 - } 579 - 580 - err = pci_enable_msi(pdev); 581 - if (err) 582 - dev_info(&pdev->dev, "Enable msi failed\n"); 583 - 584 - setup_data = pci_id->device == PCI_DEVICE_ID_STMICRO_GPIO ? 585 - &mfd_setup_data[STA2X11_MFD0] : 586 - &mfd_setup_data[STA2X11_MFD1]; 587 - 588 - /* platform data is the pci device for all of them */ 589 - sta2x11_mfd_setup(pdev, setup_data); 590 - 591 - /* Record this pdev before mfd_add_devices: their probe looks for it */ 592 - if (!sta2x11_mfd_find(pdev)) 593 - sta2x11_mfd_add(pdev, GFP_KERNEL); 594 - 595 - /* Just 2 bars for all mfd's at present */ 596 - for (i = 0; i < 2; i++) { 597 - err = mfd_add_devices(&pdev->dev, -1, 598 - setup_data->bars[i].cells, 599 - setup_data->bars[i].ncells, 600 - &pdev->resource[i], 601 - 0, NULL); 602 - if (err) { 603 - dev_err(&pdev->dev, 604 - "mfd_add_devices[%d] failed: %d\n", i, err); 605 - goto err_disable; 606 - } 607 - } 608 - 609 - return 0; 610 - 611 - err_disable: 612 - mfd_remove_devices(&pdev->dev); 613 - pci_disable_device(pdev); 614 - pci_disable_msi(pdev); 615 - return err; 616 - } 617 - 618 - static const struct pci_device_id sta2x11_mfd_tbl[] = { 619 - {PCI_DEVICE(PCI_VENDOR_ID_STMICRO, PCI_DEVICE_ID_STMICRO_GPIO)}, 620 - {PCI_DEVICE(PCI_VENDOR_ID_STMICRO, PCI_DEVICE_ID_STMICRO_VIC)}, 621 - {0,}, 622 - }; 623 - 624 - static struct pci_driver sta2x11_mfd_driver = { 625 - .name = "sta2x11-mfd", 626 - .id_table = sta2x11_mfd_tbl, 627 - .probe = sta2x11_mfd_probe, 628 - .suspend = sta2x11_mfd_suspend, 629 - .resume = sta2x11_mfd_resume, 630 - }; 631 - 632 - static int __init sta2x11_mfd_init(void) 633 - { 634 - pr_info("%s\n", __func__); 635 - return pci_register_driver(&sta2x11_mfd_driver); 636 - } 637 - 638 - /* 639 - * All of this must be ready before "normal" devices like MMCI appear. 640 - * But MFD (the pci device) can't be too early. The following choice 641 - * prepares platform drivers very early and probe the PCI device later, 642 - * but before other PCI devices. 643 - */ 644 - subsys_initcall(sta2x11_drivers_init); 645 - rootfs_initcall(sta2x11_mfd_init);
+30 -1
drivers/mfd/stm32-timers.c
··· 9 9 #include <linux/module.h> 10 10 #include <linux/of_platform.h> 11 11 #include <linux/platform_device.h> 12 + #include <linux/property.h> 12 13 #include <linux/reset.h> 13 14 14 15 #define STM32_TIMERS_MAX_REGISTERS 0x3fc ··· 174 173 regmap_write(ddata->regmap, TIM_ARR, arr); 175 174 } 176 175 176 + static int stm32_timers_probe_hwcfgr(struct device *dev, struct stm32_timers *ddata) 177 + { 178 + u32 val; 179 + 180 + ddata->ipidr = (uintptr_t)device_get_match_data(dev); 181 + if (!ddata->ipidr) { 182 + /* Fallback to legacy method for probing counter width */ 183 + stm32_timers_get_arr_size(ddata); 184 + return 0; 185 + } 186 + 187 + regmap_read(ddata->regmap, TIM_IPIDR, &val); 188 + if (val != ddata->ipidr) { 189 + dev_err(dev, "Unsupported device detected: %u\n", val); 190 + return -EINVAL; 191 + } 192 + 193 + regmap_read(ddata->regmap, TIM_HWCFGR2, &val); 194 + 195 + /* Counter width in bits, max reload value is BIT(width) - 1 */ 196 + ddata->max_arr = BIT(FIELD_GET(TIM_HWCFGR2_CNT_WIDTH, val)) - 1; 197 + 198 + return 0; 199 + } 200 + 177 201 static int stm32_timers_dma_probe(struct device *dev, 178 202 struct stm32_timers *ddata) 179 203 { ··· 311 285 if (IS_ERR(ddata->clk)) 312 286 return PTR_ERR(ddata->clk); 313 287 314 - stm32_timers_get_arr_size(ddata); 288 + ret = stm32_timers_probe_hwcfgr(dev, ddata); 289 + if (ret) 290 + return ret; 315 291 316 292 ret = stm32_timers_irq_probe(pdev, ddata); 317 293 if (ret) ··· 348 320 349 321 static const struct of_device_id stm32_timers_of_match[] = { 350 322 { .compatible = "st,stm32-timers", }, 323 + { .compatible = "st,stm32mp25-timers", .data = (void *)STM32MP25_TIM_IPIDR }, 351 324 { /* end node */ }, 352 325 }; 353 326 MODULE_DEVICE_TABLE(of, stm32_timers_of_match);
+8 -1
drivers/mfd/syscon.c
··· 47 47 struct regmap_config syscon_config = syscon_regmap_config; 48 48 struct resource res; 49 49 struct reset_control *reset; 50 + resource_size_t res_size; 50 51 51 52 WARN_ON(!mutex_is_locked(&syscon_list_lock)); 52 53 ··· 97 96 } 98 97 } 99 98 99 + res_size = resource_size(&res); 100 + if (res_size < reg_io_width) { 101 + ret = -EFAULT; 102 + goto err_regmap; 103 + } 104 + 100 105 syscon_config.name = kasprintf(GFP_KERNEL, "%pOFn@%pa", np, &res.start); 101 106 if (!syscon_config.name) { 102 107 ret = -ENOMEM; ··· 110 103 } 111 104 syscon_config.reg_stride = reg_io_width; 112 105 syscon_config.val_bits = reg_io_width * 8; 113 - syscon_config.max_register = resource_size(&res) - reg_io_width; 106 + syscon_config.max_register = res_size - reg_io_width; 114 107 if (!syscon_config.max_register) 115 108 syscon_config.max_register_is_0 = true; 116 109
+7 -6
drivers/mfd/tps65010.c
··· 16 16 #include <linux/workqueue.h> 17 17 #include <linux/debugfs.h> 18 18 #include <linux/seq_file.h> 19 + #include <linux/string_choices.h> 19 20 #include <linux/mutex.h> 20 21 #include <linux/platform_device.h> 21 22 ··· 251 250 v2 = i2c_smbus_read_byte_data(tps->client, TPS_LED1_PER); 252 251 seq_printf(s, "led1 %s, on=%02x, per=%02x, %d/%d msec\n", 253 252 (value & 0x80) 254 - ? ((v2 & 0x80) ? "on" : "off") 253 + ? str_on_off(v2 & 0x80) 255 254 : ((v2 & 0x80) ? "blink" : "(nPG)"), 256 255 value, v2, 257 256 (value & 0x7f) * 10, (v2 & 0x7f) * 100); ··· 260 259 v2 = i2c_smbus_read_byte_data(tps->client, TPS_LED2_PER); 261 260 seq_printf(s, "led2 %s, on=%02x, per=%02x, %d/%d msec\n", 262 261 (value & 0x80) 263 - ? ((v2 & 0x80) ? "on" : "off") 262 + ? str_on_off(v2 & 0x80) 264 263 : ((v2 & 0x80) ? "blink" : "off"), 265 264 value, v2, 266 265 (value & 0x7f) * 10, (v2 & 0x7f) * 100); ··· 739 738 TPS_DEFGPIO, defgpio); 740 739 741 740 pr_debug("%s: gpio%dout = %s, defgpio 0x%02x\n", DRIVER_NAME, 742 - gpio, value ? "high" : "low", 741 + gpio, str_high_low(value), 743 742 i2c_smbus_read_byte_data(the_tps->client, TPS_DEFGPIO)); 744 743 745 744 mutex_unlock(&the_tps->lock); ··· 851 850 status = i2c_smbus_write_byte_data(the_tps->client, 852 851 TPS_VDCDC2, vdcdc2); 853 852 854 - pr_debug("%s: vibrator %s\n", DRIVER_NAME, value ? "on" : "off"); 853 + pr_debug("%s: vibrator %s\n", DRIVER_NAME, str_on_off(value)); 855 854 856 855 mutex_unlock(&the_tps->lock); 857 856 return status; ··· 873 872 mutex_lock(&the_tps->lock); 874 873 875 874 pr_debug("%s: %s low_pwr, vdcdc1 0x%02x\n", DRIVER_NAME, 876 - mode ? "enable" : "disable", 875 + str_enable_disable(mode), 877 876 i2c_smbus_read_byte_data(the_tps->client, TPS_VDCDC1)); 878 877 879 878 vdcdc1 = i2c_smbus_read_byte_data(the_tps->client, TPS_VDCDC1); ··· 985 984 986 985 pr_debug("%s: %s low_pwr, chgconfig 0x%02x vdcdc1 0x%02x\n", 987 986 DRIVER_NAME, 988 - mode ? "enable" : "disable", 987 + str_enable_disable(mode), 989 988 i2c_smbus_read_byte_data(the_tps->client, TPS_CHGCONFIG), 990 989 i2c_smbus_read_byte_data(the_tps->client, TPS_VDCDC1)); 991 990
+266 -13
drivers/mfd/tps65219.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 // 3 - // Driver for TPS65219 Integrated Power Management Integrated Chips (PMIC) 3 + // Driver for TPS65214/TPS65215/TPS65219 Power Management Integrated Chips 4 4 // 5 5 // Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/ 6 + // Copyright (C) 2024 Texas Instruments Incorporated - https://www.ti.com/ 6 7 7 8 #include <linux/i2c.h> 8 9 #include <linux/reboot.h> ··· 60 59 DEFINE_RES_IRQ_NAMED(TPS65219_INT_PB_RISING_EDGE_DETECT, "rising"), 61 60 }; 62 61 62 + static const struct resource tps65214_regulator_resources[] = { 63 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_SCG, "LDO1_SCG"), 64 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_OC, "LDO1_OC"), 65 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_UV, "LDO1_UV"), 66 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_SCG, "LDO2_SCG"), 67 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_OC, "LDO2_OC"), 68 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_UV, "LDO2_UV"), 69 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_SCG, "BUCK3_SCG"), 70 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_OC, "BUCK3_OC"), 71 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_NEG_OC, "BUCK3_NEG_OC"), 72 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_UV, "BUCK3_UV"), 73 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_SCG, "BUCK1_SCG"), 74 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_OC, "BUCK1_OC"), 75 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_NEG_OC, "BUCK1_NEG_OC"), 76 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_UV, "BUCK1_UV"), 77 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_SCG, "BUCK2_SCG"), 78 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_OC, "BUCK2_OC"), 79 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_NEG_OC, "BUCK2_NEG_OC"), 80 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_UV, "BUCK2_UV"), 81 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_RV, "BUCK1_RV"), 82 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_RV, "BUCK2_RV"), 83 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_RV, "BUCK3_RV"), 84 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_RV, "LDO1_RV"), 85 + DEFINE_RES_IRQ_NAMED(TPS65214_INT_LDO2_RV, "LDO2_RV"), 86 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_RV_SD, "BUCK1_RV_SD"), 87 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_RV_SD, "BUCK2_RV_SD"), 88 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_RV_SD, "BUCK3_RV_SD"), 89 + DEFINE_RES_IRQ_NAMED(TPS65214_INT_LDO1_RV_SD, "LDO1_RV_SD"), 90 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO2_RV_SD, "LDO2_RV_SD"), 91 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_TIMEOUT, "TIMEOUT"), 92 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_2_WARM, "SENSOR_2_WARM"), 93 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_1_WARM, "SENSOR_1_WARM"), 94 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_0_WARM, "SENSOR_0_WARM"), 95 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_2_HOT, "SENSOR_2_HOT"), 96 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_1_HOT, "SENSOR_1_HOT"), 97 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_0_HOT, "SENSOR_0_HOT"), 98 + }; 99 + 100 + static const struct resource tps65215_regulator_resources[] = { 101 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO1_SCG, "LDO1_SCG"), 102 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO1_OC, "LDO1_OC"), 103 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO1_UV, "LDO1_UV"), 104 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO2_SCG, "LDO2_SCG"), 105 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO2_OC, "LDO2_OC"), 106 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO2_UV, "LDO2_UV"), 107 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_SCG, "BUCK3_SCG"), 108 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_OC, "BUCK3_OC"), 109 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_NEG_OC, "BUCK3_NEG_OC"), 110 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_UV, "BUCK3_UV"), 111 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_SCG, "BUCK1_SCG"), 112 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_OC, "BUCK1_OC"), 113 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_NEG_OC, "BUCK1_NEG_OC"), 114 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_UV, "BUCK1_UV"), 115 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_SCG, "BUCK2_SCG"), 116 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_OC, "BUCK2_OC"), 117 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_NEG_OC, "BUCK2_NEG_OC"), 118 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_UV, "BUCK2_UV"), 119 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_RV, "BUCK1_RV"), 120 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_RV, "BUCK2_RV"), 121 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_RV, "BUCK3_RV"), 122 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_RV, "LDO1_RV"), 123 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO2_RV, "LDO2_RV"), 124 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK1_RV_SD, "BUCK1_RV_SD"), 125 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK2_RV_SD, "BUCK2_RV_SD"), 126 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_BUCK3_RV_SD, "BUCK3_RV_SD"), 127 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO1_RV_SD, "LDO1_RV_SD"), 128 + DEFINE_RES_IRQ_NAMED(TPS65215_INT_LDO2_RV_SD, "LDO2_RV_SD"), 129 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_TIMEOUT, "TIMEOUT"), 130 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_3_WARM, "SENSOR_3_WARM"), 131 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_2_WARM, "SENSOR_2_WARM"), 132 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_1_WARM, "SENSOR_1_WARM"), 133 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_0_WARM, "SENSOR_0_WARM"), 134 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_3_HOT, "SENSOR_3_HOT"), 135 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_2_HOT, "SENSOR_2_HOT"), 136 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_1_HOT, "SENSOR_1_HOT"), 137 + DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_0_HOT, "SENSOR_0_HOT"), 138 + }; 139 + 63 140 static const struct resource tps65219_regulator_resources[] = { 64 141 DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO3_SCG, "LDO3_SCG"), 65 142 DEFINE_RES_IRQ_NAMED(TPS65219_INT_LDO3_OC, "LDO3_OC"), ··· 188 109 DEFINE_RES_IRQ_NAMED(TPS65219_INT_SENSOR_0_HOT, "SENSOR_0_HOT"), 189 110 }; 190 111 112 + static const struct mfd_cell tps65214_cells[] = { 113 + MFD_CELL_RES("tps65214-regulator", tps65214_regulator_resources), 114 + MFD_CELL_NAME("tps65215-gpio"), 115 + }; 116 + 117 + static const struct mfd_cell tps65215_cells[] = { 118 + MFD_CELL_RES("tps65215-regulator", tps65215_regulator_resources), 119 + MFD_CELL_NAME("tps65215-gpio"), 120 + }; 121 + 191 122 static const struct mfd_cell tps65219_cells[] = { 192 123 MFD_CELL_RES("tps65219-regulator", tps65219_regulator_resources), 193 124 MFD_CELL_NAME("tps65219-gpio"), ··· 225 136 static unsigned int bit4_offsets[] = { TPS65219_REG_INT_BUCK_3_POS }; /* Buck 3 */ 226 137 static unsigned int bit5_offsets[] = { TPS65219_REG_INT_LDO_1_2_POS }; /* LDO 1-2 */ 227 138 static unsigned int bit6_offsets[] = { TPS65219_REG_INT_LDO_3_4_POS }; /* LDO 3-4 */ 139 + static unsigned int tps65215_bit5_offsets[] = { TPS65215_REG_INT_LDO_1_POS }; 140 + static unsigned int tps65215_bit6_offsets[] = { TPS65215_REG_INT_LDO_2_POS }; 228 141 static unsigned int bit7_offsets[] = { TPS65219_REG_INT_PB_POS }; /* Power Button */ 142 + 143 + /* TPS65214 INT_SOURCE bit 6 is 'RESERVED'*/ 144 + static unsigned int tps65214_bit0_offsets[] = { TPS65214_REG_INT_TO_RV_POS }; 145 + static unsigned int tps65214_bit1_offsets[] = { TPS65214_REG_INT_RV_POS }; 146 + static unsigned int tps65214_bit2_offsets[] = { TPS65214_REG_INT_SYS_POS }; 147 + static unsigned int tps65214_bit3_offsets[] = { TPS65214_REG_INT_BUCK_1_2_POS }; 148 + static unsigned int tps65214_bit4_offsets[] = { TPS65214_REG_INT_BUCK_3_POS }; 149 + static unsigned int tps65214_bit5_offsets[] = { TPS65214_REG_INT_LDO_1_2_POS }; 150 + static unsigned int tps65214_bit7_offsets[] = { TPS65214_REG_INT_PB_POS }; 229 151 230 152 static struct regmap_irq_sub_irq_map tps65219_sub_irq_offsets[] = { 231 153 REGMAP_IRQ_MAIN_REG_OFFSET(bit0_offsets), ··· 249 149 REGMAP_IRQ_MAIN_REG_OFFSET(bit7_offsets), 250 150 }; 251 151 152 + static struct regmap_irq_sub_irq_map tps65215_sub_irq_offsets[] = { 153 + REGMAP_IRQ_MAIN_REG_OFFSET(bit0_offsets), 154 + REGMAP_IRQ_MAIN_REG_OFFSET(bit1_offsets), 155 + REGMAP_IRQ_MAIN_REG_OFFSET(bit2_offsets), 156 + REGMAP_IRQ_MAIN_REG_OFFSET(bit3_offsets), 157 + REGMAP_IRQ_MAIN_REG_OFFSET(bit4_offsets), 158 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65215_bit5_offsets), 159 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65215_bit6_offsets), 160 + REGMAP_IRQ_MAIN_REG_OFFSET(bit7_offsets), 161 + }; 162 + 163 + static struct regmap_irq_sub_irq_map tps65214_sub_irq_offsets[] = { 164 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65214_bit0_offsets), 165 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65214_bit1_offsets), 166 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65214_bit2_offsets), 167 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65214_bit3_offsets), 168 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65214_bit4_offsets), 169 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65214_bit5_offsets), 170 + REGMAP_IRQ_MAIN_REG_OFFSET(tps65214_bit7_offsets), 171 + }; 172 + 252 173 #define TPS65219_REGMAP_IRQ_REG(int_name, register_position) \ 253 174 REGMAP_IRQ_REG(int_name, register_position, int_name##_MASK) 175 + 176 + static const struct regmap_irq tps65214_irqs[] = { 177 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_SCG, TPS65214_REG_INT_LDO_1_2_POS), 178 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_OC, TPS65214_REG_INT_LDO_1_2_POS), 179 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_UV, TPS65214_REG_INT_LDO_1_2_POS), 180 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_SCG, TPS65214_REG_INT_LDO_1_2_POS), 181 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_OC, TPS65214_REG_INT_LDO_1_2_POS), 182 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_UV, TPS65214_REG_INT_LDO_1_2_POS), 183 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_SCG, TPS65214_REG_INT_BUCK_3_POS), 184 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_OC, TPS65214_REG_INT_BUCK_3_POS), 185 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_NEG_OC, TPS65214_REG_INT_BUCK_3_POS), 186 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_UV, TPS65214_REG_INT_BUCK_3_POS), 187 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_SCG, TPS65214_REG_INT_BUCK_1_2_POS), 188 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_OC, TPS65214_REG_INT_BUCK_1_2_POS), 189 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_NEG_OC, TPS65214_REG_INT_BUCK_1_2_POS), 190 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_UV, TPS65214_REG_INT_BUCK_1_2_POS), 191 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_SCG, TPS65214_REG_INT_BUCK_1_2_POS), 192 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_OC, TPS65214_REG_INT_BUCK_1_2_POS), 193 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_NEG_OC, TPS65214_REG_INT_BUCK_1_2_POS), 194 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_UV, TPS65214_REG_INT_BUCK_1_2_POS), 195 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_2_WARM, TPS65214_REG_INT_SYS_POS), 196 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_1_WARM, TPS65214_REG_INT_SYS_POS), 197 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_0_WARM, TPS65214_REG_INT_SYS_POS), 198 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_2_HOT, TPS65214_REG_INT_SYS_POS), 199 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_1_HOT, TPS65214_REG_INT_SYS_POS), 200 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_0_HOT, TPS65214_REG_INT_SYS_POS), 201 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_RV, TPS65214_REG_INT_RV_POS), 202 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_RV, TPS65214_REG_INT_RV_POS), 203 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_RV, TPS65214_REG_INT_RV_POS), 204 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_RV, TPS65214_REG_INT_RV_POS), 205 + TPS65219_REGMAP_IRQ_REG(TPS65214_INT_LDO2_RV, TPS65214_REG_INT_RV_POS), 206 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_RV_SD, TPS65214_REG_INT_TO_RV_POS), 207 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_RV_SD, TPS65214_REG_INT_TO_RV_POS), 208 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_RV_SD, TPS65214_REG_INT_TO_RV_POS), 209 + TPS65219_REGMAP_IRQ_REG(TPS65214_INT_LDO1_RV_SD, TPS65214_REG_INT_TO_RV_POS), 210 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO2_RV_SD, TPS65214_REG_INT_TO_RV_POS), 211 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_TIMEOUT, TPS65214_REG_INT_TO_RV_POS), 212 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_PB_FALLING_EDGE_DETECT, TPS65214_REG_INT_PB_POS), 213 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_PB_RISING_EDGE_DETECT, TPS65214_REG_INT_PB_POS), 214 + }; 215 + 216 + static const struct regmap_irq tps65215_irqs[] = { 217 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO1_SCG, TPS65215_REG_INT_LDO_1_POS), 218 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO1_OC, TPS65215_REG_INT_LDO_1_POS), 219 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO1_UV, TPS65215_REG_INT_LDO_1_POS), 220 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO2_SCG, TPS65215_REG_INT_LDO_2_POS), 221 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO2_OC, TPS65215_REG_INT_LDO_2_POS), 222 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO2_UV, TPS65215_REG_INT_LDO_2_POS), 223 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_SCG, TPS65219_REG_INT_BUCK_3_POS), 224 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_OC, TPS65219_REG_INT_BUCK_3_POS), 225 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_NEG_OC, TPS65219_REG_INT_BUCK_3_POS), 226 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_UV, TPS65219_REG_INT_BUCK_3_POS), 227 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_SCG, TPS65219_REG_INT_BUCK_1_2_POS), 228 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_OC, TPS65219_REG_INT_BUCK_1_2_POS), 229 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_NEG_OC, TPS65219_REG_INT_BUCK_1_2_POS), 230 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_UV, TPS65219_REG_INT_BUCK_1_2_POS), 231 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_SCG, TPS65219_REG_INT_BUCK_1_2_POS), 232 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_OC, TPS65219_REG_INT_BUCK_1_2_POS), 233 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_NEG_OC, TPS65219_REG_INT_BUCK_1_2_POS), 234 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_UV, TPS65219_REG_INT_BUCK_1_2_POS), 235 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_3_WARM, TPS65219_REG_INT_SYS_POS), 236 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_2_WARM, TPS65219_REG_INT_SYS_POS), 237 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_1_WARM, TPS65219_REG_INT_SYS_POS), 238 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_0_WARM, TPS65219_REG_INT_SYS_POS), 239 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_3_HOT, TPS65219_REG_INT_SYS_POS), 240 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_2_HOT, TPS65219_REG_INT_SYS_POS), 241 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_1_HOT, TPS65219_REG_INT_SYS_POS), 242 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_SENSOR_0_HOT, TPS65219_REG_INT_SYS_POS), 243 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_RV, TPS65219_REG_INT_RV_POS), 244 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_RV, TPS65219_REG_INT_RV_POS), 245 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_RV, TPS65219_REG_INT_RV_POS), 246 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_RV, TPS65219_REG_INT_RV_POS), 247 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO2_RV, TPS65219_REG_INT_RV_POS), 248 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK1_RV_SD, TPS65219_REG_INT_TO_RV_POS), 249 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK2_RV_SD, TPS65219_REG_INT_TO_RV_POS), 250 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_BUCK3_RV_SD, TPS65219_REG_INT_TO_RV_POS), 251 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO1_RV_SD, TPS65219_REG_INT_TO_RV_POS), 252 + TPS65219_REGMAP_IRQ_REG(TPS65215_INT_LDO2_RV_SD, TPS65219_REG_INT_TO_RV_POS), 253 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_TIMEOUT, TPS65219_REG_INT_TO_RV_POS), 254 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_PB_FALLING_EDGE_DETECT, TPS65219_REG_INT_PB_POS), 255 + TPS65219_REGMAP_IRQ_REG(TPS65219_INT_PB_RISING_EDGE_DETECT, TPS65219_REG_INT_PB_POS), 256 + }; 254 257 255 258 static const struct regmap_irq tps65219_irqs[] = { 256 259 TPS65219_REGMAP_IRQ_REG(TPS65219_INT_LDO3_SCG, TPS65219_REG_INT_LDO_3_4_POS), ··· 407 204 TPS65219_REGMAP_IRQ_REG(TPS65219_INT_PB_RISING_EDGE_DETECT, TPS65219_REG_INT_PB_POS), 408 205 }; 409 206 207 + static const struct regmap_irq_chip tps65214_irq_chip = { 208 + .name = "tps65214_irq", 209 + .main_status = TPS65219_REG_INT_SOURCE, 210 + .num_main_regs = 1, 211 + .num_main_status_bits = 8, 212 + .irqs = tps65214_irqs, 213 + .num_irqs = ARRAY_SIZE(tps65214_irqs), 214 + .status_base = TPS65214_REG_INT_LDO_1_2, 215 + .ack_base = TPS65214_REG_INT_LDO_1_2, 216 + .clear_ack = 1, 217 + .num_regs = 8, 218 + .sub_reg_offsets = tps65214_sub_irq_offsets, 219 + }; 220 + 221 + static const struct regmap_irq_chip tps65215_irq_chip = { 222 + .name = "tps65215_irq", 223 + .main_status = TPS65219_REG_INT_SOURCE, 224 + .num_main_regs = 1, 225 + .num_main_status_bits = 8, 226 + .irqs = tps65215_irqs, 227 + .num_irqs = ARRAY_SIZE(tps65215_irqs), 228 + .status_base = TPS65215_REG_INT_LDO_2, 229 + .ack_base = TPS65215_REG_INT_LDO_2, 230 + .clear_ack = 1, 231 + .num_regs = 8, 232 + .sub_reg_offsets = tps65215_sub_irq_offsets, 233 + }; 234 + 410 235 static const struct regmap_irq_chip tps65219_irq_chip = { 411 236 .name = "tps65219_irq", 412 237 .main_status = TPS65219_REG_INT_SOURCE, ··· 449 218 .sub_reg_offsets = tps65219_sub_irq_offsets, 450 219 }; 451 220 221 + struct tps65219_chip_data { 222 + const struct regmap_irq_chip *irq_chip; 223 + const struct mfd_cell *cells; 224 + int n_cells; 225 + }; 226 + 227 + static struct tps65219_chip_data chip_info_table[] = { 228 + [TPS65214] = { 229 + .irq_chip = &tps65214_irq_chip, 230 + .cells = tps65214_cells, 231 + .n_cells = ARRAY_SIZE(tps65214_cells), 232 + }, 233 + [TPS65215] = { 234 + .irq_chip = &tps65215_irq_chip, 235 + .cells = tps65215_cells, 236 + .n_cells = ARRAY_SIZE(tps65215_cells), 237 + }, 238 + [TPS65219] = { 239 + .irq_chip = &tps65219_irq_chip, 240 + .cells = tps65219_cells, 241 + .n_cells = ARRAY_SIZE(tps65219_cells), 242 + }, 243 + }; 244 + 452 245 static int tps65219_probe(struct i2c_client *client) 453 246 { 454 247 struct tps65219 *tps; 455 - unsigned int chipid; 248 + struct tps65219_chip_data *pmic; 456 249 bool pwr_button; 457 250 int ret; 458 251 ··· 487 232 i2c_set_clientdata(client, tps); 488 233 489 234 tps->dev = &client->dev; 235 + tps->chip_id = (uintptr_t)i2c_get_match_data(client); 236 + pmic = &chip_info_table[tps->chip_id]; 490 237 491 238 tps->regmap = devm_regmap_init_i2c(client, &tps65219_regmap_config); 492 239 if (IS_ERR(tps->regmap)) { ··· 497 240 return ret; 498 241 } 499 242 500 - ret = devm_regmap_add_irq_chip(&client->dev, tps->regmap, client->irq, 501 - IRQF_ONESHOT, 0, &tps65219_irq_chip, 243 + ret = devm_regmap_add_irq_chip(tps->dev, tps->regmap, client->irq, 244 + IRQF_ONESHOT, 0, pmic->irq_chip, 502 245 &tps->irq_data); 503 246 if (ret) 504 247 return ret; 505 248 506 - ret = regmap_read(tps->regmap, TPS65219_REG_TI_DEV_ID, &chipid); 507 - if (ret) { 508 - dev_err(tps->dev, "Failed to read device ID: %d\n", ret); 509 - return ret; 510 - } 511 - 512 249 ret = devm_mfd_add_devices(tps->dev, PLATFORM_DEVID_AUTO, 513 - tps65219_cells, ARRAY_SIZE(tps65219_cells), 250 + pmic->cells, pmic->n_cells, 514 251 NULL, 0, regmap_irq_get_domain(tps->irq_data)); 515 252 if (ret) { 516 253 dev_err(tps->dev, "Failed to add child devices: %d\n", ret); ··· 542 291 } 543 292 544 293 static const struct of_device_id of_tps65219_match_table[] = { 545 - { .compatible = "ti,tps65219", }, 294 + { .compatible = "ti,tps65214", .data = (void *)TPS65214, }, 295 + { .compatible = "ti,tps65215", .data = (void *)TPS65215, }, 296 + { .compatible = "ti,tps65219", .data = (void *)TPS65219, }, 546 297 {} 547 298 }; 548 299 MODULE_DEVICE_TABLE(of, of_tps65219_match_table); ··· 559 306 module_i2c_driver(tps65219_driver); 560 307 561 308 MODULE_AUTHOR("Jerome Neanne <jneanne@baylibre.com>"); 562 - MODULE_DESCRIPTION("TPS65219 power management IC driver"); 309 + MODULE_DESCRIPTION("TPS65214/TPS65215/TPS65219 PMIC driver"); 563 310 MODULE_LICENSE("GPL");
+1 -2
drivers/mfd/upboard-fpga.c
··· 11 11 * Author: Thomas Richard <thomas.richard@bootlin.com> 12 12 */ 13 13 14 - #include <linux/acpi.h> 15 14 #include <linux/bitfield.h> 16 15 #include <linux/device.h> 17 16 #include <linux/err.h> ··· 310 311 static struct platform_driver upboard_fpga_driver = { 311 312 .driver = { 312 313 .name = "upboard-fpga", 313 - .acpi_match_table = ACPI_PTR(upboard_fpga_acpi_match), 314 + .acpi_match_table = upboard_fpga_acpi_match, 314 315 .dev_groups = upboard_fpga_groups, 315 316 }, 316 317 .probe = upboard_fpga_probe,
+6
drivers/power/supply/Kconfig
··· 583 583 help 584 584 Say Y to enable support for the Maxim MAX77693 battery charger. 585 585 586 + config CHARGER_MAX77705 587 + tristate "Maxim MAX77705 battery charger driver" 588 + depends on MFD_MAX77705 589 + help 590 + Say Y to enable support for the Maxim MAX77705 battery charger. 591 + 586 592 config CHARGER_MAX77976 587 593 tristate "Maxim MAX77976 battery charger driver" 588 594 depends on I2C
+1
drivers/power/supply/Makefile
··· 80 80 obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o 81 81 obj-$(CONFIG_CHARGER_MAX77650) += max77650-charger.o 82 82 obj-$(CONFIG_CHARGER_MAX77693) += max77693_charger.o 83 + obj-$(CONFIG_CHARGER_MAX77705) += max77705_charger.o 83 84 obj-$(CONFIG_CHARGER_MAX77976) += max77976_charger.o 84 85 obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o 85 86 obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o
+581
drivers/power/supply/max77705_charger.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Based on max77650-charger.c 4 + * 5 + * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.org> 6 + * 7 + * Battery charger driver for MAXIM 77705 charger/power-supply. 8 + */ 9 + 10 + #include <linux/devm-helpers.h> 11 + #include <linux/i2c.h> 12 + #include <linux/interrupt.h> 13 + #include <linux/mfd/max77693-common.h> 14 + #include <linux/mfd/max77705-private.h> 15 + #include <linux/power/max77705_charger.h> 16 + #include <linux/module.h> 17 + #include <linux/platform_device.h> 18 + #include <linux/power_supply.h> 19 + #include <linux/regmap.h> 20 + 21 + static const char *max77705_charger_model = "max77705"; 22 + static const char *max77705_charger_manufacturer = "Maxim Integrated"; 23 + 24 + static const struct regmap_config max77705_chg_regmap_config = { 25 + .reg_base = MAX77705_CHG_REG_BASE, 26 + .reg_bits = 8, 27 + .val_bits = 8, 28 + .max_register = MAX77705_CHG_REG_SAFEOUT_CTRL, 29 + }; 30 + 31 + static enum power_supply_property max77705_charger_props[] = { 32 + POWER_SUPPLY_PROP_ONLINE, 33 + POWER_SUPPLY_PROP_PRESENT, 34 + POWER_SUPPLY_PROP_STATUS, 35 + POWER_SUPPLY_PROP_CHARGE_TYPE, 36 + POWER_SUPPLY_PROP_HEALTH, 37 + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, 38 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, 39 + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 40 + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, 41 + }; 42 + 43 + static int max77705_chgin_irq(void *irq_drv_data) 44 + { 45 + struct max77705_charger_data *charger = irq_drv_data; 46 + 47 + queue_work(charger->wqueue, &charger->chgin_work); 48 + 49 + return 0; 50 + } 51 + 52 + static const struct regmap_irq max77705_charger_irqs[] = { 53 + { .mask = MAX77705_BYP_IM, }, 54 + { .mask = MAX77705_INP_LIMIT_IM, }, 55 + { .mask = MAX77705_BATP_IM, }, 56 + { .mask = MAX77705_BAT_IM, }, 57 + { .mask = MAX77705_CHG_IM, }, 58 + { .mask = MAX77705_WCIN_IM, }, 59 + { .mask = MAX77705_CHGIN_IM, }, 60 + { .mask = MAX77705_AICL_IM, }, 61 + }; 62 + 63 + static struct regmap_irq_chip max77705_charger_irq_chip = { 64 + .name = "max77705-charger", 65 + .status_base = MAX77705_CHG_REG_INT, 66 + .mask_base = MAX77705_CHG_REG_INT_MASK, 67 + .handle_post_irq = max77705_chgin_irq, 68 + .num_regs = 1, 69 + .irqs = max77705_charger_irqs, 70 + .num_irqs = ARRAY_SIZE(max77705_charger_irqs), 71 + }; 72 + 73 + static int max77705_charger_enable(struct max77705_charger_data *chg) 74 + { 75 + int rv; 76 + 77 + rv = regmap_update_bits(chg->regmap, MAX77705_CHG_REG_CNFG_09, 78 + MAX77705_CHG_EN_MASK, MAX77705_CHG_EN_MASK); 79 + if (rv) 80 + dev_err(chg->dev, "unable to enable the charger: %d\n", rv); 81 + 82 + return rv; 83 + } 84 + 85 + static void max77705_charger_disable(void *data) 86 + { 87 + struct max77705_charger_data *chg = data; 88 + int rv; 89 + 90 + rv = regmap_update_bits(chg->regmap, 91 + MAX77705_CHG_REG_CNFG_09, 92 + MAX77705_CHG_EN_MASK, 93 + MAX77705_CHG_DISABLE); 94 + if (rv) 95 + dev_err(chg->dev, "unable to disable the charger: %d\n", rv); 96 + } 97 + 98 + static int max77705_get_online(struct regmap *regmap, int *val) 99 + { 100 + unsigned int data; 101 + int ret; 102 + 103 + ret = regmap_read(regmap, MAX77705_CHG_REG_INT_OK, &data); 104 + if (ret < 0) 105 + return ret; 106 + 107 + *val = !!(data & MAX77705_CHGIN_OK); 108 + 109 + return 0; 110 + } 111 + 112 + static int max77705_check_battery(struct max77705_charger_data *charger, int *val) 113 + { 114 + unsigned int reg_data; 115 + unsigned int reg_data2; 116 + struct regmap *regmap = charger->regmap; 117 + 118 + regmap_read(regmap, MAX77705_CHG_REG_INT_OK, &reg_data); 119 + 120 + dev_dbg(charger->dev, "CHG_INT_OK(0x%x)\n", reg_data); 121 + 122 + regmap_read(regmap, MAX77705_CHG_REG_DETAILS_00, &reg_data2); 123 + 124 + dev_dbg(charger->dev, "CHG_DETAILS00(0x%x)\n", reg_data2); 125 + 126 + if ((reg_data & MAX77705_BATP_OK) || !(reg_data2 & MAX77705_BATP_DTLS)) 127 + *val = true; 128 + else 129 + *val = false; 130 + 131 + return 0; 132 + } 133 + 134 + static int max77705_get_charge_type(struct max77705_charger_data *charger, int *val) 135 + { 136 + struct regmap *regmap = charger->regmap; 137 + unsigned int reg_data; 138 + 139 + regmap_read(regmap, MAX77705_CHG_REG_CNFG_09, &reg_data); 140 + if (!MAX77705_CHARGER_CHG_CHARGING(reg_data)) { 141 + *val = POWER_SUPPLY_CHARGE_TYPE_NONE; 142 + return 0; 143 + } 144 + 145 + regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, &reg_data); 146 + reg_data &= MAX77705_CHG_DTLS; 147 + 148 + switch (reg_data) { 149 + case 0x0: 150 + case MAX77705_CHARGER_CONSTANT_CURRENT: 151 + case MAX77705_CHARGER_CONSTANT_VOLTAGE: 152 + *val = POWER_SUPPLY_CHARGE_TYPE_FAST; 153 + return 0; 154 + default: 155 + *val = POWER_SUPPLY_CHARGE_TYPE_NONE; 156 + return 0; 157 + } 158 + 159 + return 0; 160 + } 161 + 162 + static int max77705_get_status(struct max77705_charger_data *charger, int *val) 163 + { 164 + struct regmap *regmap = charger->regmap; 165 + unsigned int reg_data; 166 + 167 + regmap_read(regmap, MAX77705_CHG_REG_CNFG_09, &reg_data); 168 + if (!MAX77705_CHARGER_CHG_CHARGING(reg_data)) { 169 + *val = POWER_SUPPLY_CHARGE_TYPE_NONE; 170 + return 0; 171 + } 172 + 173 + regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, &reg_data); 174 + reg_data &= MAX77705_CHG_DTLS; 175 + 176 + switch (reg_data) { 177 + case 0x0: 178 + case MAX77705_CHARGER_CONSTANT_CURRENT: 179 + case MAX77705_CHARGER_CONSTANT_VOLTAGE: 180 + *val = POWER_SUPPLY_STATUS_CHARGING; 181 + return 0; 182 + case MAX77705_CHARGER_END_OF_CHARGE: 183 + case MAX77705_CHARGER_DONE: 184 + *val = POWER_SUPPLY_STATUS_FULL; 185 + return 0; 186 + /* those values hard coded as in vendor kernel, because of */ 187 + /* failure to determine it's actual meaning. */ 188 + case 0x05: 189 + case 0x06: 190 + case 0x07: 191 + *val = POWER_SUPPLY_STATUS_NOT_CHARGING; 192 + return 0; 193 + case 0x08: 194 + case 0xA: 195 + case 0xB: 196 + *val = POWER_SUPPLY_STATUS_DISCHARGING; 197 + return 0; 198 + default: 199 + *val = POWER_SUPPLY_STATUS_UNKNOWN; 200 + return 0; 201 + } 202 + 203 + return 0; 204 + } 205 + 206 + static int max77705_get_vbus_state(struct regmap *regmap, int *value) 207 + { 208 + int ret; 209 + unsigned int charge_dtls; 210 + 211 + ret = regmap_read(regmap, MAX77705_CHG_REG_DETAILS_00, &charge_dtls); 212 + if (ret) 213 + return ret; 214 + 215 + charge_dtls = ((charge_dtls & MAX77705_CHGIN_DTLS) >> 216 + MAX77705_CHGIN_DTLS_SHIFT); 217 + 218 + switch (charge_dtls) { 219 + case 0x00: 220 + *value = POWER_SUPPLY_HEALTH_UNDERVOLTAGE; 221 + break; 222 + case 0x01: 223 + *value = POWER_SUPPLY_HEALTH_UNDERVOLTAGE; 224 + break; 225 + case 0x02: 226 + *value = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 227 + break; 228 + case 0x03: 229 + *value = POWER_SUPPLY_HEALTH_GOOD; 230 + break; 231 + default: 232 + return 0; 233 + } 234 + return 0; 235 + } 236 + 237 + static int max77705_get_battery_health(struct max77705_charger_data *charger, 238 + int *value) 239 + { 240 + struct regmap *regmap = charger->regmap; 241 + unsigned int bat_dtls; 242 + 243 + regmap_read(regmap, MAX77705_CHG_REG_DETAILS_01, &bat_dtls); 244 + bat_dtls = ((bat_dtls & MAX77705_BAT_DTLS) >> MAX77705_BAT_DTLS_SHIFT); 245 + 246 + switch (bat_dtls) { 247 + case MAX77705_BATTERY_NOBAT: 248 + dev_dbg(charger->dev, "%s: No battery and the charger is suspended\n", 249 + __func__); 250 + *value = POWER_SUPPLY_HEALTH_NO_BATTERY; 251 + break; 252 + case MAX77705_BATTERY_PREQUALIFICATION: 253 + dev_dbg(charger->dev, "%s: battery is okay but its voltage is low(~VPQLB)\n", 254 + __func__); 255 + break; 256 + case MAX77705_BATTERY_DEAD: 257 + dev_dbg(charger->dev, "%s: battery dead\n", __func__); 258 + *value = POWER_SUPPLY_HEALTH_DEAD; 259 + break; 260 + case MAX77705_BATTERY_GOOD: 261 + case MAX77705_BATTERY_LOWVOLTAGE: 262 + *value = POWER_SUPPLY_HEALTH_GOOD; 263 + break; 264 + case MAX77705_BATTERY_OVERVOLTAGE: 265 + dev_dbg(charger->dev, "%s: battery ovp\n", __func__); 266 + *value = POWER_SUPPLY_HEALTH_OVERVOLTAGE; 267 + break; 268 + default: 269 + dev_dbg(charger->dev, "%s: battery unknown\n", __func__); 270 + *value = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; 271 + break; 272 + } 273 + 274 + return 0; 275 + } 276 + 277 + static int max77705_get_health(struct max77705_charger_data *charger, int *val) 278 + { 279 + struct regmap *regmap = charger->regmap; 280 + int ret, is_online = 0; 281 + 282 + ret = max77705_get_online(regmap, &is_online); 283 + if (ret) 284 + return ret; 285 + if (is_online) { 286 + ret = max77705_get_vbus_state(regmap, val); 287 + if (ret || (*val != POWER_SUPPLY_HEALTH_GOOD)) 288 + return ret; 289 + } 290 + return max77705_get_battery_health(charger, val); 291 + } 292 + 293 + static int max77705_get_input_current(struct max77705_charger_data *charger, 294 + int *val) 295 + { 296 + unsigned int reg_data; 297 + int get_current = 0; 298 + struct regmap *regmap = charger->regmap; 299 + 300 + regmap_read(regmap, MAX77705_CHG_REG_CNFG_09, &reg_data); 301 + 302 + reg_data &= MAX77705_CHG_CHGIN_LIM_MASK; 303 + 304 + if (reg_data <= 3) 305 + get_current = MAX77705_CURRENT_CHGIN_MIN; 306 + else if (reg_data >= MAX77705_CHG_CHGIN_LIM_MASK) 307 + get_current = MAX77705_CURRENT_CHGIN_MAX; 308 + else 309 + get_current = (reg_data + 1) * MAX77705_CURRENT_CHGIN_STEP; 310 + 311 + *val = get_current; 312 + 313 + return 0; 314 + } 315 + 316 + static int max77705_get_charge_current(struct max77705_charger_data *charger, 317 + int *val) 318 + { 319 + unsigned int reg_data; 320 + struct regmap *regmap = charger->regmap; 321 + 322 + regmap_read(regmap, MAX77705_CHG_REG_CNFG_02, &reg_data); 323 + reg_data &= MAX77705_CHG_CC; 324 + 325 + *val = reg_data <= 0x2 ? MAX77705_CURRENT_CHGIN_MIN : reg_data * MAX77705_CURRENT_CHG_STEP; 326 + 327 + return 0; 328 + } 329 + 330 + static int max77705_set_float_voltage(struct max77705_charger_data *charger, 331 + int float_voltage) 332 + { 333 + int float_voltage_mv; 334 + unsigned int reg_data = 0; 335 + struct regmap *regmap = charger->regmap; 336 + 337 + float_voltage_mv = float_voltage / 1000; 338 + reg_data = float_voltage_mv <= 4000 ? 0x0 : 339 + float_voltage_mv >= 4500 ? 0x23 : 340 + (float_voltage_mv <= 4200) ? (float_voltage_mv - 4000) / 50 : 341 + (((float_voltage_mv - 4200) / 10) + 0x04); 342 + 343 + return regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_04, 344 + MAX77705_CHG_CV_PRM_MASK, 345 + (reg_data << MAX77705_CHG_CV_PRM_SHIFT)); 346 + } 347 + 348 + static int max77705_get_float_voltage(struct max77705_charger_data *charger, 349 + int *val) 350 + { 351 + unsigned int reg_data = 0; 352 + int voltage_mv; 353 + struct regmap *regmap = charger->regmap; 354 + 355 + regmap_read(regmap, MAX77705_CHG_REG_CNFG_04, &reg_data); 356 + reg_data &= MAX77705_CHG_PRM_MASK; 357 + voltage_mv = reg_data <= 0x04 ? reg_data * 50 + 4000 : 358 + (reg_data - 4) * 10 + 4200; 359 + *val = voltage_mv * 1000; 360 + 361 + return 0; 362 + } 363 + 364 + static int max77705_chg_get_property(struct power_supply *psy, 365 + enum power_supply_property psp, 366 + union power_supply_propval *val) 367 + { 368 + struct max77705_charger_data *charger = power_supply_get_drvdata(psy); 369 + struct regmap *regmap = charger->regmap; 370 + 371 + switch (psp) { 372 + case POWER_SUPPLY_PROP_ONLINE: 373 + return max77705_get_online(regmap, &val->intval); 374 + case POWER_SUPPLY_PROP_PRESENT: 375 + return max77705_check_battery(charger, &val->intval); 376 + case POWER_SUPPLY_PROP_STATUS: 377 + return max77705_get_status(charger, &val->intval); 378 + case POWER_SUPPLY_PROP_CHARGE_TYPE: 379 + return max77705_get_charge_type(charger, &val->intval); 380 + case POWER_SUPPLY_PROP_HEALTH: 381 + return max77705_get_health(charger, &val->intval); 382 + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: 383 + return max77705_get_input_current(charger, &val->intval); 384 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 385 + return max77705_get_charge_current(charger, &val->intval); 386 + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: 387 + return max77705_get_float_voltage(charger, &val->intval); 388 + case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: 389 + val->intval = charger->bat_info->voltage_max_design_uv; 390 + break; 391 + case POWER_SUPPLY_PROP_MODEL_NAME: 392 + val->strval = max77705_charger_model; 393 + break; 394 + case POWER_SUPPLY_PROP_MANUFACTURER: 395 + val->strval = max77705_charger_manufacturer; 396 + break; 397 + default: 398 + return -EINVAL; 399 + } 400 + return 0; 401 + } 402 + 403 + static const struct power_supply_desc max77705_charger_psy_desc = { 404 + .name = "max77705-charger", 405 + .type = POWER_SUPPLY_TYPE_USB, 406 + .properties = max77705_charger_props, 407 + .num_properties = ARRAY_SIZE(max77705_charger_props), 408 + .get_property = max77705_chg_get_property, 409 + }; 410 + 411 + static void max77705_chgin_isr_work(struct work_struct *work) 412 + { 413 + struct max77705_charger_data *charger = 414 + container_of(work, struct max77705_charger_data, chgin_work); 415 + 416 + power_supply_changed(charger->psy_chg); 417 + } 418 + 419 + static void max77705_charger_initialize(struct max77705_charger_data *chg) 420 + { 421 + u8 reg_data; 422 + struct power_supply_battery_info *info; 423 + struct regmap *regmap = chg->regmap; 424 + 425 + if (power_supply_get_battery_info(chg->psy_chg, &info) < 0) 426 + return; 427 + 428 + chg->bat_info = info; 429 + 430 + /* unlock charger setting protect */ 431 + /* slowest LX slope */ 432 + reg_data = MAX77705_CHGPROT_MASK | MAX77705_SLOWEST_LX_SLOPE; 433 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_06, reg_data, 434 + reg_data); 435 + 436 + /* fast charge timer disable */ 437 + /* restart threshold disable */ 438 + /* pre-qual charge disable */ 439 + reg_data = (MAX77705_FCHGTIME_DISABLE << MAX77705_FCHGTIME_SHIFT) | 440 + (MAX77705_CHG_RSTRT_DISABLE << MAX77705_CHG_RSTRT_SHIFT) | 441 + (MAX77705_CHG_PQEN_DISABLE << MAX77705_PQEN_SHIFT); 442 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_01, 443 + (MAX77705_FCHGTIME_MASK | 444 + MAX77705_CHG_RSTRT_MASK | 445 + MAX77705_PQEN_MASK), 446 + reg_data); 447 + 448 + /* OTG off(UNO on), boost off */ 449 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_00, 450 + MAX77705_OTG_CTRL, 0); 451 + 452 + /* charge current 450mA(default) */ 453 + /* otg current limit 900mA */ 454 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_02, 455 + MAX77705_OTG_ILIM_MASK, 456 + MAX77705_OTG_ILIM_900 << MAX77705_OTG_ILIM_SHIFT); 457 + 458 + /* BAT to SYS OCP 4.80A */ 459 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_05, 460 + MAX77705_REG_B2SOVRC_MASK, 461 + MAX77705_B2SOVRC_4_8A << MAX77705_REG_B2SOVRC_SHIFT); 462 + /* top off current 150mA */ 463 + /* top off timer 30min */ 464 + reg_data = (MAX77705_TO_ITH_150MA << MAX77705_TO_ITH_SHIFT) | 465 + (MAX77705_TO_TIME_30M << MAX77705_TO_TIME_SHIFT) | 466 + (MAX77705_SYS_TRACK_DISABLE << MAX77705_SYS_TRACK_DIS_SHIFT); 467 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_03, 468 + (MAX77705_TO_ITH_MASK | 469 + MAX77705_TO_TIME_MASK | 470 + MAX77705_SYS_TRACK_DIS_MASK), reg_data); 471 + 472 + /* cv voltage 4.2V or 4.35V */ 473 + /* MINVSYS 3.6V(default) */ 474 + if (info->voltage_max_design_uv < 0) { 475 + dev_warn(chg->dev, "missing battery:voltage-max-design-microvolt\n"); 476 + max77705_set_float_voltage(chg, 4200000); 477 + } else { 478 + max77705_set_float_voltage(chg, info->voltage_max_design_uv); 479 + } 480 + 481 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_12, 482 + MAX77705_VCHGIN_REG_MASK, MAX77705_VCHGIN_4_5); 483 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_12, 484 + MAX77705_WCIN_REG_MASK, MAX77705_WCIN_4_5); 485 + 486 + /* Watchdog timer */ 487 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_00, 488 + MAX77705_WDTEN_MASK, 0); 489 + 490 + /* Active Discharge Enable */ 491 + regmap_update_bits(regmap, MAX77705_PMIC_REG_MAINCTRL1, 1, 1); 492 + 493 + /* VBYPSET=5.0V */ 494 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_11, MAX77705_VBYPSET_MASK, 0); 495 + 496 + /* Switching Frequency : 1.5MHz */ 497 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_08, MAX77705_REG_FSW_MASK, 498 + (MAX77705_CHG_FSW_1_5MHz << MAX77705_REG_FSW_SHIFT)); 499 + 500 + /* Auto skip mode */ 501 + regmap_update_bits(regmap, MAX77705_CHG_REG_CNFG_12, MAX77705_REG_DISKIP_MASK, 502 + (MAX77705_AUTO_SKIP << MAX77705_REG_DISKIP_SHIFT)); 503 + } 504 + 505 + static int max77705_charger_probe(struct i2c_client *i2c) 506 + { 507 + struct power_supply_config pscfg = {}; 508 + struct max77705_charger_data *chg; 509 + struct device *dev; 510 + struct regmap_irq_chip_data *irq_data; 511 + int ret; 512 + 513 + dev = &i2c->dev; 514 + 515 + chg = devm_kzalloc(dev, sizeof(*chg), GFP_KERNEL); 516 + if (!chg) 517 + return -ENOMEM; 518 + 519 + chg->dev = dev; 520 + i2c_set_clientdata(i2c, chg); 521 + 522 + chg->regmap = devm_regmap_init_i2c(i2c, &max77705_chg_regmap_config); 523 + if (IS_ERR(chg->regmap)) 524 + return PTR_ERR(chg->regmap); 525 + 526 + ret = regmap_update_bits(chg->regmap, 527 + MAX77705_CHG_REG_INT_MASK, 528 + MAX77705_CHGIN_IM, 0); 529 + if (ret) 530 + return ret; 531 + 532 + pscfg.fwnode = dev_fwnode(dev); 533 + pscfg.drv_data = chg; 534 + 535 + chg->psy_chg = devm_power_supply_register(dev, &max77705_charger_psy_desc, &pscfg); 536 + if (IS_ERR(chg->psy_chg)) 537 + return PTR_ERR(chg->psy_chg); 538 + 539 + max77705_charger_irq_chip.irq_drv_data = chg; 540 + ret = devm_regmap_add_irq_chip(chg->dev, chg->regmap, i2c->irq, 541 + IRQF_ONESHOT | IRQF_SHARED, 0, 542 + &max77705_charger_irq_chip, 543 + &irq_data); 544 + if (ret) 545 + return dev_err_probe(dev, ret, "failed to add irq chip\n"); 546 + 547 + chg->wqueue = create_singlethread_workqueue(dev_name(dev)); 548 + if (IS_ERR(chg->wqueue)) 549 + return dev_err_probe(dev, PTR_ERR(chg->wqueue), "failed to create workqueue\n"); 550 + 551 + ret = devm_work_autocancel(dev, &chg->chgin_work, max77705_chgin_isr_work); 552 + if (ret) 553 + return dev_err_probe(dev, ret, "failed to initialize interrupt work\n"); 554 + 555 + max77705_charger_initialize(chg); 556 + 557 + ret = max77705_charger_enable(chg); 558 + if (ret) 559 + return dev_err_probe(dev, ret, "failed to enable charge\n"); 560 + 561 + return devm_add_action_or_reset(dev, max77705_charger_disable, chg); 562 + } 563 + 564 + static const struct of_device_id max77705_charger_of_match[] = { 565 + { .compatible = "maxim,max77705-charger" }, 566 + { } 567 + }; 568 + MODULE_DEVICE_TABLE(of, max77705_charger_of_match); 569 + 570 + static struct i2c_driver max77705_charger_driver = { 571 + .driver = { 572 + .name = "max77705-charger", 573 + .of_match_table = max77705_charger_of_match, 574 + }, 575 + .probe = max77705_charger_probe, 576 + }; 577 + module_i2c_driver(max77705_charger_driver); 578 + 579 + MODULE_AUTHOR("Dzmitry Sankouski <dsankouski@gmail.com>"); 580 + MODULE_DESCRIPTION("Maxim MAX77705 charger driver"); 581 + MODULE_LICENSE("GPL");
+2 -2
drivers/regulator/Kconfig
··· 1330 1330 via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. 1331 1331 1332 1332 config REGULATOR_S2MPS11 1333 - tristate "Samsung S2MPS11/13/14/15/S2MPU02 voltage regulator" 1333 + tristate "Samsung S2MPS11/13/14/15/S2MPU02/05 voltage regulator" 1334 1334 depends on MFD_SEC_CORE || COMPILE_TEST 1335 1335 help 1336 - This driver supports a Samsung S2MPS11/13/14/15/S2MPU02 voltage 1336 + This driver supports a Samsung S2MPS11/13/14/15/S2MPU02/05 voltage 1337 1337 output regulator via I2C bus. The chip is comprised of high efficient 1338 1338 Buck converters including Dual-Phase Buck converter, Buck-Boost 1339 1339 converter, various LDOs.
+91 -1
drivers/regulator/s2mps11.c
··· 21 21 #include <linux/mfd/samsung/s2mps14.h> 22 22 #include <linux/mfd/samsung/s2mps15.h> 23 23 #include <linux/mfd/samsung/s2mpu02.h> 24 + #include <linux/mfd/samsung/s2mpu05.h> 24 25 25 26 /* The highest number of possible regulators for supported devices. */ 26 27 #define S2MPS_REGULATOR_MAX S2MPS13_REGULATOR_MAX ··· 254 253 val = S2MPU02_ENABLE_SUSPEND; 255 254 else 256 255 val = rdev->desc->enable_mask; 256 + break; 257 + case S2MPU05: 258 + val = rdev->desc->enable_mask; 257 259 break; 258 260 default: 259 261 return -EINVAL; ··· 1122 1118 regulator_desc_s2mpu02_buck7(7), 1123 1119 }; 1124 1120 1121 + #define regulator_desc_s2mpu05_ldo_reg(num, min, step, reg) { \ 1122 + .name = "ldo"#num, \ 1123 + .id = S2MPU05_LDO##num, \ 1124 + .ops = &s2mpu02_ldo_ops, \ 1125 + .type = REGULATOR_VOLTAGE, \ 1126 + .owner = THIS_MODULE, \ 1127 + .min_uV = min, \ 1128 + .uV_step = step, \ 1129 + .n_voltages = S2MPU05_LDO_N_VOLTAGES, \ 1130 + .vsel_reg = reg, \ 1131 + .vsel_mask = S2MPU05_LDO_VSEL_MASK, \ 1132 + .enable_reg = reg, \ 1133 + .enable_mask = S2MPU05_ENABLE_MASK, \ 1134 + .enable_time = S2MPU05_ENABLE_TIME_LDO \ 1135 + } 1136 + 1137 + #define regulator_desc_s2mpu05_ldo(num, reg, min, step) \ 1138 + regulator_desc_s2mpu05_ldo_reg(num, min, step, S2MPU05_REG_L##num##reg) 1139 + 1140 + #define regulator_desc_s2mpu05_ldo1(num, reg) \ 1141 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN1, S2MPU05_LDO_STEP1) 1142 + 1143 + #define regulator_desc_s2mpu05_ldo2(num, reg) \ 1144 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN1, S2MPU05_LDO_STEP2) 1145 + 1146 + #define regulator_desc_s2mpu05_ldo3(num, reg) \ 1147 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN2, S2MPU05_LDO_STEP2) 1148 + 1149 + #define regulator_desc_s2mpu05_ldo4(num, reg) \ 1150 + regulator_desc_s2mpu05_ldo(num, reg, S2MPU05_LDO_MIN3, S2MPU05_LDO_STEP2) 1151 + 1152 + #define regulator_desc_s2mpu05_buck(num, which) { \ 1153 + .name = "buck"#num, \ 1154 + .id = S2MPU05_BUCK##num, \ 1155 + .ops = &s2mpu02_buck_ops, \ 1156 + .type = REGULATOR_VOLTAGE, \ 1157 + .owner = THIS_MODULE, \ 1158 + .min_uV = S2MPU05_BUCK_MIN##which, \ 1159 + .uV_step = S2MPU05_BUCK_STEP##which, \ 1160 + .n_voltages = S2MPU05_BUCK_N_VOLTAGES, \ 1161 + .vsel_reg = S2MPU05_REG_B##num##CTRL2, \ 1162 + .vsel_mask = S2MPU05_BUCK_VSEL_MASK, \ 1163 + .enable_reg = S2MPU05_REG_B##num##CTRL1, \ 1164 + .enable_mask = S2MPU05_ENABLE_MASK, \ 1165 + .enable_time = S2MPU05_ENABLE_TIME_BUCK##num \ 1166 + } 1167 + 1168 + #define regulator_desc_s2mpu05_buck123(num) regulator_desc_s2mpu05_buck(num, 1) 1169 + #define regulator_desc_s2mpu05_buck45(num) regulator_desc_s2mpu05_buck(num, 2) 1170 + 1171 + static const struct regulator_desc s2mpu05_regulators[] = { 1172 + regulator_desc_s2mpu05_ldo4(1, CTRL), 1173 + regulator_desc_s2mpu05_ldo3(2, CTRL), 1174 + regulator_desc_s2mpu05_ldo2(3, CTRL), 1175 + regulator_desc_s2mpu05_ldo1(4, CTRL), 1176 + regulator_desc_s2mpu05_ldo1(5, CTRL), 1177 + regulator_desc_s2mpu05_ldo1(6, CTRL), 1178 + regulator_desc_s2mpu05_ldo2(7, CTRL), 1179 + regulator_desc_s2mpu05_ldo3(8, CTRL), 1180 + regulator_desc_s2mpu05_ldo4(9, CTRL1), 1181 + regulator_desc_s2mpu05_ldo4(10, CTRL), 1182 + /* LDOs 11-24 are used for CP. They aren't documented. */ 1183 + regulator_desc_s2mpu05_ldo2(25, CTRL), 1184 + regulator_desc_s2mpu05_ldo3(26, CTRL), 1185 + regulator_desc_s2mpu05_ldo2(27, CTRL), 1186 + regulator_desc_s2mpu05_ldo3(28, CTRL), 1187 + regulator_desc_s2mpu05_ldo3(29, CTRL), 1188 + regulator_desc_s2mpu05_ldo2(30, CTRL), 1189 + regulator_desc_s2mpu05_ldo3(31, CTRL), 1190 + regulator_desc_s2mpu05_ldo3(32, CTRL), 1191 + regulator_desc_s2mpu05_ldo3(33, CTRL), 1192 + regulator_desc_s2mpu05_ldo3(34, CTRL), 1193 + regulator_desc_s2mpu05_ldo3(35, CTRL), 1194 + regulator_desc_s2mpu05_buck123(1), 1195 + regulator_desc_s2mpu05_buck123(2), 1196 + regulator_desc_s2mpu05_buck123(3), 1197 + regulator_desc_s2mpu05_buck45(4), 1198 + regulator_desc_s2mpu05_buck45(5), 1199 + }; 1200 + 1125 1201 static int s2mps11_pmic_probe(struct platform_device *pdev) 1126 1202 { 1127 1203 struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); ··· 1242 1158 rdev_num = ARRAY_SIZE(s2mpu02_regulators); 1243 1159 regulators = s2mpu02_regulators; 1244 1160 BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu02_regulators)); 1161 + break; 1162 + case S2MPU05: 1163 + rdev_num = ARRAY_SIZE(s2mpu05_regulators); 1164 + regulators = s2mpu05_regulators; 1165 + BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu05_regulators)); 1245 1166 break; 1246 1167 default: 1247 1168 dev_err(&pdev->dev, "Invalid device type: %u\n", ··· 1317 1228 { "s2mps14-regulator", S2MPS14X}, 1318 1229 { "s2mps15-regulator", S2MPS15X}, 1319 1230 { "s2mpu02-regulator", S2MPU02}, 1231 + { "s2mpu05-regulator", S2MPU05}, 1320 1232 { }, 1321 1233 }; 1322 1234 MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id); ··· 1335 1245 1336 1246 /* Module information */ 1337 1247 MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>"); 1338 - MODULE_DESCRIPTION("Samsung S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver"); 1248 + MODULE_DESCRIPTION("Samsung S2MPS11/14/15/S2MPU02/05 Regulator Driver"); 1339 1249 MODULE_LICENSE("GPL");
+1
include/linux/mfd/axp20x.h
··· 137 137 #define AXP717_IRQ2_STATE 0x4a 138 138 #define AXP717_IRQ3_STATE 0x4b 139 139 #define AXP717_IRQ4_STATE 0x4c 140 + #define AXP717_TS_PIN_CFG 0x50 140 141 #define AXP717_ICC_CHG_SET 0x62 141 142 #define AXP717_ITERM_CHG_SET 0x63 142 143 #define AXP717_CV_CHG_SET 0x64
+3 -3
include/linux/mfd/dbx500-prcmu.h
··· 215 215 216 216 static inline void prcmu_early_init(void) 217 217 { 218 - return db8500_prcmu_early_init(); 218 + db8500_prcmu_early_init(); 219 219 } 220 220 221 221 static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk, ··· 302 302 303 303 static inline void prcmu_system_reset(u16 reset_code) 304 304 { 305 - return db8500_prcmu_system_reset(reset_code); 305 + db8500_prcmu_system_reset(reset_code); 306 306 } 307 307 308 308 static inline u16 prcmu_get_reset_code(void) ··· 314 314 void prcmu_ac_sleep_req(void); 315 315 static inline void prcmu_modem_reset(void) 316 316 { 317 - return db8500_prcmu_modem_reset(); 317 + db8500_prcmu_modem_reset(); 318 318 } 319 319 320 320 static inline bool prcmu_is_ac_wake_requested(void)
-1
include/linux/mfd/ezx-pcap.h
··· 31 31 int pcap_to_irq(struct pcap_chip *, int); 32 32 int irq_to_pcap(struct pcap_chip *, int); 33 33 int pcap_adc_async(struct pcap_chip *, u8, u32, u8[], void *, void *); 34 - int pcap_adc_sync(struct pcap_chip *, u8, u32, u8[], u16[]); 35 34 void pcap_set_ts_bits(struct pcap_chip *, u32); 36 35 37 36 #define PCAP_SECOND_PORT 1
-1
include/linux/mfd/lp3943.h
··· 11 11 #define __MFD_LP3943_H__ 12 12 13 13 #include <linux/gpio.h> 14 - #include <linux/pwm.h> 15 14 #include <linux/regmap.h> 16 15 17 16 /* Registers */
+3 -1
include/linux/mfd/max77693-common.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 2 /* 3 - * Common data shared between Maxim 77693 and 77843 drivers 3 + * Common data shared between Maxim 77693, 77705 and 77843 drivers 4 4 * 5 5 * Copyright (C) 2015 Samsung Electronics 6 6 */ ··· 11 11 enum max77693_types { 12 12 TYPE_MAX77693_UNKNOWN, 13 13 TYPE_MAX77693, 14 + TYPE_MAX77705, 14 15 TYPE_MAX77843, 15 16 16 17 TYPE_MAX77693_NUM, ··· 33 32 struct regmap *regmap_muic; 34 33 struct regmap *regmap_haptic; /* Only MAX77693 */ 35 34 struct regmap *regmap_chg; /* Only MAX77843 */ 35 + struct regmap *regmap_leds; /* Only MAX77705 */ 36 36 37 37 struct regmap_irq_chip_data *irq_data_led; 38 38 struct regmap_irq_chip_data *irq_data_topsys;
+195
include/linux/mfd/max77705-private.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Maxim MAX77705 definitions. 4 + * 5 + * Copyright (C) 2015 Samsung Electronics, Inc. 6 + * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.com> 7 + */ 8 + 9 + #ifndef __LINUX_MFD_MAX77705_PRIV_H 10 + #define __LINUX_MFD_MAX77705_PRIV_H 11 + 12 + #define MAX77705_SRC_IRQ_CHG BIT(0) 13 + #define MAX77705_SRC_IRQ_TOP BIT(1) 14 + #define MAX77705_SRC_IRQ_FG BIT(2) 15 + #define MAX77705_SRC_IRQ_USBC BIT(3) 16 + #define MAX77705_SRC_IRQ_ALL (MAX77705_SRC_IRQ_CHG | MAX77705_SRC_IRQ_TOP | \ 17 + MAX77705_SRC_IRQ_FG | MAX77705_SRC_IRQ_USBC) 18 + 19 + /* MAX77705_PMIC_REG_PMICREV register */ 20 + #define MAX77705_VERSION_SHIFT 3 21 + #define MAX77705_REVISION_MASK GENMASK(2, 0) 22 + #define MAX77705_VERSION_MASK GENMASK(7, MAX77705_VERSION_SHIFT) 23 + /* MAX77705_PMIC_REG_MAINCTRL1 register */ 24 + #define MAX77705_MAINCTRL1_BIASEN_SHIFT 7 25 + #define MAX77705_MAINCTRL1_BIASEN_MASK BIT(MAX77705_MAINCTRL1_BIASEN_SHIFT) 26 + /* MAX77705_PMIC_REG_MCONFIG2 (haptics) register */ 27 + #define MAX77705_CONFIG2_MEN_SHIFT 6 28 + #define MAX77705_CONFIG2_MODE_SHIFT 7 29 + #define MAX77705_CONFIG2_HTYP_SHIFT 5 30 + /* MAX77705_PMIC_REG_SYSTEM_INT_MASK register */ 31 + #define MAX77705_SYSTEM_IRQ_BSTEN_INT BIT(3) 32 + #define MAX77705_SYSTEM_IRQ_SYSUVLO_INT BIT(4) 33 + #define MAX77705_SYSTEM_IRQ_SYSOVLO_INT BIT(5) 34 + #define MAX77705_SYSTEM_IRQ_TSHDN_INT BIT(6) 35 + #define MAX77705_SYSTEM_IRQ_TM_INT BIT(7) 36 + /* MAX77705_RGBLED_REG_LEDEN register */ 37 + #define MAX77705_RGBLED_EN_WIDTH 2 38 + /* MAX77705_RGBLED_REG_LEDBLNK register */ 39 + #define MAX77705_RGB_DELAY_100_STEP_LIM 500 40 + #define MAX77705_RGB_DELAY_100_STEP_COUNT 4 41 + #define MAX77705_RGB_DELAY_100_STEP 100 42 + #define MAX77705_RGB_DELAY_250_STEP_LIM 3250 43 + #define MAX77705_RGB_DELAY_250_STEP 250 44 + #define MAX77705_RGB_DELAY_500_STEP 500 45 + #define MAX77705_RGB_DELAY_500_STEP_COUNT 10 46 + #define MAX77705_RGB_DELAY_500_STEP_LIM 5000 47 + #define MAX77705_RGB_DELAY_1000_STEP_LIM 8000 48 + #define MAX77705_RGB_DELAY_1000_STEP_COUNT 13 49 + #define MAX77705_RGB_DELAY_1000_STEP 1000 50 + #define MAX77705_RGB_DELAY_2000_STEP 2000 51 + #define MAX77705_RGB_DELAY_2000_STEP_COUNT 13 52 + #define MAX77705_RGB_DELAY_2000_STEP_LIM 12000 53 + 54 + enum max77705_hw_rev { 55 + MAX77705_PASS1 = 1, 56 + MAX77705_PASS2, 57 + MAX77705_PASS3 58 + }; 59 + 60 + enum max77705_reg { 61 + MAX77705_PMIC_REG_PMICID1 = 0x00, 62 + MAX77705_PMIC_REG_PMICREV = 0x01, 63 + MAX77705_PMIC_REG_MAINCTRL1 = 0x02, 64 + MAX77705_PMIC_REG_BSTOUT_MASK = 0x03, 65 + MAX77705_PMIC_REG_FORCE_EN_MASK = 0x08, 66 + MAX77705_PMIC_REG_MCONFIG = 0x10, 67 + MAX77705_PMIC_REG_MCONFIG2 = 0x11, 68 + MAX77705_PMIC_REG_INTSRC = 0x22, 69 + MAX77705_PMIC_REG_INTSRC_MASK = 0x23, 70 + MAX77705_PMIC_REG_SYSTEM_INT = 0x24, 71 + MAX77705_PMIC_REG_RESERVED_25 = 0x25, 72 + MAX77705_PMIC_REG_SYSTEM_INT_MASK = 0x26, 73 + MAX77705_PMIC_REG_RESERVED_27 = 0x27, 74 + MAX77705_PMIC_REG_RESERVED_28 = 0x28, 75 + MAX77705_PMIC_REG_RESERVED_29 = 0x29, 76 + MAX77705_PMIC_REG_BOOSTCONTROL1 = 0x4C, 77 + MAX77705_PMIC_REG_BOOSTCONTROL2 = 0x4F, 78 + MAX77705_PMIC_REG_SW_RESET = 0x50, 79 + MAX77705_PMIC_REG_USBC_RESET = 0x51, 80 + 81 + MAX77705_PMIC_REG_END 82 + }; 83 + 84 + enum max77705_chg_reg { 85 + MAX77705_CHG_REG_BASE = 0xB0, 86 + MAX77705_CHG_REG_INT = 0, 87 + MAX77705_CHG_REG_INT_MASK, 88 + MAX77705_CHG_REG_INT_OK, 89 + MAX77705_CHG_REG_DETAILS_00, 90 + MAX77705_CHG_REG_DETAILS_01, 91 + MAX77705_CHG_REG_DETAILS_02, 92 + MAX77705_CHG_REG_DTLS_03, 93 + MAX77705_CHG_REG_CNFG_00, 94 + MAX77705_CHG_REG_CNFG_01, 95 + MAX77705_CHG_REG_CNFG_02, 96 + MAX77705_CHG_REG_CNFG_03, 97 + MAX77705_CHG_REG_CNFG_04, 98 + MAX77705_CHG_REG_CNFG_05, 99 + MAX77705_CHG_REG_CNFG_06, 100 + MAX77705_CHG_REG_CNFG_07, 101 + MAX77705_CHG_REG_CNFG_08, 102 + MAX77705_CHG_REG_CNFG_09, 103 + MAX77705_CHG_REG_CNFG_10, 104 + MAX77705_CHG_REG_CNFG_11, 105 + 106 + MAX77705_CHG_REG_CNFG_12, 107 + MAX77705_CHG_REG_CNFG_13, 108 + MAX77705_CHG_REG_CNFG_14, 109 + MAX77705_CHG_REG_SAFEOUT_CTRL 110 + }; 111 + 112 + enum max77705_fuelgauge_reg { 113 + STATUS_REG = 0x00, 114 + VALRT_THRESHOLD_REG = 0x01, 115 + TALRT_THRESHOLD_REG = 0x02, 116 + SALRT_THRESHOLD_REG = 0x03, 117 + REMCAP_REP_REG = 0x05, 118 + SOCREP_REG = 0x06, 119 + TEMPERATURE_REG = 0x08, 120 + VCELL_REG = 0x09, 121 + TIME_TO_EMPTY_REG = 0x11, 122 + FULLSOCTHR_REG = 0x13, 123 + CURRENT_REG = 0x0A, 124 + AVG_CURRENT_REG = 0x0B, 125 + SOCMIX_REG = 0x0D, 126 + SOCAV_REG = 0x0E, 127 + REMCAP_MIX_REG = 0x0F, 128 + FULLCAP_REG = 0x10, 129 + RFAST_REG = 0x15, 130 + AVR_TEMPERATURE_REG = 0x16, 131 + CYCLES_REG = 0x17, 132 + DESIGNCAP_REG = 0x18, 133 + AVR_VCELL_REG = 0x19, 134 + TIME_TO_FULL_REG = 0x20, 135 + CONFIG_REG = 0x1D, 136 + ICHGTERM_REG = 0x1E, 137 + REMCAP_AV_REG = 0x1F, 138 + FULLCAP_NOM_REG = 0x23, 139 + LEARN_CFG_REG = 0x28, 140 + FILTER_CFG_REG = 0x29, 141 + MISCCFG_REG = 0x2B, 142 + QRTABLE20_REG = 0x32, 143 + FULLCAP_REP_REG = 0x35, 144 + RCOMP_REG = 0x38, 145 + VEMPTY_REG = 0x3A, 146 + FSTAT_REG = 0x3D, 147 + DISCHARGE_THRESHOLD_REG = 0x40, 148 + QRTABLE30_REG = 0x42, 149 + ISYS_REG = 0x43, 150 + DQACC_REG = 0x45, 151 + DPACC_REG = 0x46, 152 + AVGISYS_REG = 0x4B, 153 + QH_REG = 0x4D, 154 + VSYS_REG = 0xB1, 155 + TALRTTH2_REG = 0xB2, 156 + VBYP_REG = 0xB3, 157 + CONFIG2_REG = 0xBB, 158 + IIN_REG = 0xD0, 159 + OCV_REG = 0xEE, 160 + VFOCV_REG = 0xFB, 161 + VFSOC_REG = 0xFF, 162 + 163 + MAX77705_FG_END 164 + }; 165 + 166 + enum max77705_led_reg { 167 + MAX77705_RGBLED_REG_BASE = 0x30, 168 + MAX77705_RGBLED_REG_LEDEN = 0, 169 + MAX77705_RGBLED_REG_LED0BRT, 170 + MAX77705_RGBLED_REG_LED1BRT, 171 + MAX77705_RGBLED_REG_LED2BRT, 172 + MAX77705_RGBLED_REG_LED3BRT, 173 + MAX77705_RGBLED_REG_LEDRMP, 174 + MAX77705_RGBLED_REG_LEDBLNK, 175 + MAX77705_LED_REG_END 176 + }; 177 + 178 + enum max77705_charger_battery_state { 179 + MAX77705_BATTERY_NOBAT, 180 + MAX77705_BATTERY_PREQUALIFICATION, 181 + MAX77705_BATTERY_DEAD, 182 + MAX77705_BATTERY_GOOD, 183 + MAX77705_BATTERY_LOWVOLTAGE, 184 + MAX77705_BATTERY_OVERVOLTAGE, 185 + MAX77705_BATTERY_RESERVED 186 + }; 187 + 188 + enum max77705_charger_charge_type { 189 + MAX77705_CHARGER_CONSTANT_CURRENT = 1, 190 + MAX77705_CHARGER_CONSTANT_VOLTAGE, 191 + MAX77705_CHARGER_END_OF_CHARGE, 192 + MAX77705_CHARGER_DONE 193 + }; 194 + 195 + #endif /* __LINUX_MFD_MAX77705_PRIV_H */
-1
include/linux/mfd/max8997-private.h
··· 397 397 }; 398 398 399 399 extern int max8997_irq_init(struct max8997_dev *max8997); 400 - extern void max8997_irq_exit(struct max8997_dev *max8997); 401 400 extern int max8997_irq_resume(struct max8997_dev *max8997); 402 401 403 402 extern int max8997_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest);
-69
include/linux/mfd/pcf50633/adc.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* 3 - * adc.h -- Driver for NXP PCF50633 ADC 4 - * 5 - * (C) 2006-2008 by Openmoko, Inc. 6 - * All rights reserved. 7 - */ 8 - 9 - #ifndef __LINUX_MFD_PCF50633_ADC_H 10 - #define __LINUX_MFD_PCF50633_ADC_H 11 - 12 - #include <linux/mfd/pcf50633/core.h> 13 - #include <linux/platform_device.h> 14 - 15 - /* ADC Registers */ 16 - #define PCF50633_REG_ADCC3 0x52 17 - #define PCF50633_REG_ADCC2 0x53 18 - #define PCF50633_REG_ADCC1 0x54 19 - #define PCF50633_REG_ADCS1 0x55 20 - #define PCF50633_REG_ADCS2 0x56 21 - #define PCF50633_REG_ADCS3 0x57 22 - 23 - #define PCF50633_ADCC1_ADCSTART 0x01 24 - #define PCF50633_ADCC1_RES_8BIT 0x02 25 - #define PCF50633_ADCC1_RES_10BIT 0x00 26 - #define PCF50633_ADCC1_AVERAGE_NO 0x00 27 - #define PCF50633_ADCC1_AVERAGE_4 0x04 28 - #define PCF50633_ADCC1_AVERAGE_8 0x08 29 - #define PCF50633_ADCC1_AVERAGE_16 0x0c 30 - #define PCF50633_ADCC1_MUX_BATSNS_RES 0x00 31 - #define PCF50633_ADCC1_MUX_BATSNS_SUBTR 0x10 32 - #define PCF50633_ADCC1_MUX_ADCIN2_RES 0x20 33 - #define PCF50633_ADCC1_MUX_ADCIN2_SUBTR 0x30 34 - #define PCF50633_ADCC1_MUX_BATTEMP 0x60 35 - #define PCF50633_ADCC1_MUX_ADCIN1 0x70 36 - #define PCF50633_ADCC1_AVERAGE_MASK 0x0c 37 - #define PCF50633_ADCC1_ADCMUX_MASK 0xf0 38 - 39 - #define PCF50633_ADCC2_RATIO_NONE 0x00 40 - #define PCF50633_ADCC2_RATIO_BATTEMP 0x01 41 - #define PCF50633_ADCC2_RATIO_ADCIN1 0x02 42 - #define PCF50633_ADCC2_RATIO_BOTH 0x03 43 - #define PCF50633_ADCC2_RATIOSETTL_100US 0x04 44 - 45 - #define PCF50633_ADCC3_ACCSW_EN 0x01 46 - #define PCF50633_ADCC3_NTCSW_EN 0x04 47 - #define PCF50633_ADCC3_RES_DIV_TWO 0x10 48 - #define PCF50633_ADCC3_RES_DIV_THREE 0x00 49 - 50 - #define PCF50633_ADCS3_REF_NTCSW 0x00 51 - #define PCF50633_ADCS3_REF_ACCSW 0x10 52 - #define PCF50633_ADCS3_REF_2V0 0x20 53 - #define PCF50633_ADCS3_REF_VISA 0x30 54 - #define PCF50633_ADCS3_REF_2V0_2 0x70 55 - #define PCF50633_ADCS3_ADCRDY 0x80 56 - 57 - #define PCF50633_ADCS3_ADCDAT1L_MASK 0x03 58 - #define PCF50633_ADCS3_ADCDAT2L_MASK 0x0c 59 - #define PCF50633_ADCS3_ADCDAT2L_SHIFT 2 60 - #define PCF50633_ASCS3_REF_MASK 0x70 61 - 62 - extern int 63 - pcf50633_adc_async_read(struct pcf50633 *pcf, int mux, int avg, 64 - void (*callback)(struct pcf50633 *, void *, int), 65 - void *callback_param); 66 - extern int 67 - pcf50633_adc_sync_read(struct pcf50633 *pcf, int mux, int avg); 68 - 69 - #endif /* __LINUX_PCF50633_ADC_H */
-48
include/linux/mfd/pcf50633/gpio.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* 3 - * gpio.h -- GPIO driver for NXP PCF50633 4 - * 5 - * (C) 2006-2008 by Openmoko, Inc. 6 - * All rights reserved. 7 - */ 8 - 9 - #ifndef __LINUX_MFD_PCF50633_GPIO_H 10 - #define __LINUX_MFD_PCF50633_GPIO_H 11 - 12 - #include <linux/mfd/pcf50633/core.h> 13 - 14 - #define PCF50633_GPIO1 1 15 - #define PCF50633_GPIO2 2 16 - #define PCF50633_GPIO3 3 17 - #define PCF50633_GPO 4 18 - 19 - #define PCF50633_REG_GPIO1CFG 0x14 20 - #define PCF50633_REG_GPIO2CFG 0x15 21 - #define PCF50633_REG_GPIO3CFG 0x16 22 - #define PCF50633_REG_GPOCFG 0x17 23 - 24 - #define PCF50633_GPOCFG_GPOSEL_MASK 0x07 25 - 26 - enum pcf50633_reg_gpocfg { 27 - PCF50633_GPOCFG_GPOSEL_0 = 0x00, 28 - PCF50633_GPOCFG_GPOSEL_LED_NFET = 0x01, 29 - PCF50633_GPOCFG_GPOSEL_SYSxOK = 0x02, 30 - PCF50633_GPOCFG_GPOSEL_CLK32K = 0x03, 31 - PCF50633_GPOCFG_GPOSEL_ADAPUSB = 0x04, 32 - PCF50633_GPOCFG_GPOSEL_USBxOK = 0x05, 33 - PCF50633_GPOCFG_GPOSEL_ACTPH4 = 0x06, 34 - PCF50633_GPOCFG_GPOSEL_1 = 0x07, 35 - PCF50633_GPOCFG_GPOSEL_INVERSE = 0x08, 36 - }; 37 - 38 - int pcf50633_gpio_set(struct pcf50633 *pcf, int gpio, u8 val); 39 - u8 pcf50633_gpio_get(struct pcf50633 *pcf, int gpio); 40 - 41 - int pcf50633_gpio_invert_set(struct pcf50633 *, int gpio, int invert); 42 - int pcf50633_gpio_invert_get(struct pcf50633 *pcf, int gpio); 43 - 44 - int pcf50633_gpio_power_supply_set(struct pcf50633 *, 45 - int gpio, int regulator, int on); 46 - #endif /* __LINUX_MFD_PCF50633_GPIO_H */ 47 - 48 -
-130
include/linux/mfd/pcf50633/mbc.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* 3 - * mbc.h -- Driver for NXP PCF50633 Main Battery Charger 4 - * 5 - * (C) 2006-2008 by Openmoko, Inc. 6 - * All rights reserved. 7 - */ 8 - 9 - #ifndef __LINUX_MFD_PCF50633_MBC_H 10 - #define __LINUX_MFD_PCF50633_MBC_H 11 - 12 - #include <linux/mfd/pcf50633/core.h> 13 - #include <linux/platform_device.h> 14 - 15 - #define PCF50633_REG_MBCC1 0x43 16 - #define PCF50633_REG_MBCC2 0x44 17 - #define PCF50633_REG_MBCC3 0x45 18 - #define PCF50633_REG_MBCC4 0x46 19 - #define PCF50633_REG_MBCC5 0x47 20 - #define PCF50633_REG_MBCC6 0x48 21 - #define PCF50633_REG_MBCC7 0x49 22 - #define PCF50633_REG_MBCC8 0x4a 23 - #define PCF50633_REG_MBCS1 0x4b 24 - #define PCF50633_REG_MBCS2 0x4c 25 - #define PCF50633_REG_MBCS3 0x4d 26 - 27 - enum pcf50633_reg_mbcc1 { 28 - PCF50633_MBCC1_CHGENA = 0x01, /* Charger enable */ 29 - PCF50633_MBCC1_AUTOSTOP = 0x02, 30 - PCF50633_MBCC1_AUTORES = 0x04, /* automatic resume */ 31 - PCF50633_MBCC1_RESUME = 0x08, /* explicit resume cmd */ 32 - PCF50633_MBCC1_RESTART = 0x10, /* restart charging */ 33 - PCF50633_MBCC1_PREWDTIME_60M = 0x20, /* max. precharging time */ 34 - PCF50633_MBCC1_WDTIME_1H = 0x00, 35 - PCF50633_MBCC1_WDTIME_2H = 0x40, 36 - PCF50633_MBCC1_WDTIME_4H = 0x80, 37 - PCF50633_MBCC1_WDTIME_6H = 0xc0, 38 - }; 39 - #define PCF50633_MBCC1_WDTIME_MASK 0xc0 40 - 41 - enum pcf50633_reg_mbcc2 { 42 - PCF50633_MBCC2_VBATCOND_2V7 = 0x00, 43 - PCF50633_MBCC2_VBATCOND_2V85 = 0x01, 44 - PCF50633_MBCC2_VBATCOND_3V0 = 0x02, 45 - PCF50633_MBCC2_VBATCOND_3V15 = 0x03, 46 - PCF50633_MBCC2_VMAX_4V = 0x00, 47 - PCF50633_MBCC2_VMAX_4V20 = 0x28, 48 - PCF50633_MBCC2_VRESDEBTIME_64S = 0x80, /* debounce time (32/64sec) */ 49 - }; 50 - 51 - enum pcf50633_reg_mbcc7 { 52 - PCF50633_MBCC7_USB_100mA = 0x00, 53 - PCF50633_MBCC7_USB_500mA = 0x01, 54 - PCF50633_MBCC7_USB_1000mA = 0x02, 55 - PCF50633_MBCC7_USB_SUSPEND = 0x03, 56 - PCF50633_MBCC7_BATTEMP_EN = 0x04, 57 - PCF50633_MBCC7_BATSYSIMAX_1A6 = 0x00, 58 - PCF50633_MBCC7_BATSYSIMAX_1A8 = 0x40, 59 - PCF50633_MBCC7_BATSYSIMAX_2A0 = 0x80, 60 - PCF50633_MBCC7_BATSYSIMAX_2A2 = 0xc0, 61 - }; 62 - #define PCF50633_MBCC7_USB_MASK 0x03 63 - 64 - enum pcf50633_reg_mbcc8 { 65 - PCF50633_MBCC8_USBENASUS = 0x10, 66 - }; 67 - 68 - enum pcf50633_reg_mbcs1 { 69 - PCF50633_MBCS1_USBPRES = 0x01, 70 - PCF50633_MBCS1_USBOK = 0x02, 71 - PCF50633_MBCS1_ADAPTPRES = 0x04, 72 - PCF50633_MBCS1_ADAPTOK = 0x08, 73 - PCF50633_MBCS1_TBAT_OK = 0x00, 74 - PCF50633_MBCS1_TBAT_ABOVE = 0x10, 75 - PCF50633_MBCS1_TBAT_BELOW = 0x20, 76 - PCF50633_MBCS1_TBAT_UNDEF = 0x30, 77 - PCF50633_MBCS1_PREWDTEXP = 0x40, 78 - PCF50633_MBCS1_WDTEXP = 0x80, 79 - }; 80 - 81 - enum pcf50633_reg_mbcs2_mbcmod { 82 - PCF50633_MBCS2_MBC_PLAY = 0x00, 83 - PCF50633_MBCS2_MBC_USB_PRE = 0x01, 84 - PCF50633_MBCS2_MBC_USB_PRE_WAIT = 0x02, 85 - PCF50633_MBCS2_MBC_USB_FAST = 0x03, 86 - PCF50633_MBCS2_MBC_USB_FAST_WAIT = 0x04, 87 - PCF50633_MBCS2_MBC_USB_SUSPEND = 0x05, 88 - PCF50633_MBCS2_MBC_ADP_PRE = 0x06, 89 - PCF50633_MBCS2_MBC_ADP_PRE_WAIT = 0x07, 90 - PCF50633_MBCS2_MBC_ADP_FAST = 0x08, 91 - PCF50633_MBCS2_MBC_ADP_FAST_WAIT = 0x09, 92 - PCF50633_MBCS2_MBC_BAT_FULL = 0x0a, 93 - PCF50633_MBCS2_MBC_HALT = 0x0b, 94 - }; 95 - #define PCF50633_MBCS2_MBC_MASK 0x0f 96 - enum pcf50633_reg_mbcs2_chgstat { 97 - PCF50633_MBCS2_CHGS_NONE = 0x00, 98 - PCF50633_MBCS2_CHGS_ADAPTER = 0x10, 99 - PCF50633_MBCS2_CHGS_USB = 0x20, 100 - PCF50633_MBCS2_CHGS_BOTH = 0x30, 101 - }; 102 - #define PCF50633_MBCS2_RESSTAT_AUTO 0x40 103 - 104 - enum pcf50633_reg_mbcs3 { 105 - PCF50633_MBCS3_USBLIM_PLAY = 0x01, 106 - PCF50633_MBCS3_USBLIM_CGH = 0x02, 107 - PCF50633_MBCS3_TLIM_PLAY = 0x04, 108 - PCF50633_MBCS3_TLIM_CHG = 0x08, 109 - PCF50633_MBCS3_ILIM = 0x10, /* 1: Ibat > Icutoff */ 110 - PCF50633_MBCS3_VLIM = 0x20, /* 1: Vbat == Vmax */ 111 - PCF50633_MBCS3_VBATSTAT = 0x40, /* 1: Vbat > Vbatcond */ 112 - PCF50633_MBCS3_VRES = 0x80, /* 1: Vbat > Vth(RES) */ 113 - }; 114 - 115 - #define PCF50633_MBCC2_VBATCOND_MASK 0x03 116 - #define PCF50633_MBCC2_VMAX_MASK 0x3c 117 - 118 - /* Charger status */ 119 - #define PCF50633_MBC_USB_ONLINE 0x01 120 - #define PCF50633_MBC_USB_ACTIVE 0x02 121 - #define PCF50633_MBC_ADAPTER_ONLINE 0x04 122 - #define PCF50633_MBC_ADAPTER_ACTIVE 0x08 123 - 124 - int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma); 125 - 126 - int pcf50633_mbc_get_status(struct pcf50633 *); 127 - int pcf50633_mbc_get_usb_online_status(struct pcf50633 *); 128 - 129 - #endif 130 -
-68
include/linux/mfd/pcf50633/pmic.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 */ 2 - #ifndef __LINUX_MFD_PCF50633_PMIC_H 3 - #define __LINUX_MFD_PCF50633_PMIC_H 4 - 5 - #include <linux/mfd/pcf50633/core.h> 6 - #include <linux/platform_device.h> 7 - 8 - #define PCF50633_REG_AUTOOUT 0x1a 9 - #define PCF50633_REG_AUTOENA 0x1b 10 - #define PCF50633_REG_AUTOCTL 0x1c 11 - #define PCF50633_REG_AUTOMXC 0x1d 12 - #define PCF50633_REG_DOWN1OUT 0x1e 13 - #define PCF50633_REG_DOWN1ENA 0x1f 14 - #define PCF50633_REG_DOWN1CTL 0x20 15 - #define PCF50633_REG_DOWN1MXC 0x21 16 - #define PCF50633_REG_DOWN2OUT 0x22 17 - #define PCF50633_REG_DOWN2ENA 0x23 18 - #define PCF50633_REG_DOWN2CTL 0x24 19 - #define PCF50633_REG_DOWN2MXC 0x25 20 - #define PCF50633_REG_MEMLDOOUT 0x26 21 - #define PCF50633_REG_MEMLDOENA 0x27 22 - #define PCF50633_REG_LDO1OUT 0x2d 23 - #define PCF50633_REG_LDO1ENA 0x2e 24 - #define PCF50633_REG_LDO2OUT 0x2f 25 - #define PCF50633_REG_LDO2ENA 0x30 26 - #define PCF50633_REG_LDO3OUT 0x31 27 - #define PCF50633_REG_LDO3ENA 0x32 28 - #define PCF50633_REG_LDO4OUT 0x33 29 - #define PCF50633_REG_LDO4ENA 0x34 30 - #define PCF50633_REG_LDO5OUT 0x35 31 - #define PCF50633_REG_LDO5ENA 0x36 32 - #define PCF50633_REG_LDO6OUT 0x37 33 - #define PCF50633_REG_LDO6ENA 0x38 34 - #define PCF50633_REG_HCLDOOUT 0x39 35 - #define PCF50633_REG_HCLDOENA 0x3a 36 - #define PCF50633_REG_HCLDOOVL 0x40 37 - 38 - enum pcf50633_regulator_enable { 39 - PCF50633_REGULATOR_ON = 0x01, 40 - PCF50633_REGULATOR_ON_GPIO1 = 0x02, 41 - PCF50633_REGULATOR_ON_GPIO2 = 0x04, 42 - PCF50633_REGULATOR_ON_GPIO3 = 0x08, 43 - }; 44 - #define PCF50633_REGULATOR_ON_MASK 0x0f 45 - 46 - enum pcf50633_regulator_phase { 47 - PCF50633_REGULATOR_ACTPH1 = 0x00, 48 - PCF50633_REGULATOR_ACTPH2 = 0x10, 49 - PCF50633_REGULATOR_ACTPH3 = 0x20, 50 - PCF50633_REGULATOR_ACTPH4 = 0x30, 51 - }; 52 - #define PCF50633_REGULATOR_ACTPH_MASK 0x30 53 - 54 - enum pcf50633_regulator_id { 55 - PCF50633_REGULATOR_AUTO, 56 - PCF50633_REGULATOR_DOWN1, 57 - PCF50633_REGULATOR_DOWN2, 58 - PCF50633_REGULATOR_LDO1, 59 - PCF50633_REGULATOR_LDO2, 60 - PCF50633_REGULATOR_LDO3, 61 - PCF50633_REGULATOR_LDO4, 62 - PCF50633_REGULATOR_LDO5, 63 - PCF50633_REGULATOR_LDO6, 64 - PCF50633_REGULATOR_HCLDO, 65 - PCF50633_REGULATOR_MEMLDO, 66 - }; 67 - #endif 68 -
+1
include/linux/mfd/samsung/core.h
··· 44 44 S2MPS14X, 45 45 S2MPS15X, 46 46 S2MPU02, 47 + S2MPU05, 47 48 }; 48 49 49 50 /**
+44
include/linux/mfd/samsung/irq.h
··· 150 150 /* Masks for interrupts are the same as in s2mps11 */ 151 151 #define S2MPS14_IRQ_TSD_MASK (1 << 2) 152 152 153 + enum s2mpu05_irq { 154 + S2MPU05_IRQ_PWRONF, 155 + S2MPU05_IRQ_PWRONR, 156 + S2MPU05_IRQ_JIGONBF, 157 + S2MPU05_IRQ_JIGONBR, 158 + S2MPU05_IRQ_ACOKF, 159 + S2MPU05_IRQ_ACOKR, 160 + S2MPU05_IRQ_PWRON1S, 161 + S2MPU05_IRQ_MRB, 162 + 163 + S2MPU05_IRQ_RTC60S, 164 + S2MPU05_IRQ_RTCA1, 165 + S2MPU05_IRQ_RTCA0, 166 + S2MPU05_IRQ_SMPL, 167 + S2MPU05_IRQ_RTC1S, 168 + S2MPU05_IRQ_WTSR, 169 + 170 + S2MPU05_IRQ_INT120C, 171 + S2MPU05_IRQ_INT140C, 172 + S2MPU05_IRQ_TSD, 173 + 174 + S2MPU05_IRQ_NR, 175 + }; 176 + 177 + #define S2MPU05_IRQ_PWRONF_MASK BIT(0) 178 + #define S2MPU05_IRQ_PWRONR_MASK BIT(1) 179 + #define S2MPU05_IRQ_JIGONBF_MASK BIT(2) 180 + #define S2MPU05_IRQ_JIGONBR_MASK BIT(3) 181 + #define S2MPU05_IRQ_ACOKF_MASK BIT(4) 182 + #define S2MPU05_IRQ_ACOKR_MASK BIT(5) 183 + #define S2MPU05_IRQ_PWRON1S_MASK BIT(6) 184 + #define S2MPU05_IRQ_MRB_MASK BIT(7) 185 + 186 + #define S2MPU05_IRQ_RTC60S_MASK BIT(0) 187 + #define S2MPU05_IRQ_RTCA1_MASK BIT(1) 188 + #define S2MPU05_IRQ_RTCA0_MASK BIT(2) 189 + #define S2MPU05_IRQ_SMPL_MASK BIT(3) 190 + #define S2MPU05_IRQ_RTC1S_MASK BIT(4) 191 + #define S2MPU05_IRQ_WTSR_MASK BIT(5) 192 + 193 + #define S2MPU05_IRQ_INT120C_MASK BIT(0) 194 + #define S2MPU05_IRQ_INT140C_MASK BIT(1) 195 + #define S2MPU05_IRQ_TSD_MASK BIT(2) 196 + 153 197 enum s5m8767_irq { 154 198 S5M8767_IRQ_PWRR, 155 199 S5M8767_IRQ_PWRF,
+183
include/linux/mfd/samsung/s2mpu05.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * Copyright (c) 2015 Samsung Electronics Co., Ltd 4 + * Copyright (c) 2025 Kaustabh Chakraborty <kauschluss@disroot.org> 5 + */ 6 + 7 + #ifndef __LINUX_MFD_S2MPU05_H 8 + #define __LINUX_MFD_S2MPU05_H 9 + 10 + /* S2MPU05 registers */ 11 + enum S2MPU05_reg { 12 + S2MPU05_REG_ID, 13 + S2MPU05_REG_INT1, 14 + S2MPU05_REG_INT2, 15 + S2MPU05_REG_INT3, 16 + S2MPU05_REG_INT1M, 17 + S2MPU05_REG_INT2M, 18 + S2MPU05_REG_INT3M, 19 + S2MPU05_REG_ST1, 20 + S2MPU05_REG_ST2, 21 + S2MPU05_REG_PWRONSRC, 22 + S2MPU05_REG_OFFSRC, 23 + S2MPU05_REG_BU_CHG, 24 + S2MPU05_REG_RTC_BUF, 25 + S2MPU05_REG_CTRL1, 26 + S2MPU05_REG_CTRL2, 27 + S2MPU05_REG_ETC_TEST, 28 + S2MPU05_REG_OTP_ADRL, 29 + S2MPU05_REG_OTP_ADRH, 30 + S2MPU05_REG_OTP_DATA, 31 + S2MPU05_REG_MON1SEL, 32 + S2MPU05_REG_MON2SEL, 33 + S2MPU05_REG_CTRL3, 34 + S2MPU05_REG_ETC_OTP, 35 + S2MPU05_REG_UVLO, 36 + S2MPU05_REG_TIME_CTRL1, 37 + S2MPU05_REG_TIME_CTRL2, 38 + S2MPU05_REG_B1CTRL1, 39 + S2MPU05_REG_B1CTRL2, 40 + S2MPU05_REG_B2CTRL1, 41 + S2MPU05_REG_B2CTRL2, 42 + S2MPU05_REG_B2CTRL3, 43 + S2MPU05_REG_B2CTRL4, 44 + S2MPU05_REG_B3CTRL1, 45 + S2MPU05_REG_B3CTRL2, 46 + S2MPU05_REG_B3CTRL3, 47 + S2MPU05_REG_B4CTRL1, 48 + S2MPU05_REG_B4CTRL2, 49 + S2MPU05_REG_B5CTRL1, 50 + S2MPU05_REG_B5CTRL2, 51 + S2MPU05_REG_BUCK_RAMP, 52 + S2MPU05_REG_LDO_DVS1, 53 + S2MPU05_REG_LDO_DVS9, 54 + S2MPU05_REG_LDO_DVS10, 55 + S2MPU05_REG_L1CTRL, 56 + S2MPU05_REG_L2CTRL, 57 + S2MPU05_REG_L3CTRL, 58 + S2MPU05_REG_L4CTRL, 59 + S2MPU05_REG_L5CTRL, 60 + S2MPU05_REG_L6CTRL, 61 + S2MPU05_REG_L7CTRL, 62 + S2MPU05_REG_L8CTRL, 63 + S2MPU05_REG_L9CTRL1, 64 + S2MPU05_REG_L9CTRL2, 65 + S2MPU05_REG_L10CTRL, 66 + S2MPU05_REG_L11CTRL1, 67 + S2MPU05_REG_L11CTRL2, 68 + S2MPU05_REG_L12CTRL, 69 + S2MPU05_REG_L13CTRL, 70 + S2MPU05_REG_L14CTRL, 71 + S2MPU05_REG_L15CTRL, 72 + S2MPU05_REG_L16CTRL, 73 + S2MPU05_REG_L17CTRL1, 74 + S2MPU05_REG_L17CTRL2, 75 + S2MPU05_REG_L18CTRL1, 76 + S2MPU05_REG_L18CTRL2, 77 + S2MPU05_REG_L19CTRL, 78 + S2MPU05_REG_L20CTRL, 79 + S2MPU05_REG_L21CTRL, 80 + S2MPU05_REG_L22CTRL, 81 + S2MPU05_REG_L23CTRL, 82 + S2MPU05_REG_L24CTRL, 83 + S2MPU05_REG_L25CTRL, 84 + S2MPU05_REG_L26CTRL, 85 + S2MPU05_REG_L27CTRL, 86 + S2MPU05_REG_L28CTRL, 87 + S2MPU05_REG_L29CTRL, 88 + S2MPU05_REG_L30CTRL, 89 + S2MPU05_REG_L31CTRL, 90 + S2MPU05_REG_L32CTRL, 91 + S2MPU05_REG_L33CTRL, 92 + S2MPU05_REG_L34CTRL, 93 + S2MPU05_REG_L35CTRL, 94 + S2MPU05_REG_LDO_DSCH1, 95 + S2MPU05_REG_LDO_DSCH2, 96 + S2MPU05_REG_LDO_DSCH3, 97 + S2MPU05_REG_LDO_DSCH4, 98 + S2MPU05_REG_LDO_DSCH5, 99 + S2MPU05_REG_LDO_CTRL1, 100 + S2MPU05_REG_LDO_CTRL2, 101 + S2MPU05_REG_TCXO_CTRL, 102 + S2MPU05_REG_SELMIF, 103 + }; 104 + 105 + /* S2MPU05 regulator ids */ 106 + enum S2MPU05_regulators { 107 + S2MPU05_LDO1, 108 + S2MPU05_LDO2, 109 + S2MPU05_LDO3, 110 + S2MPU05_LDO4, 111 + S2MPU05_LDO5, 112 + S2MPU05_LDO6, 113 + S2MPU05_LDO7, 114 + S2MPU05_LDO8, 115 + S2MPU05_LDO9, 116 + S2MPU05_LDO10, 117 + S2MPU05_LDO11, 118 + S2MPU05_LDO12, 119 + S2MPU05_LDO13, 120 + S2MPU05_LDO14, 121 + S2MPU05_LDO15, 122 + S2MPU05_LDO16, 123 + S2MPU05_LDO17, 124 + S2MPU05_LDO18, 125 + S2MPU05_LDO19, 126 + S2MPU05_LDO20, 127 + S2MPU05_LDO21, 128 + S2MPU05_LDO22, 129 + S2MPU05_LDO23, 130 + S2MPU05_LDO24, 131 + S2MPU05_LDO25, 132 + S2MPU05_LDO26, 133 + S2MPU05_LDO27, 134 + S2MPU05_LDO28, 135 + S2MPU05_LDO29, 136 + S2MPU05_LDO30, 137 + S2MPU05_LDO31, 138 + S2MPU05_LDO32, 139 + S2MPU05_LDO33, 140 + S2MPU05_LDO34, 141 + S2MPU05_LDO35, 142 + S2MPU05_BUCK1, 143 + S2MPU05_BUCK2, 144 + S2MPU05_BUCK3, 145 + S2MPU05_BUCK4, 146 + S2MPU05_BUCK5, 147 + 148 + S2MPU05_REGULATOR_MAX, 149 + }; 150 + 151 + #define S2MPU05_SW_ENABLE_MASK 0x03 152 + 153 + #define S2MPU05_ENABLE_TIME_LDO 128 154 + #define S2MPU05_ENABLE_TIME_BUCK1 110 155 + #define S2MPU05_ENABLE_TIME_BUCK2 110 156 + #define S2MPU05_ENABLE_TIME_BUCK3 110 157 + #define S2MPU05_ENABLE_TIME_BUCK4 150 158 + #define S2MPU05_ENABLE_TIME_BUCK5 150 159 + 160 + #define S2MPU05_LDO_MIN1 800000 161 + #define S2MPU05_LDO_MIN2 1800000 162 + #define S2MPU05_LDO_MIN3 400000 163 + #define S2MPU05_LDO_STEP1 12500 164 + #define S2MPU05_LDO_STEP2 25000 165 + 166 + #define S2MPU05_BUCK_MIN1 400000 167 + #define S2MPU05_BUCK_MIN2 600000 168 + #define S2MPU05_BUCK_STEP1 6250 169 + #define S2MPU05_BUCK_STEP2 12500 170 + 171 + #define S2MPU05_RAMP_DELAY 12000 /* uV/uS */ 172 + 173 + #define S2MPU05_ENABLE_SHIFT 6 174 + #define S2MPU05_ENABLE_MASK (0x03 << S2MPU05_ENABLE_SHIFT) 175 + 176 + #define S2MPU05_LDO_VSEL_MASK 0x3F 177 + #define S2MPU05_BUCK_VSEL_MASK 0xFF 178 + #define S2MPU05_LDO_N_VOLTAGES (S2MPU05_LDO_VSEL_MASK + 1) 179 + #define S2MPU05_BUCK_N_VOLTAGES (S2MPU05_BUCK_VSEL_MASK + 1) 180 + 181 + #define S2MPU05_PMIC_EN_SHIFT 6 182 + 183 + #endif /* __LINUX_MFD_S2MPU05_H */
-506
include/linux/mfd/sta2x11-mfd.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * Copyright (c) 2009-2011 Wind River Systems, Inc. 4 - * Copyright (c) 2011 ST Microelectronics (Alessandro Rubini) 5 - * 6 - * The STMicroelectronics ConneXt (STA2X11) chip has several unrelated 7 - * functions in one PCI endpoint functions. This driver simply 8 - * registers the platform devices in this iomemregion and exports a few 9 - * functions to access common registers 10 - */ 11 - 12 - #ifndef __STA2X11_MFD_H 13 - #define __STA2X11_MFD_H 14 - #include <linux/types.h> 15 - #include <linux/pci.h> 16 - 17 - enum sta2x11_mfd_plat_dev { 18 - sta2x11_sctl = 0, 19 - sta2x11_gpio, 20 - sta2x11_scr, 21 - sta2x11_time, 22 - sta2x11_apbreg, 23 - sta2x11_apb_soc_regs, 24 - sta2x11_vic, 25 - sta2x11_n_mfd_plat_devs, 26 - }; 27 - 28 - #define STA2X11_MFD_SCTL_NAME "sta2x11-sctl" 29 - #define STA2X11_MFD_GPIO_NAME "sta2x11-gpio" 30 - #define STA2X11_MFD_SCR_NAME "sta2x11-scr" 31 - #define STA2X11_MFD_TIME_NAME "sta2x11-time" 32 - #define STA2X11_MFD_APBREG_NAME "sta2x11-apbreg" 33 - #define STA2X11_MFD_APB_SOC_REGS_NAME "sta2x11-apb-soc-regs" 34 - #define STA2X11_MFD_VIC_NAME "sta2x11-vic" 35 - 36 - extern u32 37 - __sta2x11_mfd_mask(struct pci_dev *, u32, u32, u32, enum sta2x11_mfd_plat_dev); 38 - 39 - /* 40 - * The MFD PCI block includes the GPIO peripherals and other register blocks. 41 - * For GPIO, we have 32*4 bits (I use "gsta" for "gpio sta2x11".) 42 - */ 43 - #define GSTA_GPIO_PER_BLOCK 32 44 - #define GSTA_NR_BLOCKS 4 45 - #define GSTA_NR_GPIO (GSTA_GPIO_PER_BLOCK * GSTA_NR_BLOCKS) 46 - 47 - /* Pinconfig is set by the board definition: altfunc, pull-up, pull-down */ 48 - struct sta2x11_gpio_pdata { 49 - unsigned pinconfig[GSTA_NR_GPIO]; 50 - }; 51 - 52 - /* Macros below lifted from sh_pfc.h, with minor differences */ 53 - #define PINMUX_TYPE_NONE 0 54 - #define PINMUX_TYPE_FUNCTION 1 55 - #define PINMUX_TYPE_OUTPUT_LOW 2 56 - #define PINMUX_TYPE_OUTPUT_HIGH 3 57 - #define PINMUX_TYPE_INPUT 4 58 - #define PINMUX_TYPE_INPUT_PULLUP 5 59 - #define PINMUX_TYPE_INPUT_PULLDOWN 6 60 - 61 - /* Give names to GPIO pins, like PXA does, taken from the manual */ 62 - #define STA2X11_GPIO0 0 63 - #define STA2X11_GPIO1 1 64 - #define STA2X11_GPIO2 2 65 - #define STA2X11_GPIO3 3 66 - #define STA2X11_GPIO4 4 67 - #define STA2X11_GPIO5 5 68 - #define STA2X11_GPIO6 6 69 - #define STA2X11_GPIO7 7 70 - #define STA2X11_GPIO8_RGBOUT_RED7 8 71 - #define STA2X11_GPIO9_RGBOUT_RED6 9 72 - #define STA2X11_GPIO10_RGBOUT_RED5 10 73 - #define STA2X11_GPIO11_RGBOUT_RED4 11 74 - #define STA2X11_GPIO12_RGBOUT_RED3 12 75 - #define STA2X11_GPIO13_RGBOUT_RED2 13 76 - #define STA2X11_GPIO14_RGBOUT_RED1 14 77 - #define STA2X11_GPIO15_RGBOUT_RED0 15 78 - #define STA2X11_GPIO16_RGBOUT_GREEN7 16 79 - #define STA2X11_GPIO17_RGBOUT_GREEN6 17 80 - #define STA2X11_GPIO18_RGBOUT_GREEN5 18 81 - #define STA2X11_GPIO19_RGBOUT_GREEN4 19 82 - #define STA2X11_GPIO20_RGBOUT_GREEN3 20 83 - #define STA2X11_GPIO21_RGBOUT_GREEN2 21 84 - #define STA2X11_GPIO22_RGBOUT_GREEN1 22 85 - #define STA2X11_GPIO23_RGBOUT_GREEN0 23 86 - #define STA2X11_GPIO24_RGBOUT_BLUE7 24 87 - #define STA2X11_GPIO25_RGBOUT_BLUE6 25 88 - #define STA2X11_GPIO26_RGBOUT_BLUE5 26 89 - #define STA2X11_GPIO27_RGBOUT_BLUE4 27 90 - #define STA2X11_GPIO28_RGBOUT_BLUE3 28 91 - #define STA2X11_GPIO29_RGBOUT_BLUE2 29 92 - #define STA2X11_GPIO30_RGBOUT_BLUE1 30 93 - #define STA2X11_GPIO31_RGBOUT_BLUE0 31 94 - #define STA2X11_GPIO32_RGBOUT_VSYNCH 32 95 - #define STA2X11_GPIO33_RGBOUT_HSYNCH 33 96 - #define STA2X11_GPIO34_RGBOUT_DEN 34 97 - #define STA2X11_GPIO35_ETH_CRS_DV 35 98 - #define STA2X11_GPIO36_ETH_TXD1 36 99 - #define STA2X11_GPIO37_ETH_TXD0 37 100 - #define STA2X11_GPIO38_ETH_TX_EN 38 101 - #define STA2X11_GPIO39_MDIO 39 102 - #define STA2X11_GPIO40_ETH_REF_CLK 40 103 - #define STA2X11_GPIO41_ETH_RXD1 41 104 - #define STA2X11_GPIO42_ETH_RXD0 42 105 - #define STA2X11_GPIO43_MDC 43 106 - #define STA2X11_GPIO44_CAN_TX 44 107 - #define STA2X11_GPIO45_CAN_RX 45 108 - #define STA2X11_GPIO46_MLB_DAT 46 109 - #define STA2X11_GPIO47_MLB_SIG 47 110 - #define STA2X11_GPIO48_SPI0_CLK 48 111 - #define STA2X11_GPIO49_SPI0_TXD 49 112 - #define STA2X11_GPIO50_SPI0_RXD 50 113 - #define STA2X11_GPIO51_SPI0_FRM 51 114 - #define STA2X11_GPIO52_SPI1_CLK 52 115 - #define STA2X11_GPIO53_SPI1_TXD 53 116 - #define STA2X11_GPIO54_SPI1_RXD 54 117 - #define STA2X11_GPIO55_SPI1_FRM 55 118 - #define STA2X11_GPIO56_SPI2_CLK 56 119 - #define STA2X11_GPIO57_SPI2_TXD 57 120 - #define STA2X11_GPIO58_SPI2_RXD 58 121 - #define STA2X11_GPIO59_SPI2_FRM 59 122 - #define STA2X11_GPIO60_I2C0_SCL 60 123 - #define STA2X11_GPIO61_I2C0_SDA 61 124 - #define STA2X11_GPIO62_I2C1_SCL 62 125 - #define STA2X11_GPIO63_I2C1_SDA 63 126 - #define STA2X11_GPIO64_I2C2_SCL 64 127 - #define STA2X11_GPIO65_I2C2_SDA 65 128 - #define STA2X11_GPIO66_I2C3_SCL 66 129 - #define STA2X11_GPIO67_I2C3_SDA 67 130 - #define STA2X11_GPIO68_MSP0_RCK 68 131 - #define STA2X11_GPIO69_MSP0_RXD 69 132 - #define STA2X11_GPIO70_MSP0_RFS 70 133 - #define STA2X11_GPIO71_MSP0_TCK 71 134 - #define STA2X11_GPIO72_MSP0_TXD 72 135 - #define STA2X11_GPIO73_MSP0_TFS 73 136 - #define STA2X11_GPIO74_MSP0_SCK 74 137 - #define STA2X11_GPIO75_MSP1_CK 75 138 - #define STA2X11_GPIO76_MSP1_RXD 76 139 - #define STA2X11_GPIO77_MSP1_FS 77 140 - #define STA2X11_GPIO78_MSP1_TXD 78 141 - #define STA2X11_GPIO79_MSP2_CK 79 142 - #define STA2X11_GPIO80_MSP2_RXD 80 143 - #define STA2X11_GPIO81_MSP2_FS 81 144 - #define STA2X11_GPIO82_MSP2_TXD 82 145 - #define STA2X11_GPIO83_MSP3_CK 83 146 - #define STA2X11_GPIO84_MSP3_RXD 84 147 - #define STA2X11_GPIO85_MSP3_FS 85 148 - #define STA2X11_GPIO86_MSP3_TXD 86 149 - #define STA2X11_GPIO87_MSP4_CK 87 150 - #define STA2X11_GPIO88_MSP4_RXD 88 151 - #define STA2X11_GPIO89_MSP4_FS 89 152 - #define STA2X11_GPIO90_MSP4_TXD 90 153 - #define STA2X11_GPIO91_MSP5_CK 91 154 - #define STA2X11_GPIO92_MSP5_RXD 92 155 - #define STA2X11_GPIO93_MSP5_FS 93 156 - #define STA2X11_GPIO94_MSP5_TXD 94 157 - #define STA2X11_GPIO95_SDIO3_DAT3 95 158 - #define STA2X11_GPIO96_SDIO3_DAT2 96 159 - #define STA2X11_GPIO97_SDIO3_DAT1 97 160 - #define STA2X11_GPIO98_SDIO3_DAT0 98 161 - #define STA2X11_GPIO99_SDIO3_CLK 99 162 - #define STA2X11_GPIO100_SDIO3_CMD 100 163 - #define STA2X11_GPIO101 101 164 - #define STA2X11_GPIO102 102 165 - #define STA2X11_GPIO103 103 166 - #define STA2X11_GPIO104 104 167 - #define STA2X11_GPIO105_SDIO2_DAT3 105 168 - #define STA2X11_GPIO106_SDIO2_DAT2 106 169 - #define STA2X11_GPIO107_SDIO2_DAT1 107 170 - #define STA2X11_GPIO108_SDIO2_DAT0 108 171 - #define STA2X11_GPIO109_SDIO2_CLK 109 172 - #define STA2X11_GPIO110_SDIO2_CMD 110 173 - #define STA2X11_GPIO111 111 174 - #define STA2X11_GPIO112 112 175 - #define STA2X11_GPIO113 113 176 - #define STA2X11_GPIO114 114 177 - #define STA2X11_GPIO115_SDIO1_DAT3 115 178 - #define STA2X11_GPIO116_SDIO1_DAT2 116 179 - #define STA2X11_GPIO117_SDIO1_DAT1 117 180 - #define STA2X11_GPIO118_SDIO1_DAT0 118 181 - #define STA2X11_GPIO119_SDIO1_CLK 119 182 - #define STA2X11_GPIO120_SDIO1_CMD 120 183 - #define STA2X11_GPIO121 121 184 - #define STA2X11_GPIO122 122 185 - #define STA2X11_GPIO123 123 186 - #define STA2X11_GPIO124 124 187 - #define STA2X11_GPIO125_UART2_TXD 125 188 - #define STA2X11_GPIO126_UART2_RXD 126 189 - #define STA2X11_GPIO127_UART3_TXD 127 190 - 191 - /* 192 - * The APB bridge has its own registers, needed by our users as well. 193 - * They are accessed with the following read/mask/write function. 194 - */ 195 - static inline u32 196 - sta2x11_apbreg_mask(struct pci_dev *pdev, u32 reg, u32 mask, u32 val) 197 - { 198 - return __sta2x11_mfd_mask(pdev, reg, mask, val, sta2x11_apbreg); 199 - } 200 - 201 - /* CAN and MLB */ 202 - #define APBREG_BSR 0x00 /* Bridge Status Reg */ 203 - #define APBREG_PAER 0x08 /* Peripherals Address Error Reg */ 204 - #define APBREG_PWAC 0x20 /* Peripheral Write Access Control reg */ 205 - #define APBREG_PRAC 0x40 /* Peripheral Read Access Control reg */ 206 - #define APBREG_PCG 0x60 /* Peripheral Clock Gating Reg */ 207 - #define APBREG_PUR 0x80 /* Peripheral Under Reset Reg */ 208 - #define APBREG_EMU_PCG 0xA0 /* Emulator Peripheral Clock Gating Reg */ 209 - 210 - #define APBREG_CAN (1 << 1) 211 - #define APBREG_MLB (1 << 3) 212 - 213 - /* SARAC */ 214 - #define APBREG_BSR_SARAC 0x100 /* Bridge Status Reg */ 215 - #define APBREG_PAER_SARAC 0x108 /* Peripherals Address Error Reg */ 216 - #define APBREG_PWAC_SARAC 0x120 /* Peripheral Write Access Control reg */ 217 - #define APBREG_PRAC_SARAC 0x140 /* Peripheral Read Access Control reg */ 218 - #define APBREG_PCG_SARAC 0x160 /* Peripheral Clock Gating Reg */ 219 - #define APBREG_PUR_SARAC 0x180 /* Peripheral Under Reset Reg */ 220 - #define APBREG_EMU_PCG_SARAC 0x1A0 /* Emulator Peripheral Clock Gating Reg */ 221 - 222 - #define APBREG_SARAC (1 << 2) 223 - 224 - /* 225 - * The system controller has its own registers. Some of these are accessed 226 - * by out users as well, using the following read/mask/write/function 227 - */ 228 - static inline 229 - u32 sta2x11_sctl_mask(struct pci_dev *pdev, u32 reg, u32 mask, u32 val) 230 - { 231 - return __sta2x11_mfd_mask(pdev, reg, mask, val, sta2x11_sctl); 232 - } 233 - 234 - #define SCTL_SCCTL 0x00 /* System controller control register */ 235 - #define SCTL_ARMCFG 0x04 /* ARM configuration register */ 236 - #define SCTL_SCPLLCTL 0x08 /* PLL control status register */ 237 - 238 - #define SCTL_SCPLLCTL_AUDIO_PLL_PD BIT(1) 239 - #define SCTL_SCPLLCTL_FRAC_CONTROL BIT(3) 240 - #define SCTL_SCPLLCTL_STRB_BYPASS BIT(6) 241 - #define SCTL_SCPLLCTL_STRB_INPUT BIT(8) 242 - 243 - #define SCTL_SCPLLFCTRL 0x0c /* PLL frequency control register */ 244 - 245 - #define SCTL_SCPLLFCTRL_AUDIO_PLL_NDIV_MASK 0xff 246 - #define SCTL_SCPLLFCTRL_AUDIO_PLL_NDIV_SHIFT 10 247 - #define SCTL_SCPLLFCTRL_AUDIO_PLL_IDF_MASK 7 248 - #define SCTL_SCPLLFCTRL_AUDIO_PLL_IDF_SHIFT 21 249 - #define SCTL_SCPLLFCTRL_AUDIO_PLL_ODF_MASK 7 250 - #define SCTL_SCPLLFCTRL_AUDIO_PLL_ODF_SHIFT 18 251 - #define SCTL_SCPLLFCTRL_DITHER_DISABLE_MASK 0x03 252 - #define SCTL_SCPLLFCTRL_DITHER_DISABLE_SHIFT 4 253 - 254 - 255 - #define SCTL_SCRESFRACT 0x10 /* PLL fractional input register */ 256 - 257 - #define SCTL_SCRESFRACT_MASK 0x0000ffff 258 - 259 - 260 - #define SCTL_SCRESCTRL1 0x14 /* Peripheral reset control 1 */ 261 - #define SCTL_SCRESXTRL2 0x18 /* Peripheral reset control 2 */ 262 - #define SCTL_SCPEREN0 0x1c /* Peripheral clock enable register 0 */ 263 - #define SCTL_SCPEREN1 0x20 /* Peripheral clock enable register 1 */ 264 - #define SCTL_SCPEREN2 0x24 /* Peripheral clock enable register 2 */ 265 - #define SCTL_SCGRST 0x28 /* Peripheral global reset */ 266 - #define SCTL_SCPCIECSBRST 0x2c /* PCIe PAB CSB reset status register */ 267 - #define SCTL_SCPCIPMCR1 0x30 /* PCI power management control 1 */ 268 - #define SCTL_SCPCIPMCR2 0x34 /* PCI power management control 2 */ 269 - #define SCTL_SCPCIPMSR1 0x38 /* PCI power management status 1 */ 270 - #define SCTL_SCPCIPMSR2 0x3c /* PCI power management status 2 */ 271 - #define SCTL_SCPCIPMSR3 0x40 /* PCI power management status 3 */ 272 - #define SCTL_SCINTREN 0x44 /* Interrupt enable */ 273 - #define SCTL_SCRISR 0x48 /* RAW interrupt status */ 274 - #define SCTL_SCCLKSTAT0 0x4c /* Peripheral clocks status 0 */ 275 - #define SCTL_SCCLKSTAT1 0x50 /* Peripheral clocks status 1 */ 276 - #define SCTL_SCCLKSTAT2 0x54 /* Peripheral clocks status 2 */ 277 - #define SCTL_SCRSTSTA 0x58 /* Reset status register */ 278 - 279 - #define SCTL_SCRESCTRL1_USB_PHY_POR (1 << 0) 280 - #define SCTL_SCRESCTRL1_USB_OTG (1 << 1) 281 - #define SCTL_SCRESCTRL1_USB_HRST (1 << 2) 282 - #define SCTL_SCRESCTRL1_USB_PHY_HOST (1 << 3) 283 - #define SCTL_SCRESCTRL1_SATAII (1 << 4) 284 - #define SCTL_SCRESCTRL1_VIP (1 << 5) 285 - #define SCTL_SCRESCTRL1_PER_MMC0 (1 << 6) 286 - #define SCTL_SCRESCTRL1_PER_MMC1 (1 << 7) 287 - #define SCTL_SCRESCTRL1_PER_GPIO0 (1 << 8) 288 - #define SCTL_SCRESCTRL1_PER_GPIO1 (1 << 9) 289 - #define SCTL_SCRESCTRL1_PER_GPIO2 (1 << 10) 290 - #define SCTL_SCRESCTRL1_PER_GPIO3 (1 << 11) 291 - #define SCTL_SCRESCTRL1_PER_MTU0 (1 << 12) 292 - #define SCTL_SCRESCTRL1_KER_SPI0 (1 << 13) 293 - #define SCTL_SCRESCTRL1_KER_SPI1 (1 << 14) 294 - #define SCTL_SCRESCTRL1_KER_SPI2 (1 << 15) 295 - #define SCTL_SCRESCTRL1_KER_MCI0 (1 << 16) 296 - #define SCTL_SCRESCTRL1_KER_MCI1 (1 << 17) 297 - #define SCTL_SCRESCTRL1_PRE_HSI2C0 (1 << 18) 298 - #define SCTL_SCRESCTRL1_PER_HSI2C1 (1 << 19) 299 - #define SCTL_SCRESCTRL1_PER_HSI2C2 (1 << 20) 300 - #define SCTL_SCRESCTRL1_PER_HSI2C3 (1 << 21) 301 - #define SCTL_SCRESCTRL1_PER_MSP0 (1 << 22) 302 - #define SCTL_SCRESCTRL1_PER_MSP1 (1 << 23) 303 - #define SCTL_SCRESCTRL1_PER_MSP2 (1 << 24) 304 - #define SCTL_SCRESCTRL1_PER_MSP3 (1 << 25) 305 - #define SCTL_SCRESCTRL1_PER_MSP4 (1 << 26) 306 - #define SCTL_SCRESCTRL1_PER_MSP5 (1 << 27) 307 - #define SCTL_SCRESCTRL1_PER_MMC (1 << 28) 308 - #define SCTL_SCRESCTRL1_KER_MSP0 (1 << 29) 309 - #define SCTL_SCRESCTRL1_KER_MSP1 (1 << 30) 310 - #define SCTL_SCRESCTRL1_KER_MSP2 (1 << 31) 311 - 312 - #define SCTL_SCPEREN0_UART0 (1 << 0) 313 - #define SCTL_SCPEREN0_UART1 (1 << 1) 314 - #define SCTL_SCPEREN0_UART2 (1 << 2) 315 - #define SCTL_SCPEREN0_UART3 (1 << 3) 316 - #define SCTL_SCPEREN0_MSP0 (1 << 4) 317 - #define SCTL_SCPEREN0_MSP1 (1 << 5) 318 - #define SCTL_SCPEREN0_MSP2 (1 << 6) 319 - #define SCTL_SCPEREN0_MSP3 (1 << 7) 320 - #define SCTL_SCPEREN0_MSP4 (1 << 8) 321 - #define SCTL_SCPEREN0_MSP5 (1 << 9) 322 - #define SCTL_SCPEREN0_SPI0 (1 << 10) 323 - #define SCTL_SCPEREN0_SPI1 (1 << 11) 324 - #define SCTL_SCPEREN0_SPI2 (1 << 12) 325 - #define SCTL_SCPEREN0_I2C0 (1 << 13) 326 - #define SCTL_SCPEREN0_I2C1 (1 << 14) 327 - #define SCTL_SCPEREN0_I2C2 (1 << 15) 328 - #define SCTL_SCPEREN0_I2C3 (1 << 16) 329 - #define SCTL_SCPEREN0_SVDO_LVDS (1 << 17) 330 - #define SCTL_SCPEREN0_USB_HOST (1 << 18) 331 - #define SCTL_SCPEREN0_USB_OTG (1 << 19) 332 - #define SCTL_SCPEREN0_MCI0 (1 << 20) 333 - #define SCTL_SCPEREN0_MCI1 (1 << 21) 334 - #define SCTL_SCPEREN0_MCI2 (1 << 22) 335 - #define SCTL_SCPEREN0_MCI3 (1 << 23) 336 - #define SCTL_SCPEREN0_SATA (1 << 24) 337 - #define SCTL_SCPEREN0_ETHERNET (1 << 25) 338 - #define SCTL_SCPEREN0_VIC (1 << 26) 339 - #define SCTL_SCPEREN0_DMA_AUDIO (1 << 27) 340 - #define SCTL_SCPEREN0_DMA_SOC (1 << 28) 341 - #define SCTL_SCPEREN0_RAM (1 << 29) 342 - #define SCTL_SCPEREN0_VIP (1 << 30) 343 - #define SCTL_SCPEREN0_ARM (1 << 31) 344 - 345 - #define SCTL_SCPEREN1_UART0 (1 << 0) 346 - #define SCTL_SCPEREN1_UART1 (1 << 1) 347 - #define SCTL_SCPEREN1_UART2 (1 << 2) 348 - #define SCTL_SCPEREN1_UART3 (1 << 3) 349 - #define SCTL_SCPEREN1_MSP0 (1 << 4) 350 - #define SCTL_SCPEREN1_MSP1 (1 << 5) 351 - #define SCTL_SCPEREN1_MSP2 (1 << 6) 352 - #define SCTL_SCPEREN1_MSP3 (1 << 7) 353 - #define SCTL_SCPEREN1_MSP4 (1 << 8) 354 - #define SCTL_SCPEREN1_MSP5 (1 << 9) 355 - #define SCTL_SCPEREN1_SPI0 (1 << 10) 356 - #define SCTL_SCPEREN1_SPI1 (1 << 11) 357 - #define SCTL_SCPEREN1_SPI2 (1 << 12) 358 - #define SCTL_SCPEREN1_I2C0 (1 << 13) 359 - #define SCTL_SCPEREN1_I2C1 (1 << 14) 360 - #define SCTL_SCPEREN1_I2C2 (1 << 15) 361 - #define SCTL_SCPEREN1_I2C3 (1 << 16) 362 - #define SCTL_SCPEREN1_USB_PHY (1 << 17) 363 - 364 - /* 365 - * APB-SOC registers 366 - */ 367 - static inline 368 - u32 sta2x11_apb_soc_regs_mask(struct pci_dev *pdev, u32 reg, u32 mask, u32 val) 369 - { 370 - return __sta2x11_mfd_mask(pdev, reg, mask, val, sta2x11_apb_soc_regs); 371 - } 372 - 373 - #define PCIE_EP1_FUNC3_0_INTR_REG 0x000 374 - #define PCIE_EP1_FUNC7_4_INTR_REG 0x004 375 - #define PCIE_EP2_FUNC3_0_INTR_REG 0x008 376 - #define PCIE_EP2_FUNC7_4_INTR_REG 0x00c 377 - #define PCIE_EP3_FUNC3_0_INTR_REG 0x010 378 - #define PCIE_EP3_FUNC7_4_INTR_REG 0x014 379 - #define PCIE_EP4_FUNC3_0_INTR_REG 0x018 380 - #define PCIE_EP4_FUNC7_4_INTR_REG 0x01c 381 - #define PCIE_INTR_ENABLE0_REG 0x020 382 - #define PCIE_INTR_ENABLE1_REG 0x024 383 - #define PCIE_EP1_FUNC_TC_REG 0x028 384 - #define PCIE_EP2_FUNC_TC_REG 0x02c 385 - #define PCIE_EP3_FUNC_TC_REG 0x030 386 - #define PCIE_EP4_FUNC_TC_REG 0x034 387 - #define PCIE_EP1_FUNC_F_REG 0x038 388 - #define PCIE_EP2_FUNC_F_REG 0x03c 389 - #define PCIE_EP3_FUNC_F_REG 0x040 390 - #define PCIE_EP4_FUNC_F_REG 0x044 391 - #define PCIE_PAB_AMBA_SW_RST_REG 0x048 392 - #define PCIE_PM_STATUS_0_PORT_0_4 0x04c 393 - #define PCIE_PM_STATUS_7_0_EP1 0x050 394 - #define PCIE_PM_STATUS_7_0_EP2 0x054 395 - #define PCIE_PM_STATUS_7_0_EP3 0x058 396 - #define PCIE_PM_STATUS_7_0_EP4 0x05c 397 - #define PCIE_DEV_ID_0_EP1_REG 0x060 398 - #define PCIE_CC_REV_ID_0_EP1_REG 0x064 399 - #define PCIE_DEV_ID_1_EP1_REG 0x068 400 - #define PCIE_CC_REV_ID_1_EP1_REG 0x06c 401 - #define PCIE_DEV_ID_2_EP1_REG 0x070 402 - #define PCIE_CC_REV_ID_2_EP1_REG 0x074 403 - #define PCIE_DEV_ID_3_EP1_REG 0x078 404 - #define PCIE_CC_REV_ID_3_EP1_REG 0x07c 405 - #define PCIE_DEV_ID_4_EP1_REG 0x080 406 - #define PCIE_CC_REV_ID_4_EP1_REG 0x084 407 - #define PCIE_DEV_ID_5_EP1_REG 0x088 408 - #define PCIE_CC_REV_ID_5_EP1_REG 0x08c 409 - #define PCIE_DEV_ID_6_EP1_REG 0x090 410 - #define PCIE_CC_REV_ID_6_EP1_REG 0x094 411 - #define PCIE_DEV_ID_7_EP1_REG 0x098 412 - #define PCIE_CC_REV_ID_7_EP1_REG 0x09c 413 - #define PCIE_DEV_ID_0_EP2_REG 0x0a0 414 - #define PCIE_CC_REV_ID_0_EP2_REG 0x0a4 415 - #define PCIE_DEV_ID_1_EP2_REG 0x0a8 416 - #define PCIE_CC_REV_ID_1_EP2_REG 0x0ac 417 - #define PCIE_DEV_ID_2_EP2_REG 0x0b0 418 - #define PCIE_CC_REV_ID_2_EP2_REG 0x0b4 419 - #define PCIE_DEV_ID_3_EP2_REG 0x0b8 420 - #define PCIE_CC_REV_ID_3_EP2_REG 0x0bc 421 - #define PCIE_DEV_ID_4_EP2_REG 0x0c0 422 - #define PCIE_CC_REV_ID_4_EP2_REG 0x0c4 423 - #define PCIE_DEV_ID_5_EP2_REG 0x0c8 424 - #define PCIE_CC_REV_ID_5_EP2_REG 0x0cc 425 - #define PCIE_DEV_ID_6_EP2_REG 0x0d0 426 - #define PCIE_CC_REV_ID_6_EP2_REG 0x0d4 427 - #define PCIE_DEV_ID_7_EP2_REG 0x0d8 428 - #define PCIE_CC_REV_ID_7_EP2_REG 0x0dC 429 - #define PCIE_DEV_ID_0_EP3_REG 0x0e0 430 - #define PCIE_CC_REV_ID_0_EP3_REG 0x0e4 431 - #define PCIE_DEV_ID_1_EP3_REG 0x0e8 432 - #define PCIE_CC_REV_ID_1_EP3_REG 0x0ec 433 - #define PCIE_DEV_ID_2_EP3_REG 0x0f0 434 - #define PCIE_CC_REV_ID_2_EP3_REG 0x0f4 435 - #define PCIE_DEV_ID_3_EP3_REG 0x0f8 436 - #define PCIE_CC_REV_ID_3_EP3_REG 0x0fc 437 - #define PCIE_DEV_ID_4_EP3_REG 0x100 438 - #define PCIE_CC_REV_ID_4_EP3_REG 0x104 439 - #define PCIE_DEV_ID_5_EP3_REG 0x108 440 - #define PCIE_CC_REV_ID_5_EP3_REG 0x10c 441 - #define PCIE_DEV_ID_6_EP3_REG 0x110 442 - #define PCIE_CC_REV_ID_6_EP3_REG 0x114 443 - #define PCIE_DEV_ID_7_EP3_REG 0x118 444 - #define PCIE_CC_REV_ID_7_EP3_REG 0x11c 445 - #define PCIE_DEV_ID_0_EP4_REG 0x120 446 - #define PCIE_CC_REV_ID_0_EP4_REG 0x124 447 - #define PCIE_DEV_ID_1_EP4_REG 0x128 448 - #define PCIE_CC_REV_ID_1_EP4_REG 0x12c 449 - #define PCIE_DEV_ID_2_EP4_REG 0x130 450 - #define PCIE_CC_REV_ID_2_EP4_REG 0x134 451 - #define PCIE_DEV_ID_3_EP4_REG 0x138 452 - #define PCIE_CC_REV_ID_3_EP4_REG 0x13c 453 - #define PCIE_DEV_ID_4_EP4_REG 0x140 454 - #define PCIE_CC_REV_ID_4_EP4_REG 0x144 455 - #define PCIE_DEV_ID_5_EP4_REG 0x148 456 - #define PCIE_CC_REV_ID_5_EP4_REG 0x14c 457 - #define PCIE_DEV_ID_6_EP4_REG 0x150 458 - #define PCIE_CC_REV_ID_6_EP4_REG 0x154 459 - #define PCIE_DEV_ID_7_EP4_REG 0x158 460 - #define PCIE_CC_REV_ID_7_EP4_REG 0x15c 461 - #define PCIE_SUBSYS_VEN_ID_REG 0x160 462 - #define PCIE_COMMON_CLOCK_CONFIG_0_4_0 0x164 463 - #define PCIE_MIPHYP_SSC_EN_REG 0x168 464 - #define PCIE_MIPHYP_ADDR_REG 0x16c 465 - #define PCIE_L1_ASPM_READY_REG 0x170 466 - #define PCIE_EXT_CFG_RDY_REG 0x174 467 - #define PCIE_SoC_INT_ROUTER_STATUS0_REG 0x178 468 - #define PCIE_SoC_INT_ROUTER_STATUS1_REG 0x17c 469 - #define PCIE_SoC_INT_ROUTER_STATUS2_REG 0x180 470 - #define PCIE_SoC_INT_ROUTER_STATUS3_REG 0x184 471 - #define DMA_IP_CTRL_REG 0x324 472 - #define DISP_BRIDGE_PU_PD_CTRL_REG 0x328 473 - #define VIP_PU_PD_CTRL_REG 0x32c 474 - #define USB_MLB_PU_PD_CTRL_REG 0x330 475 - #define SDIO_PU_PD_MISCFUNC_CTRL_REG1 0x334 476 - #define SDIO_PU_PD_MISCFUNC_CTRL_REG2 0x338 477 - #define UART_PU_PD_CTRL_REG 0x33c 478 - #define ARM_Lock 0x340 479 - #define SYS_IO_CHAR_REG1 0x344 480 - #define SYS_IO_CHAR_REG2 0x348 481 - #define SATA_CORE_ID_REG 0x34c 482 - #define SATA_CTRL_REG 0x350 483 - #define I2C_HSFIX_MISC_REG 0x354 484 - #define SPARE2_RESERVED 0x358 485 - #define SPARE3_RESERVED 0x35c 486 - #define MASTER_LOCK_REG 0x368 487 - #define SYSTEM_CONFIG_STATUS_REG 0x36c 488 - #define MSP_CLK_CTRL_REG 0x39c 489 - #define COMPENSATION_REG1 0x3c4 490 - #define COMPENSATION_REG2 0x3c8 491 - #define COMPENSATION_REG3 0x3cc 492 - #define TEST_CTL_REG 0x3d0 493 - 494 - /* 495 - * SECR (OTP) registers 496 - */ 497 - #define STA2X11_SECR_CR 0x00 498 - #define STA2X11_SECR_FVR0 0x10 499 - #define STA2X11_SECR_FVR1 0x14 500 - 501 - extern int sta2x11_mfd_get_regs_data(struct platform_device *pdev, 502 - enum sta2x11_mfd_plat_dev index, 503 - void __iomem **regs, 504 - spinlock_t **lock); 505 - 506 - #endif /* __STA2X11_MFD_H */
+9
include/linux/mfd/stm32-timers.h
··· 33 33 #define TIM_DCR 0x48 /* DMA control register */ 34 34 #define TIM_DMAR 0x4C /* DMA register for transfer */ 35 35 #define TIM_TISEL 0x68 /* Input Selection */ 36 + #define TIM_HWCFGR2 0x3EC /* hardware configuration 2 Reg (MP25) */ 37 + #define TIM_HWCFGR1 0x3F0 /* hardware configuration 1 Reg (MP25) */ 38 + #define TIM_IPIDR 0x3F8 /* IP identification Reg (MP25) */ 36 39 37 40 #define TIM_CR1_CEN BIT(0) /* Counter Enable */ 38 41 #define TIM_CR1_DIR BIT(4) /* Counter Direction */ ··· 103 100 #define TIM_BDTR_BKF(x) (0xf << (16 + (x) * 4)) 104 101 #define TIM_DCR_DBA GENMASK(4, 0) /* DMA base addr */ 105 102 #define TIM_DCR_DBL GENMASK(12, 8) /* DMA burst len */ 103 + #define TIM_HWCFGR1_NB_OF_CC GENMASK(3, 0) /* Capture/compare channels */ 104 + #define TIM_HWCFGR1_NB_OF_DT GENMASK(7, 4) /* Complementary outputs & dead-time generators */ 105 + #define TIM_HWCFGR2_CNT_WIDTH GENMASK(15, 8) /* Counter width */ 106 106 107 107 #define MAX_TIM_PSC 0xFFFF 108 108 #define MAX_TIM_ICPSC 0x3 ··· 118 112 #define TIM_SMCR_TS_SHIFT 4 119 113 #define TIM_BDTR_BKF_MASK 0xF 120 114 #define TIM_BDTR_BKF_SHIFT(x) (16 + (x) * 4) 115 + 116 + #define STM32MP25_TIM_IPIDR 0x00120002 121 117 122 118 enum stm32_timers_dmas { 123 119 STM32_TIMERS_DMA_CH1, ··· 159 151 160 152 struct stm32_timers { 161 153 struct clk *clk; 154 + u32 ipidr; 162 155 struct regmap *regmap; 163 156 u32 max_arr; 164 157 struct stm32_timers_dma dma; /* Only to be used by the parent */
+125 -11
include/linux/mfd/tps65219.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 2 /* 3 - * Functions to access TPS65219 Power Management IC. 3 + * Functions to access TPS65215/TPS65219 Power Management Integrated Chips 4 4 * 5 5 * Copyright (C) 2022 BayLibre Incorporated - https://www.baylibre.com/ 6 + * Copyright (C) 2024 Texas Instruments Incorporated - https://www.ti.com/ 6 7 */ 7 8 8 9 #ifndef MFD_TPS65219_H ··· 14 13 #include <linux/regmap.h> 15 14 #include <linux/regulator/driver.h> 16 15 17 - /* TPS chip id list */ 18 - #define TPS65219 0xF0 16 + /* Chip id list*/ 17 + enum pmic_id { 18 + TPS65214, 19 + TPS65215, 20 + TPS65219, 21 + }; 19 22 20 23 /* I2C ID for TPS65219 part */ 21 24 #define TPS65219_I2C_ID 0x24 ··· 29 24 #define TPS65219_REG_NVM_ID 0x01 30 25 #define TPS65219_REG_ENABLE_CTRL 0x02 31 26 #define TPS65219_REG_BUCKS_CONFIG 0x03 27 + #define TPS65214_REG_LOCK 0x03 32 28 #define TPS65219_REG_LDO4_VOUT 0x04 29 + #define TPS65214_REG_LDO1_VOUT_STBY 0x04 33 30 #define TPS65219_REG_LDO3_VOUT 0x05 31 + #define TPS65215_REG_LDO2_VOUT 0x05 32 + #define TPS65214_REG_LDO1_VOUT 0x05 34 33 #define TPS65219_REG_LDO2_VOUT 0x06 34 + #define TPS65214_REG_LDO2_VOUT 0x06 35 35 #define TPS65219_REG_LDO1_VOUT 0x07 36 + #define TPS65214_REG_LDO2_VOUT_STBY 0x07 36 37 #define TPS65219_REG_BUCK3_VOUT 0x8 37 38 #define TPS65219_REG_BUCK2_VOUT 0x9 38 39 #define TPS65219_REG_BUCK1_VOUT 0xA 39 40 #define TPS65219_REG_LDO4_SEQUENCE_SLOT 0xB 40 41 #define TPS65219_REG_LDO3_SEQUENCE_SLOT 0xC 42 + #define TPS65215_REG_LDO2_SEQUENCE_SLOT 0xC 43 + #define TPS65214_REG_LDO1_SEQUENCE_SLOT 0xC 41 44 #define TPS65219_REG_LDO2_SEQUENCE_SLOT 0xD 42 45 #define TPS65219_REG_LDO1_SEQUENCE_SLOT 0xE 43 46 #define TPS65219_REG_BUCK3_SEQUENCE_SLOT 0xF ··· 54 41 #define TPS65219_REG_nRST_SEQUENCE_SLOT 0x12 55 42 #define TPS65219_REG_GPIO_SEQUENCE_SLOT 0x13 56 43 #define TPS65219_REG_GPO2_SEQUENCE_SLOT 0x14 44 + #define TPS65214_REG_GPIO_GPI_SEQUENCE_SLOT 0x14 57 45 #define TPS65219_REG_GPO1_SEQUENCE_SLOT 0x15 46 + #define TPS65214_REG_GPO_SEQUENCE_SLOT 0x15 58 47 #define TPS65219_REG_POWER_UP_SLOT_DURATION_1 0x16 59 48 #define TPS65219_REG_POWER_UP_SLOT_DURATION_2 0x17 49 + /* _SLOT_DURATION_3 doesn't apply to TPS65215*/ 60 50 #define TPS65219_REG_POWER_UP_SLOT_DURATION_3 0x18 61 51 #define TPS65219_REG_POWER_UP_SLOT_DURATION_4 0x19 52 + #define TPS65214_REG_BUCK3_VOUT_STBY 0x19 62 53 #define TPS65219_REG_POWER_DOWN_SLOT_DURATION_1 0x1A 63 54 #define TPS65219_REG_POWER_DOWN_SLOT_DURATION_2 0x1B 64 55 #define TPS65219_REG_POWER_DOWN_SLOT_DURATION_3 0x1C 56 + #define TPS65214_REG_BUCK2_VOUT_STBY 0x1C 65 57 #define TPS65219_REG_POWER_DOWN_SLOT_DURATION_4 0x1D 58 + #define TPS65214_REG_BUCK1_VOUT_STBY 0x1D 66 59 #define TPS65219_REG_GENERAL_CONFIG 0x1E 67 60 #define TPS65219_REG_MFP_1_CONFIG 0x1F 68 61 #define TPS65219_REG_MFP_2_CONFIG 0x20 ··· 86 67 #define TPS65219_REG_DISCHARGE_CONFIG 0x2A 87 68 /* main irq registers */ 88 69 #define TPS65219_REG_INT_SOURCE 0x2B 89 - /* 'sub irq' registers */ 70 + 71 + /* TPS65219 'sub irq' registers */ 90 72 #define TPS65219_REG_INT_LDO_3_4 0x2C 91 73 #define TPS65219_REG_INT_LDO_1_2 0x2D 74 + 75 + /* TPS65215 specific 'sub irq' registers */ 76 + #define TPS65215_REG_INT_LDO_2 0x2C 77 + #define TPS65215_REG_INT_LDO_1 0x2D 78 + 79 + /* TPS65214 specific 'sub irq' register */ 80 + #define TPS65214_REG_INT_LDO_1_2 0x2D 81 + 82 + /* Common TPS65215 & TPS65219 'sub irq' registers */ 92 83 #define TPS65219_REG_INT_BUCK_3 0x2E 93 84 #define TPS65219_REG_INT_BUCK_1_2 0x2F 94 85 #define TPS65219_REG_INT_SYSTEM 0x30 ··· 114 85 #define TPS65219_REG_INT_RV_POS 5 115 86 #define TPS65219_REG_INT_TO_RV_POS 6 116 87 #define TPS65219_REG_INT_PB_POS 7 88 + 89 + #define TPS65215_REG_INT_LDO_2_POS 0 90 + #define TPS65215_REG_INT_LDO_1_POS 1 91 + 92 + #define TPS65214_REG_INT_LDO_1_2_POS 0 93 + #define TPS65214_REG_INT_BUCK_3_POS 1 94 + #define TPS65214_REG_INT_BUCK_1_2_POS 2 95 + #define TPS65214_REG_INT_SYS_POS 3 96 + #define TPS65214_REG_INT_RV_POS 4 97 + #define TPS65214_REG_INT_TO_RV_POS 5 98 + #define TPS65214_REG_INT_PB_POS 6 117 99 118 100 #define TPS65219_REG_USER_NVM_CMD 0x34 119 101 #define TPS65219_REG_POWER_UP_STATUS 0x35 ··· 147 107 #define TPS65219_ENABLE_LDO1_EN_MASK BIT(3) 148 108 #define TPS65219_ENABLE_LDO2_EN_MASK BIT(4) 149 109 #define TPS65219_ENABLE_LDO3_EN_MASK BIT(5) 110 + #define TPS65215_ENABLE_LDO2_EN_MASK BIT(5) 111 + #define TPS65214_ENABLE_LDO1_EN_MASK BIT(5) 150 112 #define TPS65219_ENABLE_LDO4_EN_MASK BIT(6) 151 113 /* power ON-OFF sequence slot */ 152 114 #define TPS65219_BUCKS_LDOS_SEQUENCE_OFF_SLOT_MASK GENMASK(3, 0) ··· 200 158 #define TPS65219_REG_MASK_EFFECT_MASK GENMASK(2, 1) 201 159 #define TPS65219_REG_MASK_INT_FOR_PB_MASK BIT(7) 202 160 /* UnderVoltage - Short to GND - OverCurrent*/ 203 - /* LDO3-4 */ 161 + /* LDO3-4: only for TPS65219*/ 204 162 #define TPS65219_INT_LDO3_SCG_MASK BIT(0) 205 163 #define TPS65219_INT_LDO3_OC_MASK BIT(1) 206 164 #define TPS65219_INT_LDO3_UV_MASK BIT(2) 207 165 #define TPS65219_INT_LDO4_SCG_MASK BIT(3) 208 166 #define TPS65219_INT_LDO4_OC_MASK BIT(4) 209 167 #define TPS65219_INT_LDO4_UV_MASK BIT(5) 210 - /* LDO1-2 */ 168 + /* LDO1-2: TPS65214 & TPS65219 */ 211 169 #define TPS65219_INT_LDO1_SCG_MASK BIT(0) 212 170 #define TPS65219_INT_LDO1_OC_MASK BIT(1) 213 171 #define TPS65219_INT_LDO1_UV_MASK BIT(2) 214 172 #define TPS65219_INT_LDO2_SCG_MASK BIT(3) 215 173 #define TPS65219_INT_LDO2_OC_MASK BIT(4) 216 174 #define TPS65219_INT_LDO2_UV_MASK BIT(5) 175 + /* TPS65215 LDO1-2*/ 176 + #define TPS65215_INT_LDO1_SCG_MASK BIT(0) 177 + #define TPS65215_INT_LDO1_OC_MASK BIT(1) 178 + #define TPS65215_INT_LDO1_UV_MASK BIT(2) 179 + #define TPS65215_INT_LDO2_SCG_MASK BIT(0) 180 + #define TPS65215_INT_LDO2_OC_MASK BIT(1) 181 + #define TPS65215_INT_LDO2_UV_MASK BIT(2) 217 182 /* BUCK3 */ 218 183 #define TPS65219_INT_BUCK3_SCG_MASK BIT(0) 219 184 #define TPS65219_INT_BUCK3_OC_MASK BIT(1) ··· 235 186 #define TPS65219_INT_BUCK2_OC_MASK BIT(5) 236 187 #define TPS65219_INT_BUCK2_NEG_OC_MASK BIT(6) 237 188 #define TPS65219_INT_BUCK2_UV_MASK BIT(7) 238 - /* Thermal Sensor */ 189 + /* Thermal Sensor: TPS65219/TPS65215 */ 239 190 #define TPS65219_INT_SENSOR_3_WARM_MASK BIT(0) 191 + #define TPS65219_INT_SENSOR_3_HOT_MASK BIT(4) 192 + /* Thermal Sensor: TPS65219/TPS65215/TPS65214 */ 240 193 #define TPS65219_INT_SENSOR_2_WARM_MASK BIT(1) 241 194 #define TPS65219_INT_SENSOR_1_WARM_MASK BIT(2) 242 195 #define TPS65219_INT_SENSOR_0_WARM_MASK BIT(3) 243 - #define TPS65219_INT_SENSOR_3_HOT_MASK BIT(4) 244 196 #define TPS65219_INT_SENSOR_2_HOT_MASK BIT(5) 245 197 #define TPS65219_INT_SENSOR_1_HOT_MASK BIT(6) 246 198 #define TPS65219_INT_SENSOR_0_HOT_MASK BIT(7) ··· 252 202 #define TPS65219_INT_LDO1_RV_MASK BIT(3) 253 203 #define TPS65219_INT_LDO2_RV_MASK BIT(4) 254 204 #define TPS65219_INT_LDO3_RV_MASK BIT(5) 205 + #define TPS65215_INT_LDO2_RV_MASK BIT(5) 206 + #define TPS65214_INT_LDO2_RV_MASK BIT(5) 255 207 #define TPS65219_INT_LDO4_RV_MASK BIT(6) 256 208 /* Residual Voltage ShutDown */ 257 209 #define TPS65219_INT_BUCK1_RV_SD_MASK BIT(0) ··· 262 210 #define TPS65219_INT_LDO1_RV_SD_MASK BIT(3) 263 211 #define TPS65219_INT_LDO2_RV_SD_MASK BIT(4) 264 212 #define TPS65219_INT_LDO3_RV_SD_MASK BIT(5) 213 + #define TPS65215_INT_LDO2_RV_SD_MASK BIT(5) 214 + #define TPS65214_INT_LDO1_RV_SD_MASK BIT(5) 265 215 #define TPS65219_INT_LDO4_RV_SD_MASK BIT(6) 266 216 #define TPS65219_INT_TIMEOUT_MASK BIT(7) 267 217 /* Power Button */ ··· 289 235 TPS65219_INT_LDO4_SCG, 290 236 TPS65219_INT_LDO4_OC, 291 237 TPS65219_INT_LDO4_UV, 292 - /* LDO1-2 */ 238 + /* TPS65215 LDO1*/ 239 + TPS65215_INT_LDO1_SCG, 240 + TPS65215_INT_LDO1_OC, 241 + TPS65215_INT_LDO1_UV, 242 + /* TPS65215 LDO2*/ 243 + TPS65215_INT_LDO2_SCG, 244 + TPS65215_INT_LDO2_OC, 245 + TPS65215_INT_LDO2_UV, 246 + /* LDO1-2: TPS65219/TPS65214 */ 293 247 TPS65219_INT_LDO1_SCG, 294 248 TPS65219_INT_LDO1_OC, 295 249 TPS65219_INT_LDO1_UV, ··· 333 271 TPS65219_INT_BUCK3_RV, 334 272 TPS65219_INT_LDO1_RV, 335 273 TPS65219_INT_LDO2_RV, 274 + TPS65215_INT_LDO2_RV, 275 + TPS65214_INT_LDO2_RV, 336 276 TPS65219_INT_LDO3_RV, 337 277 TPS65219_INT_LDO4_RV, 338 278 /* Residual Voltage ShutDown */ ··· 342 278 TPS65219_INT_BUCK2_RV_SD, 343 279 TPS65219_INT_BUCK3_RV_SD, 344 280 TPS65219_INT_LDO1_RV_SD, 281 + TPS65214_INT_LDO1_RV_SD, 282 + TPS65215_INT_LDO2_RV_SD, 345 283 TPS65219_INT_LDO2_RV_SD, 346 284 TPS65219_INT_LDO3_RV_SD, 347 285 TPS65219_INT_LDO4_RV_SD, ··· 351 285 /* Power Button */ 352 286 TPS65219_INT_PB_FALLING_EDGE_DETECT, 353 287 TPS65219_INT_PB_RISING_EDGE_DETECT, 288 + }; 289 + 290 + enum tps65214_regulator_id { 291 + /* 292 + * DCDC's same as TPS65219 293 + * LDO1 maps to TPS65219's LDO3 294 + * LDO2 is the same as TPS65219 295 + * 296 + */ 297 + TPS65214_LDO_1 = 3, 298 + TPS65214_LDO_2 = 4, 299 + }; 300 + 301 + enum tps65215_regulator_id { 302 + /* DCDC's same as TPS65219 */ 303 + /* LDO1 is the same as TPS65219 */ 304 + TPS65215_LDO_2 = 4, 354 305 }; 355 306 356 307 enum tps65219_regulator_id { ··· 383 300 }; 384 301 385 302 /* Number of step-down converters available */ 386 - #define TPS65219_NUM_DCDC 3 303 + #define TPS6521X_NUM_BUCKS 3 387 304 /* Number of LDO voltage regulators available */ 388 305 #define TPS65219_NUM_LDO 4 306 + #define TPS65215_NUM_LDO 2 307 + #define TPS65214_NUM_LDO 2 389 308 /* Number of total regulators available */ 390 - #define TPS65219_NUM_REGULATOR (TPS65219_NUM_DCDC + TPS65219_NUM_LDO) 309 + #define TPS65219_NUM_REGULATOR (TPS6521X_NUM_BUCKS + TPS65219_NUM_LDO) 310 + #define TPS65215_NUM_REGULATOR (TPS6521X_NUM_BUCKS + TPS65215_NUM_LDO) 311 + #define TPS65214_NUM_REGULATOR (TPS6521X_NUM_BUCKS + TPS65214_NUM_LDO) 312 + 313 + /* Define the TPS65214 IRQ numbers */ 314 + enum tps65214_irqs { 315 + /* INT source registers */ 316 + TPS65214_TO_RV_SD_SET_IRQ, 317 + TPS65214_RV_SET_IRQ, 318 + TPS65214_SYS_SET_IRQ, 319 + TPS65214_BUCK_1_2_SET_IRQ, 320 + TPS65214_BUCK_3_SET_IRQ, 321 + TPS65214_LDO_1_2_SET_IRQ, 322 + TPS65214_PB_SET_IRQ = 7, 323 + }; 324 + 325 + /* Define the TPS65215 IRQ numbers */ 326 + enum tps65215_irqs { 327 + /* INT source registers */ 328 + TPS65215_TO_RV_SD_SET_IRQ, 329 + TPS65215_RV_SET_IRQ, 330 + TPS65215_SYS_SET_IRQ, 331 + TPS65215_BUCK_1_2_SET_IRQ, 332 + TPS65215_BUCK_3_SET_IRQ, 333 + TPS65215_LDO_1_SET_IRQ, 334 + TPS65215_LDO_2_SET_IRQ, 335 + TPS65215_PB_SET_IRQ, 336 + }; 391 337 392 338 /* Define the TPS65219 IRQ numbers */ 393 339 enum tps65219_irqs { ··· 438 326 * 439 327 * @dev: MFD device 440 328 * @regmap: Regmap for accessing the device registers 329 + * @chip_id: Chip ID 441 330 * @irq_data: Regmap irq data used for the irq chip 442 331 * @nb: notifier block for the restart handler 443 332 */ ··· 446 333 struct device *dev; 447 334 struct regmap *regmap; 448 335 336 + unsigned int chip_id; 449 337 struct regmap_irq_chip_data *irq_data; 450 338 struct notifier_block nb; 451 339 };
+195
include/linux/power/max77705_charger.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Maxim MAX77705 definitions. 4 + * 5 + * Copyright (C) 2015 Samsung Electronics, Inc. 6 + * Copyright (C) 2025 Dzmitry Sankouski <dsankouski@gmail.com> 7 + */ 8 + 9 + #ifndef __MAX77705_CHARGER_H 10 + #define __MAX77705_CHARGER_H __FILE__ 11 + 12 + /* MAX77705_CHG_REG_CHG_INT */ 13 + #define MAX77705_BYP_I BIT(0) 14 + #define MAX77705_INP_LIMIT_I BIT(1) 15 + #define MAX77705_BATP_I BIT(2) 16 + #define MAX77705_BAT_I BIT(3) 17 + #define MAX77705_CHG_I BIT(4) 18 + #define MAX77705_WCIN_I BIT(5) 19 + #define MAX77705_CHGIN_I BIT(6) 20 + #define MAX77705_AICL_I BIT(7) 21 + 22 + /* MAX77705_CHG_REG_CHG_INT_MASK */ 23 + #define MAX77705_BYP_IM BIT(0) 24 + #define MAX77705_INP_LIMIT_IM BIT(1) 25 + #define MAX77705_BATP_IM BIT(2) 26 + #define MAX77705_BAT_IM BIT(3) 27 + #define MAX77705_CHG_IM BIT(4) 28 + #define MAX77705_WCIN_IM BIT(5) 29 + #define MAX77705_CHGIN_IM BIT(6) 30 + #define MAX77705_AICL_IM BIT(7) 31 + 32 + /* MAX77705_CHG_REG_CHG_INT_OK */ 33 + #define MAX77705_BYP_OK BIT(0) 34 + #define MAX77705_DISQBAT_OK BIT(1) 35 + #define MAX77705_BATP_OK BIT(2) 36 + #define MAX77705_BAT_OK BIT(3) 37 + #define MAX77705_CHG_OK BIT(4) 38 + #define MAX77705_WCIN_OK BIT(5) 39 + #define MAX77705_CHGIN_OK BIT(6) 40 + #define MAX77705_AICL_OK BIT(7) 41 + 42 + /* MAX77705_CHG_REG_DETAILS_00 */ 43 + #define MAX77705_BATP_DTLS BIT(0) 44 + #define MAX77705_WCIN_DTLS GENMASK(4, 3) 45 + #define MAX77705_WCIN_DTLS_SHIFT 3 46 + #define MAX77705_CHGIN_DTLS GENMASK(6, 5) 47 + #define MAX77705_CHGIN_DTLS_SHIFT 5 48 + 49 + /* MAX77705_CHG_REG_DETAILS_01 */ 50 + #define MAX77705_CHG_DTLS GENMASK(3, 0) 51 + #define MAX77705_CHG_DTLS_SHIFT 0 52 + #define MAX77705_BAT_DTLS GENMASK(6, 4) 53 + #define MAX77705_BAT_DTLS_SHIFT 4 54 + 55 + /* MAX77705_CHG_REG_DETAILS_02 */ 56 + #define MAX77705_BYP_DTLS GENMASK(3, 0) 57 + #define MAX77705_BYP_DTLS_SHIFT 0 58 + 59 + /* MAX77705_CHG_REG_CNFG_00 */ 60 + #define MAX77705_CHG_SHIFT 0 61 + #define MAX77705_UNO_SHIFT 1 62 + #define MAX77705_OTG_SHIFT 1 63 + #define MAX77705_BUCK_SHIFT 2 64 + #define MAX77705_BOOST_SHIFT 3 65 + #define MAX77705_WDTEN_SHIFT 4 66 + #define MAX77705_MODE_MASK GENMASK(3, 0) 67 + #define MAX77705_CHG_MASK BIT(MAX77705_CHG_SHIFT) 68 + #define MAX77705_UNO_MASK BIT(MAX77705_UNO_SHIFT) 69 + #define MAX77705_OTG_MASK BIT(MAX77705_OTG_SHIFT) 70 + #define MAX77705_BUCK_MASK BIT(MAX77705_BUCK_SHIFT) 71 + #define MAX77705_BOOST_MASK BIT(MAX77705_BOOST_SHIFT) 72 + #define MAX77705_WDTEN_MASK BIT(MAX77705_WDTEN_SHIFT) 73 + #define MAX77705_UNO_CTRL (MAX77705_UNO_MASK | MAX77705_BOOST_MASK) 74 + #define MAX77705_OTG_CTRL (MAX77705_OTG_MASK | MAX77705_BOOST_MASK) 75 + 76 + /* MAX77705_CHG_REG_CNFG_01 */ 77 + #define MAX77705_FCHGTIME_SHIFT 0 78 + #define MAX77705_FCHGTIME_MASK GENMASK(2, 0) 79 + #define MAX77705_CHG_RSTRT_SHIFT 4 80 + #define MAX77705_CHG_RSTRT_MASK GENMASK(5, 4) 81 + #define MAX77705_FCHGTIME_DISABLE 0 82 + #define MAX77705_CHG_RSTRT_DISABLE 0x3 83 + 84 + #define MAX77705_PQEN_SHIFT 7 85 + #define MAX77705_PQEN_MASK BIT(7) 86 + #define MAX77705_CHG_PQEN_DISABLE 0 87 + #define MAX77705_CHG_PQEN_ENABLE 1 88 + 89 + /* MAX77705_CHG_REG_CNFG_02 */ 90 + #define MAX77705_OTG_ILIM_SHIFT 6 91 + #define MAX77705_OTG_ILIM_MASK GENMASK(7, 6) 92 + #define MAX77705_OTG_ILIM_500 0 93 + #define MAX77705_OTG_ILIM_900 1 94 + #define MAX77705_OTG_ILIM_1200 2 95 + #define MAX77705_OTG_ILIM_1500 3 96 + #define MAX77705_CHG_CC GENMASK(5, 0) 97 + 98 + /* MAX77705_CHG_REG_CNFG_03 */ 99 + #define MAX77705_TO_ITH_SHIFT 0 100 + #define MAX77705_TO_ITH_MASK GENMASK(2, 0) 101 + #define MAX77705_TO_TIME_SHIFT 3 102 + #define MAX77705_TO_TIME_MASK GENMASK(5, 3) 103 + #define MAX77705_SYS_TRACK_DIS_SHIFT 7 104 + #define MAX77705_SYS_TRACK_DIS_MASK BIT(7) 105 + #define MAX77705_TO_ITH_150MA 0 106 + #define MAX77705_TO_TIME_30M 3 107 + #define MAX77705_SYS_TRACK_ENABLE 0 108 + #define MAX77705_SYS_TRACK_DISABLE 1 109 + 110 + /* MAX77705_CHG_REG_CNFG_04 */ 111 + #define MAX77705_CHG_MINVSYS_SHIFT 6 112 + #define MAX77705_CHG_MINVSYS_MASK GENMASK(7, 6) 113 + #define MAX77705_CHG_PRM_SHIFT 0 114 + #define MAX77705_CHG_PRM_MASK GENMASK(5, 0) 115 + 116 + #define MAX77705_CHG_CV_PRM_SHIFT 0 117 + #define MAX77705_CHG_CV_PRM_MASK GENMASK(5, 0) 118 + 119 + /* MAX77705_CHG_REG_CNFG_05 */ 120 + #define MAX77705_REG_B2SOVRC_SHIFT 0 121 + #define MAX77705_REG_B2SOVRC_MASK GENMASK(3, 0) 122 + #define MAX77705_B2SOVRC_DISABLE 0 123 + #define MAX77705_B2SOVRC_4_5A 6 124 + #define MAX77705_B2SOVRC_4_8A 8 125 + #define MAX77705_B2SOVRC_5_0A 9 126 + 127 + /* MAX77705_CHG_CNFG_06 */ 128 + #define MAX77705_WDTCLR_SHIFT 0 129 + #define MAX77705_WDTCLR_MASK GENMASK(1, 0) 130 + #define MAX77705_WDTCLR 1 131 + #define MAX77705_CHGPROT_MASK GENMASK(3, 2) 132 + #define MAX77705_CHGPROT_UNLOCKED GENMASK(3, 2) 133 + #define MAX77705_SLOWEST_LX_SLOPE GENMASK(6, 5) 134 + 135 + /* MAX77705_CHG_REG_CNFG_07 */ 136 + #define MAX77705_CHG_FMBST 4 137 + #define MAX77705_REG_FMBST_SHIFT 2 138 + #define MAX77705_REG_FMBST_MASK BIT(MAX77705_REG_FMBST_SHIFT) 139 + #define MAX77705_REG_FGSRC_SHIFT 1 140 + #define MAX77705_REG_FGSRC_MASK BIT(MAX77705_REG_FGSRC_SHIFT) 141 + 142 + /* MAX77705_CHG_REG_CNFG_08 */ 143 + #define MAX77705_REG_FSW_SHIFT 0 144 + #define MAX77705_REG_FSW_MASK GENMASK(1, 0) 145 + #define MAX77705_CHG_FSW_3MHz 0 146 + #define MAX77705_CHG_FSW_2MHz 1 147 + #define MAX77705_CHG_FSW_1_5MHz 2 148 + 149 + /* MAX77705_CHG_REG_CNFG_09 */ 150 + #define MAX77705_CHG_CHGIN_LIM_MASK GENMASK(6, 0) 151 + #define MAX77705_CHG_EN_MASK BIT(7) 152 + #define MAX77705_CHG_DISABLE 0 153 + #define MAX77705_CHARGER_CHG_CHARGING(_reg) \ 154 + (((_reg) & MAX77705_CHG_EN_MASK) > 1) 155 + 156 + 157 + /* MAX77705_CHG_REG_CNFG_10 */ 158 + #define MAX77705_CHG_WCIN_LIM GENMASK(5, 0) 159 + 160 + /* MAX77705_CHG_REG_CNFG_11 */ 161 + #define MAX77705_VBYPSET_SHIFT 0 162 + #define MAX77705_VBYPSET_MASK GENMASK(6, 0) 163 + 164 + /* MAX77705_CHG_REG_CNFG_12 */ 165 + #define MAX77705_CHGINSEL_SHIFT 5 166 + #define MAX77705_CHGINSEL_MASK BIT(MAX77705_CHGINSEL_SHIFT) 167 + #define MAX77705_WCINSEL_SHIFT 6 168 + #define MAX77705_WCINSEL_MASK BIT(MAX77705_WCINSEL_SHIFT) 169 + #define MAX77705_VCHGIN_REG_MASK GENMASK(4, 3) 170 + #define MAX77705_WCIN_REG_MASK GENMASK(2, 1) 171 + #define MAX77705_REG_DISKIP_SHIFT 0 172 + #define MAX77705_REG_DISKIP_MASK BIT(MAX77705_REG_DISKIP_SHIFT) 173 + /* REG=4.5V, UVLO=4.7V */ 174 + #define MAX77705_VCHGIN_4_5 0 175 + /* REG=4.5V, UVLO=4.7V */ 176 + #define MAX77705_WCIN_4_5 0 177 + #define MAX77705_DISABLE_SKIP 1 178 + #define MAX77705_AUTO_SKIP 0 179 + 180 + /* uA */ 181 + #define MAX77705_CURRENT_CHGIN_STEP 25000 182 + #define MAX77705_CURRENT_CHG_STEP 50000 183 + #define MAX77705_CURRENT_CHGIN_MIN 100000 184 + #define MAX77705_CURRENT_CHGIN_MAX 3200000 185 + 186 + struct max77705_charger_data { 187 + struct device *dev; 188 + struct regmap *regmap; 189 + struct power_supply_battery_info *bat_info; 190 + struct workqueue_struct *wqueue; 191 + struct work_struct chgin_work; 192 + struct power_supply *psy_chg; 193 + }; 194 + 195 + #endif /* __MAX77705_CHARGER_H */