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);
 
 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;
        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);
        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,