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

Commit 012d6b02 authored by Jean-Francois Moine's avatar Jean-Francois Moine Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (8822): gspca: Change some subdriver functions for suspend/resume.



- new function 'init' called on probe and resume
- remove the functions 'open' and 'closed'
- 'stopN' and 'stop0' are optional

Signed-off-by: default avatarJean-Francois Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 66e4124f
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -826,8 +826,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
	return 0;
}

/* this function is called at open time */
static int sd_open(struct gspca_dev *gspca_dev)
/* this function is called at probe and resume time */
static int sd_init(struct gspca_dev *gspca_dev)
{
	cx11646_init1(gspca_dev);
	cx11646_initsize(gspca_dev);
@@ -845,10 +845,6 @@ static void sd_start(struct gspca_dev *gspca_dev)
	cx11646_jpeg(gspca_dev);
}

static void sd_stopN(struct gspca_dev *gspca_dev)
{
}

static void sd_stop0(struct gspca_dev *gspca_dev)
{
	int retry = 50;
@@ -871,10 +867,6 @@ static void sd_stop0(struct gspca_dev *gspca_dev)
	reg_w_val(gspca_dev, 0x00fc, 0xe0);
}

static void sd_close(struct gspca_dev *gspca_dev)
{
}

static void sd_pkt_scan(struct gspca_dev *gspca_dev,
			struct gspca_frame *frame,	/* target */
			__u8 *data,			/* isoc packet */
@@ -998,11 +990,9 @@ static struct sd_desc sd_desc = {
	.ctrls = sd_ctrls,
	.nctrls = ARRAY_SIZE(sd_ctrls),
	.config = sd_config,
	.open = sd_open,
	.init = sd_init,
	.start = sd_start,
	.stopN = sd_stopN,
	.stop0 = sd_stop0,
	.close = sd_close,
	.pkt_scan = sd_pkt_scan,
};

+3 −13
Original line number Diff line number Diff line
@@ -676,8 +676,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
	return 0;
}

/* this function is called at open time */
static int sd_open(struct gspca_dev *gspca_dev)
/* this function is called at probe and resume time */
static int sd_init(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;

@@ -711,14 +711,6 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
	et_video(gspca_dev, 0);		/* video off */
}

static void sd_stop0(struct gspca_dev *gspca_dev)
{
}

static void sd_close(struct gspca_dev *gspca_dev)
{
}

