forked from mirrors/linux
		
	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>
This commit is contained in:
		
							parent
							
								
									e1b0f0df6a
								
							
						
					
					
						commit
						0202775bc3
					
				
					 1 changed files with 32 additions and 58 deletions
				
			
		| 
						 | 
					@ -54,101 +54,75 @@ EXPORT_SYMBOL_GPL(pxa_ssp_free);
 | 
				
			||||||
static int ce4100_spi_probe(struct pci_dev *dev,
 | 
					static int ce4100_spi_probe(struct pci_dev *dev,
 | 
				
			||||||
		const struct pci_device_id *ent)
 | 
							const struct pci_device_id *ent)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct platform_device_info pi;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
	resource_size_t phys_beg;
 | 
					 | 
				
			||||||
	resource_size_t phys_len;
 | 
					 | 
				
			||||||
	struct ce4100_info *spi_info;
 | 
						struct ce4100_info *spi_info;
 | 
				
			||||||
	struct platform_device *pdev;
 | 
						struct platform_device *pdev;
 | 
				
			||||||
	struct pxa2xx_spi_master spi_pdata;
 | 
						struct pxa2xx_spi_master spi_pdata;
 | 
				
			||||||
	struct ssp_device *ssp;
 | 
						struct ssp_device *ssp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = pci_enable_device(dev);
 | 
						ret = pcim_enable_device(dev);
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	phys_beg = pci_resource_start(dev, 0);
 | 
						ret = pcim_iomap_regions(dev, 1 << 0, "PXA2xx SPI");
 | 
				
			||||||
	phys_len = pci_resource_len(dev, 0);
 | 
						if (!ret)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!request_mem_region(phys_beg, phys_len,
 | 
					 | 
				
			||||||
				"CE4100 SPI")) {
 | 
					 | 
				
			||||||
		dev_err(&dev->dev, "Can't request register space.\n");
 | 
					 | 
				
			||||||
		ret = -EBUSY;
 | 
					 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pdev = platform_device_alloc("pxa2xx-spi", dev->devfn);
 | 
						spi_info = devm_kzalloc(&dev->dev, sizeof(*spi_info), GFP_KERNEL);
 | 
				
			||||||
	spi_info = kzalloc(sizeof(*spi_info), GFP_KERNEL);
 | 
						if (!spi_info)
 | 
				
			||||||
	if (!pdev || !spi_info ) {
 | 
							return -ENOMEM;
 | 
				
			||||||
		ret = -ENOMEM;
 | 
					
 | 
				
			||||||
		goto err_nomem;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	memset(&spi_pdata, 0, sizeof(spi_pdata));
 | 
						memset(&spi_pdata, 0, sizeof(spi_pdata));
 | 
				
			||||||
	spi_pdata.num_chipselect = dev->devfn;
 | 
						spi_pdata.num_chipselect = dev->devfn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = platform_device_add_data(pdev, &spi_pdata, sizeof(spi_pdata));
 | 
					 | 
				
			||||||
	if (ret)
 | 
					 | 
				
			||||||
		goto err_nomem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pdev->dev.parent = &dev->dev;
 | 
					 | 
				
			||||||
	pdev->dev.of_node = dev->dev.of_node;
 | 
					 | 
				
			||||||
	ssp = &spi_info->ssp;
 | 
						ssp = &spi_info->ssp;
 | 
				
			||||||
	ssp->phys_base = pci_resource_start(dev, 0);
 | 
						ssp->phys_base = pci_resource_start(dev, 0);
 | 
				
			||||||
	ssp->mmio_base = ioremap(phys_beg, phys_len);
 | 
						ssp->mmio_base = pcim_iomap_table(dev)[0];
 | 
				
			||||||
	if (!ssp->mmio_base) {
 | 
						if (!ssp->mmio_base) {
 | 
				
			||||||
		dev_err(&pdev->dev, "failed to ioremap() registers\n");
 | 
							dev_err(&dev->dev, "failed to ioremap() registers\n");
 | 
				
			||||||
		ret = -EIO;
 | 
							return -EIO;
 | 
				
			||||||
		goto err_nomem;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ssp->irq = dev->irq;
 | 
						ssp->irq = dev->irq;
 | 
				
			||||||
	ssp->port_id = pdev->id;
 | 
						ssp->port_id = dev->devfn;
 | 
				
			||||||
	ssp->type = PXA25x_SSP;
 | 
						ssp->type = PXA25x_SSP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&ssp_lock);
 | 
						mutex_lock(&ssp_lock);
 | 
				
			||||||
	list_add(&ssp->node, &ssp_list);
 | 
						list_add(&ssp->node, &ssp_list);
 | 
				
			||||||
	mutex_unlock(&ssp_lock);
 | 
						mutex_unlock(&ssp_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						memset(&pi, 0, sizeof(pi));
 | 
				
			||||||
 | 
						pi.parent = &dev->dev;
 | 
				
			||||||
 | 
						pi.name = "pxa2xx-spi";
 | 
				
			||||||
 | 
						pi.id = ssp->port_id;
 | 
				
			||||||
 | 
						pi.data = &spi_pdata;
 | 
				
			||||||
 | 
						pi.size_data = sizeof(spi_pdata);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pdev = platform_device_register_full(&pi);
 | 
				
			||||||
 | 
						if (!pdev) {
 | 
				
			||||||
 | 
							mutex_lock(&ssp_lock);
 | 
				
			||||||
 | 
							list_del(&ssp->node);
 | 
				
			||||||
 | 
							mutex_unlock(&ssp_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						spi_info->spi_pdev = pdev;
 | 
				
			||||||
	pci_set_drvdata(dev, spi_info);
 | 
						pci_set_drvdata(dev, spi_info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = platform_device_add(pdev);
 | 
						return 0;
 | 
				
			||||||
	if (ret)
 | 
					 | 
				
			||||||
		goto err_dev_add;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return ret;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
err_dev_add:
 | 
					 | 
				
			||||||
	pci_set_drvdata(dev, NULL);
 | 
					 | 
				
			||||||
	mutex_lock(&ssp_lock);
 | 
					 | 
				
			||||||
	list_del(&ssp->node);
 | 
					 | 
				
			||||||
	mutex_unlock(&ssp_lock);
 | 
					 | 
				
			||||||
	iounmap(ssp->mmio_base);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
err_nomem:
 | 
					 | 
				
			||||||
	release_mem_region(phys_beg, phys_len);
 | 
					 | 
				
			||||||
	platform_device_put(pdev);
 | 
					 | 
				
			||||||
	kfree(spi_info);
 | 
					 | 
				
			||||||
	return ret;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ce4100_spi_remove(struct pci_dev *dev)
 | 
					static void ce4100_spi_remove(struct pci_dev *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ce4100_info *spi_info;
 | 
						struct ce4100_info *spi_info = pci_get_drvdata(dev);
 | 
				
			||||||
	struct ssp_device *ssp;
 | 
						struct ssp_device *ssp = &spi_info->ssp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spi_info = pci_get_drvdata(dev);
 | 
					 | 
				
			||||||
	ssp = &spi_info->ssp;
 | 
					 | 
				
			||||||
	platform_device_unregister(spi_info->spi_pdev);
 | 
						platform_device_unregister(spi_info->spi_pdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	iounmap(ssp->mmio_base);
 | 
					 | 
				
			||||||
	release_mem_region(pci_resource_start(dev, 0),
 | 
					 | 
				
			||||||
			pci_resource_len(dev, 0));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mutex_lock(&ssp_lock);
 | 
						mutex_lock(&ssp_lock);
 | 
				
			||||||
	list_del(&ssp->node);
 | 
						list_del(&ssp->node);
 | 
				
			||||||
	mutex_unlock(&ssp_lock);
 | 
						mutex_unlock(&ssp_lock);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	pci_set_drvdata(dev, NULL);
 | 
					 | 
				
			||||||
	pci_disable_device(dev);
 | 
					 | 
				
			||||||
	kfree(spi_info);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DEFINE_PCI_DEVICE_TABLE(ce4100_spi_devices) = {
 | 
					static DEFINE_PCI_DEVICE_TABLE(ce4100_spi_devices) = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue