|
@@ -37,6 +37,7 @@
|
|
|
#include <linux/backing-dev.h>
|
|
|
#include <linux/gfp.h>
|
|
|
#include <linux/slab.h>
|
|
|
+#include <linux/reboot.h>
|
|
|
|
|
|
#include <linux/mtd/mtd.h>
|
|
|
#include <linux/mtd/partitions.h>
|
|
@@ -365,6 +366,17 @@ static struct device_type mtd_devtype = {
|
|
|
.release = mtd_release,
|
|
|
};
|
|
|
|
|
|
+static int mtd_reboot_notifier(struct notifier_block *n, unsigned long state,
|
|
|
+ void *cmd)
|
|
|
+{
|
|
|
+ struct mtd_info *mtd;
|
|
|
+
|
|
|
+ mtd = container_of(n, struct mtd_info, reboot_notifier);
|
|
|
+ mtd->_reboot(mtd);
|
|
|
+
|
|
|
+ return NOTIFY_DONE;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* add_mtd_device - register an MTD device
|
|
|
* @mtd: pointer to new MTD device info structure
|
|
@@ -565,6 +577,11 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
|
|
|
err = -ENODEV;
|
|
|
}
|
|
|
|
|
|
+ if (mtd->_reboot) {
|
|
|
+ mtd->reboot_notifier.notifier_call = mtd_reboot_notifier;
|
|
|
+ register_reboot_notifier(&mtd->reboot_notifier);
|
|
|
+ }
|
|
|
+
|
|
|
return err;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(mtd_device_parse_register);
|
|
@@ -579,6 +596,9 @@ int mtd_device_unregister(struct mtd_info *master)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
+ if (master->_reboot)
|
|
|
+ unregister_reboot_notifier(&master->reboot_notifier);
|
|
|
+
|
|
|
err = del_mtd_partitions(master);
|
|
|
if (err)
|
|
|
return err;
|