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

Commit cb41ca99 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mmc: core: set MMC_PM_KEEP_POWER for certain Hynix mmc cards"

parents c8d6d142 d60cdc30
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,12 @@ static void mmc_set_erase_size(struct mmc_card *card)
	mmc_init_erase(card);
	mmc_init_erase(card);
}
}


static void add_pm_flag_mmc(struct mmc_card *card, int data)
{
	if (mmc_card_mmc(card))
		card->host->pm_flags |= data;
}

static const struct mmc_fixup mmc_fixups[] = {
static const struct mmc_fixup mmc_fixups[] = {


	/* avoid HPI for specific cards */
	/* avoid HPI for specific cards */
@@ -134,6 +140,9 @@ static const struct mmc_fixup mmc_fixups[] = {
	MMC_FIXUP("MMC16G", CID_MANFID_KINGSTON, CID_OEMID_ANY,
	MMC_FIXUP("MMC16G", CID_MANFID_KINGSTON, CID_OEMID_ANY,
		add_quirk_mmc, MMC_QUIRK_CACHE_DISABLE),
		add_quirk_mmc, MMC_QUIRK_CACHE_DISABLE),


	MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX, CID_OEMID_ANY,
		add_pm_flag_mmc, MMC_PM_KEEP_POWER, MMC_V5_0),

	END_FIXUP
	END_FIXUP
};
};


@@ -435,6 +444,9 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
	 */
	 */
	card->ext_csd.rev = ext_csd[EXT_CSD_REV];
	card->ext_csd.rev = ext_csd[EXT_CSD_REV];


	/* fixup device after ext_csd revision field is updated */
	mmc_fixup_device(card, mmc_fixups);

	card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0];
	card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0];
	card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1];
	card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1];
	card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2];
	card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2];
@@ -2210,6 +2222,9 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
	if (mmc_card_suspended(host->card))
	if (mmc_card_suspended(host->card))
		goto out;
		goto out;


	if (is_suspend)
		host->dev_status = DEV_SUSPENDING;

	if (mmc_card_cmdq(host->card)) {
	if (mmc_card_cmdq(host->card)) {
		BUG_ON(host->cmdq_ctx.active_reqs);
		BUG_ON(host->cmdq_ctx.active_reqs);


@@ -2249,6 +2264,10 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
		mmc_card_set_suspended(host->card);
		mmc_card_set_suspended(host->card);
	}
	}
out:
out:
	if (err)
		host->dev_status = DEV_UNKNOWN;
	else if (is_suspend)
		host->dev_status = DEV_SUSPENDED;
	mmc_release_host(host);
	mmc_release_host(host);
	return err;
	return err;
}
}
@@ -2324,6 +2343,8 @@ static int _mmc_resume(struct mmc_host *host)
		mmc_init_clk_scaling(host);
		mmc_init_clk_scaling(host);


out:
out:
	if (!err)
		host->dev_status = DEV_RESUMED;
	return err;
	return err;
}
}


+10 −0
Original line number Original line Diff line number Diff line
@@ -1407,6 +1407,16 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
	struct mmc_host *mmc = host->mmc;
	struct mmc_host *mmc = host->mmc;
	u8 pwr = 0;
	u8 pwr = 0;


	/*
	 * Don't disable/re-enable power to the card when running a
	 * suspend/resume sequence and the pm_flags are configured to preserve
	 * card power during suspend.
	 */
	if (mmc_card_keep_power(mmc) &&
	    ((mmc->dev_status == DEV_SUSPENDED && mode == MMC_POWER_UP) ||
	     (mmc->dev_status == DEV_SUSPENDING && mode == MMC_POWER_OFF)))
		return;

	if (!IS_ERR(mmc->supply.vmmc)) {
	if (!IS_ERR(mmc->supply.vmmc)) {
		spin_unlock_irq(&host->lock);
		spin_unlock_irq(&host->lock);
		mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
		mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
+1 −0
Original line number Original line Diff line number Diff line
@@ -465,6 +465,7 @@ struct mmc_fixup {
#define CID_MANFID_MICRON	0x13
#define CID_MANFID_MICRON	0x13
#define CID_MANFID_SAMSUNG	0x15
#define CID_MANFID_SAMSUNG	0x15
#define CID_MANFID_KINGSTON	0x70
#define CID_MANFID_KINGSTON	0x70
#define CID_MANFID_HYNIX	0x90


#define CID_MANFID_ANY (-1u)
#define CID_MANFID_ANY (-1u)
#define CID_OEMID_ANY ((unsigned short) -1)
#define CID_OEMID_ANY ((unsigned short) -1)
+1 −0
Original line number Original line Diff line number Diff line
@@ -284,6 +284,7 @@ enum dev_state {
	DEV_SUSPENDING = 1,
	DEV_SUSPENDING = 1,
	DEV_SUSPENDED,
	DEV_SUSPENDED,
	DEV_RESUMED,
	DEV_RESUMED,
	DEV_UNKNOWN,	/* Device is in an unknown state */
};
};


/**
/**