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