aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/fusb300_udc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/fusb300_udc.c')
-rw-r--r--drivers/usb/gadget/fusb300_udc.c46
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
933IDMA_RESET: 935IDMA_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
938static void fusb300_set_idma(struct fusb300_ep *ep, 941static 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
962static void in_ep_fifo_handler(struct fusb300_ep *ep) 962static 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
1491err_add_device:
1492 usb_del_gadget_udc(&fusb300->gadget);
1493
1494err_add_udc: 1476err_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