Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/media/video/bt8xx/bttv-i2c.c (Version 2.6.25.8) and /linux/drivers/media/video/bt8xx/bttv-i2c.c (Version 2.6.11.8)


  1 /*                                                  1 
  2                                                   
  3     bttv-i2c.c  --  all the i2c code is here      
  4                                                   
  5     bttv - Bt848 frame grabber driver             
  6                                                   
  7     Copyright (C) 1996,97,98 Ralph  Metzler (r    
  8                            & Marcus Metzler (m    
  9     (c) 1999-2003 Gerd Knorr <kraxel@bytesex.o    
 10                                                   
 11     (c) 2005 Mauro Carvalho Chehab <mchehab@in    
 12         - Multituner support and i2c address b    
 13                                                   
 14     This program is free software; you can red    
 15     it under the terms of the GNU General Publ    
 16     the Free Software Foundation; either versi    
 17     (at your option) any later version.           
 18                                                   
 19     This program is distributed in the hope th    
 20     but WITHOUT ANY WARRANTY; without even the    
 21     MERCHANTABILITY or FITNESS FOR A PARTICULA    
 22     GNU General Public License for more detail    
 23                                                   
 24     You should have received a copy of the GNU    
 25     along with this program; if not, write to     
 26     Foundation, Inc., 675 Mass Ave, Cambridge,    
 27                                                   
 28 */                                                
 29                                                   
 30 #include <linux/module.h>                         
 31 #include <linux/init.h>                           
 32 #include <linux/delay.h>                          
 33                                                   
 34 #include "bttvp.h"                                
 35 #include <media/v4l2-common.h>                    
 36 #include <linux/jiffies.h>                        
 37 #include <asm/io.h>                               
 38                                                   
 39 static struct i2c_algo_bit_data bttv_i2c_algo_    
 40 static struct i2c_adapter bttv_i2c_adap_sw_tem    
 41 static struct i2c_adapter bttv_i2c_adap_hw_tem    
 42 static struct i2c_client bttv_i2c_client_templ    
 43                                                   
 44 static int attach_inform(struct i2c_client *cl    
 45                                                   
 46 static int i2c_debug;                             
 47 static int i2c_hw;                                
 48 static int i2c_scan;                              
 49 module_param(i2c_debug, int, 0644);               
 50 MODULE_PARM_DESC(i2c_hw,"configure i2c debug l    
 51 module_param(i2c_hw,    int, 0444);               
 52 MODULE_PARM_DESC(i2c_hw,"force use of hardware    
 53                         "instead of software b    
 54 module_param(i2c_scan,  int, 0444);               
 55 MODULE_PARM_DESC(i2c_scan,"scan i2c bus at ins    
 56                                                   
 57 static unsigned int i2c_udelay = 5;               
 58 module_param(i2c_udelay, int, 0444);              
 59 MODULE_PARM_DESC(i2c_udelay,"soft i2c delay at    
 60                 "(should be 5 or higher). Lowe    
 61                                                   
 62 /* -------------------------------------------    
 63 /* I2C functions - bitbanging adapter (softwar    
 64                                                   
 65 static void bttv_bit_setscl(void *data, int st    
 66 {                                                 
 67         struct bttv *btv = (struct bttv*)data;    
 68                                                   
 69         if (state)                                
 70                 btv->i2c_state |= 0x02;           
 71         else                                      
 72                 btv->i2c_state &= ~0x02;          
 73         btwrite(btv->i2c_state, BT848_I2C);       
 74         btread(BT848_I2C);                        
 75 }                                                 
 76                                                   
 77 static void bttv_bit_setsda(void *data, int st    
 78 {                                                 
 79         struct bttv *btv = (struct bttv*)data;    
 80                                                   
 81         if (state)                                
 82                 btv->i2c_state |= 0x01;           
 83         else                                      
 84                 btv->i2c_state &= ~0x01;          
 85         btwrite(btv->i2c_state, BT848_I2C);       
 86         btread(BT848_I2C);                        
 87 }                                                 
 88                                                   
 89 static int bttv_bit_getscl(void *data)            
 90 {                                                 
 91         struct bttv *btv = (struct bttv*)data;    
 92         int state;                                
 93                                                   
 94         state = btread(BT848_I2C) & 0x02 ? 1 :    
 95         return state;                             
 96 }                                                 
 97                                                   
 98 static int bttv_bit_getsda(void *data)            
 99 {                                                 
100         struct bttv *btv = (struct bttv*)data;    
101         int state;                                
102                                                   
103         state = btread(BT848_I2C) & 0x01;         
104         return state;                             
105 }                                                 
106                                                   
107 static struct i2c_algo_bit_data bttv_i2c_algo_    
108         .setsda  = bttv_bit_setsda,               
109         .setscl  = bttv_bit_setscl,               
110         .getsda  = bttv_bit_getsda,               
111         .getscl  = bttv_bit_getscl,               
112         .udelay  = 16,                            
113         .timeout = 200,                           
114 };                                                
115                                                   
116 static struct i2c_adapter bttv_i2c_adap_sw_tem    
117         .owner             = THIS_MODULE,         
118         .class             = I2C_CLASS_TV_ANAL    
119         .name              = "bttv",              
120         .id                = I2C_HW_B_BT848,      
121         .client_register   = attach_inform,       
122 };                                                
123                                                   
124 /* -------------------------------------------    
125 /* I2C functions - hardware i2c                   
126                                                   
127 static u32 functionality(struct i2c_adapter *a    
128 {                                                 
129         return I2C_FUNC_SMBUS_EMUL;               
130 }                                                 
131                                                   
132 static int                                        
133 bttv_i2c_wait_done(struct bttv *btv)              
134 {                                                 
135         int rc = 0;                               
136                                                   
137         /* timeout */                             
138         if (wait_event_interruptible_timeout(b    
139                 btv->i2c_done, msecs_to_jiffie    
140                                                   
141         rc = -EIO;                                
142                                                   
143         if (btv->i2c_done & BT848_INT_RACK)       
144                 rc = 1;                           
145         btv->i2c_done = 0;                        
146         return rc;                                
147 }                                                 
148                                                   
149 #define I2C_HW (BT878_I2C_MODE  | BT848_I2C_SY    
150                 BT848_I2C_SCL | BT848_I2C_SDA)    
151                                                   
152 static int                                        
153 bttv_i2c_sendbytes(struct bttv *btv, const str    
154 {                                                 
155         u32 xmit;                                 
156         int retval,cnt;                           
157                                                   
158         /* sanity checks */                       
159         if (0 == msg->len)                        
160                 return -EINVAL;                   
161                                                   
162         /* start, address + first byte */         
163         xmit = (msg->addr << 25) | (msg->buf[0    
164         if (msg->len > 1 || !last)                
165                 xmit |= BT878_I2C_NOSTOP;         
166         btwrite(xmit, BT848_I2C);                 
167         retval = bttv_i2c_wait_done(btv);         
168         if (retval < 0)                           
169                 goto err;                         
170         if (retval == 0)                          
171                 goto eio;                         
172         if (i2c_debug) {                          
173                 printk(" <W %02x %02x", msg->a    
174                 if (!(xmit & BT878_I2C_NOSTOP)    
175                         printk(" >\n");           
176         }                                         
177                                                   
178         for (cnt = 1; cnt < msg->len; cnt++ )     
179                 /* following bytes */             
180                 xmit = (msg->buf[cnt] << 24) |    
181                 if (cnt < msg->len-1 || !last)    
182                         xmit |= BT878_I2C_NOST    
183                 btwrite(xmit, BT848_I2C);         
184                 retval = bttv_i2c_wait_done(bt    
185                 if (retval < 0)                   
186                         goto err;                 
187                 if (retval == 0)                  
188                         goto eio;                 
189                 if (i2c_debug) {                  
190                         printk(" %02x", msg->b    
191                         if (!(xmit & BT878_I2C    
192                                 printk(" >\n")    
193                 }                                 
194         }                                         
195         return msg->len;                          
196                                                   
197  eio:                                             
198         retval = -EIO;                            
199  err:                                             
200         if (i2c_debug)                            
201                 printk(" ERR: %d\n",retval);      
202         return retval;                            
203 }                                                 
204                                                   
205 static int                                        
206 bttv_i2c_readbytes(struct bttv *btv, const str    
207 {                                                 
208         u32 xmit;                                 
209         u32 cnt;                                  
210         int retval;                               
211                                                   
212         for(cnt = 0; cnt < msg->len; cnt++) {     
213                 xmit = (msg->addr << 25) | (1     
214                 if (cnt < msg->len-1)             
215                         xmit |= BT848_I2C_W3B;    
216                 if (cnt < msg->len-1 || !last)    
217                         xmit |= BT878_I2C_NOST    
218                 if (cnt)                          
219                         xmit |= BT878_I2C_NOST    
220                 btwrite(xmit, BT848_I2C);         
221                 retval = bttv_i2c_wait_done(bt    
222                 if (retval < 0)                   
223                         goto err;                 
224                 if (retval == 0)                  
225                         goto eio;                 
226                 msg->buf[cnt] = ((u32)btread(B    
227                 if (i2c_debug) {                  
228                         if (!(xmit & BT878_I2C    
229                                 printk(" <R %0    
230                         printk(" =%02x", msg->    
231                         if (!(xmit & BT878_I2C    
232                                 printk(" >\n")    
233                 }                                 
234         }                                         
235         return msg->len;                          
236                                                   
237  eio:                                             
238         retval = -EIO;                            
239  err:                                             
240         if (i2c_debug)                            
241                 printk(" ERR: %d\n",retval);      
242         return retval;                            
243 }                                                 
244                                                   
245 static int bttv_i2c_xfer(struct i2c_adapter *i    
246 {                                                 
247         struct bttv *btv = i2c_get_adapdata(i2    
248         int retval = 0;                           
249         int i;                                    
250                                                   
251         if (i2c_debug)                            
252                 printk("bt-i2c:");                
253         btwrite(BT848_INT_I2CDONE|BT848_INT_RA    
254         for (i = 0 ; i < num; i++) {              
255                 if (msgs[i].flags & I2C_M_RD)     
256                         /* read */                
257                         retval = bttv_i2c_read    
258                         if (retval < 0)           
259                                 goto err;         
260                 } else {                          
261                         /* write */               
262                         retval = bttv_i2c_send    
263                         if (retval < 0)           
264                                 goto err;         
265                 }                                 
266         }                                         
267         return num;                               
268                                                   
269  err:                                             
270         return retval;                            
271 }                                                 
272                                                   
273 static struct i2c_algorithm bttv_algo = {         
274         .master_xfer   = bttv_i2c_xfer,           
275         .functionality = functionality,           
276 };                                                
277                                                   
278 static struct i2c_adapter bttv_i2c_adap_hw_tem    
279         .owner             = THIS_MODULE,         
280         .class         = I2C_CLASS_TV_ANALOG,     
281         .name          = "bt878",                 
282         .id            = I2C_HW_B_BT848 /* FIX    
283         .algo          = &bttv_algo,              
284         .client_register = attach_inform,         
285 };                                                
286                                                   
287 /* -------------------------------------------    
288 /* I2C functions - common stuff                   
289                                                   
290 static int attach_inform(struct i2c_client *cl    
291 {                                                 
292         struct bttv *btv = i2c_get_adapdata(cl    
293         int addr=ADDR_UNSET;                      
294                                                   
295                                                   
296         if (ADDR_UNSET != bttv_tvcards[btv->c.    
297                 addr = bttv_tvcards[btv->c.typ    
298                                                   
299                                                   
300         if (bttv_debug)                           
301                 printk(KERN_DEBUG "bttv%d: %s     
302                         btv->c.nr, client->dri    
303                         client->name);            
304         if (!client->driver->command)             
305                 return 0;                         
306                                                   
307         if (client->driver->id == I2C_DRIVERID    
308                 btv->i2c_msp34xx_client = clie    
309         if (client->driver->id == I2C_DRIVERID    
310                 btv->i2c_tvaudio_client = clie    
311         if (btv->tuner_type != UNSET) {           
312                 struct tuner_setup tun_setup;     
313                                                   
314                 if ((addr==ADDR_UNSET) ||         
315                                 (addr==client-    
316                                                   
317                         tun_setup.mode_mask =     
318                         tun_setup.type = btv->    
319                         tun_setup.addr = addr;    
320                         bttv_call_i2c_clients(    
321                 }                                 
322                                                   
323         }                                         
324                                                   
325         return 0;                                 
326 }                                                 
327                                                   
328 void bttv_call_i2c_clients(struct bttv *btv, u    
329 {                                                 
330         if (0 != btv->i2c_rc)                     
331                 return;                           
332         i2c_clients_command(&btv->c.i2c_adap,     
333 }                                                 
334                                                   
335 static struct i2c_client bttv_i2c_client_templ    
336         .name   = "bttv internal",                
337 };                                                
338                                                   
339                                                   
340 /* read I2C */                                    
341 int bttv_I2CRead(struct bttv *btv, unsigned ch    
342 {                                                 
343         unsigned char buffer = 0;                 
344                                                   
345         if (0 != btv->i2c_rc)                     
346                 return -1;                        
347         if (bttv_verbose && NULL != probe_for)    
348                 printk(KERN_INFO "bttv%d: i2c:    
349                        btv->c.nr,probe_for,add    
350         btv->i2c_client.addr = addr >> 1;         
351         if (1 != i2c_master_recv(&btv->i2c_cli    
352                 if (NULL != probe_for) {          
353                         if (bttv_verbose)         
354                                 printk("not fo    
355                 } else                            
356                         printk(KERN_WARNING "b    
357                                btv->c.nr,addr)    
358                 return -1;                        
359         }                                         
360         if (bttv_verbose && NULL != probe_for)    
361                 printk("found\n");                
362         return buffer;                            
363 }                                                 
364                                                   
365 /* write I2C */                                   
366 int bttv_I2CWrite(struct bttv *btv, unsigned c    
367                     unsigned char b2, int both    
368 {                                                 
369         unsigned char buffer[2];                  
370         int bytes = both ? 2 : 1;                 
371                                                   
372         if (0 != btv->i2c_rc)                     
373                 return -1;                        
374         btv->i2c_client.addr = addr >> 1;         
375         buffer[0] = b1;                           
376         buffer[1] = b2;                           
377         if (bytes != i2c_master_send(&btv->i2c    
378                 return -1;                        
379         return 0;                                 
380 }                                                 
381                                                   
382 /* read EEPROM content */                         
383 void __devinit bttv_readee(struct bttv *btv, u    
384 {                                                 
385         memset(eedata, 0, 256);                   
386         if (0 != btv->i2c_rc)                     
387                 return;                           
388         btv->i2c_client.addr = addr >> 1;         
389         tveeprom_read(&btv->i2c_client, eedata    
390 }                                                 
391                                                   
392 static char *i2c_devs[128] = {                    
393         [ 0x1c >> 1 ] = "lgdt330x",               
394         [ 0x30 >> 1 ] = "IR (hauppauge)",         
395         [ 0x80 >> 1 ] = "msp34xx",                
396         [ 0x86 >> 1 ] = "tda9887",                
397         [ 0xa0 >> 1 ] = "eeprom",                 
398         [ 0xc0 >> 1 ] = "tuner (analog)",         
399         [ 0xc2 >> 1 ] = "tuner (analog)",         
400 };                                                
401                                                   
402 static void do_i2c_scan(char *name, struct i2c    
403 {                                                 
404         unsigned char buf;                        
405         int i,rc;                                 
406                                                   
407         for (i = 0; i < ARRAY_SIZE(i2c_devs);     
408                 c->addr = i;                      
409                 rc = i2c_master_recv(c,&buf,0)    
410                 if (rc < 0)                       
411                         continue;                 
412                 printk("%s: i2c scan: found de    
413                        name, i << 1, i2c_devs[    
414         }                                         
415 }                                                 
416                                                   
417 /* init + register i2c algo-bit adapter */        
418 int __devinit init_bttv_i2c(struct bttv *btv)     
419 {                                                 
420         memcpy(&btv->i2c_client, &bttv_i2c_cli    
421                sizeof(bttv_i2c_client_template    
422                                                   
423         if (i2c_hw)                               
424                 btv->use_i2c_hw = 1;              
425         if (btv->use_i2c_hw) {                    
426                 /* bt878 */                       
427                 memcpy(&btv->c.i2c_adap, &bttv    
428                        sizeof(bttv_i2c_adap_hw    
429         } else {                                  
430                 /* bt848 */                       
431         /* Prevents usage of invalid delay val    
432                 if (i2c_udelay<5)                 
433                         i2c_udelay=5;             
434                 bttv_i2c_algo_bit_template.ude    
435                                                   
436                 memcpy(&btv->c.i2c_adap, &bttv    
437                        sizeof(bttv_i2c_adap_sw    
438                 memcpy(&btv->i2c_algo, &bttv_i    
439                        sizeof(bttv_i2c_algo_bi    
440                 btv->i2c_algo.data = btv;         
441                 btv->c.i2c_adap.algo_data = &b    
442         }                                         
443                                                   
444         btv->c.i2c_adap.dev.parent = &btv->c.p    
445         snprintf(btv->c.i2c_adap.name, sizeof(    
446                  "bt%d #%d [%s]", btv->id, btv    
447                  btv->use_i2c_hw ? "hw" : "sw"    
448                                                   
449         i2c_set_adapdata(&btv->c.i2c_adap, btv    
450         btv->i2c_client.adapter = &btv->c.i2c_    
451                                                   
452         if (bttv_tvcards[btv->c.type].no_video    
453                 btv->c.i2c_adap.class &= ~I2C_    
454         if (bttv_tvcards[btv->c.type].has_dvb)    
455                 btv->c.i2c_adap.class |= I2C_C    
456                                                   
457         if (btv->use_i2c_hw) {                    
458                 btv->i2c_rc = i2c_add_adapter(    
459         } else {                                  
460                 bttv_bit_setscl(btv,1);           
461                 bttv_bit_setsda(btv,1);           
462                 btv->i2c_rc = i2c_bit_add_bus(    
463         }                                         
464         if (0 == btv->i2c_rc && i2c_scan)         
465                 do_i2c_scan(btv->c.name,&btv->    
466         return btv->i2c_rc;                       
467 }                                                 
468                                                   
469 int __devexit fini_bttv_i2c(struct bttv *btv)     
470 {                                                 
471         if (0 != btv->i2c_rc)                     
472                 return 0;                         
473                                                   
474         return i2c_del_adapter(&btv->c.i2c_ada    
475 }                                                 
476                                                   
477 /*                                                
478  * Local variables:                               
479  * c-basic-offset: 8                              
480  * End:                                           
481  */                                               
482                                                   
  This page was automatically generated by the LXR engine.