diff options
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/gen_atmel_mci.c | 11 | 
1 files changed, 11 insertions, 0 deletions
| diff --git a/drivers/mmc/gen_atmel_mci.c b/drivers/mmc/gen_atmel_mci.c index 4968c5e49..9f0630454 100644 --- a/drivers/mmc/gen_atmel_mci.c +++ b/drivers/mmc/gen_atmel_mci.c @@ -87,6 +87,11 @@ static void mci_set_mode(struct mmc *mmc, u32 hz, u32 blklen)  		 | MMCI_BF(BLKLEN, blklen)  		 | MMCI_BIT(RDPROOF)  		 | MMCI_BIT(WRPROOF)), &mci->mr); +	/* +	 * On some new platforms BLKLEN in mci->mr is ignored. +	 * Should use the BLKLEN in the block register. +	 */ +	writel(MMCI_BF(BLKLEN, blklen), &mci->blkr);  	initialized = 1;  } @@ -183,6 +188,12 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)  	/* Figure out the transfer arguments */  	cmdr = mci_encode_cmd(cmd, data, &error_flags); +	/* For multi blocks read/write, set the block register */ +	if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK) +			|| (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK)) +		writel(data->blocks | MMCI_BF(BLKLEN, mmc->read_bl_len), +			&mci->blkr); +  	/* Send the command */  	writel(cmd->cmdarg, &mci->argr);  	writel(cmdr, &mci->cmdr); |