diff options
Diffstat (limited to 'drivers/usb/gadget/at91_udc.c')
-rw-r--r-- | drivers/usb/gadget/at91_udc.c | 259 |
1 files changed, 152 insertions, 107 deletions
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 72f3db99ff94..f39050145f1f 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -39,18 +39,20 @@ | |||
39 | #include <linux/interrupt.h> | 39 | #include <linux/interrupt.h> |
40 | #include <linux/proc_fs.h> | 40 | #include <linux/proc_fs.h> |
41 | #include <linux/clk.h> | 41 | #include <linux/clk.h> |
42 | #include <linux/usb_ch9.h> | 42 | #include <linux/usb/ch9.h> |
43 | #include <linux/usb_gadget.h> | 43 | #include <linux/usb_gadget.h> |
44 | 44 | ||
45 | #include <asm/byteorder.h> | 45 | #include <asm/byteorder.h> |
46 | #include <asm/hardware.h> | ||
46 | #include <asm/io.h> | 47 | #include <asm/io.h> |
47 | #include <asm/irq.h> | 48 | #include <asm/irq.h> |
48 | #include <asm/system.h> | 49 | #include <asm/system.h> |
49 | #include <asm/mach-types.h> | 50 | #include <asm/mach-types.h> |
50 | 51 | ||
51 | #include <asm/arch/hardware.h> | ||
52 | #include <asm/arch/gpio.h> | 52 | #include <asm/arch/gpio.h> |
53 | #include <asm/arch/board.h> | 53 | #include <asm/arch/board.h> |
54 | #include <asm/arch/cpu.h> | ||
55 | #include <asm/arch/at91sam9261_matrix.h> | ||
54 | 56 | ||
55 | #include "at91_udc.h" | 57 | #include "at91_udc.h" |
56 | 58 | ||
@@ -78,27 +80,11 @@ | |||
78 | static const char driver_name [] = "at91_udc"; | 80 | static const char driver_name [] = "at91_udc"; |
79 | static const char ep0name[] = "ep0"; | 81 | static const char ep0name[] = "ep0"; |
80 | 82 | ||
81 | /*-------------------------------------------------------------------------*/ | ||
82 | |||
83 | /* | ||
84 | * Read from a UDP register. | ||
85 | */ | ||
86 | static inline unsigned long at91_udp_read(unsigned int reg) | ||
87 | { | ||
88 | void __iomem *udp_base = (void __iomem *)AT91_VA_BASE_UDP; | ||
89 | 83 | ||
90 | return __raw_readl(udp_base + reg); | 84 | #define at91_udp_read(dev, reg) \ |
91 | } | 85 | __raw_readl((dev)->udp_baseaddr + (reg)) |
92 | 86 | #define at91_udp_write(dev, reg, val) \ | |
93 | /* | 87 | __raw_writel((val), (dev)->udp_baseaddr + (reg)) |
94 | * Write to a UDP register. | ||
95 | */ | ||
96 | static inline void at91_udp_write(unsigned int reg, unsigned long value) | ||
97 | { | ||
98 | void __iomem *udp_base = (void __iomem *)AT91_VA_BASE_UDP; | ||
99 | |||
100 | __raw_writel(value, udp_base + reg); | ||
101 | } | ||
102 | 88 | ||
103 | /*-------------------------------------------------------------------------*/ | 89 | /*-------------------------------------------------------------------------*/ |
104 | 90 | ||
@@ -210,13 +196,13 @@ static int proc_udc_show(struct seq_file *s, void *unused) | |||
210 | return 0; | 196 | return 0; |
211 | } | 197 | } |
212 | 198 | ||
213 | tmp = at91_udp_read(AT91_UDP_FRM_NUM); | 199 | tmp = at91_udp_read(udc, AT91_UDP_FRM_NUM); |
214 | seq_printf(s, "frame %05x:%s%s frame=%d\n", tmp, | 200 | seq_printf(s, "frame %05x:%s%s frame=%d\n", tmp, |
215 | (tmp & AT91_UDP_FRM_OK) ? " ok" : "", | 201 | (tmp & AT91_UDP_FRM_OK) ? " ok" : "", |
216 | (tmp & AT91_UDP_FRM_ERR) ? " err" : "", | 202 | (tmp & AT91_UDP_FRM_ERR) ? " err" : "", |
217 | (tmp & AT91_UDP_NUM)); | 203 | (tmp & AT91_UDP_NUM)); |
218 | 204 | ||
219 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); | 205 | tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); |
220 | seq_printf(s, "glbstate %02x:%s" FOURBITS "\n", tmp, | 206 | seq_printf(s, "glbstate %02x:%s" FOURBITS "\n", tmp, |
221 | (tmp & AT91_UDP_RMWUPE) ? " rmwupe" : "", | 207 | (tmp & AT91_UDP_RMWUPE) ? " rmwupe" : "", |
222 | (tmp & AT91_UDP_RSMINPR) ? " rsminpr" : "", | 208 | (tmp & AT91_UDP_RSMINPR) ? " rsminpr" : "", |
@@ -224,13 +210,13 @@ static int proc_udc_show(struct seq_file *s, void *unused) | |||
224 | (tmp & AT91_UDP_CONFG) ? " confg" : "", | 210 | (tmp & AT91_UDP_CONFG) ? " confg" : "", |
225 | (tmp & AT91_UDP_FADDEN) ? " fadden" : ""); | 211 | (tmp & AT91_UDP_FADDEN) ? " fadden" : ""); |
226 | 212 | ||
227 | tmp = at91_udp_read(AT91_UDP_FADDR); | 213 | tmp = at91_udp_read(udc, AT91_UDP_FADDR); |
228 | seq_printf(s, "faddr %03x:%s fadd=%d\n", tmp, | 214 | seq_printf(s, "faddr %03x:%s fadd=%d\n", tmp, |
229 | (tmp & AT91_UDP_FEN) ? " fen" : "", | 215 | (tmp & AT91_UDP_FEN) ? " fen" : "", |
230 | (tmp & AT91_UDP_FADD)); | 216 | (tmp & AT91_UDP_FADD)); |
231 | 217 | ||
232 | proc_irq_show(s, "imr ", at91_udp_read(AT91_UDP_IMR)); | 218 | proc_irq_show(s, "imr ", at91_udp_read(udc, AT91_UDP_IMR)); |
233 | proc_irq_show(s, "isr ", at91_udp_read(AT91_UDP_ISR)); | 219 | proc_irq_show(s, "isr ", at91_udp_read(udc, AT91_UDP_ISR)); |
234 | 220 | ||
235 | if (udc->enabled && udc->vbus) { | 221 | if (udc->enabled && udc->vbus) { |
236 | proc_ep_show(s, &udc->ep[0]); | 222 | proc_ep_show(s, &udc->ep[0]); |
@@ -286,6 +272,7 @@ static inline void remove_debug_file(struct at91_udc *udc) {} | |||
286 | static void done(struct at91_ep *ep, struct at91_request *req, int status) | 272 | static void done(struct at91_ep *ep, struct at91_request *req, int status) |
287 | { | 273 | { |
288 | unsigned stopped = ep->stopped; | 274 | unsigned stopped = ep->stopped; |
275 | struct at91_udc *udc = ep->udc; | ||
289 | 276 | ||
290 | list_del_init(&req->queue); | 277 | list_del_init(&req->queue); |
291 | if (req->req.status == -EINPROGRESS) | 278 | if (req->req.status == -EINPROGRESS) |
@@ -301,7 +288,7 @@ static void done(struct at91_ep *ep, struct at91_request *req, int status) | |||
301 | 288 | ||
302 | /* ep0 is always ready; other endpoints need a non-empty queue */ | 289 | /* ep0 is always ready; other endpoints need a non-empty queue */ |
303 | if (list_empty(&ep->queue) && ep->int_mask != (1 << 0)) | 290 | if (list_empty(&ep->queue) && ep->int_mask != (1 << 0)) |
304 | at91_udp_write(AT91_UDP_IDR, ep->int_mask); | 291 | at91_udp_write(udc, AT91_UDP_IDR, ep->int_mask); |
305 | } | 292 | } |
306 | 293 | ||
307 | /*-------------------------------------------------------------------------*/ | 294 | /*-------------------------------------------------------------------------*/ |
@@ -554,8 +541,8 @@ ok: | |||
554 | * reset/init endpoint fifo. NOTE: leaves fifo_bank alone, | 541 | * reset/init endpoint fifo. NOTE: leaves fifo_bank alone, |
555 | * since endpoint resets don't reset hw pingpong state. | 542 | * since endpoint resets don't reset hw pingpong state. |
556 | */ | 543 | */ |
557 | at91_udp_write(AT91_UDP_RST_EP, ep->int_mask); | 544 | at91_udp_write(dev, AT91_UDP_RST_EP, ep->int_mask); |
558 | at91_udp_write(AT91_UDP_RST_EP, 0); | 545 | at91_udp_write(dev, AT91_UDP_RST_EP, 0); |
559 | 546 | ||
560 | local_irq_restore(flags); | 547 | local_irq_restore(flags); |
561 | return 0; | 548 | return 0; |
@@ -564,6 +551,7 @@ ok: | |||
564 | static int at91_ep_disable (struct usb_ep * _ep) | 551 | static int at91_ep_disable (struct usb_ep * _ep) |
565 | { | 552 | { |
566 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); | 553 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); |
554 | struct at91_udc *udc = ep->udc; | ||
567 | unsigned long flags; | 555 | unsigned long flags; |
568 | 556 | ||
569 | if (ep == &ep->udc->ep[0]) | 557 | if (ep == &ep->udc->ep[0]) |
@@ -579,8 +567,8 @@ static int at91_ep_disable (struct usb_ep * _ep) | |||
579 | 567 | ||
580 | /* reset fifos and endpoint */ | 568 | /* reset fifos and endpoint */ |
581 | if (ep->udc->clocked) { | 569 | if (ep->udc->clocked) { |
582 | at91_udp_write(AT91_UDP_RST_EP, ep->int_mask); | 570 | at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); |
583 | at91_udp_write(AT91_UDP_RST_EP, 0); | 571 | at91_udp_write(udc, AT91_UDP_RST_EP, 0); |
584 | __raw_writel(0, ep->creg); | 572 | __raw_writel(0, ep->creg); |
585 | } | 573 | } |
586 | 574 | ||
@@ -598,7 +586,7 @@ at91_ep_alloc_request(struct usb_ep *_ep, unsigned int gfp_flags) | |||
598 | { | 586 | { |
599 | struct at91_request *req; | 587 | struct at91_request *req; |
600 | 588 | ||
601 | req = kcalloc(1, sizeof (struct at91_request), gfp_flags); | 589 | req = kzalloc(sizeof (struct at91_request), gfp_flags); |
602 | if (!req) | 590 | if (!req) |
603 | return NULL; | 591 | return NULL; |
604 | 592 | ||
@@ -695,10 +683,10 @@ static int at91_ep_queue(struct usb_ep *_ep, | |||
695 | * reconfigures the endpoints. | 683 | * reconfigures the endpoints. |
696 | */ | 684 | */ |
697 | if (dev->wait_for_config_ack) { | 685 | if (dev->wait_for_config_ack) { |
698 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); | 686 | tmp = at91_udp_read(dev, AT91_UDP_GLB_STAT); |
699 | tmp ^= AT91_UDP_CONFG; | 687 | tmp ^= AT91_UDP_CONFG; |
700 | VDBG("toggle config\n"); | 688 | VDBG("toggle config\n"); |
701 | at91_udp_write(AT91_UDP_GLB_STAT, tmp); | 689 | at91_udp_write(dev, AT91_UDP_GLB_STAT, tmp); |
702 | } | 690 | } |
703 | if (req->req.length == 0) { | 691 | if (req->req.length == 0) { |
704 | ep0_in_status: | 692 | ep0_in_status: |
@@ -727,7 +715,7 @@ ep0_in_status: | |||
727 | 715 | ||
728 | if (req && !status) { | 716 | if (req && !status) { |
729 | list_add_tail (&req->queue, &ep->queue); | 717 | list_add_tail (&req->queue, &ep->queue); |
730 | at91_udp_write(AT91_UDP_IER, ep->int_mask); | 718 | at91_udp_write(dev, AT91_UDP_IER, ep->int_mask); |
731 | } | 719 | } |
732 | done: | 720 | done: |
733 | local_irq_restore(flags); | 721 | local_irq_restore(flags); |
@@ -758,6 +746,7 @@ static int at91_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | |||
758 | static int at91_ep_set_halt(struct usb_ep *_ep, int value) | 746 | static int at91_ep_set_halt(struct usb_ep *_ep, int value) |
759 | { | 747 | { |
760 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); | 748 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); |
749 | struct at91_udc *udc = ep->udc; | ||
761 | u32 __iomem *creg; | 750 | u32 __iomem *creg; |
762 | u32 csr; | 751 | u32 csr; |
763 | unsigned long flags; | 752 | unsigned long flags; |
@@ -785,8 +774,8 @@ static int at91_ep_set_halt(struct usb_ep *_ep, int value) | |||
785 | csr |= AT91_UDP_FORCESTALL; | 774 | csr |= AT91_UDP_FORCESTALL; |
786 | VDBG("halt %s\n", ep->ep.name); | 775 | VDBG("halt %s\n", ep->ep.name); |
787 | } else { | 776 | } else { |
788 | at91_udp_write(AT91_UDP_RST_EP, ep->int_mask); | 777 | at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); |
789 | at91_udp_write(AT91_UDP_RST_EP, 0); | 778 | at91_udp_write(udc, AT91_UDP_RST_EP, 0); |
790 | csr &= ~AT91_UDP_FORCESTALL; | 779 | csr &= ~AT91_UDP_FORCESTALL; |
791 | } | 780 | } |
792 | __raw_writel(csr, creg); | 781 | __raw_writel(csr, creg); |
@@ -813,9 +802,11 @@ static struct usb_ep_ops at91_ep_ops = { | |||
813 | 802 | ||
814 | static int at91_get_frame(struct usb_gadget *gadget) | 803 | static int at91_get_frame(struct usb_gadget *gadget) |
815 | { | 804 | { |
805 | struct at91_udc *udc = to_udc(gadget); | ||
806 | |||
816 | if (!to_udc(gadget)->clocked) | 807 | if (!to_udc(gadget)->clocked) |
817 | return -EINVAL; | 808 | return -EINVAL; |
818 | return at91_udp_read(AT91_UDP_FRM_NUM) & AT91_UDP_NUM; | 809 | return at91_udp_read(udc, AT91_UDP_FRM_NUM) & AT91_UDP_NUM; |
819 | } | 810 | } |
820 | 811 | ||
821 | static int at91_wakeup(struct usb_gadget *gadget) | 812 | static int at91_wakeup(struct usb_gadget *gadget) |
@@ -833,11 +824,11 @@ static int at91_wakeup(struct usb_gadget *gadget) | |||
833 | 824 | ||
834 | /* NOTE: some "early versions" handle ESR differently ... */ | 825 | /* NOTE: some "early versions" handle ESR differently ... */ |
835 | 826 | ||
836 | glbstate = at91_udp_read(AT91_UDP_GLB_STAT); | 827 | glbstate = at91_udp_read(udc, AT91_UDP_GLB_STAT); |
837 | if (!(glbstate & AT91_UDP_ESR)) | 828 | if (!(glbstate & AT91_UDP_ESR)) |
838 | goto done; | 829 | goto done; |
839 | glbstate |= AT91_UDP_ESR; | 830 | glbstate |= AT91_UDP_ESR; |
840 | at91_udp_write(AT91_UDP_GLB_STAT, glbstate); | 831 | at91_udp_write(udc, AT91_UDP_GLB_STAT, glbstate); |
841 | 832 | ||
842 | done: | 833 | done: |
843 | local_irq_restore(flags); | 834 | local_irq_restore(flags); |
@@ -861,6 +852,7 @@ static void udc_reinit(struct at91_udc *udc) | |||
861 | ep->stopped = 0; | 852 | ep->stopped = 0; |
862 | ep->fifo_bank = 0; | 853 | ep->fifo_bank = 0; |
863 | ep->ep.maxpacket = ep->maxpacket; | 854 | ep->ep.maxpacket = ep->maxpacket; |
855 | ep->creg = (void __iomem *) udc->udp_baseaddr + AT91_UDP_CSR(i); | ||
864 | // initialiser une queue par endpoint | 856 | // initialiser une queue par endpoint |
865 | INIT_LIST_HEAD(&ep->queue); | 857 | INIT_LIST_HEAD(&ep->queue); |
866 | } | 858 | } |
@@ -915,14 +907,41 @@ static void pullup(struct at91_udc *udc, int is_on) | |||
915 | if (!udc->enabled || !udc->vbus) | 907 | if (!udc->enabled || !udc->vbus) |
916 | is_on = 0; | 908 | is_on = 0; |
917 | DBG("%sactive\n", is_on ? "" : "in"); | 909 | DBG("%sactive\n", is_on ? "" : "in"); |
910 | |||
918 | if (is_on) { | 911 | if (is_on) { |
919 | clk_on(udc); | 912 | clk_on(udc); |
920 | at91_udp_write(AT91_UDP_TXVC, 0); | 913 | at91_udp_write(udc, AT91_UDP_TXVC, 0); |
921 | at91_set_gpio_value(udc->board.pullup_pin, 1); | 914 | if (cpu_is_at91rm9200()) |
922 | } else { | 915 | at91_set_gpio_value(udc->board.pullup_pin, 1); |
916 | else if (cpu_is_at91sam9260()) { | ||
917 | u32 txvc = at91_udp_read(udc, AT91_UDP_TXVC); | ||
918 | |||
919 | txvc |= AT91_UDP_TXVC_PUON; | ||
920 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); | ||
921 | } else if (cpu_is_at91sam9261()) { | ||
922 | u32 usbpucr; | ||
923 | |||
924 | usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); | ||
925 | usbpucr |= AT91_MATRIX_USBPUCR_PUON; | ||
926 | at91_sys_write(AT91_MATRIX_USBPUCR, usbpucr); | ||
927 | } | ||
928 | } else { | ||
923 | stop_activity(udc); | 929 | stop_activity(udc); |
924 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | 930 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); |
925 | at91_set_gpio_value(udc->board.pullup_pin, 0); | 931 | if (cpu_is_at91rm9200()) |
932 | at91_set_gpio_value(udc->board.pullup_pin, 0); | ||
933 | else if (cpu_is_at91sam9260()) { | ||
934 | u32 txvc = at91_udp_read(udc, AT91_UDP_TXVC); | ||
935 | |||
936 | txvc &= ~AT91_UDP_TXVC_PUON; | ||
937 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); | ||
938 | } else if (cpu_is_at91sam9261()) { | ||
939 | u32 usbpucr; | ||
940 | |||
941 | usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); | ||
942 | usbpucr &= ~AT91_MATRIX_USBPUCR_PUON; | ||
943 | at91_sys_write(AT91_MATRIX_USBPUCR, usbpucr); | ||
944 | } | ||
926 | clk_off(udc); | 945 | clk_off(udc); |
927 | } | 946 | } |
928 | } | 947 | } |
@@ -936,7 +955,10 @@ static int at91_vbus_session(struct usb_gadget *gadget, int is_active) | |||
936 | // VDBG("vbus %s\n", is_active ? "on" : "off"); | 955 | // VDBG("vbus %s\n", is_active ? "on" : "off"); |
937 | local_irq_save(flags); | 956 | local_irq_save(flags); |
938 | udc->vbus = (is_active != 0); | 957 | udc->vbus = (is_active != 0); |
939 | pullup(udc, is_active); | 958 | if (udc->driver) |
959 | pullup(udc, is_active); | ||
960 | else | ||
961 | pullup(udc, 0); | ||
940 | local_irq_restore(flags); | 962 | local_irq_restore(flags); |
941 | return 0; | 963 | return 0; |
942 | } | 964 | } |
@@ -1086,7 +1108,7 @@ static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr) | |||
1086 | 1108 | ||
1087 | case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8) | 1109 | case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8) |
1088 | | USB_REQ_SET_CONFIGURATION: | 1110 | | USB_REQ_SET_CONFIGURATION: |
1089 | tmp = at91_udp_read(AT91_UDP_GLB_STAT) & AT91_UDP_CONFG; | 1111 | tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT) & AT91_UDP_CONFG; |
1090 | if (pkt.r.wValue) | 1112 | if (pkt.r.wValue) |
1091 | udc->wait_for_config_ack = (tmp == 0); | 1113 | udc->wait_for_config_ack = (tmp == 0); |
1092 | else | 1114 | else |
@@ -1103,7 +1125,7 @@ static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr) | |||
1103 | case ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8) | 1125 | case ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8) |
1104 | | USB_REQ_GET_STATUS: | 1126 | | USB_REQ_GET_STATUS: |
1105 | tmp = (udc->selfpowered << USB_DEVICE_SELF_POWERED); | 1127 | tmp = (udc->selfpowered << USB_DEVICE_SELF_POWERED); |
1106 | if (at91_udp_read(AT91_UDP_GLB_STAT) & AT91_UDP_ESR) | 1128 | if (at91_udp_read(udc, AT91_UDP_GLB_STAT) & AT91_UDP_ESR) |
1107 | tmp |= (1 << USB_DEVICE_REMOTE_WAKEUP); | 1129 | tmp |= (1 << USB_DEVICE_REMOTE_WAKEUP); |
1108 | PACKET("get device status\n"); | 1130 | PACKET("get device status\n"); |
1109 | __raw_writeb(tmp, dreg); | 1131 | __raw_writeb(tmp, dreg); |
@@ -1114,17 +1136,17 @@ static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr) | |||
1114 | | USB_REQ_SET_FEATURE: | 1136 | | USB_REQ_SET_FEATURE: |
1115 | if (w_value != USB_DEVICE_REMOTE_WAKEUP) | 1137 | if (w_value != USB_DEVICE_REMOTE_WAKEUP) |
1116 | goto stall; | 1138 | goto stall; |
1117 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); | 1139 | tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); |
1118 | tmp |= AT91_UDP_ESR; | 1140 | tmp |= AT91_UDP_ESR; |
1119 | at91_udp_write(AT91_UDP_GLB_STAT, tmp); | 1141 | at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp); |
1120 | goto succeed; | 1142 | goto succeed; |
1121 | case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8) | 1143 | case ((USB_TYPE_STANDARD|USB_RECIP_DEVICE) << 8) |
1122 | | USB_REQ_CLEAR_FEATURE: | 1144 | | USB_REQ_CLEAR_FEATURE: |
1123 | if (w_value != USB_DEVICE_REMOTE_WAKEUP) | 1145 | if (w_value != USB_DEVICE_REMOTE_WAKEUP) |
1124 | goto stall; | 1146 | goto stall; |
1125 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); | 1147 | tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); |
1126 | tmp &= ~AT91_UDP_ESR; | 1148 | tmp &= ~AT91_UDP_ESR; |
1127 | at91_udp_write(AT91_UDP_GLB_STAT, tmp); | 1149 | at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp); |
1128 | goto succeed; | 1150 | goto succeed; |
1129 | 1151 | ||
1130 | /* | 1152 | /* |
@@ -1206,8 +1228,8 @@ static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr) | |||
1206 | } else if (ep->is_in) | 1228 | } else if (ep->is_in) |
1207 | goto stall; | 1229 | goto stall; |
1208 | 1230 | ||
1209 | at91_udp_write(AT91_UDP_RST_EP, ep->int_mask); | 1231 | at91_udp_write(udc, AT91_UDP_RST_EP, ep->int_mask); |
1210 | at91_udp_write(AT91_UDP_RST_EP, 0); | 1232 | at91_udp_write(udc, AT91_UDP_RST_EP, 0); |
1211 | tmp = __raw_readl(ep->creg); | 1233 | tmp = __raw_readl(ep->creg); |
1212 | tmp |= CLR_FX; | 1234 | tmp |= CLR_FX; |
1213 | tmp &= ~(SET_FX | AT91_UDP_FORCESTALL); | 1235 | tmp &= ~(SET_FX | AT91_UDP_FORCESTALL); |
@@ -1222,7 +1244,10 @@ static void handle_setup(struct at91_udc *udc, struct at91_ep *ep, u32 csr) | |||
1222 | #undef w_length | 1244 | #undef w_length |
1223 | 1245 | ||
1224 | /* pass request up to the gadget driver */ | 1246 | /* pass request up to the gadget driver */ |
1225 | status = udc->driver->setup(&udc->gadget, &pkt.r); | 1247 | if (udc->driver) |
1248 | status = udc->driver->setup(&udc->gadget, &pkt.r); | ||
1249 | else | ||
1250 | status = -ENODEV; | ||
1226 | if (status < 0) { | 1251 | if (status < 0) { |
1227 | stall: | 1252 | stall: |
1228 | VDBG("req %02x.%02x protocol STALL; stat %d\n", | 1253 | VDBG("req %02x.%02x protocol STALL; stat %d\n", |
@@ -1300,13 +1325,13 @@ static void handle_ep0(struct at91_udc *udc) | |||
1300 | if (udc->wait_for_addr_ack) { | 1325 | if (udc->wait_for_addr_ack) { |
1301 | u32 tmp; | 1326 | u32 tmp; |
1302 | 1327 | ||
1303 | at91_udp_write(AT91_UDP_FADDR, | 1328 | at91_udp_write(udc, AT91_UDP_FADDR, |
1304 | AT91_UDP_FEN | udc->addr); | 1329 | AT91_UDP_FEN | udc->addr); |
1305 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); | 1330 | tmp = at91_udp_read(udc, AT91_UDP_GLB_STAT); |
1306 | tmp &= ~AT91_UDP_FADDEN; | 1331 | tmp &= ~AT91_UDP_FADDEN; |
1307 | if (udc->addr) | 1332 | if (udc->addr) |
1308 | tmp |= AT91_UDP_FADDEN; | 1333 | tmp |= AT91_UDP_FADDEN; |
1309 | at91_udp_write(AT91_UDP_GLB_STAT, tmp); | 1334 | at91_udp_write(udc, AT91_UDP_GLB_STAT, tmp); |
1310 | 1335 | ||
1311 | udc->wait_for_addr_ack = 0; | 1336 | udc->wait_for_addr_ack = 0; |
1312 | VDBG("address %d\n", udc->addr); | 1337 | VDBG("address %d\n", udc->addr); |
@@ -1374,28 +1399,28 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc) | |||
1374 | while (rescans--) { | 1399 | while (rescans--) { |
1375 | u32 status; | 1400 | u32 status; |
1376 | 1401 | ||
1377 | status = at91_udp_read(AT91_UDP_ISR) | 1402 | status = at91_udp_read(udc, AT91_UDP_ISR) |
1378 | & at91_udp_read(AT91_UDP_IMR); | 1403 | & at91_udp_read(udc, AT91_UDP_IMR); |
1379 | if (!status) | 1404 | if (!status) |
1380 | break; | 1405 | break; |
1381 | 1406 | ||
1382 | /* USB reset irq: not maskable */ | 1407 | /* USB reset irq: not maskable */ |
1383 | if (status & AT91_UDP_ENDBUSRES) { | 1408 | if (status & AT91_UDP_ENDBUSRES) { |
1384 | at91_udp_write(AT91_UDP_IDR, ~MINIMUS_INTERRUPTUS); | 1409 | at91_udp_write(udc, AT91_UDP_IDR, ~MINIMUS_INTERRUPTUS); |
1385 | at91_udp_write(AT91_UDP_IER, MINIMUS_INTERRUPTUS); | 1410 | at91_udp_write(udc, AT91_UDP_IER, MINIMUS_INTERRUPTUS); |
1386 | /* Atmel code clears this irq twice */ | 1411 | /* Atmel code clears this irq twice */ |
1387 | at91_udp_write(AT91_UDP_ICR, AT91_UDP_ENDBUSRES); | 1412 | at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_ENDBUSRES); |
1388 | at91_udp_write(AT91_UDP_ICR, AT91_UDP_ENDBUSRES); | 1413 | at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_ENDBUSRES); |
1389 | VDBG("end bus reset\n"); | 1414 | VDBG("end bus reset\n"); |
1390 | udc->addr = 0; | 1415 | udc->addr = 0; |
1391 | stop_activity(udc); | 1416 | stop_activity(udc); |
1392 | 1417 | ||
1393 | /* enable ep0 */ | 1418 | /* enable ep0 */ |
1394 | at91_udp_write(AT91_UDP_CSR(0), | 1419 | at91_udp_write(udc, AT91_UDP_CSR(0), |
1395 | AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); | 1420 | AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); |
1396 | udc->gadget.speed = USB_SPEED_FULL; | 1421 | udc->gadget.speed = USB_SPEED_FULL; |
1397 | udc->suspended = 0; | 1422 | udc->suspended = 0; |
1398 | at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0)); | 1423 | at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_EP(0)); |
1399 | 1424 | ||
1400 | /* | 1425 | /* |
1401 | * NOTE: this driver keeps clocks off unless the | 1426 | * NOTE: this driver keeps clocks off unless the |
@@ -1406,9 +1431,9 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc) | |||
1406 | 1431 | ||
1407 | /* host initiated suspend (3+ms bus idle) */ | 1432 | /* host initiated suspend (3+ms bus idle) */ |
1408 | } else if (status & AT91_UDP_RXSUSP) { | 1433 | } else if (status & AT91_UDP_RXSUSP) { |
1409 | at91_udp_write(AT91_UDP_IDR, AT91_UDP_RXSUSP); | 1434 | at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXSUSP); |
1410 | at91_udp_write(AT91_UDP_IER, AT91_UDP_RXRSM); | 1435 | at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_RXRSM); |
1411 | at91_udp_write(AT91_UDP_ICR, AT91_UDP_RXSUSP); | 1436 | at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXSUSP); |
1412 | // VDBG("bus suspend\n"); | 1437 | // VDBG("bus suspend\n"); |
1413 | if (udc->suspended) | 1438 | if (udc->suspended) |
1414 | continue; | 1439 | continue; |
@@ -1425,9 +1450,9 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc) | |||
1425 | 1450 | ||
1426 | /* host initiated resume */ | 1451 | /* host initiated resume */ |
1427 | } else if (status & AT91_UDP_RXRSM) { | 1452 | } else if (status & AT91_UDP_RXRSM) { |
1428 | at91_udp_write(AT91_UDP_IDR, AT91_UDP_RXRSM); | 1453 | at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM); |
1429 | at91_udp_write(AT91_UDP_IER, AT91_UDP_RXSUSP); | 1454 | at91_udp_write(udc, AT91_UDP_IER, AT91_UDP_RXSUSP); |
1430 | at91_udp_write(AT91_UDP_ICR, AT91_UDP_RXRSM); | 1455 | at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM); |
1431 | // VDBG("bus resume\n"); | 1456 | // VDBG("bus resume\n"); |
1432 | if (!udc->suspended) | 1457 | if (!udc->suspended) |
1433 | continue; | 1458 | continue; |
@@ -1485,8 +1510,6 @@ static struct at91_udc controller = { | |||
1485 | }, | 1510 | }, |
1486 | .udc = &controller, | 1511 | .udc = &controller, |
1487 | .maxpacket = 8, | 1512 | .maxpacket = 8, |
1488 | .creg = (void __iomem *)(AT91_VA_BASE_UDP | ||
1489 | + AT91_UDP_CSR(0)), | ||
1490 | .int_mask = 1 << 0, | 1513 | .int_mask = 1 << 0, |
1491 | }, | 1514 | }, |
1492 | .ep[1] = { | 1515 | .ep[1] = { |
@@ -1497,8 +1520,6 @@ static struct at91_udc controller = { | |||
1497 | .udc = &controller, | 1520 | .udc = &controller, |
1498 | .is_pingpong = 1, | 1521 | .is_pingpong = 1, |
1499 | .maxpacket = 64, | 1522 | .maxpacket = 64, |
1500 | .creg = (void __iomem *)(AT91_VA_BASE_UDP | ||
1501 | + AT91_UDP_CSR(1)), | ||
1502 | .int_mask = 1 << 1, | 1523 | .int_mask = 1 << 1, |
1503 | }, | 1524 | }, |
1504 | .ep[2] = { | 1525 | .ep[2] = { |
@@ -1509,8 +1530,6 @@ static struct at91_udc controller = { | |||
1509 | .udc = &controller, | 1530 | .udc = &controller, |
1510 | .is_pingpong = 1, | 1531 | .is_pingpong = 1, |
1511 | .maxpacket = 64, | 1532 | .maxpacket = 64, |
1512 | .creg = (void __iomem *)(AT91_VA_BASE_UDP | ||
1513 | + AT91_UDP_CSR(2)), | ||
1514 | .int_mask = 1 << 2, | 1533 | .int_mask = 1 << 2, |
1515 | }, | 1534 | }, |
1516 | .ep[3] = { | 1535 | .ep[3] = { |
@@ -1521,8 +1540,6 @@ static struct at91_udc controller = { | |||
1521 | }, | 1540 | }, |
1522 | .udc = &controller, | 1541 | .udc = &controller, |
1523 | .maxpacket = 8, | 1542 | .maxpacket = 8, |
1524 | .creg = (void __iomem *)(AT91_VA_BASE_UDP | ||
1525 | + AT91_UDP_CSR(3)), | ||
1526 | .int_mask = 1 << 3, | 1543 | .int_mask = 1 << 3, |
1527 | }, | 1544 | }, |
1528 | .ep[4] = { | 1545 | .ep[4] = { |
@@ -1533,8 +1550,6 @@ static struct at91_udc controller = { | |||
1533 | .udc = &controller, | 1550 | .udc = &controller, |
1534 | .is_pingpong = 1, | 1551 | .is_pingpong = 1, |
1535 | .maxpacket = 256, | 1552 | .maxpacket = 256, |
1536 | .creg = (void __iomem *)(AT91_VA_BASE_UDP | ||
1537 | + AT91_UDP_CSR(4)), | ||
1538 | .int_mask = 1 << 4, | 1553 | .int_mask = 1 << 4, |
1539 | }, | 1554 | }, |
1540 | .ep[5] = { | 1555 | .ep[5] = { |
@@ -1545,8 +1560,6 @@ static struct at91_udc controller = { | |||
1545 | .udc = &controller, | 1560 | .udc = &controller, |
1546 | .is_pingpong = 1, | 1561 | .is_pingpong = 1, |
1547 | .maxpacket = 256, | 1562 | .maxpacket = 256, |
1548 | .creg = (void __iomem *)(AT91_VA_BASE_UDP | ||
1549 | + AT91_UDP_CSR(5)), | ||
1550 | .int_mask = 1 << 5, | 1563 | .int_mask = 1 << 5, |
1551 | }, | 1564 | }, |
1552 | /* ep6 and ep7 are also reserved (custom silicon might use them) */ | 1565 | /* ep6 and ep7 are also reserved (custom silicon might use them) */ |
@@ -1572,9 +1585,8 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) | |||
1572 | int retval; | 1585 | int retval; |
1573 | 1586 | ||
1574 | if (!driver | 1587 | if (!driver |
1575 | || driver->speed != USB_SPEED_FULL | 1588 | || driver->speed < USB_SPEED_FULL |
1576 | || !driver->bind | 1589 | || !driver->bind |
1577 | || !driver->unbind | ||
1578 | || !driver->setup) { | 1590 | || !driver->setup) { |
1579 | DBG("bad parameter.\n"); | 1591 | DBG("bad parameter.\n"); |
1580 | return -EINVAL; | 1592 | return -EINVAL; |
@@ -1595,6 +1607,10 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) | |||
1595 | if (retval) { | 1607 | if (retval) { |
1596 | DBG("driver->bind() returned %d\n", retval); | 1608 | DBG("driver->bind() returned %d\n", retval); |
1597 | udc->driver = NULL; | 1609 | udc->driver = NULL; |
1610 | udc->gadget.dev.driver = NULL; | ||
1611 | udc->gadget.dev.driver_data = NULL; | ||
1612 | udc->enabled = 0; | ||
1613 | udc->selfpowered = 0; | ||
1598 | return retval; | 1614 | return retval; |
1599 | } | 1615 | } |
1600 | 1616 | ||
@@ -1611,12 +1627,12 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) | |||
1611 | { | 1627 | { |
1612 | struct at91_udc *udc = &controller; | 1628 | struct at91_udc *udc = &controller; |
1613 | 1629 | ||
1614 | if (!driver || driver != udc->driver) | 1630 | if (!driver || driver != udc->driver || !driver->unbind) |
1615 | return -EINVAL; | 1631 | return -EINVAL; |
1616 | 1632 | ||
1617 | local_irq_disable(); | 1633 | local_irq_disable(); |
1618 | udc->enabled = 0; | 1634 | udc->enabled = 0; |
1619 | at91_udp_write(AT91_UDP_IDR, ~0); | 1635 | at91_udp_write(udc, AT91_UDP_IDR, ~0); |
1620 | pullup(udc, 0); | 1636 | pullup(udc, 0); |
1621 | local_irq_enable(); | 1637 | local_irq_enable(); |
1622 | 1638 | ||
@@ -1641,6 +1657,7 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1641 | struct device *dev = &pdev->dev; | 1657 | struct device *dev = &pdev->dev; |
1642 | struct at91_udc *udc; | 1658 | struct at91_udc *udc; |
1643 | int retval; | 1659 | int retval; |
1660 | struct resource *res; | ||
1644 | 1661 | ||
1645 | if (!dev->platform_data) { | 1662 | if (!dev->platform_data) { |
1646 | /* small (so we copy it) but critical! */ | 1663 | /* small (so we copy it) but critical! */ |
@@ -1658,7 +1675,13 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1658 | return -ENODEV; | 1675 | return -ENODEV; |
1659 | } | 1676 | } |
1660 | 1677 | ||
1661 | if (!request_mem_region(AT91RM9200_BASE_UDP, SZ_16K, driver_name)) { | 1678 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1679 | if (!res) | ||
1680 | return -ENXIO; | ||
1681 | |||
1682 | if (!request_mem_region(res->start, | ||
1683 | res->end - res->start + 1, | ||
1684 | driver_name)) { | ||
1662 | DBG("someone's using UDC memory\n"); | 1685 | DBG("someone's using UDC memory\n"); |
1663 | return -EBUSY; | 1686 | return -EBUSY; |
1664 | } | 1687 | } |
@@ -1668,15 +1691,23 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1668 | udc->gadget.dev.parent = dev; | 1691 | udc->gadget.dev.parent = dev; |
1669 | udc->board = *(struct at91_udc_data *) dev->platform_data; | 1692 | udc->board = *(struct at91_udc_data *) dev->platform_data; |
1670 | udc->pdev = pdev; | 1693 | udc->pdev = pdev; |
1671 | udc_reinit(udc); | ||
1672 | udc->enabled = 0; | 1694 | udc->enabled = 0; |
1673 | 1695 | ||
1696 | udc->udp_baseaddr = ioremap(res->start, res->end - res->start + 1); | ||
1697 | if (!udc->udp_baseaddr) { | ||
1698 | release_mem_region(res->start, res->end - res->start + 1); | ||
1699 | return -ENOMEM; | ||
1700 | } | ||
1701 | |||
1702 | udc_reinit(udc); | ||
1703 | |||
1674 | /* get interface and function clocks */ | 1704 | /* get interface and function clocks */ |
1675 | udc->iclk = clk_get(dev, "udc_clk"); | 1705 | udc->iclk = clk_get(dev, "udc_clk"); |
1676 | udc->fclk = clk_get(dev, "udpck"); | 1706 | udc->fclk = clk_get(dev, "udpck"); |
1677 | if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk)) { | 1707 | if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk)) { |
1678 | DBG("clocks missing\n"); | 1708 | DBG("clocks missing\n"); |
1679 | return -ENODEV; | 1709 | retval = -ENODEV; |
1710 | goto fail0; | ||
1680 | } | 1711 | } |
1681 | 1712 | ||
1682 | retval = device_register(&udc->gadget.dev); | 1713 | retval = device_register(&udc->gadget.dev); |
@@ -1685,8 +1716,10 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1685 | 1716 | ||
1686 | /* don't do anything until we have both gadget driver and VBUS */ | 1717 | /* don't do anything until we have both gadget driver and VBUS */ |
1687 | clk_enable(udc->iclk); | 1718 | clk_enable(udc->iclk); |
1688 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | 1719 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); |
1689 | at91_udp_write(AT91_UDP_IDR, 0xffffffff); | 1720 | at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); |
1721 | /* Clear all pending interrupts - UDP may be used by bootloader. */ | ||
1722 | at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff); | ||
1690 | clk_disable(udc->iclk); | 1723 | clk_disable(udc->iclk); |
1691 | 1724 | ||
1692 | /* request UDC and maybe VBUS irqs */ | 1725 | /* request UDC and maybe VBUS irqs */ |
@@ -1698,6 +1731,11 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1698 | goto fail1; | 1731 | goto fail1; |
1699 | } | 1732 | } |
1700 | if (udc->board.vbus_pin > 0) { | 1733 | if (udc->board.vbus_pin > 0) { |
1734 | /* | ||
1735 | * Get the initial state of VBUS - we cannot expect | ||
1736 | * a pending interrupt. | ||
1737 | */ | ||
1738 | udc->vbus = at91_get_gpio_value(udc->board.vbus_pin); | ||
1701 | if (request_irq(udc->board.vbus_pin, at91_vbus_irq, | 1739 | if (request_irq(udc->board.vbus_pin, at91_vbus_irq, |
1702 | IRQF_DISABLED, driver_name, udc)) { | 1740 | IRQF_DISABLED, driver_name, udc)) { |
1703 | DBG("request vbus irq %d failed\n", | 1741 | DBG("request vbus irq %d failed\n", |
@@ -1720,7 +1758,7 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1720 | fail1: | 1758 | fail1: |
1721 | device_unregister(&udc->gadget.dev); | 1759 | device_unregister(&udc->gadget.dev); |
1722 | fail0: | 1760 | fail0: |
1723 | release_mem_region(AT91RM9200_BASE_UDP, SZ_16K); | 1761 | release_mem_region(res->start, res->end - res->start + 1); |
1724 | DBG("%s probe failed, %d\n", driver_name, retval); | 1762 | DBG("%s probe failed, %d\n", driver_name, retval); |
1725 | return retval; | 1763 | return retval; |
1726 | } | 1764 | } |
@@ -1728,13 +1766,14 @@ fail0: | |||
1728 | static int __devexit at91udc_remove(struct platform_device *pdev) | 1766 | static int __devexit at91udc_remove(struct platform_device *pdev) |
1729 | { | 1767 | { |
1730 | struct at91_udc *udc = platform_get_drvdata(pdev); | 1768 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1769 | struct resource *res; | ||
1731 | 1770 | ||
1732 | DBG("remove\n"); | 1771 | DBG("remove\n"); |
1733 | 1772 | ||
1734 | pullup(udc, 0); | 1773 | if (udc->driver) |
1774 | return -EBUSY; | ||
1735 | 1775 | ||
1736 | if (udc->driver != 0) | 1776 | pullup(udc, 0); |
1737 | usb_gadget_unregister_driver(udc->driver); | ||
1738 | 1777 | ||
1739 | device_init_wakeup(&pdev->dev, 0); | 1778 | device_init_wakeup(&pdev->dev, 0); |
1740 | remove_debug_file(udc); | 1779 | remove_debug_file(udc); |
@@ -1742,7 +1781,10 @@ static int __devexit at91udc_remove(struct platform_device *pdev) | |||
1742 | free_irq(udc->board.vbus_pin, udc); | 1781 | free_irq(udc->board.vbus_pin, udc); |
1743 | free_irq(udc->udp_irq, udc); | 1782 | free_irq(udc->udp_irq, udc); |
1744 | device_unregister(&udc->gadget.dev); | 1783 | device_unregister(&udc->gadget.dev); |
1745 | release_mem_region(AT91RM9200_BASE_UDP, SZ_16K); | 1784 | |
1785 | iounmap(udc->udp_baseaddr); | ||
1786 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1787 | release_mem_region(res->start, res->end - res->start + 1); | ||
1746 | 1788 | ||
1747 | clk_put(udc->iclk); | 1789 | clk_put(udc->iclk); |
1748 | clk_put(udc->fclk); | 1790 | clk_put(udc->fclk); |
@@ -1765,16 +1807,13 @@ static int at91udc_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
1765 | || !wake | 1807 | || !wake |
1766 | || at91_suspend_entering_slow_clock()) { | 1808 | || at91_suspend_entering_slow_clock()) { |
1767 | pullup(udc, 0); | 1809 | pullup(udc, 0); |
1768 | disable_irq_wake(udc->udp_irq); | 1810 | wake = 0; |
1769 | } else | 1811 | } else |
1770 | enable_irq_wake(udc->udp_irq); | 1812 | enable_irq_wake(udc->udp_irq); |
1771 | 1813 | ||
1772 | if (udc->board.vbus_pin > 0) { | 1814 | udc->active_suspend = wake; |
1773 | if (wake) | 1815 | if (udc->board.vbus_pin > 0 && wake) |
1774 | enable_irq_wake(udc->board.vbus_pin); | 1816 | enable_irq_wake(udc->board.vbus_pin); |
1775 | else | ||
1776 | disable_irq_wake(udc->board.vbus_pin); | ||
1777 | } | ||
1778 | return 0; | 1817 | return 0; |
1779 | } | 1818 | } |
1780 | 1819 | ||
@@ -1782,8 +1821,14 @@ static int at91udc_resume(struct platform_device *pdev) | |||
1782 | { | 1821 | { |
1783 | struct at91_udc *udc = platform_get_drvdata(pdev); | 1822 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1784 | 1823 | ||
1824 | if (udc->board.vbus_pin > 0 && udc->active_suspend) | ||
1825 | disable_irq_wake(udc->board.vbus_pin); | ||
1826 | |||
1785 | /* maybe reconnect to host; if so, clocks on */ | 1827 | /* maybe reconnect to host; if so, clocks on */ |
1786 | pullup(udc, 1); | 1828 | if (udc->active_suspend) |
1829 | disable_irq_wake(udc->udp_irq); | ||
1830 | else | ||
1831 | pullup(udc, 1); | ||
1787 | return 0; | 1832 | return 0; |
1788 | } | 1833 | } |
1789 | #else | 1834 | #else |