[s3c24xx] glamo mmc regulator fixes.
[openwrt/svn-archive/archive.git] / target / linux / s3c24xx / files-2.6.30 / drivers / mfd / glamo / glamo-mci.c
index e66a14becbc604113ebf04b7f510c3e15673b3df..ef39017ec6de9e066846245a551d675a0294d2a1 100644 (file)
@@ -618,6 +618,7 @@ static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
        struct glamo_mci_host *host = mmc_priv(mmc);
        int bus_width = 0;
        int powering = 0;
+       int ret;
 
        if (host->suspending) {
                dev_err(&host->pdev->dev, "IGNORING glamo_mci_set_ios while "
@@ -628,8 +629,9 @@ static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
        /* Set power */
        switch(ios->power_mode) {
        case MMC_POWER_UP:
-               mmc_regulator_set_ocr(host->regulator, ios->vdd);
-               host->vdd_current = ios->vdd;
+               ret = regulator_enable(host->regulator);
+               if (ret)
+                       dev_err(&host->pdev->dev, "Failed to enable regulator: %d\n", ret);
                break;
        case MMC_POWER_ON:
                /*
@@ -638,10 +640,6 @@ static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                 */
                host->force_slow_during_powerup = 1;
 
-               if (host->vdd_current != ios->vdd) {
-                       mmc_regulator_set_ocr(host->regulator, ios->vdd);
-                       host->vdd_current = ios->vdd;
-               }
                if (host->power_mode_current == MMC_POWER_OFF) {
                        glamo_engine_enable(host->pdata->core,
                                                              GLAMO_ENGINE_MMC);
@@ -659,12 +657,20 @@ static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                glamo_engine_disable(host->pdata->core,
                                     GLAMO_ENGINE_MMC);
 
-               mmc_regulator_set_ocr(host->regulator, 0);
-               host->vdd_current = -1;
+               ret = regulator_disable(host->regulator);
+               if (ret)
+                       dev_warn(&host->pdev->dev, "Failed to disable regulator: %d\n", ret);
                break;
        }
        host->power_mode_current = ios->power_mode;
 
+       if (host->vdd_current != ios->vdd) {
+               ret = mmc_regulator_set_ocr(host->regulator, ios->vdd);
+               if (ret)
+                       dev_err(&host->pdev->dev, "Failed to set regulator voltage: %d\n", ret);
+               else
+                       host->vdd_current = ios->vdd;
+       }
        glamo_mci_set_card_clock(host, ios->clock);
 
        /* after power-up, we are meant to give it >= 74 clocks so it can
@@ -804,7 +810,7 @@ static int glamo_mci_probe(struct platform_device *pdev)
        }
 
 
-       host->vdd_current = -1;
+       host->vdd_current = 0;
        host->clk_rate = 50000000; /* really it's 49152000 */
        host->clk_div = 16;
 
@@ -824,6 +830,12 @@ static int glamo_mci_probe(struct platform_device *pdev)
        mmc->max_phys_segs = 128;
        mmc->max_hw_segs   = 128;
 
+       if (mmc->ocr_avail < 0) {
+               dev_warn(&pdev->dev, "Failed to get ocr list for regulator: %d.\n",
+                               mmc->ocr_avail);
+               mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
+       }
+
        platform_set_drvdata(pdev, mmc);
 
        glamo_engine_enable(host->pdata->core, GLAMO_ENGINE_MMC);