regulator: Updates for v6.11

This s a very quiet release for the regulator API, we have a few new
 devices (most of which are just ID updates) and one new fairly
 specialist core feature for use in interrupt context.
 
  - An API allowing lockless enable/disable for regulators acquired in
    exclusive mode, for use in interrupt contexts.
  - A rewrite of the MedaTek DVFSRC regulator driver which apparently
    never worked.
  - Support for Mediaktek MT6312, Qualcomm QCA6390 and WCN7850, Renesas
    RZ/G2L USB VBUS regulator and ST Microelectronics STM32MP13.
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmaVJv4ACgkQJNaLcl1U
 h9DkzQf9GVcF09+cL00DX4MYmLtbehB/5b5ucdNa5XpBK03oYTFb6epx2NpAM5HO
 emYugPdAzyicdsU8pyh7HTUypE/s0aAYIv6jtaBiNv6jVxdyANsFP/eulzdEyIyA
 mm6oWPDHrNBj772AMC2gDraEEK07cC8ETD7cUMxkdop7qH9sclJugKPIFSV12SvL
 QxmyNfqtilOyvR/ncihV2Aln1+31bDXzdEeCALCEvmfUfuYs7HfzkwC0hpnBZEf8
 v3SE23XGT9n8IyPaRjymhTe4gvh7+3wslRkAiSfgye5OGUFzgfO9Cpwv9mWo8TbV
 fJQw2yNZ5Go/F2sqzHu22DrR/z5QoA==
 =yC/L
 -----END PGP SIGNATURE-----

Merge tag 'regulator-v6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator

Pull regulator updates from Mark Brown:
 "This s a very quiet release for the regulator API, we have a few new
  devices (most of which are just ID updates) and one new fairly
  specialist core feature for use in interrupt context.

   - An API allowing lockless enable/disable for regulators acquired in
     exclusive mode, for use in interrupt contexts

   - A rewrite of the MedaTek DVFSRC regulator driver which apparently
     never worked

   - Support for Mediaktek MT6312, Qualcomm QCA6390 and WCN7850, Renesas
     RZ/G2L USB VBUS regulator and ST Microelectronics STM32MP13"

* tag 'regulator-v6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator: (26 commits)
  regulator: dt-bindings: pca9450: Make interrupt optional
  regulator: pca9450: Make IRQ optional
  dt-bindings: regulator: sprd,sc2731-regulator: convert to YAML
  regulator: max77857: Constify struct regmap_config
  regulator: da9121: Constify struct regmap_config
  dt-bindings: regulator: ti,tps65132: document VIN supply
  dt-bindings: mfd: twl: Fix example
  regulator: Add Renesas RZ/G2L USB VBUS regulator driver
  regulator: core: Add helper for allow HW access to enable/disable regulator
  regulator: Add bindings for MediaTek DVFSRC Regulators
  regulator: Add refactored mtk-dvfsrc-regulator driver
  regulator: Remove mtk-dvfsrc-regulator.c
  regulator: userspace-consumer: quiet device deferral
  regulator: dt-bindings: mt6315: Document MT6319 PMIC
  regulator: add missing MODULE_DESCRIPTION() macro
  dt-bindings: regulator: twl-regulator: convert to yaml
  regulator: dt-bindings: describe the PMU module of the WCN7850 package
  regulator: dt-bindings: describe the PMU module of the QCA6390 package
  regulator: dt-bindings: rtq2208: Add specified fixed LDO VOUT property
  regulator: rtq2208: Add fixed LDO VOUT property and check that matches the constraints
  ...
This commit is contained in:
Linus Torvalds 2024-07-15 17:59:12 -07:00
commit 584aeccc0b
44 changed files with 838 additions and 352 deletions

View file

@ -22,6 +22,32 @@ allOf:
contains:
const: ti,twl4030
then:
patternProperties:
"^regulator-":
properties:
compatible:
enum:
- ti,twl4030-vaux1
- ti,twl4030-vaux2
- ti,twl4030-vaux3
- ti,twl4030-vaux4
- ti,twl4030-vmmc1
- ti,twl4030-vmmc2
- ti,twl4030-vpll1
- ti,twl4030-vpll2
- ti,twl4030-vsim
- ti,twl4030-vdac
- ti,twl4030-vintana2
- ti,twl4030-vio
- ti,twl4030-vdd1
- ti,twl4030-vdd2
- ti,twl4030-vintana1
- ti,twl4030-vintdig
- ti,twl4030-vusb1v5
- ti,twl4030-vusb1v8
- ti,twl4030-vusb3v1
ti,retain-on-reset: false
properties:
madc:
type: object
@ -50,13 +76,34 @@ allOf:
properties:
compatible:
const: ti,twl4030-wdt
- if:
properties:
compatible:
contains:
const: ti,twl6030
then:
patternProperties:
"^regulator-":
properties:
compatible:
enum:
- ti,twl6030-vaux1
- ti,twl6030-vaux2
- ti,twl6030-vaux3
- ti,twl6030-vmmc
- ti,twl6030-vpp
- ti,twl6030-vusim
- ti,twl6030-vana
- ti,twl6030-vcxio
- ti,twl6030-vdac
- ti,twl6030-vusb
- ti,twl6030-v1v8
- ti,twl6030-v2v1
- ti,twl6030-vdd1
- ti,twl6030-vdd2
- ti,twl6030-vdd3
regulator-initial-mode: false
properties:
gpadc:
type: object
@ -69,6 +116,25 @@ allOf:
contains:
const: ti,twl6032
then:
patternProperties:
"^regulator-":
properties:
compatible:
enum:
- ti,twl6032-ldo1
- ti,twl6032-ldo2
- ti,twl6032-ldo3
- ti,twl6032-ldo4
- ti,twl6032-ldo5
- ti,twl6032-ldo6
- ti,twl6032-ldo7
- ti,twl6032-ldoln
- ti,twl6032-ldousb
- ti,twl6032-smps3
- ti,twl6032-smps4
- ti,twl6032-vio
regulator-initial-mode: false
properties:
gpadc:
type: object
@ -112,6 +178,27 @@ properties:
interrupts:
maxItems: 1
patternProperties:
"^regulator-":
type: object
unevaluatedProperties: false
$ref: /schemas/regulator/regulator.yaml
properties:
compatible: true
regulator-initial-mode:
enum:
- 0x08 # Sleep mode, the nominal output voltage is maintained
# with low power consumption with low load current capability
- 0x0e # Active mode, the regulator can deliver its nominal output
# voltage with full-load current capability
ti,retain-on-reset:
description:
Does not turn off the supplies during warm
reset. Could be needed for VMMC, as TWL6030
reset sequence for this signal does not comply
with the SD specification.
type: boolean
unevaluatedProperties: false
required:
@ -131,9 +218,85 @@ examples:
compatible = "ti,twl6030";
reg = <0x48>;
interrupts = <39>; /* IRQ_SYS_1N cascaded to gic */
interrupt-parent = <&gic>;
interrupt-controller;
#interrupt-cells = <1>;
interrupt-parent = <&gic>;
gpadc {
compatible = "ti,twl6030-gpadc";
interrupts = <6>;
#io-channel-cells = <1>;
};
rtc {
compatible = "ti,twl4030-rtc";
interrupts = <8>;
};
regulator-vaux1 {
compatible = "ti,twl6030-vaux1";
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3000000>;
};
regulator-vmmc1 {
compatible = "ti,twl6030-vmmc";
ti,retain-on-reset;
};
};
};
- |
i2c {
#address-cells = <1>;
#size-cells = <0>;
pmic@48 {
compatible = "ti,twl4030";
reg = <0x48>;
interrupts = <7>; /* SYS_NIRQ cascaded to intc */
interrupt-parent = <&intc>;
interrupt-controller;
#interrupt-cells = <1>;
bci {
compatible = "ti,twl4030-bci";
interrupts = <9>, <2>;
bci3v1-supply = <&vusb3v1>;
io-channels = <&twl_madc 11>;
io-channel-names = "vac";
};
twl_madc: madc {
compatible = "ti,twl4030-madc";
interrupts = <3>;
#io-channel-cells = <1>;
};
pwrbutton {
compatible = "ti,twl4030-pwrbutton";
interrupts = <8>;
};
rtc {
compatible = "ti,twl4030-rtc";
interrupts = <11>;
};
regulator-vaux1 {
compatible = "ti,twl4030-vaux1";
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3000000>;
regulator-initial-mode = <0xe>;
};
vusb3v1: regulator-vusb3v1 {
compatible = "ti,twl4030-vusb3v1";
};
watchdog {
compatible = "ti,twl4030-wdt";
};
};
};
...

