diff options
author | Sudip Mukherjee <sudipm.mukherjee@gmail.com> | 2015-09-22 18:54:27 +0530 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-10-01 12:40:20 -0500 |
commit | 580693bb3b66ce299f85f71dee60734438b1cd79 (patch) | |
tree | 41e3910df14caa1087a20d080dbfe7633a965f90 /drivers/usb/gadget/udc/amd5536udc.c | |
parent | 14a37ec6c181178a14ffb7d10a57b99ef8e6b3b3 (diff) | |
download | blackbird-op-linux-580693bb3b66ce299f85f71dee60734438b1cd79.tar.gz blackbird-op-linux-580693bb3b66ce299f85f71dee60734438b1cd79.zip |
usb: gadget: amd5536udc: fix error path
Handle the error properly instead of calling the pci remove function.
Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/gadget/udc/amd5536udc.c')
-rw-r--r-- | drivers/usb/gadget/udc/amd5536udc.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/usb/gadget/udc/amd5536udc.c b/drivers/usb/gadget/udc/amd5536udc.c index 38a68582dd6b..3f85044be196 100644 --- a/drivers/usb/gadget/udc/amd5536udc.c +++ b/drivers/usb/gadget/udc/amd5536udc.c @@ -3107,6 +3107,17 @@ static void udc_remove(struct udc *dev) udc = NULL; } +/* free all the dma pools */ +static void free_dma_pools(struct udc *dev) +{ + dma_pool_free(dev->stp_requests, dev->ep[UDC_EP0OUT_IX].td, + dev->ep[UDC_EP0OUT_IX].td_phys); + dma_pool_free(dev->stp_requests, dev->ep[UDC_EP0OUT_IX].td_stp, + dev->ep[UDC_EP0OUT_IX].td_stp_dma); + dma_pool_destroy(dev->stp_requests); + dma_pool_destroy(dev->data_requests); +} + /* Reset all pci context */ static void udc_pci_remove(struct pci_dev *pdev) { @@ -3297,7 +3308,7 @@ static int udc_pci_probe( if (use_dma) { retval = init_dma_pools(dev); if (retval != 0) - goto finished; + goto err_dma; } dev->phys_addr = resource; @@ -3305,13 +3316,17 @@ static int udc_pci_probe( dev->pdev = pdev; /* general probing */ - if (udc_probe(dev) == 0) - return 0; - -finished: - udc_pci_remove(pdev); - return retval; + if (udc_probe(dev)) { + retval = -ENODEV; + goto err_probe; + } + return 0; +err_probe: + if (use_dma) + free_dma_pools(dev); +err_dma: + free_irq(pdev->irq, dev); err_irq: iounmap(dev->virt_addr); err_ioremap: |