On Fri, Apr 22, 2016 at 05:38:02PM +0100, Richard Fitzgerald wrote:Maybe what they were supposed to be for but the _DISABLE notifier doesn't appear to do this. It seems to get sent if regulator_disable() was called, regardless of whether that regulator was disabled, and not sent if a parent supply was turned off.
Please fix your mailer to leave blank lines between paragraphs (and not
delete them in quotes), it makes your mails harder to read.
On 22/04/16 16:04, Mark Brown wrote:This is what regulator status change notifiers are for, register and
On Fri, Apr 22, 2016 at 02:43:28PM +0100, Richard Fitzgerald wrote:The background to all this is that runtime suspend and resume needs to know
What's the difference between this and the previous version of the patch
and what problem is this aiming to solve? If we want to disable the
regulator why would we not be happy to do that by removing the supply?
whether the DCVDD turned off. If it definitely turned off a regmap cache
sync is safe - if not or I can't be sure then I need the overhead of a
forced reset to restore register defaults before the sync.
then you'll get a callback when the power is actually pulled (there's a
few other CODEC drivers that use them).
It didn't look to me like a problem with spurious notifications, it looked like the LDO1 regulator not reporting its capabilities correctly (leading to the core thinking it can turn it off when it can't). But now I've looked several times at the regulator core I see that REGULATOR_CHANGE_STATUS means the same as always_on ("must not turn off"), rather than as ambiguously documented "can turn off". Given my misunderstanding my patch was ok no a bodge, but as the flag doesn't do what I thought the patch is definitely wrong.What I'm trying to achieve here is to stop the regulator core sending falseIf you've found a problem with spurious notifications then fix the
notifications that LDO1 has been turned off. The way that the regulator core
spurious notifications, don't pile bodges into consumer drivers! Every
single other driver that relies on these notifications is going to want
the same hack for the same reason though most of them aren't their own
supply so won't be able to do it. The advantage of being able to change
the source code for the entire kernel is that we don't need to have
workarounds for the core in drivers, we can make the core do the right
thing.
It seems the real problem is an assumption that REGULATOR_EVENT_DISABLE means the supply was actually turned off. It's unclear from the description in the header ("Regulator was disabled.") what the intention of this notification was. The existing users of this call all seem to think it means actually turned off, so they all have a problem in the case where the supply was actually pulled by disabling a parent supply (which doesn't currently send a notifier).code handles the disable notifier has no dependency on what happens to theIf the child can't change status then the disable can't propagate up the
parent supply. The REGULATOR_CHANGE_STATUS flag is used to indicate whether
the status of _this_ regulator can be changed (it doesn't affect whether the
parent is disabled).
tree and the child regulator needs to hold the parent enabled.
I think it's a bug that LDO1 claimed to be able to turn off when it couldn't,How does the driver know it couldn't turn off the parent, it knows
and fixing that prevents bogus disable notifications.
nothing about the supply for LDO1? If that's switchable you've just
removed the ability to switch it off since the rail will now never power
down.
Regulators with no enable control of their own need to not do their own
notifications but instead get notifications based on parent status
changes.