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/kernel.h>
9 #include <linux/string.h>
10 #include <linux/timer.h>
11 #include <linux/delay.h>
12 #include <linux/errno.h>
13 #include <linux/slab.h>
14 #include <linux/poll.h>
15 #include <linux/i2c.h>
16 #include <linux/types.h>
17 #include <linux/init.h>
18 #include <linux/videodev.h>
19 #include <media/tuner.h>
20 #include <media/tuner-types.h>
21 #include <media/v4l2-common.h>
22 #include <media/v4l2-i2c-drv-legacy.h>
23 #include "tuner-driver.h"
28 #include "tuner-xc2028.h"
29 #include "tuner-simple.h"
34 #define PREFIX t->i2c->driver->driver.name
36 /* standard i2c insmod options */
37 static unsigned short normal_i2c[] = {
38 #if defined(CONFIG_TUNER_TEA5761) || (defined(CONFIG_TUNER_TEA5761_MODULE) && defined(MODULE))
41 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
42 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
43 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
49 /* insmod options used at init time => read/only */
50 static unsigned int addr = 0;
51 static unsigned int no_autodetect = 0;
52 static unsigned int show_i2c = 0;
54 /* insmod options used at runtime => read/write */
55 static int tuner_debug;
57 #define tuner_warn(fmt, arg...) do { \
58 printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
59 i2c_adapter_id(t->i2c->adapter), \
60 t->i2c->addr, ##arg); \
63 #define tuner_info(fmt, arg...) do { \
64 printk(KERN_INFO "%s %d-%04x: " fmt, PREFIX, \
65 i2c_adapter_id(t->i2c->adapter), \
66 t->i2c->addr, ##arg); \
69 #define tuner_err(fmt, arg...) do { \
70 printk(KERN_ERR "%s %d-%04x: " fmt, PREFIX, \
71 i2c_adapter_id(t->i2c->adapter), \
72 t->i2c->addr, ##arg); \
75 #define tuner_dbg(fmt, arg...) do { \
77 printk(KERN_DEBUG "%s %d-%04x: " fmt, PREFIX, \
78 i2c_adapter_id(t->i2c->adapter), \
79 t->i2c->addr, ##arg); \
82 /* ------------------------------------------------------------------------ */
84 static unsigned int tv_range[2] = { 44, 958 };
85 static unsigned int radio_range[2] = { 65, 108 };
87 static char pal[] = "--";
88 static char secam[] = "--";
89 static char ntsc[] = "-";
92 module_param(addr, int, 0444);
93 module_param(no_autodetect, int, 0444);
94 module_param(show_i2c, int, 0444);
95 module_param_named(debug,tuner_debug, int, 0644);
96 module_param_string(pal, pal, sizeof(pal), 0644);
97 module_param_string(secam, secam, sizeof(secam), 0644);
98 module_param_string(ntsc, ntsc, sizeof(ntsc), 0644);
99 module_param_array(tv_range, int, NULL, 0644);
100 module_param_array(radio_range, int, NULL, 0644);
102 MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
103 MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
104 MODULE_LICENSE("GPL");
106 /* ---------------------------------------------------------------------- */
108 static void fe_set_params(struct dvb_frontend *fe,
109 struct analog_parameters *params)
111 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
112 struct tuner *t = fe->analog_demod_priv;
114 if (NULL == fe_tuner_ops->set_analog_params) {
115 tuner_warn("Tuner frontend module has no way to set freq\n");
118 fe_tuner_ops->set_analog_params(fe, params);
121 static void fe_release(struct dvb_frontend *fe)
123 if (fe->ops.tuner_ops.release)
124 fe->ops.tuner_ops.release(fe);
126 fe->ops.analog_demod_ops = NULL;
128 /* DO NOT kfree(fe->analog_demod_priv)
130 * If we are in this function, analog_demod_priv contains a pointer
131 * to struct tuner *t. This will be kfree'd in tuner_detach().
133 * Otherwise, fe->ops.analog_demod_ops->release will
134 * handle the cleanup for analog demodulator modules.
136 fe->analog_demod_priv = NULL;
139 static void fe_standby(struct dvb_frontend *fe)
141 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
143 if (fe_tuner_ops->sleep)
144 fe_tuner_ops->sleep(fe);
147 static int fe_has_signal(struct dvb_frontend *fe)
151 if (fe->ops.tuner_ops.get_rf_strength)
152 fe->ops.tuner_ops.get_rf_strength(fe, &strength);
157 static void tuner_status(struct dvb_frontend *fe);
159 static struct analog_tuner_ops tuner_core_ops = {
160 .set_params = fe_set_params,
161 .standby = fe_standby,
162 .release = fe_release,
163 .has_signal = fe_has_signal,
164 .tuner_status = tuner_status
167 /* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
168 static void set_tv_freq(struct i2c_client *c, unsigned int freq)
170 struct tuner *t = i2c_get_clientdata(c);
171 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
173 struct analog_parameters params = {
175 .audmode = t->audmode,
179 if (t->type == UNSET) {
180 tuner_warn ("tuner type not set\n");
183 if ((NULL == ops) || (NULL == ops->set_params)) {
184 tuner_warn ("Tuner has no way to set tv freq\n");
187 if (freq < tv_range[0] * 16 || freq > tv_range[1] * 16) {
188 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
189 freq / 16, freq % 16 * 100 / 16, tv_range[0],
191 /* V4L2 spec: if the freq is not possible then the closest
192 possible value should be selected */
193 if (freq < tv_range[0] * 16)
194 freq = tv_range[0] * 16;
196 freq = tv_range[1] * 16;
198 params.frequency = freq;
200 ops->set_params(&t->fe, ¶ms);
203 static void set_radio_freq(struct i2c_client *c, unsigned int freq)
205 struct tuner *t = i2c_get_clientdata(c);
206 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
208 struct analog_parameters params = {
210 .audmode = t->audmode,
214 if (t->type == UNSET) {
215 tuner_warn ("tuner type not set\n");
218 if ((NULL == ops) || (NULL == ops->set_params)) {
219 tuner_warn ("tuner has no way to set radio frequency\n");
222 if (freq < radio_range[0] * 16000 || freq > radio_range[1] * 16000) {
223 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
224 freq / 16000, freq % 16000 * 100 / 16000,
225 radio_range[0], radio_range[1]);
226 /* V4L2 spec: if the freq is not possible then the closest
227 possible value should be selected */
228 if (freq < radio_range[0] * 16000)
229 freq = radio_range[0] * 16000;
231 freq = radio_range[1] * 16000;
233 params.frequency = freq;
235 ops->set_params(&t->fe, ¶ms);
238 static void set_freq(struct i2c_client *c, unsigned long freq)
240 struct tuner *t = i2c_get_clientdata(c);
243 case V4L2_TUNER_RADIO:
244 tuner_dbg("radio freq set to %lu.%02lu\n",
245 freq / 16000, freq % 16000 * 100 / 16000);
246 set_radio_freq(c, freq);
247 t->radio_freq = freq;
249 case V4L2_TUNER_ANALOG_TV:
250 case V4L2_TUNER_DIGITAL_TV:
251 tuner_dbg("tv freq set to %lu.%02lu\n",
252 freq / 16, freq % 16 * 100 / 16);
253 set_tv_freq(c, freq);
257 tuner_dbg("freq set: unknown mode: 0x%04x!\n",t->mode);
261 static void tuner_i2c_address_check(struct tuner *t)
263 if ((t->type == UNSET || t->type == TUNER_ABSENT) ||
264 ((t->i2c->addr < 0x64) || (t->i2c->addr > 0x6f)))
267 tuner_warn("====================== WARNING! ======================\n");
268 tuner_warn("Support for tuners in i2c address range 0x64 thru 0x6f\n");
269 tuner_warn("will soon be dropped. This message indicates that your\n");
270 tuner_warn("hardware has a %s tuner at i2c address 0x%02x.\n",
271 t->i2c->name, t->i2c->addr);
272 tuner_warn("To ensure continued support for your device, please\n");
273 tuner_warn("send a copy of this message, along with full dmesg\n");
274 tuner_warn("output to v4l-dvb-maintainer@linuxtv.org\n");
275 tuner_warn("Please use subject line: \"obsolete tuner i2c address.\"\n");
276 tuner_warn("driver: %s, addr: 0x%02x, type: %d (%s)\n",
277 t->i2c->adapter->name, t->i2c->addr, t->type,
278 tuners[t->type].name);
279 tuner_warn("====================== WARNING! ======================\n");
282 static void attach_simple_tuner(struct tuner *t)
284 struct simple_tuner_config cfg = {
286 .tun = &tuners[t->type]
288 simple_tuner_attach(&t->fe, t->i2c->adapter, t->i2c->addr, &cfg);
291 static void attach_tda829x(struct tuner *t)
293 struct tda829x_config cfg = {
294 .lna_cfg = &t->config,
295 .tuner_callback = t->tuner_callback,
297 tda829x_attach(&t->fe, t->i2c->adapter, t->i2c->addr, &cfg);
300 static void set_type(struct i2c_client *c, unsigned int type,
301 unsigned int new_mode_mask, unsigned int new_config,
302 int (*tuner_callback) (void *dev, int command,int arg))
304 struct tuner *t = i2c_get_clientdata(c);
305 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
306 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
307 unsigned char buffer[4];
309 if (type == UNSET || type == TUNER_ABSENT) {
310 tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c->addr);
314 if (type >= tuner_count) {
315 tuner_warn ("tuner 0x%02x: Tuner count greater than %d\n",c->addr,tuner_count);
320 t->config = new_config;
321 if (tuner_callback != NULL) {
322 tuner_dbg("defining GPIO callback\n");
323 t->tuner_callback = tuner_callback;
326 if (t->mode == T_UNINITIALIZED) {
327 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c->addr);
332 /* discard private data, in case set_type() was previously called */
333 if (ops && ops->release)
334 ops->release(&t->fe);
338 microtune_attach(&t->fe, t->i2c->adapter, t->i2c->addr);
340 case TUNER_PHILIPS_TDA8290:
346 if (tea5767_attach(&t->fe, t->i2c->adapter, t->i2c->addr) == NULL) {
347 t->type = TUNER_ABSENT;
348 t->mode_mask = T_UNINITIALIZED;
351 t->mode_mask = T_RADIO;
354 if (tea5761_attach(&t->fe, t->i2c->adapter, t->i2c->addr) == NULL) {
355 t->type = TUNER_ABSENT;
356 t->mode_mask = T_UNINITIALIZED;
359 t->mode_mask = T_RADIO;
361 case TUNER_PHILIPS_FMD1216ME_MK3:
366 i2c_master_send(c, buffer, 4);
370 i2c_master_send(c, buffer, 4);
371 attach_simple_tuner(t);
373 case TUNER_PHILIPS_TD1316:
378 i2c_master_send(c,buffer,4);
379 attach_simple_tuner(t);
383 struct xc2028_config cfg = {
384 .i2c_adap = t->i2c->adapter,
385 .i2c_addr = t->i2c->addr,
386 .video_dev = c->adapter->algo_data,
387 .callback = t->tuner_callback,
389 if (!xc2028_attach(&t->fe, &cfg)) {
390 t->type = TUNER_ABSENT;
391 t->mode_mask = T_UNINITIALIZED;
400 attach_simple_tuner(t);
404 ops = t->fe.ops.analog_demod_ops;
406 if (((NULL == ops) || (NULL == ops->set_params)) &&
407 (fe_tuner_ops->set_analog_params)) {
408 strlcpy(t->i2c->name, fe_tuner_ops->info.name,
409 sizeof(t->i2c->name));
411 t->fe.ops.analog_demod_ops = &tuner_core_ops;
412 t->fe.analog_demod_priv = t;
415 tuner_dbg("type set to %s\n", t->i2c->name);
417 if (t->mode_mask == T_UNINITIALIZED)
418 t->mode_mask = new_mode_mask;
420 set_freq(c, (V4L2_TUNER_RADIO == t->mode) ? t->radio_freq : t->tv_freq);
421 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
422 c->adapter->name, c->driver->driver.name, c->addr << 1, type,
424 tuner_i2c_address_check(t);
428 * This function apply tuner config to tuner specified
429 * by tun_setup structure. I addr is unset, then admin status
430 * and tun addr status is more precise then current status,
431 * it's applied. Otherwise status and type are applied only to
432 * tuner with exactly the same addr.
435 static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup)
437 struct tuner *t = i2c_get_clientdata(c);
439 tuner_dbg("set addr for type %i\n", t->type);
441 if ( (t->type == UNSET && ((tun_setup->addr == ADDR_UNSET) &&
442 (t->mode_mask & tun_setup->mode_mask))) ||
443 (tun_setup->addr == c->addr)) {
444 set_type(c, tun_setup->type, tun_setup->mode_mask,
445 tun_setup->config, tun_setup->tuner_callback);
449 static inline int check_mode(struct tuner *t, char *cmd)
451 if ((1 << t->mode & t->mode_mask) == 0) {
456 case V4L2_TUNER_RADIO:
457 tuner_dbg("Cmd %s accepted for radio\n", cmd);
459 case V4L2_TUNER_ANALOG_TV:
460 tuner_dbg("Cmd %s accepted for analog TV\n", cmd);
462 case V4L2_TUNER_DIGITAL_TV:
463 tuner_dbg("Cmd %s accepted for digital TV\n", cmd);
469 /* get more precise norm info from insmod option */
470 static int tuner_fixup_std(struct tuner *t)
472 if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) {
475 tuner_dbg ("insmod fixup: PAL => PAL-60\n");
476 t->std = V4L2_STD_PAL_60;
482 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
483 t->std = V4L2_STD_PAL_BG;
487 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
488 t->std = V4L2_STD_PAL_I;
494 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
495 t->std = V4L2_STD_PAL_DK;
499 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
500 t->std = V4L2_STD_PAL_M;
504 if (pal[1] == 'c' || pal[1] == 'C') {
505 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
506 t->std = V4L2_STD_PAL_Nc;
508 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
509 t->std = V4L2_STD_PAL_N;
513 /* default parameter, do nothing */
516 tuner_warn ("pal= argument not recognised\n");
520 if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
528 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
529 t->std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H;
535 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
536 t->std = V4L2_STD_SECAM_DK;
540 if ((secam[1]=='C')||(secam[1]=='c')) {
541 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
542 t->std = V4L2_STD_SECAM_LC;
544 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
545 t->std = V4L2_STD_SECAM_L;
549 /* default parameter, do nothing */
552 tuner_warn ("secam= argument not recognised\n");
557 if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
561 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
562 t->std = V4L2_STD_NTSC_M;
566 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
567 t->std = V4L2_STD_NTSC_M_JP;
571 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
572 t->std = V4L2_STD_NTSC_M_KR;
575 /* default parameter, do nothing */
578 tuner_info("ntsc= argument not recognised\n");
585 static void tuner_status(struct dvb_frontend *fe)
587 struct tuner *t = fe->analog_demod_priv;
588 unsigned long freq, freq_fraction;
589 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
590 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
594 case V4L2_TUNER_RADIO: p = "radio"; break;
595 case V4L2_TUNER_ANALOG_TV: p = "analog TV"; break;
596 case V4L2_TUNER_DIGITAL_TV: p = "digital TV"; break;
597 default: p = "undefined"; break;
599 if (t->mode == V4L2_TUNER_RADIO) {
600 freq = t->radio_freq / 16000;
601 freq_fraction = (t->radio_freq % 16000) * 100 / 16000;
603 freq = t->tv_freq / 16;
604 freq_fraction = (t->tv_freq % 16) * 100 / 16;
606 tuner_info("Tuner mode: %s\n", p);
607 tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction);
608 tuner_info("Standard: 0x%08lx\n", (unsigned long)t->std);
609 if (t->mode != V4L2_TUNER_RADIO)
611 if (fe_tuner_ops->get_status) {
614 fe_tuner_ops->get_status(&t->fe, &tuner_status);
615 if (tuner_status & TUNER_STATUS_LOCKED)
616 tuner_info("Tuner is locked.\n");
617 if (tuner_status & TUNER_STATUS_STEREO)
618 tuner_info("Stereo: yes\n");
622 tuner_info("Signal strength: %d\n",
623 ops->has_signal(fe));
625 tuner_info("Stereo: %s\n",
626 ops->is_stereo(fe) ? "yes" : "no");
630 /* ---------------------------------------------------------------------- */
633 * Switch tuner to other mode. If tuner support both tv and radio,
634 * set another frequency to some value (This is needed for some pal
635 * tuners to avoid locking). Otherwise, just put second tuner in
639 static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, char *cmd)
641 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
648 if (check_mode(t, cmd) == EINVAL) {
650 if (ops && ops->standby)
651 ops->standby(&t->fe);
657 #define switch_v4l2() if (!t->using_v4l2) \
658 tuner_dbg("switching to v4l2\n"); \
661 static inline int check_v4l2(struct tuner *t)
663 /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
664 TV, v4l1 for radio), until that is fixed this code is disabled.
665 Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
670 static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
672 struct tuner *t = i2c_get_clientdata(client);
673 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
674 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
677 v4l_i2c_print_ioctl(client,cmd);
680 /* --- configuration --- */
681 case TUNER_SET_TYPE_ADDR:
682 tuner_dbg ("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
683 ((struct tuner_setup *)arg)->type,
684 ((struct tuner_setup *)arg)->addr,
685 ((struct tuner_setup *)arg)->mode_mask,
686 ((struct tuner_setup *)arg)->config);
688 set_addr(client, (struct tuner_setup *)arg);
691 if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO")
695 set_freq(client, t->radio_freq);
697 case TUNER_SET_STANDBY:
698 if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL)
701 if (ops && ops->standby)
702 ops->standby(&t->fe);
704 #ifdef CONFIG_VIDEO_V4L1
706 if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
708 if (check_v4l2(t) == EINVAL)
711 /* Should be implemented, since bttv calls it */
712 tuner_dbg("VIDIOCSAUDIO not implemented.\n");
716 static const v4l2_std_id map[] = {
717 [VIDEO_MODE_PAL] = V4L2_STD_PAL,
718 [VIDEO_MODE_NTSC] = V4L2_STD_NTSC_M,
719 [VIDEO_MODE_SECAM] = V4L2_STD_SECAM,
720 [4 /* bttv */ ] = V4L2_STD_PAL_M,
721 [5 /* bttv */ ] = V4L2_STD_PAL_N,
722 [6 /* bttv */ ] = V4L2_STD_NTSC_M_JP,
724 struct video_channel *vc = arg;
726 if (check_v4l2(t) == EINVAL)
729 if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==EINVAL)
732 if (vc->norm < ARRAY_SIZE(map))
733 t->std = map[vc->norm];
736 set_tv_freq(client, t->tv_freq);
741 unsigned long *v = arg;
743 if (check_mode(t, "VIDIOCSFREQ") == EINVAL)
745 if (check_v4l2(t) == EINVAL)
748 set_freq(client, *v);
753 struct video_tuner *vt = arg;
755 if (check_mode(t, "VIDIOCGTUNER") == EINVAL)
757 if (check_v4l2(t) == EINVAL)
760 if (V4L2_TUNER_RADIO == t->mode) {
761 if (fe_tuner_ops->get_status) {
764 fe_tuner_ops->get_status(&t->fe, &tuner_status);
765 if (tuner_status & TUNER_STATUS_STEREO)
766 vt->flags |= VIDEO_TUNER_STEREO_ON;
768 vt->flags &= ~VIDEO_TUNER_STEREO_ON;
770 if (ops && ops->is_stereo) {
771 if (ops->is_stereo(&t->fe))
773 VIDEO_TUNER_STEREO_ON;
776 ~VIDEO_TUNER_STEREO_ON;
779 if (ops && ops->has_signal)
780 vt->signal = ops->has_signal(&t->fe);
782 vt->flags |= VIDEO_TUNER_LOW; /* Allow freqs at 62.5 Hz */
784 vt->rangelow = radio_range[0] * 16000;
785 vt->rangehigh = radio_range[1] * 16000;
788 vt->rangelow = tv_range[0] * 16;
789 vt->rangehigh = tv_range[1] * 16;
796 struct video_audio *va = arg;
798 if (check_mode(t, "VIDIOCGAUDIO") == EINVAL)
800 if (check_v4l2(t) == EINVAL)
803 if (V4L2_TUNER_RADIO == t->mode) {
804 if (fe_tuner_ops->get_status) {
807 fe_tuner_ops->get_status(&t->fe, &tuner_status);
808 va->mode = (tuner_status & TUNER_STATUS_STEREO)
809 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
810 } else if (ops && ops->is_stereo)
811 va->mode = ops->is_stereo(&t->fe)
812 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
817 case TUNER_SET_CONFIG:
819 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
820 struct v4l2_priv_tun_config *cfg = arg;
822 if (t->type != cfg->tuner)
825 if (t->type == TUNER_TDA9887) {
826 t->tda9887_config = *(unsigned int *)cfg->priv;
827 set_freq(client, t->tv_freq);
831 if (NULL == fe_tuner_ops->set_config) {
832 tuner_warn("Tuner frontend module has no way to "
836 fe_tuner_ops->set_config(&t->fe, cfg->priv);
840 /* --- v4l ioctls --- */
841 /* take care: bttv does userspace copying, we'll get a
842 kernel pointer here... */
845 v4l2_std_id *id = arg;
847 if (set_mode (client, t, V4L2_TUNER_ANALOG_TV, "VIDIOC_S_STD")
856 set_freq(client, t->tv_freq);
859 case VIDIOC_S_FREQUENCY:
861 struct v4l2_frequency *f = arg;
863 if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
867 set_freq(client,f->frequency);
871 case VIDIOC_G_FREQUENCY:
873 struct v4l2_frequency *f = arg;
875 if (check_mode(t, "VIDIOC_G_FREQUENCY") == EINVAL)
879 if (fe_tuner_ops->get_frequency) {
882 fe_tuner_ops->get_frequency(&t->fe, &abs_freq);
883 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
884 (abs_freq * 2 + 125/2) / 125 :
885 (abs_freq + 62500/2) / 62500;
888 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
889 t->radio_freq : t->tv_freq;
894 struct v4l2_tuner *tuner = arg;
896 if (check_mode(t, "VIDIOC_G_TUNER") == EINVAL)
900 tuner->type = t->mode;
901 if (ops && ops->get_afc)
902 tuner->afc = ops->get_afc(&t->fe);
903 if (t->mode == V4L2_TUNER_ANALOG_TV)
904 tuner->capability |= V4L2_TUNER_CAP_NORM;
905 if (t->mode != V4L2_TUNER_RADIO) {
906 tuner->rangelow = tv_range[0] * 16;
907 tuner->rangehigh = tv_range[1] * 16;
913 V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
914 if (fe_tuner_ops->get_status) {
917 fe_tuner_ops->get_status(&t->fe, &tuner_status);
919 (tuner_status & TUNER_STATUS_STEREO) ?
920 V4L2_TUNER_SUB_STEREO :
923 if (ops && ops->is_stereo) {
925 ops->is_stereo(&t->fe) ?
926 V4L2_TUNER_SUB_STEREO :
930 if (ops && ops->has_signal)
931 tuner->signal = ops->has_signal(&t->fe);
933 V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
934 tuner->audmode = t->audmode;
935 tuner->rangelow = radio_range[0] * 16000;
936 tuner->rangehigh = radio_range[1] * 16000;
941 struct v4l2_tuner *tuner = arg;
943 if (check_mode(t, "VIDIOC_S_TUNER") == EINVAL)
948 /* do nothing unless we're a radio tuner */
949 if (t->mode != V4L2_TUNER_RADIO)
951 t->audmode = tuner->audmode;
952 set_radio_freq(client, t->radio_freq);
955 case VIDIOC_LOG_STATUS:
956 if (ops && ops->tuner_status)
957 ops->tuner_status(&t->fe);
964 static int tuner_suspend(struct i2c_client *c, pm_message_t state)
966 struct tuner *t = i2c_get_clientdata(c);
968 tuner_dbg("suspend\n");
969 /* FIXME: power down ??? */
973 static int tuner_resume(struct i2c_client *c)
975 struct tuner *t = i2c_get_clientdata(c);
977 tuner_dbg("resume\n");
978 if (V4L2_TUNER_RADIO == t->mode) {
980 set_freq(c, t->radio_freq);
983 set_freq(c, t->tv_freq);
988 /* ---------------------------------------------------------------------- */
990 LIST_HEAD(tuner_list);
992 /* Search for existing radio and/or TV tuners on the given I2C adapter.
993 Note that when this function is called from tuner_probe you can be
994 certain no other devices will be added/deleted at the same time, I2C
995 core protects against that. */
996 static void tuner_lookup(struct i2c_adapter *adap,
997 struct tuner **radio, struct tuner **tv)
1004 list_for_each_entry(pos, &tuner_list, list) {
1007 if (pos->i2c->adapter != adap ||
1008 pos->i2c->driver->id != I2C_DRIVERID_TUNER)
1011 mode_mask = pos->mode_mask & ~T_STANDBY;
1012 if (*radio == NULL && mode_mask == T_RADIO)
1014 /* Note: currently TDA9887 is the only demod-only
1015 device. If other devices appear then we need to
1016 make this test more general. */
1017 else if (*tv == NULL && pos->type != TUNER_TDA9887 &&
1018 (pos->mode_mask & (T_ANALOG_TV | T_DIGITAL_TV)))
1023 /* During client attach, set_type is called by adapter's attach_inform callback.
1024 set_type must then be completed by tuner_probe.
1026 static int tuner_probe(struct i2c_client *client)
1029 struct tuner *radio;
1032 t = kzalloc(sizeof(struct tuner), GFP_KERNEL);
1036 strlcpy(client->name, "(tuner unset)", sizeof(client->name));
1037 i2c_set_clientdata(client, t);
1039 t->audmode = V4L2_TUNER_MODE_STEREO;
1040 t->mode_mask = T_UNINITIALIZED;
1043 unsigned char buffer[16];
1046 memset(buffer, 0, sizeof(buffer));
1047 rc = i2c_master_recv(client, buffer, sizeof(buffer));
1048 tuner_info("I2C RECV = ");
1049 for (i = 0; i < rc; i++)
1050 printk(KERN_CONT "%02x ", buffer[i]);
1053 /* HACK: This test was added to avoid tuner to probe tda9840 and
1054 tea6415c on the MXB card */
1055 if (client->adapter->id == I2C_HW_SAA7146 && client->addr < 0x4a) {
1060 /* autodetection code based on the i2c addr */
1061 if (!no_autodetect) {
1062 switch (client->addr) {
1064 if (tea5761_autodetection(t->i2c->adapter, t->i2c->addr)
1066 t->type = TUNER_TEA5761;
1067 t->mode_mask = T_RADIO;
1068 t->mode = T_STANDBY;
1069 /* Sets freq to FM range */
1070 t->radio_freq = 87.5 * 16000;
1071 tuner_lookup(t->i2c->adapter, &radio, &tv);
1073 tv->mode_mask &= ~T_RADIO;
1075 goto register_client;
1082 /* If chip is not tda8290, don't register.
1083 since it can be tda9887*/
1084 if (tda829x_probe(t->i2c->adapter,
1085 t->i2c->addr) == 0) {
1086 tuner_dbg("tda829x detected\n");
1088 /* Default is being tda9887 */
1089 t->type = TUNER_TDA9887;
1090 t->mode_mask = T_RADIO | T_ANALOG_TV |
1092 t->mode = T_STANDBY;
1093 goto register_client;
1097 if (tea5767_autodetection(t->i2c->adapter, t->i2c->addr)
1099 t->type = TUNER_TEA5767;
1100 t->mode_mask = T_RADIO;
1101 t->mode = T_STANDBY;
1102 /* Sets freq to FM range */
1103 t->radio_freq = 87.5 * 16000;
1104 tuner_lookup(t->i2c->adapter, &radio, &tv);
1106 tv->mode_mask &= ~T_RADIO;
1108 goto register_client;
1114 /* Initializes only the first TV tuner on this adapter. Why only the
1115 first? Because there are some devices (notably the ones with TI
1116 tuners) that have more than one i2c address for the *same* device.
1117 Experience shows that, except for just one case, the first
1118 address is the right one. The exception is a Russian tuner
1119 (ACORP_Y878F). So, the desired behavior is just to enable the
1120 first found TV tuner. */
1121 tuner_lookup(t->i2c->adapter, &radio, &tv);
1123 t->mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
1125 t->mode_mask |= T_RADIO;
1126 tuner_dbg("Setting mode_mask to 0x%02x\n", t->mode_mask);
1127 t->tv_freq = 400 * 16; /* Sets freq to VHF High */
1128 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
1131 /* Should be just before return */
1133 tuner_info("chip found @ 0x%x (%s)\n", client->addr << 1,
1134 client->adapter->name);
1136 /* Sets a default mode */
1137 if (t->mode_mask & T_ANALOG_TV) {
1138 t->mode = T_ANALOG_TV;
1139 } else if (t->mode_mask & T_RADIO) {
1142 t->mode = T_DIGITAL_TV;
1144 set_type(client, t->type, t->mode_mask, t->config, t->tuner_callback);
1145 list_add_tail(&t->list, &tuner_list);
1149 static int tuner_legacy_probe(struct i2c_adapter *adap)
1152 normal_i2c[0] = addr;
1153 normal_i2c[1] = I2C_CLIENT_END;
1156 if ((adap->class & I2C_CLASS_TV_ANALOG) == 0)
1159 /* HACK: Ignore 0x6b and 0x6f on cx88 boards.
1160 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
1161 * and an RTC at 0x6f which can get corrupted if probed.
1163 if ((adap->id == I2C_HW_B_CX2388x) ||
1164 (adap->id == I2C_HW_B_CX23885)) {
1167 while (i < I2C_CLIENT_MAX_OPTS && ignore[i] != I2C_CLIENT_END)
1169 if (i + 4 < I2C_CLIENT_MAX_OPTS) {
1170 ignore[i+0] = adap->nr;
1172 ignore[i+2] = adap->nr;
1174 ignore[i+4] = I2C_CLIENT_END;
1176 printk(KERN_WARNING "tuner: "
1177 "too many options specified "
1178 "in i2c probe ignore list!\n");
1183 static int tuner_remove(struct i2c_client *client)
1185 struct tuner *t = i2c_get_clientdata(client);
1186 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
1188 if (ops && ops->release)
1189 ops->release(&t->fe);
1196 /* ----------------------------------------------------------------------- */
1198 static struct v4l2_i2c_driver_data v4l2_i2c_data = {
1200 .driverid = I2C_DRIVERID_TUNER,
1201 .command = tuner_command,
1202 .probe = tuner_probe,
1203 .remove = tuner_remove,
1204 .suspend = tuner_suspend,
1205 .resume = tuner_resume,
1206 .legacy_probe = tuner_legacy_probe,
1211 * Overrides for Emacs so that we follow Linus's tabbing style.
1212 * ---------------------------------------------------------------------------