Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
[linux-2.6] / drivers / media / video / tda9887.c
1 #include <linux/module.h>
2 #include <linux/moduleparam.h>
3 #include <linux/kernel.h>
4 #include <linux/i2c.h>
5 #include <linux/types.h>
6 #include <linux/videodev.h>
7 #include <linux/init.h>
8 #include <linux/errno.h>
9 #include <linux/slab.h>
10 #include <linux/delay.h>
11
12 #include <media/v4l2-common.h>
13 #include <media/tuner.h>
14
15
16 /* Chips:
17    TDA9885 (PAL, NTSC)
18    TDA9886 (PAL, SECAM, NTSC)
19    TDA9887 (PAL, SECAM, NTSC, FM Radio)
20
21    Used as part of several tuners
22 */
23
24 #define tda9887_info(fmt, arg...) do {\
25         printk(KERN_INFO "%s %d-%04x (tda9887): " fmt, t->i2c.name, \
26                         i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0)
27 #define tda9887_dbg(fmt, arg...) do {\
28         if (tuner_debug) \
29                 printk(KERN_INFO "%s %d-%04x (tda9887): " fmt, t->i2c.name, \
30                         i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0)
31
32
33 /* ---------------------------------------------------------------------- */
34
35 #define UNSET       (-1U)
36
37 struct tvnorm {
38         v4l2_std_id       std;
39         char              *name;
40         unsigned char     b;
41         unsigned char     c;
42         unsigned char     e;
43 };
44
45 /* ---------------------------------------------------------------------- */
46
47 //
48 // TDA defines
49 //
50
51 //// first reg (b)
52 #define cVideoTrapBypassOFF     0x00    // bit b0
53 #define cVideoTrapBypassON      0x01    // bit b0
54
55 #define cAutoMuteFmInactive     0x00    // bit b1
56 #define cAutoMuteFmActive       0x02    // bit b1
57
58 #define cIntercarrier           0x00    // bit b2
59 #define cQSS                    0x04    // bit b2
60
61 #define cPositiveAmTV           0x00    // bit b3:4
62 #define cFmRadio                0x08    // bit b3:4
63 #define cNegativeFmTV           0x10    // bit b3:4
64
65
66 #define cForcedMuteAudioON      0x20    // bit b5
67 #define cForcedMuteAudioOFF     0x00    // bit b5
68
69 #define cOutputPort1Active      0x00    // bit b6
70 #define cOutputPort1Inactive    0x40    // bit b6
71
72 #define cOutputPort2Active      0x00    // bit b7
73 #define cOutputPort2Inactive    0x80    // bit b7
74
75
76 //// second reg (c)
77 #define cDeemphasisOFF          0x00    // bit c5
78 #define cDeemphasisON           0x20    // bit c5
79
80 #define cDeemphasis75           0x00    // bit c6
81 #define cDeemphasis50           0x40    // bit c6
82
83 #define cAudioGain0             0x00    // bit c7
84 #define cAudioGain6             0x80    // bit c7
85
86 #define cTopMask                0x1f    // bit c0:4
87 #define cTopPalSecamDefault     0x14    // bit c0:4
88 #define cTopNtscRadioDefault    0x10    // bit c0:4
89
90 //// third reg (e)
91 #define cAudioIF_4_5             0x00    // bit e0:1
92 #define cAudioIF_5_5             0x01    // bit e0:1
93 #define cAudioIF_6_0             0x02    // bit e0:1
94 #define cAudioIF_6_5             0x03    // bit e0:1
95
96
97 #define cVideoIF_58_75           0x00    // bit e2:4
98 #define cVideoIF_45_75           0x04    // bit e2:4
99 #define cVideoIF_38_90           0x08    // bit e2:4
100 #define cVideoIF_38_00           0x0C    // bit e2:4
101 #define cVideoIF_33_90           0x10    // bit e2:4
102 #define cVideoIF_33_40           0x14    // bit e2:4
103 #define cRadioIF_45_75           0x18    // bit e2:4
104 #define cRadioIF_38_90           0x1C    // bit e2:4
105
106
107 #define cTunerGainNormal         0x00    // bit e5
108 #define cTunerGainLow            0x20    // bit e5
109
110 #define cGating_18               0x00    // bit e6
111 #define cGating_36               0x40    // bit e6
112
113 #define cAgcOutON                0x80    // bit e7
114 #define cAgcOutOFF               0x00    // bit e7
115
116 /* ---------------------------------------------------------------------- */
117
118 static struct tvnorm tvnorms[] = {
119         {
120                 .std   = V4L2_STD_PAL_BG | V4L2_STD_PAL_H | V4L2_STD_PAL_N,
121                 .name  = "PAL-BGHN",
122                 .b     = ( cNegativeFmTV  |
123                            cQSS           ),
124                 .c     = ( cDeemphasisON  |
125                            cDeemphasis50  |
126                            cTopPalSecamDefault),
127                 .e     = ( cGating_36     |
128                            cAudioIF_5_5   |
129                            cVideoIF_38_90 ),
130         },{
131                 .std   = V4L2_STD_PAL_I,
132                 .name  = "PAL-I",
133                 .b     = ( cNegativeFmTV  |
134                            cQSS           ),
135                 .c     = ( cDeemphasisON  |
136                            cDeemphasis50  |
137                            cTopPalSecamDefault),
138                 .e     = ( cGating_36     |
139                            cAudioIF_6_0   |
140                            cVideoIF_38_90 ),
141         },{
142                 .std   = V4L2_STD_PAL_DK,
143                 .name  = "PAL-DK",
144                 .b     = ( cNegativeFmTV  |
145                            cQSS           ),
146                 .c     = ( cDeemphasisON  |
147                            cDeemphasis50  |
148                            cTopPalSecamDefault),
149                 .e     = ( cGating_36     |
150                            cAudioIF_6_5   |
151                            cVideoIF_38_90 ),
152         },{
153                 .std   = V4L2_STD_PAL_M | V4L2_STD_PAL_Nc,
154                 .name  = "PAL-M/Nc",
155                 .b     = ( cNegativeFmTV  |
156                            cQSS           ),
157                 .c     = ( cDeemphasisON  |
158                            cDeemphasis75  |
159                            cTopNtscRadioDefault),
160                 .e     = ( cGating_36     |
161                            cAudioIF_4_5   |
162                            cVideoIF_45_75 ),
163         },{
164                 .std   = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H,
165                 .name  = "SECAM-BGH",
166                 .b     = ( cPositiveAmTV  |
167                            cQSS           ),
168                 .c     = ( cTopPalSecamDefault),
169                 .e     = ( cGating_36     |
170                            cAudioIF_5_5   |
171                            cVideoIF_38_90 ),
172         },{
173                 .std   = V4L2_STD_SECAM_L,
174                 .name  = "SECAM-L",
175                 .b     = ( cPositiveAmTV  |
176                            cQSS           ),
177                 .c     = ( cTopPalSecamDefault),
178                 .e     = ( cGating_36     |
179                            cAudioIF_6_5   |
180                            cVideoIF_38_90 ),
181         },{
182                 .std   = V4L2_STD_SECAM_LC,
183                 .name  = "SECAM-L'",
184                 .b     = ( cOutputPort2Inactive |
185                            cPositiveAmTV  |
186                            cQSS           ),
187                 .c     = ( cTopPalSecamDefault),
188                 .e     = ( cGating_36     |
189                            cAudioIF_6_5   |
190                            cVideoIF_33_90 ),
191         },{
192                 .std   = V4L2_STD_SECAM_DK,
193                 .name  = "SECAM-DK",
194                 .b     = ( cNegativeFmTV  |
195                            cQSS           ),
196                 .c     = ( cDeemphasisON  |
197                            cDeemphasis50  |
198                            cTopPalSecamDefault),
199                 .e     = ( cGating_36     |
200                            cAudioIF_6_5   |
201                            cVideoIF_38_90 ),
202         },{
203                 .std   = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
204                 .name  = "NTSC-M",
205                 .b     = ( cNegativeFmTV  |
206                            cQSS           ),
207                 .c     = ( cDeemphasisON  |
208                            cDeemphasis75  |
209                            cTopNtscRadioDefault),
210                 .e     = ( cGating_36     |
211                            cAudioIF_4_5   |
212                            cVideoIF_45_75 ),
213         },{
214                 .std   = V4L2_STD_NTSC_M_JP,
215                 .name  = "NTSC-M-JP",
216                 .b     = ( cNegativeFmTV  |
217                            cQSS           ),
218                 .c     = ( cDeemphasisON  |
219                            cDeemphasis50  |
220                            cTopNtscRadioDefault),
221                 .e     = ( cGating_36     |
222                            cAudioIF_4_5   |
223                            cVideoIF_58_75 ),
224         }
225 };
226
227 static struct tvnorm radio_stereo = {
228         .name = "Radio Stereo",
229         .b    = ( cFmRadio       |
230                   cQSS           ),
231         .c    = ( cDeemphasisOFF |
232                   cAudioGain6    |
233                   cTopNtscRadioDefault),
234         .e    = ( cTunerGainLow  |
235                   cAudioIF_5_5   |
236                   cRadioIF_38_90 ),
237 };
238
239 static struct tvnorm radio_mono = {
240         .name = "Radio Mono",
241         .b    = ( cFmRadio       |
242                   cQSS           ),
243         .c    = ( cDeemphasisON  |
244                   cDeemphasis75  |
245                   cTopNtscRadioDefault),
246         .e    = ( cTunerGainLow  |
247                   cAudioIF_5_5   |
248                   cRadioIF_38_90 ),
249 };
250
251 /* ---------------------------------------------------------------------- */
252
253 static void dump_read_message(struct tuner *t, unsigned char *buf)
254 {
255         static char *afc[16] = {
256                 "- 12.5 kHz",
257                 "- 37.5 kHz",
258                 "- 62.5 kHz",
259                 "- 87.5 kHz",
260                 "-112.5 kHz",
261                 "-137.5 kHz",
262                 "-162.5 kHz",
263                 "-187.5 kHz [min]",
264                 "+187.5 kHz [max]",
265                 "+162.5 kHz",
266                 "+137.5 kHz",
267                 "+112.5 kHz",
268                 "+ 87.5 kHz",
269                 "+ 62.5 kHz",
270                 "+ 37.5 kHz",
271                 "+ 12.5 kHz",
272         };
273         tda9887_info("read: 0x%2x\n", buf[0]);
274         tda9887_info("  after power on : %s\n", (buf[0] & 0x01) ? "yes" : "no");
275         tda9887_info("  afc            : %s\n", afc[(buf[0] >> 1) & 0x0f]);
276         tda9887_info("  fmif level     : %s\n", (buf[0] & 0x20) ? "high" : "low");
277         tda9887_info("  afc window     : %s\n", (buf[0] & 0x40) ? "in" : "out");
278         tda9887_info("  vfi level      : %s\n", (buf[0] & 0x80) ? "high" : "low");
279 }
280
281 static void dump_write_message(struct tuner *t, unsigned char *buf)
282 {
283         static char *sound[4] = {
284                 "AM/TV",
285                 "FM/radio",
286                 "FM/TV",
287                 "FM/radio"
288         };
289         static char *adjust[32] = {
290                 "-16", "-15", "-14", "-13", "-12", "-11", "-10", "-9",
291                 "-8",  "-7",  "-6",  "-5",  "-4",  "-3",  "-2",  "-1",
292                 "0",   "+1",  "+2",  "+3",  "+4",  "+5",  "+6",  "+7",
293                 "+8",  "+9",  "+10", "+11", "+12", "+13", "+14", "+15"
294         };
295         static char *deemph[4] = {
296                 "no", "no", "75", "50"
297         };
298         static char *carrier[4] = {
299                 "4.5 MHz",
300                 "5.5 MHz",
301                 "6.0 MHz",
302                 "6.5 MHz / AM"
303         };
304         static char *vif[8] = {
305                 "58.75 MHz",
306                 "45.75 MHz",
307                 "38.9 MHz",
308                 "38.0 MHz",
309                 "33.9 MHz",
310                 "33.4 MHz",
311                 "45.75 MHz + pin13",
312                 "38.9 MHz + pin13",
313         };
314         static char *rif[4] = {
315                 "44 MHz",
316                 "52 MHz",
317                 "52 MHz",
318                 "44 MHz",
319         };
320
321         tda9887_info("write: byte B 0x%02x\n",buf[1]);
322         tda9887_info("  B0   video mode      : %s\n",
323                (buf[1] & 0x01) ? "video trap" : "sound trap");
324         tda9887_info("  B1   auto mute fm    : %s\n",
325                (buf[1] & 0x02) ? "yes" : "no");
326         tda9887_info("  B2   carrier mode    : %s\n",
327                (buf[1] & 0x04) ? "QSS" : "Intercarrier");
328         tda9887_info("  B3-4 tv sound/radio  : %s\n",
329                sound[(buf[1] & 0x18) >> 3]);
330         tda9887_info("  B5   force mute audio: %s\n",
331                (buf[1] & 0x20) ? "yes" : "no");
332         tda9887_info("  B6   output port 1   : %s\n",
333                (buf[1] & 0x40) ? "high (inactive)" : "low (active)");
334         tda9887_info("  B7   output port 2   : %s\n",
335                (buf[1] & 0x80) ? "high (inactive)" : "low (active)");
336
337         tda9887_info("write: byte C 0x%02x\n",buf[2]);
338         tda9887_info("  C0-4 top adjustment  : %s dB\n", adjust[buf[2] & 0x1f]);
339         tda9887_info("  C5-6 de-emphasis     : %s\n", deemph[(buf[2] & 0x60) >> 5]);
340         tda9887_info("  C7   audio gain      : %s\n",
341                (buf[2] & 0x80) ? "-6" : "0");
342
343         tda9887_info("write: byte E 0x%02x\n",buf[3]);
344         tda9887_info("  E0-1 sound carrier   : %s\n",
345                carrier[(buf[3] & 0x03)]);
346         tda9887_info("  E6   l pll gating   : %s\n",
347                (buf[3] & 0x40) ? "36" : "13");
348
349         if (buf[1] & 0x08) {
350                 /* radio */
351                 tda9887_info("  E2-4 video if        : %s\n",
352                        rif[(buf[3] & 0x0c) >> 2]);
353                 tda9887_info("  E7   vif agc output  : %s\n",
354                        (buf[3] & 0x80)
355                        ? ((buf[3] & 0x10) ? "fm-agc radio" : "sif-agc radio")
356                        : "fm radio carrier afc");
357         } else {
358                 /* video */
359                 tda9887_info("  E2-4 video if        : %s\n",
360                        vif[(buf[3] & 0x1c) >> 2]);
361                 tda9887_info("  E5   tuner gain      : %s\n",
362                        (buf[3] & 0x80)
363                        ? ((buf[3] & 0x20) ? "external" : "normal")
364                        : ((buf[3] & 0x20) ? "minimum"  : "normal"));
365                 tda9887_info("  E7   vif agc output  : %s\n",
366                        (buf[3] & 0x80)
367                        ? ((buf[3] & 0x20)
368                           ? "pin3 port, pin22 vif agc out"
369                           : "pin22 port, pin3 vif acg ext in")
370                        : "pin3+pin22 port");
371         }
372         tda9887_info("--\n");
373 }
374
375 /* ---------------------------------------------------------------------- */
376
377 static int tda9887_set_tvnorm(struct tuner *t, char *buf)
378 {
379         struct tvnorm *norm = NULL;
380         int i;
381
382         if (t->mode == V4L2_TUNER_RADIO) {
383                 if (t->audmode == V4L2_TUNER_MODE_MONO)
384                         norm = &radio_mono;
385                 else
386                         norm = &radio_stereo;
387         } else {
388                 for (i = 0; i < ARRAY_SIZE(tvnorms); i++) {
389                         if (tvnorms[i].std & t->std) {
390                                 norm = tvnorms+i;
391                                 break;
392                         }
393                 }
394         }
395         if (NULL == norm) {
396                 tda9887_dbg("Unsupported tvnorm entry - audio muted\n");
397                 return -1;
398         }
399
400         tda9887_dbg("configure for: %s\n",norm->name);
401         buf[1] = norm->b;
402         buf[2] = norm->c;
403         buf[3] = norm->e;
404         return 0;
405 }
406
407 static unsigned int port1  = UNSET;
408 static unsigned int port2  = UNSET;
409 static unsigned int qss    = UNSET;
410 static unsigned int adjust = UNSET;
411
412 module_param(port1, int, 0644);
413 module_param(port2, int, 0644);
414 module_param(qss, int, 0644);
415 module_param(adjust, int, 0644);
416
417 static int tda9887_set_insmod(struct tuner *t, char *buf)
418 {
419         if (UNSET != port1) {
420                 if (port1)
421                         buf[1] |= cOutputPort1Inactive;
422                 else
423                         buf[1] &= ~cOutputPort1Inactive;
424         }
425         if (UNSET != port2) {
426                 if (port2)
427                         buf[1] |= cOutputPort2Inactive;
428                 else
429                         buf[1] &= ~cOutputPort2Inactive;
430         }
431
432         if (UNSET != qss) {
433                 if (qss)
434                         buf[1] |= cQSS;
435                 else
436                         buf[1] &= ~cQSS;
437         }
438
439         if (adjust >= 0x00 && adjust < 0x20) {
440                 buf[2] &= ~cTopMask;
441                 buf[2] |= adjust;
442         }
443         return 0;
444 }
445
446 static int tda9887_set_config(struct tuner *t, char *buf)
447 {
448         if (t->tda9887_config & TDA9887_PORT1_ACTIVE)
449                 buf[1] &= ~cOutputPort1Inactive;
450         if (t->tda9887_config & TDA9887_PORT1_INACTIVE)
451                 buf[1] |= cOutputPort1Inactive;
452         if (t->tda9887_config & TDA9887_PORT2_ACTIVE)
453                 buf[1] &= ~cOutputPort2Inactive;
454         if (t->tda9887_config & TDA9887_PORT2_INACTIVE)
455                 buf[1] |= cOutputPort2Inactive;
456
457         if (t->tda9887_config & TDA9887_QSS)
458                 buf[1] |= cQSS;
459         if (t->tda9887_config & TDA9887_INTERCARRIER)
460                 buf[1] &= ~cQSS;
461
462         if (t->tda9887_config & TDA9887_AUTOMUTE)
463                 buf[1] |= cAutoMuteFmActive;
464         if (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) {
465                 buf[2] &= ~0x60;
466                 switch (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) {
467                 case TDA9887_DEEMPHASIS_NONE:
468                         buf[2] |= cDeemphasisOFF;
469                         break;
470                 case TDA9887_DEEMPHASIS_50:
471                         buf[2] |= cDeemphasisON | cDeemphasis50;
472                         break;
473                 case TDA9887_DEEMPHASIS_75:
474                         buf[2] |= cDeemphasisON | cDeemphasis75;
475                         break;
476                 }
477         }
478         if (t->tda9887_config & TDA9887_TOP_SET) {
479                 buf[2] &= ~cTopMask;
480                 buf[2] |= (t->tda9887_config >> 8) & cTopMask;
481         }
482         if ((t->tda9887_config & TDA9887_INTERCARRIER_NTSC) && (t->std & V4L2_STD_NTSC))
483                 buf[1] &= ~cQSS;
484         return 0;
485 }
486
487 /* ---------------------------------------------------------------------- */
488
489 static int tda9887_status(struct tuner *t)
490 {
491         unsigned char buf[1];
492         int rc;
493
494         memset(buf,0,sizeof(buf));
495         if (1 != (rc = i2c_master_recv(&t->i2c,buf,1)))
496                 tda9887_info("i2c i/o error: rc == %d (should be 1)\n",rc);
497         dump_read_message(t, buf);
498         return 0;
499 }
500
501 static void tda9887_configure(struct i2c_client *client)
502 {
503         struct tuner *t = i2c_get_clientdata(client);
504         int rc;
505
506         memset(t->tda9887_data,0,sizeof(t->tda9887_data));
507         tda9887_set_tvnorm(t,t->tda9887_data);
508
509         /* A note on the port settings:
510            These settings tend to depend on the specifics of the board.
511            By default they are set to inactive (bit value 1) by this driver,
512            overwriting any changes made by the tvnorm. This means that it
513            is the responsibility of the module using the tda9887 to set
514            these values in case of changes in the tvnorm.
515            In many cases port 2 should be made active (0) when selecting
516            SECAM-L, and port 2 should remain inactive (1) for SECAM-L'.
517
518            For the other standards the tda9887 application note says that
519            the ports should be set to active (0), but, again, that may
520            differ depending on the precise hardware configuration.
521          */
522         t->tda9887_data[1] |= cOutputPort1Inactive;
523         t->tda9887_data[1] |= cOutputPort2Inactive;
524
525         tda9887_set_config(t,t->tda9887_data);
526         tda9887_set_insmod(t,t->tda9887_data);
527
528         if (t->mode == T_STANDBY) {
529                 t->tda9887_data[1] |= cForcedMuteAudioON;
530         }
531
532         tda9887_dbg("writing: b=0x%02x c=0x%02x e=0x%02x\n",
533                 t->tda9887_data[1],t->tda9887_data[2],t->tda9887_data[3]);
534         if (tuner_debug > 1)
535                 dump_write_message(t, t->tda9887_data);
536
537         if (4 != (rc = i2c_master_send(&t->i2c,t->tda9887_data,4)))
538                 tda9887_info("i2c i/o error: rc == %d (should be 4)\n",rc);
539
540         if (tuner_debug > 2) {
541                 msleep_interruptible(1000);
542                 tda9887_status(t);
543         }
544 }
545
546 /* ---------------------------------------------------------------------- */
547
548 static void tda9887_tuner_status(struct i2c_client *client)
549 {
550         struct tuner *t = i2c_get_clientdata(client);
551         tda9887_info("Data bytes: b=0x%02x c=0x%02x e=0x%02x\n", t->tda9887_data[1], t->tda9887_data[2], t->tda9887_data[3]);
552 }
553
554 static int tda9887_get_afc(struct i2c_client *client)
555 {
556         struct tuner *t = i2c_get_clientdata(client);
557         static int AFC_BITS_2_kHz[] = {
558                 -12500,  -37500,  -62500,  -97500,
559                 -112500, -137500, -162500, -187500,
560                 187500,  162500,  137500,  112500,
561                 97500 ,  62500,   37500 ,  12500
562         };
563         int afc=0;
564         __u8 reg = 0;
565
566         if (1 == i2c_master_recv(&t->i2c,&reg,1))
567                 afc = AFC_BITS_2_kHz[(reg>>1)&0x0f];
568
569         return afc;
570 }
571
572 static void tda9887_standby(struct i2c_client *client)
573 {
574         tda9887_configure(client);
575 }
576
577 static void tda9887_set_freq(struct i2c_client *client, unsigned int freq)
578 {
579         tda9887_configure(client);
580 }
581
582 int tda9887_tuner_init(struct i2c_client *c)
583 {
584         struct tuner *t = i2c_get_clientdata(c);
585
586         strlcpy(c->name, "tda9887", sizeof(c->name));
587
588         tda9887_info("tda988[5/6/7] found @ 0x%x (%s)\n", t->i2c.addr,
589                                                 t->i2c.driver->driver.name);
590
591         t->set_tv_freq = tda9887_set_freq;
592         t->set_radio_freq = tda9887_set_freq;
593         t->standby = tda9887_standby;
594         t->tuner_status=tda9887_tuner_status;
595         t->get_afc=tda9887_get_afc;
596
597         return 0;
598 }
599
600 /*
601  * Overrides for Emacs so that we follow Linus's tabbing style.
602  * ---------------------------------------------------------------------------
603  * Local variables:
604  * c-basic-offset: 8
605  * End:
606  */