diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 4ea2b2d44b90..2261d57af6a5 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -126,6 +126,12 @@ static void mmc_set_erase_size(struct mmc_card *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[] = { /* avoid HPI for specific cards */ @@ -136,6 +142,9 @@ static const struct mmc_fixup mmc_fixups[] = { MMC_FIXUP("MMC16G", CID_MANFID_KINGSTON, CID_OEMID_ANY, 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 }; @@ -382,6 +391,9 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) */ 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[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index c8faf8b146ee..ce2a0aa79425 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -472,6 +472,7 @@ struct mmc_fixup { #define CID_MANFID_MICRON 0x13 #define CID_MANFID_SAMSUNG 0x15 #define CID_MANFID_KINGSTON 0x70 +#define CID_MANFID_HYNIX 0x90 #define CID_MANFID_ANY (-1u) #define CID_OEMID_ANY ((unsigned short) -1)