diff options
author | Thierry MERLE <thierry.merle@free.fr> | 2006-12-15 14:46:53 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-12-27 11:19:04 -0500 |
commit | 38284ba361d69eca34a3bfc553ebfac81fea2698 (patch) | |
tree | ab923c9b82ac8f3be51006ccbd425182f3c07f42 | |
parent | 3a4456a073150c8b0d790daa007d2aab9ebdecb5 (diff) |
V4L/DVB (4970): Usbvision memory fixes
- fix decompression buffer allocation not done at first driver open
- simplification of USB sbuf allocation (use of usb_buffer_alloc)
- replaced vmalloc by vmalloc_32 (for homogeneity)
- add of saa7111 (i2cAddr=0x48) detection printout in attach_inform
Signed-off-by: Thierry MERLE <thierry.merle@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | drivers/media/video/usbvision/usbvision-core.c | 48 | ||||
-rw-r--r-- | drivers/media/video/usbvision/usbvision-i2c.c | 3 | ||||
-rw-r--r-- | drivers/media/video/usbvision/usbvision-video.c | 14 | ||||
-rw-r--r-- | drivers/media/video/usbvision/usbvision.h | 2 |
4 files changed, 19 insertions, 48 deletions
diff --git a/drivers/media/video/usbvision/usbvision-core.c b/drivers/media/video/usbvision/usbvision-core.c index 612687305003..68542f2cf00c 100644 --- a/drivers/media/video/usbvision/usbvision-core.c +++ b/drivers/media/video/usbvision/usbvision-core.c | |||
@@ -374,7 +374,7 @@ static void scratch_reset(struct usb_usbvision *usbvision) | |||
374 | 374 | ||
375 | int usbvision_scratch_alloc(struct usb_usbvision *usbvision) | 375 | int usbvision_scratch_alloc(struct usb_usbvision *usbvision) |
376 | { | 376 | { |
377 | usbvision->scratch = vmalloc(scratch_buf_size); | 377 | usbvision->scratch = vmalloc_32(scratch_buf_size); |
378 | scratch_reset(usbvision); | 378 | scratch_reset(usbvision); |
379 | if(usbvision->scratch == NULL) { | 379 | if(usbvision->scratch == NULL) { |
380 | err("%s: unable to allocate %d bytes for scratch", | 380 | err("%s: unable to allocate %d bytes for scratch", |
@@ -485,7 +485,7 @@ static void usbvision_testpattern(struct usb_usbvision *usbvision, | |||
485 | int usbvision_decompress_alloc(struct usb_usbvision *usbvision) | 485 | int usbvision_decompress_alloc(struct usb_usbvision *usbvision) |
486 | { | 486 | { |
487 | int IFB_size = MAX_FRAME_WIDTH * MAX_FRAME_HEIGHT * 3 / 2; | 487 | int IFB_size = MAX_FRAME_WIDTH * MAX_FRAME_HEIGHT * 3 / 2; |
488 | usbvision->IntraFrameBuffer = vmalloc(IFB_size); | 488 | usbvision->IntraFrameBuffer = vmalloc_32(IFB_size); |
489 | if (usbvision->IntraFrameBuffer == NULL) { | 489 | if (usbvision->IntraFrameBuffer == NULL) { |
490 | err("%s: unable to allocate %d for compr. frame buffer", __FUNCTION__, IFB_size); | 490 | err("%s: unable to allocate %d for compr. frame buffer", __FUNCTION__, IFB_size); |
491 | return -ENOMEM; | 491 | return -ENOMEM; |
@@ -2204,6 +2204,7 @@ int usbvision_power_on(struct usb_usbvision *usbvision) | |||
2204 | usbvision_write_reg(usbvision, USBVISION_PWR_REG, USBVISION_SSPND_EN); | 2204 | usbvision_write_reg(usbvision, USBVISION_PWR_REG, USBVISION_SSPND_EN); |
2205 | usbvision_write_reg(usbvision, USBVISION_PWR_REG, | 2205 | usbvision_write_reg(usbvision, USBVISION_PWR_REG, |
2206 | USBVISION_SSPND_EN | USBVISION_RES2); | 2206 | USBVISION_SSPND_EN | USBVISION_RES2); |
2207 | |||
2207 | usbvision_write_reg(usbvision, USBVISION_PWR_REG, | 2208 | usbvision_write_reg(usbvision, USBVISION_PWR_REG, |
2208 | USBVISION_SSPND_EN | USBVISION_PWR_VID); | 2209 | USBVISION_SSPND_EN | USBVISION_PWR_VID); |
2209 | errCode = usbvision_write_reg(usbvision, USBVISION_PWR_REG, | 2210 | errCode = usbvision_write_reg(usbvision, USBVISION_PWR_REG, |
@@ -2351,40 +2352,6 @@ int usbvision_setup(struct usb_usbvision *usbvision,int format) | |||
2351 | return USBVISION_IS_OPERATIONAL(usbvision); | 2352 | return USBVISION_IS_OPERATIONAL(usbvision); |
2352 | } | 2353 | } |
2353 | 2354 | ||
2354 | |||
2355 | int usbvision_sbuf_alloc(struct usb_usbvision *usbvision) | ||
2356 | { | ||
2357 | int i, errCode = 0; | ||
2358 | const int sb_size = USBVISION_URB_FRAMES * USBVISION_MAX_ISOC_PACKET_SIZE; | ||
2359 | |||
2360 | /* Clean pointers so we know if we allocated something */ | ||
2361 | for (i = 0; i < USBVISION_NUMSBUF; i++) | ||
2362 | usbvision->sbuf[i].data = NULL; | ||
2363 | |||
2364 | for (i = 0; i < USBVISION_NUMSBUF; i++) { | ||
2365 | usbvision->sbuf[i].data = kzalloc(sb_size, GFP_KERNEL); | ||
2366 | if (usbvision->sbuf[i].data == NULL) { | ||
2367 | err("%s: unable to allocate %d bytes for sbuf", __FUNCTION__, sb_size); | ||
2368 | errCode = -ENOMEM; | ||
2369 | break; | ||
2370 | } | ||
2371 | } | ||
2372 | return errCode; | ||
2373 | } | ||
2374 | |||
2375 | |||
2376 | void usbvision_sbuf_free(struct usb_usbvision *usbvision) | ||
2377 | { | ||
2378 | int i; | ||
2379 | |||
2380 | for (i = 0; i < USBVISION_NUMSBUF; i++) { | ||
2381 | if (usbvision->sbuf[i].data != NULL) { | ||
2382 | kfree(usbvision->sbuf[i].data); | ||
2383 | usbvision->sbuf[i].data = NULL; | ||
2384 | } | ||
2385 | } | ||
2386 | } | ||
2387 | |||
2388 | /* | 2355 | /* |
2389 | * usbvision_init_isoc() | 2356 | * usbvision_init_isoc() |
2390 | * | 2357 | * |
@@ -2393,6 +2360,7 @@ int usbvision_init_isoc(struct usb_usbvision *usbvision) | |||
2393 | { | 2360 | { |
2394 | struct usb_device *dev = usbvision->dev; | 2361 | struct usb_device *dev = usbvision->dev; |
2395 | int bufIdx, errCode, regValue; | 2362 | int bufIdx, errCode, regValue; |
2363 | const int sb_size = USBVISION_URB_FRAMES * USBVISION_MAX_ISOC_PACKET_SIZE; | ||
2396 | 2364 | ||
2397 | if (!USBVISION_IS_OPERATIONAL(usbvision)) | 2365 | if (!USBVISION_IS_OPERATIONAL(usbvision)) |
2398 | return -EFAULT; | 2366 | return -EFAULT; |
@@ -2428,6 +2396,7 @@ int usbvision_init_isoc(struct usb_usbvision *usbvision) | |||
2428 | return -ENOMEM; | 2396 | return -ENOMEM; |
2429 | } | 2397 | } |
2430 | usbvision->sbuf[bufIdx].urb = urb; | 2398 | usbvision->sbuf[bufIdx].urb = urb; |
2399 | usbvision->sbuf[bufIdx].data = usb_buffer_alloc(usbvision->dev, sb_size, GFP_KERNEL,&urb->transfer_dma); | ||
2431 | urb->dev = dev; | 2400 | urb->dev = dev; |
2432 | urb->context = usbvision; | 2401 | urb->context = usbvision; |
2433 | urb->pipe = usb_rcvisocpipe(dev, usbvision->video_endp); | 2402 | urb->pipe = usb_rcvisocpipe(dev, usbvision->video_endp); |
@@ -2469,6 +2438,7 @@ int usbvision_init_isoc(struct usb_usbvision *usbvision) | |||
2469 | void usbvision_stop_isoc(struct usb_usbvision *usbvision) | 2438 | void usbvision_stop_isoc(struct usb_usbvision *usbvision) |
2470 | { | 2439 | { |
2471 | int bufIdx, errCode, regValue; | 2440 | int bufIdx, errCode, regValue; |
2441 | const int sb_size = USBVISION_URB_FRAMES * USBVISION_MAX_ISOC_PACKET_SIZE; | ||
2472 | 2442 | ||
2473 | if ((usbvision->streaming == Stream_Off) || (usbvision->dev == NULL)) | 2443 | if ((usbvision->streaming == Stream_Off) || (usbvision->dev == NULL)) |
2474 | return; | 2444 | return; |
@@ -2476,6 +2446,12 @@ void usbvision_stop_isoc(struct usb_usbvision *usbvision) | |||
2476 | /* Unschedule all of the iso td's */ | 2446 | /* Unschedule all of the iso td's */ |
2477 | for (bufIdx = 0; bufIdx < USBVISION_NUMSBUF; bufIdx++) { | 2447 | for (bufIdx = 0; bufIdx < USBVISION_NUMSBUF; bufIdx++) { |
2478 | usb_kill_urb(usbvision->sbuf[bufIdx].urb); | 2448 | usb_kill_urb(usbvision->sbuf[bufIdx].urb); |
2449 | if (usbvision->sbuf[bufIdx].data){ | ||
2450 | usb_buffer_free(usbvision->dev, | ||
2451 | sb_size, | ||
2452 | usbvision->sbuf[bufIdx].data, | ||
2453 | usbvision->sbuf[bufIdx].urb->transfer_dma); | ||
2454 | } | ||
2479 | usb_free_urb(usbvision->sbuf[bufIdx].urb); | 2455 | usb_free_urb(usbvision->sbuf[bufIdx].urb); |
2480 | usbvision->sbuf[bufIdx].urb = NULL; | 2456 | usbvision->sbuf[bufIdx].urb = NULL; |
2481 | } | 2457 | } |
diff --git a/drivers/media/video/usbvision/usbvision-i2c.c b/drivers/media/video/usbvision/usbvision-i2c.c index efcd25bc1615..858252c15084 100644 --- a/drivers/media/video/usbvision/usbvision-i2c.c +++ b/drivers/media/video/usbvision/usbvision-i2c.c | |||
@@ -319,6 +319,9 @@ static int attach_inform(struct i2c_client *client) | |||
319 | case 0x4a: | 319 | case 0x4a: |
320 | PDEBUG(DBG_I2C,"attach_inform: saa7113 detected."); | 320 | PDEBUG(DBG_I2C,"attach_inform: saa7113 detected."); |
321 | break; | 321 | break; |
322 | case 0x48: | ||
323 | PDEBUG(DBG_I2C,"attach_inform: saa7111 detected."); | ||
324 | break; | ||
322 | case 0xa0: | 325 | case 0xa0: |
323 | PDEBUG(DBG_I2C,"attach_inform: eeprom detected."); | 326 | PDEBUG(DBG_I2C,"attach_inform: eeprom detected."); |
324 | break; | 327 | break; |
diff --git a/drivers/media/video/usbvision/usbvision-video.c b/drivers/media/video/usbvision/usbvision-video.c index b77e25ea8838..31b133ef0698 100644 --- a/drivers/media/video/usbvision/usbvision-video.c +++ b/drivers/media/video/usbvision/usbvision-video.c | |||
@@ -353,20 +353,15 @@ static int usbvision_v4l2_open(struct inode *inode, struct file *file) | |||
353 | if(!errCode) { | 353 | if(!errCode) { |
354 | /* Allocate memory for the scratch ring buffer */ | 354 | /* Allocate memory for the scratch ring buffer */ |
355 | errCode = usbvision_scratch_alloc(usbvision); | 355 | errCode = usbvision_scratch_alloc(usbvision); |
356 | if(!errCode) { | 356 | if ((!errCode) && (isocMode==ISOC_MODE_COMPRESS)) { |
357 | /* Allocate memory for the USB S buffers */ | 357 | /* Allocate intermediate decompression buffers only if needed */ |
358 | errCode = usbvision_sbuf_alloc(usbvision); | 358 | errCode = usbvision_decompress_alloc(usbvision); |
359 | if ((!errCode) && (usbvision->isocMode==ISOC_MODE_COMPRESS)) { | ||
360 | /* Allocate intermediate decompression buffers only if needed */ | ||
361 | errCode = usbvision_decompress_alloc(usbvision); | ||
362 | } | ||
363 | } | 359 | } |
364 | } | 360 | } |
365 | if (errCode) { | 361 | if (errCode) { |
366 | /* Deallocate all buffers if trouble */ | 362 | /* Deallocate all buffers if trouble */ |
367 | usbvision_frames_free(usbvision); | 363 | usbvision_frames_free(usbvision); |
368 | usbvision_scratch_free(usbvision); | 364 | usbvision_scratch_free(usbvision); |
369 | usbvision_sbuf_free(usbvision); | ||
370 | usbvision_decompress_free(usbvision); | 365 | usbvision_decompress_free(usbvision); |
371 | } | 366 | } |
372 | } | 367 | } |
@@ -437,9 +432,8 @@ static int usbvision_v4l2_close(struct inode *inode, struct file *file) | |||
437 | usbvision_stop_isoc(usbvision); | 432 | usbvision_stop_isoc(usbvision); |
438 | 433 | ||
439 | usbvision_decompress_free(usbvision); | 434 | usbvision_decompress_free(usbvision); |
440 | usbvision_rvfree(usbvision->fbuf, usbvision->fbuf_size); | 435 | usbvision_frames_free(usbvision); |
441 | usbvision_scratch_free(usbvision); | 436 | usbvision_scratch_free(usbvision); |
442 | usbvision_sbuf_free(usbvision); | ||
443 | 437 | ||
444 | usbvision->user--; | 438 | usbvision->user--; |
445 | 439 | ||
diff --git a/drivers/media/video/usbvision/usbvision.h b/drivers/media/video/usbvision/usbvision.h index b1645f9e572d..e2bcaba93871 100644 --- a/drivers/media/video/usbvision/usbvision.h +++ b/drivers/media/video/usbvision/usbvision.h | |||
@@ -495,8 +495,6 @@ int usbvision_frames_alloc(struct usb_usbvision *usbvision); | |||
495 | void usbvision_frames_free(struct usb_usbvision *usbvision); | 495 | void usbvision_frames_free(struct usb_usbvision *usbvision); |
496 | int usbvision_scratch_alloc(struct usb_usbvision *usbvision); | 496 | int usbvision_scratch_alloc(struct usb_usbvision *usbvision); |
497 | void usbvision_scratch_free(struct usb_usbvision *usbvision); | 497 | void usbvision_scratch_free(struct usb_usbvision *usbvision); |
498 | int usbvision_sbuf_alloc(struct usb_usbvision *usbvision); | ||
499 | void usbvision_sbuf_free(struct usb_usbvision *usbvision); | ||
500 | int usbvision_decompress_alloc(struct usb_usbvision *usbvision); | 498 | int usbvision_decompress_alloc(struct usb_usbvision *usbvision); |
501 | void usbvision_decompress_free(struct usb_usbvision *usbvision); | 499 | void usbvision_decompress_free(struct usb_usbvision *usbvision); |
502 | 500 | ||