Commit c9d20af6 authored by Linus Torvalds's avatar Linus Torvalds

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