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