.. | .. |
---|
553 | 553 | case MEDIA_BUS_FMT_SGBRG8_1X8: |
---|
554 | 554 | case MEDIA_BUS_FMT_SGRBG8_1X8: |
---|
555 | 555 | case MEDIA_BUS_FMT_SRGGB8_1X8: |
---|
| 556 | + case MEDIA_BUS_FMT_Y8_1X8: |
---|
556 | 557 | return 0x2a; |
---|
557 | 558 | /* csi raw10 */ |
---|
558 | 559 | case MEDIA_BUS_FMT_SBGGR10_1X10: |
---|
559 | 560 | case MEDIA_BUS_FMT_SGBRG10_1X10: |
---|
560 | 561 | case MEDIA_BUS_FMT_SGRBG10_1X10: |
---|
561 | 562 | case MEDIA_BUS_FMT_SRGGB10_1X10: |
---|
| 563 | + case MEDIA_BUS_FMT_Y10_1X10: |
---|
562 | 564 | return 0x2b; |
---|
563 | 565 | /* csi raw12 */ |
---|
564 | 566 | case MEDIA_BUS_FMT_SBGGR12_1X12: |
---|
565 | 567 | case MEDIA_BUS_FMT_SGBRG12_1X12: |
---|
566 | 568 | case MEDIA_BUS_FMT_SGRBG12_1X12: |
---|
567 | 569 | case MEDIA_BUS_FMT_SRGGB12_1X12: |
---|
| 570 | + case MEDIA_BUS_FMT_Y12_1X12: |
---|
568 | 571 | return 0x2c; |
---|
569 | 572 | /* csi uyvy 422 */ |
---|
570 | 573 | case MEDIA_BUS_FMT_UYVY8_2X8: |
---|
.. | .. |
---|
2425 | 2428 | int i; |
---|
2426 | 2429 | unsigned long flags; |
---|
2427 | 2430 | |
---|
2428 | | - mutex_lock(&dev->stream_lock); |
---|
| 2431 | + mutex_lock(&dev->hw_dev->dev_lock); |
---|
2429 | 2432 | |
---|
2430 | 2433 | v4l2_info(&dev->v4l2_dev, "stream[%d] start stopping\n", stream->id); |
---|
2431 | 2434 | |
---|
.. | .. |
---|
2499 | 2502 | if (dev->can_be_reset && can_reset) { |
---|
2500 | 2503 | rkcif_do_cru_reset(dev); |
---|
2501 | 2504 | dev->can_be_reset = false; |
---|
2502 | | - dev->reset_work_cancel = true; |
---|
| 2505 | + hw_dev->reset_work_cancel = true; |
---|
2503 | 2506 | hw_dev->hw_timer.is_running = false; |
---|
2504 | 2507 | hw_dev->reset_info.is_need_reset = 0; |
---|
2505 | 2508 | } |
---|
2506 | 2509 | spin_unlock_irqrestore(&hw_dev->hw_timer.timer_lock, flags); |
---|
2507 | | - |
---|
2508 | | - pm_runtime_put_sync(dev->dev); |
---|
2509 | 2510 | |
---|
2510 | 2511 | if (!atomic_read(&dev->pipe.stream_cnt) && dev->dummy_buf.vaddr) |
---|
2511 | 2512 | rkcif_destroy_dummy_buf(stream); |
---|
2512 | 2513 | |
---|
2513 | 2514 | v4l2_info(&dev->v4l2_dev, "stream[%d] stopping finished\n", stream->id); |
---|
2514 | 2515 | |
---|
2515 | | - mutex_unlock(&dev->stream_lock); |
---|
| 2516 | + mutex_unlock(&dev->hw_dev->dev_lock); |
---|
2516 | 2517 | } |
---|
2517 | 2518 | |
---|
2518 | 2519 | /* |
---|
.. | .. |
---|
3081 | 3082 | |
---|
3082 | 3083 | v4l2_info(&dev->v4l2_dev, "stream[%d] start streaming\n", stream->id); |
---|
3083 | 3084 | |
---|
3084 | | - mutex_lock(&dev->stream_lock); |
---|
| 3085 | + mutex_lock(&dev->hw_dev->dev_lock); |
---|
3085 | 3086 | |
---|
3086 | 3087 | if (WARN_ON(stream->state != RKCIF_STATE_READY)) { |
---|
3087 | 3088 | ret = -EBUSY; |
---|
.. | .. |
---|
3141 | 3142 | v4l2_err(v4l2_dev, "Failed to create dummy_buf, %d\n", ret); |
---|
3142 | 3143 | goto destroy_buf; |
---|
3143 | 3144 | } |
---|
3144 | | - } |
---|
3145 | | - |
---|
3146 | | - /* enable clocks/power-domains */ |
---|
3147 | | - ret = pm_runtime_get_sync(dev->dev); |
---|
3148 | | - if (ret < 0) { |
---|
3149 | | - v4l2_err(v4l2_dev, "Failed to get runtime pm, %d\n", |
---|
3150 | | - ret); |
---|
3151 | | - goto destroy_buf; |
---|
3152 | 3145 | } |
---|
3153 | 3146 | |
---|
3154 | 3147 | ret = dev->pipe.open(&dev->pipe, &node->vdev.entity, true); |
---|
.. | .. |
---|
3218 | 3211 | } |
---|
3219 | 3212 | } |
---|
3220 | 3213 | |
---|
3221 | | - dev->reset_work_cancel = false; |
---|
| 3214 | + if (dev->hw_dev->reset_work_cancel) |
---|
| 3215 | + dev->hw_dev->reset_work_cancel = false; |
---|
3222 | 3216 | if (dev->hdr.mode == NO_HDR) |
---|
3223 | 3217 | stream->streamon_timestamp = ktime_get_ns(); |
---|
3224 | 3218 | goto out; |
---|
.. | .. |
---|
3246 | 3240 | } |
---|
3247 | 3241 | |
---|
3248 | 3242 | out: |
---|
3249 | | - mutex_unlock(&dev->stream_lock); |
---|
| 3243 | + mutex_unlock(&dev->hw_dev->dev_lock); |
---|
3250 | 3244 | return ret; |
---|
3251 | 3245 | } |
---|
3252 | 3246 | |
---|
.. | .. |
---|
3524 | 3518 | return ret; |
---|
3525 | 3519 | } |
---|
3526 | 3520 | |
---|
| 3521 | + /* enable clocks/power-domains */ |
---|
| 3522 | + ret = pm_runtime_get_sync(cifdev->dev); |
---|
| 3523 | + if (ret < 0) { |
---|
| 3524 | + v4l2_err(vdev, "Failed to get runtime pm, %d\n", |
---|
| 3525 | + ret); |
---|
| 3526 | + return ret; |
---|
| 3527 | + } |
---|
3527 | 3528 | /* |
---|
3528 | 3529 | * Soft reset via CRU. |
---|
3529 | 3530 | * Because CRU would reset iommu too, so there's not chance |
---|
.. | .. |
---|
3574 | 3575 | else if (atomic_read(&cifdev->fh_cnt) < 0) |
---|
3575 | 3576 | atomic_set(&cifdev->fh_cnt, 0); |
---|
3576 | 3577 | mutex_unlock(&cifdev->stream_lock); |
---|
| 3578 | + pm_runtime_put_sync(cifdev->dev); |
---|
3577 | 3579 | |
---|
3578 | 3580 | return ret; |
---|
3579 | 3581 | } |
---|
.. | .. |
---|
3584 | 3586 | .unlocked_ioctl = video_ioctl2, |
---|
3585 | 3587 | .poll = vb2_fop_poll, |
---|
3586 | 3588 | .mmap = vb2_fop_mmap, |
---|
| 3589 | +#ifdef CONFIG_COMPAT |
---|
| 3590 | + .compat_ioctl32 = video_ioctl2, |
---|
| 3591 | +#endif |
---|
3587 | 3592 | }; |
---|
3588 | 3593 | |
---|
3589 | 3594 | static int rkcif_enum_input(struct file *file, void *priv, |
---|
.. | .. |
---|
3925 | 3930 | int vc = 0; |
---|
3926 | 3931 | struct rkcif_reset_info *reset_info; |
---|
3927 | 3932 | int reset_src = 0; |
---|
| 3933 | + unsigned long flags; |
---|
3928 | 3934 | |
---|
3929 | 3935 | switch (cmd) { |
---|
3930 | 3936 | case RKCIF_CMD_GET_CSI_MEMORY_MODE: |
---|
.. | .. |
---|
3967 | 3973 | break; |
---|
3968 | 3974 | case RKCIF_CMD_GET_RESET_INFO: |
---|
3969 | 3975 | reset_info = (struct rkcif_reset_info *)arg; |
---|
| 3976 | + spin_lock_irqsave(&dev->hw_dev->spin_lock, flags); |
---|
3970 | 3977 | *reset_info = dev->hw_dev->reset_info; |
---|
3971 | | - if (dev->hw_dev->reset_info.is_need_reset) |
---|
3972 | | - dev->hw_dev->reset_info.is_need_reset = 0; |
---|
| 3978 | + spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags); |
---|
3973 | 3979 | break; |
---|
3974 | 3980 | case RKCIF_CMD_SET_RESET: |
---|
3975 | 3981 | reset_src = *(int *)arg; |
---|
| 3982 | + spin_lock_irqsave(&dev->hw_dev->spin_lock, flags); |
---|
| 3983 | + if (dev->hw_dev->reset_info.is_need_reset) |
---|
| 3984 | + dev->hw_dev->reset_info.is_need_reset = 0; |
---|
| 3985 | + spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags); |
---|
3976 | 3986 | return rkcif_do_reset_work(dev, reset_src); |
---|
3977 | 3987 | default: |
---|
3978 | 3988 | return -EINVAL; |
---|
.. | .. |
---|
4789 | 4799 | if (dev->irq_stats.csi_bwidth_lack_cnt) { |
---|
4790 | 4800 | is_triggered = true; |
---|
4791 | 4801 | dev->irq_stats.csi_bwidth_lack_cnt = 0; |
---|
| 4802 | + v4l2_info(&dev->v4l2_dev, "reset for bandwidth lack\n"); |
---|
4792 | 4803 | } |
---|
4793 | 4804 | if (dev->irq_stats.csi_overflow_cnt) { |
---|
4794 | 4805 | is_triggered = true; |
---|
.. | .. |
---|
5402 | 5413 | |
---|
5403 | 5414 | for (i = 0, j = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { |
---|
5404 | 5415 | stream = &cif_dev->stream[i]; |
---|
5405 | | - mutex_lock(&cif_dev->stream_lock); |
---|
5406 | 5416 | if (stream->state == RKCIF_STATE_STREAMING) { |
---|
5407 | 5417 | stream_off_cnt++; |
---|
5408 | 5418 | |
---|
.. | .. |
---|
5422 | 5432 | stream->frame_idx, |
---|
5423 | 5433 | sof_cnt); |
---|
5424 | 5434 | |
---|
5425 | | - resume_info->frm_sync_seq = sof_cnt; |
---|
5426 | | - if (stream->frame_idx != sof_cnt) |
---|
5427 | | - stream->frame_idx = sof_cnt; |
---|
| 5435 | + resume_info->frm_sync_seq = stream->frame_idx; |
---|
5428 | 5436 | } |
---|
5429 | 5437 | |
---|
5430 | 5438 | stream->state = RKCIF_STATE_RESET_IN_STREAMING; |
---|
.. | .. |
---|
5438 | 5446 | __func__, stream->id, stream->frame_idx, rkcif_csi2_get_sof()); |
---|
5439 | 5447 | |
---|
5440 | 5448 | } |
---|
5441 | | - mutex_unlock(&cif_dev->stream_lock); |
---|
5442 | 5449 | } |
---|
5443 | 5450 | if (!stream_off_cnt) |
---|
5444 | 5451 | return 0; |
---|
.. | .. |
---|
5486 | 5493 | stream = resume_stream[i]; |
---|
5487 | 5494 | if (stream == NULL || stream->state != RKCIF_STATE_RESET_IN_STREAMING) |
---|
5488 | 5495 | break; |
---|
5489 | | - mutex_lock(&cif_dev->stream_lock); |
---|
5490 | 5496 | stream_on_cnt++; |
---|
5491 | 5497 | stream->fs_cnt_in_single_frame = 0; |
---|
5492 | 5498 | if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) { |
---|
.. | .. |
---|
5514 | 5520 | } |
---|
5515 | 5521 | atomic_inc(&p->stream_cnt); |
---|
5516 | 5522 | stream->streamon_timestamp = ktime_get_ns(); |
---|
5517 | | - mutex_unlock(&cif_dev->stream_lock); |
---|
5518 | 5523 | v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, |
---|
5519 | 5524 | "resume stream[%d], frm_idx:%d, csi_sof:%d\n", |
---|
5520 | 5525 | stream->id, stream->frame_idx, |
---|
.. | .. |
---|
5552 | 5557 | |
---|
5553 | 5558 | v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n"); |
---|
5554 | 5559 | |
---|
5555 | | - mutex_unlock(&cif_dev->stream_lock); |
---|
5556 | 5560 | return 0; |
---|
5557 | 5561 | |
---|
5558 | 5562 | unlock_stream: |
---|
5559 | | - mutex_unlock(&cif_dev->stream_lock); |
---|
5560 | 5563 | return ret; |
---|
5561 | 5564 | } |
---|
5562 | 5565 | |
---|
.. | .. |
---|
5570 | 5573 | int i = 0; |
---|
5571 | 5574 | int ret = 0; |
---|
5572 | 5575 | |
---|
5573 | | - v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset\n"); |
---|
| 5576 | + v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset\n"); |
---|
5574 | 5577 | |
---|
| 5578 | + mutex_lock(&cif_dev->hw_dev->dev_lock); |
---|
| 5579 | + if (hw->reset_work_cancel) { |
---|
| 5580 | + mutex_unlock(&hw->dev_lock); |
---|
| 5581 | + return 0; |
---|
| 5582 | + } |
---|
5575 | 5583 | for (i = 0; i < hw->dev_num; i++) { |
---|
5576 | 5584 | cifdev = hw->cif_dev[i]; |
---|
5577 | 5585 | resume_info[i] = &cifdev->reset_work.resume_info; |
---|
.. | .. |
---|
5585 | 5593 | |
---|
5586 | 5594 | rkcif_do_cru_reset(cif_dev); |
---|
5587 | 5595 | |
---|
5588 | | - rkcif_disable_sys_clk(cif_dev->hw_dev); |
---|
5589 | | - |
---|
5590 | | - udelay(5); |
---|
5591 | | - |
---|
5592 | | - ret |= rkcif_enable_sys_clk(cif_dev->hw_dev); |
---|
5593 | | - if (ret < 0) |
---|
5594 | | - v4l2_err(&cif_dev->v4l2_dev, "%s:resume cif clk failed\n", __func__); |
---|
| 5596 | + udelay(30); |
---|
5595 | 5597 | |
---|
5596 | 5598 | for (i = 0; i < hw->dev_num; i++) { |
---|
5597 | 5599 | cifdev = hw->cif_dev[i]; |
---|
.. | .. |
---|
5607 | 5609 | hw->hw_timer.is_running = false; |
---|
5608 | 5610 | rkcif_monitor_reset_event(cif_dev->hw_dev); |
---|
5609 | 5611 | |
---|
5610 | | - v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n"); |
---|
5611 | | - |
---|
| 5612 | + v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset successfully!\n"); |
---|
| 5613 | + mutex_unlock(&hw->dev_lock); |
---|
5612 | 5614 | return ret; |
---|
5613 | 5615 | |
---|
5614 | 5616 | } |
---|
.. | .. |
---|
5710 | 5712 | spin_unlock_irqrestore(&timer->csi2_err_lock, flags); |
---|
5711 | 5713 | } |
---|
5712 | 5714 | if (hw_timer->is_reset_by_user) { |
---|
| 5715 | + spin_lock_irqsave(&hw->spin_lock, flags); |
---|
5713 | 5716 | hw->reset_info.is_need_reset = 1; |
---|
5714 | 5717 | hw->reset_info.reset_src = hw_timer->reset_src; |
---|
| 5718 | + spin_unlock_irqrestore(&hw->spin_lock, flags); |
---|
5715 | 5719 | } else { |
---|
5716 | 5720 | dev->reset_work.reset_src = hw_timer->reset_src; |
---|
5717 | 5721 | if (schedule_work(&dev->reset_work.work)) { |
---|
.. | .. |
---|
5762 | 5766 | hw_timer->reset_src = RKCIF_RESET_SRC_ERR_HOTPLUG; |
---|
5763 | 5767 | v4l2_subdev_call(terminal_sensor->sd, core, ioctl, |
---|
5764 | 5768 | RKMODULE_SET_VICAP_RST_INFO, &rst_info); |
---|
5765 | | - if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS) |
---|
| 5769 | + if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS) { |
---|
| 5770 | + hw_timer->reset_src = RKICF_RESET_SRC_ERR_CUTOFF; |
---|
5766 | 5771 | is_reset = rkcif_is_csi2_err_trigger_reset(timer); |
---|
| 5772 | + } |
---|
5767 | 5773 | } else if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_CONTINUE) { |
---|
5768 | 5774 | if (stream->cifdev->inf_id == RKCIF_MIPI_LVDS) |
---|
5769 | 5775 | is_reset = rkcif_is_csi2_err_trigger_reset(timer); |
---|
.. | .. |
---|
5859 | 5865 | int is_reset = 0; |
---|
5860 | 5866 | int check_cnt = 0; |
---|
5861 | 5867 | bool is_mod_timer = false; |
---|
| 5868 | + struct rkmodule_vicap_reset_info rst_info; |
---|
5862 | 5869 | |
---|
5863 | 5870 | for (i = 0; i < hw->dev_num; i++) { |
---|
5864 | 5871 | dev = hw->cif_dev[i]; |
---|
.. | .. |
---|
5867 | 5874 | &is_mod_timer); |
---|
5868 | 5875 | if (is_reset) |
---|
5869 | 5876 | break; |
---|
| 5877 | + } |
---|
5870 | 5878 | |
---|
| 5879 | + if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_HOTPLUG && is_reset) { |
---|
| 5880 | + for (i = 0; i < hw->dev_num; i++) { |
---|
| 5881 | + dev = hw->cif_dev[i]; |
---|
| 5882 | + rst_info.is_reset = 0; |
---|
| 5883 | + if (dev->terminal_sensor.sd) |
---|
| 5884 | + v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, |
---|
| 5885 | + RKMODULE_SET_VICAP_RST_INFO, &rst_info); |
---|
| 5886 | + } |
---|
5871 | 5887 | } |
---|
5872 | 5888 | |
---|
5873 | 5889 | if (!is_reset && is_mod_timer) |
---|
.. | .. |
---|
6069 | 6085 | } |
---|
6070 | 6086 | } |
---|
6071 | 6087 | |
---|
| 6088 | +#define CSI_START_INTSTAT(id) (0x3 << ((id) * 2)) |
---|
6072 | 6089 | void rkcif_irq_pingpong(struct rkcif_device *cif_dev) |
---|
6073 | 6090 | { |
---|
6074 | 6091 | struct rkcif_stream *stream; |
---|
.. | .. |
---|
6125 | 6142 | __func__); |
---|
6126 | 6143 | } |
---|
6127 | 6144 | |
---|
6128 | | - if (intstat & CSI_FRAME0_START_ID0) { |
---|
6129 | | - if (mbus->type == V4L2_MBUS_CSI2) |
---|
6130 | | - rkcif_csi2_event_inc_sof(); |
---|
6131 | | - else if (mbus->type == V4L2_MBUS_CCP2) |
---|
6132 | | - rkcif_lvds_event_inc_sof(cif_dev); |
---|
6133 | | - detect_stream->fs_cnt_in_single_frame++; |
---|
6134 | | - spin_lock_irqsave(&detect_stream->fps_lock, flags); |
---|
6135 | | - detect_stream->readout.fs_timestamp = ktime_get_ns(); |
---|
6136 | | - spin_unlock_irqrestore(&detect_stream->fps_lock, flags); |
---|
6137 | | - } |
---|
6138 | | - |
---|
6139 | | - if (intstat & CSI_FRAME1_START_ID0) { |
---|
6140 | | - if (mbus->type == V4L2_MBUS_CSI2) |
---|
6141 | | - rkcif_csi2_event_inc_sof(); |
---|
6142 | | - else if (mbus->type == V4L2_MBUS_CCP2) |
---|
6143 | | - rkcif_lvds_event_inc_sof(cif_dev); |
---|
6144 | | - detect_stream->fs_cnt_in_single_frame++; |
---|
6145 | | - spin_lock_irqsave(&detect_stream->fps_lock, flags); |
---|
6146 | | - detect_stream->readout.fs_timestamp = ktime_get_ns(); |
---|
6147 | | - spin_unlock_irqrestore(&detect_stream->fps_lock, flags); |
---|
6148 | | - } |
---|
6149 | 6145 | for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { |
---|
6150 | 6146 | if (intstat & CSI_LINE_INTSTAT(i)) { |
---|
6151 | 6147 | stream = &cif_dev->stream[i]; |
---|
.. | .. |
---|
6159 | 6155 | "%s: id0 cur line:%d\n", __func__, lastline & 0x3fff); |
---|
6160 | 6156 | } |
---|
6161 | 6157 | } |
---|
6162 | | - |
---|
6163 | | - /* if do not reach frame dma end, return irq */ |
---|
6164 | | - mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev, intstat); |
---|
6165 | | - if (mipi_id < 0) |
---|
6166 | | - return; |
---|
6167 | 6158 | |
---|
6168 | 6159 | for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { |
---|
6169 | 6160 | mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev, |
---|
.. | .. |
---|
6220 | 6211 | detect_stream->fs_cnt_in_single_frame--; |
---|
6221 | 6212 | } |
---|
6222 | 6213 | } |
---|
| 6214 | + cif_dev->irq_stats.all_frm_end_cnt++; |
---|
6223 | 6215 | } |
---|
6224 | | - cif_dev->irq_stats.all_frm_end_cnt++; |
---|
| 6216 | + for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) { |
---|
| 6217 | + if (intstat & CSI_START_INTSTAT(i)) { |
---|
| 6218 | + stream = &cif_dev->stream[i]; |
---|
| 6219 | + if (i == 0) { |
---|
| 6220 | + if (mbus->type == V4L2_MBUS_CSI2) |
---|
| 6221 | + rkcif_csi2_event_inc_sof(); |
---|
| 6222 | + else if (mbus->type == V4L2_MBUS_CCP2) |
---|
| 6223 | + rkcif_lvds_event_inc_sof(cif_dev); |
---|
| 6224 | + stream->fs_cnt_in_single_frame++; |
---|
| 6225 | + spin_lock_irqsave(&stream->fps_lock, flags); |
---|
| 6226 | + stream->readout.fs_timestamp = ktime_get_ns(); |
---|
| 6227 | + spin_unlock_irqrestore(&stream->fps_lock, flags); |
---|
| 6228 | + } else { |
---|
| 6229 | + spin_lock_irqsave(&stream->fps_lock, flags); |
---|
| 6230 | + stream->readout.fs_timestamp = ktime_get_ns(); |
---|
| 6231 | + spin_unlock_irqrestore(&stream->fps_lock, flags); |
---|
| 6232 | + } |
---|
| 6233 | + } |
---|
| 6234 | + } |
---|
| 6235 | + |
---|
6225 | 6236 | } else { |
---|
6226 | 6237 | u32 lastline, lastpix, ctl; |
---|
6227 | 6238 | u32 cif_frmst, frmid, int_en; |
---|