2016-03-30 13:45:26 +05:30
/*
* Copyright ( C ) 2016 Linaro .
* Viresh Kumar < viresh . kumar @ linaro . org >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/err.h>
# include <linux/of.h>
2017-08-16 11:07:27 +05:30
# include <linux/of_device.h>
2016-03-30 13:45:26 +05:30
# include <linux/platform_device.h>
2016-09-09 16:48:08 +05:30
# include "cpufreq-dt.h"
2017-08-16 11:07:27 +05:30
/*
* Machines for which the cpufreq device is * always * created , mostly used for
* platforms using " operating-points " ( V1 ) property .
*/
static const struct of_device_id whitelist [ ] __initconst = {
2016-04-22 16:58:45 +05:30
{ . 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-15 14:55:00 -08:00
{ . compatible = " apm,xgene-shadowcat " , } ,
2016-10-25 09:21:24 +02:00
{ . compatible = " arm,integrator-ap " , } ,
{ . compatible = " arm,integrator-cp " , } ,
2017-05-23 16:13:18 +08:00
{ . compatible = " hisilicon,hi3660 " , } ,
2016-04-22 16:58:47 +05:30
2016-04-22 16:58:41 +05:30
{ . compatible = " fsl,imx27 " , } ,
{ . compatible = " fsl,imx51 " , } ,
{ . compatible = " fsl,imx53 " , } ,
{ . compatible = " fsl,imx7d " , } ,
2016-04-22 16:58:40 +05:30
{ . compatible = " marvell,berlin " , } ,
2016-10-31 20:54:53 +01:00
{ . compatible = " marvell,pxa250 " , } ,
{ . compatible = " marvell,pxa270 " , } ,
2016-04-22 16:58:40 +05:30
2016-03-30 13:45:28 +05:30
{ . compatible = " samsung,exynos3250 " , } ,
{ . compatible = " samsung,exynos4210 " , } ,
{ . compatible = " samsung,exynos5250 " , } ,
# ifndef CONFIG_BL_SWITCHER
{ . compatible = " samsung,exynos5800 " , } ,
# endif
2016-04-22 16:58:42 +05:30
2016-04-22 16:58:44 +05:30
{ . compatible = " renesas,emev2 " , } ,
{ . compatible = " renesas,r7s72100 " , } ,
{ . compatible = " renesas,r8a73a4 " , } ,
{ . compatible = " renesas,r8a7740 " , } ,
2016-11-16 11:05:51 +01:00
{ . compatible = " renesas,r8a7743 " , } ,
{ . compatible = " renesas,r8a7745 " , } ,
2016-04-22 16:58:44 +05:30
{ . compatible = " renesas,r8a7778 " , } ,
{ . compatible = " renesas,r8a7779 " , } ,
{ . compatible = " renesas,r8a7790 " , } ,
{ . compatible = " renesas,r8a7791 " , } ,
2016-09-06 14:18:20 +02:00
{ . compatible = " renesas,r8a7792 " , } ,
2016-04-22 16:58:44 +05:30
{ . compatible = " renesas,r8a7793 " , } ,
{ . compatible = " renesas,r8a7794 " , } ,
{ . compatible = " renesas,sh73a0 " , } ,
2016-04-22 16:58:43 +05:30
{ . compatible = " rockchip,rk2928 " , } ,
{ . compatible = " rockchip,rk3036 " , } ,
{ . compatible = " rockchip,rk3066a " , } ,
{ . compatible = " rockchip,rk3066b " , } ,
{ . compatible = " rockchip,rk3188 " , } ,
{ . compatible = " rockchip,rk3228 " , } ,
{ . compatible = " rockchip,rk3288 " , } ,
2017-08-04 09:52:31 +08:00
{ . compatible = " rockchip,rk3328 " , } ,
2016-04-22 16:58:43 +05:30
{ . compatible = " rockchip,rk3366 " , } ,
{ . compatible = " rockchip,rk3368 " , } ,
{ . compatible = " rockchip,rk3399 " , } ,
2017-08-16 10:19:12 +02:00
{ . compatible = " st-ericsson,u8500 " , } ,
{ . compatible = " st-ericsson,u8540 " , } ,
{ . compatible = " st-ericsson,u9500 " , } ,
{ . compatible = " st-ericsson,u9540 " , } ,
2016-04-22 16:58:42 +05:30
{ . compatible = " ti,omap2 " , } ,
{ . compatible = " ti,omap3 " , } ,
{ . compatible = " ti,omap4 " , } ,
{ . compatible = " ti,omap5 " , } ,
2016-04-22 16:58:46 +05:30
{ . compatible = " xlnx,zynq-7000 " , } ,
2017-07-13 11:19:10 +02:00
{ . compatible = " xlnx,zynqmp " , } ,
2016-08-21 15:41:44 +00:00
{ }
2016-03-30 13:45:26 +05:30
} ;
2017-08-16 11:07:27 +05:30
/*
* Machines for which the cpufreq device is * not * created , mostly used for
* platforms using " operating-points-v2 " property .
*/
static const struct of_device_id blacklist [ ] __initconst = {
2017-09-19 08:23:22 -07:00
{ . compatible = " calxeda,highbank " , } ,
{ . compatible = " calxeda,ecx-2000 " , } ,
{ . compatible = " marvell,armadaxp " , } ,
2017-12-08 14:07:56 +08:00
{ . compatible = " mediatek,mt2701 " , } ,
{ . compatible = " mediatek,mt2712 " , } ,
{ . compatible = " mediatek,mt7622 " , } ,
{ . compatible = " mediatek,mt7623 " , } ,
{ . compatible = " mediatek,mt817x " , } ,
{ . compatible = " mediatek,mt8173 " , } ,
{ . compatible = " mediatek,mt8176 " , } ,
2017-09-19 08:23:22 -07:00
{ . compatible = " nvidia,tegra124 " , } ,
2018-05-30 05:39:28 +03:00
{ . compatible = " qcom,apq8096 " , } ,
{ . compatible = " qcom,msm8996 " , } ,
2017-09-19 08:23:22 -07:00
{ . compatible = " st,stih407 " , } ,
{ . compatible = " st,stih410 " , } ,
{ . compatible = " sigma,tango4 " , } ,
2017-09-21 19:09:03 +05:30
{ . compatible = " ti,am33xx " , } ,
{ . compatible = " ti,am43 " , } ,
{ . compatible = " ti,dra7 " , } ,
2017-08-16 11:07:27 +05:30
{ }
} ;
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 13:45:26 +05:30
static int __init cpufreq_dt_platdev_init ( void )
{
struct device_node * np = of_find_node_by_path ( " / " ) ;
2016-06-27 14:50:13 +09:00
const struct of_device_id * match ;
2017-08-16 11:07:27 +05:30
const void * data = NULL ;
2016-03-30 13:45:26 +05:30
if ( ! np )
return - ENODEV ;
2017-08-16 11:07:27 +05:30
match = of_match_node ( whitelist , np ) ;
if ( match ) {
data = match - > data ;
goto create_pdev ;
}
if ( cpu0_node_has_opp_v2_prop ( ) & & ! of_match_node ( blacklist , np ) )
goto create_pdev ;
2016-06-27 14:50:13 +09:00
of_node_put ( np ) ;
2017-08-16 11:07:27 +05:30
return - ENODEV ;
2016-03-30 13:45:26 +05:30
2017-08-16 11:07:27 +05:30
create_pdev :
of_node_put ( np ) ;
2016-09-09 16:48:08 +05:30
return PTR_ERR_OR_ZERO ( platform_device_register_data ( NULL , " cpufreq-dt " ,
2017-08-16 11:07:27 +05:30
- 1 , data ,
2016-09-09 16:48:08 +05:30
sizeof ( struct cpufreq_dt_platform_data ) ) ) ;
2016-03-30 13:45:26 +05:30
}
device_initcall ( cpufreq_dt_platdev_init ) ;