|
@@ -554,10 +554,10 @@ static void sdhci_kunmap_atomic(void *buffer, unsigned long *flags)
|
|
|
local_irq_restore(*flags);
|
|
|
}
|
|
|
|
|
|
-static void sdhci_adma_write_desc(struct sdhci_host *host, void *desc,
|
|
|
- dma_addr_t addr, int len, unsigned cmd)
|
|
|
+void sdhci_adma_write_desc(struct sdhci_host *host, void **desc,
|
|
|
+ dma_addr_t addr, int len, unsigned int cmd)
|
|
|
{
|
|
|
- struct sdhci_adma2_64_desc *dma_desc = desc;
|
|
|
+ struct sdhci_adma2_64_desc *dma_desc = *desc;
|
|
|
|
|
|
/* 32-bit and 64-bit descriptors have these members in same position */
|
|
|
dma_desc->cmd = cpu_to_le16(cmd);
|
|
@@ -566,6 +566,19 @@ static void sdhci_adma_write_desc(struct sdhci_host *host, void *desc,
|
|
|
|
|
|
if (host->flags & SDHCI_USE_64_BIT_DMA)
|
|
|
dma_desc->addr_hi = cpu_to_le32((u64)addr >> 32);
|
|
|
+
|
|
|
+ *desc += host->desc_sz;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(sdhci_adma_write_desc);
|
|
|
+
|
|
|
+static inline void __sdhci_adma_write_desc(struct sdhci_host *host,
|
|
|
+ void **desc, dma_addr_t addr,
|
|
|
+ int len, unsigned int cmd)
|
|
|
+{
|
|
|
+ if (host->ops->adma_write_desc)
|
|
|
+ host->ops->adma_write_desc(host, desc, addr, len, cmd);
|
|
|
+
|
|
|
+ sdhci_adma_write_desc(host, desc, addr, len, cmd);
|
|
|
}
|
|
|
|
|
|
static void sdhci_adma_mark_end(void *desc)
|
|
@@ -618,28 +631,24 @@ static void sdhci_adma_table_pre(struct sdhci_host *host,
|
|
|
}
|
|
|
|
|
|
/* tran, valid */
|
|
|
- sdhci_adma_write_desc(host, desc, align_addr, offset,
|
|
|
- ADMA2_TRAN_VALID);
|
|
|
+ __sdhci_adma_write_desc(host, &desc, align_addr,
|
|
|
+ offset, ADMA2_TRAN_VALID);
|
|
|
|
|
|
BUG_ON(offset > 65536);
|
|
|
|
|
|
align += SDHCI_ADMA2_ALIGN;
|
|
|
align_addr += SDHCI_ADMA2_ALIGN;
|
|
|
|
|
|
- desc += host->desc_sz;
|
|
|
-
|
|
|
addr += offset;
|
|
|
len -= offset;
|
|
|
}
|
|
|
|
|
|
BUG_ON(len > 65536);
|
|
|
|
|
|
- if (len) {
|
|
|
- /* tran, valid */
|
|
|
- sdhci_adma_write_desc(host, desc, addr, len,
|
|
|
- ADMA2_TRAN_VALID);
|
|
|
- desc += host->desc_sz;
|
|
|
- }
|
|
|
+ /* tran, valid */
|
|
|
+ if (len)
|
|
|
+ __sdhci_adma_write_desc(host, &desc, addr, len,
|
|
|
+ ADMA2_TRAN_VALID);
|
|
|
|
|
|
/*
|
|
|
* If this triggers then we have a calculation bug
|
|
@@ -656,7 +665,7 @@ static void sdhci_adma_table_pre(struct sdhci_host *host,
|
|
|
}
|
|
|
} else {
|
|
|
/* Add a terminating entry - nop, end, valid */
|
|
|
- sdhci_adma_write_desc(host, desc, 0, 0, ADMA2_NOP_END_VALID);
|
|
|
+ __sdhci_adma_write_desc(host, &desc, 0, 0, ADMA2_NOP_END_VALID);
|
|
|
}
|
|
|
}
|
|
|
|