patch-2.4.21 linux-2.4.21/drivers/usb/dsbr100.c
Next file: linux-2.4.21/drivers/usb/hc_sl811.c
Previous file: linux-2.4.21/drivers/usb/devio.c
Back to the patch index
Back to the overall index
- Lines: 178
- Date:
2003-06-13 07:51:36.000000000 -0700
- Orig file:
linux-2.4.20/drivers/usb/dsbr100.c
- Orig date:
2001-10-09 15:15:02.000000000 -0700
diff -urN linux-2.4.20/drivers/usb/dsbr100.c linux-2.4.21/drivers/usb/dsbr100.c
@@ -33,6 +33,9 @@
History:
+ Version 0.25:
+ PSL and Markus: Cleanup, radio now doesn't stop on device close
+
Version 0.24:
Markus: Hope I got these silly VIDEO_TUNER_LOW issues finally
right. Some minor cleanup, improved standalone compilation
@@ -69,15 +72,21 @@
/*
* Version Information
*/
-#define DRIVER_VERSION "v0.24"
+#define DRIVER_VERSION "v0.25"
#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_PRODUCT 0x1002
#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 void *usb_dsbr100_probe(struct usb_device *dev, unsigned int ifnum,
const struct usb_device_id *id);
static void usb_dsbr100_disconnect(struct usb_device *dev, void *ptr);
@@ -90,7 +99,7 @@
MODULE_PARM(radio_nr, "i");
typedef struct
-{ struct urb readurb,writeurb;
+{ struct urb readurb, writeurb;
struct usb_device *dev;
unsigned char transfer_buffer[TB_LEN];
int curfreq;
@@ -98,10 +107,13 @@
int ifnum;
} usb_dsbr100;
+/* D-Link DSB-R100 and D-Link DRU-R100 are very similar products,
+ * both works with this driver. I don't know about any difference.
+ * */
-static struct video_device usb_dsbr100_radio=
+static struct video_device usb_dsbr100_radio =
{
- name: "D-Link DSB R-100 USB radio",
+ name: "D-Link DSB R-100 USB FM radio",
type: VID_TYPE_TUNER,
hardware: VID_HARDWARE_AZTECH,
open: usb_dsbr100_open,
@@ -152,9 +164,9 @@
static int dsbr100_setfreq(usb_dsbr100 *radio, int freq)
{
- freq = (freq/16*80)/1000+856;
+ int rfreq = (freq/16*80)/1000+856;
if (usb_control_msg(radio->dev, usb_rcvctrlpipe(radio->dev, 0),
- 0x01, 0xC0, (freq>>8)&0x00ff, freq&0xff,
+ 0x01, 0xC0, (rfreq>>8)&0x00ff, rfreq&0xff,
radio->transfer_buffer, 8, 300)<0 ||
usb_control_msg(radio->dev, usb_rcvctrlpipe(radio->dev, 0),
0x00, 0xC0, 0x96, 0xB7, radio->transfer_buffer, 8, 300)<0 ||
@@ -182,12 +194,12 @@
{
usb_dsbr100 *radio;
- if (!(radio = kmalloc(sizeof(usb_dsbr100),GFP_KERNEL)))
+ if (!(radio = kmalloc(sizeof(usb_dsbr100), GFP_KERNEL)))
return NULL;
usb_dsbr100_radio.priv = radio;
radio->dev = dev;
radio->ifnum = ifnum;
- radio->curfreq = 1454000;
+ radio->curfreq = FREQ_MIN*FREQ_MUL;
return (void*)radio;
}
@@ -220,32 +232,31 @@
v.type=VID_TYPE_TUNER;
v.channels=1;
v.audios=1;
- /* No we don't do pictures */
v.maxwidth=0;
v.maxheight=0;
v.minwidth=0;
v.minheight=0;
- strcpy(v.name, "D-Link R-100 USB Radio");
- if(copy_to_user(arg,&v,sizeof(v)))
+ strcpy(v.name, "D-Link R-100 USB FM Radio");
+ if(copy_to_user(arg, &v, sizeof(v)))
return -EFAULT;
return 0;
}
case VIDIOCGTUNER: {
struct video_tuner v;
dsbr100_getstat(radio);
- if(copy_from_user(&v, arg,sizeof(v))!=0)
+ if(copy_from_user(&v, arg, sizeof(v))!=0)
return -EFAULT;
if(v.tuner) /* Only 1 tuner */
return -EINVAL;
- v.rangelow = 87*16000;
- v.rangehigh = 108*16000;
+ v.rangelow = FREQ_MIN*FREQ_MUL;
+ v.rangehigh = FREQ_MAX*FREQ_MUL;
v.flags = VIDEO_TUNER_LOW;
v.mode = VIDEO_MODE_AUTO;
v.signal = radio->stereo*0x7000;
/* Don't know how to get signal strength */
v.flags |= VIDEO_TUNER_STEREO_ON*radio->stereo;
strcpy(v.name, "DSB R-100");
- if(copy_to_user(arg,&v, sizeof(v)))
+ if(copy_to_user(arg, &v, sizeof(v)))
return -EFAULT;
return 0;
}
@@ -276,13 +287,13 @@
case VIDIOCGAUDIO: {
struct video_audio v;
- memset(&v,0, sizeof(v));
+ memset(&v, 0, sizeof(v));
v.flags|=VIDEO_AUDIO_MUTABLE;
v.mode=VIDEO_SOUND_STEREO;
v.volume=1;
v.step=1;
strcpy(v.name, "Radio");
- if(copy_to_user(arg,&v, sizeof(v)))
+ if(copy_to_user(arg, &v, sizeof(v)))
return -EFAULT;
return 0;
}
@@ -325,7 +336,7 @@
MOD_INC_USE_COUNT;
if (dsbr100_start(radio)<0)
warn("radio did not start up properly");
- dsbr100_setfreq(radio,radio->curfreq);
+ dsbr100_setfreq(radio, radio->curfreq);
return 0;
}
@@ -336,7 +347,6 @@
if (!radio)
return;
users--;
- dsbr100_stop(radio);
MOD_DEC_USE_COUNT;
}
@@ -344,7 +354,8 @@
{
usb_dsbr100_radio.priv = NULL;
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,
+ radio_nr)==-1) {
warn("couldn't register video device");
return -EINVAL;
}
@@ -368,9 +379,3 @@
MODULE_AUTHOR( DRIVER_AUTHOR );
MODULE_DESCRIPTION( DRIVER_DESC );
MODULE_LICENSE("GPL");
-
-/*
-vi: ts=8
-Sigh. Of course, I am one of the ts=2 heretics, but Linus' wish is
-my command.
-*/
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)