Commit d669af9d authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb

parents 2ddb55f0 f87d09be
...@@ -68,3 +68,4 @@ tuner=66 - LG NTSC (TALN mini series) ...@@ -68,3 +68,4 @@ tuner=66 - LG NTSC (TALN mini series)
tuner=67 - Philips TD1316 Hybrid Tuner tuner=67 - Philips TD1316 Hybrid Tuner
tuner=68 - Philips TUV1236D ATSC/NTSC dual in tuner=68 - Philips TUV1236D ATSC/NTSC dual in
tuner=69 - Tena TNF 5335 MF tuner=69 - Tena TNF 5335 MF
tuner=70 - Samsung TCPN 2121P30A
...@@ -542,7 +542,7 @@ static struct pci_driver bt878_pci_driver = { ...@@ -542,7 +542,7 @@ static struct pci_driver bt878_pci_driver = {
.remove = bt878_remove, .remove = bt878_remove,
}; };
static int bt878_pci_driver_registered = 0; static int bt878_pci_driver_registered;
/*******************************/ /*******************************/
/* Module management functions */ /* Module management functions */
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/mutex.h>
#include "dvbdev.h" #include "dvbdev.h"
static int dvbdev_debug; static int dvbdev_debug;
...@@ -44,7 +44,7 @@ MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off)."); ...@@ -44,7 +44,7 @@ MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off).");
#define dprintk if (dvbdev_debug) printk #define dprintk if (dvbdev_debug) printk
static LIST_HEAD(dvb_adapter_list); static LIST_HEAD(dvb_adapter_list);
static DECLARE_MUTEX(dvbdev_register_lock); static DEFINE_MUTEX(dvbdev_register_lock);
static const char * const dnames[] = { static const char * const dnames[] = {
"video", "audio", "sec", "frontend", "demux", "dvr", "ca", "video", "audio", "sec", "frontend", "demux", "dvr", "ca",
...@@ -202,11 +202,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, ...@@ -202,11 +202,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
struct dvb_device *dvbdev; struct dvb_device *dvbdev;
int id; int id;
if (down_interruptible (&dvbdev_register_lock)) if (mutex_lock_interruptible(&dvbdev_register_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
if ((id = dvbdev_get_free_id (adap, type)) < 0) { if ((id = dvbdev_get_free_id (adap, type)) < 0) {
up (&dvbdev_register_lock); mutex_unlock(&dvbdev_register_lock);
*pdvbdev = NULL; *pdvbdev = NULL;
printk ("%s: could get find free device id...\n", __FUNCTION__); printk ("%s: could get find free device id...\n", __FUNCTION__);
return -ENFILE; return -ENFILE;
...@@ -215,11 +215,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, ...@@ -215,11 +215,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
*pdvbdev = dvbdev = kmalloc(sizeof(struct dvb_device), GFP_KERNEL); *pdvbdev = dvbdev = kmalloc(sizeof(struct dvb_device), GFP_KERNEL);
if (!dvbdev) { if (!dvbdev) {
up(&dvbdev_register_lock); mutex_unlock(&dvbdev_register_lock);
return -ENOMEM; return -ENOMEM;
} }
up (&dvbdev_register_lock); 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;
...@@ -289,11 +289,11 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu ...@@ -289,11 +289,11 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu
{ {
int num; int num;
if (down_interruptible (&dvbdev_register_lock)) if (mutex_lock_interruptible(&dvbdev_register_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
if ((num = dvbdev_get_free_adapter_num ()) < 0) { if ((num = dvbdev_get_free_adapter_num ()) < 0) {
up (&dvbdev_register_lock); mutex_unlock(&dvbdev_register_lock);
return -ENFILE; return -ENFILE;
} }
...@@ -309,7 +309,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu ...@@ -309,7 +309,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu
list_add_tail (&adap->list_head, &dvb_adapter_list); list_add_tail (&adap->list_head, &dvb_adapter_list);
up (&dvbdev_register_lock); mutex_unlock(&dvbdev_register_lock);
return num; return num;
} }
...@@ -320,10 +320,10 @@ int dvb_unregister_adapter(struct dvb_adapter *adap) ...@@ -320,10 +320,10 @@ int dvb_unregister_adapter(struct dvb_adapter *adap)
{ {
devfs_remove("dvb/adapter%d", adap->num); devfs_remove("dvb/adapter%d", adap->num);
if (down_interruptible (&dvbdev_register_lock)) if (mutex_lock_interruptible(&dvbdev_register_lock))
return -ERESTARTSYS; return -ERESTARTSYS;
list_del (&adap->list_head); list_del (&adap->list_head);
up (&dvbdev_register_lock); mutex_unlock(&dvbdev_register_lock);
return 0; return 0;
} }
EXPORT_SYMBOL(dvb_unregister_adapter); EXPORT_SYMBOL(dvb_unregister_adapter);
......
...@@ -691,6 +691,8 @@ module_init (cxusb_module_init); ...@@ -691,6 +691,8 @@ module_init (cxusb_module_init);
module_exit (cxusb_module_exit); module_exit (cxusb_module_exit);
MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>"); MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
MODULE_AUTHOR("Michael Krufky <mkrufky@m1k.net>");
MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design"); MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design");
MODULE_VERSION("1.0-alpha"); MODULE_VERSION("1.0-alpha");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -333,7 +333,7 @@ struct dvb_pll_desc dvb_pll_tbmv30111in = { ...@@ -333,7 +333,7 @@ struct dvb_pll_desc dvb_pll_tbmv30111in = {
.name = "Samsung TBMV30111IN", .name = "Samsung TBMV30111IN",
.min = 54000000, .min = 54000000,
.max = 860000000, .max = 860000000,
.count = 4, .count = 6,
.entries = { .entries = {
{ 172000000, 44000000, 166666, 0xb4, 0x01 }, { 172000000, 44000000, 166666, 0xb4, 0x01 },
{ 214000000, 44000000, 166666, 0xb4, 0x02 }, { 214000000, 44000000, 166666, 0xb4, 0x02 },
......
...@@ -81,7 +81,7 @@ static int adac = DVB_ADAC_TI; ...@@ -81,7 +81,7 @@ static int adac = DVB_ADAC_TI;
static int hw_sections; static int hw_sections;
static int rgb_on; static int rgb_on;
static int volume = 255; static int volume = 255;
static int budgetpatch = 0; static int budgetpatch;
module_param_named(debug, av7110_debug, int, 0644); module_param_named(debug, av7110_debug, int, 0644);
MODULE_PARM_DESC(debug, "debug level (bitmask, default 0)"); MODULE_PARM_DESC(debug, "debug level (bitmask, default 0)");
...@@ -103,7 +103,7 @@ MODULE_PARM_DESC(budgetpatch, "use budget-patch hardware modification: default 0 ...@@ -103,7 +103,7 @@ MODULE_PARM_DESC(budgetpatch, "use budget-patch hardware modification: default 0
static void restart_feeds(struct av7110 *av7110); static void restart_feeds(struct av7110 *av7110);
static int av7110_num = 0; static int av7110_num;
#define FE_FUNC_OVERRIDE(fe_func, av7110_copy, av7110_func) \ #define FE_FUNC_OVERRIDE(fe_func, av7110_copy, av7110_func) \
{\ {\
......
...@@ -146,52 +146,52 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len) ...@@ -146,52 +146,52 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
{ {
int i; int i;
int blocks, rest; int blocks, rest;
u32 base, bootblock = BOOT_BLOCK; u32 base, bootblock = AV7110_BOOT_BLOCK;
dprintk(4, "%p\n", av7110); dprintk(4, "%p\n", av7110);
blocks = len / BOOT_MAX_SIZE; blocks = len / AV7110_BOOT_MAX_SIZE;
rest = len % BOOT_MAX_SIZE; rest = len % AV7110_BOOT_MAX_SIZE;
base = DRAM_START_CODE; base = DRAM_START_CODE;
for (i = 0; i < blocks; i++) { for (i = 0; i < blocks; i++) {
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at block %d\n", i); printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at block %d\n", i);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
dprintk(4, "writing DRAM block %d\n", i); dprintk(4, "writing DRAM block %d\n", i);
mwdebi(av7110, DEBISWAB, bootblock, mwdebi(av7110, DEBISWAB, bootblock,
((char*)data) + i * BOOT_MAX_SIZE, BOOT_MAX_SIZE); ((char*)data) + i * AV7110_BOOT_MAX_SIZE, AV7110_BOOT_MAX_SIZE);
bootblock ^= 0x1400; bootblock ^= 0x1400;
iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4); iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, BOOT_MAX_SIZE, 2); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, AV7110_BOOT_MAX_SIZE, 2);
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
base += BOOT_MAX_SIZE; base += AV7110_BOOT_MAX_SIZE;
} }
if (rest > 0) { if (rest > 0) {
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at last block\n"); printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at last block\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
if (rest > 4) if (rest > 4)
mwdebi(av7110, DEBISWAB, bootblock, mwdebi(av7110, DEBISWAB, bootblock,
((char*)data) + i * BOOT_MAX_SIZE, rest); ((char*)data) + i * AV7110_BOOT_MAX_SIZE, rest);
else else
mwdebi(av7110, DEBISWAB, bootblock, mwdebi(av7110, DEBISWAB, bootblock,
((char*)data) + i * BOOT_MAX_SIZE - 4, rest + 4); ((char*)data) + i * AV7110_BOOT_MAX_SIZE - 4, rest + 4);
iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4); iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, rest, 2);
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
} }
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout after last block\n"); printk(KERN_ERR "dvb-ttpci: load_dram(): timeout after last block\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, 0, 2);
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0) { if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_AV7110_BOOT_COMPLETE) < 0) {
printk(KERN_ERR "dvb-ttpci: load_dram(): final handshake timeout\n"); printk(KERN_ERR "dvb-ttpci: load_dram(): final handshake timeout\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -262,7 +262,7 @@ int av7110_bootarm(struct av7110 *av7110) ...@@ -262,7 +262,7 @@ int av7110_bootarm(struct av7110 *av7110)
//saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT); //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT);
mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode)); mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode));
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
if (saa7146_wait_for_debi_done(av7110->dev, 1)) { if (saa7146_wait_for_debi_done(av7110->dev, 1)) {
printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): " printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): "
......
...@@ -18,7 +18,7 @@ enum av7110_bootstate ...@@ -18,7 +18,7 @@ enum av7110_bootstate
{ {
BOOTSTATE_BUFFER_EMPTY = 0, BOOTSTATE_BUFFER_EMPTY = 0,
BOOTSTATE_BUFFER_FULL = 1, BOOTSTATE_BUFFER_FULL = 1,
BOOTSTATE_BOOT_COMPLETE = 2 BOOTSTATE_AV7110_BOOT_COMPLETE = 2
}; };
enum av7110_type_rec_play_format enum av7110_type_rec_play_format
...@@ -295,11 +295,11 @@ enum av7110_command_type { ...@@ -295,11 +295,11 @@ enum av7110_command_type {
#define DPRAM_BASE 0x4000 #define DPRAM_BASE 0x4000
/* boot protocol area */ /* boot protocol area */
#define BOOT_STATE (DPRAM_BASE + 0x3F8) #define AV7110_BOOT_STATE (DPRAM_BASE + 0x3F8)
#define BOOT_SIZE (DPRAM_BASE + 0x3FA) #define AV7110_BOOT_SIZE (DPRAM_BASE + 0x3FA)
#define BOOT_BASE (DPRAM_BASE + 0x3FC) #define AV7110_BOOT_BASE (DPRAM_BASE + 0x3FC)
#define BOOT_BLOCK (DPRAM_BASE + 0x400) #define AV7110_BOOT_BLOCK (DPRAM_BASE + 0x400)
#define BOOT_MAX_SIZE 0xc00 #define AV7110_BOOT_MAX_SIZE 0xc00
/* firmware command protocol area */ /* firmware command protocol area */
#define IRQ_STATE (DPRAM_BASE + 0x0F4) #define IRQ_STATE (DPRAM_BASE + 0x0F4)
......
...@@ -8,7 +8,8 @@ bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o \ ...@@ -8,7 +8,8 @@ bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o \
zoran-objs := zr36120.o zr36120_i2c.o zr36120_mem.o zoran-objs := zr36120.o zr36120_i2c.o zr36120_mem.o
zr36067-objs := zoran_procfs.o zoran_device.o \ zr36067-objs := zoran_procfs.o zoran_device.o \
zoran_driver.o zoran_card.o zoran_driver.o zoran_card.o
tuner-objs := tuner-core.o tuner-simple.o mt20xx.o tda8290.o tea5767.o tuner-objs := tuner-core.o tuner-types.o tuner-simple.o \
mt20xx.o tda8290.o tea5767.o
msp3400-objs := msp3400-driver.o msp3400-kthreads.o msp3400-objs := msp3400-driver.o msp3400-kthreads.o
......
...@@ -129,9 +129,9 @@ static unsigned char yuv[MAX_AR_FRAME_BYTES]; ...@@ -129,9 +129,9 @@ static unsigned char yuv[MAX_AR_FRAME_BYTES];
static int freq = DEFAULT_FREQ; /* BCLK: available 50 or 70 (MHz) */ static int freq = DEFAULT_FREQ; /* BCLK: available 50 or 70 (MHz) */
static int vga = 0; /* default mode(0:QVGA mode, other:VGA mode) */ static int vga = 0; /* default mode(0:QVGA mode, other:VGA mode) */
static int vga_interlace = 0; /* 0 is normal mode for, else interlace mode */ static int vga_interlace = 0; /* 0 is normal mode for, else interlace mode */
MODULE_PARM(freq, "i"); module_param(freq, int, 0);
MODULE_PARM(vga, "i"); module_param(vga, int, 0);
MODULE_PARM(vga_interlace, "i"); module_param(vga_interlace, int, 0);
static int ar_initialize(struct video_device *dev); static int ar_initialize(struct video_device *dev);
......
...@@ -43,7 +43,7 @@ static unsigned short normal_i2c[] = { I2C_BT832_ALT1>>1, I2C_BT832_ALT2>>1, ...@@ -43,7 +43,7 @@ static unsigned short normal_i2c[] = { I2C_BT832_ALT1>>1, I2C_BT832_ALT2>>1,
I2C_CLIENT_END }; I2C_CLIENT_END };
I2C_CLIENT_INSMOD; I2C_CLIENT_INSMOD;
int debug = 0; /* debug output */ int debug; /* debug output */
module_param(debug, int, 0644); module_param(debug, int, 0644);
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
......
...@@ -37,7 +37,7 @@ MODULE_DESCRIPTION("some code shared by bttv and cx88xx drivers"); ...@@ -37,7 +37,7 @@ MODULE_DESCRIPTION("some code shared by bttv and cx88xx drivers");
MODULE_AUTHOR("Gerd Knorr"); MODULE_AUTHOR("Gerd Knorr");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static unsigned int debug = 0; static unsigned int debug;
module_param(debug, int, 0644); module_param(debug, int, 0644);
MODULE_PARM_DESC(debug,"debug messages, default is 0 (no)"); MODULE_PARM_DESC(debug,"debug messages, default is 0 (no)");
......
...@@ -92,8 +92,8 @@ static void identify_by_eeprom(struct bttv *btv, ...@@ -92,8 +92,8 @@ static void identify_by_eeprom(struct bttv *btv,
static int __devinit pvr_boot(struct bttv *btv); static int __devinit pvr_boot(struct bttv *btv);
/* config variables */ /* config variables */
static unsigned int triton1=0; static unsigned int triton1;
static unsigned int vsfx=0; static unsigned int vsfx;
static unsigned int latency = UNSET; static unsigned int latency = UNSET;
int no_overlay=-1; int no_overlay=-1;
...@@ -106,7 +106,7 @@ static struct bttv *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL }; ...@@ -106,7 +106,7 @@ static struct bttv *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL };
#ifdef MODULE #ifdef MODULE
static unsigned int autoload = 1; static unsigned int autoload = 1;
#else #else
static unsigned int autoload = 0; static unsigned int autoload;
#endif #endif
static unsigned int gpiomask = UNSET; static unsigned int gpiomask = UNSET;
static unsigned int audioall = UNSET; static unsigned int audioall = UNSET;
......
...@@ -48,47 +48,46 @@ ...@@ -48,47 +48,46 @@
unsigned int bttv_num; /* number of Bt848s in use */ unsigned int bttv_num; /* number of Bt848s in use */
struct bttv bttvs[BTTV_MAX]; struct bttv bttvs[BTTV_MAX];
unsigned int bttv_debug = 0; unsigned int bttv_debug;
unsigned int bttv_verbose = 1; unsigned int bttv_verbose = 1;
unsigned int bttv_gpio = 0; unsigned int bttv_gpio;
/* config variables */ /* config variables */
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
static unsigned int bigendian=1; static unsigned int bigendian=1;
#else #else
static unsigned int bigendian=0; static unsigned int bigendian;
#endif #endif
static unsigned int radio[BTTV_MAX]; static unsigned int radio[BTTV_MAX];
static unsigned int irq_debug = 0; static unsigned int irq_debug;
static unsigned int gbuffers = 8; static unsigned int gbuffers = 8;
static unsigned int gbufsize = 0x208000; static unsigned int gbufsize = 0x208000;
static int video_nr = -1; static int video_nr = -1;
static int radio_nr = -1; static int radio_nr = -1;
static int vbi_nr = -1; static int vbi_nr = -1;
static int debug_latency = 0; static int debug_latency;
static unsigned int fdsr = 0; static unsigned int fdsr;
/* options */ /* options */
static unsigned int combfilter = 0; static unsigned int combfilter;
static unsigned int lumafilter = 0; static unsigned int lumafilter;
static unsigned int automute = 1; static unsigned int automute = 1;
static unsigned int chroma_agc = 0; static unsigned int chroma_agc;
static unsigned int adc_crush = 1; static unsigned int adc_crush = 1;
static unsigned int whitecrush_upper = 0xCF; static unsigned int whitecrush_upper = 0xCF;
static unsigned int whitecrush_lower = 0x7F; static unsigned int whitecrush_lower = 0x7F;
static unsigned int vcr_hack = 0; static unsigned int vcr_hack;
static unsigned int irq_iswitch = 0; static unsigned int irq_iswitch;
static unsigned int uv_ratio = 50; static unsigned int uv_ratio = 50;
static unsigned int full_luma_range = 0; static unsigned int full_luma_range;
static unsigned int coring = 0; static unsigned int coring;
extern int no_overlay; extern int no_overlay;
/* API features (turn on/off stuff for testing) */ /* API features (turn on/off stuff for testing) */
static unsigned int v4l2 = 1; static unsigned int v4l2 = 1;
/* insmod args */ /* insmod args */
module_param(bttv_verbose, int, 0644); module_param(bttv_verbose, int, 0644);
module_param(bttv_gpio, int, 0644); module_param(bttv_gpio, int, 0644);
...@@ -685,16 +684,16 @@ int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit) ...@@ -685,16 +684,16 @@ int check_alloc_btres(struct bttv *btv, struct bttv_fh *fh, int bit)
return 1; return 1;
/* is it free? */ /* is it free? */
down(&btv->reslock); mutex_lock(&btv->reslock);
if (btv->resources & bit) { if (btv->resources & bit) {
/* no, someone else uses it */ /* no, someone else uses it */
up(&btv->reslock); mutex_unlock(&btv->reslock);
return 0; return 0;
} }
/* it's free, grab it */ /* it's free, grab it */
fh->resources |= bit; fh->resources |= bit;
btv->resources |= bit; btv->resources |= bit;
up(&btv->reslock); mutex_unlock(&btv->reslock);
return 1; return 1;
} }
...@@ -717,10 +716,10 @@ void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits) ...@@ -717,10 +716,10 @@ void free_btres(struct bttv *btv, struct bttv_fh *fh, int bits)
/* trying to free ressources not allocated by us ... */ /* trying to free ressources not allocated by us ... */
printk("bttv: BUG! (btres)\n"); printk("bttv: BUG! (btres)\n");
} }
down(&btv->reslock); mutex_lock(&btv->reslock);
fh->resources &= ~bits; fh->resources &= ~bits;
btv->resources &= ~bits; btv->resources &= ~bits;
up(&btv->reslock); mutex_unlock(&btv->reslock);
} }
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
...@@ -1537,12 +1536,12 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1537,12 +1536,12 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
case VIDIOCSFREQ: case VIDIOCSFREQ:
{ {
unsigned long *freq = arg; unsigned long *freq = arg;
down(&btv->lock); mutex_lock(&btv->lock);
btv->freq=*freq; btv->freq=*freq;
bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq); bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq);
if (btv->has_matchbox && btv->radio_user) if (btv->has_matchbox && btv->radio_user)
tea5757_set_freq(btv,*freq); tea5757_set_freq(btv,*freq);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1572,10 +1571,10 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1572,10 +1571,10 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (v->mode >= BTTV_TVNORMS) if (v->mode >= BTTV_TVNORMS)
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
set_tvnorm(btv,v->mode); set_tvnorm(btv,v->mode);
bttv_call_i2c_clients(btv,cmd,v); bttv_call_i2c_clients(btv,cmd,v);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1612,17 +1611,17 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1612,17 +1611,17 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (v->norm >= BTTV_TVNORMS) if (v->norm >= BTTV_TVNORMS)
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
if (channel == btv->input && if (channel == btv->input &&
v->norm == btv->tvnorm) { v->norm == btv->tvnorm) {
/* nothing to do */ /* nothing to do */
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
btv->tvnorm = v->norm; btv->tvnorm = v->norm;
set_input(btv,v->channel); set_input(btv,v->channel);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1635,14 +1634,14 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1635,14 +1634,14 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
v->flags |= VIDEO_AUDIO_MUTABLE; v->flags |= VIDEO_AUDIO_MUTABLE;
v->mode = VIDEO_SOUND_MONO; v->mode = VIDEO_SOUND_MONO;
down(&btv->lock); mutex_lock(&btv->lock);
bttv_call_i2c_clients(btv,cmd,v); bttv_call_i2c_clients(btv,cmd,v);
/* card specific hooks */ /* card specific hooks */
if (btv->audio_hook) if (btv->audio_hook)
btv->audio_hook(btv,v,0); btv->audio_hook(btv,v,0);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
case VIDIOCSAUDIO: case VIDIOCSAUDIO:
...@@ -1653,7 +1652,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1653,7 +1652,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (audio >= bttv_tvcards[btv->c.type].audio_inputs) if (audio >= bttv_tvcards[btv->c.type].audio_inputs)
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
audio_mux(btv, (v->flags&VIDEO_AUDIO_MUTE) ? AUDIO_MUTE : AUDIO_UNMUTE); audio_mux(btv, (v->flags&VIDEO_AUDIO_MUTE) ? AUDIO_MUTE : AUDIO_UNMUTE);
bttv_call_i2c_clients(btv,cmd,v); bttv_call_i2c_clients(btv,cmd,v);
...@@ -1661,7 +1660,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1661,7 +1660,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (btv->audio_hook) if (btv->audio_hook)
btv->audio_hook(btv,v,1); btv->audio_hook(btv,v,1);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1695,10 +1694,10 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1695,10 +1694,10 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (i == BTTV_TVNORMS) if (i == BTTV_TVNORMS)
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
set_tvnorm(btv,i); set_tvnorm(btv,i);
i2c_vidiocschan(btv); i2c_vidiocschan(btv);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
case VIDIOC_QUERYSTD: case VIDIOC_QUERYSTD:
...@@ -1756,9 +1755,9 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1756,9 +1755,9 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (*i > bttv_tvcards[btv->c.type].video_inputs) if (*i > bttv_tvcards[btv->c.type].video_inputs)
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
set_input(btv,*i); set_input(btv,*i);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1770,7 +1769,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1770,7 +1769,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
return -EINVAL; return -EINVAL;
if (0 != t->index) if (0 != t->index)
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
memset(t,0,sizeof(*t)); memset(t,0,sizeof(*t));
strcpy(t->name, "Television"); strcpy(t->name, "Television");
t->type = V4L2_TUNER_ANALOG_TV; t->type = V4L2_TUNER_ANALOG_TV;
...@@ -1805,7 +1804,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1805,7 +1804,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
} }
} }
/* FIXME: fill capability+audmode */ /* FIXME: fill capability+audmode */
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
case VIDIOC_S_TUNER: case VIDIOC_S_TUNER:
...@@ -1816,7 +1815,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1816,7 +1815,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
return -EINVAL; return -EINVAL;
if (0 != t->index) if (0 != t->index)
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
{ {
struct video_audio va; struct video_audio va;
memset(&va, 0, sizeof(struct video_audio)); memset(&va, 0, sizeof(struct video_audio));
...@@ -1833,7 +1832,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1833,7 +1832,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
if (btv->audio_hook) if (btv->audio_hook)
btv->audio_hook(btv,&va,1); btv->audio_hook(btv,&va,1);
} }
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -1854,12 +1853,12 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg) ...@@ -1854,12 +1853,12 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
return -EINVAL; return -EINVAL;
if (unlikely (f->type != V4L2_TUNER_ANALOG_TV)) if (unlikely (f->type != V4L2_TUNER_ANALOG_TV))
return -EINVAL; return -EINVAL;
down(&btv->lock); mutex_lock(&btv->lock);
btv->freq = f->frequency; btv->freq = f->frequency;
bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq); bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq);
if (btv->has_matchbox && btv->radio_user) if (btv->has_matchbox && btv->radio_user)
tea5757_set_freq(btv,btv->freq); tea5757_set_freq(btv,btv->freq);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
case VIDIOC_LOG_STATUS: case VIDIOC_LOG_STATUS:
...@@ -3157,7 +3156,7 @@ static int radio_open(struct inode *inode, struct file *file) ...@@ -3157,7 +3156,7 @@ static int radio_open(struct inode *inode, struct file *file)
return -ENODEV; return -ENODEV;
dprintk("bttv%d: open called (radio)\n",btv->c.nr); dprintk("bttv%d: open called (radio)\n",btv->c.nr);
down(&btv->lock); mutex_lock(&btv->lock);
btv->radio_user++; btv->radio_user++;
...@@ -3166,7 +3165,7 @@ static int radio_open(struct inode *inode, struct file *file) ...@@ -3166,7 +3165,7 @@ static int radio_open(struct inode *inode, struct file *file)
bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type); bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type);
audio_mux(btv,AUDIO_RADIO); audio_mux(btv,AUDIO_RADIO);
up(&btv->lock); mutex_unlock(&btv->lock);
return 0; return 0;
} }
...@@ -3921,8 +3920,8 @@ static int __devinit bttv_probe(struct pci_dev *dev, ...@@ -3921,8 +3920,8 @@ static int __devinit bttv_probe(struct pci_dev *dev,
sprintf(btv->c.name,"bttv%d",btv->c.nr); sprintf(btv->c.name,"bttv%d",btv->c.nr);
/* initialize structs / fill in defaults */ /* initialize structs / fill in defaults */
init_MUTEX(&btv->lock); mutex_init(&btv->lock);
init_MUTEX(&btv->reslock); mutex_init(&btv->reslock);
spin_lock_init(&btv->s_lock); spin_lock_init(&btv->s_lock);
spin_lock_init(&btv->gpio_lock); spin_lock_init(&btv->gpio_lock);
init_waitqueue_head(&btv->gpioq); init_waitqueue_head(&btv->gpioq);
......
...@@ -41,9 +41,9 @@ static struct i2c_client bttv_i2c_client_template; ...@@ -41,9 +41,9 @@ static struct i2c_client bttv_i2c_client_template;
static int attach_inform(struct i2c_client *client); static int attach_inform(struct i2c_client *client);
static int i2c_debug = 0; static int i2c_debug;
static int i2c_hw = 0; static int i2c_hw;
static int i2c_scan = 0; static int i2c_scan;
module_param(i2c_debug, int, 0644); module_param(i2c_debug, int, 0644);
module_param(i2c_hw, int, 0444); module_param(i2c_hw, int, 0444);
module_param(i2c_scan, int, 0444); module_param(i2c_scan, int, 0444);
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <linux/videodev.h> #include <linux/videodev.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/mutex.h>
#include <asm/scatterlist.h> #include <asm/scatterlist.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -309,9 +310,9 @@ struct bttv { ...@@ -309,9 +310,9 @@ struct bttv {
/* locking */ /* locking */
spinlock_t s_lock; spinlock_t s_lock;
struct semaphore lock; struct mutex lock;
int resources; int resources;
struct semaphore reslock; struct mutex reslock;
#ifdef VIDIOC_G_PRIORITY #ifdef VIDIOC_G_PRIORITY
struct v4l2_prio_state prio; struct v4l2_prio_state prio;
#endif #endif
......
...@@ -43,7 +43,7 @@ MODULE_LICENSE("GPL"); ...@@ -43,7 +43,7 @@ MODULE_LICENSE("GPL");
static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END }; static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
int cx25840_debug = 0; static int cx25840_debug;
module_param_named(debug,cx25840_debug, int, 0644); module_param_named(debug,cx25840_debug, int, 0644);
......
...@@ -31,8 +31,7 @@ config VIDEO_CX88_DVB ...@@ -31,8 +31,7 @@ config VIDEO_CX88_DVB
config VIDEO_CX88_ALSA config VIDEO_CX88_ALSA
tristate "ALSA DMA audio support" tristate "ALSA DMA audio support"
depends on VIDEO_CX88 && SND depends on VIDEO_CX88 && SND && EXPERIMENTAL
select SND_PCM_OSS
---help--- ---help---
This is a video4linux driver for direct (DMA) audio on This is a video4linux driver for direct (DMA) audio on
Conexant 2388x based TV cards. Conexant 2388x based TV cards.
......
...@@ -5,6 +5,7 @@ cx8802-objs := cx88-mpeg.o ...@@ -5,6 +5,7 @@ cx8802-objs := cx88-mpeg.o
obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o cx88-blackbird.o obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o cx88-blackbird.o
obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o cx88-vp3054-i2c.o obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o cx88-vp3054-i2c.o
obj-$(CONFIG_VIDEO_CX88_ALSA) += cx88-alsa.o
EXTRA_CFLAGS += -I$(src)/.. EXTRA_CFLAGS += -I$(src)/..
EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
......
...@@ -116,7 +116,7 @@ MODULE_LICENSE("GPL"); ...@@ -116,7 +116,7 @@ MODULE_LICENSE("GPL");
MODULE_SUPPORTED_DEVICE("{{Conexant,23881}," MODULE_SUPPORTED_DEVICE("{{Conexant,23881},"
"{{Conexant,23882}," "{{Conexant,23882},"
"{{Conexant,23883}"); "{{Conexant,23883}");
static unsigned int debug = 0; static unsigned int debug;
module_param(debug,int,0644); module_param(debug,int,0644);
MODULE_PARM_DESC(debug,"enable debug messages"); MODULE_PARM_DESC(debug,"enable debug messages");
...@@ -333,10 +333,10 @@ static snd_pcm_hardware_t snd_cx88_digital_hw = { ...@@ -333,10 +333,10 @@ static snd_pcm_hardware_t snd_cx88_digital_hw = {
.channels_min = 1, .channels_min = 1,
.channels_max = 2, .channels_max = 2,
.buffer_bytes_max = (2*2048), .buffer_bytes_max = (2*2048),
.period_bytes_min = 256, .period_bytes_min = 2048,
.period_bytes_max = 2048, .period_bytes_max = 2048,
.periods_min = 2, .periods_min = 2,
.periods_max = 16, .periods_max = 2,
}; };
/* /*
...@@ -653,7 +653,7 @@ static void snd_cx88_dev_free(snd_card_t * card) ...@@ -653,7 +653,7 @@ static void snd_cx88_dev_free(snd_card_t * card)
* Alsa Constructor - Component probe * Alsa Constructor - Component probe
*/ */
static int devno=0; static int devno;
static int __devinit snd_cx88_create(snd_card_t *card, struct pci_dev *pci, static int __devinit snd_cx88_create(snd_card_t *card, struct pci_dev *pci,
snd_cx88_card_t **rchip) snd_cx88_card_t **rchip)
{ {
...@@ -805,7 +805,6 @@ static struct pci_driver cx88_audio_pci_driver = { ...@@ -805,7 +805,6 @@ static struct pci_driver cx88_audio_pci_driver = {
.id_table = cx88_audio_pci_tbl, .id_table = cx88_audio_pci_tbl,
.probe = cx88_audio_initdev, .probe = cx88_audio_initdev,
.remove = cx88_audio_finidev, .remove = cx88_audio_finidev,
SND_PCI_PM_CALLBACKS
}; };
/**************************************************************************** /****************************************************************************
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/mutex.h>
#include "cx88.h" #include "cx88.h"
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
...@@ -75,7 +76,7 @@ MODULE_PARM_DESC(nocomb,"disable comb filter"); ...@@ -75,7 +76,7 @@ MODULE_PARM_DESC(nocomb,"disable comb filter");
static unsigned int cx88_devcount; static unsigned int cx88_devcount;
static LIST_HEAD(cx88_devlist); static LIST_HEAD(cx88_devlist);
static DECLARE_MUTEX(devlist); static DEFINE_MUTEX(devlist);
#define NO_SYNC_LINE (-1U) #define NO_SYNC_LINE (-1U)
...@@ -1036,7 +1037,7 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci) ...@@ -1036,7 +1037,7 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
struct list_head *item; struct list_head *item;
int i; int i;
down(&devlist); mutex_lock(&devlist);
list_for_each(item,&cx88_devlist) { list_for_each(item,&cx88_devlist) {
core = list_entry(item, struct cx88_core, devlist); core = list_entry(item, struct cx88_core, devlist);
if (pci->bus->number != core->pci_bus) if (pci->bus->number != core->pci_bus)
...@@ -1047,7 +1048,7 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci) ...@@ -1047,7 +1048,7 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
if (0 != get_ressources(core,pci)) if (0 != get_ressources(core,pci))
goto fail_unlock; goto fail_unlock;
atomic_inc(&core->refcount); atomic_inc(&core->refcount);
up(&devlist); mutex_unlock(&devlist);
return core; return core;
} }
core = kzalloc(sizeof(*core),GFP_KERNEL); core = kzalloc(sizeof(*core),GFP_KERNEL);
...@@ -1122,13 +1123,13 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci) ...@@ -1122,13 +1123,13 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
cx88_card_setup(core); cx88_card_setup(core);
cx88_ir_init(core,pci); cx88_ir_init(core,pci);
up(&devlist); mutex_unlock(&devlist);
return core; return core;
fail_free: fail_free:
kfree(core); kfree(core);
fail_unlock: fail_unlock:
up(&devlist); mutex_unlock(&devlist);
return NULL; return NULL;
} }
...@@ -1140,14 +1141,14 @@ void cx88_core_put(struct cx88_core *core, struct pci_dev *pci) ...@@ -1140,14 +1141,14 @@ void cx88_core_put(struct cx88_core *core, struct pci_dev *pci)
if (!atomic_dec_and_test(&core->refcount)) if (!atomic_dec_and_test(&core->refcount))
return; return;
down(&devlist); mutex_lock(&devlist);
cx88_ir_fini(core); cx88_ir_fini(core);
if (0 == core->i2c_rc) if (0 == core->i2c_rc)
i2c_bit_del_bus(&core->i2c_adap); i2c_bit_del_bus(&core->i2c_adap);
list_del(&core->devlist); list_del(&core->devlist);
iounmap(core->lmmio); iounmap(core->lmmio);
cx88_devcount--; cx88_devcount--;
up(&devlist); mutex_unlock(&devlist);
kfree(core); kfree(core);
} }
......
...@@ -60,6 +60,11 @@ static unsigned int audio_debug = 0; ...@@ -60,6 +60,11 @@ static unsigned int audio_debug = 0;
module_param(audio_debug, int, 0644); module_param(audio_debug, int, 0644);
MODULE_PARM_DESC(audio_debug, "enable debug messages [audio]"); MODULE_PARM_DESC(audio_debug, "enable debug messages [audio]");
static unsigned int always_analog = 0;
module_param(always_analog,int,0644);
MODULE_PARM_DESC(always_analog,"force analog audio out");
#define dprintk(fmt, arg...) if (audio_debug) \ #define dprintk(fmt, arg...) if (audio_debug) \
printk(KERN_DEBUG "%s/0: " fmt, core->name , ## arg) printk(KERN_DEBUG "%s/0: " fmt, core->name , ## arg)
...@@ -155,7 +160,8 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl) ...@@ -155,7 +160,8 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
cx_write(AUD_I2SOUTPUTCNTL, 1); cx_write(AUD_I2SOUTPUTCNTL, 1);
cx_write(AUD_I2SCNTL, 0); cx_write(AUD_I2SCNTL, 0);
/* cx_write(AUD_APB_IN_RATE_ADJ, 0); */ /* cx_write(AUD_APB_IN_RATE_ADJ, 0); */
} else { }
if ((always_analog) || (!cx88_boards[core->board].blackbird)) {
ctl |= EN_DAC_ENABLE; ctl |= EN_DAC_ENABLE;
cx_write(AUD_CTL, ctl); cx_write(AUD_CTL, ctl);
} }
......
...@@ -32,6 +32,10 @@ ...@@ -32,6 +32,10 @@
#include "cx88-vp3054-i2c.h" #include "cx88-vp3054-i2c.h"
MODULE_DESCRIPTION("driver for cx2388x VP3054 design");
MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
MODULE_LICENSE("GPL");
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static void vp3054_bit_setscl(void *data, int state) static void vp3054_bit_setscl(void *data, int state)
......
...@@ -76,6 +76,58 @@ static IR_KEYTAB_TYPE ir_codes_em_terratec[IR_KEYTAB_SIZE] = { ...@@ -76,6 +76,58 @@ static IR_KEYTAB_TYPE ir_codes_em_terratec[IR_KEYTAB_SIZE] = {
[ 0x40 ] = KEY_ZOOM, [ 0x40 ] = KEY_ZOOM,
}; };
static IR_KEYTAB_TYPE ir_codes_em_pinnacle_usb[IR_KEYTAB_SIZE] = {
[ 0x3a ] = KEY_KP0,
[ 0x31 ] = KEY_KP1,
[ 0x32 ] = KEY_KP2,
[ 0x33 ] = KEY_KP3,
[ 0x34 ] = KEY_KP4,
[ 0x35 ] = KEY_KP5,
[ 0x36 ] = KEY_KP6,
[ 0x37 ] = KEY_KP7,
[ 0x38 ] = KEY_KP8,
[ 0x39 ] = KEY_KP9,
[ 0x2f ] = KEY_POWER,
[ 0x2e ] = KEY_P,
[ 0x1f ] = KEY_L,
[ 0x2b ] = KEY_I,
[ 0x2d ] = KEY_ZOOM,
[ 0x1e ] = KEY_ZOOM,
[ 0x1b ] = KEY_VOLUMEUP,
[ 0x0f ] = KEY_VOLUMEDOWN,
[ 0x17 ] = KEY_CHANNELUP,
[ 0x1c ] = KEY_CHANNELDOWN,
[ 0x25 ] = KEY_INFO,
[ 0x3c ] = KEY_MUTE,
[ 0x3d ] = KEY_LEFT,
[ 0x3b ] = KEY_RIGHT,
[ 0x3f ] = KEY_UP,
[ 0x3e ] = KEY_DOWN,
[ 0x1a ] = KEY_PAUSE,
[ 0x1d ] = KEY_MENU,
[ 0x19 ] = KEY_PLAY,
[ 0x16 ] = KEY_REWIND,
[ 0x13 ] = KEY_FORWARD,
[ 0x15 ] = KEY_PAUSE,
[ 0x0e ] = KEY_REWIND,
[ 0x0d ] = KEY_PLAY,
[ 0x0b ] = KEY_STOP,
[ 0x07 ] = KEY_FORWARD,
[ 0x27 ] = KEY_RECORD,
[ 0x26 ] = KEY_TUNER,
[ 0x29 ] = KEY_TEXT,
[ 0x2a ] = KEY_MEDIA,
[ 0x18 ] = KEY_EPG,
[ 0x27 ] = KEY_RECORD,
};
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static int get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) static int get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
...@@ -138,6 +190,28 @@ static int get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) ...@@ -138,6 +190,28 @@ static int get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
return 1; return 1;
} }
static int get_key_pinnacle_usb(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{
unsigned char buf[3];
/* poll IR chip */
if (3 != i2c_master_recv(&ir->c,buf,3)) {
dprintk("read error\n");
return -EIO;
}
dprintk("key %02x\n", buf[2]&0x3f);
if (buf[0]!=0x00){
return 0;
}
*ir_key = buf[2]&0x3f;
*ir_raw = buf[2]&0x3f;
return 1;
}
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir) void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir)
{ {
...@@ -159,6 +233,9 @@ void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir) ...@@ -159,6 +233,9 @@ void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir)
snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM28XX Terratec)"); snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM28XX Terratec)");
break; break;
case (EM2820_BOARD_PINNACLE_USB_2): case (EM2820_BOARD_PINNACLE_USB_2):
ir->ir_codes = ir_codes_em_pinnacle_usb;
ir->get_key = get_key_pinnacle_usb;
snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM28XX Pinnacle PCTV)");
break; break;
case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
ir->ir_codes = ir_codes_hauppauge_new; ir->ir_codes = ir_codes_hauppauge_new;
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/video_decoder.h> #include <linux/video_decoder.h>
#include <linux/mutex.h>
#include "em28xx.h" #include "em28xx.h"
#include <media/tuner.h> #include <media/tuner.h>
...@@ -191,7 +192,7 @@ static struct v4l2_queryctrl saa711x_qctrl[] = { ...@@ -191,7 +192,7 @@ static struct v4l2_queryctrl saa711x_qctrl[] = {
static struct usb_driver em28xx_usb_driver; static struct usb_driver em28xx_usb_driver;
static DECLARE_MUTEX(em28xx_sysfs_lock); static DEFINE_MUTEX(em28xx_sysfs_lock);
static DECLARE_RWSEM(em28xx_disconnect); static DECLARE_RWSEM(em28xx_disconnect);
/********************* v4l2 interface ******************************************/ /********************* v4l2 interface ******************************************/
...@@ -394,7 +395,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp) ...@@ -394,7 +395,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
*/ */
static void em28xx_release_resources(struct em28xx *dev) static void em28xx_release_resources(struct em28xx *dev)
{ {
down(&em28xx_sysfs_lock); mutex_lock(&em28xx_sysfs_lock);
em28xx_info("V4L2 device /dev/video%d deregistered\n", em28xx_info("V4L2 device /dev/video%d deregistered\n",
dev->vdev->minor); dev->vdev->minor);
...@@ -403,7 +404,7 @@ static void em28xx_release_resources(struct em28xx *dev) ...@@ -403,7 +404,7 @@ static void em28xx_release_resources(struct em28xx *dev)
/* video_unregister_device(dev->vbi_dev); */ /* video_unregister_device(dev->vbi_dev); */
em28xx_i2c_unregister(dev); em28xx_i2c_unregister(dev);
usb_put_dev(dev->udev); usb_put_dev(dev->udev);
up(&em28xx_sysfs_lock); mutex_unlock(&em28xx_sysfs_lock);
} }
/* /*
......
...@@ -66,12 +66,12 @@ MODULE_LICENSE("GPL"); ...@@ -66,12 +66,12 @@ MODULE_LICENSE("GPL");
/* module parameters */ /* module parameters */
static int opmode = OPMODE_AUTO; static int opmode = OPMODE_AUTO;
int msp_debug = 0; /* msp_debug output */ int msp_debug; /* msp_debug output */
int msp_once = 0; /* no continous stereo monitoring */ int msp_once; /* no continous stereo monitoring */
int msp_amsound = 0; /* hard-wire AM sound at 6.5 Hz (france), int msp_amsound; /* hard-wire AM sound at 6.5 Hz (france),
the autoscan seems work well only with FM... */ the autoscan seems work well only with FM... */
int msp_standard = 1; /* Override auto detect of audio msp_standard, if needed. */ int msp_standard = 1; /* Override auto detect of audio msp_standard, if needed. */
int msp_dolby = 0; int msp_dolby;
int msp_stereo_thresh = 0x190; /* a2 threshold for stereo/bilingual int msp_stereo_thresh = 0x190; /* a2 threshold for stereo/bilingual
(msp34xxg only) 0x00a0-0x03c0 */ (msp34xxg only) 0x00a0-0x03c0 */
...@@ -1031,8 +1031,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -1031,8 +1031,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
} }
default: default:
/* nothing */ /* unknown */
break; return -EINVAL;
} }
return 0; return 0;
} }
......
...@@ -6,14 +6,6 @@ ...@@ -6,14 +6,6 @@
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
struct msp_matrix {
int input;
int output;
};
/* ioctl for MSP_SET_MATRIX will have to be registered */
#define MSP_SET_MATRIX _IOW('m',17,struct msp_matrix)
/* This macro is allowed for *constants* only, gcc must calculate it /* This macro is allowed for *constants* only, gcc must calculate it
at compile time. Remember -- no floats in kernel mode */ at compile time. Remember -- no floats in kernel mode */
#define MSP_CARRIER(freq) ((int)((float)(freq / 18.432) * (1 << 24))) #define MSP_CARRIER(freq) ((int)((float)(freq / 18.432) * (1 << 24)))
......
...@@ -353,8 +353,8 @@ static int mt2032_init(struct i2c_client *c) ...@@ -353,8 +353,8 @@ static int mt2032_init(struct i2c_client *c)
} while (xok != 1 ); } while (xok != 1 );
t->xogc=xogc; t->xogc=xogc;
t->tv_freq = mt2032_set_tv_freq; t->set_tv_freq = mt2032_set_tv_freq;
t->radio_freq = mt2032_set_radio_freq; t->set_radio_freq = mt2032_set_radio_freq;
return(1); return(1);
} }
...@@ -481,8 +481,8 @@ static int mt2050_init(struct i2c_client *c) ...@@ -481,8 +481,8 @@ static int mt2050_init(struct i2c_client *c)
i2c_master_recv(c,buf,1); i2c_master_recv(c,buf,1);
tuner_dbg("mt2050: sro is %x\n",buf[0]); tuner_dbg("mt2050: sro is %x\n",buf[0]);
t->tv_freq = mt2050_set_tv_freq; t->set_tv_freq = mt2050_set_tv_freq;
t->radio_freq = mt2050_set_radio_freq; t->set_radio_freq = mt2050_set_radio_freq;
return 0; return 0;
} }
...@@ -494,8 +494,8 @@ int microtune_init(struct i2c_client *c) ...@@ -494,8 +494,8 @@ int microtune_init(struct i2c_client *c)
int company_code; int company_code;
memset(buf,0,sizeof(buf)); memset(buf,0,sizeof(buf));
t->tv_freq = NULL; t->set_tv_freq = NULL;
t->radio_freq = NULL; t->set_radio_freq = NULL;
t->standby = NULL; t->standby = NULL;
if (t->std & V4L2_STD_525_60) { if (t->std & V4L2_STD_525_60) {
tuner_dbg("pinnacle ntsc\n"); tuner_dbg("pinnacle ntsc\n");
......
...@@ -76,9 +76,9 @@ static volatile struct planb_registers *planb_regs; ...@@ -76,9 +76,9 @@ static volatile struct planb_registers *planb_regs;
static int def_norm = PLANB_DEF_NORM; /* default norm */ static int def_norm = PLANB_DEF_NORM; /* default norm */
static int video_nr = -1; static int video_nr = -1;
MODULE_PARM(def_norm, "i"); module_param(def_norm, int, 0);
MODULE_PARM_DESC(def_norm, "Default startup norm (0=PAL, 1=NTSC, 2=SECAM)"); MODULE_PARM_DESC(def_norm, "Default startup norm (0=PAL, 1=NTSC, 2=SECAM)");
MODULE_PARM(video_nr,"i"); module_param(video_nr, int, 0);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
...@@ -50,15 +50,15 @@ static unsigned int rbds = 0; ...@@ -50,15 +50,15 @@ static unsigned int rbds = 0;
static unsigned int plvl = 0; static unsigned int plvl = 0;
static unsigned int bufblocks = 100; static unsigned int bufblocks = 100;
MODULE_PARM(debug, "i"); module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "enable debug messages"); MODULE_PARM_DESC(debug, "enable debug messages");
MODULE_PARM(xtal, "i"); module_param(xtal, int, 0);
MODULE_PARM_DESC(xtal, "select oscillator frequency (0..3), default 0"); MODULE_PARM_DESC(xtal, "select oscillator frequency (0..3), default 0");
MODULE_PARM(rbds, "i"); module_param(rbds, int, 0);
MODULE_PARM_DESC(rbds, "select mode, 0=RDS, 1=RBDS, default 0"); MODULE_PARM_DESC(rbds, "select mode, 0=RDS, 1=RBDS, default 0");
MODULE_PARM(plvl, "i"); module_param(plvl, int, 0);
MODULE_PARM_DESC(plvl, "select pause level (0..3), default 0"); MODULE_PARM_DESC(plvl, "select pause level (0..3), default 0");
MODULE_PARM(bufblocks, "i"); module_param(bufblocks, int, 0);
MODULE_PARM_DESC(bufblocks, "number of buffered blocks, default 100"); MODULE_PARM_DESC(bufblocks, "number of buffered blocks, default 100");
MODULE_DESCRIPTION("v4l2 driver module for SAA6588 RDS decoder"); MODULE_DESCRIPTION("v4l2 driver module for SAA6588 RDS decoder");
......
...@@ -52,7 +52,7 @@ MODULE_LICENSE("GPL"); ...@@ -52,7 +52,7 @@ MODULE_LICENSE("GPL");
#include <linux/video_decoder.h> #include <linux/video_decoder.h>
static int debug = 0; static int debug = 0;
MODULE_PARM(debug, "i"); module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, " Set the default Debug level. Default: 0 (Off) - (0-1)"); MODULE_PARM_DESC(debug, " Set the default Debug level. Default: 0 (Off) - (0-1)");
......
...@@ -2515,6 +2515,7 @@ struct saa7134_board saa7134_boards[] = { ...@@ -2515,6 +2515,7 @@ struct saa7134_board saa7134_boards[] = {
.tuner_addr = ADDR_UNSET, .tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET,
.mpeg = SAA7134_MPEG_DVB, .mpeg = SAA7134_MPEG_DVB,
.gpiomask = 1 << 21,
.inputs = {{ .inputs = {{
.name = name_tv, .name = name_tv,
.vmux = 1, .vmux = 1,
...@@ -2529,6 +2530,11 @@ struct saa7134_board saa7134_boards[] = { ...@@ -2529,6 +2530,11 @@ struct saa7134_board saa7134_boards[] = {
.vmux = 8, .vmux = 8,
.amux = LINE1, .amux = LINE1,
}}, }},
.radio = {
.name = name_radio,
.amux = TV,
.gpio = 0x0200000,
},
}, },
[SAA7134_BOARD_MSI_TVATANYWHERE_PLUS] = { [SAA7134_BOARD_MSI_TVATANYWHERE_PLUS] = {
.name = "MSI TV@Anywhere plus", .name = "MSI TV@Anywhere plus",
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/sound.h> #include <linux/sound.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mutex.h>
#include "saa7134-reg.h" #include "saa7134-reg.h"
#include "saa7134.h" #include "saa7134.h"
...@@ -84,7 +85,7 @@ MODULE_PARM_DESC(radio_nr, "radio device number"); ...@@ -84,7 +85,7 @@ MODULE_PARM_DESC(radio_nr, "radio device number");
MODULE_PARM_DESC(tuner, "tuner type"); MODULE_PARM_DESC(tuner, "tuner type");
MODULE_PARM_DESC(card, "card type"); MODULE_PARM_DESC(card, "card type");
static DECLARE_MUTEX(devlist_lock); static DEFINE_MUTEX(devlist_lock);
LIST_HEAD(saa7134_devlist); LIST_HEAD(saa7134_devlist);
static LIST_HEAD(mops_list); static LIST_HEAD(mops_list);
static unsigned int saa7134_devcount; static unsigned int saa7134_devcount;
...@@ -140,7 +141,7 @@ static int pending_call(struct notifier_block *self, unsigned long state, ...@@ -140,7 +141,7 @@ static int pending_call(struct notifier_block *self, unsigned long state,
return NOTIFY_DONE; return NOTIFY_DONE;
} }
static int pending_registered=0; static int pending_registered;
static struct notifier_block pending_notifier = { static struct notifier_block pending_notifier = {
.notifier_call = pending_call, .notifier_call = pending_call,
}; };
...@@ -969,13 +970,13 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, ...@@ -969,13 +970,13 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
pci_set_drvdata(pci_dev,dev); pci_set_drvdata(pci_dev,dev);
saa7134_devcount++; saa7134_devcount++;
down(&devlist_lock); mutex_lock(&devlist_lock);
list_for_each(item,&mops_list) { list_for_each(item,&mops_list) {
mops = list_entry(item, struct saa7134_mpeg_ops, next); mops = list_entry(item, struct saa7134_mpeg_ops, next);
mpeg_ops_attach(mops, dev); mpeg_ops_attach(mops, dev);
} }
list_add_tail(&dev->devlist,&saa7134_devlist); list_add_tail(&dev->devlist,&saa7134_devlist);
up(&devlist_lock); mutex_unlock(&devlist_lock);
/* check for signal */ /* check for signal */
saa7134_irq_video_intl(dev); saa7134_irq_video_intl(dev);
...@@ -1031,13 +1032,13 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev) ...@@ -1031,13 +1032,13 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
saa7134_hwfini(dev); saa7134_hwfini(dev);
/* unregister */ /* unregister */
down(&devlist_lock); mutex_lock(&devlist_lock);
list_del(&dev->devlist); list_del(&dev->devlist);
list_for_each(item,&mops_list) { list_for_each(item,&mops_list) {
mops = list_entry(item, struct saa7134_mpeg_ops, next); mops = list_entry(item, struct saa7134_mpeg_ops, next);
mpeg_ops_detach(mops, dev); mpeg_ops_detach(mops, dev);
} }
up(&devlist_lock); mutex_unlock(&devlist_lock);
saa7134_devcount--; saa7134_devcount--;
saa7134_i2c_unregister(dev); saa7134_i2c_unregister(dev);
...@@ -1071,13 +1072,13 @@ int saa7134_ts_register(struct saa7134_mpeg_ops *ops) ...@@ -1071,13 +1072,13 @@ int saa7134_ts_register(struct saa7134_mpeg_ops *ops)
struct list_head *item; struct list_head *item;
struct saa7134_dev *dev; struct saa7134_dev *dev;
down(&devlist_lock); mutex_lock(&devlist_lock);
list_for_each(item,&saa7134_devlist) { list_for_each(item,&saa7134_devlist) {
dev = list_entry(item, struct saa7134_dev, devlist); dev = list_entry(item, struct saa7134_dev, devlist);
mpeg_ops_attach(ops, dev); mpeg_ops_attach(ops, dev);
} }
list_add_tail(&ops->next,&mops_list); list_add_tail(&ops->next,&mops_list);
up(&devlist_lock); mutex_unlock(&devlist_lock);
return 0; return 0;
} }
...@@ -1086,13 +1087,13 @@ void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops) ...@@ -1086,13 +1087,13 @@ void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops)
struct list_head *item; struct list_head *item;
struct saa7134_dev *dev; struct saa7134_dev *dev;
down(&devlist_lock); mutex_lock(&devlist_lock);
list_del(&ops->next); list_del(&ops->next);
list_for_each(item,&saa7134_devlist) { list_for_each(item,&saa7134_devlist) {
dev = list_entry(item, struct saa7134_dev, devlist); dev = list_entry(item, struct saa7134_dev, devlist);
mpeg_ops_detach(ops, dev); mpeg_ops_detach(ops, dev);
} }
up(&devlist_lock); mutex_unlock(&devlist_lock);
} }
EXPORT_SYMBOL(saa7134_ts_register); EXPORT_SYMBOL(saa7134_ts_register);
......
...@@ -180,8 +180,8 @@ static void tvaudio_init(struct saa7134_dev *dev) ...@@ -180,8 +180,8 @@ static void tvaudio_init(struct saa7134_dev *dev)
saa_writeb(SAA7134_AUDIO_CLOCK0, clock & 0xff); saa_writeb(SAA7134_AUDIO_CLOCK0, clock & 0xff);
saa_writeb(SAA7134_AUDIO_CLOCK1, (clock >> 8) & 0xff); saa_writeb(SAA7134_AUDIO_CLOCK1, (clock >> 8) & 0xff);
saa_writeb(SAA7134_AUDIO_CLOCK2, (clock >> 16) & 0xff); saa_writeb(SAA7134_AUDIO_CLOCK2, (clock >> 16) & 0xff);
// frame locked audio was reported not to be reliable /* frame locked audio is mandatory for NICAM */
saa_writeb(SAA7134_AUDIO_PLL_CTRL, 0x02); saa_writeb(SAA7134_AUDIO_PLL_CTRL, 0x01);
saa_writeb(SAA7134_NICAM_ERROR_LOW, 0x14); saa_writeb(SAA7134_NICAM_ERROR_LOW, 0x14);
saa_writeb(SAA7134_NICAM_ERROR_HIGH, 0x50); saa_writeb(SAA7134_NICAM_ERROR_HIGH, 0x50);
...@@ -809,7 +809,12 @@ static int tvaudio_thread_ddep(void *data) ...@@ -809,7 +809,12 @@ static int tvaudio_thread_ddep(void *data)
dprintk("ddep override: %s\n",stdres[audio_ddep]); dprintk("ddep override: %s\n",stdres[audio_ddep]);
} else if (&card(dev).radio == dev->input) { } else if (&card(dev).radio == dev->input) {
dprintk("FM Radio\n"); dprintk("FM Radio\n");
norms = (0x0f << 2) | 0x01; if (dev->tuner_type == TUNER_PHILIPS_TDA8290) {
norms = (0x11 << 2) | 0x01;
saa_dsp_writel(dev, 0x42c >> 2, 0x729555);
} else {
norms = (0x0f << 2) | 0x01;
}
} else { } else {
/* (let chip) scan for sound carrier */ /* (let chip) scan for sound carrier */
norms = 0; norms = 0;
......
...@@ -567,8 +567,8 @@ int tda8290_init(struct i2c_client *c) ...@@ -567,8 +567,8 @@ int tda8290_init(struct i2c_client *c)
} }
tuner_info("tuner: type set to %s\n", c->name); tuner_info("tuner: type set to %s\n", c->name);
t->tv_freq = set_tv_freq; t->set_tv_freq = set_tv_freq;
t->radio_freq = set_radio_freq; t->set_radio_freq = set_radio_freq;
t->has_signal = has_signal; t->has_signal = has_signal;
t->standby = standby; t->standby = standby;
t->tda827x_lpsel = 0; t->tda827x_lpsel = 0;
......
...@@ -62,7 +62,7 @@ extern int tuner_debug; ...@@ -62,7 +62,7 @@ extern int tuner_debug;
#define TEA5767_PORT1_HIGH 0x01 #define TEA5767_PORT1_HIGH 0x01
/* Forth register */ /* Fourth register */
#define TEA5767_PORT2_HIGH 0x80 #define TEA5767_PORT2_HIGH 0x80
/* Chips stops working. Only I2C bus remains on */ /* Chips stops working. Only I2C bus remains on */
#define TEA5767_STDBY 0x40 #define TEA5767_STDBY 0x40
...@@ -85,7 +85,7 @@ extern int tuner_debug; ...@@ -85,7 +85,7 @@ extern int tuner_debug;
/* If activate PORT 1 indicates SEARCH or else it is used as PORT1 */ /* If activate PORT 1 indicates SEARCH or else it is used as PORT1 */
#define TEA5767_SRCH_IND 0x01 #define TEA5767_SRCH_IND 0x01
/* Fiveth register */ /* Fifth register */
/* By activating, it will use Xtal at 13 MHz as reference for divider */ /* By activating, it will use Xtal at 13 MHz as reference for divider */
#define TEA5767_PLLREF_ENABLE 0x80 #define TEA5767_PLLREF_ENABLE 0x80
...@@ -109,13 +109,13 @@ extern int tuner_debug; ...@@ -109,13 +109,13 @@ extern int tuner_debug;
#define TEA5767_STEREO_MASK 0x80 #define TEA5767_STEREO_MASK 0x80
#define TEA5767_IF_CNTR_MASK 0x7f #define TEA5767_IF_CNTR_MASK 0x7f
/* Four register */ /* Fourth register */
#define TEA5767_ADC_LEVEL_MASK 0xf0 #define TEA5767_ADC_LEVEL_MASK 0xf0
/* should be 0 */ /* should be 0 */
#define TEA5767_CHIP_ID_MASK 0x0f #define TEA5767_CHIP_ID_MASK 0x0f
/* Fiveth register */ /* Fifth register */
/* Reserved for future extensions */ /* Reserved for future extensions */
#define TEA5767_RESERVED_MASK 0xff #define TEA5767_RESERVED_MASK 0xff
...@@ -220,19 +220,19 @@ static void set_radio_freq(struct i2c_client *c, unsigned int frq) ...@@ -220,19 +220,19 @@ static void set_radio_freq(struct i2c_client *c, unsigned int frq)
tuner_dbg ("TEA5767 radio HIGH LO inject xtal @ 13 MHz\n"); tuner_dbg ("TEA5767 radio HIGH LO inject xtal @ 13 MHz\n");
buffer[2] |= TEA5767_HIGH_LO_INJECT; buffer[2] |= TEA5767_HIGH_LO_INJECT;
buffer[4] |= TEA5767_PLLREF_ENABLE; buffer[4] |= TEA5767_PLLREF_ENABLE;
div = (frq * 4000 / 16 + 700000 + 225000 + 25000) / 50000; div = (frq * (4000 / 16) + 700000 + 225000 + 25000) / 50000;
break; break;
case TEA5767_LOW_LO_13MHz: case TEA5767_LOW_LO_13MHz:
tuner_dbg ("TEA5767 radio LOW LO inject xtal @ 13 MHz\n"); tuner_dbg ("TEA5767 radio LOW LO inject xtal @ 13 MHz\n");
buffer[4] |= TEA5767_PLLREF_ENABLE; buffer[4] |= TEA5767_PLLREF_ENABLE;
div = (frq * 4000 / 16 - 700000 - 225000 + 25000) / 50000; div = (frq * (4000 / 16) - 700000 - 225000 + 25000) / 50000;
break; break;
case TEA5767_LOW_LO_32768: case TEA5767_LOW_LO_32768:
tuner_dbg ("TEA5767 radio LOW LO inject xtal @ 32,768 MHz\n"); tuner_dbg ("TEA5767 radio LOW LO inject xtal @ 32,768 MHz\n");
buffer[3] |= TEA5767_XTAL_32768; buffer[3] |= TEA5767_XTAL_32768;
/* const 700=4000*175 Khz - to adjust freq to right value */ /* const 700=4000*175 Khz - to adjust freq to right value */
div = ((frq * 4000 / 16 - 700000 - 225000) + 16384) >> 15; div = ((frq * (4000 / 16) - 700000 - 225000) + 16384) >> 15;
break; break;
case TEA5767_HIGH_LO_32768: case TEA5767_HIGH_LO_32768:
default: default:
...@@ -350,8 +350,8 @@ int tea5767_tuner_init(struct i2c_client *c) ...@@ -350,8 +350,8 @@ int tea5767_tuner_init(struct i2c_client *c)
tuner_info("type set to %d (%s)\n", t->type, "Philips TEA5767HN FM Radio"); tuner_info("type set to %d (%s)\n", t->type, "Philips TEA5767HN FM Radio");
strlcpy(c->name, "tea5767", sizeof(c->name)); strlcpy(c->name, "tea5767", sizeof(c->name));
t->tv_freq = set_tv_freq; t->set_tv_freq = set_tv_freq;
t->radio_freq = set_radio_freq; t->set_radio_freq = set_radio_freq;
t->has_signal = tea5767_signal; t->has_signal = tea5767_signal;
t->is_stereo = tea5767_stereo; t->is_stereo = tea5767_stereo;
t->standby = tea5767_standby; t->standby = tea5767_standby;
......
...@@ -82,7 +82,7 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq) ...@@ -82,7 +82,7 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq)
tuner_warn ("tuner type not set\n"); tuner_warn ("tuner type not set\n");
return; return;
} }
if (NULL == t->tv_freq) { if (NULL == t->set_tv_freq) {
tuner_warn ("Tuner has no way to set tv freq\n"); tuner_warn ("Tuner has no way to set tv freq\n");
return; return;
} }
...@@ -90,8 +90,14 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq) ...@@ -90,8 +90,14 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq)
tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n", tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
freq / 16, freq % 16 * 100 / 16, tv_range[0], freq / 16, freq % 16 * 100 / 16, tv_range[0],
tv_range[1]); tv_range[1]);
/* V4L2 spec: if the freq is not possible then the closest
possible value should be selected */
if (freq < tv_range[0] * 16)
freq = tv_range[0] * 16;
else
freq = tv_range[1] * 16;
} }
t->tv_freq(c, freq); t->set_tv_freq(c, freq);
} }
static void set_radio_freq(struct i2c_client *c, unsigned int freq) static void set_radio_freq(struct i2c_client *c, unsigned int freq)
...@@ -102,18 +108,23 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq) ...@@ -102,18 +108,23 @@ static void set_radio_freq(struct i2c_client *c, unsigned int freq)
tuner_warn ("tuner type not set\n"); tuner_warn ("tuner type not set\n");
return; return;
} }
if (NULL == t->radio_freq) { if (NULL == t->set_radio_freq) {
tuner_warn ("tuner has no way to set radio frequency\n"); tuner_warn ("tuner has no way to set radio frequency\n");
return; return;
} }
if (freq <= radio_range[0] * 16000 || freq >= radio_range[1] * 16000) { if (freq < radio_range[0] * 16000 || freq > radio_range[1] * 16000) {
tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n", tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
freq / 16000, freq % 16000 * 100 / 16000, freq / 16000, freq % 16000 * 100 / 16000,
radio_range[0], radio_range[1]); radio_range[0], radio_range[1]);
/* V4L2 spec: if the freq is not possible then the closest
possible value should be selected */
if (freq < radio_range[0] * 16000)
freq = radio_range[0] * 16000;
else
freq = radio_range[1] * 16000;
} }
t->radio_freq(c, freq); t->set_radio_freq(c, freq);
return;
} }
static void set_freq(struct i2c_client *c, unsigned long freq) static void set_freq(struct i2c_client *c, unsigned long freq)
...@@ -125,15 +136,16 @@ static void set_freq(struct i2c_client *c, unsigned long freq) ...@@ -125,15 +136,16 @@ static void set_freq(struct i2c_client *c, unsigned long freq)
tuner_dbg("radio freq set to %lu.%02lu\n", tuner_dbg("radio freq set to %lu.%02lu\n",
freq / 16000, freq % 16000 * 100 / 16000); freq / 16000, freq % 16000 * 100 / 16000);
set_radio_freq(c, freq); set_radio_freq(c, freq);
t->radio_freq = freq;
break; break;
case V4L2_TUNER_ANALOG_TV: case V4L2_TUNER_ANALOG_TV:
case V4L2_TUNER_DIGITAL_TV: case V4L2_TUNER_DIGITAL_TV:
tuner_dbg("tv freq set to %lu.%02lu\n", tuner_dbg("tv freq set to %lu.%02lu\n",
freq / 16, freq % 16 * 100 / 16); freq / 16, freq % 16 * 100 / 16);
set_tv_freq(c, freq); set_tv_freq(c, freq);
t->tv_freq = freq;
break; break;
} }
t->freq = freq;
} }
static void set_type(struct i2c_client *c, unsigned int type, static void set_type(struct i2c_client *c, unsigned int type,
...@@ -212,7 +224,7 @@ static void set_type(struct i2c_client *c, unsigned int type, ...@@ -212,7 +224,7 @@ static void set_type(struct i2c_client *c, unsigned int type,
if (t->mode_mask == T_UNINITIALIZED) if (t->mode_mask == T_UNINITIALIZED)
t->mode_mask = new_mode_mask; t->mode_mask = new_mode_mask;
set_freq(c, t->freq); set_freq(c, (V4L2_TUNER_RADIO == t->mode) ? t->radio_freq : t->tv_freq);
tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n", tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
c->adapter->name, c->driver->driver.name, c->addr << 1, type, c->adapter->name, c->driver->driver.name, c->addr << 1, type,
t->mode_mask); t->mode_mask);
...@@ -377,11 +389,11 @@ static void tuner_status(struct i2c_client *client) ...@@ -377,11 +389,11 @@ static void tuner_status(struct i2c_client *client)
default: p = "undefined"; break; default: p = "undefined"; break;
} }
if (t->mode == V4L2_TUNER_RADIO) { if (t->mode == V4L2_TUNER_RADIO) {
freq = t->freq / 16000; freq = t->radio_freq / 16000;
freq_fraction = (t->freq % 16000) * 100 / 16000; freq_fraction = (t->radio_freq % 16000) * 100 / 16000;
} else { } else {
freq = t->freq / 16; freq = t->tv_freq / 16;
freq_fraction = (t->freq % 16) * 100 / 16; freq_fraction = (t->tv_freq % 16) * 100 / 16;
} }
tuner_info("Tuner mode: %s\n", p); tuner_info("Tuner mode: %s\n", p);
tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction); tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction);
...@@ -456,7 +468,7 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) ...@@ -456,7 +468,7 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
t->type = TUNER_TEA5767; t->type = TUNER_TEA5767;
t->mode_mask = T_RADIO; t->mode_mask = T_RADIO;
t->mode = T_STANDBY; t->mode = T_STANDBY;
t->freq = 87.5 * 16; /* Sets freq to FM range */ t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
default_mode_mask &= ~T_RADIO; default_mode_mask &= ~T_RADIO;
goto register_client; goto register_client;
...@@ -469,7 +481,8 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind) ...@@ -469,7 +481,8 @@ static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
if (default_mode_mask != T_UNINITIALIZED) { if (default_mode_mask != T_UNINITIALIZED) {
tuner_dbg ("Setting mode_mask to 0x%02x\n", default_mode_mask); tuner_dbg ("Setting mode_mask to 0x%02x\n", default_mode_mask);
t->mode_mask = default_mode_mask; t->mode_mask = default_mode_mask;
t->freq = 400 * 16; /* Sets freq to VHF High */ t->tv_freq = 400 * 16; /* Sets freq to VHF High */
t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
default_mode_mask = T_UNINITIALIZED; default_mode_mask = T_UNINITIALIZED;
} }
...@@ -565,16 +578,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -565,16 +578,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
set_addr(client, (struct tuner_setup *)arg); set_addr(client, (struct tuner_setup *)arg);
break; break;
case AUDC_SET_RADIO: case AUDC_SET_RADIO:
set_mode(client,t,V4L2_TUNER_RADIO, "AUDC_SET_RADIO"); if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO")
== EINVAL)
return 0;
if (t->radio_freq)
set_freq(client, t->radio_freq);
break; break;
case TUNER_SET_STANDBY: case TUNER_SET_STANDBY:
{ if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL)
if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL) return 0;
return 0; if (t->standby)
if (t->standby) t->standby (client);
t->standby (client); break;
break;
}
case VIDIOCSAUDIO: case VIDIOCSAUDIO:
if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
return 0; return 0;
...@@ -583,7 +598,6 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -583,7 +598,6 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
/* Should be implemented, since bttv calls it */ /* Should be implemented, since bttv calls it */
tuner_dbg("VIDIOCSAUDIO not implemented.\n"); tuner_dbg("VIDIOCSAUDIO not implemented.\n");
break; break;
/* --- v4l ioctls --- */ /* --- v4l ioctls --- */
/* take care: bttv does userspace copying, we'll get a /* take care: bttv does userspace copying, we'll get a
...@@ -609,8 +623,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -609,8 +623,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
if (vc->norm < ARRAY_SIZE(map)) if (vc->norm < ARRAY_SIZE(map))
t->std = map[vc->norm]; t->std = map[vc->norm];
tuner_fixup_std(t); tuner_fixup_std(t);
if (t->freq) if (t->tv_freq)
set_tv_freq(client, t->freq); set_tv_freq(client, t->tv_freq);
return 0; return 0;
} }
case VIDIOCSFREQ: case VIDIOCSFREQ:
...@@ -684,15 +698,14 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -684,15 +698,14 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
t->std = *id; t->std = *id;
tuner_fixup_std(t); tuner_fixup_std(t);
if (t->freq) if (t->tv_freq)
set_freq(client, t->freq); set_freq(client, t->tv_freq);
break; break;
} }
case VIDIOC_S_FREQUENCY: case VIDIOC_S_FREQUENCY:
{ {
struct v4l2_frequency *f = arg; struct v4l2_frequency *f = arg;
t->freq = f->frequency;
switch_v4l2(); switch_v4l2();
if (V4L2_TUNER_RADIO == f->type && if (V4L2_TUNER_RADIO == f->type &&
V4L2_TUNER_RADIO != t->mode) { V4L2_TUNER_RADIO != t->mode) {
...@@ -700,7 +713,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -700,7 +713,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
== EINVAL) == EINVAL)
return 0; return 0;
} }
set_freq(client,t->freq); set_freq(client,f->frequency);
break; break;
} }
...@@ -712,7 +725,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -712,7 +725,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
return 0; return 0;
switch_v4l2(); switch_v4l2();
f->type = t->mode; f->type = t->mode;
f->frequency = t->freq; f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
t->radio_freq : t->tv_freq;
break; break;
} }
case VIDIOC_G_TUNER: case VIDIOC_G_TUNER:
...@@ -763,7 +777,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -763,7 +777,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
if (V4L2_TUNER_RADIO == t->mode) { if (V4L2_TUNER_RADIO == t->mode) {
t->audmode = tuner->audmode; t->audmode = tuner->audmode;
set_radio_freq(client, t->freq); set_radio_freq(client, t->radio_freq);
} }
break; break;
} }
...@@ -791,8 +805,13 @@ static int tuner_resume(struct device *dev) ...@@ -791,8 +805,13 @@ static int tuner_resume(struct device *dev)
struct tuner *t = i2c_get_clientdata (c); struct tuner *t = i2c_get_clientdata (c);
tuner_dbg ("resume\n"); tuner_dbg ("resume\n");
if (t->freq) if (V4L2_TUNER_RADIO == t->mode) {
set_freq(c, t->freq); if (t->radio_freq)
set_freq(c, t->radio_freq);
} else {
if (t->tv_freq)
set_freq(c, t->tv_freq);
}
return 0; return 0;
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -190,7 +190,7 @@ hauppauge_tuner[] = ...@@ -190,7 +190,7 @@ hauppauge_tuner[] =
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"}, { TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"},
{ TUNER_TCL_2002N, "TCL 2002N 6A"}, { TUNER_TCL_2002N, "TCL 2002N 6A"},
{ TUNER_PHILIPS_FM1236_MK3, "Philips FQ1236 MK3"}, { TUNER_PHILIPS_FM1236_MK3, "Philips FQ1236 MK3"},
{ TUNER_ABSENT, "Samsung TCPN 2121P30A"}, { TUNER_SAMSUNG_TCPN_2121P30A, "Samsung TCPN 2121P30A"},
{ TUNER_ABSENT, "Samsung TCPE 4121P30A"}, { TUNER_ABSENT, "Samsung TCPE 4121P30A"},
{ TUNER_PHILIPS_FM1216ME_MK3, "TCL MFPE05 2"}, { TUNER_PHILIPS_FM1216ME_MK3, "TCL MFPE05 2"},
/* 90-99 */ /* 90-99 */
......
...@@ -634,7 +634,7 @@ struct i2c_vbi_ram_value { ...@@ -634,7 +634,7 @@ struct i2c_vbi_ram_value {
unsigned char values[26]; unsigned char values[26];
}; };
struct i2c_vbi_ram_value vbi_ram_default[] = static struct i2c_vbi_ram_value vbi_ram_default[] =
{ {
{0x010, /* WST SECAM 6 */ {0x010, /* WST SECAM 6 */
{ 0xaa, 0xaa, 0xff, 0xff , 0xe7, 0x2e, 0x20, 0x26, 0xe6, 0xb4, 0x0e, 0x0, 0x0, 0x0, 0x10, 0x0 } { 0xaa, 0xaa, 0xff, 0xff , 0xe7, 0x2e, 0x20, 0x26, 0xe6, 0xb4, 0x0e, 0x0, 0x0, 0x0, 0x10, 0x0 }
......
...@@ -306,6 +306,7 @@ static const char *v4l2_int_ioctls[] = { ...@@ -306,6 +306,7 @@ static const char *v4l2_int_ioctls[] = {
#endif #endif
[_IOC_NR(AUDC_SET_RADIO)] = "AUDC_SET_RADIO", [_IOC_NR(AUDC_SET_RADIO)] = "AUDC_SET_RADIO",
[_IOC_NR(AUDC_SET_INPUT)] = "AUDC_SET_INPUT", [_IOC_NR(AUDC_SET_INPUT)] = "AUDC_SET_INPUT",
[_IOC_NR(MSP_SET_MATRIX)] = "MSP_SET_MATRIX",
[_IOC_NR(TUNER_SET_TYPE_ADDR)] = "TUNER_SET_TYPE_ADDR", [_IOC_NR(TUNER_SET_TYPE_ADDR)] = "TUNER_SET_TYPE_ADDR",
[_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY", [_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY",
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <linux/devfs_fs_kernel.h> #include <linux/devfs_fs_kernel.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/semaphore.h>
#include <linux/videodev.h> #include <linux/videodev.h>
...@@ -83,7 +82,7 @@ static struct class video_class = { ...@@ -83,7 +82,7 @@ static struct class video_class = {
*/ */
static struct video_device *video_device[VIDEO_NUM_DEVICES]; static struct video_device *video_device[VIDEO_NUM_DEVICES];
static DECLARE_MUTEX(videodev_lock); static DEFINE_MUTEX(videodev_lock);
struct video_device* video_devdata(struct file *file) struct video_device* video_devdata(struct file *file)
{ {
...@@ -102,15 +101,15 @@ static int video_open(struct inode *inode, struct file *file) ...@@ -102,15 +101,15 @@ static int video_open(struct inode *inode, struct file *file)
if(minor>=VIDEO_NUM_DEVICES) if(minor>=VIDEO_NUM_DEVICES)
return -ENODEV; return -ENODEV;
down(&videodev_lock); mutex_lock(&videodev_lock);
vfl=video_device[minor]; vfl=video_device[minor];
if(vfl==NULL) { if(vfl==NULL) {
up(&videodev_lock); mutex_unlock(&videodev_lock);
request_module("char-major-%d-%d", VIDEO_MAJOR, minor); request_module("char-major-%d-%d", VIDEO_MAJOR, minor);
down(&videodev_lock); mutex_lock(&videodev_lock);
vfl=video_device[minor]; vfl=video_device[minor];
if (vfl==NULL) { if (vfl==NULL) {
up(&videodev_lock); mutex_unlock(&videodev_lock);
return -ENODEV; return -ENODEV;
} }
} }
...@@ -123,7 +122,7 @@ static int video_open(struct inode *inode, struct file *file) ...@@ -123,7 +122,7 @@ static int video_open(struct inode *inode, struct file *file)
file->f_op = fops_get(old_fops); file->f_op = fops_get(old_fops);
} }
fops_put(old_fops); fops_put(old_fops);
up(&videodev_lock); mutex_unlock(&videodev_lock);
return err; return err;
} }
...@@ -304,12 +303,12 @@ int video_register_device(struct video_device *vfd, int type, int nr) ...@@ -304,12 +303,12 @@ int video_register_device(struct video_device *vfd, int type, int nr)
} }
/* pick a minor number */ /* pick a minor number */
down(&videodev_lock); mutex_lock(&videodev_lock);
if (nr >= 0 && nr < end-base) { if (nr >= 0 && nr < end-base) {
/* use the one the driver asked for */ /* use the one the driver asked for */
i = base+nr; i = base+nr;
if (NULL != video_device[i]) { if (NULL != video_device[i]) {
up(&videodev_lock); mutex_unlock(&videodev_lock);
return -ENFILE; return -ENFILE;
} }
} else { } else {
...@@ -318,13 +317,13 @@ int video_register_device(struct video_device *vfd, int type, int nr) ...@@ -318,13 +317,13 @@ int video_register_device(struct video_device *vfd, int type, int nr)
if (NULL == video_device[i]) if (NULL == video_device[i])
break; break;
if (i == end) { if (i == end) {
up(&videodev_lock); mutex_unlock(&videodev_lock);
return -ENFILE; return -ENFILE;
} }
} }
video_device[i]=vfd; video_device[i]=vfd;
vfd->minor=i; vfd->minor=i;
up(&videodev_lock); mutex_unlock(&videodev_lock);
sprintf(vfd->devfs_name, "v4l/%s%d", name_base, i - base); sprintf(vfd->devfs_name, "v4l/%s%d", name_base, i - base);
devfs_mk_cdev(MKDEV(VIDEO_MAJOR, vfd->minor), devfs_mk_cdev(MKDEV(VIDEO_MAJOR, vfd->minor),
...@@ -362,14 +361,14 @@ int video_register_device(struct video_device *vfd, int type, int nr) ...@@ -362,14 +361,14 @@ int video_register_device(struct video_device *vfd, int type, int nr)
void video_unregister_device(struct video_device *vfd) void video_unregister_device(struct video_device *vfd)
{ {
down(&videodev_lock); mutex_lock(&videodev_lock);
if(video_device[vfd->minor]!=vfd) if(video_device[vfd->minor]!=vfd)
panic("videodev: bad unregister"); panic("videodev: bad unregister");
devfs_remove(vfd->devfs_name); devfs_remove(vfd->devfs_name);
video_device[vfd->minor]=NULL; video_device[vfd->minor]=NULL;
class_device_unregister(&vfd->class_dev); class_device_unregister(&vfd->class_dev);
up(&videodev_lock); mutex_unlock(&videodev_lock);
} }
......
...@@ -104,6 +104,10 @@ ...@@ -104,6 +104,10 @@
#define I2C_DRIVERID_AKITAIOEXP 74 /* IO Expander on Sharp SL-C1000 */ #define I2C_DRIVERID_AKITAIOEXP 74 /* IO Expander on Sharp SL-C1000 */
#define I2C_DRIVERID_INFRARED 75 /* I2C InfraRed on Video boards */ #define I2C_DRIVERID_INFRARED 75 /* I2C InfraRed on Video boards */
#define I2C_DRIVERID_TVP5150 76 /* TVP5150 video decoder */ #define I2C_DRIVERID_TVP5150 76 /* TVP5150 video decoder */
#define I2C_DRIVERID_WM8739 77 /* wm8739 audio processor */
#define I2C_DRIVERID_UPD64083 78 /* upd64083 video processor */
#define I2C_DRIVERID_UPD64031A 79 /* upd64031a video processor */
#define I2C_DRIVERID_SAA717X 80 /* saa717x video encoder */
#define I2C_DRIVERID_I2CDEV 900 #define I2C_DRIVERID_I2CDEV 900
#define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */ #define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */
......
/*
* descriptions for simple tuners.
*/
#ifndef __TUNER_TYPES_H__
#define __TUNER_TYPES_H__
enum param_type {
TUNER_PARAM_TYPE_RADIO, \
TUNER_PARAM_TYPE_PAL, \
TUNER_PARAM_TYPE_SECAM, \
TUNER_PARAM_TYPE_NTSC
};
struct tuner_range {
unsigned short limit;
unsigned char cb;
};
struct tuner_params {
enum param_type type;
/* Many Philips based tuners have a comment like this in their
* datasheet:
*
* For channel selection involving band switching, and to ensure
* smooth tuning to the desired channel without causing
* unnecessary charge pump action, it is recommended to consider
* the difference between wanted channel frequency and the
* current channel frequency. Unnecessary charge pump action
* will result in very low tuning voltage which may drive the
* oscillator to extreme conditions.
*
* Set cb_first_if_lower_freq to 1, if this check is
* required for this tuner.
*
* I tested this for PAL by first setting the TV frequency to
* 203 MHz and then switching to 96.6 MHz FM radio. The result was
* static unless the control byte was sent first.
*/
unsigned int cb_first_if_lower_freq:1;
unsigned char config; /* to be moved into struct tuner_range for dvb-pll merge */
unsigned int count;
struct tuner_range *ranges;
};
struct tunertype {
char *name;
struct tuner_params *params;
};
extern struct tunertype tuners[];
extern unsigned const int tuner_count;
#endif
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#define _TUNER_H #define _TUNER_H
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/tuner-types.h>
#define ADDR_UNSET (255) #define ADDR_UNSET (255)
...@@ -114,6 +115,7 @@ ...@@ -114,6 +115,7 @@
#define TUNER_PHILIPS_TUV1236D 68 /* ATI HDTV Wonder */ #define TUNER_PHILIPS_TUV1236D 68 /* ATI HDTV Wonder */
#define TUNER_TNF_5335MF 69 /* Sabrent Bt848 */ #define TUNER_TNF_5335MF 69 /* Sabrent Bt848 */
#define TUNER_SAMSUNG_TCPN_2121P30A 70 /* Hauppauge PVR-500MCE NTSC */
/* tv card specific */ /* tv card specific */
#define TDA9887_PRESENT (1<<0) #define TDA9887_PRESENT (1<<0)
...@@ -177,7 +179,9 @@ struct tuner { ...@@ -177,7 +179,9 @@ struct tuner {
unsigned int mode; unsigned int mode;
unsigned int mode_mask; /* Combination of allowable modes */ unsigned int mode_mask; /* Combination of allowable modes */
unsigned int freq; /* keep track of the current settings */ unsigned int tv_freq; /* keep track of the current settings */
unsigned int radio_freq;
u16 last_div;
unsigned int audmode; unsigned int audmode;
v4l2_std_id std; v4l2_std_id std;
...@@ -195,8 +199,8 @@ struct tuner { ...@@ -195,8 +199,8 @@ struct tuner {
unsigned int sgIF; unsigned int sgIF;
/* function ptrs */ /* function ptrs */
void (*tv_freq)(struct i2c_client *c, unsigned int freq); void (*set_tv_freq)(struct i2c_client *c, unsigned int freq);
void (*radio_freq)(struct i2c_client *c, unsigned int freq); void (*set_radio_freq)(struct i2c_client *c, unsigned int freq);
int (*has_signal)(struct i2c_client *c); int (*has_signal)(struct i2c_client *c);
int (*is_stereo)(struct i2c_client *c); int (*is_stereo)(struct i2c_client *c);
void (*standby)(struct i2c_client *c); void (*standby)(struct i2c_client *c);
......
...@@ -120,6 +120,13 @@ enum v4l2_chip_ident { ...@@ -120,6 +120,13 @@ enum v4l2_chip_ident {
/* select from TV,radio,extern,MUTE */ /* select from TV,radio,extern,MUTE */
#define AUDC_SET_INPUT _IOW('d',89,int) #define AUDC_SET_INPUT _IOW('d',89,int)
/* msp3400 ioctl: will be removed in the near future */
struct msp_matrix {
int input;
int output;
};
#define MSP_SET_MATRIX _IOW('m',17,struct msp_matrix)
/* tuner ioctls */ /* tuner ioctls */
/* Sets tuner type and its I2C addr */ /* Sets tuner type and its I2C addr */
#define TUNER_SET_TYPE_ADDR _IOW('d',90,int) #define TUNER_SET_TYPE_ADDR _IOW('d',90,int)
......
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