+
+ /* rules are looked at in priority order */
+ retval = do_callout(class_dev, udev);
+ if (retval == 0)
+ goto done;
+
+ retval = do_label(class_dev, udev, sysfs_device);
+ if (retval == 0)
+ goto done;
+
+ retval = do_number(class_dev, udev, sysfs_device);
+ if (retval == 0)
+ goto done;
+
+ retval = do_topology(class_dev, udev, sysfs_device);
+ if (retval == 0)
+ goto done;
+
+ retval = do_replace(class_dev, udev);
+ if (retval == 0)
+ goto done;
+
+ strcpy(udev->name, class_dev->name);
+
+done:
+ /* substitute placeholder in NAME */
+ while (1) {
+ char *pos = strchr(udev->name, '%');
+ char *dig;
+ char name[NAME_SIZE];
+ if (pos) {
+ strcpy(name, pos+2);
+ *pos = 0x00;
+ switch (pos[1]) {
+ case 'n':
+ dig = class_dev->name + strlen(class_dev->name);
+ while (isdigit(*(dig-1)))
+ dig--;
+ strcat(udev->name, dig);
+ dbg_parse("kernel number appended: %s", dig);
+ break;
+ case 'm':
+ sprintf(pos, "%u", udev->minor);
+ dbg_parse("minor number appended: %u", udev->minor);
+ break;
+ case 'M':
+ sprintf(pos, "%u", udev->major);
+ dbg_parse("major number appended: %u", udev->major);
+ break;
+ default:
+ dbg_parse("unknown substitution type: %%%c", pos[1]);
+ break;
+ }
+ strcat(udev->name, name);
+ } else
+ break;
+ }
+
+ /* mode was never set above */
+ if (!udev->mode) {
+ udev->mode = get_default_mode(class_dev);
+ udev->owner[0] = 0x00;
+ udev->group[0] = 0x00;
+ }
+
+ if (class_dev_parent)
+ sysfs_close_class_device(class_dev_parent);
+
+ return 0;
+}
+
+int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *dev)
+{
+ int retval;
+
+ retval = get_attr(class_dev, dev);
+ if (retval)
+ dbg("get_attr failed");
+