ipmux_interrupt.c
浏览该文件的文档。00001 00014 #include <linux/wait.h> 00015 #include <asm/bitops.h> 00016 #include <linux/sched.h> 00017 #include <linux/kernel.h> 00018 00019 00020 #include <ipmux_interrupt.h> 00021 #include <opl_hw_ops.h> 00025 /*--------------------------Macro definition------------------------- */ 00026 00027 00033 /*--------------------------type definition------------------------- */ 00034 00040 /*-----------------global varible/function declaration--------------- */ 00041 extern u32 g_opl_chip_irq_event; 00042 extern wait_queue_head_t g_opl_chip_waitq; 00043 00049 /*--------------local varible declaration and definition------------- */ 00050 /* why I reserve it? consistency.change from int to char. */ 00051 static char intr_status[8][32] = { 00052 /* bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 */ 00053 /*upt*/ {0, 0, 0, 0,-1,-1,-1,-1, 0, 0, 0, 0,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0}, 00054 /*misc*/{0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 00055 /*iwf*/ {0, 0, 0, 0, 0,-1, 0, 0,-1,-1,-1, 0,-1, 0,-1, 0,-1, 0, 0,-1, 0, 0, 0, 0,-1, 0, 0,-1, 0, 0,-1,-1}, 00056 /*brg*/ {0, 0, 0,-1, 0, 0, 0, 0,-1,-1, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0,-1, 0, 0, 0,-1,-1,-1, 0, 0, 0, 0,-1}, 00057 /*ppe*/ {0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 00058 /*uptm*/{0,-1, 0,-1,-1,-1,-1,-1,-1,-1, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 00059 /*dntm*/{0,-1, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, 00060 /*mc*/ {0, 0, 0, 0,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} 00061 }; 00062 00063 00064 00065 static void turn_on_level2_intr(u32 regID,char *bitmap); 00066 static void turn_off_level2_intr(u32 regID); 00067 static u32 get_mask(char *bitmap); 00068 00071 void impux_interrupt_handler(int irq,void *dev_id,struct pt_regs *regs); 00072 00073 00077 /*------------local function declaration and definition-------------- */ 00087 void ipmux_interrupt_handler(int irq,void *dev_id,struct pt_regs *regs) 00088 { 00089 if(test_and_set_bit(0,&g_opl_chip_irq_event)){ 00090 /* TBD: add some debug message.if it is set, some bugs exist. */ 00091 } 00092 wake_up_interruptible(&g_opl_chip_waitq); 00093 } 00094 00095 static u32 get_mask(char *bitmap) 00096 { 00097 int i = 0; 00098 u32 mask = 0; 00099 for (i = 0; i < 32; ++i) { 00100 if (bitmap[i] == -1) { 00101 mask |= (1<<i); 00102 } 00103 } 00104 return ~mask; 00105 } 00106 00115 static void turn_on_level2_intr(u32 regID, char *bitmap) 00116 { 00117 u32 mask = get_mask(bitmap); 00118 ipMuxRegWrite(regID,mask); 00119 } 00127 static void turn_off_level2_intr(u32 regID) 00128 { 00129 ipMuxRegWrite(regID,0); 00130 } 00139 int ipmux_hw0_irqinit(void) 00140 { 00141 /* request the ipmux_irq for ipmux switch,all of them share the same irq */ 00142 if(request_irq(OPL_IPMUX_IRQ,ipmux_interrupt_handler, 00143 0,"IPMUX interrupt",NULL) != 0){ 00144 return -1; 00145 } 00146 /* turn on irqs of ipmux:pos_upt,atb,iwf,bridge,ppe,uptom,dmtm and mc */ 00147 turn_on_level2_intr(REG_INT_EN_POS_UPT, intr_status[0]); 00148 turn_on_level2_intr(REG_INT_EN_ATB, intr_status[1]); 00149 turn_on_level2_intr(REG_INT_EN_IWF, intr_status[2]); 00150 turn_on_level2_intr(REG_INT_EN_BRG, intr_status[3]); 00151 turn_on_level2_intr(REG_INT_EN_PPE, intr_status[4]); 00152 turn_on_level2_intr(REG_INT_EN_UPTM, intr_status[5]); 00153 turn_on_level2_intr(REG_INT_EN_DNTM, intr_status[6]); 00154 turn_on_level2_intr(REG_INT_EN_MC, intr_status[7]); 00155 00156 return 0; 00157 } 00165 void ipmux_hw0_irqexit(void) 00166 { 00167 /* turn off the irqs of ipmux:pos,atb,iwf,bridge,ppe,uptm,dntm and mc */ 00168 turn_off_level2_intr(REG_INT_EN_POS_UPT); 00169 turn_off_level2_intr(REG_INT_EN_ATB); 00170 turn_off_level2_intr(REG_INT_EN_IWF); 00171 turn_off_level2_intr(REG_INT_EN_BRG); 00172 turn_off_level2_intr(REG_INT_EN_PPE); 00173 turn_off_level2_intr(REG_INT_EN_UPTM); 00174 turn_off_level2_intr(REG_INT_EN_DNTM); 00175 turn_off_level2_intr(REG_INT_EN_MC); 00176 00177 /*free the irq. */ 00178 free_irq(OPL_IPMUX_IRQ,NULL); 00179 } 00180
Generated at Mon Jul 30 16:43:48 2007 for IPMUX1IPMUX2IPMUX3 by 1.3.9.1