.. | .. |
---|
141 | 141 | break; |
---|
142 | 142 | default: |
---|
143 | 143 | v4l2_warn(&csi2->sd, "lane num is invalid\n"); |
---|
144 | | - csi2->bus.num_data_lanes = 0; |
---|
| 144 | + csi2->bus.num_data_lanes = 4; |
---|
145 | 145 | break; |
---|
146 | 146 | } |
---|
147 | 147 | |
---|
.. | .. |
---|
252 | 252 | v4l2_err(&csi2->sd, "%s: enable clks failed\n", __func__); |
---|
253 | 253 | return ret; |
---|
254 | 254 | } |
---|
| 255 | + enable_irq(csi2->csi2_hw[csi_idx]->irq1); |
---|
| 256 | + enable_irq(csi2->csi2_hw[csi_idx]->irq2); |
---|
255 | 257 | csi2_enable(csi2->csi2_hw[csi_idx], host_type); |
---|
256 | 258 | } |
---|
257 | 259 | |
---|
.. | .. |
---|
269 | 271 | err_assert_reset: |
---|
270 | 272 | for (i = 0; i < csi2->csi_info.csi_num; i++) { |
---|
271 | 273 | 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); |
---|
272 | 276 | csi2_disable(csi2->csi2_hw[csi_idx]); |
---|
273 | 277 | csi2_disable_clks(csi2->csi2_hw[csi_idx]); |
---|
274 | 278 | } |
---|
.. | .. |
---|
286 | 290 | |
---|
287 | 291 | for (i = 0; i < csi2->csi_info.csi_num; i++) { |
---|
288 | 292 | 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); |
---|
289 | 295 | csi2_disable(csi2->csi2_hw[csi_idx]); |
---|
290 | 296 | csi2_hw_do_reset(csi2->csi2_hw[csi_idx]); |
---|
291 | 297 | csi2_disable_clks(csi2->csi2_hw[csi_idx]); |
---|
.. | .. |
---|
399 | 405 | csi2->crop.left = 0; |
---|
400 | 406 | csi2->crop.width = RKCIF_DEFAULT_WIDTH; |
---|
401 | 407 | csi2->crop.height = RKCIF_DEFAULT_HEIGHT; |
---|
| 408 | + csi2->bus.num_data_lanes = 4; |
---|
402 | 409 | |
---|
403 | 410 | return media_entity_pads_init(&sd->entity, num_pads, csi2->pad); |
---|
404 | 411 | } |
---|
.. | .. |
---|
664 | 671 | struct v4l2_fwnode_endpoint *vep, |
---|
665 | 672 | struct v4l2_async_subdev *asd) |
---|
666 | 673 | { |
---|
667 | | - struct v4l2_subdev *sd = dev_get_drvdata(dev); |
---|
668 | | - struct csi2_dev *csi2 = sd_to_dev(sd); |
---|
669 | | - |
---|
670 | 674 | if (vep->base.port != 0) { |
---|
671 | 675 | dev_err(dev, "The csi host node needs to parse port 0\n"); |
---|
672 | 676 | return -EINVAL; |
---|
673 | 677 | } |
---|
674 | | - |
---|
675 | | - csi2->bus = vep->bus.mipi_csi2; |
---|
676 | 678 | |
---|
677 | 679 | return 0; |
---|
678 | 680 | } |
---|
.. | .. |
---|
777 | 779 | { |
---|
778 | 780 | struct device *dev = ctx; |
---|
779 | 781 | struct csi2_hw *csi2_hw = dev_get_drvdata(dev); |
---|
780 | | - struct csi2_dev *csi2 = csi2_hw->csi2; |
---|
| 782 | + struct csi2_dev *csi2 = NULL; |
---|
781 | 783 | struct csi2_err_stats *err_list = NULL; |
---|
782 | 784 | unsigned long err_stat = 0; |
---|
783 | 785 | u32 val; |
---|
.. | .. |
---|
786 | 788 | char vc_info[CSI_VCINFO_LEN] = {0}; |
---|
787 | 789 | bool is_add_cnt = false; |
---|
788 | 790 | |
---|
| 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 | + } |
---|
789 | 801 | val = read_csihost_reg(csi2_hw->base, CSIHOST_ERR1); |
---|
790 | 802 | if (val) { |
---|
791 | 803 | if (val & CSIHOST_ERR1_PHYERR_SPTSYNCHS) { |
---|
.. | .. |
---|
885 | 897 | char cur_str[CSI_ERRSTR_LEN] = {0}; |
---|
886 | 898 | char err_str[CSI_ERRSTR_LEN] = {0}; |
---|
887 | 899 | char vc_info[CSI_VCINFO_LEN] = {0}; |
---|
| 900 | + |
---|
| 901 | + if (!csi2_hw) { |
---|
| 902 | + disable_irq_nosync(irq); |
---|
| 903 | + return IRQ_HANDLED; |
---|
| 904 | + } |
---|
888 | 905 | |
---|
889 | 906 | val = read_csihost_reg(csi2_hw->base, CSIHOST_ERR2); |
---|
890 | 907 | if (val) { |
---|
.. | .. |
---|
1262 | 1279 | |
---|
1263 | 1280 | irq = platform_get_irq_byname(pdev, "csi-intr1"); |
---|
1264 | 1281 | if (irq > 0) { |
---|
| 1282 | + irq_set_status_flags(irq, IRQ_NOAUTOEN); |
---|
1265 | 1283 | ret = devm_request_irq(&pdev->dev, irq, |
---|
1266 | 1284 | rk_csirx_irq1_handler, 0, |
---|
1267 | 1285 | dev_driver_string(&pdev->dev), |
---|
.. | .. |
---|
1276 | 1294 | |
---|
1277 | 1295 | irq = platform_get_irq_byname(pdev, "csi-intr2"); |
---|
1278 | 1296 | if (irq > 0) { |
---|
| 1297 | + irq_set_status_flags(irq, IRQ_NOAUTOEN); |
---|
1279 | 1298 | ret = devm_request_irq(&pdev->dev, irq, |
---|
1280 | 1299 | rk_csirx_irq2_handler, 0, |
---|
1281 | 1300 | dev_driver_string(&pdev->dev), |
---|