diff options
Diffstat (limited to 'drivers/mcb/mcb-pci.c')
| -rw-r--r-- | drivers/mcb/mcb-pci.c | 27 | 
1 files changed, 18 insertions, 9 deletions
| diff --git a/drivers/mcb/mcb-pci.c b/drivers/mcb/mcb-pci.c index b59181965643..5e1bd5db02c8 100644 --- a/drivers/mcb/mcb-pci.c +++ b/drivers/mcb/mcb-pci.c @@ -17,6 +17,7 @@  struct priv {  	struct mcb_bus *bus; +	phys_addr_t mapbase;  	void __iomem *base;  }; @@ -31,8 +32,8 @@ static int mcb_pci_get_irq(struct mcb_device *mdev)  static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  { +	struct resource *res;  	struct priv *priv; -	phys_addr_t mapbase;  	int ret;  	int num_cells;  	unsigned long flags; @@ -47,19 +48,21 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  		return -ENODEV;  	} -	mapbase = pci_resource_start(pdev, 0); -	if (!mapbase) { +	priv->mapbase = pci_resource_start(pdev, 0); +	if (!priv->mapbase) {  		dev_err(&pdev->dev, "No PCI resource\n");  		goto err_start;  	} -	ret = pci_request_region(pdev, 0, KBUILD_MODNAME); -	if (ret) { -		dev_err(&pdev->dev, "Failed to request PCI BARs\n"); +	res = request_mem_region(priv->mapbase, CHAM_HEADER_SIZE, +				 KBUILD_MODNAME); +	if (IS_ERR(res)) { +		dev_err(&pdev->dev, "Failed to request PCI memory\n"); +		ret = PTR_ERR(res);  		goto err_start;  	} -	priv->base = pci_iomap(pdev, 0, 0); +	priv->base = ioremap(priv->mapbase, CHAM_HEADER_SIZE);  	if (!priv->base) {  		dev_err(&pdev->dev, "Cannot ioremap\n");  		ret = -ENOMEM; @@ -84,7 +87,7 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	priv->bus->get_irq = mcb_pci_get_irq; -	ret = chameleon_parse_cells(priv->bus, mapbase, priv->base); +	ret = chameleon_parse_cells(priv->bus, priv->mapbase, priv->base);  	if (ret < 0)  		goto err_drvdata;  	num_cells = ret; @@ -93,8 +96,10 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	mcb_bus_add_devices(priv->bus); +	return 0; +  err_drvdata: -	pci_iounmap(pdev, priv->base); +	iounmap(priv->base);  err_ioremap:  	pci_release_region(pdev, 0);  err_start: @@ -107,6 +112,10 @@ static void mcb_pci_remove(struct pci_dev *pdev)  	struct priv *priv = pci_get_drvdata(pdev);  	mcb_release_bus(priv->bus); + +	iounmap(priv->base); +	release_region(priv->mapbase, CHAM_HEADER_SIZE); +	pci_disable_device(pdev);  }  static const struct pci_device_id mcb_pci_tbl[] = { | 
