summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/mt20xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/video/mt20xx.c')
-rw-r--r--linux/drivers/media/video/mt20xx.c101
1 files changed, 56 insertions, 45 deletions
diff --git a/linux/drivers/media/video/mt20xx.c b/linux/drivers/media/video/mt20xx.c
index 4e66135d1..2bc3c1e19 100644
--- a/linux/drivers/media/video/mt20xx.c
+++ b/linux/drivers/media/video/mt20xx.c
@@ -1,5 +1,5 @@
/*
- * $Id: mt20xx.c,v 1.2 2005/02/09 19:27:21 kraxel Exp $
+ * $Id: mt20xx.c,v 1.3 2005/02/15 15:59:35 kraxel Exp $
*
* i2c tv tuner chip device driver
* controls microtune tuners, mt2032 + mt2050 at the moment.
@@ -35,8 +35,10 @@ static char *microtune_part[] = {
};
// IsSpurInBand()?
-static int mt2032_spurcheck(int f1, int f2, int spectrum_from,int spectrum_to)
+static int mt2032_spurcheck(struct i2c_client *c,
+ int f1, int f2, int spectrum_from,int spectrum_to)
{
+ struct tuner *t = i2c_get_clientdata(c);
int n1=1,n2,f;
f1=f1/1000; //scale to kHz to avoid 32bit overflows
@@ -44,7 +46,8 @@ static int mt2032_spurcheck(int f1, int f2, int spectrum_from,int spectrum_to)
spectrum_from/=1000;
spectrum_to/=1000;
- printk("spurcheck f1=%d f2=%d from=%d to=%d\n",f1,f2,spectrum_from,spectrum_to);
+ tuner_dbg("spurcheck f1=%d f2=%d from=%d to=%d\n",
+ f1,f2,spectrum_from,spectrum_to);
do {
n2=-n1;
@@ -52,10 +55,10 @@ static int mt2032_spurcheck(int f1, int f2, int spectrum_from,int spectrum_to)
do {
n2--;
f=f-f2;
- printk(" spurtest n1=%d n2=%d ftest=%d\n",n1,n2,f);
+ tuner_dbg("spurtest n1=%d n2=%d ftest=%d\n",n1,n2,f);
if( (f>spectrum_from) && (f<spectrum_to))
- printk("mt2032 spurcheck triggered: %d\n",n1);
+ tuner_dbg("mt2032 spurcheck triggered: %d\n",n1);
} while ( (f>(f2-spectrum_to)) || (n2>-5));
n1++;
} while (n1<5);
@@ -63,7 +66,8 @@ static int mt2032_spurcheck(int f1, int f2, int spectrum_from,int spectrum_to)
return 1;
}
-static int mt2032_compute_freq(unsigned int rfin,
+static int mt2032_compute_freq(struct i2c_client *c,
+ unsigned int rfin,
unsigned int if1, unsigned int if2,
unsigned int spectrum_from,
unsigned int spectrum_to,
@@ -71,6 +75,7 @@ static int mt2032_compute_freq(unsigned int rfin,
int *ret_sel,
unsigned int xogc) //all in Hz
{
+ struct tuner *t = i2c_get_clientdata(c);
unsigned int fref,lo1,lo1n,lo1a,s,sel,lo1freq, desired_lo1,
desired_lo2,lo2,lo2n,lo2a,lo2num,lo2freq;
@@ -101,8 +106,8 @@ static int mt2032_compute_freq(unsigned int rfin,
lo1freq=(lo1a+8*lo1n)*fref;
- printk("mt2032: rfin=%d lo1=%d lo1n=%d lo1a=%d sel=%d, lo1freq=%d\n",
- rfin,lo1,lo1n,lo1a,sel,lo1freq);
+ tuner_dbg("mt2032: rfin=%d lo1=%d lo1n=%d lo1a=%d sel=%d, lo1freq=%d\n",
+ rfin,lo1,lo1n,lo1a,sel,lo1freq);
desired_lo2=lo1freq-rfin-if2;
lo2=(desired_lo2)/fref;
@@ -111,16 +116,16 @@ static int mt2032_compute_freq(unsigned int rfin,
lo2num=((desired_lo2/1000)%(fref/1000))* 3780/(fref/1000); //scale to fit in 32bit arith
lo2freq=(lo2a+8*lo2n)*fref + lo2num*(fref/1000)/3780*1000;
- printk("mt2032: rfin=%d lo2=%d lo2n=%d lo2a=%d num=%d lo2freq=%d\n",
- rfin,lo2,lo2n,lo2a,lo2num,lo2freq);
+ tuner_dbg("mt2032: rfin=%d lo2=%d lo2n=%d lo2a=%d num=%d lo2freq=%d\n",
+ rfin,lo2,lo2n,lo2a,lo2num,lo2freq);
if(lo1a<0 || lo1a>7 || lo1n<17 ||lo1n>48 || lo2a<0 ||lo2a >7 ||lo2n<17 || lo2n>30) {
- printk("mt2032: frequency parameters out of range: %d %d %d %d\n",
- lo1a, lo1n, lo2a,lo2n);
+ tuner_info("mt2032: frequency parameters out of range: %d %d %d %d\n",
+ lo1a, lo1n, lo2a,lo2n);
return(-1);
}
- mt2032_spurcheck(lo1freq, desired_lo2, spectrum_from, spectrum_to);
+ mt2032_spurcheck(c, lo1freq, desired_lo2, spectrum_from, spectrum_to);
// should recalculate lo1 (one step up/down)
// set up MT2032 register map for transfer over i2c
@@ -146,19 +151,21 @@ static int mt2032_compute_freq(unsigned int rfin,
static int mt2032_check_lo_lock(struct i2c_client *c)
{
+ struct tuner *t = i2c_get_clientdata(c);
int try,lock=0;
unsigned char buf[2];
+
for(try=0;try<10;try++) {
buf[0]=0x0e;
i2c_master_send(c,buf,1);
i2c_master_recv(c,buf,1);
- printk("mt2032 Reg.E=0x%02x\n",buf[0]);
+ tuner_dbg("mt2032 Reg.E=0x%02x\n",buf[0]);
lock=buf[0] &0x06;
if (lock==6)
break;
- printk("mt2032: pll wait 1ms for lock (0x%2x)\n",buf[0]);
+ tuner_dbg("mt2032: pll wait 1ms for lock (0x%2x)\n",buf[0]);
udelay(1000);
}
return lock;
@@ -166,13 +173,14 @@ static int mt2032_check_lo_lock(struct i2c_client *c)
static int mt2032_optimize_vco(struct i2c_client *c,int sel,int lock)
{
+ struct tuner *t = i2c_get_clientdata(c);
unsigned char buf[2];
int tad1;
buf[0]=0x0f;
i2c_master_send(c,buf,1);
i2c_master_recv(c,buf,1);
- printk("mt2032 Reg.F=0x%02x\n",buf[0]);
+ tuner_dbg("mt2032 Reg.F=0x%02x\n",buf[0]);
tad1=buf[0]&0x07;
if(tad1 ==0) return lock;
@@ -190,7 +198,7 @@ static int mt2032_optimize_vco(struct i2c_client *c,int sel,int lock)
return lock;
}
- printk("mt2032 optimize_vco: sel=%d\n",sel);
+ tuner_dbg("mt2032 optimize_vco: sel=%d\n",sel);
buf[0]=0x0f;
buf[1]=sel;
@@ -208,14 +216,15 @@ static void mt2032_set_if_freq(struct i2c_client *c, unsigned int rfin,
int lint_try,ret,sel,lock=0;
struct tuner *t = i2c_get_clientdata(c);
- printk("mt2032_set_if_freq rfin=%d if1=%d if2=%d from=%d to=%d\n",rfin,if1,if2,from,to);
+ tuner_dbg("mt2032_set_if_freq rfin=%d if1=%d if2=%d from=%d to=%d\n",
+ rfin,if1,if2,from,to);
buf[0]=0;
ret=i2c_master_send(c,buf,1);
i2c_master_recv(c,buf,21);
buf[0]=0;
- ret=mt2032_compute_freq(rfin,if1,if2,from,to,&buf[1],&sel,t->xogc);
+ ret=mt2032_compute_freq(c,rfin,if1,if2,from,to,&buf[1],&sel,t->xogc);
if (ret<0)
return;
@@ -227,7 +236,7 @@ static void mt2032_set_if_freq(struct i2c_client *c, unsigned int rfin,
buf[11]=11;
ret=i2c_master_send(c,buf+11,3);
if(ret!=3)
- printk("mt2032_set_if_freq failed with %d\n",ret);
+ tuner_warn("i2c i/o error: rc == %d (should be 3)\n",ret);
// wait for PLLs to lock (per manual), retry LINT if not.
for(lint_try=0; lint_try<2; lint_try++) {
@@ -237,7 +246,7 @@ static void mt2032_set_if_freq(struct i2c_client *c, unsigned int rfin,
lock=mt2032_optimize_vco(c,sel,lock);
if(lock==6) break;
- printk("mt2032: re-init PLLs by LINT\n");
+ tuner_dbg("mt2032: re-init PLLs by LINT\n");
buf[0]=7;
buf[1]=0x80 +8+t->xogc; // set LINT to re-init PLLs
i2c_master_send(c,buf,2);
@@ -247,13 +256,13 @@ static void mt2032_set_if_freq(struct i2c_client *c, unsigned int rfin,
}
if (lock!=6)
- printk("MT2032 Fatal Error: PLLs didn't lock.\n");
+ tuner_warn("MT2032 Fatal Error: PLLs didn't lock.\n");
buf[0]=2;
buf[1]=0x20; // LOGC for optimal phase noise
ret=i2c_master_send(c,buf,2);
if (ret!=2)
- printk("mt2032_set_if_freq2 failed with %d\n",ret);
+ tuner_warn("i2c i/o error: rc == %d (should be 2)\n",ret);
}
@@ -318,17 +327,17 @@ static int mt2032_init(struct i2c_client *c)
// Adjust XOGC (register 7), wait for XOK
xogc=7;
do {
- printk("mt2032: xogc = 0x%02x\n",xogc&0x07);
+ tuner_dbg("mt2032: xogc = 0x%02x\n",xogc&0x07);
mdelay(10);
buf[0]=0x0e;
i2c_master_send(c,buf,1);
i2c_master_recv(c,buf,1);
xok=buf[0]&0x01;
- printk("mt2032: xok = 0x%02x\n",xok);
+ tuner_dbg("mt2032: xok = 0x%02x\n",xok);
if (xok == 1) break;
xogc--;
- printk("mt2032: xogc = 0x%02x\n",xogc&0x07);
+ tuner_dbg("mt2032: xogc = 0x%02x\n",xogc&0x07);
if (xogc == 3) {
xogc=4; // min. 4 per spec
break;
@@ -337,7 +346,7 @@ static int mt2032_init(struct i2c_client *c)
buf[1]=0x88 + xogc;
ret=i2c_master_send(c,buf,2);
if (ret!=2)
- printk("mt2032_init failed with %d\n",ret);
+ tuner_warn("i2c i/o error: rc == %d (should be 2)\n",ret);
} while (xok != 1 );
t->xogc=xogc;
@@ -348,24 +357,26 @@ static int mt2032_init(struct i2c_client *c)
static void mt2050_set_antenna(struct i2c_client *c, unsigned char antenna)
{
+ struct tuner *t = i2c_get_clientdata(c);
unsigned char buf[2];
int ret;
buf[0] = 6;
buf[1] = antenna ? 0x11 : 0x10;
ret=i2c_master_send(c,buf,2);
- printk("mt2050: enabled antenna connector %d\n", antenna);
+ tuner_dbg("mt2050: enabled antenna connector %d\n", antenna);
}
static void mt2050_set_if_freq(struct i2c_client *c,unsigned int freq, unsigned int if2)
{
+ struct tuner *t = i2c_get_clientdata(c);
unsigned int if1=1218*1000*1000;
unsigned int f_lo1,f_lo2,lo1,lo2,f_lo1_modulo,f_lo2_modulo,num1,num2,div1a,div1b,div2a,div2b;
int ret;
unsigned char buf[6];
- printk("mt2050_set_if_freq freq=%d if1=%d if2=%d\n",
- freq,if1,if2);
+ tuner_dbg("mt2050_set_if_freq freq=%d if1=%d if2=%d\n",
+ freq,if1,if2);
f_lo1=freq+if1;
f_lo1=(f_lo1/1000000)*1000000;
@@ -391,8 +402,9 @@ static void mt2050_set_if_freq(struct i2c_client *c,unsigned int freq, unsigned
div2b=lo2-(div2a+1)*8;
if (tuner_debug > 1) {
- printk("lo1 lo2 = %d %d\n", lo1, lo2);
- printk("num1 num2 div1a div1b div2a div2b= %x %x %x %x %x %x\n",num1,num2,div1a,div1b,div2a,div2b);
+ tuner_dbg("lo1 lo2 = %d %d\n", lo1, lo2);
+ tuner_dbg("num1 num2 div1a div1b div2a div2b= %x %x %x %x %x %x\n",
+ num1,num2,div1a,div1b,div2a,div2b);
}
buf[0]=1;
@@ -407,7 +419,7 @@ static void mt2050_set_if_freq(struct i2c_client *c,unsigned int freq, unsigned
if (tuner_debug > 1) {
int i;
- printk("bufs is: ");
+ tuner_dbg("bufs is: ");
for(i=0;i<6;i++)
printk("%x ",buf[i]);
printk("\n");
@@ -415,7 +427,7 @@ static void mt2050_set_if_freq(struct i2c_client *c,unsigned int freq, unsigned
ret=i2c_master_send(c,buf,6);
if (ret!=6)
- printk("mt2050_set_if_freq failed with %d\n",ret);
+ tuner_warn("i2c i/o error: rc == %d (should be 6)\n",ret);
}
static void mt2050_set_tv_freq(struct i2c_client *c, unsigned int freq)
@@ -431,7 +443,7 @@ static void mt2050_set_tv_freq(struct i2c_client *c, unsigned int freq)
if2 = 38900*1000;
}
if (V4L2_TUNER_DIGITAL_TV == t->mode) {
- // testing for DVB ...
+ // DVB (pinnacle 300i)
if2 = 36150*1000;
}
mt2050_set_if_freq(c, freq*62500, if2);
@@ -465,7 +477,7 @@ static int mt2050_init(struct i2c_client *c)
ret=i2c_master_send(c,buf,1);
i2c_master_recv(c,buf,1);
- printk("mt2050: sro is %x\n",buf[0]);
+ tuner_dbg("mt2050: sro is %x\n",buf[0]);
t->tv_freq = mt2050_set_tv_freq;
t->radio_freq = mt2050_set_radio_freq;
return 0;
@@ -487,17 +499,16 @@ int microtune_init(struct i2c_client *c)
i2c_master_recv(c,buf,21);
if (tuner_debug) {
int i;
- printk(KERN_DEBUG "tuner: MT2032 hexdump:\n");
+ tuner_dbg("MT20xx hexdump:");
for(i=0;i<21;i++) {
printk(" %02x",buf[i]);
if(((i+1)%8)==0) printk(" ");
- if(((i+1)%16)==0) printk("\n ");
}
- printk("\n ");
+ printk("\n");
}
company_code = buf[0x11] << 8 | buf[0x12];
- printk("tuner: microtune: companycode=%04x part=%02x rev=%02x\n",
- company_code,buf[0x13],buf[0x14]);
+ tuner_info("microtune: companycode=%04x part=%02x rev=%02x\n",
+ company_code,buf[0x13],buf[0x14]);
#if 0
/* seems to cause more problems than it solves ... */
@@ -511,7 +522,7 @@ int microtune_init(struct i2c_client *c)
/* ok (?) */
break;
default:
- printk("tuner: microtune: unknown companycode\n");
+ tuner_warn("tuner: microtune: unknown companycode\n");
return 0;
}
#endif
@@ -527,13 +538,13 @@ int microtune_init(struct i2c_client *c)
mt2050_init(c);
break;
default:
- printk("tuner: microtune %s found, not (yet?) supported, sorry :-/\n",
- name);
+ tuner_info("microtune %s found, not (yet?) supported, sorry :-/\n",
+ name);
return 0;
}
strlcpy(c->name, name, sizeof(c->name));
- printk("tuner: microtune %s found, OK\n",name);
+ tuner_info("microtune %s found, OK\n",name);
return 0;
}