diff options
Diffstat (limited to 'drivers/mmc/core/mmc.c')
| -rw-r--r-- | drivers/mmc/core/mmc.c | 858 | 
1 files changed, 499 insertions, 359 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 6d02012a1d0..793c6f7ddb0 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -13,6 +13,7 @@  #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> @@ -239,31 +240,62 @@ static int mmc_get_ext_csd(struct mmc_card *card, u8 **new_ext_csd)  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 & EXT_CSD_CARD_TYPE_MASK; +	u8 card_type = card->ext_csd.raw_card_type;  	u32 caps = host->caps, caps2 = host->caps2; -	unsigned int hs_max_dtr = 0; +	unsigned int hs_max_dtr = 0, hs200_max_dtr = 0; +	unsigned int avail_type = 0; -	if (card_type & EXT_CSD_CARD_TYPE_26) +	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_52) +	    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_8V_DDR && -			card_type & EXT_CSD_CARD_TYPE_DDR_1_8V) || -	    (caps & MMC_CAP_1_2V_DDR && -			card_type & EXT_CSD_CARD_TYPE_DDR_1_2V)) +	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_HS200_1_8V_SDR && -			card_type & EXT_CSD_CARD_TYPE_SDR_1_8V) || -	    (caps2 & MMC_CAP2_HS200_1_2V_SDR && -			card_type & EXT_CSD_CARD_TYPE_SDR_1_2V)) -		hs_max_dtr = MMC_HS200_MAX_DTR; +	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.card_type = card_type; +	card->ext_csd.hs200_max_dtr = hs200_max_dtr; +	card->mmc_avail_type = avail_type;  }  /* @@ -479,6 +511,8 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)  			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) { @@ -645,7 +679,10 @@ static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width)  		(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])); +			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; @@ -693,18 +730,10 @@ static struct attribute *mmc_std_attrs[] = {  	&dev_attr_rel_sectors.attr,  	NULL,  }; - -static struct attribute_group mmc_std_attr_group = { -	.attrs = mmc_std_attrs, -}; - -static const struct attribute_group *mmc_attr_groups[] = { -	&mmc_std_attr_group, -	NULL, -}; +ATTRIBUTE_GROUPS(mmc_std);  static struct device_type mmc_type = { -	.groups = mmc_attr_groups, +	.groups = mmc_std_groups,  };  /* @@ -713,17 +742,13 @@ static struct device_type mmc_type = {   * extended CSD register, select it by executing the   * mmc_switch command.   */ -static int mmc_select_powerclass(struct mmc_card *card, -		unsigned int bus_width) +static int __mmc_select_powerclass(struct mmc_card *card, +				   unsigned int bus_width)  { -	int err = 0; +	struct mmc_host *host = card->host; +	struct mmc_ext_csd *ext_csd = &card->ext_csd;  	unsigned int pwrclass_val = 0; -	struct mmc_host *host; - -	BUG_ON(!card); - -	host = card->host; -	BUG_ON(!host); +	int err = 0;  	/* Power class selection is supported for versions >= 4.0 */  	if (card->csd.mmca_vsn < CSD_SPEC_VER_4) @@ -735,14 +760,14 @@ static int mmc_select_powerclass(struct mmc_card *card,  	switch (1 << host->ios.vdd) {  	case MMC_VDD_165_195: -		if (host->ios.clock <= 26000000) -			pwrclass_val = card->ext_csd.raw_pwr_cl_26_195; -		else if	(host->ios.clock <= 52000000) +		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) ? -				card->ext_csd.raw_pwr_cl_52_195 : -				card->ext_csd.raw_pwr_cl_ddr_52_195; -		else if (host->ios.clock <= 200000000) -			pwrclass_val = card->ext_csd.raw_pwr_cl_200_195; +				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: @@ -753,14 +778,16 @@ static int mmc_select_powerclass(struct mmc_card *card,  	case MMC_VDD_33_34:  	case MMC_VDD_34_35:  	case MMC_VDD_35_36: -		if (host->ios.clock <= 26000000) -			pwrclass_val = card->ext_csd.raw_pwr_cl_26_360; -		else if	(host->ios.clock <= 52000000) +		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) ? -				card->ext_csd.raw_pwr_cl_52_360 : -				card->ext_csd.raw_pwr_cl_ddr_52_360; -		else if (host->ios.clock <= 200000000) -			pwrclass_val = card->ext_csd.raw_pwr_cl_200_360; +				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 " @@ -786,40 +813,79 @@ static int mmc_select_powerclass(struct mmc_card *card,  	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; +} +  /* - * Selects the desired buswidth and switch to the HS200 mode - * if bus width set without error + * Set the bus speed for the selected speed mode.   */ -static int mmc_select_hs200(struct mmc_card *card) +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)  { -	int idx, err = -EINVAL; -	struct mmc_host *host;  	static unsigned ext_csd_bits[] = { -		EXT_CSD_BUS_WIDTH_4,  		EXT_CSD_BUS_WIDTH_8, +		EXT_CSD_BUS_WIDTH_4,  	};  	static unsigned bus_widths[] = { -		MMC_BUS_WIDTH_4,  		MMC_BUS_WIDTH_8, +		MMC_BUS_WIDTH_4,  	}; +	struct mmc_host *host = card->host; +	unsigned idx, bus_width = 0; +	int err = 0; -	BUG_ON(!card); - -	host = card->host; - -	if (card->ext_csd.card_type & EXT_CSD_CARD_TYPE_SDR_1_2V && -			host->caps2 & MMC_CAP2_HS200_1_2V_SDR) -		err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120); - -	if (err && card->ext_csd.card_type & EXT_CSD_CARD_TYPE_SDR_1_8V && -			host->caps2 & MMC_CAP2_HS200_1_8V_SDR) -		err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_180); - -	/* If fails try again during next card power cycle */ -	if (err) -		goto err; +	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) ? 1 : 0; +	idx = (host->caps & MMC_CAP_8_BIT_DATA) ? 0 : 1;  	/*  	 * Unlike SD, MMC cards dont have a configuration register to notify @@ -827,8 +893,7 @@ static int mmc_select_hs200(struct mmc_card *card)  	 * 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 >= 0; idx--) { - +	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 @@ -843,25 +908,266 @@ static int mmc_select_hs200(struct mmc_card *card)  		if (err)  			continue; -		mmc_set_bus_width(card->host, bus_widths[idx]); +		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_widths[idx]); +			err = mmc_compare_ext_csds(card, bus_width);  		else -			err = mmc_bus_test(card, bus_widths[idx]); -		if (!err) +			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]); +		}  	} -	/* switch to HS200 mode if bus width set successfully */ +	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) -		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, -				 EXT_CSD_HS_TIMING, 2, 0); +		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.   *   * In the case of a resume, "oldcard" will contain the card @@ -871,9 +1177,8 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  	struct mmc_card *oldcard)  {  	struct mmc_card *card; -	int err, ddr = 0; +	int err;  	u32 cid[4]; -	unsigned int max_dtr;  	u32 rocr;  	u8 *ext_csd = NULL; @@ -934,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)); @@ -1064,209 +1370,34 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  	}  	/* -	 * Activate high speed (if supported) -	 */ -	if (card->ext_csd.hs_max_dtr != 0) { -		err = 0; -		if (card->ext_csd.hs_max_dtr > 52000000 && -		    host->caps2 & MMC_CAP2_HS200) -			err = mmc_select_hs200(card); -		else if	(host->caps & MMC_CAP_MMC_HIGHSPEED) -			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, -					 EXT_CSD_HS_TIMING, 1, -					 card->ext_csd.generic_cmd6_time); - -		if (err && err != -EBADMSG) -			goto free_card; - -		if (err) { -			pr_warning("%s: switch to highspeed failed\n", -			       mmc_hostname(card->host)); -			err = 0; -		} else { -			if (card->ext_csd.hs_max_dtr > 52000000 && -			    host->caps2 & MMC_CAP2_HS200) { -				mmc_card_set_hs200(card); -				mmc_set_timing(card->host, -					       MMC_TIMING_MMC_HS200); -			} else { -				mmc_card_set_highspeed(card); -				mmc_set_timing(card->host, MMC_TIMING_MMC_HS); -			} -		} -	} - -	/* -	 * Compute bus speed. -	 */ -	max_dtr = (unsigned int)-1; - -	if (mmc_card_highspeed(card) || mmc_card_hs200(card)) { -		if (max_dtr > card->ext_csd.hs_max_dtr) -			max_dtr = card->ext_csd.hs_max_dtr; -		if (mmc_card_highspeed(card) && (max_dtr > 52000000)) -			max_dtr = 52000000; -	} else if (max_dtr > card->csd.max_dtr) { -		max_dtr = card->csd.max_dtr; -	} - -	mmc_set_clock(host, max_dtr); - -	/* -	 * Indicate DDR mode (if supported). +	 * Select timing interface  	 */ -	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 | -			     MMC_CAP_UHS_DDR50)) -				== (MMC_CAP_1_8V_DDR | MMC_CAP_UHS_DDR50))) -				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 | -			     MMC_CAP_UHS_DDR50)) -				== (MMC_CAP_1_2V_DDR | MMC_CAP_UHS_DDR50))) -				ddr = MMC_1_2V_DDR_MODE; -	} +	err = mmc_select_timing(card); +	if (err) +		goto free_card; -	/* -	 * Indicate HS200 SDR mode (if supported). -	 */  	if (mmc_card_hs200(card)) { -		u32 ext_csd_bits; -		u32 bus_width = card->host->ios.bus_width; - -		/* -		 * For devices supporting HS200 mode, the bus width has -		 * to be set before executing the tuning function. If -		 * set before tuning, then device will respond with CRC -		 * errors for responses on CMD line. So for HS200 the -		 * sequence will be -		 * 1. set bus width 4bit / 8 bit (1 bit not supported) -		 * 2. switch to HS200 mode -		 * 3. set the clock to > 52Mhz <=200MHz and -		 * 4. execute tuning for HS200 -		 */ -		if ((host->caps2 & MMC_CAP2_HS200) && -		    card->host->ops->execute_tuning) { -			mmc_host_clk_hold(card->host); -			err = card->host->ops->execute_tuning(card->host, -				MMC_SEND_TUNING_BLOCK_HS200); -			mmc_host_clk_release(card->host); -		} -		if (err) { -			pr_warning("%s: tuning execution failed\n", -				   mmc_hostname(card->host)); +		err = mmc_hs200_tuning(card); +		if (err)  			goto err; -		} -		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); +		err = mmc_select_hs400(card);  		if (err) -			pr_warning("%s: power class selection to bus width %d" -				   " failed\n", mmc_hostname(card->host), -				   1 << bus_width); +			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; +		}  	}  	/* -	 * Activate wide bus and DDR (if supported). +	 * Choose the power class with selected bus interface  	 */ -	if (!mmc_card_hs200(card) && -	    (card->csd.mmca_vsn >= CSD_SPEC_VER_4) && -	    (host->caps & (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA))) { -		static unsigned ext_csd_bits[][2] = { -			{ EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8 }, -			{ EXT_CSD_BUS_WIDTH_4, EXT_CSD_DDR_BUS_WIDTH_4 }, -			{ EXT_CSD_BUS_WIDTH_1, EXT_CSD_BUS_WIDTH_1 }, -		}; -		static unsigned bus_widths[] = { -			MMC_BUS_WIDTH_8, -			MMC_BUS_WIDTH_4, -			MMC_BUS_WIDTH_1 -		}; -		unsigned idx, bus_width = 0; - -		if (host->caps & MMC_CAP_8_BIT_DATA) -			idx = 0; -		else -			idx = 1; -		for (; idx < ARRAY_SIZE(bus_widths); idx++) { -			bus_width = bus_widths[idx]; -			if (bus_width == MMC_BUS_WIDTH_1) -				ddr = 0; /* no DDR for 1-bit width */ -			err = mmc_select_powerclass(card, ext_csd_bits[idx][0]); -			if (err) -				pr_warning("%s: power class selection to " -					   "bus width %d failed\n", -					   mmc_hostname(card->host), -					   1 << bus_width); - -			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, -					 EXT_CSD_BUS_WIDTH, -					 ext_csd_bits[idx][0], -					 card->ext_csd.generic_cmd6_time); -			if (!err) { -				mmc_set_bus_width(card->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) -					break; -			} -		} - -		if (!err && ddr) { -			err = mmc_select_powerclass(card, ext_csd_bits[idx][1]); -			if (err) -				pr_warning("%s: power class selection to " -					   "bus width %d ddr %d failed\n", -					   mmc_hostname(card->host), -					   1 << bus_width, ddr); - -			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, -					 EXT_CSD_BUS_WIDTH, -					 ext_csd_bits[idx][1], -					 card->ext_csd.generic_cmd6_time); -		} -		if (err) { -			pr_warning("%s: switch to bus width %d ddr %d " -				"failed\n", mmc_hostname(card->host), -				1 << bus_width, ddr); -			goto free_card; -		} else if (ddr) { -			/* -			 * 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 (ddr == MMC_1_2V_DDR_MODE) { -				err = __mmc_set_signal_voltage(host, -					MMC_SIGNAL_VOLTAGE_120); -				if (err) -					goto err; -			} -			mmc_card_set_ddr_mode(card); -			mmc_set_timing(card->host, MMC_TIMING_UHS_DDR50); -			mmc_set_bus_width(card->host, bus_width); -		} -	} +	mmc_select_powerclass(card);  	/*  	 * Enable HPI feature (if supported) @@ -1289,8 +1420,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,  	 * If cache size is higher than 0, this indicates  	 * the existence of cache and it can be turned on.  	 */ -	if ((host->caps2 & MMC_CAP2_CACHE_CTRL) && -			card->ext_csd.cache_size > 0) { +	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); @@ -1358,11 +1488,9 @@ 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; -	if (host->caps2 & MMC_CAP2_NO_SLEEP_CMD) -		return 0; -  	err = mmc_deselect_cards(host);  	if (err)  		return err; @@ -1371,7 +1499,19 @@ static int mmc_sleep(struct mmc_host *host)  	cmd.arg = card->rca << 16;  	cmd.arg |= 1 << 15; -	cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; +	/* +	 * 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; @@ -1382,8 +1522,8 @@ static int mmc_sleep(struct mmc_host *host)  	 * SEND_STATUS command to poll the status because that command (and most  	 * others) is invalid while the card sleeps.  	 */ -	if (!(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) -		mmc_delay(DIV_ROUND_UP(card->ext_csd.sa_timeout, 10000)); +	if (!cmd.busy_timeout || !(host->caps & MMC_CAP_WAIT_WHILE_BUSY)) +		mmc_delay(timeout_ms);  	return err;  } @@ -1404,9 +1544,9 @@ static int mmc_poweroff_notify(struct mmc_card *card, unsigned int notify_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); +	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); @@ -1477,13 +1617,16 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)  	mmc_claim_host(host); +	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_cache_ctrl(host, 0); +	err = mmc_flush_cache(host->card);  	if (err)  		goto out; @@ -1494,53 +1637,94 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)  		err = mmc_sleep(host);  	else if (!mmc_host_is_spi(host))  		err = mmc_deselect_cards(host); -	host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200); -	if (!err) +	if (!err) {  		mmc_power_off(host); +		mmc_card_set_suspended(host->card); +	}  out:  	mmc_release_host(host);  	return err;  }  /* - * Suspend callback from host. + * Suspend callback   */  static int mmc_suspend(struct mmc_host *host)  { -	return _mmc_suspend(host, true); -} +	int err; -/* - * Shutdown callback - */ -static int mmc_shutdown(struct mmc_host *host) -{ -	return _mmc_suspend(host, false); +	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); -	mmc_power_up(host); -	mmc_select_voltage(host, host->ocr); -	err = mmc_init_card(host, host->ocr, host->card); + +	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; +} + +/* + * Shutdown callback + */ +static int mmc_shutdown(struct mmc_host *host) +{ +	int err = 0; + +	/* +	 * 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); + +	if (!err) +		err = _mmc_suspend(host, false);  	return err;  } +/* + * Callback for resume. + */ +static int mmc_resume(struct mmc_host *host) +{ +	int err = 0; + +	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; +}  /*   * Callback for runtime_suspend. @@ -1552,18 +1736,11 @@ static int mmc_runtime_suspend(struct mmc_host *host)  	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM))  		return 0; -	mmc_claim_host(host); - -	err = mmc_suspend(host); -	if (err) { +	err = _mmc_suspend(host, true); +	if (err)  		pr_err("%s: error %d doing aggessive suspend\n",  			mmc_hostname(host), err); -		goto out; -	} -	mmc_power_off(host); -out: -	mmc_release_host(host);  	return err;  } @@ -1574,18 +1751,14 @@ static int mmc_runtime_resume(struct mmc_host *host)  {  	int err; -	if (!(host->caps & MMC_CAP_AGGRESSIVE_PM)) +	if (!(host->caps & (MMC_CAP_AGGRESSIVE_PM | MMC_CAP_RUNTIME_RESUME)))  		return 0; -	mmc_claim_host(host); - -	mmc_power_up(host); -	err = mmc_resume(host); +	err = _mmc_resume(host);  	if (err)  		pr_err("%s: error %d doing aggessive resume\n",  			mmc_hostname(host), err); -	mmc_release_host(host);  	return 0;  } @@ -1593,9 +1766,8 @@ static int mmc_power_restore(struct mmc_host *host)  {  	int ret; -	host->card->state &= ~(MMC_STATE_HIGHSPEED | MMC_STATE_HIGHSPEED_200);  	mmc_claim_host(host); -	ret = mmc_init_card(host, host->ocr, host->card); +	ret = mmc_init_card(host, host->card->ocr, host->card);  	mmc_release_host(host);  	return ret; @@ -1604,16 +1776,6 @@ static int mmc_power_restore(struct mmc_host *host)  static const struct mmc_bus_ops mmc_ops = {  	.remove = mmc_remove,  	.detect = mmc_detect, -	.suspend = NULL, -	.resume = NULL, -	.power_restore = mmc_power_restore, -	.alive = mmc_alive, -	.shutdown = mmc_shutdown, -}; - -static const struct mmc_bus_ops mmc_ops_unsafe = { -	.remove = mmc_remove, -	.detect = mmc_detect,  	.suspend = mmc_suspend,  	.resume = mmc_resume,  	.runtime_suspend = mmc_runtime_suspend, @@ -1623,24 +1785,13 @@ static const struct mmc_bus_ops mmc_ops_unsafe = {  	.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)  {  	int err; -	u32 ocr; +	u32 ocr, rocr;  	BUG_ON(!host);  	WARN_ON(!host->claimed); @@ -1653,7 +1804,7 @@ int mmc_attach_mmc(struct mmc_host *host)  	if (err)  		return err; -	mmc_attach_bus_ops(host); +	mmc_attach_bus(host, &mmc_ops);  	if (host->ocr_avail_mmc)  		host->ocr_avail = host->ocr_avail_mmc; @@ -1666,23 +1817,12 @@ int mmc_attach_mmc(struct mmc_host *host)  			goto err;  	} -	/* -	 * Sanity check the voltages that the card claims to -	 * support. -	 */ -	if (ocr & 0x7F) { -		pr_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;  	} @@ -1690,7 +1830,7 @@ int mmc_attach_mmc(struct mmc_host *host)  	/*  	 * Detect and init the card.  	 */ -	err = mmc_init_card(host, host->ocr, NULL); +	err = mmc_init_card(host, rocr, NULL);  	if (err)  		goto err;  | 
