rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1);
rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2);
rk29_mux_api_set(GPIO1D5_SDMMC0DATA3_NAME, GPIO1H_SDMMC0_DATA3);
- rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);
+ rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_GPIO2A2);
rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5); ///GPIO5H_SDMMC0_PWR_EN); ///GPIO5H_GPIO5D5);
gpio_request(RK29_PIN5_PD5,"sdmmc");
gpio_set_value(RK29_PIN5_PD5,GPIO_HIGH);
#else
.use_dma = 0,
#endif
+ .detect_irq = RK29_PIN2_PA2, // INVALID_GPIO
+ .enable_sd_wakeup = 0,
};
#endif
#ifdef CONFIG_SDMMC1_RK29
rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1);
rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2);
rk29_mux_api_set(GPIO1D5_SDMMC0DATA3_NAME, GPIO1H_SDMMC0_DATA3);
- rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);
+ rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_GPIO2A2);
rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5); ///GPIO5H_SDMMC0_PWR_EN); ///GPIO5H_GPIO5D5);
gpio_request(RK29_PIN5_PD5,"sdmmc");
#if 0
cmd->error = -EINPROGRESS;
cmdr = cmd->opcode;
- if(cmdr == 12 || cmdr == 0)
+ if(cmdr == 12)
cmdr |= SDMMC_CMD_STOP;
else if(cmdr == 13)
cmdr &= ~SDMMC_CMD_PRV_DAT_WAIT;
host->is_init = 0;
cmdflags |= SDMMC_CMD_INIT;
}
+ if(cmd->opcode == 0 &&
+ ((rk29_sdmmc_read(host, SDMMC_STATUS) & SDMMC_STAUTS_MC_BUSY)||
+ (rk29_sdmmc_read(host, SDMMC_STATUS) & SDMMC_STAUTS_DATA_BUSY)))
+ cmdflags |= SDMMC_CMD_STOP;
if (mrq->data) {
rk29_sdmmc_set_mrq_status(host, MRQ_HAS_DATA);
ret = rk29_sdmmc_submit_data(host, mrq->data);
INIT_WORK(&host->work, rk29_sdmmc_detect_change_work);
ret = gpio_request(host->gpio_det, "sd_detect");
if(ret < 0) {
- dev_err(&pdev->dev, "mmc_alloc_host error\n");
+ dev_err(&pdev->dev, "gpio_request error\n");
goto err_mmc_remove_host;
}
gpio_direction_input(host->gpio_det);
host->gpio_irq = gpio_to_irq(host->gpio_det);
- enable_irq_wake(host->gpio_irq);
ret = request_irq(host->gpio_irq,
rk29_sdmmc_detect_change_isr,
struct rk29_sdmmc *host = platform_get_drvdata(pdev);
dev_info(host->dev, "Enter rk29_sdmmc_suspend\n");
- if(host->mmc && !host->is_sdio)
+ if(host->mmc && !host->is_sdio){
ret = mmc_suspend_host(host->mmc, state);
+ if(host->enable_sd_warkup)
+ free_irq(host->gpio_irq, host);
+ }
rk29_sdmmc_write(host->regs, SDMMC_CLKENA, 0);
clk_disable(host->clk);
#endif
dev_info(host->dev, "Exit rk29_sdmmc_suspend\n");
clk_enable(host->clk);
rk29_sdmmc_write(host->regs, SDMMC_CLKENA, 1);
- if(host->mmc && !host->is_sdio)
+ if(host->mmc && !host->is_sdio){
+ if(host->enable_sd_warkup)
+ ret = request_irq(host->gpio_irq,
+ rk29_sdmmc_detect_change_isr,
+ rk29_sdmmc_get_cd(host->mmc)?IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING,
+ "sd_detect",
+ host);
+ if(ret < 0)
+ dev_err(host->dev, "gpio request_irq error\n");
ret = mmc_resume_host(host->mmc);
+ }
#endif
return ret;
}