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