1 /* 2 * A driver for the AverMedia MR 800 USB FM radio. This device plugs 3 * into both the USB and an analog audio input, so this thing 4 * only deals with initialization and frequency setting, the 5 * audio data has to be handled by a sound driver. 6 * 7 * Copyright (c) 2008 Alexey Klimov <klimov.linux@gmail.com> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 */ 23 24 /* 25 * Big thanks to authors and contributors of dsbr100.c and radio-si470x.c 26 * 27 * When work was looked pretty good, i discover this: 28 * http://av-usbradio.sourceforge.net/index.php 29 * http://sourceforge.net/projects/av-usbradio/ 30 * Latest release of theirs project was in 2005. 31 * Probably, this driver could be improved trough using their 32 * achievements (specifications given). 33 * Also, Faidon Liambotis <paravoid@debian.org> wrote nice driver for this radio 34 * in 2007. He allowed to use his driver to improve current mr800 radio driver. 35 * http://kerneltrap.org/mailarchive/linux-usb-devel/2007/10/11/342492 36 * 37 * Version 0.01: First working version. 38 * It's required to blacklist AverMedia USB Radio 39 * in usbhid/hid-quirks.c 40 * Version 0.10: A lot of cleanups and fixes: unpluging the device, 41 * few mutex locks were added, codinstyle issues, etc. 42 * Added stereo support. Thanks to 43 * Douglas Schilling Landgraf <dougsland@gmail.com> and 44 * David Ellingsworth <david@identd.dyndns.org> 45 * for discussion, help and support. 46 * Version 0.11: Converted to v4l2_device. 47 * 48 * Many things to do: 49 * - Correct power managment of device (suspend & resume) 50 * - Add code for scanning and smooth tuning 51 * - Add code for sensitivity value 52 * - Correct mistakes 53 * - In Japan another FREQ_MIN and FREQ_MAX 54 */ 55 56 /* kernel includes */ 57 #include <linux/kernel.h> 58 #include <linux/module.h> 59 #include <linux/init.h> 60 #include <linux/slab.h> 61 #include <linux/input.h> 62 #include <linux/videodev2.h> 63 #include <media/v4l2-device.h> 64 #include <media/v4l2-ioctl.h> 65 #include <linux/usb.h> 66 #include <linux/version.h> /* for KERNEL_VERSION MACRO */ 67 #include <linux/mutex.h> 68 69 /* driver and module definitions */ 70 #define DRIVER_AUTHOR "Alexey Klimov <klimov.linux@gmail.com>" 71 #define DRIVER_DESC "AverMedia MR 800 USB FM radio driver" 72 #define DRIVER_VERSION "0.11" 73 #define RADIO_VERSION KERNEL_VERSION(0, 1, 1) 74 75 MODULE_AUTHOR(DRIVER_AUTHOR); 76 MODULE_DESCRIPTION(DRIVER_DESC); 77 MODULE_LICENSE("GPL"); 78 79 #define USB_AMRADIO_VENDOR 0x07ca 80 #define USB_AMRADIO_PRODUCT 0xb800 81 82 /* dev_warn macro with driver name */ 83 #define MR800_DRIVER_NAME "radio-mr800" 84 #define amradio_dev_warn(dev, fmt, arg...) \ 85 dev_warn(dev, MR800_DRIVER_NAME " - " fmt, ##arg) 86 87 /* Probably USB_TIMEOUT should be modified in module parameter */ 88 #define BUFFER_LENGTH 8 89 #define USB_TIMEOUT 500 90 91 /* Frequency limits in MHz -- these are European values. For Japanese 92 devices, that would be 76 and 91. */ 93 #define FREQ_MIN 87.5 94 #define FREQ_MAX 108.0 95 #define FREQ_MUL 16000 96 97 /* 98 * Commands that device should understand 99 * List isnt full and will be updated with implementation of new functions 100 */ 101 #define AMRADIO_SET_FREQ 0xa4 102 #define AMRADIO_SET_MUTE 0xab 103 #define AMRADIO_SET_MONO 0xae 104 105 /* Comfortable defines for amradio_set_mute */ 106 #define AMRADIO_START 0x00 107 #define AMRADIO_STOP 0x01 108 109 /* Comfortable defines for amradio_set_stereo */ 110 #define WANT_STEREO 0x00 111 #define WANT_MONO 0x01 112 113 /* module parameter */ 114 static int radio_nr = -1; 115 module_param(radio_nr, int, 0); 116 MODULE_PARM_DESC(radio_nr, "Radio Nr"); 117 118 static int usb_amradio_probe(struct usb_interface *intf, 119 const struct usb_device_id *id); 120 static void usb_amradio_disconnect(struct usb_interface *intf); 121 static int usb_amradio_open(struct file *file); 122 static int usb_amradio_close(struct file *file); 123 static int usb_amradio_suspend(struct usb_interface *intf, 124 pm_message_t message); 125 static int usb_amradio_resume(struct usb_interface *intf); 126 127 /* Data for one (physical) device */ 128 struct amradio_device { 129 /* reference to USB and video device */ 130 struct usb_device *usbdev; 131 struct video_device *videodev; 132 struct v4l2_device v4l2_dev; 133 134 unsigned char *buffer; 135 struct mutex lock; /* buffer locking */ 136 int curfreq; 137 int stereo; 138 int users; 139 int removed; 140 int muted; 141 }; 142 143 /* USB Device ID List */ 144 static struct usb_device_id usb_amradio_device_table[] = { 145 {USB_DEVICE_AND_INTERFACE_INFO(USB_AMRADIO_VENDOR, USB_AMRADIO_PRODUCT, 146 USB_CLASS_HID, 0, 0) }, 147 { } /* Terminating entry */ 148 }; 149 150 MODULE_DEVICE_TABLE(usb, usb_amradio_device_table); 151 152 /* USB subsystem interface */ 153 static struct usb_driver usb_amradio_driver = { 154 .name = MR800_DRIVER_NAME, 155 .probe = usb_amradio_probe, 156 .disconnect = usb_amradio_disconnect, 157 .suspend = usb_amradio_suspend, 158 .resume = usb_amradio_resume, 159 .reset_resume = usb_amradio_resume, 160 .id_table = usb_amradio_device_table, 161 .supports_autosuspend = 0, 162 }; 163 164 /* switch on/off the radio. Send 8 bytes to device */ 165 static int amradio_set_mute(struct amradio_device *radio, char argument) 166 { 167 int retval; 168 int size; 169 170 /* safety check */ 171 if (radio->removed) 172 return -EIO; 173 174 mutex_lock(&radio->lock); 175 176 radio->buffer[0] = 0x00; 177 radio->buffer[1] = 0x55; 178 radio->buffer[2] = 0xaa; 179 radio->buffer[3] = 0x00; 180 radio->buffer[4] = AMRADIO_SET_MUTE; 181 radio->buffer[5] = argument; 182 radio->buffer[6] = 0x00; 183 radio->buffer[7] = 0x00; 184 185 retval = usb_bulk_msg(radio->usbdev, usb_sndintpipe(radio->usbdev, 2), 186 (void *) (radio->buffer), BUFFER_LENGTH, &size, USB_TIMEOUT); 187 188 if (retval < 0 || size != BUFFER_LENGTH) { 189 mutex_unlock(&radio->lock); 190 return retval; 191 } 192 193 radio->muted = argument; 194 195 mutex_unlock(&radio->lock); 196 197 return retval; 198 } 199 200 /* set a frequency, freq is defined by v4l's TUNER_LOW, i.e. 1/16th kHz */ 201 static int amradio_setfreq(struct amradio_device *radio, int freq) 202 { 203 int retval; 204 int size; 205 unsigned short freq_send = 0x10 + (freq >> 3) / 25; 206 207 /* safety check */ 208 if (radio->removed) 209 return -EIO; 210 211 mutex_lock(&radio->lock); 212 213 radio->buffer[0] = 0x00; 214 radio->buffer[1] = 0x55; 215 radio->buffer[2] = 0xaa; 216 radio->buffer[3] = 0x03; 217 radio->buffer[4] = AMRADIO_SET_FREQ; 218 radio->buffer[5] = 0x00; 219 radio->buffer[6] = 0x00; 220 radio->buffer[7] = 0x08; 221 222 retval = usb_bulk_msg(radio->usbdev, usb_sndintpipe(radio->usbdev, 2), 223 (void *) (radio->buffer), BUFFER_LENGTH, &size, USB_TIMEOUT); 224 225 if (retval < 0 || size != BUFFER_LENGTH) { 226 mutex_unlock(&radio->lock); 227 return retval; 228 } 229 230 /* frequency is calculated from freq_send and placed in first 2 bytes */ 231 radio->buffer[0] = (freq_send >> 8) & 0xff; 232 radio->buffer[1] = freq_send & 0xff; 233 radio->buffer[2] = 0x01; 234 radio->buffer[3] = 0x00; 235 radio->buffer[4] = 0x00; 236 /* 5 and 6 bytes of buffer already = 0x00 */ 237 radio->buffer[7] = 0x00; 238 239 retval = usb_bulk_msg(radio->usbdev, usb_sndintpipe(radio->usbdev, 2), 240 (void *) (radio->buffer), BUFFER_LENGTH, &size, USB_TIMEOUT); 241 242 if (retval < 0 || size != BUFFER_LENGTH) { 243 mutex_unlock(&radio->lock); 244 return retval; 245 } 246 247 mutex_unlock(&radio->lock); 248 249 return retval; 250 } 251 252 static int amradio_set_stereo(struct amradio_device *radio, char argument) 253 { 254 int retval; 255 int size; 256 257 /* safety check */ 258 if (radio->removed) 259 return -EIO; 260 261 mutex_lock(&radio->lock); 262 263 radio->buffer[0] = 0x00; 264 radio->buffer[1] = 0x55; 265 radio->buffer[2] = 0xaa; 266 radio->buffer[3] = 0x00; 267 radio->buffer[4] = AMRADIO_SET_MONO; 268 radio->buffer[5] = argument; 269 radio->buffer[6] = 0x00; 270 radio->buffer[7] = 0x00; 271 272 retval = usb_bulk_msg(radio->usbdev, usb_sndintpipe(radio->usbdev, 2), 273 (void *) (radio->buffer), BUFFER_LENGTH, &size, USB_TIMEOUT); 274 275 if (retval < 0 || size != BUFFER_LENGTH) { 276 radio->stereo = -1; 277 mutex_unlock(&radio->lock); 278 return retval; 279 } 280 281 radio->stereo = 1; 282 283 mutex_unlock(&radio->lock); 284 285 return retval; 286 } 287 288 /* Handle unplugging the device. 289 * We call video_unregister_device in any case. 290 * The last function called in this procedure is 291 * usb_amradio_device_release. 292 */ 293 static void usb_amradio_disconnect(struct usb_interface *intf) 294 { 295 struct amradio_device *radio = usb_get_intfdata(intf); 296 297 mutex_lock(&radio->lock); 298 radio->removed = 1; 299 mutex_unlock(&radio->lock); 300 301 usb_set_intfdata(intf, NULL); 302 video_unregister_device(radio->videodev); 303 v4l2_device_disconnect(&radio->v4l2_dev); 304 } 305 306 /* vidioc_querycap - query device capabilities */ 307 static int vidioc_querycap(struct file *file, void *priv, 308 struct v4l2_capability *v) 309 { 310 struct amradio_device *radio = video_drvdata(file); 311 312 strlcpy(v->driver, "radio-mr800", sizeof(v->driver)); 313 strlcpy(v->card, "AverMedia MR 800 USB FM Radio", sizeof(v->card)); 314 usb_make_path(radio->usbdev, v->bus_info, sizeof(v->bus_info)); 315 v->version = RADIO_VERSION; 316 v->capabilities = V4L2_CAP_TUNER; 317 return 0; 318 } 319 320 /* vidioc_g_tuner - get tuner attributes */ 321 static int vidioc_g_tuner(struct file *file, void *priv, 322 struct v4l2_tuner *v) 323 { 324 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 325 int retval; 326 327 /* safety check */ 328 if (radio->removed) 329 return -EIO; 330 331 if (v->index > 0) 332 return -EINVAL; 333 334 /* TODO: Add function which look is signal stereo or not 335 * amradio_getstat(radio); 336 */ 337 338 /* we call amradio_set_stereo to set radio->stereo 339 * Honestly, amradio_getstat should cover this in future and 340 * amradio_set_stereo shouldn't be here 341 */ 342 retval = amradio_set_stereo(radio, WANT_STEREO); 343 if (retval < 0) 344 amradio_dev_warn(&radio->videodev->dev, 345 "set stereo failed\n"); 346 347 strcpy(v->name, "FM"); 348 v->type = V4L2_TUNER_RADIO; 349 v->rangelow = FREQ_MIN * FREQ_MUL; 350 v->rangehigh = FREQ_MAX * FREQ_MUL; 351 v->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO; 352 v->capability = V4L2_TUNER_CAP_LOW; 353 if (radio->stereo) 354 v->audmode = V4L2_TUNER_MODE_STEREO; 355 else 356 v->audmode = V4L2_TUNER_MODE_MONO; 357 v->signal = 0xffff; /* Can't get the signal strength, sad.. */ 358 v->afc = 0; /* Don't know what is this */ 359 return 0; 360 } 361 362 /* vidioc_s_tuner - set tuner attributes */ 363 static int vidioc_s_tuner(struct file *file, void *priv, 364 struct v4l2_tuner *v) 365 { 366 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 367 int retval; 368 369 /* safety check */ 370 if (radio->removed) 371 return -EIO; 372 373 if (v->index > 0) 374 return -EINVAL; 375 376 /* mono/stereo selector */ 377 switch (v->audmode) { 378 case V4L2_TUNER_MODE_MONO: 379 retval = amradio_set_stereo(radio, WANT_MONO); 380 if (retval < 0) 381 amradio_dev_warn(&radio->videodev->dev, 382 "set mono failed\n"); 383 break; 384 case V4L2_TUNER_MODE_STEREO: 385 retval = amradio_set_stereo(radio, WANT_STEREO); 386 if (retval < 0) 387 amradio_dev_warn(&radio->videodev->dev, 388 "set stereo failed\n"); 389 break; 390 default: 391 return -EINVAL; 392 } 393 394 return 0; 395 } 396 397 /* vidioc_s_frequency - set tuner radio frequency */ 398 static int vidioc_s_frequency(struct file *file, void *priv, 399 struct v4l2_frequency *f) 400 { 401 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 402 int retval; 403 404 /* safety check */ 405 if (radio->removed) 406 return -EIO; 407 408 mutex_lock(&radio->lock); 409 radio->curfreq = f->frequency; 410 mutex_unlock(&radio->lock); 411 412 retval = amradio_setfreq(radio, radio->curfreq); 413 if (retval < 0) 414 amradio_dev_warn(&radio->videodev->dev, 415 "set frequency failed\n"); 416 return 0; 417 } 418 419 /* vidioc_g_frequency - get tuner radio frequency */ 420 static int vidioc_g_frequency(struct file *file, void *priv, 421 struct v4l2_frequency *f) 422 { 423 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 424 425 /* safety check */ 426 if (radio->removed) 427 return -EIO; 428 429 f->type = V4L2_TUNER_RADIO; 430 f->frequency = radio->curfreq; 431 return 0; 432 } 433 434 /* vidioc_queryctrl - enumerate control items */ 435 static int vidioc_queryctrl(struct file *file, void *priv, 436 struct v4l2_queryctrl *qc) 437 { 438 switch (qc->id) { 439 case V4L2_CID_AUDIO_MUTE: 440 return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1); 441 } 442 443 return -EINVAL; 444 } 445 446 /* vidioc_g_ctrl - get the value of a control */ 447 static int vidioc_g_ctrl(struct file *file, void *priv, 448 struct v4l2_control *ctrl) 449 { 450 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 451 452 /* safety check */ 453 if (radio->removed) 454 return -EIO; 455 456 switch (ctrl->id) { 457 case V4L2_CID_AUDIO_MUTE: 458 ctrl->value = radio->muted; 459 return 0; 460 } 461 return -EINVAL; 462 } 463 464 /* vidioc_s_ctrl - set the value of a control */ 465 static int vidioc_s_ctrl(struct file *file, void *priv, 466 struct v4l2_control *ctrl) 467 { 468 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 469 int retval; 470 471 /* safety check */ 472 if (radio->removed) 473 return -EIO; 474 475 switch (ctrl->id) { 476 case V4L2_CID_AUDIO_MUTE: 477 if (ctrl->value) { 478 retval = amradio_set_mute(radio, AMRADIO_STOP); 479 if (retval < 0) { 480 amradio_dev_warn(&radio->videodev->dev, 481 "amradio_stop failed\n"); 482 return -1; 483 } 484 } else { 485 retval = amradio_set_mute(radio, AMRADIO_START); 486 if (retval < 0) { 487 amradio_dev_warn(&radio->videodev->dev, 488 "amradio_start failed\n"); 489 return -1; 490 } 491 } 492 return 0; 493 } 494 return -EINVAL; 495 } 496 497 /* vidioc_g_audio - get audio attributes */ 498 static int vidioc_g_audio(struct file *file, void *priv, 499 struct v4l2_audio *a) 500 { 501 if (a->index > 1) 502 return -EINVAL; 503 504 strcpy(a->name, "Radio"); 505 a->capability = V4L2_AUDCAP_STEREO; 506 return 0; 507 } 508 509 /* vidioc_s_audio - set audio attributes */ 510 static int vidioc_s_audio(struct file *file, void *priv, 511 struct v4l2_audio *a) 512 { 513 if (a->index != 0) 514 return -EINVAL; 515 return 0; 516 } 517 518 /* vidioc_g_input - get input */ 519 static int vidioc_g_input(struct file *filp, void *priv, unsigned int *i) 520 { 521 *i = 0; 522 return 0; 523 } 524 525 /* vidioc_s_input - set input */ 526 static int vidioc_s_input(struct file *filp, void *priv, unsigned int i) 527 { 528 if (i != 0) 529 return -EINVAL; 530 return 0; 531 } 532 533 /* open device - amradio_start() and amradio_setfreq() */ 534 static int usb_amradio_open(struct file *file) 535 { 536 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 537 int retval; 538 539 lock_kernel(); 540 541 radio->users = 1; 542 radio->muted = 1; 543 544 retval = amradio_set_mute(radio, AMRADIO_START); 545 if (retval < 0) { 546 amradio_dev_warn(&radio->videodev->dev, 547 "radio did not start up properly\n"); 548 radio->users = 0; 549 unlock_kernel(); 550 return -EIO; 551 } 552 553 retval = amradio_set_stereo(radio, WANT_STEREO); 554 if (retval < 0) 555 amradio_dev_warn(&radio->videodev->dev, 556 "set stereo failed\n"); 557 558 retval = amradio_setfreq(radio, radio->curfreq); 559 if (retval < 0) 560 amradio_dev_warn(&radio->videodev->dev, 561 "set frequency failed\n"); 562 563 unlock_kernel(); 564 return 0; 565 } 566 567 /*close device */ 568 static int usb_amradio_close(struct file *file) 569 { 570 struct amradio_device *radio = video_get_drvdata(video_devdata(file)); 571 int retval; 572 573 if (!radio) 574 return -ENODEV; 575 576 mutex_lock(&radio->lock); 577 radio->users = 0; 578 mutex_unlock(&radio->lock); 579 580 if (!radio->removed) { 581 retval = amradio_set_mute(radio, AMRADIO_STOP); 582 if (retval < 0) 583 amradio_dev_warn(&radio->videodev->dev, 584 "amradio_stop failed\n"); 585 } 586 587 return 0; 588 } 589 590 /* Suspend device - stop device. Need to be checked and fixed */ 591 static int usb_amradio_suspend(struct usb_interface *intf, pm_message_t message) 592 { 593 struct amradio_device *radio = usb_get_intfdata(intf); 594 int retval; 595 596 retval = amradio_set_mute(radio, AMRADIO_STOP); 597 if (retval < 0) 598 dev_warn(&intf->dev, "amradio_stop failed\n"); 599 600 dev_info(&intf->dev, "going into suspend..\n"); 601 602 return 0; 603 } 604 605 /* Resume device - start device. Need to be checked and fixed */ 606 static int usb_amradio_resume(struct usb_interface *intf) 607 { 608 struct amradio_device *radio = usb_get_intfdata(intf); 609 int retval; 610 611 retval = amradio_set_mute(radio, AMRADIO_START); 612 if (retval < 0) 613 dev_warn(&intf->dev, "amradio_start failed\n"); 614 615 dev_info(&intf->dev, "coming out of suspend..\n"); 616 617 return 0; 618 } 619 620 /* File system interface */ 621 static const struct v4l2_file_operations usb_amradio_fops = { 622 .owner = THIS_MODULE, 623 .open = usb_amradio_open, 624 .release = usb_amradio_close, 625 .ioctl = video_ioctl2, 626 }; 627 628 static const struct v4l2_ioctl_ops usb_amradio_ioctl_ops = { 629 .vidioc_querycap = vidioc_querycap, 630 .vidioc_g_tuner = vidioc_g_tuner, 631 .vidioc_s_tuner = vidioc_s_tuner, 632 .vidioc_g_frequency = vidioc_g_frequency, 633 .vidioc_s_frequency = vidioc_s_frequency, 634 .vidioc_queryctrl = vidioc_queryctrl, 635 .vidioc_g_ctrl = vidioc_g_ctrl, 636 .vidioc_s_ctrl = vidioc_s_ctrl, 637 .vidioc_g_audio = vidioc_g_audio, 638 .vidioc_s_audio = vidioc_s_audio, 639 .vidioc_g_input = vidioc_g_input, 640 .vidioc_s_input = vidioc_s_input, 641 }; 642 643 static void usb_amradio_video_device_release(struct video_device *videodev) 644 { 645 struct amradio_device *radio = video_get_drvdata(videodev); 646 647 /* we call v4l to free radio->videodev */ 648 video_device_release(videodev); 649 650 v4l2_device_unregister(&radio->v4l2_dev); 651 652 /* free rest memory */ 653 kfree(radio->buffer); 654 kfree(radio); 655 } 656 657 /* check if the device is present and register with v4l and usb if it is */ 658 static int usb_amradio_probe(struct usb_interface *intf, 659 const struct usb_device_id *id) 660 { 661 struct amradio_device *radio; 662 struct v4l2_device *v4l2_dev; 663 int retval; 664 665 radio = kzalloc(sizeof(struct amradio_device), GFP_KERNEL); 666 667 if (!radio) { 668 dev_err(&intf->dev, "kmalloc for amradio_device failed\n"); 669 return -ENOMEM; 670 } 671 672 radio->buffer = kmalloc(BUFFER_LENGTH, GFP_KERNEL); 673 674 if (!radio->buffer) { 675 dev_err(&intf->dev, "kmalloc for radio->buffer failed\n"); 676 kfree(radio); 677 return -ENOMEM; 678 } 679 680 v4l2_dev = &radio->v4l2_dev; 681 retval = v4l2_device_register(&intf->dev, v4l2_dev); 682 if (retval < 0) { 683 dev_err(&intf->dev, "couldn't register v4l2_device\n"); 684 kfree(radio->buffer); 685 kfree(radio); 686 return retval; 687 } 688 689 radio->videodev = video_device_alloc(); 690 691 if (!radio->videodev) { 692 dev_err(&intf->dev, "video_device_alloc failed\n"); 693 kfree(radio->buffer); 694 kfree(radio); 695 return -ENOMEM; 696 } 697 698 strlcpy(radio->videodev->name, v4l2_dev->name, sizeof(radio->videodev->name)); 699 radio->videodev->v4l2_dev = v4l2_dev; 700 radio->videodev->fops = &usb_amradio_fops; 701 radio->videodev->ioctl_ops = &usb_amradio_ioctl_ops; 702 radio->videodev->release = usb_amradio_video_device_release; 703 704 radio->removed = 0; 705 radio->users = 0; 706 radio->usbdev = interface_to_usbdev(intf); 707 radio->curfreq = 95.16 * FREQ_MUL; 708 radio->stereo = -1; 709 710 mutex_init(&radio->lock); 711 712 video_set_drvdata(radio->videodev, radio); 713 714 retval = video_register_device(radio->videodev, VFL_TYPE_RADIO, radio_nr); 715 if (retval < 0) { 716 dev_err(&intf->dev, "could not register video device\n"); 717 video_device_release(radio->videodev); 718 v4l2_device_unregister(v4l2_dev); 719 kfree(radio->buffer); 720 kfree(radio); 721 return -EIO; 722 } 723 724 usb_set_intfdata(intf, radio); 725 return 0; 726 } 727 728 static int __init amradio_init(void) 729 { 730 int retval = usb_register(&usb_amradio_driver); 731 732 pr_info(KBUILD_MODNAME 733 ": version " DRIVER_VERSION " " DRIVER_DESC "\n"); 734 735 if (retval) 736 pr_err(KBUILD_MODNAME 737 ": usb_register failed. Error number %d\n", retval); 738 739 return retval; 740 } 741 742 static void __exit amradio_exit(void) 743 { 744 usb_deregister(&usb_amradio_driver); 745 } 746 747 module_init(amradio_init); 748 module_exit(amradio_exit); 749 750