Skip to contentSkip to conversation

create modalias file in sysfs for bus of_platform

PATCH Superseded Olaf Hering 3 participants 9 messages Jan 22, 2008 – May 8, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 create modalias file in sysfs for bus of_platform

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types.

---
 drivers/of/device.c |   18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
drivers/of/device.c +18 -0
@@ -86,7 +86,19 @@ static ssize_t dev_show_devspec(struct d
 	return sprintf(buf, "%s", ofdev->node->full_name);
 }
 
+static ssize_t dev_show_modalias(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct of_device *ofdev = to_of_device(dev);
+	ssize_t len = 0;
+
+	if (ofdev)
+		len = of_device_get_modalias(ofdev, buf, PAGE_SIZE);
+	return len;
+}
+
 static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL);
+static DEVICE_ATTR(modalias, S_IRUGO, dev_show_modalias, NULL);
 
 /**
  * of_release_dev - free an of device structure when all users of it are finished.
@@ -116,6 +128,11 @@ int of_device_register(struct of_device 
 		return rc;
 
 	rc = device_create_file(&ofdev->dev, &dev_attr_devspec);
+	if (rc) {
+		device_unregister(&ofdev->dev);
+		return rc;
+	}
+	rc = device_create_file(&ofdev->dev, &dev_attr_modalias);
 	if (rc)
 		device_unregister(&ofdev->dev);
 
@@ -126,6 +143,7 @@ EXPORT_SYMBOL(of_device_register);
 void of_device_unregister(struct of_device *ofdev)
 {
 	device_remove_file(&ofdev->dev, &dev_attr_devspec);
+	device_remove_file(&ofdev->dev, &dev_attr_modalias);
 	device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);
#1 lore raw

PATCH v2 1/1 create modalias file in sysfs for bus of_platform

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types.

---
 drivers/of/device.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
drivers/of/device.c +19 -0
@@ -86,7 +86,20 @@ static ssize_t dev_show_devspec(struct d
 	return sprintf(buf, "%s", ofdev->node->full_name);
 }
 
+static ssize_t dev_show_modalias(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct of_device *ofdev = to_of_device(dev);
+	ssize_t len = 0;
+
+	len = of_device_get_modalias(ofdev, buf, PAGE_SIZE);
+	buf[len] = '\n';
+	buf[len+1] = 0;
+	return len+1;
+}
+
 static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL);
+static DEVICE_ATTR(modalias, S_IRUGO, dev_show_modalias, NULL);
 
 /**
  * of_release_dev - free an of device structure when all users of it are finished.
@@ -116,6 +129,11 @@ int of_device_register(struct of_device 
 		return rc;
 
 	rc = device_create_file(&ofdev->dev, &dev_attr_devspec);
+	if (rc) {
+		device_unregister(&ofdev->dev);
+		return rc;
+	}
+	rc = device_create_file(&ofdev->dev, &dev_attr_modalias);
 	if (rc)
 		device_unregister(&ofdev->dev);
 
@@ -126,6 +144,7 @@ EXPORT_SYMBOL(of_device_register);
 void of_device_unregister(struct of_device *ofdev)
 {
 	device_remove_file(&ofdev->dev, &dev_attr_devspec);
+	device_remove_file(&ofdev->dev, &dev_attr_modalias);
 	device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);
#2 lore raw

Hi Olaf,

Thanks for doing this. Patches to drivers/of should also be cc'd to the Sparc guys as they share this stuff with is, now.

Also, drivers/macintosh/macio_sysfs.c does this for itself, so that should probably be removed.

Quoted 13 lines · On Tue, 22 Jan 2008 15:40:53 +0100 Olaf Hering <[email protected]> wrote:

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types.

---
 drivers/of/device.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

drivers/of/device.c static ssize_t dev_show_devspec(struct d · line 95

Quoted 10 lines
drivers/of/device.c +7 -0
@@ -86,7 +86,20 @@ static ssize_t dev_show_devspec(struct d
 	return sprintf(buf, "%s", ofdev->node->full_name);
 }
 
+static ssize_t dev_show_modalias(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct of_device *ofdev = to_of_device(dev);
+	ssize_t len = 0;
+
+	len = of_device_get_modalias(ofdev, buf, PAGE_SIZE);

Should you pass (PAGE_SIZE - 1 (or 2)) here?

Quoted 30 lines
drivers/of/device.c +12 -0
+	buf[len] = '\n';
+	buf[len+1] = 0;
+	return len+1;
+}
+
 static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL);
+static DEVICE_ATTR(modalias, S_IRUGO, dev_show_modalias, NULL);
 
 /**
  * of_release_dev - free an of device structure when all users of it are finished.
@@ -116,6 +129,11 @@ int of_device_register(struct of_device 
 		return rc;
 
 	rc = device_create_file(&ofdev->dev, &dev_attr_devspec);
+	if (rc) {
+		device_unregister(&ofdev->dev);
+		return rc;
+	}
+	rc = device_create_file(&ofdev->dev, &dev_attr_modalias);
 	if (rc)
 		device_unregister(&ofdev->dev);
 
@@ -126,6 +144,7 @@ EXPORT_SYMBOL(of_device_register);
 void of_device_unregister(struct of_device *ofdev)
 {
 	device_remove_file(&ofdev->dev, &dev_attr_devspec);
+	device_remove_file(&ofdev->dev, &dev_attr_modalias);
 	device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);
Signature · 3 lines
Cheers,
Stephen Rothwell                    [email protected]
http://www.canb.auug.org.au/~sfr/
#3 lore raw

PATCH v3 1/1 create modalias file in sysfs for bus of_platform

In reply to Olaf Hering

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types.

---
 drivers/of/device.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
drivers/of/device.c +19 -0
@@ -86,7 +86,20 @@ static ssize_t dev_show_devspec(struct d
 	return sprintf(buf, "%s", ofdev->node->full_name);
 }
 
+static ssize_t dev_show_modalias(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct of_device *ofdev = to_of_device(dev);
+	ssize_t len = 0;
+
+	len = of_device_get_modalias(ofdev, buf, PAGE_SIZE - 2);
+	buf[len] = '\n';
+	buf[len+1] = 0;
+	return len+1;
+}
+
 static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL);
+static DEVICE_ATTR(modalias, S_IRUGO, dev_show_modalias, NULL);
 
 /**
  * of_release_dev - free an of device structure when all users of it are finished.
@@ -116,6 +129,11 @@ int of_device_register(struct of_device 
 		return rc;
 
 	rc = device_create_file(&ofdev->dev, &dev_attr_devspec);
+	if (rc) {
+		device_unregister(&ofdev->dev);
+		return rc;
+	}
+	rc = device_create_file(&ofdev->dev, &dev_attr_modalias);
 	if (rc)
 		device_unregister(&ofdev->dev);
 
@@ -126,6 +144,7 @@ EXPORT_SYMBOL(of_device_register);
 void of_device_unregister(struct of_device *ofdev)
 {
 	device_remove_file(&ofdev->dev, &dev_attr_devspec);
+	device_remove_file(&ofdev->dev, &dev_attr_modalias);
 	device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);
#4 lore raw

[Adding sparclinux cc]

I withdraw the comment about drivers/macintosh/macio_sysfs.c, I didn't realise that it was a whole other bus.

Quoted 57 lines · On Tue, 22 Jan 2008 20:09:39 +0100 Olaf Hering <[email protected]> wrote:

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types.

---
 drivers/of/device.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
drivers/of/device.c +19 -0
@@ -86,7 +86,20 @@ static ssize_t dev_show_devspec(struct d
 	return sprintf(buf, "%s", ofdev->node->full_name);
 }
 
+static ssize_t dev_show_modalias(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct of_device *ofdev = to_of_device(dev);
+	ssize_t len = 0;
+
+	len = of_device_get_modalias(ofdev, buf, PAGE_SIZE - 2);
+	buf[len] = '\n';
+	buf[len+1] = 0;
+	return len+1;
+}
+
 static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL);
+static DEVICE_ATTR(modalias, S_IRUGO, dev_show_modalias, NULL);
 
 /**
  * of_release_dev - free an of device structure when all users of it are finished.
@@ -116,6 +129,11 @@ int of_device_register(struct of_device 
 		return rc;
 
 	rc = device_create_file(&ofdev->dev, &dev_attr_devspec);
+	if (rc) {
+		device_unregister(&ofdev->dev);
+		return rc;
+	}
+	rc = device_create_file(&ofdev->dev, &dev_attr_modalias);
 	if (rc)
 		device_unregister(&ofdev->dev);
 
@@ -126,6 +144,7 @@ EXPORT_SYMBOL(of_device_register);
 void of_device_unregister(struct of_device *ofdev)
 {
 	device_remove_file(&ofdev->dev, &dev_attr_devspec);
+	device_remove_file(&ofdev->dev, &dev_attr_modalias);
 	device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Signature · 3 lines
Cheers,
Stephen Rothwell                    [email protected]
http://www.canb.auug.org.au/~sfr/
#5 lore raw
In reply to Olaf Hering
Quoted 2 lines · Olaf Hering

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types.

This one causes various oopses on boot for me, both on a dual G5 and on a tibook.

Paul.

#6 lore raw

PATCH v4 1/1 create modalias file in sysfs for bus of_platform

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types.

---
 drivers/of/device.c   |   33 ++++++++++++++++++---------------
 drivers/of/platform.c |    3 +++
 2 files changed, 21 insertions(+), 15 deletions(-)
drivers/of/device.c +18 -15
Index: linux-2.6/drivers/of/device.c
===================================================================
@@ -77,7 +77,7 @@ void of_dev_put(struct of_device *dev)
 }
 EXPORT_SYMBOL(of_dev_put);
 
-static ssize_t dev_show_devspec(struct device *dev,
+static ssize_t devspec_show(struct device *dev,
 				struct device_attribute *attr, char *buf)
 {
 	struct of_device *ofdev;
@@ -86,7 +86,22 @@ static ssize_t dev_show_devspec(struct d
 	return sprintf(buf, "%s", ofdev->node->full_name);
 }
 
-static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL);
+static ssize_t modalias_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	ssize_t len;
+
+	len = of_device_get_modalias(to_of_device(dev), buf, PAGE_SIZE - 2);
+	buf[len] = '\n';
+	buf[len+1] = 0;
+	return len+1;
+}
+
+struct device_attribute of_platform_device_attrs[] = {
+	__ATTR_RO(devspec),
+	__ATTR_RO(modalias),
+	__ATTR_NULL
+};
 
 /**
  * of_release_dev - free an of device structure when all users of it are finished.
@@ -107,25 +122,13 @@ EXPORT_SYMBOL(of_release_dev);
 
 int of_device_register(struct of_device *ofdev)
 {
-	int rc;
-
 	BUG_ON(ofdev->node == NULL);
-
-	rc = device_register(&ofdev->dev);
-	if (rc)
-		return rc;
-
-	rc = device_create_file(&ofdev->dev, &dev_attr_devspec);
-	if (rc)
-		device_unregister(&ofdev->dev);
-
-	return rc;
+	return device_register(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_register);
 
 void of_device_unregister(struct of_device *ofdev)
 {
-	device_remove_file(&ofdev->dev, &dev_attr_devspec);
 	device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);
drivers/of/platform.c +3 -0
Index: linux-2.6/drivers/of/platform.c
===================================================================
@@ -17,6 +17,8 @@
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
 
+extern struct device_attribute of_platform_device_attrs[];
+
 static int of_platform_bus_match(struct device *dev, struct device_driver *drv)
 {
 	struct of_device *of_dev = to_of_device(dev);
@@ -93,6 +95,7 @@ int of_bus_type_init(struct bus_type *bu
 	bus->remove = of_platform_device_remove;
 	bus->suspend = of_platform_device_suspend;
 	bus->resume = of_platform_device_resume;
+	bus->dev_attrs = of_platform_device_attrs;
 	return bus_register(bus);
 }
 
#7 lore raw

PATCH v5 1/1 create modalias file in sysfs for bus of_platform

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types. This adds also a newline to the devspec files.

Also create a devspec file for mac-io devices. They were created as a side effect. Use correct buffer size for mac-io modalias buffer.

Tested on iBook1 and Efika.

---
 drivers/macintosh/macio_sysfs.c |   12 +++++++++++-
 drivers/of/device.c             |   36 ++++++++++++++++++++----------------
 drivers/of/platform.c           |    3 +++
 3 files changed, 34 insertions(+), 17 deletions(-)
drivers/macintosh/macio_sysfs.c +11 -1
@@ -44,7 +44,7 @@ static ssize_t modalias_show (struct dev
 	struct of_device *ofdev = to_of_device(dev);
 	int len;
 
-	len = of_device_get_modalias(ofdev, buf, PAGE_SIZE);
+	len = of_device_get_modalias(ofdev, buf, PAGE_SIZE - 2);
 
 	buf[len] = '\n';
 	buf[len+1] = 0;
@@ -52,6 +52,15 @@ static ssize_t modalias_show (struct dev
 	return len+1;
 }
 
+static ssize_t devspec_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct of_device *ofdev;
+
+	ofdev = to_of_device(dev);
+	return sprintf(buf, "%s\n", ofdev->node->full_name);
+}
+
 macio_config_of_attr (name, "%s\n");
 macio_config_of_attr (type, "%s\n");
 
@@ -60,5 +69,6 @@ struct device_attribute macio_dev_attrs[
 	__ATTR_RO(type),
 	__ATTR_RO(compatible),
 	__ATTR_RO(modalias),
+	__ATTR_RO(devspec),
 	__ATTR_NULL
 };
drivers/of/device.c +20 -16
@@ -48,16 +48,32 @@ void of_dev_put(struct of_device *dev)
 }
 EXPORT_SYMBOL(of_dev_put);
 
-static ssize_t dev_show_devspec(struct device *dev,
+static ssize_t devspec_show(struct device *dev,
 				struct device_attribute *attr, char *buf)
 {
 	struct of_device *ofdev;
 
 	ofdev = to_of_device(dev);
-	return sprintf(buf, "%s", ofdev->node->full_name);
+	return sprintf(buf, "%s\n", ofdev->node->full_name);
 }
 
-static DEVICE_ATTR(devspec, S_IRUGO, dev_show_devspec, NULL);
+static ssize_t modalias_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	struct of_device *ofdev = to_of_device(dev);
+	ssize_t len = 0;
+
+	len = of_device_get_modalias(ofdev, buf, PAGE_SIZE - 2);
+	buf[len] = '\n';
+	buf[len+1] = 0;
+	return len+1;
+}
+
+struct device_attribute of_platform_device_attrs[] = {
+	__ATTR_RO(devspec),
+	__ATTR_RO(modalias),
+	__ATTR_NULL
+};
 
 /**
  * of_release_dev - free an of device structure when all users of it are finished.
@@ -78,25 +94,13 @@ EXPORT_SYMBOL(of_release_dev);
 
 int of_device_register(struct of_device *ofdev)
 {
-	int rc;
-
 	BUG_ON(ofdev->node = NULL);
-
-	rc = device_register(&ofdev->dev);
-	if (rc)
-		return rc;
-
-	rc = device_create_file(&ofdev->dev, &dev_attr_devspec);
-	if (rc)
-		device_unregister(&ofdev->dev);
-
-	return rc;
+	return device_register(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_register);
 
 void of_device_unregister(struct of_device *ofdev)
 {
-	device_remove_file(&ofdev->dev, &dev_attr_devspec);
 	device_unregister(&ofdev->dev);
 }
 EXPORT_SYMBOL(of_device_unregister);
drivers/of/platform.c +3 -0
@@ -17,6 +17,8 @@
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
 
+extern struct device_attribute of_platform_device_attrs[];
+
 static int of_platform_bus_match(struct device *dev, struct device_driver *drv)
 {
 	struct of_device *of_dev = to_of_device(dev);
@@ -103,6 +105,7 @@ int of_bus_type_init(struct bus_type *bu
 	bus->suspend = of_platform_device_suspend;
 	bus->resume = of_platform_device_resume;
 	bus->shutdown = of_platform_device_shutdown;
+	bus->dev_attrs = of_platform_device_attrs;
 	return bus_register(bus);
 }
 
#8 lore raw
Quoted 8 lines · Olaf Hering

Create /sys/bus/of_platform/devices/*/modalias file to allow autoloading of modules. modalias files are already present for many other bus types. This adds also a newline to the devspec files.

Also create a devspec file for mac-io devices. They were created as a side effect. Use correct buffer size for mac-io modalias buffer.

Tested on iBook1 and Efika.

Did anyone test this on other systems, like sparc?