host->is_init = 0;
cmdflags |= SDMMC_CMD_INIT;
}
- if(cmd->opcode == 0 &&
+ if(cmd->opcode == 0/* &&
((rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_MC_BUSY)||
- (rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY)))
+ (rk29_sdmmc_read(host->regs, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY))*/)
cmdflags |= SDMMC_CMD_STOP;
if (mrq->data) {
rk29_sdmmc_set_mrq_status(host, MRQ_HAS_DATA);
mrq->cmd->error = -EINPROGRESS;
dev_info(host->dev, "rk29_sdmmc_set_clock timeout\n");
rk29_sdmmc_request_done(host, mrq);
+ rk29_sdmmc_reset_ctrl(host);
+ rk29_sdmmc_show_info(host);
return;
}
dev_info(host->dev, "rk29_sdmmc_start_request timeout\n");
mrq->cmd->error = -EINPROGRESS;
rk29_sdmmc_request_done(host, mrq);
+ rk29_sdmmc_reset_ctrl(host);
+ rk29_sdmmc_show_info(host);
}
return;
}
EVENT_CMD_COMPLETE))
break;
rk29_sdmmc_set_completed(host, EVENT_CMD_COMPLETE);
-
- rk29_sdmmc_command_complete(host, host->mrq->cmd);
- if(!host->mrq)
+ if(!host->mrq){
+ dev_info(host->dev, "sending cmd, host->mrq = NULL\n");
rk29_sdmmc_show_info(host);
- if (!host->mrq->data || (host->mrq->cmd->error)) {
- rk29_sdmmc_request_end(host);
- goto unlock;
- }
+ }else{
+ rk29_sdmmc_command_complete(host, host->mrq->cmd);
+ if (!host->mrq->data || (host->mrq->cmd->error)) {
+ rk29_sdmmc_request_end(host);
+ goto unlock;
+ }
prev_state = state = STATE_SENDING_DATA;
-
+ }
case STATE_SENDING_DATA:
if (rk29_sdmmc_test_and_clear_pending(host,
EVENT_DATA_ERROR)) {
- if(!host->mrq)
- rk29_sdmmc_show_info(host);
+ if(!host->mrq){
+ dev_info(host->dev, "sending data, host->mrq = NULL\n");
+ rk29_sdmmc_show_info(host);
+ }
rk29_sdmmc_stop_dma(host);
if (host->mrq->data->stop)
send_stop_cmd(host);
static void rk29_sdmmc_detect_change(struct rk29_sdmmc *host)
{
spin_lock(&host->lock);
-
+ rk29_sdmmc_write(host->regs, SDMMC_RINTSTS, ~SDMMC_INT_SDIO);
+ rk29_sdmmc_write(host->regs, SDMMC_INTMASK,
+ rk29_sdmmc_read(host->regs, SDMMC_INTMASK) &
+ ~(SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS));
if (host->mrq) {
switch (host->state) {
case STATE_IDLE:
rk29_sdmmc_write(host->regs, SDMMC_INTMASK,SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS);
rk29_sdmmc_write(host->regs, SDMMC_CTRL,SDMMC_CTRL_INT_ENABLE);
rk29_sdmmc_write(host->regs, SDMMC_CLKENA,1);
-
+
dev_info(host->dev, "RK29 SDMMC controller at irq %d\n", host->irq);
return 0;
free_irq(host->gpio_irq, host);