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

Commit 26ec85b9 authored by Asutosh Das's avatar Asutosh Das
Browse files

mmc: core: support DDR52 bus-speed during eMMC clock scaling



Add support for DDR52 bus-speed mode during clock scaling.
The reason for this change is DDR52 can be supported at SVS
mode.

Change-Id: I68e5fca57ae5cbc154f5dd7001df368900cb3f57
Signed-off-by: default avatarAsutosh Das <asutoshd@codeaurora.org>
parent abba9462
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -1413,6 +1413,24 @@ out:
	return ret;
}

static int mmc_select_hs_ddr52(struct mmc_host *host)
{
	int err;

	mmc_select_hs(host->card);
	mmc_set_clock(host, MMC_HIGH_52_MAX_DTR);
	err = mmc_select_bus_width(host->card);
	if (err < 0) {
		pr_err("%s: %s: select_bus_width failed(%d)\n",
			mmc_hostname(host), __func__, err);
		return err;
	}

	err = mmc_select_hs_ddr(host->card);

	return err;
}

/*
 * Scale down from HS400 to HS in order to allow frequency change.
 * This is needed for cards that doesn't support changing frequency in HS400
@@ -1424,9 +1442,19 @@ static int mmc_scale_low(struct mmc_host *host, unsigned long freq)
	mmc_set_timing(host, MMC_TIMING_LEGACY);
	mmc_set_clock(host, MMC_HIGH_26_MAX_DTR);

	if (host->clk_scaling.lower_bus_speed_mode &
	    MMC_SCALING_LOWER_DDR52_MODE) {
		err = mmc_select_hs_ddr52(host);
		if (err)
			pr_err("%s: %s: failed to switch to DDR52: err: %d\n",
			       mmc_hostname(host), __func__, err);
		else
			return err;
	}

	err = mmc_select_hs(host->card);
	if (err) {
		pr_err("%s: %s: selecting HS (52Mhz) failed (%d)\n",
		pr_err("%s: %s: scaling low: failed (%d)\n",
		       mmc_hostname(host), __func__, err);
		return err;
	}
+2 −0
Original line number Diff line number Diff line
@@ -332,6 +332,8 @@ struct mmc_devfeq_clk_scaling {
	unsigned long	polling_delay_ms;
	unsigned int	upthreshold;
	unsigned int	downthreshold;
	unsigned int	lower_bus_speed_mode;
#define MMC_SCALING_LOWER_DDR52_MODE	1
	bool		need_freq_change;
	bool		clk_scaling_in_progress;
	bool		is_busy_started;