- int errno;
- struct device_def* devdef = devdef_byclass(class);
-
- if (!devdef) {
- *err_code = ENOENT;
- return NULL;
- }
-
- if (!devdef->init_for) {
- if (err_code) {
- *err_code = ENOTSUP;
- }
- return NULL;
- }
-
- struct device* dev = device_add(adhoc_devcat, NULL, type, NULL);
-
- errno = devdef->init_for(devdef, dev);
- if (err_code && !errno) {
- *err_code = errno;
- device_remove(dev);
- return NULL;
- }
-
- device_setname(dev,
- "%s_%d:%d:%d_%d",
- name,
- class->meta,
- class->device,
- class->device,
- dev->dev_id);
-
- return dev;
+ struct devclass derived = { .device = DEV_KIND_FROM(ident->unique),
+ .fn_grp = ident->fn_grp };
+ return devdef_byclass(&derived);