|
@@ -153,6 +153,7 @@ struct mxs_mmc_host {
|
|
|
struct dma_chan *dmach;
|
|
|
struct mxs_dma_data dma_data;
|
|
|
unsigned int dma_dir;
|
|
|
+ enum dma_transfer_direction slave_dirn;
|
|
|
u32 ssp_pio_words[SSP_PIO_NUM];
|
|
|
|
|
|
unsigned int version;
|
|
@@ -323,7 +324,7 @@ static struct dma_async_tx_descriptor *mxs_mmc_prep_dma(
|
|
|
}
|
|
|
|
|
|
desc = host->dmach->device->device_prep_slave_sg(host->dmach,
|
|
|
- sgl, sg_len, host->dma_dir, append);
|
|
|
+ sgl, sg_len, host->slave_dirn, append);
|
|
|
if (desc) {
|
|
|
desc->callback = mxs_mmc_dma_irq_callback;
|
|
|
desc->callback_param = host;
|
|
@@ -432,6 +433,7 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
|
|
|
int i;
|
|
|
|
|
|
unsigned short dma_data_dir, timeout;
|
|
|
+ enum dma_transfer_direction slave_dirn;
|
|
|
unsigned int data_size = 0, log2_blksz;
|
|
|
unsigned int blocks = data->blocks;
|
|
|
|
|
@@ -447,9 +449,11 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
|
|
|
|
|
|
if (data->flags & MMC_DATA_WRITE) {
|
|
|
dma_data_dir = DMA_TO_DEVICE;
|
|
|
+ slave_dirn = DMA_MEM_TO_DEV;
|
|
|
read = 0;
|
|
|
} else {
|
|
|
dma_data_dir = DMA_FROM_DEVICE;
|
|
|
+ slave_dirn = DMA_DEV_TO_MEM;
|
|
|
read = BM_SSP_CTRL0_READ;
|
|
|
}
|
|
|
|
|
@@ -517,6 +521,7 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
|
|
|
WARN_ON(host->data != NULL);
|
|
|
host->data = data;
|
|
|
host->dma_dir = dma_data_dir;
|
|
|
+ host->slave_dirn = slave_dirn;
|
|
|
desc = mxs_mmc_prep_dma(host, 1);
|
|
|
if (!desc)
|
|
|
goto out;
|