#define  ESDHC_VENDOR_SPEC_FRC_SDCLK_ON        (1 << 8)
 #define ESDHC_WTMK_LVL                 0x44
 #define  ESDHC_WTMK_DEFAULT_VAL                0x10401040
+#define  ESDHC_WTMK_LVL_RD_WML_MASK    0x000000FF
+#define  ESDHC_WTMK_LVL_RD_WML_SHIFT   0
+#define  ESDHC_WTMK_LVL_WR_WML_MASK    0x00FF0000
+#define  ESDHC_WTMK_LVL_WR_WML_SHIFT   16
+#define  ESDHC_WTMK_LVL_WML_VAL_DEF    64
+#define  ESDHC_WTMK_LVL_WML_VAL_MAX    128
 #define ESDHC_MIX_CTRL                 0x48
 #define  ESDHC_MIX_CTRL_DDREN          (1 << 3)
 #define  ESDHC_MIX_CTRL_AC23EN         (1 << 7)
                }
 
                if (esdhc_is_usdhc(imx_data)) {
+                       u32 wml;
                        u32 m = readl(host->ioaddr + ESDHC_MIX_CTRL);
                        /* Swap AC23 bit */
                        if (val & SDHCI_TRNS_AUTO_CMD23) {
                        }
                        m = val | (m & ~ESDHC_MIX_CTRL_SDHCI_MASK);
                        writel(m, host->ioaddr + ESDHC_MIX_CTRL);
+
+                       /* Set watermark levels for PIO access to maximum value
+                        * (128 words) to accommodate full 512 bytes buffer.
+                        * For DMA access restore the levels to default value.
+                        */
+                       m = readl(host->ioaddr + ESDHC_WTMK_LVL);
+                       if (val & SDHCI_TRNS_DMA)
+                               wml = ESDHC_WTMK_LVL_WML_VAL_DEF;
+                       else
+                               wml = ESDHC_WTMK_LVL_WML_VAL_MAX;
+                       m &= ~(ESDHC_WTMK_LVL_RD_WML_MASK |
+                              ESDHC_WTMK_LVL_WR_WML_MASK);
+                       m |= (wml << ESDHC_WTMK_LVL_RD_WML_SHIFT) |
+                            (wml << ESDHC_WTMK_LVL_WR_WML_SHIFT);
+                       writel(m, host->ioaddr + ESDHC_WTMK_LVL);
                } else {
                        /*
                         * Postpone this write, we must do it together with a