diff --git a/arch/arm/boot/dts/rk312x.dtsi b/arch/arm/boot/dts/rk312x.dtsi index abec8af6d4db..055ab14e9de0 100644 --- a/arch/arm/boot/dts/rk312x.dtsi +++ b/arch/arm/boot/dts/rk312x.dtsi @@ -468,8 +468,10 @@ mpp_srv: mpp-srv { compatible = "rockchip,mpp-service"; rockchip,taskqueue-count = <1>; - vdpu1,grf = <&grf 0x0144 0x04000400>; - vepu1,grf = <&grf 0x0144 0x04000400>; + rockchip,grf = <&grf>; + rockchip,grf-offset = <0x0144>; + rockchip,grf-values = <0x04000400>, <0x04000400>; + rockchip,grf-names = "grf_vdpu1", "grf_vepu1"; status = "disabled"; }; diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi index 27e627001fda..afca05552565 100644 --- a/arch/arm64/boot/dts/rockchip/px30.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30.dtsi @@ -1394,9 +1394,10 @@ mpp_srv: mpp-srv { compatible = "rockchip,mpp-service"; rockchip,taskqueue-count = <1>; - rkvdec,grf = <&grf 0x410 0x80008000>; - vdpu2,grf = <&grf 0x410 0x80000000>; - vepu2,grf = <&grf 0x410 0x80000000>; + rockchip,grf = <&grf>; + rockchip,grf-offset = <0x0410>; + rockchip,grf-values = <0x80008000>, <0x80000000>, <0x80000000>; + rockchip,grf-names = "grf_rkvdec", "grf_vdpu2", "grf_vepu2"; status = "disabled"; }; diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi index 53b8c147a655..6b66b09230d7 100644 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -735,8 +735,10 @@ mpp_srv: mpp-srv { compatible = "rockchip,mpp-service"; rockchip,taskqueue-count = <3>; - vepu2,grf = <&grf 0x040c 0x8000000>; - vepu22,grf = <&grf 0x040c 0x8000800>; + rockchip,grf = <&grf>; + rockchip,grf-offset = <0x040c>; + rockchip,grf-values = <0x8000000>, <0x8000800>; + rockchip,grf-names = "grf_vepu2", "grf_vepu22"; status = "disabled"; }; diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 734804939ec7..6f67cd1fb9d1 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -1119,10 +1119,10 @@ int mpp_safe_unreset(struct reset_control *rst) int mpp_set_grf(struct mpp_grf_info *grf_info) { - if (grf_info->grf && grf_info->mode_val) + if (grf_info->grf && grf_info->val) regmap_write(grf_info->grf, - grf_info->mode_ctrl, - grf_info->mode_val); + grf_info->offset, + grf_info->val); return 0; } diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h index 60627ef0e0a7..844abc6ed736 100644 --- a/drivers/video/rockchip/mpp/mpp_common.h +++ b/drivers/video/rockchip/mpp/mpp_common.h @@ -72,8 +72,8 @@ struct mpp_request { }; struct mpp_grf_info { - u32 mode_ctrl; - u32 mode_val; + u32 offset; + u32 val; struct regmap *grf; }; diff --git a/drivers/video/rockchip/mpp/mpp_service.c b/drivers/video/rockchip/mpp/mpp_service.c index b58ce63dfc26..5afc7800a41b 100644 --- a/drivers/video/rockchip/mpp/mpp_service.c +++ b/drivers/video/rockchip/mpp/mpp_service.c @@ -25,6 +25,11 @@ #define MPP_CLASS_NAME "mpp_class" #define MPP_SERVICE_NAME "mpp_service" +#define MPP_REGISTER_GRF(np, X, x) {\ + if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_##X))\ + mpp_init_grf(np, &srv->grf_infos[MPP_DRIVER_##X], x);\ + } + #define MPP_REGISTER_DRIVER(X, x) {\ if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_##X))\ mpp_add_driver(MPP_DRIVER_##X, &rockchip_##x##_driver);\ @@ -38,18 +43,26 @@ static struct mpp_grf_info *mpp_grf_infos; static struct platform_driver **mpp_sub_drivers; static int mpp_init_grf(struct device_node *np, - const char *name, - struct mpp_grf_info *grf_info) + struct mpp_grf_info *grf_info, + const char *name) { - grf_info->grf = syscon_regmap_lookup_by_phandle(np, name); - if (IS_ERR_OR_NULL(grf_info->grf)) { - grf_info->grf = NULL; - } else { - of_property_read_u32_index(np, name, 1, - &grf_info->mode_ctrl); - of_property_read_u32_index(np, name, 2, - &grf_info->mode_val); - } + int index; + struct regmap *grf; + + grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); + if (IS_ERR_OR_NULL(grf_info->grf)) + return -EINVAL; + + of_property_read_u32(np, "rockchip,grf-offset", &grf_info->offset); + + index = of_property_match_string(np, "rockchip,grf-names", name); + if (index < 0) + return -ENODATA; + + of_property_read_u32_index(np, "rockchip,grf-values", + index, &grf_info->val); + + grf_info->grf = grf; return 0; } @@ -166,14 +179,14 @@ static int mpp_service_probe(struct platform_device *pdev) srv->task_queues[i] = queue; } } + MPP_REGISTER_GRF(np, RKVDEC, "grf_rkvdec"); + MPP_REGISTER_GRF(np, RKVENC, "grf_rkvenc"); + MPP_REGISTER_GRF(np, VEPU1, "grf_vepu1"); + MPP_REGISTER_GRF(np, VDPU1, "grf_vdpu1"); + MPP_REGISTER_GRF(np, VEPU2, "grf_vepu2"); + MPP_REGISTER_GRF(np, VDPU2, "grf_vdpu2"); + MPP_REGISTER_GRF(np, VEPU22, "grf_vepu22"); - mpp_init_grf(np, "rkvdec,grf", &srv->grf_infos[MPP_DRIVER_RKVDEC]); - mpp_init_grf(np, "rkvenc,grf", &srv->grf_infos[MPP_DRIVER_RKVENC]); - mpp_init_grf(np, "vdpu1,grf", &srv->grf_infos[MPP_DRIVER_VDPU1]); - mpp_init_grf(np, "vepu1,grf", &srv->grf_infos[MPP_DRIVER_VEPU1]); - mpp_init_grf(np, "vdpu2,grf", &srv->grf_infos[MPP_DRIVER_VDPU2]); - mpp_init_grf(np, "vepu2,grf", &srv->grf_infos[MPP_DRIVER_VEPU2]); - mpp_init_grf(np, "vepu22,grf", &srv->grf_infos[MPP_DRIVER_VEPU22]); mpp_grf_infos = srv->grf_infos; ret = mpp_register_service(srv, MPP_SERVICE_NAME);