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