Browse Source

Merge tag 'media/v3.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull media fixes from Mauro Carvalho Chehab:
 "A series of driver fixes:
   - a few compilation fixes with randconfigs
   - one potential compilation breakage on userspace due to the usage of
     a gcc extension
   - several warnings fixed
   - some other random driver fixes"

* tag 'media/v3.18-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (22 commits)
  [media] s5p-jpeg: Avoid -Wuninitialized warning in s5p_jpeg_parse_hdr
  [media] s5p-fimc: Only build suspend/resume for PM
  [media] s5p-jpeg: Only build suspend/resume for PM
  [media] Remove references to non-existent PLAT_S5P symbol
  [media] videobuf-dma-contig: set vm_pgoff to be zero to pass the sanity check in vm_iomap_memory()
  [media] tw68: remove bogus I2C_ALGOBIT dependency
  [media] usbvision-video: two use after frees
  [media] tw68: remove deprecated IRQF_DISABLED
  [media] xc5000: use after free in release()
  [media] em28xx-input: NULL dereference on error
  [media] wl128x: fix fmdbg compiler warning
  Revert "[media] v4l2-dv-timings: fix a sparse warning"
  [media] hackrf: harmless off by one in debug code
  [media] cx23885: initialize config structs for T9580
  [media] v4l: uvcvideo: Fix buffer completion size check
  [media] vivid: fix buffer overrun
  [media] saa7146: Create a device name before it's used
  [media] em28xx: fix uninitialized variable warning
  [media] vivid: fix Kconfig FB dependency
  [media] anysee: make sure loading modules is const
  ...
Linus Torvalds 10 years ago
parent
commit
f7e87a44ef

+ 4 - 0
Documentation/DocBook/media/v4l/compat.xml

@@ -2566,6 +2566,10 @@ fields changed from _s32 to _u32.
 	  <para>Added compound control types and &VIDIOC-QUERY-EXT-CTRL;.
 	  <para>Added compound control types and &VIDIOC-QUERY-EXT-CTRL;.
 	  </para>
 	  </para>
         </listitem>
         </listitem>
+      </orderedlist>
+    </section>
+
+    <section>
       <title>V4L2 in Linux 3.18</title>
       <title>V4L2 in Linux 3.18</title>
       <orderedlist>
       <orderedlist>
 	<listitem>
 	<listitem>

+ 3 - 3
drivers/media/common/saa7146/saa7146_core.c

@@ -364,6 +364,9 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
 		goto out;
 		goto out;
 	}
 	}
 
 
+	/* create a nice device name */
+	sprintf(dev->name, "saa7146 (%d)", saa7146_num);
+
 	DEB_EE("pci:%p\n", pci);
 	DEB_EE("pci:%p\n", pci);
 
 
 	err = pci_enable_device(pci);
 	err = pci_enable_device(pci);
@@ -438,9 +441,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
 
 
 	/* the rest + print status message */
 	/* the rest + print status message */
 
 
-	/* create a nice device name */
-	sprintf(dev->name, "saa7146 (%d)", saa7146_num);
-
 	pr_info("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x)\n",
 	pr_info("found saa7146 @ mem %p (revision %d, irq %d) (0x%04x,0x%04x)\n",
 		dev->mem, dev->revision, pci->irq,
 		dev->mem, dev->revision, pci->irq,
 		pci->subsystem_vendor, pci->subsystem_device);
 		pci->subsystem_vendor, pci->subsystem_device);

+ 3 - 0
drivers/media/pci/cx23885/cx23885-dvb.c

@@ -1600,6 +1600,7 @@ static int dvb_register(struct cx23885_tsport *port)
 				break;
 				break;
 
 
 			/* attach tuner */
 			/* attach tuner */
