Commit fea3ac55 authored by Linus Walleij's avatar Linus Walleij Committed by Lee Jones
Browse files

mfd: db8500-prcmu: Support the higher DB8520 ARMSS



The DB8520 used in a lot of Samsung phones has a slightly higher
maximum ARMSS frequency than the DB8500. In order to not confuse
the OPP framework and cpufreq, make sure the PRCMU driver
returns the correct frequency.

Cc: Stephan Gerhold <stephan@gerhold.net>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 569fac74
Loading
Loading
Loading
Loading
+35 −5
Original line number Diff line number Diff line
@@ -1695,21 +1695,41 @@ static long round_clock_rate(u8 clock, unsigned long rate)
	return rounded_rate;
}

static const unsigned long armss_freqs[] = {
static const unsigned long db8500_armss_freqs[] = {
	200000000,
	400000000,
	800000000,
	998400000
};

/* The DB8520 has slightly higher ARMSS max frequency */
static const unsigned long db8520_armss_freqs[] = {
	200000000,
	400000000,
	800000000,
	1152000000
};



static long round_armss_rate(unsigned long rate)
{
	unsigned long freq = 0;
	const unsigned long *freqs;
	int nfreqs;
	int i;

	if (fw_info.version.project == PRCMU_FW_PROJECT_U8520) {
		freqs = db8520_armss_freqs;
		nfreqs = ARRAY_SIZE(db8520_armss_freqs);
	} else {
		freqs = db8500_armss_freqs;
		nfreqs = ARRAY_SIZE(db8500_armss_freqs);
	}

	/* Find the corresponding arm opp from the cpufreq table. */
	for (i = 0; i < ARRAY_SIZE(armss_freqs); i++) {
		freq = armss_freqs[i];
	for (i = 0; i < nfreqs; i++) {
		freq = freqs[i];
		if (rate <= freq)
			break;
	}
@@ -1854,11 +1874,21 @@ static int set_armss_rate(unsigned long rate)
{
	unsigned long freq;
	u8 opps[] = { ARM_EXTCLK, ARM_50_OPP, ARM_100_OPP, ARM_MAX_OPP };
	const unsigned long *freqs;
	int nfreqs;
	int i;

	if (fw_info.version.project == PRCMU_FW_PROJECT_U8520) {
		freqs = db8520_armss_freqs;
		nfreqs = ARRAY_SIZE(db8520_armss_freqs);
	} else {
		freqs = db8500_armss_freqs;
		nfreqs = ARRAY_SIZE(db8500_armss_freqs);
	}

	/* Find the corresponding arm opp from the cpufreq table. */
	for (i = 0; i < ARRAY_SIZE(armss_freqs); i++) {
		freq = armss_freqs[i];
	for (i = 0; i < nfreqs; i++) {
		freq = freqs[i];
		if (rate == freq)
			break;
	}