summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMarc Balmer <mbalmer@cvs.openbsd.org>2006-11-25 17:18:32 +0000
committerMarc Balmer <mbalmer@cvs.openbsd.org>2006-11-25 17:18:32 +0000
commitcc6ba4e27fb495fee747383ec1efbb88cb695c4e (patch)
treeee5029de3ccad37af2cd0f1a490237d8e1498730 /sys
parentdf051cfcc1226d26b85f9ac9aa7c874e9c88ae81 (diff)
Add support for the Quancom PWDOG1 watchdog timer card.
See http://www.quancom.com/ for detailed information on the card. ok deraadt, help and ok uwe
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pci/files.pci7
-rw-r--r--sys/dev/pci/pcidevs6
-rw-r--r--sys/dev/pci/pcidevs.h4
-rw-r--r--sys/dev/pci/pcidevs_data.h8
-rw-r--r--sys/dev/pci/pwdog.c107
5 files changed, 130 insertions, 2 deletions
diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci
index a05da955c0f..18d98f256ed 100644
--- a/sys/dev/pci/files.pci
+++ b/sys/dev/pci/files.pci
@@ -1,4 +1,4 @@
-# $OpenBSD: files.pci,v 1.218 2006/11/19 14:20:55 mglocker Exp $
+# $OpenBSD: files.pci,v 1.219 2006/11/25 17:18:31 mbalmer Exp $
# $NetBSD: files.pci,v 1.20 1996/09/24 17:47:15 christos Exp $
#
# Config file and device description for machine-independent PCI code.
@@ -412,6 +412,11 @@ device wdt: pcibus
attach wdt at pci
file dev/pci/wdt.c wdt needs-flag
+# Quancom PWDOG1
+device pwdog: pcibus
+attach pwdog at pci
+file dev/pci/pwdog.c pwdog
+
# UHCI USB controller
attach uhci at pci with uhci_pci
file dev/pci/uhci_pci.c uhci
diff --git a/sys/dev/pci/pcidevs b/sys/dev/pci/pcidevs
index f7b4c538773..4487f8621f2 100644
--- a/sys/dev/pci/pcidevs
+++ b/sys/dev/pci/pcidevs
@@ -1,4 +1,4 @@
-$OpenBSD: pcidevs,v 1.1193 2006/11/24 18:46:23 brad Exp $
+$OpenBSD: pcidevs,v 1.1194 2006/11/25 17:18:31 mbalmer Exp $
/* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */
/*
@@ -303,6 +303,7 @@ vendor TURTLEBEACH 0x5053 Turtle Beach
vendor S3 0x5333 S3
vendor C4T 0x6374 c't Magazin
vendor DCI 0x6666 Decision Computer Inc
+vendor QUANCOM 0x8008 Quancom Informationssysteme
vendor INTEL 0x8086 Intel
vendor WINBOND2 0x8c4a Winbond
vendor KTI 0x8e2e KTI
@@ -3199,6 +3200,9 @@ product QLOGIC ISP2312 0x2312 ISP2312
product QLOGIC ISP2322 0x2322 ISP2322
product QLOGIC ISP6312 0x6312 ISP6312
+/* Quancom products */
+product QUANCOM PWDOG1 0x0010 PWDOG1
+
/* Quantum Designs products */
product QUANTUMDESIGNS 8500 0x0001 8500
product QUANTUMDESIGNS 8580 0x0002 8580
diff --git a/sys/dev/pci/pcidevs.h b/sys/dev/pci/pcidevs.h
index bb601e3f176..0ef1c5f6b66 100644
--- a/sys/dev/pci/pcidevs.h
+++ b/sys/dev/pci/pcidevs.h
@@ -308,6 +308,7 @@
#define PCI_VENDOR_S3 0x5333 /* S3 */
#define PCI_VENDOR_C4T 0x6374 /* c't Magazin */
#define PCI_VENDOR_DCI 0x6666 /* Decision Computer Inc */
+#define PCI_VENDOR_QUANCOM 0x8008 /* Quancom Informationssysteme */
#define PCI_VENDOR_INTEL 0x8086 /* Intel */
#define PCI_VENDOR_WINBOND2 0x8c4a /* Winbond */
#define PCI_VENDOR_KTI 0x8e2e /* KTI */
@@ -3204,6 +3205,9 @@
#define PCI_PRODUCT_QLOGIC_ISP2322 0x2322 /* ISP2322 */
#define PCI_PRODUCT_QLOGIC_ISP6312 0x6312 /* ISP6312 */
+/* Quancom products */
+#define PCI_PRODUCT_QUANCOM_PWDOG1 0x0010 /* PWDOG1 */
+
/* Quantum Designs products */
#define PCI_PRODUCT_QUANTUMDESIGNS_8500 0x0001 /* 8500 */
#define PCI_PRODUCT_QUANTUMDESIGNS_8580 0x0002 /* 8580 */
diff --git a/sys/dev/pci/pcidevs_data.h b/sys/dev/pci/pcidevs_data.h
index a7e21cca3f5..5f186cddf29 100644
--- a/sys/dev/pci/pcidevs_data.h
+++ b/sys/dev/pci/pcidevs_data.h
@@ -10035,6 +10035,10 @@ static const struct pci_known_product pci_known_products[] = {
"ISP6312",
},
{
+ PCI_VENDOR_QUANCOM, PCI_PRODUCT_QUANCOM_PWDOG1,
+ "PWDOG1",
+ },
+ {
PCI_VENDOR_QUANTUMDESIGNS, PCI_PRODUCT_QUANTUMDESIGNS_8500,
"8500",
},
@@ -13855,6 +13859,10 @@ static const struct pci_known_vendor pci_known_vendors[] = {
"Decision Computer Inc",
},
{
+ PCI_VENDOR_QUANCOM,
+ "Quancom Informationssysteme",
+ },
+ {
PCI_VENDOR_INTEL,
"Intel",
},
diff --git a/sys/dev/pci/pwdog.c b/sys/dev/pci/pwdog.c
new file mode 100644
index 00000000000..b7b9e804986
--- /dev/null
+++ b/sys/dev/pci/pwdog.c
@@ -0,0 +1,107 @@
+/* $OpenBSD: pwdog.c,v 1.1 2006/11/25 17:18:31 mbalmer Exp $ */
+
+/*
+ * Copyright (c) 2006 Marc Balmer <mbalmer@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+#include <sys/systm.h>
+
+#include <machine/bus.h>
+
+#include <dev/pci/pcivar.h>
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcidevs.h>
+
+struct pwdog_softc {
+ struct device pwdog_dev;
+ bus_space_tag_t iot;
+ bus_space_handle_t ioh;
+};
+
+/* registers */
+#define PWDOG_ACTIVATE 0
+#define PWDOG_DISABLE 1
+
+int pwdog_probe(struct device *, void *, void *);
+void pwdog_attach(struct device *, struct device *, void *);
+void pwdog_init_timer(struct pwdog_softc *);
+int pwdog_set_timeout(void *, int);
+void pwdog_disable_timer(struct pwdog_softc *);
+
+struct cfattach pwdog_ca = {
+ sizeof(struct pwdog_softc), pwdog_probe, pwdog_attach
+};
+
+struct cfdriver pwdog_cd = {
+ NULL, "pwdog", DV_DULL
+};
+
+int
+pwdog_probe(struct device *parent, void *match, void *aux)
+{
+ struct pci_attach_args *const pa = (struct pci_attach_args *)aux;
+
+ if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_QUANCOM ||
+ PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_QUANCOM_PWDOG1)
+ return 0;
+ return 1;
+}
+
+void
+pwdog_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct pwdog_softc *pwdog = (struct pwdog_softc *)self;
+ struct pci_attach_args *const pa = (struct pci_attach_args *)aux;
+ bus_size_t iosize;
+
+ if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_IO, 0, &pwdog->iot,
+ &pwdog->ioh, NULL, &iosize, 0)) {
+ printf("\n%s: PCI I/O region not found\n",
+ pwdog->pwdog_dev.dv_xname);
+ return;
+ }
+ pwdog_disable_timer(pwdog);
+ wdog_register(pwdog, pwdog_set_timeout);
+}
+
+/* ARGSUSED */
+int
+pwdog_set_timeout(void *self, int seconds)
+{
+ struct pwdog_softc *pwdog = (struct pwdog_softc *)self;
+ int s;
+
+ s = splclock();
+ pwdog_disable_timer(pwdog);
+ if (!seconds) {
+ splx(s);
+ return 0;
+ }
+ bus_space_write_1(pwdog->iot, pwdog->ioh, PWDOG_ACTIVATE, 0);
+ splx(s);
+ return seconds;
+}
+
+void
+pwdog_disable_timer(struct pwdog_softc *pwdog)
+{
+ bus_space_write_1(pwdog->iot, pwdog->ioh, PWDOG_DISABLE, 0);
+}