[PATCH] Driver Core: Add platform_device_del()

Driver core: add platform_device_del function

Having platform_device_del90 allows more straightforward error
handling code in drivers registering platform devices.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 1091af1..95ecfc4 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -168,7 +168,7 @@
 		pa->pdev.dev.release = platform_device_release;
 	}
 
-	return pa ? &pa->pdev : NULL;	
+	return pa ? &pa->pdev : NULL;
 }
 EXPORT_SYMBOL_GPL(platform_device_alloc);
 
@@ -282,6 +282,29 @@
 EXPORT_SYMBOL_GPL(platform_device_add);
 
 /**
+ *	platform_device_del - remove a platform-level device
+ *	@pdev:	platform device we're removing
+ *
+ *	Note that this function will also release all memory- and port-based
+ *	resources owned by the device (@dev->resource).
+ */
+void platform_device_del(struct platform_device *pdev)
+{
+	int i;
+
+	if (pdev) {
+		for (i = 0; i < pdev->num_resources; i++) {
+			struct resource *r = &pdev->resource[i];
+			if (r->flags & (IORESOURCE_MEM|IORESOURCE_IO))
+				release_resource(r);
+		}
+
+		device_del(&pdev->dev);
+	}
+}
+EXPORT_SYMBOL_GPL(platform_device_del);
+
+/**
  *	platform_device_register - add a platform-level device
  *	@pdev:	platform device we're adding
  *
@@ -293,25 +316,17 @@
 }
 
 /**
- *	platform_device_unregister - remove a platform-level device
- *	@pdev:	platform device we're removing
+ *	platform_device_unregister - unregister a platform-level device
+ *	@pdev:	platform device we're unregistering
  *
- *	Note that this function will also release all memory- and port-based
- *	resources owned by the device (@dev->resource).
+ *	Unregistration is done in 2 steps. Fisrt we release all resources
+ *	and remove it from the sybsystem, then we drop reference count by
+ *	calling platform_device_put().
  */
 void platform_device_unregister(struct platform_device * pdev)
 {
-	int i;
-
-	if (pdev) {
-		for (i = 0; i < pdev->num_resources; i++) {
-			struct resource *r = &pdev->resource[i];
-			if (r->flags & (IORESOURCE_MEM|IORESOURCE_IO))
-				release_resource(r);
-		}
-
-		device_unregister(&pdev->dev);
-	}
+	platform_device_del(pdev);
+	platform_device_put(pdev);
 }
 
 /**