diff options
author | roger <roger@FreeBSD.org> | 2000-10-19 07:33:28 +0000 |
---|---|---|
committer | roger <roger@FreeBSD.org> | 2000-10-19 07:33:28 +0000 |
commit | 6a567bac48416ce58e15c156ccffb99e40ed1260 (patch) | |
tree | f8179084d8f43d54579129df62f006320585b076 | |
parent | b40382e95c61a527d4825efed712f4564f1caa5c (diff) | |
download | FreeBSD-src-6a567bac48416ce58e15c156ccffb99e40ed1260.zip FreeBSD-src-6a567bac48416ce58e15c156ccffb99e40ed1260.tar.gz |
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>
-rwxr-xr-x | sys/dev/bktr/CHANGELOG.TXT | 8 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_audio.c | 5 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_card.c | 55 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_core.c | 37 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_i2c.c | 3 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_os.c | 102 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_reg.h | 63 | ||||
-rw-r--r-- | sys/dev/bktr/bktr_tuner.c | 4 |
8 files changed, 201 insertions, 76 deletions
diff --git a/sys/dev/bktr/CHANGELOG.TXT b/sys/dev/bktr/CHANGELOG.TXT index d542093..f33772e 100755 --- a/sys/dev/bktr/CHANGELOG.TXT +++ b/sys/dev/bktr/CHANGELOG.TXT @@ -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 + diff --git a/sys/dev/bktr/bktr_audio.c b/sys/dev/bktr/bktr_audio.c index 092c8ad..b093b8c 100644 --- a/sys/dev/bktr/bktr_audio.c +++ b/sys/dev/bktr/bktr_audio.c @@ -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) diff --git a/sys/dev/bktr/bktr_card.c b/sys/dev/bktr/bktr_card.c index b374e80..2ef02ed 100644 --- a/sys/dev/bktr/bktr_card.c +++ b/sys/dev/bktr/bktr_card.c @@ -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", diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c index 9a29ec4..694b344 100644 --- a/sys/dev/bktr/bktr_core.c +++ b/sys/dev/bktr/bktr_core.c @@ -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; diff --git a/sys/dev/bktr/bktr_i2c.c b/sys/dev/bktr/bktr_i2c.c index 12eb60d..0979db9 100644 --- a/sys/dev/bktr/bktr_i2c.c +++ b/sys/dev/bktr/bktr_i2c.c @@ -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 */ diff --git a/sys/dev/bktr/bktr_os.c b/sys/dev/bktr/bktr_os.c index cebfb2b..81c44bc 100644 --- a/sys/dev/bktr/bktr_os.c +++ b/sys/dev/bktr/bktr_os.c @@ -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); diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h index 8d2bd0e..6d869d4 100644 --- a/sys/dev/bktr/bktr_reg.h +++ b/sys/dev/bktr/bktr_reg.h @@ -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 @@ -471,13 +490,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. */ struct bktr_softc { @@ -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 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 */ - 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 */ 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 */ diff --git a/sys/dev/bktr/bktr_tuner.c b/sys/dev/bktr/bktr_tuner.c index c036584..999766c 100644 --- a/sys/dev/bktr/bktr_tuner.c +++ b/sys/dev/bktr/bktr_tuner.c @@ -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> |