mirror of
https://github.com/torvalds/linux
synced 2024-09-30 16:29:47 +00:00
Merge remote-tracking branches 'regulator/topic/of', 'regulator/topic/pwm', 'regulator/topic/qcom' and 'regulator/topic/soft-start' into regulator-next
This commit is contained in:
commit
733ada000f
|
@ -0,0 +1,121 @@
|
||||||
|
Qualcomm SPMI Regulators
|
||||||
|
|
||||||
|
- compatible:
|
||||||
|
Usage: required
|
||||||
|
Value type: <string>
|
||||||
|
Definition: must be one of:
|
||||||
|
"qcom,pm8841-regulators"
|
||||||
|
"qcom,pm8916-regulators"
|
||||||
|
"qcom,pm8941-regulators"
|
||||||
|
|
||||||
|
- interrupts:
|
||||||
|
Usage: optional
|
||||||
|
Value type: <prop-encoded-array>
|
||||||
|
Definition: List of OCP interrupts.
|
||||||
|
|
||||||
|
- interrupt-names:
|
||||||
|
Usage: required if 'interrupts' property present
|
||||||
|
Value type: <string-array>
|
||||||
|
Definition: List of strings defining the names of the
|
||||||
|
interrupts in the 'interrupts' property 1-to-1.
|
||||||
|
Supported values are "ocp-<regulator_name>", where
|
||||||
|
<regulator_name> corresponds to a voltage switch
|
||||||
|
type regulator.
|
||||||
|
|
||||||
|
- vdd_s1-supply:
|
||||||
|
- vdd_s2-supply:
|
||||||
|
- vdd_s3-supply:
|
||||||
|
- vdd_s4-supply:
|
||||||
|
- vdd_s5-supply:
|
||||||
|
- vdd_s6-supply:
|
||||||
|
- vdd_s7-supply:
|
||||||
|
- vdd_s8-supply:
|
||||||
|
Usage: optional (pm8841 only)
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: Reference to regulator supplying the input pin, as
|
||||||
|
described in the data sheet.
|
||||||
|
|
||||||
|
- vdd_s1-supply:
|
||||||
|
- vdd_s2-supply:
|
||||||
|
- vdd_s3-supply:
|
||||||
|
- vdd_s4-supply:
|
||||||
|
- vdd_l1_l3-supply:
|
||||||
|
- vdd_l2-supply:
|
||||||
|
- vdd_l4_l5_l6-supply:
|
||||||
|
- vdd_l7-supply:
|
||||||
|
- vdd_l8_l11_l14_l15_l16-supply:
|
||||||
|
- vdd_l9_l10_l12_l13_l17_l18-supply:
|
||||||
|
Usage: optional (pm8916 only)
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: Reference to regulator supplying the input pin, as
|
||||||
|
described in the data sheet.
|
||||||
|
|
||||||
|
- vdd_s1-supply:
|
||||||
|
- vdd_s2-supply:
|
||||||
|
- vdd_s3-supply:
|
||||||
|
- vdd_l1_l3-supply:
|
||||||
|
- vdd_l2_lvs_1_2_3-supply:
|
||||||
|
- vdd_l4_l11-supply:
|
||||||
|
- vdd_l5_l7-supply:
|
||||||
|
- vdd_l6_l12_l14_l15-supply:
|
||||||
|
- vdd_l8_l16_l18_19-supply:
|
||||||
|
- vdd_l9_l10_l17_l22-supply:
|
||||||
|
- vdd_l13_l20_l23_l24-supply:
|
||||||
|
- vdd_l21-supply:
|
||||||
|
- vin_5vs-supply:
|
||||||
|
Usage: optional (pm8941 only)
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: Reference to regulator supplying the input pin, as
|
||||||
|
described in the data sheet.
|
||||||
|
|
||||||
|
|
||||||
|
The regulator node houses sub-nodes for each regulator within the device. Each
|
||||||
|
sub-node is identified using the node's name, with valid values listed for each
|
||||||
|
of the PMICs below.
|
||||||
|
|
||||||
|
pm8841:
|
||||||
|
s1, s2, s3, s4, s5, s6, s7, s8
|
||||||
|
|
||||||
|
pm8916:
|
||||||
|
s1, s2, s3, s4, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13,
|
||||||
|
l14, l15, l16, l17, l18
|
||||||
|
|
||||||
|
pm8941:
|
||||||
|
s1, s2, s3, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14,
|
||||||
|
l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, lvs1, lvs2, lvs3,
|
||||||
|
mvs1, mvs2
|
||||||
|
|
||||||
|
The content of each sub-node is defined by the standard binding for regulators -
|
||||||
|
see regulator.txt - with additional custom properties described below:
|
||||||
|
|
||||||
|
- regulator-initial-mode:
|
||||||
|
Usage: optional
|
||||||
|
Value type: <u32>
|
||||||
|
Descrption: 1 = Set initial mode to high power mode (HPM), also referred
|
||||||
|
to as NPM. HPM consumes more ground current than LPM, but
|
||||||
|
it can source significantly higher load current. HPM is not
|
||||||
|
available on boost type regulators. For voltage switch type
|
||||||
|
regulators, HPM implies that over current protection and
|
||||||
|
soft start are active all the time. 0 = Set initial mode to
|
||||||
|
low power mode (LPM).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
regulators {
|
||||||
|
compatible = "qcom,pm8941-regulators";
|
||||||
|
vdd_l1_l3-supply = <&s1>;
|
||||||
|
|
||||||
|
s1: s1 {
|
||||||
|
regulator-min-microvolt = <1300000>;
|
||||||
|
regulator-max-microvolt = <1400000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
l1: l1 {
|
||||||
|
regulator-min-microvolt = <1225000>;
|
||||||
|
regulator-max-microvolt = <1300000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
....
|
||||||
|
};
|
|
@ -522,6 +522,17 @@ config REGULATOR_QCOM_RPM
|
||||||
Qualcomm RPM as a module. The module will be named
|
Qualcomm RPM as a module. The module will be named
|
||||||
"qcom_rpm-regulator".
|
"qcom_rpm-regulator".
|
||||||
|
|
||||||
|
config REGULATOR_QCOM_SPMI
|
||||||
|
tristate "Qualcomm SPMI regulator driver"
|
||||||
|
depends on SPMI || COMPILE_TEST
|
||||||
|
help
|
||||||
|
If you say yes to this option, support will be included for the
|
||||||
|
regulators found in Qualcomm SPMI PMICs.
|
||||||
|
|
||||||
|
Say M here if you want to include support for the regulators on the
|
||||||
|
Qualcomm SPMI PMICs as a module. The module will be named
|
||||||
|
"qcom_spmi-regulator".
|
||||||
|
|
||||||
config REGULATOR_RC5T583
|
config REGULATOR_RC5T583
|
||||||
tristate "RICOH RC5T583 Power regulators"
|
tristate "RICOH RC5T583 Power regulators"
|
||||||
depends on MFD_RC5T583
|
depends on MFD_RC5T583
|
||||||
|
|
|
@ -62,6 +62,7 @@ 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_MT6397) += mt6397-regulator.o
|
obj-$(CONFIG_REGULATOR_MT6397) += mt6397-regulator.o
|
||||||
obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o
|
obj-$(CONFIG_REGULATOR_QCOM_RPM) += qcom_rpm-regulator.o
|
||||||
|
obj-$(CONFIG_REGULATOR_QCOM_SPMI) += qcom_spmi-regulator.o
|
||||||
obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o
|
obj-$(CONFIG_REGULATOR_PALMAS) += palmas-regulator.o
|
||||||
obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o
|
obj-$(CONFIG_REGULATOR_PFUZE100) += pfuze100-regulator.o
|
||||||
obj-$(CONFIG_REGULATOR_PWM) += pwm-regulator.o
|
obj-$(CONFIG_REGULATOR_PWM) += pwm-regulator.o
|
||||||
|
|
|
@ -304,7 +304,7 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_child_of_node(search, child) {
|
for_each_available_child_of_node(search, child) {
|
||||||
name = of_get_property(child, "regulator-compatible", NULL);
|
name = of_get_property(child, "regulator-compatible", NULL);
|
||||||
if (!name)
|
if (!name)
|
||||||
name = child->name;
|
name = child->name;
|
||||||
|
|
|
@ -21,10 +21,8 @@
|
||||||
#include <linux/pwm.h>
|
#include <linux/pwm.h>
|
||||||
|
|
||||||
struct pwm_regulator_data {
|
struct pwm_regulator_data {
|
||||||
struct regulator_desc desc;
|
|
||||||
struct pwm_voltages *duty_cycle_table;
|
struct pwm_voltages *duty_cycle_table;
|
||||||
struct pwm_device *pwm;
|
struct pwm_device *pwm;
|
||||||
bool enabled;
|
|
||||||
int state;
|
int state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,17 +31,17 @@ struct pwm_voltages {
|
||||||
unsigned int dutycycle;
|
unsigned int dutycycle;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int pwm_regulator_get_voltage_sel(struct regulator_dev *dev)
|
static int pwm_regulator_get_voltage_sel(struct regulator_dev *rdev)
|
||||||
{
|
{
|
||||||
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
|
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
|
||||||
|
|
||||||
return drvdata->state;
|
return drvdata->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pwm_regulator_set_voltage_sel(struct regulator_dev *dev,
|
static int pwm_regulator_set_voltage_sel(struct regulator_dev *rdev,
|
||||||
unsigned selector)
|
unsigned selector)
|
||||||
{
|
{
|
||||||
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
|
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
|
||||||
unsigned int pwm_reg_period;
|
unsigned int pwm_reg_period;
|
||||||
int dutycycle;
|
int dutycycle;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -55,30 +53,27 @@ static int pwm_regulator_set_voltage_sel(struct regulator_dev *dev,
|
||||||
|
|
||||||
ret = pwm_config(drvdata->pwm, dutycycle, pwm_reg_period);
|
ret = pwm_config(drvdata->pwm, dutycycle, pwm_reg_period);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&dev->dev, "Failed to configure PWM\n");
|
dev_err(&rdev->dev, "Failed to configure PWM\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
drvdata->state = selector;
|
drvdata->state = selector;
|
||||||
|
|
||||||
if (!drvdata->enabled) {
|
ret = pwm_enable(drvdata->pwm);
|
||||||
ret = pwm_enable(drvdata->pwm);
|
if (ret) {
|
||||||
if (ret) {
|
dev_err(&rdev->dev, "Failed to enable PWM\n");
|
||||||
dev_err(&dev->dev, "Failed to enable PWM\n");
|
return ret;
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
drvdata->enabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pwm_regulator_list_voltage(struct regulator_dev *dev,
|
static int pwm_regulator_list_voltage(struct regulator_dev *rdev,
|
||||||
unsigned selector)
|
unsigned selector)
|
||||||
{
|
{
|
||||||
struct pwm_regulator_data *drvdata = rdev_get_drvdata(dev);
|
struct pwm_regulator_data *drvdata = rdev_get_drvdata(rdev);
|
||||||
|
|
||||||
if (selector >= drvdata->desc.n_voltages)
|
if (selector >= rdev->desc->n_voltages)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return drvdata->duty_cycle_table[selector].uV;
|
return drvdata->duty_cycle_table[selector].uV;
|
||||||
|
@ -91,7 +86,7 @@ static struct regulator_ops pwm_regulator_voltage_ops = {
|
||||||
.map_voltage = regulator_map_voltage_iterate,
|
.map_voltage = regulator_map_voltage_iterate,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct regulator_desc pwm_regulator_desc = {
|
static struct regulator_desc pwm_regulator_desc = {
|
||||||
.name = "pwm-regulator",
|
.name = "pwm-regulator",
|
||||||
.ops = &pwm_regulator_voltage_ops,
|
.ops = &pwm_regulator_voltage_ops,
|
||||||
.type = REGULATOR_VOLTAGE,
|
.type = REGULATOR_VOLTAGE,
|
||||||
|
@ -117,8 +112,6 @@ static int pwm_regulator_probe(struct platform_device *pdev)
|
||||||
if (!drvdata)
|
if (!drvdata)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
memcpy(&drvdata->desc, &pwm_regulator_desc, sizeof(pwm_regulator_desc));
|
|
||||||
|
|
||||||
/* determine the number of voltage-table */
|
/* determine the number of voltage-table */
|
||||||
prop = of_find_property(np, "voltage-table", &length);
|
prop = of_find_property(np, "voltage-table", &length);
|
||||||
if (!prop) {
|
if (!prop) {
|
||||||
|
@ -133,7 +126,7 @@ static int pwm_regulator_probe(struct platform_device *pdev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
drvdata->desc.n_voltages = length / sizeof(*drvdata->duty_cycle_table);
|
pwm_regulator_desc.n_voltages = length / sizeof(*drvdata->duty_cycle_table);
|
||||||
|
|
||||||
drvdata->duty_cycle_table = devm_kzalloc(&pdev->dev,
|
drvdata->duty_cycle_table = devm_kzalloc(&pdev->dev,
|
||||||
length, GFP_KERNEL);
|
length, GFP_KERNEL);
|
||||||
|
@ -150,7 +143,7 @@ static int pwm_regulator_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
config.init_data = of_get_regulator_init_data(&pdev->dev, np,
|
config.init_data = of_get_regulator_init_data(&pdev->dev, np,
|
||||||
&drvdata->desc);
|
&pwm_regulator_desc);
|
||||||
if (!config.init_data)
|
if (!config.init_data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -165,10 +158,10 @@ static int pwm_regulator_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
regulator = devm_regulator_register(&pdev->dev,
|
regulator = devm_regulator_register(&pdev->dev,
|
||||||
&drvdata->desc, &config);
|
&pwm_regulator_desc, &config);
|
||||||
if (IS_ERR(regulator)) {
|
if (IS_ERR(regulator)) {
|
||||||
dev_err(&pdev->dev, "Failed to register regulator %s\n",
|
dev_err(&pdev->dev, "Failed to register regulator %s\n",
|
||||||
drvdata->desc.name);
|
pwm_regulator_desc.name);
|
||||||
return PTR_ERR(regulator);
|
return PTR_ERR(regulator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1435
drivers/regulator/qcom_spmi-regulator.c
Normal file
1435
drivers/regulator/qcom_spmi-regulator.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -112,6 +112,7 @@ struct regulator_linear_range {
|
||||||
* to stabilise after being set to a new value, in microseconds.
|
* to stabilise after being set to a new value, in microseconds.
|
||||||
* The function provides the from and to voltage selector, the
|
* The function provides the from and to voltage selector, the
|
||||||
* function should return the worst case.
|
* function should return the worst case.
|
||||||
|
* @set_soft_start: Enable soft start for the regulator.
|
||||||
*
|
*
|
||||||
* @set_suspend_voltage: Set the voltage for the regulator when the system
|
* @set_suspend_voltage: Set the voltage for the regulator when the system
|
||||||
* is suspended.
|
* is suspended.
|
||||||
|
|
|
@ -88,6 +88,7 @@ struct regulator_state {
|
||||||
* applied.
|
* applied.
|
||||||
* @apply_uV: Apply the voltage constraint when initialising.
|
* @apply_uV: Apply the voltage constraint when initialising.
|
||||||
* @ramp_disable: Disable ramp delay when initialising or when setting voltage.
|
* @ramp_disable: Disable ramp delay when initialising or when setting voltage.
|
||||||
|
* @soft_start: Enable soft start so that voltage ramps slowly.
|
||||||
* @pull_down: Enable pull down when regulator is disabled.
|
* @pull_down: Enable pull down when regulator is disabled.
|
||||||
*
|
*
|
||||||
* @input_uV: Input voltage for regulator when supplied by another regulator.
|
* @input_uV: Input voltage for regulator when supplied by another regulator.
|
||||||
|
|
Loading…
Reference in a new issue