Commit 67deed36 authored by Markus Demleitner's avatar Markus Demleitner Committed by Greg Kroah-Hartman

[PATCH] USB: Patch for DSBR-100 driver

I since you are  listed as the maintainer of the USB subsystem and
I can't really see who else applies, I'm sending you a patch to my
driver for the DSBR-100 USB radio.  This is mainly code cosmetics
(fixed ugly missing spaces after commas I inherited from the
aztech driver, some constants moved to preprocessor symbols), but
there's one technical change: I used to stop the radio when my
file descriptor was closed.  Petr Slansky <slansky@usa.net>
pointed out that the other radio drivers don't do that, so
now I just let the radio run.
parent c15fc001
...@@ -33,6 +33,12 @@ ...@@ -33,6 +33,12 @@
History: History:
Version 0.30:
Markus: Updates for 2.5.x kernel and more ISO compiant source
Version 0.25:
PSL and Markus: Cleanup, radio now doesn't stop on device close
Version 0.24: Version 0.24:
Markus: Hope I got these silly VIDEO_TUNER_LOW issues finally Markus: Hope I got these silly VIDEO_TUNER_LOW issues finally
right. Some minor cleanup, improved standalone compilation right. Some minor cleanup, improved standalone compilation
...@@ -69,15 +75,22 @@ ...@@ -69,15 +75,22 @@
/* /*
* Version Information * Version Information
*/ */
#define DRIVER_VERSION "v0.24" #define DRIVER_VERSION "v0.25"
#define DRIVER_AUTHOR "Markus Demleitner <msdemlei@tucana.harvard.edu>" #define DRIVER_AUTHOR "Markus Demleitner <msdemlei@tucana.harvard.edu>"
#define DRIVER_DESC "D-Link DSB-R100 USB radio driver" #define DRIVER_DESC "D-Link DSB-R100 USB FM radio driver"
#define DSB100_VENDOR 0x04b4 #define DSB100_VENDOR 0x04b4
#define DSB100_PRODUCT 0x1002 #define DSB100_PRODUCT 0x1002
#define TB_LEN 16 #define TB_LEN 16
/* Frequency limits in MHz -- these are European values. For Japanese
devices, that would be 76 and 91. */
#define FREQ_MIN 87.5
#define FREQ_MAX 108.0
#define FREQ_MUL 16000
static int usb_dsbr100_probe(struct usb_interface *intf, static int usb_dsbr100_probe(struct usb_interface *intf,
const struct usb_device_id *id); const struct usb_device_id *id);
static void usb_dsbr100_disconnect(struct usb_interface *intf); static void usb_dsbr100_disconnect(struct usb_interface *intf);
...@@ -108,7 +121,7 @@ static struct file_operations usb_dsbr100_fops = { ...@@ -108,7 +121,7 @@ static struct file_operations usb_dsbr100_fops = {
static struct video_device usb_dsbr100_radio= static struct video_device usb_dsbr100_radio=
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "D-Link DSB R-100 USB radio", .name = "D-Link DSB-R 100",
.type = VID_TYPE_TUNER, .type = VID_TYPE_TUNER,
.hardware = VID_HARDWARE_AZTECH, .hardware = VID_HARDWARE_AZTECH,
.fops = &usb_dsbr100_fops, .fops = &usb_dsbr100_fops,
...@@ -189,7 +202,7 @@ static int usb_dsbr100_probe(struct usb_interface *intf, ...@@ -189,7 +202,7 @@ static int usb_dsbr100_probe(struct usb_interface *intf,
return -ENOMEM; return -ENOMEM;
usb_dsbr100_radio.priv = radio; usb_dsbr100_radio.priv = radio;
radio->dev = interface_to_usbdev (intf); radio->dev = interface_to_usbdev (intf);
radio->curfreq = 1454000; radio->curfreq = FREQ_MIN*FREQ_MUL;
usb_set_intfdata (intf, radio); usb_set_intfdata (intf, radio);
return 0; return 0;
} }
...@@ -225,11 +238,11 @@ static int usb_dsbr100_do_ioctl(struct inode *inode, struct file *file, ...@@ -225,11 +238,11 @@ static int usb_dsbr100_do_ioctl(struct inode *inode, struct file *file,
{ {
case VIDIOCGCAP: { case VIDIOCGCAP: {
struct video_capability *v = arg; struct video_capability *v = arg;
memset(v,0,sizeof(*v)); memset(v, 0, sizeof(*v));
v->type=VID_TYPE_TUNER; v->type = VID_TYPE_TUNER;
v->channels=1; v->channels = 1;
v->audios=1; v->audios = 1;
strcpy(v->name, "D-Link R-100 USB Radio"); strcpy(v->name, "D-Link R-100 USB FM Radio");
return 0; return 0;
} }
case VIDIOCGTUNER: { case VIDIOCGTUNER: {
...@@ -237,8 +250,8 @@ static int usb_dsbr100_do_ioctl(struct inode *inode, struct file *file, ...@@ -237,8 +250,8 @@ static int usb_dsbr100_do_ioctl(struct inode *inode, struct file *file,
dsbr100_getstat(radio); dsbr100_getstat(radio);
if(v->tuner) /* Only 1 tuner */ if(v->tuner) /* Only 1 tuner */
return -EINVAL; return -EINVAL;
v->rangelow = 87*16000; v->rangelow = FREQ_MIN*FREQ_MUL;
v->rangehigh = 108*16000; v->rangehigh = FREQ_MAX*FREQ_MUL;
v->flags = VIDEO_TUNER_LOW; v->flags = VIDEO_TUNER_LOW;
v->mode = VIDEO_MODE_AUTO; v->mode = VIDEO_MODE_AUTO;
v->signal = radio->stereo*0x7000; v->signal = radio->stereo*0x7000;
...@@ -268,31 +281,31 @@ static int usb_dsbr100_do_ioctl(struct inode *inode, struct file *file, ...@@ -268,31 +281,31 @@ static int usb_dsbr100_do_ioctl(struct inode *inode, struct file *file,
radio->curfreq = *freq; radio->curfreq = *freq;
if (dsbr100_setfreq(radio, radio->curfreq)==-1) if (dsbr100_setfreq(radio, radio->curfreq)==-1)
warn("set frequency failed"); warn("Set frequency failed");
return 0; return 0;
} }
case VIDIOCGAUDIO: { case VIDIOCGAUDIO: {
struct video_audio *v = arg; struct video_audio *v = arg;
memset(v,0, sizeof(*v)); memset(v, 0, sizeof(*v));
v->flags|=VIDEO_AUDIO_MUTABLE; v->flags |= VIDEO_AUDIO_MUTABLE;
v->mode=VIDEO_SOUND_STEREO; v->mode = VIDEO_SOUND_STEREO;
v->volume=1; v->volume = 1;
v->step=1; v->step = 1;
strcpy(v->name, "Radio"); strcpy(v->name, "Radio");
return 0; return 0;
} }
case VIDIOCSAUDIO: { case VIDIOCSAUDIO: {
struct video_audio *v = arg; struct video_audio *v = arg;
if(v->audio) if (v->audio)
return -EINVAL; return -EINVAL;
if(v->flags&VIDEO_AUDIO_MUTE) { if (v->flags&VIDEO_AUDIO_MUTE) {
if (dsbr100_stop(radio)==-1) if (dsbr100_stop(radio)==-1)
warn("radio did not respond properly"); warn("Radio did not respond properly");
} }
else else
if (dsbr100_start(radio)==-1) if (dsbr100_start(radio)==-1)
warn("radio did not respond properly"); warn("Radio did not respond properly");
return 0; return 0;
} }
default: default:
...@@ -312,18 +325,18 @@ static int usb_dsbr100_open(struct inode *inode, struct file *file) ...@@ -312,18 +325,18 @@ static int usb_dsbr100_open(struct inode *inode, struct file *file)
usb_dsbr100 *radio=dev->priv; usb_dsbr100 *radio=dev->priv;
if (! radio) { if (! radio) {
warn("radio not initialised"); warn("Radio not initialised");
return -EAGAIN; return -EAGAIN;
} }
if(users) if(users)
{ {
warn("radio in use"); warn("Radio in use");
return -EBUSY; return -EBUSY;
} }
users++; users++;
if (dsbr100_start(radio)<0) if (dsbr100_start(radio)<0)
warn("radio did not start up properly"); warn("Radio did not start up properly");
dsbr100_setfreq(radio,radio->curfreq); dsbr100_setfreq(radio, radio->curfreq);
return 0; return 0;
} }
...@@ -335,7 +348,6 @@ static int usb_dsbr100_close(struct inode *inode, struct file *file) ...@@ -335,7 +348,6 @@ static int usb_dsbr100_close(struct inode *inode, struct file *file)
if (!radio) if (!radio)
return -ENODEV; return -ENODEV;
users--; users--;
dsbr100_stop(radio);
return 0; return 0;
} }
...@@ -343,8 +355,9 @@ static int __init dsbr100_init(void) ...@@ -343,8 +355,9 @@ static int __init dsbr100_init(void)
{ {
usb_dsbr100_radio.priv = NULL; usb_dsbr100_radio.priv = NULL;
usb_register(&usb_dsbr100_driver); usb_register(&usb_dsbr100_driver);
if (video_register_device(&usb_dsbr100_radio,VFL_TYPE_RADIO,radio_nr)==-1) { if (video_register_device(&usb_dsbr100_radio, VFL_TYPE_RADIO,
warn("couldn't register video device"); radio_nr)==-1) {
warn("Couldn't register video device");
return -EINVAL; return -EINVAL;
} }
info(DRIVER_VERSION ":" DRIVER_DESC); info(DRIVER_VERSION ":" DRIVER_DESC);
...@@ -367,9 +380,3 @@ module_exit (dsbr100_exit); ...@@ -367,9 +380,3 @@ module_exit (dsbr100_exit);
MODULE_AUTHOR( DRIVER_AUTHOR ); MODULE_AUTHOR( DRIVER_AUTHOR );
MODULE_DESCRIPTION( DRIVER_DESC ); MODULE_DESCRIPTION( DRIVER_DESC );
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/*
vi: ts=8
Sigh. Of course, I am one of the ts=2 heretics, but Linus' wish is
my command.
*/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment