All of lore.kernel.org
 help / color / mirror / Atom feed
From: Seungwon Jeon <tgih.jun@samsung.com>
To: linux-mmc@vger.kernel.org
Cc: 'Chris Ball' <chris@printf.net>,
	'Ulf Hansson' <ulf.hansson@linaro.org>,
	'Jaehoon Chung' <jh80.chung@samsung.com>,
	'Jackey Shen' <jackey.shen@amd.com>,
	'Alim Akhtar' <alim.akhtar@samsung.com>
Subject: [PATCH v3 4/5] mmc: rework selection of bus speed mode
Date: Fri, 14 Mar 2014 21:16:44 +0900	[thread overview]
Message-ID: <003e01cf3f7f$43eb8a20$cbc29e60$%jun@samsung.com> (raw)
In-Reply-To: 

Current implementation for bus speed mode selection is too
complicated. This patch is to simplify the codes and remove
some duplicate parts.

The following changes are including:
* Adds functions for each mode selection(HS, HS-DDR, HS200 and etc)
* Rearranged the mode selection sequence with supported device type
* Adds maximum speed for HS200 mode(hs200_max_dtr)
* Adds field definition for HS_TIMING of EXT_CSD

Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com>
Tested-by: Jaehoon Chung <jh80.chung@samsung.com>
Acked-by: Jaehoon Chung <jh80.chung@samsung.com>
---
 drivers/mmc/core/debugfs.c |    2 +-
 drivers/mmc/core/mmc.c     |  431 ++++++++++++++++++++++++--------------------
 include/linux/mmc/card.h   |    1 +
 include/linux/mmc/mmc.h    |    4 +
 4 files changed, 238 insertions(+), 200 deletions(-)

diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c
index 509229b..1f730db 100644
--- a/drivers/mmc/core/debugfs.c
+++ b/drivers/mmc/core/debugfs.c
@@ -139,7 +139,7 @@ static int mmc_ios_show(struct seq_file *s, void *data)
 		str = "mmc DDR52";
 		break;
 	case MMC_TIMING_MMC_HS200:
