1 #include <linux/module.h>
2 #include <linux/moduleparam.h>
3 #include <linux/kernel.h>
5 #include <linux/types.h>
6 #include <linux/init.h>
7 #include <linux/errno.h>
8 #include <linux/slab.h>
9 #include <linux/delay.h>
10 #include <linux/videodev.h>
11 #include <media/v4l2-common.h>
12 #include <media/tuner.h>
13 #include "tuner-driver.h"
18 TDA9886 (PAL, SECAM, NTSC)
19 TDA9887 (PAL, SECAM, NTSC, FM Radio)
21 Used as part of several tuners
24 #define tda9887_info(fmt, arg...) do {\
25 printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.name, \
26 i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0)
27 #define tda9887_dbg(fmt, arg...) do {\
29 printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.name, \
30 i2c_adapter_id(t->i2c.adapter), t->i2c.addr , ##arg); } while (0)
33 unsigned char data[4];
36 /* ---------------------------------------------------------------------- */
48 /* ---------------------------------------------------------------------- */
55 #define cVideoTrapBypassOFF 0x00 // bit b0
56 #define cVideoTrapBypassON 0x01 // bit b0
58 #define cAutoMuteFmInactive 0x00 // bit b1
59 #define cAutoMuteFmActive 0x02 // bit b1
61 #define cIntercarrier 0x00 // bit b2
62 #define cQSS 0x04 // bit b2
64 #define cPositiveAmTV 0x00 // bit b3:4
65 #define cFmRadio 0x08 // bit b3:4
66 #define cNegativeFmTV 0x10 // bit b3:4
69 #define cForcedMuteAudioON 0x20 // bit b5
70 #define cForcedMuteAudioOFF 0x00 // bit b5
72 #define cOutputPort1Active 0x00 // bit b6
73 #define cOutputPort1Inactive 0x40 // bit b6
75 #define cOutputPort2Active 0x00 // bit b7
76 #define cOutputPort2Inactive 0x80 // bit b7
80 #define cDeemphasisOFF 0x00 // bit c5
81 #define cDeemphasisON 0x20 // bit c5
83 #define cDeemphasis75 0x00 // bit c6
84 #define cDeemphasis50 0x40 // bit c6
86 #define cAudioGain0 0x00 // bit c7
87 #define cAudioGain6 0x80 // bit c7
89 #define cTopMask 0x1f // bit c0:4
90 #define cTopDefault 0x10 // bit c0:4
93 #define cAudioIF_4_5 0x00 // bit e0:1
94 #define cAudioIF_5_5 0x01 // bit e0:1
95 #define cAudioIF_6_0 0x02 // bit e0:1
96 #define cAudioIF_6_5 0x03 // bit e0:1
99 #define cVideoIFMask 0x1c // bit e2:4
100 /* Video IF selection in TV Mode (bit B3=0) */
101 #define cVideoIF_58_75 0x00 // bit e2:4
102 #define cVideoIF_45_75 0x04 // bit e2:4
103 #define cVideoIF_38_90 0x08 // bit e2:4
104 #define cVideoIF_38_00 0x0C // bit e2:4
105 #define cVideoIF_33_90 0x10 // bit e2:4
106 #define cVideoIF_33_40 0x14 // bit e2:4
107 #define cRadioIF_45_75 0x18 // bit e2:4
108 #define cRadioIF_38_90 0x1C // bit e2:4
110 /* IF1 selection in Radio Mode (bit B3=1) */
111 #define cRadioIF_33_30 0x00 // bit e2,4 (also 0x10,0x14)
112 #define cRadioIF_41_30 0x04 // bit e2,4
114 /* Output of AFC pin in radio mode when bit E7=1 */
115 #define cRadioAGC_SIF 0x00 // bit e3
116 #define cRadioAGC_FM 0x08 // bit e3
118 #define cTunerGainNormal 0x00 // bit e5
119 #define cTunerGainLow 0x20 // bit e5
121 #define cGating_18 0x00 // bit e6
122 #define cGating_36 0x40 // bit e6
124 #define cAgcOutON 0x80 // bit e7
125 #define cAgcOutOFF 0x00 // bit e7
127 /* ---------------------------------------------------------------------- */
129 static struct tvnorm tvnorms[] = {
131 .std = V4L2_STD_PAL_BG | V4L2_STD_PAL_H | V4L2_STD_PAL_N,
133 .b = ( cNegativeFmTV |
135 .c = ( cDeemphasisON |
142 .std = V4L2_STD_PAL_I,
144 .b = ( cNegativeFmTV |
146 .c = ( cDeemphasisON |
153 .std = V4L2_STD_PAL_DK,
155 .b = ( cNegativeFmTV |
157 .c = ( cDeemphasisON |
164 .std = V4L2_STD_PAL_M | V4L2_STD_PAL_Nc,
166 .b = ( cNegativeFmTV |
168 .c = ( cDeemphasisON |
175 .std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H,
177 .b = ( cPositiveAmTV |
184 .std = V4L2_STD_SECAM_L,
186 .b = ( cPositiveAmTV |
193 .std = V4L2_STD_SECAM_LC,
195 .b = ( cOutputPort2Inactive |
203 .std = V4L2_STD_SECAM_DK,
205 .b = ( cNegativeFmTV |
207 .c = ( cDeemphasisON |
214 .std = V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_KR,
216 .b = ( cNegativeFmTV |
218 .c = ( cDeemphasisON |
225 .std = V4L2_STD_NTSC_M_JP,
227 .b = ( cNegativeFmTV |
229 .c = ( cDeemphasisON |
238 static struct tvnorm radio_stereo = {
239 .name = "Radio Stereo",
242 .c = ( cDeemphasisOFF |
245 .e = ( cTunerGainLow |
250 static struct tvnorm radio_mono = {
251 .name = "Radio Mono",
254 .c = ( cDeemphasisON |
257 .e = ( cTunerGainLow |
262 /* ---------------------------------------------------------------------- */
264 static void dump_read_message(struct tuner *t, unsigned char *buf)
266 static char *afc[16] = {
284 tda9887_info("read: 0x%2x\n", buf[0]);
285 tda9887_info(" after power on : %s\n", (buf[0] & 0x01) ? "yes" : "no");
286 tda9887_info(" afc : %s\n", afc[(buf[0] >> 1) & 0x0f]);
287 tda9887_info(" fmif level : %s\n", (buf[0] & 0x20) ? "high" : "low");
288 tda9887_info(" afc window : %s\n", (buf[0] & 0x40) ? "in" : "out");
289 tda9887_info(" vfi level : %s\n", (buf[0] & 0x80) ? "high" : "low");
292 static void dump_write_message(struct tuner *t, unsigned char *buf)
294 static char *sound[4] = {
300 static char *adjust[32] = {
301 "-16", "-15", "-14", "-13", "-12", "-11", "-10", "-9",
302 "-8", "-7", "-6", "-5", "-4", "-3", "-2", "-1",
303 "0", "+1", "+2", "+3", "+4", "+5", "+6", "+7",
304 "+8", "+9", "+10", "+11", "+12", "+13", "+14", "+15"
306 static char *deemph[4] = {
307 "no", "no", "75", "50"
309 static char *carrier[4] = {
315 static char *vif[8] = {
325 static char *rif[4] = {
332 tda9887_info("write: byte B 0x%02x\n",buf[1]);
333 tda9887_info(" B0 video mode : %s\n",
334 (buf[1] & 0x01) ? "video trap" : "sound trap");
335 tda9887_info(" B1 auto mute fm : %s\n",
336 (buf[1] & 0x02) ? "yes" : "no");
337 tda9887_info(" B2 carrier mode : %s\n",
338 (buf[1] & 0x04) ? "QSS" : "Intercarrier");
339 tda9887_info(" B3-4 tv sound/radio : %s\n",
340 sound[(buf[1] & 0x18) >> 3]);
341 tda9887_info(" B5 force mute audio: %s\n",
342 (buf[1] & 0x20) ? "yes" : "no");
343 tda9887_info(" B6 output port 1 : %s\n",
344 (buf[1] & 0x40) ? "high (inactive)" : "low (active)");
345 tda9887_info(" B7 output port 2 : %s\n",
346 (buf[1] & 0x80) ? "high (inactive)" : "low (active)");
348 tda9887_info("write: byte C 0x%02x\n",buf[2]);
349 tda9887_info(" C0-4 top adjustment : %s dB\n", adjust[buf[2] & 0x1f]);
350 tda9887_info(" C5-6 de-emphasis : %s\n", deemph[(buf[2] & 0x60) >> 5]);
351 tda9887_info(" C7 audio gain : %s\n",
352 (buf[2] & 0x80) ? "-6" : "0");
354 tda9887_info("write: byte E 0x%02x\n",buf[3]);
355 tda9887_info(" E0-1 sound carrier : %s\n",
356 carrier[(buf[3] & 0x03)]);
357 tda9887_info(" E6 l pll gating : %s\n",
358 (buf[3] & 0x40) ? "36" : "13");
362 tda9887_info(" E2-4 video if : %s\n",
363 rif[(buf[3] & 0x0c) >> 2]);
364 tda9887_info(" E7 vif agc output : %s\n",
366 ? ((buf[3] & 0x10) ? "fm-agc radio" : "sif-agc radio")
367 : "fm radio carrier afc");
370 tda9887_info(" E2-4 video if : %s\n",
371 vif[(buf[3] & 0x1c) >> 2]);
372 tda9887_info(" E5 tuner gain : %s\n",
374 ? ((buf[3] & 0x20) ? "external" : "normal")
375 : ((buf[3] & 0x20) ? "minimum" : "normal"));
376 tda9887_info(" E7 vif agc output : %s\n",
379 ? "pin3 port, pin22 vif agc out"
380 : "pin22 port, pin3 vif acg ext in")
381 : "pin3+pin22 port");
383 tda9887_info("--\n");
386 /* ---------------------------------------------------------------------- */
388 static int tda9887_set_tvnorm(struct tuner *t, char *buf)
390 struct tvnorm *norm = NULL;
393 if (t->mode == V4L2_TUNER_RADIO) {
394 if (t->audmode == V4L2_TUNER_MODE_MONO)
397 norm = &radio_stereo;
399 for (i = 0; i < ARRAY_SIZE(tvnorms); i++) {
400 if (tvnorms[i].std & t->std) {
407 tda9887_dbg("Unsupported tvnorm entry - audio muted\n");
411 tda9887_dbg("configure for: %s\n",norm->name);
418 static unsigned int port1 = UNSET;
419 static unsigned int port2 = UNSET;
420 static unsigned int qss = UNSET;
421 static unsigned int adjust = UNSET;
423 module_param(port1, int, 0644);
424 module_param(port2, int, 0644);
425 module_param(qss, int, 0644);
426 module_param(adjust, int, 0644);
428 static int tda9887_set_insmod(struct tuner *t, char *buf)
430 if (UNSET != port1) {
432 buf[1] |= cOutputPort1Inactive;
434 buf[1] &= ~cOutputPort1Inactive;
436 if (UNSET != port2) {
438 buf[1] |= cOutputPort2Inactive;
440 buf[1] &= ~cOutputPort2Inactive;
450 if (adjust >= 0x00 && adjust < 0x20) {
457 static int tda9887_set_config(struct tuner *t, char *buf)
459 if (t->tda9887_config & TDA9887_PORT1_ACTIVE)
460 buf[1] &= ~cOutputPort1Inactive;
461 if (t->tda9887_config & TDA9887_PORT1_INACTIVE)
462 buf[1] |= cOutputPort1Inactive;
463 if (t->tda9887_config & TDA9887_PORT2_ACTIVE)
464 buf[1] &= ~cOutputPort2Inactive;
465 if (t->tda9887_config & TDA9887_PORT2_INACTIVE)
466 buf[1] |= cOutputPort2Inactive;
468 if (t->tda9887_config & TDA9887_QSS)
470 if (t->tda9887_config & TDA9887_INTERCARRIER)
473 if (t->tda9887_config & TDA9887_AUTOMUTE)
474 buf[1] |= cAutoMuteFmActive;
475 if (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) {
477 switch (t->tda9887_config & TDA9887_DEEMPHASIS_MASK) {
478 case TDA9887_DEEMPHASIS_NONE:
479 buf[2] |= cDeemphasisOFF;
481 case TDA9887_DEEMPHASIS_50:
482 buf[2] |= cDeemphasisON | cDeemphasis50;
484 case TDA9887_DEEMPHASIS_75:
485 buf[2] |= cDeemphasisON | cDeemphasis75;
489 if (t->tda9887_config & TDA9887_TOP_SET) {
491 buf[2] |= (t->tda9887_config >> 8) & cTopMask;
493 if ((t->tda9887_config & TDA9887_INTERCARRIER_NTSC) && (t->std & V4L2_STD_NTSC))
495 if (t->tda9887_config & TDA9887_GATING_18)
496 buf[3] &= ~cGating_36;
498 if (t->mode == V4L2_TUNER_RADIO) {
499 if (t->tda9887_config & TDA9887_RIF_41_3) {
500 buf[3] &= ~cVideoIFMask;
501 buf[3] |= cRadioIF_41_30;
503 if (t->tda9887_config & TDA9887_GAIN_NORMAL)
504 buf[3] &= ~cTunerGainLow;
510 /* ---------------------------------------------------------------------- */
512 static int tda9887_status(struct tuner *t)
514 unsigned char buf[1];
517 memset(buf,0,sizeof(buf));
518 if (1 != (rc = i2c_master_recv(&t->i2c,buf,1)))
519 tda9887_info("i2c i/o error: rc == %d (should be 1)\n",rc);
520 dump_read_message(t, buf);
524 static void tda9887_configure(struct i2c_client *client)
526 struct tuner *t = i2c_get_clientdata(client);
527 struct tda9887_priv *priv = t->priv;
530 memset(priv->data,0,sizeof(priv->data));
531 tda9887_set_tvnorm(t,priv->data);
533 /* A note on the port settings:
534 These settings tend to depend on the specifics of the board.
535 By default they are set to inactive (bit value 1) by this driver,
536 overwriting any changes made by the tvnorm. This means that it
537 is the responsibility of the module using the tda9887 to set
538 these values in case of changes in the tvnorm.
539 In many cases port 2 should be made active (0) when selecting
540 SECAM-L, and port 2 should remain inactive (1) for SECAM-L'.
542 For the other standards the tda9887 application note says that
543 the ports should be set to active (0), but, again, that may
544 differ depending on the precise hardware configuration.
546 priv->data[1] |= cOutputPort1Inactive;
547 priv->data[1] |= cOutputPort2Inactive;
549 tda9887_set_config(t,priv->data);
550 tda9887_set_insmod(t,priv->data);
552 if (t->mode == T_STANDBY) {
553 priv->data[1] |= cForcedMuteAudioON;
556 tda9887_dbg("writing: b=0x%02x c=0x%02x e=0x%02x\n",
557 priv->data[1],priv->data[2],priv->data[3]);
559 dump_write_message(t, priv->data);
561 if (4 != (rc = i2c_master_send(&t->i2c,priv->data,4)))
562 tda9887_info("i2c i/o error: rc == %d (should be 4)\n",rc);
564 if (tuner_debug > 2) {
565 msleep_interruptible(1000);
570 /* ---------------------------------------------------------------------- */
572 static void tda9887_tuner_status(struct i2c_client *client)
574 struct tuner *t = i2c_get_clientdata(client);
575 struct tda9887_priv *priv = t->priv;
576 tda9887_info("Data bytes: b=0x%02x c=0x%02x e=0x%02x\n", priv->data[1], priv->data[2], priv->data[3]);
579 static int tda9887_get_afc(struct i2c_client *client)
581 struct tuner *t = i2c_get_clientdata(client);
582 static int AFC_BITS_2_kHz[] = {
583 -12500, -37500, -62500, -97500,
584 -112500, -137500, -162500, -187500,
585 187500, 162500, 137500, 112500,
586 97500 , 62500, 37500 , 12500
591 if (1 == i2c_master_recv(&t->i2c,®,1))
592 afc = AFC_BITS_2_kHz[(reg>>1)&0x0f];
597 static void tda9887_standby(struct i2c_client *client)
599 tda9887_configure(client);
602 static void tda9887_set_freq(struct i2c_client *client, unsigned int freq)
604 tda9887_configure(client);
607 static void tda9887_release(struct i2c_client *c)
609 struct tuner *t = i2c_get_clientdata(c);
615 static struct tuner_operations tda9887_tuner_ops = {
616 .set_tv_freq = tda9887_set_freq,
617 .set_radio_freq = tda9887_set_freq,
618 .standby = tda9887_standby,
619 .tuner_status = tda9887_tuner_status,
620 .get_afc = tda9887_get_afc,
621 .release = tda9887_release,
624 int tda9887_tuner_init(struct i2c_client *c)
626 struct tda9887_priv *priv = NULL;
627 struct tuner *t = i2c_get_clientdata(c);
629 priv = kzalloc(sizeof(struct tda9887_priv), GFP_KERNEL);
634 strlcpy(c->name, "tda9887", sizeof(c->name));
636 tda9887_info("tda988[5/6/7] found @ 0x%x (%s)\n", t->i2c.addr,
637 t->i2c.driver->driver.name);
639 memcpy(&t->ops, &tda9887_tuner_ops, sizeof(struct tuner_operations));
645 * Overrides for Emacs so that we follow Linus's tabbing style.
646 * ---------------------------------------------------------------------------