powerpc/pseries: Add shutdown() to vio_driver and vio_bus
[linux-2.6-microblaze.git] / arch / powerpc / platforms / pseries / vio.c
index 429053d..e00f372 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/mm.h>
 #include <linux/dma-map-ops.h>
 #include <linux/kobject.h>
+#include <linux/kexec.h>
 
 #include <asm/iommu.h>
 #include <asm/dma.h>
@@ -1278,6 +1279,20 @@ static int vio_bus_remove(struct device *dev)
        return 0;
 }
 
+static void vio_bus_shutdown(struct device *dev)
+{
+       struct vio_dev *viodev = to_vio_dev(dev);
+       struct vio_driver *viodrv;
+
+       if (dev->driver) {
+               viodrv = to_vio_driver(dev->driver);
+               if (viodrv->shutdown)
+                       viodrv->shutdown(viodev);
+               else if (kexec_in_progress)
+                       vio_bus_remove(dev);
+       }
+}
+
 /**
  * vio_register_driver: - Register a new vio driver
  * @viodrv:    The vio_driver structure to be registered.
@@ -1617,6 +1632,7 @@ struct bus_type vio_bus_type = {
        .match = vio_bus_match,
        .probe = vio_bus_probe,
        .remove = vio_bus_remove,
+       .shutdown = vio_bus_shutdown,
 };
 
 /**