View file

@ -0,0 +1,43 @@
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/regulator/mediatek,mt6873-dvfsrc-regulator.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: MediaTek DVFSRC-controlled Regulators
description:
The Dynamic Voltage and Frequency Scaling Resource Collector Regulators
are controlled with votes to the DVFSRC hardware.
maintainers:
- AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
properties:
compatible:
enum:
- mediatek,mt6873-dvfsrc-regulator
- mediatek,mt8183-dvfsrc-regulator
- mediatek,mt8192-dvfsrc-regulator
- mediatek,mt8195-dvfsrc-regulator
dvfsrc-vcore:
description: DVFSRC-controlled SoC Vcore regulator
$ref: regulator.yaml#
unevaluatedProperties: false
dvfsrc-vscp:
description: DVFSRC-controlled System Control Processor regulator
$ref: regulator.yaml#
unevaluatedProperties: false
required:
- compatible
anyOf:
- required:
- dvfsrc-vcore
- required:
- dvfsrc-vscp
additionalProperties: false

View file

@ -16,7 +16,11 @@ description: |
properties:
compatible:
const: mediatek,mt6315-regulator
oneOf:
- items:
- const: mediatek,mt6319-regulator
- const: mediatek,mt6315-regulator
- const: mediatek,mt6315-regulator
reg:
maxItems: 1

View file

@ -96,7 +96,6 @@ properties:
required:
- compatible
- reg
- interrupts
- regulators
additionalProperties: false

View file

@ -0,0 +1,185 @@
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/regulator/qcom,qca6390-pmu.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Qualcomm Technologies, Inc. QCA6390 PMU Regulators
maintainers:
- Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
description:
The QCA6390 package contains discrete modules for WLAN and Bluetooth. They
are powered by the Power Management Unit (PMU) that takes inputs from the
host and provides LDO outputs. This document describes this module.
properties:
compatible:
enum:
- qcom,qca6390-pmu
- qcom,wcn7850-pmu
vdd-supply:
description: VDD supply regulator handle
vddaon-supply:
description: VDD_AON supply regulator handle
vdddig-supply:
description: VDD_DIG supply regulator handle
vddpmu-supply:
description: VDD_PMU supply regulator handle
vddio1p2-supply:
description: VDD_IO_1P2 supply regulator handle
vddrfa0p95-supply:
description: VDD_RFA_0P95 supply regulator handle
vddrfa1p2-supply:
description: VDD_RFA_1P2 supply regulator handle
vddrfa1p3-supply:
description: VDD_RFA_1P3 supply regulator handle
vddrfa1p8-supply:
description: VDD_RFA_1P8 supply regulator handle
vddrfa1p9-supply:
description: VDD_RFA_1P9 supply regulator handle
vddpcie1p3-supply:
description: VDD_PCIE_1P3 supply regulator handle
vddpcie1p9-supply:
description: VDD_PCIE_1P9 supply regulator handle
vddio-supply:
description: VDD_IO supply regulator handle
wlan-enable-gpios:
maxItems: 1
description: GPIO line enabling the ATH11K WLAN module supplied by the PMU
bt-enable-gpios:
maxItems: 1
description: GPIO line enabling the ATH11K Bluetooth module supplied by the PMU
clocks:
maxItems: 1
description: Reference clock handle
regulators:
type: object
description:
LDO outputs of the PMU
patternProperties:
"^ldo[0-9]$":
$ref: regulator.yaml#
type: object
unevaluatedProperties: false
additionalProperties: false
required:
- compatible
- regulators
allOf:
- if:
properties:
compatible:
contains:
const: qcom,qca6390-pmu
then:
required:
- vddaon-supply
- vddpmu-supply
- vddrfa0p95-supply
- vddrfa1p3-supply
- vddrfa1p9-supply
- vddpcie1p3-supply
- vddpcie1p9-supply
- vddio-supply
- if:
properties:
compatible:
contains:
const: qcom,wcn7850-pmu
then:
required:
- vdd-supply
- vddio-supply
- vddaon-supply
- vdddig-supply
- vddrfa1p2-supply
- vddrfa1p8-supply
additionalProperties: false
examples:
- |
#include <dt-bindings/gpio/gpio.h>
pmu {
compatible = "qcom,qca6390-pmu";
pinctrl-names = "default";
pinctrl-0 = <&bt_en_state>, <&wlan_en_state>;
vddaon-supply = <&vreg_s6a_0p95>;
vddpmu-supply = <&vreg_s2f_0p95>;
vddrfa0p95-supply = <&vreg_s2f_0p95>;
vddrfa1p3-supply = <&vreg_s8c_1p3>;
vddrfa1p9-supply = <&vreg_s5a_1p9>;
vddpcie1p3-supply = <&vreg_s8c_1p3>;
vddpcie1p9-supply = <&vreg_s5a_1p9>;
vddio-supply = <&vreg_s4a_1p8>;
wlan-enable-gpios = <&tlmm 20 GPIO_ACTIVE_HIGH>;
bt-enable-gpios = <&tlmm 21 GPIO_ACTIVE_HIGH>;
regulators {
vreg_pmu_rfa_cmn: ldo0 {
regulator-name = "vreg_pmu_rfa_cmn";
};
vreg_pmu_aon_0p59: ldo1 {
regulator-name = "vreg_pmu_aon_0p59";
};
vreg_pmu_wlcx_0p8: ldo2 {
regulator-name = "vreg_pmu_wlcx_0p8";
};
vreg_pmu_wlmx_0p85: ldo3 {
regulator-name = "vreg_pmu_wlmx_0p85";
};
vreg_pmu_btcmx_0p85: ldo4 {
regulator-name = "vreg_pmu_btcmx_0p85";
};
vreg_pmu_rfa_0p8: ldo5 {
regulator-name = "vreg_pmu_rfa_0p8";
};
vreg_pmu_rfa_1p2: ldo6 {
regulator-name = "vreg_pmu_rfa_1p2";
};
vreg_pmu_rfa_1p7: ldo7 {
regulator-name = "vreg_pmu_rfa_1p7";
};
vreg_pmu_pcie_0p9: ldo8 {
regulator-name = "vreg_pmu_pcie_0p9";
};
vreg_pmu_pcie_1p8: ldo9 {
regulator-name = "vreg_pmu_pcie_1p8";
};
};
};

