USB: atmel uaba: Adding invert vbus_pin
authorEirik Aanonsen <EAA@wprmedical.com>
Fri, 5 Feb 2010 08:49:25 +0000 (09:49 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 2 Mar 2010 22:54:57 +0000 (14:54 -0800)
Adding vbus_pin_inverted so that the usb detect pin can be active high
or low depending on HW implementation also replaced the
gpio_get_value(udc->vbus_pin); with a call to vbus_is_present(udc); This
allows the driver to be loaded and save about 0,15W on the consumption.

Signed-off-by: Eirik Aanonsen <eaa@wprmedical.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/avr32/mach-at32ap/at32ap700x.c
drivers/usb/gadget/atmel_usba_udc.c
drivers/usb/gadget/atmel_usba_udc.h
include/linux/usb/atmel_usba_udc.h

index b13d1879e51b9f0d961fdff8af8c15b9950dcd0e..3a4bc1a18433ff52ac5ba10565f70abee1b38028 100644 (file)
@@ -1770,10 +1770,13 @@ at32_add_device_usba(unsigned int id, struct usba_platform_data *data)
                                          ARRAY_SIZE(usba0_resource)))
                goto out_free_pdev;
 
-       if (data)
+       if (data) {
                usba_data.pdata.vbus_pin = data->vbus_pin;
-       else
+               usba_data.pdata.vbus_pin_inverted = data->vbus_pin_inverted;
+       } else {
                usba_data.pdata.vbus_pin = -EINVAL;
+               usba_data.pdata.vbus_pin_inverted = -EINVAL;
+       }
 
        data = &usba_data.pdata;
        data->num_ep = ARRAY_SIZE(at32_usba_ep);
index 976822f50c70d3cf8e9fdabac0c73d77e2dccdc9..f79bdfe4bed9f9e694146a38970c11d32fd1719f 100644 (file)
@@ -320,7 +320,7 @@ static inline void usba_cleanup_debugfs(struct usba_udc *udc)
 static int vbus_is_present(struct usba_udc *udc)
 {
        if (gpio_is_valid(udc->vbus_pin))
-               return gpio_get_value(udc->vbus_pin);
+               return gpio_get_value(udc->vbus_pin) ^ udc->vbus_pin_inverted;
 
        /* No Vbus detection: Assume always present */
        return 1;
@@ -1763,7 +1763,7 @@ static irqreturn_t usba_vbus_irq(int irq, void *devid)
        if (!udc->driver)
                goto out;
 
-       vbus = gpio_get_value(udc->vbus_pin);
+       vbus = vbus_is_present(udc);
        if (vbus != udc->vbus_prev) {
                if (vbus) {
                        toggle_bias(1);
@@ -2000,6 +2000,7 @@ static int __init usba_udc_probe(struct platform_device *pdev)
        if (gpio_is_valid(pdata->vbus_pin)) {
                if (!gpio_request(pdata->vbus_pin, "atmel_usba_udc")) {
                        udc->vbus_pin = pdata->vbus_pin;
+                       udc->vbus_pin_inverted = pdata->vbus_pin_inverted;
 
                        ret = request_irq(gpio_to_irq(udc->vbus_pin),
                                        usba_vbus_irq, 0,
index f7baea307f0d00be4433c2df62a1f64c6b7b5567..88a2e07a11a8da2562d4721d5a245f4d54d83968 100644 (file)
@@ -323,6 +323,7 @@ struct usba_udc {
        struct platform_device *pdev;
        int irq;
        int vbus_pin;
+       int vbus_pin_inverted;
        struct clk *pclk;
        struct clk *hclk;
 
index 6311fa2d9f824248351aab69e0ad624a36b4cc55..baf41c8616e930e959d456e28e8cdfac0306e00a 100644 (file)
@@ -15,6 +15,7 @@ struct usba_ep_data {
 
 struct usba_platform_data {
        int                     vbus_pin;
+       int                     vbus_pin_inverted;
        int                     num_ep;
        struct usba_ep_data     ep[0];
 };