1
linux/drivers/regulator
Stephen Boyd d92d95b6bf regulator: Fix recursive mutex lockdep warning
A recursive lockdep warning occurs if you call
regulator_set_optimum_mode() on a regulator with a supply because
there is no nesting annotation for the rdev->mutex. To avoid this
warning, get the supply's load before locking the regulator's
mutex to avoid grabbing the same class of lock twice.

=============================================
[ INFO: possible recursive locking detected ]
3.4.0 #3257 Tainted: G        W
---------------------------------------------
swapper/0/1 is trying to acquire lock:
 (&rdev->mutex){+.+.+.}, at: [<c036e9e0>] regulator_get_voltage+0x18/0x38

but task is already holding lock:
 (&rdev->mutex){+.+.+.}, at: [<c036ef38>] regulator_set_optimum_mode+0x24/0x224

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(&rdev->mutex);
  lock(&rdev->mutex);

 *** DEADLOCK ***

 May be due to missing lock nesting notation

3 locks held by swapper/0/1:
 #0:  (&__lockdep_no_validate__){......}, at: [<c03dbb48>] __driver_attach+0x40/0x8c
 #1:  (&__lockdep_no_validate__){......}, at: [<c03dbb58>] __driver_attach+0x50/0x8c
 #2:  (&rdev->mutex){+.+.+.}, at: [<c036ef38>] regulator_set_optimum_mode+0x24/0x224

