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