static __u8 Et_getgainG(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;
@@ -895,11 +887,9 @@ static struct sd_desc sd_desc = {
	.ctrls = sd_ctrls,
	.nctrls = ARRAY_SIZE(sd_ctrls),
	.config = sd_config,
	.open = sd_open,
	.init = sd_init,
	.start = sd_start,
	.stopN = sd_stopN,
	.stop0 = sd_stop0,
	.close = sd_close,
	.pkt_scan = sd_pkt_scan,
	.dq_callback = do_autogain,
};
+17 −28
Original line number Diff line number Diff line
@@ -558,9 +558,11 @@ static void gspca_stream_off(struct gspca_dev *gspca_dev)
	gspca_dev->streaming = 0;
	atomic_set(&gspca_dev->nevent, 0);
	if (gspca_dev->present) {
		if (gspca_dev->sd_desc->stopN)
			gspca_dev->sd_desc->stopN(gspca_dev);
		destroy_urbs(gspca_dev);
		gspca_set_alt0(gspca_dev);
		if (gspca_dev->sd_desc->stop0)
			gspca_dev->sd_desc->stop0(gspca_dev);
		PDEBUG(D_STREAM, "stream off OK");
	}
@@ -770,19 +772,7 @@ static int dev_open(struct inode *inode, struct file *file)
		goto out;
	}

	/* if not done yet, initialize the sensor */
	if (gspca_dev->users == 0) {
		if (mutex_lock_interruptible(&gspca_dev->usb_lock)) {
			ret = -ERESTARTSYS;
			goto out;
		}
		ret = gspca_dev->sd_desc->open(gspca_dev);
		mutex_unlock(&gspca_dev->usb_lock);
		if (ret != 0) {
			PDEBUG(D_ERR|D_CONF, "init device failed %d", ret);
			goto out;
		}
	} else if (gspca_dev->users > 4) {	/* (arbitrary value) */
	if (gspca_dev->users > 4) {	/* (arbitrary value) */
		ret = -EBUSY;
		goto out;
	}
@@ -795,6 +785,7 @@ static int dev_open(struct inode *inode, struct file *file)
	else
		gspca_dev->vdev.debug &= ~3;
#endif
	ret = 0;
out:
	mutex_unlock(&gspca_dev->queue_lock);
	if (ret != 0)
@@ -815,11 +806,6 @@ static int dev_close(struct inode *inode, struct file *file)

	/* if the file did the capture, free the streaming resources */
	if (gspca_dev->capt_file == file) {
		mutex_lock(&gspca_dev->usb_lock);
		if (gspca_dev->streaming)
			gspca_stream_off(gspca_dev);
		gspca_dev->sd_desc->close(gspca_dev);
		mutex_unlock(&gspca_dev->usb_lock);
		frame_free(gspca_dev);
		gspca_dev->capt_file = NULL;
		gspca_dev->memory = GSPCA_MEMORY_NO;
@@ -1747,8 +1733,11 @@ int gspca_dev_probe(struct usb_interface *intf,
/*	gspca_dev->users = 0;			(done by kzalloc) */
	gspca_dev->nbufread = 2;

	/* configure the subdriver */
	/* configure the subdriver and initialize the USB device */
	ret = gspca_dev->sd_desc->config(gspca_dev, id);
	if (ret < 0)
		goto out;
	ret = gspca_dev->sd_desc->init(gspca_dev);
	if (ret < 0)
		goto out;
	ret = gspca_set_alt0(gspca_dev);
@@ -1825,9 +1814,11 @@ int gspca_suspend(struct usb_interface *intf, pm_message_t message)
	if (!gspca_dev->streaming)
		return 0;
	gspca_dev->frozen = 1;		/* avoid urb error messages */
	if (gspca_dev->sd_desc->stopN)
		gspca_dev->sd_desc->stopN(gspca_dev);
	destroy_urbs(gspca_dev);
	gspca_set_alt0(gspca_dev);
	if (gspca_dev->sd_desc->stop0)
		gspca_dev->sd_desc->stop0(gspca_dev);
	return 0;
}
@@ -1838,11 +1829,9 @@ int gspca_resume(struct usb_interface *intf)
	struct gspca_dev *gspca_dev = usb_get_intfdata(intf);

	gspca_dev->frozen = 0;
	if (gspca_dev->users != 0) {
		gspca_dev->sd_desc->open(gspca_dev);
	gspca_dev->sd_desc->init(gspca_dev);
	if (gspca_dev->streaming)
		return gspca_init_transfer(gspca_dev);
	}
	return 0;
}
EXPORT_SYMBOL(gspca_resume);
+4 −5
Original line number Diff line number Diff line
@@ -90,15 +90,14 @@ struct sd_desc {
/* controls */
	const struct ctrl *ctrls;
	int nctrls;
/* operations */
/* mandatory operations */
	cam_cf_op config;	/* called on probe */
	cam_op open;		/* called on open */
	cam_op init;		/* called on probe and resume */
	cam_v_op start;		/* called on stream on */
	cam_v_op stopN;		/* called on stream off - main alt */
	cam_v_op stop0;		/* called on stream off - alt 0 */
	cam_v_op close;		/* called on close */
	cam_pkt_op pkt_scan;
/* optional operations */
	cam_v_op stopN;		/* called on stream off - main alt */
	cam_v_op stop0;		/* called on stream off - alt 0 */
	cam_v_op dq_callback;	/* called when a frame has been dequeued */
	cam_jpg_op get_jcomp;
	cam_jpg_op set_jcomp;
+3 −13
Original line number Diff line number Diff line
@@ -144,8 +144,8 @@ static int sd_config(struct gspca_dev *gspca_dev,
	return 0;
}

/* this function is called at open time */
static int sd_open(struct gspca_dev *gspca_dev)
/* this function is called at probe and resume time */
static int sd_init(struct gspca_dev *gspca_dev)
{
	return 0;
}
@@ -358,14 +358,6 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
		PDEBUG(D_ERR, "Camera Stop failed");
}

static void sd_stop0(struct gspca_dev *gspca_dev)
{
}

static void sd_close(struct gspca_dev *gspca_dev)
{
}

static void sd_pkt_scan(struct gspca_dev *gspca_dev,
			struct gspca_frame *frame,	/* target */
			__u8 *data,			/* isoc packet */
@@ -411,11 +403,9 @@ static const struct sd_desc sd_desc = {
	.ctrls = sd_ctrls,
	.nctrls = ARRAY_SIZE(sd_ctrls),
	.config = sd_config,
	.open = sd_open,
	.init = sd_init,
	.start = sd_start,
	.stopN = sd_stopN,
	.stop0 = sd_stop0,
	.close = sd_close,
	.pkt_scan = sd_pkt_scan,
};

Loading