@@ -637,6 +637,13 @@ static int sdhci_pre_dma_transfer(struct sdhci_host *host,
sg_copy_to_buffer(data->sg, data->sg_len,
host->bounce_buffer,
length);
+
+ /*
+ * Endianness can't be swapped in the sg list,
+ * since the sg list is processed again later on.
+ */
+ if (host->ops->pre_dma_transfer)
+ host->ops->pre_dma_transfer(host, data);
}
/* Switch ownership to the DMA */
dma_sync_single_for_device(host->mmc->parent,
@@ -653,6 +653,8 @@ struct sdhci_ops {
void (*voltage_switch)(struct sdhci_host *host);
void (*adma_write_desc)(struct sdhci_host *host, void **desc,
dma_addr_t addr, int len, unsigned int cmd);
+ void (*pre_dma_transfer)(struct sdhci_host *host,
+ struct mmc_data *data);
void (*request_done)(struct sdhci_host *host,
struct mmc_request *mrq);
};
Some controller as the ColdFire eshdc may require an endianness byte swap, becouse DMA read endianness is not configurable. Signed-off-by: Angelo Dureghello <angelo.dureghello@timesys.com> --- Changes for v3: - add post request callback --- drivers/mmc/host/sdhci.c | 7 +++++++ drivers/mmc/host/sdhci.h | 2 ++ 2 files changed, 9 insertions(+)