From: kfx Date: Mon, 18 Apr 2011 03:34:53 +0000 (+0800) Subject: update sdmmc driver and board-rk29-sdk/phonesdk.c X-Git-Tag: firefly_0821_release~10473 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c49299a834233f519c7d60f0fdeb4f998ea67cd5;p=firefly-linux-kernel-4.4.55.git update sdmmc driver and board-rk29-sdk/phonesdk.c --- diff --git a/arch/arm/mach-rk29/board-rk29-phonesdk.c b/arch/arm/mach-rk29/board-rk29-phonesdk.c index 2b2dff5eb741..faa76d81b94e 100755 --- a/arch/arm/mach-rk29/board-rk29-phonesdk.c +++ b/arch/arm/mach-rk29/board-rk29-phonesdk.c @@ -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 diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c index d729afb6b0b5..c70363ffc421 100755 --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -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 diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index 4f76a5377bd1..fc6be2aa8bf9 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -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; }