Update to driver 2.17

Fixes bugs in devfs when unloading and reloading
Syncs with NetBSD changes

Submitted by:	Alexander Langer <alex@big.endian.de>
Submitted by:	Thomas Klausner <wiz@netbsd.org>
Submitted by:	Daniel O'Connor" <doconnor@gsoft.com.au>
This commit is contained in:
roger 2000-10-19 07:33:28 +00:00
parent b40382e95c
commit 6a567bac48
8 changed files with 202 additions and 77 deletions

View File

@ -502,3 +502,11 @@
Alexander Langer <alex@cichlids.com> fixed some FreeBSD newbus
resource allocation problems (FreeBSD PR kern/18744).
2.16 19 Sep 2000 Merge in NetBSD changes from Thomas Klausner <wiz@netbsd.org>
2.17 3 Oct 2000 Alexander Langer <alex@big.endian.de> and
someone else
both submitted fixes to devfs code.
Fix PHK's commit so we only include machine/clock.h in
FreeBSD 2.x, 3.x and 4.x systems

View File

@ -52,6 +52,11 @@
#include <sys/vnode.h>
#ifdef __FreeBSD__
#if (__FreeBSD_version < 500000)
#include <machine/clock.h> /* for DELAY */
#endif
#include <pci/pcivar.h>
#if (__FreeBSD_version >=300000)

View File

