s390/pci: implement pcibios_remove_bus
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Tue, 12 Nov 2013 18:35:01 +0000 (19:35 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 15 Nov 2013 13:08:38 +0000 (14:08 +0100)
Implement pcibios_remove_bus to free arch specific data when a pci
bus is deregistered. While at it remove a useless kzalloc/kfree
wrapper.

Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/pci.h
arch/s390/pci/pci.c
arch/s390/pci/pci_clp.c

index b9315c4..c129ab2 100644 (file)
@@ -124,12 +124,10 @@ static inline bool zdev_enabled(struct zpci_dev *zdev)
   Prototypes
 ----------------------------------------------------------------------------- */
 /* Base stuff */
-struct zpci_dev *zpci_alloc_device(void);
 int zpci_create_device(struct zpci_dev *);
 int zpci_enable_device(struct zpci_dev *);
 int zpci_disable_device(struct zpci_dev *);
 void zpci_stop_device(struct zpci_dev *);
-void zpci_free_device(struct zpci_dev *);
 int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
 int zpci_unregister_ioat(struct zpci_dev *, u8);
 
index 63a0860..bf7c73d 100644 (file)
@@ -530,20 +530,6 @@ static void zpci_unmap_resources(struct zpci_dev *zdev)
        }
 }
 
-struct zpci_dev *zpci_alloc_device(void)
-{
-       struct zpci_dev *zdev;
-
-       /* Alloc memory for our private pci device data */
-       zdev = kzalloc(sizeof(*zdev), GFP_KERNEL);
-       return zdev ? : ERR_PTR(-ENOMEM);
-}
-
-void zpci_free_device(struct zpci_dev *zdev)
-{
-       kfree(zdev);
-}
-
 int pcibios_add_platform_entries(struct pci_dev *pdev)
 {
        return zpci_sysfs_add_device(&pdev->dev);
@@ -774,26 +760,6 @@ struct dev_pm_ops pcibios_pm_ops = {
 };
 #endif /* CONFIG_HIBERNATE_CALLBACKS */
 
-static int zpci_scan_bus(struct zpci_dev *zdev)
-{
-       LIST_HEAD(resources);
-       int ret;
-
-       ret = zpci_setup_bus_resources(zdev, &resources);
-       if (ret)
-               return ret;
-
-       zdev->bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops,
-                                     zdev, &resources);
-       if (!zdev->bus) {
-               zpci_cleanup_bus_resources(zdev);
-               return -EIO;
-       }
-
-       zdev->bus->max_bus_speed = zdev->max_bus_speed;
-       return 0;
-}
-
 static int zpci_alloc_domain(struct zpci_dev *zdev)
 {
        spin_lock(&zpci_domain_lock);
@@ -814,6 +780,41 @@ static void zpci_free_domain(struct zpci_dev *zdev)
        spin_unlock(&zpci_domain_lock);
 }
 
+void pcibios_remove_bus(struct pci_bus *bus)
+{
+       struct zpci_dev *zdev = get_zdev_by_bus(bus);
+
+       zpci_exit_slot(zdev);
+       zpci_cleanup_bus_resources(zdev);
+       zpci_free_domain(zdev);
+
+       spin_lock(&zpci_list_lock);
+       list_del(&zdev->entry);
+       spin_unlock(&zpci_list_lock);
+
+       kfree(zdev);
+}
+
+static int zpci_scan_bus(struct zpci_dev *zdev)
+{
+       LIST_HEAD(resources);
+       int ret;
+
+       ret = zpci_setup_bus_resources(zdev, &resources);
+       if (ret)
+               return ret;
+
+       zdev->bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops,
+                                     zdev, &resources);
+       if (!zdev->bus) {
+               zpci_cleanup_bus_resources(zdev);
+               return -EIO;
+       }
+
+       zdev->bus->max_bus_speed = zdev->max_bus_speed;
+       return 0;
+}
+
 int zpci_enable_device(struct zpci_dev *zdev)
 {
        int rc;
index 8414798..c747394 100644 (file)
@@ -155,9 +155,9 @@ int clp_add_pci_device(u32 fid, u32 fh, int configured)
        int rc;
 
        zpci_dbg(3, "add fid:%x, fh:%x, c:%d\n", fid, fh, configured);
-       zdev = zpci_alloc_device();
-       if (IS_ERR(zdev))
-               return PTR_ERR(zdev);
+       zdev = kzalloc(sizeof(*zdev), GFP_KERNEL);
+       if (!zdev)
+               return -ENOMEM;
 
        zdev->fh = fh;
        zdev->fid = fid;
@@ -178,7 +178,7 @@ int clp_add_pci_device(u32 fid, u32 fh, int configured)
        return 0;
 
 error:
-       zpci_free_device(zdev);
+       kfree(zdev);
        return rc;
 }