Re: [PATCH] usb: otg: gpio_vbus: Add otg transceiver events and notifiers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux