10
10
#include <linux/of.h>
11
11
#include <linux/of_device.h>
12
12
#include <linux/platform_device.h>
13
+ #include <linux/mfd/syscon.h>
14
+ #include <linux/minmax.h>
13
15
14
16
#include <dt-bindings/clock/rockchip,rk3528-cru.h>
15
17
@@ -1061,23 +1063,65 @@ static struct rockchip_clk_branch rk3528_clk_branches[] __initdata = {
1061
1063
0 , 1 , 1 ),
1062
1064
};
1063
1065
1066
+ static struct rockchip_clk_branch rk3528_vo_clk_branches [] __initdata = {
1067
+ MMC_GRF (SCLK_SDMMC_DRV , "sdmmc_drv" , "cclk_src_sdmmc0" ,
1068
+ RK3528_SDMMC_CON (0 ), 1 , grf_type_vo ),
1069
+ MMC_GRF (SCLK_SDMMC_SAMPLE , "sdmmc_sample" , "cclk_src_sdmmc0" ,
1070
+ RK3528_SDMMC_CON (1 ), 1 , grf_type_vo ),
1071
+ };
1072
+
1073
+ static struct rockchip_clk_branch rk3528_vpu_clk_branches [] __initdata = {
1074
+ MMC_GRF (SCLK_SDIO0_DRV , "sdio0_drv" , "cclk_src_sdio0" ,
1075
+ RK3528_SDIO0_CON (0 ), 1 , grf_type_vpu ),
1076
+ MMC_GRF (SCLK_SDIO0_SAMPLE , "sdio0_sample" , "cclk_src_sdio0" ,
1077
+ RK3528_SDIO0_CON (1 ), 1 , grf_type_vpu ),
1078
+ MMC_GRF (SCLK_SDIO1_DRV , "sdio1_drv" , "cclk_src_sdio1" ,
1079
+ RK3528_SDIO1_CON (0 ), 1 , grf_type_vpu ),
1080
+ MMC_GRF (SCLK_SDIO1_SAMPLE , "sdio1_sample" , "cclk_src_sdio1" ,
1081
+ RK3528_SDIO1_CON (1 ), 1 , grf_type_vpu ),
1082
+ };
1083
+
1064
1084
static int __init clk_rk3528_probe (struct platform_device * pdev )
1065
1085
{
1066
- struct rockchip_clk_provider * ctx ;
1086
+ unsigned long nr_vpu_branches = ARRAY_SIZE (rk3528_vpu_clk_branches );
1087
+ unsigned long nr_vo_branches = ARRAY_SIZE (rk3528_vo_clk_branches );
1088
+ unsigned long nr_branches = ARRAY_SIZE (rk3528_clk_branches );
1089
+ unsigned long nr_clks , nr_vo_clks , nr_vpu_clks ;
1090
+ struct rockchip_aux_grf * vo_grf_e , * vpu_grf_e ;
1091
+ struct regmap * vo_grf , * vpu_grf ;
1067
1092
struct device * dev = & pdev -> dev ;
1068
1093
struct device_node * np = dev -> of_node ;
1069
- unsigned long nr_branches = ARRAY_SIZE (rk3528_clk_branches );
1070
- unsigned long nr_clks ;
1094
+ struct rockchip_clk_provider * ctx ;
1071
1095
void __iomem * reg_base ;
1072
1096
1073
- nr_clks = rockchip_clk_find_max_clk_id (rk3528_clk_branches ,
1074
- nr_branches ) + 1 ;
1075
-
1076
1097
reg_base = devm_platform_ioremap_resource (pdev , 0 );
1077
1098
if (IS_ERR (reg_base ))
1078
1099
return dev_err_probe (dev , PTR_ERR (reg_base ),
1079
1100
"could not map cru region" );
1080
1101
1102
+ nr_clks = rockchip_clk_find_max_clk_id (rk3528_clk_branches ,
1103
+ nr_branches ) + 1 ;
1104
+
1105
+ vo_grf = syscon_regmap_lookup_by_compatible ("rockchip,rk3528-vo-grf" );
1106
+ if (!IS_ERR (vo_grf )) {
1107
+ nr_vo_clks = rockchip_clk_find_max_clk_id (rk3528_vo_clk_branches ,
1108
+ nr_vo_branches ) + 1 ;
1109
+ nr_clks = max (nr_clks , nr_vo_clks );
1110
+ } else if (PTR_ERR (vo_grf ) != - ENODEV ) {
1111
+ return dev_err_probe (dev , PTR_ERR (vo_grf ),
1112
+ "failed to look up VO GRF\n" );
1113
+ }
1114
+
1115
+ vpu_grf = syscon_regmap_lookup_by_compatible ("rockchip,rk3528-vpu-grf" );
1116
+ if (!IS_ERR (vpu_grf )) {
1117
+ nr_vpu_clks = rockchip_clk_find_max_clk_id (rk3528_vpu_clk_branches ,
1118
+ nr_vpu_branches ) + 1 ;
1119
+ nr_clks = max (nr_clks , nr_vpu_clks );
1120
+ } else if (PTR_ERR (vpu_grf ) != - ENODEV ) {
1121
+ return dev_err_probe (dev , PTR_ERR (vpu_grf ),
1122
+ "failed to look up VPU GRF\n" );
1123
+ }
1124
+
1081
1125
ctx = rockchip_clk_init (np , reg_base , nr_clks );
1082
1126
if (IS_ERR (ctx ))
1083
1127
return dev_err_probe (dev , PTR_ERR (ctx ),
@@ -1092,6 +1136,32 @@ static int __init clk_rk3528_probe(struct platform_device *pdev)
1092
1136
ARRAY_SIZE (rk3528_cpuclk_rates ));
1093
1137
rockchip_clk_register_branches (ctx , rk3528_clk_branches , nr_branches );
1094
1138
1139
+ if (!IS_ERR (vo_grf )) {
1140
+ vo_grf_e = devm_kzalloc (dev , sizeof (* vo_grf_e ), GFP_KERNEL );
1141
+ if (!vo_grf_e )
1142
+ return - ENOMEM ;
1143
+
1144
+ vo_grf_e -> grf = vo_grf ;
1145
+ vo_grf_e -> type = grf_type_vo ;
1146
+ hash_add (ctx -> aux_grf_table , & vo_grf_e -> node , grf_type_vo );
1147
+
1148
+ rockchip_clk_register_branches (ctx , rk3528_vo_clk_branches ,
1149
+ nr_vo_branches );
1150
+ }
1151
+
1152
+ if (!IS_ERR (vpu_grf )) {
1153
+ vpu_grf_e = devm_kzalloc (dev , sizeof (* vpu_grf_e ), GFP_KERNEL );
1154
+ if (!vpu_grf_e )
1155
+ return - ENOMEM ;
1156
+
1157
+ vpu_grf_e -> grf = vpu_grf ;
1158
+ vpu_grf_e -> type = grf_type_vpu ;
1159
+ hash_add (ctx -> aux_grf_table , & vpu_grf_e -> node , grf_type_vpu );
1160
+
1161
+ rockchip_clk_register_branches (ctx , rk3528_vpu_clk_branches ,
1162
+ nr_vpu_branches );
1163
+ }
1164
+
1095
1165
rk3528_rst_init (np , reg_base );
1096
1166
1097
1167
rockchip_register_restart_notifier (ctx , RK3528_GLB_SRST_FST , NULL );
0 commit comments