Lines Matching refs:tpci200

3  * tpci200.c
14 #include "tpci200.h"
48 struct tpci200_board *tpci200;
54 tpci200 = dev_get_drvdata(dev->bus->parent);
56 if (tpci200 == NULL) {
63 "Slot [%d:%d] doesn't exist! Last tpci200 slot is %d.\n",
68 return tpci200;
71 static void tpci200_clear_mask(struct tpci200_board *tpci200,
75 spin_lock_irqsave(&tpci200->regs_lock, flags);
77 spin_unlock_irqrestore(&tpci200->regs_lock, flags);
80 static void tpci200_set_mask(struct tpci200_board *tpci200,
84 spin_lock_irqsave(&tpci200->regs_lock, flags);
86 spin_unlock_irqrestore(&tpci200->regs_lock, flags);
89 static void tpci200_unregister(struct tpci200_board *tpci200)
91 free_irq(tpci200->info->pdev->irq, (void *) tpci200);
93 pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
95 pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
96 pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
97 pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
98 pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
100 pci_disable_device(tpci200->info->pdev);
103 static void tpci200_enable_irq(struct tpci200_board *tpci200,
106 tpci200_set_mask(tpci200,
107 &tpci200->info->interface_regs->control[islot],
111 static void tpci200_disable_irq(struct tpci200_board *tpci200,
114 tpci200_clear_mask(tpci200,
115 &tpci200->info->interface_regs->control[islot],
132 struct tpci200_board *tpci200 = (struct tpci200_board *) dev_id;
139 status_reg = ioread16(&tpci200->info->interface_regs->status);
150 slot_irq = rcu_dereference(tpci200->slots[i].irq);
153 dev_info(&tpci200->info->pdev->dev,
155 tpci200->number, i);
156 tpci200_disable_irq(tpci200, i);
167 struct tpci200_board *tpci200;
169 tpci200 = check_slot(dev);
170 if (tpci200 == NULL)
173 if (mutex_lock_interruptible(&tpci200->mutex))
176 if (tpci200->slots[dev->slot].irq == NULL) {
177 mutex_unlock(&tpci200->mutex);
181 tpci200_disable_irq(tpci200, dev->slot);
182 slot_irq = tpci200->slots[dev->slot].irq;
184 RCU_INIT_POINTER(tpci200->slots[dev->slot].irq, NULL);
187 mutex_unlock(&tpci200->mutex);
196 struct tpci200_board *tpci200;
198 tpci200 = check_slot(dev);
199 if (tpci200 == NULL)
202 if (mutex_lock_interruptible(&tpci200->mutex))
205 if (tpci200->slots[dev->slot].irq != NULL) {
233 rcu_assign_pointer(tpci200->slots[dev->slot].irq, slot_irq);
234 tpci200_enable_irq(tpci200, dev->slot);
237 mutex_unlock(&tpci200->mutex);
241 static int tpci200_register(struct tpci200_board *tpci200)
248 if (pci_enable_device(tpci200->info->pdev) < 0)
252 res = pci_request_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR,
255 dev_err(&tpci200->info->pdev->dev,
257 tpci200->info->pdev->bus->number,
258 tpci200->info->pdev->devfn);
263 res = pci_request_region(tpci200->info->pdev,
267 dev_err(&tpci200->info->pdev->dev,
269 tpci200->info->pdev->bus->number,
270 tpci200->info->pdev->devfn);
275 res = pci_request_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR,
278 dev_err(&tpci200->info->pdev->dev,
280 tpci200->info->pdev->bus->number,
281 tpci200->info->pdev->devfn);
286 res = pci_request_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR,
289 dev_err(&tpci200->info->pdev->dev,
291 tpci200->info->pdev->bus->number,
292 tpci200->info->pdev->devfn);
296 /* Map internal tpci200 driver user space */
297 tpci200->info->interface_regs =
298 ioremap(pci_resource_start(tpci200->info->pdev,
301 if (!tpci200->info->interface_regs) {
302 dev_err(&tpci200->info->pdev->dev,
304 tpci200->info->pdev->bus->number,
305 tpci200->info->pdev->devfn);
311 spin_lock_init(&tpci200->regs_lock);
313 ioidint_base = pci_resource_start(tpci200->info->pdev,
315 tpci200->mod_mem[IPACK_IO_SPACE] = ioidint_base + TPCI200_IO_SPACE_OFF;
316 tpci200->mod_mem[IPACK_ID_SPACE] = ioidint_base + TPCI200_ID_SPACE_OFF;
317 tpci200->mod_mem[IPACK_INT_SPACE] =
319 tpci200->mod_mem[IPACK_MEM8_SPACE] =
320 pci_resource_start(tpci200->info->pdev,
322 tpci200->mod_mem[IPACK_MEM16_SPACE] =
323 pci_resource_start(tpci200->info->pdev,
336 writew(slot_ctrl, &tpci200->info->interface_regs->control[i]);
338 res = request_irq(tpci200->info->pdev->irq,
340 KBUILD_MODNAME, (void *) tpci200);
342 dev_err(&tpci200->info->pdev->dev,
344 tpci200->info->pdev->bus->number,
345 tpci200->info->pdev->devfn);
352 pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
354 pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
356 pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
358 pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
360 pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
362 pci_disable_device(tpci200->info->pdev);
368 struct tpci200_board *tpci200 = check_slot(dev);
371 if (!tpci200)
374 addr = &tpci200->info->interface_regs->control[dev->slot];
380 struct tpci200_board *tpci200 = check_slot(dev);
383 if (!tpci200)
386 addr = &tpci200->info->interface_regs->control[dev->slot];
390 tpci200_clear_mask(tpci200, addr, TPCI200_CLK32);
393 tpci200_set_mask(tpci200, addr, TPCI200_CLK32);
403 struct tpci200_board *tpci200 = check_slot(dev);
407 if (!tpci200)
410 addr = &tpci200->info->interface_regs->status;
417 struct tpci200_board *tpci200 = check_slot(dev);
421 if (!tpci200)
424 addr = &tpci200->info->interface_regs->status;
432 struct tpci200_board *tpci200 = check_slot(dev);
436 if (!tpci200)
439 addr = &tpci200->info->interface_regs->status;
446 static void tpci200_uninstall(struct tpci200_board *tpci200)
448 tpci200_unregister(tpci200);
449 kfree(tpci200->slots);
462 static int tpci200_install(struct tpci200_board *tpci200)
466 tpci200->slots = kcalloc(TPCI200_NB_SLOT, sizeof(struct tpci200_slot),
468 if (tpci200->slots == NULL)
471 res = tpci200_register(tpci200);
473 kfree(tpci200->slots);
474 tpci200->slots = NULL;
478 mutex_init(&tpci200->mutex);
487 static int tpci200_create_device(struct tpci200_board *tpci200, int i)
496 dev->bus = tpci200->info->ipack_bus;
501 tpci200->mod_mem[space]
523 struct tpci200_board *tpci200;
526 tpci200 = kzalloc(sizeof(struct tpci200_board), GFP_KERNEL);
527 if (!tpci200)
530 tpci200->info = kzalloc(sizeof(struct tpci200_infos), GFP_KERNEL);
531 if (!tpci200->info) {
546 tpci200->info->cfg_regs = ioremap(
549 if (!tpci200->info->cfg_regs) {
558 reg32 = ioread32(tpci200->info->cfg_regs + LAS1_DESC);
560 iowrite32(reg32, tpci200->info->cfg_regs + LAS1_DESC);
562 reg32 = ioread32(tpci200->info->cfg_regs + LAS2_DESC);
564 iowrite32(reg32, tpci200->info->cfg_regs + LAS2_DESC);
567 tpci200->info->pdev = pdev;
568 tpci200->info->id_table = (struct pci_device_id *)id;
571 ret = tpci200_install(tpci200);
573 dev_err(&pdev->dev, "error during tpci200 install\n");
579 tpci200->info->ipack_bus = ipack_bus_register(&pdev->dev,
583 if (!tpci200->info->ipack_bus) {
591 tpci200->number = tpci200->info->ipack_bus->bus_nr;
592 dev_set_drvdata(&pdev->dev, tpci200);
595 tpci200_create_device(tpci200, i);
599 tpci200_uninstall(tpci200);
601 pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
605 kfree(tpci200->info);
608 kfree(tpci200);
612 static void __tpci200_pci_remove(struct tpci200_board *tpci200)
614 ipack_bus_unregister(tpci200->info->ipack_bus);
615 tpci200_uninstall(tpci200);
617 pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
619 pci_release_region(tpci200->info->pdev, TPCI200_CFG_MEM_BAR);
621 pci_dev_put(tpci200->info->pdev);
623 kfree(tpci200->info);
624 kfree(tpci200);
629 struct tpci200_board *tpci200 = pci_get_drvdata(dev);
631 __tpci200_pci_remove(tpci200);
643 .name = "tpci200",