diff options
author | Dmitri Belimov <d.belimov@gmail.com> | 2008-06-10 13:19:31 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-06-26 14:58:45 -0400 |
commit | a14fe9605bfdfe360b97acc9ef912779eb860507 (patch) | |
tree | 36358131bade4c494a0839e1c6364de3889bc678 /drivers/media | |
parent | a8a1f8cc0cae07c209f13857adbdd4b87b36cdde (diff) |
V4L/DVB (8020): Fix callbacks functions of saa7134_empress
If I try v4l2-ctl --all -d /dev/video1 or v4l2-ctl --streamon -d /dev/video1
modules crashed:
*pde = 00000000
Modules linked in: ac battery loop saa7134_empress(F) saa6752hs(F) tuner_simple(F) tuner_types(F) tea5767(F) tda9887(F) tda8290(F) tea5761(F) tuner(F) snd_cmipci snd_pcm snd_page_alloc snd_opl3_lib saa7134(F) snd_mpu401 parport_pc parport snd_timer snd_hwdep snd_mpu401_uart floppy rtc psmouse videodev(F) v4l1_compat(F) compat_ioctl32(F) v4l2_common(F) videobuf_dma_sg(F) videobuf_core(F) snd_rawmidi snd_seq_device via_ircc pcspkr snd ir_kbd_i2c(F) irda soundcore ir_common(F) crc_ccitt tveeprom(F) i2c_viapro i2c_core button via_agp agpgart evdev ext3 jbd mbcache ide_cd_mod cdrom ide_disk 8139cp via82cxxx ide_core 8139too mii ehci_hcd uhci_hcd usbcore thermal processor fan
EIP is at __mutex_lock_slowpath+0x29/0x7b
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
Process v4l2-ctl (pid: 2742, ti=ced7e000 task=cf325260 task.ti=ced7e000)
d08e5411 00000000 ced7fed4 00000000 d0975acb 40045612 cfa86ee0 ffffffcd
cf2b7000 ced7febc c03858d6 00000019 00000292 d089e4ec cf37b2a0 d089e4a0
Call Trace:
[<c028b52b>] mutex_lock+0xa/0xb
[<d08e5411>] videobuf_streamon+0xf/0x9a [videobuf_core]
[<d0975acb>] __video_do_ioctl+0x136a/0x2d68 [videodev]
[<d088f789>] task_end_request+0x40/0x51 [ide_core]
[<d088c4aa>] ide_intr+0x187/0x192 [ide_core]
[<c016a551>] mntput_no_expire+0x11/0x64
[<c0160b1c>] path_walk+0x90/0x98
[<d0977738>] video_ioctl2+0x173/0x239 [videodev]
[<c0140936>] filemap_fault+0x202/0x370
[<c014930a>] __do_fault+0x2c3/0x2fe
[<c014ab03>] handle_mm_fault+0x22a/0x49f
[<c0162737>] vfs_ioctl+0x47/0x5d
[<c0162992>] do_vfs_ioctl+0x245/0x258
[<c01629e6>] sys_ioctl+0x41/0x5b
[<c01036a6>] sysenter_past_esp+0x5f/0x85
=======================
After this fix all of that commands works without problem:
v4l2-ctl --all -d /dev/video1
Driver Info:
Driver name : saa7134
Card type : Beholder BeholdTV M6 Extra
Bus info : PCI:0000:00:0d.0
Driver version: 526
Capabilities : 0x05000001
Video Capture
Read/Write
Streaming
Format Video Capture:
Width/Height : 720/576
Pixel Format : MPEG
Field : Any
Bytes per Line: 0
Size Image : 58656
Colorspace : Unknown (00000000)
Video input : 0 (CCIR656)
Video Standard = 0x000000ff
PAL-B/B1/G/H/I/D/D1/K
P.S. data from /dev/video1 is not correct :(( .
Signed-off-by: Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/saa7134/saa7134-empress.c | 30 |
1 files changed, 10 insertions, 20 deletions
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index 81431ee41842..94b2585bdf5b 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
@@ -218,8 +218,7 @@ static int empress_enum_fmt_cap(struct file *file, void *priv, | |||
218 | static int empress_g_fmt_cap(struct file *file, void *priv, | 218 | static int empress_g_fmt_cap(struct file *file, void *priv, |
219 | struct v4l2_format *f) | 219 | struct v4l2_format *f) |
220 | { | 220 | { |
221 | struct saa7134_fh *fh = priv; | 221 | struct saa7134_dev *dev = file->private_data; |
222 | struct saa7134_dev *dev = fh->dev; | ||
223 | 222 | ||
224 | saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f); | 223 | saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f); |
225 | 224 | ||
@@ -232,8 +231,7 @@ static int empress_g_fmt_cap(struct file *file, void *priv, | |||
232 | static int empress_s_fmt_cap(struct file *file, void *priv, | 231 | static int empress_s_fmt_cap(struct file *file, void *priv, |
233 | struct v4l2_format *f) | 232 | struct v4l2_format *f) |
234 | { | 233 | { |
235 | struct saa7134_fh *fh = priv; | 234 | struct saa7134_dev *dev = file->private_data; |
236 | struct saa7134_dev *dev = fh->dev; | ||
237 | 235 | ||
238 | saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f); | 236 | saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f); |
239 | 237 | ||
@@ -247,8 +245,7 @@ static int empress_s_fmt_cap(struct file *file, void *priv, | |||
247 | static int empress_reqbufs(struct file *file, void *priv, | 245 | static int empress_reqbufs(struct file *file, void *priv, |
248 | struct v4l2_requestbuffers *p) | 246 | struct v4l2_requestbuffers *p) |
249 | { | 247 | { |
250 | struct saa7134_fh *fh = priv; | 248 | struct saa7134_dev *dev = file->private_data; |
251 | struct saa7134_dev *dev = fh->dev; | ||
252 | 249 | ||
253 | return videobuf_reqbufs(&dev->empress_tsq, p); | 250 | return videobuf_reqbufs(&dev->empress_tsq, p); |
254 | } | 251 | } |
@@ -256,24 +253,21 @@ static int empress_reqbufs(struct file *file, void *priv, | |||
256 | static int empress_querybuf(struct file *file, void *priv, | 253 | static int empress_querybuf(struct file *file, void *priv, |
257 | struct v4l2_buffer *b) | 254 | struct v4l2_buffer *b) |
258 | { | 255 | { |
259 | struct saa7134_fh *fh = priv; | 256 | struct saa7134_dev *dev = file->private_data; |
260 | struct saa7134_dev *dev = fh->dev; | ||
261 | 257 | ||
262 | return videobuf_querybuf(&dev->empress_tsq, b); | 258 | return videobuf_querybuf(&dev->empress_tsq, b); |
263 | } | 259 | } |
264 | 260 | ||
265 | static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) | 261 | static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) |
266 | { | 262 | { |
267 | struct saa7134_fh *fh = priv; | 263 | struct saa7134_dev *dev = file->private_data; |
268 | struct saa7134_dev *dev = fh->dev; | ||
269 | 264 | ||
270 | return videobuf_qbuf(&dev->empress_tsq, b); | 265 | return videobuf_qbuf(&dev->empress_tsq, b); |
271 | } | 266 | } |
272 | 267 | ||
273 | static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) | 268 | static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) |
274 | { | 269 | { |
275 | struct saa7134_fh *fh = priv; | 270 | struct saa7134_dev *dev = file->private_data; |
276 | struct saa7134_dev *dev = fh->dev; | ||
277 | 271 | ||
278 | return videobuf_dqbuf(&dev->empress_tsq, b, | 272 | return videobuf_dqbuf(&dev->empress_tsq, b, |
279 | file->f_flags & O_NONBLOCK); | 273 | file->f_flags & O_NONBLOCK); |
@@ -282,8 +276,7 @@ static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) | |||
282 | static int empress_streamon(struct file *file, void *priv, | 276 | static int empress_streamon(struct file *file, void *priv, |
283 | enum v4l2_buf_type type) | 277 | enum v4l2_buf_type type) |
284 | { | 278 | { |
285 | struct saa7134_fh *fh = priv; | 279 | struct saa7134_dev *dev = file->private_data; |
286 | struct saa7134_dev *dev = fh->dev; | ||
287 | 280 | ||
288 | return videobuf_streamon(&dev->empress_tsq); | 281 | return videobuf_streamon(&dev->empress_tsq); |
289 | } | 282 | } |
@@ -291,8 +284,7 @@ static int empress_streamon(struct file *file, void *priv, | |||
291 | static int empress_streamoff(struct file *file, void *priv, | 284 | static int empress_streamoff(struct file *file, void *priv, |
292 | enum v4l2_buf_type type) | 285 | enum v4l2_buf_type type) |
293 | { | 286 | { |
294 | struct saa7134_fh *fh = priv; | 287 | struct saa7134_dev *dev = file->private_data; |
295 | struct saa7134_dev *dev = fh->dev; | ||
296 | 288 | ||
297 | return videobuf_streamoff(&dev->empress_tsq); | 289 | return videobuf_streamoff(&dev->empress_tsq); |
298 | } | 290 | } |
@@ -300,8 +292,7 @@ static int empress_streamoff(struct file *file, void *priv, | |||
300 | static int empress_s_ext_ctrls(struct file *file, void *priv, | 292 | static int empress_s_ext_ctrls(struct file *file, void *priv, |
301 | struct v4l2_ext_controls *ctrls) | 293 | struct v4l2_ext_controls *ctrls) |
302 | { | 294 | { |
303 | struct saa7134_fh *fh = priv; | 295 | struct saa7134_dev *dev = file->private_data; |
304 | struct saa7134_dev *dev = fh->dev; | ||
305 | 296 | ||
306 | /* count == 0 is abused in saa6752hs.c, so that special | 297 | /* count == 0 is abused in saa6752hs.c, so that special |
307 | case is handled here explicitly. */ | 298 | case is handled here explicitly. */ |
@@ -320,8 +311,7 @@ static int empress_s_ext_ctrls(struct file *file, void *priv, | |||
320 | static int empress_g_ext_ctrls(struct file *file, void *priv, | 311 | static int empress_g_ext_ctrls(struct file *file, void *priv, |
321 | struct v4l2_ext_controls *ctrls) | 312 | struct v4l2_ext_controls *ctrls) |
322 | { | 313 | { |
323 | struct saa7134_fh *fh = priv; | 314 | struct saa7134_dev *dev = file->private_data; |
324 | struct saa7134_dev *dev = fh->dev; | ||
325 | 315 | ||
326 | if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) | 316 | if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) |
327 | return -EINVAL; | 317 | return -EINVAL; |