hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/rockchip/cif/mipi-csi2.c
....@@ -141,7 +141,7 @@
141141 break;
142142 default:
143143 v4l2_warn(&csi2->sd, "lane num is invalid\n");
144
- csi2->bus.num_data_lanes = 0;
144
+ csi2->bus.num_data_lanes = 4;
145145 break;
146146 }
147147
....@@ -252,6 +252,8 @@
252252 v4l2_err(&csi2->sd, "%s: enable clks failed\n", __func__);
253253 return ret;
254254 }
255
+ enable_irq(csi2->csi2_hw[csi_idx]->irq1);
256
+ enable_irq(csi2->csi2_hw[csi_idx]->irq2);
255257 csi2_enable(csi2->csi2_hw[csi_idx], host_type);
256258 }
257259
....@@ -269,6 +271,8 @@
269271 err_assert_reset:
270272 for (i = 0; i < csi2->csi_info.csi_num; i++) {
271273 csi_idx = csi2->csi_info.csi_idx[i];
274
+ disable_irq(csi2->csi2_hw[csi_idx]->irq1);
275
+ disable_irq(csi2->csi2_hw[csi_idx]->irq2);
272276 csi2_disable(csi2->csi2_hw[csi_idx]);
273277 csi2_disable_clks(csi2->csi2_hw[csi_idx]);
274278 }
....@@ -286,6 +290,8 @@
286290
287291 for (i = 0; i < csi2->csi_info.csi_num; i++) {
288292 csi_idx = csi2->csi_info.csi_idx[i];
293
+ disable_irq(csi2->csi2_hw[csi_idx]->irq1);
294
+ disable_irq(csi2->csi2_hw[csi_idx]->irq2);
289295 csi2_disable(csi2->csi2_hw[csi_idx]);
290296 csi2_hw_do_reset(csi2->csi2_hw[csi_idx]);
291297 csi2_disable_clks(csi2->csi2_hw[csi_idx]);
....@@ -399,6 +405,7 @@
399405 csi2->crop.left = 0;
400406 csi2->crop.width = RKCIF_DEFAULT_WIDTH;
401407 csi2->crop.height = RKCIF_DEFAULT_HEIGHT;
408
+ csi2->bus.num_data_lanes = 4;
402409
403410 return media_entity_pads_init(&sd->entity, num_pads, csi2->pad);
404411 }
....@@ -664,15 +671,10 @@
664671 struct v4l2_fwnode_endpoint *vep,
665672 struct v4l2_async_subdev *asd)
666673 {
667
- struct v4l2_subdev *sd = dev_get_drvdata(dev);
668
- struct csi2_dev *csi2 = sd_to_dev(sd);
669
-
670674 if (vep->base.port != 0) {
671675 dev_err(dev, "The csi host node needs to parse port 0\n");
672676 return -EINVAL;
673677 }
674
-
675
- csi2->bus = vep->bus.mipi_csi2;
676678
677679 return 0;
678680 }
....@@ -777,7 +779,7 @@
777779 {
778780 struct device *dev = ctx;
779781 struct csi2_hw *csi2_hw = dev_get_drvdata(dev);
780
- struct csi2_dev *csi2 = csi2_hw->csi2;
782
+ struct csi2_dev *csi2 = NULL;
781783 struct csi2_err_stats *err_list = NULL;
782784 unsigned long err_stat = 0;
783785 u32 val;
....@@ -786,6 +788,16 @@
786788 char vc_info[CSI_VCINFO_LEN] = {0};
787789 bool is_add_cnt = false;
788790
791
+ if (!csi2_hw) {
792
+ disable_irq_nosync(irq);
793
+ return IRQ_HANDLED;
794
+ }
795
+
796
+ csi2 = csi2_hw->csi2;
797
+ if (!csi2) {
798
+ disable_irq_nosync(irq);
799
+ return IRQ_HANDLED;
800
+ }
789801 val = read_csihost_reg(csi2_hw->base, CSIHOST_ERR1);
790802 if (val) {
791803 if (val & CSIHOST_ERR1_PHYERR_SPTSYNCHS) {
....@@ -885,6 +897,11 @@
885897 char cur_str[CSI_ERRSTR_LEN] = {0};
886898 char err_str[CSI_ERRSTR_LEN] = {0};
887899 char vc_info[CSI_VCINFO_LEN] = {0};
900
+
901
+ if (!csi2_hw) {
902
+ disable_irq_nosync(irq);
903
+ return IRQ_HANDLED;
904
+ }
888905
889906 val = read_csihost_reg(csi2_hw->base, CSIHOST_ERR2);
890907 if (val) {
....@@ -1262,6 +1279,7 @@
12621279
12631280 irq = platform_get_irq_byname(pdev, "csi-intr1");
12641281 if (irq > 0) {
1282
+ irq_set_status_flags(irq, IRQ_NOAUTOEN);
12651283 ret = devm_request_irq(&pdev->dev, irq,
12661284 rk_csirx_irq1_handler, 0,
12671285 dev_driver_string(&pdev->dev),
....@@ -1276,6 +1294,7 @@
12761294
12771295 irq = platform_get_irq_byname(pdev, "csi-intr2");
12781296 if (irq > 0) {
1297
+ irq_set_status_flags(irq, IRQ_NOAUTOEN);
12791298 ret = devm_request_irq(&pdev->dev, irq,
12801299 rk_csirx_irq2_handler, 0,
12811300 dev_driver_string(&pdev->dev),