Lines Matching +full:cluster +full:- +full:cpufreq

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Apple SoC CPU cluster performance state driver
7 * Based on scpi-cpufreq.c
13 #include <linux/cpufreq.h>
117 .compatible = "apple,s5l8960x-cluster-cpufreq",
121 .compatible = "apple,t8103-cluster-cpufreq",
125 .compatible = "apple,t8112-cluster-cpufreq",
129 .compatible = "apple,cluster-cpufreq",
138 struct apple_cpu_priv *priv = policy->driver_data; in apple_soc_cpufreq_get_rate()
142 if (priv->info->cur_pstate_mask) { in apple_soc_cpufreq_get_rate()
143 u32 reg = readl_relaxed(priv->reg_base + APPLE_DVFS_STATUS); in apple_soc_cpufreq_get_rate()
145 pstate = (reg & priv->info->cur_pstate_mask) >> priv->info->cur_pstate_shift; in apple_soc_cpufreq_get_rate()
151 u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_CMD); in apple_soc_cpufreq_get_rate()
156 cpufreq_for_each_valid_entry(p, policy->freq_table) in apple_soc_cpufreq_get_rate()
157 if (p->driver_data == pstate) in apple_soc_cpufreq_get_rate()
158 return p->frequency; in apple_soc_cpufreq_get_rate()
160 dev_err(priv->cpu_dev, "could not find frequency for pstate %d\n", in apple_soc_cpufreq_get_rate()
168 struct apple_cpu_priv *priv = policy->driver_data; in apple_soc_cpufreq_set_target()
169 unsigned int pstate = policy->freq_table[index].driver_data; in apple_soc_cpufreq_set_target()
173 if (index > priv->info->max_pstate) in apple_soc_cpufreq_set_target()
174 index = priv->info->max_pstate; in apple_soc_cpufreq_set_target()
176 if (readq_poll_timeout_atomic(priv->reg_base + APPLE_DVFS_CMD, reg, in apple_soc_cpufreq_set_target()
179 return -EIO; in apple_soc_cpufreq_set_target()
182 reg &= ~priv->info->ps1_mask; in apple_soc_cpufreq_set_target()
183 reg |= pstate << priv->info->ps1_shift; in apple_soc_cpufreq_set_target()
184 if (priv->info->has_ps2) { in apple_soc_cpufreq_set_target()
190 writeq_relaxed(reg, priv->reg_base + APPLE_DVFS_CMD); in apple_soc_cpufreq_set_target()
198 if (apple_soc_cpufreq_set_target(policy, policy->cached_resolved_idx) < 0) in apple_soc_cpufreq_fast_switch()
201 return policy->freq_table[policy->cached_resolved_idx].frequency; in apple_soc_cpufreq_fast_switch()
212 ret = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains", in apple_soc_cpufreq_find_cluster()
213 "#performance-domain-cells", in apple_soc_cpufreq_find_cluster()
214 policy->cpus, &args); in apple_soc_cpufreq_find_cluster()
221 return -ENODEV; in apple_soc_cpufreq_find_cluster()
223 *info = match->data; in apple_soc_cpufreq_find_cluster()
227 return -ENOMEM; in apple_soc_cpufreq_find_cluster()
248 cpu_dev = get_cpu_device(policy->cpu); in apple_soc_cpufreq_init()
250 pr_err("failed to get cpu%d device\n", policy->cpu); in apple_soc_cpufreq_init()
251 return -ENODEV; in apple_soc_cpufreq_init()
262 dev_err(cpu_dev, "%s: failed to get cluster info: %d\n", __func__, ret); in apple_soc_cpufreq_init()
266 ret = dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus); in apple_soc_cpufreq_init()
275 ret = -EPROBE_DEFER; in apple_soc_cpufreq_init()
281 ret = -ENOMEM; in apple_soc_cpufreq_init()
287 dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); in apple_soc_cpufreq_init()
291 /* Get OPP levels (p-state indexes) and stash them in driver_data */ in apple_soc_cpufreq_init()
304 priv->cpu_dev = cpu_dev; in apple_soc_cpufreq_init()
305 priv->reg_base = reg_base; in apple_soc_cpufreq_init()
306 priv->info = info; in apple_soc_cpufreq_init()
307 policy->driver_data = priv; in apple_soc_cpufreq_init()
308 policy->freq_table = freq_table; in apple_soc_cpufreq_init()
314 policy->cpuinfo.transition_latency = transition_latency; in apple_soc_cpufreq_init()
315 policy->dvfs_possible_from_any_cpu = true; in apple_soc_cpufreq_init()
316 policy->fast_switch_possible = true; in apple_soc_cpufreq_init()
317 policy->suspend_freq = freq_table[0].frequency; in apple_soc_cpufreq_init()
344 struct apple_cpu_priv *priv = policy->driver_data; in apple_soc_cpufreq_exit()
346 dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); in apple_soc_cpufreq_exit()
347 dev_pm_opp_remove_all_dynamic(priv->cpu_dev); in apple_soc_cpufreq_exit()
348 iounmap(priv->reg_base); in apple_soc_cpufreq_exit()
353 .name = "apple-cpufreq",
369 if (!of_machine_is_compatible("apple,arm-platform")) in apple_soc_cpufreq_module_init()
370 return -ENODEV; in apple_soc_cpufreq_module_init()
384 MODULE_DESCRIPTION("Apple SoC CPU cluster DVFS driver");