add suspend/resume function(rk29_sdmmc.c), 2)add kernel config -- Allow unsafe resume...
authorkfx <kfx@rock-chips.com>
Thu, 24 Mar 2011 02:48:13 +0000 (10:48 +0800)
committerkfx <kfx@rock-chips.com>
Thu, 24 Mar 2011 02:48:13 +0000 (10:48 +0800)
arch/arm/configs/rk29_sdk_defconfig
arch/arm/mach-rk29/board-rk29sdk.c
drivers/mmc/host/rk29_sdmmc.c

index f9317b078f1f7a8ba29150387cb3d7dd98dd3e4e..fbb82a7f11be49a5533946a0664b3d32d244a91e 100755 (executable)
@@ -1490,7 +1490,7 @@ CONFIG_DWC_CONN_EN=y
 CONFIG_DWC_OTG=y
 CONFIG_MMC=y
 # CONFIG_MMC_DEBUG is not set
-# CONFIG_MMC_UNSAFE_RESUME is not set
+CONFIG_MMC_UNSAFE_RESUME=y
 CONFIG_MMC_EMBEDDED_SDIO=y
 # CONFIG_MMC_PARANOID_SD_INIT is not set
 
index 183dc28ace83ffe8661a89b064e58961f96866dd..36f533f89adb50f9dd36604733abe318072929a1 100755 (executable)
@@ -1151,9 +1151,13 @@ static int rk29_sdmmc0_cfg_gpio(void)
        rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);
        rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5);   ///GPIO5H_SDMMC0_PWR_EN);  ///GPIO5H_GPIO5D5);
        gpio_request(RK29_PIN5_PD5,"sdmmc");
+#if 0
        gpio_set_value(RK29_PIN5_PD5,GPIO_HIGH);
        mdelay(100);
        gpio_set_value(RK29_PIN5_PD5,GPIO_LOW);
+#else
+       gpio_direction_output(RK29_PIN5_PD5,GPIO_LOW);
+#endif
        return 0;
 }
 
index f3a62f4c9998049474872ae303cca261ff7196fb..ca42ab888b48471dd24e754efbce8ca10759630b 100755 (executable)
@@ -1542,26 +1542,34 @@ static int __exit rk29_sdmmc_remove(struct platform_device *pdev)
        kfree(host);
        return 0;
 }
-
 static int rk29_sdmmc_suspend(struct platform_device *pdev, pm_message_t state)
 {
+       int ret = 0;
 #ifdef CONFIG_PM
        struct rk29_sdmmc *host = platform_get_drvdata(pdev);
+
+       printk("Enter rk29_sdmmc_suspend\n");
+       if(host->mmc)
+               ret = mmc_suspend_host(host->mmc, state);
        rk29_sdmmc_write(host->regs, SDMMC_CLKENA, 0);
        clk_disable(host->clk);
 #endif
-       return 0;
+       return ret;
 }
 
 static int rk29_sdmmc_resume(struct platform_device *pdev)
 {
+       int ret = 0;
 #ifdef CONFIG_PM
        struct rk29_sdmmc *host = platform_get_drvdata(pdev);
+
+       printk("Exit rk29_sdmmc_suspend\n");
        clk_enable(host->clk);
+       if(host->mmc)
+               ret = mmc_resume_host(host->mmc);
 #endif
-       return 0;
+       return ret;
 }
-
 static struct platform_driver rk29_sdmmc_driver = {
        .suspend    = rk29_sdmmc_suspend,
        .resume     = rk29_sdmmc_resume,