Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 102191
b: refs/heads/master
c: 8f1934c
h: refs/heads/master
i:
  102189: 596c6e6
  102187: ce82579
  102183: f089125
  102175: 3c844b3
v: v3
  • Loading branch information
Pierre Ossman committed Jul 15, 2008
1 parent 5865703 commit 62cbd1b
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 21 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6b174931a73177c6519f87e6a8d5ae6ba269cdb5
refs/heads/master: 8f1934ce784bd8f2eaf06f190526500f7f3f9c74
77 changes: 57 additions & 20 deletions trunk/drivers/mmc/host/sdhci.c
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ static void sdhci_kunmap_atomic(void *buffer, unsigned long *flags)
local_irq_restore(*flags);
}

static void sdhci_adma_table_pre(struct sdhci_host *host,
static int sdhci_adma_table_pre(struct sdhci_host *host,
struct mmc_data *data)
{
int direction;
Expand Down Expand Up @@ -360,10 +360,14 @@ static void sdhci_adma_table_pre(struct sdhci_host *host,

host->align_addr = dma_map_single(mmc_dev(host->mmc),
host->align_buffer, 128 * 4, direction);
if (dma_mapping_error(host->align_addr))
goto fail;
BUG_ON(host->align_addr & 0x3);

host->sg_count = dma_map_sg(mmc_dev(host->mmc),
data->sg, data->sg_len, direction);
if (host->sg_count == 0)
goto unmap_align;

desc = host->adma_desc;
align = host->align_buffer;
Expand Down Expand Up @@ -457,7 +461,20 @@ static void sdhci_adma_table_pre(struct sdhci_host *host,

host->adma_addr = dma_map_single(mmc_dev(host->mmc),
host->adma_desc, (128 * 2 + 1) * 4, DMA_TO_DEVICE);
if (dma_mapping_error(host->align_addr))
goto unmap_entries;
BUG_ON(host->adma_addr & 0x3);

return 0;

unmap_entries:
dma_unmap_sg(mmc_dev(host->mmc), data->sg,
data->sg_len, direction);
unmap_align:
dma_unmap_single(mmc_dev(host->mmc), host->align_addr,
128 * 4, direction);
fail:
return -EINVAL;
}

static void sdhci_adma_table_post(struct sdhci_host *host,
Expand Down Expand Up @@ -555,6 +572,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
{
u8 count;
u8 ctrl;
int ret;

WARN_ON(host->data);

Expand Down Expand Up @@ -639,6 +657,43 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
}
}

if (host->flags & SDHCI_REQ_USE_DMA) {
if (host->flags & SDHCI_USE_ADMA) {
ret = sdhci_adma_table_pre(host, data);
if (ret) {
/*
* This only happens when someone fed
* us an invalid request.
*/
WARN_ON(1);
host->flags &= ~SDHCI_USE_DMA;
} else {
writel(host->adma_addr,
host->ioaddr + SDHCI_ADMA_ADDRESS);
}
} else {
int count;

count = dma_map_sg(mmc_dev(host->mmc),
data->sg, data->sg_len,
(data->flags & MMC_DATA_READ) ?
DMA_FROM_DEVICE :
DMA_TO_DEVICE);
if (count == 0) {
/*
* This only happens when someone fed
* us an invalid request.
*/
WARN_ON(1);
host->flags &= ~SDHCI_USE_DMA;
} else {
WARN_ON(count != 1);
writel(sg_dma_address(data->sg),
host->ioaddr + SDHCI_DMA_ADDRESS);
}
}
}

/*
* Always adjust the DMA selection as some controllers
* (e.g. JMicron) can't do PIO properly when the selection
Expand All @@ -655,25 +710,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);
}

if (host->flags & SDHCI_REQ_USE_DMA) {
if (host->flags & SDHCI_USE_ADMA) {
sdhci_adma_table_pre(host, data);
writel(host->adma_addr,
host->ioaddr + SDHCI_ADMA_ADDRESS);
} else {
int count;

count = dma_map_sg(mmc_dev(host->mmc),
data->sg, data->sg_len,
(data->flags & MMC_DATA_READ) ?
DMA_FROM_DEVICE :
DMA_TO_DEVICE);
WARN_ON(count != 1);

writel(sg_dma_address(data->sg),
host->ioaddr + SDHCI_DMA_ADDRESS);
}
} else {
if (!(host->flags & SDHCI_REQ_USE_DMA)) {
host->cur_sg = data->sg;
host->num_sg = data->sg_len;

Expand Down

0 comments on commit 62cbd1b

Please sign in to comment.