1. 22 4月, 2016 2 次提交
    • J
      regulator: core: Clear the supply pointer if enabling fails · 8e5356a7
      Jon Hunter 提交于
      During the resolution of a regulator's supply, we may attempt to enable
      the supply if the regulator itself is already enabled. If enabling the
      supply fails, then we will call _regulator_put() for the supply.
      However, the pointer to the supply has not been cleared for the
      regulator and this will cause a crash if we then unregister the
      regulator and attempt to call regulator_put() a second time for the
      supply. Fix this by clearing the supply pointer if enabling the supply
      after fails when resolving the supply for a regulator.
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      8e5356a7
    • J
      regulator: core: Don't terminate supply resolution early · 7ddede6a
      Jon Hunter 提交于
      The function regulator_register_resolve_supply() is called from the
      context of class_for_each_dev() (during the regulator registration) to
      resolve any supplies added. regulator_register_resolve_supply() will
      return an error if a regulator's supply cannot be resolved and this will
      terminate the loop in class_for_each_dev(). This means that we will not
      attempt to resolve any other supplies after one has failed. Hence, this
      may delay the resolution of other regulator supplies until the failing
      one itself can be resolved.
      
      Rather than terminating the loop early, don't return an error code and
      keep attempting to resolve any other supplies for regulators that have
      been registered.
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      7ddede6a
  2. 13 4月, 2016 1 次提交
  3. 31 3月, 2016 1 次提交
    • J
      regulator: Fix deadlock during regulator registration · a2151374
      Jon Hunter 提交于
      Commit 5e3ca2b3 ("regulator: Try to resolve regulators supplies on
      registration") added a call to regulator_resolve_supply() within
      regulator_register() where the regulator_list_mutex is held. This causes
      a deadlock to occur on the Tegra114 Dalmore board when the palmas PMIC
      is registered because regulator_register_resolve_supply() calls
      regulator_dev_lookup() which may try to acquire the regulator_list_mutex
      again.
      
      Fix this by releasing the mutex before calling
      regulator_register_resolve_supply() and update the error exit path to
      ensure the mutex is released on an error.
      
      [Made commit message more legible -- broonie]
      Signed-off-by: NJon Hunter <jonathanh@nvidia.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      a2151374
  4. 28 3月, 2016 1 次提交
    • J
      regulator: Try to resolve regulators supplies on registration · 5e3ca2b3
      Javier Martinez Canillas 提交于
      Commit 6261b06d ("regulator: Defer lookup of supply to regulator_get")
      moved the regulator supplies lookup logic from the regulators registration
      to the regulators get time.
      
      Unfortunately, that changed the behavior of the regulator core since now a
      parent supply with a child regulator marked as always-on, won't be enabled
      unless a client driver attempts to get the child regulator during boot.
      
      This patch tries to resolve the parent supply for the already registered
      regulators each time that a new regulator is registered. So the regulators
      that have child regulators marked as always on will be enabled regardless
      if a driver gets the child regulator or not.
      
      That was the behavior before the mentioned commit, since parent supplies
      were looked up at regulator registration time instead of during child get.
      
      Since regulator_resolve_supply() checks for rdev->supply, most of the times
      it will be a no-op. Errors aren't checked to keep the possible out of order
      dependencies which was the motivation for the mentioned commit.
      
      Also, the supply being available will be enforced on regulator get anyways
      in case the resolve fails on regulators registration.
      
      Fixes: 6261b06d ("regulator: Defer lookup of supply to regulator_get")
      Suggested-by: NMark Brown <broonie@kernel.org>
      Signed-off-by: NJavier Martinez Canillas <javier@osg.samsung.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      Cc: <stable@vger.kernel.org> # 4.1+
      5e3ca2b3
  5. 12 3月, 2016 3 次提交
  6. 08 3月, 2016 1 次提交
  7. 07 3月, 2016 1 次提交
  8. 02 3月, 2016 4 次提交
  9. 29 2月, 2016 3 次提交
  10. 26 2月, 2016 3 次提交
  11. 25 2月, 2016 1 次提交
    • K
      regulator: core: fix crash in error path of regulator_register · 32165230
      Krzysztof Adamski 提交于
      This problem was introduced by:
      commit daad134d ("regulator: core: Request GPIO before creating
      sysfs entries")
      
      The error path was not updated correctly after moving GPIO registration
      code and in case regulator_ena_gpio_free failed, device_unregister() was
      called even though device_register() was not yet called.
      
      This problem breaks the boot at least on all Tegra 32-bit devices. It
      will also crash each device that specifices GPIO that is unavaiable at
      regulator_register call. Here's error log I've got when forced GPIO to
      be invalid:
      
      [    1.116612] usb-otg-vbus-reg: Failed to request enable GPIO10: -22
      [    1.122794] Unable to handle kernel NULL pointer dereference at
      virtual address 00000044
      [    1.130894] pgd = c0004000
      [    1.133598] [00000044] *pgd=00000000
      [    1.137205] Internal error: Oops: 5 [#1] SMP ARM
      
      and here's backtrace from KDB:
      
      Exception stack(0xef11fbd0 to 0xef11fc18)
      fbc0:                                     00000000 c0738a14 00000000 00000000
      fbe0: c0b2a0b0 00000000 00000000 c0738a14 c0b5fdf8 00000001 ef7f6074 ef11fc4c
      fc00: ef11fc50 ef11fc20 c02a8344 c02a7f1c 60000013 ffffffff
      [<c010cee0>] (__dabt_svc) from [<c02a7f1c>] (kernfs_find_ns+0x18/0xf8)
      [<c02a7f1c>] (kernfs_find_ns) from [<c02a8344>] (kernfs_find_and_get_ns+0x40/0x58)
      [<c02a8344>] (kernfs_find_and_get_ns) from [<c02ac4a4>] (sysfs_unmerge_group+0x28/0x68)
      [<c02ac4a4>] (sysfs_unmerge_group) from [<c044389c>] (dpm_sysfs_remove+0x30/0x5c)
      [<c044389c>] (dpm_sysfs_remove) from [<c0436ba8>] (device_del+0x48/0x1f4)
      [<c0436ba8>] (device_del) from [<c0436d84>] (device_unregister+0x30/0x6c)
      [<c0436d84>] (device_unregister) from [<c0403910>] (regulator_register+0x6d0/0xdac)
      [<c0403910>] (regulator_register) from [<c04052d4>] (devm_regulator_register+0x50/0x84)
      [<c04052d4>] (devm_regulator_register) from [<c0406298>] (reg_fixed_voltage_probe+0x25c/0x3c0)
      [<c0406298>] (reg_fixed_voltage_probe) from [<c043d21c>] (platform_drv_probe+0x60/0xb0)
      [<c043d21c>] (platform_drv_probe) from [<c043b078>] (driver_probe_device+0x24c/0x440)
      [<c043b078>] (driver_probe_device) from [<c043b5e8>] (__device_attach_driver+0xc0/0x120)
      [<c043b5e8>] (__device_attach_driver) from [<c043901c>] (bus_for_each_drv+0x6c/0x98)
      [<c043901c>] (bus_for_each_drv) from [<c043ad20>] (__device_attach+0xac/0x138)
      [<c043ad20>] (__device_attach) from [<c043b664>] (device_initial_probe+0x1c/0x20)
      [<c043b664>] (device_initial_probe) from [<c043a074>] (bus_probe_device+0x94/0x9c)
      [<c043a074>] (bus_probe_device) from [<c043a610>] (deferred_probe_work_func+0x80/0xcc)
      [<c043a610>] (deferred_probe_work_func) from [<c01381d0>] (process_one_work+0x158/0x454)
      [<c01381d0>] (process_one_work) from [<c013854c>] (worker_thread+0x38/0x510)
      [<c013854c>] (worker_thread) from [<c013e154>] (kthread+0xe8/0x104)
      [<c013e154>] (kthread) from [<c0108638>] (ret_from_fork+0x14/0x3c)
      Signed-off-by: NKrzysztof Adamski <krzysztof.adamski@tieto.com>
      Reported-by: NJon Hunter <jonathanh@nvidia.com>
      Acked-by: NJon Hunter <jonathanh@nvidia.com>
      Tested-by: NJon Hunter <jonathanh@nvidia.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      32165230
  12. 22 2月, 2016 1 次提交
    • K
      regulator: core: Request GPIO before creating sysfs entries · daad134d
      Krzysztof Adamski 提交于
      regulator_attr_is_visible (which is a .is_visible callback of
      regulator_dev_group attribute_grpup) checks rdev->ena_pin to decide if
      "status" file should be present in sysfs. This field is set at the end
      of regulator_ena_gpio_request so it has to be called before
      device_register() otherwise this test will always fail, causing "status"
      file to not be visible.
      
      Since regulator_attr_is_visible also tests for is_enabled() op, this
      problem is only visible for regulators that does not define this
      callback, like regulator-fixed.c.
      Signed-off-by: NKrzysztof Adamski <krzysztof.adamski@tieto.com>
      Signed-off-by: NMark Brown <broonie@kernel.org>
      daad134d
  13. 21 2月, 2016 1 次提交
  14. 20 2月, 2016 3 次提交
  15. 18 2月, 2016 1 次提交
  16. 17 2月, 2016 1 次提交
    • A
      regulator: s5m8767: fix get_register() error handling · e07ff943
      Arnd Bergmann 提交于
      The s5m8767_pmic_probe() function calls s5m8767_get_register() to
      read data without checking the return code, which produces a compile-time
      warning when that data is accessed:
      
      drivers/regulator/s5m8767.c: In function 's5m8767_pmic_probe':
      drivers/regulator/s5m8767.c:924:7: error: 'enable_reg' may be used uninitialized in this function [-Werror=maybe-uninitialized]
      drivers/regulator/s5m8767.c:944:30: error: 'enable_val' may be used uninitialized in this function [-Werror=maybe-uninitialized]
      
      This changes the s5m8767_get_register() function to return a -EINVAL
      not just for an invalid register number but also for an invalid
      regulator number, as both would result in returning uninitialized
      data. The s5m8767_pmic_probe() function is then changed accordingly
      to fail on a read error, as all the other callers of s5m8767_get_register()
      already do.
      
      In practice this probably cannot happen, as we don't call
      s5m8767_get_register() with invalid arguments, but the gcc
      warning seems valid in principle, in terms writing safe
      error checking.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Fixes: 9c4c6055 ("regulator: s5m8767: Convert to use regulator_[enable|disable|is_enabled]_regmap")
      Signed-off-by: NMark Brown <broonie@kernel.org>
      e07ff943
  17. 16 2月, 2016 3 次提交
  18. 13 2月, 2016 1 次提交
  19. 12 2月, 2016 4 次提交
  20. 06 2月, 2016 3 次提交
  21. 04 2月, 2016 1 次提交