Changes in / [80bffdb0:d6b1359] in mainline
- Location:
- uspace/lib/drv
- Files:
-
- 6 edited
-
generic/dev_iface.c (modified) (3 diffs)
-
generic/driver.c (modified) (25 diffs)
-
generic/remote_char_dev.c (modified) (6 diffs)
-
generic/remote_hw_res.c (modified) (3 diffs)
-
include/dev_iface.h (modified) (1 diff)
-
include/driver.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/dev_iface.c
r80bffdb0 rd6b1359 36 36 */ 37 37 38 #include <assert.h>39 40 38 #include "dev_iface.h" 41 39 #include "remote_hw_res.h" … … 49 47 }; 50 48 51 remote_iface_t *get_remote_iface(int idx)49 remote_iface_t* get_remote_iface(int idx) 52 50 { 53 51 assert(is_valid_iface_idx(idx)); … … 61 59 return NULL; 62 60 } 63 64 61 return rem_iface->methods[iface_method_idx]; 65 }66 67 bool is_valid_iface_idx(int idx)68 {69 return (0 <= idx) && (idx < DEV_IFACE_MAX);70 62 } 71 63 -
uspace/lib/drv/generic/driver.c
r80bffdb0 rd6b1359 52 52 #include <ipc/driver.h> 53 53 54 #include "dev_iface.h"55 54 #include "driver.h" 56 55 57 /** Driver structure */ 56 /* driver structure */ 57 58 58 static driver_t *driver; 59 59 60 /** Devices */ 60 /* devices */ 61 61 62 LIST_INITIALIZE(devices); 62 63 FIBRIL_MUTEX_INITIALIZE(devices_mutex); 63 64 64 /** Interrupts */ 65 /* interrupts */ 66 65 67 static interrupt_context_list_t interrupt_contexts; 66 68 … … 83 85 84 86 ctx = find_interrupt_context_by_id(&interrupt_contexts, id); 85 if ( ctx != NULL && ctx->handler != NULL)87 if (NULL != ctx && NULL != ctx->handler) 86 88 (*ctx->handler)(ctx->dev, iid, icall); 87 89 } 88 89 interrupt_context_t *create_interrupt_context(void)90 {91 interrupt_context_t *ctx;92 93 ctx = (interrupt_context_t *) malloc(sizeof(interrupt_context_t));94 if (ctx != NULL)95 memset(ctx, 0, sizeof(interrupt_context_t));96 97 return ctx;98 }99 100 void delete_interrupt_context(interrupt_context_t *ctx)101 {102 if (ctx != NULL)103 free(ctx);104 }105 106 void init_interrupt_context_list(interrupt_context_list_t *list)107 {108 memset(list, 0, sizeof(interrupt_context_list_t));109 fibril_mutex_initialize(&list->mutex);110 list_initialize(&list->contexts);111 }112 113 void114 add_interrupt_context(interrupt_context_list_t *list, interrupt_context_t *ctx)115 {116 fibril_mutex_lock(&list->mutex);117 ctx->id = list->curr_id++;118 list_append(&ctx->link, &list->contexts);119 fibril_mutex_unlock(&list->mutex);120 }121 122 void remove_interrupt_context(interrupt_context_list_t *list,123 interrupt_context_t *ctx)124 {125 fibril_mutex_lock(&list->mutex);126 list_remove(&ctx->link);127 fibril_mutex_unlock(&list->mutex);128 }129 130 interrupt_context_t *131 find_interrupt_context_by_id(interrupt_context_list_t *list, int id)132 {133 fibril_mutex_lock(&list->mutex);134 135 link_t *link = list->contexts.next;136 interrupt_context_t *ctx;137 138 while (link != &list->contexts) {139 ctx = list_get_instance(link, interrupt_context_t, link);140 if (ctx->id == id) {141 fibril_mutex_unlock(&list->mutex);142 return ctx;143 }144 link = link->next;145 }146 147 fibril_mutex_unlock(&list->mutex);148 return NULL;149 }150 151 interrupt_context_t *152 find_interrupt_context(interrupt_context_list_t *list, device_t *dev, int irq)153 {154 fibril_mutex_lock(&list->mutex);155 156 link_t *link = list->contexts.next;157 interrupt_context_t *ctx;158 159 while (link != &list->contexts) {160 ctx = list_get_instance(link, interrupt_context_t, link);161 if (ctx->irq == irq && ctx->dev == dev) {162 fibril_mutex_unlock(&list->mutex);163 return ctx;164 }165 link = link->next;166 }167 168 fibril_mutex_unlock(&list->mutex);169 return NULL;170 }171 172 90 173 91 int … … 183 101 add_interrupt_context(&interrupt_contexts, ctx); 184 102 185 if ( pseudocode == NULL)103 if (NULL == pseudocode) 186 104 pseudocode = &default_pseudocode; 187 105 188 106 int res = ipc_register_irq(irq, dev->handle, ctx->id, pseudocode); 189 if ( res != EOK) {107 if (0 != res) { 190 108 remove_interrupt_context(&interrupt_contexts, ctx); 191 109 delete_interrupt_context(ctx); … … 200 118 dev, irq); 201 119 int res = ipc_unregister_irq(irq, dev->handle); 202 203 if ( ctx != NULL) {120 121 if (NULL != ctx) { 204 122 remove_interrupt_context(&interrupt_contexts, ctx); 205 123 delete_interrupt_context(ctx); 206 124 } 207 208 125 return res; 209 126 } … … 223 140 } 224 141 225 static device_t * driver_get_device(link_t *devices, devman_handle_t handle)142 static device_t * driver_get_device(link_t *devices, devman_handle_t handle) 226 143 { 227 144 device_t *dev = NULL; … … 229 146 fibril_mutex_lock(&devices_mutex); 230 147 link_t *link = devices->next; 231 232 148 while (link != devices) { 233 149 dev = list_get_instance(link, device_t, link); 234 if ( dev->handle ==handle) {150 if (handle == dev->handle) { 235 151 fibril_mutex_unlock(&devices_mutex); 236 152 return dev; … … 238 154 link = link->next; 239 155 } 240 241 156 fibril_mutex_unlock(&devices_mutex); 242 157 243 158 return NULL; 244 159 } … … 247 162 { 248 163 char *dev_name = NULL; 249 int res ;250 251 devman_handle_t dev_handle = IPC_GET_ARG1(*icall);164 int res = EOK; 165 166 devman_handle_t dev_handle = IPC_GET_ARG1(*icall); 252 167 devman_handle_t parent_dev_handle = IPC_GET_ARG2(*icall); 253 168 254 169 device_t *dev = create_device(); 255 170 dev->handle = dev_handle; … … 262 177 263 178 res = driver->driver_ops->add_device(dev); 264 if ( res == EOK) {179 if (0 == res) { 265 180 printf("%s: new device with handle=%" PRIun " was added.\n", 266 181 driver->name, dev_handle); … … 279 194 /* Accept connection */ 280 195 ipc_answer_0(iid, EOK); 281 196 282 197 bool cont = true; 283 198 while (cont) { 284 199 ipc_call_t call; 285 200 ipc_callid_t callid = async_get_call(&call); 286 201 287 202 switch (IPC_GET_IMETHOD(call)) { 288 203 case IPC_M_PHONE_HUNGUP: … … 325 240 * use the device. 326 241 */ 327 242 328 243 int ret = EOK; 329 244 /* open the device */ 330 if ( dev->ops != NULL && dev->ops->open != NULL)245 if (NULL != dev->ops && NULL != dev->ops->open) 331 246 ret = (*dev->ops->open)(dev); 332 247 333 ipc_answer_0(iid, ret); 334 if ( ret != EOK)248 ipc_answer_0(iid, ret); 249 if (EOK != ret) 335 250 return; 336 251 337 252 while (1) { 338 253 ipc_callid_t callid; … … 343 258 344 259 switch (method) { 345 case IPC_M_PHONE_HUNGUP: 260 case IPC_M_PHONE_HUNGUP: 346 261 /* close the device */ 347 if ( dev->ops != NULL && dev->ops->close != NULL)262 if (NULL != dev->ops && NULL != dev->ops->close) 348 263 (*dev->ops->close)(dev); 349 264 ipc_answer_0(callid, EOK); 350 265 return; 351 default: 266 default: 352 267 /* convert ipc interface id to interface index */ 353 268 … … 357 272 remote_handler_t *default_handler = 358 273 device_get_default_handler(dev); 359 if ( default_handler != NULL) {274 if (NULL != default_handler) { 360 275 (*default_handler)(dev, callid, &call); 361 276 break; … … 371 286 break; 372 287 } 373 288 374 289 /* calling one of the device's interfaces */ 375 290 376 /* Get the interface ops structure.*/377 void * ops = device_get_ops(dev, iface_idx);378 if ( ops == NULL) {291 /* get the device interface structure */ 292 void *iface = device_get_iface(dev, iface_idx); 293 if (NULL == iface) { 379 294 printf("%s: driver_connection_gen error - ", 380 295 driver->name); … … 384 299 break; 385 300 } 386 301 387 302 /* 388 303 * Get the corresponding interface for remote request 389 304 * handling ("remote interface"). 390 305 */ 391 remote_iface_t *rem_iface = get_remote_iface(iface_idx);392 assert( rem_iface != NULL);393 306 remote_iface_t* rem_iface = get_remote_iface(iface_idx); 307 assert(NULL != rem_iface); 308 394 309 /* get the method of the remote interface */ 395 310 sysarg_t iface_method_idx = IPC_GET_ARG1(call); 396 311 remote_iface_func_ptr_t iface_method_ptr = 397 312 get_remote_method(rem_iface, iface_method_idx); 398 if ( iface_method_ptr == NULL) {313 if (NULL == iface_method_ptr) { 399 314 // the interface has not such method 400 315 printf("%s: driver_connection_gen error - " … … 410 325 * associated with the device by its driver. 411 326 */ 412 (*iface_method_ptr)(dev, ops, callid, &call);327 (*iface_method_ptr)(dev, iface, callid, &call); 413 328 break; 414 329 } … … 433 348 switch ((sysarg_t) (IPC_GET_ARG1(*icall))) { 434 349 case DRIVER_DEVMAN: 435 /* Handle requestfrom device manager */350 /* handle PnP events from device manager */ 436 351 driver_connection_devman(iid, icall); 437 352 break; 438 353 case DRIVER_DRIVER: 439 /* Handle request from drivers of child devices */354 /* handle request from drivers of child devices */ 440 355 driver_connection_driver(iid, icall); 441 356 break; 442 357 case DRIVER_CLIENT: 443 /* Handle requestfrom client applications */358 /* handle requests from client applications */ 444 359 driver_connection_client(iid, icall); 445 360 break; 361 446 362 default: 447 363 /* No such interface */ … … 450 366 } 451 367 452 /** Create new device structure.453 *454 * @return The device structure.455 */456 device_t *create_device(void)457 {458 device_t *dev = malloc(sizeof(device_t));459 460 if (dev != NULL) {461 memset(dev, 0, sizeof(device_t));462 init_match_ids(&dev->match_ids);463 }464 465 return dev;466 }467 468 /** Delete device structure.469 *470 * @param dev The device structure.471 */472 void delete_device(device_t *dev)473 {474 clean_match_ids(&dev->match_ids);475 if (dev->name != NULL)476 free(dev->name);477 free(dev);478 }479 480 void *device_get_ops(device_t *dev, dev_inferface_idx_t idx)481 {482 assert(is_valid_iface_idx(idx));483 if (dev->ops == NULL)484 return NULL;485 return dev->ops->interfaces[idx];486 }487 488 368 int child_device_register(device_t *child, device_t *parent) 489 369 { 490 assert( child->name != NULL);491 370 assert(NULL != child->name); 371 492 372 int res; 493 373 … … 495 375 res = devman_child_device_register(child->name, &child->match_ids, 496 376 parent->handle, &child->handle); 497 if (res != EOK) { 498 remove_from_devices_list(child); 377 if (EOK == res) 499 378 return res; 500 } 501 379 remove_from_devices_list(child); 502 380 return res; 503 381 } … … 517 395 match_id_t *match_id = NULL; 518 396 int rc; 519 397 520 398 child = create_device(); 521 399 if (child == NULL) { … … 523 401 goto failure; 524 402 } 525 403 526 404 child->name = child_name; 527 405 528 406 match_id = create_match_id(); 529 407 if (match_id == NULL) { … … 531 409 goto failure; 532 410 } 533 411 534 412 match_id->id = child_match_id; 535 413 match_id->score = child_match_score; 536 414 add_match_id(&child->match_ids, match_id); 537 415 538 416 rc = child_device_register(child, parent); 539 if ( rc != EOK)417 if (EOK != rc) 540 418 goto failure; 541 419 542 420 return EOK; 543 421 544 422 failure: 545 423 if (match_id != NULL) { … … 547 425 delete_match_id(match_id); 548 426 } 549 427 550 428 if (child != NULL) { 551 429 child->name = NULL; 552 430 delete_device(child); 553 431 } 554 432 555 433 return rc; 556 }557 558 /** Get default handler for client requests */559 remote_handler_t *device_get_default_handler(device_t *dev)560 {561 if (dev->ops == NULL)562 return NULL;563 return dev->ops->default_handler;564 }565 566 int add_device_to_class(device_t *dev, const char *class_name)567 {568 return devman_add_device_to_class(dev->handle, class_name);569 434 } 570 435 … … 576 441 */ 577 442 driver = drv; 578 443 579 444 /* Initialize the list of interrupt contexts. */ 580 445 init_interrupt_context_list(&interrupt_contexts); … … 588 453 */ 589 454 devman_driver_register(driver->name, driver_connection); 590 455 591 456 async_manager(); 592 457 593 458 /* Never reached. */ 594 459 return 0; -
uspace/lib/drv/generic/remote_char_dev.c
r80bffdb0 rd6b1359 69 69 * 70 70 * @param dev The device from which the data are read. 71 * @param ops The local opsstructure.71 * @param iface The local interface structure. 72 72 */ 73 73 static void 74 remote_char_read(device_t *dev, void * ops, ipc_callid_t callid,74 remote_char_read(device_t *dev, void *iface, ipc_callid_t callid, 75 75 ipc_call_t *call) 76 76 { 77 char_dev_ops_t *char_ dev_ops = (char_dev_ops_t *) ops;77 char_dev_ops_t *char_iface = (char_dev_ops_t *) iface; 78 78 ipc_callid_t cid; 79 79 … … 85 85 } 86 86 87 if (!char_ dev_ops->read) {87 if (!char_iface->read) { 88 88 async_data_read_finalize(cid, NULL, 0); 89 89 ipc_answer_0(callid, ENOTSUP); … … 95 95 96 96 char buf[MAX_CHAR_RW_COUNT]; 97 int ret = (*char_ dev_ops->read)(dev, buf, len);97 int ret = (*char_iface->read)(dev, buf, len); 98 98 99 99 if (ret < 0) { … … 116 116 * 117 117 * @param dev The device to which the data are written. 118 * @param ops The local opsstructure.118 * @param iface The local interface structure. 119 119 */ 120 120 static void 121 remote_char_write(device_t *dev, void * ops, ipc_callid_t callid,121 remote_char_write(device_t *dev, void *iface, ipc_callid_t callid, 122 122 ipc_call_t *call) 123 123 { 124 char_dev_ops_t *char_ dev_ops = (char_dev_ops_t *) ops;124 char_dev_ops_t *char_iface = (char_dev_ops_t *) iface; 125 125 ipc_callid_t cid; 126 126 size_t len; … … 132 132 } 133 133 134 if (!char_ dev_ops->write) {134 if (!char_iface->write) { 135 135 async_data_write_finalize(cid, NULL, 0); 136 136 ipc_answer_0(callid, ENOTSUP); … … 145 145 async_data_write_finalize(cid, buf, len); 146 146 147 int ret = (*char_ dev_ops->write)(dev, buf, len);147 int ret = (*char_iface->write)(dev, buf, len); 148 148 if (ret < 0) { 149 149 /* Some error occured. */ -
uspace/lib/drv/generic/remote_hw_res.c
r80bffdb0 rd6b1359 40 40 #include "driver.h" 41 41 42 static void remote_ hw_res_get_resource_list(device_t *, void *, ipc_callid_t,42 static void remote_res_get_resource_list(device_t *, void *, ipc_callid_t, 43 43 ipc_call_t *); 44 static void remote_ hw_res_enable_interrupt(device_t *, void *, ipc_callid_t,44 static void remote_res_enable_interrupt(device_t *, void *, ipc_callid_t, 45 45 ipc_call_t *); 46 46 47 47 static remote_iface_func_ptr_t remote_hw_res_iface_ops [] = { 48 &remote_ hw_res_get_resource_list,49 &remote_ hw_res_enable_interrupt48 &remote_res_get_resource_list, 49 &remote_res_enable_interrupt 50 50 }; 51 51 … … 56 56 }; 57 57 58 static void remote_ hw_res_enable_interrupt(device_t *dev, void *ops,58 static void remote_res_enable_interrupt(device_t *dev, void *iface, 59 59 ipc_callid_t callid, ipc_call_t *call) 60 60 { 61 hw_res_ops_t * hw_res_ops = (hw_res_ops_t *) ops;61 hw_res_ops_t *ires = (hw_res_ops_t *) iface; 62 62 63 if ( hw_res_ops->enable_interrupt == NULL)63 if (NULL == ires->enable_interrupt) 64 64 ipc_answer_0(callid, ENOTSUP); 65 else if ( hw_res_ops->enable_interrupt(dev))65 else if (ires->enable_interrupt(dev)) 66 66 ipc_answer_0(callid, EOK); 67 67 else … … 69 69 } 70 70 71 static void remote_ hw_res_get_resource_list(device_t *dev, void *ops,71 static void remote_res_get_resource_list(device_t *dev, void *iface, 72 72 ipc_callid_t callid, ipc_call_t *call) 73 73 { 74 hw_res_ops_t *hw_res_ops = (hw_res_ops_t *) ops; 75 76 if (hw_res_ops->get_resource_list == NULL) { 74 hw_res_ops_t *ires = (hw_res_ops_t *) iface; 75 if (NULL == ires->get_resource_list) { 77 76 ipc_answer_0(callid, ENOTSUP); 78 77 return; 79 78 } 80 79 81 hw_resource_list_t *hw_resources = hw_res_ops->get_resource_list(dev);82 if ( hw_resources == NULL){80 hw_resource_list_t *hw_resources = ires->get_resource_list(dev); 81 if (NULL == hw_resources){ 83 82 ipc_answer_0(callid, ENOENT); 84 83 return; 85 } 84 } 86 85 87 ipc_answer_1(callid, EOK, hw_resources->count); 86 ipc_answer_1(callid, EOK, hw_resources->count); 88 87 89 88 size_t len; 90 89 if (!async_data_read_receive(&callid, &len)) { 91 /* Protocol error - the recipient is not accepting data */90 /* protocol error - the recipient is not accepting data */ 92 91 return; 93 92 } -
uspace/lib/drv/include/dev_iface.h
r80bffdb0 rd6b1359 36 36 #define LIBDRV_DEV_IFACE_H_ 37 37 38 #include <ipc/dev_iface.h>38 #include "driver.h" 39 39 40 /* 41 * Device interface 42 */ 43 44 struct device; 45 46 /* 47 * First two parameters: device and interface structure registered by the 48 * devices driver. 49 */ 50 typedef void remote_iface_func_t(struct device *, void *, ipc_callid_t, 51 ipc_call_t *); 52 typedef remote_iface_func_t *remote_iface_func_ptr_t; 53 typedef void remote_handler_t(struct device *, ipc_callid_t, ipc_call_t *); 54 55 typedef struct { 56 size_t method_count; 57 remote_iface_func_ptr_t *methods; 58 } remote_iface_t; 59 60 typedef struct { 61 remote_iface_t *ifaces[DEV_IFACE_COUNT]; 62 } iface_dipatch_table_t; 63 64 extern remote_iface_t *get_remote_iface(int); 65 extern remote_iface_func_ptr_t get_remote_method(remote_iface_t *, sysarg_t); 66 67 68 extern bool is_valid_iface_idx(int); 40 /* TODO declare device interface structures here */ 69 41 70 42 #endif -
uspace/lib/drv/include/driver.h
r80bffdb0 rd6b1359 47 47 #include <malloc.h> 48 48 49 #include "dev_iface.h"50 51 49 struct device; 52 50 typedef struct device device_t; 53 51 52 /* device interface */ 53 54 54 /* 55 * Device class 56 */ 57 58 /** Devices operations */ 55 * First two parameters: device and interface structure registered by the 56 * devices driver. 57 */ 58 typedef void remote_iface_func_t(device_t *, void *, ipc_callid_t, 59 ipc_call_t *); 60 typedef remote_iface_func_t *remote_iface_func_ptr_t; 61 typedef void remote_handler_t(device_t *, ipc_callid_t, ipc_call_t *); 62 63 typedef struct { 64 size_t method_count; 65 remote_iface_func_ptr_t *methods; 66 } remote_iface_t; 67 68 typedef struct { 69 remote_iface_t *ifaces[DEV_IFACE_COUNT]; 70 } iface_dipatch_table_t; 71 72 73 static inline bool is_valid_iface_idx(int idx) 74 { 75 return 0 <= idx && idx < DEV_IFACE_MAX; 76 } 77 78 remote_iface_t *get_remote_iface(int); 79 remote_iface_func_ptr_t get_remote_method(remote_iface_t *, sysarg_t); 80 81 82 /* device class */ 83 84 /** Devices operations. */ 59 85 typedef struct device_ops { 60 86 /** … … 82 108 83 109 84 /* 85 * Device 86 */ 87 88 /** Device structure */ 110 /* device */ 111 112 /** The device. */ 89 113 struct device { 90 114 /** … … 95 119 96 120 /** 97 * Phone to the parent device driver (if it is different from this98 * driver) 121 * The phone to the parent device driver (if it is different from this 122 * driver). 99 123 */ 100 124 int parent_phone; 101 125 102 /** Parent device if handled by this driver, NULL otherwise */126 /** Parent device if handled by this driver, NULL otherwise. */ 103 127 device_t *parent; 104 /** Device name*/128 /** The device's name. */ 105 129 const char *name; 106 /** List of device ids for device-to-driver matching*/130 /** The list of device ids for device-to-driver matching. */ 107 131 match_id_list_t match_ids; 108 /** Driver-specific data associated with this device*/132 /** The device driver's data associated with this device. */ 109 133 void *driver_data; 110 /** The implementation of operations provided by this device */134 /** The implementation of operations provided by this device. */ 111 135 device_ops_t *ops; 112 136 113 /** Link in the list of devices handled by the driver */ 137 /** 138 * Pointer to the previous and next device in the list of devices 139 * handled by the driver. 140 */ 114 141 link_t link; 115 142 }; 116 143 117 /* 118 * Driver 119 */ 120 121 /** Generic device driver operations */ 144 145 /* driver */ 146 147 /** Generic device driver operations. */ 122 148 typedef struct driver_ops { 123 /** Callback method for passing a new device to the device driver */149 /** Callback method for passing a new device to the device driver.*/ 124 150 int (*add_device)(device_t *dev); 125 /* TODO :add other generic driver operations */151 /* TODO add other generic driver operations */ 126 152 } driver_ops_t; 127 153 128 /** Driver structure*/154 /** The driver structure.*/ 129 155 typedef struct driver { 130 /** Name of the device driver*/156 /** The name of the device driver. */ 131 157 const char *name; 132 /** Generic device driver operations */158 /** Generic device driver operations. */ 133 159 driver_ops_t *driver_ops; 134 160 } driver_t; … … 140 166 * @return The device structure. 141 167 */ 142 extern device_t *create_device(void); 143 extern void delete_device(device_t *); 144 extern void *device_get_ops(device_t *, dev_inferface_idx_t); 145 146 extern int child_device_register(device_t *, device_t *); 147 extern int child_device_register_wrapper(device_t *, const char *, const char *, 148 int); 149 150 /* 151 * Interrupts 152 */ 168 static inline device_t *create_device(void) 169 { 170 device_t *dev = malloc(sizeof(device_t)); 171 if (NULL != dev) { 172 memset(dev, 0, sizeof(device_t)); 173 init_match_ids(&dev->match_ids); 174 } 175 return dev; 176 } 177 178 /** Delete device structure. 179 * 180 * @param dev The device structure. 181 */ 182 static inline void delete_device(device_t *dev) 183 { 184 clean_match_ids(&dev->match_ids); 185 if (NULL != dev->name) 186 free(dev->name); 187 free(dev); 188 } 189 190 static inline void *device_get_iface(device_t *dev, dev_inferface_idx_t idx) 191 { 192 assert(is_valid_iface_idx(idx)); 193 if (NULL == dev->ops) 194 return NULL; 195 return dev->ops->interfaces[idx]; 196 } 197 198 int child_device_register(device_t *, device_t *); 199 int child_device_register_wrapper(device_t *, const char *, const char *, int); 200 201 202 /* interrupts */ 153 203 154 204 typedef void interrupt_handler_t(device_t *, ipc_callid_t, ipc_call_t *); … … 168 218 } interrupt_context_list_t; 169 219 170 extern interrupt_context_t *create_interrupt_context(void); 171 extern void delete_interrupt_context(interrupt_context_t *); 172 extern void init_interrupt_context_list(interrupt_context_list_t *); 173 extern void add_interrupt_context(interrupt_context_list_t *, 174 interrupt_context_t *); 175 extern void remove_interrupt_context(interrupt_context_list_t *, 176 interrupt_context_t *); 177 extern interrupt_context_t *find_interrupt_context_by_id( 178 interrupt_context_list_t *, int); 179 extern interrupt_context_t *find_interrupt_context( 180 interrupt_context_list_t *, device_t *, int); 181 182 extern int register_interrupt_handler(device_t *, int, interrupt_handler_t *, 220 static inline interrupt_context_t *create_interrupt_context(void) 221 { 222 interrupt_context_t *ctx; 223 224 ctx = (interrupt_context_t *) malloc(sizeof(interrupt_context_t)); 225 if (NULL != ctx) 226 memset(ctx, 0, sizeof(interrupt_context_t)); 227 228 return ctx; 229 } 230 231 static inline void delete_interrupt_context(interrupt_context_t *ctx) 232 { 233 if (NULL != ctx) 234 free(ctx); 235 } 236 237 static inline void init_interrupt_context_list(interrupt_context_list_t *list) 238 { 239 memset(list, 0, sizeof(interrupt_context_list_t)); 240 fibril_mutex_initialize(&list->mutex); 241 list_initialize(&list->contexts); 242 } 243 244 static inline void 245 add_interrupt_context(interrupt_context_list_t *list, interrupt_context_t *ctx) 246 { 247 fibril_mutex_lock(&list->mutex); 248 ctx->id = list->curr_id++; 249 list_append(&ctx->link, &list->contexts); 250 fibril_mutex_unlock(&list->mutex); 251 } 252 253 static inline void 254 remove_interrupt_context(interrupt_context_list_t *list, 255 interrupt_context_t *ctx) 256 { 257 fibril_mutex_lock(&list->mutex); 258 list_remove(&ctx->link); 259 fibril_mutex_unlock(&list->mutex); 260 } 261 262 static inline interrupt_context_t * 263 find_interrupt_context_by_id(interrupt_context_list_t *list, int id) 264 { 265 fibril_mutex_lock(&list->mutex); 266 267 link_t *link = list->contexts.next; 268 interrupt_context_t *ctx; 269 270 while (link != &list->contexts) { 271 ctx = list_get_instance(link, interrupt_context_t, link); 272 if (id == ctx->id) { 273 fibril_mutex_unlock(&list->mutex); 274 return ctx; 275 } 276 link = link->next; 277 } 278 279 fibril_mutex_unlock(&list->mutex); 280 return NULL; 281 } 282 283 static inline interrupt_context_t * 284 find_interrupt_context(interrupt_context_list_t *list, device_t *dev, int irq) 285 { 286 fibril_mutex_lock(&list->mutex); 287 288 link_t *link = list->contexts.next; 289 interrupt_context_t *ctx; 290 291 while (link != &list->contexts) { 292 ctx = list_get_instance(link, interrupt_context_t, link); 293 if (irq == ctx->irq && dev == ctx->dev) { 294 fibril_mutex_unlock(&list->mutex); 295 return ctx; 296 } 297 link = link->next; 298 } 299 300 fibril_mutex_unlock(&list->mutex); 301 return NULL; 302 } 303 304 int register_interrupt_handler(device_t *, int, interrupt_handler_t *, 183 305 irq_code_t *); 184 extern int unregister_interrupt_handler(device_t *, int); 185 186 extern remote_handler_t *device_get_default_handler(device_t *); 187 extern int add_device_to_class(device_t *, const char *); 306 int unregister_interrupt_handler(device_t *, int); 307 308 309 /* default handler for client requests */ 310 311 static inline remote_handler_t *device_get_default_handler(device_t *dev) 312 { 313 if (NULL == dev->ops) 314 return NULL; 315 return dev->ops->default_handler; 316 } 317 318 static inline int add_device_to_class(device_t *dev, const char *class_name) 319 { 320 return devman_add_device_to_class(dev->handle, class_name); 321 } 188 322 189 323 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
