Lines Matching +full:t8103 +full:- +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",
146 priv = policy->driver_data; in apple_soc_cpufreq_get_rate()
148 if (priv->info->cur_pstate_mask) { in apple_soc_cpufreq_get_rate()
149 u32 reg = readl_relaxed(priv->reg_base + APPLE_DVFS_STATUS); in apple_soc_cpufreq_get_rate()
151 pstate = (reg & priv->info->cur_pstate_mask) >> priv->info->cur_pstate_shift; in apple_soc_cpufreq_get_rate()
157 u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_CMD); in apple_soc_cpufreq_get_rate()
162 cpufreq_for_each_valid_entry(p, policy->freq_table) in apple_soc_cpufreq_get_rate()
163 if (p->driver_data == pstate) in apple_soc_cpufreq_get_rate()
164 return p->frequency; in apple_soc_cpufreq_get_rate()
166 dev_err(priv->cpu_dev, "could not find frequency for pstate %d\n", in apple_soc_cpufreq_get_rate()
174 struct apple_cpu_priv *priv = policy->driver_data; in apple_soc_cpufreq_set_target()
175 unsigned int pstate = policy->freq_table[index].driver_data; in apple_soc_cpufreq_set_target()
179 if (index > priv->info->max_pstate) in apple_soc_cpufreq_set_target()
180 index = priv->info->max_pstate; in apple_soc_cpufreq_set_target()
182 if (readq_poll_timeout_atomic(priv->reg_base + APPLE_DVFS_CMD, reg, in apple_soc_cpufreq_set_target()
185 return -EIO; in apple_soc_cpufreq_set_target()
188 reg &= ~priv->info->ps1_mask; in apple_soc_cpufreq_set_target()
189 reg |= pstate << priv->info->ps1_shift; in apple_soc_cpufreq_set_target()
190 if (priv->info->has_ps2) { in apple_soc_cpufreq_set_target()
196 writeq_relaxed(reg, priv->reg_base + APPLE_DVFS_CMD); in apple_soc_cpufreq_set_target()
204 if (apple_soc_cpufreq_set_target(policy, policy->cached_resolved_idx) < 0) in apple_soc_cpufreq_fast_switch()
207 return policy->freq_table[policy->cached_resolved_idx].frequency; in apple_soc_cpufreq_fast_switch()
218 ret = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains", in apple_soc_cpufreq_find_cluster()
219 "#performance-domain-cells", in apple_soc_cpufreq_find_cluster()
220 policy->cpus, &args); in apple_soc_cpufreq_find_cluster()
227 return -ENODEV; in apple_soc_cpufreq_find_cluster()
229 *info = match->data; in apple_soc_cpufreq_find_cluster()
233 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()
334 struct apple_cpu_priv *priv = policy->driver_data; in apple_soc_cpufreq_exit()
336 dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); in apple_soc_cpufreq_exit()
337 dev_pm_opp_remove_all_dynamic(priv->cpu_dev); in apple_soc_cpufreq_exit()
338 iounmap(priv->reg_base); in apple_soc_cpufreq_exit()
343 .name = "apple-cpufreq",
359 if (!of_machine_is_compatible("apple,arm-platform")) in apple_soc_cpufreq_module_init()
360 return -ENODEV; in apple_soc_cpufreq_module_init()
374 MODULE_DESCRIPTION("Apple SoC CPU cluster DVFS driver");