Commit 733ada00 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/topic/of', 'regulator/topic/pwm',...

Merge remote-tracking branches 'regulator/topic/of', 'regulator/topic/pwm', 'regulator/topic/qcom' and 'regulator/topic/soft-start' into regulator-next
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 ...@@ -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 ...@@ -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, ...@@ -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 @@ ...@@ -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 { ...@@ -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, ...@@ -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(&dev->dev, "Failed to enable PWM\n"); dev_err(&rdev->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 = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
} }
......
This diff is collapsed.
...@@ -112,6 +112,7 @@ struct regulator_linear_range { ...@@ -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 { ...@@ -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.
......
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