All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] gspca: store current mode instead of individual parameters
@ 2013-08-30 20:54 Ondrej Zary
  2013-08-30 20:54 ` [PATCH 2/3] gspca: Support variable resolution Ondrej Zary
  2013-09-09 11:42 ` [PATCH 1/3] gspca: store current mode instead of individual parameters Hans de Goede
  0 siblings, 2 replies; 4+ messages in thread
From: Ondrej Zary @ 2013-08-30 20:54 UTC (permalink / raw)
  To: linux-media

Store complete current mode (struct v4l2_pix_format) in struct gspca_dev
instead of separate pixfmt, width and height parameters.

This is a preparation for variable resolution support.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
---
 drivers/media/usb/gspca/conex.c                  |    3 +-
 drivers/media/usb/gspca/cpia1.c                  |    4 +-
 drivers/media/usb/gspca/gspca.c                  |   30 +++++--------
 drivers/media/usb/gspca/gspca.h                  |    4 +-
 drivers/media/usb/gspca/jeilinj.c                |    5 +-
 drivers/media/usb/gspca/jl2005bcd.c              |    2 +-
 drivers/media/usb/gspca/m5602/m5602_mt9m111.c    |    2 +-
 drivers/media/usb/gspca/mars.c                   |    7 ++-
 drivers/media/usb/gspca/mr97310a.c               |    6 +-
 drivers/media/usb/gspca/nw80x.c                  |   11 +++--
 drivers/media/usb/gspca/ov519.c                  |   51 ++++++++++++----------
 drivers/media/usb/gspca/ov534.c                  |    5 +-
 drivers/media/usb/gspca/pac207.c                 |    4 +-
 drivers/media/usb/gspca/pac7311.c                |    6 +-
 drivers/media/usb/gspca/se401.c                  |    6 +-
 drivers/media/usb/gspca/sn9c20x.c                |    6 +-
 drivers/media/usb/gspca/sonixb.c                 |    2 +-
 drivers/media/usb/gspca/sonixj.c                 |    3 +-
 drivers/media/usb/gspca/spca1528.c               |    3 +-
 drivers/media/usb/gspca/spca500.c                |    3 +-
 drivers/media/usb/gspca/sq905c.c                 |    2 +-
 drivers/media/usb/gspca/sq930x.c                 |    3 +-
 drivers/media/usb/gspca/stk014.c                 |    5 +-
 drivers/media/usb/gspca/stk1135.c                |    8 ++--
 drivers/media/usb/gspca/stv06xx/stv06xx.c        |    2 +-
 drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c |    2 +-
 drivers/media/usb/gspca/sunplus.c                |    3 +-
 drivers/media/usb/gspca/topro.c                  |   13 +++---
 drivers/media/usb/gspca/tv8532.c                 |    7 ++-
 drivers/media/usb/gspca/vicam.c                  |    8 ++--
 drivers/media/usb/gspca/w996Xcf.c                |   28 ++++++------
 drivers/media/usb/gspca/xirlink_cit.c            |   34 +++++++-------
 drivers/media/usb/gspca/zc3xx.c                  |    3 +-
 33 files changed, 145 insertions(+), 136 deletions(-)

diff --git a/drivers/media/usb/gspca/conex.c b/drivers/media/usb/gspca/conex.c
index 38714df..2e15c80 100644
--- a/drivers/media/usb/gspca/conex.c
+++ b/drivers/media/usb/gspca/conex.c
@@ -783,7 +783,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	struct sd *sd = (struct sd *) gspca_dev;
 
 	/* create the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x22);		/* JPEG 411 */
 	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
 
diff --git a/drivers/media/usb/gspca/cpia1.c b/drivers/media/usb/gspca/cpia1.c
index 064b530..f23df4a 100644
--- a/drivers/media/usb/gspca/cpia1.c
+++ b/drivers/media/usb/gspca/cpia1.c
@@ -1553,9 +1553,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
 		sd->params.format.videoSize = VIDEOSIZE_CIF;
 
 	sd->params.roi.colEnd = sd->params.roi.colStart +
-				(gspca_dev->width >> 3);
+				(gspca_dev->pixfmt.width >> 3);
 	sd->params.roi.rowEnd = sd->params.roi.rowStart +
-				(gspca_dev->height >> 2);
+				(gspca_dev->pixfmt.height >> 2);
 
 	/* And now set the camera to a known state */
 	ret = do_command(gspca_dev, CPIA_COMMAND_SetGrabMode,
diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
index b7ae872..9ffcce6 100644
--- a/drivers/media/usb/gspca/gspca.c
+++ b/drivers/media/usb/gspca/gspca.c
@@ -504,8 +504,7 @@ static int frame_alloc(struct gspca_dev *gspca_dev, struct file *file,
 	unsigned int frsz;
 	int i;
 
-	i = gspca_dev->curr_mode;
-	frsz = gspca_dev->cam.cam_mode[i].sizeimage;
+	frsz = gspca_dev->pixfmt.sizeimage;
 	PDEBUG(D_STREAM, "frame alloc frsz: %d", frsz);
 	frsz = PAGE_ALIGN(frsz);
 	if (count >= GSPCA_MAX_FRAMES)
@@ -627,16 +626,14 @@ static struct usb_host_endpoint *alt_xfer(struct usb_host_interface *alt,
 static u32 which_bandwidth(struct gspca_dev *gspca_dev)
 {
 	u32 bandwidth;
-	int i;
 
 	/* get the (max) image size */
-	i = gspca_dev->curr_mode;
-	bandwidth = gspca_dev->cam.cam_mode[i].sizeimage;
+	bandwidth = gspca_dev->pixfmt.sizeimage;
 
 	/* if the image is compressed, estimate its mean size */
 	if (!gspca_dev->cam.needs_full_bandwidth &&
-	    bandwidth < gspca_dev->cam.cam_mode[i].width *
-				gspca_dev->cam.cam_mode[i].height)
+	    bandwidth < gspca_dev->pixfmt.width *
+				gspca_dev->pixfmt.height)
 		bandwidth = bandwidth * 3 / 8;	/* 0.375 */
 
 	/* estimate the frame rate */
@@ -650,7 +647,7 @@ static u32 which_bandwidth(struct gspca_dev *gspca_dev)
 
 		/* don't hope more than 15 fps with USB 1.1 and
 		 * image resolution >= 640x480 */
-		if (gspca_dev->width >= 640
+		if (gspca_dev->pixfmt.width >= 640
 		 && gspca_dev->dev->speed == USB_SPEED_FULL)
 			bandwidth *= 15;		/* 15 fps */
 		else
@@ -982,9 +979,7 @@ static void gspca_set_default_mode(struct gspca_dev *gspca_dev)
 
 	i = gspca_dev->cam.nmodes - 1;	/* take the highest mode */
 	gspca_dev->curr_mode = i;
-	gspca_dev->width = gspca_dev->cam.cam_mode[i].width;
-	gspca_dev->height = gspca_dev->cam.cam_mode[i].height;
-	gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i].pixelformat;
+	gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i];
 
 	/* does nothing if ctrl_handler == NULL */
 	v4l2_ctrl_handler_setup(gspca_dev->vdev.ctrl_handler);
@@ -1105,10 +1100,8 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
 			    struct v4l2_format *fmt)
 {
 	struct gspca_dev *gspca_dev = video_drvdata(file);
-	int mode;
 
-	mode = gspca_dev->curr_mode;
-	fmt->fmt.pix = gspca_dev->cam.cam_mode[mode];
+	fmt->fmt.pix = gspca_dev->pixfmt;
 	/* some drivers use priv internally, zero it before giving it to
 	   userspace */
 	fmt->fmt.pix.priv = 0;
@@ -1187,10 +1180,8 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 		ret = -EBUSY;
 		goto out;
 	}
-	gspca_dev->width = fmt->fmt.pix.width;
-	gspca_dev->height = fmt->fmt.pix.height;
-	gspca_dev->pixfmt = fmt->fmt.pix.pixelformat;
 	gspca_dev->curr_mode = ret;
+	gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret];
 
 	ret = 0;
 out:
@@ -1467,8 +1458,9 @@ static int vidioc_streamon(struct file *file, void *priv,
 		if (ret < 0)
 			goto out;
 	}
-	PDEBUG_MODE(gspca_dev, D_STREAM, "stream on OK", gspca_dev->pixfmt,
-		    gspca_dev->width, gspca_dev->height);
+	PDEBUG_MODE(gspca_dev, D_STREAM, "stream on OK",
+		    gspca_dev->pixfmt.pixelformat,
+		    gspca_dev->pixfmt.width, gspca_dev->pixfmt.height);
 	ret = 0;
 out:
 	mutex_unlock(&gspca_dev->queue_lock);
diff --git a/drivers/media/usb/gspca/gspca.h b/drivers/media/usb/gspca/gspca.h
index ac0b11f..0f3d150 100644
--- a/drivers/media/usb/gspca/gspca.h
+++ b/drivers/media/usb/gspca/gspca.h
@@ -183,9 +183,7 @@ struct gspca_dev {
 	__u8 streaming;			/* protected by both mutexes (*) */
 
 	__u8 curr_mode;			/* current camera mode */
-	__u32 pixfmt;			/* current mode parameters */
-	__u16 width;
-	__u16 height;
+	struct v4l2_pix_format pixfmt;	/* current mode parameters */
 	__u32 sequence;			/* frame sequence number */
 
 	wait_queue_head_t wq;		/* wait queue */
diff --git a/drivers/media/usb/gspca/jeilinj.c b/drivers/media/usb/gspca/jeilinj.c
index 8da3dde..19736e2 100644
--- a/drivers/media/usb/gspca/jeilinj.c
+++ b/drivers/media/usb/gspca/jeilinj.c
@@ -378,11 +378,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	struct sd *dev = (struct sd *) gspca_dev;
 
 	/* create the JPEG header */
-	jpeg_define(dev->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(dev->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x21);          /* JPEG 422 */
 	jpeg_set_qual(dev->jpeg_hdr, dev->quality);
 	PDEBUG(D_STREAM, "Start streaming at %dx%d",
-		gspca_dev->height, gspca_dev->width);
+		gspca_dev->pixfmt.height, gspca_dev->pixfmt.width);
 	jlj_start(gspca_dev);
 	return gspca_dev->usb_err;
 }
diff --git a/drivers/media/usb/gspca/jl2005bcd.c b/drivers/media/usb/gspca/jl2005bcd.c
index fdaeeb1..5b481fa 100644
--- a/drivers/media/usb/gspca/jl2005bcd.c
+++ b/drivers/media/usb/gspca/jl2005bcd.c
@@ -455,7 +455,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	struct sd *sd = (struct sd *) gspca_dev;
 	sd->cap_mode = gspca_dev->cam.cam_mode;
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 640:
 		PDEBUG(D_STREAM, "Start streaming at vga resolution");
 		jl2005c_stream_start_vga_lg(gspca_dev);
diff --git a/drivers/media/usb/gspca/m5602/m5602_mt9m111.c b/drivers/media/usb/gspca/m5602/m5602_mt9m111.c
index cfa4663..27fcef1 100644
--- a/drivers/media/usb/gspca/m5602/m5602_mt9m111.c
+++ b/drivers/media/usb/gspca/m5602/m5602_mt9m111.c
@@ -266,7 +266,7 @@ static int mt9m111_set_hvflip(struct gspca_dev *gspca_dev)
 		return err;
 
 	data[0] = MT9M111_RMB_OVER_SIZED;
-	if (gspca_dev->width == 640) {
+	if (gspca_dev->pixfmt.width == 640) {
 		data[1] = MT9M111_RMB_ROW_SKIP_2X |
 			  MT9M111_RMB_COLUMN_SKIP_2X |
 			  (hflip << 1) | vflip;
diff --git a/drivers/media/usb/gspca/mars.c b/drivers/media/usb/gspca/mars.c
index ff2c5ab..779a878 100644
--- a/drivers/media/usb/gspca/mars.c
+++ b/drivers/media/usb/gspca/mars.c
@@ -254,7 +254,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	int i;
 
 	/* create the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x21);		/* JPEG 422 */
 	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
 
@@ -270,8 +271,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	data[0] = 0x00;		/* address */
 	data[1] = 0x0c | 0x01;	/* reg 0 */
 	data[2] = 0x01;		/* reg 1 */
-	data[3] = gspca_dev->width / 8;		/* h_size , reg 2 */
-	data[4] = gspca_dev->height / 8;	/* v_size , reg 3 */
+	data[3] = gspca_dev->pixfmt.width / 8;	/* h_size , reg 2 */
+	data[4] = gspca_dev->pixfmt.height / 8;	/* v_size , reg 3 */
 	data[5] = 0x30;		/* reg 4, MI, PAS5101 :
 				 *	0x30 for 24mhz , 0x28 for 12mhz */
 	data[6] = 0x02;		/* reg 5, H start - was 0x04 */
diff --git a/drivers/media/usb/gspca/mr97310a.c b/drivers/media/usb/gspca/mr97310a.c
index 68bb2f3..f006e29 100644
--- a/drivers/media/usb/gspca/mr97310a.c
+++ b/drivers/media/usb/gspca/mr97310a.c
@@ -521,7 +521,7 @@ static int start_cif_cam(struct gspca_dev *gspca_dev)
 	if (sd->sensor_type)
 		data[5] = 0xbb;
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160:
 		data[9] |= 0x04;  /* reg 8, 2:1 scale down from 320 */
 		/* fall thru */
@@ -618,7 +618,7 @@ static int start_vga_cam(struct gspca_dev *gspca_dev)
 		data[10] = 0x18;
 	}
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160:
 		data[9] |= 0x0c;  /* reg 8, 4:1 scale down */
 		/* fall thru */
@@ -847,7 +847,7 @@ static void setexposure(struct gspca_dev *gspca_dev, s32 expo, s32 min_clockdiv)
 		u8 clockdiv = (60 * expo + 7999) / 8000;
 
 		/* Limit framerate to not exceed usb bandwidth */
-		if (clockdiv < min_clockdiv && gspca_dev->width >= 320)
+		if (clockdiv < min_clockdiv && gspca_dev->pixfmt.width >= 320)
 			clockdiv = min_clockdiv;
 		else if (clockdiv < 2)
 			clockdiv = 2;
diff --git a/drivers/media/usb/gspca/nw80x.c b/drivers/media/usb/gspca/nw80x.c
index 44c9964..599f755 100644
--- a/drivers/media/usb/gspca/nw80x.c
+++ b/drivers/media/usb/gspca/nw80x.c
@@ -1708,7 +1708,7 @@ static void setautogain(struct gspca_dev *gspca_dev, s32 val)
 
 	reg_r(gspca_dev, 0x1004, 1);
 	if (gspca_dev->usb_buf[0] & 0x04) {	/* if AE_FULL_FRM */
-		sd->ae_res = gspca_dev->width * gspca_dev->height;
+		sd->ae_res = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height;
 	} else {				/* get the AE window size */
 		reg_r(gspca_dev, 0x1011, 8);
 		w = (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0]
@@ -1717,7 +1717,8 @@ static void setautogain(struct gspca_dev *gspca_dev, s32 val)
 		  - (gspca_dev->usb_buf[7] << 8) - gspca_dev->usb_buf[6];
 		sd->ae_res = h * w;
 		if (sd->ae_res == 0)
-			sd->ae_res = gspca_dev->width * gspca_dev->height;
+			sd->ae_res = gspca_dev->pixfmt.width *
+					gspca_dev->pixfmt.height;
 	}
 }
 
