2 * device driver for philips saa7134 based TV cards
5 * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include <linux/init.h>
23 #include <linux/list.h>
24 #include <linux/module.h>
25 #include <linux/kernel.h>
26 #include <linux/slab.h>
27 #include <linux/kmod.h>
28 #include <linux/sound.h>
29 #include <linux/interrupt.h>
31 #include "saa7134-reg.h"
34 MODULE_DESCRIPTION("v4l2 driver module for saa7130/34 based TV cards");
35 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
36 MODULE_LICENSE("GPL");
38 #define SAA7134_MAXBOARDS 8
40 /* ------------------------------------------------------------------ */
42 static unsigned int irq_debug = 0;
43 MODULE_PARM(irq_debug,"i");
44 MODULE_PARM_DESC(irq_debug,"enable debug messages [IRQ handler]");
46 static unsigned int core_debug = 0;
47 MODULE_PARM(core_debug,"i");
48 MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
50 static unsigned int gpio_tracking = 0;
51 MODULE_PARM(gpio_tracking,"i");
52 MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]");
54 static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
55 MODULE_PARM(video_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
56 MODULE_PARM_DESC(video_nr,"video device number");
58 static unsigned int ts_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
59 MODULE_PARM(ts_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
60 MODULE_PARM_DESC(ts_nr,"ts device number");
62 static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
63 MODULE_PARM(vbi_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
64 MODULE_PARM_DESC(vbi_nr,"vbi device number");
66 static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
67 MODULE_PARM(radio_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
68 MODULE_PARM_DESC(radio_nr,"radio device number");
70 static unsigned int oss = 0;
72 MODULE_PARM_DESC(oss,"register oss devices (default: no)");
74 static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
75 MODULE_PARM(dsp_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
76 MODULE_PARM_DESC(dsp_nr,"oss dsp device number");
78 static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
79 MODULE_PARM(mixer_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i");
80 MODULE_PARM_DESC(mixer_nr,"oss mixer device number");
82 static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
83 MODULE_PARM(tuner,"1-" __stringify(SAA7134_MAXBOARDS) "i");
84 MODULE_PARM_DESC(tuner,"tuner type");
86 static unsigned int card[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
87 MODULE_PARM(card,"1-" __stringify(SAA7134_MAXBOARDS) "i");
88 MODULE_PARM_DESC(card,"card type");
90 static unsigned int latency = UNSET;
91 MODULE_PARM(latency,"i");
92 MODULE_PARM_DESC(latency,"pci latency timer");
94 struct list_head saa7134_devlist;
95 unsigned int saa7134_devcount;
97 #define dprintk(fmt, arg...) if (core_debug) \
98 printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
100 /* ------------------------------------------------------------------ */
101 /* debug help functions */
103 static const char *v4l1_ioctls[] = {
104 "0", "GCAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", "GPICT", "SPICT",
105 "CCAPTURE", "GWIN", "SWIN", "GFBUF", "SFBUF", "KEY", "GFREQ",
106 "SFREQ", "GAUDIO", "SAUDIO", "SYNC", "MCAPTURE", "GMBUF", "GUNIT",
107 "GCAPTURE", "SCAPTURE", "SPLAYMODE", "SWRITEMODE", "GPLAYINFO",
108 "SMICROCODE", "GVBIFMT", "SVBIFMT" };
109 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
111 static const char *v4l2_ioctls[] = {
112 "QUERYCAP", "1", "ENUM_PIXFMT", "ENUM_FBUFFMT", "G_FMT", "S_FMT",
113 "G_COMP", "S_COMP", "REQBUFS", "QUERYBUF", "G_FBUF", "S_FBUF",
114 "G_WIN", "S_WIN", "PREVIEW", "QBUF", "16", "DQBUF", "STREAMON",
115 "STREAMOFF", "G_PERF", "G_PARM", "S_PARM", "G_STD", "S_STD",
116 "ENUMSTD", "ENUMINPUT", "G_CTRL", "S_CTRL", "G_TUNER", "S_TUNER",
117 "G_FREQ", "S_FREQ", "G_AUDIO", "S_AUDIO", "35", "QUERYCTRL",
118 "QUERYMENU", "G_INPUT", "S_INPUT", "ENUMCVT", "41", "42", "43",
119 "44", "45", "G_OUTPUT", "S_OUTPUT", "ENUMOUTPUT", "G_AUDOUT",
120 "S_AUDOUT", "ENUMFX", "G_EFFECT", "S_EFFECT", "G_MODULATOR",
123 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
125 static const char *osspcm_ioctls[] = {
126 "RESET", "SYNC", "SPEED", "STEREO", "GETBLKSIZE", "SETFMT",
127 "CHANNELS", "?", "POST", "SUBDIVIDE", "SETFRAGMENT", "GETFMTS",
128 "GETOSPACE", "GETISPACE", "NONBLOCK", "GETCAPS", "GET/SETTRIGGER",
129 "GETIPTR", "GETOPTR", "MAPINBUF", "MAPOUTBUF", "SETSYNCRO",
130 "SETDUPLEX", "GETODELAY"
132 #define OSSPCM_IOCTLS ARRAY_SIZE(v4l2_ioctls)
134 void saa7134_print_ioctl(char *name, unsigned int cmd)
138 switch (_IOC_DIR(cmd)) {
139 case _IOC_NONE: dir = "--"; break;
140 case _IOC_READ: dir = "r-"; break;
141 case _IOC_WRITE: dir = "-w"; break;
142 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
143 default: dir = "??"; break;
145 switch (_IOC_TYPE(cmd)) {
147 printk(KERN_DEBUG "%s: ioctl 0x%08x (v4l1, %s, VIDIOC%s)\n",
148 name, cmd, dir, (_IOC_NR(cmd) < V4L1_IOCTLS) ?
149 v4l1_ioctls[_IOC_NR(cmd)] : "???");
152 printk(KERN_DEBUG "%s: ioctl 0x%08x (v4l2, %s, VIDIOC_%s)\n",
153 name, cmd, dir, (_IOC_NR(cmd) < V4L2_IOCTLS) ?
154 v4l2_ioctls[_IOC_NR(cmd)] : "???");
157 printk(KERN_DEBUG "%s: ioctl 0x%08x (oss dsp, %s, SNDCTL_DSP_%s)\n",
158 name, cmd, dir, (_IOC_NR(cmd) < OSSPCM_IOCTLS) ?
159 osspcm_ioctls[_IOC_NR(cmd)] : "???");
162 printk(KERN_DEBUG "%s: ioctl 0x%08x (oss mixer, %s, #%d)\n",
163 name, cmd, dir, _IOC_NR(cmd));
166 printk(KERN_DEBUG "%s: ioctl 0x%08x (???, %s, #%d)\n",
167 name, cmd, dir, _IOC_NR(cmd));
171 void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
173 unsigned long mode,status;
177 /* rising SAA7134_GPIO_GPRESCAN reads the status */
178 saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,0);
179 saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,SAA7134_GPIO_GPRESCAN);
180 mode = saa_readl(SAA7134_GPIO_GPMODE0 >> 2) & 0xfffffff;
181 status = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & 0xfffffff;
183 "%s: gpio: mode=0x%07lx in=0x%07lx out=0x%07lx [%s]\n",
184 dev->name, mode, (~mode) & status, mode & status, msg);
187 /* ------------------------------------------------------------------ */
190 static char *dec1_bits[8] = {
191 "DCSTD0", "DCSCT1", "WIPA", "GLIMB",
192 "GLIMT", "SLTCA", "HLCK"
194 static char *dec2_bits[8] = {
195 "RDCAP", "COPRO", "COLSTR", "TYPE3",
196 NULL, "FIDT", "HLVLN", "INTL"
198 static char *scale1_bits[8] = {
199 "VID_A", "VBI_A", NULL, NULL, "VID_B", "VBI_B"
201 static char *scale2_bits[8] = {
202 "TRERR", "CFERR", "LDERR", "WASRST",
203 "FIDSCI", "FIDSCO", "D6^D5", "TASK"
206 static void dump_statusreg(struct saa7134_dev *dev, int reg,
207 char *regname, char **bits)
211 value = saa_readb(reg);
212 printk(KERN_DEBUG "%s: %s:", dev->name, regname);
213 for (i = 7; i >= 0; i--) {
216 printk(" %s=%d", bits[i], (value & (1 << i)) ? 1 : 0);
221 static void dump_statusregs(struct saa7134_dev *dev)
223 dump_statusreg(dev,SAA7134_STATUS_VIDEO1,"dec1",dec1_bits);
224 dump_statusreg(dev,SAA7134_STATUS_VIDEO2,"dec2",dec2_bits);
225 dump_statusreg(dev,SAA7134_SCALER_STATUS0,"scale0",scale1_bits);
226 dump_statusreg(dev,SAA7134_SCALER_STATUS1,"scale1",scale2_bits);
230 /* ------------------------------------------------------------------ */
232 /* nr of (saa7134-)pages for the given buffer size */
233 int saa7134_buffer_pages(int size)
235 size = PAGE_ALIGN(size);
236 size += PAGE_SIZE; /* for non-page-aligned buffers */
241 /* calc max # of buffers from size (must not exceed the 4MB virtual
242 * address space per DMA channel) */
243 int saa7134_buffer_count(unsigned int size, unsigned int count)
245 unsigned int maxcount;
247 maxcount = 1024 / saa7134_buffer_pages(size);
248 if (count > maxcount)
253 int saa7134_buffer_startpage(struct saa7134_buf *buf)
255 return saa7134_buffer_pages(buf->vb.bsize) * buf->vb.i;
258 unsigned long saa7134_buffer_base(struct saa7134_buf *buf)
262 base = saa7134_buffer_startpage(buf) * 4096;
263 base += buf->vb.dma.sglist[0].offset;
267 /* ------------------------------------------------------------------ */
269 int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt)
274 cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr);
277 pt->size = SAA7134_PGTABLE_SIZE;
283 int saa7134_pgtable_build(struct pci_dev *pci, struct saa7134_pgtable *pt,
284 struct scatterlist *list, unsigned int length,
285 unsigned int startpage)
290 BUG_ON(NULL == pt || NULL == pt->cpu);
292 ptr = pt->cpu + startpage;
293 for (i = 0; i < length; i++, list++)
294 for (p = 0; p * 4096 < list->length; p++, ptr++)
295 *ptr = sg_dma_address(list) - list->offset;
299 void saa7134_pgtable_free(struct pci_dev *pci, struct saa7134_pgtable *pt)
303 pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
307 /* ------------------------------------------------------------------ */
309 void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf)
314 videobuf_waiton(&buf->vb,0,0);
315 videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma);
316 videobuf_dma_free(&buf->vb.dma);
317 buf->vb.state = STATE_NEEDS_INIT;
320 /* ------------------------------------------------------------------ */
322 int saa7134_buffer_queue(struct saa7134_dev *dev,
323 struct saa7134_dmaqueue *q,
324 struct saa7134_buf *buf)
326 struct saa7134_buf *next = NULL;
328 BUG_ON(!spin_is_locked(&dev->slock));
331 dprintk("buffer_queue %p\n",buf);
332 if (NULL == q->curr) {
335 buf->activate(dev,buf,NULL);
336 } else if (list_empty(&q->queue)) {
337 list_add_tail(&buf->vb.queue,&q->queue);
338 buf->vb.state = STATE_QUEUED;
340 next = list_entry(q->queue.next,struct saa7134_buf,
343 buf->activate(dev,buf,next);
346 list_add_tail(&buf->vb.queue,&q->queue);
347 buf->vb.state = STATE_QUEUED;
352 void saa7134_buffer_finish(struct saa7134_dev *dev,
353 struct saa7134_dmaqueue *q,
357 BUG_ON(!spin_is_locked(&dev->slock));
359 dprintk("buffer_finish %p\n",q->curr);
361 /* finish current buffer */
362 q->curr->vb.state = state;
363 do_gettimeofday(&q->curr->vb.ts);
364 wake_up(&q->curr->vb.done);
368 void saa7134_buffer_next(struct saa7134_dev *dev,
369 struct saa7134_dmaqueue *q)
371 struct saa7134_buf *buf,*next = NULL;
374 BUG_ON(!spin_is_locked(&dev->slock));
376 BUG_ON(NULL != q->curr);
378 if (!list_empty(&q->queue)) {
379 /* activate next one from queue */
380 buf = list_entry(q->queue.next,struct saa7134_buf,vb.queue);
381 dprintk("buffer_next %p [prev=%p/next=%p]\n",
382 buf,q->queue.prev,q->queue.next);
383 list_del(&buf->vb.queue);
384 if (!list_empty(&q->queue))
385 next = list_entry(q->queue.next,struct saa7134_buf,
388 buf->activate(dev,buf,next);
389 dprintk("buffer_next #2 prev=%p/next=%p\n",
390 q->queue.prev,q->queue.next);
392 /* nothing to do -- just stop DMA */
393 dprintk("buffer_next %p\n",NULL);
394 saa7134_set_dmabits(dev);
395 del_timer(&q->timeout);
399 void saa7134_buffer_timeout(unsigned long data)
401 struct saa7134_dmaqueue *q = (struct saa7134_dmaqueue*)data;
402 struct saa7134_dev *dev = q->dev;
405 spin_lock_irqsave(&dev->slock,flags);
407 /* try to reset the hardware (SWRST) */
408 saa_writeb(SAA7134_REGION_ENABLE, 0x00);
409 saa_writeb(SAA7134_REGION_ENABLE, 0x80);
410 saa_writeb(SAA7134_REGION_ENABLE, 0x00);
412 /* flag current buffer as failed,
413 try to start over with the next one. */
415 dprintk("timeout on %p\n",q->curr);
416 saa7134_buffer_finish(dev,q,STATE_ERROR);
418 saa7134_buffer_next(dev,q);
419 spin_unlock_irqrestore(&dev->slock,flags);
422 /* ------------------------------------------------------------------ */
424 int saa7134_set_dmabits(struct saa7134_dev *dev)
426 u32 split, task=0, ctrl=0, irq=0;
427 enum v4l2_field cap = V4L2_FIELD_ANY;
428 enum v4l2_field ov = V4L2_FIELD_ANY;
431 BUG_ON(!spin_is_locked(&dev->slock));
434 /* video capture -- dma 0 + video task A */
435 if (dev->video_q.curr) {
437 ctrl |= SAA7134_MAIN_CTRL_TE0;
438 irq |= SAA7134_IRQ1_INTE_RA0_1 |
439 SAA7134_IRQ1_INTE_RA0_0;
440 cap = dev->video_q.curr->vb.field;
443 /* video capture -- dma 1+2 (planar modes) */
444 if (dev->video_q.curr &&
445 dev->video_q.curr->fmt->planar) {
446 ctrl |= SAA7134_MAIN_CTRL_TE4 |
447 SAA7134_MAIN_CTRL_TE5;
450 /* screen overlay -- dma 0 + video task B */
453 ctrl |= SAA7134_MAIN_CTRL_TE1;
457 /* vbi capture -- dma 0 + vbi task A+B */
458 if (dev->vbi_q.curr) {
460 ctrl |= SAA7134_MAIN_CTRL_TE2 |
461 SAA7134_MAIN_CTRL_TE3;
462 irq |= SAA7134_IRQ1_INTE_RA0_7 |
463 SAA7134_IRQ1_INTE_RA0_6 |
464 SAA7134_IRQ1_INTE_RA0_5 |
465 SAA7134_IRQ1_INTE_RA0_4;
468 /* audio capture -- dma 3 */
469 if (dev->oss.dma_running) {
470 ctrl |= SAA7134_MAIN_CTRL_TE6;
471 irq |= SAA7134_IRQ1_INTE_RA3_1 |
472 SAA7134_IRQ1_INTE_RA3_0;
475 /* TS capture -- dma 5 */
476 if (dev->ts_q.curr) {
477 ctrl |= SAA7134_MAIN_CTRL_TE5;
478 irq |= SAA7134_IRQ1_INTE_RA2_3 |
479 SAA7134_IRQ1_INTE_RA2_2 |
480 SAA7134_IRQ1_INTE_RA2_1 |
481 SAA7134_IRQ1_INTE_RA2_0;
484 /* set task conditions + field handling */
485 if (V4L2_FIELD_HAS_BOTH(cap) || V4L2_FIELD_HAS_BOTH(ov) || cap == ov) {
486 /* default config -- use full frames */
487 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
488 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
489 saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x02);
490 saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x02);
493 /* split fields between tasks */
494 if (V4L2_FIELD_TOP == cap) {
495 /* odd A, even B, repeat */
496 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
497 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0e);
499 /* odd B, even A, repeat */
500 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0e);
501 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
503 saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x01);
504 saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x01);
509 saa_writeb(SAA7134_REGION_ENABLE, task);
510 saa_writel(SAA7134_IRQ1, irq);
511 saa_andorl(SAA7134_MAIN_CTRL,
512 SAA7134_MAIN_CTRL_TE0 |
513 SAA7134_MAIN_CTRL_TE1 |
514 SAA7134_MAIN_CTRL_TE2 |
515 SAA7134_MAIN_CTRL_TE3 |
516 SAA7134_MAIN_CTRL_TE4 |
517 SAA7134_MAIN_CTRL_TE5 |
518 SAA7134_MAIN_CTRL_TE6,
520 dprintk("dmabits: task=0x%02x ctrl=0x%02x irq=0x%x split=%s\n",
521 task, ctrl, irq, split ? "no" : "yes");
526 /* ------------------------------------------------------------------ */
527 /* IRQ handler + helpers */
529 static char *irqbits[] = {
530 "DONE_RA0", "DONE_RA1", "DONE_RA2", "DONE_RA3",
531 "AR", "PE", "PWR_ON", "RDCAP", "INTL", "FIDT", "MMC",
532 "TRIG_ERR", "CONF_ERR", "LOAD_ERR",
533 "GPIO16?", "GPIO18", "GPIO22", "GPIO23"
535 #define IRQBITS ARRAY_SIZE(irqbits)
537 static void print_irqstatus(struct saa7134_dev *dev, int loop,
538 unsigned long report, unsigned long status)
542 printk(KERN_DEBUG "%s/irq[%d,%ld]: r=0x%lx s=0x%02lx",
543 dev->name,loop,jiffies,report,status);
544 for (i = 0; i < IRQBITS; i++) {
545 if (!(report & (1 << i)))
547 printk(" %s",irqbits[i]);
549 if (report & SAA7134_IRQ_REPORT_DONE_RA0) {
550 printk(" | RA0=%s,%s,%s,%ld",
551 (status & 0x40) ? "vbi" : "video",
552 (status & 0x20) ? "b" : "a",
553 (status & 0x10) ? "odd" : "even",
559 static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
561 struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
562 unsigned long report,status;
563 int loop, handled = 0;
565 for (loop = 0; loop < 10; loop++) {
566 report = saa_readl(SAA7134_IRQ_REPORT);
567 status = saa_readl(SAA7134_IRQ_STATUS);
570 printk(KERN_DEBUG "%s/irq: no (more) work\n",
575 saa_writel(SAA7134_IRQ_REPORT,report);
577 print_irqstatus(dev,loop,report,status);
580 if (report & SAA7134_IRQ_REPORT_CONF_ERR)
581 dump_statusregs(dev);
584 if (report & SAA7134_IRQ_REPORT_INTL)
585 saa7134_irq_video_intl(dev);
587 if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
588 (status & 0x60) == 0)
589 saa7134_irq_video_done(dev,status);
591 if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
592 (status & 0x40) == 0x40)
593 saa7134_irq_vbi_done(dev,status);
595 if ((report & SAA7134_IRQ_REPORT_DONE_RA2) &&
597 saa7134_irq_ts_done(dev,status);
599 if ((report & SAA7134_IRQ_REPORT_DONE_RA3))
600 saa7134_irq_oss_done(dev,status);
602 if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
603 SAA7134_IRQ_REPORT_GPIO18)) &&
605 saa7134_input_irq(dev);
609 print_irqstatus(dev,loop,report,status);
610 printk(KERN_WARNING "%s/irq: looping -- clearing enable bits\n",dev->name);
611 /* disable all irqs */
612 saa_writel(SAA7134_IRQ1,0);
613 saa_writel(SAA7134_IRQ2,0);
617 return IRQ_RETVAL(handled);
620 /* ------------------------------------------------------------------ */
622 /* early init (no i2c, no irq) */
623 static int saa7134_hwinit1(struct saa7134_dev *dev)
625 dprintk("hwinit1\n");
627 saa_writel(SAA7134_IRQ1, 0);
628 saa_writel(SAA7134_IRQ2, 0);
629 init_MUTEX(&dev->lock);
630 dev->slock = SPIN_LOCK_UNLOCKED;
632 saa7134_track_gpio(dev,"pre-init");
633 saa7134_video_init1(dev);
634 saa7134_vbi_init1(dev);
635 if (card_has_ts(dev))
636 saa7134_ts_init1(dev);
637 saa7134_input_init1(dev);
639 switch (dev->pci->device) {
640 case PCI_DEVICE_ID_PHILIPS_SAA7134:
641 case PCI_DEVICE_ID_PHILIPS_SAA7133:
642 case PCI_DEVICE_ID_PHILIPS_SAA7135:
643 saa7134_oss_init1(dev);
647 /* RAM FIFO config */
648 saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
649 saa_writel(SAA7134_THRESHOULD,0x02020202);
651 /* enable audio + video processing */
652 saa_writel(SAA7134_MAIN_CTRL,
653 SAA7134_MAIN_CTRL_VPLLE |
654 SAA7134_MAIN_CTRL_APLLE |
655 SAA7134_MAIN_CTRL_EXOSC |
656 SAA7134_MAIN_CTRL_EVFE1 |
657 SAA7134_MAIN_CTRL_EVFE2 |
658 SAA7134_MAIN_CTRL_ESFE |
659 SAA7134_MAIN_CTRL_EBADC |
660 SAA7134_MAIN_CTRL_EBDAC);
662 /* enable peripheral devices */
663 saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
665 /* set vertical line numbering start (vbi needs this) */
666 saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);
671 /* late init (with i2c + irq) */
672 static int saa7134_hwinit2(struct saa7134_dev *dev)
674 dprintk("hwinit2\n");
676 saa7134_video_init2(dev);
677 saa7134_tvaudio_init2(dev);
680 saa_writel(SAA7134_IRQ1, 0);
681 saa_writel(SAA7134_IRQ2,
682 SAA7134_IRQ2_INTE_GPIO18 |
683 SAA7134_IRQ2_INTE_GPIO18A |
684 SAA7134_IRQ2_INTE_GPIO16 |
685 SAA7134_IRQ2_INTE_SC2 |
686 SAA7134_IRQ2_INTE_SC1 |
687 SAA7134_IRQ2_INTE_SC0 |
688 /* SAA7134_IRQ2_INTE_DEC5 | FIXME: TRIG_ERR ??? */
689 SAA7134_IRQ2_INTE_DEC3 |
690 SAA7134_IRQ2_INTE_DEC2 |
691 /* SAA7134_IRQ2_INTE_DEC1 | */
692 SAA7134_IRQ2_INTE_DEC0 |
693 SAA7134_IRQ2_INTE_PE |
694 SAA7134_IRQ2_INTE_AR);
700 static int saa7134_hwfini(struct saa7134_dev *dev)
704 switch (dev->pci->device) {
705 case PCI_DEVICE_ID_PHILIPS_SAA7134:
706 case PCI_DEVICE_ID_PHILIPS_SAA7133:
707 case PCI_DEVICE_ID_PHILIPS_SAA7135:
708 saa7134_oss_fini(dev);
711 if (card_has_ts(dev))
712 saa7134_ts_fini(dev);
713 saa7134_input_fini(dev);
714 saa7134_vbi_fini(dev);
715 saa7134_video_fini(dev);
716 saa7134_tvaudio_fini(dev);
720 static void __devinit must_configure_manually(void)
726 "saa7134: Congratulations! Your TV card vendor saved a few\n"
727 "saa7134: cents for a eeprom, thus your pci board has no\n"
728 "saa7134: subsystem ID and I can't identify it automatically\n"
730 "saa7134: I feel better now. Ok, here are the good news:\n"
731 "saa7134: You can use the card=<nr> insmod option to specify\n"
732 "saa7134: which board do you have. The list:\n");
733 for (i = 0; i < saa7134_bcount; i++) {
734 printk(KERN_WARNING "saa7134: card=%d -> %-40.40s",
735 i,saa7134_boards[i].name);
736 for (p = 0; saa7134_pci_tbl[p].driver_data; p++) {
737 if (saa7134_pci_tbl[p].driver_data != i)
740 saa7134_pci_tbl[p].subvendor,
741 saa7134_pci_tbl[p].subdevice);
747 static struct video_device *vdev_init(struct saa7134_dev *dev,
748 struct video_device *template,
751 struct video_device *vfd;
753 vfd = video_device_alloc();
758 vfd->dev = &dev->pci->dev;
759 vfd->release = video_device_release;
760 snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
761 dev->name, type, saa7134_boards[dev->board].name);
765 static void saa7134_unregister_video(struct saa7134_dev *dev)
767 if (dev->video_dev) {
768 if (-1 != dev->video_dev->minor)
769 video_unregister_device(dev->video_dev);
771 video_device_release(dev->video_dev);
772 dev->video_dev = NULL;
775 if (-1 != dev->ts_dev->minor)
776 video_unregister_device(dev->ts_dev);
778 video_device_release(dev->ts_dev);
782 if (-1 != dev->vbi_dev->minor)
783 video_unregister_device(dev->vbi_dev);
785 video_device_release(dev->vbi_dev);
788 if (dev->radio_dev) {
789 if (-1 != dev->radio_dev->minor)
790 video_unregister_device(dev->radio_dev);
792 video_device_release(dev->radio_dev);
793 dev->radio_dev = NULL;
797 static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
798 const struct pci_device_id *pci_id)
800 struct saa7134_dev *dev;
803 dev = kmalloc(sizeof(*dev),GFP_KERNEL);
806 memset(dev,0,sizeof(*dev));
810 if (pci_enable_device(pci_dev)) {
814 sprintf(dev->name,"saa%x[%d]",pci_dev->device,saa7134_devcount);
817 if (pci_pci_problems) {
818 if (pci_pci_problems & PCIPCI_TRITON)
819 printk(KERN_INFO "%s: quirk: PCIPCI_TRITON\n", dev->name);
820 if (pci_pci_problems & PCIPCI_NATOMA)
821 printk(KERN_INFO "%s: quirk: PCIPCI_NATOMA\n", dev->name);
822 if (pci_pci_problems & PCIPCI_VIAETBF)
823 printk(KERN_INFO "%s: quirk: PCIPCI_VIAETBF\n", dev->name);
824 if (pci_pci_problems & PCIPCI_VSFX)
825 printk(KERN_INFO "%s: quirk: PCIPCI_VSFX\n",dev->name);
826 #ifdef PCIPCI_ALIMAGIK
827 if (pci_pci_problems & PCIPCI_ALIMAGIK) {
828 printk(KERN_INFO "%s: quirk: PCIPCI_ALIMAGIK -- latency fixup\n",
834 if (UNSET != latency) {
835 printk(KERN_INFO "%s: setting pci latency timer to %d\n",
837 pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, latency);
841 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
842 pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
843 printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, "
844 "latency: %d, mmio: 0x%lx\n", dev->name,
845 pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
846 dev->pci_lat,pci_resource_start(pci_dev,0));
847 pci_set_master(pci_dev);
848 if (!pci_dma_supported(pci_dev,0xffffffff)) {
849 printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name);
855 dev->board = pci_id->driver_data;
856 if (card[saa7134_devcount] >= 0 &&
857 card[saa7134_devcount] < saa7134_bcount)
858 dev->board = card[saa7134_devcount];
859 if (SAA7134_BOARD_NOAUTO == dev->board) {
860 must_configure_manually();
861 dev->board = SAA7134_BOARD_UNKNOWN;
863 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
864 if (UNSET != tuner[saa7134_devcount])
865 dev->tuner_type = tuner[saa7134_devcount];
866 printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
867 dev->name,pci_dev->subsystem_vendor,
868 pci_dev->subsystem_device,saa7134_boards[dev->board].name,
869 dev->board, card[saa7134_devcount] == dev->board ?
870 "insmod option" : "autodetected");
873 if (!request_mem_region(pci_resource_start(pci_dev,0),
874 pci_resource_len(pci_dev,0),
877 printk(KERN_ERR "%s: can't get MMIO memory @ 0x%lx\n",
878 dev->name,pci_resource_start(pci_dev,0));
881 dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000);
882 dev->bmmio = (__u8*)dev->lmmio;
883 if (NULL == dev->lmmio) {
885 printk(KERN_ERR "%s: can't ioremap() MMIO memory\n",
890 /* initialize hardware #1 */
891 saa7134_board_init(dev);
892 saa7134_hwinit1(dev);
895 err = request_irq(pci_dev->irq, saa7134_irq,
896 SA_SHIRQ | SA_INTERRUPT, dev->name, dev);
898 printk(KERN_ERR "%s: can't get IRQ %d\n",
899 dev->name,pci_dev->irq);
903 /* wait a bit, register i2c bus */
904 set_current_state(TASK_INTERRUPTIBLE);
905 schedule_timeout(HZ/10);
906 saa7134_i2c_register(dev);
908 /* initialize hardware #2 */
909 saa7134_hwinit2(dev);
911 /* load i2c helpers */
912 if (TUNER_ABSENT != dev->tuner_type)
913 request_module("tuner");
914 if (saa7134_boards[dev->board].need_tda9887)
915 request_module("tda9887");
916 if (card_has_ts(dev))
917 request_module("saa6752hs");
919 #ifdef VIDIOC_G_PRIORITY
920 v4l2_prio_init(&dev->prio);
923 /* register v4l devices */
924 dev->video_dev = vdev_init(dev,&saa7134_video_template,"video");
925 err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
926 video_nr[saa7134_devcount]);
928 printk(KERN_INFO "%s: can't register video device\n",
932 printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
933 dev->name,dev->video_dev->minor & 0x1f);
935 if (card_has_ts(dev)) {
936 dev->ts_dev = vdev_init(dev,&saa7134_ts_template,"ts");
937 err = video_register_device(dev->ts_dev,VFL_TYPE_GRABBER,
938 ts_nr[saa7134_devcount]);
940 printk(KERN_INFO "%s: can't register video device\n",
944 printk(KERN_INFO "%s: registered device video%d [ts]\n",
945 dev->name,dev->ts_dev->minor & 0x1f);
948 dev->vbi_dev = vdev_init(dev,&saa7134_vbi_template,"vbi");
949 err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
950 vbi_nr[saa7134_devcount]);
953 printk(KERN_INFO "%s: registered device vbi%d\n",
954 dev->name,dev->vbi_dev->minor & 0x1f);
956 if (card_has_radio(dev)) {
957 dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
958 err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
959 radio_nr[saa7134_devcount]);
962 printk(KERN_INFO "%s: registered device radio%d\n",
963 dev->name,dev->radio_dev->minor & 0x1f);
966 /* register oss devices */
967 switch (dev->pci->device) {
968 case PCI_DEVICE_ID_PHILIPS_SAA7134:
969 case PCI_DEVICE_ID_PHILIPS_SAA7133:
970 case PCI_DEVICE_ID_PHILIPS_SAA7135:
972 err = dev->oss.minor_dsp =
973 register_sound_dsp(&saa7134_dsp_fops,
974 dsp_nr[saa7134_devcount]);
978 printk(KERN_INFO "%s: registered device dsp%d\n",
979 dev->name,dev->oss.minor_dsp >> 4);
981 err = dev->oss.minor_mixer =
982 register_sound_mixer(&saa7134_mixer_fops,
983 mixer_nr[saa7134_devcount]);
986 printk(KERN_INFO "%s: registered device mixer%d\n",
987 dev->name,dev->oss.minor_mixer >> 4);
992 /* everything worked */
993 list_add_tail(&dev->devlist,&saa7134_devlist);
994 pci_set_drvdata(pci_dev,dev);
999 switch (dev->pci->device) {
1000 case PCI_DEVICE_ID_PHILIPS_SAA7134:
1001 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1002 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1004 unregister_sound_dsp(dev->oss.minor_dsp);
1008 saa7134_unregister_video(dev);
1009 saa7134_i2c_unregister(dev);
1010 free_irq(pci_dev->irq, dev);
1012 saa7134_hwfini(dev);
1013 iounmap(dev->lmmio);
1015 release_mem_region(pci_resource_start(pci_dev,0),
1016 pci_resource_len(pci_dev,0));
1022 static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
1024 struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
1028 u32 report = saa_readl(SAA7134_IRQ_REPORT);
1029 u32 status = saa_readl(SAA7134_IRQ_STATUS);
1030 print_irqstatus(dev,42,report,status);
1033 /* disable peripheral devices */
1034 saa_writeb(SAA7134_SPECIAL_MODE,0);
1036 /* shutdown hardware */
1037 saa_writel(SAA7134_IRQ1,0);
1038 saa_writel(SAA7134_IRQ2,0);
1039 saa_writel(SAA7134_MAIN_CTRL,0);
1041 /* shutdown subsystems */
1042 saa7134_hwfini(dev);
1045 saa7134_i2c_unregister(dev);
1046 switch (dev->pci->device) {
1047 case PCI_DEVICE_ID_PHILIPS_SAA7134:
1048 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1049 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1051 unregister_sound_mixer(dev->oss.minor_mixer);
1052 unregister_sound_dsp(dev->oss.minor_dsp);
1056 saa7134_unregister_video(dev);
1058 /* release ressources */
1059 free_irq(pci_dev->irq, dev);
1060 iounmap(dev->lmmio);
1061 release_mem_region(pci_resource_start(pci_dev,0),
1062 pci_resource_len(pci_dev,0));
1064 #if 0 /* causes some trouble when reinserting the driver ... */
1065 pci_disable_device(pci_dev);
1067 pci_set_drvdata(pci_dev, NULL);
1070 list_del(&dev->devlist);
1075 static struct pci_driver saa7134_pci_driver = {
1077 .id_table = saa7134_pci_tbl,
1078 .probe = saa7134_initdev,
1079 .remove = saa7134_finidev,
1082 static int saa7134_init(void)
1084 INIT_LIST_HEAD(&saa7134_devlist);
1085 printk(KERN_INFO "saa7130/34: v4l2 driver version %d.%d.%d loaded\n",
1086 (SAA7134_VERSION_CODE >> 16) & 0xff,
1087 (SAA7134_VERSION_CODE >> 8) & 0xff,
1088 SAA7134_VERSION_CODE & 0xff);
1090 printk(KERN_INFO "saa7130/34: snapshot date %04d-%02d-%02d\n",
1091 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
1093 return pci_module_init(&saa7134_pci_driver);
1096 static void saa7134_fini(void)
1098 pci_unregister_driver(&saa7134_pci_driver);
1101 module_init(saa7134_init);
1102 module_exit(saa7134_fini);
1104 /* ----------------------------------------------------------- */