--- drivers/mmc/mmc.c.org	2006-01-29 14:27:39.000000000 -0800
+++ drivers/mmc/mmc.c	2006-01-29 17:17:59.000000000 -0800
@@ -366,9 +366,43 @@
 				return err;
 
 			host->ios.bus_width = MMC_BUS_WIDTH_4;
+		} else if (card->csd.mmca_vsn == 4) {
+			/*
+			 * XXX: There is a defined procedure that should
+			 * be followed to establish whether 4bit and 8bit
+			 * are supported. This involves sending a special
+			 * command and data pattern and then sending another
+			 * command to read it back. The pattern of the
+			 * returned data indicates 4 and 8 bit support.
+			 */
+
+			struct mmc_command cmd;
+			cmd.opcode = SD_APP_SET_BUS_WIDTH;
+			cmd.arg = 0x03B70100;
+			cmd.flags = MMC_RSP_R1B;
+
+			err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
+			if (err != MMC_ERR_NONE)
+				return err;
+
+			host->ios.bus_width = MMC_BUS_WIDTH_4;
 		}
 	}
 
+	/* Activate highspeed MMC v4 support. */
+	if (card->csd.mmca_vsn == 4) {
+		struct mmc_command cmd;
+		cmd.opcode = SD_APP_SET_BUS_WIDTH;
+	 	cmd.arg = 0x03B90100;
+		cmd.flags = MMC_RSP_R1B;
+
+		err = mmc_wait_for_cmd(host, &cmd, CMD_RETRIES);
+		if (err != MMC_ERR_NONE)
+			return err;
+
+		/* XXX: Store state to indicate that HS was turned on. */
+	}
+
 	host->ops->set_ios(host, &host->ios);
 
 	return MMC_ERR_NONE;
@@ -963,9 +997,17 @@
 	unsigned int max_dtr = host->f_max;
 
 	list_for_each_entry(card, &host->cards, node)
-		if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr)
-			max_dtr = card->csd.max_dtr;
-
+		if (!mmc_card_dead(card) && max_dtr > card->csd.max_dtr) {
+			if (card->csd.mmca_vsn == 4) {
+				/*
+				 * Read EXT_CSD to find highest supported rate
+				 * and check if HS was successfully turned on.
+				 */
+				max_dtr = 26000000;
+			} else {
+				max_dtr = card->csd.max_dtr;
+			}
+		}
 	DBG("MMC: selected %d.%03dMHz transfer rate\n",
 	    max_dtr / 1000000, (max_dtr / 1000) % 1000);
 
