18c2ecf20Sopenharmony_ci#include <linux/of.h>
28c2ecf20Sopenharmony_ci#include <linux/cpu.h>
38c2ecf20Sopenharmony_ci#include <linux/clk.h>
48c2ecf20Sopenharmony_ci#include <linux/pm_opp.h>
58c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cistatic const struct of_device_id machines[] __initconst = {
88c2ecf20Sopenharmony_ci	{ .compatible = "sigma,tango4" },
98c2ecf20Sopenharmony_ci	{ /* sentinel */ }
108c2ecf20Sopenharmony_ci};
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistatic int __init tango_cpufreq_init(void)
138c2ecf20Sopenharmony_ci{
148c2ecf20Sopenharmony_ci	struct device *cpu_dev = get_cpu_device(0);
158c2ecf20Sopenharmony_ci	unsigned long max_freq;
168c2ecf20Sopenharmony_ci	struct clk *cpu_clk;
178c2ecf20Sopenharmony_ci	void *res;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	if (!of_match_node(machines, of_root))
208c2ecf20Sopenharmony_ci		return -ENODEV;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	cpu_clk = clk_get(cpu_dev, NULL);
238c2ecf20Sopenharmony_ci	if (IS_ERR(cpu_clk))
248c2ecf20Sopenharmony_ci		return -ENODEV;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	max_freq = clk_get_rate(cpu_clk);
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	dev_pm_opp_add(cpu_dev, max_freq / 1, 0);
298c2ecf20Sopenharmony_ci	dev_pm_opp_add(cpu_dev, max_freq / 2, 0);
308c2ecf20Sopenharmony_ci	dev_pm_opp_add(cpu_dev, max_freq / 3, 0);
318c2ecf20Sopenharmony_ci	dev_pm_opp_add(cpu_dev, max_freq / 5, 0);
328c2ecf20Sopenharmony_ci	dev_pm_opp_add(cpu_dev, max_freq / 9, 0);
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	res = platform_device_register_data(NULL, "cpufreq-dt", -1, NULL, 0);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	return PTR_ERR_OR_ZERO(res);
378c2ecf20Sopenharmony_ci}
388c2ecf20Sopenharmony_cidevice_initcall(tango_cpufreq_init);
39