hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/platform/rockchip/ispp/hw.c
....@@ -14,7 +14,7 @@
1414 #include <linux/pinctrl/consumer.h>
1515 #include <linux/pm_runtime.h>
1616 #include <linux/reset.h>
17
-#include <media/videobuf2-dma-contig.h>
17
+#include <media/videobuf2-cma-sg.h>
1818 #include <media/videobuf2-dma-sg.h>
1919 #include <soc/rockchip/rockchip_iommu.h>
2020
....@@ -43,6 +43,7 @@
4343 {
4444 writel(GLB_SOFT_RST_ALL, hw->base_addr + RKISPP_CTRL_RESET);
4545 udelay(10);
46
+ writel(~GLB_SOFT_RST_ALL, hw->base_addr + RKISPP_CTRL_RESET);
4647 if (hw->reset) {
4748 reset_control_assert(hw->reset);
4849 udelay(20);
....@@ -55,43 +56,63 @@
5556 rockchip_iommu_disable(hw->dev);
5657 rockchip_iommu_enable(hw->dev);
5758 }
58
-
59
- writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL0_CTRL);
60
- writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL1_CTRL);
61
- writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL2_CTRL);
62
- writel(OTHER_FORCE_UPD, hw->base_addr + RKISPP_CTRL_UPDATE);
63
- writel(GATE_DIS_ALL, hw->base_addr + RKISPP_CTRL_CLKGATE);
64
- writel(SW_FEC2DDR_DIS, hw->base_addr + RKISPP_FEC_CORE_CTRL);
65
- writel(NR_LOST_ERR | TNR_LOST_ERR | FBCH_EMPTY_NR |
59
+ if (hw->ispp_ver == ISPP_V10) {
60
+ writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL0_CTRL);
61
+ writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL1_CTRL);
62
+ writel(SW_SCL_BYPASS, hw->base_addr + RKISPP_SCL2_CTRL);
63
+ writel(OTHER_FORCE_UPD, hw->base_addr + RKISPP_CTRL_UPDATE);
64
+ writel(GATE_DIS_ALL, hw->base_addr + RKISPP_CTRL_CLKGATE);
65
+ writel(SW_FEC2DDR_DIS, hw->base_addr + RKISPP_FEC_CORE_CTRL);
66
+ writel(NR_LOST_ERR | TNR_LOST_ERR | FBCH_EMPTY_NR |
6667 FBCH_EMPTY_TNR | FBCD_DEC_ERR_NR | FBCD_DEC_ERR_TNR |
6768 BUS_ERR_NR | BUS_ERR_TNR | SCL2_INT | SCL1_INT |
6869 SCL0_INT | FEC_INT | ORB_INT | SHP_INT | NR_INT | TNR_INT,
6970 hw->base_addr + RKISPP_CTRL_INT_MSK);
70
- writel(GATE_DIS_NR, hw->base_addr + RKISPP_CTRL_CLKGATE);
71
+ writel(GATE_DIS_NR, hw->base_addr + RKISPP_CTRL_CLKGATE);
72
+ } else if (hw->ispp_ver == ISPP_V20) {
73
+ writel(GATE_DIS_ALL, hw->base_addr + RKISPP_CTRL_CLKGATE);
74
+ writel(SW_FEC2DDR_DIS, hw->base_addr + RKISPP_FEC_CORE_CTRL);
75
+ writel(FEC_INT, hw->base_addr + RKISPP_CTRL_INT_MSK);
76
+ writel(GATE_DIS_FEC, hw->base_addr + RKISPP_CTRL_CLKGATE);
77
+ }
78
+
7179 }
7280
7381 /* using default value if reg no write for multi device */
7482 static void default_sw_reg_flag(struct rkispp_device *dev)
7583 {
76
- u32 reg[] = {
77
- RKISPP_TNR_CTRL,
78
- RKISPP_TNR_CORE_CTRL,
79
- RKISPP_NR_CTRL,
80
- RKISPP_NR_UVNR_CTRL_PARA,
81
- RKISPP_SHARP_CTRL,
82
- RKISPP_SHARP_CORE_CTRL,
83
- RKISPP_SCL0_CTRL,
84
- RKISPP_SCL1_CTRL,
85
- RKISPP_SCL2_CTRL,
86
- RKISPP_ORB_CORE_CTRL,
87
- RKISPP_FEC_CTRL,
88
- RKISPP_FEC_CORE_CTRL
89
- };
90
- u32 i, *flag;
84
+ if (dev->hw_dev->ispp_ver == ISPP_V10) {
85
+ u32 reg[] = {
86
+ RKISPP_TNR_CTRL,
87
+ RKISPP_TNR_CORE_CTRL,
88
+ RKISPP_NR_CTRL,
89
+ RKISPP_NR_UVNR_CTRL_PARA,
90
+ RKISPP_SHARP_CTRL,
91
+ RKISPP_SHARP_CORE_CTRL,
92
+ RKISPP_SCL0_CTRL,
93
+ RKISPP_SCL1_CTRL,
94
+ RKISPP_SCL2_CTRL,
95
+ RKISPP_ORB_CORE_CTRL,
96
+ RKISPP_FEC_CTRL,
97
+ RKISPP_FEC_CORE_CTRL
98
+ };
99
+ u32 i, *flag;
91100
92
- for (i = 0; i < ARRAY_SIZE(reg); i++) {
93
- flag = dev->sw_base_addr + reg[i] + RKISP_ISPP_SW_REG_SIZE;
94
- *flag = 0xffffffff;
101
+ for (i = 0; i < ARRAY_SIZE(reg); i++) {
102
+ flag = dev->sw_base_addr + reg[i] + RKISP_ISPP_SW_REG_SIZE;
103
+ *flag = 0xffffffff;
104
+ }
105
+ } else if (dev->hw_dev->ispp_ver == ISPP_V20) {
106
+ u32 reg[] = {
107
+ RKISPP_FEC_CTRL,
108
+ RKISPP_FEC_CORE_CTRL
109
+ };
110
+ u32 i, *flag;
111
+
112
+ for (i = 0; i < ARRAY_SIZE(reg); i++) {
113
+ flag = dev->sw_base_addr + reg[i] + RKISP_ISPP_SW_REG_SIZE;
114
+ *flag = 0xffffffff;
115
+ }
95116 }
96117 }
97118
....@@ -124,14 +145,18 @@
124145 static int enable_sys_clk(struct rkispp_hw_dev *dev)
125146 {
126147 struct rkispp_device *ispp = dev->ispp[dev->cur_dev_id];
127
- u32 w = dev->max_in.w ? dev->max_in.w : ispp->ispp_sdev.in_fmt.width;
128
- int i, ret = -EINVAL;
148
+ int w, i, ret = -EINVAL;
129149
130150 for (i = 0; i < dev->clks_num; i++) {
131151 ret = clk_prepare_enable(dev->clks[i]);
132152 if (ret < 0)
133153 goto err;
134154 }
155
+
156
+ if (!ispp)
157
+ return ret;
158
+
159
+ w = dev->max_in.w ? dev->max_in.w : ispp->ispp_sdev.in_fmt.width;
135160
136161 for (i = 0; i < dev->clk_rate_tbl_num; i++)
137162 if (w <= dev->clk_rate_tbl[i].refer_data)
....@@ -181,6 +206,12 @@
181206 "hclk_ispp",
182207 };
183208
209
+static const char * const rk3588_ispp_clks[] = {
210
+ "clk_ispp",
211
+ "aclk_ispp",
212
+ "hclk_ispp",
213
+};
214
+
184215 static const struct ispp_clk_info rv1126_ispp_clk_rate[] = {
185216 {
186217 .clk_rate = 150,
....@@ -200,8 +231,31 @@
200231 }
201232 };
202233
234
+static const struct ispp_clk_info rk3588_ispp_clk_rate[] = {
235
+ {
236
+ .clk_rate = 300,
237
+ .refer_data = 1920, //width
238
+ }, {
239
+ .clk_rate = 400,
240
+ .refer_data = 2688,
241
+ }, {
242
+ .clk_rate = 500,
243
+ .refer_data = 3072,
244
+ }, {
245
+ .clk_rate = 600,
246
+ .refer_data = 3840,
247
+ }, {
248
+ .clk_rate = 702,
249
+ .refer_data = 4672,
250
+ }
251
+};
252
+
203253 static struct irqs_data rv1126_ispp_irqs[] = {
204254 {"ispp_irq", irq_hdl},
255
+ {"fec_irq", irq_hdl},
256
+};
257
+
258
+static struct irqs_data rk3588_ispp_irqs[] = {
205259 {"fec_irq", irq_hdl},
206260 };
207261
....@@ -215,10 +269,23 @@
215269 .ispp_ver = ISPP_V10,
216270 };
217271
272
+static const struct ispp_match_data rk3588_ispp_match_data = {
273
+ .clks = rk3588_ispp_clks,
274
+ .clks_num = ARRAY_SIZE(rk3588_ispp_clks),
275
+ .clk_rate_tbl = rk3588_ispp_clk_rate,
276
+ .clk_rate_tbl_num = ARRAY_SIZE(rk3588_ispp_clk_rate),
277
+ .irqs = rk3588_ispp_irqs,
278
+ .num_irqs = ARRAY_SIZE(rk3588_ispp_irqs),
279
+ .ispp_ver = ISPP_V20,
280
+};
281
+
218282 static const struct of_device_id rkispp_hw_of_match[] = {
219283 {
220284 .compatible = "rockchip,rv1126-rkispp",
221285 .data = &rv1126_ispp_match_data,
286
+ }, {
287
+ .compatible = "rockchip,rk3588-rkispp",
288
+ .data = &rk3588_ispp_match_data,
222289 },
223290 {},
224291 };
....@@ -328,10 +395,13 @@
328395 atomic_set(&hw_dev->refcnt, 0);
329396 INIT_LIST_HEAD(&hw_dev->list);
330397 hw_dev->is_idle = true;
331
- hw_dev->is_single = false;
398
+ hw_dev->is_single = true;
399
+ /* for frame end reset and config reg */
400
+ if (hw_dev->ispp_ver == ISPP_V10)
401
+ hw_dev->is_single = false;
332402 hw_dev->is_fec_ext = false;
333403 hw_dev->is_dma_contig = true;
334
- hw_dev->is_dma_sg_ops = false;
404
+ hw_dev->is_dma_sg_ops = true;
335405 hw_dev->is_shutdown = false;
336406 hw_dev->is_first = true;
337407 hw_dev->is_mmu = is_iommu_enable(dev);
....@@ -340,19 +410,10 @@
340410 is_mem_reserved = false;
341411 if (!hw_dev->is_mmu)
342412 dev_info(dev, "No reserved memory region. default cma area!\n");
343
- else
344
- hw_dev->is_dma_contig = false;
345413 }
346
- if (is_mem_reserved) {
347
- /* reserved memory using rdma_sg */
348
- hw_dev->mem_ops = &vb2_rdma_sg_memops;
349
- hw_dev->is_dma_sg_ops = true;
350
- } else if (hw_dev->is_mmu) {
351
- hw_dev->mem_ops = &vb2_dma_sg_memops;
352
- hw_dev->is_dma_sg_ops = true;
353
- } else {
354
- hw_dev->mem_ops = &vb2_dma_contig_memops;
355
- }
414
+ if (hw_dev->is_mmu && !is_mem_reserved)
415
+ hw_dev->is_dma_contig = false;
416
+ hw_dev->mem_ops = &vb2_cma_sg_memops;
356417
357418 rkispp_register_fec(hw_dev);
358419 pm_runtime_enable(&pdev->dev);
....@@ -380,6 +441,7 @@
380441 if (pm_runtime_active(&pdev->dev)) {
381442 writel(0, hw_dev->base_addr + RKISPP_CTRL_INT_MSK);
382443 writel(GLB_SOFT_RST_ALL, hw_dev->base_addr + RKISPP_CTRL_RESET);
444
+ writel(~GLB_SOFT_RST_ALL, hw_dev->base_addr + RKISPP_CTRL_RESET);
383445 }
384446 dev_info(&pdev->dev, "%s\n", __func__);
385447 }
....@@ -414,8 +476,6 @@
414476 }
415477
416478 static const struct dev_pm_ops rkispp_hw_pm_ops = {
417
- SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
418
- pm_runtime_force_resume)
419479 SET_RUNTIME_PM_OPS(rkispp_runtime_suspend,
420480 rkispp_runtime_resume, NULL)
421481 };