linux-uconsole/drivers/regulator
Doug Anderson b94eb12be1 regulator: core: Fix enable GPIO reference counting
commit 29d62ec5f8 upstream.

Normally _regulator_do_enable() isn't called on an already-enabled
rdev.  That's because the main caller, _regulator_enable() always
calls _regulator_is_enabled() and only calls _regulator_do_enable() if
the rdev was not already enabled.

However, there is one caller of _regulator_do_enable() that doesn't
check: regulator_suspend_finish().  While we might want to make
regulator_suspend_finish() behave more like _regulator_enable(), it's
probably also a good idea to make _regulator_do_enable() robust if it
is called on an already enabled rdev.

At the moment, _regulator_do_enable() is _not_ robust for already
enabled rdevs if we're using an ena_pin.  Each time
_regulator_do_enable() is called for an rdev using an ena_pin the
reference count of the ena_pin is incremented even if the rdev was
already enabled.  This is not as intended because the ena_pin is for
something else: for keeping track of how many active rdevs there are
sharing the same ena_pin.

Here's how the reference counting works here:

* Each time _regulator_enable() is called we increment
  rdev->use_count, so _regulator_enable() calls need to be balanced
  with _regulator_disable() calls.

* There is no explicit reference counting in _regulator_do_enable()
  which is normally just a warapper around rdev->desc->ops->enable()
  with code for supporting delays.  It's not expected that the
  "ops->enable()" call do reference counting.

* Since regulator_ena_gpio_ctrl() does have reference counting
  (handling the sharing of the pin amongst multiple rdevs), we
  shouldn't call it if the current rdev is already enabled.

Note that as part of this we cleanup (remove) the initting of
ena_gpio_state in regulator_register().  In _regulator_do_enable(),
_regulator_do_disable() and _regulator_is_enabled() is is clear that
ena_gpio_state should be the state of whether this particular rdev has
requested the GPIO be enabled.  regulator_register() was initting it
as the actual state of the pin.

