summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
Diffstat (limited to 'linux')
-rw-r--r--linux/Documentation/video4linux/CARDLIST.ivtv6
-rw-r--r--linux/drivers/media/common/saa7146_video.c2
-rw-r--r--linux/drivers/media/dvb/dvb-usb/dibusb-common.c4
-rw-r--r--linux/drivers/media/video/bt8xx/bttv-cards.c2
-rw-r--r--linux/drivers/media/video/bt8xx/bttv-driver.c4
-rw-r--r--linux/drivers/media/video/ivtv/Kconfig1
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-cards.c76
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-cards.h27
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-driver.c89
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-driver.h2
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-i2c.c109
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-i2c.h3
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-ioctl.c2
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-irq.c4
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-streams.c4
-rw-r--r--linux/drivers/media/video/ivtv/ivtv-version.h2
-rw-r--r--linux/drivers/media/video/ivtv/ivtvfb.c2
-rw-r--r--linux/drivers/media/video/m52790.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/Kconfig33
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-devattr.c137
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-devattr.h2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c9
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-main.c5
-rw-r--r--linux/drivers/media/video/saa7127.c2
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-core.c4
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-empress.c293
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-video.c198
-rw-r--r--linux/drivers/media/video/saa7134/saa7134.h13
-rw-r--r--linux/drivers/media/video/tda8290.c181
-rw-r--r--linux/drivers/media/video/tda8290.h23
-rw-r--r--linux/drivers/media/video/tda9887.c10
-rw-r--r--linux/drivers/media/video/tuner-core.c93
-rw-r--r--linux/drivers/media/video/tuner-driver.h36
-rw-r--r--linux/drivers/media/video/tuner-i2c.h2
-rw-r--r--linux/drivers/media/video/upd64031a.c2
-rw-r--r--linux/drivers/media/video/upd64083.c2
-rw-r--r--linux/drivers/media/video/usbvision/usbvision.h4
-rw-r--r--linux/drivers/media/video/videobuf-core.c290
-rw-r--r--linux/drivers/media/video/videobuf-dma-sg.c3
-rw-r--r--linux/drivers/media/video/vivi.c662
-rw-r--r--linux/drivers/media/video/vp27smpx.c2
-rw-r--r--linux/drivers/media/video/wm8739.c5
-rw-r--r--linux/include/media/tuner.h2
-rw-r--r--linux/include/media/v4l2-i2c-drv.h3
44 files changed, 1341 insertions, 1016 deletions
diff --git a/linux/Documentation/video4linux/CARDLIST.ivtv b/linux/Documentation/video4linux/CARDLIST.ivtv
index ddd76a0eb..a019e27e4 100644
--- a/linux/Documentation/video4linux/CARDLIST.ivtv
+++ b/linux/Documentation/video4linux/CARDLIST.ivtv
@@ -16,3 +16,9 @@
16 -> GOTVIEW PCI DVD2 Deluxe [ffac:0600]
17 -> Yuan MPC622 [ff01:d998]
18 -> Digital Cowboy DCT-MTVP1 [1461:bfff]
+19 -> Yuan PG600V2/GotView PCI DVD Lite [ffab:0600,ffad:0600]
+20 -> Club3D ZAP-TV1x01 [ffab:0600]
+21 -> AverTV MCE 116 Plus [1461:c439]
+22 -> ASUS Falcon2 [1043:4b66,1043:462e,1043:4b2e]
+23 -> AverMedia PVR-150 Plus [1461:c035]
+24 -> AverMedia EZMaker PCI Deluxe [1461:c03f]
diff --git a/linux/drivers/media/common/saa7146_video.c b/linux/drivers/media/common/saa7146_video.c
index 8066bb9b1..915bd9089 100644
--- a/linux/drivers/media/common/saa7146_video.c
+++ b/linux/drivers/media/common/saa7146_video.c
@@ -1208,7 +1208,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
q = &fh->video_q;
err = videobuf_mmap_setup(q,gbuffers,gbufsize,
V4L2_MEMORY_MMAP);
- if (err < 0)
+ if (err < 0)
return err;
gbuffers = err;
diff --git a/linux/drivers/media/dvb/dvb-usb/dibusb-common.c b/linux/drivers/media/dvb/dvb-usb/dibusb-common.c
index b95b1eb1e..8ee6cd4da 100644
--- a/linux/drivers/media/dvb/dvb-usb/dibusb-common.c
+++ b/linux/drivers/media/dvb/dvb-usb/dibusb-common.c
@@ -223,7 +223,9 @@ static struct dibx000_agc_config dib3000p_panasonic_agc_config = {
.agc2_slope2 = 0x1e,
};
-#ifdef CONFIG_DVB_DIB3000MC
+#if defined(CONFIG_DVB_DIB3000MC) || \
+ (defined(CONFIG_DVB_DIB3000MC_MODULE) && defined(MODULE))
+
static struct dib3000mc_config mod3000p_dib3000p_config = {
&dib3000p_panasonic_agc_config,
diff --git a/linux/drivers/media/video/bt8xx/bttv-cards.c b/linux/drivers/media/video/bt8xx/bttv-cards.c
index a2424738f..98270aaaf 100644
--- a/linux/drivers/media/video/bt8xx/bttv-cards.c
+++ b/linux/drivers/media/video/bt8xx/bttv-cards.c
@@ -4793,7 +4793,7 @@ static void PXC200_muxsel(struct bttv *btv, unsigned int input)
/* ----------------------------------------------------------------------- */
/* motherboard chipset specific stuff */
-void __devinit bttv_check_chipset(void)
+void __init bttv_check_chipset(void)
{
int pcipci_fail = 0;
struct pci_dev *dev = NULL;
diff --git a/linux/drivers/media/video/bt8xx/bttv-driver.c b/linux/drivers/media/video/bt8xx/bttv-driver.c
index 06695c09c..3efc9465b 100644
--- a/linux/drivers/media/video/bt8xx/bttv-driver.c
+++ b/linux/drivers/media/video/bt8xx/bttv-driver.c
@@ -4449,7 +4449,7 @@ static struct pci_driver bttv_pci_driver = {
#endif
};
-static int bttv_init_module(void)
+static int __init bttv_init_module(void)
{
int ret;
@@ -4484,7 +4484,7 @@ static int bttv_init_module(void)
return pci_register_driver(&bttv_pci_driver);
}
-static void bttv_cleanup_module(void)
+static void __exit bttv_cleanup_module(void)
{
pci_unregister_driver(&bttv_pci_driver);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
diff --git a/linux/drivers/media/video/ivtv/Kconfig b/linux/drivers/media/video/ivtv/Kconfig
index 6e5eed5e2..270906fc3 100644
--- a/linux/drivers/media/video/ivtv/Kconfig
+++ b/linux/drivers/media/video/ivtv/Kconfig
@@ -3,6 +3,7 @@ config VIDEO_IVTV
depends on VIDEO_V4L1 && VIDEO_V4L2 && PCI && I2C && EXPERIMENTAL
select I2C_ALGOBIT
select FW_LOADER
+ select VIDEO_IR
select VIDEO_TUNER
select VIDEO_TVEEPROM
select VIDEO_CX2341X
diff --git a/linux/drivers/media/video/ivtv/ivtv-cards.c b/linux/drivers/media/video/ivtv/ivtv-cards.c
index 664fdbca5..654d225a5 100644
--- a/linux/drivers/media/video/ivtv/ivtv-cards.c
+++ b/linux/drivers/media/video/ivtv/ivtv-cards.c
@@ -40,6 +40,27 @@
#define MSP_MONO MSP_INPUT(MSP_IN_MONO, MSP_IN_TUNER1, \
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART)
+/* usual i2c tuner addresses to probe */
+static struct ivtv_card_tuner_i2c ivtv_i2c_std = {
+ .radio = { I2C_CLIENT_END },
+ .demod = { 0x43, I2C_CLIENT_END },
+ .tv = { 0x61, 0x60, I2C_CLIENT_END },
+};
+
+/* as above, but with possible radio tuner */
+static struct ivtv_card_tuner_i2c ivtv_i2c_radio = {
+ .radio = { 0x60, I2C_CLIENT_END },
+ .demod = { 0x43, I2C_CLIENT_END },
+ .tv = { 0x61, I2C_CLIENT_END },
+};
+
+/* using the tda8290+75a combo */
+static struct ivtv_card_tuner_i2c ivtv_i2c_tda8290 = {
+ .radio = { I2C_CLIENT_END },
+ .demod = { I2C_CLIENT_END },
+ .tv = { 0x4b, I2C_CLIENT_END },
+};
+
/********************** card configuration *******************************/
/* Please add new PCI IDs to: http://pci-ids.ucw.cz/iii
@@ -73,6 +94,7 @@ static const struct ivtv_card ivtv_card_pvr250 = {
{ IVTV_CARD_INPUT_LINE_IN2, MSP_SCART3 },
},
.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -127,6 +149,7 @@ static const struct ivtv_card ivtv_card_pvr350 = {
{ IVTV_CARD_INPUT_LINE_IN2, MSP_SCART3 },
},
.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
+ .i2c = &ivtv_i2c_std,
};
/* PVR-350 V1 boards have a different audio tuner input and use a
@@ -158,6 +181,7 @@ static const struct ivtv_card ivtv_card_pvr350_v1 = {
{ IVTV_CARD_INPUT_LINE_IN2, MSP_SCART3 },
},
.radio_input = { IVTV_CARD_INPUT_AUD_TUNER, MSP_SCART2 },
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -193,6 +217,7 @@ static const struct ivtv_card ivtv_card_pvr150 = {
CX25840_AUDIO_SERIAL, WM8775_AIN4 },
/* apparently needed for the IR blaster */
.gpio_init = { .direction = 0x1f01, .initial_value = 0x26f3 },
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -235,6 +260,7 @@ static const struct ivtv_card ivtv_card_m179 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_NTSC },
},
.pci_list = ivtv_pci_m179,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -276,6 +302,7 @@ static const struct ivtv_card ivtv_card_mpg600 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
},
.pci_list = ivtv_pci_mpg600,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -316,6 +343,7 @@ static const struct ivtv_card ivtv_card_mpg160 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
},
.pci_list = ivtv_pci_mpg160,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -351,6 +379,7 @@ static const struct ivtv_card ivtv_card_pg600 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FQ1286 },
},
.pci_list = ivtv_pci_pg600,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -394,6 +423,7 @@ static const struct ivtv_card ivtv_card_avc2410 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
},
.pci_list = ivtv_pci_avc2410,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -464,6 +494,7 @@ static const struct ivtv_card ivtv_card_tg5000tv = {
{ .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FQ1286 },
},
.pci_list = ivtv_pci_tg5000tv,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -494,6 +525,7 @@ static const struct ivtv_card ivtv_card_va2000 = {
{ .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FQ1286 },
},
.pci_list = ivtv_pci_va2000,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -538,6 +570,7 @@ static const struct ivtv_card ivtv_card_cx23416gyc = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
},
.pci_list = ivtv_pci_cx23416gyc,
+ .i2c = &ivtv_i2c_std,
};
static const struct ivtv_card ivtv_card_cx23416gyc_nogr = {
@@ -568,6 +601,7 @@ static const struct ivtv_card ivtv_card_cx23416gyc_nogr = {
{ .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
},
+ .i2c = &ivtv_i2c_std,
};
static const struct ivtv_card ivtv_card_cx23416gyc_nogrycs = {
@@ -597,6 +631,7 @@ static const struct ivtv_card ivtv_card_cx23416gyc_nogrycs = {
{ .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_FM1236_MK3 },
},
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -636,6 +671,7 @@ static const struct ivtv_card ivtv_card_gv_mvprx = {
{ .std = V4L2_STD_525_60, .tuner = TUNER_PANASONIC_VP27 },
},
.pci_list = ivtv_pci_gv_mvprx,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -672,6 +708,7 @@ static const struct ivtv_card ivtv_card_gv_mvprx2e = {
{ .std = V4L2_STD_525_60, .tuner = TUNER_PANASONIC_VP27 },
},
.pci_list = ivtv_pci_gv_mvprx2e,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -706,6 +743,7 @@ static const struct ivtv_card ivtv_card_gotview_pci_dvd = {
{ .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
},
.pci_list = ivtv_pci_gotview_pci_dvd,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -744,6 +782,7 @@ static const struct ivtv_card ivtv_card_gotview_pci_dvd2 = {
{ .std = V4L2_STD_625_50, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
},
.pci_list = ivtv_pci_gotview_pci_dvd2,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -779,6 +818,7 @@ static const struct ivtv_card ivtv_card_yuan_mpc622 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_PHILIPS_TDA8290 },
},
.pci_list = ivtv_pci_yuan_mpc622,
+ .i2c = &ivtv_i2c_tda8290,
};
/* ------------------------------------------------------------------------- */
@@ -820,6 +860,7 @@ static const struct ivtv_card ivtv_card_dctmvtvp1 = {
{ .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FQ1286 },
},
.pci_list = ivtv_pci_dctmvtvp1,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -867,6 +908,7 @@ static const struct ivtv_card ivtv_card_pg600v2 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
},
.pci_list = ivtv_pci_pg600v2,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -913,6 +955,7 @@ static const struct ivtv_card ivtv_card_club3d = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
},
.pci_list = ivtv_pci_club3d,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -958,6 +1001,7 @@ static const struct ivtv_card ivtv_card_avertv_mce116 = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
},
.pci_list = ivtv_pci_avertv_mce116,
+ .i2c = &ivtv_i2c_std,
};
/* ------------------------------------------------------------------------- */
@@ -996,6 +1040,36 @@ static const struct ivtv_card ivtv_card_aver_pvr150 = {
{ .std = V4L2_STD_525_60, .tuner = TUNER_TCL_2002N },
},
.pci_list = ivtv_pci_aver_pvr150,
+ .i2c = &ivtv_i2c_radio,
+};
+
+/* ------------------------------------------------------------------------- */
+
+/* AVerMedia EZMaker PCI Deluxe card */
+
+static const struct ivtv_card_pci_info ivtv_pci_aver_ezmaker[] = {
+ { PCI_DEVICE_ID_IVTV16, IVTV_PCI_ID_AVERMEDIA, 0xc03f },
+ { 0, 0, 0 }
+};
+
+static const struct ivtv_card ivtv_card_aver_ezmaker = {
+ .type = IVTV_CARD_AVER_EZMAKER,
+ .name = "AVerMedia EZMaker PCI Deluxe",
+ .v4l2_capabilities = IVTV_CAP_ENCODER,
+ .hw_video = IVTV_HW_CX25840,
+ .hw_audio = IVTV_HW_CX25840,
+ .hw_audio_ctrl = IVTV_HW_CX25840,
+ .hw_all = IVTV_HW_CX25840 | IVTV_HW_WM8739,
+ .video_inputs = {
+ { IVTV_CARD_INPUT_SVIDEO1, 0, CX25840_SVIDEO3 },
+ { IVTV_CARD_INPUT_COMPOSITE1, 0, CX25840_COMPOSITE1 },
+ },
+ .audio_inputs = {
+ { IVTV_CARD_INPUT_LINE_IN1, CX25840_AUDIO_SERIAL, 0 },
+ },
+ .gpio_init = { .direction = 0x4000, .initial_value = 0x4000 },
+ /* Does not have a tuner */
+ .pci_list = ivtv_pci_aver_ezmaker,
};
/* ------------------------------------------------------------------------- */
@@ -1034,6 +1108,7 @@ static const struct ivtv_card ivtv_card_asus_falcon2 = {
{ .std = V4L2_STD_525_60, .tuner = TUNER_PHILIPS_FM1236_MK3 },
},
.pci_list = ivtv_pci_asus_falcon2,
+ .i2c = &ivtv_i2c_std,
};
static const struct ivtv_card *ivtv_card_list[] = {
@@ -1060,6 +1135,7 @@ static const struct ivtv_card *ivtv_card_list[] = {
&ivtv_card_avertv_mce116,
&ivtv_card_asus_falcon2,
&ivtv_card_aver_pvr150,
+ &ivtv_card_aver_ezmaker,
/* Variations of standard cards but with the same PCI IDs.
These cards must come last in this list. */
diff --git a/linux/drivers/media/video/ivtv/ivtv-cards.h b/linux/drivers/media/video/ivtv/ivtv-cards.h
index 881b04473..191aafdd9 100644
--- a/linux/drivers/media/video/ivtv/ivtv-cards.h
+++ b/linux/drivers/media/video/ivtv/ivtv-cards.h
@@ -47,7 +47,8 @@
#define IVTV_CARD_AVERTV_MCE116 20 /* AVerTV MCE 116 Plus */
#define IVTV_CARD_ASUS_FALCON2 21 /* ASUS Falcon2 */
#define IVTV_CARD_AVER_PVR150PLUS 22 /* AVerMedia PVR-150 Plus */
-#define IVTV_CARD_LAST 22
+#define IVTV_CARD_AVER_EZMAKER 23 /* AVerMedia EZMaker PCI Deluxe */
+#define IVTV_CARD_LAST 23
/* Variants of existing cards but with the same PCI IDs. The driver
detects these based on other device information.
@@ -83,7 +84,7 @@
#define IVTV_PCI_ID_GOTVIEW1 0xffac
#define IVTV_PCI_ID_GOTVIEW2 0xffad
-/* hardware flags */
+/* hardware flags, no gaps allowed, IVTV_HW_GPIO must always be last */
#define IVTV_HW_CX25840 (1 << 0)
#define IVTV_HW_SAA7115 (1 << 1)
#define IVTV_HW_SAA7127 (1 << 2)
@@ -93,14 +94,13 @@
#define IVTV_HW_CS53L32A (1 << 6)
#define IVTV_HW_TVEEPROM (1 << 7)
#define IVTV_HW_SAA7114 (1 << 8)
-#define IVTV_HW_TVAUDIO (1 << 9)
-#define IVTV_HW_UPD64031A (1 << 10)
-#define IVTV_HW_UPD6408X (1 << 11)
-#define IVTV_HW_SAA717X (1 << 12)
-#define IVTV_HW_WM8739 (1 << 13)
-#define IVTV_HW_VP27SMPX (1 << 14)
-#define IVTV_HW_M52790 (1 << 15)
-#define IVTV_HW_GPIO (1 << 16)
+#define IVTV_HW_UPD64031A (1 << 9)
+#define IVTV_HW_UPD6408X (1 << 10)
+#define IVTV_HW_SAA717X (1 << 11)
+#define IVTV_HW_WM8739 (1 << 12)
+#define IVTV_HW_VP27SMPX (1 << 13)
+#define IVTV_HW_M52790 (1 << 14)
+#define IVTV_HW_GPIO (1 << 15)
#define IVTV_HW_SAA711X (IVTV_HW_SAA7115 | IVTV_HW_SAA7114)
@@ -234,6 +234,12 @@ struct ivtv_card_tuner {
int tuner; /* tuner ID (from tuner.h) */
};
+struct ivtv_card_tuner_i2c {
+ unsigned short radio[2];/* radio tuner i2c address to probe */
+ unsigned short demod[2];/* demodulator i2c address to probe */
+ unsigned short tv[4]; /* tv tuner i2c addresses to probe */
+};
+
/* for card information/parameters */
struct ivtv_card {
int type;
@@ -261,6 +267,7 @@ struct ivtv_card {
struct ivtv_gpio_audio_detect gpio_audio_detect;
struct ivtv_card_tuner tuners[IVTV_CARD_MAX_TUNERS];
+ struct ivtv_card_tuner_i2c *i2c;
/* list of device and subsystem vendor/devices that
correspond to this card type. */
diff --git a/linux/drivers/media/video/ivtv/ivtv-driver.c b/linux/drivers/media/video/ivtv/ivtv-driver.c
index 5a5634ee0..8cb43fc09 100644
--- a/linux/drivers/media/video/ivtv/ivtv-driver.c
+++ b/linux/drivers/media/video/ivtv/ivtv-driver.c
@@ -187,6 +187,7 @@ MODULE_PARM_DESC(cardtype,
"\t\t\t21 = AverTV MCE 116 Plus\n"
"\t\t\t22 = ASUS Falcon2\n"
"\t\t\t23 = AverMedia PVR-150 Plus\n"
+ "\t\t\t24 = AverMedia EZMaker PCI Deluxe\n"
"\t\t\t 0 = Autodetect (default)\n"
"\t\t\t-1 = Ignore this card\n\t\t");
MODULE_PARM_DESC(pal, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60");
@@ -399,6 +400,7 @@ static void ivtv_process_eeprom(struct ivtv *itv)
itv->v4l2_cap = itv->card->v4l2_capabilities;
itv->card_name = itv->card->name;
+ itv->card_i2c = itv->card->i2c;
/* If this is a PVR500 then it should be possible to detect whether it is the
first or second unit by looking at the subsystem device ID: is bit 4 is
@@ -416,7 +418,14 @@ static void ivtv_process_eeprom(struct ivtv *itv)
This detection is needed since the eeprom reports incorrectly that a radio is
present on the second unit. */
if (tv.model / 1000 == 23) {
+ static const struct ivtv_card_tuner_i2c ivtv_i2c_radio = {
+ .radio = { 0x60, I2C_CLIENT_END },
+ .demod = { 0x43, I2C_CLIENT_END },
+ .tv = { 0x61, I2C_CLIENT_END },
+ };
+
itv->card_name = "WinTV PVR 500";
+ itv->card_i2c = &ivtv_i2c_radio;
if (pci_slot == 8 || pci_slot == 9) {
int is_first = (pci_slot & 1) == 0;
@@ -634,6 +643,7 @@ done:
}
itv->v4l2_cap = itv->card->v4l2_capabilities;
itv->card_name = itv->card->name;
+ itv->card_i2c = itv->card->i2c;
}
/* Precondition: the ivtv structure has been memset to 0. Only
@@ -819,79 +829,66 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev,
return 0;
}
-static void ivtv_request_module(struct ivtv *itv, const char *name)
+static u32 ivtv_request_module(struct ivtv *itv, u32 hw,
+ const char *name, u32 id)
{
+ if ((hw & id) == 0)
+ return hw;
if (request_module(name) != 0) {
IVTV_ERR("Failed to load module %s\n", name);
- } else {
- IVTV_DEBUG_INFO("Loaded module %s\n", name);
+ return hw & ~id;
}
+ IVTV_DEBUG_INFO("Loaded module %s\n", name);
+ return hw;
}
static void ivtv_load_and_init_modules(struct ivtv *itv)
{
u32 hw = itv->card->hw_all;
- int i;
+ unsigned i;
/* load modules */
-#ifndef CONFIG_VIDEO_TUNER
- if (hw & IVTV_HW_TUNER) {
- if (itv->options.tuner == TUNER_XC2028) {
- IVTV_INFO("Xceive tuner not yet supported, only composite and S-Video inputs will be available\n");
- itv->tunerid = 1;
- }
- else {
- ivtv_request_module(itv, "tuner");
- }
+ if ((hw & IVTV_HW_TUNER) && itv->options.tuner == TUNER_XC2028) {
+ IVTV_INFO("Xceive tuner not yet supported, only composite\n");
+ IVTV_INFO("and S-Video inputs will be available\n");
+ hw &= ~IVTV_HW_TUNER;
}
+#ifndef CONFIG_VIDEO_TUNER
+ hw = ivtv_request_module(itv, hw, "tuner", IVTV_HW_TUNER);
#endif
#ifndef CONFIG_VIDEO_CX25840
- if (hw & IVTV_HW_CX25840)
- ivtv_request_module(itv, "cx25840");
+ hw = ivtv_request_module(itv, hw, "cx25840", IVTV_HW_CX25840);
#endif
#ifndef CONFIG_VIDEO_SAA711X
- if (hw & IVTV_HW_SAA711X)
- ivtv_request_module(itv, "saa7115");
+ hw = ivtv_request_module(itv, hw, "saa7115", IVTV_HW_SAA711X);
#endif
#ifndef CONFIG_VIDEO_SAA7127
- if (hw & IVTV_HW_SAA7127)
- ivtv_request_module(itv, "saa7127");
+ hw = ivtv_request_module(itv, hw, "saa7127", IVTV_HW_SAA7127);
#endif
- if (hw & IVTV_HW_SAA717X)
- ivtv_request_module(itv, "saa717x");
+ hw = ivtv_request_module(itv, hw, "saa717x", IVTV_HW_SAA717X);
#ifndef CONFIG_VIDEO_UPD64031A
- if (hw & IVTV_HW_UPD64031A)
- ivtv_request_module(itv, "upd64031a");
+ hw = ivtv_request_module(itv, hw, "upd64031a", IVTV_HW_UPD64031A);
#endif
#ifndef CONFIG_VIDEO_UPD64083
- if (hw & IVTV_HW_UPD6408X)
- ivtv_request_module(itv, "upd64083");
+ hw = ivtv_request_module(itv, hw, "upd64083", IVTV_HW_UPD6408X);
#endif
#ifndef CONFIG_VIDEO_MSP3400
- if (hw & IVTV_HW_MSP34XX)
- ivtv_request_module(itv, "msp3400");
+ hw = ivtv_request_module(itv, hw, "msp3400", IVTV_HW_MSP34XX);
#endif
#ifndef CONFIG_VIDEO_VP27SMPX
- if (hw & IVTV_HW_VP27SMPX)
- ivtv_request_module(itv, "vp27smpx");
+ hw = ivtv_request_module(itv, hw, "vp27smpx", IVTV_HW_VP27SMPX);
#endif
- if (hw & IVTV_HW_TVAUDIO)
- ivtv_request_module(itv, "tvaudio");
#ifndef CONFIG_VIDEO_WM8775
- if (hw & IVTV_HW_WM8775)
- ivtv_request_module(itv, "wm8775");
+ hw = ivtv_request_module(itv, hw, "wm8775", IVTV_HW_WM8775);
#endif
#ifndef CONFIG_VIDEO_WM8739
- if (hw & IVTV_HW_WM8739)
- ivtv_request_module(itv, "wm8739");
+ hw = ivtv_request_module(itv, hw, "wm8739", IVTV_HW_WM8739);
#endif
#ifndef CONFIG_VIDEO_CS53L32A
- if (hw & IVTV_HW_CS53L32A)
- ivtv_request_module(itv, "cs53l32a");
+ hw = ivtv_request_module(itv, hw, "cs53l32a", IVTV_HW_CS53L32A);
#endif
#ifndef CONFIG_VIDEO_M52790
- if (hw & IVTV_HW_M52790)
- ivtv_request_module(itv, "m52790");
+ hw = ivtv_request_module(itv, hw, "m52790", IVTV_HW_M52790);
#endif
/* check which i2c devices are actually found */
@@ -900,11 +897,12 @@ static void ivtv_load_and_init_modules(struct ivtv *itv)
if (!(device & hw))
continue;
- if (device == IVTV_HW_GPIO) {
- /* GPIO is always available */
- itv->hw_flags |= IVTV_HW_GPIO;
+ if (device == IVTV_HW_GPIO || device == IVTV_HW_TVEEPROM) {
+ /* GPIO and TVEEPROM do not use i2c probing */
+ itv->hw_flags |= device;
continue;
}
+ ivtv_i2c_register(itv, i);
if (ivtv_i2c_hw_addr(itv, device) > 0)
itv->hw_flags |= device;
}
@@ -989,7 +987,7 @@ static int __devinit ivtv_probe(struct pci_dev *dev,
}
itv = kzalloc(sizeof(struct ivtv), GFP_ATOMIC);
- if (itv == 0) {
+ if (itv == NULL) {
spin_unlock(&ivtv_cards_lock);
return -ENOMEM;
}
@@ -1078,9 +1076,6 @@ static int __devinit ivtv_probe(struct pci_dev *dev,
IVTV_DEBUG_INFO("Active card count: %d.\n", ivtv_cards_active);
if (itv->card->hw_all & IVTV_HW_TVEEPROM) {
-#ifdef CONFIG_VIDEO_TVEEPROM_MODULE
- ivtv_request_module(itv, "tveeprom");
-#endif
/* Based on the model number the cardtype may be changed.
The PCI IDs are not always reliable. */
ivtv_process_eeprom(itv);
@@ -1153,7 +1148,7 @@ static int __devinit ivtv_probe(struct pci_dev *dev,
if (itv->options.radio > 0)
itv->v4l2_cap |= V4L2_CAP_RADIO;
- if (itv->options.tuner > -1 && itv->tunerid == 0) {
+ if (itv->options.tuner > -1) {
struct tuner_setup setup;
setup.addr = ADDR_UNSET;
diff --git a/linux/drivers/media/video/ivtv/ivtv-driver.h b/linux/drivers/media/video/ivtv/ivtv-driver.h
index 8b0074624..5b2bd0be0 100644
--- a/linux/drivers/media/video/ivtv/ivtv-driver.h
+++ b/linux/drivers/media/video/ivtv/ivtv-driver.h
@@ -600,13 +600,13 @@ struct ivtv {
struct pci_dev *dev; /* PCI device */
const struct ivtv_card *card; /* card information */
const char *card_name; /* full name of the card */
+ const struct ivtv_card_tuner_i2c *card_i2c; /* i2c addresses to probe for tuner */
u8 has_cx23415; /* 1 if it is a cx23415 based card, 0 for cx23416 */
u8 pvr150_workaround; /* 1 if the cx25840 needs to workaround a PVR150 bug */
u8 nof_inputs; /* number of video inputs */
u8 nof_audio_inputs; /* number of audio inputs */
u32 v4l2_cap; /* V4L2 capabilities of card */
u32 hw_flags; /* hardware description of the board */
- int tunerid; /* userspace tuner ID for experimental Xceive tuner support */
v4l2_std_id tuner_std; /* the norm of the card's tuner (fixed) */
/* controlling video decoder function */
int (*video_dec_func)(struct ivtv *, unsigned int, void *);
diff --git a/linux/drivers/media/video/ivtv/ivtv-i2c.c b/linux/drivers/media/video/ivtv/ivtv-i2c.c
index 6c96bb9bc..ebf85f74e 100644
--- a/linux/drivers/media/video/ivtv/ivtv-i2c.c
+++ b/linux/drivers/media/video/ivtv/ivtv-i2c.c
@@ -92,7 +92,8 @@
#define IVTV_TEA5767_I2C_ADDR 0x60
#define IVTV_UPD64031A_I2C_ADDR 0x12
#define IVTV_UPD64083_I2C_ADDR 0x5c
-#define IVTV_TDA985X_I2C_ADDR 0x5b
+#define IVTV_VP27SMPX_I2C_ADDR 0x5b
+#define IVTV_M52790_I2C_ADDR 0x48
/* This array should match the IVTV_HW_ defines */
static const u8 hw_driverids[] = {
@@ -105,7 +106,6 @@ static const u8 hw_driverids[] = {
I2C_DRIVERID_CS53L32A,
I2C_DRIVERID_TVEEPROM,
I2C_DRIVERID_SAA711X,
- I2C_DRIVERID_TVAUDIO,
I2C_DRIVERID_UPD64031A,
I2C_DRIVERID_UPD64083,
I2C_DRIVERID_SAA717X,
@@ -116,8 +116,28 @@ static const u8 hw_driverids[] = {
};
/* This array should match the IVTV_HW_ defines */
+static const u8 hw_addrs[] = {
+ IVTV_CX25840_I2C_ADDR,
+ IVTV_SAA7115_I2C_ADDR,
+ IVTV_SAA7127_I2C_ADDR,
+ IVTV_MSP3400_I2C_ADDR,
+ 0,
+ IVTV_WM8775_I2C_ADDR,
+ IVTV_CS53L32A_I2C_ADDR,
+ 0,
+ IVTV_SAA7115_I2C_ADDR,
+ IVTV_UPD64031A_I2C_ADDR,
+ IVTV_UPD64083_I2C_ADDR,
+ IVTV_SAA717x_I2C_ADDR,
+ IVTV_WM8739_I2C_ADDR,
+ IVTV_VP27SMPX_I2C_ADDR,
+ IVTV_M52790_I2C_ADDR,
+ 0 /* IVTV_HW_GPIO dummy driver ID */
+};
+
+/* This array should match the IVTV_HW_ defines */
static const char * const hw_drivernames[] = {
- "cx2584x",
+ "cx25840",
"saa7115",
"saa7127",
"msp3400",
@@ -125,8 +145,7 @@ static const char * const hw_drivernames[] = {
"wm8775",
"cs53l32a",
"tveeprom",
- "saa7114",
- "tvaudio",
+ "saa7115",
"upd64031a",
"upd64083",
"saa717x",
@@ -136,8 +155,62 @@ static const char * const hw_drivernames[] = {
"gpio",
};
+int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
+ struct i2c_board_info info;
+ struct i2c_client *c;
+ u8 id;
+ int i;
+
+ IVTV_DEBUG_I2C("i2c client register\n");
+ if (idx >= ARRAY_SIZE(hw_driverids) || hw_driverids[idx] == 0)
+ return -1;
+ id = hw_driverids[idx];
+ memset(&info, 0, sizeof(info));
+ strcpy(info.driver_name, hw_drivernames[idx]);
+ info.addr = hw_addrs[idx];
+ for (i = 0; itv->i2c_clients[i] && i < I2C_CLIENTS_MAX; i++) {}
+
+ if (i == I2C_CLIENTS_MAX) {
+ IVTV_ERR("insufficient room for new I2C client!\n");
+ return -ENOMEM;
+ }
+
+ if (id != I2C_DRIVERID_TUNER) {
+ c = i2c_new_device(&itv->i2c_adap, &info);
+ if (c->driver == NULL)
+ i2c_unregister_device(c);
+ else
+ itv->i2c_clients[i] = c;
+ return itv->i2c_clients[i] ? 0 : -ENODEV;
+ }
+
+ /* special tuner handling */
+ c = i2c_new_probed_device(&itv->i2c_adap, &info, itv->card_i2c->radio);
+ if (c && c->driver == NULL)
+ i2c_unregister_device(c);
+ else if (c)
+ itv->i2c_clients[i++] = c;
+ c = i2c_new_probed_device(&itv->i2c_adap, &info, itv->card_i2c->demod);
+ if (c && c->driver == NULL)
+ i2c_unregister_device(c);
+ else if (c)
+ itv->i2c_clients[i++] = c;
+ c = i2c_new_probed_device(&itv->i2c_adap, &info, itv->card_i2c->tv);
+ if (c && c->driver == NULL)
+ i2c_unregister_device(c);
+ else if (c)
+ itv->i2c_clients[i++] = c;
+ return 0;
+#else
+ return 0;
+#endif
+}
+
static int attach_inform(struct i2c_client *client)
{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
struct ivtv *itv = (struct ivtv *)i2c_get_adapdata(client->adapter);
int i;
@@ -151,6 +224,7 @@ static int attach_inform(struct i2c_client *client)
if (i == I2C_CLIENTS_MAX) {
IVTV_ERR("Insufficient room for new I2C client\n");
}
+#endif
return 0;
}
@@ -478,9 +552,11 @@ static struct i2c_adapter ivtv_i2c_adap_hw_template = {
.client_register = attach_inform,
.client_unregister = detach_inform,
.owner = THIS_MODULE,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
#ifdef I2C_ADAP_CLASS_TV_ANALOG
.class = I2C_ADAP_CLASS_TV_ANALOG,
#endif
+#endif
};
static void ivtv_setscl_old(void *data, int state)
@@ -534,9 +610,11 @@ static struct i2c_adapter ivtv_i2c_adap_template = {
.client_register = attach_inform,
.client_unregister = detach_inform,
.owner = THIS_MODULE,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
#ifdef I2C_ADAP_CLASS_TV_ANALOG
.class = I2C_ADAP_CLASS_TV_ANALOG,
#endif
+#endif
};
static const struct i2c_algo_bit_data ivtv_i2c_algo_template = {
@@ -561,12 +639,9 @@ int ivtv_call_i2c_client(struct ivtv *itv, int addr, unsigned int cmd, void *arg
IVTV_DEBUG_I2C("call_i2c_client addr=%02x\n", addr);
for (i = 0; i < I2C_CLIENTS_MAX; i++) {
client = itv->i2c_clients[i];
- if (client == NULL) {
- continue;
- }
- if (client->driver->command == NULL) {
+ if (client == NULL || client->driver == NULL ||
+ client->driver->command == NULL)
continue;
- }
if (addr == client->addr) {
retval = client->driver->command(client, cmd, arg);
return retval;
@@ -587,7 +662,7 @@ static int ivtv_i2c_id_addr(struct ivtv *itv, u32 id)
for (i = 0; i < I2C_CLIENTS_MAX; i++) {
client = itv->i2c_clients[i];
- if (client == NULL)
+ if (client == NULL || client->driver == NULL)
continue;
if (id == client->driver->id) {
retval = client->addr;
@@ -709,10 +784,20 @@ void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg)
}
/* init + register i2c algo-bit adapter */
-int __devinit init_ivtv_i2c(struct ivtv *itv)
+int init_ivtv_i2c(struct ivtv *itv)
{
IVTV_DEBUG_I2C("i2c init\n");
+ /* Sanity checks for the I2C hardware arrays. They must be the
+ * same size and GPIO must be the last entry.
+ */
+ if (ARRAY_SIZE(hw_driverids) != ARRAY_SIZE(hw_addrs) ||
+ ARRAY_SIZE(hw_drivernames) != ARRAY_SIZE(hw_addrs) ||
+ IVTV_HW_GPIO != (1 << (ARRAY_SIZE(hw_addrs) - 1)) ||
+ hw_driverids[ARRAY_SIZE(hw_addrs) - 1]) {
+ IVTV_ERR("Mismatched I2C hardware arrays\n");
+ return -ENODEV;
+ }
if (itv->options.newi2c > 0) {
memcpy(&itv->i2c_adap, &ivtv_i2c_adap_hw_template,
sizeof(struct i2c_adapter));
diff --git a/linux/drivers/media/video/ivtv/ivtv-i2c.h b/linux/drivers/media/video/ivtv/ivtv-i2c.h
index de6a07442..022978cf5 100644
--- a/linux/drivers/media/video/ivtv/ivtv-i2c.h
+++ b/linux/drivers/media/video/ivtv/ivtv-i2c.h
@@ -33,9 +33,10 @@ int ivtv_i2c_hw(struct ivtv *itv, u32 hw, unsigned int cmd, void *arg);
int ivtv_i2c_id(struct ivtv *itv, u32 id, unsigned int cmd, void *arg);
int ivtv_call_i2c_client(struct ivtv *itv, int addr, unsigned int cmd, void *arg);
void ivtv_call_i2c_clients(struct ivtv *itv, unsigned int cmd, void *arg);
+int ivtv_i2c_register(struct ivtv *itv, unsigned idx);
/* init + register i2c algo-bit adapter */
-int __devinit init_ivtv_i2c(struct ivtv *itv);
+int init_ivtv_i2c(struct ivtv *itv);
void exit_ivtv_i2c(struct ivtv *itv);
#endif
diff --git a/linux/drivers/media/video/ivtv/ivtv-ioctl.c b/linux/drivers/media/video/ivtv/ivtv-ioctl.c
index 39f20dfb8..87a83b8e3 100644
--- a/linux/drivers/media/video/ivtv/ivtv-ioctl.c
+++ b/linux/drivers/media/video/ivtv/ivtv-ioctl.c
@@ -704,7 +704,7 @@ static int ivtv_debug_ioctls(struct file *filp, unsigned int cmd, void *arg)
ivtv_reset_ir_gpio(itv);
}
if (val & 0x02) {
- itv->video_dec_func(itv, cmd, 0);
+ itv->video_dec_func(itv, cmd, NULL);
}
break;
}
diff --git a/linux/drivers/media/video/ivtv/ivtv-irq.c b/linux/drivers/media/video/ivtv/ivtv-irq.c
index 42f9b3402..46a5cbc62 100644
--- a/linux/drivers/media/video/ivtv/ivtv-irq.c
+++ b/linux/drivers/media/video/ivtv/ivtv-irq.c
@@ -210,7 +210,7 @@ static int stream_enc_dma_append(struct ivtv_stream *s, u32 data[CX2341X_MBOX_MA
s->sg_pending[idx].dst = buf->dma_handle;
s->sg_pending[idx].src = offset;
s->sg_pending[idx].size = s->buf_size;
- buf->bytesused = (size < s->buf_size) ? size : s->buf_size;
+ buf->bytesused = min(size, s->buf_size);
buf->dma_xfer_cnt = s->dma_xfer_cnt;
s->q_predma.bytesused += buf->bytesused;
@@ -742,7 +742,7 @@ static void ivtv_irq_dec_data_req(struct ivtv *itv)
s = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
}
else {
- itv->dma_data_req_size = data[2] >= 0x10000 ? 0x10000 : data[2];
+ itv->dma_data_req_size = min_t(u32, data[2], 0x10000);
itv->dma_data_req_offset = data[1];
s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
}
diff --git a/linux/drivers/media/video/ivtv/ivtv-streams.c b/linux/drivers/media/video/ivtv/ivtv-streams.c
index 3ca2a1a62..24d98ecf3 100644
--- a/linux/drivers/media/video/ivtv/ivtv-streams.c
+++ b/linux/drivers/media/video/ivtv/ivtv-streams.c
@@ -572,10 +572,10 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s)
clear_bit(IVTV_F_I_EOS, &itv->i_flags);
/* Initialize Digitizer for Capture */
- itv->video_dec_func(itv, VIDIOC_STREAMOFF, 0);
+ itv->video_dec_func(itv, VIDIOC_STREAMOFF, NULL);
ivtv_msleep_timeout(300, 1);
ivtv_vapi(itv, CX2341X_ENC_INITIALIZE_INPUT, 0);
- itv->video_dec_func(itv, VIDIOC_STREAMON, 0);
+ itv->video_dec_func(itv, VIDIOC_STREAMON, NULL);
}
/* begin_capture */
diff --git a/linux/drivers/media/video/ivtv/ivtv-version.h b/linux/drivers/media/video/ivtv/ivtv-version.h
index d050de2a7..0f1d4cc4b 100644
--- a/linux/drivers/media/video/ivtv/ivtv-version.h
+++ b/linux/drivers/media/video/ivtv/ivtv-version.h
@@ -22,7 +22,7 @@
#define IVTV_DRIVER_NAME "ivtv"
#define IVTV_DRIVER_VERSION_MAJOR 1
-#define IVTV_DRIVER_VERSION_MINOR 1
+#define IVTV_DRIVER_VERSION_MINOR 2
#define IVTV_DRIVER_VERSION_PATCHLEVEL 0
#define IVTV_VERSION __stringify(IVTV_DRIVER_VERSION_MAJOR) "." __stringify(IVTV_DRIVER_VERSION_MINOR) "." __stringify(IVTV_DRIVER_VERSION_PATCHLEVEL)
diff --git a/linux/drivers/media/video/ivtv/ivtvfb.c b/linux/drivers/media/video/ivtv/ivtvfb.c
index 1a73038ea..3b23fc05f 100644
--- a/linux/drivers/media/video/ivtv/ivtvfb.c
+++ b/linux/drivers/media/video/ivtv/ivtvfb.c
@@ -1057,7 +1057,7 @@ static int ivtvfb_init_card(struct ivtv *itv)
}
itv->osd_info = kzalloc(sizeof(struct osd_info), GFP_ATOMIC);
- if (itv->osd_info == 0) {
+ if (itv->osd_info == NULL) {
IVTVFB_ERR("Failed to allocate memory for osd_info\n");
return -ENOMEM;
}
diff --git a/linux/drivers/media/video/m52790.c b/linux/drivers/media/video/m52790.c
index ebe089c6d..804ef3005 100644
--- a/linux/drivers/media/video/m52790.c
+++ b/linux/drivers/media/video/m52790.c
@@ -41,6 +41,7 @@ MODULE_DESCRIPTION("i2c device driver for m52790 A/V switch");
MODULE_AUTHOR("Hans Verkuil");
MODULE_LICENSE("GPL");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
static unsigned short normal_i2c[] = { 0x90 >> 1, I2C_CLIENT_END };
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
@@ -48,6 +49,7 @@ static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
#endif
I2C_CLIENT_INSMOD;
+#endif
struct m52790_state {
u16 input;
diff --git a/linux/drivers/media/video/pvrusb2/Kconfig b/linux/drivers/media/video/pvrusb2/Kconfig
index d0c2cd785..95e439601 100644
--- a/linux/drivers/media/video/pvrusb2/Kconfig
+++ b/linux/drivers/media/video/pvrusb2/Kconfig
@@ -12,32 +12,29 @@ config VIDEO_PVRUSB2
To compile this driver as a module, choose M here: the
module will be called pvrusb2
-config VIDEO_PVRUSB2_29XXX
- bool "Hauppauge WinTV-PVR USB2 support for 29xxx model series"
+config VIDEO_PVRUSB2_ONAIR_CREATOR
+ bool "pvrusb2 driver support for OnAir Creator model"
depends on VIDEO_PVRUSB2 && EXPERIMENTAL
select VIDEO_SAA711X
- select VIDEO_MSP3400
+ select VIDEO_CS53L32A
---help---
- This option enables support for WinTV-PVR USB2 devices whose
- model number is of the form "29xxx" (leading prefix of "29"
- followed by 3 digits).
- To see if you may need this option, examine the white
- sticker on the underside of your device.
+
+ This option enables support for the OnAir Creator USB tuner
+ device. This is a hybrid device, however currently only
+ analog mode is supported.
If you are in doubt, say Y.
-config VIDEO_PVRUSB2_24XXX
- bool "Hauppauge WinTV-PVR USB2 support for 24xxx model series"
+config VIDEO_PVRUSB2_ONAIR_USB2
+ bool "pvrusb2 driver support for OnAir USB2 model"
depends on VIDEO_PVRUSB2 && EXPERIMENTAL
- select VIDEO_CX25840
- select VIDEO_WM8775
+ select VIDEO_SAA711X
+ select VIDEO_CS53L32A
---help---
- This option enables inclusion of additional logic to operate
- newer WinTV-PVR USB2 devices whose model number is of the
- form "24xxx" (leading prefix of "24" followed by 3 digits).
- To see if you may need this option, examine the white
- sticker on the underside of your device. Enabling this
- option will not harm support for older devices.
+
+ This option enables support for the OnAir USB2 tuner device
+ (also known as the Sasem tuner). This is a hybrid device,
+ however currently only analog mode is supported.
If you are in doubt, say Y.
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.c b/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.c
index eed64571c..9a08670d4 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.c
@@ -33,50 +33,22 @@ pvr2_device_desc structures.
#include <linux/i2c.h>
#include <media/tuner.h>
-/* Known major hardware variants, keyed from device ID */
-#define PVR2_HDW_TYPE_29XXX 0
-#define PVR2_HDW_TYPE_24XXX 1
-#define PVR2_HDW_TYPE_GOTVIEW_2 2
-struct usb_device_id pvr2_device_table[] = {
- [PVR2_HDW_TYPE_29XXX] = { USB_DEVICE(0x2040, 0x2900) },
- [PVR2_HDW_TYPE_24XXX] = { USB_DEVICE(0x2040, 0x2400) },
- [PVR2_HDW_TYPE_GOTVIEW_2] = { USB_DEVICE(0x1164, 0x0622) },
- { }
-};
-/* Names of other client modules to request for 24xxx model hardware */
-static const char *pvr2_client_24xxx[] = {
- "cx25840",
- "tuner",
- "wm8775",
-};
+/*------------------------------------------------------------------------*/
+/* Hauppauge PVR-USB2 Model 29xxx */
-/* Names of other client modules to request for 29xxx model hardware */
static const char *pvr2_client_29xxx[] = {
"msp3400",
"saa7115",
"tuner",
};
-// Names of other client modules to request for Gotview 2 model hardware
-static const char *pvr2_client_gotview_2[] = {
- "cx25840",
- "tuner",
-};
-
-/* Firmware file name(s) for 29xxx devices */
static const char *pvr2_fw1_names_29xxx[] = {
"v4l-pvrusb2-29xxx-01.fw",
};
-/* Firmware file name(s) for 24xxx devices */
-static const char *pvr2_fw1_names_24xxx[] = {
- "v4l-pvrusb2-24xxx-01.fw",
-};
-
-const struct pvr2_device_desc pvr2_device_descriptions[] = {
- [PVR2_HDW_TYPE_29XXX] = {
+static const struct pvr2_device_desc pvr2_device_29xxx = {
.description = "WinTV PVR USB2 Model Category 29xxxx",
.shortname = "29xxx",
.client_modules.lst = pvr2_client_29xxx,
@@ -85,8 +57,24 @@ const struct pvr2_device_desc pvr2_device_descriptions[] = {
.fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_29xxx),
.flag_has_hauppauge_rom = !0,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
- },
- [PVR2_HDW_TYPE_24XXX] = {
+};
+
+
+
+/*------------------------------------------------------------------------*/
+/* Hauppauge PVR-USB2 Model 24xxx */
+
+static const char *pvr2_client_24xxx[] = {
+ "cx25840",
+ "tuner",
+ "wm8775",
+};
+
+static const char *pvr2_fw1_names_24xxx[] = {
+ "v4l-pvrusb2-24xxx-01.fw",
+};
+
+static const struct pvr2_device_desc pvr2_device_24xxx = {
.description = "WinTV PVR USB2 Model Category 24xxxx",
.shortname = "24xxx",
.client_modules.lst = pvr2_client_24xxx,
@@ -98,18 +86,93 @@ const struct pvr2_device_desc pvr2_device_descriptions[] = {
.flag_has_hauppauge_rom = !0,
.flag_has_hauppauge_custom_ir = !0,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
- },
- [PVR2_HDW_TYPE_GOTVIEW_2] = {
+};
+
+
+
+/*------------------------------------------------------------------------*/
+/* GOTVIEW USB2.0 DVD2 */
+
+static const char *pvr2_client_gotview_2[] = {
+ "cx25840",
+ "tuner",
+};
+
+static const struct pvr2_device_desc pvr2_device_gotview_2 = {
.description = "Gotview USB 2.0 DVD 2",
.shortname = "gv2",
.client_modules.lst = pvr2_client_gotview_2,
.client_modules.cnt = ARRAY_SIZE(pvr2_client_gotview_2),
+ .flag_has_cx25840 = !0,
.default_tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_GOTVIEW,
- },
};
-const unsigned int pvr2_device_count = ARRAY_SIZE(pvr2_device_descriptions);
+
+
+#ifdef CONFIG_VIDEO_PVRUSB2_ONAIR_CREATOR
+/*------------------------------------------------------------------------*/
+/* OnAir Creator */
+
+static const char *pvr2_client_onair_creator[] = {
+ "saa7115",
+ "tuner",
+ "cs53l32a",
+};
+
+static const struct pvr2_device_desc pvr2_device_onair_creator = {
+ .description = "OnAir Creator Hybrid USB tuner",
+ .shortname = "oac",
+ .client_modules.lst = pvr2_client_onair_creator,
+ .client_modules.cnt = ARRAY_SIZE(pvr2_client_onair_creator),
+ .default_tuner_type = TUNER_LG_TDVS_H06XF,
+ .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
+};
+#endif
+
+
+
+#ifdef CONFIG_VIDEO_PVRUSB2_ONAIR_USB2
+/*------------------------------------------------------------------------*/
+/* OnAir USB 2.0 */
+
+static const char *pvr2_client_onair_usb2[] = {
+ "saa7115",
+ "tuner",
+ "cs53l32a",
+};
+
+static const struct pvr2_device_desc pvr2_device_onair_usb2 = {
+ .description = "OnAir USB2 Hybrid USB tuner",
+ .shortname = "oa2",
+ .client_modules.lst = pvr2_client_onair_usb2,
+ .client_modules.cnt = ARRAY_SIZE(pvr2_client_onair_usb2),
+ .default_tuner_type = TUNER_PHILIPS_ATSC,
+ .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
+};
+#endif
+
+
+
+/*------------------------------------------------------------------------*/
+
+struct usb_device_id pvr2_device_table[] = {
+ { USB_DEVICE(0x2040, 0x2900),
+ .driver_info = (kernel_ulong_t)&pvr2_device_29xxx},
+ { USB_DEVICE(0x2040, 0x2400),
+ .driver_info = (kernel_ulong_t)&pvr2_device_24xxx},
+ { USB_DEVICE(0x1164, 0x0622),
+ .driver_info = (kernel_ulong_t)&pvr2_device_gotview_2},
+#ifdef CONFIG_VIDEO_PVRUSB2_ONAIR_CREATOR
+ { USB_DEVICE(0x11ba, 0x1003),
+ .driver_info = (kernel_ulong_t)&pvr2_device_onair_creator},
+#endif
+#ifdef CONFIG_VIDEO_PVRUSB2_ONAIR_USB2
+ { USB_DEVICE(0x11ba, 0x1001),
+ .driver_info = (kernel_ulong_t)&pvr2_device_onair_usb2},
+#endif
+ { }
+};
MODULE_DEVICE_TABLE(usb, pvr2_device_table);
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.h b/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.h
index a9c3d99b6..64b467f06 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-devattr.h
@@ -104,9 +104,7 @@ struct pvr2_device_desc {
char flag_has_hauppauge_custom_ir;
};
-extern const struct pvr2_device_desc pvr2_device_descriptions[];
extern struct usb_device_id pvr2_device_table[];
-extern const unsigned int pvr2_device_count;
#endif /* __PVRUSB2_HDW_INTERNAL_H */
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 22d9c8f5c..0a5d488b8 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -1823,7 +1823,6 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
{
unsigned int idx,cnt1,cnt2;
struct pvr2_hdw *hdw;
- unsigned int hdw_type;
int valid_std_mask;
struct pvr2_ctrl *cptr;
const struct pvr2_device_desc *hdw_desc;
@@ -1831,13 +1830,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
struct v4l2_queryctrl qctrl;
struct pvr2_ctl_info *ciptr;
- hdw_type = devid - pvr2_device_table;
- if (hdw_type >= pvr2_device_count) {
- pvr2_trace(PVR2_TRACE_ERROR_LEGS,
- "Bogus device type of %u reported",hdw_type);
- return NULL;
- }
- hdw_desc = pvr2_device_descriptions + hdw_type;
+ hdw_desc = (const struct pvr2_device_desc *)(devid->driver_info);
hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-main.c b/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
index ea69ce6a8..59f8d7298 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
@@ -153,11 +153,6 @@ static void __exit pvr_exit(void)
module_init(pvr_init);
module_exit(pvr_exit);
-/* Mike Isely <mcisely@pobox.com> 11-Mar-2006: See pvrusb2-hdw.c for
- MODULE_DEVICE_TABLE(). We have to declare that attribute there
- because that's where the device table actually is now and it seems
- that certain gcc configurations get angry if MODULE_DEVICE_TABLE()
- is used on what ends up being an external symbol. */
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");
diff --git a/linux/drivers/media/video/saa7127.c b/linux/drivers/media/video/saa7127.c
index 27d9cab97..8a7148114 100644
--- a/linux/drivers/media/video/saa7127.c
+++ b/linux/drivers/media/video/saa7127.c
@@ -78,6 +78,7 @@ MODULE_PARM(test_image, "i");
MODULE_PARM_DESC(debug, "debug level (0-2)");
MODULE_PARM_DESC(test_image, "test_image (0-1)");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
@@ -85,6 +86,7 @@ static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
#endif
I2C_CLIENT_INSMOD;
+#endif
/*
* SAA7127 registers
diff --git a/linux/drivers/media/video/saa7134/saa7134-core.c b/linux/drivers/media/video/saa7134/saa7134-core.c
index 74b881864..002422380 100644
--- a/linux/drivers/media/video/saa7134/saa7134-core.c
+++ b/linux/drivers/media/video/saa7134/saa7134-core.c
@@ -1149,7 +1149,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
dev->name,dev->video_dev->minor & 0x1f);
- dev->vbi_dev = vdev_init(dev,&saa7134_vbi_template,"vbi");
+ dev->vbi_dev = vdev_init(dev, &saa7134_video_template, "vbi");
+ dev->vbi_dev->type = VID_TYPE_TUNER | VID_TYPE_TELETEXT;
+
err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
vbi_nr[dev->nr]);
if (err < 0)
diff --git a/linux/drivers/media/video/saa7134/saa7134-empress.c b/linux/drivers/media/video/saa7134/saa7134-empress.c
index 5fe8f5320..b406aabef 100644
--- a/linux/drivers/media/video/saa7134/saa7134-empress.c
+++ b/linux/drivers/media/video/saa7134/saa7134-empress.c
@@ -170,152 +170,176 @@ ts_mmap(struct file *file, struct vm_area_struct * vma)
* video_generic_ioctl (and maybe others). userspace
* copying is done already, arg is a kernel pointer.
*/
-static int ts_do_ioctl(struct inode *inode, struct file *file,
- unsigned int cmd, void *arg)
+
+static int empress_querycap(struct file *file, void *priv,
+ struct v4l2_capability *cap)
{
- struct saa7134_dev *dev = file->private_data;
- struct v4l2_ext_controls *ctrls = arg;
-
- if (debug > 1)
- v4l_print_ioctl(dev->name,cmd);
- switch (cmd) {
- case VIDIOC_QUERYCAP:
- {
- struct v4l2_capability *cap = arg;
-
- memset(cap,0,sizeof(*cap));
- strcpy(cap->driver, "saa7134");
- strlcpy(cap->card, saa7134_boards[dev->board].name,
- sizeof(cap->card));
- sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci));
- cap->version = SAA7134_VERSION_CODE;
- cap->capabilities =
- V4L2_CAP_VIDEO_CAPTURE |
- V4L2_CAP_READWRITE |
- V4L2_CAP_STREAMING;
- return 0;
- }
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ strcpy(cap->driver, "saa7134");
+ strlcpy(cap->card, saa7134_boards[dev->board].name,
+ sizeof(cap->card));
+ sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
+ cap->version = SAA7134_VERSION_CODE;
+ cap->capabilities =
+ V4L2_CAP_VIDEO_CAPTURE |
+ V4L2_CAP_READWRITE |
+ V4L2_CAP_STREAMING;
+ return 0;
+}
- /* --- input switching --------------------------------------- */
- case VIDIOC_ENUMINPUT:
- {
- struct v4l2_input *i = arg;
+static int empress_enum_input(struct file *file, void *priv,
+ struct v4l2_input *i)
+{
+ if (i->index != 0)
+ return -EINVAL;
- if (i->index != 0)
- return -EINVAL;
- i->type = V4L2_INPUT_TYPE_CAMERA;
- strcpy(i->name,"CCIR656");
- return 0;
- }
- case VIDIOC_G_INPUT:
- {
- int *i = arg;
- *i = 0;
- return 0;
- }
- case VIDIOC_S_INPUT:
- {
- int *i = arg;
+ i->type = V4L2_INPUT_TYPE_CAMERA;
+ strcpy(i->name, "CCIR656");
- if (*i != 0)
- return -EINVAL;
- return 0;
- }
- /* --- capture ioctls ---------------------------------------- */
-
- case VIDIOC_ENUM_FMT:
- {
- struct v4l2_fmtdesc *f = arg;
- int index;
-
- index = f->index;
- if (index != 0)
- return -EINVAL;
-
- memset(f,0,sizeof(*f));
- f->index = index;
- strlcpy(f->description, "MPEG TS", sizeof(f->description));
- f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- f->pixelformat = V4L2_PIX_FMT_MPEG;
- return 0;
- }
+ return 0;
+}
- case VIDIOC_G_FMT:
- {
- struct v4l2_format *f = arg;
+static int empress_g_input(struct file *file, void *priv, unsigned int *i)
+{
+ *i = 0;
+ return 0;
+}
- memset(f,0,sizeof(*f));
- f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+static int empress_s_input(struct file *file, void *priv, unsigned int i)
+{
+ if (i != 0)
+ return -EINVAL;
- saa7134_i2c_call_clients(dev, cmd, arg);
- f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
- f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
- return 0;
- }
+ return 0;
+}
- case VIDIOC_S_FMT:
- {
- struct v4l2_format *f = arg;
+static int empress_enum_fmt_cap(struct file *file, void *priv,
+ struct v4l2_fmtdesc *f)
+{
+ if (f->index != 0)
+ return -EINVAL;
- if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ strlcpy(f->description, "MPEG TS", sizeof(f->description));
+ f->pixelformat = V4L2_PIX_FMT_MPEG;
- saa7134_i2c_call_clients(dev, cmd, arg);
- f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
- f->fmt.pix.sizeimage = TS_PACKET_SIZE* dev->ts.nr_packets;
- return 0;
- }
+ return 0;
+}
- case VIDIOC_REQBUFS:
- return videobuf_reqbufs(&dev->empress_tsq,arg);
+static int empress_g_fmt_cap(struct file *file, void *priv,
+ struct v4l2_format *f)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
- case VIDIOC_QUERYBUF:
- return videobuf_querybuf(&dev->empress_tsq,arg);
+ saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f);
- case VIDIOC_QBUF:
- return videobuf_qbuf(&dev->empress_tsq,arg);
+ f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
+ f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
- case VIDIOC_DQBUF:
- return videobuf_dqbuf(&dev->empress_tsq,arg,
- file->f_flags & O_NONBLOCK);
+ return 0;
+}
- case VIDIOC_STREAMON:
- return videobuf_streamon(&dev->empress_tsq);
+static int empress_s_fmt_cap(struct file *file, void *priv,
+ struct v4l2_format *f)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
- case VIDIOC_STREAMOFF:
- return videobuf_streamoff(&dev->empress_tsq);
+ saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f);
- case VIDIOC_QUERYCTRL:
- case VIDIOC_G_CTRL:
- case VIDIOC_S_CTRL:
- return saa7134_common_ioctl(dev, cmd, arg);
+ f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
+ f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
- case VIDIOC_S_EXT_CTRLS:
- /* count == 0 is abused in saa6752hs.c, so that special
- case is handled here explicitly. */
- if (ctrls->count == 0)
- return 0;
- if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
- return -EINVAL;
- saa7134_i2c_call_clients(dev, VIDIOC_S_EXT_CTRLS, arg);
- ts_init_encoder(dev);
- return 0;
- case VIDIOC_G_EXT_CTRLS:
- if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
- return -EINVAL;
- saa7134_i2c_call_clients(dev, VIDIOC_G_EXT_CTRLS, arg);
+ return 0;
+}
+
+
+static int empress_reqbufs(struct file *file, void *priv,
+ struct v4l2_requestbuffers *p)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ return videobuf_reqbufs(&dev->empress_tsq, p);
+}
+
+static int empress_querybuf(struct file *file, void *priv,
+ struct v4l2_buffer *b)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ return videobuf_querybuf(&dev->empress_tsq, b);
+}
+
+static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ return videobuf_qbuf(&dev->empress_tsq, b);
+}
+
+static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ return videobuf_dqbuf(&dev->empress_tsq, b,
+ file->f_flags & O_NONBLOCK);
+}
+
+static int empress_streamon(struct file *file, void *priv,
+ enum v4l2_buf_type type)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ return videobuf_streamon(&dev->empress_tsq);
+}
+
+static int empress_streamoff(struct file *file, void *priv,
+ enum v4l2_buf_type type)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ return videobuf_streamoff(&dev->empress_tsq);
+}
+
+static int empress_s_ext_ctrls(struct file *file, void *priv,
+ struct v4l2_ext_controls *ctrls)
+{
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ /* count == 0 is abused in saa6752hs.c, so that special
+ case is handled here explicitly. */
+ if (ctrls->count == 0)
return 0;
- default:
- return -ENOIOCTLCMD;
- }
+ if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
+ return -EINVAL;
+
+ saa7134_i2c_call_clients(dev, VIDIOC_S_EXT_CTRLS, ctrls);
+ ts_init_encoder(dev);
+
return 0;
}
-static int ts_ioctl(struct inode *inode, struct file *file,
- unsigned int cmd, unsigned long arg)
+static int empress_g_ext_ctrls(struct file *file, void *priv,
+ struct v4l2_ext_controls *ctrls)
{
- return video_usercopy(inode, file, cmd, arg, ts_do_ioctl);
+ struct saa7134_fh *fh = priv;
+ struct saa7134_dev *dev = fh->dev;
+
+ if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
+ return -EINVAL;
+ saa7134_i2c_call_clients(dev, VIDIOC_G_EXT_CTRLS, ctrls);
+
+ return 0;
}
static const struct file_operations ts_fops =
@@ -326,7 +350,7 @@ static const struct file_operations ts_fops =
.read = ts_read,
.poll = ts_poll,
.mmap = ts_mmap,
- .ioctl = ts_ioctl,
+ .ioctl = video_ioctl2,
.llseek = no_llseek,
};
@@ -339,6 +363,29 @@ static struct video_device saa7134_empress_template =
.type2 = 0 /* FIXME */,
.fops = &ts_fops,
.minor = -1,
+
+ .vidioc_querycap = empress_querycap,
+ .vidioc_enum_fmt_cap = empress_enum_fmt_cap,
+ .vidioc_s_fmt_cap = empress_s_fmt_cap,
+ .vidioc_g_fmt_cap = empress_g_fmt_cap,
+ .vidioc_reqbufs = empress_reqbufs,
+ .vidioc_querybuf = empress_querybuf,
+ .vidioc_qbuf = empress_qbuf,
+ .vidioc_dqbuf = empress_dqbuf,
+ .vidioc_streamon = empress_streamon,
+ .vidioc_streamoff = empress_streamoff,
+ .vidioc_s_ext_ctrls = empress_s_ext_ctrls,
+ .vidioc_g_ext_ctrls = empress_g_ext_ctrls,
+ .vidioc_enum_input = empress_enum_input,
+ .vidioc_g_input = empress_g_input,
+ .vidioc_s_input = empress_s_input,
+
+ .vidioc_queryctrl = saa7134_queryctrl,
+ .vidioc_g_ctrl = saa7134_g_ctrl,
+ .vidioc_s_ctrl = saa7134_s_ctrl,
+
+ .tvnorms = SAA7134_NORMS,
+ .current_norm = V4L2_STD_PAL,
};
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
diff --git a/linux/drivers/media/video/saa7134/saa7134-video.c b/linux/drivers/media/video/saa7134/saa7134-video.c
index 7d04a24e0..f71def0fa 100644
--- a/linux/drivers/media/video/saa7134/saa7134-video.c
+++ b/linux/drivers/media/video/saa7134/saa7134-video.c
@@ -217,12 +217,6 @@ static struct saa7134_format formats[] = {
.vbi_v_start_1 = 273, \
.src_timing = 7
-#define SAA7134_NORMS \
- V4L2_STD_PAL | V4L2_STD_PAL_N | \
- V4L2_STD_PAL_Nc | V4L2_STD_SECAM | \
- V4L2_STD_NTSC | V4L2_STD_PAL_M | \
- V4L2_STD_PAL_60
-
static struct saa7134_tvnorm tvnorms[] = {
{
.name = "PAL", /* autodetect */
@@ -1123,8 +1117,7 @@ static struct videobuf_queue_ops video_qops = {
/* ------------------------------------------------------------------ */
-static int vidioc_g_ctrl(struct file *file, void *priv,
- struct v4l2_control *c)
+int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c)
{
struct saa7134_fh *fh = priv;
struct saa7134_dev *dev = fh->dev;
@@ -1172,9 +1165,9 @@ static int vidioc_g_ctrl(struct file *file, void *priv,
}
return 0;
}
+EXPORT_SYMBOL_GPL(saa7134_g_ctrl);
-static int vidioc_s_ctrl(struct file *file, void *f,
- struct v4l2_control *c)
+int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c)
{
const struct v4l2_queryctrl* ctrl;
struct saa7134_fh *fh = f;
@@ -1286,6 +1279,7 @@ error:
mutex_unlock(&dev->lock);
return err;
}
+EXPORT_SYMBOL_GPL(saa7134_s_ctrl);
/* ------------------------------------------------------------------ */
@@ -1507,7 +1501,7 @@ static int video_mmap(struct file *file, struct vm_area_struct * vma)
/* ------------------------------------------------------------------ */
-static int vidioc_try_get_set_fmt_vbi(struct file *file, void *priv,
+static int saa7134_try_get_set_fmt_vbi(struct file *file, void *priv,
struct v4l2_format *f)
{
struct saa7134_fh *fh = priv;
@@ -1534,7 +1528,7 @@ static int vidioc_try_get_set_fmt_vbi(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_fmt_cap(struct file *file, void *priv,
+static int saa7134_g_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
struct saa7134_fh *fh = priv;
@@ -1550,7 +1544,7 @@ static int vidioc_g_fmt_cap(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_fmt_overlay(struct file *file, void *priv,
+static int saa7134_g_fmt_overlay(struct file *file, void *priv,
struct v4l2_format *f)
{
struct saa7134_fh *fh = priv;
@@ -1564,7 +1558,7 @@ static int vidioc_g_fmt_overlay(struct file *file, void *priv,
return 0;
}
-static int vidioc_try_fmt_cap(struct file *file, void *priv,
+static int saa7134_try_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
struct saa7134_fh *fh = priv;
@@ -1615,7 +1609,7 @@ static int vidioc_try_fmt_cap(struct file *file, void *priv,
return 0;
}
-static int vidioc_try_fmt_overlay(struct file *file, void *priv,
+static int saa7134_try_fmt_overlay(struct file *file, void *priv,
struct v4l2_format *f)
{
struct saa7134_fh *fh = priv;
@@ -1629,13 +1623,13 @@ static int vidioc_try_fmt_overlay(struct file *file, void *priv,
return verify_preview(dev, &f->fmt.win);
}
-static int vidioc_s_fmt_cap(struct file *file, void *priv,
+static int saa7134_s_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
struct saa7134_fh *fh = priv;
int err;
- err = vidioc_try_fmt_cap(file, priv, f);
+ err = saa7134_try_fmt_cap(file, priv, f);
if (0 != err)
return err;
@@ -1646,7 +1640,7 @@ static int vidioc_s_fmt_cap(struct file *file, void *priv,
return 0;
}
-static int vidioc_s_fmt_overlay(struct file *file, void *priv,
+static int saa7134_s_fmt_overlay(struct file *file, void *priv,
struct v4l2_format *f)
{
struct saa7134_fh *fh = priv;
@@ -1687,8 +1681,7 @@ static int vidioc_s_fmt_overlay(struct file *file, void *priv,
return 0;
}
-static int vidioc_queryctrl(struct file *file, void *priv,
- struct v4l2_queryctrl *c)
+int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c)
{
const struct v4l2_queryctrl *ctrl;
@@ -1701,8 +1694,9 @@ static int vidioc_queryctrl(struct file *file, void *priv,
*c = (NULL != ctrl) ? *ctrl : no_ctrl;
return 0;
}
+EXPORT_SYMBOL_GPL(saa7134_queryctrl);
-static int vidioc_enum_input(struct file *file, void *priv,
+static int saa7134_enum_input(struct file *file, void *priv,
struct v4l2_input *i)
{
struct saa7134_fh *fh = priv;
@@ -1736,7 +1730,7 @@ static int vidioc_enum_input(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
+static int saa7134_g_input(struct file *file, void *priv, unsigned int *i)
{
struct saa7134_fh *fh = priv;
struct saa7134_dev *dev = fh->dev;
@@ -1745,7 +1739,7 @@ static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
return 0;
}
-static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
+static int saa7134_s_input(struct file *file, void *priv, unsigned int i)
{
struct saa7134_fh *fh = priv;
struct saa7134_dev *dev = fh->dev;
@@ -1765,7 +1759,7 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
return 0;
}
-static int vidioc_querycap(struct file *file, void *priv,
+static int saa7134_querycap(struct file *file, void *priv,
struct v4l2_capability *cap)
{
struct saa7134_fh *fh = priv;
@@ -1792,7 +1786,7 @@ static int vidioc_querycap(struct file *file, void *priv,
return 0;
}
-static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id)
+static int saa7134_s_std(struct file *file, void *priv, v4l2_std_id *id)
{
struct saa7134_fh *fh = priv;
struct saa7134_dev *dev = fh->dev;
@@ -1854,7 +1848,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * id)
return 0;
}
-static int vidioc_cropcap(struct file *file, void *priv,
+static int saa7134_cropcap(struct file *file, void *priv,
struct v4l2_cropcap *cap)
{
struct saa7134_fh *fh = priv;
@@ -1878,7 +1872,7 @@ static int vidioc_cropcap(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
+static int saa7134_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
{
struct saa7134_fh *fh = f;
struct saa7134_dev *dev = fh->dev;
@@ -1890,7 +1884,7 @@ static int vidioc_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
return 0;
}
-static int vidioc_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
+static int saa7134_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
{
struct saa7134_fh *fh = f;
struct saa7134_dev *dev = fh->dev;
@@ -1927,7 +1921,7 @@ static int vidioc_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
return 0;
}
-static int vidioc_g_tuner(struct file *file, void *priv,
+static int saa7134_g_tuner(struct file *file, void *priv,
struct v4l2_tuner *t)
{
struct saa7134_fh *fh = priv;
@@ -1956,7 +1950,7 @@ static int vidioc_g_tuner(struct file *file, void *priv,
return 0;
}
-static int vidioc_s_tuner(struct file *file, void *priv,
+static int saa7134_s_tuner(struct file *file, void *priv,
struct v4l2_tuner *t)
{
struct saa7134_fh *fh = priv;
@@ -1978,7 +1972,7 @@ static int vidioc_s_tuner(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_frequency(struct file *file, void *priv,
+static int saa7134_g_frequency(struct file *file, void *priv,
struct v4l2_frequency *f)
{
struct saa7134_fh *fh = priv;
@@ -1990,7 +1984,7 @@ static int vidioc_g_frequency(struct file *file, void *priv,
return 0;
}
-static int vidioc_s_frequency(struct file *file, void *priv,
+static int saa7134_s_frequency(struct file *file, void *priv,
struct v4l2_frequency *f)
{
struct saa7134_fh *fh = priv;
@@ -2017,18 +2011,18 @@ static int vidioc_s_frequency(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
+static int saa7134_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
{
strcpy(a->name, "audio");
return 0;
}
-static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
+static int saa7134_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
{
return 0;
}
-static int vidioc_g_priority(struct file *file, void *f, enum v4l2_priority *p)
+static int saa7134_g_priority(struct file *file, void *f, enum v4l2_priority *p)
{
struct saa7134_fh *fh = f;
struct saa7134_dev *dev = fh->dev;
@@ -2037,7 +2031,7 @@ static int vidioc_g_priority(struct file *file, void *f, enum v4l2_priority *p)
return 0;
}
-static int vidioc_s_priority(struct file *file, void *f,
+static int saa7134_s_priority(struct file *file, void *f,
enum v4l2_priority prio)
{
struct saa7134_fh *fh = f;
@@ -2046,7 +2040,7 @@ static int vidioc_s_priority(struct file *file, void *f,
return v4l2_prio_change(&dev->prio, &fh->prio, prio);
}
-static int vidioc_enum_fmt_cap(struct file *file, void *priv,
+static int saa7134_enum_fmt_cap(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
if (f->index >= FORMATS)
@@ -2060,7 +2054,7 @@ static int vidioc_enum_fmt_cap(struct file *file, void *priv,
return 0;
}
-static int vidioc_enum_fmt_overlay(struct file *file, void *priv,
+static int saa7134_enum_fmt_overlay(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
if (saa7134_no_overlay > 0) {
@@ -2079,7 +2073,7 @@ static int vidioc_enum_fmt_overlay(struct file *file, void *priv,
return 0;
}
-static int vidioc_enum_fmt_vbi(struct file *file, void *priv,
+static int saa7134_enum_fmt_vbi(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
if (0 != f->index)
@@ -2091,7 +2085,7 @@ static int vidioc_enum_fmt_vbi(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_fbuf(struct file *file, void *f,
+static int saa7134_g_fbuf(struct file *file, void *f,
struct v4l2_framebuffer *fb)
{
struct saa7134_fh *fh = f;
@@ -2103,7 +2097,7 @@ static int vidioc_g_fbuf(struct file *file, void *f,
return 0;
}
-static int vidioc_s_fbuf(struct file *file, void *f,
+static int saa7134_s_fbuf(struct file *file, void *f,
struct v4l2_framebuffer *fb)
{
struct saa7134_fh *fh = f;
@@ -2128,7 +2122,7 @@ static int vidioc_s_fbuf(struct file *file, void *f,
return 0;
}
-static int vidioc_overlay(struct file *file, void *f, unsigned int on)
+static int saa7134_overlay(struct file *file, void *f, unsigned int on)
{
struct saa7134_fh *fh = f;
struct saa7134_dev *dev = fh->dev;
@@ -2165,34 +2159,34 @@ static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
}
#endif
-static int vidioc_reqbufs(struct file *file, void *priv,
+static int saa7134_reqbufs(struct file *file, void *priv,
struct v4l2_requestbuffers *p)
{
struct saa7134_fh *fh = priv;
return videobuf_reqbufs(saa7134_queue(fh), p);
}
-static int vidioc_querybuf(struct file *file, void *priv,
+static int saa7134_querybuf(struct file *file, void *priv,
struct v4l2_buffer *b)
{
struct saa7134_fh *fh = priv;
return videobuf_querybuf(saa7134_queue(fh), b);
}
-static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
+static int saa7134_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
{
struct saa7134_fh *fh = priv;
return videobuf_qbuf(saa7134_queue(fh), b);
}
-static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
+static int saa7134_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
{
struct saa7134_fh *fh = priv;
return videobuf_dqbuf(saa7134_queue(fh), b,
file->f_flags & O_NONBLOCK);
}
-static int vidioc_streamon(struct file *file, void *priv,
+static int saa7134_streamon(struct file *file, void *priv,
enum v4l2_buf_type type)
{
struct saa7134_fh *fh = priv;
@@ -2205,7 +2199,7 @@ static int vidioc_streamon(struct file *file, void *priv,
return videobuf_streamon(saa7134_queue(fh));
}
-static int vidioc_streamoff(struct file *file, void *priv,
+static int saa7134_streamoff(struct file *file, void *priv,
enum v4l2_buf_type type)
{
int err;
@@ -2220,7 +2214,7 @@ static int vidioc_streamoff(struct file *file, void *priv,
return 0;
}
-static int vidioc_g_parm(struct file *file, void *fh,
+static int saa7134_g_parm(struct file *file, void *fh,
struct v4l2_streamparm *parm)
{
return 0;
@@ -2369,68 +2363,60 @@ struct video_device saa7134_video_template =
VID_TYPE_CLIPPING|VID_TYPE_SCALES,
.fops = &video_fops,
.minor = -1,
- .vidioc_querycap = vidioc_querycap,
- .vidioc_enum_fmt_cap = vidioc_enum_fmt_cap,
- .vidioc_g_fmt_cap = vidioc_g_fmt_cap,
- .vidioc_try_fmt_cap = vidioc_try_fmt_cap,
- .vidioc_s_fmt_cap = vidioc_s_fmt_cap,
- .vidioc_enum_fmt_overlay = vidioc_enum_fmt_overlay,
- .vidioc_g_fmt_overlay = vidioc_g_fmt_overlay,
- .vidioc_try_fmt_overlay = vidioc_try_fmt_overlay,
- .vidioc_s_fmt_overlay = vidioc_s_fmt_overlay,
- .vidioc_enum_fmt_vbi = vidioc_enum_fmt_vbi,
- .vidioc_g_fmt_vbi = vidioc_try_get_set_fmt_vbi,
- .vidioc_try_fmt_vbi = vidioc_try_get_set_fmt_vbi,
- .vidioc_s_fmt_vbi = vidioc_try_get_set_fmt_vbi,
- .vidioc_g_audio = vidioc_g_audio,
- .vidioc_s_audio = vidioc_s_audio,
- .vidioc_cropcap = vidioc_cropcap,
- .vidioc_reqbufs = vidioc_reqbufs,
- .vidioc_querybuf = vidioc_querybuf,
- .vidioc_qbuf = vidioc_qbuf,
- .vidioc_dqbuf = vidioc_dqbuf,
- .vidioc_s_std = vidioc_s_std,
- .vidioc_enum_input = vidioc_enum_input,
- .vidioc_g_input = vidioc_g_input,
- .vidioc_s_input = vidioc_s_input,
- .vidioc_queryctrl = vidioc_queryctrl,
- .vidioc_g_ctrl = vidioc_g_ctrl,
- .vidioc_s_ctrl = vidioc_s_ctrl,
- .vidioc_streamon = vidioc_streamon,
- .vidioc_streamoff = vidioc_streamoff,
- .vidioc_g_tuner = vidioc_g_tuner,
- .vidioc_s_tuner = vidioc_s_tuner,
+ .vidioc_querycap = saa7134_querycap,
+ .vidioc_enum_fmt_cap = saa7134_enum_fmt_cap,
+ .vidioc_g_fmt_cap = saa7134_g_fmt_cap,
+ .vidioc_try_fmt_cap = saa7134_try_fmt_cap,
+ .vidioc_s_fmt_cap = saa7134_s_fmt_cap,
+ .vidioc_enum_fmt_overlay = saa7134_enum_fmt_overlay,
+ .vidioc_g_fmt_overlay = saa7134_g_fmt_overlay,
+ .vidioc_try_fmt_overlay = saa7134_try_fmt_overlay,
+ .vidioc_s_fmt_overlay = saa7134_s_fmt_overlay,
+ .vidioc_enum_fmt_vbi = saa7134_enum_fmt_vbi,
+ .vidioc_g_fmt_vbi = saa7134_try_get_set_fmt_vbi,
+ .vidioc_try_fmt_vbi = saa7134_try_get_set_fmt_vbi,
+ .vidioc_s_fmt_vbi = saa7134_try_get_set_fmt_vbi,
+ .vidioc_g_audio = saa7134_g_audio,
+ .vidioc_s_audio = saa7134_s_audio,
+ .vidioc_cropcap = saa7134_cropcap,
+ .vidioc_reqbufs = saa7134_reqbufs,
+ .vidioc_querybuf = saa7134_querybuf,
+ .vidioc_qbuf = saa7134_qbuf,
+ .vidioc_dqbuf = saa7134_dqbuf,
+ .vidioc_s_std = saa7134_s_std,
+ .vidioc_enum_input = saa7134_enum_input,
+ .vidioc_g_input = saa7134_g_input,
+ .vidioc_s_input = saa7134_s_input,
+ .vidioc_queryctrl = saa7134_queryctrl,
+ .vidioc_g_ctrl = saa7134_g_ctrl,
+ .vidioc_s_ctrl = saa7134_s_ctrl,
+ .vidioc_streamon = saa7134_streamon,
+ .vidioc_streamoff = saa7134_streamoff,
+ .vidioc_g_tuner = saa7134_g_tuner,
+ .vidioc_s_tuner = saa7134_s_tuner,
#ifdef CONFIG_VIDEO_V4L1_COMPAT
.vidiocgmbuf = vidiocgmbuf,
#endif
- .vidioc_g_crop = vidioc_g_crop,
- .vidioc_s_crop = vidioc_s_crop,
- .vidioc_g_fbuf = vidioc_g_fbuf,
- .vidioc_s_fbuf = vidioc_s_fbuf,
- .vidioc_overlay = vidioc_overlay,
- .vidioc_g_priority = vidioc_g_priority,
- .vidioc_s_priority = vidioc_s_priority,
- .vidioc_g_parm = vidioc_g_parm,
- .vidioc_g_frequency = vidioc_g_frequency,
- .vidioc_s_frequency = vidioc_s_frequency,
+ .vidioc_g_crop = saa7134_g_crop,
+ .vidioc_s_crop = saa7134_s_crop,
+ .vidioc_g_fbuf = saa7134_g_fbuf,
+ .vidioc_s_fbuf = saa7134_s_fbuf,
+ .vidioc_overlay = saa7134_overlay,
+ .vidioc_g_priority = saa7134_g_priority,
+ .vidioc_s_priority = saa7134_s_priority,
+ .vidioc_g_parm = saa7134_g_parm,
+ .vidioc_g_frequency = saa7134_g_frequency,
+ .vidioc_s_frequency = saa7134_s_frequency,
.tvnorms = SAA7134_NORMS,
.current_norm = V4L2_STD_PAL,
};
-struct video_device saa7134_vbi_template =
-{
- .name = "saa7134-vbi",
- .type = VID_TYPE_TUNER|VID_TYPE_TELETEXT,
- .fops = &video_fops,
- .minor = -1,
-};
-
struct video_device saa7134_radio_template =
{
- .name = "saa7134-radio",
- .type = VID_TYPE_TUNER,
- .fops = &radio_fops,
- .minor = -1,
+ .name = "saa7134-radio",
+ .type = VID_TYPE_TUNER,
+ .fops = &radio_fops,
+ .minor = -1,
.vidioc_querycap = radio_querycap,
.vidioc_g_tuner = radio_g_tuner,
.vidioc_enum_input = radio_enum_input,
@@ -2441,10 +2427,10 @@ struct video_device saa7134_radio_template =
.vidioc_s_std = radio_s_std,
.vidioc_queryctrl = radio_queryctrl,
.vidioc_g_input = radio_g_input,
- .vidioc_g_ctrl = vidioc_g_ctrl,
- .vidioc_s_ctrl = vidioc_s_ctrl,
- .vidioc_g_frequency = vidioc_g_frequency,
- .vidioc_s_frequency = vidioc_s_frequency,
+ .vidioc_g_ctrl = saa7134_g_ctrl,
+ .vidioc_s_ctrl = saa7134_s_ctrl,
+ .vidioc_g_frequency = saa7134_g_frequency,
+ .vidioc_s_frequency = saa7134_s_frequency,
};
int saa7134_video_init1(struct saa7134_dev *dev)
diff --git a/linux/drivers/media/video/saa7134/saa7134.h b/linux/drivers/media/video/saa7134/saa7134.h
index 336fe002e..a0a59ce12 100644
--- a/linux/drivers/media/video/saa7134/saa7134.h
+++ b/linux/drivers/media/video/saa7134/saa7134.h
@@ -587,6 +587,12 @@ struct saa7134_dev {
#define saa_wait(us) { udelay(us); }
+#define SAA7134_NORMS (\
+ V4L2_STD_PAL | V4L2_STD_PAL_N | \
+ V4L2_STD_PAL_Nc | V4L2_STD_SECAM | \
+ V4L2_STD_NTSC | V4L2_STD_PAL_M | \
+ V4L2_STD_PAL_60)
+
/* ----------------------------------------------------------- */
/* saa7134-core.c */
@@ -650,12 +656,13 @@ extern unsigned int video_debug;
extern struct video_device saa7134_video_template;
extern struct video_device saa7134_radio_template;
+int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c);
+int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c);
+int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c);
+
int saa7134_videoport_init(struct saa7134_dev *dev);
void saa7134_set_tvnorm_hw(struct saa7134_dev *dev);
-int saa7134_common_ioctl(struct saa7134_dev *dev,
- unsigned int cmd, void *arg);
-
int saa7134_video_init1(struct saa7134_dev *dev);
int saa7134_video_init2(struct saa7134_dev *dev);
void saa7134_irq_video_signalchange(struct saa7134_dev *dev);
diff --git a/linux/drivers/media/video/tda8290.c b/linux/drivers/media/video/tda8290.c
index b6fdc01eb..de663918a 100644
--- a/linux/drivers/media/video/tda8290.c
+++ b/linux/drivers/media/video/tda8290.c
@@ -24,6 +24,8 @@
#include <linux/delay.h>
#include "compat.h"
#include <linux/videodev.h>
+#include "tuner-driver.h"
+#include "tuner-i2c.h"
#include "tda8290.h"
#include "tda827x.h"
#include "tda18271.h"
@@ -31,13 +33,8 @@
#include "i2c-compat.h"
#endif
-#if 0
-static int debug = 0;
+static int debug;
module_param(debug, int, 0644);
-#else
-static int tuner_debug;
-module_param_named(debug, tuner_debug, int, 0644);
-#endif
MODULE_PARM_DESC(debug, "enable verbose debug messages");
#define PREFIX "tda8290"
@@ -59,8 +56,6 @@ struct tda8290_priv {
#define TDA18271 16
struct tda827x_config cfg;
-
- struct tuner *t;
};
/*---------------------------------------------------------------------*/
@@ -141,31 +136,31 @@ static int tda8295_i2c_bridge(struct dvb_frontend *fe, int close)
/*---------------------------------------------------------------------*/
-static void set_audio(struct dvb_frontend *fe)
+static void set_audio(struct dvb_frontend *fe,
+ struct analog_parameters *params)
{
struct tda8290_priv *priv = fe->analog_demod_priv;
- struct tuner *t = priv->t;
char* mode;
- if (t->std & V4L2_STD_MN) {
+ if (params->std & V4L2_STD_MN) {
priv->tda8290_easy_mode = 0x01;
mode = "MN";
- } else if (t->std & V4L2_STD_B) {
+ } else if (params->std & V4L2_STD_B) {
priv->tda8290_easy_mode = 0x02;
mode = "B";
- } else if (t->std & V4L2_STD_GH) {
+ } else if (params->std & V4L2_STD_GH) {
priv->tda8290_easy_mode = 0x04;
mode = "GH";
- } else if (t->std & V4L2_STD_PAL_I) {
+ } else if (params->std & V4L2_STD_PAL_I) {
priv->tda8290_easy_mode = 0x08;
mode = "I";
- } else if (t->std & V4L2_STD_DK) {
+ } else if (params->std & V4L2_STD_DK) {
priv->tda8290_easy_mode = 0x10;
mode = "DK";
- } else if (t->std & V4L2_STD_SECAM_L) {
+ } else if (params->std & V4L2_STD_SECAM_L) {
priv->tda8290_easy_mode = 0x20;
mode = "L";
- } else if (t->std & V4L2_STD_SECAM_LC) {
+ } else if (params->std & V4L2_STD_SECAM_LC) {
priv->tda8290_easy_mode = 0x40;
mode = "LC";
} else {
@@ -176,10 +171,10 @@ static void set_audio(struct dvb_frontend *fe)
tuner_dbg("setting tda829x to system %s\n", mode);
}
-static void tda8290_set_freq(struct dvb_frontend *fe, unsigned int freq)
+static void tda8290_set_params(struct dvb_frontend *fe,
+ struct analog_parameters *params)
{
struct tda8290_priv *priv = fe->analog_demod_priv;
- struct tuner *t = priv->t;
unsigned char soft_reset[] = { 0x00, 0x00 };
unsigned char easy_mode[] = { 0x01, priv->tda8290_easy_mode };
@@ -203,16 +198,10 @@ static void tda8290_set_freq(struct dvb_frontend *fe, unsigned int freq)
pll_stat;
int i;
- struct analog_parameters params = {
- .frequency = freq,
- .mode = t->mode,
- .audmode = t->audmode,
- .std = t->std
- };
-
- set_audio(fe);
+ set_audio(fe, params);
- tuner_dbg("tda827xa config is 0x%02x\n", t->config);
+ if (priv->cfg.config)
+ tuner_dbg("tda827xa config is 0x%02x\n", *priv->cfg.config);
tuner_i2c_xfer_send(&priv->i2c_props, easy_mode, 2);
tuner_i2c_xfer_send(&priv->i2c_props, agc_out_on, 2);
tuner_i2c_xfer_send(&priv->i2c_props, soft_reset, 2);
@@ -231,7 +220,7 @@ static void tda8290_set_freq(struct dvb_frontend *fe, unsigned int freq)
tda8290_i2c_bridge(fe, 1);
if (fe->ops.tuner_ops.set_analog_params)
- fe->ops.tuner_ops.set_analog_params(fe, &params);
+ fe->ops.tuner_ops.set_analog_params(fe, params);
for (i = 0; i < 3; i++) {
tuner_i2c_xfer_send(&priv->i2c_props, &addr_pll_stat, 1);
@@ -394,23 +383,16 @@ static int tda8295_has_signal(struct dvb_frontend *fe)
/*---------------------------------------------------------------------*/
-static void tda8295_set_freq(struct dvb_frontend *fe, unsigned int freq)
+static void tda8295_set_params(struct dvb_frontend *fe,
+ struct analog_parameters *params)
{
struct tda8290_priv *priv = fe->analog_demod_priv;
- struct tuner *t = priv->t;
unsigned char blanking_mode[] = { 0x1d, 0x00 };
- struct analog_parameters params = {
- .frequency = freq,
- .mode = t->mode,
- .audmode = t->audmode,
- .std = t->std
- };
-
- set_audio(fe);
+ set_audio(fe, params);
- tuner_dbg("%s: freq = %d\n", __FUNCTION__, freq);
+ tuner_dbg("%s: freq = %d\n", __FUNCTION__, params->frequency);
tda8295_power(fe, 1);
tda8295_agc1_out(fe, 1);
@@ -427,7 +409,7 @@ static void tda8295_set_freq(struct dvb_frontend *fe, unsigned int freq)
tda8295_i2c_bridge(fe, 1);
if (fe->ops.tuner_ops.set_analog_params)
- fe->ops.tuner_ops.set_analog_params(fe, &params);
+ fe->ops.tuner_ops.set_analog_params(fe, params);
if (priv->cfg.agcf)
priv->cfg.agcf(fe);
@@ -484,13 +466,13 @@ static void tda8295_standby(struct dvb_frontend *fe)
static void tda8290_init_if(struct dvb_frontend *fe)
{
struct tda8290_priv *priv = fe->analog_demod_priv;
- struct tuner *t = priv->t;
unsigned char set_VS[] = { 0x30, 0x6F };
unsigned char set_GP00_CF[] = { 0x20, 0x01 };
unsigned char set_GP01_CF[] = { 0x20, 0x0B };
- if ((t->config == 1) || (t->config == 2))
+ if ((priv->cfg.config) &&
+ ((*priv->cfg.config == 1) || (*priv->cfg.config == 2)))
tuner_i2c_xfer_send(&priv->i2c_props, set_GP00_CF, 2);
else
tuner_i2c_xfer_send(&priv->i2c_props, set_GP01_CF, 2);
@@ -558,7 +540,6 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
{
struct tda8290_priv *priv = fe->analog_demod_priv;
struct analog_tuner_ops *ops = fe->ops.analog_demod_ops;
- struct tuner *t = priv->t;
int i, ret, tuners_found;
u32 tuner_addrs;
u8 data;
@@ -618,7 +599,7 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
if (data == 0x83) {
priv->ver |= TDA18271;
- tda18271_attach(&t->fe, priv->tda827x_addr,
+ tda18271_attach(fe, priv->tda827x_addr,
priv->i2c_props.adap);
} else {
if ((data & 0x3c) == 0)
@@ -626,40 +607,17 @@ static int tda829x_find_tuner(struct dvb_frontend *fe)
else
priv->ver |= TDA8275A;
- tda827x_attach(&t->fe, priv->tda827x_addr,
+ tda827x_attach(fe, priv->tda827x_addr,
priv->i2c_props.adap, &priv->cfg);
}
- if (t->fe.ops.tuner_ops.init)
- t->fe.ops.tuner_ops.init(&t->fe);
+ if (fe->ops.tuner_ops.init)
+ fe->ops.tuner_ops.init(fe);
- if (t->fe.ops.tuner_ops.sleep)
- t->fe.ops.tuner_ops.sleep(&t->fe);
+ if (fe->ops.tuner_ops.sleep)
+ fe->ops.tuner_ops.sleep(fe);
ops->i2c_gate_ctrl(fe, 0);
- switch (priv->ver) {
- case TDA8290 | TDA8275:
- strlcpy(t->i2c->name, "tda8290+75", sizeof(t->i2c->name));
- break;
- case TDA8295 | TDA8275:
- strlcpy(t->i2c->name, "tda8295+75", sizeof(t->i2c->name));
- break;
- case TDA8290 | TDA8275A:
- strlcpy(t->i2c->name, "tda8290+75a", sizeof(t->i2c->name));
- break;
- case TDA8295 | TDA8275A:
- strlcpy(t->i2c->name, "tda8295+75a", sizeof(t->i2c->name));
- break;
- case TDA8290 | TDA18271:
- strlcpy(t->i2c->name, "tda8290+18271", sizeof(t->i2c->name));
- break;
- case TDA8295 | TDA18271:
- strlcpy(t->i2c->name, "tda8295+18271", sizeof(t->i2c->name));
- break;
- default:
- return -EINVAL;
- }
-
return 0;
}
@@ -673,7 +631,7 @@ static int tda8290_probe(struct tuner_i2c_props *i2c_props)
tuner_i2c_xfer_recv(i2c_props, &tda8290_id[1], 1);
if (tda8290_id[1] == TDA8290_ID) {
- if (tuner_debug)
+ if (debug)
printk(KERN_DEBUG "%s: tda8290 detected @ %d-%04x\n",
__FUNCTION__, i2c_adapter_id(i2c_props->adap),
i2c_props->addr);
@@ -693,7 +651,7 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props)
tuner_i2c_xfer_recv(i2c_props, &tda8295_id[1], 1);
if (tda8295_id[1] == TDA8295_ID) {
- if (tuner_debug)
+ if (debug)
printk(KERN_DEBUG "%s: tda8295 detected @ %d-%04x\n",
__FUNCTION__, i2c_adapter_id(i2c_props->adap),
i2c_props->addr);
@@ -704,8 +662,10 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props)
}
static struct analog_tuner_ops tda8290_tuner_ops = {
- .set_tv_freq = tda8290_set_freq,
- .set_radio_freq = tda8290_set_freq,
+ .info = {
+ .name = "TDA8290",
+ },
+ .set_params = tda8290_set_params,
.has_signal = tda8290_has_signal,
.standby = tda8290_standby,
.release = tda829x_release,
@@ -713,29 +673,34 @@ static struct analog_tuner_ops tda8290_tuner_ops = {
};
static struct analog_tuner_ops tda8295_tuner_ops = {
- .set_tv_freq = tda8295_set_freq,
- .set_radio_freq = tda8295_set_freq,
+ .info = {
+ .name = "TDA8295",
+ },
+ .set_params = tda8295_set_params,
.has_signal = tda8295_has_signal,
.standby = tda8295_standby,
.release = tda829x_release,
.i2c_gate_ctrl = tda8295_i2c_bridge,
};
-int tda829x_attach(struct tuner *t)
+struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
+ struct i2c_adapter *i2c_adap, u8 i2c_addr,
+ struct tda829x_config *cfg)
{
- struct dvb_frontend *fe = &t->fe;
struct tda8290_priv *priv = NULL;
+ char *name;
priv = kzalloc(sizeof(struct tda8290_priv), GFP_KERNEL);
if (priv == NULL)
- return -ENOMEM;
+ return NULL;
fe->analog_demod_priv = priv;
- priv->i2c_props.addr = t->i2c->addr;
- priv->i2c_props.adap = t->i2c->adapter;
- priv->cfg.config = &t->config;
- priv->cfg.tuner_callback = t->tuner_callback;
- priv->t = t;
+ priv->i2c_props.addr = i2c_addr;
+ priv->i2c_props.adap = i2c_adap;
+ if (cfg) {
+ priv->cfg.config = cfg->lna_cfg;
+ priv->cfg.tuner_callback = cfg->tuner_callback;
+ }
if (tda8290_probe(&priv->i2c_props) == 0) {
priv->ver = TDA8290;
@@ -748,7 +713,31 @@ int tda829x_attach(struct tuner *t)
}
if (tda829x_find_tuner(fe) < 0)
- return -EINVAL;
+ goto fail;
+
+ switch (priv->ver) {
+ case TDA8290 | TDA8275:
+ name = "tda8290+75";
+ break;
+ case TDA8295 | TDA8275:
+ name = "tda8295+75";
+ break;
+ case TDA8290 | TDA8275A:
+ name = "tda8290+75a";
+ break;
+ case TDA8295 | TDA8275A:
+ name = "tda8295+75a";
+ break;
+ case TDA8290 | TDA18271:
+ name = "tda8290+18271";
+ break;
+ case TDA8295 | TDA18271:
+ name = "tda8295+18271";
+ break;
+ default:
+ goto fail;
+ }
+ tuner_info("type set to %s\n", name);
if (priv->ver & TDA8290) {
tda8290_init_tuner(fe);
@@ -756,19 +745,23 @@ int tda829x_attach(struct tuner *t)
} else if (priv->ver & TDA8295)
tda8295_init_if(fe);
- tuner_info("type set to %s\n", t->i2c->name);
-
+#if 0
t->mode = V4L2_TUNER_ANALOG_TV;
+#endif
+ return fe;
- return 0;
+fail:
+ tda829x_release(fe);
+ fe->ops.analog_demod_ops = NULL;
+ return NULL;
}
EXPORT_SYMBOL_GPL(tda829x_attach);
-int tda829x_probe(struct tuner *t)
+int tda829x_probe(struct i2c_adapter *i2c_adap, u8 i2c_addr)
{
struct tuner_i2c_props i2c_props = {
- .adap = t->i2c->adapter,
- .addr = t->i2c->addr
+ .adap = i2c_adap,
+ .addr = i2c_addr,
};
unsigned char soft_reset[] = { 0x00, 0x00 };
diff --git a/linux/drivers/media/video/tda8290.h b/linux/drivers/media/video/tda8290.h
index 3a1f04520..7bce03183 100644
--- a/linux/drivers/media/video/tda8290.h
+++ b/linux/drivers/media/video/tda8290.h
@@ -18,24 +18,35 @@
#define __TDA8290_H__
#include <linux/i2c.h>
-#include "tuner-driver.h"
+#include "dvb_frontend.h"
+
+struct tda829x_config {
+ unsigned int *lna_cfg;
+ int (*tuner_callback) (void *dev, int command, int arg);
+};
#if defined(CONFIG_TUNER_TDA8290) || (defined(CONFIG_TUNER_TDA8290_MODULE) && defined(MODULE))
-extern int tda829x_probe(struct tuner *t);
+extern int tda829x_probe(struct i2c_adapter *i2c_adap, u8 i2c_addr);
-extern int tda829x_attach(struct tuner *t);
+extern struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
+ struct i2c_adapter *i2c_adap,
+ u8 i2c_addr,
+ struct tda829x_config *cfg);
#else
-static inline int tda829x_probe(struct tuner *t)
+static inline int tda829x_probe(struct i2c_adapter *i2c_adap, u8 i2c_addr)
{
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
return -EINVAL;
}
-static inline int tda829x_attach(struct tuner *t)
+static inline struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
+ struct i2c_adapter *i2c_adap,
+ u8 i2c_addr,
+ struct tda829x_config *cfg)
{
printk(KERN_INFO "%s: not probed - driver disabled by Kconfig\n",
__FUNCTION__);
- return -EINVAL;
+ return NULL;
}
#endif
diff --git a/linux/drivers/media/video/tda9887.c b/linux/drivers/media/video/tda9887.c
index cefba2a14..bd4173e41 100644
--- a/linux/drivers/media/video/tda9887.c
+++ b/linux/drivers/media/video/tda9887.c
@@ -13,6 +13,7 @@
#endif
#include <media/v4l2-common.h>
#include <media/tuner.h>
+#include "tuner-i2c.h"
#include "tda9887.h"
@@ -633,7 +634,8 @@ static void tda9887_standby(struct dvb_frontend *fe)
tda9887_configure(fe);
}
-static void tda9887_set_freq(struct dvb_frontend *fe, unsigned int freq)
+static void tda9887_set_params(struct dvb_frontend *fe,
+ struct analog_parameters *params)
{
tda9887_configure(fe);
}
@@ -645,8 +647,10 @@ static void tda9887_release(struct dvb_frontend *fe)
}
static struct analog_tuner_ops tda9887_tuner_ops = {
- .set_tv_freq = tda9887_set_freq,
- .set_radio_freq = tda9887_set_freq,
+ .info = {
+ .name = "TDA9887",
+ },
+ .set_params = tda9887_set_params,
.standby = tda9887_standby,
.tuner_status = tda9887_tuner_status,
.get_afc = tda9887_get_afc,
diff --git a/linux/drivers/media/video/tuner-core.c b/linux/drivers/media/video/tuner-core.c
index 0b3bc1c91..479afb1f6 100644
--- a/linux/drivers/media/video/tuner-core.c
+++ b/linux/drivers/media/video/tuner-core.c
@@ -63,7 +63,34 @@ static unsigned int no_autodetect = 0;
static unsigned int show_i2c = 0;
/* insmod options used at runtime => read/write */
-int tuner_debug = 0;
+static int tuner_debug;
+
+#define tuner_warn(fmt, arg...) do { \
+ printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
+ i2c_adapter_id(t->i2c->adapter), \
+ t->i2c->addr, ##arg); \
+ } while (0)
+
+#define tuner_info(fmt, arg...) do { \
+ printk(KERN_INFO "%s %d-%04x: " fmt, PREFIX, \
+ i2c_adapter_id(t->i2c->adapter), \
+ t->i2c->addr, ##arg); \
+ } while (0)
+
+#define tuner_err(fmt, arg...) do { \
+ printk(KERN_ERR "%s %d-%04x: " fmt, PREFIX, \
+ i2c_adapter_id(t->i2c->adapter), \
+ t->i2c->addr, ##arg); \
+ } while (0)
+
+#define tuner_dbg(fmt, arg...) do { \
+ if (tuner_debug) \
+ printk(KERN_DEBUG "%s %d-%04x: " fmt, PREFIX, \
+ i2c_adapter_id(t->i2c->adapter), \
+ t->i2c->addr, ##arg); \
+ } while (0)
+
+/* ------------------------------------------------------------------------ */
static unsigned int tv_range[2] = { 44, 958 };
static unsigned int radio_range[2] = { 65, 108 };
@@ -107,23 +134,17 @@ MODULE_LICENSE("GPL");
/* ---------------------------------------------------------------------- */
-static void fe_set_freq(struct dvb_frontend *fe, unsigned int freq)
+static void fe_set_params(struct dvb_frontend *fe,
+ struct analog_parameters *params)
{
struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
struct tuner *t = fe->analog_demod_priv;
- struct analog_parameters params = {
- .frequency = freq,
- .mode = t->mode,
- .audmode = t->audmode,
- .std = t->std
- };
-
if (NULL == fe_tuner_ops->set_analog_params) {
tuner_warn("Tuner frontend module has no way to set freq\n");
return;
}
- fe_tuner_ops->set_analog_params(fe, &params);
+ fe_tuner_ops->set_analog_params(fe, params);
}
static void fe_release(struct dvb_frontend *fe)
@@ -165,8 +186,7 @@ static int fe_has_signal(struct dvb_frontend *fe)
static void tuner_status(struct dvb_frontend *fe);
static struct analog_tuner_ops tuner_core_ops = {
- .set_tv_freq = fe_set_freq,
- .set_radio_freq = fe_set_freq,
+ .set_params = fe_set_params,
.standby = fe_standby,
.release = fe_release,
.has_signal = fe_has_signal,
@@ -179,11 +199,17 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq)
struct tuner *t = i2c_get_clientdata(c);
struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+ struct analog_parameters params = {
+ .mode = t->mode,
+ .audmode = t->audmode,
+ .std = t->std
+ };
+
if (t->type == UNSET) {
tuner_warn ("tuner type not set\n");
return;
}
- if ((NULL == ops) || (NULL == ops->set_tv_freq)) {
+ if ((NULL == ops) || (NULL == ops->set_params)) {
tuner_warn ("Tuner has no way to set tv freq\n");
return;
}
@@ -198,7 +224,9 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq)
else
freq = tv_range[1] * 16;
}
- ops->set_tv_freq(&t->fe, freq);
+ params.frequency = freq;
+
+ ops->set_params(&t->fe, &params);
}
static void set_radio_freq(struct i2c_client *c, unsigned int freq)
@@ -206,11 +234,17 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq)
struct tuner *t = i2c_get_clientdata(c);
struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
+ struct analog_parameters params = {
+ .mode = t->mode,
+ .audmode = t->audmode,
+ .std = t->std
+ };
+
if (t->type == UNSET) {
tuner_warn ("tuner type not set\n");
return;
}
- if ((NULL == ops) || (NULL == ops->set_radio_freq)) {
+ if ((NULL == ops) || (NULL == ops->set_params)) {
tuner_warn ("tuner has no way to set radio frequency\n");
return;
}
@@ -225,8 +259,9 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq)
else
freq = radio_range[1] * 16000;
}
+ params.frequency = freq;
- ops->set_radio_freq(&t->fe, freq);
+ ops->set_params(&t->fe, &params);
}
static void set_freq(struct i2c_client *c, unsigned long freq)
@@ -282,6 +317,15 @@ static void attach_simple_tuner(struct tuner *t)
simple_tuner_attach(&t->fe, t->i2c->adapter, t->i2c->addr, &cfg);
}
+static void attach_tda829x(struct tuner *t)
+{
+ struct tda829x_config cfg = {
+ .lna_cfg = &t->config,
+ .tuner_callback = t->tuner_callback,
+ };
+ tda829x_attach(&t->fe, t->i2c->adapter, t->i2c->addr, &cfg);
+}
+
static void set_type(struct i2c_client *c, unsigned int type,
unsigned int new_mode_mask, unsigned int new_config,
int (*tuner_callback) (void *dev, int command,int arg))
@@ -324,7 +368,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
break;
case TUNER_PHILIPS_TDA8290:
{
- tda829x_attach(t);
+ attach_tda829x(t);
break;
}
case TUNER_TEA5767:
@@ -388,14 +432,16 @@ static void set_type(struct i2c_client *c, unsigned int type,
ops = t->fe.ops.analog_demod_ops;
- if (((NULL == ops) ||
- ((NULL == ops->set_tv_freq) && (NULL == ops->set_radio_freq))) &&
+ if (((NULL == ops) || (NULL == ops->set_params)) &&
(fe_tuner_ops->set_analog_params)) {
strlcpy(t->i2c->name, fe_tuner_ops->info.name,
sizeof(t->i2c->name));
t->fe.ops.analog_demod_ops = &tuner_core_ops;
t->fe.analog_demod_priv = t;
+ } else {
+ strlcpy(t->i2c->name, ops->info.name,
+ sizeof(t->i2c->name));
}
tuner_dbg("type set to %s\n", t->i2c->name);
@@ -1082,7 +1128,8 @@ static int tuner_probe(struct i2c_client *client)
case 0x4b:
/* If chip is not tda8290, don't register.
since it can be tda9887*/
- if (tda829x_probe(t) == 0) {
+ if (tda829x_probe(t->i2c->adapter,
+ t->i2c->addr) == 0) {
tuner_dbg("tda829x detected\n");
} else {
/* Default is being tda9887 */
@@ -1135,11 +1182,11 @@ register_client:
/* Sets a default mode */
if (t->mode_mask & T_ANALOG_TV) {
- t->mode = T_ANALOG_TV;
+ t->mode = V4L2_TUNER_ANALOG_TV;
} else if (t->mode_mask & T_RADIO) {
- t->mode = T_RADIO;
+ t->mode = V4L2_TUNER_RADIO;
} else {
- t->mode = T_DIGITAL_TV;
+ t->mode = V4L2_TUNER_DIGITAL_TV;
}
set_type(client, t->type, t->mode_mask, t->config, t->tuner_callback);
list_add_tail(&t->list, &tuner_list);
diff --git a/linux/drivers/media/video/tuner-driver.h b/linux/drivers/media/video/tuner-driver.h
index a4db32d97..65ced4350 100644
--- a/linux/drivers/media/video/tuner-driver.h
+++ b/linux/drivers/media/video/tuner-driver.h
@@ -24,16 +24,20 @@
#include <linux/videodev2.h>
#include <linux/i2c.h>
-#include "tuner-i2c.h"
#include "dvb_frontend.h"
extern unsigned const int tuner_count;
-struct tuner;
+struct analog_demod_info {
+ char *name;
+};
struct analog_tuner_ops {
- void (*set_tv_freq)(struct dvb_frontend *fe, unsigned int freq);
- void (*set_radio_freq)(struct dvb_frontend *fe, unsigned int freq);
+
+ struct analog_demod_info info;
+
+ void (*set_params)(struct dvb_frontend *fe,
+ struct analog_parameters *params);
int (*has_signal)(struct dvb_frontend *fe);
int (*is_stereo)(struct dvb_frontend *fe);
int (*get_afc)(struct dvb_frontend *fe);
@@ -69,28 +73,4 @@ struct tuner {
int (*tuner_callback) (void *dev, int command,int arg);
};
-/* ------------------------------------------------------------------------ */
-
-#define tuner_warn(fmt, arg...) do { \
- printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
- i2c_adapter_id(t->i2c->adapter), t->i2c->addr, ##arg); \
- } while (0)
-
-#define tuner_info(fmt, arg...) do { \
- printk(KERN_INFO "%s %d-%04x: " fmt, PREFIX, \
- i2c_adapter_id(t->i2c->adapter), t->i2c->addr , ##arg); \
- } while (0)
-
-#define tuner_err(fmt, arg...) do { \
- printk(KERN_ERR "%s %d-%04x: " fmt, PREFIX, \
- i2c_adapter_id(t->i2c->adapter), t->i2c->addr , ##arg); \
- } while (0)
-
-#define tuner_dbg(fmt, arg...) do { \
- extern int tuner_debug; \
- if (tuner_debug) \
- printk(KERN_DEBUG "%s %d-%04x: " fmt, PREFIX, \
- i2c_adapter_id(t->i2c->adapter), t->i2c->addr , ##arg); \
- } while (0)
-
#endif /* __TUNER_DRIVER_H__ */
diff --git a/linux/drivers/media/video/tuner-i2c.h b/linux/drivers/media/video/tuner-i2c.h
index d7cf72c3f..de52e8ffd 100644
--- a/linux/drivers/media/video/tuner-i2c.h
+++ b/linux/drivers/media/video/tuner-i2c.h
@@ -59,7 +59,6 @@ static inline int tuner_i2c_xfer_send_recv(struct tuner_i2c_props *props,
return (ret == 2) ? ilen : ret;
}
-#ifndef __TUNER_DRIVER_H__
#define tuner_warn(fmt, arg...) do { \
printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
i2c_adapter_id(priv->i2c_props.adap), \
@@ -84,6 +83,5 @@ static inline int tuner_i2c_xfer_send_recv(struct tuner_i2c_props *props,
i2c_adapter_id(priv->i2c_props.adap), \
priv->i2c_props.addr , ##arg); \
} while (0)
-#endif /* __TUNER_DRIVER_H__ */
#endif /* __TUNER_I2C_H__ */
diff --git a/linux/drivers/media/video/upd64031a.c b/linux/drivers/media/video/upd64031a.c
index 6cbd124c7..98bebcab3 100644
--- a/linux/drivers/media/video/upd64031a.c
+++ b/linux/drivers/media/video/upd64031a.c
@@ -54,6 +54,7 @@ MODULE_PARM(debug, "i");
MODULE_PARM_DESC(debug, "Debug level (0-1)");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
static unsigned short normal_i2c[] = { 0x24 >> 1, 0x26 >> 1, I2C_CLIENT_END };
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
@@ -61,6 +62,7 @@ static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
#endif
I2C_CLIENT_INSMOD;
+#endif
enum {
R00 = 0, R01, R02, R03, R04,
diff --git a/linux/drivers/media/video/upd64083.c b/linux/drivers/media/video/upd64083.c
index 34e99cfbb..2d5cb6e62 100644
--- a/linux/drivers/media/video/upd64083.c
+++ b/linux/drivers/media/video/upd64083.c
@@ -44,6 +44,7 @@ MODULE_PARM(debug, "i");
MODULE_PARM_DESC(debug, "Debug level (0-1)");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
static unsigned short normal_i2c[] = { 0xb8 >> 1, 0xba >> 1, I2C_CLIENT_END };
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
@@ -51,6 +52,7 @@ static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
#endif
I2C_CLIENT_INSMOD;
+#endif
enum {
R00 = 0, R01, R02, R03, R04,
diff --git a/linux/drivers/media/video/usbvision/usbvision.h b/linux/drivers/media/video/usbvision/usbvision.h
index b3232d91c..3b3f1ca0e 100644
--- a/linux/drivers/media/video/usbvision/usbvision.h
+++ b/linux/drivers/media/video/usbvision/usbvision.h
@@ -44,10 +44,6 @@
#define USBVISION_DEBUG /* Turn on debug messages */
-#ifndef VID_HARDWARE_USBVISION
- #define VID_HARDWARE_USBVISION 34 /* USBVision Video Grabber */
-#endif
-
#define USBVISION_PWR_REG 0x00
#define USBVISION_SSPND_EN (1 << 1)
#define USBVISION_RES2 (1 << 2)
diff --git a/linux/drivers/media/video/videobuf-core.c b/linux/drivers/media/video/videobuf-core.c
index be33909f9..a85b22147 100644
--- a/linux/drivers/media/video/videobuf-core.c
+++ b/linux/drivers/media/video/videobuf-core.c
@@ -23,29 +23,32 @@
#include "compat.h"
#define MAGIC_BUFFER 0x20070728
-#define MAGIC_CHECK(is,should) if (unlikely((is) != (should))) \
- { printk(KERN_ERR "magic mismatch: %x (expected %x)\n",is,should); BUG(); }
+#define MAGIC_CHECK(is, should) do { \
+ if (unlikely((is) != (should))) { \
+ printk(KERN_ERR "magic mismatch: %x (expected %x)\n", is, should); \
+ BUG(); } } while (0)
-static int debug = 0;
+static int debug;
module_param(debug, int, 0644);
MODULE_DESCRIPTION("helper module to manage video4linux buffers");
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
MODULE_LICENSE("GPL");
-#define dprintk(level, fmt, arg...) if (debug >= level) \
- printk(KERN_DEBUG "vbuf: " fmt , ## arg)
+#define dprintk(level, fmt, arg...) do { \
+ if (debug >= level) \
+ printk(KERN_DEBUG "vbuf: " fmt , ## arg); } while (0)
/* --------------------------------------------------------------------- */
#define CALL(q, f, arg...) \
- ( (q->int_ops->f)? q->int_ops->f(arg) : 0)
+ ((q->int_ops->f) ? q->int_ops->f(arg) : 0)
-void* videobuf_alloc(struct videobuf_queue* q)
+void *videobuf_alloc(struct videobuf_queue *q)
{
struct videobuf_buffer *vb;
- BUG_ON (q->msize<sizeof(*vb));
+ BUG_ON(q->msize < sizeof(*vb));
if (!q->int_ops || !q->int_ops->alloc) {
printk(KERN_ERR "No specific ops defined!\n");
@@ -67,7 +70,7 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
int retval = 0;
DECLARE_WAITQUEUE(wait, current);
- MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
+ MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
add_wait_queue(&vb->done, &wait);
while (vb->state == VIDEOBUF_ACTIVE || vb->state == VIDEOBUF_QUEUED) {
if (non_blocking) {
@@ -76,11 +79,12 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
}
set_current_state(intr ? TASK_INTERRUPTIBLE
: TASK_UNINTERRUPTIBLE);
- if (vb->state == VIDEOBUF_ACTIVE || vb->state == VIDEOBUF_QUEUED)
+ if (vb->state == VIDEOBUF_ACTIVE ||
+ vb->state == VIDEOBUF_QUEUED)
schedule();
set_current_state(TASK_RUNNING);
if (intr && signal_pending(current)) {
- dprintk(1,"buffer waiton: -EINTR\n");
+ dprintk(1, "buffer waiton: -EINTR\n");
retval = -EINTR;
break;
}
@@ -89,27 +93,27 @@ int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
return retval;
}
-int videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb,
+int videobuf_iolock(struct videobuf_queue *q, struct videobuf_buffer *vb,
struct v4l2_framebuffer *fbuf)
{
- MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
- /* FIXME: This is required to avoid OOPS on some cases, since mmap_mapper()
- method should be called before _iolock.
+ /* FIXME: This is required to avoid OOPS on some cases,
+ since mmap_mapper() method should be called before _iolock.
On some cases, the mmap_mapper() is called only after scheduling.
However, this way is just too dirty! Better to wait for some event.
*/
schedule_timeout(HZ);
- return CALL(q,iolock,q,vb,fbuf);
+ return CALL(q, iolock, q, vb, fbuf);
}
/* --------------------------------------------------------------------- */
-void videobuf_queue_core_init(struct videobuf_queue* q,
+void videobuf_queue_core_init(struct videobuf_queue *q,
struct videobuf_queue_ops *ops,
void *dev,
spinlock_t *irqlock,
@@ -119,7 +123,7 @@ void videobuf_queue_core_init(struct videobuf_queue* q,
void *priv,
struct videobuf_qtype_ops *int_ops)
{
- memset(q,0,sizeof(*q));
+ memset(q, 0, sizeof(*q));
q->irqlock = irqlock;
q->dev = dev;
q->type = type;
@@ -130,13 +134,13 @@ void videobuf_queue_core_init(struct videobuf_queue* q,
q->int_ops = int_ops;
/* All buffer operations are mandatory */
- BUG_ON (!q->ops->buf_setup);
- BUG_ON (!q->ops->buf_prepare);
- BUG_ON (!q->ops->buf_queue);
- BUG_ON (!q->ops->buf_release);
+ BUG_ON(!q->ops->buf_setup);
+ BUG_ON(!q->ops->buf_prepare);
+ BUG_ON(!q->ops->buf_queue);
+ BUG_ON(!q->ops->buf_release);
/* Having implementations for abstract methods are mandatory */
- BUG_ON (!q->int_ops);
+ BUG_ON(!q->int_ops);
mutex_init(&q->lock);
INIT_LIST_HEAD(&q->stream);
@@ -147,33 +151,33 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
{
int i;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
if (q->streaming) {
- dprintk(1,"busy: streaming active\n");
+ dprintk(1, "busy: streaming active\n");
return 1;
}
if (q->reading) {
- dprintk(1,"busy: pending read #1\n");
+ dprintk(1, "busy: pending read #1\n");
return 1;
}
if (q->read_buf) {
- dprintk(1,"busy: pending read #2\n");
+ dprintk(1, "busy: pending read #2\n");
return 1;
}
for (i = 0; i < VIDEO_MAX_FRAME; i++) {
if (NULL == q->bufs[i])
continue;
if (q->bufs[i]->map) {
- dprintk(1,"busy: buffer #%d mapped\n",i);
+ dprintk(1, "busy: buffer #%d mapped\n", i);
return 1;
}
if (q->bufs[i]->state == VIDEOBUF_QUEUED) {
- dprintk(1,"busy: buffer #%d queued\n",i);
+ dprintk(1, "busy: buffer #%d queued\n", i);
return 1;
}
if (q->bufs[i]->state == VIDEOBUF_ACTIVE) {
- dprintk(1,"busy: buffer #%d avtive\n",i);
+ dprintk(1, "busy: buffer #%d avtive\n", i);
return 1;
}
}
@@ -183,12 +187,12 @@ int videobuf_queue_is_busy(struct videobuf_queue *q)
/* Locking: Caller holds q->lock */
void videobuf_queue_cancel(struct videobuf_queue *q)
{
- unsigned long flags=0;
+ unsigned long flags = 0;
int i;
/* remove queued buffers from list */
if (q->irqlock)
- spin_lock_irqsave(q->irqlock,flags);
+ spin_lock_irqsave(q->irqlock, flags);
for (i = 0; i < VIDEO_MAX_FRAME; i++) {
if (NULL == q->bufs[i])
continue;
@@ -198,13 +202,13 @@ void videobuf_queue_cancel(struct videobuf_queue *q)
}
}
if (q->irqlock)
- spin_unlock_irqrestore(q->irqlock,flags);
+ spin_unlock_irqrestore(q->irqlock, flags);
/* free all buffers + clear queue */
for (i = 0; i < VIDEO_MAX_FRAME; i++) {
if (NULL == q->bufs[i])
continue;
- q->ops->buf_release(q,q->bufs[i]);
+ q->ops->buf_release(q, q->bufs[i]);
}
INIT_LIST_HEAD(&q->stream);
}
@@ -234,8 +238,8 @@ enum v4l2_field videobuf_next_field(struct videobuf_queue *q)
static void videobuf_status(struct videobuf_queue *q, struct v4l2_buffer *b,
struct videobuf_buffer *vb, enum v4l2_buf_type type)
{
- MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(vb->magic, MAGIC_BUFFER);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
b->index = vb->i;
b->type = type;
@@ -295,16 +299,16 @@ static int __videobuf_mmap_free(struct videobuf_queue *q)
if (!q)
return 0;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
- rc = CALL(q,mmap_free,q);
- if (rc<0)
+ rc = CALL(q, mmap_free, q);
+ if (rc < 0)
return rc;
for (i = 0; i < VIDEO_MAX_FRAME; i++) {
if (NULL == q->bufs[i])
continue;
- q->ops->buf_release(q,q->bufs[i]);
+ q->ops->buf_release(q, q->bufs[i]);
kfree(q->bufs[i]);
q->bufs[i] = NULL;
}
@@ -329,7 +333,7 @@ static int __videobuf_mmap_setup(struct videobuf_queue *q,
unsigned int i;
int err;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
err = __videobuf_mmap_free(q);
if (0 != err)
@@ -360,7 +364,7 @@ static int __videobuf_mmap_setup(struct videobuf_queue *q,
if (!i)
return -ENOMEM;
- dprintk(1,"mmap setup: %d buffers, %d bytes each\n",
+ dprintk(1, "mmap setup: %d buffers, %d bytes each\n",
i, bsize);
return i;
@@ -380,35 +384,35 @@ int videobuf_mmap_setup(struct videobuf_queue *q,
int videobuf_reqbufs(struct videobuf_queue *q,
struct v4l2_requestbuffers *req)
{
- unsigned int size,count;
+ unsigned int size, count;
int retval;
if (req->count < 1) {
- dprintk(1,"reqbufs: count invalid (%d)\n",req->count);
+ dprintk(1, "reqbufs: count invalid (%d)\n", req->count);
return -EINVAL;
}
if (req->memory != V4L2_MEMORY_MMAP &&
req->memory != V4L2_MEMORY_USERPTR &&
req->memory != V4L2_MEMORY_OVERLAY) {
- dprintk(1,"reqbufs: memory type invalid\n");
+ dprintk(1, "reqbufs: memory type invalid\n");
return -EINVAL;
}
mutex_lock(&q->lock);
if (req->type != q->type) {
- dprintk(1,"reqbufs: queue type invalid\n");
+ dprintk(1, "reqbufs: queue type invalid\n");
retval = -EINVAL;
goto done;
}
if (q->streaming) {
- dprintk(1,"reqbufs: streaming already exists\n");
+ dprintk(1, "reqbufs: streaming already exists\n");
retval = -EBUSY;
goto done;
}
if (!list_empty(&q->stream)) {
- dprintk(1,"reqbufs: stream running\n");
+ dprintk(1, "reqbufs: stream running\n");
retval = -EBUSY;
goto done;
}
@@ -417,14 +421,14 @@ int videobuf_reqbufs(struct videobuf_queue *q,
if (count > VIDEO_MAX_FRAME)
count = VIDEO_MAX_FRAME;
size = 0;
- q->ops->buf_setup(q,&count,&size);
+ q->ops->buf_setup(q, &count, &size);
size = PAGE_ALIGN(size);
- dprintk(1,"reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
+ dprintk(1, "reqbufs: bufs=%d, size=0x%x [%d pages total]\n",
count, size, (count*size)>>PAGE_SHIFT);
- retval = __videobuf_mmap_setup(q,count,size,req->memory);
+ retval = __videobuf_mmap_setup(q, count, size, req->memory);
if (retval < 0) {
- dprintk(1,"reqbufs: mmap setup returned %d\n",retval);
+ dprintk(1, "reqbufs: mmap setup returned %d\n", retval);
goto done;
}
@@ -441,19 +445,19 @@ int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
mutex_lock(&q->lock);
if (unlikely(b->type != q->type)) {
- dprintk(1,"querybuf: Wrong type.\n");
+ dprintk(1, "querybuf: Wrong type.\n");
goto done;
}
if (unlikely(b->index < 0 || b->index >= VIDEO_MAX_FRAME)) {
- dprintk(1,"querybuf: index out of range.\n");
+ dprintk(1, "querybuf: index out of range.\n");
goto done;
}
if (unlikely(NULL == q->bufs[b->index])) {
- dprintk(1,"querybuf: buffer is null.\n");
+ dprintk(1, "querybuf: buffer is null.\n");
goto done;
}
- videobuf_status(q,b,q->bufs[b->index],q->type);
+ videobuf_status(q, b, q->bufs[b->index], q->type);
ret = 0;
done:
@@ -466,10 +470,10 @@ int videobuf_qbuf(struct videobuf_queue *q,
{
struct videobuf_buffer *buf;
enum v4l2_field field;
- unsigned long flags=0;
+ unsigned long flags = 0;
int retval;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
if (b->memory == V4L2_MEMORY_MMAP)
down_read(&current->mm->mmap_sem);
@@ -477,36 +481,36 @@ int videobuf_qbuf(struct videobuf_queue *q,
mutex_lock(&q->lock);
retval = -EBUSY;
if (q->reading) {
- dprintk(1,"qbuf: Reading running...\n");
+ dprintk(1, "qbuf: Reading running...\n");
goto done;
}
retval = -EINVAL;
if (b->type != q->type) {
- dprintk(1,"qbuf: Wrong type.\n");
+ dprintk(1, "qbuf: Wrong type.\n");
goto done;
}
if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) {
- dprintk(1,"qbuf: index out of range.\n");
+ dprintk(1, "qbuf: index out of range.\n");
goto done;
}
buf = q->bufs[b->index];
if (NULL == buf) {
- dprintk(1,"qbuf: buffer is null.\n");
+ dprintk(1, "qbuf: buffer is null.\n");
goto done;
}
- MAGIC_CHECK(buf->magic,MAGIC_BUFFER);
+ MAGIC_CHECK(buf->magic, MAGIC_BUFFER);
if (buf->memory != b->memory) {
- dprintk(1,"qbuf: memory type is wrong.\n");
+ dprintk(1, "qbuf: memory type is wrong.\n");
goto done;
}
if (buf->state != VIDEOBUF_NEEDS_INIT && buf->state != VIDEOBUF_IDLE) {
- dprintk(1,"qbuf: buffer is already queued or active.\n");
+ dprintk(1, "qbuf: buffer is already queued or active.\n");
goto done;
}
if (b->flags & V4L2_BUF_FLAG_INPUT) {
if (b->input >= q->inputs) {
- dprintk(1,"qbuf: wrong input.\n");
+ dprintk(1, "qbuf: wrong input.\n");
goto done;
}
buf->input = b->input;
@@ -517,44 +521,46 @@ int videobuf_qbuf(struct videobuf_queue *q,
switch (b->memory) {
case V4L2_MEMORY_MMAP:
if (0 == buf->baddr) {
- dprintk(1,"qbuf: mmap requested but buffer addr is zero!\n");
+ dprintk(1, "qbuf: mmap requested "
+ "but buffer addr is zero!\n");
goto done;
}
break;
case V4L2_MEMORY_USERPTR:
if (b->length < buf->bsize) {
- dprintk(1,"qbuf: buffer length is not enough\n");
+ dprintk(1, "qbuf: buffer length is not enough\n");
goto done;
}
- if (VIDEOBUF_NEEDS_INIT != buf->state && buf->baddr != b->m.userptr)
- q->ops->buf_release(q,buf);
+ if (VIDEOBUF_NEEDS_INIT != buf->state &&
+ buf->baddr != b->m.userptr)
+ q->ops->buf_release(q, buf);
buf->baddr = b->m.userptr;
break;
case V4L2_MEMORY_OVERLAY:
buf->boff = b->m.offset;
break;
default:
- dprintk(1,"qbuf: wrong memory type\n");
+ dprintk(1, "qbuf: wrong memory type\n");
goto done;
}
- dprintk(1,"qbuf: requesting next field\n");
+ dprintk(1, "qbuf: requesting next field\n");
field = videobuf_next_field(q);
- retval = q->ops->buf_prepare(q,buf,field);
+ retval = q->ops->buf_prepare(q, buf, field);
if (0 != retval) {
- dprintk(1,"qbuf: buffer_prepare returned %d\n",retval);
+ dprintk(1, "qbuf: buffer_prepare returned %d\n", retval);
goto done;
}
- list_add_tail(&buf->stream,&q->stream);
+ list_add_tail(&buf->stream, &q->stream);
if (q->streaming) {
if (q->irqlock)
- spin_lock_irqsave(q->irqlock,flags);
- q->ops->buf_queue(q,buf);
+ spin_lock_irqsave(q->irqlock, flags);
+ q->ops->buf_queue(q, buf);
if (q->irqlock)
- spin_unlock_irqrestore(q->irqlock,flags);
+ spin_unlock_irqrestore(q->irqlock, flags);
}
- dprintk(1,"qbuf: succeded\n");
+ dprintk(1, "qbuf: succeded\n");
retval = 0;
done:
@@ -572,49 +578,49 @@ int videobuf_dqbuf(struct videobuf_queue *q,
struct videobuf_buffer *buf;
int retval;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
mutex_lock(&q->lock);
retval = -EBUSY;
if (q->reading) {
- dprintk(1,"dqbuf: Reading running...\n");
+ dprintk(1, "dqbuf: Reading running...\n");
goto done;
}
retval = -EINVAL;
if (b->type != q->type) {
- dprintk(1,"dqbuf: Wrong type.\n");
+ dprintk(1, "dqbuf: Wrong type.\n");
goto done;
}
if (list_empty(&q->stream)) {
- dprintk(1,"dqbuf: stream running\n");
+ dprintk(1, "dqbuf: stream running\n");
goto done;
}
buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
retval = videobuf_waiton(buf, nonblocking, 1);
if (retval < 0) {
- dprintk(1,"dqbuf: waiton returned %d\n",retval);
+ dprintk(1, "dqbuf: waiton returned %d\n", retval);
goto done;
}
switch (buf->state) {
case VIDEOBUF_ERROR:
- dprintk(1,"dqbuf: state is error\n");
+ dprintk(1, "dqbuf: state is error\n");
retval = -EIO;
- CALL(q,sync,q, buf);
+ CALL(q, sync, q, buf);
buf->state = VIDEOBUF_IDLE;
break;
case VIDEOBUF_DONE:
- dprintk(1,"dqbuf: state is done\n");
- CALL(q,sync,q, buf);
+ dprintk(1, "dqbuf: state is done\n");
+ CALL(q, sync, q, buf);
buf->state = VIDEOBUF_IDLE;
break;
default:
- dprintk(1,"dqbuf: state invalid\n");
+ dprintk(1, "dqbuf: state invalid\n");
retval = -EINVAL;
goto done;
}
list_del(&buf->stream);
- memset(b,0,sizeof(*b));
- videobuf_status(q,b,buf,q->type);
+ memset(b, 0, sizeof(*b));
+ videobuf_status(q, b, buf, q->type);
done:
mutex_unlock(&q->lock);
@@ -624,7 +630,7 @@ int videobuf_dqbuf(struct videobuf_queue *q,
int videobuf_streamon(struct videobuf_queue *q)
{
struct videobuf_buffer *buf;
- unsigned long flags=0;
+ unsigned long flags = 0;
int retval;
mutex_lock(&q->lock);
@@ -636,12 +642,12 @@ int videobuf_streamon(struct videobuf_queue *q)
goto done;
q->streaming = 1;
if (q->irqlock)
- spin_lock_irqsave(q->irqlock,flags);
+ spin_lock_irqsave(q->irqlock, flags);
list_for_each_entry(buf, &q->stream, stream)
if (buf->state == VIDEOBUF_PREPARED)
- q->ops->buf_queue(q,buf);
+ q->ops->buf_queue(q, buf);
if (q->irqlock)
- spin_unlock_irqrestore(q->irqlock,flags);
+ spin_unlock_irqrestore(q->irqlock, flags);
done:
mutex_unlock(&q->lock);
@@ -677,10 +683,10 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
size_t count, loff_t *ppos)
{
enum v4l2_field field;
- unsigned long flags=0;
+ unsigned long flags = 0;
int retval;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
/* setup stuff */
q->read_buf = videobuf_alloc(q);
@@ -692,19 +698,19 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
q->read_buf->bsize = count;
field = videobuf_next_field(q);
- retval = q->ops->buf_prepare(q,q->read_buf,field);
+ retval = q->ops->buf_prepare(q, q->read_buf, field);
if (0 != retval)
goto done;
/* start capture & wait */
if (q->irqlock)
- spin_lock_irqsave(q->irqlock,flags);
- q->ops->buf_queue(q,q->read_buf);
+ spin_lock_irqsave(q->irqlock, flags);
+ q->ops->buf_queue(q, q->read_buf);
if (q->irqlock)
- spin_unlock_irqrestore(q->irqlock,flags);
- retval = videobuf_waiton(q->read_buf,0,0);
+ spin_unlock_irqrestore(q->irqlock, flags);
+ retval = videobuf_waiton(q->read_buf, 0, 0);
if (0 == retval) {
- CALL(q,sync,q,q->read_buf);
+ CALL(q, sync, q, q->read_buf);
if (VIDEOBUF_ERROR == q->read_buf->state)
retval = -EIO;
else
@@ -713,7 +719,7 @@ static ssize_t videobuf_read_zerocopy(struct videobuf_queue *q,
done:
/* cleanup */
- q->ops->buf_release(q,q->read_buf);
+ q->ops->buf_release(q, q->read_buf);
kfree(q->read_buf);
q->read_buf = NULL;
return retval;
@@ -724,21 +730,21 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
int nonblocking)
{
enum v4l2_field field;
- unsigned long flags=0;
+ unsigned long flags = 0;
unsigned size, nbufs;
int retval;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
mutex_lock(&q->lock);
nbufs = 1; size = 0;
- q->ops->buf_setup(q,&nbufs,&size);
+ q->ops->buf_setup(q, &nbufs, &size);
if (NULL == q->read_buf &&
count >= size &&
!nonblocking) {
- retval = videobuf_read_zerocopy(q,data,count,ppos);
+ retval = videobuf_read_zerocopy(q, data, count, ppos);
if (retval >= 0 || retval == -EIO)
/* ok, all done */
goto done;
@@ -750,25 +756,25 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
retval = -ENOMEM;
q->read_buf = videobuf_alloc(q);
- dprintk(1,"video alloc=0x%p\n", q->read_buf);
+ dprintk(1, "video alloc=0x%p\n", q->read_buf);
if (NULL == q->read_buf)
goto done;
q->read_buf->memory = V4L2_MEMORY_USERPTR;
q->read_buf->bsize = count; /* preferred size */
field = videobuf_next_field(q);
- retval = q->ops->buf_prepare(q,q->read_buf,field);
+ retval = q->ops->buf_prepare(q, q->read_buf, field);
if (0 != retval) {
- kfree (q->read_buf);
+ kfree(q->read_buf);
q->read_buf = NULL;
goto done;
}
if (q->irqlock)
- spin_lock_irqsave(q->irqlock,flags);
+ spin_lock_irqsave(q->irqlock, flags);
- q->ops->buf_queue(q,q->read_buf);
+ q->ops->buf_queue(q, q->read_buf);
if (q->irqlock)
- spin_unlock_irqrestore(q->irqlock,flags);
+ spin_unlock_irqrestore(q->irqlock, flags);
q->read_off = 0;
}
@@ -777,11 +783,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
if (0 != retval)
goto done;
- CALL(q,sync,q,q->read_buf);
+ CALL(q, sync, q, q->read_buf);
if (VIDEOBUF_ERROR == q->read_buf->state) {
/* catch I/O errors */
- q->ops->buf_release(q,q->read_buf);
+ q->ops->buf_release(q, q->read_buf);
kfree(q->read_buf);
q->read_buf = NULL;
retval = -EIO;
@@ -789,14 +795,14 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
}
/* Copy to userspace */
- retval=CALL(q,video_copy_to_user,q,data,count,nonblocking);
- if (retval<0)
+ retval = CALL(q, video_copy_to_user, q, data, count, nonblocking);
+ if (retval < 0)
goto done;
q->read_off += retval;
if (q->read_off == q->read_buf->size) {
/* all data copied, cleanup */
- q->ops->buf_release(q,q->read_buf);
+ q->ops->buf_release(q, q->read_buf);
kfree(q->read_buf);
q->read_buf = NULL;
}
@@ -810,11 +816,11 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
int __videobuf_read_start(struct videobuf_queue *q)
{
enum v4l2_field field;
- unsigned long flags=0;
+ unsigned long flags = 0;
unsigned int count = 0, size = 0;
int err, i;
- q->ops->buf_setup(q,&count,&size);
+ q->ops->buf_setup(q, &count, &size);
if (count < 2)
count = 2;
if (count > VIDEO_MAX_FRAME)
@@ -829,17 +835,17 @@ int __videobuf_read_start(struct videobuf_queue *q)
for (i = 0; i < count; i++) {
field = videobuf_next_field(q);
- err = q->ops->buf_prepare(q,q->bufs[i],field);
+ err = q->ops->buf_prepare(q, q->bufs[i], field);
if (err)
return err;
list_add_tail(&q->bufs[i]->stream, &q->stream);
}
if (q->irqlock)
- spin_lock_irqsave(q->irqlock,flags);
+ spin_lock_irqsave(q->irqlock, flags);
for (i = 0; i < count; i++)
- q->ops->buf_queue(q,q->bufs[i]);
+ q->ops->buf_queue(q, q->bufs[i]);
if (q->irqlock)
- spin_unlock_irqrestore(q->irqlock,flags);
+ spin_unlock_irqrestore(q->irqlock, flags);
q->reading = 1;
return 0;
}
@@ -900,11 +906,11 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
int vbihack, int nonblocking)
{
int rc, retval;
- unsigned long flags=0;
+ unsigned long flags = 0;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
- dprintk(2,"%s\n",__FUNCTION__);
+ dprintk(2, "%s\n", __FUNCTION__);
mutex_lock(&q->lock);
retval = -EBUSY;
if (q->streaming)
@@ -933,7 +939,7 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
}
if (q->read_buf->state == VIDEOBUF_DONE) {
- rc = CALL (q,copy_stream, q, data + retval, count,
+ rc = CALL(q, copy_stream, q, data + retval, count,
retval, vbihack, nonblocking);
if (rc < 0) {
retval = rc;
@@ -954,10 +960,10 @@ ssize_t videobuf_read_stream(struct videobuf_queue *q,
list_add_tail(&q->read_buf->stream,
&q->stream);
if (q->irqlock)
- spin_lock_irqsave(q->irqlock,flags);
- q->ops->buf_queue(q,q->read_buf);
+ spin_lock_irqsave(q->irqlock, flags);
+ q->ops->buf_queue(q, q->read_buf);
if (q->irqlock)
- spin_unlock_irqrestore(q->irqlock,flags);
+ spin_unlock_irqrestore(q->irqlock, flags);
q->read_buf = NULL;
}
if (retval < 0)
@@ -1013,10 +1019,10 @@ int videobuf_mmap_mapper(struct videobuf_queue *q,
{
int retval;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
mutex_lock(&q->lock);
- retval=CALL(q,mmap_mapper,q,vma);
+ retval = CALL(q, mmap_mapper, q, vma);
mutex_unlock(&q->lock);
return retval;
@@ -1027,15 +1033,15 @@ int videobuf_cgmbuf(struct videobuf_queue *q,
struct video_mbuf *mbuf, int count)
{
struct v4l2_requestbuffers req;
- int rc,i;
+ int rc, i;
- MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
+ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
- memset(&req,0,sizeof(req));
+ memset(&req, 0, sizeof(req));
req.type = q->type;
req.count = count;
req.memory = V4L2_MEMORY_MMAP;
- rc = videobuf_reqbufs(q,&req);
+ rc = videobuf_reqbufs(q, &req);
if (rc < 0)
return rc;
@@ -1080,9 +1086,3 @@ EXPORT_SYMBOL_GPL(videobuf_poll_stream);
EXPORT_SYMBOL_GPL(videobuf_mmap_setup);
EXPORT_SYMBOL_GPL(videobuf_mmap_free);
EXPORT_SYMBOL_GPL(videobuf_mmap_mapper);
-
-/*
- * Local variables:
- * c-basic-offset: 8
- * End:
- */
diff --git a/linux/drivers/media/video/videobuf-dma-sg.c b/linux/drivers/media/video/videobuf-dma-sg.c
index e2a3f9031..c5f6d22ce 100644
--- a/linux/drivers/media/video/videobuf-dma-sg.c
+++ b/linux/drivers/media/video/videobuf-dma-sg.c
@@ -436,7 +436,8 @@ videobuf_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
page = alloc_page(GFP_USER | __GFP_DMA32);
if (!page)
return VM_FAULT_OOM;
- clear_user_page(page_address(page), vm_fault->virtual_address, page);
+ clear_user_page(page_address(page), (unsigned long)vmf->virtual_address,
+ page);
vmf->page = page;
return 0;
}
diff --git a/linux/drivers/media/video/vivi.c b/linux/drivers/media/video/vivi.c
index 63b0c7aeb..02e44ab91 100644
--- a/linux/drivers/media/video/vivi.c
+++ b/linux/drivers/media/video/vivi.c
@@ -25,7 +25,7 @@
#include <linux/pci.h>
#include <linux/random.h>
#include <linux/version.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)
#include <linux/mutex.h>
#else
#include <asm/semaphore.h>
@@ -40,11 +40,11 @@
#include <linux/interrupt.h>
#include <media/videobuf-vmalloc.h>
#include <media/v4l2-common.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
#include <linux/kthread.h>
#endif
#include <linux/highmem.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
#include <linux/freezer.h>
#endif
@@ -53,21 +53,19 @@
#define WAKE_DENOMINATOR 1001
#define BUFFER_TIMEOUT msecs_to_jiffies(500) /* 0.5 seconds */
-/* These timers are for 1 fps - used only for testing */
-//#define WAKE_DENOMINATOR 30 /* hack for testing purposes */
-//#define BUFFER_TIMEOUT msecs_to_jiffies(5000) /* 5 seconds */
-
#include "font.h"
#define VIVI_MAJOR_VERSION 0
#define VIVI_MINOR_VERSION 4
#define VIVI_RELEASE 0
-#define VIVI_VERSION KERNEL_VERSION(VIVI_MAJOR_VERSION, VIVI_MINOR_VERSION, VIVI_RELEASE)
+#define VIVI_VERSION \
+ KERNEL_VERSION(VIVI_MAJOR_VERSION, VIVI_MINOR_VERSION, VIVI_RELEASE)
/* Declare static vars that will be used as parameters */
static unsigned int vid_limit = 16; /* Video memory limit, in Mb */
static struct video_device vivi; /* Video device */
static int video_nr = -1; /* /dev/videoN, -1 for autodetect */
+static int n_devs = 1; /* Number of virtual devices */
/* supported controls */
static struct v4l2_queryctrl vivi_qctrl[] = {
@@ -80,7 +78,7 @@ static struct v4l2_queryctrl vivi_qctrl[] = {
.default_value = 65535,
.flags = 0,
.type = V4L2_CTRL_TYPE_INTEGER,
- },{
+ }, {
.id = V4L2_CID_BRIGHTNESS,
.type = V4L2_CTRL_TYPE_INTEGER,
.name = "Brightness",
@@ -121,7 +119,7 @@ static struct v4l2_queryctrl vivi_qctrl[] = {
static int qctl_regs[ARRAY_SIZE(vivi_qctrl)];
-#define dprintk(level,fmt, arg...) \
+#define dprintk(level, fmt, arg...) \
do { \
if (vivi.debug >= (level)) \
printk(KERN_DEBUG "vivi: " fmt , ## arg); \
@@ -164,7 +162,7 @@ struct vivi_dmaqueue {
/* thread for generating video stream*/
struct task_struct *kthread;
wait_queue_head_t wq;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
struct semaphore *notify;
int rmmod:1;
#endif
@@ -178,7 +176,7 @@ static LIST_HEAD(vivi_devlist);
struct vivi_dev {
struct list_head vivi_devlist;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16)
struct mutex lock;
#else
struct semaphore lock;
@@ -187,13 +185,15 @@ struct vivi_dev {
int users;
/* various device info */
- struct video_device vfd;
+ struct video_device *vfd;
struct vivi_dmaqueue vidq;
/* Several counters */
- int h,m,s,us,jiffies;
+ int h, m, s, us, jiffies;
char timestr[13];
+
+ int mv_count; /* Controls bars movement */
};
struct vivi_fh {
@@ -201,7 +201,7 @@ struct vivi_fh {
/* video capture */
struct vivi_fmt *fmt;
- unsigned int width,height;
+ unsigned int width, height;
struct videobuf_queue vb_vidq;
enum v4l2_buf_type type;
@@ -220,109 +220,113 @@ enum colors {
GREEN,
MAGENTA,
RED,
- BLUE
+ BLUE,
+ BLACK,
};
static u8 bars[8][3] = {
/* R G B */
- {204,204,204}, /* white */
- {208,208, 0}, /* ambar */
- { 0,206,206}, /* cyan */
- { 0,239, 0}, /* green */
- {239, 0,239}, /* magenta */
- {205, 0, 0}, /* red */
- { 0, 0,255}, /* blue */
- { 0, 0, 0}
+ {204, 204, 204}, /* white */
+ {208, 208, 0}, /* ambar */
+ { 0, 206, 206}, /* cyan */
+ { 0, 239, 0}, /* green */
+ {239, 0, 239}, /* magenta */
+ {205, 0, 0}, /* red */
+ { 0, 0, 255}, /* blue */
+ { 0, 0, 0}, /* black */
};
-#define TO_Y(r,g,b) (((16829*r +33039*g +6416*b + 32768)>>16)+16)
+#define TO_Y(r, g, b) \
+ (((16829 * r + 33039 * g + 6416 * b + 32768) >> 16) + 16)
/* RGB to V(Cr) Color transform */
-#define TO_V(r,g,b) (((28784*r -24103*g -4681*b + 32768)>>16)+128)
+#define TO_V(r, g, b) \
+ (((28784 * r - 24103 * g - 4681 * b + 32768) >> 16) + 128)
/* RGB to U(Cb) Color transform */
-#define TO_U(r,g,b) (((-9714*r -19070*g +28784*b + 32768)>>16)+128)
+#define TO_U(r, g, b) \
+ (((-9714 * r - 19070 * g + 28784 * b + 32768) >> 16) + 128)
#define TSTAMP_MIN_Y 24
#define TSTAMP_MAX_Y TSTAMP_MIN_Y+15
#define TSTAMP_MIN_X 64
-static void gen_line(char *basep,int inipos,int wmax,
- int hmax, int line, int count, char *timestr)
+static void gen_line(char *basep, int inipos, int wmax,
+ int hmax, int line, int count, char *timestr)
{
- int w,i,j,pos=inipos,y;
- char *p,*s;
- u8 chr,r,g,b,color;
+ int w, i, j, y;
+ int pos = inipos;
+ char *p, *s;
+ u8 chr, r, g, b, color;
/* We will just duplicate the second pixel at the packet */
- wmax/=2;
+ wmax /= 2;
/* Generate a standard color bar pattern */
- for (w=0;w<wmax;w++) {
- int colorpos=((w+count)*8/(wmax+1)) % 8;
- r=bars[colorpos][0];
- g=bars[colorpos][1];
- b=bars[colorpos][2];
+ for (w = 0; w < wmax; w++) {
+ int colorpos = ((w + count) * 8/(wmax + 1)) % 8;
+ r = bars[colorpos][0];
+ g = bars[colorpos][1];
+ b = bars[colorpos][2];
- for (color=0;color<4;color++) {
- p=basep+pos;
+ for (color = 0; color < 4; color++) {
+ p = basep + pos;
switch (color) {
- case 0:
- case 2:
- *p=TO_Y(r,g,b); /* Luminance */
- break;
- case 1:
- *p=TO_U(r,g,b); /* Cb */
- break;
- case 3:
- *p=TO_V(r,g,b); /* Cr */
- break;
+ case 0:
+ case 2:
+ *p = TO_Y(r, g, b); /* Luma */
+ break;
+ case 1:
+ *p = TO_U(r, g, b); /* Cb */
+ break;
+ case 3:
+ *p = TO_V(r, g, b); /* Cr */
+ break;
}
pos++;
}
}
/* Checks if it is possible to show timestamp */
- if (TSTAMP_MAX_Y>=hmax)
+ if (TSTAMP_MAX_Y >= hmax)
goto end;
- if (TSTAMP_MIN_X+strlen(timestr)>=wmax)
+ if (TSTAMP_MIN_X + strlen(timestr) >= wmax)
goto end;
/* Print stream time */
- if (line>=TSTAMP_MIN_Y && line<=TSTAMP_MAX_Y) {
- j=TSTAMP_MIN_X;
- for (s=timestr;*s;s++) {
- chr=rom8x16_bits[(*s-0x30)*16+line-TSTAMP_MIN_Y];
- for (i=0;i<7;i++) {
- if (chr&1<<(7-i)) { /* Font color*/
- r=bars[BLUE][0];
- g=bars[BLUE][1];
- b=bars[BLUE][2];
- r=g=b=0;
- g=198;
- } else { /* Background color */
- r=bars[WHITE][0];
- g=bars[WHITE][1];
- b=bars[WHITE][2];
- r=g=b=0;
+ if (line >= TSTAMP_MIN_Y && line <= TSTAMP_MAX_Y) {
+ j = TSTAMP_MIN_X;
+ for (s = timestr; *s; s++) {
+ chr = rom8x16_bits[(*s-0x30)*16+line-TSTAMP_MIN_Y];
+ for (i = 0; i < 7; i++) {
+ if (chr & 1 << (7 - i)) {
+ /* Font color*/
+ r = 0;
+ g = 198;
+ b = 0;
+ } else {
+ /* Background color */
+ r = bars[BLACK][0];
+ g = bars[BLACK][1];
+ b = bars[BLACK][2];
}
- pos=inipos+j*2;
- for (color=0;color<4;color++) {
- p=basep+pos;
+ pos = inipos + j * 2;
+ for (color = 0; color < 4; color++) {
+ p = basep + pos;
- y=TO_Y(r,g,b);
+ y = TO_Y(r, g, b);
switch (color) {
- case 0:
- case 2:
- *p=TO_Y(r,g,b); /* Luminance */
- break;
- case 1:
- *p=TO_U(r,g,b); /* Cb */
- break;
- case 3:
- *p=TO_V(r,g,b); /* Cr */
- break;
+ case 0:
+ case 2:
+ *p = TO_Y(r, g, b); /* Luma */
+ break;
+ case 1:
+ *p = TO_U(r, g, b); /* Cb */
+ break;
+ case 3:
+ *p = TO_V(r, g, b); /* Cr */
+ break;
}
pos++;
}
@@ -331,72 +335,57 @@ static void gen_line(char *basep,int inipos,int wmax,
}
}
-#if 0 /* This will require a different logic */
- /* Generate random noise */
- if (line>6*hmax/7) {
- if (line>6*hmax/7) {
- p=get_addr_pos(inipos+j/2,pages,to_addr);
-
-// get_random_bytes(buf+wmax-(wmax/7), wmax/7);
- kunmap_atomic(p, KM_BOUNCE_READ);
- }
- }
-
-#endif
-
end:
return;
}
-static void vivi_fillbuff(struct vivi_dev *dev,struct vivi_buffer *buf)
+static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)
{
- int h,pos=0;
+ int h , pos = 0;
int hmax = buf->vb.height;
int wmax = buf->vb.width;
struct timeval ts;
- char *tmpbuf = kmalloc(wmax*2,GFP_KERNEL);
- void *vbuf=videobuf_to_vmalloc (&buf->vb);
- /* FIXME: move to dev struct */
- static int mv_count=0;
+ char *tmpbuf = kmalloc(wmax * 2, GFP_KERNEL);
+ void *vbuf = videobuf_to_vmalloc(&buf->vb);
if (!tmpbuf)
return;
- for (h=0;h<hmax;h++) {
- gen_line(tmpbuf,0,wmax,hmax,h,mv_count,
+ for (h = 0; h < hmax; h++) {
+ gen_line(tmpbuf, 0, wmax, hmax, h, dev->mv_count,
dev->timestr);
/* FIXME: replacing to __copy_to_user */
- if (copy_to_user(vbuf+pos,tmpbuf,wmax*2)!=0)
- dprintk(2,"vivifill copy_to_user failed.\n");
+ if (copy_to_user(vbuf + pos, tmpbuf, wmax * 2) != 0)
+ dprintk(2, "vivifill copy_to_user failed.\n");
pos += wmax*2;
}
- mv_count++;
+ dev->mv_count++;
kfree(tmpbuf);
/* Updates stream time */
- dev->us+=jiffies_to_usecs(jiffies-dev->jiffies);
- dev->jiffies=jiffies;
- if (dev->us>=1000000) {
- dev->us-=1000000;
+ dev->us += jiffies_to_usecs(jiffies-dev->jiffies);
+ dev->jiffies = jiffies;
+ if (dev->us >= 1000000) {
+ dev->us -= 1000000;
dev->s++;
- if (dev->s>=60) {
- dev->s-=60;
+ if (dev->s >= 60) {
+ dev->s -= 60;
dev->m++;
- if (dev->m>60) {
- dev->m-=60;
+ if (dev->m > 60) {
+ dev->m -= 60;
dev->h++;
- if (dev->h>24)
- dev->h-=24;
+ if (dev->h > 24)
+ dev->h -= 24;
}
}
}
- sprintf(dev->timestr,"%02d:%02d:%02d:%03d",
- dev->h,dev->m,dev->s,(dev->us+500)/1000);
+ sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
+ dev->h, dev->m, dev->s, (dev->us + 500) / 1000);
- dprintk(2,"vivifill at %s: Buffer 0x%08lx size= %d\n",dev->timestr,
- (unsigned long)tmpbuf,pos);
+ dprintk(2, "vivifill at %s: Buffer 0x%08lx size= %d\n", dev->timestr,
+ (unsigned long)tmpbuf, pos);
/* Advice that buffer was filled */
buf->vb.state = VIDEOBUF_DONE;
@@ -413,14 +402,14 @@ static int restart_video_queue(struct vivi_dmaqueue *dma_q);
static void vivi_thread_tick(struct vivi_dmaqueue *dma_q)
{
struct vivi_buffer *buf;
- struct vivi_dev *dev= container_of(dma_q,struct vivi_dev,vidq);
+ struct vivi_dev *dev = container_of(dma_q, struct vivi_dev, vidq);
int bc;
/* Announces videobuf that all went ok */
for (bc = 0;; bc++) {
if (list_empty(&dma_q->active)) {
- dprintk(1,"No active queue to serve\n");
+ dprintk(1, "No active queue to serve\n");
break;
}
@@ -434,19 +423,20 @@ static void vivi_thread_tick(struct vivi_dmaqueue *dma_q)
}
do_gettimeofday(&buf->vb.ts);
- dprintk(2,"[%p/%d] wakeup\n",buf,buf->vb.i);
+ dprintk(2, "[%p/%d] wakeup\n", buf, buf->vb. i);
/* Fill buffer */
- vivi_fillbuff(dev,buf);
+ vivi_fillbuff(dev, buf);
if (list_empty(&dma_q->active)) {
del_timer(&dma_q->timeout);
} else {
- mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
+ mod_timer(&dma_q->timeout, jiffies + BUFFER_TIMEOUT);
}
}
if (bc != 1)
- dprintk(1,"%s: %d buffers handled (should be 1)\n",__FUNCTION__,bc);
+ dprintk(1, "%s: %d buffers handled (should be 1)\n",
+ __FUNCTION__, bc);
}
static void vivi_sleep(struct vivi_dmaqueue *dma_q)
@@ -454,10 +444,10 @@ static void vivi_sleep(struct vivi_dmaqueue *dma_q)
int timeout;
DECLARE_WAITQUEUE(wait, current);
- dprintk(1,"%s dma_q=0x%08lx\n",__FUNCTION__,(unsigned long)dma_q);
+ dprintk(1, "%s dma_q=0x%08lx\n", __FUNCTION__, (unsigned long)dma_q);
add_wait_queue(&dma_q->wq, &wait);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
if (!(q->rmmod || signal_pending(current))) {
#else
if (!kthread_should_stop()) {
@@ -465,23 +455,31 @@ static void vivi_sleep(struct vivi_dmaqueue *dma_q)
dma_q->frame++;
/* Calculate time to wake up */
- timeout=dma_q->ini_jiffies+msecs_to_jiffies((dma_q->frame*WAKE_NUMERATOR*1000)/WAKE_DENOMINATOR)-jiffies;
+ timeout = dma_q->ini_jiffies+
+ msecs_to_jiffies((dma_q->frame*WAKE_NUMERATOR * 1000)
+ / WAKE_DENOMINATOR) - jiffies;
if (timeout <= 0) {
- int old=dma_q->frame;
- dma_q->frame=(jiffies_to_msecs(jiffies-dma_q->ini_jiffies)*WAKE_DENOMINATOR)/(WAKE_NUMERATOR*1000)+1;
-
- timeout=dma_q->ini_jiffies+msecs_to_jiffies((dma_q->frame*WAKE_NUMERATOR*1000)/WAKE_DENOMINATOR)-jiffies;
-
- dprintk(1,"underrun, losed %d frames. "
- "Now, frame is %d. Waking on %d jiffies\n",
- dma_q->frame-old,dma_q->frame,timeout);
+ int old = dma_q->frame;
+ dma_q->frame = (jiffies_to_msecs(jiffies -
+ dma_q->ini_jiffies) *
+ WAKE_DENOMINATOR) /
+ (WAKE_NUMERATOR * 1000) + 1;
+
+ timeout = dma_q->ini_jiffies+
+ msecs_to_jiffies((dma_q->frame *
+ WAKE_NUMERATOR * 1000)
+ / WAKE_DENOMINATOR) - jiffies;
+
+ dprintk(1, "underrun, losed %d frames. "
+ "Now, frame is %d. Waking on %d jiffies\n",
+ dma_q->frame-old, dma_q->frame, timeout);
} else
- dprintk(1,"will sleep for %i jiffies\n",timeout);
+ dprintk(1, "will sleep for %i jiffies\n", timeout);
vivi_thread_tick(dma_q);
- schedule_timeout_interruptible (timeout);
+ schedule_timeout_interruptible(timeout);
}
remove_wait_queue(&dma_q->wq, &wait);
@@ -490,9 +488,9 @@ static void vivi_sleep(struct vivi_dmaqueue *dma_q)
static int vivi_thread(void *data)
{
- struct vivi_dmaqueue *dma_q=data;
+ struct vivi_dmaqueue *dma_q = data;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
daemonize();
exit_files(current);
reparent_to_init();
@@ -506,7 +504,7 @@ static int vivi_thread(void *data)
if (dma_q->notify != NULL)
up(dma_q->notify);
#endif
- dprintk(1,"thread started\n");
+ dprintk(1, "thread started\n");
mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
set_freezable();
@@ -514,7 +512,7 @@ static int vivi_thread(void *data)
for (;;) {
vivi_sleep(dma_q);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
if (dma_q->rmmod || signal_pending(current))
#else
if (kthread_should_stop())
@@ -522,7 +520,7 @@ static int vivi_thread(void *data)
break;
}
dprintk(1, "thread: exit\n");
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
dma_q->kthread = NULL;
if (dma_q->notify != NULL)
@@ -533,12 +531,12 @@ static int vivi_thread(void *data)
static int vivi_start_thread(struct vivi_dmaqueue *dma_q)
{
- dma_q->frame=0;
- dma_q->ini_jiffies=jiffies;
+ dma_q->frame = 0;
+ dma_q->ini_jiffies = jiffies;
- dprintk(1,"%s\n",__FUNCTION__);
+ dprintk(1, "%s\n", __FUNCTION__);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0)
dma_q->kthread = kthread_run(vivi_thread, dma_q, "vivi");
if (IS_ERR(dma_q->kthread)) {
@@ -553,7 +551,7 @@ static int vivi_start_thread(struct vivi_dmaqueue *dma_q)
dma_q->rmmod = 0;
if (kernel_thread(vivi_thread, dma_q, 0) < 0) {
- printk (KERN_ERR "sdim: kernel_thread() failed\n");
+ printk(KERN_ERR "sdim: kernel_thread() failed\n");
return -EINVAL;
}
@@ -563,19 +561,18 @@ static int vivi_start_thread(struct vivi_dmaqueue *dma_q)
/* Wakes thread */
wake_up_interruptible(&dma_q->wq);
- dprintk(1,"returning from %s\n",__FUNCTION__);
+ dprintk(1, "returning from %s\n", __FUNCTION__);
return 0;
}
static void vivi_stop_thread(struct vivi_dmaqueue *dma_q)
{
- dprintk(1,"%s\n",__FUNCTION__);
+ dprintk(1, "%s\n", __FUNCTION__);
/* shutdown control thread */
if (dma_q->kthread) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
DECLARE_MUTEX_LOCKED(sem);
-#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+
/* shutdown control thread */
dma_q->notify = &sem;
dma_q->rmmod = 1;
@@ -586,7 +583,7 @@ static void vivi_stop_thread(struct vivi_dmaqueue *dma_q)
#else
kthread_stop(dma_q->kthread);
#endif
- dma_q->kthread=NULL;
+ dma_q->kthread = NULL;
}
}
@@ -594,16 +591,16 @@ static int restart_video_queue(struct vivi_dmaqueue *dma_q)
{
struct vivi_buffer *buf, *prev;
- dprintk(1,"%s dma_q=0x%08lx\n",__FUNCTION__,(unsigned long)dma_q);
+ dprintk(1, "%s dma_q=0x%08lx\n", __FUNCTION__, (unsigned long)dma_q);
if (!list_empty(&dma_q->active)) {
- buf = list_entry(dma_q->active.next, struct vivi_buffer, vb.queue);
- dprintk(2,"restart_queue [%p/%d]: restart dma\n",
+ buf = list_entry(dma_q->active.next,
+ struct vivi_buffer, vb.queue);
+ dprintk(2, "restart_queue [%p/%d]: restart dma\n",
buf, buf->vb.i);
- dprintk(1,"Restarting video dma\n");
+ dprintk(1, "Restarting video dma\n");
vivi_stop_thread(dma_q);
-// vivi_start_thread(dma_q);
/* cancel all outstanding capture / vbi requests */
list_for_each_entry_safe(buf, prev, &dma_q->active, vb.queue) {
@@ -620,28 +617,29 @@ static int restart_video_queue(struct vivi_dmaqueue *dma_q)
for (;;) {
if (list_empty(&dma_q->queued))
return 0;
- buf = list_entry(dma_q->queued.next, struct vivi_buffer, vb.queue);
+ buf = list_entry(dma_q->queued.next,
+ struct vivi_buffer, vb.queue);
if (NULL == prev) {
list_del(&buf->vb.queue);
- list_add_tail(&buf->vb.queue,&dma_q->active);
+ list_add_tail(&buf->vb.queue, &dma_q->active);
- dprintk(1,"Restarting video dma\n");
+ dprintk(1, "Restarting video dma\n");
vivi_stop_thread(dma_q);
vivi_start_thread(dma_q);
buf->vb.state = VIDEOBUF_ACTIVE;
mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2,"[%p/%d] restart_queue - first active\n",
- buf,buf->vb.i);
+ dprintk(2, "[%p/%d] restart_queue - first active\n",
+ buf, buf->vb.i);
} else if (prev->vb.width == buf->vb.width &&
prev->vb.height == buf->vb.height &&
prev->fmt == buf->fmt) {
list_del(&buf->vb.queue);
- list_add_tail(&buf->vb.queue,&dma_q->active);
+ list_add_tail(&buf->vb.queue, &dma_q->active);
buf->vb.state = VIDEOBUF_ACTIVE;
- dprintk(2,"[%p/%d] restart_queue - move to active\n",
- buf,buf->vb.i);
+ dprintk(2, "[%p/%d] restart_queue - move to active\n",
+ buf, buf->vb.i);
} else {
return 0;
}
@@ -651,16 +649,17 @@ static int restart_video_queue(struct vivi_dmaqueue *dma_q)
static void vivi_vid_timeout(unsigned long data)
{
- struct vivi_dev *dev = (struct vivi_dev*)data;
+ struct vivi_dev *dev = (struct vivi_dev *)data;
struct vivi_dmaqueue *vidq = &dev->vidq;
struct vivi_buffer *buf;
while (!list_empty(&vidq->active)) {
- buf = list_entry(vidq->active.next, struct vivi_buffer, vb.queue);
+ buf = list_entry(vidq->active.next,
+ struct vivi_buffer, vb.queue);
list_del(&buf->vb.queue);
buf->vb.state = VIDEOBUF_ERROR;
wake_up(&buf->vb.done);
- printk("vivi/0: [%p/%d] timeout\n", buf, buf->vb.i);
+ printk(KERN_INFO "vivi/0: [%p/%d] timeout\n", buf, buf->vb.i);
}
restart_video_queue(vidq);
@@ -682,19 +681,19 @@ buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
while (*size * *count > vid_limit * 1024 * 1024)
(*count)--;
- dprintk(1,"%s, count=%d, size=%d\n",__FUNCTION__,*count, *size);
+ dprintk(1, "%s, count=%d, size=%d\n", __FUNCTION__, *count, *size);
return 0;
}
static void free_buffer(struct videobuf_queue *vq, struct vivi_buffer *buf)
{
- dprintk(1,"%s\n",__FUNCTION__);
+ dprintk(1, "%s\n", __FUNCTION__);
if (in_interrupt())
BUG();
- videobuf_waiton(&buf->vb,0,0);
+ videobuf_waiton(&buf->vb, 0, 0);
videobuf_vmalloc_free(&buf->vb);
buf->vb.state = VIDEOBUF_NEEDS_INIT;
}
@@ -706,10 +705,10 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
enum v4l2_field field)
{
struct vivi_fh *fh = vq->priv_data;
- struct vivi_buffer *buf = container_of(vb,struct vivi_buffer,vb);
+ struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
int rc, init_buffer = 0;
- dprintk(1,"%s, field=%d\n",__FUNCTION__,field);
+ dprintk(1, "%s, field=%d\n", __FUNCTION__, field);
BUG_ON(NULL == fh->fmt);
if (fh->width < 48 || fh->width > norm_maxw() ||
@@ -731,80 +730,78 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
}
if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
- if (0 != (rc = videobuf_iolock(vq,&buf->vb,NULL)))
+ rc = videobuf_iolock(vq, &buf->vb, NULL);
+ if (rc < 0)
goto fail;
}
buf->vb.state = VIDEOBUF_PREPARED;
-#ifdef CONFIG_VIVI_SCATTER
- if (NULL == (buf->to_addr = kmalloc(sizeof(*buf->to_addr) * vb->dma.nr_pages,GFP_KERNEL))) {
- rc=-ENOMEM;
- goto fail;
- }
-#endif
return 0;
fail:
- free_buffer(vq,buf);
+ free_buffer(vq, buf);
return rc;
}
static void
buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
- struct vivi_buffer *buf = container_of(vb,struct vivi_buffer,vb);
- struct vivi_fh *fh = vq->priv_data;
- struct vivi_dev *dev = fh->dev;
- struct vivi_dmaqueue *vidq = &dev->vidq;
+ struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
+ struct vivi_fh *fh = vq->priv_data;
+ struct vivi_dev *dev = fh->dev;
+ struct vivi_dmaqueue *vidq = &dev->vidq;
struct vivi_buffer *prev;
if (!list_empty(&vidq->queued)) {
- dprintk(1,"adding vb queue=0x%08lx\n",(unsigned long)&buf->vb.queue);
- list_add_tail(&buf->vb.queue,&vidq->queued);
+ dprintk(1, "adding vb queue=0x%08lx\n",
+ (unsigned long)&buf->vb.queue);
+ list_add_tail(&buf->vb.queue, &vidq->queued);
buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2,"[%p/%d] buffer_queue - append to queued\n",
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n",
buf, buf->vb.i);
} else if (list_empty(&vidq->active)) {
- list_add_tail(&buf->vb.queue,&vidq->active);
+ list_add_tail(&buf->vb.queue, &vidq->active);
buf->vb.state = VIDEOBUF_ACTIVE;
mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2,"[%p/%d] buffer_queue - first active\n",
+ dprintk(2, "[%p/%d] buffer_queue - first active\n",
buf, buf->vb.i);
vivi_start_thread(vidq);
} else {
- prev = list_entry(vidq->active.prev, struct vivi_buffer, vb.queue);
+ prev = list_entry(vidq->active.prev,
+ struct vivi_buffer, vb.queue);
if (prev->vb.width == buf->vb.width &&
prev->vb.height == buf->vb.height &&
prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue,&vidq->active);
+ list_add_tail(&buf->vb.queue, &vidq->active);
buf->vb.state = VIDEOBUF_ACTIVE;
- dprintk(2,"[%p/%d] buffer_queue - append to active\n",
+ dprintk(2, "[%p/%d] buffer_queue - append to active\n",
buf, buf->vb.i);
} else {
- list_add_tail(&buf->vb.queue,&vidq->queued);
+ list_add_tail(&buf->vb.queue, &vidq->queued);
buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2,"[%p/%d] buffer_queue - first queued\n",
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n",
buf, buf->vb.i);
}
}
}
-static void buffer_release(struct videobuf_queue *vq, struct videobuf_buffer *vb)
+static void buffer_release(struct videobuf_queue *vq,
+ struct videobuf_buffer *vb)
{
- struct vivi_buffer *buf = container_of(vb,struct vivi_buffer,vb);
+ struct vivi_buffer *buf = container_of(vb, struct vivi_buffer, vb);
struct vivi_fh *fh = vq->priv_data;
- struct vivi_dev *dev = (struct vivi_dev*)fh->dev;
+ struct vivi_dev *dev = (struct vivi_dev *)fh->dev;
struct vivi_dmaqueue *vidq = &dev->vidq;
- dprintk(1,"%s\n",__FUNCTION__);
+ dprintk(1, "%s\n", __FUNCTION__);
vivi_stop_thread(vidq);
- free_buffer(vq,buf);
+ free_buffer(vq, buf);
}
static struct videobuf_queue_ops vivi_video_qops = {
@@ -817,7 +814,7 @@ static struct videobuf_queue_ops vivi_video_qops = {
/* ------------------------------------------------------------------
IOCTL vidioc handling
------------------------------------------------------------------*/
-static int vidioc_querycap (struct file *file, void *priv,
+static int vidioc_querycap(struct file *file, void *priv,
struct v4l2_capability *cap)
{
strcpy(cap->driver, "vivi");
@@ -829,21 +826,21 @@ static int vidioc_querycap (struct file *file, void *priv,
return 0;
}
-static int vidioc_enum_fmt_cap (struct file *file, void *priv,
+static int vidioc_enum_fmt_cap(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
if (f->index > 0)
return -EINVAL;
- strlcpy(f->description,format.name,sizeof(f->description));
+ strlcpy(f->description, format.name, sizeof(f->description));
f->pixelformat = format.fourcc;
return 0;
}
-static int vidioc_g_fmt_cap (struct file *file, void *priv,
+static int vidioc_g_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
f->fmt.pix.width = fh->width;
f->fmt.pix.height = fh->height;
@@ -857,7 +854,7 @@ static int vidioc_g_fmt_cap (struct file *file, void *priv,
return (0);
}
-static int vidioc_try_fmt_cap (struct file *file, void *priv,
+static int vidioc_try_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
struct vivi_fmt *fmt;
@@ -865,18 +862,18 @@ static int vidioc_try_fmt_cap (struct file *file, void *priv,
unsigned int maxw, maxh;
if (format.fourcc != f->fmt.pix.pixelformat) {
- dprintk(1,"Fourcc format (0x%08x) invalid. Driver accepts "
- "only 0x%08x\n",f->fmt.pix.pixelformat,format.fourcc);
+ dprintk(1, "Fourcc format (0x%08x) invalid. Driver accepts "
+ "only 0x%08x\n", f->fmt.pix.pixelformat, format.fourcc);
return -EINVAL;
}
- fmt=&format;
+ fmt = &format;
field = f->fmt.pix.field;
if (field == V4L2_FIELD_ANY) {
- field=V4L2_FIELD_INTERLACED;
+ field = V4L2_FIELD_INTERLACED;
} else if (V4L2_FIELD_INTERLACED != field) {
- dprintk(1,"Field type invalid.\n");
+ dprintk(1, "Field type invalid.\n");
return -EINVAL;
}
@@ -902,11 +899,11 @@ static int vidioc_try_fmt_cap (struct file *file, void *priv,
}
/*FIXME: This seems to be generic enough to be at videodev2 */
-static int vidioc_s_fmt_cap (struct file *file, void *priv,
+static int vidioc_s_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f)
{
- struct vivi_fh *fh=priv;
- int ret = vidioc_try_fmt_cap(file,fh,f);
+ struct vivi_fh *fh = priv;
+ int ret = vidioc_try_fmt_cap(file, fh, f);
if (ret < 0)
return (ret);
@@ -919,47 +916,48 @@ static int vidioc_s_fmt_cap (struct file *file, void *priv,
return (0);
}
-static int vidioc_reqbufs (struct file *file, void *priv, struct v4l2_requestbuffers *p)
+static int vidioc_reqbufs(struct file *file, void *priv,
+ struct v4l2_requestbuffers *p)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
return (videobuf_reqbufs(&fh->vb_vidq, p));
}
-static int vidioc_querybuf (struct file *file, void *priv, struct v4l2_buffer *p)
+static int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
return (videobuf_querybuf(&fh->vb_vidq, p));
}
-static int vidioc_qbuf (struct file *file, void *priv, struct v4l2_buffer *p)
+static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
return (videobuf_qbuf(&fh->vb_vidq, p));
}
-static int vidioc_dqbuf (struct file *file, void *priv, struct v4l2_buffer *p)
+static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
return (videobuf_dqbuf(&fh->vb_vidq, p,
file->f_flags & O_NONBLOCK));
}
#ifdef CONFIG_VIDEO_V4L1_COMPAT
-static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf)
+static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
- return videobuf_cgmbuf (&fh->vb_vidq, mbuf, 8);
+ return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
}
#endif
static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
@@ -971,7 +969,7 @@ static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
{
- struct vivi_fh *fh=priv;
+ struct vivi_fh *fh = priv;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
@@ -981,13 +979,13 @@ static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
return videobuf_streamoff(&fh->vb_vidq);
}
-static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *i)
+static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
{
return 0;
}
/* only one input in this sample driver */
-static int vidioc_enum_input (struct file *file, void *priv,
+static int vidioc_enum_input(struct file *file, void *priv,
struct v4l2_input *inp)
{
if (inp->index != 0)
@@ -995,18 +993,18 @@ static int vidioc_enum_input (struct file *file, void *priv,
inp->type = V4L2_INPUT_TYPE_CAMERA;
inp->std = V4L2_STD_NTSC_M;
- strcpy(inp->name,"Camera");
+ strcpy(inp->name, "Camera");
return (0);
}
-static int vidioc_g_input (struct file *file, void *priv, unsigned int *i)
+static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
{
*i = 0;
return (0);
}
-static int vidioc_s_input (struct file *file, void *priv, unsigned int i)
+static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
{
if (i > 0)
return -EINVAL;
@@ -1015,8 +1013,8 @@ static int vidioc_s_input (struct file *file, void *priv, unsigned int i)
}
/* --- controls ---------------------------------------------- */
-static int vidioc_queryctrl (struct file *file, void *priv,
- struct v4l2_queryctrl *qc)
+static int vidioc_queryctrl(struct file *file, void *priv,
+ struct v4l2_queryctrl *qc)
{
int i;
@@ -1030,33 +1028,31 @@ static int vidioc_queryctrl (struct file *file, void *priv,
return -EINVAL;
}
-static int vidioc_g_ctrl (struct file *file, void *priv,
- struct v4l2_control *ctrl)
+static int vidioc_g_ctrl(struct file *file, void *priv,
+ struct v4l2_control *ctrl)
{
int i;
for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
if (ctrl->id == vivi_qctrl[i].id) {
- ctrl->value=qctl_regs[i];
+ ctrl->value = qctl_regs[i];
return (0);
}
return -EINVAL;
}
-static int vidioc_s_ctrl (struct file *file, void *priv,
+static int vidioc_s_ctrl(struct file *file, void *priv,
struct v4l2_control *ctrl)
{
int i;
for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
if (ctrl->id == vivi_qctrl[i].id) {
- if (ctrl->value <
- vivi_qctrl[i].minimum
- || ctrl->value >
- vivi_qctrl[i].maximum) {
+ if (ctrl->value < vivi_qctrl[i].minimum
+ || ctrl->value > vivi_qctrl[i].maximum) {
return (-ERANGE);
}
- qctl_regs[i]=ctrl->value;
+ qctl_regs[i] = ctrl->value;
return (0);
}
return -EINVAL;
@@ -1075,22 +1071,14 @@ static int vivi_open(struct inode *inode, struct file *file)
struct vivi_fh *fh;
int i;
- printk(KERN_DEBUG "vivi: open called (minor=%d)\n",minor);
+ printk(KERN_DEBUG "vivi: open called (minor=%d)\n", minor);
list_for_each_entry(dev, &vivi_devlist, vivi_devlist)
- if (dev->vfd.minor == minor)
+ if (dev->vfd->minor == minor)
goto found;
return -ENODEV;
-found:
-
-#if 0 /* Avoids an oops at read() - seems to be semaphore related */
- if (dev->users) {
- printk(KERN_INFO "this driver can be opened only once (users=%d)\n",dev->users);
- return -EBUSY;
- }
-#endif
-
+found:
/* If more than one user, mutex should be added */
dev->users++;
@@ -1098,7 +1086,7 @@ found:
v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users);
/* allocate + initialize per filehandle data */
- fh = kzalloc(sizeof(*fh),GFP_KERNEL);
+ fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
dev->users--;
return -ENOMEM;
@@ -1114,27 +1102,21 @@ found:
/* Put all controls at a sane state */
for (i = 0; i < ARRAY_SIZE(vivi_qctrl); i++)
- qctl_regs[i] =vivi_qctrl[i].default_value;
-
- dprintk(1,"Open: fh=0x%08lx, dev=0x%08lx, dev->vidq=0x%08lx\n",
- (unsigned long)fh,(unsigned long)dev,(unsigned long)&dev->vidq);
- dprintk(1,"Open: list_empty queued=%d\n",list_empty(&dev->vidq.queued));
- dprintk(1,"Open: list_empty active=%d\n",list_empty(&dev->vidq.active));
+ qctl_regs[i] = vivi_qctrl[i].default_value;
/* Resets frame counters */
- dev->h=0;
- dev->m=0;
- dev->s=0;
- dev->us=0;
- dev->jiffies=jiffies;
- sprintf(dev->timestr,"%02d:%02d:%02d:%03d",
- dev->h,dev->m,dev->s,(dev->us+500)/1000);
+ dev->h = 0;
+ dev->m = 0;
+ dev->s = 0;
+ dev->us = 0;
+ dev->mv_count = 0;
+ dev->jiffies = jiffies;
+ sprintf(dev->timestr, "%02d:%02d:%02d:%03d",
+ dev->h, dev->m, dev->s, (dev->us + 500) / 1000);
videobuf_queue_vmalloc_init(&fh->vb_vidq, &vivi_video_qops,
- NULL, NULL,
- fh->type,
- V4L2_FIELD_INTERLACED,
- sizeof(struct vivi_buffer),fh);
+ NULL, NULL, fh->type, V4L2_FIELD_INTERLACED,
+ sizeof(struct vivi_buffer), fh);
return 0;
}
@@ -1142,9 +1124,9 @@ found:
static ssize_t
vivi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
{
- struct vivi_fh *fh = file->private_data;
+ struct vivi_fh *fh = file->private_data;
- if (fh->type==V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+ if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
return videobuf_read_stream(&fh->vb_vidq, data, count, ppos, 0,
file->f_flags & O_NONBLOCK);
}
@@ -1157,7 +1139,7 @@ vivi_poll(struct file *file, struct poll_table_struct *wait)
struct vivi_fh *fh = file->private_data;
struct videobuf_queue *q = &fh->vb_vidq;
- dprintk(1,"%s\n",__FUNCTION__);
+ dprintk(1, "%s\n", __FUNCTION__);
if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
return POLLERR;
@@ -1165,7 +1147,7 @@ vivi_poll(struct file *file, struct poll_table_struct *wait)
return videobuf_poll_stream(file, q, wait);
}
-static int vivi_release(struct inode *inode, struct file *file)
+static int vivi_close(struct inode *inode, struct file *file)
{
struct vivi_fh *fh = file->private_data;
struct vivi_dev *dev = fh->dev;
@@ -1177,26 +1159,46 @@ static int vivi_release(struct inode *inode, struct file *file)
videobuf_stop(&fh->vb_vidq);
videobuf_mmap_free(&fh->vb_vidq);
- kfree (fh);
+ kfree(fh);
dev->users--;
- printk(KERN_DEBUG "vivi: close called (minor=%d, users=%d)\n",minor,dev->users);
+ dprintk(1, "close called (minor=%d, users=%d)\n", minor, dev->users);
return 0;
}
-static int
-vivi_mmap(struct file *file, struct vm_area_struct * vma)
+static int vivi_release(void)
{
- struct vivi_fh *fh = file->private_data;
+ struct vivi_dev *dev;
+ struct list_head *list;
+
+ while (!list_empty(&vivi_devlist)) {
+ list = vivi_devlist.next;
+ list_del(list);
+ dev = list_entry(list, struct vivi_dev, vivi_devlist);
+
+ if (-1 != dev->vfd->minor)
+ video_unregister_device(dev->vfd);
+ else
+ video_device_release(dev->vfd);
+
+ kfree(dev);
+ }
+
+ return 0;
+}
+
+static int vivi_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ struct vivi_fh *fh = file->private_data;
int ret;
- dprintk (1,"mmap called, vma=0x%08lx\n",(unsigned long)vma);
+ dprintk(1, "mmap called, vma=0x%08lx\n", (unsigned long)vma);
- ret=videobuf_mmap_mapper(&fh->vb_vidq, vma);
+ ret = videobuf_mmap_mapper(&fh->vb_vidq, vma);
- dprintk (1,"vma start=0x%08lx, size=%ld, ret=%d\n",
+ dprintk(1, "vma start=0x%08lx, size=%ld, ret=%d\n",
(unsigned long)vma->vm_start,
(unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
ret);
@@ -1207,7 +1209,7 @@ vivi_mmap(struct file *file, struct vm_area_struct * vma)
static const struct file_operations vivi_fops = {
.owner = THIS_MODULE,
.open = vivi_open,
- .release = vivi_release,
+ .release = vivi_close,
.read = vivi_read,
.poll = vivi_poll,
.ioctl = video_ioctl2, /* V4L2 ioctl handler */
@@ -1215,12 +1217,12 @@ static const struct file_operations vivi_fops = {
.llseek = no_llseek,
};
-static struct video_device vivi = {
+static struct video_device vivi_template = {
.name = "vivi",
.type = VID_TYPE_CAPTURE,
.fops = &vivi_fops,
.minor = -1,
-// .release = video_device_release,
+ .release = video_device_release,
.vidioc_querycap = vidioc_querycap,
.vidioc_enum_fmt_cap = vidioc_enum_fmt_cap,
@@ -1252,43 +1254,60 @@ static struct video_device vivi = {
static int __init vivi_init(void)
{
- int ret;
+ int ret = -ENOMEM, i;
struct vivi_dev *dev;
+ struct video_device *vfd;
- dev = kzalloc(sizeof(*dev),GFP_KERNEL);
- if (NULL == dev)
- return -ENOMEM;
- list_add_tail(&dev->vivi_devlist,&vivi_devlist);
+ for (i = 0; i < n_devs; i++) {
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (NULL == dev)
+ break;
- /* init video dma queues */
- INIT_LIST_HEAD(&dev->vidq.active);
- INIT_LIST_HEAD(&dev->vidq.queued);
- init_waitqueue_head(&dev->vidq.wq);
+ list_add_tail(&dev->vivi_devlist, &vivi_devlist);
- /* initialize locks */
- mutex_init(&dev->lock);
+ /* init video dma queues */
+ INIT_LIST_HEAD(&dev->vidq.active);
+ INIT_LIST_HEAD(&dev->vidq.queued);
+ init_waitqueue_head(&dev->vidq.wq);
- dev->vidq.timeout.function = vivi_vid_timeout;
- dev->vidq.timeout.data = (unsigned long)dev;
- init_timer(&dev->vidq.timeout);
+ /* initialize locks */
+ mutex_init(&dev->lock);
- ret = video_register_device(&vivi, VFL_TYPE_GRABBER, video_nr);
- printk(KERN_INFO "Video Technology Magazine Virtual Video Capture Board (Load status: %d)\n", ret);
+ dev->vidq.timeout.function = vivi_vid_timeout;
+ dev->vidq.timeout.data = (unsigned long)dev;
+ init_timer(&dev->vidq.timeout);
+
+ vfd = video_device_alloc();
+ if (NULL == vfd)
+ break;
+
+ *vfd = vivi_template;
+
+ ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr);
+ if (ret < 0)
+ break;
+
+ snprintf(vfd->name, sizeof(vfd->name), "%s (%i)",
+ vivi_template.name, vfd->minor);
+
+ if (video_nr >= 0)
+ video_nr++;
+
+ dev->vfd = vfd;
+ }
+
+ if (ret < 0) {
+ vivi_release();
+ printk(KERN_INFO "Error %d while loading vivi driver\n", ret);
+ } else
+ printk(KERN_INFO "Video Technology Magazine Virtual Video "
+ "Capture Board successfully loaded.\n");
return ret;
}
static void __exit vivi_exit(void)
{
- struct vivi_dev *h;
- struct list_head *list;
-
- while (!list_empty(&vivi_devlist)) {
- list = vivi_devlist.next;
- list_del(list);
- h = list_entry(list, struct vivi_dev, vivi_devlist);
- kfree (h);
- }
- video_unregister_device(&vivi);
+ vivi_release();
}
module_init(vivi_init);
@@ -1299,10 +1318,13 @@ MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol");
MODULE_LICENSE("Dual BSD/GPL");
module_param(video_nr, int, 0);
+MODULE_PARM_DESC(video_nr, "video iminor start number");
-module_param_named(debug,vivi.debug, int, 0644);
-MODULE_PARM_DESC(debug,"activates debug info");
+module_param(n_devs, int, 0);
+MODULE_PARM_DESC(n_devs, "number of video devices to create");
-module_param(vid_limit,int,0644);
-MODULE_PARM_DESC(vid_limit,"capture memory limit in megabytes");
+module_param_named(debug, vivi.debug, int, 0644);
+MODULE_PARM_DESC(debug, "activates debug info");
+module_param(vid_limit, int, 0644);
+MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");
diff --git a/linux/drivers/media/video/vp27smpx.c b/linux/drivers/media/video/vp27smpx.c
index 602d7da63..c7099c5fe 100644
--- a/linux/drivers/media/video/vp27smpx.c
+++ b/linux/drivers/media/video/vp27smpx.c
@@ -41,6 +41,7 @@ MODULE_DESCRIPTION("vp27smpx driver");
MODULE_AUTHOR("Hans Verkuil");
MODULE_LICENSE("GPL");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
static unsigned short normal_i2c[] = { 0xb6 >> 1, I2C_CLIENT_END };
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
@@ -48,6 +49,7 @@ static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
#endif
I2C_CLIENT_INSMOD;
+#endif
/* ----------------------------------------------------------------------- */
diff --git a/linux/drivers/media/video/wm8739.c b/linux/drivers/media/video/wm8739.c
index a0a4ed3ba..36babfdb2 100644
--- a/linux/drivers/media/video/wm8739.c
+++ b/linux/drivers/media/video/wm8739.c
@@ -42,7 +42,6 @@ MODULE_AUTHOR("T. Adachi, Hans Verkuil");
MODULE_LICENSE("GPL");
static int debug;
-static unsigned short normal_i2c[] = { 0x34 >> 1, 0x36 >> 1, I2C_CLIENT_END };
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0)
module_param(debug, int, 0644);
@@ -52,11 +51,15 @@ MODULE_PARM(debug, "i");
MODULE_PARM_DESC(debug, "Debug level (0-1)");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
+static unsigned short normal_i2c[] = { 0x34 >> 1, 0x36 >> 1, I2C_CLIENT_END };
+
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
#endif
I2C_CLIENT_INSMOD;
+#endif
/* ------------------------------------------------------------------------ */
diff --git a/linux/include/media/tuner.h b/linux/include/media/tuner.h
index d49392d90..97be269af 100644
--- a/linux/include/media/tuner.h
+++ b/linux/include/media/tuner.h
@@ -24,8 +24,6 @@
#include <linux/videodev2.h>
-extern int tuner_debug;
-
#define ADDR_UNSET (255)
#define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */
diff --git a/linux/include/media/v4l2-i2c-drv.h b/linux/include/media/v4l2-i2c-drv.h
index 726120399..09e5f8de5 100644
--- a/linux/include/media/v4l2-i2c-drv.h
+++ b/linux/include/media/v4l2-i2c-drv.h
@@ -38,7 +38,6 @@ struct v4l2_i2c_driver_data {
};
static struct v4l2_i2c_driver_data v4l2_i2c_data;
-static struct i2c_client_address_data addr_data;
static struct i2c_driver v4l2_i2c_driver;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
@@ -59,6 +58,8 @@ static int __init v4l2_i2c_drv_init(void)
#else
+static struct i2c_client_address_data addr_data;
+
/* Bus-based I2C API is not present, add legacy code */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)