[SCTP]: Annotate sctp_init_cause().
[firewire-audio.git] / drivers / media / video / tuner-core.c
blob40590bae5ff7f55652ae57039d9347ccbb6f8566
1 /*
3 * i2c tv tuner chip device driver
4 * core core, i.e. kernel interfaces, registering and so on
5 */
7 #include <linux/module.h>
8 #include <linux/moduleparam.h>
9 #include <linux/kernel.h>
10 #include <linux/sched.h>
11 #include <linux/string.h>
12 #include <linux/timer.h>
13 #include <linux/delay.h>
14 #include <linux/errno.h>
15 #include <linux/slab.h>
16 #include <linux/poll.h>
17 #include <linux/i2c.h>
18 #include <linux/types.h>
19 #include <linux/videodev.h>
20 #include <linux/init.h>
22 #include <media/tuner.h>
23 #include <media/v4l2-common.h>
25 #define UNSET (-1U)
27 /* standard i2c insmod options */
28 static unsigned short normal_i2c[] = {
29 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
30 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
31 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
32 I2C_CLIENT_END
35 I2C_CLIENT_INSMOD;
37 /* insmod options used at init time => read/only */
38 static unsigned int addr = 0;
39 static unsigned int no_autodetect = 0;
40 static unsigned int show_i2c = 0;
42 /* insmod options used at runtime => read/write */
43 int tuner_debug = 0;
45 static unsigned int tv_range[2] = { 44, 958 };
46 static unsigned int radio_range[2] = { 65, 108 };
48 static char pal[] = "--";
49 static char secam[] = "--";
50 static char ntsc[] = "-";
53 module_param(addr, int, 0444);
54 module_param(no_autodetect, int, 0444);
55 module_param(show_i2c, int, 0444);
56 module_param_named(debug,tuner_debug, int, 0644);
57 module_param_string(pal, pal, sizeof(pal), 0644);
58 module_param_string(secam, secam, sizeof(secam), 0644);
59 module_param_string(ntsc, ntsc, sizeof(ntsc), 0644);
60 module_param_array(tv_range, int, NULL, 0644);
61 module_param_array(radio_range, int, NULL, 0644);
63 MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
64 MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
65 MODULE_LICENSE("GPL");
67 static struct i2c_driver driver;
68 static struct i2c_client client_template;
70 /* ---------------------------------------------------------------------- */
72 /* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
73 static void set_tv_freq(struct i2c_client *c, unsigned int freq)
75 struct tuner *t = i2c_get_clientdata(c);
77 if (t->type == UNSET) {
78 tuner_warn ("tuner type not set\n");
79 return;
81 if (NULL == t->set_tv_freq) {
82 tuner_warn ("Tuner has no way to set tv freq\n");
83 return;
85 if (freq < tv_range[0] * 16 || freq > tv_range[1] * 16) {
86 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
87 freq / 16, freq % 16 * 100 / 16, tv_range[0],
88 tv_range[1]);
89 /* V4L2 spec: if the freq is not possible then the closest
90 possible value should be selected */
91 if (freq < tv_range[0] * 16)
92 freq = tv_range[0] * 16;
93 else
94 freq = tv_range[1] * 16;
96 t->set_tv_freq(c, freq);
99 static void set_radio_freq(struct i2c_client *c, unsigned int freq)
101 struct tuner *t = i2c_get_clientdata(c);
103 if (t->type == UNSET) {
104 tuner_warn ("tuner type not set\n");
105 return;
107 if (NULL == t->set_radio_freq) {
108 tuner_warn ("tuner has no way to set radio frequency\n");
109 return;
111 if (freq < radio_range[0] * 16000 || freq > radio_range[1] * 16000) {
112 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
113 freq / 16000, freq % 16000 * 100 / 16000,
114 radio_range[0], radio_range[1]);
115 /* V4L2 spec: if the freq is not possible then the closest
116 possible value should be selected */
117 if (freq < radio_range[0] * 16000)
118 freq = radio_range[0] * 16000;
119 else
120 freq = radio_range[1] * 16000;
123 t->set_radio_freq(c, freq);
126 static void set_freq(struct i2c_client *c, unsigned long freq)
128 struct tuner *t = i2c_get_clientdata(c);
130 switch (t->mode) {
131 case V4L2_TUNER_RADIO:
132 tuner_dbg("radio freq set to %lu.%02lu\n",
133 freq / 16000, freq % 16000 * 100 / 16000);
134 set_radio_freq(c, freq);
135 t->radio_freq = freq;
136 break;
137 case V4L2_TUNER_ANALOG_TV:
138 case V4L2_TUNER_DIGITAL_TV:
139 tuner_dbg("tv freq set to %lu.%02lu\n",
140 freq / 16, freq % 16 * 100 / 16);
141 set_tv_freq(c, freq);
142 t->tv_freq = freq;
143 break;
147 static void set_type(struct i2c_client *c, unsigned int type,
148 unsigned int new_mode_mask)
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);
155 return;
158 if (type >= tuner_count) {
159 tuner_warn ("tuner 0x%02x: Tuner count greater than %d\n",c->addr,tuner_count);
160 return;
163 /* This code detects calls by card attach_inform */
164 if (NULL == t->i2c.dev.driver) {
165 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c->addr);
167 t->type=type;
168 return;
171 t->type = type;
172 switch (t->type) {
173 case TUNER_MT2032:
174 microtune_init(c);
175 break;
176 case TUNER_PHILIPS_TDA8290:
177 tda8290_init(c);
178 break;
179 case TUNER_TEA5767:
180 if (tea5767_tuner_init(c) == EINVAL) {
181 t->type = TUNER_ABSENT;
182 t->mode_mask = T_UNINITIALIZED;
183 return;
185 t->mode_mask = T_RADIO;
186 break;
187 case TUNER_PHILIPS_FMD1216ME_MK3:
188 buffer[0] = 0x0b;
189 buffer[1] = 0xdc;
190 buffer[2] = 0x9c;
191 buffer[3] = 0x60;
192 i2c_master_send(c, buffer, 4);
193 mdelay(1);
194 buffer[2] = 0x86;
195 buffer[3] = 0x54;
196 i2c_master_send(c, buffer, 4);
197 default_tuner_init(c);
198 break;
199 case TUNER_PHILIPS_TD1316:
200 buffer[0] = 0x0b;
201 buffer[1] = 0xdc;
202 buffer[2] = 0x86;
203 buffer[3] = 0xa4;
204 i2c_master_send(c,buffer,4);
205 default_tuner_init(c);
206 break;
207 case TUNER_TDA9887:
208 tda9887_tuner_init(c);
209 break;
210 default:
211 default_tuner_init(c);
212 break;
215 if (t->mode_mask == T_UNINITIALIZED)
216 t->mode_mask = new_mode_mask;
218 set_freq(c, (V4L2_TUNER_RADIO == t->mode) ? t->radio_freq : t->tv_freq);
219 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
220 c->adapter->name, c->driver->driver.name, c->addr << 1, type,
221 t->mode_mask);
225 * This function apply tuner config to tuner specified
226 * by tun_setup structure. I addr is unset, then admin status
227 * and tun addr status is more precise then current status,
228 * it's applied. Otherwise status and type are applied only to
229 * tuner with exactly the same addr.
232 static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup)
234 struct tuner *t = i2c_get_clientdata(c);
236 tuner_dbg("set addr for type %i\n", t->type);
238 if ( t->type == UNSET && ((tun_setup->addr == ADDR_UNSET &&
239 (t->mode_mask & tun_setup->mode_mask)) ||
240 tun_setup->addr == c->addr)) {
241 set_type(c, tun_setup->type, tun_setup->mode_mask);
245 static inline int check_mode(struct tuner *t, char *cmd)
247 if ((1 << t->mode & t->mode_mask) == 0) {
248 return EINVAL;
251 switch (t->mode) {
252 case V4L2_TUNER_RADIO:
253 tuner_dbg("Cmd %s accepted for radio\n", cmd);
254 break;
255 case V4L2_TUNER_ANALOG_TV:
256 tuner_dbg("Cmd %s accepted for analog TV\n", cmd);
257 break;
258 case V4L2_TUNER_DIGITAL_TV:
259 tuner_dbg("Cmd %s accepted for digital TV\n", cmd);
260 break;
262 return 0;
265 /* get more precise norm info from insmod option */
266 static int tuner_fixup_std(struct tuner *t)
268 if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) {
269 switch (pal[0]) {
270 case 'b':
271 case 'B':
272 case 'g':
273 case 'G':
274 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
275 t->std = V4L2_STD_PAL_BG;
276 break;
277 case 'i':
278 case 'I':
279 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
280 t->std = V4L2_STD_PAL_I;
281 break;
282 case 'd':
283 case 'D':
284 case 'k':
285 case 'K':
286 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
287 t->std = V4L2_STD_PAL_DK;
288 break;
289 case 'M':
290 case 'm':
291 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
292 t->std = V4L2_STD_PAL_M;
293 break;
294 case 'N':
295 case 'n':
296 if (pal[1] == 'c' || pal[1] == 'C') {
297 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
298 t->std = V4L2_STD_PAL_Nc;
299 } else {
300 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
301 t->std = V4L2_STD_PAL_N;
303 break;
304 case '-':
305 /* default parameter, do nothing */
306 break;
307 default:
308 tuner_warn ("pal= argument not recognised\n");
309 break;
312 if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
313 switch (secam[0]) {
314 case 'b':
315 case 'B':
316 case 'g':
317 case 'G':
318 case 'h':
319 case 'H':
320 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
321 t->std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H;
322 break;
323 case 'd':
324 case 'D':
325 case 'k':
326 case 'K':
327 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
328 t->std = V4L2_STD_SECAM_DK;
329 break;
330 case 'l':
331 case 'L':
332 if ((secam[1]=='C')||(secam[1]=='c')) {
333 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
334 t->std = V4L2_STD_SECAM_LC;
335 } else {
336 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
337 t->std = V4L2_STD_SECAM_L;
339 break;
340 case '-':
341 /* default parameter, do nothing */
342 break;
343 default:
344 tuner_warn ("secam= argument not recognised\n");
345 break;
349 if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
350 switch (ntsc[0]) {
351 case 'm':
352 case 'M':
353 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
354 t->std = V4L2_STD_NTSC_M;
355 break;
356 case 'j':
357 case 'J':
358 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
359 t->std = V4L2_STD_NTSC_M_JP;
360 break;
361 case 'k':
362 case 'K':
363 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
364 t->std = V4L2_STD_NTSC_M_KR;
365 break;
366 case '-':
367 /* default parameter, do nothing */
368 break;
369 default:
370 tuner_info("ntsc= argument not recognised\n");
371 break;
374 return 0;
377 static void tuner_status(struct i2c_client *client)
379 struct tuner *t = i2c_get_clientdata(client);
380 unsigned long freq, freq_fraction;
381 const char *p;
383 switch (t->mode) {
384 case V4L2_TUNER_RADIO: p = "radio"; break;
385 case V4L2_TUNER_ANALOG_TV: p = "analog TV"; break;
386 case V4L2_TUNER_DIGITAL_TV: p = "digital TV"; break;
387 default: p = "undefined"; break;
389 if (t->mode == V4L2_TUNER_RADIO) {
390 freq = t->radio_freq / 16000;
391 freq_fraction = (t->radio_freq % 16000) * 100 / 16000;
392 } else {
393 freq = t->tv_freq / 16;
394 freq_fraction = (t->tv_freq % 16) * 100 / 16;
396 tuner_info("Tuner mode: %s\n", p);
397 tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction);
398 tuner_info("Standard: 0x%08lx\n", (unsigned long)t->std);
399 if (t->mode != V4L2_TUNER_RADIO)
400 return;
401 if (t->has_signal) {
402 tuner_info("Signal strength: %d\n", t->has_signal(client));
404 if (t->is_stereo) {
405 tuner_info("Stereo: %s\n", t->is_stereo(client) ? "yes" : "no");
409 /* ---------------------------------------------------------------------- */
411 /* static vars: used only in tuner_attach and tuner_probe */
412 static unsigned default_mode_mask;
414 /* During client attach, set_type is called by adapter's attach_inform callback.
415 set_type must then be completed by tuner_attach.
417 static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
419 struct tuner *t;
421 client_template.adapter = adap;
422 client_template.addr = addr;
424 t = kzalloc(sizeof(struct tuner), GFP_KERNEL);
425 if (NULL == t)
426 return -ENOMEM;
427 memcpy(&t->i2c, &client_template, sizeof(struct i2c_client));
428 i2c_set_clientdata(&t->i2c, t);
429 t->type = UNSET;
430 t->radio_if2 = 10700 * 1000; /* 10.7MHz - FM radio */
431 t->audmode = V4L2_TUNER_MODE_STEREO;
432 t->mode_mask = T_UNINITIALIZED;
433 t->tuner_status = tuner_status;
435 if (show_i2c) {
436 unsigned char buffer[16];
437 int i,rc;
439 memset(buffer, 0, sizeof(buffer));
440 rc = i2c_master_recv(&t->i2c, buffer, sizeof(buffer));
441 tuner_info("I2C RECV = ");
442 for (i=0;i<rc;i++)
443 printk("%02x ",buffer[i]);
444 printk("\n");
446 /* autodetection code based on the i2c addr */
447 if (!no_autodetect) {
448 switch (addr) {
449 case 0x42:
450 case 0x43:
451 case 0x4a:
452 case 0x4b:
453 /* If chip is not tda8290, don't register.
454 since it can be tda9887*/
455 if (tda8290_probe(&t->i2c) == 0) {
456 tuner_dbg("chip at addr %x is a tda8290\n", addr);
457 } else {
458 /* Default is being tda9887 */
459 t->type = TUNER_TDA9887;
460 t->mode_mask = T_RADIO | T_ANALOG_TV | T_DIGITAL_TV;
461 t->mode = T_STANDBY;
462 goto register_client;
464 break;
465 case 0x60:
466 if (tea5767_autodetection(&t->i2c) != EINVAL) {
467 t->type = TUNER_TEA5767;
468 t->mode_mask = T_RADIO;
469 t->mode = T_STANDBY;
470 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
471 default_mode_mask &= ~T_RADIO;
473 goto register_client;
475 break;
479 /* Initializes only the first adapter found */
480 if (default_mode_mask != T_UNINITIALIZED) {
481 tuner_dbg ("Setting mode_mask to 0x%02x\n", default_mode_mask);
482 t->mode_mask = default_mode_mask;
483 t->tv_freq = 400 * 16; /* Sets freq to VHF High */
484 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
485 default_mode_mask = T_UNINITIALIZED;
488 /* Should be just before return */
489 register_client:
490 tuner_info("chip found @ 0x%x (%s)\n", addr << 1, adap->name);
491 i2c_attach_client (&t->i2c);
492 set_type (&t->i2c,t->type, t->mode_mask);
493 return 0;
496 static int tuner_probe(struct i2c_adapter *adap)
498 if (0 != addr) {
499 normal_i2c[0] = addr;
500 normal_i2c[1] = I2C_CLIENT_END;
503 default_mode_mask = T_RADIO | T_ANALOG_TV | T_DIGITAL_TV;
505 if (adap->class & I2C_CLASS_TV_ANALOG)
506 return i2c_probe(adap, &addr_data, tuner_attach);
507 return 0;
510 static int tuner_detach(struct i2c_client *client)
512 struct tuner *t = i2c_get_clientdata(client);
513 int err;
515 err = i2c_detach_client(&t->i2c);
516 if (err) {
517 tuner_warn
518 ("Client deregistration failed, client not detached.\n");
519 return err;
522 kfree(t);
523 return 0;
527 * Switch tuner to other mode. If tuner support both tv and radio,
528 * set another frequency to some value (This is needed for some pal
529 * tuners to avoid locking). Otherwise, just put second tuner in
530 * standby mode.
533 static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, char *cmd)
535 if (mode == t->mode)
536 return 0;
538 t->mode = mode;
540 if (check_mode(t, cmd) == EINVAL) {
541 t->mode = T_STANDBY;
542 if (t->standby)
543 t->standby (client);
544 return EINVAL;
546 return 0;
549 #define switch_v4l2() if (!t->using_v4l2) \
550 tuner_dbg("switching to v4l2\n"); \
551 t->using_v4l2 = 1;
553 static inline int check_v4l2(struct tuner *t)
555 /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
556 TV, v4l1 for radio), until that is fixed this code is disabled.
557 Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
558 first. */
559 return 0;
562 static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
564 struct tuner *t = i2c_get_clientdata(client);
566 if (tuner_debug>1)
567 v4l_i2c_print_ioctl(&(t->i2c),cmd);
569 switch (cmd) {
570 /* --- configuration --- */
571 case TUNER_SET_TYPE_ADDR:
572 tuner_dbg ("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x\n",
573 ((struct tuner_setup *)arg)->type,
574 ((struct tuner_setup *)arg)->addr,
575 ((struct tuner_setup *)arg)->mode_mask);
577 set_addr(client, (struct tuner_setup *)arg);
578 break;
579 case AUDC_SET_RADIO:
580 if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO")
581 == EINVAL)
582 return 0;
583 if (t->radio_freq)
584 set_freq(client, t->radio_freq);
585 break;
586 case TUNER_SET_STANDBY:
587 if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL)
588 return 0;
589 t->mode = T_STANDBY;
590 if (t->standby)
591 t->standby (client);
592 break;
593 #ifdef CONFIG_VIDEO_V4L1
594 case VIDIOCSAUDIO:
595 if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
596 return 0;
597 if (check_v4l2(t) == EINVAL)
598 return 0;
600 /* Should be implemented, since bttv calls it */
601 tuner_dbg("VIDIOCSAUDIO not implemented.\n");
602 break;
603 case VIDIOCSCHAN:
605 static const v4l2_std_id map[] = {
606 [VIDEO_MODE_PAL] = V4L2_STD_PAL,
607 [VIDEO_MODE_NTSC] = V4L2_STD_NTSC_M,
608 [VIDEO_MODE_SECAM] = V4L2_STD_SECAM,
609 [4 /* bttv */ ] = V4L2_STD_PAL_M,
610 [5 /* bttv */ ] = V4L2_STD_PAL_N,
611 [6 /* bttv */ ] = V4L2_STD_NTSC_M_JP,
613 struct video_channel *vc = arg;
615 if (check_v4l2(t) == EINVAL)
616 return 0;
618 if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==EINVAL)
619 return 0;
621 if (vc->norm < ARRAY_SIZE(map))
622 t->std = map[vc->norm];
623 tuner_fixup_std(t);
624 if (t->tv_freq)
625 set_tv_freq(client, t->tv_freq);
626 return 0;
628 case VIDIOCSFREQ:
630 unsigned long *v = arg;
632 if (check_mode(t, "VIDIOCSFREQ") == EINVAL)
633 return 0;
634 if (check_v4l2(t) == EINVAL)
635 return 0;
637 set_freq(client, *v);
638 return 0;
640 case VIDIOCGTUNER:
642 struct video_tuner *vt = arg;
644 if (check_mode(t, "VIDIOCGTUNER") == EINVAL)
645 return 0;
646 if (check_v4l2(t) == EINVAL)
647 return 0;
649 if (V4L2_TUNER_RADIO == t->mode) {
650 if (t->has_signal)
651 vt->signal = t->has_signal(client);
652 if (t->is_stereo) {
653 if (t->is_stereo(client))
654 vt->flags |=
655 VIDEO_TUNER_STEREO_ON;
656 else
657 vt->flags &=
658 ~VIDEO_TUNER_STEREO_ON;
660 vt->flags |= VIDEO_TUNER_LOW; /* Allow freqs at 62.5 Hz */
662 vt->rangelow = radio_range[0] * 16000;
663 vt->rangehigh = radio_range[1] * 16000;
665 } else {
666 vt->rangelow = tv_range[0] * 16;
667 vt->rangehigh = tv_range[1] * 16;
670 return 0;
672 case VIDIOCGAUDIO:
674 struct video_audio *va = arg;
676 if (check_mode(t, "VIDIOCGAUDIO") == EINVAL)
677 return 0;
678 if (check_v4l2(t) == EINVAL)
679 return 0;
681 if (V4L2_TUNER_RADIO == t->mode && t->is_stereo)
682 va->mode = t->is_stereo(client)
683 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
684 return 0;
686 #endif
687 case TDA9887_SET_CONFIG:
688 if (t->type == TUNER_TDA9887) {
689 int *i = arg;
691 t->tda9887_config = *i;
692 set_freq(client, t->tv_freq);
694 break;
695 /* --- v4l ioctls --- */
696 /* take care: bttv does userspace copying, we'll get a
697 kernel pointer here... */
698 case VIDIOC_S_STD:
700 v4l2_std_id *id = arg;
702 if (set_mode (client, t, V4L2_TUNER_ANALOG_TV, "VIDIOC_S_STD")
703 == EINVAL)
704 return 0;
706 switch_v4l2();
708 t->std = *id;
709 tuner_fixup_std(t);
710 if (t->tv_freq)
711 set_freq(client, t->tv_freq);
712 break;
714 case VIDIOC_S_FREQUENCY:
716 struct v4l2_frequency *f = arg;
718 if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
719 == EINVAL)
720 return 0;
721 switch_v4l2();
722 set_freq(client,f->frequency);
724 break;
726 case VIDIOC_G_FREQUENCY:
728 struct v4l2_frequency *f = arg;
730 if (check_mode(t, "VIDIOC_G_FREQUENCY") == EINVAL)
731 return 0;
732 switch_v4l2();
733 f->type = t->mode;
734 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
735 t->radio_freq : t->tv_freq;
736 break;
738 case VIDIOC_G_TUNER:
740 struct v4l2_tuner *tuner = arg;
742 if (check_mode(t, "VIDIOC_G_TUNER") == EINVAL)
743 return 0;
744 switch_v4l2();
746 tuner->type = t->mode;
747 if (t->get_afc)
748 tuner->afc=t->get_afc(client);
749 if (t->mode == V4L2_TUNER_ANALOG_TV)
750 tuner->capability |= V4L2_TUNER_CAP_NORM;
751 if (t->mode != V4L2_TUNER_RADIO) {
752 tuner->rangelow = tv_range[0] * 16;
753 tuner->rangehigh = tv_range[1] * 16;
754 break;
757 /* radio mode */
758 if (t->has_signal)
759 tuner->signal = t->has_signal(client);
761 tuner->rxsubchans =
762 V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
763 if (t->is_stereo) {
764 tuner->rxsubchans = t->is_stereo(client) ?
765 V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO;
768 tuner->capability |=
769 V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
770 tuner->audmode = t->audmode;
771 tuner->rangelow = radio_range[0] * 16000;
772 tuner->rangehigh = radio_range[1] * 16000;
773 break;
775 case VIDIOC_S_TUNER:
777 struct v4l2_tuner *tuner = arg;
779 if (check_mode(t, "VIDIOC_S_TUNER") == EINVAL)
780 return 0;
782 switch_v4l2();
784 /* do nothing unless we're a radio tuner */
785 if (t->mode != V4L2_TUNER_RADIO)
786 break;
787 t->audmode = tuner->audmode;
788 set_radio_freq(client, t->radio_freq);
789 break;
791 case VIDIOC_LOG_STATUS:
792 if (t->tuner_status)
793 t->tuner_status(client);
794 break;
797 return 0;
800 static int tuner_suspend(struct device *dev, pm_message_t state)
802 struct i2c_client *c = container_of (dev, struct i2c_client, dev);
803 struct tuner *t = i2c_get_clientdata (c);
805 tuner_dbg ("suspend\n");
806 /* FIXME: power down ??? */
807 return 0;
810 static int tuner_resume(struct device *dev)
812 struct i2c_client *c = container_of (dev, struct i2c_client, dev);
813 struct tuner *t = i2c_get_clientdata (c);
815 tuner_dbg ("resume\n");
816 if (V4L2_TUNER_RADIO == t->mode) {
817 if (t->radio_freq)
818 set_freq(c, t->radio_freq);
819 } else {
820 if (t->tv_freq)
821 set_freq(c, t->tv_freq);
823 return 0;
826 /* ----------------------------------------------------------------------- */
828 static struct i2c_driver driver = {
829 .id = I2C_DRIVERID_TUNER,
830 .attach_adapter = tuner_probe,
831 .detach_client = tuner_detach,
832 .command = tuner_command,
833 .driver = {
834 .name = "tuner",
835 .suspend = tuner_suspend,
836 .resume = tuner_resume,
839 static struct i2c_client client_template = {
840 .name = "(tuner unset)",
841 .driver = &driver,
844 static int __init tuner_init_module(void)
846 return i2c_add_driver(&driver);
849 static void __exit tuner_cleanup_module(void)
851 i2c_del_driver(&driver);
854 module_init(tuner_init_module);
855 module_exit(tuner_cleanup_module);
858 * Overrides for Emacs so that we follow Linus's tabbing style.
859 * ---------------------------------------------------------------------------
860 * Local variables:
861 * c-basic-offset: 8
862 * End: