From e251a2c567c6adf0ccbb43924c503b80fc93b8c2 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Wed, 13 Dec 2023 16:53:49 +0800 Subject: [PATCH] video: rockchip: rga3: support RK3756 Change-Id: I3c76f623aae2bff23f4234a3fd778184b78823e5 Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/include/rga_drv.h | 5 +- drivers/video/rockchip/rga3/rga_drv.c | 94 ++++++++++++++++++- 2 files changed, 94 insertions(+), 5 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index e9743a40327b..5f2975aaaad8 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -117,8 +117,9 @@ enum { RGA3_SCHEDULER_CORE0 = 1 << 0, RGA3_SCHEDULER_CORE1 = 1 << 1, RGA2_SCHEDULER_CORE0 = 1 << 2, - RGA_CORE_MASK = 0x7, - RGA_NONE_CORE = 0x0, + RGA2_SCHEDULER_CORE1 = 1 << 3, + RGA_CORE_MASK = 0xf, + RGA_NONE_CORE = 0x0, }; enum { diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index 2d80c8089440..d02c573f2bbc 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -1198,6 +1198,18 @@ static const char *const rk3588_rga2_clks[] = { "clk_rga2", }; +static const char *const rga2_core0_clks[] = { + "aclk_rga2e_0", + "hclk_rga2e_0", + "clk_rga2e_0", +}; + +static const char *const rga2_core1_clks[] = { + "aclk_rga2e_1", + "hclk_rga2e_1", + "clk_rga2e_1", +}; + static const char *const rga3_core_0_clks[] = { "aclk_rga3_0", "hclk_rga3_0", @@ -1220,6 +1232,16 @@ static const struct rga_match_data_t rk3588_rga2_match_data = { .num_clks = ARRAY_SIZE(rk3588_rga2_clks), }; +static const struct rga_match_data_t rga2_core0_match_data = { + .clks = rga2_core0_clks, + .num_clks = ARRAY_SIZE(rga2_core0_clks), +}; + +static const struct rga_match_data_t rga2_core1_match_data = { + .clks = rga2_core1_clks, + .num_clks = ARRAY_SIZE(rga2_core1_clks), +}; + static const struct rga_match_data_t rga3_core0_match_data = { .clks = rga3_core_0_clks, .num_clks = ARRAY_SIZE(rga3_core_0_clks), @@ -1246,6 +1268,22 @@ static const struct of_device_id rga3_core1_dt_ids[] = { {}, }; +static const struct of_device_id rga2_core0_dt_ids[] = { + { + .compatible = "rockchip,rga2_core0", + .data = &rga2_core0_match_data, + }, + {}, +}; + +static const struct of_device_id rga2_core1_dt_ids[] = { + { + .compatible = "rockchip,rga2_core1", + .data = &rga2_core1_match_data, + }, + {}, +}; + static const struct of_device_id rga2_dt_ids[] = { { .compatible = "rockchip,rga2_core0", @@ -1272,9 +1310,17 @@ static void init_scheduler(struct rga_scheduler_t *scheduler, } else if (!strcmp(name, "rga3_core1")) { scheduler->ops = &rga3_ops; scheduler->core = RGA3_SCHEDULER_CORE1; + } else if (!strcmp(name, "rga2_core0")) { + scheduler->ops = &rga2_ops; + scheduler->core = RGA2_SCHEDULER_CORE0; + } else if (!strcmp(name, "rga2_core1")) { + scheduler->ops = &rga2_ops; + scheduler->core = RGA2_SCHEDULER_CORE1; } else if (!strcmp(name, "rga2")) { scheduler->ops = &rga2_ops; scheduler->core = RGA2_SCHEDULER_CORE0; + } else { + pr_err("Scheduler failed to match hardware[%s]\n", name); } } @@ -1299,6 +1345,10 @@ static int rga_drv_probe(struct platform_device *pdev) match = of_match_device(rga3_core0_dt_ids, dev); else if (!strcmp(dev_driver_string(dev), "rga3_core1")) match = of_match_device(rga3_core1_dt_ids, dev); + else if (!strcmp(dev_driver_string(dev), "rga2_core0")) + match = of_match_device(rga2_core0_dt_ids, dev); + else if (!strcmp(dev_driver_string(dev), "rga2_core1")) + match = of_match_device(rga2_core1_dt_ids, dev); else if (!strcmp(dev_driver_string(dev), "rga2")) match = of_match_device(rga2_dt_ids, dev); else @@ -1399,11 +1449,13 @@ static int rga_drv_probe(struct platform_device *pdev) if (scheduler->core == RGA3_SCHEDULER_CORE0 || scheduler->core == RGA3_SCHEDULER_CORE1) { scheduler->data = &rga3_data; - } else if (scheduler->core == RGA2_SCHEDULER_CORE0) { + } else if (scheduler->core == RGA2_SCHEDULER_CORE0 || + scheduler->core == RGA2_SCHEDULER_CORE1) { if (!strcmp(scheduler->version.str, "3.3.87975")) scheduler->data = &rga2e_1106_data; else if (!strcmp(scheduler->version.str, "3.6.92812") || - !strcmp(scheduler->version.str, "3.7.93215")) + !strcmp(scheduler->version.str, "3.7.93215") || + !strcmp(scheduler->version.str, "3.e.19357")) scheduler->data = &rga2e_iommu_data; else scheduler->data = &rga2e_data; @@ -1472,6 +1524,24 @@ static struct platform_driver rga3_core1_driver = { }, }; +static struct platform_driver rga2_core0_driver = { + .probe = rga_drv_probe, + .remove = rga_drv_remove, + .driver = { + .name = "rga2_core0", + .of_match_table = of_match_ptr(rga2_core0_dt_ids), + }, +}; + +static struct platform_driver rga2_core1_driver = { + .probe = rga_drv_probe, + .remove = rga_drv_remove, + .driver = { + .name = "rga2_core1", + .of_match_table = of_match_ptr(rga2_core1_dt_ids), + }, +}; + static struct platform_driver rga2_driver = { .probe = rga_drv_probe, .remove = rga_drv_remove, @@ -1505,10 +1575,22 @@ static int __init rga_init(void) goto err_unregister_rga3_core0; } + ret = platform_driver_register(&rga2_core0_driver); + if (ret != 0) { + pr_err("Platform device rga2_core0_driver register failed (%d).\n", ret); + goto err_unregister_rga3_core1; + } + + ret = platform_driver_register(&rga2_core1_driver); + if (ret != 0) { + pr_err("Platform device rga2_core1_driver register failed (%d).\n", ret); + goto err_unregister_rga2_core0; + } + ret = platform_driver_register(&rga2_driver); if (ret != 0) { pr_err("Platform device rga2_driver register failed (%d).\n", ret); - goto err_unregister_rga3_core1; + goto err_unregister_rga2_core1; } ret = rga_iommu_bind(); @@ -1549,6 +1631,12 @@ err_unbind_iommu: err_unregister_rga2: platform_driver_unregister(&rga2_driver); +err_unregister_rga2_core1: + platform_driver_unregister(&rga2_core1_driver); + +err_unregister_rga2_core0: + platform_driver_unregister(&rga2_core0_driver); + err_unregister_rga3_core1: platform_driver_unregister(&rga3_core1_driver);