View file

@ -75,6 +75,12 @@ properties:
description:
regulator description for ldo[1-2].
properties:
richtek,fixed-microvolt:
description: |
This property can be used to set a fixed operating voltage that lies outside
the range of the regulator's adjustable mode.
required:
- compatible
- reg
@ -177,6 +183,8 @@ examples:
};
};
ldo1 {
/* Fixed LDO VOUT */
richtek,fixed-microvolt = <1200000>;
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
@ -185,7 +193,8 @@ examples:
};
};
ldo2 {
regulator-min-microvolt = <3300000>;
/* Adjustable LDO VOUT */
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
regulator-state-mem {

View file

@ -1,43 +0,0 @@
Spreadtrum SC2731 Voltage regulators
The SC2731 integrates low-voltage and low quiescent current DCDC/LDO.
14 LDO and 3 DCDCs are designed for external use. All DCDCs/LDOs have
their own bypass (power-down) control signals. External tantalum or MLCC
ceramic capacitors are recommended to use with these LDOs.
Required properties:
- compatible: should be "sprd,sc27xx-regulator".
List of regulators provided by this controller. It is named according to
its regulator type, BUCK_<name> and LDO_<name>. The definition for each
of these nodes is defined using the standard binding for regulators at
Documentation/devicetree/bindings/regulator/regulator.txt.
The valid names for regulators are:
BUCK:
BUCK_CPU0, BUCK_CPU1, BUCK_RF
LDO:
LDO_CAMA0, LDO_CAMA1, LDO_CAMMOT, LDO_VLDO, LDO_EMMCCORE, LDO_SDCORE,
LDO_SDIO, LDO_WIFIPA, LDO_USB33, LDO_CAMD0, LDO_CAMD1, LDO_CON,
LDO_CAMIO, LDO_SRAM
Example:
regulators {
compatible = "sprd,sc27xx-regulator";
vddarm0: BUCK_CPU0 {
regulator-name = "vddarm0";
regulator-min-microvolt = <400000>;
regulator-max-microvolt = <1996875>;
regulator-ramp-delay = <25000>;
regulator-always-on;
};
vddcama0: LDO_CAMA0 {
regulator-name = "vddcama0";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <3750000>;
regulator-enable-ramp-delay = <100>;
};
...
};

View file

@ -0,0 +1,67 @@
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/regulator/sprd,sc2731-regulator.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Spreadtrum SC2731 Power Management IC regulators
maintainers:
- Orson Zhai <orsonzhai@gmail.com>
- Baolin Wang <baolin.wang7@gmail.com>
- Chunyan Zhang <zhang.lyra@gmail.com>
description: |
The SC2731 integrates low-voltage and low quiescent current DCDC/LDO.
14 LDO and 3 DCDCs are designed for external use. All DCDCs/LDOs have
their own bypass (power-down) control signals. It is recommended to use
external tantalum or MLCC ceramic capacitors with these LDOs.
Valid names for the regulators are:
BUCK:
BUCK_CPU0, BUCK_CPU1, BUCK_RF
LDO:
LDO_CAMA0, LDO_CAMA1, LDO_CAMD0, LDO_CAMD1, LDO_CAMIO, LDO_CAMMOT,
LDO_CON, LDO_EMMCCORE, LDO_SDCORE, LDO_SDIO, LDO_SRAM, LDO_USB33,
LDO_VLDO, LDO_WIFIPA
properties:
compatible:
const: sprd,sc2731-regulator
patternProperties:
"^BUCK_(CPU[0-1]|RF)$":
type: object
$ref: regulator.yaml#
unevaluatedProperties: false
"^LDO_(CAM(A0|A1|D0|D1|IO|MOT)|CON|EMMCCORE|SD(CORE|IO)|SRAM|USB33|VLDO|WIFIPA)$":
type: object
$ref: regulator.yaml#
unevaluatedProperties: false
required:
- compatible
additionalProperties: false
examples:
- |
regulators {
compatible = "sprd,sc2731-regulator";
BUCK_CPU0 {
regulator-name = "vddarm0";
regulator-min-microvolt = <400000>;
regulator-max-microvolt = <1996875>;
regulator-ramp-delay = <25000>;
regulator-always-on;
};
LDO_CAMA0 {
regulator-name = "vddcama0";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <3750000>;
regulator-enable-ramp-delay = <100>;
};
};
...

View file

@ -11,7 +11,12 @@ maintainers:
properties:
compatible:
const: st,stm32mp1,pwr-reg
oneOf:
- items:
- const: st,stm32mp1,pwr-reg
- items:
- const: st,stm32mp13-pwr-reg
- const: st,stm32mp1,pwr-reg
reg:
maxItems: 1

View file

@ -23,6 +23,8 @@ properties:
reg:
maxItems: 1
vin-supply: true
patternProperties:
"^out[pn]$":
type: object
@ -65,6 +67,7 @@ examples:
regulator@3e {
compatible = "ti,tps65132";
reg = <0x3e>;
vin-supply = <&supply>;
outp {
regulator-name = "outp";

View file

@ -1,80 +0,0 @@
TWL family of regulators
Required properties:
For twl6030 regulators/LDOs
- compatible:
- "ti,twl6030-vaux1" for VAUX1 LDO
- "ti,twl6030-vaux2" for VAUX2 LDO
- "ti,twl6030-vaux3" for VAUX3 LDO
- "ti,twl6030-vmmc" for VMMC LDO
- "ti,twl6030-vpp" for VPP LDO
- "ti,twl6030-vusim" for VUSIM LDO
- "ti,twl6030-vana" for VANA LDO
- "ti,twl6030-vcxio" for VCXIO LDO
- "ti,twl6030-vdac" for VDAC LDO
- "ti,twl6030-vusb" for VUSB LDO
- "ti,twl6030-v1v8" for V1V8 LDO
- "ti,twl6030-v2v1" for V2V1 LDO
- "ti,twl6030-vdd1" for VDD1 SMPS
- "ti,twl6030-vdd2" for VDD2 SMPS
- "ti,twl6030-vdd3" for VDD3 SMPS
For twl6032 regulators/LDOs
- compatible:
- "ti,twl6032-ldo1" for LDO1 LDO
- "ti,twl6032-ldo2" for LDO2 LDO
- "ti,twl6032-ldo3" for LDO3 LDO
- "ti,twl6032-ldo4" for LDO4 LDO
- "ti,twl6032-ldo5" for LDO5 LDO
- "ti,twl6032-ldo6" for LDO6 LDO
- "ti,twl6032-ldo7" for LDO7 LDO
- "ti,twl6032-ldoln" for LDOLN LDO
- "ti,twl6032-ldousb" for LDOUSB LDO
- "ti,twl6032-smps3" for SMPS3 SMPS
- "ti,twl6032-smps4" for SMPS4 SMPS
- "ti,twl6032-vio" for VIO SMPS
For twl4030 regulators/LDOs
- compatible:
- "ti,twl4030-vaux1" for VAUX1 LDO
- "ti,twl4030-vaux2" for VAUX2 LDO
- "ti,twl5030-vaux2" for VAUX2 LDO
- "ti,twl4030-vaux3" for VAUX3 LDO
- "ti,twl4030-vaux4" for VAUX4 LDO
- "ti,twl4030-vmmc1" for VMMC1 LDO
- "ti,twl4030-vmmc2" for VMMC2 LDO
- "ti,twl4030-vpll1" for VPLL1 LDO
- "ti,twl4030-vpll2" for VPLL2 LDO
- "ti,twl4030-vsim" for VSIM LDO
- "ti,twl4030-vdac" for VDAC LDO
- "ti,twl4030-vintana2" for VINTANA2 LDO
- "ti,twl4030-vio" for VIO LDO
- "ti,twl4030-vdd1" for VDD1 SMPS
- "ti,twl4030-vdd2" for VDD2 SMPS
- "ti,twl4030-vintana1" for VINTANA1 LDO
- "ti,twl4030-vintdig" for VINTDIG LDO
- "ti,twl4030-vusb1v5" for VUSB1V5 LDO
- "ti,twl4030-vusb1v8" for VUSB1V8 LDO
- "ti,twl4030-vusb3v1" for VUSB3V1 LDO
Optional properties:
- Any optional property defined in bindings/regulator/regulator.txt
For twl4030 regulators/LDOs:
- regulator-initial-mode:
- 0x08 - Sleep mode, the nominal output voltage is maintained with low power
consumption with low load current capability.
- 0x0e - Active mode, the regulator can deliver its nominal output voltage
with full-load current capability.
Example:
xyz: regulator@0 {
compatible = "ti,twl6030-vaux1";
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3000000>;
};
For twl6030 regulators/LDOs:
- ti,retain-on-reset: Does not turn off the supplies during warm
reset. Could be needed for VMMC, as TWL6030
reset sequence for this signal does not comply
with the SD specification.

View file

@ -227,3 +227,9 @@ directly written to the voltage selector register, use::
int regulator_list_hardware_vsel(struct regulator *regulator,
unsigned selector);
To access the hardware for enabling/disabling the regulator, consumers must
use regulator_get_exclusive(), as it can't work if there's more than one
consumer. To enable/disable regulator use::
int regulator_hardware_enable(struct regulator *regulator, bool enable);

View file

@ -1634,6 +1634,15 @@ config REGULATOR_UNIPHIER
help
Support for regulators implemented on Socionext UniPhier SoCs.
config REGULATOR_RZG2L_VBCTRL
tristate "Renesas RZ/G2L USB VBUS regulator driver"
depends on ARCH_RZG2L || COMPILE_TEST
depends on OF
select REGMAP_MMIO
default ARCH_RZG2L
help
Support for VBUS regulators implemented on Renesas RZ/G2L SoCs.
config REGULATOR_VCTRL
tristate "Voltage controlled regulators"
depends on OF

View file

@ -189,6 +189,7 @@ obj-$(CONFIG_REGULATOR_TPS65132) += tps65132-regulator.o
obj-$(CONFIG_REGULATOR_TPS68470) += tps68470-regulator.o
obj-$(CONFIG_REGULATOR_TWL4030) += twl-regulator.o twl6030-regulator.o
obj-$(CONFIG_REGULATOR_UNIPHIER) += uniphier-regulator.o
obj-$(CONFIG_REGULATOR_RZG2L_VBCTRL) += renesas-usb-vbus-regulator.o
obj-$(CONFIG_REGULATOR_VCTRL) += vctrl-regulator.o
obj-$(CONFIG_REGULATOR_VEXPRESS) += vexpress-regulator.o
obj-$(CONFIG_REGULATOR_VQMMC_IPQ4019) += vqmmc-ipq4019-regulator.o

View file

@ -3408,6 +3408,34 @@ int regulator_list_hardware_vsel(struct regulator *regulator,
}
EXPORT_SYMBOL_GPL(regulator_list_hardware_vsel);
/**
* regulator_hardware_enable - access the HW for enable/disable regulator
* @regulator: regulator source
* @enable: true for enable, false for disable
*
* Request that the regulator be enabled/disabled with the regulator output at
* the predefined voltage or current value.
*
* On success 0 is returned, otherwise a negative errno is returned.
*/
int regulator_hardware_enable(struct regulator *regulator, bool enable)
{
struct regulator_dev *rdev = regulator->rdev;
const struct regulator_ops *ops = rdev->desc->ops;
int ret = -EOPNOTSUPP;
if (!rdev->exclusive || !ops || !ops->enable || !ops->disable)
return ret;
if (enable)
ret = ops->enable(rdev);
else
ret = ops->disable(rdev);
return ret;
}
EXPORT_SYMBOL_GPL(regulator_hardware_enable);
/**
* regulator_get_linear_step - return the voltage step size between VSEL values
* @regulator: regulator source

View file

@ -865,7 +865,7 @@ static const struct regmap_access_table da9121_volatile_table = {
};
/* DA9121 regmap config for 1 channel variants */
static struct regmap_config da9121_1ch_regmap_config = {
static const struct regmap_config da9121_1ch_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.max_register = DA9121_REG_OTP_CONFIG_ID,
@ -876,7 +876,7 @@ static struct regmap_config da9121_1ch_regmap_config = {
};
/* DA9121 regmap config for 2 channel variants */
static struct regmap_config da9121_2ch_regmap_config = {
static const struct regmap_config da9121_2ch_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.max_register = DA9121_REG_OTP_CONFIG_ID,
@ -993,7 +993,7 @@ static int da9121_check_device_type(struct i2c_client *i2c, struct da9121 *chip)
static int da9121_assign_chip_model(struct i2c_client *i2c,
struct da9121 *chip)
{
struct regmap_config *regmap;
const struct regmap_config *regmap;
int ret = 0;
chip->dev = &i2c->dev;
@ -1192,4 +1192,5 @@ static struct i2c_driver da9121_regulator_driver = {
module_i2c_driver(da9121_regulator_driver);
MODULE_DESCRIPTION("Dialog Semiconductor DA9121/DA9122/DA9220/DA9217/DA9130/DA9131/DA9132 regulator driver");
MODULE_LICENSE("GPL v2");

View file

@ -202,8 +202,8 @@ static int da9210_i2c_probe(struct i2c_client *i2c)
}
static const struct i2c_device_id da9210_i2c_id[] = {
{"da9210", 0},
{},
{ "da9210" },
{}
};
MODULE_DEVICE_TABLE(i2c, da9210_i2c_id);

View file

@ -439,7 +439,7 @@ static int lp3971_i2c_probe(struct i2c_client *i2c)
}
static const struct i2c_device_id lp3971_i2c_id[] = {
{ "lp3971", 0 },
{ "lp3971" },
{ }
};
MODULE_DEVICE_TABLE(i2c, lp3971_i2c_id);

View file

@ -537,7 +537,7 @@ static int lp3972_i2c_probe(struct i2c_client *i2c)
}
static const struct i2c_device_id lp3972_i2c_id[] = {
{ "lp3972", 0 },
{ "lp3972" },
{ }
};
MODULE_DEVICE_TABLE(i2c, lp3972_i2c_id);

View file

@ -430,7 +430,7 @@ static void lp8755_remove(struct i2c_client *client)
}
static const struct i2c_device_id lp8755_id[] = {
{LP8755_NAME, 0},
{ LP8755_NAME },
{}
};

View file

@ -276,7 +276,7 @@ static int max1586_pmic_probe(struct i2c_client *client)
}
static const struct i2c_device_id max1586_id[] = {
{ "max1586", 0 },
{ "max1586" },
{ }
};
MODULE_DEVICE_TABLE(i2c, max1586_id);

View file

@ -145,8 +145,8 @@ static const struct of_device_id of_max20411_match_tbl[] = {
MODULE_DEVICE_TABLE(of, of_max20411_match_tbl);
static const struct i2c_device_id max20411_id[] = {
{ "max20411", 0 },
{ },
{ "max20411" },
{ }
};
MODULE_DEVICE_TABLE(i2c, max20411_id);
@ -161,4 +161,5 @@ static struct i2c_driver max20411_i2c_driver = {
};
module_i2c_driver(max20411_i2c_driver);
MODULE_DESCRIPTION("Maxim MAX20411 High-Efficiency Single Step-Down Converter driver");
MODULE_LICENSE("GPL");

View file

@ -25,14 +25,6 @@
#define MAX77503_AD_ENABLED 0x1
#define MAX77503_AD_DISABLED 0x0
struct max77503_dev {
struct device *dev;
struct device_node *of_node;
struct regulator_desc desc;
struct regulator_dev *rdev;
struct regmap *regmap;
};
static const struct regmap_config max77503_regmap_config = {
.reg_bits = 8,
.val_bits = 8,

View file

@ -67,7 +67,7 @@ static bool max77857_volatile_reg(struct device *dev, unsigned int reg)
}
}
static struct regmap_config max77857_regmap_config = {
static const struct regmap_config max77857_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.cache_type = REGCACHE_MAPLE,

View file

@ -240,7 +240,7 @@ static int max8649_regulator_probe(struct i2c_client *client)
}
static const struct i2c_device_id max8649_id[] = {
{ "max8649", 0 },
{ "max8649" },
{ }
};
MODULE_DEVICE_TABLE(i2c, max8649_id);

View file

@ -162,8 +162,8 @@ MODULE_DEVICE_TABLE(of, max8893_dt_match);
#endif
static const struct i2c_device_id max8893_ids[] = {
{ "max8893", 0 },
{ },
{ "max8893" },
{ }
};
MODULE_DEVICE_TABLE(i2c, max8893_ids);

View file

@ -307,8 +307,8 @@ static int max8952_pmic_probe(struct i2c_client *client)
}
static const struct i2c_device_id max8952_ids[] = {
{ "max8952", 0 },
{ },
{ "max8952" },
{ }
};
MODULE_DEVICE_TABLE(i2c, max8952_ids);

View file

@ -577,7 +577,7 @@ static const struct dev_pm_ops mcp16502_pm_ops = {
};
#endif
static const struct i2c_device_id mcp16502_i2c_id[] = {
{ "mcp16502", 0 },
{ "mcp16502" },
{ }
};
MODULE_DEVICE_TABLE(i2c, mcp16502_i2c_id);

View file

@ -133,8 +133,8 @@ static int mt6311_i2c_probe(struct i2c_client *i2c)
}
static const struct i2c_device_id mt6311_i2c_id[] = {
{"mt6311", 0},
{},
{ "mt6311" },
{}
};
MODULE_DEVICE_TABLE(i2c, mt6311_i2c_id);

View file

@ -1,99 +1,94 @@
// SPDX-License-Identifier: GPL-2.0
//
// Copyright (c) 2020 MediaTek Inc.
/*
* Copyright (C) 2020 MediaTek Inc.
* Copyright (c) 2024 Collabora Ltd.
* AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
*/
#include <linux/err.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of_.h>
#include <linux/of.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/of_regulator.h>
#include <linux/soc/mediatek/mtk_dvfsrc.h>
#include <linux/soc/mediatek/dvfsrc.h>
#define DVFSRC_ID_VCORE 0
#define DVFSRC_ID_VSCP 1
enum dvfsrc_regulator_id {
DVFSRC_ID_VCORE,
DVFSRC_ID_VSCP,
DVFSRC_ID_MAX
};
#define MT_DVFSRC_REGULAR(match, _name, _volt_table) \
[DVFSRC_ID_##_name] = { \
.desc = { \
.name = match, \
.of_match = of_match_ptr(match), \
.ops = &dvfsrc_vcore_ops, \
.type = REGULATOR_VOLTAGE, \
.id = DVFSRC_ID_##_name, \
.owner = THIS_MODULE, \
.n_voltages = ARRAY_SIZE(_volt_table), \
.volt_table = _volt_table, \
}, \
struct dvfsrc_regulator_pdata {
struct regulator_desc *descs;
u32 size;
};
#define MTK_DVFSRC_VREG(match, _name, _volt_table) \
{ \
.name = match, \
.of_match = match, \
.ops = &dvfsrc_vcore_ops, \
.type = REGULATOR_VOLTAGE, \
.id = DVFSRC_ID_##_name, \
.owner = THIS_MODULE, \
.n_voltages = ARRAY_SIZE(_volt_table), \
.volt_table = _volt_table, \
}
/*
* DVFSRC regulators' information
*
* @desc: standard fields of regulator description.
* @voltage_selector: Selector used for get_voltage_sel() and
* set_voltage_sel() callbacks
*/
struct dvfsrc_regulator {
struct regulator_desc desc;
};
/*
* MTK DVFSRC regulators' init data
*
* @size: num of regulators
* @regulator_info: regulator info.
*/
struct dvfsrc_regulator_init_data {
u32 size;
struct dvfsrc_regulator *regulator_info;
};
static inline struct device *to_dvfs_regulator_dev(struct regulator_dev *rdev)
{
return rdev_get_dev(rdev)->parent;
}
static inline struct device *to_dvfsrc_dev(struct regulator_dev *rdev)
{
return rdev_get_dev(rdev)->parent;
return to_dvfs_regulator_dev(rdev)->parent;
}
static int dvfsrc_get_cmd(int rdev_id, enum mtk_dvfsrc_cmd *cmd)
{
switch (rdev_id) {
case DVFSRC_ID_VCORE:
*cmd = MTK_DVFSRC_CMD_VCORE_LEVEL;
break;
case DVFSRC_ID_VSCP:
*cmd = MTK_DVFSRC_CMD_VSCP_LEVEL;
break;
default:
return -EINVAL;
}
return 0;
}
static int dvfsrc_set_voltage_sel(struct regulator_dev *rdev,
unsigned int selector)
{
struct device *dvfsrc_dev = to_dvfsrc_dev(rdev);
enum mtk_dvfsrc_cmd req_cmd;
int id = rdev_get_id(rdev);
int ret;
if (id == DVFSRC_ID_VCORE)
mtk_dvfsrc_send_request(dvfsrc_dev,
MTK_DVFSRC_CMD_VCORE_REQUEST,
selector);
else if (id == DVFSRC_ID_VSCP)
mtk_dvfsrc_send_request(dvfsrc_dev,
MTK_DVFSRC_CMD_VSCP_REQUEST,
selector);
else
return -EINVAL;
ret = dvfsrc_get_cmd(id, &req_cmd);
if (ret)
return ret;
return 0;
return mtk_dvfsrc_send_request(dvfsrc_dev, req_cmd, selector);
}
static int dvfsrc_get_voltage_sel(struct regulator_dev *rdev)
{
struct device *dvfsrc_dev = to_dvfsrc_dev(rdev);
enum mtk_dvfsrc_cmd query_cmd;
int id = rdev_get_id(rdev);
int val, ret;
if (id == DVFSRC_ID_VCORE)
ret = mtk_dvfsrc_query_info(dvfsrc_dev,
MTK_DVFSRC_CMD_VCORE_LEVEL_QUERY,
&val);
else if (id == DVFSRC_ID_VSCP)
ret = mtk_dvfsrc_query_info(dvfsrc_dev,
MTK_DVFSRC_CMD_VSCP_LEVEL_QUERY,
&val);
else
return -EINVAL;
ret = dvfsrc_get_cmd(id, &query_cmd);
if (ret)
return ret;
if (ret != 0)
ret = mtk_dvfsrc_query_info(dvfsrc_dev, query_cmd, &val);
if (ret)
return ret;
return val;
@ -105,21 +100,6 @@ static const struct regulator_ops dvfsrc_vcore_ops = {
.set_voltage_sel = dvfsrc_set_voltage_sel,
};
static const unsigned int mt8183_voltages[] = {
725000,
800000,
};
static struct dvfsrc_regulator mt8183_regulators[] = {
MT_DVFSRC_REGULAR("dvfsrc-vcore", VCORE,
mt8183_voltages),
};
static const struct dvfsrc_regulator_init_data regulator_mt8183_data = {
.size = ARRAY_SIZE(mt8183_regulators),
.regulator_info = &mt8183_regulators[0],
};
static const unsigned int mt6873_voltages[] = {
575000,
600000,
@ -127,88 +107,90 @@ static const unsigned int mt6873_voltages[] = {
725000,
};
static struct dvfsrc_regulator mt6873_regulators[] = {
MT_DVFSRC_REGULAR("dvfsrc-vcore", VCORE,
mt6873_voltages),
MT_DVFSRC_REGULAR("dvfsrc-vscp", VSCP,
mt6873_voltages),
static struct regulator_desc mt6873_regulators[] = {
MTK_DVFSRC_VREG("dvfsrc-vcore", VCORE, mt6873_voltages),
MTK_DVFSRC_VREG("dvfsrc-vscp", VSCP, mt6873_voltages),
};
static const struct dvfsrc_regulator_init_data regulator_mt6873_data = {
static const struct dvfsrc_regulator_pdata mt6873_data = {
.descs = mt6873_regulators,
.size = ARRAY_SIZE(mt6873_regulators),
.regulator_info = &mt6873_regulators[0],
};
static const struct of_device_id mtk_dvfsrc_regulator_match[] = {
{
.compatible = "mediatek,mt8183-dvfsrc",
.data = &regulator_mt8183_data,
}, {
.compatible = "mediatek,mt8192-dvfsrc",
.data = &regulator_mt6873_data,
}, {
.compatible = "mediatek,mt6873-dvfsrc",
.data = &regulator_mt6873_data,
}, {
/* sentinel */
},
static const unsigned int mt8183_voltages[] = {
725000,
800000,
};
static struct regulator_desc mt8183_regulators[] = {
MTK_DVFSRC_VREG("dvfsrc-vcore", VCORE, mt8183_voltages),
};
static const struct dvfsrc_regulator_pdata mt8183_data = {
.descs = mt8183_regulators,
.size = ARRAY_SIZE(mt8183_regulators),
};
static const unsigned int mt8195_voltages[] = {
550000,
600000,
650000,
750000,
};
static struct regulator_desc mt8195_regulators[] = {
MTK_DVFSRC_VREG("dvfsrc-vcore", VCORE, mt8195_voltages),
MTK_DVFSRC_VREG("dvfsrc-vscp", VSCP, mt8195_voltages),
};
static const struct dvfsrc_regulator_pdata mt8195_data = {
.descs = mt8195_regulators,
.size = ARRAY_SIZE(mt8195_regulators),
};
MODULE_DEVICE_TABLE(of, mtk_dvfsrc_regulator_match);
static int dvfsrc_vcore_regulator_probe(struct platform_device *pdev)
{
const struct of_device_id *match;
struct device *dev = &pdev->dev;
struct regulator_config config = { };
struct regulator_dev *rdev;
const struct dvfsrc_regulator_init_data *regulator_init_data;
struct dvfsrc_regulator *mt_regulators;
struct regulator_config config = { .dev = &pdev->dev };
const struct dvfsrc_regulator_pdata *pdata;
int i;
match = of_match_node(mtk_dvfsrc_regulator_match, dev->parent->of_node);
pdata = device_get_match_data(&pdev->dev);
if (!pdata)
return -EINVAL;
if (!match) {
dev_err(dev, "invalid compatible string\n");
return -ENODEV;
}
for (i = 0; i < pdata->size; i++) {
struct regulator_desc *vrdesc = &pdata->descs[i];
struct regulator_dev *rdev;
regulator_init_data = match->data;
mt_regulators = regulator_init_data->regulator_info;
for (i = 0; i < regulator_init_data->size; i++) {
config.dev = dev->parent;
config.driver_data = (mt_regulators + i);
rdev = devm_regulator_register(dev, &(mt_regulators + i)->desc,
&config);
if (IS_ERR(rdev)) {
dev_err(dev, "failed to register %s\n",
(mt_regulators + i)->desc.name);
return PTR_ERR(rdev);
}
rdev = devm_regulator_register(&pdev->dev, vrdesc, &config);
if (IS_ERR(rdev))
return dev_err_probe(&pdev->dev, PTR_ERR(rdev),
"failed to register %s\n", vrdesc->name);
}
return 0;
}
static const struct of_device_id mtk_dvfsrc_regulator_match[] = {
{ .compatible = "mediatek,mt6873-dvfsrc-regulator", .data = &mt6873_data },
{ .compatible = "mediatek,mt8183-dvfsrc-regulator", .data = &mt8183_data },
{ .compatible = "mediatek,mt8192-dvfsrc-regulator", .data = &mt6873_data },
{ .compatible = "mediatek,mt8195-dvfsrc-regulator", .data = &mt8195_data },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mtk_dvfsrc_regulator_match);
static struct platform_driver mtk_dvfsrc_regulator_driver = {
.driver = {
.name = "mtk-dvfsrc-regulator",
.of_match_table = mtk_dvfsrc_regulator_match,
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
},
.probe = dvfsrc_vcore_regulator_probe,
};
module_platform_driver(mtk_dvfsrc_regulator_driver);
static int __init mtk_dvfsrc_regulator_init(void)
{
return platform_driver_register(&mtk_dvfsrc_regulator_driver);
}
subsys_initcall(mtk_dvfsrc_regulator_init);
static void __exit mtk_dvfsrc_regulator_exit(void)
{
platform_driver_unregister(&mtk_dvfsrc_regulator_driver);
}
module_exit(mtk_dvfsrc_regulator_exit);
MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>");
MODULE_AUTHOR("Arvin wang <arvin.wang@mediatek.com>");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("MediaTek DVFS Resource Collector Regulator driver");
MODULE_LICENSE("GPL");

View file

@ -891,11 +891,6 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
unsigned int reset_ctrl;
int ret;
if (!i2c->irq) {
dev_err(&i2c->dev, "No IRQ configured?\n");
return -EINVAL;
}
pca9450 = devm_kzalloc(&i2c->dev, sizeof(struct pca9450), GFP_KERNEL);
if (!pca9450)
return -ENOMEM;
@ -967,23 +962,25 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
}
}
ret = devm_request_threaded_irq(pca9450->dev, pca9450->irq, NULL,
pca9450_irq_handler,
(IRQF_TRIGGER_FALLING | IRQF_ONESHOT),
"pca9450-irq", pca9450);
if (ret != 0) {
dev_err(pca9450->dev, "Failed to request IRQ: %d\n",
pca9450->irq);
return ret;
}
/* Unmask all interrupt except PWRON/WDOG/RSVD */
ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_INT1_MSK,
IRQ_VR_FLT1 | IRQ_VR_FLT2 | IRQ_LOWVSYS |
IRQ_THERM_105 | IRQ_THERM_125,
IRQ_PWRON | IRQ_WDOGB | IRQ_RSVD);
if (ret) {
dev_err(&i2c->dev, "Unmask irq error\n");
return ret;
if (pca9450->irq) {
ret = devm_request_threaded_irq(pca9450->dev, pca9450->irq, NULL,
pca9450_irq_handler,
(IRQF_TRIGGER_FALLING | IRQF_ONESHOT),
"pca9450-irq", pca9450);
if (ret != 0) {
dev_err(pca9450->dev, "Failed to request IRQ: %d\n",
pca9450->irq);
return ret;
}
/* Unmask all interrupt except PWRON/WDOG/RSVD */
ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_INT1_MSK,
IRQ_VR_FLT1 | IRQ_VR_FLT2 | IRQ_LOWVSYS |
IRQ_THERM_105 | IRQ_THERM_125,
IRQ_PWRON | IRQ_WDOGB | IRQ_RSVD);
if (ret) {
dev_err(&i2c->dev, "Unmask irq error\n");
return ret;
}
}
/* Clear PRESET_EN bit in BUCK123_DVS to use DVS registers */

View file

@ -596,10 +596,10 @@ static const struct of_device_id pf8x00_dt_ids[] = {
MODULE_DEVICE_TABLE(of, pf8x00_dt_ids);
static const struct i2c_device_id pf8x00_i2c_id[] = {
{ "pf8100", 0 },
{ "pf8121a", 0 },
{ "pf8200", 0 },
{},
{ "pf8100" },
{ "pf8121a" },
{ "pf8200" },
{}
};
MODULE_DEVICE_TABLE(i2c, pf8x00_i2c_id);

View file

@ -360,8 +360,8 @@ static int pv88060_i2c_probe(struct i2c_client *i2c)
}
static const struct i2c_device_id pv88060_i2c_id[] = {
{"pv88060", 0},
{},
{ "pv88060" },
{}
};
MODULE_DEVICE_TABLE(i2c, pv88060_i2c_id);

View file

@ -381,8 +381,8 @@ static int pv88090_i2c_probe(struct i2c_client *i2c)
}
static const struct i2c_device_id pv88090_i2c_id[] = {
{"pv88090", 0},
{},
{ "pv88090" },
{}
};
MODULE_DEVICE_TABLE(i2c, pv88090_i2c_id);

View file

@ -0,0 +1,74 @@
// SPDX-License-Identifier: GPL-2.0
//
// Renesas USB VBUS output regulator driver
//
// Copyright (C) 2024 Renesas Electronics Corporation
//
#include <linux/module.h>
#include <linux/err.h>
#include <linux/kernel.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>
static const struct regulator_ops rzg2l_usb_vbus_reg_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
};
static const struct regulator_desc rzg2l_usb_vbus_rdesc = {
.name = "vbus",
.of_match = of_match_ptr("regulator-vbus"),
.ops = &rzg2l_usb_vbus_reg_ops,
.type = REGULATOR_VOLTAGE,
.owner = THIS_MODULE,
.enable_reg = 0,
.enable_mask = BIT(0),
.enable_is_inverted = true,
.fixed_uV = 5000000,
.n_voltages = 1,
};
static int rzg2l_usb_vbus_regulator_probe(struct platform_device *pdev)
{
struct regulator_config config = { };
struct device *dev = &pdev->dev;
struct regulator_dev *rdev;
config.regmap = dev_get_regmap(dev->parent, NULL);
if (!config.regmap)
return dev_err_probe(dev, -ENOENT, "Failed to get regmap\n");
config.dev = dev;
config.of_node = of_get_child_by_name(dev->parent->of_node, "regulator-vbus");
if (!config.of_node)
return dev_err_probe(dev, -ENODEV, "regulator node not found\n");
rdev = devm_regulator_register(dev, &rzg2l_usb_vbus_rdesc, &config);
if (IS_ERR(rdev)) {
of_node_put(config.of_node);
return dev_err_probe(dev, PTR_ERR(rdev),
"not able to register vbus regulator\n");
}
of_node_put(config.of_node);
return 0;
}
static struct platform_driver rzg2l_usb_vbus_regulator_driver = {
.probe = rzg2l_usb_vbus_regulator_probe,
.driver = {
.name = "rzg2l-usb-vbus-regulator",
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
},
};
module_platform_driver(rzg2l_usb_vbus_regulator_driver);
MODULE_AUTHOR("Biju Das <biju.das.jz@bp.renesas.com>");
MODULE_DESCRIPTION("Renesas RZ/G2L USB Vbus Regulator Driver");
MODULE_LICENSE("GPL");

View file

@ -202,4 +202,5 @@ static struct platform_driver rt4831_regulator_driver = {
module_platform_driver(rt4831_regulator_driver);
MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>");
MODULE_DESCRIPTION("Richtek RT4831 DSV Regulators driver");
MODULE_LICENSE("GPL v2");

View file

@ -219,7 +219,7 @@ static const struct regulator_ops rtq2208_regulator_buck_ops = {
.set_suspend_mode = rtq2208_set_suspend_mode,
};
static const struct regulator_ops rtq2208_regulator_ldo_ops = {
static const struct regulator_ops rtq2208_regulator_ldo_fix_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
@ -228,6 +228,23 @@ static const struct regulator_ops rtq2208_regulator_ldo_ops = {
.set_suspend_disable = rtq2208_set_suspend_disable,
};
static const struct regulator_ops rtq2208_regulator_ldo_adj_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.list_voltage = regulator_list_voltage_table,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
.get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_active_discharge = regulator_set_active_discharge_regmap,
.set_suspend_enable = rtq2208_set_suspend_enable,
.set_suspend_disable = rtq2208_set_suspend_disable,
};
static const unsigned int rtq2208_ldo_volt_table[] = {
1800000,
3300000,
};
static struct of_regulator_match rtq2208_ldo_match[] = {
{.name = "ldo2", },
{.name = "ldo1", },
@ -331,8 +348,9 @@ static int rtq2208_of_get_ldo_dvs_ability(struct device *dev)
{
struct device_node *np;
struct of_regulator_match *match;
struct rtq2208_regulator_desc *rdesc;
struct regulator_desc *desc;
struct regulator_init_data *init_data;
u32 fixed_uV;
int ret, i;
if (!dev->of_node)
@ -352,13 +370,27 @@ static int rtq2208_of_get_ldo_dvs_ability(struct device *dev)
for (i = 0; i < ARRAY_SIZE(rtq2208_ldo_match); i++) {
match = rtq2208_ldo_match + i;
init_data = match->init_data;
rdesc = (struct rtq2208_regulator_desc *)match->driver_data;
desc = (struct regulator_desc *)match->desc;
if (!init_data || !rdesc)
if (!init_data || !desc)
continue;
if (init_data->constraints.min_uV == init_data->constraints.max_uV)
rdesc->desc.fixed_uV = init_data->constraints.min_uV;
/* specify working fixed voltage if the propery exists */
ret = of_property_read_u32(match->of_node, "richtek,fixed-microvolt", &fixed_uV);
if (!ret) {
if (fixed_uV != init_data->constraints.min_uV ||
fixed_uV != init_data->constraints.max_uV)
return -EINVAL;
desc->n_voltages = 1;
desc->fixed_uV = fixed_uV;
desc->fixed_uV = init_data->constraints.min_uV;
desc->ops = &rtq2208_regulator_ldo_fix_ops;
} else {
desc->n_voltages = ARRAY_SIZE(rtq2208_ldo_volt_table);
desc->volt_table = rtq2208_ldo_volt_table;
desc->ops = &rtq2208_regulator_ldo_adj_ops;
}
}
return 0;

View file

@ -497,8 +497,8 @@ static int slg51000_i2c_probe(struct i2c_client *client)
}
static const struct i2c_device_id slg51000_i2c_id[] = {
{"slg51000", 0},
{},
{ "slg51000" },
{}
};
MODULE_DEVICE_TABLE(i2c, slg51000_i2c_id);

View file

@ -166,6 +166,7 @@ static int stm32_pwr_regulator_probe(struct platform_device *pdev)
static const struct of_device_id __maybe_unused stm32_pwr_of_match[] = {
{ .compatible = "st,stm32mp1,pwr-reg", },
{ .compatible = "st,stm32mp13-pwr-reg", },
{},
};
MODULE_DEVICE_TABLE(of, stm32_pwr_of_match);

View file

@ -130,8 +130,8 @@ static const struct of_device_id sy8106a_i2c_of_match[] = {
MODULE_DEVICE_TABLE(of, sy8106a_i2c_of_match);
static const struct i2c_device_id sy8106a_i2c_id[] = {
{ "sy8106a", 0 },
{ },
{ "sy8106a" },
{ }
};
MODULE_DEVICE_TABLE(i2c, sy8106a_i2c_id);

View file

@ -136,11 +136,11 @@ static int tps6286x_i2c_probe(struct i2c_client *i2c)
}
static const struct i2c_device_id tps6286x_i2c_id[] = {
{ "tps62864", 0 },
{ "tps62866", 0 },
{ "tps62868", 0 },
{ "tps62869", 0 },
{},
{ "tps62864" },
{ "tps62866" },
{ "tps62868" },
{ "tps62869" },
{}
};
MODULE_DEVICE_TABLE(i2c, tps6286x_i2c_id);
@ -156,4 +156,5 @@ static struct i2c_driver tps6286x_regulator_driver = {
module_i2c_driver(tps6286x_regulator_driver);
MODULE_DESCRIPTION("TI TPS6286x Power Regulator driver");
MODULE_LICENSE("GPL v2");

View file

@ -165,11 +165,11 @@ static const struct of_device_id tps6287x_dt_ids[] = {
MODULE_DEVICE_TABLE(of, tps6287x_dt_ids);
static const struct i2c_device_id tps6287x_i2c_id[] = {
{ "tps62870", 0 },
{ "tps62871", 0 },
{ "tps62872", 0 },
{ "tps62873", 0 },
{},
{ "tps62870" },
{ "tps62871" },
{ "tps62872" },
{ "tps62873" },
{}
};
MODULE_DEVICE_TABLE(i2c, tps6287x_i2c_id);

View file

@ -158,10 +158,8 @@ static int regulator_userspace_consumer_probe(struct platform_device *pdev)
ret = devm_regulator_bulk_get_exclusive(&pdev->dev, drvdata->num_supplies,
drvdata->supplies);
if (ret) {
dev_err(&pdev->dev, "Failed to get supplies: %d\n", ret);
return ret;
}
if (ret)
return dev_err_probe(&pdev->dev, ret, "Failed to get supplies\n");
platform_set_drvdata(pdev, drvdata);

View file

@ -128,11 +128,11 @@ struct regulator;
*
* @supply: The name of the supply. Initialised by the user before
* using the bulk regulator APIs.
* @consumer: The regulator consumer for the supply. This will be managed
* by the bulk API.
* @init_load_uA: After getting the regulator, regulator_set_load() will be
* called with this load. Initialised by the user before
* using the bulk regulator APIs.
* @consumer: The regulator consumer for the supply. This will be managed
* by the bulk API.
*
* The regulator APIs provide a series of regulator_bulk_() API calls as
* a convenience to consumers which require multiple supplies. This
@ -140,8 +140,8 @@ struct regulator;
*/
struct regulator_bulk_data {
const char *supply;
int init_load_uA;
struct regulator *consumer;
int init_load_uA;
/* private: Internal use */
int ret;
@ -250,6 +250,7 @@ int regulator_get_hardware_vsel_register(struct regulator *regulator,
unsigned *vsel_mask);
int regulator_list_hardware_vsel(struct regulator *regulator,
unsigned selector);
int regulator_hardware_enable(struct regulator *regulator, bool enable);
/* regulator notifier block */
int regulator_register_notifier(struct regulator *regulator,
@ -571,6 +572,12 @@ static inline int regulator_list_hardware_vsel(struct regulator *regulator,
return -EOPNOTSUPP;
}
static inline int regulator_hardware_enable(struct regulator *regulator,
bool enable)
{
return -EOPNOTSUPP;
}
static inline int regulator_register_notifier(struct regulator *regulator,
struct notifier_block *nb)
{