[BACK]Return to radio.c CVS log [TXT][DIR] Up to [local] / sys / dev

Annotation of sys/dev/radio.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: radio.c,v 1.7 2006/06/23 06:27:11 miod Exp $ */
                      2: /* $RuOBSD: radio.c,v 1.7 2001/12/04 06:03:05 tm Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 2001 Maxim Tsyplakov <tm@oganer.net>
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     19:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     20:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
                     21:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     22:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
                     23:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
                     24:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
                     25:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
                     26:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     27:  */
                     28:
                     29: /* This is /dev/radio driver for OpenBSD */
                     30:
                     31: #include <sys/param.h>
                     32: #include <sys/systm.h>
                     33: #include <sys/proc.h>
                     34: #include <sys/errno.h>
                     35: #include <sys/ioctl.h>
                     36: #include <sys/fcntl.h>
                     37: #include <sys/device.h>
                     38: #include <sys/vnode.h>
                     39: #include <sys/radioio.h>
                     40: #include <sys/conf.h>
                     41:
                     42: #include <dev/audio_if.h>
                     43: #include <dev/radio_if.h>
                     44: #include <dev/radiovar.h>
                     45:
                     46: int    radioprobe(struct device *, void *, void *);
                     47: void   radioattach(struct device *, struct device *, void *);
                     48: int    radiodetach(struct device *, int);
                     49: int    radioactivate(struct device *, enum devact);
                     50: int    radioprint(void *, const char *);
                     51:
                     52: struct cfattach radio_ca = {
                     53:        sizeof(struct radio_softc), radioprobe, radioattach,
                     54:        radiodetach, radioactivate
                     55: };
                     56:
                     57: struct cfdriver radio_cd = {
                     58:        NULL, "radio", DV_DULL
                     59: };
                     60:
                     61: int
                     62: radioprobe(struct device *parent, void *match, void *aux)
                     63: {
                     64:        struct audio_attach_args *sa = aux;
                     65:        return (sa->type == AUDIODEV_TYPE_RADIO) ? 1 : 0;
                     66: }
                     67:
                     68: void
                     69: radioattach(struct device *parent, struct device *self, void *aux)
                     70: {
                     71:        struct radio_softc *sc = (void *) self;
                     72:        struct audio_attach_args *sa = aux;
                     73:
                     74:        printf("\n");
                     75:        sc->hw_if = sa->hwif;
                     76:        sc->hw_hdl = sa->hdl;
                     77:        sc->sc_dev = parent;
                     78: }
                     79:
                     80: int
                     81: radioopen(dev_t dev, int flags, int fmt, struct proc *p)
                     82: {
                     83:        int     unit;
                     84:        struct radio_softc *sc;
                     85:
                     86:        unit = RADIOUNIT(dev);
                     87:        if (unit >= radio_cd.cd_ndevs ||
                     88:            (sc = radio_cd.cd_devs[unit]) == NULL ||
                     89:             sc->hw_if == NULL)
                     90:                return (ENXIO);
                     91:
                     92:        if (sc->hw_if->open != NULL)
                     93:                return (sc->hw_if->open(sc->hw_hdl, flags, fmt, p));
                     94:        else
                     95:                return (0);
                     96: }
                     97:
                     98: int
                     99: radioclose(dev_t dev, int flags, int fmt, struct proc *p)
                    100: {
                    101:        struct radio_softc *sc;
                    102:
                    103:        sc = radio_cd.cd_devs[RADIOUNIT(dev)];
                    104:
                    105:        if (sc->hw_if->close != NULL)
                    106:                return (sc->hw_if->close(sc->hw_hdl, flags, fmt, p));
                    107:        else
                    108:                return (0);
                    109: }
                    110:
                    111: int
                    112: radioioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
                    113: {
                    114:        struct radio_softc *sc;
                    115:        int unit, error;
                    116:
                    117:        unit = RADIOUNIT(dev);
                    118:        if (unit >= radio_cd.cd_ndevs ||
                    119:            (sc = radio_cd.cd_devs[unit]) == NULL || sc->hw_if == NULL)
                    120:                return (ENXIO);
                    121:
                    122:        error = EOPNOTSUPP;
                    123:        switch (cmd) {
                    124:        case RIOCGINFO:
                    125:                if (sc->hw_if->get_info)
                    126:                        error = (sc->hw_if->get_info)(sc->hw_hdl,
                    127:                                        (struct radio_info *)data);
                    128:                        break;
                    129:        case RIOCSINFO:
                    130:                if (!(flags & FWRITE))
                    131:                        return (EACCES);
                    132:                if (sc->hw_if->set_info)
                    133:                        error = (sc->hw_if->set_info)(sc->hw_hdl,
                    134:                                (struct radio_info *)data);
                    135:                break;
                    136:        case RIOCSSRCH:
                    137:                if (!(flags & FWRITE))
                    138:                        return (EACCES);
                    139:                if (sc->hw_if->search)
                    140:                        error = (sc->hw_if->search)(sc->hw_hdl,
                    141:                                        *(int *)data);
                    142:                break;
                    143:        default:
                    144:                error = (ENOTTY);
                    145:        }
                    146:
                    147:        return (error);
                    148: }
                    149:
                    150: /*
                    151:  * Called from hardware driver. This is where the MI radio driver gets
                    152:  * probed/attached to the hardware driver
                    153:  */
                    154:
                    155: struct device *
                    156: radio_attach_mi(struct radio_hw_if *rhwp, void *hdlp, struct device *dev)
                    157: {
                    158:        struct audio_attach_args arg;
                    159:
                    160:        arg.type = AUDIODEV_TYPE_RADIO;
                    161:        arg.hwif = rhwp;
                    162:        arg.hdl = hdlp;
                    163:        return (config_found(dev, &arg, radioprint));
                    164: }
                    165:
                    166: int
                    167: radioprint(void *aux, const char *pnp)
                    168: {
                    169:        if (pnp != NULL)
                    170:                printf("radio at %s", pnp);
                    171:        return (UNCONF);
                    172: }
                    173:
                    174: int
                    175: radiodetach(struct device *self, int flags)
                    176: {
                    177:        /*struct radio_softc *sc = (struct radio_softc *)self;*/
                    178:        int maj, mn;
                    179:
                    180:        /* locate the major number */
                    181:        for (maj = 0; maj < nchrdev; maj++)
                    182:                if (cdevsw[maj].d_open == radioopen)
                    183:                        break;
                    184:
                    185:        /* Nuke the vnodes for any open instances (calls close). */
                    186:        mn = self->dv_unit;
                    187:        vdevgone(maj, mn, mn, VCHR);
                    188:
                    189:        return (0);
                    190: }
                    191:
                    192: int
                    193: radioactivate(struct device *self, enum devact act)
                    194: {
                    195:        struct radio_softc *sc = (struct radio_softc *)self;
                    196:
                    197:        switch (act) {
                    198:        case DVACT_ACTIVATE:
                    199:                break;
                    200:
                    201:        case DVACT_DEACTIVATE:
                    202:                sc->sc_dying = 1;
                    203:                break;
                    204:        }
                    205:        return (0);
                    206: }

CVSweb