]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/media/video/tuner-core.c
[media] tuner-core: move some messages to the proper place
[mirror_ubuntu-artful-kernel.git] / drivers / media / video / tuner-core.c
CommitLineData
1da177e4 1/*
1da177e4
LT
2 *
3 * i2c tv tuner chip device driver
4 * core core, i.e. kernel interfaces, registering and so on
5 */
6
7#include <linux/module.h>
1da177e4 8#include <linux/kernel.h>
1da177e4
LT
9#include <linux/string.h>
10#include <linux/timer.h>
11#include <linux/delay.h>
12#include <linux/errno.h>
13#include <linux/slab.h>
14#include <linux/poll.h>
15#include <linux/i2c.h>
16#include <linux/types.h>
1da177e4 17#include <linux/init.h>
75b4c260 18#include <linux/videodev2.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>
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"
93463895 31#include "tda18271.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 82 struct list_head list;
f7f427e4
MK
83
84 /* keep track of the current settings */
85 v4l2_std_id std;
86 unsigned int tv_freq;
87 unsigned int radio_freq;
88 unsigned int audmode;
89
90 unsigned int mode;
91 unsigned int mode_mask; /* Combination of allowable modes */
92
93 unsigned int type; /* chip type id */
94 unsigned int config;
7271e60a 95 const char *name;
f7f427e4
MK
96};
97
e8a4a9e7
HV
98static inline struct tuner *to_tuner(struct v4l2_subdev *sd)
99{
100 return container_of(sd, struct tuner, sd);
101}
102
1da177e4
LT
103
104/* insmod options used at init time => read/only */
ff699e6b
DSL
105static unsigned int addr;
106static unsigned int no_autodetect;
107static unsigned int show_i2c;
fd3113e8 108
1da177e4 109/* insmod options used at runtime => read/write */
ab166050
MK
110static int tuner_debug;
111
112#define tuner_warn(fmt, arg...) do { \
113 printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
114 i2c_adapter_id(t->i2c->adapter), \
115 t->i2c->addr, ##arg); \
116 } while (0)
117
118#define tuner_info(fmt, arg...) do { \
119 printk(KERN_INFO "%s %d-%04x: " fmt, PREFIX, \
120 i2c_adapter_id(t->i2c->adapter), \
121 t->i2c->addr, ##arg); \
122 } while (0)
123
124#define tuner_err(fmt, arg...) do { \
125 printk(KERN_ERR "%s %d-%04x: " fmt, PREFIX, \
126 i2c_adapter_id(t->i2c->adapter), \
127 t->i2c->addr, ##arg); \
128 } while (0)
129
130#define tuner_dbg(fmt, arg...) do { \
131 if (tuner_debug) \
132 printk(KERN_DEBUG "%s %d-%04x: " fmt, PREFIX, \
133 i2c_adapter_id(t->i2c->adapter), \
134 t->i2c->addr, ##arg); \
135 } while (0)
136
137/* ------------------------------------------------------------------------ */
1da177e4 138
f7ce3cc6 139static unsigned int tv_range[2] = { 44, 958 };
1da177e4
LT
140static unsigned int radio_range[2] = { 65, 108 };
141
7e578191
MCC
142static char pal[] = "--";
143static char secam[] = "--";
144static char ntsc[] = "-";
145
f9195ded 146
7e578191
MCC
147module_param(addr, int, 0444);
148module_param(no_autodetect, int, 0444);
149module_param(show_i2c, int, 0444);
f9195ded 150module_param_named(debug,tuner_debug, int, 0644);
7e578191
MCC
151module_param_string(pal, pal, sizeof(pal), 0644);
152module_param_string(secam, secam, sizeof(secam), 0644);
153module_param_string(ntsc, ntsc, sizeof(ntsc), 0644);
f7ce3cc6 154module_param_array(tv_range, int, NULL, 0644);
1da177e4
LT
155module_param_array(radio_range, int, NULL, 0644);
156
157MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
158MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
159MODULE_LICENSE("GPL");
160
1da177e4
LT
161/* ---------------------------------------------------------------------- */
162
c7919d52
MK
163static void fe_set_params(struct dvb_frontend *fe,
164 struct analog_parameters *params)
e18f9444 165{
4e9154b8
MK
166 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
167 struct tuner *t = fe->analog_demod_priv;
e18f9444 168
e18f9444
MK
169 if (NULL == fe_tuner_ops->set_analog_params) {
170 tuner_warn("Tuner frontend module has no way to set freq\n");
171 return;
172 }
c7919d52 173 fe_tuner_ops->set_analog_params(fe, params);
e18f9444
MK
174}
175
4e9154b8 176static void fe_standby(struct dvb_frontend *fe)
e18f9444 177{
4e9154b8 178 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
e18f9444
MK
179
180 if (fe_tuner_ops->sleep)
4e9154b8 181 fe_tuner_ops->sleep(fe);
e18f9444
MK
182}
183
4e9154b8 184static int fe_has_signal(struct dvb_frontend *fe)
1f5ef197 185{
1419683d 186 u16 strength = 0;
1f5ef197 187
4e9154b8
MK
188 if (fe->ops.tuner_ops.get_rf_strength)
189 fe->ops.tuner_ops.get_rf_strength(fe, &strength);
1f5ef197
MK
190
191 return strength;
192}
193
f1c9a281
MK
194static int fe_set_config(struct dvb_frontend *fe, void *priv_cfg)
195{
196 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
197 struct tuner *t = fe->analog_demod_priv;
198
199 if (fe_tuner_ops->set_config)
200 return fe_tuner_ops->set_config(fe, priv_cfg);
201
202 tuner_warn("Tuner frontend module has no way to set config\n");
203
204 return 0;
205}
206
4e9154b8 207static void tuner_status(struct dvb_frontend *fe);
1dde7a4f 208
e8a4a9e7 209static struct analog_demod_ops tuner_analog_ops = {
c7919d52 210 .set_params = fe_set_params,
1dde7a4f 211 .standby = fe_standby,
1dde7a4f 212 .has_signal = fe_has_signal,
f1c9a281 213 .set_config = fe_set_config,
1dde7a4f
MK
214 .tuner_status = tuner_status
215};
216
56fc08ca 217/* Set tuner frequency, freq in Units of 62.5kHz = 1/16MHz */
1da177e4
LT
218static void set_tv_freq(struct i2c_client *c, unsigned int freq)
219{
e8a4a9e7 220 struct tuner *t = to_tuner(i2c_get_clientdata(c));
bc3e5c7f 221 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
1da177e4 222
c7919d52
MK
223 struct analog_parameters params = {
224 .mode = t->mode,
225 .audmode = t->audmode,
226 .std = t->std
227 };
228
1da177e4 229 if (t->type == UNSET) {
f7ce3cc6 230 tuner_warn ("tuner type not set\n");
1da177e4
LT
231 return;
232 }
bc3e5c7f 233 if (NULL == analog_ops->set_params) {
f7ce3cc6 234 tuner_warn ("Tuner has no way to set tv freq\n");
1da177e4
LT
235 return;
236 }
f7ce3cc6
MCC
237 if (freq < tv_range[0] * 16 || freq > tv_range[1] * 16) {
238 tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
239 freq / 16, freq % 16 * 100 / 16, tv_range[0],
240 tv_range[1]);
27487d44
HV
241 /* V4L2 spec: if the freq is not possible then the closest
242 possible value should be selected */
243 if (freq < tv_range[0] * 16)
244 freq = tv_range[0] * 16;
245 else
246 freq = tv_range[1] * 16;
1da177e4 247 }
c7919d52 248 params.frequency = freq;
b77bdb02
MCC
249 tuner_dbg("tv freq set to %lu.%02lu\n",
250 freq / 16, freq % 16 * 100 / 16);
251 t->tv_freq = freq;
c7919d52 252
bc3e5c7f 253 analog_ops->set_params(&t->fe, &params);
1da177e4
LT
254}
255
256static void set_radio_freq(struct i2c_client *c, unsigned int freq)
257{
e8a4a9e7 258 struct tuner *t = to_tuner(i2c_get_clientdata(c));
bc3e5c7f 259 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
1da177e4 260
c7919d52
MK
261 struct analog_parameters params = {
262 .mode = t->mode,
263 .audmode = t->audmode,
264 .std = t->std
265 };
266
1da177e4 267 if (t->type == UNSET) {
f7ce3cc6 268 tuner_warn ("tuner type not set\n");
1da177e4
LT
269 return;
270 }
e545d6e2 271 if (NULL == analog_ops->set_params) {
f7ce3cc6 272 tuner_warn ("tuner has no way to set radio frequency\n");
1da177e4
LT
273 return;
274 }
27487d44 275 if (freq < radio_range[0] * 16000 || freq > radio_range[1] * 16000) {
f7ce3cc6
MCC
276 tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
277 freq / 16000, freq % 16000 * 100 / 16000,
278 radio_range[0], radio_range[1]);
27487d44
HV
279 /* V4L2 spec: if the freq is not possible then the closest
280 possible value should be selected */
281 if (freq < radio_range[0] * 16000)
282 freq = radio_range[0] * 16000;
283 else
284 freq = radio_range[1] * 16000;
1da177e4 285 }
c7919d52 286 params.frequency = freq;
b77bdb02
MCC
287 tuner_dbg("radio freq set to %lu.%02lu\n",
288 freq / 16000, freq % 16000 * 100 / 16000);
289 t->radio_freq = freq;
586b0cab 290
bc3e5c7f 291 analog_ops->set_params(&t->fe, &params);
1da177e4
LT
292}
293
294static void set_freq(struct i2c_client *c, unsigned long freq)
295{
e8a4a9e7 296 struct tuner *t = to_tuner(i2c_get_clientdata(c));
1da177e4
LT
297
298 switch (t->mode) {
299 case V4L2_TUNER_RADIO:
f7ce3cc6 300 set_radio_freq(c, freq);
1da177e4
LT
301 break;
302 case V4L2_TUNER_ANALOG_TV:
303 case V4L2_TUNER_DIGITAL_TV:
1da177e4
LT
304 set_tv_freq(c, freq);
305 break;
6cb45879
MCC
306 default:
307 tuner_dbg("freq set: unknown mode: 0x%04x!\n",t->mode);
1da177e4 308 }
1da177e4
LT
309}
310
27c685a4
ST
311static struct xc5000_config xc5000_cfg;
312
f7ce3cc6 313static void set_type(struct i2c_client *c, unsigned int type,
de956c1e 314 unsigned int new_mode_mask, unsigned int new_config,
d7cba043 315 int (*tuner_callback) (void *dev, int component, int cmd, int arg))
1da177e4 316{
e8a4a9e7 317 struct tuner *t = to_tuner(i2c_get_clientdata(c));
e18f9444 318 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
bc3e5c7f 319 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
586b0cab 320 unsigned char buffer[4];
d6eef494 321 int tune_now = 1;
1da177e4 322
f7ce3cc6
MCC
323 if (type == UNSET || type == TUNER_ABSENT) {
324 tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c->addr);
1da177e4 325 return;
f7ce3cc6
MCC
326 }
327
80f90fba 328 t->type = type;
e7ddcd98 329 /* prevent invalid config values */
f14a2972 330 t->config = new_config < 256 ? new_config : 0;
80f90fba
HH
331 if (tuner_callback != NULL) {
332 tuner_dbg("defining GPIO callback\n");
d7cba043 333 t->fe.callback = tuner_callback;
80f90fba
HH
334 }
335
48aa336a 336 if (t->mode == T_UNINITIALIZED) {
f7ce3cc6
MCC
337 tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c->addr);
338
1da177e4
LT
339 return;
340 }
56fc08ca 341
b2083199 342 /* discard private data, in case set_type() was previously called */
a07c8779
MK
343 tuner_detach(&t->fe);
344 t->fe.analog_demod_priv = NULL;
be2b85a1 345
1da177e4
LT
346 switch (t->type) {
347 case TUNER_MT2032:
09fee5f8
MCC
348 if (!dvb_attach(microtune_attach,
349 &t->fe, t->i2c->adapter, t->i2c->addr))
350 goto attach_failed;
1da177e4
LT
351 break;
352 case TUNER_PHILIPS_TDA8290:
5bea1cd3 353 {
09fee5f8
MCC
354 struct tda829x_config cfg = {
355 .lna_cfg = t->config,
09fee5f8
MCC
356 };
357 if (!dvb_attach(tda829x_attach, &t->fe, t->i2c->adapter,
358 t->i2c->addr, &cfg))
359 goto attach_failed;
5bea1cd3
MK
360 break;
361 }
586b0cab 362 case TUNER_TEA5767:
a07c8779
MK
363 if (!dvb_attach(tea5767_attach, &t->fe,
364 t->i2c->adapter, t->i2c->addr))
b9ef6bbb 365 goto attach_failed;
f7ce3cc6 366 t->mode_mask = T_RADIO;
586b0cab 367 break;
8573a9e6 368 case TUNER_TEA5761:
a07c8779
MK
369 if (!dvb_attach(tea5761_attach, &t->fe,
370 t->i2c->adapter, t->i2c->addr))
b9ef6bbb 371 goto attach_failed;
8573a9e6
MCC
372 t->mode_mask = T_RADIO;
373 break;
586b0cab
MCC
374 case TUNER_PHILIPS_FMD1216ME_MK3:
375 buffer[0] = 0x0b;
376 buffer[1] = 0xdc;
377 buffer[2] = 0x9c;
378 buffer[3] = 0x60;
f7ce3cc6 379 i2c_master_send(c, buffer, 4);
586b0cab
MCC
380 mdelay(1);
381 buffer[2] = 0x86;
382 buffer[3] = 0x54;
f7ce3cc6 383 i2c_master_send(c, buffer, 4);
a07c8779
MK
384 if (!dvb_attach(simple_tuner_attach, &t->fe,
385 t->i2c->adapter, t->i2c->addr, t->type))
b9ef6bbb 386 goto attach_failed;
586b0cab 387 break;
93df3413
HH
388 case TUNER_PHILIPS_TD1316:
389 buffer[0] = 0x0b;
390 buffer[1] = 0xdc;
391 buffer[2] = 0x86;
392 buffer[3] = 0xa4;
a07c8779
MK
393 i2c_master_send(c, buffer, 4);
394 if (!dvb_attach(simple_tuner_attach, &t->fe,
395 t->i2c->adapter, t->i2c->addr, t->type))
b9ef6bbb 396 goto attach_failed;
ac272ed7 397 break;
690c544c
MCC
398 case TUNER_XC2028:
399 {
a37b4c9b
ML
400 struct xc2028_config cfg = {
401 .i2c_adap = t->i2c->adapter,
402 .i2c_addr = t->i2c->addr,
a37b4c9b 403 };
a07c8779 404 if (!dvb_attach(xc2028_attach, &t->fe, &cfg))
b9ef6bbb 405 goto attach_failed;
d6eef494 406 tune_now = 0;
690c544c
MCC
407 break;
408 }
15396236 409 case TUNER_TDA9887:
09fee5f8
MCC
410 if (!dvb_attach(tda9887_attach,
411 &t->fe, t->i2c->adapter, t->i2c->addr))
412 goto attach_failed;
15396236 413 break;
27c685a4 414 case TUNER_XC5000:
b9ef6bbb 415 {
27c685a4 416 xc5000_cfg.i2c_address = t->i2c->addr;
ea227863
DH
417 /* if_khz will be set when the digital dvb_attach() occurs */
418 xc5000_cfg.if_khz = 0;
a07c8779 419 if (!dvb_attach(xc5000_attach,
30650961 420 &t->fe, t->i2c->adapter, &xc5000_cfg))
b9ef6bbb 421 goto attach_failed;
d6eef494 422 tune_now = 0;
27c685a4 423 break;
b9ef6bbb 424 }
93463895
MK
425 case TUNER_NXP_TDA18271:
426 {
427 struct tda18271_config cfg = {
428 .config = t->config,
e350d44f 429 .small_i2c = TDA18271_03_BYTE_CHUNK_INIT,
93463895
MK
430 };
431
432 if (!dvb_attach(tda18271_attach, &t->fe, t->i2c->addr,
433 t->i2c->adapter, &cfg))
434 goto attach_failed;
d6eef494 435 tune_now = 0;
93463895
MK
436 break;
437 }
1da177e4 438 default:
a07c8779
MK
439 if (!dvb_attach(simple_tuner_attach, &t->fe,
440 t->i2c->adapter, t->i2c->addr, t->type))
b9ef6bbb
MCC
441 goto attach_failed;
442
1da177e4
LT
443 break;
444 }
f7ce3cc6 445
bc3e5c7f 446 if ((NULL == analog_ops->set_params) &&
1dde7a4f 447 (fe_tuner_ops->set_analog_params)) {
a07c8779 448
7271e60a 449 t->name = fe_tuner_ops->info.name;
e18f9444 450
4e9154b8 451 t->fe.analog_demod_priv = t;
e8a4a9e7 452 memcpy(analog_ops, &tuner_analog_ops,
bc3e5c7f 453 sizeof(struct analog_demod_ops));
a07c8779 454
a55db8cd 455 } else {
7271e60a 456 t->name = analog_ops->info.name;
e18f9444
MK
457 }
458
7271e60a 459 tuner_dbg("type set to %s\n", t->name);
e18f9444 460
f7ce3cc6
MCC
461 if (t->mode_mask == T_UNINITIALIZED)
462 t->mode_mask = new_mode_mask;
463
d6eef494
MK
464 /* Some tuners require more initialization setup before use,
465 such as firmware download or device calibration.
b9ef6bbb
MCC
466 trying to set a frequency here will just fail
467 FIXME: better to move set_freq to the tuner code. This is needed
468 on analog tuners for PLL to properly work
469 */
d6eef494 470 if (tune_now)
b9ef6bbb
MCC
471 set_freq(c, (V4L2_TUNER_RADIO == t->mode) ?
472 t->radio_freq : t->tv_freq);
473
f7ce3cc6 474 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
604f28e2 475 c->adapter->name, c->driver->driver.name, c->addr << 1, type,
f7ce3cc6 476 t->mode_mask);
b9ef6bbb
MCC
477 return;
478
479attach_failed:
480 tuner_dbg("Tuner attach for type = %d failed.\n", t->type);
481 t->type = TUNER_ABSENT;
482 t->mode_mask = T_UNINITIALIZED;
483
484 return;
1da177e4
LT
485}
486
f7ce3cc6
MCC
487/*
488 * This function apply tuner config to tuner specified
489 * by tun_setup structure. I addr is unset, then admin status
490 * and tun addr status is more precise then current status,
491 * it's applied. Otherwise status and type are applied only to
492 * tuner with exactly the same addr.
493*/
494
495static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup)
496{
e8a4a9e7 497 struct tuner *t = to_tuner(i2c_get_clientdata(c));
f7ce3cc6 498
de956c1e
HH
499 if ( (t->type == UNSET && ((tun_setup->addr == ADDR_UNSET) &&
500 (t->mode_mask & tun_setup->mode_mask))) ||
501 (tun_setup->addr == c->addr)) {
502 set_type(c, tun_setup->type, tun_setup->mode_mask,
cfeb8839 503 tun_setup->config, tun_setup->tuner_callback);
b9ef6bbb
MCC
504 } else
505 tuner_dbg("set addr discarded for type %i, mask %x. "
506 "Asked to change tuner at addr 0x%02x, with mask %x\n",
507 t->type, t->mode_mask,
508 tun_setup->addr, tun_setup->mode_mask);
f7ce3cc6 509}
56fc08ca 510
f7ce3cc6 511static inline int check_mode(struct tuner *t, char *cmd)
56fc08ca 512{
793cf9e6 513 if ((1 << t->mode & t->mode_mask) == 0) {
4d3437df 514 return -EINVAL;
793cf9e6
MCC
515 }
516
517 switch (t->mode) {
518 case V4L2_TUNER_RADIO:
519 tuner_dbg("Cmd %s accepted for radio\n", cmd);
520 break;
521 case V4L2_TUNER_ANALOG_TV:
522 tuner_dbg("Cmd %s accepted for analog TV\n", cmd);
523 break;
524 case V4L2_TUNER_DIGITAL_TV:
525 tuner_dbg("Cmd %s accepted for digital TV\n", cmd);
526 break;
56fc08ca 527 }
793cf9e6 528 return 0;
56fc08ca 529}
56fc08ca 530
f7ce3cc6 531/* get more precise norm info from insmod option */
1da177e4
LT
532static int tuner_fixup_std(struct tuner *t)
533{
534 if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) {
1da177e4 535 switch (pal[0]) {
e71ced1a
HV
536 case '6':
537 tuner_dbg ("insmod fixup: PAL => PAL-60\n");
538 t->std = V4L2_STD_PAL_60;
539 break;
1da177e4
LT
540 case 'b':
541 case 'B':
542 case 'g':
543 case 'G':
f7ce3cc6 544 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
1da177e4
LT
545 t->std = V4L2_STD_PAL_BG;
546 break;
547 case 'i':
548 case 'I':
f7ce3cc6 549 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
1da177e4
LT
550 t->std = V4L2_STD_PAL_I;
551 break;
552 case 'd':
553 case 'D':
554 case 'k':
555 case 'K':
f7ce3cc6 556 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
1da177e4
LT
557 t->std = V4L2_STD_PAL_DK;
558 break;
f7ce3cc6
MCC
559 case 'M':
560 case 'm':
561 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
562 t->std = V4L2_STD_PAL_M;
563 break;
564 case 'N':
565 case 'n':
7e578191
MCC
566 if (pal[1] == 'c' || pal[1] == 'C') {
567 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
568 t->std = V4L2_STD_PAL_Nc;
569 } else {
570 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
571 t->std = V4L2_STD_PAL_N;
572 }
f7ce3cc6 573 break;
21d4df37
MCC
574 case '-':
575 /* default parameter, do nothing */
576 break;
577 default:
578 tuner_warn ("pal= argument not recognised\n");
579 break;
1da177e4
LT
580 }
581 }
f7ce3cc6
MCC
582 if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
583 switch (secam[0]) {
7e578191
MCC
584 case 'b':
585 case 'B':
586 case 'g':
587 case 'G':
588 case 'h':
589 case 'H':
590 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
591 t->std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H;
592 break;
f7ce3cc6
MCC
593 case 'd':
594 case 'D':
595 case 'k':
596 case 'K':
597 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
598 t->std = V4L2_STD_SECAM_DK;
599 break;
600 case 'l':
601 case 'L':
800d3c6f
MCC
602 if ((secam[1]=='C')||(secam[1]=='c')) {
603 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
604 t->std = V4L2_STD_SECAM_LC;
605 } else {
606 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
607 t->std = V4L2_STD_SECAM_L;
608 }
f7ce3cc6 609 break;
21d4df37
MCC
610 case '-':
611 /* default parameter, do nothing */
612 break;
613 default:
614 tuner_warn ("secam= argument not recognised\n");
615 break;
f7ce3cc6
MCC
616 }
617 }
618
7e578191
MCC
619 if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
620 switch (ntsc[0]) {
621 case 'm':
622 case 'M':
623 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
624 t->std = V4L2_STD_NTSC_M;
625 break;
626 case 'j':
627 case 'J':
628 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
629 t->std = V4L2_STD_NTSC_M_JP;
630 break;
d97a11e0
HV
631 case 'k':
632 case 'K':
633 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
634 t->std = V4L2_STD_NTSC_M_KR;
635 break;
7e578191
MCC
636 case '-':
637 /* default parameter, do nothing */
638 break;
639 default:
640 tuner_info("ntsc= argument not recognised\n");
641 break;
642 }
643 }
1da177e4
LT
644 return 0;
645}
646
4e9154b8 647static void tuner_status(struct dvb_frontend *fe)
7e578191 648{
4e9154b8 649 struct tuner *t = fe->analog_demod_priv;
7e578191 650 unsigned long freq, freq_fraction;
a07c8779
MK
651 struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
652 struct analog_demod_ops *analog_ops = &fe->ops.analog_ops;
7e578191
MCC
653 const char *p;
654
655 switch (t->mode) {
656 case V4L2_TUNER_RADIO: p = "radio"; break;
657 case V4L2_TUNER_ANALOG_TV: p = "analog TV"; break;
658 case V4L2_TUNER_DIGITAL_TV: p = "digital TV"; break;
659 default: p = "undefined"; break;
660 }
661 if (t->mode == V4L2_TUNER_RADIO) {
27487d44
HV
662 freq = t->radio_freq / 16000;
663 freq_fraction = (t->radio_freq % 16000) * 100 / 16000;
7e578191 664 } else {
27487d44
HV
665 freq = t->tv_freq / 16;
666 freq_fraction = (t->tv_freq % 16) * 100 / 16;
7e578191
MCC
667 }
668 tuner_info("Tuner mode: %s\n", p);
669 tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction);
4ae5c2e5 670 tuner_info("Standard: 0x%08lx\n", (unsigned long)t->std);
8a4b275f
HV
671 if (t->mode != V4L2_TUNER_RADIO)
672 return;
e18f9444
MK
673 if (fe_tuner_ops->get_status) {
674 u32 tuner_status;
675
676 fe_tuner_ops->get_status(&t->fe, &tuner_status);
677 if (tuner_status & TUNER_STATUS_LOCKED)
678 tuner_info("Tuner is locked.\n");
679 if (tuner_status & TUNER_STATUS_STEREO)
680 tuner_info("Stereo: yes\n");
681 }
bc3e5c7f
MK
682 if (analog_ops->has_signal)
683 tuner_info("Signal strength: %d\n",
684 analog_ops->has_signal(fe));
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
4d3437df 705 if (check_mode(t, cmd) == -EINVAL) {
16a5e53d
MCC
706 tuner_dbg("Tuner doesn't support this mode. "
707 "Putting tuner to sleep\n");
4ac97914 708 t->mode = T_STANDBY;
bc3e5c7f
MK
709 if (analog_ops->standby)
710 analog_ops->standby(&t->fe);
4d3437df 711 return -EINVAL;
4ac97914
MCC
712 }
713 return 0;
f7ce3cc6
MCC
714}
715
e8a4a9e7 716static int tuner_s_type_addr(struct v4l2_subdev *sd, struct tuner_setup *type)
1da177e4 717{
e8a4a9e7
HV
718 struct tuner *t = to_tuner(sd);
719 struct i2c_client *client = v4l2_get_subdevdata(sd);
720
721 tuner_dbg("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
722 type->type,
723 type->addr,
724 type->mode_mask,
725 type->config);
726
727 set_addr(client, type);
728 return 0;
729}
730
731static int tuner_s_radio(struct v4l2_subdev *sd)
732{
733 struct tuner *t = to_tuner(sd);
734 struct i2c_client *client = v4l2_get_subdevdata(sd);
735
bccfa449 736 if (set_mode(client, t, V4L2_TUNER_RADIO, "s_radio") == -EINVAL)
e8a4a9e7
HV
737 return 0;
738 if (t->radio_freq)
739 set_freq(client, t->radio_freq);
740 return 0;
741}
742
622b828a 743static int tuner_s_power(struct v4l2_subdev *sd, int on)
e8a4a9e7
HV
744{
745 struct tuner *t = to_tuner(sd);
bc3e5c7f 746 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
1da177e4 747
622b828a
LP
748 if (on)
749 return 0;
750
16a5e53d
MCC
751 tuner_dbg("Putting tuner to sleep\n");
752
622b828a 753 if (check_mode(t, "s_power") == -EINVAL)
e8a4a9e7
HV
754 return 0;
755 t->mode = T_STANDBY;
756 if (analog_ops->standby)
757 analog_ops->standby(&t->fe);
758 return 0;
759}
5e453dc7 760
e8a4a9e7
HV
761static int tuner_s_config(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *cfg)
762{
763 struct tuner *t = to_tuner(sd);
764 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
1da177e4 765
e8a4a9e7
HV
766 if (t->type != cfg->tuner)
767 return 0;
7f171123 768
e8a4a9e7
HV
769 if (analog_ops->set_config) {
770 analog_ops->set_config(&t->fe, cfg->priv);
771 return 0;
7f171123 772 }
1da177e4 773
e8a4a9e7
HV
774 tuner_dbg("Tuner frontend module has no way to set config\n");
775 return 0;
776}
56fc08ca 777
e8a4a9e7
HV
778/* --- v4l ioctls --- */
779/* take care: bttv does userspace copying, we'll get a
780 kernel pointer here... */
781static int tuner_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
782{
783 struct tuner *t = to_tuner(sd);
784 struct i2c_client *client = v4l2_get_subdevdata(sd);
f7ce3cc6 785
bccfa449 786 if (set_mode(client, t, V4L2_TUNER_ANALOG_TV, "s_std") == -EINVAL)
e8a4a9e7 787 return 0;
f7ce3cc6 788
e8a4a9e7
HV
789 t->std = std;
790 tuner_fixup_std(t);
791 if (t->tv_freq)
792 set_freq(client, t->tv_freq);
793 return 0;
794}
f7ce3cc6 795
e8a4a9e7
HV
796static int tuner_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)
797{
798 struct tuner *t = to_tuner(sd);
799 struct i2c_client *client = v4l2_get_subdevdata(sd);
f7ce3cc6 800
bccfa449 801 if (set_mode(client, t, f->type, "s_frequency") == -EINVAL)
e8a4a9e7 802 return 0;
e8a4a9e7 803 set_freq(client, f->frequency);
8a4b275f 804
e8a4a9e7
HV
805 return 0;
806}
f7ce3cc6 807
e8a4a9e7
HV
808static int tuner_g_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)
809{
810 struct tuner *t = to_tuner(sd);
811 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
f7ce3cc6 812
bccfa449 813 if (check_mode(t, "g_frequency") == -EINVAL)
e8a4a9e7 814 return 0;
e8a4a9e7
HV
815 f->type = t->mode;
816 if (fe_tuner_ops->get_frequency) {
817 u32 abs_freq;
818
819 fe_tuner_ops->get_frequency(&t->fe, &abs_freq);
820 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
75b697f7
JL
821 DIV_ROUND_CLOSEST(abs_freq * 2, 125) :
822 DIV_ROUND_CLOSEST(abs_freq, 62500);
e8a4a9e7
HV
823 return 0;
824 }
825 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
826 t->radio_freq : t->tv_freq;
827 return 0;
828}
f7ce3cc6 829
e8a4a9e7
HV
830static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
831{
832 struct tuner *t = to_tuner(sd);
833 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
834 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
835
bccfa449 836 if (check_mode(t, "g_tuner") == -EINVAL)
e8a4a9e7 837 return 0;
e8a4a9e7
HV
838
839 vt->type = t->mode;
840 if (analog_ops->get_afc)
841 vt->afc = analog_ops->get_afc(&t->fe);
842 if (t->mode == V4L2_TUNER_ANALOG_TV)
843 vt->capability |= V4L2_TUNER_CAP_NORM;
844 if (t->mode != V4L2_TUNER_RADIO) {
845 vt->rangelow = tv_range[0] * 16;
846 vt->rangehigh = tv_range[1] * 16;
847 return 0;
848 }
849
850 /* radio mode */
851 vt->rxsubchans =
852 V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
853 if (fe_tuner_ops->get_status) {
854 u32 tuner_status;
855
856 fe_tuner_ops->get_status(&t->fe, &tuner_status);
857 vt->rxsubchans =
858 (tuner_status & TUNER_STATUS_STEREO) ?
859 V4L2_TUNER_SUB_STEREO :
860 V4L2_TUNER_SUB_MONO;
1da177e4 861 }
e8a4a9e7
HV
862 if (analog_ops->has_signal)
863 vt->signal = analog_ops->has_signal(&t->fe);
864 vt->capability |=
865 V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
866 vt->audmode = t->audmode;
867 vt->rangelow = radio_range[0] * 16000;
868 vt->rangehigh = radio_range[1] * 16000;
869 return 0;
870}
871
872static int tuner_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
873{
874 struct tuner *t = to_tuner(sd);
875 struct i2c_client *client = v4l2_get_subdevdata(sd);
876
bccfa449 877 if (check_mode(t, "s_tuner") == -EINVAL)
e8a4a9e7
HV
878 return 0;
879
e8a4a9e7
HV
880 /* do nothing unless we're a radio tuner */
881 if (t->mode != V4L2_TUNER_RADIO)
882 return 0;
883 t->audmode = vt->audmode;
884 set_radio_freq(client, t->radio_freq);
885 return 0;
886}
887
888static int tuner_log_status(struct v4l2_subdev *sd)
889{
890 struct tuner *t = to_tuner(sd);
891 struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
1da177e4 892
e8a4a9e7
HV
893 if (analog_ops->tuner_status)
894 analog_ops->tuner_status(&t->fe);
1da177e4
LT
895 return 0;
896}
897
21b48a70 898static int tuner_suspend(struct i2c_client *c, pm_message_t state)
1da177e4 899{
e8a4a9e7 900 struct tuner *t = to_tuner(i2c_get_clientdata(c));
1da177e4 901
9dd659de 902 tuner_dbg("suspend\n");
1da177e4
LT
903 /* FIXME: power down ??? */
904 return 0;
905}
906
21b48a70 907static int tuner_resume(struct i2c_client *c)
1da177e4 908{
e8a4a9e7 909 struct tuner *t = to_tuner(i2c_get_clientdata(c));
1da177e4 910
9dd659de 911 tuner_dbg("resume\n");
27487d44
HV
912 if (V4L2_TUNER_RADIO == t->mode) {
913 if (t->radio_freq)
914 set_freq(c, t->radio_freq);
915 } else {
916 if (t->tv_freq)
917 set_freq(c, t->tv_freq);
918 }
1da177e4
LT
919 return 0;
920}
921
75b4c260
HV
922static int tuner_command(struct i2c_client *client, unsigned cmd, void *arg)
923{
924 struct v4l2_subdev *sd = i2c_get_clientdata(client);
925
926 /* TUNER_SET_CONFIG is still called by tuner-simple.c, so we have
927 to handle it here.
928 There must be a better way of doing this... */
929 switch (cmd) {
930 case TUNER_SET_CONFIG:
931 return tuner_s_config(sd, arg);
932 }
933 return -ENOIOCTLCMD;
934}
935
e8a4a9e7
HV
936/* ----------------------------------------------------------------------- */
937
938static const struct v4l2_subdev_core_ops tuner_core_ops = {
939 .log_status = tuner_log_status,
f41737ec 940 .s_std = tuner_s_std,
622b828a 941 .s_power = tuner_s_power,
e8a4a9e7
HV
942};
943
944static const struct v4l2_subdev_tuner_ops tuner_tuner_ops = {
e8a4a9e7
HV
945 .s_radio = tuner_s_radio,
946 .g_tuner = tuner_g_tuner,
947 .s_tuner = tuner_s_tuner,
948 .s_frequency = tuner_s_frequency,
949 .g_frequency = tuner_g_frequency,
950 .s_type_addr = tuner_s_type_addr,
951 .s_config = tuner_s_config,
952};
953
954static const struct v4l2_subdev_ops tuner_ops = {
955 .core = &tuner_core_ops,
956 .tuner = &tuner_tuner_ops,
957};
958
92de1f16
HV
959/* ---------------------------------------------------------------------- */
960
c52c4d06 961static LIST_HEAD(tuner_list);
92de1f16
HV
962
963/* Search for existing radio and/or TV tuners on the given I2C adapter.
9dd659de 964 Note that when this function is called from tuner_probe you can be
92de1f16
HV
965 certain no other devices will be added/deleted at the same time, I2C
966 core protects against that. */
967static void tuner_lookup(struct i2c_adapter *adap,
968 struct tuner **radio, struct tuner **tv)
969{
970 struct tuner *pos;
971
972 *radio = NULL;
973 *tv = NULL;
974
975 list_for_each_entry(pos, &tuner_list, list) {
976 int mode_mask;
977
978 if (pos->i2c->adapter != adap ||
0c846743 979 strcmp(pos->i2c->driver->driver.name, "tuner"))
92de1f16
HV
980 continue;
981
982 mode_mask = pos->mode_mask & ~T_STANDBY;
983 if (*radio == NULL && mode_mask == T_RADIO)
984 *radio = pos;
985 /* Note: currently TDA9887 is the only demod-only
986 device. If other devices appear then we need to
987 make this test more general. */
988 else if (*tv == NULL && pos->type != TUNER_TDA9887 &&
989 (pos->mode_mask & (T_ANALOG_TV | T_DIGITAL_TV)))
990 *tv = pos;
991 }
992}
993
994/* During client attach, set_type is called by adapter's attach_inform callback.
9dd659de 995 set_type must then be completed by tuner_probe.
92de1f16 996 */
d2653e92
JD
997static int tuner_probe(struct i2c_client *client,
998 const struct i2c_device_id *id)
92de1f16 999{
92de1f16
HV
1000 struct tuner *t;
1001 struct tuner *radio;
1002 struct tuner *tv;
1003
92de1f16 1004 t = kzalloc(sizeof(struct tuner), GFP_KERNEL);
9dd659de 1005 if (NULL == t)
92de1f16 1006 return -ENOMEM;
e8a4a9e7 1007 v4l2_i2c_subdev_init(&t->sd, client, &tuner_ops);
92de1f16 1008 t->i2c = client;
7271e60a 1009 t->name = "(tuner unset)";
92de1f16
HV
1010 t->type = UNSET;
1011 t->audmode = V4L2_TUNER_MODE_STEREO;
1012 t->mode_mask = T_UNINITIALIZED;
1013
1014 if (show_i2c) {
1015 unsigned char buffer[16];
1016 int i, rc;
1017
1018 memset(buffer, 0, sizeof(buffer));
1019 rc = i2c_master_recv(client, buffer, sizeof(buffer));
1020 tuner_info("I2C RECV = ");
1021 for (i = 0; i < rc; i++)
1022 printk(KERN_CONT "%02x ", buffer[i]);
1023 printk("\n");
1024 }
92de1f16
HV
1025
1026 /* autodetection code based on the i2c addr */
1027 if (!no_autodetect) {
9dd659de 1028 switch (client->addr) {
92de1f16 1029 case 0x10:
a07c8779
MK
1030 if (tuner_symbol_probe(tea5761_autodetection,
1031 t->i2c->adapter,
1032 t->i2c->addr) >= 0) {
92de1f16
HV
1033 t->type = TUNER_TEA5761;
1034 t->mode_mask = T_RADIO;
1035 t->mode = T_STANDBY;
1036 /* Sets freq to FM range */
1037 t->radio_freq = 87.5 * 16000;
1038 tuner_lookup(t->i2c->adapter, &radio, &tv);
1039 if (tv)
1040 tv->mode_mask &= ~T_RADIO;
1041
1042 goto register_client;
1043 }
a570fb6e 1044 kfree(t);
867e835f 1045 return -ENODEV;
92de1f16
HV
1046 case 0x42:
1047 case 0x43:
1048 case 0x4a:
1049 case 0x4b:
1050 /* If chip is not tda8290, don't register.
1051 since it can be tda9887*/
a07c8779 1052 if (tuner_symbol_probe(tda829x_probe, t->i2c->adapter,
b538d28c 1053 t->i2c->addr) >= 0) {
92de1f16
HV
1054 tuner_dbg("tda829x detected\n");
1055 } else {
1056 /* Default is being tda9887 */
1057 t->type = TUNER_TDA9887;
1058 t->mode_mask = T_RADIO | T_ANALOG_TV |
1059 T_DIGITAL_TV;
1060 t->mode = T_STANDBY;
1061 goto register_client;
1062 }
1063 break;
1064 case 0x60:
a07c8779
MK
1065 if (tuner_symbol_probe(tea5767_autodetection,
1066 t->i2c->adapter, t->i2c->addr)
b538d28c 1067 >= 0) {
92de1f16
HV
1068 t->type = TUNER_TEA5767;
1069 t->mode_mask = T_RADIO;
1070 t->mode = T_STANDBY;
1071 /* Sets freq to FM range */
1072 t->radio_freq = 87.5 * 16000;
1073 tuner_lookup(t->i2c->adapter, &radio, &tv);
1074 if (tv)
1075 tv->mode_mask &= ~T_RADIO;
1076
1077 goto register_client;
1078 }
1079 break;
1080 }
1081 }
1082
1083 /* Initializes only the first TV tuner on this adapter. Why only the
1084 first? Because there are some devices (notably the ones with TI
1085 tuners) that have more than one i2c address for the *same* device.
1086 Experience shows that, except for just one case, the first
1087 address is the right one. The exception is a Russian tuner
1088 (ACORP_Y878F). So, the desired behavior is just to enable the
1089 first found TV tuner. */
1090 tuner_lookup(t->i2c->adapter, &radio, &tv);
1091 if (tv == NULL) {
1092 t->mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
1093 if (radio == NULL)
1094 t->mode_mask |= T_RADIO;
1095 tuner_dbg("Setting mode_mask to 0x%02x\n", t->mode_mask);
1096 t->tv_freq = 400 * 16; /* Sets freq to VHF High */
1097 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
1098 }
1099
1100 /* Should be just before return */
1101register_client:
9dd659de
HV
1102 tuner_info("chip found @ 0x%x (%s)\n", client->addr << 1,
1103 client->adapter->name);
92de1f16
HV
1104
1105 /* Sets a default mode */
1106 if (t->mode_mask & T_ANALOG_TV) {
864a6b81 1107 t->mode = V4L2_TUNER_ANALOG_TV;
92de1f16 1108 } else if (t->mode_mask & T_RADIO) {
864a6b81 1109 t->mode = V4L2_TUNER_RADIO;
92de1f16 1110 } else {
864a6b81 1111 t->mode = V4L2_TUNER_DIGITAL_TV;
92de1f16 1112 }
d7cba043 1113 set_type(client, t->type, t->mode_mask, t->config, t->fe.callback);
9dd659de 1114 list_add_tail(&t->list, &tuner_list);
92de1f16
HV
1115 return 0;
1116}
1117
9dd659de 1118static int tuner_remove(struct i2c_client *client)
92de1f16 1119{
e8a4a9e7 1120 struct tuner *t = to_tuner(i2c_get_clientdata(client));
92de1f16 1121
e8a4a9e7 1122 v4l2_device_unregister_subdev(&t->sd);
a07c8779
MK
1123 tuner_detach(&t->fe);
1124 t->fe.analog_demod_priv = NULL;
92de1f16
HV
1125
1126 list_del(&t->list);
1127 kfree(t);
92de1f16
HV
1128 return 0;
1129}
1130
1da177e4
LT
1131/* ----------------------------------------------------------------------- */
1132
af294867
JD
1133/* This driver supports many devices and the idea is to let the driver
1134 detect which device is present. So rather than listing all supported
1135 devices here, we pretend to support a single, fake device type. */
1136static const struct i2c_device_id tuner_id[] = {
1137 { "tuner", }, /* autodetect */
1138 { }
1139};
1140MODULE_DEVICE_TABLE(i2c, tuner_id);
1141
02a2098a
HV
1142static struct i2c_driver tuner_driver = {
1143 .driver = {
1144 .owner = THIS_MODULE,
1145 .name = "tuner",
1146 },
1147 .probe = tuner_probe,
1148 .remove = tuner_remove,
1149 .command = tuner_command,
1150 .suspend = tuner_suspend,
1151 .resume = tuner_resume,
1152 .id_table = tuner_id,
1da177e4 1153};
1da177e4 1154
02a2098a
HV
1155static __init int init_tuner(void)
1156{
1157 return i2c_add_driver(&tuner_driver);
1158}
1159
1160static __exit void exit_tuner(void)
1161{
1162 i2c_del_driver(&tuner_driver);
1163}
1164
1165module_init(init_tuner);
1166module_exit(exit_tuner);
1167
1da177e4
LT
1168/*
1169 * Overrides for Emacs so that we follow Linus's tabbing style.
1170 * ---------------------------------------------------------------------------
1171 * Local variables:
1172 * c-basic-offset: 8
1173 * End:
1174 */