diff options
-rwxr-xr-x | arch/riscv/boot/dts/starfive/jh7110.dtsi | 10 | ||||
-rwxr-xr-x | drivers/gpu/drm/verisilicon/vs_dc.c | 246 | ||||
-rwxr-xr-x | drivers/gpu/drm/verisilicon/vs_dc.h | 14 |
3 files changed, 22 insertions, 248 deletions
diff --git a/arch/riscv/boot/dts/starfive/jh7110.dtsi b/arch/riscv/boot/dts/starfive/jh7110.dtsi index f4dbce868c50..c02c4a1a45d8 100755 --- a/arch/riscv/boot/dts/starfive/jh7110.dtsi +++ b/arch/riscv/boot/dts/starfive/jh7110.dtsi @@ -1611,17 +1611,11 @@ <&rstgen RSTN_U0_NOC_BUS_CPU_AXI_N>, <&rstgen RSTN_U0_NOC_BUS_AXICFG0_AXI_N>, <&rstgen RSTN_U0_NOC_BUS_APB_BUS_N>, - <&rstgen RSTN_U0_NOC_BUS_GPU_AXI_N>, - <&rstgen RSTN_U0_NOC_BUS_VDEC_AXI_N>, - <&rstgen RSTN_U0_JTAG2APB_PRESETN>, <&rstgen RSTN_U0_NOC_BUS_DISP_AXI_N>, - <&rstgen RSTN_U0_NOC_BUS_ISP_AXI_N>, - <&rstgen RSTN_U0_NOC_BUS_STG_AXI_N>, - <&rstgen RSTN_U0_NOC_BUS_DDRC_N>; + <&rstgen RSTN_U0_NOC_BUS_STG_AXI_N>; reset-names = "rst_vout_src","rst_axi","rst_ahb","rst_core", "rst_noc_cpu","rst_noc_axicfg0","rst_noc_apb", - "rst_noc_gpu","rst_noc_vdec","rst_jtag2apb", - "rst_noc_disp","rst_noc_isp","rst_noc_stg","rst_noc_ddrc"; + "rst_noc_disp","rst_noc_stg"; power-domains = <&pwrc JH7110_PD_VOUT>; }; diff --git a/drivers/gpu/drm/verisilicon/vs_dc.c b/drivers/gpu/drm/verisilicon/vs_dc.c index b2adc5636c33..d442918e4626 100755 --- a/drivers/gpu/drm/verisilicon/vs_dc.c +++ b/drivers/gpu/drm/verisilicon/vs_dc.c @@ -372,103 +372,6 @@ static void vs_dc_clock_disable(struct vs_dc *dc) clk_disable_unprepare(dc->stg_axi); } -static int vs_dc_get_reset(struct device *dev, struct vs_dc *dc) -{ - int ret; - - dc->cpu_axi_n = reset_control_get_exclusive(dev, "rst_noc_cpu"); - if (IS_ERR(dc->cpu_axi_n)) { - dev_err(dev, "failed to get cpu_axi_n\n"); - return PTR_ERR(dc->cpu_axi_n); - } - dc->axicfg0_axi_n = reset_control_get_exclusive(dev, "rst_noc_axicfg0"); - if (IS_ERR(dc->axicfg0_axi_n)) { - dev_err(dev, "failed to get axicfg0_axi_n\n"); - return PTR_ERR(dc->axicfg0_axi_n); - } - dc->apb_bus_n = reset_control_get_exclusive(dev, "rst_noc_apb"); - if (IS_ERR(dc->apb_bus_n)) { - dev_err(dev, "failed to get apb_bus_n\n"); - return PTR_ERR(dc->apb_bus_n); - } - dc->disp_axi_n = reset_control_get_exclusive(dev, "rst_noc_disp"); - if (IS_ERR(dc->disp_axi_n)) { - dev_err(dev, "failed to get disp_axi_n\n"); - return PTR_ERR(dc->disp_axi_n); - } - dc->stg_axi_n = reset_control_get_exclusive(dev, "rst_noc_stg"); - if (IS_ERR(dc->stg_axi_n)) { - dev_err(dev, "failed to get stg_axi_n\n"); - return PTR_ERR(dc->stg_axi_n); - } - - return ret; -} - -static int vs_dc_resets_deassert(struct device *dev, struct vs_dc *dc) -{ - int ret; - - ret = reset_control_deassert(dc->cpu_axi_n); - if (ret < 0) { - dev_err(dev, "failed to deassert cpu_axi_n\n"); - return ret; - } - ret = reset_control_deassert(dc->axicfg0_axi_n); - if (ret < 0) { - dev_err(dev, "failed to deassert axicfg0_axi_n\n"); - return ret; - } - ret = reset_control_deassert(dc->apb_bus_n); - if (ret < 0) { - dev_err(dev, "failed to deassert apb_bus_n\n"); - return ret; - } - ret = reset_control_deassert(dc->disp_axi_n); - if (ret < 0) { - dev_err(dev, "failed to deassert disp_axi_n\n"); - return ret; - } - ret = reset_control_deassert(dc->stg_axi_n); - if (ret < 0) { - dev_err(dev, "failed to deassert stg_axi_n\n"); - return ret; - } - return ret; -} - -static int vs_dc_resets_assert(struct device *dev, struct vs_dc *dc) -{ - int ret; - - ret = reset_control_assert(dc->cpu_axi_n); - if (ret < 0) { - dev_err(dev, "failed to assert cpu_axi_n\n"); - return ret; - } - ret = reset_control_assert(dc->axicfg0_axi_n); - if (ret < 0) { - dev_err(dev, "failed to assert axicfg0_axi_n\n"); - return ret; - } - ret = reset_control_assert(dc->apb_bus_n); - if (ret < 0) { - dev_err(dev, "failed to assert apb_bus_n\n"); - return ret; - } - ret = reset_control_assert(dc->disp_axi_n); - if (ret < 0) { - dev_err(dev, "failed to assert disp_axi_n\n"); - return ret; - } - ret = reset_control_assert(dc->stg_axi_n); - if (ret < 0) { - dev_err(dev, "failed to assert stg_axi_n\n"); - return ret; - } - return ret; -} - static int vs_dc_vouttop_get_clock(struct device *dev, struct vs_dc *dc) { int ret; @@ -553,40 +456,6 @@ static void vs_dc_vouttop_clock_disable(struct vs_dc *dc) clk_disable_unprepare(dc->bclk_mst); } -static int vs_dc_vouttop_get_reset(struct device *dev, struct vs_dc *dc) -{ - int ret; - - dc->rstn_vout_src = reset_control_get_exclusive(dev, "rst_vout_src"); - if (IS_ERR(dc->rstn_vout_src)) { - dev_err(dev, "failed to get rstn_vout_src\n"); - return PTR_ERR(dc->rstn_vout_src); - } - return ret; -} - -static int vs_dc_vouttop_resets_deassert(struct device *dev, struct vs_dc *dc) -{ - int ret; - ret = reset_control_deassert(dc->rstn_vout_src); - if (ret < 0) { - dev_err(dev, "failed to deassert rstn_vout_src\n"); - return ret; - } - return ret; -} - -static int vs_dc_vouttop_resets_assert(struct device *dev, struct vs_dc *dc) -{ - int ret; - ret = reset_control_assert(dc->rstn_vout_src); - if (ret < 0) { - dev_err(dev, "failed to deassert rstn_vout_src\n"); - return ret; - } - return ret; -} - static int vs_dc_dc8200_get_clock(struct device *dev, struct vs_dc *dc) { int ret; @@ -664,70 +533,6 @@ static void vs_dc_dc8200_clock_disable(struct vs_dc *dc) clk_disable_unprepare(dc->dc8200_ahb); } -static int vs_dc_dc8200_get_reset(struct device *dev, struct vs_dc *dc) -{ - int ret; - - dc->rstn_dc8200_axi = reset_control_get_exclusive(dev, "rst_axi"); - if (IS_ERR(dc->rstn_dc8200_axi)) { - dev_err(dev, "failed to get rstn_dc8200_axi\n"); - return PTR_ERR(dc->rstn_dc8200_axi); - } - dc->rstn_dc8200_core = reset_control_get_exclusive(dev, "rst_core"); - if (IS_ERR(dc->rstn_dc8200_core)) { - dev_err(dev, "failed to get rstn_dc8200_core\n"); - return PTR_ERR(dc->rstn_dc8200_core); - } - dc->rstn_dc8200_ahb = reset_control_get_exclusive(dev, "rst_ahb"); - if (IS_ERR(dc->rstn_dc8200_ahb)) { - dev_err(dev, "failed to get rstn_dc8200_ahb\n"); - return PTR_ERR(dc->rstn_dc8200_ahb); - } - return ret; -} - -static int vs_dc_dc8200_resets_deassert(struct device *dev, struct vs_dc *dc) -{ - int ret; - ret = reset_control_deassert(dc->rstn_dc8200_axi); - if (ret < 0) { - dev_err(dev, "failed to deassert rstn_dc8200_axi\n"); - return ret; - } - ret = reset_control_deassert(dc->rstn_dc8200_core); - if (ret < 0) { - dev_err(dev, "failed to deassert rstn_dc8200_core\n"); - return ret; - } - ret = reset_control_deassert(dc->rstn_dc8200_ahb); - if (ret < 0) { - dev_err(dev, "failed to deassert rstn_dc8200_ahb\n"); - return ret; - } - return ret; -} - -static int vs_dc_dc8200_resets_assert(struct device *dev, struct vs_dc *dc) -{ - int ret; - ret = reset_control_assert(dc->rstn_dc8200_axi); - if (ret < 0) { - dev_err(dev, "failed to assert rstn_dc8200_axi\n"); - return ret; - } - ret = reset_control_assert(dc->rstn_dc8200_core); - if (ret < 0) { - dev_err(dev, "failed to assert rstn_dc8200_core\n"); - return ret; - } - ret = reset_control_assert(dc->rstn_dc8200_ahb); - if (ret < 0) { - dev_err(dev, "failed to assert rstn_dc8200_ahb\n"); - return ret; - } - return ret; -} - static int dc_vout_clk_rst_init(struct device *dev, struct vs_dc *dc) { int ret; @@ -736,61 +541,46 @@ static int dc_vout_clk_rst_init(struct device *dev, struct vs_dc *dc) dev_err(dev, "failed to get clock\n"); return ret; } - ret = vs_dc_get_reset(dev, dc); - if (ret) { - dev_err(dev, "failed to get reset\n"); - return ret; - } + ret = vs_dc_clock_enable(dev, dc); if (ret) { dev_err(dev, "failed to enable clock\n"); return ret; } - ret = vs_dc_resets_deassert(dev, dc); - if (ret) { - dev_err(dev, "failed to deassert reset\n"); - return ret; - } ret = vs_dc_vouttop_get_clock(dev, dc); if (ret) { dev_err(dev, "failed to get clock\n"); return ret; } - ret = vs_dc_vouttop_get_reset(dev, dc); - if (ret) { - dev_err(dev, "failed to get reset\n"); - return ret; - } + ret = vs_dc_vouttop_clock_enable(dev, dc); if (ret) { dev_err(dev, "failed to enable clock\n"); return ret; } - ret = vs_dc_vouttop_resets_deassert(dev, dc); - if (ret) { - dev_err(dev, "failed to deassert reset\n"); - return ret; - } ret = vs_dc_dc8200_get_clock(dev, dc); if (ret) { dev_err(dev, "failed to get clock\n"); return ret; } - ret = vs_dc_dc8200_get_reset(dev, dc); - if (ret) { - dev_err(dev, "failed to get reset\n"); - return ret; - } + ret = vs_dc_dc8200_clock_enable(dev, dc); if (ret) { dev_err(dev, "failed to enable clock\n"); return ret; } - ret = vs_dc_dc8200_resets_deassert(dev, dc); - if (ret) { - dev_err(dev, "failed to deassert reset\n"); + + dc->vout_resets = devm_reset_control_array_get_exclusive(dev); + if (IS_ERR(dc->vout_resets)) { + ret = PTR_ERR(dc->vout_resets); + dev_err(dev, "faied to get vout resets controls\n"); + } + + ret = reset_control_deassert(dc->vout_resets); + if (ret){ + dev_err(dev, "deassert error.\n"); return ret; } @@ -877,16 +667,16 @@ static void dc_deinit(struct device *dev) { struct vs_dc *dc = dev_get_drvdata(dev); struct platform_device *pdev = to_platform_device(dev); - + int ret; dc_hw_enable_interrupt(&dc->hw, 0); dc_hw_deinit(&dc->hw); vs_dc_dc8200_clock_disable(dc); vs_dc_vouttop_clock_disable(dc); vs_dc_clock_disable(dc); - vs_dc_dc8200_resets_assert(dev, dc); - vs_dc_vouttop_resets_assert(dev, dc); - //vs_dc_resets_assert(dev, dc); - //plda_clk_rst_deinit(dev); + ret = reset_control_assert(dc->vout_resets); + if (ret) + dev_err(dev, "assert vout resets error.\n"); + pm_runtime_put_sync(&pdev->dev); pm_runtime_disable(&pdev->dev); } diff --git a/drivers/gpu/drm/verisilicon/vs_dc.h b/drivers/gpu/drm/verisilicon/vs_dc.h index 77e0fbb601cb..25efb7fb487d 100755 --- a/drivers/gpu/drm/verisilicon/vs_dc.h +++ b/drivers/gpu/drm/verisilicon/vs_dc.h @@ -59,12 +59,6 @@ struct vs_dc { struct clk *disp_axi; struct clk *stg_axi; - struct reset_control *cpu_axi_n; - struct reset_control *axicfg0_axi_n; - struct reset_control *apb_bus_n; - struct reset_control *disp_axi_n; - struct reset_control *stg_axi_n; - struct clk *vout_src; struct clk *vout_axi; struct clk *ahb1; @@ -72,18 +66,12 @@ struct vs_dc { struct clk *hdmitx0_mclk; struct clk *bclk_mst; - struct reset_control *rstn_vout_src; - struct clk *dc8200_clk_pix0; struct clk *dc8200_clk_pix1; struct clk *dc8200_axi; struct clk *dc8200_core; struct clk *dc8200_ahb; - struct reset_control *rstn_dc8200_axi; - struct reset_control *rstn_dc8200_core; - struct reset_control *rstn_dc8200_ahb; - struct clk *vout_top_axi; struct clk *vout_top_lcd; @@ -92,6 +80,8 @@ struct vs_dc { struct clk *dc8200_clk_pix0_out; struct clk *dc8200_clk_pix1_out; + struct reset_control *vout_resets; + struct regmap *dss_regmap; }; |