18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Linaro. 48c2ecf20Sopenharmony_ci * Viresh Kumar <viresh.kumar@linaro.org> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/err.h> 88c2ecf20Sopenharmony_ci#include <linux/of.h> 98c2ecf20Sopenharmony_ci#include <linux/of_device.h> 108c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include "cpufreq-dt.h" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* 158c2ecf20Sopenharmony_ci * Machines for which the cpufreq device is *always* created, mostly used for 168c2ecf20Sopenharmony_ci * platforms using "operating-points" (V1) property. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_cistatic const struct of_device_id whitelist[] __initconst = { 198c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun4i-a10", }, 208c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun5i-a10s", }, 218c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun5i-a13", }, 228c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun5i-r8", }, 238c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun6i-a31", }, 248c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun6i-a31s", }, 258c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun7i-a20", }, 268c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun8i-a23", }, 278c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun8i-a83t", }, 288c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun8i-h3", }, 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci { .compatible = "apm,xgene-shadowcat", }, 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci { .compatible = "arm,integrator-ap", }, 338c2ecf20Sopenharmony_ci { .compatible = "arm,integrator-cp", }, 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci { .compatible = "hisilicon,hi3660", }, 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci { .compatible = "fsl,imx27", }, 388c2ecf20Sopenharmony_ci { .compatible = "fsl,imx51", }, 398c2ecf20Sopenharmony_ci { .compatible = "fsl,imx53", }, 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci { .compatible = "marvell,berlin", }, 428c2ecf20Sopenharmony_ci { .compatible = "marvell,pxa250", }, 438c2ecf20Sopenharmony_ci { .compatible = "marvell,pxa270", }, 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci { .compatible = "samsung,exynos3250", }, 468c2ecf20Sopenharmony_ci { .compatible = "samsung,exynos4210", }, 478c2ecf20Sopenharmony_ci { .compatible = "samsung,exynos5250", }, 488c2ecf20Sopenharmony_ci#ifndef CONFIG_BL_SWITCHER 498c2ecf20Sopenharmony_ci { .compatible = "samsung,exynos5800", }, 508c2ecf20Sopenharmony_ci#endif 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci { .compatible = "renesas,emev2", }, 538c2ecf20Sopenharmony_ci { .compatible = "renesas,r7s72100", }, 548c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a73a4", }, 558c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7740", }, 568c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7742", }, 578c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7743", }, 588c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7744", }, 598c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7745", }, 608c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7778", }, 618c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7779", }, 628c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7790", }, 638c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7791", }, 648c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7792", }, 658c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7793", }, 668c2ecf20Sopenharmony_ci { .compatible = "renesas,r8a7794", }, 678c2ecf20Sopenharmony_ci { .compatible = "renesas,sh73a0", }, 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk2928", }, 708c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3036", }, 718c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3066a", }, 728c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3066b", }, 738c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3188", }, 748c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3228", }, 758c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3288", }, 768c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3328", }, 778c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3366", }, 788c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3368", }, 798c2ecf20Sopenharmony_ci { .compatible = "rockchip,rk3399", 808c2ecf20Sopenharmony_ci .data = &(struct cpufreq_dt_platform_data) 818c2ecf20Sopenharmony_ci { .have_governor_per_policy = true, }, 828c2ecf20Sopenharmony_ci }, 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci { .compatible = "st-ericsson,u8500", }, 858c2ecf20Sopenharmony_ci { .compatible = "st-ericsson,u8540", }, 868c2ecf20Sopenharmony_ci { .compatible = "st-ericsson,u9500", }, 878c2ecf20Sopenharmony_ci { .compatible = "st-ericsson,u9540", }, 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci { .compatible = "ti,omap2", }, 908c2ecf20Sopenharmony_ci { .compatible = "ti,omap4", }, 918c2ecf20Sopenharmony_ci { .compatible = "ti,omap5", }, 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci { .compatible = "xlnx,zynq-7000", }, 948c2ecf20Sopenharmony_ci { .compatible = "xlnx,zynqmp", }, 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci { } 978c2ecf20Sopenharmony_ci}; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci/* 1008c2ecf20Sopenharmony_ci * Machines for which the cpufreq device is *not* created, mostly used for 1018c2ecf20Sopenharmony_ci * platforms using "operating-points-v2" property. 1028c2ecf20Sopenharmony_ci */ 1038c2ecf20Sopenharmony_cistatic const struct of_device_id blacklist[] __initconst = { 1048c2ecf20Sopenharmony_ci { .compatible = "allwinner,sun50i-h6", }, 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci { .compatible = "arm,vexpress", }, 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci { .compatible = "calxeda,highbank", }, 1098c2ecf20Sopenharmony_ci { .compatible = "calxeda,ecx-2000", }, 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci { .compatible = "fsl,imx7ulp", }, 1128c2ecf20Sopenharmony_ci { .compatible = "fsl,imx7d", }, 1138c2ecf20Sopenharmony_ci { .compatible = "fsl,imx8mq", }, 1148c2ecf20Sopenharmony_ci { .compatible = "fsl,imx8mm", }, 1158c2ecf20Sopenharmony_ci { .compatible = "fsl,imx8mn", }, 1168c2ecf20Sopenharmony_ci { .compatible = "fsl,imx8mp", }, 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci { .compatible = "marvell,armadaxp", }, 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt2701", }, 1218c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt2712", }, 1228c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt7622", }, 1238c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt7623", }, 1248c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt817x", }, 1258c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt8173", }, 1268c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt8176", }, 1278c2ecf20Sopenharmony_ci { .compatible = "mediatek,mt8183", }, 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci { .compatible = "nvidia,tegra20", }, 1308c2ecf20Sopenharmony_ci { .compatible = "nvidia,tegra30", }, 1318c2ecf20Sopenharmony_ci { .compatible = "nvidia,tegra124", }, 1328c2ecf20Sopenharmony_ci { .compatible = "nvidia,tegra210", }, 1338c2ecf20Sopenharmony_ci { .compatible = "nvidia,tegra234", }, 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci { .compatible = "qcom,apq8096", }, 1368c2ecf20Sopenharmony_ci { .compatible = "qcom,msm8996", }, 1378c2ecf20Sopenharmony_ci { .compatible = "qcom,qcs404", }, 1388c2ecf20Sopenharmony_ci { .compatible = "qcom,sc7180", }, 1398c2ecf20Sopenharmony_ci { .compatible = "qcom,sdm845", }, 1408c2ecf20Sopenharmony_ci { .compatible = "qcom,sm8150", }, 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci { .compatible = "st,stih407", }, 1438c2ecf20Sopenharmony_ci { .compatible = "st,stih410", }, 1448c2ecf20Sopenharmony_ci { .compatible = "st,stih418", }, 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci { .compatible = "sigma,tango4", }, 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci { .compatible = "ti,am33xx", }, 1498c2ecf20Sopenharmony_ci { .compatible = "ti,am43", }, 1508c2ecf20Sopenharmony_ci { .compatible = "ti,dra7", }, 1518c2ecf20Sopenharmony_ci { .compatible = "ti,omap3", }, 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci { .compatible = "qcom,ipq8064", }, 1548c2ecf20Sopenharmony_ci { .compatible = "qcom,apq8064", }, 1558c2ecf20Sopenharmony_ci { .compatible = "qcom,msm8974", }, 1568c2ecf20Sopenharmony_ci { .compatible = "qcom,msm8960", }, 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci { } 1598c2ecf20Sopenharmony_ci}; 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_cistatic bool __init cpu0_node_has_opp_v2_prop(void) 1628c2ecf20Sopenharmony_ci{ 1638c2ecf20Sopenharmony_ci struct device_node *np = of_cpu_device_node_get(0); 1648c2ecf20Sopenharmony_ci bool ret = false; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci if (of_property_present(np, "operating-points-v2")) 1678c2ecf20Sopenharmony_ci ret = true; 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci of_node_put(np); 1708c2ecf20Sopenharmony_ci return ret; 1718c2ecf20Sopenharmony_ci} 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_cistatic int __init cpufreq_dt_platdev_init(void) 1748c2ecf20Sopenharmony_ci{ 1758c2ecf20Sopenharmony_ci struct device_node *np = of_find_node_by_path("/"); 1768c2ecf20Sopenharmony_ci const struct of_device_id *match; 1778c2ecf20Sopenharmony_ci const void *data = NULL; 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci if (!np) 1808c2ecf20Sopenharmony_ci return -ENODEV; 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci match = of_match_node(whitelist, np); 1838c2ecf20Sopenharmony_ci if (match) { 1848c2ecf20Sopenharmony_ci data = match->data; 1858c2ecf20Sopenharmony_ci goto create_pdev; 1868c2ecf20Sopenharmony_ci } 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci if (cpu0_node_has_opp_v2_prop() && !of_match_node(blacklist, np)) 1898c2ecf20Sopenharmony_ci goto create_pdev; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci of_node_put(np); 1928c2ecf20Sopenharmony_ci return -ENODEV; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cicreate_pdev: 1958c2ecf20Sopenharmony_ci of_node_put(np); 1968c2ecf20Sopenharmony_ci return PTR_ERR_OR_ZERO(platform_device_register_data(NULL, "cpufreq-dt", 1978c2ecf20Sopenharmony_ci -1, data, 1988c2ecf20Sopenharmony_ci sizeof(struct cpufreq_dt_platform_data))); 1998c2ecf20Sopenharmony_ci} 2008c2ecf20Sopenharmony_cicore_initcall(cpufreq_dt_platdev_init); 201