Commit 56fc08ca authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab Committed by Linus Torvalds

[PATCH] v4l: update for tuner cards and some V4L chips

Tuner improvements and additions.  TEA5767 FM tuner added.  Several small
fixes.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: default avatarNickolay V Shmyrev <nshmyrev@yandex.ru>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b45009b0
/* /*
* $Id: ir-common.c,v 1.8 2005/02/22 12:28:40 kraxel Exp $ * $Id: ir-common.c,v 1.10 2005/05/22 19:23:39 nsh Exp $
* *
* some common structs and functions to handle infrared remotes via * some common structs and functions to handle infrared remotes via
* input layer ... * input layer ...
...@@ -131,10 +131,10 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { ...@@ -131,10 +131,10 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
[ 18 ] = KEY_KP0, [ 18 ] = KEY_KP0,
[ 0 ] = KEY_POWER, [ 0 ] = KEY_POWER,
[ 27 ] = KEY_LANGUAGE, //MTS button // [ 27 ] = MTS button
[ 2 ] = KEY_TUNER, // TV/FM [ 2 ] = KEY_TUNER, // TV/FM
[ 30 ] = KEY_VIDEO, [ 30 ] = KEY_VIDEO,
[ 22 ] = KEY_INFO, //display button // [ 22 ] = display button
[ 4 ] = KEY_VOLUMEUP, [ 4 ] = KEY_VOLUMEUP,
[ 8 ] = KEY_VOLUMEDOWN, [ 8 ] = KEY_VOLUMEDOWN,
[ 12 ] = KEY_CHANNELUP, [ 12 ] = KEY_CHANNELUP,
...@@ -142,7 +142,7 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { ...@@ -142,7 +142,7 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
[ 3 ] = KEY_ZOOM, // fullscreen [ 3 ] = KEY_ZOOM, // fullscreen
[ 31 ] = KEY_SUBTITLE, // closed caption/teletext [ 31 ] = KEY_SUBTITLE, // closed caption/teletext
[ 32 ] = KEY_SLEEP, [ 32 ] = KEY_SLEEP,
[ 41 ] = KEY_SEARCH, //boss key // [ 41 ] = boss key
[ 20 ] = KEY_MUTE, [ 20 ] = KEY_MUTE,
[ 43 ] = KEY_RED, [ 43 ] = KEY_RED,
[ 44 ] = KEY_GREEN, [ 44 ] = KEY_GREEN,
...@@ -150,17 +150,17 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = { ...@@ -150,17 +150,17 @@ IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
[ 46 ] = KEY_BLUE, [ 46 ] = KEY_BLUE,
[ 24 ] = KEY_KPPLUS, //fine tune + [ 24 ] = KEY_KPPLUS, //fine tune +
[ 25 ] = KEY_KPMINUS, //fine tune - [ 25 ] = KEY_KPMINUS, //fine tune -
[ 42 ] = KEY_ANGLE, //picture in picture // [ 42 ] = picture in picture
[ 33 ] = KEY_KPDOT, [ 33 ] = KEY_KPDOT,
[ 19 ] = KEY_KPENTER, [ 19 ] = KEY_KPENTER,
[ 17 ] = KEY_AGAIN, //recall // [ 17 ] = recall
[ 34 ] = KEY_BACK, [ 34 ] = KEY_BACK,
[ 35 ] = KEY_PLAYPAUSE, [ 35 ] = KEY_PLAYPAUSE,
[ 36 ] = KEY_NEXT, [ 36 ] = KEY_NEXT,
[ 37 ] = KEY_T, //time shifting // [ 37 ] = time shifting
[ 38 ] = KEY_STOP, [ 38 ] = KEY_STOP,
[ 39 ] = KEY_RECORD, [ 39 ] = KEY_RECORD
[ 40 ] = KEY_SHUFFLE //snapshot // [ 40 ] = snapshot
}; };
EXPORT_SYMBOL_GPL(ir_codes_winfast); EXPORT_SYMBOL_GPL(ir_codes_winfast);
...@@ -184,18 +184,30 @@ IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = { ...@@ -184,18 +184,30 @@ IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = {
[ 0x07 ] = KEY_KP7, // 7 [ 0x07 ] = KEY_KP7, // 7
[ 0x08 ] = KEY_KP8, // 8 [ 0x08 ] = KEY_KP8, // 8
[ 0x09 ] = KEY_KP9, // 9 [ 0x09 ] = KEY_KP9, // 9
[ 0x0a ] = KEY_TEXT, // keypad asterisk as well
[ 0x0b ] = KEY_RED, // red button [ 0x0b ] = KEY_RED, // red button
[ 0x0c ] = KEY_OPTION, // black key without text [ 0x0c ] = KEY_RADIO, // radio
[ 0x0d ] = KEY_MENU, // menu [ 0x0d ] = KEY_MENU, // menu
[ 0x0e ] = KEY_SUBTITLE, // also the # key
[ 0x0f ] = KEY_MUTE, // mute [ 0x0f ] = KEY_MUTE, // mute
[ 0x10 ] = KEY_VOLUMEUP, // volume + [ 0x10 ] = KEY_VOLUMEUP, // volume +
[ 0x11 ] = KEY_VOLUMEDOWN, // volume - [ 0x11 ] = KEY_VOLUMEDOWN, // volume -
[ 0x1e ] = KEY_NEXT, // skip >| [ 0x12 ] = KEY_PREVIOUS, // previous channel
[ 0x14 ] = KEY_UP, // up
[ 0x15 ] = KEY_DOWN, // down
[ 0x16 ] = KEY_LEFT, // left
[ 0x17 ] = KEY_RIGHT, // right
[ 0x18 ] = KEY_VIDEO, // Videos
[ 0x19 ] = KEY_AUDIO, // Music
[ 0x1a ] = KEY_MHP, // Pictures - presume this means "Multimedia Home Platform"- no "PICTURES" key in input.h
[ 0x1b ] = KEY_EPG, // Guide
[ 0x1c ] = KEY_TV, // TV
[ 0x1e ] = KEY_NEXTSONG, // skip >|
[ 0x1f ] = KEY_EXIT, // back/exit [ 0x1f ] = KEY_EXIT, // back/exit
[ 0x20 ] = KEY_CHANNELUP, // channel / program + [ 0x20 ] = KEY_CHANNELUP, // channel / program +
[ 0x21 ] = KEY_CHANNELDOWN, // channel / program - [ 0x21 ] = KEY_CHANNELDOWN, // channel / program -
[ 0x22 ] = KEY_CHANNEL, // source (old black remote) [ 0x22 ] = KEY_CHANNEL, // source (old black remote)
[ 0x24 ] = KEY_PREVIOUS, // replay |< [ 0x24 ] = KEY_PREVIOUSSONG, // replay |<
[ 0x25 ] = KEY_ENTER, // OK [ 0x25 ] = KEY_ENTER, // OK
[ 0x26 ] = KEY_SLEEP, // minimize (old black remote) [ 0x26 ] = KEY_SLEEP, // minimize (old black remote)
[ 0x29 ] = KEY_BLUE, // blue key [ 0x29 ] = KEY_BLUE, // blue key
...@@ -412,3 +424,4 @@ EXPORT_SYMBOL_GPL(ir_decode_biphase); ...@@ -412,3 +424,4 @@ EXPORT_SYMBOL_GPL(ir_decode_biphase);
* c-basic-offset: 8 * c-basic-offset: 8
* End: * End:
*/ */
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
It outputs an 8-bit 4:2:2 YUV or YCrCb video signal which can be directly It outputs an 8-bit 4:2:2 YUV or YCrCb video signal which can be directly
connected to bt848/bt878 GPIO pins on this purpose. connected to bt848/bt878 GPIO pins on this purpose.
(see: VLSI Vision Ltd. www.vvl.co.uk for camera datasheets) (see: VLSI Vision Ltd. www.vvl.co.uk for camera datasheets)
Supported Cards: Supported Cards:
- Pixelview Rev.4E: 0x8a - Pixelview Rev.4E: 0x8a
GPIO 0x400000 toggles Bt832 RESET, and the chip changes to i2c 0x88 ! GPIO 0x400000 toggles Bt832 RESET, and the chip changes to i2c 0x88 !
...@@ -31,16 +31,16 @@ ...@@ -31,16 +31,16 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/slab.h> #include <linux/slab.h>
#include "id.h" #include <media/audiochip.h>
#include "audiochip.h" #include <media/id.h>
#include "bttv.h" #include "bttv.h"
#include "bt832.h" #include "bt832.h"
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/* Addresses to scan */ /* Addresses to scan */
static unsigned short normal_i2c[] = { I2C_BT832_ALT1>>1, I2C_BT832_ALT2>>1, static unsigned short normal_i2c[] = {I2C_CLIENT_END};
I2C_CLIENT_END }; static unsigned short normal_i2c_range[] = {I2C_BT832_ALT1>>1,I2C_BT832_ALT2>>1,I2C_CLIENT_END};
I2C_CLIENT_INSMOD; I2C_CLIENT_INSMOD;
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
...@@ -95,7 +95,7 @@ int bt832_init(struct i2c_client *i2c_client_s) ...@@ -95,7 +95,7 @@ int bt832_init(struct i2c_client *i2c_client_s)
buf=kmalloc(65,GFP_KERNEL); buf=kmalloc(65,GFP_KERNEL);
bt832_hexdump(i2c_client_s,buf); bt832_hexdump(i2c_client_s,buf);
if(buf[0x40] != 0x31) { if(buf[0x40] != 0x31) {
printk("bt832: this i2c chip is no bt832 (id=%02x). Detaching.\n",buf[0x40]); printk("bt832: this i2c chip is no bt832 (id=%02x). Detaching.\n",buf[0x40]);
kfree(buf); kfree(buf);
...@@ -135,7 +135,7 @@ int bt832_init(struct i2c_client *i2c_client_s) ...@@ -135,7 +135,7 @@ int bt832_init(struct i2c_client *i2c_client_s)
buf[1]= 0x27 & (~0x01); // Default | !skip buf[1]= 0x27 & (~0x01); // Default | !skip
if (2 != (rc = i2c_master_send(i2c_client_s,buf,2))) if (2 != (rc = i2c_master_send(i2c_client_s,buf,2)))
printk("bt832: i2c i/o error EO: rc == %d (should be 2)\n",rc); printk("bt832: i2c i/o error EO: rc == %d (should be 2)\n",rc);
bt832_hexdump(i2c_client_s,buf); bt832_hexdump(i2c_client_s,buf);
#if 0 #if 0
...@@ -168,8 +168,7 @@ int bt832_init(struct i2c_client *i2c_client_s) ...@@ -168,8 +168,7 @@ int bt832_init(struct i2c_client *i2c_client_s)
static int bt832_attach(struct i2c_adapter *adap, int addr, static int bt832_attach(struct i2c_adapter *adap, int addr, int kind)
unsigned short flags, int kind)
{ {
struct bt832 *t; struct bt832 *t;
...@@ -184,27 +183,32 @@ static int bt832_attach(struct i2c_adapter *adap, int addr, ...@@ -184,27 +183,32 @@ static int bt832_attach(struct i2c_adapter *adap, int addr,
return -ENOMEM; return -ENOMEM;
memset(t,0,sizeof(*t)); memset(t,0,sizeof(*t));
t->client = client_template; t->client = client_template;
t->client.data = t; i2c_set_clientdata(&t->client, t);
i2c_attach_client(&t->client); i2c_attach_client(&t->client);
if(! bt832_init(&t->client)) { if(! bt832_init(&t->client)) {
bt832_detach(&t->client); bt832_detach(&t->client);
return -1; return -1;
} }
return 0; return 0;
} }
static int bt832_probe(struct i2c_adapter *adap) static int bt832_probe(struct i2c_adapter *adap)
{ {
#ifdef I2C_CLASS_TV_ANALOG
if (adap->class & I2C_CLASS_TV_ANALOG) if (adap->class & I2C_CLASS_TV_ANALOG)
return i2c_probe(adap, &addr_data, bt832_attach); return i2c_probe(adap, &addr_data, bt832_attach);
#else
if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848))
return i2c_probe(adap, &addr_data, bt832_attach);
#endif
return 0; return 0;
} }
static int bt832_detach(struct i2c_client *client) static int bt832_detach(struct i2c_client *client)
{ {
struct bt832 *t = (struct bt832*)client->data; struct bt832 *t = i2c_get_clientdata(client);
printk("bt832: detach.\n"); printk("bt832: detach.\n");
i2c_detach_client(client); i2c_detach_client(client);
...@@ -215,7 +219,7 @@ static int bt832_detach(struct i2c_client *client) ...@@ -215,7 +219,7 @@ static int bt832_detach(struct i2c_client *client)
static int static int
bt832_command(struct i2c_client *client, unsigned int cmd, void *arg) bt832_command(struct i2c_client *client, unsigned int cmd, void *arg)
{ {
struct bt832 *t = (struct bt832*)client->data; struct bt832 *t = i2c_get_clientdata(client);
printk("bt832: command %x\n",cmd); printk("bt832: command %x\n",cmd);
...@@ -249,19 +253,18 @@ static struct i2c_driver driver = { ...@@ -249,19 +253,18 @@ static struct i2c_driver driver = {
}; };
static struct i2c_client client_template = static struct i2c_client client_template =
{ {
.name = "bt832", I2C_DEVNAME("bt832"),
.flags = I2C_CLIENT_ALLOW_USE, .flags = I2C_CLIENT_ALLOW_USE,
.driver = &driver, .driver = &driver,
}; };
int bt832_init_module(void) static int __init bt832_init_module(void)
{ {
i2c_add_driver(&driver); return i2c_add_driver(&driver);
return 0;
} }
static void bt832_cleanup_module(void) static void __exit bt832_cleanup_module(void)
{ {
i2c_del_driver(&driver); i2c_del_driver(&driver);
} }
...@@ -269,3 +272,10 @@ static void bt832_cleanup_module(void) ...@@ -269,3 +272,10 @@ static void bt832_cleanup_module(void)
module_init(bt832_init_module); module_init(bt832_init_module);
module_exit(bt832_cleanup_module); module_exit(bt832_cleanup_module);
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* ---------------------------------------------------------------------------
* Local variables:
* c-basic-offset: 8
* End:
*/
/* Bt832 CMOS Camera Video Processor (VP) /* Bt832 CMOS Camera Video Processor (VP)
The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS
color digital camera directly to video capture devices via an 8-bit, color digital camera directly to video capture devices via an 8-bit,
4:2:2 YUV or YCrCb video interface. 4:2:2 YUV or YCrCb video interface.
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
#define BT832_DEVICE_ID 63 #define BT832_DEVICE_ID 63
# define BT832_DEVICE_ID__31 0x31 // Bt832 has ID 0x31 # define BT832_DEVICE_ID__31 0x31 // Bt832 has ID 0x31
/* STMicroelectronivcs VV5404 camera module /* STMicroelectronivcs VV5404 camera module
i2c: 0x20: sensor address i2c: 0x20: sensor address
i2c: 0xa0: eeprom for ccd defect map i2c: 0xa0: eeprom for ccd defect map
*/ */
...@@ -256,26 +256,26 @@ For the CCIR-601 standards, the sampling is based on a static orthogonal samplin ...@@ -256,26 +256,26 @@ For the CCIR-601 standards, the sampling is based on a static orthogonal samplin
//=========================================================================== //===========================================================================
// Timing generator SRAM table values for CCIR601 720x480 NTSC // Timing generator SRAM table values for CCIR601 720x480 NTSC
//=========================================================================== //===========================================================================
// For NTSC CCIR656 // For NTSC CCIR656
BYTE BtCard::SRAMTable_NTSC[] = BYTE BtCard::SRAMTable_NTSC[] =
{ {
// SRAM Timing Table for NTSC // SRAM Timing Table for NTSC
0x0c, 0xc0, 0x00, 0x0c, 0xc0, 0x00,
0x00, 0x90, 0xc2, 0x00, 0x90, 0xc2,
0x03, 0x10, 0x03, 0x03, 0x10, 0x03,
0x06, 0x10, 0x34, 0x06, 0x10, 0x34,
0x12, 0x12, 0x65, 0x12, 0x12, 0x65,
0x02, 0x13, 0x24, 0x02, 0x13, 0x24,
0x19, 0x00, 0x24, 0x19, 0x00, 0x24,
0x39, 0x00, 0x96, 0x39, 0x00, 0x96,
0x59, 0x08, 0x93, 0x59, 0x08, 0x93,
0x83, 0x08, 0x97, 0x83, 0x08, 0x97,
0x03, 0x50, 0x30, 0x03, 0x50, 0x30,
0xc0, 0x40, 0x30, 0xc0, 0x40, 0x30,
0x86, 0x01, 0x01, 0x86, 0x01, 0x01,
0xa6, 0x0d, 0x62, 0xa6, 0x0d, 0x62,
0x03, 0x11, 0x61, 0x03, 0x11, 0x61,
0x05, 0x37, 0x30, 0x05, 0x37, 0x30,
0xac, 0x21, 0x50 0xac, 0x21, 0x50
}; };
......
...@@ -147,6 +147,7 @@ static unsigned short normal_i2c[] = { ...@@ -147,6 +147,7 @@ static unsigned short normal_i2c[] = {
I2C_MSP3400C_ALT >> 1, I2C_MSP3400C_ALT >> 1,
I2C_CLIENT_END I2C_CLIENT_END
}; };
static unsigned short normal_i2c_range[] = {I2C_CLIENT_END,I2C_CLIENT_END};
I2C_CLIENT_INSMOD; I2C_CLIENT_INSMOD;
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
...@@ -735,7 +736,6 @@ static int msp34xx_sleep(struct msp3400c *msp, int timeout) ...@@ -735,7 +736,6 @@ static int msp34xx_sleep(struct msp3400c *msp, int timeout)
{ {
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
again:
add_wait_queue(&msp->wq, &wait); add_wait_queue(&msp->wq, &wait);
if (!kthread_should_stop()) { if (!kthread_should_stop()) {
if (timeout < 0) { if (timeout < 0) {
...@@ -751,12 +751,9 @@ static int msp34xx_sleep(struct msp3400c *msp, int timeout) ...@@ -751,12 +751,9 @@ static int msp34xx_sleep(struct msp3400c *msp, int timeout)
#endif #endif
} }
} }
if (current->flags & PF_FREEZE)
refrigerator(PF_FREEZE);
remove_wait_queue(&msp->wq, &wait); remove_wait_queue(&msp->wq, &wait);
if (try_to_freeze(PF_FREEZE))
goto again;
return msp->restart; return msp->restart;
} }
...@@ -1436,7 +1433,7 @@ static int msp_detach(struct i2c_client *client); ...@@ -1436,7 +1433,7 @@ static int msp_detach(struct i2c_client *client);
static int msp_probe(struct i2c_adapter *adap); static int msp_probe(struct i2c_adapter *adap);
static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg); static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg);
static int msp_suspend(struct device * dev, pm_message_t state, u32 level); static int msp_suspend(struct device * dev, u32 state, u32 level);
static int msp_resume(struct device * dev, u32 level); static int msp_resume(struct device * dev, u32 level);
static void msp_wake_thread(struct i2c_client *client); static void msp_wake_thread(struct i2c_client *client);
...@@ -1841,7 +1838,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -1841,7 +1838,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
return 0; return 0;
} }
static int msp_suspend(struct device * dev, pm_message_t state, u32 level) static int msp_suspend(struct device * dev, u32 state, u32 level)
{ {
struct i2c_client *c = container_of(dev, struct i2c_client, dev); struct i2c_client *c = container_of(dev, struct i2c_client, dev);
......
/*
* $Id: msp3400.h,v 1.3 2005/06/12 04:19:19 mchehab Exp $
*/
#ifndef MSP3400_H #ifndef MSP3400_H
#define MSP3400_H #define MSP3400_H
......
...@@ -74,6 +74,7 @@ static unsigned short normal_i2c[] = { ...@@ -74,6 +74,7 @@ static unsigned short normal_i2c[] = {
I2C_TDA7432 >> 1, I2C_TDA7432 >> 1,
I2C_CLIENT_END, I2C_CLIENT_END,
}; };
static unsigned short normal_i2c_range[] = { I2C_CLIENT_END, I2C_CLIENT_END };
I2C_CLIENT_INSMOD; I2C_CLIENT_INSMOD;
/* Structure of address and subaddresses for the tda7432 */ /* Structure of address and subaddresses for the tda7432 */
......
...@@ -44,6 +44,7 @@ static unsigned short normal_i2c[] = { ...@@ -44,6 +44,7 @@ static unsigned short normal_i2c[] = {
I2C_TDA9875 >> 1, I2C_TDA9875 >> 1,
I2C_CLIENT_END I2C_CLIENT_END
}; };
static unsigned short normal_i2c_range[] = {I2C_CLIENT_END};
I2C_CLIENT_INSMOD; I2C_CLIENT_INSMOD;
/* This is a superset of the TDA9875 */ /* This is a superset of the TDA9875 */
......
...@@ -33,6 +33,7 @@ static unsigned short normal_i2c[] = { ...@@ -33,6 +33,7 @@ static unsigned short normal_i2c[] = {
0x96 >>1, 0x96 >>1,
I2C_CLIENT_END, I2C_CLIENT_END,
}; };
static unsigned short normal_i2c_range[] = {I2C_CLIENT_END,I2C_CLIENT_END};
I2C_CLIENT_INSMOD; I2C_CLIENT_INSMOD;
/* insmod options */ /* insmod options */
...@@ -53,6 +54,7 @@ struct tda9887 { ...@@ -53,6 +54,7 @@ struct tda9887 {
unsigned int config; unsigned int config;
unsigned int pinnacle_id; unsigned int pinnacle_id;
unsigned int using_v4l2; unsigned int using_v4l2;
unsigned int radio_mode;
}; };
struct tvnorm { struct tvnorm {
...@@ -212,12 +214,22 @@ static struct tvnorm tvnorms[] = { ...@@ -212,12 +214,22 @@ static struct tvnorm tvnorms[] = {
} }
}; };
static struct tvnorm radio = { static struct tvnorm radio_stereo = {
.name = "radio", .name = "Radio Stereo",
.b = ( cFmRadio |
cQSS ),
.c = ( cDeemphasisOFF |
cAudioGain6 ),
.e = ( cAudioIF_5_5 |
cRadioIF_38_90 ),
};
static struct tvnorm radio_mono = {
.name = "Radio Mono",
.b = ( cFmRadio | .b = ( cFmRadio |
cQSS ), cQSS ),
.c = ( cDeemphasisON | .c = ( cDeemphasisON |
cDeemphasis50 ), cDeemphasis50),
.e = ( cAudioIF_5_5 | .e = ( cAudioIF_5_5 |
cRadioIF_38_90 ), cRadioIF_38_90 ),
}; };
...@@ -354,7 +366,10 @@ static int tda9887_set_tvnorm(struct tda9887 *t, char *buf) ...@@ -354,7 +366,10 @@ static int tda9887_set_tvnorm(struct tda9887 *t, char *buf)
int i; int i;
if (t->radio) { if (t->radio) {
norm = &radio; if (t->radio_mode == V4L2_TUNER_MODE_MONO)
norm = &radio_mono;
else
norm = &radio_stereo;
} else { } else {
for (i = 0; i < ARRAY_SIZE(tvnorms); i++) { for (i = 0; i < ARRAY_SIZE(tvnorms); i++) {
if (tvnorms[i].std & t->std) { if (tvnorms[i].std & t->std) {
...@@ -545,11 +560,14 @@ static int tda9887_configure(struct tda9887 *t) ...@@ -545,11 +560,14 @@ static int tda9887_configure(struct tda9887 *t)
memset(buf,0,sizeof(buf)); memset(buf,0,sizeof(buf));
tda9887_set_tvnorm(t,buf); tda9887_set_tvnorm(t,buf);
buf[1] |= cOutputPort1Inactive; buf[1] |= cOutputPort1Inactive;
buf[1] |= cOutputPort2Inactive; buf[1] |= cOutputPort2Inactive;
if (UNSET != t->pinnacle_id) { if (UNSET != t->pinnacle_id) {
tda9887_set_pinnacle(t,buf); tda9887_set_pinnacle(t,buf);
} }
tda9887_set_config(t,buf); tda9887_set_config(t,buf);
tda9887_set_insmod(t,buf); tda9887_set_insmod(t,buf);
...@@ -592,9 +610,12 @@ static int tda9887_attach(struct i2c_adapter *adap, int addr, int kind) ...@@ -592,9 +610,12 @@ static int tda9887_attach(struct i2c_adapter *adap, int addr, int kind)
if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL))) if (NULL == (t = kmalloc(sizeof(*t), GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
memset(t,0,sizeof(*t)); memset(t,0,sizeof(*t));
t->client = client_template; t->client = client_template;
t->std = 0; t->std = 0;
t->pinnacle_id = UNSET; t->pinnacle_id = UNSET;
t->radio_mode = V4L2_TUNER_MODE_STEREO;
i2c_set_clientdata(&t->client, t); i2c_set_clientdata(&t->client, t);
i2c_attach_client(&t->client); i2c_attach_client(&t->client);
...@@ -733,6 +754,16 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -733,6 +754,16 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg)
} }
break; break;
} }
case VIDIOC_S_TUNER:
{
struct v4l2_tuner* tuner = arg;
if (t->radio) {
t->radio_mode = tuner->audmode;
tda9887_configure (t);
}
break;
}
default: default:
/* nothing */ /* nothing */
break; break;
...@@ -740,7 +771,7 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -740,7 +771,7 @@ tda9887_command(struct i2c_client *client, unsigned int cmd, void *arg)
return 0; return 0;
} }
static int tda9887_suspend(struct device * dev, pm_message_t state, u32 level) static int tda9887_suspend(struct device * dev, u32 state, u32 level)
{ {
dprintk("tda9887: suspend\n"); dprintk("tda9887: suspend\n");
return 0; return 0;
......
This diff is collapsed.
/* /*
* $Id: tuner-simple.c,v 1.14 2005/05/30 02:02:47 mchehab Exp $ * $Id: tuner-simple.c,v 1.21 2005/06/10 19:53:26 nsh Exp $
* *
* i2c tv tuner chip device driver * i2c tv tuner chip device driver
* controls all those simple 4-control-bytes style tuners. * controls all those simple 4-control-bytes style tuners.
...@@ -220,7 +220,17 @@ static struct tunertype tuners[] = { ...@@ -220,7 +220,17 @@ static struct tunertype tuners[] = {
{ "Thomson DDT 7611 (ATSC/NTSC)", THOMSON, ATSC, { "Thomson DDT 7611 (ATSC/NTSC)", THOMSON, ATSC,
16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732}, 16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732},
{ "Tena TNF9533-D/IF", LGINNOTEK, PAL,
16*160.25, 16*464.25, 0x01,0x02,0x08,0x8e,623},
/*
* This entry is for TEA5767 FM radio only chip used on several boards
* w/TV tuner
*/
{ TEA5767_TUNER_NAME, Philips, RADIO,
-1, -1, 0, 0, 0, TEA5767_LOW_LO_32768,0},
}; };
unsigned const int tuner_count = ARRAY_SIZE(tuners); unsigned const int tuner_count = ARRAY_SIZE(tuners);
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
...@@ -231,6 +241,7 @@ static int tuner_getstatus(struct i2c_client *c) ...@@ -231,6 +241,7 @@ static int tuner_getstatus(struct i2c_client *c)
if (1 != i2c_master_recv(c,&byte,1)) if (1 != i2c_master_recv(c,&byte,1))
return 0; return 0;
return byte; return byte;
} }
...@@ -239,17 +250,33 @@ static int tuner_getstatus(struct i2c_client *c) ...@@ -239,17 +250,33 @@ static int tuner_getstatus(struct i2c_client *c)
#define TUNER_MODE 0x38 #define TUNER_MODE 0x38
#define TUNER_AFC 0x07 #define TUNER_AFC 0x07
#define TUNER_STEREO 0x10 /* radio mode */ #define TUNER_STEREO 0x10 /* radio mode */
#define TUNER_SIGNAL 0x07 /* radio mode */ #define TUNER_STEREO_MK3 0x04 /* radio mode */
#define TUNER_SIGNAL 0x07 /* radio mode */
static int tuner_signal(struct i2c_client *c) static int tuner_signal(struct i2c_client *c)
{ {
return (tuner_getstatus(c) & TUNER_SIGNAL)<<13; return (tuner_getstatus(c) & TUNER_SIGNAL) << 13;
} }
static int tuner_stereo(struct i2c_client *c) static int tuner_stereo(struct i2c_client *c)
{ {
return (tuner_getstatus (c) & TUNER_STEREO); int stereo, status;
struct tuner *t = i2c_get_clientdata(c);
status = tuner_getstatus (c);
switch (t->type) {
case TUNER_PHILIPS_FM1216ME_MK3:
case TUNER_PHILIPS_FM1236_MK3:
case TUNER_PHILIPS_FM1256_IH3:
stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
break;
default:
stereo = status & TUNER_STEREO;
}
return stereo;
} }
#if 0 /* unused */ #if 0 /* unused */
...@@ -432,6 +459,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) ...@@ -432,6 +459,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
buffer[2] = tun->config; buffer[2] = tun->config;
switch (t->type) { switch (t->type) {
case TUNER_TENA_9533_DI:
case TUNER_YMEC_TVF_5533MF: case TUNER_YMEC_TVF_5533MF:
/*These values are empirically determinated */ /*These values are empirically determinated */
...@@ -473,20 +501,6 @@ int default_tuner_init(struct i2c_client *c) ...@@ -473,20 +501,6 @@ int default_tuner_init(struct i2c_client *c)
t->type, tuners[t->type].name); t->type, tuners[t->type].name);
strlcpy(c->name, tuners[t->type].name, sizeof(c->name)); strlcpy(c->name, tuners[t->type].name, sizeof(c->name));
switch (t->type) {
case TUNER_YMEC_TVF_5533MF:
{
struct tuner_addr tun_addr = { V4L2_TUNER_ANALOG_TV, 0xc2>>1 };
if (c->driver->command) {
c->driver->command(c, TUNER_SET_ADDR, &tun_addr);
} else {
tuner_warn("Couldn't set TV tuner I2C address to 0x%02x\n",tun_addr.addr<<1);
}
break;
}
}
t->tv_freq = default_set_tv_freq; t->tv_freq = default_set_tv_freq;
t->radio_freq = default_set_radio_freq; t->radio_freq = default_set_radio_freq;
t->has_signal = tuner_signal; t->has_signal = tuner_signal;
......
...@@ -148,6 +148,7 @@ static unsigned short normal_i2c[] = { ...@@ -148,6 +148,7 @@ static unsigned short normal_i2c[] = {
I2C_TDA9874 >> 1, I2C_TDA9874 >> 1,
I2C_PIC16C54 >> 1, I2C_PIC16C54 >> 1,
I2C_CLIENT_END }; I2C_CLIENT_END };
static unsigned short normal_i2c_range[2] = { I2C_CLIENT_END, I2C_CLIENT_END };
I2C_CLIENT_INSMOD; I2C_CLIENT_INSMOD;
static struct i2c_driver driver; static struct i2c_driver driver;
...@@ -285,7 +286,6 @@ static int chip_thread(void *data) ...@@ -285,7 +286,6 @@ static int chip_thread(void *data)
schedule(); schedule();
} }
remove_wait_queue(&chip->wq, &wait); remove_wait_queue(&chip->wq, &wait);
try_to_freeze(PF_FREEZE);
if (chip->done || signal_pending(current)) if (chip->done || signal_pending(current))
break; break;
dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c)); dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c));
......
/*
* $Id: tvmixer.c,v 1.8 2005/06/12 04:19:19 mchehab Exp $
*/
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
/*
* $Id: audiochip.h,v 1.3 2005/06/12 04:19:19 mchehab Exp $
*/
#ifndef AUDIOCHIP_H #ifndef AUDIOCHIP_H
#define AUDIOCHIP_H #define AUDIOCHIP_H
......
/*
* $Id: id.h,v 1.4 2005/06/12 04:19:19 mchehab Exp $
*/
/* FIXME: this temporarely, until these are included in linux/i2c-id.h */ /* FIXME: this temporarely, until these are included in linux/i2c-id.h */
/* drivers */ /* drivers */
......
/* /*
* $Id: ir-common.h,v 1.8 2005/02/22 12:28:40 kraxel Exp $ * $Id: ir-common.h,v 1.9 2005/05/15 19:01:26 mchehab Exp $
* *
* some common structs and functions to handle infrared remotes via * some common structs and functions to handle infrared remotes via
* input layer ... * input layer ...
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include "id.h" #include "id.h"
#define ADDR_UNSET (255)
#define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */ #define TUNER_TEMIC_PAL 0 /* 4002 FH5 (3X 7756, 9483) */
#define TUNER_PHILIPS_PAL_I 1 #define TUNER_PHILIPS_PAL_I 1
#define TUNER_PHILIPS_NTSC 2 #define TUNER_PHILIPS_NTSC 2
...@@ -100,6 +102,11 @@ ...@@ -100,6 +102,11 @@
#define TUNER_YMEC_TVF_8531MF 58 #define TUNER_YMEC_TVF_8531MF 58
#define TUNER_YMEC_TVF_5533MF 59 /* Pixelview Pro Ultra NTSC */ #define TUNER_YMEC_TVF_5533MF 59 /* Pixelview Pro Ultra NTSC */
#define TUNER_THOMSON_DTT7611 60
#define TUNER_TENA_9533_DI 61
#define TUNER_TEA5767 62 /* Only FM Radio Tuner */
#define TEA5767_TUNER_NAME "Philips TEA5767HN FM Radio"
#define TUNER_THOMSON_DTT7611 60 #define TUNER_THOMSON_DTT7611 60
...@@ -109,6 +116,7 @@ ...@@ -109,6 +116,7 @@
#define NTSC 3 #define NTSC 3
#define SECAM 4 #define SECAM 4
#define ATSC 5 #define ATSC 5
#define RADIO 6
#define NoTuner 0 #define NoTuner 0
#define Philips 1 #define Philips 1
...@@ -124,9 +132,17 @@ ...@@ -124,9 +132,17 @@
#define TCL 11 #define TCL 11
#define THOMSON 12 #define THOMSON 12
enum v4l_radio_tuner {
TEA5767_LOW_LO_32768 = 0,
TEA5767_HIGH_LO_32768 = 1,
TEA5767_LOW_LO_13MHz = 2,
TEA5767_HIGH_LO_13MHz = 3,
};
#define TUNER_SET_TYPE _IOW('t',1,int) /* set tuner type */ #define TUNER_SET_TYPE _IOW('t',1,int) /* set tuner type */
#define TUNER_SET_TVFREQ _IOW('t',2,int) /* set tv freq */ #define TUNER_SET_TVFREQ _IOW('t',2,int) /* set tv freq */
#define TUNER_SET_ADDR _IOW('T',3,int) /* Chooses tuner I2C address */ #define TUNER_SET_TYPE_ADDR _IOW('T',3,int) /* set tuner type and I2C addr */
#define TDA9887_SET_CONFIG _IOW('t',5,int) #define TDA9887_SET_CONFIG _IOW('t',5,int)
...@@ -151,8 +167,9 @@ ...@@ -151,8 +167,9 @@
#define I2C_ADDR_TDA8275 0x61 #define I2C_ADDR_TDA8275 0x61
struct tuner_addr { struct tuner_addr {
enum v4l2_tuner_type type; enum v4l2_tuner_type v4l2_tuner;
unsigned short addr; unsigned int type;
unsigned short addr;
}; };
struct tuner { struct tuner {
......
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