-		str = "mmc high-speed SDR200";
+		str = "mmc HS200";
 		break;
 	default:
 		str = "invalid";
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 480c100..6dd68e6 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -242,7 +242,7 @@ 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;
 	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 (caps & MMC_CAP_MMC_HIGHSPEED &&
@@ -271,17 +271,18 @@ static void mmc_select_card_type(struct mmc_card *card)
 
 	if (caps2 & MMC_CAP2_HS200_1_8V_SDR &&
 	    card_type & EXT_CSD_CARD_TYPE_HS200_1_8V) {
-		hs_max_dtr = MMC_HS200_MAX_DTR;
+		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) {
-		hs_max_dtr = MMC_HS200_MAX_DTR;
+		hs200_max_dtr = MMC_HS200_MAX_DTR;
 		avail_type |= EXT_CSD_CARD_TYPE_HS200_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;
 }
 
@@ -833,37 +834,46 @@ static int mmc_select_powerclass(struct mmc_card *card)
 }
 
 /*
- * 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) && 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 slected 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->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;
+	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
@@ -871,8 +881,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
@@ -887,27 +896,202 @@ 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)
+		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;
+}
+
+/*
+ * 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, 2,
-				card->ext_csd.generic_cmd6_time,
-				true, true, true);
+				   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, which sends CMD21 to the device.
+ */
+static int mmc_hs200_tuning(struct mmc_card *card)
+{
+	struct mmc_host *host = card->host;
+	int err = 0;
+
+	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
@@ -917,9 +1101,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;
 
@@ -1111,173 +1294,23 @@ 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->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_switch(card, EXT_CSD_CMD_SET_NORMAL,
-					EXT_CSD_HS_TIMING, 1,
-					card->ext_csd.generic_cmd6_time,
-					true, true, true);
-
-		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->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200)
-				mmc_set_timing(card->host,
-					       MMC_TIMING_MMC_HS200);
-			else
-				mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
-		}
-	}
-
-	/*
-	 * Compute bus speed.
-	 */
-	max_dtr = (unsigned int)-1;
-
-	if (mmc_card_hs(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_hs(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_hs(card))
-		ddr = card->mmc_avail_type & EXT_CSD_CARD_TYPE_DDR_52;
+	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 (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;
-	}
-
-	/*
-	 * Activate wide bus and DDR (if supported).
-	 */
-	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_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_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 & EXT_CSD_CARD_TYPE_DDR_1_2V) {
-				err = __mmc_set_signal_voltage(host,
-					MMC_SIGNAL_VOLTAGE_120);
-				if (err)
-					goto err;
-			}
-			mmc_set_timing(card->host, MMC_TIMING_MMC_DDR52);
-			mmc_set_bus_width(card->host, bus_width);
+	} 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;
 		}
 	}
 
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index c232b10..def6814 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -63,6 +63,7 @@ struct mmc_ext_csd {
 	unsigned int            power_off_longtime;     /* Units: ms */
 	u8			power_off_notification;	/* state */
 	unsigned int		hs_max_dtr;
+	unsigned int		hs200_max_dtr;
 #define MMC_HIGH_26_MAX_DTR	26000000
 #define MMC_HIGH_52_MAX_DTR	52000000
 #define MMC_HIGH_DDR_MAX_DTR	52000000
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
index f734c0c..f429f13 100644
--- a/include/linux/mmc/mmc.h
+++ b/include/linux/mmc/mmc.h
@@ -377,6 +377,10 @@ struct _mmc_csd {
 #define EXT_CSD_DDR_BUS_WIDTH_4	5	/* Card is in 4 bit DDR mode */
 #define EXT_CSD_DDR_BUS_WIDTH_8	6	/* Card is in 8 bit DDR mode */
 
+#define EXT_CSD_TIMING_BC	0	/* Backwards compatility */
+#define EXT_CSD_TIMING_HS	1	/* High speed */
+#define EXT_CSD_TIMING_HS200	2	/* HS200 */
+
 #define EXT_CSD_SEC_ER_EN	BIT(0)
 #define EXT_CSD_SEC_BD_BLK_EN	BIT(2)
 #define EXT_CSD_SEC_GB_CL_EN	BIT(4)
-- 
1.7.0.4



  parent reply	other threads:[~2014-03-14 12:16 UTC|newest]

Thread overview: 182+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-05 12:10 [PATCH 0/3] mmc: tmio: Use modern PM ops Ulf Hansson
2013-11-05 12:10 ` [PATCH 1/3] mmc: sh_mobile_sdhi: Use modern PM macros to define pm callbacks Ulf Hansson
2013-11-05 22:29   ` Guennadi Liakhovetski
2013-11-05 12:10 ` [PATCH 2/3] mmc: tmio_mmc: Convert from legacy to modern PM ops Ulf Hansson
2013-11-05 22:24   ` Guennadi Liakhovetski
2013-11-05 12:10 ` [PATCH 3/3] mmc: tmio: Adapt to proper PM configs for exported functions Ulf Hansson
2013-11-05 22:29   ` Guennadi Liakhovetski
2013-11-05 13:26 ` [PATCH] mmc: trivial: fix the compiling warning Seungwon Jeon
2013-11-06  3:20   ` Jaehoon Chung
2013-11-06  9:42     ` Seungwon Jeon
2013-11-05 13:27 ` [PATCH 0/3] mmc: update bus speed mode Seungwon Jeon
2013-11-05 13:27 ` [PATCH 1/3] mmc: rework selection of " Seungwon Jeon
2013-11-05 14:06   ` Ulf Hansson
2013-11-06  9:09     ` Seungwon Jeon
2013-11-06 10:46       ` Ulf Hansson
2013-11-05 13:27 ` [PATCH 2/3] mmc: correct some exclusive card state to clear Seungwon Jeon
2013-11-05 14:33   ` Ulf Hansson
2013-11-06  9:35     ` Seungwon Jeon
2013-11-06 10:38       ` Ulf Hansson
2013-11-07  3:51         ` Seungwon Jeon
2013-11-05 13:28 ` [PATCH 3/3] mmc: add support for hs400 mode of eMMC5.0 Seungwon Jeon
2013-11-07  7:38   ` Shen, Jackey
2013-11-07 11:38     ` Seungwon Jeon
2013-11-08  9:05       ` Jackey Shen
2013-11-11 12:51         ` Seungwon Jeon
2013-11-25  7:32           ` Jackey Shen
2013-11-08 12:16 ` [PATCH 0/3] mmc: tmio: Use modern PM ops Guennadi Liakhovetski
2013-11-11  9:24   ` Ulf Hansson
2014-01-15 14:10 ` [PATCH 0/7] mmc: distinguish DDR timing mode for eMMC/UHS Seungwon Jeon
2014-01-15 14:10 ` [PATCH 1/7] mmc: clarify DDR timing mode between SD-UHS and eMMC Seungwon Jeon
2014-01-16 10:50   ` Ulf Hansson
2014-01-17 21:22     ` Ulf Hansson
2014-01-20  3:55       ` Seungwon Jeon
2014-01-23  9:06         ` Ulf Hansson
2014-01-15 14:11 ` [PATCH 2/7] mmc: mmci: " Seungwon Jeon
2014-01-16 10:20   ` Ulf Hansson
2014-01-17 14:05     ` Seungwon Jeon
2014-01-17 14:50     ` [PATCH v2 " Seungwon Jeon
2014-01-15 14:11 ` [PATCH 3/7] mmc: omap: " Seungwon Jeon
2014-01-16 10:49   ` Ulf Hansson
2014-01-16 11:07     ` Balaji T K
2014-01-16 11:01   ` Balaji T K
2014-01-15 14:12 ` [PATCH 4/7] mmc: sh_mmcif: " Seungwon Jeon
2014-01-16 10:22   ` Ulf Hansson
2014-01-17 14:36     ` Seungwon Jeon
2014-01-28 13:08     ` Seungwon Jeon
2014-01-15 14:12 ` [PATCH 5/7] mmc: rtsx: " Seungwon Jeon
2014-01-16 10:51   ` Ulf Hansson
2014-01-15 14:12 ` [PATCH 6/7] mmc: dw_mmc: " Seungwon Jeon
2014-01-16 10:37   ` Ulf Hansson
2014-01-15 14:12 ` [PATCH 7/7] mmc: sdhci: " Seungwon Jeon
2014-01-16 10:25   ` Ulf Hansson
2014-01-15 14:13 ` [PATCH 0/5] update selection of bus speed mode for eMMC Seungwon Jeon
2014-01-15 14:14 ` [PATCH 1/5] mmc: drop the speed mode of card's state Seungwon Jeon
2014-01-15 14:14 ` [PATCH 2/5] mmc: identify available device type to select Seungwon Jeon
2014-01-15 14:14 ` [PATCH 3/5] mmc: step power class after final selection of bus mode Seungwon Jeon
2014-01-15 14:15 ` [PATCH 4/5] mmc: rework selection of bus speed mode Seungwon Jeon
2014-01-15 14:19 ` [PATCH 5/5] mmc: add support for HS400 mode of eMMC5.0 Seungwon Jeon
2014-02-18 10:24   ` Jackey Shen
2014-02-18 13:31     ` Seungwon Jeon
2014-02-15 14:08 ` [PATCH v2 0/7] mmc: distinguish DDR timing mode for eMMC/UHS Seungwon Jeon
2014-03-07 13:30   ` [PATCH v3 " Seungwon Jeon
2014-03-14 12:11   ` [PATCH RESEND " Seungwon Jeon
2014-04-02 11:50     ` Ulf Hansson
2014-04-03 11:56       ` Seungwon Jeon
2014-02-15 14:08 ` [PATCH v2 1/7] mmc: clarify DDR timing mode between SD-UHS and eMMC Seungwon Jeon
2014-03-07 13:30   ` [PATCH v3 " Seungwon Jeon
2014-03-07 13:42     ` Jaehoon Chung
2014-03-14 12:11   ` [PATCH RESEND " Seungwon Jeon
2014-02-15 14:08 ` [PATCH v2 2/7] mmc: mmci: " Seungwon Jeon
2014-02-17 14:08   ` Ulf Hansson
2014-02-18 13:34     ` Seungwon Jeon
2014-03-07 13:30   ` [PATCH v3 " Seungwon Jeon
2014-03-14 12:12   ` [PATCH RESEND " Seungwon Jeon
2014-02-15 14:09 ` [PATCH v2 3/7] mmc: omap: " Seungwon Jeon
2014-03-07 13:30   ` [PATCH v3 " Seungwon Jeon
2014-03-14 12:12   ` [PATCH RESEND " Seungwon Jeon
2014-02-15 14:09 ` [PATCH v2 4/7] mmc: sh_mmcif: " Seungwon Jeon
2014-03-07 13:30   ` [PATCH v3 " Seungwon Jeon
2014-03-14 12:12   ` [PATCH RESEND " Seungwon Jeon
2014-02-15 14:09 ` [PATCH v2 5/7] mmc: rtsx: " Seungwon Jeon
2014-03-07 13:31   ` [PATCH v3 " Seungwon Jeon
2014-03-14 12:12   ` [PATCH RESEND " Seungwon Jeon
2014-02-15 14:09 ` [PATCH v2 6/7] mmc: dw_mmc: " Seungwon Jeon
2014-03-07 13:31   ` [PATCH v3 " Seungwon Jeon
2014-03-07 13:43     ` Jaehoon Chung
2014-03-14 12:12   ` [PATCH RESEMD " Seungwon Jeon
2014-02-15 14:09 ` [PATCH v2 7/7] mmc: sdhci: " Seungwon Jeon
2014-03-07 13:31   ` [PATCH v3 " Seungwon Jeon
2014-03-14 12:12   ` [PATCH RESEND " Seungwon Jeon
2014-02-15 14:18 ` [PATCH RESEND 0/5] update selection of bus speed mode for eMMC Seungwon Jeon
2014-03-07 14:35   ` [PATCH v2 " Seungwon Jeon
2014-03-13 14:41     ` Ulf Hansson
2014-03-13  9:52   ` [PATCH RESEND " Jaehoon Chung
2014-03-14 12:16   ` [PATCH v3 " Seungwon Jeon
2014-03-17  8:47     ` Ulf Hansson
2014-03-18  1:43       ` Seungwon Jeon
2014-03-18  4:20         ` Jaehoon Chung
2014-03-18  8:01           ` Ulf Hansson
2014-03-26 10:59   ` [PATCH v4 " Seungwon Jeon
2014-03-26 11:00   ` [PATCH v4 1/5] mmc: drop the speed mode of card's state Seungwon Jeon
2014-03-26 11:00   ` [PATCH v4 2/5] mmc: identify available device type to select Seungwon Jeon
2014-03-26 11:00   ` [PATCH v4 3/5] mmc: step power class after final selection of bus mode Seungwon Jeon
2014-03-28  8:43     ` Ulf Hansson
2014-03-26 11:00   ` [PATCH v4 4/5] mmc: rework selection of bus speed mode Seungwon Jeon
2014-03-26 11:00   ` [PATCH v4 5/5] mmc: add support for HS400 mode of eMMC5.0 Seungwon Jeon
2014-04-11 11:33   ` [PATCH v5 0/5] update selection of bus speed mode for eMMC Seungwon Jeon
2014-04-11 11:34   ` [PATCH v5 1/5] mmc: drop the speed mode of card's state Seungwon Jeon
2014-04-11 11:34   ` [PATCH v5 2/5] mmc: identify available device type to select Seungwon Jeon
2014-04-11 11:47     ` Ulf Hansson
2014-04-11 11:34   ` [PATCH v5 3/5] mmc: step power class after final selection of bus mode Seungwon Jeon
2014-04-11 11:34   ` [PATCH v5 4/5] mmc: rework selection of bus speed mode Seungwon Jeon
2014-04-11 11:34   ` [PATCH v5 5/5] mmc: add support for HS400 mode of eMMC5.0 Seungwon Jeon
2014-04-11 12:06     ` Ulf Hansson
2014-04-18 13:36   ` [PATCH v6 0/6] update selection of bus speed mode for eMMC Seungwon Jeon
2014-04-20  7:18     ` Ulf Hansson
2014-04-21  3:55       ` Seungwon Jeon
2014-04-18 13:36   ` [PATCH v6 1/6] mmc: drop the speed mode of card's state Seungwon Jeon
2014-04-18 13:36   ` [PATCH v6 2/6] mmc: identify available device type to select Seungwon Jeon
2014-04-18 13:36   ` [PATCH v6 3/6] mmc: step power class after final selection of bus mode Seungwon Jeon
2014-04-18 13:36   ` [PATCH v6 4/6] mmc: rework selection of bus speed mode Seungwon Jeon
2014-04-18 13:37   ` [PATCH v6 5/6] mmc: add support for HS400 mode of eMMC5.0 Seungwon Jeon
2014-04-18 13:37   ` [PATCH v6 6/6] mmc: core: add DT bindings for eMMC HS400 1.8/1.2V Seungwon Jeon
2014-04-23  8:30     ` Ulf Hansson
2014-04-23  8:07   ` [PATCH 0/6] update selection of bus speed mode for eMMC Seungwon Jeon
2014-04-23  8:07   ` [PATCH 1/6] mmc: drop the speed mode of card's state Seungwon Jeon
2014-04-23  8:07     ` Seungwon Jeon
2014-05-05  8:02     ` Ulf Hansson
2014-04-23  8:07   ` [PATCH 2/6] mmc: identify available device type to select Seungwon Jeon
2014-04-23  8:08   ` [PATCH 3/6] mmc: step power class after final selection of bus mode Seungwon Jeon
2014-04-23  8:08   ` [PATCH 4/6] mmc: rework selection of bus speed mode Seungwon Jeon
2014-04-23  8:14   ` [PATCH 5/6] mmc: add support for HS400 mode of eMMC5.0 Seungwon Jeon
2014-04-23  8:15   ` [PATCH 6/6] mmc: core: add DT bindings for eMMC HS400 1.8/1.2V Seungwon Jeon
2014-02-15 14:18 ` [PATCH RESEND 1/5] mmc: drop the speed mode of card's state Seungwon Jeon
2014-02-17 14:38   ` Ulf Hansson
2014-02-18 13:43     ` Seungwon Jeon
2014-02-18 16:40       ` Ulf Hansson
2014-03-07 14:36   ` [PATCH v2 " Seungwon Jeon
2014-03-14 12:16   ` [PATCH v3 " Seungwon Jeon
2014-02-15 14:18 ` [PATCH RESEND 2/5] mmc: identify available device type to select Seungwon Jeon
2014-03-07 14:36   ` [PATCH v2 " Seungwon Jeon
2014-03-10 10:14     ` Jaehoon Chung
2014-03-10 11:59       ` Seungwon Jeon
2014-03-13  5:37         ` Jaehoon Chung
2014-03-13  8:37           ` Seungwon Jeon
2014-03-13  9:51             ` Jaehoon Chung
2014-03-13 14:02     ` Ulf Hansson
2014-03-14  2:49       ` Seungwon Jeon
2014-03-14  7:34         ` Ulf Hansson
2014-03-14 10:24           ` Seungwon Jeon
2014-03-28  8:31         ` Ulf Hansson
2014-03-28 12:27           ` Seungwon Jeon
2014-03-14 12:16   ` [PATCH v3 " Seungwon Jeon
2014-02-15 14:23 ` [PATCH RESEND 3/5] mmc: step power class after final selection of bus mode Seungwon Jeon
2014-03-07 14:36   ` [PATCH v2 " Seungwon Jeon
2014-03-13 14:28     ` Ulf Hansson
2014-03-14  2:49       ` Seungwon Jeon
2014-03-14  7:31         ` Ulf Hansson
2014-03-14 12:16   ` [PATCH v3 " Seungwon Jeon
2014-02-15 14:24 ` [PATCH RESEND 4/5] mmc: rework selection of bus speed mode Seungwon Jeon
2014-03-07 14:36   ` [PATCH v2 " Seungwon Jeon
2014-03-14 12:16   ` Seungwon Jeon [this message]
2014-03-21 13:01     ` [PATCH v3 " Ulf Hansson
2014-03-22 12:04       ` Seungwon Jeon
2014-03-24 13:11         ` Ulf Hansson
2014-02-15 14:24 ` [PATCH RESEND 5/5] mmc: add support for HS400 mode of eMMC5.0 Seungwon Jeon
2014-03-07 14:36   ` [PATCH v2 " Seungwon Jeon
2014-03-11  0:45     ` Jackey Shen
2014-03-14 11:34       ` Seungwon Jeon
2014-03-14 12:16   ` [PATCH v3 " Seungwon Jeon
2014-03-24 15:41     ` Ulf Hansson
2014-03-25  9:23       ` Seungwon Jeon
2014-03-28  9:57         ` Ulf Hansson
2014-03-28 12:18           ` Seungwon Jeon
2014-03-28 13:33             ` Ulf Hansson
2014-04-02  1:15               ` Seungwon Jeon
2014-04-02  9:39                 ` Ulf Hansson
2014-04-03 11:53                   ` Seungwon Jeon
2014-04-03 13:14                     ` Ulf Hansson
2014-04-04 10:46                       ` Seungwon Jeon
2014-04-04 11:58                         ` Ulf Hansson
2014-04-05 14:36                           ` Seungwon Jeon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='003e01cf3f7f$43eb8a20$cbc29e60$%jun@samsung.com' \
    --to=tgih.jun@samsung.com \
    --cc=alim.akhtar@samsung.com \
    --cc=chris@printf.net \
    --cc=jackey.shen@amd.com \
    --cc=jh80.chung@samsung.com \
    --cc=linux-mmc@vger.kernel.org \
    --cc=ulf.hansson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.