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