From: Jung Zhao Date: Mon, 31 Jul 2017 09:11:21 +0000 (+0800) Subject: video: rockchip: vpu: add core&cabac&niu_a|h reset X-Git-Tag: release-20171130_firefly~4^2~80 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8dfdd0e349bd00f57f9ab93c2e098e82f880741e;p=firefly-linux-kernel-4.4.55.git video: rockchip: vpu: add core&cabac&niu_a|h reset Change-Id: Ied8f16b79ac0142fadbc1ce3a3f47ede7d22790b Signed-off-by: Jung Zhao --- diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index 154aae30667b..163861efd3a1 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1333,8 +1333,11 @@ <&cru SCLK_VDU_CA>, <&cru SCLK_VDU_CORE>; clock-names = "aclk_vcodec", "hclk_vcodec", "clk_cabac", "clk_core"; - resets = <&cru SRST_H_VDU>, <&cru SRST_A_VDU>; - reset-names = "video_h", "video_a"; + resets = <&cru SRST_H_VDU>, <&cru SRST_A_VDU>, + <&cru SRST_VDU_CORE>, <&cru SRST_VDU_CA>, + <&cru SRST_A_VDU_NOC>, <&cru SRST_H_VDU_NOC>; + reset-names = "video_h", "video_a", "video_core", "video_cabac", + "niu_a", "niu_h"; power-domains = <&power RK3399_PD_VDU>; dev_mode = <2>; name = "rkvdec"; diff --git a/drivers/video/rockchip/vcodec/vcodec_service.c b/drivers/video/rockchip/vcodec/vcodec_service.c index 13a0adc31958..d4156bf16804 100644 --- a/drivers/video/rockchip/vcodec/vcodec_service.c +++ b/drivers/video/rockchip/vcodec/vcodec_service.c @@ -405,6 +405,8 @@ struct vpu_service_info { struct reset_control *rst_a; struct reset_control *rst_h; struct reset_control *rst_v; + struct reset_control *rst_core; + struct reset_control *rst_cabac; struct reset_control *rst_niu_a; struct reset_control *rst_niu_h; #endif @@ -699,13 +701,17 @@ static void _vpu_reset(struct vpu_subdev_data *data) try_reset_assert(pservice->rst_v); try_reset_assert(pservice->rst_a); try_reset_assert(pservice->rst_h); + try_reset_assert(pservice->rst_core); + try_reset_assert(pservice->rst_cabac); udelay(5); - try_reset_deassert(pservice->rst_h); - try_reset_deassert(pservice->rst_a); - try_reset_deassert(pservice->rst_v); try_reset_deassert(pservice->rst_niu_h); try_reset_deassert(pservice->rst_niu_a); + try_reset_deassert(pservice->rst_v); + try_reset_deassert(pservice->rst_h); + try_reset_deassert(pservice->rst_a); + try_reset_deassert(pservice->rst_core); + try_reset_deassert(pservice->rst_cabac); rockchip_pmu_idle_request(pservice->dev, false); clk_set_rate(pservice->aclk_vcodec, rate); @@ -2551,6 +2557,10 @@ static void vcodec_read_property(struct device_node *np, pservice->rst_v = devm_reset_control_get(pservice->dev, "video"); pservice->rst_niu_a = devm_reset_control_get(pservice->dev, "niu_a"); pservice->rst_niu_h = devm_reset_control_get(pservice->dev, "niu_h"); + pservice->rst_core = devm_reset_control_get(pservice->dev, + "video_core"); + pservice->rst_cabac = devm_reset_control_get(pservice->dev, + "video_cabac"); if (IS_ERR_OR_NULL(pservice->rst_a)) { dev_dbg(pservice->dev, "No aclk reset resource define\n"); @@ -2563,7 +2573,7 @@ static void vcodec_read_property(struct device_node *np, } if (IS_ERR_OR_NULL(pservice->rst_v)) { - dev_dbg(pservice->dev, "No core reset resource define\n"); + dev_dbg(pservice->dev, "No core rst_v reset resource define\n"); pservice->rst_v = NULL; } @@ -2576,6 +2586,16 @@ static void vcodec_read_property(struct device_node *np, dev_dbg(pservice->dev, "No NIU hclk reset resource define\n"); pservice->rst_niu_h = NULL; } + + if (IS_ERR_OR_NULL(pservice->rst_core)) { + dev_dbg(pservice->dev, "No core reset resource define\n"); + pservice->rst_core = NULL; + } + + if (IS_ERR_OR_NULL(pservice->rst_cabac)) { + dev_dbg(pservice->dev, "No cabac reset resource define\n"); + pservice->rst_cabac = NULL; + } #endif of_property_read_string(np, "name", (const char **)&pservice->name);