2009-06-22 11:37:10

by Anuj Aggarwal

[permalink] [raw]
Subject: Regulator enable called without increasing the use_count

Hi,

In set_machine_constraints(), for regulators which are enabled at boot
time, ops->enable() is called. But use_count is not increased, as was done
in regulator_enable(). Because of this, I cannot call regulator_disable()
on this regulator, even if it is enabled by default and I want to disable
it now. The framework throws me the following error:

<4>------------[ cut here ]------------
------------[ cut here ]------------
<4>WARNING: at drivers/regulator/core.c:1165 _regulator_disable+0x44/0x104()
WARNING: at drivers/regulator/core.c:1165 _regulator_disable+0x44/0x104()
unbalanced disables for LDO1
unbalanced disables for LDO1
Modules linked in:Modules linked in: tps_test(+) tps_test(+)

[<c0032ea4>] [<c0032ea4>] (dump_stack+0x0/0x14) (dump_stack+0x0/0x14) from [<c00
5ad30>] from [<c005ad30>] (warn_slowpath+0x6c/0x88)
(warn_slowpath+0x6c/0x88)
[<c005acc4>] [<c005acc4>] (warn_slowpath+0x0/0x88) (warn_slowpath+0x0/0x88) from
[<c01992d8>] from [<c01992d8>] (_regulator_disable+0x44/0x104)
(_regulator_disable+0x44/0x104)
r3:c03b72ef r3:c03b72ef r2:c03b6cac r2:c03b6cac

r7:00000000 r7:00000000 r6:00000014 r6:00000014 r5:fffffffb r5:fffffffb r4:c70e
ce00 r4:c70ece00

[<c0199294>] [<c0199294>] (_regulator_disable+0x0/0x104) (_regulator_disable+0x0
/0x104) from [<c0199468>] from [<c0199468>] (regulator_disable+0x24/0x38)
(regulator_disable+0x24/0x38)
r5:c70ece38 r5:c70ece38 r4:c70ece00 r4:c70ece00

[<c0199444>] [<c0199444>] (regulator_disable+0x0/0x38) (regulator_disable+0x0/0x
38) from [<bf0000cc>] from [<bf0000cc>] (test_tps65023+0xcc/0x150 [tps_test])
(test_tps65023+0xcc/0x150 [tps_test])
r5:00000000 r5:00000000 r4:c729bce0 r4:c729bce0

[<bf000000>] [<bf000000>] (test_tps65023+0x0/0x150 [tps_test]) (test_tps65023+0x
0/0x150 [tps_test]) from [<bf003030>] from [<bf003030>] (tps_regulator_test_init
+0x30/0x48 [tps_test])
(tps_regulator_test_init+0x30/0x48 [tps_test])
r6:c0433e20 r6:c0433e20 r5:bf000900 r5:bf000900 r4:00006ee1 r4:00006ee1

[<bf003000>] [<bf003000>] (tps_regulator_test_init+0x0/0x48 [tps_test]) (tps_reg
ulator_test_init+0x0/0x48 [tps_test]) from [<c002e2b0>] from [<c002e2b0>] (do_on
e_initcall+0x58/0x184)
(do_one_initcall+0x58/0x184)
[<c002e258>] [<c002e258>] (do_one_initcall+0x0/0x184) (do_one_initcall+0x0/0x184
) from [<c007e1d8>] from [<c007e1d8>] (sys_init_module+0x98/0x198)
(sys_init_module+0x98/0x198)
[<c007e140>] [<c007e140>] (sys_init_module+0x0/0x198) (sys_init_module+0x0/0x198
) from [<c002ee00>] from [<c002ee00>] (ret_fast_syscall+0x0/0x2c)
(ret_fast_syscall+0x0/0x2c)
r7:00000080 r7:00000080 r6:00016f85 r6:00016f85 r5:beb33f04 r5:beb33f04 r4:0000
6ee1 r4:00006ee1

<4>---[ end trace fd7133e282dc9996 ]---
---[ end trace fd7133e282dc9996 ]---


Why is it designed like that? Should I enable it again and then call the
disable()?

Regards,
Anuj Aggarwal


2009-06-22 12:26:55

by Mark Brown

[permalink] [raw]
Subject: Re: Regulator enable called without increasing the use_count

On Mon, Jun 22, 2009 at 05:06:36PM +0530, Aggarwal, Anuj wrote:

> Why is it designed like that? Should I enable it again and then call the
> disable()?

It's like that because regulators can be shared between mulitple
consumers. In order for that to work consumers can't disable regulators
they didn't enable themselves (since otherwise they could be breaking
another consumer) and so the can't increase the reference count.

If your driver explicitly needs the regulator to be off at startup it
should do an enable then a disable. Otherwise it should just leave the
regulator alone. Machines can call regulator_has_full_constraints() to
tell the core that any regulators which have not been explicitly enabled
by consumers can be powered off at the end of init - at some point in
the future this will become the default.