aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zary <linux@rainbow-software.org>2013-08-30 16:54:24 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-09-26 06:20:48 -0400
commit7d687af4d5148ffb69da5f71c684380a478ad159 (patch)
tree02994f34303017d50415c46bf85272188da4988e
parent1966bc2a48f12d5d11c4fbe0880955cc4bfda0f9 (diff)
[media] gspca: Support variable resolution
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> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/usb/gspca/gspca.c20
-rw-r--r--drivers/media/usb/gspca/gspca.h6
2 files changed, 20 insertions, 6 deletions
diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
index c341bbb638f0..f3a7ace0fac9 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,
1133 mode = mode2; 1133 mode = mode2;
1134 } 1134 }
1135 fmt->fmt.pix = gspca_dev->cam.cam_mode[mode]; 1135 fmt->fmt.pix = gspca_dev->cam.cam_mode[mode];
1136 if (gspca_dev->sd_desc->try_fmt) {
1137 /* pass original resolution to subdriver try_fmt */
1138 fmt->fmt.pix.width = w;
1139 fmt->fmt.pix.height = h;
1140 gspca_dev->sd_desc->try_fmt(gspca_dev, fmt);
1141 }
1136 /* some drivers use priv internally, zero it before giving it to 1142 /* some drivers use priv internally, zero it before giving it to
1137 userspace */ 1143 userspace */
1138 fmt->fmt.pix.priv = 0; 1144 fmt->fmt.pix.priv = 0;
@@ -1171,17 +1177,16 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
1171 goto out; 1177 goto out;
1172 } 1178 }
1173 1179
1174 if (ret == gspca_dev->curr_mode) {
1175 ret = 0;
1176 goto out; /* same mode */
1177 }
1178
1179 if (gspca_dev->streaming) { 1180 if (gspca_dev->streaming) {
1180 ret = -EBUSY; 1181 ret = -EBUSY;
1181 goto out; 1182 goto out;
1182 } 1183 }
1183 gspca_dev->curr_mode = ret; 1184 gspca_dev->curr_mode = ret;
1184 gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret]; 1185 if (gspca_dev->sd_desc->try_fmt)
1186 /* subdriver try_fmt can modify format parameters */
1187 gspca_dev->pixfmt = fmt->fmt.pix;
1188 else
1189 gspca_dev->pixfmt = gspca_dev->cam.cam_mode[ret];
1185 1190
1186 ret = 0; 1191 ret = 0;
1187out: 1192out:
@@ -1196,6 +1201,9 @@ static int vidioc_enum_framesizes(struct file *file, void *priv,
1196 int i; 1201 int i;
1197 __u32 index = 0; 1202 __u32 index = 0;
1198 1203
1204 if (gspca_dev->sd_desc->enum_framesizes)
1205 return gspca_dev->sd_desc->enum_framesizes(gspca_dev, fsize);
1206
1199 for (i = 0; i < gspca_dev->cam.nmodes; i++) { 1207 for (i = 0; i < gspca_dev->cam.nmodes; i++) {
1200 if (fsize->pixel_format != 1208 if (fsize->pixel_format !=
1201 gspca_dev->cam.cam_mode[i].pixelformat) 1209 gspca_dev->cam.cam_mode[i].pixelformat)
diff --git a/drivers/media/usb/gspca/gspca.h b/drivers/media/usb/gspca/gspca.h
index 0f3d15002555..300642dc1a17 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,
88typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev, 88typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev,
89 u8 *data, 89 u8 *data,
90 int len); 90 int len);
91typedef void (*cam_format_op) (struct gspca_dev *gspca_dev,
92 struct v4l2_format *fmt);
93typedef int (*cam_frmsize_op) (struct gspca_dev *gspca_dev,
94 struct v4l2_frmsizeenum *fsize);
91 95
92/* subdriver description */ 96/* subdriver description */
93struct sd_desc { 97struct sd_desc {
@@ -109,6 +113,8 @@ struct sd_desc {
109 cam_set_jpg_op set_jcomp; 113 cam_set_jpg_op set_jcomp;
110 cam_streamparm_op get_streamparm; 114 cam_streamparm_op get_streamparm;
111 cam_streamparm_op set_streamparm; 115 cam_streamparm_op set_streamparm;
116 cam_format_op try_fmt;
117 cam_frmsize_op enum_framesizes;
112#ifdef CONFIG_VIDEO_ADV_DEBUG 118#ifdef CONFIG_VIDEO_ADV_DEBUG
113 cam_set_reg_op set_register; 119 cam_set_reg_op set_register;
114 cam_get_reg_op get_register; 120 cam_get_reg_op get_register;