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:
*/ */
...@@ -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;
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
...@@ -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,7 +183,7 @@ static int bt832_attach(struct i2c_adapter *adap, int addr, ...@@ -184,7 +183,7 @@ 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)) {
...@@ -197,14 +196,19 @@ static int bt832_attach(struct i2c_adapter *adap, int addr, ...@@ -197,14 +196,19 @@ static int bt832_attach(struct i2c_adapter *adap, int addr,
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:
*/
...@@ -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;
} }
...@@ -240,16 +251,32 @@ static int tuner_getstatus(struct i2c_client *c) ...@@ -240,16 +251,32 @@ static int tuner_getstatus(struct i2c_client *c)
#define TUNER_AFC 0x07 #define TUNER_AFC 0x07
#define TUNER_STEREO 0x10 /* radio mode */ #define TUNER_STEREO 0x10 /* radio mode */
#define TUNER_STEREO_MK3 0x04 /* radio mode */
#define TUNER_SIGNAL 0x07 /* 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,7 +167,8 @@ ...@@ -151,7 +167,8 @@
#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 int type;
unsigned short addr; unsigned short addr;
}; };
......
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