Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (33 commits) V4L/DVB (3965): Fix CONFIG_VIDEO_VIVI=y build bug V4L/DVB (3964): Bt8xx/bttv-cards.c: fix off-by-one errors V4L/DVB (3914): Vivi build fix V4L/DVB (3912): Sparc32 vivi fix V4L/DVB (3832): Get_dvb_firmware: download nxt2002 firmware from new driver location V4L/DVB (3829): Fix frequency values in the ranges structures of the LG TDVS H06xF tuners V4L/DVB (3826): Saa7134: Missing 'break' in Terratec Cinergy 400 TV initialization V4L/DVB (3825): Remove broken 'fast firmware load' from cx25840. V4L/DVB (3819): Cxusb-bluebird: bug-fix: power down corrupts frontend V4L/DVB (3813): Add support for TCL M2523_5N_E tuner. V4L/DVB (3804): Tweak bandselect setup fox cx24123 V4L/DVB (3803): Various correctness fixes to tuning. V4L/DVB (3797): Always wait for diseqc queue to become ready before transmitting a diseqc message V4L/DVB (3796): Add several debug messages to cx24123 code V4L/DVB (3795): Fix for CX24123 & low symbol rates V4L/DVB (3792): Kbuild: DVB_BT8XX must select DVB_ZL10353 V4L/DVB (3790): Use after free in drivers/media/video/em28xx/em28xx-video.c V4L/DVB (3788): Fix compilation with V4L1_COMPAT V4L/DVB (3782): Removed uneeded stuff from pwc Makefile V4L/DVB (3775): Add VIVI Kconfig stuff ...
This commit is contained in:
commit
c9d20af62c
43 changed files with 727 additions and 394 deletions
|
@ -259,9 +259,9 @@ sub dibusb {
|
|||
}
|
||||
|
||||
sub nxt2002 {
|
||||
my $sourcefile = "Broadband4PC_4_2_11.zip";
|
||||
my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip";
|
||||
my $url = "http://www.bbti.us/download/windows/$sourcefile";
|
||||
my $hash = "c6d2ea47a8f456d887ada0cfb718ff2a";
|
||||
my $hash = "476befae8c7c1bb9648954060b1eec1f";
|
||||
my $outfile = "dvb-fe-nxt2002.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
||||
|
@ -269,8 +269,8 @@ sub nxt2002 {
|
|||
|
||||
wgetfile($sourcefile, $url);
|
||||
unzip($sourcefile, $tmpdir);
|
||||
verify("$tmpdir/SkyNETU.sys", $hash);
|
||||
extract("$tmpdir/SkyNETU.sys", 375832, 5908, $outfile);
|
||||
verify("$tmpdir/SkyNET.sys", $hash);
|
||||
extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile);
|
||||
|
||||
$outfile;
|
||||
}
|
||||
|
|
|
@ -8,22 +8,54 @@ config VIDEO_DEV
|
|||
tristate "Video For Linux"
|
||||
---help---
|
||||
Support for audio/video capture and overlay devices and FM radio
|
||||
cards. The exact capabilities of each device vary. User tools for
|
||||
this are available from
|
||||
<ftp://ftp.uk.linux.org/pub/linux/video4linux/>.
|
||||
cards. The exact capabilities of each device vary.
|
||||
|
||||
This kernel includes support for the new Video for Linux Two API,
|
||||
(V4L2) as well as the original system. Drivers and applications
|
||||
need to be rewritten to use V4L2, but drivers for popular cards
|
||||
and applications for most video capture functions already exist.
|
||||
|
||||
Documentation for the original API is included in the file
|
||||
<file:Documentation/video4linux/API.html>. Documentation for V4L2 is
|
||||
available on the web at <http://bytesex.org/v4l/>.
|
||||
Additional info and docs are available on the web at
|
||||
<http://linuxtv.org>
|
||||
|
||||
Documentation for V4L2 is also available on the web at
|
||||
<http://bytesex.org/v4l/>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called videodev.
|
||||
|
||||
config VIDEO_V4L1
|
||||
boolean "Enable Video For Linux API 1 (DEPRECATED)"
|
||||
depends on VIDEO_DEV
|
||||
select VIDEO_V4L1_COMPAT
|
||||
default y
|
||||
---help---
|
||||
Enables a compatibility API used by most V4L2 devices to allow
|
||||
its usage with legacy applications that supports only V4L1 api.
|
||||
|
||||
If you are unsure as to whether this is required, answer Y.
|
||||
|
||||
config VIDEO_V4L1_COMPAT
|
||||
boolean "Enable Video For Linux API 1 compatible Layer"
|
||||
depends on VIDEO_DEV
|
||||
default y
|
||||
---help---
|
||||
This api were developed to be used at Kernel 2.2 and 2.4, but
|
||||
lacks support for several video standards. There are several
|
||||
drivers at kernel that still depends on it.
|
||||
|
||||
Documentation for the original API is included in the file
|
||||
<Documentation/video4linux/API.html>.
|
||||
|
||||
User tools for this are available from
|
||||
<ftp://ftp.uk.linux.org/pub/linux/video4linux/>.
|
||||
|
||||
If you are unsure as to whether this is required, answer Y.
|
||||
|
||||
config VIDEO_V4L2
|
||||
tristate
|
||||
default y
|
||||
|
||||
source "drivers/media/video/Kconfig"
|
||||
|
||||
source "drivers/media/radio/Kconfig"
|
||||
|
@ -65,4 +97,3 @@ config USB_DABUSB
|
|||
module will be called dabusb.
|
||||
|
||||
endmenu
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ config VIDEO_SAA7146
|
|||
|
||||
config VIDEO_SAA7146_VV
|
||||
tristate
|
||||
select VIDEO_V4L2
|
||||
select VIDEO_BUF
|
||||
select VIDEO_VIDEOBUF
|
||||
select VIDEO_SAA7146
|
||||
|
|
|
@ -7,6 +7,7 @@ config DVB_BT8XX
|
|||
select DVB_CX24110
|
||||
select DVB_OR51211
|
||||
select DVB_LGDT330X
|
||||
select DVB_ZL10353
|
||||
select FW_LOADER
|
||||
help
|
||||
Support for PCI cards based on the Bt8xx PCI bridge. Examples are
|
||||
|
|
|
@ -902,7 +902,10 @@ static int cinergyt2_probe (struct usb_interface *intf,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE);
|
||||
if ((err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE)) < 0) {
|
||||
kfree(cinergyt2);
|
||||
return err;
|
||||
}
|
||||
|
||||
cinergyt2->demux.priv = cinergyt2;
|
||||
cinergyt2->demux.filternum = 256;
|
||||
|
|
|
@ -106,6 +106,8 @@ struct dvb_frontend_private {
|
|||
unsigned long tune_mode_flags;
|
||||
unsigned int delay;
|
||||
unsigned int reinitialise;
|
||||
int tone;
|
||||
int voltage;
|
||||
|
||||
/* swzigzag values */
|
||||
unsigned int state;
|
||||
|
@ -537,6 +539,12 @@ static int dvb_frontend_thread(void *data)
|
|||
|
||||
if (fepriv->reinitialise) {
|
||||
dvb_frontend_init(fe);
|
||||
if (fepriv->tone != -1) {
|
||||
fe->ops->set_tone(fe, fepriv->tone);
|
||||
}
|
||||
if (fepriv->voltage != -1) {
|
||||
fe->ops->set_voltage(fe, fepriv->voltage);
|
||||
}
|
||||
fepriv->reinitialise = 0;
|
||||
}
|
||||
|
||||
|
@ -788,6 +796,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
|
|||
case FE_SET_TONE:
|
||||
if (fe->ops->set_tone) {
|
||||
err = fe->ops->set_tone(fe, (fe_sec_tone_mode_t) parg);
|
||||
fepriv->tone = (fe_sec_tone_mode_t) parg;
|
||||
fepriv->state = FESTATE_DISEQC;
|
||||
fepriv->status = 0;
|
||||
}
|
||||
|
@ -796,6 +805,7 @@ static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
|
|||
case FE_SET_VOLTAGE:
|
||||
if (fe->ops->set_voltage) {
|
||||
err = fe->ops->set_voltage(fe, (fe_sec_voltage_t) parg);
|
||||
fepriv->voltage = (fe_sec_voltage_t) parg;
|
||||
fepriv->state = FESTATE_DISEQC;
|
||||
fepriv->status = 0;
|
||||
}
|
||||
|
@ -995,6 +1005,8 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
|
|||
|
||||
/* normal tune mode when opened R/W */
|
||||
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
|
||||
fepriv->tone = -1;
|
||||
fepriv->voltage = -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -219,8 +219,6 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
|
||||
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
||||
dvbdev->type = type;
|
||||
dvbdev->id = id;
|
||||
|
@ -231,6 +229,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||
|
||||
list_add_tail (&dvbdev->list_head, &adap->device_list);
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
|
||||
devfs_mk_cdev(MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
|
||||
S_IFCHR | S_IRUSR | S_IWUSR,
|
||||
"dvb/adapter%d/%s%d", adap->num, dnames[type], id);
|
||||
|
|
|
@ -150,6 +150,15 @@ static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
|
|||
return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
|
||||
}
|
||||
|
||||
static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
|
||||
{
|
||||
u8 b = 0;
|
||||
if (onoff)
|
||||
return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
|
||||
{
|
||||
u8 buf[2] = { 0x03, 0x00 };
|
||||
|
@ -544,7 +553,7 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
|
|||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_lgdt3303_frontend_attach,
|
||||
.tuner_attach = cxusb_lgh064f_tuner_attach,
|
||||
|
||||
|
@ -589,7 +598,7 @@ static struct dvb_usb_properties cxusb_bluebird_dee1601_properties = {
|
|||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_dee1601_frontend_attach,
|
||||
.tuner_attach = cxusb_dee1601_tuner_attach,
|
||||
|
||||
|
@ -638,7 +647,7 @@ static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = {
|
|||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_mt352_frontend_attach,
|
||||
.tuner_attach = cxusb_lgz201_tuner_attach,
|
||||
|
||||
|
@ -683,7 +692,7 @@ static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = {
|
|||
.size_of_priv = sizeof(struct cxusb_state),
|
||||
|
||||
.streaming_ctrl = cxusb_streaming_ctrl,
|
||||
.power_ctrl = cxusb_power_ctrl,
|
||||
.power_ctrl = cxusb_bluebird_power_ctrl,
|
||||
.frontend_attach = cxusb_mt352_frontend_attach,
|
||||
.tuner_attach = cxusb_dtt7579_tuner_attach,
|
||||
|
||||
|
|
|
@ -29,6 +29,9 @@
|
|||
#include "dvb_frontend.h"
|
||||
#include "cx24123.h"
|
||||
|
||||
#define XTAL 10111000
|
||||
|
||||
static int force_band;
|
||||
static int debug;
|
||||
#define dprintk(args...) \
|
||||
do { \
|
||||
|
@ -52,6 +55,7 @@ struct cx24123_state
|
|||
u32 VGAarg;
|
||||
u32 bandselectarg;
|
||||
u32 pllarg;
|
||||
u32 FILTune;
|
||||
|
||||
/* The Demod/Tuner can't easily provide these, we cache them */
|
||||
u32 currentfreq;
|
||||
|
@ -63,43 +67,33 @@ static struct
|
|||
{
|
||||
u32 symbolrate_low;
|
||||
u32 symbolrate_high;
|
||||
u32 VCAslope;
|
||||
u32 VCAoffset;
|
||||
u32 VGA1offset;
|
||||
u32 VGA2offset;
|
||||
u32 VCAprogdata;
|
||||
u32 VGAprogdata;
|
||||
u32 FILTune;
|
||||
} cx24123_AGC_vals[] =
|
||||
{
|
||||
{
|
||||
.symbolrate_low = 1000000,
|
||||
.symbolrate_high = 4999999,
|
||||
.VCAslope = 0x07,
|
||||
.VCAoffset = 0x0f,
|
||||
.VGA1offset = 0x1f8,
|
||||
.VGA2offset = 0x1f8,
|
||||
.VGAprogdata = (2 << 18) | (0x1f8 << 9) | 0x1f8,
|
||||
.VCAprogdata = (4 << 18) | (0x07 << 9) | 0x07,
|
||||
/* the specs recommend other values for VGA offsets,
|
||||
but tests show they are wrong */
|
||||
.VGAprogdata = (1 << 19) | (0x180 << 9) | 0x1e0,
|
||||
.VCAprogdata = (2 << 19) | (0x07 << 9) | 0x07,
|
||||
.FILTune = 0x27f /* 0.41 V */
|
||||
},
|
||||
{
|
||||
.symbolrate_low = 5000000,
|
||||
.symbolrate_high = 14999999,
|
||||
.VCAslope = 0x1f,
|
||||
.VCAoffset = 0x1f,
|
||||
.VGA1offset = 0x1e0,
|
||||
.VGA2offset = 0x180,
|
||||
.VGAprogdata = (2 << 18) | (0x180 << 9) | 0x1e0,
|
||||
.VCAprogdata = (4 << 18) | (0x07 << 9) | 0x1f,
|
||||
.VGAprogdata = (1 << 19) | (0x180 << 9) | 0x1e0,
|
||||
.VCAprogdata = (2 << 19) | (0x07 << 9) | 0x1f,
|
||||
.FILTune = 0x317 /* 0.90 V */
|
||||
},
|
||||
{
|
||||
.symbolrate_low = 15000000,
|
||||
.symbolrate_high = 45000000,
|
||||
.VCAslope = 0x3f,
|
||||
.VCAoffset = 0x3f,
|
||||
.VGA1offset = 0x180,
|
||||
.VGA2offset = 0x100,
|
||||
.VGAprogdata = (2 << 18) | (0x100 << 9) | 0x180,
|
||||
.VCAprogdata = (4 << 18) | (0x07 << 9) | 0x3f,
|
||||
.VGAprogdata = (1 << 19) | (0x100 << 9) | 0x180,
|
||||
.VCAprogdata = (2 << 19) | (0x07 << 9) | 0x3f,
|
||||
.FILTune = 0x145 /* 2.70 V */
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -112,91 +106,80 @@ static struct
|
|||
{
|
||||
u32 freq_low;
|
||||
u32 freq_high;
|
||||
u32 bandselect;
|
||||
u32 VCOdivider;
|
||||
u32 VCOnumber;
|
||||
u32 progdata;
|
||||
} cx24123_bandselect_vals[] =
|
||||
{
|
||||
/* band 1 */
|
||||
{
|
||||
.freq_low = 950000,
|
||||
.freq_high = 1018999,
|
||||
.bandselect = 0x40,
|
||||
.VCOdivider = 4,
|
||||
.VCOnumber = 7,
|
||||
.progdata = (0 << 18) | (0 << 9) | 0x40,
|
||||
},
|
||||
{
|
||||
.freq_low = 1019000,
|
||||
.freq_high = 1074999,
|
||||
.bandselect = 0x80,
|
||||
.VCOdivider = 4,
|
||||
.VCOnumber = 8,
|
||||
.progdata = (0 << 18) | (0 << 9) | 0x80,
|
||||
.progdata = (0 << 19) | (0 << 9) | 0x40,
|
||||
},
|
||||
|
||||
/* band 2 */
|
||||
{
|
||||
.freq_low = 1075000,
|
||||
.freq_high = 1227999,
|
||||
.bandselect = 0x01,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 1,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x01,
|
||||
.freq_high = 1177999,
|
||||
.VCOdivider = 4,
|
||||
.progdata = (0 << 19) | (0 << 9) | 0x80,
|
||||
},
|
||||
|
||||
/* band 3 */
|
||||
{
|
||||
.freq_low = 1228000,
|
||||
.freq_high = 1349999,
|
||||
.bandselect = 0x02,
|
||||
.freq_low = 1178000,
|
||||
.freq_high = 1295999,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 2,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x02,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x01,
|
||||
},
|
||||
|
||||
/* band 4 */
|
||||
{
|
||||
.freq_low = 1350000,
|
||||
.freq_high = 1481999,
|
||||
.bandselect = 0x04,
|
||||
.freq_low = 1296000,
|
||||
.freq_high = 1431999,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 3,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x04,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x02,
|
||||
},
|
||||
|
||||
/* band 5 */
|
||||
{
|
||||
.freq_low = 1482000,
|
||||
.freq_high = 1595999,
|
||||
.bandselect = 0x08,
|
||||
.freq_low = 1432000,
|
||||
.freq_high = 1575999,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 4,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x08,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x04,
|
||||
},
|
||||
|
||||
/* band 6 */
|
||||
{
|
||||
.freq_low = 1596000,
|
||||
.freq_low = 1576000,
|
||||
.freq_high = 1717999,
|
||||
.bandselect = 0x10,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 5,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x10,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x08,
|
||||
},
|
||||
|
||||
/* band 7 */
|
||||
{
|
||||
.freq_low = 1718000,
|
||||
.freq_high = 1855999,
|
||||
.bandselect = 0x20,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 6,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x20,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x10,
|
||||
},
|
||||
|
||||
/* band 8 */
|
||||
{
|
||||
.freq_low = 1856000,
|
||||
.freq_high = 2035999,
|
||||
.bandselect = 0x40,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 7,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x40,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x20,
|
||||
},
|
||||
|
||||
/* band 9 */
|
||||
{
|
||||
.freq_low = 2036000,
|
||||
.freq_high = 2149999,
|
||||
.bandselect = 0x80,
|
||||
.freq_high = 2150000,
|
||||
.VCOdivider = 2,
|
||||
.VCOnumber = 8,
|
||||
.progdata = (0 << 18) | (1 << 9) | 0x80,
|
||||
.progdata = (0 << 19) | (1 << 9) | 0x40,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -207,49 +190,44 @@ static struct {
|
|||
{
|
||||
{0x00, 0x03}, /* Reset system */
|
||||
{0x00, 0x00}, /* Clear reset */
|
||||
{0x01, 0x3b}, /* Apply sensible defaults, from an i2c sniffer */
|
||||
{0x03, 0x07},
|
||||
{0x04, 0x10},
|
||||
{0x05, 0x04},
|
||||
{0x06, 0x31},
|
||||
{0x0d, 0x02},
|
||||
{0x0e, 0x03},
|
||||
{0x0f, 0xfe},
|
||||
{0x10, 0x01},
|
||||
{0x14, 0x01},
|
||||
{0x15, 0x98},
|
||||
{0x16, 0x00},
|
||||
{0x17, 0x01},
|
||||
{0x1b, 0x05},
|
||||
{0x1c, 0x80},
|
||||
{0x1d, 0x00},
|
||||
{0x1e, 0x00},
|
||||
{0x20, 0x41},
|
||||
{0x21, 0x15},
|
||||
{0x27, 0x14},
|
||||
{0x28, 0x46},
|
||||
{0x29, 0x00},
|
||||
{0x2a, 0xb0},
|
||||
{0x2b, 0x73},
|
||||
{0x2c, 0x00},
|
||||
{0x03, 0x07}, /* QPSK, DVB, Auto Acquisition (default) */
|
||||
{0x04, 0x10}, /* MPEG */
|
||||
{0x05, 0x04}, /* MPEG */
|
||||
{0x06, 0x31}, /* MPEG (default) */
|
||||
{0x0b, 0x00}, /* Freq search start point (default) */
|
||||
{0x0c, 0x00}, /* Demodulator sample gain (default) */
|
||||
{0x0d, 0x02}, /* Frequency search range = Fsymbol / 4 (default) */
|
||||
{0x0e, 0x03}, /* Default non-inverted, FEC 3/4 (default) */
|
||||
{0x0f, 0xfe}, /* FEC search mask (all supported codes) */
|
||||
{0x10, 0x01}, /* Default search inversion, no repeat (default) */
|
||||
{0x16, 0x00}, /* Enable reading of frequency */
|
||||
{0x17, 0x01}, /* Enable EsNO Ready Counter */
|
||||
{0x1c, 0x80}, /* Enable error counter */
|
||||
{0x20, 0x00}, /* Tuner burst clock rate = 500KHz */
|
||||
{0x21, 0x15}, /* Tuner burst mode, word length = 0x15 */
|
||||
{0x28, 0x00}, /* Enable FILTERV with positive pol., DiSEqC 2.x off */
|
||||
{0x29, 0x00}, /* DiSEqC LNB_DC off */
|
||||
{0x2a, 0xb0}, /* DiSEqC Parameters (default) */
|
||||
{0x2b, 0x73}, /* DiSEqC Tone Frequency (default) */
|
||||
{0x2c, 0x00}, /* DiSEqC Message (0x2c - 0x31) */
|
||||
{0x2d, 0x00},
|
||||
{0x2e, 0x00},
|
||||
{0x2f, 0x00},
|
||||
{0x30, 0x00},
|
||||
{0x31, 0x00},
|
||||
{0x32, 0x8c},
|
||||
{0x33, 0x00},
|
||||
{0x32, 0x8c}, /* DiSEqC Parameters (default) */
|
||||
{0x33, 0x00}, /* Interrupts off (0x33 - 0x34) */
|
||||
{0x34, 0x00},
|
||||
{0x35, 0x03},
|
||||
{0x36, 0x02},
|
||||
{0x37, 0x3a},
|
||||
{0x3a, 0x00}, /* Enable AGC accumulator */
|
||||
{0x44, 0x00},
|
||||
{0x45, 0x00},
|
||||
{0x46, 0x05},
|
||||
{0x56, 0x41},
|
||||
{0x57, 0xff},
|
||||
{0x67, 0x83},
|
||||
{0x35, 0x03}, /* DiSEqC Tone Amplitude (default) */
|
||||
{0x36, 0x02}, /* DiSEqC Parameters (default) */
|
||||
{0x37, 0x3a}, /* DiSEqC Parameters (default) */
|
||||
{0x3a, 0x00}, /* Enable AGC accumulator (for signal strength) */
|
||||
{0x44, 0x00}, /* Constellation (default) */
|
||||
{0x45, 0x00}, /* Symbol count (default) */
|
||||
{0x46, 0x0d}, /* Symbol rate estimator on (default) */
|
||||
{0x56, 0x41}, /* Various (default) */
|
||||
{0x57, 0xff}, /* Error Counter Window (default) */
|
||||
{0x67, 0x83}, /* Non-DCII symbol clock */
|
||||
};
|
||||
|
||||
static int cx24123_writereg(struct cx24123_state* state, int reg, int data)
|
||||
|
@ -258,6 +236,10 @@ static int cx24123_writereg(struct cx24123_state* state, int reg, int data)
|
|||
struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 2 };
|
||||
int err;
|
||||
|
||||
if (debug>1)
|
||||
printk("cx24123: %s: write reg 0x%02x, value 0x%02x\n",
|
||||
__FUNCTION__,reg, data);
|
||||
|
||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
||||
printk("%s: writereg error(err == %i, reg == 0x%02x,"
|
||||
" data == 0x%02x)\n", __FUNCTION__, err, reg, data);
|
||||
|
@ -274,6 +256,10 @@ static int cx24123_writelnbreg(struct cx24123_state* state, int reg, int data)
|
|||
struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = buf, .len = 2 };
|
||||
int err;
|
||||
|
||||
if (debug>1)
|
||||
printk("cx24123: %s: writeln addr=0x08, reg 0x%02x, value 0x%02x\n",
|
||||
__FUNCTION__,reg, data);
|
||||
|
||||
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
|
||||
printk("%s: writelnbreg error (err == %i, reg == 0x%02x,"
|
||||
" data == 0x%02x)\n", __FUNCTION__, err, reg, data);
|
||||
|
@ -303,6 +289,9 @@ static int cx24123_readreg(struct cx24123_state* state, u8 reg)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (debug>1)
|
||||
printk("cx24123: read reg 0x%02x, value 0x%02x\n",reg, ret);
|
||||
|
||||
return b1[0];
|
||||
}
|
||||
|
||||
|
@ -313,17 +302,23 @@ static int cx24123_readlnbreg(struct cx24123_state* state, u8 reg)
|
|||
|
||||
static int cx24123_set_inversion(struct cx24123_state* state, fe_spectral_inversion_t inversion)
|
||||
{
|
||||
u8 nom_reg = cx24123_readreg(state, 0x0e);
|
||||
u8 auto_reg = cx24123_readreg(state, 0x10);
|
||||
|
||||
switch (inversion) {
|
||||
case INVERSION_OFF:
|
||||
cx24123_writereg(state, 0x0e, cx24123_readreg(state, 0x0e) & 0x7f);
|
||||
cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) | 0x80);
|
||||
dprintk("%s: inversion off\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg & ~0x80);
|
||||
cx24123_writereg(state, 0x10, auto_reg | 0x80);
|
||||
break;
|
||||
case INVERSION_ON:
|
||||
cx24123_writereg(state, 0x0e, cx24123_readreg(state, 0x0e) | 0x80);
|
||||
cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) | 0x80);
|
||||
dprintk("%s: inversion on\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x80);
|
||||
cx24123_writereg(state, 0x10, auto_reg | 0x80);
|
||||
break;
|
||||
case INVERSION_AUTO:
|
||||
cx24123_writereg(state, 0x10, cx24123_readreg(state, 0x10) & 0x7f);
|
||||
dprintk("%s: inversion auto\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x10, auto_reg & ~0x80);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -338,92 +333,191 @@ static int cx24123_get_inversion(struct cx24123_state* state, fe_spectral_invers
|
|||
|
||||
val = cx24123_readreg(state, 0x1b) >> 7;
|
||||
|
||||
if (val == 0)
|
||||
if (val == 0) {
|
||||
dprintk("%s: read inversion off\n",__FUNCTION__);
|
||||
*inversion = INVERSION_OFF;
|
||||
else
|
||||
} else {
|
||||
dprintk("%s: read inversion on\n",__FUNCTION__);
|
||||
*inversion = INVERSION_ON;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_set_fec(struct cx24123_state* state, fe_code_rate_t fec)
|
||||
{
|
||||
u8 nom_reg = cx24123_readreg(state, 0x0e) & ~0x07;
|
||||
|
||||
if ( (fec < FEC_NONE) || (fec > FEC_AUTO) )
|
||||
fec = FEC_AUTO;
|
||||
|
||||
/* Hardware has 5/11 and 3/5 but are never unused */
|
||||
switch (fec) {
|
||||
case FEC_NONE:
|
||||
return cx24123_writereg(state, 0x0f, 0x01);
|
||||
case FEC_1_2:
|
||||
return cx24123_writereg(state, 0x0f, 0x02);
|
||||
dprintk("%s: set FEC to 1/2\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x01);
|
||||
cx24123_writereg(state, 0x0f, 0x02);
|
||||
break;
|
||||
case FEC_2_3:
|
||||
return cx24123_writereg(state, 0x0f, 0x04);
|
||||
dprintk("%s: set FEC to 2/3\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x02);
|
||||
cx24123_writereg(state, 0x0f, 0x04);
|
||||
break;
|
||||
case FEC_3_4:
|
||||
return cx24123_writereg(state, 0x0f, 0x08);
|
||||
dprintk("%s: set FEC to 3/4\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x03);
|
||||
cx24123_writereg(state, 0x0f, 0x08);
|
||||
break;
|
||||
case FEC_4_5:
|
||||
dprintk("%s: set FEC to 4/5\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x04);
|
||||
cx24123_writereg(state, 0x0f, 0x10);
|
||||
break;
|
||||
case FEC_5_6:
|
||||
return cx24123_writereg(state, 0x0f, 0x20);
|
||||
dprintk("%s: set FEC to 5/6\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x05);
|
||||
cx24123_writereg(state, 0x0f, 0x20);
|
||||
break;
|
||||
case FEC_6_7:
|
||||
dprintk("%s: set FEC to 6/7\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x06);
|
||||
cx24123_writereg(state, 0x0f, 0x40);
|
||||
break;
|
||||
case FEC_7_8:
|
||||
return cx24123_writereg(state, 0x0f, 0x80);
|
||||
dprintk("%s: set FEC to 7/8\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0e, nom_reg | 0x07);
|
||||
cx24123_writereg(state, 0x0f, 0x80);
|
||||
break;
|
||||
case FEC_AUTO:
|
||||
return cx24123_writereg(state, 0x0f, 0xae);
|
||||
dprintk("%s: set FEC to auto\n",__FUNCTION__);
|
||||
cx24123_writereg(state, 0x0f, 0xfe);
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static int cx24123_get_fec(struct cx24123_state* state, fe_code_rate_t *fec)
|
||||
{
|
||||
int ret;
|
||||
u8 val;
|
||||
|
||||
ret = cx24123_readreg (state, 0x1b);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
val = ret & 0x07;
|
||||
switch (val) {
|
||||
case 1:
|
||||
*fec = FEC_1_2;
|
||||
break;
|
||||
case 3:
|
||||
*fec = FEC_2_3;
|
||||
break;
|
||||
case 4:
|
||||
*fec = FEC_3_4;
|
||||
break;
|
||||
case 5:
|
||||
*fec = FEC_4_5;
|
||||
break;
|
||||
case 6:
|
||||
*fec = FEC_5_6;
|
||||
break;
|
||||
case 7:
|
||||
*fec = FEC_7_8;
|
||||
break;
|
||||
case 2: /* *fec = FEC_3_5; break; */
|
||||
case 0: /* *fec = FEC_5_11; break; */
|
||||
*fec = FEC_AUTO;
|
||||
break;
|
||||
default:
|
||||
*fec = FEC_NONE; // can't happen
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* fixme: Symbol rates < 3MSps may not work because of precision loss */
|
||||
static int cx24123_get_fec(struct cx24123_state* state, fe_code_rate_t *fec)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = cx24123_readreg (state, 0x1b);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = ret & 0x07;
|
||||
|
||||
switch (ret) {
|
||||
case 1:
|
||||
*fec = FEC_1_2;
|
||||
break;
|
||||
case 2:
|
||||
*fec = FEC_2_3;
|
||||
break;
|
||||
case 3:
|
||||
*fec = FEC_3_4;
|
||||
break;
|
||||
case 4:
|
||||
*fec = FEC_4_5;
|
||||
break;
|
||||
case 5:
|
||||
*fec = FEC_5_6;
|
||||
break;
|
||||
case 6:
|
||||
*fec = FEC_6_7;
|
||||
break;
|
||||
case 7:
|
||||
*fec = FEC_7_8;
|
||||
break;
|
||||
default:
|
||||
/* this can happen when there's no lock */
|
||||
*fec = FEC_NONE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Approximation of closest integer of log2(a/b). It actually gives the
|
||||
lowest integer i such that 2^i >= round(a/b) */
|
||||
static u32 cx24123_int_log2(u32 a, u32 b)
|
||||
{
|
||||
u32 exp, nearest = 0;
|
||||
u32 div = a / b;
|
||||
if(a % b >= b / 2) ++div;
|
||||
if(div < (1 << 31))
|
||||
{
|
||||
for(exp = 1; div > exp; nearest++)
|
||||
exp += exp;
|
||||
}
|
||||
return nearest;
|
||||
}
|
||||
|
||||
static int cx24123_set_symbolrate(struct cx24123_state* state, u32 srate)
|
||||
{
|
||||
u32 val;
|
||||
u32 tmp, sample_rate, ratio, sample_gain;
|
||||
u8 pll_mult;
|
||||
|
||||
val = (srate / 1185) * 100;
|
||||
/* check if symbol rate is within limits */
|
||||
if ((srate > state->ops.info.symbol_rate_max) ||
|
||||
(srate < state->ops.info.symbol_rate_min))
|
||||
return -EOPNOTSUPP;;
|
||||
|
||||
/* Compensate for scaling up, by removing 17 symbols per 1Msps */
|
||||
val = val - (17 * (srate / 1000000));
|
||||
/* choose the sampling rate high enough for the required operation,
|
||||
while optimizing the power consumed by the demodulator */
|
||||
if (srate < (XTAL*2)/2)
|
||||
pll_mult = 2;
|
||||
else if (srate < (XTAL*3)/2)
|
||||
pll_mult = 3;
|
||||
else if (srate < (XTAL*4)/2)
|
||||
pll_mult = 4;
|
||||
else if (srate < (XTAL*5)/2)
|
||||
pll_mult = 5;
|
||||
else if (srate < (XTAL*6)/2)
|
||||
pll_mult = 6;
|
||||
else if (srate < (XTAL*7)/2)
|
||||
pll_mult = 7;
|
||||
else if (srate < (XTAL*8)/2)
|
||||
pll_mult = 8;
|
||||
else
|
||||
pll_mult = 9;
|
||||
|
||||
cx24123_writereg(state, 0x08, (val >> 16) & 0xff );
|
||||
cx24123_writereg(state, 0x09, (val >> 8) & 0xff );
|
||||
cx24123_writereg(state, 0x0a, (val ) & 0xff );
|
||||
|
||||
sample_rate = pll_mult * XTAL;
|
||||
|
||||
/*
|
||||
SYSSymbolRate[21:0] = (srate << 23) / sample_rate
|
||||
|
||||
We have to use 32 bit unsigned arithmetic without precision loss.
|
||||
The maximum srate is 45000000 or 0x02AEA540. This number has
|
||||
only 6 clear bits on top, hence we can shift it left only 6 bits
|
||||
at a time. Borrowed from cx24110.c
|
||||
*/
|
||||
|
||||
tmp = srate << 6;
|
||||
ratio = tmp / sample_rate;
|
||||
|
||||
tmp = (tmp % sample_rate) << 6;
|
||||
ratio = (ratio << 6) + (tmp / sample_rate);
|
||||
|
||||
tmp = (tmp % sample_rate) << 6;
|
||||
ratio = (ratio << 6) + (tmp / sample_rate);
|
||||
|
||||
tmp = (tmp % sample_rate) << 5;
|
||||
ratio = (ratio << 5) + (tmp / sample_rate);
|
||||
|
||||
|
||||
cx24123_writereg(state, 0x01, pll_mult * 6);
|
||||
|
||||
cx24123_writereg(state, 0x08, (ratio >> 16) & 0x3f );
|
||||
cx24123_writereg(state, 0x09, (ratio >> 8) & 0xff );
|
||||
cx24123_writereg(state, 0x0a, (ratio ) & 0xff );
|
||||
|
||||
/* also set the demodulator sample gain */
|
||||
sample_gain = cx24123_int_log2(sample_rate, srate);
|
||||
tmp = cx24123_readreg(state, 0x0c) & ~0xe0;
|
||||
cx24123_writereg(state, 0x0c, tmp | sample_gain << 5);
|
||||
|
||||
dprintk("%s: srate=%d, ratio=0x%08x, sample_rate=%i sample_gain=%d\n", __FUNCTION__, srate, ratio, sample_rate, sample_gain);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -437,6 +531,9 @@ static int cx24123_pll_calculate(struct dvb_frontend* fe, struct dvb_frontend_pa
|
|||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
u32 ndiv = 0, adiv = 0, vco_div = 0;
|
||||
int i = 0;
|
||||
int pump = 2;
|
||||
int band = 0;
|
||||
int num_bands = sizeof(cx24123_bandselect_vals) / sizeof(cx24123_bandselect_vals[0]);
|
||||
|
||||
/* Defaults for low freq, low rate */
|
||||
state->VCAarg = cx24123_AGC_vals[0].VCAprogdata;
|
||||
|
@ -444,38 +541,49 @@ static int cx24123_pll_calculate(struct dvb_frontend* fe, struct dvb_frontend_pa
|
|||
state->bandselectarg = cx24123_bandselect_vals[0].progdata;
|
||||
vco_div = cx24123_bandselect_vals[0].VCOdivider;
|
||||
|
||||
/* For the given symbolerate, determine the VCA and VGA programming bits */
|
||||
/* For the given symbol rate, determine the VCA, VGA and FILTUNE programming bits */
|
||||
for (i = 0; i < sizeof(cx24123_AGC_vals) / sizeof(cx24123_AGC_vals[0]); i++)
|
||||
{
|
||||
if ((cx24123_AGC_vals[i].symbolrate_low <= p->u.qpsk.symbol_rate) &&
|
||||
(cx24123_AGC_vals[i].symbolrate_high >= p->u.qpsk.symbol_rate) ) {
|
||||
(cx24123_AGC_vals[i].symbolrate_high >= p->u.qpsk.symbol_rate) ) {
|
||||
state->VCAarg = cx24123_AGC_vals[i].VCAprogdata;
|
||||
state->VGAarg = cx24123_AGC_vals[i].VGAprogdata;
|
||||
state->FILTune = cx24123_AGC_vals[i].FILTune;
|
||||
}
|
||||
}
|
||||
|
||||
/* For the given frequency, determine the bandselect programming bits */
|
||||
for (i = 0; i < sizeof(cx24123_bandselect_vals) / sizeof(cx24123_bandselect_vals[0]); i++)
|
||||
/* determine the band to use */
|
||||
if(force_band < 1 || force_band > num_bands)
|
||||
{
|
||||
if ((cx24123_bandselect_vals[i].freq_low <= p->frequency) &&
|
||||
(cx24123_bandselect_vals[i].freq_high >= p->frequency) ) {
|
||||
state->bandselectarg = cx24123_bandselect_vals[i].progdata;
|
||||
vco_div = cx24123_bandselect_vals[i].VCOdivider;
|
||||
for (i = 0; i < num_bands; i++)
|
||||
{
|
||||
if ((cx24123_bandselect_vals[i].freq_low <= p->frequency) &&
|
||||
(cx24123_bandselect_vals[i].freq_high >= p->frequency) )
|
||||
band = i;
|
||||
}
|
||||
}
|
||||
else
|
||||
band = force_band - 1;
|
||||
|
||||
state->bandselectarg = cx24123_bandselect_vals[band].progdata;
|
||||
vco_div = cx24123_bandselect_vals[band].VCOdivider;
|
||||
|
||||
/* determine the charge pump current */
|
||||
if ( p->frequency < (cx24123_bandselect_vals[band].freq_low + cx24123_bandselect_vals[band].freq_high)/2 )
|
||||
pump = 0x01;
|
||||
else
|
||||
pump = 0x02;
|
||||
|
||||
/* Determine the N/A dividers for the requested lband freq (in kHz). */
|
||||
/* Note: 10111 (kHz) is the Crystal Freq and divider of 10. */
|
||||
ndiv = ( ((p->frequency * vco_div) / (10111 / 10) / 2) / 32) & 0x1ff;
|
||||
adiv = ( ((p->frequency * vco_div) / (10111 / 10) / 2) % 32) & 0x1f;
|
||||
/* Note: the reference divider R=10, frequency is in KHz, XTAL is in Hz */
|
||||
ndiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) / 32) & 0x1ff;
|
||||
adiv = ( ((p->frequency * vco_div * 10) / (2 * XTAL / 1000)) % 32) & 0x1f;
|
||||
|
||||
if (adiv == 0)
|
||||
adiv++;
|
||||
ndiv++;
|
||||
|
||||
/* determine the correct pll frequency values. */
|
||||
/* Command 11, refdiv 11, cpump polarity 1, cpump current 3mA 10. */
|
||||
state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | (2 << 14);
|
||||
state->pllarg |= (ndiv << 5) | adiv;
|
||||
/* control bits 11, refdiv 11, charge pump polarity 1, charge pump current, ndiv, adiv */
|
||||
state->pllarg = (3 << 19) | (3 << 17) | (1 << 16) | (pump << 14) | (ndiv << 5) | adiv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -489,6 +597,8 @@ static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_par
|
|||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
unsigned long timeout;
|
||||
|
||||
dprintk("%s: pll writereg called, data=0x%08x\n",__FUNCTION__,data);
|
||||
|
||||
/* align the 21 bytes into to bit23 boundary */
|
||||
data = data << 3;
|
||||
|
||||
|
@ -538,6 +648,9 @@ static int cx24123_pll_writereg(struct dvb_frontend* fe, struct dvb_frontend_par
|
|||
static int cx24123_pll_tune(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
u8 val;
|
||||
|
||||
dprintk("frequency=%i\n", p->frequency);
|
||||
|
||||
if (cx24123_pll_calculate(fe, p) != 0) {
|
||||
printk("%s: cx24123_pll_calcutate failed\n",__FUNCTION__);
|
||||
|
@ -552,6 +665,14 @@ static int cx24123_pll_tune(struct dvb_frontend* fe, struct dvb_frontend_paramet
|
|||
cx24123_pll_writereg(fe, p, state->bandselectarg);
|
||||
cx24123_pll_writereg(fe, p, state->pllarg);
|
||||
|
||||
/* set the FILTUNE voltage */
|
||||
val = cx24123_readreg(state, 0x28) & ~0x3;
|
||||
cx24123_writereg(state, 0x27, state->FILTune >> 2);
|
||||
cx24123_writereg(state, 0x28, val | (state->FILTune & 0x3));
|
||||
|
||||
dprintk("%s: pll tune VCA=%d, band=%d, pll=%d\n",__FUNCTION__,state->VCAarg,
|
||||
state->bandselectarg,state->pllarg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -560,6 +681,8 @@ static int cx24123_initfe(struct dvb_frontend* fe)
|
|||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
int i;
|
||||
|
||||
dprintk("%s: init frontend\n",__FUNCTION__);
|
||||
|
||||
/* Configure the demod to a good set of defaults */
|
||||
for (i = 0; i < sizeof(cx24123_regdata) / sizeof(cx24123_regdata[0]); i++)
|
||||
cx24123_writereg(state, cx24123_regdata[i].reg, cx24123_regdata[i].data);
|
||||
|
@ -587,10 +710,13 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
|
|||
|
||||
switch (voltage) {
|
||||
case SEC_VOLTAGE_13:
|
||||
dprintk("%s: isl6421 voltage = 13V\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val & 0x32); /* V 13v */
|
||||
case SEC_VOLTAGE_18:
|
||||
dprintk("%s: isl6421 voltage = 18V\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val | 0x04); /* H 18v */
|
||||
case SEC_VOLTAGE_OFF:
|
||||
dprintk("%s: isl5421 voltage off\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val & 0x30);
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -624,13 +750,93 @@ static int cx24123_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_send_diseqc_msg(struct dvb_frontend* fe,
|
||||
struct dvb_diseqc_master_cmd *cmd)
|
||||
/* wait for diseqc queue to become ready (or timeout) */
|
||||
static void cx24123_wait_for_diseqc(struct cx24123_state *state)
|
||||
{
|
||||
/* fixme: Implement diseqc */
|
||||
printk("%s: No support yet\n",__FUNCTION__);
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(200);
|
||||
while (!(cx24123_readreg(state, 0x29) & 0x40)) {
|
||||
if(time_after(jiffies, timeout)) {
|
||||
printk("%s: diseqc queue not ready, command may be lost.\n", __FUNCTION__);
|
||||
break;
|
||||
}
|
||||
msleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
return -ENOTSUPP;
|
||||
static int cx24123_send_diseqc_msg(struct dvb_frontend* fe, struct dvb_diseqc_master_cmd *cmd)
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
int i, val;
|
||||
|
||||
dprintk("%s:\n",__FUNCTION__);
|
||||
|
||||
/* check if continuous tone has been stopped */
|
||||
if (state->config->use_isl6421)
|
||||
val = cx24123_readlnbreg(state, 0x00) & 0x10;
|
||||
else
|
||||
val = cx24123_readreg(state, 0x29) & 0x10;
|
||||
|
||||
|
||||
if (val) {
|
||||
printk("%s: ERROR: attempt to send diseqc command before tone is off\n", __FUNCTION__);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
/* wait for diseqc queue ready */
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
/* select tone mode */
|
||||
cx24123_writereg(state, 0x2a, cx24123_readreg(state, 0x2a) & 0xf8);
|
||||
|
||||
for (i = 0; i < cmd->msg_len; i++)
|
||||
cx24123_writereg(state, 0x2C + i, cmd->msg[i]);
|
||||
|
||||
val = cx24123_readreg(state, 0x29);
|
||||
cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40) | ((cmd->msg_len-3) & 3));
|
||||
|
||||
/* wait for diseqc message to finish sending */
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t burst)
|
||||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
int val;
|
||||
|
||||
dprintk("%s:\n", __FUNCTION__);
|
||||
|
||||
/* check if continuous tone has been stoped */
|
||||
if (state->config->use_isl6421)
|
||||
val = cx24123_readlnbreg(state, 0x00) & 0x10;
|
||||
else
|
||||
val = cx24123_readreg(state, 0x29) & 0x10;
|
||||
|
||||
|
||||
if (val) {
|
||||
printk("%s: ERROR: attempt to send diseqc command before tone is off\n", __FUNCTION__);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
/* select tone mode */
|
||||
val = cx24123_readreg(state, 0x2a) & 0xf8;
|
||||
cx24123_writereg(state, 0x2a, val | 0x04);
|
||||
|
||||
val = cx24123_readreg(state, 0x29);
|
||||
|
||||
if (burst == SEC_MINI_A)
|
||||
cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x00));
|
||||
else if (burst == SEC_MINI_B)
|
||||
cx24123_writereg(state, 0x29, ((val & 0x90) | 0x40 | 0x08));
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
cx24123_wait_for_diseqc(state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx24123_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
||||
|
@ -642,13 +848,15 @@ static int cx24123_read_status(struct dvb_frontend* fe, fe_status_t* status)
|
|||
|
||||
*status = 0;
|
||||
if (lock & 0x01)
|
||||
*status |= FE_HAS_CARRIER | FE_HAS_SIGNAL;
|
||||
*status |= FE_HAS_SIGNAL;
|
||||
if (sync & 0x02)
|
||||
*status |= FE_HAS_CARRIER;
|
||||
if (sync & 0x04)
|
||||
*status |= FE_HAS_VITERBI;
|
||||
if (sync & 0x08)
|
||||
*status |= FE_HAS_CARRIER;
|
||||
*status |= FE_HAS_SYNC;
|
||||
if (sync & 0x80)
|
||||
*status |= FE_HAS_SYNC | FE_HAS_LOCK;
|
||||
*status |= FE_HAS_LOCK;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -681,6 +889,8 @@ static int cx24123_read_ber(struct dvb_frontend* fe, u32* ber)
|
|||
else
|
||||
state->snr = 0;
|
||||
|
||||
dprintk("%s: BER = %d, S/N index = %d\n",__FUNCTION__,state->lastber, state->snr);
|
||||
|
||||
*ber = state->lastber;
|
||||
|
||||
return 0;
|
||||
|
@ -691,6 +901,8 @@ static int cx24123_read_signal_strength(struct dvb_frontend* fe, u16* signal_str
|
|||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
*signal_strength = cx24123_readreg(state, 0x3b) << 8; /* larger = better */
|
||||
|
||||
dprintk("%s: Signal strength = %d\n",__FUNCTION__,*signal_strength);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -699,6 +911,8 @@ static int cx24123_read_snr(struct dvb_frontend* fe, u16* snr)
|
|||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
*snr = state->snr;
|
||||
|
||||
dprintk("%s: read S/N index = %d\n",__FUNCTION__,*snr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -707,6 +921,8 @@ static int cx24123_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
|
|||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
*ucblocks = state->lastber;
|
||||
|
||||
dprintk("%s: ucblocks (ber) = %d\n",__FUNCTION__,*ucblocks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -714,6 +930,8 @@ static int cx24123_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
|
|||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
|
||||
dprintk("%s: set_frontend\n",__FUNCTION__);
|
||||
|
||||
if (state->config->set_ts_params)
|
||||
state->config->set_ts_params(fe, 0);
|
||||
|
||||
|
@ -737,6 +955,8 @@ static int cx24123_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
|
|||
{
|
||||
struct cx24123_state *state = fe->demodulator_priv;
|
||||
|
||||
dprintk("%s: get_frontend\n",__FUNCTION__);
|
||||
|
||||
if (cx24123_get_inversion(state, &p->inversion) != 0) {
|
||||
printk("%s: Failed to get inversion status\n",__FUNCTION__);
|
||||
return -EREMOTEIO;
|
||||
|
@ -763,8 +983,10 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
|
|||
|
||||
switch (tone) {
|
||||
case SEC_TONE_ON:
|
||||
dprintk("%s: isl6421 sec tone on\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val | 0x10);
|
||||
case SEC_TONE_OFF:
|
||||
dprintk("%s: isl6421 sec tone off\n",__FUNCTION__);
|
||||
return cx24123_writelnbreg(state, 0x0, val & 0x2f);
|
||||
default:
|
||||
printk("%s: CASE reached default with tone=%d\n", __FUNCTION__, tone);
|
||||
|
@ -855,12 +1077,13 @@ static struct dvb_frontend_ops cx24123_ops = {
|
|||
.frequency_min = 950000,
|
||||
.frequency_max = 2150000,
|
||||
.frequency_stepsize = 1011, /* kHz for QPSK frontends */
|
||||
.frequency_tolerance = 29500,
|
||||
.frequency_tolerance = 5000,
|
||||
.symbol_rate_min = 1000000,
|
||||
.symbol_rate_max = 45000000,
|
||||
.caps = FE_CAN_INVERSION_AUTO |
|
||||
FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
|
||||
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
|
||||
FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
|
||||
FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
|
||||
FE_CAN_QPSK | FE_CAN_RECOVER
|
||||
},
|
||||
|
||||
|
@ -875,12 +1098,16 @@ static struct dvb_frontend_ops cx24123_ops = {
|
|||
.read_snr = cx24123_read_snr,
|
||||
.read_ucblocks = cx24123_read_ucblocks,
|
||||
.diseqc_send_master_cmd = cx24123_send_diseqc_msg,
|
||||
.diseqc_send_burst = cx24123_diseqc_send_burst,
|
||||
.set_tone = cx24123_set_tone,
|
||||
.set_voltage = cx24123_set_voltage,
|
||||
};
|
||||
|
||||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
|
||||
MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
|
||||
|
||||
module_param(force_band, int, 0644);
|
||||
MODULE_PARM_DESC(force_band, "Force a specific band select (1-9, default:off).");
|
||||
|
||||
MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24123/cx24109 hardware");
|
||||
MODULE_AUTHOR("Steven Toth");
|
||||
|
|
|
@ -235,8 +235,8 @@ struct dvb_pll_desc dvb_pll_tdvs_tua6034 = {
|
|||
.max = 863000000,
|
||||
.count = 3,
|
||||
.entries = {
|
||||
{ 160000000, 44000000, 62500, 0xce, 0x01 },
|
||||
{ 455000000, 44000000, 62500, 0xce, 0x02 },
|
||||
{ 165000000, 44000000, 62500, 0xce, 0x01 },
|
||||
{ 450000000, 44000000, 62500, 0xce, 0x02 },
|
||||
{ 999999999, 44000000, 62500, 0xce, 0x04 },
|
||||
},
|
||||
};
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
obj-$(CONFIG_DVB_PLUTO2) = pluto2.o
|
||||
obj-$(CONFIG_DVB_PLUTO2) += pluto2.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
config DVB_AV7110
|
||||
tristate "AV7110 cards"
|
||||
depends on DVB_CORE && PCI
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select FW_LOADER
|
||||
select VIDEO_DEV
|
||||
select VIDEO_SAA7146_VV
|
||||
select DVB_VES1820
|
||||
select DVB_VES1X93
|
||||
|
@ -59,7 +58,7 @@ config DVB_AV7110_OSD
|
|||
|
||||
config DVB_BUDGET
|
||||
tristate "Budget cards"
|
||||
depends on DVB_CORE && PCI
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146
|
||||
select DVB_STV0299
|
||||
select DVB_VES1X93
|
||||
|
@ -80,7 +79,7 @@ config DVB_BUDGET
|
|||
|
||||
config DVB_BUDGET_CI
|
||||
tristate "Budget cards with onboard CI connector"
|
||||
depends on DVB_CORE && PCI
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146
|
||||
select DVB_STV0297
|
||||
select DVB_STV0299
|
||||
|
@ -100,8 +99,7 @@ config DVB_BUDGET_CI
|
|||
|
||||
config DVB_BUDGET_AV
|
||||
tristate "Budget cards with analog video inputs"
|
||||
depends on DVB_CORE && PCI
|
||||
select VIDEO_DEV
|
||||
depends on DVB_CORE && PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select DVB_STV0299
|
||||
select DVB_TDA1004X
|
||||
|
@ -119,7 +117,7 @@ config DVB_BUDGET_AV
|
|||
|
||||
config DVB_BUDGET_PATCH
|
||||
tristate "AV7110 cards with Budget Patch"
|
||||
depends on DVB_CORE && DVB_BUDGET
|
||||
depends on DVB_CORE && DVB_BUDGET && VIDEO_V4L1
|
||||
select DVB_AV7110
|
||||
select DVB_STV0299
|
||||
select DVB_VES1X93
|
||||
|
|
|
@ -1190,8 +1190,6 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
|||
SAA7146_HPS_SYNC_PORT_A);
|
||||
|
||||
saa7113_setinput(budget_av, 0);
|
||||
} else {
|
||||
ciintf_init(budget_av);
|
||||
}
|
||||
|
||||
/* fixme: find some sane values here... */
|
||||
|
@ -1211,6 +1209,10 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio
|
|||
budget_av->budget.dvb_adapter.priv = budget_av;
|
||||
frontend_init(budget_av);
|
||||
|
||||
if (!budget_av->has_saa7113) {
|
||||
ciintf_init(budget_av);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@ struct budget_ci {
|
|||
struct tasklet_struct msp430_irq_tasklet;
|
||||
struct tasklet_struct ciintf_irq_tasklet;
|
||||
int slot_status;
|
||||
int ci_irq;
|
||||
struct dvb_ca_en50221 ca;
|
||||
char ir_dev_name[50];
|
||||
u8 tuner_pll_address; /* used for philips_tdm1316l configs */
|
||||
|
@ -276,8 +277,10 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
|
|||
if (slot != 0)
|
||||
return -EINVAL;
|
||||
|
||||
// trigger on RISING edge during reset so we know when READY is re-asserted
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
if (budget_ci->ci_irq) {
|
||||
// trigger on RISING edge during reset so we know when READY is re-asserted
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
}
|
||||
budget_ci->slot_status = SLOTSTATUS_RESET;
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
|
||||
msleep(1);
|
||||
|
@ -370,11 +373,50 @@ static void ciintf_interrupt(unsigned long data)
|
|||
}
|
||||
}
|
||||
|
||||
static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open)
|
||||
{
|
||||
struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
|
||||
unsigned int flags;
|
||||
|
||||
// ensure we don't get spurious IRQs during initialisation
|
||||
if (!budget_ci->budget.ci_present)
|
||||
return -EINVAL;
|
||||
|
||||
// read the CAM status
|
||||
flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
|
||||
if (flags & CICONTROL_CAMDETECT) {
|
||||
// mark it as present if it wasn't before
|
||||
if (budget_ci->slot_status & SLOTSTATUS_NONE) {
|
||||
budget_ci->slot_status = SLOTSTATUS_PRESENT;
|
||||
}
|
||||
|
||||
// during a RESET, we check if we can read from IO memory to see when CAM is ready
|
||||
if (budget_ci->slot_status & SLOTSTATUS_RESET) {
|
||||
if (ciintf_read_attribute_mem(ca, slot, 0) == 0x1d) {
|
||||
budget_ci->slot_status = SLOTSTATUS_READY;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
budget_ci->slot_status = SLOTSTATUS_NONE;
|
||||
}
|
||||
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE) {
|
||||
if (budget_ci->slot_status & SLOTSTATUS_READY) {
|
||||
return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
|
||||
}
|
||||
return DVB_CA_EN50221_POLL_CAM_PRESENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ciintf_init(struct budget_ci *budget_ci)
|
||||
{
|
||||
struct saa7146_dev *saa = budget_ci->budget.dev;
|
||||
int flags;
|
||||
int result;
|
||||
int ci_version;
|
||||
int ca_flags;
|
||||
|
||||
memset(&budget_ci->ca, 0, sizeof(struct dvb_ca_en50221));
|
||||
|
||||
|
@ -382,16 +424,29 @@ static int ciintf_init(struct budget_ci *budget_ci)
|
|||
saa7146_write(saa, MC1, saa7146_read(saa, MC1) | (0x800 << 16) | 0x800);
|
||||
|
||||
// test if it is there
|
||||
if ((ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0) & 0xa0) != 0xa0) {
|
||||
ci_version = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0);
|
||||
if ((ci_version & 0xa0) != 0xa0) {
|
||||
result = -ENODEV;
|
||||
goto error;
|
||||
}
|
||||
|
||||
// determine whether a CAM is present or not
|
||||
flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
|
||||
budget_ci->slot_status = SLOTSTATUS_NONE;
|
||||
if (flags & CICONTROL_CAMDETECT)
|
||||
budget_ci->slot_status = SLOTSTATUS_PRESENT;
|
||||
|
||||
// version 0xa2 of the CI firmware doesn't generate interrupts
|
||||
if (ci_version == 0xa2) {
|
||||
ca_flags = 0;
|
||||
budget_ci->ci_irq = 0;
|
||||
} else {
|
||||
ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE |
|
||||
DVB_CA_EN50221_FLAG_IRQ_FR |
|
||||
DVB_CA_EN50221_FLAG_IRQ_DA;
|
||||
budget_ci->ci_irq = 1;
|
||||
}
|
||||
|
||||
// register CI interface
|
||||
budget_ci->ca.owner = THIS_MODULE;
|
||||
budget_ci->ca.read_attribute_mem = ciintf_read_attribute_mem;
|
||||
|
@ -401,23 +456,27 @@ static int ciintf_init(struct budget_ci *budget_ci)
|
|||
budget_ci->ca.slot_reset = ciintf_slot_reset;
|
||||
budget_ci->ca.slot_shutdown = ciintf_slot_shutdown;
|
||||
budget_ci->ca.slot_ts_enable = ciintf_slot_ts_enable;
|
||||
budget_ci->ca.poll_slot_status = ciintf_poll_slot_status;
|
||||
budget_ci->ca.data = budget_ci;
|
||||
if ((result = dvb_ca_en50221_init(&budget_ci->budget.dvb_adapter,
|
||||
&budget_ci->ca,
|
||||
DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE |
|
||||
DVB_CA_EN50221_FLAG_IRQ_FR |
|
||||
DVB_CA_EN50221_FLAG_IRQ_DA, 1)) != 0) {
|
||||
ca_flags, 1)) != 0) {
|
||||
printk("budget_ci: CI interface detected, but initialisation failed.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
// Setup CI slot IRQ
|
||||
tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci);
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE) {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
|
||||
} else {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
if (budget_ci->ci_irq) {
|
||||
tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci);
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE) {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
|
||||
} else {
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
|
||||
}
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_03);
|
||||
}
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_03);
|
||||
|
||||
// enable interface
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
|
||||
CICONTROL_RESET, 1, 0);
|
||||
|
||||
|
@ -426,10 +485,12 @@ static int ciintf_init(struct budget_ci *budget_ci)
|
|||
budget_ci->budget.ci_present = 1;
|
||||
|
||||
// forge a fake CI IRQ so the CAM state is setup correctly
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_REMOVED;
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE)
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_INSERTED;
|
||||
dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags);
|
||||
if (budget_ci->ci_irq) {
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_REMOVED;
|
||||
if (budget_ci->slot_status != SLOTSTATUS_NONE)
|
||||
flags = DVB_CA_EN50221_CAMCHANGE_INSERTED;
|
||||
dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -443,9 +504,13 @@ static void ciintf_deinit(struct budget_ci *budget_ci)
|
|||
struct saa7146_dev *saa = budget_ci->budget.dev;
|
||||
|
||||
// disable CI interrupts
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_03);
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT);
|
||||
tasklet_kill(&budget_ci->ciintf_irq_tasklet);
|
||||
if (budget_ci->ci_irq) {
|
||||
saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_03);
|
||||
saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT);
|
||||
tasklet_kill(&budget_ci->ciintf_irq_tasklet);
|
||||
}
|
||||
|
||||
// reset interface
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
|
||||
msleep(1);
|
||||
ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
|
||||
|
@ -473,7 +538,7 @@ static void budget_ci_irq(struct saa7146_dev *dev, u32 * isr)
|
|||
if (*isr & MASK_10)
|
||||
ttpci_budget_irq10_handler(dev, isr);
|
||||
|
||||
if ((*isr & MASK_03) && (budget_ci->budget.ci_present))
|
||||
if ((*isr & MASK_03) && (budget_ci->budget.ci_present) && (budget_ci->ci_irq))
|
||||
tasklet_schedule(&budget_ci->ciintf_irq_tasklet);
|
||||
}
|
||||
|
||||
|
|
|
@ -1507,7 +1507,11 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|||
|
||||
mutex_unlock(&ttusb->semi2c);
|
||||
|
||||
dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE);
|
||||
if ((result = dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE)) < 0) {
|
||||
ttusb_free_iso_urbs(ttusb);
|
||||
kfree(ttusb);
|
||||
return result;
|
||||
}
|
||||
ttusb->adapter.priv = ttusb;
|
||||
|
||||
/* i2c */
|
||||
|
|
|
@ -7,7 +7,7 @@ menu "Radio Adapters"
|
|||
|
||||
config RADIO_CADET
|
||||
tristate "ADS Cadet AM/FM Tuner"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these AM/FM radio cards, and then
|
||||
fill in the port address below.
|
||||
|
@ -25,7 +25,7 @@ config RADIO_CADET
|
|||
|
||||
config RADIO_RTRACK
|
||||
tristate "AIMSlab RadioTrack (aka RadioReveal) support"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address below.
|
||||
|
@ -59,7 +59,7 @@ config RADIO_RTRACK_PORT
|
|||
|
||||
config RADIO_RTRACK2
|
||||
tristate "AIMSlab RadioTrack II support"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card, and then fill in the
|
||||
port address below.
|
||||
|
@ -82,7 +82,7 @@ config RADIO_RTRACK2_PORT
|
|||
|
||||
config RADIO_AZTECH
|
||||
tristate "Aztech/Packard Bell Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address below.
|
||||
|
@ -106,7 +106,7 @@ config RADIO_AZTECH_PORT
|
|||
|
||||
config RADIO_GEMTEK
|
||||
tristate "GemTek Radio Card support"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card, and then fill in the
|
||||
port address below.
|
||||
|
@ -131,7 +131,7 @@ config RADIO_GEMTEK_PORT
|
|||
|
||||
config RADIO_GEMTEK_PCI
|
||||
tristate "GemTek PCI Radio Card support"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on VIDEO_V4L1 && PCI
|
||||
---help---
|
||||
Choose Y here if you have this PCI FM radio card.
|
||||
|
||||
|
@ -145,7 +145,7 @@ config RADIO_GEMTEK_PCI
|
|||
|
||||
config RADIO_MAXIRADIO
|
||||
tristate "Guillemot MAXI Radio FM 2000 radio"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on VIDEO_V4L1 && PCI
|
||||
---help---
|
||||
Choose Y here if you have this radio card. This card may also be
|
||||
found as Gemtek PCI FM.
|
||||
|
@ -160,7 +160,7 @@ config RADIO_MAXIRADIO
|
|||
|
||||
config RADIO_MAESTRO
|
||||
tristate "Maestro on board radio"
|
||||
depends on VIDEO_DEV
|
||||
depends on VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here to directly support the on-board radio tuner on the
|
||||
Maestro 2 or 2E sound card.
|
||||
|
@ -175,7 +175,7 @@ config RADIO_MAESTRO
|
|||
|
||||
config RADIO_MIROPCM20
|
||||
tristate "miroSOUND PCM20 radio"
|
||||
depends on ISA && VIDEO_DEV && SOUND_ACI_MIXER
|
||||
depends on ISA && VIDEO_V4L1 && SOUND_ACI_MIXER
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card. You also need to say Y
|
||||
to "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)" (in "Sound")
|
||||
|
@ -208,7 +208,7 @@ config RADIO_MIROPCM20_RDS
|
|||
|
||||
config RADIO_SF16FMI
|
||||
tristate "SF16FMI Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards. If you
|
||||
compile the driver into the kernel and your card is not PnP one, you
|
||||
|
@ -225,7 +225,7 @@ config RADIO_SF16FMI
|
|||
|
||||
config RADIO_SF16FMR2
|
||||
tristate "SF16FMR2 Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards.
|
||||
|
||||
|
@ -239,7 +239,7 @@ config RADIO_SF16FMR2
|
|||
|
||||
config RADIO_TERRATEC
|
||||
tristate "TerraTec ActiveRadio ISA Standalone"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have this FM radio card, and then fill in the
|
||||
port address below. (TODO)
|
||||
|
@ -268,7 +268,7 @@ config RADIO_TERRATEC_PORT
|
|||
|
||||
config RADIO_TRUST
|
||||
tristate "Trust FM radio card"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
help
|
||||
This is a driver for the Trust FM radio cards. Say Y if you have
|
||||
such a card and want to use it under Linux.
|
||||
|
@ -286,7 +286,7 @@ config RADIO_TRUST_PORT
|
|||
|
||||
config RADIO_TYPHOON
|
||||
tristate "Typhoon Radio (a.k.a. EcoRadio)"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address and the frequency used for muting below.
|
||||
|
@ -330,7 +330,7 @@ config RADIO_TYPHOON_MUTEFREQ
|
|||
|
||||
config RADIO_ZOLTRIX
|
||||
tristate "Zoltrix Radio"
|
||||
depends on ISA && VIDEO_DEV
|
||||
depends on ISA && VIDEO_V4L1
|
||||
---help---
|
||||
Choose Y here if you have one of these FM radio cards, and then fill
|
||||
in the port address below.
|
||||
|
|
|
@ -2,10 +2,10 @@
|
|||
# Multimedia Video device configuration
|
||||
#
|
||||
|
||||
menu "Video For Linux"
|
||||
menu "Video Capture Adapters"
|
||||
depends on VIDEO_DEV
|
||||
|
||||
comment "Video Adapters"
|
||||
comment "Video Capture Adapters"
|
||||
|
||||
config VIDEO_ADV_DEBUG
|
||||
bool "Enable advanced debug functionality"
|
||||
|
@ -16,11 +16,23 @@ config VIDEO_ADV_DEBUG
|
|||
V4L devices.
|
||||
In doubt, say N.
|
||||
|
||||
config VIDEO_VIVI
|
||||
tristate "Virtual Video Driver"
|
||||
depends on VIDEO_V4L2 && !SPARC32 && !SPARC64
|
||||
select VIDEO_BUF
|
||||
default n
|
||||
---help---
|
||||
Enables a virtual video driver. This device shows a color bar
|
||||
and a timestamp, as a real device would generate by using V4L2
|
||||
api.
|
||||
Say Y here if you want to test video apps or debug V4L devices.
|
||||
In doubt, say N.
|
||||
|
||||
source "drivers/media/video/bt8xx/Kconfig"
|
||||
|
||||
config VIDEO_SAA6588
|
||||
tristate "SAA6588 Radio Chip RDS decoder support on BT848 cards"
|
||||
depends on VIDEO_DEV && I2C && VIDEO_BT848
|
||||
depends on I2C && VIDEO_BT848
|
||||
|
||||
help
|
||||
Support for Radio Data System (RDS) decoder. This allows seeing
|
||||
|
@ -32,7 +44,7 @@ config VIDEO_SAA6588
|
|||
|
||||
config VIDEO_PMS
|
||||
tristate "Mediavision Pro Movie Studio Video For Linux"
|
||||
depends on VIDEO_DEV && ISA
|
||||
depends on ISA && VIDEO_V4L1
|
||||
help
|
||||
Say Y if you have such a thing.
|
||||
|
||||
|
@ -41,7 +53,7 @@ config VIDEO_PMS
|
|||
|
||||
config VIDEO_PLANB
|
||||
tristate "PlanB Video-In on PowerMac"
|
||||
depends on PPC_PMAC && VIDEO_DEV && BROKEN
|
||||
depends on PPC_PMAC && VIDEO_V4L1 && BROKEN
|
||||
help
|
||||
PlanB is the V4L driver for the PowerMac 7x00/8x00 series video
|
||||
input hardware. If you want to experiment with this, say Y.
|
||||
|
@ -52,7 +64,7 @@ config VIDEO_PLANB
|
|||
|
||||
config VIDEO_BWQCAM
|
||||
tristate "Quickcam BW Video For Linux"
|
||||
depends on VIDEO_DEV && PARPORT
|
||||
depends on PARPORT && VIDEO_V4L1
|
||||
help
|
||||
Say Y have if you the black and white version of the QuickCam
|
||||
camera. See the next option for the color version.
|
||||
|
@ -62,7 +74,7 @@ config VIDEO_BWQCAM
|
|||
|
||||
config VIDEO_CQCAM
|
||||
tristate "QuickCam Colour Video For Linux (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && VIDEO_DEV && PARPORT
|
||||
depends on EXPERIMENTAL && PARPORT && VIDEO_V4L1
|
||||
help
|
||||
This is the video4linux driver for the colour version of the
|
||||
Connectix QuickCam. If you have one of these cameras, say Y here,
|
||||
|
@ -73,7 +85,7 @@ config VIDEO_CQCAM
|
|||
|
||||
config VIDEO_W9966
|
||||
tristate "W9966CF Webcam (FlyCam Supra and others) Video For Linux"
|
||||
depends on PARPORT_1284 && VIDEO_DEV && PARPORT
|
||||
depends on PARPORT_1284 && PARPORT && VIDEO_V4L1
|
||||
help
|
||||
Video4linux driver for Winbond's w9966 based Webcams.
|
||||
Currently tested with the LifeView FlyCam Supra.
|
||||
|
@ -86,7 +98,7 @@ config VIDEO_W9966
|
|||
|
||||
config VIDEO_CPIA
|
||||
tristate "CPiA Video For Linux"
|
||||
depends on VIDEO_DEV
|
||||
depends on VIDEO_V4L1
|
||||
---help---
|
||||
This is the video4linux driver for cameras based on Vision's CPiA
|
||||
(Colour Processor Interface ASIC), such as the Creative Labs Video
|
||||
|
@ -123,7 +135,7 @@ source "drivers/media/video/cpia2/Kconfig"
|
|||
|
||||
config VIDEO_SAA5246A
|
||||
tristate "SAA5246A, SAA5281 Teletext processor"
|
||||
depends on VIDEO_DEV && I2C
|
||||
depends on I2C && VIDEO_V4L1
|
||||
help
|
||||
Support for I2C bus based teletext using the SAA5246A or SAA5281
|
||||
chip. Useful only if you live in Europe.
|
||||
|
@ -150,7 +162,7 @@ config TUNER_3036
|
|||
|
||||
config VIDEO_VINO
|
||||
tristate "SGI Vino Video For Linux (EXPERIMENTAL)"
|
||||
depends on VIDEO_DEV && I2C && SGI_IP22 && EXPERIMENTAL
|
||||
depends on I2C && SGI_IP22 && EXPERIMENTAL && VIDEO_V4L1
|
||||
select I2C_ALGO_SGI
|
||||
help
|
||||
Say Y here to build in support for the Vino video input system found
|
||||
|
@ -158,7 +170,7 @@ config VIDEO_VINO
|
|||
|
||||
config VIDEO_STRADIS
|
||||
tristate "Stradis 4:2:2 MPEG-2 video driver (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && VIDEO_DEV && PCI
|
||||
depends on EXPERIMENTAL && PCI && VIDEO_V4L1
|
||||
help
|
||||
Say Y here to enable support for the Stradis 4:2:2 MPEG-2 video
|
||||
driver for PCI. There is a product page at
|
||||
|
@ -166,7 +178,7 @@ config VIDEO_STRADIS
|
|||
|
||||
config VIDEO_ZORAN
|
||||
tristate "Zoran ZR36057/36067 Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && I2C_ALGOBIT
|
||||
depends on PCI && I2C_ALGOBIT && VIDEO_V4L1
|
||||
help
|
||||
Say Y for support for MJPEG capture cards based on the Zoran
|
||||
36057/36067 PCI controller chipset. This includes the Iomega
|
||||
|
@ -214,7 +226,7 @@ config VIDEO_ZORAN_LML33R10
|
|||
|
||||
config VIDEO_ZR36120
|
||||
tristate "Zoran ZR36120/36125 Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && I2C && BROKEN
|
||||
depends on PCI && I2C && VIDEO_V4L1 && BROKEN
|
||||
help
|
||||
Support for ZR36120/ZR36125 based frame grabber/overlay boards.
|
||||
This includes the Victor II, WaveWatcher, Video Wonder, Maxi-TV,
|
||||
|
@ -226,7 +238,7 @@ config VIDEO_ZR36120
|
|||
|
||||
config VIDEO_MEYE
|
||||
tristate "Sony Vaio Picturebook Motion Eye Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && SONYPI
|
||||
depends on PCI && SONYPI && VIDEO_V4L1
|
||||
---help---
|
||||
This is the video4linux driver for the Motion Eye camera found
|
||||
in the Vaio Picturebook laptops. Please read the material in
|
||||
|
@ -242,7 +254,7 @@ source "drivers/media/video/saa7134/Kconfig"
|
|||
|
||||
config VIDEO_MXB
|
||||
tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_TUNER
|
||||
---help---
|
||||
|
@ -254,8 +266,9 @@ config VIDEO_MXB
|
|||
|
||||
config VIDEO_DPC
|
||||
tristate "Philips-Semiconductors 'dpc7146 demonstration board'"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
This is a video4linux driver for the 'dpc7146 demonstration
|
||||
board' by Philips-Semiconductors. It's the reference design
|
||||
|
@ -268,8 +281,9 @@ config VIDEO_DPC
|
|||
|
||||
config VIDEO_HEXIUM_ORION
|
||||
tristate "Hexium HV-PCI6 and Orion frame grabber"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
This is a video4linux driver for the Hexium HV-PCI6 and
|
||||
Orion frame grabber cards by Hexium.
|
||||
|
@ -279,8 +293,9 @@ config VIDEO_HEXIUM_ORION
|
|||
|
||||
config VIDEO_HEXIUM_GEMINI
|
||||
tristate "Hexium Gemini frame grabber"
|
||||
depends on VIDEO_DEV && PCI
|
||||
depends on PCI && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
This is a video4linux driver for the Hexium Gemini frame
|
||||
grabber card by Hexium. Please note that the Gemini Dual
|
||||
|
@ -293,7 +308,7 @@ source "drivers/media/video/cx88/Kconfig"
|
|||
|
||||
config VIDEO_OVCAMCHIP
|
||||
tristate "OmniVision Camera Chip support"
|
||||
depends on VIDEO_DEV && I2C
|
||||
depends on I2C && VIDEO_V4L1
|
||||
---help---
|
||||
Support for the OmniVision OV6xxx and OV7xxx series of camera chips.
|
||||
This driver is intended to be used with the ov511 and w9968cf USB
|
||||
|
@ -304,7 +319,7 @@ config VIDEO_OVCAMCHIP
|
|||
|
||||
config VIDEO_M32R_AR
|
||||
tristate "AR devices"
|
||||
depends on M32R
|
||||
depends on M32R && VIDEO_V4L1
|
||||
---help---
|
||||
This is a video4linux driver for the Renesas AR (Artificial Retina)
|
||||
camera module.
|
||||
|
@ -365,17 +380,17 @@ config VIDEO_WM8739
|
|||
source "drivers/media/video/cx25840/Kconfig"
|
||||
|
||||
config VIDEO_SAA711X
|
||||
tristate "Philips SAA7113/4/5 video decoders"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
tristate "Philips SAA7113/4/5 video decoders (OBSOLETED)"
|
||||
depends on VIDEO_V4L1 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the Philips SAA7113/4/5 video decoders.
|
||||
Old support for the Philips SAA7113/4 video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called saa7115.
|
||||
|
||||
config VIDEO_SAA7127
|
||||
tristate "Philips SAA7127/9 digital video encoders"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the Philips SAA7127/9 digital video encoders.
|
||||
|
||||
|
@ -384,7 +399,7 @@ config VIDEO_SAA7127
|
|||
|
||||
config VIDEO_UPD64031A
|
||||
tristate "NEC Electronics uPD64031A Ghost Reduction"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the NEC Electronics uPD64031A Ghost Reduction
|
||||
video chip. It is most often found in NTSC TV cards made for
|
||||
|
@ -396,7 +411,7 @@ config VIDEO_UPD64031A
|
|||
|
||||
config VIDEO_UPD64083
|
||||
tristate "NEC Electronics uPD64083 3-Dimensional Y/C separation"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
depends on VIDEO_V4L2 && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the NEC Electronics uPD64083 3-Dimensional Y/C
|
||||
separation video chip. It is used to improve the quality of
|
||||
|
@ -418,7 +433,7 @@ source "drivers/media/video/em28xx/Kconfig"
|
|||
|
||||
config USB_DSBR
|
||||
tristate "D-Link USB FM radio support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_DEV && EXPERIMENTAL
|
||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
||||
---help---
|
||||
Say Y here if you want to connect this type of radio to your
|
||||
computer's USB port. Note that the audio is not digital, and
|
||||
|
@ -434,7 +449,7 @@ source "drivers/media/video/et61x251/Kconfig"
|
|||
|
||||
config USB_OV511
|
||||
tristate "USB OV511 Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. See <file:Documentation/video4linux/ov511.txt>
|
||||
|
@ -445,7 +460,7 @@ config USB_OV511
|
|||
|
||||
config USB_SE401
|
||||
tristate "USB SE401 Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. See <file:Documentation/video4linux/se401.txt>
|
||||
|
@ -458,7 +473,7 @@ source "drivers/media/video/sn9c102/Kconfig"
|
|||
|
||||
config USB_STV680
|
||||
tristate "USB STV680 (Pencam) Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. This includes the Pencam line of cameras.
|
||||
|
@ -470,7 +485,7 @@ config USB_STV680
|
|||
|
||||
config USB_W9968CF
|
||||
tristate "USB W996[87]CF JPEG Dual Mode Camera support"
|
||||
depends on USB && VIDEO_DEV && I2C
|
||||
depends on USB && VIDEO_V4L1 && I2C
|
||||
select VIDEO_OVCAMCHIP
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on OV681 or
|
||||
|
|
|
@ -10,7 +10,8 @@ tuner-objs := tuner-core.o tuner-types.o tuner-simple.o \
|
|||
|
||||
msp3400-objs := msp3400-driver.o msp3400-kthreads.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o v4l1-compat.o compat_ioctl32.o
|
||||
obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o compat_ioctl32.o
|
||||
obj-$(CONFIG_VIDEO_V4L1_COMPAT) += v4l1-compat.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_BT848) += bt8xx/
|
||||
obj-$(CONFIG_VIDEO_BT848) += tvaudio.o tda7432.o tda9875.o ir-kbd-i2c.o
|
||||
|
@ -84,4 +85,8 @@ obj-$(CONFIG_USB_IBMCAM) += usbvideo/
|
|||
obj-$(CONFIG_USB_KONICAWC) += usbvideo/
|
||||
obj-$(CONFIG_USB_VICAM) += usbvideo/
|
||||
|
||||
obj-$(CONFIG_VIDEO_VIVI) += vivi.o
|
||||
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
||||
extra-cflags-$(CONFIG_VIDEO_V4L1_COMPAT) += -DCONFIG_VIDEO_V4L1_COMPAT
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_BT848
|
||||
tristate "BT848 Video For Linux"
|
||||
depends on VIDEO_DEV && PCI && I2C
|
||||
depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2
|
||||
select I2C_ALGOBIT
|
||||
select FW_LOADER
|
||||
select VIDEO_BTCX
|
||||
|
|
|
@ -8,5 +8,5 @@ bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o \
|
|||
|
||||
obj-$(CONFIG_VIDEO_BT848) += bttv.o
|
||||
|
||||
EXTRA_CFLAGS += -I$(src)/..
|
||||
EXTRA_CFLAGS += -Idrivers/media/video
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
|
||||
|
|
|
@ -2991,13 +2991,13 @@ void __devinit bttv_idcard(struct bttv *btv)
|
|||
|
||||
if (UNSET != audiomux[0]) {
|
||||
gpiobits = 0;
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
bttv_tvcards[btv->c.type].gpiomux[i] = audiomux[i];
|
||||
gpiobits |= audiomux[i];
|
||||
}
|
||||
} else {
|
||||
gpiobits = audioall;
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
bttv_tvcards[btv->c.type].gpiomux[i] = audioall;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -233,7 +233,7 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
|
|||
const struct bttv_format *fmt, struct bttv_overlay *ov,
|
||||
int skip_even, int skip_odd)
|
||||
{
|
||||
int instructions,rc,line,maxy,start,end,skip,nskips;
|
||||
int dwords,rc,line,maxy,start,end,skip,nskips;
|
||||
struct btcx_skiplist *skips;
|
||||
u32 *rp,ri,ra;
|
||||
u32 addr;
|
||||
|
@ -242,12 +242,12 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
|
|||
if (NULL == (skips = kmalloc(sizeof(*skips) * ov->nclips,GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
/* estimate risc mem: worst case is (clip+1) * lines instructions
|
||||
/* estimate risc mem: worst case is (1.5*clip+1) * lines instructions
|
||||
+ sync + jump (all 2 dwords) */
|
||||
instructions = (ov->nclips + 1) *
|
||||
((skip_even || skip_odd) ? ov->w.height>>1 : ov->w.height);
|
||||
instructions += 2;
|
||||
if ((rc = btcx_riscmem_alloc(btv->c.pci,risc,instructions*8)) < 0) {
|
||||
dwords = (3 * ov->nclips + 2) *
|
||||
((skip_even || skip_odd) ? (ov->w.height+1)>>1 : ov->w.height);
|
||||
dwords += 4;
|
||||
if ((rc = btcx_riscmem_alloc(btv->c.pci,risc,dwords*4)) < 0) {
|
||||
kfree(skips);
|
||||
return rc;
|
||||
}
|
||||
|
@ -276,8 +276,6 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc,
|
|||
if (line > maxy)
|
||||
btcx_calc_skips(line, ov->w.width, &maxy,
|
||||
skips, &nskips, ov->clips, ov->nclips);
|
||||
else
|
||||
nskips = 0;
|
||||
|
||||
/* write out risc code */
|
||||
for (start = 0, skip = 0; start < ov->w.width; start = end) {
|
||||
|
|
|
@ -39,29 +39,12 @@
|
|||
|
||||
#define FWDEV(x) &((x)->adapter->dev)
|
||||
|
||||
static int fastfw = 1;
|
||||
static char *firmware = FWFILE;
|
||||
|
||||
module_param(fastfw, bool, 0444);
|
||||
module_param(firmware, charp, 0444);
|
||||
|
||||
MODULE_PARM_DESC(fastfw, "Load firmware fast [0=100MHz 1=333MHz (default)]");
|
||||
MODULE_PARM_DESC(firmware, "Firmware image [default: " FWFILE "]");
|
||||
|
||||
static void set_i2c_delay(struct i2c_client *client, int delay)
|
||||
{
|
||||
struct i2c_algo_bit_data *algod = client->adapter->algo_data;
|
||||
|
||||
/* We aren't guaranteed to be using algo_bit,
|
||||
* so avoid the null pointer dereference
|
||||
* and disable the 'fast firmware load' */
|
||||
if (algod) {
|
||||
algod->udelay = delay;
|
||||
} else {
|
||||
fastfw = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void start_fw_load(struct i2c_client *client)
|
||||
{
|
||||
/* DL_ADDR_LB=0 DL_ADDR_HB=0 */
|
||||
|
@ -71,16 +54,10 @@ static void start_fw_load(struct i2c_client *client)
|
|||
cx25840_write(client, 0x803, 0x0b);
|
||||
/* AUTO_INC_DIS=1 */
|
||||
cx25840_write(client, 0x000, 0x20);
|
||||
|
||||
if (fastfw)
|
||||
set_i2c_delay(client, 3);
|
||||
}
|
||||
|
||||
static void end_fw_load(struct i2c_client *client)
|
||||
{
|
||||
if (fastfw)
|
||||
set_i2c_delay(client, 10);
|
||||
|
||||
/* AUTO_INC_DIS=0 */
|
||||
cx25840_write(client, 0x000, 0x00);
|
||||
/* DL_ENABLE=0 */
|
||||
|
@ -107,30 +84,8 @@ static int fw_write(struct i2c_client *client, u8 * data, int size)
|
|||
int sent;
|
||||
|
||||
if ((sent = i2c_master_send(client, data, size)) < size) {
|
||||
|
||||
if (fastfw) {
|
||||
v4l_err(client, "333MHz i2c firmware load failed\n");
|
||||
fastfw = 0;
|
||||
set_i2c_delay(client, 10);
|
||||
|
||||
if (sent > 2) {
|
||||
u16 dl_addr = cx25840_read(client, 0x801) << 8;
|
||||
dl_addr |= cx25840_read(client, 0x800);
|
||||
dl_addr -= sent - 2;
|
||||
cx25840_write(client, 0x801, dl_addr >> 8);
|
||||
cx25840_write(client, 0x800, dl_addr & 0xff);
|
||||
}
|
||||
|
||||
if (i2c_master_send(client, data, size) < size) {
|
||||
v4l_err(client, "100MHz i2c firmware load failed\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
} else {
|
||||
v4l_err(client, "firmware load i2c failure\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
v4l_err(client, "firmware load i2c failure\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -564,7 +564,7 @@ struct cx88_board cx88_boards[] = {
|
|||
},
|
||||
[CX88_BOARD_PCHDTV_HD3000] = {
|
||||
.name = "pcHDTV HD3000 HDTV",
|
||||
.tuner_type = TUNER_THOMSON_DTT7610,
|
||||
.tuner_type = TUNER_THOMSON_DTT761X,
|
||||
.radio_type = UNSET,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
|
|
|
@ -146,9 +146,11 @@ int cx88_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
|
|||
fields++;
|
||||
|
||||
/* estimate risc mem: worst case is one write per page border +
|
||||
one write per scan line + syncs + jump (all 2 dwords) */
|
||||
instructions = (bpl * lines * fields) / PAGE_SIZE + lines * fields;
|
||||
instructions += 3 + 4;
|
||||
one write per scan line + syncs + jump (all 2 dwords). Padding
|
||||
can cause next bpl to start close to a page border. First DMA
|
||||
region may be smaller than PAGE_SIZE */
|
||||
instructions = fields * (1 + ((bpl + padding) * lines) / PAGE_SIZE + lines);
|
||||
instructions += 2;
|
||||
if ((rc = btcx_riscmem_alloc(pci,risc,instructions*8)) < 0)
|
||||
return rc;
|
||||
|
||||
|
@ -176,9 +178,11 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc,
|
|||
int rc;
|
||||
|
||||
/* estimate risc mem: worst case is one write per page border +
|
||||
one write per scan line + syncs + jump (all 2 dwords) */
|
||||
instructions = (bpl * lines) / PAGE_SIZE + lines;
|
||||
instructions += 3 + 4;
|
||||
one write per scan line + syncs + jump (all 2 dwords). Here
|
||||
there is no padding and no sync. First DMA region may be smaller
|
||||
than PAGE_SIZE */
|
||||
instructions = 1 + (bpl * lines) / PAGE_SIZE + lines;
|
||||
instructions += 1;
|
||||
if ((rc = btcx_riscmem_alloc(pci,risc,instructions*8)) < 0)
|
||||
return rc;
|
||||
|
||||
|
|
|
@ -372,7 +372,7 @@ static int or51132_set_ts_param(struct dvb_frontend* fe,
|
|||
static struct or51132_config pchdtv_hd3000 = {
|
||||
.demod_address = 0x15,
|
||||
.pll_address = 0x61,
|
||||
.pll_desc = &dvb_pll_thomson_dtt7610,
|
||||
.pll_desc = &dvb_pll_thomson_dtt761x,
|
||||
.set_ts_params = or51132_set_ts_param,
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -35,8 +35,10 @@
|
|||
#include "cx88.h"
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* Include V4L1 specific functions. Should be removed soon */
|
||||
#include <linux/videodev.h>
|
||||
#endif
|
||||
|
||||
MODULE_DESCRIPTION("v4l2 driver module for cx2388x based TV cards");
|
||||
MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config VIDEO_EM28XX
|
||||
tristate "Empia EM2800/2820/2840 USB video capture support"
|
||||
depends on VIDEO_DEV && USB && I2C
|
||||
depends on VIDEO_V4L1 && USB && I2C
|
||||
select VIDEO_BUF
|
||||
select VIDEO_TUNER
|
||||
select VIDEO_TVEEPROM
|
||||
|
|
|
@ -1576,8 +1576,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
errCode = em28xx_config(dev);
|
||||
if (errCode) {
|
||||
em28xx_errdev("error configuring device\n");
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -1603,8 +1603,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
dev->vdev = video_device_alloc();
|
||||
if (NULL == dev->vdev) {
|
||||
em28xx_errdev("cannot allocate video_device.\n");
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -1612,8 +1612,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
if (NULL == dev->vbi_dev) {
|
||||
em28xx_errdev("cannot allocate video_device.\n");
|
||||
kfree(dev->vdev);
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -1650,8 +1650,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
mutex_unlock(&dev->lock);
|
||||
list_del(&dev->devlist);
|
||||
video_device_release(dev->vdev);
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -1662,8 +1662,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
list_del(&dev->devlist);
|
||||
video_device_release(dev->vbi_dev);
|
||||
video_device_release(dev->vdev);
|
||||
kfree(dev);
|
||||
em28xx_devused&=~(1<<dev->devno);
|
||||
kfree(dev);
|
||||
return -ENODEV;
|
||||
} else {
|
||||
printk("registered VBI\n");
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config USB_ET61X251
|
||||
tristate "USB ET61X[12]51 PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on Etoms ET61X151
|
||||
or ET61X251 PC Camera Controllers.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config USB_PWC
|
||||
tristate "USB Philips Cameras"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y or M here if you want to use one of these Philips & OEM
|
||||
webcams:
|
||||
|
|
|
@ -1,20 +1,3 @@
|
|||
ifneq ($(KERNELRELEASE),)
|
||||
|
||||
pwc-objs := pwc-if.o pwc-misc.o pwc-ctrl.o pwc-uncompress.o pwc-timon.o pwc-kiara.o
|
||||
|
||||
obj-$(CONFIG_USB_PWC) += pwc.o
|
||||
|
||||
else
|
||||
|
||||
KDIR := /lib/modules/$(shell uname -r)/build
|
||||
PWD := $(shell pwd)
|
||||
|
||||
default:
|
||||
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
|
||||
|
||||
endif
|
||||
|
||||
clean:
|
||||
rm -f *.[oas] .*.flags *.ko .*.cmd .*.d .*.tmp *.mod.c
|
||||
rm -rf .tmp_versions
|
||||
|
||||
|
|
|
@ -142,6 +142,7 @@ struct i2c_reg_value {
|
|||
static const struct i2c_reg_value saa7129_init_config_extra[] = {
|
||||
{ SAA7127_REG_OUTPUT_PORT_CONTROL, 0x38 },
|
||||
{ SAA7127_REG_VTRIG, 0xfa },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static const struct i2c_reg_value saa7127_init_config_common[] = {
|
||||
|
|
|
@ -3504,6 +3504,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
|
|||
/* power-up tuner chip */
|
||||
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
|
||||
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000);
|
||||
break;
|
||||
case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
|
||||
/* this turns the remote control chip off to work around a bug in it */
|
||||
saa_writeb(SAA7134_GPIO_GPMODE1, 0x80);
|
||||
|
|
|
@ -548,6 +548,8 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
|
|||
if (report & SAA7134_IRQ_REPORT_GPIO16) {
|
||||
switch (dev->has_remote) {
|
||||
case SAA7134_REMOTE_GPIO:
|
||||
if (!dev->remote)
|
||||
break;
|
||||
if (dev->remote->mask_keydown & 0x10000) {
|
||||
saa7134_input_irq(dev);
|
||||
}
|
||||
|
@ -564,6 +566,8 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
|
|||
if (report & SAA7134_IRQ_REPORT_GPIO18) {
|
||||
switch (dev->has_remote) {
|
||||
case SAA7134_REMOTE_GPIO:
|
||||
if (!dev->remote)
|
||||
break;
|
||||
if ((dev->remote->mask_keydown & 0x40000) ||
|
||||
(dev->remote->mask_keyup & 0x40000)) {
|
||||
saa7134_input_irq(dev);
|
||||
|
@ -676,7 +680,7 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
|
|||
SAA7134_IRQ2_INTE_PE |
|
||||
SAA7134_IRQ2_INTE_AR;
|
||||
|
||||
if (dev->has_remote == SAA7134_REMOTE_GPIO) {
|
||||
if (dev->has_remote == SAA7134_REMOTE_GPIO && dev->remote) {
|
||||
if (dev->remote->mask_keydown & 0x10000)
|
||||
irq2_mask |= SAA7134_IRQ2_INTE_GPIO16;
|
||||
else if (dev->remote->mask_keydown & 0x40000)
|
||||
|
|
|
@ -31,8 +31,10 @@
|
|||
#include "saa7134.h"
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* Include V4L1 specific functions. Should be removed soon */
|
||||
#include <linux/videodev.h>
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config USB_SN9C102
|
||||
tristate "USB SN9C10x PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on SONiX SN9C101,
|
||||
SN9C102 or SN9C103 PC Camera Controllers.
|
||||
|
|
|
@ -877,8 +877,8 @@ static struct tuner_params tuner_philips_fmd1216me_mk3_params[] = {
|
|||
/* ------------ TUNER_LG_TDVS_H062F - INFINEON ATSC ------------ */
|
||||
|
||||
static struct tuner_range tuner_tua6034_ntsc_ranges[] = {
|
||||
{ 16 * 160.00 /*MHz*/, 0x8e, 0x01 },
|
||||
{ 16 * 455.00 /*MHz*/, 0x8e, 0x02 },
|
||||
{ 16 * 165.00 /*MHz*/, 0x8e, 0x01 },
|
||||
{ 16 * 450.00 /*MHz*/, 0x8e, 0x02 },
|
||||
{ 16 * 999.99 , 0x8e, 0x04 },
|
||||
};
|
||||
|
||||
|
|
|
@ -218,7 +218,7 @@ hauppauge_tuner[] =
|
|||
/* 110-119 */
|
||||
{ TUNER_ABSENT, "Thompson DTT75105"},
|
||||
{ TUNER_ABSENT, "Conexant_CX24109"},
|
||||
{ TUNER_ABSENT, "TCL M2523_5N_E"},
|
||||
{ TUNER_TCL_2002N, "TCL M2523_5N_E"},
|
||||
{ TUNER_ABSENT, "TCL M2523_3DB_E"},
|
||||
{ TUNER_ABSENT, "Philips 8275A"},
|
||||
{ TUNER_ABSENT, "Microtune MT2060"},
|
||||
|
|
|
@ -3,7 +3,7 @@ config VIDEO_USBVIDEO
|
|||
|
||||
config USB_VICAM
|
||||
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_DEV && EXPERIMENTAL
|
||||
depends on USB && VIDEO_V4L1 && EXPERIMENTAL
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you have 3com homeconnect camera (vicam).
|
||||
|
@ -13,7 +13,7 @@ config USB_VICAM
|
|||
|
||||
config USB_IBMCAM
|
||||
tristate "USB IBM (Xirlink) C-it Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want to connect a IBM "C-It" camera, also known as
|
||||
|
@ -28,7 +28,7 @@ config USB_IBMCAM
|
|||
|
||||
config USB_KONICAWC
|
||||
tristate "USB Konica Webcam support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want support for webcams based on a Konica
|
||||
|
|
|
@ -26,6 +26,11 @@
|
|||
#include <linux/random.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
/* Include V4L1 specific functions. Should be removed soon */
|
||||
#include <linux/videodev.h>
|
||||
#endif
|
||||
#include <linux/interrupt.h>
|
||||
#include <media/video-buf.h>
|
||||
#include <media/v4l2-common.h>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
config USB_ZC0301
|
||||
tristate "USB ZC0301 Image Processor and Control Chip support"
|
||||
depends on USB && VIDEO_DEV
|
||||
depends on USB && VIDEO_V4L1
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on the ZC0301
|
||||
Image Processor and Control Chip.
|
||||
|
|
|
@ -1141,8 +1141,13 @@ extern char *v4l2_type_names[];
|
|||
/* Compatibility layer interface -- v4l1-compat module */
|
||||
typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, void *arg);
|
||||
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
int v4l_compat_translate_ioctl(struct inode *inode, struct file *file,
|
||||
int cmd, void *arg, v4l2_kioctl driver_ioctl);
|
||||
#else
|
||||
#define v4l_compat_translate_ioctl(inode,file,cmd,arg,ioctl) -EINVAL
|
||||
#endif
|
||||
|
||||
/* 32 Bits compatibility layer for 64 bits processors */
|
||||
extern long v4l_compat_ioctl32(struct file *file, unsigned int cmd,
|
||||
|
|
Loading…
Reference in a new issue