@@ -1856,21 +1857,21 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	reg_w_buf(gspca_dev, cmd);
 	switch (sd->webcam) {
 	case P35u:
-		if (gspca_dev->width == 320)
+		if (gspca_dev->pixfmt.width == 320)
 			reg_w_buf(gspca_dev, nw801_start_qvga);
 		else
 			reg_w_buf(gspca_dev, nw801_start_vga);
 		reg_w_buf(gspca_dev, nw801_start_2);
 		break;
 	case Kr651us:
-		if (gspca_dev->width == 320)
+		if (gspca_dev->pixfmt.width == 320)
 			reg_w_buf(gspca_dev, kr651_start_qvga);
 		else
 			reg_w_buf(gspca_dev, kr651_start_vga);
 		reg_w_buf(gspca_dev, kr651_start_2);
 		break;
 	case Proscope:
-		if (gspca_dev->width == 320)
+		if (gspca_dev->pixfmt.width == 320)
 			reg_w_buf(gspca_dev, proscope_start_qvga);
 		else
 			reg_w_buf(gspca_dev, proscope_start_vga);
diff --git a/drivers/media/usb/gspca/ov519.c b/drivers/media/usb/gspca/ov519.c
index a3958ee..bdfc49f 100644
--- a/drivers/media/usb/gspca/ov519.c
+++ b/drivers/media/usb/gspca/ov519.c
@@ -3466,7 +3466,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
 
 	switch (sd->bridge) {
 	case BRIDGE_OVFX2:
-		if (gspca_dev->width != 800)
+		if (gspca_dev->pixfmt.width != 800)
 			gspca_dev->cam.bulk_size = OVFX2_BULK_SIZE;
 		else
 			gspca_dev->cam.bulk_size = 7 * 4096;
@@ -3505,8 +3505,8 @@ static void ov511_mode_init_regs(struct sd *sd)
 	/* Here I'm assuming that snapshot size == image size.
 	 * I hope that's always true. --claudio
 	 */
-	hsegs = (sd->gspca_dev.width >> 3) - 1;
-	vsegs = (sd->gspca_dev.height >> 3) - 1;
+	hsegs = (sd->gspca_dev.pixfmt.width >> 3) - 1;
+	vsegs = (sd->gspca_dev.pixfmt.height >> 3) - 1;
 
 	reg_w(sd, R511_CAM_PXCNT, hsegs);
 	reg_w(sd, R511_CAM_LNCNT, vsegs);
@@ -3539,7 +3539,7 @@ static void ov511_mode_init_regs(struct sd *sd)
 	case SEN_OV7640:
 	case SEN_OV7648:
 	case SEN_OV76BE:
-		if (sd->gspca_dev.width == 320)
+		if (sd->gspca_dev.pixfmt.width == 320)
 			interlaced = 1;
 		/* Fall through */
 	case SEN_OV6630:
@@ -3549,7 +3549,7 @@ static void ov511_mode_init_regs(struct sd *sd)
 		case 30:
 		case 25:
 			/* Not enough bandwidth to do 640x480 @ 30 fps */
-			if (sd->gspca_dev.width != 640) {
+			if (sd->gspca_dev.pixfmt.width != 640) {
 				sd->clockdiv = 0;
 				break;
 			}
@@ -3582,7 +3582,8 @@ static void ov511_mode_init_regs(struct sd *sd)
 
 	/* Check if we have enough bandwidth to disable compression */
 	fps = (interlaced ? 60 : 30) / (sd->clockdiv + 1) + 1;
-	needed = fps * sd->gspca_dev.width * sd->gspca_dev.height * 3 / 2;
+	needed = fps * sd->gspca_dev.pixfmt.width *
+			sd->gspca_dev.pixfmt.height * 3 / 2;
 	/* 1000 isoc packets/sec */
 	if (needed > 1000 * packet_size) {
 		/* Enable Y and UV quantization and compression */
@@ -3644,8 +3645,8 @@ static void ov518_mode_init_regs(struct sd *sd)
 		reg_w(sd, 0x38, 0x80);
 	}
 
-	hsegs = sd->gspca_dev.width / 16;
-	vsegs = sd->gspca_dev.height / 4;
+	hsegs = sd->gspca_dev.pixfmt.width / 16;
+	vsegs = sd->gspca_dev.pixfmt.height / 4;
 
 	reg_w(sd, 0x29, hsegs);
 	reg_w(sd, 0x2a, vsegs);
@@ -3668,7 +3669,7 @@ static void ov518_mode_init_regs(struct sd *sd)
 	if (sd->bridge == BRIDGE_OV518PLUS) {
 		switch (sd->sensor) {
 		case SEN_OV7620AE:
-			if (sd->gspca_dev.width == 320) {
+			if (sd->gspca_dev.pixfmt.width == 320) {
 				reg_w(sd, 0x20, 0x00);
 				reg_w(sd, 0x21, 0x19);
 			} else {
@@ -3794,8 +3795,8 @@ static void ov519_mode_init_regs(struct sd *sd)
 		break;
 	}
 
-	reg_w(sd, OV519_R10_H_SIZE,	sd->gspca_dev.width >> 4);
-	reg_w(sd, OV519_R11_V_SIZE,	sd->gspca_dev.height >> 3);
+	reg_w(sd, OV519_R10_H_SIZE,	sd->gspca_dev.pixfmt.width >> 4);
+	reg_w(sd, OV519_R11_V_SIZE,	sd->gspca_dev.pixfmt.height >> 3);
 	if (sd->sensor == SEN_OV7670 &&
 	    sd->gspca_dev.cam.cam_mode[sd->gspca_dev.curr_mode].priv)
 		reg_w(sd, OV519_R12_X_OFFSETL, 0x04);
@@ -3929,14 +3930,16 @@ static void mode_init_ov_sensor_regs(struct sd *sd)
 	    }
 	case SEN_OV3610:
 		if (qvga) {
-			xstart = (1040 - gspca_dev->width) / 2 + (0x1f << 4);
-			ystart = (776 - gspca_dev->height) / 2;
+			xstart = (1040 - gspca_dev->pixfmt.width) / 2 +
+				(0x1f << 4);
+			ystart = (776 - gspca_dev->pixfmt.height) / 2;
 		} else {
-			xstart = (2076 - gspca_dev->width) / 2 + (0x10 << 4);
-			ystart = (1544 - gspca_dev->height) / 2;
+			xstart = (2076 - gspca_dev->pixfmt.width) / 2 +
+				(0x10 << 4);
+			ystart = (1544 - gspca_dev->pixfmt.height) / 2;
 		}
-		xend = xstart + gspca_dev->width;
-		yend = ystart + gspca_dev->height;
+		xend = xstart + gspca_dev->pixfmt.width;
+		yend = ystart + gspca_dev->pixfmt.height;
 		/* Writing to the COMH register resets the other windowing regs
 		   to their default values, so we must do this first. */
 		i2c_w_mask(sd, 0x12, qvga ? 0x40 : 0x00, 0xf0);
@@ -4211,8 +4214,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	struct sd *sd = (struct sd *) gspca_dev;
 
 	/* Default for most bridges, allow bridge_mode_init_regs to override */
-	sd->sensor_width = sd->gspca_dev.width;
-	sd->sensor_height = sd->gspca_dev.height;
+	sd->sensor_width = sd->gspca_dev.pixfmt.width;
+	sd->sensor_height = sd->gspca_dev.pixfmt.height;
 
 	switch (sd->bridge) {
 	case BRIDGE_OV511:
@@ -4327,12 +4330,13 @@ static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
 		ov51x_handle_button(gspca_dev, (in[8] >> 2) & 1);
 		if (in[8] & 0x80) {
 			/* Frame end */
-			if ((in[9] + 1) * 8 != gspca_dev->width ||
-			    (in[10] + 1) * 8 != gspca_dev->height) {
+			if ((in[9] + 1) * 8 != gspca_dev->pixfmt.width ||
+			    (in[10] + 1) * 8 != gspca_dev->pixfmt.height) {
 				PERR("Invalid frame size, got: %dx%d,"
 					" requested: %dx%d\n",
 					(in[9] + 1) * 8, (in[10] + 1) * 8,
-					gspca_dev->width, gspca_dev->height);
+					gspca_dev->pixfmt.width,
+					gspca_dev->pixfmt.height);
 				gspca_dev->last_packet_type = DISCARD_PACKET;
 				return;
 			}
@@ -4452,7 +4456,8 @@ static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev,
 		if (sd->first_frame) {
 			sd->first_frame--;
 			if (gspca_dev->image_len <
-				  sd->gspca_dev.width * sd->gspca_dev.height)
+				  sd->gspca_dev.pixfmt.width *
+					sd->gspca_dev.pixfmt.height)
 				gspca_dev->last_packet_type = DISCARD_PACKET;
 		}
 		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
diff --git a/drivers/media/usb/gspca/ov534.c b/drivers/media/usb/gspca/ov534.c
index 2e28c81..4df6b77 100644
--- a/drivers/media/usb/gspca/ov534.c
+++ b/drivers/media/usb/gspca/ov534.c
@@ -1441,9 +1441,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
 		/* If this packet is marked as EOF, end the frame */
 		} else if (data[1] & UVC_STREAM_EOF) {
 			sd->last_pts = 0;
-			if (gspca_dev->pixfmt == V4L2_PIX_FMT_YUYV
+			if (gspca_dev->pixfmt.pixelformat == V4L2_PIX_FMT_YUYV
 			 && gspca_dev->image_len + len - 12 !=
-				   gspca_dev->width * gspca_dev->height * 2) {
+				   gspca_dev->pixfmt.width *
+					gspca_dev->pixfmt.height * 2) {
 				PDEBUG(D_PACK, "wrong sized frame");
 				goto discard;
 			}
diff --git a/drivers/media/usb/gspca/pac207.c b/drivers/media/usb/gspca/pac207.c
index 83519be..cd79c18 100644
--- a/drivers/media/usb/gspca/pac207.c
+++ b/drivers/media/usb/gspca/pac207.c
@@ -299,7 +299,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	pac207_write_regs(gspca_dev, 0x0042, pac207_sensor_init[3], 8);
 
 	/* Compression Balance */
-	if (gspca_dev->width == 176)
+	if (gspca_dev->pixfmt.width == 176)
 		pac207_write_reg(gspca_dev, 0x4a, 0xff);
 	else
 		pac207_write_reg(gspca_dev, 0x4a, 0x30);
@@ -317,7 +317,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 		mode = 0x00;
 	else
 		mode = 0x02;
-	if (gspca_dev->width == 176) {	/* 176x144 */
+	if (gspca_dev->pixfmt.width == 176) {	/* 176x144 */
 		mode |= 0x01;
 		PDEBUG(D_STREAM, "pac207_start mode 176x144");
 	} else {				/* 352x288 */
diff --git a/drivers/media/usb/gspca/pac7311.c b/drivers/media/usb/gspca/pac7311.c
index 1a5bdc8..25f86b1 100644
--- a/drivers/media/usb/gspca/pac7311.c
+++ b/drivers/media/usb/gspca/pac7311.c
@@ -326,7 +326,7 @@ static void setexposure(struct gspca_dev *gspca_dev, s32 val)
 	 *  640x480 mode and page 4 reg 2 <= 3 then it must be 9
 	 */
 	reg_w(gspca_dev, 0xff, 0x01);
-	if (gspca_dev->width != 640 && val <= 3)
+	if (gspca_dev->pixfmt.width != 640 && val <= 3)
 		reg_w(gspca_dev, 0x08, 0x09);
 	else
 		reg_w(gspca_dev, 0x08, 0x08);
@@ -337,7 +337,7 @@ static void setexposure(struct gspca_dev *gspca_dev, s32 val)
 	 * camera to use higher compression or we may run out of
 	 * bandwidth.
 	 */
-	if (gspca_dev->width == 640 && val == 2)
+	if (gspca_dev->pixfmt.width == 640 && val == 2)
 		reg_w(gspca_dev, 0x80, 0x01);
 	else
 		reg_w(gspca_dev, 0x80, 0x1c);
@@ -615,7 +615,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
 
 		/* Start the new frame with the jpeg header */
 		pac_start_frame(gspca_dev,
-			gspca_dev->height, gspca_dev->width);
+			gspca_dev->pixfmt.height, gspca_dev->pixfmt.width);
 	}
 	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
 }
diff --git a/drivers/media/usb/gspca/se401.c b/drivers/media/usb/gspca/se401.c
index 5f729b8..5102cea 100644
--- a/drivers/media/usb/gspca/se401.c
+++ b/drivers/media/usb/gspca/se401.c
@@ -354,9 +354,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
 
 	/* set size + mode */
 	se401_write_req(gspca_dev, SE401_REQ_SET_WIDTH,
-			gspca_dev->width * mult, 0);
+			gspca_dev->pixfmt.width * mult, 0);
 	se401_write_req(gspca_dev, SE401_REQ_SET_HEIGHT,
-			gspca_dev->height * mult, 0);
+			gspca_dev->pixfmt.height * mult, 0);
 	/*
 	 * HDG: disabled this as it does not seem to do anything
 	 * se401_write_req(gspca_dev, SE401_REQ_SET_OUTPUT_MODE,
@@ -480,7 +480,7 @@ static void sd_complete_frame(struct gspca_dev *gspca_dev, u8 *data, int len)
 static void sd_pkt_scan_janggu(struct gspca_dev *gspca_dev, u8 *data, int len)
 {
 	struct sd *sd = (struct sd *)gspca_dev;
-	int imagesize = gspca_dev->width * gspca_dev->height;
+	int imagesize = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height;
 	int i, plen, bits, pixels, info, count;
 
 	if (sd->restart_stream)
diff --git a/drivers/media/usb/gspca/sn9c20x.c b/drivers/media/usb/gspca/sn9c20x.c
index f4453d5..2a38621 100644
--- a/drivers/media/usb/gspca/sn9c20x.c
+++ b/drivers/media/usb/gspca/sn9c20x.c
@@ -1955,7 +1955,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
 			return 0;
 		}
 
-		switch (gspca_dev->width) {
+		switch (gspca_dev->pixfmt.width) {
 		case 160: /* 160x120 */
 			gspca_dev->alt = 2;
 			break;
@@ -1985,8 +1985,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 {
 	struct sd *sd = (struct sd *) gspca_dev;
 	int mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
-	int width = gspca_dev->width;
-	int height = gspca_dev->height;
+	int width = gspca_dev->pixfmt.width;
+	int height = gspca_dev->pixfmt.height;
 	u8 fmt, scale = 0;
 
 	jpeg_define(sd->jpeg_hdr, height, width,
diff --git a/drivers/media/usb/gspca/sonixb.c b/drivers/media/usb/gspca/sonixb.c
index d7ff3b9..921802c 100644
--- a/drivers/media/usb/gspca/sonixb.c
+++ b/drivers/media/usb/gspca/sonixb.c
@@ -753,7 +753,7 @@ static void setexposure(struct gspca_dev *gspca_dev)
 		/* In 640x480, if the reg11 has less than 4, the image is
 		   unstable (the bridge goes into a higher compression mode
 		   which we have not reverse engineered yet). */
-		if (gspca_dev->width == 640 && reg11 < 4)
+		if (gspca_dev->pixfmt.width == 640 && reg11 < 4)
 			reg11 = 4;
 
 		/* frame exposure time in ms = 1000 * reg11 / 30    ->
diff --git a/drivers/media/usb/gspca/sonixj.c b/drivers/media/usb/gspca/sonixj.c
index 3b5ccb1..c69b45d 100644
--- a/drivers/media/usb/gspca/sonixj.c
+++ b/drivers/media/usb/gspca/sonixj.c
@@ -2204,7 +2204,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 				{ 0x14, 0xe7, 0x1e, 0xdd };
 
 	/* create the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x21);		/* JPEG 422 */
 
 	/* initialize the bridge */
diff --git a/drivers/media/usb/gspca/spca1528.c b/drivers/media/usb/gspca/spca1528.c
index 688592b..f38fd89 100644
--- a/drivers/media/usb/gspca/spca1528.c
+++ b/drivers/media/usb/gspca/spca1528.c
@@ -255,7 +255,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	struct sd *sd = (struct sd *) gspca_dev;
 
 	/* initialize the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x22);		/* JPEG 411 */
 
 	/* the JPEG quality shall be 85% */
diff --git a/drivers/media/usb/gspca/spca500.c b/drivers/media/usb/gspca/spca500.c
index 9f8bf51..f011a30 100644
--- a/drivers/media/usb/gspca/spca500.c
+++ b/drivers/media/usb/gspca/spca500.c
@@ -608,7 +608,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	__u8 xmult, ymult;
 
 	/* create the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x22);		/* JPEG 411 */
 	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
 
diff --git a/drivers/media/usb/gspca/sq905c.c b/drivers/media/usb/gspca/sq905c.c
index acb19fb..aa21edc 100644
--- a/drivers/media/usb/gspca/sq905c.c
+++ b/drivers/media/usb/gspca/sq905c.c
@@ -272,7 +272,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 
 	dev->cap_mode = gspca_dev->cam.cam_mode;
 	/* "Open the shutter" and set size, to start capture */
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 640:
 		PDEBUG(D_STREAM, "Start streaming at high resolution");
 		dev->cap_mode++;
diff --git a/drivers/media/usb/gspca/sq930x.c b/drivers/media/usb/gspca/sq930x.c
index b10d082..e274cf19 100644
--- a/drivers/media/usb/gspca/sq930x.c
+++ b/drivers/media/usb/gspca/sq930x.c
@@ -906,7 +906,8 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
 
 	gspca_dev->cam.bulk_nurbs = 1;	/* there must be one URB only */
 	sd->do_ctrl = 0;
-	gspca_dev->cam.bulk_size = gspca_dev->width * gspca_dev->height + 8;
+	gspca_dev->cam.bulk_size = gspca_dev->pixfmt.width *
+			gspca_dev->pixfmt.height + 8;
 	return 0;
 }
 
diff --git a/drivers/media/usb/gspca/stk014.c b/drivers/media/usb/gspca/stk014.c
index 8c09826..b0c70fe 100644
--- a/drivers/media/usb/gspca/stk014.c
+++ b/drivers/media/usb/gspca/stk014.c
@@ -250,7 +250,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	int ret, value;
 
 	/* create the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x22);		/* JPEG 411 */
 	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
 
@@ -261,7 +262,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	set_par(gspca_dev, 0x00000000);
 	set_par(gspca_dev, 0x8002e001);
 	set_par(gspca_dev, 0x14000000);
-	if (gspca_dev->width > 320)
+	if (gspca_dev->pixfmt.width > 320)
 		value = 0x8002e001;		/* 640x480 */
 	else
 		value = 0x4001f000;		/* 320x240 */
diff --git a/drivers/media/usb/gspca/stk1135.c b/drivers/media/usb/gspca/stk1135.c
index 5858688..5a6ed49 100644
--- a/drivers/media/usb/gspca/stk1135.c
+++ b/drivers/media/usb/gspca/stk1135.c
@@ -347,8 +347,8 @@ static void stk1135_configure_mt9m112(struct gspca_dev *gspca_dev)
 		sensor_write(gspca_dev, cfg[i].reg, cfg[i].val);
 
 	/* set output size */
-	width = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].width;
-	height = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].height;
+	width = gspca_dev->pixfmt.width;
+	height = gspca_dev->pixfmt.height;
 	if (width <= 640) { /* use context A (half readout speed by default) */
 		sensor_write(gspca_dev, 0x1a7, width);
 		sensor_write(gspca_dev, 0x1aa, height);
@@ -484,8 +484,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	reg_w(gspca_dev, STK1135_REG_CISPO + 3, 0x00);
 
 	/* set capture end position */
-	width = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].width;
-	height = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].height;
+	width = gspca_dev->pixfmt.width;
+	height = gspca_dev->pixfmt.height;
 	reg_w(gspca_dev, STK1135_REG_CIEPO + 0, width & 0xff);
 	reg_w(gspca_dev, STK1135_REG_CIEPO + 1, width >> 8);
 	reg_w(gspca_dev, STK1135_REG_CIEPO + 2, height & 0xff);
diff --git a/drivers/media/usb/gspca/stv06xx/stv06xx.c b/drivers/media/usb/gspca/stv06xx/stv06xx.c
index 55ee7a6..49d209b 100644
--- a/drivers/media/usb/gspca/stv06xx/stv06xx.c
+++ b/drivers/media/usb/gspca/stv06xx/stv06xx.c
@@ -452,7 +452,7 @@ frame_data:
 					NULL, 0);
 
 			if (sd->bridge == BRIDGE_ST6422)
-				sd->to_skip = gspca_dev->width * 4;
+				sd->to_skip = gspca_dev->pixfmt.width * 4;
 
 			if (chunk_len)
 				PERR("Chunk length is "
diff --git a/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c b/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c
index 8206b77..8d785ed 100644
--- a/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c
+++ b/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c
@@ -421,7 +421,7 @@ static int pb0100_set_autogain_target(struct gspca_dev *gspca_dev, __s32 val)
 
 	/* Number of pixels counted by the sensor when subsampling the pixels.
 	 * Slightly larger than the real value to avoid oscillation */
-	totalpixels = gspca_dev->width * gspca_dev->height;
+	totalpixels = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height;
 	totalpixels = totalpixels/(8*8) + totalpixels/(64*64);
 
 	brightpixels = (totalpixels * val) >> 8;
diff --git a/drivers/media/usb/gspca/sunplus.c b/drivers/media/usb/gspca/sunplus.c
index af8767a..a517d18 100644
--- a/drivers/media/usb/gspca/sunplus.c
+++ b/drivers/media/usb/gspca/sunplus.c
@@ -715,7 +715,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	int enable;
 
 	/* create the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x22);		/* JPEG 411 */
 	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
 
diff --git a/drivers/media/usb/gspca/topro.c b/drivers/media/usb/gspca/topro.c
index 4cb511c..640c2fe 100644
--- a/drivers/media/usb/gspca/topro.c
+++ b/drivers/media/usb/gspca/topro.c
@@ -3856,7 +3856,7 @@ static void setsharpness(struct gspca_dev *gspca_dev, s32 val)
 
 	if (sd->bridge == BRIDGE_TP6800) {
 		val |= 0x08;		/* grid compensation enable */
-		if (gspca_dev->width == 640)
+		if (gspca_dev->pixfmt.width == 640)
 			reg_w(gspca_dev, TP6800_R78_FORMAT, 0x00); /* vga */
 		else
 			val |= 0x04;		/* scaling down enable */
@@ -3880,7 +3880,7 @@ static void set_resolution(struct gspca_dev *gspca_dev)
 	struct sd *sd = (struct sd *) gspca_dev;
 
 	reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x00);
-	if (gspca_dev->width == 320) {
+	if (gspca_dev->pixfmt.width == 320) {
 		reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, 0x06);
 		msleep(100);
 		i2c_w(gspca_dev, CX0342_AUTO_ADC_CALIB, 0x01);
@@ -3924,7 +3924,7 @@ static int get_fr_idx(struct gspca_dev *gspca_dev)
 
 		/* 640x480 * 30 fps does not work */
 		if (i == 6			/* if 30 fps */
-		 && gspca_dev->width == 640)
+		 && gspca_dev->pixfmt.width == 640)
 			i = 0x05;		/* 15 fps */
 	} else {
 		for (i = 0; i < ARRAY_SIZE(rates_6810) - 1; i++) {
@@ -3935,7 +3935,7 @@ static int get_fr_idx(struct gspca_dev *gspca_dev)
 
 		/* 640x480 * 30 fps does not work */
 		if (i == 7			/* if 30 fps */
-		 && gspca_dev->width == 640)
+		 && gspca_dev->pixfmt.width == 640)
 			i = 6;			/* 15 fps */
 		i |= 0x80;			/* clock * 1 */
 	}
@@ -4554,7 +4554,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 {
 	struct sd *sd = (struct sd *) gspca_dev;
 
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width);
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width);
 	set_dqt(gspca_dev, sd->quality);
 	if (sd->bridge == BRIDGE_TP6800) {
 		if (sd->sensor == SENSOR_CX0342)
@@ -4737,7 +4738,7 @@ static void sd_dq_callback(struct gspca_dev *gspca_dev)
 			(gspca_dev->usb_buf[26] << 8) + gspca_dev->usb_buf[25] +
 			(gspca_dev->usb_buf[29] << 8) + gspca_dev->usb_buf[28])
 				/ 8;
