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;