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>
23 #include "tuner-driver.h"
27 /* standard i2c insmod options */
28 static unsigned short normal_i2c
[] = {
29 #ifdef CONFIG_TUNER_TEA5761
32 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
33 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
34 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
40 /* insmod options used at init time => read/only */
41 static unsigned int addr
= 0;
42 static unsigned int no_autodetect
= 0;
43 static unsigned int show_i2c
= 0;
45 /* insmod options used at runtime => read/write */
48 static unsigned int tv_range
[2] = { 44, 958 };
49 static unsigned int radio_range
[2] = { 65, 108 };
51 static char pal
[] = "--";
52 static char secam
[] = "--";
53 static char ntsc
[] = "-";
56 module_param(addr
, int, 0444);
57 module_param(no_autodetect
, int, 0444);
58 module_param(show_i2c
, int, 0444);
59 module_param_named(debug
,tuner_debug
, int, 0644);
60 module_param_string(pal
, pal
, sizeof(pal
), 0644);
61 module_param_string(secam
, secam
, sizeof(secam
), 0644);
62 module_param_string(ntsc
, ntsc
, sizeof(ntsc
), 0644);
63 module_param_array(tv_range
, int, NULL
, 0644);
64 module_param_array(radio_range
, int, NULL
, 0644);
66 MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
67 MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
68 MODULE_LICENSE("GPL");
70 static struct i2c_driver driver
;
71 static struct i2c_client client_template
;
73 /* ---------------------------------------------------------------------- */
75 /* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
76 static void set_tv_freq(struct i2c_client
*c
, unsigned int freq
)
78 struct tuner
*t
= i2c_get_clientdata(c
);
80 if (t
->type
== UNSET
) {
81 tuner_warn ("tuner type not set\n");
84 if (NULL
== t
->ops
.set_tv_freq
) {
85 tuner_warn ("Tuner has no way to set tv freq\n");
88 if (freq
< tv_range
[0] * 16 || freq
> tv_range
[1] * 16) {
89 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
90 freq
/ 16, freq
% 16 * 100 / 16, tv_range
[0],
92 /* V4L2 spec: if the freq is not possible then the closest
93 possible value should be selected */
94 if (freq
< tv_range
[0] * 16)
95 freq
= tv_range
[0] * 16;
97 freq
= tv_range
[1] * 16;
99 t
->ops
.set_tv_freq(c
, freq
);
102 static void set_radio_freq(struct i2c_client
*c
, unsigned int freq
)
104 struct tuner
*t
= i2c_get_clientdata(c
);
106 if (t
->type
== UNSET
) {
107 tuner_warn ("tuner type not set\n");
110 if (NULL
== t
->ops
.set_radio_freq
) {
111 tuner_warn ("tuner has no way to set radio frequency\n");
114 if (freq
< radio_range
[0] * 16000 || freq
> radio_range
[1] * 16000) {
115 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
116 freq
/ 16000, freq
% 16000 * 100 / 16000,
117 radio_range
[0], radio_range
[1]);
118 /* V4L2 spec: if the freq is not possible then the closest
119 possible value should be selected */
120 if (freq
< radio_range
[0] * 16000)
121 freq
= radio_range
[0] * 16000;
123 freq
= radio_range
[1] * 16000;
126 t
->ops
.set_radio_freq(c
, freq
);
129 static void set_freq(struct i2c_client
*c
, unsigned long freq
)
131 struct tuner
*t
= i2c_get_clientdata(c
);
134 case V4L2_TUNER_RADIO
:
135 tuner_dbg("radio freq set to %lu.%02lu\n",
136 freq
/ 16000, freq
% 16000 * 100 / 16000);
137 set_radio_freq(c
, freq
);
138 t
->radio_freq
= freq
;
140 case V4L2_TUNER_ANALOG_TV
:
141 case V4L2_TUNER_DIGITAL_TV
:
142 tuner_dbg("tv freq set to %lu.%02lu\n",
143 freq
/ 16, freq
% 16 * 100 / 16);
144 set_tv_freq(c
, freq
);
150 static void set_type(struct i2c_client
*c
, unsigned int type
,
151 unsigned int new_mode_mask
, unsigned int new_config
,
152 int (*tuner_callback
) (void *dev
, int command
,int arg
))
154 struct tuner
*t
= i2c_get_clientdata(c
);
155 unsigned char buffer
[4];
157 if (type
== UNSET
|| type
== TUNER_ABSENT
) {
158 tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c
->addr
);
162 if (type
>= tuner_count
) {
163 tuner_warn ("tuner 0x%02x: Tuner count greater than %d\n",c
->addr
,tuner_count
);
168 t
->config
= new_config
;
169 if (tuner_callback
!= NULL
) {
170 tuner_dbg("defining GPIO callback\n");
171 t
->tuner_callback
= tuner_callback
;
174 /* This code detects calls by card attach_inform */
175 if (NULL
== t
->i2c
.dev
.driver
) {
176 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c
->addr
);
181 /* discard private data, in case set_type() was previously called */
193 case TUNER_PHILIPS_TDA8290
:
197 if (tea5767_tuner_init(c
) == EINVAL
) {
198 t
->type
= TUNER_ABSENT
;
199 t
->mode_mask
= T_UNINITIALIZED
;
202 t
->mode_mask
= T_RADIO
;
204 #ifdef CONFIG_TUNER_TEA5761
206 if (tea5761_tuner_init(c
) == EINVAL
) {
207 t
->type
= TUNER_ABSENT
;
208 t
->mode_mask
= T_UNINITIALIZED
;
211 t
->mode_mask
= T_RADIO
;
214 case TUNER_PHILIPS_FMD1216ME_MK3
:
219 i2c_master_send(c
, buffer
, 4);
223 i2c_master_send(c
, buffer
, 4);
224 default_tuner_init(c
);
226 case TUNER_PHILIPS_TD1316
:
231 i2c_master_send(c
,buffer
,4);
232 default_tuner_init(c
);
235 tda9887_tuner_init(c
);
238 default_tuner_init(c
);
242 if (t
->mode_mask
== T_UNINITIALIZED
)
243 t
->mode_mask
= new_mode_mask
;
245 set_freq(c
, (V4L2_TUNER_RADIO
== t
->mode
) ? t
->radio_freq
: t
->tv_freq
);
246 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
247 c
->adapter
->name
, c
->driver
->driver
.name
, c
->addr
<< 1, type
,
252 * This function apply tuner config to tuner specified
253 * by tun_setup structure. I addr is unset, then admin status
254 * and tun addr status is more precise then current status,
255 * it's applied. Otherwise status and type are applied only to
256 * tuner with exactly the same addr.
259 static void set_addr(struct i2c_client
*c
, struct tuner_setup
*tun_setup
)
261 struct tuner
*t
= i2c_get_clientdata(c
);
263 tuner_dbg("set addr for type %i\n", t
->type
);
265 if ( (t
->type
== UNSET
&& ((tun_setup
->addr
== ADDR_UNSET
) &&
266 (t
->mode_mask
& tun_setup
->mode_mask
))) ||
267 (tun_setup
->addr
== c
->addr
)) {
268 set_type(c
, tun_setup
->type
, tun_setup
->mode_mask
,
269 tun_setup
->config
, tun_setup
->tuner_callback
);
273 static inline int check_mode(struct tuner
*t
, char *cmd
)
275 if ((1 << t
->mode
& t
->mode_mask
) == 0) {
280 case V4L2_TUNER_RADIO
:
281 tuner_dbg("Cmd %s accepted for radio\n", cmd
);
283 case V4L2_TUNER_ANALOG_TV
:
284 tuner_dbg("Cmd %s accepted for analog TV\n", cmd
);
286 case V4L2_TUNER_DIGITAL_TV
:
287 tuner_dbg("Cmd %s accepted for digital TV\n", cmd
);
293 /* get more precise norm info from insmod option */
294 static int tuner_fixup_std(struct tuner
*t
)
296 if ((t
->std
& V4L2_STD_PAL
) == V4L2_STD_PAL
) {
299 tuner_dbg ("insmod fixup: PAL => PAL-60\n");
300 t
->std
= V4L2_STD_PAL_60
;
306 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
307 t
->std
= V4L2_STD_PAL_BG
;
311 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
312 t
->std
= V4L2_STD_PAL_I
;
318 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
319 t
->std
= V4L2_STD_PAL_DK
;
323 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
324 t
->std
= V4L2_STD_PAL_M
;
328 if (pal
[1] == 'c' || pal
[1] == 'C') {
329 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
330 t
->std
= V4L2_STD_PAL_Nc
;
332 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
333 t
->std
= V4L2_STD_PAL_N
;
337 /* default parameter, do nothing */
340 tuner_warn ("pal= argument not recognised\n");
344 if ((t
->std
& V4L2_STD_SECAM
) == V4L2_STD_SECAM
) {
352 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
353 t
->std
= V4L2_STD_SECAM_B
| V4L2_STD_SECAM_G
| V4L2_STD_SECAM_H
;
359 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
360 t
->std
= V4L2_STD_SECAM_DK
;
364 if ((secam
[1]=='C')||(secam
[1]=='c')) {
365 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
366 t
->std
= V4L2_STD_SECAM_LC
;
368 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
369 t
->std
= V4L2_STD_SECAM_L
;
373 /* default parameter, do nothing */
376 tuner_warn ("secam= argument not recognised\n");
381 if ((t
->std
& V4L2_STD_NTSC
) == V4L2_STD_NTSC
) {
385 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
386 t
->std
= V4L2_STD_NTSC_M
;
390 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
391 t
->std
= V4L2_STD_NTSC_M_JP
;
395 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
396 t
->std
= V4L2_STD_NTSC_M_KR
;
399 /* default parameter, do nothing */
402 tuner_info("ntsc= argument not recognised\n");
409 static void tuner_status(struct i2c_client
*client
)
411 struct tuner
*t
= i2c_get_clientdata(client
);
412 unsigned long freq
, freq_fraction
;
416 case V4L2_TUNER_RADIO
: p
= "radio"; break;
417 case V4L2_TUNER_ANALOG_TV
: p
= "analog TV"; break;
418 case V4L2_TUNER_DIGITAL_TV
: p
= "digital TV"; break;
419 default: p
= "undefined"; break;
421 if (t
->mode
== V4L2_TUNER_RADIO
) {
422 freq
= t
->radio_freq
/ 16000;
423 freq_fraction
= (t
->radio_freq
% 16000) * 100 / 16000;
425 freq
= t
->tv_freq
/ 16;
426 freq_fraction
= (t
->tv_freq
% 16) * 100 / 16;
428 tuner_info("Tuner mode: %s\n", p
);
429 tuner_info("Frequency: %lu.%02lu MHz\n", freq
, freq_fraction
);
430 tuner_info("Standard: 0x%08lx\n", (unsigned long)t
->std
);
431 if (t
->mode
!= V4L2_TUNER_RADIO
)
433 if (t
->ops
.has_signal
) {
434 tuner_info("Signal strength: %d\n", t
->ops
.has_signal(client
));
436 if (t
->ops
.is_stereo
) {
437 tuner_info("Stereo: %s\n", t
->ops
.is_stereo(client
) ? "yes" : "no");
441 /* ---------------------------------------------------------------------- */
443 /* static vars: used only in tuner_attach and tuner_probe */
444 static unsigned default_mode_mask
;
446 /* During client attach, set_type is called by adapter's attach_inform callback.
447 set_type must then be completed by tuner_attach.
449 static int tuner_attach(struct i2c_adapter
*adap
, int addr
, int kind
)
453 client_template
.adapter
= adap
;
454 client_template
.addr
= addr
;
456 t
= kzalloc(sizeof(struct tuner
), GFP_KERNEL
);
459 memcpy(&t
->i2c
, &client_template
, sizeof(struct i2c_client
));
460 i2c_set_clientdata(&t
->i2c
, t
);
462 t
->audmode
= V4L2_TUNER_MODE_STEREO
;
463 t
->mode_mask
= T_UNINITIALIZED
;
464 t
->ops
.tuner_status
= tuner_status
;
467 unsigned char buffer
[16];
470 memset(buffer
, 0, sizeof(buffer
));
471 rc
= i2c_master_recv(&t
->i2c
, buffer
, sizeof(buffer
));
472 tuner_info("I2C RECV = ");
474 printk("%02x ",buffer
[i
]);
477 /* HACK: This test were added to avoid tuner to probe tda9840 and tea6415c on the MXB card */
478 if (adap
->id
== I2C_HW_SAA7146
&& addr
< 0x4a)
481 /* autodetection code based on the i2c addr */
482 if (!no_autodetect
) {
484 #ifdef CONFIG_TUNER_TEA5761
486 if (tea5761_autodetection(&t
->i2c
) != EINVAL
) {
487 t
->type
= TUNER_TEA5761
;
488 t
->mode_mask
= T_RADIO
;
490 t
->radio_freq
= 87.5 * 16000; /* Sets freq to FM range */
491 default_mode_mask
&= ~T_RADIO
;
493 goto register_client
;
501 /* If chip is not tda8290, don't register.
502 since it can be tda9887*/
503 if (tda8290_probe(&t
->i2c
) == 0) {
504 tuner_dbg("chip at addr %x is a tda8290\n", addr
);
506 /* Default is being tda9887 */
507 t
->type
= TUNER_TDA9887
;
508 t
->mode_mask
= T_RADIO
| T_ANALOG_TV
| T_DIGITAL_TV
;
510 goto register_client
;
514 if (tea5767_autodetection(&t
->i2c
) != EINVAL
) {
515 t
->type
= TUNER_TEA5767
;
516 t
->mode_mask
= T_RADIO
;
518 t
->radio_freq
= 87.5 * 16000; /* Sets freq to FM range */
519 default_mode_mask
&= ~T_RADIO
;
521 goto register_client
;
527 /* Initializes only the first adapter found */
528 if (default_mode_mask
!= T_UNINITIALIZED
) {
529 tuner_dbg ("Setting mode_mask to 0x%02x\n", default_mode_mask
);
530 t
->mode_mask
= default_mode_mask
;
531 t
->tv_freq
= 400 * 16; /* Sets freq to VHF High */
532 t
->radio_freq
= 87.5 * 16000; /* Sets freq to FM range */
533 default_mode_mask
= T_UNINITIALIZED
;
536 /* Should be just before return */
538 tuner_info("chip found @ 0x%x (%s)\n", addr
<< 1, adap
->name
);
539 i2c_attach_client (&t
->i2c
);
540 set_type (&t
->i2c
,t
->type
, t
->mode_mask
, t
->config
, t
->tuner_callback
);
544 static int tuner_probe(struct i2c_adapter
*adap
)
547 normal_i2c
[0] = addr
;
548 normal_i2c
[1] = I2C_CLIENT_END
;
551 default_mode_mask
= T_RADIO
| T_ANALOG_TV
| T_DIGITAL_TV
;
553 if (adap
->class & I2C_CLASS_TV_ANALOG
)
554 return i2c_probe(adap
, &addr_data
, tuner_attach
);
558 static int tuner_detach(struct i2c_client
*client
)
560 struct tuner
*t
= i2c_get_clientdata(client
);
563 err
= i2c_detach_client(&t
->i2c
);
566 ("Client deregistration failed, client not detached.\n");
571 t
->ops
.release(client
);
580 * Switch tuner to other mode. If tuner support both tv and radio,
581 * set another frequency to some value (This is needed for some pal
582 * tuners to avoid locking). Otherwise, just put second tuner in
586 static inline int set_mode(struct i2c_client
*client
, struct tuner
*t
, int mode
, char *cmd
)
593 if (check_mode(t
, cmd
) == EINVAL
) {
596 t
->ops
.standby (client
);
602 #define switch_v4l2() if (!t->using_v4l2) \
603 tuner_dbg("switching to v4l2\n"); \
606 static inline int check_v4l2(struct tuner
*t
)
608 /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
609 TV, v4l1 for radio), until that is fixed this code is disabled.
610 Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
615 static int tuner_command(struct i2c_client
*client
, unsigned int cmd
, void *arg
)
617 struct tuner
*t
= i2c_get_clientdata(client
);
620 v4l_i2c_print_ioctl(&(t
->i2c
),cmd
);
623 /* --- configuration --- */
624 case TUNER_SET_TYPE_ADDR
:
625 tuner_dbg ("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
626 ((struct tuner_setup
*)arg
)->type
,
627 ((struct tuner_setup
*)arg
)->addr
,
628 ((struct tuner_setup
*)arg
)->mode_mask
,
629 ((struct tuner_setup
*)arg
)->config
);
631 set_addr(client
, (struct tuner_setup
*)arg
);
634 if (set_mode(client
, t
, V4L2_TUNER_RADIO
, "AUDC_SET_RADIO")
638 set_freq(client
, t
->radio_freq
);
640 case TUNER_SET_STANDBY
:
641 if (check_mode(t
, "TUNER_SET_STANDBY") == EINVAL
)
645 t
->ops
.standby (client
);
647 #ifdef CONFIG_VIDEO_V4L1
649 if (check_mode(t
, "VIDIOCSAUDIO") == EINVAL
)
651 if (check_v4l2(t
) == EINVAL
)
654 /* Should be implemented, since bttv calls it */
655 tuner_dbg("VIDIOCSAUDIO not implemented.\n");
659 static const v4l2_std_id map
[] = {
660 [VIDEO_MODE_PAL
] = V4L2_STD_PAL
,
661 [VIDEO_MODE_NTSC
] = V4L2_STD_NTSC_M
,
662 [VIDEO_MODE_SECAM
] = V4L2_STD_SECAM
,
663 [4 /* bttv */ ] = V4L2_STD_PAL_M
,
664 [5 /* bttv */ ] = V4L2_STD_PAL_N
,
665 [6 /* bttv */ ] = V4L2_STD_NTSC_M_JP
,
667 struct video_channel
*vc
= arg
;
669 if (check_v4l2(t
) == EINVAL
)
672 if (set_mode(client
,t
,V4L2_TUNER_ANALOG_TV
, "VIDIOCSCHAN")==EINVAL
)
675 if (vc
->norm
< ARRAY_SIZE(map
))
676 t
->std
= map
[vc
->norm
];
679 set_tv_freq(client
, t
->tv_freq
);
684 unsigned long *v
= arg
;
686 if (check_mode(t
, "VIDIOCSFREQ") == EINVAL
)
688 if (check_v4l2(t
) == EINVAL
)
691 set_freq(client
, *v
);
696 struct video_tuner
*vt
= arg
;
698 if (check_mode(t
, "VIDIOCGTUNER") == EINVAL
)
700 if (check_v4l2(t
) == EINVAL
)
703 if (V4L2_TUNER_RADIO
== t
->mode
) {
704 if (t
->ops
.has_signal
)
705 vt
->signal
= t
->ops
.has_signal(client
);
706 if (t
->ops
.is_stereo
) {
707 if (t
->ops
.is_stereo(client
))
709 VIDEO_TUNER_STEREO_ON
;
712 ~VIDEO_TUNER_STEREO_ON
;
714 vt
->flags
|= VIDEO_TUNER_LOW
; /* Allow freqs at 62.5 Hz */
716 vt
->rangelow
= radio_range
[0] * 16000;
717 vt
->rangehigh
= radio_range
[1] * 16000;
720 vt
->rangelow
= tv_range
[0] * 16;
721 vt
->rangehigh
= tv_range
[1] * 16;
728 struct video_audio
*va
= arg
;
730 if (check_mode(t
, "VIDIOCGAUDIO") == EINVAL
)
732 if (check_v4l2(t
) == EINVAL
)
735 if (V4L2_TUNER_RADIO
== t
->mode
&& t
->ops
.is_stereo
)
736 va
->mode
= t
->ops
.is_stereo(client
)
737 ? VIDEO_SOUND_STEREO
: VIDEO_SOUND_MONO
;
741 case TDA9887_SET_CONFIG
:
742 if (t
->type
== TUNER_TDA9887
) {
745 t
->tda9887_config
= *i
;
746 set_freq(client
, t
->tv_freq
);
749 /* --- v4l ioctls --- */
750 /* take care: bttv does userspace copying, we'll get a
751 kernel pointer here... */
754 v4l2_std_id
*id
= arg
;
756 if (set_mode (client
, t
, V4L2_TUNER_ANALOG_TV
, "VIDIOC_S_STD")
765 set_freq(client
, t
->tv_freq
);
768 case VIDIOC_S_FREQUENCY
:
770 struct v4l2_frequency
*f
= arg
;
772 if (set_mode (client
, t
, f
->type
, "VIDIOC_S_FREQUENCY")
776 set_freq(client
,f
->frequency
);
780 case VIDIOC_G_FREQUENCY
:
782 struct v4l2_frequency
*f
= arg
;
784 if (check_mode(t
, "VIDIOC_G_FREQUENCY") == EINVAL
)
788 f
->frequency
= (V4L2_TUNER_RADIO
== t
->mode
) ?
789 t
->radio_freq
: t
->tv_freq
;
794 struct v4l2_tuner
*tuner
= arg
;
796 if (check_mode(t
, "VIDIOC_G_TUNER") == EINVAL
)
800 tuner
->type
= t
->mode
;
802 tuner
->afc
=t
->ops
.get_afc(client
);
803 if (t
->mode
== V4L2_TUNER_ANALOG_TV
)
804 tuner
->capability
|= V4L2_TUNER_CAP_NORM
;
805 if (t
->mode
!= V4L2_TUNER_RADIO
) {
806 tuner
->rangelow
= tv_range
[0] * 16;
807 tuner
->rangehigh
= tv_range
[1] * 16;
812 if (t
->ops
.has_signal
)
813 tuner
->signal
= t
->ops
.has_signal(client
);
816 V4L2_TUNER_SUB_MONO
| V4L2_TUNER_SUB_STEREO
;
817 if (t
->ops
.is_stereo
) {
818 tuner
->rxsubchans
= t
->ops
.is_stereo(client
) ?
819 V4L2_TUNER_SUB_STEREO
: V4L2_TUNER_SUB_MONO
;
823 V4L2_TUNER_CAP_LOW
| V4L2_TUNER_CAP_STEREO
;
824 tuner
->audmode
= t
->audmode
;
825 tuner
->rangelow
= radio_range
[0] * 16000;
826 tuner
->rangehigh
= radio_range
[1] * 16000;
831 struct v4l2_tuner
*tuner
= arg
;
833 if (check_mode(t
, "VIDIOC_S_TUNER") == EINVAL
)
838 /* do nothing unless we're a radio tuner */
839 if (t
->mode
!= V4L2_TUNER_RADIO
)
841 t
->audmode
= tuner
->audmode
;
842 set_radio_freq(client
, t
->radio_freq
);
845 case VIDIOC_LOG_STATUS
:
846 if (t
->ops
.tuner_status
)
847 t
->ops
.tuner_status(client
);
854 static int tuner_suspend(struct i2c_client
*c
, pm_message_t state
)
856 struct tuner
*t
= i2c_get_clientdata (c
);
858 tuner_dbg ("suspend\n");
859 /* FIXME: power down ??? */
863 static int tuner_resume(struct i2c_client
*c
)
865 struct tuner
*t
= i2c_get_clientdata (c
);
867 tuner_dbg ("resume\n");
868 if (V4L2_TUNER_RADIO
== t
->mode
) {
870 set_freq(c
, t
->radio_freq
);
873 set_freq(c
, t
->tv_freq
);
878 /* ----------------------------------------------------------------------- */
880 static struct i2c_driver driver
= {
881 .id
= I2C_DRIVERID_TUNER
,
882 .attach_adapter
= tuner_probe
,
883 .detach_client
= tuner_detach
,
884 .command
= tuner_command
,
885 .suspend
= tuner_suspend
,
886 .resume
= tuner_resume
,
891 static struct i2c_client client_template
= {
892 .name
= "(tuner unset)",
896 static int __init
tuner_init_module(void)
898 return i2c_add_driver(&driver
);
901 static void __exit
tuner_cleanup_module(void)
903 i2c_del_driver(&driver
);
906 module_init(tuner_init_module
);
907 module_exit(tuner_cleanup_module
);
910 * Overrides for Emacs so that we follow Linus's tabbing style.
911 * ---------------------------------------------------------------------------