[MMC] sdhci: correct register order
The sdhci specification states that some registers must be written to in a specific order. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
1c8cde92fa
commit
c7fa9963ee
@ -270,16 +270,13 @@ static void sdhci_transfer_pio(struct sdhci_host *host)
|
||||
|
||||
static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
|
||||
{
|
||||
u16 mode;
|
||||
u8 count;
|
||||
unsigned target_timeout, current_timeout;
|
||||
|
||||
WARN_ON(host->data);
|
||||
|
||||
if (data == NULL) {
|
||||
writew(0, host->ioaddr + SDHCI_TRANSFER_MODE);
|
||||
if (data == NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
DBG("blksz %04x blks %04x flags %08x\n",
|
||||
data->blksz, data->blocks, data->flags);
|
||||
@ -317,19 +314,6 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
|
||||
|
||||
writeb(count, host->ioaddr + SDHCI_TIMEOUT_CONTROL);
|
||||
|
||||
mode = SDHCI_TRNS_BLK_CNT_EN;
|
||||
if (data->blocks > 1)
|
||||
mode |= SDHCI_TRNS_MULTI;
|
||||
if (data->flags & MMC_DATA_READ)
|
||||
mode |= SDHCI_TRNS_READ;
|
||||
if (host->flags & SDHCI_USE_DMA)
|
||||
mode |= SDHCI_TRNS_DMA;
|
||||
|
||||
writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE);
|
||||
|
||||
writew(data->blksz, host->ioaddr + SDHCI_BLOCK_SIZE);
|
||||
writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT);
|
||||
|
||||
if (host->flags & SDHCI_USE_DMA) {
|
||||
int count;
|
||||
|
||||
@ -347,6 +331,30 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
|
||||
host->offset = 0;
|
||||
host->remain = host->cur_sg->length;
|
||||
}
|
||||
|
||||
writew(data->blksz, host->ioaddr + SDHCI_BLOCK_SIZE);
|
||||
writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT);
|
||||
}
|
||||
|
||||
static void sdhci_set_transfer_mode(struct sdhci_host *host,
|
||||
struct mmc_data *data)
|
||||
{
|
||||
u16 mode;
|
||||
|
||||
WARN_ON(host->data);
|
||||
|
||||
if (data == NULL)
|
||||
return;
|
||||
|
||||
mode = SDHCI_TRNS_BLK_CNT_EN;
|
||||
if (data->blocks > 1)
|
||||
mode |= SDHCI_TRNS_MULTI;
|
||||
if (data->flags & MMC_DATA_READ)
|
||||
mode |= SDHCI_TRNS_READ;
|
||||
if (host->flags & SDHCI_USE_DMA)
|
||||
mode |= SDHCI_TRNS_DMA;
|
||||
|
||||
writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE);
|
||||
}
|
||||
|
||||
static void sdhci_finish_data(struct sdhci_host *host)
|
||||
@ -447,6 +455,8 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
|
||||
|
||||
writel(cmd->arg, host->ioaddr + SDHCI_ARGUMENT);
|
||||
|
||||
sdhci_set_transfer_mode(host, cmd->data);
|
||||
|
||||
if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
|
||||
printk(KERN_ERR "%s: Unsupported response type! "
|
||||
"Please report this to " BUGMAIL ".\n",
|
||||
|
Loading…
Reference in New Issue
Block a user