Commit 4a06c250 authored by Hector Martin's avatar Hector Martin Committed by Viresh Kumar
Browse files

cpufreq: apple-soc: Drop setting the PS2 field on M2+



Newer device do not use this. It is not known what this field does,
but change the behavior to be same as macOS to be safe.

Signed-off-by: default avatarHector Martin <marcan@marcan.st>
Signed-off-by: default avatarNick Chan <towinchenmi@gmail.com>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent a248d90d
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@
#define APPLE_DVFS_CMD			0x20
#define APPLE_DVFS_CMD_BUSY		BIT(31)
#define APPLE_DVFS_CMD_SET		BIT(25)
#define APPLE_DVFS_CMD_PS2		GENMASK(16, 12)
#define APPLE_DVFS_CMD_PS2		GENMASK(15, 12)
#define APPLE_DVFS_CMD_PS1		GENMASK(4, 0)

/* Same timebase as CPU counter (24MHz) */
@@ -55,6 +55,7 @@
#define APPLE_DVFS_TRANSITION_TIMEOUT 100

struct apple_soc_cpufreq_info {
	bool has_ps2;
	u64 max_pstate;
	u64 cur_pstate_mask;
	u64 cur_pstate_shift;
@@ -69,18 +70,21 @@ struct apple_cpu_priv {
static struct cpufreq_driver apple_soc_cpufreq_driver;

static const struct apple_soc_cpufreq_info soc_t8103_info = {
	.has_ps2 = true,
	.max_pstate = 15,
	.cur_pstate_mask = APPLE_DVFS_STATUS_CUR_PS_T8103,
	.cur_pstate_shift = APPLE_DVFS_STATUS_CUR_PS_SHIFT_T8103,
};

static const struct apple_soc_cpufreq_info soc_t8112_info = {
	.has_ps2 = false,
	.max_pstate = 31,
	.cur_pstate_mask = APPLE_DVFS_STATUS_CUR_PS_T8112,
	.cur_pstate_shift = APPLE_DVFS_STATUS_CUR_PS_SHIFT_T8112,
};

static const struct apple_soc_cpufreq_info soc_default_info = {
	.has_ps2 = false,
	.max_pstate = 15,
	.cur_pstate_mask = 0, /* fallback */
};
@@ -148,9 +152,12 @@ static int apple_soc_cpufreq_set_target(struct cpufreq_policy *policy,
		return -EIO;
	}

	reg &= ~(APPLE_DVFS_CMD_PS1 | APPLE_DVFS_CMD_PS2);
	reg &= ~APPLE_DVFS_CMD_PS1;
	reg |= FIELD_PREP(APPLE_DVFS_CMD_PS1, pstate);
	if (priv->info->has_ps2) {
		reg &= ~APPLE_DVFS_CMD_PS2;
		reg |= FIELD_PREP(APPLE_DVFS_CMD_PS2, pstate);
	}
	reg |= APPLE_DVFS_CMD_SET;

	writeq_relaxed(reg, priv->reg_base + APPLE_DVFS_CMD);