|| !wake
                        || at91_suspend_entering_slow_clock()) {
                pullup(udc, 0);
-               disable_irq_wake(udc->udp_irq);
+               wake = 0;
        } else
                enable_irq_wake(udc->udp_irq);
 
-       if (udc->board.vbus_pin > 0) {
-               if (wake)
-                       enable_irq_wake(udc->board.vbus_pin);
-               else
-                       disable_irq_wake(udc->board.vbus_pin);
-       }
+       udc->active_suspend = wake;
+       if (udc->board.vbus_pin > 0 && wake)
+               enable_irq_wake(udc->board.vbus_pin);
        return 0;
 }
 
 {
        struct at91_udc *udc = platform_get_drvdata(pdev);
 
+       if (udc->board.vbus_pin > 0 && udc->active_suspend)
+               disable_irq_wake(udc->board.vbus_pin);
+
        /* maybe reconnect to host; if so, clocks on */
-       pullup(udc, 1);
+       if (udc->active_suspend)
+               disable_irq_wake(udc->udp_irq);
+       else
+               pullup(udc, 1);
        return 0;
 }
 #else
 
        unsigned                        wait_for_addr_ack:1;
        unsigned                        wait_for_config_ack:1;
        unsigned                        selfpowered:1;
+       unsigned                        active_suspend:1;
        u8                              addr;
        struct at91_udc_data            board;
        struct clk                      *iclk, *fclk;