• Home
  • Raw
  • Download

Lines Matching full:dcmi

41 #define DRV_NAME "stm32-dcmi"
43 /* Registers offset for DCMI */
197 static int dcmi_start_capture(struct stm32_dcmi *dcmi, struct dcmi_buf *buf);
199 static void dcmi_buffer_done(struct stm32_dcmi *dcmi, in dcmi_buffer_done() argument
213 vbuf->sequence = dcmi->sequence++; in dcmi_buffer_done()
219 dev_dbg(dcmi->dev, "buffer[%d] done seq=%d, bytesused=%zu\n", in dcmi_buffer_done()
222 dcmi->buffers_count++; in dcmi_buffer_done()
223 dcmi->active = NULL; in dcmi_buffer_done()
226 static int dcmi_restart_capture(struct stm32_dcmi *dcmi) in dcmi_restart_capture() argument
230 spin_lock_irq(&dcmi->irqlock); in dcmi_restart_capture()
232 if (dcmi->state != RUNNING) { in dcmi_restart_capture()
233 spin_unlock_irq(&dcmi->irqlock); in dcmi_restart_capture()
238 if (list_empty(&dcmi->buffers)) { in dcmi_restart_capture()
239 dev_dbg(dcmi->dev, "Capture restart is deferred to next buffer queueing\n"); in dcmi_restart_capture()
240 dcmi->state = WAIT_FOR_BUFFER; in dcmi_restart_capture()
241 spin_unlock_irq(&dcmi->irqlock); in dcmi_restart_capture()
244 buf = list_entry(dcmi->buffers.next, struct dcmi_buf, list); in dcmi_restart_capture()
245 dcmi->active = buf; in dcmi_restart_capture()
247 spin_unlock_irq(&dcmi->irqlock); in dcmi_restart_capture()
249 return dcmi_start_capture(dcmi, buf); in dcmi_restart_capture()
254 struct stm32_dcmi *dcmi = (struct stm32_dcmi *)param; in dcmi_dma_callback() local
257 struct dcmi_buf *buf = dcmi->active; in dcmi_dma_callback()
259 spin_lock_irq(&dcmi->irqlock); in dcmi_dma_callback()
262 status = dmaengine_tx_status(dcmi->dma_chan, dcmi->dma_cookie, &state); in dcmi_dma_callback()
266 dev_dbg(dcmi->dev, "%s: Received DMA_IN_PROGRESS\n", __func__); in dcmi_dma_callback()
269 dev_err(dcmi->dev, "%s: Received DMA_PAUSED\n", __func__); in dcmi_dma_callback()
272 dev_err(dcmi->dev, "%s: Received DMA_ERROR\n", __func__); in dcmi_dma_callback()
275 dcmi_buffer_done(dcmi, buf, 0, -EIO); in dcmi_dma_callback()
278 dev_dbg(dcmi->dev, "%s: Received DMA_COMPLETE\n", __func__); in dcmi_dma_callback()
281 dcmi_buffer_done(dcmi, buf, buf->size, 0); in dcmi_dma_callback()
283 spin_unlock_irq(&dcmi->irqlock); in dcmi_dma_callback()
286 if (dcmi_restart_capture(dcmi)) in dcmi_dma_callback()
287 dev_err(dcmi->dev, "%s: Cannot restart capture on DMA complete\n", in dcmi_dma_callback()
291 dev_err(dcmi->dev, "%s: Received unknown status\n", __func__); in dcmi_dma_callback()
295 spin_unlock_irq(&dcmi->irqlock); in dcmi_dma_callback()
298 static int dcmi_start_dma(struct stm32_dcmi *dcmi, in dcmi_start_dma() argument
307 config.src_addr = (dma_addr_t)dcmi->res->start + DCMI_DR; in dcmi_start_dma()
313 ret = dmaengine_slave_config(dcmi->dma_chan, &config); in dcmi_start_dma()
315 dev_err(dcmi->dev, "%s: DMA channel config failed (%d)\n", in dcmi_start_dma()
325 mutex_lock(&dcmi->dma_lock); in dcmi_start_dma()
328 desc = dmaengine_prep_slave_single(dcmi->dma_chan, buf->paddr, in dcmi_start_dma()
333 dev_err(dcmi->dev, "%s: DMA dmaengine_prep_slave_single failed for buffer phy=%pad size=%zu\n", in dcmi_start_dma()
335 mutex_unlock(&dcmi->dma_lock); in dcmi_start_dma()
341 desc->callback_param = dcmi; in dcmi_start_dma()
344 dcmi->dma_cookie = dmaengine_submit(desc); in dcmi_start_dma()
345 if (dma_submit_error(dcmi->dma_cookie)) { in dcmi_start_dma()
346 dev_err(dcmi->dev, "%s: DMA submission failed\n", __func__); in dcmi_start_dma()
347 mutex_unlock(&dcmi->dma_lock); in dcmi_start_dma()
351 mutex_unlock(&dcmi->dma_lock); in dcmi_start_dma()
353 dma_async_issue_pending(dcmi->dma_chan); in dcmi_start_dma()
358 static int dcmi_start_capture(struct stm32_dcmi *dcmi, struct dcmi_buf *buf) in dcmi_start_capture() argument
365 ret = dcmi_start_dma(dcmi, buf); in dcmi_start_capture()
367 dcmi->errors_count++; in dcmi_start_capture()
372 reg_set(dcmi->regs, DCMI_CR, CR_CAPTURE); in dcmi_start_capture()
377 static void dcmi_set_crop(struct stm32_dcmi *dcmi) in dcmi_set_crop() argument
382 size = ((dcmi->crop.height - 1) << 16) | in dcmi_set_crop()
383 ((dcmi->crop.width << 1) - 1); in dcmi_set_crop()
384 reg_write(dcmi->regs, DCMI_CWSIZE, size); in dcmi_set_crop()
387 start = ((dcmi->crop.top) << 16) | in dcmi_set_crop()
388 ((dcmi->crop.left << 1)); in dcmi_set_crop()
389 reg_write(dcmi->regs, DCMI_CWSTRT, start); in dcmi_set_crop()
391 dev_dbg(dcmi->dev, "Cropping to %ux%u@%u:%u\n", in dcmi_set_crop()
392 dcmi->crop.width, dcmi->crop.height, in dcmi_set_crop()
393 dcmi->crop.left, dcmi->crop.top); in dcmi_set_crop()
396 reg_set(dcmi->regs, DCMI_CR, CR_CROP); in dcmi_set_crop()
399 static void dcmi_process_jpeg(struct stm32_dcmi *dcmi) in dcmi_process_jpeg() argument
403 struct dcmi_buf *buf = dcmi->active; in dcmi_process_jpeg()
419 dmaengine_synchronize(dcmi->dma_chan); in dcmi_process_jpeg()
422 status = dmaengine_tx_status(dcmi->dma_chan, dcmi->dma_cookie, &state); in dcmi_process_jpeg()
425 dcmi_buffer_done(dcmi, buf, buf->size - state.residue, 0); in dcmi_process_jpeg()
427 dcmi->errors_count++; in dcmi_process_jpeg()
428 dev_err(dcmi->dev, "%s: Cannot get JPEG size from DMA\n", in dcmi_process_jpeg()
431 dcmi_buffer_done(dcmi, buf, 0, -EIO); in dcmi_process_jpeg()
435 dmaengine_terminate_all(dcmi->dma_chan); in dcmi_process_jpeg()
438 if (dcmi_restart_capture(dcmi)) in dcmi_process_jpeg()
439 dev_err(dcmi->dev, "%s: Cannot restart capture on JPEG received\n", in dcmi_process_jpeg()
445 struct stm32_dcmi *dcmi = arg; in dcmi_irq_thread() local
447 spin_lock_irq(&dcmi->irqlock); in dcmi_irq_thread()
449 if ((dcmi->misr & IT_OVR) || (dcmi->misr & IT_ERR)) { in dcmi_irq_thread()
450 dcmi->errors_count++; in dcmi_irq_thread()
451 if (dcmi->misr & IT_OVR) in dcmi_irq_thread()
452 dcmi->overrun_count++; in dcmi_irq_thread()
455 if (dcmi->sd_format->fourcc == V4L2_PIX_FMT_JPEG && in dcmi_irq_thread()
456 dcmi->misr & IT_FRAME) { in dcmi_irq_thread()
458 spin_unlock_irq(&dcmi->irqlock); in dcmi_irq_thread()
459 dcmi_process_jpeg(dcmi); in dcmi_irq_thread()
463 spin_unlock_irq(&dcmi->irqlock); in dcmi_irq_thread()
469 struct stm32_dcmi *dcmi = arg; in dcmi_irq_callback() local
472 spin_lock_irqsave(&dcmi->irqlock, flags); in dcmi_irq_callback()
474 dcmi->misr = reg_read(dcmi->regs, DCMI_MIS); in dcmi_irq_callback()
477 reg_set(dcmi->regs, DCMI_ICR, IT_FRAME | IT_OVR | IT_ERR); in dcmi_irq_callback()
479 spin_unlock_irqrestore(&dcmi->irqlock, flags); in dcmi_irq_callback()
490 struct stm32_dcmi *dcmi = vb2_get_drv_priv(vq); in dcmi_queue_setup() local
493 size = dcmi->fmt.fmt.pix.sizeimage; in dcmi_queue_setup()
502 dev_dbg(dcmi->dev, "Setup queue, count=%d, size=%d\n", in dcmi_queue_setup()
520 struct stm32_dcmi *dcmi = vb2_get_drv_priv(vb->vb2_queue); in dcmi_buf_prepare() local
525 size = dcmi->fmt.fmt.pix.sizeimage; in dcmi_buf_prepare()
528 dev_err(dcmi->dev, "%s data will not fit into plane (%lu < %lu)\n", in dcmi_buf_prepare()
544 dev_dbg(dcmi->dev, "buffer[%d] phy=%pad size=%zu\n", in dcmi_buf_prepare()
553 struct stm32_dcmi *dcmi = vb2_get_drv_priv(vb->vb2_queue); in dcmi_buf_queue() local
557 spin_lock_irq(&dcmi->irqlock); in dcmi_buf_queue()
560 list_add_tail(&buf->list, &dcmi->buffers); in dcmi_buf_queue()
562 if (dcmi->state == WAIT_FOR_BUFFER) { in dcmi_buf_queue()
563 dcmi->state = RUNNING; in dcmi_buf_queue()
564 dcmi->active = buf; in dcmi_buf_queue()
566 dev_dbg(dcmi->dev, "Starting capture on buffer[%d] queued\n", in dcmi_buf_queue()
569 spin_unlock_irq(&dcmi->irqlock); in dcmi_buf_queue()
570 if (dcmi_start_capture(dcmi, buf)) in dcmi_buf_queue()
571 dev_err(dcmi->dev, "%s: Cannot restart capture on overflow or error\n", in dcmi_buf_queue()
576 spin_unlock_irq(&dcmi->irqlock); in dcmi_buf_queue()
581 struct stm32_dcmi *dcmi = vb2_get_drv_priv(vq); in dcmi_start_streaming() local
586 ret = pm_runtime_get_sync(dcmi->dev); in dcmi_start_streaming()
588 dev_err(dcmi->dev, "%s: Failed to start streaming, cannot get sync (%d)\n", in dcmi_start_streaming()
594 ret = v4l2_subdev_call(dcmi->entity.subdev, video, s_stream, 1); in dcmi_start_streaming()
596 dev_err(dcmi->dev, "%s: Failed to start streaming, subdev streamon error", in dcmi_start_streaming()
601 spin_lock_irq(&dcmi->irqlock); in dcmi_start_streaming()
604 switch (dcmi->bus.bus_width) { in dcmi_start_streaming()
620 if (dcmi->bus.flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH) in dcmi_start_streaming()
624 if (dcmi->bus.flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH) in dcmi_start_streaming()
628 if (dcmi->bus.flags & V4L2_MBUS_PCLK_SAMPLE_RISING) in dcmi_start_streaming()
631 reg_write(dcmi->regs, DCMI_CR, val); in dcmi_start_streaming()
634 if (dcmi->do_crop) in dcmi_start_streaming()
635 dcmi_set_crop(dcmi); in dcmi_start_streaming()
638 if (dcmi->sd_format->fourcc == V4L2_PIX_FMT_JPEG) in dcmi_start_streaming()
639 reg_set(dcmi->regs, DCMI_CR, CR_CM);/* Snapshot mode */ in dcmi_start_streaming()
641 /* Enable dcmi */ in dcmi_start_streaming()
642 reg_set(dcmi->regs, DCMI_CR, CR_ENABLE); in dcmi_start_streaming()
644 dcmi->sequence = 0; in dcmi_start_streaming()
645 dcmi->errors_count = 0; in dcmi_start_streaming()
646 dcmi->overrun_count = 0; in dcmi_start_streaming()
647 dcmi->buffers_count = 0; in dcmi_start_streaming()
653 if (list_empty(&dcmi->buffers)) { in dcmi_start_streaming()
654 dev_dbg(dcmi->dev, "Start streaming is deferred to next buffer queueing\n"); in dcmi_start_streaming()
655 dcmi->state = WAIT_FOR_BUFFER; in dcmi_start_streaming()
656 spin_unlock_irq(&dcmi->irqlock); in dcmi_start_streaming()
660 buf = list_entry(dcmi->buffers.next, struct dcmi_buf, list); in dcmi_start_streaming()
661 dcmi->active = buf; in dcmi_start_streaming()
663 dcmi->state = RUNNING; in dcmi_start_streaming()
665 dev_dbg(dcmi->dev, "Start streaming, starting capture\n"); in dcmi_start_streaming()
667 spin_unlock_irq(&dcmi->irqlock); in dcmi_start_streaming()
668 ret = dcmi_start_capture(dcmi, buf); in dcmi_start_streaming()
670 dev_err(dcmi->dev, "%s: Start streaming failed, cannot start capture\n", in dcmi_start_streaming()
676 reg_set(dcmi->regs, DCMI_IER, IT_FRAME | IT_OVR | IT_ERR); in dcmi_start_streaming()
681 v4l2_subdev_call(dcmi->entity.subdev, video, s_stream, 0); in dcmi_start_streaming()
684 pm_runtime_put(dcmi->dev); in dcmi_start_streaming()
685 spin_lock_irq(&dcmi->irqlock); in dcmi_start_streaming()
690 list_for_each_entry_safe(buf, node, &dcmi->buffers, list) { in dcmi_start_streaming()
694 dcmi->active = NULL; in dcmi_start_streaming()
695 spin_unlock_irq(&dcmi->irqlock); in dcmi_start_streaming()
702 struct stm32_dcmi *dcmi = vb2_get_drv_priv(vq); in dcmi_stop_streaming() local
707 ret = v4l2_subdev_call(dcmi->entity.subdev, video, s_stream, 0); in dcmi_stop_streaming()
709 dev_err(dcmi->dev, "%s: Failed to stop streaming, subdev streamoff error (%d)\n", in dcmi_stop_streaming()
712 spin_lock_irq(&dcmi->irqlock); in dcmi_stop_streaming()
715 reg_clear(dcmi->regs, DCMI_IER, IT_FRAME | IT_OVR | IT_ERR); in dcmi_stop_streaming()
717 /* Disable DCMI */ in dcmi_stop_streaming()
718 reg_clear(dcmi->regs, DCMI_CR, CR_ENABLE); in dcmi_stop_streaming()
721 list_for_each_entry_safe(buf, node, &dcmi->buffers, list) { in dcmi_stop_streaming()
726 dcmi->active = NULL; in dcmi_stop_streaming()
727 dcmi->state = STOPPED; in dcmi_stop_streaming()
729 spin_unlock_irq(&dcmi->irqlock); in dcmi_stop_streaming()
732 mutex_lock(&dcmi->dma_lock); in dcmi_stop_streaming()
733 dmaengine_terminate_all(dcmi->dma_chan); in dcmi_stop_streaming()
734 mutex_unlock(&dcmi->dma_lock); in dcmi_stop_streaming()
736 pm_runtime_put(dcmi->dev); in dcmi_stop_streaming()
738 if (dcmi->errors_count) in dcmi_stop_streaming()
739 dev_warn(dcmi->dev, "Some errors found while streaming: errors=%d (overrun=%d), buffers=%d\n", in dcmi_stop_streaming()
740 dcmi->errors_count, dcmi->overrun_count, in dcmi_stop_streaming()
741 dcmi->buffers_count); in dcmi_stop_streaming()
742 dev_dbg(dcmi->dev, "Stop streaming, errors=%d (overrun=%d), buffers=%d\n", in dcmi_stop_streaming()
743 dcmi->errors_count, dcmi->overrun_count, in dcmi_stop_streaming()
744 dcmi->buffers_count); in dcmi_stop_streaming()
761 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_g_fmt_vid_cap() local
763 *fmt = dcmi->fmt; in dcmi_g_fmt_vid_cap()
768 static const struct dcmi_format *find_format_by_fourcc(struct stm32_dcmi *dcmi, in find_format_by_fourcc() argument
771 unsigned int num_formats = dcmi->num_of_sd_formats; in find_format_by_fourcc()
776 fmt = dcmi->sd_formats[i]; in find_format_by_fourcc()
784 static void __find_outer_frame_size(struct stm32_dcmi *dcmi, in __find_outer_frame_size() argument
792 for (i = 0; i < dcmi->num_of_sd_framesizes; i++) { in __find_outer_frame_size()
793 struct dcmi_framesize *fsize = &dcmi->sd_framesizes[i]; in __find_outer_frame_size()
804 match = &dcmi->sd_framesizes[0]; in __find_outer_frame_size()
809 static int dcmi_try_fmt(struct stm32_dcmi *dcmi, struct v4l2_format *f, in dcmi_try_fmt() argument
823 sd_fmt = find_format_by_fourcc(dcmi, pix->pixelformat); in dcmi_try_fmt()
825 if (!dcmi->num_of_sd_formats) in dcmi_try_fmt()
828 sd_fmt = dcmi->sd_formats[dcmi->num_of_sd_formats - 1]; in dcmi_try_fmt()
837 do_crop = dcmi->do_crop && (pix->pixelformat != V4L2_PIX_FMT_JPEG); in dcmi_try_fmt()
839 if (do_crop && dcmi->num_of_sd_framesizes) { in dcmi_try_fmt()
845 __find_outer_frame_size(dcmi, pix, &outer_sd_fsize); in dcmi_try_fmt()
851 ret = v4l2_subdev_call(dcmi->entity.subdev, pad, set_fmt, in dcmi_try_fmt()
864 struct v4l2_rect c = dcmi->crop; in dcmi_try_fmt()
878 dcmi->crop = c; in dcmi_try_fmt()
881 pix->width = dcmi->crop.width; in dcmi_try_fmt()
882 pix->height = dcmi->crop.height; in dcmi_try_fmt()
897 static int dcmi_set_fmt(struct stm32_dcmi *dcmi, struct v4l2_format *f) in dcmi_set_fmt() argument
914 ret = dcmi_try_fmt(dcmi, f, &sd_format, &sd_framesize); in dcmi_set_fmt()
920 dcmi->do_crop = false; in dcmi_set_fmt()
928 ret = v4l2_subdev_call(dcmi->entity.subdev, pad, in dcmi_set_fmt()
933 dev_dbg(dcmi->dev, "Sensor format set to 0x%x %ux%u\n", in dcmi_set_fmt()
935 dev_dbg(dcmi->dev, "Buffer format set to %4.4s %ux%u\n", in dcmi_set_fmt()
939 dcmi->fmt = *f; in dcmi_set_fmt()
940 dcmi->sd_format = sd_format; in dcmi_set_fmt()
941 dcmi->sd_framesize = sd_framesize; in dcmi_set_fmt()
949 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_s_fmt_vid_cap() local
951 if (vb2_is_streaming(&dcmi->queue)) in dcmi_s_fmt_vid_cap()
954 return dcmi_set_fmt(dcmi, f); in dcmi_s_fmt_vid_cap()
960 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_try_fmt_vid_cap() local
962 return dcmi_try_fmt(dcmi, f, NULL, NULL); in dcmi_try_fmt_vid_cap()
968 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_enum_fmt_vid_cap() local
970 if (f->index >= dcmi->num_of_sd_formats) in dcmi_enum_fmt_vid_cap()
973 f->pixelformat = dcmi->sd_formats[f->index]->fourcc; in dcmi_enum_fmt_vid_cap()
977 static int dcmi_get_sensor_format(struct stm32_dcmi *dcmi, in dcmi_get_sensor_format() argument
985 ret = v4l2_subdev_call(dcmi->entity.subdev, pad, get_fmt, NULL, &fmt); in dcmi_get_sensor_format()
994 static int dcmi_set_sensor_format(struct stm32_dcmi *dcmi, in dcmi_set_sensor_format() argument
1004 sd_fmt = find_format_by_fourcc(dcmi, pix->pixelformat); in dcmi_set_sensor_format()
1006 if (!dcmi->num_of_sd_formats) in dcmi_set_sensor_format()
1009 sd_fmt = dcmi->sd_formats[dcmi->num_of_sd_formats - 1]; in dcmi_set_sensor_format()
1014 ret = v4l2_subdev_call(dcmi->entity.subdev, pad, set_fmt, in dcmi_set_sensor_format()
1022 static int dcmi_get_sensor_bounds(struct stm32_dcmi *dcmi, in dcmi_get_sensor_bounds() argument
1037 ret = v4l2_subdev_call(dcmi->entity.subdev, pad, get_selection, in dcmi_get_sensor_bounds()
1052 for (i = 0; i < dcmi->num_of_sd_framesizes; i++) { in dcmi_get_sensor_bounds()
1053 struct dcmi_framesize *fsize = &dcmi->sd_framesizes[i]; in dcmi_get_sensor_bounds()
1074 ret = dcmi_get_sensor_format(dcmi, &pix); in dcmi_get_sensor_bounds()
1089 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_g_selection() local
1097 s->r = dcmi->sd_bounds; in dcmi_g_selection()
1100 if (dcmi->do_crop) { in dcmi_g_selection()
1101 s->r = dcmi->crop; in dcmi_g_selection()
1105 s->r.width = dcmi->fmt.fmt.pix.width; in dcmi_g_selection()
1106 s->r.height = dcmi->fmt.fmt.pix.height; in dcmi_g_selection()
1119 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_s_selection() local
1129 pix.pixelformat = dcmi->fmt.fmt.pix.pixelformat; in dcmi_s_selection()
1130 pix.width = dcmi->sd_bounds.width; in dcmi_s_selection()
1131 pix.height = dcmi->sd_bounds.height; in dcmi_s_selection()
1132 dcmi_set_sensor_format(dcmi, &pix); in dcmi_s_selection()
1147 if (!(r.top == dcmi->sd_bounds.top && in dcmi_s_selection()
1148 r.left == dcmi->sd_bounds.left && in dcmi_s_selection()
1149 r.width == dcmi->sd_bounds.width && in dcmi_s_selection()
1150 r.height == dcmi->sd_bounds.height)) { in dcmi_s_selection()
1152 dcmi->do_crop = true; in dcmi_s_selection()
1153 dcmi->crop = r; in dcmi_s_selection()
1154 dev_dbg(dcmi->dev, "s_selection: crop %ux%u@(%u,%u) from %ux%u\n", in dcmi_s_selection()
1159 dcmi->do_crop = false; in dcmi_s_selection()
1160 dev_dbg(dcmi->dev, "s_selection: crop is disabled\n"); in dcmi_s_selection()
1173 strlcpy(cap->bus_info, "platform:dcmi", sizeof(cap->bus_info)); in dcmi_querycap()
1204 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_enum_framesizes() local
1212 sd_fmt = find_format_by_fourcc(dcmi, fsize->pixel_format); in dcmi_enum_framesizes()
1218 ret = v4l2_subdev_call(dcmi->entity.subdev, pad, enum_frame_size, in dcmi_enum_framesizes()
1233 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_g_parm() local
1235 return v4l2_g_parm_cap(video_devdata(file), dcmi->entity.subdev, p); in dcmi_g_parm()
1241 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_s_parm() local
1243 return v4l2_s_parm_cap(video_devdata(file), dcmi->entity.subdev, p); in dcmi_s_parm()
1249 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_enum_frameintervals() local
1259 sd_fmt = find_format_by_fourcc(dcmi, fival->pixel_format); in dcmi_enum_frameintervals()
1265 ret = v4l2_subdev_call(dcmi->entity.subdev, pad, in dcmi_enum_frameintervals()
1277 { .compatible = "st,stm32-dcmi"},
1284 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_open() local
1285 struct v4l2_subdev *sd = dcmi->entity.subdev; in dcmi_open()
1288 if (mutex_lock_interruptible(&dcmi->lock)) in dcmi_open()
1302 ret = dcmi_set_fmt(dcmi, &dcmi->fmt); in dcmi_open()
1309 mutex_unlock(&dcmi->lock); in dcmi_open()
1315 struct stm32_dcmi *dcmi = video_drvdata(file); in dcmi_release() local
1316 struct v4l2_subdev *sd = dcmi->entity.subdev; in dcmi_release()
1320 mutex_lock(&dcmi->lock); in dcmi_release()
1329 mutex_unlock(&dcmi->lock); in dcmi_release()
1382 static int dcmi_set_default_fmt(struct stm32_dcmi *dcmi) in dcmi_set_default_fmt() argument
1390 .pixelformat = dcmi->sd_formats[0]->fourcc, in dcmi_set_default_fmt()
1395 ret = dcmi_try_fmt(dcmi, &f, NULL, NULL); in dcmi_set_default_fmt()
1398 dcmi->sd_format = dcmi->sd_formats[0]; in dcmi_set_default_fmt()
1399 dcmi->fmt = f; in dcmi_set_default_fmt()
1423 static int dcmi_formats_init(struct stm32_dcmi *dcmi) in dcmi_formats_init() argument
1427 struct v4l2_subdev *subdev = dcmi->entity.subdev; in dcmi_formats_init()
1454 dcmi->num_of_sd_formats = num_fmts; in dcmi_formats_init()
1455 dcmi->sd_formats = devm_kcalloc(dcmi->dev, in dcmi_formats_init()
1458 if (!dcmi->sd_formats) { in dcmi_formats_init()
1459 dev_err(dcmi->dev, "Could not allocate memory\n"); in dcmi_formats_init()
1463 memcpy(dcmi->sd_formats, sd_fmts, in dcmi_formats_init()
1465 dcmi->sd_format = dcmi->sd_formats[0]; in dcmi_formats_init()
1470 static int dcmi_framesizes_init(struct stm32_dcmi *dcmi) in dcmi_framesizes_init() argument
1473 struct v4l2_subdev *subdev = dcmi->entity.subdev; in dcmi_framesizes_init()
1476 .code = dcmi->sd_format->mbus_code, in dcmi_framesizes_init()
1490 dcmi->num_of_sd_framesizes = num_fsize; in dcmi_framesizes_init()
1491 dcmi->sd_framesizes = devm_kcalloc(dcmi->dev, num_fsize, in dcmi_framesizes_init()
1494 if (!dcmi->sd_framesizes) { in dcmi_framesizes_init()
1495 dev_err(dcmi->dev, "Could not allocate memory\n"); in dcmi_framesizes_init()
1500 dev_dbg(dcmi->dev, "Sensor supports %u frame sizes:\n", num_fsize); in dcmi_framesizes_init()
1501 for (i = 0; i < dcmi->num_of_sd_framesizes; i++) { in dcmi_framesizes_init()
1507 dcmi->sd_framesizes[fse.index].width = fse.max_width; in dcmi_framesizes_init()
1508 dcmi->sd_framesizes[fse.index].height = fse.max_height; in dcmi_framesizes_init()
1509 dev_dbg(dcmi->dev, "%ux%u\n", fse.max_width, fse.max_height); in dcmi_framesizes_init()
1517 struct stm32_dcmi *dcmi = notifier_to_dcmi(notifier); in dcmi_graph_notify_complete() local
1520 dcmi->vdev->ctrl_handler = dcmi->entity.subdev->ctrl_handler; in dcmi_graph_notify_complete()
1521 ret = dcmi_formats_init(dcmi); in dcmi_graph_notify_complete()
1523 dev_err(dcmi->dev, "No supported mediabus format found\n"); in dcmi_graph_notify_complete()
1527 ret = dcmi_framesizes_init(dcmi); in dcmi_graph_notify_complete()
1529 dev_err(dcmi->dev, "Could not initialize framesizes\n"); in dcmi_graph_notify_complete()
1533 ret = dcmi_get_sensor_bounds(dcmi, &dcmi->sd_bounds); in dcmi_graph_notify_complete()
1535 dev_err(dcmi->dev, "Could not get sensor bounds\n"); in dcmi_graph_notify_complete()
1539 ret = dcmi_set_default_fmt(dcmi); in dcmi_graph_notify_complete()
1541 dev_err(dcmi->dev, "Could not set default format\n"); in dcmi_graph_notify_complete()
1545 ret = video_register_device(dcmi->vdev, VFL_TYPE_GRABBER, -1); in dcmi_graph_notify_complete()
1547 dev_err(dcmi->dev, "Failed to register video device\n"); in dcmi_graph_notify_complete()
1551 dev_dbg(dcmi->dev, "Device registered as %s\n", in dcmi_graph_notify_complete()
1552 video_device_node_name(dcmi->vdev)); in dcmi_graph_notify_complete()
1560 struct stm32_dcmi *dcmi = notifier_to_dcmi(notifier); in dcmi_graph_notify_unbind() local
1562 dev_dbg(dcmi->dev, "Removing %s\n", video_device_node_name(dcmi->vdev)); in dcmi_graph_notify_unbind()
1565 video_unregister_device(dcmi->vdev); in dcmi_graph_notify_unbind()
1572 struct stm32_dcmi *dcmi = notifier_to_dcmi(notifier); in dcmi_graph_notify_bound() local
1574 dev_dbg(dcmi->dev, "Subdev %s bound\n", subdev->name); in dcmi_graph_notify_bound()
1576 dcmi->entity.subdev = subdev; in dcmi_graph_notify_bound()
1587 static int dcmi_graph_parse(struct stm32_dcmi *dcmi, struct device_node *node) in dcmi_graph_parse() argument
1602 dcmi->entity.node = remote; in dcmi_graph_parse()
1603 dcmi->entity.asd.match_type = V4L2_ASYNC_MATCH_FWNODE; in dcmi_graph_parse()
1604 dcmi->entity.asd.match.fwnode = of_fwnode_handle(remote); in dcmi_graph_parse()
1608 static int dcmi_graph_init(struct stm32_dcmi *dcmi) in dcmi_graph_init() argument
1614 ret = dcmi_graph_parse(dcmi, dcmi->dev->of_node); in dcmi_graph_init()
1616 dev_err(dcmi->dev, "Graph parsing failed\n"); in dcmi_graph_init()
1621 subdevs = devm_kzalloc(dcmi->dev, sizeof(*subdevs), GFP_KERNEL); in dcmi_graph_init()
1623 of_node_put(dcmi->entity.node); in dcmi_graph_init()
1627 subdevs[0] = &dcmi->entity.asd; in dcmi_graph_init()
1629 dcmi->notifier.subdevs = subdevs; in dcmi_graph_init()
1630 dcmi->notifier.num_subdevs = 1; in dcmi_graph_init()
1631 dcmi->notifier.ops = &dcmi_graph_notify_ops; in dcmi_graph_init()
1633 ret = v4l2_async_notifier_register(&dcmi->v4l2_dev, &dcmi->notifier); in dcmi_graph_init()
1635 dev_err(dcmi->dev, "Notifier registration failed\n"); in dcmi_graph_init()
1636 of_node_put(dcmi->entity.node); in dcmi_graph_init()
1648 struct stm32_dcmi *dcmi; in dcmi_probe() local
1661 dcmi = devm_kzalloc(&pdev->dev, sizeof(struct stm32_dcmi), GFP_KERNEL); in dcmi_probe()
1662 if (!dcmi) in dcmi_probe()
1665 dcmi->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); in dcmi_probe()
1666 if (IS_ERR(dcmi->rstc)) { in dcmi_probe()
1668 return PTR_ERR(dcmi->rstc); in dcmi_probe()
1690 dcmi->bus.flags = ep.bus.parallel.flags; in dcmi_probe()
1691 dcmi->bus.bus_width = ep.bus.parallel.bus_width; in dcmi_probe()
1692 dcmi->bus.data_shift = ep.bus.parallel.data_shift; in dcmi_probe()
1701 dcmi->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); in dcmi_probe()
1702 if (!dcmi->res) { in dcmi_probe()
1707 dcmi->regs = devm_ioremap_resource(&pdev->dev, dcmi->res); in dcmi_probe()
1708 if (IS_ERR(dcmi->regs)) { in dcmi_probe()
1710 return PTR_ERR(dcmi->regs); in dcmi_probe()
1715 dev_name(&pdev->dev), dcmi); in dcmi_probe()
1734 spin_lock_init(&dcmi->irqlock); in dcmi_probe()
1735 mutex_init(&dcmi->lock); in dcmi_probe()
1736 mutex_init(&dcmi->dma_lock); in dcmi_probe()
1737 init_completion(&dcmi->complete); in dcmi_probe()
1738 INIT_LIST_HEAD(&dcmi->buffers); in dcmi_probe()
1740 dcmi->dev = &pdev->dev; in dcmi_probe()
1741 dcmi->mclk = mclk; in dcmi_probe()
1742 dcmi->state = STOPPED; in dcmi_probe()
1743 dcmi->dma_chan = chan; in dcmi_probe()
1745 q = &dcmi->queue; in dcmi_probe()
1748 ret = v4l2_device_register(&pdev->dev, &dcmi->v4l2_dev); in dcmi_probe()
1752 dcmi->vdev = video_device_alloc(); in dcmi_probe()
1753 if (!dcmi->vdev) { in dcmi_probe()
1759 dcmi->vdev->fops = &dcmi_fops; in dcmi_probe()
1760 dcmi->vdev->v4l2_dev = &dcmi->v4l2_dev; in dcmi_probe()
1761 dcmi->vdev->queue = &dcmi->queue; in dcmi_probe()
1762 strlcpy(dcmi->vdev->name, KBUILD_MODNAME, sizeof(dcmi->vdev->name)); in dcmi_probe()
1763 dcmi->vdev->release = video_device_release; in dcmi_probe()
1764 dcmi->vdev->ioctl_ops = &dcmi_ioctl_ops; in dcmi_probe()
1765 dcmi->vdev->lock = &dcmi->lock; in dcmi_probe()
1766 dcmi->vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | in dcmi_probe()
1768 video_set_drvdata(dcmi->vdev, dcmi); in dcmi_probe()
1773 q->lock = &dcmi->lock; in dcmi_probe()
1774 q->drv_priv = dcmi; in dcmi_probe()
1788 ret = dcmi_graph_init(dcmi); in dcmi_probe()
1793 ret = reset_control_assert(dcmi->rstc); in dcmi_probe()
1801 ret = reset_control_deassert(dcmi->rstc); in dcmi_probe()
1809 platform_set_drvdata(pdev, dcmi); in dcmi_probe()
1816 video_device_release(dcmi->vdev); in dcmi_probe()
1818 v4l2_device_unregister(&dcmi->v4l2_dev); in dcmi_probe()
1820 dma_release_channel(dcmi->dma_chan); in dcmi_probe()
1827 struct stm32_dcmi *dcmi = platform_get_drvdata(pdev); in dcmi_remove() local
1831 v4l2_async_notifier_unregister(&dcmi->notifier); in dcmi_remove()
1832 v4l2_device_unregister(&dcmi->v4l2_dev); in dcmi_remove()
1834 dma_release_channel(dcmi->dma_chan); in dcmi_remove()
1841 struct stm32_dcmi *dcmi = dev_get_drvdata(dev); in dcmi_runtime_suspend() local
1843 clk_disable_unprepare(dcmi->mclk); in dcmi_runtime_suspend()
1850 struct stm32_dcmi *dcmi = dev_get_drvdata(dev); in dcmi_runtime_resume() local
1853 ret = clk_prepare_enable(dcmi->mclk); in dcmi_runtime_resume()