Lines Matching refs:dwc

40 void dwc3_print_status(dwc3_t* dwc) {
41 volatile void* mmio = dwc3_mmio(dwc);
71 static void dwc3_stop(dwc3_t* dwc) {
72 volatile void* mmio = dwc3_mmio(dwc);
75 mtx_lock(&dwc->lock);
83 mtx_unlock(&dwc->lock);
86 static void dwc3_start_peripheral_mode(dwc3_t* dwc) {
87 volatile void* mmio = dwc3_mmio(dwc);
90 mtx_lock(&dwc->lock);
117 dwc3_events_start(dwc);
118 mtx_unlock(&dwc->lock);
120 dwc3_ep0_start(dwc);
122 mtx_lock(&dwc->lock);
127 mtx_unlock(&dwc->lock);
131 dwc3_t* dwc = ctx;
134 return device_get_protocol(dwc->parent, proto_id, protocol);
138 dwc3_t* dwc = ctx;
139 mtx_lock(&dwc->usb_mode_lock);
140 if (dwc->start_device_on_xhci_release) {
141 dwc3_start_peripheral_mode(dwc);
142 dwc->start_device_on_xhci_release = false;
143 dwc->usb_mode = USB_MODE_PERIPHERAL;
145 mtx_unlock(&dwc->usb_mode_lock);
154 static void dwc3_start_host_mode(dwc3_t* dwc) {
155 volatile void* mmio = dwc3_mmio(dwc);
157 mtx_lock(&dwc->lock);
162 mtx_unlock(&dwc->lock);
165 ZX_DEBUG_ASSERT(dwc->xhci_dev == NULL);
177 .ctx = dwc,
183 zx_status_t status = device_add(dwc->parent, &args, &dwc->xhci_dev);
189 void dwc3_usb_reset(dwc3_t* dwc) {
192 dwc3_ep0_reset(dwc);
194 for (unsigned i = 2; i < countof(dwc->eps); i++) {
195 dwc3_ep_end_transfers(dwc, i, ZX_ERR_IO_NOT_PRESENT);
196 dwc3_ep_set_stall(dwc, i, false);
199 dwc3_set_address(dwc, 0);
200 dwc3_ep0_start(dwc);
201 usb_dci_set_connected(&dwc->dci_intf, true);
204 void dwc3_disconnected(dwc3_t* dwc) {
207 dwc3_cmd_ep_end_transfer(dwc, EP0_OUT);
208 dwc->ep0_state = EP0_STATE_NONE;
210 if (dwc->dci_intf.ops) {
211 usb_dci_set_connected(&dwc->dci_intf, false);
214 for (unsigned i = 2; i < countof(dwc->eps); i++) {
215 dwc3_ep_end_transfers(dwc, i, ZX_ERR_IO_NOT_PRESENT);
216 dwc3_ep_set_stall(dwc, i, false);
220 void dwc3_connection_done(dwc3_t* dwc) {
221 volatile void* mmio = dwc3_mmio(dwc);
223 mtx_lock(&dwc->lock);
230 dwc->speed = USB_SPEED_HIGH;
234 dwc->speed = USB_SPEED_FULL;
239 dwc->speed = USB_SPEED_SUPER;
244 dwc->speed = USB_SPEED_UNDEFINED;
248 mtx_unlock(&dwc->lock);
251 dwc->eps[EP0_OUT].max_packet_size = ep0_max_packet;
252 dwc->eps[EP0_IN].max_packet_size = ep0_max_packet;
253 dwc3_cmd_ep_set_config(dwc, EP0_OUT, USB_ENDPOINT_CONTROL, ep0_max_packet, 0, true);
254 dwc3_cmd_ep_set_config(dwc, EP0_IN, USB_ENDPOINT_CONTROL, ep0_max_packet, 0, true);
257 usb_dci_set_speed(&dwc->dci_intf, dwc->speed);
260 void dwc3_set_address(dwc3_t* dwc, unsigned address) {
261 volatile void* mmio = dwc3_mmio(dwc);
262 mtx_lock(&dwc->lock);
264 mtx_unlock(&dwc->lock);
267 void dwc3_reset_configuration(dwc3_t* dwc) {
268 volatile void* mmio = dwc3_mmio(dwc);
270 mtx_lock(&dwc->lock);
275 mtx_unlock(&dwc->lock);
277 for (unsigned i = 2; i < countof(dwc->eps); i++) {
278 dwc3_ep_end_transfers(dwc, i, ZX_ERR_IO_NOT_PRESENT);
279 dwc3_ep_set_stall(dwc, i, false);
284 dwc3_t* dwc = ctx;
288 if (ep_num < 2 || ep_num >= countof(dwc->eps)) {
294 dwc3_ep_queue(dwc, ep_num, req);
298 dwc3_t* dwc = ctx;
299 memcpy(&dwc->dci_intf, dci_intf, sizeof(dwc->dci_intf));
305 dwc3_t* dwc = ctx;
306 return dwc3_ep_config(dwc, ep_desc, ss_comp_desc);
310 dwc3_t* dwc = ctx;
311 return dwc3_ep_disable(dwc, ep_addr);
315 dwc3_t* dwc = ctx;
316 return dwc3_ep_set_stall(dwc, dwc3_ep_num(ep_address), true);
320 dwc3_t* dwc = ctx;
321 return dwc3_ep_set_stall(dwc, dwc3_ep_num(ep_address), false);
325 dwc3_t* dwc = ctx;
326 *out_handle = dwc->bti_handle;
341 dwc3_t* dwc = ctx;
348 mtx_lock(&dwc->usb_mode_lock);
349 if (dwc->usb_mode == mode) {
350 mtx_unlock(&dwc->usb_mode_lock);
355 if (dwc->usb_mode == USB_MODE_PERIPHERAL) {
356 dwc3_events_stop(dwc);
357 zx_handle_close(dwc->irq_handle);
358 dwc->irq_handle = ZX_HANDLE_INVALID;
359 dwc3_disconnected(dwc);
360 dwc3_stop(dwc);
361 } else if (dwc->usb_mode == USB_MODE_HOST) {
362 if (dwc->xhci_dev) {
363 device_remove(dwc->xhci_dev);
364 dwc->xhci_dev = NULL;
367 dwc->start_device_on_xhci_release = true;
368 mtx_unlock(&dwc->usb_mode_lock);
374 dwc->start_device_on_xhci_release = false;
375 if (dwc->ums.ops != NULL) {
376 status = usb_mode_switch_set_mode(&dwc->ums, mode);
383 status = pdev_map_interrupt(&dwc->pdev, IRQ_USB3, &dwc->irq_handle);
389 dwc3_start_peripheral_mode(dwc);
391 dwc3_start_host_mode(dwc);
394 dwc->usb_mode = mode;
395 mtx_unlock(&dwc->usb_mode_lock);
399 if (dwc->ums.ops != NULL) {
400 usb_mode_switch_set_mode(&dwc->ums, USB_MODE_NONE);
402 dwc->usb_mode = USB_MODE_NONE;
403 mtx_unlock(&dwc->usb_mode_lock);
413 dwc3_t* dwc = ctx;
414 zx_interrupt_destroy(dwc->irq_handle);
415 thrd_join(dwc->irq_thread, NULL);
416 device_remove(dwc->zxdev);
439 dwc3_t* dwc = ctx;
441 for (unsigned i = 0; i < countof(dwc->eps); i++) {
442 dwc3_ep_fifo_release(dwc, i);
444 io_buffer_release(&dwc->event_buffer);
445 io_buffer_release(&dwc->ep0_buffer);
446 mmio_buffer_release(&dwc->mmio);
447 zx_handle_close(dwc->irq_handle);
448 zx_handle_close(dwc->bti_handle);
449 free(dwc);
461 dwc3_t* dwc = calloc(1, sizeof(dwc3_t));
462 if (!dwc) {
466 zx_status_t status = device_get_protocol(parent, ZX_PROTOCOL_PLATFORM_DEV, &dwc->pdev);
472 status = device_get_protocol(parent, ZX_PROTOCOL_USB_MODE_SWITCH, &dwc->ums);
474 dwc->ums.ops = NULL;;
477 mtx_init(&dwc->lock, mtx_plain);
478 mtx_init(&dwc->usb_mode_lock, mtx_plain);
480 status = pdev_get_bti(&dwc->pdev, 0, &dwc->bti_handle);
485 for (unsigned i = 0; i < countof(dwc->eps); i++) {
486 dwc3_endpoint_t* ep = &dwc->eps[i];
491 dwc->parent = parent;
492 dwc->usb_mode = USB_MODE_NONE;
494 status = pdev_map_mmio_buffer2(&dwc->pdev, MMIO_USB3OTG, ZX_CACHE_POLICY_UNCACHED_DEVICE,
495 &dwc->mmio);
501 status = io_buffer_init(&dwc->event_buffer, dwc->bti_handle, EVENT_BUFFER_SIZE,
507 io_buffer_cache_flush(&dwc->event_buffer, 0, EVENT_BUFFER_SIZE);
509 status = io_buffer_init(&dwc->ep0_buffer, dwc->bti_handle, 65536,
516 status = dwc3_ep0_init(dwc);
525 .ctx = dwc,
531 status = device_add(parent, &args, &dwc->zxdev);
540 dwc3_release(dwc);