1. 19 11月, 2018 3 次提交
  2. 09 11月, 2018 2 次提交
  3. 08 11月, 2018 4 次提交
    • D
      regulator: core: Don't allow to get regulator until all couples resolved · 79d6f049
      Dmitry Osipenko 提交于
      Don't allow to get regulator until all of its couples resolved because
      consumer will get EPERM and coupling shall be transparent for the drivers.
      Signed-off-by: NDmitry Osipenko <digetx@gmail.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      79d6f049
    • D
      regulator: core: Mutually resolve regulators coupling · f9503385
      Dmitry Osipenko 提交于
      If registered regulator found a couple, then the couple can find the
      registered regulator too and hence coupling can be mutually resolved
      at the registration time.
      Signed-off-by: NDmitry Osipenko <digetx@gmail.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      f9503385
    • M
      regulator: core: Change voltage setting path · 9243a195
      Maciej Purski 提交于
      On Odroid XU3/4 and other Exynos5422 based boards there is a case, that
      different devices on the board are supplied by different regulators
      with non-fixed voltages. If one of these devices temporarily requires
      higher voltage, there might occur a situation that the spread between
      two devices' voltages is so high, that there is a risk of changing
      'high' and 'low' states on the interconnection between devices powered
      by those regulators.
      
      Uncoupled regulators should be a special case of coupled regulators, so
      they should share a common voltage setting path. When enabling,
      disabling or setting voltage of a coupled regulator, all coupled
      regulators should be locked. Regulator's supplies should be locked, when
      setting voltage of a single regulator. Enabling a coupled regulator or
      setting its voltage should not be possible if some of its coupled
      regulators, has not been registered.
      
      Add function for locking coupled regulators and supplies. Extract
      a new function regulator_set_voltage_rdev() from
      regulator_set_voltage_unlocked(), which is called when setting
      voltage of a single regulator.
      Signed-off-by: NMaciej Purski <m.purski@samsung.com>
      Signed-off-by: NDmitry Osipenko <digetx@gmail.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      9243a195
    • M
      regulator: core: Add voltage balancing mechanism · c054c6c7
      Maciej Purski 提交于
      On Odroid XU3/4 and other Exynos5422 based boards there is a case, that
      different devices on the board are supplied by different regulators
      with non-fixed voltages. If one of these devices temporarily requires
      higher voltage, there might occur a situation that the spread between
      two devices' voltages is so high, that there is a risk of changing
      'high' and 'low' states on the interconnection between devices powered
      by those regulators.
      
      Introduce new function regulator_balance_voltage(), which
      keeps max_spread constraint fulfilled between a group of coupled
      regulators. It should be called if a regulator changes its
      voltage or after disabling or enabling. Disabled regulators should
      follow changes of the enabled ones, but their consumers' demands
      shouldn't be taken into account while calculating voltage of other
      coupled regulators.
      
      Find voltages, which are closest to suiting all the consumers' demands,
      while fulfilling max_spread constraint, keeping the following rules:
      - if one regulator is about to rise its voltage, rise others
        voltages in order to keep the max_spread
      - if a regulator, which has caused rising other regulators, is
        lowered, lower other regulators if possible
      - if one regulator is about to lower its voltage, but it hasn't caused
        rising other regulators, change its voltage so that it doesn't break the
        max_spread
      
      Change regulators' voltages step by step, keeping max_spread constraint
      fulfilled all the time. Function regulator_get_optimal_voltage()
      should find the best possible change for the regulator, which doesn't
      break max_spread constraint. In function regulator_balance_voltage()
      optimize number of steps by finding highest voltage difference on
      each iteration.
      
      If a regulator, which is about to change its voltage, is not coupled,
      method regulator_get_optimal_voltage() should simply return the lowest
      voltage fulfilling consumers' demands.
      
      Coupling should be checked only if the system is in PM_SUSPEND_ON state.
      Signed-off-by: NMaciej Purski <m.purski@samsung.com>
      Signed-off-by: NDmitry Osipenko <digetx@gmail.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      c054c6c7
  4. 28 9月, 2018 1 次提交
  5. 21 9月, 2018 1 次提交
  6. 04 9月, 2018 1 次提交
  7. 03 9月, 2018 2 次提交
    • M
      regulator: Fix useless O^2 complexity in suspend/resume · cd7e36ab
      Marek Szyprowski 提交于
      regulator_pm_ops with regulator_suspend and regulator_resume functions are
      assigned to every regulator device registered in the system, so there is no
      need to iterate over all again in them. Replace class_for_each_device()
      construction with direct operation on the rdev embedded in the given
      regulator device. This saves a lots of useless operations in suspend and
      resume paths.
      
      Fixes: f7efad10: regulator: add PM suspend and resume hooks
      Signed-off-by: NMarek Szyprowski <m.szyprowski@samsung.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      cd7e36ab
    • M
      regulator: Fix 'do-nothing' value for regulators without suspend state · 3edd79cf
      Marek Szyprowski 提交于
      Some regulators don't have all states defined and in such cases regulator
      core should not assume anything. However in current implementation
      of of_get_regulation_constraints() DO_NOTHING_IN_SUSPEND enable value was
      set only for regulators which had suspend node defined, otherwise the
      default 0 value was used, what means DISABLE_IN_SUSPEND. This lead to
      broken system suspend/resume on boards, which had simple regulator
      constraints definition (without suspend state nodes).
      
      To avoid further mismatches between the default and uninitialized values
      of the suspend enabled/disabled states, change the values of the them,
      so default '0' means DO_NOTHING_IN_SUSPEND.
      
      Fixes: 72069f99: regulator: leave one item to record whether regulator is enabled
      Signed-off-by: NMarek Szyprowski <m.szyprowski@samsung.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      Cc: stable@vger.kernel.org
      3edd79cf
  8. 29 8月, 2018 3 次提交
  9. 06 7月, 2018 2 次提交
  10. 30 5月, 2018 1 次提交
  11. 17 5月, 2018 5 次提交
    • M
      regulator: core: Change voltage setting path · 456e7cdf
      Maciej Purski 提交于
      On Odroid XU3/4 and other Exynos5422 based boards there is a case, that
      different devices on the board are supplied by different regulators
      with non-fixed voltages. If one of these devices temporarily requires
      higher voltage, there might occur a situation that the spread between
      two devices' voltages is so high, that there is a risk of changing
      'high' and 'low' states on the interconnection between devices powered
      by those regulators.
      
      Uncoupled regulators should be a special case of coupled regulators, so
      they should share a common voltage setting path. When enabling,
      disabling or setting voltage of a coupled regulator, all coupled
      regulators should be locked. Regulator's supplies should be locked, when
      setting voltage of a single regulator. Enabling a coupled regulator or
      setting its voltage should not be possible if some of its coupled
      regulators, has not been registered.
      
      Add function for locking coupled regulators and supplies. Extract
      a new function regulator_set_voltage_rdev() from
      regulator_set_voltage_unlocked(), which is called when setting
      voltage of a single regulator.
      Signed-off-by: NMaciej Purski <m.purski@samsung.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      456e7cdf
    • M
      regulator: core: Add voltage balancing mechanism · 69686176
      Maciej Purski 提交于
      On Odroid XU3/4 and other Exynos5422 based boards there is a case, that
      different devices on the board are supplied by different regulators
      with non-fixed voltages. If one of these devices temporarily requires
      higher voltage, there might occur a situation that the spread between
      two devices' voltages is so high, that there is a risk of changing
      'high' and 'low' states on the interconnection between devices powered
      by those regulators.
      
      Introduce new function regulator_balance_voltage(), which
      keeps max_spread constraint fulfilled between a group of coupled
      regulators. It should be called if a regulator changes its
      voltage or after disabling or enabling. Disabled regulators should
      follow changes of the enabled ones, but their consumers' demands
      shouldn't be taken into account while calculating voltage of other
      coupled regulators.
      
      Find voltages, which are closest to suiting all the consumers' demands,
      while fulfilling max_spread constraint, keeping the following rules:
      - if one regulator is about to rise its voltage, rise others
        voltages in order to keep the max_spread
      - if a regulator, which has caused rising other regulators, is
        lowered, lower other regulators if possible
      - if one regulator is about to lower its voltage, but it hasn't caused
        rising other regulators, don't change its voltage if it breaks the
        max_spread
      
      Change regulators' voltages step by step, keeping max_spread constraint
      fulfilled all the time. Function regulator_get_optimal_voltage()
      should find the best possible change for the regulator, which doesn't
      break max_spread constraint. In function regulator_balance_voltage()
      optimize number of steps by finding highest voltage difference on
      each iteration.
      
      If a regulator, which is about to change its voltage, is not coupled,
      method regulator_get_optimal_voltage() should simply return the lowest
      voltage fulfilling consumers' demands.
      
      Coupling should be checked only if the system is in PM_SUSPEND_ON state.
      Signed-off-by: NMaciej Purski <m.purski@samsung.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      69686176
    • M
      regulator: core: Resolve coupled regulators · d3d64537
      Maciej Purski 提交于
      On Odroid XU3/4 and other Exynos5422 based boards there is a case, that
      different devices on the board are supplied by different regulators
      with non-fixed voltages. If one of these devices temporarily requires
      higher voltage, there might occur a situation that the spread between
      two devices' voltages is so high, that there is a risk of changing
      'high' and 'low' states on the interconnection between devices powered
      by those regulators.
      
      Fill coupling descriptor with data obtained from DTS using previously
      defined of_functions. Fail to register a regulator, if some data
      inconsistency occurs. If some coupled regulators are not yet registered,
      don't fail to register, but try to resolve them in late init call.
      Signed-off-by: NMaciej Purski <m.purski@samsung.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      d3d64537
    • M
      regulator: core: Make locks re-entrant · 66cf9a7e
      Maciej Purski 提交于
      Setting voltage, enabling/disabling regulators requires operations on
      all regulators related with the regulator being changed. Therefore,
      all of them should be locked for the whole operation. With the current
      locking implementation, adding additional dependency (regulators
      coupling) causes deadlocks in some cases.
      
      Introduce a possibility to attempt to lock a mutex multiple times
      by the same task without waiting on a mutex. This should handle all
      reasonable coupling-supplying combinations, especially when two coupled
      regulators share common supplies. The only situation that should be
      forbidden is simultaneous coupling and supplying between a pair of
      regulators.
      
      The idea is based on clk core.
      Signed-off-by: NMaciej Purski <m.purski@samsung.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      66cf9a7e
    • D
      regulator: core: Allow for regulators that can't be read at bootup · 84b3a7c9
      Douglas Anderson 提交于
      Regulators attached via RPMh on Qualcomm sdm845 apparently are
      write-only.  Specifically you can send a request for a certain voltage
      but you can't read back to see what voltage you've requested.  What
      this means is that at bootup we have absolutely no idea what voltage
      we could be at.
      
      As discussed in the patches to try to support the RPMh regulators [1],
      the fact that regulators are write-only means that its driver's
      get_voltage_sel() should return an error code if it's called before
      any calls to set_voltage_sel().  This causes problems in
      machine_constraints_voltage() when trying to apply the constraints.
      
      A proposed fix was to come up with an error code that could be
      returned by get_voltage_sel() which would cause the regulator
      framework to simply try setting the voltage with the current
      constraints.
      
      In this patch I propose the error code -ENOTRECOVERABLE.  In errno.h
      this error is described as "State not recoverable".  Though the error
      code was originally intended "for robust mutexes", the description of
      the error code seems to apply here because we can't read the state of
      the regulator.  Also note that the only existing user of this error
      code in the regulator framework is tps65090-regulator.c which returns
      this error code from the enable() call (not get_voltage() or
      get_voltage_sel()), so there should be no existing regulators that
      might accidentally get the new behavior.  (Side note is that tps65090
      seems to interpret this error code to mean an error that you can't
      recover from rather than some data that can't be recovered).
      
      [1] https://patchwork.kernel.org/patch/10340897/Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      84b3a7c9
  12. 22 3月, 2018 1 次提交
  13. 20 2月, 2018 1 次提交
    • G
      regulator: Fix resume from suspend to idle · 35b5f14e
      Geert Uytterhoeven 提交于
      When resuming from idle with the new suspend mode configuration support
      we go through the resume callbacks with a state of PM_SUSPEND_TO_IDLE
      which we don't have regulator constraints for, causing an error:
      
          dpm_run_callback(): regulator_resume_early+0x0/0x64 returns -22
          PM: Device regulator.0 failed to resume early: error -22
      
      Avoid this and similar errors by treating missing constraints as a noop.
      
      See also commit 57a0dd18 ("regulator: Fix suspend to idle"),
      which fixed the suspend part.
      Signed-off-by: NGeert Uytterhoeven <geert+renesas@glider.be>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      35b5f14e
  14. 17 2月, 2018 1 次提交
    • L
      regulator: core: Support passing an initialized GPIO enable descriptor · e45e290a
      Linus Walleij 提交于
      We are currently passing a GPIO number from the global GPIO numberspace
      into the regulator core for handling enable GPIOs. This is not good
      since it ties into the global GPIO numberspace and uses gpio_to_desc()
      to overcome this.
      
      Start supporting passing an already initialized GPIO descriptor to the
      core instead: leaf drivers pick their descriptors, associated directly
      with the device node (or from ACPI or from a board descriptor table)
      and use that directly without any roundtrip over the global GPIO
      numberspace.
      
      This looks messy since it adds a bunch of extra code in the core, but
      at the end of the patch series we will delete the handling of the GPIO
      number and only deal with descriptors so things end up neat.
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      e45e290a
  15. 30 1月, 2018 1 次提交
  16. 27 1月, 2018 1 次提交
  17. 26 1月, 2018 6 次提交
  18. 07 12月, 2017 1 次提交
  19. 20 7月, 2017 1 次提交
    • T
      regulator: core: fix a possible race in disable_work handling · c9ccaa0c
      Tirupathi Reddy 提交于
      A race condition between queueing and processing the disable_work
      instances results in having a work instance in the queue and the
      deferred_disables variable of regulator device structure having a
      value '0'. If no new regulator_disable_deferred() call later from
      clients, the deferred_disables variable value remains '0' and hits
      BUG() in regulator_disable_work() when the queued instance scheduled
      for processing the work.
      
      The race occurs as below:
      
      	Core-0					     Core-1
      	.....	       /* deferred_disables = 2 */   .....
      	.....	       /* disable_work is queued */  .....
      	.....					     .....
      regulator_disable_deferred: 		regulator_disable_work:
         mutex_lock(&rdev->mutex);			     .....
         rdev->deferred_disables++;		             .....
         mutex_unlock(&rdev->mutex);			     .....
         queue_delayed_work(...)		    mutex_lock(&rdev->mutex);
      	.....				    count =rdev->deferred_disables;
      	.....				    rdev->deferred_disables = 0;
      	.....					     .....
      	.....				    mutex_unlock(&rdev->mutex);
      	.....					     .....
      	.....				    return;
      	.....					     .....
      	/* No new regulator_disable_deferred() calls from clients */
      	/* The newly queued instance is scheduled for processing */
      	.....					     .....
      regulator_disable_work:
      	.....
         mutex_lock(&rdev->mutex);
         BUG_ON(!rdev->deferred_disables); /* deferred_disables = 0 */
      
      The race is fixed by removing the work instance that is queued while
      processing the previous queued instance. Cancel the newly queued instance
      from disable_work() handler just after reset the deferred_disables variable
      to value '0'. Also move the work queueing step before mutex_unlock in
      regulator_disable_deferred().
      
      Also use mod_delayed_work() in the pace of queue_delayed_work() as
      queue_delayed_work() always uses the delay requested in the first call
      when multiple consumers call regulator_disable_deferred() close in time
      and does not guarantee the semantics of regulator_disable_deferred().
      Signed-off-by: NTirupathi Reddy <tirupath@codeaurora.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      c9ccaa0c
  20. 19 7月, 2017 1 次提交
  21. 30 6月, 2017 1 次提交