static volatile dev_t devid = 0;
struct device*
-__device_add(struct device* parent,
- void* underlay,
- char* name_fmt,
- uint32_t type,
- va_list args)
+device_add(struct device* parent,
+ void* underlay,
+ char* name_fmt,
+ uint32_t type,
+ va_list args)
{
struct device* dev = vzalloc(sizeof(struct device));
if (parent) {
assert((parent->dev_type & DEV_MSKIF) == DEV_IFCAT);
+ llist_append(&parent->children, &dev->siblings);
+ } else {
+ llist_append(&root_list, &dev->siblings);
}
size_t strlen =
- __sprintf_internal(dev->name_val, name_fmt, DEVICE_NAME_SIZE, args);
+ __ksprintf_internal(dev->name_val, name_fmt, DEVICE_NAME_SIZE, args);
dev->dev_id = devid++;
dev->name = HSTR(dev->name_val, strlen);
dev->dev_type = type;
hstr_rehash(&dev->name, HSTR_FULL_HASH);
- llist_append(&root_list, &dev->siblings);
+ llist_init_head(&dev->children);
return dev;
}
va_start(args, name_fmt);
struct device* dev =
- __device_add(parent, underlay, name_fmt, DEV_IFSEQ, args);
+ device_add(parent, underlay, name_fmt, DEV_IFSEQ, args);
va_end(args);
return dev;
va_start(args, name_fmt);
struct device* dev =
- __device_add(parent, underlay, name_fmt, DEV_IFVOL, args);
+ device_add(parent, underlay, name_fmt, DEV_IFVOL, args);
va_end(args);
return dev;
va_list args;
va_start(args, name_fmt);
- struct device* dev = __device_add(parent, NULL, name_fmt, DEV_IFCAT, args);
+ struct device* dev = device_add(parent, NULL, name_fmt, DEV_IFCAT, args);
va_end(args);
return dev;
}
struct device*
-device_getbyname(struct llist_header* devlist, struct hstr* name)
+device_getbyhname(struct device* root_dev, struct hstr* name)
{
- devlist = devlist ? devlist : &root_list;
+ struct llist_header* devlist = root_dev ? &root_dev->children : &root_list;
struct device *pos, *n;
llist_for_each(pos, n, devlist, siblings)
{
return NULL;
}
+struct device*
+device_getbyname(struct device* root_dev, const char* name, size_t len)
+{
+ struct hstr hname = HSTR(name, len);
+ hstr_rehash(&hname, HSTR_FULL_HASH);
+
+ return device_getbyhname(root_dev, &hname);
+}
+
void
device_remove(struct device* dev)
{
}
struct device*
-device_getbyoffset(struct llist_header* devlist, int offset)
+device_getbyoffset(struct device* root_dev, int offset)
{
- devlist = devlist ? devlist : &root_list;
+ struct llist_header* devlist = root_dev ? &root_dev->children : &root_list;
struct device *pos, *n;
int off = 0;
llist_for_each(pos, n, devlist, siblings)