Commit 24bd2afd authored by Mark Brown's avatar Mark Brown

Merge branch 'regulator-5.7' into regulator-next

parents bae4cb90 86332c34
...@@ -61,6 +61,7 @@ Regulator nodes are identified by their compatible: ...@@ -61,6 +61,7 @@ Regulator nodes are identified by their compatible:
"qcom,rpm-pm8901-regulators" "qcom,rpm-pm8901-regulators"
"qcom,rpm-pm8921-regulators" "qcom,rpm-pm8921-regulators"
"qcom,rpm-pm8018-regulators" "qcom,rpm-pm8018-regulators"
"qcom,rpm-smb208-regulators"
- vdd_l0_l1_lvs-supply: - vdd_l0_l1_lvs-supply:
- vdd_l2_l11_l12-supply: - vdd_l2_l11_l12-supply:
...@@ -171,6 +172,9 @@ pm8018: ...@@ -171,6 +172,9 @@ pm8018:
s1, s2, s3, s4, s5, , l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, s1, s2, s3, s4, s5, , l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11,
l12, l14, lvs1 l12, l14, lvs1
smb208:
s1a, s1b, s2a, s2b
The content of each sub-node is defined by the standard binding for regulators - The content of each sub-node is defined by the standard binding for regulators -
see regulator.txt - with additional custom properties described below: see regulator.txt - with additional custom properties described below:
......
Monolithic Power Systems MP8867/MP8869 voltage regulator
Required properties:
- compatible: Must be one of the following.
"mps,mp8867"
"mps,mp8869"
- reg: I2C slave address.
- enable-gpios: enable gpios.
- mps,fb-voltage-divider: An array of two integers containing the resistor
values R1 and R2 of the feedback voltage divider in kilo ohms.
Any property defined as part of the core regulator binding, defined in
./regulator.txt, can also be used.
Example:
vcpu: regulator@62 {
compatible = "mps,mp8869";
regulator-name = "vcpu";
regulator-min-microvolt = <700000>;
regulator-max-microvolt = <850000>;
regulator-always-on;
regulator-boot-on;
enable-gpios = <&porta 1 GPIO_ACTIVE_LOW>;
mps,fb-voltage-divider = <80 240>;
reg = <0x62>;
};
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/regulator/mps,mp5416.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Monolithic Power System MP5416 PMIC
maintainers:
- Saravanan Sekar <sravanhome@gmail.com>
properties:
$nodename:
pattern: "^pmic@[0-9a-f]{1,2}$"
compatible:
enum:
- mps,mp5416
reg:
maxItems: 1
regulators:
type: object
description: |
list of regulators provided by this controller, must be named
after their hardware counterparts BUCK[1-4] and LDO[1-4]
patternProperties:
"^buck[1-4]$":
allOf:
- $ref: "regulator.yaml#"
type: object
"^ldo[1-4]$":
allOf:
- $ref: "regulator.yaml#"
type: object
additionalProperties: false
additionalProperties: false
required:
- compatible
- reg
- regulators
additionalProperties: false
examples:
- |
i2c {
#address-cells = <1>;
#size-cells = <0>;
pmic@69 {
compatible = "mps,mp5416";
reg = <0x69>;
regulators {
buck1 {
regulator-name = "buck1";
regulator-min-microvolt = <600000>;
regulator-max-microvolt = <2187500>;
regulator-min-microamp = <3800000>;
regulator-max-microamp = <6800000>;
regulator-boot-on;
};
ldo2 {
regulator-name = "ldo2";
regulator-min-microvolt = <800000>;
regulator-max-microvolt = <3975000>;
};
};
};
};
...
...@@ -26,6 +26,7 @@ Regulator nodes are identified by their compatible: ...@@ -26,6 +26,7 @@ Regulator nodes are identified by their compatible:
"qcom,rpm-pm8994-regulators" "qcom,rpm-pm8994-regulators"
"qcom,rpm-pm8998-regulators" "qcom,rpm-pm8998-regulators"
"qcom,rpm-pma8084-regulators" "qcom,rpm-pma8084-regulators"
"qcom,rpm-pmi8994-regulators"
"qcom,rpm-pmi8998-regulators" "qcom,rpm-pmi8998-regulators"
"qcom,rpm-pms405-regulators" "qcom,rpm-pms405-regulators"
...@@ -143,6 +144,15 @@ Regulator nodes are identified by their compatible: ...@@ -143,6 +144,15 @@ Regulator nodes are identified by their compatible:
Definition: reference to regulator supplying the input pin, as Definition: reference to regulator supplying the input pin, as
described in the data sheet described in the data sheet
- vdd_s1-supply:
- vdd_s2-supply:
- vdd_s3-supply:
- vdd_bst_byp-supply:
Usage: optional (pmi8994 only)
Value type: <phandle>
Definition: reference to regulator supplying the input pin, as
described in the data sheet
- vdd_s1-supply: - vdd_s1-supply:
- vdd_s2-supply: - vdd_s2-supply:
- vdd_s3-supply: - vdd_s3-supply:
...@@ -259,6 +269,9 @@ pma8084: ...@@ -259,6 +269,9 @@ pma8084:
l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20,
l21, l22, l23, l24, l25, l26, l27, lvs1, lvs2, lvs3, lvs4, 5vs1 l21, l22, l23, l24, l25, l26, l27, lvs1, lvs2, lvs3, lvs4, 5vs1
pmi8994:
s1, s2, s3, boost-bypass
pmi8998: pmi8998:
bob bob
......
# SPDX-License-Identifier: GPL-2.0
%YAML 1.2
---
$id: http://devicetree.org/schemas/regulator/vqmmc-ipq4019-regulator.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Qualcomm IPQ4019 VQMMC SD LDO regulator
maintainers:
- Robert Marko <robert.marko@sartura.hr>
description: |
Qualcomm IPQ4019 SoC-s feature a built a build SD/EMMC controller,
in order to support both 1.8 and 3V I/O voltage levels an LDO
controller is also embedded.
allOf:
- $ref: "regulator.yaml#"
properties:
compatible:
const: qcom,vqmmc-ipq4019-regulator
reg:
maxItems: 1
required:
- compatible
- reg
examples:
- |
regulator@1948000 {
compatible = "qcom,vqmmc-ipq4019-regulator";
reg = <0x01948000 0x4>;
regulator-name = "vqmmc";
regulator-min-microvolt = <1500000>;
regulator-max-microvolt = <3000000>;
regulator-always-on;
status = "disabled";
};
...
...@@ -11256,7 +11256,8 @@ F: drivers/tty/mxser.* ...@@ -11256,7 +11256,8 @@ F: drivers/tty/mxser.*
MONOLITHIC POWER SYSTEM PMIC DRIVER MONOLITHIC POWER SYSTEM PMIC DRIVER
M: Saravanan Sekar <sravanhome@gmail.com> M: Saravanan Sekar <sravanhome@gmail.com>
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/regulator/mpq7920.yaml F: Documentation/devicetree/bindings/regulator/mps,mp*.yaml
F: drivers/regulator/mp5416.c
F: drivers/regulator/mpq7920.c F: drivers/regulator/mpq7920.c
F: drivers/regulator/mpq7920.h F: drivers/regulator/mpq7920.h
......
...@@ -107,6 +107,7 @@ config REGULATOR_AD5398 ...@@ -107,6 +107,7 @@ config REGULATOR_AD5398
config REGULATOR_ANATOP config REGULATOR_ANATOP
tristate "Freescale i.MX on-chip ANATOP LDO regulators" tristate "Freescale i.MX on-chip ANATOP LDO regulators"
depends on ARCH_MXC || COMPILE_TEST
depends on MFD_SYSCON depends on MFD_SYSCON
help help
Say y here to support Freescale i.MX on-chip ANATOP LDOs Say y here to support Freescale i.MX on-chip ANATOP LDOs
...@@ -613,6 +614,16 @@ config REGULATOR_MCP16502 ...@@ -613,6 +614,16 @@ config REGULATOR_MCP16502
through the regulator interface. In addition it enables through the regulator interface. In addition it enables
suspend-to-ram/standby transition. suspend-to-ram/standby transition.
config REGULATOR_MP5416
tristate "Monolithic MP5416 PMIC"
depends on I2C && OF
select REGMAP_I2C
help
Say y here to support the MP5416 PMIC. This will enable supports
the software controllable 4 buck and 4 LDO regulators.
Say M here if you want to include support for the regulator as a
module.
config REGULATOR_MP8859 config REGULATOR_MP8859
tristate "MPS MP8859 regulator driver" tristate "MPS MP8859 regulator driver"
depends on I2C depends on I2C
...@@ -624,6 +635,13 @@ config REGULATOR_MP8859 ...@@ -624,6 +635,13 @@ config REGULATOR_MP8859
Say M here if you want to include support for the regulator as a Say M here if you want to include support for the regulator as a
module. The module will be named "mp8859". module. The module will be named "mp8859".
config REGULATOR_MP886X
tristate "MPS MP8869 regulator driver"
depends on I2C && (OF || COMPILE_TEST)
select REGMAP_I2C
help
This driver supports the MP8869 voltage regulator.
config REGULATOR_MPQ7920 config REGULATOR_MPQ7920
tristate "Monolithic MPQ7920 PMIC" tristate "Monolithic MPQ7920 PMIC"
depends on I2C && OF depends on I2C && OF
......
...@@ -78,7 +78,9 @@ obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o ...@@ -78,7 +78,9 @@ obj-$(CONFIG_REGULATOR_MC13783) += mc13783-regulator.o
obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o obj-$(CONFIG_REGULATOR_MC13892) += mc13892-regulator.o
obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o obj-$(CONFIG_REGULATOR_MC13XXX_CORE) += mc13xxx-regulator-core.o
obj-$(CONFIG_REGULATOR_MCP16502) += mcp16502.o obj-$(CONFIG_REGULATOR_MCP16502) += mcp16502.o
obj-$(CONFIG_REGULATOR_MP5416) += mp5416.o
obj-$(CONFIG_REGULATOR_MP8859) += mp8859.o obj-$(CONFIG_REGULATOR_MP8859) += mp8859.o
obj-$(CONFIG_REGULATOR_MP886X) += mp886x.o
obj-$(CONFIG_REGULATOR_MPQ7920) += mpq7920.o obj-$(CONFIG_REGULATOR_MPQ7920) += mpq7920.o
obj-$(CONFIG_REGULATOR_MT6311) += mt6311-regulator.o obj-$(CONFIG_REGULATOR_MT6311) += mt6311-regulator.o
obj-$(CONFIG_REGULATOR_MT6323) += mt6323-regulator.o obj-$(CONFIG_REGULATOR_MT6323) += mt6323-regulator.o
......
...@@ -305,9 +305,13 @@ static int anatop_regulator_probe(struct platform_device *pdev) ...@@ -305,9 +305,13 @@ static int anatop_regulator_probe(struct platform_device *pdev)
/* register regulator */ /* register regulator */
rdev = devm_regulator_register(dev, rdesc, &config); rdev = devm_regulator_register(dev, rdesc, &config);
if (IS_ERR(rdev)) { if (IS_ERR(rdev)) {
dev_err(dev, "failed to register %s\n", ret = PTR_ERR(rdev);
rdesc->name); if (ret == -EPROBE_DEFER)
return PTR_ERR(rdev); dev_dbg(dev, "failed to register %s, deferring...\n",
rdesc->name);
else
dev_err(dev, "failed to register %s\n", rdesc->name);
return ret;
} }
platform_set_drvdata(pdev, rdev); platform_set_drvdata(pdev, rdev);
......
...@@ -381,8 +381,7 @@ static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp) ...@@ -381,8 +381,7 @@ static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp)
mask = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK | mask = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK |
AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK; AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK;
enable = (ramp > 0) ? enable = (ramp > 0) ?
AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN : AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN : 0;
!AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN;
break; break;
} }
...@@ -393,8 +392,7 @@ static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp) ...@@ -393,8 +392,7 @@ static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp)
mask = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK | mask = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK |
AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK; AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK;
enable = (ramp > 0) ? enable = (ramp > 0) ?
AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN : AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN : 0;
!AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN;
break; break;
} }
......
...@@ -1849,7 +1849,6 @@ struct regulator *_regulator_get(struct device *dev, const char *id, ...@@ -1849,7 +1849,6 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
{ {
struct regulator_dev *rdev; struct regulator_dev *rdev;
struct regulator *regulator; struct regulator *regulator;
const char *devname = dev ? dev_name(dev) : "deviceless";
struct device_link *link; struct device_link *link;
int ret; int ret;
...@@ -1887,9 +1886,7 @@ struct regulator *_regulator_get(struct device *dev, const char *id, ...@@ -1887,9 +1886,7 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
* enabled, even if it isn't hooked up, and just * enabled, even if it isn't hooked up, and just
* provide a dummy. * provide a dummy.
*/ */
dev_warn(dev, dev_warn(dev, "supply %s not found, using dummy regulator\n", id);
"%s supply %s not found, using dummy regulator\n",
devname, id);
rdev = dummy_regulator_rdev; rdev = dummy_regulator_rdev;
get_device(&rdev->dev); get_device(&rdev->dev);
break; break;
......
...@@ -73,7 +73,7 @@ struct da9062_regulators { ...@@ -73,7 +73,7 @@ struct da9062_regulators {
int irq_ldo_lim; int irq_ldo_lim;
unsigned n_regulators; unsigned n_regulators;
/* Array size to be defined during init. Keep at end. */ /* Array size to be defined during init. Keep at end. */
struct da9062_regulator regulator[0]; struct da9062_regulator regulator[];
}; };
/* Regulator operations */ /* Regulator operations */
......
...@@ -66,7 +66,7 @@ struct da9063_regulator_data { ...@@ -66,7 +66,7 @@ struct da9063_regulator_data {
}; };
struct da9063_regulators_pdata { struct da9063_regulators_pdata {
unsigned n_regulators; unsigned int n_regulators;
struct da9063_regulator_data *regulator_data; struct da9063_regulator_data *regulator_data;
}; };
...@@ -133,7 +133,7 @@ struct da9063_regulator_info { ...@@ -133,7 +133,7 @@ struct da9063_regulator_info {
/* Defines asignment of regulators info table to chip model */ /* Defines asignment of regulators info table to chip model */
struct da9063_dev_model { struct da9063_dev_model {
const struct da9063_regulator_info *regulator_info; const struct da9063_regulator_info *regulator_info;
unsigned n_regulators; unsigned int n_regulators;
enum da9063_type type; enum da9063_type type;
}; };
...@@ -152,9 +152,9 @@ struct da9063_regulator { ...@@ -152,9 +152,9 @@ struct da9063_regulator {
/* Encapsulates all information for the regulators driver */ /* Encapsulates all information for the regulators driver */
struct da9063_regulators { struct da9063_regulators {
unsigned n_regulators; unsigned int n_regulators;
/* Array size to be defined during init. Keep at end. */ /* Array size to be defined during init. Keep at end. */
struct da9063_regulator regulator[0]; struct da9063_regulator regulator[];
}; };
/* BUCK modes for DA9063 */ /* BUCK modes for DA9063 */
...@@ -167,38 +167,46 @@ enum { ...@@ -167,38 +167,46 @@ enum {
/* Regulator operations */ /* Regulator operations */
/* Current limits array (in uA) for BCORE1, BCORE2, BPRO. /*
Entry indexes corresponds to register values. */ * Current limits array (in uA) for BCORE1, BCORE2, BPRO.
* Entry indexes corresponds to register values.
*/
static const unsigned int da9063_buck_a_limits[] = { static const unsigned int da9063_buck_a_limits[] = {
500000, 600000, 700000, 800000, 900000, 1000000, 1100000, 1200000, 500000, 600000, 700000, 800000, 900000, 1000000, 1100000, 1200000,
1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000
}; };
/* Current limits array (in uA) for BMEM, BIO, BPERI. /*
Entry indexes corresponds to register values. */ * Current limits array (in uA) for BMEM, BIO, BPERI.
* Entry indexes corresponds to register values.
*/
static const unsigned int da9063_buck_b_limits[] = { static const unsigned int da9063_buck_b_limits[] = {
1500000, 1600000, 1700000, 1800000, 1900000, 2000000, 2100000, 2200000, 1500000, 1600000, 1700000, 1800000, 1900000, 2000000, 2100000, 2200000,
2300000, 2400000, 2500000, 2600000, 2700000, 2800000, 2900000, 3000000 2300000, 2400000, 2500000, 2600000, 2700000, 2800000, 2900000, 3000000
}; };
/* Current limits array (in uA) for merged BCORE1 and BCORE2. /*
Entry indexes corresponds to register values. */ * Current limits array (in uA) for merged BCORE1 and BCORE2.
* Entry indexes corresponds to register values.
*/
static const unsigned int da9063_bcores_merged_limits[] = { static const unsigned int da9063_bcores_merged_limits[] = {
1000000, 1200000, 1400000, 1600000, 1800000, 2000000, 2200000, 2400000, 1000000, 1200000, 1400000, 1600000, 1800000, 2000000, 2200000, 2400000,
2600000, 2800000, 3000000, 3200000, 3400000, 3600000, 3800000, 4000000 2600000, 2800000, 3000000, 3200000, 3400000, 3600000, 3800000, 4000000
}; };
/* Current limits array (in uA) for merged BMEM and BIO. /*
Entry indexes corresponds to register values. */ * Current limits array (in uA) for merged BMEM and BIO.
* Entry indexes corresponds to register values.
*/
static const unsigned int da9063_bmem_bio_merged_limits[] = { static const unsigned int da9063_bmem_bio_merged_limits[] = {
3000000, 3200000, 3400000, 3600000, 3800000, 4000000, 4200000, 4400000, 3000000, 3200000, 3400000, 3600000, 3800000, 4000000, 4200000, 4400000,
4600000, 4800000, 5000000, 5200000, 5400000, 5600000, 5800000, 6000000 4600000, 4800000, 5000000, 5200000, 5400000, 5600000, 5800000, 6000000
}; };
static int da9063_buck_set_mode(struct regulator_dev *rdev, unsigned mode) static int da9063_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
{ {
struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct da9063_regulator *regl = rdev_get_drvdata(rdev);
unsigned val; unsigned int val;
switch (mode) { switch (mode) {
case REGULATOR_MODE_FAST: case REGULATOR_MODE_FAST:
...@@ -223,7 +231,7 @@ static int da9063_buck_set_mode(struct regulator_dev *rdev, unsigned mode) ...@@ -223,7 +231,7 @@ static int da9063_buck_set_mode(struct regulator_dev *rdev, unsigned mode)
* There are 3 modes to map to: FAST, NORMAL, and STANDBY. * There are 3 modes to map to: FAST, NORMAL, and STANDBY.
*/ */
static unsigned da9063_buck_get_mode(struct regulator_dev *rdev) static unsigned int da9063_buck_get_mode(struct regulator_dev *rdev)
{ {
struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct da9063_regulator *regl = rdev_get_drvdata(rdev);
unsigned int val; unsigned int val;
...@@ -261,10 +269,10 @@ static unsigned da9063_buck_get_mode(struct regulator_dev *rdev) ...@@ -261,10 +269,10 @@ static unsigned da9063_buck_get_mode(struct regulator_dev *rdev)
* There are 2 modes to map to: NORMAL and STANDBY (sleep) for each state. * There are 2 modes to map to: NORMAL and STANDBY (sleep) for each state.
*/ */
static int da9063_ldo_set_mode(struct regulator_dev *rdev, unsigned mode) static int da9063_ldo_set_mode(struct regulator_dev *rdev, unsigned int mode)
{ {
struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct da9063_regulator *regl = rdev_get_drvdata(rdev);
unsigned val; unsigned int val;
switch (mode) { switch (mode) {
case REGULATOR_MODE_NORMAL: case REGULATOR_MODE_NORMAL:
...@@ -280,7 +288,7 @@ static int da9063_ldo_set_mode(struct regulator_dev *rdev, unsigned mode) ...@@ -280,7 +288,7 @@ static int da9063_ldo_set_mode(struct regulator_dev *rdev, unsigned mode)
return regmap_field_write(regl->sleep, val); return regmap_field_write(regl->sleep, val);
} }
static unsigned da9063_ldo_get_mode(struct regulator_dev *rdev) static unsigned int da9063_ldo_get_mode(struct regulator_dev *rdev)
{ {
struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct da9063_regulator *regl = rdev_get_drvdata(rdev);
int ret, val; int ret, val;
...@@ -361,7 +369,8 @@ static int da9063_suspend_disable(struct regulator_dev *rdev) ...@@ -361,7 +369,8 @@ static int da9063_suspend_disable(struct regulator_dev *rdev)
return regmap_field_write(regl->suspend, 0); return regmap_field_write(regl->suspend, 0);
} }
static int da9063_buck_set_suspend_mode(struct regulator_dev *rdev, unsigned mode) static int da9063_buck_set_suspend_mode(struct regulator_dev *rdev,
unsigned int mode)
{ {
struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct da9063_regulator *regl = rdev_get_drvdata(rdev);
int val; int val;
...@@ -383,10 +392,11 @@ static int da9063_buck_set_suspend_mode(struct regulator_dev *rdev, unsigned mod ...@@ -383,10 +392,11 @@ static int da9063_buck_set_suspend_mode(struct regulator_dev *rdev, unsigned mod
return regmap_field_write(regl->mode, val); return regmap_field_write(regl->mode, val);
} }
static int da9063_ldo_set_suspend_mode(struct regulator_dev *rdev, unsigned mode) static int da9063_ldo_set_suspend_mode(struct regulator_dev *rdev,
unsigned int mode)
{ {
struct da9063_regulator *regl = rdev_get_drvdata(rdev); struct da9063_regulator *regl = rdev_get_drvdata(rdev);
unsigned val; unsigned int val;
switch (mode) { switch (mode) {
case REGULATOR_MODE_NORMAL: case REGULATOR_MODE_NORMAL:
...@@ -553,7 +563,7 @@ static irqreturn_t da9063_ldo_lim_event(int irq, void *data) ...@@ -553,7 +563,7 @@ static irqreturn_t da9063_ldo_lim_event(int irq, void *data)
struct da9063_regulators *regulators = data; struct da9063_regulators *regulators = data;
struct da9063 *hw = regulators->regulator[0].hw; struct da9063 *hw = regulators->regulator[0].hw;
struct da9063_regulator *regl; struct da9063_regulator *regl;
int bits, i , ret; int bits, i, ret;
ret = regmap_read(hw->regmap, DA9063_REG_STATUS_D, &bits); ret = regmap_read(hw->regmap, DA9063_REG_STATUS_D, &bits);
if (ret < 0) if (ret < 0)
...@@ -565,10 +575,10 @@ static irqreturn_t da9063_ldo_lim_event(int irq, void *data) ...@@ -565,10 +575,10 @@ static irqreturn_t da9063_ldo_lim_event(int irq, void *data)
continue; continue;
if (BIT(regl->info->oc_event.lsb) & bits) { if (BIT(regl->info->oc_event.lsb) & bits) {
regulator_lock(regl->rdev); regulator_lock(regl->rdev);
regulator_notifier_call_chain(regl->rdev, regulator_notifier_call_chain(regl->rdev,
REGULATOR_EVENT_OVER_CURRENT, NULL); REGULATOR_EVENT_OVER_CURRENT, NULL);
regulator_unlock(regl->rdev); regulator_unlock(regl->rdev);
} }
} }
...@@ -793,7 +803,7 @@ static int da9063_regulator_probe(struct platform_device *pdev) ...@@ -793,7 +803,7 @@ static int da9063_regulator_probe(struct platform_device *pdev)
if (regl->info->suspend_sleep.reg) { if (regl->info->suspend_sleep.reg) {
regl->suspend_sleep = devm_regmap_field_alloc(&pdev->dev, regl->suspend_sleep = devm_regmap_field_alloc(&pdev->dev,
da9063->regmap, regl->info->suspend_sleep); da9063->regmap, regl->info->suspend_sleep);
if (IS_ERR(regl->suspend_sleep)) if (IS_ERR(regl->suspend_sleep))
return PTR_ERR(regl->suspend_sleep); return PTR_ERR(regl->suspend_sleep);
} }
...@@ -827,12 +837,10 @@ static int da9063_regulator_probe(struct platform_device *pdev) ...@@ -827,12 +837,10 @@ static int da9063_regulator_probe(struct platform_device *pdev)
NULL, da9063_ldo_lim_event, NULL, da9063_ldo_lim_event,
IRQF_TRIGGER_LOW | IRQF_ONESHOT, IRQF_TRIGGER_LOW | IRQF_ONESHOT,
"LDO_LIM", regulators); "LDO_LIM", regulators);
if (ret) { if (ret)
dev_err(&pdev->dev, "Failed to request LDO_LIM IRQ.\n"); dev_err(&pdev->dev, "Failed to request LDO_LIM IRQ.\n");
return ret;
}
return 0; return ret;
} }
static struct platform_driver da9063_regulator_driver = { static struct platform_driver da9063_regulator_driver = {
......
// SPDX-License-Identifier: GPL-2.0+
//
// mp5416.c - regulator driver for mps mp5416
//
// Copyright 2020 Monolithic Power Systems, Inc
//
// Author: Saravanan Sekar <sravanhome@gmail.com>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>
#include <linux/i2c.h>
#define MP5416_REG_CTL0 0x00
#define MP5416_REG_CTL1 0x01
#define MP5416_REG_CTL2 0x02
#define MP5416_REG_ILIM 0x03
#define MP5416_REG_BUCK1 0x04
#define MP5416_REG_BUCK2 0x05
#define MP5416_REG_BUCK3 0x06
#define MP5416_REG_BUCK4 0x07
#define MP5416_REG_LDO1 0x08
#define MP5416_REG_LDO2 0x09
#define MP5416_REG_LDO3 0x0a
#define MP5416_REG_LDO4 0x0b
#define MP5416_REGULATOR_EN BIT(7)
#define MP5416_MASK_VSET 0x7f
#define MP5416_MASK_BUCK1_ILIM 0xc0
#define MP5416_MASK_BUCK2_ILIM 0x0c
#define MP5416_MASK_BUCK3_ILIM 0x30
#define MP5416_MASK_BUCK4_ILIM 0x03
#define MP5416_MASK_DVS_SLEWRATE 0xc0
/* values in uV */
#define MP5416_VOLT1_MIN 600000
#define MP5416_VOLT1_MAX 2187500
#define MP5416_VOLT1_STEP 12500
#define MP5416_VOLT2_MIN 800000
#define MP5416_VOLT2_MAX 3975000
#define MP5416_VOLT2_STEP 25000
#define MP5416_VOLT1_RANGE \
((MP5416_VOLT1_MAX - MP5416_VOLT1_MIN)/MP5416_VOLT1_STEP + 1)
#define MP5416_VOLT2_RANGE \
((MP5416_VOLT2_MAX - MP5416_VOLT2_MIN)/MP5416_VOLT2_STEP + 1)
#define MP5416BUCK(_name, _id, _ilim, _dreg, _dval, _vsel) \
[MP5416_BUCK ## _id] = { \
.id = MP5416_BUCK ## _id, \
.name = _name, \
.of_match = _name, \
.regulators_node = "regulators", \
.ops = &mp5416_buck_ops, \
.min_uV = MP5416_VOLT ##_vsel## _MIN, \
.uV_step = MP5416_VOLT ##_vsel## _STEP, \
.n_voltages = MP5416_VOLT ##_vsel## _RANGE, \
.curr_table = _ilim, \
.n_current_limits = ARRAY_SIZE(_ilim), \
.csel_reg = MP5416_REG_ILIM, \
.csel_mask = MP5416_MASK_BUCK ## _id ##_ILIM, \
.vsel_reg = MP5416_REG_BUCK ## _id, \
.vsel_mask = MP5416_MASK_VSET, \
.enable_reg = MP5416_REG_BUCK ## _id, \
.enable_mask = MP5416_REGULATOR_EN, \
.active_discharge_on = _dval, \
.active_discharge_reg = _dreg, \
.active_discharge_mask = _dval, \
.owner = THIS_MODULE, \
}
#define MP5416LDO(_name, _id, _dval) \
[MP5416_LDO ## _id] = { \
.id = MP5416_LDO ## _id, \
.name = _name, \
.of_match = _name, \
.regulators_node = "regulators", \
.ops = &mp5416_ldo_ops, \
.min_uV = MP5416_VOLT2_MIN, \
.uV_step = MP5416_VOLT2_STEP, \
.n_voltages = MP5416_VOLT2_RANGE, \
.vsel_reg = MP5416_REG_LDO ##_id, \
.vsel_mask = MP5416_MASK_VSET, \
.enable_reg = MP5416_REG_LDO ##_id, \
.enable_mask = MP5416_REGULATOR_EN, \
.active_discharge_on = _dval, \
.active_discharge_reg = MP5416_REG_CTL2, \
.active_discharge_mask = _dval, \
.owner = THIS_MODULE, \
}
enum mp5416_regulators {
MP5416_BUCK1,
MP5416_BUCK2,
MP5416_BUCK3,
MP5416_BUCK4,
MP5416_LDO1,
MP5416_LDO2,
MP5416_LDO3,
MP5416_LDO4,
MP5416_MAX_REGULATORS,
};
static const struct regmap_config mp5416_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
.max_register = 0x0d,
};
/* Current limits array (in uA)
* ILIM1 & ILIM3
*/
static const unsigned int mp5416_I_limits1[] = {
3800000, 4600000, 5600000, 6800000
};
/* ILIM2 & ILIM4 */
static const unsigned int mp5416_I_limits2[] = {
2200000, 3200000, 4200000, 5200000
};
static int mp5416_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay);
static const struct regulator_ops mp5416_ldo_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear,
.get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
.set_active_discharge = regulator_set_active_discharge_regmap,
};
static const struct regulator_ops mp5416_buck_ops = {
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear,
.get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
.set_active_discharge = regulator_set_active_discharge_regmap,
.get_current_limit = regulator_get_current_limit_regmap,
.set_current_limit = regulator_set_current_limit_regmap,
.set_ramp_delay = mp5416_set_ramp_delay,
};
static struct regulator_desc mp5416_regulators_desc[MP5416_MAX_REGULATORS] = {
MP5416BUCK("buck1", 1, mp5416_I_limits1, MP5416_REG_CTL1, BIT(0), 1),
MP5416BUCK("buck2", 2, mp5416_I_limits2, MP5416_REG_CTL1, BIT(1), 2),
MP5416BUCK("buck3", 3, mp5416_I_limits1, MP5416_REG_CTL1, BIT(2), 1),
MP5416BUCK("buck4", 4, mp5416_I_limits2, MP5416_REG_CTL2, BIT(5), 2),
MP5416LDO("ldo1", 1, BIT(4)),
MP5416LDO("ldo2", 2, BIT(3)),
MP5416LDO("ldo3", 3, BIT(2)),
MP5416LDO("ldo4", 4, BIT(1)),
};
/*
* DVS ramp rate BUCK1 to BUCK4
* 00: 32mV/us
* 01: 16mV/us
* 10: 8mV/us
* 11: 4mV/us
*/
static int mp5416_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
{
unsigned int ramp_val;
if (ramp_delay > 32000 || ramp_delay < 0)
return -EINVAL;
if (ramp_delay <= 4000)
ramp_val = 3;
else if (ramp_delay <= 8000)
ramp_val = 2;
else if (ramp_delay <= 16000)
ramp_val = 1;
else
ramp_val = 0;
return regmap_update_bits(rdev->regmap, MP5416_REG_CTL2,
MP5416_MASK_DVS_SLEWRATE, ramp_val << 6);
}
static int mp5416_i2c_probe(struct i2c_client *client)
{
struct device *dev = &client->dev;
struct regulator_config config = { NULL, };
struct regulator_dev *rdev;
struct regmap *regmap;
int i;
regmap = devm_regmap_init_i2c(client, &mp5416_regmap_config);
if (IS_ERR(regmap)) {
dev_err(dev, "Failed to allocate regmap!\n");
return PTR_ERR(regmap);
}
config.dev = dev;
config.regmap = regmap;
for (i = 0; i < MP5416_MAX_REGULATORS; i++) {
rdev = devm_regulator_register(dev,
&mp5416_regulators_desc[i],
&config);
if (IS_ERR(rdev)) {
dev_err(dev, "Failed to register regulator!\n");
return PTR_ERR(rdev);
}
}
return 0;
}
static const struct of_device_id mp5416_of_match[] = {
{ .compatible = "mps,mp5416" },
{},
};
MODULE_DEVICE_TABLE(of, mp5416_of_match);
static const struct i2c_device_id mp5416_id[] = {
{ "mp5416", },
{ },
};
MODULE_DEVICE_TABLE(i2c, mp5416_id);
static struct i2c_driver mp5416_regulator_driver = {
.driver = {
.name = "mp5416",
.of_match_table = of_match_ptr(mp5416_of_match),
},
.probe_new = mp5416_i2c_probe,
.id_table = mp5416_id,
};
module_i2c_driver(mp5416_regulator_driver);
MODULE_AUTHOR("Saravanan Sekar <sravanhome@gmail.com>");
MODULE_DESCRIPTION("MP5416 PMIC regulator driver");
MODULE_LICENSE("GPL");
...@@ -95,6 +95,7 @@ static const struct regulator_desc mp8859_regulators[] = { ...@@ -95,6 +95,7 @@ static const struct regulator_desc mp8859_regulators[] = {
.id = 0, .id = 0,
.type = REGULATOR_VOLTAGE, .type = REGULATOR_VOLTAGE,
.name = "mp8859_dcdc", .name = "mp8859_dcdc",
.supply_name = "vin",
.of_match = of_match_ptr("mp8859_dcdc"), .of_match = of_match_ptr("mp8859_dcdc"),
.n_voltages = VOL_MAX_IDX + 1, .n_voltages = VOL_MAX_IDX + 1,
.linear_ranges = mp8859_dcdc_ranges, .linear_ranges = mp8859_dcdc_ranges,
......
// SPDX-License-Identifier: GPL-2.0
//
// MP8867/MP8869 regulator driver
//
// Copyright (C) 2020 Synaptics Incorporated
//
// Author: Jisheng Zhang <jszhang@kernel.org>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>
#include <linux/regulator/of_regulator.h>
#define MP886X_VSEL 0x00
#define MP886X_V_BOOT (1 << 7)
#define MP886X_SYSCNTLREG1 0x01
#define MP886X_MODE (1 << 0)
#define MP886X_GO (1 << 6)
#define MP886X_EN (1 << 7)
struct mp886x_device_info {
struct device *dev;
struct regulator_desc desc;
struct regulator_init_data *regulator;
struct gpio_desc *en_gpio;
u32 r[2];
unsigned int sel;
};
static int mp886x_set_mode(struct regulator_dev *rdev, unsigned int mode)
{
switch (mode) {
case REGULATOR_MODE_FAST:
regmap_update_bits(rdev->regmap, MP886X_SYSCNTLREG1,
MP886X_MODE, MP886X_MODE);
break;
case REGULATOR_MODE_NORMAL:
regmap_update_bits(rdev->regmap, MP886X_SYSCNTLREG1,
MP886X_MODE, 0);
break;
default:
return -EINVAL;
}
return 0;
}
static unsigned int mp886x_get_mode(struct regulator_dev *rdev)
{
u32 val;
int ret;
ret = regmap_read(rdev->regmap, MP886X_SYSCNTLREG1, &val);
if (ret < 0)
return ret;
if (val & MP886X_MODE)
return REGULATOR_MODE_FAST;
else
return REGULATOR_MODE_NORMAL;
}
static int mp8869_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
{
int ret;
ret = regmap_update_bits(rdev->regmap, MP886X_SYSCNTLREG1,
MP886X_GO, MP886X_GO);
if (ret < 0)
return ret;
sel <<= ffs(rdev->desc->vsel_mask) - 1;
return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
MP886X_V_BOOT | rdev->desc->vsel_mask, sel);
}
static inline unsigned int mp8869_scale(unsigned int uv, u32 r1, u32 r2)
{
u32 tmp = uv * r1 / r2;
return uv + tmp;
}
static int mp8869_get_voltage_sel(struct regulator_dev *rdev)
{
struct mp886x_device_info *di = rdev_get_drvdata(rdev);
int ret, uv;
unsigned int val;
bool fbloop;
ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
if (ret)
return ret;
fbloop = val & MP886X_V_BOOT;
if (fbloop) {
uv = rdev->desc->min_uV;
uv = mp8869_scale(uv, di->r[0], di->r[1]);
return regulator_map_voltage_linear(rdev, uv, uv);
}
val &= rdev->desc->vsel_mask;
val >>= ffs(rdev->desc->vsel_mask) - 1;
return val;
}
static const struct regulator_ops mp8869_regulator_ops = {
.set_voltage_sel = mp8869_set_voltage_sel,
.get_voltage_sel = mp8869_get_voltage_sel,
.set_voltage_time_sel = regulator_set_voltage_time_sel,
.map_voltage = regulator_map_voltage_linear,
.list_voltage = regulator_list_voltage_linear,
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.set_mode = mp886x_set_mode,
.get_mode = mp886x_get_mode,
};
static int mp8867_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
{
struct mp886x_device_info *di = rdev_get_drvdata(rdev);
int ret, delta;
ret = mp8869_set_voltage_sel(rdev, sel);
if (ret < 0)
return ret;
delta = di->sel - sel;
if (abs(delta) <= 5)
ret = regmap_update_bits(rdev->regmap, MP886X_SYSCNTLREG1,
MP886X_GO, 0);
di->sel = sel;
return ret;
}
static int mp8867_get_voltage_sel(struct regulator_dev *rdev)
{
struct mp886x_device_info *di = rdev_get_drvdata(rdev);
int ret, uv;
unsigned int val;
bool fbloop;
ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
if (ret)
return ret;
fbloop = val & MP886X_V_BOOT;
val &= rdev->desc->vsel_mask;
val >>= ffs(rdev->desc->vsel_mask) - 1;
if (fbloop) {
uv = regulator_list_voltage_linear(rdev, val);
uv = mp8869_scale(uv, di->r[0], di->r[1]);
return regulator_map_voltage_linear(rdev, uv, uv);
}
return val;
}
static const struct regulator_ops mp8867_regulator_ops = {
.set_voltage_sel = mp8867_set_voltage_sel,
.get_voltage_sel = mp8867_get_voltage_sel,
.set_voltage_time_sel = regulator_set_voltage_time_sel,
.map_voltage = regulator_map_voltage_linear,
.list_voltage = regulator_list_voltage_linear,
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
.is_enabled = regulator_is_enabled_regmap,
.set_mode = mp886x_set_mode,
.get_mode = mp886x_get_mode,
};
static int mp886x_regulator_register(struct mp886x_device_info *di,
struct regulator_config *config)
{
struct regulator_desc *rdesc = &di->desc;
struct regulator_dev *rdev;
rdesc->name = "mp886x-reg";
rdesc->supply_name = "vin";
rdesc->ops = of_device_get_match_data(di->dev);
rdesc->type = REGULATOR_VOLTAGE;
rdesc->n_voltages = 128;
rdesc->enable_reg = MP886X_SYSCNTLREG1;
rdesc->enable_mask = MP886X_EN;
rdesc->min_uV = 600000;
rdesc->uV_step = 10000;
rdesc->vsel_reg = MP886X_VSEL;
rdesc->vsel_mask = 0x3f;
rdesc->owner = THIS_MODULE;
rdev = devm_regulator_register(di->dev, &di->desc, config);
if (IS_ERR(rdev))
return PTR_ERR(rdev);
di->sel = rdesc->ops->get_voltage_sel(rdev);
return 0;
}
static const struct regmap_config mp886x_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
};
static int mp886x_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct device *dev = &client->dev;
struct device_node *np = dev->of_node;
struct mp886x_device_info *di;
struct regulator_config config = { };
struct regmap *regmap;
int ret;
di = devm_kzalloc(dev, sizeof(struct mp886x_device_info), GFP_KERNEL);
if (!di)
return -ENOMEM;
di->regulator = of_get_regulator_init_data(dev, np, &di->desc);
if (!di->regulator) {
dev_err(dev, "Platform data not found!\n");
return -EINVAL;
}
ret = of_property_read_u32_array(np, "mps,fb-voltage-divider",
di->r, 2);
if (ret)
return ret;
di->en_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
if (IS_ERR(di->en_gpio))
return PTR_ERR(di->en_gpio);
di->dev = dev;
regmap = devm_regmap_init_i2c(client, &mp886x_regmap_config);
if (IS_ERR(regmap)) {
dev_err(dev, "Failed to allocate regmap!\n");
return PTR_ERR(regmap);
}
i2c_set_clientdata(client, di);
config.dev = di->dev;
config.init_data = di->regulator;
config.regmap = regmap;
config.driver_data = di;
config.of_node = np;
ret = mp886x_regulator_register(di, &config);
if (ret < 0)
dev_err(dev, "Failed to register regulator!\n");
return ret;
}
static const struct of_device_id mp886x_dt_ids[] = {
{
.compatible = "mps,mp8867",
.data = &mp8867_regulator_ops
},
{
.compatible = "mps,mp8869",
.data = &mp8869_regulator_ops
},
{ }
};
MODULE_DEVICE_TABLE(of, mp886x_dt_ids);
static const struct i2c_device_id mp886x_id[] = {
{ "mp886x", },
{ },
};
MODULE_DEVICE_TABLE(i2c, mp886x_id);
static struct i2c_driver mp886x_regulator_driver = {
.driver = {
.name = "mp886x-regulator",
.of_match_table = of_match_ptr(mp886x_dt_ids),
},
.probe = mp886x_i2c_probe,
.id_table = mp886x_id,
};
module_i2c_driver(mp886x_regulator_driver);
MODULE_AUTHOR("Jisheng Zhang <jszhang@kernel.org>");
MODULE_DESCRIPTION("MP886x regulator driver");
MODULE_LICENSE("GPL v2");
...@@ -354,7 +354,11 @@ static int pwm_regulator_probe(struct platform_device *pdev) ...@@ -354,7 +354,11 @@ static int pwm_regulator_probe(struct platform_device *pdev)
drvdata->pwm = devm_pwm_get(&pdev->dev, NULL); drvdata->pwm = devm_pwm_get(&pdev->dev, NULL);
if (IS_ERR(drvdata->pwm)) { if (IS_ERR(drvdata->pwm)) {
ret = PTR_ERR(drvdata->pwm); ret = PTR_ERR(drvdata->pwm);
dev_err(&pdev->dev, "Failed to get PWM: %d\n", ret); if (ret == -EPROBE_DEFER)
dev_dbg(&pdev->dev,
"Failed to get PWM, deferring probe\n");
else
dev_err(&pdev->dev, "Failed to get PWM: %d\n", ret);
return ret; return ret;
} }
......
...@@ -925,12 +925,21 @@ static const struct rpm_regulator_data rpm_pm8921_regulators[] = { ...@@ -925,12 +925,21 @@ static const struct rpm_regulator_data rpm_pm8921_regulators[] = {
{ } { }
}; };
static const struct rpm_regulator_data rpm_smb208_regulators[] = {
{ "s1a", QCOM_RPM_SMB208_S1a, &smb208_smps, "vin_s1a" },
{ "s1b", QCOM_RPM_SMB208_S1b, &smb208_smps, "vin_s1b" },
{ "s2a", QCOM_RPM_SMB208_S2a, &smb208_smps, "vin_s2a" },
{ "s2b", QCOM_RPM_SMB208_S2b, &smb208_smps, "vin_s2b" },
{ }
};
static const struct of_device_id rpm_of_match[] = { static const struct of_device_id rpm_of_match[] = {
{ .compatible = "qcom,rpm-pm8018-regulators", { .compatible = "qcom,rpm-pm8018-regulators",
.data = &rpm_pm8018_regulators }, .data = &rpm_pm8018_regulators },
{ .compatible = "qcom,rpm-pm8058-regulators", .data = &rpm_pm8058_regulators }, { .compatible = "qcom,rpm-pm8058-regulators", .data = &rpm_pm8058_regulators },
{ .compatible = "qcom,rpm-pm8901-regulators", .data = &rpm_pm8901_regulators }, { .compatible = "qcom,rpm-pm8901-regulators", .data = &rpm_pm8901_regulators },
{ .compatible = "qcom,rpm-pm8921-regulators", .data = &rpm_pm8921_regulators }, { .compatible = "qcom,rpm-pm8921-regulators", .data = &rpm_pm8921_regulators },
{ .compatible = "qcom,rpm-smb208-regulators", .data = &rpm_smb208_regulators },
{ } { }
}; };
MODULE_DEVICE_TABLE(of, rpm_of_match); MODULE_DEVICE_TABLE(of, rpm_of_match);
......
...@@ -445,6 +445,44 @@ static const struct regulator_desc pm8994_lnldo = { ...@@ -445,6 +445,44 @@ static const struct regulator_desc pm8994_lnldo = {
.ops = &rpm_smps_ldo_ops_fixed, .ops = &rpm_smps_ldo_ops_fixed,
}; };
static const struct regulator_desc pmi8994_ftsmps = {
.linear_ranges = (struct regulator_linear_range[]) {
REGULATOR_LINEAR_RANGE(350000, 0, 199, 5000),
REGULATOR_LINEAR_RANGE(700000, 200, 349, 10000),
},
.n_linear_ranges = 2,
.n_voltages = 350,
.ops = &rpm_smps_ldo_ops,
};
static const struct regulator_desc pmi8994_hfsmps = {
.linear_ranges = (struct regulator_linear_range[]) {
REGULATOR_LINEAR_RANGE(350000, 0, 80, 12500),
REGULATOR_LINEAR_RANGE(700000, 81, 141, 25000),
},
.n_linear_ranges = 2,
.n_voltages = 142,
.ops = &rpm_smps_ldo_ops,
};
static const struct regulator_desc pmi8994_bby = {
.linear_ranges = (struct regulator_linear_range[]) {
REGULATOR_LINEAR_RANGE(3000000, 0, 44, 50000),
},
.n_linear_ranges = 1,
.n_voltages = 45,
.ops = &rpm_bob_ops,
};
static const struct regulator_desc pmi8994_boost = {
.linear_ranges = (struct regulator_linear_range[]) {
REGULATOR_LINEAR_RANGE(4000000, 0, 30, 50000),
},
.n_linear_ranges = 1,
.n_voltages = 31,
.ops = &rpm_smps_ldo_ops,
};
static const struct regulator_desc pm8998_ftsmps = { static const struct regulator_desc pm8998_ftsmps = {
.linear_ranges = (struct regulator_linear_range[]) { .linear_ranges = (struct regulator_linear_range[]) {
REGULATOR_LINEAR_RANGE(320000, 0, 258, 4000), REGULATOR_LINEAR_RANGE(320000, 0, 258, 4000),
...@@ -780,6 +818,14 @@ static const struct rpm_regulator_data rpm_pm8994_regulators[] = { ...@@ -780,6 +818,14 @@ static const struct rpm_regulator_data rpm_pm8994_regulators[] = {
{} {}
}; };
static const struct rpm_regulator_data rpm_pmi8994_regulators[] = {
{ "s1", QCOM_SMD_RPM_SMPB, 1, &pmi8994_ftsmps, "vdd_s1" },
{ "s2", QCOM_SMD_RPM_SMPB, 2, &pmi8994_hfsmps, "vdd_s2" },
{ "s2", QCOM_SMD_RPM_SMPB, 3, &pmi8994_hfsmps, "vdd_s3" },
{ "boost-bypass", QCOM_SMD_RPM_BBYB, 1, &pmi8994_bby, "vdd_bst_byp" },
{}
};
static const struct rpm_regulator_data rpm_pm8998_regulators[] = { static const struct rpm_regulator_data rpm_pm8998_regulators[] = {
{ "s1", QCOM_SMD_RPM_SMPA, 1, &pm8998_ftsmps, "vdd_s1" }, { "s1", QCOM_SMD_RPM_SMPA, 1, &pm8998_ftsmps, "vdd_s1" },
{ "s2", QCOM_SMD_RPM_SMPA, 2, &pm8998_ftsmps, "vdd_s2" }, { "s2", QCOM_SMD_RPM_SMPA, 2, &pm8998_ftsmps, "vdd_s2" },
...@@ -862,6 +908,7 @@ static const struct of_device_id rpm_of_match[] = { ...@@ -862,6 +908,7 @@ static const struct of_device_id rpm_of_match[] = {
{ .compatible = "qcom,rpm-pm8994-regulators", .data = &rpm_pm8994_regulators }, { .compatible = "qcom,rpm-pm8994-regulators", .data = &rpm_pm8994_regulators },
{ .compatible = "qcom,rpm-pm8998-regulators", .data = &rpm_pm8998_regulators }, { .compatible = "qcom,rpm-pm8998-regulators", .data = &rpm_pm8998_regulators },
{ .compatible = "qcom,rpm-pma8084-regulators", .data = &rpm_pma8084_regulators }, { .compatible = "qcom,rpm-pma8084-regulators", .data = &rpm_pma8084_regulators },
{ .compatible = "qcom,rpm-pmi8994-regulators", .data = &rpm_pmi8994_regulators },
{ .compatible = "qcom,rpm-pmi8998-regulators", .data = &rpm_pmi8998_regulators }, { .compatible = "qcom,rpm-pmi8998-regulators", .data = &rpm_pmi8998_regulators },
{ .compatible = "qcom,rpm-pms405-regulators", .data = &rpm_pms405_regulators }, { .compatible = "qcom,rpm-pms405-regulators", .data = &rpm_pms405_regulators },
{} {}
......
...@@ -277,9 +277,9 @@ enum regulator_type { ...@@ -277,9 +277,9 @@ enum regulator_type {
* @curr_table: Current limit mapping table (if table based mapping) * @curr_table: Current limit mapping table (if table based mapping)
* *
* @vsel_range_reg: Register for range selector when using pickable ranges * @vsel_range_reg: Register for range selector when using pickable ranges
* and regulator_regmap_X_voltage_X_pickable functions. * and ``regulator_map_*_voltage_*_pickable`` functions.
* @vsel_range_mask: Mask for register bitfield used for range selector * @vsel_range_mask: Mask for register bitfield used for range selector
* @vsel_reg: Register for selector when using regulator_regmap_X_voltage_ * @vsel_reg: Register for selector when using ``regulator_map_*_voltage_*``
* @vsel_mask: Mask for register bitfield used for selector * @vsel_mask: Mask for register bitfield used for selector
* @vsel_step: Specify the resolution of selector stepping when setting * @vsel_step: Specify the resolution of selector stepping when setting
* voltage. If 0, then no stepping is done (requested selector is * voltage. If 0, then no stepping is done (requested selector is
......
...@@ -10,6 +10,7 @@ struct qcom_smd_rpm; ...@@ -10,6 +10,7 @@ struct qcom_smd_rpm;
/* /*
* Constants used for addressing resources in the RPM. * Constants used for addressing resources in the RPM.
*/ */
#define QCOM_SMD_RPM_BBYB 0x62796262
#define QCOM_SMD_RPM_BOBB 0x62626f62 #define QCOM_SMD_RPM_BOBB 0x62626f62
#define QCOM_SMD_RPM_BOOST 0x61747362 #define QCOM_SMD_RPM_BOOST 0x61747362
#define QCOM_SMD_RPM_BUS_CLK 0x316b6c63 #define QCOM_SMD_RPM_BUS_CLK 0x316b6c63
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment