* [PATCH v3 0/3] regulator: Add support for Unisoc SC2730 PMIC regulators
@ 2026-05-19 12:06 Otto Pflüger
2026-05-19 12:06 ` [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC Otto Pflüger
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Otto Pflüger @ 2026-05-19 12:06 UTC (permalink / raw)
To: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones
Cc: linux-kernel, devicetree, Otto Pflüger, Conor Dooley,
Zhongfa Wang
Add device tree bindings and a driver for the regulators found in the
Spreadtrum/Unisoc SC2730 PMIC.
The second patch in this series depends on the first patch.
Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de>
---
Changes in v3:
- Drop compatible property
- Drop unused VDDSIM0 and VDDSIM1 IDs
- Link to v2: https://lore.kernel.org/r/20260518-sc2730-regulators-v2-0-9a5b3a7b1e49@abscue.de
Changes in v2:
- Use lowercase names without underscores for device tree nodes
- Use oneOf for binding reference instead of making it conditional
- Remove some excess line breaks
- Fix author name in driver and add original Signed-off-by
- Link to v1: https://lore.kernel.org/r/20260220-sc2730-regulators-v1-0-3f2bbc9ecf14@abscue.de
---
Otto Pflüger (3):
regulator: dt-bindings: Add Unisoc SC2730 PMIC
dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings
regulator: Add regulator driver for Unisoc SC2730 PMIC
.../devicetree/bindings/mfd/sprd,sc2731.yaml | 4 +-
.../bindings/regulator/sprd,sc2730-regulator.yaml | 47 +++
drivers/regulator/Kconfig | 7 +
drivers/regulator/Makefile | 1 +
drivers/regulator/sc2730-regulator.c | 411 +++++++++++++++++++++
5 files changed, 469 insertions(+), 1 deletion(-)
---
base-commit: 80dd246accce631c328ea43294e53b2b2dd2aa32
change-id: 20260216-sc2730-regulators-13ba789641a4
Best regards,
--
Otto Pflüger <otto.pflueger@abscue.de>
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC 2026-05-19 12:06 [PATCH v3 0/3] regulator: Add support for Unisoc SC2730 PMIC regulators Otto Pflüger @ 2026-05-19 12:06 ` Otto Pflüger 2026-05-19 12:18 ` sashiko-bot 2026-05-19 17:28 ` Conor Dooley 2026-05-19 12:06 ` [PATCH v3 2/3] dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings Otto Pflüger 2026-05-19 12:06 ` [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC Otto Pflüger 2 siblings, 2 replies; 10+ messages in thread From: Otto Pflüger @ 2026-05-19 12:06 UTC (permalink / raw) To: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones Cc: linux-kernel, devicetree, Otto Pflüger Add bindings for the regulators found in the Spreadtrum/Unisoc SC2730 PMIC, used e.g. with the UMS512 and UMS9230 SoCs. Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de> --- .../bindings/regulator/sprd,sc2730-regulator.yaml | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml new file mode 100644 index 000000000000..5b91c7b7f3ee --- /dev/null +++ b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/regulator/sprd,sc2730-regulator.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Unisoc SC2730 Power Management IC regulators + +maintainers: + - Otto Pflüger <otto.pflueger@abscue.de> + +patternProperties: + "^dcdc-(core|cpu|gen[0-1]|gpu|mem|memq|modem|sram)$": + type: object + $ref: regulator.yaml# + unevaluatedProperties: false + + "^ldo-avdd(12|18)$": + type: object + $ref: regulator.yaml# + unevaluatedProperties: false + + "^ldo-vdd(18-dcxo|28)$": + type: object + $ref: regulator.yaml# + unevaluatedProperties: false + + "^ldo-vdd(emmccore|kpled|ldo[0-2]|sd(core|io)|sim[0-2]|usb33|wcn|wifipa)$": + type: object + $ref: regulator.yaml# + unevaluatedProperties: false + + "^ldo-vddcam(a0|a1|d0|d1|io|mot)$": + type: object + $ref: regulator.yaml# + unevaluatedProperties: false + + "^ldo-vddrf(1v25|18)$": + type: object + $ref: regulator.yaml# + unevaluatedProperties: false + +required: + - compatible + +additionalProperties: false +... -- 2.51.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC 2026-05-19 12:06 ` [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC Otto Pflüger @ 2026-05-19 12:18 ` sashiko-bot 2026-05-19 17:28 ` Conor Dooley 1 sibling, 0 replies; 10+ messages in thread From: sashiko-bot @ 2026-05-19 12:18 UTC (permalink / raw) To: Otto Pflüger; +Cc: robh, devicetree, conor+dt Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] The YAML binding schema requires the `compatible` property but completely omits the `properties:` block to define it. -- commit 965b6e885b7ba5fbecce0029c11926bf606c2f72 Author: Otto Pflüger <otto.pflueger@abscue.de> regulator: dt-bindings: Add Unisoc SC2730 PMIC Add bindings for the regulators found in the Spreadtrum/Unisoc SC2730 PMIC, used e.g. with the UMS512 and UMS9230 SoCs. > diff --git a/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml > new file mode 100644 > index 0000000000000..5b91c7b7f3ee3 > --- /dev/null > +++ b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml [ ... ] > + "^ldo-vddrf(1v25|18)$": > + type: object > + $ref: regulator.yaml# > + unevaluatedProperties: false > + > +required: > + - compatible > + > +additionalProperties: false Is there a missing properties block to define the compatible property? The schema requires compatible and specifies additionalProperties: false. Under schema validation rules, additionalProperties: false forbids any properties not explicitly listed in properties or patternProperties. Because compatible is not defined and does not match the regexes in patternProperties, any device tree node containing the required compatible string will be rejected as having a forbidden additional property. Could this create a regression where the compatible property is required but forbidden, preventing any device tree node from passing validation against this schema? > +... -- Sashiko AI review · https://sashiko.dev/#/patchset/20260519-sc2730-regulators-v3-0-5bf0e02507e3@abscue.de?part=1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC 2026-05-19 12:06 ` [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC Otto Pflüger 2026-05-19 12:18 ` sashiko-bot @ 2026-05-19 17:28 ` Conor Dooley 2026-05-20 7:23 ` Krzysztof Kozlowski 1 sibling, 1 reply; 10+ messages in thread From: Conor Dooley @ 2026-05-19 17:28 UTC (permalink / raw) To: Otto Pflüger Cc: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones, linux-kernel, devicetree [-- Attachment #1: Type: text/plain, Size: 2135 bytes --] On Tue, May 19, 2026 at 02:06:11PM +0200, Otto Pflüger wrote: > Add bindings for the regulators found in the Spreadtrum/Unisoc SC2730 > PMIC, used e.g. with the UMS512 and UMS9230 SoCs. > > Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de> > --- > .../bindings/regulator/sprd,sc2730-regulator.yaml | 47 ++++++++++++++++++++++ > 1 file changed, 47 insertions(+) > > diff --git a/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml > new file mode 100644 > index 000000000000..5b91c7b7f3ee > --- /dev/null > +++ b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml > @@ -0,0 +1,47 @@ > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/regulator/sprd,sc2730-regulator.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Unisoc SC2730 Power Management IC regulators > + > +maintainers: > + - Otto Pflüger <otto.pflueger@abscue.de> How is this binding meant to apply without a compatible? pw-bot: changes-requested Thanks, Conor. > + > +patternProperties: > + "^dcdc-(core|cpu|gen[0-1]|gpu|mem|memq|modem|sram)$": > + type: object > + $ref: regulator.yaml# > + unevaluatedProperties: false > + > + "^ldo-avdd(12|18)$": > + type: object > + $ref: regulator.yaml# > + unevaluatedProperties: false > + > + "^ldo-vdd(18-dcxo|28)$": > + type: object > + $ref: regulator.yaml# > + unevaluatedProperties: false > + > + "^ldo-vdd(emmccore|kpled|ldo[0-2]|sd(core|io)|sim[0-2]|usb33|wcn|wifipa)$": > + type: object > + $ref: regulator.yaml# > + unevaluatedProperties: false > + > + "^ldo-vddcam(a0|a1|d0|d1|io|mot)$": > + type: object > + $ref: regulator.yaml# > + unevaluatedProperties: false > + > + "^ldo-vddrf(1v25|18)$": > + type: object > + $ref: regulator.yaml# > + unevaluatedProperties: false > + > +required: > + - compatible > + > +additionalProperties: false > +... > > -- > 2.51.0 > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC 2026-05-19 17:28 ` Conor Dooley @ 2026-05-20 7:23 ` Krzysztof Kozlowski 0 siblings, 0 replies; 10+ messages in thread From: Krzysztof Kozlowski @ 2026-05-20 7:23 UTC (permalink / raw) To: Conor Dooley Cc: Otto Pflüger, Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones, linux-kernel, devicetree On Tue, May 19, 2026 at 06:28:24PM +0100, Conor Dooley wrote: > On Tue, May 19, 2026 at 02:06:11PM +0200, Otto Pflüger wrote: > > Add bindings for the regulators found in the Spreadtrum/Unisoc SC2730 > > PMIC, used e.g. with the UMS512 and UMS9230 SoCs. > > > > Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de> > > --- > > .../bindings/regulator/sprd,sc2730-regulator.yaml | 47 ++++++++++++++++++++++ > > 1 file changed, 47 insertions(+) > > > > diff --git a/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml > > new file mode 100644 > > index 000000000000..5b91c7b7f3ee > > --- /dev/null > > +++ b/Documentation/devicetree/bindings/regulator/sprd,sc2730-regulator.yaml > > @@ -0,0 +1,47 @@ > > +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause > > +%YAML 1.2 > > +--- > > +$id: http://devicetree.org/schemas/regulator/sprd,sc2730-regulator.yaml# > > +$schema: http://devicetree.org/meta-schemas/core.yaml# > > + > > +title: Unisoc SC2730 Power Management IC regulators > > + > > +maintainers: > > + - Otto Pflüger <otto.pflueger@abscue.de> > > How is this binding meant to apply without a compatible? > pw-bot: changes-requested Through $ref on parent device binding. This as well could have been folded into the parent, but we do have cases like here. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 2/3] dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings 2026-05-19 12:06 [PATCH v3 0/3] regulator: Add support for Unisoc SC2730 PMIC regulators Otto Pflüger 2026-05-19 12:06 ` [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC Otto Pflüger @ 2026-05-19 12:06 ` Otto Pflüger 2026-05-19 12:30 ` sashiko-bot 2026-05-19 12:06 ` [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC Otto Pflüger 2 siblings, 1 reply; 10+ messages in thread From: Otto Pflüger @ 2026-05-19 12:06 UTC (permalink / raw) To: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones Cc: linux-kernel, devicetree, Otto Pflüger, Conor Dooley The SC2730 PMIC provides a different set of regulators than SC2731 and thus requires separate regulator bindings. Allow using them for the "regulators" node. Acked-by: Conor Dooley <conor.dooley@microchip.com> Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de> --- Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml index b023e1ef8d3c..e74ec4970994 100644 --- a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml +++ b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml @@ -54,7 +54,9 @@ properties: regulators: type: object - $ref: /schemas/regulator/sprd,sc2731-regulator.yaml# + oneOf: + - $ref: /schemas/regulator/sprd,sc2730-regulator.yaml# + - $ref: /schemas/regulator/sprd,sc2731-regulator.yaml# patternProperties: "^adc@[0-9a-f]+$": -- 2.51.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/3] dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings 2026-05-19 12:06 ` [PATCH v3 2/3] dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings Otto Pflüger @ 2026-05-19 12:30 ` sashiko-bot 0 siblings, 0 replies; 10+ messages in thread From: sashiko-bot @ 2026-05-19 12:30 UTC (permalink / raw) To: Otto Pflüger; +Cc: robh, conor+dt, devicetree Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [High] The newly referenced `sprd,sc2730-regulator.yaml` schema contains a critical bug that causes it to falsely reject valid device tree nodes. - [Medium] Unconditional relaxation of the `regulators` node schema permits incorrect hardware configurations to silently pass validation. -- commit 0ef24a84813b14435877f202403f8d49b85173ac Author: Otto Pflüger <otto.pflueger@abscue.de> dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings This commit updates the SC2731 MFD binding to allow using the SC2730 regulator bindings for the regulators node. The SC2730 PMIC provides a different set of regulators than the SC2731. > diff --git a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml > index b023e1ef8d3cc..e74ec49709941 100644 > --- a/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml > +++ b/Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml > @@ -54,7 +54,9 @@ properties: > > regulators: > type: object > - $ref: /schemas/regulator/sprd,sc2731-regulator.yaml# > + oneOf: > + - $ref: /schemas/regulator/sprd,sc2730-regulator.yaml# Does the newly referenced sprd,sc2730-regulator.yaml schema contain an issue that causes it to falsely reject valid device tree nodes? This issue appears to be introduced by the preceding patch in the series (commit "regulator: dt-bindings: Add Unisoc SC2730 PMIC") but manifests here because this commit adds the reference to the broken schema. The sprd,sc2730-regulator.yaml file specifies "required: [compatible]" and "additionalProperties: false", but entirely omits the properties block necessary to define the compatible property. Because dt-schema rules forbid any property not explicitly defined when "additionalProperties: false" is set, it seems any device tree node defining an SC2730 regulator node will instantly fail dtbs_check for containing an additional property named compatible. Does this unconditional oneOf block permit incorrect hardware configurations to silently pass validation? This change replaces a single $ref for the regulators node with an unconditional oneOf block. This allows any PMIC compatible string supported by this MFD binding to legally declare either the SC2730 or SC2731 regulator bindings. Because the commit message correctly notes that the SC2730 provides a different set of regulators, should the schema strictly associate the regulator binding with the corresponding top-level PMIC compatible string? This could be implemented using an allOf list of if-then conditional blocks that evaluate the parent node's compatible string to selectively apply the correct $ref to the regulators node, preventing cross-generational hardware mismatches from silently passing validation. > + - $ref: /schemas/regulator/sprd,sc2731-regulator.yaml# -- Sashiko AI review · https://sashiko.dev/#/patchset/20260519-sc2730-regulators-v3-0-5bf0e02507e3@abscue.de?part=2 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC 2026-05-19 12:06 [PATCH v3 0/3] regulator: Add support for Unisoc SC2730 PMIC regulators Otto Pflüger 2026-05-19 12:06 ` [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC Otto Pflüger 2026-05-19 12:06 ` [PATCH v3 2/3] dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings Otto Pflüger @ 2026-05-19 12:06 ` Otto Pflüger 2026-05-19 12:54 ` sashiko-bot 2026-05-20 15:48 ` Mark Brown 2 siblings, 2 replies; 10+ messages in thread From: Otto Pflüger @ 2026-05-19 12:06 UTC (permalink / raw) To: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones Cc: linux-kernel, devicetree, Otto Pflüger, Zhongfa Wang Add a regulator driver for the Spreadtrum/Unisoc SC2730 PMIC, used e.g. with the UMS512 and UMS9230 SoCs. This version of the driver is based on a downstream driver provided by Unisoc [1][2] and the existing SC2731 driver. Signed-off-by: Zhongfa Wang <zhongfa.wang@unisoc.com> [cleanup, adapt to new device tree requirements] Signed-off-by: Otto Pflüger <otto.pflueger@abscue.de> [1]: https://github.com/MotorolaMobilityLLC/kernel-sprd/commit/30be0ddfe6b9a877fc9c328fbd2bae84e645eb31 [2]: https://github.com/MotorolaMobilityLLC/kernel-sprd/blob/android-13-release-tla33/drivers/regulator/sc2730-regulator.c --- drivers/regulator/Kconfig | 7 + drivers/regulator/Makefile | 1 + drivers/regulator/sc2730-regulator.c | 411 +++++++++++++++++++++++++++++++++++ 3 files changed, 419 insertions(+) diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 78076ac6eac4..b777f795cec2 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -1483,6 +1483,13 @@ config REGULATOR_S5M8767 via I2C bus. S5M8767A have 9 Bucks and 28 LDOs output and supports DVS mode with 8bits of output voltage control. +config REGULATOR_SC2730 + tristate "Spreadtrum SC2730 power regulator driver" + depends on MFD_SC27XX_PMIC || COMPILE_TEST + help + This driver provides support for the voltage regulators on the + SC2730 PMIC. + config REGULATOR_SC2731 tristate "Spreadtrum SC2731 power regulator driver" depends on MFD_SC27XX_PMIC || COMPILE_TEST diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index 35639f3115fd..9de6f1347d14 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -171,6 +171,7 @@ obj-$(CONFIG_REGULATOR_S2DOS05) += s2dos05-regulator.o obj-$(CONFIG_REGULATOR_S2MPA01) += s2mpa01.o obj-$(CONFIG_REGULATOR_S2MPS11) += s2mps11.o obj-$(CONFIG_REGULATOR_S5M8767) += s5m8767.o +obj-$(CONFIG_REGULATOR_SC2730) += sc2730-regulator.o obj-$(CONFIG_REGULATOR_SC2731) += sc2731-regulator.o obj-$(CONFIG_REGULATOR_SKY81452) += sky81452-regulator.o obj-$(CONFIG_REGULATOR_SLG51000) += slg51000-regulator.o diff --git a/drivers/regulator/sc2730-regulator.c b/drivers/regulator/sc2730-regulator.c new file mode 100644 index 000000000000..9e40c6eae494 --- /dev/null +++ b/drivers/regulator/sc2730-regulator.c @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018-2021 Unisoc Inc. + */ + +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> +#include <linux/regulator/driver.h> +#include <linux/regulator/of_regulator.h> + +/* + * SC2730 regulator base address + */ +#define SC2730_REGULATOR_BASE 0x1800 + +/* + * SC2730 regulator lock register + */ +#define SC2730_WR_UNLOCK_VALUE 0x6e7f +#define SC2730_PWR_WR_PROT (SC2730_REGULATOR_BASE + 0x3d0) + +/* + * SC2730 enable register + */ +#define SC2730_POWER_PD_SW (SC2730_REGULATOR_BASE + 0x01c) +#define SC2730_LDO_VDDRF18_PD (SC2730_REGULATOR_BASE + 0x10c) +#define SC2730_LDO_VDDCAMIO_PD (SC2730_REGULATOR_BASE + 0x118) +#define SC2730_LDO_VDDWCN_PD (SC2730_REGULATOR_BASE + 0x11c) +#define SC2730_LDO_VDDCAMD1_PD (SC2730_REGULATOR_BASE + 0x128) +#define SC2730_LDO_VDDCAMD0_PD (SC2730_REGULATOR_BASE + 0x134) +#define SC2730_LDO_VDDRF1V25_PD (SC2730_REGULATOR_BASE + 0x140) +#define SC2730_LDO_AVDD12_PD (SC2730_REGULATOR_BASE + 0x14c) +#define SC2730_LDO_VDDCAMA0_PD (SC2730_REGULATOR_BASE + 0x158) +#define SC2730_LDO_VDDCAMA1_PD (SC2730_REGULATOR_BASE + 0x164) +#define SC2730_LDO_VDDCAMMOT_PD (SC2730_REGULATOR_BASE + 0x170) +#define SC2730_LDO_VDDSIM2_PD (SC2730_REGULATOR_BASE + 0x194) +#define SC2730_LDO_VDDEMMCCORE_PD (SC2730_REGULATOR_BASE + 0x1a0) +#define SC2730_LDO_VDDSDCORE_PD (SC2730_REGULATOR_BASE + 0x1ac) +#define SC2730_LDO_VDDSDIO_PD (SC2730_REGULATOR_BASE + 0x1b8) +#define SC2730_LDO_VDDWIFIPA_PD (SC2730_REGULATOR_BASE + 0x1d0) +#define SC2730_LDO_VDDUSB33_PD (SC2730_REGULATOR_BASE + 0x1e8) +#define SC2730_LDO_VDDLDO0_PD (SC2730_REGULATOR_BASE + 0x1f4) +#define SC2730_LDO_VDDLDO1_PD (SC2730_REGULATOR_BASE + 0x200) +#define SC2730_LDO_VDDLDO2_PD (SC2730_REGULATOR_BASE + 0x20c) +#define SC2730_LDO_VDDKPLED_PD (SC2730_REGULATOR_BASE + 0x38c) + +/* + * SC2730 enable mask + */ +#define SC2730_DCDC_CPU_PD_MASK BIT(4) +#define SC2730_DCDC_GPU_PD_MASK BIT(3) +#define SC2730_DCDC_CORE_PD_MASK BIT(5) +#define SC2730_DCDC_MODEM_PD_MASK BIT(11) +#define SC2730_DCDC_MEM_PD_MASK BIT(6) +#define SC2730_DCDC_MEMQ_PD_MASK BIT(12) +#define SC2730_DCDC_GEN0_PD_MASK BIT(8) +#define SC2730_DCDC_GEN1_PD_MASK BIT(7) +#define SC2730_DCDC_SRAM_PD_MASK BIT(13) +#define SC2730_LDO_AVDD18_PD_MASK BIT(2) +#define SC2730_LDO_VDDRF18_PD_MASK BIT(0) +#define SC2730_LDO_VDDCAMIO_PD_MASK BIT(0) +#define SC2730_LDO_VDDWCN_PD_MASK BIT(0) +#define SC2730_LDO_VDDCAMD1_PD_MASK BIT(0) +#define SC2730_LDO_VDDCAMD0_PD_MASK BIT(0) +#define SC2730_LDO_VDDRF1V25_PD_MASK BIT(0) +#define SC2730_LDO_AVDD12_PD_MASK BIT(0) +#define SC2730_LDO_VDDCAMA0_PD_MASK BIT(0) +#define SC2730_LDO_VDDCAMA1_PD_MASK BIT(0) +#define SC2730_LDO_VDDCAMMOT_PD_MASK BIT(0) +#define SC2730_LDO_VDDSIM2_PD_MASK BIT(0) +#define SC2730_LDO_VDDEMMCCORE_PD_MASK BIT(0) +#define SC2730_LDO_VDDSDCORE_PD_MASK BIT(0) +#define SC2730_LDO_VDDSDIO_PD_MASK BIT(0) +#define SC2730_LDO_VDD28_PD_MASK BIT(1) +#define SC2730_LDO_VDDWIFIPA_PD_MASK BIT(0) +#define SC2730_LDO_VDD18_DCXO_PD_MASK BIT(10) +#define SC2730_LDO_VDDUSB33_PD_MASK BIT(0) +#define SC2730_LDO_VDDLDO0_PD_MASK BIT(0) +#define SC2730_LDO_VDDLDO1_PD_MASK BIT(0) +#define SC2730_LDO_VDDLDO2_PD_MASK BIT(0) +#define SC2730_LDO_VDDKPLED_PD_MASK BIT(15) + +/* + * SC2730 vsel register + */ +#define SC2730_DCDC_CPU_VOL (SC2730_REGULATOR_BASE + 0x44) +#define SC2730_DCDC_GPU_VOL (SC2730_REGULATOR_BASE + 0x54) +#define SC2730_DCDC_CORE_VOL (SC2730_REGULATOR_BASE + 0x64) +#define SC2730_DCDC_MODEM_VOL (SC2730_REGULATOR_BASE + 0x74) +#define SC2730_DCDC_MEM_VOL (SC2730_REGULATOR_BASE + 0x84) +#define SC2730_DCDC_MEMQ_VOL (SC2730_REGULATOR_BASE + 0x94) +#define SC2730_DCDC_GEN0_VOL (SC2730_REGULATOR_BASE + 0xa4) +#define SC2730_DCDC_GEN1_VOL (SC2730_REGULATOR_BASE + 0xb4) +#define SC2730_DCDC_SRAM_VOL (SC2730_REGULATOR_BASE + 0xdc) +#define SC2730_LDO_AVDD18_VOL (SC2730_REGULATOR_BASE + 0x104) +#define SC2730_LDO_VDDRF18_VOL (SC2730_REGULATOR_BASE + 0x110) +#define SC2730_LDO_VDDCAMIO_VOL (SC2730_REGULATOR_BASE + 0x28) +#define SC2730_LDO_VDDWCN_VOL (SC2730_REGULATOR_BASE + 0x120) +#define SC2730_LDO_VDDCAMD1_VOL (SC2730_REGULATOR_BASE + 0x12c) +#define SC2730_LDO_VDDCAMD0_VOL (SC2730_REGULATOR_BASE + 0x138) +#define SC2730_LDO_VDDRF1V25_VOL (SC2730_REGULATOR_BASE + 0x144) +#define SC2730_LDO_AVDD12_VOL (SC2730_REGULATOR_BASE + 0x150) +#define SC2730_LDO_VDDCAMA0_VOL (SC2730_REGULATOR_BASE + 0x15c) +#define SC2730_LDO_VDDCAMA1_VOL (SC2730_REGULATOR_BASE + 0x168) +#define SC2730_LDO_VDDCAMMOT_VOL (SC2730_REGULATOR_BASE + 0x174) +#define SC2730_LDO_VDDSIM2_VOL (SC2730_REGULATOR_BASE + 0x198) +#define SC2730_LDO_VDDEMMCCORE_VOL (SC2730_REGULATOR_BASE + 0x1a4) +#define SC2730_LDO_VDDSDCORE_VOL (SC2730_REGULATOR_BASE + 0x1b0) +#define SC2730_LDO_VDDSDIO_VOL (SC2730_REGULATOR_BASE + 0x1bc) +#define SC2730_LDO_VDD28_VOL (SC2730_REGULATOR_BASE + 0x1c8) +#define SC2730_LDO_VDDWIFIPA_VOL (SC2730_REGULATOR_BASE + 0x1d4) +#define SC2730_LDO_VDD18_DCXO_VOL (SC2730_REGULATOR_BASE + 0x1e0) +#define SC2730_LDO_VDDUSB33_VOL (SC2730_REGULATOR_BASE + 0x1ec) +#define SC2730_LDO_VDDLDO0_VOL (SC2730_REGULATOR_BASE + 0x1f8) +#define SC2730_LDO_VDDLDO1_VOL (SC2730_REGULATOR_BASE + 0x204) +#define SC2730_LDO_VDDLDO2_VOL (SC2730_REGULATOR_BASE + 0x210) +#define SC2730_LDO_VDDKPLED_VOL (SC2730_REGULATOR_BASE + 0x38c) + +/* + * SC2730 vsel register mask + */ +#define SC2730_DCDC_CPU_VOL_MASK GENMASK(8, 0) +#define SC2730_DCDC_GPU_VOL_MASK GENMASK(8, 0) +#define SC2730_DCDC_CORE_VOL_MASK GENMASK(8, 0) +#define SC2730_DCDC_MODEM_VOL_MASK GENMASK(8, 0) +#define SC2730_DCDC_MEM_VOL_MASK GENMASK(7, 0) +#define SC2730_DCDC_MEMQ_VOL_MASK GENMASK(8, 0) +#define SC2730_DCDC_GEN0_VOL_MASK GENMASK(7, 0) +#define SC2730_DCDC_GEN1_VOL_MASK GENMASK(7, 0) +#define SC2730_DCDC_SRAM_VOL_MASK GENMASK(8, 0) +#define SC2730_LDO_AVDD18_VOL_MASK GENMASK(5, 0) +#define SC2730_LDO_VDDRF18_VOL_MASK GENMASK(5, 0) +#define SC2730_LDO_VDDCAMIO_VOL_MASK GENMASK(5, 0) +#define SC2730_LDO_VDDWCN_VOL_MASK GENMASK(5, 0) +#define SC2730_LDO_VDDCAMD1_VOL_MASK GENMASK(4, 0) +#define SC2730_LDO_VDDCAMD0_VOL_MASK GENMASK(4, 0) +#define SC2730_LDO_VDDRF1V25_VOL_MASK GENMASK(4, 0) +#define SC2730_LDO_AVDD12_VOL_MASK GENMASK(4, 0) +#define SC2730_LDO_VDDCAMA0_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDCAMA1_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDCAMMOT_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDSIM2_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDEMMCCORE_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDSDCORE_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDSDIO_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDD28_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDWIFIPA_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDD18_DCXO_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDUSB33_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDLDO0_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDLDO1_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDLDO2_VOL_MASK GENMASK(7, 0) +#define SC2730_LDO_VDDKPLED_VOL_MASK GENMASK(14, 7) + +enum sc2730_regulator_id { + SC2730_DCDC_CPU, + SC2730_DCDC_GPU, + SC2730_DCDC_CORE, + SC2730_DCDC_MODEM, + SC2730_DCDC_MEM, + SC2730_DCDC_MEMQ, + SC2730_DCDC_GEN0, + SC2730_DCDC_GEN1, + SC2730_DCDC_SRAM, + SC2730_LDO_AVDD18, + SC2730_LDO_VDDRF18, + SC2730_LDO_VDDCAMIO, + SC2730_LDO_VDDWCN, + SC2730_LDO_VDDCAMD1, + SC2730_LDO_VDDCAMD0, + SC2730_LDO_VDDRF1V25, + SC2730_LDO_AVDD12, + SC2730_LDO_VDDCAMA0, + SC2730_LDO_VDDCAMA1, + SC2730_LDO_VDDCAMMOT, + SC2730_LDO_VDDSIM2, + SC2730_LDO_VDDEMMCCORE, + SC2730_LDO_VDDSDCORE, + SC2730_LDO_VDDSDIO, + SC2730_LDO_VDD28, + SC2730_LDO_VDDWIFIPA, + SC2730_LDO_VDD18_DCXO, + SC2730_LDO_VDDUSB33, + SC2730_LDO_VDDLDO0, + SC2730_LDO_VDDLDO1, + SC2730_LDO_VDDLDO2, + SC2730_LDO_VDDKPLED, +}; + +static const struct regulator_ops sc2730_regu_linear_ops = { + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = regulator_is_enabled_regmap, + .list_voltage = regulator_list_voltage_linear, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, +}; + +#define SC2730_REGU_LINEAR(_id, of_name, en_reg, en_mask, vreg, vmask, \ + vstep, vmin, vmax, min_sel) { \ + .name = #_id, \ + .of_match = of_name, \ + .regulators_node = "regulators", \ + .ops = &sc2730_regu_linear_ops, \ + .type = REGULATOR_VOLTAGE, \ + .id = SC2730_##_id, \ + .owner = THIS_MODULE, \ + .min_uV = vmin, \ + .n_voltages = ((vmax) - (vmin)) / (vstep) + 1, \ + .uV_step = vstep, \ + .enable_is_inverted = true, \ + .enable_val = 0, \ + .enable_reg = en_reg, \ + .enable_mask = en_mask, \ + .vsel_reg = vreg, \ + .vsel_mask = vmask, \ + .linear_min_sel = min_sel, \ +} + +static const struct regulator_desc regulators[] = { + SC2730_REGU_LINEAR(DCDC_CPU, "dcdc-cpu", SC2730_POWER_PD_SW, + SC2730_DCDC_CPU_PD_MASK, SC2730_DCDC_CPU_VOL, + SC2730_DCDC_CPU_VOL_MASK, 3125, 0, 1596875, + 0), + SC2730_REGU_LINEAR(DCDC_GPU, "dcdc-gpu", SC2730_POWER_PD_SW, + SC2730_DCDC_GPU_PD_MASK, SC2730_DCDC_GPU_VOL, + SC2730_DCDC_GPU_VOL_MASK, 3125, 0, 1596875, + 0), + SC2730_REGU_LINEAR(DCDC_CORE, "dcdc-core", SC2730_POWER_PD_SW, + SC2730_DCDC_CORE_PD_MASK, SC2730_DCDC_CORE_VOL, + SC2730_DCDC_CORE_VOL_MASK, 3125, 0, 1596875, + 0), + SC2730_REGU_LINEAR(DCDC_MODEM, "dcdc-modem", SC2730_POWER_PD_SW, + SC2730_DCDC_MODEM_PD_MASK, SC2730_DCDC_MODEM_VOL, + SC2730_DCDC_MODEM_VOL_MASK, 3125, 0, 1596875, + 0), + SC2730_REGU_LINEAR(DCDC_MEM, "dcdc-mem", SC2730_POWER_PD_SW, + SC2730_DCDC_MEM_PD_MASK, SC2730_DCDC_MEM_VOL, + SC2730_DCDC_MEM_VOL_MASK, 6250, 0, 1593750, + 0), + SC2730_REGU_LINEAR(DCDC_MEMQ, "dcdc-memq", SC2730_POWER_PD_SW, + SC2730_DCDC_MEMQ_PD_MASK, SC2730_DCDC_MEMQ_VOL, + SC2730_DCDC_MEMQ_VOL_MASK, 3125, 0, 1596875, + 0), + SC2730_REGU_LINEAR(DCDC_GEN0, "dcdc-gen0", SC2730_POWER_PD_SW, + SC2730_DCDC_GEN0_PD_MASK, SC2730_DCDC_GEN0_VOL, + SC2730_DCDC_GEN0_VOL_MASK, 9375, 20000, 2410625, + 0), + SC2730_REGU_LINEAR(DCDC_GEN1, "dcdc-gen1", SC2730_POWER_PD_SW, + SC2730_DCDC_GEN1_PD_MASK, SC2730_DCDC_GEN1_VOL, + SC2730_DCDC_GEN1_VOL_MASK, 6250, 50000, 1643750, + 0), + SC2730_REGU_LINEAR(DCDC_SRAM, "dcdc-sram", SC2730_POWER_PD_SW, + SC2730_DCDC_SRAM_PD_MASK, SC2730_DCDC_SRAM_VOL, + SC2730_DCDC_SRAM_VOL_MASK, 3125, 0, 1596875, + 0), + SC2730_REGU_LINEAR(LDO_AVDD18, "ldo-avdd18", SC2730_POWER_PD_SW, + SC2730_LDO_AVDD18_PD_MASK, SC2730_LDO_AVDD18_VOL, + SC2730_LDO_AVDD18_VOL_MASK, 10000, 1175000, 1805000, + 0), + SC2730_REGU_LINEAR(LDO_VDDRF18, "ldo-vddrf18", SC2730_LDO_VDDRF18_PD, + SC2730_LDO_VDDRF18_PD_MASK, SC2730_LDO_VDDRF18_VOL, + SC2730_LDO_VDDRF18_VOL_MASK, 10000, 1175000, 1805000, + 0), + SC2730_REGU_LINEAR(LDO_VDDCAMIO, "ldo-vddcamio", SC2730_LDO_VDDCAMIO_PD, + SC2730_LDO_VDDCAMIO_PD_MASK, SC2730_LDO_VDDCAMIO_VOL, + SC2730_LDO_VDDCAMIO_VOL_MASK, 10000, 1200000, 1830000, + 0), + SC2730_REGU_LINEAR(LDO_VDDWCN, "ldo-vddwcn", SC2730_LDO_VDDWCN_PD, + SC2730_LDO_VDDWCN_PD_MASK, SC2730_LDO_VDDWCN_VOL, + SC2730_LDO_VDDWCN_VOL_MASK, 15000, 900000, 1845000, + 0), + SC2730_REGU_LINEAR(LDO_VDDCAMD1, "ldo-vddcamd1", SC2730_LDO_VDDCAMD1_PD, + SC2730_LDO_VDDCAMD1_PD_MASK, SC2730_LDO_VDDCAMD1_VOL, + SC2730_LDO_VDDCAMD1_VOL_MASK, 15000, 900000, 1365000, + 0), + SC2730_REGU_LINEAR(LDO_VDDCAMD0, "ldo-vddcamd0", SC2730_LDO_VDDCAMD0_PD, + SC2730_LDO_VDDCAMD0_PD_MASK, SC2730_LDO_VDDCAMD0_VOL, + SC2730_LDO_VDDCAMD0_VOL_MASK, 15000, 900000, 1365000, + 0), + SC2730_REGU_LINEAR(LDO_VDDRF1V25, "ldo-vddrf1v25", SC2730_LDO_VDDRF1V25_PD, + SC2730_LDO_VDDRF1V25_PD_MASK, SC2730_LDO_VDDRF1V25_VOL, + SC2730_LDO_VDDRF1V25_VOL_MASK, 15000, 900000, 1365000, + 0), + SC2730_REGU_LINEAR(LDO_AVDD12, "ldo-avdd12", SC2730_LDO_AVDD12_PD, + SC2730_LDO_AVDD12_PD_MASK, SC2730_LDO_AVDD12_VOL, + SC2730_LDO_AVDD12_VOL_MASK, 15000, 900000, 1365000, + 0), + SC2730_REGU_LINEAR(LDO_VDDCAMA0, "ldo-vddcama0", SC2730_LDO_VDDCAMA0_PD, + SC2730_LDO_VDDCAMA0_PD_MASK, SC2730_LDO_VDDCAMA0_VOL, + SC2730_LDO_VDDCAMA0_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDCAMA1, "ldo-vddcama1", SC2730_LDO_VDDCAMA1_PD, + SC2730_LDO_VDDCAMA1_PD_MASK, SC2730_LDO_VDDCAMA1_VOL, + SC2730_LDO_VDDCAMA1_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDCAMMOT, "ldo-vddcammot", SC2730_LDO_VDDCAMMOT_PD, + SC2730_LDO_VDDCAMMOT_PD_MASK, SC2730_LDO_VDDCAMMOT_VOL, + SC2730_LDO_VDDCAMMOT_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDSIM2, "ldo-vddsim2", SC2730_LDO_VDDSIM2_PD, + SC2730_LDO_VDDSIM2_PD_MASK, SC2730_LDO_VDDSIM2_VOL, + SC2730_LDO_VDDSIM2_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDEMMCCORE, "ldo-vddemmccore", SC2730_LDO_VDDEMMCCORE_PD, + SC2730_LDO_VDDEMMCCORE_PD_MASK, SC2730_LDO_VDDEMMCCORE_VOL, + SC2730_LDO_VDDEMMCCORE_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDSDCORE, "ldo-vddsdcore", SC2730_LDO_VDDSDCORE_PD, + SC2730_LDO_VDDSDCORE_PD_MASK, SC2730_LDO_VDDSDCORE_VOL, + SC2730_LDO_VDDSDCORE_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDSDIO, "ldo-vddsdio", SC2730_LDO_VDDSDIO_PD, + SC2730_LDO_VDDSDIO_PD_MASK, SC2730_LDO_VDDSDIO_VOL, + SC2730_LDO_VDDSDIO_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDD28, "ldo-vdd28", SC2730_POWER_PD_SW, + SC2730_LDO_VDD28_PD_MASK, SC2730_LDO_VDD28_VOL, + SC2730_LDO_VDD28_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDWIFIPA, "ldo-vddwifipa", SC2730_LDO_VDDWIFIPA_PD, + SC2730_LDO_VDDWIFIPA_PD_MASK, SC2730_LDO_VDDWIFIPA_VOL, + SC2730_LDO_VDDWIFIPA_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDD18_DCXO, "ldo-vdd18-dcxo", SC2730_POWER_PD_SW, + SC2730_LDO_VDD18_DCXO_PD_MASK, SC2730_LDO_VDD18_DCXO_VOL, + SC2730_LDO_VDD18_DCXO_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDUSB33, "ldo-vddusb33", SC2730_LDO_VDDUSB33_PD, + SC2730_LDO_VDDUSB33_PD_MASK, SC2730_LDO_VDDUSB33_VOL, + SC2730_LDO_VDDUSB33_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDLDO0, "ldo-vddldo0", SC2730_LDO_VDDLDO0_PD, + SC2730_LDO_VDDLDO0_PD_MASK, SC2730_LDO_VDDLDO0_VOL, + SC2730_LDO_VDDLDO0_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDLDO1, "ldo-vddldo1", SC2730_LDO_VDDLDO1_PD, + SC2730_LDO_VDDLDO1_PD_MASK, SC2730_LDO_VDDLDO1_VOL, + SC2730_LDO_VDDLDO1_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDLDO2, "ldo-vddldo2", SC2730_LDO_VDDLDO2_PD, + SC2730_LDO_VDDLDO2_PD_MASK, SC2730_LDO_VDDLDO2_VOL, + SC2730_LDO_VDDLDO2_VOL_MASK, 10000, 1200000, 3750000, + 0), + SC2730_REGU_LINEAR(LDO_VDDKPLED, "ldo-vddkpled", SC2730_LDO_VDDKPLED_PD, + SC2730_LDO_VDDKPLED_PD_MASK, SC2730_LDO_VDDKPLED_VOL, + SC2730_LDO_VDDKPLED_VOL_MASK, 10000, 1200000, 3750000, + 0), +}; + +static int sc2730_regulator_unlock(struct regmap *regmap) +{ + return regmap_write(regmap, SC2730_PWR_WR_PROT, SC2730_WR_UNLOCK_VALUE); +} + +static int sc2730_regulator_probe(struct platform_device *pdev) +{ + int i, ret; + struct regmap *regmap; + struct regulator_config config = { }; + struct regulator_dev *rdev; + + regmap = dev_get_regmap(pdev->dev.parent, NULL); + if (!regmap) { + dev_err(&pdev->dev, "failed to get regmap.\n"); + return -ENODEV; + } + + ret = sc2730_regulator_unlock(regmap); + if (ret) { + dev_err(&pdev->dev, "failed to release regulator lock\n"); + return ret; + } + + config.dev = pdev->dev.parent; + config.regmap = regmap; + + for (i = 0; i < ARRAY_SIZE(regulators); i++) { + rdev = devm_regulator_register(&pdev->dev, ®ulators[i], &config); + if (IS_ERR(rdev)) { + dev_err(&pdev->dev, "failed to register regulator %s\n", + regulators[i].name); + return PTR_ERR(rdev); + } + } + + return 0; +} + +static const struct platform_device_id sc2730_regulator_id_table[] = { + { "sc2730-regulator" }, + { } +}; +MODULE_DEVICE_TABLE(platform, sc2730_regulator_id_table); + +static struct platform_driver sc2730_regulator_driver = { + .driver = { + .name = "sc2730-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, + }, + .probe = sc2730_regulator_probe, + .id_table = sc2730_regulator_id_table, +}; + +module_platform_driver(sc2730_regulator_driver); + +MODULE_AUTHOR("Zhongfa Wang <zhongfa.wang@unisoc.com>"); +MODULE_DESCRIPTION("Spreadtrum SC2730 regulator driver"); +MODULE_LICENSE("GPL"); -- 2.51.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC 2026-05-19 12:06 ` [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC Otto Pflüger @ 2026-05-19 12:54 ` sashiko-bot 2026-05-20 15:48 ` Mark Brown 1 sibling, 0 replies; 10+ messages in thread From: sashiko-bot @ 2026-05-19 12:54 UTC (permalink / raw) To: Otto Pflüger; +Cc: devicetree, conor+dt, robh Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] The voltage control register for LDO_VDDCAMIO is defined with an incorrect offset (0x28), which will corrupt unrelated PMIC hardware state when written to. -- commit d755f6665748cda3b92f492a8c7a6cfc5194b4c6 Author: Otto Pflüger <otto.pflueger@abscue.de> regulator: Add regulator driver for Unisoc SC2730 PMIC Add a regulator driver for the Spreadtrum/Unisoc SC2730 PMIC, used e.g. with the UMS512 and UMS9230 SoCs. This version of the driver is based on a downstream driver provided by Unisoc [1][2] and the existing SC2731 driver. [1]: https://github.com/MotorolaMobilityLLC/kernel-sprd/commit/30be0ddfe6b9a877fc9c328fbd2bae84e645eb31 [2]: https://github.com/MotorolaMobilityLLC/kernel-sprd/blob/android-13-release-tla33/drivers/regulator/sc2730-regulator.c > diff --git a/drivers/regulator/sc2730-regulator.c b/drivers/regulator/sc2730-regulator.c > new file mode 100644 > index 0000000000000..9e40c6eae4943 > --- /dev/null > +++ b/drivers/regulator/sc2730-regulator.c > @@ -0,0 +1,411 @@ [ ... ] > +/* > + * SC2730 enable register > + */ > +#define SC2730_POWER_PD_SW (SC2730_REGULATOR_BASE + 0x01c) > +#define SC2730_LDO_VDDRF18_PD (SC2730_REGULATOR_BASE + 0x10c) > +#define SC2730_LDO_VDDCAMIO_PD (SC2730_REGULATOR_BASE + 0x118) > +#define SC2730_LDO_VDDWCN_PD (SC2730_REGULATOR_BASE + 0x11c) [ ... ] > +/* > + * SC2730 vsel register > + */ [ ... ] > +#define SC2730_LDO_AVDD18_VOL (SC2730_REGULATOR_BASE + 0x104) > +#define SC2730_LDO_VDDRF18_VOL (SC2730_REGULATOR_BASE + 0x110) > +#define SC2730_LDO_VDDCAMIO_VOL (SC2730_REGULATOR_BASE + 0x28) Is this offset for SC2730_LDO_VDDCAMIO_VOL correct? In this driver, LDO voltage control registers (_VOL) appear to strictly follow their power-down registers (_PD) at a +4 byte offset (e.g., VDDRF18_PD is 0x10c and VDDRF18_VOL is 0x110). SC2730_LDO_VDDCAMIO_VOL is defined as (SC2730_REGULATOR_BASE + 0x28). This offset is outside the LDO register block (which spans 0x100 to 0x210) and sits between the global power register (0x1c) and the DCDC block (0x44). Will writing to 0x28 overwrite an unrelated PMIC register instead of setting the LDO voltage? Additionally, VDDCAMIO_PD is defined at 0x118, which leaves no room for a +4 byte _VOL register because VDDWCN_PD occupies 0x11c. Should VDDCAMIO_PD be 0x114 and VDDCAMIO_VOL be 0x118 to fit the established 8-byte register stride? > +#define SC2730_LDO_VDDWCN_VOL (SC2730_REGULATOR_BASE + 0x120) -- Sashiko AI review · https://sashiko.dev/#/patchset/20260519-sc2730-regulators-v3-0-5bf0e02507e3@abscue.de?part=3 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC 2026-05-19 12:06 ` [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC Otto Pflüger 2026-05-19 12:54 ` sashiko-bot @ 2026-05-20 15:48 ` Mark Brown 1 sibling, 0 replies; 10+ messages in thread From: Mark Brown @ 2026-05-20 15:48 UTC (permalink / raw) To: Otto Pflüger Cc: Liam Girdwood, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Orson Zhai, Baolin Wang, Chunyan Zhang, Lee Jones, linux-kernel, devicetree, Zhongfa Wang [-- Attachment #1: Type: text/plain, Size: 357 bytes --] On Tue, May 19, 2026 at 02:06:13PM +0200, Otto Pflüger wrote: > +static const struct platform_device_id sc2730_regulator_id_table[] = { > + { "sc2730-regulator" }, > + { } > +}; > +MODULE_DEVICE_TABLE(platform, sc2730_regulator_id_table); Unless you modify the MFD to register this child device it won't be instantiated - how did you test this? [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-05-20 15:48 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-19 12:06 [PATCH v3 0/3] regulator: Add support for Unisoc SC2730 PMIC regulators Otto Pflüger 2026-05-19 12:06 ` [PATCH v3 1/3] regulator: dt-bindings: Add Unisoc SC2730 PMIC Otto Pflüger 2026-05-19 12:18 ` sashiko-bot 2026-05-19 17:28 ` Conor Dooley 2026-05-20 7:23 ` Krzysztof Kozlowski 2026-05-19 12:06 ` [PATCH v3 2/3] dt-bindings: mfd: sprd,sc2731: Include SC2730 regulator bindings Otto Pflüger 2026-05-19 12:30 ` sashiko-bot 2026-05-19 12:06 ` [PATCH v3 3/3] regulator: Add regulator driver for Unisoc SC2730 PMIC Otto Pflüger 2026-05-19 12:54 ` sashiko-bot 2026-05-20 15:48 ` Mark Brown
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox