patch-2.1.110 linux/drivers/char/radio.c
Next file: linux/drivers/char/random.c
Previous file: linux/drivers/char/radio-zoltrix.c
Back to the patch index
Back to the overall index
- Lines: 235
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.1.109/linux/drivers/char/radio.c
- Orig date:
Tue Nov 4 10:23:25 1997
diff -u --recursive --new-file v2.1.109/linux/drivers/char/radio.c linux/drivers/char/radio.c
@@ -1,234 +0,0 @@
-/*
- * Radio Card Device Driver for Linux
- *
- * (c) 1997 Matthew Kirkwood <weejock@ferret.lmh.ox.ac.uk>
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/fs.h>
-
-#include <linux/miscdevice.h>
-
-#include <asm/uaccess.h>
-
-#include <linux/config.h>
-
-#include <linux/radio.h>
-#ifdef CONFIG_RADIO_RTRACK
-#include "rtrack.h"
-#endif
-#ifdef CONFIG_RADIO_WINRADIO
-#include "winradio.h"
-#endif
-
-int radio_open(struct inode *inode, struct file *file);
-int radio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
-
-/* /dev/radio interface */
-static struct file_operations radio_fops = {
- NULL, /* seek */
- NULL, /* read */
- NULL, /* write */
- NULL, /* readdir */
- NULL, /* select */
- &radio_ioctl, /* ioctl */
- NULL, /* mmap */
- &radio_open, /* we're not allowed NULL, it seems... */
- NULL /* release */
-};
-
-static struct miscdevice radio_miscdevice = {
- RADIO_MINOR, /* minor device number */
- "radio", /* title */
- &radio_fops, /* file operations */
- NULL, NULL /* previous and next (not our business) */
-};
-
-
-static struct radio_device *firstdevice, *lastdevice;
-static int numdevices;
-
-__initfunc(void radio_init(void))
-{
- /* register the handler for the device number... */
- if(misc_register(&radio_miscdevice)) {
- printk("radio: couldn't register misc device\n");
- return;
- }
-
- /* do some general initialisation stuff */
- lastdevice = firstdevice = NULL;
- numdevices = 0;
-
-#ifdef CONFIG_RADIO_RTRACK
- radiotrack_init();
-#endif
-#ifdef CONFIG_RADIO_WINRADIO
- printk("oooops. no winradio support yet... :-(\n");
-#endif
-/* etc.... */
-
- printk("radio: registered %d devices\n", numdevices);
-}
-
-
-/* according to drivers/char/misc.c, the "open" call must not be NULL.
- * I'm not sure if I approve, but I didn't write it, so...
- */
-int radio_open(struct inode *inode, struct file *file)
-{
- return 0;
-}
-
-
-/* append a device to the linked list... */
-int radio_add_device(struct radio_device *newdev)
-{
- if(firstdevice == NULL) {
- firstdevice = newdev;
- } else {
- lastdevice->next = newdev;
- }
- lastdevice = newdev; numdevices++;
- newdev->cap->dev_num=numdevices;
- newdev->next = NULL; /* don't need, but... */
- return(numdevices);
-}
-
-struct radio_device *getdev(int index)
-{
-struct radio_device *retval;
-
- if(index > numdevices)
- return NULL; /* let's have a bit less of that */
-
- retval = firstdevice;
- for(;index;index--)
- retval = retval->next;
-
- return retval;
-}
-
-
-/* interface routine */
-int radio_ioctl(struct inode *inode, struct file *file,
- unsigned int cmd, unsigned long arg)
-{
-struct radio_device *dev;
-struct radio_ctl *ctl_arg = (struct radio_ctl*)arg;
-int nowrite;
-int val, ret;
-
- if((void*)arg == NULL)
- return -EFAULT; /* XXX - check errnos are OK */
-
-
- switch(cmd) {
- case RADIO_NUMDEVS:
- return (put_user(numdevices,(int*)arg) ? -EFAULT : 0);
-
-
- case RADIO_GETCAPS:
- /* p'raps I should verify for read then write ?? */
- if(verify_area(VERIFY_WRITE, (void*)arg, sizeof(struct radio_cap)))
- return -EFAULT;
- if((dev = getdev(((struct radio_cap*)arg)->dev_num)) == NULL)
- return -EINVAL;
- copy_to_user((void*)arg, dev->cap, sizeof(struct radio_cap));
- return 0;
-
-
- case RADIO_GETBNDCAP:
- if(verify_area(VERIFY_WRITE, (void*)arg, sizeof(struct radio_band)))
- return -EFAULT;
-
- if((dev = getdev(((struct radio_band*)arg)->dev_num)) == NULL)
- return -EINVAL;
-
- val = ((struct radio_band*)arg)->index;
- if(val >= dev->cap->num_bwidths)
- return -EINVAL; /* XXX errno */
-
- copy_to_user((void*)arg, (dev->bands)+(val*sizeof(struct radio_band)),
- sizeof(struct radio_band));
- return 0;
- }
-
-
-/* now, we know that arg points to a struct radio_ctl */
- /* get the requested device */
- if(verify_area(VERIFY_READ, ctl_arg, sizeof(struct radio_ctl)))
- return -EFAULT;
-
- if((dev = getdev(ctl_arg->dev_num)) == NULL)
- return -EINVAL;
-
- nowrite = verify_area(VERIFY_WRITE, ctl_arg, sizeof(struct radio_ctl));
-
- val = ctl_arg->value;
-
- switch(cmd) {
- case RADIO_SETVOL:
- if((val < dev->cap->volmin) || (val > dev->cap->volmax))
- return -EINVAL;
- if((ret = (*(dev->setvol))(dev, val)))
- return ret;
- dev->curvol = val;
- return 0;
-
- case RADIO_GETVOL:
- if(nowrite)
- return -EFAULT;
- ctl_arg->value = dev->curvol;
- return 0;
-
-
- case RADIO_SETBAND:
- if(val >= dev->cap->num_bwidths)
- return -EINVAL;
- if((ret = (*(dev->setband))(dev, val)))
- return ret;
- dev->curband = val;
- return 0;
-
- case RADIO_GETBAND:
- if(nowrite)
- return -EFAULT;
- ctl_arg->value = dev->curband;
- return 0;
-
-
- case RADIO_SETFREQ: {
- struct radio_band *bp;
-
- bp = (dev->bands) + ((dev->curband) * sizeof(struct radio_band));
- if((val < bp->freqmin) || (val > bp->freqmax))
- return -EINVAL;
- if((ret = (*(dev->setfreq))(dev, val)))
- return ret;
- dev->curfreq = val;
- return 0;
- }
-
- case RADIO_GETFREQ:
- if(nowrite)
- return -EFAULT;
- ctl_arg->value = dev->curfreq;
- return 0;
-
-
- case RADIO_GETSIGSTR:
- if(nowrite)
- return -EFAULT;
- ctl_arg->value = (*(dev->getsigstr))(dev);
- return 0;
-
-
- default:
- return -ENOSYS;
- }
-}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov