1. 05 8月, 2019 1 次提交
  2. 05 7月, 2019 1 次提交
  3. 25 6月, 2019 2 次提交
  4. 19 6月, 2019 1 次提交
  5. 15 6月, 2019 1 次提交
  6. 31 5月, 2019 1 次提交
  7. 08 5月, 2019 1 次提交
  8. 03 5月, 2019 1 次提交
  9. 26 4月, 2019 2 次提交
  10. 05 4月, 2019 1 次提交
    • C
      regulator: core: Avoid potential deadlock on regulator_unregister · 06377301
      Charles Keepax 提交于
      Lockdep reports the following issue on my setup:
      
      Possible unsafe locking scenario:
      
      CPU0                    CPU1
      ----                    ----
      lock((work_completion)(&(&rdev->disable_work)->work));
                              lock(regulator_list_mutex);
                              lock((work_completion)(&(&rdev->disable_work)->work));
      lock(regulator_list_mutex);
      
      The problem is that regulator_unregister takes the
      regulator_list_mutex and then calls flush_work on disable_work. But
      regulator_disable_work calls regulator_lock_dependent which will
      also take the regulator_list_mutex. Resulting in a deadlock if the
      flush_work call actually needs to flush the work.
      
      Fix this issue by moving the flush_work outside of the
      regulator_list_mutex. The list mutex is not used to guard the point at
      which the delayed work is queued, so its use adds no additional safety.
      
      Fixes: f8702f9e ("regulator: core: Use ww_mutex for regulators locking")
      Signed-off-by: NCharles Keepax <ckeepax@opensource.cirrus.com>
      Reviewed-by: NDmitry Osipenko <digetx@gmail.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      06377301
  11. 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
  12. 18 3月, 2019 1 次提交
    • M
      regulator: core: Fix application of "drop lockdep annotation in drms_uA_update()" · a48f1275
      Mark Brown 提交于
      [The original commit was sent against -next but needed to be sent as a
      bugfix, however -next had some additional changes which needed to be
      reverted.  Now everything is all in one branch applying the rest of the
      changes to fix up the merge issue -- broonie]
      
      commit e5e21f70 ("regulator: core: Take lock before applying system
      load") took the regulator lock before calling drms_uA_update() in order
      to silence a lockdep warning during regulator_register().
      
      However, we are not supposed to need locks at this point as the regulator
      is in the process of being registered, so there should be no possibility
      of concurrent access.
      
      Instead, remove the unnecessary locking and simply drop the lockdep
      annotation, since it is no longer valid.
      
      Fixes: e5e21f70 ("regulator: core: Take lock before applying system load")
      Signed-off-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      a48f1275
  13. 22 2月, 2019 1 次提交
  14. 19 2月, 2019 2 次提交
  15. 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
  16. 08 2月, 2019 1 次提交
  17. 07 2月, 2019 1 次提交
  18. 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
  19. 10 1月, 2019 1 次提交
  20. 08 1月, 2019 1 次提交
  21. 20 12月, 2018 1 次提交
  22. 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
  23. 11 12月, 2018 1 次提交
  24. 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
  25. 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
  26. 21 11月, 2018 2 次提交
  27. 20 11月, 2018 1 次提交
  28. 19 11月, 2018 3 次提交
  29. 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
  30. 09 11月, 2018 2 次提交
  31. 08 11月, 2018 1 次提交