Module Name:    src
Committed By:   jmcneill
Date:           Sat Aug  6 11:51:11 UTC 2011

Modified Files:
        src/sys/dev/pci: coram.c

Log Message:
print devname not subdevname on attach, and report the board name to dtv
subsystem instead of generic CX23885


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pci/coram.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/coram.c
diff -u src/sys/dev/pci/coram.c:1.5 src/sys/dev/pci/coram.c:1.6
--- src/sys/dev/pci/coram.c:1.5	Sat Aug  6 11:37:56 2011
+++ src/sys/dev/pci/coram.c	Sat Aug  6 11:51:11 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: coram.c,v 1.5 2011/08/06 11:37:56 jmcneill Exp $ */
+/* $NetBSD: coram.c,v 1.6 2011/08/06 11:51:11 jmcneill Exp $ */
 
 /*
  * Copyright (c) 2008, 2011 Jonathan A. Kollasch
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: coram.c,v 1.5 2011/08/06 11:37:56 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: coram.c,v 1.6 2011/08/06 11:51:11 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -54,12 +54,21 @@
 /* #define CORAM_DEBUG */
 /* #define CORAM_ATTACH_I2C */
 
+static const struct coram_board {
+	uint16_t vendor;
+	uint16_t product;
+	const char *name;
+} coram_boards[] = {
+	{ PCI_VENDOR_HAUPPAUGE, 0x7911, "Hauppauge HVR-1250" },
+};
+
 static int coram_match(device_t, cfdata_t, void *);
 static void coram_attach(device_t, device_t, void *);
 static int coram_detach(device_t, int);
 static void coram_childdet(device_t, device_t);
 static bool coram_resume(device_t, const pmf_qual_t *);
 static int coram_intr(void *);
+static const struct coram_board * coram_board_lookup(uint16_t, uint16_t);
 
 static int coram_iic_exec(void *, i2c_op_t, i2c_addr_t,
     const void *, size_t, void *, size_t, int);
@@ -119,8 +128,6 @@
 	},
 };
 
-//#define PCI_PRODUCT_CONEXANT_CX23885 0x8852
-
 static const struct dtv_hw_if coram_dtv_if = {
 	.get_devinfo = coram_dtv_get_devinfo,
 	.open = coram_dtv_open,
@@ -137,29 +144,29 @@
 coram_match(device_t parent, cfdata_t match, void *v)
 {
 	const struct pci_attach_args *pa = v;
+	pcireg_t subid;
 
 	if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_CONEXANT)
 		return 0;
+	if (PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_CONEXANT_CX23885)
+		return 0;
 
-	switch (PCI_PRODUCT(pa->pa_id)) {
-	case PCI_PRODUCT_CONEXANT_CX23885:
-		return 1;
-	}
-
-	/* XXX only match supported boards */
+	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
+	if (coram_board_lookup(PCI_VENDOR(subid), PCI_PRODUCT(subid)) == NULL)
+		return 0;
 
-	return 0;
+	return 1;
 }
 
 static void
 coram_attach(device_t parent, device_t self, void *v)
 {
-	struct coram_softc *sc;
+	struct coram_softc *sc = device_private(self);
 	const struct pci_attach_args *pa = v;
 	pci_intr_handle_t ih;
 	pcireg_t reg;
+	char devinfo[256];
 	const char *intrstr;
-	char devinfo[76];
 	struct coram_iic_softc *cic;
 	uint32_t value;
 	int i;
@@ -167,19 +174,15 @@
 	struct i2cbus_attach_args iba;
 #endif
 
-	sc = device_private(self);
-
 	sc->sc_dev = self;
 
 	aprint_naive("\n");
+	pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof(devinfo));
+	aprint_normal(": %s (rev. 0x%02x)\n", devinfo, PCI_REVISION(pa->pa_class));
 
 	reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
-
-	sc->sc_vendor = PCI_VENDOR(reg);
-	sc->sc_product = PCI_PRODUCT(reg);
-
-	pci_devinfo(reg, pa->pa_class, 0, devinfo, sizeof(devinfo));
-	aprint_normal(": %s (rev. 0x%02x)\n", devinfo, PCI_REVISION(pa->pa_class));
+	sc->sc_board = coram_board_lookup(PCI_VENDOR(reg), PCI_PRODUCT(reg));
+	KASSERT(sc->sc_board != NULL);
 
 	if (pci_mapreg_map(pa, CX23885_MMBASE, PCI_MAPREG_TYPE_MEM, 0,
 			   &sc->sc_memt, &sc->sc_memh, NULL, &sc->sc_mems)) {
@@ -360,6 +363,21 @@
 	return 1;
 }
 
+static const struct coram_board *
+coram_board_lookup(uint16_t vendor, uint16_t product)
+{
+	unsigned int i;
+
+	for (i = 0; i < __arraycount(coram_boards); i++) {
+		if (coram_boards[i].vendor == vendor &&
+		    coram_boards[i].product == product) {
+			return &coram_boards[i];
+		}
+	}
+
+	return NULL;
+}
+
 #define CXDTV_TS_RISCI2  (1 << 4)
 #define CXDTV_TS_RISCI1  (1 << 0)
 
@@ -617,8 +635,10 @@
 static void
 coram_dtv_get_devinfo(void *cookie, struct dvb_frontend_info *info)
 {
+	struct coram_softc *sc = cookie;
+
 	memset(info, 0, sizeof(*info));
-	strlcpy(info->name, "CX23885", sizeof(info->name));
+	strlcpy(info->name, sc->sc_board->name, sizeof(info->name));
 	info->type = FE_ATSC;
 	info->frequency_min = 54000000;
 	info->frequency_max = 858000000;

Reply via email to