diff options
Diffstat (limited to 'arch/s390/pci/pci.c')
| -rw-r--r-- | arch/s390/pci/pci.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index ef38b1514c77..e16afacc8fd1 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -544,8 +544,7 @@ static struct resource *__alloc_res(struct zpci_dev *zdev, unsigned long start,  	return r;  } -int zpci_setup_bus_resources(struct zpci_dev *zdev, -			     struct list_head *resources) +int zpci_setup_bus_resources(struct zpci_dev *zdev)  {  	unsigned long addr, size, flags;  	struct resource *res; @@ -581,7 +580,6 @@ int zpci_setup_bus_resources(struct zpci_dev *zdev,  			return -ENOMEM;  		}  		zdev->bars[i].res = res; -		pci_add_resource(resources, res);  	}  	zdev->has_resources = 1; @@ -590,17 +588,23 @@ int zpci_setup_bus_resources(struct zpci_dev *zdev,  static void zpci_cleanup_bus_resources(struct zpci_dev *zdev)  { +	struct resource *res;  	int i; +	pci_lock_rescan_remove();  	for (i = 0; i < PCI_STD_NUM_BARS; i++) { -		if (!zdev->bars[i].size || !zdev->bars[i].res) +		res = zdev->bars[i].res; +		if (!res)  			continue; +		release_resource(res); +		pci_bus_remove_resource(zdev->zbus->bus, res);  		zpci_free_iomap(zdev, zdev->bars[i].map_idx); -		release_resource(zdev->bars[i].res); -		kfree(zdev->bars[i].res); +		zdev->bars[i].res = NULL; +		kfree(res);  	}  	zdev->has_resources = 0; +	pci_unlock_rescan_remove();  }  int pcibios_device_add(struct pci_dev *pdev)  |