+			memset(&m88ts2022_config, 0, sizeof(m88ts2022_config));
 			m88ts2022_config.fe = fe0->dvb.frontend;
 			m88ts2022_config.fe = fe0->dvb.frontend;
 			m88ts2022_config.clock = 27000000;
 			m88ts2022_config.clock = 27000000;
 			memset(&info, 0, sizeof(struct i2c_board_info));
 			memset(&info, 0, sizeof(struct i2c_board_info));
@@ -1635,6 +1636,7 @@ static int dvb_register(struct cx23885_tsport *port)
 		/* port c - terrestrial/cable */
 		/* port c - terrestrial/cable */
 		case 2:
 		case 2:
 			/* attach frontend */
 			/* attach frontend */
+			memset(&si2168_config, 0, sizeof(si2168_config));
 			si2168_config.i2c_adapter = &adapter;
 			si2168_config.i2c_adapter = &adapter;
 			si2168_config.fe = &fe0->dvb.frontend;
 			si2168_config.fe = &fe0->dvb.frontend;
 			si2168_config.ts_mode = SI2168_TS_SERIAL;
 			si2168_config.ts_mode = SI2168_TS_SERIAL;
@@ -1654,6 +1656,7 @@ static int dvb_register(struct cx23885_tsport *port)
 			port->i2c_client_demod = client_demod;
 			port->i2c_client_demod = client_demod;
 
 
 			/* attach tuner */
 			/* attach tuner */
+			memset(&si2157_config, 0, sizeof(si2157_config));
 			si2157_config.fe = fe0->dvb.frontend;
 			si2157_config.fe = fe0->dvb.frontend;
 			memset(&info, 0, sizeof(struct i2c_board_info));
 			memset(&info, 0, sizeof(struct i2c_board_info));
 			strlcpy(info.type, "si2157", I2C_NAME_SIZE);
 			strlcpy(info.type, "si2157", I2C_NAME_SIZE);

+ 0 - 1
drivers/media/pci/tw68/Kconfig

@@ -1,7 +1,6 @@
 config VIDEO_TW68
 config VIDEO_TW68
 	tristate "Techwell tw68x Video For Linux"
 	tristate "Techwell tw68x Video For Linux"
 	depends on VIDEO_DEV && PCI && VIDEO_V4L2
 	depends on VIDEO_DEV && PCI && VIDEO_V4L2
-	select I2C_ALGOBIT
 	select VIDEOBUF2_DMA_SG
 	select VIDEOBUF2_DMA_SG
 	---help---
 	---help---
 	  Support for Techwell tw68xx based frame grabber boards.
 	  Support for Techwell tw68xx based frame grabber boards.

+ 1 - 1
drivers/media/pci/tw68/tw68-core.c

