diff options
Diffstat (limited to 'drivers/mmc/mmc.c')
| -rw-r--r-- | drivers/mmc/mmc.c | 42 | 
1 files changed, 30 insertions, 12 deletions
| diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 3a34028c917..ede5d6eeec7 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -234,8 +234,11 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,  	return blkcnt;  } -static ulong mmc_bread(int dev_num, lbaint_t start, lbaint_t blkcnt, void *dst) +static ulong mmc_bread(block_dev_desc_t *block_dev, lbaint_t start, +		       lbaint_t blkcnt, void *dst)  { +	int dev_num = block_dev->dev; +	int err;  	lbaint_t cur, blocks_todo = blkcnt;  	if (blkcnt == 0) @@ -245,6 +248,10 @@ static ulong mmc_bread(int dev_num, lbaint_t start, lbaint_t blkcnt, void *dst)  	if (!mmc)  		return 0; +	err = mmc_select_hwpart(dev_num, block_dev->hwpart); +	if (err < 0) +		return 0; +  	if ((start + blkcnt) > mmc->block_dev.lba) {  #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)  		printf("MMC: block number 0x" LBAF " exceeds max(0x" LBAF ")\n", @@ -579,7 +586,7 @@ int mmc_select_hwpart(int dev_num, int hwpart)  	if (!mmc)  		return -ENODEV; -	if (mmc->part_num == hwpart) +	if (mmc->block_dev.hwpart == hwpart)  		return 0;  	if (mmc->part_config == MMCPART_NOAVAILABLE) { @@ -591,8 +598,6 @@ int mmc_select_hwpart(int dev_num, int hwpart)  	if (ret)  		return ret; -	mmc->part_num = hwpart; -  	return 0;  } @@ -613,8 +618,10 @@ int mmc_switch_part(int dev_num, unsigned int part_num)  	 * Set the capacity if the switch succeeded or was intended  	 * to return to representing the raw device.  	 */ -	if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) +	if ((ret == 0) || ((ret == -ENODEV) && (part_num == 0))) {  		ret = mmc_set_capacity(mmc, part_num); +		mmc->block_dev.hwpart = part_num; +	}  	return ret;  } @@ -1324,7 +1331,7 @@ static int mmc_startup(struct mmc *mmc)  		mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];  	} -	err = mmc_set_capacity(mmc, mmc->part_num); +	err = mmc_set_capacity(mmc, mmc->block_dev.hwpart);  	if (err)  		return err; @@ -1465,6 +1472,7 @@ static int mmc_startup(struct mmc *mmc)  	/* fill in device description */  	mmc->block_dev.lun = 0; +	mmc->block_dev.hwpart = 0;  	mmc->block_dev.type = 0;  	mmc->block_dev.blksz = mmc->read_bl_len;  	mmc->block_dev.log2blksz = LOG2(mmc->block_dev.blksz); @@ -1624,7 +1632,7 @@ int mmc_start_init(struct mmc *mmc)  		return err;  	/* The internal partition reset to user partition(0) at every CMD0*/ -	mmc->part_num = 0; +	mmc->block_dev.hwpart = 0;  	/* Test for SD version 2 */  	err = mmc_send_if_cond(mmc); @@ -1772,18 +1780,28 @@ static int mmc_probe(bd_t *bis)  #elif defined(CONFIG_DM_MMC)  static int mmc_probe(bd_t *bis)  { -	int ret; +	int ret, i;  	struct uclass *uc; -	struct udevice *m; +	struct udevice *dev;  	ret = uclass_get(UCLASS_MMC, &uc);  	if (ret)  		return ret; -	uclass_foreach_dev(m, uc) { -		ret = device_probe(m); +	/* +	 * Try to add them in sequence order. Really with driver model we +	 * should allow holes, but the current MMC list does not allow that. +	 * So if we request 0, 1, 3 we will get 0, 1, 2. +	 */ +	for (i = 0; ; i++) { +		ret = uclass_get_device_by_seq(UCLASS_MMC, i, &dev); +		if (ret == -ENODEV) +			break; +	} +	uclass_foreach_dev(dev, uc) { +		ret = device_probe(dev);  		if (ret) -			printf("%s - probe failed: %d\n", m->name, ret); +			printf("%s - probe failed: %d\n", dev->name, ret);  	}  	return 0; | 