-		if (gspca_dev->width == 640)
+		if (gspca_dev->pixfmt.width == 640)
 			luma /= 4;
 		reg_w(gspca_dev, 0x7d, 0x00);
 
diff --git a/drivers/media/usb/gspca/tv8532.c b/drivers/media/usb/gspca/tv8532.c
index 8591324..d497ba3 100644
--- a/drivers/media/usb/gspca/tv8532.c
+++ b/drivers/media/usb/gspca/tv8532.c
@@ -268,7 +268,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
 	packet_type0 = packet_type1 = INTER_PACKET;
 	if (gspca_dev->empty_packet) {
 		gspca_dev->empty_packet = 0;
-		sd->packet = gspca_dev->height / 2;
+		sd->packet = gspca_dev->pixfmt.height / 2;
 		packet_type0 = FIRST_PACKET;
 	} else if (sd->packet == 0)
 		return;			/* 2 more lines in 352x288 ! */
@@ -284,9 +284,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
 	 * - 4 bytes
 	 */
 	gspca_frame_add(gspca_dev, packet_type0,
-			data + 2, gspca_dev->width);
+			data + 2, gspca_dev->pixfmt.width);
 	gspca_frame_add(gspca_dev, packet_type1,
-			data + gspca_dev->width + 5, gspca_dev->width);
+			data + gspca_dev->pixfmt.width + 5,
+			gspca_dev->pixfmt.width);
 }
 
 static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
diff --git a/drivers/media/usb/gspca/vicam.c b/drivers/media/usb/gspca/vicam.c
index d6890bc..1689b8f 100644
--- a/drivers/media/usb/gspca/vicam.c
+++ b/drivers/media/usb/gspca/vicam.c
@@ -121,13 +121,13 @@ static int vicam_read_frame(struct gspca_dev *gspca_dev, u8 *data, int size)
 
 	memset(req_data, 0, 16);
 	req_data[0] = gain;
-	if (gspca_dev->width == 256)
+	if (gspca_dev->pixfmt.width == 256)
 		req_data[1] |= 0x01; /* low nibble x-scale */