@@ -306,7 +306,7 @@ static int tw68_initdev(struct pci_dev *pci_dev,
 
 
 	/* get irq */
 	/* get irq */
 	err = devm_request_irq(&pci_dev->dev, pci_dev->irq, tw68_irq,
 	err = devm_request_irq(&pci_dev->dev, pci_dev->irq, tw68_irq,
-			  IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
+			  IRQF_SHARED, dev->name, dev);
 	if (err < 0) {
 	if (err < 0) {
 		pr_err("%s: can't get IRQ %d\n",
 		pr_err("%s: can't get IRQ %d\n",
 		       dev->name, pci_dev->irq);
 		       dev->name, pci_dev->irq);

+ 3 - 3
drivers/media/platform/Kconfig

@@ -166,7 +166,7 @@ config VIDEO_MEM2MEM_DEINTERLACE
 config VIDEO_SAMSUNG_S5P_G2D
 config VIDEO_SAMSUNG_S5P_G2D
 	tristate "Samsung S5P and EXYNOS4 G2D 2d graphics accelerator driver"
 	tristate "Samsung S5P and EXYNOS4 G2D 2d graphics accelerator driver"
 	depends on VIDEO_DEV && VIDEO_V4L2
 	depends on VIDEO_DEV && VIDEO_V4L2
-	depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST
+	depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
 	depends on HAS_DMA
 	depends on HAS_DMA
 	select VIDEOBUF2_DMA_CONTIG
 	select VIDEOBUF2_DMA_CONTIG
 	select V4L2_MEM2MEM_DEV
 	select V4L2_MEM2MEM_DEV
@@ -178,7 +178,7 @@ config VIDEO_SAMSUNG_S5P_G2D
 config VIDEO_SAMSUNG_S5P_JPEG
 config VIDEO_SAMSUNG_S5P_JPEG
 	tristate "Samsung S5P/Exynos3250/Exynos4 JPEG codec driver"
 	tristate "Samsung S5P/Exynos3250/Exynos4 JPEG codec driver"
 	depends on VIDEO_DEV && VIDEO_V4L2
 	depends on VIDEO_DEV && VIDEO_V4L2
-	depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST
+	depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
 	depends on HAS_DMA
 	depends on HAS_DMA
 	select VIDEOBUF2_DMA_CONTIG
 	select VIDEOBUF2_DMA_CONTIG
 	select V4L2_MEM2MEM_DEV
 	select V4L2_MEM2MEM_DEV
@@ -189,7 +189,7 @@ config VIDEO_SAMSUNG_S5P_JPEG
 config VIDEO_SAMSUNG_S5P_MFC
 config VIDEO_SAMSUNG_S5P_MFC
 	tristate "Samsung S5P MFC Video Codec"
 	tristate "Samsung S5P MFC Video Codec"
 	depends on VIDEO_DEV && VIDEO_V4L2
 	depends on VIDEO_DEV && VIDEO_V4L2
-	depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST
+	depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
 	depends on HAS_DMA
 	depends on HAS_DMA
 	select VIDEOBUF2_DMA_CONTIG
 	select VIDEOBUF2_DMA_CONTIG
 	default n
 	default n

+ 1 - 1
drivers/media/platform/exynos4-is/Kconfig

@@ -2,7 +2,7 @@
 config VIDEO_SAMSUNG_EXYNOS4_IS
 config VIDEO_SAMSUNG_EXYNOS4_IS
 	bool "Samsung S5P/EXYNOS4 SoC series Camera Subsystem driver"
 	bool "Samsung S5P/EXYNOS4 SoC series Camera Subsystem driver"
 	depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
 	depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
-	depends on (PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST)
+	depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
 	depends on OF && COMMON_CLK
 	depends on OF && COMMON_CLK
 	help
 	help
 	  Say Y here to enable camera host interface devices for
 	  Say Y here to enable camera host interface devices for

+ 2 - 0
drivers/media/platform/exynos4-is/fimc-core.c

@@ -832,6 +832,7 @@ err:
 	return -ENXIO;
 	return -ENXIO;
 }
 }
 
 
+#if defined(CONFIG_PM_RUNTIME) || defined(CONFIG_PM_SLEEP)
 static int fimc_m2m_suspend(struct fimc_dev *fimc)
 static int fimc_m2m_suspend(struct fimc_dev *fimc)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
@@ -870,6 +871,7 @@ static int fimc_m2m_resume(struct fimc_dev *fimc)
 
 
 	return 0;
 	return 0;
 }
 }
+#endif /* CONFIG_PM_RUNTIME || CONFIG_PM_SLEEP */
 
 
 static const struct of_device_id fimc_of_match[];
 static const struct of_device_id fimc_of_match[];
 
 

+ 5 - 1
drivers/media/platform/s5p-jpeg/jpeg-core.c

@@ -893,7 +893,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
 			       unsigned long buffer, unsigned long size,
 			       unsigned long buffer, unsigned long size,
 			       struct s5p_jpeg_ctx *ctx)
 			       struct s5p_jpeg_ctx *ctx)
 {
 {
-	int c, components, notfound;
+	int c, components = 0, notfound;
 	unsigned int height, width, word, subsampling = 0;
 	unsigned int height, width, word, subsampling = 0;
 	long length;
 	long length;
 	struct s5p_jpeg_buffer jpeg_buffer;
 	struct s5p_jpeg_buffer jpeg_buffer;
@@ -2632,6 +2632,7 @@ static int s5p_jpeg_remove(struct platform_device *pdev)
 	return 0;
 	return 0;
 }
 }
 
 
