int slen;
struct sysfs_attribute *tmpattr;
unsigned int next_free_number;
+ struct sysfs_class_device *class_dev_parent;
pos = string;
while (1) {
strfieldcatmax(string, temp2, maxsize);
}
break;
+ case 'P':
+ class_dev_parent = sysfs_get_classdev_parent(class_dev);
+ if (class_dev_parent != NULL) {
+ struct udevice udev_parent;
+
+ dbg("found parent '%s', get the node name", class_dev_parent->path);
+ memset(&udev_parent, 0x00, sizeof(struct udevice));
+ /* lookup the name in the udev_db with the DEVPATH of the parent */
+ strfieldcpy(udev_parent.devpath, &class_dev_parent->path[strlen(sysfs_path)]);
+ if (udev_db_get_device(&udev_parent) == 0) {
+ strfieldcatmax(string, udev_parent.name, maxsize);
+ dbg("substitute parent node name'%s'", udev_parent.name);
+ } else
+ dbg("parent not found in database");
+ }
+ break;
case 'N':
if (udev->tmp_node[0] == '\0') {
dbg("create temporary device node for callout");
strfieldcatmax(string, udev->tmp_node, maxsize);
dbg("substitute temporary device node name '%s'", udev->tmp_node);
break;
+ case 'r':
+ strfieldcatmax(string, udev_root, maxsize);
+ dbg("substitute udev_root '%s'", udev_root);
+ break;
default:
dbg("unknown substitution type '%%%c'", c);
break;
struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
{
while (1) {
- /* check for matching bus value */
- if (dev->bus[0] != '\0') {
- if (sysfs_device == NULL) {
- dbg("device has no bus");
- goto try_parent;
- }
- dbg("check for " FIELD_BUS " dev->bus='%s' sysfs_device->bus='%s'",
- dev->bus, sysfs_device->bus);
- if (strcmp_pattern(dev->bus, sysfs_device->bus) != 0) {
- dbg(FIELD_BUS " is not matching");
- goto try_parent;
- } else {
- dbg(FIELD_BUS " matches");
- }
- }
-
/* check for matching kernel name */
if (dev->kernel[0] != '\0') {
dbg("check for " FIELD_KERNEL " dev->kernel='%s' class_dev->name='%s'",
dev->kernel, class_dev->name);
if (strcmp_pattern(dev->kernel, class_dev->name) != 0) {
dbg(FIELD_KERNEL " is not matching");
- goto try_parent;
- } else {
- dbg(FIELD_KERNEL " matches");
+ goto exit;
}
+ dbg(FIELD_KERNEL " matches");
}
/* check for matching subsystem */
dev->subsystem, class_dev->name);
if (strcmp_pattern(dev->subsystem, udev->subsystem) != 0) {
dbg(FIELD_SUBSYSTEM " is not matching");
- goto try_parent;
- } else {
- dbg(FIELD_SUBSYSTEM " matches");
+ goto exit;
}
+ dbg(FIELD_SUBSYSTEM " matches");
}
/* check for matching driver */
}
}
+ /* check for matching bus value */
+ if (dev->bus[0] != '\0') {
+ if (sysfs_device == NULL) {
+ dbg("device has no bus");
+ goto try_parent;
+ }
+ dbg("check for " FIELD_BUS " dev->bus='%s' sysfs_device->bus='%s'",
+ dev->bus, sysfs_device->bus);
+ if (strcmp_pattern(dev->bus, sysfs_device->bus) != 0) {
+ dbg(FIELD_BUS " is not matching");
+ goto try_parent;
+ }
+ dbg(FIELD_BUS " matches");
+ }
+
/* check for matching bus id */
if (dev->id[0] != '\0') {
dbg("check " FIELD_ID);
}
}
- /* Yeah, we matched! */
+ /* we matched */
return 0;
try_parent:
dbg("try parent sysfs device");
sysfs_device = sysfs_get_device_parent(sysfs_device);
if (sysfs_device == NULL)
- return -ENODEV;
+ goto exit;
dbg("sysfs_device->path='%s'", sysfs_device->path);
dbg("sysfs_device->bus_id='%s'", sysfs_device->bus_id);
}
+
+exit:
+ return -1;
}
int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_dev)