Merge remote-tracking branches 'regulator/topic/da9063', 'regulator/topic/doc', ...
authorMark Brown <broonie@kernel.org>
Mon, 22 Jun 2015 10:19:52 +0000 (11:19 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 22 Jun 2015 10:19:52 +0000 (11:19 +0100)
Documentation/devicetree/bindings/regulator/regulator.txt
drivers/regulator/Kconfig
drivers/regulator/core.c
drivers/regulator/da9063-regulator.c
drivers/regulator/fan53555.c
drivers/regulator/of_regulator.c
include/linux/regulator/driver.h
include/linux/regulator/machine.h

index abb26b5..db88feb 100644 (file)
@@ -7,18 +7,20 @@ Optional properties:
 - regulator-microvolt-offset: Offset applied to voltages to compensate for voltage drops
 - regulator-min-microamp: smallest current consumers may set
 - regulator-max-microamp: largest current consumers may set
+- regulator-input-current-limit-microamp: maximum input current regulator allows
 - regulator-always-on: boolean, regulator should never be disabled
 - regulator-boot-on: bootloader/firmware enabled regulator
 - regulator-allow-bypass: allow the regulator to go into bypass mode
 - <name>-supply: phandle to the parent supply/regulator node
 - regulator-ramp-delay: ramp delay for regulator(in uV/uS)
   For hardware which supports disabling ramp rate, it should be explicitly
-  intialised to zero (regulator-ramp-delay = <0>) for disabling ramp delay.
+  initialised to zero (regulator-ramp-delay = <0>) for disabling ramp delay.
 - regulator-enable-ramp-delay: The time taken, in microseconds, for the supply
   rail to reach the target voltage, plus/minus whatever tolerance the board
   design requires. This property describes the total system ramp time
   required due to the combination of internal ramping of the regulator itself,
   and board design issues such as trace capacitance and load on the supply.
+- regulator-soft-start: Enable soft start so that voltage ramps slowly
 - regulator-state-mem sub-root node for Suspend-to-RAM mode
   : suspend to memory, the device goes to sleep, but all data stored in memory,
   only some external interrupt can wake the device.
@@ -37,6 +39,9 @@ Optional properties:
 - regulator-initial-mode: initial operating mode. The set of possible operating
   modes depends on the capabilities of every hardware so each device binding
   documentation explains which values the regulator supports.
+- regulator-system-load: Load in uA present on regulator that is not captured by
+  any consumer request.
+- regulator-pull-down: Enable pull down resistor when the regulator is disabled.
 
 Deprecated properties:
 - regulator-compatible: If a regulator chip contains multiple
index 1fd6dc3..4d6d126 100644 (file)
@@ -243,7 +243,7 @@ config REGULATOR_FAN53555
 
 config REGULATOR_GPIO
        tristate "GPIO regulator support"
-       depends on GPIOLIB
+       depends on GPIOLIB || COMPILE_TEST
        help
          This driver provides support for regulators that can be
          controlled via gpios.
index 9da5c55..c9f7201 100644 (file)
@@ -678,6 +678,8 @@ static int drms_uA_update(struct regulator_dev *rdev)
        list_for_each_entry(sibling, &rdev->consumer_list, list)
                current_uA += sibling->uA_load;
 
+       current_uA += rdev->constraints->system_load;
+
        if (rdev->desc->ops->set_load) {
                /* set the optimum mode for our new total regulator load */
                err = rdev->desc->ops->set_load(rdev, current_uA);
@@ -1011,6 +1013,15 @@ static int set_machine_constraints(struct regulator_dev *rdev,
        if (ret != 0)
                goto out;
 
+       if (rdev->constraints->ilim_uA && ops->set_input_current_limit) {
+               ret = ops->set_input_current_limit(rdev,
+                                                  rdev->constraints->ilim_uA);
+               if (ret < 0) {
+                       rdev_err(rdev, "failed to set input limit\n");
+                       goto out;
+               }
+       }
+
        /* do we need to setup our suspend state */
        if (rdev->constraints->initial_state) {
                ret = suspend_prepare(rdev, rdev->constraints->initial_state);
@@ -1054,6 +1065,22 @@ static int set_machine_constraints(struct regulator_dev *rdev,
                }
        }
 
+       if (rdev->constraints->pull_down && ops->set_pull_down) {
+               ret = ops->set_pull_down(rdev);
+               if (ret < 0) {
+                       rdev_err(rdev, "failed to set pull down\n");
+                       goto out;
+               }
+       }
+
+       if (rdev->constraints->soft_start && ops->set_soft_start) {
+               ret = ops->set_soft_start(rdev);
+               if (ret < 0) {
+                       rdev_err(rdev, "failed to set soft start\n");
+                       goto out;
+               }
+       }
+
        print_constraints(rdev);
        return 0;
 out:
index 31c2c59..aed1ad3 100644 (file)
@@ -117,9 +117,6 @@ struct da9063_regulator {
 
 /* Encapsulates all information for the regulators driver */
 struct da9063_regulators {
-       int                                     irq_ldo_lim;
-       int                                     irq_uvov;
-
        unsigned                                n_regulators;
        /* Array size to be defined during init. Keep at end. */
        struct da9063_regulator                 regulator[0];
@@ -867,35 +864,23 @@ static int da9063_regulator_probe(struct platform_device *pdev)
                return irq;
        }
 
-       ret = request_threaded_irq(irq,
+       ret = devm_request_threaded_irq(&pdev->dev, irq,
                                NULL, da9063_ldo_lim_event,
                                IRQF_TRIGGER_LOW | IRQF_ONESHOT,
                                "LDO_LIM", regulators);
        if (ret) {
-               dev_err(&pdev->dev,
-                               "Failed to request LDO_LIM IRQ.\n");
-               regulators->irq_ldo_lim = -ENXIO;
+               dev_err(&pdev->dev, "Failed to request LDO_LIM IRQ.\n");
+               return ret;
        }
 
        return 0;
 }
 
-static int da9063_regulator_remove(struct platform_device *pdev)
-{
-       struct da9063_regulators *regulators = platform_get_drvdata(pdev);
-
-       free_irq(regulators->irq_ldo_lim, regulators);
-       free_irq(regulators->irq_uvov, regulators);
-
-       return 0;
-}
-
 static struct platform_driver da9063_regulator_driver = {
        .driver = {
                .name = DA9063_DRVNAME_REGULATORS,
        },
        .probe = da9063_regulator_probe,
-       .remove = da9063_regulator_remove,
 };
 
 static int __init da9063_regulator_init(void)
index 3c25db8..4286568 100644 (file)
@@ -182,6 +182,7 @@ static int fan53555_set_ramp(struct regulator_dev *rdev, int ramp)
 static struct regulator_ops fan53555_regulator_ops = {
        .set_voltage_sel = regulator_set_voltage_sel_regmap,
        .get_voltage_sel = regulator_get_voltage_sel_regmap,
+       .set_voltage_time_sel = regulator_set_voltage_time_sel,
        .map_voltage = regulator_map_voltage_linear,
        .list_voltage = regulator_list_voltage_linear,
        .set_suspend_voltage = fan53555_set_suspend_voltage,
index e952439..e221cb1 100644 (file)
@@ -58,6 +58,10 @@ static void of_get_regulation_constraints(struct device_node *np,
        if (!of_property_read_u32(np, "regulator-max-microamp", &pval))
                constraints->max_uA = pval;
 
+       if (!of_property_read_u32(np, "regulator-input-current-limit-microamp",
+                                 &pval))
+               constraints->ilim_uA = pval;
+
        /* Current change possible? */
        if (constraints->min_uA != constraints->max_uA)
                constraints->valid_ops_mask |= REGULATOR_CHANGE_CURRENT;
@@ -67,6 +71,8 @@ static void of_get_regulation_constraints(struct device_node *np,
        if (!constraints->always_on) /* status change should be possible. */
                constraints->valid_ops_mask |= REGULATOR_CHANGE_STATUS;
 
+       constraints->pull_down = of_property_read_bool(np, "regulator-pull-down");
+
        if (of_property_read_bool(np, "regulator-allow-bypass"))
                constraints->valid_ops_mask |= REGULATOR_CHANGE_BYPASS;
 
@@ -82,6 +88,9 @@ static void of_get_regulation_constraints(struct device_node *np,
        if (!ret)
                constraints->enable_time = pval;
 
+       constraints->soft_start = of_property_read_bool(np,
+                                       "regulator-soft-start");
+
        if (!of_property_read_u32(np, "regulator-initial-mode", &pval)) {
                if (desc && desc->of_map_mode) {
                        ret = desc->of_map_mode(pval);
@@ -95,6 +104,9 @@ static void of_get_regulation_constraints(struct device_node *np,
                }
        }
 
+       if (!of_property_read_u32(np, "regulator-system-load", &pval))
+               constraints->system_load = pval;
+
        for (i = 0; i < ARRAY_SIZE(regulator_states); i++) {
                switch (i) {
                case PM_SUSPEND_MEM:
index fffa688..125264f 100644 (file)
@@ -91,6 +91,7 @@ struct regulator_linear_range {
  * @set_current_limit: Configure a limit for a current-limited regulator.
  *                     The driver should select the current closest to max_uA.
  * @get_current_limit: Get the configured limit for a current-limited regulator.
+ * @set_input_current_limit: Configure an input limit.
  *
  * @set_mode: Set the configured operating mode for the regulator.
  * @get_mode: Get the configured operating mode for the regulator.
@@ -121,6 +122,9 @@ struct regulator_linear_range {
  * @set_suspend_mode: Set the operating mode for the regulator when the
  *                    system is suspended.
  *
+ * @set_pull_down: Configure the regulator to pull down when the regulator
+ *                is disabled.
+ *
  * This struct describes regulator operations which can be implemented by
  * regulator chip drivers.
  */
@@ -142,6 +146,8 @@ struct regulator_ops {
                                 int min_uA, int max_uA);
        int (*get_current_limit) (struct regulator_dev *);
 
+       int (*set_input_current_limit) (struct regulator_dev *, int lim_uA);
+
        /* enable/disable regulator */
        int (*enable) (struct regulator_dev *);
        int (*disable) (struct regulator_dev *);
@@ -158,6 +164,8 @@ struct regulator_ops {
                                     unsigned int old_selector,
                                     unsigned int new_selector);
 
+       int (*set_soft_start) (struct regulator_dev *);
+
        /* report regulator status ... most other accessors report
         * control inputs, this reports results of combining inputs
         * from Linux (and other sources) with the actual load.
@@ -187,6 +195,8 @@ struct regulator_ops {
 
        /* set regulator suspend operating mode (defined in consumer.h) */
        int (*set_suspend_mode) (struct regulator_dev *, unsigned int mode);
+
+       int (*set_pull_down) (struct regulator_dev *);
 };
 
 /*
index b07562e..85a3b45 100644 (file)
@@ -75,6 +75,8 @@ struct regulator_state {
  *
  * @min_uA: Smallest current consumers may set.
  * @max_uA: Largest current consumers may set.
+ * @ilim_uA: Maximum input current.
+ * @system_load: Load that isn't captured by any consumer requests.
  *
  * @valid_modes_mask: Mask of modes which may be configured by consumers.
  * @valid_ops_mask: Operations which may be performed by consumers.
@@ -86,6 +88,7 @@ struct regulator_state {
  *           applied.
  * @apply_uV: Apply the voltage constraint when initialising.
  * @ramp_disable: Disable ramp delay when initialising or when setting voltage.
+ * @pull_down: Enable pull down when regulator is disabled.
  *
  * @input_uV: Input voltage for regulator when supplied by another regulator.
  *
@@ -111,6 +114,9 @@ struct regulation_constraints {
        /* current output range (inclusive) - for current control */
        int min_uA;
        int max_uA;
+       int ilim_uA;
+
+       int system_load;
 
        /* valid regulator operating modes for this machine */
        unsigned int valid_modes_mask;
@@ -138,6 +144,8 @@ struct regulation_constraints {
        unsigned boot_on:1;     /* bootloader/firmware enabled regulator */
        unsigned apply_uV:1;    /* apply uV constraint if min == max */
        unsigned ramp_disable:1; /* disable ramp delay */
+       unsigned soft_start:1;  /* ramp voltage slowly */
+       unsigned pull_down:1;   /* pull down resistor when regulator off */
 };
 
 /**