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:
commit
584aeccc0b
44 changed files with 838 additions and 352 deletions
|
@ -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";
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -96,7 +96,6 @@ properties:
|
|||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- regulators
|
||||
|
||||
additionalProperties: false
|
||||
|
|
|
@ -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";
|
||||
};
|
||||
};
|
||||
};
|
|
@ -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 {
|
||||
|
|
|
@ -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>;
|
||||
};
|
||||
...
|
||||
};
|
|
@ -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>;
|
||||
};
|
||||
};
|
||||
...
|
|
@ -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
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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.
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 },
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 = { \
|
||||
struct dvfsrc_regulator_pdata {
|
||||
struct regulator_desc *descs;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
#define MTK_DVFSRC_VREG(match, _name, _volt_table) \
|
||||
{ \
|
||||
.name = match, \
|
||||
.of_match = of_match_ptr(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 = ®ulator_mt8183_data,
|
||||
}, {
|
||||
.compatible = "mediatek,mt8192-dvfsrc",
|
||||
.data = ®ulator_mt6873_data,
|
||||
}, {
|
||||
.compatible = "mediatek,mt6873-dvfsrc",
|
||||
.data = ®ulator_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");
|
||||
|
|
|
@ -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,6 +962,7 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
|
|||
}
|
||||
}
|
||||
|
||||
if (pca9450->irq) {
|
||||
ret = devm_request_threaded_irq(pca9450->dev, pca9450->irq, NULL,
|
||||
pca9450_irq_handler,
|
||||
(IRQF_TRIGGER_FALLING | IRQF_ONESHOT),
|
||||
|
@ -985,6 +981,7 @@ static int pca9450_i2c_probe(struct i2c_client *i2c)
|
|||
dev_err(&i2c->dev, "Unmask irq error\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear PRESET_EN bit in BUCK123_DVS to use DVS registers */
|
||||
ret = regmap_clear_bits(pca9450->regmap, PCA9450_REG_BUCK123_DVS,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
74
drivers/regulator/renesas-usb-vbus-regulator.c
Normal file
74
drivers/regulator/renesas-usb-vbus-regulator.c
Normal 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");
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue