Lines Matching +full:capture +full:- +full:sd +full:- +full:lines
1 // SPDX-License-Identifier: GPL-2.0+
3 // em28xx-video.c - driver for Empia EM2800/EM2820/2840 USB
4 // video capture devices
38 #include "em28xx-v4l.h"
39 #include <media/v4l2-common.h>
40 #include <media/v4l2-ioctl.h>
41 #include <media/v4l2-event.h>
42 #include <media/drv-intf/msp3400.h>
64 dev_printk(KERN_DEBUG, &dev->intf->dev, \
70 dev_printk(KERN_DEBUG, &dev->intf->dev, \
75 MODULE_DESCRIPTION(DRIVER_DESC " - v4l2 interface");
87 static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
88 static unsigned int vbi_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
89 static unsigned int radio_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
138 struct em28xx_v4l2 *v4l2 = dev->v4l2; in norm_maxw()
140 if (dev->is_webcam) in norm_maxw()
141 return v4l2->sensor_xres; in norm_maxw()
143 if (dev->board.max_range_640_480) in norm_maxw()
151 struct em28xx_v4l2 *v4l2 = dev->v4l2; in norm_maxh()
153 if (dev->is_webcam) in norm_maxh()
154 return v4l2->sensor_yres; in norm_maxh()
156 if (dev->board.max_range_640_480) in norm_maxh()
159 return (v4l2->norm & V4L2_STD_625_50) ? 576 : 480; in norm_maxh()
168 if (dev->is_webcam) in em28xx_vbi_supported()
173 if (dev->chip_id == CHIP_ID_EM2860 || in em28xx_vbi_supported()
174 dev->chip_id == CHIP_ID_EM2883) in em28xx_vbi_supported()
187 struct v4l2_device *v4l2_dev = &dev->v4l2->v4l2_dev; in em28xx_wake_i2c()
191 INPUT(dev->ctl_input)->vmux, 0, 0); in em28xx_wake_i2c()
216 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_set_outfmt()
218 fmt = v4l2->format->reg; in em28xx_set_outfmt()
219 if (!dev->is_em25xx) in em28xx_set_outfmt()
234 ret = em28xx_write_reg(dev, EM28XX_R10_VINMODE, v4l2->vinmode); in em28xx_set_outfmt()
238 vinctrl = v4l2->vinctl; in em28xx_set_outfmt()
243 v4l2->vbi_width / 4); in em28xx_set_outfmt()
244 em28xx_write_reg(dev, EM28XX_R37_VBI_HEIGHT, v4l2->vbi_height); in em28xx_set_outfmt()
245 if (v4l2->norm & V4L2_STD_525_60) { in em28xx_set_outfmt()
248 } else if (v4l2->norm & V4L2_STD_625_50) { in em28xx_set_outfmt()
260 em28xx_videodbg("em28xx Scale: (%d,%d)-(%d,%d)\n", in em28xx_accumulator_set()
277 em28xx_videodbg("capture area set to (%d,%d): %dx%d\n", in em28xx_capture_area_set()
290 if (dev->is_em25xx) { in em28xx_capture_area_set()
301 if (dev->board.is_em2800) { in em28xx_scaler_set()
325 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_resolution_set()
330 v4l2->vbi_width = 720; in em28xx_resolution_set()
331 if (v4l2->norm & V4L2_STD_525_60) in em28xx_resolution_set()
332 v4l2->vbi_height = 12; in em28xx_resolution_set()
334 v4l2->vbi_height = 18; in em28xx_resolution_set()
338 em28xx_accumulator_set(dev, 1, (width - 4) >> 2, 1, (height - 4) >> 2); in em28xx_resolution_set()
342 * with line 20/21 being YUYV encoded instead of being in 8-bit in em28xx_resolution_set()
354 return em28xx_scaler_set(dev, v4l2->hscale, v4l2->vscale); in em28xx_resolution_set()
360 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_set_alternate()
361 struct usb_device *udev = interface_to_usbdev(dev->intf); in em28xx_set_alternate()
364 unsigned int min_pkt_size = v4l2->width * 2 + 4; in em28xx_set_alternate()
370 dev->alt = 0; in em28xx_set_alternate()
371 if (alt > 0 && alt < dev->num_alt) { in em28xx_set_alternate()
372 em28xx_videodbg("alternate forced to %d\n", dev->alt); in em28xx_set_alternate()
373 dev->alt = alt; in em28xx_set_alternate()
376 if (dev->analog_xfer_bulk) in em28xx_set_alternate()
384 if (v4l2->width * 2 * v4l2->height > 720 * 240 * 2) in em28xx_set_alternate()
387 for (i = 0; i < dev->num_alt; i++) { in em28xx_set_alternate()
389 if (dev->alt_max_pkt_size_isoc[i] >= min_pkt_size) { in em28xx_set_alternate()
390 dev->alt = i; in em28xx_set_alternate()
397 } else if (dev->alt_max_pkt_size_isoc[i] > in em28xx_set_alternate()
398 dev->alt_max_pkt_size_isoc[dev->alt]) in em28xx_set_alternate()
399 dev->alt = i; in em28xx_set_alternate()
406 * fails with all urbs having status = -EOVERFLOW ! in em28xx_set_alternate()
408 if (dev->analog_xfer_bulk) { in em28xx_set_alternate()
409 dev->max_pkt_size = 512; /* USB 2.0 spec */ in em28xx_set_alternate()
410 dev->packet_multiplier = EM28XX_BULK_PACKET_MULTIPLIER; in em28xx_set_alternate()
413 min_pkt_size, dev->alt); in em28xx_set_alternate()
414 dev->max_pkt_size = in em28xx_set_alternate()
415 dev->alt_max_pkt_size_isoc[dev->alt]; in em28xx_set_alternate()
416 dev->packet_multiplier = EM28XX_NUM_ISOC_PACKETS; in em28xx_set_alternate()
419 dev->alt, dev->max_pkt_size); in em28xx_set_alternate()
420 err = usb_set_interface(udev, dev->ifnum, dev->alt); in em28xx_set_alternate()
422 dev_err(&dev->intf->dev, in em28xx_set_alternate()
424 dev->alt, err); in em28xx_set_alternate()
440 em28xx_isocdbg("[%p/%d] wakeup\n", buf, buf->top_field); in finish_buffer()
442 buf->vb.sequence = dev->v4l2->field_count++; in finish_buffer()
443 if (dev->v4l2->progressive) in finish_buffer()
444 buf->vb.field = V4L2_FIELD_NONE; in finish_buffer()
446 buf->vb.field = V4L2_FIELD_INTERLACED; in finish_buffer()
447 buf->vb.vb2_buf.timestamp = ktime_get_ns(); in finish_buffer()
449 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE); in finish_buffer()
460 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_copy_video()
463 int bytesperline = v4l2->width << 1; in em28xx_copy_video()
465 if (buf->pos + len > buf->length) in em28xx_copy_video()
466 len = buf->length - buf->pos; in em28xx_copy_video()
471 if (v4l2->progressive || buf->top_field) in em28xx_copy_video()
472 fieldstart = buf->vb_buf; in em28xx_copy_video()
473 else /* interlaced mode, even nr. of lines */ in em28xx_copy_video()
474 fieldstart = buf->vb_buf + bytesperline; in em28xx_copy_video()
476 linesdone = buf->pos / bytesperline; in em28xx_copy_video()
477 currlinedone = buf->pos % bytesperline; in em28xx_copy_video()
479 if (v4l2->progressive) in em28xx_copy_video()
485 lencopy = bytesperline - currlinedone; in em28xx_copy_video()
488 if ((char *)startwrite + lencopy > (char *)buf->vb_buf + buf->length) { in em28xx_copy_video()
490 ((char *)startwrite + lencopy) - in em28xx_copy_video()
491 ((char *)buf->vb_buf + buf->length)); in em28xx_copy_video()
492 remain = (char *)buf->vb_buf + buf->length - in em28xx_copy_video()
500 remain -= lencopy; in em28xx_copy_video()
503 if (v4l2->progressive) in em28xx_copy_video()
513 if ((char *)startwrite + lencopy > (char *)buf->vb_buf + in em28xx_copy_video()
514 buf->length) { in em28xx_copy_video()
516 ((char *)startwrite + lencopy) - in em28xx_copy_video()
517 ((char *)buf->vb_buf + buf->length)); in em28xx_copy_video()
518 remain = (char *)buf->vb_buf + buf->length - in em28xx_copy_video()
527 remain -= lencopy; in em28xx_copy_video()
530 buf->pos += len; in em28xx_copy_video()
543 if (buf->pos + len > buf->length) in em28xx_copy_vbi()
544 len = buf->length - buf->pos; in em28xx_copy_vbi()
546 offset = buf->pos; in em28xx_copy_vbi()
548 if (buf->top_field == 0) in em28xx_copy_vbi()
549 offset += dev->v4l2->vbi_width * dev->v4l2->vbi_height; in em28xx_copy_vbi()
551 memcpy(buf->vb_buf + offset, usb_buf, len); in em28xx_copy_vbi()
552 buf->pos += len; in em28xx_copy_vbi()
561 case -ENOENT: in print_err_status()
564 case -ECONNRESET: in print_err_status()
567 case -ENOSR: in print_err_status()
570 case -EPIPE: in print_err_status()
573 case -EOVERFLOW: in print_err_status()
576 case -EPROTO: in print_err_status()
577 errmsg = "Bit-stuff error (bad cable?)"; in print_err_status()
579 case -EILSEQ: in print_err_status()
582 case -ETIME: in print_err_status()
602 if (list_empty(&dma_q->active)) { in get_next_buf()
608 buf = list_entry(dma_q->active.next, struct em28xx_buffer, list); in get_next_buf()
609 /* Cleans up buffer - Useful for testing for frame/URB loss */ in get_next_buf()
610 list_del(&buf->list); in get_next_buf()
611 buf->pos = 0; in get_next_buf()
612 buf->vb_buf = buf->mem; in get_next_buf()
625 struct em28xx_v4l2 *v4l2 = dev->v4l2; in finish_field_prepare_next()
627 if (v4l2->progressive || v4l2->top_field) { /* Brand new frame */ in finish_field_prepare_next()
633 buf->top_field = v4l2->top_field; in finish_field_prepare_next()
634 buf->pos = 0; in finish_field_prepare_next()
647 struct em28xx_v4l2 *v4l2 = dev->v4l2; in process_frame_data_em28xx()
648 struct em28xx_buffer *buf = dev->usb_ctl.vid_buf; in process_frame_data_em28xx()
649 struct em28xx_buffer *vbi_buf = dev->usb_ctl.vbi_buf; in process_frame_data_em28xx()
650 struct em28xx_dmaqueue *dma_q = &dev->vidq; in process_frame_data_em28xx()
651 struct em28xx_dmaqueue *vbi_dma_q = &dev->vbiq; in process_frame_data_em28xx()
654 * capture type 0 = vbi start in process_frame_data_em28xx()
655 * capture type 1 = vbi in progress in process_frame_data_em28xx()
656 * capture type 2 = video start in process_frame_data_em28xx()
657 * capture type 3 = video in progress in process_frame_data_em28xx()
668 data_len -= 4; in process_frame_data_em28xx()
671 v4l2->capture_type = 0; in process_frame_data_em28xx()
672 v4l2->vbi_read = 0; in process_frame_data_em28xx()
674 v4l2->top_field = !(data_pkt[2] & 1); in process_frame_data_em28xx()
676 data_len -= 4; in process_frame_data_em28xx()
679 v4l2->capture_type = 2; in process_frame_data_em28xx()
681 v4l2->top_field = !(data_pkt[2] & 1); in process_frame_data_em28xx()
683 data_len -= 4; in process_frame_data_em28xx()
691 if (v4l2->capture_type == 0) { in process_frame_data_em28xx()
693 dev->usb_ctl.vbi_buf = vbi_buf; in process_frame_data_em28xx()
694 v4l2->capture_type = 1; in process_frame_data_em28xx()
697 if (v4l2->capture_type == 1) { in process_frame_data_em28xx()
698 int vbi_size = v4l2->vbi_width * v4l2->vbi_height; in process_frame_data_em28xx()
699 int vbi_data_len = ((v4l2->vbi_read + data_len) > vbi_size) ? in process_frame_data_em28xx()
700 (vbi_size - v4l2->vbi_read) : data_len; in process_frame_data_em28xx()
705 v4l2->vbi_read += vbi_data_len; in process_frame_data_em28xx()
709 v4l2->capture_type = 2; in process_frame_data_em28xx()
711 data_len -= vbi_data_len; in process_frame_data_em28xx()
715 if (v4l2->capture_type == 2) { in process_frame_data_em28xx()
717 dev->usb_ctl.vid_buf = buf; in process_frame_data_em28xx()
718 v4l2->capture_type = 3; in process_frame_data_em28xx()
721 if (v4l2->capture_type == 3 && buf && data_len > 0) in process_frame_data_em28xx()
732 struct em28xx_buffer *buf = dev->usb_ctl.vid_buf; in process_frame_data_em25xx()
733 struct em28xx_dmaqueue *dmaq = &dev->vidq; in process_frame_data_em25xx()
734 struct em28xx_v4l2 *v4l2 = dev->v4l2; in process_frame_data_em25xx()
745 v4l2->top_field = !(data_pkt[1] & in process_frame_data_em25xx()
750 data_len -= 2; in process_frame_data_em25xx()
754 if (dev->analog_xfer_bulk && frame_end) { in process_frame_data_em25xx()
756 dev->usb_ctl.vid_buf = buf; in process_frame_data_em25xx()
770 if (!dev->analog_xfer_bulk && frame_end) { in process_frame_data_em25xx()
772 dev->usb_ctl.vid_buf = buf; in process_frame_data_em25xx()
798 if (dev->disconnected) in em28xx_urb_data_copy()
801 if (urb->status < 0) in em28xx_urb_data_copy()
802 print_err_status(dev, -1, urb->status); in em28xx_urb_data_copy()
804 xfer_bulk = usb_pipebulk(urb->pipe); in em28xx_urb_data_copy()
809 num_packets = urb->number_of_packets; in em28xx_urb_data_copy()
813 usb_data_len = urb->actual_length; in em28xx_urb_data_copy()
815 usb_data_pkt = urb->transfer_buffer; in em28xx_urb_data_copy()
817 if (urb->iso_frame_desc[i].status < 0) { in em28xx_urb_data_copy()
819 urb->iso_frame_desc[i].status); in em28xx_urb_data_copy()
820 if (urb->iso_frame_desc[i].status != -EPROTO) in em28xx_urb_data_copy()
824 usb_data_len = urb->iso_frame_desc[i].actual_length; in em28xx_urb_data_copy()
825 if (usb_data_len > dev->max_pkt_size) { in em28xx_urb_data_copy()
830 usb_data_pkt = urb->transfer_buffer + in em28xx_urb_data_copy()
831 urb->iso_frame_desc[i].offset; in em28xx_urb_data_copy()
836 /* em28xx_usbdbg("packet %d is empty",i); - spammy */ in em28xx_urb_data_copy()
840 if (dev->is_em25xx) in em28xx_urb_data_copy()
859 return -1; /* Indicate that device is busy */ in get_resource()
869 if (dev->resources & res_type) { in res_get()
871 return -EBUSY; in res_get()
875 dev->resources |= res_type; in res_get()
884 dev->resources &= ~res_type; in res_free()
894 if (!INPUT(i)->type) in em28xx_v4l2_media_release()
896 media_device_unregister_entity(&dev->input_ent[i]); in em28xx_v4l2_media_release()
908 struct media_device *mdev = dev->media_dev; in em28xx_enable_analog_tuner()
909 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_enable_analog_tuner()
914 if (!mdev || !v4l2->decoder) in em28xx_enable_analog_tuner()
924 list_for_each_entry(link, &v4l2->decoder->links, list) { in em28xx_enable_analog_tuner()
925 if (link->sink->entity == v4l2->decoder) { in em28xx_enable_analog_tuner()
927 if (link->flags & MEDIA_LNK_FL_ENABLED) in em28xx_enable_analog_tuner()
936 source = found_link->source->entity; in em28xx_enable_analog_tuner()
937 list_for_each_entry(link, &source->links, list) { in em28xx_enable_analog_tuner()
941 sink = link->sink->entity; in em28xx_enable_analog_tuner()
943 if (sink == v4l2->decoder) in em28xx_enable_analog_tuner()
948 dev_err(&dev->intf->dev, in em28xx_enable_analog_tuner()
949 "Couldn't change link %s->%s to %s. Error %d\n", in em28xx_enable_analog_tuner()
950 source->name, sink->name, in em28xx_enable_analog_tuner()
956 em28xx_videodbg("link %s->%s was %s\n", in em28xx_enable_analog_tuner()
957 source->name, sink->name, in em28xx_enable_analog_tuner()
966 [EM28XX_VMUX_SVIDEO] = "S-Video",
974 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_v4l2_create_entities()
978 v4l2->video_pad.flags = MEDIA_PAD_FL_SINK; in em28xx_v4l2_create_entities()
979 ret = media_entity_pads_init(&v4l2->vdev.entity, 1, &v4l2->video_pad); in em28xx_v4l2_create_entities()
981 dev_err(&dev->intf->dev, in em28xx_v4l2_create_entities()
985 v4l2->vbi_pad.flags = MEDIA_PAD_FL_SINK; in em28xx_v4l2_create_entities()
986 ret = media_entity_pads_init(&v4l2->vbi_dev.entity, 1, in em28xx_v4l2_create_entities()
987 &v4l2->vbi_pad); in em28xx_v4l2_create_entities()
989 dev_err(&dev->intf->dev, in em28xx_v4l2_create_entities()
994 if (dev->is_webcam) in em28xx_v4l2_create_entities()
999 struct media_entity *ent = &dev->input_ent[i]; in em28xx_v4l2_create_entities()
1001 if (!INPUT(i)->type) in em28xx_v4l2_create_entities()
1004 ent->name = iname[INPUT(i)->type]; in em28xx_v4l2_create_entities()
1005 ent->flags = MEDIA_ENT_FL_CONNECTOR; in em28xx_v4l2_create_entities()
1006 dev->input_pad[i].flags = MEDIA_PAD_FL_SOURCE; in em28xx_v4l2_create_entities()
1008 switch (INPUT(i)->type) { in em28xx_v4l2_create_entities()
1010 ent->function = MEDIA_ENT_F_CONN_COMPOSITE; in em28xx_v4l2_create_entities()
1013 ent->function = MEDIA_ENT_F_CONN_SVIDEO; in em28xx_v4l2_create_entities()
1016 if (dev->tuner_type != TUNER_ABSENT) in em28xx_v4l2_create_entities()
1017 ent->function = MEDIA_ENT_F_CONN_RF; in em28xx_v4l2_create_entities()
1021 ret = media_entity_pads_init(ent, 1, &dev->input_pad[i]); in em28xx_v4l2_create_entities()
1023 dev_err(&dev->intf->dev, in em28xx_v4l2_create_entities()
1026 ret = media_device_register_entity(dev->media_dev, ent); in em28xx_v4l2_create_entities()
1028 dev_err(&dev->intf->dev, in em28xx_v4l2_create_entities()
1043 struct em28xx_v4l2 *v4l2 = dev->v4l2; in queue_setup()
1045 (v4l2->width * v4l2->height * v4l2->format->depth + 7) >> 3; in queue_setup()
1048 return sizes[0] < size ? -EINVAL : 0; in queue_setup()
1061 struct em28xx *dev = vb2_get_drv_priv(vb->vb2_queue); in buffer_prepare()
1062 struct em28xx_v4l2 *v4l2 = dev->v4l2; in buffer_prepare()
1065 em28xx_videodbg("%s, field=%d\n", __func__, vbuf->field); in buffer_prepare()
1067 size = (v4l2->width * v4l2->height * v4l2->format->depth + 7) >> 3; in buffer_prepare()
1072 return -EINVAL; in buffer_prepare()
1082 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_start_analog_streaming()
1089 dev->v4l2->field_count = 0; in em28xx_start_analog_streaming()
1095 rc = res_get(dev, vq->type); in em28xx_start_analog_streaming()
1099 if (v4l2->streaming_users == 0) { in em28xx_start_analog_streaming()
1111 v4l2->capture_type = -1; in em28xx_start_analog_streaming()
1113 dev->analog_xfer_bulk, in em28xx_start_analog_streaming()
1115 dev->max_pkt_size, in em28xx_start_analog_streaming()
1116 dev->packet_multiplier, in em28xx_start_analog_streaming()
1129 f.frequency = v4l2->frequency; in em28xx_start_analog_streaming()
1130 owner = (struct v4l2_fh *)vq->owner; in em28xx_start_analog_streaming()
1131 if (owner && owner->vdev->vfl_type == VFL_TYPE_RADIO) in em28xx_start_analog_streaming()
1135 v4l2_device_call_all(&v4l2->v4l2_dev, in em28xx_start_analog_streaming()
1139 v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_stream, 1); in em28xx_start_analog_streaming()
1142 v4l2->streaming_users++; in em28xx_start_analog_streaming()
1150 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_stop_streaming()
1151 struct em28xx_dmaqueue *vidq = &dev->vidq; in em28xx_stop_streaming()
1156 res_free(dev, vq->type); in em28xx_stop_streaming()
1158 if (v4l2->streaming_users-- == 1) { in em28xx_stop_streaming()
1160 v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_stream, 0); in em28xx_stop_streaming()
1166 spin_lock_irqsave(&dev->slock, flags); in em28xx_stop_streaming()
1167 if (dev->usb_ctl.vid_buf) { in em28xx_stop_streaming()
1168 vb2_buffer_done(&dev->usb_ctl.vid_buf->vb.vb2_buf, in em28xx_stop_streaming()
1170 dev->usb_ctl.vid_buf = NULL; in em28xx_stop_streaming()
1172 while (!list_empty(&vidq->active)) { in em28xx_stop_streaming()
1175 buf = list_entry(vidq->active.next, struct em28xx_buffer, list); in em28xx_stop_streaming()
1176 list_del(&buf->list); in em28xx_stop_streaming()
1177 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); in em28xx_stop_streaming()
1179 spin_unlock_irqrestore(&dev->slock, flags); in em28xx_stop_streaming()
1185 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_stop_vbi_streaming()
1186 struct em28xx_dmaqueue *vbiq = &dev->vbiq; in em28xx_stop_vbi_streaming()
1191 res_free(dev, vq->type); in em28xx_stop_vbi_streaming()
1193 if (v4l2->streaming_users-- == 1) { in em28xx_stop_vbi_streaming()
1195 v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_stream, 0); in em28xx_stop_vbi_streaming()
1201 spin_lock_irqsave(&dev->slock, flags); in em28xx_stop_vbi_streaming()
1202 if (dev->usb_ctl.vbi_buf) { in em28xx_stop_vbi_streaming()
1203 vb2_buffer_done(&dev->usb_ctl.vbi_buf->vb.vb2_buf, in em28xx_stop_vbi_streaming()
1205 dev->usb_ctl.vbi_buf = NULL; in em28xx_stop_vbi_streaming()
1207 while (!list_empty(&vbiq->active)) { in em28xx_stop_vbi_streaming()
1210 buf = list_entry(vbiq->active.next, struct em28xx_buffer, list); in em28xx_stop_vbi_streaming()
1211 list_del(&buf->list); in em28xx_stop_vbi_streaming()
1212 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); in em28xx_stop_vbi_streaming()
1214 spin_unlock_irqrestore(&dev->slock, flags); in em28xx_stop_vbi_streaming()
1221 struct em28xx *dev = vb2_get_drv_priv(vb->vb2_queue); in buffer_queue()
1224 struct em28xx_dmaqueue *vidq = &dev->vidq; in buffer_queue()
1228 buf->mem = vb2_plane_vaddr(vb, 0); in buffer_queue()
1229 buf->length = vb2_plane_size(vb, 0); in buffer_queue()
1231 spin_lock_irqsave(&dev->slock, flags); in buffer_queue()
1232 list_add_tail(&buf->list, &vidq->active); in buffer_queue()
1233 spin_unlock_irqrestore(&dev->slock, flags); in buffer_queue()
1250 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_vb2_setup()
1252 /* Setup Videobuf2 for Video capture */ in em28xx_vb2_setup()
1253 q = &v4l2->vb_vidq; in em28xx_vb2_setup()
1254 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in em28xx_vb2_setup()
1255 q->io_modes = VB2_READ | VB2_MMAP | VB2_USERPTR | VB2_DMABUF; in em28xx_vb2_setup()
1256 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in em28xx_vb2_setup()
1257 q->drv_priv = dev; in em28xx_vb2_setup()
1258 q->buf_struct_size = sizeof(struct em28xx_buffer); in em28xx_vb2_setup()
1259 q->ops = &em28xx_video_qops; in em28xx_vb2_setup()
1260 q->mem_ops = &vb2_vmalloc_memops; in em28xx_vb2_setup()
1266 /* Setup Videobuf2 for VBI capture */ in em28xx_vb2_setup()
1267 q = &v4l2->vb_vbiq; in em28xx_vb2_setup()
1268 q->type = V4L2_BUF_TYPE_VBI_CAPTURE; in em28xx_vb2_setup()
1269 q->io_modes = VB2_READ | VB2_MMAP | VB2_USERPTR; in em28xx_vb2_setup()
1270 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in em28xx_vb2_setup()
1271 q->drv_priv = dev; in em28xx_vb2_setup()
1272 q->buf_struct_size = sizeof(struct em28xx_buffer); in em28xx_vb2_setup()
1273 q->ops = &em28xx_vbi_qops; in em28xx_vb2_setup()
1274 q->mem_ops = &vb2_vmalloc_memops; in em28xx_vb2_setup()
1289 struct v4l2_device *v4l2_dev = &dev->v4l2->v4l2_dev; in video_mux()
1291 dev->ctl_input = index; in video_mux()
1292 dev->ctl_ainput = INPUT(index)->amux; in video_mux()
1293 dev->ctl_aoutput = INPUT(index)->aout; in video_mux()
1295 if (!dev->ctl_aoutput) in video_mux()
1296 dev->ctl_aoutput = EM28XX_AOUT_MASTER; in video_mux()
1299 INPUT(index)->vmux, 0, 0); in video_mux()
1301 if (dev->has_msp34xx) { in video_mux()
1302 if (dev->i2s_speed) { in video_mux()
1304 s_i2s_clock_freq, dev->i2s_speed); in video_mux()
1308 dev->ctl_ainput, in video_mux()
1312 if (dev->board.adecoder != EM28XX_NOADECODER) { in video_mux()
1314 dev->ctl_ainput, dev->ctl_aoutput, 0); in video_mux()
1325 * In the case of non-AC97 volume controls, we still need in em28xx_ctrl_notify()
1330 switch (ctrl->id) { in em28xx_ctrl_notify()
1332 dev->mute = ctrl->val; in em28xx_ctrl_notify()
1336 dev->volume = ctrl->val; in em28xx_ctrl_notify()
1345 container_of(ctrl->handler, struct em28xx_v4l2, ctrl_handler); in em28xx_s_ctrl()
1346 struct em28xx *dev = v4l2->dev; in em28xx_s_ctrl()
1347 int ret = -EINVAL; in em28xx_s_ctrl()
1349 switch (ctrl->id) { in em28xx_s_ctrl()
1351 dev->mute = ctrl->val; in em28xx_s_ctrl()
1355 dev->volume = ctrl->val; in em28xx_s_ctrl()
1359 ret = em28xx_write_reg(dev, EM28XX_R20_YGAIN, ctrl->val); in em28xx_s_ctrl()
1362 ret = em28xx_write_reg(dev, EM28XX_R21_YOFFSET, ctrl->val); in em28xx_s_ctrl()
1365 ret = em28xx_write_reg(dev, EM28XX_R22_UVGAIN, ctrl->val); in em28xx_s_ctrl()
1368 ret = em28xx_write_reg(dev, EM28XX_R23_UOFFSET, ctrl->val); in em28xx_s_ctrl()
1371 ret = em28xx_write_reg(dev, EM28XX_R24_VOFFSET, ctrl->val); in em28xx_s_ctrl()
1374 ret = em28xx_write_reg(dev, EM28XX_R25_SHARPNESS, ctrl->val); in em28xx_s_ctrl()
1392 *hscale = (((unsigned long)maxw) << 12) / width - 4096L; in size_to_scale()
1396 *vscale = (((unsigned long)maxh) << 12) / height - 4096L; in size_to_scale()
1426 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_g_fmt_vid_cap()
1428 f->fmt.pix.width = v4l2->width; in vidioc_g_fmt_vid_cap()
1429 f->fmt.pix.height = v4l2->height; in vidioc_g_fmt_vid_cap()
1430 f->fmt.pix.pixelformat = v4l2->format->fourcc; in vidioc_g_fmt_vid_cap()
1431 f->fmt.pix.bytesperline = (v4l2->width * v4l2->format->depth + 7) >> 3; in vidioc_g_fmt_vid_cap()
1432 f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * v4l2->height; in vidioc_g_fmt_vid_cap()
1433 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in vidioc_g_fmt_vid_cap()
1436 if (v4l2->progressive) in vidioc_g_fmt_vid_cap()
1437 f->fmt.pix.field = V4L2_FIELD_NONE; in vidioc_g_fmt_vid_cap()
1439 f->fmt.pix.field = v4l2->interlaced_fieldmode ? in vidioc_g_fmt_vid_cap()
1459 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_try_fmt_vid_cap()
1460 unsigned int width = f->fmt.pix.width; in vidioc_try_fmt_vid_cap()
1461 unsigned int height = f->fmt.pix.height; in vidioc_try_fmt_vid_cap()
1467 fmt = format_by_fourcc(f->fmt.pix.pixelformat); in vidioc_try_fmt_vid_cap()
1471 f->fmt.pix.pixelformat, fmt->fourcc); in vidioc_try_fmt_vid_cap()
1474 if (dev->board.is_em2800) { in vidioc_try_fmt_vid_cap()
1479 * MaxPacketSize for em2800 is too small to capture at full in vidioc_try_fmt_vid_cap()
1502 f->fmt.pix.width = width; in vidioc_try_fmt_vid_cap()
1503 f->fmt.pix.height = height; in vidioc_try_fmt_vid_cap()
1504 f->fmt.pix.pixelformat = fmt->fourcc; in vidioc_try_fmt_vid_cap()
1505 f->fmt.pix.bytesperline = (width * fmt->depth + 7) >> 3; in vidioc_try_fmt_vid_cap()
1506 f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * height; in vidioc_try_fmt_vid_cap()
1507 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in vidioc_try_fmt_vid_cap()
1508 if (v4l2->progressive) in vidioc_try_fmt_vid_cap()
1509 f->fmt.pix.field = V4L2_FIELD_NONE; in vidioc_try_fmt_vid_cap()
1511 f->fmt.pix.field = v4l2->interlaced_fieldmode ? in vidioc_try_fmt_vid_cap()
1521 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_set_video_format()
1525 return -EINVAL; in em28xx_set_video_format()
1527 v4l2->format = fmt; in em28xx_set_video_format()
1528 v4l2->width = width; in em28xx_set_video_format()
1529 v4l2->height = height; in em28xx_set_video_format()
1532 size_to_scale(dev, v4l2->width, v4l2->height, in em28xx_set_video_format()
1533 &v4l2->hscale, &v4l2->vscale); in em28xx_set_video_format()
1544 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_s_fmt_vid_cap()
1546 if (vb2_is_busy(&v4l2->vb_vidq)) in vidioc_s_fmt_vid_cap()
1547 return -EBUSY; in vidioc_s_fmt_vid_cap()
1551 return em28xx_set_video_format(dev, f->fmt.pix.pixelformat, in vidioc_s_fmt_vid_cap()
1552 f->fmt.pix.width, f->fmt.pix.height); in vidioc_s_fmt_vid_cap()
1559 *norm = dev->v4l2->norm; in vidioc_g_std()
1568 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, video, querystd, norm); in vidioc_querystd()
1576 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_s_std()
1579 if (norm == v4l2->norm) in vidioc_s_std()
1582 if (v4l2->streaming_users > 0) in vidioc_s_std()
1583 return -EBUSY; in vidioc_s_std()
1585 v4l2->norm = norm; in vidioc_s_std()
1593 v4l2->width = f.fmt.pix.width; in vidioc_s_std()
1594 v4l2->height = f.fmt.pix.height; in vidioc_s_std()
1595 size_to_scale(dev, v4l2->width, v4l2->height, in vidioc_s_std()
1596 &v4l2->hscale, &v4l2->vscale); in vidioc_s_std()
1599 v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_std, v4l2->norm); in vidioc_s_std()
1609 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_g_parm()
1612 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && in vidioc_g_parm()
1613 p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) in vidioc_g_parm()
1614 return -EINVAL; in vidioc_g_parm()
1616 p->parm.capture.readbuffers = EM28XX_MIN_BUF; in vidioc_g_parm()
1617 p->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; in vidioc_g_parm()
1618 if (dev->is_webcam) { in vidioc_g_parm()
1619 rc = v4l2_device_call_until_err(&v4l2->v4l2_dev, 0, in vidioc_g_parm()
1622 p->parm.capture.timeperframe = ival.interval; in vidioc_g_parm()
1624 v4l2_video_std_frame_period(v4l2->norm, in vidioc_g_parm()
1625 &p->parm.capture.timeperframe); in vidioc_g_parm()
1637 p->parm.capture.timeperframe in vidioc_s_parm()
1641 if (!dev->is_webcam) in vidioc_s_parm()
1642 return -ENOTTY; in vidioc_s_parm()
1644 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && in vidioc_s_parm()
1645 p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) in vidioc_s_parm()
1646 return -EINVAL; in vidioc_s_parm()
1648 memset(&p->parm, 0, sizeof(p->parm)); in vidioc_s_parm()
1649 p->parm.capture.readbuffers = EM28XX_MIN_BUF; in vidioc_s_parm()
1650 p->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; in vidioc_s_parm()
1651 rc = v4l2_device_call_until_err(&dev->v4l2->v4l2_dev, 0, in vidioc_s_parm()
1654 p->parm.capture.timeperframe = ival.interval; in vidioc_s_parm()
1665 n = i->index; in vidioc_enum_input()
1667 return -EINVAL; in vidioc_enum_input()
1668 if (!INPUT(n)->type) in vidioc_enum_input()
1669 return -EINVAL; in vidioc_enum_input()
1671 i->type = V4L2_INPUT_TYPE_CAMERA; in vidioc_enum_input()
1673 strscpy(i->name, iname[INPUT(n)->type], sizeof(i->name)); in vidioc_enum_input()
1675 if (INPUT(n)->type == EM28XX_VMUX_TELEVISION) in vidioc_enum_input()
1676 i->type = V4L2_INPUT_TYPE_TUNER; in vidioc_enum_input()
1678 i->std = dev->v4l2->vdev.tvnorms; in vidioc_enum_input()
1680 if (dev->is_webcam) in vidioc_enum_input()
1681 i->capabilities = 0; in vidioc_enum_input()
1684 i->audioset = 0; in vidioc_enum_input()
1686 if (dev->amux_map[j] != EM28XX_AMUX_UNUSED) in vidioc_enum_input()
1687 i->audioset |= 1 << j; in vidioc_enum_input()
1696 *i = dev->ctl_input; in vidioc_g_input()
1706 return -EINVAL; in vidioc_s_input()
1707 if (!INPUT(i)->type) in vidioc_s_input()
1708 return -EINVAL; in vidioc_s_input()
1719 unsigned int idx = dev->amux_map[index]; in em28xx_fill_audio_input()
1728 if (dev->has_msp34xx && idx != EM28XX_AMUX_UNUSED) in em28xx_fill_audio_input()
1733 strscpy(a->name, "Television", sizeof(a->name)); in em28xx_fill_audio_input()
1736 strscpy(a->name, "Line In", sizeof(a->name)); in em28xx_fill_audio_input()
1739 strscpy(a->name, "Television alt", sizeof(a->name)); in em28xx_fill_audio_input()
1742 strscpy(a->name, "Phone", sizeof(a->name)); in em28xx_fill_audio_input()
1745 strscpy(a->name, "Mic", sizeof(a->name)); in em28xx_fill_audio_input()
1748 strscpy(a->name, "CD", sizeof(a->name)); in em28xx_fill_audio_input()
1751 strscpy(a->name, "Aux", sizeof(a->name)); in em28xx_fill_audio_input()
1754 strscpy(a->name, "PCM", sizeof(a->name)); in em28xx_fill_audio_input()
1758 return -EINVAL; in em28xx_fill_audio_input()
1760 a->index = index; in em28xx_fill_audio_input()
1761 a->capability = V4L2_AUDCAP_STEREO; in em28xx_fill_audio_input()
1764 s, a->index, a->name); in em28xx_fill_audio_input()
1773 if (a->index >= MAX_EM28XX_INPUT) in vidioc_enumaudio()
1774 return -EINVAL; in vidioc_enumaudio()
1776 return em28xx_fill_audio_input(dev, __func__, a, a->index); in vidioc_enumaudio()
1785 if (dev->ctl_ainput == dev->amux_map[i]) in vidioc_g_audio()
1789 return -EINVAL; in vidioc_g_audio()
1798 if (a->index >= MAX_EM28XX_INPUT) in vidioc_s_audio()
1799 return -EINVAL; in vidioc_s_audio()
1801 idx = dev->amux_map[a->index]; in vidioc_s_audio()
1804 return -EINVAL; in vidioc_s_audio()
1806 dev->ctl_ainput = idx; in vidioc_s_audio()
1816 if (idx == dev->amux_map[i]) in vidioc_s_audio()
1819 return -EINVAL; in vidioc_s_audio()
1821 dev->ctl_aoutput = INPUT(i)->aout; in vidioc_s_audio()
1823 if (!dev->ctl_aoutput) in vidioc_s_audio()
1824 dev->ctl_aoutput = EM28XX_AOUT_MASTER; in vidioc_s_audio()
1827 dev->ctl_ainput); in vidioc_s_audio()
1837 if (t->index != 0) in vidioc_g_tuner()
1838 return -EINVAL; in vidioc_g_tuner()
1840 strscpy(t->name, "Tuner", sizeof(t->name)); in vidioc_g_tuner()
1842 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, g_tuner, t); in vidioc_g_tuner()
1851 if (t->index != 0) in vidioc_s_tuner()
1852 return -EINVAL; in vidioc_s_tuner()
1854 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, s_tuner, t); in vidioc_s_tuner()
1862 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_g_frequency()
1864 if (f->tuner != 0) in vidioc_g_frequency()
1865 return -EINVAL; in vidioc_g_frequency()
1867 f->frequency = v4l2->frequency; in vidioc_g_frequency()
1876 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_s_frequency()
1878 if (f->tuner != 0) in vidioc_s_frequency()
1879 return -EINVAL; in vidioc_s_frequency()
1881 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, s_frequency, f); in vidioc_s_frequency()
1882 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, g_frequency, &new_freq); in vidioc_s_frequency()
1883 v4l2->frequency = new_freq.frequency; in vidioc_s_frequency()
1894 if (chip->match.addr > 1) in vidioc_g_chip_info()
1895 return -EINVAL; in vidioc_g_chip_info()
1896 if (chip->match.addr == 1) in vidioc_g_chip_info()
1897 strscpy(chip->name, "ac97", sizeof(chip->name)); in vidioc_g_chip_info()
1899 strscpy(chip->name, in vidioc_g_chip_info()
1900 dev->v4l2->v4l2_dev.name, sizeof(chip->name)); in vidioc_g_chip_info()
1922 if (reg->match.addr > 1) in vidioc_g_register()
1923 return -EINVAL; in vidioc_g_register()
1924 if (reg->match.addr) { in vidioc_g_register()
1925 ret = em28xx_read_ac97(dev, reg->reg); in vidioc_g_register()
1929 reg->val = ret; in vidioc_g_register()
1930 reg->size = 1; in vidioc_g_register()
1935 reg->size = em28xx_reg_len(reg->reg); in vidioc_g_register()
1936 if (reg->size == 1) { in vidioc_g_register()
1937 ret = em28xx_read_reg(dev, reg->reg); in vidioc_g_register()
1942 reg->val = ret; in vidioc_g_register()
1946 ret = dev->em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS, in vidioc_g_register()
1947 reg->reg, (char *)&val, 2); in vidioc_g_register()
1951 reg->val = le16_to_cpu(val); in vidioc_g_register()
1963 if (reg->match.addr > 1) in vidioc_s_register()
1964 return -EINVAL; in vidioc_s_register()
1965 if (reg->match.addr) in vidioc_s_register()
1966 return em28xx_write_ac97(dev, reg->reg, reg->val); in vidioc_s_register()
1969 buf = cpu_to_le16(reg->val); in vidioc_s_register()
1971 return em28xx_write_regs(dev, reg->reg, (char *)&buf, in vidioc_s_register()
1972 em28xx_reg_len(reg->reg)); in vidioc_s_register()
1980 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_querycap()
1981 struct usb_device *udev = interface_to_usbdev(dev->intf); in vidioc_querycap()
1983 strscpy(cap->driver, "em28xx", sizeof(cap->driver)); in vidioc_querycap()
1984 strscpy(cap->card, em28xx_boards[dev->model].name, sizeof(cap->card)); in vidioc_querycap()
1985 usb_make_path(udev, cap->bus_info, sizeof(cap->bus_info)); in vidioc_querycap()
1987 cap->capabilities = V4L2_CAP_DEVICE_CAPS | V4L2_CAP_READWRITE | in vidioc_querycap()
1989 if (dev->int_audio_type != EM28XX_INT_AUDIO_NONE) in vidioc_querycap()
1990 cap->capabilities |= V4L2_CAP_AUDIO; in vidioc_querycap()
1991 if (dev->tuner_type != TUNER_ABSENT) in vidioc_querycap()
1992 cap->capabilities |= V4L2_CAP_TUNER; in vidioc_querycap()
1993 if (video_is_registered(&v4l2->vbi_dev)) in vidioc_querycap()
1994 cap->capabilities |= V4L2_CAP_VBI_CAPTURE; in vidioc_querycap()
1995 if (video_is_registered(&v4l2->radio_dev)) in vidioc_querycap()
1996 cap->capabilities |= V4L2_CAP_RADIO; in vidioc_querycap()
2003 if (unlikely(f->index >= ARRAY_SIZE(format))) in vidioc_enum_fmt_vid_cap()
2004 return -EINVAL; in vidioc_enum_fmt_vid_cap()
2006 f->pixelformat = format[f->index].fourcc; in vidioc_enum_fmt_vid_cap()
2019 fmt = format_by_fourcc(fsize->pixel_format); in vidioc_enum_framesizes()
2022 fsize->pixel_format); in vidioc_enum_framesizes()
2023 return -EINVAL; in vidioc_enum_framesizes()
2026 if (dev->board.is_em2800) { in vidioc_enum_framesizes()
2027 if (fsize->index > 1) in vidioc_enum_framesizes()
2028 return -EINVAL; in vidioc_enum_framesizes()
2029 fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; in vidioc_enum_framesizes()
2030 fsize->discrete.width = maxw / (1 + fsize->index); in vidioc_enum_framesizes()
2031 fsize->discrete.height = maxh / (1 + fsize->index); in vidioc_enum_framesizes()
2035 if (fsize->index != 0) in vidioc_enum_framesizes()
2036 return -EINVAL; in vidioc_enum_framesizes()
2039 fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; in vidioc_enum_framesizes()
2041 &fsize->stepwise.min_width, &fsize->stepwise.min_height); in vidioc_enum_framesizes()
2042 if (fsize->stepwise.min_width < 48) in vidioc_enum_framesizes()
2043 fsize->stepwise.min_width = 48; in vidioc_enum_framesizes()
2044 if (fsize->stepwise.min_height < 38) in vidioc_enum_framesizes()
2045 fsize->stepwise.min_height = 38; in vidioc_enum_framesizes()
2046 fsize->stepwise.max_width = maxw; in vidioc_enum_framesizes()
2047 fsize->stepwise.max_height = maxh; in vidioc_enum_framesizes()
2048 fsize->stepwise.step_width = 1; in vidioc_enum_framesizes()
2049 fsize->stepwise.step_height = 1; in vidioc_enum_framesizes()
2059 struct em28xx_v4l2 *v4l2 = dev->v4l2; in vidioc_g_fmt_vbi_cap()
2061 format->fmt.vbi.samples_per_line = v4l2->vbi_width; in vidioc_g_fmt_vbi_cap()
2062 format->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY; in vidioc_g_fmt_vbi_cap()
2063 format->fmt.vbi.offset = 0; in vidioc_g_fmt_vbi_cap()
2064 format->fmt.vbi.flags = 0; in vidioc_g_fmt_vbi_cap()
2065 format->fmt.vbi.sampling_rate = 6750000 * 4 / 2; in vidioc_g_fmt_vbi_cap()
2066 format->fmt.vbi.count[0] = v4l2->vbi_height; in vidioc_g_fmt_vbi_cap()
2067 format->fmt.vbi.count[1] = v4l2->vbi_height; in vidioc_g_fmt_vbi_cap()
2068 memset(format->fmt.vbi.reserved, 0, sizeof(format->fmt.vbi.reserved)); in vidioc_g_fmt_vbi_cap()
2071 if (v4l2->norm & V4L2_STD_525_60) { in vidioc_g_fmt_vbi_cap()
2073 format->fmt.vbi.start[0] = 10; in vidioc_g_fmt_vbi_cap()
2074 format->fmt.vbi.start[1] = 273; in vidioc_g_fmt_vbi_cap()
2075 } else if (v4l2->norm & V4L2_STD_625_50) { in vidioc_g_fmt_vbi_cap()
2077 format->fmt.vbi.start[0] = 6; in vidioc_g_fmt_vbi_cap()
2078 format->fmt.vbi.start[1] = 318; in vidioc_g_fmt_vbi_cap()
2093 if (unlikely(t->index > 0)) in radio_g_tuner()
2094 return -EINVAL; in radio_g_tuner()
2096 strscpy(t->name, "Radio", sizeof(t->name)); in radio_g_tuner()
2098 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, g_tuner, t); in radio_g_tuner()
2108 if (t->index != 0) in radio_s_tuner()
2109 return -EINVAL; in radio_s_tuner()
2111 v4l2_device_call_all(&dev->v4l2->v4l2_dev, 0, tuner, s_tuner, t); in radio_s_tuner()
2117 * em28xx_free_v4l2() - Free struct em28xx_v4l2
2127 v4l2->dev->v4l2 = NULL; in em28xx_free_v4l2()
2139 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_v4l2_open()
2143 switch (vdev->vfl_type) { in em28xx_v4l2_open()
2153 return -EINVAL; in em28xx_v4l2_open()
2158 v4l2->users); in em28xx_v4l2_open()
2160 if (mutex_lock_interruptible(&dev->lock)) in em28xx_v4l2_open()
2161 return -ERESTARTSYS; in em28xx_v4l2_open()
2165 dev_err(&dev->intf->dev, in em28xx_v4l2_open()
2168 mutex_unlock(&dev->lock); in em28xx_v4l2_open()
2172 if (v4l2->users == 0) { in em28xx_v4l2_open()
2175 if (vdev->vfl_type != VFL_TYPE_RADIO) in em28xx_v4l2_open()
2185 if (vdev->vfl_type == VFL_TYPE_RADIO) { in em28xx_v4l2_open()
2187 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, s_radio); in em28xx_v4l2_open()
2190 kref_get(&dev->ref); in em28xx_v4l2_open()
2191 kref_get(&v4l2->ref); in em28xx_v4l2_open()
2192 v4l2->users++; in em28xx_v4l2_open()
2194 mutex_unlock(&dev->lock); in em28xx_v4l2_open()
2206 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_v4l2_fini()
2208 if (dev->is_audio_only) { in em28xx_v4l2_fini()
2213 if (!dev->has_video) { in em28xx_v4l2_fini()
2221 dev_info(&dev->intf->dev, "Closing video extension\n"); in em28xx_v4l2_fini()
2223 mutex_lock(&dev->lock); in em28xx_v4l2_fini()
2225 v4l2_device_disconnect(&v4l2->v4l2_dev); in em28xx_v4l2_fini()
2231 if (video_is_registered(&v4l2->radio_dev)) { in em28xx_v4l2_fini()
2232 dev_info(&dev->intf->dev, "V4L2 device %s deregistered\n", in em28xx_v4l2_fini()
2233 video_device_node_name(&v4l2->radio_dev)); in em28xx_v4l2_fini()
2234 video_unregister_device(&v4l2->radio_dev); in em28xx_v4l2_fini()
2236 if (video_is_registered(&v4l2->vbi_dev)) { in em28xx_v4l2_fini()
2237 dev_info(&dev->intf->dev, "V4L2 device %s deregistered\n", in em28xx_v4l2_fini()
2238 video_device_node_name(&v4l2->vbi_dev)); in em28xx_v4l2_fini()
2239 video_unregister_device(&v4l2->vbi_dev); in em28xx_v4l2_fini()
2241 if (video_is_registered(&v4l2->vdev)) { in em28xx_v4l2_fini()
2242 dev_info(&dev->intf->dev, "V4L2 device %s deregistered\n", in em28xx_v4l2_fini()
2243 video_device_node_name(&v4l2->vdev)); in em28xx_v4l2_fini()
2244 video_unregister_device(&v4l2->vdev); in em28xx_v4l2_fini()
2247 v4l2_ctrl_handler_free(&v4l2->ctrl_handler); in em28xx_v4l2_fini()
2248 v4l2_device_unregister(&v4l2->v4l2_dev); in em28xx_v4l2_fini()
2250 kref_put(&v4l2->ref, em28xx_free_v4l2); in em28xx_v4l2_fini()
2252 mutex_unlock(&dev->lock); in em28xx_v4l2_fini()
2254 kref_put(&dev->ref, em28xx_free_device); in em28xx_v4l2_fini()
2261 if (dev->is_audio_only) in em28xx_v4l2_suspend()
2264 if (!dev->has_video) in em28xx_v4l2_suspend()
2267 dev_info(&dev->intf->dev, "Suspending video extension\n"); in em28xx_v4l2_suspend()
2274 if (dev->is_audio_only) in em28xx_v4l2_resume()
2277 if (!dev->has_video) in em28xx_v4l2_resume()
2280 dev_info(&dev->intf->dev, "Resuming video extension\n"); in em28xx_v4l2_resume()
2293 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_v4l2_close()
2294 struct usb_device *udev = interface_to_usbdev(dev->intf); in em28xx_v4l2_close()
2297 em28xx_videodbg("users=%d\n", v4l2->users); in em28xx_v4l2_close()
2300 mutex_lock(&dev->lock); in em28xx_v4l2_close()
2302 if (v4l2->users == 1) { in em28xx_v4l2_close()
2304 if (dev->disconnected) in em28xx_v4l2_close()
2308 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, standby); in em28xx_v4l2_close()
2314 dev->alt = 0; in em28xx_v4l2_close()
2318 dev_err(&dev->intf->dev, in em28xx_v4l2_close()
2325 v4l2->users--; in em28xx_v4l2_close()
2326 kref_put(&v4l2->ref, em28xx_free_v4l2); in em28xx_v4l2_close()
2327 mutex_unlock(&dev->lock); in em28xx_v4l2_close()
2328 kref_put(&dev->ref, em28xx_free_device); in em28xx_v4l2_close()
2448 vfd->v4l2_dev = &dev->v4l2->v4l2_dev; in em28xx_vdev_init()
2449 vfd->lock = &dev->lock; in em28xx_vdev_init()
2450 if (dev->is_webcam) in em28xx_vdev_init()
2451 vfd->tvnorms = 0; in em28xx_vdev_init()
2453 snprintf(vfd->name, sizeof(vfd->name), "%s %s", in em28xx_vdev_init()
2454 dev_name(&dev->intf->dev), type_name); in em28xx_vdev_init()
2461 struct em28xx_v4l2 *v4l2 = dev->v4l2; in em28xx_tuner_setup()
2462 struct v4l2_device *v4l2_dev = &v4l2->v4l2_dev; in em28xx_tuner_setup()
2471 if (dev->board.radio.type) { in em28xx_tuner_setup()
2472 tun_setup.type = dev->board.radio.type; in em28xx_tuner_setup()
2473 tun_setup.addr = dev->board.radio_addr; in em28xx_tuner_setup()
2479 if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type) { in em28xx_tuner_setup()
2480 tun_setup.type = dev->tuner_type; in em28xx_tuner_setup()
2487 if (dev->board.tda9887_conf) { in em28xx_tuner_setup()
2491 tda9887_cfg.priv = &dev->board.tda9887_conf; in em28xx_tuner_setup()
2497 if (dev->tuner_type == TUNER_XC2028) { in em28xx_tuner_setup()
2516 v4l2->frequency = f.frequency; in em28xx_tuner_setup()
2528 if (dev->is_audio_only) { in em28xx_v4l2_init()
2533 if (!dev->has_video) { in em28xx_v4l2_init()
2538 dev_info(&dev->intf->dev, "Registering V4L2 extension\n"); in em28xx_v4l2_init()
2540 mutex_lock(&dev->lock); in em28xx_v4l2_init()
2544 mutex_unlock(&dev->lock); in em28xx_v4l2_init()
2545 return -ENOMEM; in em28xx_v4l2_init()
2547 kref_init(&v4l2->ref); in em28xx_v4l2_init()
2548 v4l2->dev = dev; in em28xx_v4l2_init()
2549 dev->v4l2 = v4l2; in em28xx_v4l2_init()
2552 v4l2->v4l2_dev.mdev = dev->media_dev; in em28xx_v4l2_init()
2554 ret = v4l2_device_register(&dev->intf->dev, &v4l2->v4l2_dev); in em28xx_v4l2_init()
2556 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2561 hdl = &v4l2->ctrl_handler; in em28xx_v4l2_init()
2563 v4l2->v4l2_dev.ctrl_handler = hdl; in em28xx_v4l2_init()
2565 if (dev->is_webcam) in em28xx_v4l2_init()
2566 v4l2->progressive = true; in em28xx_v4l2_init()
2571 v4l2->vinmode = EM28XX_VINMODE_YUV422_CbYCrY; in em28xx_v4l2_init()
2572 v4l2->vinctl = EM28XX_VINCTRL_INTERLACED | in em28xx_v4l2_init()
2577 if (dev->has_msp34xx) in em28xx_v4l2_init()
2578 v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2579 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2582 if (dev->board.decoder == EM28XX_SAA711X) in em28xx_v4l2_init()
2583 v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2584 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2587 if (dev->board.decoder == EM28XX_TVP5150) in em28xx_v4l2_init()
2588 v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2589 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2592 if (dev->board.adecoder == EM28XX_TVAUDIO) in em28xx_v4l2_init()
2593 v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2594 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2595 "tvaudio", dev->board.tvaudio_addr, NULL); in em28xx_v4l2_init()
2599 if (dev->board.tuner_type != TUNER_ABSENT) { in em28xx_v4l2_init()
2600 unsigned short tuner_addr = dev->board.tuner_addr; in em28xx_v4l2_init()
2601 int has_demod = (dev->board.tda9887_conf & TDA9887_PRESENT); in em28xx_v4l2_init()
2603 if (dev->board.radio.type) in em28xx_v4l2_init()
2604 v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2605 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2606 "tuner", dev->board.radio_addr, in em28xx_v4l2_init()
2610 v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2611 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2617 struct v4l2_subdev *sd; in em28xx_v4l2_init() local
2619 sd = v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2620 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2624 if (sd) in em28xx_v4l2_init()
2625 tuner_addr = v4l2_i2c_subdev_addr(sd); in em28xx_v4l2_init()
2627 v4l2_i2c_new_subdev(&v4l2->v4l2_dev, in em28xx_v4l2_init()
2628 &dev->i2c_adap[dev->def_i2c_bus], in em28xx_v4l2_init()
2635 if (dev->em28xx_sensor != EM28XX_NOSENSOR) in em28xx_v4l2_init()
2641 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2642 "%s: Error while setting audio - error [%d]!\n", in em28xx_v4l2_init()
2646 if (dev->audio_mode.ac97 != EM28XX_NO_AC97) { in em28xx_v4l2_init()
2663 INIT_LIST_HEAD(&dev->vidq.active); in em28xx_v4l2_init()
2664 INIT_LIST_HEAD(&dev->vbiq.active); in em28xx_v4l2_init()
2666 if (dev->has_msp34xx) { in em28xx_v4l2_init()
2670 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2671 "%s: em28xx_write_reg - msp34xx(1) failed! error [%d]\n", in em28xx_v4l2_init()
2679 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2680 "%s: em28xx_write_reg - msp34xx(2) failed! error [%d]\n", in em28xx_v4l2_init()
2688 v4l2->norm = V4L2_STD_PAL; in em28xx_v4l2_init()
2689 v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_std, v4l2->norm); in em28xx_v4l2_init()
2690 v4l2->interlaced_fieldmode = EM28XX_INTERLACED_DEFAULT; in em28xx_v4l2_init()
2693 v4l2->format = &format[0]; in em28xx_v4l2_init()
2697 * MaxPacketSize for em2800 is too small to capture at full resolution in em28xx_v4l2_init()
2700 if (dev->board.is_em2800) in em28xx_v4l2_init()
2709 dev->mute = 1; in em28xx_v4l2_init()
2710 dev->volume = 0x1f; in em28xx_v4l2_init()
2733 -0x80, 0x7f, 1, BRIGHTNESS_DEFAULT); in em28xx_v4l2_init()
2741 -0x30, 0x30, 1, BLUE_BALANCE_DEFAULT); in em28xx_v4l2_init()
2745 -0x30, 0x30, 1, RED_BALANCE_DEFAULT); in em28xx_v4l2_init()
2754 ret = hdl->error; in em28xx_v4l2_init()
2759 em28xx_vdev_init(dev, &v4l2->vdev, &em28xx_video_template, "video"); in em28xx_v4l2_init()
2760 mutex_init(&v4l2->vb_queue_lock); in em28xx_v4l2_init()
2761 mutex_init(&v4l2->vb_vbi_queue_lock); in em28xx_v4l2_init()
2762 v4l2->vdev.queue = &v4l2->vb_vidq; in em28xx_v4l2_init()
2763 v4l2->vdev.queue->lock = &v4l2->vb_queue_lock; in em28xx_v4l2_init()
2764 v4l2->vdev.device_caps = V4L2_CAP_READWRITE | V4L2_CAP_VIDEO_CAPTURE | in em28xx_v4l2_init()
2766 if (dev->int_audio_type != EM28XX_INT_AUDIO_NONE) in em28xx_v4l2_init()
2767 v4l2->vdev.device_caps |= V4L2_CAP_AUDIO; in em28xx_v4l2_init()
2768 if (dev->tuner_type != TUNER_ABSENT) in em28xx_v4l2_init()
2769 v4l2->vdev.device_caps |= V4L2_CAP_TUNER; in em28xx_v4l2_init()
2773 if (dev->is_webcam) { in em28xx_v4l2_init()
2774 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_QUERYSTD); in em28xx_v4l2_init()
2775 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_STD); in em28xx_v4l2_init()
2776 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_STD); in em28xx_v4l2_init()
2778 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_PARM); in em28xx_v4l2_init()
2780 if (dev->tuner_type == TUNER_ABSENT) { in em28xx_v4l2_init()
2781 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_TUNER); in em28xx_v4l2_init()
2782 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_TUNER); in em28xx_v4l2_init()
2783 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_FREQUENCY); in em28xx_v4l2_init()
2784 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_FREQUENCY); in em28xx_v4l2_init()
2786 if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) { in em28xx_v4l2_init()
2787 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_AUDIO); in em28xx_v4l2_init()
2788 v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_AUDIO); in em28xx_v4l2_init()
2792 ret = video_register_device(&v4l2->vdev, VFL_TYPE_VIDEO, in em28xx_v4l2_init()
2793 video_nr[dev->devno]); in em28xx_v4l2_init()
2795 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2802 em28xx_vdev_init(dev, &v4l2->vbi_dev, &em28xx_video_template, in em28xx_v4l2_init()
2805 v4l2->vbi_dev.queue = &v4l2->vb_vbiq; in em28xx_v4l2_init()
2806 v4l2->vbi_dev.queue->lock = &v4l2->vb_vbi_queue_lock; in em28xx_v4l2_init()
2807 v4l2->vbi_dev.device_caps = V4L2_CAP_STREAMING | in em28xx_v4l2_init()
2809 if (dev->tuner_type != TUNER_ABSENT) in em28xx_v4l2_init()
2810 v4l2->vbi_dev.device_caps |= V4L2_CAP_TUNER; in em28xx_v4l2_init()
2813 v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_PARM); in em28xx_v4l2_init()
2814 if (dev->tuner_type == TUNER_ABSENT) { in em28xx_v4l2_init()
2815 v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_G_TUNER); in em28xx_v4l2_init()
2816 v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_TUNER); in em28xx_v4l2_init()
2817 v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_G_FREQUENCY); in em28xx_v4l2_init()
2818 v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_FREQUENCY); in em28xx_v4l2_init()
2820 if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) { in em28xx_v4l2_init()
2821 v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_G_AUDIO); in em28xx_v4l2_init()
2822 v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_AUDIO); in em28xx_v4l2_init()
2826 ret = video_register_device(&v4l2->vbi_dev, VFL_TYPE_VBI, in em28xx_v4l2_init()
2827 vbi_nr[dev->devno]); in em28xx_v4l2_init()
2829 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2835 if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) { in em28xx_v4l2_init()
2836 em28xx_vdev_init(dev, &v4l2->radio_dev, &em28xx_radio_template, in em28xx_v4l2_init()
2838 v4l2->radio_dev.device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER; in em28xx_v4l2_init()
2839 ret = video_register_device(&v4l2->radio_dev, VFL_TYPE_RADIO, in em28xx_v4l2_init()
2840 radio_nr[dev->devno]); in em28xx_v4l2_init()
2842 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2846 dev_info(&dev->intf->dev, in em28xx_v4l2_init()
2848 video_device_node_name(&v4l2->radio_dev)); in em28xx_v4l2_init()
2855 ret = v4l2_mc_create_media_graph(dev->media_dev); in em28xx_v4l2_init()
2857 dev_err(&dev->intf->dev, in em28xx_v4l2_init()
2864 dev_info(&dev->intf->dev, in em28xx_v4l2_init()
2866 video_device_node_name(&v4l2->vdev)); in em28xx_v4l2_init()
2868 if (video_is_registered(&v4l2->vbi_dev)) in em28xx_v4l2_init()
2869 dev_info(&dev->intf->dev, in em28xx_v4l2_init()
2871 video_device_node_name(&v4l2->vbi_dev)); in em28xx_v4l2_init()
2874 v4l2_device_call_all(&v4l2->v4l2_dev, 0, tuner, standby); in em28xx_v4l2_init()
2879 dev_info(&dev->intf->dev, in em28xx_v4l2_init()
2882 kref_get(&dev->ref); in em28xx_v4l2_init()
2884 mutex_unlock(&dev->lock); in em28xx_v4l2_init()
2888 if (video_is_registered(&v4l2->radio_dev)) { in em28xx_v4l2_init()
2889 dev_info(&dev->intf->dev, in em28xx_v4l2_init()
2891 video_device_node_name(&v4l2->radio_dev)); in em28xx_v4l2_init()
2892 video_unregister_device(&v4l2->radio_dev); in em28xx_v4l2_init()
2894 if (video_is_registered(&v4l2->vbi_dev)) { in em28xx_v4l2_init()
2895 dev_info(&dev->intf->dev, in em28xx_v4l2_init()
2897 video_device_node_name(&v4l2->vbi_dev)); in em28xx_v4l2_init()
2898 video_unregister_device(&v4l2->vbi_dev); in em28xx_v4l2_init()
2900 if (video_is_registered(&v4l2->vdev)) { in em28xx_v4l2_init()
2901 dev_info(&dev->intf->dev, in em28xx_v4l2_init()
2903 video_device_node_name(&v4l2->vdev)); in em28xx_v4l2_init()
2904 video_unregister_device(&v4l2->vdev); in em28xx_v4l2_init()
2907 v4l2_ctrl_handler_free(&v4l2->ctrl_handler); in em28xx_v4l2_init()
2908 v4l2_device_unregister(&v4l2->v4l2_dev); in em28xx_v4l2_init()
2910 dev->v4l2 = NULL; in em28xx_v4l2_init()
2911 kref_put(&v4l2->ref, em28xx_free_v4l2); in em28xx_v4l2_init()
2912 mutex_unlock(&dev->lock); in em28xx_v4l2_init()