+#if defined(CONFIG_PM_RUNTIME) || defined(CONFIG_PM_SLEEP)
 static int s5p_jpeg_runtime_suspend(struct device *dev)
 static int s5p_jpeg_runtime_suspend(struct device *dev)
 {
 {
 	struct s5p_jpeg *jpeg = dev_get_drvdata(dev);
 	struct s5p_jpeg *jpeg = dev_get_drvdata(dev);
@@ -2681,7 +2682,9 @@ static int s5p_jpeg_runtime_resume(struct device *dev)
 
 
 	return 0;
 	return 0;
 }
 }
+#endif /* CONFIG_PM_RUNTIME || CONFIG_PM_SLEEP */
 
 
+#ifdef CONFIG_PM_SLEEP
 static int s5p_jpeg_suspend(struct device *dev)
 static int s5p_jpeg_suspend(struct device *dev)
 {
 {
 	if (pm_runtime_suspended(dev))
 	if (pm_runtime_suspended(dev))
@@ -2697,6 +2700,7 @@ static int s5p_jpeg_resume(struct device *dev)
 
 
 	return s5p_jpeg_runtime_resume(dev);
 	return s5p_jpeg_runtime_resume(dev);
 }
 }
+#endif
 
 
 static const struct dev_pm_ops s5p_jpeg_pm_ops = {
 static const struct dev_pm_ops s5p_jpeg_pm_ops = {
 	SET_SYSTEM_SLEEP_PM_OPS(s5p_jpeg_suspend, s5p_jpeg_resume)
 	SET_SYSTEM_SLEEP_PM_OPS(s5p_jpeg_suspend, s5p_jpeg_resume)

+ 1 - 1
drivers/media/platform/s5p-tv/Kconfig

@@ -9,7 +9,7 @@
 config VIDEO_SAMSUNG_S5P_TV
 config VIDEO_SAMSUNG_S5P_TV
 	bool "Samsung TV driver for S5P platform"
 	bool "Samsung TV driver for S5P platform"
 	depends on PM_RUNTIME
 	depends on PM_RUNTIME
-	depends on PLAT_S5P || ARCH_EXYNOS || COMPILE_TEST
+	depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
 	default n
 	default n
 	---help---
 	---help---
 	  Say Y here to enable selecting the TV output devices for
 	  Say Y here to enable selecting the TV output devices for

+ 4 - 1
drivers/media/platform/vivid/Kconfig

@@ -1,8 +1,11 @@
 config VIDEO_VIVID
 config VIDEO_VIVID
 	tristate "Virtual Video Test Driver"
 	tristate "Virtual Video Test Driver"
-	depends on VIDEO_DEV && VIDEO_V4L2 && !SPARC32 && !SPARC64
+	depends on VIDEO_DEV && VIDEO_V4L2 && !SPARC32 && !SPARC64 && FB
 	select FONT_SUPPORT
 	select FONT_SUPPORT
 	select FONT_8x16
 	select FONT_8x16
+	select FB_CFB_FILLRECT
+	select FB_CFB_COPYAREA
+	select FB_CFB_IMAGEBLIT
 	select VIDEOBUF2_VMALLOC
 	select VIDEOBUF2_VMALLOC
 	default n
 	default n
 	---help---
 	---help---

+ 1 - 1
drivers/media/platform/vivid/vivid-tpg.c

@@ -136,7 +136,7 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w)
 		tpg->black_line[plane] = vzalloc(max_w * pixelsz);
 		tpg->black_line[plane] = vzalloc(max_w * pixelsz);
 		if (!tpg->black_line[plane])
 		if (!tpg->black_line[plane])
 			return -ENOMEM;
 			return -ENOMEM;
-		tpg->random_line[plane] = vzalloc(max_w * pixelsz);
+		tpg->random_line[plane] = vzalloc(max_w * 2 * pixelsz);
 		if (!tpg->random_line[plane])
 		if (!tpg->random_line[plane])
 			return -ENOMEM;
 			return -ENOMEM;
 	}
 	}

