All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Green <andy@warmcat.com>
To: linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org
Cc: patches@linaro.org, Andy Green <andy.green@linaro.org>
Subject: [RFC PATCH 3/4] PLATFORM: Introduce async platform_data attach api
Date: Sat, 12 Mar 2011 22:32:27 +0000	[thread overview]
Message-ID: <20110312223227.27020.83925.stgit@otae.warmcat.com> (raw)
In-Reply-To: <20110312222633.27020.19543.stgit@otae.warmcat.com>

This introduces a platform API so busses can allow platform_data to
be attached to any struct device they create from probing in one step.

The function checks through the async platform_data map if one was
previously registered, and checks the device's device path for itself
and its parents against the mapped device path names.

If it sees a match, it attaches the associated platform_data and sets
that map entry's device_path to NULL so no further time is spent trying
to match it.

Signed-off-by: Andy Green <andy.green@linaro.org>
---

 drivers/base/platform.c         |   70 +++++++++++++++++++++++++++++++++++++++
 include/linux/platform_device.h |    2 +
 2 files changed, 72 insertions(+), 0 deletions(-)

diff --git a/drivers/base/platform.c b/drivers/base/platform.c
index 180e372..534bf3a 100644
--- a/drivers/base/platform.c
+++ b/drivers/base/platform.c
@@ -1353,3 +1353,73 @@ void platform_async_platform_data_register(
 	platform_async_platform_data_count = count;
 }
 EXPORT_SYMBOL_GPL(platform_async_platform_data_register);
+
+/**
+ * platform_async_platform_data_attach - if there is any async devname map
+ *			defined, go through it looking for a match with the
+ *			device's path considering its parent device names.
+ *			If a match is found, attach the corresponding
+ *			platform_data and the entry in the map table set to
+ *			NULL so it won't be looked for again.
+ *
+ * @dev:	device to have data attched to if it matches any map entry
+ */
+void platform_async_platform_data_attach(struct device *dev)
+{
+	struct platform_async_platform_data *map;
+	const char *path;
+	int count;
+	const char *p;
+	int len;
+	struct device *devn;
+
+	map = platform_async_platform_data_map;
+	count = platform_async_platform_data_count;
+
+	while (count--) {
+
+		if (map->device_path == NULL) {
+			map++;
+			continue;
+		}
+
+		p = map->device_path + strlen(map->device_path);
+		devn = dev;
+
+		while (devn) {
+
+			path = dev_name(devn);
+			len = strlen(path);
+
+			if ((p - map->device_path) < len) {
+				devn = NULL;
+				continue;
+			}
+
+			p -= len;
+
+			if (strncmp(path, p, len)) {
+				devn = NULL;
+				continue;
+			}
+
+			devn = devn->parent;
+			if (p == map->device_path) {
+				dev_info(dev, "Attched async platform data\n");
+				dev->platform_data = map->platform_data;
+				map->device_path = NULL;
+				return;
+			}
+
+			if (devn != NULL && (p - map->device_path) < 2)
+				devn = NULL;
+
+			p--;
+			if (devn != NULL && *p != '/')
+				devn = NULL;
+		}
+
+		map++;
+	}
+}
+EXPORT_SYMBOL_GPL(platform_async_platform_data_attach);
diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
index 19ea497..4b5fa12 100644
--- a/include/linux/platform_device.h
+++ b/include/linux/platform_device.h
@@ -213,4 +213,6 @@ struct platform_async_platform_data {
 extern void platform_async_platform_data_register(
 			   struct platform_async_platform_data *map, int count);
 
+extern void platform_async_platform_data_attach(struct device *dev);
+
 #endif /* _PLATFORM_DEVICE_H_ */


  parent reply	other threads:[~2011-03-12 22:33 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-12 22:32 [RFC PATCH 0/4] PLATFORM: Support for async platform_data Andy Green
2011-03-12 22:32 ` [RFC PATCH 1/4] PLATFORM: introduce structure to bind async platform data to a dev path name Andy Green
2011-03-12 23:29   ` Rafael J. Wysocki
2011-03-12 23:39     ` Andy Green
2011-03-13  1:03       ` Greg KH
2011-03-13 11:22         ` Andy Green
2011-03-13 12:51           ` Rafael J. Wysocki
2011-03-13 13:53             ` Andy Green
2011-03-13 16:58               ` Rafael J. Wysocki
2011-03-13 17:21                 ` Andy Green
2011-03-13 20:45                   ` Rafael J. Wysocki
2011-03-13 16:14           ` Greg KH
2011-03-13 17:26             ` Andy Green
2011-03-12 22:32 ` [RFC PATCH 2/4] PLATFORM: Introduce registration function for async platform data maps Andy Green
2011-03-12 22:32 ` Andy Green [this message]
2011-03-13  1:01   ` [RFC PATCH 3/4] PLATFORM: Introduce async platform_data attach api Greg KH
2011-03-13 10:41     ` Rafael J. Wysocki
2011-03-13 11:58       ` Andy Green
2011-03-13 12:53         ` Rafael J. Wysocki
2011-03-13 13:21           ` Andy Green
2011-03-13 16:15             ` Greg KH
2011-03-13 17:13               ` Andy Green
2011-03-13 17:48                 ` Greg KH
2011-03-13 18:13                   ` Andy Green
2011-03-13 23:26                     ` Greg KH
2011-03-14  8:38                       ` Andy Green
2011-03-14 20:54                         ` Greg KH
2011-03-14 21:03                           ` Alan Stern
2011-03-14 21:13                             ` Greg KH
2011-03-14 21:10                           ` Mark Brown
2011-03-14 21:59                           ` Andy Green
2011-03-12 22:32 ` [RFC PATCH 4/4] PLATFORM: Add some documentation to platform docs about async platform_data Andy Green

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110312223227.27020.83925.stgit@otae.warmcat.com \
    --to=andy@warmcat.com \
    --cc=andy.green@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=patches@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.