diff options
Diffstat (limited to 'drivers/mmc/core/mmc.c')
| -rw-r--r-- | drivers/mmc/core/mmc.c | 1429 | 
1 files changed, 1242 insertions, 187 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 995261f7fd7..793c6f7ddb0 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -12,6 +12,8 @@  #include <linux/err.h>  #include <linux/slab.h> +#include <linux/stat.h> +#include <linux/pm_runtime.h>  #include <linux/mmc/host.h>  #include <linux/mmc/card.h> @@ -20,6 +22,7 @@  #include "core.h"  #include "bus.h"  #include "mmc_ops.h" +#include "sd_ops.h"  static const unsigned int tran_exp[] = {  	10000,		100000,		1000000,	10000000, @@ -94,13 +97,14 @@ static int mmc_decode_cid(struct mmc_card *card)  		card->cid.prod_name[3]	= UNSTUFF_BITS(resp, 72, 8);  		card->cid.prod_name[4]	= UNSTUFF_BITS(resp, 64, 8);  		card->cid.prod_name[5]	= UNSTUFF_BITS(resp, 56, 8); +		card->cid.prv		= UNSTUFF_BITS(resp, 48, 8);  		card->cid.serial	= UNSTUFF_BITS(resp, 16, 32);  		card->cid.month		= UNSTUFF_BITS(resp, 12, 4);  		card->cid.year		= UNSTUFF_BITS(resp, 8, 4) + 1997;  		break;  	default: -		printk(KERN_ERR "%s: card has unknown MMCA version %d\n", +		pr_err("%s: card has unknown MMCA version %d\n",  			mmc_hostname(card->host), card->csd.mmca_vsn);  		return -EINVAL;  	} @@ -134,7 +138,7 @@ static int mmc_decode_csd(struct mmc_card *card)  	 */  	csd->structure = UNSTUFF_BITS(resp, 126, 2);  	if (csd->structure == 0) { -		printk(KERN_ERR "%s: unrecognised CSD structure version %d\n", +		pr_err("%s: unrecognised CSD structure version %d\n",  			mmc_hostname(card->host), csd->structure);  		return -EINVAL;  	} @@ -173,14 +177,17 @@ static int mmc_decode_csd(struct mmc_card *card)  }  /* - * Read and decode extended CSD. + * Read extended CSD.   */ -static int mmc_read_ext_csd(struct mmc_card *card) +static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)  {  	int err;  	u8 *ext_csd;  	BUG_ON(!card); +	BUG_ON(!new_ext_csd); + +	*new_ext_csd = NULL;  	if (card->csd.mmca_vsn < CSD_SPEC_VER_4)  		return 0; @@ -191,60 +198,144 @@ static int mmc_read_ext_csd(struct mmc_card *card)  	 */  	ext_csd = kmalloc(512, GFP_KERNEL);  	if (!ext_csd) { -		printk(KERN_ERR "%s: could not allocate a buffer to " +		pr_err("%s: could not allocate a buffer to "  			"receive the ext_csd.\n", mmc_hostname(card->host));  		return -ENOMEM;  	}  	err = mmc_send_ext_csd(card, ext_csd);  	if (err) { +		kfree(ext_csd); +		*new_ext_csd = NULL; +  		/* If the host or the card can't do the switch,  		 * fail more gracefully. */  		if ((err != -EINVAL)  		 && (err != -ENOSYS)  		 && (err != -EFAULT)) -			goto out; +			return err;  		/*  		 * High capacity cards should have this "magic" size  		 * stored in their CSD.  		 */  		if (card->csd.capacity == (4096 * 512)) { -			printk(KERN_ERR "%s: unable to read EXT_CSD " +			pr_err("%s: unable to read EXT_CSD "  				"on a possible high capacity card. "  				"Card will be ignored.\n",  				mmc_hostname(card->host));  		} else { -			printk(KERN_WARNING "%s: unable to read " +			pr_warning("%s: unable to read "  				"EXT_CSD, performance might "  				"suffer.\n",  				mmc_hostname(card->host));  			err = 0;  		} +	} else +		*new_ext_csd = ext_csd; -		goto out; +	return err; +} + +static void mmc_select_card_type(struct mmc_card *card) +{ +	struct mmc_host *host = card->host; +	u8 card_type = card->ext_csd.raw_card_type; +	u32 caps = host->caps, caps2 = host->caps2; +	unsigned int hs_max_dtr = 0, hs200_max_dtr = 0; +	unsigned int avail_type = 0; + +	if (caps & MMC_CAP_MMC_HIGHSPEED && +	    card_type & EXT_CSD_CARD_TYPE_HS_26) { +		hs_max_dtr = MMC_HIGH_26_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_HS_26; +	} + +	if (caps & MMC_CAP_MMC_HIGHSPEED && +	    card_type & EXT_CSD_CARD_TYPE_HS_52) { +		hs_max_dtr = MMC_HIGH_52_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_HS_52; +	} + +	if (caps & MMC_CAP_1_8V_DDR && +	    card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) { +		hs_max_dtr = MMC_HIGH_DDR_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_DDR_1_8V; +	} + +	if (caps & MMC_CAP_1_2V_DDR && +	    card_type & EXT_CSD_CARD_TYPE_DDR_1_2V) { +		hs_max_dtr = MMC_HIGH_DDR_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_DDR_1_2V; +	} + +	if (caps2 & MMC_CAP2_HS200_1_8V_SDR && +	    card_type & EXT_CSD_CARD_TYPE_HS200_1_8V) { +		hs200_max_dtr = MMC_HS200_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_HS200_1_8V; +	} + +	if (caps2 & MMC_CAP2_HS200_1_2V_SDR && +	    card_type & EXT_CSD_CARD_TYPE_HS200_1_2V) { +		hs200_max_dtr = MMC_HS200_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_HS200_1_2V; +	} + +	if (caps2 & MMC_CAP2_HS400_1_8V && +	    card_type & EXT_CSD_CARD_TYPE_HS400_1_8V) { +		hs200_max_dtr = MMC_HS200_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_HS400_1_8V; +	} + +	if (caps2 & MMC_CAP2_HS400_1_2V && +	    card_type & EXT_CSD_CARD_TYPE_HS400_1_2V) { +		hs200_max_dtr = MMC_HS200_MAX_DTR; +		avail_type |= EXT_CSD_CARD_TYPE_HS400_1_2V;  	} +	card->ext_csd.hs_max_dtr = hs_max_dtr; +	card->ext_csd.hs200_max_dtr = hs200_max_dtr; +	card->mmc_avail_type = avail_type; +} + +/* + * Decode extended CSD. + */ +static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) +{ +	int err = 0, idx; +	unsigned int part_size; +	u8 hc_erase_grp_sz = 0, hc_wp_grp_sz = 0; + +	BUG_ON(!card); + +	if (!ext_csd) +		return 0; +  	/* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */ +	card->ext_csd.raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE];  	if (card->csd.structure == 3) { -		int ext_csd_struct = ext_csd[EXT_CSD_STRUCTURE]; -		if (ext_csd_struct > 2) { -			printk(KERN_ERR "%s: unrecognised EXT_CSD structure " +		if (card->ext_csd.raw_ext_csd_structure > 2) { +			pr_err("%s: unrecognised EXT_CSD structure "  				"version %d\n", mmc_hostname(card->host), -					ext_csd_struct); +					card->ext_csd.raw_ext_csd_structure);  			err = -EINVAL;  			goto out;  		}  	}  	card->ext_csd.rev = ext_csd[EXT_CSD_REV]; -	if (card->ext_csd.rev > 5) { -		printk(KERN_ERR "%s: unrecognised EXT_CSD revision %d\n", +	if (card->ext_csd.rev > 7) { +		pr_err("%s: unrecognised EXT_CSD revision %d\n",  			mmc_hostname(card->host), card->ext_csd.rev);  		err = -EINVAL;  		goto out;  	} +	card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; +	card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; +	card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; +	card->ext_csd.raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3];  	if (card->ext_csd.rev >= 2) {  		card->ext_csd.sectors =  			ext_csd[EXT_CSD_SEC_CNT + 0] << 0 | @@ -257,37 +348,20 @@ static int mmc_read_ext_csd(struct mmc_card *card)  			mmc_card_set_blockaddr(card);  	} -	switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) { -	case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_52 | -	     EXT_CSD_CARD_TYPE_26: -		card->ext_csd.hs_max_dtr = 52000000; -		card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_52; -		break; -	case EXT_CSD_CARD_TYPE_DDR_1_2V | EXT_CSD_CARD_TYPE_52 | -	     EXT_CSD_CARD_TYPE_26: -		card->ext_csd.hs_max_dtr = 52000000; -		card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_2V; -		break; -	case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_52 | -	     EXT_CSD_CARD_TYPE_26: -		card->ext_csd.hs_max_dtr = 52000000; -		card->ext_csd.card_type = EXT_CSD_CARD_TYPE_DDR_1_8V; -		break; -	case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: -		card->ext_csd.hs_max_dtr = 52000000; -		break; -	case EXT_CSD_CARD_TYPE_26: -		card->ext_csd.hs_max_dtr = 26000000; -		break; -	default: -		/* MMC v4 spec says this cannot happen */ -		printk(KERN_WARNING "%s: card is mmc v4 but doesn't " -			"support any high-speed modes.\n", -			mmc_hostname(card->host)); -	} +	card->ext_csd.raw_card_type = ext_csd[EXT_CSD_CARD_TYPE]; +	mmc_select_card_type(card); +	card->ext_csd.raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT]; +	card->ext_csd.raw_erase_timeout_mult = +		ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]; +	card->ext_csd.raw_hc_erase_grp_size = +		ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];  	if (card->ext_csd.rev >= 3) {  		u8 sa_shift = ext_csd[EXT_CSD_S_A_TIMEOUT]; +		card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; + +		/* EXT_CSD value is in units of 10ms, but we store in ms */ +		card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME];  		/* Sleep / awake timeout in 100ns units */  		if (sa_shift > 0 && sa_shift <= 0x17) @@ -299,9 +373,110 @@ static int mmc_read_ext_csd(struct mmc_card *card)  			ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];  		card->ext_csd.hc_erase_size =  			ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] << 10; + +		card->ext_csd.rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C]; + +		/* +		 * There are two boot regions of equal size, defined in +		 * multiples of 128K. +		 */ +		if (ext_csd[EXT_CSD_BOOT_MULT] && mmc_boot_partition_access(card->host)) { +			for (idx = 0; idx < MMC_NUM_BOOT_PARTITION; idx++) { +				part_size = ext_csd[EXT_CSD_BOOT_MULT] << 17; +				mmc_part_add(card, part_size, +					EXT_CSD_PART_CONFIG_ACC_BOOT0 + idx, +					"boot%d", idx, true, +					MMC_BLK_DATA_AREA_BOOT); +			} +		}  	} +	card->ext_csd.raw_hc_erase_gap_size = +		ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; +	card->ext_csd.raw_sec_trim_mult = +		ext_csd[EXT_CSD_SEC_TRIM_MULT]; +	card->ext_csd.raw_sec_erase_mult = +		ext_csd[EXT_CSD_SEC_ERASE_MULT]; +	card->ext_csd.raw_sec_feature_support = +		ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]; +	card->ext_csd.raw_trim_mult = +		ext_csd[EXT_CSD_TRIM_MULT]; +	card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT];  	if (card->ext_csd.rev >= 4) { +		/* +		 * Enhanced area feature support -- check whether the eMMC +		 * card has the Enhanced area enabled.  If so, export enhanced +		 * area offset and size to user by adding sysfs interface. +		 */ +		if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && +		    (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) { +			hc_erase_grp_sz = +				ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; +			hc_wp_grp_sz = +				ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; + +			card->ext_csd.enhanced_area_en = 1; +			/* +			 * calculate the enhanced data area offset, in bytes +			 */ +			card->ext_csd.enhanced_area_offset = +				(ext_csd[139] << 24) + (ext_csd[138] << 16) + +				(ext_csd[137] << 8) + ext_csd[136]; +			if (mmc_card_blockaddr(card)) +				card->ext_csd.enhanced_area_offset <<= 9; +			/* +			 * calculate the enhanced data area size, in kilobytes +			 */ +			card->ext_csd.enhanced_area_size = +				(ext_csd[142] << 16) + (ext_csd[141] << 8) + +				ext_csd[140]; +			card->ext_csd.enhanced_area_size *= +				(size_t)(hc_erase_grp_sz * hc_wp_grp_sz); +			card->ext_csd.enhanced_area_size <<= 9; +		} else { +			/* +			 * If the enhanced area is not enabled, disable these +			 * device attributes. +			 */ +			card->ext_csd.enhanced_area_offset = -EINVAL; +			card->ext_csd.enhanced_area_size = -EINVAL; +		} + +		/* +		 * General purpose partition feature support -- +		 * If ext_csd has the size of general purpose partitions, +		 * set size, part_cfg, partition name in mmc_part. +		 */ +		if (ext_csd[EXT_CSD_PARTITION_SUPPORT] & +			EXT_CSD_PART_SUPPORT_PART_EN) { +			if (card->ext_csd.enhanced_area_en != 1) { +				hc_erase_grp_sz = +					ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]; +				hc_wp_grp_sz = +					ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; + +				card->ext_csd.enhanced_area_en = 1; +			} + +			for (idx = 0; idx < MMC_NUM_GP_PARTITION; idx++) { +				if (!ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3] && +				!ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1] && +				!ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2]) +					continue; +				part_size = +				(ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 2] +					<< 16) + +				(ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1] +					<< 8) + +				ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3]; +				part_size *= (size_t)(hc_erase_grp_sz * +					hc_wp_grp_sz); +				mmc_part_add(card, part_size << 19, +					EXT_CSD_PART_CONFIG_ACC_GP0 + idx, +					"gp%d", idx, false, +					MMC_BLK_DATA_AREA_GP); +			} +		}  		card->ext_csd.sec_trim_mult =  			ext_csd[EXT_CSD_SEC_TRIM_MULT];  		card->ext_csd.sec_erase_mult = @@ -310,16 +485,209 @@ static int mmc_read_ext_csd(struct mmc_card *card)  			ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];  		card->ext_csd.trim_timeout = 300 *  			ext_csd[EXT_CSD_TRIM_MULT]; + +		/* +		 * Note that the call to mmc_part_add above defaults to read +		 * only. If this default assumption is changed, the call must +		 * take into account the value of boot_locked below. +		 */ +		card->ext_csd.boot_ro_lock = ext_csd[EXT_CSD_BOOT_WP]; +		card->ext_csd.boot_ro_lockable = true; + +		/* Save power class values */ +		card->ext_csd.raw_pwr_cl_52_195 = +			ext_csd[EXT_CSD_PWR_CL_52_195]; +		card->ext_csd.raw_pwr_cl_26_195 = +			ext_csd[EXT_CSD_PWR_CL_26_195]; +		card->ext_csd.raw_pwr_cl_52_360 = +			ext_csd[EXT_CSD_PWR_CL_52_360]; +		card->ext_csd.raw_pwr_cl_26_360 = +			ext_csd[EXT_CSD_PWR_CL_26_360]; +		card->ext_csd.raw_pwr_cl_200_195 = +			ext_csd[EXT_CSD_PWR_CL_200_195]; +		card->ext_csd.raw_pwr_cl_200_360 = +			ext_csd[EXT_CSD_PWR_CL_200_360]; +		card->ext_csd.raw_pwr_cl_ddr_52_195 = +			ext_csd[EXT_CSD_PWR_CL_DDR_52_195]; +		card->ext_csd.raw_pwr_cl_ddr_52_360 = +			ext_csd[EXT_CSD_PWR_CL_DDR_52_360]; +		card->ext_csd.raw_pwr_cl_ddr_200_360 = +			ext_csd[EXT_CSD_PWR_CL_DDR_200_360]; +	} + +	if (card->ext_csd.rev >= 5) { +		/* Adjust production date as per JEDEC JESD84-B451 */ +		if (card->cid.year < 2010) +			card->cid.year += 16; + +		/* check whether the eMMC card supports BKOPS */ +		if (ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1) { +			card->ext_csd.bkops = 1; +			card->ext_csd.bkops_en = ext_csd[EXT_CSD_BKOPS_EN]; +			card->ext_csd.raw_bkops_status = +				ext_csd[EXT_CSD_BKOPS_STATUS]; +			if (!card->ext_csd.bkops_en) +				pr_info("%s: BKOPS_EN bit is not set\n", +					mmc_hostname(card->host)); +		} + +		/* check whether the eMMC card supports HPI */ +		if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x1) { +			card->ext_csd.hpi = 1; +			if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x2) +				card->ext_csd.hpi_cmd =	MMC_STOP_TRANSMISSION; +			else +				card->ext_csd.hpi_cmd = MMC_SEND_STATUS; +			/* +			 * Indicate the maximum timeout to close +			 * a command interrupted by HPI +			 */ +			card->ext_csd.out_of_int_time = +				ext_csd[EXT_CSD_OUT_OF_INTERRUPT_TIME] * 10; +		} + +		card->ext_csd.rel_param = ext_csd[EXT_CSD_WR_REL_PARAM]; +		card->ext_csd.rst_n_function = ext_csd[EXT_CSD_RST_N_FUNCTION]; + +		/* +		 * RPMB regions are defined in multiples of 128K. +		 */ +		card->ext_csd.raw_rpmb_size_mult = ext_csd[EXT_CSD_RPMB_MULT]; +		if (ext_csd[EXT_CSD_RPMB_MULT] && mmc_host_cmd23(card->host)) { +			mmc_part_add(card, ext_csd[EXT_CSD_RPMB_MULT] << 17, +				EXT_CSD_PART_CONFIG_ACC_RPMB, +				"rpmb", 0, false, +				MMC_BLK_DATA_AREA_RPMB); +		}  	} +	card->ext_csd.raw_erased_mem_count = ext_csd[EXT_CSD_ERASED_MEM_CONT];  	if (ext_csd[EXT_CSD_ERASED_MEM_CONT])  		card->erased_byte = 0xFF;  	else  		card->erased_byte = 0x0; +	/* eMMC v4.5 or later */ +	if (card->ext_csd.rev >= 6) { +		card->ext_csd.feature_support |= MMC_DISCARD_FEATURE; + +		card->ext_csd.generic_cmd6_time = 10 * +			ext_csd[EXT_CSD_GENERIC_CMD6_TIME]; +		card->ext_csd.power_off_longtime = 10 * +			ext_csd[EXT_CSD_POWER_OFF_LONG_TIME]; + +		card->ext_csd.cache_size = +			ext_csd[EXT_CSD_CACHE_SIZE + 0] << 0 | +			ext_csd[EXT_CSD_CACHE_SIZE + 1] << 8 | +			ext_csd[EXT_CSD_CACHE_SIZE + 2] << 16 | +			ext_csd[EXT_CSD_CACHE_SIZE + 3] << 24; + +		if (ext_csd[EXT_CSD_DATA_SECTOR_SIZE] == 1) +			card->ext_csd.data_sector_size = 4096; +		else +			card->ext_csd.data_sector_size = 512; + +		if ((ext_csd[EXT_CSD_DATA_TAG_SUPPORT] & 1) && +		    (ext_csd[EXT_CSD_TAG_UNIT_SIZE] <= 8)) { +			card->ext_csd.data_tag_unit_size = +			((unsigned int) 1 << ext_csd[EXT_CSD_TAG_UNIT_SIZE]) * +			(card->ext_csd.data_sector_size); +		} else { +			card->ext_csd.data_tag_unit_size = 0; +		} + +		card->ext_csd.max_packed_writes = +			ext_csd[EXT_CSD_MAX_PACKED_WRITES]; +		card->ext_csd.max_packed_reads = +			ext_csd[EXT_CSD_MAX_PACKED_READS]; +	} else { +		card->ext_csd.data_sector_size = 512; +	} +  out: +	return err; +} + +static inline void mmc_free_ext_csd(u8 *ext_csd) +{  	kfree(ext_csd); +} + +static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width) +{ +	u8 *bw_ext_csd; +	int err; + +	if (bus_width == MMC_BUS_WIDTH_1) +		return 0; + +	err = mmc_get_ext_csd(card, &bw_ext_csd); + +	if (err || bw_ext_csd == NULL) { +		err = -EINVAL; +		goto out; +	} + +	/* only compare read only fields */ +	err = !((card->ext_csd.raw_partition_support == +			bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && +		(card->ext_csd.raw_erased_mem_count == +			bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && +		(card->ext_csd.rev == +			bw_ext_csd[EXT_CSD_REV]) && +		(card->ext_csd.raw_ext_csd_structure == +			bw_ext_csd[EXT_CSD_STRUCTURE]) && +		(card->ext_csd.raw_card_type == +			bw_ext_csd[EXT_CSD_CARD_TYPE]) && +		(card->ext_csd.raw_s_a_timeout == +			bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) && +		(card->ext_csd.raw_hc_erase_gap_size == +			bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) && +		(card->ext_csd.raw_erase_timeout_mult == +			bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) && +		(card->ext_csd.raw_hc_erase_grp_size == +			bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) && +		(card->ext_csd.raw_sec_trim_mult == +			bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) && +		(card->ext_csd.raw_sec_erase_mult == +			bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) && +		(card->ext_csd.raw_sec_feature_support == +			bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) && +		(card->ext_csd.raw_trim_mult == +			bw_ext_csd[EXT_CSD_TRIM_MULT]) && +		(card->ext_csd.raw_sectors[0] == +			bw_ext_csd[EXT_CSD_SEC_CNT + 0]) && +		(card->ext_csd.raw_sectors[1] == +			bw_ext_csd[EXT_CSD_SEC_CNT + 1]) && +		(card->ext_csd.raw_sectors[2] == +			bw_ext_csd[EXT_CSD_SEC_CNT + 2]) && +		(card->ext_csd.raw_sectors[3] == +			bw_ext_csd[EXT_CSD_SEC_CNT + 3]) && +		(card->ext_csd.raw_pwr_cl_52_195 == +			bw_ext_csd[EXT_CSD_PWR_CL_52_195]) && +		(card->ext_csd.raw_pwr_cl_26_195 == +			bw_ext_csd[EXT_CSD_PWR_CL_26_195]) && +		(card->ext_csd.raw_pwr_cl_52_360 == +			bw_ext_csd[EXT_CSD_PWR_CL_52_360]) && +		(card->ext_csd.raw_pwr_cl_26_360 == +			bw_ext_csd[EXT_CSD_PWR_CL_26_360]) && +		(card->ext_csd.raw_pwr_cl_200_195 == +			bw_ext_csd[EXT_CSD_PWR_CL_200_195]) && +		(card->ext_csd.raw_pwr_cl_200_360 == +			bw_ext_csd[EXT_CSD_PWR_CL_200_360]) && +		(card->ext_csd.raw_pwr_cl_ddr_52_195 == +			bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) && +		(card->ext_csd.raw_pwr_cl_ddr_52_360 == +			bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) && +		(card->ext_csd.raw_pwr_cl_ddr_200_360 == +			bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360])); + +	if (err) +		err = -EINVAL; + +out: +	mmc_free_ext_csd(bw_ext_csd);  	return err;  } @@ -335,7 +703,13 @@ MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);  MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);  MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);  MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid); +MMC_DEV_ATTR(prv, "0x%x\n", card->cid.prv);  MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); +MMC_DEV_ATTR(enhanced_area_offset, "%llu\n", +		card->ext_csd.enhanced_area_offset); +MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size); +MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); +MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors);  static struct attribute *mmc_std_attrs[] = {  	&dev_attr_cid.attr, @@ -348,22 +722,450 @@ static struct attribute *mmc_std_attrs[] = {  	&dev_attr_manfid.attr,  	&dev_attr_name.attr,  	&dev_attr_oemid.attr, +	&dev_attr_prv.attr,  	&dev_attr_serial.attr, +	&dev_attr_enhanced_area_offset.attr, +	&dev_attr_enhanced_area_size.attr, +	&dev_attr_raw_rpmb_size_mult.attr, +	&dev_attr_rel_sectors.attr,  	NULL,  }; +ATTRIBUTE_GROUPS(mmc_std); -static struct attribute_group mmc_std_attr_group = { -	.attrs = mmc_std_attrs, +static struct device_type mmc_type = { +	.groups = mmc_std_groups,  }; -static const struct attribute_group *mmc_attr_groups[] = { -	&mmc_std_attr_group, -	NULL, -}; +/* + * Select the PowerClass for the current bus width + * If power class is defined for 4/8 bit bus in the + * extended CSD register, select it by executing the + * mmc_switch command. + */ +static int __mmc_select_powerclass(struct mmc_card *card, +				   unsigned int bus_width) +{ +	struct mmc_host *host = card->host; +	struct mmc_ext_csd *ext_csd = &card->ext_csd; +	unsigned int pwrclass_val = 0; +	int err = 0; -static struct device_type mmc_type = { -	.groups = mmc_attr_groups, -}; +	/* Power class selection is supported for versions >= 4.0 */ +	if (card->csd.mmca_vsn < CSD_SPEC_VER_4) +		return 0; + +	/* Power class values are defined only for 4/8 bit bus */ +	if (bus_width == EXT_CSD_BUS_WIDTH_1) +		return 0; + +	switch (1 << host->ios.vdd) { +	case MMC_VDD_165_195: +		if (host->ios.clock <= MMC_HIGH_26_MAX_DTR) +			pwrclass_val = ext_csd->raw_pwr_cl_26_195; +		else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR) +			pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ? +				ext_csd->raw_pwr_cl_52_195 : +				ext_csd->raw_pwr_cl_ddr_52_195; +		else if (host->ios.clock <= MMC_HS200_MAX_DTR) +			pwrclass_val = ext_csd->raw_pwr_cl_200_195; +		break; +	case MMC_VDD_27_28: +	case MMC_VDD_28_29: +	case MMC_VDD_29_30: +	case MMC_VDD_30_31: +	case MMC_VDD_31_32: +	case MMC_VDD_32_33: +	case MMC_VDD_33_34: +	case MMC_VDD_34_35: +	case MMC_VDD_35_36: +		if (host->ios.clock <= MMC_HIGH_26_MAX_DTR) +			pwrclass_val = ext_csd->raw_pwr_cl_26_360; +		else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR) +			pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ? +				ext_csd->raw_pwr_cl_52_360 : +				ext_csd->raw_pwr_cl_ddr_52_360; +		else if (host->ios.clock <= MMC_HS200_MAX_DTR) +			pwrclass_val = (bus_width == EXT_CSD_DDR_BUS_WIDTH_8) ? +				ext_csd->raw_pwr_cl_ddr_200_360 : +				ext_csd->raw_pwr_cl_200_360; +		break; +	default: +		pr_warning("%s: Voltage range not supported " +			   "for power class.\n", mmc_hostname(host)); +		return -EINVAL; +	} + +	if (bus_width & (EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_BUS_WIDTH_8)) +		pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_8BIT_MASK) >> +				EXT_CSD_PWR_CL_8BIT_SHIFT; +	else +		pwrclass_val = (pwrclass_val & EXT_CSD_PWR_CL_4BIT_MASK) >> +				EXT_CSD_PWR_CL_4BIT_SHIFT; + +	/* If the power class is different from the default value */ +	if (pwrclass_val > 0) { +		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +				 EXT_CSD_POWER_CLASS, +				 pwrclass_val, +				 card->ext_csd.generic_cmd6_time); +	} + +	return err; +} + +static int mmc_select_powerclass(struct mmc_card *card) +{ +	struct mmc_host *host = card->host; +	u32 bus_width, ext_csd_bits; +	int err, ddr; + +	/* Power class selection is supported for versions >= 4.0 */ +	if (card->csd.mmca_vsn < CSD_SPEC_VER_4) +		return 0; + +	bus_width = host->ios.bus_width; +	/* Power class values are defined only for 4/8 bit bus */ +	if (bus_width == MMC_BUS_WIDTH_1) +		return 0; + +	ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52; +	if (ddr) +		ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? +			EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4; +	else +		ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? +			EXT_CSD_BUS_WIDTH_8 :  EXT_CSD_BUS_WIDTH_4; + +	err = __mmc_select_powerclass(card, ext_csd_bits); +	if (err) +		pr_warn("%s: power class selection to bus width %d ddr %d failed\n", +			mmc_hostname(host), 1 << bus_width, ddr); + +	return err; +} + +/* + * Set the bus speed for the selected speed mode. + */ +static void mmc_set_bus_speed(struct mmc_card *card) +{ +	unsigned int max_dtr = (unsigned int)-1; + +	if ((mmc_card_hs200(card) || mmc_card_hs400(card)) && +	     max_dtr > card->ext_csd.hs200_max_dtr) +		max_dtr = card->ext_csd.hs200_max_dtr; +	else if (mmc_card_hs(card) && max_dtr > card->ext_csd.hs_max_dtr) +		max_dtr = card->ext_csd.hs_max_dtr; +	else if (max_dtr > card->csd.max_dtr) +		max_dtr = card->csd.max_dtr; + +	mmc_set_clock(card->host, max_dtr); +} + +/* + * Select the bus width amoung 4-bit and 8-bit(SDR). + * If the bus width is changed successfully, return the selected width value. + * Zero is returned instead of error value if the wide width is not supported. + */ +static int mmc_select_bus_width(struct mmc_card *card) +{ +	static unsigned ext_csd_bits[] = { +		EXT_CSD_BUS_WIDTH_8, +		EXT_CSD_BUS_WIDTH_4, +	}; +	static unsigned bus_widths[] = { +		MMC_BUS_WIDTH_8, +		MMC_BUS_WIDTH_4, +	}; +	struct mmc_host *host = card->host; +	unsigned idx, bus_width = 0; +	int err = 0; + +	if ((card->csd.mmca_vsn < CSD_SPEC_VER_4) && +	    !(host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) +		return 0; + +	idx = (host->caps & MMC_CAP_8_BIT_DATA) ? 0 : 1; + +	/* +	 * Unlike SD, MMC cards dont have a configuration register to notify +	 * supported bus width. So bus test command should be run to identify +	 * the supported bus width or compare the ext csd values of current +	 * bus width and ext csd values of 1 bit mode read earlier. +	 */ +	for (; idx < ARRAY_SIZE(bus_widths); idx++) { +		/* +		 * Host is capable of 8bit transfer, then switch +		 * the device to work in 8bit transfer mode. If the +		 * mmc switch command returns error then switch to +		 * 4bit transfer mode. On success set the corresponding +		 * bus width on the host. +		 */ +		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +				 EXT_CSD_BUS_WIDTH, +				 ext_csd_bits[idx], +				 card->ext_csd.generic_cmd6_time); +		if (err) +			continue; + +		bus_width = bus_widths[idx]; +		mmc_set_bus_width(host, bus_width); + +		/* +		 * If controller can't handle bus width test, +		 * compare ext_csd previously read in 1 bit mode +		 * against ext_csd at new bus width +		 */ +		if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST)) +			err = mmc_compare_ext_csds(card, bus_width); +		else +			err = mmc_bus_test(card, bus_width); + +		if (!err) { +			err = bus_width; +			break; +		} else { +			pr_warn("%s: switch to bus width %d failed\n", +				mmc_hostname(host), ext_csd_bits[idx]); +		} +	} + +	return err; +} + +/* + * Switch to the high-speed mode + */ +static int mmc_select_hs(struct mmc_card *card) +{ +	int err; + +	err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +			   EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, +			   card->ext_csd.generic_cmd6_time, +			   true, true, true); +	if (!err) +		mmc_set_timing(card->host, MMC_TIMING_MMC_HS); + +	return err; +} + +/* + * Activate wide bus and DDR if supported. + */ +static int mmc_select_hs_ddr(struct mmc_card *card) +{ +	struct mmc_host *host = card->host; +	u32 bus_width, ext_csd_bits; +	int err = 0; + +	if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52)) +		return 0; + +	bus_width = host->ios.bus_width; +	if (bus_width == MMC_BUS_WIDTH_1) +		return 0; + +	ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? +		EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4; + +	err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +			EXT_CSD_BUS_WIDTH, +			ext_csd_bits, +			card->ext_csd.generic_cmd6_time); +	if (err) { +		pr_warn("%s: switch to bus width %d ddr failed\n", +			mmc_hostname(host), 1 << bus_width); +		return err; +	} + +	/* +	 * eMMC cards can support 3.3V to 1.2V i/o (vccq) +	 * signaling. +	 * +	 * EXT_CSD_CARD_TYPE_DDR_1_8V means 3.3V or 1.8V vccq. +	 * +	 * 1.8V vccq at 3.3V core voltage (vcc) is not required +	 * in the JEDEC spec for DDR. +	 * +	 * Do not force change in vccq since we are obviously +	 * working and no change to vccq is needed. +	 * +	 * WARNING: eMMC rules are NOT the same as SD DDR +	 */ +	if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_1_2V) { +		err = __mmc_set_signal_voltage(host, +				MMC_SIGNAL_VOLTAGE_120); +		if (err) +			return err; +	} + +	mmc_set_timing(host, MMC_TIMING_MMC_DDR52); + +	return err; +} + +static int mmc_select_hs400(struct mmc_card *card) +{ +	struct mmc_host *host = card->host; +	int err = 0; + +	/* +	 * HS400 mode requires 8-bit bus width +	 */ +	if (!(card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && +	      host->ios.bus_width == MMC_BUS_WIDTH_8)) +		return 0; + +	/* +	 * Before switching to dual data rate operation for HS400, +	 * it is required to convert from HS200 mode to HS mode. +	 */ +	mmc_set_timing(card->host, MMC_TIMING_MMC_HS); +	mmc_set_bus_speed(card); + +	err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +			   EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, +			   card->ext_csd.generic_cmd6_time, +			   true, true, true); +	if (err) { +		pr_warn("%s: switch to high-speed from hs200 failed, err:%d\n", +			mmc_hostname(host), err); +		return err; +	} + +	err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +			 EXT_CSD_BUS_WIDTH, +			 EXT_CSD_DDR_BUS_WIDTH_8, +			 card->ext_csd.generic_cmd6_time); +	if (err) { +		pr_warn("%s: switch to bus width for hs400 failed, err:%d\n", +			mmc_hostname(host), err); +		return err; +	} + +	err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +			   EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400, +			   card->ext_csd.generic_cmd6_time, +			   true, true, true); +	if (err) { +		pr_warn("%s: switch to hs400 failed, err:%d\n", +			 mmc_hostname(host), err); +		return err; +	} + +	mmc_set_timing(host, MMC_TIMING_MMC_HS400); +	mmc_set_bus_speed(card); + +	return 0; +} + +/* + * For device supporting HS200 mode, the following sequence + * should be done before executing the tuning process. + * 1. set the desired bus width(4-bit or 8-bit, 1-bit is not supported) + * 2. switch to HS200 mode + * 3. set the clock to > 52Mhz and <=200MHz + */ +static int mmc_select_hs200(struct mmc_card *card) +{ +	struct mmc_host *host = card->host; +	int err = -EINVAL; + +	if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V) +		err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120); + +	if (err && card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_8V) +		err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180); + +	/* If fails try again during next card power cycle */ +	if (err) +		goto err; + +	/* +	 * Set the bus width(4 or 8) with host's support and +	 * switch to HS200 mode if bus width is set successfully. +	 */ +	err = mmc_select_bus_width(card); +	if (!IS_ERR_VALUE(err)) { +		err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +				   EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200, +				   card->ext_csd.generic_cmd6_time, +				   true, true, true); +		if (!err) +			mmc_set_timing(host, MMC_TIMING_MMC_HS200); +	} +err: +	return err; +} + +/* + * Activate High Speed or HS200 mode if supported. + */ +static int mmc_select_timing(struct mmc_card *card) +{ +	int err = 0; + +	if ((card->csd.mmca_vsn < CSD_SPEC_VER_4 && +	     card->ext_csd.hs_max_dtr == 0)) +		goto bus_speed; + +	if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200) +		err = mmc_select_hs200(card); +	else if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS) +		err = mmc_select_hs(card); + +	if (err && err != -EBADMSG) +		return err; + +	if (err) { +		pr_warn("%s: switch to %s failed\n", +			mmc_card_hs(card) ? "high-speed" : +			(mmc_card_hs200(card) ? "hs200" : ""), +			mmc_hostname(card->host)); +		err = 0; +	} + +bus_speed: +	/* +	 * Set the bus speed to the selected bus timing. +	 * If timing is not selected, backward compatible is the default. +	 */ +	mmc_set_bus_speed(card); +	return err; +} + +/* + * Execute tuning sequence to seek the proper bus operating + * conditions for HS200 and HS400, which sends CMD21 to the device. + */ +static int mmc_hs200_tuning(struct mmc_card *card) +{ +	struct mmc_host *host = card->host; +	int err = 0; + +	/* +	 * Timing should be adjusted to the HS400 target +	 * operation frequency for tuning process +	 */ +	if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS400 && +	    host->ios.bus_width == MMC_BUS_WIDTH_8) +		if (host->ops->prepare_hs400_tuning) +			host->ops->prepare_hs400_tuning(host, &host->ios); + +	if (host->ops->execute_tuning) { +		mmc_host_clk_hold(host); +		err = host->ops->execute_tuning(host, +				MMC_SEND_TUNING_BLOCK_HS200); +		mmc_host_clk_release(host); + +		if (err) +			pr_warn("%s: tuning execution failed\n", +				mmc_hostname(host)); +	} + +	return err; +}  /*   * Handle the detection and initialisation of a card. @@ -375,23 +1177,29 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  	struct mmc_card *oldcard)  {  	struct mmc_card *card; -	int err, ddr = MMC_SDR_MODE; +	int err;  	u32 cid[4]; -	unsigned int max_dtr; +	u32 rocr; +	u8 *ext_csd = NULL;  	BUG_ON(!host);  	WARN_ON(!host->claimed); +	/* Set correct bus mode for MMC before attempting init */ +	if (!mmc_host_is_spi(host)) +		mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); +  	/*  	 * Since we're changing the OCR value, we seem to  	 * need to tell some cards to go back to the idle  	 * state.  We wait 1ms to give cards time to  	 * respond. +	 * mmc_go_idle is needed for eMMC that are asleep  	 */  	mmc_go_idle(host);  	/* The extra bit indicates that we support high capacity */ -	err = mmc_send_op_cond(host, ocr | (1 << 30), NULL); +	err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);  	if (err)  		goto err; @@ -431,6 +1239,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  			goto err;  		} +		card->ocr = ocr;  		card->type = MMC_TYPE_MMC;  		card->rca = 1;  		memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); @@ -476,106 +1285,274 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  		/*  		 * Fetch and process extended CSD.  		 */ -		err = mmc_read_ext_csd(card); + +		err = mmc_get_ext_csd(card, &ext_csd); +		if (err) +			goto free_card; +		err = mmc_read_ext_csd(card, ext_csd);  		if (err)  			goto free_card; + +		/* If doing byte addressing, check if required to do sector +		 * addressing.  Handle the case of <2GB cards needing sector +		 * addressing.  See section 8.1 JEDEC Standard JED84-A441; +		 * ocr register has bit 30 set for sector addressing. +		 */ +		if (!(mmc_card_blockaddr(card)) && (rocr & (1<<30))) +			mmc_card_set_blockaddr(card); +  		/* Erase size depends on CSD and Extended CSD */  		mmc_set_erase_size(card);  	}  	/* -	 * Activate high speed (if supported) +	 * If enhanced_area_en is TRUE, host needs to enable ERASE_GRP_DEF +	 * bit.  This bit will be lost every time after a reset or power off.  	 */ -	if ((card->ext_csd.hs_max_dtr != 0) && -		(host->caps & MMC_CAP_MMC_HIGHSPEED)) { +	if (card->ext_csd.enhanced_area_en || +	    (card->ext_csd.rev >= 3 && (host->caps2 & MMC_CAP2_HC_ERASE_SZ))) {  		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, -			EXT_CSD_HS_TIMING, 1); +				 EXT_CSD_ERASE_GROUP_DEF, 1, +				 card->ext_csd.generic_cmd6_time); +  		if (err && err != -EBADMSG)  			goto free_card;  		if (err) { -			printk(KERN_WARNING "%s: switch to highspeed failed\n", -			       mmc_hostname(card->host));  			err = 0; +			/* +			 * Just disable enhanced area off & sz +			 * will try to enable ERASE_GROUP_DEF +			 * during next time reinit +			 */ +			card->ext_csd.enhanced_area_offset = -EINVAL; +			card->ext_csd.enhanced_area_size = -EINVAL;  		} else { -			mmc_card_set_highspeed(card); -			mmc_set_timing(card->host, MMC_TIMING_MMC_HS); +			card->ext_csd.erase_group_def = 1; +			/* +			 * enable ERASE_GRP_DEF successfully. +			 * This will affect the erase size, so +			 * here need to reset erase size +			 */ +			mmc_set_erase_size(card);  		}  	}  	/* -	 * Compute bus speed. +	 * Ensure eMMC user default partition is enabled  	 */ -	max_dtr = (unsigned int)-1; +	if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) { +		card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; +		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, +				 card->ext_csd.part_config, +				 card->ext_csd.part_time); +		if (err && err != -EBADMSG) +			goto free_card; +	} -	if (mmc_card_highspeed(card)) { -		if (max_dtr > card->ext_csd.hs_max_dtr) -			max_dtr = card->ext_csd.hs_max_dtr; -	} else if (max_dtr > card->csd.max_dtr) { -		max_dtr = card->csd.max_dtr; +	/* +	 * Enable power_off_notification byte in the ext_csd register +	 */ +	if (card->ext_csd.rev >= 6) { +		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +				 EXT_CSD_POWER_OFF_NOTIFICATION, +				 EXT_CSD_POWER_ON, +				 card->ext_csd.generic_cmd6_time); +		if (err && err != -EBADMSG) +			goto free_card; + +		/* +		 * The err can be -EBADMSG or 0, +		 * so check for success and update the flag +		 */ +		if (!err) +			card->ext_csd.power_off_notification = EXT_CSD_POWER_ON; +	} + +	/* +	 * Select timing interface +	 */ +	err = mmc_select_timing(card); +	if (err) +		goto free_card; + +	if (mmc_card_hs200(card)) { +		err = mmc_hs200_tuning(card); +		if (err) +			goto err; + +		err = mmc_select_hs400(card); +		if (err) +			goto err; +	} else if (mmc_card_hs(card)) { +		/* Select the desired bus width optionally */ +		err = mmc_select_bus_width(card); +		if (!IS_ERR_VALUE(err)) { +			err = mmc_select_hs_ddr(card); +			if (err) +				goto err; +		}  	} -	mmc_set_clock(host, max_dtr); +	/* +	 * Choose the power class with selected bus interface +	 */ +	mmc_select_powerclass(card);  	/* -	 * Indicate DDR mode (if supported). +	 * Enable HPI feature (if supported)  	 */ -	if (mmc_card_highspeed(card)) { -		if ((card->ext_csd.card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) -			&& (host->caps & (MMC_CAP_1_8V_DDR))) -				ddr = MMC_1_8V_DDR_MODE; -		else if ((card->ext_csd.card_type & EXT_CSD_CARD_TYPE_DDR_1_2V) -			&& (host->caps & (MMC_CAP_1_2V_DDR))) -				ddr = MMC_1_2V_DDR_MODE; +	if (card->ext_csd.hpi) { +		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +				EXT_CSD_HPI_MGMT, 1, +				card->ext_csd.generic_cmd6_time); +		if (err && err != -EBADMSG) +			goto free_card; +		if (err) { +			pr_warning("%s: Enabling HPI failed\n", +				   mmc_hostname(card->host)); +			err = 0; +		} else +			card->ext_csd.hpi_en = 1;  	}  	/* -	 * Activate wide bus and DDR (if supported). +	 * If cache size is higher than 0, this indicates +	 * the existence of cache and it can be turned on.  	 */ -	if ((card->csd.mmca_vsn >= CSD_SPEC_VER_4) && -	    (host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) { -		unsigned ext_csd_bit, bus_width; +	if (card->ext_csd.cache_size > 0) { +		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +				EXT_CSD_CACHE_CTRL, 1, +				card->ext_csd.generic_cmd6_time); +		if (err && err != -EBADMSG) +			goto free_card; -		if (host->caps & MMC_CAP_8_BIT_DATA) { -			if (ddr) -				ext_csd_bit = EXT_CSD_DDR_BUS_WIDTH_8; -			else -				ext_csd_bit = EXT_CSD_BUS_WIDTH_8; -			bus_width = MMC_BUS_WIDTH_8; +		/* +		 * Only if no error, cache is turned on successfully. +		 */ +		if (err) { +			pr_warning("%s: Cache is supported, " +					"but failed to turn on (%d)\n", +					mmc_hostname(card->host), err); +			card->ext_csd.cache_ctrl = 0; +			err = 0;  		} else { -			if (ddr) -				ext_csd_bit = EXT_CSD_DDR_BUS_WIDTH_4; -			else -				ext_csd_bit = EXT_CSD_BUS_WIDTH_4; -			bus_width = MMC_BUS_WIDTH_4; +			card->ext_csd.cache_ctrl = 1;  		} +	} +	/* +	 * The mandatory minimum values are defined for packed command. +	 * read: 5, write: 3 +	 */ +	if (card->ext_csd.max_packed_writes >= 3 && +	    card->ext_csd.max_packed_reads >= 5 && +	    host->caps2 & MMC_CAP2_PACKED_CMD) {  		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, -				 EXT_CSD_BUS_WIDTH, ext_csd_bit); - +				EXT_CSD_EXP_EVENTS_CTRL, +				EXT_CSD_PACKED_EVENT_EN, +				card->ext_csd.generic_cmd6_time);  		if (err && err != -EBADMSG)  			goto free_card; -  		if (err) { -			printk(KERN_WARNING "%s: switch to bus width %d ddr %d " -			       "failed\n", mmc_hostname(card->host), -			       1 << bus_width, ddr); +			pr_warn("%s: Enabling packed event failed\n", +				mmc_hostname(card->host)); +			card->ext_csd.packed_event_en = 0;  			err = 0;  		} else { -			mmc_card_set_ddr_mode(card); -			mmc_set_bus_width_ddr(card->host, bus_width, ddr); +			card->ext_csd.packed_event_en = 1;  		}  	}  	if (!oldcard)  		host->card = card; +	mmc_free_ext_csd(ext_csd);  	return 0;  free_card:  	if (!oldcard)  		mmc_remove_card(card);  err: +	mmc_free_ext_csd(ext_csd); + +	return err; +} + +static int mmc_can_sleep(struct mmc_card *card) +{ +	return (card && card->ext_csd.rev >= 3); +} + +static int mmc_sleep(struct mmc_host *host) +{ +	struct mmc_command cmd = {0}; +	struct mmc_card *card = host->card; +	unsigned int timeout_ms = DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000); +	int err; + +	err = mmc_deselect_cards(host); +	if (err) +		return err; + +	cmd.opcode = MMC_SLEEP_AWAKE; +	cmd.arg = card->rca << 16; +	cmd.arg |= 1 << 15; + +	/* +	 * If the max_busy_timeout of the host is specified, validate it against +	 * the sleep cmd timeout. A failure means we need to prevent the host +	 * from doing hw busy detection, which is done by converting to a R1 +	 * response instead of a R1B. +	 */ +	if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) { +		cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; +	} else { +		cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; +		cmd.busy_timeout = timeout_ms; +	} + +	err = mmc_wait_for_cmd(host, &cmd, 0); +	if (err) +		return err; + +	/* +	 * If the host does not wait while the card signals busy, then we will +	 * will have to wait the sleep/awake timeout.  Note, we cannot use the +	 * SEND_STATUS command to poll the status because that command (and most +	 * others) is invalid while the card sleeps. +	 */ +	if (!cmd.busy_timeout || !(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) +		mmc_delay(timeout_ms); + +	return err; +} + +static int mmc_can_poweroff_notify(const struct mmc_card *card) +{ +	return card && +		mmc_card_mmc(card) && +		(card->ext_csd.power_off_notification == EXT_CSD_POWER_ON); +} + +static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_type) +{ +	unsigned int timeout = card->ext_csd.generic_cmd6_time; +	int err; + +	/* Use EXT_CSD_POWER_OFF_SHORT as default notification type. */ +	if (notify_type == EXT_CSD_POWER_OFF_LONG) +		timeout = card->ext_csd.power_off_longtime; + +	err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, +			EXT_CSD_POWER_OFF_NOTIFICATION, +			notify_type, timeout, true, false, false); +	if (err) +		pr_err("%s: Power Off Notification timed out, %u\n", +		       mmc_hostname(card->host), timeout); + +	/* Disable the power off notification after the switch operation. */ +	card->ext_csd.power_off_notification = EXT_CSD_NO_POWER_NOTIFICATION;  	return err;  } @@ -593,6 +1570,14 @@ static void mmc_remove(struct mmc_host *host)  }  /* + * Card detection - card is alive. + */ +static int mmc_alive(struct mmc_host *host) +{ +	return mmc_send_status(host->card, NULL); +} + +/*   * Card detection callback from host.   */  static void mmc_detect(struct mmc_host *host) @@ -602,145 +1587,226 @@ static void mmc_detect(struct mmc_host *host)  	BUG_ON(!host);  	BUG_ON(!host->card); -	mmc_claim_host(host); +	mmc_get_card(host->card);  	/*  	 * Just check if our card has been removed.  	 */ -	err = mmc_send_status(host->card, NULL); +	err = _mmc_detect_card_removed(host); -	mmc_release_host(host); +	mmc_put_card(host->card);  	if (err) {  		mmc_remove(host);  		mmc_claim_host(host);  		mmc_detach_bus(host); +		mmc_power_off(host);  		mmc_release_host(host);  	}  } -/* - * Suspend callback from host. - */ -static int mmc_suspend(struct mmc_host *host) +static int _mmc_suspend(struct mmc_host *host, bool is_suspend)  { +	int err = 0; +	unsigned int notify_type = is_suspend ? EXT_CSD_POWER_OFF_SHORT : +					EXT_CSD_POWER_OFF_LONG; +  	BUG_ON(!host);  	BUG_ON(!host->card);  	mmc_claim_host(host); -	if (!mmc_host_is_spi(host)) -		mmc_deselect_cards(host); -	host->card->state &= ~MMC_STATE_HIGHSPEED; + +	if (mmc_card_suspended(host->card)) +		goto out; + +	if (mmc_card_doing_bkops(host->card)) { +		err = mmc_stop_bkops(host->card); +		if (err) +			goto out; +	} + +	err = mmc_flush_cache(host->card); +	if (err) +		goto out; + +	if (mmc_can_poweroff_notify(host->card) && +		((host->caps2 & MMC_CAP2_FULL_PWR_CYCLE) || !is_suspend)) +		err = mmc_poweroff_notify(host->card, notify_type); +	else if (mmc_can_sleep(host->card)) +		err = mmc_sleep(host); +	else if (!mmc_host_is_spi(host)) +		err = mmc_deselect_cards(host); + +	if (!err) { +		mmc_power_off(host); +		mmc_card_set_suspended(host->card); +	} +out:  	mmc_release_host(host); +	return err; +} -	return 0; +/* + * Suspend callback + */ +static int mmc_suspend(struct mmc_host *host) +{ +	int err; + +	err = _mmc_suspend(host, true); +	if (!err) { +		pm_runtime_disable(&host->card->dev); +		pm_runtime_set_suspended(&host->card->dev); +	} + +	return err;  }  /* - * Resume callback from host. - *   * This function tries to determine if the same card is still present   * and, if so, restore all state to it.   */ -static int mmc_resume(struct mmc_host *host) +static int _mmc_resume(struct mmc_host *host)  { -	int err; +	int err = 0;  	BUG_ON(!host);  	BUG_ON(!host->card);  	mmc_claim_host(host); -	err = mmc_init_card(host, host->ocr, host->card); -	mmc_release_host(host); +	if (!mmc_card_suspended(host->card)) +		goto out; + +	mmc_power_up(host, host->card->ocr); +	err = mmc_init_card(host, host->card->ocr, host->card); +	mmc_card_clr_suspended(host->card); + +out: +	mmc_release_host(host);  	return err;  } -static int mmc_power_restore(struct mmc_host *host) +/* + * Shutdown callback + */ +static int mmc_shutdown(struct mmc_host *host)  { -	int ret; +	int err = 0; -	host->card->state &= ~MMC_STATE_HIGHSPEED; -	mmc_claim_host(host); -	ret = mmc_init_card(host, host->ocr, host->card); -	mmc_release_host(host); +	/* +	 * In a specific case for poweroff notify, we need to resume the card +	 * before we can shutdown it properly. +	 */ +	if (mmc_can_poweroff_notify(host->card) && +		!(host->caps2 & MMC_CAP2_FULL_PWR_CYCLE)) +		err = _mmc_resume(host); -	return ret; +	if (!err) +		err = _mmc_suspend(host, false); + +	return err;  } -static int mmc_sleep(struct mmc_host *host) +/* + * Callback for resume. + */ +static int mmc_resume(struct mmc_host *host)  { -	struct mmc_card *card = host->card; -	int err = -ENOSYS; +	int err = 0; -	if (card && card->ext_csd.rev >= 3) { -		err = mmc_card_sleepawake(host, 1); -		if (err < 0) -			pr_debug("%s: Error %d while putting card into sleep", -				 mmc_hostname(host), err); +	if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) { +		err = _mmc_resume(host); +		pm_runtime_set_active(&host->card->dev); +		pm_runtime_mark_last_busy(&host->card->dev);  	} +	pm_runtime_enable(&host->card->dev);  	return err;  } -static int mmc_awake(struct mmc_host *host) +/* + * Callback for runtime_suspend. + */ +static int mmc_runtime_suspend(struct mmc_host *host)  { -	struct mmc_card *card = host->card; -	int err = -ENOSYS; +	int err; -	if (card && card->ext_csd.rev >= 3) { -		err = mmc_card_sleepawake(host, 0); -		if (err < 0) -			pr_debug("%s: Error %d while awaking sleeping card", -				 mmc_hostname(host), err); -	} +	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM)) +		return 0; + +	err = _mmc_suspend(host, true); +	if (err) +		pr_err("%s: error %d doing aggessive suspend\n", +			mmc_hostname(host), err);  	return err;  } -static const struct mmc_bus_ops mmc_ops = { -	.awake = mmc_awake, -	.sleep = mmc_sleep, -	.remove = mmc_remove, -	.detect = mmc_detect, -	.suspend = NULL, -	.resume = NULL, -	.power_restore = mmc_power_restore, -}; +/* + * Callback for runtime_resume. + */ +static int mmc_runtime_resume(struct mmc_host *host) +{ +	int err; -static const struct mmc_bus_ops mmc_ops_unsafe = { -	.awake = mmc_awake, -	.sleep = mmc_sleep, +	if (!(host->caps & (MMC_CAP_AGGRESSIVE_PM | MMC_CAP_RUNTIME_RESUME))) +		return 0; + +	err = _mmc_resume(host); +	if (err) +		pr_err("%s: error %d doing aggessive resume\n", +			mmc_hostname(host), err); + +	return 0; +} + +static int mmc_power_restore(struct mmc_host *host) +{ +	int ret; + +	mmc_claim_host(host); +	ret = mmc_init_card(host, host->card->ocr, host->card); +	mmc_release_host(host); + +	return ret; +} + +static const struct mmc_bus_ops mmc_ops = {  	.remove = mmc_remove,  	.detect = mmc_detect,  	.suspend = mmc_suspend,  	.resume = mmc_resume, +	.runtime_suspend = mmc_runtime_suspend, +	.runtime_resume = mmc_runtime_resume,  	.power_restore = mmc_power_restore, +	.alive = mmc_alive, +	.shutdown = mmc_shutdown,  }; -static void mmc_attach_bus_ops(struct mmc_host *host) -{ -	const struct mmc_bus_ops *bus_ops; - -	if (!mmc_card_is_removable(host)) -		bus_ops = &mmc_ops_unsafe; -	else -		bus_ops = &mmc_ops; -	mmc_attach_bus(host, bus_ops); -} -  /*   * Starting point for MMC card init.   */ -int mmc_attach_mmc(struct mmc_host *host, u32 ocr) +int mmc_attach_mmc(struct mmc_host *host)  {  	int err; +	u32 ocr, rocr;  	BUG_ON(!host);  	WARN_ON(!host->claimed); -	mmc_attach_bus_ops(host); +	/* Set correct bus mode for MMC before attempting attach */ +	if (!mmc_host_is_spi(host)) +		mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); + +	err = mmc_send_op_cond(host, 0, &ocr); +	if (err) +		return err; + +	mmc_attach_bus(host, &mmc_ops); +	if (host->ocr_avail_mmc) +		host->ocr_avail = host->ocr_avail_mmc;  	/*  	 * We need to get OCR a different way for SPI. @@ -751,23 +1817,12 @@ int mmc_attach_mmc(struct mmc_host *host, u32 ocr)  			goto err;  	} -	/* -	 * Sanity check the voltages that the card claims to -	 * support. -	 */ -	if (ocr & 0x7F) { -		printk(KERN_WARNING "%s: card claims to support voltages " -		       "below the defined range. These will be ignored.\n", -		       mmc_hostname(host)); -		ocr &= ~0x7F; -	} - -	host->ocr = mmc_select_voltage(host, ocr); +	rocr = mmc_select_voltage(host, ocr);  	/*  	 * Can we support the voltage of the card?  	 */ -	if (!host->ocr) { +	if (!rocr) {  		err = -EINVAL;  		goto err;  	} @@ -775,27 +1830,27 @@ int mmc_attach_mmc(struct mmc_host *host, u32 ocr)  	/*  	 * Detect and init the card.  	 */ -	err = mmc_init_card(host, host->ocr, NULL); +	err = mmc_init_card(host, rocr, NULL);  	if (err)  		goto err;  	mmc_release_host(host); -  	err = mmc_add_card(host->card); +	mmc_claim_host(host);  	if (err)  		goto remove_card;  	return 0;  remove_card: +	mmc_release_host(host);  	mmc_remove_card(host->card); -	host->card = NULL;  	mmc_claim_host(host); +	host->card = NULL;  err:  	mmc_detach_bus(host); -	mmc_release_host(host); -	printk(KERN_ERR "%s: error %d whilst initialising MMC card\n", +	pr_err("%s: error %d whilst initialising MMC card\n",  		mmc_hostname(host), err);  	return err;  | 
