]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/media/video/tuner-core.c
V4L/DVB (8338): soc_camera: Move spinlocks
[mirror_ubuntu-zesty-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>
9dd659de 22#include <media/v4l2-i2c-drv-legacy.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"
31c9584c 29#include "tda9887.h"
27c685a4 30#include "xc5000.h"
1da177e4
LT
31
32#define UNSET (-1U)
33
9dd659de 34#define PREFIX t->i2c->driver->driver.name
241020d1 35
a07c8779 36/** This macro allows us to probe dynamically, avoiding static links */
ff138171 37#ifdef CONFIG_MEDIA_ATTACH
a07c8779
MK
38#define tuner_symbol_probe(FUNCTION, ARGS...) ({ \
39 int __r = -EINVAL; \
40 typeof(&FUNCTION) __a = symbol_request(FUNCTION); \
41 if (__a) { \
42 __r = (int) __a(ARGS); \
a1355e53 43 symbol_put(FUNCTION); \
a07c8779
MK
44 } else { \
45 printk(KERN_ERR "TUNER: Unable to find " \
46 "symbol "#FUNCTION"()\n"); \
47 } \
a07c8779
MK
48 __r; \
49})
50
51static void tuner_detach(struct dvb_frontend *fe)
52{
53 if (fe->ops.tuner_ops.release) {
54 fe->ops.tuner_ops.release(fe);
55 symbol_put_addr(fe->ops.tuner_ops.release);
56 }
57 if (fe->ops.analog_ops.release) {
58 fe->ops.analog_ops.release(fe);
59 symbol_put_addr(fe->ops.analog_ops.release);
60 }
61}
62#else
63#define tuner_symbol_probe(FUNCTION, ARGS...) ({ \
64 FUNCTION(ARGS); \
65})
66
67static void tuner_detach(struct dvb_frontend *fe)
68{
69 if (fe->ops.tuner_ops.release)
70 fe->ops.tuner_ops.release(fe);
71 if (fe->ops.analog_ops.release)
72 fe->ops.analog_ops.release(fe);
73}
74#endif
75
f7f427e4
MK
76struct tuner {
77 /* device */
78 struct dvb_frontend fe;
79 struct i2c_client *i2c;
80 struct list_head list;
81 unsigned int using_v4l2:1;
82
83 /* keep track of the current settings */
84 v4l2_std_id std;
85 unsigned int tv_freq;
86 unsigned int radio_freq;
87 unsigned int audmode;
88
89 unsigned int mode;
90 unsigned int mode_mask; /* Combination of allowable modes */
91
92 unsigned int type; /* chip type id */
93 unsigned int config;
94 int (*tuner_callback) (void *dev, int command, int arg);
7271e60a 95 const char *name;
f7f427e4
MK
96};
97
1da177e4
LT
98/* standard i2c insmod options */
99static unsigned short normal_i2c[] = {
149ef72d 100#if defined(CONFIG_MEDIA_TUNER_TEA5761) || (defined(CONFIG_MEDIA_TUNER_TEA5761_MODULE) && defined(MODULE))
8573a9e6
MCC
101 0x10,
102#endif
de48eebc 103 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
f5bec396
MCC
104 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
105 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
1da177e4
LT
106 I2C_CLIENT_END
107};
f7ce3cc6 108
1da177e4
LT
109I2C_CLIENT_INSMOD;
110
111/* insmod options used at init time => read/only */
ff699e6b
DSL
112static unsigned int addr;
113static unsigned int no_autodetect;
114static unsigned int show_i2c;
fd3113e8 115
1da177e4 116/* insmod options used at runtime => read/write */
ab166050
MK
117static int tuner_debug;
118
119#define tuner_warn(fmt, arg...) do { \
120 printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
121 i2c_adapter_id(t->i2c->adapter), \
122 t->i2c->addr, ##arg); \
123 } while (0)
124
125#define tuner_info(fmt, arg...) do { \
126 printk(KERN_INFO "%s %d-%04x: " fmt, PREFIX, \
127 i2c_adapter_id(t->i2c->adapter), \
128 t->i2c->addr, ##arg); \
129 } while (0)
130
131#define tuner_err(fmt, arg...) do { \
132 printk(KERN_ERR "%s %d-%04x: " fmt, PREFIX, \
133 i2c_adapter_id(t->i2c->adapter), \
134 t->i2c->addr, ##arg); \
135 } while (0)
136
137#define tuner_dbg(fmt, arg...) do { \
138 if (tuner_debug) \
139 printk(KERN_DEBUG "%s %d-%04x: " fmt, PREFIX, \
140 i2c_adapter_id(t->i2c->adapter), \
141 t->i2c->addr, ##arg); \
142 } while (0)
143
144/* ------------------------------------------------------------------------ */
1da177e4 145
f7ce3cc6 146static unsigned int tv_range[2] = { 44, 958 };
1da177e4
LT
147static unsigned int radio_range[2] = { 65, 108 };
148
7e578191
MCC
149static char pal[] = "--";
150static char secam[] = "--";
151static char ntsc[] = "-";
152
f9195ded 153
7e578191
MCC
154module_param(addr, int, 0444);
155module_param(no_autodetect, int, 0444);
156module_param(show_i2c, int, 0444);
f9195ded 157module_param_named(debug,tuner_debug, int, 0644);
7e578191
MCC
158module_param_string(pal, pal, sizeof(pal), 0644);
159module_param_string(secam, secam, sizeof(secam), 0644);
160module_param_string(ntsc, ntsc, sizeof(ntsc), 0644);
f7ce3cc6 161module_param_array(tv_range, int, NULL, 0644);
1da177e4
LT
162module_param_array(radio_range, int, NULL, 0644);
163
164MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
165MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
166MODULE_LICENSE("GPL");
167
1da177e4
LT
168/* ---------------------------------------------------------------------- */
169
c7919d52
MK
170static void fe_set_params(struct dvb_frontend *fe,
171 struct analog_parameters *params)
e18f9444 172{
4e9154b8
MK
173 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
174 struct tuner *t = fe->analog_demod_priv;
e18f9444 175
e18f9444
MK
176 if (NULL == fe_tuner_ops->set_analog_params) {
177 tuner_warn("Tuner frontend module has no way to set freq\n");
178 return;
179 }
c7919d52 180 fe_tuner_ops->set_analog_params(fe, params);
e18f9444
MK
181}
182
4e9154b8 183static void fe_standby(struct dvb_frontend *fe)
e18f9444 184{
4e9154b8 185 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
e18f9444
MK
186
187 if (fe_tuner_ops->sleep)
4e9154b8 188 fe_tuner_ops->sleep(fe);
e18f9444
MK
189}
190
4e9154b8 191static int fe_has_signal(struct dvb_frontend *fe)
1f5ef197 192{
1419683d 193 u16 strength = 0;
1f5ef197 194
4e9154b8
MK
195 if (fe->ops.tuner_ops.get_rf_strength)
196 fe->ops.tuner_ops.get_rf_strength(fe, &strength);
1f5ef197
MK
197
198 return strength;
199}
200
f1c9a281
MK
201static int fe_set_config(struct dvb_frontend *fe, void *priv_cfg)
202{
203 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
204 struct tuner *t = fe->analog_demod_priv;
205
206 if (fe_tuner_ops->set_config)
207 return fe_tuner_ops->set_config(fe, priv_cfg);
208
209 tuner_warn("Tuner frontend module has no way to set config\n");
210
211 return 0;
212}
213
4e9154b8 214static void tuner_status(struct dvb_frontend *fe);
1dde7a4f 215
bc3e5c7f 216static struct analog_demod_ops tuner_core_ops = {
c7919d52 217 .set_params = fe_set_params,
1dde7a4f 218 .standby = fe_standby,
1dde7a4f 219 .has_signal = fe_has_signal,
f1c9a281 220 .set_config = fe_set_config,
1dde7a4f
MK
221 .tuner_status = tuner_status
222};
223
56fc08ca 224/* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
1da177e4
LT
225static void set_tv_freq(struct i2c_client *c, unsigned int freq)
226{
227 struct tuner *t = i2c_get_clientdata(c);
bc3e5c7f 228 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
1da177e4 229
c7919d52
MK
230 struct analog_parameters params = {
231 .mode = t->mode,
232 .audmode = t->audmode,
233 .std = t->std
234 };
235
1da177e4 236 if (t->type == UNSET) {
f7ce3cc6 237 tuner_warn ("tuner type not set\n");
1da177e4
LT
238 return;
239 }
bc3e5c7f 240 if (NULL == analog_ops->set_params) {
f7ce3cc6 241 tuner_warn ("Tuner has no way to set tv freq\n");
1da177e4
LT
242 return;
243 }
f7ce3cc6
MCC
244 if (freq < tv_range[0] * 16 || freq > tv_range[1] * 16) {
245 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
246 freq / 16, freq % 16 * 100 / 16, tv_range[0],
247 tv_range[1]);
27487d44
HV
248 /* V4L2 spec: if the freq is not possible then the closest
249 possible value should be selected */
250 if (freq < tv_range[0] * 16)
251 freq = tv_range[0] * 16;
252 else
253 freq = tv_range[1] * 16;
1da177e4 254 }
c7919d52
MK
255 params.frequency = freq;
256
bc3e5c7f 257 analog_ops->set_params(&t->fe, &params);
1da177e4
LT
258}
259
260static void set_radio_freq(struct i2c_client *c, unsigned int freq)
261{
262 struct tuner *t = i2c_get_clientdata(c);
bc3e5c7f 263 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
1da177e4 264
c7919d52
MK
265 struct analog_parameters params = {
266 .mode = t->mode,
267 .audmode = t->audmode,
268 .std = t->std
269 };
270
1da177e4 271 if (t->type == UNSET) {
f7ce3cc6 272 tuner_warn ("tuner type not set\n");
1da177e4
LT
273 return;
274 }
e545d6e2 275 if (NULL == analog_ops->set_params) {
f7ce3cc6 276 tuner_warn ("tuner has no way to set radio frequency\n");
1da177e4
LT
277 return;
278 }
27487d44 279 if (freq < radio_range[0] * 16000 || freq > radio_range[1] * 16000) {
f7ce3cc6
MCC
280 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
281 freq / 16000, freq % 16000 * 100 / 16000,
282 radio_range[0], radio_range[1]);
27487d44
HV
283 /* V4L2 spec: if the freq is not possible then the closest
284 possible value should be selected */
285 if (freq < radio_range[0] * 16000)
286 freq = radio_range[0] * 16000;
287 else
288 freq = radio_range[1] * 16000;
1da177e4 289 }
c7919d52 290 params.frequency = freq;
586b0cab 291
bc3e5c7f 292 analog_ops->set_params(&t->fe, &params);
1da177e4
LT
293}
294
295static void set_freq(struct i2c_client *c, unsigned long freq)
296{
297 struct tuner *t = i2c_get_clientdata(c);
298
299 switch (t->mode) {
300 case V4L2_TUNER_RADIO:
301 tuner_dbg("radio freq set to %lu.%02lu\n",
f7ce3cc6
MCC
302 freq / 16000, freq % 16000 * 100 / 16000);
303 set_radio_freq(c, freq);
27487d44 304 t->radio_freq = freq;
1da177e4
LT
305 break;
306 case V4L2_TUNER_ANALOG_TV:
307 case V4L2_TUNER_DIGITAL_TV:
308 tuner_dbg("tv freq set to %lu.%02lu\n",
f7ce3cc6 309 freq / 16, freq % 16 * 100 / 16);
1da177e4 310 set_tv_freq(c, freq);
27487d44 311 t->tv_freq = freq;
1da177e4 312 break;
6cb45879
MCC
313 default:
314 tuner_dbg("freq set: unknown mode: 0x%04x!\n",t->mode);
1da177e4 315 }
1da177e4
LT
316}
317
293197cd
MK
318static void tuner_i2c_address_check(struct tuner *t)
319{
320 if ((t->type == UNSET || t->type == TUNER_ABSENT) ||
1cba97d7 321 ((t->i2c->addr < 0x64) || (t->i2c->addr > 0x6f)))
293197cd
MK
322 return;
323
1641002b
MK
324 /* We already know that the XC5000 can only be located at
325 * i2c address 0x61, 0x62, 0x63 or 0x64 */
326 if ((t->type == TUNER_XC5000) &&
327 ((t->i2c->addr <= 0x64)) && (t->i2c->addr >= 0x61))
328 return;
329
293197cd
MK
330 tuner_warn("====================== WARNING! ======================\n");
331 tuner_warn("Support for tuners in i2c address range 0x64 thru 0x6f\n");
332 tuner_warn("will soon be dropped. This message indicates that your\n");
333 tuner_warn("hardware has a %s tuner at i2c address 0x%02x.\n",
7271e60a 334 t->name, t->i2c->addr);
293197cd
MK
335 tuner_warn("To ensure continued support for your device, please\n");
336 tuner_warn("send a copy of this message, along with full dmesg\n");
337 tuner_warn("output to v4l-dvb-maintainer@linuxtv.org\n");
338 tuner_warn("Please use subject line: \"obsolete tuner i2c address.\"\n");
339 tuner_warn("driver: %s, addr: 0x%02x, type: %d (%s)\n",
7271e60a 340 t->i2c->adapter->name, t->i2c->addr, t->type, t->name);
293197cd
MK
341 tuner_warn("====================== WARNING! ======================\n");
342}
343
27c685a4
ST
344static struct xc5000_config xc5000_cfg;
345
f7ce3cc6 346static void set_type(struct i2c_client *c, unsigned int type,
de956c1e 347 unsigned int new_mode_mask, unsigned int new_config,
cfeb8839 348 int (*tuner_callback) (void *dev, int command,int arg))
1da177e4
LT
349{
350 struct tuner *t = i2c_get_clientdata(c);
e18f9444 351 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
bc3e5c7f 352 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
586b0cab 353 unsigned char buffer[4];
1da177e4 354
f7ce3cc6
MCC
355 if (type == UNSET || type == TUNER_ABSENT) {
356 tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c->addr);
1da177e4 357 return;
f7ce3cc6
MCC
358 }
359
80f90fba
HH
360 t->type = type;
361 t->config = new_config;
362 if (tuner_callback != NULL) {
363 tuner_dbg("defining GPIO callback\n");
364 t->tuner_callback = tuner_callback;
365 }
366
48aa336a 367 if (t->mode == T_UNINITIALIZED) {
f7ce3cc6
MCC
368 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c->addr);
369
1da177e4
LT
370 return;
371 }
56fc08ca 372
b2083199 373 /* discard private data, in case set_type() was previously called */
a07c8779
MK
374 tuner_detach(&t->fe);
375 t->fe.analog_demod_priv = NULL;
be2b85a1 376
1da177e4
LT
377 switch (t->type) {
378 case TUNER_MT2032:
09fee5f8
MCC
379 if (!dvb_attach(microtune_attach,
380 &t->fe, t->i2c->adapter, t->i2c->addr))
381 goto attach_failed;
1da177e4
LT
382 break;
383 case TUNER_PHILIPS_TDA8290:
5bea1cd3 384 {
09fee5f8
MCC
385 struct tda829x_config cfg = {
386 .lna_cfg = t->config,
387 .tuner_callback = t->tuner_callback,
388 };
389 if (!dvb_attach(tda829x_attach, &t->fe, t->i2c->adapter,
390 t->i2c->addr, &cfg))
391 goto attach_failed;
5bea1cd3
MK
392 break;
393 }
586b0cab 394 case TUNER_TEA5767:
a07c8779
MK
395 if (!dvb_attach(tea5767_attach, &t->fe,
396 t->i2c->adapter, t->i2c->addr))
b9ef6bbb 397 goto attach_failed;
f7ce3cc6 398 t->mode_mask = T_RADIO;
586b0cab 399 break;
8573a9e6 400 case TUNER_TEA5761:
a07c8779
MK
401 if (!dvb_attach(tea5761_attach, &t->fe,
402 t->i2c->adapter, t->i2c->addr))
b9ef6bbb 403 goto attach_failed;
8573a9e6
MCC
404 t->mode_mask = T_RADIO;
405 break;
586b0cab
MCC
406 case TUNER_PHILIPS_FMD1216ME_MK3:
407 buffer[0] = 0x0b;
408 buffer[1] = 0xdc;
409 buffer[2] = 0x9c;
410 buffer[3] = 0x60;
f7ce3cc6 411 i2c_master_send(c, buffer, 4);
586b0cab
MCC
412 mdelay(1);
413 buffer[2] = 0x86;
414 buffer[3] = 0x54;
f7ce3cc6 415 i2c_master_send(c, buffer, 4);
a07c8779
MK
416 if (!dvb_attach(simple_tuner_attach, &t->fe,
417 t->i2c->adapter, t->i2c->addr, t->type))
b9ef6bbb 418 goto attach_failed;
586b0cab 419 break;
93df3413
HH
420 case TUNER_PHILIPS_TD1316:
421 buffer[0] = 0x0b;
422 buffer[1] = 0xdc;
423 buffer[2] = 0x86;
424 buffer[3] = 0xa4;
a07c8779
MK
425 i2c_master_send(c, buffer, 4);
426 if (!dvb_attach(simple_tuner_attach, &t->fe,
427 t->i2c->adapter, t->i2c->addr, t->type))
b9ef6bbb 428 goto attach_failed;
ac272ed7 429 break;
690c544c
MCC
430 case TUNER_XC2028:
431 {
a37b4c9b
ML
432 struct xc2028_config cfg = {
433 .i2c_adap = t->i2c->adapter,
434 .i2c_addr = t->i2c->addr,
a37b4c9b
ML
435 .callback = t->tuner_callback,
436 };
a07c8779 437 if (!dvb_attach(xc2028_attach, &t->fe, &cfg))
b9ef6bbb 438 goto attach_failed;
690c544c
MCC
439 break;
440 }
15396236 441 case TUNER_TDA9887:
09fee5f8
MCC
442 if (!dvb_attach(tda9887_attach,
443 &t->fe, t->i2c->adapter, t->i2c->addr))
444 goto attach_failed;
15396236 445 break;
27c685a4 446 case TUNER_XC5000:
b9ef6bbb
MCC
447 {
448 struct dvb_tuner_ops *xc_tuner_ops;
449
27c685a4
ST
450 xc5000_cfg.i2c_address = t->i2c->addr;
451 xc5000_cfg.if_khz = 5380;
27c685a4 452 xc5000_cfg.tuner_callback = t->tuner_callback;
a07c8779 453 if (!dvb_attach(xc5000_attach,
48723543
MK
454 &t->fe, t->i2c->adapter, &xc5000_cfg,
455 c->adapter->algo_data))
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 */