static struct hw * split_fill_path (struct hw *current, const char *device_specifier, name_specifier *spec) { /* break it up */ if (!split_device_specifier (current, device_specifier, spec)) hw_abort (current, "error parsing %s\n", device_specifier); /* fill our tree with its contents */ current = split_find_device (current, spec); /* add any additional devices as needed */ if (spec->name != NULL) { do { if (current != NULL && !hw_finished_p (current)) hw_finish (current); current = hw_create (NULL, current, spec->family, spec->name, spec->unit, spec->args); } while (split_device_name (spec)); } return current; }
static int split_property_specifier (struct hw *current, const char *property_specifier, name_specifier *spec) { if (split_device_specifier (current, property_specifier, spec)) { if (spec->property == NULL) { /* force the last name to be a property name */ char *chp = strrchr (spec->path, '/'); if (chp == NULL) { spec->property = spec->path; spec->path = strrchr (spec->property, '\0');; } else { *chp = '\0'; spec->property = chp + 1; } } return 1; } else return 0; }
tree_instance(device *root, const char *device_specifier) { /* find the device node */ device *me; name_specifier spec; if (!split_device_specifier(root, device_specifier, &spec)) return NULL; me = split_find_device(root, &spec); if (spec.name != NULL) return NULL; /* create the instance */ return device_create_instance(me, device_specifier, spec.last_args); }
tree_find_device(device *root, const char *path_to_device) { device *node; name_specifier spec; /* parse the path */ split_device_specifier(root, path_to_device, &spec); if (spec.value != NULL) return NULL; /* something wierd */ /* now find it */ node = split_find_device(root, &spec); if (spec.name != NULL) return NULL; /* not a leaf */ return node; }
split_fill_path(device *current, const char *device_specifier, name_specifier *spec) { /* break it up */ if (!split_device_specifier(current, device_specifier, spec)) device_error(current, "error parsing %s\n", device_specifier); /* fill our tree with its contents */ current = split_find_device(current, spec); /* add any additional devices as needed */ if (spec->name != NULL) { do { current = device_create(current, spec->base, spec->name, spec->unit, spec->args); } while (split_device_name(spec)); } return current; }