2 * $Id: saa7134-core.c,v 1.15 2004/11/07 14:44:59 kraxel Exp $
4 * device driver for philips saa7134 based TV cards
7 * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <linux/config.h>
25 #include <linux/init.h>
26 #include <linux/list.h>
27 #include <linux/module.h>
28 #include <linux/kernel.h>
29 #include <linux/slab.h>
30 #include <linux/kmod.h>
31 #include <linux/sound.h>
32 #include <linux/interrupt.h>
33 #include <linux/delay.h>
35 #include "saa7134-reg.h"
38 MODULE_DESCRIPTION("v4l2 driver module for saa7130/34 based TV cards");
39 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
40 MODULE_LICENSE("GPL");
42 /* ------------------------------------------------------------------ */
44 static unsigned int irq_debug = 0;
45 module_param(irq_debug, int, 0644);
46 MODULE_PARM_DESC(irq_debug,"enable debug messages [IRQ handler]");
48 static unsigned int core_debug = 0;
49 module_param(core_debug, int, 0644);
50 MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
52 static unsigned int gpio_tracking = 0;
53 module_param(gpio_tracking, int, 0644);
54 MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]");
56 static unsigned int oss = 0;
57 module_param(oss, int, 0444);
58 MODULE_PARM_DESC(oss,"register oss devices (default: no)");
60 static unsigned int latency = UNSET;
61 module_param(latency, int, 0444);
62 MODULE_PARM_DESC(latency,"pci latency timer");
64 static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
65 static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
66 static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
67 static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
68 static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
69 static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
70 static unsigned int card[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
72 module_param_array(video_nr, int, NULL, 0444);
73 module_param_array(vbi_nr, int, NULL, 0444);
74 module_param_array(radio_nr, int, NULL, 0444);
75 module_param_array(dsp_nr, int, NULL, 0444);
76 module_param_array(mixer_nr, int, NULL, 0444);
77 module_param_array(tuner, int, NULL, 0444);
78 module_param_array(card, int, NULL, 0444);
80 MODULE_PARM_DESC(video_nr, "video device number");
81 MODULE_PARM_DESC(vbi_nr, "vbi device number");
82 MODULE_PARM_DESC(radio_nr, "radio device number");
83 MODULE_PARM_DESC(dsp_nr, "oss dsp device number");
84 MODULE_PARM_DESC(mixer_nr, "oss mixer device number");
85 MODULE_PARM_DESC(tuner, "tuner type");
86 MODULE_PARM_DESC(card, "card type");
88 static DECLARE_MUTEX(devlist_lock);
89 LIST_HEAD(saa7134_devlist);
90 static LIST_HEAD(mops_list);
91 unsigned int saa7134_devcount;
93 #define dprintk(fmt, arg...) if (core_debug) \
94 printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
96 /* ------------------------------------------------------------------ */
97 /* debug help functions */
99 static const char *v4l1_ioctls[] = {
100 "0", "GCAP", "GCHAN", "SCHAN", "GTUNER", "STUNER", "GPICT", "SPICT",
101 "CCAPTURE", "GWIN", "SWIN", "GFBUF", "SFBUF", "KEY", "GFREQ",
102 "SFREQ", "GAUDIO", "SAUDIO", "SYNC", "MCAPTURE", "GMBUF", "GUNIT",
103 "GCAPTURE", "SCAPTURE", "SPLAYMODE", "SWRITEMODE", "GPLAYINFO",
104 "SMICROCODE", "GVBIFMT", "SVBIFMT" };
105 #define V4L1_IOCTLS ARRAY_SIZE(v4l1_ioctls)
107 static const char *v4l2_ioctls[] = {
108 "QUERYCAP", "1", "ENUM_PIXFMT", "ENUM_FBUFFMT", "G_FMT", "S_FMT",
109 "G_COMP", "S_COMP", "REQBUFS", "QUERYBUF", "G_FBUF", "S_FBUF",
110 "G_WIN", "S_WIN", "PREVIEW", "QBUF", "16", "DQBUF", "STREAMON",
111 "STREAMOFF", "G_PERF", "G_PARM", "S_PARM", "G_STD", "S_STD",
112 "ENUMSTD", "ENUMINPUT", "G_CTRL", "S_CTRL", "G_TUNER", "S_TUNER",
113 "G_FREQ", "S_FREQ", "G_AUDIO", "S_AUDIO", "35", "QUERYCTRL",
114 "QUERYMENU", "G_INPUT", "S_INPUT", "ENUMCVT", "41", "42", "43",
115 "44", "45", "G_OUTPUT", "S_OUTPUT", "ENUMOUTPUT", "G_AUDOUT",
116 "S_AUDOUT", "ENUMFX", "G_EFFECT", "S_EFFECT", "G_MODULATOR",
119 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
121 static const char *osspcm_ioctls[] = {
122 "RESET", "SYNC", "SPEED", "STEREO", "GETBLKSIZE", "SETFMT",
123 "CHANNELS", "?", "POST", "SUBDIVIDE", "SETFRAGMENT", "GETFMTS",
124 "GETOSPACE", "GETISPACE", "NONBLOCK", "GETCAPS", "GET/SETTRIGGER",
125 "GETIPTR", "GETOPTR", "MAPINBUF", "MAPOUTBUF", "SETSYNCRO",
126 "SETDUPLEX", "GETODELAY"
128 #define OSSPCM_IOCTLS ARRAY_SIZE(v4l2_ioctls)
130 void saa7134_print_ioctl(char *name, unsigned int cmd)
134 switch (_IOC_DIR(cmd)) {
135 case _IOC_NONE: dir = "--"; break;
136 case _IOC_READ: dir = "r-"; break;
137 case _IOC_WRITE: dir = "-w"; break;
138 case _IOC_READ | _IOC_WRITE: dir = "rw"; break;
139 default: dir = "??"; break;
141 switch (_IOC_TYPE(cmd)) {
143 printk(KERN_DEBUG "%s: ioctl 0x%08x (v4l1, %s, VIDIOC%s)\n",
144 name, cmd, dir, (_IOC_NR(cmd) < V4L1_IOCTLS) ?
145 v4l1_ioctls[_IOC_NR(cmd)] : "???");
148 printk(KERN_DEBUG "%s: ioctl 0x%08x (v4l2, %s, VIDIOC_%s)\n",
149 name, cmd, dir, (_IOC_NR(cmd) < V4L2_IOCTLS) ?
150 v4l2_ioctls[_IOC_NR(cmd)] : "???");
153 printk(KERN_DEBUG "%s: ioctl 0x%08x (oss dsp, %s, SNDCTL_DSP_%s)\n",
154 name, cmd, dir, (_IOC_NR(cmd) < OSSPCM_IOCTLS) ?
155 osspcm_ioctls[_IOC_NR(cmd)] : "???");
158 printk(KERN_DEBUG "%s: ioctl 0x%08x (oss mixer, %s, #%d)\n",
159 name, cmd, dir, _IOC_NR(cmd));
162 printk(KERN_DEBUG "%s: ioctl 0x%08x (???, %s, #%d)\n",
163 name, cmd, dir, _IOC_NR(cmd));
167 void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
169 unsigned long mode,status;
173 /* rising SAA7134_GPIO_GPRESCAN reads the status */
174 saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,0);
175 saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,SAA7134_GPIO_GPRESCAN);
176 mode = saa_readl(SAA7134_GPIO_GPMODE0 >> 2) & 0xfffffff;
177 status = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & 0xfffffff;
179 "%s: gpio: mode=0x%07lx in=0x%07lx out=0x%07lx [%s]\n",
180 dev->name, mode, (~mode) & status, mode & status, msg);
183 /* ------------------------------------------------------------------ */
186 static char *dec1_bits[8] = {
187 "DCSTD0", "DCSCT1", "WIPA", "GLIMB",
188 "GLIMT", "SLTCA", "HLCK"
190 static char *dec2_bits[8] = {
191 "RDCAP", "COPRO", "COLSTR", "TYPE3",
192 NULL, "FIDT", "HLVLN", "INTL"
194 static char *scale1_bits[8] = {
195 "VID_A", "VBI_A", NULL, NULL, "VID_B", "VBI_B"
197 static char *scale2_bits[8] = {
198 "TRERR", "CFERR", "LDERR", "WASRST",
199 "FIDSCI", "FIDSCO", "D6^D5", "TASK"
202 static void dump_statusreg(struct saa7134_dev *dev, int reg,
203 char *regname, char **bits)
207 value = saa_readb(reg);
208 printk(KERN_DEBUG "%s: %s:", dev->name, regname);
209 for (i = 7; i >= 0; i--) {
212 printk(" %s=%d", bits[i], (value & (1 << i)) ? 1 : 0);
217 static void dump_statusregs(struct saa7134_dev *dev)
219 dump_statusreg(dev,SAA7134_STATUS_VIDEO1,"dec1",dec1_bits);
220 dump_statusreg(dev,SAA7134_STATUS_VIDEO2,"dec2",dec2_bits);
221 dump_statusreg(dev,SAA7134_SCALER_STATUS0,"scale0",scale1_bits);
222 dump_statusreg(dev,SAA7134_SCALER_STATUS1,"scale1",scale2_bits);
226 /* ----------------------------------------------------------- */
227 /* delayed request_module */
229 #ifdef CONFIG_MODULES
231 static int need_empress;
234 static int pending_call(struct notifier_block *self, unsigned long state,
237 if (module != THIS_MODULE || state != MODULE_STATE_LIVE)
241 request_module("saa7134-empress");
243 request_module("saa7134-dvb");
247 static int pending_registered;
248 static struct notifier_block pending_notifier = {
249 .notifier_call = pending_call,
252 static void request_module_depend(char *name, int *flag)
254 switch (THIS_MODULE->state) {
255 case MODULE_STATE_COMING:
256 if (!pending_registered) {
257 register_module_notifier(&pending_notifier);
258 pending_registered = 1;
262 case MODULE_STATE_LIVE:
263 request_module(name);
273 #define request_module_depend(name,flag)
275 #endif /* CONFIG_MODULES */
277 /* ------------------------------------------------------------------ */
279 /* nr of (saa7134-)pages for the given buffer size */
280 static int saa7134_buffer_pages(int size)
282 size = PAGE_ALIGN(size);
283 size += PAGE_SIZE; /* for non-page-aligned buffers */
288 /* calc max # of buffers from size (must not exceed the 4MB virtual
289 * address space per DMA channel) */
290 int saa7134_buffer_count(unsigned int size, unsigned int count)
292 unsigned int maxcount;
294 maxcount = 1024 / saa7134_buffer_pages(size);
295 if (count > maxcount)
300 int saa7134_buffer_startpage(struct saa7134_buf *buf)
302 return saa7134_buffer_pages(buf->vb.bsize) * buf->vb.i;
305 unsigned long saa7134_buffer_base(struct saa7134_buf *buf)
309 base = saa7134_buffer_startpage(buf) * 4096;
310 base += buf->vb.dma.sglist[0].offset;
314 /* ------------------------------------------------------------------ */
316 int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt)
321 cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr);
324 pt->size = SAA7134_PGTABLE_SIZE;
330 int saa7134_pgtable_build(struct pci_dev *pci, struct saa7134_pgtable *pt,
331 struct scatterlist *list, unsigned int length,
332 unsigned int startpage)
337 BUG_ON(NULL == pt || NULL == pt->cpu);
339 ptr = pt->cpu + startpage;
340 for (i = 0; i < length; i++, list++)
341 for (p = 0; p * 4096 < list->length; p++, ptr++)
342 *ptr = sg_dma_address(list) - list->offset;
346 void saa7134_pgtable_free(struct pci_dev *pci, struct saa7134_pgtable *pt)
350 pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
354 /* ------------------------------------------------------------------ */
356 void saa7134_dma_free(struct saa7134_dev *dev,struct saa7134_buf *buf)
361 videobuf_waiton(&buf->vb,0,0);
362 videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma);
363 videobuf_dma_free(&buf->vb.dma);
364 buf->vb.state = STATE_NEEDS_INIT;
367 /* ------------------------------------------------------------------ */
369 int saa7134_buffer_queue(struct saa7134_dev *dev,
370 struct saa7134_dmaqueue *q,
371 struct saa7134_buf *buf)
373 struct saa7134_buf *next = NULL;
375 assert_spin_locked(&dev->slock);
376 dprintk("buffer_queue %p\n",buf);
377 if (NULL == q->curr) {
380 buf->activate(dev,buf,NULL);
381 } else if (list_empty(&q->queue)) {
382 list_add_tail(&buf->vb.queue,&q->queue);
383 buf->vb.state = STATE_QUEUED;
385 next = list_entry(q->queue.next,struct saa7134_buf,
388 buf->activate(dev,buf,next);
391 list_add_tail(&buf->vb.queue,&q->queue);
392 buf->vb.state = STATE_QUEUED;
397 void saa7134_buffer_finish(struct saa7134_dev *dev,
398 struct saa7134_dmaqueue *q,
401 assert_spin_locked(&dev->slock);
402 dprintk("buffer_finish %p\n",q->curr);
404 /* finish current buffer */
405 q->curr->vb.state = state;
406 do_gettimeofday(&q->curr->vb.ts);
407 wake_up(&q->curr->vb.done);
411 void saa7134_buffer_next(struct saa7134_dev *dev,
412 struct saa7134_dmaqueue *q)
414 struct saa7134_buf *buf,*next = NULL;
416 assert_spin_locked(&dev->slock);
417 BUG_ON(NULL != q->curr);
419 if (!list_empty(&q->queue)) {
420 /* activate next one from queue */
421 buf = list_entry(q->queue.next,struct saa7134_buf,vb.queue);
422 dprintk("buffer_next %p [prev=%p/next=%p]\n",
423 buf,q->queue.prev,q->queue.next);
424 list_del(&buf->vb.queue);
425 if (!list_empty(&q->queue))
426 next = list_entry(q->queue.next,struct saa7134_buf,
429 buf->activate(dev,buf,next);
430 dprintk("buffer_next #2 prev=%p/next=%p\n",
431 q->queue.prev,q->queue.next);
433 /* nothing to do -- just stop DMA */
434 dprintk("buffer_next %p\n",NULL);
435 saa7134_set_dmabits(dev);
436 del_timer(&q->timeout);
440 void saa7134_buffer_timeout(unsigned long data)
442 struct saa7134_dmaqueue *q = (struct saa7134_dmaqueue*)data;
443 struct saa7134_dev *dev = q->dev;
446 spin_lock_irqsave(&dev->slock,flags);
448 /* try to reset the hardware (SWRST) */
449 saa_writeb(SAA7134_REGION_ENABLE, 0x00);
450 saa_writeb(SAA7134_REGION_ENABLE, 0x80);
451 saa_writeb(SAA7134_REGION_ENABLE, 0x00);
453 /* flag current buffer as failed,
454 try to start over with the next one. */
456 dprintk("timeout on %p\n",q->curr);
457 saa7134_buffer_finish(dev,q,STATE_ERROR);
459 saa7134_buffer_next(dev,q);
460 spin_unlock_irqrestore(&dev->slock,flags);
463 /* ------------------------------------------------------------------ */
465 int saa7134_set_dmabits(struct saa7134_dev *dev)
467 u32 split, task=0, ctrl=0, irq=0;
468 enum v4l2_field cap = V4L2_FIELD_ANY;
469 enum v4l2_field ov = V4L2_FIELD_ANY;
471 assert_spin_locked(&dev->slock);
473 /* video capture -- dma 0 + video task A */
474 if (dev->video_q.curr) {
476 ctrl |= SAA7134_MAIN_CTRL_TE0;
477 irq |= SAA7134_IRQ1_INTE_RA0_1 |
478 SAA7134_IRQ1_INTE_RA0_0;
479 cap = dev->video_q.curr->vb.field;
482 /* video capture -- dma 1+2 (planar modes) */
483 if (dev->video_q.curr &&
484 dev->video_q.curr->fmt->planar) {
485 ctrl |= SAA7134_MAIN_CTRL_TE4 |
486 SAA7134_MAIN_CTRL_TE5;
489 /* screen overlay -- dma 0 + video task B */
492 ctrl |= SAA7134_MAIN_CTRL_TE1;
496 /* vbi capture -- dma 0 + vbi task A+B */
497 if (dev->vbi_q.curr) {
499 ctrl |= SAA7134_MAIN_CTRL_TE2 |
500 SAA7134_MAIN_CTRL_TE3;
501 irq |= SAA7134_IRQ1_INTE_RA0_7 |
502 SAA7134_IRQ1_INTE_RA0_6 |
503 SAA7134_IRQ1_INTE_RA0_5 |
504 SAA7134_IRQ1_INTE_RA0_4;
507 /* audio capture -- dma 3 */
508 if (dev->oss.dma_running) {
509 ctrl |= SAA7134_MAIN_CTRL_TE6;
510 irq |= SAA7134_IRQ1_INTE_RA3_1 |
511 SAA7134_IRQ1_INTE_RA3_0;
514 /* TS capture -- dma 5 */
515 if (dev->ts_q.curr) {
516 ctrl |= SAA7134_MAIN_CTRL_TE5;
517 irq |= SAA7134_IRQ1_INTE_RA2_3 |
518 SAA7134_IRQ1_INTE_RA2_2 |
519 SAA7134_IRQ1_INTE_RA2_1 |
520 SAA7134_IRQ1_INTE_RA2_0;
523 /* set task conditions + field handling */
524 if (V4L2_FIELD_HAS_BOTH(cap) || V4L2_FIELD_HAS_BOTH(ov) || cap == ov) {
525 /* default config -- use full frames */
526 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
527 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
528 saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x02);
529 saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x02);
532 /* split fields between tasks */
533 if (V4L2_FIELD_TOP == cap) {
534 /* odd A, even B, repeat */
535 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
536 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0e);
538 /* odd B, even A, repeat */
539 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0e);
540 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
542 saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x01);
543 saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x01);
548 saa_writeb(SAA7134_REGION_ENABLE, task);
549 saa_writel(SAA7134_IRQ1, irq);
550 saa_andorl(SAA7134_MAIN_CTRL,
551 SAA7134_MAIN_CTRL_TE0 |
552 SAA7134_MAIN_CTRL_TE1 |
553 SAA7134_MAIN_CTRL_TE2 |
554 SAA7134_MAIN_CTRL_TE3 |
555 SAA7134_MAIN_CTRL_TE4 |
556 SAA7134_MAIN_CTRL_TE5 |
557 SAA7134_MAIN_CTRL_TE6,
559 dprintk("dmabits: task=0x%02x ctrl=0x%02x irq=0x%x split=%s\n",
560 task, ctrl, irq, split ? "no" : "yes");
565 /* ------------------------------------------------------------------ */
566 /* IRQ handler + helpers */
568 static char *irqbits[] = {
569 "DONE_RA0", "DONE_RA1", "DONE_RA2", "DONE_RA3",
570 "AR", "PE", "PWR_ON", "RDCAP", "INTL", "FIDT", "MMC",
571 "TRIG_ERR", "CONF_ERR", "LOAD_ERR",
572 "GPIO16?", "GPIO18", "GPIO22", "GPIO23"
574 #define IRQBITS ARRAY_SIZE(irqbits)
576 static void print_irqstatus(struct saa7134_dev *dev, int loop,
577 unsigned long report, unsigned long status)
581 printk(KERN_DEBUG "%s/irq[%d,%ld]: r=0x%lx s=0x%02lx",
582 dev->name,loop,jiffies,report,status);
583 for (i = 0; i < IRQBITS; i++) {
584 if (!(report & (1 << i)))
586 printk(" %s",irqbits[i]);
588 if (report & SAA7134_IRQ_REPORT_DONE_RA0) {
589 printk(" | RA0=%s,%s,%s,%ld",
590 (status & 0x40) ? "vbi" : "video",
591 (status & 0x20) ? "b" : "a",
592 (status & 0x10) ? "odd" : "even",
598 static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
600 struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
601 unsigned long report,status;
602 int loop, handled = 0;
604 for (loop = 0; loop < 10; loop++) {
605 report = saa_readl(SAA7134_IRQ_REPORT);
606 status = saa_readl(SAA7134_IRQ_STATUS);
609 printk(KERN_DEBUG "%s/irq: no (more) work\n",
614 saa_writel(SAA7134_IRQ_REPORT,report);
616 print_irqstatus(dev,loop,report,status);
619 if (report & SAA7134_IRQ_REPORT_CONF_ERR)
620 dump_statusregs(dev);
623 if (report & SAA7134_IRQ_REPORT_INTL)
624 saa7134_irq_video_intl(dev);
626 if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
627 (status & 0x60) == 0)
628 saa7134_irq_video_done(dev,status);
630 if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
631 (status & 0x40) == 0x40)
632 saa7134_irq_vbi_done(dev,status);
634 if ((report & SAA7134_IRQ_REPORT_DONE_RA2) &&
636 saa7134_irq_ts_done(dev,status);
638 if ((report & SAA7134_IRQ_REPORT_DONE_RA3))
639 saa7134_irq_oss_done(dev,status);
641 if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
642 SAA7134_IRQ_REPORT_GPIO18)) &&
644 saa7134_input_irq(dev);
648 print_irqstatus(dev,loop,report,status);
649 if (report & SAA7134_IRQ_REPORT_PE) {
650 /* disable all parity error */
651 printk(KERN_WARNING "%s/irq: looping -- "
652 "clearing PE (parity error!) enable bit\n",dev->name);
653 saa_clearl(SAA7134_IRQ2,SAA7134_IRQ2_INTE_PE);
655 /* disable all irqs */
656 printk(KERN_WARNING "%s/irq: looping -- "
657 "clearing all enable bits\n",dev->name);
658 saa_writel(SAA7134_IRQ1,0);
659 saa_writel(SAA7134_IRQ2,0);
664 return IRQ_RETVAL(handled);
667 /* ------------------------------------------------------------------ */
669 /* early init (no i2c, no irq) */
670 static int saa7134_hwinit1(struct saa7134_dev *dev)
672 dprintk("hwinit1\n");
674 saa_writel(SAA7134_IRQ1, 0);
675 saa_writel(SAA7134_IRQ2, 0);
676 init_MUTEX(&dev->lock);
677 spin_lock_init(&dev->slock);
679 saa7134_track_gpio(dev,"pre-init");
680 saa7134_video_init1(dev);
681 saa7134_vbi_init1(dev);
682 if (card_has_mpeg(dev))
683 saa7134_ts_init1(dev);
684 saa7134_input_init1(dev);
686 switch (dev->pci->device) {
687 case PCI_DEVICE_ID_PHILIPS_SAA7134:
688 case PCI_DEVICE_ID_PHILIPS_SAA7133:
689 case PCI_DEVICE_ID_PHILIPS_SAA7135:
690 saa7134_oss_init1(dev);
694 /* RAM FIFO config */
695 saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
696 saa_writel(SAA7134_THRESHOULD,0x02020202);
698 /* enable audio + video processing */
699 saa_writel(SAA7134_MAIN_CTRL,
700 SAA7134_MAIN_CTRL_VPLLE |
701 SAA7134_MAIN_CTRL_APLLE |
702 SAA7134_MAIN_CTRL_EXOSC |
703 SAA7134_MAIN_CTRL_EVFE1 |
704 SAA7134_MAIN_CTRL_EVFE2 |
705 SAA7134_MAIN_CTRL_ESFE |
706 SAA7134_MAIN_CTRL_EBADC |
707 SAA7134_MAIN_CTRL_EBDAC);
709 /* enable peripheral devices */
710 saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
712 /* set vertical line numbering start (vbi needs this) */
713 saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);
718 /* late init (with i2c + irq) */
719 static int saa7134_hwinit2(struct saa7134_dev *dev)
721 dprintk("hwinit2\n");
723 saa7134_video_init2(dev);
724 saa7134_tvaudio_init2(dev);
727 saa_writel(SAA7134_IRQ1, 0);
728 saa_writel(SAA7134_IRQ2,
729 SAA7134_IRQ2_INTE_GPIO18 |
730 SAA7134_IRQ2_INTE_GPIO18A |
731 SAA7134_IRQ2_INTE_GPIO16 |
732 SAA7134_IRQ2_INTE_SC2 |
733 SAA7134_IRQ2_INTE_SC1 |
734 SAA7134_IRQ2_INTE_SC0 |
735 /* SAA7134_IRQ2_INTE_DEC5 | FIXME: TRIG_ERR ??? */
736 SAA7134_IRQ2_INTE_DEC3 |
737 SAA7134_IRQ2_INTE_DEC2 |
738 /* SAA7134_IRQ2_INTE_DEC1 | */
739 SAA7134_IRQ2_INTE_DEC0 |
740 SAA7134_IRQ2_INTE_PE |
741 SAA7134_IRQ2_INTE_AR);
747 static int saa7134_hwfini(struct saa7134_dev *dev)
751 switch (dev->pci->device) {
752 case PCI_DEVICE_ID_PHILIPS_SAA7134:
753 case PCI_DEVICE_ID_PHILIPS_SAA7133:
754 case PCI_DEVICE_ID_PHILIPS_SAA7135:
755 saa7134_oss_fini(dev);
758 if (card_has_mpeg(dev))
759 saa7134_ts_fini(dev);
760 saa7134_input_fini(dev);
761 saa7134_vbi_fini(dev);
762 saa7134_video_fini(dev);
763 saa7134_tvaudio_fini(dev);
767 static void __devinit must_configure_manually(void)
773 "saa7134: Congratulations! Your TV card vendor saved a few\n"
774 "saa7134: cents for a eeprom, thus your pci board has no\n"
775 "saa7134: subsystem ID and I can't identify it automatically\n"
777 "saa7134: I feel better now. Ok, here are the good news:\n"
778 "saa7134: You can use the card=<nr> insmod option to specify\n"
779 "saa7134: which board do you have. The list:\n");
780 for (i = 0; i < saa7134_bcount; i++) {
781 printk(KERN_WARNING "saa7134: card=%d -> %-40.40s",
782 i,saa7134_boards[i].name);
783 for (p = 0; saa7134_pci_tbl[p].driver_data; p++) {
784 if (saa7134_pci_tbl[p].driver_data != i)
787 saa7134_pci_tbl[p].subvendor,
788 saa7134_pci_tbl[p].subdevice);
794 static struct video_device *vdev_init(struct saa7134_dev *dev,
795 struct video_device *template,
798 struct video_device *vfd;
800 vfd = video_device_alloc();
805 vfd->dev = &dev->pci->dev;
806 vfd->release = video_device_release;
807 snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
808 dev->name, type, saa7134_boards[dev->board].name);
812 static void saa7134_unregister_video(struct saa7134_dev *dev)
814 if (dev->video_dev) {
815 if (-1 != dev->video_dev->minor)
816 video_unregister_device(dev->video_dev);
818 video_device_release(dev->video_dev);
819 dev->video_dev = NULL;
822 if (-1 != dev->vbi_dev->minor)
823 video_unregister_device(dev->vbi_dev);
825 video_device_release(dev->vbi_dev);
828 if (dev->radio_dev) {
829 if (-1 != dev->radio_dev->minor)
830 video_unregister_device(dev->radio_dev);
832 video_device_release(dev->radio_dev);
833 dev->radio_dev = NULL;
837 static void mpeg_ops_attach(struct saa7134_mpeg_ops *ops,
838 struct saa7134_dev *dev)
842 if (NULL != dev->mops)
844 if (saa7134_boards[dev->board].mpeg != ops->type)
846 err = ops->init(dev);
852 static void mpeg_ops_detach(struct saa7134_mpeg_ops *ops,
853 struct saa7134_dev *dev)
855 if (NULL == dev->mops)
857 if (dev->mops != ops)
859 dev->mops->fini(dev);
863 static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
864 const struct pci_device_id *pci_id)
866 struct saa7134_dev *dev;
867 struct list_head *item;
868 struct saa7134_mpeg_ops *mops;
871 dev = kmalloc(sizeof(*dev),GFP_KERNEL);
874 memset(dev,0,sizeof(*dev));
878 if (pci_enable_device(pci_dev)) {
883 dev->nr = saa7134_devcount;
884 sprintf(dev->name,"saa%x[%d]",pci_dev->device,dev->nr);
887 if (pci_pci_problems) {
888 if (pci_pci_problems & PCIPCI_TRITON)
889 printk(KERN_INFO "%s: quirk: PCIPCI_TRITON\n", dev->name);
890 if (pci_pci_problems & PCIPCI_NATOMA)
891 printk(KERN_INFO "%s: quirk: PCIPCI_NATOMA\n", dev->name);
892 if (pci_pci_problems & PCIPCI_VIAETBF)
893 printk(KERN_INFO "%s: quirk: PCIPCI_VIAETBF\n", dev->name);
894 if (pci_pci_problems & PCIPCI_VSFX)
895 printk(KERN_INFO "%s: quirk: PCIPCI_VSFX\n",dev->name);
896 #ifdef PCIPCI_ALIMAGIK
897 if (pci_pci_problems & PCIPCI_ALIMAGIK) {
898 printk(KERN_INFO "%s: quirk: PCIPCI_ALIMAGIK -- latency fixup\n",
904 if (UNSET != latency) {
905 printk(KERN_INFO "%s: setting pci latency timer to %d\n",
907 pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, latency);
911 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
912 pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
913 printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, "
914 "latency: %d, mmio: 0x%lx\n", dev->name,
915 pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
916 dev->pci_lat,pci_resource_start(pci_dev,0));
917 pci_set_master(pci_dev);
918 if (!pci_dma_supported(pci_dev,0xffffffff)) {
919 printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name);
925 dev->board = pci_id->driver_data;
926 if (card[dev->nr] >= 0 &&
927 card[dev->nr] < saa7134_bcount)
928 dev->board = card[dev->nr];
929 if (SAA7134_BOARD_NOAUTO == dev->board) {
930 must_configure_manually();
931 dev->board = SAA7134_BOARD_UNKNOWN;
933 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
934 dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
935 if (UNSET != tuner[dev->nr])
936 dev->tuner_type = tuner[dev->nr];
937 printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
938 dev->name,pci_dev->subsystem_vendor,
939 pci_dev->subsystem_device,saa7134_boards[dev->board].name,
940 dev->board, card[dev->nr] == dev->board ?
941 "insmod option" : "autodetected");
944 if (!request_mem_region(pci_resource_start(pci_dev,0),
945 pci_resource_len(pci_dev,0),
948 printk(KERN_ERR "%s: can't get MMIO memory @ 0x%lx\n",
949 dev->name,pci_resource_start(pci_dev,0));
952 dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000);
953 dev->bmmio = (__u8 __iomem *)dev->lmmio;
954 if (NULL == dev->lmmio) {
956 printk(KERN_ERR "%s: can't ioremap() MMIO memory\n",
961 /* initialize hardware #1 */
962 saa7134_board_init1(dev);
963 saa7134_hwinit1(dev);
966 err = request_irq(pci_dev->irq, saa7134_irq,
967 SA_SHIRQ | SA_INTERRUPT, dev->name, dev);
969 printk(KERN_ERR "%s: can't get IRQ %d\n",
970 dev->name,pci_dev->irq);
974 /* wait a bit, register i2c bus */
976 saa7134_i2c_register(dev);
978 /* initialize hardware #2 */
979 saa7134_board_init2(dev);
980 saa7134_hwinit2(dev);
982 /* load i2c helpers */
983 if (TUNER_ABSENT != dev->tuner_type)
984 request_module("tuner");
985 if (dev->tda9887_conf)
986 request_module("tda9887");
987 if (card_is_empress(dev)) {
988 request_module("saa6752hs");
989 request_module_depend("saa7134-empress",&need_empress);
991 if (card_is_dvb(dev))
992 request_module_depend("saa7134-dvb",&need_dvb);
994 v4l2_prio_init(&dev->prio);
996 /* register v4l devices */
997 dev->video_dev = vdev_init(dev,&saa7134_video_template,"video");
998 err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
1001 printk(KERN_INFO "%s: can't register video device\n",
1005 printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
1006 dev->name,dev->video_dev->minor & 0x1f);
1008 dev->vbi_dev = vdev_init(dev,&saa7134_vbi_template,"vbi");
1009 err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
1013 printk(KERN_INFO "%s: registered device vbi%d\n",
1014 dev->name,dev->vbi_dev->minor & 0x1f);
1016 if (card_has_radio(dev)) {
1017 dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
1018 err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
1022 printk(KERN_INFO "%s: registered device radio%d\n",
1023 dev->name,dev->radio_dev->minor & 0x1f);
1026 /* register oss devices */
1027 switch (dev->pci->device) {
1028 case PCI_DEVICE_ID_PHILIPS_SAA7134:
1029 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1030 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1032 err = dev->oss.minor_dsp =
1033 register_sound_dsp(&saa7134_dsp_fops,
1038 printk(KERN_INFO "%s: registered device dsp%d\n",
1039 dev->name,dev->oss.minor_dsp >> 4);
1041 err = dev->oss.minor_mixer =
1042 register_sound_mixer(&saa7134_mixer_fops,
1046 printk(KERN_INFO "%s: registered device mixer%d\n",
1047 dev->name,dev->oss.minor_mixer >> 4);
1052 /* everything worked */
1053 pci_set_drvdata(pci_dev,dev);
1056 down(&devlist_lock);
1057 list_for_each(item,&mops_list) {
1058 mops = list_entry(item, struct saa7134_mpeg_ops, next);
1059 mpeg_ops_attach(mops, dev);
1061 list_add_tail(&dev->devlist,&saa7134_devlist);
1066 switch (dev->pci->device) {
1067 case PCI_DEVICE_ID_PHILIPS_SAA7134:
1068 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1069 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1071 unregister_sound_dsp(dev->oss.minor_dsp);
1075 saa7134_unregister_video(dev);
1076 saa7134_i2c_unregister(dev);
1077 free_irq(pci_dev->irq, dev);
1079 saa7134_hwfini(dev);
1080 iounmap(dev->lmmio);
1082 release_mem_region(pci_resource_start(pci_dev,0),
1083 pci_resource_len(pci_dev,0));
1089 static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
1091 struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
1092 struct list_head *item;
1093 struct saa7134_mpeg_ops *mops;
1097 u32 report = saa_readl(SAA7134_IRQ_REPORT);
1098 u32 status = saa_readl(SAA7134_IRQ_STATUS);
1099 print_irqstatus(dev,42,report,status);
1102 /* disable peripheral devices */
1103 saa_writeb(SAA7134_SPECIAL_MODE,0);
1105 /* shutdown hardware */
1106 saa_writel(SAA7134_IRQ1,0);
1107 saa_writel(SAA7134_IRQ2,0);
1108 saa_writel(SAA7134_MAIN_CTRL,0);
1110 /* shutdown subsystems */
1111 saa7134_hwfini(dev);
1114 down(&devlist_lock);
1115 list_del(&dev->devlist);
1116 list_for_each(item,&mops_list) {
1117 mops = list_entry(item, struct saa7134_mpeg_ops, next);
1118 mpeg_ops_detach(mops, dev);
1123 saa7134_i2c_unregister(dev);
1124 switch (dev->pci->device) {
1125 case PCI_DEVICE_ID_PHILIPS_SAA7134:
1126 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1127 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1129 unregister_sound_mixer(dev->oss.minor_mixer);
1130 unregister_sound_dsp(dev->oss.minor_dsp);
1134 saa7134_unregister_video(dev);
1136 /* release ressources */
1137 free_irq(pci_dev->irq, dev);
1138 iounmap(dev->lmmio);
1139 release_mem_region(pci_resource_start(pci_dev,0),
1140 pci_resource_len(pci_dev,0));
1142 #if 0 /* causes some trouble when reinserting the driver ... */
1143 pci_disable_device(pci_dev);
1145 pci_set_drvdata(pci_dev, NULL);
1151 /* ----------------------------------------------------------- */
1153 int saa7134_ts_register(struct saa7134_mpeg_ops *ops)
1155 struct list_head *item;
1156 struct saa7134_dev *dev;
1158 down(&devlist_lock);
1159 list_for_each(item,&saa7134_devlist) {
1160 dev = list_entry(item, struct saa7134_dev, devlist);
1161 mpeg_ops_attach(ops, dev);
1163 list_add_tail(&ops->next,&mops_list);
1168 void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops)
1170 struct list_head *item;
1171 struct saa7134_dev *dev;
1173 down(&devlist_lock);
1174 list_del(&ops->next);
1175 list_for_each(item,&saa7134_devlist) {
1176 dev = list_entry(item, struct saa7134_dev, devlist);
1177 mpeg_ops_detach(ops, dev);
1182 EXPORT_SYMBOL(saa7134_ts_register);
1183 EXPORT_SYMBOL(saa7134_ts_unregister);
1185 /* ----------------------------------------------------------- */
1187 static struct pci_driver saa7134_pci_driver = {
1189 .id_table = saa7134_pci_tbl,
1190 .probe = saa7134_initdev,
1191 .remove = __devexit_p(saa7134_finidev),
1194 static int saa7134_init(void)
1196 INIT_LIST_HEAD(&saa7134_devlist);
1197 printk(KERN_INFO "saa7130/34: v4l2 driver version %d.%d.%d loaded\n",
1198 (SAA7134_VERSION_CODE >> 16) & 0xff,
1199 (SAA7134_VERSION_CODE >> 8) & 0xff,
1200 SAA7134_VERSION_CODE & 0xff);
1202 printk(KERN_INFO "saa7130/34: snapshot date %04d-%02d-%02d\n",
1203 SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
1205 return pci_module_init(&saa7134_pci_driver);
1208 static void saa7134_fini(void)
1210 pci_unregister_driver(&saa7134_pci_driver);
1213 module_init(saa7134_init);
1214 module_exit(saa7134_fini);
1216 /* ----------------------------------------------------------- */
1218 EXPORT_SYMBOL(saa7134_print_ioctl);
1219 EXPORT_SYMBOL(saa7134_i2c_call_clients);
1220 EXPORT_SYMBOL(saa7134_devlist);
1221 EXPORT_SYMBOL(saa7134_boards);
1223 /* ----------------------------------------------------------- */