|
@@ -391,6 +391,53 @@ error:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(platform_device_register_simple);
|
|
|
|
|
|
+/**
|
|
|
+ * platform_device_register_data
|
|
|
+ * @parent: parent device for the device we're adding
|
|
|
+ * @name: base name of the device we're adding
|
|
|
+ * @id: instance id
|
|
|
+ * @data: platform specific data for this platform device
|
|
|
+ * @size: size of platform specific data
|
|
|
+ *
|
|
|
+ * This function creates a simple platform device that requires minimal
|
|
|
+ * resource and memory management. Canned release function freeing memory
|
|
|
+ * allocated for the device allows drivers using such devices to be
|
|
|
+ * unloaded without waiting for the last reference to the device to be
|
|
|
+ * dropped.
|
|
|
+ */
|
|
|
+struct platform_device *platform_device_register_data(
|
|
|
+ struct device *parent,
|
|
|
+ const char *name, int id,
|
|
|
+ const void *data, size_t size)
|
|
|
+{
|
|
|
+ struct platform_device *pdev;
|
|
|
+ int retval;
|
|
|
+
|
|
|
+ pdev = platform_device_alloc(name, id);
|
|
|
+ if (!pdev) {
|
|
|
+ retval = -ENOMEM;
|
|
|
+ goto error;
|
|
|
+ }
|
|
|
+
|
|
|
+ pdev->dev.parent = parent;
|
|
|
+
|
|
|
+ if (size) {
|
|
|
+ retval = platform_device_add_data(pdev, data, size);
|
|
|
+ if (retval)
|
|
|
+ goto error;
|
|
|
+ }
|
|
|
+
|
|
|
+ retval = platform_device_add(pdev);
|
|
|
+ if (retval)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ return pdev;
|
|
|
+
|
|
|
+error:
|
|
|
+ platform_device_put(pdev);
|
|
|
+ return ERR_PTR(retval);
|
|
|
+}
|
|
|
+
|
|
|
static int platform_drv_probe(struct device *_dev)
|
|
|
{
|
|
|
struct platform_driver *drv = to_platform_driver(_dev->driver);
|