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