summaryrefslogtreecommitdiff
path: root/recipes/linux/linux-efika-2.6.20/0015-powerpc-Add-a-unified-uevent-handler-for-bus-based-on-of_device.txt
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux-efika-2.6.20/0015-powerpc-Add-a-unified-uevent-handler-for-bus-based-on-of_device.txt')
-rw-r--r--recipes/linux/linux-efika-2.6.20/0015-powerpc-Add-a-unified-uevent-handler-for-bus-based-on-of_device.txt116
1 files changed, 116 insertions, 0 deletions
diff --git a/recipes/linux/linux-efika-2.6.20/0015-powerpc-Add-a-unified-uevent-handler-for-bus-based-on-of_device.txt b/recipes/linux/linux-efika-2.6.20/0015-powerpc-Add-a-unified-uevent-handler-for-bus-based-on-of_device.txt
new file mode 100644
index 0000000000..6de1fd28f8
--- /dev/null
+++ b/recipes/linux/linux-efika-2.6.20/0015-powerpc-Add-a-unified-uevent-handler-for-bus-based-on-of_device.txt
@@ -0,0 +1,116 @@
+From 90dc591d4c897c7a49191888c1e4d413cc08b8b7 Mon Sep 17 00:00:00 2001
+From: Sylvain Munaut <tnt@246tNt.com>
+Date: Sat, 23 Dec 2006 23:08:56 +0100
+Subject: [PATCH] [PATCH] powerpc: Add a unified uevent handler for bus based on of_device
+
+This common uevent handler allow the several bus types based on
+of_device to generate the uevent properly and avoiding
+code duplication.
+
+This handlers take a struct device as argument and can therefore
+be used as the uevent call directly if no special treatment is
+needed for the bus.
+
+Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
+---
+ arch/powerpc/kernel/of_device.c | 66 +++++++++++++++++++++++++++++++++++++++
+ include/asm-powerpc/of_device.h | 3 ++
+ 2 files changed, 69 insertions(+), 0 deletions(-)
+
+diff --git a/arch/powerpc/kernel/of_device.c b/arch/powerpc/kernel/of_device.c
+index e921514..ac024ad 100644
+--- a/arch/powerpc/kernel/of_device.c
++++ b/arch/powerpc/kernel/of_device.c
+@@ -120,6 +120,71 @@ void of_device_unregister(struct of_device *ofdev)
+ }
+
+
++int of_device_uevent(struct device *dev,
++ char **envp, int num_envp, char *buffer, int buffer_size)
++{
++ struct of_device *ofdev;
++ const char *compat;
++ char *compat2;
++ char compat_buf[128]; /* need to be size of 'compatible' */
++ int i = 0, length = 0, seen = 0, cplen, sl;
++
++ if (!dev)
++ return -ENODEV;
++
++ ofdev = to_of_device(dev);
++
++ if (add_uevent_var(envp, num_envp, &i,
++ buffer, buffer_size, &length,
++ "OF_NAME=%s", ofdev->node->name))
++ return -ENOMEM;
++
++ if (add_uevent_var(envp, num_envp, &i,
++ buffer, buffer_size, &length,
++ "OF_TYPE=%s", ofdev->node->type))
++ return -ENOMEM;
++
++ /* Since the compatible field can contain pretty much anything
++ * it's not really legal to split it out with commas. We split it
++ * up using a number of environment variables instead. */
++
++ compat = get_property(ofdev->node, "compatible", &cplen);
++ compat2 = compat_buf;
++ if (compat)
++ memcpy(compat2, compat, cplen);
++ while (compat && *compat && cplen > 0) {
++ if (add_uevent_var(envp, num_envp, &i,
++ buffer, buffer_size, &length,
++ "OF_COMPATIBLE_%d=%s", seen, compat))
++ return -ENOMEM;
++
++ sl = strlen (compat) + 1;
++ compat += sl;
++ compat2 += sl;
++ cplen -= sl;
++ seen++;
++ compat2[-1] = 'C';
++ }
++ compat2[seen?-1:0] = 0;
++
++ if (add_uevent_var(envp, num_envp, &i,
++ buffer, buffer_size, &length,
++ "OF_COMPATIBLE_N=%d", seen))
++ return -ENOMEM;
++
++ if (add_uevent_var(envp, num_envp, &i,
++ buffer, buffer_size, &length,
++ "MODALIAS=of:N%sT%sC%s",
++ ofdev->node->name, ofdev->node->type,
++ compat_buf))
++ return -ENOMEM;
++
++ envp[i] = NULL;
++
++ return 0;
++}
++
++
+ EXPORT_SYMBOL(of_match_node);
+ EXPORT_SYMBOL(of_match_device);
+ EXPORT_SYMBOL(of_device_register);
+@@ -127,3 +192,4 @@ EXPORT_SYMBOL(of_device_unregister);
+ EXPORT_SYMBOL(of_dev_get);
+ EXPORT_SYMBOL(of_dev_put);
+ EXPORT_SYMBOL(of_release_dev);
++EXPORT_SYMBOL(of_device_uevent);
+diff --git a/include/asm-powerpc/of_device.h b/include/asm-powerpc/of_device.h
+index a889b20..4f1aabe 100644
+--- a/include/asm-powerpc/of_device.h
++++ b/include/asm-powerpc/of_device.h
+@@ -32,5 +32,8 @@ extern int of_device_register(struct of_device *ofdev);
+ extern void of_device_unregister(struct of_device *ofdev);
+ extern void of_release_dev(struct device *dev);
+
++extern int of_device_uevent(struct device *dev,
++ char **envp, int num_envp, char *buffer, int buffer_size);
++
+ #endif /* __KERNEL__ */
+ #endif /* _ASM_POWERPC_OF_DEVICE_H */
+--
+1.4.4.2
+