|
@@ -1046,22 +1046,6 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * Enable HPI feature (if supported)
|
|
|
- */
|
|
|
- if (card->ext_csd.hpi) {
|
|
|
- err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
|
|
- EXT_CSD_HPI_MGMT, 1, 0);
|
|
|
- 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;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* Compute bus speed.
|
|
|
*/
|
|
@@ -1111,9 +1095,12 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
|
|
|
* 4. execute tuning for HS200
|
|
|
*/
|
|
|
if ((host->caps2 & MMC_CAP2_HS200) &&
|
|
|
- card->host->ops->execute_tuning)
|
|
|
+ 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));
|
|
@@ -1232,6 +1219,23 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Enable HPI feature (if supported)
|
|
|
+ */
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* If cache size is higher than 0, this indicates
|
|
|
* the existence of cache and it can be turned on.
|