[BACK]Return to tairqc.c CVS log [TXT][DIR] Up to [local] / funnyos / arch / testarm / dev

Diff for /funnyos/arch/testarm/dev/tairqc.c between version 1.3 and 1.6

version 1.3, 2007/11/02 12:35:24 version 1.6, 2007/11/04 23:15:57
Line 6 
Line 6 
 #include <sys/bus.h>  #include <sys/bus.h>
 #include <sys/kern_irq.h>  #include <sys/kern_irq.h>
   
   #include <dev/cpuvar.h>
   
 #include <arch/testarm/dev/tairqcvar.h>  #include <arch/testarm/dev/tairqcvar.h>
 #include <arch/testarm/dev/tairqcreg.h>  #include <arch/testarm/dev/tairqcreg.h>
 #include <libkern/printf.h>  #include <libkern/printf.h>
   
   #define TAIRQC_DEBUG
   
   #ifdef TAIRQC_DEBUG
   #define DPRINTF(x...)   do { printf(x); } while (0)
   #else
   #define DPRINTF(x...)   { }
   #endif
   
 /*  /*
  * testarm Interrupt Controller Unit support.   * testarm Interrupt Controller Unit support.
  */   */
Line 34 
Line 44 
 tairqc_attach(struct device *self, uint32_t loc, uint8_t flags)  tairqc_attach(struct device *self, uint32_t loc, uint8_t flags)
 {  {
         struct tairqc_dd *ddp = self->dv_devdata;          struct tairqc_dd *ddp = self->dv_devdata;
           uint8_t intrno;
   
         /* leap to parent's bus_handle */          /* leap to parent's bus_handle */
         ddp->td_bushandlep = self->dv_parent->dv_aux;          ddp->td_bushandlep = self->dv_parent->dv_aux;
Line 48 
Line 59 
         /* override trampoline so core irq jumps to us */          /* override trampoline so core irq jumps to us */
         irq_trampoline_func = tairqc_irq;          irq_trampoline_func = tairqc_irq;
   
           /* mask all interrupts */
           for (intrno = 0; intrno < 32; intrno++)
                   tairqc_mask_intr(intrno);
   
         /* XXX unmask rtc intr */          /* XXX unmask rtc intr */
         tairqc_unmask_intr(4);          tairqc_unmask_intr(4);
   
           __cpu_enable_irq();
   
           return(0);
 }  }
   
   
Line 57 
Line 76 
 tairqc_mask_intr(uint8_t intrno)  tairqc_mask_intr(uint8_t intrno)
 {  {
         bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQMASK, intrno);          bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQMASK, intrno);
           DPRINTF("tairqc_mask_intr: masked interrupt no. %d (status=0x%x)\n", intrno, tairqc_intrstatus());
 }  }
   
   
Line 64 
Line 84 
 tairqc_unmask_intr(uint8_t intrno)  tairqc_unmask_intr(uint8_t intrno)
 {  {
         bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQUNMASK, intrno);          bus_write_1(irqcdd->td_bushandlep, irqcdd->td_ioaddr + TAIRQC_OFF_IRQUNMASK, intrno);
           DPRINTF("tairqc_unmask_intr: unmasked interrupt no. %d (status=0x%x)\n", intrno, tairqc_intrstatus());
 }  }
   
   
Line 79 
Line 100 
 {  {
         /*          /*
          * Process an IRQ.           * Process an IRQ.
            * Check interrupt status of the irqc and execute corresponding intr handlers
            * for every asserted interrupt source (could be 0...31 on tairqc)
          */           */
          uint32_t irqstatus;          uint32_t irqstatus;
           uint8_t intrno;
   
         /* read intr status; one bit per intr source */          /* read intr status; one bit per intr source */
         irqstatus = tairqc_intrstatus();          irqstatus = tairqc_intrstatus();
   
         printf("irqc: irq status 0x%x\n", irqstatus);          DPRINTF("tairqc_irq: got interrupt (status=0x%x)\n", irqstatus);
   
           /* exit if no interrupts; should not happen */
           if (irqstatus == 0)
                   return;
   
           /* let kern_irq throw us to the right place */
           for (intrno = 0; intrno < 32; intrno++)
                   if (irqstatus & (1 << intrno)) {
                           /* interrupt line is active */
                           intr_execute(intrno);
                   }
   
 }  }
   

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.6

CVSweb