-	if (gspca_dev->height <= 122) {
+	if (gspca_dev->pixfmt.height <= 122) {
 		req_data[1] |= 0x10; /* high nibble y-scale */
-		unscaled_height = gspca_dev->height * 2;
+		unscaled_height = gspca_dev->pixfmt.height * 2;
 	} else
-		unscaled_height = gspca_dev->height;
+		unscaled_height = gspca_dev->pixfmt.height;
 	req_data[2] = 0x90; /* unknown, does not seem to do anything */
 	if (unscaled_height <= 200)
 		req_data[3] = 0x06; /* vend? */
diff --git a/drivers/media/usb/gspca/w996Xcf.c b/drivers/media/usb/gspca/w996Xcf.c
index 2165da0..fb9fe2e 100644
--- a/drivers/media/usb/gspca/w996Xcf.c
+++ b/drivers/media/usb/gspca/w996Xcf.c
@@ -430,11 +430,11 @@ static void w9968cf_set_crop_window(struct sd *sd)
 	#define SC(x) ((x) << 10)
 
 	/* Scaling factors */
-	fw = SC(sd->gspca_dev.width) / max_width;
-	fh = SC(sd->gspca_dev.height) / max_height;
+	fw = SC(sd->gspca_dev.pixfmt.width) / max_width;
+	fh = SC(sd->gspca_dev.pixfmt.height) / max_height;
 
-	cw = (fw >= fh) ? max_width : SC(sd->gspca_dev.width) / fh;
-	ch = (fw >= fh) ? SC(sd->gspca_dev.height) / fw : max_height;
+	cw = (fw >= fh) ? max_width : SC(sd->gspca_dev.pixfmt.width) / fh;
+	ch = (fw >= fh) ? SC(sd->gspca_dev.pixfmt.height) / fw : max_height;
 
 	sd->sensor_width = max_width;
 	sd->sensor_height = max_height;
@@ -454,34 +454,34 @@ static void w9968cf_mode_init_regs(struct sd *sd)
 
 	w9968cf_set_crop_window(sd);
 
-	reg_w(sd, 0x14, sd->gspca_dev.width);
-	reg_w(sd, 0x15, sd->gspca_dev.height);
+	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.width);
-	reg_w(sd, 0x31, sd->gspca_dev.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.width / 2);
-		reg_w(sd, 0x2d, sd->gspca_dev.width / 4);
+		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.width);
+		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.width * sd->gspca_dev.height;
+	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.height,
-			    sd->gspca_dev.width, 0x22); /* JPEG 420 */
+		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);
diff --git a/drivers/media/usb/gspca/xirlink_cit.c b/drivers/media/usb/gspca/xirlink_cit.c
index 7eaf64e..101df67 100644
--- a/drivers/media/usb/gspca/xirlink_cit.c
+++ b/drivers/media/usb/gspca/xirlink_cit.c
@@ -1471,14 +1471,14 @@ static int cit_get_clock_div(struct gspca_dev *gspca_dev)
 
 	while (clock_div > 3 &&
 			1000 * packet_size >
-			gspca_dev->width * gspca_dev->height *
+			gspca_dev->pixfmt.width * gspca_dev->pixfmt.height *
 			fps[clock_div - 1] * 3 / 2)
 		clock_div--;
 
 	PDEBUG(D_PROBE,
 	       "PacketSize: %d, res: %dx%d -> using clockdiv: %d (%d fps)",
-	       packet_size, gspca_dev->width, gspca_dev->height, clock_div,
-	       fps[clock_div]);
+	       packet_size, gspca_dev->pixfmt.width, gspca_dev->pixfmt.height,
+	       clock_div, fps[clock_div]);
 
 	return clock_div;
 }
@@ -1502,7 +1502,7 @@ static int cit_start_model0(struct gspca_dev *gspca_dev)
 	cit_write_reg(gspca_dev, 0x0002, 0x0426);
 	cit_write_reg(gspca_dev, 0x0014, 0x0427);
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160: /* 160x120 */
 		cit_write_reg(gspca_dev, 0x0004, 0x010b);
 		cit_write_reg(gspca_dev, 0x0001, 0x010a);
@@ -1643,7 +1643,7 @@ static int cit_start_model1(struct gspca_dev *gspca_dev)
 	cit_write_reg(gspca_dev, 0x00, 0x0101);
 	cit_write_reg(gspca_dev, 0x00, 0x010a);
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 128: /* 128x96 */
 		cit_write_reg(gspca_dev, 0x80, 0x0103);
 		cit_write_reg(gspca_dev, 0x60, 0x0105);
@@ -1700,7 +1700,7 @@ static int cit_start_model1(struct gspca_dev *gspca_dev)
 	}
 
 	/* Assorted init */
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 128: /* 128x96 */
 		cit_Packet_Format1(gspca_dev, 0x2b, 0x1e);
 		cit_write_reg(gspca_dev, 0xc9, 0x0119);	/* Same everywhere */
@@ -1753,7 +1753,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
 	cit_write_reg(gspca_dev, 0x0000, 0x0108);
 	cit_write_reg(gspca_dev, 0x0001, 0x0133);
 	cit_write_reg(gspca_dev, 0x0001, 0x0102);
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 176: /* 176x144 */
 		cit_write_reg(gspca_dev, 0x002c, 0x0103);	/* All except 320x240 */
 		cit_write_reg(gspca_dev, 0x0000, 0x0104);	/* Same */
@@ -1792,7 +1792,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
 
 	cit_write_reg(gspca_dev, 0x0000, 0x0100);	/* LED on */
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 176: /* 176x144 */
 		cit_write_reg(gspca_dev, 0x0050, 0x0111);
 		cit_write_reg(gspca_dev, 0x00d0, 0x0111);
@@ -1840,7 +1840,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
 	 * Magic control of CMOS sensor. Only lower values like
 	 * 0-3 work, and picture shifts left or right. Don't change.
 	 */
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 176: /* 176x144 */
 		cit_model2_Packet1(gspca_dev, 0x0014, 0x0002);
 		cit_model2_Packet1(gspca_dev, 0x0016, 0x0002); /* Horizontal shift */
@@ -1899,7 +1899,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
 	 * does not allow arbitrary values and apparently is a bit mask, to
 	 * be activated only at appropriate time. Don't change it randomly!
 	 */
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 176: /* 176x144 */
 		cit_model2_Packet1(gspca_dev, 0x0026, 0x00c2);
 		break;
@@ -2023,7 +2023,7 @@ static int cit_start_model3(struct gspca_dev *gspca_dev)
 	cit_model3_Packet1(gspca_dev, 0x009e, 0x0096);
 	cit_model3_Packet1(gspca_dev, 0x009f, 0x000a);
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160:
 		cit_write_reg(gspca_dev, 0x0000, 0x0101); /* Same on 160x120, 320x240 */
 		cit_write_reg(gspca_dev, 0x00a0, 0x0103); /* Same on 160x120, 320x240 */
@@ -2134,7 +2134,7 @@ static int cit_start_model3(struct gspca_dev *gspca_dev)
 	   like with the IBM netcam pro). */
 	cit_write_reg(gspca_dev, clock_div, 0x0111); /* Clock Divider */
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160:
 		cit_model3_Packet1(gspca_dev, 0x001f, 0x0000); /* Same */
 		cit_model3_Packet1(gspca_dev, 0x0039, 0x001f); /* Same */
@@ -2211,7 +2211,7 @@ static int cit_start_model4(struct gspca_dev *gspca_dev)
 	cit_write_reg(gspca_dev, 0xfffa, 0x0124);
 	cit_model4_Packet1(gspca_dev, 0x0034, 0x0000);
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 128: /* 128x96 */
 		cit_write_reg(gspca_dev, 0x0070, 0x0119);
 		cit_write_reg(gspca_dev, 0x00d0, 0x0111);
@@ -2531,7 +2531,7 @@ static int cit_start_ibm_netcam_pro(struct gspca_dev *gspca_dev)
 	cit_write_reg(gspca_dev, 0x00fc, 0x012b); /* Same */
 	cit_write_reg(gspca_dev, 0x0022, 0x012a); /* Same */
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160: /* 160x120 */
 		cit_write_reg(gspca_dev, 0x0024, 0x010b);
 		cit_write_reg(gspca_dev, 0x0089, 0x0119);
@@ -2635,7 +2635,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
 	struct usb_host_interface *alt;
 	int max_packet_size;
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160:
 		max_packet_size = 450;
 		break;
@@ -2659,7 +2659,7 @@ static int sd_isoc_nego(struct gspca_dev *gspca_dev)
 	int ret, packet_size, min_packet_size;
 	struct usb_host_interface *alt;
 
