Skip to content

Commit

Permalink
sdhci: add adma descriptor set call
Browse files Browse the repository at this point in the history
The code to write the ADMA descriptor into memory is repeated several
times throughout sdhci_adma_table_pre, and thus should be moved into a
common function.  This will also be useful if the patch to make the write
more efficient is accepted.

Signed-off-by: Ben Dooks <[email protected]>
Cc: Pierre Ossman <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Ben Dooks authored and torvalds committed Mar 6, 2010
1 parent 3fb7fb4 commit 118cd17
Showing 1 changed file with 20 additions and 30 deletions.
50 changes: 20 additions & 30 deletions drivers/mmc/host/sdhci.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,20 @@ static void sdhci_kunmap_atomic(void *buffer, unsigned long *flags)
local_irq_restore(*flags);
}

static void sdhci_set_adma_desc(u8 *desc, u32 addr, int len, unsigned cmd)
{
desc[7] = (addr >> 24) & 0xff;
desc[6] = (addr >> 16) & 0xff;
desc[5] = (addr >> 8) & 0xff;
desc[4] = (addr >> 0) & 0xff;

desc[3] = (len >> 8) & 0xff;
desc[2] = (len >> 0) & 0xff;

desc[0] = cmd & 0xff;
desc[1] = cmd >> 8;
}

static int sdhci_adma_table_pre(struct sdhci_host *host,
struct mmc_data *data)
{
Expand Down Expand Up @@ -443,19 +457,11 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
sdhci_kunmap_atomic(buffer, &flags);
}

desc[7] = (align_addr >> 24) & 0xff;
desc[6] = (align_addr >> 16) & 0xff;
desc[5] = (align_addr >> 8) & 0xff;
desc[4] = (align_addr >> 0) & 0xff;
/* tran, valid */
sdhci_set_adma_desc(desc, align_addr, offset, 0x21);

BUG_ON(offset > 65536);

desc[3] = (offset >> 8) & 0xff;
desc[2] = (offset >> 0) & 0xff;

desc[1] = 0x00;
desc[0] = 0x21; /* tran, valid */

align += 4;
align_addr += 4;

Expand All @@ -465,19 +471,10 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
len -= offset;
}

desc[7] = (addr >> 24) & 0xff;
desc[6] = (addr >> 16) & 0xff;
desc[5] = (addr >> 8) & 0xff;
desc[4] = (addr >> 0) & 0xff;

BUG_ON(len > 65536);

desc[3] = (len >> 8) & 0xff;
desc[2] = (len >> 0) & 0xff;

desc[1] = 0x00;
desc[0] = 0x21; /* tran, valid */

/* tran, valid */
sdhci_set_adma_desc(desc, addr, len, 0x21);
desc += 8;

/*
Expand All @@ -490,16 +487,9 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
/*
* Add a terminating entry.
*/
desc[7] = 0;
desc[6] = 0;
desc[5] = 0;
desc[4] = 0;

desc[3] = 0;
desc[2] = 0;

desc[1] = 0x00;
desc[0] = 0x03; /* nop, end, valid */
/* nop, end, valid */
sdhci_set_adma_desc(desc, 0, 0, 0x3);

/*
* Resync align buffer as we might have changed it.
Expand Down

0 comments on commit 118cd17

Please sign in to comment.