[PATCH] openfirmware: add sysfs nodes for open firmware devices
authorJeff Mahoney <jeffm@suse.com>
Wed, 6 Jul 2005 19:26:27 +0000 (15:26 -0400)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 6 Jul 2005 19:55:20 +0000 (12:55 -0700)
This adds sysfs nodes that the hotplug userspace can use to load the
appropriate modules.

In order for hotplug to work with macio devices, patches to
module-init-tools and hotplug must be applied.  Those patches are
available at:

 ftp://ftp.suse.com/pub/people/jeffm/linux/macio-hotplug/

Changes: The previous versions were built on 2.6.12. 2.6.13-rcX introduced
         a device_attribute parameter to the show functions. Since that
         parameter was treated as the output buffer, memory corruption would
         result, causing Oopsen very quickly.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/macintosh/Makefile
drivers/macintosh/macio_asic.c
drivers/macintosh/macio_sysfs.c [new file with mode: 0644]

index f5ae171dbfef3b537ce98139dd7fe3e78ddad249..236291bd48a4117fe4e7eb12ae8075a9142a2ebd 100644 (file)
@@ -4,7 +4,7 @@
 
 # Each configuration option enables a list of files.
 
-obj-$(CONFIG_PPC_PMAC)         += macio_asic.o
+obj-$(CONFIG_PPC_PMAC)         += macio_asic.o macio_sysfs.o
 
 obj-$(CONFIG_PMAC_MEDIABAY)    += mediabay.o
 obj-$(CONFIG_MAC_EMUMOUSEBTN)  += mac_hid.o
index 37b18ee08a2d0df8b86553fbe190f144981bce51..7fa369cfccebfd627c3c153f72d8159f8d7d8918 100644 (file)
@@ -126,11 +126,14 @@ static int macio_device_resume(struct device * dev)
        return 0;
 }
 
+extern struct device_attribute macio_dev_attrs[];
+
 struct bus_type macio_bus_type = {
        .name   = "macio",
        .match  = macio_bus_match,
        .suspend        = macio_device_suspend,
        .resume = macio_device_resume,
+       .dev_attrs = macio_dev_attrs,
 };
 
 static int __init macio_bus_driver_init(void)
diff --git a/drivers/macintosh/macio_sysfs.c b/drivers/macintosh/macio_sysfs.c
new file mode 100644 (file)
index 0000000..97d22bb
--- /dev/null
@@ -0,0 +1,50 @@
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/stat.h>
+#include <asm/macio.h>
+
+
+#define macio_config_of_attr(field, format_string)                     \
+static ssize_t                                                         \
+field##_show (struct device *dev, struct device_attribute *attr,       \
+              char *buf)                                               \
+{                                                                      \
+       struct macio_dev *mdev = to_macio_device (dev);                 \
+       return sprintf (buf, format_string, mdev->ofdev.node->field);   \
+}
+
+static ssize_t
+compatible_show (struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct of_device *of;
+       char *compat;
+       int cplen;
+       int length = 0;
+
+       of = &to_macio_device (dev)->ofdev;
+       compat = (char *) get_property(of->node, "compatible", &cplen);
+       if (!compat) {
+               *buf = '\0';
+               return 0;
+       }
+       while (cplen > 0) {
+               int l;
+               length += sprintf (buf, "%s\n", compat);
+               buf += length;
+               l = strlen (compat) + 1;
+               compat += l;
+               cplen -= l;
+       }
+
+       return length;
+}
+
+macio_config_of_attr (name, "%s\n");
+macio_config_of_attr (type, "%s\n");
+
+struct device_attribute macio_dev_attrs[] = {
+       __ATTR_RO(name),
+       __ATTR_RO(type),
+       __ATTR_RO(compatible),
+       __ATTR_NULL
+};