1. 19 3月, 2019 1 次提交
    • S
      regulator: core: fix error path for regulator_set_voltage_unlocked · 70b46491
      Steve Twiss 提交于
      During several error paths in the function
      regulator_set_voltage_unlocked() the value of 'ret' can take on negative
      error values. However, in calls that go through the 'goto out' statement,
      this return value is lost and return 0 is used instead, indicating a
      'pass'.
      
      There are several cases where this function should legitimately return a
      fail instead of a pass: one such case includes constraints check during
      voltage selection in the call to regulator_check_voltage(), which can
      have -EINVAL for the case when an unsupported voltage is incorrectly
      requested. In that case, -22 is expected as the return value, not 0.
      
      Fixes: 9243a195 ("regulator: core: Change voltage setting path")
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NSteve Twiss <stwiss.opensource@diasemi.com>
      Reviewed-by: NDmitry Osipenko <digetx@gmail.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      70b46491
  2. 22 2月, 2019 1 次提交
  3. 19 2月, 2019 2 次提交
  4. 16 2月, 2019 1 次提交
    • N
      regulator: core: Take lock before applying system load · e5e21f70
      Niklas Cassel 提交于
      Take the regulator lock before applying system load.
      
      Fixes the following lockdep splat:
      
      [    5.583581] WARNING: CPU: 1 PID: 16 at drivers/regulator/core.c:925 drms_uA_update+0x114/0x360
      [    5.588467] Modules linked in:
      [    5.596833] CPU: 1 PID: 16 Comm: kworker/1:0 Not tainted 5.0.0-rc6-next-20190213-00002-g0fce66ab480f #18
      [    5.599933] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT)
      [    5.609544] Workqueue: events qcom_channel_state_worker
      [    5.616209] pstate: 60000005 (nZCv daif -PAN -UAO)
      [    5.621152] pc : drms_uA_update+0x114/0x360
      [    5.626006] lr : drms_uA_update+0x110/0x360
      [    5.630084] sp : ffff0000124b3490
      [    5.634242] x29: ffff0000124b3490 x28: ffff800005326e00
      [    5.637735] x27: ffff0000124b35f8 x26: 000000000032bc48
      [    5.643117] x25: ffff800004c7e800 x24: ffff800004c6d500
      [    5.648411] x23: ffff800004c38a80 x22: 00000000000000d1
      [    5.653706] x21: 00000000001ab3f0 x20: ffff800004c7e800
      [    5.659001] x19: ffff0000114c3000 x18: ffffffffffffffff
      [    5.664297] x17: 0000000000000000 x16: 0000000000000000
      [    5.669592] x15: ffff0000114c3808 x14: 0720072007200720
      [    5.674888] x13: 00000000199c9b28 x12: ffff80002bcccc40
      [    5.680183] x11: ffff000012286000 x10: ffff0000114c3808
      [    5.685477] x9 : 0720072007200720 x8 : ffff000010e9e808
      [    5.690772] x7 : ffff0000106da568 x6 : 0000000000000000
      [    5.696067] x5 : 0000000000000000 x4 : 0000000000000000
      [    5.701362] x3 : 0000000000000004 x2 : 0000000000000000
      [    5.706658] x1 : 0000000000000000 x0 : 0000000000000000
      [    5.711952] Call trace:
      [    5.717223]  drms_uA_update+0x114/0x360
      [    5.719405]  regulator_register+0xb30/0x1140
      [    5.723230]  devm_regulator_register+0x4c/0xa8
      [    5.727745]  rpm_reg_probe+0xfc/0x1b0
      [    5.731992]  platform_drv_probe+0x50/0xa0
      [    5.735727]  really_probe+0x20c/0x2b8
      [    5.739718]  driver_probe_device+0x58/0x100
      [    5.743368]  __device_attach_driver+0x90/0xd0
      [    5.747363]  bus_for_each_drv+0x64/0xc8
      [    5.751870]  __device_attach+0xd8/0x138
      [    5.755516]  device_initial_probe+0x10/0x18
      [    5.759341]  bus_probe_device+0x98/0xa0
      [    5.763502]  device_add+0x3d0/0x640
      [    5.767319]  of_device_add+0x48/0x58
      [    5.770793]  of_platform_device_create_pdata+0xb0/0x128
      [    5.774629]  of_platform_bus_create+0x174/0x370
      [    5.779569]  of_platform_populate+0x78/0xe0
      [    5.784082]  qcom_smd_rpm_probe+0x80/0xa0
      [    5.788245]  rpmsg_dev_probe+0x114/0x1a0
      [    5.792411]  really_probe+0x20c/0x2b8
      [    5.796401]  driver_probe_device+0x58/0x100
      [    5.799964]  __device_attach_driver+0x90/0xd0
      [    5.803960]  bus_for_each_drv+0x64/0xc8
      [    5.808468]  __device_attach+0xd8/0x138
      [    5.812115]  device_initial_probe+0x10/0x18
      [    5.815936]  bus_probe_device+0x98/0xa0
      [    5.820099]  device_add+0x3d0/0x640
      [    5.823916]  device_register+0x1c/0x28
      [    5.827391]  rpmsg_register_device+0x4c/0x90
      [    5.831216]  qcom_channel_state_worker+0x170/0x298
      [    5.835651]  process_one_work+0x294/0x6e8
      [    5.840241]  worker_thread+0x40/0x450
      [    5.844318]  kthread+0x11c/0x120
      [    5.847961]  ret_from_fork+0x10/0x18
      [    5.851260] irq event stamp: 9090
      [    5.854820] hardirqs last  enabled at (9089): [<ffff000010160798>] console_unlock+0x3e0/0x5b0
      [    5.858086] hardirqs last disabled at (9090): [<ffff0000100817cc>] do_debug_exception+0x104/0x140
      [    5.866596] softirqs last  enabled at (9086): [<ffff000010082024>] __do_softirq+0x474/0x574
      [    5.875446] softirqs last disabled at (9079): [<ffff0000100f2254>] irq_exit+0x13c/0x148
      [    5.883598] ---[ end trace 6984ef7f081afa21 ]---
      
      Fixes: fa94e48e ("regulator: core: Apply system load even if no consumer loads")
      Signed-off-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      e5e21f70
  5. 08 2月, 2019 1 次提交
  6. 07 2月, 2019 1 次提交
  7. 06 2月, 2019 1 次提交
    • L
      regulator: fixed/gpio: Pull inversion/OD into gpiolib · 01dc79cd
      Linus Walleij 提交于
      This pushes the handling of inversion semantics and open drain
      settings to the GPIO descriptor and gpiolib. All affected board
      files are also augmented.
      
      This is especially nice since we don't have to have any
      confusing flags passed around to the left and right littering
      the fixed and GPIO regulator drivers and the regulator core.
      It is all just very straight-forward: the core asks the GPIO
      line to be asserted or deasserted and gpiolib deals with the
      rest depending on how the platform is configured: if the line
      is active low, it deals with that, if the line is open drain,
      it deals with that too.
      
      Cc: Alexander Shiyan <shc_work@mail.ru> # i.MX boards user
      Cc: Haojian Zhuang <haojian.zhuang@gmail.com> # MMP2 maintainer
      Cc: Aaro Koskinen <aaro.koskinen@iki.fi> # OMAP1 maintainer
      Cc: Tony Lindgren <tony@atomide.com> # OMAP1,2,3 maintainer
      Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> # EM-X270 maintainer
      Cc: Robert Jarzmik <robert.jarzmik@free.fr> # EZX maintainer
      Cc: Philipp Zabel <philipp.zabel@gmail.com> # Magician maintainer
      Cc: Petr Cvek <petr.cvek@tul.cz> # Magician
      Cc: Robert Jarzmik <robert.jarzmik@free.fr> # PXA
      Cc: Paul Parsons <lost.distance@yahoo.com> # hx4700
      Cc: Daniel Mack <zonque@gmail.com> # Raumfeld maintainer
      Cc: Marc Zyngier <marc.zyngier@arm.com> # Zeus maintainer
      Cc: Geert Uytterhoeven <geert+renesas@glider.be> # SuperH pinctrl/GPIO maintainer
      Cc: Russell King <rmk+kernel@armlinux.org.uk> # SA1100
      Tested-by: NMarek Szyprowski <m.szyprowski@samsung.com>
      Tested-by: Janusz Krzysztofik <jmkrzyszt@gmail.com> #OMAP1 Amstrad Delta
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      01dc79cd
  8. 10 1月, 2019 1 次提交
  9. 08 1月, 2019 1 次提交
  10. 20 12月, 2018 1 次提交
  11. 12 12月, 2018 1 次提交
    • D
      regulator: core: Clean enabling always-on regulators + their supplies · 05f224ca
      Douglas Anderson 提交于
      At the end of regulator_resolve_supply() we have historically turned
      on our supply in some cases.  This could be for one of two reasons:
      
      1. If resolving supplies was happening before the call to
         set_machine_constraints() we needed to predict if
         set_machine_constraints() was going to turn the regulator on and we
         needed to preemptively turn the supply on.
      2. Maybe set_machine_constraints() happened before we could resolve
         supplies (because we failed the first time to resolve) and thus we
         might need to propagate an enable that already happened up to our
         supply.
      
      Historically regulator_resolve_supply() used _regulator_is_enabled()
      to decide whether to turn on the supply.
      
      Let's change things a little bit.  Specifically:
      
      1. Let's try to enable the supply and the regulator in the same place,
         both in set_machine_constraints().  This means that we have exactly
         the same logic for enabling the supply and the regulator.
      2. Let's properly set use_count when we enable always-on or boot-on
         regulators even for those that don't have supplies.  The previous
         commit 1fc12b05 ("regulator: core: Avoid propagating to
         supplies when possible") only did this right for regulators with
         supplies.
      3. Let's make it clear that the only time we need to enable the supply
         in regulator_resolve_supply() is if the main regulator is currently
         in use.  By using use_count (like the rest of the code) to decide
         if we're going to enable our supply we keep everything consistent.
      
      Overall the new scheme should be cleaner and easier to reason about.
      In addition to fixing regulator_summary to be more correct (because of
      the more correct use_count), this change also has the effect of no
      longer using _regulator_is_enabled() in this code path.
      _regulator_is_enabled() could return an error code for some regulators
      at bootup (like RPMh) that can't read their initial state.  While one
      can argue that the design of those regulators is sub-optimal, the new
      logic sidesteps this brokenness.  This fix in particular fixes
      observed problems on Qualcomm sdm845 boards which use the
      above-mentioned RPMh regulator.  Those problems were made worse by
      commit 1fc12b05 ("regulator: core: Avoid propagating to supplies
      when possible") because now we'd think at bootup that the SD
      regulators were already enabled and we'd never try them again.
      
      Fixes: 1fc12b05 ("regulator: core: Avoid propagating to supplies when possible")
      Reported-by: NEvan Green <evgreen@chromium.org>
      Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      05f224ca
  12. 11 12月, 2018 1 次提交
  13. 27 11月, 2018 2 次提交
    • D
      regulator: core: Apply system load even if no consumer loads · fa94e48e
      Douglas Anderson 提交于
      Prior to commit 5451781d ("regulator: core: Only count load for
      enabled consumers") we used to always add up the total load on every
      enable in _regulator_enable().  After that commit we only updated the
      total load when enabling / disabling a regulator where a consumer
      specified a load or when changing the consumer load on an enabled
      regulator.
      
      The problem with the new scheme is that if there is a system load
      specified for a regulator but no consumers specify a load then we
      never account for it.
      
      Let's account for the system load in set_machine_constraints().
      
      NOTE: with the new scheme we end up with a bit of a quandry.  What if
      someone specifies _both_ an initial mode and a system load?  If we
      take the system load into account right at init time then it will
      effectively clobber the initial mode.  We'll resolve this by saying
      that if both are specified then the initial mode will win.  The system
      load will then only take effect if/when a consumer specifies a load.
      If no consumers ever specify a load then the initial mode will persist
      and the system load will have no effect.
      
      Fixes: 5451781d ("regulator: core: Only count load for enabled consumers")
      Reported-by: NBrian Masney <masneyb@onstation.org>
      Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Tested-by: NBrian Masney <masneyb@onstation.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      fa94e48e
    • O
      regulator: core: enable power when setting up constraints · 2bb16663
      Olliver Schinagl 提交于
      When a regulator is marked as always on, it is enabled early on, when
      checking and setting up constraints. It makes the assumption that the
      bootloader properly initialized the regulator, and just in case enables
      the regulator anyway.
      
      Some constraints however currently get missed, such as the soft-start
      and ramp-delay. This causes the regulator to be enabled, without the
      soft-start and ramp-delay being applied, which in turn can cause
      high-currents or other start-up problems.
      
      By moving the always-enabled constraints later in the constraints check,
      we can at least ensure all constraints for the regulator are followed.
      Signed-off-by: NOlliver Schinagl <oliver@schinagl.nl>
      Signed-off-by: NPriit Laes <plaes@plaes.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      2bb16663
  14. 22 11月, 2018 2 次提交
    • D
      regulator: core: Avoid propagating to supplies when possible · 1fc12b05
      Douglas Anderson 提交于
      When we called regulator_enable() on a regulator we'd end up
      propagating that call all the way up the chain every time.  This is a
      bit of a waste of time.  A child regulator already refcounts its own
      enables so it should avoid passing on to its parent unless the
      refcount transitioned between 0 and 1.
      
      Historically this hasn't been a huge problem since we skipped dealing
      with enable for always-on regulators.  In a previous patch, however,
      we removed the always-on optimization.  On one system, the debugfs
      regulator_summary was now showing a "use_count" of 33 for a top-level
      regulator.
      
      Let's implement this optimization.  This turns out to be fairly
      trivial with the recent reorganization of the regulator core.
      
      NOTE: as part of this patch I'll make "always-on" regulators start
      with a use count of 1.  This keeps the counts clean when recursively
      resolving regulators.
      
      ALSO NOTE: this commit also contains somewhat of a bug fix to
      regulator_force_disable().  It was incorrectly looping over
      "rdev->open_count" when it should have been looping over use_count.
      We have to touch that code anyway (since we should no longer loop at
      all), so we'll fix it together in one patch.  Also: since this comes
      after commit f8702f9e ("regulator: core: Use ww_mutex for
      regulators locking") we can now move to use _regulator_disable() for
      our supply and keep it in the lock.
      Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      1fc12b05
    • D
      regulator: core: Only count load for enabled consumers · 5451781d
      Douglas Anderson 提交于
      In general when the consumer of a regulator requests that the
      regulator be disabled it no longer will be drawing much load from the
      regulator--it should just be the leakage current and that should be
      very close to 0.
      
      Up to this point the regulator framework has continued to count a
      consumer's load request for disabled regulators.  This has led to code
      patterns that look like this:
      
        enable_my_thing():
          regular_set_load(reg, load_uA)
          regulator_enable(reg)
      
        disable_my_thing():
          regulator_disable(reg)
          regulator_set_load(reg, 0)
      
      Sometimes disable_my_thing() sets a nominal (<= 100 uA) load instead
      of setting a 0 uA load.  I will make the assertion that nearly all (if
      not all) places where we set a nominal load of 100 uA or less we end
      up with a result that is the same as if we had set a load of 0 uA.
      Specifically:
      - The whole point of setting the load is to help set the operating
        mode of the regulator.  Higher loads may need less efficient
        operating modes.
      - The only time this matters at all is if there is another consumer of
        the regulator that wants the regulator on.  If there are no other
        consumers of the regulator then the regulator will turn off and we
        don't care about the operating mode.
      - If there's another consumer that actually wants the regulator on
        then presumably it is requesting a load that makes our nominal
        <= 100 uA load insignificant.
      
      A quick survey of the existing callers to regulator_set_load() to see
      how everyone uses it:
      Signed-off-by: NDouglas Anderson <dianders@chromium.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      5451781d
  15. 21 11月, 2018 2 次提交
  16. 20 11月, 2018 1 次提交
  17. 19 11月, 2018 3 次提交
  18. 16 11月, 2018 1 次提交
    • dianlong_lee's avatar
      regulator/of_get_regulator: add child path to find the regulator supplier · fe06051d
      dianlong_lee 提交于
      when the VIR_LDO1 regulator supplier is it's brother,
      we can't find the supplier.
      
      example code :
      &vir_regulator {
      	ldo0_vir: ldo0-virtual {
      		regulator-compatible = "VIR_LDO0";
      		regulator-name= "VIR_LDO0";
      		regulator-min-microvolt = <1000000>;
      		regulator-max-microvolt = <2000000>;
      	};
      	ldo1_vir: ldo1-virtual {
      		regulator-compatible = "VIR_LDO1";
      		regulator-name= "VIR_LDO1";
      		regulator-min-microvolt = <1000000>;
      		regulator-max-microvolt = <3000000>;
      		ldo1-supply = <&ldo0_vir>;
      	};
      	...
      }
      
      so we add the child ptah to find the suppier.
      Signed-off-by: dianlong_lee's avatarzoro <long17.cool@163.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      fe06051d
  19. 09 11月, 2018 2 次提交
  20. 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
  21. 28 9月, 2018 1 次提交
  22. 21 9月, 2018 1 次提交
  23. 04 9月, 2018 1 次提交
  24. 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
  25. 29 8月, 2018 3 次提交
  26. 06 7月, 2018 2 次提交