3 * i2c tv tuner chip device driver
4 * core core, i.e. kernel interfaces, registering and so on
7 #include <linux/module.h>
8 #include <linux/moduleparam.h>
9 #include <linux/kernel.h>
10 #include <linux/string.h>
11 #include <linux/timer.h>
12 #include <linux/delay.h>
13 #include <linux/errno.h>
14 #include <linux/slab.h>
15 #include <linux/poll.h>
16 #include <linux/i2c.h>
17 #include <linux/types.h>
18 #include <linux/videodev.h>
19 #include <linux/init.h>
21 #include <media/tuner.h>
22 #include <media/v4l2-common.h>
26 /* standard i2c insmod options */
27 static unsigned short normal_i2c
[] = {
28 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
29 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
30 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
36 /* insmod options used at init time => read/only */
37 static unsigned int addr
= 0;
38 static unsigned int no_autodetect
= 0;
39 static unsigned int show_i2c
= 0;
41 /* insmod options used at runtime => read/write */
44 static unsigned int tv_range
[2] = { 44, 958 };
45 static unsigned int radio_range
[2] = { 65, 108 };
47 static char pal
[] = "--";
48 static char secam
[] = "--";
49 static char ntsc
[] = "-";
52 module_param(addr
, int, 0444);
53 module_param(no_autodetect
, int, 0444);
54 module_param(show_i2c
, int, 0444);
55 module_param_named(debug
,tuner_debug
, int, 0644);
56 module_param_string(pal
, pal
, sizeof(pal
), 0644);
57 module_param_string(secam
, secam
, sizeof(secam
), 0644);
58 module_param_string(ntsc
, ntsc
, sizeof(ntsc
), 0644);
59 module_param_array(tv_range
, int, NULL
, 0644);
60 module_param_array(radio_range
, int, NULL
, 0644);
62 MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
63 MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
64 MODULE_LICENSE("GPL");
66 static struct i2c_driver driver
;
67 static struct i2c_client client_template
;
69 /* ---------------------------------------------------------------------- */
71 /* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
72 static void set_tv_freq(struct i2c_client
*c
, unsigned int freq
)
74 struct tuner
*t
= i2c_get_clientdata(c
);
76 if (t
->type
== UNSET
) {
77 tuner_warn ("tuner type not set\n");
80 if (NULL
== t
->set_tv_freq
) {
81 tuner_warn ("Tuner has no way to set tv freq\n");
84 if (freq
< tv_range
[0] * 16 || freq
> tv_range
[1] * 16) {
85 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
86 freq
/ 16, freq
% 16 * 100 / 16, tv_range
[0],
88 /* V4L2 spec: if the freq is not possible then the closest
89 possible value should be selected */
90 if (freq
< tv_range
[0] * 16)
91 freq
= tv_range
[0] * 16;
93 freq
= tv_range
[1] * 16;
95 t
->set_tv_freq(c
, freq
);
98 static void set_radio_freq(struct i2c_client
*c
, unsigned int freq
)
100 struct tuner
*t
= i2c_get_clientdata(c
);
102 if (t
->type
== UNSET
) {
103 tuner_warn ("tuner type not set\n");
106 if (NULL
== t
->set_radio_freq
) {
107 tuner_warn ("tuner has no way to set radio frequency\n");
110 if (freq
< radio_range
[0] * 16000 || freq
> radio_range
[1] * 16000) {
111 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
112 freq
/ 16000, freq
% 16000 * 100 / 16000,
113 radio_range
[0], radio_range
[1]);
114 /* V4L2 spec: if the freq is not possible then the closest
115 possible value should be selected */
116 if (freq
< radio_range
[0] * 16000)
117 freq
= radio_range
[0] * 16000;
119 freq
= radio_range
[1] * 16000;
122 t
->set_radio_freq(c
, freq
);
125 static void set_freq(struct i2c_client
*c
, unsigned long freq
)
127 struct tuner
*t
= i2c_get_clientdata(c
);
130 case V4L2_TUNER_RADIO
:
131 tuner_dbg("radio freq set to %lu.%02lu\n",
132 freq
/ 16000, freq
% 16000 * 100 / 16000);
133 set_radio_freq(c
, freq
);
134 t
->radio_freq
= freq
;
136 case V4L2_TUNER_ANALOG_TV
:
137 case V4L2_TUNER_DIGITAL_TV
:
138 tuner_dbg("tv freq set to %lu.%02lu\n",
139 freq
/ 16, freq
% 16 * 100 / 16);
140 set_tv_freq(c
, freq
);
146 static void set_type(struct i2c_client
*c
, unsigned int type
,
147 unsigned int new_mode_mask
, unsigned int new_config
,
148 int (*tuner_callback
) (void *dev
, int command
,int arg
))
150 struct tuner
*t
= i2c_get_clientdata(c
);
151 unsigned char buffer
[4];
153 if (type
== UNSET
|| type
== TUNER_ABSENT
) {
154 tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c
->addr
);
158 if (type
>= tuner_count
) {
159 tuner_warn ("tuner 0x%02x: Tuner count greater than %d\n",c
->addr
,tuner_count
);
164 t
->config
= new_config
;
165 if (tuner_callback
!= NULL
) {
166 tuner_dbg("defining GPIO callback\n");
167 t
->tuner_callback
= tuner_callback
;
170 /* This code detects calls by card attach_inform */
171 if (NULL
== t
->i2c
.dev
.driver
) {
172 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c
->addr
);
181 case TUNER_PHILIPS_TDA8290
:
185 if (tea5767_tuner_init(c
) == EINVAL
) {
186 t
->type
= TUNER_ABSENT
;
187 t
->mode_mask
= T_UNINITIALIZED
;
190 t
->mode_mask
= T_RADIO
;
192 case TUNER_PHILIPS_FMD1216ME_MK3
:
197 i2c_master_send(c
, buffer
, 4);
201 i2c_master_send(c
, buffer
, 4);
202 default_tuner_init(c
);
204 case TUNER_PHILIPS_TD1316
:
209 i2c_master_send(c
,buffer
,4);
210 default_tuner_init(c
);
213 tda9887_tuner_init(c
);
216 default_tuner_init(c
);
220 if (t
->mode_mask
== T_UNINITIALIZED
)
221 t
->mode_mask
= new_mode_mask
;
223 set_freq(c
, (V4L2_TUNER_RADIO
== t
->mode
) ? t
->radio_freq
: t
->tv_freq
);
224 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
225 c
->adapter
->name
, c
->driver
->driver
.name
, c
->addr
<< 1, type
,
230 * This function apply tuner config to tuner specified
231 * by tun_setup structure. I addr is unset, then admin status
232 * and tun addr status is more precise then current status,
233 * it's applied. Otherwise status and type are applied only to
234 * tuner with exactly the same addr.
237 static void set_addr(struct i2c_client
*c
, struct tuner_setup
*tun_setup
)
239 struct tuner
*t
= i2c_get_clientdata(c
);
241 tuner_dbg("set addr for type %i\n", t
->type
);
243 if ( (t
->type
== UNSET
&& ((tun_setup
->addr
== ADDR_UNSET
) &&
244 (t
->mode_mask
& tun_setup
->mode_mask
))) ||
245 (tun_setup
->addr
== c
->addr
)) {
246 set_type(c
, tun_setup
->type
, tun_setup
->mode_mask
,
247 tun_setup
->config
, tun_setup
->tuner_callback
);
251 static inline int check_mode(struct tuner
*t
, char *cmd
)
253 if ((1 << t
->mode
& t
->mode_mask
) == 0) {
258 case V4L2_TUNER_RADIO
:
259 tuner_dbg("Cmd %s accepted for radio\n", cmd
);
261 case V4L2_TUNER_ANALOG_TV
:
262 tuner_dbg("Cmd %s accepted for analog TV\n", cmd
);
264 case V4L2_TUNER_DIGITAL_TV
:
265 tuner_dbg("Cmd %s accepted for digital TV\n", cmd
);
271 /* get more precise norm info from insmod option */
272 static int tuner_fixup_std(struct tuner
*t
)
274 if ((t
->std
& V4L2_STD_PAL
) == V4L2_STD_PAL
) {
277 tuner_dbg ("insmod fixup: PAL => PAL-60\n");
278 t
->std
= V4L2_STD_PAL_60
;
284 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
285 t
->std
= V4L2_STD_PAL_BG
;
289 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
290 t
->std
= V4L2_STD_PAL_I
;
296 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
297 t
->std
= V4L2_STD_PAL_DK
;
301 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
302 t
->std
= V4L2_STD_PAL_M
;
306 if (pal
[1] == 'c' || pal
[1] == 'C') {
307 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
308 t
->std
= V4L2_STD_PAL_Nc
;
310 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
311 t
->std
= V4L2_STD_PAL_N
;
315 /* default parameter, do nothing */
318 tuner_warn ("pal= argument not recognised\n");
322 if ((t
->std
& V4L2_STD_SECAM
) == V4L2_STD_SECAM
) {
330 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
331 t
->std
= V4L2_STD_SECAM_B
| V4L2_STD_SECAM_G
| V4L2_STD_SECAM_H
;
337 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
338 t
->std
= V4L2_STD_SECAM_DK
;
342 if ((secam
[1]=='C')||(secam
[1]=='c')) {
343 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
344 t
->std
= V4L2_STD_SECAM_LC
;
346 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
347 t
->std
= V4L2_STD_SECAM_L
;
351 /* default parameter, do nothing */
354 tuner_warn ("secam= argument not recognised\n");
359 if ((t
->std
& V4L2_STD_NTSC
) == V4L2_STD_NTSC
) {
363 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
364 t
->std
= V4L2_STD_NTSC_M
;
368 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
369 t
->std
= V4L2_STD_NTSC_M_JP
;
373 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
374 t
->std
= V4L2_STD_NTSC_M_KR
;
377 /* default parameter, do nothing */
380 tuner_info("ntsc= argument not recognised\n");
387 static void tuner_status(struct i2c_client
*client
)
389 struct tuner
*t
= i2c_get_clientdata(client
);
390 unsigned long freq
, freq_fraction
;
394 case V4L2_TUNER_RADIO
: p
= "radio"; break;
395 case V4L2_TUNER_ANALOG_TV
: p
= "analog TV"; break;
396 case V4L2_TUNER_DIGITAL_TV
: p
= "digital TV"; break;
397 default: p
= "undefined"; break;
399 if (t
->mode
== V4L2_TUNER_RADIO
) {
400 freq
= t
->radio_freq
/ 16000;
401 freq_fraction
= (t
->radio_freq
% 16000) * 100 / 16000;
403 freq
= t
->tv_freq
/ 16;
404 freq_fraction
= (t
->tv_freq
% 16) * 100 / 16;
406 tuner_info("Tuner mode: %s\n", p
);
407 tuner_info("Frequency: %lu.%02lu MHz\n", freq
, freq_fraction
);
408 tuner_info("Standard: 0x%08lx\n", (unsigned long)t
->std
);
409 if (t
->mode
!= V4L2_TUNER_RADIO
)
412 tuner_info("Signal strength: %d\n", t
->has_signal(client
));
415 tuner_info("Stereo: %s\n", t
->is_stereo(client
) ? "yes" : "no");
419 /* ---------------------------------------------------------------------- */
421 /* static vars: used only in tuner_attach and tuner_probe */
422 static unsigned default_mode_mask
;
424 /* During client attach, set_type is called by adapter's attach_inform callback.
425 set_type must then be completed by tuner_attach.
427 static int tuner_attach(struct i2c_adapter
*adap
, int addr
, int kind
)
431 client_template
.adapter
= adap
;
432 client_template
.addr
= addr
;
434 t
= kzalloc(sizeof(struct tuner
), GFP_KERNEL
);
437 memcpy(&t
->i2c
, &client_template
, sizeof(struct i2c_client
));
438 i2c_set_clientdata(&t
->i2c
, t
);
440 t
->radio_if2
= 10700 * 1000; /* 10.7MHz - FM radio */
441 t
->audmode
= V4L2_TUNER_MODE_STEREO
;
442 t
->mode_mask
= T_UNINITIALIZED
;
443 t
->tuner_status
= tuner_status
;
446 unsigned char buffer
[16];
449 memset(buffer
, 0, sizeof(buffer
));
450 rc
= i2c_master_recv(&t
->i2c
, buffer
, sizeof(buffer
));
451 tuner_info("I2C RECV = ");
453 printk("%02x ",buffer
[i
]);
456 /* HACK: This test were added to avoid tuner to probe tda9840 and tea6415c on the MXB card */
457 if (adap
->id
== I2C_HW_SAA7146
&& addr
< 0x4a)
460 /* autodetection code based on the i2c addr */
461 if (!no_autodetect
) {
467 /* If chip is not tda8290, don't register.
468 since it can be tda9887*/
469 if (tda8290_probe(&t
->i2c
) == 0) {
470 tuner_dbg("chip at addr %x is a tda8290\n", addr
);
472 /* Default is being tda9887 */
473 t
->type
= TUNER_TDA9887
;
474 t
->mode_mask
= T_RADIO
| T_ANALOG_TV
| T_DIGITAL_TV
;
476 goto register_client
;
480 if (tea5767_autodetection(&t
->i2c
) != EINVAL
) {
481 t
->type
= TUNER_TEA5767
;
482 t
->mode_mask
= T_RADIO
;
484 t
->radio_freq
= 87.5 * 16000; /* Sets freq to FM range */
485 default_mode_mask
&= ~T_RADIO
;
487 goto register_client
;
493 /* Initializes only the first adapter found */
494 if (default_mode_mask
!= T_UNINITIALIZED
) {
495 tuner_dbg ("Setting mode_mask to 0x%02x\n", default_mode_mask
);
496 t
->mode_mask
= default_mode_mask
;
497 t
->tv_freq
= 400 * 16; /* Sets freq to VHF High */
498 t
->radio_freq
= 87.5 * 16000; /* Sets freq to FM range */
499 default_mode_mask
= T_UNINITIALIZED
;
502 /* Should be just before return */
504 tuner_info("chip found @ 0x%x (%s)\n", addr
<< 1, adap
->name
);
505 i2c_attach_client (&t
->i2c
);
506 set_type (&t
->i2c
,t
->type
, t
->mode_mask
, t
->config
, t
->tuner_callback
);
510 static int tuner_probe(struct i2c_adapter
*adap
)
513 normal_i2c
[0] = addr
;
514 normal_i2c
[1] = I2C_CLIENT_END
;
517 default_mode_mask
= T_RADIO
| T_ANALOG_TV
| T_DIGITAL_TV
;
519 if (adap
->class & I2C_CLASS_TV_ANALOG
)
520 return i2c_probe(adap
, &addr_data
, tuner_attach
);
524 static int tuner_detach(struct i2c_client
*client
)
526 struct tuner
*t
= i2c_get_clientdata(client
);
529 err
= i2c_detach_client(&t
->i2c
);
532 ("Client deregistration failed, client not detached.\n");
541 * Switch tuner to other mode. If tuner support both tv and radio,
542 * set another frequency to some value (This is needed for some pal
543 * tuners to avoid locking). Otherwise, just put second tuner in
547 static inline int set_mode(struct i2c_client
*client
, struct tuner
*t
, int mode
, char *cmd
)
554 if (check_mode(t
, cmd
) == EINVAL
) {
563 #define switch_v4l2() if (!t->using_v4l2) \
564 tuner_dbg("switching to v4l2\n"); \
567 static inline int check_v4l2(struct tuner
*t
)
569 /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
570 TV, v4l1 for radio), until that is fixed this code is disabled.
571 Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
576 static int tuner_command(struct i2c_client
*client
, unsigned int cmd
, void *arg
)
578 struct tuner
*t
= i2c_get_clientdata(client
);
581 v4l_i2c_print_ioctl(&(t
->i2c
),cmd
);
584 /* --- configuration --- */
585 case TUNER_SET_TYPE_ADDR
:
586 tuner_dbg ("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
587 ((struct tuner_setup
*)arg
)->type
,
588 ((struct tuner_setup
*)arg
)->addr
,
589 ((struct tuner_setup
*)arg
)->mode_mask
,
590 ((struct tuner_setup
*)arg
)->config
);
592 set_addr(client
, (struct tuner_setup
*)arg
);
595 if (set_mode(client
, t
, V4L2_TUNER_RADIO
, "AUDC_SET_RADIO")
599 set_freq(client
, t
->radio_freq
);
601 case TUNER_SET_STANDBY
:
602 if (check_mode(t
, "TUNER_SET_STANDBY") == EINVAL
)
608 #ifdef CONFIG_VIDEO_V4L1
610 if (check_mode(t
, "VIDIOCSAUDIO") == EINVAL
)
612 if (check_v4l2(t
) == EINVAL
)
615 /* Should be implemented, since bttv calls it */
616 tuner_dbg("VIDIOCSAUDIO not implemented.\n");
620 static const v4l2_std_id map
[] = {
621 [VIDEO_MODE_PAL
] = V4L2_STD_PAL
,
622 [VIDEO_MODE_NTSC
] = V4L2_STD_NTSC_M
,
623 [VIDEO_MODE_SECAM
] = V4L2_STD_SECAM
,
624 [4 /* bttv */ ] = V4L2_STD_PAL_M
,
625 [5 /* bttv */ ] = V4L2_STD_PAL_N
,
626 [6 /* bttv */ ] = V4L2_STD_NTSC_M_JP
,
628 struct video_channel
*vc
= arg
;
630 if (check_v4l2(t
) == EINVAL
)
633 if (set_mode(client
,t
,V4L2_TUNER_ANALOG_TV
, "VIDIOCSCHAN")==EINVAL
)
636 if (vc
->norm
< ARRAY_SIZE(map
))
637 t
->std
= map
[vc
->norm
];
640 set_tv_freq(client
, t
->tv_freq
);
645 unsigned long *v
= arg
;
647 if (check_mode(t
, "VIDIOCSFREQ") == EINVAL
)
649 if (check_v4l2(t
) == EINVAL
)
652 set_freq(client
, *v
);
657 struct video_tuner
*vt
= arg
;
659 if (check_mode(t
, "VIDIOCGTUNER") == EINVAL
)
661 if (check_v4l2(t
) == EINVAL
)
664 if (V4L2_TUNER_RADIO
== t
->mode
) {
666 vt
->signal
= t
->has_signal(client
);
668 if (t
->is_stereo(client
))
670 VIDEO_TUNER_STEREO_ON
;
673 ~VIDEO_TUNER_STEREO_ON
;
675 vt
->flags
|= VIDEO_TUNER_LOW
; /* Allow freqs at 62.5 Hz */
677 vt
->rangelow
= radio_range
[0] * 16000;
678 vt
->rangehigh
= radio_range
[1] * 16000;
681 vt
->rangelow
= tv_range
[0] * 16;
682 vt
->rangehigh
= tv_range
[1] * 16;
689 struct video_audio
*va
= arg
;
691 if (check_mode(t
, "VIDIOCGAUDIO") == EINVAL
)
693 if (check_v4l2(t
) == EINVAL
)
696 if (V4L2_TUNER_RADIO
== t
->mode
&& t
->is_stereo
)
697 va
->mode
= t
->is_stereo(client
)
698 ? VIDEO_SOUND_STEREO
: VIDEO_SOUND_MONO
;
702 case TDA9887_SET_CONFIG
:
703 if (t
->type
== TUNER_TDA9887
) {
706 t
->tda9887_config
= *i
;
707 set_freq(client
, t
->tv_freq
);
710 /* --- v4l ioctls --- */
711 /* take care: bttv does userspace copying, we'll get a
712 kernel pointer here... */
715 v4l2_std_id
*id
= arg
;
717 if (set_mode (client
, t
, V4L2_TUNER_ANALOG_TV
, "VIDIOC_S_STD")
726 set_freq(client
, t
->tv_freq
);
729 case VIDIOC_S_FREQUENCY
:
731 struct v4l2_frequency
*f
= arg
;
733 if (set_mode (client
, t
, f
->type
, "VIDIOC_S_FREQUENCY")
737 set_freq(client
,f
->frequency
);
741 case VIDIOC_G_FREQUENCY
:
743 struct v4l2_frequency
*f
= arg
;
745 if (check_mode(t
, "VIDIOC_G_FREQUENCY") == EINVAL
)
749 f
->frequency
= (V4L2_TUNER_RADIO
== t
->mode
) ?
750 t
->radio_freq
: t
->tv_freq
;
755 struct v4l2_tuner
*tuner
= arg
;
757 if (check_mode(t
, "VIDIOC_G_TUNER") == EINVAL
)
761 tuner
->type
= t
->mode
;
763 tuner
->afc
=t
->get_afc(client
);
764 if (t
->mode
== V4L2_TUNER_ANALOG_TV
)
765 tuner
->capability
|= V4L2_TUNER_CAP_NORM
;
766 if (t
->mode
!= V4L2_TUNER_RADIO
) {
767 tuner
->rangelow
= tv_range
[0] * 16;
768 tuner
->rangehigh
= tv_range
[1] * 16;
774 tuner
->signal
= t
->has_signal(client
);
777 V4L2_TUNER_SUB_MONO
| V4L2_TUNER_SUB_STEREO
;
779 tuner
->rxsubchans
= t
->is_stereo(client
) ?
780 V4L2_TUNER_SUB_STEREO
: V4L2_TUNER_SUB_MONO
;
784 V4L2_TUNER_CAP_LOW
| V4L2_TUNER_CAP_STEREO
;
785 tuner
->audmode
= t
->audmode
;
786 tuner
->rangelow
= radio_range
[0] * 16000;
787 tuner
->rangehigh
= radio_range
[1] * 16000;
792 struct v4l2_tuner
*tuner
= arg
;
794 if (check_mode(t
, "VIDIOC_S_TUNER") == EINVAL
)
799 /* do nothing unless we're a radio tuner */
800 if (t
->mode
!= V4L2_TUNER_RADIO
)
802 t
->audmode
= tuner
->audmode
;
803 set_radio_freq(client
, t
->radio_freq
);
806 case VIDIOC_LOG_STATUS
:
808 t
->tuner_status(client
);
815 static int tuner_suspend(struct i2c_client
*c
, pm_message_t state
)
817 struct tuner
*t
= i2c_get_clientdata (c
);
819 tuner_dbg ("suspend\n");
820 /* FIXME: power down ??? */
824 static int tuner_resume(struct i2c_client
*c
)
826 struct tuner
*t
= i2c_get_clientdata (c
);
828 tuner_dbg ("resume\n");
829 if (V4L2_TUNER_RADIO
== t
->mode
) {
831 set_freq(c
, t
->radio_freq
);
834 set_freq(c
, t
->tv_freq
);
839 /* ----------------------------------------------------------------------- */
841 static struct i2c_driver driver
= {
842 .id
= I2C_DRIVERID_TUNER
,
843 .attach_adapter
= tuner_probe
,
844 .detach_client
= tuner_detach
,
845 .command
= tuner_command
,
846 .suspend
= tuner_suspend
,
847 .resume
= tuner_resume
,
852 static struct i2c_client client_template
= {
853 .name
= "(tuner unset)",
857 static int __init
tuner_init_module(void)
859 return i2c_add_driver(&driver
);
862 static void __exit
tuner_cleanup_module(void)
864 i2c_del_driver(&driver
);
867 module_init(tuner_init_module
);
868 module_exit(tuner_cleanup_module
);
871 * Overrides for Emacs so that we follow Linus's tabbing style.
872 * ---------------------------------------------------------------------------