summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroger <roger@FreeBSD.org>1999-06-12 14:54:56 +0000
committerroger <roger@FreeBSD.org>1999-06-12 14:54:56 +0000
commite92ea963e1051fd6928e889d8a240a0ee4286aaf (patch)
tree7da8696c537779b16f31f53851e1c4e378381db5
parentdaef367bde6af5097b2f546a3354d203f50ff8c7 (diff)
downloadFreeBSD-src-e92ea963e1051fd6928e889d8a240a0ee4286aaf.zip
FreeBSD-src-e92ea963e1051fd6928e889d8a240a0ee4286aaf.tar.gz
Updated to use the new 4.x newbus API
Also removed the BSDI support (for now) This allows the driver to be loaded/unloaded as a KLD and loaded in the boot loader phase whithout making a custom kernel.
-rw-r--r--sys/dev/bktr/bktr_core.c456
-rw-r--r--sys/dev/bktr/bktr_reg.h59
-rw-r--r--sys/pci/brktree_reg.h59
-rw-r--r--sys/pci/brooktree848.c456
4 files changed, 592 insertions, 438 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c
index 8deb185..03aa77e 100644
--- a/sys/dev/bktr/bktr_core.c
+++ b/sys/dev/bktr/bktr_core.c
@@ -1,4 +1,4 @@
-/* $Id: brooktree848.c,v 1.83 1999/05/31 11:28:53 phk Exp $ */
+/* $Id: brooktree848.c,v 1.84 1999/06/04 13:24:54 roger Exp $ */
/* BT848 Driver for Brooktree's Bt848, Bt848A, Bt849A, Bt878, Bt879 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The
@@ -425,6 +425,10 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
and should work fine in the Default mode.
Also rename 849 to 849A, the correct name for the chip.
+
+1.69 12 June 1999 Roger Hardiman <roger@freebsd.org>
+ Updates for FreeBSD 4.x device driver interface.
+ BSDI code removed. Will be restored later.
*/
#define DDB(x) x
@@ -441,7 +445,7 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
/* define NSMBUS as 0 if it is not already defined */
#if !defined(NSMBUS)
#define NSMBUS 0
-#endif
+#endif
#if !defined(__FreeBSD__) || ((NBKTR > 0) && (NPCI > 0))
@@ -453,24 +457,27 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
#include <sys/signalvar.h>
#include <sys/mman.h>
+#include <sys/bus.h>
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
+
#include <vm/vm.h>
#include <vm/vm_kern.h>
#include <vm/pmap.h>
#include <vm/vm_extern.h>
+#include <machine/clock.h> /* for DELAY */
#ifdef __FreeBSD__
#ifdef DEVFS
#include <sys/devfsext.h>
#endif /* DEVFS */
-#include <machine/clock.h>
+
#include <pci/pcivar.h>
#include <pci/pcireg.h>
#include <machine/ioctl_meteor.h>
#include <machine/ioctl_bt848.h> /* extensions to ioctl_meteor.h */
-#if (NSMBUS > 0)
-#include <sys/bus.h>
-#endif
#include <pci/brktree_reg.h>
#if (NSMBUS > 0)
#include <pci/bt848_i2c.h>
@@ -494,26 +501,6 @@ SYSCTL_INT(_hw_bt848, OID_AUTO, format, CTLFLAG_RW, &bt848_format, -1, "");
typedef u_long ioctl_cmd_t;
#endif /* __FreeBSD__ */
-#ifdef __bsdi__
-#include <sys/device.h>
-#include <i386/isa/isa.h>
-#include <i386/isa/isavar.h>
-#include <i386/isa/icu.h>
-#include <i386/pci/pci.h>
-#include <i386/isa/dma.h>
-#include <i386/eisa/eisa.h>
-#include "ioctl_meteor.h"
-#include "ioctl_bt848.h"
-#include "bt848_reg.h"
-
-typedef u_long ioctl_cmd_t;
-
-#define pci_conf_read(a, r) pci_inl(a, r)
-#define pci_conf_write(a, r, v) pci_outl(a, r, v)
-#include <sys/reboot.h>
-#define bootverbose (autoprint & (AC_VERBOSE|AC_DEBUG))
-#endif /* __bsdi__ */
-
typedef u_char bool_t;
#define BKTRPRI (PZERO+8)|PCATCH
@@ -571,26 +558,31 @@ static void bktr_intr __P((void *arg));
#ifdef __FreeBSD__
-static bktr_reg_t brooktree[ NBKTR ];
-#define BROOKTRE_NUM(mtr) ((bktr - &brooktree[0])/sizeof(bktr_reg_t))
-
#define UNIT(x) ((x) & 0x0f)
#define MINOR(x) ((x >> 4) & 0x0f)
-#define ATTACH_ARGS pcici_t tag, int unit
-static const char* bktr_probe( pcici_t tag, pcidi_t type );
-static void bktr_attach( ATTACH_ARGS );
+static int bktr_probe( device_t dev );
+static int bktr_attach( device_t dev );
+static int bktr_detach( device_t dev );
+static int bktr_shutdown( device_t dev );
-static u_long bktr_count;
+static device_method_t bktr_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, bktr_probe),
+ DEVMETHOD(device_attach, bktr_attach),
+ DEVMETHOD(device_detach, bktr_detach),
+ DEVMETHOD(device_shutdown, bktr_shutdown),
-static struct pci_device bktr_device = {
+ { 0, 0 }
+};
+
+static driver_t bktr_driver = {
"bktr",
- bktr_probe,
- bktr_attach,
- &bktr_count
+ bktr_methods,
+ sizeof(struct bktr_softc),
};
-COMPAT_PCI_DRIVER (bktr, bktr_device);
+static devclass_t bktr_devclass;
static d_open_t bktr_open;
static d_close_t bktr_close;
@@ -621,86 +613,12 @@ static struct cdevsw bktr_cdevsw = {
/* maxio */ 0,
/* bmaj */ -1
};
-#endif /* __FreeBSD__ */
-
-#ifdef __bsdi__
-#define UNIT dv_unit
-#define MINOR dv_subunit
-#define ATTACH_ARGS \
- struct device * const parent, struct device * const self, void * const aux
-
-#define PCI_COMMAND_STATUS_REG PCI_COMMAND
-
-static void bktr_attach( ATTACH_ARGS );
-#define NBKTR bktrcd.cd_ndevs
-#define brooktree *((bktr_ptr_t *)bktrcd.cd_devs)
-
-static int bktr_spl;
-static int bktr_intr_returning_1(void *arg) { bktr_intr(arg); return (1);}
-#define disable_intr() { bktr_spl = splhigh(); }
-#define enable_intr() { splx(bktr_spl); }
-static void vbidecode(bktr_ptr_t bktr);
-
-static int
-bktr_pci_match(pci_devaddr_t *pa)
-{
- unsigned id;
-
- id = pci_inl(pa, PCI_VENDOR_ID);
-
- switch (id) {
- BROOKTREE_848_PCI_ID:
- BROOKTREE_849_PCI_ID:
- BROOKTREE_878_PCI_ID:
- BROOKTREE_879_PCI_ID:
- return 1;
- }
- aprint_debug("bktr_pci_match got %x\n", id);
- return 0;
-
-}
-
-pci_devres_t bktr_res; /* XXX only remembers last one, helps debug */
-
-static int
-bktr_probe(struct device *parent, struct cfdata *cf, void *aux)
-{
- pci_devaddr_t *pa;
- pci_devres_t res;
- struct isa_attach_args *ia = aux;
-
- if (ia->ia_bustype != BUS_PCI)
- return (0);
- if ((pa = pci_scan(bktr_pci_match)) == NULL)
- return (0);
+DEV_DRIVER_MODULE(bktr, pci, bktr_driver, bktr_devclass, CDEV_MAJOR, NOMAJ,
+ bktr_cdevsw, 0, 0);
- pci_getres(pa, &bktr_res, 1, ia);
- if (ia->ia_maddr == 0) {
- printf("bktr%d: no mem attached\n", cf->cf_unit);
- return (0);
- }
- ia->ia_aux = pa;
- return 1;
-}
-
-
-struct cfdriver bktrcd =
-{ 0, "bktr", bktr_probe, bktr_attach, DV_DULL, sizeof(bktr_reg_t) };
-
-int bktr_open __P((dev_t, int, int, struct proc *));
-int bktr_close __P((dev_t, int, int, struct proc *));
-int bktr_read __P((dev_t, struct uio *, int));
-int bktr_write __P((dev_t, struct uio *, int));
-int bktr_ioctl __P((dev_t, ioctl_cmd_t, caddr_t, int, struct proc *));
-int bktr_mmap __P((dev_t, int, int));
+#endif /* __FreeBSD__ */
-struct devsw bktrsw = {
- &bktrcd,
- bktr_open, bktr_close, bktr_read, bktr_write, bktr_ioctl,
- seltrue, bktr_mmap, NULL, nodump, NULL, 0, nostop
-};
-#endif /* __bsdi__ */
/*
* This is for start-up convenience only, NOT mandatory.
@@ -1440,28 +1358,33 @@ static void bctv_gpio_write( bktr_ptr_t bktr, int port, int val );
/*
* the boot time probe routine.
*/
-static const char*
-bktr_probe( pcici_t tag, pcidi_t type )
+static int
+bktr_probe( device_t dev )
{
- unsigned int rev = pci_conf_read( tag, PCIR_REVID) & 0x000000ff;
+ unsigned int type = pci_get_devid(dev);
+ unsigned int rev = pci_get_revid(dev);
static int once;
if (!once++)
cdevsw_add(&bktr_cdevsw);
-
+
switch (type) {
case BROOKTREE_848_PCI_ID:
- if (rev == 0x12) return("BrookTree 848A");
- else return("BrookTree 848");
+ if (rev == 0x12) device_set_desc(dev, "BrookTree 848A");
+ else device_set_desc(dev, "BrookTree 848");
+ return 0;
case BROOKTREE_849_PCI_ID:
- return("BrookTree 849A");
+ device_set_desc(dev, "BrookTree 849A");
+ return 0;
case BROOKTREE_878_PCI_ID:
- return("BrookTree 878");
+ device_set_desc(dev, "BrookTree 878");
+ return 0;
case BROOKTREE_879_PCI_ID:
- return("BrookTree 879");
+ device_set_desc(dev, "BrookTree 879");
+ return 0;
};
- return ((char *)0);
+ return ENXIO;
}
#endif /* __FreeBSD__ */
@@ -1469,35 +1392,79 @@ bktr_probe( pcici_t tag, pcidi_t type )
/*
* the attach routine.
*/
-static void
-bktr_attach( ATTACH_ARGS )
+static int
+bktr_attach( device_t dev )
{
- bktr_ptr_t bktr;
bt848_ptr_t bt848;
-#ifdef BROOKTREE_IRQ
- u_long old_irq, new_irq;
-#endif
vm_offset_t buf;
u_long latency;
u_long fun;
+ u_long val;
unsigned int rev;
+ unsigned int unit;
+ int error = 0;
+ int rid;
-#ifdef __FreeBSD__
- bktr = &brooktree[unit];
+ struct bktr_softc *bktr = device_get_softc(dev);
+
+ unit = device_get_unit(dev);
if (unit >= NBKTR) {
printf("brooktree%d: attach: only %d units configured.\n",
unit, NBKTR);
printf("brooktree%d: attach: invalid unit number.\n", unit);
- return;
+ return ENXIO;
}
- bktr->tag = tag;
- pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base,
- &bktr->phys_base );
+ /*
+ * Enable bus mastering and Memory Mapped device
+ */
+ val = pci_read_config(dev, PCIR_COMMAND, 4);
+ val |= (PCIM_CMD_MEMEN|PCIM_CMD_BUSMASTEREN);
+ pci_write_config(dev, PCIR_COMMAND, val, 4);
- /* Update the Device Control Register on Bt878 and Bt879 cards */
- fun = pci_conf_read(tag, 0x40);
+ /*
+ * Map control/status registers.
+ */
+ rid = PCI_MAP_REG_START;
+ bktr->res_mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
+ 0, ~0, 1, RF_ACTIVE);
+
+ if (!bktr->res_mem) {
+ device_printf(dev, "could not map memory\n");
+ error = ENXIO;
+ goto fail;
+ }
+ bktr->base = rman_get_virtual(bktr->res_mem); /* XXX use bus_space */
+
+ /*
+ * Allocate our interrupt.
+ */
+ rid = 0;
+ bktr->res_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
+ RF_SHAREABLE | RF_ACTIVE);
+ if (bktr->res_irq == NULL) {
+ device_printf(dev, "could not map interrupt\n");
+ error = ENXIO;
+ goto fail;
+ }
+
+ error = bus_setup_intr(dev, bktr->res_irq, INTR_TYPE_NET,
+ bktr_intr, bktr, &bktr->res_ih);
+ if (error) {
+ device_printf(dev, "could not setup irq\n");
+ goto fail;
+
+ }
+
+ /* Disable the brooktree device */
+ bt848 = bktr->base;
+ bt848->int_mask = ALL_INTS_DISABLED;
+ bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+
+ /* Update the Device Control Register */
+ /* on Bt878 and Bt879 cards */
+ fun = pci_read_config( dev, 0x40, 2);
fun = fun | 1; /* Enable writes to the sub-system vendor ID */
#if defined( BKTR_430_FX_MODE )
@@ -1510,7 +1477,7 @@ bktr_attach( ATTACH_ARGS )
fun = fun | 4; /* Enable SiS/VIA compatibility mode (usefull for
OPTi chipset motherboards too */
#endif
- pci_conf_write(tag, 0x40, fun);
+ pci_write_config(dev, 0x40, fun, 2);
/* XXX call bt848_i2c dependent attach() routine */
@@ -1519,30 +1486,7 @@ bktr_attach( ATTACH_ARGS )
printf("bktr%d: i2c_attach: can't attach\n", unit);
#endif
-#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);
-#endif /* __FreeBSD__ */
-#ifdef __bsdi__
- struct isa_attach_args * const ia = (struct isa_attach_args *)aux;
- pci_devaddr_t *tag = (pci_devaddr_t *) ia->ia_aux;
- int unit = bktr->bktr_dev.dv_unit;
-
- bktr = (bktr_reg_t *) self;
- bktr->base = (bt848_ptr_t) bktr_res.pci_vaddr;
- isa_establish(&bktr->bktr_id, &bktr->bktr_dev);
- bktr->bktr_ih.ih_fun = bktr_intr_returning_1;
- bktr->bktr_ih.ih_arg = (void *)bktr;
- intr_establish(ia->ia_irq, &bktr->bktr_ih, DV_DULL);
-#endif /* __bsdi__ */
-
/*
* 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.
@@ -1550,7 +1494,7 @@ bktr_attach( ATTACH_ARGS )
#ifndef BROOKTREE_DEF_LATENCY_VALUE
#define BROOKTREE_DEF_LATENCY_VALUE 10
#endif
- latency = pci_conf_read(tag, PCI_LATENCY_TIMER);
+ latency = pci_read_config(dev, PCI_LATENCY_TIMER, 4);
latency = (latency >> 8) & 0xff;
if ( bootverbose ) {
if (latency)
@@ -1561,7 +1505,7 @@ bktr_attach( ATTACH_ARGS )
}
if ( !latency ) {
latency = BROOKTREE_DEF_LATENCY_VALUE;
- pci_conf_write(tag, PCI_LATENCY_TIMER, latency<<8);
+ pci_write_config(dev, PCI_LATENCY_TIMER, latency<<8, 4);
}
if ( bootverbose ) {
printf(" %d.\n", (int) latency);
@@ -1569,7 +1513,7 @@ bktr_attach( ATTACH_ARGS )
/* allocate space for dma program */
- bktr->dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC);
+ bktr->dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC);
bktr->odd_dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC);
/* allocate space for pixel buffer */
@@ -1583,31 +1527,27 @@ bktr_attach( ATTACH_ARGS )
unit, BROOKTREE_ALLOC, vtophys(buf));
}
- bktr->bigbuf = buf;
- bktr->alloc_pages = BROOKTREE_ALLOC_PAGES;
-
- fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
- pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 2);
-
if ( buf != 0 ) {
- bzero((caddr_t) buf, BROOKTREE_ALLOC);
- buf = vtophys(buf);
- bktr->flags = METEOR_INITALIZED | METEOR_AUTOMODE |
- METEOR_DEV0 | METEOR_RGB16;
- bktr->dma_prog_loaded = FALSE;
- bktr->cols = 640;
- bktr->rows = 480;
- bktr->frames = 1; /* one frame */
- bktr->format = METEOR_GEO_RGB16;
- bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
- bktr->pixfmt_compat = TRUE;
- bt848 = bktr->base;
- bt848->int_mask = ALL_INTS_DISABLED;
- bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+ bktr->bigbuf = buf;
+ bktr->alloc_pages = BROOKTREE_ALLOC_PAGES;
+ bzero((caddr_t) bktr->bigbuf, BROOKTREE_ALLOC);
+ } else {
+ bktr->alloc_pages = 0;
}
+
- bktr->vbidata = get_bktr_mem(unit, VBI_DATA_SIZE);
+ bktr->flags = METEOR_INITALIZED | METEOR_AUTOMODE |
+ METEOR_DEV0 | METEOR_RGB16;
+ bktr->dma_prog_loaded = FALSE;
+ bktr->cols = 640;
+ bktr->rows = 480;
+ bktr->frames = 1; /* one frame */
+ bktr->format = METEOR_GEO_RGB16;
+ bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
+ bktr->pixfmt_compat = TRUE;
+ /* allocte space for the VBI buffer */
+ bktr->vbidata = get_bktr_mem(unit, VBI_DATA_SIZE);
bktr->vbibuffer = get_bktr_mem(unit, VBI_BUFFER_SIZE);
bktr->vbiinsert = 0;
@@ -1615,9 +1555,10 @@ bktr_attach( ATTACH_ARGS )
bktr->vbisize = 0;
bktr->vbiflags = 0;
- /* read the pci id and determine the card type */
- fun = pci_conf_read(tag, PCI_ID_REG);
- rev = pci_conf_read(tag, PCIR_REVID) & 0x000000ff;
+ /* read the pci device id and revision id */
+ /* and determine the card type */
+ fun = pci_get_devid(dev);
+ rev = pci_get_revid(dev);
switch (fun) {
case BROOKTREE_848_PCI_ID:
@@ -1635,8 +1576,8 @@ bktr_attach( ATTACH_ARGS )
break;
};
-
bktr->clr_on_start = FALSE;
+
/* defaults for the tuner section of the card */
bktr->tflags = TUNER_INITALIZED;
bktr->tuner.frequency = 0;
@@ -1659,14 +1600,60 @@ bktr_attach( ATTACH_ARGS )
DEVFS is finally made really operational. */
devfs_add_devswf(&bktr_cdevsw, unit, DV_CHR, 0, 0, 0444, "bktr%d", unit);
devfs_add_devswf(&bktr_cdevsw, unit+16, DV_CHR, 0, 0, 0444, "tuner%d", unit);
+ devfs_add_devswf(&bktr_cdevsw, unit+32, DV_CHR, 0, 0, 0444, "vbi%d", unit);
#endif /* DEVFS */
-#if __FreeBSD__ > 2
- fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
- pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 4);
-#endif
+ return 0;
+
+fail:
+ return error;
+
+}
+
+/*
+ * the detach routine.
+ */
+static int
+bktr_detach( device_t dev )
+{
+ struct bktr_softc *bktr = device_get_softc(dev);
+ bt848_ptr_t bt848;
+
+ /* Disable the brooktree device */
+ bt848 = bktr->base;
+ bt848->int_mask = ALL_INTS_DISABLED;
+ bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+
+ /* FIXME - Free memory for RISC programs, grab buffer, vbi buffers */
+
+ /*
+ * Deallocate resources.
+ */
+ bus_teardown_intr(dev, bktr->res_irq, bktr->res_ih);
+ bus_release_resource(dev, SYS_RES_IRQ, 0, bktr->res_irq);
+ bus_release_resource(dev, SYS_RES_MEMORY, PCI_MAP_REG_START, bktr->res_mem);
+
+ return 0;
+}
+
+/*
+ * the shutdown routine.
+ */
+static int
+bktr_shutdown( device_t dev )
+{
+ struct bktr_softc *bktr = device_get_softc(dev);
+ bt848_ptr_t bt848;
+
+ /* Disable the brooktree device */
+ bt848 = bktr->base;
+ bt848->int_mask = ALL_INTS_DISABLED;
+ bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+
+ return 0;
}
+
/* Copy the vbi lines from 'vbidata' into the circular buffer, 'vbibuffer'.
* The circular buffer holds 'n' fixed size data blocks.
* vbisize is the number of bytes in the circular buffer
@@ -1967,16 +1954,25 @@ bktr_open( dev_t dev, int flags, int fmt, struct proc *p )
{
bktr_ptr_t bktr;
int unit;
+ int result;
unit = UNIT( minor(dev) );
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
if (!(bktr->flags & METEOR_INITALIZED)) /* device not found */
return( ENXIO );
+ /* Record that the device is now busy */
+ device_busy(devclass_get_device(bktr_devclass, unit));
+
if (bt848_card != -1) {
if ((bt848_card >> 8 == unit ) &&
@@ -2009,16 +2005,26 @@ bktr_open( dev_t dev, int flags, int fmt, struct proc *p )
switch ( MINOR( minor(dev) ) ) {
case VIDEO_DEV:
- return( video_open( bktr ) );
+ result = video_open( bktr );
+ break;
case TUNER_DEV:
- return( tuner_open( bktr ) );
+ result = tuner_open( bktr );
+ break;
case VBI_DEV:
- return( vbi_open( bktr ) );
+ result = vbi_open( bktr );
+ break;
+
+ default:
+ result = ENXIO;
+ break;
}
- return( ENXIO );
+ /* If there was an error opening the device, undo the busy status */
+ if (result != 0)
+ device_unbusy(devclass_get_device(bktr_devclass, unit));
+ return( result );
}
@@ -2195,26 +2201,39 @@ bktr_close( dev_t dev, int flags, int fmt, struct proc *p )
{
bktr_ptr_t bktr;
int unit;
+ int result;
unit = UNIT( minor(dev) );
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
switch ( MINOR( minor(dev) ) ) {
case VIDEO_DEV:
- return( video_close( bktr ) );
+ result = video_close( bktr );
+ break;
case TUNER_DEV:
- return( tuner_close( bktr ) );
+ result = tuner_close( bktr );
+ break;
case VBI_DEV:
- return( vbi_close( bktr ) );
+ result = vbi_close( bktr );
+ break;
+ default:
+ return (ENXIO);
+ break;
}
- return( ENXIO );
+ device_unbusy(devclass_get_device(bktr_devclass, unit));
+ return( result );
}
@@ -2287,7 +2306,12 @@ bktr_read( dev_t dev, struct uio *uio, int ioflag )
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[unit]);
+ /* 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);
+ }
switch ( MINOR( minor(dev) ) ) {
case VIDEO_DEV:
@@ -2423,7 +2447,12 @@ bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct proc* pr )
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */
return( ENOMEM );
@@ -3592,7 +3621,12 @@ bktr_mmap( dev_t dev, vm_offset_t offset, int nprot )
if (unit >= NBKTR || MINOR(minor(dev)) > 0)/* could this happen here? */
return( -1 );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
if (nprot & PROT_EXEC)
return( -1 );
@@ -5576,9 +5610,9 @@ static int check_for_i2c_devices( bktr_ptr_t bktr ){
int i2c_all_0 = 1;
int i2c_all_absent = 1;
for ( x = 0; x < 128; ++x ) {
- temp_read = i2cRead( bktr, (2 * x) + 1 );
- if (temp_read != 0) i2c_all_0 = 0;
- if (temp_read != ABSENT) i2c_all_absent = 0;
+ temp_read = i2cRead( bktr, (2 * x) + 1 );
+ if (temp_read != 0) i2c_all_0 = 0;
+ if (temp_read != ABSENT) i2c_all_absent = 0;
}
if ((i2c_all_0) || (i2c_all_absent)) return 0;
diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h
index 6eb0978..2395110 100644
--- a/sys/dev/bktr/bktr_reg.h
+++ b/sys/dev/bktr/bktr_reg.h
@@ -28,14 +28,14 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: brktree_reg.h,v 1.27 1999/05/10 10:08:50 roger Exp $
+ * $Id: brktree_reg.h,v 1.28 1999/05/25 12:44:40 roger Exp $
*/
#ifndef PCI_LATENCY_TIMER
#define PCI_LATENCY_TIMER 0x0c /* pci timer register */
#endif
/*
- * Definitions for the Philips SAA7116 digital video to pci interface.
+ * Definitions for the Brooktree 848/878 video capture to pci interface.
*/
#define BROOKTREE_848_PCI_ID 0x0350109E
#define BROOKTREE_849_PCI_ID 0x0351109E
@@ -387,22 +387,65 @@ struct bktr_i2c_softc {
#endif
typedef struct bktr_clip bktr_clip_t;
+
+
/*
* BrookTree 848 info structure, one per bt848 card installed.
*/
struct bktr_softc {
-#ifdef __bsdi__
+
+#if defined (__bsdi__)
struct device bktr_dev; /* base device */
struct isadev bktr_id; /* ISA device */
struct intrhand bktr_ih; /* interrupt vectoring */
-#define pcici_t pci_devaddr_t
+ #define pcici_t pci_devaddr_t
#endif
-#if ((defined(__FreeBSD__)) && (NSMBUS > 0))
- struct bktr_i2c_softc i2c_sc; /* bt848_i2c device */
+
+#if defined(__NetBSD__)
+ struct device bktr_dev; /* base device */
+ bus_space_tag_t memt;
+ bus_space_handle_t memh;
+ bus_size_t obmemsz; /* size of en card (bytes) */
+ void *ih;
+ bus_dmamap_t dm_prog;
+ bus_dmamap_t dm_oprog;
+ bus_dmamap_t dm_mem;
+ vm_offset_t phys_base; /* Bt848 register physical address */
#endif
+
+#if defined(__OpenBSD__)
+ struct device bktr_dev; /* base device */
+ bus_dma_tag_t dmat; /* DMA tag */
+ bus_space_tag_t memt;
+ bus_space_handle_t memh;
+ bus_size_t obmemsz; /* size of en card (bytes) */
+ void *ih;
+ bus_dmamap_t dm_prog;
+ bus_dmamap_t dm_oprog;
+ bus_dmamap_t dm_mem;
+ size_t dm_mapsize;
+ pci_chipset_tag_t pc; /* Opaque PCI chipset tag */
+ pcitag_t tag; /* PCI tag, for doing PCI commands */
+ vm_offset_t phys_base; /* Bt848 register physical address */
+#endif
+
+#if defined (__FreeBSD__)
+ #if (__FreeBSD__ < 4)
+ vm_offset_t phys_base; /* 2.x Bt848 register physical address */
+ pcici_t tag; /* 2.x PCI tag, for doing PCI commands */
+ #endif
+ #if (__FreeBSD__ > 3)
+ struct resource *res_mem; /* 4.x resource descriptor for registers */
+ struct resource *res_irq; /* 4.x resource descriptor for interrupt */
+ void *res_ih; /* 4.x newbus interrupt handler cookie */
+ #endif
+ #if (NSMBUS > 0)
+ struct bktr_i2c_softc i2c_sc; /* bt848_i2c device */
+ #endif
+#endif
+
+ /* the following definitions are common over all platforms */
bt848_ptr_t base; /* Bt848 register physical address */
- vm_offset_t phys_base; /* Bt848 register physical address */
- pcici_t tag; /* PCI tag, for doing PCI commands */
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 */
diff --git a/sys/pci/brktree_reg.h b/sys/pci/brktree_reg.h
index 6eb0978..2395110 100644
--- a/sys/pci/brktree_reg.h
+++ b/sys/pci/brktree_reg.h
@@ -28,14 +28,14 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: brktree_reg.h,v 1.27 1999/05/10 10:08:50 roger Exp $
+ * $Id: brktree_reg.h,v 1.28 1999/05/25 12:44:40 roger Exp $
*/
#ifndef PCI_LATENCY_TIMER
#define PCI_LATENCY_TIMER 0x0c /* pci timer register */
#endif
/*
- * Definitions for the Philips SAA7116 digital video to pci interface.
+ * Definitions for the Brooktree 848/878 video capture to pci interface.
*/
#define BROOKTREE_848_PCI_ID 0x0350109E
#define BROOKTREE_849_PCI_ID 0x0351109E
@@ -387,22 +387,65 @@ struct bktr_i2c_softc {
#endif
typedef struct bktr_clip bktr_clip_t;
+
+
/*
* BrookTree 848 info structure, one per bt848 card installed.
*/
struct bktr_softc {
-#ifdef __bsdi__
+
+#if defined (__bsdi__)
struct device bktr_dev; /* base device */
struct isadev bktr_id; /* ISA device */
struct intrhand bktr_ih; /* interrupt vectoring */
-#define pcici_t pci_devaddr_t
+ #define pcici_t pci_devaddr_t
#endif
-#if ((defined(__FreeBSD__)) && (NSMBUS > 0))
- struct bktr_i2c_softc i2c_sc; /* bt848_i2c device */
+
+#if defined(__NetBSD__)
+ struct device bktr_dev; /* base device */
+ bus_space_tag_t memt;
+ bus_space_handle_t memh;
+ bus_size_t obmemsz; /* size of en card (bytes) */
+ void *ih;
+ bus_dmamap_t dm_prog;
+ bus_dmamap_t dm_oprog;
+ bus_dmamap_t dm_mem;
+ vm_offset_t phys_base; /* Bt848 register physical address */
#endif
+
+#if defined(__OpenBSD__)
+ struct device bktr_dev; /* base device */
+ bus_dma_tag_t dmat; /* DMA tag */
+ bus_space_tag_t memt;
+ bus_space_handle_t memh;
+ bus_size_t obmemsz; /* size of en card (bytes) */
+ void *ih;
+ bus_dmamap_t dm_prog;
+ bus_dmamap_t dm_oprog;
+ bus_dmamap_t dm_mem;
+ size_t dm_mapsize;
+ pci_chipset_tag_t pc; /* Opaque PCI chipset tag */
+ pcitag_t tag; /* PCI tag, for doing PCI commands */
+ vm_offset_t phys_base; /* Bt848 register physical address */
+#endif
+
+#if defined (__FreeBSD__)
+ #if (__FreeBSD__ < 4)
+ vm_offset_t phys_base; /* 2.x Bt848 register physical address */
+ pcici_t tag; /* 2.x PCI tag, for doing PCI commands */
+ #endif
+ #if (__FreeBSD__ > 3)
+ struct resource *res_mem; /* 4.x resource descriptor for registers */
+ struct resource *res_irq; /* 4.x resource descriptor for interrupt */
+ void *res_ih; /* 4.x newbus interrupt handler cookie */
+ #endif
+ #if (NSMBUS > 0)
+ struct bktr_i2c_softc i2c_sc; /* bt848_i2c device */
+ #endif
+#endif
+
+ /* the following definitions are common over all platforms */
bt848_ptr_t base; /* Bt848 register physical address */
- vm_offset_t phys_base; /* Bt848 register physical address */
- pcici_t tag; /* PCI tag, for doing PCI commands */
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 */
diff --git a/sys/pci/brooktree848.c b/sys/pci/brooktree848.c
index 8deb185..03aa77e 100644
--- a/sys/pci/brooktree848.c
+++ b/sys/pci/brooktree848.c
@@ -1,4 +1,4 @@
-/* $Id: brooktree848.c,v 1.83 1999/05/31 11:28:53 phk Exp $ */
+/* $Id: brooktree848.c,v 1.84 1999/06/04 13:24:54 roger Exp $ */
/* BT848 Driver for Brooktree's Bt848, Bt848A, Bt849A, Bt878, Bt879 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The
@@ -425,6 +425,10 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
and should work fine in the Default mode.
Also rename 849 to 849A, the correct name for the chip.
+
+1.69 12 June 1999 Roger Hardiman <roger@freebsd.org>
+ Updates for FreeBSD 4.x device driver interface.
+ BSDI code removed. Will be restored later.
*/
#define DDB(x) x
@@ -441,7 +445,7 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
/* define NSMBUS as 0 if it is not already defined */
#if !defined(NSMBUS)
#define NSMBUS 0
-#endif
+#endif
#if !defined(__FreeBSD__) || ((NBKTR > 0) && (NPCI > 0))
@@ -453,24 +457,27 @@ They are unrelated to Revision Control numbering of FreeBSD or any other system.
#include <sys/signalvar.h>
#include <sys/mman.h>
+#include <sys/bus.h>
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
+
#include <vm/vm.h>
#include <vm/vm_kern.h>
#include <vm/pmap.h>
#include <vm/vm_extern.h>
+#include <machine/clock.h> /* for DELAY */
#ifdef __FreeBSD__
#ifdef DEVFS
#include <sys/devfsext.h>
#endif /* DEVFS */
-#include <machine/clock.h>
+
#include <pci/pcivar.h>
#include <pci/pcireg.h>
#include <machine/ioctl_meteor.h>
#include <machine/ioctl_bt848.h> /* extensions to ioctl_meteor.h */
-#if (NSMBUS > 0)
-#include <sys/bus.h>
-#endif
#include <pci/brktree_reg.h>
#if (NSMBUS > 0)
#include <pci/bt848_i2c.h>
@@ -494,26 +501,6 @@ SYSCTL_INT(_hw_bt848, OID_AUTO, format, CTLFLAG_RW, &bt848_format, -1, "");
typedef u_long ioctl_cmd_t;
#endif /* __FreeBSD__ */
-#ifdef __bsdi__
-#include <sys/device.h>
-#include <i386/isa/isa.h>
-#include <i386/isa/isavar.h>
-#include <i386/isa/icu.h>
-#include <i386/pci/pci.h>
-#include <i386/isa/dma.h>
-#include <i386/eisa/eisa.h>
-#include "ioctl_meteor.h"
-#include "ioctl_bt848.h"
-#include "bt848_reg.h"
-
-typedef u_long ioctl_cmd_t;
-
-#define pci_conf_read(a, r) pci_inl(a, r)
-#define pci_conf_write(a, r, v) pci_outl(a, r, v)
-#include <sys/reboot.h>
-#define bootverbose (autoprint & (AC_VERBOSE|AC_DEBUG))
-#endif /* __bsdi__ */
-
typedef u_char bool_t;
#define BKTRPRI (PZERO+8)|PCATCH
@@ -571,26 +558,31 @@ static void bktr_intr __P((void *arg));
#ifdef __FreeBSD__
-static bktr_reg_t brooktree[ NBKTR ];
-#define BROOKTRE_NUM(mtr) ((bktr - &brooktree[0])/sizeof(bktr_reg_t))
-
#define UNIT(x) ((x) & 0x0f)
#define MINOR(x) ((x >> 4) & 0x0f)
-#define ATTACH_ARGS pcici_t tag, int unit
-static const char* bktr_probe( pcici_t tag, pcidi_t type );
-static void bktr_attach( ATTACH_ARGS );
+static int bktr_probe( device_t dev );
+static int bktr_attach( device_t dev );
+static int bktr_detach( device_t dev );
+static int bktr_shutdown( device_t dev );
-static u_long bktr_count;
+static device_method_t bktr_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, bktr_probe),
+ DEVMETHOD(device_attach, bktr_attach),
+ DEVMETHOD(device_detach, bktr_detach),
+ DEVMETHOD(device_shutdown, bktr_shutdown),
-static struct pci_device bktr_device = {
+ { 0, 0 }
+};
+
+static driver_t bktr_driver = {
"bktr",
- bktr_probe,
- bktr_attach,
- &bktr_count
+ bktr_methods,
+ sizeof(struct bktr_softc),
};
-COMPAT_PCI_DRIVER (bktr, bktr_device);
+static devclass_t bktr_devclass;
static d_open_t bktr_open;
static d_close_t bktr_close;
@@ -621,86 +613,12 @@ static struct cdevsw bktr_cdevsw = {
/* maxio */ 0,
/* bmaj */ -1
};
-#endif /* __FreeBSD__ */
-
-#ifdef __bsdi__
-#define UNIT dv_unit
-#define MINOR dv_subunit
-#define ATTACH_ARGS \
- struct device * const parent, struct device * const self, void * const aux
-
-#define PCI_COMMAND_STATUS_REG PCI_COMMAND
-
-static void bktr_attach( ATTACH_ARGS );
-#define NBKTR bktrcd.cd_ndevs
-#define brooktree *((bktr_ptr_t *)bktrcd.cd_devs)
-
-static int bktr_spl;
-static int bktr_intr_returning_1(void *arg) { bktr_intr(arg); return (1);}
-#define disable_intr() { bktr_spl = splhigh(); }
-#define enable_intr() { splx(bktr_spl); }
-static void vbidecode(bktr_ptr_t bktr);
-
-static int
-bktr_pci_match(pci_devaddr_t *pa)
-{
- unsigned id;
-
- id = pci_inl(pa, PCI_VENDOR_ID);
-
- switch (id) {
- BROOKTREE_848_PCI_ID:
- BROOKTREE_849_PCI_ID:
- BROOKTREE_878_PCI_ID:
- BROOKTREE_879_PCI_ID:
- return 1;
- }
- aprint_debug("bktr_pci_match got %x\n", id);
- return 0;
-
-}
-
-pci_devres_t bktr_res; /* XXX only remembers last one, helps debug */
-
-static int
-bktr_probe(struct device *parent, struct cfdata *cf, void *aux)
-{
- pci_devaddr_t *pa;
- pci_devres_t res;
- struct isa_attach_args *ia = aux;
-
- if (ia->ia_bustype != BUS_PCI)
- return (0);
- if ((pa = pci_scan(bktr_pci_match)) == NULL)
- return (0);
+DEV_DRIVER_MODULE(bktr, pci, bktr_driver, bktr_devclass, CDEV_MAJOR, NOMAJ,
+ bktr_cdevsw, 0, 0);
- pci_getres(pa, &bktr_res, 1, ia);
- if (ia->ia_maddr == 0) {
- printf("bktr%d: no mem attached\n", cf->cf_unit);
- return (0);
- }
- ia->ia_aux = pa;
- return 1;
-}
-
-
-struct cfdriver bktrcd =
-{ 0, "bktr", bktr_probe, bktr_attach, DV_DULL, sizeof(bktr_reg_t) };
-
-int bktr_open __P((dev_t, int, int, struct proc *));
-int bktr_close __P((dev_t, int, int, struct proc *));
-int bktr_read __P((dev_t, struct uio *, int));
-int bktr_write __P((dev_t, struct uio *, int));
-int bktr_ioctl __P((dev_t, ioctl_cmd_t, caddr_t, int, struct proc *));
-int bktr_mmap __P((dev_t, int, int));
+#endif /* __FreeBSD__ */
-struct devsw bktrsw = {
- &bktrcd,
- bktr_open, bktr_close, bktr_read, bktr_write, bktr_ioctl,
- seltrue, bktr_mmap, NULL, nodump, NULL, 0, nostop
-};
-#endif /* __bsdi__ */
/*
* This is for start-up convenience only, NOT mandatory.
@@ -1440,28 +1358,33 @@ static void bctv_gpio_write( bktr_ptr_t bktr, int port, int val );
/*
* the boot time probe routine.
*/
-static const char*
-bktr_probe( pcici_t tag, pcidi_t type )
+static int
+bktr_probe( device_t dev )
{
- unsigned int rev = pci_conf_read( tag, PCIR_REVID) & 0x000000ff;
+ unsigned int type = pci_get_devid(dev);
+ unsigned int rev = pci_get_revid(dev);
static int once;
if (!once++)
cdevsw_add(&bktr_cdevsw);
-
+
switch (type) {
case BROOKTREE_848_PCI_ID:
- if (rev == 0x12) return("BrookTree 848A");
- else return("BrookTree 848");
+ if (rev == 0x12) device_set_desc(dev, "BrookTree 848A");
+ else device_set_desc(dev, "BrookTree 848");
+ return 0;
case BROOKTREE_849_PCI_ID:
- return("BrookTree 849A");
+ device_set_desc(dev, "BrookTree 849A");
+ return 0;
case BROOKTREE_878_PCI_ID:
- return("BrookTree 878");
+ device_set_desc(dev, "BrookTree 878");
+ return 0;
case BROOKTREE_879_PCI_ID:
- return("BrookTree 879");
+ device_set_desc(dev, "BrookTree 879");
+ return 0;
};
- return ((char *)0);
+ return ENXIO;
}
#endif /* __FreeBSD__ */
@@ -1469,35 +1392,79 @@ bktr_probe( pcici_t tag, pcidi_t type )
/*
* the attach routine.
*/
-static void
-bktr_attach( ATTACH_ARGS )
+static int
+bktr_attach( device_t dev )
{
- bktr_ptr_t bktr;
bt848_ptr_t bt848;
-#ifdef BROOKTREE_IRQ
- u_long old_irq, new_irq;
-#endif
vm_offset_t buf;
u_long latency;
u_long fun;
+ u_long val;
unsigned int rev;
+ unsigned int unit;
+ int error = 0;
+ int rid;
-#ifdef __FreeBSD__
- bktr = &brooktree[unit];
+ struct bktr_softc *bktr = device_get_softc(dev);
+
+ unit = device_get_unit(dev);
if (unit >= NBKTR) {
printf("brooktree%d: attach: only %d units configured.\n",
unit, NBKTR);
printf("brooktree%d: attach: invalid unit number.\n", unit);
- return;
+ return ENXIO;
}
- bktr->tag = tag;
- pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base,
- &bktr->phys_base );
+ /*
+ * Enable bus mastering and Memory Mapped device
+ */
+ val = pci_read_config(dev, PCIR_COMMAND, 4);
+ val |= (PCIM_CMD_MEMEN|PCIM_CMD_BUSMASTEREN);
+ pci_write_config(dev, PCIR_COMMAND, val, 4);
- /* Update the Device Control Register on Bt878 and Bt879 cards */
- fun = pci_conf_read(tag, 0x40);
+ /*
+ * Map control/status registers.
+ */
+ rid = PCI_MAP_REG_START;
+ bktr->res_mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
+ 0, ~0, 1, RF_ACTIVE);
+
+ if (!bktr->res_mem) {
+ device_printf(dev, "could not map memory\n");
+ error = ENXIO;
+ goto fail;
+ }
+ bktr->base = rman_get_virtual(bktr->res_mem); /* XXX use bus_space */
+
+ /*
+ * Allocate our interrupt.
+ */
+ rid = 0;
+ bktr->res_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1,
+ RF_SHAREABLE | RF_ACTIVE);
+ if (bktr->res_irq == NULL) {
+ device_printf(dev, "could not map interrupt\n");
+ error = ENXIO;
+ goto fail;
+ }
+
+ error = bus_setup_intr(dev, bktr->res_irq, INTR_TYPE_NET,
+ bktr_intr, bktr, &bktr->res_ih);
+ if (error) {
+ device_printf(dev, "could not setup irq\n");
+ goto fail;
+
+ }
+
+ /* Disable the brooktree device */
+ bt848 = bktr->base;
+ bt848->int_mask = ALL_INTS_DISABLED;
+ bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+
+ /* Update the Device Control Register */
+ /* on Bt878 and Bt879 cards */
+ fun = pci_read_config( dev, 0x40, 2);
fun = fun | 1; /* Enable writes to the sub-system vendor ID */
#if defined( BKTR_430_FX_MODE )
@@ -1510,7 +1477,7 @@ bktr_attach( ATTACH_ARGS )
fun = fun | 4; /* Enable SiS/VIA compatibility mode (usefull for
OPTi chipset motherboards too */
#endif
- pci_conf_write(tag, 0x40, fun);
+ pci_write_config(dev, 0x40, fun, 2);
/* XXX call bt848_i2c dependent attach() routine */
@@ -1519,30 +1486,7 @@ bktr_attach( ATTACH_ARGS )
printf("bktr%d: i2c_attach: can't attach\n", unit);
#endif
-#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);
-#endif /* __FreeBSD__ */
-#ifdef __bsdi__
- struct isa_attach_args * const ia = (struct isa_attach_args *)aux;
- pci_devaddr_t *tag = (pci_devaddr_t *) ia->ia_aux;
- int unit = bktr->bktr_dev.dv_unit;
-
- bktr = (bktr_reg_t *) self;
- bktr->base = (bt848_ptr_t) bktr_res.pci_vaddr;
- isa_establish(&bktr->bktr_id, &bktr->bktr_dev);
- bktr->bktr_ih.ih_fun = bktr_intr_returning_1;
- bktr->bktr_ih.ih_arg = (void *)bktr;
- intr_establish(ia->ia_irq, &bktr->bktr_ih, DV_DULL);
-#endif /* __bsdi__ */
-
/*
* 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.
@@ -1550,7 +1494,7 @@ bktr_attach( ATTACH_ARGS )
#ifndef BROOKTREE_DEF_LATENCY_VALUE
#define BROOKTREE_DEF_LATENCY_VALUE 10
#endif
- latency = pci_conf_read(tag, PCI_LATENCY_TIMER);
+ latency = pci_read_config(dev, PCI_LATENCY_TIMER, 4);
latency = (latency >> 8) & 0xff;
if ( bootverbose ) {
if (latency)
@@ -1561,7 +1505,7 @@ bktr_attach( ATTACH_ARGS )
}
if ( !latency ) {
latency = BROOKTREE_DEF_LATENCY_VALUE;
- pci_conf_write(tag, PCI_LATENCY_TIMER, latency<<8);
+ pci_write_config(dev, PCI_LATENCY_TIMER, latency<<8, 4);
}
if ( bootverbose ) {
printf(" %d.\n", (int) latency);
@@ -1569,7 +1513,7 @@ bktr_attach( ATTACH_ARGS )
/* allocate space for dma program */
- bktr->dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC);
+ bktr->dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC);
bktr->odd_dma_prog = get_bktr_mem(unit, DMA_PROG_ALLOC);
/* allocate space for pixel buffer */
@@ -1583,31 +1527,27 @@ bktr_attach( ATTACH_ARGS )
unit, BROOKTREE_ALLOC, vtophys(buf));
}
- bktr->bigbuf = buf;
- bktr->alloc_pages = BROOKTREE_ALLOC_PAGES;
-
- fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
- pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 2);
-
if ( buf != 0 ) {
- bzero((caddr_t) buf, BROOKTREE_ALLOC);
- buf = vtophys(buf);
- bktr->flags = METEOR_INITALIZED | METEOR_AUTOMODE |
- METEOR_DEV0 | METEOR_RGB16;
- bktr->dma_prog_loaded = FALSE;
- bktr->cols = 640;
- bktr->rows = 480;
- bktr->frames = 1; /* one frame */
- bktr->format = METEOR_GEO_RGB16;
- bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
- bktr->pixfmt_compat = TRUE;
- bt848 = bktr->base;
- bt848->int_mask = ALL_INTS_DISABLED;
- bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+ bktr->bigbuf = buf;
+ bktr->alloc_pages = BROOKTREE_ALLOC_PAGES;
+ bzero((caddr_t) bktr->bigbuf, BROOKTREE_ALLOC);
+ } else {
+ bktr->alloc_pages = 0;
}
+
- bktr->vbidata = get_bktr_mem(unit, VBI_DATA_SIZE);
+ bktr->flags = METEOR_INITALIZED | METEOR_AUTOMODE |
+ METEOR_DEV0 | METEOR_RGB16;
+ bktr->dma_prog_loaded = FALSE;
+ bktr->cols = 640;
+ bktr->rows = 480;
+ bktr->frames = 1; /* one frame */
+ bktr->format = METEOR_GEO_RGB16;
+ bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
+ bktr->pixfmt_compat = TRUE;
+ /* allocte space for the VBI buffer */
+ bktr->vbidata = get_bktr_mem(unit, VBI_DATA_SIZE);
bktr->vbibuffer = get_bktr_mem(unit, VBI_BUFFER_SIZE);
bktr->vbiinsert = 0;
@@ -1615,9 +1555,10 @@ bktr_attach( ATTACH_ARGS )
bktr->vbisize = 0;
bktr->vbiflags = 0;
- /* read the pci id and determine the card type */
- fun = pci_conf_read(tag, PCI_ID_REG);
- rev = pci_conf_read(tag, PCIR_REVID) & 0x000000ff;
+ /* read the pci device id and revision id */
+ /* and determine the card type */
+ fun = pci_get_devid(dev);
+ rev = pci_get_revid(dev);
switch (fun) {
case BROOKTREE_848_PCI_ID:
@@ -1635,8 +1576,8 @@ bktr_attach( ATTACH_ARGS )
break;
};
-
bktr->clr_on_start = FALSE;
+
/* defaults for the tuner section of the card */
bktr->tflags = TUNER_INITALIZED;
bktr->tuner.frequency = 0;
@@ -1659,14 +1600,60 @@ bktr_attach( ATTACH_ARGS )
DEVFS is finally made really operational. */
devfs_add_devswf(&bktr_cdevsw, unit, DV_CHR, 0, 0, 0444, "bktr%d", unit);
devfs_add_devswf(&bktr_cdevsw, unit+16, DV_CHR, 0, 0, 0444, "tuner%d", unit);
+ devfs_add_devswf(&bktr_cdevsw, unit+32, DV_CHR, 0, 0, 0444, "vbi%d", unit);
#endif /* DEVFS */
-#if __FreeBSD__ > 2
- fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
- pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 4);
-#endif
+ return 0;
+
+fail:
+ return error;
+
+}
+
+/*
+ * the detach routine.
+ */
+static int
+bktr_detach( device_t dev )
+{
+ struct bktr_softc *bktr = device_get_softc(dev);
+ bt848_ptr_t bt848;
+
+ /* Disable the brooktree device */
+ bt848 = bktr->base;
+ bt848->int_mask = ALL_INTS_DISABLED;
+ bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+
+ /* FIXME - Free memory for RISC programs, grab buffer, vbi buffers */
+
+ /*
+ * Deallocate resources.
+ */
+ bus_teardown_intr(dev, bktr->res_irq, bktr->res_ih);
+ bus_release_resource(dev, SYS_RES_IRQ, 0, bktr->res_irq);
+ bus_release_resource(dev, SYS_RES_MEMORY, PCI_MAP_REG_START, bktr->res_mem);
+
+ return 0;
+}
+
+/*
+ * the shutdown routine.
+ */
+static int
+bktr_shutdown( device_t dev )
+{
+ struct bktr_softc *bktr = device_get_softc(dev);
+ bt848_ptr_t bt848;
+
+ /* Disable the brooktree device */
+ bt848 = bktr->base;
+ bt848->int_mask = ALL_INTS_DISABLED;
+ bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
+
+ return 0;
}
+
/* Copy the vbi lines from 'vbidata' into the circular buffer, 'vbibuffer'.
* The circular buffer holds 'n' fixed size data blocks.
* vbisize is the number of bytes in the circular buffer
@@ -1967,16 +1954,25 @@ bktr_open( dev_t dev, int flags, int fmt, struct proc *p )
{
bktr_ptr_t bktr;
int unit;
+ int result;
unit = UNIT( minor(dev) );
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
if (!(bktr->flags & METEOR_INITALIZED)) /* device not found */
return( ENXIO );
+ /* Record that the device is now busy */
+ device_busy(devclass_get_device(bktr_devclass, unit));
+
if (bt848_card != -1) {
if ((bt848_card >> 8 == unit ) &&
@@ -2009,16 +2005,26 @@ bktr_open( dev_t dev, int flags, int fmt, struct proc *p )
switch ( MINOR( minor(dev) ) ) {
case VIDEO_DEV:
- return( video_open( bktr ) );
+ result = video_open( bktr );
+ break;
case TUNER_DEV:
- return( tuner_open( bktr ) );
+ result = tuner_open( bktr );
+ break;
case VBI_DEV:
- return( vbi_open( bktr ) );
+ result = vbi_open( bktr );
+ break;
+
+ default:
+ result = ENXIO;
+ break;
}
- return( ENXIO );
+ /* If there was an error opening the device, undo the busy status */
+ if (result != 0)
+ device_unbusy(devclass_get_device(bktr_devclass, unit));
+ return( result );
}
@@ -2195,26 +2201,39 @@ bktr_close( dev_t dev, int flags, int fmt, struct proc *p )
{
bktr_ptr_t bktr;
int unit;
+ int result;
unit = UNIT( minor(dev) );
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
switch ( MINOR( minor(dev) ) ) {
case VIDEO_DEV:
- return( video_close( bktr ) );
+ result = video_close( bktr );
+ break;
case TUNER_DEV:
- return( tuner_close( bktr ) );
+ result = tuner_close( bktr );
+ break;
case VBI_DEV:
- return( vbi_close( bktr ) );
+ result = vbi_close( bktr );
+ break;
+ default:
+ return (ENXIO);
+ break;
}
- return( ENXIO );
+ device_unbusy(devclass_get_device(bktr_devclass, unit));
+ return( result );
}
@@ -2287,7 +2306,12 @@ bktr_read( dev_t dev, struct uio *uio, int ioflag )
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[unit]);
+ /* 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);
+ }
switch ( MINOR( minor(dev) ) ) {
case VIDEO_DEV:
@@ -2423,7 +2447,12 @@ bktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct proc* pr )
if (unit >= NBKTR) /* unit out of range */
return( ENXIO );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */
return( ENOMEM );
@@ -3592,7 +3621,12 @@ bktr_mmap( dev_t dev, vm_offset_t offset, int nprot )
if (unit >= NBKTR || MINOR(minor(dev)) > 0)/* could this happen here? */
return( -1 );
- bktr = &(brooktree[ unit ]);
+ /* 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);
+ }
if (nprot & PROT_EXEC)
return( -1 );
@@ -5576,9 +5610,9 @@ static int check_for_i2c_devices( bktr_ptr_t bktr ){
int i2c_all_0 = 1;
int i2c_all_absent = 1;
for ( x = 0; x < 128; ++x ) {
- temp_read = i2cRead( bktr, (2 * x) + 1 );
- if (temp_read != 0) i2c_all_0 = 0;
- if (temp_read != ABSENT) i2c_all_absent = 0;
+ temp_read = i2cRead( bktr, (2 * x) + 1 );
+ if (temp_read != 0) i2c_all_0 = 0;
+ if (temp_read != ABSENT) i2c_all_absent = 0;
}
if ((i2c_all_0) || (i2c_all_absent)) return 0;
OpenPOWER on IntegriCloud