Deleted Added
full compact
1c1
< /* $FreeBSD: head/sys/dev/bktr/bktr_core.c 50548 1999-08-29 09:03:58Z bde $ */
---
> /* $Id: brooktree848.c,v 1.85 1999/06/12 14:54:54 roger Exp $ */
441a442,451
>
> 1.71 30 Aug 1999 Roger Hardiman <roger@freebsd.org>
> Small cleanup of OS dependant code. Remove NPCI usage.
> Fix bug in AVerMedia detection.
> Update VBI support for the AleVT Teletext package. Parts
> from Juha Nurmela's driver <Juha.Nurmela@quicknet.inet.fi>
> Add support for Hauppauge 627 and Temic 4006 submitted
> by Maurice Castro <maurice@atum.castro.aus.net>
> Tom Jansen <tom@unhooked.net> added BSDi support again.
>
447c457
< #include "pci.h"
---
> #include "opt_devfs.h"
456c466
< ( (defined(__FreeBSD__)) && (NBKTR > 0) && (NPCI > 0) ) \
---
> (defined(__FreeBSD__) && (NBKTR > 0)) \
468a479,481
> #include <sys/poll.h>
> #include <sys/select.h>
> #include <sys/vnode.h>
482c495
< #include "smbus.h"
---
> #include "smbus.h"
484c497
< #define NSMBUS 0
---
> #define NSMBUS 0
486a500,505
> #if (__FreeBSD_version < 400000)
> #ifdef DEVFS
> #include <sys/devfsext.h>
> #endif /* DEVFS */
> #endif
>
488c507
< #include <sys/bus.h> /* used by smbus and newbus */
---
> #include <sys/bus.h> /* used by smbus and newbus */
492,494c511,513
< #include <machine/bus.h> /* used by newbus */
< #include <sys/rman.h> /* used by newbus */
< #include <machine/resource.h> /* used by newbus */
---
> #include <machine/bus.h> /* used by newbus */
> #include <sys/rman.h> /* used by newbus */
> #include <machine/resource.h> /* used by newbus */
506,510c525,529
< #include <pci/bt848_i2c.h>
< #include <dev/smbus/smbconf.h>
< #include <dev/iicbus/iiconf.h>
< #include "smbus_if.h"
< #include "iicbus_if.h"
---
> #include <pci/bt848_i2c.h>
> #include <dev/smbus/smbconf.h>
> #include <dev/iicbus/iiconf.h>
> #include "smbus_if.h"
> #include "iicbus_if.h"
530,532c549,551
< typedef int ioctl_cmd_t;
< typedef unsigned int uintptr_t;
< #define PCIR_REVID PCI_CLASS_REG
---
> typedef int ioctl_cmd_t;
> typedef unsigned int uintptr_t;
> #define PCIR_REVID PCI_CLASS_REG
536a556,570
> /****************/
> /* *** BSDI *** */
> /****************/
> #ifdef __bsdi__
> #endif /* __bsdi__ */
>
>
> /**************************/
> /* *** OpenBSD/NetBSD *** */
> /**************************/
> #if defined(__NetBSD__) || defined(__OpenBSD__)
> #endif /* __NetBSD__ || __OpenBSD__ */
>
>
>
539a574
> #define VBIPRI (PZERO-4)|PCATCH
938c973
< /* PHILIPS_PAL */
---
> /* PHILIPS_PALI */
1217c1252
< static void probeCard( bktr_ptr_t bktr, int verbose );
---
> static void probeCard( bktr_ptr_t bktr, int verbose, int unit);
1296c1331
< static int vbi_read( bktr_ptr_t bktr, dev_t dev, struct uio *uio );
---
> static int vbi_read( bktr_ptr_t bktr, struct uio *uio, int ioflag );
1308c1343
< static void msp_read_id( bktr_ptr_t bktr );
---
> static void msp_read_id( bktr_ptr_t bktr, int unit );
1357c1392
< * the common attarch code, used by all OS versions.
---
> * the common attach code, used by all OS versions.
1372d1406
< bktr->dmat = pa->pa_dmat;
1377,1378c1411,1412
< bktr->vbidata = get_bktr_mem(bktr, &bktr->vbidata, VBI_DATA_SIZE);
< bktr->vbibuffer = get_bktr_mem(bktr, &bktr->vbibuffer, VBI_BUFFER_SIZE);
---
> bktr->vbidata = get_bktr_mem(bktr, &bktr->dm_vbidata, VBI_DATA_SIZE);
> bktr->vbibuffer = get_bktr_mem(bktr, &bktr->dm_vbibuffer, VBI_BUFFER_SIZE);
1465c1499
< probeCard( bktr, TRUE );
---
> probeCard( bktr, TRUE, unit );
1469c1503
< if (bktr->card.msp3400c)msp_read_id(bktr);
---
> if (bktr->card.msp3400c)msp_read_id(bktr, unit);
1481a1516
> unsigned int *seq_dest;
1489,1490d1523
<
< /* block copy the vbi data into the buffer */
1492a1526,1536
> /* Write the VBI sequence number to the end of the vbi data */
> /* This is used by the AleVT teletext program */
> seq_dest = (unsigned int *)((unsigned char *)bktr->vbibuffer + bktr->vbiinsert
> + (VBI_DATA_SIZE - sizeof(bktr->vbi_sequence_number)));
> *seq_dest = bktr->vbi_sequence_number;
>
> /* And increase the VBI sequence number */
> /* This can wrap around */
> bktr->vbi_sequence_number++;
>
>
1499a1544
>
1556a1602
> /* if there was one of the following errors re-start again */
1558,1560c1604,1606
< ((bktr_status &(BT848_INT_FBUS |
< BT848_INT_FTRGT |
< BT848_INT_FDSR |
---
> ((bktr_status &(/* BT848_INT_FBUS | */
> /* BT848_INT_FTRGT | */
> /* BT848_INT_FDSR | */
1562,1566c1608,1610
< BT848_INT_RIPERR |
< BT848_INT_PABORT |
< BT848_INT_OCERR |
< BT848_INT_SCERR) ) != 0) ||
< ((bt848->tdec == 0) && (bktr_status & TDEC_BITS)) ) {
---
> BT848_INT_RIPERR | BT848_INT_PABORT |
> BT848_INT_OCERR | BT848_INT_SCERR) ) != 0)
> || ((bt848->tdec == 0) && (bktr_status & TDEC_BITS)) ) {
1623a1668,1672
>
> /* Determine which field generated this interrupt */
> field = ( bktr_status & BT848_INT_FIELD ) ? EVEN_F : ODD_F;
>
>
1624a1674,1697
> * Process the VBI data if it is being captured. We do this once
> * both Odd and Even VBI data is captured. Therefore we do this
> * in the Even field interrupt handler.
> */
> if ((bktr->vbiflags & VBI_CAPTURE)&&(field==EVEN_F)) {
> /* Put VBI data into circular buffer */
> vbidecode(bktr);
>
> /* If someone is blocked on reading from /dev/vbi, wake them */
> if (bktr->vbi_read_blocked) {
> bktr->vbi_read_blocked = FALSE;
> wakeup(VBI_SLEEP);
> }
>
> /* If someone has a select() on /dev/vbi, inform them */
> if (bktr->vbi_select.si_pid) {
> selwakeup(&bktr->vbi_select);
> }
>
>
> }
>
>
> /*
1628d1700
< field = ( bktr_status & BT848_INT_FIELD ) ? EVEN_F : ODD_F;
1694,1700d1765
< /*
< * Process the VBI data if it is being captured
< */
< if (bktr->vbiflags & VBI_CAPTURE) {
< vbidecode(bktr);
< wakeup(VBI_SLEEP);
< }
1883a1949,1950
> bktr->vbi_sequence_number = 0;
> bktr->vbi_read_blocked = FALSE;
2043c2110
< vbi_read(bktr_ptr_t bktr, dev_t dev, struct uio *uio)
---
> vbi_read(bktr_ptr_t bktr, struct uio *uio, int ioflag)
2048,2049d2114
< if(bktr->vbisize == 0)
< status = tsleep(VBI_SLEEP, BKTRPRI, "vbi", 0);
2050a2116,2131
> while(bktr->vbisize == 0) {
> if (ioflag & IO_NDELAY) {
> return EWOULDBLOCK;
> }
>
> bktr->vbi_read_blocked = TRUE;
> if ((status = tsleep(VBI_SLEEP, VBIPRI, "vbi", 0))) {
> return status;
> }
> }
>
> /* Now we have some data to give to the user */
>
> /* We cannot read more bytes than there are in
> * the circular buffer
> */
2053d2133
< /* We cannot read more bytes than there are in the circular buffer */
2056c2136,2137
< /* Check if we can read this number of bytes without having to wrap around the circular buffer */
---
> /* Check if we can read this number of bytes without having
> * to wrap around the circular buffer */
2060,2063c2141,2144
< readsize2 = VBI_BUFFER_SIZE - bktr->vbistart;
< status = uiomove((caddr_t)bktr->vbibuffer + bktr->vbistart, readsize2, uio);
< status += uiomove((caddr_t)bktr->vbibuffer, (readsize - readsize2), uio);
< } else {
---
> readsize2 = VBI_BUFFER_SIZE - bktr->vbistart;
> status = uiomove((caddr_t)bktr->vbibuffer + bktr->vbistart, readsize2, uio);
> status += uiomove((caddr_t)bktr->vbibuffer, (readsize - readsize2), uio);
> } else {
2065,2066c2146,2147
< status = uiomove((caddr_t)bktr->vbibuffer + bktr->vbistart, readsize, uio);
< }
---
> status = uiomove((caddr_t)bktr->vbibuffer + bktr->vbistart, readsize, uio);
> }
2069c2150
< bktr->vbisize -= readsize;
---
> bktr->vbisize -= readsize;
2072c2153
< bktr->vbistart += readsize;
---
> bktr->vbistart += readsize;
2075c2156
< return( status );
---
> return( status );
2093c2174
< struct meteor_counts *cnt;
---
> struct meteor_counts *counts;
2256,2261c2337,2342
< cnt = (struct meteor_counts *) arg;
< bktr->fifo_errors = cnt->fifo_errors;
< bktr->dma_errors = cnt->dma_errors;
< bktr->frames_captured = cnt->frames_captured;
< bktr->even_fields_captured = cnt->even_fields_captured;
< bktr->odd_fields_captured = cnt->odd_fields_captured;
---
> counts = (struct meteor_counts *) arg;
> bktr->fifo_errors = counts->fifo_errors;
> bktr->dma_errors = counts->dma_errors;
> bktr->frames_captured = counts->frames_captured;
> bktr->even_fields_captured = counts->even_fields_captured;
> bktr->odd_fields_captured = counts->odd_fields_captured;
2265,2270c2346,2351
< cnt = (struct meteor_counts *) arg;
< cnt->fifo_errors = bktr->fifo_errors;
< cnt->dma_errors = bktr->dma_errors;
< cnt->frames_captured = bktr->frames_captured;
< cnt->even_fields_captured = bktr->even_fields_captured;
< cnt->odd_fields_captured = bktr->odd_fields_captured;
---
> counts = (struct meteor_counts *) arg;
> counts->fifo_errors = bktr->fifo_errors;
> counts->dma_errors = bktr->dma_errors;
> counts->frames_captured = bktr->frames_captured;
> counts->even_fields_captured = bktr->even_fields_captured;
> counts->odd_fields_captured = bktr->odd_fields_captured;
3484a3566
> vm_offset_t loop_point;
3537a3620,3624
> /* Wait for the VRE sync marking the end of the Even and
> * the start of the Odd field. Resync here.
> */
> *dma_prog++ = OP_SYNC | BKTR_RESYNC |BKTR_VRE;
> *dma_prog++ = 0;
3538a3626,3627
> loop_point = dma_prog;
>
3541c3630
< *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1;
---
> *dma_prog++ = OP_SYNC | BKTR_FM1;
3549,3563c3638,3646
< /* store the video image */
< /* look for sync with packed data */
< *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1;
< *dma_prog++ = 0; /* NULL WORD */
< width = cols;
< for (i = 0; i < (rows/interlace); i++) {
< target = target_buffer;
< if ( notclipped(bktr, i, width)) {
< split(bktr, (volatile u_long **) &dma_prog,
< bktr->y2 - bktr->y, OP_WRITE,
< Bpp, (volatile u_char **) &target, cols);
<
< } else {
< while(getline(bktr, i)) {
< if (bktr->y != bktr->y2 ) {
---
> if ( (i_flag == 2/*Odd*/) || (i_flag==3) /*interlaced*/ ) {
> /* store the Odd field video image */
> /* look for sync with packed data */
> *dma_prog++ = OP_SYNC | BKTR_FM1;
> *dma_prog++ = 0; /* NULL WORD */
> width = cols;
> for (i = 0; i < (rows/interlace); i++) {
> target = target_buffer;
> if ( notclipped(bktr, i, width)) {
3566,3571d3648
< Bpp, (volatile u_char **) &target, cols);
< }
< if (bktr->yclip != bktr->yclip2 ) {
< split(bktr,(volatile u_long **) &dma_prog,
< bktr->yclip2 - bktr->yclip,
< OP_SKIP,
3572a3650,3665
>
> } else {
> while(getline(bktr, i)) {
> if (bktr->y != bktr->y2 ) {
> split(bktr, (volatile u_long **) &dma_prog,
> bktr->y2 - bktr->y, OP_WRITE,
> Bpp, (volatile u_char **) &target, cols);
> }
> if (bktr->yclip != bktr->yclip2 ) {
> split(bktr,(volatile u_long **) &dma_prog,
> bktr->yclip2 - bktr->yclip,
> OP_SKIP,
> Bpp, (volatile u_char **) &target, cols);
> }
> }
>
3573a3667,3669
>
> target_buffer += interlace * pitch;
>
3576c3672
< }
---
> } /* end if */
3578c3674,3677
< target_buffer += interlace * pitch;
---
> /* Grab the Even field */
> /* Look for the VRO, end of Odd field, marker */
> *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO;
> *dma_prog++ = 0; /* NULL WORD */
3579a3679,3686
> /* store the VBI data */
> /* look for sync with packed data */
> *dma_prog++ = OP_SYNC | BKTR_FM1;
> *dma_prog++ = 0;
> for(i = 0; i < vbilines; i++) {
> *dma_prog++ = OP_WRITE | OP_SOL | OP_EOL | vbisamples;
> *dma_prog++ = (u_long) vtophys(bktr->vbidata +
> ((i+MAX_VBI_LINES) * VBI_LINE_SIZE));
3582,3589c3689,3693
< switch (i_flag) {
< case 1:
< /* EVEN field grabs. Look for end of 'Even Field' Marker
< * We cannot look for VRO, because we have not enabled ODD
< * field capture
< */
< *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRE;
< *dma_prog++ = 0; /* NULL WORD */
---
> /* store the video image */
> if (i_flag == 1) /*Even Only*/
> target_buffer = buffer;
> if (i_flag == 3) /*interlaced*/
> target_buffer = buffer+pitch;
3591,3593d3694
< *dma_prog++ = OP_JUMP;
< *dma_prog++ = (u_long ) vtophys(bktr->dma_prog);
< return;
3595,3627c3696
< case 2:
< /* ODD field grabs. Look for end of 'Odd Field' Marker
< * We cannot look for VRE, because we have not enabled EVEN
< * field capture
< */
< *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO;
< *dma_prog++ = 0; /* NULL WORD */
<
< *dma_prog++ = OP_JUMP;
< *dma_prog++ = (u_long ) vtophys(bktr->dma_prog);
< return;
<
< case 3:
< /* INTERLACED grabs (ODD then EVEN). We have read the old field
< * so look for the end of 'Odd Field' Marker.
< * Then jump to the 'odd_dma_prog' which actually captures
< * the EVEN field!
< */
< *dma_prog++ = OP_SYNC | BKTR_GEN_IRQ | BKTR_RESYNC | BKTR_VRO;
< *dma_prog++ = 0; /* NULL WORD */
<
< *dma_prog++ = OP_JUMP;
< *dma_prog = (u_long ) vtophys(bktr->odd_dma_prog);
< break;
< }
<
< if (interlace == 2) {
<
< target_buffer = buffer + pitch;
<
< dma_prog = (u_long *) bktr->odd_dma_prog;
<
< /* store the VBI data */
---
> if ((i_flag == 1) /*Even Only*/ || (i_flag==3) /*interlaced*/) {
3629,3639c3698
< *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1;
< *dma_prog++ = 0;
< for(i = 0; i < vbilines; i++) {
< *dma_prog++ = OP_WRITE | OP_SOL | OP_EOL | vbisamples;
< *dma_prog++ = (u_long) vtophys(bktr->vbidata +
< ((i+MAX_VBI_LINES) * VBI_LINE_SIZE));
< }
<
< /* store the video image */
< /* look for sync with packed data */
< *dma_prog++ = OP_SYNC | BKTR_RESYNC | BKTR_FM1;
---
> *dma_prog++ = OP_SYNC | BKTR_FM1;
3676c3735
< *dma_prog++ = (u_long ) vtophys(bktr->dma_prog) ;
---
> *dma_prog++ = (u_long ) vtophys(loop_point) ;
4365a4425,4426
> bktr->bktr_cap_ctl |=
> BT848_CAP_CTL_VBI_EVEN | BT848_CAP_CTL_VBI_ODD;
5251c5312
< #define VENDOR_AVER_MEDIA 0x1431
---
> #define VENDOR_AVER_MEDIA 0x1461
5257c5318
< probeCard( bktr_ptr_t bktr, int verbose )
---
> probeCard( bktr_ptr_t bktr, int verbose, int unit )
5570c5631
< 1d Temic 4006FH5 BG
---
> 1d Temic 4006FH5 BG PHILIPS_PALI clone
5588c5649,5650
< printf("Hauppauge Model %d %c%c%c%c\n",
---
> printf("bktr%d: Hauppauge Model %d %c%c%c%c\n",
> unit,
5612a5675
> case 0x1d:
6680c6743
< static void msp_read_id( bktr_ptr_t bktr ){
---
> static void msp_read_id( bktr_ptr_t bktr, int unit ){
6688c6751
< printf("Detected a MSP%s\n",bktr->msp_version_string);
---
> printf("bktr%d: Detected a MSP%s\n",unit,bktr->msp_version_string);
6762a6826
> static d_poll_t bktr_poll;
6774c6838
< /* poll */ nopoll,
---
> /* poll */ bktr_poll,
7079c7143
< probeCard(bktr, FALSE);
---
> probeCard(bktr, FALSE, unit);
7089c7153
< probeCard(bktr, FALSE);
---
> probeCard(bktr, FALSE, unit);
7185c7249
< return( vbi_read( bktr, dev, uio ) );
---
> return( vbi_read( bktr, uio, ioflag ) );
7266,7300c7330
< #endif /* FreeBSD 4.x specific kernel interface routines */
<
<
< /**********************************/
< /* *** FreeBSD 2.2.x and 3.x *** */
< /**********************************/
<
< #if ((__FreeBSD__ == 2) || (__FreeBSD__ == 3))
<
< static bktr_reg_t brooktree[ NBKTR ];
<
< static const char* bktr_probe( pcici_t tag, pcidi_t type );
< static void bktr_attach( pcici_t tag, int unit );
< static void bktr_intr(void *arg) { common_bktr_intr(arg); }
<
< static u_long bktr_count;
<
< static struct pci_device bktr_device = {
< "bktr",
< bktr_probe,
< bktr_attach,
< &bktr_count
< };
<
< DATA_SET (pcidevice_set, bktr_device);
<
< static d_open_t bktr_open;
< static d_close_t bktr_close;
< static d_read_t bktr_read;
< static d_write_t bktr_write;
< static d_ioctl_t bktr_ioctl;
< static d_mmap_t bktr_mmap;
<
< #define CDEV_MAJOR 92
< static struct cdevsw bktr_cdevsw =
---
> int bktr_poll( dev_t dev, int events, struct proc *p)
7302,7514d7331
< bktr_open, bktr_close, bktr_read, bktr_write,
< bktr_ioctl, nostop, nullreset, nodevtotty,
< seltrue, bktr_mmap, NULL, "bktr",
< NULL, -1
< };
<
< static int bktr_devsw_installed;
<
< static void
< bktr_drvinit( void *unused )
< {
< dev_t dev;
<
< if ( ! bktr_devsw_installed ) {
< dev = makedev(CDEV_MAJOR, 0);
< cdevsw_add(&dev,&bktr_cdevsw, NULL);
< bktr_devsw_installed = 1;
< }
< }
<
< SYSINIT(bktrdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bktr_drvinit,NULL)
<
< /*
< * the boot time probe routine.
< */
< static const char*
< bktr_probe( pcici_t tag, pcidi_t type )
< {
< unsigned int rev = pci_conf_read( tag, PCIR_REVID) & 0x000000ff;
<
< switch (type) {
< case BROOKTREE_848_PCI_ID:
< if (rev == 0x12) return("BrookTree 848A");
< else return("BrookTree 848");
< case BROOKTREE_849_PCI_ID:
< return("BrookTree 849A");
< case BROOKTREE_878_PCI_ID:
< return("BrookTree 878");
< case BROOKTREE_879_PCI_ID:
< return("BrookTree 879");
< };
<
< return ((char *)0);
< }
<
< /*
< * the attach routine.
< */
< static void
< bktr_attach( pcici_t tag, int unit )
< {
< bktr_ptr_t bktr;
< bt848_ptr_t bt848;
< u_long latency;
< u_long fun;
< unsigned int rev;
< #ifdef BROOKTREE_IRQ
< u_long old_irq, new_irq;
< #endif
<
< bktr = &brooktree[unit];
<
< if (unit >= NBKTR) {
< printf("brooktree%d: attach: only %d units configured.\n",
< unit, NBKTR);
< printf("brooktree%d: attach: invalid unit number.\n", unit);
< return;
< }
<
< /* Enable Memory Mapping */
< fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
< pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 2);
<
< /* Enable Bus Mastering */
< fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
< pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 4);
<
< bktr->tag = tag;
<
<
< /*
< * Map control/status registers
< */
< pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base,
< &bktr->phys_base );
<
< /*
< * Disable the brooktree device
< */
< bt848 = bktr->base;
< bt848->int_mask = ALL_INTS_DISABLED;
< bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
<
< #ifdef BROOKTREE_IRQ /* from the configuration file */
< old_irq = pci_conf_read(tag, PCI_INTERRUPT_REG);
< pci_conf_write(tag, PCI_INTERRUPT_REG, BROOKTREE_IRQ);
< new_irq = pci_conf_read(tag, PCI_INTERRUPT_REG);
< printf("bktr%d: attach: irq changed from %d to %d\n",
< unit, (old_irq & 0xff), (new_irq & 0xff));
< #endif
<
< /*
< * setup the interrupt handling routine
< */
< pci_map_int(tag, bktr_intr, (void*) bktr, &net_imask);
<
<
< /* Update the Device Control Register */
< /* on Bt878 and Bt879 cards */
< fun = pci_conf_read(tag, 0x40);
< fun = fun | 1; /* Enable writes to the sub-system vendor ID */
<
< #if defined( BKTR_430_FX_MODE )
< if (bootverbose) printf("Using 430 FX chipset compatibilty mode\n");
< fun = fun | 2; /* Enable Intel 430 FX compatibility mode */
< #endif
<
< #if defined( BKTR_SIS_VIA_MODE )
< if (bootverbose) printf("Using SiS/VIA chipset compatibilty mode\n");
< fun = fun | 4; /* Enable SiS/VIA compatibility mode (usefull for
< OPTi chipset motherboards too */
< #endif
< pci_conf_write(tag, 0x40, fun);
<
<
< /* XXX call bt848_i2c dependent attach() routine */
< #if (NSMBUS > 0)
< if (bt848_i2c_attach(unit, bktr->base, &bktr->i2c_sc))
< printf("bktr%d: i2c_attach: can't attach\n", unit);
< #endif
<
<
< /*
< * PCI latency timer. 32 is a good value for 4 bus mastering slots, if
< * you have more than four, then 16 would probably be a better value.
< */
< #ifndef BROOKTREE_DEF_LATENCY_VALUE
< #define BROOKTREE_DEF_LATENCY_VALUE 10
< #endif
< latency = pci_conf_read(tag, PCI_LATENCY_TIMER);
< latency = (latency >> 8) & 0xff;
< if ( bootverbose ) {
< if (latency)
< printf("brooktree%d: PCI bus latency is", unit);
< else
< printf("brooktree%d: PCI bus latency was 0 changing to",
< unit);
< }
< if ( !latency ) {
< latency = BROOKTREE_DEF_LATENCY_VALUE;
< pci_conf_write(tag, PCI_LATENCY_TIMER, latency<<8);
< }
< if ( bootverbose ) {
< printf(" %d.\n", (int) latency);
< }
<
<
< /* read the pci device id and revision id */
< fun = pci_conf_read(tag, PCI_ID_REG);
< rev = pci_conf_read(tag, PCIR_REVID) & 0x000000ff;
<
< /* call the common attach code */
< common_bktr_attach( bktr, unit, fun, rev );
<
< make_dev(&bktr_cdevsw, unit, 0, 0, 0444, "bktr%d", unit);
< make_dev(&bktr_cdevsw, unit+16, 0, 0, 0444, "tuner%d", unit);
< make_dev(&bktr_cdevsw, unit+32, 0, 0, 0444, "vbi%d", unit);
<
< }
<
<
< /*
< * Special Memory Allocation
< */
< static vm_offset_t
< get_bktr_mem( int unit, unsigned size )
< {
< vm_offset_t addr = 0;
<
< addr = vm_page_alloc_contig(size, 0, 0xffffffff, 1<<24);
< if (addr == 0)
< addr = vm_page_alloc_contig(size, 0, 0xffffffff, PAGE_SIZE);
< if (addr == 0) {
< printf("bktr%d: Unable to allocate %d bytes of memory.\n",
< unit, size);
< }
<
< return( addr );
< }
<
< /*---------------------------------------------------------
< **
< ** BrookTree 848 character device driver routines
< **
< **---------------------------------------------------------
< */
<
<
< #define VIDEO_DEV 0x00
< #define TUNER_DEV 0x01
< #define VBI_DEV 0x02
<
< #define UNIT(x) ((x) & 0x0f)
< #define FUNCTION(x) ((x >> 4) & 0x0f)
<
<
< /*
< *
< */
< int
< bktr_open( dev_t dev, int flags, int fmt, struct proc *p )
< {
< bktr_ptr_t bktr;
7516,7573d7332
<
< unit = UNIT( minor(dev) );
< if (unit >= NBKTR) /* unit out of range */
< return( ENXIO );
<
< bktr = &(brooktree[ unit ]);
<
< if (!(bktr->flags & METEOR_INITALIZED)) /* device not found */
< return( ENXIO );
<
<
< if (bt848_card != -1) {
< if ((bt848_card >> 8 == unit ) &&
< ( (bt848_card & 0xff) < Bt848_MAX_CARD )) {
< if ( bktr->bt848_card != (bt848_card & 0xff) ) {
< bktr->bt848_card = (bt848_card & 0xff);
< probeCard(bktr, FALSE);
< }
< }
< }
<
< if (bt848_tuner != -1) {
< if ((bt848_tuner >> 8 == unit ) &&
< ( (bt848_tuner & 0xff) < Bt848_MAX_TUNER )) {
< if ( bktr->bt848_tuner != (bt848_tuner & 0xff) ) {
< bktr->bt848_tuner = (bt848_tuner & 0xff);
< probeCard(bktr, FALSE);
< }
< }
< }
<
< if (bt848_reverse_mute != -1) {
< if (((bt848_reverse_mute >> 8) == unit ) &&
< ((bt848_reverse_mute & 0xff) < Bt848_MAX_TUNER) ) {
< bktr->reverse_mute = bt848_reverse_mute & 0xff;
< bt848_reverse_mute = -1;
< }
< }
<
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< return( video_open( bktr ) );
< case TUNER_DEV:
< return( tuner_open( bktr ) );
< case VBI_DEV:
< return( vbi_open( bktr ) );
< }
< return( ENXIO );
< }
<
<
< /*
< *
< */
< int
< bktr_close( dev_t dev, int flags, int fmt, struct proc *p )
< {
7575c7334
< int unit;
---
> int revents = 0;
7577,7579c7336
< unit = UNIT( minor(dev) );
< if (unit >= NBKTR) /* unit out of range */
< return( ENXIO );
---
> unit = UNIT(minor(dev));
7581,7589c7338,7342
< bktr = &(brooktree[ unit ]);
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< return( video_close( bktr ) );
< case TUNER_DEV:
< return( tuner_close( bktr ) );
< case VBI_DEV:
< return( vbi_close( bktr ) );
---
> /* Get the device data */
> bktr = (struct bktr_softc*)devclass_get_softc(bktr_devclass, unit);
> if (bktr == NULL) {
> /* the device is no longer valid/functioning */
> return (ENXIO);
7592,7593c7345
< return( ENXIO );
< }
---
> disable_intr();
7595,7606c7347
< /*
< *
< */
< int
< bktr_read( dev_t dev, struct uio *uio, int ioflag )
< {
< bktr_ptr_t bktr;
< int unit;
<
< unit = UNIT(minor(dev));
< if (unit >= NBKTR) /* unit out of range */
< return( ENXIO );
---
> if (events & (POLLIN | POLLRDNORM)) {
7608,7614c7349,7356
< bktr = &(brooktree[unit]);
<
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< return( video_read( bktr, unit, dev, uio ) );
< case VBI_DEV:
< return( vbi_read( bktr, dev, uio ) );
---
> switch ( FUNCTION( minor(dev) ) ) {
> case VBI_DEV:
> if(bktr->vbisize == 0)
> selrecord(p, &bktr->vbi_select);
> else
> revents |= events & (POLLIN | POLLRDNORM);
> break;
> }
7616,7617d7357
< return( ENXIO );
< }
7618a7359
> enable_intr();
7620,7626c7361
< /*
< *
< */
< int
< bktr_write( dev_t dev, struct uio *uio, int ioflag )
< {
< return( EINVAL ); /* XXX or ENXIO ? */
---
> return (revents);
7629,7636c7364
< /*
< *
< */
< int
< bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct proc* pr )
< {
< bktr_ptr_t bktr;
< int unit;
---
> #endif /* FreeBSD 4.x specific kernel interface routines */
7638,7640d7365
< unit = UNIT(minor(dev));
< if (unit >= NBKTR) /* unit out of range */
< return( ENXIO );
7642c7367,7369
< bktr = &(brooktree[ unit ]);
---
> /**********************************/
> /* *** FreeBSD 2.2.x and 3.x *** */
> /**********************************/
7644,7645c7371,7372
< if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */
< return( ENOMEM );
---
> #if ((__FreeBSD__ == 2) || (__FreeBSD__ == 3))
> #endif /* FreeBSD 2.2.x and 3.x specific kernel interface routines */
7647,7652d7373
< switch ( FUNCTION( minor(dev) ) ) {
< case VIDEO_DEV:
< return( video_ioctl( bktr, unit, cmd, arg, pr ) );
< case TUNER_DEV:
< return( tuner_ioctl( bktr, unit, cmd, arg, pr ) );
< }
7654,7655c7375,7377
< return( ENXIO );
< }
---
> /*****************/
> /* *** BSDI *** */
> /*****************/
7657,7662c7379,7380
< /*
< * bktr_mmap.
< * Note: 2.2.5/2.2.6/2.2.7/3.0 users must manually
< * edit the following line and change "vm_offset_t" to "int""
< */
< int bktr_mmap( dev_t dev, vm_offset_t offset, int nprot )
---
> #if defined(__bsdi__)
> #endif /* __bsdi__ BSDI specific kernel interface routines */
7664,7666d7381
< {
< int unit;
< bktr_ptr_t bktr;
7668c7383,7387
< unit = UNIT(minor(dev));
---
> /*****************************/
> /* *** OpenBSD / NetBSD *** */
> /*****************************/
> #if defined(__NetBSD__) || defined(__OpenBSD__)
> #endif /* __NetBSD__ || __OpenBSD__ */
7670,7671d7388
< if (unit >= NBKTR || FUNCTION(minor(dev)) > 0)
< return( -1 );
7673d7389
< bktr = &(brooktree[ unit ]);
7675,7676c7391
< if (nprot & PROT_EXEC)
< return( -1 );
---
> #endif /* FreeBSD, BSDI, NetBSD, OpenBSD */
7678,7679d7392
< if (offset < 0)
< return( -1 );
7681,7692d7393
< if (offset >= bktr->alloc_pages * PAGE_SIZE)
< return( -1 );
<
< return( i386_btop(vtophys(bktr->bigbuf) + offset) );
< }
<
< #endif /* FreeBSD 2.2.x and 3.x specific kernel interface routines */
<
<
<
< #endif /* !defined(__FreeBSD__) || (NBKTR > 0 && NPCI > 0) */
<