On Tue, Mar 6, 2012 at 2:51 AM, Heiko Stübner <heiko@xxxxxxxxx> wrote: > Am Mittwoch, 29. Februar 2012, 23:03:11 schrieb Heiko Stübner: >> Commit 9ad63986c606 (pda_power: Add support for using otg transceiver >> events) converted the pda-power driver to use otg events to determine the >> status of the power supply. >> >> As gpio-vbus didn't use otg events until now, this change breaks setups >> of pda-power with a gpio-vbus transceiver. >> >> This patch adds the necessary otg events and notifiers to gpio-vbus. >> >> Signed-off-by: Heiko Stuebner <heiko@xxxxxxxxx> > > I'm not sure whom to pester more with this, as usb/otg/* does not contain a > MAINTAINERS entry itself. But it would be cool if someone could take a look at > it, as the underlying problem breaks battery indication probably not only on > my machines. Could you describe how you use pda_power? The change only uses OTG events if you did not supply your own is_ac_online/is_usb_online callbacks from the boardfile for pda_power. Were you previously relying on polling? Looking closer at it, I think there may be a bug if you are relying on polling and not supplying your own is_XX_online callbacks. Could you try the attached patch? (untested/uncompiled) --Dima > > > Thanks > Heiko > >> --- >> To not break the otg rework which also touched gpio-vbus, the patch is >> done against the xceiv branch of >> http://git.kernel.org/?p=linux/kernel/git/balbi/usb.git >> >> drivers/usb/otg/gpio_vbus.c | 15 ++++++++++++++- >> 1 files changed, 14 insertions(+), 1 deletions(-) >> >> diff --git a/drivers/usb/otg/gpio_vbus.c b/drivers/usb/otg/gpio_vbus.c >> index 3ece43a..a0a2178 100644 >> --- a/drivers/usb/otg/gpio_vbus.c >> +++ b/drivers/usb/otg/gpio_vbus.c >> @@ -96,7 +96,7 @@ static void gpio_vbus_work(struct work_struct *work) >> struct gpio_vbus_data *gpio_vbus = >> container_of(work, struct gpio_vbus_data, work); >> struct gpio_vbus_mach_info *pdata = gpio_vbus->dev->platform_data; >> - int gpio; >> + int gpio, status; >> >> if (!gpio_vbus->phy.otg->gadget) >> return; >> @@ -108,7 +108,9 @@ static void gpio_vbus_work(struct work_struct *work) >> */ >> gpio = pdata->gpio_pullup; >> if (is_vbus_powered(pdata)) { >> + status = USB_EVENT_VBUS; >> gpio_vbus->phy.state = OTG_STATE_B_PERIPHERAL; >> + gpio_vbus->phy.last_event = status; >> usb_gadget_vbus_connect(gpio_vbus->phy.otg->gadget); >> >> /* drawing a "unit load" is *always* OK, except for OTG */ >> @@ -117,6 +119,9 @@ static void gpio_vbus_work(struct work_struct *work) >> /* optionally enable D+ pullup */ >> if (gpio_is_valid(gpio)) >> gpio_set_value(gpio, !pdata->gpio_pullup_inverted); >> + >> + atomic_notifier_call_chain(&gpio_vbus->phy.notifier, >> + status, gpio_vbus->phy.otg->gadget); >> } else { >> /* optionally disable D+ pullup */ >> if (gpio_is_valid(gpio)) >> @@ -125,7 +130,12 @@ static void gpio_vbus_work(struct work_struct *work) >> set_vbus_draw(gpio_vbus, 0); >> >> usb_gadget_vbus_disconnect(gpio_vbus->phy.otg->gadget); >> + status = USB_EVENT_NONE; >> gpio_vbus->phy.state = OTG_STATE_B_IDLE; >> + gpio_vbus->phy.last_event = status; >> + >> + atomic_notifier_call_chain(&gpio_vbus->phy.notifier, >> + status, gpio_vbus->phy.otg->gadget); >> } >> } >> >> @@ -287,6 +297,9 @@ static int __init gpio_vbus_probe(struct >> platform_device *pdev) irq, err); >> goto err_irq; >> } >> + >> + ATOMIC_INIT_NOTIFIER_HEAD(&gpio_vbus->phy.notifier); >> + >> INIT_WORK(&gpio_vbus->work, gpio_vbus_work); >> >> gpio_vbus->vbus_draw = regulator_get(&pdev->dev, "vbus_draw"); >
Attachment:
0001-pda_power-only-use-otg-events-if-use_otg_notifier-is.patch
Description: Binary data