+device_alloc(struct device_meta* parent, u32_t type, void* underlay);
+
+static inline struct device* must_inline
+device_allocsys(struct device_meta* parent, void* underlay)
+{
+ return device_alloc(parent, DEV_IFSYS, underlay);
+}
+
+static inline struct device* must_inline
+device_allocseq(struct device_meta* parent, void* underlay)
+{
+ return device_alloc(parent, DEV_IFSEQ, underlay);
+}
+
+static inline struct device* must_inline
+device_allocvol(struct device_meta* parent, void* underlay)
+{
+ return device_alloc(parent, DEV_IFVOL, underlay);
+}
+
+struct device_alias*
+device_addalias(struct device_meta* parent, struct device_meta* aliased, char* name_fmt, ...);
+
+struct device_cat*
+device_addcat(struct device_meta* parent, char* name_fmt, ...);
+
+void
+device_remove(struct device_meta* dev);
+
+struct device_meta*
+device_getbyid(struct llist_header* devlist, u32_t id);
+
+struct device_meta*
+device_getbyhname(struct device_meta* root_dev, struct hstr* name);
+
+struct device_meta*
+device_getbyname(struct device_meta* root_dev, const char* name, size_t len);
+
+struct device_meta*
+device_getbyoffset(struct device_meta* root_dev, int pos);
+
+struct hbucket*
+device_definitions_byif(int if_type);
+
+struct device_def*
+devdef_byident(struct devident* class);
+
+void
+device_populate_info(struct device* dev, struct dev_info* devinfo);
+
+void
+device_scan_drivers();
+
+/*------ Capability ------*/
+
+struct capability_meta*
+alloc_capability(int cap, unsigned int size);
+
+#define new_capability(cap_type, cap_impl)\
+ ((cap_impl*)alloc_capability((cap_type), sizeof(cap_impl)))
+
+#define new_capability_marker(cap_type)\
+ (alloc_capability((cap_type), sizeof(struct capability_meta)))