|
|
@@ -32,6 +32,7 @@
|
|
|
#include "sdhci-esdhc.h"
|
|
|
|
|
|
#define ESDHC_CTRL_D3CD 0x08
|
|
|
+#define ESDHC_BURST_LEN_EN_INCR (1 << 27)
|
|
|
/* VENDOR SPEC register */
|
|
|
#define ESDHC_VENDOR_SPEC 0xc0
|
|
|
#define ESDHC_VENDOR_SPEC_SDIO_QUIRK (1 << 1)
|
|
|
@@ -1163,6 +1164,21 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
|
|
|
host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN;
|
|
|
host->mmc->caps |= MMC_CAP_1_8V_DDR;
|
|
|
|
|
|
+ /*
|
|
|
+ * ROM code will change the bit burst_length_enable setting
|
|
|
+ * to zero if this usdhc is choosed to boot system. Change
|
|
|
+ * it back here, otherwise it will impact the performance a
|
|
|
+ * lot. This bit is used to enable/disable the burst length
|
|
|
+ * for the external AHB2AXI bridge, it's usefully especially
|
|
|
+ * for INCR transfer because without burst length indicator,
|
|
|
+ * the AHB2AXI bridge does not know the burst length in
|
|
|
+ * advance. And without burst length indicator, AHB INCR
|
|
|
+ * transfer can only be converted to singles on the AXI side.
|
|
|
+ */
|
|
|
+ writel(readl(host->ioaddr + SDHCI_HOST_CONTROL)
|
|
|
+ | ESDHC_BURST_LEN_EN_INCR,
|
|
|
+ host->ioaddr + SDHCI_HOST_CONTROL);
|
|
|
+
|
|
|
if (!(imx_data->socdata->flags & ESDHC_FLAG_HS200))
|
|
|
host->quirks2 |= SDHCI_QUIRK2_BROKEN_HS200;
|
|
|
|