Support ROHM BD96801 Scalable PMIC
Subsystems (9)
Matti Vaittinen
maintainerv3 cover Support ROHM BD96801 Scalable PMIC
Support ROHM BD96801 Scalable PMIC
The ROHM BD96801 is automotive grade PMIC, intended to be usable in multiple solutions. The BD96801 can be used as a stand-alone, or together with separate 'companion PMICs'. This modular approach aims to make this PMIC suitable for various use-cases.
This series brings only limited support. The more complete set of features was sent in the RFC:
https://lore.kernel.org/lkml/[email protected]/
The BD96801 provides two physical IRQ lines called "intb" and "errb" in the data-sheet. These are handled using own regmap-IRQ controller for both of the IRQ lines. This causes a debugFS naming conflict for IRQ domains created by the regmap-IRQ. This series adds support for setting a name suffix to IRQ domains. Some prior discussion can be seen here:
https://lore.kernel.org/all/[email protected]/
As writing of this there is no known system doing configurations which require the PMIC to be in STBY state using Linux driver. Furthermore, ensuring the PMIC is and stays in the STBY state when configurations are done may not be trivial. Especially, not in a generic way in a regulator driver. This is likely to be system specific.
Hence it felt natural to upstream only partial support for now, while leaving a note about the RFC series with more complete support for those who may need it later.
The patches from 1 to 6 are just typical "add support for device X" stuff. They should provide very much usable driver for BD96801 and I hope they don't cause too many questions and can be merged when quality seems high enough :)
Supporting the ERRB IRQ (patches 9 and 10) requires the regmap IRQ change (patch 8) which further requires the IRQ domain change (patch 7).
Patches 7 and 8 may need more careful thinking. Thus, the ERRB IRQ support is added as a separate step, which can be merged later or even dropped if the irqdomain changes prove to be unacceptable.
Revision history still tries to summarize changes from the RFC for the reviewers.
Revision history:
v2 => v3: Mostly based on feedback from Thomas Gleixner
- Added acks from Krzysztof and Mark
- Rebased on v6.10-rc2
- Drop name suffix support for legacy IRQ domains (both irqdomain and regmap)
- Improve the commit message for patch 7/10
v1 => v2:
- Add support for setting a name suffix for fwnode backed IRQ domains.
- Add support for setting a domain name suffix for regmap-IRQ.
- Add handling of ERRB IRQs.
- Small fixes based on feedback.
RFCv2 => v1:
- Drop ERRB IRQ from drivers (but not DT bindings).
- Drop configuration which requires STBY - state.
- Fix the register lock race by moving it from the regulator driver to the MFD driver.
RFCv1 => RFCv2:
- Tidying code based on feedback form Krzysztof Kozlowski and Lee Jones.
- Documented undocumented watchdog related DT properties.
- Added usage of the watchdog IRQ.
- Use irq_domain_update_bus_token() to work-around debugFS name collision for IRQ domains.
---
Matti Vaittinen (10):
dt-bindings: ROHM BD96801 PMIC regulators
dt-bindings: mfd: bd96801 PMIC core
mfd: support ROHM BD96801 PMIC core
regulator: bd96801: ROHM BD96801 PMIC regulators
watchdog: ROHM BD96801 PMIC WDG driver
MAINTAINERS: Add ROHM BD96801 'scalable PMIC' entries
irqdomain: Allow giving name suffix for domain
regmap: Allow setting IRQ domain name suffix
mfd: bd96801: Add ERRB IRQ
regulator: bd96801: Add ERRB IRQ
.../bindings/mfd/rohm,bd96801-pmic.yaml | 173 +++ .../regulator/rohm,bd96801-regulator.yaml | 63 ++ MAINTAINERS | 4 + drivers/base/regmap/regmap-irq.c | 15 +- drivers/mfd/Kconfig | 13 + drivers/mfd/Makefile | 1 + drivers/mfd/rohm-bd96801.c | 488 ++++++++ drivers/regulator/Kconfig | 12 + drivers/regulator/Makefile | 2 + drivers/regulator/bd96801-regulator.c | 1008 +++++++++++++++++ drivers/watchdog/Kconfig | 13 + drivers/watchdog/Makefile | 1 + drivers/watchdog/bd96801_wdt.c | 416 +++++++ include/linux/irqdomain.h | 22 +- include/linux/mfd/rohm-bd96801.h | 215 ++++ include/linux/mfd/rohm-generic.h | 1 + include/linux/regmap.h | 4 + kernel/irq/irqdomain.c | 37 +- 18 files changed, 2470 insertions(+), 18 deletions(-) create mode 100644 Documentation/devicetree/bindings/mfd/rohm,bd96801-pmic.yaml create mode 100644 Documentation/devicetree/bindings/regulator/rohm,bd96801-regulator.yaml create mode 100644 drivers/mfd/rohm-bd96801.c create mode 100644 drivers/regulator/bd96801-regulator.c create mode 100644 drivers/watchdog/bd96801_wdt.c create mode 100644 include/linux/mfd/rohm-bd96801.h
base-commit: 1613e604df0cd359cf2a7fbd9be7a0bcfacfabd0
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 1/10 dt-bindings: ROHM BD96801 PMIC regulators
ROHM BD96801 is a highly configurable automotive grade PMIC. Introduce DT bindings for the BD96801 regulators.
---
Revision history:
v2 =>
- No changes
v1 => v2:
- use lowercase node names in example
- drop unneeded '|' from description
RFCv2 => v1
- Drop regulator-name pattern requirement
- do not require regulator-name
--- .../regulator/rohm,bd96801-regulator.yaml | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Documentation/devicetree/bindings/regulator/rohm,bd96801-regulator.yaml
Documentation/devicetree/bindings/regulator/rohm,bd96801-regulator.yaml new file +63 -0
@@ -0,0 +1,63 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/regulator/rohm,bd96801-regulator.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ROHM BD96801 Power Management Integrated Circuit regulators + +maintainers: + - Matti Vaittinen <[email protected]> + +description: + This module is part of the ROHM BD96801 MFD device. For more details + see Documentation/devicetree/bindings/mfd/rohm,bd96801-pmic.yaml. + + The regulator controller is represented as a sub-node of the PMIC node + on the device tree. + + Regulator nodes should be named to buck_<number> and ldo_<number>. + The valid names for BD96801 regulator nodes are + buck1, buck2, buck3, buck4, ldo5, ldo6, ldo7 + +patternProperties: + "^ldo[5-7]$": + type: object + description: + Properties for single LDO regulator. + $ref: regulator.yaml# + + properties: + rohm,initial-voltage-microvolt: + description: + Initial voltage for regulator. Voltage can be tuned +/-150 mV from + this value. NOTE, This can be modified via I2C only when PMIC is in + STBY state. + minimum: 300000 + maximum: 3300000 + + unevaluatedProperties: false + + "^buck[1-4]$": + type: object + description: + Properties for single BUCK regulator. + $ref: regulator.yaml# + + properties: + rohm,initial-voltage-microvolt: + description: + Initial voltage for regulator. Voltage can be tuned +/-150 mV from + this value. NOTE, This can be modified via I2C only when PMIC is in + STBY state. + minimum: 500000 + maximum: 3300000 + + rohm,keep-on-stby: + description: + Keep the regulator powered when PMIC transitions to STBY state. + type: boolean + + unevaluatedProperties: false + +additionalProperties: false
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 2/10 dt-bindings: mfd: bd96801 PMIC core
In reply to Matti VaittinenROHM BD96801 is a highly configurable automotive grade PMIC. Introduce DT bindings for the BD96801 core.
---
Revision history:
v2 =>:
- No changes
v1 => v2:
- use lowercase node names in example
- minor addition to ERRB use-cases
RFCv2 => v1
- minor cleaning
- add timeout-sec
RFCv1 => RFCv2:
- Document rohm,hw-timeout-ms
- Document rohm,wdg-action
--- .../bindings/mfd/rohm,bd96801-pmic.yaml | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/rohm,bd96801-pmic.yaml
Documentation/devicetree/bindings/mfd/rohm,bd96801-pmic.yaml new file +173 -0
@@ -0,0 +1,173 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/rohm,bd96801-pmic.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: ROHM BD96801 Scalable Power Management Integrated Circuit + +maintainers: + - Matti Vaittinen <[email protected]> + +description: + BD96801 is an automotive grade single-chip power management IC. + It integrates 4 buck converters and 3 LDOs with safety features like + over-/under voltage and over current detection and a watchdog. + +properties: + compatible: + const: rohm,bd96801 + + reg: + maxItems: 1 + + interrupts: + description: + The PMIC provides intb and errb IRQ lines. The errb IRQ line is used + for fatal IRQs which will cause the PMIC to shut down power outputs. + In many systems this will shut down the SoC contolling the PMIC and + connecting/handling the errb can be omitted. However, there are cases + where the SoC is not powered by the PMIC or has a short time backup + energy to handle shutdown of critical hardware. In that case it may be + useful to connect the errb and handle errb events. + minItems: 1 + maxItems: 2 + + interrupt-names: + minItems: 1 + items: + - enum: [intb, errb] + - const: errb + + rohm,hw-timeout-ms: + description: + Watchdog timeout value(s). First walue is timeout limit. Second value is + optional value for 'too early' watchdog ping if window timeout mode is + to be used. + minItems: 1 + maxItems: 2 + + rohm,wdg-action: + description: + Whether the watchdog failure must turn off the regulator power outputs or + just toggle the INTB line. + enum: + - prstb + - intb-only + + timeout-sec: + maxItems: 2 + + regulators: + $ref: /schemas/regulator/rohm,bd96801-regulator.yaml + description: + List of child nodes that specify the regulators. + +required: + - compatible + - reg + - interrupts + - interrupt-names + - regulators + +additionalProperties: false + +examples: + - | + #include <dt-bindings/interrupt-controller/irq.h> + #include <dt-bindings/leds/common.h> + i2c { + #address-cells = <1>; + #size-cells = <0>; + pmic: pmic@60 { + reg = <0x60>; + compatible = "rohm,bd96801"; + interrupt-parent = <&gpio1>; + interrupts = <29 IRQ_TYPE_LEVEL_LOW>, <6 IRQ_TYPE_LEVEL_LOW>; + interrupt-names = "intb", "errb"; + + regulators { + buck1 { + regulator-name = "buck1"; + regulator-ramp-delay = <1250>; + /* 0.5V min INITIAL - 150 mV tune */ + regulator-min-microvolt = <350000>; + /* 3.3V + 150mV tune */ + regulator-max-microvolt = <3450000>; + + /* These can be set only when PMIC is in STBY */ + rohm,initial-voltage-microvolt = <500000>; + regulator-ov-error-microvolt = <230000>; + regulator-uv-error-microvolt = <230000>; + regulator-temp-protection-kelvin = <1>; + regulator-temp-warn-kelvin = <0>; + }; + buck2 { + regulator-name = "buck2"; + regulator-min-microvolt = <350000>; + regulator-max-microvolt = <3450000>; + + rohm,initial-voltage-microvolt = <3000000>; + regulator-ov-error-microvolt = <18000>; + regulator-uv-error-microvolt = <18000>; + regulator-temp-protection-kelvin = <1>; + regulator-temp-warn-kelvin = <1>; + }; + buck3 { + regulator-name = "buck3"; + regulator-min-microvolt = <350000>; + regulator-max-microvolt = <3450000>; + + rohm,initial-voltage-microvolt = <600000>; + regulator-ov-warn-microvolt = <18000>; + regulator-uv-warn-microvolt = <18000>; + regulator-temp-protection-kelvin = <1>; + regulator-temp-error-kelvin = <0>; + }; + buck4 { + regulator-name = "buck4"; + regulator-min-microvolt = <350000>; + regulator-max-microvolt = <3450000>; + + rohm,initial-voltage-microvolt = <600000>; + regulator-ov-warn-microvolt = <18000>; + regulator-uv-warn-microvolt = <18000>; + regulator-temp-protection-kelvin = <1>; + regulator-temp-error-kelvin = <0>; + }; + ldo5 { + regulator-name = "ldo5"; + regulator-min-microvolt = <300000>; + regulator-max-microvolt = <3300000>; + + rohm,initial-voltage-microvolt = <500000>; + regulator-ov-error-microvolt = <36000>; + regulator-uv-error-microvolt = <34000>; + regulator-temp-protection-kelvin = <1>; + regulator-temp-warn-kelvin = <0>; + }; + ldo6 { + regulator-name = "ldo6"; + regulator-min-microvolt = <300000>; + regulator-max-microvolt = <3300000>; + + rohm,initial-voltage-microvolt = <300000>; + regulator-ov-error-microvolt = <36000>; + regulator-uv-error-microvolt = <34000>; + regulator-temp-protection-kelvin = <1>; + regulator-temp-warn-kelvin = <0>; + }; + ldo7 { + regulator-name = "ldo7"; + regulator-min-microvolt = <300000>; + regulator-max-microvolt = <3300000>; + + rohm,initial-voltage-microvolt = <500000>; + regulator-ov-error-microvolt = <36000>; + regulator-uv-error-microvolt = <34000>; + regulator-temp-protection-kelvin = <1>; + regulator-temp-warn-kelvin = <0>; + }; + }; + }; + };
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 3/10 mfd: support ROHM BD96801 PMIC core
In reply to Matti VaittinenThe ROHM BD96801 PMIC is highly customizable automotive grade PMIC which integrates regulator and watchdog funtionalities.
Provide INTB IRQ and register accesses for regulator/watchdog drivers.
---
Changelog:
v2 =>:
- No changes
v1 => v2:
- Drop unused enum
- Improve error prints
- improve comments
RFCv2 => v1:
- drop ERRB interrupts (for now)
- bd96801: Unlock registers in core driver
Changelog: RFCv1 => RFCv2
- Work-around the IRQ domain name conflict
- Add watchdog IRQ
- Various styling fixes based on review by Lee
--- drivers/mfd/Kconfig | 13 ++ drivers/mfd/Makefile | 1 + drivers/mfd/rohm-bd96801.c | 273 +++++++++++++++++++++++++++++++ include/linux/mfd/rohm-bd96801.h | 215 ++++++++++++++++++++++++ include/linux/mfd/rohm-generic.h | 1 + 5 files changed, 503 insertions(+) create mode 100644 drivers/mfd/rohm-bd96801.c create mode 100644 include/linux/mfd/rohm-bd96801.h
drivers/mfd/Kconfig +13 -0
@@ -2089,6 +2089,19 @@ config MFD_ROHM_BD957XMUF BD9573MUF Power Management ICs. BD9576 and BD9573 are primarily designed to be used to power R-Car series processors. +config MFD_ROHM_BD96801 + tristate "ROHM BD96801 Power Management IC" + depends on I2C=y + depends on OF + select REGMAP_I2C + select REGMAP_IRQ + select MFD_CORE + help + Select this option to get support for the ROHM BD96801 Power + Management IC. The ROHM BD96801 is a highly scalable Power Management + IC for industrial and automotive use. The BD96801 can be used as a + master PMIC in a chained PMIC solution with suitable companion PMICs. + config MFD_STM32_LPTIMER tristate "Support for STM32 Low-Power Timer" depends on (ARCH_STM32 && OF) || COMPILE_TEST
drivers/mfd/Makefile +1 -0
@@ -264,6 +264,7 @@ obj-$(CONFIG_RAVE_SP_CORE) += rave-sp.o obj-$(CONFIG_MFD_ROHM_BD71828) += rohm-bd71828.o obj-$(CONFIG_MFD_ROHM_BD718XX) += rohm-bd718x7.o obj-$(CONFIG_MFD_ROHM_BD957XMUF) += rohm-bd9576.o +obj-$(CONFIG_MFD_ROHM_BD96801) += rohm-bd96801.o obj-$(CONFIG_MFD_STMFX) += stmfx.o obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o obj-$(CONFIG_MFD_ACER_A500_EC) += acer-ec-a500.o
drivers/mfd/rohm-bd96801.c new file +273 -0
273 lines not on this page · raw message
include/linux/mfd/rohm-bd96801.h new file +215 -0
215 lines not on this page · raw message
include/linux/mfd/rohm-generic.h +1 -0
@@ -16,6 +16,7 @@ enum rohm_chip_type {ROHM_CHIP_TYPE_BD71828 ,ROHM_CHIP_TYPE_BD71837 ,ROHM_CHIP_TYPE_BD71847 , +ROHM_CHIP_TYPE_BD96801 , ROHM_CHIP_TYPE_AMOUNT };
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 4/10 regulator: bd96801: ROHM BD96801 PMIC regulators
In reply to Matti VaittinenThe ROHM BD96801 "Scalable PMIC" is an automotive grade PMIC which can scale to different applications by allowing chaining of PMICs. The PMIC also supports various protection features which can be configured either to fire IRQs - or to shut down power outputs when failure is detected.
The driver implements basic voltage control and sending error notifications.
NOTE:
The driver does not support doing configuration which require the PMIC to be in STBY state. The omitted feature set includes setting safety limit values, changing LDO voltages and controlling enable state for some regulators.
Also, the ERRB IRQ is not handled.
---
Revision history:
v2 =>
- no changes
v1 => v2:
- regulator: bd96801: lowercase DT node names
- split intb registration to own function
RFCv2 => v1:
- Drop STBY mode configurations
- Drop ERRB IRQs
- drop PMIC register unlock (moved to MFD to prevent races)
RFCv1 => RFCv2:
- Use devm_kcalloc() instead of devm_kzalloc() where appropriate
- Use devm_kmemdup()
- Add MODULE_DEVICE_TABLE
- drop MODULE_ALIAS
--- drivers/regulator/Kconfig | 12 + drivers/regulator/Makefile | 2 + drivers/regulator/bd96801-regulator.c | 908 ++++++++++++++++++++++++++ 3 files changed, 922 insertions(+) create mode 100644 drivers/regulator/bd96801-regulator.c
drivers/regulator/Kconfig +12 -0
@@ -268,6 +268,18 @@ config REGULATOR_BD957XMUF This driver can also be built as a module. If so, the module will be called bd9576-regulator. +config REGULATOR_BD96801 + tristate "ROHM BD96801 Power Regulator" + depends on MFD_ROHM_BD96801 + select REGULATOR_ROHM + help + This driver supports voltage regulators on ROHM BD96801 PMIC. + This will enable support for the software controllable buck + and LDO regulators. + + This driver can also be built as a module. If so, the module + will be called bd96801-regulator. + config REGULATOR_CPCAP tristate "Motorola CPCAP regulator" depends on MFD_CPCAP
drivers/regulator/Makefile +2 -0
@@ -37,6 +37,8 @@ obj-$(CONFIG_REGULATOR_BD718XX) += bd718x7-regulator.o obj-$(CONFIG_REGULATOR_BD9571MWV) += bd9571mwv-regulator.o obj-$(CONFIG_REGULATOR_BD957XMUF) += bd9576-regulator.o obj-$(CONFIG_REGULATOR_DA903X) += da903x-regulator.o +obj-$(CONFIG_REGULATOR_BD96801) += bd96801-regulator.o +obj-$(CONFIG_REGULATOR_DA903X) += da903x.o obj-$(CONFIG_REGULATOR_DA9052) += da9052-regulator.o obj-$(CONFIG_REGULATOR_DA9055) += da9055-regulator.o obj-$(CONFIG_REGULATOR_DA9062) += da9062-regulator.o
drivers/regulator/bd96801-regulator.c new file +908 -0
908 lines not on this page · raw message
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 5/10 watchdog: ROHM BD96801 PMIC WDG driver
In reply to Matti VaittinenIntroduce driver for WDG block on ROHM BD96801 scalable PMIC.
This driver only supports watchdog with I2C feeding and delayed response detection. Whether the watchdog toggles PRSTB pin or just causes an interrupt can be configured via device-tree.
The BD96801 PMIC HW supports also window watchdog (too early feeding detection) and Q&A mode. These are not supported by this driver.
---
Revision history:
v2 =>:
- No changes
v1 => v2:
- Drop the forward declaration for emergency_reboot()
- Typofixes
- Do error checks before assignments in find_closest_fast()
- Improve prints for unsupported (HW) timeout values
- Use FIELD_GET() and FIELD_PREP()
- Use error severity when unsupported Q&A WDG mode is tried to be used.
- Minor styling fixes
RFCv2 => v1:
- Fix watchdog time-outs to match DS4
- Fix target timeout overflow
- Improve dbg prints
RFCv1 => RFCv2:
- remove always running
- add IRQ handling
- call emergency_restart()
- drop MODULE_ALIAS and add MODULE_DEVICE_TABLE
watchdog: bd96801: styling fix
--- drivers/watchdog/Kconfig | 13 ++ drivers/watchdog/Makefile | 1 + drivers/watchdog/bd96801_wdt.c | 416 +++++++++++++++++++++++++++++++++ 3 files changed, 430 insertions(+) create mode 100644 drivers/watchdog/bd96801_wdt.c
drivers/watchdog/Kconfig +13 -0
@@ -181,6 +181,19 @@ config BD957XMUF_WATCHDOG watchdog. Alternatively say M to compile the driver as a module, which will be called bd9576_wdt. +config BD96801_WATCHDOG + tristate "ROHM BD96801 PMIC Watchdog" + depends on MFD_ROHM_BD96801 + select WATCHDOG_CORE + help + Support for the watchdog in the ROHM BD96801 PMIC. Watchdog can be + configured to only generate IRQ or to trigger system reset via reset + pin. + + Say Y here to include support for the ROHM BD96801 watchdog. + Alternatively say M to compile the driver as a module, + which will be called bd96801_wdt. + config CROS_EC_WATCHDOG tristate "ChromeOS EC-based watchdog" select WATCHDOG_CORE
drivers/watchdog/Makefile +1 -0
@@ -218,6 +218,7 @@ obj-$(CONFIG_XEN_WDT) += xen_wdt.o # Architecture Independent obj-$(CONFIG_BD957XMUF_WATCHDOG) += bd9576_wdt.o +obj-$(CONFIG_BD96801_WATCHDOG) += bd96801_wdt.o obj-$(CONFIG_CROS_EC_WATCHDOG) += cros_ec_wdt.o obj-$(CONFIG_DA9052_WATCHDOG) += da9052_wdt.o obj-$(CONFIG_DA9055_WATCHDOG) += da9055_wdt.o
drivers/watchdog/bd96801_wdt.c new file +416 -0
416 lines not on this page · raw message
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 6/10 MAINTAINERS: Add ROHM BD96801 'scalable PMIC' entries
In reply to Matti VaittinenAdd maintainer entries for ROHM BD96801 a.k.a 'scalable PMIC' drivers to be reviewed by ROHM people.
---
Revision history:
RFC1 =>:
- No changes
--- MAINTAINERS | 4 ++++ 1 file changed, 4 insertions(+)
MAINTAINERS +4 -0
@@ -19446,17 +19446,21 @@ F: drivers/gpio/gpio-bd71828.c F: drivers/mfd/rohm-bd71828.c F: drivers/mfd/rohm-bd718x7.c F: drivers/mfd/rohm-bd9576.c +F: drivers/mfd/rohm-bd96801.c F: drivers/regulator/bd71815-regulator.c F: drivers/regulator/bd71828-regulator.c F: drivers/regulator/bd718x7-regulator.c F: drivers/regulator/bd9576-regulator.c +F: drivers/regulator/bd96801-regulator.c F: drivers/regulator/rohm-regulator.c F: drivers/rtc/rtc-bd70528.c F: drivers/watchdog/bd9576_wdt.c +F: drivers/watchdog/bd96801_wdt.c F: include/linux/mfd/rohm-bd71815.h F: include/linux/mfd/rohm-bd71828.h F: include/linux/mfd/rohm-bd718x7.h F: include/linux/mfd/rohm-bd957x.h +F: include/linux/mfd/rohm-bd96801.h F: include/linux/mfd/rohm-generic.h F: include/linux/mfd/rohm-shared.h
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 7/10 irqdomain: Allow giving name suffix for domain
In reply to Matti VaittinenDevices can provide multiple interrupt lines. One reason for this is that a device has multiple subfunctions, each providing its own interrupt line. Another reason is that a device can be designed to be used (also) on a system where some of the interrupts can be routed to another processor.
A line often further acts as a demultiplex for specific interrupts and has it's respective set of interrupt (status, mask, ack, ...) registers.
Regmap supports the handling of these registers and demultiplexing interrupts, but interrupt domain code ends up assigning the same name for the per interrupt line domains. This will cause a naming collision in the debugFS code and can also lead to confusion, as /proc/interrupts would show two separate interrupts with the same domain name and hardware interrupt number.
Instead of adding a workaround in regmap or driver code, allow giving a name suffix for the domain name when the domain is created.
Add support for name suffix in __irq_domain_add() and allow using it via new irq_domain_create_linear_named() function. This is the only function required by the regmap code to support such setups because no new drivers are expected to be using legacy domains.
---
Revision history:
v2 => v3:
- Improve the commit message
- Drop the new name-suffix API for legacy domains
Some devices which could use this are ROHM's BD96801, BD96802 and BD96811 PMICs. BD96801 is being upstreamed, others are on my TODO list - but I believe this may be beneficial to any other devices as well. Especially for those which provide IRQs that are clearly different from each other.
Some discussion about this can be found from:
https://lore.kernel.org/all/[email protected]/
--- include/linux/irqdomain.h | 22 ++++++++++++++++------ kernel/irq/irqdomain.c | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 14 deletions(-)
include/linux/irqdomain.h +16 -6
@@ -260,7 +260,7 @@ void irq_domain_free_fwnode(struct fwnode_handle *fwnode);struct irq_domain *__irq_domain_add (struct fwnode_handle *fwnode,unsigned int size,irq_hw_number_t hwirq_max,int direct_max,const struct irq_domain_ops *ops, -void *host_data); +void *host_data,const char *name_suffix); struct irq_domain *irq_domain_create_simple(struct fwnode_handle *fwnode, unsigned int size, unsigned int first_irq,
@@ -350,7 +350,8 @@ static inline struct irq_domain *irq_domain_add_linear(struct device_node *of_noconst struct irq_domain_ops *ops, void *host_data) { - return __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, host_data); + return __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, +host_data ,NULL ); }#ifdef CONFIG_IRQ_DOMAIN_NOMAP
@@ -359,7 +360,8 @@ static inline struct irq_domain *irq_domain_add_nomap(struct device_node *of_nodconst struct irq_domain_ops *ops, void *host_data) { - return __irq_domain_add(of_node_to_fwnode(of_node), 0, max_irq, max_irq, ops, host_data); + return __irq_domain_add(of_node_to_fwnode(of_node), 0, max_irq, max_irq, +ops ,host_data ,NULL ); }extern unsigned int irq_create_direct_mapping (struct irq_domain *host);
@@ -369,7 +371,7 @@ static inline struct irq_domain *irq_domain_add_tree(struct device_node *of_nodeconst struct irq_domain_ops *ops, void *host_data) { - return __irq_domain_add(of_node_to_fwnode(of_node), 0, ~0, 0, ops, host_data); + return __irq_domain_add(of_node_to_fwnode(of_node), 0, ~0, 0, ops, host_data, NULL); } static inline struct irq_domain *irq_domain_create_linear(struct fwnode_handle *fwnode,
@@ -377,14 +379,22 @@ static inline struct irq_domain *irq_domain_create_linear(struct fwnode_handle *const struct irq_domain_ops *ops, void *host_data) { - return __irq_domain_add(fwnode, size, size, 0, ops, host_data); + return __irq_domain_add(fwnode, size, size, 0, ops, host_data, NULL); +} + +static inline struct irq_domain *irq_domain_create_linear_named (struct fwnode_handle *fwnode, +unsigned int size, +const struct irq_domain_ops *ops, +void *host_data,const char *name_suffix) +{ +return __irq_domain_add (fwnode, size, size,0 , ops, host_data, name_suffix); }static inline struct irq_domain *irq_domain_create_tree (struct fwnode_handle *fwnode,const struct irq_domain_ops *ops,void *host_data) { -return __irq_domain_add (fwnode,0 , ~0 ,0 , ops, host_data); +return __irq_domain_add (fwnode,0 , ~0 ,0 , ops, host_data,NULL ); }extern void irq_domain_remove (struct irq_domain *host);
kernel/irq/irqdomain.c +29 -8
@@ -132,7 +132,8 @@ static struct irq_domain *__irq_domain_create(struct fwnode_handle *fwnode,irq_hw_number_t hwirq_max, int direct_max, const struct irq_domain_ops *ops, - void *host_data) + void *host_data, + const char *name_suffix) { struct irqchip_fwid *fwid;struct irq_domain *domain;
@@ -150,6 +151,17 @@ static struct irq_domain *__irq_domain_create(struct fwnode_handle *fwnode,return NULL ;if (is_fwnode_irqchip (fwnode)) { +/* +* The name_suffix is only intended to be used to avoid a name +* collison, when multiple domains are created for a single +* device and the name is picked using a real device node. +* (Typical use-case is regmap-IRQ controllers for devices +* providing more than one physical IRQ.) There should be no +* need to use name_suffix with irqchip-fwnode. +*/ +if (name_suffix) +return NULL ; + fwid = container_of(fwnode, struct irqchip_fwid, fwnode);switch (fwid->type) {
@@ -177,7 +189,11 @@ static struct irq_domain *__irq_domain_create(struct fwnode_handle *fwnode,* unhappy about. Replace them with ':', which does * the trick and is not as offensive as '\'... */ - name =kasprintf (GFP_KERNEL ,"%pfw" , fwnode); +if (!name_suffix) + name =kasprintf (GFP_KERNEL ,"%pfw" , fwnode); +else + name =kasprintf (GFP_KERNEL ,"%pfw-%s" , fwnode, + name_suffix);if (!name) {kfree (domain);return NULL ;
@@ -249,6 +265,8 @@ static void __irq_domain_publish(struct irq_domain *domain)* direct mapping * @ops: domain callbacks * @host_data: Controller private data pointer +* @name_suffix: Optional name suffix to avoid collisions when multiple domains +* are added using same fwnode * * Allocates and initializes an irq_domain structure. * Returns pointer to IRQ domain, or NULL on failure.
@@ -256,12 +274,12 @@ static void __irq_domain_publish(struct irq_domain *domain)struct irq_domain *__irq_domain_add (struct fwnode_handle *fwnode,unsigned int size,irq_hw_number_t hwirq_max,int direct_max,const struct irq_domain_ops *ops, -void *host_data) +void *host_data,const char *name_suffix) {struct irq_domain *domain; domain =__irq_domain_create (fwnode, size, hwirq_max, direct_max, - ops, host_data); + ops, host_data, name_suffix);if (domain)__irq_domain_publish (domain);
@@ -362,7 +380,7 @@ struct irq_domain *irq_domain_create_simple(struct fwnode_handle *fwnode, {struct irq_domain *domain; - domain =__irq_domain_add (fwnode, size, size,0 , ops, host_data); + domain =__irq_domain_add (fwnode, size, size,0 , ops, host_data,NULL );if (!domain)return NULL ;
@@ -418,7 +436,8 @@ struct irq_domain *irq_domain_create_legacy(struct fwnode_handle *fwnode, {struct irq_domain *domain; - domain =__irq_domain_add (fwnode, first_hwirq + size, first_hwirq + size,0 , ops, host_data); + domain =__irq_domain_add (fwnode, first_hwirq + size, first_hwirq + size, +0 , ops, host_data,NULL );if (domain)irq_domain_associate_many (domain, first_irq, first_hwirq, size);
@@ -1147,9 +1166,11 @@ struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent,struct irq_domain *domain;if (size) - domain =__irq_domain_create (fwnode, size, size,0 , ops, host_data); + domain =__irq_domain_create (fwnode, size, size,0 , ops, + host_data,NULL );else - domain =__irq_domain_create (fwnode,0 , ~0 ,0 , ops, host_data); + domain =__irq_domain_create (fwnode,0 , ~0 ,0 , ops, host_data, +NULL );if (domain) {if (parent)
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 8/10 regmap: Allow setting IRQ domain name suffix
In reply to Matti VaittinenWhen multiple IRQ domains are created from the same device-tree node they will get the same name based on the device-tree path. This will cause a naming collision in debugFS when IRQ domain specific entries are created.
The regmap-IRQ creates per instance IRQ domains. This will lead to a domain name conflict when a device which provides more than one interrupt line uses the regmap-IRQ.
Add support for specifying an IRQ domain name suffix when creating a regmap-IRQ controller.
The regmap-IRQ supports both the legacy IRQ domains and the linear IRQ domains. New devices are not expected to be using the legacy domains so support name suffixes only for linear domains and warn if suffix is tried to be added for a legacy domain.
---
Revision history:
v2 => v3:
- Drop name suffix support for the legacy domains
--- drivers/base/regmap/regmap-irq.c | 15 +++++++++++---- include/linux/regmap.h | 4 ++++ 2 files changed, 15 insertions(+), 4 deletions(-)
drivers/base/regmap/regmap-irq.c +11 -4
@@ -856,13 +856,20 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, } } -if (irq_base) +if (irq_base) { +if (chip->domain_suffix) +dev_warn (map->dev, +"Can't add name suffix for legacy domain\n" ); + d->domain =irq_domain_create_legacy (fwnode, chip->num_irqs, irq_base,0 , ®map_domain_ops, d); -else - d->domain =irq_domain_create_linear (fwnode, chip->num_irqs, - ®map_domain_ops, d); + }else { + d->domain =irq_domain_create_linear_named (fwnode, + chip->num_irqs, ®map_domain_ops, + d, chip->domain_suffix); + } +if (!d->domain) {dev_err (map->dev,"Failed to create IRQ domain\n" ); ret = -ENOMEM ;
include/linux/regmap.h +4 -0
@@ -1519,6 +1519,9 @@ struct regmap_irq_chip_data;* struct regmap_irq_chip - Description of a generic regmap irq_chip. * * @name: Descriptive name for IRQ controller. +* @domain_suffix: Name suffix to be appended to end of IRQ domain name. Needed +* when multiple regmap-IRQ controllers are created from same +* device. * * @main_status: Base main status register address. For chips which have * interrupts arranged in separate sub-irq blocks with own IRQ
@@ -1604,6 +1607,7 @@ struct regmap_irq_chip_data;*/ struct regmap_irq_chip {const char *name; +const char *domain_suffix;unsigned int main_status;unsigned int num_main_status_bits;
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 9/10 mfd: bd96801: Add ERRB IRQ
In reply to Matti VaittinenThe ROHM BD96801 "scalable PMIC" provides two physical IRQs. The ERRB handling can in many cases be omitted because it is used to inform fatal IRQs, which usually kill the power from the SOC.
There may however be use-cases where the SOC has a 'back-up' emergency power source which allows some very short time of operation to try to gracefully shut down sensitive hardware. Furthermore, it is possible the processor controlling the PMIC is not powered by the PMIC. In such cases handling the ERRB IRQs may be beneficial.
Add support for ERRB IRQs.
---
Revision history:
v2 =>:
- No changes
v1 => v2:
- New patch
--- drivers/mfd/rohm-bd96801.c | 291 ++++++++++++++++++++++++++++++++----- 1 file changed, 253 insertions(+), 38 deletions(-)
drivers/mfd/rohm-bd96801.c +253 -38
@@ -5,13 +5,9 @@* ROHM BD96801 PMIC driver * * This version of the "BD86801 scalable PMIC"'s driver supports only very -* basic set of the PMIC features. Most notably, there is no support for -* the ERRB interrupt and the configurations which should be done when the -* PMIC is in STBY mode. -* -* Supporting the ERRB interrupt would require dropping the regmap-IRQ -* usage or working around (or accepting a presense of) a naming conflict -* in debugFS IRQs. +* basic set of the PMIC features. +* Most notably, there is no support for the configurations which should +* be done when the PMIC is in STBY mode. * * Being able to reliably do the configurations like changing the * regulator safety limits (like limits for the over/under -voltages, over
@@ -23,16 +19,14 @@* be the need to configure these safety limits. Hence it's not simple to * come up with a generic solution. * -* Users who require the ERRB handling and STBY state configurations can -* have a look at the original RFC: +* Users who require the STBY state configurations can have a look at the +* original RFC: * https://lore.kernel.org/all/[email protected]/ -* which implements a workaround to debugFS naming conflict and some of -* the safety limit configurations - but leaves the state change handling -* and synchronization to be implemented. +* which implements some of the safety limit configurations - but leaves the +* state change handling and synchronization to be implemented. * * It would be great to hear (and receive a patch!) if you implement the -* STBY configuration support or a proper fix to the debugFS naming -* conflict in your downstream driver ;) +* STBY configuration support or a proper fix in your downstream driver ;) */ #include <linux/i2c.h>
@@ -45,6 +39,65 @@#include <linux/mfd/rohm-bd96801.h> #include <linux/mfd/rohm-generic.h> + +static const struct resource regulator_errb_irqs[] = { +DEFINE_RES_IRQ_NAMED (BD96801_OTP_ERR_STAT ,"bd96801-otp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_DBIST_ERR_STAT ,"bd96801-dbist-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_EEP_ERR_STAT ,"bd96801-eep-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_ABIST_ERR_STAT ,"bd96801-abist-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_PRSTB_ERR_STAT ,"bd96801-prstb-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_DRMOS1_ERR_STAT ,"bd96801-drmoserr1" ), +DEFINE_RES_IRQ_NAMED (BD96801_DRMOS2_ERR_STAT ,"bd96801-drmoserr2" ), +DEFINE_RES_IRQ_NAMED (BD96801_SLAVE_ERR_STAT ,"bd96801-slave-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_VREF_ERR_STAT ,"bd96801-vref-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_TSD_ERR_STAT ,"bd96801-tsd" ), +DEFINE_RES_IRQ_NAMED (BD96801_UVLO_ERR_STAT ,"bd96801-uvlo-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_OVLO_ERR_STAT ,"bd96801-ovlo-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_OSC_ERR_STAT ,"bd96801-osc-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_PON_ERR_STAT ,"bd96801-pon-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_POFF_ERR_STAT ,"bd96801-poff-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_CMD_SHDN_ERR_STAT ,"bd96801-cmd-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_INT_PRSTB_WDT_ERR ,"bd96801-prstb-wdt-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_INT_CHIP_IF_ERR ,"bd96801-chip-if-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_INT_SHDN_ERR_STAT ,"bd96801-int-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_PVIN_ERR_STAT ,"bd96801-buck1-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_OVP_ERR_STAT ,"bd96801-buck1-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_UVP_ERR_STAT ,"bd96801-buck1-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_SHDN_ERR_STAT ,"bd96801-buck1-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_PVIN_ERR_STAT ,"bd96801-buck2-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_OVP_ERR_STAT ,"bd96801-buck2-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_UVP_ERR_STAT ,"bd96801-buck2-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_SHDN_ERR_STAT ,"bd96801-buck2-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_PVIN_ERR_STAT ,"bd96801-buck3-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_OVP_ERR_STAT ,"bd96801-buck3-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_UVP_ERR_STAT ,"bd96801-buck3-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_SHDN_ERR_STAT ,"bd96801-buck3-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_PVIN_ERR_STAT ,"bd96801-buck4-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_OVP_ERR_STAT ,"bd96801-buck4-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_UVP_ERR_STAT ,"bd96801-buck4-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_SHDN_ERR_STAT ,"bd96801-buck4-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_PVIN_ERR_STAT ,"bd96801-ldo5-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_OVP_ERR_STAT ,"bd96801-ldo5-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_UVP_ERR_STAT ,"bd96801-ldo5-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_SHDN_ERR_STAT ,"bd96801-ldo5-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_PVIN_ERR_STAT ,"bd96801-ldo6-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_OVP_ERR_STAT ,"bd96801-ldo6-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_UVP_ERR_STAT ,"bd96801-ldo6-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_SHDN_ERR_STAT ,"bd96801-ldo6-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_PVIN_ERR_STAT ,"bd96801-ldo7-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_OVP_ERR_STAT ,"bd96801-ldo7-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_UVP_ERR_STAT ,"bd96801-ldo7-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_SHDN_ERR_STAT ,"bd96801-ldo7-shdn-err" ), +}; +static const struct resource regulator_intb_irqs[] = {DEFINE_RES_IRQ_NAMED (BD96801_TW_STAT ,"bd96801-core-thermal" ),
@@ -89,20 +142,14 @@ static const struct resource regulator_intb_irqs[] = { DEFINE_RES_IRQ_NAMED(BD96801_LDO7_UVD_STAT, "bd96801-ldo7-undervolt"), }; -static const struct resource wdg_intb_irqs[] = { -DEFINE_RES_IRQ_NAMED (BD96801_WDT_ERR_STAT ,"bd96801-wdg" ), +enum { +WDG_CELL =0 , +REGULATOR_CELL , };static struct mfd_cell bd96801_mfd_cells[] = { - { - .name ="bd96801-wdt" , - .resources = wdg_intb_irqs, - .num_resources =ARRAY_SIZE (wdg_intb_irqs), - }, { - .name ="bd96801-pmic" , - .resources = regulator_intb_irqs, - .num_resources =ARRAY_SIZE (regulator_intb_irqs), - }, + [WDG_CELL ] = { .name ="bd96801-wdt" , }, + [REGULATOR_CELL ] = { .name ="bd96801-pmic" , }, };static const struct regmap_range bd96801_volatile_ranges[] = {
@@ -127,6 +174,91 @@ static const struct regmap_access_table volatile_regs = { .n_yes_ranges = ARRAY_SIZE(bd96801_volatile_ranges), }; +/* +* For ERRB we need main register bit mapping as bit(0) indicates active IRQ +* in one of the first 3 sub IRQ registers, For INTB we can use default 1 to 1 +* mapping. +*/ +static unsigned int bit0_offsets[] = {0 ,1 ,2 };/* System stat, 3 registers */ +static unsigned int bit1_offsets[] = {3 };/* Buck 1 stat */ +static unsigned int bit2_offsets[] = {4 };/* Buck 2 stat */ +static unsigned int bit3_offsets[] = {5 };/* Buck 3 stat */ +static unsigned int bit4_offsets[] = {6 };/* Buck 4 stat */ +static unsigned int bit5_offsets[] = {7 };/* LDO 5 stat */ +static unsigned int bit6_offsets[] = {8 };/* LDO 6 stat */ +static unsigned int bit7_offsets[] = {9 };/* LDO 7 stat */ + +static struct regmap_irq_sub_irq_map errb_sub_irq_offsets[] = { +REGMAP_IRQ_MAIN_REG_OFFSET (bit0_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit1_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit2_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit3_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit4_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit5_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit6_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit7_offsets), +}; + +static const struct regmap_irq bd96801_errb_irqs[] = { +/* Reg 0x52 Fatal ERRB1 */ +REGMAP_IRQ_REG (BD96801_OTP_ERR_STAT ,0 ,BD96801_OTP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_DBIST_ERR_STAT ,0 ,BD96801_DBIST_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_EEP_ERR_STAT ,0 ,BD96801_EEP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_ABIST_ERR_STAT ,0 ,BD96801_ABIST_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_PRSTB_ERR_STAT ,0 ,BD96801_PRSTB_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_DRMOS1_ERR_STAT ,0 ,BD96801_DRMOS1_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_DRMOS2_ERR_STAT ,0 ,BD96801_DRMOS2_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_SLAVE_ERR_STAT ,0 ,BD96801_SLAVE_ERR_MASK ), +/* 0x53 Fatal ERRB2 */ +REGMAP_IRQ_REG (BD96801_VREF_ERR_STAT ,1 ,BD96801_VREF_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_TSD_ERR_STAT ,1 ,BD96801_TSD_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_UVLO_ERR_STAT ,1 ,BD96801_UVLO_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_OVLO_ERR_STAT ,1 ,BD96801_OVLO_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_OSC_ERR_STAT ,1 ,BD96801_OSC_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_PON_ERR_STAT ,1 ,BD96801_PON_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_POFF_ERR_STAT ,1 ,BD96801_POFF_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_CMD_SHDN_ERR_STAT ,1 ,BD96801_CMD_SHDN_ERR_MASK ), +/* 0x54 Fatal INTB shadowed to ERRB */ +REGMAP_IRQ_REG (BD96801_INT_PRSTB_WDT_ERR ,2 ,BD96801_INT_PRSTB_WDT_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_INT_CHIP_IF_ERR ,2 ,BD96801_INT_CHIP_IF_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_INT_SHDN_ERR_STAT ,2 ,BD96801_INT_SHDN_ERR_MASK ), +/* Reg 0x55 BUCK1 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK1_PVIN_ERR_STAT ,3 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_OVP_ERR_STAT ,3 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_UVP_ERR_STAT ,3 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_SHDN_ERR_STAT ,3 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x56 BUCK2 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK2_PVIN_ERR_STAT ,4 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_OVP_ERR_STAT ,4 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_UVP_ERR_STAT ,4 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_SHDN_ERR_STAT ,4 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x57 BUCK3 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK3_PVIN_ERR_STAT ,5 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_OVP_ERR_STAT ,5 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_UVP_ERR_STAT ,5 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_SHDN_ERR_STAT ,5 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x58 BUCK4 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK4_PVIN_ERR_STAT ,6 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_OVP_ERR_STAT ,6 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_UVP_ERR_STAT ,6 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_SHDN_ERR_STAT ,6 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x59 LDO5 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_LDO5_PVIN_ERR_STAT ,7 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_OVP_ERR_STAT ,7 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_UVP_ERR_STAT ,7 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_SHDN_ERR_STAT ,7 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x5a LDO6 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_LDO6_PVIN_ERR_STAT ,8 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_OVP_ERR_STAT ,8 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_UVP_ERR_STAT ,8 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_SHDN_ERR_STAT ,8 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x5b LDO7 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_LDO7_PVIN_ERR_STAT ,9 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_OVP_ERR_STAT ,9 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_UVP_ERR_STAT ,9 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_SHDN_ERR_STAT ,9 ,BD96801_OUT_SHDN_ERR_MASK ), +}; +static const struct regmap_irq bd96801_intb_irqs[] = {/* STATUS SYSTEM INTB */ REGMAP_IRQ_REG (BD96801_TW_STAT ,0 ,BD96801_TW_STAT_MASK ),
@@ -175,8 +307,25 @@ static const struct regmap_irq bd96801_intb_irqs[] = { REGMAP_IRQ_REG(BD96801_LDO7_UVD_STAT, 7, BD96801_LDO_UVD_STAT_MASK), }; +static struct regmap_irq_chip bd96801_irq_chip_errb = { + .name ="bd96801-irq-errb" , + .domain_suffix ="errb" , + .main_status =BD96801_REG_INT_MAIN , + .num_main_regs =1 , + .irqs = &bd96801_errb_irqs[0 ], + .num_irqs =ARRAY_SIZE (bd96801_errb_irqs), + .status_base =BD96801_REG_INT_SYS_ERRB1 , + .mask_base =BD96801_REG_MASK_SYS_ERRB , + .ack_base =BD96801_REG_INT_SYS_ERRB1 , + .init_ack_masked = true, + .num_regs =10 , + .irq_reg_stride =1 , + .sub_reg_offsets = &errb_sub_irq_offsets[0 ], +}; +static struct regmap_irq_chip bd96801_irq_chip_intb = { .name ="bd96801-irq-intb" , + .domain_suffix ="intb" , .main_status =BD96801_REG_INT_MAIN , .num_main_regs =1 , .irqs = &bd96801_intb_irqs[0 ],
@@ -198,11 +347,14 @@ static const struct regmap_config bd96801_regmap_config = {static int bd96801_i2c_probe (struct i2c_client *i2c) { -struct regmap_irq_chip_data *intb_irq_data; +int i, ret, intb_irq, errb_irq, num_regu_irqs, num_intb, num_errb =0 ; +int wdg_irq_no; +struct regmap_irq_chip_data *intb_irq_data, *errb_irq_data; +struct irq_domain *intb_domain, *errb_domain; +struct resource wdg_irq;const struct fwnode_handle *fwnode; -struct irq_domain *intb_domain; +struct resource *regulator_res;struct regmap *regmap; -int ret, intb_irq; fwnode =dev_fwnode (&i2c->dev);if (!fwnode)
@@ -212,10 +364,28 @@ static int bd96801_i2c_probe(struct i2c_client *i2c)if (intb_irq <0 )return dev_err_probe (&i2c->dev, intb_irq,"INTB IRQ not configured\n" ); + num_intb =ARRAY_SIZE (regulator_intb_irqs); + +/* ERRB may be omitted if processor is powered by the PMIC */ + errb_irq =fwnode_irq_get_byname (fwnode,"errb" ); +if (errb_irq <0 ) + errb_irq =0 ; + +if (errb_irq) + num_errb =ARRAY_SIZE (regulator_errb_irqs); + + num_regu_irqs = num_intb + num_errb; + + regulator_res =kcalloc (num_regu_irqs,sizeof (*regulator_res),GFP_KERNEL ); +if (!regulator_res) +return -ENOMEM ; + regmap =devm_regmap_init_i2c (i2c, &bd96801_regmap_config); -if (IS_ERR (regmap)) -return dev_err_probe (&i2c->dev,PTR_ERR (regmap), +if (IS_ERR (regmap)) { + ret =dev_err_probe (&i2c->dev,PTR_ERR (regmap),"Regmap initialization failed\n" ); + goto free_out; + } ret =regmap_write (regmap,BD96801_LOCK_REG ,BD96801_UNLOCK );if (ret)
@@ -224,18 +394,63 @@ static int bd96801_i2c_probe(struct i2c_client *i2c) ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, intb_irq,IRQF_ONESHOT ,0 , &bd96801_irq_chip_intb, &intb_irq_data); -if (ret) -return dev_err_probe (&i2c->dev, ret,"Failed to add INTB IRQ chip\n" ); +if (ret) { +dev_err_probe (&i2c->dev, ret,"Failed to add INTB irq_chip\n" ); + goto free_out; + } intb_domain =regmap_irq_get_domain (intb_irq_data); - ret =devm_mfd_add_devices (&i2c->dev,PLATFORM_DEVID_AUTO , - bd96801_mfd_cells, -ARRAY_SIZE (bd96801_mfd_cells),NULL ,0 , - intb_domain); - +/* +* MFD core code is built to handle only one IRQ domain. BD96801 +* has two domains so we do IRQ mapping here and provide the +* already mapped IRQ numbers to sub-devices. +*/ +for (i =0 ; i < num_intb; i++) { +struct resource *res = ®ulator_res[i]; + + *res = regulator_intb_irqs[i]; + res->start = res->end =irq_create_mapping (intb_domain, + res->start); + } + + wdg_irq_no =irq_create_mapping (intb_domain,BD96801_WDT_ERR_STAT ); + wdg_irq =DEFINE_RES_IRQ_NAMED (wdg_irq_no,"bd96801-wdg" ); + bd96801_mfd_cells[WDG_CELL ].resources = &wdg_irq; + bd96801_mfd_cells[WDG_CELL ].num_resources =1 ; + +if (num_errb) { + ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, errb_irq, +IRQF_ONESHOT ,0 , + &bd96801_irq_chip_errb, + &errb_irq_data); +if (ret) { +dev_err_probe (&i2c->dev, ret, +"Failed to add ERRB (%d) irq_chip\n" , + errb_irq); + goto free_out; + } + errb_domain =regmap_irq_get_domain (errb_irq_data); + +for (i =0 ; i < num_errb; i++) { +struct resource *res = ®ulator_res[num_intb + i]; + + *res = regulator_errb_irqs[i]; + res->start = res->end =irq_create_mapping (errb_domain, + res->start); + } + } + + bd96801_mfd_cells[REGULATOR_CELL ].resources = regulator_res; + bd96801_mfd_cells[REGULATOR_CELL ].num_resources = num_regu_irqs; + + ret =devm_mfd_add_devices (&i2c->dev,PLATFORM_DEVID_AUTO , bd96801_mfd_cells, +ARRAY_SIZE (bd96801_mfd_cells),NULL ,0 ,NULL );if (ret) -dev_err (&i2c->dev,"Failed to create subdevices\n" ); +dev_err_probe (&i2c->dev, ret,"Failed to create subdevices\n" ); + +free_out: +kfree (regulator_res);return ret; }
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Matti Vaittinen
maintainerPATCH v3 10/10 regulator: bd96801: Add ERRB IRQ
In reply to Matti VaittinenThe ROHM BD96801 "scalable PMIC" provides two physical IRQs. The ERRB handling can in many cases be omitted because it is used to inform fatal IRQs, which usually kill the power from the SOC.
There may however be use-cases where the SOC has a 'back-up' emergency power source which allows some very short time of operation to try to gracefully shut down sensitive hardware. Furthermore, it is possible the processor controlling the PMIC is not powered by the PMIC. In such cases handling the ERRB IRQs may be beneficial.
Add support for ERRB IRQs.
---
Revision history:
v2 =>:
- No changes
v1 => v2:
- New patch
--- drivers/regulator/bd96801-regulator.c | 130 +++++++++++++++++++++++--- 1 file changed, 115 insertions(+), 15 deletions(-)
drivers/regulator/bd96801-regulator.c +115 -15
@@ -5,12 +5,7 @@/* * This version of the "BD86801 scalable PMIC"'s driver supports only very * basic set of the PMIC features. Most notably, there is no support for -* the ERRB interrupt and the configurations which should be done when the -* PMIC is in STBY mode. -* -* Supporting the ERRB interrupt would require dropping the regmap-IRQ -* usage or working around (or accepting a presense of) a naming conflict -* in debugFS IRQs. +* the configurations which should be done when the PMIC is in STBY mode. * * Being able to reliably do the configurations like changing the * regulator safety limits (like limits for the over/under -voltages, over
@@ -22,16 +17,14 @@* be the need to configure these safety limits. Hence it's not simple to * come up with a generic solution. * -* Users who require the ERRB handling and STBY state configurations can -* have a look at the original RFC: +* Users who require the STBY state configurations can have a look at the +* original RFC: * https://lore.kernel.org/all/[email protected]/ -* which implements a workaround to debugFS naming conflict and some of -* the safety limit configurations - but leaves the state change handling -* and synchronization to be implemented. +* which implements some of the safety limit configurations - but leaves the +* state change handling and synchronization to be implemented. * * It would be great to hear (and receive a patch!) if you implement the -* STBY configuration support or a proper fix to the debugFS naming -* conflict in your downstream driver ;) +* STBY configuration support in your downstream driver ;) */ #include <linux/delay.h>
@@ -733,6 +726,95 @@ static int initialize_pmic_data(struct device *dev,return 0 ; } +static int bd96801_map_event_all (int irq,struct regulator_irq_data *rid, +unsigned long *dev_mask) +{ +int i; + +for (i =0 ; i < rid->num_states; i++) { + rid->states[i].notifs =REGULATOR_EVENT_FAIL ; + rid->states[i].errors =REGULATOR_ERROR_FAIL ; + *dev_mask |=BIT (i); + } + +return 0 ; +} + +static int bd96801_rdev_errb_irqs (struct platform_device *pdev, +struct regulator_dev *rdev) +{ +int i; +void *retp; +static const char *const single_out_errb_irqs[] = { +"bd96801-%s-pvin-err" ,"bd96801-%s-ovp-err" , +"bd96801-%s-uvp-err" ,"bd96801-%s-shdn-err" , + }; + +for (i =0 ; i <ARRAY_SIZE (single_out_errb_irqs); i++) { +struct regulator_irq_desc id = { + .map_event = bd96801_map_event_all, + .irq_off_ms =1000 , + }; +struct regulator_dev *rdev_arr[1 ]; +char tmp[255 ]; +int irq; + +snprintf (tmp,255 , single_out_errb_irqs[i], rdev->desc->name); + tmp[254 ] =0 ; + id.name = tmp; + + irq =platform_get_irq_byname (pdev, tmp); +if (irq <0 ) +continue ; + + rdev_arr[0 ] = rdev; + retp =devm_regulator_irq_helper (&pdev->dev, &id, irq,0 , +REGULATOR_ERROR_FAIL ,NULL , + rdev_arr,1 ); +if (IS_ERR (retp)) +return PTR_ERR (retp); + + } +return 0 ; +} + +static int bd96801_global_errb_irqs (struct platform_device *pdev, +struct regulator_dev **rdev,int num_rdev) +{ +int i, num_irqs; +void *retp; +static const char *const global_errb_irqs[] = { +"bd96801-otp-err" ,"bd96801-dbist-err" ,"bd96801-eep-err" , +"bd96801-abist-err" ,"bd96801-prstb-err" ,"bd96801-drmoserr1" , +"bd96801-drmoserr2" ,"bd96801-slave-err" ,"bd96801-vref-err" , +"bd96801-tsd" ,"bd96801-uvlo-err" ,"bd96801-ovlo-err" , +"bd96801-osc-err" ,"bd96801-pon-err" ,"bd96801-poff-err" , +"bd96801-cmd-shdn-err" ,"bd96801-int-shdn-err" + }; + + num_irqs =ARRAY_SIZE (global_errb_irqs); +for (i =0 ; i < num_irqs; i++) { +int irq; +struct regulator_irq_desc id = { + .name = global_errb_irqs[i], + .map_event = bd96801_map_event_all, + .irq_off_ms =1000 , + }; + + irq =platform_get_irq_byname (pdev, global_errb_irqs[i]); +if (irq <0 ) +continue ; + + retp =devm_regulator_irq_helper (&pdev->dev, &id, irq,0 , +REGULATOR_ERROR_FAIL ,NULL , + rdev, num_rdev); +if (IS_ERR (retp)) +return PTR_ERR (retp); + } + +return 0 ; +} + static int bd96801_rdev_intb_irqs(struct platform_device *pdev, struct bd96801_pmic_data *pdata, struct bd96801_irqinfo *iinfo,
@@ -788,11 +870,10 @@ static int bd96801_rdev_intb_irqs(struct platform_device *pdev,return 0 ; } - -static int bd96801_probe (struct platform_device *pdev) {struct regulator_dev *ldo_errs_rdev_arr[BD96801_NUM_LDOS ]; +struct regulator_dev *all_rdevs[BD96801_NUM_REGULATORS ];struct bd96801_regulator_data *rdesc;struct regulator_config config = {};int ldo_errs_arr[BD96801_NUM_LDOS ];
@@ -800,6 +881,7 @@ static int bd96801_probe(struct platform_device *pdev)int temp_notif_ldos =0 ;struct device *parent;int i, ret; +bool use_errb;void *retp; parent = pdev->dev.parent;
@@ -824,6 +906,13 @@ static int bd96801_probe(struct platform_device *pdev) config.regmap = pdata->regmap; config.dev = parent; + ret =of_property_match_string (pdev->dev.parent->of_node, +"interrupt-names" ,"errb" ); +if (ret <0 ) + use_errb = false; +else + use_errb = true; + ret =bd96801_walk_regulator_dt (&pdev->dev, pdata->regmap, rdesc,BD96801_NUM_REGULATORS );if (ret)
@@ -842,6 +931,7 @@ static int bd96801_probe(struct platform_device *pdev) rdesc[i].desc.name);return PTR_ERR (rdev); } + all_rdevs[i] = rdev;/* * LDOs don't have own temperature monitoring. If temperature * notification was requested for this LDO from DT then we will
@@ -863,6 +953,12 @@ static int bd96801_probe(struct platform_device *pdev)if (ret)return ret; } +/* Register per regulator ERRB notifiers */ +if (use_errb) { + ret =bd96801_rdev_errb_irqs (pdev, rdev); +if (ret) +return ret; + } }if (temp_notif_ldos) {int irq;
@@ -884,6 +980,10 @@ static int bd96801_probe(struct platform_device *pdev)return PTR_ERR (retp); } +if (use_errb) +return bd96801_global_errb_irqs (pdev, all_rdevs, +ARRAY_SIZE (all_rdevs)); +return 0 ; }
Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Re: [PATCH v3 07/10] irqdomain: Allow giving name suffix for domain
In reply to Matti VaittinenMatti!
Quoted 9 lines · Matti Vaittinen
struct
irq_domain*__irq_domain_add(structfwnode_handle*fwnode, unsigned int size,include/linux/irqdomain.h +1
-1irq_hw_number_t hwirq_max, int direct_max, const struct irq_domain_ops *ops, - void *host_data); + void *host_data, const char *name_suffix); struct irq_domain *irq_domain_create_simple(struct fwnode_handle *fwnode, unsigned int size, unsigned int first_irq,
include/linux/irqdomain.h static inline struct irq_domain *irq_domain_add_linear(struct device_node *of_no · line 354
Quoted 6 lines
include/linux/irqdomain.h +2
-1@@ -350,7 +350,8 @@ static inline struct irq_domain *irq_domain_add_linear(struct device_node *of_noconst struct irq_domain_ops *ops, void *host_data) { - return __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, host_data); + return __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, +host_data ,NULL );
....
Looking at the resulting amount of churn to add that argument, I'm not really enthused. There is some other unrelated change required in this area:
https://lore.kernel.org/all/8734pr5yq1.ffs@tglx
My suggestion to convert all of this mess into a template based mechanism would nicely solve your problem too.
Can you please have a look and eventually team up with Herve (CC'ed) to sort this out? I'm happy to help and give guidance.
Thanks,
tglx
Matti Vaittinen
maintainerRe: [PATCH v3 07/10] irqdomain: Allow giving name suffix for domain
Hello Thomas, Herve.
Quoted 21 lines · Thomas Gleixner
Matti!
Quoted 15 lines · Matti Vaittinen
struct
irq_domain*__irq_domain_add(structfwnode_handle*fwnode, unsigned int size,
irq_hw_number_thwirq_max, intdirect_max, const structirq_domain_ops*ops,include/linux/irqdomain.h +3
-2- void *host_data); + void *host_data, const char *name_suffix); struct irq_domain *irq_domain_create_simple(struct fwnode_handle *fwnode, unsigned int size, unsigned int first_irq,@@ -350,7 +350,8 @@ static inline struct irq_domain *irq_domain_add_linear(struct device_node *of_noconst struct irq_domain_ops *ops, void *host_data) { - return __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, host_data); + return __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, +host_data ,NULL );....
Quoted 8 lines
Looking at the resulting amount of churn to add that argument, I'm not really enthused. There is some other unrelated change required in this area:
https://lore.kernel.org/all/8734pr5yq1.ffs@tglxMy suggestion to convert all of this mess into a template based mechanism would nicely solve your problem too.
I am not entirely sure what you mean by template based in this context. My brains are somehow fixed to start thinking of C++ templates, or C macro magic with typeof() and I just can't get past that.
Anyways, what I picked from discussion between you and Herve, is using an initialization structure (struct irq_domain_info) for the new domain creation function (irq_domain_instantiate()) instead of adding bunch of functions with quite a few separate arguments. So, I assume you're referring to a possibility to add the name-suffix in this initialization structure? I hope I got this right.
I assume there is no intention to change the existing public irq_domain_creat_foo() APIs to use the new irq_domain_info - and change all the callers(?) But I think changing the internal __irq_domain_create() to use this new info struct should be very much doable - although, in my opinion, making existing callers of the __irq_domain_create() to assign their parameters to this struct so they can pass it to __irq_domain_create() does not seem so nice.
So, even though I am not really happy about the delay (I secretly hoped to get the series merged before my summer vacations ;) ) - I admit your suggested change looks cleaner (again, at least to me).
Herve, do you have any idea when you plan to do further sketching on this? Do you want me to try seeing if I can add the struct irq_domain_info and maybe use that in the __irq_domain_add() to get the name-suffix added? I might be able to send one version out during next week - but then I plan to be offline for couple of weeks ... so it may be I am not much of a help here.
Quoted 2 lines
Can you please have a look and eventually team up with Herve (CC'ed) to sort this out? I'm happy to help and give guidance.
I appreciate the guidance! Thanks Thomas.
Yours,
-- Matti
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Re: [PATCH v3 07/10] irqdomain: Allow giving name suffix for domain
Hi Matti,
On Fri, 7 Jun 2024 09:38:31 +0300
Matti Vaittinen <[email protected]> wrote:
...
Quoted 7 lines
Herve, do you have any idea when you plan to do further sketching on this? Do you want me to try seeing if I can add the struct
irq_domain_infoand maybe use that in the__irq_domain_add()to get the name-suffix added? I might be able to send one version out during next week - but then I plan to be offline for couple of weeks ... so it may be I am not much of a help here.
On my side, I plan to work on it next week too.
If you are off a couple of weeks after, I think I can start and move forward on this topic.
Best regards,
Hervé
Signature · 3 lines
Hervé Codina, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
Matti Vaittinen
maintainerRe: [PATCH v3 07/10] irqdomain: Allow giving name suffix for domain
Quoted 15 lines · Herve Codina
Hi Matti,
On Fri, 7 Jun 2024 09:38:31 +0300
Matti Vaittinen <[email protected]> wrote:...
Quoted 7 lines
Herve, do you have any idea when you plan to do further sketching on this? Do you want me to try seeing if I can add the struct
irq_domain_infoand maybe use that in the__irq_domain_add()to get the name-suffix added? I might be able to send one version out during next week - but then I plan to be offline for couple of weeks ... so it may be I am not much of a help here.
Quoted 3 lines
On my side, I plan to work on it next week too.
If you are off a couple of weeks after, I think I can start and move forward on this topic.
Thanks for the prompt reply and thanks for working with this :) I'll leave it to you for now then, as I don't think it makes much sense to intentionally do conflicting changes. I'll see what you've been up to when I return to the keyboard :) I'd appreciated if you added me to CC when sending the irqdomain refactoring patches (but I can dig them up if you don't).
Have fun!
Yours,
-- Matti
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Re: [PATCH v3 07/10] irqdomain: Allow giving name suffix for domain
Quoted 20 lines · On Fri, 7 Jun 2024 11:49:07 +0300 Matti Vaittinen <[email protected]>…
Quoted 15 lines · Herve Codina
Hi Matti,
On Fri, 7 Jun 2024 09:38:31 +0300
Matti Vaittinen <[email protected]> wrote:...
Quoted 7 lines
Herve, do you have any idea when you plan to do further sketching on this? Do you want me to try seeing if I can add the struct
irq_domain_infoand maybe use that in the__irq_domain_add()to get the name-suffix added? I might be able to send one version out during next week - but then I plan to be offline for couple of weeks ... so it may be I am not much of a help here.Quoted 3 lines
On my side, I plan to work on it next week too.
If you are off a couple of weeks after, I think I can start and move forward on this topic.
Quoted 6 lines
Thanks for the prompt reply and thanks for working with this :) I'll leave it to you for now then, as I don't think it makes much sense to intentionally do conflicting changes. I'll see what you've been up to when I return to the keyboard :) I'd appreciated if you added me to CC when sending the irqdomain refactoring patches (but I can dig them up if you don't).
Sure, you will CC you.
Also, I am not sure that I will perfectly take into account your use-case but it should not be a big deal to add it on top of my commits afterwards.
Quoted 3 lines
Have fun!
Cheers,
Hervé
Matti Vaittinen
maintainerRe: [PATCH v3 07/10] irqdomain: Allow giving name suffix for domain
Quoted 23 lines · Herve Codina
Quoted 20 lines · On Fri, 7 Jun 2024 11:49:07 +0300 Matti Vaittinen <[email protected]>…
Quoted 18 lines · Herve Codina
Hi Matti,
On Fri, 7 Jun 2024 09:38:31 +0300
Matti Vaittinen <[email protected]> wrote:...
Quoted 7 lines
Herve, do you have any idea when you plan to do further sketching on this? Do you want me to try seeing if I can add the struct
irq_domain_infoand maybe use that in the__irq_domain_add()to get the name-suffix added? I might be able to send one version out during next week - but then I plan to be offline for couple of weeks ... so it may be I am not much of a help here.On my side, I plan to work on it next week too.
If you are off a couple of weeks after, I think I can start and move forward on this topic.
Quoted 8 lines
Quoted 6 lines
Thanks for the prompt reply and thanks for working with this :) I'll leave it to you for now then, as I don't think it makes much sense to intentionally do conflicting changes. I'll see what you've been up to when I return to the keyboard :) I'd appreciated if you added me to CC when sending the irqdomain refactoring patches (but I can dig them up if you don't).
Sure, you will CC you.
Thanks!
Quoted 2 lines
Also, I am not sure that I will perfectly take into account your use-case but it should not be a big deal to add it on top of my commits afterwards.
No problem! That's just fine :)
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Lee Jones
maintainerRe: [PATCH v3 03/10] mfd: support ROHM BD96801 PMIC core
In reply to Matti VaittinenQuoted 25 lines · Matti Vaittinen
The ROHM BD96801 PMIC is highly customizable automotive grade PMIC which integrates regulator and watchdog funtionalities.
Provide INTB IRQ and register accesses for regulator/watchdog drivers.
Signed-off-by Matti Vaittinen <[email protected]>---
Changelog:
v2 =>:
- No changesv1 => v2:
- Drop unused enum
- Improve error prints
- improve commentsRFCv2 => v1:
- drop ERRB interrupts (for now)
- bd96801: Unlock registers in core driverChangelog: RFCv1 => RFCv2
- Work-around the IRQ domain name conflict
- Add watchdog IRQ
- Various styling fixes based on review by Lee
Quoted 9 lines
--- drivers/mfd/Kconfig | 13 ++ drivers/mfd/Makefile | 1 + drivers/mfd/rohm-bd96801.c | 273 +++++++++++++++++++++++++++++++ include/linux/mfd/rohm-bd96801.h | 215 ++++++++++++++++++++++++ include/linux/mfd/rohm-generic.h | 1 + 5 files changed, 503 insertions(+) create mode 100644 drivers/mfd/rohm-bd96801.c create mode 100644 include/linux/mfd/rohm-bd96801.h
Pretty nice. Uses generic interfaces. Just a couple of nits.
Quoted 79 lines
drivers/mfd/Kconfig +13
-0@@ -2089,6 +2089,19 @@ config MFD_ROHM_BD957XMUF BD9573MUF Power Management ICs. BD9576 and BD9573 are primarily designed to be used to power R-Car series processors. +config MFD_ROHM_BD96801 + tristate "ROHM BD96801 Power Management IC" + depends on I2C=y + depends on OF + select REGMAP_I2C + select REGMAP_IRQ + select MFD_CORE + help + Select this option to get support for the ROHM BD96801 Power + Management IC. The ROHM BD96801 is a highly scalable Power Management + IC for industrial and automotive use. The BD96801 can be used as a + master PMIC in a chained PMIC solution with suitable companion PMICs. + config MFD_STM32_LPTIMER tristate "Support for STM32 Low-Power Timer" depends on (ARCH_STM32 && OF) || COMPILE_TESTdrivers/mfd/Makefile +1
-0@@ -264,6 +264,7 @@ obj-$(CONFIG_RAVE_SP_CORE) += rave-sp.o obj-$(CONFIG_MFD_ROHM_BD71828) += rohm-bd71828.o obj-$(CONFIG_MFD_ROHM_BD718XX) += rohm-bd718x7.o obj-$(CONFIG_MFD_ROHM_BD957XMUF) += rohm-bd9576.o +obj-$(CONFIG_MFD_ROHM_BD96801) += rohm-bd96801.o obj-$(CONFIG_MFD_STMFX) += stmfx.o obj-$(CONFIG_MFD_KHADAS_MCU) += khadas-mcu.o obj-$(CONFIG_MFD_ACER_A500_EC) += acer-ec-a500.odrivers/mfd/rohm-bd96801.c new file +37
-0@@ -0,0 +1,273 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (C) 2024 ROHM Semiconductors +* +* ROHM BD96801 PMIC driver +* +* This version of the "BD86801 scalable PMIC"'s driver supports only very +* basic set of the PMIC features. Most notably, there is no support for +* the ERRB interrupt and the configurations which should be done when the +* PMIC is in STBY mode. +* +* Supporting the ERRB interrupt would require dropping the regmap-IRQ +* usage or working around (or accepting a presense of) a naming conflict +* in debugFS IRQs. +* +* Being able to reliably do the configurations like changing the +* regulator safety limits (like limits for the over/under -voltages, over +* current, thermal protection) would require the configuring driver to be +* synchronized with entity causing the PMIC state transitions. Eg, one +* should be able to ensure the PMIC is in STBY state when the +* configurations are applied to the hardware. How and when the PMIC state +* transitions are to be done is likely to be very system specific, as will +* be the need to configure these safety limits. Hence it's not simple to +* come up with a generic solution. +* +* Users who require the ERRB handling and STBY state configurations can +* have a look at the original RFC: +* https://lore.kernel.org/all/[email protected]/ +* which implements a workaround to debugFS naming conflict and some of +* the safety limit configurations - but leaves the state change handling +* and synchronization to be implemented. +* +* It would be great to hear (and receive a patch!) if you implement the +* STBY configuration support or a proper fix to the debugFS naming +* conflict in your downstream driver ;) +*/ +
drivers/mfd/rohm-bd96801.c line 47
Quoted 10 lines
drivers/mfd/rohm-bd96801.c new file +10
-0+#include <linux/i2c.h> +#include <linux/interrupt.h> +#include <linux/mfd/core.h> +#include <linux/module.h> +#include <linux/property.h> +#include <linux/regmap.h> +#include <linux/types.h> + +#include <linux/mfd/rohm-bd96801.h> +#include <linux/mfd/rohm-generic.h>
Nit: '\n'
Quoted 39 lines
drivers/mfd/rohm-bd96801.c new file +39
-0+static const struct resource regulator_intb_irqs[] = { +DEFINE_RES_IRQ_NAMED (BD96801_TW_STAT ,"bd96801-core-thermal" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_OCPH_STAT ,"bd96801-buck1-overcurr-h" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_OCPL_STAT ,"bd96801-buck1-overcurr-l" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_OCPN_STAT ,"bd96801-buck1-overcurr-n" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_OVD_STAT ,"bd96801-buck1-overvolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_UVD_STAT ,"bd96801-buck1-undervolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_TW_CH_STAT ,"bd96801-buck1-thermal" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_OCPH_STAT ,"bd96801-buck2-overcurr-h" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_OCPL_STAT ,"bd96801-buck2-overcurr-l" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_OCPN_STAT ,"bd96801-buck2-overcurr-n" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_OVD_STAT ,"bd96801-buck2-overvolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_UVD_STAT ,"bd96801-buck2-undervolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_TW_CH_STAT ,"bd96801-buck2-thermal" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_OCPH_STAT ,"bd96801-buck3-overcurr-h" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_OCPL_STAT ,"bd96801-buck3-overcurr-l" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_OCPN_STAT ,"bd96801-buck3-overcurr-n" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_OVD_STAT ,"bd96801-buck3-overvolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_UVD_STAT ,"bd96801-buck3-undervolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_TW_CH_STAT ,"bd96801-buck3-thermal" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_OCPH_STAT ,"bd96801-buck4-overcurr-h" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_OCPL_STAT ,"bd96801-buck4-overcurr-l" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_OCPN_STAT ,"bd96801-buck4-overcurr-n" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_OVD_STAT ,"bd96801-buck4-overvolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_UVD_STAT ,"bd96801-buck4-undervolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_TW_CH_STAT ,"bd96801-buck4-thermal" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_OCPH_STAT ,"bd96801-ldo5-overcurr" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_OVD_STAT ,"bd96801-ldo5-overvolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_UVD_STAT ,"bd96801-ldo5-undervolt" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_OCPH_STAT ,"bd96801-ldo6-overcurr" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_OVD_STAT ,"bd96801-ldo6-overvolt" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_UVD_STAT ,"bd96801-ldo6-undervolt" ), +
drivers/mfd/rohm-bd96801.c line 96
Quoted 10 lines
drivers/mfd/rohm-bd96801.c new file +10
-0+DEFINE_RES_IRQ_NAMED (BD96801_LDO7_OCPH_STAT ,"bd96801-ldo7-overcurr" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_OVD_STAT ,"bd96801-ldo7-overvolt" ), + DEFINE_RES_IRQ_NAMED(BD96801_LDO7_UVD_STAT, "bd96801-ldo7-undervolt"), +}; + +static const struct resource wdg_intb_irqs[] = { +DEFINE_RES_IRQ_NAMED (BD96801_WDT_ERR_STAT ,"bd96801-wdg" ), +}; + +static struct mfd_cell bd96801_mfd_cells[] = {
This is an MFD driver, you can drop the 'mfd_' part.
drivers/mfd/rohm-bd96801.c line 102
Quoted 6 lines
drivers/mfd/rohm-bd96801.c new file +6
-0+ { + .name = "bd96801-wdt", + .resources = wdg_intb_irqs, + .num_resources = ARRAY_SIZE(wdg_intb_irqs), + }, { + .name = "bd96801-pmic",
I thought this was the PMIC?
What is this device? Regulators?
"bd96801-regulator"?
Quoted 124 lines
drivers/mfd/rohm-bd96801.c new file +124
-0+ .resources = regulator_intb_irqs, + .num_resources = ARRAY_SIZE(regulator_intb_irqs), + }, +}; + +static const struct regmap_range bd96801_volatile_ranges[] = { +/* Status registers */ +regmap_reg_range (BD96801_REG_WD_FEED ,BD96801_REG_WD_FAILCOUNT ), +regmap_reg_range (BD96801_REG_WD_ASK ,BD96801_REG_WD_ASK ), +regmap_reg_range (BD96801_REG_WD_STATUS ,BD96801_REG_WD_STATUS ), +regmap_reg_range (BD96801_REG_PMIC_STATE ,BD96801_REG_INT_LDO7_INTB ), +/* Registers which do not update value unless PMIC is in STBY */ +regmap_reg_range (BD96801_REG_SSCG_CTRL ,BD96801_REG_SHD_INTB ), +regmap_reg_range (BD96801_REG_BUCK_OVP ,BD96801_REG_BOOT_OVERTIME ), +/* +* LDO control registers have single bit (LDO MODE) which does not +* change when we write it unless PMIC is in STBY. It's safer to not +* cache it. +*/ +regmap_reg_range (BD96801_LDO5_VOL_LVL_REG ,BD96801_LDO7_VOL_LVL_REG ), +}; + +static const struct regmap_access_table volatile_regs = { + .yes_ranges = bd96801_volatile_ranges, + .n_yes_ranges =ARRAY_SIZE (bd96801_volatile_ranges), +}; + +static const struct regmap_irq bd96801_intb_irqs[] = { +/* STATUS SYSTEM INTB */ +REGMAP_IRQ_REG (BD96801_TW_STAT ,0 ,BD96801_TW_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_WDT_ERR_STAT ,0 ,BD96801_WDT_ERR_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_I2C_ERR_STAT ,0 ,BD96801_I2C_ERR_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_CHIP_IF_ERR_STAT ,0 ,BD96801_CHIP_IF_ERR_STAT_MASK ), +/* STATUS BUCK1 INTB */ +REGMAP_IRQ_REG (BD96801_BUCK1_OCPH_STAT ,1 ,BD96801_BUCK_OCPH_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_OCPL_STAT ,1 ,BD96801_BUCK_OCPL_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_OCPN_STAT ,1 ,BD96801_BUCK_OCPN_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_OVD_STAT ,1 ,BD96801_BUCK_OVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_UVD_STAT ,1 ,BD96801_BUCK_UVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_TW_CH_STAT ,1 ,BD96801_BUCK_TW_CH_STAT_MASK ), +/* BUCK 2 INTB */ +REGMAP_IRQ_REG (BD96801_BUCK2_OCPH_STAT ,2 ,BD96801_BUCK_OCPH_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_OCPL_STAT ,2 ,BD96801_BUCK_OCPL_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_OCPN_STAT ,2 ,BD96801_BUCK_OCPN_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_OVD_STAT ,2 ,BD96801_BUCK_OVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_UVD_STAT ,2 ,BD96801_BUCK_UVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_TW_CH_STAT ,2 ,BD96801_BUCK_TW_CH_STAT_MASK ), +/* BUCK 3 INTB */ +REGMAP_IRQ_REG (BD96801_BUCK3_OCPH_STAT ,3 ,BD96801_BUCK_OCPH_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_OCPL_STAT ,3 ,BD96801_BUCK_OCPL_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_OCPN_STAT ,3 ,BD96801_BUCK_OCPN_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_OVD_STAT ,3 ,BD96801_BUCK_OVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_UVD_STAT ,3 ,BD96801_BUCK_UVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_TW_CH_STAT ,3 ,BD96801_BUCK_TW_CH_STAT_MASK ), +/* BUCK 4 INTB */ +REGMAP_IRQ_REG (BD96801_BUCK4_OCPH_STAT ,4 ,BD96801_BUCK_OCPH_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_OCPL_STAT ,4 ,BD96801_BUCK_OCPL_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_OCPN_STAT ,4 ,BD96801_BUCK_OCPN_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_OVD_STAT ,4 ,BD96801_BUCK_OVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_UVD_STAT ,4 ,BD96801_BUCK_UVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_TW_CH_STAT ,4 ,BD96801_BUCK_TW_CH_STAT_MASK ), +/* LDO5 INTB */ +REGMAP_IRQ_REG (BD96801_LDO5_OCPH_STAT ,5 ,BD96801_LDO_OCPH_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_OVD_STAT ,5 ,BD96801_LDO_OVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_UVD_STAT ,5 ,BD96801_LDO_UVD_STAT_MASK ), +/* LDO6 INTB */ +REGMAP_IRQ_REG (BD96801_LDO6_OCPH_STAT ,6 ,BD96801_LDO_OCPH_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_OVD_STAT ,6 ,BD96801_LDO_OVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_UVD_STAT ,6 ,BD96801_LDO_UVD_STAT_MASK ), +/* LDO7 INTB */ +REGMAP_IRQ_REG (BD96801_LDO7_OCPH_STAT ,7 ,BD96801_LDO_OCPH_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_OVD_STAT ,7 ,BD96801_LDO_OVD_STAT_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_UVD_STAT ,7 ,BD96801_LDO_UVD_STAT_MASK ), +}; + +static struct regmap_irq_chip bd96801_irq_chip_intb = { + .name ="bd96801-irq-intb" , + .main_status =BD96801_REG_INT_MAIN , + .num_main_regs =1 , + .irqs = &bd96801_intb_irqs[0 ], + .num_irqs =ARRAY_SIZE (bd96801_intb_irqs), + .status_base =BD96801_REG_INT_SYS_INTB , + .mask_base =BD96801_REG_MASK_SYS_INTB , + .ack_base =BD96801_REG_INT_SYS_INTB , + .init_ack_masked = true, + .num_regs =8 , + .irq_reg_stride =1 , +}; + +static const struct regmap_config bd96801_regmap_config = { + .reg_bits =8 , + .val_bits =8 , + .volatile_table = &volatile_regs, + .cache_type =REGCACHE_RBTREE , +}; + +static int bd96801_i2c_probe (struct i2c_client *i2c) +{ +struct regmap_irq_chip_data *intb_irq_data; +const struct fwnode_handle *fwnode; +struct irq_domain *intb_domain; +struct regmap *regmap; +int ret, intb_irq; + + fwnode =dev_fwnode (&i2c->dev); +if (!fwnode) +return dev_err_probe (&i2c->dev, -EINVAL ,"Failed to find fwnode\n" ); + + intb_irq =fwnode_irq_get_byname (fwnode,"intb" ); +if (intb_irq <0 ) +return dev_err_probe (&i2c->dev, intb_irq,"INTB IRQ not configured\n" ); + + regmap =devm_regmap_init_i2c (i2c, &bd96801_regmap_config); +if (IS_ERR (regmap)) +return dev_err_probe (&i2c->dev,PTR_ERR (regmap), +"Regmap initialization failed\n" ); + + ret =regmap_write (regmap,BD96801_LOCK_REG ,BD96801_UNLOCK ); +if (ret) +return dev_err_probe (&i2c->dev, ret,"Failed to unlock PMIC\n" ); + + ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, intb_irq, +IRQF_ONESHOT ,0 , &bd96801_irq_chip_intb, + &intb_irq_data);
drivers/mfd/rohm-bd96801.c line 236
Quoted 10 lines
drivers/mfd/rohm-bd96801.c new file +10
-0+if (ret) +return dev_err_probe (&i2c->dev, ret,"Failed to add INTB IRQ chip\n" ); + + intb_domain =regmap_irq_get_domain (intb_irq_data); + + ret =devm_mfd_add_devices (&i2c->dev,PLATFORM_DEVID_AUTO , + bd96801_mfd_cells, +ARRAY_SIZE (bd96801_mfd_cells),NULL ,0 , + intb_domain); +
Remove this line.
Quoted 285 lines
drivers/mfd/rohm-bd96801.c new file +37
-0+if (ret) +dev_err (&i2c->dev,"Failed to create subdevices\n" ); + +return ret; +} + +static const struct of_device_id bd96801_of_match[] = { + { .compatible ="rohm,bd96801" , }, + { } +}; +MODULE_DEVICE_TABLE (of, bd96801_of_match); + +static struct i2c_driver bd96801_i2c_driver = { + .driver = { + .name ="rohm-bd96801" , + .of_match_table = bd96801_of_match, + }, + .probe = bd96801_i2c_probe, +}; + +static int __init bd96801_i2c_init (void ) +{ +return i2c_add_driver (&bd96801_i2c_driver); +} + +/* Initialise early so consumer devices can complete system boot */ +subsys_initcall (bd96801_i2c_init); + +static void __exit bd96801_i2c_exit(void) +{ +i2c_del_driver (&bd96801_i2c_driver); +} +module_exit (bd96801_i2c_exit); + +MODULE_AUTHOR ("Matti Vaittinen <[email protected]>" ); +MODULE_DESCRIPTION ("ROHM BD96801 Power Management IC driver" ); +MODULE_LICENSE ("GPL" );include/linux/mfd/rohm-bd96801.h new file +215
-0@@ -0,0 +1,215 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Copyright (C) 2024 ROHM Semiconductors */ + +#ifndef __MFD_BD96801_H__ +#define __MFD_BD96801_H__ + +#define BD96801_REG_SSCG_CTRL 0x09 +#define BD96801_REG_SHD_INTB 0x20 +#define BD96801_LDO5_VOL_LVL_REG 0x2c +#define BD96801_LDO6_VOL_LVL_REG 0x2d +#define BD96801_LDO7_VOL_LVL_REG 0x2e +#define BD96801_REG_BUCK_OVP 0x30 +#define BD96801_REG_BUCK_OVD 0x35 +#define BD96801_REG_LDO_OVP 0x31 +#define BD96801_REG_LDO_OVD 0x36 +#define BD96801_REG_BOOT_OVERTIME 0x3a +#define BD96801_REG_WD_TMO 0x40 +#define BD96801_REG_WD_CONF 0x41 +#define BD96801_REG_WD_FEED 0x42 +#define BD96801_REG_WD_FAILCOUNT 0x43 +#define BD96801_REG_WD_ASK 0x46 +#define BD96801_REG_WD_STATUS 0x4a +#define BD96801_REG_PMIC_STATE 0x4f +#define BD96801_REG_EXT_STATE 0x50 + +#define BD96801_STATE_STBY 0x09 + +#define BD96801_LOCK_REG 0x04 +#define BD96801_UNLOCK 0x9d +#define BD96801_LOCK 0x00 + +/* IRQ register area */ +#define BD96801_REG_INT_MAIN 0x51 + +/* +* The BD96801 has two physical IRQ lines, INTB and ERRB. +* +* The 'main status register' is located at 0x51. +* The ERRB status registers are located at 0x52 ... 0x5B +* INTB status registers are at range 0x5c ... 0x63 +*/ +#define BD96801_REG_INT_SYS_ERRB1 0x52 +#define BD96801_REG_INT_SYS_INTB 0x5c +#define BD96801_REG_INT_LDO7_INTB 0x63 + +/* MASK registers */ +#define BD96801_REG_MASK_SYS_INTB 0x73 +#define BD96801_REG_MASK_SYS_ERRB 0x69 + +#define BD96801_MAX_REGISTER 0x7a + +#define BD96801_OTP_ERR_MASK BIT(0) +#define BD96801_DBIST_ERR_MASK BIT(1) +#define BD96801_EEP_ERR_MASK BIT(2) +#define BD96801_ABIST_ERR_MASK BIT(3) +#define BD96801_PRSTB_ERR_MASK BIT(4) +#define BD96801_DRMOS1_ERR_MASK BIT(5) +#define BD96801_DRMOS2_ERR_MASK BIT(6) +#define BD96801_SLAVE_ERR_MASK BIT(7) +#define BD96801_VREF_ERR_MASK BIT(0) +#define BD96801_TSD_ERR_MASK BIT(1) +#define BD96801_UVLO_ERR_MASK BIT(2) +#define BD96801_OVLO_ERR_MASK BIT(3) +#define BD96801_OSC_ERR_MASK BIT(4) +#define BD96801_PON_ERR_MASK BIT(5) +#define BD96801_POFF_ERR_MASK BIT(6) +#define BD96801_CMD_SHDN_ERR_MASK BIT(7) +#define BD96801_INT_PRSTB_WDT_ERR_MASK BIT(0) +#define BD96801_INT_CHIP_IF_ERR_MASK BIT(3) +#define BD96801_INT_SHDN_ERR_MASK BIT(7) +#define BD96801_OUT_PVIN_ERR_MASK BIT(0) +#define BD96801_OUT_OVP_ERR_MASK BIT(1) +#define BD96801_OUT_UVP_ERR_MASK BIT(2) +#define BD96801_OUT_SHDN_ERR_MASK BIT(7) + +/* ERRB IRQs */ +enum { +/* Reg 0x52, 0x53, 0x54 - ERRB system IRQs */ +BD96801_OTP_ERR_STAT , +BD96801_DBIST_ERR_STAT , +BD96801_EEP_ERR_STAT , +BD96801_ABIST_ERR_STAT , +BD96801_PRSTB_ERR_STAT , +BD96801_DRMOS1_ERR_STAT , +BD96801_DRMOS2_ERR_STAT , +BD96801_SLAVE_ERR_STAT , +BD96801_VREF_ERR_STAT , +BD96801_TSD_ERR_STAT , +BD96801_UVLO_ERR_STAT , +BD96801_OVLO_ERR_STAT , +BD96801_OSC_ERR_STAT , +BD96801_PON_ERR_STAT , +BD96801_POFF_ERR_STAT , +BD96801_CMD_SHDN_ERR_STAT , +BD96801_INT_PRSTB_WDT_ERR , +BD96801_INT_CHIP_IF_ERR , +BD96801_INT_SHDN_ERR_STAT , + +/* Reg 0x55 BUCK1 ERR IRQs */ +BD96801_BUCK1_PVIN_ERR_STAT , +BD96801_BUCK1_OVP_ERR_STAT , +BD96801_BUCK1_UVP_ERR_STAT , +BD96801_BUCK1_SHDN_ERR_STAT , + +/* Reg 0x56 BUCK2 ERR IRQs */ +BD96801_BUCK2_PVIN_ERR_STAT , +BD96801_BUCK2_OVP_ERR_STAT , +BD96801_BUCK2_UVP_ERR_STAT , +BD96801_BUCK2_SHDN_ERR_STAT , + +/* Reg 0x57 BUCK3 ERR IRQs */ +BD96801_BUCK3_PVIN_ERR_STAT , +BD96801_BUCK3_OVP_ERR_STAT , +BD96801_BUCK3_UVP_ERR_STAT , +BD96801_BUCK3_SHDN_ERR_STAT , + +/* Reg 0x58 BUCK4 ERR IRQs */ +BD96801_BUCK4_PVIN_ERR_STAT , +BD96801_BUCK4_OVP_ERR_STAT , +BD96801_BUCK4_UVP_ERR_STAT , +BD96801_BUCK4_SHDN_ERR_STAT , + +/* Reg 0x59 LDO5 ERR IRQs */ +BD96801_LDO5_PVIN_ERR_STAT , +BD96801_LDO5_OVP_ERR_STAT , +BD96801_LDO5_UVP_ERR_STAT , +BD96801_LDO5_SHDN_ERR_STAT , + +/* Reg 0x5a LDO6 ERR IRQs */ +BD96801_LDO6_PVIN_ERR_STAT , +BD96801_LDO6_OVP_ERR_STAT , +BD96801_LDO6_UVP_ERR_STAT , +BD96801_LDO6_SHDN_ERR_STAT , + +/* Reg 0x5b LDO7 ERR IRQs */ +BD96801_LDO7_PVIN_ERR_STAT , +BD96801_LDO7_OVP_ERR_STAT , +BD96801_LDO7_UVP_ERR_STAT , +BD96801_LDO7_SHDN_ERR_STAT , +}; + +/* INTB IRQs */ +enum { +/* Reg 0x5c (System INTB) */ +BD96801_TW_STAT , +BD96801_WDT_ERR_STAT , +BD96801_I2C_ERR_STAT , +BD96801_CHIP_IF_ERR_STAT , + +/* Reg 0x5d (BUCK1 INTB) */ +BD96801_BUCK1_OCPH_STAT , +BD96801_BUCK1_OCPL_STAT , +BD96801_BUCK1_OCPN_STAT , +BD96801_BUCK1_OVD_STAT , +BD96801_BUCK1_UVD_STAT , +BD96801_BUCK1_TW_CH_STAT , + +/* Reg 0x5e (BUCK2 INTB) */ +BD96801_BUCK2_OCPH_STAT , +BD96801_BUCK2_OCPL_STAT , +BD96801_BUCK2_OCPN_STAT , +BD96801_BUCK2_OVD_STAT , +BD96801_BUCK2_UVD_STAT , +BD96801_BUCK2_TW_CH_STAT , + +/* Reg 0x5f (BUCK3 INTB)*/ +BD96801_BUCK3_OCPH_STAT , +BD96801_BUCK3_OCPL_STAT , +BD96801_BUCK3_OCPN_STAT , +BD96801_BUCK3_OVD_STAT , +BD96801_BUCK3_UVD_STAT , +BD96801_BUCK3_TW_CH_STAT , + +/* Reg 0x60 (BUCK4 INTB)*/ +BD96801_BUCK4_OCPH_STAT , +BD96801_BUCK4_OCPL_STAT , +BD96801_BUCK4_OCPN_STAT , +BD96801_BUCK4_OVD_STAT , +BD96801_BUCK4_UVD_STAT , +BD96801_BUCK4_TW_CH_STAT , + +/* Reg 0x61 (LDO5 INTB) */ +BD96801_LDO5_OCPH_STAT ,/* bit [0] */ +BD96801_LDO5_OVD_STAT ,/* bit [3] */ +BD96801_LDO5_UVD_STAT ,/* bit [4] */ + +/* Reg 0x62 (LDO6 INTB) */ +BD96801_LDO6_OCPH_STAT ,/* bit [0] */ +BD96801_LDO6_OVD_STAT ,/* bit [3] */ +BD96801_LDO6_UVD_STAT ,/* bit [4] */ + +/* Reg 0x63 (LDO7 INTB) */ +BD96801_LDO7_OCPH_STAT ,/* bit [0] */ +BD96801_LDO7_OVD_STAT ,/* bit [3] */ +BD96801_LDO7_UVD_STAT ,/* bit [4] */ +}; + +/* IRQ MASKs */ +#define BD96801_TW_STAT_MASK BIT(0) +#define BD96801_WDT_ERR_STAT_MASK BIT(1) +#define BD96801_I2C_ERR_STAT_MASK BIT(2) +#define BD96801_CHIP_IF_ERR_STAT_MASK BIT(3) + +#define BD96801_BUCK_OCPH_STAT_MASK BIT(0) +#define BD96801_BUCK_OCPL_STAT_MASK BIT(1) +#define BD96801_BUCK_OCPN_STAT_MASK BIT(2) +#define BD96801_BUCK_OVD_STAT_MASK BIT(3) +#define BD96801_BUCK_UVD_STAT_MASK BIT(4) +#define BD96801_BUCK_TW_CH_STAT_MASK BIT(5) + +#define BD96801_LDO_OCPH_STAT_MASK BIT(0) +#define BD96801_LDO_OVD_STAT_MASK BIT(3) +#define BD96801_LDO_UVD_STAT_MASK BIT(4) + +#endif include/linux/mfd/rohm-generic.h +1
-0@@ -16,6 +16,7 @@ enum rohm_chip_type {ROHM_CHIP_TYPE_BD71828 ,ROHM_CHIP_TYPE_BD71837 ,ROHM_CHIP_TYPE_BD71847 , +ROHM_CHIP_TYPE_BD96801 , ROHM_CHIP_TYPE_AMOUNT };Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Signature · 1 line
Lee Jones [李琼斯]
Lee Jones
maintainerRe: [PATCH v3 09/10] mfd: bd96801: Add ERRB IRQ
In reply to Matti VaittinenQuoted 28 lines · Matti Vaittinen
The ROHM BD96801 "scalable PMIC" provides two physical IRQs. The ERRB handling can in many cases be omitted because it is used to inform fatal IRQs, which usually kill the power from the SOC.
There may however be use-cases where the SOC has a 'back-up' emergency power source which allows some very short time of operation to try to gracefully shut down sensitive hardware. Furthermore, it is possible the processor controlling the PMIC is not powered by the PMIC. In such cases handling the ERRB IRQs may be beneficial.
Add support for ERRB IRQs.
Signed-off-by Matti Vaittinen <[email protected]>---
Revision history:
v2 =>:
- No changes
v1 => v2:
- New patch--- drivers/mfd/rohm-bd96801.c | 291 ++++++++++++++++++++++++++++++++----- 1 file changed, 253 insertions(+), 38 deletions(-)drivers/mfd/rohm-bd96801.c +0
-0
drivers/mfd/rohm-bd96801.c line 14
Quoted 10 lines
drivers/mfd/rohm-bd96801.c +0
-7@@ -5,13 +5,9 @@* ROHM BD96801 PMIC driver * * This version of the "BD86801 scalable PMIC"'s driver supports only very -* basic set of the PMIC features. Most notably, there is no support for -* the ERRB interrupt and the configurations which should be done when the -* PMIC is in STBY mode. -* -* Supporting the ERRB interrupt would require dropping the regmap-IRQ -* usage or working around (or accepting a presense of) a naming conflict -* in debugFS IRQs.
Why bother adding all that blurb in the first place?
Quoted 263 lines
drivers/mfd/rohm-bd96801.c +183
-21+* basic set of the PMIC features. +* Most notably, there is no support for the configurations which should +* be done when the PMIC is in STBY mode. * * Being able to reliably do the configurations like changing the * regulator safety limits (like limits for the over/under -voltages, over @@ -23,16 +19,14 @@* be the need to configure these safety limits. Hence it's not simple to * come up with a generic solution. * -* Users who require the ERRB handling and STBY state configurations can -* have a look at the original RFC: +* Users who require the STBY state configurations can have a look at the +* original RFC: * https://lore.kernel.org/all/[email protected]/ -* which implements a workaround to debugFS naming conflict and some of -* the safety limit configurations - but leaves the state change handling -* and synchronization to be implemented. +* which implements some of the safety limit configurations - but leaves the +* state change handling and synchronization to be implemented. * * It would be great to hear (and receive a patch!) if you implement the -* STBY configuration support or a proper fix to the debugFS naming -* conflict in your downstream driver ;) +* STBY configuration support or a proper fix in your downstream driver ;) */ #include <linux/i2c.h> @@ -45,6 +39,65 @@#include <linux/mfd/rohm-bd96801.h> #include <linux/mfd/rohm-generic.h> + +static const struct resource regulator_errb_irqs[] = { +DEFINE_RES_IRQ_NAMED (BD96801_OTP_ERR_STAT ,"bd96801-otp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_DBIST_ERR_STAT ,"bd96801-dbist-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_EEP_ERR_STAT ,"bd96801-eep-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_ABIST_ERR_STAT ,"bd96801-abist-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_PRSTB_ERR_STAT ,"bd96801-prstb-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_DRMOS1_ERR_STAT ,"bd96801-drmoserr1" ), +DEFINE_RES_IRQ_NAMED (BD96801_DRMOS2_ERR_STAT ,"bd96801-drmoserr2" ), +DEFINE_RES_IRQ_NAMED (BD96801_SLAVE_ERR_STAT ,"bd96801-slave-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_VREF_ERR_STAT ,"bd96801-vref-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_TSD_ERR_STAT ,"bd96801-tsd" ), +DEFINE_RES_IRQ_NAMED (BD96801_UVLO_ERR_STAT ,"bd96801-uvlo-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_OVLO_ERR_STAT ,"bd96801-ovlo-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_OSC_ERR_STAT ,"bd96801-osc-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_PON_ERR_STAT ,"bd96801-pon-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_POFF_ERR_STAT ,"bd96801-poff-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_CMD_SHDN_ERR_STAT ,"bd96801-cmd-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_INT_PRSTB_WDT_ERR ,"bd96801-prstb-wdt-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_INT_CHIP_IF_ERR ,"bd96801-chip-if-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_INT_SHDN_ERR_STAT ,"bd96801-int-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_PVIN_ERR_STAT ,"bd96801-buck1-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_OVP_ERR_STAT ,"bd96801-buck1-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_UVP_ERR_STAT ,"bd96801-buck1-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK1_SHDN_ERR_STAT ,"bd96801-buck1-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_PVIN_ERR_STAT ,"bd96801-buck2-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_OVP_ERR_STAT ,"bd96801-buck2-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_UVP_ERR_STAT ,"bd96801-buck2-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK2_SHDN_ERR_STAT ,"bd96801-buck2-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_PVIN_ERR_STAT ,"bd96801-buck3-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_OVP_ERR_STAT ,"bd96801-buck3-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_UVP_ERR_STAT ,"bd96801-buck3-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK3_SHDN_ERR_STAT ,"bd96801-buck3-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_PVIN_ERR_STAT ,"bd96801-buck4-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_OVP_ERR_STAT ,"bd96801-buck4-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_UVP_ERR_STAT ,"bd96801-buck4-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_BUCK4_SHDN_ERR_STAT ,"bd96801-buck4-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_PVIN_ERR_STAT ,"bd96801-ldo5-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_OVP_ERR_STAT ,"bd96801-ldo5-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_UVP_ERR_STAT ,"bd96801-ldo5-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO5_SHDN_ERR_STAT ,"bd96801-ldo5-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_PVIN_ERR_STAT ,"bd96801-ldo6-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_OVP_ERR_STAT ,"bd96801-ldo6-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_UVP_ERR_STAT ,"bd96801-ldo6-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO6_SHDN_ERR_STAT ,"bd96801-ldo6-shdn-err" ), + +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_PVIN_ERR_STAT ,"bd96801-ldo7-pvin-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_OVP_ERR_STAT ,"bd96801-ldo7-ovp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_UVP_ERR_STAT ,"bd96801-ldo7-uvp-err" ), +DEFINE_RES_IRQ_NAMED (BD96801_LDO7_SHDN_ERR_STAT ,"bd96801-ldo7-shdn-err" ), +}; +static const struct resource regulator_intb_irqs[] = {DEFINE_RES_IRQ_NAMED (BD96801_TW_STAT ,"bd96801-core-thermal" ),@@ -89,20 +142,14 @@ static const struct resource regulator_intb_irqs[] = { DEFINE_RES_IRQ_NAMED(BD96801_LDO7_UVD_STAT, "bd96801-ldo7-undervolt"), }; -static const struct resource wdg_intb_irqs[] = { -DEFINE_RES_IRQ_NAMED (BD96801_WDT_ERR_STAT ,"bd96801-wdg" ), +enum { +WDG_CELL =0 , +REGULATOR_CELL , };static struct mfd_cell bd96801_mfd_cells[] = { - { - .name ="bd96801-wdt" , - .resources = wdg_intb_irqs, - .num_resources =ARRAY_SIZE (wdg_intb_irqs), - }, { - .name ="bd96801-pmic" , - .resources = regulator_intb_irqs, - .num_resources =ARRAY_SIZE (regulator_intb_irqs), - }, + [WDG_CELL ] = { .name ="bd96801-wdt" , }, + [REGULATOR_CELL ] = { .name ="bd96801-pmic" , }, };static const struct regmap_range bd96801_volatile_ranges[] = {@@ -127,6 +174,91 @@ static const struct regmap_access_table volatile_regs = { .n_yes_ranges = ARRAY_SIZE(bd96801_volatile_ranges), }; +/* +* For ERRB we need main register bit mapping as bit(0) indicates active IRQ +* in one of the first 3 sub IRQ registers, For INTB we can use default 1 to 1 +* mapping. +*/ +static unsigned int bit0_offsets[] = {0 ,1 ,2 };/* System stat, 3 registers */ +static unsigned int bit1_offsets[] = {3 };/* Buck 1 stat */ +static unsigned int bit2_offsets[] = {4 };/* Buck 2 stat */ +static unsigned int bit3_offsets[] = {5 };/* Buck 3 stat */ +static unsigned int bit4_offsets[] = {6 };/* Buck 4 stat */ +static unsigned int bit5_offsets[] = {7 };/* LDO 5 stat */ +static unsigned int bit6_offsets[] = {8 };/* LDO 6 stat */ +static unsigned int bit7_offsets[] = {9 };/* LDO 7 stat */ + +static struct regmap_irq_sub_irq_map errb_sub_irq_offsets[] = { +REGMAP_IRQ_MAIN_REG_OFFSET (bit0_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit1_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit2_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit3_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit4_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit5_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit6_offsets), +REGMAP_IRQ_MAIN_REG_OFFSET (bit7_offsets), +}; + +static const struct regmap_irq bd96801_errb_irqs[] = { +/* Reg 0x52 Fatal ERRB1 */ +REGMAP_IRQ_REG (BD96801_OTP_ERR_STAT ,0 ,BD96801_OTP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_DBIST_ERR_STAT ,0 ,BD96801_DBIST_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_EEP_ERR_STAT ,0 ,BD96801_EEP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_ABIST_ERR_STAT ,0 ,BD96801_ABIST_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_PRSTB_ERR_STAT ,0 ,BD96801_PRSTB_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_DRMOS1_ERR_STAT ,0 ,BD96801_DRMOS1_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_DRMOS2_ERR_STAT ,0 ,BD96801_DRMOS2_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_SLAVE_ERR_STAT ,0 ,BD96801_SLAVE_ERR_MASK ), +/* 0x53 Fatal ERRB2 */ +REGMAP_IRQ_REG (BD96801_VREF_ERR_STAT ,1 ,BD96801_VREF_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_TSD_ERR_STAT ,1 ,BD96801_TSD_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_UVLO_ERR_STAT ,1 ,BD96801_UVLO_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_OVLO_ERR_STAT ,1 ,BD96801_OVLO_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_OSC_ERR_STAT ,1 ,BD96801_OSC_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_PON_ERR_STAT ,1 ,BD96801_PON_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_POFF_ERR_STAT ,1 ,BD96801_POFF_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_CMD_SHDN_ERR_STAT ,1 ,BD96801_CMD_SHDN_ERR_MASK ), +/* 0x54 Fatal INTB shadowed to ERRB */ +REGMAP_IRQ_REG (BD96801_INT_PRSTB_WDT_ERR ,2 ,BD96801_INT_PRSTB_WDT_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_INT_CHIP_IF_ERR ,2 ,BD96801_INT_CHIP_IF_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_INT_SHDN_ERR_STAT ,2 ,BD96801_INT_SHDN_ERR_MASK ), +/* Reg 0x55 BUCK1 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK1_PVIN_ERR_STAT ,3 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_OVP_ERR_STAT ,3 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_UVP_ERR_STAT ,3 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK1_SHDN_ERR_STAT ,3 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x56 BUCK2 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK2_PVIN_ERR_STAT ,4 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_OVP_ERR_STAT ,4 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_UVP_ERR_STAT ,4 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK2_SHDN_ERR_STAT ,4 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x57 BUCK3 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK3_PVIN_ERR_STAT ,5 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_OVP_ERR_STAT ,5 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_UVP_ERR_STAT ,5 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK3_SHDN_ERR_STAT ,5 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x58 BUCK4 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_BUCK4_PVIN_ERR_STAT ,6 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_OVP_ERR_STAT ,6 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_UVP_ERR_STAT ,6 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_BUCK4_SHDN_ERR_STAT ,6 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x59 LDO5 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_LDO5_PVIN_ERR_STAT ,7 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_OVP_ERR_STAT ,7 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_UVP_ERR_STAT ,7 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO5_SHDN_ERR_STAT ,7 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x5a LDO6 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_LDO6_PVIN_ERR_STAT ,8 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_OVP_ERR_STAT ,8 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_UVP_ERR_STAT ,8 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO6_SHDN_ERR_STAT ,8 ,BD96801_OUT_SHDN_ERR_MASK ), +/* Reg 0x5b LDO7 ERR IRQs */ +REGMAP_IRQ_REG (BD96801_LDO7_PVIN_ERR_STAT ,9 ,BD96801_OUT_PVIN_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_OVP_ERR_STAT ,9 ,BD96801_OUT_OVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_UVP_ERR_STAT ,9 ,BD96801_OUT_UVP_ERR_MASK ), +REGMAP_IRQ_REG (BD96801_LDO7_SHDN_ERR_STAT ,9 ,BD96801_OUT_SHDN_ERR_MASK ), +}; +static const struct regmap_irq bd96801_intb_irqs[] = {/* STATUS SYSTEM INTB */ REGMAP_IRQ_REG (BD96801_TW_STAT ,0 ,BD96801_TW_STAT_MASK ),@@ -175,8 +307,25 @@ static const struct regmap_irq bd96801_intb_irqs[] = { REGMAP_IRQ_REG(BD96801_LDO7_UVD_STAT, 7, BD96801_LDO_UVD_STAT_MASK), }; +static struct regmap_irq_chip bd96801_irq_chip_errb = { + .name ="bd96801-irq-errb" , + .domain_suffix ="errb" , + .main_status =BD96801_REG_INT_MAIN , + .num_main_regs =1 , + .irqs = &bd96801_errb_irqs[0 ], + .num_irqs =ARRAY_SIZE (bd96801_errb_irqs), + .status_base =BD96801_REG_INT_SYS_ERRB1 , + .mask_base =BD96801_REG_MASK_SYS_ERRB , + .ack_base =BD96801_REG_INT_SYS_ERRB1 , + .init_ack_masked = true, + .num_regs =10 , + .irq_reg_stride =1 , + .sub_reg_offsets = &errb_sub_irq_offsets[0 ], +}; +static struct regmap_irq_chip bd96801_irq_chip_intb = { .name ="bd96801-irq-intb" , + .domain_suffix ="intb" , .main_status =BD96801_REG_INT_MAIN , .num_main_regs =1 , .irqs = &bd96801_intb_irqs[0 ],@@ -198,11 +347,14 @@ static const struct regmap_config bd96801_regmap_config = {static int bd96801_i2c_probe (struct i2c_client *i2c) { -struct regmap_irq_chip_data *intb_irq_data; +int i, ret, intb_irq, errb_irq, num_regu_irqs, num_intb, num_errb =0 ; +int wdg_irq_no; +struct regmap_irq_chip_data *intb_irq_data, *errb_irq_data; +struct irq_domain *intb_domain, *errb_domain; +struct resource wdg_irq;const struct fwnode_handle *fwnode; -struct irq_domain *intb_domain; +struct resource *regulator_res;struct regmap *regmap; -int ret, intb_irq; fwnode =dev_fwnode (&i2c->dev);if (!fwnode)@@ -212,10 +364,28 @@ static int bd96801_i2c_probe(struct i2c_client *i2c)if (intb_irq <0 )return dev_err_probe (&i2c->dev, intb_irq,"INTB IRQ not configured\n" ); + num_intb =ARRAY_SIZE (regulator_intb_irqs); + +/* ERRB may be omitted if processor is powered by the PMIC */
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 379
Quoted 10 lines
drivers/mfd/rohm-bd96801.c +10
-0+ errb_irq =fwnode_irq_get_byname (fwnode,"errb" ); +if (errb_irq <0 ) + errb_irq =0 ; + +if (errb_irq) + num_errb =ARRAY_SIZE (regulator_errb_irqs); + + num_regu_irqs = num_intb + num_errb; + + regulator_res =kcalloc (num_regu_irqs,sizeof (*regulator_res),GFP_KERNEL );
Why not devm_* and omit the kfree()?
Quoted 41 lines
drivers/mfd/rohm-bd96801.c +20
-9+if (!regulator_res) +return -ENOMEM ; + regmap =devm_regmap_init_i2c (i2c, &bd96801_regmap_config); -if (IS_ERR (regmap)) -return dev_err_probe (&i2c->dev,PTR_ERR (regmap), +if (IS_ERR (regmap)) { + ret =dev_err_probe (&i2c->dev,PTR_ERR (regmap),"Regmap initialization failed\n" ); + goto free_out; + } ret =regmap_write (regmap,BD96801_LOCK_REG ,BD96801_UNLOCK );if (ret)@@ -224,18 +394,63 @@ static int bd96801_i2c_probe(struct i2c_client *i2c) ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, intb_irq,IRQF_ONESHOT ,0 , &bd96801_irq_chip_intb, &intb_irq_data); -if (ret) -return dev_err_probe (&i2c->dev, ret,"Failed to add INTB IRQ chip\n" ); +if (ret) { +dev_err_probe (&i2c->dev, ret,"Failed to add INTB irq_chip\n" ); + goto free_out; + } intb_domain =regmap_irq_get_domain (intb_irq_data); - ret =devm_mfd_add_devices (&i2c->dev,PLATFORM_DEVID_AUTO , - bd96801_mfd_cells, -ARRAY_SIZE (bd96801_mfd_cells),NULL ,0 , - intb_domain); - +/* +* MFD core code is built to handle only one IRQ domain. BD96801 +* has two domains so we do IRQ mapping here and provide the +* already mapped IRQ numbers to sub-devices. +*/ +for (i =0 ; i < num_intb; i++) { +struct resource *res = ®ulator_res[i]; + + *res = regulator_intb_irqs[i];
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 422
Quoted 10 lines
drivers/mfd/rohm-bd96801.c +10
-0+ res->start = res->end =irq_create_mapping (intb_domain, + res->start); + } + + wdg_irq_no =irq_create_mapping (intb_domain,BD96801_WDT_ERR_STAT ); + wdg_irq =DEFINE_RES_IRQ_NAMED (wdg_irq_no,"bd96801-wdg" ); + bd96801_mfd_cells[WDG_CELL ].resources = &wdg_irq; + bd96801_mfd_cells[WDG_CELL ].num_resources =1 ; + +if (num_errb) {
if (!num_errb) goto skip_errb;
Quoted 10 lines
drivers/mfd/rohm-bd96801.c +10
-0+ ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, errb_irq, +IRQF_ONESHOT ,0 , + &bd96801_irq_chip_errb, + &errb_irq_data); +if (ret) { +dev_err_probe (&i2c->dev, ret, +"Failed to add ERRB (%d) irq_chip\n" , + errb_irq); + goto free_out; + }
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 442
Quoted 10 lines
drivers/mfd/rohm-bd96801.c +10
-0+ errb_domain =regmap_irq_get_domain (errb_irq_data); + +for (i =0 ; i < num_errb; i++) { +struct resource *res = ®ulator_res[num_intb + i]; + + *res = regulator_errb_irqs[i]; + res->start = res->end =irq_create_mapping (errb_domain, + res->start); + } + }
skip_errb:
Quoted 29 lines
drivers/mfd/rohm-bd96801.c +9
-1+ bd96801_mfd_cells[REGULATOR_CELL ].resources = regulator_res; + bd96801_mfd_cells[REGULATOR_CELL ].num_resources = num_regu_irqs; + + ret =devm_mfd_add_devices (&i2c->dev,PLATFORM_DEVID_AUTO , bd96801_mfd_cells, +ARRAY_SIZE (bd96801_mfd_cells),NULL ,0 ,NULL );if (ret) -dev_err (&i2c->dev,"Failed to create subdevices\n" ); +dev_err_probe (&i2c->dev, ret,"Failed to create subdevices\n" ); + +free_out: +kfree (regulator_res);return ret; }Signature · 14 lines
2.45.1 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Signature · 1 line
Lee Jones [李琼斯]
Matti Vaittinen
maintainerRe: [PATCH v3 03/10] mfd: support ROHM BD96801 PMIC core
In reply to Lee JonesQuoted 37 lines · Lee Jones
Quoted 32 lines · Matti Vaittinen
The ROHM BD96801 PMIC is highly customizable automotive grade PMIC which integrates regulator and watchdog funtionalities.
Provide INTB IRQ and register accesses for regulator/watchdog drivers.
Signed-off-by Matti Vaittinen <[email protected]>---
Changelog:
v2 =>:
- No changesv1 => v2:
- Drop unused enum
- Improve error prints
- improve commentsRFCv2 => v1:
- drop ERRB interrupts (for now)
- bd96801: Unlock registers in core driverChangelog: RFCv1 => RFCv2
- Work-around the IRQ domain name conflict
- Add watchdog IRQ
- Various styling fixes based on review by Lee--- drivers/mfd/Kconfig | 13 ++ drivers/mfd/Makefile | 1 + drivers/mfd/rohm-bd96801.c | 273 +++++++++++++++++++++++++++++++ include/linux/mfd/rohm-bd96801.h | 215 ++++++++++++++++++++++++ include/linux/mfd/rohm-generic.h | 1 + 5 files changed, 503 insertions(+)Quoted 2 lines
create mode 100644
drivers/mfd/rohm-bd96801.ccreate mode 100644include/linux/mfd/rohm-bd96801.h
Quoted 1 line
Pretty nice. Uses generic interfaces. Just a couple of nits.
Thanks :)
I'll try to send the next version of this series Today. I will only include the patches 1-6, which I believe are pretty much good to be merged (but the watchdog has not yet been acked by Guenter so no guarantees), and which should result a working driver for many of the predicted use-cases. Then I plan to be mostly off of my computer for a few weeks. (I may do some very minor fixes.)
The 7-10 will have to wait until the irqdomain name conflict can be reasonably resolved. I plan to return to this when I'm back from my "off time", and when we see what direction the irqdomain work by Herve has evolved :)
...
Quoted 10 lines
drivers/mfd/rohm-bd96801.c line 102
Quoted 7 lines
drivers/mfd/rohm-bd96801.c new file +6
-0+ { + .name = "bd96801-wdt", + .resources = wdg_intb_irqs, + .num_resources = ARRAY_SIZE(wdg_intb_irqs), + }, { + .name = "bd96801-pmic",I thought this was the PMIC?
Quoted 3 lines
What is this device? Regulators?
"bd96801-regulator"?
Yep. Thanks!
Quoted 5 lines
drivers/mfd/rohm-bd96801.c line 106
Quoted 5 lines
drivers/mfd/rohm-bd96801.c new file +4
-0+ .resources = regulator_intb_irqs, + .num_resources = ARRAY_SIZE(regulator_intb_irqs), + }, +};
Yours,
-- Matti
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Matti Vaittinen
maintainerRe: [PATCH v3 09/10] mfd: bd96801: Add ERRB IRQ
In reply to Lee JonesQuoted 34 lines · Lee Jones
Quoted 32 lines · Matti Vaittinen
The ROHM BD96801 "scalable PMIC" provides two physical IRQs. The ERRB handling can in many cases be omitted because it is used to inform fatal IRQs, which usually kill the power from the SOC.
There may however be use-cases where the SOC has a 'back-up' emergency power source which allows some very short time of operation to try to gracefully shut down sensitive hardware. Furthermore, it is possible the processor controlling the PMIC is not powered by the PMIC. In such cases handling the ERRB IRQs may be beneficial.
Add support for ERRB IRQs.
Signed-off-by Matti Vaittinen <[email protected]>---
Revision history:
v2 =>:
- No changes
v1 => v2:
- New patch--- drivers/mfd/rohm-bd96801.c | 291 ++++++++++++++++++++++++++++++++----- 1 file changed, 253 insertions(+), 38 deletions(-)drivers/mfd/rohm-bd96801.c +0
-1@@ -5,13 +5,9 @@* ROHM BD96801 PMIC driver * * This version of the "BD86801 scalable PMIC"'s driver supports only very -* basic set of the PMIC features. Most notably, there is no support for
Quoted 8 lines
drivers/mfd/rohm-bd96801.c line 14
Quoted 6 lines
drivers/mfd/rohm-bd96801.c +0
-6-* the ERRB interrupt and the configurations which should be done when the -* PMIC is in STBY mode. -* -* Supporting the ERRB interrupt would require dropping the regmap-IRQ -* usage or working around (or accepting a presense of) a naming conflict -* in debugFS IRQs. Why bother adding all that blurb in the first place?
Because, I assume there are users who would like to have the ERRB in use. The main purpose of this comment is that any such users could
a) see this version does not support ERRB.
b) can find the original RFC with ERRB supportn and a workaround.
c) know why this version does not work with ERRB and thus fix this
It seems this ERRB support may be missing from upstream for a while, hence I think having this note is worthy until (if) this ERRB patch lands in upstream.
Quoted 27 lines
Quoted 27 lines
drivers/mfd/rohm-bd96801.c +8
-7+* basic set of the PMIC features. +* Most notably, there is no support for the configurations which should +* be done when the PMIC is in STBY mode. * * Being able to reliably do the configurations like changing the * regulator safety limits (like limits for the over/under -voltages, over @@ -23,16 +19,14 @@* be the need to configure these safety limits. Hence it's not simple to * come up with a generic solution. * -* Users who require the ERRB handling and STBY state configurations can -* have a look at the original RFC: +* Users who require the STBY state configurations can have a look at the +* original RFC: * https://lore.kernel.org/all/[email protected]/ -* which implements a workaround to debugFS naming conflict and some of -* the safety limit configurations - but leaves the state change handling -* and synchronization to be implemented. +* which implements some of the safety limit configurations - but leaves the +* state change handling and synchronization to be implemented. * * It would be great to hear (and receive a patch!) if you implement the -* STBY configuration support or a proper fix to the debugFS naming -* conflict in your downstream driver ;) +* STBY configuration support or a proper fix in your downstream driver ;) */
...
Quoted 20 lines
Quoted 20 lines
static int bd96801_i2c_probe(struct i2c_client *i2c) {drivers/mfd/rohm-bd96801.c +6
-3-struct regmap_irq_chip_data *intb_irq_data; +int i, ret, intb_irq, errb_irq, num_regu_irqs, num_intb, num_errb =0 ; +int wdg_irq_no; +struct regmap_irq_chip_data *intb_irq_data, *errb_irq_data; +struct irq_domain *intb_domain, *errb_domain; +struct resource wdg_irq;const struct fwnode_handle *fwnode; -struct irq_domain *intb_domain; +struct resource *regulator_res;struct regmap *regmap; -int ret, intb_irq; fwnode =dev_fwnode (&i2c->dev);if (!fwnode)@@ -212,10 +364,28 @@ static int bd96801_i2c_probe(struct i2c_client *i2c)if (intb_irq <0 )return dev_err_probe (&i2c->dev, intb_irq,"INTB IRQ not configured\n" );
Quoted 15 lines
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 379
Quoted 13 lines
drivers/mfd/rohm-bd96801.c +13
-0+ num_intb =ARRAY_SIZE (regulator_intb_irqs); + +/* ERRB may be omitted if processor is powered by the PMIC */ + errb_irq =fwnode_irq_get_byname (fwnode,"errb" ); +if (errb_irq <0 ) + errb_irq =0 ; + +if (errb_irq) + num_errb =ARRAY_SIZE (regulator_errb_irqs); + + num_regu_irqs = num_intb + num_errb; + + regulator_res =kcalloc (num_regu_irqs,sizeof (*regulator_res),GFP_KERNEL );Why not devm_* and omit the
kfree()?
I used kcalloc() because this memory is only temporarily needed. It is not needed after devm_mfd_add_devices() returns.
Sure the devm_* would simplify the error paths... Thanks!
Quoted 47 lines
Quoted 47 lines
drivers/mfd/rohm-bd96801.c +25
-9+if (!regulator_res) +return -ENOMEM ; + regmap =devm_regmap_init_i2c (i2c, &bd96801_regmap_config); -if (IS_ERR (regmap)) -return dev_err_probe (&i2c->dev,PTR_ERR (regmap), +if (IS_ERR (regmap)) { + ret =dev_err_probe (&i2c->dev,PTR_ERR (regmap),"Regmap initialization failed\n" ); + goto free_out; + } ret =regmap_write (regmap,BD96801_LOCK_REG ,BD96801_UNLOCK );if (ret)@@ -224,18 +394,63 @@ static int bd96801_i2c_probe(struct i2c_client *i2c) ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, intb_irq,IRQF_ONESHOT ,0 , &bd96801_irq_chip_intb, &intb_irq_data); -if (ret) -return dev_err_probe (&i2c->dev, ret,"Failed to add INTB IRQ chip\n" ); +if (ret) { +dev_err_probe (&i2c->dev, ret,"Failed to add INTB irq_chip\n" ); + goto free_out; + } intb_domain =regmap_irq_get_domain (intb_irq_data); - ret =devm_mfd_add_devices (&i2c->dev,PLATFORM_DEVID_AUTO , - bd96801_mfd_cells, -ARRAY_SIZE (bd96801_mfd_cells),NULL ,0 , - intb_domain); - +/* +* MFD core code is built to handle only one IRQ domain. BD96801 +* has two domains so we do IRQ mapping here and provide the +* already mapped IRQ numbers to sub-devices. +*/ +for (i =0 ; i < num_intb; i++) { +struct resource *res = ®ulator_res[i]; + + *res = regulator_intb_irqs[i]; + res->start = res->end =irq_create_mapping (intb_domain, + res->start); + } + + wdg_irq_no =irq_create_mapping (intb_domain,BD96801_WDT_ERR_STAT );
Quoted 8 lines
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 422
Quoted 5 lines
drivers/mfd/rohm-bd96801.c +5
-0+ wdg_irq =DEFINE_RES_IRQ_NAMED (wdg_irq_no,"bd96801-wdg" ); + bd96801_mfd_cells[WDG_CELL ].resources = &wdg_irq; + bd96801_mfd_cells[WDG_CELL ].num_resources =1 ; + +if (num_errb) {if (!num_errb) goto skip_errb;
Ok, can do.
Quoted 15 lines
Quoted 15 lines
drivers/mfd/rohm-bd96801.c +14
-0+ ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, errb_irq, +IRQF_ONESHOT ,0 , + &bd96801_irq_chip_errb, + &errb_irq_data); +if (ret) { +dev_err_probe (&i2c->dev, ret, +"Failed to add ERRB (%d) irq_chip\n" , + errb_irq); + goto free_out; + } + errb_domain =regmap_irq_get_domain (errb_irq_data); + +for (i =0 ; i < num_errb; i++) { +struct resource *res = ®ulator_res[num_intb + i];
Quoted 8 lines
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 442
Quoted 6 lines
drivers/mfd/rohm-bd96801.c +6
-0+ + *res = regulator_errb_irqs[i]; + res->start = res->end =irq_create_mapping (errb_domain, + res->start); + } + }
skip_errb:
...
Thanks for comments Lee. Reworking this will have to wait for the irqdomain name suffix, which I will continue after Hervé has done his part of the irqdomain changes. I will omit this patch from the next re-spin of the series.
Yours,
-- Matti
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Lee Jones
maintainerRe: [PATCH v3 09/10] mfd: bd96801: Add ERRB IRQ
Quoted 50 lines · Matti Vaittinen
Quoted 34 lines · Lee Jones
Quoted 32 lines · Matti Vaittinen
The ROHM BD96801 "scalable PMIC" provides two physical IRQs. The ERRB handling can in many cases be omitted because it is used to inform fatal IRQs, which usually kill the power from the SOC.
There may however be use-cases where the SOC has a 'back-up' emergency power source which allows some very short time of operation to try to gracefully shut down sensitive hardware. Furthermore, it is possible the processor controlling the PMIC is not powered by the PMIC. In such cases handling the ERRB IRQs may be beneficial.
Add support for ERRB IRQs.
Signed-off-by Matti Vaittinen <[email protected]>---
Revision history:
v2 =>:
- No changes
v1 => v2:
- New patch--- drivers/mfd/rohm-bd96801.c | 291 ++++++++++++++++++++++++++++++++----- 1 file changed, 253 insertions(+), 38 deletions(-)drivers/mfd/rohm-bd96801.c +0
-1@@ -5,13 +5,9 @@* ROHM BD96801 PMIC driver * * This version of the "BD86801 scalable PMIC"'s driver supports only very -* basic set of the PMIC features. Most notably, there is no support for Quoted 8 lines
drivers/mfd/rohm-bd96801.c line 14
Quoted 6 lines
drivers/mfd/rohm-bd96801.c +0
-6-* the ERRB interrupt and the configurations which should be done when the -* PMIC is in STBY mode. -* -* Supporting the ERRB interrupt would require dropping the regmap-IRQ -* usage or working around (or accepting a presense of) a naming conflict -* in debugFS IRQs. Why bother adding all that blurb in the first place?
Because, I assume there are users who would like to have the ERRB in use. The main purpose of this comment is that any such users could
a) see this version does not support ERRB.
b) can find the original RFC with ERRB supportn and a workaround.
c) know why this version does not work with ERRB and thus fix this
Quoted 3 lines
It seems this ERRB support may be missing from upstream for a while, hence I think having this note is worthy until (if) this ERRB patch lands in upstream.
What I mean is - you're adding all of these extra lines in patch 3 and removing them in patch 9.
Quoted 147 lines
Quoted 26 lines
Quoted 26 lines
drivers/mfd/rohm-bd96801.c +8
-7+* basic set of the PMIC features. +* Most notably, there is no support for the configurations which should +* be done when the PMIC is in STBY mode. * * Being able to reliably do the configurations like changing the * regulator safety limits (like limits for the over/under -voltages, over @@ -23,16 +19,14 @@* be the need to configure these safety limits. Hence it's not simple to * come up with a generic solution. * -* Users who require the ERRB handling and STBY state configurations can -* have a look at the original RFC: +* Users who require the STBY state configurations can have a look at the +* original RFC: * https://lore.kernel.org/all/[email protected]/ -* which implements a workaround to debugFS naming conflict and some of -* the safety limit configurations - but leaves the state change handling -* and synchronization to be implemented. +* which implements some of the safety limit configurations - but leaves the +* state change handling and synchronization to be implemented. * * It would be great to hear (and receive a patch!) if you implement the -* STBY configuration support or a proper fix to the debugFS naming -* conflict in your downstream driver ;) +* STBY configuration support or a proper fix in your downstream driver ;) */ ...
Quoted 25 lines
Quoted 25 lines
static int bd96801_i2c_probe(struct i2c_client *i2c) {drivers/mfd/rohm-bd96801.c +13
-3-struct regmap_irq_chip_data *intb_irq_data; +int i, ret, intb_irq, errb_irq, num_regu_irqs, num_intb, num_errb =0 ; +int wdg_irq_no; +struct regmap_irq_chip_data *intb_irq_data, *errb_irq_data; +struct irq_domain *intb_domain, *errb_domain; +struct resource wdg_irq;const struct fwnode_handle *fwnode; -struct irq_domain *intb_domain; +struct resource *regulator_res;struct regmap *regmap; -int ret, intb_irq; fwnode =dev_fwnode (&i2c->dev);if (!fwnode)@@ -212,10 +364,28 @@ static int bd96801_i2c_probe(struct i2c_client *i2c)if (intb_irq <0 )return dev_err_probe (&i2c->dev, intb_irq,"INTB IRQ not configured\n" ); + num_intb =ARRAY_SIZE (regulator_intb_irqs); + +/* ERRB may be omitted if processor is powered by the PMIC */ + errb_irq =fwnode_irq_get_byname (fwnode,"errb" ); +if (errb_irq <0 ) + errb_irq =0 ; +Quoted 8 lines
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 379
Quoted 6 lines
drivers/mfd/rohm-bd96801.c +6
-0+if (errb_irq) + num_errb =ARRAY_SIZE (regulator_errb_irqs); + + num_regu_irqs = num_intb + num_errb; + + regulator_res =kcalloc (num_regu_irqs,sizeof (*regulator_res),GFP_KERNEL );Why not devm_* and omit the
kfree()?I used
kcalloc()because this memory is only temporarily needed. It is not needed afterdevm_mfd_add_devices()returns.Sure the devm_* would simplify the error paths... Thanks!
Quoted 44 lines
Quoted 44 lines
drivers/mfd/rohm-bd96801.c +25
-9+if (!regulator_res) +return -ENOMEM ; + regmap =devm_regmap_init_i2c (i2c, &bd96801_regmap_config); -if (IS_ERR (regmap)) -return dev_err_probe (&i2c->dev,PTR_ERR (regmap), +if (IS_ERR (regmap)) { + ret =dev_err_probe (&i2c->dev,PTR_ERR (regmap),"Regmap initialization failed\n" ); + goto free_out; + } ret =regmap_write (regmap,BD96801_LOCK_REG ,BD96801_UNLOCK );if (ret)@@ -224,18 +394,63 @@ static int bd96801_i2c_probe(struct i2c_client *i2c) ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, intb_irq,IRQF_ONESHOT ,0 , &bd96801_irq_chip_intb, &intb_irq_data); -if (ret) -return dev_err_probe (&i2c->dev, ret,"Failed to add INTB IRQ chip\n" ); +if (ret) { +dev_err_probe (&i2c->dev, ret,"Failed to add INTB irq_chip\n" ); + goto free_out; + } intb_domain =regmap_irq_get_domain (intb_irq_data); - ret =devm_mfd_add_devices (&i2c->dev,PLATFORM_DEVID_AUTO , - bd96801_mfd_cells, -ARRAY_SIZE (bd96801_mfd_cells),NULL ,0 , - intb_domain); - +/* +* MFD core code is built to handle only one IRQ domain. BD96801 +* has two domains so we do IRQ mapping here and provide the +* already mapped IRQ numbers to sub-devices. +*/ +for (i =0 ; i < num_intb; i++) { +struct resource *res = ®ulator_res[i]; + + *res = regulator_intb_irqs[i]; + res->start = res->end =irq_create_mapping (intb_domain, + res->start); + } + + wdg_irq_no =irq_create_mapping (intb_domain,BD96801_WDT_ERR_STAT );Quoted 8 lines
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 422
Quoted 5 lines
drivers/mfd/rohm-bd96801.c +5
-0+ wdg_irq =DEFINE_RES_IRQ_NAMED (wdg_irq_no,"bd96801-wdg" ); + bd96801_mfd_cells[WDG_CELL ].resources = &wdg_irq; + bd96801_mfd_cells[WDG_CELL ].num_resources =1 ; + +if (num_errb) {if (!num_errb) goto skip_errb;Ok, can do.
Quoted 15 lines
Quoted 15 lines
drivers/mfd/rohm-bd96801.c +14
-0+ ret =devm_regmap_add_irq_chip (&i2c->dev, regmap, errb_irq, +IRQF_ONESHOT ,0 , + &bd96801_irq_chip_errb, + &errb_irq_data); +if (ret) { +dev_err_probe (&i2c->dev, ret, +"Failed to add ERRB (%d) irq_chip\n" , + errb_irq); + goto free_out; + } + errb_domain =regmap_irq_get_domain (errb_irq_data); + +for (i =0 ; i < num_errb; i++) { +struct resource *res = ®ulator_res[num_intb + i];Quoted 8 lines
drivers/mfd/rohm-bd96801.c static int bd96801_i2c_probe(struct i2c_client *i2c) · line 442
Quoted 6 lines
drivers/mfd/rohm-bd96801.c +6
-0+ + *res = regulator_errb_irqs[i]; + res->start = res->end =irq_create_mapping (errb_domain, + res->start); + } + }
skip_errb:
Quoted 6 lines
...
Thanks for comments Lee. Reworking this will have to wait for the irqdomain name suffix, which I will continue after Hervé has done his part of the irqdomain changes. I will omit this patch from the next re-spin of the series.
I'm in no rush. :)
Signature · 1 line
Lee Jones [李琼斯]
Matti Vaittinen
maintainerRe: [PATCH v3 09/10] mfd: bd96801: Add ERRB IRQ
Quoted 52 lines · Lee Jones
Quoted 50 lines · Matti Vaittinen
Quoted 34 lines · Lee Jones
Quoted 32 lines · Matti Vaittinen
The ROHM BD96801 "scalable PMIC" provides two physical IRQs. The ERRB handling can in many cases be omitted because it is used to inform fatal IRQs, which usually kill the power from the SOC.
There may however be use-cases where the SOC has a 'back-up' emergency power source which allows some very short time of operation to try to gracefully shut down sensitive hardware. Furthermore, it is possible the processor controlling the PMIC is not powered by the PMIC. In such cases handling the ERRB IRQs may be beneficial.
Add support for ERRB IRQs.
Signed-off-by Matti Vaittinen <[email protected]>---
Revision history:
v2 =>:
- No changes
v1 => v2:
- New patch--- drivers/mfd/rohm-bd96801.c | 291 ++++++++++++++++++++++++++++++++----- 1 file changed, 253 insertions(+), 38 deletions(-)drivers/mfd/rohm-bd96801.c +0
-1@@ -5,13 +5,9 @@* ROHM BD96801 PMIC driver * * This version of the "BD86801 scalable PMIC"'s driver supports only very -* basic set of the PMIC features. Most notably, there is no support for Quoted 8 lines
drivers/mfd/rohm-bd96801.c line 14
Quoted 6 lines
drivers/mfd/rohm-bd96801.c +0
-6-* the ERRB interrupt and the configurations which should be done when the -* PMIC is in STBY mode. -* -* Supporting the ERRB interrupt would require dropping the regmap-IRQ -* usage or working around (or accepting a presense of) a naming conflict -* in debugFS IRQs. Why bother adding all that blurb in the first place?
Because, I assume there are users who would like to have the ERRB in use. The main purpose of this comment is that any such users could
a) see this version does not support ERRB.
b) can find the original RFC with ERRB supportn and a workaround.
c) know why this version does not work with ERRB and thus fix this
Quoted 7 lines
Quoted 3 lines
It seems this ERRB support may be missing from upstream for a while, hence I think having this note is worthy until (if) this ERRB patch lands in upstream.
What I mean is - you're adding all of these extra lines in patch 3 and removing them in patch 9.
True. This is because I had a feeling the irqdomain changes might not get merged that fast as it seemed like something that is not completely trivial. This comment is useful if patches 7-10 aren't merged together with 1-6 - which I now also hope is the case XD
Quoted 29 lines
Quoted 29 lines
Quoted 26 lines
Quoted 26 lines
drivers/mfd/rohm-bd96801.c +8
-7+* basic set of the PMIC features. +* Most notably, there is no support for the configurations which should +* be done when the PMIC is in STBY mode. * * Being able to reliably do the configurations like changing the * regulator safety limits (like limits for the over/under -voltages, over @@ -23,16 +19,14 @@* be the need to configure these safety limits. Hence it's not simple to * come up with a generic solution. * -* Users who require the ERRB handling and STBY state configurations can -* have a look at the original RFC: +* Users who require the STBY state configurations can have a look at the +* original RFC: * https://lore.kernel.org/all/[email protected]/ -* which implements a workaround to debugFS naming conflict and some of -* the safety limit configurations - but leaves the state change handling -* and synchronization to be implemented. +* which implements some of the safety limit configurations - but leaves the +* state change handling and synchronization to be implemented. * * It would be great to hear (and receive a patch!) if you implement the -* STBY configuration support or a proper fix to the debugFS naming -* conflict in your downstream driver ;) +* STBY configuration support or a proper fix in your downstream driver ;) */ ...
Quoted 6 lines
Quoted 4 lines
Thanks for comments Lee. Reworking this will have to wait for the irqdomain name suffix, which I will continue after Hervé has done his part of the irqdomain changes. I will omit this patch from the next re-spin of the series.
I'm in no rush. :)
Well, glad to hear ;) I still usually try to avoid delaying sending the follow-up patches. I am under impression it is easier to review the new revision if the previous revision was not reviewed too long ago... ;)
I feel it is polite to tell the reviewers there will be some delay when I know it.
Yours,
-- Matti
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Lee Jones
maintainerRe: [PATCH v3 09/10] mfd: bd96801: Add ERRB IRQ
Quoted 100 lines · Matti Vaittinen
Quoted 52 lines · Lee Jones
Quoted 50 lines · Matti Vaittinen
Quoted 34 lines · Lee Jones
Quoted 32 lines · Matti Vaittinen
The ROHM BD96801 "scalable PMIC" provides two physical IRQs. The ERRB handling can in many cases be omitted because it is used to inform fatal IRQs, which usually kill the power from the SOC.
There may however be use-cases where the SOC has a 'back-up' emergency power source which allows some very short time of operation to try to gracefully shut down sensitive hardware. Furthermore, it is possible the processor controlling the PMIC is not powered by the PMIC. In such cases handling the ERRB IRQs may be beneficial.
Add support for ERRB IRQs.
Signed-off-by Matti Vaittinen <[email protected]>---
Revision history:
v2 =>:
- No changes
v1 => v2:
- New patch--- drivers/mfd/rohm-bd96801.c | 291 ++++++++++++++++++++++++++++++++----- 1 file changed, 253 insertions(+), 38 deletions(-)drivers/mfd/rohm-bd96801.c +0
-1@@ -5,13 +5,9 @@* ROHM BD96801 PMIC driver * * This version of the "BD86801 scalable PMIC"'s driver supports only very -* basic set of the PMIC features. Most notably, there is no support for Quoted 8 lines
drivers/mfd/rohm-bd96801.c line 14
Quoted 6 lines
drivers/mfd/rohm-bd96801.c +0
-6-* the ERRB interrupt and the configurations which should be done when the -* PMIC is in STBY mode. -* -* Supporting the ERRB interrupt would require dropping the regmap-IRQ -* usage or working around (or accepting a presense of) a naming conflict -* in debugFS IRQs. Why bother adding all that blurb in the first place?
Because, I assume there are users who would like to have the ERRB in use. The main purpose of this comment is that any such users could
a) see this version does not support ERRB.
b) can find the original RFC with ERRB supportn and a workaround.
c) know why this version does not work with ERRB and thus fix thisQuoted 7 lines
Quoted 3 lines
It seems this ERRB support may be missing from upstream for a while, hence I think having this note is worthy until (if) this ERRB patch lands in upstream.
What I mean is - you're adding all of these extra lines in patch 3 and removing them in patch 9.
True. This is because I had a feeling the irqdomain changes might not get merged that fast as it seemed like something that is not completely trivial. This comment is useful if patches 7-10 aren't merged together with 1-6 - which I now also hope is the case XD
Quoted 34 lines
Quoted 33 lines
Quoted 18 lines
Quoted 18 lines
drivers/mfd/rohm-bd96801.c +5
-5+* basic set of the PMIC features. +* Most notably, there is no support for the configurations which should +* be done when the PMIC is in STBY mode. * * Being able to reliably do the configurations like changing the * regulator safety limits (like limits for the over/under -voltages, over @@ -23,16 +19,14 @@* be the need to configure these safety limits. Hence it's not simple to * come up with a generic solution. * -* Users who require the ERRB handling and STBY state configurations can -* have a look at the original RFC: +* Users who require the STBY state configurations can have a look at the +* original RFC: * https://lore.kernel.org/all/[email protected]/ -* which implements a workaround to debugFS naming conflict and some of -* the safety limit configurations - but leaves the state change handling -* and synchronization to be implemented. Quoted 8 lines
drivers/mfd/rohm-bd96801.c line 30
Quoted 8 lines
drivers/mfd/rohm-bd96801.c +3
-2+* which implements some of the safety limit configurations - but leaves the +* state change handling and synchronization to be implemented. * * It would be great to hear (and receive a patch!) if you implement the -* STBY configuration support or a proper fix to the debugFS naming -* conflict in your downstream driver ;) +* STBY configuration support or a proper fix in your downstream driver ;) */ ...
Thanks for comments Lee. Reworking this will have to wait for the irqdomain name suffix, which I will continue after Hervé has done his part of the irqdomain changes. I will omit this patch from the next re-spin of the series.
Quoted 5 lines
Quoted 1 line
I'm in no rush. :)
Well, glad to hear ;) I still usually try to avoid delaying sending the follow-up patches. I am under impression it is easier to review the new revision if the previous revision was not reviewed too long ago... ;)
I'm used to it. Old reviews are cached locally.
Quoted 2 lines
I feel it is polite to tell the reviewers there will be some delay when I know it.
I wouldn't lose any sleep over it. :)
Signature · 1 line
Lee Jones [李琼斯]