1 #include <linux/module.h>
2 #include <linux/kernel.h>
4 #include <linux/types.h>
5 #include <linux/init.h>
6 #include <linux/errno.h>
7 #include <linux/slab.h>
8 #include <linux/delay.h>
9 #include <linux/videodev.h>
10 #include <media/v4l2-common.h>
11 #include <media/tuner.h>
12 #include "tuner-i2c.h"
18 TDA9886 (PAL, SECAM, NTSC)
19 TDA9887 (PAL, SECAM, NTSC, FM Radio)
21 Used as part of several tuners
25 module_param(debug, int, 0644);
26 MODULE_PARM_DESC(debug, "enable verbose debug messages");
29 struct tuner_i2c_props i2c_props;
31 unsigned char data[4];
38 /* ---------------------------------------------------------------------- */
50 /* ---------------------------------------------------------------------- */
57 #define cVideoTrapBypassOFF 0x00 // bit b0
58 #define cVideoTrapBypassON 0x01 // bit b0
60 #define cAutoMuteFmInactive 0x00 // bit b1
61 #define cAutoMuteFmActive 0x02 // bit b1
63 #define cIntercarrier 0x00 // bit b2
64 #define cQSS 0x04 // bit b2
66 #define cPositiveAmTV 0x00 // bit b3:4
67 #define cFmRadio 0x08 // bit b3:4
68 #define cNegativeFmTV 0x10 // bit b3:4
71 #define cForcedMuteAudioON 0x20 // bit b5
72 #define cForcedMuteAudioOFF 0x00 // bit b5
74 #define cOutputPort1Active 0x00 // bit b6
75 #define cOutputPort1Inactive 0x40 // bit b6
77 #define cOutputPort2Active 0x00 // bit b7
78 #define cOutputPort2Inactive 0x80 // bit b7
82 #define cDeemphasisOFF 0x00 // bit c5
83 #define cDeemphasisON 0x20 // bit c5
85 #define cDeemphasis75 0x00 // bit c6
86 #define cDeemphasis50 0x40 // bit c6
88 #define cAudioGain0 0x00 // bit c7
89 #define cAudioGain6 0x80 // bit c7
91 #define cTopMask 0x1f // bit c0:4
92 #define cTopDefault 0x10 // bit c0:4
95 #define cAudioIF_4_5 0x00 // bit e0:1
96 #define cAudioIF_5_5 0x01 // bit e0:1
97 #define cAudioIF_6_0 0x02 // bit e0:1
98 #define cAudioIF_6_5 0x03 // bit e0:1
101 #define cVideoIFMask 0x1c // bit e2:4
102 /* Video IF selection in TV Mode (bit B3=0) */
103 #define cVideoIF_58_75 0x00 // bit e2:4
104 #define cVideoIF_45_75 0x04 // bit e2:4
105 #define cVideoIF_38_90 0x08 // bit e2:4
106 #define cVideoIF_38_00 0x0C // bit e2:4
107 #define cVideoIF_33_90 0x10 // bit e2:4
108 #define cVideoIF_33_40 0x14 // bit e2:4
109 #define cRadioIF_45_75 0x18 // bit e2:4
110 #define cRadioIF_38_90 0x1C // bit e2:4
112 /* IF1 selection in Radio Mode (bit B3=1) */
113 #define cRadioIF_33_30 0x00 // bit e2,4 (also 0x10,0x14)
114 #define cRadioIF_41_30 0x04 // bit e2,4
116 /* Output of AFC pin in radio mode when bit E7=1 */
117 #define cRadioAGC_SIF 0x00 // bit e3
118 #define cRadioAGC_FM 0x08 // bit e3
120 #define cTunerGainNormal 0x00 // bit e5
121 #define cTunerGainLow 0x20 // bit e5
123 #define cGating_18 0x00 // bit e6
124 #define cGating_36 0x40 // bit e6
126 #define cAgcOutON 0x80 // bit e7
127 #define cAgcOutOFF 0x00 // bit e7
129 /* ---------------------------------------------------------------------- */
131 static struct tvnorm tvnorms[] = {
133 .std = V4L2_STD_PAL_BG | V4L2_STD_PAL_H | V4L2_STD_PAL_N,
135 .b = ( cNegativeFmTV |
137 .c = ( cDeemphasisON |
144 .std = V4L2_STD_PAL_I,
146 .b = ( cNegativeFmTV |
148 .c = ( cDeemphasisON |
155 .std = V4L2_STD_PAL_DK,
157 .b = ( cNegativeFmTV |
159 .c = ( cDeemphasisON |
166 .std = V4L2_STD_PAL_M | V4L2_STD_PAL_Nc,
168 .b = ( cNegativeFmTV |
170 .c = ( cDeemphasisON |
177 .std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H,
179 .b = ( cPositiveAmTV |
186 .std = V4L2_STD_SECAM_L,
188 .b = ( cPositiveAmTV |
195 .std = V4L2_STD_SECAM_LC,
197 .b = ( cOutputPort2Inactive |
205 .std = V4L2_STD_SECAM_DK,
207 .b = ( cNegativeFmTV |
209 .c = ( cDeemphasisON |
216 .std = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
218 .b = ( cNegativeFmTV |
220 .c = ( cDeemphasisON |
227 .std = V4L2_STD_NTSC_M_JP,
229 .b = ( cNegativeFmTV |
231 .c = ( cDeemphasisON |
240 static struct tvnorm radio_stereo = {
241 .name = "Radio Stereo",
244 .c = ( cDeemphasisOFF |
247 .e = ( cTunerGainLow |
252 static struct tvnorm radio_mono = {
253 .name = "Radio Mono",
256 .c = ( cDeemphasisON |
259 .e = ( cTunerGainLow |
264 /* ---------------------------------------------------------------------- */
266 static void dump_read_message(struct dvb_frontend *fe, unsigned char *buf)
268 struct tda9887_priv *priv = fe->analog_demod_priv;
270 static char *afc[16] = {
288 tuner_info("read: 0x%2x\n", buf[0]);
289 tuner_info(" after power on : %s\n", (buf[0] & 0x01) ? "yes" : "no");
290 tuner_info(" afc : %s\n", afc[(buf[0] >> 1) & 0x0f]);
291 tuner_info(" fmif level : %s\n", (buf[0] & 0x20) ? "high" : "low");
292 tuner_info(" afc window : %s\n", (buf[0] & 0x40) ? "in" : "out");
293 tuner_info(" vfi level : %s\n", (buf[0] & 0x80) ? "high" : "low");
296 static void dump_write_message(struct dvb_frontend *fe, unsigned char *buf)
298 struct tda9887_priv *priv = fe->analog_demod_priv;
300 static char *sound[4] = {
306 static char *adjust[32] = {
307 "-16", "-15", "-14", "-13", "-12", "-11", "-10", "-9",
308 "-8", "-7", "-6", "-5", "-4", "-3", "-2", "-1",
309 "0", "+1", "+2", "+3", "+4", "+5", "+6", "+7",
310 "+8", "+9", "+10", "+11", "+12", "+13", "+14", "+15"
312 static char *deemph[4] = {
313 "no", "no", "75", "50"
315 static char *carrier[4] = {
321 static char *vif[8] = {
331 static char *rif[4] = {
338 tuner_info("write: byte B 0x%02x\n", buf[1]);
339 tuner_info(" B0 video mode : %s\n",
340 (buf[1] & 0x01) ? "video trap" : "sound trap");
341 tuner_info(" B1 auto mute fm : %s\n",
342 (buf[1] & 0x02) ? "yes" : "no");
343 tuner_info(" B2 carrier mode : %s\n",
344 (buf[1] & 0x04) ? "QSS" : "Intercarrier");
345 tuner_info(" B3-4 tv sound/radio : %s\n",
346 sound[(buf[1] & 0x18) >> 3]);
347 tuner_info(" B5 force mute audio: %s\n",
348 (buf[1] & 0x20) ? "yes" : "no");
349 tuner_info(" B6 output port 1 : %s\n",
350 (buf[1] & 0x40) ? "high (inactive)" : "low (active)");
351 tuner_info(" B7 output port 2 : %s\n",
352 (buf[1] & 0x80) ? "high (inactive)" : "low (active)");
354 tuner_info("write: byte C 0x%02x\n", buf[2]);
355 tuner_info(" C0-4 top adjustment : %s dB\n",
356 adjust[buf[2] & 0x1f]);
357 tuner_info(" C5-6 de-emphasis : %s\n",
358 deemph[(buf[2] & 0x60) >> 5]);
359 tuner_info(" C7 audio gain : %s\n",
360 (buf[2] & 0x80) ? "-6" : "0");
362 tuner_info("write: byte E 0x%02x\n", buf[3]);
363 tuner_info(" E0-1 sound carrier : %s\n",
364 carrier[(buf[3] & 0x03)]);
365 tuner_info(" E6 l pll gating : %s\n",
366 (buf[3] & 0x40) ? "36" : "13");
370 tuner_info(" E2-4 video if : %s\n",
371 rif[(buf[3] & 0x0c) >> 2]);
372 tuner_info(" E7 vif agc output : %s\n",
374 ? ((buf[3] & 0x10) ? "fm-agc radio" :
376 : "fm radio carrier afc");
379 tuner_info(" E2-4 video if : %s\n",
380 vif[(buf[3] & 0x1c) >> 2]);
381 tuner_info(" E5 tuner gain : %s\n",
383 ? ((buf[3] & 0x20) ? "external" : "normal")
384 : ((buf[3] & 0x20) ? "minimum" : "normal"));
385 tuner_info(" E7 vif agc output : %s\n",
386 (buf[3] & 0x80) ? ((buf[3] & 0x20)
387 ? "pin3 port, pin22 vif agc out"
388 : "pin22 port, pin3 vif acg ext in")
389 : "pin3+pin22 port");
394 /* ---------------------------------------------------------------------- */
396 static int tda9887_set_tvnorm(struct dvb_frontend *fe)
398 struct tda9887_priv *priv = fe->analog_demod_priv;
399 struct tvnorm *norm = NULL;
400 char *buf = priv->data;
403 if (priv->mode == V4L2_TUNER_RADIO) {
404 if (priv->audmode == V4L2_TUNER_MODE_MONO)
407 norm = &radio_stereo;
409 for (i = 0; i < ARRAY_SIZE(tvnorms); i++) {
410 if (tvnorms[i].std & priv->std) {
417 tuner_dbg("Unsupported tvnorm entry - audio muted\n");
421 tuner_dbg("configure for: %s\n", norm->name);
428 static unsigned int port1 = UNSET;
429 static unsigned int port2 = UNSET;
430 static unsigned int qss = UNSET;
431 static unsigned int adjust = UNSET;
433 module_param(port1, int, 0644);
434 module_param(port2, int, 0644);
435 module_param(qss, int, 0644);
436 module_param(adjust, int, 0644);
438 static int tda9887_set_insmod(struct dvb_frontend *fe)
440 struct tda9887_priv *priv = fe->analog_demod_priv;
441 char *buf = priv->data;
443 if (UNSET != port1) {
445 buf[1] |= cOutputPort1Inactive;
447 buf[1] &= ~cOutputPort1Inactive;
449 if (UNSET != port2) {
451 buf[1] |= cOutputPort2Inactive;
453 buf[1] &= ~cOutputPort2Inactive;
463 if (adjust >= 0x00 && adjust < 0x20) {
470 static int tda9887_do_config(struct dvb_frontend *fe)
472 struct tda9887_priv *priv = fe->analog_demod_priv;
473 char *buf = priv->data;
475 if (priv->config & TDA9887_PORT1_ACTIVE)
476 buf[1] &= ~cOutputPort1Inactive;
477 if (priv->config & TDA9887_PORT1_INACTIVE)
478 buf[1] |= cOutputPort1Inactive;
479 if (priv->config & TDA9887_PORT2_ACTIVE)
480 buf[1] &= ~cOutputPort2Inactive;
481 if (priv->config & TDA9887_PORT2_INACTIVE)
482 buf[1] |= cOutputPort2Inactive;
484 if (priv->config & TDA9887_QSS)
486 if (priv->config & TDA9887_INTERCARRIER)
489 if (priv->config & TDA9887_AUTOMUTE)
490 buf[1] |= cAutoMuteFmActive;
491 if (priv->config & TDA9887_DEEMPHASIS_MASK) {
493 switch (priv->config & TDA9887_DEEMPHASIS_MASK) {
494 case TDA9887_DEEMPHASIS_NONE:
495 buf[2] |= cDeemphasisOFF;
497 case TDA9887_DEEMPHASIS_50:
498 buf[2] |= cDeemphasisON | cDeemphasis50;
500 case TDA9887_DEEMPHASIS_75:
501 buf[2] |= cDeemphasisON | cDeemphasis75;
505 if (priv->config & TDA9887_TOP_SET) {
507 buf[2] |= (priv->config >> 8) & cTopMask;
509 if ((priv->config & TDA9887_INTERCARRIER_NTSC) &&
510 (priv->std & V4L2_STD_NTSC))
512 if (priv->config & TDA9887_GATING_18)
513 buf[3] &= ~cGating_36;
515 if (priv->mode == V4L2_TUNER_RADIO) {
516 if (priv->config & TDA9887_RIF_41_3) {
517 buf[3] &= ~cVideoIFMask;
518 buf[3] |= cRadioIF_41_30;
520 if (priv->config & TDA9887_GAIN_NORMAL)
521 buf[3] &= ~cTunerGainLow;
527 /* ---------------------------------------------------------------------- */
529 static int tda9887_status(struct dvb_frontend *fe)
531 struct tda9887_priv *priv = fe->analog_demod_priv;
532 unsigned char buf[1];
535 memset(buf,0,sizeof(buf));
536 if (1 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props,buf,1)))
537 tuner_info("i2c i/o error: rc == %d (should be 1)\n", rc);
538 dump_read_message(fe, buf);
542 static void tda9887_configure(struct dvb_frontend *fe)
544 struct tda9887_priv *priv = fe->analog_demod_priv;
547 memset(priv->data,0,sizeof(priv->data));
548 tda9887_set_tvnorm(fe);
550 /* A note on the port settings:
551 These settings tend to depend on the specifics of the board.
552 By default they are set to inactive (bit value 1) by this driver,
553 overwriting any changes made by the tvnorm. This means that it
554 is the responsibility of the module using the tda9887 to set
555 these values in case of changes in the tvnorm.
556 In many cases port 2 should be made active (0) when selecting
557 SECAM-L, and port 2 should remain inactive (1) for SECAM-L'.
559 For the other standards the tda9887 application note says that
560 the ports should be set to active (0), but, again, that may
561 differ depending on the precise hardware configuration.
563 priv->data[1] |= cOutputPort1Inactive;
564 priv->data[1] |= cOutputPort2Inactive;
566 tda9887_do_config(fe);
567 tda9887_set_insmod(fe);
569 if (priv->mode == T_STANDBY)
570 priv->data[1] |= cForcedMuteAudioON;
572 tuner_dbg("writing: b=0x%02x c=0x%02x e=0x%02x\n",
573 priv->data[1], priv->data[2], priv->data[3]);
575 dump_write_message(fe, priv->data);
577 if (4 != (rc = tuner_i2c_xfer_send(&priv->i2c_props,priv->data,4)))
578 tuner_info("i2c i/o error: rc == %d (should be 4)\n", rc);
581 msleep_interruptible(1000);
586 /* ---------------------------------------------------------------------- */
588 static void tda9887_tuner_status(struct dvb_frontend *fe)
590 struct tda9887_priv *priv = fe->analog_demod_priv;
591 tuner_info("Data bytes: b=0x%02x c=0x%02x e=0x%02x\n",
592 priv->data[1], priv->data[2], priv->data[3]);
595 static int tda9887_get_afc(struct dvb_frontend *fe)
597 struct tda9887_priv *priv = fe->analog_demod_priv;
598 static int AFC_BITS_2_kHz[] = {
599 -12500, -37500, -62500, -97500,
600 -112500, -137500, -162500, -187500,
601 187500, 162500, 137500, 112500,
602 97500 , 62500, 37500 , 12500
607 if (1 == tuner_i2c_xfer_recv(&priv->i2c_props,®,1))
608 afc = AFC_BITS_2_kHz[(reg>>1)&0x0f];
613 static void tda9887_standby(struct dvb_frontend *fe)
615 struct tda9887_priv *priv = fe->analog_demod_priv;
617 priv->mode = T_STANDBY;
619 tda9887_configure(fe);
622 static void tda9887_set_params(struct dvb_frontend *fe,
623 struct analog_parameters *params)
625 struct tda9887_priv *priv = fe->analog_demod_priv;
627 priv->mode = params->mode;
628 priv->audmode = params->audmode;
629 priv->std = params->std;
630 tda9887_configure(fe);
633 static int tda9887_set_config(struct dvb_frontend *fe, void *priv_cfg)
635 struct tda9887_priv *priv = fe->analog_demod_priv;
637 priv->config = *(unsigned int *)priv_cfg;
638 tda9887_configure(fe);
643 static void tda9887_release(struct dvb_frontend *fe)
645 kfree(fe->analog_demod_priv);
646 fe->analog_demod_priv = NULL;
649 static struct analog_demod_ops tda9887_ops = {
653 .set_params = tda9887_set_params,
654 .standby = tda9887_standby,
655 .tuner_status = tda9887_tuner_status,
656 .get_afc = tda9887_get_afc,
657 .release = tda9887_release,
658 .set_config = tda9887_set_config,
661 struct dvb_frontend *tda9887_attach(struct dvb_frontend *fe,
662 struct i2c_adapter *i2c_adap,
665 struct tda9887_priv *priv = NULL;
667 priv = kzalloc(sizeof(struct tda9887_priv), GFP_KERNEL);
670 fe->analog_demod_priv = priv;
672 priv->i2c_props.addr = i2c_addr;
673 priv->i2c_props.adap = i2c_adap;
674 priv->i2c_props.name = "tda9887";
675 priv->mode = T_STANDBY;
677 tuner_info("tda988[5/6/7] found\n");
679 memcpy(&fe->ops.analog_ops, &tda9887_ops,
680 sizeof(struct analog_demod_ops));
684 EXPORT_SYMBOL_GPL(tda9887_attach);
686 MODULE_LICENSE("GPL");
689 * Overrides for Emacs so that we follow Linus's tabbing style.
690 * ---------------------------------------------------------------------------