Changeset 233e68d in mainline for uspace/drv/rootpc/rootpc.c
- Timestamp:
- 2011-02-23T18:28:41Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e9e58ea3
- Parents:
- deece2f (diff), a9c674e0 (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/rootpc/rootpc.c
rdeece2f r233e68d 46 46 #include <macros.h> 47 47 48 #include <d river.h>48 #include <ddf/driver.h> 49 49 #include <devman.h> 50 50 #include <ipc/devman.h> … … 55 55 #define NAME "rootpc" 56 56 57 typedef struct rootpc_child_dev_data { 57 /** Obtain function soft-state from DDF function node */ 58 #define ROOTPC_FUN(fnode) ((rootpc_fun_t *) (fnode)->driver_data) 59 60 typedef struct rootpc_fun { 58 61 hw_resource_list_t hw_resources; 59 } rootpc_ child_dev_data_t;60 61 static int rootpc_add_device(d evice_t *dev);62 } rootpc_fun_t; 63 64 static int rootpc_add_device(ddf_dev_t *dev); 62 65 static void root_pc_init(void); 63 66 … … 82 85 }; 83 86 84 static rootpc_ child_dev_data_t pci_data = {87 static rootpc_fun_t pci_data = { 85 88 .hw_resources = { 86 89 1, … … 89 92 }; 90 93 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) 94 static hw_resource_list_t *rootpc_get_resources(ddf_fun_t *fnode) 95 { 96 rootpc_fun_t *fun = ROOTPC_FUN(fnode); 97 98 assert(fun != NULL); 99 return &fun->hw_resources; 100 } 101 102 static bool rootpc_enable_interrupt(ddf_fun_t *fun) 103 103 { 104 104 /* TODO */ … … 107 107 } 108 108 109 static hw_res_ops_t child_hw_res_ops = {110 &rootpc_get_ child_resources,111 &rootpc_enable_ child_interrupt109 static hw_res_ops_t fun_hw_res_ops = { 110 &rootpc_get_resources, 111 &rootpc_enable_interrupt 112 112 }; 113 113 114 114 /* Initialized in root_pc_init() function. */ 115 static d evice_ops_t rootpc_child_ops;115 static ddf_dev_ops_t rootpc_fun_ops; 116 116 117 117 static 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 d evice_t *child= NULL;118 rootpc_add_fun(ddf_dev_t *dev, const char *name, const char *str_match_id, 119 rootpc_fun_t *fun) 120 { 121 printf(NAME ": adding new function '%s'.\n", name); 122 123 ddf_fun_t *fnode = NULL; 124 124 match_id_t *match_id = NULL; 125 125 126 126 /* Create new device. */ 127 child = create_device();128 if ( NULL == child)127 fnode = ddf_fun_create(dev, fun_inner, name); 128 if (fnode == NULL) 129 129 goto failure; 130 130 131 child->name = name; 132 child->driver_data = drv_data; 131 fnode->driver_data = fun; 133 132 134 133 /* Initialize match id list */ 135 134 match_id = create_match_id(); 136 if ( NULL == match_id)135 if (match_id == NULL) 137 136 goto failure; 138 137 139 138 match_id->id = str_match_id; 140 139 match_id->score = 100; 141 add_match_id(& child->match_ids, match_id);140 add_match_id(&fnode->match_ids, match_id); 142 141 143 142 /* 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)) 143 fnode->ops = &rootpc_fun_ops; 144 145 /* Register function. */ 146 if (ddf_fun_bind(fnode) != EOK) { 147 printf(NAME ": error binding function %s.\n", name); 148 148 goto failure; 149 } 149 150 150 151 return true; 151 152 152 153 failure: 153 if ( NULL != match_id)154 if (match_id != NULL) 154 155 match_id->id = NULL; 155 156 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); 157 if (fnode != NULL) 158 ddf_fun_destroy(fnode); 159 160 printf(NAME ": failed to add function '%s'.\n", name); 162 161 163 162 return false; 164 163 } 165 164 166 static bool rootpc_add_ children(device_t *dev)167 { 168 return rootpc_add_ child(dev, "pci0", "intel_pci", &pci_data);165 static bool rootpc_add_functions(ddf_dev_t *dev) 166 { 167 return rootpc_add_fun(dev, "pci0", "intel_pci", &pci_data); 169 168 } 170 169 … … 175 174 * @return Zero on success, negative error number otherwise. 176 175 */ 177 static int rootpc_add_device(d evice_t *dev)176 static int rootpc_add_device(ddf_dev_t *dev) 178 177 { 179 178 printf(NAME ": rootpc_add_device, device handle = %d\n", 180 179 (int)dev->handle); 181 180 182 /* Register child devices. */183 if (!rootpc_add_ children(dev)) {184 printf(NAME ": failed to add child devices for PC platform.\n");181 /* Register functions. */ 182 if (!rootpc_add_functions(dev)) { 183 printf(NAME ": failed to add functions for PC platform.\n"); 185 184 } 186 185 … … 190 189 static void root_pc_init(void) 191 190 { 192 rootpc_ child_ops.interfaces[HW_RES_DEV_IFACE] = &child_hw_res_ops;191 rootpc_fun_ops.interfaces[HW_RES_DEV_IFACE] = &fun_hw_res_ops; 193 192 } 194 193 … … 197 196 printf(NAME ": HelenOS PC platform driver\n"); 198 197 root_pc_init(); 199 return d river_main(&rootpc_driver);198 return ddf_driver_main(&rootpc_driver); 200 199 } 201 200
Note:
See TracChangeset
for help on using the changeset viewer.