]> Git Repo - linux.git/commitdiff
Merge branch 'topic/of' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
authorMark Brown <[email protected]>
Wed, 10 Sep 2014 11:03:23 +0000 (12:03 +0100)
committerMark Brown <[email protected]>
Wed, 10 Sep 2014 11:03:23 +0000 (12:03 +0100)
1  2 
drivers/regulator/core.c
include/linux/regulator/driver.h

diff --combined drivers/regulator/core.c
index 1e976b6320a27978ba7a72fbfe1be060f92109ae,496002efd961fb71247ab80bbf50a65d2fa7d164..75aa49085763602c1b1b19ed55fb23a2d00ecd4f
@@@ -839,7 -839,7 +839,7 @@@ static void print_constraints(struct re
  static int machine_constraints_voltage(struct regulator_dev *rdev,
        struct regulation_constraints *constraints)
  {
 -      struct regulator_ops *ops = rdev->desc->ops;
 +      const struct regulator_ops *ops = rdev->desc->ops;
        int ret;
  
        /* do we need to apply the constraint voltage */
  static int machine_constraints_current(struct regulator_dev *rdev,
        struct regulation_constraints *constraints)
  {
 -      struct regulator_ops *ops = rdev->desc->ops;
 +      const struct regulator_ops *ops = rdev->desc->ops;
        int ret;
  
        if (!constraints->min_uA && !constraints->max_uA)
@@@ -982,7 -982,7 +982,7 @@@ static int set_machine_constraints(stru
        const struct regulation_constraints *constraints)
  {
        int ret = 0;
 -      struct regulator_ops *ops = rdev->desc->ops;
 +      const struct regulator_ops *ops = rdev->desc->ops;
  
        if (constraints)
                rdev->constraints = kmemdup(constraints, sizeof(*constraints),
@@@ -1759,45 -1759,6 +1759,45 @@@ static int regulator_ena_gpio_ctrl(stru
        return 0;
  }
  
 +/**
 + * _regulator_enable_delay - a delay helper function
 + * @delay: time to delay in microseconds
 + *
 + * Delay for the requested amount of time as per the guidelines in:
 + *
 + *     Documentation/timers/timers-howto.txt
 + *
 + * The assumption here is that regulators will never be enabled in
 + * atomic context and therefore sleeping functions can be used.
 + */
 +static void _regulator_enable_delay(unsigned int delay)
 +{
 +      unsigned int ms = delay / 1000;
 +      unsigned int us = delay % 1000;
 +
 +      if (ms > 0) {
 +              /*
 +               * For small enough values, handle super-millisecond
 +               * delays in the usleep_range() call below.
 +               */
 +              if (ms < 20)
 +                      us += ms * 1000;
 +              else
 +                      msleep(ms);
 +      }
 +
 +      /*
 +       * Give the scheduler some room to coalesce with any other
 +       * wakeup sources. For delays shorter than 10 us, don't even
 +       * bother setting up high-resolution timers and just busy-
 +       * loop.
 +       */
 +      if (us >= 10)
 +              usleep_range(us, us + 100);
 +      else
 +              udelay(us);
 +}
 +
  static int _regulator_do_enable(struct regulator_dev *rdev)
  {
        int ret, delay;
  
        trace_regulator_enable(rdev_get_name(rdev));
  
 +      if (rdev->desc->off_on_delay) {
 +              /* if needed, keep a distance of off_on_delay from last time
 +               * this regulator was disabled.
 +               */
 +              unsigned long start_jiffy = jiffies;
 +              unsigned long intended, max_delay, remaining;
 +
 +              max_delay = usecs_to_jiffies(rdev->desc->off_on_delay);
 +              intended = rdev->last_off_jiffy + max_delay;
 +
 +              if (time_before(start_jiffy, intended)) {
 +                      /* calc remaining jiffies to deal with one-time
 +                       * timer wrapping.
 +                       * in case of multiple timer wrapping, either it can be
 +                       * detected by out-of-range remaining, or it cannot be
 +                       * detected and we gets a panelty of
 +                       * _regulator_enable_delay().
 +                       */
 +                      remaining = intended - start_jiffy;
 +                      if (remaining <= max_delay)
 +                              _regulator_enable_delay(
 +                                              jiffies_to_usecs(remaining));
 +              }
 +      }
 +
        if (rdev->ena_pin) {
                ret = regulator_ena_gpio_ctrl(rdev, true);
                if (ret < 0)
         * together.  */
        trace_regulator_enable_delay(rdev_get_name(rdev));
  
 -      /*
 -       * Delay for the requested amount of time as per the guidelines in:
 -       *
 -       *     Documentation/timers/timers-howto.txt
 -       *
 -       * The assumption here is that regulators will never be enabled in
 -       * atomic context and therefore sleeping functions can be used.
 -       */
 -      if (delay) {
 -              unsigned int ms = delay / 1000;
 -              unsigned int us = delay % 1000;
 -
 -              if (ms > 0) {
 -                      /*
 -                       * For small enough values, handle super-millisecond
 -                       * delays in the usleep_range() call below.
 -                       */
 -                      if (ms < 20)
 -                              us += ms * 1000;
 -                      else
 -                              msleep(ms);
 -              }
 -
 -              /*
 -               * Give the scheduler some room to coalesce with any other
 -               * wakeup sources. For delays shorter than 10 us, don't even
 -               * bother setting up high-resolution timers and just busy-
 -               * loop.
 -               */
 -              if (us >= 10)
 -                      usleep_range(us, us + 100);
 -              else
 -                      udelay(us);
 -      }
 +      _regulator_enable_delay(delay);
  
        trace_regulator_enable_complete(rdev_get_name(rdev));
  
@@@ -1950,12 -1919,6 +1950,12 @@@ static int _regulator_do_disable(struc
                        return ret;
        }
  
 +      /* cares about last_off_jiffy only if off_on_delay is required by
 +       * device.
 +       */
 +      if (rdev->desc->off_on_delay)
 +              rdev->last_off_jiffy = jiffies;
 +
        trace_regulator_disable_complete(rdev_get_name(rdev));
  
        return 0;
@@@ -2245,9 -2208,9 +2245,9 @@@ EXPORT_SYMBOL_GPL(regulator_count_volta
   */
  int regulator_list_voltage(struct regulator *regulator, unsigned selector)
  {
 -      struct regulator_dev    *rdev = regulator->rdev;
 -      struct regulator_ops    *ops = rdev->desc->ops;
 -      int                     ret;
 +      struct regulator_dev *rdev = regulator->rdev;
 +      const struct regulator_ops *ops = rdev->desc->ops;
 +      int ret;
  
        if (rdev->desc->fixed_uV && rdev->desc->n_voltages == 1 && !selector)
                return rdev->desc->fixed_uV;
@@@ -2609,8 -2572,8 +2609,8 @@@ EXPORT_SYMBOL_GPL(regulator_set_voltage
  int regulator_set_voltage_time(struct regulator *regulator,
                               int old_uV, int new_uV)
  {
 -      struct regulator_dev    *rdev = regulator->rdev;
 -      struct regulator_ops    *ops = rdev->desc->ops;
 +      struct regulator_dev *rdev = regulator->rdev;
 +      const struct regulator_ops *ops = rdev->desc->ops;
        int old_sel = -1;
        int new_sel = -1;
        int voltage;
@@@ -3373,9 -3336,9 +3373,9 @@@ EXPORT_SYMBOL_GPL(regulator_mode_to_sta
   */
  static int add_regulator_attributes(struct regulator_dev *rdev)
  {
 -      struct device           *dev = &rdev->dev;
 -      struct regulator_ops    *ops = rdev->desc->ops;
 -      int                     status = 0;
 +      struct device *dev = &rdev->dev;
 +      const struct regulator_ops *ops = rdev->desc->ops;
 +      int status = 0;
  
        /* some attributes need specific methods to be displayed */
        if ((ops->get_voltage && ops->get_voltage(rdev) >= 0) ||
@@@ -3553,12 -3516,17 +3553,17 @@@ regulator_register(const struct regulat
                return ERR_PTR(-EINVAL);
        }
  
-       init_data = config->init_data;
        rdev = kzalloc(sizeof(struct regulator_dev), GFP_KERNEL);
        if (rdev == NULL)
                return ERR_PTR(-ENOMEM);
  
+       init_data = regulator_of_get_init_data(dev, regulator_desc,
+                                              &rdev->dev.of_node);
+       if (!init_data) {
+               init_data = config->init_data;
+               rdev->dev.of_node = of_node_get(config->of_node);
+       }
        mutex_lock(&regulator_list_mutex);
  
        mutex_init(&rdev->mutex);
  
        /* register with sysfs */
        rdev->dev.class = &regulator_class;
-       rdev->dev.of_node = of_node_get(config->of_node);
        rdev->dev.parent = dev;
        dev_set_name(&rdev->dev, "regulator.%d",
                     atomic_inc_return(&regulator_no) - 1);
@@@ -3942,7 -3909,7 +3946,7 @@@ core_initcall(regulator_init)
  static int __init regulator_init_complete(void)
  {
        struct regulator_dev *rdev;
 -      struct regulator_ops *ops;
 +      const struct regulator_ops *ops;
        struct regulation_constraints *c;
        int enabled, ret;
  
index efe058f8f746fc5ec3fd7ba193391ee529a574a6,c35f5f97a14762ec1ababf81fca6e325d34e89ac..18f7017deaa50f7ea72454c6385016048a05b2a4
@@@ -203,6 -203,8 +203,8 @@@ enum regulator_type 
   *
   * @name: Identifying name for the regulator.
   * @supply_name: Identifying the regulator supply
+  * @of_match: Name used to identify regulator in DT.
+  * @regulators_node: Name of node containing regulator definitions in DT.
   * @id: Numerical identifier for the regulator.
   * @ops: Regulator operations table.
   * @irq: Interrupt number for the regulator.
   * @bypass_val_off: Disabling value for control when using regmap set_bypass
   *
   * @enable_time: Time taken for initial enable of regulator (in uS).
 + * @off_on_delay: guard time (in uS), before re-enabling a regulator
   */
  struct regulator_desc {
        const char *name;
        const char *supply_name;
+       const char *of_match;
+       const char *regulators_node;
        int id;
        bool continuous_voltage_range;
        unsigned n_voltages;
 -      struct regulator_ops *ops;
 +      const struct regulator_ops *ops;
        int irq;
        enum regulator_type type;
        struct module *owner;
        unsigned int bypass_val_off;
  
        unsigned int enable_time;
 +
 +      unsigned int off_on_delay;
  };
  
  /**
@@@ -351,9 -352,6 +355,9 @@@ struct regulator_dev 
  
        struct regulator_enable_gpio *ena_pin;
        unsigned int ena_gpio_state:1;
 +
 +      /* time when this regulator was disabled last time */
 +      unsigned long last_off_jiffy;
  };
  
  struct regulator_dev *
This page took 0.082141 seconds and 4 git commands to generate.