Date:2010-06-27 23:45:23 (13 years 9 months ago)
Author:Lars C.
Commit:d55f3fec4fd699ad89780402d80fb87095c79a1e
Message:mmc: jz4740: Rework irq handler

Files: drivers/mmc/host/jz4740_mmc.c (4 diffs)

Change Details

drivers/mmc/host/jz4740_mmc.c
185185    req = host->req;
186186    host->req = NULL;
187187
188    if (!unlikely(req))
189        return;
190
191188    mmc_request_done(host->mmc, req);
192189}
193190
...... 
371368    if (!test_and_clear_bit(0, &host->waiting))
372369        return;
373370
371    jz4740_mmc_set_irq_enabled(host, JZ_MMC_IRQ_END_CMD_RES, false);
372
374373    host->req->cmd->error = -ETIMEDOUT;
375374    jz4740_mmc_request_done(host);
376375}
...... 
493492    irq_reg &= ~host->irq_mask;
494493
495494    tmp &= ~(JZ_MMC_IRQ_TXFIFO_WR_REQ | JZ_MMC_IRQ_RXFIFO_RD_REQ |
496            JZ_MMC_IRQ_PRG_DONE | JZ_MMC_IRQ_DATA_TRAN_DONE);
495            JZ_MMC_IRQ_PRG_DONE | JZ_MMC_IRQ_DATA_TRAN_DONE);
497496
498497    if (tmp != irq_reg)
499498        writew(tmp & ~irq_reg, host->base + JZ_REG_MMC_IREG);
...... 
506505    if (!host->req || !host->cmd)
507506        goto handled;
508507
509    if (!test_and_clear_bit(0, &host->waiting))
508    if (!(irq_reg & JZ_MMC_IRQ_END_CMD_RES))
510509        goto handled;
511510
512    del_timer(&host->timeout_timer);
513
514    status = readl(host->base + JZ_REG_MMC_STATUS);
515
516    if (status & JZ_MMC_STATUS_TIMEOUT_RES) {
517        host->cmd->error = -ETIMEDOUT;
518    } else if (status & JZ_MMC_STATUS_CRC_RES_ERR) {
519        host->cmd->error = -EIO;
520    } else if (status & (JZ_MMC_STATUS_CRC_READ_ERROR |
521            JZ_MMC_STATUS_CRC_WRITE_ERROR)) {
522        host->cmd->data->error = -EIO;
523    } else if (status & (JZ_MMC_STATUS_CRC_READ_ERROR |
524            JZ_MMC_STATUS_CRC_WRITE_ERROR)) {
525        host->cmd->data->error = -EIO;
526    }
511    if (test_and_clear_bit(0, &host->waiting)) {
512        del_timer(&host->timeout_timer);
513
514        status = readl(host->base + JZ_REG_MMC_STATUS);
515
516        if (status & JZ_MMC_STATUS_TIMEOUT_RES) {
517            host->cmd->error = -ETIMEDOUT;
518        } else if (status & JZ_MMC_STATUS_CRC_RES_ERR) {
519            host->cmd->error = -EIO;
520        } else if (status & (JZ_MMC_STATUS_CRC_READ_ERROR |
521                JZ_MMC_STATUS_CRC_WRITE_ERROR)) {
522            host->cmd->data->error = -EIO;
523        } else if (status & (JZ_MMC_STATUS_CRC_READ_ERROR |
524                JZ_MMC_STATUS_CRC_WRITE_ERROR)) {
525            host->cmd->data->error = -EIO;
526        }
527527
528    if (irq_reg & JZ_MMC_IRQ_END_CMD_RES) {
529        jz4740_mmc_set_irq_enabled(host, JZ_MMC_IRQ_END_CMD_RES, false);
530        writew(JZ_MMC_IRQ_END_CMD_RES, host->base + JZ_REG_MMC_IREG);
531528        ret = IRQ_WAKE_THREAD;
532529    }
533530
534    return ret;
531    jz4740_mmc_set_irq_enabled(host, JZ_MMC_IRQ_END_CMD_RES, false);
532    writew(JZ_MMC_IRQ_END_CMD_RES, host->base + JZ_REG_MMC_IREG);
535533
536534handled:
537    writew(0xff, host->base + JZ_REG_MMC_IREG);
538    return IRQ_HANDLED;
535    return ret;
539536}
540537
541538static int jz4740_mmc_set_clock_rate(struct jz4740_mmc_host *host, int rate)

Archive Download the corresponding diff file



interactive