Commit 969733f3 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Felipe Balbi

usb: gadget: pch_udc: convert to devres API

devres API allows to make error paths cleaner and less error
prone. Convert the driver to use it.
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent 5e3bd45f
...@@ -325,11 +325,8 @@ struct pch_vbus_gpio_data { ...@@ -325,11 +325,8 @@ struct pch_vbus_gpio_data {
* @pdev: reference to the PCI device * @pdev: reference to the PCI device
* @ep: array of endpoints * @ep: array of endpoints
* @lock: protects all state * @lock: protects all state
* @active: enabled the PCI device
* @stall: stall requested * @stall: stall requested
* @prot_stall: protcol stall requested * @prot_stall: protcol stall requested
* @irq_registered: irq registered with system
* @mem_region: device memory mapped
* @registered: driver registered with system * @registered: driver registered with system
* @suspended: driver in suspended state * @suspended: driver in suspended state
* @connected: gadget driver associated * @connected: gadget driver associated
...@@ -339,12 +336,8 @@ struct pch_vbus_gpio_data { ...@@ -339,12 +336,8 @@ struct pch_vbus_gpio_data {
* @data_requests: DMA pool for data requests * @data_requests: DMA pool for data requests
* @stp_requests: DMA pool for setup requests * @stp_requests: DMA pool for setup requests
* @dma_addr: DMA pool for received * @dma_addr: DMA pool for received
* @ep0out_buf: Buffer for DMA
* @setup_data: Received setup data * @setup_data: Received setup data
* @phys_addr: of device memory
* @base_addr: for mapped device memory * @base_addr: for mapped device memory
* @bar: Indicates which PCI BAR for USB regs
* @irq: IRQ line for the device
* @cfg_data: current cfg, intf, and alt in use * @cfg_data: current cfg, intf, and alt in use
* @vbus_gpio: GPIO informaton for detecting VBUS * @vbus_gpio: GPIO informaton for detecting VBUS
*/ */
...@@ -354,11 +347,9 @@ struct pch_udc_dev { ...@@ -354,11 +347,9 @@ struct pch_udc_dev {
struct pci_dev *pdev; struct pci_dev *pdev;
struct pch_udc_ep ep[PCH_UDC_EP_NUM]; struct pch_udc_ep ep[PCH_UDC_EP_NUM];
spinlock_t lock; /* protects all state */ spinlock_t lock; /* protects all state */
unsigned active:1, unsigned
stall:1, stall:1,
prot_stall:1, prot_stall:1,
irq_registered:1,
mem_region:1,
suspended:1, suspended:1,
connected:1, connected:1,
vbus_session:1, vbus_session:1,
...@@ -367,12 +358,8 @@ struct pch_udc_dev { ...@@ -367,12 +358,8 @@ struct pch_udc_dev {
struct pci_pool *data_requests; struct pci_pool *data_requests;
struct pci_pool *stp_requests; struct pci_pool *stp_requests;
dma_addr_t dma_addr; dma_addr_t dma_addr;
void *ep0out_buf;
struct usb_ctrlrequest setup_data; struct usb_ctrlrequest setup_data;
unsigned long phys_addr;
void __iomem *base_addr; void __iomem *base_addr;
unsigned bar;
unsigned irq;
struct pch_udc_cfg_data cfg_data; struct pch_udc_cfg_data cfg_data;
struct pch_vbus_gpio_data vbus_gpio; struct pch_vbus_gpio_data vbus_gpio;
}; };
...@@ -2949,6 +2936,7 @@ static int init_dma_pools(struct pch_udc_dev *dev) ...@@ -2949,6 +2936,7 @@ static int init_dma_pools(struct pch_udc_dev *dev)
{ {
struct pch_udc_stp_dma_desc *td_stp; struct pch_udc_stp_dma_desc *td_stp;
struct pch_udc_data_dma_desc *td_data; struct pch_udc_data_dma_desc *td_data;
void *ep0out_buf;
/* DMA setup */ /* DMA setup */
dev->data_requests = pci_pool_create("data_requests", dev->pdev, dev->data_requests = pci_pool_create("data_requests", dev->pdev,
...@@ -2991,10 +2979,11 @@ static int init_dma_pools(struct pch_udc_dev *dev) ...@@ -2991,10 +2979,11 @@ static int init_dma_pools(struct pch_udc_dev *dev)
dev->ep[UDC_EP0IN_IDX].td_data = NULL; dev->ep[UDC_EP0IN_IDX].td_data = NULL;
dev->ep[UDC_EP0IN_IDX].td_data_phys = 0; dev->ep[UDC_EP0IN_IDX].td_data_phys = 0;
dev->ep0out_buf = kzalloc(UDC_EP0OUT_BUFF_SIZE * 4, GFP_KERNEL); ep0out_buf = devm_kzalloc(&dev->pdev->dev, UDC_EP0OUT_BUFF_SIZE * 4,
if (!dev->ep0out_buf) GFP_KERNEL);
if (!ep0out_buf)
return -ENOMEM; return -ENOMEM;
dev->dma_addr = dma_map_single(&dev->pdev->dev, dev->ep0out_buf, dev->dma_addr = dma_map_single(&dev->pdev->dev, ep0out_buf,
UDC_EP0OUT_BUFF_SIZE * 4, UDC_EP0OUT_BUFF_SIZE * 4,
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
return 0; return 0;
...@@ -3078,22 +3067,10 @@ static void pch_udc_remove(struct pci_dev *pdev) ...@@ -3078,22 +3067,10 @@ static void pch_udc_remove(struct pci_dev *pdev)
if (dev->dma_addr) if (dev->dma_addr)
dma_unmap_single(&dev->pdev->dev, dev->dma_addr, dma_unmap_single(&dev->pdev->dev, dev->dma_addr,
UDC_EP0OUT_BUFF_SIZE * 4, DMA_FROM_DEVICE); UDC_EP0OUT_BUFF_SIZE * 4, DMA_FROM_DEVICE);
kfree(dev->ep0out_buf);
pch_vbus_gpio_free(dev); pch_vbus_gpio_free(dev);
pch_udc_exit(dev); pch_udc_exit(dev);
if (dev->irq_registered)
free_irq(pdev->irq, dev);
if (dev->base_addr)
iounmap(dev->base_addr);
if (dev->mem_region)
release_mem_region(dev->phys_addr,
pci_resource_len(pdev, dev->bar));
if (dev->active)
pci_disable_device(pdev);
kfree(dev);
} }
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
...@@ -3122,69 +3099,46 @@ static SIMPLE_DEV_PM_OPS(pch_udc_pm, pch_udc_suspend, pch_udc_resume); ...@@ -3122,69 +3099,46 @@ static SIMPLE_DEV_PM_OPS(pch_udc_pm, pch_udc_suspend, pch_udc_resume);
static int pch_udc_probe(struct pci_dev *pdev, static int pch_udc_probe(struct pci_dev *pdev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
unsigned long resource; int bar;
unsigned long len;
int retval; int retval;
struct pch_udc_dev *dev; struct pch_udc_dev *dev;
/* init */ /* init */
dev = kzalloc(sizeof *dev, GFP_KERNEL); dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
if (!dev) { if (!dev)
pr_err("%s: no memory for device structure\n", __func__);
return -ENOMEM; return -ENOMEM;
}
/* pci setup */ /* pci setup */
if (pci_enable_device(pdev) < 0) { retval = pcim_enable_device(pdev);
kfree(dev); if (retval)
pr_err("%s: pci_enable_device failed\n", __func__); return retval;
return -ENODEV;
}
dev->active = 1;
pci_set_drvdata(pdev, dev); pci_set_drvdata(pdev, dev);
/* Determine BAR based on PCI ID */ /* Determine BAR based on PCI ID */
if (id->device == PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC) if (id->device == PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC)
dev->bar = PCH_UDC_PCI_BAR_QUARK_X1000; bar = PCH_UDC_PCI_BAR_QUARK_X1000;
else else
dev->bar = PCH_UDC_PCI_BAR; bar = PCH_UDC_PCI_BAR;
/* PCI resource allocation */ /* PCI resource allocation */
resource = pci_resource_start(pdev, dev->bar); retval = pcim_iomap_regions(pdev, 1 << bar, pci_name(pdev));
len = pci_resource_len(pdev, dev->bar); if (retval)
return retval;
if (!request_mem_region(resource, len, KBUILD_MODNAME)) { dev->base_addr = pcim_iomap_table(pdev)[bar];
dev_err(&pdev->dev, "%s: pci device used already\n", __func__);
retval = -EBUSY;
goto finished;
}
dev->phys_addr = resource;
dev->mem_region = 1;
dev->base_addr = ioremap_nocache(resource, len);
if (!dev->base_addr) {
pr_err("%s: device memory cannot be mapped\n", __func__);
retval = -ENOMEM;
goto finished;
}
if (!pdev->irq) {
dev_err(&pdev->dev, "%s: irq not set\n", __func__);
retval = -ENODEV;
goto finished;
}
/* initialize the hardware */ /* initialize the hardware */
if (pch_udc_pcd_init(dev)) { if (pch_udc_pcd_init(dev))
retval = -ENODEV; return -ENODEV;
goto finished;
} retval = devm_request_irq(&pdev->dev, pdev->irq, pch_udc_isr,
if (request_irq(pdev->irq, pch_udc_isr, IRQF_SHARED, KBUILD_MODNAME, IRQF_SHARED, KBUILD_MODNAME, dev);
dev)) { if (retval) {
dev_err(&pdev->dev, "%s: request_irq(%d) fail\n", __func__, dev_err(&pdev->dev, "%s: request_irq(%d) fail\n", __func__,
pdev->irq); pdev->irq);
retval = -ENODEV;
goto finished; goto finished;
} }
dev->irq = pdev->irq;
dev->irq_registered = 1;
pci_set_master(pdev); pci_set_master(pdev);
pci_try_set_mwi(pdev); pci_try_set_mwi(pdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment