Lines Matching +full:frame +full:- +full:buffer

2  * usbvision-core.c - driver for NT100x USB video capture devices
5 * Copyright (c) 1999-2005 Joerg Heckenbach <joerg@heckenbach-aw.de>
41 #include <media/v4l2-common.h>
56 /* To help people with Black and White output with using s-video input.
60 MODULE_PARM_DESC(switch_svideo_input, " Set the S-Video input. Some cables and input device are wi…
62 static unsigned int adjust_x_offset = -1;
66 static unsigned int adjust_y_offset = -1;
98 * is too slow. Larger buffers are memory-consuming and take longer
102 #define DEFAULT_SCRATCH_BUF_SIZE (0x20000) /* 128kB memory scratch buffer */
135 size -= PAGE_SIZE; in usbvision_rvmalloc()
154 size -= PAGE_SIZE; in usbvision_rvfree()
167 for (i = k = 0; len > 0; i++, len--) { in usbvision_hexdump()
180 * scratch ring buffer handling
182 …en(struct usb_usbvision *usbvision) /* This returns the amount of data actually in the buffer */ in scratch_len()
184 int len = usbvision->scratch_write_ptr - usbvision->scratch_read_ptr; in scratch_len()
194 /* This returns the free space left in the buffer */
197 int free = usbvision->scratch_read_ptr - usbvision->scratch_write_ptr; in scratch_free()
201 free -= 1; /* at least one byte in the buffer must */ in scratch_free()
210 /* This puts data into the buffer */
216 if (usbvision->scratch_write_ptr + len < scratch_buf_size) { in scratch_put()
217 memcpy(usbvision->scratch + usbvision->scratch_write_ptr, data, len); in scratch_put()
218 usbvision->scratch_write_ptr += len; in scratch_put()
220 len_part = scratch_buf_size - usbvision->scratch_write_ptr; in scratch_put()
221 memcpy(usbvision->scratch + usbvision->scratch_write_ptr, data, len_part); in scratch_put()
223 usbvision->scratch_write_ptr = 0; /* just set write_ptr to zero */ in scratch_put()
225 memcpy(usbvision->scratch, data + len_part, len - len_part); in scratch_put()
226 usbvision->scratch_write_ptr = len - len_part; in scratch_put()
230 PDEBUG(DBG_SCRATCH, "len=%d, new write_ptr=%d\n", len, usbvision->scratch_write_ptr); in scratch_put()
235 /* This marks the write_ptr as position of new frame header */
238 PDEBUG(DBG_SCRATCH, "header at write_ptr=%d\n", usbvision->scratch_headermarker_write_ptr); in scratch_mark_header()
240 usbvision->scratch_headermarker[usbvision->scratch_headermarker_write_ptr] = in scratch_mark_header()
241 usbvision->scratch_write_ptr; in scratch_mark_header()
242 usbvision->scratch_headermarker_write_ptr += 1; in scratch_mark_header()
243 usbvision->scratch_headermarker_write_ptr %= USBVISION_NUM_HEADERMARKER; in scratch_mark_header()
246 /* This gets data from the buffer at the given "ptr" position */
253 memcpy(data, usbvision->scratch + *ptr, len); in scratch_get_extra()
256 len_part = scratch_buf_size - *ptr; in scratch_get_extra()
257 memcpy(data, usbvision->scratch + *ptr, len_part); in scratch_get_extra()
261 memcpy(data + len_part, usbvision->scratch, len - len_part); in scratch_get_extra()
262 *ptr = len - len_part; in scratch_get_extra()
276 *ptr = (usbvision->scratch_read_ptr + len) % scratch_buf_size; in scratch_set_extra_ptr()
291 /* This gets data from the buffer */
297 if (usbvision->scratch_read_ptr + len < scratch_buf_size) { in scratch_get()
298 memcpy(data, usbvision->scratch + usbvision->scratch_read_ptr, len); in scratch_get()
299 usbvision->scratch_read_ptr += len; in scratch_get()
301 len_part = scratch_buf_size - usbvision->scratch_read_ptr; in scratch_get()
302 memcpy(data, usbvision->scratch + usbvision->scratch_read_ptr, len_part); in scratch_get()
304 usbvision->scratch_read_ptr = 0; /* just set the read_ptr to zero */ in scratch_get()
306 memcpy(data + len_part, usbvision->scratch, len - len_part); in scratch_get()
307 usbvision->scratch_read_ptr = len - len_part; in scratch_get()
311 PDEBUG(DBG_SCRATCH, "len=%d, new read_ptr=%d\n", len, usbvision->scratch_read_ptr); in scratch_get()
323 PDEBUG(DBG_SCRATCH, "from read_ptr=%d", usbvision->scratch_headermarker_read_ptr); in scratch_get_header()
325 while (usbvision->scratch_headermarker_write_ptr - in scratch_get_header()
326 usbvision->scratch_headermarker_read_ptr != 0) { in scratch_get_header()
327 usbvision->scratch_read_ptr = in scratch_get_header()
328 usbvision->scratch_headermarker[usbvision->scratch_headermarker_read_ptr]; in scratch_get_header()
329 usbvision->scratch_headermarker_read_ptr += 1; in scratch_get_header()
330 usbvision->scratch_headermarker_read_ptr %= USBVISION_NUM_HEADERMARKER; in scratch_get_header()
332 if ((header->magic_1 == USBVISION_MAGIC_1) in scratch_get_header()
333 && (header->magic_2 == USBVISION_MAGIC_2) in scratch_get_header()
334 && (header->header_length == USBVISION_HEADER_LENGTH)) { in scratch_get_header()
336 header->frame_width = header->frame_width_lo + (header->frame_width_hi << 8); in scratch_get_header()
337 header->frame_height = header->frame_height_lo + (header->frame_height_hi << 8); in scratch_get_header()
346 /* This removes len bytes of old data from the buffer */
349 usbvision->scratch_read_ptr += len; in scratch_rm_old()
350 usbvision->scratch_read_ptr %= scratch_buf_size; in scratch_rm_old()
351 PDEBUG(DBG_SCRATCH, "read_ptr is now %d\n", usbvision->scratch_read_ptr); in scratch_rm_old()
355 /* This resets the buffer - kills all data in it too */
360 usbvision->scratch_read_ptr = 0; in scratch_reset()
361 usbvision->scratch_write_ptr = 0; in scratch_reset()
362 usbvision->scratch_headermarker_read_ptr = 0; in scratch_reset()
363 usbvision->scratch_headermarker_write_ptr = 0; in scratch_reset()
364 usbvision->isocstate = isoc_state_no_frame; in scratch_reset()
369 usbvision->scratch = vmalloc_32(scratch_buf_size); in usbvision_scratch_alloc()
371 if (usbvision->scratch == NULL) { in usbvision_scratch_alloc()
372 dev_err(&usbvision->dev->dev, in usbvision_scratch_alloc()
375 return -ENOMEM; in usbvision_scratch_alloc()
382 vfree(usbvision->scratch); in usbvision_scratch_free()
383 usbvision->scratch = NULL; in usbvision_scratch_free()
389 * allocates intermediate buffer for decompression
395 usbvision->intra_frame_buffer = vmalloc_32(IFB_size); in usbvision_decompress_alloc()
396 if (usbvision->intra_frame_buffer == NULL) { in usbvision_decompress_alloc()
397 dev_err(&usbvision->dev->dev, in usbvision_decompress_alloc()
398 "%s: unable to allocate %d for compr. frame buffer\n", in usbvision_decompress_alloc()
400 return -ENOMEM; in usbvision_decompress_alloc()
408 * frees intermediate buffer for decompression
412 vfree(usbvision->intra_frame_buffer); in usbvision_decompress_free()
413 usbvision->intra_frame_buffer = NULL; in usbvision_decompress_free()
423 * Locate one of supported header markers in the scratch buffer.
427 struct usbvision_frame *frame; in usbvision_find_header() local
430 frame = usbvision->cur_frame; in usbvision_find_header()
432 while (scratch_get_header(usbvision, &frame->isoc_header) == USBVISION_HEADER_LENGTH) { in usbvision_find_header()
435 frame->isoc_header.magic_2, in usbvision_find_header()
436 frame->isoc_header.magic_1, in usbvision_find_header()
437 frame->isoc_header.header_length, in usbvision_find_header()
438 frame->isoc_header.frame_num, in usbvision_find_header()
439 frame->isoc_header.frame_phase, in usbvision_find_header()
440 frame->isoc_header.frame_latency, in usbvision_find_header()
441 frame->isoc_header.data_format, in usbvision_find_header()
442 frame->isoc_header.format_param, in usbvision_find_header()
443 frame->isoc_header.frame_width, in usbvision_find_header()
444 frame->isoc_header.frame_height); in usbvision_find_header()
446 if (usbvision->request_intra) { in usbvision_find_header()
447 if (frame->isoc_header.format_param & 0x80) { in usbvision_find_header()
449 usbvision->last_isoc_frame_num = -1; /* do not check for lost frames this time */ in usbvision_find_header()
460 frame->frmwidth = frame->isoc_header.frame_width * usbvision->stretch_width; in usbvision_find_header()
461 frame->frmheight = frame->isoc_header.frame_height * usbvision->stretch_height; in usbvision_find_header()
462 frame->v4l2_linesize = (frame->frmwidth * frame->v4l2_format.depth) >> 3; in usbvision_find_header()
470 if (frame->isoc_header.data_format == ISOC_MODE_COMPRESS) { in usbvision_find_header()
472 if (usbvision->last_isoc_frame_num >= 0) { in usbvision_find_header()
473 if (((usbvision->last_isoc_frame_num + 1) % 32) != frame->isoc_header.frame_num) { in usbvision_find_header()
474 /* unexpected frame drop: need to request new intra frame */ in usbvision_find_header()
475 PDEBUG(DBG_HEADER, "Lost frame before %d on USB", frame->isoc_header.frame_num); in usbvision_find_header()
480 usbvision->last_isoc_frame_num = frame->isoc_header.frame_num; in usbvision_find_header()
482 usbvision->header_count++; in usbvision_find_header()
483 frame->scanstate = scan_state_lines; in usbvision_find_header()
484 frame->curline = 0; in usbvision_find_header()
492 volatile struct usbvision_frame *frame; in usbvision_parse_lines_422() local
501 frame = usbvision->cur_frame; in usbvision_parse_lines_422()
502 f = frame->data + (frame->v4l2_linesize * frame->curline); in usbvision_parse_lines_422()
505 len = (frame->isoc_header.frame_width * 2) + 5; in usbvision_parse_lines_422()
507 PDEBUG(DBG_PARSE, "out of data in line %d, need %u.\n", frame->curline, len); in usbvision_parse_lines_422()
511 if ((frame->curline + 1) >= frame->frmheight) in usbvision_parse_lines_422()
514 bytes_per_pixel = frame->v4l2_format.bytes_per_pixel; in usbvision_parse_lines_422()
515 stretch_bytes = (usbvision->stretch_width - 1) * bytes_per_pixel; in usbvision_parse_lines_422()
516 clipmask_index = frame->curline * MAX_FRAME_WIDTH; in usbvision_parse_lines_422()
517 clipmask_add = usbvision->stretch_width; in usbvision_parse_lines_422()
519 for (i = 0; i < frame->frmwidth; i += (2 * usbvision->stretch_width)) { in usbvision_parse_lines_422()
522 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { in usbvision_parse_lines_422()
527 switch (frame->v4l2_format.format) { in usbvision_parse_lines_422()
556 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { in usbvision_parse_lines_422()
561 switch (frame->v4l2_format.format) { in usbvision_parse_lines_422()
591 frame->curline += usbvision->stretch_height; in usbvision_parse_lines_422()
592 *pcopylen += frame->v4l2_linesize * usbvision->stretch_height; in usbvision_parse_lines_422()
594 if (frame->curline >= frame->frmheight) in usbvision_parse_lines_422()
630 usbvision->compr_block_types[block_type]++; in usbvision_decompress()
636 rest_pixel -= 24; in usbvision_decompress()
639 idx += rest_pixel - 1; in usbvision_decompress()
649 rest_pixel -= block_len; in usbvision_decompress()
653 block_type_len -= 1; in usbvision_decompress()
671 integrator -= block_code; in usbvision_decompress()
676 block_len -= 1; in usbvision_decompress()
688 * Parse compressed frame from the scratch buffer, put
689 * decoded RGB value into the current frame buffer and add the written
700 struct usbvision_frame *frame; in usbvision_parse_compress() local
710 frame = usbvision->cur_frame; in usbvision_parse_compress()
711 image_size = frame->frmwidth * frame->frmheight; in usbvision_parse_compress()
712 if ((frame->v4l2_format.format == V4L2_PIX_FMT_YUV422P) || in usbvision_parse_compress()
713 (frame->v4l2_format.format == V4L2_PIX_FMT_YVU420)) { /* this is a planar format */ in usbvision_parse_compress()
715 f = frame->data + (frame->width * frame->curline); in usbvision_parse_compress()
717 f = frame->data + (frame->v4l2_linesize * frame->curline); in usbvision_parse_compress()
719 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { /* initialise u and v pointers */ in usbvision_parse_compress()
721 u = frame->data in usbvision_parse_compress()
723 + (frame->frmwidth >> 1) * frame->curline; in usbvision_parse_compress()
725 } else if (frame->v4l2_format.format == V4L2_PIX_FMT_YVU420) { in usbvision_parse_compress()
726 v = frame->data + image_size + ((frame->curline * (frame->width)) >> 2); in usbvision_parse_compress()
730 if (frame->curline == 0) in usbvision_parse_compress()
743 usbvision->strip_magic_errors++; in usbvision_parse_compress()
747 if (frame->curline != (int)strip_header[2]) { in usbvision_parse_compress()
749 usbvision->strip_line_number_errors++; in usbvision_parse_compress()
764 if (usbvision->intra_frame_buffer) { in usbvision_parse_compress()
765 Y = usbvision->intra_frame_buffer + frame->frmwidth * frame->curline; in usbvision_parse_compress()
766 U = usbvision->intra_frame_buffer + image_size + (frame->frmwidth / 2) * (frame->curline / 2); in usbvision_parse_compress()
767 …V = usbvision->intra_frame_buffer + image_size / 4 * 5 + (frame->frmwidth / 2) * (frame->curline /… in usbvision_parse_compress()
772 bytes_per_pixel = frame->v4l2_format.bytes_per_pixel; in usbvision_parse_compress()
773 clipmask_index = frame->curline * MAX_FRAME_WIDTH; in usbvision_parse_compress()
777 idx_end = frame->frmwidth; in usbvision_parse_compress()
779 startblock_pos = block_type_pos + (idx_end - 1) / 96 + (idx_end / 2 - 1) / 96 + 2; in usbvision_parse_compress()
782 usbvision->block_pos = block_pos; in usbvision_parse_compress()
785 if (strip_len > usbvision->max_strip_len) in usbvision_parse_compress()
786 usbvision->max_strip_len = strip_len; in usbvision_parse_compress()
788 if (frame->curline % 2) in usbvision_parse_compress()
793 if (block_pos > usbvision->comprblock_pos) in usbvision_parse_compress()
794 usbvision->comprblock_pos = block_pos; in usbvision_parse_compress()
796 usbvision->strip_len_errors++; in usbvision_parse_compress()
799 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { in usbvision_parse_compress()
802 } else if (frame->v4l2_format.format == V4L2_PIX_FMT_YUV422P) { in usbvision_parse_compress()
808 } else if (frame->v4l2_format.format == V4L2_PIX_FMT_YVU420) { in usbvision_parse_compress()
810 if (!((idx & 0x01) | (frame->curline & 0x01))) { in usbvision_parse_compress()
812 /* intraframe buffer is YUV420 format */ in usbvision_parse_compress()
818 switch (frame->v4l2_format.format) { in usbvision_parse_compress()
849 /* Deal with non-integer no. of bytes for YUV420P */ in usbvision_parse_compress()
850 if (frame->v4l2_format.format != V4L2_PIX_FMT_YVU420) in usbvision_parse_compress()
851 *pcopylen += frame->v4l2_linesize; in usbvision_parse_compress()
853 *pcopylen += frame->curline & 0x01 ? frame->v4l2_linesize : frame->v4l2_linesize << 1; in usbvision_parse_compress()
855 frame->curline += 1; in usbvision_parse_compress()
857 if (frame->curline >= frame->frmheight) in usbvision_parse_compress()
867 * Parse two lines from the scratch buffer, put
868 * decoded RGB value into the current frame buffer and add the written
875 struct usbvision_frame *frame; in usbvision_parse_lines_420() local
892 frame = usbvision->cur_frame; in usbvision_parse_lines_420()
893 f_even = frame->data + (frame->v4l2_linesize * frame->curline); in usbvision_parse_lines_420()
894 f_odd = f_even + frame->v4l2_linesize * usbvision->stretch_height; in usbvision_parse_lines_420()
899 bytes_per_pixel = frame->v4l2_format.bytes_per_pixel; in usbvision_parse_lines_420()
900 stretch_bytes = (usbvision->stretch_width - 1) * bytes_per_pixel; in usbvision_parse_lines_420()
901 clipmask_even_index = frame->curline * MAX_FRAME_WIDTH; in usbvision_parse_lines_420()
903 clipmask_add = usbvision->stretch_width; in usbvision_parse_lines_420()
904 pixel_per_line = frame->isoc_header.frame_width; in usbvision_parse_lines_420()
911 if ((frame->curline + 1) >= frame->frmheight) in usbvision_parse_lines_420()
922 + (4 - block_split) * sub_block_size); in usbvision_parse_lines_420()
931 v_ = v - 128; in usbvision_parse_lines_420()
932 u_ = u - 128; in usbvision_parse_lines_420()
934 uvg = -53281 * u_ - 25625 * v_; in usbvision_parse_lines_420()
937 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { in usbvision_parse_lines_420()
941 y_ = 76284 * (y[0] - 16); in usbvision_parse_lines_420()
947 switch (frame->v4l2_format.format) { in usbvision_parse_lines_420()
980 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { in usbvision_parse_lines_420()
984 y_ = 76284 * (y[1] - 16); in usbvision_parse_lines_420()
990 switch (frame->v4l2_format.format) { in usbvision_parse_lines_420()
1025 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { in usbvision_parse_lines_420()
1029 y_ = 76284 * (y[0] - 16); in usbvision_parse_lines_420()
1035 switch (frame->v4l2_format.format) { in usbvision_parse_lines_420()
1068 if (frame->v4l2_format.format == V4L2_PIX_FMT_YUYV) { in usbvision_parse_lines_420()
1072 y_ = 76284 * (y[1] - 16); in usbvision_parse_lines_420()
1078 switch (frame->v4l2_format.format) { in usbvision_parse_lines_420()
1124 frame->curline += 2 * usbvision->stretch_height; in usbvision_parse_lines_420()
1125 *pcopylen += frame->v4l2_linesize * 2 * usbvision->stretch_height; in usbvision_parse_lines_420()
1127 if (frame->curline >= frame->frmheight) in usbvision_parse_lines_420()
1135 * Generic routine to parse the scratch buffer. It employs either
1142 struct usbvision_frame *frame; in usbvision_parse_data() local
1147 frame = usbvision->cur_frame; in usbvision_parse_data()
1154 if (frame->scanstate == scan_state_scanning) { in usbvision_parse_data()
1156 } else if (frame->scanstate == scan_state_lines) { in usbvision_parse_data()
1157 if (usbvision->isoc_mode == ISOC_MODE_YUV420) in usbvision_parse_data()
1159 else if (usbvision->isoc_mode == ISOC_MODE_YUV422) in usbvision_parse_data()
1161 else if (usbvision->isoc_mode == ISOC_MODE_COMPRESS) in usbvision_parse_data()
1173 frame->grabstate = frame_state_done; in usbvision_parse_data()
1174 do_gettimeofday(&(frame->timestamp)); in usbvision_parse_data()
1175 frame->sequence = usbvision->frame_num; in usbvision_parse_data()
1177 spin_lock_irqsave(&usbvision->queue_lock, lock_flags); in usbvision_parse_data()
1178 list_move_tail(&(frame->frame), &usbvision->outqueue); in usbvision_parse_data()
1179 usbvision->cur_frame = NULL; in usbvision_parse_data()
1180 spin_unlock_irqrestore(&usbvision->queue_lock, lock_flags); in usbvision_parse_data()
1182 usbvision->frame_num++; in usbvision_parse_data()
1184 /* This will cause the process to request another frame. */ in usbvision_parse_data()
1185 if (waitqueue_active(&usbvision->wait_frame)) { in usbvision_parse_data()
1187 wake_up_interruptible(&usbvision->wait_frame); in usbvision_parse_data()
1190 frame->grabstate = frame_state_grabbing; in usbvision_parse_data()
1193 /* Update the frame's uncompressed length. */ in usbvision_parse_data()
1194 frame->scanlength += copylen; in usbvision_parse_data()
1207 for (i = 0; i < urb->number_of_packets; i++) { in usbvision_compress_isochronous()
1208 int packet_len = urb->iso_frame_desc[i].actual_length; in usbvision_compress_isochronous()
1209 int packet_stat = urb->iso_frame_desc[i].status; in usbvision_compress_isochronous()
1211 packet_data = urb->transfer_buffer + urb->iso_frame_desc[i].offset; in usbvision_compress_isochronous()
1216 usbvision->isoc_err_count++; in usbvision_compress_isochronous()
1223 usbvision->isoc_skip_count++; in usbvision_compress_isochronous()
1225 } else if (packet_len == 0) { /* Frame end ????? */ in usbvision_compress_isochronous()
1227 usbvision->isocstate = isoc_state_no_frame; in usbvision_compress_isochronous()
1228 usbvision->isoc_skip_count++; in usbvision_compress_isochronous()
1230 } else if (packet_len > usbvision->isoc_packet_size) { in usbvision_compress_isochronous()
1232 usbvision->isoc_skip_count++; in usbvision_compress_isochronous()
1238 if (usbvision->isocstate == isoc_state_no_frame) { /* new frame begins */ in usbvision_compress_isochronous()
1239 usbvision->isocstate = isoc_state_in_frame; in usbvision_compress_isochronous()
1248 * may overflow the buffer. We have to move old data over to in usbvision_compress_isochronous()
1254 usbvision->scratch_ovf_count++; in usbvision_compress_isochronous()
1257 scratch_rm_old(usbvision, packet_len - scratch_free(usbvision)); in usbvision_compress_isochronous()
1260 /* Now we know that there is enough room in scratch buffer */ in usbvision_compress_isochronous()
1263 usbvision->isoc_data_count += packet_len; in usbvision_compress_isochronous()
1264 usbvision->isoc_packet_count++; in usbvision_compress_isochronous()
1271 printk(KERN_DEBUG "+%d.\n", usbvision->scratchlen); in usbvision_compress_isochronous()
1284 struct usb_usbvision *usbvision = urb->context; in usbvision_isoc_irq()
1294 if (urb->status == -ENOENT) in usbvision_isoc_irq()
1297 f = &usbvision->cur_frame; in usbvision_isoc_irq()
1300 if (usbvision->streaming == stream_interrupt) { in usbvision_isoc_irq()
1301 usbvision->streaming = stream_idle; in usbvision_isoc_irq()
1303 (*f)->grabstate = frame_state_ready; in usbvision_isoc_irq()
1304 (*f)->scanstate = scan_state_scanning; in usbvision_isoc_irq()
1307 wake_up_interruptible(&usbvision->wait_stream); in usbvision_isoc_irq()
1310 /* Copy the data received into our scratch buffer */ in usbvision_isoc_irq()
1313 usbvision->isoc_urb_count++; in usbvision_isoc_irq()
1314 usbvision->urb_length = len; in usbvision_isoc_irq()
1316 if (usbvision->streaming == stream_on) { in usbvision_isoc_irq()
1319 !list_empty(&(usbvision->inqueue))) { in usbvision_isoc_irq()
1321 (*f) = list_entry(usbvision->inqueue.next, in usbvision_isoc_irq()
1323 frame); in usbvision_isoc_irq()
1327 /* If we don't have a frame in usbvision_isoc_irq()
1338 usbvision->time_in_irq += jiffies - start_time; in usbvision_isoc_irq()
1341 urb->iso_frame_desc[i].status = 0; in usbvision_isoc_irq()
1342 urb->iso_frame_desc[i].actual_length = 0; in usbvision_isoc_irq()
1345 urb->status = 0; in usbvision_isoc_irq()
1346 urb->dev = usbvision->dev; in usbvision_isoc_irq()
1350 dev_err(&usbvision->dev->dev, in usbvision_isoc_irq()
1365 * return < 0 -> Error
1366 * >= 0 -> Data
1372 unsigned char buffer[1]; in usbvision_read_reg() local
1375 return -1; in usbvision_read_reg()
1377 err_code = usb_control_msg(usbvision->dev, usb_rcvctrlpipe(usbvision->dev, 1), in usbvision_read_reg()
1380 0, (__u16) reg, buffer, 1, HZ); in usbvision_read_reg()
1383 dev_err(&usbvision->dev->dev, in usbvision_read_reg()
1387 return buffer[0]; in usbvision_read_reg()
1393 * return 1 -> Reg written
1394 * 0 -> usbvision is not yet ready
1395 * -1 -> Something went wrong
1406 err_code = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1), in usbvision_write_reg()
1412 dev_err(&usbvision->dev->dev, in usbvision_write_reg()
1421 struct usb_usbvision *usbvision = (struct usb_usbvision *)urb->context; in usbvision_ctrl_urb_complete()
1424 usbvision->ctrl_urb_busy = 0; in usbvision_ctrl_urb_complete()
1425 if (waitqueue_active(&usbvision->ctrl_urb_wq)) in usbvision_ctrl_urb_complete()
1426 wake_up_interruptible(&usbvision->ctrl_urb_wq); in usbvision_ctrl_urb_complete()
1437 return -EFAULT; in usbvision_write_reg_irq()
1438 if (usbvision->ctrl_urb_busy) in usbvision_write_reg_irq()
1439 return -EBUSY; in usbvision_write_reg_irq()
1440 usbvision->ctrl_urb_busy = 1; in usbvision_write_reg_irq()
1442 usbvision->ctrl_urb_setup.bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT; in usbvision_write_reg_irq()
1443 usbvision->ctrl_urb_setup.bRequest = USBVISION_OP_CODE; in usbvision_write_reg_irq()
1444 usbvision->ctrl_urb_setup.wValue = 0; in usbvision_write_reg_irq()
1445 usbvision->ctrl_urb_setup.wIndex = cpu_to_le16(address); in usbvision_write_reg_irq()
1446 usbvision->ctrl_urb_setup.wLength = cpu_to_le16(len); in usbvision_write_reg_irq()
1447 usb_fill_control_urb(usbvision->ctrl_urb, usbvision->dev, in usbvision_write_reg_irq()
1448 usb_sndctrlpipe(usbvision->dev, 1), in usbvision_write_reg_irq()
1449 (unsigned char *)&usbvision->ctrl_urb_setup, in usbvision_write_reg_irq()
1450 (void *)usbvision->ctrl_urb_buffer, len, in usbvision_write_reg_irq()
1454 memcpy(usbvision->ctrl_urb_buffer, data, len); in usbvision_write_reg_irq()
1456 err_code = usb_submit_urb(usbvision->ctrl_urb, GFP_ATOMIC); in usbvision_write_reg_irq()
1459 usbvision->ctrl_urb_busy = 0; in usbvision_write_reg_irq()
1470 usbvision->last_isoc_frame_num = -1; in usbvision_init_compression()
1471 usbvision->isoc_data_count = 0; in usbvision_init_compression()
1472 usbvision->isoc_packet_count = 0; in usbvision_init_compression()
1473 usbvision->isoc_skip_count = 0; in usbvision_init_compression()
1474 usbvision->compr_level = 50; in usbvision_init_compression()
1475 usbvision->last_compr_level = -1; in usbvision_init_compression()
1476 usbvision->isoc_urb_count = 0; in usbvision_init_compression()
1477 usbvision->request_intra = 1; in usbvision_init_compression()
1478 usbvision->isoc_measure_bandwidth_count = 0; in usbvision_init_compression()
1485 * sets used_bandwidth to 1-100 : 1-100% of full bandwidth resp. to isoc_packet_size
1491 …if (usbvision->isoc_measure_bandwidth_count < 2) { /* this gives an average bandwidth of 3 frames … in usbvision_measure_bandwidth()
1492 usbvision->isoc_measure_bandwidth_count++; in usbvision_measure_bandwidth()
1495 if ((usbvision->isoc_packet_size > 0) && (usbvision->isoc_packet_count > 0)) { in usbvision_measure_bandwidth()
1496 usbvision->used_bandwidth = usbvision->isoc_data_count / in usbvision_measure_bandwidth()
1497 (usbvision->isoc_packet_count + usbvision->isoc_skip_count) * in usbvision_measure_bandwidth()
1498 100 / usbvision->isoc_packet_size; in usbvision_measure_bandwidth()
1500 usbvision->isoc_measure_bandwidth_count = 0; in usbvision_measure_bandwidth()
1501 usbvision->isoc_data_count = 0; in usbvision_measure_bandwidth()
1502 usbvision->isoc_packet_count = 0; in usbvision_measure_bandwidth()
1503 usbvision->isoc_skip_count = 0; in usbvision_measure_bandwidth()
1510 unsigned char buffer[6]; in usbvision_adjust_compression() local
1513 if ((adjust_compression) && (usbvision->used_bandwidth > 0)) { in usbvision_adjust_compression()
1514 usbvision->compr_level += (usbvision->used_bandwidth - 90) / 2; in usbvision_adjust_compression()
1515 RESTRICT_TO_RANGE(usbvision->compr_level, 0, 100); in usbvision_adjust_compression()
1516 if (usbvision->compr_level != usbvision->last_compr_level) { in usbvision_adjust_compression()
1519 if (usbvision->bridge_type == BRIDGE_NT1004 || usbvision->bridge_type == BRIDGE_NT1005) { in usbvision_adjust_compression()
1520 buffer[0] = (unsigned char)(4 + 16 * usbvision->compr_level / 100); /* PCM Threshold 1 */ in usbvision_adjust_compression()
1521 buffer[1] = (unsigned char)(4 + 8 * usbvision->compr_level / 100); /* PCM Threshold 2 */ in usbvision_adjust_compression()
1522 distortion = 7 + 248 * usbvision->compr_level / 100; in usbvision_adjust_compression()
1523 buffer[2] = (unsigned char)(distortion & 0xFF); /* Average distortion Threshold (inter) */ in usbvision_adjust_compression()
1524 buffer[3] = (unsigned char)(distortion & 0xFF); /* Average distortion Threshold (intra) */ in usbvision_adjust_compression()
1525 distortion = 1 + 42 * usbvision->compr_level / 100; in usbvision_adjust_compression()
1526 buffer[4] = (unsigned char)(distortion & 0xFF); /* Maximum distortion Threshold (inter) */ in usbvision_adjust_compression()
1527 buffer[5] = (unsigned char)(distortion & 0xFF); /* Maximum distortion Threshold (intra) */ in usbvision_adjust_compression()
1529 buffer[0] = (unsigned char)(4 + 16 * usbvision->compr_level / 100); /* PCM threshold 1 */ in usbvision_adjust_compression()
1530 buffer[1] = (unsigned char)(4 + 8 * usbvision->compr_level / 100); /* PCM threshold 2 */ in usbvision_adjust_compression()
1531 distortion = 2 + 253 * usbvision->compr_level / 100; in usbvision_adjust_compression()
1532 buffer[2] = (unsigned char)(distortion & 0xFF); /* distortion threshold bit0-7 */ in usbvision_adjust_compression()
1533 buffer[3] = 0; /* (unsigned char)((distortion >> 8) & 0x0F); distortion threshold bit 8-11 */ in usbvision_adjust_compression()
1534 distortion = 0 + 43 * usbvision->compr_level / 100; in usbvision_adjust_compression()
1535 buffer[4] = (unsigned char)(distortion & 0xFF); /* maximum distortion bit0-7 */ in usbvision_adjust_compression()
1536 buffer[5] = 0; /* (unsigned char)((distortion >> 8) & 0x01); maximum distortion bit 8 */ in usbvision_adjust_compression()
1538 err_code = usbvision_write_reg_irq(usbvision, USBVISION_PCM_THR1, buffer, 6); in usbvision_adjust_compression()
1540 PDEBUG(DBG_IRQ, "new compr params %#02x %#02x %#02x %#02x %#02x %#02x", buffer[0], in usbvision_adjust_compression()
1541 buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]); in usbvision_adjust_compression()
1542 usbvision->last_compr_level = usbvision->compr_level; in usbvision_adjust_compression()
1552 unsigned char buffer[1]; in usbvision_request_intra() local
1555 usbvision->request_intra = 1; in usbvision_request_intra()
1556 buffer[0] = 1; in usbvision_request_intra()
1557 usbvision_write_reg_irq(usbvision, USBVISION_FORCE_INTRA, buffer, 1); in usbvision_request_intra()
1564 unsigned char buffer[1]; in usbvision_unrequest_intra() local
1567 usbvision->request_intra = 0; in usbvision_unrequest_intra()
1568 buffer[0] = 0; in usbvision_unrequest_intra()
1569 usbvision_write_reg_irq(usbvision, USBVISION_FORCE_INTRA, buffer, 1); in usbvision_unrequest_intra()
1585 usbvision->power = 0; in usbvision_power_off()
1610 if (usbvision_device_data[usbvision->dev_model].video_norm == V4L2_STD_NTSC) in usbvision_init_webcam()
1616 rc = usb_control_msg(usbvision->dev, in usbvision_init_webcam()
1617 usb_sndctrlpipe(usbvision->dev, 1), in usbvision_init_webcam()
1663 rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1), in usbvision_set_video_format()
1670 printk(KERN_ERR "%s: ERROR=%d. USBVISION stopped - " in usbvision_set_video_format()
1673 usbvision->isoc_mode = format; in usbvision_set_video_format()
1695 usbvision->stretch_width = 2; in usbvision_set_output()
1698 usbvision->stretch_width = 1; in usbvision_set_output()
1703 usbvision->stretch_height = 2; in usbvision_set_output()
1706 usbvision->stretch_height = 1; in usbvision_set_output()
1710 usb_width &= ~(MIN_FRAME_WIDTH-1); in usbvision_set_output()
1716 usbvision->stretch_width, usbvision->stretch_height); in usbvision_set_output()
1719 if ((usb_width != usbvision->curwidth) || (usb_height != usbvision->curheight)) { in usbvision_set_output()
1725 err_code = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1), in usbvision_set_output()
1731 dev_err(&usbvision->dev->dev, in usbvision_set_output()
1735 usbvision->curwidth = usbvision->stretch_width * usb_width; in usbvision_set_output()
1736 usbvision->curheight = usbvision->stretch_height * usb_height; in usbvision_set_output()
1739 if (usbvision->isoc_mode == ISOC_MODE_YUV422) in usbvision_set_output()
1740 frame_rate = (usbvision->isoc_packet_size * 1000) / (usb_width * usb_height * 2); in usbvision_set_output()
1741 else if (usbvision->isoc_mode == ISOC_MODE_YUV420) in usbvision_set_output()
1742 frame_rate = (usbvision->isoc_packet_size * 1000) / ((usb_width * usb_height * 12) / 8); in usbvision_set_output()
1746 if (usbvision->tvnorm_id & V4L2_STD_625_50) in usbvision_set_output()
1747 frame_drop = frame_rate * 32 / 25 - 1; in usbvision_set_output()
1748 else if (usbvision->tvnorm_id & V4L2_STD_525_60) in usbvision_set_output()
1749 frame_drop = frame_rate * 32 / 30 - 1; in usbvision_set_output()
1757 if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) { in usbvision_set_output()
1758 if (usbvision_device_data[usbvision->dev_model].video_norm == V4L2_STD_PAL) in usbvision_set_output()
1786 usbvision->max_frame_size = PAGE_ALIGN(usbvision->curwidth * in usbvision_frames_alloc()
1787 usbvision->curheight * in usbvision_frames_alloc()
1788 usbvision->palette.bytes_per_pixel); in usbvision_frames_alloc()
1791 usbvision->num_frames = number_of_frames; in usbvision_frames_alloc()
1792 while (usbvision->num_frames > 0) { in usbvision_frames_alloc()
1793 usbvision->fbuf_size = usbvision->num_frames * usbvision->max_frame_size; in usbvision_frames_alloc()
1794 usbvision->fbuf = usbvision_rvmalloc(usbvision->fbuf_size); in usbvision_frames_alloc()
1795 if (usbvision->fbuf) in usbvision_frames_alloc()
1797 usbvision->num_frames--; in usbvision_frames_alloc()
1800 spin_lock_init(&usbvision->queue_lock); in usbvision_frames_alloc()
1801 init_waitqueue_head(&usbvision->wait_frame); in usbvision_frames_alloc()
1802 init_waitqueue_head(&usbvision->wait_stream); in usbvision_frames_alloc()
1805 for (i = 0; i < usbvision->num_frames; i++) { in usbvision_frames_alloc()
1806 usbvision->frame[i].index = i; in usbvision_frames_alloc()
1807 usbvision->frame[i].grabstate = frame_state_unused; in usbvision_frames_alloc()
1808 usbvision->frame[i].data = usbvision->fbuf + in usbvision_frames_alloc()
1809 i * usbvision->max_frame_size; in usbvision_frames_alloc()
1813 usbvision->stretch_width = 1; in usbvision_frames_alloc()
1814 usbvision->stretch_height = 1; in usbvision_frames_alloc()
1815 usbvision->frame[i].width = usbvision->curwidth; in usbvision_frames_alloc()
1816 usbvision->frame[i].height = usbvision->curheight; in usbvision_frames_alloc()
1817 usbvision->frame[i].bytes_read = 0; in usbvision_frames_alloc()
1819 PDEBUG(DBG_FUNC, "allocated %d frames (%d bytes per frame)", in usbvision_frames_alloc()
1820 usbvision->num_frames, usbvision->max_frame_size); in usbvision_frames_alloc()
1821 return usbvision->num_frames; in usbvision_frames_alloc()
1831 PDEBUG(DBG_FUNC, "free %d frames", usbvision->num_frames); in usbvision_frames_free()
1833 if (usbvision->fbuf != NULL) { in usbvision_frames_free()
1834 usbvision_rvfree(usbvision->fbuf, usbvision->fbuf_size); in usbvision_frames_free()
1835 usbvision->fbuf = NULL; in usbvision_frames_free()
1837 usbvision->num_frames = 0; in usbvision_frames_free()
1848 INIT_LIST_HEAD(&(usbvision->inqueue)); in usbvision_empty_framequeues()
1849 INIT_LIST_HEAD(&(usbvision->outqueue)); in usbvision_empty_framequeues()
1852 usbvision->frame[i].grabstate = frame_state_unused; in usbvision_empty_framequeues()
1853 usbvision->frame[i].bytes_read = 0; in usbvision_empty_framequeues()
1867 usbvision->streaming = stream_interrupt; in usbvision_stream_interrupt()
1868 ret = wait_event_timeout(usbvision->wait_stream, in usbvision_stream_interrupt()
1869 (usbvision->streaming == stream_idle), in usbvision_stream_interrupt()
1885 value[0] = 0x0F; /* Intra-Compression cycle */ in usbvision_set_compress_params()
1888 value[3] = 0x00; /* Reg.47 FORCE_UP <- 0 normal operation (not force) */ in usbvision_set_compress_params()
1894 /* value[1] = 0xF1; Use full frame height for virtual strip width; One line per strip */ in usbvision_set_compress_params()
1901 rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1), in usbvision_set_compress_params()
1908 printk(KERN_ERR "%sERROR=%d. USBVISION stopped - " in usbvision_set_compress_params()
1913 if (usbvision->bridge_type == BRIDGE_NT1004) { in usbvision_set_compress_params()
1923 value[2] = 255; /* Distortion Threshold d7-d0 */ in usbvision_set_compress_params()
1924 value[3] = 0; /* Distortion Threshold d11-d8 */ in usbvision_set_compress_params()
1925 value[4] = 43; /* Max Distortion d7-d0 */ in usbvision_set_compress_params()
1932 rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1), in usbvision_set_compress_params()
1939 printk(KERN_ERR "%sERROR=%d. USBVISION stopped - " in usbvision_set_compress_params()
1964 if (usbvision_device_data[usbvision->dev_model].vin_reg1_override) { in usbvision_set_input()
1965 value[0] = usbvision_device_data[usbvision->dev_model].vin_reg1; in usbvision_set_input()
1966 } else if (usbvision_device_data[usbvision->dev_model].codec == CODEC_SAA7113) { in usbvision_set_input()
1970 /* I'm sure only about d2-d0 [010] 16 bit 4:2:2 usin sync pulses in usbvision_set_input()
1978 printk(KERN_ERR "%sERROR=%d. USBVISION stopped - " in usbvision_set_input()
1984 if (usbvision->tvnorm_id & V4L2_STD_PAL) { in usbvision_set_input()
1986 value[1] = 0x02; /* 0x02C0 -> 704 Input video line length */ in usbvision_set_input()
1988 value[3] = 0x01; /* 0x0120 -> 288 Input video n. of lines */ in usbvision_set_input()
1990 value[5] = 0x00; /* 0x0060 -> 96 Input video h offset */ in usbvision_set_input()
1992 value[7] = 0x00; /* 0x0016 -> 22 Input video v offset */ in usbvision_set_input()
1993 } else if (usbvision->tvnorm_id & V4L2_STD_SECAM) { in usbvision_set_input()
1995 value[1] = 0x02; /* 0x02C0 -> 704 Input video line length */ in usbvision_set_input()
1997 value[3] = 0x01; /* 0x0120 -> 288 Input video n. of lines */ in usbvision_set_input()
1999 value[5] = 0x00; /* 0x0001 -> 01 Input video h offset */ in usbvision_set_input()
2001 value[7] = 0x00; /* 0x0001 -> 01 Input video v offset */ in usbvision_set_input()
2004 value[1] = 0x02; /* 0x02D0 -> 720 Input video line length */ in usbvision_set_input()
2006 value[3] = 0x00; /* 0x00F0 -> 240 Input video number of lines */ in usbvision_set_input()
2008 value[5] = 0x00; /* 0x0050 -> 80 Input video h offset */ in usbvision_set_input()
2010 value[7] = 0x00; /* 0x0010 -> 16 Input video v offset */ in usbvision_set_input()
2014 if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) { in usbvision_set_input()
2016 value[1] = 0x01; /* 0x01E0 -> 480 Input video line length */ in usbvision_set_input()
2019 if (usbvision_device_data[usbvision->dev_model].x_offset >= 0) { in usbvision_set_input()
2020 value[4] = usbvision_device_data[usbvision->dev_model].x_offset & 0xff; in usbvision_set_input()
2021 value[5] = (usbvision_device_data[usbvision->dev_model].x_offset & 0x0300) >> 8; in usbvision_set_input()
2024 if (adjust_x_offset != -1) { in usbvision_set_input()
2029 if (usbvision_device_data[usbvision->dev_model].y_offset >= 0) { in usbvision_set_input()
2030 value[6] = usbvision_device_data[usbvision->dev_model].y_offset & 0xff; in usbvision_set_input()
2031 value[7] = (usbvision_device_data[usbvision->dev_model].y_offset & 0x0300) >> 8; in usbvision_set_input()
2034 if (adjust_y_offset != -1) { in usbvision_set_input()
2039 rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1), in usbvision_set_input()
2044 printk(KERN_ERR "%sERROR=%d. USBVISION stopped - " in usbvision_set_input()
2052 if (usbvision_device_data[usbvision->dev_model].dvi_yuv_override) { in usbvision_set_input()
2053 dvi_yuv_value = usbvision_device_data[usbvision->dev_model].dvi_yuv; in usbvision_set_input()
2054 } else if (usbvision_device_data[usbvision->dev_model].codec == CODEC_SAA7113) { in usbvision_set_input()
2066 * Set the buffer address needed by the usbvision dram to operate
2076 if (usbvision->isoc_mode == ISOC_MODE_COMPRESS) { in usbvision_set_dram_settings()
2085 /* UR: 0x0E200-0x3FFFF = 204288 Words (1 Word = 2 Byte) */ in usbvision_set_dram_settings()
2086 /* FDL: 0x00000-0x0E099 = 57498 Words */ in usbvision_set_dram_settings()
2087 /* VDW: 0x0E3FF-0x3FFFF */ in usbvision_set_dram_settings()
2098 /* These are the values of the address of the video buffer, in usbvision_set_dram_settings()
2099 * they have to be loaded into the USBVISION_DRM_PRM1-8 in usbvision_set_dram_settings()
2101 * Start address of video output buffer for read: drm_prm1-2 -> 0x00000 in usbvision_set_dram_settings()
2102 * End address of video output buffer for read: drm_prm1-3 -> 0x1ffff in usbvision_set_dram_settings()
2103 * Start address of video frame delay buffer: drm_prm1-4 -> 0x20000 in usbvision_set_dram_settings()
2105 * End address of video frame delay buffer: drm_prm1-5-6 -> 0x3ffff in usbvision_set_dram_settings()
2107 * Start address of video output buffer for write: drm_prm1-7 -> 0x00000 in usbvision_set_dram_settings()
2108 * End address of video output buffer for write: drm_prm1-8 -> 0x1ffff in usbvision_set_dram_settings()
2114 rc = usb_control_msg(usbvision->dev, usb_sndctrlpipe(usbvision->dev, 1), in usbvision_set_dram_settings()
2121 dev_err(&usbvision->dev->dev, "%s: ERROR=%d\n", __func__, rc); in usbvision_set_dram_settings()
2125 /* Restart the video buffer logic */ in usbvision_set_dram_settings()
2138 * Power on the device, enables suspend-resume logic
2139 * & reset the isoc End-Point
2153 if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) { in usbvision_power_on()
2165 usbvision->power = 1; in usbvision_power_on()
2181 if (mutex_lock_interruptible(&usbvision->v4l2_lock)) in call_usbvision_power_off()
2184 if (usbvision->user == 0) { in call_usbvision_power_off()
2188 usbvision->initialized = 0; in call_usbvision_power_off()
2190 mutex_unlock(&usbvision->v4l2_lock); in call_usbvision_power_off()
2198 del_timer(&usbvision->power_off_timer); in usbvision_power_off_timer()
2199 INIT_WORK(&usbvision->power_off_work, call_usbvision_power_off); in usbvision_power_off_timer()
2200 (void) schedule_work(&usbvision->power_off_work); in usbvision_power_off_timer()
2205 init_timer(&usbvision->power_off_timer); in usbvision_init_power_off_timer()
2206 usbvision->power_off_timer.data = (long)usbvision; in usbvision_init_power_off_timer()
2207 usbvision->power_off_timer.function = usbvision_power_off_timer; in usbvision_init_power_off_timer()
2212 mod_timer(&usbvision->power_off_timer, jiffies + USBVISION_POWEROFF_TIME); in usbvision_set_power_off_timer()
2217 if (timer_pending(&usbvision->power_off_timer)) in usbvision_reset_power_off_timer()
2218 del_timer(&usbvision->power_off_timer); in usbvision_reset_power_off_timer()
2228 if (usbvision->isoc_mode == ISOC_MODE_COMPRESS) in usbvision_begin_streaming()
2231 USBVISION_NOHVALID | usbvision->vin_reg2_preset); in usbvision_begin_streaming()
2254 usbvision->vin_reg2_preset); in usbvision_restart_isoc()
2269 return -1; in usbvision_audio_off()
2271 usbvision->audio_mute = 0; in usbvision_audio_off()
2272 usbvision->audio_channel = USBVISION_AUDIO_MUTE; in usbvision_audio_off()
2278 if (!usbvision->audio_mute) { in usbvision_set_audio()
2281 return -1; in usbvision_set_audio()
2284 usbvision->audio_channel = audio_channel; in usbvision_set_audio()
2290 if (usbvision_device_data[usbvision->dev_model].codec == CODEC_WEBCAM) in usbvision_setup()
2305 int err_code, prev_alt = dev->iface_alt; in usbvision_set_alternate()
2308 dev->iface_alt = 0; in usbvision_set_alternate()
2309 for (i = 0; i < dev->num_alt; i++) in usbvision_set_alternate()
2310 if (dev->alt_max_pkt_size[i] > dev->alt_max_pkt_size[dev->iface_alt]) in usbvision_set_alternate()
2311 dev->iface_alt = i; in usbvision_set_alternate()
2313 if (dev->iface_alt != prev_alt) { in usbvision_set_alternate()
2314 dev->isoc_packet_size = dev->alt_max_pkt_size[dev->iface_alt]; in usbvision_set_alternate()
2316 dev->iface_alt, dev->isoc_packet_size); in usbvision_set_alternate()
2317 err_code = usb_set_interface(dev->dev, dev->iface, dev->iface_alt); in usbvision_set_alternate()
2319 dev_err(&dev->dev->dev, in usbvision_set_alternate()
2321 dev->iface_alt, err_code); in usbvision_set_alternate()
2326 PDEBUG(DBG_ISOC, "ISO Packet Length:%d", dev->isoc_packet_size); in usbvision_set_alternate()
2337 struct usb_device *dev = usbvision->dev; in usbvision_init_isoc()
2342 return -EFAULT; in usbvision_init_isoc()
2344 usbvision->cur_frame = NULL; in usbvision_init_isoc()
2347 /* Alternate interface 1 is is the biggest frame size */ in usbvision_init_isoc()
2350 usbvision->last_error = err_code; in usbvision_init_isoc()
2351 return -EBUSY; in usbvision_init_isoc()
2353 sb_size = USBVISION_URB_FRAMES * usbvision->isoc_packet_size; in usbvision_init_isoc()
2355 reg_value = (16 - usbvision_read_reg(usbvision, in usbvision_init_isoc()
2358 usbvision->usb_bandwidth = reg_value >> 1; in usbvision_init_isoc()
2360 usbvision->usb_bandwidth); in usbvision_init_isoc()
2364 /* We double buffer the Iso lists */ in usbvision_init_isoc()
2372 dev_err(&usbvision->dev->dev, in usbvision_init_isoc()
2374 return -ENOMEM; in usbvision_init_isoc()
2376 usbvision->sbuf[buf_idx].urb = urb; in usbvision_init_isoc()
2377 usbvision->sbuf[buf_idx].data = in usbvision_init_isoc()
2378 usb_alloc_coherent(usbvision->dev, in usbvision_init_isoc()
2381 &urb->transfer_dma); in usbvision_init_isoc()
2382 urb->dev = dev; in usbvision_init_isoc()
2383 urb->context = usbvision; in usbvision_init_isoc()
2384 urb->pipe = usb_rcvisocpipe(dev, usbvision->video_endp); in usbvision_init_isoc()
2385 urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; in usbvision_init_isoc()
2386 urb->interval = 1; in usbvision_init_isoc()
2387 urb->transfer_buffer = usbvision->sbuf[buf_idx].data; in usbvision_init_isoc()
2388 urb->complete = usbvision_isoc_irq; in usbvision_init_isoc()
2389 urb->number_of_packets = USBVISION_URB_FRAMES; in usbvision_init_isoc()
2390 urb->transfer_buffer_length = in usbvision_init_isoc()
2391 usbvision->isoc_packet_size * USBVISION_URB_FRAMES; in usbvision_init_isoc()
2393 k += usbvision->isoc_packet_size) { in usbvision_init_isoc()
2394 urb->iso_frame_desc[j].offset = k; in usbvision_init_isoc()
2395 urb->iso_frame_desc[j].length = in usbvision_init_isoc()
2396 usbvision->isoc_packet_size; in usbvision_init_isoc()
2402 err_code = usb_submit_urb(usbvision->sbuf[buf_idx].urb, in usbvision_init_isoc()
2405 dev_err(&usbvision->dev->dev, in usbvision_init_isoc()
2411 usbvision->streaming = stream_idle; in usbvision_init_isoc()
2412 PDEBUG(DBG_ISOC, "%s: streaming=1 usbvision->video_endp=$%02x", in usbvision_init_isoc()
2414 usbvision->video_endp); in usbvision_init_isoc()
2422 * activates zero-bandwidth alt. setting of the video interface.
2428 int sb_size = USBVISION_URB_FRAMES * usbvision->isoc_packet_size; in usbvision_stop_isoc()
2430 if ((usbvision->streaming == stream_off) || (usbvision->dev == NULL)) in usbvision_stop_isoc()
2435 usb_kill_urb(usbvision->sbuf[buf_idx].urb); in usbvision_stop_isoc()
2436 if (usbvision->sbuf[buf_idx].data) { in usbvision_stop_isoc()
2437 usb_free_coherent(usbvision->dev, in usbvision_stop_isoc()
2439 usbvision->sbuf[buf_idx].data, in usbvision_stop_isoc()
2440 usbvision->sbuf[buf_idx].urb->transfer_dma); in usbvision_stop_isoc()
2442 usb_free_urb(usbvision->sbuf[buf_idx].urb); in usbvision_stop_isoc()
2443 usbvision->sbuf[buf_idx].urb = NULL; in usbvision_stop_isoc()
2447 usbvision->streaming = stream_off; in usbvision_stop_isoc()
2449 if (!usbvision->remove_pending) { in usbvision_stop_isoc()
2451 usbvision->iface_alt = 0; in usbvision_stop_isoc()
2452 err_code = usb_set_interface(usbvision->dev, usbvision->iface, in usbvision_stop_isoc()
2453 usbvision->iface_alt); in usbvision_stop_isoc()
2455 dev_err(&usbvision->dev->dev, in usbvision_stop_isoc()
2458 usbvision->last_error = err_code; in usbvision_stop_isoc()
2460 reg_value = (16-usbvision_read_reg(usbvision, USBVISION_ALTER_REG)) & 0x0F; in usbvision_stop_isoc()
2461 usbvision->isoc_packet_size = in usbvision_stop_isoc()
2462 (reg_value == 0) ? 0 : (reg_value * 64) - 1; in usbvision_stop_isoc()
2464 usbvision->isoc_packet_size); in usbvision_stop_isoc()
2466 usbvision->usb_bandwidth = reg_value >> 1; in usbvision_stop_isoc()
2468 usbvision->usb_bandwidth); in usbvision_stop_isoc()
2480 /* channel 2 is S-Video with audio channel 0 (line in) */ in usbvision_muxsel()
2483 RESTRICT_TO_RANGE(channel, 0, usbvision->video_inputs); in usbvision_muxsel()
2484 usbvision->ctl_input = channel; in usbvision_muxsel()
2487 /* Regular USB TV Tuners -> channel: 0 = Television, 1 = Composite, 2 = S-Video */ in usbvision_muxsel()
2488 …/* Four video input devices -> channel: 0 = Chan White, 1 = Chan Green, 2 = Chan Yellow, 3 = Chan … in usbvision_muxsel()
2490 switch (usbvision_device_data[usbvision->dev_model].codec) { in usbvision_muxsel()
2494 /* To handle problems with S-Video Input for in usbvision_muxsel()
2516 * ---------------------------------------------------------------------------
2518 * c-basic-offset: 8