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