aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2015-02-17 19:25:18 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-03-25 09:56:58 -0400
commit5590f3196b293574a12be58d06d5e1120d8856ec (patch)
tree90fadb6927d83007a1d6d85b05ca08c49db69040
parente8a51e1b51ee5730ad3913f3962e3099a5e19359 (diff)
drivers/core/of: Add symlink to device-tree from devices with an OF node
So I've been annoyed lately with having a bunch of devices such as i2c eeproms (for use by VPDs, server world !) and other bits and pieces that I want to be able to identify from userspace, and possibly provide additional data about from FW. Basically, it boils down to correlating the sysfs device with the OF tree device node, so that user space can use device-tree info such as additional "location" or "label" (or whatever else we can come up with) propreties to identify a given device, or get some attributes of use about it, etc... Now, so far, we've done that in some subsystem in a fairly ad-hoc basis using "devspec" properties. For example, PCI creates them if it can correlate the probed device with a DT node. Some powerpc specific busses do that too. However, i2c doesn't and it would be nice to have something more generic since technically any device can have a corresponding device tree node. This patch adds an "of_node" symlink to devices that have a non-NULL dev->of_node pointer, the patch is pretty trivial and seems to work just fine for me. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Acked-by: Rob Herring <robh@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--Documentation/ABI/stable/sysfs-devices10
-rw-r--r--drivers/base/core.c16
2 files changed, 24 insertions, 2 deletions
diff --git a/Documentation/ABI/stable/sysfs-devices b/Documentation/ABI/stable/sysfs-devices
new file mode 100644
index 000000000000..43f78b88da28
--- /dev/null
+++ b/Documentation/ABI/stable/sysfs-devices
@@ -0,0 +1,10 @@
1# Note: This documents additional properties of any device beyond what
2# is documented in Documentation/sysfs-rules.txt
3
4What: /sys/devices/*/of_path
5Date: February 2015
6Contact: Device Tree mailing list <devicetree@vger.kernel.org>
7Description:
8 Any device associated with a device-tree node will have
9 an of_path symlink pointing to the corresponding device
10 node in /sys/firmware/devicetree/
diff --git a/drivers/base/core.c b/drivers/base/core.c
index e0998b6b6c49..cadf165651d8 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -805,8 +805,16 @@ static void cleanup_device_parent(struct device *dev)
805 805
806static int device_add_class_symlinks(struct device *dev) 806static int device_add_class_symlinks(struct device *dev)
807{ 807{
808 struct device_node *of_node = dev_of_node(dev);
808 int error; 809 int error;
809 810
811 if (of_node) {
812 error = sysfs_create_link(&dev->kobj, &of_node->kobj,"of_node");
813 if (error)
814 dev_warn(dev, "Error %d creating of_node link\n",error);
815 /* An error here doesn't warrant bringing down the device */
816 }
817
810 if (!dev->class) 818 if (!dev->class)
811 return 0; 819 return 0;
812 820
@@ -814,7 +822,7 @@ static int device_add_class_symlinks(struct device *dev)
814 &dev->class->p->subsys.kobj, 822 &dev->class->p->subsys.kobj,
815 "subsystem"); 823 "subsystem");
816 if (error) 824 if (error)
817 goto out; 825 goto out_devnode;
818 826
819 if (dev->parent && device_is_not_partition(dev)) { 827 if (dev->parent && device_is_not_partition(dev)) {
820 error = sysfs_create_link(&dev->kobj, &dev->parent->kobj, 828 error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
@@ -842,12 +850,16 @@ out_device:
842 850
843out_subsys: 851out_subsys:
844 sysfs_remove_link(&dev->kobj, "subsystem"); 852 sysfs_remove_link(&dev->kobj, "subsystem");
845out: 853out_devnode:
854 sysfs_remove_link(&dev->kobj, "of_node");
846 return error; 855 return error;
847} 856}
848 857
849static void device_remove_class_symlinks(struct device *dev) 858static void device_remove_class_symlinks(struct device *dev)
850{ 859{
860 if (dev_of_node(dev))
861 sysfs_remove_link(&dev->kobj, "of_node");
862
851 if (!dev->class) 863 if (!dev->class)
852 return; 864 return;
853 865