2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2016-03-30 11:15:26 +03:00
/*
* Copyright ( C ) 2016 Linaro .
* Viresh Kumar < viresh . kumar @ linaro . org >
*/
# include <linux/err.h>
# include <linux/of.h>
2017-08-16 08:37:27 +03:00
# include <linux/of_device.h>
2016-03-30 11:15:26 +03:00
# include <linux/platform_device.h>
2016-09-09 14:18:08 +03:00
# include "cpufreq-dt.h"
2017-08-16 08:37:27 +03:00
/*
* Machines for which the cpufreq device is * always * created , mostly used for
* platforms using " operating-points " ( V1 ) property .
*/
2021-05-20 07:26:18 +03:00
static const struct of_device_id allowlist [ ] __initconst = {
2016-04-22 14:28:45 +03:00
{ . compatible = " allwinner,sun4i-a10 " , } ,
{ . compatible = " allwinner,sun5i-a10s " , } ,
{ . compatible = " allwinner,sun5i-a13 " , } ,
{ . compatible = " allwinner,sun5i-r8 " , } ,
{ . compatible = " allwinner,sun6i-a31 " , } ,
{ . compatible = " allwinner,sun6i-a31s " , } ,
{ . compatible = " allwinner,sun7i-a20 " , } ,
{ . compatible = " allwinner,sun8i-a23 " , } ,
{ . compatible = " allwinner,sun8i-a83t " , } ,
{ . compatible = " allwinner,sun8i-h3 " , } ,
2016-12-16 01:55:00 +03:00
{ . compatible = " apm,xgene-shadowcat " , } ,
2016-10-25 10:21:24 +03:00
{ . compatible = " arm,integrator-ap " , } ,
{ . compatible = " arm,integrator-cp " , } ,
2017-05-23 11:13:18 +03:00
{ . compatible = " hisilicon,hi3660 " , } ,
2016-04-22 14:28:47 +03:00
2016-04-22 14:28:41 +03:00
{ . compatible = " fsl,imx27 " , } ,
{ . compatible = " fsl,imx51 " , } ,
{ . compatible = " fsl,imx53 " , } ,
2016-04-22 14:28:40 +03:00
{ . compatible = " marvell,berlin " , } ,
2016-10-31 22:54:53 +03:00
{ . compatible = " marvell,pxa250 " , } ,
{ . compatible = " marvell,pxa270 " , } ,
2016-04-22 14:28:40 +03:00
2016-03-30 11:15:28 +03:00
{ . compatible = " samsung,exynos3250 " , } ,
{ . compatible = " samsung,exynos4210 " , } ,
{ . compatible = " samsung,exynos5250 " , } ,
# ifndef CONFIG_BL_SWITCHER
{ . compatible = " samsung,exynos5800 " , } ,
# endif
2016-04-22 14:28:42 +03:00
2016-04-22 14:28:44 +03:00
{ . compatible = " renesas,emev2 " , } ,
{ . compatible = " renesas,r7s72100 " , } ,
{ . compatible = " renesas,r8a73a4 " , } ,
{ . compatible = " renesas,r8a7740 " , } ,
2020-04-27 15:53:30 +03:00
{ . compatible = " renesas,r8a7742 " , } ,
2016-11-16 13:05:51 +03:00
{ . compatible = " renesas,r8a7743 " , } ,
2018-09-11 13:12:51 +03:00
{ . compatible = " renesas,r8a7744 " , } ,
2016-11-16 13:05:51 +03:00
{ . compatible = " renesas,r8a7745 " , } ,
2016-04-22 14:28:44 +03:00
{ . compatible = " renesas,r8a7778 " , } ,
{ . compatible = " renesas,r8a7779 " , } ,
{ . compatible = " renesas,r8a7790 " , } ,
{ . compatible = " renesas,r8a7791 " , } ,
2016-09-06 15:18:20 +03:00
{ . compatible = " renesas,r8a7792 " , } ,
2016-04-22 14:28:44 +03:00
{ . compatible = " renesas,r8a7793 " , } ,
{ . compatible = " renesas,r8a7794 " , } ,
{ . compatible = " renesas,sh73a0 " , } ,
2016-04-22 14:28:43 +03:00
{ . compatible = " rockchip,rk2928 " , } ,
{ . compatible = " rockchip,rk3036 " , } ,
{ . compatible = " rockchip,rk3066a " , } ,
{ . compatible = " rockchip,rk3066b " , } ,
{ . compatible = " rockchip,rk3188 " , } ,
{ . compatible = " rockchip,rk3228 " , } ,
{ . compatible = " rockchip,rk3288 " , } ,
2017-08-04 04:52:31 +03:00
{ . compatible = " rockchip,rk3328 " , } ,
2016-04-22 14:28:43 +03:00
{ . compatible = " rockchip,rk3366 " , } ,
{ . compatible = " rockchip,rk3368 " , } ,
2018-10-05 22:00:58 +03:00
{ . compatible = " rockchip,rk3399 " ,
. data = & ( struct cpufreq_dt_platform_data )
{ . have_governor_per_policy = true , } ,
} ,
2016-04-22 14:28:43 +03:00
2017-08-16 11:19:12 +03:00
{ . compatible = " st-ericsson,u8500 " , } ,
{ . compatible = " st-ericsson,u8540 " , } ,
{ . compatible = " st-ericsson,u9500 " , } ,
{ . compatible = " st-ericsson,u9540 " , } ,
2016-04-22 14:28:42 +03:00
{ . compatible = " ti,omap2 " , } ,
{ . compatible = " ti,omap4 " , } ,
{ . compatible = " ti,omap5 " , } ,
2016-04-22 14:28:46 +03:00
{ . compatible = " xlnx,zynq-7000 " , } ,
2017-07-13 12:19:10 +03:00
{ . compatible = " xlnx,zynqmp " , } ,
2016-08-21 18:41:44 +03:00
{ }
2016-03-30 11:15:26 +03:00
} ;
2017-08-16 08:37:27 +03:00
/*
* Machines for which the cpufreq device is * not * created , mostly used for
* platforms using " operating-points-v2 " property .
*/
2021-05-20 07:26:18 +03:00
static const struct of_device_id blocklist [ ] __initconst = {
2019-06-12 19:28:15 +03:00
{ . compatible = " allwinner,sun50i-h6 " , } ,
2021-02-19 01:23:26 +03:00
{ . compatible = " arm,vexpress " , } ,
2017-09-19 18:23:22 +03:00
{ . compatible = " calxeda,highbank " , } ,
{ . compatible = " calxeda,ecx-2000 " , } ,
2020-04-20 10:55:13 +03:00
{ . compatible = " fsl,imx7ulp " , } ,
2019-06-05 13:37:06 +03:00
{ . compatible = " fsl,imx7d " , } ,
2019-05-13 14:01:38 +03:00
{ . compatible = " fsl,imx8mq " , } ,
{ . compatible = " fsl,imx8mm " , } ,
2019-08-18 09:32:21 +03:00
{ . compatible = " fsl,imx8mn " , } ,
2019-12-26 09:52:46 +03:00
{ . compatible = " fsl,imx8mp " , } ,
2019-05-13 14:01:38 +03:00
2017-09-19 18:23:22 +03:00
{ . compatible = " marvell,armadaxp " , } ,
2017-12-08 09:07:56 +03:00
{ . compatible = " mediatek,mt2701 " , } ,
{ . compatible = " mediatek,mt2712 " , } ,
{ . compatible = " mediatek,mt7622 " , } ,
{ . compatible = " mediatek,mt7623 " , } ,
2020-10-13 12:27:08 +03:00
{ . compatible = " mediatek,mt8167 " , } ,
2017-12-08 09:07:56 +03:00
{ . compatible = " mediatek,mt817x " , } ,
{ . compatible = " mediatek,mt8173 " , } ,
{ . compatible = " mediatek,mt8176 " , } ,
2019-08-13 16:31:48 +03:00
{ . compatible = " mediatek,mt8183 " , } ,
2021-05-19 19:25:50 +03:00
{ . compatible = " mediatek,mt8365 " , } ,
2020-10-13 12:27:09 +03:00
{ . compatible = " mediatek,mt8516 " , } ,
2017-12-08 09:07:56 +03:00
2019-11-18 19:45:08 +03:00
{ . compatible = " nvidia,tegra20 " , } ,
{ . compatible = " nvidia,tegra30 " , } ,
2017-09-19 18:23:22 +03:00
{ . compatible = " nvidia,tegra124 " , } ,
2019-01-04 06:06:55 +03:00
{ . compatible = " nvidia,tegra210 " , } ,
2017-09-19 18:23:22 +03:00
2018-05-30 05:39:28 +03:00
{ . compatible = " qcom,apq8096 " , } ,
{ . compatible = " qcom,msm8996 " , } ,
2019-07-25 13:41:36 +03:00
{ . compatible = " qcom,qcs404 " , } ,
2021-08-21 00:57:00 +03:00
{ . compatible = " qcom,sa8155p " } ,
2020-06-22 11:16:46 +03:00
{ . compatible = " qcom,sc7180 " , } ,
2021-05-12 11:11:22 +03:00
{ . compatible = " qcom,sc7280 " , } ,
2021-07-25 06:02:14 +03:00
{ . compatible = " qcom,sc8180x " , } ,
2020-06-22 11:16:45 +03:00
{ . compatible = " qcom,sdm845 " , } ,
2021-08-21 00:57:00 +03:00
{ . compatible = " qcom,sm6350 " , } ,
2021-08-04 23:34:20 +03:00
{ . compatible = " qcom,sm8150 " , } ,
2021-08-21 00:57:00 +03:00
{ . compatible = " qcom,sm8250 " , } ,
{ . compatible = " qcom,sm8350 " , } ,
2018-05-30 05:39:28 +03:00
2017-09-19 18:23:22 +03:00
{ . compatible = " st,stih407 " , } ,
{ . compatible = " st,stih410 " , } ,
2020-08-31 09:10:12 +03:00
{ . compatible = " st,stih418 " , } ,
2017-09-19 18:23:22 +03:00
2017-09-21 16:39:03 +03:00
{ . compatible = " ti,am33xx " , } ,
{ . compatible = " ti,am43 " , } ,
{ . compatible = " ti,dra7 " , } ,
2019-09-11 20:47:08 +03:00
{ . compatible = " ti,omap3 " , } ,
2017-09-21 16:39:03 +03:00
2020-03-13 20:52:13 +03:00
{ . compatible = " qcom,ipq8064 " , } ,
{ . compatible = " qcom,apq8064 " , } ,
{ . compatible = " qcom,msm8974 " , } ,
{ . compatible = " qcom,msm8960 " , } ,
2017-08-16 08:37:27 +03:00
{ }
} ;
static bool __init cpu0_node_has_opp_v2_prop ( void )
{
struct device_node * np = of_cpu_device_node_get ( 0 ) ;
bool ret = false ;
if ( of_get_property ( np , " operating-points-v2 " , NULL ) )
ret = true ;
of_node_put ( np ) ;
return ret ;
}
2016-03-30 11:15:26 +03:00
static int __init cpufreq_dt_platdev_init ( void )
{
struct device_node * np = of_find_node_by_path ( " / " ) ;
2016-06-27 08:50:13 +03:00
const struct of_device_id * match ;
2017-08-16 08:37:27 +03:00
const void * data = NULL ;
2016-03-30 11:15:26 +03:00
if ( ! np )
return - ENODEV ;
2021-05-20 07:26:18 +03:00
match = of_match_node ( allowlist , np ) ;
2017-08-16 08:37:27 +03:00
if ( match ) {
data = match - > data ;
goto create_pdev ;
}
2021-05-20 07:26:18 +03:00
if ( cpu0_node_has_opp_v2_prop ( ) & & ! of_match_node ( blocklist , np ) )
2017-08-16 08:37:27 +03:00
goto create_pdev ;
2016-06-27 08:50:13 +03:00
of_node_put ( np ) ;
2017-08-16 08:37:27 +03:00
return - ENODEV ;
2016-03-30 11:15:26 +03:00
2017-08-16 08:37:27 +03:00
create_pdev :
of_node_put ( np ) ;
2016-09-09 14:18:08 +03:00
return PTR_ERR_OR_ZERO ( platform_device_register_data ( NULL , " cpufreq-dt " ,
2017-08-16 08:37:27 +03:00
- 1 , data ,
2016-09-09 14:18:08 +03:00
sizeof ( struct cpufreq_dt_platform_data ) ) ) ;
2016-03-30 11:15:26 +03:00
}
2019-10-21 15:15:13 +03:00
core_initcall ( cpufreq_dt_platdev_init ) ;