__s32 NAND_WaitRbReady(void) { __u32 rb; NAND_EnRbInt(); //wait_event(NAND_RB_WAIT, nandrb_ready_flag); dbg_rbint("rb wait, nfc_ctl: 0x%x, rb status: 0x%x, rb int en: 0x%x\n", NFC_READ_REG(NFC_REG_CTL), NFC_READ_REG(NFC_REG_ST), NFC_READ_REG(NFC_REG_INT)); if(nandrb_ready_flag) { dbg_rbint("fast rb int\n"); NAND_ClearRbInt(); return 0; } rb= ( NFC_READ_REG(NFC_REG_CTL) & NFC_RB_SEL ) >>3; if(!rb) { if(NFC_READ_REG(NFC_REG_ST) & NFC_RB_STATE0) { dbg_rbint_wrn("rb0 fast ready \n"); dbg_rbint_wrn("nfc_ctl: 0x%x, rb status: 0x%x, rb int en: 0x%x\n", NFC_READ_REG(NFC_REG_CTL), NFC_READ_REG(NFC_REG_ST), NFC_READ_REG(NFC_REG_INT)); NAND_ClearRbInt(); return 0; } } else { if(NFC_READ_REG(NFC_REG_ST) & NFC_RB_STATE1) { dbg_rbint_wrn("rb1 fast ready \n"); dbg_rbint_wrn("nfc_ctl: 0x%x, rb status: 0x%x, rb int en: 0x%x\n", NFC_READ_REG(NFC_REG_CTL), NFC_READ_REG(NFC_REG_ST), NFC_READ_REG(NFC_REG_INT)); NAND_ClearRbInt(); return 0; } } if(wait_event_timeout(NAND_RB_WAIT, nandrb_ready_flag, 1*HZ)==0) { dbg_rbint_wrn("nand wait rb ready time out\n"); dbg_rbint_wrn("rb wait time out, nfc_ctl: 0x%x, rb status: 0x%x, rb int en: 0x%x\n", NFC_READ_REG(NFC_REG_CTL), NFC_READ_REG(NFC_REG_ST), NFC_READ_REG(NFC_REG_INT)); NAND_ClearRbInt(); } else { dbg_rbint("nand wait rb ready ok\n"); } return 0; }
void NAND_Interrupt(__u32 nand_index) { if(nand_index >1) printk("NAND_Interrupt, nand_index error: 0x%x\n", nand_index); #ifdef __LINUX_NAND_SUPPORT_INT__ //printk("nand interrupt!\n"); #ifdef __LINUX_SUPPORT_RB_INT__ #if 0 if(NFC_RbIntOccur()) { dbg_rbint("nand rb int\n"); NAND_RbInterrupt(); } #else if(nand_index == 0) { if((__NAND_REG(NAND_CH0_INT_EN_REG)&NAND_RB_INT_BITMAP)&&(__NAND_REG(NAND_CH0_INT_ST_REG)&NAND_RB_INT_BITMAP)) NAND_RbInterrupt(); } else if(nand_index == 1) { if((__NAND_REG(NAND_CH1_INT_EN_REG)&NAND_RB_INT_BITMAP)&&(__NAND_REG(NAND_CH1_INT_ST_REG)&NAND_RB_INT_BITMAP)) NAND_RbInterrupt(); } #endif #endif #ifdef __LINUX_SUPPORT_DMA_INT__ #if 0 if(NFC_DmaIntOccur()) { dbg_dmaint("nand dma int\n"); NAND_DMAInterrupt(); } #else if(nand_index == 0) { if((__NAND_REG(NAND_CH0_INT_EN_REG)&NAND_DMA_INT_BITMAP)&&(__NAND_REG(NAND_CH0_INT_ST_REG)&NAND_DMA_INT_BITMAP)) NAND_DMAInterrupt(); } else if(nand_index == 1) { if((__NAND_REG(NAND_CH1_INT_EN_REG)&NAND_DMA_INT_BITMAP)&&(__NAND_REG(NAND_CH1_INT_ST_REG)&NAND_DMA_INT_BITMAP)) NAND_DMAInterrupt(); } #endif #endif #endif }
void NAND_RbInterrupt(void) { dbg_rbint("rb int occor! \n"); if(!(NFC_READ_REG(NFC_REG_ST)&NFC_RB_B2R)) { dbg_rbint_wrn("nand rb int late, rb status: 0x%x, rb int en: 0x%x \n",NFC_READ_REG(NFC_REG_ST),NFC_READ_REG(NFC_REG_INT)); } NAND_ClearRbInt(); nandrb_ready_flag = 1; wake_up( &NAND_RB_WAIT ); }
void NAND_EnRbInt(void) { //clear interrupt NFC_WRITE_REG(NFC_REG_ST,NFC_RB_B2R); if(NFC_READ_REG(NFC_REG_ST)&NFC_RB_B2R) { dbg_rbint_wrn("nand clear rb int status error in int enable \n"); dbg_rbint_wrn("rb status: 0x%x\n", NFC_READ_REG(NFC_REG_ST)); } nandrb_ready_flag = 0; //enable interrupt NFC_WRITE_REG(NFC_REG_INT, NFC_B2R_INT_ENABLE); dbg_rbint("rb int en\n"); }
void NAND_EnRbInt(void) { __u32 nand_index; nand_index = NAND_GetCurrentCH(); if(nand_index >1) printk("NAND_ClearDMAInt, nand_index error: 0x%x\n", nand_index); //clear interrupt NFC_RbIntClearStatus(); nandrb_ready_flag[nand_index] = 0; //enable interrupt NFC_RbIntEnable(); dbg_rbint("rb int en\n"); }
void NAND_ClearRbInt(void) { //disable interrupt NFC_WRITE_REG(NFC_REG_INT, 0); dbg_rbint("rb int clear\n"); //clear interrupt NFC_WRITE_REG(NFC_REG_ST,NFC_READ_REG(NFC_REG_ST)); if(NFC_READ_REG(NFC_REG_ST)&NFC_RB_B2R) { dbg_rbint_wrn("nand clear rb int status error in int clear \n"); dbg_rbint_wrn("rb status: 0x%x\n", NFC_READ_REG(NFC_REG_ST)); } nandrb_ready_flag = 0; }
void NAND_RbInterrupt(void) { __u32 nand_index; nand_index = NAND_GetCurrentCH(); if(nand_index >1) printk("NAND_ClearDMAInt, nand_index error: 0x%x\n", nand_index); dbg_rbint("rb int occor! \n"); if(!NFC_RbIntGetStatus()) { dbg_rbint_wrn("nand rb int late \n"); } NAND_ClearRbInt(); nandrb_ready_flag[nand_index] = 1; if(nand_index == 0) wake_up( &NAND_RB_WAIT_CH0 ); else if(nand_index ==1) wake_up( &NAND_RB_WAIT_CH1 ); }
void NAND_ClearRbInt(void) { __u32 nand_index; nand_index = NAND_GetCurrentCH(); if(nand_index >1) printk("NAND_ClearDMAInt, nand_index error: 0x%x\n", nand_index); //disable interrupt NFC_RbIntDisable();; dbg_rbint("rb int clear\n"); //clear interrupt NFC_RbIntClearStatus(); //check rb int status if(NFC_RbIntGetStatus()) { dbg_rbint_wrn("nand %d clear rb int status error in int clear \n", nand_index); } nandrb_ready_flag[nand_index] = 0; }
void NAND_EnDMAInt(void) { __u32 nand_index; nand_index = NAND_GetCurrentCH(); if(nand_index >1) printk("NAND_ClearDMAInt, nand_index error: 0x%x\n", nand_index); //clear interrupt #if 0 NFC_DmaIntClearStatus(); if(NFC_DmaIntGetStatus()) { dbg_rbint_wrn("nand clear dma int status error in int enable \n"); dbg_rbint_wrn("dma status: 0x%x\n", NFC_DmaIntGetStatus()); } #endif nanddma_ready_flag[nand_index] = 0; //enable interrupt NFC_DmaIntEnable(); dbg_rbint("dma int en\n"); }
__s32 NAND_WaitRbReady(void) { __u32 rb; __u32 nand_index; dbg_rbint("NAND_WaitRbReady... \n"); nand_index = NAND_GetCurrentCH(); if(nand_index >1) printk("NAND_ClearDMAInt, nand_index error: 0x%x\n", nand_index); NAND_EnRbInt(); //wait_event(NAND_RB_WAIT, nandrb_ready_flag); dbg_rbint("rb wait \n"); if(nandrb_ready_flag[nand_index]) { dbg_rbint("fast rb int\n"); NAND_ClearRbInt(); return 0; } rb= NFC_GetRbSelect(); if(NFC_GetRbStatus(rb)) { dbg_rbint("rb %u fast ready \n", rb); NAND_ClearRbInt(); return 0; } //printk("NAND_WaitRbReady, ch %d\n", nand_index); if(nand_index == 0) { if(wait_event_timeout(NAND_RB_WAIT_CH0, nandrb_ready_flag[nand_index], 1*HZ)==0) { dbg_rbint_wrn("nand wait rb int time out, ch: %d\n", nand_index); NAND_ClearRbInt(); } else { NAND_ClearRbInt(); dbg_rbint("nand wait rb ready ok\n"); } } else if(nand_index ==1) { if(wait_event_timeout(NAND_RB_WAIT_CH1, nandrb_ready_flag[nand_index], 1*HZ)==0) { dbg_rbint_wrn("nand wait rb int time out, ch: %d\n", nand_index); NAND_ClearRbInt(); } else { NAND_ClearRbInt(); dbg_rbint("nand wait rb ready ok\n"); } } else { NAND_ClearRbInt(); } return 0; }