• Josh Wu's avatar
    mtd: atmel_nand: NFC: support multiple interrupt handling · e4e06934
    Josh Wu authored
    Fix the following error, which sometimes happens during the NFC data
    transfer:
    
      atmel_nand 80000000.nand: Time out to wait for interrupt: 0x00010000
      atmel_nand 80000000.nand: something wrong, No XFR_DONE interrupt comes.
    
    The root cause is that in the interrupt handler, we read the ISR but
    only handle one interrupt. If more than one interrupt arrive at the same
    time, then the second one will be lost.
    
    During the NFC data transfer. Two NFC interrupts (NFC_CMD_DONE and
    NFC_XFR_DONE) may come at the same time.
    
    NFC_CMD_DONE means NFC command is sent, and NFC_XFR_DONE means NFC data
    is transferred.
    
    This patch can handle multiple NFC interrupts at the same time. During
    the NFC data transfer, we need to wait for two NFC interrupts:
    NFC_CMD_DONE and NFC_XFR_DONE.
    
    Also we separate the completion initialization code to a
    nfc_prepare_interrupt(), which is paired with nfc_wait_interrupt().
    
    We call nfc_prepare_interrupt() before sending out nfc commands, to make
    sure no interrupt lost.
    Reported-by: default avatarMatthieu CRAPET <Matthieu.CRAPET@ingenico.com>
    Tested-by: default avatarMatthieu Crapet <Matthieu.Crapet@ingenico.com>
    Signed-off-by: default avatarJosh Wu <josh.wu@atmel.com>
    Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
    e4e06934
atmel_nand.c 59.8 KB