mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 17:59:32 +00:00
mmc: sdhci: add quirks for be to le byte swapping
Some controller as the ColdFire eshdc may require an endianness byte swap, because DMA read endianness is not configurable. Facilitate using the bounce buffer for this by adding ->copy_to_bounce_buffer(). Signed-off-by: Angelo Dureghello <angelo.dureghello@timesys.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Link: https://lore.kernel.org/r/20200518191742.1251440-2-angelo.dureghello@timesys.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
991f5c4dd2
commit
e93577ecde
2 changed files with 10 additions and 3 deletions
|
@ -637,9 +637,13 @@ static int sdhci_pre_dma_transfer(struct sdhci_host *host,
|
||||||
}
|
}
|
||||||
if (mmc_get_dma_dir(data) == DMA_TO_DEVICE) {
|
if (mmc_get_dma_dir(data) == DMA_TO_DEVICE) {
|
||||||
/* Copy the data to the bounce buffer */
|
/* Copy the data to the bounce buffer */
|
||||||
sg_copy_to_buffer(data->sg, data->sg_len,
|
if (host->ops->copy_to_bounce_buffer) {
|
||||||
host->bounce_buffer,
|
host->ops->copy_to_bounce_buffer(host,
|
||||||
length);
|
data, length);
|
||||||
|
} else {
|
||||||
|
sg_copy_to_buffer(data->sg, data->sg_len,
|
||||||
|
host->bounce_buffer, length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Switch ownership to the DMA */
|
/* Switch ownership to the DMA */
|
||||||
dma_sync_single_for_device(host->mmc->parent,
|
dma_sync_single_for_device(host->mmc->parent,
|
||||||
|
|
|
@ -645,6 +645,9 @@ struct sdhci_ops {
|
||||||
void (*voltage_switch)(struct sdhci_host *host);
|
void (*voltage_switch)(struct sdhci_host *host);
|
||||||
void (*adma_write_desc)(struct sdhci_host *host, void **desc,
|
void (*adma_write_desc)(struct sdhci_host *host, void **desc,
|
||||||
dma_addr_t addr, int len, unsigned int cmd);
|
dma_addr_t addr, int len, unsigned int cmd);
|
||||||
|
void (*copy_to_bounce_buffer)(struct sdhci_host *host,
|
||||||
|
struct mmc_data *data,
|
||||||
|
unsigned int length);
|
||||||
void (*request_done)(struct sdhci_host *host,
|
void (*request_done)(struct sdhci_host *host,
|
||||||
struct mmc_request *mrq);
|
struct mmc_request *mrq);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue