This series adds bindings and a driver for the two pairs of LDOs
inside the Allwinner D1 SoC.
A preparatory binding and driver change is required for the SRAM
controller, so the regulators device can be its child node.
Changes in v2:
- Remove syscon property from bindings
- Update binding examples to fix warnings and provide context
- Use decimal numbers for .n_voltages instead of field widths
- Get the regmap from the parent device instead of a property/phandle
Samuel Holland (4):
dt-bindings: sram: sunxi-sram: Add optional regulators child
soc: sunxi: sram: Only iterate over SRAM children
regulator: dt-bindings: Add Allwinner D1 LDOs
regulator: sun20i: Add support for Allwinner D1 LDOs
.../allwinner,sun20i-d1-analog-ldos.yaml | 65 +++++
.../allwinner,sun20i-d1-system-ldos.yaml | 57 +++++
.../allwinner,sun4i-a10-system-control.yaml | 3 +
drivers/regulator/Kconfig | 8 +
drivers/regulator/Makefile | 1 +
drivers/regulator/sun20i-regulator.c | 232 ++++++++++++++++++
drivers/soc/sunxi/sunxi_sram.c | 3 +
7 files changed, 369 insertions(+)
create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
create mode 100644 drivers/regulator/sun20i-regulator.c
--
2.35.1
The Allwinner D1 SoC contains two pairs of in-package LDOs. One pair is
for general purpose use. LDOA generally powers the board's 1.8 V rail.
LDOB generally powers the in-package DRAM, where applicable.
The other pair of LDOs powers the analog power domains inside the SoC,
including the audio codec, thermal sensor, and ADCs. These LDOs require
a 0.9 V bandgap voltage reference. The calibration value for the voltage
reference is stored in an eFuse, accessed via an NVMEM cell.
Neither LDO control register is in its own MMIO range; instead, each
regulator device relies on a regmap/syscon exported by its parent.
Signed-off-by: Samuel Holland <[email protected]>
---
Changes in v2:
- Remove syscon property from bindings
- Update binding examples to fix warnings and provide context
.../allwinner,sun20i-d1-analog-ldos.yaml | 65 +++++++++++++++++++
.../allwinner,sun20i-d1-system-ldos.yaml | 57 ++++++++++++++++
2 files changed, 122 insertions(+)
create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
new file mode 100644
index 000000000000..19c984ef4e53
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-analog-ldos.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Allwinner D1 Analog LDOs
+
+description:
+ Allwinner D1 contains a set of LDOs which are designed to supply analog power
+ inside and outside the SoC. They are controlled by a register within the audio
+ codec MMIO space, but which is not part of the audio codec clock/reset domain.
+
+maintainers:
+ - Samuel Holland <[email protected]>
+
+properties:
+ compatible:
+ enum:
+ - allwinner,sun20i-d1-analog-ldos
+
+ nvmem-cells:
+ items:
+ - description: NVMEM cell for the calibrated bandgap reference trim value
+
+ nvmem-cell-names:
+ items:
+ - const: bg_trim
+
+patternProperties:
+ "^(aldo|hpldo)$":
+ type: object
+ $ref: regulator.yaml#
+
+required:
+ - compatible
+ - nvmem-cells
+ - nvmem-cell-names
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ audio-codec@2030000 {
+ compatible = "simple-mfd", "syscon";
+ reg = <0x2030000 0x1000>;
+
+ regulators {
+ compatible = "allwinner,sun20i-d1-analog-ldos";
+ nvmem-cells = <&bg_trim>;
+ nvmem-cell-names = "bg_trim";
+
+ reg_aldo: aldo {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+
+ reg_hpldo: hpldo {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+ };
+ };
+
+...
diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
new file mode 100644
index 000000000000..c95030a827d6
--- /dev/null
+++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
@@ -0,0 +1,57 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-system-ldos.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Allwinner D1 System LDOs
+
+description:
+ Allwinner D1 contains a pair of general-purpose LDOs which are designed to
+ supply power inside and outside the SoC. They are controlled by a register
+ within the system control MMIO space.
+
+maintainers:
+ - Samuel Holland <[email protected]>
+
+properties:
+ compatible:
+ enum:
+ - allwinner,sun20i-d1-system-ldos
+
+patternProperties:
+ "^(ldoa|ldob)$":
+ type: object
+ $ref: regulator.yaml#
+
+required:
+ - compatible
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ syscon@3000000 {
+ compatible = "allwinner,sun20i-d1-system-control";
+ reg = <0x3000000 0x1000>;
+ ranges;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ regulators {
+ compatible = "allwinner,sun20i-d1-system-ldos";
+
+ reg_ldoa: ldoa {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ };
+
+ reg_ldob: ldob {
+ regulator-name = "vcc-dram";
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ };
+ };
+ };
+
+...
--
2.35.1
On Tue, 02 Aug 2022 00:32:12 -0500, Samuel Holland wrote:
> The Allwinner D1 SoC contains two pairs of in-package LDOs. One pair is
> for general purpose use. LDOA generally powers the board's 1.8 V rail.
> LDOB generally powers the in-package DRAM, where applicable.
>
> The other pair of LDOs powers the analog power domains inside the SoC,
> including the audio codec, thermal sensor, and ADCs. These LDOs require
> a 0.9 V bandgap voltage reference. The calibration value for the voltage
> reference is stored in an eFuse, accessed via an NVMEM cell.
>
> Neither LDO control register is in its own MMIO range; instead, each
> regulator device relies on a regmap/syscon exported by its parent.
>
> Signed-off-by: Samuel Holland <[email protected]>
> ---
>
> Changes in v2:
> - Remove syscon property from bindings
> - Update binding examples to fix warnings and provide context
>
> .../allwinner,sun20i-d1-analog-ldos.yaml | 65 +++++++++++++++++++
> .../allwinner,sun20i-d1-system-ldos.yaml | 57 ++++++++++++++++
> 2 files changed, 122 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
>
My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
on your patch (DT_CHECKER_FLAGS is new in v5.13):
yamllint warnings/errors:
dtschema/dtc warnings/errors:
Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.example.dtb:0:0: /example-0/syscon@3000000: failed to match any schema with compatible: ['allwinner,sun20i-d1-system-control']
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/patch/
This check can fail if there are any dependencies. The base for a patch
series is generally the most recent rc1.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit.
On Tue, Aug 02, 2022 at 12:32:12AM -0500, Samuel Holland wrote:
> The Allwinner D1 SoC contains two pairs of in-package LDOs. One pair is
> for general purpose use. LDOA generally powers the board's 1.8 V rail.
> LDOB generally powers the in-package DRAM, where applicable.
>
> The other pair of LDOs powers the analog power domains inside the SoC,
> including the audio codec, thermal sensor, and ADCs. These LDOs require
> a 0.9 V bandgap voltage reference. The calibration value for the voltage
> reference is stored in an eFuse, accessed via an NVMEM cell.
>
> Neither LDO control register is in its own MMIO range; instead, each
> regulator device relies on a regmap/syscon exported by its parent.
>
> Signed-off-by: Samuel Holland <[email protected]>
> ---
>
> Changes in v2:
> - Remove syscon property from bindings
> - Update binding examples to fix warnings and provide context
>
> .../allwinner,sun20i-d1-analog-ldos.yaml | 65 +++++++++++++++++++
> .../allwinner,sun20i-d1-system-ldos.yaml | 57 ++++++++++++++++
> 2 files changed, 122 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
>
> diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
> new file mode 100644
> index 000000000000..19c984ef4e53
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
> @@ -0,0 +1,65 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-analog-ldos.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Allwinner D1 Analog LDOs
> +
> +description:
> + Allwinner D1 contains a set of LDOs which are designed to supply analog power
> + inside and outside the SoC. They are controlled by a register within the audio
> + codec MMIO space, but which is not part of the audio codec clock/reset domain.
> +
> +maintainers:
> + - Samuel Holland <[email protected]>
> +
> +properties:
> + compatible:
> + enum:
> + - allwinner,sun20i-d1-analog-ldos
> +
> + nvmem-cells:
> + items:
> + - description: NVMEM cell for the calibrated bandgap reference trim value
> +
> + nvmem-cell-names:
> + items:
> + - const: bg_trim
> +
> +patternProperties:
> + "^(aldo|hpldo)$":
'^(a|hp)ldo$'
> + type: object
> + $ref: regulator.yaml#
unevaluatedProperties: false
> +
> +required:
> + - compatible
> + - nvmem-cells
> + - nvmem-cell-names
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + audio-codec@2030000 {
> + compatible = "simple-mfd", "syscon";
Needs a specific compatible. Obviously there's some other functionality
here if this is an 'audio-codec'.
'simple-mfd' also means the child nodes have zero dependence on the
parent node and its resources.
> + reg = <0x2030000 0x1000>;
> +
> + regulators {
> + compatible = "allwinner,sun20i-d1-analog-ldos";
Is there a defined set of registers for these regulators? If so, put
them into 'reg'.
> + nvmem-cells = <&bg_trim>;
> + nvmem-cell-names = "bg_trim";
> +
> + reg_aldo: aldo {
> + regulator-min-microvolt = <1800000>;
> + regulator-max-microvolt = <1800000>;
> + };
> +
> + reg_hpldo: hpldo {
> + regulator-min-microvolt = <1800000>;
> + regulator-max-microvolt = <1800000>;
> + };
> + };
> + };
> +
> +...
> diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
> new file mode 100644
> index 000000000000..c95030a827d6
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
> @@ -0,0 +1,57 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-system-ldos.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Allwinner D1 System LDOs
> +
> +description:
> + Allwinner D1 contains a pair of general-purpose LDOs which are designed to
> + supply power inside and outside the SoC. They are controlled by a register
> + within the system control MMIO space.
> +
> +maintainers:
> + - Samuel Holland <[email protected]>
> +
> +properties:
> + compatible:
> + enum:
> + - allwinner,sun20i-d1-system-ldos
> +
> +patternProperties:
> + "^(ldoa|ldob)$":
'^ldo[ab]$'
Any reason the naming is not consistent with 'ldo' as the prefix or
suffix?
> + type: object
> + $ref: regulator.yaml#
unevaluatedProperties: false
> +
> +required:
> + - compatible
> +
> +unevaluatedProperties: false
> +
> +examples:
> + - |
> + syscon@3000000 {
> + compatible = "allwinner,sun20i-d1-system-control";
> + reg = <0x3000000 0x1000>;
> + ranges;
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + regulators {
> + compatible = "allwinner,sun20i-d1-system-ldos";
> +
> + reg_ldoa: ldoa {
> + regulator-min-microvolt = <1800000>;
> + regulator-max-microvolt = <1800000>;
> + };
> +
> + reg_ldob: ldob {
> + regulator-name = "vcc-dram";
> + regulator-min-microvolt = <1500000>;
> + regulator-max-microvolt = <1500000>;
> + };
> + };
> + };
> +
> +...
> --
> 2.35.1
>
>
Hi Rob,
Thanks again for your review.
On 8/2/22 10:04 AM, Rob Herring wrote:
> On Tue, Aug 02, 2022 at 12:32:12AM -0500, Samuel Holland wrote:
>> The Allwinner D1 SoC contains two pairs of in-package LDOs. One pair is
>> for general purpose use. LDOA generally powers the board's 1.8 V rail.
>> LDOB generally powers the in-package DRAM, where applicable.
>>
>> The other pair of LDOs powers the analog power domains inside the SoC,
>> including the audio codec, thermal sensor, and ADCs. These LDOs require
>> a 0.9 V bandgap voltage reference. The calibration value for the voltage
>> reference is stored in an eFuse, accessed via an NVMEM cell.
>>
>> Neither LDO control register is in its own MMIO range; instead, each
>> regulator device relies on a regmap/syscon exported by its parent.
>>
>> Signed-off-by: Samuel Holland <[email protected]>
>> ---
>>
>> Changes in v2:
>> - Remove syscon property from bindings
>> - Update binding examples to fix warnings and provide context
>>
>> .../allwinner,sun20i-d1-analog-ldos.yaml | 65 +++++++++++++++++++
>> .../allwinner,sun20i-d1-system-ldos.yaml | 57 ++++++++++++++++
>> 2 files changed, 122 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
>> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
>>
>> diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
>> new file mode 100644
>> index 000000000000..19c984ef4e53
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
>> @@ -0,0 +1,65 @@
>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>> +%YAML 1.2
>> +---
>> +$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-analog-ldos.yaml#
>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>> +
>> +title: Allwinner D1 Analog LDOs
>> +
>> +description:
>> + Allwinner D1 contains a set of LDOs which are designed to supply analog power
>> + inside and outside the SoC. They are controlled by a register within the audio
>> + codec MMIO space, but which is not part of the audio codec clock/reset domain.
>> +
>> +maintainers:
>> + - Samuel Holland <[email protected]>
>> +
>> +properties:
>> + compatible:
>> + enum:
>> + - allwinner,sun20i-d1-analog-ldos
>> +
>> + nvmem-cells:
>> + items:
>> + - description: NVMEM cell for the calibrated bandgap reference trim value
>> +
>> + nvmem-cell-names:
>> + items:
>> + - const: bg_trim
>> +
>> +patternProperties:
>> + "^(aldo|hpldo)$":
>
> '^(a|hp)ldo$'
>
>> + type: object
>> + $ref: regulator.yaml#
>
> unevaluatedProperties: false
>
>> +
>> +required:
>> + - compatible
>> + - nvmem-cells
>> + - nvmem-cell-names
>> +
>> +unevaluatedProperties: false
>> +
>> +examples:
>> + - |
>> + audio-codec@2030000 {
>> + compatible = "simple-mfd", "syscon";
>
> Needs a specific compatible. Obviously there's some other functionality
> here if this is an 'audio-codec'.
I am not yet ready to submit the binding or driver for the audio codec, as I
still need to work out the details for jack detection (and some other issues).
If I added the specific audio codec compatible now, without the properties
required for the sound driver, that would create backward compatibility issues,
right?
My intention is to add the specific compatible along with the ASoC support.
> 'simple-mfd' also means the child nodes have zero dependence on the
> parent node and its resources.
That is correct. The regulators have zero dependencies on the audio codec
resources (clocks/resets/etc.). The _only_ relationship is the overlapping
address of the MMIO register.
>> + reg = <0x2030000 0x1000>;
>> +
>> + regulators {
>> + compatible = "allwinner,sun20i-d1-analog-ldos";
>
> Is there a defined set of registers for these regulators? If so, put
> them into 'reg'.
What do you suggest for 'ranges' in the parent device? I ask because the
SRAM/system controller binding requires an empty 'ranges' property.
With empty 'ranges', the child has to compute the relative address for use with
the parent's regmap, but maybe that is okay?
>> + nvmem-cells = <&bg_trim>;
>> + nvmem-cell-names = "bg_trim";
>> +
>> + reg_aldo: aldo {
>> + regulator-min-microvolt = <1800000>;
>> + regulator-max-microvolt = <1800000>;
>> + };
>> +
>> + reg_hpldo: hpldo {
>> + regulator-min-microvolt = <1800000>;
>> + regulator-max-microvolt = <1800000>;
>> + };
>> + };
>> + };
>> +
>> +...
>> diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
>> new file mode 100644
>> index 000000000000..c95030a827d6
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
>> @@ -0,0 +1,57 @@
>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>> +%YAML 1.2
>> +---
>> +$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-system-ldos.yaml#
>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>> +
>> +title: Allwinner D1 System LDOs
>> +
>> +description:
>> + Allwinner D1 contains a pair of general-purpose LDOs which are designed to
>> + supply power inside and outside the SoC. They are controlled by a register
>> + within the system control MMIO space.
>> +
>> +maintainers:
>> + - Samuel Holland <[email protected]>
>> +
>> +properties:
>> + compatible:
>> + enum:
>> + - allwinner,sun20i-d1-system-ldos
>> +
>> +patternProperties:
>> + "^(ldoa|ldob)$":
>
> '^ldo[ab]$'
>
> Any reason the naming is not consistent with 'ldo' as the prefix or
> suffix?
All four names match the pin names from the SoC datasheet.
>> + type: object
>> + $ref: regulator.yaml#
>
> unevaluatedProperties: false
I will fix these for v3.
Regards,
Samuel
>> +
>> +required:
>> + - compatible
>> +
>> +unevaluatedProperties: false
>> +
>> +examples:
>> + - |
>> + syscon@3000000 {
>> + compatible = "allwinner,sun20i-d1-system-control";
>> + reg = <0x3000000 0x1000>;
>> + ranges;
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> +
>> + regulators {
>> + compatible = "allwinner,sun20i-d1-system-ldos";
>> +
>> + reg_ldoa: ldoa {
>> + regulator-min-microvolt = <1800000>;
>> + regulator-max-microvolt = <1800000>;
>> + };
>> +
>> + reg_ldob: ldob {
>> + regulator-name = "vcc-dram";
>> + regulator-min-microvolt = <1500000>;
>> + regulator-max-microvolt = <1500000>;
>> + };
>> + };
>> + };
>> +
>> +...
>> --
>> 2.35.1
>>
>>
Dne četrtek, 04. avgust 2022 ob 05:03:07 CEST je Samuel Holland napisal(a):
> Hi Rob,
>
> Thanks again for your review.
>
> On 8/2/22 10:04 AM, Rob Herring wrote:
> > On Tue, Aug 02, 2022 at 12:32:12AM -0500, Samuel Holland wrote:
> >> The Allwinner D1 SoC contains two pairs of in-package LDOs. One pair is
> >> for general purpose use. LDOA generally powers the board's 1.8 V rail.
> >> LDOB generally powers the in-package DRAM, where applicable.
> >>
> >> The other pair of LDOs powers the analog power domains inside the SoC,
> >> including the audio codec, thermal sensor, and ADCs. These LDOs require
> >> a 0.9 V bandgap voltage reference. The calibration value for the voltage
> >> reference is stored in an eFuse, accessed via an NVMEM cell.
> >>
> >> Neither LDO control register is in its own MMIO range; instead, each
> >> regulator device relies on a regmap/syscon exported by its parent.
> >>
> >> Signed-off-by: Samuel Holland <[email protected]>
> >> ---
> >>
> >> Changes in v2:
> >> - Remove syscon property from bindings
> >> - Update binding examples to fix warnings and provide context
> >>
> >> .../allwinner,sun20i-d1-analog-ldos.yaml | 65 +++++++++++++++++++
> >> .../allwinner,sun20i-d1-system-ldos.yaml | 57 ++++++++++++++++
> >> 2 files changed, 122 insertions(+)
> >> create mode 100644
> >> Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-
> >> ldos.yaml create mode 100644
> >> Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-
> >> ldos.yaml>>
> >> diff --git
> >> a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog
> >> -ldos.yaml
> >> b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog
> >> -ldos.yaml new file mode 100644
> >> index 000000000000..19c984ef4e53
> >> --- /dev/null
> >> +++
> >> b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog
> >> -ldos.yaml @@ -0,0 +1,65 @@
> >> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> >> +%YAML 1.2
> >> +---
> >> +$id:
> >> http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-analog-ldos.
> >> yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml#
> >> +
> >> +title: Allwinner D1 Analog LDOs
> >> +
> >> +description:
> >> + Allwinner D1 contains a set of LDOs which are designed to supply
> >> analog power + inside and outside the SoC. They are controlled by a
> >> register within the audio + codec MMIO space, but which is not part of
> >> the audio codec clock/reset domain. +
> >> +maintainers:
> >> + - Samuel Holland <[email protected]>
> >> +
> >> +properties:
> >> + compatible:
> >> + enum:
> >> + - allwinner,sun20i-d1-analog-ldos
> >> +
> >> + nvmem-cells:
> >> + items:
> >> + - description: NVMEM cell for the calibrated bandgap reference
> >> trim value +
> >> + nvmem-cell-names:
> >> + items:
> >> + - const: bg_trim
> >> +
> >> +patternProperties:
> >
> >> + "^(aldo|hpldo)$":
> > '^(a|hp)ldo$'
> >
> >> + type: object
> >> + $ref: regulator.yaml#
> >>
> > unevaluatedProperties: false
> >>
> >> +
> >> +required:
> >> + - compatible
> >> + - nvmem-cells
> >> + - nvmem-cell-names
> >> +
> >> +unevaluatedProperties: false
> >> +
> >> +examples:
> >> + - |
> >> + audio-codec@2030000 {
> >> + compatible = "simple-mfd", "syscon";
> >
> > Needs a specific compatible. Obviously there's some other functionality
> > here if this is an 'audio-codec'.
>
> I am not yet ready to submit the binding or driver for the audio codec, as I
> still need to work out the details for jack detection (and some other
> issues). If I added the specific audio codec compatible now, without the
> properties required for the sound driver, that would create backward
> compatibility issues, right?
>
> My intention is to add the specific compatible along with the ASoC support.
>
> > 'simple-mfd' also means the child nodes have zero dependence on the
> > parent node and its resources.
>
> That is correct. The regulators have zero dependencies on the audio codec
> resources (clocks/resets/etc.). The _only_ relationship is the overlapping
> address of the MMIO register.
LDO registers are at the end of analogue codec MMIO space, right? We can
easily split that to separate device, like it's been done for A20 timer &
watchdog.
Best regards,
Jernej
>
> >> + reg = <0x2030000 0x1000>;
> >> +
> >> + regulators {
> >> + compatible = "allwinner,sun20i-d1-analog-ldos";
> >
> > Is there a defined set of registers for these regulators? If so, put
> > them into 'reg'.
>
> What do you suggest for 'ranges' in the parent device? I ask because the
> SRAM/system controller binding requires an empty 'ranges' property.
>
> With empty 'ranges', the child has to compute the relative address for use
> with the parent's regmap, but maybe that is okay?
>
> >> + nvmem-cells = <&bg_trim>;
> >> + nvmem-cell-names = "bg_trim";
> >> +
> >> + reg_aldo: aldo {
> >> + regulator-min-microvolt = <1800000>;
> >> + regulator-max-microvolt = <1800000>;
> >> + };
> >> +
> >> + reg_hpldo: hpldo {
> >> + regulator-min-microvolt = <1800000>;
> >> + regulator-max-microvolt = <1800000>;
> >> + };
> >> + };
> >> + };
> >> +
> >> +...
> >> diff --git
> >> a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system
> >> -ldos.yaml
> >> b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system
> >> -ldos.yaml new file mode 100644
> >> index 000000000000..c95030a827d6
> >> --- /dev/null
> >> +++
> >> b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system
> >> -ldos.yaml @@ -0,0 +1,57 @@
> >> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> >> +%YAML 1.2
> >> +---
> >> +$id:
> >> http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-system-ldos.
> >> yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml#
> >> +
> >> +title: Allwinner D1 System LDOs
> >> +
> >> +description:
> >> + Allwinner D1 contains a pair of general-purpose LDOs which are
> >> designed to + supply power inside and outside the SoC. They are
> >> controlled by a register + within the system control MMIO space.
> >> +
> >> +maintainers:
> >> + - Samuel Holland <[email protected]>
> >> +
> >> +properties:
> >> + compatible:
> >> + enum:
> >> + - allwinner,sun20i-d1-system-ldos
> >> +
> >> +patternProperties:
> >
> >> + "^(ldoa|ldob)$":
> > '^ldo[ab]$'
> >
> > Any reason the naming is not consistent with 'ldo' as the prefix or
> > suffix?
>
> All four names match the pin names from the SoC datasheet.
>
> >> + type: object
> >> + $ref: regulator.yaml#
> >>
> > unevaluatedProperties: false
>
> I will fix these for v3.
>
> Regards,
> Samuel
>
> >> +
> >> +required:
> >> + - compatible
> >> +
> >> +unevaluatedProperties: false
> >> +
> >> +examples:
> >> + - |
> >> + syscon@3000000 {
> >> + compatible = "allwinner,sun20i-d1-system-control";
> >> + reg = <0x3000000 0x1000>;
> >> + ranges;
> >> + #address-cells = <1>;
> >> + #size-cells = <1>;
> >> +
> >> + regulators {
> >> + compatible = "allwinner,sun20i-d1-system-ldos";
> >> +
> >> + reg_ldoa: ldoa {
> >> + regulator-min-microvolt = <1800000>;
> >> + regulator-max-microvolt = <1800000>;
> >> + };
> >> +
> >> + reg_ldob: ldob {
> >> + regulator-name = "vcc-dram";
> >> + regulator-min-microvolt = <1500000>;
> >> + regulator-max-microvolt = <1500000>;
> >> + };
> >> + };
> >> + };
> >> +
> >> +...
On August 4, 2022 5:11:39 AM UTC, "Jernej Škrabec" <[email protected]> wrote:
>> > 'simple-mfd' also means the child nodes have zero dependence on the
>> > parent node and its resources.
>>
>> That is correct. The regulators have zero dependencies on the audio codec
>> resources (clocks/resets/etc.). The _only_ relationship is the overlapping
>> address of the MMIO register.
>
>LDO registers are at the end of analogue codec MMIO space, right? We can
>easily split that to separate device, like it's been done for A20 timer &
>watchdog.
No, there are some audio-related registers after the LDO register ("POWER_REG" in the D1 and V853 manuals).
So it is not possible to cleanly split the MMIO region.
Regards,
Samuel
On Wed, Aug 03, 2022 at 10:03:07PM -0500, Samuel Holland wrote:
> Hi Rob,
>
> Thanks again for your review.
>
> On 8/2/22 10:04 AM, Rob Herring wrote:
> > On Tue, Aug 02, 2022 at 12:32:12AM -0500, Samuel Holland wrote:
> >> The Allwinner D1 SoC contains two pairs of in-package LDOs. One pair is
> >> for general purpose use. LDOA generally powers the board's 1.8 V rail.
> >> LDOB generally powers the in-package DRAM, where applicable.
> >>
> >> The other pair of LDOs powers the analog power domains inside the SoC,
> >> including the audio codec, thermal sensor, and ADCs. These LDOs require
> >> a 0.9 V bandgap voltage reference. The calibration value for the voltage
> >> reference is stored in an eFuse, accessed via an NVMEM cell.
> >>
> >> Neither LDO control register is in its own MMIO range; instead, each
> >> regulator device relies on a regmap/syscon exported by its parent.
> >>
> >> Signed-off-by: Samuel Holland <[email protected]>
> >> ---
> >>
> >> Changes in v2:
> >> - Remove syscon property from bindings
> >> - Update binding examples to fix warnings and provide context
> >>
> >> .../allwinner,sun20i-d1-analog-ldos.yaml | 65 +++++++++++++++++++
> >> .../allwinner,sun20i-d1-system-ldos.yaml | 57 ++++++++++++++++
> >> 2 files changed, 122 insertions(+)
> >> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
> >> create mode 100644 Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
> >>
> >> diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
> >> new file mode 100644
> >> index 000000000000..19c984ef4e53
> >> --- /dev/null
> >> +++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-analog-ldos.yaml
> >> @@ -0,0 +1,65 @@
> >> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> >> +%YAML 1.2
> >> +---
> >> +$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-analog-ldos.yaml#
> >> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> >> +
> >> +title: Allwinner D1 Analog LDOs
> >> +
> >> +description:
> >> + Allwinner D1 contains a set of LDOs which are designed to supply analog power
> >> + inside and outside the SoC. They are controlled by a register within the audio
> >> + codec MMIO space, but which is not part of the audio codec clock/reset domain.
> >> +
> >> +maintainers:
> >> + - Samuel Holland <[email protected]>
> >> +
> >> +properties:
> >> + compatible:
> >> + enum:
> >> + - allwinner,sun20i-d1-analog-ldos
> >> +
> >> + nvmem-cells:
> >> + items:
> >> + - description: NVMEM cell for the calibrated bandgap reference trim value
> >> +
> >> + nvmem-cell-names:
> >> + items:
> >> + - const: bg_trim
> >> +
> >> +patternProperties:
> >> + "^(aldo|hpldo)$":
> >
> > '^(a|hp)ldo$'
> >
> >> + type: object
> >> + $ref: regulator.yaml#
> >
> > unevaluatedProperties: false
> >
> >> +
> >> +required:
> >> + - compatible
> >> + - nvmem-cells
> >> + - nvmem-cell-names
> >> +
> >> +unevaluatedProperties: false
> >> +
> >> +examples:
> >> + - |
> >> + audio-codec@2030000 {
> >> + compatible = "simple-mfd", "syscon";
> >
> > Needs a specific compatible. Obviously there's some other functionality
> > here if this is an 'audio-codec'.
>
> I am not yet ready to submit the binding or driver for the audio codec, as I
> still need to work out the details for jack detection (and some other issues).
> If I added the specific audio codec compatible now, without the properties
> required for the sound driver, that would create backward compatibility issues,
> right?
Only if something used it.
> My intention is to add the specific compatible along with the ASoC support.
>
> > 'simple-mfd' also means the child nodes have zero dependence on the
> > parent node and its resources.
>
> That is correct. The regulators have zero dependencies on the audio codec
> resources (clocks/resets/etc.). The _only_ relationship is the overlapping
> address of the MMIO register.
Okay.
>
> >> + reg = <0x2030000 0x1000>;
> >> +
> >> + regulators {
> >> + compatible = "allwinner,sun20i-d1-analog-ldos";
> >
> > Is there a defined set of registers for these regulators? If so, put
> > them into 'reg'.
>
> What do you suggest for 'ranges' in the parent device? I ask because the
> SRAM/system controller binding requires an empty 'ranges' property.
I think you are misreading 'ranges: true'. That just means the property
can be present, not that it's type is boolean.
> With empty 'ranges', the child has to compute the relative address for use with
> the parent's regmap, but maybe that is okay?
We should probably have some sort of 'address to regmap offset' helper
that works no matter what ranges has.
In most cases, while I require 'reg', unless the child nodes use a mixed
up set of registers, Linux doesn't currently use 'reg'. You can also
just hardcode the offsets in your driver.
> >> + nvmem-cells = <&bg_trim>;
> >> + nvmem-cell-names = "bg_trim";
> >> +
> >> + reg_aldo: aldo {
> >> + regulator-min-microvolt = <1800000>;
> >> + regulator-max-microvolt = <1800000>;
> >> + };
> >> +
> >> + reg_hpldo: hpldo {
> >> + regulator-min-microvolt = <1800000>;
> >> + regulator-max-microvolt = <1800000>;
> >> + };
> >> + };
> >> + };
> >> +
> >> +...
> >> diff --git a/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
> >> new file mode 100644
> >> index 000000000000..c95030a827d6
> >> --- /dev/null
> >> +++ b/Documentation/devicetree/bindings/regulator/allwinner,sun20i-d1-system-ldos.yaml
> >> @@ -0,0 +1,57 @@
> >> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> >> +%YAML 1.2
> >> +---
> >> +$id: http://devicetree.org/schemas/regulator/allwinner,sun20i-d1-system-ldos.yaml#
> >> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> >> +
> >> +title: Allwinner D1 System LDOs
> >> +
> >> +description:
> >> + Allwinner D1 contains a pair of general-purpose LDOs which are designed to
> >> + supply power inside and outside the SoC. They are controlled by a register
> >> + within the system control MMIO space.
> >> +
> >> +maintainers:
> >> + - Samuel Holland <[email protected]>
> >> +
> >> +properties:
> >> + compatible:
> >> + enum:
> >> + - allwinner,sun20i-d1-system-ldos
> >> +
> >> +patternProperties:
> >> + "^(ldoa|ldob)$":
> >
> > '^ldo[ab]$'
> >
> > Any reason the naming is not consistent with 'ldo' as the prefix or
> > suffix?
>
> All four names match the pin names from the SoC datasheet.
Good enough for me.
Rob