summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linux/drivers/media/common/saa7146_i2c.c21
-rw-r--r--linux/drivers/media/dvb/dvb-usb/Kconfig1
-rw-r--r--linux/drivers/media/dvb/frontends/stv0900_core.c4
-rw-r--r--linux/drivers/media/dvb/frontends/stv0900_priv.h4
-rw-r--r--linux/drivers/media/video/au0828/Kconfig6
-rw-r--r--linux/drivers/media/video/cx18/cx18-audio.c1
-rw-r--r--linux/drivers/media/video/cx18/cx18-av-core.c42
-rw-r--r--linux/drivers/media/video/cx18/cx18-av-core.h19
-rw-r--r--linux/drivers/media/video/cx18/cx18-av-vbi.c6
-rw-r--r--linux/drivers/media/video/cx18/cx18-controls.c40
-rw-r--r--linux/drivers/media/video/cx18/cx18-driver.c3
-rw-r--r--linux/drivers/media/video/cx18/cx18-streams.c5
-rw-r--r--linux/drivers/media/video/cx18/cx18-vbi.c9
-rw-r--r--linux/drivers/media/video/cx23885/Kconfig8
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-dvb.c3
-rw-r--r--linux/drivers/media/video/pvrusb2/Kconfig4
-rw-r--r--linux/drivers/media/video/saa7134/Kconfig2
-rw-r--r--linux/drivers/media/video/zoran/zoran_driver.c9
-rw-r--r--v4l/compat.h1
-rwxr-xr-xv4l/scripts/fix_dvb_customise.pl334
-rwxr-xr-xv4l/scripts/make_kconfig.pl1
21 files changed, 447 insertions, 76 deletions
diff --git a/linux/drivers/media/common/saa7146_i2c.c b/linux/drivers/media/common/saa7146_i2c.c
index 68674799b..fa9d4f90a 100644
--- a/linux/drivers/media/common/saa7146_i2c.c
+++ b/linux/drivers/media/common/saa7146_i2c.c
@@ -294,7 +294,6 @@ static int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *m
int i = 0, count = 0;
__le32 *buffer = dev->d_i2c.cpu_addr;
int err = 0;
- int address_err = 0;
int short_delay = 0;
if (mutex_lock_interruptible(&dev->i2c_lock))
@@ -334,17 +333,10 @@ static int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *m
i2c address probing, however, and address errors indicate that a
device is really *not* there. retrying in that case
increases the time the device needs to probe greatly, so
- it should be avoided. because of the fact, that only
- analog based cards use irq based i2c transactions (for dvb
- cards, this screwes up other interrupt sources), we bail out
- completely for analog cards after an address error and trust
- the saa7146 address error detection. */
- if ( -EREMOTEIO == err ) {
- if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
- goto out;
- }
- address_err++;
- }
+ it should be avoided. So we bail out in irq mode after an
+ address error and trust the saa7146 address error detection. */
+ if (-EREMOTEIO == err && 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags))
+ goto out;
DEB_I2C(("error while sending message(s). starting again.\n"));
break;
}
@@ -359,10 +351,9 @@ static int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *m
} while (err != num && retries--);
- /* if every retry had an address error, exit right away */
- if (address_err == retries) {
+ /* quit if any error occurred */
+ if (err != num)
goto out;
- }
/* if any things had to be read, get the results */
if ( 0 != saa7146_i2c_msg_cleanup(msgs, num, buffer)) {
diff --git a/linux/drivers/media/dvb/dvb-usb/Kconfig b/linux/drivers/media/dvb/dvb-usb/Kconfig
index 3e581409f..3763a9c68 100644
--- a/linux/drivers/media/dvb/dvb-usb/Kconfig
+++ b/linux/drivers/media/dvb/dvb-usb/Kconfig
@@ -96,6 +96,7 @@ config DVB_USB_UMT_010
select DVB_PLL if !DVB_FE_CUSTOMISE
select DVB_DIB3000MC
select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMIZE
+ select DVB_MT352 if !DVB_FE_CUSTOMISE
help
Say Y here to support the HanfTek UMT-010 USB2.0 stick-sized DVB-T receiver.
diff --git a/linux/drivers/media/dvb/frontends/stv0900_core.c b/linux/drivers/media/dvb/frontends/stv0900_core.c
index c86c3017e..9ff9744a1 100644
--- a/linux/drivers/media/dvb/frontends/stv0900_core.c
+++ b/linux/drivers/media/dvb/frontends/stv0900_core.c
@@ -34,8 +34,8 @@
#include "stv0900_priv.h"
#include "stv0900_init.h"
-int debug = 1;
-module_param(debug, int, 0644);
+static int stvdebug = 1;
+module_param_named(debug, stvdebug, int, 0644);
/* internal params node */
struct stv0900_inode {
diff --git a/linux/drivers/media/dvb/frontends/stv0900_priv.h b/linux/drivers/media/dvb/frontends/stv0900_priv.h
index 28350fbeb..762d5af62 100644
--- a/linux/drivers/media/dvb/frontends/stv0900_priv.h
+++ b/linux/drivers/media/dvb/frontends/stv0900_priv.h
@@ -62,11 +62,11 @@
#define dmd_choose(a, b) (demod = STV0900_DEMOD_2 ? b : a))
-extern int debug;
+static int stvdebug;
#define dprintk(args...) \
do { \
- if (debug) \
+ if (stvdebug) \
printk(KERN_DEBUG args); \
} while (0)
diff --git a/linux/drivers/media/video/au0828/Kconfig b/linux/drivers/media/video/au0828/Kconfig
index 621ec043f..deb00e4ac 100644
--- a/linux/drivers/media/video/au0828/Kconfig
+++ b/linux/drivers/media/video/au0828/Kconfig
@@ -5,9 +5,9 @@ config VIDEO_AU0828
select I2C_ALGOBIT
select VIDEO_TVEEPROM
select DVB_AU8522 if !DVB_FE_CUSTOMISE
- select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMIZE
- select MEDIA_TUNER_MXL5007T if !DVB_FE_CUSTOMIZE
- select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMIZE
+ select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMISE
+ select MEDIA_TUNER_MXL5007T if !DVB_FE_CUSTOMISE
+ select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMISE
---help---
This is a video4linux driver for Auvitek's USB device.
diff --git a/linux/drivers/media/video/cx18/cx18-audio.c b/linux/drivers/media/video/cx18/cx18-audio.c
index ccd170887..bb5c5165d 100644
--- a/linux/drivers/media/video/cx18/cx18-audio.c
+++ b/linux/drivers/media/video/cx18/cx18-audio.c
@@ -24,6 +24,7 @@
#include "cx18-driver.h"
#include "cx18-io.h"
#include "cx18-cards.h"
+#include "cx18-audio.h"
#define CX18_AUDIO_ENABLE 0xc72014
diff --git a/linux/drivers/media/video/cx18/cx18-av-core.c b/linux/drivers/media/video/cx18/cx18-av-core.c
index cf256a999..21f4be839 100644
--- a/linux/drivers/media/video/cx18/cx18-av-core.c
+++ b/linux/drivers/media/video/cx18/cx18-av-core.c
@@ -292,23 +292,29 @@ void cx18_av_std_setup(struct cx18 *cx)
*
* vsync: always 6 half-lines of vsync pulses
* vactive: half lines of active video
- * vblank656: half lines, after line 3, of blanked video
- * vblank: half lines, after line 9, of blanked video
+ * vblank656: half lines, after line 3/mid-266, of blanked video
+ * vblank: half lines, after line 9/272, of blanked video
*
+ * As far as I can tell:
* vblank656 starts counting from the falling edge of the first
- * vsync pulse (start of line 4)
+ * vsync pulse (start of line 4 or mid-266)
* vblank starts counting from the after the 6 vsync pulses and
- * 6 equalization pulses (start of line 10)
+ * 6 or 5 equalization pulses (start of line 10 or 272)
*
* For 525 line systems the driver will extract VBI information
- * from lines 10 through 21. To avoid the EAV RP code from
- * toggling at the start of hblank at line 22, where sliced VBI
- * data from line 21 is stuffed, also treat line 22 as blanked.
+ * from lines 10-21 and lines 273-284.
*/
- vblank656 = 38; /* lines 4 through 22 */
- vblank = 26; /* lines 10 through 22 */
- vactive = 481; /* lines 23 through 262.5 */
+ vblank656 = 38; /* lines 4 - 22 & 266 - 284 */
+ vblank = 26; /* lines 10 - 22 & 272 - 284 */
+ vactive = 481; /* lines 23 - 263 & 285 - 525 */
+ /*
+ * For a 13.5 Mpps clock and 15,734.26 Hz line rate, a line is
+ * is 858 pixels = 720 active + 138 blanking. The Hsync leading
+ * edge should happen 1.2 us * 13.5 Mpps ~= 16 pixels after the
+ * end of active video, leaving 122 pixels of hblank to ignore
+ * before active video starts.
+ */
hactive = 720;
hblank = 122;
luma_lpf = 1;
@@ -867,8 +873,22 @@ static int cx18_av_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
Hsrc = (cx18_av_read(cx, 0x472) & 0x3f) << 4;
Hsrc |= (cx18_av_read(cx, 0x471) & 0xf0) >> 4;
- Vlines = pix->height + (is_50Hz ? 4 : 7);
+ /*
+ * This adjustment reflects the excess of vactive, set in
+ * cx18_av_std_setup(), above standard values:
+ *
+ * 480 + 1 for 60 Hz systems
+ * 576 + 4 for 50 Hz systems
+ */
+ Vlines = pix->height + (is_50Hz ? 4 : 1);
+ /*
+ * Invalid height and width scaling requests are:
+ * 1. width less than 1/16 of the source width
+ * 2. width greater than the source width
+ * 3. height less than 1/8 of the source height
+ * 4. height greater than the source height
+ */
if ((pix->width * 16 < Hsrc) || (Hsrc < pix->width) ||
(Vlines * 8 < Vsrc) || (Vsrc < Vlines)) {
CX18_ERR_DEV(sd, "%dx%d is not a valid size!\n",
diff --git a/linux/drivers/media/video/cx18/cx18-av-core.h b/linux/drivers/media/video/cx18/cx18-av-core.h
index fd0df4151..2687a2c91 100644
--- a/linux/drivers/media/video/cx18/cx18-av-core.h
+++ b/linux/drivers/media/video/cx18/cx18-av-core.h
@@ -89,16 +89,21 @@ struct cx18_av_state {
/*
* The VBI slicer starts operating and counting lines, begining at
- * slicer line count of 1, at D lines after the deassertion of VRESET
- * This staring field line, S, is 6 or 10 for 625 or 525 line systems.
- * Sliced ancillary data captured on VBI slicer line M is sent at the
- * beginning of the next VBI slicer line, VBI slicer line count N = M+1.
- * Thus when the VBI slicer reports a VBI slicer line number with
- * ancillary data, the IDID0 byte indicates VBI slicer line N.
- * The actual field line that the captured data comes from is
+ * slicer line count of 1, at D lines after the deassertion of VRESET.
+ * This staring field line, S, is 6 (& 319) or 10 (& 273) for 625 or 525
+ * line systems respectively. Sliced ancillary data captured on VBI
+ * slicer line M is inserted after the VBI slicer is done with line M,
+ * when VBI slicer line count is N = M+1. Thus when the VBI slicer
+ * reports a VBI slicer line number with ancillary data, the IDID0 byte
+ * indicates VBI slicer line N. The actual field line that the captured
+ * data comes from is
+ *
* L = M+(S+D-1) = N-1+(S+D-1) = N + (S+D-2).
*
+ * L is the line in the field, not frame, from which the VBI data came.
+ * N is the line reported by the slicer in the ancillary data.
* D is the slicer_line_delay value programmed into register 0x47f.
+ * S is 6 for 625 line systems or 10 for 525 line systems
* (S+D-2) is the slicer_line_offset used to convert slicer reported
* line counts to actual field lines.
*/
diff --git a/linux/drivers/media/video/cx18/cx18-av-vbi.c b/linux/drivers/media/video/cx18/cx18-av-vbi.c
index 43267d1af..27699839b 100644
--- a/linux/drivers/media/video/cx18/cx18-av-vbi.c
+++ b/linux/drivers/media/video/cx18/cx18-av-vbi.c
@@ -142,7 +142,7 @@ int cx18_av_vbi(struct cx18 *cx, unsigned int cmd, void *arg)
0, V4L2_SLICED_TELETEXT_B, 0, /* 1 */
0, V4L2_SLICED_WSS_625, 0, /* 4 */
V4L2_SLICED_CAPTION_525, /* 6 */
- V4L2_SLICED_VPS, 0, 0, 0, 0, /* 7 - unlike cx25840 */
+ 0, 0, V4L2_SLICED_VPS, 0, 0, /* 9 */
0, 0, 0, 0
};
int is_pal = !(state->std & V4L2_STD_525_60);
@@ -243,7 +243,7 @@ int cx18_av_vbi(struct cx18 *cx, unsigned int cmd, void *arg)
lcr[i] |= 6 << (4 * x);
break;
case V4L2_SLICED_VPS:
- lcr[i] |= 7 << (4 * x); /*'840 differs*/
+ lcr[i] |= 9 << (4 * x);
break;
}
}
@@ -301,7 +301,7 @@ int cx18_av_vbi(struct cx18 *cx, unsigned int cmd, void *arg)
sdid = V4L2_SLICED_CAPTION_525;
err = !odd_parity(p[0]) || !odd_parity(p[1]);
break;
- case 7: /* Differs from cx25840 */
+ case 9:
sdid = V4L2_SLICED_VPS;
if (decode_vps(p, p) != 0)
err = 1;
diff --git a/linux/drivers/media/video/cx18/cx18-controls.c b/linux/drivers/media/video/cx18/cx18-controls.c
index 925e01fdb..82fc2f9d4 100644
--- a/linux/drivers/media/video/cx18/cx18-controls.c
+++ b/linux/drivers/media/video/cx18/cx18-controls.c
@@ -166,15 +166,26 @@ static int cx18_g_ctrl(struct cx18 *cx, struct v4l2_control *vctrl)
return 0;
}
-static int cx18_setup_vbi_fmt(struct cx18 *cx, enum v4l2_mpeg_stream_vbi_fmt fmt)
+static int cx18_setup_vbi_fmt(struct cx18 *cx,
+ enum v4l2_mpeg_stream_vbi_fmt fmt,
+ enum v4l2_mpeg_stream_type type)
{
if (!(cx->v4l2_cap & V4L2_CAP_SLICED_VBI_CAPTURE))
return -EINVAL;
if (atomic_read(&cx->ana_capturing) > 0)
return -EBUSY;
- /* First try to allocate sliced VBI buffers if needed. */
- if (fmt && cx->vbi.sliced_mpeg_data[0] == NULL) {
+ if (fmt != V4L2_MPEG_STREAM_VBI_FMT_IVTV ||
+ type != V4L2_MPEG_STREAM_TYPE_MPEG2_PS) {
+ /* We don't do VBI insertion aside from IVTV format in a PS */
+ cx->vbi.insert_mpeg = V4L2_MPEG_STREAM_VBI_FMT_NONE;
+ CX18_DEBUG_INFO("disabled insertion of sliced VBI data into "
+ "the MPEG stream\n");
+ return 0;
+ }
+
+ /* Allocate sliced VBI buffers if needed. */
+ if (cx->vbi.sliced_mpeg_data[0] == NULL) {
int i;
for (i = 0; i < CX18_VBI_FRAMES; i++) {
@@ -185,19 +196,27 @@ static int cx18_setup_vbi_fmt(struct cx18 *cx, enum v4l2_mpeg_stream_vbi_fmt fmt
kfree(cx->vbi.sliced_mpeg_data[i]);
cx->vbi.sliced_mpeg_data[i] = NULL;
}
+ cx->vbi.insert_mpeg =
+ V4L2_MPEG_STREAM_VBI_FMT_NONE;
+ CX18_WARN("Unable to allocate buffers for "
+ "sliced VBI data insertion\n");
return -ENOMEM;
}
}
}
cx->vbi.insert_mpeg = fmt;
+ CX18_DEBUG_INFO("enabled insertion of sliced VBI data into the MPEG PS,"
+ "when sliced VBI is enabled\n");
- if (cx->vbi.insert_mpeg == 0)
- return 0;
- /* Need sliced data for mpeg insertion */
+ /*
+ * If our current settings have no lines set for capture, store a valid,
+ * default set of service lines to capture, in our current settings.
+ */
if (cx18_get_service_set(cx->vbi.sliced_in) == 0) {
if (cx->is_60hz)
- cx->vbi.sliced_in->service_set = V4L2_SLICED_CAPTION_525;
+ cx->vbi.sliced_in->service_set =
+ V4L2_SLICED_CAPTION_525;
else
cx->vbi.sliced_in->service_set = V4L2_SLICED_WSS_625;
cx18_expand_service_set(cx->vbi.sliced_in, cx->is_50hz);
@@ -284,8 +303,11 @@ int cx18_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
priv.cx = cx;
priv.s = &cx->streams[id->type];
err = cx2341x_update(&priv, cx18_api_func, &cx->params, &p);
- if (!err && cx->params.stream_vbi_fmt != p.stream_vbi_fmt)
- err = cx18_setup_vbi_fmt(cx, p.stream_vbi_fmt);
+ if (!err &&
+ (cx->params.stream_vbi_fmt != p.stream_vbi_fmt ||
+ cx->params.stream_type != p.stream_type))
+ err = cx18_setup_vbi_fmt(cx, p.stream_vbi_fmt,
+ p.stream_type);
cx->params = p;
cx->dualwatch_stereo_mode = p.audio_properties & 0x0300;
idx = p.audio_properties & 0x03;
diff --git a/linux/drivers/media/video/cx18/cx18-driver.c b/linux/drivers/media/video/cx18/cx18-driver.c
index 8f294f436..f688ec7db 100644
--- a/linux/drivers/media/video/cx18/cx18-driver.c
+++ b/linux/drivers/media/video/cx18/cx18-driver.c
@@ -273,8 +273,7 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
u8 eedata[256];
memset(&c, 0, sizeof(c));
- strncpy(c.name, "cx18 tveeprom tmp", sizeof(c.name));
- c.name[sizeof(c.name)-1] = '\0';
+ strlcpy(c.name, "cx18 tveeprom tmp", sizeof(c.name));
c.adapter = &cx->i2c_adap[0];
c.addr = 0xA0 >> 1;
diff --git a/linux/drivers/media/video/cx18/cx18-streams.c b/linux/drivers/media/video/cx18/cx18-streams.c
index 0605c2d83..7c1db9c18 100644
--- a/linux/drivers/media/video/cx18/cx18-streams.c
+++ b/linux/drivers/media/video/cx18/cx18-streams.c
@@ -413,9 +413,8 @@ static void cx18_vbi_setup(struct cx18_stream *s)
* 0x90 (Task HorizontalBlank)
* 0xd0 (Task EvenField HorizontalBlank)
*
- * We have set the digitzer to consider the first active line
- * as part of VerticalBlank as well so we don't have to look for
- * these problem codes nor lose the last line of sliced data.
+ * We have set the digitzer such that we don't have to worry
+ * about these problem codes.
*/
data[4] = 0xB0F0B0F0;
/*
diff --git a/linux/drivers/media/video/cx18/cx18-vbi.c b/linux/drivers/media/video/cx18/cx18-vbi.c
index a81fe2e98..355737bff 100644
--- a/linux/drivers/media/video/cx18/cx18-vbi.c
+++ b/linux/drivers/media/video/cx18/cx18-vbi.c
@@ -169,7 +169,7 @@ void cx18_process_vbi_data(struct cx18 *cx, struct cx18_buffer *buf,
int streamtype)
{
u8 *p = (u8 *) buf->buf;
- u32 *q = (u32 *) buf->buf;
+ __be32 *q = (__be32 *) buf->buf;
u32 size = buf->bytesused;
u32 pts;
int lines;
@@ -178,8 +178,9 @@ void cx18_process_vbi_data(struct cx18 *cx, struct cx18_buffer *buf,
return;
/*
- * The CX23418 sends us data that is 32 bit LE swapped, but we want
- * the raw VBI bytes in the order they were in the raster line
+ * The CX23418 sends us data that is 32 bit little-endian swapped,
+ * but we want the raw VBI bytes in the order they were in the raster
+ * line. This has a side effect of making the 12 byte header big endian
*/
cx18_buf_swap(buf);
@@ -218,7 +219,7 @@ void cx18_process_vbi_data(struct cx18 *cx, struct cx18_buffer *buf,
/* Sliced VBI data with data insertion */
- pts = (be32_to_cpu(q[0] == 0x3fffffff)) ? be32_to_cpu(q[2]) : 0;
+ pts = (be32_to_cpu(q[0]) == 0x3fffffff) ? be32_to_cpu(q[2]) : 0;
/*
* For calls to compress_sliced_buf(), ensure there are an integral
diff --git a/linux/drivers/media/video/cx23885/Kconfig b/linux/drivers/media/video/cx23885/Kconfig
index 4066ca69c..28896aa31 100644
--- a/linux/drivers/media/video/cx23885/Kconfig
+++ b/linux/drivers/media/video/cx23885/Kconfig
@@ -20,10 +20,10 @@ config VIDEO_CX23885
select DVB_STV6110 if !DVB_FE_CUSTOMISE
select DVB_STV0900 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMIZE
- select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE
- select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE
- select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMIZE
- select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMIZE
+ select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMISE
+ select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMISE
+ select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMISE
+ select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMISE
---help---
This is a video4linux driver for Conexant 23885 based
TV cards.
diff --git a/linux/drivers/media/video/em28xx/em28xx-dvb.c b/linux/drivers/media/video/em28xx/em28xx-dvb.c
index c76dbc029..edafe9bde 100644
--- a/linux/drivers/media/video/em28xx/em28xx-dvb.c
+++ b/linux/drivers/media/video/em28xx/em28xx-dvb.c
@@ -30,9 +30,6 @@
#include "lgdt330x.h"
#include "zl10353.h"
#include "s5h1409.h"
-#ifdef EM28XX_DRX397XD_SUPPORT
-#include "drx397xD.h"
-#endif
MODULE_DESCRIPTION("driver for em28xx based DVB cards");
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
diff --git a/linux/drivers/media/video/pvrusb2/Kconfig b/linux/drivers/media/video/pvrusb2/Kconfig
index 7f7b05c40..bb4271393 100644
--- a/linux/drivers/media/video/pvrusb2/Kconfig
+++ b/linux/drivers/media/video/pvrusb2/Kconfig
@@ -41,9 +41,9 @@ config VIDEO_PVRUSB2_DVB
select DVB_S5H1409 if !DVB_FE_CUSTOMISE
select DVB_S5H1411 if !DVB_FE_CUSTOMISE
select DVB_TDA10048 if !DVB_FE_CUSTOMISE
- select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMIZE
+ select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMIZE
- select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE
+ select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMISE
---help---
This option enables a DVB interface for the pvrusb2 driver.
diff --git a/linux/drivers/media/video/saa7134/Kconfig b/linux/drivers/media/video/saa7134/Kconfig
index e69d504ac..51f17c82b 100644
--- a/linux/drivers/media/video/saa7134/Kconfig
+++ b/linux/drivers/media/video/saa7134/Kconfig
@@ -40,6 +40,8 @@ config VIDEO_SAA7134_DVB
select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMIZE
select DVB_ZL10036 if !DVB_FE_CUSTOMISE
select DVB_MT312 if !DVB_FE_CUSTOMISE
+ select DVB_LNBP21 if !DVB_FE_CUSTOMISE
+ select DVB_ZL10353 if !DVB_FE_CUSTOMISE
---help---
This adds support for DVB cards based on the
Philips saa7134 chip.
diff --git a/linux/drivers/media/video/zoran/zoran_driver.c b/linux/drivers/media/video/zoran/zoran_driver.c
index 8eda83b06..1560c1e4c 100644
--- a/linux/drivers/media/video/zoran/zoran_driver.c
+++ b/linux/drivers/media/video/zoran/zoran_driver.c
@@ -1378,11 +1378,10 @@ setup_overlay (struct file *file,
/* get the status of a buffer in the clients buffer queue */
static int
-zoran_v4l2_buffer_status (struct file *file,
+zoran_v4l2_buffer_status (struct zoran_fh *fh,
struct v4l2_buffer *buf,
int num)
{
- struct zoran_fh *fh = file->private_data;
struct zoran *zr = fh->zr;
buf->flags = V4L2_BUF_FLAG_MAPPED;
@@ -2502,7 +2501,7 @@ static int zoran_querybuf(struct file *file, void *__fh, struct v4l2_buffer *buf
int res;
mutex_lock(&zr->resource_lock);
- res = zoran_v4l2_buffer_status(file, buf, buf->index);
+ res = zoran_v4l2_buffer_status(fh, buf, buf->index);
mutex_unlock(&zr->resource_lock);
return res;
@@ -2603,7 +2602,7 @@ static int zoran_dqbuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
if (res)
goto dqbuf_unlock_and_return;
zr->v4l_sync_tail++;
- res = zoran_v4l2_buffer_status(file, buf, num);
+ res = zoran_v4l2_buffer_status(fh, buf, num);
break;
case ZORAN_MAP_MODE_JPG_REC:
@@ -2634,7 +2633,7 @@ static int zoran_dqbuf(struct file *file, void *__fh, struct v4l2_buffer *buf)
res = jpg_sync(file, &bs);
if (res)
goto dqbuf_unlock_and_return;
- res = zoran_v4l2_buffer_status(file, buf, bs.frame);
+ res = zoran_v4l2_buffer_status(fh, buf, bs.frame);
break;
}
diff --git a/v4l/compat.h b/v4l/compat.h
index 3df844c87..44878ce73 100644
--- a/v4l/compat.h
+++ b/v4l/compat.h
@@ -11,6 +11,7 @@
* delayed_work in the same context as something named work_struct. */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
#define delayed_work work_struct
+#define INIT_DELAYED_WORK(a,b,c) INIT_WORK(a,b,c)
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
diff --git a/v4l/scripts/fix_dvb_customise.pl b/v4l/scripts/fix_dvb_customise.pl
new file mode 100755
index 000000000..86a6bcf8c
--- /dev/null
+++ b/v4l/scripts/fix_dvb_customise.pl
@@ -0,0 +1,334 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use File::Find;
+use Fcntl ':mode';
+
+my $debug = 0;
+
+my $SRC = "../linux";
+my $fname = "$SRC/drivers/media/dvb/frontends/Makefile";
+
+####################
+# Get Makefile rules
+#
+sub get_makefile($)
+{
+ my $file = shift;
+ my %rules;
+ my %composite;
+
+ open IN, $file or die "Can't find $file\n";
+ while (<IN>) {
+ # Handle line continuations
+ if (/\\\n$/) {
+ $_ .= <IN>;
+ redo;
+ }
+ # Eat line continuations in string we will parse
+ s/\s*\\\n\s*/ /g;
+
+ if (m/(^\s*[[\da-zA-Z-_]+)-objs\s*[\:\+]*\=\s*(.*)\n/) {
+ my $dep=$1;
+ my $file = $2;
+ $file =~ s/\.o / /g;
+ $file =~ s/\.o$//;
+
+ if ($file eq "") {
+ die "broken dep on file $file for $dep\n";
+ }
+
+ $composite{$dep} = $file;
+ printf "MULTI: $dep = $file\n" if ($debug > 1);
+ }
+
+ if (m/^\s*obj\-\$\(CONFIG_([^\)]+)\)\s*[\:\+]*\=\s*(.*)\n/) {
+ my $rule = $1;
+ my $file = $2;
+
+ $file =~ s/\.o / /g;
+ $file =~ s/\.o$//;
+
+ $rules{$rule} = $file;
+ printf "RULE: $rule = $file\n" if ($debug > 1);
+ }
+ }
+ close IN;
+
+ return (\%rules, \%composite);
+}
+
+###########################
+# Seeks header dependencies
+#
+my %header_deps;
+
+# For a more complete check, use:
+# my $hfiles = "*.c";
+my $hfiles = "av7110_av.c av7110.c av7110_ca.c av7110_hw.c av7110_ipack.c av7110_ir.c av7110_v4l.c budget-patch.c dvb_ringbuffer.c nova-t-usb2.c umt-010.c";
+
+sub get_header_deps()
+{
+ my $file = shift;
+ my %rules;
+ my %composite;
+
+ open IN, "gcc -I ../linux/include -I . -DCONFIG_PCI -D__LITTLE_ENDIAN -D_COMPAT_H -DKERNEL_VERSION\\(a,b,c\\) -MM $hfiles|";
+ while (<IN>) {
+ # Handle line continuations
+ if (/\\\n$/) {
+ $_ .= <IN>;
+ redo;
+ }
+ # Eat line continuations in string we will parse
+ s/\s*\\\n\s*/ /g;
+
+ if (m/^([^\:]+)\s*\:\s*(.*)/) {
+ my $dep = $1;
+ my $file = $2;
+
+ $dep =~ s|.*/||;
+ $dep =~ s/\.o$//;
+
+ my @files = split(/\s/, $file);
+ foreach my $f (@files) {
+ $f =~ s|.*/||;
+
+ if (!defined($header_deps{$f})) {
+ $header_deps{$f} = $dep;
+ } else {
+ $header_deps{$f} .= " " . $dep;
+ }
+
+ }
+ }
+ }
+ close IN;
+
+ if ($debug > 1) {
+ print "Header deps for: ";
+ print "$_ " foreach %header_deps;
+ print "\n";
+ }
+}
+
+
+###########################
+# Seeks files for Makefiles
+#
+
+my %driver_config;
+
+sub parse_makefiles()
+{
+ my $fname = $File::Find::name;
+
+ return if !($fname =~ m|/Makefile$|);
+ return if ($fname =~ m|drivers/media/dvb/frontends/|);
+
+
+ my ($refs, $mult) = get_makefile($fname);
+
+ foreach my $ref (keys %$refs) {
+ my $file=$$refs{$ref};
+
+ my @files = split(/\s/, $file);
+ foreach my $f (@files) {
+ if (defined($$mult{$f})) {
+ $file .= " " . $$mult{$f};
+ }
+ }
+
+ $file =~ s|/||g;
+
+ @files = split(/\s/, $file);
+ foreach my $f (@files) {
+ $driver_config{$f} = $ref;
+ }
+ if ($debug > 1) {
+ print "$ref = ";
+ print "$_ " foreach @files;
+ print "\n";
+ }
+ }
+}
+
+
+########################
+# Seeks files for header
+#
+my %select;
+
+sub found_ref($$)
+{
+ my $file = shift;
+ my $header = shift;
+ my $found = 0;
+ my $name = $file;
+ $name =~ s|.*/||;
+
+ $name =~ s/flexcop-fe-tuner.c/b2c2-flexcop/;
+ $name =~ s/av7110.c/av7110.h/;
+
+ if (defined ($header_deps{$name})) {
+ $name = $header_deps{$name};
+ } else {
+ $name =~ s/\.[ch]$//;
+ }
+
+ my @files = split(/\s/, $name);
+ foreach my $n (@files) {
+ if (defined($driver_config{$n})) {
+ my $ref = $driver_config{$n};
+ printf "$ref needs %s\n", $header if ($debug);
+
+ if ($ref =~ m/(PVRUSB2|CX23885|CX88|EM28XX|SAA3134)/) {
+ $ref .="_DVB";
+ }
+
+ if (!defined($select{$ref})) {
+ $select{$ref} = $header;
+ } else {
+ $select{$ref} .= " " . $header;
+ }
+ $found = 1;
+ }
+ }
+
+ if (!$found) {
+ printf "$file needs %s\n", $header;
+ }
+}
+
+########################
+# Seeks files for header
+#
+
+my %header;
+
+sub parse_headers()
+{
+ my $file = $File::Find::name;
+
+ return if !($file =~ m/\.[ch]$/);
+ return if ($file =~ m|drivers/media/dvb/frontends/|);
+
+ open IN, $file or die "Can't open $file\n";
+ while (<IN>) {
+ if (m/^\s*\#include\s+\"([^\"]+)\"/) {
+ if (defined($header{$1})) {
+ my $head = $header{$1};
+ found_ref ($file, $head);
+ }
+ }
+ }
+ close IN;
+}
+
+########################
+# Rewrite Kconfig's
+#
+
+sub parse_kconfigs()
+{
+ my $file = $File::Find::name;
+ my $conf;
+ my $out = "";
+ my $tmp = "";
+ my $all_sels;
+
+ return if !($file =~ m/Kconfig$/);
+ return if ($file =~ m|drivers/media/dvb/frontends/|);
+
+ open IN, $file or die "Can't open $file\n";
+ while (<IN>) {
+ if (m/^config\s([A-Za-z_\-\d]+)/) {
+ $out .= $tmp;
+ if (defined($select{$1})) {
+ $conf = $select{$1};
+ $all_sels = " ". $conf. " ";
+ $tmp = $_;
+
+ printf "$file: rewriting headers for $1. It should select: %s\n", $all_sels if ($debug);
+ } else {
+ $conf = "";
+ $out .= $_;
+ $tmp = "";
+ }
+ next;
+ }
+ if (!$conf) {
+ $out .= $_;
+ next;
+ }
+
+ if (m/^\s*select\s+([A-Za-z_\-\d]+)/) {
+ my $op = $1;
+
+ if (!$all_sels =~ m/\s($op)\s/) {
+ # Drops line
+ printf "$file: droppingg line $_\n";
+
+ next;
+ } else {
+ $all_sels =~ s/\s($op)\s/ /;
+ }
+ }
+ if (m/^[\s\-]*help/) {
+ my @sel = split(/\s/, $all_sels);
+ foreach my $s (@sel) {
+ if ($s ne "") {
+ printf "$file: Adding select for $s\n";
+ $tmp .= "\tselect $s if !DVB_FE_CUSTOMISE\n";
+ }
+ }
+ }
+ $tmp .= $_;
+ }
+ close IN;
+
+ $out .=$tmp;
+ open OUT, ">$file" or die "Can't open $file\n";
+ print OUT $out;
+ close OUT;
+}
+
+#####
+#main
+
+get_header_deps();
+
+my ($FEs, $mult) = get_makefile($fname);
+
+foreach my $fe (keys %$FEs) {
+ my $file=$$FEs{$fe};
+ my $found = 0;
+
+ # Special cases
+ $file =~ s/tda10021/tda1002x/;
+ $file =~ s/tda10023/tda1002x/;
+ $file =~ s/dib3000mb/dib3000/;
+
+ if (defined($$mult{$file})) {
+ $file .= " ".$$mult{$file};
+ }
+
+ my @files = split(/\s/, $file);
+ foreach my $f (@files) {
+ if (stat("$f.h")) {
+ printf "$fe = $f.h\n" if ($debug);
+ $found = 1;
+ $header {"$f.h"} = $fe;
+ last;
+ }
+ }
+
+ if (!$found) {
+ printf "$file.h ($fe) not found in $file\n";
+ exit -1;
+ }
+}
+
+find({wanted => \&parse_makefiles, no_chdir => 1}, $SRC);
+find({wanted => \&parse_headers, no_chdir => 1}, $SRC);
+find({wanted => \&parse_kconfigs, no_chdir => 1}, $SRC);
diff --git a/v4l/scripts/make_kconfig.pl b/v4l/scripts/make_kconfig.pl
index 144325c34..57c663c00 100755
--- a/v4l/scripts/make_kconfig.pl
+++ b/v4l/scripts/make_kconfig.pl
@@ -585,7 +585,6 @@ close OUT;
# These options should default to off
disable_config('DVB_AV7110_FIRMWARE');
disable_config('DVB_CINERGYT2_TUNING');
-disable_config('DVB_FE_CUSTOMISE');
disable_config('VIDEO_HELPER_CHIPS_AUTO');
disable_config('VIDEO_FIXED_MINOR_RANGES');