summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroger <roger@FreeBSD.org>2000-10-19 07:33:28 +0000
committerroger <roger@FreeBSD.org>2000-10-19 07:33:28 +0000
commit6a567bac48416ce58e15c156ccffb99e40ed1260 (patch)
treef8179084d8f43d54579129df62f006320585b076
parentb40382e95c61a527d4825efed712f4564f1caa5c (diff)
downloadFreeBSD-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-xsys/dev/bktr/CHANGELOG.TXT8
-rw-r--r--sys/dev/bktr/bktr_audio.c5
-rw-r--r--sys/dev/bktr/bktr_card.c55
-rw-r--r--sys/dev/bktr/bktr_core.c37
-rw-r--r--sys/dev/bktr/bktr_i2c.c3
-rw-r--r--sys/dev/bktr/bktr_os.c102
-rw-r--r--sys/dev/bktr/bktr_reg.h63
-rw-r--r--sys/dev/bktr/bktr_tuner.c4
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>
OpenPOWER on IntegriCloud