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