-	switch (gspca_dev->width) {
+	switch (gspca_dev->pixfmt.width) {
 	case 160:
 		min_packet_size = 200;
 		break;
@@ -2780,7 +2780,7 @@ static u8 *cit_find_sof(struct gspca_dev *gspca_dev, u8 *data, int len)
 	case CIT_MODEL1:
 	case CIT_MODEL3:
 	case CIT_IBM_NETCAM_PRO:
-		switch (gspca_dev->width) {
+		switch (gspca_dev->pixfmt.width) {
 		case 160: /* 160x120 */
 			byte3 = 0x02;
 			byte4 = 0x0a;
diff --git a/drivers/media/usb/gspca/zc3xx.c b/drivers/media/usb/gspca/zc3xx.c
index cbfc2f9..7b95d8e 100644
--- a/drivers/media/usb/gspca/zc3xx.c
+++ b/drivers/media/usb/gspca/zc3xx.c
@@ -6700,7 +6700,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
 	};
 
 	/* create the JPEG header */
-	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
+	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
+			gspca_dev->pixfmt.width,
 			0x21);		/* JPEG 422 */
 
 	mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
-- 
Ondrej Zary


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] gspca: Support variable resolution
  2013-08-30 20:54 [PATCH 1/3] gspca: store current mode instead of individual parameters Ondrej Zary
@ 2013-08-30 20:54 ` Ondrej Zary
  2013-08-30 20:54   ` [PATCH 3/3] gspca-stk1135: Add variable resolution support Ondrej Zary
  2013-09-09 11:42 ` [PATCH 1/3] gspca: store current mode instead of individual parameters Hans de Goede
  1 sibling, 1 reply; 4+ messages in thread
From: Ondrej Zary @ 2013-08-30 20:54 UTC (permalink / raw)
  To: linux-media

Add variable resolution support to gspca by allowing subdrivers to
specify try_fmt and enum_framesizes functions.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
---
 drivers/media/usb/gspca/gspca.c |   20 ++++++++++++++------
 drivers/media/usb/gspca/gspca.h |    6 ++++++
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
index 9ffcce6..423c7c8 100644
--- a/drivers/media/usb/gspca/gspca.c
+++ b/drivers/media/usb/gspca/gspca.c
@@ -1133,6 +1133,12 @@ static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
 			mode = mode2;
 	}
 	fmt->fmt.pix = gspca_dev->cam.cam_mode[mode];
+	if (gspca_dev->sd_desc->try_fmt) {
+		/* pass original resolution to subdriver try_fmt */
+		fmt->fmt.pix.width = w;
+		fmt->fmt.pix.height = h;
+		gspca_dev->sd_desc->try_fmt(gspca_dev, fmt);
+	}
 	/* some drivers use priv internally, zero it before giving it to
 	   userspace */
 	fmt->fmt.pix.priv = 0;
@@ -1171,17 +1177,16 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
 		goto out;
 	}
 
-	if (ret == gspca_dev->curr_mode) {
-		ret = 0;
-		goto out;			/* same mode */
-	}
-
 	if (gspca_dev->streaming) {
 		ret = -EBUSY;
 		goto out;
 	}
 	gspca_dev->curr_mode = ret;
-	gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret];
+	if (gspca_dev->sd_desc->try_fmt)
+		/* subdriver try_fmt can modify format parameters */
+		gspca_dev->pixfmt = fmt->fmt.pix;
+	else
+		gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret];
 
 	ret = 0;
 out:
@@ -1196,6 +1201,9 @@ static int vidioc_enum_framesizes(struct file *file, void *priv,
 	int i;
 	__u32 index = 0;
 
+	if (gspca_dev->sd_desc->enum_framesizes)
+		return gspca_dev->sd_desc->enum_framesizes(gspca_dev, fsize);
+
 	for (i = 0; i < gspca_dev->cam.nmodes; i++) {
 		if (fsize->pixel_format !=
 				gspca_dev->cam.cam_mode[i].pixelformat)
diff --git a/drivers/media/usb/gspca/gspca.h b/drivers/media/usb/gspca/gspca.h
index 0f3d150..300642d 100644
--- a/drivers/media/usb/gspca/gspca.h
+++ b/drivers/media/usb/gspca/gspca.h
@@ -88,6 +88,10 @@ typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,
 typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev,
 				u8 *data,
 				int len);
+typedef void (*cam_format_op) (struct gspca_dev *gspca_dev,
+				struct v4l2_format *fmt);
+typedef int (*cam_frmsize_op) (struct gspca_dev *gspca_dev,
+				struct v4l2_frmsizeenum *fsize);
 
 /* subdriver description */
 struct sd_desc {
@@ -109,6 +113,8 @@ struct sd_desc {
 	cam_set_jpg_op set_jcomp;
 	cam_streamparm_op get_streamparm;
 	cam_streamparm_op set_streamparm;
+	cam_format_op try_fmt;
+	cam_frmsize_op enum_framesizes;
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 	cam_set_reg_op set_register;
 	cam_get_reg_op get_register;
-- 
Ondrej Zary


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] gspca-stk1135: Add variable resolution support
  2013-08-30 20:54 ` [PATCH 2/3] gspca: Support variable resolution Ondrej Zary
@ 2013-08-30 20:54   ` Ondrej Zary
  0 siblings, 0 replies; 4+ messages in thread
From: Ondrej Zary @ 2013-08-30 20:54 UTC (permalink / raw)
  To: linux-media

Add variable resolution support to Syntek STK1135 subdriver.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
---
 drivers/media/usb/gspca/stk1135.c |   68 ++++++++++++++++++------------------
 1 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/drivers/media/usb/gspca/stk1135.c b/drivers/media/usb/gspca/stk1135.c
index 5a6ed49..8add2f7 100644
--- a/drivers/media/usb/gspca/stk1135.c
+++ b/drivers/media/usb/gspca/stk1135.c
@@ -48,42 +48,11 @@ struct sd {
 };
 
 static const struct v4l2_pix_format stk1135_modes[] = {
-	{160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 160,
-		.sizeimage = 160 * 120,
-		.colorspace = V4L2_COLORSPACE_SRGB},
-	{176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 176,
-		.sizeimage = 176 * 144,
-		.colorspace = V4L2_COLORSPACE_SRGB},
-	{320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 320,
-		.sizeimage = 320 * 240,
-		.colorspace = V4L2_COLORSPACE_SRGB},
-	{352, 288, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 352,
-		.sizeimage = 352 * 288,
-		.colorspace = V4L2_COLORSPACE_SRGB},
+	/* default mode (this driver supports variable resolution) */
 	{640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
 		.bytesperline = 640,
 		.sizeimage = 640 * 480,
 		.colorspace = V4L2_COLORSPACE_SRGB},
-	{720, 576, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 720,
-		.sizeimage = 720 * 576,
-		.colorspace = V4L2_COLORSPACE_SRGB},
-	{800, 600, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 800,
-		.sizeimage = 800 * 600,
-		.colorspace = V4L2_COLORSPACE_SRGB},
-	{1024, 768, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 1024,
-		.sizeimage = 1024 * 768,
-		.colorspace = V4L2_COLORSPACE_SRGB},
-	{1280, 1024, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
-		.bytesperline = 1280,
-		.sizeimage = 1280 * 1024,
-		.colorspace = V4L2_COLORSPACE_SRGB},
 };
 
 /* -- read a register -- */
@@ -349,14 +318,14 @@ static void stk1135_configure_mt9m112(struct gspca_dev *gspca_dev)
 	/* set output size */
 	width = gspca_dev->pixfmt.width;
 	height = gspca_dev->pixfmt.height;
-	if (width <= 640) { /* use context A (half readout speed by default) */
+	if (width <= 640 && height <= 512) { /* context A (half readout speed)*/
 		sensor_write(gspca_dev, 0x1a7, width);
 		sensor_write(gspca_dev, 0x1aa, height);
 		/* set read mode context A */
 		sensor_write(gspca_dev, 0x0c8, 0x0000);
 		/* set resize, read mode, vblank, hblank context A */
 		sensor_write(gspca_dev, 0x2c8, 0x0000);
-	} else { /* use context B (full readout speed by default) */
+	} else { /* context B (full readout speed) */
 		sensor_write(gspca_dev, 0x1a1, width);
 		sensor_write(gspca_dev, 0x1a4, height);
 		/* set read mode context B */
@@ -643,6 +612,35 @@ static int sd_init_controls(struct gspca_dev *gspca_dev)
 	return 0;
 }
 
+void stk1135_try_fmt(struct gspca_dev *gspca_dev, struct v4l2_format *fmt)
+{
+	fmt->fmt.pix.width = clamp(fmt->fmt.pix.width, 32U, 1280U);
+	fmt->fmt.pix.height = clamp(fmt->fmt.pix.height, 32U, 1024U);
+	/* round up to even numbers */
+	fmt->fmt.pix.width += (fmt->fmt.pix.width & 1);
+	fmt->fmt.pix.height += (fmt->fmt.pix.height & 1);
+
+	fmt->fmt.pix.bytesperline = fmt->fmt.pix.width;
+	fmt->fmt.pix.sizeimage = fmt->fmt.pix.width * fmt->fmt.pix.height;
+}
+
+int stk1135_enum_framesizes(struct gspca_dev *gspca_dev,
+			struct v4l2_frmsizeenum *fsize)
+{
+	if (fsize->index != 0 || fsize->pixel_format != V4L2_PIX_FMT_SBGGR8)
+		return -EINVAL;
+
+	fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
+	fsize->stepwise.min_width = 32;
+	fsize->stepwise.min_height = 32;
+	fsize->stepwise.max_width = 1280;
+	fsize->stepwise.max_height = 1024;
+	fsize->stepwise.step_width = 2;
+	fsize->stepwise.step_height = 2;
+
+	return 0;
+}
+
 /* sub-driver description */
 static const struct sd_desc sd_desc = {
 	.name = MODULE_NAME,
@@ -653,6 +651,8 @@ static const struct sd_desc sd_desc = {
 	.stopN = sd_stopN,
 	.pkt_scan = sd_pkt_scan,
 	.dq_callback = stk1135_dq_callback,
+	.try_fmt = stk1135_try_fmt,
+	.enum_framesizes = stk1135_enum_framesizes,
 };
 
 /* -- module initialisation -- */
-- 
Ondrej Zary


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/3] gspca: store current mode instead of individual parameters
  2013-08-30 20:54 [PATCH 1/3] gspca: store current mode instead of individual parameters Ondrej Zary
  2013-08-30 20:54 ` [PATCH 2/3] gspca: Support variable resolution Ondrej Zary
@ 2013-09-09 11:42 ` Hans de Goede
  1 sibling, 0 replies; 4+ messages in thread
From: Hans de Goede @ 2013-09-09 11:42 UTC (permalink / raw)
  To: Ondrej Zary; +Cc: linux-media

Hi,

Thanks! I've added these to my gspca tree for 3.13, and send a pull-request
with these for 3.13 to Mauro.

Regards,

Hans


On 08/30/2013 10:54 PM, Ondrej Zary wrote:
> Store complete current mode (struct v4l2_pix_format) in struct gspca_dev
> instead of separate pixfmt, width and height parameters.
>
> This is a preparation for variable resolution support.
>
> Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
> ---
>   drivers/media/usb/gspca/conex.c                  |    3 +-
>   drivers/media/usb/gspca/cpia1.c                  |    4 +-
>   drivers/media/usb/gspca/gspca.c                  |   30 +++++--------
>   drivers/media/usb/gspca/gspca.h                  |    4 +-
>   drivers/media/usb/gspca/jeilinj.c                |    5 +-
>   drivers/media/usb/gspca/jl2005bcd.c              |    2 +-
>   drivers/media/usb/gspca/m5602/m5602_mt9m111.c    |    2 +-
>   drivers/media/usb/gspca/mars.c                   |    7 ++-
>   drivers/media/usb/gspca/mr97310a.c               |    6 +-
>   drivers/media/usb/gspca/nw80x.c                  |   11 +++--
>   drivers/media/usb/gspca/ov519.c                  |   51 ++++++++++++----------
>   drivers/media/usb/gspca/ov534.c                  |    5 +-
>   drivers/media/usb/gspca/pac207.c                 |    4 +-
>   drivers/media/usb/gspca/pac7311.c                |    6 +-
>   drivers/media/usb/gspca/se401.c                  |    6 +-
>   drivers/media/usb/gspca/sn9c20x.c                |    6 +-
>   drivers/media/usb/gspca/sonixb.c                 |    2 +-
>   drivers/media/usb/gspca/sonixj.c                 |    3 +-
>   drivers/media/usb/gspca/spca1528.c               |    3 +-
>   drivers/media/usb/gspca/spca500.c                |    3 +-
>   drivers/media/usb/gspca/sq905c.c                 |    2 +-
>   drivers/media/usb/gspca/sq930x.c                 |    3 +-
>   drivers/media/usb/gspca/stk014.c                 |    5 +-
>   drivers/media/usb/gspca/stk1135.c                |    8 ++--
>   drivers/media/usb/gspca/stv06xx/stv06xx.c        |    2 +-
>   drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c |    2 +-
>   drivers/media/usb/gspca/sunplus.c                |    3 +-
>   drivers/media/usb/gspca/topro.c                  |   13 +++---
>   drivers/media/usb/gspca/tv8532.c                 |    7 ++-
>   drivers/media/usb/gspca/vicam.c                  |    8 ++--
>   drivers/media/usb/gspca/w996Xcf.c                |   28 ++++++------
>   drivers/media/usb/gspca/xirlink_cit.c            |   34 +++++++-------
>   drivers/media/usb/gspca/zc3xx.c                  |    3 +-
>   33 files changed, 145 insertions(+), 136 deletions(-)
>
> diff --git a/drivers/media/usb/gspca/conex.c b/drivers/media/usb/gspca/conex.c
> index 38714df..2e15c80 100644
> --- a/drivers/media/usb/gspca/conex.c
> +++ b/drivers/media/usb/gspca/conex.c
> @@ -783,7 +783,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	struct sd *sd = (struct sd *) gspca_dev;
>
>   	/* create the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x22);		/* JPEG 411 */
>   	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
>
> diff --git a/drivers/media/usb/gspca/cpia1.c b/drivers/media/usb/gspca/cpia1.c
> index 064b530..f23df4a 100644
> --- a/drivers/media/usb/gspca/cpia1.c
> +++ b/drivers/media/usb/gspca/cpia1.c
> @@ -1553,9 +1553,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   		sd->params.format.videoSize = VIDEOSIZE_CIF;
>
>   	sd->params.roi.colEnd = sd->params.roi.colStart +
> -				(gspca_dev->width >> 3);
> +				(gspca_dev->pixfmt.width >> 3);
>   	sd->params.roi.rowEnd = sd->params.roi.rowStart +
> -				(gspca_dev->height >> 2);
> +				(gspca_dev->pixfmt.height >> 2);
>
>   	/* And now set the camera to a known state */
>   	ret = do_command(gspca_dev, CPIA_COMMAND_SetGrabMode,
> diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
> index b7ae872..9ffcce6 100644
> --- a/drivers/media/usb/gspca/gspca.c
> +++ b/drivers/media/usb/gspca/gspca.c
> @@ -504,8 +504,7 @@ static int frame_alloc(struct gspca_dev *gspca_dev, struct file *file,
>   	unsigned int frsz;
>   	int i;
>
> -	i = gspca_dev->curr_mode;
> -	frsz = gspca_dev->cam.cam_mode[i].sizeimage;
> +	frsz = gspca_dev->pixfmt.sizeimage;
>   	PDEBUG(D_STREAM, "frame alloc frsz: %d", frsz);
>   	frsz = PAGE_ALIGN(frsz);
>   	if (count >= GSPCA_MAX_FRAMES)
> @@ -627,16 +626,14 @@ static struct usb_host_endpoint *alt_xfer(struct usb_host_interface *alt,
>   static u32 which_bandwidth(struct gspca_dev *gspca_dev)
>   {
>   	u32 bandwidth;
> -	int i;
>
>   	/* get the (max) image size */
> -	i = gspca_dev->curr_mode;
> -	bandwidth = gspca_dev->cam.cam_mode[i].sizeimage;
> +	bandwidth = gspca_dev->pixfmt.sizeimage;
>
>   	/* if the image is compressed, estimate its mean size */
>   	if (!gspca_dev->cam.needs_full_bandwidth &&
> -	    bandwidth < gspca_dev->cam.cam_mode[i].width *
> -				gspca_dev->cam.cam_mode[i].height)
> +	    bandwidth < gspca_dev->pixfmt.width *
> +				gspca_dev->pixfmt.height)
>   		bandwidth = bandwidth * 3 / 8;	/* 0.375 */
>
>   	/* estimate the frame rate */
> @@ -650,7 +647,7 @@ static u32 which_bandwidth(struct gspca_dev *gspca_dev)
>
>   		/* don't hope more than 15 fps with USB 1.1 and
>   		 * image resolution >= 640x480 */
> -		if (gspca_dev->width >= 640
> +		if (gspca_dev->pixfmt.width >= 640
>   		 && gspca_dev->dev->speed == USB_SPEED_FULL)
>   			bandwidth *= 15;		/* 15 fps */
>   		else
> @@ -982,9 +979,7 @@ static void gspca_set_default_mode(struct gspca_dev *gspca_dev)
>
>   	i = gspca_dev->cam.nmodes - 1;	/* take the highest mode */
>   	gspca_dev->curr_mode = i;
> -	gspca_dev->width = gspca_dev->cam.cam_mode[i].width;
> -	gspca_dev->height = gspca_dev->cam.cam_mode[i].height;
> -	gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i].pixelformat;
> +	gspca_dev->pixfmt = gspca_dev->cam.cam_mode[i];
>
>   	/* does nothing if ctrl_handler == NULL */
>   	v4l2_ctrl_handler_setup(gspca_dev->vdev.ctrl_handler);
> @@ -1105,10 +1100,8 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
>   			    struct v4l2_format *fmt)
>   {
>   	struct gspca_dev *gspca_dev = video_drvdata(file);
> -	int mode;
>
> -	mode = gspca_dev->curr_mode;
> -	fmt->fmt.pix = gspca_dev->cam.cam_mode[mode];
> +	fmt->fmt.pix = gspca_dev->pixfmt;
>   	/* some drivers use priv internally, zero it before giving it to
>   	   userspace */
>   	fmt->fmt.pix.priv = 0;
> @@ -1187,10 +1180,8 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
>   		ret = -EBUSY;
>   		goto out;
>   	}
> -	gspca_dev->width = fmt->fmt.pix.width;
> -	gspca_dev->height = fmt->fmt.pix.height;
> -	gspca_dev->pixfmt = fmt->fmt.pix.pixelformat;
>   	gspca_dev->curr_mode = ret;
> +	gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret];
>
>   	ret = 0;
>   out:
> @@ -1467,8 +1458,9 @@ static int vidioc_streamon(struct file *file, void *priv,
>   		if (ret < 0)
>   			goto out;
>   	}
> -	PDEBUG_MODE(gspca_dev, D_STREAM, "stream on OK", gspca_dev->pixfmt,
> -		    gspca_dev->width, gspca_dev->height);
> +	PDEBUG_MODE(gspca_dev, D_STREAM, "stream on OK",
> +		    gspca_dev->pixfmt.pixelformat,
> +		    gspca_dev->pixfmt.width, gspca_dev->pixfmt.height);
>   	ret = 0;
>   out:
>   	mutex_unlock(&gspca_dev->queue_lock);
> diff --git a/drivers/media/usb/gspca/gspca.h b/drivers/media/usb/gspca/gspca.h
> index ac0b11f..0f3d150 100644
> --- a/drivers/media/usb/gspca/gspca.h
> +++ b/drivers/media/usb/gspca/gspca.h
> @@ -183,9 +183,7 @@ struct gspca_dev {
>   	__u8 streaming;			/* protected by both mutexes (*) */
>
>   	__u8 curr_mode;			/* current camera mode */
> -	__u32 pixfmt;			/* current mode parameters */
> -	__u16 width;
> -	__u16 height;
> +	struct v4l2_pix_format pixfmt;	/* current mode parameters */
>   	__u32 sequence;			/* frame sequence number */
>
>   	wait_queue_head_t wq;		/* wait queue */
> diff --git a/drivers/media/usb/gspca/jeilinj.c b/drivers/media/usb/gspca/jeilinj.c
> index 8da3dde..19736e2 100644
> --- a/drivers/media/usb/gspca/jeilinj.c
> +++ b/drivers/media/usb/gspca/jeilinj.c
> @@ -378,11 +378,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	struct sd *dev = (struct sd *) gspca_dev;
>
>   	/* create the JPEG header */
> -	jpeg_define(dev->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(dev->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x21);          /* JPEG 422 */
>   	jpeg_set_qual(dev->jpeg_hdr, dev->quality);
>   	PDEBUG(D_STREAM, "Start streaming at %dx%d",
> -		gspca_dev->height, gspca_dev->width);
> +		gspca_dev->pixfmt.height, gspca_dev->pixfmt.width);
>   	jlj_start(gspca_dev);
>   	return gspca_dev->usb_err;
>   }
> diff --git a/drivers/media/usb/gspca/jl2005bcd.c b/drivers/media/usb/gspca/jl2005bcd.c
> index fdaeeb1..5b481fa 100644
> --- a/drivers/media/usb/gspca/jl2005bcd.c
> +++ b/drivers/media/usb/gspca/jl2005bcd.c
> @@ -455,7 +455,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	struct sd *sd = (struct sd *) gspca_dev;
>   	sd->cap_mode = gspca_dev->cam.cam_mode;
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 640:
>   		PDEBUG(D_STREAM, "Start streaming at vga resolution");
>   		jl2005c_stream_start_vga_lg(gspca_dev);
> diff --git a/drivers/media/usb/gspca/m5602/m5602_mt9m111.c b/drivers/media/usb/gspca/m5602/m5602_mt9m111.c
> index cfa4663..27fcef1 100644
> --- a/drivers/media/usb/gspca/m5602/m5602_mt9m111.c
> +++ b/drivers/media/usb/gspca/m5602/m5602_mt9m111.c
> @@ -266,7 +266,7 @@ static int mt9m111_set_hvflip(struct gspca_dev *gspca_dev)
>   		return err;
>
>   	data[0] = MT9M111_RMB_OVER_SIZED;
> -	if (gspca_dev->width == 640) {
> +	if (gspca_dev->pixfmt.width == 640) {
>   		data[1] = MT9M111_RMB_ROW_SKIP_2X |
>   			  MT9M111_RMB_COLUMN_SKIP_2X |
>   			  (hflip << 1) | vflip;
> diff --git a/drivers/media/usb/gspca/mars.c b/drivers/media/usb/gspca/mars.c
> index ff2c5ab..779a878 100644
> --- a/drivers/media/usb/gspca/mars.c
> +++ b/drivers/media/usb/gspca/mars.c
> @@ -254,7 +254,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	int i;
>
>   	/* create the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x21);		/* JPEG 422 */
>   	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
>
> @@ -270,8 +271,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	data[0] = 0x00;		/* address */
>   	data[1] = 0x0c | 0x01;	/* reg 0 */
>   	data[2] = 0x01;		/* reg 1 */
> -	data[3] = gspca_dev->width / 8;		/* h_size , reg 2 */
> -	data[4] = gspca_dev->height / 8;	/* v_size , reg 3 */
> +	data[3] = gspca_dev->pixfmt.width / 8;	/* h_size , reg 2 */
> +	data[4] = gspca_dev->pixfmt.height / 8;	/* v_size , reg 3 */
>   	data[5] = 0x30;		/* reg 4, MI, PAS5101 :
>   				 *	0x30 for 24mhz , 0x28 for 12mhz */
>   	data[6] = 0x02;		/* reg 5, H start - was 0x04 */
> diff --git a/drivers/media/usb/gspca/mr97310a.c b/drivers/media/usb/gspca/mr97310a.c
> index 68bb2f3..f006e29 100644
> --- a/drivers/media/usb/gspca/mr97310a.c
> +++ b/drivers/media/usb/gspca/mr97310a.c
> @@ -521,7 +521,7 @@ static int start_cif_cam(struct gspca_dev *gspca_dev)
>   	if (sd->sensor_type)
>   		data[5] = 0xbb;
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160:
>   		data[9] |= 0x04;  /* reg 8, 2:1 scale down from 320 */
>   		/* fall thru */
> @@ -618,7 +618,7 @@ static int start_vga_cam(struct gspca_dev *gspca_dev)
>   		data[10] = 0x18;
>   	}
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160:
>   		data[9] |= 0x0c;  /* reg 8, 4:1 scale down */
>   		/* fall thru */
> @@ -847,7 +847,7 @@ static void setexposure(struct gspca_dev *gspca_dev, s32 expo, s32 min_clockdiv)
>   		u8 clockdiv = (60 * expo + 7999) / 8000;
>
>   		/* Limit framerate to not exceed usb bandwidth */
> -		if (clockdiv < min_clockdiv && gspca_dev->width >= 320)
> +		if (clockdiv < min_clockdiv && gspca_dev->pixfmt.width >= 320)
>   			clockdiv = min_clockdiv;
>   		else if (clockdiv < 2)
>   			clockdiv = 2;
> diff --git a/drivers/media/usb/gspca/nw80x.c b/drivers/media/usb/gspca/nw80x.c
> index 44c9964..599f755 100644
> --- a/drivers/media/usb/gspca/nw80x.c
> +++ b/drivers/media/usb/gspca/nw80x.c
> @@ -1708,7 +1708,7 @@ static void setautogain(struct gspca_dev *gspca_dev, s32 val)
>
>   	reg_r(gspca_dev, 0x1004, 1);
>   	if (gspca_dev->usb_buf[0] & 0x04) {	/* if AE_FULL_FRM */
> -		sd->ae_res = gspca_dev->width * gspca_dev->height;
> +		sd->ae_res = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height;
>   	} else {				/* get the AE window size */
>   		reg_r(gspca_dev, 0x1011, 8);
>   		w = (gspca_dev->usb_buf[1] << 8) + gspca_dev->usb_buf[0]
> @@ -1717,7 +1717,8 @@ static void setautogain(struct gspca_dev *gspca_dev, s32 val)
>   		  - (gspca_dev->usb_buf[7] << 8) - gspca_dev->usb_buf[6];
>   		sd->ae_res = h * w;
>   		if (sd->ae_res == 0)
> -			sd->ae_res = gspca_dev->width * gspca_dev->height;
> +			sd->ae_res = gspca_dev->pixfmt.width *
> +					gspca_dev->pixfmt.height;
>   	}
>   }
>
> @@ -1856,21 +1857,21 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	reg_w_buf(gspca_dev, cmd);
>   	switch (sd->webcam) {
>   	case P35u:
> -		if (gspca_dev->width == 320)
> +		if (gspca_dev->pixfmt.width == 320)
>   			reg_w_buf(gspca_dev, nw801_start_qvga);
>   		else
>   			reg_w_buf(gspca_dev, nw801_start_vga);
>   		reg_w_buf(gspca_dev, nw801_start_2);
>   		break;
>   	case Kr651us:
> -		if (gspca_dev->width == 320)
> +		if (gspca_dev->pixfmt.width == 320)
>   			reg_w_buf(gspca_dev, kr651_start_qvga);
>   		else
>   			reg_w_buf(gspca_dev, kr651_start_vga);
>   		reg_w_buf(gspca_dev, kr651_start_2);
>   		break;
>   	case Proscope:
> -		if (gspca_dev->width == 320)
> +		if (gspca_dev->pixfmt.width == 320)
>   			reg_w_buf(gspca_dev, proscope_start_qvga);
>   		else
>   			reg_w_buf(gspca_dev, proscope_start_vga);
> diff --git a/drivers/media/usb/gspca/ov519.c b/drivers/media/usb/gspca/ov519.c
> index a3958ee..bdfc49f 100644
> --- a/drivers/media/usb/gspca/ov519.c
> +++ b/drivers/media/usb/gspca/ov519.c
> @@ -3466,7 +3466,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
>
>   	switch (sd->bridge) {
>   	case BRIDGE_OVFX2:
> -		if (gspca_dev->width != 800)
> +		if (gspca_dev->pixfmt.width != 800)
>   			gspca_dev->cam.bulk_size = OVFX2_BULK_SIZE;
>   		else
>   			gspca_dev->cam.bulk_size = 7 * 4096;
> @@ -3505,8 +3505,8 @@ static void ov511_mode_init_regs(struct sd *sd)
>   	/* Here I'm assuming that snapshot size == image size.
>   	 * I hope that's always true. --claudio
>   	 */
> -	hsegs = (sd->gspca_dev.width >> 3) - 1;
> -	vsegs = (sd->gspca_dev.height >> 3) - 1;
> +	hsegs = (sd->gspca_dev.pixfmt.width >> 3) - 1;
> +	vsegs = (sd->gspca_dev.pixfmt.height >> 3) - 1;
>
>   	reg_w(sd, R511_CAM_PXCNT, hsegs);
>   	reg_w(sd, R511_CAM_LNCNT, vsegs);
> @@ -3539,7 +3539,7 @@ static void ov511_mode_init_regs(struct sd *sd)
>   	case SEN_OV7640:
>   	case SEN_OV7648:
>   	case SEN_OV76BE:
> -		if (sd->gspca_dev.width == 320)
> +		if (sd->gspca_dev.pixfmt.width == 320)
>   			interlaced = 1;
>   		/* Fall through */
>   	case SEN_OV6630:
> @@ -3549,7 +3549,7 @@ static void ov511_mode_init_regs(struct sd *sd)
>   		case 30:
>   		case 25:
>   			/* Not enough bandwidth to do 640x480 @ 30 fps */
> -			if (sd->gspca_dev.width != 640) {
> +			if (sd->gspca_dev.pixfmt.width != 640) {
>   				sd->clockdiv = 0;
>   				break;
>   			}
> @@ -3582,7 +3582,8 @@ static void ov511_mode_init_regs(struct sd *sd)
>
>   	/* Check if we have enough bandwidth to disable compression */
>   	fps = (interlaced ? 60 : 30) / (sd->clockdiv + 1) + 1;
> -	needed = fps * sd->gspca_dev.width * sd->gspca_dev.height * 3 / 2;
> +	needed = fps * sd->gspca_dev.pixfmt.width *
> +			sd->gspca_dev.pixfmt.height * 3 / 2;
>   	/* 1000 isoc packets/sec */
>   	if (needed > 1000 * packet_size) {
>   		/* Enable Y and UV quantization and compression */
> @@ -3644,8 +3645,8 @@ static void ov518_mode_init_regs(struct sd *sd)
>   		reg_w(sd, 0x38, 0x80);
>   	}
>
> -	hsegs = sd->gspca_dev.width / 16;
> -	vsegs = sd->gspca_dev.height / 4;
> +	hsegs = sd->gspca_dev.pixfmt.width / 16;
> +	vsegs = sd->gspca_dev.pixfmt.height / 4;
>
>   	reg_w(sd, 0x29, hsegs);
>   	reg_w(sd, 0x2a, vsegs);
> @@ -3668,7 +3669,7 @@ static void ov518_mode_init_regs(struct sd *sd)
>   	if (sd->bridge == BRIDGE_OV518PLUS) {
>   		switch (sd->sensor) {
>   		case SEN_OV7620AE:
> -			if (sd->gspca_dev.width == 320) {
> +			if (sd->gspca_dev.pixfmt.width == 320) {
>   				reg_w(sd, 0x20, 0x00);
>   				reg_w(sd, 0x21, 0x19);
>   			} else {
> @@ -3794,8 +3795,8 @@ static void ov519_mode_init_regs(struct sd *sd)
>   		break;
>   	}
>
> -	reg_w(sd, OV519_R10_H_SIZE,	sd->gspca_dev.width >> 4);
> -	reg_w(sd, OV519_R11_V_SIZE,	sd->gspca_dev.height >> 3);
> +	reg_w(sd, OV519_R10_H_SIZE,	sd->gspca_dev.pixfmt.width >> 4);
> +	reg_w(sd, OV519_R11_V_SIZE,	sd->gspca_dev.pixfmt.height >> 3);
>   	if (sd->sensor == SEN_OV7670 &&
>   	    sd->gspca_dev.cam.cam_mode[sd->gspca_dev.curr_mode].priv)
>   		reg_w(sd, OV519_R12_X_OFFSETL, 0x04);
> @@ -3929,14 +3930,16 @@ static void mode_init_ov_sensor_regs(struct sd *sd)
>   	    }
>   	case SEN_OV3610:
>   		if (qvga) {
> -			xstart = (1040 - gspca_dev->width) / 2 + (0x1f << 4);
> -			ystart = (776 - gspca_dev->height) / 2;
> +			xstart = (1040 - gspca_dev->pixfmt.width) / 2 +
> +				(0x1f << 4);
> +			ystart = (776 - gspca_dev->pixfmt.height) / 2;
>   		} else {
> -			xstart = (2076 - gspca_dev->width) / 2 + (0x10 << 4);
> -			ystart = (1544 - gspca_dev->height) / 2;
> +			xstart = (2076 - gspca_dev->pixfmt.width) / 2 +
> +				(0x10 << 4);
> +			ystart = (1544 - gspca_dev->pixfmt.height) / 2;
>   		}
> -		xend = xstart + gspca_dev->width;
> -		yend = ystart + gspca_dev->height;
> +		xend = xstart + gspca_dev->pixfmt.width;
> +		yend = ystart + gspca_dev->pixfmt.height;
>   		/* Writing to the COMH register resets the other windowing regs
>   		   to their default values, so we must do this first. */
>   		i2c_w_mask(sd, 0x12, qvga ? 0x40 : 0x00, 0xf0);
> @@ -4211,8 +4214,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	struct sd *sd = (struct sd *) gspca_dev;
>
>   	/* Default for most bridges, allow bridge_mode_init_regs to override */
> -	sd->sensor_width = sd->gspca_dev.width;
> -	sd->sensor_height = sd->gspca_dev.height;
> +	sd->sensor_width = sd->gspca_dev.pixfmt.width;
> +	sd->sensor_height = sd->gspca_dev.pixfmt.height;
>
>   	switch (sd->bridge) {
>   	case BRIDGE_OV511:
> @@ -4327,12 +4330,13 @@ static void ov511_pkt_scan(struct gspca_dev *gspca_dev,
>   		ov51x_handle_button(gspca_dev, (in[8] >> 2) & 1);
>   		if (in[8] & 0x80) {
>   			/* Frame end */
> -			if ((in[9] + 1) * 8 != gspca_dev->width ||
> -			    (in[10] + 1) * 8 != gspca_dev->height) {
> +			if ((in[9] + 1) * 8 != gspca_dev->pixfmt.width ||
> +			    (in[10] + 1) * 8 != gspca_dev->pixfmt.height) {
>   				PERR("Invalid frame size, got: %dx%d,"
>   					" requested: %dx%d\n",
>   					(in[9] + 1) * 8, (in[10] + 1) * 8,
> -					gspca_dev->width, gspca_dev->height);
> +					gspca_dev->pixfmt.width,
> +					gspca_dev->pixfmt.height);
>   				gspca_dev->last_packet_type = DISCARD_PACKET;
>   				return;
>   			}
> @@ -4452,7 +4456,8 @@ static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev,
>   		if (sd->first_frame) {
>   			sd->first_frame--;
>   			if (gspca_dev->image_len <
> -				  sd->gspca_dev.width * sd->gspca_dev.height)
> +				  sd->gspca_dev.pixfmt.width *
> +					sd->gspca_dev.pixfmt.height)
>   				gspca_dev->last_packet_type = DISCARD_PACKET;
>   		}
>   		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
> diff --git a/drivers/media/usb/gspca/ov534.c b/drivers/media/usb/gspca/ov534.c
> index 2e28c81..4df6b77 100644
> --- a/drivers/media/usb/gspca/ov534.c
> +++ b/drivers/media/usb/gspca/ov534.c
> @@ -1441,9 +1441,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
>   		/* If this packet is marked as EOF, end the frame */
>   		} else if (data[1] & UVC_STREAM_EOF) {
>   			sd->last_pts = 0;
> -			if (gspca_dev->pixfmt == V4L2_PIX_FMT_YUYV
> +			if (gspca_dev->pixfmt.pixelformat == V4L2_PIX_FMT_YUYV
>   			 && gspca_dev->image_len + len - 12 !=
> -				   gspca_dev->width * gspca_dev->height * 2) {
> +				   gspca_dev->pixfmt.width *
> +					gspca_dev->pixfmt.height * 2) {
>   				PDEBUG(D_PACK, "wrong sized frame");
>   				goto discard;
>   			}
> diff --git a/drivers/media/usb/gspca/pac207.c b/drivers/media/usb/gspca/pac207.c
> index 83519be..cd79c18 100644
> --- a/drivers/media/usb/gspca/pac207.c
> +++ b/drivers/media/usb/gspca/pac207.c
> @@ -299,7 +299,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	pac207_write_regs(gspca_dev, 0x0042, pac207_sensor_init[3], 8);
>
>   	/* Compression Balance */
> -	if (gspca_dev->width == 176)
> +	if (gspca_dev->pixfmt.width == 176)
>   		pac207_write_reg(gspca_dev, 0x4a, 0xff);
>   	else
>   		pac207_write_reg(gspca_dev, 0x4a, 0x30);
> @@ -317,7 +317,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   		mode = 0x00;
>   	else
>   		mode = 0x02;
> -	if (gspca_dev->width == 176) {	/* 176x144 */
> +	if (gspca_dev->pixfmt.width == 176) {	/* 176x144 */
>   		mode |= 0x01;
>   		PDEBUG(D_STREAM, "pac207_start mode 176x144");
>   	} else {				/* 352x288 */
> diff --git a/drivers/media/usb/gspca/pac7311.c b/drivers/media/usb/gspca/pac7311.c
> index 1a5bdc8..25f86b1 100644
> --- a/drivers/media/usb/gspca/pac7311.c
> +++ b/drivers/media/usb/gspca/pac7311.c
> @@ -326,7 +326,7 @@ static void setexposure(struct gspca_dev *gspca_dev, s32 val)
>   	 *  640x480 mode and page 4 reg 2 <= 3 then it must be 9
>   	 */
>   	reg_w(gspca_dev, 0xff, 0x01);
> -	if (gspca_dev->width != 640 && val <= 3)
> +	if (gspca_dev->pixfmt.width != 640 && val <= 3)
>   		reg_w(gspca_dev, 0x08, 0x09);
>   	else
>   		reg_w(gspca_dev, 0x08, 0x08);
> @@ -337,7 +337,7 @@ static void setexposure(struct gspca_dev *gspca_dev, s32 val)
>   	 * camera to use higher compression or we may run out of
>   	 * bandwidth.
>   	 */
> -	if (gspca_dev->width == 640 && val == 2)
> +	if (gspca_dev->pixfmt.width == 640 && val == 2)
>   		reg_w(gspca_dev, 0x80, 0x01);
>   	else
>   		reg_w(gspca_dev, 0x80, 0x1c);
> @@ -615,7 +615,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
>
>   		/* Start the new frame with the jpeg header */
>   		pac_start_frame(gspca_dev,
> -			gspca_dev->height, gspca_dev->width);
> +			gspca_dev->pixfmt.height, gspca_dev->pixfmt.width);
>   	}
>   	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
>   }
> diff --git a/drivers/media/usb/gspca/se401.c b/drivers/media/usb/gspca/se401.c
> index 5f729b8..5102cea 100644
> --- a/drivers/media/usb/gspca/se401.c
> +++ b/drivers/media/usb/gspca/se401.c
> @@ -354,9 +354,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
>
>   	/* set size + mode */
>   	se401_write_req(gspca_dev, SE401_REQ_SET_WIDTH,
> -			gspca_dev->width * mult, 0);
> +			gspca_dev->pixfmt.width * mult, 0);
>   	se401_write_req(gspca_dev, SE401_REQ_SET_HEIGHT,
> -			gspca_dev->height * mult, 0);
> +			gspca_dev->pixfmt.height * mult, 0);
>   	/*
>   	 * HDG: disabled this as it does not seem to do anything
>   	 * se401_write_req(gspca_dev, SE401_REQ_SET_OUTPUT_MODE,
> @@ -480,7 +480,7 @@ static void sd_complete_frame(struct gspca_dev *gspca_dev, u8 *data, int len)
>   static void sd_pkt_scan_janggu(struct gspca_dev *gspca_dev, u8 *data, int len)
>   {
>   	struct sd *sd = (struct sd *)gspca_dev;
> -	int imagesize = gspca_dev->width * gspca_dev->height;
> +	int imagesize = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height;
>   	int i, plen, bits, pixels, info, count;
>
>   	if (sd->restart_stream)
> diff --git a/drivers/media/usb/gspca/sn9c20x.c b/drivers/media/usb/gspca/sn9c20x.c
> index f4453d5..2a38621 100644
> --- a/drivers/media/usb/gspca/sn9c20x.c
> +++ b/drivers/media/usb/gspca/sn9c20x.c
> @@ -1955,7 +1955,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
>   			return 0;
>   		}
>
> -		switch (gspca_dev->width) {
> +		switch (gspca_dev->pixfmt.width) {
>   		case 160: /* 160x120 */
>   			gspca_dev->alt = 2;
>   			break;
> @@ -1985,8 +1985,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   {
>   	struct sd *sd = (struct sd *) gspca_dev;
>   	int mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
> -	int width = gspca_dev->width;
> -	int height = gspca_dev->height;
> +	int width = gspca_dev->pixfmt.width;
> +	int height = gspca_dev->pixfmt.height;
>   	u8 fmt, scale = 0;
>
>   	jpeg_define(sd->jpeg_hdr, height, width,
> diff --git a/drivers/media/usb/gspca/sonixb.c b/drivers/media/usb/gspca/sonixb.c
> index d7ff3b9..921802c 100644
> --- a/drivers/media/usb/gspca/sonixb.c
> +++ b/drivers/media/usb/gspca/sonixb.c
> @@ -753,7 +753,7 @@ static void setexposure(struct gspca_dev *gspca_dev)
>   		/* In 640x480, if the reg11 has less than 4, the image is
>   		   unstable (the bridge goes into a higher compression mode
>   		   which we have not reverse engineered yet). */
> -		if (gspca_dev->width == 640 && reg11 < 4)
> +		if (gspca_dev->pixfmt.width == 640 && reg11 < 4)
>   			reg11 = 4;
>
>   		/* frame exposure time in ms = 1000 * reg11 / 30    ->
> diff --git a/drivers/media/usb/gspca/sonixj.c b/drivers/media/usb/gspca/sonixj.c
> index 3b5ccb1..c69b45d 100644
> --- a/drivers/media/usb/gspca/sonixj.c
> +++ b/drivers/media/usb/gspca/sonixj.c
> @@ -2204,7 +2204,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   				{ 0x14, 0xe7, 0x1e, 0xdd };
>
>   	/* create the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x21);		/* JPEG 422 */
>
>   	/* initialize the bridge */
> diff --git a/drivers/media/usb/gspca/spca1528.c b/drivers/media/usb/gspca/spca1528.c
> index 688592b..f38fd89 100644
> --- a/drivers/media/usb/gspca/spca1528.c
> +++ b/drivers/media/usb/gspca/spca1528.c
> @@ -255,7 +255,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	struct sd *sd = (struct sd *) gspca_dev;
>
>   	/* initialize the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x22);		/* JPEG 411 */
>
>   	/* the JPEG quality shall be 85% */
> diff --git a/drivers/media/usb/gspca/spca500.c b/drivers/media/usb/gspca/spca500.c
> index 9f8bf51..f011a30 100644
> --- a/drivers/media/usb/gspca/spca500.c
> +++ b/drivers/media/usb/gspca/spca500.c
> @@ -608,7 +608,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	__u8 xmult, ymult;
>
>   	/* create the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x22);		/* JPEG 411 */
>   	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
>
> diff --git a/drivers/media/usb/gspca/sq905c.c b/drivers/media/usb/gspca/sq905c.c
> index acb19fb..aa21edc 100644
> --- a/drivers/media/usb/gspca/sq905c.c
> +++ b/drivers/media/usb/gspca/sq905c.c
> @@ -272,7 +272,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
>
>   	dev->cap_mode = gspca_dev->cam.cam_mode;
>   	/* "Open the shutter" and set size, to start capture */
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 640:
>   		PDEBUG(D_STREAM, "Start streaming at high resolution");
>   		dev->cap_mode++;
> diff --git a/drivers/media/usb/gspca/sq930x.c b/drivers/media/usb/gspca/sq930x.c
> index b10d082..e274cf19 100644
> --- a/drivers/media/usb/gspca/sq930x.c
> +++ b/drivers/media/usb/gspca/sq930x.c
> @@ -906,7 +906,8 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
>
>   	gspca_dev->cam.bulk_nurbs = 1;	/* there must be one URB only */
>   	sd->do_ctrl = 0;
> -	gspca_dev->cam.bulk_size = gspca_dev->width * gspca_dev->height + 8;
> +	gspca_dev->cam.bulk_size = gspca_dev->pixfmt.width *
> +			gspca_dev->pixfmt.height + 8;
>   	return 0;
>   }
>
> diff --git a/drivers/media/usb/gspca/stk014.c b/drivers/media/usb/gspca/stk014.c
> index 8c09826..b0c70fe 100644
> --- a/drivers/media/usb/gspca/stk014.c
> +++ b/drivers/media/usb/gspca/stk014.c
> @@ -250,7 +250,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	int ret, value;
>
>   	/* create the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x22);		/* JPEG 411 */
>   	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
>
> @@ -261,7 +262,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	set_par(gspca_dev, 0x00000000);
>   	set_par(gspca_dev, 0x8002e001);
>   	set_par(gspca_dev, 0x14000000);
> -	if (gspca_dev->width > 320)
> +	if (gspca_dev->pixfmt.width > 320)
>   		value = 0x8002e001;		/* 640x480 */
>   	else
>   		value = 0x4001f000;		/* 320x240 */
> diff --git a/drivers/media/usb/gspca/stk1135.c b/drivers/media/usb/gspca/stk1135.c
> index 5858688..5a6ed49 100644
> --- a/drivers/media/usb/gspca/stk1135.c
> +++ b/drivers/media/usb/gspca/stk1135.c
> @@ -347,8 +347,8 @@ static void stk1135_configure_mt9m112(struct gspca_dev *gspca_dev)
>   		sensor_write(gspca_dev, cfg[i].reg, cfg[i].val);
>
>   	/* set output size */
> -	width = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].width;
> -	height = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].height;
> +	width = gspca_dev->pixfmt.width;
> +	height = gspca_dev->pixfmt.height;
>   	if (width <= 640) { /* use context A (half readout speed by default) */
>   		sensor_write(gspca_dev, 0x1a7, width);
>   		sensor_write(gspca_dev, 0x1aa, height);
> @@ -484,8 +484,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	reg_w(gspca_dev, STK1135_REG_CISPO + 3, 0x00);
>
>   	/* set capture end position */
> -	width = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].width;
> -	height = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].height;
> +	width = gspca_dev->pixfmt.width;
> +	height = gspca_dev->pixfmt.height;
>   	reg_w(gspca_dev, STK1135_REG_CIEPO + 0, width & 0xff);
>   	reg_w(gspca_dev, STK1135_REG_CIEPO + 1, width >> 8);
>   	reg_w(gspca_dev, STK1135_REG_CIEPO + 2, height & 0xff);
> diff --git a/drivers/media/usb/gspca/stv06xx/stv06xx.c b/drivers/media/usb/gspca/stv06xx/stv06xx.c
> index 55ee7a6..49d209b 100644
> --- a/drivers/media/usb/gspca/stv06xx/stv06xx.c
> +++ b/drivers/media/usb/gspca/stv06xx/stv06xx.c
> @@ -452,7 +452,7 @@ frame_data:
>   					NULL, 0);
>
>   			if (sd->bridge == BRIDGE_ST6422)
> -				sd->to_skip = gspca_dev->width * 4;
> +				sd->to_skip = gspca_dev->pixfmt.width * 4;
>
>   			if (chunk_len)
>   				PERR("Chunk length is "
> diff --git a/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c b/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c
> index 8206b77..8d785ed 100644
> --- a/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c
> +++ b/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c
> @@ -421,7 +421,7 @@ static int pb0100_set_autogain_target(struct gspca_dev *gspca_dev, __s32 val)
>
>   	/* Number of pixels counted by the sensor when subsampling the pixels.
>   	 * Slightly larger than the real value to avoid oscillation */
> -	totalpixels = gspca_dev->width * gspca_dev->height;
> +	totalpixels = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height;
>   	totalpixels = totalpixels/(8*8) + totalpixels/(64*64);
>
>   	brightpixels = (totalpixels * val) >> 8;
> diff --git a/drivers/media/usb/gspca/sunplus.c b/drivers/media/usb/gspca/sunplus.c
> index af8767a..a517d18 100644
> --- a/drivers/media/usb/gspca/sunplus.c
> +++ b/drivers/media/usb/gspca/sunplus.c
> @@ -715,7 +715,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	int enable;
>
>   	/* create the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x22);		/* JPEG 411 */
>   	jpeg_set_qual(sd->jpeg_hdr, QUALITY);
>
> diff --git a/drivers/media/usb/gspca/topro.c b/drivers/media/usb/gspca/topro.c
> index 4cb511c..640c2fe 100644
> --- a/drivers/media/usb/gspca/topro.c
> +++ b/drivers/media/usb/gspca/topro.c
> @@ -3856,7 +3856,7 @@ static void setsharpness(struct gspca_dev *gspca_dev, s32 val)
>
>   	if (sd->bridge == BRIDGE_TP6800) {
>   		val |= 0x08;		/* grid compensation enable */
> -		if (gspca_dev->width == 640)
> +		if (gspca_dev->pixfmt.width == 640)
>   			reg_w(gspca_dev, TP6800_R78_FORMAT, 0x00); /* vga */
>   		else
>   			val |= 0x04;		/* scaling down enable */
> @@ -3880,7 +3880,7 @@ static void set_resolution(struct gspca_dev *gspca_dev)
>   	struct sd *sd = (struct sd *) gspca_dev;
>
>   	reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x00);
> -	if (gspca_dev->width == 320) {
> +	if (gspca_dev->pixfmt.width == 320) {
>   		reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, 0x06);
>   		msleep(100);
>   		i2c_w(gspca_dev, CX0342_AUTO_ADC_CALIB, 0x01);
> @@ -3924,7 +3924,7 @@ static int get_fr_idx(struct gspca_dev *gspca_dev)
>
>   		/* 640x480 * 30 fps does not work */
>   		if (i == 6			/* if 30 fps */
> -		 && gspca_dev->width == 640)
> +		 && gspca_dev->pixfmt.width == 640)
>   			i = 0x05;		/* 15 fps */
>   	} else {
>   		for (i = 0; i < ARRAY_SIZE(rates_6810) - 1; i++) {
> @@ -3935,7 +3935,7 @@ static int get_fr_idx(struct gspca_dev *gspca_dev)
>
>   		/* 640x480 * 30 fps does not work */
>   		if (i == 7			/* if 30 fps */
> -		 && gspca_dev->width == 640)
> +		 && gspca_dev->pixfmt.width == 640)
>   			i = 6;			/* 15 fps */
>   		i |= 0x80;			/* clock * 1 */
>   	}
> @@ -4554,7 +4554,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   {
>   	struct sd *sd = (struct sd *) gspca_dev;
>
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width);
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width);
>   	set_dqt(gspca_dev, sd->quality);
>   	if (sd->bridge == BRIDGE_TP6800) {
>   		if (sd->sensor == SENSOR_CX0342)
> @@ -4737,7 +4738,7 @@ static void sd_dq_callback(struct gspca_dev *gspca_dev)
>   			(gspca_dev->usb_buf[26] << 8) + gspca_dev->usb_buf[25] +
>   			(gspca_dev->usb_buf[29] << 8) + gspca_dev->usb_buf[28])
>   				/ 8;
> -		if (gspca_dev->width == 640)
> +		if (gspca_dev->pixfmt.width == 640)
>   			luma /= 4;
>   		reg_w(gspca_dev, 0x7d, 0x00);
>
> diff --git a/drivers/media/usb/gspca/tv8532.c b/drivers/media/usb/gspca/tv8532.c
> index 8591324..d497ba3 100644
> --- a/drivers/media/usb/gspca/tv8532.c
> +++ b/drivers/media/usb/gspca/tv8532.c
> @@ -268,7 +268,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
>   	packet_type0 = packet_type1 = INTER_PACKET;
>   	if (gspca_dev->empty_packet) {
>   		gspca_dev->empty_packet = 0;
> -		sd->packet = gspca_dev->height / 2;
> +		sd->packet = gspca_dev->pixfmt.height / 2;
>   		packet_type0 = FIRST_PACKET;
>   	} else if (sd->packet == 0)
>   		return;			/* 2 more lines in 352x288 ! */
> @@ -284,9 +284,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
>   	 * - 4 bytes
>   	 */
>   	gspca_frame_add(gspca_dev, packet_type0,
> -			data + 2, gspca_dev->width);
> +			data + 2, gspca_dev->pixfmt.width);
>   	gspca_frame_add(gspca_dev, packet_type1,
> -			data + gspca_dev->width + 5, gspca_dev->width);
> +			data + gspca_dev->pixfmt.width + 5,
> +			gspca_dev->pixfmt.width);
>   }
>
>   static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
> diff --git a/drivers/media/usb/gspca/vicam.c b/drivers/media/usb/gspca/vicam.c
> index d6890bc..1689b8f 100644
> --- a/drivers/media/usb/gspca/vicam.c
> +++ b/drivers/media/usb/gspca/vicam.c
> @@ -121,13 +121,13 @@ static int vicam_read_frame(struct gspca_dev *gspca_dev, u8 *data, int size)
>
>   	memset(req_data, 0, 16);
>   	req_data[0] = gain;
> -	if (gspca_dev->width == 256)
> +	if (gspca_dev->pixfmt.width == 256)
>   		req_data[1] |= 0x01; /* low nibble x-scale */
> -	if (gspca_dev->height <= 122) {
> +	if (gspca_dev->pixfmt.height <= 122) {
>   		req_data[1] |= 0x10; /* high nibble y-scale */
> -		unscaled_height = gspca_dev->height * 2;
> +		unscaled_height = gspca_dev->pixfmt.height * 2;
>   	} else
> -		unscaled_height = gspca_dev->height;
> +		unscaled_height = gspca_dev->pixfmt.height;
>   	req_data[2] = 0x90; /* unknown, does not seem to do anything */
>   	if (unscaled_height <= 200)
>   		req_data[3] = 0x06; /* vend? */
> diff --git a/drivers/media/usb/gspca/w996Xcf.c b/drivers/media/usb/gspca/w996Xcf.c
> index 2165da0..fb9fe2e 100644
> --- a/drivers/media/usb/gspca/w996Xcf.c
> +++ b/drivers/media/usb/gspca/w996Xcf.c
> @@ -430,11 +430,11 @@ static void w9968cf_set_crop_window(struct sd *sd)
>   	#define SC(x) ((x) << 10)
>
>   	/* Scaling factors */
> -	fw = SC(sd->gspca_dev.width) / max_width;
> -	fh = SC(sd->gspca_dev.height) / max_height;
> +	fw = SC(sd->gspca_dev.pixfmt.width) / max_width;
> +	fh = SC(sd->gspca_dev.pixfmt.height) / max_height;
>
> -	cw = (fw >= fh) ? max_width : SC(sd->gspca_dev.width) / fh;
> -	ch = (fw >= fh) ? SC(sd->gspca_dev.height) / fw : max_height;
> +	cw = (fw >= fh) ? max_width : SC(sd->gspca_dev.pixfmt.width) / fh;
> +	ch = (fw >= fh) ? SC(sd->gspca_dev.pixfmt.height) / fw : max_height;
>
>   	sd->sensor_width = max_width;
>   	sd->sensor_height = max_height;
> @@ -454,34 +454,34 @@ static void w9968cf_mode_init_regs(struct sd *sd)
>
>   	w9968cf_set_crop_window(sd);
>
> -	reg_w(sd, 0x14, sd->gspca_dev.width);
> -	reg_w(sd, 0x15, sd->gspca_dev.height);
> +	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.width);
> -	reg_w(sd, 0x31, sd->gspca_dev.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.width / 2);
> -		reg_w(sd, 0x2d, sd->gspca_dev.width / 4);
> +		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.width);
> +		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.width * sd->gspca_dev.height;
> +	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.height,
> -			    sd->gspca_dev.width, 0x22); /* JPEG 420 */
> +		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);
> diff --git a/drivers/media/usb/gspca/xirlink_cit.c b/drivers/media/usb/gspca/xirlink_cit.c
> index 7eaf64e..101df67 100644
> --- a/drivers/media/usb/gspca/xirlink_cit.c
> +++ b/drivers/media/usb/gspca/xirlink_cit.c
> @@ -1471,14 +1471,14 @@ static int cit_get_clock_div(struct gspca_dev *gspca_dev)
>
>   	while (clock_div > 3 &&
>   			1000 * packet_size >
> -			gspca_dev->width * gspca_dev->height *
> +			gspca_dev->pixfmt.width * gspca_dev->pixfmt.height *
>   			fps[clock_div - 1] * 3 / 2)
>   		clock_div--;
>
>   	PDEBUG(D_PROBE,
>   	       "PacketSize: %d, res: %dx%d -> using clockdiv: %d (%d fps)",
> -	       packet_size, gspca_dev->width, gspca_dev->height, clock_div,
> -	       fps[clock_div]);
> +	       packet_size, gspca_dev->pixfmt.width, gspca_dev->pixfmt.height,
> +	       clock_div, fps[clock_div]);
>
>   	return clock_div;
>   }
> @@ -1502,7 +1502,7 @@ static int cit_start_model0(struct gspca_dev *gspca_dev)
>   	cit_write_reg(gspca_dev, 0x0002, 0x0426);
>   	cit_write_reg(gspca_dev, 0x0014, 0x0427);
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160: /* 160x120 */
>   		cit_write_reg(gspca_dev, 0x0004, 0x010b);
>   		cit_write_reg(gspca_dev, 0x0001, 0x010a);
> @@ -1643,7 +1643,7 @@ static int cit_start_model1(struct gspca_dev *gspca_dev)
>   	cit_write_reg(gspca_dev, 0x00, 0x0101);
>   	cit_write_reg(gspca_dev, 0x00, 0x010a);
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 128: /* 128x96 */
>   		cit_write_reg(gspca_dev, 0x80, 0x0103);
>   		cit_write_reg(gspca_dev, 0x60, 0x0105);
> @@ -1700,7 +1700,7 @@ static int cit_start_model1(struct gspca_dev *gspca_dev)
>   	}
>
>   	/* Assorted init */
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 128: /* 128x96 */
>   		cit_Packet_Format1(gspca_dev, 0x2b, 0x1e);
>   		cit_write_reg(gspca_dev, 0xc9, 0x0119);	/* Same everywhere */
> @@ -1753,7 +1753,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
>   	cit_write_reg(gspca_dev, 0x0000, 0x0108);
>   	cit_write_reg(gspca_dev, 0x0001, 0x0133);
>   	cit_write_reg(gspca_dev, 0x0001, 0x0102);
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 176: /* 176x144 */
>   		cit_write_reg(gspca_dev, 0x002c, 0x0103);	/* All except 320x240 */
>   		cit_write_reg(gspca_dev, 0x0000, 0x0104);	/* Same */
> @@ -1792,7 +1792,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
>
>   	cit_write_reg(gspca_dev, 0x0000, 0x0100);	/* LED on */
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 176: /* 176x144 */
>   		cit_write_reg(gspca_dev, 0x0050, 0x0111);
>   		cit_write_reg(gspca_dev, 0x00d0, 0x0111);
> @@ -1840,7 +1840,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
>   	 * Magic control of CMOS sensor. Only lower values like
>   	 * 0-3 work, and picture shifts left or right. Don't change.
>   	 */
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 176: /* 176x144 */
>   		cit_model2_Packet1(gspca_dev, 0x0014, 0x0002);
>   		cit_model2_Packet1(gspca_dev, 0x0016, 0x0002); /* Horizontal shift */
> @@ -1899,7 +1899,7 @@ static int cit_start_model2(struct gspca_dev *gspca_dev)
>   	 * does not allow arbitrary values and apparently is a bit mask, to
>   	 * be activated only at appropriate time. Don't change it randomly!
>   	 */
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 176: /* 176x144 */
>   		cit_model2_Packet1(gspca_dev, 0x0026, 0x00c2);
>   		break;
> @@ -2023,7 +2023,7 @@ static int cit_start_model3(struct gspca_dev *gspca_dev)
>   	cit_model3_Packet1(gspca_dev, 0x009e, 0x0096);
>   	cit_model3_Packet1(gspca_dev, 0x009f, 0x000a);
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160:
>   		cit_write_reg(gspca_dev, 0x0000, 0x0101); /* Same on 160x120, 320x240 */
>   		cit_write_reg(gspca_dev, 0x00a0, 0x0103); /* Same on 160x120, 320x240 */
> @@ -2134,7 +2134,7 @@ static int cit_start_model3(struct gspca_dev *gspca_dev)
>   	   like with the IBM netcam pro). */
>   	cit_write_reg(gspca_dev, clock_div, 0x0111); /* Clock Divider */
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160:
>   		cit_model3_Packet1(gspca_dev, 0x001f, 0x0000); /* Same */
>   		cit_model3_Packet1(gspca_dev, 0x0039, 0x001f); /* Same */
> @@ -2211,7 +2211,7 @@ static int cit_start_model4(struct gspca_dev *gspca_dev)
>   	cit_write_reg(gspca_dev, 0xfffa, 0x0124);
>   	cit_model4_Packet1(gspca_dev, 0x0034, 0x0000);
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 128: /* 128x96 */
>   		cit_write_reg(gspca_dev, 0x0070, 0x0119);
>   		cit_write_reg(gspca_dev, 0x00d0, 0x0111);
> @@ -2531,7 +2531,7 @@ static int cit_start_ibm_netcam_pro(struct gspca_dev *gspca_dev)
>   	cit_write_reg(gspca_dev, 0x00fc, 0x012b); /* Same */
>   	cit_write_reg(gspca_dev, 0x0022, 0x012a); /* Same */
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160: /* 160x120 */
>   		cit_write_reg(gspca_dev, 0x0024, 0x010b);
>   		cit_write_reg(gspca_dev, 0x0089, 0x0119);
> @@ -2635,7 +2635,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev)
>   	struct usb_host_interface *alt;
>   	int max_packet_size;
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160:
>   		max_packet_size = 450;
>   		break;
> @@ -2659,7 +2659,7 @@ static int sd_isoc_nego(struct gspca_dev *gspca_dev)
>   	int ret, packet_size, min_packet_size;
>   	struct usb_host_interface *alt;
>
> -	switch (gspca_dev->width) {
> +	switch (gspca_dev->pixfmt.width) {
>   	case 160:
>   		min_packet_size = 200;
>   		break;
> @@ -2780,7 +2780,7 @@ static u8 *cit_find_sof(struct gspca_dev *gspca_dev, u8 *data, int len)
>   	case CIT_MODEL1:
>   	case CIT_MODEL3:
>   	case CIT_IBM_NETCAM_PRO:
> -		switch (gspca_dev->width) {
> +		switch (gspca_dev->pixfmt.width) {
>   		case 160: /* 160x120 */
>   			byte3 = 0x02;
>   			byte4 = 0x0a;
> diff --git a/drivers/media/usb/gspca/zc3xx.c b/drivers/media/usb/gspca/zc3xx.c
> index cbfc2f9..7b95d8e 100644
> --- a/drivers/media/usb/gspca/zc3xx.c
> +++ b/drivers/media/usb/gspca/zc3xx.c
> @@ -6700,7 +6700,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
>   	};
>
>   	/* create the JPEG header */
> -	jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width,
> +	jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
> +			gspca_dev->pixfmt.width,
>   			0x21);		/* JPEG 422 */
>
>   	mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-09-09 11:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-30 20:54 [PATCH 1/3] gspca: store current mode instead of individual parameters Ondrej Zary
2013-08-30 20:54 ` [PATCH 2/3] gspca: Support variable resolution Ondrej Zary
2013-08-30 20:54   ` [PATCH 3/3] gspca-stk1135: Add variable resolution support Ondrej Zary
2013-09-09 11:42 ` [PATCH 1/3] gspca: store current mode instead of individual parameters Hans de Goede

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.