#include <media/v4l2-ioctl.h>
#include <media/v4l2-common.h>
+#include <media/v4l2-event.h>
#include <media/videobuf-dma-sg.h>
#include "solo6x10.h"
};
struct solo_enc_fh {
- struct solo_enc_dev *enc;
+ struct v4l2_fh fh;
+ struct solo_enc_dev *enc;
u32 fmt;
u8 enc_on;
enum solo_enc_types type;
struct poll_table_struct *wait)
{
struct solo_enc_fh *fh = file->private_data;
+ unsigned long req_events = poll_requested_events(wait);
+ unsigned res = v4l2_ctrl_poll(file, wait);
+ if (!(req_events & (POLLIN | POLLRDNORM)))
+ return res;
return videobuf_poll_stream(file, &fh->vidq, wait);
}
return -ENOMEM;
}
+ v4l2_fh_init(&fh->fh, video_devdata(file));
fh->enc = solo_enc;
spin_lock_init(&fh->av_lock);
file->private_data = fh;
V4L2_FIELD_INTERLACED,
sizeof(struct solo_videobuf),
fh, NULL);
-
+ v4l2_fh_add(&fh->fh);
return 0;
}
struct solo_dev *solo_dev = fh->enc->solo_dev;
solo_enc_off(fh);
+ v4l2_fh_del(&fh->fh);
+ v4l2_fh_exit(&fh->fh);
videobuf_stop(&fh->vidq);
videobuf_mmap_free(&fh->vidq);
/* Just set these */
pix->colorspace = V4L2_COLORSPACE_SMPTE170M;
pix->sizeimage = FRAME_BUF_SIZE;
+ pix->bytesperline = 0;
pix->priv = 0;
return 0;
/* Video capture parameters */
.vidioc_s_parm = solo_s_parm,
.vidioc_g_parm = solo_g_parm,
+ /* Logging and events */
+ .vidioc_log_status = v4l2_ctrl_log_status,
+ .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
+ .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
};
static const struct video_device solo_enc_template = {
*solo_enc->vfd = solo_enc_template;
solo_enc->vfd->v4l2_dev = &solo_dev->v4l2_dev;
solo_enc->vfd->ctrl_handler = hdl;
+ set_bit(V4L2_FL_USE_FH_PRIO, &solo_enc->vfd->flags);
ret = video_register_device(solo_enc->vfd, VFL_TYPE_GRABBER, nr);
if (ret < 0) {
video_device_release(solo_enc->vfd);
#include <media/v4l2-ioctl.h>
#include <media/v4l2-common.h>
+#include <media/v4l2-event.h>
#include <media/videobuf-dma-contig.h>
#include "solo6x10.h"
/* Simple file handle */
struct solo_filehandle {
+ struct v4l2_fh fh;
struct solo_dev *solo_dev;
struct videobuf_queue vidq;
struct task_struct *kthread;
struct poll_table_struct *wait)
{
struct solo_filehandle *fh = file->private_data;
+ unsigned long req_events = poll_requested_events(wait);
+ unsigned res = v4l2_ctrl_poll(file, wait);
- return videobuf_poll_stream(file, &fh->vidq, wait);
+ if (!(req_events & (POLLIN | POLLRDNORM)))
+ return res;
+ return res | videobuf_poll_stream(file, &fh->vidq, wait);
}
static int solo_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
if (fh == NULL)
return -ENOMEM;
+ v4l2_fh_init(&fh->fh, video_devdata(file));
spin_lock_init(&fh->slock);
INIT_LIST_HEAD(&fh->vidq_active);
fh->solo_dev = solo_dev;
V4L2_FIELD_INTERLACED,
sizeof(struct videobuf_buffer),
fh, NULL);
+ v4l2_fh_add(&fh->fh);
return 0;
}
videobuf_stop(&fh->vidq);
videobuf_mmap_free(&fh->vidq);
+ v4l2_fh_del(&fh->fh);
+ v4l2_fh_exit(&fh->fh);
kfree(fh);
return 0;
.vidioc_dqbuf = solo_dqbuf,
.vidioc_streamon = solo_streamon,
.vidioc_streamoff = solo_streamoff,
+ /* Logging and events */
+ .vidioc_log_status = v4l2_ctrl_log_status,
+ .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
+ .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
};
static struct video_device solo_v4l2_template = {
if (solo_dev->disp_hdl.error)
return solo_dev->disp_hdl.error;
solo_dev->vfd->ctrl_handler = &solo_dev->disp_hdl;
+ set_bit(V4L2_FL_USE_FH_PRIO, &solo_dev->vfd->flags);
ret = video_register_device(solo_dev->vfd, VFL_TYPE_GRABBER, nr);
if (ret < 0) {