Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0202775b authored by Mika Westerberg's avatar Mika Westerberg Committed by Mark Brown
Browse files

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: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent e1b0f0df
Loading
Loading
Loading
Loading
+30 −56
Original line number Original line Diff line number Diff line
@@ -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);


	pci_set_drvdata(dev, spi_info);
	memset(&pi, 0, sizeof(pi));

	pi.parent = &dev->dev;
	ret = platform_device_add(pdev);
	pi.name = "pxa2xx-spi";
	if (ret)
	pi.id = ssp->port_id;
		goto err_dev_add;
	pi.data = &spi_pdata;

	pi.size_data = sizeof(spi_pdata);
	return ret;


err_dev_add:
	pdev = platform_device_register_full(&pi);
	pci_set_drvdata(dev, NULL);
	if (!pdev) {
		mutex_lock(&ssp_lock);
		mutex_lock(&ssp_lock);
		list_del(&ssp->node);
		list_del(&ssp->node);
		mutex_unlock(&ssp_lock);
		mutex_unlock(&ssp_lock);
	iounmap(ssp->mmio_base);


err_nomem:
		return -ENOMEM;
	release_mem_region(phys_beg, phys_len);
	}
	platform_device_put(pdev);

	kfree(spi_info);
	spi_info->spi_pdev = pdev;
	return ret;
	pci_set_drvdata(dev, spi_info);

	return 0;
}
}


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) = {