Lines Matching +full:capture +full:- +full:sd +full:- +full:lines

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2008-2009 Texas Instruments Inc
5 * Driver name : VPFE Capture driver
6 * VPFE Capture driver allows applications to capture and stream video
14 * YUV data through an in-built analog encoder or Digital LCD port. This
15 * driver is for capture through VPFE. A typical EVM using these SoCs have
19 * MT9T001) --> Raw Bayer RGB ---> MUX -> VPFE (CCDC/ISIF)
33 * does very little or no processing on YUV data and does pre-process Raw
40 * - MMAP IO
41 * - Capture using TVP5146 over BT.656
42 * - support for interfacing decoders using sub device model
43 * - Work with DM355 or DM6446 CCDC to do Raw Bayer RGB/YUV
44 * data capture to SDRAM.
46 * - Support multiple REQBUF after open
47 * - Support for de-allocating buffers through REQBUF
48 * - Support for Raw Bayer RGB capture
49 * - Support for chaining Image Processor
50 * - Support for static allocation of buffers
51 * - Support for USERPTR IO
52 * - Support for STREAMON before QBUF
53 * - Support for control ioctls
60 #include <media/v4l2-common.h>
75 MODULE_PARM_DESC(debug, "Debug level 0-1");
77 MODULE_DESCRIPTION("VPFE Video for Linux Capture Driver");
87 /* 0 - progressive, 1 - interlaced */
164 * register with vpfe capture
169 printk(KERN_NOTICE "vpfe_register_ccdc_device: %s\n", dev->name); in vpfe_register_ccdc_device()
171 if (!dev->hw_ops.open || in vpfe_register_ccdc_device()
172 !dev->hw_ops.enable || in vpfe_register_ccdc_device()
173 !dev->hw_ops.set_hw_if_params || in vpfe_register_ccdc_device()
174 !dev->hw_ops.configure || in vpfe_register_ccdc_device()
175 !dev->hw_ops.set_buftype || in vpfe_register_ccdc_device()
176 !dev->hw_ops.get_buftype || in vpfe_register_ccdc_device()
177 !dev->hw_ops.enum_pix || in vpfe_register_ccdc_device()
178 !dev->hw_ops.set_frame_format || in vpfe_register_ccdc_device()
179 !dev->hw_ops.get_frame_format || in vpfe_register_ccdc_device()
180 !dev->hw_ops.get_pixel_format || in vpfe_register_ccdc_device()
181 !dev->hw_ops.set_pixel_format || in vpfe_register_ccdc_device()
182 !dev->hw_ops.set_image_window || in vpfe_register_ccdc_device()
183 !dev->hw_ops.get_image_window || in vpfe_register_ccdc_device()
184 !dev->hw_ops.get_line_length || in vpfe_register_ccdc_device()
185 !dev->hw_ops.getfid) in vpfe_register_ccdc_device()
186 return -EINVAL; in vpfe_register_ccdc_device()
195 printk(KERN_ERR "vpfe capture not initialized\n"); in vpfe_register_ccdc_device()
196 ret = -EFAULT; in vpfe_register_ccdc_device()
200 if (strcmp(dev->name, ccdc_cfg->name)) { in vpfe_register_ccdc_device()
202 ret = -EINVAL; in vpfe_register_ccdc_device()
208 ret = -EINVAL; in vpfe_register_ccdc_device()
221 * unregister with vpfe capture
230 printk(KERN_NOTICE "vpfe_unregister_ccdc_device, dev->name = %s\n", in vpfe_unregister_ccdc_device()
231 dev->name); in vpfe_unregister_ccdc_device()
233 if (strcmp(dev->name, ccdc_cfg->name)) { in vpfe_unregister_ccdc_device()
246 * For a pix format, configure ccdc to setup the capture
253 if (ccdc_dev->hw_ops.set_pixel_format( in vpfe_config_ccdc_image_format()
254 vpfe_dev->fmt.fmt.pix.pixelformat) < 0) { in vpfe_config_ccdc_image_format()
255 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_config_ccdc_image_format()
257 return -EINVAL; in vpfe_config_ccdc_image_format()
260 ccdc_dev->hw_ops.set_image_window(&vpfe_dev->crop); in vpfe_config_ccdc_image_format()
262 switch (vpfe_dev->fmt.fmt.pix.field) { in vpfe_config_ccdc_image_format()
265 ret = ccdc_dev->hw_ops.set_buftype( in vpfe_config_ccdc_image_format()
273 ret = ccdc_dev->hw_ops.set_buftype( in vpfe_config_ccdc_image_format()
277 return -EINVAL; in vpfe_config_ccdc_image_format()
282 ret = ccdc_dev->hw_ops.set_frame_format(frm_fmt); in vpfe_config_ccdc_image_format()
298 struct vpfe_subdev_info *sdinfo = vpfe_dev->current_subdev; in vpfe_config_image_format()
303 struct v4l2_pix_format *pix = &vpfe_dev->fmt.fmt.pix; in vpfe_config_image_format()
308 vpfe_dev->std_info.active_pixels = in vpfe_config_image_format()
310 vpfe_dev->std_info.active_lines = in vpfe_config_image_format()
312 vpfe_dev->std_info.frame_format = in vpfe_config_image_format()
314 vpfe_dev->std_index = i; in vpfe_config_image_format()
320 v4l2_err(&vpfe_dev->v4l2_dev, "standard not supported\n"); in vpfe_config_image_format()
321 return -EINVAL; in vpfe_config_image_format()
324 vpfe_dev->crop.top = 0; in vpfe_config_image_format()
325 vpfe_dev->crop.left = 0; in vpfe_config_image_format()
326 vpfe_dev->crop.width = vpfe_dev->std_info.active_pixels; in vpfe_config_image_format()
327 vpfe_dev->crop.height = vpfe_dev->std_info.active_lines; in vpfe_config_image_format()
328 pix->width = vpfe_dev->crop.width; in vpfe_config_image_format()
329 pix->height = vpfe_dev->crop.height; in vpfe_config_image_format()
332 if (vpfe_dev->std_info.frame_format) { in vpfe_config_image_format()
333 pix->field = V4L2_FIELD_INTERLACED; in vpfe_config_image_format()
335 pix->pixelformat = V4L2_PIX_FMT_UYVY; in vpfe_config_image_format()
339 pix->field = V4L2_FIELD_NONE; in vpfe_config_image_format()
341 pix->pixelformat = V4L2_PIX_FMT_SBGGR8; in vpfe_config_image_format()
347 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, in vpfe_config_image_format()
348 sdinfo->grp_id, pad, get_fmt, NULL, &fmt); in vpfe_config_image_format()
350 if (ret && ret != -ENOIOCTLCMD) { in vpfe_config_image_format()
351 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_config_image_format()
356 pix->bytesperline = pix->width * 2; in vpfe_config_image_format()
357 pix->sizeimage = pix->bytesperline * pix->height; in vpfe_config_image_format()
365 pix->bytesperline = ccdc_dev->hw_ops.get_line_length(); in vpfe_config_image_format()
366 pix->sizeimage = pix->bytesperline * pix->height; in vpfe_config_image_format()
376 vpfe_dev->current_input = 0; in vpfe_initialize_device()
379 vpfe_dev->std_index = 0; in vpfe_initialize_device()
383 vpfe_standards[vpfe_dev->std_index].std_id); in vpfe_initialize_device()
390 v4l2_err(&vpfe_dev->v4l2_dev, "ccdc device not registered\n"); in vpfe_initialize_device()
391 ret = -ENODEV; in vpfe_initialize_device()
395 if (!try_module_get(ccdc_dev->owner)) { in vpfe_initialize_device()
396 v4l2_err(&vpfe_dev->v4l2_dev, "Couldn't lock ccdc module\n"); in vpfe_initialize_device()
397 ret = -ENODEV; in vpfe_initialize_device()
400 ret = ccdc_dev->hw_ops.open(vpfe_dev->pdev); in vpfe_initialize_device()
402 vpfe_dev->initialized = 1; in vpfe_initialize_device()
405 if (vpfe_dev->cfg->clr_intr) in vpfe_initialize_device()
406 vpfe_dev->cfg->clr_intr(-1); in vpfe_initialize_device()
423 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_open\n"); in vpfe_open()
425 if (!vpfe_dev->cfg->num_subdevs) { in vpfe_open()
426 v4l2_err(&vpfe_dev->v4l2_dev, "No decoder registered\n"); in vpfe_open()
427 return -ENODEV; in vpfe_open()
433 return -ENOMEM; in vpfe_open()
436 file->private_data = fh; in vpfe_open()
437 fh->vpfe_dev = vpfe_dev; in vpfe_open()
438 v4l2_fh_init(&fh->fh, vdev); in vpfe_open()
439 mutex_lock(&vpfe_dev->lock); in vpfe_open()
441 if (!vpfe_dev->initialized) { in vpfe_open()
443 mutex_unlock(&vpfe_dev->lock); in vpfe_open()
444 v4l2_fh_exit(&fh->fh); in vpfe_open()
446 return -ENODEV; in vpfe_open()
450 vpfe_dev->usrs++; in vpfe_open()
452 fh->io_allowed = 0; in vpfe_open()
453 v4l2_fh_add(&fh->fh); in vpfe_open()
454 mutex_unlock(&vpfe_dev->lock); in vpfe_open()
462 vpfe_dev->next_frm = list_entry(vpfe_dev->dma_queue.next, in vpfe_schedule_next_buffer()
464 list_del(&vpfe_dev->next_frm->queue); in vpfe_schedule_next_buffer()
465 vpfe_dev->next_frm->state = VIDEOBUF_ACTIVE; in vpfe_schedule_next_buffer()
466 addr = videobuf_to_dma_contig(vpfe_dev->next_frm); in vpfe_schedule_next_buffer()
468 ccdc_dev->hw_ops.setfbaddr(addr); in vpfe_schedule_next_buffer()
475 addr = videobuf_to_dma_contig(vpfe_dev->cur_frm); in vpfe_schedule_bottom_field()
476 addr += vpfe_dev->field_off; in vpfe_schedule_bottom_field()
477 ccdc_dev->hw_ops.setfbaddr(addr); in vpfe_schedule_bottom_field()
482 vpfe_dev->cur_frm->ts = ktime_get_ns(); in vpfe_process_buffer_complete()
483 vpfe_dev->cur_frm->state = VIDEOBUF_DONE; in vpfe_process_buffer_complete()
484 vpfe_dev->cur_frm->size = vpfe_dev->fmt.fmt.pix.sizeimage; in vpfe_process_buffer_complete()
485 wake_up_interruptible(&vpfe_dev->cur_frm->done); in vpfe_process_buffer_complete()
486 vpfe_dev->cur_frm = vpfe_dev->next_frm; in vpfe_process_buffer_complete()
496 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nStarting vpfe_isr...\n"); in vpfe_isr()
497 field = vpfe_dev->fmt.fmt.pix.field; in vpfe_isr()
500 if (!vpfe_dev->started) in vpfe_isr()
504 if (ccdc_dev->hw_ops.reset) in vpfe_isr()
505 ccdc_dev->hw_ops.reset(); in vpfe_isr()
508 /* handle progressive frame capture */ in vpfe_isr()
509 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, in vpfe_isr()
511 if (vpfe_dev->cur_frm != vpfe_dev->next_frm) in vpfe_isr()
516 /* interlaced or TB capture check which field we are in hardware */ in vpfe_isr()
517 fid = ccdc_dev->hw_ops.getfid(); in vpfe_isr()
520 vpfe_dev->field_id ^= 1; in vpfe_isr()
521 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "field id = %x:%x.\n", in vpfe_isr()
522 fid, vpfe_dev->field_id); in vpfe_isr()
523 if (fid == vpfe_dev->field_id) { in vpfe_isr()
524 /* we are in-sync here,continue */ in vpfe_isr()
530 if (vpfe_dev->cur_frm != vpfe_dev->next_frm) in vpfe_isr()
547 spin_lock(&vpfe_dev->dma_queue_lock); in vpfe_isr()
548 if (!list_empty(&vpfe_dev->dma_queue) && in vpfe_isr()
549 vpfe_dev->cur_frm == vpfe_dev->next_frm) in vpfe_isr()
551 spin_unlock(&vpfe_dev->dma_queue_lock); in vpfe_isr()
554 * out of sync. Recover from any hardware out-of-sync. in vpfe_isr()
557 vpfe_dev->field_id = fid; in vpfe_isr()
560 if (vpfe_dev->cfg->clr_intr) in vpfe_isr()
561 vpfe_dev->cfg->clr_intr(irq); in vpfe_isr()
566 /* vdint1_isr - isr handler for VINT1 interrupt */
571 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "\nInside vdint1_isr...\n"); in vdint1_isr()
574 if (!vpfe_dev->started) { in vdint1_isr()
575 if (vpfe_dev->cfg->clr_intr) in vdint1_isr()
576 vpfe_dev->cfg->clr_intr(irq); in vdint1_isr()
580 spin_lock(&vpfe_dev->dma_queue_lock); in vdint1_isr()
581 if ((vpfe_dev->fmt.fmt.pix.field == V4L2_FIELD_NONE) && in vdint1_isr()
582 !list_empty(&vpfe_dev->dma_queue) && in vdint1_isr()
583 vpfe_dev->cur_frm == vpfe_dev->next_frm) in vdint1_isr()
585 spin_unlock(&vpfe_dev->dma_queue_lock); in vdint1_isr()
587 if (vpfe_dev->cfg->clr_intr) in vdint1_isr()
588 vpfe_dev->cfg->clr_intr(irq); in vdint1_isr()
597 frame_format = ccdc_dev->hw_ops.get_frame_format(); in vpfe_detach_irq()
599 free_irq(vpfe_dev->ccdc_irq1, vpfe_dev); in vpfe_detach_irq()
606 frame_format = ccdc_dev->hw_ops.get_frame_format(); in vpfe_attach_irq()
608 return request_irq(vpfe_dev->ccdc_irq1, vdint1_isr, in vpfe_attach_irq()
618 vpfe_dev->started = 0; in vpfe_stop_ccdc_capture()
619 ccdc_dev->hw_ops.enable(0); in vpfe_stop_ccdc_capture()
620 if (ccdc_dev->hw_ops.enable_out_to_sdram) in vpfe_stop_ccdc_capture()
621 ccdc_dev->hw_ops.enable_out_to_sdram(0); in vpfe_stop_ccdc_capture()
631 struct vpfe_fh *fh = file->private_data; in vpfe_release()
635 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_release\n"); in vpfe_release()
638 mutex_lock(&vpfe_dev->lock); in vpfe_release()
640 if (fh->io_allowed) { in vpfe_release()
641 if (vpfe_dev->started) { in vpfe_release()
642 sdinfo = vpfe_dev->current_subdev; in vpfe_release()
643 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, in vpfe_release()
644 sdinfo->grp_id, in vpfe_release()
646 if (ret && (ret != -ENOIOCTLCMD)) in vpfe_release()
647 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_release()
651 videobuf_streamoff(&vpfe_dev->buffer_queue); in vpfe_release()
653 vpfe_dev->io_usrs = 0; in vpfe_release()
654 vpfe_dev->numbuffers = config_params.numbuffers; in vpfe_release()
655 videobuf_stop(&vpfe_dev->buffer_queue); in vpfe_release()
656 videobuf_mmap_free(&vpfe_dev->buffer_queue); in vpfe_release()
660 vpfe_dev->usrs--; in vpfe_release()
661 v4l2_fh_del(&fh->fh); in vpfe_release()
662 v4l2_fh_exit(&fh->fh); in vpfe_release()
664 if (!vpfe_dev->usrs) { in vpfe_release()
665 vpfe_dev->initialized = 0; in vpfe_release()
666 if (ccdc_dev->hw_ops.close) in vpfe_release()
667 ccdc_dev->hw_ops.close(vpfe_dev->pdev); in vpfe_release()
668 module_put(ccdc_dev->owner); in vpfe_release()
670 mutex_unlock(&vpfe_dev->lock); in vpfe_release()
671 file->private_data = NULL; in vpfe_release()
686 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_mmap\n"); in vpfe_mmap()
688 return videobuf_mmap_mapper(&vpfe_dev->buffer_queue, vma); in vpfe_mmap()
698 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_poll\n"); in vpfe_poll()
700 if (vpfe_dev->started) in vpfe_poll()
702 &vpfe_dev->buffer_queue, wait); in vpfe_poll()
706 /* vpfe capture driver file operations */
720 * Following algorithm used :-
727 * Minimum height is 2 lines for interlaced or tb field and 1 line for
728 * progressive. Maximum height is clamped to active active lines of scan
742 vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat); in vpfe_check_format()
748 pixfmt->pixelformat = vpfe_dev->fmt.fmt.pix.pixelformat; in vpfe_check_format()
749 vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat); in vpfe_check_format()
755 while (ccdc_dev->hw_ops.enum_pix(&pix, temp) >= 0) { in vpfe_check_format()
756 if (vpfe_pix_fmt->pixelformat == pix) { in vpfe_check_format()
765 pixfmt->pixelformat = vpfe_dev->fmt.fmt.pix.pixelformat; in vpfe_check_format()
770 vpfe_pix_fmt = vpfe_lookup_pix_format(pixfmt->pixelformat); in vpfe_check_format()
774 if (pixfmt->field == V4L2_FIELD_ANY) { in vpfe_check_format()
776 pixfmt->field = vpfe_dev->fmt.fmt.pix.field; in vpfe_check_format()
783 if (vpfe_dev->fmt.fmt.pix.field != pixfmt->field) { in vpfe_check_format()
788 switch (pixfmt->field) { in vpfe_check_format()
792 if (!vpfe_dev->std_info.frame_format) in vpfe_check_format()
793 pixfmt->field = V4L2_FIELD_NONE; in vpfe_check_format()
796 if (vpfe_dev->std_info.frame_format) in vpfe_check_format()
797 pixfmt->field = V4L2_FIELD_INTERLACED; in vpfe_check_format()
802 pixfmt->field = vpfe_dev->fmt.fmt.pix.field; in vpfe_check_format()
808 if (pixfmt->field == V4L2_FIELD_INTERLACED || in vpfe_check_format()
809 pixfmt->field == V4L2_FIELD_SEQ_TB) in vpfe_check_format()
812 max_width = vpfe_dev->std_info.active_pixels; in vpfe_check_format()
813 max_height = vpfe_dev->std_info.active_lines; in vpfe_check_format()
814 min_width /= vpfe_pix_fmt->bpp; in vpfe_check_format()
816 v4l2_info(&vpfe_dev->v4l2_dev, "width = %d, height = %d, bpp = %d\n", in vpfe_check_format()
817 pixfmt->width, pixfmt->height, vpfe_pix_fmt->bpp); in vpfe_check_format()
819 pixfmt->width = clamp((pixfmt->width), min_width, max_width); in vpfe_check_format()
820 pixfmt->height = clamp((pixfmt->height), min_height, max_height); in vpfe_check_format()
823 if (pixfmt->field == V4L2_FIELD_INTERLACED) in vpfe_check_format()
824 pixfmt->height &= (~1); in vpfe_check_format()
829 pixfmt->bytesperline = (((pixfmt->width * vpfe_pix_fmt->bpp) + 31) in vpfe_check_format()
831 if (pixfmt->pixelformat == V4L2_PIX_FMT_NV12) in vpfe_check_format()
832 pixfmt->sizeimage = in vpfe_check_format()
833 pixfmt->bytesperline * pixfmt->height + in vpfe_check_format()
834 ((pixfmt->bytesperline * pixfmt->height) >> 1); in vpfe_check_format()
836 pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height; in vpfe_check_format()
838 …v4l2_info(&vpfe_dev->v4l2_dev, "adjusted width = %d, height = %d, bpp = %d, bytesperline = %d, siz… in vpfe_check_format()
839 pixfmt->width, pixfmt->height, vpfe_pix_fmt->bpp, in vpfe_check_format()
840 pixfmt->bytesperline, pixfmt->sizeimage); in vpfe_check_format()
849 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querycap\n"); in vpfe_querycap()
851 strscpy(cap->driver, CAPTURE_DRV_NAME, sizeof(cap->driver)); in vpfe_querycap()
852 strscpy(cap->bus_info, "VPFE", sizeof(cap->bus_info)); in vpfe_querycap()
853 strscpy(cap->card, vpfe_dev->cfg->card_name, sizeof(cap->card)); in vpfe_querycap()
862 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_fmt_vid_cap\n"); in vpfe_g_fmt_vid_cap()
864 *fmt = vpfe_dev->fmt; in vpfe_g_fmt_vid_cap()
875 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_fmt_vid_cap\n"); in vpfe_enum_fmt_vid_cap()
877 if (ccdc_dev->hw_ops.enum_pix(&pix, fmt->index) < 0) in vpfe_enum_fmt_vid_cap()
878 return -EINVAL; in vpfe_enum_fmt_vid_cap()
883 fmt->pixelformat = pix_fmt->pixelformat; in vpfe_enum_fmt_vid_cap()
886 return -EINVAL; in vpfe_enum_fmt_vid_cap()
896 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_fmt_vid_cap\n"); in vpfe_s_fmt_vid_cap()
899 if (vpfe_dev->started) { in vpfe_s_fmt_vid_cap()
900 v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is started\n"); in vpfe_s_fmt_vid_cap()
901 return -EBUSY; in vpfe_s_fmt_vid_cap()
905 pix_fmts = vpfe_check_format(vpfe_dev, &fmt->fmt.pix); in vpfe_s_fmt_vid_cap()
907 return -EINVAL; in vpfe_s_fmt_vid_cap()
910 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_s_fmt_vid_cap()
916 vpfe_dev->fmt = *fmt; in vpfe_s_fmt_vid_cap()
917 /* set image capture parameters in the ccdc */ in vpfe_s_fmt_vid_cap()
919 mutex_unlock(&vpfe_dev->lock); in vpfe_s_fmt_vid_cap()
929 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_try_fmt_vid_cap\n"); in vpfe_try_fmt_vid_cap()
931 pix_fmts = vpfe_check_format(vpfe_dev, &f->fmt.pix); in vpfe_try_fmt_vid_cap()
933 return -EINVAL; in vpfe_try_fmt_vid_cap()
938 * vpfe_get_subdev_input_index - Get subdev index and subdev input index for a
946 struct vpfe_config *cfg = vpfe_dev->cfg; in vpfe_get_subdev_input_index()
950 for (i = 0; i < cfg->num_subdevs; i++) { in vpfe_get_subdev_input_index()
951 sdinfo = &cfg->sub_devs[i]; in vpfe_get_subdev_input_index()
952 if (app_input_index < (j + sdinfo->num_inputs)) { in vpfe_get_subdev_input_index()
954 *subdev_input_index = app_input_index - j; in vpfe_get_subdev_input_index()
957 j += sdinfo->num_inputs; in vpfe_get_subdev_input_index()
959 return -EINVAL; in vpfe_get_subdev_input_index()
963 * vpfe_get_app_input - Get app input index for a given subdev input index
970 struct vpfe_config *cfg = vpfe_dev->cfg; in vpfe_get_app_input_index()
974 for (i = 0; i < cfg->num_subdevs; i++) { in vpfe_get_app_input_index()
975 sdinfo = &cfg->sub_devs[i]; in vpfe_get_app_input_index()
976 if (!strcmp(sdinfo->name, vpfe_dev->current_subdev->name)) { in vpfe_get_app_input_index()
977 if (vpfe_dev->current_input >= sdinfo->num_inputs) in vpfe_get_app_input_index()
978 return -1; in vpfe_get_app_input_index()
979 *app_input_index = j + vpfe_dev->current_input; in vpfe_get_app_input_index()
982 j += sdinfo->num_inputs; in vpfe_get_app_input_index()
984 return -EINVAL; in vpfe_get_app_input_index()
994 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_input\n"); in vpfe_enum_input()
999 inp->index) < 0) { in vpfe_enum_input()
1000 v4l2_err(&vpfe_dev->v4l2_dev, "input information not found for the subdev\n"); in vpfe_enum_input()
1001 return -EINVAL; in vpfe_enum_input()
1003 sdinfo = &vpfe_dev->cfg->sub_devs[subdev]; in vpfe_enum_input()
1004 *inp = sdinfo->inputs[index]; in vpfe_enum_input()
1012 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_input\n"); in vpfe_g_input()
1021 struct v4l2_subdev *sd; in vpfe_s_input() local
1028 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_input\n"); in vpfe_s_input()
1030 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_s_input()
1038 if (vpfe_dev->started) { in vpfe_s_input()
1039 v4l2_err(&vpfe_dev->v4l2_dev, "Streaming is on\n"); in vpfe_s_input()
1040 ret = -EBUSY; in vpfe_s_input()
1048 v4l2_err(&vpfe_dev->v4l2_dev, "invalid input index\n"); in vpfe_s_input()
1052 sdinfo = &vpfe_dev->cfg->sub_devs[subdev_index]; in vpfe_s_input()
1053 sd = vpfe_dev->sd[subdev_index]; in vpfe_s_input()
1054 route = &sdinfo->routes[inp_index]; in vpfe_s_input()
1055 if (route && sdinfo->can_route) { in vpfe_s_input()
1056 input = route->input; in vpfe_s_input()
1057 output = route->output; in vpfe_s_input()
1063 if (sd) in vpfe_s_input()
1064 ret = v4l2_subdev_call(sd, video, s_routing, input, output, 0); in vpfe_s_input()
1067 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_s_input()
1069 ret = -EINVAL; in vpfe_s_input()
1072 vpfe_dev->current_subdev = sdinfo; in vpfe_s_input()
1073 if (sd) in vpfe_s_input()
1074 vpfe_dev->v4l2_dev.ctrl_handler = sd->ctrl_handler; in vpfe_s_input()
1075 vpfe_dev->current_input = index; in vpfe_s_input()
1076 vpfe_dev->std_index = 0; in vpfe_s_input()
1079 ret = ccdc_dev->hw_ops.set_hw_if_params(&sdinfo->ccdc_if_params); in vpfe_s_input()
1085 vpfe_standards[vpfe_dev->std_index].std_id); in vpfe_s_input()
1087 mutex_unlock(&vpfe_dev->lock); in vpfe_s_input()
1097 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querystd\n"); in vpfe_querystd()
1099 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_querystd()
1100 sdinfo = vpfe_dev->current_subdev; in vpfe_querystd()
1104 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, in vpfe_querystd()
1106 mutex_unlock(&vpfe_dev->lock); in vpfe_querystd()
1116 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_std\n"); in vpfe_s_std()
1119 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_s_std()
1123 sdinfo = vpfe_dev->current_subdev; in vpfe_s_std()
1125 if (vpfe_dev->started) { in vpfe_s_std()
1126 v4l2_err(&vpfe_dev->v4l2_dev, "streaming is started\n"); in vpfe_s_std()
1127 ret = -EBUSY; in vpfe_s_std()
1131 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, in vpfe_s_std()
1134 v4l2_err(&vpfe_dev->v4l2_dev, "Failed to set standard\n"); in vpfe_s_std()
1140 mutex_unlock(&vpfe_dev->lock); in vpfe_s_std()
1148 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_std\n"); in vpfe_g_std()
1150 *std_id = vpfe_standards[vpfe_dev->std_index].std_id; in vpfe_g_std()
1160 struct vpfe_fh *fh = vq->priv_data; in vpfe_videobuf_setup()
1161 struct vpfe_device *vpfe_dev = fh->vpfe_dev; in vpfe_videobuf_setup()
1163 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_setup\n"); in vpfe_videobuf_setup()
1164 *size = vpfe_dev->fmt.fmt.pix.sizeimage; in vpfe_videobuf_setup()
1165 if (vpfe_dev->memory == V4L2_MEMORY_MMAP && in vpfe_videobuf_setup()
1166 vpfe_dev->fmt.fmt.pix.sizeimage > config_params.device_bufsize) in vpfe_videobuf_setup()
1171 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, in vpfe_videobuf_setup()
1180 struct vpfe_fh *fh = vq->priv_data; in vpfe_videobuf_prepare()
1181 struct vpfe_device *vpfe_dev = fh->vpfe_dev; in vpfe_videobuf_prepare()
1185 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_prepare\n"); in vpfe_videobuf_prepare()
1188 if (VIDEOBUF_NEEDS_INIT == vb->state) { in vpfe_videobuf_prepare()
1189 vb->width = vpfe_dev->fmt.fmt.pix.width; in vpfe_videobuf_prepare()
1190 vb->height = vpfe_dev->fmt.fmt.pix.height; in vpfe_videobuf_prepare()
1191 vb->size = vpfe_dev->fmt.fmt.pix.sizeimage; in vpfe_videobuf_prepare()
1192 vb->field = field; in vpfe_videobuf_prepare()
1201 return -EINVAL; in vpfe_videobuf_prepare()
1203 vb->state = VIDEOBUF_PREPARED; in vpfe_videobuf_prepare()
1212 struct vpfe_fh *fh = vq->priv_data; in vpfe_videobuf_queue()
1213 struct vpfe_device *vpfe_dev = fh->vpfe_dev; in vpfe_videobuf_queue()
1216 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_buffer_queue\n"); in vpfe_videobuf_queue()
1219 spin_lock_irqsave(&vpfe_dev->dma_queue_lock, flags); in vpfe_videobuf_queue()
1220 list_add_tail(&vb->queue, &vpfe_dev->dma_queue); in vpfe_videobuf_queue()
1221 spin_unlock_irqrestore(&vpfe_dev->dma_queue_lock, flags); in vpfe_videobuf_queue()
1224 vb->state = VIDEOBUF_QUEUED; in vpfe_videobuf_queue()
1230 struct vpfe_fh *fh = vq->priv_data; in vpfe_videobuf_release()
1231 struct vpfe_device *vpfe_dev = fh->vpfe_dev; in vpfe_videobuf_release()
1234 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_videobuf_release\n"); in vpfe_videobuf_release()
1238 * they are de-allocated in vpfe_videobuf_release()
1240 spin_lock_irqsave(&vpfe_dev->dma_queue_lock, flags); in vpfe_videobuf_release()
1241 INIT_LIST_HEAD(&vpfe_dev->dma_queue); in vpfe_videobuf_release()
1242 spin_unlock_irqrestore(&vpfe_dev->dma_queue_lock, flags); in vpfe_videobuf_release()
1244 vb->state = VIDEOBUF_NEEDS_INIT; in vpfe_videobuf_release()
1262 struct vpfe_fh *fh = file->private_data; in vpfe_reqbufs()
1265 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_reqbufs\n"); in vpfe_reqbufs()
1267 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != req_buf->type) { in vpfe_reqbufs()
1268 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buffer type\n"); in vpfe_reqbufs()
1269 return -EINVAL; in vpfe_reqbufs()
1272 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_reqbufs()
1276 if (vpfe_dev->io_usrs != 0) { in vpfe_reqbufs()
1277 v4l2_err(&vpfe_dev->v4l2_dev, "Only one IO user allowed\n"); in vpfe_reqbufs()
1278 ret = -EBUSY; in vpfe_reqbufs()
1282 vpfe_dev->memory = req_buf->memory; in vpfe_reqbufs()
1283 videobuf_queue_dma_contig_init(&vpfe_dev->buffer_queue, in vpfe_reqbufs()
1285 vpfe_dev->pdev, in vpfe_reqbufs()
1286 &vpfe_dev->irqlock, in vpfe_reqbufs()
1287 req_buf->type, in vpfe_reqbufs()
1288 vpfe_dev->fmt.fmt.pix.field, in vpfe_reqbufs()
1292 fh->io_allowed = 1; in vpfe_reqbufs()
1293 vpfe_dev->io_usrs = 1; in vpfe_reqbufs()
1294 INIT_LIST_HEAD(&vpfe_dev->dma_queue); in vpfe_reqbufs()
1295 ret = videobuf_reqbufs(&vpfe_dev->buffer_queue, req_buf); in vpfe_reqbufs()
1297 mutex_unlock(&vpfe_dev->lock); in vpfe_reqbufs()
1306 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_querybuf\n"); in vpfe_querybuf()
1308 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type) { in vpfe_querybuf()
1309 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); in vpfe_querybuf()
1310 return -EINVAL; in vpfe_querybuf()
1313 if (vpfe_dev->memory != V4L2_MEMORY_MMAP) { in vpfe_querybuf()
1314 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid memory\n"); in vpfe_querybuf()
1315 return -EINVAL; in vpfe_querybuf()
1318 return videobuf_querybuf(&vpfe_dev->buffer_queue, buf); in vpfe_querybuf()
1325 struct vpfe_fh *fh = file->private_data; in vpfe_qbuf()
1327 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_qbuf\n"); in vpfe_qbuf()
1329 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != p->type) { in vpfe_qbuf()
1330 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); in vpfe_qbuf()
1331 return -EINVAL; in vpfe_qbuf()
1338 if (!fh->io_allowed) { in vpfe_qbuf()
1339 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n"); in vpfe_qbuf()
1340 return -EACCES; in vpfe_qbuf()
1342 return videobuf_qbuf(&vpfe_dev->buffer_queue, p); in vpfe_qbuf()
1350 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_dqbuf\n"); in vpfe_dqbuf()
1352 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != buf->type) { in vpfe_dqbuf()
1353 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); in vpfe_dqbuf()
1354 return -EINVAL; in vpfe_dqbuf()
1356 return videobuf_dqbuf(&vpfe_dev->buffer_queue, in vpfe_dqbuf()
1357 buf, file->f_flags & O_NONBLOCK); in vpfe_dqbuf()
1368 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_calculate_offsets\n"); in vpfe_calculate_offsets()
1370 ccdc_dev->hw_ops.get_image_window(&image_win); in vpfe_calculate_offsets()
1371 vpfe_dev->field_off = image_win.height * image_win.width; in vpfe_calculate_offsets()
1377 ccdc_dev->hw_ops.enable(1); in vpfe_start_ccdc_capture()
1378 if (ccdc_dev->hw_ops.enable_out_to_sdram) in vpfe_start_ccdc_capture()
1379 ccdc_dev->hw_ops.enable_out_to_sdram(1); in vpfe_start_ccdc_capture()
1380 vpfe_dev->started = 1; in vpfe_start_ccdc_capture()
1392 struct vpfe_fh *fh = file->private_data; in vpfe_streamon()
1397 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamon\n"); in vpfe_streamon()
1400 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); in vpfe_streamon()
1401 return -EINVAL; in vpfe_streamon()
1405 if (!fh->io_allowed) { in vpfe_streamon()
1406 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n"); in vpfe_streamon()
1407 return -EACCES; in vpfe_streamon()
1410 sdinfo = vpfe_dev->current_subdev; in vpfe_streamon()
1411 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, in vpfe_streamon()
1414 if (ret && (ret != -ENOIOCTLCMD)) { in vpfe_streamon()
1415 v4l2_err(&vpfe_dev->v4l2_dev, "stream on failed in subdev\n"); in vpfe_streamon()
1416 return -EINVAL; in vpfe_streamon()
1420 if (list_empty(&vpfe_dev->buffer_queue.stream)) { in vpfe_streamon()
1421 v4l2_err(&vpfe_dev->v4l2_dev, "buffer queue is empty\n"); in vpfe_streamon()
1422 return -EIO; in vpfe_streamon()
1426 ret = videobuf_streamon(&vpfe_dev->buffer_queue); in vpfe_streamon()
1431 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_streamon()
1435 vpfe_dev->next_frm = list_entry(vpfe_dev->dma_queue.next, in vpfe_streamon()
1437 vpfe_dev->cur_frm = vpfe_dev->next_frm; in vpfe_streamon()
1439 list_del(&vpfe_dev->cur_frm->queue); in vpfe_streamon()
1441 vpfe_dev->cur_frm->state = VIDEOBUF_ACTIVE; in vpfe_streamon()
1443 vpfe_dev->field_id = 0; in vpfe_streamon()
1444 addr = videobuf_to_dma_contig(vpfe_dev->cur_frm); in vpfe_streamon()
1450 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_streamon()
1452 ret = -EFAULT; in vpfe_streamon()
1455 if (ccdc_dev->hw_ops.configure() < 0) { in vpfe_streamon()
1456 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_streamon()
1458 ret = -EINVAL; in vpfe_streamon()
1461 ccdc_dev->hw_ops.setfbaddr((unsigned long)(addr)); in vpfe_streamon()
1463 mutex_unlock(&vpfe_dev->lock); in vpfe_streamon()
1466 mutex_unlock(&vpfe_dev->lock); in vpfe_streamon()
1468 videobuf_streamoff(&vpfe_dev->buffer_queue); in vpfe_streamon()
1476 struct vpfe_fh *fh = file->private_data; in vpfe_streamoff()
1480 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_streamoff\n"); in vpfe_streamoff()
1483 v4l2_err(&vpfe_dev->v4l2_dev, "Invalid buf type\n"); in vpfe_streamoff()
1484 return -EINVAL; in vpfe_streamoff()
1488 if (!fh->io_allowed) { in vpfe_streamoff()
1489 v4l2_err(&vpfe_dev->v4l2_dev, "fh->io_allowed\n"); in vpfe_streamoff()
1490 return -EACCES; in vpfe_streamoff()
1494 if (!vpfe_dev->started) { in vpfe_streamoff()
1495 v4l2_err(&vpfe_dev->v4l2_dev, "device started\n"); in vpfe_streamoff()
1496 return -EINVAL; in vpfe_streamoff()
1499 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_streamoff()
1506 sdinfo = vpfe_dev->current_subdev; in vpfe_streamoff()
1507 ret = v4l2_device_call_until_err(&vpfe_dev->v4l2_dev, sdinfo->grp_id, in vpfe_streamoff()
1510 if (ret && (ret != -ENOIOCTLCMD)) in vpfe_streamoff()
1511 v4l2_err(&vpfe_dev->v4l2_dev, "stream off failed in subdev\n"); in vpfe_streamoff()
1512 ret = videobuf_streamoff(&vpfe_dev->buffer_queue); in vpfe_streamoff()
1513 mutex_unlock(&vpfe_dev->lock); in vpfe_streamoff()
1522 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_pixelaspect\n"); in vpfe_g_pixelaspect()
1525 return -EINVAL; in vpfe_g_pixelaspect()
1527 if (vpfe_dev->std_index >= ARRAY_SIZE(vpfe_standards)) in vpfe_g_pixelaspect()
1530 *f = vpfe_standards[vpfe_dev->std_index].pixelaspect; in vpfe_g_pixelaspect()
1539 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_g_selection\n"); in vpfe_g_selection()
1541 if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in vpfe_g_selection()
1542 return -EINVAL; in vpfe_g_selection()
1544 switch (sel->target) { in vpfe_g_selection()
1546 sel->r = vpfe_dev->crop; in vpfe_g_selection()
1550 sel->r.width = vpfe_standards[vpfe_dev->std_index].width; in vpfe_g_selection()
1551 sel->r.height = vpfe_standards[vpfe_dev->std_index].height; in vpfe_g_selection()
1554 return -EINVAL; in vpfe_g_selection()
1563 struct v4l2_rect rect = sel->r; in vpfe_s_selection()
1566 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_selection\n"); in vpfe_s_selection()
1568 if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || in vpfe_s_selection()
1569 sel->target != V4L2_SEL_TGT_CROP) in vpfe_s_selection()
1570 return -EINVAL; in vpfe_s_selection()
1572 if (vpfe_dev->started) { in vpfe_s_selection()
1574 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_s_selection()
1576 return -EBUSY; in vpfe_s_selection()
1579 ret = mutex_lock_interruptible(&vpfe_dev->lock); in vpfe_s_selection()
1584 v4l2_err(&vpfe_dev->v4l2_dev, in vpfe_s_selection()
1586 ret = -EINVAL; in vpfe_s_selection()
1595 vpfe_dev->std_info.active_pixels) || in vpfe_s_selection()
1597 vpfe_dev->std_info.active_lines)) { in vpfe_s_selection()
1598 v4l2_err(&vpfe_dev->v4l2_dev, "Error in S_SELECTION params\n"); in vpfe_s_selection()
1599 ret = -EINVAL; in vpfe_s_selection()
1602 ccdc_dev->hw_ops.set_image_window(&rect); in vpfe_s_selection()
1603 vpfe_dev->fmt.fmt.pix.width = rect.width; in vpfe_s_selection()
1604 vpfe_dev->fmt.fmt.pix.height = rect.height; in vpfe_s_selection()
1605 vpfe_dev->fmt.fmt.pix.bytesperline = in vpfe_s_selection()
1606 ccdc_dev->hw_ops.get_line_length(); in vpfe_s_selection()
1607 vpfe_dev->fmt.fmt.pix.sizeimage = in vpfe_s_selection()
1608 vpfe_dev->fmt.fmt.pix.bytesperline * in vpfe_s_selection()
1609 vpfe_dev->fmt.fmt.pix.height; in vpfe_s_selection()
1610 vpfe_dev->crop = rect; in vpfe_s_selection()
1611 sel->r = rect; in vpfe_s_selection()
1613 mutex_unlock(&vpfe_dev->lock); in vpfe_s_selection()
1617 /* vpfe capture ioctl operations */
1688 v4l2_err(pdev->dev.driver, in vpfe_probe()
1690 return -ENOMEM; in vpfe_probe()
1693 vpfe_dev->pdev = &pdev->dev; in vpfe_probe()
1695 if (!pdev->dev.platform_data) { in vpfe_probe()
1696 v4l2_err(pdev->dev.driver, "Unable to get vpfe config\n"); in vpfe_probe()
1697 ret = -ENODEV; in vpfe_probe()
1701 vpfe_cfg = pdev->dev.platform_data; in vpfe_probe()
1702 vpfe_dev->cfg = vpfe_cfg; in vpfe_probe()
1703 if (!vpfe_cfg->ccdc || !vpfe_cfg->card_name || !vpfe_cfg->sub_devs) { in vpfe_probe()
1704 v4l2_err(pdev->dev.driver, "null ptr in vpfe_cfg\n"); in vpfe_probe()
1705 ret = -ENOENT; in vpfe_probe()
1712 ret = -ENOMEM; in vpfe_probe()
1718 strscpy(ccdc_cfg->name, vpfe_cfg->ccdc, sizeof(ccdc_cfg->name)); in vpfe_probe()
1722 v4l2_err(pdev->dev.driver, in vpfe_probe()
1724 ret = -ENODEV; in vpfe_probe()
1727 vpfe_dev->ccdc_irq0 = res1->start; in vpfe_probe()
1732 v4l2_err(pdev->dev.driver, in vpfe_probe()
1734 ret = -ENODEV; in vpfe_probe()
1737 vpfe_dev->ccdc_irq1 = res1->start; in vpfe_probe()
1739 ret = request_irq(vpfe_dev->ccdc_irq0, vpfe_isr, 0, in vpfe_probe()
1743 v4l2_err(pdev->dev.driver, "Unable to request interrupt\n"); in vpfe_probe()
1747 vfd = &vpfe_dev->video_dev; in vpfe_probe()
1749 vfd->release = video_device_release_empty; in vpfe_probe()
1750 vfd->fops = &vpfe_fops; in vpfe_probe()
1751 vfd->ioctl_ops = &vpfe_ioctl_ops; in vpfe_probe()
1752 vfd->tvnorms = 0; in vpfe_probe()
1753 vfd->v4l2_dev = &vpfe_dev->v4l2_dev; in vpfe_probe()
1754 vfd->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; in vpfe_probe()
1755 snprintf(vfd->name, sizeof(vfd->name), in vpfe_probe()
1762 ret = v4l2_device_register(&pdev->dev, &vpfe_dev->v4l2_dev); in vpfe_probe()
1764 v4l2_err(pdev->dev.driver, in vpfe_probe()
1768 v4l2_info(&vpfe_dev->v4l2_dev, "v4l2 device registered\n"); in vpfe_probe()
1769 spin_lock_init(&vpfe_dev->irqlock); in vpfe_probe()
1770 spin_lock_init(&vpfe_dev->dma_queue_lock); in vpfe_probe()
1771 mutex_init(&vpfe_dev->lock); in vpfe_probe()
1774 vpfe_dev->numbuffers = config_params.numbuffers; in vpfe_probe()
1777 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, in vpfe_probe()
1779 v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, in vpfe_probe()
1780 "video_dev=%p\n", &vpfe_dev->video_dev); in vpfe_probe()
1781 vpfe_dev->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in vpfe_probe()
1782 ret = video_register_device(&vpfe_dev->video_dev, in vpfe_probe()
1783 VFL_TYPE_VIDEO, -1); in vpfe_probe()
1786 v4l2_err(pdev->dev.driver, in vpfe_probe()
1791 v4l2_info(&vpfe_dev->v4l2_dev, "video device registered\n"); in vpfe_probe()
1795 video_set_drvdata(&vpfe_dev->video_dev, vpfe_dev); in vpfe_probe()
1796 i2c_adap = i2c_get_adapter(vpfe_cfg->i2c_adapter_id); in vpfe_probe()
1797 num_subdevs = vpfe_cfg->num_subdevs; in vpfe_probe()
1798 vpfe_dev->sd = kmalloc_array(num_subdevs, in vpfe_probe()
1799 sizeof(*vpfe_dev->sd), in vpfe_probe()
1801 if (!vpfe_dev->sd) { in vpfe_probe()
1802 ret = -ENOMEM; in vpfe_probe()
1809 sdinfo = &vpfe_cfg->sub_devs[i]; in vpfe_probe()
1812 vpfe_dev->sd[i] = in vpfe_probe()
1813 v4l2_i2c_new_subdev_board(&vpfe_dev->v4l2_dev, in vpfe_probe()
1815 &sdinfo->board_info, in vpfe_probe()
1817 if (vpfe_dev->sd[i]) { in vpfe_probe()
1818 v4l2_info(&vpfe_dev->v4l2_dev, in vpfe_probe()
1820 sdinfo->name); in vpfe_probe()
1821 vpfe_dev->sd[i]->grp_id = sdinfo->grp_id; in vpfe_probe()
1823 for (j = 0; j < sdinfo->num_inputs; j++) { in vpfe_probe()
1824 inps = &sdinfo->inputs[j]; in vpfe_probe()
1825 vfd->tvnorms |= inps->std; in vpfe_probe()
1828 v4l2_info(&vpfe_dev->v4l2_dev, in vpfe_probe()
1830 sdinfo->name); in vpfe_probe()
1831 ret = -ENXIO; in vpfe_probe()
1837 vpfe_dev->current_subdev = &vpfe_cfg->sub_devs[0]; in vpfe_probe()
1838 vpfe_dev->v4l2_dev.ctrl_handler = vpfe_dev->sd[0]->ctrl_handler; in vpfe_probe()
1845 kfree(vpfe_dev->sd); in vpfe_probe()
1847 video_unregister_device(&vpfe_dev->video_dev); in vpfe_probe()
1849 v4l2_device_unregister(&vpfe_dev->v4l2_dev); in vpfe_probe()
1851 free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); in vpfe_probe()
1861 * vpfe_remove : It un-register device from V4L2 driver
1867 v4l2_info(pdev->dev.driver, "vpfe_remove\n"); in vpfe_remove()
1869 free_irq(vpfe_dev->ccdc_irq0, vpfe_dev); in vpfe_remove()
1870 kfree(vpfe_dev->sd); in vpfe_remove()
1871 v4l2_device_unregister(&vpfe_dev->v4l2_dev); in vpfe_remove()
1872 video_unregister_device(&vpfe_dev->video_dev); in vpfe_remove()