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