aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@brturbo.com.br>2005-09-09 16:04:03 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-09 16:57:53 -0400
commit10b89ee387fd6cc38532a881f64b3d35f338ea0b (patch)
tree03799a6aeccb715fd5c95dbd97257baa6b0aba92
parent67e49a1abe3e9458c7ffba66775b350b5ceffae0 (diff)
[PATCH] v4l: include saa6588 compiler option and files / fixes comments on tuner.h
- Include saa6588 compiler option and files. - Fix comment on tuner.h - linux/utsname.h replaced by linux/version.h to compile on vanilla 2.6.13 Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/media/video/Kconfig12
-rw-r--r--drivers/media/video/Makefile2
-rw-r--r--drivers/media/video/bttvp.h2
-rw-r--r--drivers/media/video/cx88/cx88.h2
-rw-r--r--drivers/media/video/rds.h48
-rw-r--r--drivers/media/video/saa6588.c534
-rw-r--r--drivers/media/video/saa7134/saa7134.h2
-rw-r--r--include/media/tuner.h2
8 files changed, 600 insertions, 4 deletions
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
index 077720c2b640..93570355819a 100644
--- a/drivers/media/video/Kconfig
+++ b/drivers/media/video/Kconfig
@@ -25,6 +25,18 @@ config VIDEO_BT848
25 To compile this driver as a module, choose M here: the 25 To compile this driver as a module, choose M here: the
26 module will be called bttv. 26 module will be called bttv.
27 27
28config VIDEO_SAA6588
29 tristate "SAA6588 Radio Chip RDS decoder support on BT848 cards"
30 depends on VIDEO_DEV && I2C && VIDEO_BT848
31
32 help
33 Support for Radio Data System (RDS) decoder. This allows seeing
34 radio station identification transmitted using this standard.
35 Currentlly, it works only with bt8x8 chips.
36
37 To compile this driver as a module, choose M here: the
38 module will be called saa6588.
39
28config VIDEO_PMS 40config VIDEO_PMS
29 tristate "Mediavision Pro Movie Studio Video For Linux" 41 tristate "Mediavision Pro Movie Studio Video For Linux"
30 depends on VIDEO_DEV && ISA 42 depends on VIDEO_DEV && ISA
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile
index 3e6f5347da21..046b82de9285 100644
--- a/drivers/media/video/Makefile
+++ b/drivers/media/video/Makefile
@@ -5,6 +5,7 @@
5bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o \ 5bttv-objs := bttv-driver.o bttv-cards.o bttv-if.o \
6 bttv-risc.o bttv-vbi.o bttv-i2c.o bttv-gpio.o 6 bttv-risc.o bttv-vbi.o bttv-i2c.o bttv-gpio.o
7zoran-objs := zr36120.o zr36120_i2c.o zr36120_mem.o 7zoran-objs := zr36120.o zr36120_i2c.o zr36120_mem.o
8rds-objs := saa6588.o
8zr36067-objs := zoran_procfs.o zoran_device.o \ 9zr36067-objs := zoran_procfs.o zoran_device.o \
9 zoran_driver.o zoran_card.o 10 zoran_driver.o zoran_card.o
10tuner-objs := tuner-core.o tuner-simple.o mt20xx.o tda8290.o tea5767.o 11tuner-objs := tuner-core.o tuner-simple.o mt20xx.o tda8290.o tea5767.o
@@ -15,6 +16,7 @@ obj-$(CONFIG_VIDEO_BT848) += bttv.o msp3400.o tvaudio.o \
15obj-$(CONFIG_SOUND_TVMIXER) += tvmixer.o 16obj-$(CONFIG_SOUND_TVMIXER) += tvmixer.o
16 17
17obj-$(CONFIG_VIDEO_ZR36120) += zoran.o 18obj-$(CONFIG_VIDEO_ZR36120) += zoran.o
19obj-$(CONFIG_VIDEO_SAA6588) += rds.o
18obj-$(CONFIG_VIDEO_SAA5246A) += saa5246a.o 20obj-$(CONFIG_VIDEO_SAA5246A) += saa5246a.o
19obj-$(CONFIG_VIDEO_SAA5249) += saa5249.o 21obj-$(CONFIG_VIDEO_SAA5249) += saa5249.o
20obj-$(CONFIG_VIDEO_CQCAM) += c-qcam.o 22obj-$(CONFIG_VIDEO_CQCAM) += c-qcam.o
diff --git a/drivers/media/video/bttvp.h b/drivers/media/video/bttvp.h
index a0eb0ce1aa96..9b0b7ca035f8 100644
--- a/drivers/media/video/bttvp.h
+++ b/drivers/media/video/bttvp.h
@@ -25,7 +25,7 @@
25#ifndef _BTTVP_H_ 25#ifndef _BTTVP_H_
26#define _BTTVP_H_ 26#define _BTTVP_H_
27 27
28#include <linux/utsname.h> 28#include <linux/version.h>
29#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,16) 29#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,16)
30 30
31#include <linux/types.h> 31#include <linux/types.h>
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h
index 13b8fb7e921a..f48dd4353568 100644
--- a/drivers/media/video/cx88/cx88.h
+++ b/drivers/media/video/cx88/cx88.h
@@ -34,7 +34,7 @@
34#include "btcx-risc.h" 34#include "btcx-risc.h"
35#include "cx88-reg.h" 35#include "cx88-reg.h"
36 36
37#include <linux/utsname.h> 37#include <linux/version.h>
38#define CX88_VERSION_CODE KERNEL_VERSION(0,0,5) 38#define CX88_VERSION_CODE KERNEL_VERSION(0,0,5)
39 39
40#ifndef TRUE 40#ifndef TRUE
diff --git a/drivers/media/video/rds.h b/drivers/media/video/rds.h
new file mode 100644
index 000000000000..30337d0f1a87
--- /dev/null
+++ b/drivers/media/video/rds.h
@@ -0,0 +1,48 @@
1/*
2
3 Types and defines needed for RDS. This is included by
4 saa6588.c and every driver (e.g. bttv-driver.c) that wants
5 to use the saa6588 module.
6
7 Instead of having a seperate rds.h, I'd prefer to include
8 this stuff in one of the already existing files like tuner.h
9
10 (c) 2005 by Hans J. Koch
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25
26*/
27
28#ifndef _RDS_H
29#define _RDS_H
30
31struct rds_command {
32 unsigned int block_count;
33 int result;
34 unsigned char *buffer;
35 struct file *instance;
36 poll_table *event_list;
37};
38
39#define RDS_CMD_OPEN _IOW('R',1,int)
40#define RDS_CMD_CLOSE _IOW('R',2,int)
41#define RDS_CMD_READ _IOR('R',3,int)
42#define RDS_CMD_POLL _IOR('R',4,int)
43
44#endif
45
46
47
48
diff --git a/drivers/media/video/saa6588.c b/drivers/media/video/saa6588.c
new file mode 100644
index 000000000000..1a657a70ff43
--- /dev/null
+++ b/drivers/media/video/saa6588.c
@@ -0,0 +1,534 @@
1/*
2 Driver for SAA6588 RDS decoder
3
4 (c) 2005 Hans J. Koch
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21
22#include <linux/module.h>
23#include <linux/kernel.h>
24#include <linux/i2c.h>
25#include <linux/types.h>
26#include <linux/videodev.h>
27#include <linux/init.h>
28#include <linux/errno.h>
29#include <linux/slab.h>
30#include <linux/poll.h>
31#include <linux/wait.h>
32#include <asm/uaccess.h>
33
34#include <media/id.h>
35
36#include "rds.h"
37
38/* Addresses to scan */
39static unsigned short normal_i2c[] = {
40 0x20 >> 1,
41 0x22 >> 1,
42 I2C_CLIENT_END,
43};
44
45I2C_CLIENT_INSMOD;
46
47/* insmod options */
48static unsigned int debug = 0;
49static unsigned int xtal = 0;
50static unsigned int rbds = 0;
51static unsigned int plvl = 0;
52static unsigned int bufblocks = 100;
53
54MODULE_PARM(debug, "i");
55MODULE_PARM_DESC(debug, "enable debug messages");
56MODULE_PARM(xtal, "i");
57MODULE_PARM_DESC(xtal, "select oscillator frequency (0..3), default 0");
58MODULE_PARM(rbds, "i");
59MODULE_PARM_DESC(rbds, "select mode, 0=RDS, 1=RBDS, default 0");
60MODULE_PARM(plvl, "i");
61MODULE_PARM_DESC(plvl, "select pause level (0..3), default 0");
62MODULE_PARM(bufblocks, "i");
63MODULE_PARM_DESC(bufblocks, "number of buffered blocks, default 100");
64
65MODULE_DESCRIPTION("v4l2 driver module for SAA6588 RDS decoder");
66MODULE_AUTHOR("Hans J. Koch <koch@hjk-az.de>");
67
68MODULE_LICENSE("GPL");
69
70/* ---------------------------------------------------------------------- */
71
72#define UNSET (-1U)
73#define PREFIX "saa6588: "
74#define dprintk if (debug) printk
75
76struct saa6588 {
77 struct i2c_client client;
78 struct work_struct work;
79 struct timer_list timer;
80 spinlock_t lock;
81 unsigned char *buffer;
82 unsigned int buf_size;
83 unsigned int rd_index;
84 unsigned int wr_index;
85 unsigned int block_count;
86 unsigned char last_blocknum;
87 wait_queue_head_t read_queue;
88 int data_available_for_read;
89};
90
91static struct i2c_driver driver;
92static struct i2c_client client_template;
93
94/* ---------------------------------------------------------------------- */
95
96/*
97 * SAA6588 defines
98 */
99
100/* Initialization and mode control byte (0w) */
101
102/* bit 0+1 (DAC0/DAC1) */
103#define cModeStandard 0x00
104#define cModeFastPI 0x01
105#define cModeReducedRequest 0x02
106#define cModeInvalid 0x03
107
108/* bit 2 (RBDS) */
109#define cProcessingModeRDS 0x00
110#define cProcessingModeRBDS 0x04
111
112/* bit 3+4 (SYM0/SYM1) */
113#define cErrCorrectionNone 0x00
114#define cErrCorrection2Bits 0x08
115#define cErrCorrection5Bits 0x10
116#define cErrCorrectionNoneRBDS 0x18
117
118/* bit 5 (NWSY) */
119#define cSyncNormal 0x00
120#define cSyncRestart 0x20
121
122/* bit 6 (TSQD) */
123#define cSigQualityDetectOFF 0x00
124#define cSigQualityDetectON 0x40
125
126/* bit 7 (SQCM) */
127#define cSigQualityTriggered 0x00
128#define cSigQualityContinous 0x80
129
130/* Pause level and flywheel control byte (1w) */
131
132/* bits 0..5 (FEB0..FEB5) */
133#define cFlywheelMaxBlocksMask 0x3F
134#define cFlywheelDefault 0x20
135
136/* bits 6+7 (PL0/PL1) */
137#define cPauseLevel_11mV 0x00
138#define cPauseLevel_17mV 0x40
139#define cPauseLevel_27mV 0x80
140#define cPauseLevel_43mV 0xC0
141
142/* Pause time/oscillator frequency/quality detector control byte (1w) */
143
144/* bits 0..4 (SQS0..SQS4) */
145#define cQualityDetectSensMask 0x1F
146#define cQualityDetectDefault 0x0F
147
148/* bit 5 (SOSC) */
149#define cSelectOscFreqOFF 0x00
150#define cSelectOscFreqON 0x20
151
152/* bit 6+7 (PTF0/PTF1) */
153#define cOscFreq_4332kHz 0x00
154#define cOscFreq_8664kHz 0x40
155#define cOscFreq_12996kHz 0x80
156#define cOscFreq_17328kHz 0xC0
157
158/* ---------------------------------------------------------------------- */
159
160static int block_to_user_buf(struct saa6588 *s, unsigned char *user_buf)
161{
162 int i;
163
164 if (s->rd_index == s->wr_index) {
165 if (debug > 2)
166 dprintk(PREFIX "Read: buffer empty.\n");
167 return 0;
168 }
169
170 if (debug > 2) {
171 dprintk(PREFIX "Read: ");
172 for (i = s->rd_index; i < s->rd_index + 3; i++)
173 dprintk("0x%02x ", s->buffer[i]);
174 }
175
176 if (copy_to_user(user_buf, &s->buffer[s->rd_index], 3))
177 return -EFAULT;
178
179 s->rd_index += 3;
180 if (s->rd_index >= s->buf_size)
181 s->rd_index = 0;
182 s->block_count--;
183
184 if (debug > 2)
185 dprintk("%d blocks total.\n", s->block_count);
186
187 return 1;
188}
189
190static void read_from_buf(struct saa6588 *s, struct rds_command *a)
191{
192 unsigned long flags;
193
194 unsigned char *buf_ptr = a->buffer; /* This is a user space buffer! */
195 unsigned int i;
196 unsigned int rd_blocks;
197
198 a->result = 0;
199 if (!a->buffer)
200 return;
201
202 while (!s->data_available_for_read) {
203 int ret = wait_event_interruptible(s->read_queue,
204 s->data_available_for_read);
205 if (ret == -ERESTARTSYS) {
206 a->result = -EINTR;
207 return;
208 }
209 }
210
211 spin_lock_irqsave(&s->lock, flags);
212 rd_blocks = a->block_count;
213 if (rd_blocks > s->block_count)
214 rd_blocks = s->block_count;
215
216 if (!rd_blocks)
217 return;
218
219 for (i = 0; i < rd_blocks; i++) {
220 if (block_to_user_buf(s, buf_ptr)) {
221 buf_ptr += 3;
222 a->result++;
223 } else
224 break;
225 }
226 a->result *= 3;
227 s->data_available_for_read = (s->block_count > 0);
228 spin_unlock_irqrestore(&s->lock, flags);
229}
230
231static void block_to_buf(struct saa6588 *s, unsigned char *blockbuf)
232{
233 unsigned int i;
234
235 if (debug > 3)
236 dprintk(PREFIX "New block: ");
237
238 for (i = 0; i < 3; ++i) {
239 if (debug > 3)
240 dprintk("0x%02x ", blockbuf[i]);
241 s->buffer[s->wr_index] = blockbuf[i];
242 s->wr_index++;
243 }
244
245 if (s->wr_index >= s->buf_size)
246 s->wr_index = 0;
247
248 if (s->wr_index == s->rd_index) {
249 s->rd_index++;
250 if (s->rd_index >= s->buf_size)
251 s->rd_index = 0;
252 } else
253 s->block_count++;
254
255 if (debug > 3)
256 dprintk("%d blocks total.\n", s->block_count);
257}
258
259static void saa6588_i2c_poll(struct saa6588 *s)
260{
261 unsigned long flags;
262 unsigned char tmpbuf[6];
263 unsigned char blocknum;
264 unsigned char tmp;
265
266 /* Although we only need 3 bytes, we have to read at least 6.
267 SAA6588 returns garbage otherwise */
268 if (6 != i2c_master_recv(&s->client, &tmpbuf[0], 6)) {
269 if (debug > 1)
270 dprintk(PREFIX "read error!\n");
271 return;
272 }
273
274 blocknum = tmpbuf[0] >> 5;
275 if (blocknum == s->last_blocknum) {
276 if (debug > 3)
277 dprintk("Saw block %d again.\n", blocknum);
278 return;
279 }
280
281 s->last_blocknum = blocknum;
282
283 /*
284 Byte order according to v4l2 specification:
285
286 Byte 0: Least Significant Byte of RDS Block
287 Byte 1: Most Significant Byte of RDS Block
288 Byte 2 Bit 7: Error bit. Indicates that an uncorrectable error
289 occurred during reception of this block.
290 Bit 6: Corrected bit. Indicates that an error was
291 corrected for this data block.
292 Bits 5-3: Received Offset. Indicates the offset received
293 by the sync system.
294 Bits 2-0: Offset Name. Indicates the offset applied to this data.
295
296 SAA6588 byte order is Status-MSB-LSB, so we have to swap the
297 first and the last of the 3 bytes block.
298 */
299
300 tmp = tmpbuf[2];
301 tmpbuf[2] = tmpbuf[0];
302 tmpbuf[0] = tmp;
303
304 tmp = blocknum;
305 tmp |= blocknum << 3; /* Received offset == Offset Name (OK ?) */
306 if ((tmpbuf[2] & 0x03) == 0x03)
307 tmp |= 0x80; /* uncorrectable error */
308 else if ((tmpbuf[2] & 0x03) != 0x00)
309 tmp |= 0x40; /* corrected error */
310 tmpbuf[2] = tmp; /* Is this enough ? Should we also check other bits ? */
311
312 spin_lock_irqsave(&s->lock, flags);
313 block_to_buf(s, tmpbuf);
314 spin_unlock_irqrestore(&s->lock, flags);
315 s->data_available_for_read = 1;
316 wake_up_interruptible(&s->read_queue);
317}
318
319static void saa6588_timer(unsigned long data)
320{
321 struct saa6588 *s = (struct saa6588 *)data;
322
323 schedule_work(&s->work);
324}
325
326static void saa6588_work(void *data)
327{
328 struct saa6588 *s = (struct saa6588 *)data;
329
330 saa6588_i2c_poll(s);
331 mod_timer(&s->timer, jiffies + HZ / 50); /* 20 msec */
332}
333
334static int saa6588_configure(struct saa6588 *s)
335{
336 unsigned char buf[3];
337 int rc;
338
339 buf[0] = cSyncRestart;
340 if (rbds)
341 buf[0] |= cProcessingModeRBDS;
342
343 buf[1] = cFlywheelDefault;
344 switch (plvl) {
345 case 0:
346 buf[1] |= cPauseLevel_11mV;
347 break;
348 case 1:
349 buf[1] |= cPauseLevel_17mV;
350 break;
351 case 2:
352 buf[1] |= cPauseLevel_27mV;
353 break;
354 case 3:
355 buf[1] |= cPauseLevel_43mV;
356 break;
357 default: /* nothing */
358 break;
359 }
360
361 buf[2] = cQualityDetectDefault | cSelectOscFreqON;
362
363 switch (xtal) {
364 case 0:
365 buf[2] |= cOscFreq_4332kHz;
366 break;
367 case 1:
368 buf[2] |= cOscFreq_8664kHz;
369 break;
370 case 2:
371 buf[2] |= cOscFreq_12996kHz;
372 break;
373 case 3:
374 buf[2] |= cOscFreq_17328kHz;
375 break;
376 default: /* nothing */
377 break;
378 }
379
380 dprintk(PREFIX "writing: 0w=0x%02x 1w=0x%02x 2w=0x%02x\n",
381 buf[0], buf[1], buf[2]);
382
383 if (3 != (rc = i2c_master_send(&s->client, buf, 3)))
384 printk(PREFIX "i2c i/o error: rc == %d (should be 3)\n", rc);
385
386 return 0;
387}
388
389/* ---------------------------------------------------------------------- */
390
391static int saa6588_attach(struct i2c_adapter *adap, int addr, int kind)
392{
393 struct saa6588 *s;
394 client_template.adapter = adap;
395 client_template.addr = addr;
396
397 printk(PREFIX "chip found @ 0x%x\n", addr << 1);
398
399 if (NULL == (s = kmalloc(sizeof(*s), GFP_KERNEL)))
400 return -ENOMEM;
401
402 s->buf_size = bufblocks * 3;
403
404 if (NULL == (s->buffer = kmalloc(s->buf_size, GFP_KERNEL))) {
405 kfree(s);
406 return -ENOMEM;
407 }
408 s->client = client_template;
409 s->block_count = 0;
410 s->wr_index = 0;
411 s->rd_index = 0;
412 s->last_blocknum = 0xff;
413 init_waitqueue_head(&s->read_queue);
414 s->data_available_for_read = 0;
415 i2c_set_clientdata(&s->client, s);
416 i2c_attach_client(&s->client);
417
418 saa6588_configure(s);
419
420 /* start polling via eventd */
421 INIT_WORK(&s->work, saa6588_work, s);
422 init_timer(&s->timer);
423 s->timer.function = saa6588_timer;
424 s->timer.data = (unsigned long)s;
425 schedule_work(&s->work);
426
427 return 0;
428}
429
430static int saa6588_probe(struct i2c_adapter *adap)
431{
432#ifdef I2C_CLASS_TV_ANALOG
433 if (adap->class & I2C_CLASS_TV_ANALOG)
434 return i2c_probe(adap, &addr_data, saa6588_attach);
435#else
436 switch (adap->id) {
437 case I2C_ALGO_BIT | I2C_HW_B_BT848:
438 case I2C_ALGO_BIT | I2C_HW_B_RIVA:
439 case I2C_ALGO_SAA7134:
440 return i2c_probe(adap, &addr_data, saa6588_attach);
441 break;
442 }
443#endif
444 return 0;
445}
446
447static int saa6588_detach(struct i2c_client *client)
448{
449 struct saa6588 *s = i2c_get_clientdata(client);
450
451 del_timer_sync(&s->timer);
452 flush_scheduled_work();
453
454 i2c_detach_client(client);
455 kfree(s->buffer);
456 kfree(s);
457 return 0;
458}
459
460static int saa6588_command(struct i2c_client *client, unsigned int cmd,
461 void *arg)
462{
463 struct saa6588 *s = i2c_get_clientdata(client);
464 struct rds_command *a = (struct rds_command *)arg;
465
466 switch (cmd) {
467 /* --- open() for /dev/radio --- */
468 case RDS_CMD_OPEN:
469 a->result = 0; /* return error if chip doesn't work ??? */
470 break;
471 /* --- close() for /dev/radio --- */
472 case RDS_CMD_CLOSE:
473 s->data_available_for_read = 1;
474 wake_up_interruptible(&s->read_queue);
475 a->result = 0;
476 break;
477 /* --- read() for /dev/radio --- */
478 case RDS_CMD_READ:
479 read_from_buf(s, a);
480 break;
481 /* --- poll() for /dev/radio --- */
482 case RDS_CMD_POLL:
483 a->result = 0;
484 if (s->data_available_for_read) {
485 a->result |= POLLIN | POLLRDNORM;
486 }
487 poll_wait(a->instance, &s->read_queue, a->event_list);
488 break;
489
490 default:
491 /* nothing */
492 break;
493 }
494 return 0;
495}
496
497/* ----------------------------------------------------------------------- */
498
499static struct i2c_driver driver = {
500 .owner = THIS_MODULE,
501 .name = "i2c saa6588 driver",
502 .id = -1, /* FIXME */
503 .flags = I2C_DF_NOTIFY,
504 .attach_adapter = saa6588_probe,
505 .detach_client = saa6588_detach,
506 .command = saa6588_command,
507};
508
509static struct i2c_client client_template = {
510 .name = "saa6588",
511 .flags = I2C_CLIENT_ALLOW_USE,
512 .driver = &driver,
513};
514
515static int __init saa6588_init_module(void)
516{
517 return i2c_add_driver(&driver);
518}
519
520static void __exit saa6588_cleanup_module(void)
521{
522 i2c_del_driver(&driver);
523}
524
525module_init(saa6588_init_module);
526module_exit(saa6588_cleanup_module);
527
528/*
529 * Overrides for Emacs so that we follow Linus's tabbing style.
530 * ---------------------------------------------------------------------------
531 * Local variables:
532 * c-basic-offset: 8
533 * End:
534 */
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index 1d70f3415e90..3ea09142ec9c 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -19,7 +19,7 @@
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */ 20 */
21 21
22#include <linux/utsname.h> 22#include <linux/version.h>
23#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,14) 23#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,14)
24 24
25#include <linux/pci.h> 25#include <linux/pci.h>
diff --git a/include/media/tuner.h b/include/media/tuner.h
index 5b01ee6b0868..4ad08e24a1aa 100644
--- a/include/media/tuner.h
+++ b/include/media/tuner.h
@@ -1,4 +1,4 @@
1 * 1/*
2 tuner.h - definition for different tuners 2 tuner.h - definition for different tuners
3 3
4 Copyright (C) 1997 Markus Schroeder (schroedm@uni-duesseldorf.de) 4 Copyright (C) 1997 Markus Schroeder (schroedm@uni-duesseldorf.de)