IPMUX1IPMUX2IPMUX3: ipmux_interrupt.c源文件

RTL96xx (RTL9607,...)

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  doxygen 1.3.9.1