2 zr36120.c - Zoran 36120/36125 based framegrabbers
4 Copyright (C) 1998-1999 Pauline Middelink <middelin@polyware.nl>
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.
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.
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.
21 #include <linux/module.h>
22 #include <linux/delay.h>
23 #include <linux/init.h>
24 #include <linux/errno.h>
26 #include <linux/kernel.h>
27 #include <linux/major.h>
28 #include <linux/slab.h>
29 #include <linux/vmalloc.h>
31 #include <linux/pci.h>
32 #include <linux/signal.h>
34 #include <asm/pgtable.h>
36 #include <linux/sched.h>
37 #include <linux/video_decoder.h>
39 #include <asm/uaccess.h>
43 #include "zr36120_mem.h"
45 /* mark an required function argument unused - lintism */
46 #define UNUSED(x) (void)(x)
48 /* sensible default */
53 /* Anybody who uses more than four? */
56 static unsigned int triton1=0; /* triton1 chipset? */
57 static unsigned int cardtype[ZORAN_MAX]={ [ 0 ... ZORAN_MAX-1 ] = CARDTYPE };
58 static int video_nr = -1;
59 static int vbi_nr = -1;
61 static struct pci_device_id zr36120_pci_tbl[] = {
62 { PCI_VENDOR_ID_ZORAN,PCI_DEVICE_ID_ZORAN_36120,
63 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
66 MODULE_DEVICE_TABLE(pci, zr36120_pci_tbl);
68 MODULE_AUTHOR("Pauline Middelink <middelin@polyware.nl>");
69 MODULE_DESCRIPTION("Zoran ZR36120 based framegrabber");
70 MODULE_LICENSE("GPL");
72 MODULE_PARM(triton1,"i");
73 MODULE_PARM(cardtype,"1-" __MODULE_STRING(ZORAN_MAX) "i");
74 MODULE_PARM(video_nr,"i");
75 MODULE_PARM(vbi_nr,"i");
77 static int zoran_cards;
78 static struct zoran zorans[ZORAN_MAX];
81 * the meaning of each element can be found in zr36120.h
82 * Determining the value of gpdir/gpval can be tricky. The
83 * best way is to run the card under the original software
84 * and read the values from the general purpose registers
85 * 0x28 and 0x2C. How you do that is left as an exercise
86 * to the impatient reader :)
88 #define T 1 /* to separate the bools from the ints */
90 static struct tvcard tvcards[] = {
91 /* reported working by <middelin@polyware.nl> */
92 /*0*/ { "Trust Victor II",
93 2, 0, T, T, T, T, 0x7F, 0x80, { 1, SVHS(6) }, { 0 } },
94 /* reported working by <Michael.Paxton@aihw.gov.au> */
95 /*1*/ { "Aitech WaveWatcher TV-PCI",
96 3, 0, T, F, T, T, 0x7F, 0x80, { 1, TUNER(3), SVHS(6) }, { 0 } },
97 /* reported working by ? */
98 /*2*/ { "Genius Video Wonder PCI Video Capture Card",
99 2, 0, T, T, T, T, 0x7F, 0x80, { 1, SVHS(6) }, { 0 } },
100 /* reported working by <Pascal.Gabriel@wanadoo.fr> */
101 /*3*/ { "Guillemot Maxi-TV PCI",
102 2, 0, T, T, T, T, 0x7F, 0x80, { 1, SVHS(6) }, { 0 } },
103 /* reported working by "Craig Whitmore <lennon@igrin.co.nz> */
104 /*4*/ { "Quadrant Buster",
105 3, 3, T, F, T, T, 0x7F, 0x80, { SVHS(1), TUNER(2), 3 }, { 1, 2, 3 } },
106 /* a debug entry which has all inputs mapped */
107 /*5*/ { "ZR36120 based framegrabber (all inputs enabled)",
108 6, 0, T, T, T, T, 0x7F, 0x80, { 1, 2, 3, 4, 5, 6 }, { 0 } }
112 #define NRTVCARDS (sizeof(tvcards)/sizeof(tvcards[0]))
117 #define ENDIANESS ZORAN_VFEC_LE
120 static struct { const char name[8]; uint mode; uint bpp; } palette2fmt[] = {
121 /* n/a */ { "n/a", 0, 0 },
122 /* GREY */ { "GRAY", 0, 0 },
123 /* HI240 */ { "HI240", 0, 0 },
124 /* RGB565 */ { "RGB565", ZORAN_VFEC_RGB_RGB565|ENDIANESS, 2 },
125 /* RGB24 */ { "RGB24", ZORAN_VFEC_RGB_RGB888|ENDIANESS|ZORAN_VFEC_PACK24, 3 },
126 /* RGB32 */ { "RGB32", ZORAN_VFEC_RGB_RGB888|ENDIANESS, 4 },
127 /* RGB555 */ { "RGB555", ZORAN_VFEC_RGB_RGB555|ENDIANESS, 2 },
128 /* YUV422 */ { "YUV422", ZORAN_VFEC_RGB_YUV422|ENDIANESS, 2 },
129 /* YUYV */ { "YUYV", 0, 0 },
130 /* UYVY */ { "UYVY", 0, 0 },
131 /* YUV420 */ { "YUV420", 0, 0 },
132 /* YUV411 */ { "YUV411", 0, 0 },
133 /* RAW */ { "RAW", 0, 0 },
134 /* YUV422P */ { "YUV422P", 0, 0 },
135 /* YUV411P */ { "YUV411P", 0, 0 }};
136 #define NRPALETTES (sizeof(palette2fmt)/sizeof(palette2fmt[0]))
139 /* ----------------------------------------------------------------------- */
140 /* ZORAN chipset detector */
141 /* shamelessly stolen from bttv.c */
142 /* Reason for beeing here: we need to detect if we are running on a */
143 /* Triton based chipset, and if so, enable a certain bit */
144 /* ----------------------------------------------------------------------- */
146 void __init handle_chipset(void)
148 /* Just in case some nut set this to something dangerous */
150 triton1 = ZORAN_VDC_TRICOM;
152 if (pci_pci_problems & PCIPCI_TRITON) {
153 printk(KERN_INFO "zoran: Host bridge 82437FX Triton PIIX\n");
154 triton1 = ZORAN_VDC_TRICOM;
158 /* ----------------------------------------------------------------------- */
159 /* ZORAN functions */
160 /* ----------------------------------------------------------------------- */
162 static void zoran_set_geo(struct zoran* ztv, struct vidinfo* i);
166 void zoran_dump(struct zoran *ztv)
169 char *p=str; /* shut up, gcc! */
172 for (i=0; i<0x60; i+=4) {
174 if (i) printk("%s\n",str);
176 p+= sprintf(str, KERN_DEBUG " %04x: ",i);
178 p += sprintf(p, "%08x ",zrread(i));
184 void reap_states(struct zoran* ztv)
190 * Are we busy at all?
191 * This depends on if there is a workqueue AND the
192 * videotransfer is enabled on the chip...
194 if (ztv->workqueue && (zrread(ZORAN_VDC) & ZORAN_VDC_VIDEN))
196 struct vidinfo* newitem;
198 /* did we get a complete frame? */
199 if (zrread(ZORAN_VSTR) & ZORAN_VSTR_GRAB)
202 DEBUG(printk(CARD_DEBUG "completed %s at %p\n",CARD,ztv->workqueue->kindof==FBUFFER_GRAB?"grab":"read",ztv->workqueue));
204 /* we are done with this buffer, tell everyone */
205 ztv->workqueue->status = FBUFFER_DONE;
206 ztv->workqueue->fieldnr = ztv->fieldnr;
207 /* not good, here for BTTV_FIELDNR reasons */
208 ztv->lastfieldnr = ztv->fieldnr;
210 switch (ztv->workqueue->kindof) {
212 wake_up_interruptible(&ztv->grabq);
215 wake_up_interruptible(&ztv->vbiq);
218 printk(CARD_INFO "somebody killed the workqueue (kindof=%d)!\n",CARD,ztv->workqueue->kindof);
221 /* item completed, skip to next item in queue */
222 write_lock(&ztv->lock);
223 newitem = ztv->workqueue->next;
224 ztv->workqueue->next = 0; /* mark completed */
225 ztv->workqueue = newitem;
226 write_unlock(&ztv->lock);
230 * ok, so it seems we have nothing in progress right now.
231 * Lets see if we can find some work.
235 struct vidinfo* newitem;
238 DEBUG(printk(CARD_DEBUG "starting %s at %p\n",CARD,ztv->workqueue->kindof==FBUFFER_GRAB?"grab":"read",ztv->workqueue));
240 /* loadup the frame settings */
241 read_lock(&ztv->lock);
242 zoran_set_geo(ztv,ztv->workqueue);
243 read_unlock(&ztv->lock);
245 switch (ztv->workqueue->kindof) {
248 zrand(~ZORAN_OCR_OVLEN, ZORAN_OCR);
249 zror(ZORAN_VSTR_SNAPSHOT,ZORAN_VSTR);
250 zror(ZORAN_VDC_VIDEN,ZORAN_VDC);
252 /* start single-shot grab */
253 zror(ZORAN_VSTR_GRAB, ZORAN_VSTR);
256 printk(CARD_INFO "what is this doing on the queue? (kindof=%d)\n",CARD,ztv->workqueue->kindof);
257 write_lock(&ztv->lock);
258 newitem = ztv->workqueue->next;
259 ztv->workqueue->next = 0;
260 ztv->workqueue = newitem;
261 write_unlock(&ztv->lock);
263 goto again; /* yeah, sure.. */
268 DEBUG(printk(CARD_DEBUG "nothing in queue\n",CARD));
271 * What? Even the workqueue is empty? Am i really here
272 * for nothing? Did i come all that way to... do nothing?
275 /* do we need to overlay? */
276 if (test_bit(STATE_OVERLAY, &ztv->state))
278 /* are we already overlaying? */
279 if (!(zrread(ZORAN_OCR) & ZORAN_OCR_OVLEN) ||
280 !(zrread(ZORAN_VDC) & ZORAN_VDC_VIDEN))
282 DEBUG(printk(CARD_DEBUG "starting overlay\n",CARD));
284 read_lock(&ztv->lock);
285 zoran_set_geo(ztv,&ztv->overinfo);
286 read_unlock(&ztv->lock);
288 zror(ZORAN_OCR_OVLEN, ZORAN_OCR);
289 zrand(~ZORAN_VSTR_SNAPSHOT,ZORAN_VSTR);
290 zror(ZORAN_VDC_VIDEN,ZORAN_VDC);
294 * leave overlaying on, but turn interrupts off.
296 zrand(~ZORAN_ICR_EN,ZORAN_ICR);
300 /* do we have any VBI idle time processing? */
301 if (test_bit(STATE_VBI, &ztv->state))
303 struct vidinfo* item;
304 struct vidinfo* lastitem;
306 /* protect the workqueue */
307 write_lock(&ztv->lock);
308 lastitem = ztv->workqueue;
310 while (lastitem->next) lastitem = lastitem->next;
311 for (item=ztv->readinfo; item!=ztv->readinfo+ZORAN_VBI_BUFFERS; item++)
312 if (item->next == 0 && item->status == FBUFFER_FREE)
314 DEBUG(printk(CARD_DEBUG "%p added to queue\n",CARD,item));
315 item->status = FBUFFER_BUSY;
317 ztv->workqueue = item;
319 lastitem->next = item;
322 write_unlock(&ztv->lock);
324 goto again; /* hey, _i_ graduated :) */
328 * Then we must be realy IDLE
330 DEBUG(printk(CARD_DEBUG "turning off\n",CARD));
331 /* nothing further to do, disable DMA and further IRQs */
332 zrand(~ZORAN_VDC_VIDEN,ZORAN_VDC);
333 zrand(~ZORAN_ICR_EN,ZORAN_ICR);
337 void zoran_irq(int irq, void *dev_id, struct pt_regs * regs)
341 struct zoran *ztv = dev_id;
343 UNUSED(irq); UNUSED(regs);
345 /* get/clear interrupt status bits */
346 stat=zrread(ZORAN_ISR);
347 estat=stat & zrread(ZORAN_ICR);
350 zrwrite(estat,ZORAN_ISR);
351 IDEBUG(printk(CARD_DEBUG "estat %08x\n",CARD,estat));
352 IDEBUG(printk(CARD_DEBUG " stat %08x\n",CARD,stat));
354 if (estat & ZORAN_ISR_CODE)
356 IDEBUG(printk(CARD_DEBUG "CodReplIRQ\n",CARD));
358 if (estat & ZORAN_ISR_GIRQ0)
360 IDEBUG(printk(CARD_DEBUG "GIRQ0\n",CARD));
361 if (!ztv->card->usegirq1)
364 if (estat & ZORAN_ISR_GIRQ1)
366 IDEBUG(printk(CARD_DEBUG "GIRQ1\n",CARD));
367 if (ztv->card->usegirq1)
373 printk(CARD_ERR "irq loop %d (%x)\n",CARD,count,estat);
376 zrwrite(0, ZORAN_ICR);
377 printk(CARD_ERR "IRQ lockup, cleared int mask\n",CARD);
383 int zoran_muxsel(struct zoran* ztv, int channel, int norm)
387 /* set the new video norm */
388 rv = i2c_control_device(&(ztv->i2c), I2C_DRIVERID_VIDEODECODER, DECODER_SET_NORM, &norm);
393 /* map the given channel to the cards decoder's channel */
394 channel = ztv->card->video_mux[channel] & CHANNEL_MASK;
396 /* set the new channel */
397 rv = i2c_control_device(&(ztv->i2c), I2C_DRIVERID_VIDEODECODER, DECODER_SET_INPUT, &channel);
401 /* Tell the interrupt handler what to to. */
403 void zoran_cap(struct zoran* ztv, int on)
405 DEBUG(printk(CARD_DEBUG "zoran_cap(%d) state=%x\n",CARD,on,ztv->state));
411 * turn interrupts (back) on. The DMA will be enabled
412 * inside the irq handler when it detects a restart.
414 zror(ZORAN_ICR_EN,ZORAN_ICR);
418 * turn both interrupts and DMA off
420 zrand(~ZORAN_VDC_VIDEN,ZORAN_VDC);
421 zrand(~ZORAN_ICR_EN,ZORAN_ICR);
427 static ulong dmask[] = {
428 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFC, 0xFFFFFFF8,
429 0xFFFFFFF0, 0xFFFFFFE0, 0xFFFFFFC0, 0xFFFFFF80,
430 0xFFFFFF00, 0xFFFFFE00, 0xFFFFFC00, 0xFFFFF800,
431 0xFFFFF000, 0xFFFFE000, 0xFFFFC000, 0xFFFF8000,
432 0xFFFF0000, 0xFFFE0000, 0xFFFC0000, 0xFFF80000,
433 0xFFF00000, 0xFFE00000, 0xFFC00000, 0xFF800000,
434 0xFF000000, 0xFE000000, 0xFC000000, 0xF8000000,
435 0xF0000000, 0xE0000000, 0xC0000000, 0x80000000
439 void zoran_built_overlay(struct zoran* ztv, int count, struct video_clip *vcp)
442 int ystep = (ztv->vidXshift + ztv->vidWidth+31)/32; /* next DWORD */
445 DEBUG(printk(KERN_DEBUG " overlay at %p, ystep=%d, clips=%d\n",ztv->overinfo.overlay,ystep,count));
447 for (i=0; i<count; i++) {
448 struct video_clip *vp = vcp+i;
450 DEBUG(printk(KERN_DEBUG " %d: clip(%d,%d,%d,%d)\n", i,vp->x,vp->y,vp->width,vp->height));
454 * activate the visible portion of the screen
455 * Note we take some shortcuts here, because we
456 * know the width can never be < 32. (I.e. a DWORD)
457 * We also assume the overlay starts somewhere in
461 int start = ztv->vidXshift;
462 ulong firstd = dmask[start];
463 ulong lastd = ~dmask[(start + ztv->overinfo.w) & 31];
464 mtop = ztv->overinfo.overlay;
465 for (i=0; i<ztv->overinfo.h; i++) {
466 int w = ztv->vidWidth;
472 memset(line, ~0, w/8);
479 /* process clipping regions */
480 for (i=0; i<count; i++) {
482 if (vcp->x < 0 || (uint)vcp->x > ztv->overinfo.w ||
483 vcp->y < 0 || vcp->y > ztv->overinfo.h ||
484 vcp->width < 0 || (uint)(vcp->x+vcp->width) > ztv->overinfo.w ||
485 vcp->height < 0 || (vcp->y+vcp->height) > ztv->overinfo.h)
487 DEBUG(printk(CARD_DEBUG "invalid clipzone (%d,%d,%d,%d) not in (0,0,%d,%d), adapting\n",CARD,vcp->x,vcp->y,vcp->width,vcp->height,ztv->overinfo.w,ztv->overinfo.h));
488 if (vcp->x < 0) vcp->x = 0;
489 if ((uint)vcp->x > ztv->overinfo.w) vcp->x = ztv->overinfo.w;
490 if (vcp->y < 0) vcp->y = 0;
491 if (vcp->y > ztv->overinfo.h) vcp->y = ztv->overinfo.h;
492 if (vcp->width < 0) vcp->width = 0;
493 if ((uint)(vcp->x+vcp->width) > ztv->overinfo.w) vcp->width = ztv->overinfo.w - vcp->x;
494 if (vcp->height < 0) vcp->height = 0;
495 if (vcp->y+vcp->height > ztv->overinfo.h) vcp->height = ztv->overinfo.h - vcp->y;
499 mtop = &ztv->overinfo.overlay[vcp->y*ystep];
500 for (h=0; h<=vcp->height; h++) {
502 int x = ztv->vidXshift + vcp->x;
503 for (w=0; w<=vcp->width; w++) {
504 clear_bit(x&31, &mtop[x/32]);
512 mtop = ztv->overinfo.overlay;
513 zrwrite(virt_to_bus(mtop), ZORAN_MTOP);
514 zrwrite(virt_to_bus(mtop+ystep), ZORAN_MBOT);
515 zraor((ztv->vidInterlace*ystep)<<0,~ZORAN_OCR_MASKSTRIDE,ZORAN_OCR);
520 u16 Wt, Wa, Ht, Ha, HStart, VStart;
523 static struct tvnorm tvnorms[] = {
525 /* { 864, 720, 625, 576, 131, 21 },*/
526 /*00*/ { 864, 768, 625, 576, 81, 17 },
528 /*01*/ { 858, 720, 525, 480, 121, 10 },
530 /*02*/ { 864, 720, 625, 576, 131, 21 },
532 /*03*/ { 864, 720, 625, 576, 131, 21 },
534 /*04*/ { 858, 720, 525, 480, 121, 10 }
536 #define TVNORMS (sizeof(tvnorms)/sizeof(tvnorm))
539 * Program the chip for a setup as described in the vidinfo struct.
541 * Side-effects: calculates vidXshift, vidInterlace,
542 * vidHeight, vidWidth which are used in a later stage
543 * to calculate the overlay mask
545 * This is an internal function, as such it does not check the
546 * validity of the struct members... Spectaculair crashes will
547 * follow /very/ quick when you're wrong and the chip right :)
550 void zoran_set_geo(struct zoran* ztv, struct vidinfo* i)
554 int winWidth, winHeight;
555 int maxWidth, maxHeight, maxXOffset, maxYOffset;
558 DEBUG(printk(CARD_DEBUG "set_geo(rect=(%d,%d,%d,%d), norm=%d, format=%d, bpp=%d, bpl=%d, busadr=%lx, overlay=%p)\n",CARD,i->x,i->y,i->w,i->h,ztv->norm,i->format,i->bpp,i->bpl,i->busadr,i->overlay));
561 * make sure the DMA transfers are inhibited during our
562 * reprogramming of the chip
564 zrand(~ZORAN_VDC_VIDEN,ZORAN_VDC);
566 maxWidth = tvnorms[ztv->norm].Wa;
567 maxHeight = tvnorms[ztv->norm].Ha/2;
568 maxXOffset = tvnorms[ztv->norm].HStart;
569 maxYOffset = tvnorms[ztv->norm].VStart;
571 /* setup vfec register (keep ExtFl,TopField and VCLKPol settings) */
572 vfec = (zrread(ZORAN_VFEC) & (ZORAN_VFEC_EXTFL|ZORAN_VFEC_TOPFIELD|ZORAN_VFEC_VCLKPOL)) |
573 (palette2fmt[i->format].mode & (ZORAN_VFEC_RGB|ZORAN_VFEC_ERRDIF|ZORAN_VFEC_LE|ZORAN_VFEC_PACK24));
576 * Set top, bottom ptrs. Since these must be DWORD aligned,
577 * possible adjust the x and the width of the window.
578 * so the endposition stay the same. The vidXshift will make
579 * sure we are not writing pixels before the requested x.
584 winWidth = -winWidth;
585 top = i->busadr + i->x*i->bpp + i->y*i->bpl;
587 ztv->vidXshift = (top & 3) / i->bpp;
588 winWidth += ztv->vidXshift;
589 DEBUG(printk(KERN_DEBUG " window-x shifted %d pixels left\n",ztv->vidXshift));
594 * bottom points to next frame but in interleaved mode we want
595 * to 'mix' the 2 frames to one capture, so 'bot' points to one
596 * (physical) line below the top line.
599 zrwrite(top,ZORAN_VTOP);
600 zrwrite(bot,ZORAN_VBOT);
603 * Make sure the winWidth is DWORD aligned too,
604 * thereby automaticly making sure the stride to the
605 * next line is DWORD aligned too (as required by spec).
607 if ((winWidth*i->bpp) & 3) {
608 DEBUG(printk(KERN_DEBUG " window-width enlarged by %d pixels\n",(winWidth*i->bpp) & 3));
609 winWidth += (winWidth*i->bpp) & 3;
612 /* determine the DispMode and stride */
613 if (i->h >= 0 && i->h <= maxHeight) {
614 /* single frame grab suffices for this height. */
615 vfec |= ZORAN_VFEC_DISPMOD;
616 ztv->vidInterlace = 0;
617 stride = i->bpl - (winWidth*i->bpp);
621 /* interleaving needed for this height */
622 ztv->vidInterlace = 1;
623 stride = i->bpl*2 - (winWidth*i->bpp);
626 if (winHeight < 0) /* can happen for VBI! */
627 winHeight = -winHeight;
629 /* safety net, sometimes bpl is too short??? */
631 DEBUG(printk(CARD_DEBUG "WARNING stride = %d\n",CARD,stride));
635 zraor((winHeight<<12)|(winWidth<<0),~(ZORAN_VDC_VIDWINHT|ZORAN_VDC_VIDWINWID), ZORAN_VDC);
636 zraor(stride<<16,~ZORAN_VSTR_DISPSTRIDE,ZORAN_VSTR);
638 /* remember vidWidth, vidHeight for overlay calculations */
639 ztv->vidWidth = winWidth;
640 ztv->vidHeight = winHeight;
641 DEBUG(printk(KERN_DEBUG " top=%08lx, bottom=%08lx\n",top,bot));
642 DEBUG(printk(KERN_DEBUG " winWidth=%d, winHeight=%d\n",winWidth,winHeight));
643 DEBUG(printk(KERN_DEBUG " maxWidth=%d, maxHeight=%d\n",maxWidth,maxHeight));
644 DEBUG(printk(KERN_DEBUG " stride=%d\n",stride));
647 * determine horizontal scales and crops
651 int Hend = Hstart + winWidth;
652 DEBUG(printk(KERN_DEBUG " Y: scale=0, start=%d, end=%d\n", Hstart, Hend));
653 zraor((Hstart<<10)|(Hend<<0),~(ZORAN_VFEH_HSTART|ZORAN_VFEH_HEND),ZORAN_VFEH);
657 int X = (winWidth*64+Wa-1)/Wa;
658 int We = winWidth*64/X;
660 int hcrop1 = 2*(Wa-We)/4;
662 * BUGFIX: Juha Nurmela <junki@qn-lpr2-165.quicknet.inet.fi>
663 * found the solution to the color phase shift.
664 * See ChangeLog for the full explanation)
666 int Hstart = (maxXOffset + hcrop1) | 1;
667 int Hend = Hstart + We - 1;
669 DEBUG(printk(KERN_DEBUG " X: scale=%d, start=%d, end=%d\n", HorDcm, Hstart, Hend));
671 zraor((Hstart<<10)|(Hend<<0),~(ZORAN_VFEH_HSTART|ZORAN_VFEH_HEND),ZORAN_VFEH);
675 vfec |= ZORAN_VFEC_HFILTER_1; /* no filter */
677 vfec |= ZORAN_VFEC_HFILTER_3; /* 3 tap filter */
679 vfec |= ZORAN_VFEC_HFILTER_4; /* 4 tap filter */
680 else vfec |= ZORAN_VFEC_HFILTER_5; /* 5 tap filter */
684 * Determine vertical scales and crops
686 * when height is negative, we want to read starting at line 0
687 * One day someone might need access to these lines...
691 int Vend = Vstart + winHeight;
692 DEBUG(printk(KERN_DEBUG " Y: scale=0, start=%d, end=%d\n", Vstart, Vend));
693 zraor((Vstart<<10)|(Vend<<0),~(ZORAN_VFEV_VSTART|ZORAN_VFEV_VEND),ZORAN_VFEV);
697 int Y = (winHeight*64+Ha-1)/Ha;
698 int He = winHeight*64/Y;
700 int vcrop1 = 2*(Ha-He)/4;
701 int Vstart = maxYOffset + vcrop1;
702 int Vend = Vstart + He - 1;
704 DEBUG(printk(KERN_DEBUG " Y: scale=%d, start=%d, end=%d\n", VerDcm, Vstart, Vend));
705 zraor((Vstart<<10)|(Vend<<0),~(ZORAN_VFEV_VSTART|ZORAN_VFEV_VEND),ZORAN_VFEV);
709 DEBUG(printk(KERN_DEBUG " F: format=%d(=%s)\n",i->format,palette2fmt[i->format].name));
711 /* setup the requested format */
712 zrwrite(vfec, ZORAN_VFEC);
716 void zoran_common_open(struct zoran* ztv, int flags)
720 /* already opened? */
721 if (ztv->users++ != 0)
729 /* setup the encoder to the initial values */
730 ztv->picture.colour=254<<7;
731 ztv->picture.brightness=128<<8;
732 ztv->picture.hue=128<<8;
733 ztv->picture.contrast=216<<7;
734 i2c_control_device(&ztv->i2c, I2C_DRIVERID_VIDEODECODER, DECODER_SET_PICTURE, &ztv->picture);
736 /* default to the composite input since my camera is there */
737 zoran_muxsel(ztv, 0, VIDEO_MODE_PAL);
741 void zoran_common_close(struct zoran* ztv)
743 if (--ztv->users != 0)
754 * Open a zoran card. Right now the flags are just a hack
756 static int zoran_open(struct video_device *dev, int flags)
758 struct zoran *ztv = (struct zoran*)dev;
759 struct vidinfo* item;
762 DEBUG(printk(CARD_DEBUG "open(dev,%d)\n",CARD,flags));
764 /*********************************************
765 * We really should be doing lazy allocing...
766 *********************************************/
767 /* allocate a frame buffer */
769 ztv->fbuffer = bmalloc(ZORAN_MAX_FBUFSIZE);
771 /* could not get a buffer, bail out */
774 /* at this time we _always_ have a framebuffer */
775 memset(ztv->fbuffer,0,ZORAN_MAX_FBUFSIZE);
777 if (!ztv->overinfo.overlay)
778 ztv->overinfo.overlay = kmalloc(1024*1024/8, GFP_KERNEL);
779 if (!ztv->overinfo.overlay) {
780 /* could not get an overlay buffer, bail out */
781 bfree(ztv->fbuffer, ZORAN_MAX_FBUFSIZE);
784 /* at this time we _always_ have a overlay */
786 /* clear buffer status, and give them a DMAable address */
788 for (item=ztv->grabinfo; item!=ztv->grabinfo+ZORAN_MAX_FBUFFERS; item++)
790 item->status = FBUFFER_FREE;
792 item->busadr = virt_to_bus(pos);
793 pos += ZORAN_MAX_FBUFFER;
796 /* do the common part of all open's */
797 zoran_common_open(ztv, flags);
803 void zoran_close(struct video_device* dev)
805 struct zoran *ztv = (struct zoran*)dev;
807 DEBUG(printk(CARD_DEBUG "close(dev)\n",CARD));
809 /* driver specific closure */
810 clear_bit(STATE_OVERLAY, &ztv->state);
812 zoran_common_close(ztv);
815 * This is sucky but right now I can't find a good way to
816 * be sure its safe to free the buffer. We wait 5-6 fields
817 * which is more than sufficient to be sure.
819 msleep(100); /* Wait 1/10th of a second */
821 /* free the allocated framebuffer */
823 bfree( ztv->fbuffer, ZORAN_MAX_FBUFSIZE );
825 if (ztv->overinfo.overlay)
826 kfree( ztv->overinfo.overlay );
827 ztv->overinfo.overlay = 0;
832 * This read function could be used reentrant in a SMP situation.
834 * This is made possible by the spinlock which is kept till we
835 * found and marked a buffer for our own use. The lock must
836 * be released as soon as possible to prevent lock contention.
839 long zoran_read(struct video_device* dev, char* buf, unsigned long count, int nonblock)
841 struct zoran *ztv = (struct zoran*)dev;
843 struct vidinfo* unused = 0;
844 struct vidinfo* done = 0;
846 DEBUG(printk(CARD_DEBUG "zoran_read(%p,%ld,%d)\n",CARD,buf,count,nonblock));
848 /* find ourself a free or completed buffer */
850 struct vidinfo* item;
852 write_lock_irq(&ztv->lock);
853 for (item=ztv->grabinfo; item!=ztv->grabinfo+ZORAN_MAX_FBUFFERS; item++)
855 if (!unused && item->status == FBUFFER_FREE)
857 if (!done && item->status == FBUFFER_DONE)
863 /* no more free buffers, wait for them. */
864 write_unlock_irq(&ztv->lock);
867 interruptible_sleep_on(&ztv->grabq);
868 if (signal_pending(current))
872 /* Do we have 'ready' data? */
874 /* no? than this will take a while... */
876 write_unlock_irq(&ztv->lock);
880 /* mark the unused buffer as wanted */
881 unused->status = FBUFFER_BUSY;
884 unused->format = VIDEO_PALETTE_RGB24;
885 unused->bpp = palette2fmt[unused->format].bpp;
886 unused->bpl = unused->w * unused->bpp;
888 { /* add to tail of queue */
889 struct vidinfo* oldframe = ztv->workqueue;
890 if (!oldframe) ztv->workqueue = unused;
892 while (oldframe->next) oldframe = oldframe->next;
893 oldframe->next = unused;
896 write_unlock_irq(&ztv->lock);
898 /* tell the state machine we want it filled /NOW/ */
901 /* wait till this buffer gets grabbed */
902 while (unused->status == FBUFFER_BUSY) {
903 interruptible_sleep_on(&ztv->grabq);
904 /* see if a signal did it */
905 if (signal_pending(current))
911 write_unlock_irq(&ztv->lock);
913 /* Yes! we got data! */
914 max = done->bpl * done->h;
917 if (copy_to_user((void*)buf, done->memadr, count))
920 /* keep the engine running */
921 done->status = FBUFFER_FREE;
924 /* tell listeners this buffer became free */
925 wake_up_interruptible(&ztv->grabq);
928 DEBUG(printk(CARD_DEBUG "zoran_read() returns %lu\n",CARD,count));
933 long zoran_write(struct video_device* dev, const char* buf, unsigned long count, int nonblock)
935 struct zoran *ztv = (struct zoran *)dev;
936 UNUSED(ztv); UNUSED(dev); UNUSED(buf); UNUSED(count); UNUSED(nonblock);
937 DEBUG(printk(CARD_DEBUG "zoran_write\n",CARD));
942 unsigned int zoran_poll(struct video_device *dev, struct file *file, poll_table *wait)
944 struct zoran *ztv = (struct zoran *)dev;
945 struct vidinfo* item;
946 unsigned int mask = 0;
948 poll_wait(file, &ztv->grabq, wait);
950 for (item=ztv->grabinfo; item!=ztv->grabinfo+ZORAN_MAX_FBUFFERS; item++)
951 if (item->status == FBUFFER_DONE)
953 mask |= (POLLIN | POLLRDNORM);
957 DEBUG(printk(CARD_DEBUG "zoran_poll()=%x\n",CARD,mask));
962 /* append a new clipregion to the vector of video_clips */
964 void new_clip(struct video_window* vw, struct video_clip* vcp, int x, int y, int w, int h)
966 vcp[vw->clipcount].x = x;
967 vcp[vw->clipcount].y = y;
968 vcp[vw->clipcount].width = w;
969 vcp[vw->clipcount].height = h;
974 int zoran_ioctl(struct video_device* dev, unsigned int cmd, void *arg)
976 struct zoran* ztv = (struct zoran*)dev;
981 struct video_capability c;
982 DEBUG(printk(CARD_DEBUG "VIDIOCGCAP\n",CARD));
984 strcpy(c.name,ztv->video_dev.name);
985 c.type = VID_TYPE_CAPTURE|
991 c.type |= VID_TYPE_TUNER;
992 if (ztv->have_decoder) {
993 c.channels = ztv->card->video_inputs;
994 c.audios = ztv->card->audio_inputs;
996 /* no decoder -> no channels */
997 c.channels = c.audios = 0;
1002 if (copy_to_user(arg,&c,sizeof(c)))
1009 struct video_channel v;
1011 if (copy_from_user(&v, arg,sizeof(v)))
1013 DEBUG(printk(CARD_DEBUG "VIDIOCGCHAN(%d)\n",CARD,v.channel));
1014 v.flags=VIDEO_VC_AUDIO
1015 #ifdef VIDEO_VC_NORM
1020 v.type=VIDEO_TYPE_CAMERA;
1021 #ifdef I_EXPECT_POSSIBLE_NORMS_IN_THE_API
1022 v.norm=VIDEO_MODE_PAL|
1026 v.norm=VIDEO_MODE_PAL;
1028 /* too many inputs? no decoder -> no channels */
1029 if (!ztv->have_decoder || v.channel < 0 || v.channel >= ztv->card->video_inputs)
1032 /* now determine the name of the channel */
1033 mux = ztv->card->video_mux[v.channel];
1034 if (mux & IS_TUNER) {
1035 /* lets assume only one tuner, yes? */
1036 strcpy(v.name,"Television");
1037 v.type = VIDEO_TYPE_TV;
1038 if (ztv->have_tuner) {
1039 v.flags |= VIDEO_VC_TUNER;
1043 else if (mux & IS_SVHS)
1044 sprintf(v.name,"S-Video-%d",v.channel);
1046 sprintf(v.name,"CVBS-%d",v.channel);
1048 if (copy_to_user(arg,&v,sizeof(v)))
1053 { /* set video channel */
1054 struct video_channel v;
1055 if (copy_from_user(&v, arg,sizeof(v)))
1057 DEBUG(printk(CARD_DEBUG "VIDIOCSCHAN(%d,%d)\n",CARD,v.channel,v.norm));
1059 /* too many inputs? no decoder -> no channels */
1060 if (!ztv->have_decoder || v.channel >= ztv->card->video_inputs || v.channel < 0)
1063 if (v.norm != VIDEO_MODE_PAL &&
1064 v.norm != VIDEO_MODE_NTSC &&
1065 v.norm != VIDEO_MODE_SECAM &&
1066 v.norm != VIDEO_MODE_AUTO)
1069 /* make it happen, nr1! */
1070 return zoran_muxsel(ztv,v.channel,v.norm);
1075 struct video_tuner v;
1076 if (copy_from_user(&v, arg,sizeof(v)))
1078 DEBUG(printk(CARD_DEBUG "VIDIOCGTUNER(%d)\n",CARD,v.tuner));
1080 /* Only no or one tuner for now */
1081 if (!ztv->have_tuner || v.tuner)
1084 strcpy(v.name,"Television");
1087 v.flags = VIDEO_TUNER_PAL|VIDEO_TUNER_NTSC|VIDEO_TUNER_SECAM;
1089 v.signal = 0xFFFF; /* unknown */
1091 if (copy_to_user(arg,&v,sizeof(v)))
1097 struct video_tuner v;
1098 if (copy_from_user(&v, arg, sizeof(v)))
1100 DEBUG(printk(CARD_DEBUG "VIDIOCSTUNER(%d,%d)\n",CARD,v.tuner,v.mode));
1102 /* Only no or one tuner for now */
1103 if (!ztv->have_tuner || v.tuner)
1106 /* and it only has certain valid modes */
1107 if( v.mode != VIDEO_MODE_PAL &&
1108 v.mode != VIDEO_MODE_NTSC &&
1109 v.mode != VIDEO_MODE_SECAM)
1113 return zoran_muxsel(ztv,v.tuner,v.mode);
1118 struct video_picture p = ztv->picture;
1119 DEBUG(printk(CARD_DEBUG "VIDIOCGPICT\n",CARD));
1120 p.depth = ztv->depth;
1122 case 8: p.palette=VIDEO_PALETTE_YUV422;
1124 case 15: p.palette=VIDEO_PALETTE_RGB555;
1126 case 16: p.palette=VIDEO_PALETTE_RGB565;
1128 case 24: p.palette=VIDEO_PALETTE_RGB24;
1130 case 32: p.palette=VIDEO_PALETTE_RGB32;
1133 if (copy_to_user(arg, &p, sizeof(p)))
1139 struct video_picture p;
1140 if (copy_from_user(&p, arg,sizeof(p)))
1142 DEBUG(printk(CARD_DEBUG "VIDIOCSPICT(%d,%d,%d,%d,%d,%d,%d)\n",CARD,p.brightness,p.hue,p.colour,p.contrast,p.whiteness,p.depth,p.palette));
1144 /* depth must match with framebuffer */
1145 if (p.depth != ztv->depth)
1148 /* check if palette matches this bpp */
1149 if (p.palette>NRPALETTES ||
1150 palette2fmt[p.palette].bpp != ztv->overinfo.bpp)
1153 write_lock_irq(&ztv->lock);
1154 ztv->overinfo.format = p.palette;
1156 write_unlock_irq(&ztv->lock);
1158 /* tell the decoder */
1159 i2c_control_device(&ztv->i2c, I2C_DRIVERID_VIDEODECODER, DECODER_SET_PICTURE, &p);
1165 struct video_window vw;
1166 DEBUG(printk(CARD_DEBUG "VIDIOCGWIN\n",CARD));
1167 read_lock(&ztv->lock);
1168 vw.x = ztv->overinfo.x;
1169 vw.y = ztv->overinfo.y;
1170 vw.width = ztv->overinfo.w;
1171 vw.height = ztv->overinfo.h;
1174 if (ztv->vidInterlace)
1175 vw.flags|=VIDEO_WINDOW_INTERLACE;
1176 read_unlock(&ztv->lock);
1177 if (copy_to_user(arg,&vw,sizeof(vw)))
1183 struct video_window vw;
1184 struct video_clip *vcp;
1186 if (copy_from_user(&vw,arg,sizeof(vw)))
1188 DEBUG(printk(CARD_DEBUG "VIDIOCSWIN(%d,%d,%d,%d,%x,%d)\n",CARD,vw.x,vw.y,vw.width,vw.height,vw.flags,vw.clipcount));
1193 if (vw.clipcount <0 || vw.clipcount>256)
1194 return -EDOM; /* Too many! */
1199 vcp = vmalloc(sizeof(struct video_clip)*(vw.clipcount+4));
1202 if (vw.clipcount && copy_from_user(vcp,vw.clips,sizeof(struct video_clip)*vw.clipcount)) {
1212 * strange, it seems xawtv sometimes calls us with 0
1213 * width and/or height. Ignore these values
1216 vw.x = ztv->overinfo.x;
1218 vw.y = ztv->overinfo.y;
1220 /* by now we are committed to the new data... */
1221 write_lock_irq(&ztv->lock);
1222 ztv->overinfo.x = vw.x;
1223 ztv->overinfo.y = vw.y;
1224 ztv->overinfo.w = vw.width;
1225 ztv->overinfo.h = vw.height;
1226 write_unlock_irq(&ztv->lock);
1229 * Impose display clips
1231 if (vw.x+vw.width > ztv->swidth)
1232 new_clip(&vw, vcp, ztv->swidth-vw.x, 0, vw.width-1, vw.height-1);
1233 if (vw.y+vw.height > ztv->sheight)
1234 new_clip(&vw, vcp, 0, ztv->sheight-vw.y, vw.width-1, vw.height-1);
1236 /* built the requested clipping zones */
1237 zoran_set_geo(ztv, &ztv->overinfo);
1238 zoran_built_overlay(ztv, vw.clipcount, vcp);
1241 /* if we were on, restart the video engine */
1250 if (get_user(v, (int *)arg))
1252 DEBUG(printk(CARD_DEBUG "VIDIOCCAPTURE(%d)\n",CARD,v));
1255 clear_bit(STATE_OVERLAY, &ztv->state);
1259 /* is VIDIOCSFBUF, VIDIOCSWIN done? */
1260 if (ztv->overinfo.busadr==0 || ztv->overinfo.w==0 || ztv->overinfo.h==0)
1263 set_bit(STATE_OVERLAY, &ztv->state);
1271 struct video_buffer v;
1272 DEBUG(printk(CARD_DEBUG "VIDIOCGFBUF\n",CARD));
1273 read_lock(&ztv->lock);
1274 v.base = (void *)ztv->overinfo.busadr;
1275 v.height = ztv->sheight;
1276 v.width = ztv->swidth;
1277 v.depth = ztv->depth;
1278 v.bytesperline = ztv->overinfo.bpl;
1279 read_unlock(&ztv->lock);
1280 if(copy_to_user(arg, &v,sizeof(v)))
1286 struct video_buffer v;
1287 if(!capable(CAP_SYS_ADMIN))
1289 if (copy_from_user(&v, arg,sizeof(v)))
1291 DEBUG(printk(CARD_DEBUG "VIDIOCSFBUF(%p,%d,%d,%d,%d)\n",CARD,v.base, v.width,v.height,v.depth,v.bytesperline));
1293 if (v.depth!=15 && v.depth!=16 && v.depth!=24 && v.depth!=32)
1295 if (v.bytesperline<1)
1299 write_lock_irq(&ztv->lock);
1300 ztv->overinfo.busadr = (ulong)v.base;
1301 ztv->sheight = v.height;
1302 ztv->swidth = v.width;
1303 ztv->depth = v.depth; /* bits per pixel */
1304 ztv->overinfo.bpp = ((v.depth+1)&0x38)/8;/* bytes per pixel */
1305 ztv->overinfo.bpl = v.bytesperline; /* bytes per line */
1306 write_unlock_irq(&ztv->lock);
1312 /* Will be handled higher up .. */
1319 if (get_user(i, (int *) arg))
1321 DEBUG(printk(CARD_DEBUG "VIDEOCSYNC(%d)\n",CARD,i));
1322 if (i<0 || i>ZORAN_MAX_FBUFFERS)
1324 switch (ztv->grabinfo[i].status) {
1328 /* wait till this buffer gets grabbed */
1329 while (ztv->grabinfo[i].status == FBUFFER_BUSY) {
1330 interruptible_sleep_on(&ztv->grabq);
1331 /* see if a signal did it */
1332 if (signal_pending(current))
1335 /* don't fall through; a DONE buffer is not UNUSED */
1338 ztv->grabinfo[i].status = FBUFFER_FREE;
1339 /* tell ppl we have a spare buffer */
1340 wake_up_interruptible(&ztv->grabq);
1343 DEBUG(printk(CARD_DEBUG "VIDEOCSYNC(%d) returns\n",CARD,i));
1347 case VIDIOCMCAPTURE:
1349 struct video_mmap vm;
1350 struct vidinfo* frame;
1351 if (copy_from_user(&vm,arg,sizeof(vm)))
1353 DEBUG(printk(CARD_DEBUG "VIDIOCMCAPTURE(%d,(%d,%d),%d)\n",CARD,vm.frame,vm.width,vm.height,vm.format));
1354 if (vm.frame<0 || vm.frame>ZORAN_MAX_FBUFFERS ||
1355 vm.width<32 || vm.width>768 ||
1356 vm.height<32 || vm.height>576 ||
1357 vm.format>NRPALETTES ||
1358 palette2fmt[vm.format].mode == 0)
1361 /* we are allowed to take over UNUSED and DONE buffers */
1362 frame = &ztv->grabinfo[vm.frame];
1363 if (frame->status == FBUFFER_BUSY)
1366 /* setup the other parameters if they are given */
1367 write_lock_irq(&ztv->lock);
1368 frame->w = vm.width;
1369 frame->h = vm.height;
1370 frame->format = vm.format;
1371 frame->bpp = palette2fmt[frame->format].bpp;
1372 frame->bpl = frame->w*frame->bpp;
1373 frame->status = FBUFFER_BUSY;
1375 { /* add to tail of queue */
1376 struct vidinfo* oldframe = ztv->workqueue;
1377 if (!oldframe) ztv->workqueue = frame;
1379 while (oldframe->next) oldframe = oldframe->next;
1380 oldframe->next = frame;
1383 write_unlock_irq(&ztv->lock);
1390 struct video_mbuf mb;
1392 DEBUG(printk(CARD_DEBUG "VIDIOCGMBUF\n",CARD));
1393 mb.size = ZORAN_MAX_FBUFSIZE;
1394 mb.frames = ZORAN_MAX_FBUFFERS;
1395 for (i=0; i<ZORAN_MAX_FBUFFERS; i++)
1396 mb.offsets[i] = i*ZORAN_MAX_FBUFFER;
1397 if(copy_to_user(arg, &mb,sizeof(mb)))
1404 struct video_unit vu;
1405 DEBUG(printk(CARD_DEBUG "VIDIOCGUNIT\n",CARD));
1406 vu.video = ztv->video_dev.minor;
1407 vu.vbi = ztv->vbi_dev.minor;
1408 vu.radio = VIDEO_NO_UNIT;
1409 vu.audio = VIDEO_NO_UNIT;
1410 vu.teletext = VIDEO_NO_UNIT;
1411 if(copy_to_user(arg, &vu,sizeof(vu)))
1418 unsigned long v = ztv->tuner_freq;
1419 if (copy_to_user(arg,&v,sizeof(v)))
1421 DEBUG(printk(CARD_DEBUG "VIDIOCGFREQ\n",CARD));
1427 if (copy_from_user(&v, arg, sizeof(v)))
1429 DEBUG(printk(CARD_DEBUG "VIDIOCSFREQ\n",CARD));
1431 if (ztv->have_tuner) {
1433 if (i2c_control_device(&(ztv->i2c), I2C_DRIVERID_TUNER, TUNER_SET_TVFREQ, &fixme) < 0)
1436 ztv->tuner_freq = v;
1440 /* Why isn't this in the API?
1441 * And why doesn't it take a buffer number?
1444 unsigned long v = ztv->lastfieldnr;
1445 if (copy_to_user(arg,&v,sizeof(v)))
1447 DEBUG(printk(CARD_DEBUG "BTTV_FIELDNR\n",CARD));
1453 return -ENOIOCTLCMD;
1459 int zoran_mmap(struct vm_area_struct *vma, struct video_device* dev, const char* adr, unsigned long size)
1461 struct zoran* ztv = (struct zoran*)dev;
1462 unsigned long start = (unsigned long)adr;
1465 DEBUG(printk(CARD_DEBUG "zoran_mmap(0x%p,%ld)\n",CARD,adr,size));
1468 if (size > ZORAN_MAX_FBUFSIZE || !ztv->fbuffer)
1471 /* start mapping the whole shabang to user memory */
1472 pos = (unsigned long)ztv->fbuffer;
1474 unsigned long pfn = virt_to_phys((void*)pos) >> PAGE_SHIFT;
1475 if (remap_pfn_range(vma, start, pfn, PAGE_SIZE, PAGE_SHARED))
1484 static struct video_device zr36120_template=
1486 .owner = THIS_MODULE,
1488 .type = VID_TYPE_TUNER|VID_TYPE_CAPTURE|VID_TYPE_OVERLAY,
1489 .hardware = VID_HARDWARE_ZR36120,
1491 .close = zoran_close,
1493 .write = zoran_write,
1495 .ioctl = zoran_ioctl,
1501 int vbi_open(struct video_device *dev, int flags)
1503 struct zoran *ztv = dev->priv;
1504 struct vidinfo* item;
1506 DEBUG(printk(CARD_DEBUG "vbi_open(dev,%d)\n",CARD,flags));
1509 * During VBI device open, we continiously grab VBI-like
1510 * data in the vbi buffer when we have nothing to do.
1511 * Only when there is an explicit request for VBI data
1512 * (read call) we /force/ a read.
1515 /* allocate buffers */
1516 for (item=ztv->readinfo; item!=ztv->readinfo+ZORAN_VBI_BUFFERS; item++)
1518 item->status = FBUFFER_FREE;
1521 if (!item->memadr) {
1522 item->memadr = bmalloc(ZORAN_VBI_BUFSIZE);
1523 if (!item->memadr) {
1524 /* could not get a buffer, bail out */
1525 while (item != ztv->readinfo) {
1527 bfree(item->memadr, ZORAN_VBI_BUFSIZE);
1535 /* determine the DMAable address */
1536 item->busadr = virt_to_bus(item->memadr);
1539 /* do the common part of all open's */
1540 zoran_common_open(ztv, flags);
1542 set_bit(STATE_VBI, &ztv->state);
1543 /* start read-ahead */
1550 void vbi_close(struct video_device *dev)
1552 struct zoran *ztv = dev->priv;
1553 struct vidinfo* item;
1555 DEBUG(printk(CARD_DEBUG "vbi_close(dev)\n",CARD));
1557 /* driver specific closure */
1558 clear_bit(STATE_VBI, &ztv->state);
1560 zoran_common_close(ztv);
1563 * This is sucky but right now I can't find a good way to
1564 * be sure its safe to free the buffer. We wait 5-6 fields
1565 * which is more than sufficient to be sure.
1567 msleep(100); /* Wait 1/10th of a second */
1569 for (item=ztv->readinfo; item!=ztv->readinfo+ZORAN_VBI_BUFFERS; item++)
1572 bfree(item->memadr, ZORAN_VBI_BUFSIZE);
1579 * This read function could be used reentrant in a SMP situation.
1581 * This is made possible by the spinlock which is kept till we
1582 * found and marked a buffer for our own use. The lock must
1583 * be released as soon as possible to prevent lock contention.
1586 long vbi_read(struct video_device* dev, char* buf, unsigned long count, int nonblock)
1588 struct zoran *ztv = dev->priv;
1590 struct vidinfo* unused = 0;
1591 struct vidinfo* done = 0;
1593 DEBUG(printk(CARD_DEBUG "vbi_read(0x%p,%ld,%d)\n",CARD,buf,count,nonblock));
1595 /* find ourself a free or completed buffer */
1597 struct vidinfo* item;
1599 write_lock_irq(&ztv->lock);
1600 for (item=ztv->readinfo; item!=ztv->readinfo+ZORAN_VBI_BUFFERS; item++) {
1601 if (!unused && item->status == FBUFFER_FREE)
1603 if (!done && item->status == FBUFFER_DONE)
1609 /* no more free buffers, wait for them. */
1610 write_unlock_irq(&ztv->lock);
1612 return -EWOULDBLOCK;
1613 interruptible_sleep_on(&ztv->vbiq);
1614 if (signal_pending(current))
1618 /* Do we have 'ready' data? */
1620 /* no? than this will take a while... */
1622 write_unlock_irq(&ztv->lock);
1623 return -EWOULDBLOCK;
1626 /* mark the unused buffer as wanted */
1627 unused->status = FBUFFER_BUSY;
1629 { /* add to tail of queue */
1630 struct vidinfo* oldframe = ztv->workqueue;
1631 if (!oldframe) ztv->workqueue = unused;
1633 while (oldframe->next) oldframe = oldframe->next;
1634 oldframe->next = unused;
1637 write_unlock_irq(&ztv->lock);
1639 /* tell the state machine we want it filled /NOW/ */
1642 /* wait till this buffer gets grabbed */
1643 while (unused->status == FBUFFER_BUSY) {
1644 interruptible_sleep_on(&ztv->vbiq);
1645 /* see if a signal did it */
1646 if (signal_pending(current))
1652 write_unlock_irq(&ztv->lock);
1654 /* Yes! we got data! */
1655 max = done->bpl * -done->h;
1659 /* check if the user gave us enough room to write the data */
1660 if (!access_ok(VERIFY_WRITE, buf, count)) {
1666 * Now transform/strip the data from YUV to Y-only
1667 * NB. Assume the Y is in the LSB of the YUV data.
1670 unsigned char* optr = buf;
1671 unsigned char* eptr = buf+count;
1673 /* are we beeing accessed from an old driver? */
1674 if (count == 2*19*2048) {
1676 * Extreme HACK, old VBI programs expect 2048 points
1677 * of data, and we only got 864 orso. Double each
1678 * datapoint and clear the rest of the line.
1679 * This way we have appear to have a
1680 * sample_frequency of 29.5 Mc.
1683 unsigned char* iptr = done->memadr+1;
1684 for (y=done->h; optr<eptr && y<0; y++)
1686 /* copy to doubled data to userland */
1687 for (x=0; optr+1<eptr && x<-done->w; x++)
1689 unsigned char a = iptr[x*2];
1690 __put_user(a, optr++);
1691 __put_user(a, optr++);
1693 /* and clear the rest of the line */
1694 for (x*=2; optr<eptr && x<done->bpl; x++)
1695 __put_user(0, optr++);
1702 * Other (probably newer) programs asked
1703 * us what geometry we are using, and are
1704 * reading the correct size.
1707 unsigned char* iptr = done->memadr+1;
1708 for (y=done->h; optr<eptr && y<0; y++)
1710 /* copy to doubled data to userland */
1711 for (x=0; optr<eptr && x<-done->w; x++)
1712 __put_user(iptr[x*2], optr++);
1713 /* and clear the rest of the line */
1714 for (;optr<eptr && x<done->bpl; x++)
1715 __put_user(0, optr++);
1722 * place the framenumber (half fieldnr) in the last long
1724 __put_user(done->fieldnr/2, ((ulong*)eptr)[-1]);
1727 /* keep the engine running */
1728 done->status = FBUFFER_FREE;
1731 /* tell listeners this buffer just became free */
1732 wake_up_interruptible(&ztv->vbiq);
1736 DEBUG(printk(CARD_DEBUG "vbi_read() returns %lu\n",CARD,count));
1741 unsigned int vbi_poll(struct video_device *dev, struct file *file, poll_table *wait)
1743 struct zoran *ztv = dev->priv;
1744 struct vidinfo* item;
1745 unsigned int mask = 0;
1747 poll_wait(file, &ztv->vbiq, wait);
1749 for (item=ztv->readinfo; item!=ztv->readinfo+ZORAN_VBI_BUFFERS; item++)
1750 if (item->status == FBUFFER_DONE)
1752 mask |= (POLLIN | POLLRDNORM);
1756 DEBUG(printk(CARD_DEBUG "vbi_poll()=%x\n",CARD,mask));
1762 int vbi_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
1764 struct zoran* ztv = dev->priv;
1769 struct vbi_format f;
1770 DEBUG(printk(CARD_DEBUG "VIDIOCGVBIINFO\n",CARD));
1771 f.sampling_rate = 14750000UL;
1772 f.samples_per_line = -ztv->readinfo[0].w;
1773 f.sample_format = VIDEO_PALETTE_RAW;
1774 f.start[0] = f.start[1] = ztv->readinfo[0].y;
1776 f.count[0] = f.count[1] = -ztv->readinfo[0].h;
1777 f.flags = VBI_INTERLACED;
1778 if (copy_to_user(arg,&f,sizeof(f)))
1784 struct vbi_format f;
1786 if (copy_from_user(&f, arg,sizeof(f)))
1788 DEBUG(printk(CARD_DEBUG "VIDIOCSVBIINFO(%d,%d,%d,%d,%d,%d,%d,%x)\n",CARD,f.sampling_rate,f.samples_per_line,f.sample_format,f.start[0],f.start[1],f.count[0],f.count[1],f.flags));
1790 /* lots of parameters are fixed... (PAL) */
1791 if (f.sampling_rate != 14750000UL ||
1792 f.samples_per_line > 864 ||
1793 f.sample_format != VIDEO_PALETTE_RAW ||
1795 f.start[0] != f.start[1]-312 ||
1796 f.count[0] != f.count[1] ||
1797 f.start[0]+f.count[0] >= 288 ||
1798 f.flags != VBI_INTERLACED)
1801 write_lock_irq(&ztv->lock);
1802 ztv->readinfo[0].y = f.start[0];
1803 ztv->readinfo[0].w = -f.samples_per_line;
1804 ztv->readinfo[0].h = -f.count[0];
1805 ztv->readinfo[0].bpl = f.samples_per_line*ztv->readinfo[0].bpp;
1806 for (i=1; i<ZORAN_VBI_BUFFERS; i++)
1807 ztv->readinfo[i] = ztv->readinfo[i];
1808 write_unlock_irq(&ztv->lock);
1812 return -ENOIOCTLCMD;
1817 static struct video_device vbi_template=
1819 .owner = THIS_MODULE,
1821 .type = VID_TYPE_CAPTURE|VID_TYPE_TELETEXT,
1822 .hardware = VID_HARDWARE_ZR36120,
1826 .write = zoran_write,
1833 * Scan for a Zoran chip, request the irq and map the io memory
1836 int __init find_zoran(void)
1840 struct pci_dev *dev = NULL;
1841 unsigned char revision;
1844 while ((dev = pci_find_device(PCI_VENDOR_ID_ZORAN,PCI_DEVICE_ID_ZORAN_36120, dev)))
1846 /* Ok, a ZR36120/ZR36125 found! */
1847 ztv = &zorans[zoran_num];
1850 if (pci_enable_device(dev))
1853 pci_read_config_byte(dev, PCI_CLASS_REVISION, &revision);
1854 printk(KERN_INFO "zoran: Zoran %x (rev %d) ",
1855 dev->device, revision);
1856 printk("bus: %d, devfn: %d, irq: %d, ",
1857 dev->bus->number, dev->devfn, dev->irq);
1858 printk("memory: 0x%08lx.\n", ztv->zoran_adr);
1860 ztv->zoran_mem = ioremap(ztv->zoran_adr, 0x1000);
1861 DEBUG(printk(KERN_DEBUG "zoran: mapped-memory at 0x%p\n",ztv->zoran_mem));
1863 result = request_irq(dev->irq, zoran_irq,
1864 SA_SHIRQ|SA_INTERRUPT,"zoran", ztv);
1865 if (result==-EINVAL)
1867 iounmap(ztv->zoran_mem);
1868 printk(KERN_ERR "zoran: Bad irq number or handler\n");
1872 printk(KERN_ERR "zoran: IRQ %d busy, change your PnP config in BIOS\n",dev->irq);
1874 iounmap(ztv->zoran_mem);
1877 /* Enable bus-mastering */
1878 pci_set_master(dev);
1883 printk(KERN_INFO "zoran: %d Zoran card(s) found.\n",zoran_num);
1888 int __init init_zoran(int card)
1890 struct zoran *ztv = &zorans[card];
1893 /* if the given cardtype valid? */
1894 if (cardtype[card]>=NRTVCARDS) {
1895 printk(KERN_INFO "invalid cardtype(%d) detected\n",cardtype[card]);
1899 /* reset the zoran */
1900 zrand(~ZORAN_PCI_SOFTRESET,ZORAN_PCI);
1902 zror(ZORAN_PCI_SOFTRESET,ZORAN_PCI);
1905 /* zoran chip specific details */
1906 ztv->card = tvcards+cardtype[card]; /* point to the selected card */
1907 ztv->norm = 0; /* PAL */
1908 ztv->tuner_freq = 0;
1910 /* videocard details */
1917 ztv->overinfo.kindof = FBUFFER_OVERLAY;
1918 ztv->overinfo.status = FBUFFER_FREE;
1919 ztv->overinfo.x = 0;
1920 ztv->overinfo.y = 0;
1921 ztv->overinfo.w = 768; /* 640 */
1922 ztv->overinfo.h = 576; /* 480 */
1923 ztv->overinfo.format = VIDEO_PALETTE_RGB565;
1924 ztv->overinfo.bpp = palette2fmt[ztv->overinfo.format].bpp;
1925 ztv->overinfo.bpl = ztv->overinfo.bpp*ztv->swidth;
1926 ztv->overinfo.busadr = 0;
1927 ztv->overinfo.memadr = 0;
1928 ztv->overinfo.overlay = 0;
1929 for (i=0; i<ZORAN_MAX_FBUFFERS; i++) {
1930 ztv->grabinfo[i] = ztv->overinfo;
1931 ztv->grabinfo[i].kindof = FBUFFER_GRAB;
1933 init_waitqueue_head(&ztv->grabq);
1936 ztv->readinfo[0] = ztv->overinfo;
1937 ztv->readinfo[0].kindof = FBUFFER_VBI;
1938 ztv->readinfo[0].w = -864;
1939 ztv->readinfo[0].h = -38;
1940 ztv->readinfo[0].format = VIDEO_PALETTE_YUV422;
1941 ztv->readinfo[0].bpp = palette2fmt[ztv->readinfo[0].format].bpp;
1942 ztv->readinfo[0].bpl = 1024*ztv->readinfo[0].bpp;
1943 for (i=1; i<ZORAN_VBI_BUFFERS; i++)
1944 ztv->readinfo[i] = ztv->readinfo[0];
1945 init_waitqueue_head(&ztv->vbiq);
1947 /* maintenance data */
1948 ztv->have_decoder = 0;
1949 ztv->have_tuner = 0;
1950 ztv->tuner_type = 0;
1953 rwlock_init(&ztv->lock);
1956 ztv->lastfieldnr = 0;
1959 zrand(~ZORAN_VDC_TRICOM, ZORAN_VDC);
1961 /* external FL determines TOP frame */
1962 zror(ZORAN_VFEC_EXTFL, ZORAN_VFEC);
1965 if (ztv->card->hsync_pos)
1966 zrwrite(ZORAN_VFEH_HSPOL, ZORAN_VFEH);
1968 if (ztv->card->vsync_pos)
1969 zrwrite(ZORAN_VFEV_VSPOL, ZORAN_VFEV);
1971 /* Set the proper General Purpuse register bits */
1972 /* implicit: no softreset, 0 waitstates */
1973 zrwrite(ZORAN_PCI_SOFTRESET|(ztv->card->gpdir<<0),ZORAN_PCI);
1974 /* implicit: 3 duration and recovery PCI clocks on guest 0-3 */
1975 zrwrite(ztv->card->gpval<<24,ZORAN_GUEST);
1977 /* clear interrupt status */
1978 zrwrite(~0, ZORAN_ISR);
1983 ztv->i2c = zoran_i2c_bus_template;
1984 sprintf(ztv->i2c.name,"zoran-%d",card);
1985 ztv->i2c.data = ztv;
1988 * Now add the template and register the device unit
1990 ztv->video_dev = zr36120_template;
1991 strcpy(ztv->video_dev.name, ztv->i2c.name);
1992 ztv->video_dev.priv = ztv;
1993 if (video_register_device(&ztv->video_dev, VFL_TYPE_GRABBER, video_nr) < 0)
1996 ztv->vbi_dev = vbi_template;
1997 strcpy(ztv->vbi_dev.name, ztv->i2c.name);
1998 ztv->vbi_dev.priv = ztv;
1999 if (video_register_device(&ztv->vbi_dev, VFL_TYPE_VBI, vbi_nr) < 0) {
2000 video_unregister_device(&ztv->video_dev);
2003 i2c_register_bus(&ztv->i2c);
2005 /* set interrupt mask - the PIN enable will be set later */
2006 zrwrite(ZORAN_ICR_GIRQ0|ZORAN_ICR_GIRQ1|ZORAN_ICR_CODE, ZORAN_ICR);
2008 printk(KERN_INFO "%s: installed %s\n",ztv->i2c.name,ztv->card->name);
2013 void release_zoran(int max)
2018 for (i=0;i<max; i++)
2022 /* turn off all capturing, DMA and IRQs */
2023 /* reset the zoran */
2024 zrand(~ZORAN_PCI_SOFTRESET,ZORAN_PCI);
2026 zror(ZORAN_PCI_SOFTRESET,ZORAN_PCI);
2029 /* first disable interrupts before unmapping the memory! */
2030 zrwrite(0, ZORAN_ICR);
2031 zrwrite(0xffffffffUL,ZORAN_ISR);
2034 free_irq(ztv->dev->irq,ztv);
2036 /* unregister i2c_bus */
2037 i2c_unregister_bus((&ztv->i2c));
2039 /* unmap and free memory */
2041 iounmap(ztv->zoran_mem);
2043 video_unregister_device(&ztv->video_dev);
2044 video_unregister_device(&ztv->vbi_dev);
2048 void __exit zr36120_exit(void)
2050 release_zoran(zoran_cards);
2053 int __init zr36120_init(void)
2058 zoran_cards = find_zoran();
2060 /* no cards found, no need for a driver */
2063 /* initialize Zorans */
2064 for (card=0; card<zoran_cards; card++) {
2065 if (init_zoran(card)<0) {
2066 /* only release the zorans we have registered */
2067 release_zoran(card);
2074 module_init(zr36120_init);
2075 module_exit(zr36120_exit);