From ba424a5b9489d44967a825276932af7b47658cba Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 19 Mar 2024 19:25:24 +0800 Subject: [PATCH] video: rockchip: rga3: get clk through dts Update driver version to 1.3.3 Signed-off-by: Yu Qiaowei Change-Id: I99175b79f4aa669c772b53c0c414122361173c2a --- drivers/video/rockchip/rga3/include/rga_drv.h | 7 +- drivers/video/rockchip/rga3/rga_drv.c | 109 +++--------------- 2 files changed, 20 insertions(+), 96 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index a8cb0d7ef18b..aa63b0bb00c4 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -87,7 +87,7 @@ #define DRIVER_MAJOR_VERISON 1 #define DRIVER_MINOR_VERSION 3 -#define DRIVER_REVISION_VERSION 2 +#define DRIVER_REVISION_VERSION 3 #define DRIVER_PATCH_VERSION #define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \ @@ -323,7 +323,7 @@ struct rga_scheduler_t { void __iomem *rga_base; struct rga_iommu_info *iommu_info; - struct clk *clks[RGA_MAX_BUS_CLK]; + struct clk_bulk_data *clks; int num_clks; enum rga_scheduler_status status; @@ -443,9 +443,6 @@ struct rga_match_data_t { enum RGA_DEVICE_TYPE device_type; const struct rga_backend_ops *ops; - - const char * const *clks; - int num_clks; }; static inline int rga_read(int offset, struct rga_scheduler_t *scheduler) diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index 5051a9d9aeed..559a822d68a5 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -375,19 +375,14 @@ static void rga_cancel_timer(void) int rga_power_enable(struct rga_scheduler_t *scheduler) { int ret = -EINVAL; - int i; unsigned long flags; pm_runtime_get_sync(scheduler->dev); pm_stay_awake(scheduler->dev); - for (i = 0; i < scheduler->num_clks; i++) { - if (!IS_ERR(scheduler->clks[i])) { - ret = clk_prepare_enable(scheduler->clks[i]); - if (ret < 0) - goto err_enable_clk; - } - } + ret = clk_bulk_prepare_enable(scheduler->num_clks, scheduler->clks); + if (ret < 0) + goto err_enable_clk; spin_lock_irqsave(&scheduler->irq_lock, flags); @@ -400,9 +395,7 @@ int rga_power_enable(struct rga_scheduler_t *scheduler) return 0; err_enable_clk: - for (--i; i >= 0; --i) - if (!IS_ERR(scheduler->clks[i])) - clk_disable_unprepare(scheduler->clks[i]); + clk_bulk_disable_unprepare(scheduler->num_clks, scheduler->clks); pm_relax(scheduler->dev); pm_runtime_put_sync_suspend(scheduler->dev); @@ -412,7 +405,6 @@ err_enable_clk: int rga_power_disable(struct rga_scheduler_t *scheduler) { - int i; unsigned long flags; spin_lock_irqsave(&scheduler->irq_lock, flags); @@ -430,9 +422,7 @@ int rga_power_disable(struct rga_scheduler_t *scheduler) spin_unlock_irqrestore(&scheduler->irq_lock, flags); - for (i = scheduler->num_clks - 1; i >= 0; i--) - if (!IS_ERR(scheduler->clks[i])) - clk_disable_unprepare(scheduler->clks[i]); + clk_bulk_disable_unprepare(scheduler->num_clks, scheduler->clks); pm_relax(scheduler->dev); pm_runtime_put_sync_suspend(scheduler->dev); @@ -1186,63 +1176,14 @@ static struct miscdevice rga_dev = { .fops = &rga_fops, }; -static const char *const rga_clks[] = { - "aclk_rga", - "hclk_rga", - "clk_rga", -}; - -static const char *const legacy_rga2_clks[] = { - "aclk_rga2", - "hclk_rga2", - "clk_rga2", -}; - -static const char *const legacy_rga3_core_0_clks[] = { - "aclk_rga3_0", - "hclk_rga3_0", - "clk_rga3_0", -}; - -static const char *const legacy_rga3_core_1_clks[] = { - "aclk_rga3_1", - "hclk_rga3_1", - "clk_rga3_1", -}; - static const struct rga_match_data_t rga2_match_data = { .device_type = RGA_DEVICE_RGA2, .ops = &rga2_ops, - .clks = rga_clks, - .num_clks = ARRAY_SIZE(rga_clks), }; static const struct rga_match_data_t rga3_match_data = { .device_type = RGA_DEVICE_RGA3, .ops = &rga3_ops, - .clks = rga_clks, - .num_clks = ARRAY_SIZE(rga_clks), -}; - -static const struct rga_match_data_t legacy_rga2_match_data = { - .device_type = RGA_DEVICE_RGA2, - .ops = &rga2_ops, - .clks = legacy_rga2_clks, - .num_clks = ARRAY_SIZE(legacy_rga2_clks), -}; - -static const struct rga_match_data_t legacy_rga3_core0_match_data = { - .device_type = RGA_DEVICE_RGA3, - .ops = &rga3_ops, - .clks = legacy_rga3_core_0_clks, - .num_clks = ARRAY_SIZE(legacy_rga3_core_0_clks), -}; - -static const struct rga_match_data_t legacy_rga3_core1_match_data = { - .device_type = RGA_DEVICE_RGA3, - .ops = &rga3_ops, - .clks = legacy_rga3_core_1_clks, - .num_clks = ARRAY_SIZE(legacy_rga3_core_1_clks), }; static const struct of_device_id rga3_dt_ids[] = { @@ -1253,11 +1194,11 @@ static const struct of_device_id rga3_dt_ids[] = { /* legacy */ { .compatible = "rockchip,rga3_core0", - .data = &legacy_rga3_core0_match_data, + .data = &rga3_match_data, }, { .compatible = "rockchip,rga3_core1", - .data = &legacy_rga3_core1_match_data, + .data = &rga3_match_data, }, {}, }; @@ -1270,7 +1211,7 @@ static const struct of_device_id rga2_dt_ids[] = { /* legacy */ { .compatible = "rockchip,rga2_core0", - .data = &legacy_rga2_match_data, + .data = &rga2_match_data, }, {}, }; @@ -1326,9 +1267,6 @@ static int init_scheduler(struct rga_scheduler_t *scheduler, static int rga_drv_probe(struct platform_device *pdev) { -#ifndef RGA_DISABLE_PM - int i; -#endif int ret = 0; int irq; struct resource *res; @@ -1402,17 +1340,12 @@ static int rga_drv_probe(struct platform_device *pdev) #ifndef RGA_DISABLE_PM /* clk init */ - for (i = 0; i < match_data->num_clks; i++) { - struct clk *clk = devm_clk_get(dev, match_data->clks[i]); - - if (IS_ERR(clk)) { - dev_err(dev, "failed to get %s\n", match_data->clks[i]); - return PTR_ERR(clk); - } - - scheduler->clks[i] = clk; + ret = devm_clk_bulk_get_all(dev, &scheduler->clks); + if (ret < 1) { + dev_err(dev, "failed to get clk\n"); + return ret < 0 ? ret : -EINVAL; } - scheduler->num_clks = match_data->num_clks; + scheduler->num_clks = ret; /* PM init */ device_init_wakeup(dev, true); @@ -1424,14 +1357,10 @@ static int rga_drv_probe(struct platform_device *pdev) goto pm_disable; } - for (i = 0; i < scheduler->num_clks; i++) { - if (!IS_ERR(scheduler->clks[i])) { - ret = clk_prepare_enable(scheduler->clks[i]); - if (ret < 0) { - dev_err(dev, "failed to enable clk\n"); - goto pm_disable; - } - } + ret = clk_bulk_prepare_enable(scheduler->num_clks, scheduler->clks); + if (ret < 0) { + dev_err(dev, "failed to enable clk\n"); + goto pm_disable; } #endif /* #ifndef RGA_DISABLE_PM */ @@ -1459,9 +1388,7 @@ static int rga_drv_probe(struct platform_device *pdev) data->device_count[match_data->device_type]++; #ifndef RGA_DISABLE_PM - for (i = scheduler->num_clks - 1; i >= 0; i--) - if (!IS_ERR(scheduler->clks[i])) - clk_disable_unprepare(scheduler->clks[i]); + clk_bulk_disable_unprepare(scheduler->num_clks, scheduler->clks); pm_runtime_put_sync(dev); #endif /* #ifndef RGA_DISABLE_PM */