+ 1 - 1
drivers/media/radio/wl128x/fmdrv_common.c

@@ -1256,7 +1256,7 @@ static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name)
 		fmerr("Unable to read firmware(%s) content\n", fw_name);
 		fmerr("Unable to read firmware(%s) content\n", fw_name);
 		return ret;
 		return ret;
 	}
 	}
-	fmdbg("Firmware(%s) length : %d bytes\n", fw_name, fw_entry->size);
+	fmdbg("Firmware(%s) length : %zu bytes\n", fw_name, fw_entry->size);
 
 
 	fw_data = (void *)fw_entry->data;
 	fw_data = (void *)fw_entry->data;
 	fw_len = fw_entry->size;
 	fw_len = fw_entry->size;

+ 1 - 1
drivers/media/tuners/xc5000.c

@@ -1333,9 +1333,9 @@ static int xc5000_release(struct dvb_frontend *fe)
 
 
 	if (priv) {
 	if (priv) {
 		cancel_delayed_work(&priv->timer_sleep);
 		cancel_delayed_work(&priv->timer_sleep);
-		hybrid_tuner_release_state(priv);
 		if (priv->firmware)
 		if (priv->firmware)
 			release_firmware(priv->firmware);
 			release_firmware(priv->firmware);
+		hybrid_tuner_release_state(priv);
 	}
 	}
 
 
 	mutex_unlock(&xc5000_list_mutex);
 	mutex_unlock(&xc5000_list_mutex);

+ 3 - 3
drivers/media/usb/dvb-usb-v2/af9035.c

@@ -193,8 +193,8 @@ static int af9035_wr_reg_mask(struct dvb_usb_device *d, u32 reg, u8 val,
 	return af9035_wr_regs(d, reg, &val, 1);
 	return af9035_wr_regs(d, reg, &val, 1);
 }
 }
 
 
-static int af9035_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr,
-		void *platform_data, struct i2c_adapter *adapter)
+static int af9035_add_i2c_dev(struct dvb_usb_device *d, const char *type,
+		u8 addr, void *platform_data, struct i2c_adapter *adapter)
 {
 {
 	int ret, num;
 	int ret, num;
 	struct state *state = d_to_priv(d);
 	struct state *state = d_to_priv(d);
@@ -221,7 +221,7 @@ static int af9035_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr,
 		goto err;
 		goto err;
 	}
 	}
 
 
-	request_module(board_info.type);
+	request_module("%s", board_info.type);
 
 
 	/* register I2C device */
 	/* register I2C device */
 	client = i2c_new_device(adapter, &board_info);
 	client = i2c_new_device(adapter, &board_info);

+ 3 - 3
drivers/media/usb/dvb-usb-v2/anysee.c

@@ -630,8 +630,8 @@ error:
 	return ret;
 	return ret;
 }
 }
 
 
