summaryrefslogtreecommitdiff
path: root/sys/dev/radio.c
diff options
context:
space:
mode:
authorGrigoriy Orlov <gluk@cvs.openbsd.org>2001-10-04 19:18:01 +0000
committerGrigoriy Orlov <gluk@cvs.openbsd.org>2001-10-04 19:18:01 +0000
commit7edbc4af941083c1b1a127ec9fb8813c69d7af18 (patch)
tree346257fa52f642de9f862fdd296e1797b8a735ba /sys/dev/radio.c
parent588130b0936b03c0394bf9c9315da83dd3fa86ee (diff)
Device independent framework for FM-radio driver.
Work by Maxim Tsyplakov <tm@oganer.net>, Vladimir Popov <jumbo@narod.ru>
Diffstat (limited to 'sys/dev/radio.c')
-rw-r--r--sys/dev/radio.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/sys/dev/radio.c b/sys/dev/radio.c
new file mode 100644
index 00000000000..a63d5830185
--- /dev/null
+++ b/sys/dev/radio.c
@@ -0,0 +1,136 @@
+/* $OpenBSD: radio.c,v 1.1 2001/10/04 19:18:00 gluk Exp $ */
+/* $RuOBSD: radio.c,v 1.5 2001/09/30 14:52:49 pva Exp $ */
+
+/*
+ * Copyright (c) 2001 Maxim Tsyplakov <tm@oganer.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* This is /dev/radio driver for OpenBSD */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/ioctl.h>
+#include <sys/device.h>
+#include <sys/radioio.h>
+#include <dev/radio_if.h>
+#include <dev/radiovar.h>
+
+int radioprobe(struct device *, void *, void *);
+void radioattach(struct device *, struct device *, void *);
+int radioopen(dev_t, int, int, struct proc *);
+int radioclose(dev_t, int, int, struct proc *);
+int radioioctl(dev_t, u_long, caddr_t, int, struct proc *);
+int radioprint(void *, const char *);
+
+struct cfattach radio_ca = {
+ sizeof(struct radio_softc), radioprobe, radioattach,
+ NULL, NULL
+};
+
+struct cfdriver radio_cd = {
+ NULL, "radio", DV_DULL
+};
+
+int
+radioprobe(struct device *parent, void *match, void *aux)
+{
+ printf("\n"); /* stub!?, fixme */
+ return 1;
+}
+
+void
+radioattach(struct device *parent, struct device *self, void *aux)
+{
+ struct radio_softc *sc = (void *) self;
+ struct radio_attach_args *sa = aux;
+ struct radio_hw_if *hwp = sa->hwif;
+ void *hdlp = sa->hdl;
+
+ printf("\n");
+ sc->hw_if = hwp;
+ sc->hw_hdl = hdlp;
+ sc->sc_dev = parent;
+}
+
+int
+radioopen(dev_t dev, int flags, int fmt, struct proc *p)
+{
+ int unit;
+ struct radio_softc *sc;
+
+ unit = RADIOUNIT(dev);
+ if (unit >= radio_cd.cd_ndevs ||
+ (sc = radio_cd.cd_devs[unit]) == NULL ||
+ sc->hw_if == NULL)
+ return (ENXIO);
+ else
+ return (sc->hw_if->open(dev, flags, fmt, p));
+}
+
+int
+radioclose(dev_t dev, int flags, int fmt, struct proc *p)
+{
+ struct radio_softc *sc;
+
+ sc = radio_cd.cd_devs[RADIOUNIT(dev)];
+ return (sc->hw_if->close(dev, flags, fmt, p));
+}
+
+int
+radioioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
+{
+ int unit;
+ struct radio_softc *sc;
+
+ unit = RADIOUNIT(dev);
+ if (unit >= radio_cd.cd_ndevs ||
+ (sc = radio_cd.cd_devs[unit]) == NULL ||
+ sc->hw_if == NULL)
+ return (ENXIO);
+ else
+ return (sc->hw_if->ioctl(dev, cmd, data, flags, p));
+}
+
+/*
+ * Called from hardware driver. This is where the MI radio driver gets
+ * probed/attached to the hardware driver
+ */
+
+struct device *
+radio_attach_mi(struct radio_hw_if *rhwp, void *hdlp, struct device *dev)
+{
+ struct radio_attach_args arg;
+
+ arg.hwif = rhwp;
+ arg.hdl = hdlp;
+ return (config_found(dev, &arg, radioprint));
+}
+
+int
+radioprint(void *aux, const char *pnp)
+{
+ return UNCONF;
+}