summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zhou <jason.zhou@starfivetech.com>2022-07-20 09:23:30 +0300
committerJason Zhou <jason.zhou@starfivetech.com>2022-07-20 09:23:30 +0300
commita91bcc1a09807aa9be851a957b6dc47346cb0899 (patch)
treebb4c8aa0d2292e1ca9dba1b59ac2482bffa0e2c2
parent810b472fd2a32af116f521de80d4c167a2d3d067 (diff)
parente2f1380e3c27610fbd6a4395ca79e5fdce2c4ccd (diff)
downloadlinux-a91bcc1a09807aa9be851a957b6dc47346cb0899.tar.xz
Merge branch 'CR_1651_7110_evb_5.15_voutrst-1_shengyang.chen' into 'jh7110-5.15.y-devel'
Cr 1651 7110 evb 5.15 voutrst 1 shengyang.chen See merge request sdk/linux!285
-rwxr-xr-xarch/riscv/boot/dts/starfive/jh7110.dtsi10
-rwxr-xr-xdrivers/gpu/drm/verisilicon/vs_dc.c246
-rwxr-xr-xdrivers/gpu/drm/verisilicon/vs_dc.h14
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;
};