Changeset 8b655705 in mainline for uspace/drv/rootpc/rootpc.c


Ignore:
Timestamp:
2011-04-15T19:38:07Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9dd730d1
Parents:
6b9e85b (diff), b2fb47f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/rootpc/rootpc.c

    r6b9e85b r8b655705  
    4646#include <macros.h>
    4747
    48 #include <driver.h>
     48#include <ddf/driver.h>
     49#include <ddf/log.h>
    4950#include <devman.h>
    5051#include <ipc/devman.h>
     
    5556#define NAME "rootpc"
    5657
    57 typedef struct rootpc_child_dev_data {
     58/** Obtain function soft-state from DDF function node */
     59#define ROOTPC_FUN(fnode) ((rootpc_fun_t *) (fnode)->driver_data)
     60
     61typedef struct rootpc_fun {
    5862        hw_resource_list_t hw_resources;
    59 } rootpc_child_dev_data_t;
    60 
    61 static int rootpc_add_device(device_t *dev);
     63} rootpc_fun_t;
     64
     65static int rootpc_add_device(ddf_dev_t *dev);
    6266static void root_pc_init(void);
    6367
     
    8286};
    8387
    84 static rootpc_child_dev_data_t pci_data = {
     88static rootpc_fun_t pci_data = {
    8589        .hw_resources = {
    8690                1,
     
    8993};
    9094
    91 static hw_resource_list_t *rootpc_get_child_resources(device_t *dev)
    92 {
    93         rootpc_child_dev_data_t *data;
    94        
    95         data = (rootpc_child_dev_data_t *) dev->driver_data;
    96         if (NULL == data)
    97                 return NULL;
    98        
    99         return &data->hw_resources;
    100 }
    101 
    102 static bool rootpc_enable_child_interrupt(device_t *dev)
     95static hw_resource_list_t *rootpc_get_resources(ddf_fun_t *fnode)
     96{
     97        rootpc_fun_t *fun = ROOTPC_FUN(fnode);
     98       
     99        assert(fun != NULL);
     100        return &fun->hw_resources;
     101}
     102
     103static bool rootpc_enable_interrupt(ddf_fun_t *fun)
    103104{
    104105        /* TODO */
     
    107108}
    108109
    109 static hw_res_ops_t child_hw_res_ops = {
    110         &rootpc_get_child_resources,
    111         &rootpc_enable_child_interrupt
     110static hw_res_ops_t fun_hw_res_ops = {
     111        &rootpc_get_resources,
     112        &rootpc_enable_interrupt
    112113};
    113114
    114115/* Initialized in root_pc_init() function. */
    115 static device_ops_t rootpc_child_ops;
     116static ddf_dev_ops_t rootpc_fun_ops;
    116117
    117118static bool
    118 rootpc_add_child(device_t *parent, const char *name, const char *str_match_id,
    119     rootpc_child_dev_data_t *drv_data)
    120 {
    121         printf(NAME ": adding new child device '%s'.\n", name);
    122        
    123         device_t *child = NULL;
     119rootpc_add_fun(ddf_dev_t *dev, const char *name, const char *str_match_id,
     120    rootpc_fun_t *fun)
     121{
     122        ddf_msg(LVL_DEBUG, "Adding new function '%s'.", name);
     123       
     124        ddf_fun_t *fnode = NULL;
    124125        match_id_t *match_id = NULL;
    125126       
    126127        /* Create new device. */
    127         child = create_device();
    128         if (NULL == child)
     128        fnode = ddf_fun_create(dev, fun_inner, name);
     129        if (fnode == NULL)
    129130                goto failure;
    130131       
    131         child->name = name;
    132         child->driver_data = drv_data;
     132        fnode->driver_data = fun;
    133133       
    134134        /* Initialize match id list */
    135135        match_id = create_match_id();
    136         if (NULL == match_id)
     136        if (match_id == NULL)
    137137                goto failure;
    138138       
    139139        match_id->id = str_match_id;
    140140        match_id->score = 100;
    141         add_match_id(&child->match_ids, match_id);
     141        add_match_id(&fnode->match_ids, match_id);
    142142       
    143143        /* Set provided operations to the device. */
    144         child->ops = &rootpc_child_ops;
    145        
    146         /* Register child device. */
    147         if (EOK != child_device_register(child, parent))
     144        fnode->ops = &rootpc_fun_ops;
     145       
     146        /* Register function. */
     147        if (ddf_fun_bind(fnode) != EOK) {
     148                ddf_msg(LVL_ERROR, "Failed binding function %s.", name);
    148149                goto failure;
     150        }
    149151       
    150152        return true;
    151153       
    152154failure:
    153         if (NULL != match_id)
     155        if (match_id != NULL)
    154156                match_id->id = NULL;
    155157       
    156         if (NULL != child) {
    157                 child->name = NULL;
    158                 delete_device(child);
    159         }
    160        
    161         printf(NAME ": failed to add child device '%s'.\n", name);
     158        if (fnode != NULL)
     159                ddf_fun_destroy(fnode);
     160       
     161        ddf_msg(LVL_ERROR, "Failed adding function '%s'.", name);
    162162       
    163163        return false;
    164164}
    165165
    166 static bool rootpc_add_children(device_t *dev)
    167 {
    168         return rootpc_add_child(dev, "pci0", "intel_pci", &pci_data);
     166static bool rootpc_add_functions(ddf_dev_t *dev)
     167{
     168        return rootpc_add_fun(dev, "pci0", "intel_pci", &pci_data);
    169169}
    170170
     
    175175 * @return              Zero on success, negative error number otherwise.
    176176 */
    177 static int rootpc_add_device(device_t *dev)
    178 {
    179         printf(NAME ": rootpc_add_device, device handle = %d\n",
     177static int rootpc_add_device(ddf_dev_t *dev)
     178{
     179        ddf_msg(LVL_DEBUG, "rootpc_add_device, device handle = %d",
    180180            (int)dev->handle);
    181181       
    182         /* Register child devices. */
    183         if (!rootpc_add_children(dev)) {
    184                 printf(NAME ": failed to add child devices for PC platform.\n");
     182        /* Register functions. */
     183        if (!rootpc_add_functions(dev)) {
     184                ddf_msg(LVL_ERROR, "Failed to add functions for PC platform.");
    185185        }
    186186       
     
    190190static void root_pc_init(void)
    191191{
    192         rootpc_child_ops.interfaces[HW_RES_DEV_IFACE] = &child_hw_res_ops;
     192        ddf_log_init(NAME, LVL_ERROR);
     193        rootpc_fun_ops.interfaces[HW_RES_DEV_IFACE] = &fun_hw_res_ops;
    193194}
    194195
     
    197198        printf(NAME ": HelenOS PC platform driver\n");
    198199        root_pc_init();
    199         return driver_main(&rootpc_driver);
     200        return ddf_driver_main(&rootpc_driver);
    200201}
    201202
Note: See TracChangeset for help on using the changeset viewer.