]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/media/video/tuner-core.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[mirror_ubuntu-artful-kernel.git] / drivers / media / video / tuner-core.c
CommitLineData
1da177e4 1/*
1da177e4
LT
2 *
3 * i2c tv tuner chip device driver
4 * core core, i.e. kernel interfaces, registering and so on
5 */
6
7#include <linux/module.h>
1da177e4 8#include <linux/kernel.h>
1da177e4
LT
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>
1da177e4 17#include <linux/init.h>
ffbb807c 18#include <linux/videodev.h>
1da177e4 19#include <media/tuner.h>
4adad287 20#include <media/tuner-types.h>
5e453dc7 21#include <media/v4l2-common.h>
8218b0b2 22#include "tuner-driver.h"
96c0b7cf 23#include "mt20xx.h"
910bb3e3 24#include "tda8290.h"
7ab10bf7 25#include "tea5761.h"
8d0936ed 26#include "tea5767.h"
4adad287 27#include "tuner-simple.h"
1da177e4
LT
28
29#define UNSET (-1U)
30
31/* standard i2c insmod options */
32static unsigned short normal_i2c[] = {
9ee476a5 33#ifdef CONFIG_TUNER_TEA5761
8573a9e6
MCC
34 0x10,
35#endif
de48eebc 36 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
f5bec396
MCC
37 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
38 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
1da177e4
LT
39 I2C_CLIENT_END
40};
f7ce3cc6 41
1da177e4
LT
42I2C_CLIENT_INSMOD;
43
44/* insmod options used at init time => read/only */
f7ce3cc6 45static unsigned int addr = 0;
c5287ba1 46static unsigned int no_autodetect = 0;
fd3113e8 47static unsigned int show_i2c = 0;
fd3113e8 48
1da177e4 49/* insmod options used at runtime => read/write */
f9195ded 50int tuner_debug = 0;
1da177e4 51
f7ce3cc6 52static unsigned int tv_range[2] = { 44, 958 };
1da177e4
LT
53static unsigned int radio_range[2] = { 65, 108 };
54
7e578191
MCC
55static char pal[] = "--";
56static char secam[] = "--";
57static char ntsc[] = "-";
58
f9195ded 59
7e578191
MCC
60module_param(addr, int, 0444);
61module_param(no_autodetect, int, 0444);
62module_param(show_i2c, int, 0444);
f9195ded 63module_param_named(debug,tuner_debug, int, 0644);
7e578191
MCC
64module_param_string(pal, pal, sizeof(pal), 0644);
65module_param_string(secam, secam, sizeof(secam), 0644);
66module_param_string(ntsc, ntsc, sizeof(ntsc), 0644);
f7ce3cc6 67module_param_array(tv_range, int, NULL, 0644);
1da177e4
LT
68module_param_array(radio_range, int, NULL, 0644);
69
70MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
71MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
72MODULE_LICENSE("GPL");
73
1da177e4
LT
74static struct i2c_driver driver;
75static struct i2c_client client_template;
76
77/* ---------------------------------------------------------------------- */
78
e18f9444
MK
79static void fe_set_freq(struct tuner *t, unsigned int freq)
80{
81 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
82
83 struct analog_parameters params = {
84 .frequency = freq,
85 .mode = t->mode,
86 .audmode = t->audmode,
87 .std = t->std
88 };
89
90 if (NULL == fe_tuner_ops->set_analog_params) {
91 tuner_warn("Tuner frontend module has no way to set freq\n");
92 return;
93 }
94 fe_tuner_ops->set_analog_params(&t->fe, &params);
95}
96
97static void fe_release(struct tuner *t)
98{
99 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
100
101 if (fe_tuner_ops->release)
102 fe_tuner_ops->release(&t->fe);
103}
104
105static void fe_standby(struct tuner *t)
106{
107 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
108
109 if (fe_tuner_ops->sleep)
110 fe_tuner_ops->sleep(&t->fe);
111}
112
1f5ef197
MK
113static int fe_has_signal(struct tuner *t)
114{
115 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
116 u16 strength;
117
118 if (fe_tuner_ops->get_rf_strength)
119 fe_tuner_ops->get_rf_strength(&t->fe, &strength);
120
121 return strength;
122}
123
56fc08ca 124/* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
1da177e4
LT
125static void set_tv_freq(struct i2c_client *c, unsigned int freq)
126{
127 struct tuner *t = i2c_get_clientdata(c);
128
129 if (t->type == UNSET) {
f7ce3cc6 130 tuner_warn ("tuner type not set\n");
1da177e4
LT
131 return;
132 }
7a91a80a 133 if (NULL == t->ops.set_tv_freq) {
f7ce3cc6 134 tuner_warn ("Tuner has no way to set tv freq\n");
1da177e4
LT
135 return;
136 }
f7ce3cc6
MCC
137 if (freq < tv_range[0] * 16 || freq > tv_range[1] * 16) {
138 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
139 freq / 16, freq % 16 * 100 / 16, tv_range[0],
140 tv_range[1]);
27487d44
HV
141 /* V4L2 spec: if the freq is not possible then the closest
142 possible value should be selected */
143 if (freq < tv_range[0] * 16)
144 freq = tv_range[0] * 16;
145 else
146 freq = tv_range[1] * 16;
1da177e4 147 }
db8a6956 148 t->ops.set_tv_freq(t, freq);
1da177e4
LT
149}
150
151static void set_radio_freq(struct i2c_client *c, unsigned int freq)
152{
153 struct tuner *t = i2c_get_clientdata(c);
154
155 if (t->type == UNSET) {
f7ce3cc6 156 tuner_warn ("tuner type not set\n");
1da177e4
LT
157 return;
158 }
7a91a80a 159 if (NULL == t->ops.set_radio_freq) {
f7ce3cc6 160 tuner_warn ("tuner has no way to set radio frequency\n");
1da177e4
LT
161 return;
162 }
27487d44 163 if (freq < radio_range[0] * 16000 || freq > radio_range[1] * 16000) {
f7ce3cc6
MCC
164 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
165 freq / 16000, freq % 16000 * 100 / 16000,
166 radio_range[0], radio_range[1]);
27487d44
HV
167 /* V4L2 spec: if the freq is not possible then the closest
168 possible value should be selected */
169 if (freq < radio_range[0] * 16000)
170 freq = radio_range[0] * 16000;
171 else
172 freq = radio_range[1] * 16000;
1da177e4 173 }
586b0cab 174
db8a6956 175 t->ops.set_radio_freq(t, freq);
1da177e4
LT
176}
177
178static void set_freq(struct i2c_client *c, unsigned long freq)
179{
180 struct tuner *t = i2c_get_clientdata(c);
181
182 switch (t->mode) {
183 case V4L2_TUNER_RADIO:
184 tuner_dbg("radio freq set to %lu.%02lu\n",
f7ce3cc6
MCC
185 freq / 16000, freq % 16000 * 100 / 16000);
186 set_radio_freq(c, freq);
27487d44 187 t->radio_freq = freq;
1da177e4
LT
188 break;
189 case V4L2_TUNER_ANALOG_TV:
190 case V4L2_TUNER_DIGITAL_TV:
191 tuner_dbg("tv freq set to %lu.%02lu\n",
f7ce3cc6 192 freq / 16, freq % 16 * 100 / 16);
1da177e4 193 set_tv_freq(c, freq);
27487d44 194 t->tv_freq = freq;
1da177e4
LT
195 break;
196 }
1da177e4
LT
197}
198
293197cd
MK
199static void tuner_i2c_address_check(struct tuner *t)
200{
201 if ((t->type == UNSET || t->type == TUNER_ABSENT) ||
202 ((t->i2c.addr < 0x64) || (t->i2c.addr > 0x6f)))
203 return;
204
205 tuner_warn("====================== WARNING! ======================\n");
206 tuner_warn("Support for tuners in i2c address range 0x64 thru 0x6f\n");
207 tuner_warn("will soon be dropped. This message indicates that your\n");
208 tuner_warn("hardware has a %s tuner at i2c address 0x%02x.\n",
209 t->i2c.name, t->i2c.addr);
210 tuner_warn("To ensure continued support for your device, please\n");
211 tuner_warn("send a copy of this message, along with full dmesg\n");
212 tuner_warn("output to v4l-dvb-maintainer@linuxtv.org\n");
213 tuner_warn("Please use subject line: \"obsolete tuner i2c address.\"\n");
214 tuner_warn("driver: %s, addr: 0x%02x, type: %d (%s)\n",
215 t->i2c.adapter->name, t->i2c.addr, t->type,
216 tuners[t->type].name);
217 tuner_warn("====================== WARNING! ======================\n");
218}
219
910bb3e3
MK
220static void attach_tda8290(struct tuner *t)
221{
222 struct tda8290_config cfg = {
223 .lna_cfg = &t->config,
224 .tuner_callback = t->tuner_callback
225 };
226 tda8290_attach(&t->fe, t->i2c.adapter, t->i2c.addr, &cfg);
227}
228
4adad287
MK
229static void attach_simple_tuner(struct tuner *t)
230{
231 struct simple_tuner_config cfg = {
232 .type = t->type,
233 .tun = &tuners[t->type]
234 };
235 simple_tuner_attach(&t->fe, t->i2c.adapter, t->i2c.addr, &cfg);
236}
237
f7ce3cc6 238static void set_type(struct i2c_client *c, unsigned int type,
de956c1e 239 unsigned int new_mode_mask, unsigned int new_config,
cfeb8839 240 int (*tuner_callback) (void *dev, int command,int arg))
1da177e4
LT
241{
242 struct tuner *t = i2c_get_clientdata(c);
e18f9444 243 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
586b0cab 244 unsigned char buffer[4];
1da177e4 245
f7ce3cc6
MCC
246 if (type == UNSET || type == TUNER_ABSENT) {
247 tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c->addr);
1da177e4 248 return;
f7ce3cc6
MCC
249 }
250
251 if (type >= tuner_count) {
252 tuner_warn ("tuner 0x%02x: Tuner count greater than %d\n",c->addr,tuner_count);
1da177e4 253 return;
f7ce3cc6 254 }
1da177e4 255
80f90fba
HH
256 t->type = type;
257 t->config = new_config;
258 if (tuner_callback != NULL) {
259 tuner_dbg("defining GPIO callback\n");
260 t->tuner_callback = tuner_callback;
261 }
262
f7ce3cc6 263 /* This code detects calls by card attach_inform */
1da177e4 264 if (NULL == t->i2c.dev.driver) {
f7ce3cc6
MCC
265 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c->addr);
266
1da177e4
LT
267 return;
268 }
56fc08ca 269
b2083199 270 /* discard private data, in case set_type() was previously called */
7a91a80a 271 if (t->ops.release)
db8a6956 272 t->ops.release(t);
052c50d9
MK
273 else {
274 kfree(t->priv);
275 t->priv = NULL;
276 }
be2b85a1 277
1da177e4
LT
278 switch (t->type) {
279 case TUNER_MT2032:
96c0b7cf 280 microtune_attach(&t->fe, t->i2c.adapter, t->i2c.addr);
1da177e4
LT
281 break;
282 case TUNER_PHILIPS_TDA8290:
910bb3e3
MK
283 {
284 attach_tda8290(t);
1da177e4 285 break;
910bb3e3 286 }
586b0cab 287 case TUNER_TEA5767:
8d0936ed 288 if (tea5767_attach(&t->fe, t->i2c.adapter, t->i2c.addr) == NULL) {
f7ce3cc6
MCC
289 t->type = TUNER_ABSENT;
290 t->mode_mask = T_UNINITIALIZED;
291 return;
292 }
293 t->mode_mask = T_RADIO;
586b0cab 294 break;
9ee476a5 295#ifdef CONFIG_TUNER_TEA5761
8573a9e6 296 case TUNER_TEA5761:
7ab10bf7 297 if (tea5761_attach(&t->fe, t->i2c.adapter, t->i2c.addr) == NULL) {
8573a9e6
MCC
298 t->type = TUNER_ABSENT;
299 t->mode_mask = T_UNINITIALIZED;
9ee476a5 300 return;
8573a9e6
MCC
301 }
302 t->mode_mask = T_RADIO;
303 break;
304#endif
586b0cab
MCC
305 case TUNER_PHILIPS_FMD1216ME_MK3:
306 buffer[0] = 0x0b;
307 buffer[1] = 0xdc;
308 buffer[2] = 0x9c;
309 buffer[3] = 0x60;
f7ce3cc6 310 i2c_master_send(c, buffer, 4);
586b0cab
MCC
311 mdelay(1);
312 buffer[2] = 0x86;
313 buffer[3] = 0x54;
f7ce3cc6 314 i2c_master_send(c, buffer, 4);
4adad287 315 attach_simple_tuner(t);
586b0cab 316 break;
93df3413
HH
317 case TUNER_PHILIPS_TD1316:
318 buffer[0] = 0x0b;
319 buffer[1] = 0xdc;
320 buffer[2] = 0x86;
321 buffer[3] = 0xa4;
322 i2c_master_send(c,buffer,4);
4adad287 323 attach_simple_tuner(t);
ac272ed7 324 break;
15396236 325 case TUNER_TDA9887:
db8a6956 326 tda9887_tuner_init(t);
15396236 327 break;
1da177e4 328 default:
4adad287 329 attach_simple_tuner(t);
1da177e4
LT
330 break;
331 }
f7ce3cc6 332
e18f9444
MK
333 if (fe_tuner_ops->set_analog_params) {
334 strlcpy(t->i2c.name, fe_tuner_ops->info.name, sizeof(t->i2c.name));
335
336 t->ops.set_tv_freq = fe_set_freq;
337 t->ops.set_radio_freq = fe_set_freq;
338 t->ops.standby = fe_standby;
339 t->ops.release = fe_release;
1f5ef197 340 t->ops.has_signal = fe_has_signal;
e18f9444
MK
341 }
342
343 tuner_info("type set to %s\n", t->i2c.name);
344
f7ce3cc6
MCC
345 if (t->mode_mask == T_UNINITIALIZED)
346 t->mode_mask = new_mode_mask;
347
27487d44 348 set_freq(c, (V4L2_TUNER_RADIO == t->mode) ? t->radio_freq : t->tv_freq);
f7ce3cc6 349 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
604f28e2 350 c->adapter->name, c->driver->driver.name, c->addr << 1, type,
f7ce3cc6 351 t->mode_mask);
293197cd 352 tuner_i2c_address_check(t);
1da177e4
LT
353}
354
f7ce3cc6
MCC
355/*
356 * This function apply tuner config to tuner specified
357 * by tun_setup structure. I addr is unset, then admin status
358 * and tun addr status is more precise then current status,
359 * it's applied. Otherwise status and type are applied only to
360 * tuner with exactly the same addr.
361*/
362
363static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup)
364{
365 struct tuner *t = i2c_get_clientdata(c);
366
15396236
MCC
367 tuner_dbg("set addr for type %i\n", t->type);
368
de956c1e
HH
369 if ( (t->type == UNSET && ((tun_setup->addr == ADDR_UNSET) &&
370 (t->mode_mask & tun_setup->mode_mask))) ||
371 (tun_setup->addr == c->addr)) {
372 set_type(c, tun_setup->type, tun_setup->mode_mask,
cfeb8839 373 tun_setup->config, tun_setup->tuner_callback);
f7ce3cc6
MCC
374 }
375}
56fc08ca 376
f7ce3cc6 377static inline int check_mode(struct tuner *t, char *cmd)
56fc08ca 378{
793cf9e6
MCC
379 if ((1 << t->mode & t->mode_mask) == 0) {
380 return EINVAL;
381 }
382
383 switch (t->mode) {
384 case V4L2_TUNER_RADIO:
385 tuner_dbg("Cmd %s accepted for radio\n", cmd);
386 break;
387 case V4L2_TUNER_ANALOG_TV:
388 tuner_dbg("Cmd %s accepted for analog TV\n", cmd);
389 break;
390 case V4L2_TUNER_DIGITAL_TV:
391 tuner_dbg("Cmd %s accepted for digital TV\n", cmd);
392 break;
56fc08ca 393 }
793cf9e6 394 return 0;
56fc08ca 395}
56fc08ca 396
f7ce3cc6 397/* get more precise norm info from insmod option */
1da177e4
LT
398static int tuner_fixup_std(struct tuner *t)
399{
400 if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) {
1da177e4 401 switch (pal[0]) {
e71ced1a
HV
402 case '6':
403 tuner_dbg ("insmod fixup: PAL => PAL-60\n");
404 t->std = V4L2_STD_PAL_60;
405 break;
1da177e4
LT
406 case 'b':
407 case 'B':
408 case 'g':
409 case 'G':
f7ce3cc6 410 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
1da177e4
LT
411 t->std = V4L2_STD_PAL_BG;
412 break;
413 case 'i':
414 case 'I':
f7ce3cc6 415 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
1da177e4
LT
416 t->std = V4L2_STD_PAL_I;
417 break;
418 case 'd':
419 case 'D':
420 case 'k':
421 case 'K':
f7ce3cc6 422 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
1da177e4
LT
423 t->std = V4L2_STD_PAL_DK;
424 break;
f7ce3cc6
MCC
425 case 'M':
426 case 'm':
427 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
428 t->std = V4L2_STD_PAL_M;
429 break;
430 case 'N':
431 case 'n':
7e578191
MCC
432 if (pal[1] == 'c' || pal[1] == 'C') {
433 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
434 t->std = V4L2_STD_PAL_Nc;
435 } else {
436 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
437 t->std = V4L2_STD_PAL_N;
438 }
f7ce3cc6 439 break;
21d4df37
MCC
440 case '-':
441 /* default parameter, do nothing */
442 break;
443 default:
444 tuner_warn ("pal= argument not recognised\n");
445 break;
1da177e4
LT
446 }
447 }
f7ce3cc6
MCC
448 if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
449 switch (secam[0]) {
7e578191
MCC
450 case 'b':
451 case 'B':
452 case 'g':
453 case 'G':
454 case 'h':
455 case 'H':
456 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
457 t->std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H;
458 break;
f7ce3cc6
MCC
459 case 'd':
460 case 'D':
461 case 'k':
462 case 'K':
463 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
464 t->std = V4L2_STD_SECAM_DK;
465 break;
466 case 'l':
467 case 'L':
800d3c6f
MCC
468 if ((secam[1]=='C')||(secam[1]=='c')) {
469 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
470 t->std = V4L2_STD_SECAM_LC;
471 } else {
472 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
473 t->std = V4L2_STD_SECAM_L;
474 }
f7ce3cc6 475 break;
21d4df37
MCC
476 case '-':
477 /* default parameter, do nothing */
478 break;
479 default:
480 tuner_warn ("secam= argument not recognised\n");
481 break;
f7ce3cc6
MCC
482 }
483 }
484
7e578191
MCC
485 if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
486 switch (ntsc[0]) {
487 case 'm':
488 case 'M':
489 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
490 t->std = V4L2_STD_NTSC_M;
491 break;
492 case 'j':
493 case 'J':
494 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
495 t->std = V4L2_STD_NTSC_M_JP;
496 break;
d97a11e0
HV
497 case 'k':
498 case 'K':
499 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
500 t->std = V4L2_STD_NTSC_M_KR;
501 break;
7e578191
MCC
502 case '-':
503 /* default parameter, do nothing */
504 break;
505 default:
506 tuner_info("ntsc= argument not recognised\n");
507 break;
508 }
509 }
1da177e4
LT
510 return 0;
511}
512
db8a6956 513static void tuner_status(struct tuner *t)
7e578191 514{
7e578191 515 unsigned long freq, freq_fraction;
e18f9444 516 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
7e578191
MCC
517 const char *p;
518
519 switch (t->mode) {
520 case V4L2_TUNER_RADIO: p = "radio"; break;
521 case V4L2_TUNER_ANALOG_TV: p = "analog TV"; break;
522 case V4L2_TUNER_DIGITAL_TV: p = "digital TV"; break;
523 default: p = "undefined"; break;
524 }
525 if (t->mode == V4L2_TUNER_RADIO) {
27487d44
HV
526 freq = t->radio_freq / 16000;
527 freq_fraction = (t->radio_freq % 16000) * 100 / 16000;
7e578191 528 } else {
27487d44
HV
529 freq = t->tv_freq / 16;
530 freq_fraction = (t->tv_freq % 16) * 100 / 16;
7e578191
MCC
531 }
532 tuner_info("Tuner mode: %s\n", p);
533 tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction);
4ae5c2e5 534 tuner_info("Standard: 0x%08lx\n", (unsigned long)t->std);
8a4b275f
HV
535 if (t->mode != V4L2_TUNER_RADIO)
536 return;
e18f9444
MK
537 if (fe_tuner_ops->get_status) {
538 u32 tuner_status;
539
540 fe_tuner_ops->get_status(&t->fe, &tuner_status);
541 if (tuner_status & TUNER_STATUS_LOCKED)
542 tuner_info("Tuner is locked.\n");
543 if (tuner_status & TUNER_STATUS_STEREO)
544 tuner_info("Stereo: yes\n");
545 }
7a91a80a 546 if (t->ops.has_signal) {
db8a6956 547 tuner_info("Signal strength: %d\n", t->ops.has_signal(t));
8a4b275f 548 }
7a91a80a 549 if (t->ops.is_stereo) {
db8a6956 550 tuner_info("Stereo: %s\n", t->ops.is_stereo(t) ? "yes" : "no");
7e578191
MCC
551 }
552}
8a4b275f 553
1da177e4
LT
554/* ---------------------------------------------------------------------- */
555
ba8fc399 556/* static vars: used only in tuner_attach and tuner_probe */
f7ce3cc6
MCC
557static unsigned default_mode_mask;
558
559/* During client attach, set_type is called by adapter's attach_inform callback.
560 set_type must then be completed by tuner_attach.
561 */
1da177e4
LT
562static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
563{
564 struct tuner *t;
565
f7ce3cc6
MCC
566 client_template.adapter = adap;
567 client_template.addr = addr;
1da177e4 568
7408187d 569 t = kzalloc(sizeof(struct tuner), GFP_KERNEL);
f7ce3cc6
MCC
570 if (NULL == t)
571 return -ENOMEM;
f7ce3cc6 572 memcpy(&t->i2c, &client_template, sizeof(struct i2c_client));
1da177e4 573 i2c_set_clientdata(&t->i2c, t);
f7ce3cc6 574 t->type = UNSET;
f7ce3cc6
MCC
575 t->audmode = V4L2_TUNER_MODE_STEREO;
576 t->mode_mask = T_UNINITIALIZED;
7a91a80a 577 t->ops.tuner_status = tuner_status;
f7ce3cc6 578
fd3113e8
MCC
579 if (show_i2c) {
580 unsigned char buffer[16];
581 int i,rc;
582
583 memset(buffer, 0, sizeof(buffer));
584 rc = i2c_master_recv(&t->i2c, buffer, sizeof(buffer));
67678360 585 tuner_info("I2C RECV = ");
fd3113e8
MCC
586 for (i=0;i<rc;i++)
587 printk("%02x ",buffer[i]);
588 printk("\n");
589 }
c28089a6
MH
590 /* HACK: This test were added to avoid tuner to probe tda9840 and tea6415c on the MXB card */
591 if (adap->id == I2C_HW_SAA7146 && addr < 0x4a)
592 return -ENODEV;
593
257c645d 594 /* autodetection code based on the i2c addr */
c5287ba1 595 if (!no_autodetect) {
13dd38d0 596 switch (addr) {
9ee476a5 597#ifdef CONFIG_TUNER_TEA5761
8573a9e6 598 case 0x10:
7ab10bf7 599 if (tea5761_autodetection(t->i2c.adapter, t->i2c.addr) != EINVAL) {
8573a9e6
MCC
600 t->type = TUNER_TEA5761;
601 t->mode_mask = T_RADIO;
602 t->mode = T_STANDBY;
603 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
604 default_mode_mask &= ~T_RADIO;
605
606 goto register_client;
607 }
608 break;
609#endif
13dd38d0
MCC
610 case 0x42:
611 case 0x43:
612 case 0x4a:
95736034 613 case 0x4b:
67678360
MCC
614 /* If chip is not tda8290, don't register.
615 since it can be tda9887*/
910bb3e3 616 if (tda8290_probe(t->i2c.adapter, t->i2c.addr) == 0) {
15396236
MCC
617 tuner_dbg("chip at addr %x is a tda8290\n", addr);
618 } else {
619 /* Default is being tda9887 */
620 t->type = TUNER_TDA9887;
621 t->mode_mask = T_RADIO | T_ANALOG_TV | T_DIGITAL_TV;
622 t->mode = T_STANDBY;
623 goto register_client;
13dd38d0 624 }
07345f5d
HH
625 break;
626 case 0x60:
8d0936ed 627 if (tea5767_autodetection(t->i2c.adapter, t->i2c.addr) != EINVAL) {
07345f5d
HH
628 t->type = TUNER_TEA5767;
629 t->mode_mask = T_RADIO;
630 t->mode = T_STANDBY;
27487d44 631 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
07345f5d 632 default_mode_mask &= ~T_RADIO;
13dd38d0 633
07345f5d
HH
634 goto register_client;
635 }
636 break;
f7ce3cc6
MCC
637 }
638 }
1da177e4 639
f7ce3cc6
MCC
640 /* Initializes only the first adapter found */
641 if (default_mode_mask != T_UNINITIALIZED) {
642 tuner_dbg ("Setting mode_mask to 0x%02x\n", default_mode_mask);
643 t->mode_mask = default_mode_mask;
27487d44
HV
644 t->tv_freq = 400 * 16; /* Sets freq to VHF High */
645 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
f7ce3cc6
MCC
646 default_mode_mask = T_UNINITIALIZED;
647 }
56fc08ca 648
f7ce3cc6 649 /* Should be just before return */
67678360
MCC
650register_client:
651 tuner_info("chip found @ 0x%x (%s)\n", addr << 1, adap->name);
f7ce3cc6 652 i2c_attach_client (&t->i2c);
cfeb8839 653 set_type (&t->i2c,t->type, t->mode_mask, t->config, t->tuner_callback);
1da177e4
LT
654 return 0;
655}
656
657static int tuner_probe(struct i2c_adapter *adap)
658{
659 if (0 != addr) {
f5bec396
MCC
660 normal_i2c[0] = addr;
661 normal_i2c[1] = I2C_CLIENT_END;
1da177e4 662 }
1da177e4 663
a1dec516
MK
664 /* HACK: Ignore 0x6b and 0x6f on cx88 boards.
665 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
666 * and an RTC at 0x6f which can get corrupted if probed.
667 */
9bc37caa
MK
668 if ((adap->id == I2C_HW_B_CX2388x) ||
669 (adap->id == I2C_HW_B_CX23885)) {
a1dec516
MK
670 unsigned int i = 0;
671
672 while (i < I2C_CLIENT_MAX_OPTS && ignore[i] != I2C_CLIENT_END)
673 i += 2;
674 if (i + 4 < I2C_CLIENT_MAX_OPTS) {
675 ignore[i+0] = adap->nr;
676 ignore[i+1] = 0x6b;
677 ignore[i+2] = adap->nr;
678 ignore[i+3] = 0x6f;
679 ignore[i+4] = I2C_CLIENT_END;
680 } else
681 printk(KERN_WARNING "tuner: "
682 "too many options specified "
683 "in i2c probe ignore list!\n");
684 }
685
f7ce3cc6 686 default_mode_mask = T_RADIO | T_ANALOG_TV | T_DIGITAL_TV;
391cd727 687
1da177e4
LT
688 if (adap->class & I2C_CLASS_TV_ANALOG)
689 return i2c_probe(adap, &addr_data, tuner_attach);
690 return 0;
691}
692
693static int tuner_detach(struct i2c_client *client)
694{
695 struct tuner *t = i2c_get_clientdata(client);
391cd727
MCC
696 int err;
697
f7ce3cc6 698 err = i2c_detach_client(&t->i2c);
391cd727 699 if (err) {
f7ce3cc6
MCC
700 tuner_warn
701 ("Client deregistration failed, client not detached.\n");
391cd727
MCC
702 return err;
703 }
1da177e4 704
7a91a80a 705 if (t->ops.release)
db8a6956 706 t->ops.release(t);
052c50d9
MK
707 else {
708 kfree(t->priv);
709 }
1da177e4
LT
710 kfree(t);
711 return 0;
712}
713
f7ce3cc6
MCC
714/*
715 * Switch tuner to other mode. If tuner support both tv and radio,
716 * set another frequency to some value (This is needed for some pal
717 * tuners to avoid locking). Otherwise, just put second tuner in
718 * standby mode.
719 */
720
721static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, char *cmd)
722{
4ac97914
MCC
723 if (mode == t->mode)
724 return 0;
725
726 t->mode = mode;
727
728 if (check_mode(t, cmd) == EINVAL) {
729 t->mode = T_STANDBY;
7a91a80a 730 if (t->ops.standby)
db8a6956 731 t->ops.standby(t);
4ac97914
MCC
732 return EINVAL;
733 }
734 return 0;
f7ce3cc6
MCC
735}
736
737#define switch_v4l2() if (!t->using_v4l2) \
4ac97914
MCC
738 tuner_dbg("switching to v4l2\n"); \
739 t->using_v4l2 = 1;
f7ce3cc6
MCC
740
741static inline int check_v4l2(struct tuner *t)
742{
3bbe5a83
HV
743 /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
744 TV, v4l1 for radio), until that is fixed this code is disabled.
745 Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
746 first. */
f7ce3cc6
MCC
747 return 0;
748}
1da177e4 749
f7ce3cc6 750static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
1da177e4
LT
751{
752 struct tuner *t = i2c_get_clientdata(client);
e18f9444 753 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
1da177e4 754
f9195ded 755 if (tuner_debug>1)
5e453dc7
MK
756 v4l_i2c_print_ioctl(&(t->i2c),cmd);
757
f7ce3cc6 758 switch (cmd) {
1da177e4 759 /* --- configuration --- */
56fc08ca 760 case TUNER_SET_TYPE_ADDR:
de956c1e 761 tuner_dbg ("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
f7ce3cc6
MCC
762 ((struct tuner_setup *)arg)->type,
763 ((struct tuner_setup *)arg)->addr,
de956c1e
HH
764 ((struct tuner_setup *)arg)->mode_mask,
765 ((struct tuner_setup *)arg)->config);
f7ce3cc6
MCC
766
767 set_addr(client, (struct tuner_setup *)arg);
391cd727 768 break;
1da177e4 769 case AUDC_SET_RADIO:
27487d44
HV
770 if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO")
771 == EINVAL)
772 return 0;
773 if (t->radio_freq)
774 set_freq(client, t->radio_freq);
1da177e4 775 break;
793cf9e6 776 case TUNER_SET_STANDBY:
27487d44
HV
777 if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL)
778 return 0;
15396236 779 t->mode = T_STANDBY;
7a91a80a 780 if (t->ops.standby)
db8a6956 781 t->ops.standby(t);
27487d44 782 break;
985bc96e 783#ifdef CONFIG_VIDEO_V4L1
fd3113e8
MCC
784 case VIDIOCSAUDIO:
785 if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
786 return 0;
787 if (check_v4l2(t) == EINVAL)
788 return 0;
789
790 /* Should be implemented, since bttv calls it */
791 tuner_dbg("VIDIOCSAUDIO not implemented.\n");
f7ce3cc6 792 break;
1da177e4 793 case VIDIOCSCHAN:
f7ce3cc6
MCC
794 {
795 static const v4l2_std_id map[] = {
796 [VIDEO_MODE_PAL] = V4L2_STD_PAL,
797 [VIDEO_MODE_NTSC] = V4L2_STD_NTSC_M,
798 [VIDEO_MODE_SECAM] = V4L2_STD_SECAM,
799 [4 /* bttv */ ] = V4L2_STD_PAL_M,
800 [5 /* bttv */ ] = V4L2_STD_PAL_N,
801 [6 /* bttv */ ] = V4L2_STD_NTSC_M_JP,
802 };
803 struct video_channel *vc = arg;
804
805 if (check_v4l2(t) == EINVAL)
806 return 0;
807
808 if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==EINVAL)
809 return 0;
810
811 if (vc->norm < ARRAY_SIZE(map))
812 t->std = map[vc->norm];
813 tuner_fixup_std(t);
27487d44
HV
814 if (t->tv_freq)
815 set_tv_freq(client, t->tv_freq);
f7ce3cc6
MCC
816 return 0;
817 }
1da177e4 818 case VIDIOCSFREQ:
f7ce3cc6
MCC
819 {
820 unsigned long *v = arg;
1da177e4 821
f7ce3cc6
MCC
822 if (check_mode(t, "VIDIOCSFREQ") == EINVAL)
823 return 0;
824 if (check_v4l2(t) == EINVAL)
825 return 0;
826
827 set_freq(client, *v);
828 return 0;
829 }
1da177e4 830 case VIDIOCGTUNER:
f7ce3cc6
MCC
831 {
832 struct video_tuner *vt = arg;
833
834 if (check_mode(t, "VIDIOCGTUNER") == EINVAL)
835 return 0;
836 if (check_v4l2(t) == EINVAL)
837 return 0;
838
839 if (V4L2_TUNER_RADIO == t->mode) {
e18f9444
MK
840 if (fe_tuner_ops->get_status) {
841 u32 tuner_status;
842
843 fe_tuner_ops->get_status(&t->fe, &tuner_status);
1f5ef197
MK
844 if (tuner_status & TUNER_STATUS_STEREO)
845 vt->flags |= VIDEO_TUNER_STEREO_ON;
846 else
847 vt->flags &= ~VIDEO_TUNER_STEREO_ON;
e18f9444
MK
848 } else {
849 if (t->ops.is_stereo) {
850 if (t->ops.is_stereo(t))
851 vt->flags |=
852 VIDEO_TUNER_STEREO_ON;
853 else
854 vt->flags &=
855 ~VIDEO_TUNER_STEREO_ON;
856 }
f7ce3cc6 857 }
1f5ef197
MK
858 if (t->ops.has_signal)
859 vt->signal = t->ops.has_signal(t);
860
f7ce3cc6 861 vt->flags |= VIDEO_TUNER_LOW; /* Allow freqs at 62.5 Hz */
586b0cab 862
f7ce3cc6
MCC
863 vt->rangelow = radio_range[0] * 16000;
864 vt->rangehigh = radio_range[1] * 16000;
586b0cab 865
f7ce3cc6
MCC
866 } else {
867 vt->rangelow = tv_range[0] * 16;
868 vt->rangehigh = tv_range[1] * 16;
869 }
56fc08ca 870
f7ce3cc6
MCC
871 return 0;
872 }
1da177e4 873 case VIDIOCGAUDIO:
f7ce3cc6
MCC
874 {
875 struct video_audio *va = arg;
876
877 if (check_mode(t, "VIDIOCGAUDIO") == EINVAL)
878 return 0;
879 if (check_v4l2(t) == EINVAL)
880 return 0;
881
e18f9444
MK
882 if (V4L2_TUNER_RADIO == t->mode) {
883 if (fe_tuner_ops->get_status) {
884 u32 tuner_status;
885
886 fe_tuner_ops->get_status(&t->fe, &tuner_status);
887 va->mode = (tuner_status & TUNER_STATUS_STEREO)
888 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
889 } else if (t->ops.is_stereo)
890 va->mode = t->ops.is_stereo(t)
891 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
892 }
f7ce3cc6
MCC
893 return 0;
894 }
985bc96e
MCC
895#endif
896 case TDA9887_SET_CONFIG:
897 if (t->type == TUNER_TDA9887) {
898 int *i = arg;
1da177e4 899
985bc96e
MCC
900 t->tda9887_config = *i;
901 set_freq(client, t->tv_freq);
902 }
903 break;
904 /* --- v4l ioctls --- */
905 /* take care: bttv does userspace copying, we'll get a
906 kernel pointer here... */
1da177e4 907 case VIDIOC_S_STD:
f7ce3cc6
MCC
908 {
909 v4l2_std_id *id = arg;
1da177e4 910
f7ce3cc6
MCC
911 if (set_mode (client, t, V4L2_TUNER_ANALOG_TV, "VIDIOC_S_STD")
912 == EINVAL)
913 return 0;
56fc08ca 914
f7ce3cc6
MCC
915 switch_v4l2();
916
917 t->std = *id;
918 tuner_fixup_std(t);
27487d44
HV
919 if (t->tv_freq)
920 set_freq(client, t->tv_freq);
f7ce3cc6
MCC
921 break;
922 }
1da177e4 923 case VIDIOC_S_FREQUENCY:
f7ce3cc6
MCC
924 {
925 struct v4l2_frequency *f = arg;
926
4f725cb3
HV
927 if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
928 == EINVAL)
929 return 0;
f7ce3cc6 930 switch_v4l2();
27487d44 931 set_freq(client,f->frequency);
c184ca36 932
f7ce3cc6
MCC
933 break;
934 }
935 case VIDIOC_G_FREQUENCY:
936 {
937 struct v4l2_frequency *f = arg;
938
939 if (check_mode(t, "VIDIOC_G_FREQUENCY") == EINVAL)
940 return 0;
941 switch_v4l2();
942 f->type = t->mode;
e18f9444
MK
943 if (fe_tuner_ops->get_frequency) {
944 u32 abs_freq;
945
946 fe_tuner_ops->get_frequency(&t->fe, &abs_freq);
947 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
948 (abs_freq * 2 + 125/2) / 125 :
949 (abs_freq + 62500/2) / 62500;
950 break;
951 }
27487d44
HV
952 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
953 t->radio_freq : t->tv_freq;
f7ce3cc6
MCC
954 break;
955 }
1da177e4 956 case VIDIOC_G_TUNER:
f7ce3cc6
MCC
957 {
958 struct v4l2_tuner *tuner = arg;
959
960 if (check_mode(t, "VIDIOC_G_TUNER") == EINVAL)
961 return 0;
962 switch_v4l2();
963
8a4b275f 964 tuner->type = t->mode;
7a91a80a 965 if (t->ops.get_afc)
db8a6956 966 tuner->afc=t->ops.get_afc(t);
ab4cecf9
HV
967 if (t->mode == V4L2_TUNER_ANALOG_TV)
968 tuner->capability |= V4L2_TUNER_CAP_NORM;
8a4b275f 969 if (t->mode != V4L2_TUNER_RADIO) {
f7ce3cc6
MCC
970 tuner->rangelow = tv_range[0] * 16;
971 tuner->rangehigh = tv_range[1] * 16;
8a4b275f
HV
972 break;
973 }
974
975 /* radio mode */
8a4b275f
HV
976 tuner->rxsubchans =
977 V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
e18f9444
MK
978 if (fe_tuner_ops->get_status) {
979 u32 tuner_status;
980
981 fe_tuner_ops->get_status(&t->fe, &tuner_status);
982 tuner->rxsubchans = (tuner_status & TUNER_STATUS_STEREO) ?
8a4b275f 983 V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO;
e18f9444
MK
984 } else {
985 if (t->ops.is_stereo) {
986 tuner->rxsubchans = t->ops.is_stereo(t) ?
987 V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO;
988 }
56fc08ca 989 }
1f5ef197
MK
990 if (t->ops.has_signal)
991 tuner->signal = t->ops.has_signal(t);
8a4b275f
HV
992 tuner->capability |=
993 V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
994 tuner->audmode = t->audmode;
995 tuner->rangelow = radio_range[0] * 16000;
996 tuner->rangehigh = radio_range[1] * 16000;
f7ce3cc6
MCC
997 break;
998 }
999 case VIDIOC_S_TUNER:
1000 {
1001 struct v4l2_tuner *tuner = arg;
1002
1003 if (check_mode(t, "VIDIOC_S_TUNER") == EINVAL)
1004 return 0;
1005
1006 switch_v4l2();
1007
8a4b275f
HV
1008 /* do nothing unless we're a radio tuner */
1009 if (t->mode != V4L2_TUNER_RADIO)
1010 break;
1011 t->audmode = tuner->audmode;
1012 set_radio_freq(client, t->radio_freq);
f7ce3cc6 1013 break;
56fc08ca 1014 }
cd43c3f6 1015 case VIDIOC_LOG_STATUS:
7a91a80a 1016 if (t->ops.tuner_status)
db8a6956 1017 t->ops.tuner_status(t);
cd43c3f6 1018 break;
1da177e4
LT
1019 }
1020
1021 return 0;
1022}
1023
21b48a70 1024static int tuner_suspend(struct i2c_client *c, pm_message_t state)
1da177e4 1025{
f7ce3cc6 1026 struct tuner *t = i2c_get_clientdata (c);
1da177e4 1027
f7ce3cc6 1028 tuner_dbg ("suspend\n");
1da177e4
LT
1029 /* FIXME: power down ??? */
1030 return 0;
1031}
1032
21b48a70 1033static int tuner_resume(struct i2c_client *c)
1da177e4 1034{
f7ce3cc6 1035 struct tuner *t = i2c_get_clientdata (c);
1da177e4 1036
f7ce3cc6 1037 tuner_dbg ("resume\n");
27487d44
HV
1038 if (V4L2_TUNER_RADIO == t->mode) {
1039 if (t->radio_freq)
1040 set_freq(c, t->radio_freq);
1041 } else {
1042 if (t->tv_freq)
1043 set_freq(c, t->tv_freq);
1044 }
1da177e4
LT
1045 return 0;
1046}
1047
1048/* ----------------------------------------------------------------------- */
1049
1050static struct i2c_driver driver = {
f7ce3cc6 1051 .id = I2C_DRIVERID_TUNER,
f7ce3cc6
MCC
1052 .attach_adapter = tuner_probe,
1053 .detach_client = tuner_detach,
1054 .command = tuner_command,
21b48a70
JD
1055 .suspend = tuner_suspend,
1056 .resume = tuner_resume,
1da177e4 1057 .driver = {
cab462f7 1058 .name = "tuner",
cab462f7 1059 },
1da177e4 1060};
f7ce3cc6 1061static struct i2c_client client_template = {
fae91e72 1062 .name = "(tuner unset)",
f7ce3cc6 1063 .driver = &driver,
1da177e4
LT
1064};
1065
1066static int __init tuner_init_module(void)
1067{
1068 return i2c_add_driver(&driver);
1069}
1070
1071static void __exit tuner_cleanup_module(void)
1072{
1073 i2c_del_driver(&driver);
1074}
1075
1076module_init(tuner_init_module);
1077module_exit(tuner_cleanup_module);
1078
1079/*
1080 * Overrides for Emacs so that we follow Linus's tabbing style.
1081 * ---------------------------------------------------------------------------
1082 * Local variables:
1083 * c-basic-offset: 8
1084 * End:
1085 */