Hi,
This patch updates the tv card tuner module. It adds support for a new
tuner and has some minor fixes + cleanups. Also deletes some dead code.
Please apply,
Gerd
diff -u linux-2.5.69/drivers/media/video/tuner.c linux/drivers/media/video/tuner.c
--- linux-2.5.69/drivers/media/video/tuner.c 2003-05-08 13:31:45.000000000 +0200
+++ linux/drivers/media/video/tuner.c 2003-05-08 13:55:11.000000000 +0200
@@ -20,13 +20,15 @@
static unsigned short normal_i2c_range[] = {0x60,0x6f,I2C_CLIENT_END};
I2C_CLIENT_INSMOD;
+#define UNSET (-1U)
+
/* insmod options */
-static int debug = 0;
-static int type = -1;
-static int addr = 0;
+static unsigned int debug = 0;
+static unsigned int type = UNSET;
+static unsigned int addr = 0;
static char *pal = "b";
-static int tv_range[2] = { 44, 958 };
-static int radio_range[2] = { 65, 108 };
+static unsigned int tv_range[2] = { 44, 958 };
+static unsigned int radio_range[2] = { 65, 108 };
MODULE_PARM(debug,"i");
MODULE_PARM(type,"i");
MODULE_PARM(addr,"i");
@@ -45,13 +47,16 @@
struct tuner
{
- int type; /* chip type */
- int freq; /* keep track of the current settings */
- int std;
-
- int radio;
- int mode; /* current norm for multi-norm tuners */
- int xogc; // only for MT2032
+ unsigned int type; /* chip type */
+ unsigned int freq; /* keep track of the current settings */
+ unsigned int std;
+
+ unsigned int radio;
+ unsigned int mode; /* current norm for multi-norm tuners */
+
+ // only for MT2032
+ unsigned int xogc;
+ unsigned int radio_if2;
};
static struct i2c_driver driver;
@@ -217,8 +222,11 @@
16*160.00,16*442.00,0x01,0x02,0x04,0x8e,623 },
{ "LG NTSC (newer TAPC series)", LGINNOTEK, NTSC,
16*170.00, 16*450.00, 0x01,0x02,0x08,0x8e,732},
+
+ { "HITACHI V7-J180AT", HITACHI, NTSC,
+ 16*170.00, 16*450.00, 0x01,0x02,0x00,0x8e,940 },
};
-#define TUNERS (sizeof(tuners)/sizeof(struct tunertype))
+#define TUNERS ARRAY_SIZE(tuners)
/* ---------------------------------------------------------------------- */
@@ -381,10 +389,15 @@
return 1;
}
-static int mt2032_compute_freq(int rfin, int if1, int if2, int spectrum_from,
- int spectrum_to, unsigned char *buf, int *ret_sel, int xogc) //all in Hz
+static int mt2032_compute_freq(unsigned int rfin,
+ unsigned int if1, unsigned int if2,
+ unsigned int spectrum_from,
+ unsigned int spectrum_to,
+ unsigned char *buf,
+ int *ret_sel,
+ unsigned int xogc) //all in Hz
{
- int fref,lo1,lo1n,lo1a,s,sel,lo1freq, desired_lo1,
+ unsigned int fref,lo1,lo1n,lo1a,s,sel,lo1freq, desired_lo1,
desired_lo2,lo2,lo2n,lo2a,lo2num,lo2freq;
fref= 5250 *1000; //5.25MHz
@@ -513,7 +526,9 @@
}
-static void mt2032_set_if_freq(struct i2c_client *c,int rfin, int if1, int if2, int from, int to)
+static void mt2032_set_if_freq(struct i2c_client *c, unsigned int rfin,
+ unsigned int if1, unsigned int if2,
+ unsigned int from, unsigned int to)
{
unsigned char buf[21];
int lint_try,ret,sel,lock=0;
@@ -568,28 +583,30 @@
}
-static void mt2032_set_tv_freq(struct i2c_client *c, int freq, int norm)
+static void mt2032_set_tv_freq(struct i2c_client *c,
+ unsigned int freq, unsigned int norm)
{
int if2,from,to;
// signal bandwidth and picture carrier
- if(norm==VIDEO_MODE_NTSC) {
+ if (norm==VIDEO_MODE_NTSC) {
from=40750*1000;
to=46750*1000;
if2=45750*1000;
- }
- else { // Pal
+ } else {
+ // Pal
from=32900*1000;
to=39900*1000;
if2=38900*1000;
}
- mt2032_set_if_freq(c,freq* 1000*1000/16, 1090*1000*1000, if2, from, to);
+ mt2032_set_if_freq(c, freq*62500 /* freq*1000*1000/16 */,
+ 1090*1000*1000, if2, from, to);
}
// Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz
-static void set_tv_freq(struct i2c_client *c, int freq)
+static void set_tv_freq(struct i2c_client *c, unsigned int freq)
{
u8 config;
u16 div;
@@ -598,7 +615,7 @@
unsigned char buffer[4];
int rc;
- if (t->type == -1) {
+ if (t->type == UNSET) {
printk("tuner: tuner type not set\n");
return;
}
@@ -720,22 +737,23 @@
}
-static void mt2032_set_radio_freq(struct i2c_client *c,int freq)
-{
- int if2;
-
- if2=10700*1000; // 10.7MHz FM intermediate frequency
+static void mt2032_set_radio_freq(struct i2c_client *c, unsigned int freq)
+{
+ struct tuner *t = i2c_get_clientdata(c);
+ int if2 = t->radio_if2;
// per Manual for FM tuning: first if center freq. 1085 MHz
- mt2032_set_if_freq(c,freq* 1000*1000/16, 1085*1000*1000,if2,if2,if2);
+ mt2032_set_if_freq(c, freq*62500 /* freq*1000*1000/16 */,
+ 1085*1000*1000,if2,if2,if2);
}
-static void set_radio_freq(struct i2c_client *c, int freq)
+static void set_radio_freq(struct i2c_client *c, unsigned int freq)
{
struct tunertype *tun;
struct tuner *t = i2c_get_clientdata(c);
unsigned char buffer[4];
- int rc,div;
+ unsigned div;
+ int rc;
if (freq < radio_range[0]*16 || freq > radio_range[1]*16) {
printk("tuner: radio freq (%d.%02d) out of range (%d-%d)\n",
@@ -743,7 +761,7 @@
radio_range[0],radio_range[1]);
return;
}
- if (t->type == -1) {
+ if (t->type == UNSET) {
printk("tuner: tuner type not set\n");
return;
}
@@ -798,20 +816,20 @@
kfree(client);
return -ENOMEM;
}
- i2c_set_clientdata(client, t);
memset(t,0,sizeof(struct tuner));
- if (type >= 0 && type < TUNERS) {
+ i2c_set_clientdata(client, t);
+ t->type = UNSET;
+ t->radio_if2 = 10700*1000; // 10.7MHz - FM radio
+
+ if (type < TUNERS) {
t->type = type;
printk("tuner(bttv): type forced to %d (%s) [insmod]\n",t->type,tuners[t->type].name);
strncpy(client->dev.name, tuners[t->type].name, DEVICE_NAME_SIZE);
- } else {
- t->type = -1;
}
i2c_attach_client(client);
if (t->type == TUNER_MT2032)
mt2032_init(client);
- MOD_INC_USE_COUNT;
return 0;
}
@@ -835,7 +853,6 @@
i2c_detach_client(client);
kfree(t);
kfree(client);
- MOD_DEC_USE_COUNT;
return 0;
}
@@ -843,20 +860,17 @@
tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
{
struct tuner *t = i2c_get_clientdata(client);
- int *iarg = (int*)arg;
-#if 0
- __u16 *sarg = (__u16*)arg;
-#endif
+ unsigned int *iarg = (int*)arg;
switch (cmd) {
/* --- configuration --- */
case TUNER_SET_TYPE:
- if (t->type != -1) {
+ if (t->type != UNSET) {
printk("tuner: type already set (%d)\n",t->type);
return 0;
}
- if (*iarg < 0 || *iarg >= TUNERS)
+ if (*iarg >= TUNERS)
return 0;
t->type = *iarg;
printk("tuner: type set to %d (%s)\n",
@@ -868,6 +882,18 @@
case AUDC_SET_RADIO:
t->radio = 1;
break;
+ case AUDC_CONFIG_PINNACLE:
+ switch (*iarg) {
+ case 2:
+ dprintk("tuner: pinnacle pal\n");
+ t->radio_if2 = 33300 * 1000;
+ break;
+ case 3:
+ dprintk("tuner: pinnacle ntsc\n");
+ t->radio_if2 = 41300 * 1000;
+ break;
+ }
+ break;
/* --- v4l ioctls --- */
/* take care: bttv does userspace copying, we'll get a
@@ -913,35 +939,6 @@
va->mode = (tuner_stereo(client) ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO);
return 0;
}
-
-#if 0
- /* --- old, obsolete interface --- */
- case TUNER_SET_TVFREQ:
- dprintk("tuner: tv freq set to %d.%02d\n",
- (*iarg)/16,(*iarg)%16*100/16);
- set_tv_freq(client,*iarg);
- t->radio = 0;
- t->freq = *iarg;
- break;
-
- case TUNER_SET_RADIOFREQ:
- dprintk("tuner: radio freq set to %d.%02d\n",
- (*iarg)/16,(*iarg)%16*100/16);
- set_radio_freq(client,*iarg);
- t->radio = 1;
- t->freq = *iarg;
- break;
- case TUNER_SET_MODE:
- if (t->type != TUNER_PHILIPS_SECAM) {
- dprintk("tuner: trying to change mode for other than TUNER_PHILIPS_SECAM\n");
- } else {
- int mode=(*sarg==VIDEO_MODE_SECAM)?1:0;
- dprintk("tuner: mode set to %d\n", *sarg);
- t->mode = mode;
- set_tv_freq(client,t->freq);
- }
- break;
-#endif
default:
/* nothing */
break;
@@ -963,11 +960,9 @@
};
static struct i2c_client client_template =
{
- .flags = I2C_CLIENT_ALLOW_USE,
- .driver = &driver,
- .dev = {
- .name = "(tuner unset)",
- },
+ .dev.name = "(tuner unset)",
+ .flags = I2C_CLIENT_ALLOW_USE,
+ .driver = &driver,
};
static int tuner_init_module(void)
diff -u linux-2.5.69/include/media/tuner.h linux/include/media/tuner.h
--- linux-2.5.69/include/media/tuner.h 2003-05-08 13:31:32.000000000 +0200
+++ linux/include/media/tuner.h 2003-05-08 13:55:12.000000000 +0200
@@ -64,7 +64,7 @@
#define TUNER_LG_PAL_NEW_TAPC 37
#define TUNER_PHILIPS_FM1216ME_MK3 38
#define TUNER_LG_NTSC_NEW_TAPC 39
-
+#define TUNER_HITACHI_NTSC 40
@@ -83,6 +83,7 @@
#define SHARP 6
#define Samsung 7
#define Microtune 8
+#define HITACHI 9
#define TUNER_SET_TYPE _IOW('t',1,int) /* set tuner type */
#define TUNER_SET_TVFREQ _IOW('t',2,int) /* set tv freq */
--
sigfault