Browse Source

[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>
Dmitry Torokhov 19 years ago
parent
commit
93ce3061be
2 changed files with 31 additions and 15 deletions
  1. 30 15
      drivers/base/platform.c
  2. 1 0
      include/linux/platform_device.h

+ 30 - 15
drivers/base/platform.c

@@ -168,7 +168,7 @@ struct platform_device *platform_device_alloc(const char *name, unsigned int id)
 		pa->pdev.dev.release = platform_device_release;
 		pa->pdev.dev.release = platform_device_release;
 	}
 	}
 
 
-	return pa ? &pa->pdev : NULL;	
+	return pa ? &pa->pdev : NULL;
 }
 }
 EXPORT_SYMBOL_GPL(platform_device_alloc);
 EXPORT_SYMBOL_GPL(platform_device_alloc);
 
 
@@ -282,24 +282,13 @@ int platform_device_add(struct platform_device *pdev)
 EXPORT_SYMBOL_GPL(platform_device_add);
 EXPORT_SYMBOL_GPL(platform_device_add);
 
 
 /**
 /**
- *	platform_device_register - add a platform-level device
- *	@pdev:	platform device we're adding
- *
- */
-int platform_device_register(struct platform_device * pdev)
-{
-	device_initialize(&pdev->dev);
-	return platform_device_add(pdev);
-}
-
-/**
- *	platform_device_unregister - remove a platform-level device
+ *	platform_device_del - remove a platform-level device
  *	@pdev:	platform device we're removing
  *	@pdev:	platform device we're removing
  *
  *
  *	Note that this function will also release all memory- and port-based
  *	Note that this function will also release all memory- and port-based
  *	resources owned by the device (@dev->resource).
  *	resources owned by the device (@dev->resource).
  */
  */
-void platform_device_unregister(struct platform_device * pdev)
+void platform_device_del(struct platform_device *pdev)
 {
 {
 	int i;
 	int i;
 
 
@@ -310,9 +299,35 @@ void platform_device_unregister(struct platform_device * pdev)
 				release_resource(r);
 				release_resource(r);
 		}
 		}
 
 
-		device_unregister(&pdev->dev);
+		device_del(&pdev->dev);
 	}
 	}
 }
 }
+EXPORT_SYMBOL_GPL(platform_device_del);
+
+/**
+ *	platform_device_register - add a platform-level device
+ *	@pdev:	platform device we're adding
+ *
+ */
+int platform_device_register(struct platform_device * pdev)
+{
+	device_initialize(&pdev->dev);
+	return platform_device_add(pdev);
+}
+
+/**
+ *	platform_device_unregister - unregister a platform-level device
+ *	@pdev:	platform device we're unregistering
+ *
+ *	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)
+{
+	platform_device_del(pdev);
+	platform_device_put(pdev);
+}
 
 
 /**
 /**
  *	platform_device_register_simple
  *	platform_device_register_simple

+ 1 - 0
include/linux/platform_device.h

@@ -41,6 +41,7 @@ extern struct platform_device *platform_device_alloc(const char *name, unsigned
 extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num);
 extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num);
 extern int platform_device_add_data(struct platform_device *pdev, void *data, size_t size);
 extern int platform_device_add_data(struct platform_device *pdev, void *data, size_t size);
 extern int platform_device_add(struct platform_device *pdev);
 extern int platform_device_add(struct platform_device *pdev);
+extern void platform_device_del(struct platform_device *pdev);
 extern void platform_device_put(struct platform_device *pdev);
 extern void platform_device_put(struct platform_device *pdev);
 
 
 struct platform_driver {
 struct platform_driver {