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