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 ]
  1 /*
  2  * saa7114 - Philips SAA7114H video decoder driver version 0.0.1
  3  *
  4  * Copyright (C) 2002 Maxim Yevtyushkin <max@linuxmedialabs.com>
  5  *
  6  * Based on saa7111 driver by Dave Perks
  7  *
  8  * Copyright (C) 1998 Dave Perks <dperks@ibm.net>
  9  *
 10  * Slight changes for video timing and attachment output by
 11  * Wolfgang Scherr <scherr@net4you.net>
 12  *
 13  * Changes by Ronald Bultje <rbultje@ronald.bitfreak.net>
 14  *    - moved over to linux>=2.4.x i2c protocol (1/1/2003)
 15  *
 16  * This program is free software; you can redistribute it and/or modify
 17  * it under the terms of the GNU General Public License as published by
 18  * the Free Software Foundation; either version 2 of the License, or
 19  * (at your option) any later version.
 20  *
 21  * This program is distributed in the hope that it will be useful,
 22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 24  * GNU General Public License for more details.
 25  *
 26  * You should have received a copy of the GNU General Public License
 27  * along with this program; if not, write to the Free Software
 28  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 29  */
 30 
 31 #include <linux/module.h>
 32 #include <linux/init.h>
 33 #include <linux/delay.h>
 34 #include <linux/errno.h>
 35 #include <linux/fs.h>
 36 #include <linux/kernel.h>
 37 #include <linux/major.h>
 38 #include <linux/slab.h>
 39 #include <linux/mm.h>
 40 #include <linux/signal.h>
 41 #include <linux/types.h>
 42 #include <linux/i2c.h>
 43 #include <asm/io.h>
 44 #include <asm/pgtable.h>
 45 #include <asm/page.h>
 46 #include <asm/uaccess.h>
 47 
 48 #include <linux/videodev.h>
 49 #include <linux/video_decoder.h>
 50 
 51 MODULE_DESCRIPTION("Philips SAA7114H video decoder driver");
 52 MODULE_AUTHOR("Maxim Yevtyushkin");
 53 MODULE_LICENSE("GPL");
 54 
 55 
 56 #define I2C_NAME(x) (x)->name
 57 
 58 
 59 static int debug = 0;
 60 module_param(debug, int, 0);
 61 MODULE_PARM_DESC(debug, "Debug level (0-1)");
 62 
 63 #define dprintk(num, format, args...) \
 64         do { \
 65                 if (debug >= num) \
 66                         printk(format, ##args); \
 67         } while (0)
 68 
 69 /* ----------------------------------------------------------------------- */
 70 
 71 struct saa7114 {
 72         unsigned char reg[0xf0 * 2];
 73 
 74         int norm;
 75         int input;
 76         int enable;
 77         int bright;
 78         int contrast;
 79         int hue;
 80         int sat;
 81         int playback;
 82 };
 83 
 84 #define   I2C_SAA7114        0x42
 85 #define   I2C_SAA7114A       0x40
 86 
 87 #define   I2C_DELAY   10
 88 
 89 
 90 //#define SAA_7114_NTSC_HSYNC_START       (-3)
 91 //#define SAA_7114_NTSC_HSYNC_STOP        (-18)
 92 
 93 #define SAA_7114_NTSC_HSYNC_START  (-17)
 94 #define SAA_7114_NTSC_HSYNC_STOP   (-32)
 95 
 96 //#define SAA_7114_NTSC_HOFFSET           (5)
 97 #define SAA_7114_NTSC_HOFFSET           (6)
 98 #define SAA_7114_NTSC_VOFFSET           (10)
 99 #define SAA_7114_NTSC_WIDTH             (720)
100 #define SAA_7114_NTSC_HEIGHT            (250)
101 
102 #define SAA_7114_SECAM_HSYNC_START      (-17)
103 #define SAA_7114_SECAM_HSYNC_STOP       (-32)
104 
105 #define SAA_7114_SECAM_HOFFSET          (2)
106 #define SAA_7114_SECAM_VOFFSET          (10)
107 #define SAA_7114_SECAM_WIDTH            (720)
108 #define SAA_7114_SECAM_HEIGHT           (300)
109 
110 #define SAA_7114_PAL_HSYNC_START        (-17)
111 #define SAA_7114_PAL_HSYNC_STOP         (-32)
112 
113 #define SAA_7114_PAL_HOFFSET            (2)
114 #define SAA_7114_PAL_VOFFSET            (10)
115 #define SAA_7114_PAL_WIDTH              (720)
116 #define SAA_7114_PAL_HEIGHT             (300)
117 
118 
119 
120 #define SAA_7114_VERTICAL_CHROMA_OFFSET         0       //0x50504040
121 #define SAA_7114_VERTICAL_LUMA_OFFSET           0
122 
123 #define REG_ADDR(x) (((x) << 1) + 1)
124 #define LOBYTE(x) ((unsigned char)((x) & 0xff))
125 #define HIBYTE(x) ((unsigned char)(((x) >> 8) & 0xff))
126 #define LOWORD(x) ((unsigned short int)((x) & 0xffff))
127 #define HIWORD(x) ((unsigned short int)(((x) >> 16) & 0xffff))
128 
129 
130 /* ----------------------------------------------------------------------- */
131 
132 static inline int
133 saa7114_write (struct i2c_client *client,
134                u8                 reg,
135                u8                 value)
136 {
137         return i2c_smbus_write_byte_data(client, reg, value);
138 }
139 
140 static int
141 saa7114_write_block (struct i2c_client *client,
142                      const u8          *data,
143                      unsigned int       len)
144 {
145         int ret = -1;
146         u8 reg;
147 
148         /* the saa7114 has an autoincrement function, use it if
149          * the adapter understands raw I2C */
150         if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
151                 /* do raw I2C, not smbus compatible */
152                 u8 block_data[32];
153                 int block_len;
154 
155                 while (len >= 2) {
156                         block_len = 0;
157                         block_data[block_len++] = reg = data[0];
158                         do {
159                                 block_data[block_len++] = data[1];
160                                 reg++;
161                                 len -= 2;
162                                 data += 2;
163                         } while (len >= 2 && data[0] == reg &&
164                                  block_len < 32);
165                         if ((ret = i2c_master_send(client, block_data,
166                                                    block_len)) < 0)
167                                 break;
168                 }
169         } else {
170                 /* do some slow I2C emulation kind of thing */
171                 while (len >= 2) {
172                         reg = *data++;
173                         if ((ret = saa7114_write(client, reg,
174                                                  *data++)) < 0)
175                                 break;
176                         len -= 2;
177                 }
178         }
179 
180         return ret;
181 }
182 
183 static inline int
184 saa7114_read (struct i2c_client *client,
185               u8                 reg)
186 {
187         return i2c_smbus_read_byte_data(client, reg);
188 }
189 
190 /* ----------------------------------------------------------------------- */
191 
192 // initially set NTSC, composite
193 
194 
195 static const unsigned char init[] = {
196         0x00, 0x00,             /* 00 - ID byte , chip version,
197                                  * read only */
198         0x01, 0x08,             /* 01 - X,X,X,X, IDEL3 to IDEL0 -
199                                  * horizontal increment delay,
200                                  * recommended position */
201         0x02, 0x00,             /* 02 - FUSE=3, GUDL=2, MODE=0 ;
202                                  * input control */
203         0x03, 0x10,             /* 03 - HLNRS=0, VBSL=1, WPOFF=0,
204                                  * HOLDG=0, GAFIX=0, GAI1=256, GAI2=256 */
205         0x04, 0x90,             /* 04 - GAI1=256 */
206         0x05, 0x90,             /* 05 - GAI2=256 */
207         0x06, SAA_7114_NTSC_HSYNC_START,        /* 06 - HSB: hsync start,
208                                  * depends on the video standard */
209         0x07, SAA_7114_NTSC_HSYNC_STOP, /* 07 - HSS: hsync stop, depends
210                                  *on the video standard */
211         0x08, 0xb8,             /* 08 - AUFD=1, FSEL=1, EXFIL=0, VTRC=1,
212                                  * HPLL: free running in playback, locked
213                                  * in capture, VNOI=0 */
214         0x09, 0x80,             /* 09 - BYPS=0, PREF=0, BPSS=0, VBLB=0,
215                                  * UPTCV=0, APER=1; depends from input */
216         0x0a, 0x80,             /* 0a - BRIG=128 */
217         0x0b, 0x44,             /* 0b - CONT=1.109 */
218         0x0c, 0x40,             /* 0c - SATN=1.0 */
219         0x0d, 0x00,             /* 0d - HUE=0 */
220         0x0e, 0x84,             /* 0e - CDTO, CSTD2 to 0, DCVF, FCTC,
221                                  * CCOMB; depends from video standard */
222         0x0f, 0x24,             /* 0f - ACGC,CGAIN6 to CGAIN0; depends
223                                  * from video standard */
224         0x10, 0x03,             /* 10 - OFFU1 to 0, OFFV1 to 0, CHBW,
225                                  * LCBW2 to 0 */
226         0x11, 0x59,             /* 11 - COLO, RTP1, HEDL1 to 0, RTP0,
227                                  * YDEL2 to 0 */
228         0x12, 0xc9,             /* 12 - RT signal control RTSE13 to 10
229                                  * and 03 to 00 */
230         0x13, 0x80,             /* 13 - RT/X port output control  */
231         0x14, 0x00,             /* 14 - analog, ADC, compatibility control */
232         0x15, 0x00,             /* 15 - VGATE start FID change  */
233         0x16, 0xfe,             /* 16 - VGATE stop */
234         0x17, 0x00,             /* 17 - Misc., VGATE MSBs */
235         0x18, 0x40,             /* RAWG */
236         0x19, 0x80,             /* RAWO */
237         0x1a, 0x00,
238         0x1b, 0x00,
239         0x1c, 0x00,
240         0x1d, 0x00,
241         0x1e, 0x00,
242         0x1f, 0x00,             /* status byte, read only */
243         0x20, 0x00,             /* video decoder reserved part */
244         0x21, 0x00,
245         0x22, 0x00,
246         0x23, 0x00,
247         0x24, 0x00,
248         0x25, 0x00,
249         0x26, 0x00,
250         0x27, 0x00,
251         0x28, 0x00,
252         0x29, 0x00,
253         0x2a, 0x00,
254         0x2b, 0x00,
255         0x2c, 0x00,
256         0x2d, 0x00,
257         0x2e, 0x00,
258         0x2f, 0x00,
259         0x30, 0xbc,             /* audio clock generator */
260         0x31, 0xdf,
261         0x32, 0x02,
262         0x33, 0x00,
263         0x34, 0xcd,
264         0x35, 0xcc,
265         0x36, 0x3a,
266         0x37, 0x00,
267         0x38, 0x03,
268         0x39, 0x10,
269         0x3a, 0x00,
270         0x3b, 0x00,
271         0x3c, 0x00,
272         0x3d, 0x00,
273         0x3e, 0x00,
274         0x3f, 0x00,
275         0x40, 0x00,             /* VBI data slicer */
276         0x41, 0xff,
277         0x42, 0xff,
278         0x43, 0xff,
279         0x44, 0xff,
280         0x45, 0xff,
281         0x46, 0xff,
282         0x47, 0xff,
283         0x48, 0xff,
284         0x49, 0xff,
285         0x4a, 0xff,
286         0x4b, 0xff,
287         0x4c, 0xff,
288         0x4d, 0xff,
289         0x4e, 0xff,
290         0x4f, 0xff,
291         0x50, 0xff,
292         0x51, 0xff,
293         0x52, 0xff,
294         0x53, 0xff,
295         0x54, 0xff,
296         0x55, 0xff,
297         0x56, 0xff,
298         0x57, 0xff,
299         0x58, 0x40,             // framing code
300         0x59, 0x47,             // horizontal offset
301         0x5a, 0x06,             // vertical offset
302         0x5b, 0x83,             // field offset
303         0x5c, 0x00,             // reserved
304         0x5d, 0x3e,             // header and data
305         0x5e, 0x00,             // sliced data
306         0x5f, 0x00,             // reserved
307         0x60, 0x00,             /* video decoder reserved part */
308         0x61, 0x00,
309         0x62, 0x00,
310         0x63, 0x00,
311         0x64, 0x00,
312         0x65, 0x00,
313         0x66, 0x00,
314         0x67, 0x00,
315         0x68, 0x00,
316         0x69, 0x00,
317         0x6a, 0x00,
318         0x6b, 0x00,
319         0x6c, 0x00,
320         0x6d, 0x00,
321         0x6e, 0x00,
322         0x6f, 0x00,
323         0x70, 0x00,             /* video decoder reserved part */
324         0x71, 0x00,
325         0x72, 0x00,
326         0x73, 0x00,
327         0x74, 0x00,
328         0x75, 0x00,
329         0x76, 0x00,
330         0x77, 0x00,
331         0x78, 0x00,
332         0x79, 0x00,
333         0x7a, 0x00,
334         0x7b, 0x00,
335         0x7c, 0x00,
336         0x7d, 0x00,
337         0x7e, 0x00,
338         0x7f, 0x00,
339         0x80, 0x00,             /* X-port, I-port and scaler */
340         0x81, 0x00,
341         0x82, 0x00,
342         0x83, 0x00,
343         0x84, 0xc5,
344         0x85, 0x0d,             // hsync and vsync ?
345         0x86, 0x40,
346         0x87, 0x01,
347         0x88, 0x00,
348         0x89, 0x00,
349         0x8a, 0x00,
350         0x8b, 0x00,
351         0x8c, 0x00,
352         0x8d, 0x00,
353         0x8e, 0x00,
354         0x8f, 0x00,
355         0x90, 0x03,             /* Task A definition           */
356         0x91, 0x08,
357         0x92, 0x00,
358         0x93, 0x40,
359         0x94, 0x00,             // window settings
360         0x95, 0x00,
361         0x96, 0x00,
362         0x97, 0x00,
363         0x98, 0x00,
364         0x99, 0x00,
365         0x9a, 0x00,
366         0x9b, 0x00,
367         0x9c, 0x00,
368         0x9d, 0x00,
369         0x9e, 0x00,
370         0x9f, 0x00,
371         0xa0, 0x01,             /* horizontal integer prescaling ratio */
372         0xa1, 0x00,             /* horizontal prescaler accumulation
373                                  * sequence length */
374         0xa2, 0x00,             /* UV FIR filter, Y FIR filter, prescaler
375                                  * DC gain */
376         0xa3, 0x00,
377         0xa4, 0x80,             // luminance brightness
378         0xa5, 0x40,             // luminance gain
379         0xa6, 0x40,             // chrominance saturation
380         0xa7, 0x00,
381         0xa8, 0x00,             // horizontal luminance scaling increment
382         0xa9, 0x04,
383         0xaa, 0x00,             // horizontal luminance phase offset
384         0xab, 0x00,
385         0xac, 0x00,             // horizontal chrominance scaling increment
386         0xad, 0x02,
387         0xae, 0x00,             // horizontal chrominance phase offset
388         0xaf, 0x00,
389         0xb0, 0x00,             // vertical luminance scaling increment
390         0xb1, 0x04,
391         0xb2, 0x00,             // vertical chrominance scaling increment
392         0xb3, 0x04,
393         0xb4, 0x00,
394         0xb5, 0x00,
395         0xb6, 0x00,
396         0xb7, 0x00,
397         0xb8, 0x00,
398         0xb9, 0x00,
399         0xba, 0x00,
400         0xbb, 0x00,
401         0xbc, 0x00,
402         0xbd, 0x00,
403         0xbe, 0x00,
404         0xbf, 0x00,
405         0xc0, 0x02,             // Task B definition
406         0xc1, 0x08,
407         0xc2, 0x00,
408         0xc3, 0x40,
409         0xc4, 0x00,             // window settings
410         0xc5, 0x00,
411         0xc6, 0x00,
412         0xc7, 0x00,
413         0xc8, 0x00,
414         0xc9, 0x00,
415         0xca, 0x00,
416         0xcb, 0x00,
417         0xcc, 0x00,
418         0xcd, 0x00,
419         0xce, 0x00,
420         0xcf, 0x00,
421         0xd0, 0x01,             // horizontal integer prescaling ratio
422         0xd1, 0x00,             // horizontal prescaler accumulation sequence length
423         0xd2, 0x00,             // UV FIR filter, Y FIR filter, prescaler DC gain
424         0xd3, 0x00,
425         0xd4, 0x80,             // luminance brightness
426         0xd5, 0x40,             // luminance gain
427         0xd6, 0x40,             // chrominance saturation
428         0xd7, 0x00,
429         0xd8, 0x00,             // horizontal luminance scaling increment
430         0xd9, 0x04,
431         0xda, 0x00,             // horizontal luminance phase offset
432         0xdb, 0x00,
433         0xdc, 0x00,             // horizontal chrominance scaling increment
434         0xdd, 0x02,
435         0xde, 0x00,             // horizontal chrominance phase offset
436         0xdf, 0x00,
437         0xe0, 0x00,             // vertical luminance scaling increment
438         0xe1, 0x04,
439         0xe2, 0x00,             // vertical chrominance scaling increment
440         0xe3, 0x04,
441         0xe4, 0x00,
442         0xe5, 0x00,
443         0xe6, 0x00,
444         0xe7, 0x00,
445         0xe8, 0x00,
446         0xe9, 0x00,
447         0xea, 0x00,
448         0xeb, 0x00,
449         0xec, 0x00,
450         0xed, 0x00,
451         0xee, 0x00,
452         0xef, 0x00
453 };
454 
455 static int
456 saa7114_command (struct i2c_client *client,
457                  unsigned int       cmd,
458                  void              *arg)
459 {
460         struct saa7114 *decoder = i2c_get_clientdata(client);
461 
462         switch (cmd) {
463 
464         case 0:
465                 //dprintk(1, KERN_INFO "%s: writing init\n", I2C_NAME(client));
466                 //saa7114_write_block(client, init, sizeof(init));
467                 break;
468 
469         case DECODER_DUMP:
470         {
471                 int i;
472 
473                 dprintk(1, KERN_INFO "%s: decoder dump\n", I2C_NAME(client));
474 
475                 for (i = 0; i < 32; i += 16) {
476                         int j;
477 
478                         printk(KERN_DEBUG "%s: %03x", I2C_NAME(client), i);
479                         for (j = 0; j < 16; ++j) {
480                                 printk(" %02x",
481                                        saa7114_read(client, i + j));
482                         }
483                         printk("\n");
484                 }
485         }
486                 break;
487 
488         case DECODER_GET_CAPABILITIES:
489         {
490                 struct video_decoder_capability *cap = arg;
491 
492                 dprintk(1, KERN_DEBUG "%s: decoder get capabilities\n",
493                         I2C_NAME(client));
494 
495                 cap->flags = VIDEO_DECODER_PAL |
496                              VIDEO_DECODER_NTSC |
497                              VIDEO_DECODER_AUTO |
498                              VIDEO_DECODER_CCIR;
499                 cap->inputs = 8;
500                 cap->outputs = 1;
501         }
502                 break;
503 
504         case DECODER_GET_STATUS:
505         {
506                 int *iarg = arg;
507                 int status;
508                 int res;
509 
510                 status = saa7114_read(client, 0x1f);
511 
512                 dprintk(1, KERN_DEBUG "%s status: 0x%02x\n", I2C_NAME(client),
513                         status);
514                 res = 0;
515                 if ((status & (1 << 6)) == 0) {
516                         res |= DECODER_STATUS_GOOD;
517                 }
518                 switch (decoder->norm) {
519                 case VIDEO_MODE_NTSC:
520                         res |= DECODER_STATUS_NTSC;
521                         break;
522                 case VIDEO_MODE_PAL:
523                         res |= DECODER_STATUS_PAL;
524                         break;
525                 case VIDEO_MODE_SECAM:
526                         res |= DECODER_STATUS_SECAM;
527                         break;
528                 default:
529                 case VIDEO_MODE_AUTO:
530                         if ((status & (1 << 5)) != 0) {
531                                 res |= DECODER_STATUS_NTSC;
532                         } else {
533                                 res |= DECODER_STATUS_PAL;
534                         }
535                         break;
536                 }
537                 if ((status & (1 << 0)) != 0) {
538                         res |= DECODER_STATUS_COLOR;
539                 }
540                 *iarg = res;
541         }
542                 break;
543 
544         case DECODER_SET_NORM:
545         {
546                 int *iarg = arg;
547 
548                 short int hoff = 0, voff = 0, w = 0, h = 0;
549 
550                 dprintk(1, KERN_DEBUG "%s: decoder set norm ",
551                         I2C_NAME(client));
552                 switch (*iarg) {
553 
554                 case VIDEO_MODE_NTSC:
555                         dprintk(1, "NTSC\n");
556                         decoder->reg[REG_ADDR(0x06)] =
557                             SAA_7114_NTSC_HSYNC_START;
558                         decoder->reg[REG_ADDR(0x07)] =
559                             SAA_7114_NTSC_HSYNC_STOP;
560 
561                         decoder->reg[REG_ADDR(0x08)] = decoder->playback ? 0x7c : 0xb8; // PLL free when playback, PLL close when capture
562 
563                         decoder->reg[REG_ADDR(0x0e)] = 0x85;
564                         decoder->reg[REG_ADDR(0x0f)] = 0x24;
565 
566                         hoff = SAA_7114_NTSC_HOFFSET;
567                         voff = SAA_7114_NTSC_VOFFSET;
568                         w = SAA_7114_NTSC_WIDTH;
569                         h = SAA_7114_NTSC_HEIGHT;
570 
571                         break;
572 
573                 case VIDEO_MODE_PAL:
574                         dprintk(1, "PAL\n");
575                         decoder->reg[REG_ADDR(0x06)] =
576                             SAA_7114_PAL_HSYNC_START;
577                         decoder->reg[REG_ADDR(0x07)] =
578                             SAA_7114_PAL_HSYNC_STOP;
579 
580                         decoder->reg[REG_ADDR(0x08)] = decoder->playback ? 0x7c : 0xb8; // PLL free when playback, PLL close when capture
581 
582                         decoder->reg[REG_ADDR(0x0e)] = 0x81;
583                         decoder->reg[REG_ADDR(0x0f)] = 0x24;
584 
585                         hoff = SAA_7114_PAL_HOFFSET;
586                         voff = SAA_7114_PAL_VOFFSET;
587                         w = SAA_7114_PAL_WIDTH;
588                         h = SAA_7114_PAL_HEIGHT;
589 
590                         break;
591 
592                 default:
593                         dprintk(1, " Unknown video mode!!!\n");
594                         return -EINVAL;
595 
596                 }
597 
598 
599                 decoder->reg[REG_ADDR(0x94)] = LOBYTE(hoff);    // hoffset low
600                 decoder->reg[REG_ADDR(0x95)] = HIBYTE(hoff) & 0x0f;     // hoffset high
601                 decoder->reg[REG_ADDR(0x96)] = LOBYTE(w);       // width low
602                 decoder->reg[REG_ADDR(0x97)] = HIBYTE(w) & 0x0f;        // width high
603                 decoder->reg[REG_ADDR(0x98)] = LOBYTE(voff);    // voffset low
604                 decoder->reg[REG_ADDR(0x99)] = HIBYTE(voff) & 0x0f;     // voffset high
605                 decoder->reg[REG_ADDR(0x9a)] = LOBYTE(h + 2);   // height low
606                 decoder->reg[REG_ADDR(0x9b)] = HIBYTE(h + 2) & 0x0f;    // height high
607                 decoder->reg[REG_ADDR(0x9c)] = LOBYTE(w);       // out width low
608                 decoder->reg[REG_ADDR(0x9d)] = HIBYTE(w) & 0x0f;        // out width high
609                 decoder->reg[REG_ADDR(0x9e)] = LOBYTE(h);       // out height low
610                 decoder->reg[REG_ADDR(0x9f)] = HIBYTE(h) & 0x0f;        // out height high
611 
612                 decoder->reg[REG_ADDR(0xc4)] = LOBYTE(hoff);    // hoffset low
613                 decoder->reg[REG_ADDR(0xc5)] = HIBYTE(hoff) & 0x0f;     // hoffset high
614                 decoder->reg[REG_ADDR(0xc6)] = LOBYTE(w);       // width low
615                 decoder->reg[REG_ADDR(0xc7)] = HIBYTE(w) & 0x0f;        // width high
616                 decoder->reg[REG_ADDR(0xc8)] = LOBYTE(voff);    // voffset low
617                 decoder->reg[REG_ADDR(0xc9)] = HIBYTE(voff) & 0x0f;     // voffset high
618                 decoder->reg[REG_ADDR(0xca)] = LOBYTE(h + 2);   // height low
619                 decoder->reg[REG_ADDR(0xcb)] = HIBYTE(h + 2) & 0x0f;    // height high
620                 decoder->reg[REG_ADDR(0xcc)] = LOBYTE(w);       // out width low
621                 decoder->reg[REG_ADDR(0xcd)] = HIBYTE(w) & 0x0f;        // out width high
622                 decoder->reg[REG_ADDR(0xce)] = LOBYTE(h);       // out height low
623                 decoder->reg[REG_ADDR(0xcf)] = HIBYTE(h) & 0x0f;        // out height high
624 
625 
626                 saa7114_write(client, 0x80, 0x06);      // i-port and scaler back end clock selection, task A&B off
627                 saa7114_write(client, 0x88, 0xd8);      // sw reset scaler
628                 saa7114_write(client, 0x88, 0xf8);      // sw reset scaler release
629 
630                 saa7114_write_block(client, decoder->reg + (0x06 << 1),
631                                     3 << 1);
632                 saa7114_write_block(client, decoder->reg + (0x0e << 1),
633                                     2 << 1);
634                 saa7114_write_block(client, decoder->reg + (0x5a << 1),
635                                     2 << 1);
636 
637                 saa7114_write_block(client, decoder->reg + (0x94 << 1),
638                                     (0x9f + 1 - 0x94) << 1);
639                 saa7114_write_block(client, decoder->reg + (0xc4 << 1),
640                                     (0xcf + 1 - 0xc4) << 1);
641 
642                 saa7114_write(client, 0x88, 0xd8);      // sw reset scaler
643                 saa7114_write(client, 0x88, 0xf8);      // sw reset scaler release
644                 saa7114_write(client, 0x80, 0x36);      // i-port and scaler back end clock selection
645 
646                 decoder->norm = *iarg;
647         }
648                 break;
649 
650         case DECODER_SET_INPUT:
651         {
652                 int *iarg = arg;
653 
654                 dprintk(1, KERN_DEBUG "%s: decoder set input (%d)\n",
655                         I2C_NAME(client), *iarg);
656                 if (*iarg < 0 || *iarg > 7) {
657                         return -EINVAL;
658                 }
659 
660                 if (decoder->input != *iarg) {
661                         dprintk(1, KERN_DEBUG "%s: now setting %s input\n",
662                                 I2C_NAME(client),
663                                 *iarg >= 6 ? "S-Video" : "Composite");
664                         decoder->input = *iarg;
665 
666                         /* select mode */
667                         decoder->reg[REG_ADDR(0x02)] =
668                             (decoder->
669                              reg[REG_ADDR(0x02)] & 0xf0) | (decoder->
670                                                             input <
671                                                             6 ? 0x0 : 0x9);
672                         saa7114_write(client, 0x02,
673                                       decoder->reg[REG_ADDR(0x02)]);
674 
675                         /* bypass chrominance trap for modes 6..9 */
676                         decoder->reg[REG_ADDR(0x09)] =
677                             (decoder->
678                              reg[REG_ADDR(0x09)] & 0x7f) | (decoder->
679                                                             input <
680                                                             6 ? 0x0 :
681                                                             0x80);
682                         saa7114_write(client, 0x09,
683                                       decoder->reg[REG_ADDR(0x09)]);
684 
685                         decoder->reg[REG_ADDR(0x0e)] =
686                             decoder->input <
687                             6 ? decoder->
688                             reg[REG_ADDR(0x0e)] | 1 : decoder->
689                             reg[REG_ADDR(0x0e)] & ~1;
690                         saa7114_write(client, 0x0e,
691                                       decoder->reg[REG_ADDR(0x0e)]);
692                 }
693         }
694                 break;
695 
696         case DECODER_SET_OUTPUT:
697         {
698                 int *iarg = arg;
699 
700                 dprintk(1, KERN_DEBUG "%s: decoder set output\n",
701                         I2C_NAME(client));
702 
703                 /* not much choice of outputs */
704                 if (*iarg != 0) {
705                         return -EINVAL;
706                 }
707         }
708                 break;
709 
710         case DECODER_ENABLE_OUTPUT:
711         {
712                 int *iarg = arg;
713                 int enable = (*iarg != 0);
714 
715                 dprintk(1, KERN_DEBUG "%s: decoder %s output\n",
716                         I2C_NAME(client), enable ? "enable" : "disable");
717 
718                 decoder->playback = !enable;
719 
720                 if (decoder->enable != enable) {
721                         decoder->enable = enable;
722 
723                         /* RJ: If output should be disabled (for
724                          * playing videos), we also need a open PLL.
725                          * The input is set to 0 (where no input
726                          * source is connected), although this
727                          * is not necessary.
728                          *
729                          * If output should be enabled, we have to
730                          * reverse the above.
731                          */
732 
733                         if (decoder->enable) {
734                                 decoder->reg[REG_ADDR(0x08)] = 0xb8;
735                                 decoder->reg[REG_ADDR(0x12)] = 0xc9;
736                                 decoder->reg[REG_ADDR(0x13)] = 0x80;
737                                 decoder->reg[REG_ADDR(0x87)] = 0x01;
738                         } else {
739                                 decoder->reg[REG_ADDR(0x08)] = 0x7c;
740                                 decoder->reg[REG_ADDR(0x12)] = 0x00;
741                                 decoder->reg[REG_ADDR(0x13)] = 0x00;
742                                 decoder->reg[REG_ADDR(0x87)] = 0x00;
743                         }
744 
745                         saa7114_write_block(client,
746                                             decoder->reg + (0x12 << 1),
747                                             2 << 1);
748                         saa7114_write(client, 0x08,
749                                       decoder->reg[REG_ADDR(0x08)]);
750                         saa7114_write(client, 0x87,
751                                       decoder->reg[REG_ADDR(0x87)]);
752                         saa7114_write(client, 0x88, 0xd8);      // sw reset scaler
753                         saa7114_write(client, 0x88, 0xf8);      // sw reset scaler release
754                         saa7114_write(client, 0x80, 0x36);
755 
756                 }
757         }
758                 break;
759 
760         case DECODER_SET_PICTURE:
761         {
762                 struct video_picture *pic = arg;
763 
764                 dprintk(1,
765                         KERN_DEBUG
766                         "%s: decoder set picture bright=%d contrast=%d saturation=%d hue=%d\n",
767                         I2C_NAME(client), pic->brightness, pic->contrast,
768                         pic->colour, pic->hue);
769 
770                 if (decoder->bright != pic->brightness) {
771                         /* We want 0 to 255 we get 0-65535 */
772                         decoder->bright = pic->brightness;
773                         saa7114_write(client, 0x0a, decoder->bright >> 8);
774                 }
775                 if (decoder->contrast != pic->contrast) {
776                         /* We want 0 to 127 we get 0-65535 */
777                         decoder->contrast = pic->contrast;
778                         saa7114_write(client, 0x0b,
779                                       decoder->contrast >> 9);
780                 }
781                 if (decoder->sat != pic->colour) {
782                         /* We want 0 to 127 we get 0-65535 */
783                         decoder->sat = pic->colour;
784                         saa7114_write(client, 0x0c, decoder->sat >> 9);
785                 }
786                 if (decoder->hue != pic->hue) {
787                         /* We want -128 to 127 we get 0-65535 */
788                         decoder->hue = pic->hue;
789                         saa7114_write(client, 0x0d,
790                                       (decoder->hue - 32768) >> 8);
791                 }
792         }
793                 break;
794 
795         default:
796                 return -EINVAL;
797         }
798 
799         return 0;
800 }
801 
802 /* ----------------------------------------------------------------------- */
803 
804 /*
805  * Generic i2c probe
806  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
807  */
808 static unsigned short normal_i2c[] =
809     { I2C_SAA7114 >> 1, I2C_SAA7114A >> 1, I2C_CLIENT_END };
810 
811 static unsigned short ignore = I2C_CLIENT_END;
812 
813 static struct i2c_client_address_data addr_data = {
814         .normal_i2c             = normal_i2c,
815         .probe                  = &ignore,
816         .ignore                 = &ignore,
817 };
818 
819 static struct i2c_driver i2c_driver_saa7114;
820 
821 static int
822 saa7114_detect_client (struct i2c_adapter *adapter,
823                        int                 address,
824                        int                 kind)
825 {
826         int i, err[30];
827         short int hoff = SAA_7114_NTSC_HOFFSET;
828         short int voff = SAA_7114_NTSC_VOFFSET;
829         short int w = SAA_7114_NTSC_WIDTH;
830         short int h = SAA_7114_NTSC_HEIGHT;
831         struct i2c_client *client;
832         struct saa7114 *decoder;
833 
834         dprintk(1,
835                 KERN_INFO
836                 "saa7114.c: detecting saa7114 client on address 0x%x\n",
837                 address << 1);
838 
839         /* Check if the adapter supports the needed features */
840         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
841                 return 0;
842 
843         client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
844         if (!client)
845                 return -ENOMEM;
846         client->addr = address;
847         client->adapter = adapter;
848         client->driver = &i2c_driver_saa7114;
849         strlcpy(I2C_NAME(client), "saa7114", sizeof(I2C_NAME(client)));
850 
851         decoder = kzalloc(sizeof(struct saa7114), GFP_KERNEL);
852         if (decoder == NULL) {
853                 kfree(client);
854                 return -ENOMEM;
855         }
856         decoder->norm = VIDEO_MODE_NTSC;
857         decoder->input = -1;
858         decoder->enable = 1;
859         decoder->bright = 32768;
860         decoder->contrast = 32768;
861         decoder->hue = 32768;
862         decoder->sat = 32768;
863         decoder->playback = 0;  // initially capture mode useda
864         i2c_set_clientdata(client, decoder);
865 
866         memcpy(decoder->reg, init, sizeof(init));
867 
868         decoder->reg[REG_ADDR(0x94)] = LOBYTE(hoff);    // hoffset low
869         decoder->reg[REG_ADDR(0x95)] = HIBYTE(hoff) & 0x0f;     // hoffset high
870         decoder->reg[REG_ADDR(0x96)] = LOBYTE(w);       // width low
871         decoder->reg[REG_ADDR(0x97)] = HIBYTE(w) & 0x0f;        // width high
872         decoder->reg[REG_ADDR(0x98)] = LOBYTE(voff);    // voffset low
873         decoder->reg[REG_ADDR(0x99)] = HIBYTE(voff) & 0x0f;     // voffset high
874         decoder->reg[REG_ADDR(0x9a)] = LOBYTE(h + 2);   // height low
875         decoder->reg[REG_ADDR(0x9b)] = HIBYTE(h + 2) & 0x0f;    // height high
876         decoder->reg[REG_ADDR(0x9c)] = LOBYTE(w);       // out width low
877         decoder->reg[REG_ADDR(0x9d)] = HIBYTE(w) & 0x0f;        // out width high
878         decoder->reg[REG_ADDR(0x9e)] = LOBYTE(h);       // out height low
879         decoder->reg[REG_ADDR(0x9f)] = HIBYTE(h) & 0x0f;        // out height high
880 
881         decoder->reg[REG_ADDR(0xc4)] = LOBYTE(hoff);    // hoffset low
882         decoder->reg[REG_ADDR(0xc5)] = HIBYTE(hoff) & 0x0f;     // hoffset high
883         decoder->reg[REG_ADDR(0xc6)] = LOBYTE(w);       // width low
884         decoder->reg[REG_ADDR(0xc7)] = HIBYTE(w) & 0x0f;        // width high
885         decoder->reg[REG_ADDR(0xc8)] = LOBYTE(voff);    // voffset low
886         decoder->reg[REG_ADDR(0xc9)] = HIBYTE(voff) & 0x0f;     // voffset high
887         decoder->reg[REG_ADDR(0xca)] = LOBYTE(h + 2);   // height low
888         decoder->reg[REG_ADDR(0xcb)] = HIBYTE(h + 2) & 0x0f;    // height high
889         decoder->reg[REG_ADDR(0xcc)] = LOBYTE(w);       // out width low
890         decoder->reg[REG_ADDR(0xcd)] = HIBYTE(w) & 0x0f;        // out width high
891         decoder->reg[REG_ADDR(0xce)] = LOBYTE(h);       // out height low
892         decoder->reg[REG_ADDR(0xcf)] = HIBYTE(h) & 0x0f;        // out height high
893 
894         decoder->reg[REG_ADDR(0xb8)] =
895             LOBYTE(LOWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
896         decoder->reg[REG_ADDR(0xb9)] =
897             HIBYTE(LOWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
898         decoder->reg[REG_ADDR(0xba)] =
899             LOBYTE(HIWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
900         decoder->reg[REG_ADDR(0xbb)] =
901             HIBYTE(HIWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
902 
903         decoder->reg[REG_ADDR(0xbc)] =
904             LOBYTE(LOWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
905         decoder->reg[REG_ADDR(0xbd)] =
906             HIBYTE(LOWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
907         decoder->reg[REG_ADDR(0xbe)] =
908             LOBYTE(HIWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
909         decoder->reg[REG_ADDR(0xbf)] =
910             HIBYTE(HIWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
911 
912         decoder->reg[REG_ADDR(0xe8)] =
913             LOBYTE(LOWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
914         decoder->reg[REG_ADDR(0xe9)] =
915             HIBYTE(LOWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
916         decoder->reg[REG_ADDR(0xea)] =
917             LOBYTE(HIWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
918         decoder->reg[REG_ADDR(0xeb)] =
919             HIBYTE(HIWORD(SAA_7114_VERTICAL_CHROMA_OFFSET));
920 
921         decoder->reg[REG_ADDR(0xec)] =
922             LOBYTE(LOWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
923         decoder->reg[REG_ADDR(0xed)] =
924             HIBYTE(LOWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
925         decoder->reg[REG_ADDR(0xee)] =
926             LOBYTE(HIWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
927         decoder->reg[REG_ADDR(0xef)] =
928             HIBYTE(HIWORD(SAA_7114_VERTICAL_LUMA_OFFSET));
929 
930 
931         decoder->reg[REG_ADDR(0x13)] = 0x80;    // RTC0 on
932         decoder->reg[REG_ADDR(0x87)] = 0x01;    // I-Port
933         decoder->reg[REG_ADDR(0x12)] = 0xc9;    // RTS0
934 
935         decoder->reg[REG_ADDR(0x02)] = 0xc0;    // set composite1 input, aveasy
936         decoder->reg[REG_ADDR(0x09)] = 0x00;    // chrominance trap
937         decoder->reg[REG_ADDR(0x0e)] |= 1;      // combfilter on
938 
939 
940         dprintk(1, KERN_DEBUG "%s_attach: starting decoder init\n",
941                 I2C_NAME(client));
942 
943         err[0] =
944             saa7114_write_block(client, decoder->reg + (0x20 << 1),
945                                 0x10 << 1);
946         err[1] =
947             saa7114_write_block(client, decoder->reg + (0x30 << 1),
948                                 0x10 << 1);
949         err[2] =
950             saa7114_write_block(client, decoder->reg + (0x63 << 1),
951                                 (0x7f + 1 - 0x63) << 1);
952         err[3] =
953             saa7114_write_block(client, decoder->reg + (0x89 << 1),
954                                 6 << 1);
955         err[4] =
956             saa7114_write_block(client, decoder->reg + (0xb8 << 1),
957                                 8 << 1);
958         err[5] =
959             saa7114_write_block(client, decoder->reg + (0xe8 << 1),
960                                 8 << 1);
961 
962 
963         for (i = 0; i <= 5; i++) {
964                 if (err[i] < 0) {
965                         dprintk(1,
966                                 KERN_ERR
967                                 "%s_attach: init error %d at stage %d, leaving attach.\n",
968                                 I2C_NAME(client), i, err[i]);
969                         kfree(decoder);
970                         kfree(client);
971                         return 0;
972                 }
973         }
974 
975         for (i = 6; i < 8; i++) {
976                 dprintk(1,
977                         KERN_DEBUG
978                         "%s_attach: reg[0x%02x] = 0x%02x (0x%02x)\n",
979                         I2C_NAME(client), i, saa7114_read(client, i),
980                         decoder->reg[REG_ADDR(i)]);
981         }
982 
983         dprintk(1,
984                 KERN_DEBUG
985                 "%s_attach: performing decoder reset sequence\n",
986                 I2C_NAME(client));
987 
988         err[6] = saa7114_write(client, 0x80, 0x06);     // i-port and scaler backend clock selection, task A&B off
989         err[7] = saa7114_write(client, 0x88, 0xd8);     // sw reset scaler
990         err[8] = saa7114_write(client, 0x88, 0xf8);     // sw reset scaler release
991 
992         for (i = 6; i <= 8; i++) {
993                 if (err[i] < 0) {
994                         dprintk(1,
995                                 KERN_ERR
996                                 "%s_attach: init error %d at stage %d, leaving attach.\n",
997                                 I2C_NAME(client), i, err[i]);
998                         kfree(decoder);
999                         kfree(client);
1000                         return 0;
1001                 }
1002         }
1003 
1004         dprintk(1, KERN_INFO "%s_attach: performing the rest of init\n",
1005                 I2C_NAME(client));
1006 
1007 
1008         err[9] = saa7114_write(client, 0x01, decoder->reg[REG_ADDR(0x01)]);
1009         err[10] = saa7114_write_block(client, decoder->reg + (0x03 << 1), (0x1e + 1 - 0x03) << 1);      // big seq
1010         err[11] = saa7114_write_block(client, decoder->reg + (0x40 << 1), (0x5f + 1 - 0x40) << 1);      // slicer
1011         err[12] = saa7114_write_block(client, decoder->reg + (0x81 << 1), 2 << 1);      // ?
1012         err[13] = saa7114_write_block(client, decoder->reg + (0x83 << 1), 5 << 1);      // ?
1013         err[14] = saa7114_write_block(client, decoder->reg + (0x90 << 1), 4 << 1);      // Task A
1014         err[15] =
1015             saa7114_write_block(client, decoder->reg + (0x94 << 1),
1016                                 12 << 1);
1017         err[16] =
1018             saa7114_write_block(client, decoder->reg + (0xa0 << 1),
1019                                 8 << 1);
1020         err[17] =
1021             saa7114_write_block(client, decoder->reg + (0xa8 << 1),
1022                                 8 << 1);
1023         err[18] =
1024             saa7114_write_block(client, decoder->reg + (0xb0 << 1),
1025                                 8 << 1);
1026         err[19] = saa7114_write_block(client, decoder->reg + (0xc0 << 1), 4 << 1);      // Task B
1027         err[15] =
1028             saa7114_write_block(client, decoder->reg + (0xc4 << 1),
1029                                 12 << 1);
1030         err[16] =
1031             saa7114_write_block(client, decoder->reg + (0xd0 << 1),
1032                                 8 << 1);
1033         err[17] =
1034             saa7114_write_block(client, decoder->reg + (0xd8 << 1),
1035                                 8 << 1);
1036         err[18] =
1037             saa7114_write_block(client, decoder->reg + (0xe0 << 1),
1038                                 8 << 1);
1039 
1040         for (i = 9; i <= 18; i++) {
1041                 if (err[i] < 0) {
1042                         dprintk(1,
1043                                 KERN_ERR
1044                                 "%s_attach: init error %d at stage %d, leaving attach.\n",
1045                                 I2C_NAME(client), i, err[i]);
1046                         kfree(decoder);
1047                         kfree(client);
1048                         return 0;
1049                 }
1050         }
1051 
1052 
1053         for (i = 6; i < 8; i++) {
1054                 dprintk(1,
1055                         KERN_DEBUG
1056                         "%s_attach: reg[0x%02x] = 0x%02x (0x%02x)\n",
1057                         I2C_NAME(client), i, saa7114_read(client, i),
1058                         decoder->reg[REG_ADDR(i)]);
1059         }
1060 
1061 
1062         for (i = 0x11; i <= 0x13; i++) {
1063                 dprintk(1,
1064                         KERN_DEBUG
1065                         "%s_attach: reg[0x%02x] = 0x%02x (0x%02x)\n",
1066                         I2C_NAME(client), i, saa7114_read(client, i),
1067                         decoder->reg[REG_ADDR(i)]);
1068         }
1069 
1070 
1071         dprintk(1, KERN_DEBUG "%s_attach: setting video input\n",
1072                 I2C_NAME(client));
1073 
1074         err[19] =
1075             saa7114_write(client, 0x02, decoder->reg[REG_ADDR(0x02)]);
1076         err[20] =
1077             saa7114_write(client, 0x09, decoder->reg[REG_ADDR(0x09)]);
1078         err[21] =
1079             saa7114_write(client, 0x0e, decoder->reg[REG_ADDR(0x0e)]);
1080 
1081         for (i = 19; i <= 21; i++) {
1082                 if (err[i] < 0) {
1083                         dprintk(1,
1084                                 KERN_ERR
1085                                 "%s_attach: init error %d at stage %d, leaving attach.\n",
1086                                 I2C_NAME(client), i, err[i]);
1087                         kfree(decoder);
1088                         kfree(client);
1089                         return 0;
1090                 }
1091         }
1092 
1093         dprintk(1,
1094                 KERN_DEBUG
1095                 "%s_attach: performing decoder reset sequence\n",
1096                 I2C_NAME(client));
1097 
1098         err[22] = saa7114_write(client, 0x88, 0xd8);    // sw reset scaler
1099         err[23] = saa7114_write(client, 0x88, 0xf8);    // sw reset scaler release
1100         err[24] = saa7114_write(client, 0x80, 0x36);    // i-port and scaler backend clock selection, task A&B off
1101 
1102 
1103         for (i = 22; i <= 24; i++) {
1104                 if (err[i] < 0) {
1105                         dprintk(1,
1106                                 KERN_ERR
1107                                 "%s_attach: init error %d at stage %d, leaving attach.\n",
1108                                 I2C_NAME(client), i, err[i]);
1109                         kfree(decoder);
1110                         kfree(client);
1111                         return 0;
1112                 }
1113         }
1114 
1115         err[25] = saa7114_write(client, 0x06, init[REG_ADDR(0x06)]);
1116         err[26] = saa7114_write(client, 0x07, init[REG_ADDR(0x07)]);
1117         err[27] = saa7114_write(client, 0x10, init[REG_ADDR(0x10)]);
1118 
1119         dprintk(1,
1120                 KERN_INFO
1121                 "%s_attach: chip version %x, decoder status 0x%02x\n",
1122                 I2C_NAME(client), saa7114_read(client, 0x00) >> 4,
1123                 saa7114_read(client, 0x1f));
1124         dprintk(1,
1125                 KERN_DEBUG
1126                 "%s_attach: power save control: 0x%02x, scaler status: 0x%02x\n",
1127                 I2C_NAME(client), saa7114_read(client, 0x88),
1128                 saa7114_read(client, 0x8f));
1129 
1130 
1131         for (i = 0x94; i < 0x96; i++) {
1132                 dprintk(1,
1133                         KERN_DEBUG
1134                         "%s_attach: reg[0x%02x] = 0x%02x (0x%02x)\n",
1135                         I2C_NAME(client), i, saa7114_read(client, i),
1136                         decoder->reg[REG_ADDR(i)]);
1137         }
1138 
1139         i = i2c_attach_client(client);
1140         if (i) {
1141                 kfree(client);
1142                 kfree(decoder);
1143                 return i;
1144         }
1145 
1146         //i = saa7114_write_block(client, init, sizeof(init));
1147         i = 0;
1148         if (i < 0) {
1149                 dprintk(1, KERN_ERR "%s_attach error: init status %d\n",
1150                         I2C_NAME(client), i);
1151         } else {
1152                 dprintk(1,
1153                         KERN_INFO
1154                         "%s_attach: chip version %x at address 0x%x\n",
1155                         I2C_NAME(client), saa7114_read(client, 0x00) >> 4,
1156                         client->addr << 1);
1157         }
1158 
1159         return 0;
1160 }
1161 
1162 static int
1163 saa7114_attach_adapter (struct i2c_adapter *adapter)
1164 {
1165         dprintk(1,
1166                 KERN_INFO
1167                 "saa7114.c: starting probe for adapter %s (0x%x)\n",
1168                 I2C_NAME(adapter), adapter->id);
1169         return i2c_probe(adapter, &addr_data, &saa7114_detect_client);
1170 }
1171 
1172 static int
1173 saa7114_detach_client (struct i2c_client *client)
1174 {
1175         struct saa7114 *decoder = i2c_get_clientdata(client);
1176         int err;
1177 
1178         err = i2c_detach_client(client);
1179         if (err) {
1180                 return err;
1181         }
1182 
1183         kfree(decoder);
1184         kfree(client);
1185 
1186         return 0;
1187 }
1188 
1189 /* ----------------------------------------------------------------------- */
1190 
1191 static struct i2c_driver i2c_driver_saa7114 = {
1192         .driver = {
1193                 .name = "saa7114",
1194         },
1195 
1196         .id = I2C_DRIVERID_SAA7114,
1197 
1198         .attach_adapter = saa7114_attach_adapter,
1199         .detach_client = saa7114_detach_client,
1200         .command = saa7114_command,
1201 };
1202 
1203 static int __init
1204 saa7114_init (void)
1205 {
1206         return i2c_add_driver(&i2c_driver_saa7114);
1207 }
1208 
1209 static void __exit
1210 saa7114_exit (void)
1211 {
1212         i2c_del_driver(&i2c_driver_saa7114);
1213 }
1214 
1215 module_init(saa7114_init);
1216 module_exit(saa7114_exit);
1217 
  This page was automatically generated by the LXR engine.