4 #include <linux/usb/ch9.h>
5 #include <linux/usb/gadget.h>
8 #include "linux-compat.h"
9 #include "usb-compat.h"
10 #include "musb_core.h"
11 #include "musb_host.h"
12 #include "musb_gadget.h"
14 #ifdef CONFIG_MUSB_HOST
16 struct usb_host_endpoint hep
;
20 static struct musb
*host
;
21 static struct usb_hcd hcd
;
22 static enum usb_device_speed host_speed
;
24 static void musb_host_complete_urb(struct urb
*urb
)
26 urb
->dev
->status
&= ~USB_ST_NOT_PROC
;
27 urb
->dev
->act_len
= urb
->actual_length
;
30 static struct usb_host_endpoint hep
;
31 static struct urb urb
;
33 static void construct_urb(struct urb
*urb
, struct usb_host_endpoint
*hep
,
34 struct usb_device
*dev
, int endpoint_type
,
35 unsigned long pipe
, void *buffer
, int len
,
36 struct devrequest
*setup
, int interval
)
38 int epnum
= usb_pipeendpoint(pipe
);
39 int is_in
= usb_pipein(pipe
);
41 memset(urb
, 0, sizeof(struct urb
));
42 memset(hep
, 0, sizeof(struct usb_host_endpoint
));
43 INIT_LIST_HEAD(&hep
->urb_list
);
44 INIT_LIST_HEAD(&urb
->urb_list
);
46 urb
->complete
= musb_host_complete_urb
;
47 urb
->status
= -EINPROGRESS
;
50 urb
->transfer_buffer
= buffer
;
51 urb
->transfer_dma
= (unsigned long)buffer
;
52 urb
->transfer_buffer_length
= len
;
53 urb
->setup_packet
= (unsigned char *)setup
;
55 urb
->ep
->desc
.wMaxPacketSize
=
56 __cpu_to_le16(is_in
? dev
->epmaxpacketin
[epnum
] :
57 dev
->epmaxpacketout
[epnum
]);
58 urb
->ep
->desc
.bmAttributes
= endpoint_type
;
59 urb
->ep
->desc
.bEndpointAddress
=
60 (is_in
? USB_DIR_IN
: USB_DIR_OUT
) | epnum
;
61 urb
->ep
->desc
.bInterval
= interval
;
64 static int submit_urb(struct usb_hcd
*hcd
, struct urb
*urb
)
66 struct musb
*host
= hcd
->hcd_priv
;
68 unsigned long timeout
;
70 ret
= musb_urb_enqueue(hcd
, urb
, 0);
72 printf("Failed to enqueue URB to controller\n");
76 timeout
= get_timer(0) + USB_TIMEOUT_MS(urb
->pipe
);
81 } while (urb
->status
== -EINPROGRESS
&&
82 get_timer(0) < timeout
);
84 if (urb
->status
== -EINPROGRESS
)
85 musb_urb_dequeue(hcd
, urb
, -ETIME
);
90 int submit_control_msg(struct usb_device
*dev
, unsigned long pipe
,
91 void *buffer
, int len
, struct devrequest
*setup
)
93 construct_urb(&urb
, &hep
, dev
, USB_ENDPOINT_XFER_CONTROL
, pipe
,
94 buffer
, len
, setup
, 0);
96 /* Fix speed for non hub-attached devices */
98 dev
->speed
= host_speed
;
100 return submit_urb(&hcd
, &urb
);
104 int submit_bulk_msg(struct usb_device
*dev
, unsigned long pipe
,
105 void *buffer
, int len
)
107 construct_urb(&urb
, &hep
, dev
, USB_ENDPOINT_XFER_BULK
, pipe
,
108 buffer
, len
, NULL
, 0);
109 return submit_urb(&hcd
, &urb
);
112 int submit_int_msg(struct usb_device
*dev
, unsigned long pipe
,
113 void *buffer
, int len
, int interval
)
115 construct_urb(&urb
, &hep
, dev
, USB_ENDPOINT_XFER_INT
, pipe
,
116 buffer
, len
, NULL
, interval
);
117 return submit_urb(&hcd
, &urb
);
120 struct int_queue
*create_int_queue(struct usb_device
*dev
, unsigned long pipe
,
121 int queuesize
, int elementsize
, void *buffer
, int interval
)
123 struct int_queue
*queue
;
124 int ret
, index
= usb_pipein(pipe
) * 16 + usb_pipeendpoint(pipe
);
126 if (queuesize
!= 1) {
127 printf("ERROR musb int-queues only support queuesize 1\n");
131 if (dev
->int_pending
& (1 << index
)) {
132 printf("ERROR int-urb is already pending on pipe %lx\n", pipe
);
136 queue
= malloc(sizeof(*queue
));
140 construct_urb(&queue
->urb
, &queue
->hep
, dev
, USB_ENDPOINT_XFER_INT
,
141 pipe
, buffer
, elementsize
, NULL
, interval
);
143 ret
= musb_urb_enqueue(&hcd
, &queue
->urb
, 0);
145 printf("Failed to enqueue URB to controller\n");
150 dev
->int_pending
|= 1 << index
;
154 int destroy_int_queue(struct usb_device
*dev
, struct int_queue
*queue
)
156 int index
= usb_pipein(queue
->urb
.pipe
) * 16 +
157 usb_pipeendpoint(queue
->urb
.pipe
);
159 if (queue
->urb
.status
== -EINPROGRESS
)
160 musb_urb_dequeue(&hcd
, &queue
->urb
, -ETIME
);
162 dev
->int_pending
&= ~(1 << index
);
167 void *poll_int_queue(struct usb_device
*dev
, struct int_queue
*queue
)
169 if (queue
->urb
.status
!= -EINPROGRESS
)
170 return NULL
; /* URB has already completed in a prev. poll */
174 if (queue
->urb
.status
!= -EINPROGRESS
)
175 return queue
->urb
.transfer_buffer
; /* Done */
177 return NULL
; /* URB still pending */
180 void usb_reset_root_port(void)
182 void *mbase
= host
->mregs
;
185 power
= musb_readb(mbase
, MUSB_POWER
);
187 musb_writeb(mbase
, MUSB_POWER
, MUSB_POWER_RESET
| power
);
189 power
= musb_readb(mbase
, MUSB_POWER
);
190 musb_writeb(mbase
, MUSB_POWER
, ~MUSB_POWER_RESET
& power
);
192 host_speed
= (musb_readb(mbase
, MUSB_POWER
) & MUSB_POWER_HSMODE
) ?
194 (musb_readb(mbase
, MUSB_DEVCTL
) & MUSB_DEVCTL_FSDEV
) ?
195 USB_SPEED_FULL
: USB_SPEED_LOW
;
196 mdelay((host_speed
== USB_SPEED_LOW
) ? 200 : 50);
199 int usb_lowlevel_init(int index
, enum usb_init_type init
, void **controller
)
202 /* USB spec says it may take up to 1 second for a device to connect */
203 unsigned long timeout
= get_timer(0) + 1000;
206 printf("MUSB host is not registered\n");
213 if (musb_readb(mbase
, MUSB_DEVCTL
) & MUSB_DEVCTL_HM
)
215 } while (get_timer(0) < timeout
);
216 if (get_timer(0) >= timeout
)
219 usb_reset_root_port();
226 int usb_lowlevel_stop(int index
)
229 printf("MUSB host is not registered\n");
236 #endif /* CONFIG_MUSB_HOST */
238 #ifdef CONFIG_MUSB_GADGET
239 static struct musb
*gadget
;
241 int usb_gadget_handle_interrupts(void)
244 if (!gadget
|| !gadget
->isr
)
247 return gadget
->isr(0, gadget
);
250 int usb_gadget_register_driver(struct usb_gadget_driver
*driver
)
254 if (!driver
|| driver
->speed
< USB_SPEED_FULL
|| !driver
->bind
||
256 printf("bad parameter.\n");
261 printf("Controller uninitialized\n");
265 ret
= musb_gadget_start(&gadget
->g
, driver
);
267 printf("gadget_start failed with %d\n", ret
);
271 ret
= driver
->bind(&gadget
->g
);
273 printf("bind failed with %d\n", ret
);
280 int usb_gadget_unregister_driver(struct usb_gadget_driver
*driver
)
282 if (driver
->disconnect
)
283 driver
->disconnect(&gadget
->g
);
285 driver
->unbind(&gadget
->g
);
288 #endif /* CONFIG_MUSB_GADGET */
290 int musb_register(struct musb_hdrc_platform_data
*plat
, void *bdata
,
295 switch (plat
->mode
) {
296 #ifdef CONFIG_MUSB_HOST
301 #ifdef CONFIG_MUSB_GADGET
302 case MUSB_PERIPHERAL
:
310 *musbp
= musb_init_controller(plat
, (struct device
*)bdata
, ctl_regs
);
312 printf("Failed to init the controller\n");