diff options
Diffstat (limited to 'linux/drivers/media/video/mt20xx.c')
-rw-r--r-- | linux/drivers/media/video/mt20xx.c | 101 |
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; } |