summaryrefslogtreecommitdiffstats
path: root/sys/dev/bktr
diff options
context:
space:
mode:
authorahasty <ahasty@FreeBSD.org>1998-02-26 08:19:14 +0000
committerahasty <ahasty@FreeBSD.org>1998-02-26 08:19:14 +0000
commit275db989363b2d369cffa61f1477ed64f0e52455 (patch)
tree045050245acb9776932ae821c33f2931c72ce0c9 /sys/dev/bktr
parent4fc0ab87d768cc7a86abd38b1e022daccb8aa649 (diff)
downloadFreeBSD-src-275db989363b2d369cffa61f1477ed64f0e52455.zip
FreeBSD-src-275db989363b2d369cffa61f1477ed64f0e52455.tar.gz
Radio support for bt848 cards from Flemming Jacobsen <fj@trw.nl>
Amancio
Diffstat (limited to 'sys/dev/bktr')
-rw-r--r--sys/dev/bktr/bktr_core.c57
-rw-r--r--sys/dev/bktr/bktr_reg.h2
-rw-r--r--sys/dev/bktr/ioctl_bt848.h5
3 files changed, 46 insertions, 18 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c
index 6c5d016..27e4828 100644
--- a/sys/dev/bktr/bktr_core.c
+++ b/sys/dev/bktr/bktr_core.c
@@ -1,4 +1,4 @@
-/* BT848 1.26 Driver for Brooktree's Bt848 based cards.
+/* BT848 1.27 Driver for Brooktree's Bt848 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The
Philips SAA 7116 and SAA 7196 are very different chipsets than
@@ -215,6 +215,10 @@
section to the tuner_ioctl section
Changed Major device from 79 to 92 and reserved
our Major device number -- hasty@star-gate.com
+1.27 Last batch of patches for radio support from
+ Flemming Jacobsen <fj@trw.nl>.
+ Added B849 PCI ID submitted by:
+ Tomi Vainio <tomppa@fidata.fi>
*/
#define DDB(x) x
@@ -374,11 +378,13 @@ bktr_pci_match(pci_devaddr_t *pa)
unsigned id;
id = pci_inl(pa, PCI_VENDOR_ID);
- if (id != BROOKTREE_848_ID) {
- aprint_debug("bktr_pci_match got %x\n", id);
- return 0;
+
+ if (id == BROOKTREE_848_ID || id == BROOKTREE_849_ID ) {
+ return 1;
}
- 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 */
@@ -657,6 +663,8 @@ static u_long status_sum = 0;
/*
* misc. support routines.
*/
+static const struct CARDTYPE cards[];
+static const struct TUNER tuners[];
static int signCard( bktr_ptr_t bktr, int offset,
int count, u_char* sig );
static void probeCard( bktr_ptr_t bktr, int verbose );
@@ -1262,6 +1270,7 @@ tuner_open( bktr_ptr_t bktr )
return( 0 );
bktr->tflags |= TUNER_OPEN;
+ bktr->tuner.radio_mode = 0;
/* enable drivers on the GPIO port that control the MUXes */
bktr->base->gpio_out_en = GPIO_AUDIOMUX_BITS;
@@ -2238,12 +2247,19 @@ tuner_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
return( EIO );
break;
/* Ioctl's for running the tuner device in radio mode */
-#if 0
- case RADIO_SETMODE: /* XXX Todo: implement me ... */
- break;
- case RADIO_GETFREQ; /* XXX Todo: implement me ... */
+
+ case RADIO_GETMODE:
+ *(unsigned char *)arg = bktr->tuner.radio_mode;
break;
-#endif
+
+ case RADIO_SETMODE:
+ bktr->tuner.radio_mode = *(unsigned char *)arg;
+ break;
+
+ case RADIO_GETFREQ:
+ *(unsigned long *)arg = (bktr->tuner.frequency+407)*5;
+ break;
+
case RADIO_SETFREQ:
/* The argument to this ioctl is NOT freq*16. It is
** freq*100.
@@ -3906,12 +3922,7 @@ static const struct TUNER tuners[] = {
TSA552x_FCONTROL,
TSA552x_RADIO },
{ 0x00, 0x00 }, /* band-switch crosspoints */
- { 0xa0, 0x90, 0x30, 0xa5 } }, /* the band-switch values */
- /* Radio: (for FM1216)
- ** 0xa4 sets radiomode
- ** bit0 - AFC
- ** bit1 - Mono
- ** bit3 - Mute */
+ { 0xa0, 0x90, 0x30, 0xa4 } }, /* the band-switch values */
/* PHILIPS_SECAM */
{ "Philips SECAM", /* the 'name' */
@@ -3920,9 +3931,9 @@ static const struct TUNER tuners[] = {
{ TSA552x_SCONTROL, /* control byte for PLL */
TSA552x_SCONTROL,
TSA552x_SCONTROL,
- 0x00 },
+ TSA552x_RADIO },
{ 0x00, 0x00 }, /* band-switch crosspoints */
- { 0xa0, 0x90, 0x30,0x00 } }, /* the band-switch values */
+ { 0xa0, 0x90, 0x30,0xa4 } }, /* the band-switch values */
/* TEMIC_PAL I */
{ "Temic PAL I", /* the 'name' */
@@ -4459,6 +4470,8 @@ tv_freq( bktr_ptr_t bktr, int frequency )
if(!(band && control)) /* Don't try to set un- */
return(-1); /* supported modes. */
+ if(N==3)
+ band |= bktr->tuner.radio_mode;
/*
* N = 16 * { fRF(pc) + fIF(pc) }
@@ -4620,7 +4633,11 @@ set_audio( bktr_ptr_t bktr, int cmd )
switch (cmd) {
case AUDIO_TUNER:
+#ifdef BKTR_REVERSEMUTE
+ bktr->audio_mux_select = 3;
+#else
bktr->audio_mux_select = 0;
+#endif
break;
case AUDIO_EXTERN:
bktr->audio_mux_select = 1;
@@ -4651,7 +4668,11 @@ set_audio( bktr_ptr_t bktr, int cmd )
bt848->gpio_reg_inp = (~GPIO_AUDIOMUX_BITS & 0xff);
if ( bktr->audio_mute_state == TRUE )
+#ifdef BKTR_REVERSEMUTE
+ idx = 0;
+#else
idx = 3;
+#endif
else
idx = bktr->audio_mux_select;
diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h
index 35ba615..76bd8f0 100644
--- a/sys/dev/bktr/bktr_reg.h
+++ b/sys/dev/bktr/bktr_reg.h
@@ -36,6 +36,7 @@
* Definitions for the Philips SAA7116 digital video to pci interface.
*/
#define BROOKTREE_848_ID 0x0350109E
+#define BROOKTREE 849_ID 0x0351109E
typedef volatile u_int bregister_t;
/*
@@ -304,6 +305,7 @@ struct TVTUNER {
u_char channel;
u_char band;
u_char afc;
+ u_char radio_mode; /* current mode of the radio mode */
};
/* description of the PHYSICAL tuner */
diff --git a/sys/dev/bktr/ioctl_bt848.h b/sys/dev/bktr/ioctl_bt848.h
index 17e57e5..91a0d9b 100644
--- a/sys/dev/bktr/ioctl_bt848.h
+++ b/sys/dev/bktr/ioctl_bt848.h
@@ -202,8 +202,13 @@ struct _bktr_clip {
#define BT848_I2CWR _IOWR('x', 57, u_long) /* i2c read-write */
/* Support for radio tuner */
#define RADIO_SETMODE _IOW('x', 58, unsigned int) /* set radio modes */
+#define RADIO_GETMODE _IOR('x', 58, unsigned char) /* get radio modes */
+#define RADIO_AFC 0x01 /* These modes will probably not */
+#define RADIO_MONO 0x02 /* work on the FRxxxx. It does */
+#define RADIO_MUTE 0x08 /* work on the FMxxxx. */
#define RADIO_SETFREQ _IOW('x', 59, unsigned int) /* set frequency */
#define RADIO_GETFREQ _IOR('x', 59, unsigned int) /* set frequency */
+ /* Argument is frequency*100MHz */
/* XXX - Copied from /sys/pci/brktree_reg.h */
#define BT848_IFORM_FORMAT (0x7<<0)
OpenPOWER on IntegriCloud