113 lines
3.7 KiB
Diff
113 lines
3.7 KiB
Diff
|
From 00bbc1d8e46a92ce7bd80622cf4b09c3b727a741 Mon Sep 17 00:00:00 2001
|
||
|
From: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||
|
Date: Mon, 30 Nov 2015 17:11:38 +0200
|
||
|
Subject: [PATCH 10/16] driver core: platform: Add support for built-in device
|
||
|
properties
|
||
|
|
||
|
Make it possible to pass built-in device properties to platform device
|
||
|
drivers. This is useful if the system does not have any firmware interface
|
||
|
like Device Tree or ACPI which provides these.
|
||
|
|
||
|
Properties associated with the platform device will be automatically
|
||
|
released when the corresponding device is removed.
|
||
|
|
||
|
Suggested-by: Arnd Bergmann <arnd@arndb.de>
|
||
|
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||
|
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||
|
---
|
||
|
drivers/base/platform.c | 25 +++++++++++++++++++++++++
|
||
|
include/linux/platform_device.h | 5 +++++
|
||
|
2 files changed, 30 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/base/platform.c b/drivers/base/platform.c
|
||
|
index 1dd6d3b..d77ed0c 100644
|
||
|
--- a/drivers/base/platform.c
|
||
|
+++ b/drivers/base/platform.c
|
||
|
@@ -26,6 +26,7 @@
|
||
|
#include <linux/acpi.h>
|
||
|
#include <linux/clk/clk-conf.h>
|
||
|
#include <linux/limits.h>
|
||
|
+#include <linux/property.h>
|
||
|
|
||
|
#include "base.h"
|
||
|
#include "power/power.h"
|
||
|
@@ -299,6 +300,22 @@ int platform_device_add_data(struct platform_device *pdev, const void *data,
|
||
|
EXPORT_SYMBOL_GPL(platform_device_add_data);
|
||
|
|
||
|
/**
|
||
|
+ * platform_device_add_properties - add built-in properties to a platform device
|
||
|
+ * @pdev: platform device to add properties to
|
||
|
+ * @pset: properties to add
|
||
|
+ *
|
||
|
+ * The function will take deep copy of the properties in @pset and attach
|
||
|
+ * the copy to the platform device. The memory associated with properties
|
||
|
+ * will be freed when the platform device is released.
|
||
|
+ */
|
||
|
+int platform_device_add_properties(struct platform_device *pdev,
|
||
|
+ const struct property_set *pset)
|
||
|
+{
|
||
|
+ return device_add_property_set(&pdev->dev, pset);
|
||
|
+}
|
||
|
+EXPORT_SYMBOL_GPL(platform_device_add_properties);
|
||
|
+
|
||
|
+/**
|
||
|
* platform_device_add - add a platform device to device hierarchy
|
||
|
* @pdev: platform device we're adding
|
||
|
*
|
||
|
@@ -409,6 +426,8 @@ void platform_device_del(struct platform_device *pdev)
|
||
|
if (r->parent)
|
||
|
release_resource(r);
|
||
|
}
|
||
|
+
|
||
|
+ device_remove_property_set(&pdev->dev);
|
||
|
}
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(platform_device_del);
|
||
|
@@ -487,6 +506,12 @@ struct platform_device *platform_device_register_full(
|
||
|
if (ret)
|
||
|
goto err;
|
||
|
|
||
|
+ if (pdevinfo->pset) {
|
||
|
+ ret = platform_device_add_properties(pdev, pdevinfo->pset);
|
||
|
+ if (ret)
|
||
|
+ goto err;
|
||
|
+ }
|
||
|
+
|
||
|
ret = platform_device_add(pdev);
|
||
|
if (ret) {
|
||
|
err:
|
||
|
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
|
||
|
index dc777be..dba40b1 100644
|
||
|
--- a/include/linux/platform_device.h
|
||
|
+++ b/include/linux/platform_device.h
|
||
|
@@ -18,6 +18,7 @@
|
||
|
#define PLATFORM_DEVID_AUTO (-2)
|
||
|
|
||
|
struct mfd_cell;
|
||
|
+struct property_set;
|
||
|
|
||
|
struct platform_device {
|
||
|
const char *name;
|
||
|
@@ -70,6 +71,8 @@ struct platform_device_info {
|
||
|
const void *data;
|
||
|
size_t size_data;
|
||
|
u64 dma_mask;
|
||
|
+
|
||
|
+ const struct property_set *pset;
|
||
|
};
|
||
|
extern struct platform_device *platform_device_register_full(
|
||
|
const struct platform_device_info *pdevinfo);
|
||
|
@@ -167,6 +170,8 @@ extern int platform_device_add_resources(struct platform_device *pdev,
|
||
|
unsigned int num);
|
||
|
extern int platform_device_add_data(struct platform_device *pdev,
|
||
|
const void *data, size_t size);
|
||
|
+extern int platform_device_add_properties(struct platform_device *pdev,
|
||
|
+ const struct property_set *pset);
|
||
|
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);
|
||
|
--
|
||
|
2.5.0
|
||
|
|