V4L/DVB (6469): tuner: remove TUNER_PHILIPS_TDA8295
[GitHub/mt8127/android_kernel_alcatel_ttab.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) ||
229 ((t->i2c.addr < 0x64) || (t->i2c.addr > 0x6f)))
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",
236 t->i2c.name, t->i2c.addr);
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",
242 t->i2c.adapter->name, t->i2c.addr, t->type,
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 };
253 simple_tuner_attach(&t->fe, t->i2c.adapter, t->i2c.addr, &cfg);
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:
96c0b7cf 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:
8d0936ed 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:
7ab10bf7 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;
6cb45879 338 case TUNER_XC2028:
215b95ba
MCC
339 {
340 int rc=xc2028_attach(&t->fe, t->i2c.adapter, t->i2c.addr,
341 &c->dev, c->adapter->algo_data,
342 t->tuner_callback);
343 if (rc<0) {
344 t->type = TUNER_ABSENT;
345 t->mode_mask = T_UNINITIALIZED;
346 return;
347 }
6cb45879 348 break;
215b95ba 349 }
15396236 350 case TUNER_TDA9887:
31c9584c 351 tda9887_attach(t);
15396236 352 break;
1da177e4 353 default:
4adad287 354 attach_simple_tuner(t);
1da177e4
LT
355 break;
356 }
f7ce3cc6 357
e2be32ac
MK
358 ops = t->fe.ops.analog_demod_ops;
359
1dde7a4f
MK
360 if (((NULL == ops) ||
361 ((NULL == ops->set_tv_freq) && (NULL == ops->set_radio_freq))) &&
362 (fe_tuner_ops->set_analog_params)) {
e18f9444
MK
363 strlcpy(t->i2c.name, fe_tuner_ops->info.name, sizeof(t->i2c.name));
364
1dde7a4f 365 t->fe.ops.analog_demod_ops = &tuner_core_ops;
4e9154b8 366 t->fe.analog_demod_priv = t;
e18f9444
MK
367 }
368
369 tuner_info("type set to %s\n", t->i2c.name);
370
f7ce3cc6
MCC
371 if (t->mode_mask == T_UNINITIALIZED)
372 t->mode_mask = new_mode_mask;
373
27487d44 374 set_freq(c, (V4L2_TUNER_RADIO == t->mode) ? t->radio_freq : t->tv_freq);
f7ce3cc6 375 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
604f28e2 376 c->adapter->name, c->driver->driver.name, c->addr << 1, type,
f7ce3cc6 377 t->mode_mask);
293197cd 378 tuner_i2c_address_check(t);
1da177e4
LT
379}
380
f7ce3cc6
MCC
381/*
382 * This function apply tuner config to tuner specified
383 * by tun_setup structure. I addr is unset, then admin status
384 * and tun addr status is more precise then current status,
385 * it's applied. Otherwise status and type are applied only to
386 * tuner with exactly the same addr.
387*/
388
389static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup)
390{
391 struct tuner *t = i2c_get_clientdata(c);
392
15396236
MCC
393 tuner_dbg("set addr for type %i\n", t->type);
394
de956c1e
HH
395 if ( (t->type == UNSET && ((tun_setup->addr == ADDR_UNSET) &&
396 (t->mode_mask & tun_setup->mode_mask))) ||
397 (tun_setup->addr == c->addr)) {
398 set_type(c, tun_setup->type, tun_setup->mode_mask,
cfeb8839 399 tun_setup->config, tun_setup->tuner_callback);
f7ce3cc6
MCC
400 }
401}
56fc08ca 402
f7ce3cc6 403static inline int check_mode(struct tuner *t, char *cmd)
56fc08ca 404{
793cf9e6
MCC
405 if ((1 << t->mode & t->mode_mask) == 0) {
406 return EINVAL;
407 }
408
409 switch (t->mode) {
410 case V4L2_TUNER_RADIO:
411 tuner_dbg("Cmd %s accepted for radio\n", cmd);
412 break;
413 case V4L2_TUNER_ANALOG_TV:
414 tuner_dbg("Cmd %s accepted for analog TV\n", cmd);
415 break;
416 case V4L2_TUNER_DIGITAL_TV:
417 tuner_dbg("Cmd %s accepted for digital TV\n", cmd);
418 break;
56fc08ca 419 }
793cf9e6 420 return 0;
56fc08ca 421}
56fc08ca 422
f7ce3cc6 423/* get more precise norm info from insmod option */
1da177e4
LT
424static int tuner_fixup_std(struct tuner *t)
425{
426 if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) {
1da177e4 427 switch (pal[0]) {
e71ced1a
HV
428 case '6':
429 tuner_dbg ("insmod fixup: PAL => PAL-60\n");
430 t->std = V4L2_STD_PAL_60;
431 break;
1da177e4
LT
432 case 'b':
433 case 'B':
434 case 'g':
435 case 'G':
f7ce3cc6 436 tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
1da177e4
LT
437 t->std = V4L2_STD_PAL_BG;
438 break;
439 case 'i':
440 case 'I':
f7ce3cc6 441 tuner_dbg ("insmod fixup: PAL => PAL-I\n");
1da177e4
LT
442 t->std = V4L2_STD_PAL_I;
443 break;
444 case 'd':
445 case 'D':
446 case 'k':
447 case 'K':
f7ce3cc6 448 tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
1da177e4
LT
449 t->std = V4L2_STD_PAL_DK;
450 break;
f7ce3cc6
MCC
451 case 'M':
452 case 'm':
453 tuner_dbg ("insmod fixup: PAL => PAL-M\n");
454 t->std = V4L2_STD_PAL_M;
455 break;
456 case 'N':
457 case 'n':
7e578191
MCC
458 if (pal[1] == 'c' || pal[1] == 'C') {
459 tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
460 t->std = V4L2_STD_PAL_Nc;
461 } else {
462 tuner_dbg ("insmod fixup: PAL => PAL-N\n");
463 t->std = V4L2_STD_PAL_N;
464 }
f7ce3cc6 465 break;
21d4df37
MCC
466 case '-':
467 /* default parameter, do nothing */
468 break;
469 default:
470 tuner_warn ("pal= argument not recognised\n");
471 break;
1da177e4
LT
472 }
473 }
f7ce3cc6
MCC
474 if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
475 switch (secam[0]) {
7e578191
MCC
476 case 'b':
477 case 'B':
478 case 'g':
479 case 'G':
480 case 'h':
481 case 'H':
482 tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
483 t->std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H;
484 break;
f7ce3cc6
MCC
485 case 'd':
486 case 'D':
487 case 'k':
488 case 'K':
489 tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
490 t->std = V4L2_STD_SECAM_DK;
491 break;
492 case 'l':
493 case 'L':
800d3c6f
MCC
494 if ((secam[1]=='C')||(secam[1]=='c')) {
495 tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
496 t->std = V4L2_STD_SECAM_LC;
497 } else {
498 tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
499 t->std = V4L2_STD_SECAM_L;
500 }
f7ce3cc6 501 break;
21d4df37
MCC
502 case '-':
503 /* default parameter, do nothing */
504 break;
505 default:
506 tuner_warn ("secam= argument not recognised\n");
507 break;
f7ce3cc6
MCC
508 }
509 }
510
7e578191
MCC
511 if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
512 switch (ntsc[0]) {
513 case 'm':
514 case 'M':
515 tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
516 t->std = V4L2_STD_NTSC_M;
517 break;
518 case 'j':
519 case 'J':
520 tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
521 t->std = V4L2_STD_NTSC_M_JP;
522 break;
d97a11e0
HV
523 case 'k':
524 case 'K':
525 tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
526 t->std = V4L2_STD_NTSC_M_KR;
527 break;
7e578191
MCC
528 case '-':
529 /* default parameter, do nothing */
530 break;
531 default:
532 tuner_info("ntsc= argument not recognised\n");
533 break;
534 }
535 }
1da177e4
LT
536 return 0;
537}
538
4e9154b8 539static void tuner_status(struct dvb_frontend *fe)
7e578191 540{
4e9154b8 541 struct tuner *t = fe->analog_demod_priv;
7e578191 542 unsigned long freq, freq_fraction;
e18f9444 543 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
1dde7a4f 544 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
7e578191
MCC
545 const char *p;
546
547 switch (t->mode) {
548 case V4L2_TUNER_RADIO: p = "radio"; break;
549 case V4L2_TUNER_ANALOG_TV: p = "analog TV"; break;
550 case V4L2_TUNER_DIGITAL_TV: p = "digital TV"; break;
551 default: p = "undefined"; break;
552 }
553 if (t->mode == V4L2_TUNER_RADIO) {
27487d44
HV
554 freq = t->radio_freq / 16000;
555 freq_fraction = (t->radio_freq % 16000) * 100 / 16000;
7e578191 556 } else {
27487d44
HV
557 freq = t->tv_freq / 16;
558 freq_fraction = (t->tv_freq % 16) * 100 / 16;
7e578191
MCC
559 }
560 tuner_info("Tuner mode: %s\n", p);
561 tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction);
4ae5c2e5 562 tuner_info("Standard: 0x%08lx\n", (unsigned long)t->std);
8a4b275f
HV
563 if (t->mode != V4L2_TUNER_RADIO)
564 return;
e18f9444
MK
565 if (fe_tuner_ops->get_status) {
566 u32 tuner_status;
567
568 fe_tuner_ops->get_status(&t->fe, &tuner_status);
569 if (tuner_status & TUNER_STATUS_LOCKED)
570 tuner_info("Tuner is locked.\n");
571 if (tuner_status & TUNER_STATUS_STEREO)
572 tuner_info("Stereo: yes\n");
573 }
1b29ceda
MK
574 if (ops) {
575 if (ops->has_signal)
576 tuner_info("Signal strength: %d\n",
577 ops->has_signal(fe));
578 if (ops->is_stereo)
579 tuner_info("Stereo: %s\n",
580 ops->is_stereo(fe) ? "yes" : "no");
7e578191
MCC
581 }
582}
8a4b275f 583
1da177e4
LT
584/* ---------------------------------------------------------------------- */
585
ba8fc399 586/* static vars: used only in tuner_attach and tuner_probe */
f7ce3cc6
MCC
587static unsigned default_mode_mask;
588
589/* During client attach, set_type is called by adapter's attach_inform callback.
590 set_type must then be completed by tuner_attach.
591 */
1da177e4
LT
592static int tuner_attach(struct i2c_adapter *adap, int addr, int kind)
593{
594 struct tuner *t;
595
f7ce3cc6
MCC
596 client_template.adapter = adap;
597 client_template.addr = addr;
1da177e4 598
7408187d 599 t = kzalloc(sizeof(struct tuner), GFP_KERNEL);
f7ce3cc6
MCC
600 if (NULL == t)
601 return -ENOMEM;
f7ce3cc6 602 memcpy(&t->i2c, &client_template, sizeof(struct i2c_client));
1da177e4 603 i2c_set_clientdata(&t->i2c, t);
f7ce3cc6 604 t->type = UNSET;
f7ce3cc6
MCC
605 t->audmode = V4L2_TUNER_MODE_STEREO;
606 t->mode_mask = T_UNINITIALIZED;
607
fd3113e8
MCC
608 if (show_i2c) {
609 unsigned char buffer[16];
610 int i,rc;
611
612 memset(buffer, 0, sizeof(buffer));
613 rc = i2c_master_recv(&t->i2c, buffer, sizeof(buffer));
67678360 614 tuner_info("I2C RECV = ");
fd3113e8
MCC
615 for (i=0;i<rc;i++)
616 printk("%02x ",buffer[i]);
617 printk("\n");
618 }
c28089a6
MH
619 /* HACK: This test were added to avoid tuner to probe tda9840 and tea6415c on the MXB card */
620 if (adap->id == I2C_HW_SAA7146 && addr < 0x4a)
621 return -ENODEV;
622
257c645d 623 /* autodetection code based on the i2c addr */
c5287ba1 624 if (!no_autodetect) {
13dd38d0 625 switch (addr) {
8573a9e6 626 case 0x10:
7ab10bf7 627 if (tea5761_autodetection(t->i2c.adapter, t->i2c.addr) != EINVAL) {
8573a9e6
MCC
628 t->type = TUNER_TEA5761;
629 t->mode_mask = T_RADIO;
630 t->mode = T_STANDBY;
631 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
632 default_mode_mask &= ~T_RADIO;
633
634 goto register_client;
635 }
636 break;
13dd38d0
MCC
637 case 0x42:
638 case 0x43:
639 case 0x4a:
95736034 640 case 0x4b:
67678360
MCC
641 /* If chip is not tda8290, don't register.
642 since it can be tda9887*/
746d9732 643 if (tda8290_probe(t) == 0) {
15396236
MCC
644 tuner_dbg("chip at addr %x is a tda8290\n", addr);
645 } else {
646 /* Default is being tda9887 */
647 t->type = TUNER_TDA9887;
648 t->mode_mask = T_RADIO | T_ANALOG_TV | T_DIGITAL_TV;
649 t->mode = T_STANDBY;
650 goto register_client;
13dd38d0 651 }
07345f5d
HH
652 break;
653 case 0x60:
8d0936ed 654 if (tea5767_autodetection(t->i2c.adapter, t->i2c.addr) != EINVAL) {
07345f5d
HH
655 t->type = TUNER_TEA5767;
656 t->mode_mask = T_RADIO;
657 t->mode = T_STANDBY;
27487d44 658 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
07345f5d 659 default_mode_mask &= ~T_RADIO;
13dd38d0 660
07345f5d
HH
661 goto register_client;
662 }
663 break;
f7ce3cc6
MCC
664 }
665 }
1da177e4 666
f7ce3cc6
MCC
667 /* Initializes only the first adapter found */
668 if (default_mode_mask != T_UNINITIALIZED) {
669 tuner_dbg ("Setting mode_mask to 0x%02x\n", default_mode_mask);
670 t->mode_mask = default_mode_mask;
27487d44
HV
671 t->tv_freq = 400 * 16; /* Sets freq to VHF High */
672 t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
f7ce3cc6
MCC
673 default_mode_mask = T_UNINITIALIZED;
674 }
56fc08ca 675
f7ce3cc6 676 /* Should be just before return */
67678360
MCC
677register_client:
678 tuner_info("chip found @ 0x%x (%s)\n", addr << 1, adap->name);
f7ce3cc6 679 i2c_attach_client (&t->i2c);
cfeb8839 680 set_type (&t->i2c,t->type, t->mode_mask, t->config, t->tuner_callback);
1da177e4
LT
681 return 0;
682}
683
684static int tuner_probe(struct i2c_adapter *adap)
685{
686 if (0 != addr) {
f5bec396
MCC
687 normal_i2c[0] = addr;
688 normal_i2c[1] = I2C_CLIENT_END;
1da177e4 689 }
1da177e4 690
a1dec516
MK
691 /* HACK: Ignore 0x6b and 0x6f on cx88 boards.
692 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
693 * and an RTC at 0x6f which can get corrupted if probed.
694 */
9bc37caa
MK
695 if ((adap->id == I2C_HW_B_CX2388x) ||
696 (adap->id == I2C_HW_B_CX23885)) {
a1dec516
MK
697 unsigned int i = 0;
698
699 while (i < I2C_CLIENT_MAX_OPTS && ignore[i] != I2C_CLIENT_END)
700 i += 2;
701 if (i + 4 < I2C_CLIENT_MAX_OPTS) {
702 ignore[i+0] = adap->nr;
703 ignore[i+1] = 0x6b;
704 ignore[i+2] = adap->nr;
705 ignore[i+3] = 0x6f;
706 ignore[i+4] = I2C_CLIENT_END;
707 } else
708 printk(KERN_WARNING "tuner: "
709 "too many options specified "
710 "in i2c probe ignore list!\n");
711 }
712
f7ce3cc6 713 default_mode_mask = T_RADIO | T_ANALOG_TV | T_DIGITAL_TV;
391cd727 714
1da177e4
LT
715 if (adap->class & I2C_CLASS_TV_ANALOG)
716 return i2c_probe(adap, &addr_data, tuner_attach);
717 return 0;
718}
719
720static int tuner_detach(struct i2c_client *client)
721{
722 struct tuner *t = i2c_get_clientdata(client);
1dde7a4f 723 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
391cd727
MCC
724 int err;
725
f7ce3cc6 726 err = i2c_detach_client(&t->i2c);
391cd727 727 if (err) {
f7ce3cc6
MCC
728 tuner_warn
729 ("Client deregistration failed, client not detached.\n");
391cd727
MCC
730 return err;
731 }
1da177e4 732
af3b0f3f 733 if (ops && ops->release)
4e9154b8 734 ops->release(&t->fe);
16f29168 735
1da177e4
LT
736 kfree(t);
737 return 0;
738}
739
f7ce3cc6
MCC
740/*
741 * Switch tuner to other mode. If tuner support both tv and radio,
742 * set another frequency to some value (This is needed for some pal
743 * tuners to avoid locking). Otherwise, just put second tuner in
744 * standby mode.
745 */
746
747static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, char *cmd)
748{
1dde7a4f
MK
749 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
750
4ac97914
MCC
751 if (mode == t->mode)
752 return 0;
753
754 t->mode = mode;
755
756 if (check_mode(t, cmd) == EINVAL) {
757 t->mode = T_STANDBY;
af3b0f3f 758 if (ops && ops->standby)
4e9154b8 759 ops->standby(&t->fe);
4ac97914
MCC
760 return EINVAL;
761 }
762 return 0;
f7ce3cc6
MCC
763}
764
765#define switch_v4l2() if (!t->using_v4l2) \
4ac97914
MCC
766 tuner_dbg("switching to v4l2\n"); \
767 t->using_v4l2 = 1;
f7ce3cc6
MCC
768
769static inline int check_v4l2(struct tuner *t)
770{
3bbe5a83
HV
771 /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
772 TV, v4l1 for radio), until that is fixed this code is disabled.
773 Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
774 first. */
f7ce3cc6
MCC
775 return 0;
776}
1da177e4 777
f7ce3cc6 778static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
1da177e4
LT
779{
780 struct tuner *t = i2c_get_clientdata(client);
e18f9444 781 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
1dde7a4f 782 struct analog_tuner_ops *ops = t->fe.ops.analog_demod_ops;
1da177e4 783
f9195ded 784 if (tuner_debug>1)
5e453dc7
MK
785 v4l_i2c_print_ioctl(&(t->i2c),cmd);
786
f7ce3cc6 787 switch (cmd) {
1da177e4 788 /* --- configuration --- */
56fc08ca 789 case TUNER_SET_TYPE_ADDR:
de956c1e 790 tuner_dbg ("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
f7ce3cc6
MCC
791 ((struct tuner_setup *)arg)->type,
792 ((struct tuner_setup *)arg)->addr,
de956c1e
HH
793 ((struct tuner_setup *)arg)->mode_mask,
794 ((struct tuner_setup *)arg)->config);
f7ce3cc6
MCC
795
796 set_addr(client, (struct tuner_setup *)arg);
391cd727 797 break;
1da177e4 798 case AUDC_SET_RADIO:
27487d44
HV
799 if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO")
800 == EINVAL)
801 return 0;
802 if (t->radio_freq)
803 set_freq(client, t->radio_freq);
1da177e4 804 break;
793cf9e6 805 case TUNER_SET_STANDBY:
27487d44
HV
806 if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL)
807 return 0;
15396236 808 t->mode = T_STANDBY;
af3b0f3f 809 if (ops && ops->standby)
4e9154b8 810 ops->standby(&t->fe);
27487d44 811 break;
985bc96e 812#ifdef CONFIG_VIDEO_V4L1
fd3113e8
MCC
813 case VIDIOCSAUDIO:
814 if (check_mode(t, "VIDIOCSAUDIO") == EINVAL)
815 return 0;
816 if (check_v4l2(t) == EINVAL)
817 return 0;
818
819 /* Should be implemented, since bttv calls it */
820 tuner_dbg("VIDIOCSAUDIO not implemented.\n");
f7ce3cc6 821 break;
1da177e4 822 case VIDIOCSCHAN:
f7ce3cc6
MCC
823 {
824 static const v4l2_std_id map[] = {
825 [VIDEO_MODE_PAL] = V4L2_STD_PAL,
826 [VIDEO_MODE_NTSC] = V4L2_STD_NTSC_M,
827 [VIDEO_MODE_SECAM] = V4L2_STD_SECAM,
828 [4 /* bttv */ ] = V4L2_STD_PAL_M,
829 [5 /* bttv */ ] = V4L2_STD_PAL_N,
830 [6 /* bttv */ ] = V4L2_STD_NTSC_M_JP,
831 };
832 struct video_channel *vc = arg;
833
834 if (check_v4l2(t) == EINVAL)
835 return 0;
836
837 if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==EINVAL)
838 return 0;
839
840 if (vc->norm < ARRAY_SIZE(map))
841 t->std = map[vc->norm];
842 tuner_fixup_std(t);
27487d44
HV
843 if (t->tv_freq)
844 set_tv_freq(client, t->tv_freq);
f7ce3cc6
MCC
845 return 0;
846 }
1da177e4 847 case VIDIOCSFREQ:
f7ce3cc6
MCC
848 {
849 unsigned long *v = arg;
1da177e4 850
f7ce3cc6
MCC
851 if (check_mode(t, "VIDIOCSFREQ") == EINVAL)
852 return 0;
853 if (check_v4l2(t) == EINVAL)
854 return 0;
855
856 set_freq(client, *v);
857 return 0;
858 }
1da177e4 859 case VIDIOCGTUNER:
f7ce3cc6
MCC
860 {
861 struct video_tuner *vt = arg;
862
863 if (check_mode(t, "VIDIOCGTUNER") == EINVAL)
864 return 0;
865 if (check_v4l2(t) == EINVAL)
866 return 0;
867
868 if (V4L2_TUNER_RADIO == t->mode) {
e18f9444
MK
869 if (fe_tuner_ops->get_status) {
870 u32 tuner_status;
871
872 fe_tuner_ops->get_status(&t->fe, &tuner_status);
1f5ef197
MK
873 if (tuner_status & TUNER_STATUS_STEREO)
874 vt->flags |= VIDEO_TUNER_STEREO_ON;
875 else
876 vt->flags &= ~VIDEO_TUNER_STEREO_ON;
e18f9444 877 } else {
af3b0f3f 878 if (ops && ops->is_stereo) {
4e9154b8 879 if (ops->is_stereo(&t->fe))
e18f9444
MK
880 vt->flags |=
881 VIDEO_TUNER_STEREO_ON;
882 else
883 vt->flags &=
884 ~VIDEO_TUNER_STEREO_ON;
885 }
f7ce3cc6 886 }
af3b0f3f 887 if (ops && ops->has_signal)
4e9154b8 888 vt->signal = ops->has_signal(&t->fe);
1f5ef197 889
f7ce3cc6 890 vt->flags |= VIDEO_TUNER_LOW; /* Allow freqs at 62.5 Hz */
586b0cab 891
f7ce3cc6
MCC
892 vt->rangelow = radio_range[0] * 16000;
893 vt->rangehigh = radio_range[1] * 16000;
586b0cab 894
f7ce3cc6
MCC
895 } else {
896 vt->rangelow = tv_range[0] * 16;
897 vt->rangehigh = tv_range[1] * 16;
898 }
56fc08ca 899
f7ce3cc6
MCC
900 return 0;
901 }
1da177e4 902 case VIDIOCGAUDIO:
f7ce3cc6
MCC
903 {
904 struct video_audio *va = arg;
905
906 if (check_mode(t, "VIDIOCGAUDIO") == EINVAL)
907 return 0;
908 if (check_v4l2(t) == EINVAL)
909 return 0;
910
e18f9444
MK
911 if (V4L2_TUNER_RADIO == t->mode) {
912 if (fe_tuner_ops->get_status) {
913 u32 tuner_status;
914
915 fe_tuner_ops->get_status(&t->fe, &tuner_status);
916 va->mode = (tuner_status & TUNER_STATUS_STEREO)
917 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
af3b0f3f 918 } else if (ops && ops->is_stereo)
4e9154b8 919 va->mode = ops->is_stereo(&t->fe)
e18f9444
MK
920 ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;
921 }
f7ce3cc6
MCC
922 return 0;
923 }
985bc96e 924#endif
7f171123
MCC
925 case TUNER_SET_CONFIG:
926 {
927 struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
928 struct v4l2_priv_tun_config *cfg = arg;
929
930 if (t->type != cfg->tuner)
931 break;
1da177e4 932
7f171123
MCC
933 if (t->type == TUNER_TDA9887) {
934 t->tda9887_config = *(unsigned int *)cfg->priv;
985bc96e 935 set_freq(client, t->tv_freq);
7f171123 936 break;
985bc96e 937 }
7f171123
MCC
938
939 if (NULL == fe_tuner_ops->set_config) {
940 tuner_warn("Tuner frontend module has no way to "
941 "set config\n");
942 break;
943 }
944 fe_tuner_ops->set_config(&t->fe, cfg->priv);
945
985bc96e 946 break;
7f171123 947 }
985bc96e
MCC
948 /* --- v4l ioctls --- */
949 /* take care: bttv does userspace copying, we'll get a
950 kernel pointer here... */
1da177e4 951 case VIDIOC_S_STD:
f7ce3cc6
MCC
952 {
953 v4l2_std_id *id = arg;
1da177e4 954
f7ce3cc6
MCC
955 if (set_mode (client, t, V4L2_TUNER_ANALOG_TV, "VIDIOC_S_STD")
956 == EINVAL)
957 return 0;
56fc08ca 958
f7ce3cc6
MCC
959 switch_v4l2();
960
961 t->std = *id;
962 tuner_fixup_std(t);
27487d44
HV
963 if (t->tv_freq)
964 set_freq(client, t->tv_freq);
f7ce3cc6
MCC
965 break;
966 }
1da177e4 967 case VIDIOC_S_FREQUENCY:
f7ce3cc6
MCC
968 {
969 struct v4l2_frequency *f = arg;
970
4f725cb3
HV
971 if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
972 == EINVAL)
973 return 0;
f7ce3cc6 974 switch_v4l2();
27487d44 975 set_freq(client,f->frequency);
c184ca36 976
f7ce3cc6
MCC
977 break;
978 }
979 case VIDIOC_G_FREQUENCY:
980 {
981 struct v4l2_frequency *f = arg;
982
983 if (check_mode(t, "VIDIOC_G_FREQUENCY") == EINVAL)
984 return 0;
985 switch_v4l2();
986 f->type = t->mode;
e18f9444
MK
987 if (fe_tuner_ops->get_frequency) {
988 u32 abs_freq;
989
990 fe_tuner_ops->get_frequency(&t->fe, &abs_freq);
991 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
992 (abs_freq * 2 + 125/2) / 125 :
993 (abs_freq + 62500/2) / 62500;
994 break;
995 }
27487d44
HV
996 f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
997 t->radio_freq : t->tv_freq;
f7ce3cc6
MCC
998 break;
999 }
1da177e4 1000 case VIDIOC_G_TUNER:
f7ce3cc6
MCC
1001 {
1002 struct v4l2_tuner *tuner = arg;
1003
1004 if (check_mode(t, "VIDIOC_G_TUNER") == EINVAL)
1005 return 0;
1006 switch_v4l2();
1007
8a4b275f 1008 tuner->type = t->mode;
af3b0f3f 1009 if (ops && ops->get_afc)
4e9154b8 1010 tuner->afc = ops->get_afc(&t->fe);
ab4cecf9
HV
1011 if (t->mode == V4L2_TUNER_ANALOG_TV)
1012 tuner->capability |= V4L2_TUNER_CAP_NORM;
8a4b275f 1013 if (t->mode != V4L2_TUNER_RADIO) {
f7ce3cc6
MCC
1014 tuner->rangelow = tv_range[0] * 16;
1015 tuner->rangehigh = tv_range[1] * 16;
8a4b275f
HV
1016 break;
1017 }
1018
1019 /* radio mode */
8a4b275f
HV
1020 tuner->rxsubchans =
1021 V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
e18f9444
MK
1022 if (fe_tuner_ops->get_status) {
1023 u32 tuner_status;
1024
1025 fe_tuner_ops->get_status(&t->fe, &tuner_status);
4e9154b8
MK
1026 tuner->rxsubchans =
1027 (tuner_status & TUNER_STATUS_STEREO) ?
1028 V4L2_TUNER_SUB_STEREO :
1029 V4L2_TUNER_SUB_MONO;
e18f9444 1030 } else {
af3b0f3f 1031 if (ops && ops->is_stereo) {
4e9154b8
MK
1032 tuner->rxsubchans =
1033 ops->is_stereo(&t->fe) ?
1034 V4L2_TUNER_SUB_STEREO :
1035 V4L2_TUNER_SUB_MONO;
e18f9444 1036 }
56fc08ca 1037 }
af3b0f3f 1038 if (ops && ops->has_signal)
4e9154b8 1039 tuner->signal = ops->has_signal(&t->fe);
8a4b275f
HV
1040 tuner->capability |=
1041 V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
1042 tuner->audmode = t->audmode;
1043 tuner->rangelow = radio_range[0] * 16000;
1044 tuner->rangehigh = radio_range[1] * 16000;
f7ce3cc6
MCC
1045 break;
1046 }
1047 case VIDIOC_S_TUNER:
1048 {
1049 struct v4l2_tuner *tuner = arg;
1050
1051 if (check_mode(t, "VIDIOC_S_TUNER") == EINVAL)
1052 return 0;
1053
1054 switch_v4l2();
1055
8a4b275f
HV
1056 /* do nothing unless we're a radio tuner */
1057 if (t->mode != V4L2_TUNER_RADIO)
1058 break;
1059 t->audmode = tuner->audmode;
1060 set_radio_freq(client, t->radio_freq);
f7ce3cc6 1061 break;
56fc08ca 1062 }
cd43c3f6 1063 case VIDIOC_LOG_STATUS:
af3b0f3f 1064 if (ops && ops->tuner_status)
4e9154b8 1065 ops->tuner_status(&t->fe);
cd43c3f6 1066 break;
1da177e4
LT
1067 }
1068
1069 return 0;
1070}
1071
21b48a70 1072static int tuner_suspend(struct i2c_client *c, pm_message_t state)
1da177e4 1073{
f7ce3cc6 1074 struct tuner *t = i2c_get_clientdata (c);
1da177e4 1075
f7ce3cc6 1076 tuner_dbg ("suspend\n");
1da177e4
LT
1077 /* FIXME: power down ??? */
1078 return 0;
1079}
1080
21b48a70 1081static int tuner_resume(struct i2c_client *c)
1da177e4 1082{
f7ce3cc6 1083 struct tuner *t = i2c_get_clientdata (c);
1da177e4 1084
f7ce3cc6 1085 tuner_dbg ("resume\n");
27487d44
HV
1086 if (V4L2_TUNER_RADIO == t->mode) {
1087 if (t->radio_freq)
1088 set_freq(c, t->radio_freq);
1089 } else {
1090 if (t->tv_freq)
1091 set_freq(c, t->tv_freq);
1092 }
1da177e4
LT
1093 return 0;
1094}
1095
1096/* ----------------------------------------------------------------------- */
1097
1098static struct i2c_driver driver = {
f7ce3cc6 1099 .id = I2C_DRIVERID_TUNER,
f7ce3cc6
MCC
1100 .attach_adapter = tuner_probe,
1101 .detach_client = tuner_detach,
1102 .command = tuner_command,
21b48a70
JD
1103 .suspend = tuner_suspend,
1104 .resume = tuner_resume,
1da177e4 1105 .driver = {
cab462f7 1106 .name = "tuner",
cab462f7 1107 },
1da177e4 1108};
f7ce3cc6 1109static struct i2c_client client_template = {
fae91e72 1110 .name = "(tuner unset)",
f7ce3cc6 1111 .driver = &driver,
1da177e4
LT
1112};
1113
1114static int __init tuner_init_module(void)
1115{
1116 return i2c_add_driver(&driver);
1117}
1118
1119static void __exit tuner_cleanup_module(void)
1120{
1121 i2c_del_driver(&driver);
1122}
1123
1124module_init(tuner_init_module);
1125module_exit(tuner_cleanup_module);
1126
1127/*
1128 * Overrides for Emacs so that we follow Linus's tabbing style.
1129 * ---------------------------------------------------------------------------
1130 * Local variables:
1131 * c-basic-offset: 8
1132 * End:
1133 */