Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a073798a authored by Ram Prakash Gupta's avatar Ram Prakash Gupta
Browse files

mmc: quirks: add new quirk that allows Cache disable



This change allows us to prevent cache enable for certain
cards that have broken cache functionality.

Change-Id: I81da383315f1ab39f60b51a85c40b3737b058f56
Signed-off-by: default avatarTalel Shenhar <tatias@codeaurora.org>
Signed-off-by: default avatarSubhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: default avatarRam Prakash Gupta <rampraka@codeaurora.org>
parent 8ba52d5d
Loading
Loading
Loading
Loading
+37 −18
Original line number Diff line number Diff line
@@ -2191,13 +2191,14 @@ 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 (!mmc_card_broken_hpi(card) &&
	    (card->ext_csd.cache_size > 0) && card->ext_csd.hpi_en) {
	if (!mmc_card_broken_hpi(card) && card->ext_csd.cache_size > 0) {
		if (card->ext_csd.hpi_en &&
			(!(card->quirks & MMC_QUIRK_CACHE_DISABLE))) {
			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
					EXT_CSD_CACHE_CTRL, 1,
					card->ext_csd.generic_cmd6_time);
			if (err && err != -EBADMSG) {
			pr_err("%s: %s: mmc_switch() for CACHE_CTRL fails %d\n",
				pr_err("%s: %s: fail on CACHE_CTRL ON %d\n",
					mmc_hostname(host), __func__, err);
				goto free_card;
			}
@@ -2213,6 +2214,24 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
			} else {
				card->ext_csd.cache_ctrl = 1;
			}
		} else {
			/*
			 * mmc standard doesn't say what is the card default
			 * value for EXT_CSD_CACHE_CTRL.
			 * Hence, cache may be enabled by default by
			 * card vendors.
			 * Thus, it is best to explicitly disable cache in case
			 * we want to avoid cache.
			 */
			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
					EXT_CSD_CACHE_CTRL, 0,
					card->ext_csd.generic_cmd6_time);
			if (err) {
				pr_err("%s: %s: fail on CACHE_CTRL OFF %d\n",
					mmc_hostname(host), __func__, err);
				goto free_card;
			}
		}
	}

	/*
+2 −1
Original line number Diff line number Diff line
@@ -1017,7 +1017,8 @@ int mmc_flush_cache(struct mmc_card *card)

	if (mmc_card_mmc(card) &&
			(card->ext_csd.cache_size > 0) &&
			(card->ext_csd.cache_ctrl & 1)) {
			(card->ext_csd.cache_ctrl & 1) &&
			(!(card->quirks & MMC_QUIRK_CACHE_DISABLE))) {
		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
				EXT_CSD_FLUSH_CACHE, 1, 0);
		if (err)