Changeset ce76b9d2 in rtems
- Timestamp:
- May 8, 2017, 12:58:41 PM (3 years ago)
- Branches:
- master
- Children:
- f767fe7
- Parents:
- 8670c464
- git-author:
- Daniel Hellstrom <daniel@…> (05/08/17 12:58:41)
- git-committer:
- Daniel Hellstrom <daniel@…> (05/14/17 10:31:59)
- Location:
- c/src/lib/libbsp/sparc/shared/pci
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/lib/libbsp/sparc/shared/pci/gr_701.c
r8670c464 rce76b9d2 24 24 #include <bsp.h> 25 25 #include <rtems/bspIo.h> 26 #include <rtems/score/isrlock.h> /* spin-lock */ 26 27 #include <pci.h> 27 28 #include <pci/access.h> … … 37 38 38 39 #include <bsp/gr_701.h> 40 41 /* map via rtems_interrupt_lock_* API: */ 42 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 43 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 44 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 45 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 46 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 47 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 48 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 49 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 39 50 40 51 /* Offset from 0x80000000 (dual bus version) */ … … 88 99 struct gr701_priv { 89 100 /* Driver management */ 90 struct drvmgr_dev *dev;101 struct drvmgr_dev *dev; 91 102 char prefix[16]; 103 SPIN_DECLARE(devlock); 92 104 93 105 struct pci_bridge_regs *pcib; … … 201 213 unsigned int status; 202 214 int irq = 0; 203 215 SPIN_ISR_IRQFLAGS(irqflags); 216 217 SPIN_LOCK(&priv->devlock, irqflags); 204 218 while ( (status=priv->pcib->istatus) != 0 ) { 205 219 priv->interrupt_cnt++; /* An interrupt was generated */ … … 209 223 priv->pcib->istatus = 0; 210 224 } 225 SPIN_UNLOCK(&priv->devlock, irqflags); 211 226 212 227 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller still drives the IRQ. */ … … 348 363 return DRVMGR_ENORES; 349 364 365 /* Initialize spin-lock for this PCI perihperal device. This is to 366 * protect the Interrupt Controller Registers. The genirq layer is 367 * protecting its own internals and ISR dispatching. 368 */ 369 SPIN_INIT(&priv->devlock, priv->prefix); 370 350 371 priv->genirq = genirq_init(16); 351 372 if ( priv->genirq == NULL ) { … … 411 432 { 412 433 struct gr701_priv *priv = dev->parent->dev->priv; 413 rtems_interrupt_level level;434 SPIN_IRQFLAGS(irqflags); 414 435 int status; 415 416 rtems_interrupt_disable(level); 417 418 status = genirq_register(priv->genirq, irq, handler, arg); 436 void *h; 437 438 h = genirq_alloc_handler(handler, arg); 439 if ( h == NULL ) 440 return DRVMGR_FAIL; 441 442 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 443 444 status = genirq_register(priv->genirq, irq, h); 419 445 if ( status == 0 ) { 420 446 /* Clear IRQ for first registered handler */ … … 424 450 425 451 if (status != 0) { 426 rtems_interrupt_enable(level); 452 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 453 genirq_free_handler(h); 427 454 return DRVMGR_FAIL; 428 455 } … … 435 462 status = DRVMGR_OK; 436 463 437 rtems_interrupt_enable(level);464 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 438 465 439 466 return status; … … 447 474 { 448 475 struct gr701_priv *priv = dev->parent->dev->priv; 449 rtems_interrupt_level level;476 SPIN_IRQFLAGS(irqflags); 450 477 int status; 451 452 rtems_interrupt_disable(level); 478 void *handler; 479 480 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 453 481 454 482 status = genirq_disable(priv->genirq, irq, isr, arg); … … 458 486 } 459 487 460 status= genirq_unregister(priv->genirq, irq, isr, arg);461 if ( status != 0)488 handler = genirq_unregister(priv->genirq, irq, isr, arg); 489 if ( handler == NULL ) 462 490 status = DRVMGR_FAIL; 463 464 rtems_interrupt_enable(level); 491 else 492 status = DRVMGR_OK; 493 494 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 495 496 if (handler) 497 genirq_free_handler(handler); 465 498 466 499 return status; … … 472 505 { 473 506 struct gr701_priv *priv = dev->parent->dev->priv; 474 rtems_interrupt_level level;507 SPIN_IRQFLAGS(irqflags); 475 508 476 509 DBG("GR-701 IRQ %d: enable\n", irq); … … 479 512 return DRVMGR_FAIL; 480 513 481 rtems_interrupt_disable(level);514 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 482 515 483 516 /* Enable IRQ */ 484 517 priv->pcib->imask |= (1<<irq); /* unmask interrupt source */ 485 518 486 rtems_interrupt_enable(level);519 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 487 520 488 521 return DRVMGR_OK; … … 494 527 { 495 528 struct gr701_priv *priv = dev->parent->dev->priv; 496 rtems_interrupt_level level;529 SPIN_IRQFLAGS(irqflags); 497 530 498 531 DBG("GR-701 IRQ %d: disable\n", irq); … … 501 534 return DRVMGR_FAIL; 502 535 503 rtems_interrupt_disable(level);536 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 504 537 505 538 /* Disable IRQ */ 506 539 priv->pcib->imask &= ~(1<<irq); /* mask interrupt source */ 507 540 508 rtems_interrupt_enable(level);541 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 509 542 510 543 return DRVMGR_OK; -
c/src/lib/libbsp/sparc/shared/pci/gr_cpci_gr740.c
r8670c464 rce76b9d2 34 34 #include <bsp.h> 35 35 #include <rtems/bspIo.h> 36 #include <rtems/score/isrlock.h> /* spin-lock */ 36 37 #include <pci.h> 37 38 … … 45 46 46 47 #include <bsp/gr_cpci_gr740.h> 48 49 /* map via rtems_interrupt_lock_* API: */ 50 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 51 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 52 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 53 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 54 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 55 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 56 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 57 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 47 58 48 59 /* Determines which PCI address the AHB masters on the GR740 board will … … 99 110 /* Driver management */ 100 111 struct drvmgr_dev *dev; 101 char prefix[20]; 112 char prefix[16]; 113 SPIN_DECLARE(devlock); 102 114 103 115 /* PCI */ … … 214 226 unsigned int status, tmp; 215 227 int irq, eirq; 228 SPIN_ISR_IRQFLAGS(irqflags); 229 216 230 tmp = status = priv->irq->ipend; 217 231 218 232 /* DBG("GR-CPCI-GR740: IRQ 0x%x\n",status); */ 219 233 234 SPIN_LOCK(&priv->devlock, irqflags); 220 235 for(irq = 0; irq < 32; irq++) { 221 236 if (status & (1 << irq)) { … … 236 251 } 237 252 } 253 SPIN_UNLOCK(&priv->devlock, irqflags); 238 254 239 255 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller … … 462 478 /* Generate Device prefix */ 463 479 464 strcpy(priv->prefix, "/dev/gr740 0");465 priv->prefix[1 0] += dev->minor_drv;480 strcpy(priv->prefix, "/dev/gr740_0"); 481 priv->prefix[11] += dev->minor_drv; 466 482 mkdir(priv->prefix, S_IRWXU | S_IRWXG | S_IRWXO); 467 priv->prefix[1 1] = '/';468 priv->prefix[1 2] = '\0';483 priv->prefix[12] = '/'; 484 priv->prefix[13] = '\0'; 469 485 470 486 priv->devinfo = devinfo = (struct pci_dev_info *)dev->businfo; … … 486 502 printf(" IRQ: %d\n\n\n", devinfo->irq); 487 503 504 /* Initialize spin-lock for this PCI perihperal device. This is to 505 * protect the Interrupt Controller Registers. The genirq layer is 506 * protecting its own internals and ISR dispatching. 507 */ 508 SPIN_INIT(&priv->devlock, priv->prefix); 509 488 510 /* Let user override which PCI address the AHB masters of the 489 511 * GR740 board access when doing DMA to HOST RAM. The AHB masters … … 577 599 { 578 600 struct gr_cpci_gr740_priv *priv = dev->parent->dev->priv; 579 rtems_interrupt_level level;601 SPIN_IRQFLAGS(irqflags); 580 602 int status; 581 582 rtems_interrupt_disable(level); 583 584 status = genirq_register(priv->genirq, irq, handler, arg); 603 void *h; 604 605 h = genirq_alloc_handler(handler, arg); 606 if ( h == NULL ) 607 return DRVMGR_FAIL; 608 609 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 610 611 status = genirq_register(priv->genirq, irq, h); 585 612 if (status == 0) { 586 613 /* Clear IRQ for first registered handler */ … … 590 617 591 618 if (status != 0) { 592 rtems_interrupt_enable(level); 619 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 620 genirq_free_handler(h); 593 621 return DRVMGR_FAIL; 594 622 } … … 601 629 status = 0; 602 630 603 rtems_interrupt_enable(level);631 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 604 632 605 633 return status; … … 613 641 { 614 642 struct gr_cpci_gr740_priv *priv = dev->parent->dev->priv; 615 rtems_interrupt_level level;643 SPIN_IRQFLAGS(irqflags); 616 644 int status; 617 618 rtems_interrupt_disable(level); 645 void *handler; 646 647 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 619 648 620 649 status = genirq_disable(priv->genirq, irq, isr, arg); … … 624 653 } 625 654 626 status= genirq_unregister(priv->genirq, irq, isr, arg);627 if ( status != 0)655 handler = genirq_unregister(priv->genirq, irq, isr, arg); 656 if ( handler == NULL ) 628 657 status = DRVMGR_FAIL; 629 630 rtems_interrupt_enable(level); 658 else 659 status = DRVMGR_OK; 660 661 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 662 663 if (handler) 664 genirq_free_handler(handler); 631 665 632 666 return status; … … 638 672 { 639 673 struct gr_cpci_gr740_priv *priv = dev->parent->dev->priv; 640 rtems_interrupt_level level;674 SPIN_IRQFLAGS(irqflags); 641 675 642 676 DBG("GR740 IRQ %d: unmask\n", irq); … … 645 679 return DRVMGR_EINVAL; 646 680 647 rtems_interrupt_disable(level);681 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 648 682 649 683 /* Enable IRQ for first enabled handler only */ 650 684 priv->irq->mask[0] |= (1<<irq); /* unmask interrupt source */ 651 685 652 rtems_interrupt_enable(level);686 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 653 687 654 688 return DRVMGR_OK; … … 660 694 { 661 695 struct gr_cpci_gr740_priv *priv = dev->parent->dev->priv; 662 rtems_interrupt_level level;696 SPIN_IRQFLAGS(irqflags); 663 697 664 698 DBG("GR740 IRQ %d: mask\n", irq); … … 667 701 return DRVMGR_EINVAL; 668 702 669 rtems_interrupt_disable(level);703 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 670 704 671 705 /* Disable/mask IRQ */ 672 706 priv->irq->mask[0] &= ~(1<<irq); /* mask interrupt source */ 673 707 674 rtems_interrupt_enable(level);708 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 675 709 676 710 return DRVMGR_OK; -
c/src/lib/libbsp/sparc/shared/pci/gr_leon4_n2x.c
r8670c464 rce76b9d2 33 33 #include <bsp.h> 34 34 #include <rtems/bspIo.h> 35 #include <rtems/score/isrlock.h> /* spin-lock */ 35 36 #include <pci.h> 36 37 … … 44 45 45 46 #include <bsp/gr_leon4_n2x.h> 47 48 /* map via rtems_interrupt_lock_* API: */ 49 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 50 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 51 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 52 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 53 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 54 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 55 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 56 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 46 57 47 58 /* Determines which PCI address the AHB masters on the LEON-N2X board will … … 99 110 struct drvmgr_dev *dev; 100 111 char prefix[20]; 112 SPIN_DECLARE(devlock); 101 113 102 114 /* PCI */ … … 214 226 unsigned int status, tmp; 215 227 int irq, eirq; 228 SPIN_ISR_IRQFLAGS(irqflags); 229 216 230 tmp = status = priv->irq->ipend; 217 231 218 232 /* DBG("GR-CPCI-LEON4-N2X: IRQ 0x%x\n",status); */ 219 233 234 SPIN_LOCK(&priv->devlock, irqflags); 220 235 for(irq = 0; irq < 32; irq++) { 221 236 if (status & (1 << irq)) { … … 236 251 } 237 252 } 253 SPIN_UNLOCK(&priv->devlock, irqflags); 238 254 239 255 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller … … 509 525 printf(" IRQ: %d\n\n\n", devinfo->irq); 510 526 527 /* Initialize spin-lock for this PCI perihperal device. This is to 528 * protect the Interrupt Controller Registers. The genirq layer is 529 * protecting its own internals and ISR dispatching. 530 */ 531 SPIN_INIT(&priv->devlock, priv->prefix); 532 511 533 /* Let user override which PCI address the AHB masters of the 512 534 * LEON4-N2X board access when doing DMA to HOST RAM. The AHB masters … … 600 622 { 601 623 struct gr_cpci_leon4_n2x_priv *priv = dev->parent->dev->priv; 602 rtems_interrupt_level level;624 SPIN_IRQFLAGS(irqflags); 603 625 int status; 604 605 rtems_interrupt_disable(level); 606 607 status = genirq_register(priv->genirq, irq, handler, arg); 626 void *h; 627 628 h = genirq_alloc_handler(handler, arg); 629 if ( h == NULL ) 630 return DRVMGR_FAIL; 631 632 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 633 634 status = genirq_register(priv->genirq, irq, h); 608 635 if (status == 0) { 609 636 /* Clear IRQ for first registered handler */ … … 613 640 614 641 if (status != 0) { 615 rtems_interrupt_enable(level); 642 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 643 genirq_free_handler(h); 616 644 return DRVMGR_FAIL; 617 645 } … … 624 652 status = 0; 625 653 626 rtems_interrupt_enable(level);654 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 627 655 628 656 return status; … … 636 664 { 637 665 struct gr_cpci_leon4_n2x_priv *priv = dev->parent->dev->priv; 638 rtems_interrupt_level level;666 SPIN_IRQFLAGS(irqflags); 639 667 int status; 640 641 rtems_interrupt_disable(level); 668 void *handler; 669 670 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 642 671 643 672 status = genirq_disable(priv->genirq, irq, isr, arg); … … 647 676 } 648 677 649 status= genirq_unregister(priv->genirq, irq, isr, arg);650 if ( status != 0)678 handler = genirq_unregister(priv->genirq, irq, isr, arg); 679 if ( handler == NULL ) 651 680 status = DRVMGR_FAIL; 652 653 rtems_interrupt_enable(level); 681 else 682 status = DRVMGR_OK; 683 684 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 685 686 if (handler) 687 genirq_free_handler(handler); 654 688 655 689 return status; … … 661 695 { 662 696 struct gr_cpci_leon4_n2x_priv *priv = dev->parent->dev->priv; 663 rtems_interrupt_level level;697 SPIN_IRQFLAGS(irqflags); 664 698 665 699 DBG("LEON4-N2X IRQ %d: unmask\n", irq); … … 668 702 return DRVMGR_EINVAL; 669 703 670 rtems_interrupt_disable(level);704 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 671 705 672 706 /* Enable IRQ for first enabled handler only */ 673 707 priv->irq->mask[0] |= (1<<irq); /* unmask interrupt source */ 674 708 675 rtems_interrupt_enable(level);709 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 676 710 677 711 return DRVMGR_OK; … … 683 717 { 684 718 struct gr_cpci_leon4_n2x_priv *priv = dev->parent->dev->priv; 685 rtems_interrupt_level level;719 SPIN_IRQFLAGS(irqflags); 686 720 687 721 DBG("LEON4-N2X IRQ %d: mask\n", irq); … … 690 724 return DRVMGR_EINVAL; 691 725 692 rtems_interrupt_disable(level);726 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 693 727 694 728 /* Disable/mask IRQ */ 695 729 priv->irq->mask[0] &= ~(1<<irq); /* mask interrupt source */ 696 730 697 rtems_interrupt_enable(level);731 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 698 732 699 733 return DRVMGR_OK; -
c/src/lib/libbsp/sparc/shared/pci/gr_rasta_adcdac.c
r8670c464 rce76b9d2 24 24 #include <bsp.h> 25 25 #include <rtems/bspIo.h> 26 #include <rtems/score/isrlock.h> /* spin-lock */ 26 27 #include <pci.h> 27 28 … … 35 36 36 37 #include <bsp/gr_rasta_adcdac.h> 38 39 /* map via rtems_interrupt_lock_* API: */ 40 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 41 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 42 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 43 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 44 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 45 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 46 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 47 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 37 48 38 49 /*#define DEBUG 1*/ … … 77 88 struct gr_rasta_adcdac_priv { 78 89 /* Driver management */ 79 struct drvmgr_dev *dev;90 struct drvmgr_dev *dev; 80 91 char prefix[20]; 92 SPIN_DECLARE(devlock); 81 93 82 94 /* PCI */ … … 194 206 unsigned int status, tmp; 195 207 int irq; 208 SPIN_ISR_IRQFLAGS(irqflags); 209 196 210 tmp = status = priv->irq->ipend; 197 211 198 212 /* DBG("GR-RASTA-ADCDAC: IRQ 0x%x\n",status); */ 199 213 214 SPIN_LOCK(&priv->devlock, irqflags); 200 215 for(irq=0; irq<16; irq++) { 201 216 if ( status & (1<<irq) ) { … … 207 222 } 208 223 } 224 SPIN_UNLOCK(&priv->devlock, irqflags); 209 225 210 226 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller still drives the IRQ. */ … … 411 427 if ((bar0_size == 0) || (bar1_size == 0)) 412 428 return DRVMGR_ENORES; 429 430 /* Initialize spin-lock for this PCI perihperal device. This is to 431 * protect the Interrupt Controller Registers. The genirq layer is 432 * protecting its own internals and ISR dispatching. 433 */ 434 SPIN_INIT(&priv->devlock, priv->prefix); 413 435 414 436 /* Let user override which PCI address the AHB masters of the … … 489 511 { 490 512 struct gr_rasta_adcdac_priv *priv = dev->parent->dev->priv; 491 rtems_interrupt_level level;513 SPIN_IRQFLAGS(irqflags); 492 514 int status; 493 494 rtems_interrupt_disable(level); 495 496 status = genirq_register(priv->genirq, irq, handler, arg); 515 void *h; 516 517 h = genirq_alloc_handler(handler, arg); 518 if ( h == NULL ) 519 return DRVMGR_FAIL; 520 521 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 522 523 status = genirq_register(priv->genirq, irq, h); 497 524 if ( status == 0 ) { 498 525 /* Clear IRQ for first registered handler */ … … 502 529 503 530 if (status != 0) { 504 rtems_interrupt_enable(level); 531 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 532 genirq_free_handler(h); 505 533 return DRVMGR_FAIL; 506 534 } … … 513 541 status = 0; 514 542 515 rtems_interrupt_enable(level);543 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 516 544 517 545 return status; … … 525 553 { 526 554 struct gr_rasta_adcdac_priv *priv = dev->parent->dev->priv; 527 rtems_interrupt_level level;555 SPIN_IRQFLAGS(irqflags); 528 556 int status; 529 530 rtems_interrupt_disable(level); 557 void *handler; 558 559 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 531 560 532 561 status = genirq_disable(priv->genirq, irq, isr, arg); … … 536 565 } 537 566 538 status= genirq_unregister(priv->genirq, irq, isr, arg);539 if ( status != 0)567 handler = genirq_unregister(priv->genirq, irq, isr, arg); 568 if ( handler == NULL ) 540 569 status = DRVMGR_FAIL; 541 542 rtems_interrupt_enable(level); 570 else 571 status = DRVMGR_OK; 572 573 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 574 575 if (handler) 576 genirq_free_handler(handler); 543 577 544 578 return status; … … 550 584 { 551 585 struct gr_rasta_adcdac_priv *priv = dev->parent->dev->priv; 552 rtems_interrupt_level level;586 SPIN_IRQFLAGS(irqflags); 553 587 554 588 DBG("RASTA-ADCDAC IRQ %d: unmask\n", irq); … … 557 591 return DRVMGR_EINVAL; 558 592 559 rtems_interrupt_disable(level);593 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 560 594 561 595 /* Enable IRQ for first enabled handler only */ 562 596 priv->irq->mask[0] |= (1<<irq); /* unmask interrupt source */ 563 597 564 rtems_interrupt_enable(level);598 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 565 599 566 600 return DRVMGR_OK; … … 572 606 { 573 607 struct gr_rasta_adcdac_priv *priv = dev->parent->dev->priv; 574 rtems_interrupt_level level;608 SPIN_IRQFLAGS(irqflags); 575 609 576 610 DBG("RASTA-ADCDAC IRQ %d: mask\n", irq); … … 579 613 return DRVMGR_EINVAL; 580 614 581 rtems_interrupt_disable(level);615 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 582 616 583 617 /* Disable/mask IRQ */ 584 618 priv->irq->mask[0] &= ~(1<<irq); /* mask interrupt source */ 585 619 586 rtems_interrupt_enable(level);620 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 587 621 588 622 return DRVMGR_OK; -
c/src/lib/libbsp/sparc/shared/pci/gr_rasta_io.c
r8670c464 rce76b9d2 24 24 #include <bsp.h> 25 25 #include <rtems/bspIo.h> 26 #include <rtems/score/isrlock.h> /* spin-lock */ 26 27 #include <pci.h> 27 28 … … 35 36 36 37 #include <bsp/gr_rasta_io.h> 38 39 /* map via rtems_interrupt_lock_* API: */ 40 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 41 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 42 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 43 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 44 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 45 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 46 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 47 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 37 48 38 49 /* Determines which PCI address the AHB masters will access, it should be … … 109 120 struct gr_rasta_io_priv { 110 121 /* Driver management */ 111 struct drvmgr_dev *dev;122 struct drvmgr_dev *dev; 112 123 char prefix[16]; 124 SPIN_DECLARE(devlock); 113 125 114 126 /* PCI */ … … 234 246 unsigned int status, tmp; 235 247 int irq; 248 SPIN_ISR_IRQFLAGS(irqflags); 249 236 250 tmp = status = priv->irq->ipend; 237 251 238 252 /* DBG("GR-RASTA-IO: IRQ 0x%x\n",status); */ 239 253 254 SPIN_LOCK(&priv->devlock, irqflags); 240 255 for(irq=0; irq<16; irq++) { 241 256 if ( status & (1<<irq) ) { … … 247 262 } 248 263 } 264 SPIN_UNLOCK(&priv->devlock, irqflags); 249 265 250 266 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller still drives the IRQ. */ … … 590 606 if ((bar0_size == 0) || (bar1_size == 0)) 591 607 return DRVMGR_ENORES; 608 609 /* Initialize spin-lock for this PCI peripheral device. This is to 610 * protect the Interrupt Controller Registers. The genirq layer is 611 * protecting its own internals and ISR dispatching. 612 */ 613 SPIN_INIT(&priv->devlock, priv->prefix); 592 614 593 615 /* Let user override which PCI address the AHB masters of the … … 686 708 { 687 709 struct gr_rasta_io_priv *priv = dev->parent->dev->priv; 688 rtems_interrupt_level level;710 SPIN_IRQFLAGS(irqflags); 689 711 int status; 690 691 rtems_interrupt_disable(level); 692 693 status = genirq_register(priv->genirq, irq, handler, arg); 712 void *h; 713 714 h = genirq_alloc_handler(handler, arg); 715 if ( h == NULL ) 716 return DRVMGR_FAIL; 717 718 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 719 720 status = genirq_register(priv->genirq, irq, h); 694 721 if ( status == 0 ) { 695 722 /* Clear IRQ for first registered handler */ … … 699 726 700 727 if (status != 0) { 701 rtems_interrupt_enable(level); 728 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 729 genirq_free_handler(h); 702 730 return DRVMGR_FAIL; 703 731 } … … 710 738 status = 0; 711 739 712 rtems_interrupt_enable(level);740 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 713 741 714 742 return status; … … 722 750 { 723 751 struct gr_rasta_io_priv *priv = dev->parent->dev->priv; 724 rtems_interrupt_level level;752 SPIN_IRQFLAGS(irqflags); 725 753 int status; 726 727 rtems_interrupt_disable(level); 754 void *handler; 755 756 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 728 757 729 758 status = genirq_disable(priv->genirq, irq, isr, arg); … … 733 762 } 734 763 735 status= genirq_unregister(priv->genirq, irq, isr, arg);736 if ( status != 0)764 handler = genirq_unregister(priv->genirq, irq, isr, arg); 765 if ( handler == NULL ) 737 766 status = DRVMGR_FAIL; 738 739 rtems_interrupt_enable(level); 767 else 768 status = DRVMGR_OK; 769 770 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 771 772 if (handler) 773 genirq_free_handler(handler); 740 774 741 775 return status; … … 747 781 { 748 782 struct gr_rasta_io_priv *priv = dev->parent->dev->priv; 749 rtems_interrupt_level level;783 SPIN_IRQFLAGS(irqflags); 750 784 751 785 DBG("RASTA-IO IRQ %d: unmask\n", irq); … … 754 788 return DRVMGR_EINVAL; 755 789 756 rtems_interrupt_disable(level);790 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 757 791 758 792 /* Enable IRQ for first enabled handler only */ 759 793 priv->irq->mask[0] |= (1<<irq); /* unmask interrupt source */ 760 794 761 rtems_interrupt_enable(level);795 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 762 796 763 797 return DRVMGR_OK; … … 769 803 { 770 804 struct gr_rasta_io_priv *priv = dev->parent->dev->priv; 771 rtems_interrupt_level level;805 SPIN_IRQFLAGS(irqflags); 772 806 773 807 DBG("RASTA-IO IRQ %d: mask\n", irq); … … 776 810 return DRVMGR_EINVAL; 777 811 778 rtems_interrupt_disable(level);812 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 779 813 780 814 /* Disable/mask IRQ */ 781 815 priv->irq->mask[0] &= ~(1<<irq); /* mask interrupt source */ 782 816 783 rtems_interrupt_enable(level);817 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 784 818 785 819 return DRVMGR_OK; -
c/src/lib/libbsp/sparc/shared/pci/gr_rasta_spw_router.c
r8670c464 rce76b9d2 22 22 #include <bsp.h> 23 23 #include <rtems/bspIo.h> 24 #include <rtems/score/isrlock.h> /* spin-lock */ 24 25 #include <pci.h> 25 26 … … 32 33 #include <bsp/genirq.h> 33 34 #include <bsp/gr_rasta_spw_router.h> 35 36 /* map via rtems_interrupt_lock_* API: */ 37 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 38 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 39 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 40 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 41 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 42 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 43 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 44 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 34 45 35 46 /* Determines which PCI address the AHB masters will access, it should be … … 94 105 struct drvmgr_dev *dev; 95 106 char prefix[20]; 107 SPIN_DECLARE(devlock); 96 108 97 109 /* PCI */ … … 210 222 unsigned int status, tmp; 211 223 int irq; 224 SPIN_ISR_IRQFLAGS(irqflags); 225 212 226 tmp = status = priv->irq->ipend; 213 227 214 228 /* DBG("GR-RASTA-SPW-ROUTER: IRQ 0x%x\n",status); */ 215 229 230 SPIN_LOCK(&priv->devlock, irqflags); 216 231 for(irq=0; irq<16; irq++) { 217 232 if ( status & (1<<irq) ) { … … 223 238 } 224 239 } 240 SPIN_UNLOCK(&priv->devlock, irqflags); 225 241 226 242 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller … … 423 439 if (bar0_size == 0) 424 440 return DRVMGR_ENORES; 441 442 /* Initialize spin-lock for this PCI peripheral device. This is to 443 * protect the Interrupt Controller Registers. The genirq layer is 444 * protecting its own internals and ISR dispatching. 445 */ 446 SPIN_INIT(&priv->devlock, priv->prefix); 425 447 426 448 /* Let user override which PCI address the AHB masters of the … … 496 518 { 497 519 struct gr_rasta_spw_router_priv *priv = dev->parent->dev->priv; 498 rtems_interrupt_level level;520 SPIN_IRQFLAGS(irqflags); 499 521 int status; 500 501 rtems_interrupt_disable(level); 502 503 status = genirq_register(priv->genirq, irq, handler, arg); 522 void *h; 523 524 h = genirq_alloc_handler(handler, arg); 525 if ( h == NULL ) 526 return DRVMGR_FAIL; 527 528 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 529 530 status = genirq_register(priv->genirq, irq, h); 504 531 if (status == 0) { 505 532 /* Clear IRQ for first registered handler */ … … 509 536 510 537 if (status != 0) { 511 rtems_interrupt_enable(level); 538 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 539 genirq_free_handler(h); 512 540 return DRVMGR_FAIL; 513 541 } … … 520 548 status = 0; 521 549 522 rtems_interrupt_enable(level);550 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 523 551 524 552 return status; … … 532 560 { 533 561 struct gr_rasta_spw_router_priv *priv = dev->parent->dev->priv; 534 rtems_interrupt_level level;562 SPIN_IRQFLAGS(irqflags); 535 563 int status; 536 537 rtems_interrupt_disable(level); 564 void *handler; 565 566 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 538 567 539 568 status = genirq_disable(priv->genirq, irq, isr, arg); … … 543 572 } 544 573 545 status= genirq_unregister(priv->genirq, irq, isr, arg);546 if ( status != 0)574 handler = genirq_unregister(priv->genirq, irq, isr, arg); 575 if ( handler == NULL ) 547 576 status = DRVMGR_FAIL; 548 549 rtems_interrupt_enable(level); 577 else 578 status = DRVMGR_OK; 579 580 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 581 582 if (handler) 583 genirq_free_handler(handler); 550 584 551 585 return status; … … 557 591 { 558 592 struct gr_rasta_spw_router_priv *priv = dev->parent->dev->priv; 559 rtems_interrupt_level level;593 SPIN_IRQFLAGS(irqflags); 560 594 561 595 DBG("RASTA-SPW-ROUTER IRQ %d: unmask\n", irq); … … 564 598 return DRVMGR_EINVAL; 565 599 566 rtems_interrupt_disable(level);600 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 567 601 568 602 /* Enable IRQ for first enabled handler only */ 569 603 priv->irq->mask[0] |= (1<<irq); /* unmask interrupt source */ 570 604 571 rtems_interrupt_enable(level);605 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 572 606 573 607 return DRVMGR_OK; … … 579 613 { 580 614 struct gr_rasta_spw_router_priv *priv = dev->parent->dev->priv; 581 rtems_interrupt_level level;615 SPIN_IRQFLAGS(irqflags); 582 616 583 617 DBG("RASTA-SPW-ROUTER IRQ %d: mask\n", irq); … … 586 620 return DRVMGR_EINVAL; 587 621 588 rtems_interrupt_disable(level);622 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 589 623 590 624 /* Disable/mask IRQ */ 591 625 priv->irq->mask[0] &= ~(1<<irq); /* mask interrupt source */ 592 626 593 rtems_interrupt_enable(level);627 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 594 628 595 629 return DRVMGR_OK; -
c/src/lib/libbsp/sparc/shared/pci/gr_rasta_tmtc.c
r8670c464 rce76b9d2 24 24 #include <bsp.h> 25 25 #include <rtems/bspIo.h> 26 #include <rtems/score/isrlock.h> /* spin-lock */ 26 27 #include <pci.h> 27 28 … … 35 36 36 37 #include <bsp/gr_rasta_tmtc.h> 38 39 /* map via rtems_interrupt_lock_* API: */ 40 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 41 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 42 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 43 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 44 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 45 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 46 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 47 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 37 48 38 49 /* Determines which PCI address the AHB masters will access, it should be … … 105 116 struct gr_rasta_tmtc_priv { 106 117 /* Driver management */ 107 struct drvmgr_dev *dev;118 struct drvmgr_dev *dev; 108 119 char prefix[20]; 120 SPIN_DECLARE(devlock); 109 121 110 122 /* PCI */ … … 225 237 unsigned int status, tmp; 226 238 int irq; 239 SPIN_ISR_IRQFLAGS(irqflags); 240 227 241 tmp = status = priv->irq->ipend; 228 242 229 243 /* printk("GR-RASTA-TMTC: IRQ 0x%x\n",status); */ 230 244 245 SPIN_LOCK(&priv->devlock, irqflags); 231 246 for(irq=0; irq<32; irq++) { 232 247 if ( status & (1<<irq) ) { … … 238 253 } 239 254 } 255 SPIN_UNLOCK(&priv->devlock, irqflags); 240 256 241 257 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller still drives the IRQ. */ … … 602 618 if ((bar0_size == 0) || (bar1_size == 0)) 603 619 return DRVMGR_ENORES; 620 621 /* Initialize spin-lock for this PCI peripheral device. This is to 622 * protect the Interrupt Controller Registers. The genirq layer is 623 * protecting its own internals and ISR dispatching. 624 */ 625 SPIN_INIT(&priv->devlock, priv->prefix); 604 626 605 627 /* Let user override which PCI address the AHB masters of the … … 690 712 { 691 713 struct gr_rasta_tmtc_priv *priv = dev->parent->dev->priv; 692 rtems_interrupt_level level;714 SPIN_IRQFLAGS(irqflags); 693 715 int status; 694 695 rtems_interrupt_disable(level); 696 697 status = genirq_register(priv->genirq, irq, handler, arg); 716 void *h; 717 718 h = genirq_alloc_handler(handler, arg); 719 if ( h == NULL ) 720 return DRVMGR_FAIL; 721 722 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 723 724 status = genirq_register(priv->genirq, irq, h); 698 725 if ( status == 0 ) { 699 726 /* Disable and clear IRQ for first registered handler */ … … 703 730 704 731 if (status != 0) { 705 rtems_interrupt_enable(level); 732 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 733 genirq_free_handler(h); 706 734 return DRVMGR_FAIL; 707 735 } … … 714 742 status = 0; 715 743 716 rtems_interrupt_enable(level);744 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 717 745 718 746 return status; … … 726 754 { 727 755 struct gr_rasta_tmtc_priv *priv = dev->parent->dev->priv; 728 rtems_interrupt_level level;756 SPIN_IRQFLAGS(irqflags); 729 757 int status; 730 731 rtems_interrupt_disable(level); 758 void *handler; 759 760 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 732 761 733 762 status = genirq_disable(priv->genirq, irq, isr, arg); … … 738 767 status = 0; 739 768 740 status= genirq_unregister(priv->genirq, irq, isr, arg);741 if ( status != 0)769 handler = genirq_unregister(priv->genirq, irq, isr, arg); 770 if ( handler == NULL ) 742 771 status = DRVMGR_FAIL; 743 744 rtems_interrupt_enable(level); 772 else 773 status = DRVMGR_OK; 774 775 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 776 777 if (handler) 778 genirq_free_handler(handler); 745 779 746 780 return status; … … 752 786 { 753 787 struct gr_rasta_tmtc_priv *priv = dev->parent->dev->priv; 754 rtems_interrupt_level level;788 SPIN_IRQFLAGS(irqflags); 755 789 756 790 DBG("RASTA-TMTC IRQ %d: unmask\n", irq); … … 759 793 return DRVMGR_EINVAL; 760 794 761 rtems_interrupt_disable(level);795 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 762 796 763 797 /* Enable IRQ */ 764 798 priv->irq->mask[0] |= (1<<irq); /* unmask interrupt source */ 765 799 766 rtems_interrupt_enable(level);800 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 767 801 768 802 return DRVMGR_OK; … … 774 808 { 775 809 struct gr_rasta_tmtc_priv *priv = dev->parent->dev->priv; 776 rtems_interrupt_level level;810 SPIN_IRQFLAGS(irqflags); 777 811 778 812 DBG("RASTA-TMTC IRQ %d: mask\n", irq); … … 781 815 return DRVMGR_EINVAL; 782 816 783 rtems_interrupt_disable(level);817 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 784 818 785 819 /* Disable IRQ */ 786 820 priv->irq->mask[0] &= ~(1<<irq); /* mask interrupt source */ 787 821 788 rtems_interrupt_enable(level);822 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 789 823 790 824 return DRVMGR_OK; -
c/src/lib/libbsp/sparc/shared/pci/gr_tmtc_1553.c
r8670c464 rce76b9d2 24 24 #include <bsp.h> 25 25 #include <rtems/bspIo.h> 26 #include <rtems/score/isrlock.h> /* spin-lock */ 26 27 #include <pci.h> 27 28 #include <pci/access.h> … … 37 38 #include <bsp/gr_tmtc_1553.h> 38 39 40 /* map via rtems_interrupt_lock_* API: */ 41 #define SPIN_DECLARE(lock) RTEMS_INTERRUPT_LOCK_MEMBER(lock) 42 #define SPIN_INIT(lock, name) rtems_interrupt_lock_initialize(lock, name) 43 #define SPIN_LOCK(lock, level) rtems_interrupt_lock_acquire_isr(lock, &level) 44 #define SPIN_LOCK_IRQ(lock, level) rtems_interrupt_lock_acquire(lock, &level) 45 #define SPIN_UNLOCK(lock, level) rtems_interrupt_lock_release_isr(lock, &level) 46 #define SPIN_UNLOCK_IRQ(lock, level) rtems_interrupt_lock_release(lock, &level) 47 #define SPIN_IRQFLAGS(k) rtems_interrupt_lock_context k 48 #define SPIN_ISR_IRQFLAGS(k) SPIN_IRQFLAGS(k) 39 49 40 50 /*#define DEBUG 1 */ … … 61 71 struct gr_tmtc_1553_priv { 62 72 /* Driver management */ 63 struct drvmgr_dev *dev;73 struct drvmgr_dev *dev; 64 74 char prefix[32]; 75 SPIN_DECLARE(devlock); 65 76 66 77 /* PCI */ … … 175 186 unsigned int status, tmp; 176 187 int irq; 188 SPIN_ISR_IRQFLAGS(irqflags); 189 177 190 tmp = status = priv->irq->ipend; 178 191 179 192 /* DBG("GR-RASTA-IO: IRQ 0x%x\n",status); */ 180 193 194 SPIN_LOCK(&priv->devlock, irqflags); 181 195 for(irq=0; irq<16; irq++) { 182 196 if ( status & (1<<irq) ) { … … 188 202 } 189 203 } 204 SPIN_UNLOCK(&priv->devlock, irqflags); 190 205 191 206 /* ACK interrupt, this is because PCI is Level, so the IRQ Controller still drives the IRQ. */ … … 307 322 /* Generate Device prefix */ 308 323 309 strcpy(priv->prefix, "/dev/tmtc1553_0 /");310 priv->prefix[1 9] += dev->minor_drv;324 strcpy(priv->prefix, "/dev/tmtc1553_0"); 325 priv->prefix[14] += dev->minor_drv; 311 326 mkdir(priv->prefix, S_IRWXU | S_IRWXG | S_IRWXO); 312 priv->prefix[ 20] = '/';313 priv->prefix[ 21] = '\0';327 priv->prefix[15] = '/'; 328 priv->prefix[16] = '\0'; 314 329 315 330 priv->devinfo = devinfo = (struct pci_dev_info *)dev->businfo; … … 328 343 if (bar0_size == 0) 329 344 return DRVMGR_ENORES; 345 346 /* Initialize spin-lock for this PCI peripheral device. This is to 347 * protect the Interrupt Controller Registers. The genirq layer is 348 * protecting its own internals and ISR dispatching. 349 */ 350 SPIN_INIT(&priv->devlock, priv->prefix); 330 351 331 352 priv->genirq = genirq_init(16); … … 395 416 { 396 417 struct gr_tmtc_1553_priv *priv = dev->parent->dev->priv; 397 rtems_interrupt_level level;418 SPIN_IRQFLAGS(irqflags); 398 419 int status; 399 400 rtems_interrupt_disable(level); 401 402 status = genirq_register(priv->genirq, irq, handler, arg); 420 void *h; 421 422 h = genirq_alloc_handler(handler, arg); 423 if ( h == NULL ) 424 return DRVMGR_FAIL; 425 426 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 427 428 status = genirq_register(priv->genirq, irq, h); 403 429 if ( status == 0 ) { 404 430 /* Disable and clear IRQ for first registered handler */ … … 409 435 410 436 if (status != 0) { 411 rtems_interrupt_enable(level); 437 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 438 genirq_free_handler(h); 412 439 return DRVMGR_FAIL; 413 440 } … … 420 447 status = 0; 421 448 422 rtems_interrupt_enable(level);449 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 423 450 424 451 return status; … … 432 459 { 433 460 struct gr_tmtc_1553_priv *priv = dev->parent->dev->priv; 434 rtems_interrupt_level level;461 SPIN_IRQFLAGS(irqflags); 435 462 int status; 436 437 rtems_interrupt_disable(level); 463 void *handler; 464 465 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 438 466 439 467 status = genirq_disable(priv->genirq, irq, isr, arg); … … 444 472 status = 0; 445 473 446 status= genirq_unregister(priv->genirq, irq, isr, arg);447 if ( status != 0)474 handler = genirq_unregister(priv->genirq, irq, isr, arg); 475 if ( handler == NULL ) 448 476 status = DRVMGR_FAIL; 449 450 rtems_interrupt_enable(level); 477 else 478 status = DRVMGR_OK; 479 480 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 481 482 if (handler) 483 genirq_free_handler(handler); 451 484 452 485 return status; … … 458 491 { 459 492 struct gr_tmtc_1553_priv *priv = dev->parent->dev->priv; 460 rtems_interrupt_level level;493 SPIN_IRQFLAGS(irqflags); 461 494 462 495 DBG("TMTC-1553 IRQ %d: enable\n", irq); … … 465 498 return DRVMGR_FAIL; 466 499 467 rtems_interrupt_disable(level);500 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 468 501 469 502 /* Enable IRQ */ 470 503 priv->irq->mask[0] |= (1<<irq); /* unmask interrupt source */ 471 504 472 rtems_interrupt_enable(level);505 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 473 506 474 507 return DRVMGR_OK; … … 480 513 { 481 514 struct gr_tmtc_1553_priv *priv = dev->parent->dev->priv; 482 rtems_interrupt_level level;515 SPIN_IRQFLAGS(irqflags); 483 516 484 517 DBG("TMTC-1553 IRQ %d: disable\n", irq); … … 487 520 return DRVMGR_FAIL; 488 521 489 rtems_interrupt_disable(level);522 SPIN_LOCK_IRQ(&priv->devlock, irqflags); 490 523 491 524 /* Disable IRQ */ 492 525 priv->irq->mask[0] &= ~(1<<irq); /* mask interrupt source */ 493 526 494 rtems_interrupt_enable(level);527 SPIN_UNLOCK_IRQ(&priv->devlock, irqflags); 495 528 496 529 return DRVMGR_OK;
Note: See TracChangeset
for help on using the changeset viewer.