linux/drivers/cpufreq
Marek Behún 22592df194 cpufreq: armada-37xx: Fix setting TBG parent for load levels
With CPU frequency determining software [1] we have discovered that
after this driver does one CPU frequency change, the base frequency of
the CPU is set to the frequency of TBG-A-P clock, instead of the TBG
that is parent to the CPU.

This can be reproduced on EspressoBIN and Turris MOX:
  cd /sys/devices/system/cpu/cpufreq/policy0
  echo powersave >scaling_governor
  echo performance >scaling_governor

Running the mhz tool before this driver is loaded reports 1000 MHz, and
after loading the driver and executing commands above the tool reports
800 MHz.

The change of TBG clock selector is supposed to happen in function
armada37xx_cpufreq_dvfs_setup. Before the function returns, it does
this:
  parent = clk_get_parent(clk);
  clk_set_parent(clk, parent);

The armada-37xx-periph clock driver has the .set_parent method
implemented correctly for this, so if the method was actually called,
this would work. But since the introduction of the common clock
framework in commit b2476490ef ("clk: introduce the common clock..."),
the clk_set_parent function checks whether the parent is actually
changing, and if the requested new parent is same as the old parent
(which is obviously the case for the code above), the .set_parent method
is not called at all.

This patch fixes this issue by filling the correct TBG clock selector
directly in the armada37xx_cpufreq_dvfs_setup during the filling of
other registers at the same address. But the determination of CPU TBG
index cannot be done via the common clock framework, therefore we need
to access the North Bridge Peripheral Clock registers directly in this
driver.

[1] https://github.com/wtarreau/mhz

