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)
6 * Author: Nicolas Serafini, EIC2 SA
7 * Author: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
10 #include <linux/module.h>
11 #include <linux/slab.h>
14 static const u16 tpci200_status_timeout[] = {
21 static const u16 tpci200_status_error[] = {
28 static const size_t tpci200_space_size[IPACK_SPACE_COUNT] = {
29 [IPACK_IO_SPACE] = TPCI200_IO_SPACE_SIZE,
30 [IPACK_ID_SPACE] = TPCI200_ID_SPACE_SIZE,
31 [IPACK_INT_SPACE] = TPCI200_INT_SPACE_SIZE,
32 [IPACK_MEM8_SPACE] = TPCI200_MEM8_SPACE_SIZE,
33 [IPACK_MEM16_SPACE] = TPCI200_MEM16_SPACE_SIZE,
36 static const size_t tpci200_space_interval[IPACK_SPACE_COUNT] = {
37 [IPACK_IO_SPACE] = TPCI200_IO_SPACE_INTERVAL,
38 [IPACK_ID_SPACE] = TPCI200_ID_SPACE_INTERVAL,
39 [IPACK_INT_SPACE] = TPCI200_INT_SPACE_INTERVAL,
40 [IPACK_MEM8_SPACE] = TPCI200_MEM8_SPACE_INTERVAL,
41 [IPACK_MEM16_SPACE] = TPCI200_MEM16_SPACE_INTERVAL,
44 static struct tpci200_board *check_slot(struct ipack_device *dev)
46 struct tpci200_board *tpci200;
52 tpci200 = dev_get_drvdata(dev->bus->parent);
54 if (tpci200 == NULL) {
55 dev_info(&dev->dev, "carrier board not found\n");
59 if (dev->slot >= TPCI200_NB_SLOT) {
61 "Slot [%d:%d] doesn't exist! Last tpci200 slot is %d.\n",
62 dev->bus->bus_nr, dev->slot, TPCI200_NB_SLOT-1);
69 static void tpci200_clear_mask(struct tpci200_board *tpci200,
70 __le16 __iomem *addr, u16 mask)
73 spin_lock_irqsave(&tpci200->regs_lock, flags);
74 iowrite16(ioread16(addr) & (~mask), addr);
75 spin_unlock_irqrestore(&tpci200->regs_lock, flags);
78 static void tpci200_set_mask(struct tpci200_board *tpci200,
79 __le16 __iomem *addr, u16 mask)
82 spin_lock_irqsave(&tpci200->regs_lock, flags);
83 iowrite16(ioread16(addr) | mask, addr);
84 spin_unlock_irqrestore(&tpci200->regs_lock, flags);
87 static void tpci200_unregister(struct tpci200_board *tpci200)
89 free_irq(tpci200->info->pdev->irq, (void *) tpci200);
91 pci_iounmap(tpci200->info->pdev, tpci200->info->interface_regs);
92 pci_iounmap(tpci200->info->pdev, tpci200->info->cfg_regs);
94 pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
95 pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
96 pci_release_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR);
97 pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
98 pci_release_region(tpci200->info->pdev, TPCI200_CFG_MEM_BAR);
100 pci_disable_device(tpci200->info->pdev);
101 pci_dev_put(tpci200->info->pdev);
104 static void tpci200_enable_irq(struct tpci200_board *tpci200,
107 tpci200_set_mask(tpci200,
108 &tpci200->info->interface_regs->control[islot],
109 TPCI200_INT0_EN | TPCI200_INT1_EN);
112 static void tpci200_disable_irq(struct tpci200_board *tpci200,
115 tpci200_clear_mask(tpci200,
116 &tpci200->info->interface_regs->control[islot],
117 TPCI200_INT0_EN | TPCI200_INT1_EN);
120 static irqreturn_t tpci200_slot_irq(struct slot_irq *slot_irq)
126 ret = slot_irq->handler(slot_irq->arg);
131 static irqreturn_t tpci200_interrupt(int irq, void *dev_id)
133 struct tpci200_board *tpci200 = (struct tpci200_board *) dev_id;
134 struct slot_irq *slot_irq;
139 /* Read status register */
140 status_reg = ioread16(&tpci200->info->interface_regs->status);
142 /* Did we cause the interrupt? */
143 if (!(status_reg & TPCI200_SLOT_INT_MASK))
146 /* callback to the IRQ handler for the corresponding slot */
148 for (i = 0; i < TPCI200_NB_SLOT; i++) {
149 if (!(status_reg & ((TPCI200_A_INT0 | TPCI200_A_INT1) << (2 * i))))
151 slot_irq = rcu_dereference(tpci200->slots[i].irq);
152 ret = tpci200_slot_irq(slot_irq);
153 if (ret == -ENODEV) {
154 dev_info(&tpci200->info->pdev->dev,
155 "No registered ISR for slot [%d:%d]!. IRQ will be disabled.\n",
157 tpci200_disable_irq(tpci200, i);
165 static int tpci200_free_irq(struct ipack_device *dev)
167 struct slot_irq *slot_irq;
168 struct tpci200_board *tpci200;
170 tpci200 = check_slot(dev);
174 if (mutex_lock_interruptible(&tpci200->mutex))
177 if (tpci200->slots[dev->slot].irq == NULL) {
178 mutex_unlock(&tpci200->mutex);
182 tpci200_disable_irq(tpci200, dev->slot);
183 slot_irq = tpci200->slots[dev->slot].irq;
184 /* uninstall handler */
185 RCU_INIT_POINTER(tpci200->slots[dev->slot].irq, NULL);
188 mutex_unlock(&tpci200->mutex);
192 static int tpci200_request_irq(struct ipack_device *dev,
193 irqreturn_t (*handler)(void *), void *arg)
196 struct slot_irq *slot_irq;
197 struct tpci200_board *tpci200;
199 tpci200 = check_slot(dev);
203 if (mutex_lock_interruptible(&tpci200->mutex))
206 if (tpci200->slots[dev->slot].irq != NULL) {
208 "Slot [%d:%d] IRQ already registered !\n",
215 slot_irq = kzalloc(sizeof(struct slot_irq), GFP_KERNEL);
216 if (slot_irq == NULL) {
218 "Slot [%d:%d] unable to allocate memory for IRQ !\n",
219 dev->bus->bus_nr, dev->slot);
225 * WARNING: Setup Interrupt Vector in the IndustryPack device
226 * before an IRQ request.
227 * Read the User Manual of your IndustryPack device to know
228 * where to write the vector in memory.
230 slot_irq->handler = handler;
232 slot_irq->holder = dev;
234 rcu_assign_pointer(tpci200->slots[dev->slot].irq, slot_irq);
235 tpci200_enable_irq(tpci200, dev->slot);
238 mutex_unlock(&tpci200->mutex);
242 static int tpci200_register(struct tpci200_board *tpci200)
246 phys_addr_t ioidint_base;
247 unsigned short slot_ctrl;
249 if (pci_enable_device(tpci200->info->pdev) < 0)
252 /* Request IP interface register (Bar 2) */
253 res = pci_request_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR,
254 "Carrier IP interface registers");
256 dev_err(&tpci200->info->pdev->dev,
257 "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 2 !",
258 tpci200->info->pdev->bus->number,
259 tpci200->info->pdev->devfn);
260 goto out_disable_pci;
263 /* Request IO ID INT space (Bar 3) */
264 res = pci_request_region(tpci200->info->pdev,
265 TPCI200_IO_ID_INT_SPACES_BAR,
266 "Carrier IO ID INT space");
268 dev_err(&tpci200->info->pdev->dev,
269 "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 3 !",
270 tpci200->info->pdev->bus->number,
271 tpci200->info->pdev->devfn);
272 goto out_release_ip_space;
275 /* Request MEM8 space (Bar 5) */
276 res = pci_request_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR,
277 "Carrier MEM8 space");
279 dev_err(&tpci200->info->pdev->dev,
280 "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 5!",
281 tpci200->info->pdev->bus->number,
282 tpci200->info->pdev->devfn);
283 goto out_release_ioid_int_space;
286 /* Request MEM16 space (Bar 4) */
287 res = pci_request_region(tpci200->info->pdev, TPCI200_MEM16_SPACE_BAR,
288 "Carrier MEM16 space");
290 dev_err(&tpci200->info->pdev->dev,
291 "(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 4!",
292 tpci200->info->pdev->bus->number,
293 tpci200->info->pdev->devfn);
294 goto out_release_mem8_space;
297 /* Map internal tpci200 driver user space */
298 tpci200->info->interface_regs =
299 ioremap(pci_resource_start(tpci200->info->pdev,
300 TPCI200_IP_INTERFACE_BAR),
302 if (!tpci200->info->interface_regs) {
303 dev_err(&tpci200->info->pdev->dev,
304 "(bn 0x%X, sn 0x%X) failed to map driver user space!",
305 tpci200->info->pdev->bus->number,
306 tpci200->info->pdev->devfn);
308 goto out_release_mem8_space;
311 /* Initialize lock that protects interface_regs */
312 spin_lock_init(&tpci200->regs_lock);
314 ioidint_base = pci_resource_start(tpci200->info->pdev,
315 TPCI200_IO_ID_INT_SPACES_BAR);
316 tpci200->mod_mem[IPACK_IO_SPACE] = ioidint_base + TPCI200_IO_SPACE_OFF;
317 tpci200->mod_mem[IPACK_ID_SPACE] = ioidint_base + TPCI200_ID_SPACE_OFF;
318 tpci200->mod_mem[IPACK_INT_SPACE] =
319 ioidint_base + TPCI200_INT_SPACE_OFF;
320 tpci200->mod_mem[IPACK_MEM8_SPACE] =
321 pci_resource_start(tpci200->info->pdev,
322 TPCI200_MEM8_SPACE_BAR);
323 tpci200->mod_mem[IPACK_MEM16_SPACE] =
324 pci_resource_start(tpci200->info->pdev,
325 TPCI200_MEM16_SPACE_BAR);
327 /* Set the default parameters of the slot
328 * INT0 disabled, level sensitive
329 * INT1 disabled, level sensitive
330 * error interrupt disabled
331 * timeout interrupt disabled
332 * recover time disabled
336 for (i = 0; i < TPCI200_NB_SLOT; i++)
337 writew(slot_ctrl, &tpci200->info->interface_regs->control[i]);
339 res = request_irq(tpci200->info->pdev->irq,
340 tpci200_interrupt, IRQF_SHARED,
341 KBUILD_MODNAME, (void *) tpci200);
343 dev_err(&tpci200->info->pdev->dev,
344 "(bn 0x%X, sn 0x%X) unable to register IRQ !",
345 tpci200->info->pdev->bus->number,
346 tpci200->info->pdev->devfn);
347 goto out_release_ioid_int_space;
352 out_release_mem8_space:
353 pci_release_region(tpci200->info->pdev, TPCI200_MEM8_SPACE_BAR);
354 out_release_ioid_int_space:
355 pci_release_region(tpci200->info->pdev, TPCI200_IO_ID_INT_SPACES_BAR);
356 out_release_ip_space:
357 pci_release_region(tpci200->info->pdev, TPCI200_IP_INTERFACE_BAR);
359 pci_disable_device(tpci200->info->pdev);
363 static int tpci200_get_clockrate(struct ipack_device *dev)
365 struct tpci200_board *tpci200 = check_slot(dev);
366 __le16 __iomem *addr;
371 addr = &tpci200->info->interface_regs->control[dev->slot];
372 return (ioread16(addr) & TPCI200_CLK32) ? 32 : 8;
375 static int tpci200_set_clockrate(struct ipack_device *dev, int mherz)
377 struct tpci200_board *tpci200 = check_slot(dev);
378 __le16 __iomem *addr;
383 addr = &tpci200->info->interface_regs->control[dev->slot];
387 tpci200_clear_mask(tpci200, addr, TPCI200_CLK32);
390 tpci200_set_mask(tpci200, addr, TPCI200_CLK32);
398 static int tpci200_get_error(struct ipack_device *dev)
400 struct tpci200_board *tpci200 = check_slot(dev);
401 __le16 __iomem *addr;
407 addr = &tpci200->info->interface_regs->status;
408 mask = tpci200_status_error[dev->slot];
409 return (ioread16(addr) & mask) ? 1 : 0;
412 static int tpci200_get_timeout(struct ipack_device *dev)
414 struct tpci200_board *tpci200 = check_slot(dev);
415 __le16 __iomem *addr;
421 addr = &tpci200->info->interface_regs->status;
422 mask = tpci200_status_timeout[dev->slot];
424 return (ioread16(addr) & mask) ? 1 : 0;
427 static int tpci200_reset_timeout(struct ipack_device *dev)
429 struct tpci200_board *tpci200 = check_slot(dev);
430 __le16 __iomem *addr;
436 addr = &tpci200->info->interface_regs->status;
437 mask = tpci200_status_timeout[dev->slot];
439 iowrite16(mask, addr);
443 static void tpci200_uninstall(struct tpci200_board *tpci200)
445 tpci200_unregister(tpci200);
446 kfree(tpci200->slots);
449 static const struct ipack_bus_ops tpci200_bus_ops = {
450 .request_irq = tpci200_request_irq,
451 .free_irq = tpci200_free_irq,
452 .get_clockrate = tpci200_get_clockrate,
453 .set_clockrate = tpci200_set_clockrate,
454 .get_error = tpci200_get_error,
455 .get_timeout = tpci200_get_timeout,
456 .reset_timeout = tpci200_reset_timeout,
459 static int tpci200_install(struct tpci200_board *tpci200)
463 tpci200->slots = kcalloc(TPCI200_NB_SLOT, sizeof(struct tpci200_slot),
465 if (tpci200->slots == NULL)
468 res = tpci200_register(tpci200);
470 kfree(tpci200->slots);
471 tpci200->slots = NULL;
475 mutex_init(&tpci200->mutex);
479 static void tpci200_release_device(struct ipack_device *dev)
484 static int tpci200_create_device(struct tpci200_board *tpci200, int i)
487 enum ipack_space space;
488 struct ipack_device *dev =
489 kzalloc(sizeof(struct ipack_device), GFP_KERNEL);
493 dev->bus = tpci200->info->ipack_bus;
494 dev->release = tpci200_release_device;
496 for (space = 0; space < IPACK_SPACE_COUNT; space++) {
497 dev->region[space].start =
498 tpci200->mod_mem[space]
499 + tpci200_space_interval[space] * i;
500 dev->region[space].size = tpci200_space_size[space];
503 ret = ipack_device_init(dev);
505 ipack_put_device(dev);
509 ret = ipack_device_add(dev);
511 ipack_put_device(dev);
516 static int tpci200_pci_probe(struct pci_dev *pdev,
517 const struct pci_device_id *id)
520 struct tpci200_board *tpci200;
523 tpci200 = kzalloc(sizeof(struct tpci200_board), GFP_KERNEL);
527 tpci200->info = kzalloc(sizeof(struct tpci200_infos), GFP_KERNEL);
528 if (!tpci200->info) {
535 /* Obtain a mapping of the carrier's PCI configuration registers */
536 ret = pci_request_region(pdev, TPCI200_CFG_MEM_BAR,
537 KBUILD_MODNAME " Configuration Memory");
539 dev_err(&pdev->dev, "Failed to allocate PCI Configuration Memory");
541 goto out_err_pci_request;
543 tpci200->info->cfg_regs = ioremap(
544 pci_resource_start(pdev, TPCI200_CFG_MEM_BAR),
545 pci_resource_len(pdev, TPCI200_CFG_MEM_BAR));
546 if (!tpci200->info->cfg_regs) {
547 dev_err(&pdev->dev, "Failed to map PCI Configuration Memory");
549 goto out_err_ioremap;
552 /* Disable byte swapping for 16 bit IP module access. This will ensure
553 * that the Industrypack big endian byte order is preserved by the
555 reg32 = ioread32(tpci200->info->cfg_regs + LAS1_DESC);
556 reg32 |= 1 << LAS_BIT_BIGENDIAN;
557 iowrite32(reg32, tpci200->info->cfg_regs + LAS1_DESC);
559 reg32 = ioread32(tpci200->info->cfg_regs + LAS2_DESC);
560 reg32 |= 1 << LAS_BIT_BIGENDIAN;
561 iowrite32(reg32, tpci200->info->cfg_regs + LAS2_DESC);
563 /* Save struct pci_dev pointer */
564 tpci200->info->pdev = pdev;
565 tpci200->info->id_table = (struct pci_device_id *)id;
567 /* register the device and initialize it */
568 ret = tpci200_install(tpci200);
570 dev_err(&pdev->dev, "error during tpci200 install\n");
572 goto out_err_install;
575 /* Register the carrier in the industry pack bus driver */
576 tpci200->info->ipack_bus = ipack_bus_register(&pdev->dev,
580 if (!tpci200->info->ipack_bus) {
582 "error registering the carrier on ipack driver\n");
584 goto out_err_bus_register;
587 /* save the bus number given by ipack to logging purpose */
588 tpci200->number = tpci200->info->ipack_bus->bus_nr;
589 dev_set_drvdata(&pdev->dev, tpci200);
591 for (i = 0; i < TPCI200_NB_SLOT; i++)
592 tpci200_create_device(tpci200, i);
595 out_err_bus_register:
596 tpci200_uninstall(tpci200);
597 /* tpci200->info->cfg_regs is unmapped in tpci200_uninstall */
598 tpci200->info->cfg_regs = NULL;
600 if (tpci200->info->cfg_regs)
601 iounmap(tpci200->info->cfg_regs);
603 pci_release_region(pdev, TPCI200_CFG_MEM_BAR);
606 kfree(tpci200->info);
612 static void __tpci200_pci_remove(struct tpci200_board *tpci200)
614 ipack_bus_unregister(tpci200->info->ipack_bus);
615 tpci200_uninstall(tpci200);
617 kfree(tpci200->info);
621 static void tpci200_pci_remove(struct pci_dev *dev)
623 struct tpci200_board *tpci200 = pci_get_drvdata(dev);
625 __tpci200_pci_remove(tpci200);
628 static const struct pci_device_id tpci200_idtable[] = {
629 { TPCI200_VENDOR_ID, TPCI200_DEVICE_ID, TPCI200_SUBVENDOR_ID,
630 TPCI200_SUBDEVICE_ID },
634 MODULE_DEVICE_TABLE(pci, tpci200_idtable);
636 static struct pci_driver tpci200_pci_drv = {
638 .id_table = tpci200_idtable,
639 .probe = tpci200_pci_probe,
640 .remove = tpci200_pci_remove,
643 module_pci_driver(tpci200_pci_drv);
645 MODULE_DESCRIPTION("TEWS TPCI-200 device driver");
646 MODULE_LICENSE("GPL");