static int cpia2_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) { struct camera_data *cam = video_drvdata(file); int ret = -EINVAL; DBG("VIDIOC_STREAMOFF, streaming=%d\n", cam->streaming); if (!cam->mmapped || type != V4L2_BUF_TYPE_VIDEO_CAPTURE) return -EINVAL; if (cam->streaming) { ret = cpia2_usb_stream_stop(cam); if (!ret) v4l2_ctrl_grab(cam->usb_alt, false); } return ret; }
static void w9968cf_stop0(struct sd *sd) { v4l2_ctrl_grab(sd->jpegqual, false); reg_w(sd, 0x39, 0x0000); /* disable JPEG encoder */ reg_w(sd, 0x16, 0x0000); /* stop video capture */ }
static void w9968cf_mode_init_regs(struct sd *sd) { int val, vs_polarity, hs_polarity; w9968cf_set_crop_window(sd); reg_w(sd, 0x14, sd->gspca_dev.pixfmt.width); reg_w(sd, 0x15, sd->gspca_dev.pixfmt.height); /* JPEG width & height */ reg_w(sd, 0x30, sd->gspca_dev.pixfmt.width); reg_w(sd, 0x31, sd->gspca_dev.pixfmt.height); /* Y & UV frame buffer strides (in WORD) */ if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat == V4L2_PIX_FMT_JPEG) { reg_w(sd, 0x2c, sd->gspca_dev.pixfmt.width / 2); reg_w(sd, 0x2d, sd->gspca_dev.pixfmt.width / 4); } else reg_w(sd, 0x2c, sd->gspca_dev.pixfmt.width); reg_w(sd, 0x00, 0xbf17); /* reset everything */ reg_w(sd, 0x00, 0xbf10); /* normal operation */ /* Transfer size in WORDS (for UYVY format only) */ val = sd->gspca_dev.pixfmt.width * sd->gspca_dev.pixfmt.height; reg_w(sd, 0x3d, val & 0xffff); /* low bits */ reg_w(sd, 0x3e, val >> 16); /* high bits */ if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat == V4L2_PIX_FMT_JPEG) { /* We may get called multiple times (usb isoc bw negotiat.) */ jpeg_define(sd->jpeg_hdr, sd->gspca_dev.pixfmt.height, sd->gspca_dev.pixfmt.width, 0x22); /* JPEG 420 */ jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual)); w9968cf_upload_quantizationtables(sd); v4l2_ctrl_grab(sd->jpegqual, true); } /* Video Capture Control Register */ if (sd->sensor == SEN_OV7620) { /* Seems to work around a bug in the image sensor */ vs_polarity = 1; hs_polarity = 1; } else { vs_polarity = 1; hs_polarity = 0; } val = (vs_polarity << 12) | (hs_polarity << 11); /* NOTE: We may not have enough memory to do double buffering while doing compression (amount of memory differs per model cam). So we use the second image buffer also as jpeg stream buffer (see w9968cf_init), and disable double buffering. */ if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat == V4L2_PIX_FMT_JPEG) { /* val |= 0x0002; YUV422P */ val |= 0x0003; /* YUV420P */ } else val |= 0x0080; /* Enable HW double buffering */ /* val |= 0x0020; enable clamping */ /* val |= 0x0008; enable (1-2-1) filter */ /* val |= 0x000c; enable (2-3-6-3-2) filter */ val |= 0x8000; /* capt. enable */ reg_w(sd, 0x16, val); sd->gspca_dev.empty_packet = 0; }