mirror of https://gitee.com/openkylin/linux.git
staging: xillybus: Use devm_ API on probe and remove
Suggested-by: Baruch Siach <baruch@tkos.co.il> Signed-off-by: Eli Billauer <eli.billauer@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6d602cf17b
commit
9267462e6c
|
@ -116,7 +116,6 @@ struct xilly_endpoint {
|
|||
*/
|
||||
struct pci_dev *pdev;
|
||||
struct device *dev;
|
||||
struct resource res; /* OF devices only */
|
||||
struct xilly_endpoint_hardware *ephw;
|
||||
|
||||
struct list_head ep_list;
|
||||
|
|
|
@ -2094,7 +2094,7 @@ struct xilly_endpoint *xillybus_init_endpoint(struct pci_dev *pdev,
|
|||
{
|
||||
struct xilly_endpoint *endpoint;
|
||||
|
||||
endpoint = kzalloc(sizeof(*endpoint), GFP_KERNEL);
|
||||
endpoint = devm_kzalloc(dev, sizeof(*endpoint), GFP_KERNEL);
|
||||
if (!endpoint) {
|
||||
dev_err(dev, "Failed to allocate memory. Aborting.\n");
|
||||
return NULL;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/err.h>
|
||||
#include "xillybus.h"
|
||||
|
||||
MODULE_DESCRIPTION("Xillybus driver for Open Firmware");
|
||||
|
@ -123,6 +124,7 @@ static int xilly_drv_probe(struct platform_device *op)
|
|||
struct xilly_endpoint *endpoint;
|
||||
int rc = 0;
|
||||
int irq;
|
||||
struct resource res;
|
||||
struct xilly_endpoint_hardware *ephw = &of_hw;
|
||||
|
||||
if (of_property_read_bool(dev->of_node, "dma-coherent"))
|
||||
|
@ -135,38 +137,26 @@ static int xilly_drv_probe(struct platform_device *op)
|
|||
|
||||
dev_set_drvdata(dev, endpoint);
|
||||
|
||||
rc = of_address_to_resource(dev->of_node, 0, &endpoint->res);
|
||||
rc = of_address_to_resource(dev->of_node, 0, &res);
|
||||
if (rc) {
|
||||
dev_warn(endpoint->dev,
|
||||
"Failed to obtain device tree resource\n");
|
||||
goto failed_request_regions;
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (!request_mem_region(endpoint->res.start,
|
||||
resource_size(&endpoint->res), xillyname)) {
|
||||
dev_err(endpoint->dev,
|
||||
"request_mem_region failed. Aborting.\n");
|
||||
rc = -EBUSY;
|
||||
goto failed_request_regions;
|
||||
}
|
||||
endpoint->registers = devm_ioremap_resource(dev, &res);
|
||||
|
||||
endpoint->registers = of_iomap(dev->of_node, 0);
|
||||
if (!endpoint->registers) {
|
||||
dev_err(endpoint->dev,
|
||||
"Failed to map I/O memory. Aborting.\n");
|
||||
rc = -EIO;
|
||||
goto failed_iomap0;
|
||||
}
|
||||
if (IS_ERR(endpoint->registers))
|
||||
return PTR_ERR(endpoint->registers);
|
||||
|
||||
irq = irq_of_parse_and_map(dev->of_node, 0);
|
||||
|
||||
rc = request_irq(irq, xillybus_isr, 0, xillyname, endpoint);
|
||||
rc = devm_request_irq(dev, irq, xillybus_isr, 0, xillyname, endpoint);
|
||||
|
||||
if (rc) {
|
||||
dev_err(endpoint->dev,
|
||||
"Failed to register IRQ handler. Aborting.\n");
|
||||
rc = -ENODEV;
|
||||
goto failed_register_irq;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rc = xillybus_endpoint_discovery(endpoint);
|
||||
|
@ -174,18 +164,8 @@ static int xilly_drv_probe(struct platform_device *op)
|
|||
if (!rc)
|
||||
return 0;
|
||||
|
||||
free_irq(irq, endpoint);
|
||||
|
||||
failed_register_irq:
|
||||
iounmap(endpoint->registers);
|
||||
failed_iomap0:
|
||||
release_mem_region(endpoint->res.start,
|
||||
resource_size(&endpoint->res));
|
||||
|
||||
failed_request_regions:
|
||||
xillybus_do_cleanup(&endpoint->cleanup, endpoint);
|
||||
|
||||
kfree(endpoint);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -193,20 +173,11 @@ static int xilly_drv_remove(struct platform_device *op)
|
|||
{
|
||||
struct device *dev = &op->dev;
|
||||
struct xilly_endpoint *endpoint = dev_get_drvdata(dev);
|
||||
int irq = irq_of_parse_and_map(dev->of_node, 0);
|
||||
|
||||
xillybus_endpoint_remove(endpoint);
|
||||
|
||||
free_irq(irq, endpoint);
|
||||
|
||||
iounmap(endpoint->registers);
|
||||
release_mem_region(endpoint->res.start,
|
||||
resource_size(&endpoint->res));
|
||||
|
||||
xillybus_do_cleanup(&endpoint->cleanup, endpoint);
|
||||
|
||||
kfree(endpoint);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -141,38 +141,32 @@ static int xilly_probe(struct pci_dev *pdev,
|
|||
|
||||
pci_set_drvdata(pdev, endpoint);
|
||||
|
||||
rc = pci_enable_device(pdev);
|
||||
rc = pcim_enable_device(pdev);
|
||||
|
||||
if (rc) {
|
||||
dev_err(endpoint->dev,
|
||||
"pcim_enable_device() failed. Aborting.\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* L0s has caused packet drops. No power saving, thank you. */
|
||||
|
||||
pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S);
|
||||
|
||||
if (rc) {
|
||||
dev_err(endpoint->dev,
|
||||
"pci_enable_device() failed. Aborting.\n");
|
||||
goto no_enable;
|
||||
}
|
||||
|
||||
if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
|
||||
dev_err(endpoint->dev,
|
||||
"Incorrect BAR configuration. Aborting.\n");
|
||||
rc = -ENODEV;
|
||||
goto bad_bar;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rc = pci_request_regions(pdev, xillyname);
|
||||
rc = pcim_iomap_regions(pdev, 0x01, xillyname);
|
||||
if (rc) {
|
||||
dev_err(endpoint->dev,
|
||||
"pci_request_regions() failed. Aborting.\n");
|
||||
goto failed_request_regions;
|
||||
"pcim_iomap_regions() failed. Aborting.\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
endpoint->registers = pci_iomap(pdev, 0, 128);
|
||||
if (!endpoint->registers) {
|
||||
dev_err(endpoint->dev, "Failed to map BAR 0. Aborting.\n");
|
||||
rc = -EIO;
|
||||
goto failed_iomap0;
|
||||
}
|
||||
endpoint->registers = pcim_iomap_table(pdev)[0];
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
|
@ -180,16 +174,15 @@ static int xilly_probe(struct pci_dev *pdev,
|
|||
if (pci_enable_msi(pdev)) {
|
||||
dev_err(endpoint->dev,
|
||||
"Failed to enable MSI interrupts. Aborting.\n");
|
||||
rc = -ENODEV;
|
||||
goto failed_enable_msi;
|
||||
return -ENODEV;
|
||||
}
|
||||
rc = request_irq(pdev->irq, xillybus_isr, 0, xillyname, endpoint);
|
||||
rc = devm_request_irq(&pdev->dev, pdev->irq, xillybus_isr, 0,
|
||||
xillyname, endpoint);
|
||||
|
||||
if (rc) {
|
||||
dev_err(endpoint->dev,
|
||||
"Failed to register MSI handler. Aborting.\n");
|
||||
rc = -ENODEV;
|
||||
goto failed_register_msi;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -203,8 +196,7 @@ static int xilly_probe(struct pci_dev *pdev,
|
|||
endpoint->dma_using_dac = 0;
|
||||
else {
|
||||
dev_err(endpoint->dev, "Failed to set DMA mask. Aborting.\n");
|
||||
rc = -ENODEV;
|
||||
goto failed_dmamask;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rc = xillybus_endpoint_discovery(endpoint);
|
||||
|
@ -212,22 +204,8 @@ static int xilly_probe(struct pci_dev *pdev,
|
|||
if (!rc)
|
||||
return 0;
|
||||
|
||||
failed_dmamask:
|
||||
free_irq(pdev->irq, endpoint);
|
||||
failed_register_msi:
|
||||
pci_disable_msi(pdev);
|
||||
failed_enable_msi:
|
||||
/* pci_clear_master(pdev); Nobody else seems to do this */
|
||||
pci_iounmap(pdev, endpoint->registers);
|
||||
failed_iomap0:
|
||||
pci_release_regions(pdev);
|
||||
failed_request_regions:
|
||||
bad_bar:
|
||||
pci_disable_device(pdev);
|
||||
no_enable:
|
||||
xillybus_do_cleanup(&endpoint->cleanup, endpoint);
|
||||
|
||||
kfree(endpoint);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -237,16 +215,7 @@ static void xilly_remove(struct pci_dev *pdev)
|
|||
|
||||
xillybus_endpoint_remove(endpoint);
|
||||
|
||||
free_irq(pdev->irq, endpoint);
|
||||
|
||||
pci_disable_msi(pdev);
|
||||
pci_iounmap(pdev, endpoint->registers);
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
|
||||
xillybus_do_cleanup(&endpoint->cleanup, endpoint);
|
||||
|
||||
kfree(endpoint);
|
||||
}
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, xillyids);
|
||||
|
|
Loading…
Reference in New Issue