Loading drivers/mmc/core/mmc.c +21 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ Loading @@ -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 }; }; Loading Loading @@ -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]; Loading Loading @@ -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); Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading drivers/mmc/host/sdhci.c +10 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading include/linux/mmc/card.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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) Loading include/linux/mmc/host.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ }; }; /** /** Loading Loading
drivers/mmc/core/mmc.c +21 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ Loading @@ -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 }; }; Loading Loading @@ -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]; Loading Loading @@ -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); Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading
drivers/mmc/host/sdhci.c +10 −0 Original line number Original line Diff line number Diff line Loading @@ -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); Loading
include/linux/mmc/card.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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) Loading
include/linux/mmc/host.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ }; }; /** /** Loading