diff options
Diffstat (limited to 'drivers/base/core.c')
-rw-r--r-- | drivers/base/core.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index 07304a3b9ee2..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 | ||
806 | static int device_add_class_symlinks(struct device *dev) | 806 | static 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 | ||
843 | out_subsys: | 851 | out_subsys: |
844 | sysfs_remove_link(&dev->kobj, "subsystem"); | 852 | sysfs_remove_link(&dev->kobj, "subsystem"); |
845 | out: | 853 | out_devnode: |
854 | sysfs_remove_link(&dev->kobj, "of_node"); | ||
846 | return error; | 855 | return error; |
847 | } | 856 | } |
848 | 857 | ||
849 | static void device_remove_class_symlinks(struct device *dev) | 858 | static 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 | ||
@@ -1095,8 +1107,7 @@ done: | |||
1095 | kobject_del(&dev->kobj); | 1107 | kobject_del(&dev->kobj); |
1096 | Error: | 1108 | Error: |
1097 | cleanup_device_parent(dev); | 1109 | cleanup_device_parent(dev); |
1098 | if (parent) | 1110 | put_device(parent); |
1099 | put_device(parent); | ||
1100 | name_error: | 1111 | name_error: |
1101 | kfree(dev->p); | 1112 | kfree(dev->p); |
1102 | dev->p = NULL; | 1113 | dev->p = NULL; |