update sdmmc driver and board-rk29-sdk/phonesdk.c
authorkfx <kfx@rock-chips.com>
Mon, 18 Apr 2011 03:34:53 +0000 (11:34 +0800)
committerkfx <kfx@rock-chips.com>
Mon, 18 Apr 2011 03:34:53 +0000 (11:34 +0800)
arch/arm/mach-rk29/board-rk29-phonesdk.c
arch/arm/mach-rk29/board-rk29sdk.c
drivers/mmc/host/rk29_sdmmc.c

index 2b2dff5eb7416553b2b8d44035105dbcfc0bd3cd..faa76d81b94edc7731511387478a3a9b2c211d92 100755 (executable)
@@ -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
index d729afb6b0b569107b9a6522f6c63219b1b10f82..c70363ffc42147088bbe94d9e97a434fd7e51e60 100755 (executable)
@@ -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
index 4f76a5377bd1e8d6c379ef6eb7289ace7173477a..fc6be2aa8bf9df077bd8ad99c60b10edf3c65425 100755 (executable)
@@ -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;
 }