static irqreturn_t s3cmci_irq(int irq, void *dev_id)
{
struct s3cmci_host *host = dev_id;
struct mmc_command *cmd;
//SDI命令状态寄存器,数据状态寄存器,FIFO状态寄存器,数据持续计数器寄存器,中断屏蔽寄存器。
u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt, mci_imsk;
u32 mci_cclear = 0, mci_dclear;
unsigned long iflags;
//获取数据状态寄存器和中断屏蔽寄存器的值
mci_dsta = readl(host->base + S3C2410_SDIDSTA);
mci_imsk = readl(host->base + host->sdiimsk);
if (mci_dsta & S3C2410_SDIDSTA_SDIOIRQDETECT) {//如果发生了中断继续下一步
if (mci_imsk & S3C2410_SDIIMSK_SDIOIRQ) {//IntDet 中断使能。
mci_dclear = S3C2410_SDIDSTA_SDIOIRQDETECT;//清除中断发现的值
writel(mci_dclear, host->base + S3C2410_SDIDSTA);
mmc_signal_sdio_irq(host->mmc);//发现了SD后的相关程序
return IRQ_HANDLED;
}
}
spin_lock_irqsave(&host->complete_lock, iflags);//获取锁和中断状态
mci_csta = readl(host->base + S3C2410_SDICMDSTAT);//获取命令状态状态寄存器
mci_dcnt = readl(host->base + S3C2410_SDIDCNT);//获取数据持续计数寄存器
mci_fsta = readl(host->base + S3C2410_SDIFSTA);//获取FIFO状态寄存器
mci_dclear = 0;
if ((host->complete_what == COMPLETION_NONE) ||
(host->complete_what == COMPLETION_FINALIZE)) {
host->status = "nothing to complete";//如果host->complete_what的值等于COMPLETION_NON