update sdmmc driver and board-rk29-sdk/phonesdk.c

This commit is contained in:
kfx
2011-04-18 11:34:53 +08:00
parent 58470bcf21
commit c49299a834
3 changed files with 24 additions and 7 deletions

View File

@@ -2200,7 +2200,7 @@ static int rk29_sdmmc0_cfg_gpio(void)
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);
@@ -2222,6 +2222,8 @@ struct rk29_sdmmc_platform_data default_sdmmc0_data = {
#else
.use_dma = 0,
#endif
.detect_irq = RK29_PIN2_PA2, // INVALID_GPIO
.enable_sd_wakeup = 0,
};
#endif
#ifdef CONFIG_SDMMC1_RK29

View File

@@ -1184,7 +1184,7 @@ static int rk29_sdmmc0_cfg_gpio(void)
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

View File

@@ -592,7 +592,7 @@ static u32 rk29_sdmmc_prepare_command(struct mmc_host *mmc,
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;
@@ -680,6 +680,10 @@ static int rk29_sdmmc_start_request(struct rk29_sdmmc *host,struct mmc_request *
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);
@@ -1281,12 +1285,11 @@ static int rk29_sdmmc_probe(struct platform_device *pdev)
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,
@@ -1360,8 +1363,11 @@ static int rk29_sdmmc_suspend(struct platform_device *pdev, pm_message_t state)
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
@@ -1377,8 +1383,17 @@ static int rk29_sdmmc_resume(struct platform_device *pdev)
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;
}