+ VICIntEnClear=(1<<src_number);
+ VICIntSelect&=~(1<<src_number);
+
+ addr=&VICVectAddr0;
+ cntl=&VICVectCntl0;
+
+ for(cnt=0;cnt<INTERRUPT_MAX_VIC;cnt++) {
+ if(cntl[cnt]&0x1f==src_number) {
+ *((volatile u32 *)(addr+cnt))=0;
+ *((volatile u32 *)(cntl+cnt))=0;
+ }
+ }
+}
+
+void interrupt_soft_enable(u8 src_number) {
+
+ VICSoftInt=(1<<src_number);
+}
+
+int interrupt_enable(u8 src_number,u8 mode,u8 priority,u32 callback_addr) {
+
+ u32 *addr;
+ u32 *cntl;
+
+ addr=&VICVectAddr0;
+ cntl=&VICVectCntl0;
+
+ /* check whether this ir source is allready assigned */
+ if(VICIntEnable&(1<<src_number))
+ return INTERRUPT_USED;
+
+ /* force interrupt */
+ VICIntEnable=(1<<src_number);
+
+ switch(mode) {
+ case INTERRUPT_FIQ:
+ VICIntSelect|=(1<<src_number);
+ break;
+ case INTERRUPT_VIRQ:
+ if(addr[p]&0x3f)
+ return INTERRUP_PRIORITY_USED;
+ *((volatile u32 *)(addr+p))=callback_addr;
+ *((volatile u32 *)(cntl+p))=src_number&0x1f+(1<<5);
+ case INTERRUPT_IRQ:
+ case default:
+ }
+
+ return INTERRUPT_SET;
+}