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

Commit cc2bf370 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mmc: core: enable async suspend of card"

parents 822ce019 aae6a63f
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ struct mmc_blk_data {
#define MMC_BLK_DISCARD		BIT(2)
#define MMC_BLK_SECDISCARD	BIT(3)
#define MMC_BLK_CQE_RECOVERY	BIT(4)
#define MMC_BLK_PARTSWITCH     BIT(5)

	/*
	 * Only set in main mmc_blk_data associated
@@ -889,6 +890,9 @@ static inline int mmc_blk_part_switch(struct mmc_card *card,
				 EXT_CSD_PART_CONFIG, part_config,
				 card->ext_csd.part_time);
		if (ret) {
			pr_err("%s: %s: switch failure, %d -> %d\n",
				mmc_hostname(card->host), __func__,
				main_md->part_curr, part_type);
			mmc_blk_part_switch_post(card, part_type);
			return ret;
		}
@@ -2263,10 +2267,22 @@ enum mmc_issued mmc_blk_mq_issue_rq(struct mmc_queue *mq, struct request *req)
	struct mmc_card *card = md->queue.card;
	struct mmc_host *host = card->host;
	int ret;
	int err;

	ret = mmc_blk_part_switch(card, md->part_type);
	if (ret)
	if (ret) {
		err = mmc_blk_reset(md, card->host, MMC_BLK_PARTSWITCH);
		if (!err) {
			pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) succeeded.\n",
					mmc_hostname(card->host));
			mmc_blk_reset_success(md, MMC_BLK_PARTSWITCH);
		} else {
			pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) failed.\n",
					mmc_hostname(card->host));
		}

		return MMC_REQ_FAILED_TO_START;
	}

	switch (mmc_issue_type(mq, req)) {
	case MMC_ISSUE_SYNC:
+1 −0
Original line number Diff line number Diff line
@@ -387,6 +387,7 @@ int mmc_add_card(struct mmc_card *card)
		return ret;

	mmc_card_set_present(card);
	device_enable_async_suspend(&card->dev);

	return 0;
}
+12 −0
Original line number Diff line number Diff line
@@ -2748,6 +2748,13 @@ static int _mmc_hw_reset(struct mmc_host *host)
		mmc_pwrseq_reset(host);
	}

	/* Suspend clk scaling to avoid switching frequencies intermittently */
	ret = mmc_suspend_clk_scaling(host);
	if (ret) {
		pr_err("%s: %s: fail to suspend clock scaling (%d)\n",
				mmc_hostname(host), __func__, ret);
		return ret;
	}
	ret = mmc_init_card(host, host->card->ocr, host->card);
	if (ret) {
		pr_err("%s: %s: mmc_init_card failed (%d)\n",
@@ -2755,6 +2762,11 @@ static int _mmc_hw_reset(struct mmc_host *host)
		return ret;
	}

	ret = mmc_suspend_clk_scaling(host);
	if (ret) {
		pr_err("%s: %s: fail to suspend clock scaling (%d)\n",
				mmc_hostname(host), __func__, ret);
	}
	return ret;
}

+8 −2
Original line number Diff line number Diff line
@@ -937,8 +937,14 @@ static int mmc_read_bkops_status(struct mmc_card *card)
	if (err)
		return err;

	card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS];
	card->ext_csd.raw_exception_status = ext_csd[EXT_CSD_EXP_EVENTS_STATUS];
	card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS] &
						MMC_BKOPS_URGENCY_MASK;
	card->ext_csd.raw_exception_status =
					ext_csd[EXT_CSD_EXP_EVENTS_STATUS] &
					(EXT_CSD_URGENT_BKOPS |
					 EXT_CSD_DYNCAP_NEEDED |
					 EXT_CSD_SYSPOOL_EXHAUSTED
					 | EXT_CSD_PACKED_FAILURE);
	kfree(ext_csd);
	return 0;
}