-static int anysee_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr,
-		void *platform_data)
+static int anysee_add_i2c_dev(struct dvb_usb_device *d, const char *type,
+		u8 addr, void *platform_data)
 {
 {
 	int ret, num;
 	int ret, num;
 	struct anysee_state *state = d_to_priv(d);
 	struct anysee_state *state = d_to_priv(d);
@@ -659,7 +659,7 @@ static int anysee_add_i2c_dev(struct dvb_usb_device *d, char *type, u8 addr,
 		goto err;
 		goto err;
 	}
 	}
 
 
-	request_module(board_info.type);
+	request_module("%s", board_info.type);
 
 
 	/* register I2C device */
 	/* register I2C device */
 	client = i2c_new_device(adapter, &board_info);
 	client = i2c_new_device(adapter, &board_info);

+ 1 - 1
drivers/media/usb/em28xx/em28xx-core.c

@@ -504,7 +504,7 @@ EXPORT_SYMBOL_GPL(em28xx_audio_analog_set);
 int em28xx_audio_setup(struct em28xx *dev)
 int em28xx_audio_setup(struct em28xx *dev)
 {
 {
 	int vid1, vid2, feat, cfg;
 	int vid1, vid2, feat, cfg;
-	u32 vid;
+	u32 vid = 0;
 	u8 i2s_samplerates;
 	u8 i2s_samplerates;
 
 
 	if (dev->chip_id == CHIP_ID_EM2870 ||
 	if (dev->chip_id == CHIP_ID_EM2870 ||

+ 3 - 1
drivers/media/usb/em28xx/em28xx-input.c

@@ -712,8 +712,10 @@ static int em28xx_ir_init(struct em28xx *dev)
 	em28xx_info("Registering input extension\n");
 	em28xx_info("Registering input extension\n");
 
 
 	ir = kzalloc(sizeof(*ir), GFP_KERNEL);
 	ir = kzalloc(sizeof(*ir), GFP_KERNEL);
+	if (!ir)
+		return -ENOMEM;
 	rc = rc_allocate_device();
 	rc = rc_allocate_device();
-	if (!ir || !rc)
+	if (!rc)
 		goto error;
 		goto error;
 
 
 	/* record handles to ourself */
 	/* record handles to ourself */

+ 1 - 1
drivers/media/usb/hackrf/hackrf.c

@@ -932,7 +932,7 @@ static int hackrf_set_bandwidth(struct hackrf_dev *dev)
 	dev->bandwidth->val = bandwidth;
 	dev->bandwidth->val = bandwidth;
 	dev->bandwidth->cur.val = bandwidth;
 	dev->bandwidth->cur.val = bandwidth;
 
 
-	dev_dbg(dev->dev, "bandwidth selected=%d\n", bandwidth_lut[i].freq);
+	dev_dbg(dev->dev, "bandwidth selected=%d\n", bandwidth);
 
 
 	u16tmp = 0;
 	u16tmp = 0;
 	u16tmp |= ((bandwidth >> 0) & 0xff) << 0;
 	u16tmp |= ((bandwidth >> 0) & 0xff) << 0;

+ 2 - 0
drivers/media/usb/usbvision/usbvision-video.c

@@ -446,6 +446,7 @@ static int usbvision_v4l2_close(struct file *file)
 	if (usbvision->remove_pending) {
 	if (usbvision->remove_pending) {
 		printk(KERN_INFO "%s: Final disconnect\n", __func__);
 		printk(KERN_INFO "%s: Final disconnect\n", __func__);
 		usbvision_release(usbvision);
 		usbvision_release(usbvision);
+		return 0;
 	}
 	}
 	mutex_unlock(&usbvision->v4l2_lock);
 	mutex_unlock(&usbvision->v4l2_lock);
 
 
@@ -1221,6 +1222,7 @@ static int usbvision_radio_close(struct file *file)
 	if (usbvision->remove_pending) {
 	if (usbvision->remove_pending) {
 		printk(KERN_INFO "%s: Final disconnect\n", __func__);
 		printk(KERN_INFO "%s: Final disconnect\n", __func__);
 		usbvision_release(usbvision);
 		usbvision_release(usbvision);
+		return err_code;
 	}
 	}
 
 
 	mutex_unlock(&usbvision->v4l2_lock);
 	mutex_unlock(&usbvision->v4l2_lock);

+ 0 - 1
drivers/media/usb/uvc/uvc_v4l2.c

@@ -318,7 +318,6 @@ static int uvc_v4l2_set_format(struct uvc_streaming *stream,
 	stream->ctrl = probe;
 	stream->ctrl = probe;
 	stream->cur_format = format;
 	stream->cur_format = format;
 	stream->cur_frame = frame;
 	stream->cur_frame = frame;
-	stream->frame_size = fmt->fmt.pix.sizeimage;
 
 
 done:
 done:
 	mutex_unlock(&stream->mutex);
 	mutex_unlock(&stream->mutex);

+ 1 - 1
drivers/media/usb/uvc/uvc_video.c

@@ -1143,7 +1143,7 @@ static int uvc_video_encode_data(struct uvc_streaming *stream,
 static void uvc_video_validate_buffer(const struct uvc_streaming *stream,
 static void uvc_video_validate_buffer(const struct uvc_streaming *stream,
 				      struct uvc_buffer *buf)
 				      struct uvc_buffer *buf)
 {
 {
-	if (stream->frame_size != buf->bytesused &&
+	if (stream->ctrl.dwMaxVideoFrameSize != buf->bytesused &&
 	    !(stream->cur_format->flags & UVC_FMT_FLAG_COMPRESSED))
 	    !(stream->cur_format->flags & UVC_FMT_FLAG_COMPRESSED))
 		buf->error = 1;
 		buf->error = 1;
 }
 }

+ 0 - 1
drivers/media/usb/uvc/uvcvideo.h

@@ -457,7 +457,6 @@ struct uvc_streaming {
 	struct uvc_format *def_format;
 	struct uvc_format *def_format;
 	struct uvc_format *cur_format;
 	struct uvc_format *cur_format;
 	struct uvc_frame *cur_frame;
 	struct uvc_frame *cur_frame;
-	size_t frame_size;
 
 
 	/* Protect access to ctrl, cur_format, cur_frame and hardware video
 	/* Protect access to ctrl, cur_format, cur_frame and hardware video
 	 * probe control.
 	 * probe control.

+ 9 - 0
drivers/media/v4l2-core/videobuf-dma-contig.c

@@ -305,6 +305,15 @@ static int __videobuf_mmap_mapper(struct videobuf_queue *q,
 	/* Try to remap memory */
 	/* Try to remap memory */
 	size = vma->vm_end - vma->vm_start;
 	size = vma->vm_end - vma->vm_start;
 	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
+	/* the "vm_pgoff" is just used in v4l2 to find the
+	 * corresponding buffer data structure which is allocated
+	 * earlier and it does not mean the offset from the physical
+	 * buffer start address as usual. So set it to 0 to pass
+	 * the sanity check in vm_iomap_memory().
+	 */
+	vma->vm_pgoff = 0;
+
 	retval = vm_iomap_memory(vma, mem->dma_handle, size);
 	retval = vm_iomap_memory(vma, mem->dma_handle, size);
 	if (retval) {
 	if (retval) {
 		dev_err(q->dev, "mmap: remap failed with error %d. ",
 		dev_err(q->dev, "mmap: remap failed with error %d. ",

+ 9 - 0
include/uapi/linux/v4l2-dv-timings.h

@@ -21,8 +21,17 @@
 #ifndef _V4L2_DV_TIMINGS_H
 #ifndef _V4L2_DV_TIMINGS_H
 #define _V4L2_DV_TIMINGS_H
 #define _V4L2_DV_TIMINGS_H
 
 
+#if __GNUC__ < 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ < 6))
+/* Sadly gcc versions older than 4.6 have a bug in how they initialize
+   anonymous unions where they require additional curly brackets.
+   This violates the C1x standard. This workaround adds the curly brackets
+   if needed. */
 #define V4L2_INIT_BT_TIMINGS(_width, args...) \
 #define V4L2_INIT_BT_TIMINGS(_width, args...) \
 	{ .bt = { _width , ## args } }
 	{ .bt = { _width , ## args } }
+#else
+#define V4L2_INIT_BT_TIMINGS(_width, args...) \
+	.bt = { _width , ## args }
+#endif
 
 
 /* CEA-861-E timings (i.e. standard HDTV timings) */
 /* CEA-861-E timings (i.e. standard HDTV timings) */