Changes in uspace/drv/rootpc/rootpc.c [ebcb05a:41b56084] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/rootpc/rootpc.c
rebcb05a r41b56084 46 46 #include <macros.h> 47 47 48 #include <ddf/driver.h> 49 #include <ddf/log.h> 48 #include <driver.h> 50 49 #include <devman.h> 51 50 #include <ipc/devman.h> … … 56 55 #define NAME "rootpc" 57 56 58 /** Obtain function soft-state from DDF function node */ 59 #define ROOTPC_FUN(fnode) ((rootpc_fun_t *) (fnode)->driver_data) 60 61 typedef struct rootpc_fun { 57 typedef struct rootpc_child_dev_data { 62 58 hw_resource_list_t hw_resources; 63 } rootpc_ fun_t;64 65 static int rootpc_add_device(d df_dev_t *dev);59 } rootpc_child_dev_data_t; 60 61 static int rootpc_add_device(device_t *dev); 66 62 static void root_pc_init(void); 67 63 … … 86 82 }; 87 83 88 static rootpc_ fun_t pci_data = {84 static rootpc_child_dev_data_t pci_data = { 89 85 .hw_resources = { 90 86 1, … … 93 89 }; 94 90 95 static 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 103 static bool rootpc_enable_interrupt(ddf_fun_t *fun) 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) 104 103 { 105 104 /* TODO */ … … 108 107 } 109 108 110 static hw_res_ops_t fun_hw_res_ops = {111 &rootpc_get_ resources,112 &rootpc_enable_ interrupt109 static hw_res_ops_t child_hw_res_ops = { 110 &rootpc_get_child_resources, 111 &rootpc_enable_child_interrupt 113 112 }; 114 113 115 114 /* Initialized in root_pc_init() function. */ 116 static d df_dev_ops_t rootpc_fun_ops;115 static device_ops_t rootpc_child_ops; 117 116 118 117 static bool 119 rootpc_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 d df_fun_t *fnode= NULL;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; 125 124 match_id_t *match_id = NULL; 126 125 127 126 /* Create new device. */ 128 fnode = ddf_fun_create(dev, fun_inner, name);129 if ( fnode == NULL)127 child = create_device(); 128 if (NULL == child) 130 129 goto failure; 131 130 132 fnode->driver_data = fun; 131 child->name = name; 132 child->driver_data = drv_data; 133 133 134 134 /* Initialize match id list */ 135 135 match_id = create_match_id(); 136 if ( match_id == NULL)136 if (NULL == match_id) 137 137 goto failure; 138 138 139 139 match_id->id = str_match_id; 140 140 match_id->score = 100; 141 add_match_id(& fnode->match_ids, match_id);141 add_match_id(&child->match_ids, match_id); 142 142 143 143 /* Set provided operations to the device. */ 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); 144 child->ops = &rootpc_child_ops; 145 146 /* Register child device. */ 147 if (EOK != child_device_register(child, parent)) 149 148 goto failure; 150 }151 149 152 150 return true; 153 151 154 152 failure: 155 if ( match_id != NULL)153 if (NULL != match_id) 156 154 match_id->id = NULL; 157 155 158 if (fnode != NULL) 159 ddf_fun_destroy(fnode); 160 161 ddf_msg(LVL_ERROR, "Failed adding function '%s'.", name); 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); 162 162 163 163 return false; 164 164 } 165 165 166 static bool rootpc_add_ functions(ddf_dev_t *dev)167 { 168 return rootpc_add_ fun(dev, "pci0", "intel_pci", &pci_data);166 static bool rootpc_add_children(device_t *dev) 167 { 168 return rootpc_add_child(dev, "pci0", "intel_pci", &pci_data); 169 169 } 170 170 … … 175 175 * @return Zero on success, negative error number otherwise. 176 176 */ 177 static int rootpc_add_device(d df_dev_t *dev)178 { 179 ddf_msg(LVL_DEBUG, "rootpc_add_device, device handle = %d",177 static int rootpc_add_device(device_t *dev) 178 { 179 printf(NAME ": rootpc_add_device, device handle = %d\n", 180 180 (int)dev->handle); 181 181 182 /* Register functions. */183 if (!rootpc_add_ functions(dev)) {184 ddf_msg(LVL_ERROR, "Failed to add functions for PC platform.");182 /* Register child devices. */ 183 if (!rootpc_add_children(dev)) { 184 printf(NAME ": failed to add child devices for PC platform.\n"); 185 185 } 186 186 … … 190 190 static void root_pc_init(void) 191 191 { 192 ddf_log_init(NAME, LVL_ERROR); 193 rootpc_fun_ops.interfaces[HW_RES_DEV_IFACE] = &fun_hw_res_ops; 192 rootpc_child_ops.interfaces[HW_RES_DEV_IFACE] = &child_hw_res_ops; 194 193 } 195 194 … … 198 197 printf(NAME ": HelenOS PC platform driver\n"); 199 198 root_pc_init(); 200 return d df_driver_main(&rootpc_driver);199 return driver_main(&rootpc_driver); 201 200 } 202 201
Note:
See TracChangeset
for help on using the changeset viewer.