stack backtrace:
[<c001521c>] (unwind_backtrace+0x0/0x12c) from [<c00cc4d4>] (validate_chain+0x760/0x1080)
[<c00cc4d4>] (validate_chain+0x760/0x1080) from [<c00cd744>] (__lock_acquire+0x950/0xa10)
[<c00cd744>] (__lock_acquire+0x950/0xa10) from [<c00cd990>] (lock_acquire+0x18c/0x1e8)
[<c00cd990>] (lock_acquire+0x18c/0x1e8) from [<c080c248>] (mutex_lock_nested+0x68/0x3c4)
[<c080c248>] (mutex_lock_nested+0x68/0x3c4) from [<c036e9e0>] (regulator_get_voltage+0x18/0x38)
[<c036e9e0>] (regulator_get_voltage+0x18/0x38) from [<c036efb8>] (regulator_set_optimum_mode+0xa4/0x224)
...

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
2012-07-03 20:25:58 +01:00
..
88pm8607.c regulator: 88pm8607: Use regulator_get_voltage_sel_regmap() 2012-05-04 13:32:06 +01:00
aat2870-regulator.c regulator: Remove unneeded include of linux/delay.h from regulator drivers 2012-04-23 13:20:26 +01:00
ab3100.c regulator: ab3100: Use regulator_map_voltage_iterate() 2012-05-18 08:39:57 +01:00
ab8500.c regulator: Change ab8500 match names to reflect Device Tree 2012-06-17 18:27:47 +01:00
ad5398.c regulator: core: Use a struct to pass in regulator runtime configuration 2012-04-09 12:37:09 +01:00
anatop-regulator.c regulator: anatop: Use correct __devexit_p annotation 2012-06-04 10:42:49 +01:00
core.c regulator: Fix recursive mutex lockdep warning 2012-07-03 20:25:58 +01:00
da903x.c regulator: da903x: Kill da903x_[get|set]_[ldo12|ldo14]_voltage_sel() functions 2012-05-15 18:32:57 +01:00
da9052-regulator.c regulator: da9052: Convert to set_voltage_sel and map_voltage 2012-05-16 09:48:57 +01:00
db8500-prcmu.c regulator: Change db8500-prcmu match names to reflect Device Tree 2012-06-17 18:27:49 +01:00
dbx500-prcmu.c regulators/db8500: split off shared dbx500 code 2012-01-20 12:01:29 +00:00
dbx500-prcmu.h regulators/db8500: split off shared dbx500 code 2012-01-20 12:01:29 +00:00
dummy.c regulator: dummy: Specify a struct device 2012-05-10 10:48:28 +01:00
dummy.h
fixed-helper.c regulator: Remove non-existent parameter from fixed-helper.c kernel doc 2012-03-31 19:41:20 +01:00
fixed.c regulator: fixed: add property for gpio open drain flag 2012-05-07 12:31:05 +01:00
gpio-regulator.c regulator: gpio-regulator: populate selector from set_voltage 2012-06-04 10:44:30 +01:00
isl6271a-regulator.c regulator: isl6271a: Convert to set_voltage_sel and regulator_map_voltage_linear 2012-05-16 09:46:58 +01:00
Kconfig regulator: regulator for Palmas Kconfig 2012-05-19 12:45:25 +01:00
lp3971.c regulator: core: Use a struct to pass in regulator runtime configuration 2012-04-09 12:37:09 +01:00
lp3972.c regulator: core: Use a struct to pass in regulator runtime configuration 2012-04-09 12:37:09 +01:00
Makefile regulator: regulator for Palmas Kconfig 2012-05-19 12:45:25 +01:00
max1586.c regulator: max1586: Use devm_kzalloc() 2012-04-13 09:59:39 +01:00
max8649.c regulator: max8649: fix missing regmap in rdev 2012-06-05 11:15:22 +01:00
max8660.c regulator: max8660: Convert to set_voltage_sel and regulator_map_voltage_linear 2012-05-15 18:35:42 +01:00
max8925-regulator.c regulator: max8925: Remove check_range function and max_uV from struct rc5t583_regulator_info 2012-05-17 23:00:56 +01:00
max8952.c regulator: max8952: Use devm_kzalloc 2012-05-16 09:48:37 +01:00
max8997.c regulator updates for 3.5 2012-05-21 16:49:16 -07:00
max8998.c regulator: max8998: Convert ot use devm_kzalloc 2012-04-23 13:20:27 +01:00
mc13xxx-regulator-core.c regulator: Convert mc13xxx regulator drivers to set_voltage_sel 2012-04-02 23:24:46 +01:00
mc13xxx.h regulator: Convert mc13xxx regulator drivers to set_voltage_sel 2012-04-02 23:24:46 +01:00
mc13783-regulator.c regulator: Fix build error for mc13783 and mc13892 2012-04-10 09:52:53 +01:00
mc13892-regulator.c Linux 3.4-rc2 2012-04-10 09:52:59 +01:00
of_regulator.c regulator: Add generic DT parsing for regulators 2012-05-04 13:25:15 +01:00
palmas-regulator.c regulator: palmas: fix regmap offsets for enable/disable 2012-06-23 11:37:28 +01:00
pcap-regulator.c regulator: core: Use a struct to pass in regulator runtime configuration 2012-04-09 12:37:09 +01:00
pcf50633-regulator.c regulator: pcf50633: Use regulator_get_voltage_sel_regmap() 2012-04-23 13:19:51 +01:00
rc5t583-regulator.c regulator: rc5t583: Remove max_uV from struct rc5t583_regulator_info 2012-05-17 23:00:55 +01:00
s5m8767.c regulator: Fix the s5m8767a problem of the division by null 2012-06-17 18:27:20 +01:00
tps6105x-regulator.c regulator: core: Use a struct to pass in regulator runtime configuration 2012-04-09 12:37:09 +01:00
tps6507x-regulator.c regulator: Remove unneeded include of linux/delay.h from regulator drivers 2012-04-23 13:20:26 +01:00
tps6524x-regulator.c regulator: tps6524x: Fix get_voltage_sel for fixed voltage 2012-06-20 11:20:24 +01:00
tps6586x-regulator.c tps6586x: Add device tree support 2012-05-04 13:25:16 +01:00
tps62360-regulator.c regulator: tps62360: dt: initialize of_node param for regulator register. 2012-05-20 18:22:41 +01:00
tps65023-regulator.c regulator: tps65023: Fix mask for LDOs output voltage select control 2012-06-17 20:56:54 +01:00
tps65090-regulator.c Merge remote-tracking branch 'regulator/topic/drivers' into regulator-next 2012-05-12 11:10:25 +01:00
tps65217-regulator.c regulator: tps65217: Convert to set_voltage_sel and map_voltage 2012-05-18 08:38:32 +01:00
tps65910-regulator.c MFD changes for 3.5 2012-05-29 11:53:11 -07:00
tps65912-regulator.c regulator: tps65912: Convert to get_voltage_sel 2012-04-23 13:20:27 +01:00
twl-regulator.c regulator: twl-regulator: make TWL4030_ALLOW_UNSUPPORTED more configurable. 2012-05-09 10:04:33 +01:00
userspace-consumer.c regulator: userspace-consumer: Convert to use devm_* APIs 2012-04-18 10:26:24 +01:00
virtual.c regulator: virtual: Replace strict_strtol with kstrtol 2012-04-19 13:48:34 +01:00
wm831x-dcdc.c MFD changes for 3.5 2012-05-29 11:53:11 -07:00
wm831x-isink.c MFD changes for 3.5 2012-05-29 11:53:11 -07:00
wm831x-ldo.c MFD changes for 3.5 2012-05-29 11:53:11 -07:00
wm8350-regulator.c Linux 3.4-rc2 2012-04-10 09:52:59 +01:00
wm8400-regulator.c regulator: wm8400: Modernise driver 2012-05-12 11:11:48 +01:00
wm8994-regulator.c regulator: wm8994: Allow registration with no platform data 2012-05-14 15:25:33 +01:00