Fixes: 967cfb18c0 ("regulator: core: manage enable GPIO list")
Signed-off-by: Doug Anderson <dianders@chromium.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-03-26 15:00:59 +01:00
..
88pm8607.c regulator: 88pm8607: Use enable_is_inverted flag with regulator_enable_regmap and friends APIs 2013-03-05 17:56:40 +08:00
aat2870-regulator.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
ab3100.c regulator: ab3100: Fix regulator register error handling 2013-04-26 16:33:10 +01:00
ab8500-ext.c regulator: ab8500-ext: Remove enable() and disable() functions 2013-04-17 15:08:38 +01:00
ab8500.c regulator: ab8500: Get rid of voltage_shift field from struct ab8500_regulator_info 2013-04-18 18:26:35 +01:00
ad5398.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
anatop-regulator.c regulator: anatop: improve precision of delay time 2013-02-08 11:15:00 +00:00
arizona-ldo1.c regulator: arizona-ldo1: remove bypass functionality 2014-09-17 09:03:57 -07:00
arizona-micsupp.c regulator: arizona-micsupp: Enable bypass in default constraints 2013-01-13 21:31:02 +09:00
as3711-regulator.c regulator: as3711: Use a static of_regulator_match table for of_regulator_match 2013-04-17 14:41:07 +01:00
core.c regulator: core: Fix enable GPIO reference counting 2015-03-26 15:00:59 +01:00
da903x.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
da9052-regulator.c Merge remote-tracking branch 'regulator/topic/of' into regulator-next 2013-02-19 12:42:52 +00:00
da9055-regulator.c Merge remote-tracking branch 'regulator/topic/da9055' into regulator-next 2013-02-19 12:42:33 +00:00
db8500-prcmu.c regulator: db8500-prcmu - remove incorrect __exit markup 2013-03-01 06:04:44 +00:00
dbx500-prcmu.c regulator: dbx500: Make local symbol static 2013-05-08 13:42:30 +01:00
dbx500-prcmu.h regulator: dbx500-prcmu: Remove operating_point from struct dbx500_regulator_info 2013-04-02 23:05:28 +01:00
dummy.c regulator: remove use of __devinit 2012-11-20 10:31:26 +09:00
dummy.h
fan53555.c regulator: fan53555: Use PTR_RET function 2013-03-20 14:30:12 +01:00
fixed-helper.c regulator: extend the fixed dummy voltage regulator to accept voltage 2012-06-19 23:22:30 +01:00
fixed.c Drivers: regulator: remove __dev* attributes. 2013-01-03 15:57:04 -08:00
gpio-regulator.c regulator: gpio-regulator: Staticize of_get_gpio_regulator_config() 2013-01-29 00:44:17 +08:00
isl6271a-regulator.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
Kconfig Convert selectors of GENERIC_GPIO to GPIOLIB 2013-04-16 18:47:14 +09:00
lp872x.c regulator: lp872x: Use regulator_map_voltage_ascend 2013-04-25 11:50:23 +01:00
lp3971.c regulator: lp3971: Convert to use regulator_map_voltage_ascend 2013-04-23 11:39:27 +01:00
lp3972.c regulator: lp3972: Convert to use regulator_map_voltage_ascend 2013-04-23 11:39:33 +01:00
lp8755.c regulator: lp8755: Use LP8755_BUCK_MAX instead of magic number 2013-01-27 11:00:25 +08:00
lp8788-buck.c regulator: lp8788-buck: Use regulator_map_voltage_ascend 2013-04-25 11:50:23 +01:00
lp8788-ldo.c regulator: lp8788: Implement list_voltage for lp8788_ldo_voltage_fixed_ops 2013-04-03 18:46:29 +01:00
Makefile regulator: ab8500-ext: New driver to control external regulators 2013-03-29 17:49:07 +00:00
max1586.c Merge remote-tracking branch 'regulator/topic/max1586' into v3.9-rc8 2013-04-28 02:13:41 +01:00
max8649.c Merge remote-tracking branch 'regulator/topic/enable-invert' into v3.9-rc8 2013-04-28 02:13:37 +01:00
max8660.c regulator: Remove NULL test before calling regulator_unregister() 2013-04-28 02:11:19 +01:00
max8907-regulator.c regulator: Add missing of_node_put() 2013-01-30 18:50:27 +08:00
max8925-regulator.c regulator: max8925: Remove unused parameter from max8925_regulator_dt_init 2013-03-04 10:49:21 +08:00
max8952.c regulator: max8952: Add missing config.of_node setting for regulator register 2013-04-26 18:17:01 +01:00
max8973-regulator.c regulator: max8973: Don't override control1 variable when set ramp delay bits 2013-04-24 10:52:28 +01:00
max8997.c regulator: max8997: Test pdata by NULL checking instead of IS_ERR_OR_NULL 2013-04-15 17:21:18 +01:00
max8998.c regulators: max8998.c: use dev_err() instead of printk() 2013-03-04 10:53:01 +08:00
max77686.c regulator: max77686: Don't update max77686->opmode if update register fails 2013-04-28 02:07:52 +01:00
mc13xxx-regulator-core.c regulator: mc13xxx: Add warning of incorrect names of regulators 2013-04-28 02:10:00 +01:00
mc13xxx.h regulator: mc13xxx: Add warning of incorrect names of regulators 2013-04-28 02:10:00 +01:00
mc13783-regulator.c regulator: mc13783: Add device tree probe support 2013-04-28 02:10:00 +01:00
mc13892-regulator.c Merge remote-tracking branch 'regulator/topic/ascend' into v3.9-rc8 2013-04-28 02:13:36 +01:00
of_regulator.c regulator: clear state each invocation of of_regulator_match 2013-01-30 10:11:06 +08:00
palmas-regulator.c regulator: palmas: Fix "enable_reg" to point to the correct reg for SMPS10 2013-05-30 11:55:55 +01:00
pcap-regulator.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
pcf50633-regulator.c Merge remote-tracking branch 'regulator/topic/min' into regulator-next 2012-12-10 12:43:00 +09:00
rc5t583-regulator.c regulator: rc5t583: Remove unused fields from struct rc5t583_regulator_info 2013-04-16 12:22:06 +01:00
s2mps11.c regulator: s2mps11: fix incorrect register for buck10 2013-01-31 14:45:11 +08:00
s5m8767.c Merge remote-tracking branch 'regulator/topic/s5m8767' into v3.9-rc8 2013-04-28 02:13:46 +01:00
tps6105x-regulator.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
tps6507x-regulator.c regulator: tps6507x: Use regulator_map_voltage_ascend 2013-04-25 11:48:37 +01:00
tps6524x-regulator.c Merge remote-tracking branch 'regulator/topic/core' into v3.9-rc8 2013-04-28 02:13:37 +01:00
tps6586x-regulator.c mfd: tps6586x: correct device name of the regulator cell 2013-06-24 12:37:47 +01:00
tps51632-regulator.c regulator: tps51632: Use regulator_[get|set]_voltage_sel_regmap 2013-02-13 12:58:40 +00:00
tps62360-regulator.c regulator: tps62360: Fix off-by-one shift for ramp_ctrl 2013-04-23 11:26:56 +01:00
tps65023-regulator.c Merge remote-tracking branch 'regulator/topic/tps65023' into v3.9-rc8 2013-04-28 02:13:47 +01:00
tps65090-regulator.c regulator: tps65090: Fix using wrong dev argument for calling of_regulator_match 2013-01-31 14:42:05 +08:00
tps65217-regulator.c regulator: tps65217: Fix using wrong dev argument for calling of_regulator_match 2013-01-24 18:58:33 +08:00
tps65910-regulator.c regulator: tps65910: Convert to use regulator_map_voltage_ascend 2013-04-23 11:41:06 +01:00
tps65912-regulator.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
tps80031-regulator.c regulator: tps80031: Convert tps80031_dcdc_ops to [get|set]_voltage_sel_regmap 2013-04-23 11:47:38 +01:00
twl-regulator.c Merge remote-tracking branch 'regulator/topic/twl' into v3.9-rc8 2013-04-28 02:13:49 +01:00
userspace-consumer.c regulator: userspace-consumer: Convert to use devm_* APIs 2012-04-18 10:26:24 +01:00
vexpress.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
virtual.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
wm831x-dcdc.c Merge remote-tracking branch 'regulator/topic/wm831x' into regulator-next 2012-12-10 12:43:33 +09:00
wm831x-isink.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
wm831x-ldo.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
wm8350-regulator.c regulator: wm8350: Reuse map_voltage() to get selector of a given uV 2012-06-17 20:53:58 +01:00
wm8400-regulator.c regulator: remove use of __devexit 2012-11-20 10:53:38 +09:00
wm8994-regulator.c regulator: wm8994: Use GPIO parsed from DT when registering regulators 2013-04-11 17:56:21 +01:00