diff options
Diffstat (limited to 'cpu/at32ap/atmel_mci.c')
| -rw-r--r-- | cpu/at32ap/atmel_mci.c | 21 | 
1 files changed, 17 insertions, 4 deletions
diff --git a/cpu/at32ap/atmel_mci.c b/cpu/at32ap/atmel_mci.c index 9f62c0f14..bdca1c19f 100644 --- a/cpu/at32ap/atmel_mci.c +++ b/cpu/at32ap/atmel_mci.c @@ -82,7 +82,9 @@ static void mci_set_mode(unsigned long hz, unsigned long blklen)  	blklen &= 0xfffc;  	mmci_writel(MR, (MMCI_BF(CLKDIV, clkdiv) -			 | MMCI_BF(BLKLEN, blklen))); +			 | MMCI_BF(BLKLEN, blklen) +			 | MMCI_BIT(RDPROOF) +			 | MMCI_BIT(WRPROOF)));  }  #define RESP_NO_CRC	1 @@ -225,7 +227,7 @@ mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,  				*buffer++ = data;  				wordcount++;  			} -		} while(wordcount < (512 / 4)); +		} while(wordcount < (mmc_blkdev.blksz / 4));  		pr_debug("mmc: read %u words, waiting for BLKE\n", wordcount); @@ -243,7 +245,7 @@ out:  fail:  	mmc_cmd(MMC_CMD_SEND_STATUS, mmc_rca << 16, &card_status, R1 | NCR); -	printf("mmc: bread failed, card status = ", card_status); +	printf("mmc: bread failed, card status = %08x\n", card_status);  	goto out;  } @@ -409,6 +411,7 @@ int mmc_init(int verbose)  {  	struct mmc_cid cid;  	struct mmc_csd csd; +	unsigned int max_blksz;  	int ret;  	/* Initialize controller */ @@ -444,7 +447,17 @@ int mmc_init(int verbose)  		sizeof(mmc_blkdev.product));  	sprintf((char *)mmc_blkdev.revision, "%x %x",  		cid.prv >> 4, cid.prv & 0x0f); -	mmc_blkdev.blksz = 1 << csd.read_bl_len; + +	/* +	 * If we can't use 512 byte blocks, refuse to deal with the +	 * card. Tons of code elsewhere seems to depend on this. +	 */ +	max_blksz = 1 << csd.read_bl_len; +	if (max_blksz < 512 || (max_blksz > 512 && !csd.read_bl_partial)) { +		printf("Card does not support 512 byte reads, aborting.\n"); +		return -ENODEV; +	} +	mmc_blkdev.blksz = 512;  	mmc_blkdev.lba = (csd.c_size + 1) * (1 << (csd.c_size_mult + 2));  	mci_set_mode(CFG_MMC_CLK_PP, mmc_blkdev.blksz);  |