diff options
| -rw-r--r-- | drivers/mmc/gen_atmel_mci.c | 11 | ||||
| -rw-r--r-- | include/atmel_mci.h | 7 | 
2 files changed, 17 insertions, 1 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); diff --git a/include/atmel_mci.h b/include/atmel_mci.h index 3dd5d67be..c71188127 100644 --- a/include/atmel_mci.h +++ b/include/atmel_mci.h @@ -38,7 +38,7 @@ typedef struct atmel_mci {  	u32	sdcr;	/* 0x0c */  	u32	argr;	/* 0x10 */  	u32	cmdr;	/* 0x14 */ -	u32	_18;	/* 0x18 */ +	u32	blkr;	/* 0x18 */  	u32	_1c;	/* 0x1c */  	u32	rspr;	/* 0x20 */  	u32	rspr1;	/* 0x24 */ @@ -118,6 +118,11 @@ typedef struct atmel_mci {  #define MMCI_TRTYP_OFFSET			19  #define MMCI_TRTYP_SIZE				2 +/* Bitfields in BLKR */ +/* MMCI_BLKLEN_OFFSET/SIZE already defined in MR */ +#define MMCI_BCNT_OFFSET			0 +#define MMCI_BCNT_SIZE			16 +  /* Bitfields in RSPRx */  #define MMCI_RSP_OFFSET				0  #define MMCI_RSP_SIZE				32 |