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
38 struct dvb_frontend fe
;
39 struct i2c_client
*i2c
;
40 struct list_head list
;
41 unsigned int using_v4l2
:1;
43 /* keep track of the current settings */
46 unsigned int radio_freq
;
50 unsigned int mode_mask
; /* Combination of allowable modes */
52 unsigned int type
; /* chip type id */
54 int (*tuner_callback
) (void *dev
, int command
, int arg
);
57 /* standard i2c insmod options */
58 static unsigned short normal_i2c
[] = {
59 #if defined(CONFIG_TUNER_TEA5761) || (defined(CONFIG_TUNER_TEA5761_MODULE) && defined(MODULE))
62 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
63 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
64 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
70 /* insmod options used at init time => read/only */
71 static unsigned int addr
= 0;
72 static unsigned int no_autodetect
= 0;
73 static unsigned int show_i2c
= 0;
75 /* insmod options used at runtime => read/write */
76 static int tuner_debug
;
78 #define tuner_warn(fmt, arg...) do { \
79 printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
80 i2c_adapter_id(t->i2c->adapter), \
81 t->i2c->addr, ##arg); \
84 #define tuner_info(fmt, arg...) do { \
85 printk(KERN_INFO "%s %d-%04x: " fmt, PREFIX, \
86 i2c_adapter_id(t->i2c->adapter), \
87 t->i2c->addr, ##arg); \
90 #define tuner_err(fmt, arg...) do { \
91 printk(KERN_ERR "%s %d-%04x: " fmt, PREFIX, \
92 i2c_adapter_id(t->i2c->adapter), \
93 t->i2c->addr, ##arg); \
96 #define tuner_dbg(fmt, arg...) do { \
98 printk(KERN_DEBUG "%s %d-%04x: " fmt, PREFIX, \
99 i2c_adapter_id(t->i2c->adapter), \
100 t->i2c->addr, ##arg); \
103 /* ------------------------------------------------------------------------ */
105 static unsigned int tv_range
[2] = { 44, 958 };
106 static unsigned int radio_range
[2] = { 65, 108 };
108 static char pal
[] = "--";
109 static char secam
[] = "--";
110 static char ntsc
[] = "-";
113 module_param(addr
, int, 0444);
114 module_param(no_autodetect
, int, 0444);
115 module_param(show_i2c
, int, 0444);
116 module_param_named(debug
,tuner_debug
, int, 0644);
117 module_param_string(pal
, pal
, sizeof(pal
), 0644);
118 module_param_string(secam
, secam
, sizeof(secam
), 0644);
119 module_param_string(ntsc
, ntsc
, sizeof(ntsc
), 0644);
120 module_param_array(tv_range
, int, NULL
, 0644);
121 module_param_array(radio_range
, int, NULL
, 0644);
123 MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
124 MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
125 MODULE_LICENSE("GPL");
127 /* ---------------------------------------------------------------------- */
129 static void fe_set_params(struct dvb_frontend
*fe
,
130 struct analog_parameters
*params
)
132 struct dvb_tuner_ops
*fe_tuner_ops
= &fe
->ops
.tuner_ops
;
133 struct tuner
*t
= fe
->analog_demod_priv
;
135 if (NULL
== fe_tuner_ops
->set_analog_params
) {
136 tuner_warn("Tuner frontend module has no way to set freq\n");
139 fe_tuner_ops
->set_analog_params(fe
, params
);
142 static void fe_release(struct dvb_frontend
*fe
)
144 if (fe
->ops
.tuner_ops
.release
)
145 fe
->ops
.tuner_ops
.release(fe
);
147 fe
->ops
.analog_demod_ops
= NULL
;
149 /* DO NOT kfree(fe->analog_demod_priv)
151 * If we are in this function, analog_demod_priv contains a pointer
152 * to struct tuner *t. This will be kfree'd in tuner_detach().
154 * Otherwise, fe->ops.analog_demod_ops->release will
155 * handle the cleanup for analog demodulator modules.
157 fe
->analog_demod_priv
= NULL
;
160 static void fe_standby(struct dvb_frontend
*fe
)
162 struct dvb_tuner_ops
*fe_tuner_ops
= &fe
->ops
.tuner_ops
;
164 if (fe_tuner_ops
->sleep
)
165 fe_tuner_ops
->sleep(fe
);
168 static int fe_has_signal(struct dvb_frontend
*fe
)
172 if (fe
->ops
.tuner_ops
.get_rf_strength
)
173 fe
->ops
.tuner_ops
.get_rf_strength(fe
, &strength
);
178 static int fe_set_config(struct dvb_frontend
*fe
, void *priv_cfg
)
180 struct dvb_tuner_ops
*fe_tuner_ops
= &fe
->ops
.tuner_ops
;
181 struct tuner
*t
= fe
->analog_demod_priv
;
183 if (fe_tuner_ops
->set_config
)
184 return fe_tuner_ops
->set_config(fe
, priv_cfg
);
186 tuner_warn("Tuner frontend module has no way to set config\n");
191 static void tuner_status(struct dvb_frontend
*fe
);
193 static struct analog_tuner_ops tuner_core_ops
= {
194 .set_params
= fe_set_params
,
195 .standby
= fe_standby
,
196 .release
= fe_release
,
197 .has_signal
= fe_has_signal
,
198 .set_config
= fe_set_config
,
199 .tuner_status
= tuner_status
202 /* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
203 static void set_tv_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 tv freq\n");
222 if (freq
< tv_range
[0] * 16 || freq
> tv_range
[1] * 16) {
223 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
224 freq
/ 16, freq
% 16 * 100 / 16, tv_range
[0],
226 /* V4L2 spec: if the freq is not possible then the closest
227 possible value should be selected */
228 if (freq
< tv_range
[0] * 16)
229 freq
= tv_range
[0] * 16;
231 freq
= tv_range
[1] * 16;
233 params
.frequency
= freq
;
235 ops
->set_params(&t
->fe
, ¶ms
);
238 static void set_radio_freq(struct i2c_client
*c
, unsigned int freq
)
240 struct tuner
*t
= i2c_get_clientdata(c
);
241 struct analog_tuner_ops
*ops
= t
->fe
.ops
.analog_demod_ops
;
243 struct analog_parameters params
= {
245 .audmode
= t
->audmode
,
249 if (t
->type
== UNSET
) {
250 tuner_warn ("tuner type not set\n");
253 if ((NULL
== ops
) || (NULL
== ops
->set_params
)) {
254 tuner_warn ("tuner has no way to set radio frequency\n");
257 if (freq
< radio_range
[0] * 16000 || freq
> radio_range
[1] * 16000) {
258 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
259 freq
/ 16000, freq
% 16000 * 100 / 16000,
260 radio_range
[0], radio_range
[1]);
261 /* V4L2 spec: if the freq is not possible then the closest
262 possible value should be selected */
263 if (freq
< radio_range
[0] * 16000)
264 freq
= radio_range
[0] * 16000;
266 freq
= radio_range
[1] * 16000;
268 params
.frequency
= freq
;
270 ops
->set_params(&t
->fe
, ¶ms
);
273 static void set_freq(struct i2c_client
*c
, unsigned long freq
)
275 struct tuner
*t
= i2c_get_clientdata(c
);
278 case V4L2_TUNER_RADIO
:
279 tuner_dbg("radio freq set to %lu.%02lu\n",
280 freq
/ 16000, freq
% 16000 * 100 / 16000);
281 set_radio_freq(c
, freq
);
282 t
->radio_freq
= freq
;
284 case V4L2_TUNER_ANALOG_TV
:
285 case V4L2_TUNER_DIGITAL_TV
:
286 tuner_dbg("tv freq set to %lu.%02lu\n",
287 freq
/ 16, freq
% 16 * 100 / 16);
288 set_tv_freq(c
, freq
);
292 tuner_dbg("freq set: unknown mode: 0x%04x!\n",t
->mode
);
296 static void tuner_i2c_address_check(struct tuner
*t
)
298 if ((t
->type
== UNSET
|| t
->type
== TUNER_ABSENT
) ||
299 ((t
->i2c
->addr
< 0x64) || (t
->i2c
->addr
> 0x6f)))
302 tuner_warn("====================== WARNING! ======================\n");
303 tuner_warn("Support for tuners in i2c address range 0x64 thru 0x6f\n");
304 tuner_warn("will soon be dropped. This message indicates that your\n");
305 tuner_warn("hardware has a %s tuner at i2c address 0x%02x.\n",
306 t
->i2c
->name
, t
->i2c
->addr
);
307 tuner_warn("To ensure continued support for your device, please\n");
308 tuner_warn("send a copy of this message, along with full dmesg\n");
309 tuner_warn("output to v4l-dvb-maintainer@linuxtv.org\n");
310 tuner_warn("Please use subject line: \"obsolete tuner i2c address.\"\n");
311 tuner_warn("driver: %s, addr: 0x%02x, type: %d (%s)\n",
312 t
->i2c
->adapter
->name
, t
->i2c
->addr
, t
->type
,
313 tuners
[t
->type
].name
);
314 tuner_warn("====================== WARNING! ======================\n");
317 static void attach_simple_tuner(struct tuner
*t
)
319 struct simple_tuner_config cfg
= {
321 .tun
= &tuners
[t
->type
]
323 simple_tuner_attach(&t
->fe
, t
->i2c
->adapter
, t
->i2c
->addr
, &cfg
);
326 static void attach_tda829x(struct tuner
*t
)
328 struct tda829x_config cfg
= {
329 .lna_cfg
= &t
->config
,
330 .tuner_callback
= t
->tuner_callback
,
332 tda829x_attach(&t
->fe
, t
->i2c
->adapter
, t
->i2c
->addr
, &cfg
);
335 static void set_type(struct i2c_client
*c
, unsigned int type
,
336 unsigned int new_mode_mask
, unsigned int new_config
,
337 int (*tuner_callback
) (void *dev
, int command
,int arg
))
339 struct tuner
*t
= i2c_get_clientdata(c
);
340 struct dvb_tuner_ops
*fe_tuner_ops
= &t
->fe
.ops
.tuner_ops
;
341 struct analog_tuner_ops
*ops
= t
->fe
.ops
.analog_demod_ops
;
342 unsigned char buffer
[4];
344 if (type
== UNSET
|| type
== TUNER_ABSENT
) {
345 tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c
->addr
);
349 if (type
>= tuner_count
) {
350 tuner_warn ("tuner 0x%02x: Tuner count greater than %d\n",c
->addr
,tuner_count
);
355 t
->config
= new_config
;
356 if (tuner_callback
!= NULL
) {
357 tuner_dbg("defining GPIO callback\n");
358 t
->tuner_callback
= tuner_callback
;
361 if (t
->mode
== T_UNINITIALIZED
) {
362 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c
->addr
);
367 /* discard private data, in case set_type() was previously called */
368 if (ops
&& ops
->release
)
369 ops
->release(&t
->fe
);
373 microtune_attach(&t
->fe
, t
->i2c
->adapter
, t
->i2c
->addr
);
375 case TUNER_PHILIPS_TDA8290
:
381 if (tea5767_attach(&t
->fe
, t
->i2c
->adapter
, t
->i2c
->addr
) == NULL
) {
382 t
->type
= TUNER_ABSENT
;
383 t
->mode_mask
= T_UNINITIALIZED
;
386 t
->mode_mask
= T_RADIO
;
389 if (tea5761_attach(&t
->fe
, t
->i2c
->adapter
, t
->i2c
->addr
) == NULL
) {
390 t
->type
= TUNER_ABSENT
;
391 t
->mode_mask
= T_UNINITIALIZED
;
394 t
->mode_mask
= T_RADIO
;
396 case TUNER_PHILIPS_FMD1216ME_MK3
:
401 i2c_master_send(c
, buffer
, 4);
405 i2c_master_send(c
, buffer
, 4);
406 attach_simple_tuner(t
);
408 case TUNER_PHILIPS_TD1316
:
413 i2c_master_send(c
,buffer
,4);
414 attach_simple_tuner(t
);
418 struct xc2028_config cfg
= {
419 .i2c_adap
= t
->i2c
->adapter
,
420 .i2c_addr
= t
->i2c
->addr
,
421 .video_dev
= c
->adapter
->algo_data
,
422 .callback
= t
->tuner_callback
,
424 if (!xc2028_attach(&t
->fe
, &cfg
)) {
425 t
->type
= TUNER_ABSENT
;
426 t
->mode_mask
= T_UNINITIALIZED
;
432 tda9887_attach(&t
->fe
, t
->i2c
->adapter
, t
->i2c
->addr
);
435 attach_simple_tuner(t
);
439 ops
= t
->fe
.ops
.analog_demod_ops
;
441 if (((NULL
== ops
) || (NULL
== ops
->set_params
)) &&
442 (fe_tuner_ops
->set_analog_params
)) {
443 strlcpy(t
->i2c
->name
, fe_tuner_ops
->info
.name
,
444 sizeof(t
->i2c
->name
));
446 t
->fe
.ops
.analog_demod_ops
= &tuner_core_ops
;
447 t
->fe
.analog_demod_priv
= t
;
449 strlcpy(t
->i2c
->name
, ops
->info
.name
,
450 sizeof(t
->i2c
->name
));
453 tuner_dbg("type set to %s\n", t
->i2c
->name
);
455 if (t
->mode_mask
== T_UNINITIALIZED
)
456 t
->mode_mask
= new_mode_mask
;
458 set_freq(c
, (V4L2_TUNER_RADIO
== t
->mode
) ? t
->radio_freq
: t
->tv_freq
);
459 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
460 c
->adapter
->name
, c
->driver
->driver
.name
, c
->addr
<< 1, type
,
462 tuner_i2c_address_check(t
);
466 * This function apply tuner config to tuner specified
467 * by tun_setup structure. I addr is unset, then admin status
468 * and tun addr status is more precise then current status,
469 * it's applied. Otherwise status and type are applied only to
470 * tuner with exactly the same addr.
473 static void set_addr(struct i2c_client
*c
, struct tuner_setup
*tun_setup
)
475 struct tuner
*t
= i2c_get_clientdata(c
);
477 tuner_dbg("set addr for type %i\n", t
->type
);
479 if ( (t
->type
== UNSET
&& ((tun_setup
->addr
== ADDR_UNSET
) &&
480 (t
->mode_mask
& tun_setup
->mode_mask
))) ||
481 (tun_setup
->addr
== c
->addr
)) {
482 set_type(c
, tun_setup
->type
, tun_setup
->mode_mask
,
483 tun_setup
->config
, tun_setup
->tuner_callback
);
487 static inline int check_mode(struct tuner
*t
, char *cmd
)
489 if ((1 << t
->mode
& t
->mode_mask
) == 0) {
494 case V4L2_TUNER_RADIO
:
495 tuner_dbg("Cmd %s accepted for radio\n", cmd
);
497 case V4L2_TUNER_ANALOG_TV
:
498 tuner_dbg("Cmd %s accepted for analog TV\n", cmd
);
500 case V4L2_TUNER_DIGITAL_TV
:
501 tuner_dbg("Cmd %s accepted for digital TV\n", cmd
);
507 /* get more precise norm info from insmod option */
508 static int tuner_fixup_std(struct tuner
*t
)
510 if ((t
->std
& V4L2_STD_PAL
) == V4L2_STD_PAL
) {
513 tuner_dbg ("insmod fixup: PAL => PAL-60\n");
514 t
->std
= V4L2_STD_PAL_60
;
520 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
521 t
->std
= V4L2_STD_PAL_BG
;
525 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
526 t
->std
= V4L2_STD_PAL_I
;
532 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
533 t
->std
= V4L2_STD_PAL_DK
;
537 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
538 t
->std
= V4L2_STD_PAL_M
;
542 if (pal
[1] == 'c' || pal
[1] == 'C') {
543 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
544 t
->std
= V4L2_STD_PAL_Nc
;
546 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
547 t
->std
= V4L2_STD_PAL_N
;
551 /* default parameter, do nothing */
554 tuner_warn ("pal= argument not recognised\n");
558 if ((t
->std
& V4L2_STD_SECAM
) == V4L2_STD_SECAM
) {
566 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
567 t
->std
= V4L2_STD_SECAM_B
| V4L2_STD_SECAM_G
| V4L2_STD_SECAM_H
;
573 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
574 t
->std
= V4L2_STD_SECAM_DK
;
578 if ((secam
[1]=='C')||(secam
[1]=='c')) {
579 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
580 t
->std
= V4L2_STD_SECAM_LC
;
582 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
583 t
->std
= V4L2_STD_SECAM_L
;
587 /* default parameter, do nothing */
590 tuner_warn ("secam= argument not recognised\n");
595 if ((t
->std
& V4L2_STD_NTSC
) == V4L2_STD_NTSC
) {
599 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
600 t
->std
= V4L2_STD_NTSC_M
;
604 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
605 t
->std
= V4L2_STD_NTSC_M_JP
;
609 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
610 t
->std
= V4L2_STD_NTSC_M_KR
;
613 /* default parameter, do nothing */
616 tuner_info("ntsc= argument not recognised\n");
623 static void tuner_status(struct dvb_frontend
*fe
)
625 struct tuner
*t
= fe
->analog_demod_priv
;
626 unsigned long freq
, freq_fraction
;
627 struct dvb_tuner_ops
*fe_tuner_ops
= &t
->fe
.ops
.tuner_ops
;
628 struct analog_tuner_ops
*ops
= t
->fe
.ops
.analog_demod_ops
;
632 case V4L2_TUNER_RADIO
: p
= "radio"; break;
633 case V4L2_TUNER_ANALOG_TV
: p
= "analog TV"; break;
634 case V4L2_TUNER_DIGITAL_TV
: p
= "digital TV"; break;
635 default: p
= "undefined"; break;
637 if (t
->mode
== V4L2_TUNER_RADIO
) {
638 freq
= t
->radio_freq
/ 16000;
639 freq_fraction
= (t
->radio_freq
% 16000) * 100 / 16000;
641 freq
= t
->tv_freq
/ 16;
642 freq_fraction
= (t
->tv_freq
% 16) * 100 / 16;
644 tuner_info("Tuner mode: %s\n", p
);
645 tuner_info("Frequency: %lu.%02lu MHz\n", freq
, freq_fraction
);
646 tuner_info("Standard: 0x%08lx\n", (unsigned long)t
->std
);
647 if (t
->mode
!= V4L2_TUNER_RADIO
)
649 if (fe_tuner_ops
->get_status
) {
652 fe_tuner_ops
->get_status(&t
->fe
, &tuner_status
);
653 if (tuner_status
& TUNER_STATUS_LOCKED
)
654 tuner_info("Tuner is locked.\n");
655 if (tuner_status
& TUNER_STATUS_STEREO
)
656 tuner_info("Stereo: yes\n");
660 tuner_info("Signal strength: %d\n",
661 ops
->has_signal(fe
));
663 tuner_info("Stereo: %s\n",
664 ops
->is_stereo(fe
) ? "yes" : "no");
668 /* ---------------------------------------------------------------------- */
671 * Switch tuner to other mode. If tuner support both tv and radio,
672 * set another frequency to some value (This is needed for some pal
673 * tuners to avoid locking). Otherwise, just put second tuner in
677 static inline int set_mode(struct i2c_client
*client
, struct tuner
*t
, int mode
, char *cmd
)
679 struct analog_tuner_ops
*ops
= t
->fe
.ops
.analog_demod_ops
;
686 if (check_mode(t
, cmd
) == EINVAL
) {
688 if (ops
&& ops
->standby
)
689 ops
->standby(&t
->fe
);
695 #define switch_v4l2() if (!t->using_v4l2) \
696 tuner_dbg("switching to v4l2\n"); \
699 static inline int check_v4l2(struct tuner
*t
)
701 /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
702 TV, v4l1 for radio), until that is fixed this code is disabled.
703 Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
708 static int tuner_command(struct i2c_client
*client
, unsigned int cmd
, void *arg
)
710 struct tuner
*t
= i2c_get_clientdata(client
);
711 struct dvb_tuner_ops
*fe_tuner_ops
= &t
->fe
.ops
.tuner_ops
;
712 struct analog_tuner_ops
*ops
= t
->fe
.ops
.analog_demod_ops
;
715 v4l_i2c_print_ioctl(client
,cmd
);
718 /* --- configuration --- */
719 case TUNER_SET_TYPE_ADDR
:
720 tuner_dbg ("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
721 ((struct tuner_setup
*)arg
)->type
,
722 ((struct tuner_setup
*)arg
)->addr
,
723 ((struct tuner_setup
*)arg
)->mode_mask
,
724 ((struct tuner_setup
*)arg
)->config
);
726 set_addr(client
, (struct tuner_setup
*)arg
);
729 if (set_mode(client
, t
, V4L2_TUNER_RADIO
, "AUDC_SET_RADIO")
733 set_freq(client
, t
->radio_freq
);
735 case TUNER_SET_STANDBY
:
736 if (check_mode(t
, "TUNER_SET_STANDBY") == EINVAL
)
739 if (ops
&& ops
->standby
)
740 ops
->standby(&t
->fe
);
742 #ifdef CONFIG_VIDEO_V4L1
744 if (check_mode(t
, "VIDIOCSAUDIO") == EINVAL
)
746 if (check_v4l2(t
) == EINVAL
)
749 /* Should be implemented, since bttv calls it */
750 tuner_dbg("VIDIOCSAUDIO not implemented.\n");
754 static const v4l2_std_id map
[] = {
755 [VIDEO_MODE_PAL
] = V4L2_STD_PAL
,
756 [VIDEO_MODE_NTSC
] = V4L2_STD_NTSC_M
,
757 [VIDEO_MODE_SECAM
] = V4L2_STD_SECAM
,
758 [4 /* bttv */ ] = V4L2_STD_PAL_M
,
759 [5 /* bttv */ ] = V4L2_STD_PAL_N
,
760 [6 /* bttv */ ] = V4L2_STD_NTSC_M_JP
,
762 struct video_channel
*vc
= arg
;
764 if (check_v4l2(t
) == EINVAL
)
767 if (set_mode(client
,t
,V4L2_TUNER_ANALOG_TV
, "VIDIOCSCHAN")==EINVAL
)
770 if (vc
->norm
< ARRAY_SIZE(map
))
771 t
->std
= map
[vc
->norm
];
774 set_tv_freq(client
, t
->tv_freq
);
779 unsigned long *v
= arg
;
781 if (check_mode(t
, "VIDIOCSFREQ") == EINVAL
)
783 if (check_v4l2(t
) == EINVAL
)
786 set_freq(client
, *v
);
791 struct video_tuner
*vt
= arg
;
793 if (check_mode(t
, "VIDIOCGTUNER") == EINVAL
)
795 if (check_v4l2(t
) == EINVAL
)
798 if (V4L2_TUNER_RADIO
== t
->mode
) {
799 if (fe_tuner_ops
->get_status
) {
802 fe_tuner_ops
->get_status(&t
->fe
, &tuner_status
);
803 if (tuner_status
& TUNER_STATUS_STEREO
)
804 vt
->flags
|= VIDEO_TUNER_STEREO_ON
;
806 vt
->flags
&= ~VIDEO_TUNER_STEREO_ON
;
808 if (ops
&& ops
->is_stereo
) {
809 if (ops
->is_stereo(&t
->fe
))
811 VIDEO_TUNER_STEREO_ON
;
814 ~VIDEO_TUNER_STEREO_ON
;
817 if (ops
&& ops
->has_signal
)
818 vt
->signal
= ops
->has_signal(&t
->fe
);
820 vt
->flags
|= VIDEO_TUNER_LOW
; /* Allow freqs at 62.5 Hz */
822 vt
->rangelow
= radio_range
[0] * 16000;
823 vt
->rangehigh
= radio_range
[1] * 16000;
826 vt
->rangelow
= tv_range
[0] * 16;
827 vt
->rangehigh
= tv_range
[1] * 16;
834 struct video_audio
*va
= arg
;
836 if (check_mode(t
, "VIDIOCGAUDIO") == EINVAL
)
838 if (check_v4l2(t
) == EINVAL
)
841 if (V4L2_TUNER_RADIO
== t
->mode
) {
842 if (fe_tuner_ops
->get_status
) {
845 fe_tuner_ops
->get_status(&t
->fe
, &tuner_status
);
846 va
->mode
= (tuner_status
& TUNER_STATUS_STEREO
)
847 ? VIDEO_SOUND_STEREO
: VIDEO_SOUND_MONO
;
848 } else if (ops
&& ops
->is_stereo
)
849 va
->mode
= ops
->is_stereo(&t
->fe
)
850 ? VIDEO_SOUND_STEREO
: VIDEO_SOUND_MONO
;
855 case TUNER_SET_CONFIG
:
857 struct analog_tuner_ops
*ops
= t
->fe
.ops
.analog_demod_ops
;
858 struct v4l2_priv_tun_config
*cfg
= arg
;
860 if (t
->type
!= cfg
->tuner
)
863 if ((NULL
== ops
) || (NULL
== ops
->set_config
)) {
864 tuner_warn("Tuner frontend module has no way to "
869 ops
->set_config(&t
->fe
, cfg
->priv
);
872 /* --- v4l ioctls --- */
873 /* take care: bttv does userspace copying, we'll get a
874 kernel pointer here... */
877 v4l2_std_id
*id
= arg
;
879 if (set_mode (client
, t
, V4L2_TUNER_ANALOG_TV
, "VIDIOC_S_STD")
888 set_freq(client
, t
->tv_freq
);
891 case VIDIOC_S_FREQUENCY
:
893 struct v4l2_frequency
*f
= arg
;
895 if (set_mode (client
, t
, f
->type
, "VIDIOC_S_FREQUENCY")
899 set_freq(client
,f
->frequency
);
903 case VIDIOC_G_FREQUENCY
:
905 struct v4l2_frequency
*f
= arg
;
907 if (check_mode(t
, "VIDIOC_G_FREQUENCY") == EINVAL
)
911 if (fe_tuner_ops
->get_frequency
) {
914 fe_tuner_ops
->get_frequency(&t
->fe
, &abs_freq
);
915 f
->frequency
= (V4L2_TUNER_RADIO
== t
->mode
) ?
916 (abs_freq
* 2 + 125/2) / 125 :
917 (abs_freq
+ 62500/2) / 62500;
920 f
->frequency
= (V4L2_TUNER_RADIO
== t
->mode
) ?
921 t
->radio_freq
: t
->tv_freq
;
926 struct v4l2_tuner
*tuner
= arg
;
928 if (check_mode(t
, "VIDIOC_G_TUNER") == EINVAL
)
932 tuner
->type
= t
->mode
;
933 if (ops
&& ops
->get_afc
)
934 tuner
->afc
= ops
->get_afc(&t
->fe
);
935 if (t
->mode
== V4L2_TUNER_ANALOG_TV
)
936 tuner
->capability
|= V4L2_TUNER_CAP_NORM
;
937 if (t
->mode
!= V4L2_TUNER_RADIO
) {
938 tuner
->rangelow
= tv_range
[0] * 16;
939 tuner
->rangehigh
= tv_range
[1] * 16;
945 V4L2_TUNER_SUB_MONO
| V4L2_TUNER_SUB_STEREO
;
946 if (fe_tuner_ops
->get_status
) {
949 fe_tuner_ops
->get_status(&t
->fe
, &tuner_status
);
951 (tuner_status
& TUNER_STATUS_STEREO
) ?
952 V4L2_TUNER_SUB_STEREO
:
955 if (ops
&& ops
->is_stereo
) {
957 ops
->is_stereo(&t
->fe
) ?
958 V4L2_TUNER_SUB_STEREO
:
962 if (ops
&& ops
->has_signal
)
963 tuner
->signal
= ops
->has_signal(&t
->fe
);
965 V4L2_TUNER_CAP_LOW
| V4L2_TUNER_CAP_STEREO
;
966 tuner
->audmode
= t
->audmode
;
967 tuner
->rangelow
= radio_range
[0] * 16000;
968 tuner
->rangehigh
= radio_range
[1] * 16000;
973 struct v4l2_tuner
*tuner
= arg
;
975 if (check_mode(t
, "VIDIOC_S_TUNER") == EINVAL
)
980 /* do nothing unless we're a radio tuner */
981 if (t
->mode
!= V4L2_TUNER_RADIO
)
983 t
->audmode
= tuner
->audmode
;
984 set_radio_freq(client
, t
->radio_freq
);
987 case VIDIOC_LOG_STATUS
:
988 if (ops
&& ops
->tuner_status
)
989 ops
->tuner_status(&t
->fe
);
996 static int tuner_suspend(struct i2c_client
*c
, pm_message_t state
)
998 struct tuner
*t
= i2c_get_clientdata(c
);
1000 tuner_dbg("suspend\n");
1001 /* FIXME: power down ??? */
1005 static int tuner_resume(struct i2c_client
*c
)
1007 struct tuner
*t
= i2c_get_clientdata(c
);
1009 tuner_dbg("resume\n");
1010 if (V4L2_TUNER_RADIO
== t
->mode
) {
1012 set_freq(c
, t
->radio_freq
);
1015 set_freq(c
, t
->tv_freq
);
1020 /* ---------------------------------------------------------------------- */
1022 LIST_HEAD(tuner_list
);
1024 /* Search for existing radio and/or TV tuners on the given I2C adapter.
1025 Note that when this function is called from tuner_probe you can be
1026 certain no other devices will be added/deleted at the same time, I2C
1027 core protects against that. */
1028 static void tuner_lookup(struct i2c_adapter
*adap
,
1029 struct tuner
**radio
, struct tuner
**tv
)
1036 list_for_each_entry(pos
, &tuner_list
, list
) {
1039 if (pos
->i2c
->adapter
!= adap
||
1040 pos
->i2c
->driver
->id
!= I2C_DRIVERID_TUNER
)
1043 mode_mask
= pos
->mode_mask
& ~T_STANDBY
;
1044 if (*radio
== NULL
&& mode_mask
== T_RADIO
)
1046 /* Note: currently TDA9887 is the only demod-only
1047 device. If other devices appear then we need to
1048 make this test more general. */
1049 else if (*tv
== NULL
&& pos
->type
!= TUNER_TDA9887
&&
1050 (pos
->mode_mask
& (T_ANALOG_TV
| T_DIGITAL_TV
)))
1055 /* During client attach, set_type is called by adapter's attach_inform callback.
1056 set_type must then be completed by tuner_probe.
1058 static int tuner_probe(struct i2c_client
*client
)
1061 struct tuner
*radio
;
1064 t
= kzalloc(sizeof(struct tuner
), GFP_KERNEL
);
1068 strlcpy(client
->name
, "(tuner unset)", sizeof(client
->name
));
1069 i2c_set_clientdata(client
, t
);
1071 t
->audmode
= V4L2_TUNER_MODE_STEREO
;
1072 t
->mode_mask
= T_UNINITIALIZED
;
1075 unsigned char buffer
[16];
1078 memset(buffer
, 0, sizeof(buffer
));
1079 rc
= i2c_master_recv(client
, buffer
, sizeof(buffer
));
1080 tuner_info("I2C RECV = ");
1081 for (i
= 0; i
< rc
; i
++)
1082 printk(KERN_CONT
"%02x ", buffer
[i
]);
1085 /* HACK: This test was added to avoid tuner to probe tda9840 and
1086 tea6415c on the MXB card */
1087 if (client
->adapter
->id
== I2C_HW_SAA7146
&& client
->addr
< 0x4a) {
1092 /* autodetection code based on the i2c addr */
1093 if (!no_autodetect
) {
1094 switch (client
->addr
) {
1096 if (tea5761_autodetection(t
->i2c
->adapter
, t
->i2c
->addr
)
1098 t
->type
= TUNER_TEA5761
;
1099 t
->mode_mask
= T_RADIO
;
1100 t
->mode
= T_STANDBY
;
1101 /* Sets freq to FM range */
1102 t
->radio_freq
= 87.5 * 16000;
1103 tuner_lookup(t
->i2c
->adapter
, &radio
, &tv
);
1105 tv
->mode_mask
&= ~T_RADIO
;
1107 goto register_client
;
1114 /* If chip is not tda8290, don't register.
1115 since it can be tda9887*/
1116 if (tda829x_probe(t
->i2c
->adapter
,
1117 t
->i2c
->addr
) == 0) {
1118 tuner_dbg("tda829x detected\n");
1120 /* Default is being tda9887 */
1121 t
->type
= TUNER_TDA9887
;
1122 t
->mode_mask
= T_RADIO
| T_ANALOG_TV
|
1124 t
->mode
= T_STANDBY
;
1125 goto register_client
;
1129 if (tea5767_autodetection(t
->i2c
->adapter
, t
->i2c
->addr
)
1131 t
->type
= TUNER_TEA5767
;
1132 t
->mode_mask
= T_RADIO
;
1133 t
->mode
= T_STANDBY
;
1134 /* Sets freq to FM range */
1135 t
->radio_freq
= 87.5 * 16000;
1136 tuner_lookup(t
->i2c
->adapter
, &radio
, &tv
);
1138 tv
->mode_mask
&= ~T_RADIO
;
1140 goto register_client
;
1146 /* Initializes only the first TV tuner on this adapter. Why only the
1147 first? Because there are some devices (notably the ones with TI
1148 tuners) that have more than one i2c address for the *same* device.
1149 Experience shows that, except for just one case, the first
1150 address is the right one. The exception is a Russian tuner
1151 (ACORP_Y878F). So, the desired behavior is just to enable the
1152 first found TV tuner. */
1153 tuner_lookup(t
->i2c
->adapter
, &radio
, &tv
);
1155 t
->mode_mask
= T_ANALOG_TV
| T_DIGITAL_TV
;
1157 t
->mode_mask
|= T_RADIO
;
1158 tuner_dbg("Setting mode_mask to 0x%02x\n", t
->mode_mask
);
1159 t
->tv_freq
= 400 * 16; /* Sets freq to VHF High */
1160 t
->radio_freq
= 87.5 * 16000; /* Sets freq to FM range */
1163 /* Should be just before return */
1165 tuner_info("chip found @ 0x%x (%s)\n", client
->addr
<< 1,
1166 client
->adapter
->name
);
1168 /* Sets a default mode */
1169 if (t
->mode_mask
& T_ANALOG_TV
) {
1170 t
->mode
= V4L2_TUNER_ANALOG_TV
;
1171 } else if (t
->mode_mask
& T_RADIO
) {
1172 t
->mode
= V4L2_TUNER_RADIO
;
1174 t
->mode
= V4L2_TUNER_DIGITAL_TV
;
1176 set_type(client
, t
->type
, t
->mode_mask
, t
->config
, t
->tuner_callback
);
1177 list_add_tail(&t
->list
, &tuner_list
);
1181 static int tuner_legacy_probe(struct i2c_adapter
*adap
)
1184 normal_i2c
[0] = addr
;
1185 normal_i2c
[1] = I2C_CLIENT_END
;
1188 if ((adap
->class & I2C_CLASS_TV_ANALOG
) == 0)
1191 /* HACK: Ignore 0x6b and 0x6f on cx88 boards.
1192 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
1193 * and an RTC at 0x6f which can get corrupted if probed.
1195 if ((adap
->id
== I2C_HW_B_CX2388x
) ||
1196 (adap
->id
== I2C_HW_B_CX23885
)) {
1199 while (i
< I2C_CLIENT_MAX_OPTS
&& ignore
[i
] != I2C_CLIENT_END
)
1201 if (i
+ 4 < I2C_CLIENT_MAX_OPTS
) {
1202 ignore
[i
+0] = adap
->nr
;
1204 ignore
[i
+2] = adap
->nr
;
1206 ignore
[i
+4] = I2C_CLIENT_END
;
1208 printk(KERN_WARNING
"tuner: "
1209 "too many options specified "
1210 "in i2c probe ignore list!\n");
1215 static int tuner_remove(struct i2c_client
*client
)
1217 struct tuner
*t
= i2c_get_clientdata(client
);
1218 struct analog_tuner_ops
*ops
= t
->fe
.ops
.analog_demod_ops
;
1220 if (ops
&& ops
->release
)
1221 ops
->release(&t
->fe
);
1228 /* ----------------------------------------------------------------------- */
1230 static struct v4l2_i2c_driver_data v4l2_i2c_data
= {
1232 .driverid
= I2C_DRIVERID_TUNER
,
1233 .command
= tuner_command
,
1234 .probe
= tuner_probe
,
1235 .remove
= tuner_remove
,
1236 .suspend
= tuner_suspend
,
1237 .resume
= tuner_resume
,
1238 .legacy_probe
= tuner_legacy_probe
,
1243 * Overrides for Emacs so that we follow Linus's tabbing style.
1244 * ---------------------------------------------------------------------------