__u32 NAND_DMASingleUnmap(__u32 rw, __u32 buff_addr, __u32 len) { __u32 mem_addr = buff_addr; __u32 nand_index = NAND_GetCurrentCH(); if(tmp_dma_phy_addr[nand_index]!=mem_addr) { printk("NAND_DMASingleUnmap, dma addr not match! nand_index: 0x%x, tmp_dma_phy_addr:0x%x, mem_addr: 0x%x\n", nand_index,tmp_dma_phy_addr[nand_index], mem_addr); mem_addr = tmp_dma_phy_addr[nand_index]; } if(tmp_dma_len[nand_index] != len) { printk("NAND_DMASingleUnmap, dma len not match! nand_index: 0x%x, tmp_dma_len:0x%x, len: 0x%x\n", nand_index,tmp_dma_len[nand_index], len); len = tmp_dma_len[nand_index]; } if (rw == 1) { dma_unmap_single(NULL, (dma_addr_t)mem_addr, len, DMA_TO_DEVICE); } else { dma_unmap_single(NULL, (dma_addr_t)mem_addr, len, DMA_FROM_DEVICE); } return mem_addr; }
void nand_dma_callback(void *arg) { __u32 nand_index; nand_index = NAND_GetCurrentCH(); NAND_ClearDMAInt(); nanddma_ready_flag[0] = 1; wake_up( &NAND_DMA_WAIT_CH0 ); // printk("dma transfer finish\n"); return; }
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"); }
__u32 NAND_DMASingleMap(__u32 rw, __u32 buff_addr, __u32 len) { __u32 mem_addr; __u32 nand_index = NAND_GetCurrentCH(); if (rw == 1) { mem_addr = (__u32)dma_map_single(NULL, (void *)buff_addr, len, DMA_TO_DEVICE); } else { mem_addr = (__u32)dma_map_single(NULL, (void *)buff_addr, len, DMA_FROM_DEVICE); } tmp_dma_phy_addr[nand_index] = mem_addr; tmp_dma_len[nand_index] = len; return mem_addr; }
static irqreturn_t nand_interrupt_ch1(int irq, void *dev_id) { unsigned long iflags; __u32 nand_index; //printk("nand_interrupt_ch1!\n"); spin_lock_irqsave(&nand_int_test_lock, iflags); nand_index = NAND_GetCurrentCH(); if(nand_index!=1) { //printk(" ch %d int in ch1\n", nand_index); } else { NAND_Interrupt(nand_index); } spin_unlock_irqrestore(&nand_int_test_lock, iflags); return IRQ_HANDLED; }
void NAND_DMAInterrupt(void) { __u32 nand_index; nand_index = NAND_GetCurrentCH(); if(nand_index >1) printk("NAND_ClearDMAInt, nand_index error: 0x%x\n", nand_index); dbg_dmaint("ch %d dma int occor! \n", nand_index); if(!NFC_DmaIntGetStatus()) { dbg_dmaint_wrn("nand dma int late \n"); } NAND_ClearDMAInt(); nanddma_ready_flag[nand_index] = 1; if(nand_index == 0) wake_up( &NAND_DMA_WAIT_CH0 ); else if(nand_index == 1) wake_up( &NAND_DMA_WAIT_CH1 ); }
void NAND_ClearDMAInt(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_DmaIntDisable(); dbg_dmaint("ch %d dma int clear\n", nand_index); //clear interrupt //NFC_DmaIntClearStatus(); //if(NFC_DmaIntGetStatus()) //{ // dbg_dmaint_wrn("nand clear dma int status error in int clear \n"); // dbg_dmaint_wrn("dma status: 0x%x\n", NFC_DmaIntGetStatus()); //} nanddma_ready_flag[nand_index] = 0; }
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; }
__s32 NAND_WaitDmaFinish(void) { __u32 nand_index; nand_index = NAND_GetCurrentCH(); if(nand_index >1) printk("NAND_ClearDMAInt, nand_index error: 0x%x\n", nand_index); NAND_EnDMAInt(); //wait_event(NAND_RB_WAIT, nandrb_ready_flag); dbg_dmaint("ch %d dma wait\n", nand_index); if(nanddma_ready_flag[nand_index]) { dbg_dmaint("ch %d fast dma int\n", nand_index); NAND_ClearDMAInt(); return 0; } if(NFC_DmaIntGetStatus()) { dbg_dmaint("ch %d dma fast ready \n", nand_index); NAND_ClearDMAInt(); return 0; } if(nand_index == 0) { if(wait_event_timeout(NAND_DMA_WAIT_CH0, nanddma_ready_flag[nand_index], 1*HZ)==0) { dbg_dmaint_wrn("+nand wait dma int time out, ch: 0x%d, dma_status: %x, dma_ready_flag: 0x%x\n", nand_index, NFC_DmaIntGetStatus(),nanddma_ready_flag[nand_index]); while(!NFC_DmaIntGetStatus()); dbg_dmaint_wrn("-nand wait dma int time out, ch: 0x%d, dma_status: %x, dma_ready_flag: 0x%x\n", nand_index, NFC_DmaIntGetStatus(),nanddma_ready_flag[nand_index]); NAND_ClearDMAInt(); } else { dbg_dmaint("nand wait dma ready ok\n"); NAND_ClearDMAInt(); } } else if(nand_index ==1) { if(wait_event_timeout(NAND_DMA_WAIT_CH1, nanddma_ready_flag[nand_index], 1*HZ)==0) { dbg_dmaint_wrn("+nand wait dma int time out, ch: 0x%d, dma_status: %x, dma_ready_flag: 0x%x\n", nand_index, NFC_DmaIntGetStatus(),nanddma_ready_flag[nand_index]); while(!NFC_DmaIntGetStatus()); dbg_dmaint_wrn("-nand wait dma int time out, ch: 0x%d, dma_status: %x, dma_ready_flag: 0x%x\n", nand_index, NFC_DmaIntGetStatus(),nanddma_ready_flag[nand_index]); NAND_ClearDMAInt(); } else { dbg_dmaint("nand wait dma ready ok\n"); NAND_ClearDMAInt(); } } else { NAND_ClearDMAInt(); printk("NAND_WaitDmaFinish, error nand_index: 0x%x\n", nand_index); } return 0; }