Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devman/devman.h

    r791f58c r58b833c  
    283283/* Drivers */
    284284
    285 extern void init_driver_list(driver_list_t *);
     285/**
     286 * Initialize the list of device driver's.
     287 *
     288 * @param drv_list the list of device driver's.
     289 *
     290 */
     291static inline void init_driver_list(driver_list_t *drv_list)
     292{
     293        assert(drv_list != NULL);
     294       
     295        list_initialize(&drv_list->drivers);
     296        fibril_mutex_initialize(&drv_list->drivers_mutex);
     297}
     298
    286299extern driver_t *create_driver(void);
    287300extern bool get_driver_info(const char *, const char *, driver_t *);
     
    298311extern driver_t *find_driver(driver_list_t *, const char *);
    299312extern void set_driver_phone(driver_t *, ipcarg_t);
    300 extern void initialize_running_driver(driver_t *, dev_tree_t *);
    301 
    302 extern void init_driver(driver_t *);
    303 extern void clean_driver(driver_t *);
    304 extern void delete_driver(driver_t *);
     313void initialize_running_driver(driver_t *, dev_tree_t *);
     314
     315/** Initialize device driver structure.
     316 *
     317 * @param drv           The device driver structure.
     318 */
     319static inline void init_driver(driver_t *drv)
     320{
     321        assert(drv != NULL);
     322
     323        memset(drv, 0, sizeof(driver_t));
     324        list_initialize(&drv->match_ids.ids);
     325        list_initialize(&drv->devices);
     326        fibril_mutex_initialize(&drv->driver_mutex);
     327}
     328
     329/** Device driver structure clean-up.
     330 *
     331 * @param drv           The device driver structure.
     332 */
     333static inline void clean_driver(driver_t *drv)
     334{
     335        assert(drv != NULL);
     336
     337        free_not_null(drv->name);
     338        free_not_null(drv->binary_path);
     339
     340        clean_match_ids(&drv->match_ids);
     341
     342        init_driver(drv);
     343}
     344
     345/** Delete device driver structure.
     346 *
     347 * @param drv           The device driver structure.
     348 */
     349static inline void delete_driver(driver_t *drv)
     350{
     351        assert(drv != NULL);
     352       
     353        clean_driver(drv);
     354        free(drv);
     355}
     356
    305357
    306358/* Device nodes */
    307359
    308 extern node_t *create_dev_node(void);
    309 extern void delete_dev_node(node_t *node);
    310 extern node_t *find_dev_node_no_lock(dev_tree_t *tree,
    311     device_handle_t handle);
    312 extern node_t *find_dev_node(dev_tree_t *tree, device_handle_t handle);
     360/** Create a new device node.
     361 *
     362 * @return              A device node structure.
     363 */
     364static inline node_t *create_dev_node(void)
     365{
     366        node_t *res = malloc(sizeof(node_t));
     367       
     368        if (res != NULL) {
     369                memset(res, 0, sizeof(node_t));
     370                list_initialize(&res->children);
     371                list_initialize(&res->match_ids.ids);
     372                list_initialize(&res->classes);
     373        }
     374       
     375        return res;
     376}
     377
     378/** Delete a device node.
     379 *
     380 * @param node          The device node structure.
     381 */
     382static inline void delete_dev_node(node_t *node)
     383{
     384        assert(list_empty(&node->children));
     385        assert(node->parent == NULL);
     386        assert(node->drv == NULL);
     387       
     388        clean_match_ids(&node->match_ids);
     389        free_not_null(node->name);
     390        free_not_null(node->pathname);
     391        free(node);
     392}
     393
     394/** Find the device node structure of the device witch has the specified handle.
     395 *
     396 * Device tree's rwlock should be held at least for reading.
     397 *
     398 * @param tree          The device tree where we look for the device node.
     399 * @param handle        The handle of the device.
     400 * @return              The device node.
     401 */
     402static inline node_t *find_dev_node_no_lock(dev_tree_t *tree,
     403    device_handle_t handle)
     404{
     405        unsigned long key = handle;
     406        link_t *link = hash_table_find(&tree->devman_devices, &key);
     407        return hash_table_get_instance(link, node_t, devman_link);
     408}
     409
     410/** Find the device node structure of the device witch has the specified handle.
     411 *
     412 * @param tree          The device tree where we look for the device node.
     413 * @param handle        The handle of the device.
     414 * @return              The device node.
     415 */
     416static inline node_t *find_dev_node(dev_tree_t *tree, device_handle_t handle)
     417{
     418        node_t *node = NULL;
     419       
     420        fibril_rwlock_read_lock(&tree->rwlock);
     421        node = find_dev_node_no_lock(tree, handle);
     422        fibril_rwlock_read_unlock(&tree->rwlock);
     423       
     424        return node;
     425}
     426
    313427extern node_t *find_dev_node_by_path(dev_tree_t *, char *);
    314428extern node_t *find_node_child(node_t *, const char *);
     429
    315430
    316431/* Device tree */
     
    320435extern bool insert_dev_node(dev_tree_t *, node_t *, char *, node_t *);
    321436
     437
    322438/* Device classes */
    323439
    324 extern dev_class_t *create_dev_class(void);
    325 extern dev_class_info_t *create_dev_class_info(void);
    326 extern size_t get_new_class_dev_idx(dev_class_t *);
     440/** Create device class.
     441 *
     442 * @return      Device class.
     443 */
     444static inline dev_class_t *create_dev_class(void)
     445{
     446        dev_class_t *cl;
     447       
     448        cl = (dev_class_t *) malloc(sizeof(dev_class_t));
     449        if (cl != NULL) {
     450                memset(cl, 0, sizeof(dev_class_t));
     451                list_initialize(&cl->devices);
     452                fibril_mutex_initialize(&cl->mutex);
     453        }
     454       
     455        return cl;
     456}
     457
     458/** Create device class info.
     459 *
     460 * @return              Device class info.
     461 */
     462static inline dev_class_info_t *create_dev_class_info(void)
     463{
     464        dev_class_info_t *info;
     465       
     466        info = (dev_class_info_t *) malloc(sizeof(dev_class_info_t));
     467        if (info != NULL)
     468                memset(info, 0, sizeof(dev_class_info_t));
     469       
     470        return info;
     471}
     472
     473static inline size_t get_new_class_dev_idx(dev_class_t *cl)
     474{
     475        size_t dev_idx;
     476       
     477        fibril_mutex_lock(&cl->mutex);
     478        dev_idx = ++cl->curr_dev_idx;
     479        fibril_mutex_unlock(&cl->mutex);
     480       
     481        return dev_idx;
     482}
     483
    327484extern char *create_dev_name_for_class(dev_class_t *, const char *);
    328485extern dev_class_info_t *add_device_to_class(node_t *, dev_class_t *,
     
    333490extern dev_class_t *get_dev_class(class_list_t *, char *);
    334491extern dev_class_t *find_dev_class_no_lock(class_list_t *, const char *);
    335 extern void add_dev_class_no_lock(class_list_t *, dev_class_t *);
     492
     493static inline void add_dev_class_no_lock(class_list_t *class_list,
     494    dev_class_t *cl)
     495{
     496        list_append(&cl->link, &class_list->classes);
     497}
     498
    336499
    337500/* Devmap devices */
     
    340503extern node_t *find_devmap_class_device(class_list_t *, dev_handle_t);
    341504
    342 extern void class_add_devmap_device(class_list_t *, dev_class_info_t *);
    343 extern void tree_add_devmap_device(dev_tree_t *, node_t *);
     505static inline void class_add_devmap_device(class_list_t *class_list,
     506    dev_class_info_t *cli)
     507{
     508        unsigned long key = (unsigned long) cli->devmap_handle;
     509       
     510        fibril_rwlock_write_lock(&class_list->rwlock);
     511        hash_table_insert(&class_list->devmap_devices, &key, &cli->devmap_link);
     512        fibril_rwlock_write_unlock(&class_list->rwlock);
     513}
     514
     515static inline void tree_add_devmap_device(dev_tree_t *tree, node_t *node)
     516{
     517        unsigned long key = (unsigned long) node->devmap_handle;
     518        fibril_rwlock_write_lock(&tree->rwlock);
     519        hash_table_insert(&tree->devmap_devices, &key, &node->devmap_link);
     520        fibril_rwlock_write_unlock(&tree->rwlock);
     521}
    344522
    345523#endif
Note: See TracChangeset for help on using the changeset viewer.