Signed-off-by: Marek Behún <kabel@kernel.org>
Acked-by: Gregory CLEMENT <gregory.clement@bootlin.com>
Tested-by: Pali Rohár <pali@kernel.org>
Tested-by: Tomasz Maciej Nowak <tmn505@gmail.com>
Tested-by: Anders Trier Olesen <anders.trier.olesen@gmail.com>
Tested-by: Philip Soares <philips@netisense.com>
Fixes: 92ce45fb87 ("cpufreq: Add DVFS support for Armada 37xx")
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
2021-04-09 15:17:32 +05:30
..
acpi-cpufreq.c cpufreq: ACPI: Set cpuinfo.max_freq directly if max boost is known 2021-02-18 18:34:56 +01:00
amd_freq_sensitivity.c cpufreq: amd_freq_sensitivity: Mark sometimes used ID structs as __maybe_unused 2020-07-15 15:17:06 +02:00
armada-8k-cpufreq.c cpufreq: ap806: Add missing MODULE_DEVICE_TABLE 2020-12-07 13:02:37 +05:30
armada-37xx-cpufreq.c cpufreq: armada-37xx: Fix setting TBG parent for load levels 2021-04-09 15:17:32 +05:30
bmips-cpufreq.c cpufreq: Make cpufreq_generic_init() return void 2019-07-16 10:20:11 +02:00
brcmstb-avs-cpufreq.c cpufreq: brcmstb-avs-cpufreq: Fix resource leaks in ->remove() 2021-01-18 12:23:43 +05:30
cppc_cpufreq.c cpufreq: cppc: simplify default delay_us setting 2021-03-22 08:55:41 +05:30
cpufreq_conservative.c cpufreq: Register governors at core_initcall 2020-07-02 13:03:30 +02:00
cpufreq_governor_attr_set.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
cpufreq_governor.c cpufreq: cpufreq_governor: Demote store_sampling_rate() header to standard comment block 2020-07-15 15:17:06 +02:00
cpufreq_governor.h cpufreq: Introduce governor flags 2020-11-10 18:31:17 +01:00
cpufreq_ondemand.c cpufreq: Register governors at core_initcall 2020-07-02 13:03:30 +02:00
cpufreq_ondemand.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
cpufreq_performance.c cpufreq: Introduce CPUFREQ_GOV_STRICT_TARGET 2020-11-10 18:31:17 +01:00
cpufreq_powersave.c cpufreq: Introduce CPUFREQ_GOV_STRICT_TARGET 2020-11-10 18:31:17 +01:00
cpufreq_stats.c cpufreq: stats: Use local_clock() instead of jiffies 2020-12-11 19:53:58 +01:00
cpufreq_userspace.c cpufreq: Register governors at core_initcall 2020-07-02 13:03:30 +02:00
cpufreq-dt-platdev.c cpufreq: blacklist Arm Vexpress platforms in cpufreq-dt-platdev 2021-03-08 16:20:07 +05:30
cpufreq-dt.c cpufreq: dt: dev_pm_opp_of_cpumask_add_table() may return -EPROBE_DEFER 2021-03-25 12:28:09 +05:30
cpufreq-dt.h cpufreq: dt: Allow platform specific intermediate callbacks 2020-03-12 15:43:52 +05:30
cpufreq-nforce2.c cpufreq: Avoid creating excessively large stack frames 2020-01-27 10:33:33 +01:00
cpufreq.c cpufreq: Fix typo in kerneldoc comment 2021-02-19 16:17:11 +01:00
davinci-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
e_powersaver.c cpufreq: e_powersaver: remove unreachable break 2020-10-27 18:42:54 +01:00
elanfreq.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
freq_table.c cpufreq: ACPI: Set cpuinfo.max_freq directly if max boost is known 2021-02-18 18:34:56 +01:00
gx-suspmod.c cpufreq: Avoid creating excessively large stack frames 2020-01-27 10:33:33 +01:00
highbank-cpufreq.c cpufreq: highbank: Add missing MODULE_DEVICE_TABLE 2020-12-07 13:02:37 +05:30
ia64-acpi-cpufreq.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
imx6q-cpufreq.c cpufreq: imx6q: Unconditionally call dev_pm_opp_of_remove_table() 2020-09-10 16:36:09 +05:30
imx-cpufreq-dt.c cpufreq: imx-cpufreq-dt: support i.MX7ULP 2020-04-28 14:26:20 +05:30
intel_pstate.c cpufreq: intel_pstate: Remove repeated word 2021-01-22 17:04:56 +01:00
Kconfig cpufreq: Avoid configuring old governors as default with intel_pstate 2020-10-27 18:45:34 +01:00
Kconfig.arm cpufreq: CPPC: Add support for frequency invariance 2021-03-22 08:55:28 +05:30
Kconfig.powerpc cpufreq: Fix Kconfig indentation 2019-11-29 11:52:02 +01:00
Kconfig.x86 cpufreq: sfi-cpufreq: Remove driver for deprecated firmware 2021-02-15 20:04:46 +01:00
kirkwood-cpufreq.c cpufreq: kirkwood: convert to devm_platform_ioremap_resource 2020-01-07 13:29:58 +05:30
longhaul.c cpufreq: e_powersaver: remove unreachable break 2020-10-27 18:42:54 +01:00
longhaul.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 166 2019-05-30 11:26:39 -07:00
longrun.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
loongson1-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
loongson2_cpufreq.c mips: loongsoon2ef: remove private clk api 2020-04-16 17:34:23 +02:00
Makefile Simple Firmware Interface (SFI) support removal for v5.12-rc1 2021-02-24 10:35:29 -08:00
maple-cpufreq.c Merge branch 'pm-cpufreq' 2019-07-18 09:49:30 +02:00
mediatek-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
mvebu-cpufreq.c cpufreq: mvebu: Remove OPPs using dev_pm_opp_remove() 2018-09-19 14:56:44 -07:00
omap-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
p4-clockmod.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
pasemi-cpufreq.c cpufreq: pasemi: Include header file for {check,restore}_astate prototypes 2020-07-15 15:17:06 +02:00
pcc-cpufreq.c cpufreq: pcc-cpufreq: Mark sometimes used ID structs as __maybe_unused 2020-07-15 15:17:06 +02:00
pmac32-cpufreq.c cpufreq: Remove unused flag CPUFREQ_PM_NO_WARN 2021-02-04 19:25:47 +01:00
pmac64-cpufreq.c Merge branch 'pm-cpufreq' 2019-07-18 09:49:30 +02:00
powernow-k6.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
powernow-k7.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
powernow-k7.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 166 2019-05-30 11:26:39 -07:00
powernow-k8.c cpufreq: powernow-k8: pass policy rather than use cpufreq_cpu_get() 2021-01-07 17:37:33 +01:00
powernow-k8.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 347 2019-06-05 17:37:08 +02:00
powernv-cpufreq.c cpufreq: powernv: Fix frame-size-overflow in powernv_cpufreq_reboot_notifier 2020-10-08 21:17:16 +11:00
ppc_cbe_cpufreq_pervasive.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 153 2019-05-30 11:26:32 -07:00
ppc_cbe_cpufreq_pmi.c cpufreq: Use per-policy frequency QoS 2019-10-21 02:05:21 +02:00
ppc_cbe_cpufreq.c cpufreq: powerpc_cbe: Switch to QoS requests for freq limits 2019-08-26 10:02:01 +02:00
ppc_cbe_cpufreq.h cpufreq: powerpc_cbe: Switch to QoS requests for freq limits 2019-08-26 10:02:01 +02:00
pxa2xx-cpufreq.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
pxa3xx-cpufreq.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
qcom-cpufreq-hw.c cpufreq: qcom-hw: Fix return value check in qcom_cpufreq_hw_cpu_init() 2021-03-08 16:20:07 +05:30
qcom-cpufreq-nvmem.c Merge branch 'pm-cpufreq' 2020-12-15 15:24:52 +01:00
qoriq-cpufreq.c cpufreq: qoriq: convert to a platform driver 2020-05-07 10:47:27 +05:30
raspberrypi-cpufreq.c cpufreq: add driver for Raspberry Pi 2019-06-13 08:58:22 +05:30
s3c24xx-cpufreq-debugfs.c ARM: s3c: remove cpufreq header dependencies 2020-08-20 17:52:05 +02:00
s3c24xx-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
s3c64xx-cpufreq.c cpufreq: s3c64xx: Remove pointless NULL check in s3c64xx_cpufreq_driver_init 2019-10-23 08:53:23 +05:30
s3c2410-cpufreq.c cpufreq: s3c24xx: move low-level clk reg access into platform code 2020-08-20 17:53:22 +02:00
s3c2412-cpufreq.c cpufreq: s3c24xx: move low-level clk reg access into platform code 2020-08-20 17:53:22 +02:00
s3c2416-cpufreq.c cpufreq: s3c: fix unbalances of cpufreq policy refcount 2020-01-07 13:31:01 +05:30
s3c2440-cpufreq.c cpufreq: s3c24xx: move low-level clk reg access into platform code 2020-08-20 17:53:22 +02:00
s5pv210-cpufreq.c cpufreq: Rudimentary typos fix in the file s5pv210-cpufreq.c 2021-03-22 08:55:41 +05:30
sa1100-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
sa1110-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
sc520_freq.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
scmi-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
scpi-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
sh-cpufreq.c cpufreq: Avoid creating excessively large stack frames 2020-01-27 10:33:33 +01:00
sparc-us2e-cpufreq.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
sparc-us3-cpufreq.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
spear-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
speedstep-centrino.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
speedstep-ich.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
speedstep-lib.c cpufreq: speedstep: remove unneeded semicolon 2020-10-28 18:04:07 +01:00
speedstep-lib.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 166 2019-05-30 11:26:39 -07:00
speedstep-smi.c cpufreq: Convert to new X86 CPU match macros 2020-03-24 21:31:27 +01:00
sti-cpufreq.c cpufreq: st: Add missing MODULE_DEVICE_TABLE 2020-12-07 13:02:37 +05:30
sun50i-cpufreq-nvmem.c cpufreq: sun50i: Add missing MODULE_DEVICE_TABLE 2020-12-07 13:02:37 +05:30
tegra20-cpufreq.c cpufreq: tegra20: Use resource-managed API 2021-01-18 12:02:53 +05:30
tegra124-cpufreq.c cpufreq: tegra124: Add suspend and resume support 2019-10-29 13:25:29 +01:00
tegra186-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
tegra194-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00
ti-cpufreq.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
vexpress-spc-cpufreq.c cpufreq: Remove CPUFREQ_STICKY flag 2021-02-04 19:23:20 +01:00