Lines Matching +full:parent +full:- +full:locked

1 // SPDX-License-Identifier: GPL-2.0-or-later
24 #include <linux/dma-mapping.h>
51 switch (resource->type) { in find_bridge()
53 return list_entry(resource->entry, struct vme_master_resource, in find_bridge()
54 list)->parent; in find_bridge()
56 return list_entry(resource->entry, struct vme_slave_resource, in find_bridge()
57 list)->parent; in find_bridge()
59 return list_entry(resource->entry, struct vme_dma_resource, in find_bridge()
60 list)->parent; in find_bridge()
62 return list_entry(resource->entry, struct vme_lm_resource, in find_bridge()
63 list)->parent; in find_bridge()
71 * vme_alloc_consistent - Allocate contiguous memory.
97 if (!bridge->parent) { in vme_alloc_consistent()
98 printk(KERN_ERR "Dev entry NULL for bridge %s\n", bridge->name); in vme_alloc_consistent()
102 if (!bridge->alloc_consistent) { in vme_alloc_consistent()
104 bridge->name); in vme_alloc_consistent()
108 return bridge->alloc_consistent(bridge->parent, size, dma); in vme_alloc_consistent()
113 * vme_free_consistent - Free previously allocated memory.
137 if (!bridge->parent) { in vme_free_consistent()
138 printk(KERN_ERR "Dev entry NULL for bridge %s\n", bridge->name); in vme_free_consistent()
142 if (!bridge->free_consistent) { in vme_free_consistent()
144 bridge->name); in vme_free_consistent()
148 bridge->free_consistent(bridge->parent, size, vaddr, dma); in vme_free_consistent()
153 * vme_get_size - Helper function returning size of a VME window
169 switch (resource->type) { in vme_get_size()
199 return -EINVAL; in vme_check_window()
204 retval = -EFAULT; in vme_check_window()
208 retval = -EFAULT; in vme_check_window()
212 retval = -EFAULT; in vme_check_window()
219 retval = -EFAULT; in vme_check_window()
229 retval = -EINVAL; in vme_check_window()
271 * vme_slave_request - Request a VME slave window resource.
290 bridge = vdev->bridge; in vme_slave_request()
297 list_for_each(slave_pos, &bridge->slave_resources) { in vme_slave_request()
307 mutex_lock(&slave_image->mtx); in vme_slave_request()
308 if (((slave_image->address_attr & address) == address) && in vme_slave_request()
309 ((slave_image->cycle_attr & cycle) == cycle) && in vme_slave_request()
310 (slave_image->locked == 0)) { in vme_slave_request()
312 slave_image->locked = 1; in vme_slave_request()
313 mutex_unlock(&slave_image->mtx); in vme_slave_request()
317 mutex_unlock(&slave_image->mtx); in vme_slave_request()
328 resource->type = VME_SLAVE; in vme_slave_request()
329 resource->entry = &allocated_image->list; in vme_slave_request()
335 mutex_lock(&slave_image->mtx); in vme_slave_request()
336 slave_image->locked = 0; in vme_slave_request()
337 mutex_unlock(&slave_image->mtx); in vme_slave_request()
345 * vme_slave_set - Set VME slave window configuration.
356 * Return: Zero on success, -EINVAL if operation is not supported on this
369 if (resource->type != VME_SLAVE) { in vme_slave_set()
371 return -EINVAL; in vme_slave_set()
374 image = list_entry(resource->entry, struct vme_slave_resource, list); in vme_slave_set()
376 if (!bridge->slave_set) { in vme_slave_set()
378 return -ENOSYS; in vme_slave_set()
381 if (!(((image->address_attr & aspace) == aspace) && in vme_slave_set()
382 ((image->cycle_attr & cycle) == cycle))) { in vme_slave_set()
384 return -EINVAL; in vme_slave_set()
391 return bridge->slave_set(image, enabled, vme_base, size, buf_base, in vme_slave_set()
397 * vme_slave_get - Retrieve VME slave window configuration.
408 * Return: Zero on success, -EINVAL if operation is not supported on this
418 if (resource->type != VME_SLAVE) { in vme_slave_get()
420 return -EINVAL; in vme_slave_get()
423 image = list_entry(resource->entry, struct vme_slave_resource, list); in vme_slave_get()
425 if (!bridge->slave_get) { in vme_slave_get()
427 return -EINVAL; in vme_slave_get()
430 return bridge->slave_get(image, enabled, vme_base, size, buf_base, in vme_slave_get()
436 * vme_slave_free - Free VME slave window
445 if (resource->type != VME_SLAVE) { in vme_slave_free()
450 slave_image = list_entry(resource->entry, struct vme_slave_resource, in vme_slave_free()
458 mutex_lock(&slave_image->mtx); in vme_slave_free()
459 if (slave_image->locked == 0) in vme_slave_free()
462 slave_image->locked = 0; in vme_slave_free()
463 mutex_unlock(&slave_image->mtx); in vme_slave_free()
471 * vme_master_request - Request a VME master window resource.
491 bridge = vdev->bridge; in vme_master_request()
498 list_for_each(master_pos, &bridge->master_resources) { in vme_master_request()
508 spin_lock(&master_image->lock); in vme_master_request()
509 if (((master_image->address_attr & address) == address) && in vme_master_request()
510 ((master_image->cycle_attr & cycle) == cycle) && in vme_master_request()
511 ((master_image->width_attr & dwidth) == dwidth) && in vme_master_request()
512 (master_image->locked == 0)) { in vme_master_request()
514 master_image->locked = 1; in vme_master_request()
515 spin_unlock(&master_image->lock); in vme_master_request()
519 spin_unlock(&master_image->lock); in vme_master_request()
532 resource->type = VME_MASTER; in vme_master_request()
533 resource->entry = &allocated_image->list; in vme_master_request()
539 spin_lock(&master_image->lock); in vme_master_request()
540 master_image->locked = 0; in vme_master_request()
541 spin_unlock(&master_image->lock); in vme_master_request()
549 * vme_master_set - Set VME master window configuration.
560 * Return: Zero on success, -EINVAL if operation is not supported on this
573 if (resource->type != VME_MASTER) { in vme_master_set()
575 return -EINVAL; in vme_master_set()
578 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_set()
580 if (!bridge->master_set) { in vme_master_set()
582 return -EINVAL; in vme_master_set()
585 if (!(((image->address_attr & aspace) == aspace) && in vme_master_set()
586 ((image->cycle_attr & cycle) == cycle) && in vme_master_set()
587 ((image->width_attr & dwidth) == dwidth))) { in vme_master_set()
589 return -EINVAL; in vme_master_set()
596 return bridge->master_set(image, enabled, vme_base, size, aspace, in vme_master_set()
602 * vme_master_get - Retrieve VME master window configuration.
613 * Return: Zero on success, -EINVAL if operation is not supported on this
623 if (resource->type != VME_MASTER) { in vme_master_get()
625 return -EINVAL; in vme_master_get()
628 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_get()
630 if (!bridge->master_get) { in vme_master_get()
632 return -EINVAL; in vme_master_get()
635 return bridge->master_get(image, enabled, vme_base, size, aspace, in vme_master_get()
641 * vme_master_read - Read data from VME space into a buffer.
650 * Return: Number of bytes read, -EINVAL if resource is not a VME master
651 * resource or read operation is not supported. -EFAULT returned if
662 if (!bridge->master_read) { in vme_master_read()
664 return -EINVAL; in vme_master_read()
667 if (resource->type != VME_MASTER) { in vme_master_read()
669 return -EINVAL; in vme_master_read()
672 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_read()
678 return -EFAULT; in vme_master_read()
682 count = length - offset; in vme_master_read()
684 return bridge->master_read(image, buf, count, offset); in vme_master_read()
690 * vme_master_write - Write data out to VME space from a buffer.
699 * Return: Number of bytes written, -EINVAL if resource is not a VME master
700 * resource or write operation is not supported. -EFAULT returned if
711 if (!bridge->master_write) { in vme_master_write()
713 return -EINVAL; in vme_master_write()
716 if (resource->type != VME_MASTER) { in vme_master_write()
718 return -EINVAL; in vme_master_write()
721 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_write()
727 return -EFAULT; in vme_master_write()
731 count = length - offset; in vme_master_write()
733 return bridge->master_write(image, buf, count, offset); in vme_master_write()
738 * vme_master_rmw - Perform read-modify-write cycle.
745 * Perform read-modify-write cycle on provided location:
746 * - Location on VME bus is read.
747 * - Bits selected by mask are compared with compare.
748 * - Where a selected bit matches that in compare and are selected in swap,
750 * - Result written back to location on VME bus.
752 * Return: Bytes written on success, -EINVAL if resource is not a VME master
762 if (!bridge->master_rmw) { in vme_master_rmw()
764 return -EINVAL; in vme_master_rmw()
767 if (resource->type != VME_MASTER) { in vme_master_rmw()
769 return -EINVAL; in vme_master_rmw()
772 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_rmw()
774 return bridge->master_rmw(image, mask, compare, swap, offset); in vme_master_rmw()
779 * vme_master_mmap - Mmap region of VME master window.
785 * Return: Zero on success, -EINVAL if resource is not a VME master
786 * resource or -EFAULT if map exceeds window size. Other generic mmap
795 if (resource->type != VME_MASTER) { in vme_master_mmap()
797 return -EINVAL; in vme_master_mmap()
800 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_mmap()
801 phys_addr = image->bus_resource.start + (vma->vm_pgoff << PAGE_SHIFT); in vme_master_mmap()
802 vma_size = vma->vm_end - vma->vm_start; in vme_master_mmap()
804 if (phys_addr + vma_size > image->bus_resource.end + 1) { in vme_master_mmap()
806 return -EFAULT; in vme_master_mmap()
809 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); in vme_master_mmap()
811 return vm_iomap_memory(vma, phys_addr, vma->vm_end - vma->vm_start); in vme_master_mmap()
816 * vme_master_free - Free VME master window
825 if (resource->type != VME_MASTER) { in vme_master_free()
830 master_image = list_entry(resource->entry, struct vme_master_resource, in vme_master_free()
838 spin_lock(&master_image->lock); in vme_master_free()
839 if (master_image->locked == 0) in vme_master_free()
842 master_image->locked = 0; in vme_master_free()
843 spin_unlock(&master_image->lock); in vme_master_free()
851 * vme_dma_request - Request a DMA controller.
871 bridge = vdev->bridge; in vme_dma_request()
878 list_for_each(dma_pos, &bridge->dma_resources) { in vme_dma_request()
887 mutex_lock(&dma_ctrlr->mtx); in vme_dma_request()
888 if (((dma_ctrlr->route_attr & route) == route) && in vme_dma_request()
889 (dma_ctrlr->locked == 0)) { in vme_dma_request()
891 dma_ctrlr->locked = 1; in vme_dma_request()
892 mutex_unlock(&dma_ctrlr->mtx); in vme_dma_request()
896 mutex_unlock(&dma_ctrlr->mtx); in vme_dma_request()
907 resource->type = VME_DMA; in vme_dma_request()
908 resource->entry = &allocated_ctrlr->list; in vme_dma_request()
914 mutex_lock(&dma_ctrlr->mtx); in vme_dma_request()
915 dma_ctrlr->locked = 0; in vme_dma_request()
916 mutex_unlock(&dma_ctrlr->mtx); in vme_dma_request()
924 * vme_new_dma_list - Create new VME DMA list.
937 if (resource->type != VME_DMA) { in vme_new_dma_list()
946 INIT_LIST_HEAD(&dma_list->entries); in vme_new_dma_list()
947 dma_list->parent = list_entry(resource->entry, in vme_new_dma_list()
950 mutex_init(&dma_list->mtx); in vme_new_dma_list()
957 * vme_dma_pattern_attribute - Create "Pattern" type VME DMA list attribute.
980 attributes->type = VME_DMA_PATTERN; in vme_dma_pattern_attribute()
981 attributes->private = (void *)pattern_attr; in vme_dma_pattern_attribute()
983 pattern_attr->pattern = pattern; in vme_dma_pattern_attribute()
984 pattern_attr->type = type; in vme_dma_pattern_attribute()
996 * vme_dma_pci_attribute - Create "PCI" type VME DMA list attribute.
1020 attributes->type = VME_DMA_PCI; in vme_dma_pci_attribute()
1021 attributes->private = (void *)pci_attr; in vme_dma_pci_attribute()
1023 pci_attr->address = address; in vme_dma_pci_attribute()
1035 * vme_dma_vme_attribute - Create "VME" type VME DMA list attribute.
1061 attributes->type = VME_DMA_VME; in vme_dma_vme_attribute()
1062 attributes->private = (void *)vme_attr; in vme_dma_vme_attribute()
1064 vme_attr->address = address; in vme_dma_vme_attribute()
1065 vme_attr->aspace = aspace; in vme_dma_vme_attribute()
1066 vme_attr->cycle = cycle; in vme_dma_vme_attribute()
1067 vme_attr->dwidth = dwidth; in vme_dma_vme_attribute()
1079 * vme_dma_free_attribute - Free DMA list attribute.
1087 kfree(attributes->private); in vme_dma_free_attribute()
1093 * vme_dma_list_add - Add enty to a VME DMA list.
1105 * Return: Zero on success, -EINVAL if operation is not supported on this
1112 struct vme_bridge *bridge = list->parent->parent; in vme_dma_list_add()
1115 if (!bridge->dma_list_add) { in vme_dma_list_add()
1117 return -EINVAL; in vme_dma_list_add()
1120 if (!mutex_trylock(&list->mtx)) { in vme_dma_list_add()
1122 return -EINVAL; in vme_dma_list_add()
1125 retval = bridge->dma_list_add(list, src, dest, count); in vme_dma_list_add()
1127 mutex_unlock(&list->mtx); in vme_dma_list_add()
1134 * vme_dma_list_exec - Queue a VME DMA list for execution.
1140 * Return: Zero on success, -EINVAL if operation is not supported on this
1145 struct vme_bridge *bridge = list->parent->parent; in vme_dma_list_exec()
1148 if (!bridge->dma_list_exec) { in vme_dma_list_exec()
1150 return -EINVAL; in vme_dma_list_exec()
1153 mutex_lock(&list->mtx); in vme_dma_list_exec()
1155 retval = bridge->dma_list_exec(list); in vme_dma_list_exec()
1157 mutex_unlock(&list->mtx); in vme_dma_list_exec()
1164 * vme_dma_list_free - Free a VME DMA list.
1169 * Return: Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource
1174 struct vme_bridge *bridge = list->parent->parent; in vme_dma_list_free()
1177 if (!bridge->dma_list_empty) { in vme_dma_list_free()
1179 return -EINVAL; in vme_dma_list_free()
1182 if (!mutex_trylock(&list->mtx)) { in vme_dma_list_free()
1184 return -EBUSY; in vme_dma_list_free()
1191 retval = bridge->dma_list_empty(list); in vme_dma_list_free()
1193 printk(KERN_ERR "Unable to empty link-list entries\n"); in vme_dma_list_free()
1194 mutex_unlock(&list->mtx); in vme_dma_list_free()
1197 mutex_unlock(&list->mtx); in vme_dma_list_free()
1205 * vme_dma_free - Free a VME DMA resource.
1210 * Return: Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource
1217 if (resource->type != VME_DMA) { in vme_dma_free()
1219 return -EINVAL; in vme_dma_free()
1222 ctrlr = list_entry(resource->entry, struct vme_dma_resource, list); in vme_dma_free()
1224 if (!mutex_trylock(&ctrlr->mtx)) { in vme_dma_free()
1226 return -EBUSY; in vme_dma_free()
1229 if (!(list_empty(&ctrlr->pending) && list_empty(&ctrlr->running))) { in vme_dma_free()
1231 mutex_unlock(&ctrlr->mtx); in vme_dma_free()
1232 return -EBUSY; in vme_dma_free()
1235 ctrlr->locked = 0; in vme_dma_free()
1237 mutex_unlock(&ctrlr->mtx); in vme_dma_free()
1253 list_for_each(handler_pos, &bridge->vme_error_handlers) { in vme_bus_error_handler()
1256 if ((aspace == handler->aspace) && in vme_bus_error_handler()
1257 (address >= handler->start) && in vme_bus_error_handler()
1258 (address < handler->end)) { in vme_bus_error_handler()
1259 if (!handler->num_errors) in vme_bus_error_handler()
1260 handler->first_error = address; in vme_bus_error_handler()
1261 if (handler->num_errors != UINT_MAX) in vme_bus_error_handler()
1262 handler->num_errors++; in vme_bus_error_handler()
1268 dev_err(bridge->parent, in vme_bus_error_handler()
1284 handler->aspace = aspace; in vme_register_error_handler()
1285 handler->start = address; in vme_register_error_handler()
1286 handler->end = address + len; in vme_register_error_handler()
1287 handler->num_errors = 0; in vme_register_error_handler()
1288 handler->first_error = 0; in vme_register_error_handler()
1289 list_add_tail(&handler->list, &bridge->vme_error_handlers); in vme_register_error_handler()
1297 list_del(&handler->list); in vme_unregister_error_handler()
1307 call = bridge->irq[level - 1].callback[statid].func; in vme_irq_handler()
1308 priv_data = bridge->irq[level - 1].callback[statid].priv_data; in vme_irq_handler()
1318 * vme_irq_request - Request a specific VME interrupt.
1329 * Return: Zero on success, -EINVAL on invalid vme device, level or if the
1330 * function is not supported, -EBUSY if the level/statid combination is
1339 bridge = vdev->bridge; in vme_irq_request()
1342 return -EINVAL; in vme_irq_request()
1347 return -EINVAL; in vme_irq_request()
1350 if (!bridge->irq_set) { in vme_irq_request()
1352 return -EINVAL; in vme_irq_request()
1355 mutex_lock(&bridge->irq_mtx); in vme_irq_request()
1357 if (bridge->irq[level - 1].callback[statid].func) { in vme_irq_request()
1358 mutex_unlock(&bridge->irq_mtx); in vme_irq_request()
1360 return -EBUSY; in vme_irq_request()
1363 bridge->irq[level - 1].count++; in vme_irq_request()
1364 bridge->irq[level - 1].callback[statid].priv_data = priv_data; in vme_irq_request()
1365 bridge->irq[level - 1].callback[statid].func = callback; in vme_irq_request()
1368 bridge->irq_set(bridge, level, 1, 1); in vme_irq_request()
1370 mutex_unlock(&bridge->irq_mtx); in vme_irq_request()
1377 * vme_irq_free - Free a VME interrupt.
1388 bridge = vdev->bridge; in vme_irq_free()
1399 if (!bridge->irq_set) { in vme_irq_free()
1404 mutex_lock(&bridge->irq_mtx); in vme_irq_free()
1406 bridge->irq[level - 1].count--; in vme_irq_free()
1409 if (bridge->irq[level - 1].count == 0) in vme_irq_free()
1410 bridge->irq_set(bridge, level, 0, 1); in vme_irq_free()
1412 bridge->irq[level - 1].callback[statid].func = NULL; in vme_irq_free()
1413 bridge->irq[level - 1].callback[statid].priv_data = NULL; in vme_irq_free()
1415 mutex_unlock(&bridge->irq_mtx); in vme_irq_free()
1420 * vme_irq_generate - Generate VME interrupt.
1428 * Return: Zero on success, -EINVAL on invalid vme device, level or if the
1435 bridge = vdev->bridge; in vme_irq_generate()
1438 return -EINVAL; in vme_irq_generate()
1443 return -EINVAL; in vme_irq_generate()
1446 if (!bridge->irq_generate) { in vme_irq_generate()
1448 return -EINVAL; in vme_irq_generate()
1451 return bridge->irq_generate(bridge, level, statid); in vme_irq_generate()
1456 * vme_lm_request - Request a VME location monitor
1473 bridge = vdev->bridge; in vme_lm_request()
1480 list_for_each(lm_pos, &bridge->lm_resources) { in vme_lm_request()
1489 mutex_lock(&lm->mtx); in vme_lm_request()
1490 if (lm->locked == 0) { in vme_lm_request()
1491 lm->locked = 1; in vme_lm_request()
1492 mutex_unlock(&lm->mtx); in vme_lm_request()
1496 mutex_unlock(&lm->mtx); in vme_lm_request()
1507 resource->type = VME_LM; in vme_lm_request()
1508 resource->entry = &allocated_lm->list; in vme_lm_request()
1514 mutex_lock(&lm->mtx); in vme_lm_request()
1515 lm->locked = 0; in vme_lm_request()
1516 mutex_unlock(&lm->mtx); in vme_lm_request()
1524 * vme_lm_count - Determine number of VME Addresses monitored
1531 * Return: Count of addresses monitored or -EINVAL when provided with an
1538 if (resource->type != VME_LM) { in vme_lm_count()
1540 return -EINVAL; in vme_lm_count()
1543 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_count()
1545 return lm->monitors; in vme_lm_count()
1550 * vme_lm_set - Configure location monitor
1559 * Return: Zero on success, -EINVAL when provided with an invalid location
1569 if (resource->type != VME_LM) { in vme_lm_set()
1571 return -EINVAL; in vme_lm_set()
1574 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_set()
1576 if (!bridge->lm_set) { in vme_lm_set()
1578 return -EINVAL; in vme_lm_set()
1581 return bridge->lm_set(lm, lm_base, aspace, cycle); in vme_lm_set()
1586 * vme_lm_get - Retrieve location monitor settings
1595 * Return: Zero on success, -EINVAL when provided with an invalid location
1605 if (resource->type != VME_LM) { in vme_lm_get()
1607 return -EINVAL; in vme_lm_get()
1610 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_get()
1612 if (!bridge->lm_get) { in vme_lm_get()
1614 return -EINVAL; in vme_lm_get()
1617 return bridge->lm_get(lm, lm_base, aspace, cycle); in vme_lm_get()
1622 * vme_lm_attach - Provide callback for location monitor address
1632 * Return: Zero on success, -EINVAL when provided with an invalid location
1642 if (resource->type != VME_LM) { in vme_lm_attach()
1644 return -EINVAL; in vme_lm_attach()
1647 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_attach()
1649 if (!bridge->lm_attach) { in vme_lm_attach()
1651 return -EINVAL; in vme_lm_attach()
1654 return bridge->lm_attach(lm, monitor, callback, data); in vme_lm_attach()
1659 * vme_lm_detach - Remove callback for location monitor address
1666 * Return: Zero on success, -EINVAL when provided with an invalid location
1675 if (resource->type != VME_LM) { in vme_lm_detach()
1677 return -EINVAL; in vme_lm_detach()
1680 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_detach()
1682 if (!bridge->lm_detach) { in vme_lm_detach()
1684 return -EINVAL; in vme_lm_detach()
1687 return bridge->lm_detach(lm, monitor); in vme_lm_detach()
1692 * vme_lm_free - Free allocated VME location monitor
1700 * Return: Zero on success, -EINVAL when provided with an invalid location
1707 if (resource->type != VME_LM) { in vme_lm_free()
1712 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_free()
1714 mutex_lock(&lm->mtx); in vme_lm_free()
1721 lm->locked = 0; in vme_lm_free()
1723 mutex_unlock(&lm->mtx); in vme_lm_free()
1730 * vme_slot_num - Retrieve slot ID
1735 * Return: The slot ID on success, -EINVAL if VME bridge cannot be determined
1743 bridge = vdev->bridge; in vme_slot_num()
1746 return -EINVAL; in vme_slot_num()
1749 if (!bridge->slot_get) { in vme_slot_num()
1751 return -EINVAL; in vme_slot_num()
1754 return bridge->slot_get(bridge); in vme_slot_num()
1759 * vme_bus_num - Retrieve bus number
1764 * Return: The bus number on success, -EINVAL if VME bridge cannot be
1771 bridge = vdev->bridge; in vme_bus_num()
1774 return -EINVAL; in vme_bus_num()
1777 return bridge->num; in vme_bus_num()
1781 /* - Bridge Registration --------------------------------------------------- */
1791 INIT_LIST_HEAD(&bridge->vme_error_handlers); in vme_init_bridge()
1792 INIT_LIST_HEAD(&bridge->master_resources); in vme_init_bridge()
1793 INIT_LIST_HEAD(&bridge->slave_resources); in vme_init_bridge()
1794 INIT_LIST_HEAD(&bridge->dma_resources); in vme_init_bridge()
1795 INIT_LIST_HEAD(&bridge->lm_resources); in vme_init_bridge()
1796 mutex_init(&bridge->irq_mtx); in vme_init_bridge()
1805 int ret = -1; in vme_register_bridge()
1811 bridge->num = i; in vme_register_bridge()
1812 INIT_LIST_HEAD(&bridge->devices); in vme_register_bridge()
1813 list_add_tail(&bridge->bus_list, &vme_bus_list); in vme_register_bridge()
1830 vme_bus_numbers &= ~(1 << bridge->num); in vme_unregister_bridge()
1831 list_for_each_entry_safe(vdev, tmp, &bridge->devices, bridge_list) { in vme_unregister_bridge()
1832 list_del(&vdev->drv_list); in vme_unregister_bridge()
1833 list_del(&vdev->bridge_list); in vme_unregister_bridge()
1834 device_unregister(&vdev->dev); in vme_unregister_bridge()
1836 list_del(&bridge->bus_list); in vme_unregister_bridge()
1841 /* - Driver Registration --------------------------------------------------- */
1854 err = -ENOMEM; in __vme_register_driver_bus()
1857 vdev->num = i; in __vme_register_driver_bus()
1858 vdev->bridge = bridge; in __vme_register_driver_bus()
1859 vdev->dev.platform_data = drv; in __vme_register_driver_bus()
1860 vdev->dev.release = vme_dev_release; in __vme_register_driver_bus()
1861 vdev->dev.parent = bridge->parent; in __vme_register_driver_bus()
1862 vdev->dev.bus = &vme_bus_type; in __vme_register_driver_bus()
1863 dev_set_name(&vdev->dev, "%s.%u-%u", drv->name, bridge->num, in __vme_register_driver_bus()
1864 vdev->num); in __vme_register_driver_bus()
1866 err = device_register(&vdev->dev); in __vme_register_driver_bus()
1870 if (vdev->dev.platform_data) { in __vme_register_driver_bus()
1871 list_add_tail(&vdev->drv_list, &drv->devices); in __vme_register_driver_bus()
1872 list_add_tail(&vdev->bridge_list, &bridge->devices); in __vme_register_driver_bus()
1874 device_unregister(&vdev->dev); in __vme_register_driver_bus()
1879 put_device(&vdev->dev); in __vme_register_driver_bus()
1881 list_for_each_entry_safe(vdev, tmp, &drv->devices, drv_list) { in __vme_register_driver_bus()
1882 list_del(&vdev->drv_list); in __vme_register_driver_bus()
1883 list_del(&vdev->bridge_list); in __vme_register_driver_bus()
1884 device_unregister(&vdev->dev); in __vme_register_driver_bus()
1912 * vme_register_driver - Register a VME driver
1924 drv->driver.name = drv->name; in vme_register_driver()
1925 drv->driver.bus = &vme_bus_type; in vme_register_driver()
1926 INIT_LIST_HEAD(&drv->devices); in vme_register_driver()
1928 err = driver_register(&drv->driver); in vme_register_driver()
1934 driver_unregister(&drv->driver); in vme_register_driver()
1941 * vme_unregister_driver - Unregister a VME driver
1951 list_for_each_entry_safe(dev, dev_tmp, &drv->devices, drv_list) { in vme_unregister_driver()
1952 list_del(&dev->drv_list); in vme_unregister_driver()
1953 list_del(&dev->bridge_list); in vme_unregister_driver()
1954 device_unregister(&dev->dev); in vme_unregister_driver()
1958 driver_unregister(&drv->driver); in vme_unregister_driver()
1962 /* - Bus Registration ------------------------------------------------------ */
1970 if (dev->platform_data == vme_drv) { in vme_bus_match()
1973 if (vme_drv->match && vme_drv->match(vdev)) in vme_bus_match()
1976 dev->platform_data = NULL; in vme_bus_match()
1986 driver = dev->platform_data; in vme_bus_probe()
1987 if (driver->probe) in vme_bus_probe()
1988 return driver->probe(vdev); in vme_bus_probe()
1990 return -ENODEV; in vme_bus_probe()
1998 driver = dev->platform_data; in vme_bus_remove()
1999 if (driver->remove) in vme_bus_remove()
2000 driver->remove(vdev); in vme_bus_remove()