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