Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6

* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (37 commits)
V4L/DVB: v4l: radio: si470x: fix unneeded free_irq() call
V4L/DVB: v4l: videobuf: prevent passing a NULL to dma_free_coherent()
V4L/DVB: ir-core: Fix null dereferences in the protocols sysfs interface
V4L/DVB: v4l: s5p-fimc: Fix 3-planar formats handling and pixel offset error on S5PV210 SoCs
V4L/DVB: v4l: s5p-fimc: Fix return value on probe() failure
V4L/DVB: uvcvideo: Restrict frame rates for Chicony CNF7129 webcam
V4L/DVB: uvcvideo: Fix support for Medion Akoya All-in-one PC integrated webcam
V4L/DVB: ivtvfb: prevent reading uninitialized stack memory
V4L/DVB: cx25840: Fix typo in volume control initialization: 65335 vs. 65535
V4L/DVB: v4l: mem2mem_testdev: add missing release for video_device
V4L/DVB: v4l: mem2mem_testdev: fix errorenous comparison
V4L/DVB: mt9v022.c: Fixed compilation warning
V4L/DVB: mt9m111: added current colorspace at g_fmt
V4L/DVB: mt9m111: cropcap and s_crop check if type is VIDEO_CAPTURE
V4L/DVB: mx2_camera: fix a race causing NULL dereference
V4L/DVB: tm6000: bugfix data handling
V4L/DVB: gspca - sn9c20x: Bad transfer size of Bayer images
V4L/DVB: videobuf-dma-sg: set correct size in last sg element
V4L/DVB: cx231xx: Avoid an OOPS when card is unknown (card=0)
V4L/DVB: dvb: fix smscore_getbuffer() logic
...

