diff options
Diffstat (limited to 'drivers/usb/gadget/fusb300_udc.c')
-rw-r--r-- | drivers/usb/gadget/fusb300_udc.c | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/drivers/usb/gadget/fusb300_udc.c b/drivers/usb/gadget/fusb300_udc.c index 066cb89376de..cec8871b77f9 100644 --- a/drivers/usb/gadget/fusb300_udc.c +++ b/drivers/usb/gadget/fusb300_udc.c | |||
@@ -394,7 +394,7 @@ static void fusb300_clear_epnstall(struct fusb300 *fusb300, u8 ep) | |||
394 | 394 | ||
395 | if (reg & FUSB300_EPSET0_STL) { | 395 | if (reg & FUSB300_EPSET0_STL) { |
396 | printk(KERN_DEBUG "EP%d stall... Clear!!\n", ep); | 396 | printk(KERN_DEBUG "EP%d stall... Clear!!\n", ep); |
397 | reg &= ~FUSB300_EPSET0_STL; | 397 | reg |= FUSB300_EPSET0_STL_CLR; |
398 | iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); | 398 | iowrite32(reg, fusb300->reg + FUSB300_OFFSET_EPSET0(ep)); |
399 | } | 399 | } |
400 | } | 400 | } |
@@ -930,33 +930,33 @@ static void fusb300_wait_idma_finished(struct fusb300_ep *ep) | |||
930 | 930 | ||
931 | fusb300_clear_int(ep->fusb300, FUSB300_OFFSET_IGR0, | 931 | fusb300_clear_int(ep->fusb300, FUSB300_OFFSET_IGR0, |
932 | FUSB300_IGR0_EPn_PRD_INT(ep->epnum)); | 932 | FUSB300_IGR0_EPn_PRD_INT(ep->epnum)); |
933 | return; | ||
934 | |||
933 | IDMA_RESET: | 935 | IDMA_RESET: |
934 | fusb300_clear_int(ep->fusb300, FUSB300_OFFSET_IGER0, | 936 | reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_IGER0); |
935 | FUSB300_IGER0_EEPn_PRD_INT(ep->epnum)); | 937 | reg &= ~FUSB300_IGER0_EEPn_PRD_INT(ep->epnum); |
938 | iowrite32(reg, ep->fusb300->reg + FUSB300_OFFSET_IGER0); | ||
936 | } | 939 | } |
937 | 940 | ||
938 | static void fusb300_set_idma(struct fusb300_ep *ep, | 941 | static void fusb300_set_idma(struct fusb300_ep *ep, |
939 | struct fusb300_request *req) | 942 | struct fusb300_request *req) |
940 | { | 943 | { |
941 | dma_addr_t d; | 944 | int ret; |
942 | |||
943 | d = dma_map_single(NULL, req->req.buf, req->req.length, DMA_TO_DEVICE); | ||
944 | 945 | ||
945 | if (dma_mapping_error(NULL, d)) { | 946 | ret = usb_gadget_map_request(&ep->fusb300->gadget, |
946 | printk(KERN_DEBUG "dma_mapping_error\n"); | 947 | &req->req, DMA_TO_DEVICE); |
948 | if (ret) | ||
947 | return; | 949 | return; |
948 | } | ||
949 | |||
950 | dma_sync_single_for_device(NULL, d, req->req.length, DMA_TO_DEVICE); | ||
951 | 950 | ||
952 | fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_IGER0, | 951 | fusb300_enable_bit(ep->fusb300, FUSB300_OFFSET_IGER0, |
953 | FUSB300_IGER0_EEPn_PRD_INT(ep->epnum)); | 952 | FUSB300_IGER0_EEPn_PRD_INT(ep->epnum)); |
954 | 953 | ||
955 | fusb300_fill_idma_prdtbl(ep, d, req->req.length); | 954 | fusb300_fill_idma_prdtbl(ep, req->req.dma, req->req.length); |
956 | /* check idma is done */ | 955 | /* check idma is done */ |
957 | fusb300_wait_idma_finished(ep); | 956 | fusb300_wait_idma_finished(ep); |
958 | 957 | ||
959 | dma_unmap_single(NULL, d, req->req.length, DMA_TO_DEVICE); | 958 | usb_gadget_unmap_request(&ep->fusb300->gadget, |
959 | &req->req, DMA_TO_DEVICE); | ||
960 | } | 960 | } |
961 | 961 | ||
962 | static void in_ep_fifo_handler(struct fusb300_ep *ep) | 962 | static void in_ep_fifo_handler(struct fusb300_ep *ep) |
@@ -1316,7 +1316,6 @@ static int fusb300_udc_start(struct usb_gadget *g, | |||
1316 | /* hook up the driver */ | 1316 | /* hook up the driver */ |
1317 | driver->driver.bus = NULL; | 1317 | driver->driver.bus = NULL; |
1318 | fusb300->driver = driver; | 1318 | fusb300->driver = driver; |
1319 | fusb300->gadget.dev.driver = &driver->driver; | ||
1320 | 1319 | ||
1321 | return 0; | 1320 | return 0; |
1322 | } | 1321 | } |
@@ -1327,7 +1326,6 @@ static int fusb300_udc_stop(struct usb_gadget *g, | |||
1327 | struct fusb300 *fusb300 = to_fusb300(g); | 1326 | struct fusb300 *fusb300 = to_fusb300(g); |
1328 | 1327 | ||
1329 | driver->unbind(&fusb300->gadget); | 1328 | driver->unbind(&fusb300->gadget); |
1330 | fusb300->gadget.dev.driver = NULL; | ||
1331 | 1329 | ||
1332 | init_controller(fusb300); | 1330 | init_controller(fusb300); |
1333 | fusb300->driver = NULL; | 1331 | fusb300->driver = NULL; |
@@ -1422,14 +1420,7 @@ static int __init fusb300_probe(struct platform_device *pdev) | |||
1422 | 1420 | ||
1423 | fusb300->gadget.ops = &fusb300_gadget_ops; | 1421 | fusb300->gadget.ops = &fusb300_gadget_ops; |
1424 | 1422 | ||
1425 | device_initialize(&fusb300->gadget.dev); | ||
1426 | |||
1427 | dev_set_name(&fusb300->gadget.dev, "gadget"); | ||
1428 | |||
1429 | fusb300->gadget.max_speed = USB_SPEED_HIGH; | 1423 | fusb300->gadget.max_speed = USB_SPEED_HIGH; |
1430 | fusb300->gadget.dev.parent = &pdev->dev; | ||
1431 | fusb300->gadget.dev.dma_mask = pdev->dev.dma_mask; | ||
1432 | fusb300->gadget.dev.release = pdev->dev.release; | ||
1433 | fusb300->gadget.name = udc_name; | 1424 | fusb300->gadget.name = udc_name; |
1434 | fusb300->reg = reg; | 1425 | fusb300->reg = reg; |
1435 | 1426 | ||
@@ -1478,19 +1469,10 @@ static int __init fusb300_probe(struct platform_device *pdev) | |||
1478 | if (ret) | 1469 | if (ret) |
1479 | goto err_add_udc; | 1470 | goto err_add_udc; |
1480 | 1471 | ||
1481 | ret = device_add(&fusb300->gadget.dev); | ||
1482 | if (ret) { | ||
1483 | pr_err("device_add error (%d)\n", ret); | ||
1484 | goto err_add_device; | ||
1485 | } | ||
1486 | |||
1487 | dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION); | 1472 | dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION); |
1488 | 1473 | ||
1489 | return 0; | 1474 | return 0; |
1490 | 1475 | ||
1491 | err_add_device: | ||
1492 | usb_del_gadget_udc(&fusb300->gadget); | ||
1493 | |||
1494 | err_add_udc: | 1476 | err_add_udc: |
1495 | fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req); | 1477 | fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req); |
1496 | 1478 | ||