@ -54,6 +54,11 @@
#include <sys/vnode.h>
#ifdef __FreeBSD__
#if (__FreeBSD_version < 500000)
#include <machine/clock.h> /* for DELAY */
#endif
#include <pci/pcivar.h>
#if (__FreeBSD_version >=300000)
@ -80,6 +85,12 @@
#include <dev/bktr/bktr_audio.h>
#endif
/* Include the PCI Vendor definitions */
#ifdef __NetBSD__
#include <dev/pci/pcidevs.h>
#include <dev/pci/pcireg.h>
#endif
/* Various defines */
#define HAUP_REMOTE_INT_WADDR 0x30
#define HAUP_REMOTE_INT_RADDR 0x31
@ -139,7 +150,7 @@ static const struct CARDTYPE cards[] = {
0 }, /* GPIO mask */
{ CARD_MIRO, /* the card id */
"Miro TV", /* the 'name' */
"Pinnacle/Miro TV", /* the 'name' */
NULL, /* the tuner */
0, /* the tuner i2c address */
0, /* dbx unknown */
@ -354,7 +365,7 @@ writeEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data )
/*
* Read the contents of the configuration EEPROM on the card.
* (This is not fitted to all makes of card. All Hauppuage cards have them
* (This is not fitted to all makes of card. All Hauppauge cards have them
* and so do newer Bt878 based cards.
*/
int
@ -517,13 +528,18 @@ static int locate_eeprom_address( bktr_ptr_t bktr) {
* configuration EEPROM used on Bt878/879 cards. They should match the
* number assigned to the company by the PCI Special Interest Group
*/
#define VENDOR_AVER_MEDIA 0x1461
#define VENDOR_HAUPPAUGE 0x0070
#define VENDOR_FLYVIDEO 0x1851
#define VENDOR_FLYVIDEO_2 0x1852
#define VENDOR_STB 0x10B4
#define VENDOR_ASKEY_COMP 0x144F
#define VENDOR_LEADTEK 0x6606
#ifndef __NetBSD__
#define PCI_VENDOR_HAUPPAUGE 0x0070
#define PCI_VENDOR_AVERMEDIA 0x1461
#define PCI_VENDOR_STB 0x10B4
#define PCI_VENDOR_ASKEY 0x144F
#endif
/* Following not confirmed with http://members.hyperlink.net.au/~chart,
so not added to NetBSD's pcidevs */
#define PCI_VENDOR_LEADTEK_ALT 0x6606
#define PCI_VENDOR_FLYVIDEO 0x1851
#define PCI_VENDOR_FLYVIDEO_2 0x1852
#define PCI_VENDOR_PINNACLE_ALT 0xBD11
void
@ -609,49 +625,56 @@ probeCard( bktr_ptr_t bktr, int verbose, int unit )
printf("%s: subsystem 0x%04x 0x%04x\n", bktr_name(bktr),
subsystem_vendor_id, subsystem_id);
if (subsystem_vendor_id == VENDOR_AVER_MEDIA) {
if (subsystem_vendor_id == PCI_VENDOR_AVERMEDIA) {
bktr->card = cards[ (card = CARD_AVER_MEDIA) ];
bktr->card.eepromAddr = eeprom_i2c_address;
bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
goto checkTuner;
}
if (subsystem_vendor_id == VENDOR_HAUPPAUGE) {
if (subsystem_vendor_id == PCI_VENDOR_HAUPPAUGE) {
bktr->card = cards[ (card = CARD_HAUPPAUGE) ];
bktr->card.eepromAddr = eeprom_i2c_address;
bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
goto checkTuner;
}
if ((subsystem_vendor_id == VENDOR_FLYVIDEO)
|| (subsystem_vendor_id == VENDOR_FLYVIDEO_2) ) {
if ((subsystem_vendor_id == PCI_VENDOR_FLYVIDEO)
|| (subsystem_vendor_id == PCI_VENDOR_FLYVIDEO_2) ) {
bktr->card = cards[ (card = CARD_FLYVIDEO) ];
bktr->card.eepromAddr = eeprom_i2c_address;
bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
goto checkTuner;
}
if (subsystem_vendor_id == VENDOR_STB) {
if (subsystem_vendor_id == PCI_VENDOR_STB) {
bktr->card = cards[ (card = CARD_STB) ];
bktr->card.eepromAddr = eeprom_i2c_address;
bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
goto checkTuner;
}
if (subsystem_vendor_id == VENDOR_ASKEY_COMP) {
if (subsystem_vendor_id == PCI_VENDOR_ASKEY) {
bktr->card = cards[ (card = CARD_ASKEY_DYNALINK_MAGIC_TVIEW) ];
bktr->card.eepromAddr = eeprom_i2c_address;
bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
goto checkTuner;
}
if (subsystem_vendor_id == VENDOR_LEADTEK) {
if (subsystem_vendor_id == PCI_VENDOR_LEADTEK_ALT) {
bktr->card = cards[ (card = CARD_LEADTEK) ];
bktr->card.eepromAddr = eeprom_i2c_address;
bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
goto checkTuner;
}
if (subsystem_vendor_id == PCI_VENDOR_PINNACLE_ALT) {
bktr->card = cards[ (card = CARD_MIRO) ];
bktr->card.eepromAddr = eeprom_i2c_address;
bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
goto checkTuner;
}
/* Vendor is unknown. We will use the standard probe code */
/* which may not give best results */
printf("%s: Warning - card vendor 0x%04x (model 0x%04x) unknown.\n",

View File

@ -128,6 +128,10 @@
#include <sys/bus.h> /* used by smbus and newbus */
#endif
#if (__FreeBSD_version < 500000)
#include <machine/clock.h> /* for DELAY */
#endif
#include <pci/pcivar.h>
#if (__FreeBSD_version >=300000)
@ -564,20 +568,25 @@ bktr_store_address(unit, BKTR_MEM_BUF, buf);
/* using the pci device id and revision id */
/* and determine the card type */
switch (pci_id) {
case BROOKTREE_848_PCI_ID:
if (rev == 0x12) bktr->id = BROOKTREE_848A;
else bktr->id = BROOKTREE_848;
break;
case BROOKTREE_849_PCI_ID:
bktr->id = BROOKTREE_849A;
break;
case BROOKTREE_878_PCI_ID:
bktr->id = BROOKTREE_878;
break;
case BROOKTREE_879_PCI_ID:
bktr->id = BROOKTREE_879;
break;
if (PCI_VENDOR(pci_id) == PCI_VENDOR_BROOKTREE)
{
switch (PCI_PRODUCT(pci_id)) {
case PCI_PRODUCT_BROOKTREE_BT848:
if (rev == 0x12)
bktr->id = BROOKTREE_848A;
else
bktr->id = BROOKTREE_848;
break;
case PCI_PRODUCT_BROOKTREE_BT849:
bktr->id = BROOKTREE_849A;
break;
case PCI_PRODUCT_BROOKTREE_BT878:
bktr->id = BROOKTREE_878;
break;
case PCI_PRODUCT_BROOKTREE_BT879:
bktr->id = BROOKTREE_879;
break;
}
};
bktr->clr_on_start = FALSE;

View File

@ -43,6 +43,9 @@
#include <sys/uio.h>
#include <sys/select.h>
#if (__FreeBSD_version < 500000)
#include <machine/clock.h> /* for DELAY */
#endif
#if (__FreeBSD_version >=300000)
#include <machine/bus_memio.h> /* for bus space */

View File

@ -94,6 +94,9 @@
#include <machine/resource.h> /* used by newbus */
#endif
#if (__FreeBSD_version < 500000)
#include <machine/clock.h> /* for DELAY */
#endif
#include <pci/pcivar.h>
#include <pci/pcireg.h>
@ -246,8 +249,10 @@ static struct cdevsw bktr_cdevsw = {
};
DRIVER_MODULE(bktr, pci, bktr_driver, bktr_devclass, 0, 0);
#if (__FreeBSD_version > 410000)
MODULE_DEPEND(bktr, bktr_mem, 1,1,1);
MODULE_VERSION(bktr, 1);
#endif
/*
@ -259,20 +264,25 @@ bktr_probe( device_t dev )
unsigned int type = pci_get_devid(dev);
unsigned int rev = pci_get_revid(dev);
switch (type) {
case BROOKTREE_848_PCI_ID:
if (rev == 0x12) device_set_desc(dev, "BrookTree 848A");
else device_set_desc(dev, "BrookTree 848");
return 0;
case BROOKTREE_849_PCI_ID:
device_set_desc(dev, "BrookTree 849A");
return 0;
case BROOKTREE_878_PCI_ID:
device_set_desc(dev, "BrookTree 878");
return 0;
case BROOKTREE_879_PCI_ID:
device_set_desc(dev, "BrookTree 879");
return 0;
if (PCI_VENDOR(type) == PCI_VENDOR_BROOKTREE)
{
switch (PCI_PRODUCT(type)) {
case PCI_PRODUCT_BROOKTREE_BT848:
if (rev == 0x12)
device_set_desc(dev, "BrookTree 848A");
else
device_set_desc(dev, "BrookTree 848");
return 0;
case PCI_PRODUCT_BROOKTREE_BT849:
device_set_desc(dev, "BrookTree 849A");
return 0;
case PCI_PRODUCT_BROOKTREE_BT878:
device_set_desc(dev, "BrookTree 878");
return 0;
case PCI_PRODUCT_BROOKTREE_BT879:
device_set_desc(dev, "BrookTree 879");
return 0;
}
};
return ENXIO;
@ -418,9 +428,24 @@ bktr_attach( device_t dev )
/* 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);
/* make the device entries */
bktr->bktrdev = make_dev(&bktr_cdevsw, unit,
0, 0, 0444, "bktr%d", unit);
bktr->tunerdev= make_dev(&bktr_cdevsw, unit+16,
0, 0, 0444, "tuner%d", unit);
bktr->vbidev = make_dev(&bktr_cdevsw, unit+32,
0, 0, 0444, "vbi%d" , unit);
/* if this is unit 0 (/dev/bktr0, /dev/tuner0, /dev/vbi0) then make */
/* alias entries to /dev/bktr /dev/tuner and /dev/vbi */
#if (__FreeBSD_version >=500000)
if (unit == 0) {
bktr->bktrdev_alias = make_dev_alias(bktr->bktrdev, "bktr");
bktr->tunerdev_alias= make_dev_alias(bktr->tunerdev, "tuner");
bktr->vbidev_alias = make_dev_alias(bktr->vbidev, "vbi");
}
#endif
return 0;
@ -445,7 +470,23 @@ bktr_detach( device_t dev )
OUTL(bktr, BKTR_INT_MASK, ALL_INTS_DISABLED);
OUTW(bktr, BKTR_GPIO_DMA_CTL, FIFO_RISC_DISABLED);
/* FIXME - Free memory for RISC programs, grab buffer, vbi buffers */
/* Note: We do not free memory for RISC programs, grab buffer, vbi buffers */
/* The memory is retained by the bktr_mem module so we can unload and */
/* then reload the main bktr driver module */
/* Unregister the /dev/bktrN, tunerN and vbiN devices */
destroy_dev(bktr->vbidev);
destroy_dev(bktr->tunerdev);
destroy_dev(bktr->bktrdev);
/* If this is unit 0, then destroy the alias entries too */
#if (__FreeBSD_version >=500000)
if (unit == 0) {
destroy_dev(bktr->vbidev_alias);
destroy_dev(bktr->tunerdev_alias);
destroy_dev(bktr->bktrdev_alias);
}
#endif
/*
* Deallocate resources.
@ -829,17 +870,20 @@ 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");
if (PCI_VENDOR(type) == PCI_VENDOR_BROOKTREE)
{
switch (PCI_PRODUCT(type)) {
case PCI_PRODUCT_BROOKTREE_BT848:
if (rev == 0x12) return("BrookTree 848A");
else return("BrookTree 848");
case PCI_PRODUCT_BROOKTREE_BT849:
return("BrookTree 849A");
case PCI_PRODUCT_BROOKTREE_BT878:
return("BrookTree 878");
case PCI_PRODUCT_BROOKTREE_BT879:
return("BrookTree 879");
}
};
return ((char *)0);

View File

@ -62,6 +62,10 @@
*
*/
#if defined(__FreeBSD__) || defined(__OpenBSD__)
#if defined(BROOKTREE_ALLOC_PAGES)
#define BKTR_ALLOC_PAGES BROOKTREE_ALLOC_PAGES
#endif
#if defined(BROOKTREE_SYSTEM_DEFAULT)
#define BKTR_SYSTEM_DEFAULT BROOKTREE_SYSTEM_DEFAULT
#endif
@ -92,10 +96,25 @@
/*
* Definitions for the Brooktree 848/878 video capture to pci interface.
*/
#define BROOKTREE_848_PCI_ID 0x0350109E
#define BROOKTREE_849_PCI_ID 0x0351109E
#define BROOKTREE_878_PCI_ID 0x036E109E
#define BROOKTREE_879_PCI_ID 0x036F109E
#ifndef __NetBSD__
#define PCI_VENDOR_SHIFT 0
#define PCI_VENDOR_MASK 0xffff
#define PCI_VENDOR(id) \
(((id) >> PCI_VENDOR_SHIFT) & PCI_VENDOR_MASK)
#define PCI_PRODUCT_SHIFT 16
#define PCI_PRODUCT_MASK 0xffff
#define PCI_PRODUCT(id) \
(((id) >> PCI_PRODUCT_SHIFT) & PCI_PRODUCT_MASK)
/* PCI vendor ID */
#define PCI_VENDOR_BROOKTREE 0x109e /* Brooktree */
/* Brooktree products */
#define PCI_PRODUCT_BROOKTREE_BT848 0x0350 /* Bt848 Video Capture */
#define PCI_PRODUCT_BROOKTREE_BT849 0x0351 /* Bt849 Video Capture */
#define PCI_PRODUCT_BROOKTREE_BT878 0x036e /* Bt878 Video Capture */
#define PCI_PRODUCT_BROOKTREE_BT879 0x036f /* Bt879 Video Capture */
#endif
#define BROOKTREE_848 1
#define BROOKTREE_848A 2
@ -470,13 +489,6 @@ struct bktr_i2c_softc {
typedef struct bktr_clip bktr_clip_t;
/*
* NetBSD >= 1.3H uses vaddr_t instead of vm_offset_t
*/
#if defined(__NetBSD__) && __NetBSD_Version__ >= 103080000
typedef void * vm_offset_t;
#endif
/*
* BrookTree 848 info structure, one per bt848 card installed.
*/
@ -532,6 +544,12 @@ struct bktr_softc {
int irq_rid; /* 4.x resource id */
struct resource *res_irq; /* 4.x resource descriptor for interrupt */
void *res_ih; /* 4.x newbus interrupt handler cookie */
dev_t bktrdev; /* 4.x device entry for /dev/bktrN */
dev_t tunerdev; /* 4.x device entry for /dev/tunerN */
dev_t vbidev; /* 4.x device entry for /dev/vbiN */
dev_t bktrdev_alias; /* alias /dev/bktr to /dev/bktr0 */
dev_t tunerdev_alias; /* alias /dev/tuner to /dev/tuner0 */
dev_t vbidev_alias; /* alias /dev/vbi to /dev/vbi0 */
#endif
#if (__FreeBSD_version >= 310000)
bus_space_tag_t memt; /* Bus space register access functions */
@ -544,12 +562,25 @@ struct bktr_softc {
char bktr_xname[7]; /* device name and unit number */
#endif
/* the following definitions are common over all platforms */
vm_offset_t bigbuf; /* buffer that holds the captured image */
int alloc_pages; /* number of pages in bigbuf */
vm_offset_t vbidata; /* RISC program puts VBI data from the current frame here */
vm_offset_t vbibuffer; /* Circular buffer holding VBI data for the user */
/* The following definitions are for the contiguous memory */
#ifdef __NetBSD__
vaddr_t bigbuf; /* buffer that holds the captured image */
vaddr_t vbidata; /* RISC program puts VBI data from the current frame here */
vaddr_t vbibuffer; /* Circular buffer holding VBI data for the user */
vaddr_t dma_prog; /* RISC prog for single and/or even field capture*/
vaddr_t odd_dma_prog; /* RISC program for Odd field capture */
#else
vm_offset_t bigbuf; /* buffer that holds the captured image */
vm_offset_t vbidata; /* RISC program puts VBI data from the current frame here */
vm_offset_t vbibuffer; /* Circular buffer holding VBI data for the user */
vm_offset_t dma_prog; /* RISC prog for single and/or even field capture*/
vm_offset_t odd_dma_prog;/* RISC program for Odd field capture */
#endif
/* the following definitions are common over all platforms */
int alloc_pages; /* number of pages in bigbuf */
int vbiinsert; /* Position for next write into circular buffer */
int vbistart; /* Position of last read from circular buffer */
int vbisize; /* Number of bytes in the circular buffer */
@ -564,8 +595,6 @@ struct bktr_softc {
#define METEOR_SIG_MODE_MASK 0xffff0000
#define METEOR_SIG_FIELD_MODE 0x00010000
#define METEOR_SIG_FRAME_MODE 0x00000000
vm_offset_t dma_prog;
vm_offset_t odd_dma_prog;
char dma_prog_loaded;
struct meteor_mem *mem; /* used to control sync. multi-frame output */
u_long synch_wait; /* wait for free buffer before continuing */

View File

@ -56,6 +56,10 @@
#ifdef __FreeBSD__
#include <pci/pcivar.h>
#if (__FreeBSD_version < 500000)
#include <machine/clock.h> /* for DELAY */
#endif
#if (__FreeBSD_version >=300000)
#include <machine/bus_memio.h> /* for bus space */
#include <machine/bus.h>