* 1.8V vccq at 3.3V core voltage (vcc) is not required
         * in the JEDEC spec for DDR.
         *
-        * Do not force change in vccq since we are obviously
-        * working and no change to vccq is needed.
+        * Even (e)MMC card can support 3.3v to 1.2v vccq, but not all
+        * host controller can support this, like some of the SDHCI
+        * controller which connect to an eMMC device. Some of these
+        * host controller still needs to use 1.8v vccq for supporting
+        * DDR mode.
+        *
+        * So the sequence will be:
+        * if (host and device can both support 1.2v IO)
+        *      use 1.2v IO;
+        * else if (host and device can both support 1.8v IO)
+        *      use 1.8v IO;
+        * so if host and device can only support 3.3v IO, this is the
+        * last choice.
         *
         * WARNING: eMMC rules are NOT the same as SD DDR
         */
-       if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V) {
-               err = __mmc_set_signal_voltage(host,
-                               MMC_SIGNAL_VOLTAGE_120);
-               if (err)
-                       return err;
-       }
+       err = -EINVAL;
+       if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V)
+               err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
 
-       mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
+       if (err && (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_8V))
+               err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180);
+
+       /* make sure vccq is 3.3v after switching disaster */
+       if (err)
+               err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330);
+
+       if (!err)
+               mmc_set_timing(host, MMC_TIMING_MMC_DDR52);
 
        return err;
 }