+272 -145
+8 -1
drivers/media/IR/ir-keytable.c
··· 319 319 * a keyup event might follow immediately after the keydown. 320 320 */ 321 321 spin_lock_irqsave(&ir->keylock, flags); 322 - if (time_is_after_eq_jiffies(ir->keyup_jiffies)) 322 + if (time_is_before_eq_jiffies(ir->keyup_jiffies)) 323 323 ir_keyup(ir); 324 324 spin_unlock_irqrestore(&ir->keylock, flags); 325 325 } ··· 509 509 driver_name, rc_tab->name, 510 510 (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_IR_RAW) ? 511 511 " in raw mode" : ""); 512 + 513 + /* 514 + * Default delay of 250ms is too short for some protocols, expecially 515 + * since the timeout is currently set to 250ms. Increase it to 500ms, 516 + * to avoid wrong repetition of the keycodes. 517 + */ 518 + input_dev->rep[REP_DELAY] = 500; 512 519 513 520 return 0; 514 521
+1 -1
drivers/media/IR/ir-lirc-codec.c
··· 267 267 features |= LIRC_CAN_SET_SEND_CARRIER; 268 268 269 269 if (ir_dev->props->s_tx_duty_cycle) 270 - features |= LIRC_CAN_SET_REC_DUTY_CYCLE; 270 + features |= LIRC_CAN_SET_SEND_DUTY_CYCLE; 271 271 } 272 272 273 273 if (ir_dev->props->s_rx_carrier_range)
+3 -1
drivers/media/IR/ir-raw-event.c
··· 279 279 "rc%u", (unsigned int)ir->devno); 280 280 281 281 if (IS_ERR(ir->raw->thread)) { 282 + int ret = PTR_ERR(ir->raw->thread); 283 + 282 284 kfree(ir->raw); 283 285 ir->raw = NULL; 284 - return PTR_ERR(ir->raw->thread); 286 + return ret; 285 287 } 286 288 287 289 mutex_lock(&ir_raw_handler_lock);
+11 -6
drivers/media/IR/ir-sysfs.c
··· 67 67 char *tmp = buf; 68 68 int i; 69 69 70 - if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) { 70 + if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) { 71 71 enabled = ir_dev->rc_tab.ir_type; 72 72 allowed = ir_dev->props->allowed_protos; 73 - } else { 73 + } else if (ir_dev->raw) { 74 74 enabled = ir_dev->raw->enabled_protocols; 75 75 allowed = ir_raw_get_allowed_protocols(); 76 - } 76 + } else 77 + return sprintf(tmp, "[builtin]\n"); 77 78 78 79 IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n", 79 80 (long long)allowed, ··· 122 121 int rc, i, count = 0; 123 122 unsigned long flags; 124 123 125 - if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) 124 + if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) 126 125 type = ir_dev->rc_tab.ir_type; 127 - else 126 + else if (ir_dev->raw) 128 127 type = ir_dev->raw->enabled_protocols; 128 + else { 129 + IR_dprintk(1, "Protocol switching not supported\n"); 130 + return -EINVAL; 131 + } 129 132 130 133 while ((tmp = strsep((char **) &data, " \n")) != NULL) { 131 134 if (!*tmp) ··· 190 185 } 191 186 } 192 187 193 - if (ir_dev->props->driver_type == RC_DRIVER_SCANCODE) { 188 + if (ir_dev->props && ir_dev->props->driver_type == RC_DRIVER_SCANCODE) { 194 189 spin_lock_irqsave(&ir_dev->rc_tab.lock, flags); 195 190 ir_dev->rc_tab.ir_type = type; 196 191 spin_unlock_irqrestore(&ir_dev->rc_tab.lock, flags);
+3
drivers/media/IR/keymaps/rc-rc6-mce.c
··· 19 19 20 20 { 0x800f0416, KEY_PLAY }, 21 21 { 0x800f0418, KEY_PAUSE }, 22 + { 0x800f046e, KEY_PLAYPAUSE }, 22 23 { 0x800f0419, KEY_STOP }, 23 24 { 0x800f0417, KEY_RECORD }, 24 25 ··· 38 37 { 0x800f0411, KEY_VOLUMEDOWN }, 39 38 { 0x800f0412, KEY_CHANNELUP }, 40 39 { 0x800f0413, KEY_CHANNELDOWN }, 40 + { 0x800f043a, KEY_BRIGHTNESSUP }, 41 + { 0x800f0480, KEY_BRIGHTNESSDOWN }, 41 42 42 43 { 0x800f0401, KEY_NUMERIC_1 }, 43 44 { 0x800f0402, KEY_NUMERIC_2 },
+4
drivers/media/IR/mceusb.c
··· 120 120 { USB_DEVICE(VENDOR_PHILIPS, 0x0613) }, 121 121 /* Philips eHome Infrared Transceiver */ 122 122 { USB_DEVICE(VENDOR_PHILIPS, 0x0815) }, 123 + /* Philips/Spinel plus IR transceiver for ASUS */ 124 + { USB_DEVICE(VENDOR_PHILIPS, 0x206c) }, 125 + /* Philips/Spinel plus IR transceiver for ASUS */ 126 + { USB_DEVICE(VENDOR_PHILIPS, 0x2088) }, 123 127 /* Realtek MCE IR Receiver */ 124 128 { USB_DEVICE(VENDOR_REALTEK, 0x0161) }, 125 129 /* SMK/Toshiba G83C0004D410 */
-3
drivers/media/dvb/dvb-usb/dib0700_core.c
··· 673 673 else 674 674 dev->props.rc.core.bulk_mode = false; 675 675 676 - /* Need a higher delay, to avoid wrong repeat */ 677 - dev->rc_input_dev->rep[REP_DELAY] = 500; 678 - 679 676 dib0700_rc_setup(dev); 680 677 681 678 return 0;
+54 -2
drivers/media/dvb/dvb-usb/dib0700_devices.c
··· 940 940 return adap->fe == NULL ? -ENODEV : 0; 941 941 } 942 942 943 + /* STK7770P */ 944 + static struct dib7000p_config dib7770p_dib7000p_config = { 945 + .output_mpeg2_in_188_bytes = 1, 946 + 947 + .agc_config_count = 1, 948 + .agc = &dib7070_agc_config, 949 + .bw = &dib7070_bw_config_12_mhz, 950 + .tuner_is_baseband = 1, 951 + .spur_protect = 1, 952 + 953 + .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, 954 + .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, 955 + .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, 956 + 957 + .hostbus_diversity = 1, 958 + .enable_current_mirror = 1, 959 + .disable_sample_and_hold = 0, 960 + }; 961 + 962 + static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap) 963 + { 964 + struct usb_device_descriptor *p = &adap->dev->udev->descriptor; 965 + if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) && 966 + p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E)) 967 + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); 968 + else 969 + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); 970 + msleep(10); 971 + dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); 972 + dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); 973 + dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); 974 + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); 975 + 976 + dib0700_ctrl_clock(adap->dev, 72, 1); 977 + 978 + msleep(10); 979 + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); 980 + msleep(10); 981 + dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); 982 + 983 + if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, 984 + &dib7770p_dib7000p_config) != 0) { 985 + err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", 986 + __func__); 987 + return -ENODEV; 988 + } 989 + 990 + adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, 991 + &dib7770p_dib7000p_config); 992 + return adap->fe == NULL ? -ENODEV : 0; 993 + } 994 + 943 995 /* DIB807x generic */ 944 996 static struct dibx000_agc_config dib807x_agc_config[2] = { 945 997 { ··· 1833 1781 /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) }, 1834 1782 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) }, 1835 1783 { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) }, 1836 - { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) }, 1784 + { USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) }, 1837 1785 { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) }, 1838 1786 /* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) }, 1839 1787 { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) }, ··· 2458 2406 .pid_filter_count = 32, 2459 2407 .pid_filter = stk70x0p_pid_filter, 2460 2408 .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, 2461 - .frontend_attach = stk7070p_frontend_attach, 2409 + .frontend_attach = stk7770p_frontend_attach, 2462 2410 .tuner_attach = dib7770p_tuner_attach, 2463 2411 2464 2412 DIB0700_DEFAULT_STREAMING_CONFIG(0x02),
+1 -3
drivers/media/dvb/dvb-usb/opera1.c
··· 483 483 } 484 484 } 485 485 kfree(p); 486 - if (fw) { 487 - release_firmware(fw); 488 - } 486 + release_firmware(fw); 489 487 return ret; 490 488 } 491 489
+7 -1
drivers/media/dvb/frontends/dib7000p.c
··· 260 260 261 261 // dprintk( "908: %x, 909: %x\n", reg_908, reg_909); 262 262 263 + reg_909 |= (state->cfg.disable_sample_and_hold & 1) << 4; 264 + reg_908 |= (state->cfg.enable_current_mirror & 1) << 7; 265 + 263 266 dib7000p_write_word(state, 908, reg_908); 264 267 dib7000p_write_word(state, 909, reg_909); 265 268 } ··· 781 778 default: 782 779 case GUARD_INTERVAL_1_32: value *= 1; break; 783 780 } 784 - state->div_sync_wait = (value * 3) / 2 + 32; // add 50% SFN margin + compensate for one DVSY-fifo TODO 781 + if (state->cfg.diversity_delay == 0) 782 + state->div_sync_wait = (value * 3) / 2 + 48; // add 50% SFN margin + compensate for one DVSY-fifo 783 + else 784 + state->div_sync_wait = (value * 3) / 2 + state->cfg.diversity_delay; // add 50% SFN margin + compensate for one DVSY-fifo 785 785 786 786 /* deactive the possibility of diversity reception if extended interleaver */ 787 787 state->div_force_off = !1 && ch->u.ofdm.transmission_mode != TRANSMISSION_MODE_8K;
+5
drivers/media/dvb/frontends/dib7000p.h
··· 33 33 int (*agc_control) (struct dvb_frontend *, u8 before); 34 34 35 35 u8 output_mode; 36 + u8 disable_sample_and_hold : 1; 37 + 38 + u8 enable_current_mirror : 1; 39 + u8 diversity_delay; 40 + 36 41 }; 37 42 38 43 #define DEFAULT_DIB7000P_I2C_ADDRESS 18
+13 -20
drivers/media/dvb/siano/smscoreapi.c
··· 1098 1098 * 1099 1099 * @return pointer to descriptor on success, NULL on error. 1100 1100 */ 1101 - struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) 1101 + 1102 + struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev) 1102 1103 { 1103 1104 struct smscore_buffer_t *cb = NULL; 1104 1105 unsigned long flags; 1105 1106 1106 - DEFINE_WAIT(wait); 1107 - 1108 1107 spin_lock_irqsave(&coredev->bufferslock, flags); 1109 - 1110 - /* This function must return a valid buffer, since the buffer list is 1111 - * finite, we check that there is an available buffer, if not, we wait 1112 - * until such buffer become available. 1113 - */ 1114 - 1115 - prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE); 1116 - if (list_empty(&coredev->buffers)) { 1117 - spin_unlock_irqrestore(&coredev->bufferslock, flags); 1118 - schedule(); 1119 - spin_lock_irqsave(&coredev->bufferslock, flags); 1108 + if (!list_empty(&coredev->buffers)) { 1109 + cb = (struct smscore_buffer_t *) coredev->buffers.next; 1110 + list_del(&cb->entry); 1120 1111 } 1121 - 1122 - finish_wait(&coredev->buffer_mng_waitq, &wait); 1123 - 1124 - cb = (struct smscore_buffer_t *) coredev->buffers.next; 1125 - list_del(&cb->entry); 1126 - 1127 1112 spin_unlock_irqrestore(&coredev->bufferslock, flags); 1113 + return cb; 1114 + } 1115 + 1116 + struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) 1117 + { 1118 + struct smscore_buffer_t *cb = NULL; 1119 + 1120 + wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev))); 1128 1121 1129 1122 return cb; 1130 1123 }
+1 -1
drivers/media/radio/si470x/radio-si470x-i2c.c
··· 395 395 radio->registers[POWERCFG] = POWERCFG_ENABLE; 396 396 if (si470x_set_register(radio, POWERCFG) < 0) { 397 397 retval = -EIO; 398 - goto err_all; 398 + goto err_video; 399 399 } 400 400 msleep(110); 401 401
+1
drivers/media/video/cx231xx/Makefile
··· 11 11 EXTRA_CFLAGS += -Idrivers/media/common/tuners 12 12 EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core 13 13 EXTRA_CFLAGS += -Idrivers/media/dvb/frontends 14 + EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-usb 14 15
+11 -6
drivers/media/video/cx231xx/cx231xx-cards.c
··· 32 32 #include <media/v4l2-chip-ident.h> 33 33 34 34 #include <media/cx25840.h> 35 + #include "dvb-usb-ids.h" 35 36 #include "xc5000.h" 36 37 37 38 #include "cx231xx.h" ··· 176 175 .driver_info = CX231XX_BOARD_CNXT_RDE_250}, 177 176 {USB_DEVICE(0x0572, 0x58A1), 178 177 .driver_info = CX231XX_BOARD_CNXT_RDU_250}, 178 + {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000,0x4fff), 179 + .driver_info = CX231XX_BOARD_UNKNOWN}, 179 180 {}, 180 181 }; 181 182 ··· 229 226 dev->board.name, dev->model); 230 227 231 228 /* set the direction for GPIO pins */ 232 - cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1); 233 - cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1); 234 - cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1); 229 + if (dev->board.tuner_gpio) { 230 + cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1); 231 + cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1); 232 + cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1); 235 233 236 - /* request some modules if any required */ 234 + /* request some modules if any required */ 237 235 238 - /* reset the Tuner */ 239 - cx231xx_gpio_set(dev, dev->board.tuner_gpio); 236 + /* reset the Tuner */ 237 + cx231xx_gpio_set(dev, dev->board.tuner_gpio); 238 + } 240 239 241 240 /* set the mode to Analog mode initially */ 242 241 cx231xx_set_mode(dev, CX231XX_ANALOG_MODE);
+1 -1
drivers/media/video/cx25840/cx25840-core.c
··· 1996 1996 1997 1997 state->volume = v4l2_ctrl_new_std(&state->hdl, 1998 1998 &cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_VOLUME, 1999 - 0, 65335, 65535 / 100, default_volume); 1999 + 0, 65535, 65535 / 100, default_volume); 2000 2000 state->mute = v4l2_ctrl_new_std(&state->hdl, 2001 2001 &cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_MUTE, 2002 2002 0, 1, 1, 0);
+1 -1
drivers/media/video/cx88/Kconfig
··· 17 17 18 18 config VIDEO_CX88_ALSA 19 19 tristate "Conexant 2388x DMA audio support" 20 - depends on VIDEO_CX88 && SND && EXPERIMENTAL 20 + depends on VIDEO_CX88 && SND 21 21 select SND_PCM 22 22 ---help--- 23 23 This is a video4linux driver for direct (DMA) audio on
+1
drivers/media/video/gspca/gspca.c
··· 223 223 usb_rcvintpipe(dev, ep->bEndpointAddress), 224 224 buffer, buffer_len, 225 225 int_irq, (void *)gspca_dev, interval); 226 + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 226 227 gspca_dev->int_urb = urb; 227 228 ret = usb_submit_urb(urb, GFP_KERNEL); 228 229 if (ret < 0) {
+1 -2
drivers/media/video/gspca/sn9c20x.c
··· 2357 2357 (data[33] << 10); 2358 2358 avg_lum >>= 9; 2359 2359 atomic_set(&sd->avg_lum, avg_lum); 2360 - gspca_frame_add(gspca_dev, LAST_PACKET, 2361 - data, len); 2360 + gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); 2362 2361 return; 2363 2362 } 2364 2363 if (gspca_dev->last_packet_type == LAST_PACKET) {
+2
drivers/media/video/ivtv/ivtvfb.c
··· 466 466 struct fb_vblank vblank; 467 467 u32 trace; 468 468 469 + memset(&vblank, 0, sizeof(struct fb_vblank)); 470 + 469 471 vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT | 470 472 FB_VBLANK_HAVE_VSYNC; 471 473 trace = read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16;
+2 -1
drivers/media/video/mem2mem_testdev.c
··· 239 239 return -EFAULT; 240 240 } 241 241 242 - if (in_buf->vb.size < out_buf->vb.size) { 242 + if (in_buf->vb.size > out_buf->vb.size) { 243 243 v4l2_err(&dev->v4l2_dev, "Output buffer is too small\n"); 244 244 return -EINVAL; 245 245 } ··· 1014 1014 v4l2_m2m_release(dev->m2m_dev); 1015 1015 del_timer_sync(&dev->timer); 1016 1016 video_unregister_device(dev->vfd); 1017 + video_device_release(dev->vfd); 1017 1018 v4l2_device_unregister(&dev->v4l2_dev); 1018 1019 kfree(dev); 1019 1020
+7 -1
drivers/media/video/mt9m111.c
··· 447 447 dev_dbg(&client->dev, "%s left=%d, top=%d, width=%d, height=%d\n", 448 448 __func__, rect.left, rect.top, rect.width, rect.height); 449 449 450 + if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 451 + return -EINVAL; 452 + 450 453 ret = mt9m111_make_rect(client, &rect); 451 454 if (!ret) 452 455 mt9m111->rect = rect; ··· 469 466 470 467 static int mt9m111_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a) 471 468 { 469 + if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 470 + return -EINVAL; 471 + 472 472 a->bounds.left = MT9M111_MIN_DARK_COLS; 473 473 a->bounds.top = MT9M111_MIN_DARK_ROWS; 474 474 a->bounds.width = MT9M111_MAX_WIDTH; 475 475 a->bounds.height = MT9M111_MAX_HEIGHT; 476 476 a->defrect = a->bounds; 477 - a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 478 477 a->pixelaspect.numerator = 1; 479 478 a->pixelaspect.denominator = 1; 480 479 ··· 492 487 mf->width = mt9m111->rect.width; 493 488 mf->height = mt9m111->rect.height; 494 489 mf->code = mt9m111->fmt->code; 490 + mf->colorspace = mt9m111->fmt->colorspace; 495 491 mf->field = V4L2_FIELD_NONE; 496 492 497 493 return 0;
-3
drivers/media/video/mt9v022.c
··· 402 402 if (mt9v022->model != V4L2_IDENT_MT9V022IX7ATC) 403 403 return -EINVAL; 404 404 break; 405 - case 0: 406 - /* No format change, only geometry */ 407 - break; 408 405 default: 409 406 return -EINVAL; 410 407 }
+4
drivers/media/video/mx2_camera.c
··· 378 378 379 379 spin_lock_irqsave(&pcdev->lock, flags); 380 380 381 + if (*fb_active == NULL) 382 + goto out; 383 + 381 384 vb = &(*fb_active)->vb; 382 385 dev_dbg(pcdev->dev, "%s (vb=0x%p) 0x%08lx %d\n", __func__, 383 386 vb, vb->baddr, vb->bsize); ··· 405 402 406 403 *fb_active = buf; 407 404 405 + out: 408 406 spin_unlock_irqrestore(&pcdev->lock, flags); 409 407 } 410 408
+3 -3
drivers/media/video/pvrusb2/pvrusb2-ctrl.c
··· 513 513 if (ret >= 0) { 514 514 ret = pvr2_ctrl_range_check(cptr,*valptr); 515 515 } 516 - if (maskptr) *maskptr = ~0; 516 + *maskptr = ~0; 517 517 } else if (cptr->info->type == pvr2_ctl_bool) { 518 518 ret = parse_token(ptr,len,valptr,boolNames, 519 519 ARRAY_SIZE(boolNames)); ··· 522 522 } else if (ret == 0) { 523 523 *valptr = (*valptr & 1) ? !0 : 0; 524 524 } 525 - if (maskptr) *maskptr = 1; 525 + *maskptr = 1; 526 526 } else if (cptr->info->type == pvr2_ctl_enum) { 527 527 ret = parse_token( 528 528 ptr,len,valptr, ··· 531 531 if (ret >= 0) { 532 532 ret = pvr2_ctrl_range_check(cptr,*valptr); 533 533 } 534 - if (maskptr) *maskptr = ~0; 534 + *maskptr = ~0; 535 535 } else if (cptr->info->type == pvr2_ctl_bitmask) { 536 536 ret = parse_tlist( 537 537 ptr,len,maskptr,valptr,
+42 -52
drivers/media/video/s5p-fimc/fimc-core.c
··· 393 393 dbg("ctx->out_order_1p= %d", ctx->out_order_1p); 394 394 } 395 395 396 + static void fimc_prepare_dma_offset(struct fimc_ctx *ctx, struct fimc_frame *f) 397 + { 398 + struct samsung_fimc_variant *variant = ctx->fimc_dev->variant; 399 + 400 + f->dma_offset.y_h = f->offs_h; 401 + if (!variant->pix_hoff) 402 + f->dma_offset.y_h *= (f->fmt->depth >> 3); 403 + 404 + f->dma_offset.y_v = f->offs_v; 405 + 406 + f->dma_offset.cb_h = f->offs_h; 407 + f->dma_offset.cb_v = f->offs_v; 408 + 409 + f->dma_offset.cr_h = f->offs_h; 410 + f->dma_offset.cr_v = f->offs_v; 411 + 412 + if (!variant->pix_hoff) { 413 + if (f->fmt->planes_cnt == 3) { 414 + f->dma_offset.cb_h >>= 1; 415 + f->dma_offset.cr_h >>= 1; 416 + } 417 + if (f->fmt->color == S5P_FIMC_YCBCR420) { 418 + f->dma_offset.cb_v >>= 1; 419 + f->dma_offset.cr_v >>= 1; 420 + } 421 + } 422 + 423 + dbg("in_offset: color= %d, y_h= %d, y_v= %d", 424 + f->fmt->color, f->dma_offset.y_h, f->dma_offset.y_v); 425 + } 426 + 396 427 /** 397 428 * fimc_prepare_config - check dimensions, operation and color mode 398 429 * and pre-calculate offset and the scaling coefficients. ··· 437 406 { 438 407 struct fimc_frame *s_frame, *d_frame; 439 408 struct fimc_vid_buffer *buf = NULL; 440 - struct samsung_fimc_variant *variant = ctx->fimc_dev->variant; 441 409 int ret = 0; 442 410 443 411 s_frame = &ctx->s_frame; ··· 449 419 swap(d_frame->width, d_frame->height); 450 420 } 451 421 452 - /* Prepare the output offset ratios for scaler. */ 453 - d_frame->dma_offset.y_h = d_frame->offs_h; 454 - if (!variant->pix_hoff) 455 - d_frame->dma_offset.y_h *= (d_frame->fmt->depth >> 3); 422 + /* Prepare the DMA offset ratios for scaler. */ 423 + fimc_prepare_dma_offset(ctx, &ctx->s_frame); 424 + fimc_prepare_dma_offset(ctx, &ctx->d_frame); 456 425 457 - d_frame->dma_offset.y_v = d_frame->offs_v; 458 - 459 - d_frame->dma_offset.cb_h = d_frame->offs_h; 460 - d_frame->dma_offset.cb_v = d_frame->offs_v; 461 - 462 - d_frame->dma_offset.cr_h = d_frame->offs_h; 463 - d_frame->dma_offset.cr_v = d_frame->offs_v; 464 - 465 - if (!variant->pix_hoff && d_frame->fmt->planes_cnt == 3) { 466 - d_frame->dma_offset.cb_h >>= 1; 467 - d_frame->dma_offset.cb_v >>= 1; 468 - d_frame->dma_offset.cr_h >>= 1; 469 - d_frame->dma_offset.cr_v >>= 1; 470 - } 471 - 472 - dbg("out offset: color= %d, y_h= %d, y_v= %d", 473 - d_frame->fmt->color, 474 - d_frame->dma_offset.y_h, d_frame->dma_offset.y_v); 475 - 476 - /* Prepare the input offset ratios for scaler. */ 477 - s_frame->dma_offset.y_h = s_frame->offs_h; 478 - if (!variant->pix_hoff) 479 - s_frame->dma_offset.y_h *= (s_frame->fmt->depth >> 3); 480 - s_frame->dma_offset.y_v = s_frame->offs_v; 481 - 482 - s_frame->dma_offset.cb_h = s_frame->offs_h; 483 - s_frame->dma_offset.cb_v = s_frame->offs_v; 484 - 485 - s_frame->dma_offset.cr_h = s_frame->offs_h; 486 - s_frame->dma_offset.cr_v = s_frame->offs_v; 487 - 488 - if (!variant->pix_hoff && s_frame->fmt->planes_cnt == 3) { 489 - s_frame->dma_offset.cb_h >>= 1; 490 - s_frame->dma_offset.cb_v >>= 1; 491 - s_frame->dma_offset.cr_h >>= 1; 492 - s_frame->dma_offset.cr_v >>= 1; 493 - } 494 - 495 - dbg("in offset: color= %d, y_h= %d, y_v= %d", 496 - s_frame->fmt->color, s_frame->dma_offset.y_h, 497 - s_frame->dma_offset.y_v); 498 - 499 - fimc_set_yuv_order(ctx); 500 - 501 - /* Check against the scaler ratio. */ 502 426 if (s_frame->height > (SCALER_MAX_VRATIO * d_frame->height) || 503 427 s_frame->width > (SCALER_MAX_HRATIO * d_frame->width)) { 504 428 err("out of scaler range"); 505 429 return -EINVAL; 506 430 } 431 + fimc_set_yuv_order(ctx); 507 432 } 508 433 509 434 /* Input DMA mode is not allowed when the scaler is disabled. */ ··· 807 822 } else { 808 823 v4l2_err(&ctx->fimc_dev->m2m.v4l2_dev, 809 824 "Wrong buffer/video queue type (%d)\n", f->type); 810 - return -EINVAL; 825 + ret = -EINVAL; 826 + goto s_fmt_out; 811 827 } 812 828 813 829 pix = &f->fmt.pix; ··· 1400 1414 } 1401 1415 1402 1416 fimc->work_queue = create_workqueue(dev_name(&fimc->pdev->dev)); 1403 - if (!fimc->work_queue) 1417 + if (!fimc->work_queue) { 1418 + ret = -ENOMEM; 1404 1419 goto err_irq; 1420 + } 1405 1421 1406 1422 ret = fimc_register_m2m_device(fimc); 1407 1423 if (ret) ··· 1480 1492 }; 1481 1493 1482 1494 static struct samsung_fimc_variant fimc01_variant_s5pv210 = { 1495 + .pix_hoff = 1, 1483 1496 .has_inp_rot = 1, 1484 1497 .has_out_rot = 1, 1485 1498 .min_inp_pixsize = 16, ··· 1495 1506 }; 1496 1507 1497 1508 static struct samsung_fimc_variant fimc2_variant_s5pv210 = { 1509 + .pix_hoff = 1, 1498 1510 .min_inp_pixsize = 16, 1499 1511 .min_out_pixsize = 32, 1500 1512
+5 -5
drivers/media/video/saa7134/saa7134-cards.c
··· 4323 4323 }, 4324 4324 [SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM] = { 4325 4325 /* Beholder Intl. Ltd. 2008 */ 4326 - /*Dmitry Belimov <d.belimov@gmail.com> */ 4327 - .name = "Beholder BeholdTV Columbus TVFM", 4326 + /* Dmitry Belimov <d.belimov@gmail.com> */ 4327 + .name = "Beholder BeholdTV Columbus TV/FM", 4328 4328 .audio_clock = 0x00187de7, 4329 4329 .tuner_type = TUNER_ALPS_TSBE5_PAL, 4330 - .radio_type = UNSET, 4331 - .tuner_addr = ADDR_UNSET, 4332 - .radio_addr = ADDR_UNSET, 4330 + .radio_type = TUNER_TEA5767, 4331 + .tuner_addr = 0xc2 >> 1, 4332 + .radio_addr = 0xc0 >> 1, 4333 4333 .tda9887_conf = TDA9887_PRESENT, 4334 4334 .gpiomask = 0x000A8004, 4335 4335 .inputs = {{
+3 -2
drivers/media/video/saa7164/saa7164-buffer.c
··· 136 136 int saa7164_buffer_dealloc(struct saa7164_tsport *port, 137 137 struct saa7164_buffer *buf) 138 138 { 139 - struct saa7164_dev *dev = port->dev; 139 + struct saa7164_dev *dev; 140 140 141 - if ((buf == 0) || (port == 0)) 141 + if (!buf || !port) 142 142 return SAA_ERR_BAD_PARAMETER; 143 + dev = port->dev; 143 144 144 145 dprintk(DBGLVL_BUF, "%s() deallocating buffer @ 0x%p\n", __func__, buf); 145 146
+24
drivers/media/video/uvc/uvc_driver.c
··· 486 486 max(frame->dwFrameInterval[0], 487 487 frame->dwDefaultFrameInterval)); 488 488 489 + if (dev->quirks & UVC_QUIRK_RESTRICT_FRAME_RATE) { 490 + frame->bFrameIntervalType = 1; 491 + frame->dwFrameInterval[0] = 492 + frame->dwDefaultFrameInterval; 493 + } 494 + 489 495 uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n", 490 496 frame->wWidth, frame->wHeight, 491 497 10000000/frame->dwDefaultFrameInterval, ··· 2032 2026 .bInterfaceClass = USB_CLASS_VENDOR_SPEC, 2033 2027 .bInterfaceSubClass = 1, 2034 2028 .bInterfaceProtocol = 0 }, 2029 + /* Chicony CNF7129 (Asus EEE 100HE) */ 2030 + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2031 + | USB_DEVICE_ID_MATCH_INT_INFO, 2032 + .idVendor = 0x04f2, 2033 + .idProduct = 0xb071, 2034 + .bInterfaceClass = USB_CLASS_VIDEO, 2035 + .bInterfaceSubClass = 1, 2036 + .bInterfaceProtocol = 0, 2037 + .driver_info = UVC_QUIRK_RESTRICT_FRAME_RATE }, 2035 2038 /* Alcor Micro AU3820 (Future Boy PC USB Webcam) */ 2036 2039 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2037 2040 | USB_DEVICE_ID_MATCH_INT_INFO, ··· 2106 2091 .bInterfaceProtocol = 0, 2107 2092 .driver_info = UVC_QUIRK_PROBE_MINMAX 2108 2093 | UVC_QUIRK_PROBE_DEF }, 2094 + /* IMC Networks (Medion Akoya) */ 2095 + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2096 + | USB_DEVICE_ID_MATCH_INT_INFO, 2097 + .idVendor = 0x13d3, 2098 + .idProduct = 0x5103, 2099 + .bInterfaceClass = USB_CLASS_VIDEO, 2100 + .bInterfaceSubClass = 1, 2101 + .bInterfaceProtocol = 0, 2102 + .driver_info = UVC_QUIRK_STREAM_NO_FID }, 2109 2103 /* Syntek (HP Spartan) */ 2110 2104 { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 2111 2105 | USB_DEVICE_ID_MATCH_INT_INFO,
+1
drivers/media/video/uvc/uvcvideo.h
··· 182 182 #define UVC_QUIRK_IGNORE_SELECTOR_UNIT 0x00000020 183 183 #define UVC_QUIRK_FIX_BANDWIDTH 0x00000080 184 184 #define UVC_QUIRK_PROBE_DEF 0x00000100 185 + #define UVC_QUIRK_RESTRICT_FRAME_RATE 0x00000200 185 186 186 187 /* Format flags */ 187 188 #define UVC_FMT_FLAG_COMPRESSED 0x00000001
+4 -2
drivers/media/video/videobuf-dma-contig.c
··· 393 393 } 394 394 395 395 /* read() method */ 396 - dma_free_coherent(q->dev, mem->size, mem->vaddr, mem->dma_handle); 397 - mem->vaddr = NULL; 396 + if (mem->vaddr) { 397 + dma_free_coherent(q->dev, mem->size, mem->vaddr, mem->dma_handle); 398 + mem->vaddr = NULL; 399 + } 398 400 } 399 401 EXPORT_SYMBOL_GPL(videobuf_dma_contig_free); 400 402
+7 -4
drivers/media/video/videobuf-dma-sg.c
··· 94 94 * must free the memory. 95 95 */ 96 96 static struct scatterlist *videobuf_pages_to_sg(struct page **pages, 97 - int nr_pages, int offset) 97 + int nr_pages, int offset, size_t size) 98 98 { 99 99 struct scatterlist *sglist; 100 100 int i; ··· 110 110 /* DMA to highmem pages might not work */ 111 111 goto highmem; 112 112 sg_set_page(&sglist[0], pages[0], PAGE_SIZE - offset, offset); 113 + size -= PAGE_SIZE - offset; 113 114 for (i = 1; i < nr_pages; i++) { 114 115 if (NULL == pages[i]) 115 116 goto nopage; 116 117 if (PageHighMem(pages[i])) 117 118 goto highmem; 118 - sg_set_page(&sglist[i], pages[i], PAGE_SIZE, 0); 119 + sg_set_page(&sglist[i], pages[i], min(PAGE_SIZE, size), 0); 120 + size -= min(PAGE_SIZE, size); 119 121 } 120 122 return sglist; 121 123 ··· 172 170 173 171 first = (data & PAGE_MASK) >> PAGE_SHIFT; 174 172 last = ((data+size-1) & PAGE_MASK) >> PAGE_SHIFT; 175 - dma->offset = data & ~PAGE_MASK; 173 + dma->offset = data & ~PAGE_MASK; 174 + dma->size = size; 176 175 dma->nr_pages = last-first+1; 177 176 dma->pages = kmalloc(dma->nr_pages * sizeof(struct page *), GFP_KERNEL); 178 177 if (NULL == dma->pages) ··· 255 252 256 253 if (dma->pages) { 257 254 dma->sglist = videobuf_pages_to_sg(dma->pages, dma->nr_pages, 258 - dma->offset); 255 + dma->offset, dma->size); 259 256 } 260 257 if (dma->vaddr) { 261 258 dma->sglist = videobuf_vmalloc_to_sg(dma->vaddr,
+1 -1
drivers/staging/tm6000/Kconfig
··· 1 1 config VIDEO_TM6000 2 2 tristate "TV Master TM5600/6000/6010 driver" 3 - depends on VIDEO_DEV && I2C && INPUT && USB && EXPERIMENTAL 3 + depends on VIDEO_DEV && I2C && INPUT && IR_CORE && USB && EXPERIMENTAL 4 4 select VIDEO_TUNER 5 5 select MEDIA_TUNER_XC2028 6 6 select MEDIA_TUNER_XC5000
+39 -22
drivers/staging/tm6000/tm6000-input.c
··· 46 46 } 47 47 48 48 struct tm6000_ir_poll_result { 49 - u8 rc_data[4]; 49 + u16 rc_data; 50 50 }; 51 51 52 52 struct tm6000_IR { ··· 60 60 int polling; 61 61 struct delayed_work work; 62 62 u8 wait:1; 63 + u8 key:1; 63 64 struct urb *int_urb; 64 65 u8 *urb_data; 65 - u8 key:1; 66 66 67 67 int (*get_key) (struct tm6000_IR *, struct tm6000_ir_poll_result *); 68 68 ··· 122 122 123 123 if (urb->status != 0) 124 124 printk(KERN_INFO "not ready\n"); 125 - else if (urb->actual_length > 0) 125 + else if (urb->actual_length > 0) { 126 126 memcpy(ir->urb_data, urb->transfer_buffer, urb->actual_length); 127 127 128 - dprintk("data %02x %02x %02x %02x\n", ir->urb_data[0], 129 - ir->urb_data[1], ir->urb_data[2], ir->urb_data[3]); 128 + dprintk("data %02x %02x %02x %02x\n", ir->urb_data[0], 129 + ir->urb_data[1], ir->urb_data[2], ir->urb_data[3]); 130 130 131 - ir->key = 1; 131 + ir->key = 1; 132 + } 132 133 133 134 rc = usb_submit_urb(urb, GFP_ATOMIC); 134 135 } ··· 141 140 int rc; 142 141 u8 buf[2]; 143 142 144 - if (ir->wait && !&dev->int_in) { 145 - poll_result->rc_data[0] = 0xff; 143 + if (ir->wait && !&dev->int_in) 146 144 return 0; 147 - } 148 145 149 146 if (&dev->int_in) { 150 - poll_result->rc_data[0] = ir->urb_data[0]; 151 - poll_result->rc_data[1] = ir->urb_data[1]; 147 + if (ir->ir.ir_type == IR_TYPE_RC5) 148 + poll_result->rc_data = ir->urb_data[0]; 149 + else 150 + poll_result->rc_data = ir->urb_data[0] | ir->urb_data[1] << 8; 152 151 } else { 153 152 tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT, 2, 0); 154 153 msleep(10); 155 154 tm6000_set_reg(dev, REQ_04_EN_DISABLE_MCU_INT, 2, 1); 156 155 msleep(10); 157 156 158 - rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | 159 - USB_RECIP_DEVICE, REQ_02_GET_IR_CODE, 0, 0, buf, 1); 157 + if (ir->ir.ir_type == IR_TYPE_RC5) { 158 + rc = tm6000_read_write_usb(dev, USB_DIR_IN | 159 + USB_TYPE_VENDOR | USB_RECIP_DEVICE, 160 + REQ_02_GET_IR_CODE, 0, 0, buf, 1); 160 161 161 - msleep(10); 162 + msleep(10); 162 163 163 - dprintk("read data=%02x\n", buf[0]); 164 - if (rc < 0) 165 - return rc; 164 + dprintk("read data=%02x\n", buf[0]); 165 + if (rc < 0) 166 + return rc; 166 167 167 - poll_result->rc_data[0] = buf[0]; 168 + poll_result->rc_data = buf[0]; 169 + } else { 170 + rc = tm6000_read_write_usb(dev, USB_DIR_IN | 171 + USB_TYPE_VENDOR | USB_RECIP_DEVICE, 172 + REQ_02_GET_IR_CODE, 0, 0, buf, 2); 173 + 174 + msleep(10); 175 + 176 + dprintk("read data=%04x\n", buf[0] | buf[1] << 8); 177 + if (rc < 0) 178 + return rc; 179 + 180 + poll_result->rc_data = buf[0] | buf[1] << 8; 181 + } 182 + if ((poll_result->rc_data & 0x00ff) != 0xff) 183 + ir->key = 1; 168 184 } 169 185 return 0; 170 186 } ··· 198 180 return; 199 181 } 200 182 201 - dprintk("ir->get_key result data=%02x %02x\n", 202 - poll_result.rc_data[0], poll_result.rc_data[1]); 183 + dprintk("ir->get_key result data=%04x\n", poll_result.rc_data); 203 184 204 - if (poll_result.rc_data[0] != 0xff && ir->key == 1) { 185 + if (ir->key) { 205 186 ir_input_keydown(ir->input->input_dev, &ir->ir, 206 - poll_result.rc_data[0] | poll_result.rc_data[1] << 8); 187 + (u32)poll_result.rc_data); 207 188 208 189 ir_input_nokey(ir->input->input_dev, &ir->ir); 209 190 ir->key = 0;
+1
include/media/videobuf-dma-sg.h
··· 48 48 49 49 /* for userland buffer */ 50 50 int offset; 51 + size_t size; 51 52 struct page **pages; 52 53 53 54 /* for kernel buffers */