summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorkent <kent@NetBSD.org>2003-12-28 12:31:30 +0000
committerkent <kent@NetBSD.org>2003-12-28 12:31:30 +0000
commita92ed9fb69ca9364c636a712dffd3d01b6151ea7 (patch)
tree916e980bc19016d36cb8aba5345ffb58f46ba21c /sys/dev
parent0a2cc9c4124c52dae2f64934c8071c4bce1519bf (diff)
ICH4/ICH5:
When native i/o mapping fails, try compatible i/o mapping.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pci/auich.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/sys/dev/pci/auich.c b/sys/dev/pci/auich.c
index b581b9b3b34..d7c97ffa6c9 100644
--- a/sys/dev/pci/auich.c
+++ b/sys/dev/pci/auich.c
@@ -1,4 +1,4 @@
-/* $NetBSD: auich.c,v 1.55 2003/11/22 08:49:41 kent Exp $ */
+/* $NetBSD: auich.c,v 1.56 2003/12/28 12:31:30 kent Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -118,7 +118,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: auich.c,v 1.55 2003/11/22 08:49:41 kent Exp $");
+__KERNEL_RCSID(0, "$NetBSD: auich.c,v 1.56 2003/12/28 12:31:30 kent Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -418,15 +418,35 @@ auich_attach(struct device *parent, struct device *self, void *aux)
*/
if (pci_mapreg_map(pa, ICH_MMBAR, PCI_MAPREG_TYPE_MEM, 0,
&sc->iot, &sc->mix_ioh, NULL, &mix_size)) {
- aprint_error("%s: can't map codec i/o space\n",
+ aprint_error("%s: can't map native codec i/o space\n",
sc->sc_dev.dv_xname);
- return;
+ v = pci_conf_read(pa->pa_pc, pa->pa_tag, ICH_CFG);
+ pci_conf_write(pa->pa_pc, pa->pa_tag, ICH_CFG,
+ v | ICH_CFG_IOSE);
+ if (pci_mapreg_map(pa, ICH_NAMBAR, PCI_MAPREG_TYPE_IO,
+ 0, &sc->iot, &sc->mix_ioh, NULL,
+ &mix_size)) {
+ aprint_error("%s: can't map compatible codec "
+ "i/o space\n",
+ sc->sc_dev.dv_xname);
+ return;
+ }
}
if (pci_mapreg_map(pa, ICH_MBBAR, PCI_MAPREG_TYPE_MEM, 0,
&sc->iot, &sc->aud_ioh, NULL, &aud_size)) {
- aprint_error("%s: can't map device i/o space\n",
+ aprint_error("%s: can't map native device i/o space\n",
sc->sc_dev.dv_xname);
- return;
+ v = pci_conf_read(pa->pa_pc, pa->pa_tag, ICH_CFG);
+ pci_conf_write(pa->pa_pc, pa->pa_tag, ICH_CFG,
+ v | ICH_CFG_IOSE);
+ if (pci_mapreg_map(pa, ICH_NABMBAR, PCI_MAPREG_TYPE_IO,
+ 0, &sc->iot, &sc->aud_ioh, NULL,
+ &aud_size)) {
+ aprint_error("%s: can't map compatible device "
+ "i/o space\n",
+ sc->sc_dev.dv_xname);
+ return;
+ }
}
} else {
if (pci_mapreg_map(pa, ICH_NAMBAR, PCI_MAPREG_TYPE_IO, 0,