• Home
  • Raw
  • Download

Lines Matching +full:master +full:- +full:level

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()
57 return list_entry(resource->entry, struct vme_slave_resource, in find_bridge()
58 list)->parent; in find_bridge()
61 return list_entry(resource->entry, struct vme_dma_resource, in find_bridge()
62 list)->parent; in find_bridge()
65 return list_entry(resource->entry, struct vme_lm_resource, in find_bridge()
66 list)->parent; in find_bridge()
76 * vme_free_consistent - Allocate contiguous memory.
102 if (!bridge->parent) { in vme_alloc_consistent()
103 printk(KERN_ERR "Dev entry NULL for bridge %s\n", bridge->name); in vme_alloc_consistent()
107 if (!bridge->alloc_consistent) { in vme_alloc_consistent()
109 bridge->name); in vme_alloc_consistent()
113 return bridge->alloc_consistent(bridge->parent, size, dma); in vme_alloc_consistent()
118 * vme_free_consistent - Free previously allocated memory.
142 if (!bridge->parent) { in vme_free_consistent()
143 printk(KERN_ERR "Dev entry NULL for bridge %s\n", bridge->name); in vme_free_consistent()
147 if (!bridge->free_consistent) { in vme_free_consistent()
149 bridge->name); in vme_free_consistent()
153 bridge->free_consistent(bridge->parent, size, vaddr, dma); in vme_free_consistent()
158 * vme_get_size - Helper function returning size of a VME window
159 * @resource: Pointer to VME slave or master resource.
174 switch (resource->type) { in vme_get_size()
208 return -EINVAL; in vme_check_window()
213 retval = -EFAULT; in vme_check_window()
217 retval = -EFAULT; in vme_check_window()
221 retval = -EFAULT; in vme_check_window()
228 retval = -EFAULT; in vme_check_window()
238 retval = -EINVAL; in vme_check_window()
280 * vme_slave_request - Request a VME slave window resource.
299 bridge = vdev->bridge; in vme_slave_request()
306 list_for_each(slave_pos, &bridge->slave_resources) { in vme_slave_request()
316 mutex_lock(&slave_image->mtx); in vme_slave_request()
317 if (((slave_image->address_attr & address) == address) && in vme_slave_request()
318 ((slave_image->cycle_attr & cycle) == cycle) && in vme_slave_request()
319 (slave_image->locked == 0)) { in vme_slave_request()
321 slave_image->locked = 1; in vme_slave_request()
322 mutex_unlock(&slave_image->mtx); in vme_slave_request()
326 mutex_unlock(&slave_image->mtx); in vme_slave_request()
337 resource->type = VME_SLAVE; in vme_slave_request()
338 resource->entry = &allocated_image->list; in vme_slave_request()
344 mutex_lock(&slave_image->mtx); in vme_slave_request()
345 slave_image->locked = 0; in vme_slave_request()
346 mutex_unlock(&slave_image->mtx); in vme_slave_request()
354 * vme_slave_set - Set VME slave window configuration.
365 * Return: Zero on success, -EINVAL if operation is not supported on this
378 if (resource->type != VME_SLAVE) { in vme_slave_set()
380 return -EINVAL; in vme_slave_set()
383 image = list_entry(resource->entry, struct vme_slave_resource, list); in vme_slave_set()
385 if (!bridge->slave_set) { in vme_slave_set()
387 return -ENOSYS; in vme_slave_set()
390 if (!(((image->address_attr & aspace) == aspace) && in vme_slave_set()
391 ((image->cycle_attr & cycle) == cycle))) { in vme_slave_set()
393 return -EINVAL; in vme_slave_set()
400 return bridge->slave_set(image, enabled, vme_base, size, buf_base, in vme_slave_set()
406 * vme_slave_get - Retrieve VME slave window configuration.
417 * Return: Zero on success, -EINVAL if operation is not supported on this
427 if (resource->type != VME_SLAVE) { in vme_slave_get()
429 return -EINVAL; in vme_slave_get()
432 image = list_entry(resource->entry, struct vme_slave_resource, list); in vme_slave_get()
434 if (!bridge->slave_get) { in vme_slave_get()
436 return -EINVAL; in vme_slave_get()
439 return bridge->slave_get(image, enabled, vme_base, size, buf_base, in vme_slave_get()
445 * vme_slave_free - Free VME slave window
454 if (resource->type != VME_SLAVE) { in vme_slave_free()
459 slave_image = list_entry(resource->entry, struct vme_slave_resource, in vme_slave_free()
467 mutex_lock(&slave_image->mtx); in vme_slave_free()
468 if (slave_image->locked == 0) in vme_slave_free()
471 slave_image->locked = 0; in vme_slave_free()
472 mutex_unlock(&slave_image->mtx); in vme_slave_free()
480 * vme_master_request - Request a VME master window resource.
500 bridge = vdev->bridge; in vme_master_request()
506 /* Loop through master resources */ in vme_master_request()
507 list_for_each(master_pos, &bridge->master_resources) { in vme_master_request()
512 printk(KERN_WARNING "Registered NULL master resource\n"); in vme_master_request()
517 spin_lock(&master_image->lock); in vme_master_request()
518 if (((master_image->address_attr & address) == address) && in vme_master_request()
519 ((master_image->cycle_attr & cycle) == cycle) && in vme_master_request()
520 ((master_image->width_attr & dwidth) == dwidth) && in vme_master_request()
521 (master_image->locked == 0)) { in vme_master_request()
523 master_image->locked = 1; in vme_master_request()
524 spin_unlock(&master_image->lock); in vme_master_request()
528 spin_unlock(&master_image->lock); in vme_master_request()
541 resource->type = VME_MASTER; in vme_master_request()
542 resource->entry = &allocated_image->list; in vme_master_request()
548 spin_lock(&master_image->lock); in vme_master_request()
549 master_image->locked = 0; in vme_master_request()
550 spin_unlock(&master_image->lock); in vme_master_request()
558 * vme_master_set - Set VME master window configuration.
559 * @resource: Pointer to VME master resource.
567 * Set configuration for provided VME master window.
569 * Return: Zero on success, -EINVAL if operation is not supported on this
582 if (resource->type != VME_MASTER) { in vme_master_set()
583 printk(KERN_ERR "Not a master resource\n"); in vme_master_set()
584 return -EINVAL; in vme_master_set()
587 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_set()
589 if (!bridge->master_set) { in vme_master_set()
591 return -EINVAL; in vme_master_set()
594 if (!(((image->address_attr & aspace) == aspace) && in vme_master_set()
595 ((image->cycle_attr & cycle) == cycle) && in vme_master_set()
596 ((image->width_attr & dwidth) == dwidth))) { in vme_master_set()
598 return -EINVAL; in vme_master_set()
605 return bridge->master_set(image, enabled, vme_base, size, aspace, in vme_master_set()
611 * vme_master_get - Retrieve VME master window configuration.
612 * @resource: Pointer to VME master resource.
620 * Return configuration for provided VME master window.
622 * Return: Zero on success, -EINVAL if operation is not supported on this
632 if (resource->type != VME_MASTER) { in vme_master_get()
633 printk(KERN_ERR "Not a master resource\n"); in vme_master_get()
634 return -EINVAL; in vme_master_get()
637 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_get()
639 if (!bridge->master_get) { in vme_master_get()
641 return -EINVAL; in vme_master_get()
644 return bridge->master_get(image, enabled, vme_base, size, aspace, in vme_master_get()
650 * vme_master_write - Read data from VME space into a buffer.
651 * @resource: Pointer to VME master resource.
654 * @offset: Offset into VME master window at which to start transfer.
657 * the VME master window at offset to buf.
659 * Return: Number of bytes read, -EINVAL if resource is not a VME master
660 * resource or read operation is not supported. -EFAULT returned if
671 if (!bridge->master_read) { in vme_master_read()
673 return -EINVAL; in vme_master_read()
676 if (resource->type != VME_MASTER) { in vme_master_read()
677 printk(KERN_ERR "Not a master resource\n"); in vme_master_read()
678 return -EINVAL; in vme_master_read()
681 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_read()
687 return -EFAULT; in vme_master_read()
691 count = length - offset; in vme_master_read()
693 return bridge->master_read(image, buf, count, offset); in vme_master_read()
699 * vme_master_write - Write data out to VME space from a buffer.
700 * @resource: Pointer to VME master resource.
703 * @offset: Offset into VME master window at which to start transfer.
706 * maps into the VME master window at offset.
708 * Return: Number of bytes written, -EINVAL if resource is not a VME master
709 * resource or write operation is not supported. -EFAULT returned if
720 if (!bridge->master_write) { in vme_master_write()
722 return -EINVAL; in vme_master_write()
725 if (resource->type != VME_MASTER) { in vme_master_write()
726 printk(KERN_ERR "Not a master resource\n"); in vme_master_write()
727 return -EINVAL; in vme_master_write()
730 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_write()
736 return -EFAULT; in vme_master_write()
740 count = length - offset; in vme_master_write()
742 return bridge->master_write(image, buf, count, offset); in vme_master_write()
747 * vme_master_rmw - Perform read-modify-write cycle.
748 * @resource: Pointer to VME master resource.
752 * @offset: Offset into VME master window at which to perform operation.
754 * Perform read-modify-write cycle on provided location:
755 * - Location on VME bus is read.
756 * - Bits selected by mask are compared with compare.
757 * - Where a selected bit matches that in compare and are selected in swap,
759 * - Result written back to location on VME bus.
761 * Return: Bytes written on success, -EINVAL if resource is not a VME master
771 if (!bridge->master_rmw) { in vme_master_rmw()
773 return -EINVAL; in vme_master_rmw()
776 if (resource->type != VME_MASTER) { in vme_master_rmw()
777 printk(KERN_ERR "Not a master resource\n"); in vme_master_rmw()
778 return -EINVAL; in vme_master_rmw()
781 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_rmw()
783 return bridge->master_rmw(image, mask, compare, swap, offset); in vme_master_rmw()
788 * vme_master_mmap - Mmap region of VME master window.
789 * @resource: Pointer to VME master resource.
792 * Memory map a region of the VME master window into user space.
794 * Return: Zero on success, -EINVAL if resource is not a VME master
795 * resource or -EFAULT if map exceeds window size. Other generic mmap
804 if (resource->type != VME_MASTER) { in vme_master_mmap()
805 pr_err("Not a master resource\n"); in vme_master_mmap()
806 return -EINVAL; in vme_master_mmap()
809 image = list_entry(resource->entry, struct vme_master_resource, list); in vme_master_mmap()
810 phys_addr = image->bus_resource.start + (vma->vm_pgoff << PAGE_SHIFT); in vme_master_mmap()
811 vma_size = vma->vm_end - vma->vm_start; in vme_master_mmap()
813 if (phys_addr + vma_size > image->bus_resource.end + 1) { in vme_master_mmap()
815 return -EFAULT; in vme_master_mmap()
818 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); in vme_master_mmap()
820 return vm_iomap_memory(vma, phys_addr, vma->vm_end - vma->vm_start); in vme_master_mmap()
825 * vme_master_free - Free VME master window
826 * @resource: Pointer to VME master resource.
828 * Free the provided master resource so that it may be reallocated.
834 if (resource->type != VME_MASTER) { in vme_master_free()
835 printk(KERN_ERR "Not a master resource\n"); in vme_master_free()
839 master_image = list_entry(resource->entry, struct vme_master_resource, in vme_master_free()
842 printk(KERN_ERR "Can't find master resource\n"); in vme_master_free()
847 spin_lock(&master_image->lock); in vme_master_free()
848 if (master_image->locked == 0) in vme_master_free()
851 master_image->locked = 0; in vme_master_free()
852 spin_unlock(&master_image->lock); in vme_master_free()
860 * vme_dma_request - Request a DMA controller.
880 bridge = vdev->bridge; in vme_dma_request()
887 list_for_each(dma_pos, &bridge->dma_resources) { in vme_dma_request()
896 mutex_lock(&dma_ctrlr->mtx); in vme_dma_request()
897 if (((dma_ctrlr->route_attr & route) == route) && in vme_dma_request()
898 (dma_ctrlr->locked == 0)) { in vme_dma_request()
900 dma_ctrlr->locked = 1; in vme_dma_request()
901 mutex_unlock(&dma_ctrlr->mtx); in vme_dma_request()
905 mutex_unlock(&dma_ctrlr->mtx); in vme_dma_request()
916 resource->type = VME_DMA; in vme_dma_request()
917 resource->entry = &allocated_ctrlr->list; in vme_dma_request()
923 mutex_lock(&dma_ctrlr->mtx); in vme_dma_request()
924 dma_ctrlr->locked = 0; in vme_dma_request()
925 mutex_unlock(&dma_ctrlr->mtx); in vme_dma_request()
933 * vme_new_dma_list - Create new VME DMA list.
946 if (resource->type != VME_DMA) { in vme_new_dma_list()
955 INIT_LIST_HEAD(&dma_list->entries); in vme_new_dma_list()
956 dma_list->parent = list_entry(resource->entry, in vme_new_dma_list()
959 mutex_init(&dma_list->mtx); in vme_new_dma_list()
966 * vme_dma_pattern_attribute - Create "Pattern" type VME DMA list attribute.
989 attributes->type = VME_DMA_PATTERN; in vme_dma_pattern_attribute()
990 attributes->private = (void *)pattern_attr; in vme_dma_pattern_attribute()
992 pattern_attr->pattern = pattern; in vme_dma_pattern_attribute()
993 pattern_attr->type = type; in vme_dma_pattern_attribute()
1005 * vme_dma_pci_attribute - Create "PCI" type VME DMA list attribute.
1029 attributes->type = VME_DMA_PCI; in vme_dma_pci_attribute()
1030 attributes->private = (void *)pci_attr; in vme_dma_pci_attribute()
1032 pci_attr->address = address; in vme_dma_pci_attribute()
1044 * vme_dma_vme_attribute - Create "VME" type VME DMA list attribute.
1070 attributes->type = VME_DMA_VME; in vme_dma_vme_attribute()
1071 attributes->private = (void *)vme_attr; in vme_dma_vme_attribute()
1073 vme_attr->address = address; in vme_dma_vme_attribute()
1074 vme_attr->aspace = aspace; in vme_dma_vme_attribute()
1075 vme_attr->cycle = cycle; in vme_dma_vme_attribute()
1076 vme_attr->dwidth = dwidth; in vme_dma_vme_attribute()
1088 * vme_dma_free_attribute - Free DMA list attribute.
1096 kfree(attributes->private); in vme_dma_free_attribute()
1102 * vme_dma_list_add - Add enty to a VME DMA list.
1114 * Return: Zero on success, -EINVAL if operation is not supported on this
1121 struct vme_bridge *bridge = list->parent->parent; in vme_dma_list_add()
1124 if (!bridge->dma_list_add) { in vme_dma_list_add()
1126 return -EINVAL; in vme_dma_list_add()
1129 if (!mutex_trylock(&list->mtx)) { in vme_dma_list_add()
1131 return -EINVAL; in vme_dma_list_add()
1134 retval = bridge->dma_list_add(list, src, dest, count); in vme_dma_list_add()
1136 mutex_unlock(&list->mtx); in vme_dma_list_add()
1143 * vme_dma_list_exec - Queue a VME DMA list for execution.
1149 * Return: Zero on success, -EINVAL if operation is not supported on this
1154 struct vme_bridge *bridge = list->parent->parent; in vme_dma_list_exec()
1157 if (!bridge->dma_list_exec) { in vme_dma_list_exec()
1159 return -EINVAL; in vme_dma_list_exec()
1162 mutex_lock(&list->mtx); in vme_dma_list_exec()
1164 retval = bridge->dma_list_exec(list); in vme_dma_list_exec()
1166 mutex_unlock(&list->mtx); in vme_dma_list_exec()
1173 * vme_dma_list_free - Free a VME DMA list.
1178 * Return: Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource
1183 struct vme_bridge *bridge = list->parent->parent; in vme_dma_list_free()
1186 if (!bridge->dma_list_empty) { in vme_dma_list_free()
1188 return -EINVAL; in vme_dma_list_free()
1191 if (!mutex_trylock(&list->mtx)) { in vme_dma_list_free()
1193 return -EBUSY; in vme_dma_list_free()
1198 * low level driver as DMA entries are driver specific. in vme_dma_list_free()
1200 retval = bridge->dma_list_empty(list); in vme_dma_list_free()
1202 printk(KERN_ERR "Unable to empty link-list entries\n"); in vme_dma_list_free()
1203 mutex_unlock(&list->mtx); in vme_dma_list_free()
1206 mutex_unlock(&list->mtx); in vme_dma_list_free()
1214 * vme_dma_free - Free a VME DMA resource.
1219 * Return: Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource
1226 if (resource->type != VME_DMA) { in vme_dma_free()
1228 return -EINVAL; in vme_dma_free()
1231 ctrlr = list_entry(resource->entry, struct vme_dma_resource, list); in vme_dma_free()
1233 if (!mutex_trylock(&ctrlr->mtx)) { in vme_dma_free()
1235 return -EBUSY; in vme_dma_free()
1238 if (!(list_empty(&ctrlr->pending) && list_empty(&ctrlr->running))) { in vme_dma_free()
1240 mutex_unlock(&ctrlr->mtx); in vme_dma_free()
1241 return -EBUSY; in vme_dma_free()
1244 ctrlr->locked = 0; in vme_dma_free()
1246 mutex_unlock(&ctrlr->mtx); in vme_dma_free()
1262 list_for_each(handler_pos, &bridge->vme_error_handlers) { in vme_bus_error_handler()
1265 if ((aspace == handler->aspace) && in vme_bus_error_handler()
1266 (address >= handler->start) && in vme_bus_error_handler()
1267 (address < handler->end)) { in vme_bus_error_handler()
1268 if (!handler->num_errors) in vme_bus_error_handler()
1269 handler->first_error = address; in vme_bus_error_handler()
1270 if (handler->num_errors != UINT_MAX) in vme_bus_error_handler()
1271 handler->num_errors++; in vme_bus_error_handler()
1277 dev_err(bridge->parent, in vme_bus_error_handler()
1293 handler->aspace = aspace; in vme_register_error_handler()
1294 handler->start = address; in vme_register_error_handler()
1295 handler->end = address + len; in vme_register_error_handler()
1296 handler->num_errors = 0; in vme_register_error_handler()
1297 handler->first_error = 0; in vme_register_error_handler()
1298 list_add_tail(&handler->list, &bridge->vme_error_handlers); in vme_register_error_handler()
1306 list_del(&handler->list); in vme_unregister_error_handler()
1311 void vme_irq_handler(struct vme_bridge *bridge, int level, int statid) in vme_irq_handler() argument
1316 call = bridge->irq[level - 1].callback[statid].func; in vme_irq_handler()
1317 priv_data = bridge->irq[level - 1].callback[statid].priv_data; in vme_irq_handler()
1319 call(level, statid, priv_data); in vme_irq_handler()
1321 printk(KERN_WARNING "Spurious VME interrupt, level:%x, vector:%x\n", in vme_irq_handler()
1322 level, statid); in vme_irq_handler()
1327 * vme_irq_request - Request a specific VME interrupt.
1329 * @level: Interrupt priority being requested.
1336 * level and statid.
1338 * Return: Zero on success, -EINVAL on invalid vme device, level or if the
1339 * function is not supported, -EBUSY if the level/statid combination is
1342 int vme_irq_request(struct vme_dev *vdev, int level, int statid, in vme_irq_request() argument
1348 bridge = vdev->bridge; in vme_irq_request()
1351 return -EINVAL; in vme_irq_request()
1354 if ((level < 1) || (level > 7)) { in vme_irq_request()
1355 printk(KERN_ERR "Invalid interrupt level\n"); in vme_irq_request()
1356 return -EINVAL; in vme_irq_request()
1359 if (!bridge->irq_set) { in vme_irq_request()
1361 return -EINVAL; in vme_irq_request()
1364 mutex_lock(&bridge->irq_mtx); in vme_irq_request()
1366 if (bridge->irq[level - 1].callback[statid].func) { in vme_irq_request()
1367 mutex_unlock(&bridge->irq_mtx); in vme_irq_request()
1369 return -EBUSY; in vme_irq_request()
1372 bridge->irq[level - 1].count++; in vme_irq_request()
1373 bridge->irq[level - 1].callback[statid].priv_data = priv_data; in vme_irq_request()
1374 bridge->irq[level - 1].callback[statid].func = callback; in vme_irq_request()
1376 /* Enable IRQ level */ in vme_irq_request()
1377 bridge->irq_set(bridge, level, 1, 1); in vme_irq_request()
1379 mutex_unlock(&bridge->irq_mtx); in vme_irq_request()
1386 * vme_irq_free - Free a VME interrupt.
1388 * @level: Interrupt priority of interrupt being freed.
1393 void vme_irq_free(struct vme_dev *vdev, int level, int statid) in vme_irq_free() argument
1397 bridge = vdev->bridge; in vme_irq_free()
1403 if ((level < 1) || (level > 7)) { in vme_irq_free()
1404 printk(KERN_ERR "Invalid interrupt level\n"); in vme_irq_free()
1408 if (!bridge->irq_set) { in vme_irq_free()
1413 mutex_lock(&bridge->irq_mtx); in vme_irq_free()
1415 bridge->irq[level - 1].count--; in vme_irq_free()
1417 /* Disable IRQ level if no more interrupts attached at this level*/ in vme_irq_free()
1418 if (bridge->irq[level - 1].count == 0) in vme_irq_free()
1419 bridge->irq_set(bridge, level, 0, 1); in vme_irq_free()
1421 bridge->irq[level - 1].callback[statid].func = NULL; in vme_irq_free()
1422 bridge->irq[level - 1].callback[statid].priv_data = NULL; in vme_irq_free()
1424 mutex_unlock(&bridge->irq_mtx); in vme_irq_free()
1429 * vme_irq_generate - Generate VME interrupt.
1431 * @level: Interrupt priority at which to assert the interrupt.
1434 * Generate a VME interrupt of the provided level and with the provided
1437 * Return: Zero on success, -EINVAL on invalid vme device, level or if the
1440 int vme_irq_generate(struct vme_dev *vdev, int level, int statid) in vme_irq_generate() argument
1444 bridge = vdev->bridge; in vme_irq_generate()
1447 return -EINVAL; in vme_irq_generate()
1450 if ((level < 1) || (level > 7)) { in vme_irq_generate()
1451 printk(KERN_WARNING "Invalid interrupt level\n"); in vme_irq_generate()
1452 return -EINVAL; in vme_irq_generate()
1455 if (!bridge->irq_generate) { in vme_irq_generate()
1457 return -EINVAL; in vme_irq_generate()
1460 return bridge->irq_generate(bridge, level, statid); in vme_irq_generate()
1465 * vme_lm_request - Request a VME location monitor
1482 bridge = vdev->bridge; in vme_lm_request()
1489 list_for_each(lm_pos, &bridge->lm_resources) { in vme_lm_request()
1498 mutex_lock(&lm->mtx); in vme_lm_request()
1499 if (lm->locked == 0) { in vme_lm_request()
1500 lm->locked = 1; in vme_lm_request()
1501 mutex_unlock(&lm->mtx); in vme_lm_request()
1505 mutex_unlock(&lm->mtx); in vme_lm_request()
1516 resource->type = VME_LM; in vme_lm_request()
1517 resource->entry = &allocated_lm->list; in vme_lm_request()
1523 mutex_lock(&lm->mtx); in vme_lm_request()
1524 lm->locked = 0; in vme_lm_request()
1525 mutex_unlock(&lm->mtx); in vme_lm_request()
1533 * vme_lm_count - Determine number of VME Addresses monitored
1540 * Return: Count of addresses monitored or -EINVAL when provided with an
1547 if (resource->type != VME_LM) { in vme_lm_count()
1549 return -EINVAL; in vme_lm_count()
1552 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_count()
1554 return lm->monitors; in vme_lm_count()
1559 * vme_lm_set - Configure location monitor
1568 * Return: Zero on success, -EINVAL when provided with an invalid location
1578 if (resource->type != VME_LM) { in vme_lm_set()
1580 return -EINVAL; in vme_lm_set()
1583 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_set()
1585 if (!bridge->lm_set) { in vme_lm_set()
1587 return -EINVAL; in vme_lm_set()
1590 return bridge->lm_set(lm, lm_base, aspace, cycle); in vme_lm_set()
1595 * vme_lm_get - Retrieve location monitor settings
1604 * Return: Zero on success, -EINVAL when provided with an invalid location
1614 if (resource->type != VME_LM) { in vme_lm_get()
1616 return -EINVAL; in vme_lm_get()
1619 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_get()
1621 if (!bridge->lm_get) { in vme_lm_get()
1623 return -EINVAL; in vme_lm_get()
1626 return bridge->lm_get(lm, lm_base, aspace, cycle); in vme_lm_get()
1631 * vme_lm_attach - Provide callback for location monitor address
1641 * Return: Zero on success, -EINVAL when provided with an invalid location
1651 if (resource->type != VME_LM) { in vme_lm_attach()
1653 return -EINVAL; in vme_lm_attach()
1656 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_attach()
1658 if (!bridge->lm_attach) { in vme_lm_attach()
1660 return -EINVAL; in vme_lm_attach()
1663 return bridge->lm_attach(lm, monitor, callback, data); in vme_lm_attach()
1668 * vme_lm_detach - Remove callback for location monitor address
1675 * Return: Zero on success, -EINVAL when provided with an invalid location
1684 if (resource->type != VME_LM) { in vme_lm_detach()
1686 return -EINVAL; in vme_lm_detach()
1689 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_detach()
1691 if (!bridge->lm_detach) { in vme_lm_detach()
1693 return -EINVAL; in vme_lm_detach()
1696 return bridge->lm_detach(lm, monitor); in vme_lm_detach()
1701 * vme_lm_free - Free allocated VME location monitor
1709 * Return: Zero on success, -EINVAL when provided with an invalid location
1716 if (resource->type != VME_LM) { in vme_lm_free()
1721 lm = list_entry(resource->entry, struct vme_lm_resource, list); in vme_lm_free()
1723 mutex_lock(&lm->mtx); in vme_lm_free()
1730 lm->locked = 0; in vme_lm_free()
1732 mutex_unlock(&lm->mtx); in vme_lm_free()
1739 * vme_slot_num - Retrieve slot ID
1744 * Return: The slot ID on success, -EINVAL if VME bridge cannot be determined
1752 bridge = vdev->bridge; in vme_slot_num()
1755 return -EINVAL; in vme_slot_num()
1758 if (!bridge->slot_get) { in vme_slot_num()
1760 return -EINVAL; in vme_slot_num()
1763 return bridge->slot_get(bridge); in vme_slot_num()
1768 * vme_bus_num - Retrieve bus number
1773 * Return: The bus number on success, -EINVAL if VME bridge cannot be
1780 bridge = vdev->bridge; in vme_bus_num()
1783 return -EINVAL; in vme_bus_num()
1786 return bridge->num; in vme_bus_num()
1790 /* - Bridge Registration --------------------------------------------------- */
1800 INIT_LIST_HEAD(&bridge->vme_error_handlers); in vme_init_bridge()
1801 INIT_LIST_HEAD(&bridge->master_resources); in vme_init_bridge()
1802 INIT_LIST_HEAD(&bridge->slave_resources); in vme_init_bridge()
1803 INIT_LIST_HEAD(&bridge->dma_resources); in vme_init_bridge()
1804 INIT_LIST_HEAD(&bridge->lm_resources); in vme_init_bridge()
1805 mutex_init(&bridge->irq_mtx); in vme_init_bridge()
1814 int ret = -1; in vme_register_bridge()
1820 bridge->num = i; in vme_register_bridge()
1821 INIT_LIST_HEAD(&bridge->devices); in vme_register_bridge()
1822 list_add_tail(&bridge->bus_list, &vme_bus_list); in vme_register_bridge()
1839 vme_bus_numbers &= ~(1 << bridge->num); in vme_unregister_bridge()
1840 list_for_each_entry_safe(vdev, tmp, &bridge->devices, bridge_list) { in vme_unregister_bridge()
1841 list_del(&vdev->drv_list); in vme_unregister_bridge()
1842 list_del(&vdev->bridge_list); in vme_unregister_bridge()
1843 device_unregister(&vdev->dev); in vme_unregister_bridge()
1845 list_del(&bridge->bus_list); in vme_unregister_bridge()
1850 /* - Driver Registration --------------------------------------------------- */
1863 err = -ENOMEM; in __vme_register_driver_bus()
1866 vdev->num = i; in __vme_register_driver_bus()
1867 vdev->bridge = bridge; in __vme_register_driver_bus()
1868 vdev->dev.platform_data = drv; in __vme_register_driver_bus()
1869 vdev->dev.release = vme_dev_release; in __vme_register_driver_bus()
1870 vdev->dev.parent = bridge->parent; in __vme_register_driver_bus()
1871 vdev->dev.bus = &vme_bus_type; in __vme_register_driver_bus()
1872 dev_set_name(&vdev->dev, "%s.%u-%u", drv->name, bridge->num, in __vme_register_driver_bus()
1873 vdev->num); in __vme_register_driver_bus()
1875 err = device_register(&vdev->dev); in __vme_register_driver_bus()
1879 if (vdev->dev.platform_data) { in __vme_register_driver_bus()
1880 list_add_tail(&vdev->drv_list, &drv->devices); in __vme_register_driver_bus()
1881 list_add_tail(&vdev->bridge_list, &bridge->devices); in __vme_register_driver_bus()
1883 device_unregister(&vdev->dev); in __vme_register_driver_bus()
1888 put_device(&vdev->dev); in __vme_register_driver_bus()
1890 list_for_each_entry_safe(vdev, tmp, &drv->devices, drv_list) { in __vme_register_driver_bus()
1891 list_del(&vdev->drv_list); in __vme_register_driver_bus()
1892 list_del(&vdev->bridge_list); in __vme_register_driver_bus()
1893 device_unregister(&vdev->dev); in __vme_register_driver_bus()
1921 * vme_register_driver - Register a VME driver
1933 drv->driver.name = drv->name; in vme_register_driver()
1934 drv->driver.bus = &vme_bus_type; in vme_register_driver()
1935 INIT_LIST_HEAD(&drv->devices); in vme_register_driver()
1937 err = driver_register(&drv->driver); in vme_register_driver()
1943 driver_unregister(&drv->driver); in vme_register_driver()
1950 * vme_unregister_driver - Unregister a VME driver
1960 list_for_each_entry_safe(dev, dev_tmp, &drv->devices, drv_list) { in vme_unregister_driver()
1961 list_del(&dev->drv_list); in vme_unregister_driver()
1962 list_del(&dev->bridge_list); in vme_unregister_driver()
1963 device_unregister(&dev->dev); in vme_unregister_driver()
1967 driver_unregister(&drv->driver); in vme_unregister_driver()
1971 /* - Bus Registration ------------------------------------------------------ */
1979 if (dev->platform_data == vme_drv) { in vme_bus_match()
1982 if (vme_drv->match && vme_drv->match(vdev)) in vme_bus_match()
1985 dev->platform_data = NULL; in vme_bus_match()
1995 driver = dev->platform_data; in vme_bus_probe()
1996 if (driver->probe) in vme_bus_probe()
1997 return driver->probe(vdev); in vme_bus_probe()
1999 return -ENODEV; in vme_bus_probe()
2007 driver = dev->platform_data; in vme_bus_remove()
2008 if (driver->remove) in vme_bus_remove()
2009 return driver->remove(vdev); in vme_bus_remove()
2011 return -ENODEV; in vme_bus_remove()