Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89ea4706 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

[media] stk-webcam: add support for control events and prio handling



Also correct the first_init static: this should be part of the stk_camera struct.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Tested-by: default avatarArvydas Sidorenko <asido4@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 10351adc
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-event.h>

#include "stk-webcam.h"

@@ -603,20 +604,21 @@ static void stk_free_buffers(struct stk_camera *dev)

static int v4l_stk_open(struct file *fp)
{
	static int first_init = 1; /* webcam LED management */
	struct stk_camera *dev = video_drvdata(fp);
	int err;

	if (dev == NULL || !is_present(dev))
		return -ENXIO;

	if (!first_init)
	if (!dev->first_init)
		stk_camera_write_reg(dev, 0x0, 0x24);
	else
		first_init = 0;
		dev->first_init = 0;

	err = v4l2_fh_open(fp);
	if (!err)
		usb_autopm_get_interface(dev->interface);

	return 0;
	return err;
}

static int v4l_stk_release(struct file *fp)
@@ -633,8 +635,7 @@ static int v4l_stk_release(struct file *fp)

	if (is_present(dev))
		usb_autopm_put_interface(dev->interface);

	return 0;
	return v4l2_fh_release(fp);
}

static ssize_t v4l_stk_read(struct file *fp, char __user *buf,
@@ -701,6 +702,7 @@ static ssize_t v4l_stk_read(struct file *fp, char __user *buf,
static unsigned int v4l_stk_poll(struct file *fp, poll_table *wait)
{
	struct stk_camera *dev = video_drvdata(fp);
	unsigned res = v4l2_ctrl_poll(fp, wait);

	poll_wait(fp, &dev->wait_frame, wait);

@@ -708,9 +710,9 @@ static unsigned int v4l_stk_poll(struct file *fp, poll_table *wait)
		return POLLERR;

	if (!list_empty(&dev->sio_full))
		return POLLIN | POLLRDNORM;
		return res | POLLIN | POLLRDNORM;

	return 0;
	return res;
}


@@ -1190,6 +1192,9 @@ static const struct v4l2_ioctl_ops v4l_stk_ioctl_ops = {
	.vidioc_streamoff = stk_vidioc_streamoff,
	.vidioc_g_parm = stk_vidioc_g_parm,
	.vidioc_enum_framesizes = stk_vidioc_enum_framesizes,
	.vidioc_log_status = v4l2_ctrl_log_status,
	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
};

static void stk_v4l_dev_release(struct video_device *vd)
@@ -1217,6 +1222,7 @@ static int stk_register_video_device(struct stk_camera *dev)
	dev->vdev = stk_v4l_data;
	dev->vdev.debug = debug;
	dev->vdev.v4l2_dev = &dev->v4l2_dev;
	set_bit(V4L2_FL_USE_FH_PRIO, &dev->vdev.flags);
	video_set_drvdata(&dev->vdev, dev);
	err = video_register_device(&dev->vdev, VFL_TYPE_GRABBER, -1);
	if (err)
@@ -1270,6 +1276,7 @@ static int stk_camera_probe(struct usb_interface *interface,

	spin_lock_init(&dev->spinlock);
	init_waitqueue_head(&dev->wait_frame);
	dev->first_init = 1; /* webcam LED management */

	dev->udev = udev;
	dev->interface = interface;
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ struct stk_camera {
	struct usb_interface *interface;
	int webcam_model;
	struct file *owner;
	int first_init;

	u8 isoc_ep;