|
@@ -679,14 +679,26 @@ static int device_add_class_symlinks(struct device *dev)
|
|
|
goto out_subsys;
|
|
|
}
|
|
|
if (dev->parent) {
|
|
|
- error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
|
|
|
- "device");
|
|
|
- if (error)
|
|
|
- goto out_busid;
|
|
|
#ifdef CONFIG_SYSFS_DEPRECATED
|
|
|
{
|
|
|
- char * class_name = make_class_name(dev->class->name,
|
|
|
- &dev->kobj);
|
|
|
+ struct device *parent = dev->parent;
|
|
|
+ char *class_name;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * In old sysfs stacked class devices had 'device'
|
|
|
+ * link pointing to real device instead of parent
|
|
|
+ */
|
|
|
+ while (parent->class && !parent->bus && parent->parent)
|
|
|
+ parent = parent->parent;
|
|
|
+
|
|
|
+ error = sysfs_create_link(&dev->kobj,
|
|
|
+ &parent->kobj,
|
|
|
+ "device");
|
|
|
+ if (error)
|
|
|
+ goto out_busid;
|
|
|
+
|
|
|
+ class_name = make_class_name(dev->class->name,
|
|
|
+ &dev->kobj);
|
|
|
if (class_name)
|
|
|
error = sysfs_create_link(&dev->parent->kobj,
|
|
|
&dev->kobj, class_name);
|
|
@@ -694,6 +706,11 @@ static int device_add_class_symlinks(struct device *dev)
|
|
|
if (error)
|
|
|
goto out_device;
|
|
|
}
|
|
|
+#else
|
|
|
+ error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
|
|
|
+ "device");
|
|
|
+ if (error)
|
|
|
+ goto out_busid;
|
|
|
#endif
|
|
|
}
|
|
|
return 0;
|