Lines Matching +full:slot +full:- +full:number

1 // SPDX-License-Identifier: GPL-2.0-only
3 * driver for the TEWS TPCI-200 device
5 * Copyright (C) 2009-2012 CERN (www.cern.ch)
52 tpci200 = dev_get_drvdata(dev->bus->parent); in check_slot()
55 dev_info(&dev->dev, "carrier board not found\n"); in check_slot()
59 if (dev->slot >= TPCI200_NB_SLOT) { in check_slot()
60 dev_info(&dev->dev, in check_slot()
61 "Slot [%d:%d] doesn't exist! Last tpci200 slot is %d.\n", in check_slot()
62 dev->bus->bus_nr, dev->slot, TPCI200_NB_SLOT-1); in check_slot()
73 spin_lock_irqsave(&tpci200->regs_lock, flags); in tpci200_clear_mask()
75 spin_unlock_irqrestore(&tpci200->regs_lock, flags); in tpci200_clear_mask()
82 spin_lock_irqsave(&tpci200->regs_lock, flags); in tpci200_set_mask()
84 spin_unlock_irqrestore(&tpci200->regs_lock, flags); in tpci200_set_mask()
89 free_irq(tpci200->info->pdev->irq, (void *) tpci200); in tpci200_unregister()
91 pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs); in tpci200_unregister()
93 pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR); in tpci200_unregister()
94 pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR); in tpci200_unregister()
95 pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR); in tpci200_unregister()
96 pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR); in tpci200_unregister()
98 pci_disable_device(tpci200->info->pdev); in tpci200_unregister()
105 &tpci200->info->interface_regs->control[islot], in tpci200_enable_irq()
113 &tpci200->info->interface_regs->control[islot], in tpci200_disable_irq()
122 return -ENODEV; in tpci200_slot_irq()
123 ret = slot_irq->handler(slot_irq->arg); in tpci200_slot_irq()
137 status_reg = ioread16(&tpci200->info->interface_regs->status); in tpci200_interrupt()
143 /* callback to the IRQ handler for the corresponding slot */ in tpci200_interrupt()
148 slot_irq = rcu_dereference(tpci200->slots[i].irq); in tpci200_interrupt()
150 if (ret == -ENODEV) { in tpci200_interrupt()
151 dev_info(&tpci200->info->pdev->dev, in tpci200_interrupt()
152 "No registered ISR for slot [%d:%d]!. IRQ will be disabled.\n", in tpci200_interrupt()
153 tpci200->number, i); in tpci200_interrupt()
169 return -EINVAL; in tpci200_free_irq()
171 if (mutex_lock_interruptible(&tpci200->mutex)) in tpci200_free_irq()
172 return -ERESTARTSYS; in tpci200_free_irq()
174 if (tpci200->slots[dev->slot].irq == NULL) { in tpci200_free_irq()
175 mutex_unlock(&tpci200->mutex); in tpci200_free_irq()
176 return -EINVAL; in tpci200_free_irq()
179 tpci200_disable_irq(tpci200, dev->slot); in tpci200_free_irq()
180 slot_irq = tpci200->slots[dev->slot].irq; in tpci200_free_irq()
182 RCU_INIT_POINTER(tpci200->slots[dev->slot].irq, NULL); in tpci200_free_irq()
185 mutex_unlock(&tpci200->mutex); in tpci200_free_irq()
198 return -EINVAL; in tpci200_request_irq()
200 if (mutex_lock_interruptible(&tpci200->mutex)) in tpci200_request_irq()
201 return -ERESTARTSYS; in tpci200_request_irq()
203 if (tpci200->slots[dev->slot].irq != NULL) { in tpci200_request_irq()
204 dev_err(&dev->dev, in tpci200_request_irq()
205 "Slot [%d:%d] IRQ already registered !\n", in tpci200_request_irq()
206 dev->bus->bus_nr, in tpci200_request_irq()
207 dev->slot); in tpci200_request_irq()
208 res = -EINVAL; in tpci200_request_irq()
214 dev_err(&dev->dev, in tpci200_request_irq()
215 "Slot [%d:%d] unable to allocate memory for IRQ !\n", in tpci200_request_irq()
216 dev->bus->bus_nr, dev->slot); in tpci200_request_irq()
217 res = -ENOMEM; in tpci200_request_irq()
227 slot_irq->handler = handler; in tpci200_request_irq()
228 slot_irq->arg = arg; in tpci200_request_irq()
229 slot_irq->holder = dev; in tpci200_request_irq()
231 rcu_assign_pointer(tpci200->slots[dev->slot].irq, slot_irq); in tpci200_request_irq()
232 tpci200_enable_irq(tpci200, dev->slot); in tpci200_request_irq()
235 mutex_unlock(&tpci200->mutex); in tpci200_request_irq()
246 if (pci_enable_device(tpci200->info->pdev) < 0) in tpci200_register()
247 return -ENODEV; in tpci200_register()
250 res = pci_request_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR, in tpci200_register()
253 dev_err(&tpci200->info->pdev->dev, in tpci200_register()
255 tpci200->info->pdev->bus->number, in tpci200_register()
256 tpci200->info->pdev->devfn); in tpci200_register()
261 res = pci_request_region(tpci200->info->pdev, in tpci200_register()
265 dev_err(&tpci200->info->pdev->dev, in tpci200_register()
267 tpci200->info->pdev->bus->number, in tpci200_register()
268 tpci200->info->pdev->devfn); in tpci200_register()
273 res = pci_request_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR, in tpci200_register()
276 dev_err(&tpci200->info->pdev->dev, in tpci200_register()
278 tpci200->info->pdev->bus->number, in tpci200_register()
279 tpci200->info->pdev->devfn); in tpci200_register()
284 res = pci_request_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR, in tpci200_register()
287 dev_err(&tpci200->info->pdev->dev, in tpci200_register()
289 tpci200->info->pdev->bus->number, in tpci200_register()
290 tpci200->info->pdev->devfn); in tpci200_register()
295 tpci200->info->interface_regs = in tpci200_register()
296 ioremap(pci_resource_start(tpci200->info->pdev, in tpci200_register()
299 if (!tpci200->info->interface_regs) { in tpci200_register()
300 dev_err(&tpci200->info->pdev->dev, in tpci200_register()
302 tpci200->info->pdev->bus->number, in tpci200_register()
303 tpci200->info->pdev->devfn); in tpci200_register()
304 res = -ENOMEM; in tpci200_register()
309 spin_lock_init(&tpci200->regs_lock); in tpci200_register()
311 ioidint_base = pci_resource_start(tpci200->info->pdev, in tpci200_register()
313 tpci200->mod_mem[IPACK_IO_SPACE] = ioidint_base + TPCI200_IO_SPACE_OFF; in tpci200_register()
314 tpci200->mod_mem[IPACK_ID_SPACE] = ioidint_base + TPCI200_ID_SPACE_OFF; in tpci200_register()
315 tpci200->mod_mem[IPACK_INT_SPACE] = in tpci200_register()
317 tpci200->mod_mem[IPACK_MEM8_SPACE] = in tpci200_register()
318 pci_resource_start(tpci200->info->pdev, in tpci200_register()
320 tpci200->mod_mem[IPACK_MEM16_SPACE] = in tpci200_register()
321 pci_resource_start(tpci200->info->pdev, in tpci200_register()
324 /* Set the default parameters of the slot in tpci200_register()
334 writew(slot_ctrl, &tpci200->info->interface_regs->control[i]); in tpci200_register()
336 res = request_irq(tpci200->info->pdev->irq, in tpci200_register()
340 dev_err(&tpci200->info->pdev->dev, in tpci200_register()
342 tpci200->info->pdev->bus->number, in tpci200_register()
343 tpci200->info->pdev->devfn); in tpci200_register()
350 pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs); in tpci200_register()
352 pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR); in tpci200_register()
354 pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR); in tpci200_register()
356 pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR); in tpci200_register()
358 pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR); in tpci200_register()
360 pci_disable_device(tpci200->info->pdev); in tpci200_register()
370 return -ENODEV; in tpci200_get_clockrate()
372 addr = &tpci200->info->interface_regs->control[dev->slot]; in tpci200_get_clockrate()
382 return -ENODEV; in tpci200_set_clockrate()
384 addr = &tpci200->info->interface_regs->control[dev->slot]; in tpci200_set_clockrate()
394 return -EINVAL; in tpci200_set_clockrate()
406 return -ENODEV; in tpci200_get_error()
408 addr = &tpci200->info->interface_regs->status; in tpci200_get_error()
409 mask = tpci200_status_error[dev->slot]; in tpci200_get_error()
420 return -ENODEV; in tpci200_get_timeout()
422 addr = &tpci200->info->interface_regs->status; in tpci200_get_timeout()
423 mask = tpci200_status_timeout[dev->slot]; in tpci200_get_timeout()
435 return -ENODEV; in tpci200_reset_timeout()
437 addr = &tpci200->info->interface_regs->status; in tpci200_reset_timeout()
438 mask = tpci200_status_timeout[dev->slot]; in tpci200_reset_timeout()
447 kfree(tpci200->slots); in tpci200_uninstall()
464 tpci200->slots = kcalloc(TPCI200_NB_SLOT, sizeof(struct tpci200_slot), in tpci200_install()
466 if (tpci200->slots == NULL) in tpci200_install()
467 return -ENOMEM; in tpci200_install()
471 kfree(tpci200->slots); in tpci200_install()
472 tpci200->slots = NULL; in tpci200_install()
476 mutex_init(&tpci200->mutex); in tpci200_install()
492 return -ENOMEM; in tpci200_create_device()
493 dev->slot = i; in tpci200_create_device()
494 dev->bus = tpci200->info->ipack_bus; in tpci200_create_device()
495 dev->release = tpci200_release_device; in tpci200_create_device()
498 dev->region[space].start = in tpci200_create_device()
499 tpci200->mod_mem[space] in tpci200_create_device()
501 dev->region[space].size = tpci200_space_size[space]; in tpci200_create_device()
526 return -ENOMEM; in tpci200_pci_probe()
528 tpci200->info = kzalloc(sizeof(struct tpci200_infos), GFP_KERNEL); in tpci200_pci_probe()
529 if (!tpci200->info) { in tpci200_pci_probe()
530 ret = -ENOMEM; in tpci200_pci_probe()
540 dev_err(&pdev->dev, "Failed to allocate PCI Configuration Memory"); in tpci200_pci_probe()
541 ret = -EBUSY; in tpci200_pci_probe()
544 tpci200->info->cfg_regs = ioremap( in tpci200_pci_probe()
547 if (!tpci200->info->cfg_regs) { in tpci200_pci_probe()
548 dev_err(&pdev->dev, "Failed to map PCI Configuration Memory"); in tpci200_pci_probe()
549 ret = -EFAULT; in tpci200_pci_probe()
556 reg32 = ioread32(tpci200->info->cfg_regs + LAS1_DESC); in tpci200_pci_probe()
558 iowrite32(reg32, tpci200->info->cfg_regs + LAS1_DESC); in tpci200_pci_probe()
560 reg32 = ioread32(tpci200->info->cfg_regs + LAS2_DESC); in tpci200_pci_probe()
562 iowrite32(reg32, tpci200->info->cfg_regs + LAS2_DESC); in tpci200_pci_probe()
565 tpci200->info->pdev = pdev; in tpci200_pci_probe()
566 tpci200->info->id_table = (struct pci_device_id *)id; in tpci200_pci_probe()
571 dev_err(&pdev->dev, "error during tpci200 install\n"); in tpci200_pci_probe()
572 ret = -ENODEV; in tpci200_pci_probe()
577 tpci200->info->ipack_bus = ipack_bus_register(&pdev->dev, in tpci200_pci_probe()
581 if (!tpci200->info->ipack_bus) { in tpci200_pci_probe()
582 dev_err(&pdev->dev, in tpci200_pci_probe()
584 ret = -EFAULT; in tpci200_pci_probe()
588 /* save the bus number given by ipack to logging purpose */ in tpci200_pci_probe()
589 tpci200->number = tpci200->info->ipack_bus->bus_nr; in tpci200_pci_probe()
590 dev_set_drvdata(&pdev->dev, tpci200); in tpci200_pci_probe()
599 pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs); in tpci200_pci_probe()
603 kfree(tpci200->info); in tpci200_pci_probe()
612 ipack_bus_unregister(tpci200->info->ipack_bus); in __tpci200_pci_remove()
615 pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs); in __tpci200_pci_remove()
617 pci_release_region(tpci200->info->pdev, TPCI200_CFG_MEM_BAR); in __tpci200_pci_remove()
619 pci_dev_put(tpci200->info->pdev); in __tpci200_pci_remove()
621 kfree(tpci200->info); in __tpci200_pci_remove()
649 MODULE_DESCRIPTION("TEWS TPCI-200 device driver");