diff options
| author | Wolfgang Denk <wd@denx.de> | 2010-11-12 22:24:06 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2010-11-12 22:24:06 +0100 | 
| commit | d963e84c92a63b4e6c4f2f80482a5ecbe9b24fe0 (patch) | |
| tree | 07dd5889d73f4b66ad608815adcf6f2f953d9501 /drivers/mmc | |
| parent | 66fca016057b1c6b697552cc7220ebada9d4f82d (diff) | |
| parent | 0c0892be0d93a5a892b93739c5eb3bf692fed4ff (diff) | |
| download | olio-uboot-2014.01-d963e84c92a63b4e6c4f2f80482a5ecbe9b24fe0.tar.xz olio-uboot-2014.01-d963e84c92a63b4e6c4f2f80482a5ecbe9b24fe0.zip | |
Merge branch 'master' of /home/wd/git/u-boot/master
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/mmc.c | 54 | ||||
| -rw-r--r-- | drivers/mmc/omap_hsmmc.c | 1 | ||||
| -rw-r--r-- | drivers/mmc/s5p_mmc.c | 19 | 
3 files changed, 53 insertions, 21 deletions
| diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index c543d837d..eb7bfb39e 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -78,17 +78,11 @@ struct mmc *find_mmc_device(int dev_num)  }  static ulong -mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src) +mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)  {  	struct mmc_cmd cmd;  	struct mmc_data data; -	int err; -	int stoperr = 0; -	struct mmc *mmc = find_mmc_device(dev_num); -	int blklen; - -	if (!mmc) -		return -1; +	int blklen, err;  	blklen = mmc->write_bl_len; @@ -97,12 +91,6 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)  			start + blkcnt, mmc->block_dev.lba);  		return 0;  	} -	err = mmc_set_blocklen(mmc, mmc->write_bl_len); - -	if (err) { -		printf("set write bl len failed\n\r"); -		return err; -	}  	if (blkcnt > 1)  		cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK; @@ -134,9 +122,45 @@ mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src)  		cmd.cmdarg = 0;  		cmd.resp_type = MMC_RSP_R1b;  		cmd.flags = 0; -		stoperr = mmc_send_cmd(mmc, &cmd, NULL); +		err = mmc_send_cmd(mmc, &cmd, NULL); +		if (err) { +			printf("mmc fail to send stop cmd\n\r"); +			return err; +		} +	} + +	return blkcnt; +} + +static ulong +mmc_bwrite(int dev_num, ulong start, lbaint_t blkcnt, const void*src) +{ +	int err; +	struct mmc *mmc = find_mmc_device(dev_num); +	lbaint_t cur, blocks_todo = blkcnt; + +	if (!mmc) +		return -1; + +	err = mmc_set_blocklen(mmc, mmc->write_bl_len); +	if (err) { +		printf("set write bl len failed\n\r"); +		return err;  	} +	do { +		/* +		 * The 65535 constraint comes from some hardware has +		 * only 16 bit width block number counter +		 */ +		cur = (blocks_todo > 65535) ? 65535 : blocks_todo; +		if(mmc_write_blocks(mmc, start, cur, src) != cur) +			return -1; +		blocks_todo -= cur; +		start += cur; +		src += cur * mmc->write_bl_len; +	} while (blocks_todo > 0); +  	return blkcnt;  } diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c index 9271470e3..c7f76209f 100644 --- a/drivers/mmc/omap_hsmmc.c +++ b/drivers/mmc/omap_hsmmc.c @@ -412,4 +412,3 @@ int omap_mmc_init(int dev_index)  	return 0;  } - diff --git a/drivers/mmc/s5p_mmc.c b/drivers/mmc/s5p_mmc.c index 1fd425cbb..195b5be39 100644 --- a/drivers/mmc/s5p_mmc.c +++ b/drivers/mmc/s5p_mmc.c @@ -352,11 +352,16 @@ static void mmc_set_ios(struct mmc *mmc)  	ctrl = readb(&host->reg->hostctl);  	/* +	 * WIDE8[5] +	 * 0 = Depend on WIDE4 +	 * 1 = 8-bit mode  	 * WIDE4[1]  	 * 1 = 4-bit mode  	 * 0 = 1-bit mode  	 */ -	if (mmc->bus_width == 4) +	if (mmc->bus_width == 8) +		ctrl |= (1 << 5); +	else if (mmc->bus_width == 4)  		ctrl |= (1 << 1);  	else  		ctrl &= ~(1 << 1); @@ -437,7 +442,7 @@ static int mmc_core_init(struct mmc *mmc)  	return 0;  } -static int s5p_mmc_initialize(int dev_index) +static int s5p_mmc_initialize(int dev_index, int bus_width)  {  	struct mmc *mmc; @@ -450,7 +455,11 @@ static int s5p_mmc_initialize(int dev_index)  	mmc->init = mmc_core_init;  	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195; -	mmc->host_caps = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS; +	if (bus_width == 8) +		mmc->host_caps = MMC_MODE_8BIT; +	else +		mmc->host_caps = MMC_MODE_4BIT; +	mmc->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;  	mmc->f_min = 400000;  	mmc->f_max = 52000000; @@ -462,7 +471,7 @@ static int s5p_mmc_initialize(int dev_index)  	return 0;  } -int s5p_mmc_init(int dev_index) +int s5p_mmc_init(int dev_index, int bus_width)  { -	return s5p_mmc_initialize(dev_index); +	return s5p_mmc_initialize(dev_index, bus_width);  } |