diff options
| author | Mika Westerberg <mika.westerberg@linux.intel.com> | 2013-01-07 05:44:32 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-01-08 05:59:08 -0500 |
| commit | 0202775bc3a28f2436ea6ee13ef3eb0e8f237857 (patch) | |
| tree | 3431707a3563d7c4909b9f5f3cc1d6ca6894c31b | |
| parent | e1b0f0df6a08329ce2f123240a5218c3e5c43b74 (diff) | |
spi/pxa2xx-pci: switch to use pcim_* interfaces
Instead of open-coding all the error management in the driver we can take
advantage of the pcim_* interfaces that release the resources automatically.
We also use platform_device_register_full() to register the platform device
because it allows us to create and register the platform device at one go,
simplifying the error management.
This a preparatory step for getting rid of pxa_ssp_request()/free() which
we will do in the next patch.
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
| -rw-r--r-- | drivers/spi/spi-pxa2xx-pci.c | 86 |
1 files changed, 30 insertions, 56 deletions
diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c index cf95587eefde..ece979e9c642 100644 --- a/drivers/spi/spi-pxa2xx-pci.c +++ b/drivers/spi/spi-pxa2xx-pci.c | |||
| @@ -54,101 +54,75 @@ EXPORT_SYMBOL_GPL(pxa_ssp_free); | |||
| 54 | static int ce4100_spi_probe(struct pci_dev *dev, | 54 | static int ce4100_spi_probe(struct pci_dev *dev, |
| 55 | const struct pci_device_id *ent) | 55 | const struct pci_device_id *ent) |
| 56 | { | 56 | { |
| 57 | struct platform_device_info pi; | ||
| 57 | int ret; | 58 | int ret; |
| 58 | resource_size_t phys_beg; | ||
| 59 | resource_size_t phys_len; | ||
| 60 | struct ce4100_info *spi_info; | 59 | struct ce4100_info *spi_info; |
| 61 | struct platform_device *pdev; | 60 | struct platform_device *pdev; |
| 62 | struct pxa2xx_spi_master spi_pdata; | 61 | struct pxa2xx_spi_master spi_pdata; |
| 63 | struct ssp_device *ssp; | 62 | struct ssp_device *ssp; |
| 64 | 63 | ||
| 65 | ret = pci_enable_device(dev); | 64 | ret = pcim_enable_device(dev); |
| 66 | if (ret) | 65 | if (ret) |
| 67 | return ret; | 66 | return ret; |
| 68 | 67 | ||
| 69 | phys_beg = pci_resource_start(dev, 0); | 68 | ret = pcim_iomap_regions(dev, 1 << 0, "PXA2xx SPI"); |
| 70 | phys_len = pci_resource_len(dev, 0); | 69 | if (!ret) |
| 71 | |||
| 72 | if (!request_mem_region(phys_beg, phys_len, | ||
| 73 | "CE4100 SPI")) { | ||
| 74 | dev_err(&dev->dev, "Can't request register space.\n"); | ||
| 75 | ret = -EBUSY; | ||
| 76 | return ret; | 70 | return ret; |
| 77 | } | ||
| 78 | 71 | ||
| 79 | pdev = platform_device_alloc("pxa2xx-spi", dev->devfn); | 72 | spi_info = devm_kzalloc(&dev->dev, sizeof(*spi_info), GFP_KERNEL); |
| 80 | spi_info = kzalloc(sizeof(*spi_info), GFP_KERNEL); | 73 | if (!spi_info) |
| 81 | if (!pdev || !spi_info ) { | 74 | return -ENOMEM; |
| 82 | ret = -ENOMEM; | 75 | |
| 83 | goto err_nomem; | ||
| 84 | } | ||
| 85 | memset(&spi_pdata, 0, sizeof(spi_pdata)); | 76 | memset(&spi_pdata, 0, sizeof(spi_pdata)); |
| 86 | spi_pdata.num_chipselect = dev->devfn; | 77 | spi_pdata.num_chipselect = dev->devfn; |
| 87 | 78 | ||
| 88 | ret = platform_device_add_data(pdev, &spi_pdata, sizeof(spi_pdata)); | ||
| 89 | if (ret) | ||
| 90 | goto err_nomem; | ||
| 91 | |||
| 92 | pdev->dev.parent = &dev->dev; | ||
| 93 | pdev->dev.of_node = dev->dev.of_node; | ||
| 94 | ssp = &spi_info->ssp; | 79 | ssp = &spi_info->ssp; |
| 95 | ssp->phys_base = pci_resource_start(dev, 0); | 80 | ssp->phys_base = pci_resource_start(dev, 0); |
| 96 | ssp->mmio_base = ioremap(phys_beg, phys_len); | 81 | ssp->mmio_base = pcim_iomap_table(dev)[0]; |
| 97 | if (!ssp->mmio_base) { | 82 | if (!ssp->mmio_base) { |
| 98 | dev_err(&pdev->dev, "failed to ioremap() registers\n"); | 83 | dev_err(&dev->dev, "failed to ioremap() registers\n"); |
| 99 | ret = -EIO; | 84 | return -EIO; |
| 100 | goto err_nomem; | ||
| 101 | } | 85 | } |
| 102 | ssp->irq = dev->irq; | 86 | ssp->irq = dev->irq; |
| 103 | ssp->port_id = pdev->id; | 87 | ssp->port_id = dev->devfn; |
| 104 | ssp->type = PXA25x_SSP; | 88 | ssp->type = PXA25x_SSP; |
| 105 | 89 | ||
| 106 | mutex_lock(&ssp_lock); | 90 | mutex_lock(&ssp_lock); |
| 107 | list_add(&ssp->node, &ssp_list); | 91 | list_add(&ssp->node, &ssp_list); |
| 108 | mutex_unlock(&ssp_lock); | 92 | mutex_unlock(&ssp_lock); |
| 109 | 93 | ||
| 110 | pci_set_drvdata(dev, spi_info); | 94 | memset(&pi, 0, sizeof(pi)); |
| 95 | pi.parent = &dev->dev; | ||
| 96 | pi.name = "pxa2xx-spi"; | ||
| 97 | pi.id = ssp->port_id; | ||
| 98 | pi.data = &spi_pdata; | ||
| 99 | pi.size_data = sizeof(spi_pdata); | ||
| 111 | 100 | ||
| 112 | ret = platform_device_add(pdev); | 101 | pdev = platform_device_register_full(&pi); |
| 113 | if (ret) | 102 | if (!pdev) { |
| 114 | goto err_dev_add; | 103 | mutex_lock(&ssp_lock); |
| 104 | list_del(&ssp->node); | ||
| 105 | mutex_unlock(&ssp_lock); | ||
| 115 | 106 | ||
| 116 | return ret; | 107 | return -ENOMEM; |
| 108 | } | ||
| 117 | 109 | ||
| 118 | err_dev_add: | 110 | spi_info->spi_pdev = pdev; |
| 119 | pci_set_drvdata(dev, NULL); | 111 | pci_set_drvdata(dev, spi_info); |
| 120 | mutex_lock(&ssp_lock); | ||
| 121 | list_del(&ssp->node); | ||
| 122 | mutex_unlock(&ssp_lock); | ||
| 123 | iounmap(ssp->mmio_base); | ||
| 124 | 112 | ||
| 125 | err_nomem: | 113 | return 0; |
| 126 | release_mem_region(phys_beg, phys_len); | ||
| 127 | platform_device_put(pdev); | ||
| 128 | kfree(spi_info); | ||
| 129 | return ret; | ||
| 130 | } | 114 | } |
| 131 | 115 | ||
| 132 | static void ce4100_spi_remove(struct pci_dev *dev) | 116 | static void ce4100_spi_remove(struct pci_dev *dev) |
| 133 | { | 117 | { |
| 134 | struct ce4100_info *spi_info; | 118 | struct ce4100_info *spi_info = pci_get_drvdata(dev); |
| 135 | struct ssp_device *ssp; | 119 | struct ssp_device *ssp = &spi_info->ssp; |
| 136 | 120 | ||
| 137 | spi_info = pci_get_drvdata(dev); | ||
| 138 | ssp = &spi_info->ssp; | ||
| 139 | platform_device_unregister(spi_info->spi_pdev); | 121 | platform_device_unregister(spi_info->spi_pdev); |
| 140 | 122 | ||
| 141 | iounmap(ssp->mmio_base); | ||
| 142 | release_mem_region(pci_resource_start(dev, 0), | ||
| 143 | pci_resource_len(dev, 0)); | ||
| 144 | |||
| 145 | mutex_lock(&ssp_lock); | 123 | mutex_lock(&ssp_lock); |
| 146 | list_del(&ssp->node); | 124 | list_del(&ssp->node); |
| 147 | mutex_unlock(&ssp_lock); | 125 | mutex_unlock(&ssp_lock); |
| 148 | |||
| 149 | pci_set_drvdata(dev, NULL); | ||
| 150 | pci_disable_device(dev); | ||
| 151 | kfree(spi_info); | ||
| 152 | } | 126 | } |
| 153 | 127 | ||
| 154 | static DEFINE_PCI_DEVICE_TABLE(ce4100_spi_devices) = { | 128 | static DEFINE_PCI_DEVICE_TABLE(ce4100_spi_devices) = { |
