1 /* 2 * drivers/media/radio/si470x/radio-si470x-usb.c 3 * 4 * USB driver for radios with Silicon Labs Si470x FM Radio Receivers 5 * 6 * Copyright (c) 2009 Tobias Lorenz <tobias.lorenz@gmx.net> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 */ 18 19 20 /* 21 * ToDo: 22 * - add firmware download/update support 23 */ 24 25 26 /* driver definitions */ 27 #define DRIVER_AUTHOR "Tobias Lorenz <tobias.lorenz@gmx.net>" 28 #define DRIVER_CARD "Silicon Labs Si470x FM Radio Receiver" 29 #define DRIVER_DESC "USB radio driver for Si470x FM Radio Receivers" 30 #define DRIVER_VERSION "1.0.10" 31 32 /* kernel includes */ 33 #include <linux/usb.h> 34 #include <linux/hid.h> 35 #include <linux/slab.h> 36 37 #include "radio-si470x.h" 38 39 40 /* USB Device ID List */ 41 static const struct usb_device_id si470x_usb_driver_id_table[] = { 42 /* Silicon Labs USB FM Radio Reference Design */ 43 { USB_DEVICE_AND_INTERFACE_INFO(0x10c4, 0x818a, USB_CLASS_HID, 0, 0) }, 44 /* ADS/Tech FM Radio Receiver (formerly Instant FM Music) */ 45 { USB_DEVICE_AND_INTERFACE_INFO(0x06e1, 0xa155, USB_CLASS_HID, 0, 0) }, 46 /* KWorld USB FM Radio SnapMusic Mobile 700 (FM700) */ 47 { USB_DEVICE_AND_INTERFACE_INFO(0x1b80, 0xd700, USB_CLASS_HID, 0, 0) }, 48 /* Sanei Electric, Inc. FM USB Radio (sold as DealExtreme.com PCear) */ 49 { USB_DEVICE_AND_INTERFACE_INFO(0x10c5, 0x819a, USB_CLASS_HID, 0, 0) }, 50 /* Axentia ALERT FM USB Receiver */ 51 { USB_DEVICE_AND_INTERFACE_INFO(0x12cf, 0x7111, USB_CLASS_HID, 0, 0) }, 52 /* Terminating entry */ 53 { } 54 }; 55 MODULE_DEVICE_TABLE(usb, si470x_usb_driver_id_table); 56 57 58 59 /************************************************************************** 60 * Module Parameters 61 **************************************************************************/ 62 63 /* Radio Nr */ 64 static int radio_nr = -1; 65 module_param(radio_nr, int, 0444); 66 MODULE_PARM_DESC(radio_nr, "Radio Nr"); 67 68 /* USB timeout */ 69 static unsigned int usb_timeout = 500; 70 module_param(usb_timeout, uint, 0644); 71 MODULE_PARM_DESC(usb_timeout, "USB timeout (ms): *500*"); 72 73 /* RDS buffer blocks */ 74 static unsigned int rds_buf = 100; 75 module_param(rds_buf, uint, 0444); 76 MODULE_PARM_DESC(rds_buf, "RDS buffer entries: *100*"); 77 78 /* RDS maximum block errors */ 79 static unsigned short max_rds_errors = 1; 80 /* 0 means 0 errors requiring correction */ 81 /* 1 means 1-2 errors requiring correction (used by original USBRadio.exe) */ 82 /* 2 means 3-5 errors requiring correction */ 83 /* 3 means 6+ errors or errors in checkword, correction not possible */ 84 module_param(max_rds_errors, ushort, 0644); 85 MODULE_PARM_DESC(max_rds_errors, "RDS maximum block errors: *1*"); 86 87 88 89 /************************************************************************** 90 * USB HID Reports 91 **************************************************************************/ 92 93 /* Reports 1-16 give direct read/write access to the 16 Si470x registers */ 94 /* with the (REPORT_ID - 1) corresponding to the register address across USB */ 95 /* endpoint 0 using GET_REPORT and SET_REPORT */ 96 #define REGISTER_REPORT_SIZE (RADIO_REGISTER_SIZE + 1) 97 #define REGISTER_REPORT(reg) ((reg) + 1) 98 99 /* Report 17 gives direct read/write access to the entire Si470x register */ 100 /* map across endpoint 0 using GET_REPORT and SET_REPORT */ 101 #define ENTIRE_REPORT_SIZE (RADIO_REGISTER_NUM * RADIO_REGISTER_SIZE + 1) 102 #define ENTIRE_REPORT 17 103 104 /* Report 18 is used to send the lowest 6 Si470x registers up the HID */ 105 /* interrupt endpoint 1 to Windows every 20 milliseconds for status */ 106 #define RDS_REPORT_SIZE (RDS_REGISTER_NUM * RADIO_REGISTER_SIZE + 1) 107 #define RDS_REPORT 18 108 109 /* Report 19: LED state */ 110 #define LED_REPORT_SIZE 3 111 #define LED_REPORT 19 112 113 /* Report 19: stream */ 114 #define STREAM_REPORT_SIZE 3 115 #define STREAM_REPORT 19 116 117 /* Report 20: scratch */ 118 #define SCRATCH_PAGE_SIZE 63 119 #define SCRATCH_REPORT_SIZE (SCRATCH_PAGE_SIZE + 1) 120 #define SCRATCH_REPORT 20 121 122 /* Reports 19-22: flash upgrade of the C8051F321 */ 123 #define WRITE_REPORT_SIZE 4 124 #define WRITE_REPORT 19 125 #define FLASH_REPORT_SIZE 64 126 #define FLASH_REPORT 20 127 #define CRC_REPORT_SIZE 3 128 #define CRC_REPORT 21 129 #define RESPONSE_REPORT_SIZE 2 130 #define RESPONSE_REPORT 22 131 132 /* Report 23: currently unused, but can accept 60 byte reports on the HID */ 133 /* interrupt out endpoint 2 every 1 millisecond */ 134 #define UNUSED_REPORT 23 135 136 #define MAX_REPORT_SIZE 64 137 138 139 140 /************************************************************************** 141 * Software/Hardware Versions from Scratch Page 142 **************************************************************************/ 143 #define RADIO_HW_VERSION 1 144 145 146 147 /************************************************************************** 148 * LED State Definitions 149 **************************************************************************/ 150 #define LED_COMMAND 0x35 151 152 #define NO_CHANGE_LED 0x00 153 #define ALL_COLOR_LED 0x01 /* streaming state */ 154 #define BLINK_GREEN_LED 0x02 /* connect state */ 155 #define BLINK_RED_LED 0x04 156 #define BLINK_ORANGE_LED 0x10 /* disconnect state */ 157 #define SOLID_GREEN_LED 0x20 /* tuning/seeking state */ 158 #define SOLID_RED_LED 0x40 /* bootload state */ 159 #define SOLID_ORANGE_LED 0x80 160 161 162 163 /************************************************************************** 164 * Stream State Definitions 165 **************************************************************************/ 166 #define STREAM_COMMAND 0x36 167 #define STREAM_VIDPID 0x00 168 #define STREAM_AUDIO 0xff 169 170 171 172 /************************************************************************** 173 * Bootloader / Flash Commands 174 **************************************************************************/ 175 176 /* unique id sent to bootloader and required to put into a bootload state */ 177 #define UNIQUE_BL_ID 0x34 178 179 /* mask for the flash data */ 180 #define FLASH_DATA_MASK 0x55 181 182 /* bootloader commands */ 183 #define GET_SW_VERSION_COMMAND 0x00 184 #define SET_PAGE_COMMAND 0x01 185 #define ERASE_PAGE_COMMAND 0x02 186 #define WRITE_PAGE_COMMAND 0x03 187 #define CRC_ON_PAGE_COMMAND 0x04 188 #define READ_FLASH_BYTE_COMMAND 0x05 189 #define RESET_DEVICE_COMMAND 0x06 190 #define GET_HW_VERSION_COMMAND 0x07 191 #define BLANK 0xff 192 193 /* bootloader command responses */ 194 #define COMMAND_OK 0x01 195 #define COMMAND_FAILED 0x02 196 #define COMMAND_PENDING 0x03 197 198 199 200 /************************************************************************** 201 * General Driver Functions - REGISTER_REPORTs 202 **************************************************************************/ 203 204 /* 205 * si470x_get_report - receive a HID report 206 */ 207 static int si470x_get_report(struct si470x_device *radio, void *buf, int size) 208 { 209 unsigned char *report = buf; 210 int retval; 211 212 retval = usb_control_msg(radio->usbdev, 213 usb_rcvctrlpipe(radio->usbdev, 0), 214 HID_REQ_GET_REPORT, 215 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, 216 report[0], 2, 217 buf, size, usb_timeout); 218 219 if (retval < 0) 220 dev_warn(&radio->intf->dev, 221 "si470x_get_report: usb_control_msg returned %d\n", 222 retval); 223 return retval; 224 } 225 226 227 /* 228 * si470x_set_report - send a HID report 229 */ 230 static int si470x_set_report(struct si470x_device *radio, void *buf, int size) 231 { 232 unsigned char *report = buf; 233 int retval; 234 235 retval = usb_control_msg(radio->usbdev, 236 usb_sndctrlpipe(radio->usbdev, 0), 237 HID_REQ_SET_REPORT, 238 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, 239 report[0], 2, 240 buf, size, usb_timeout); 241 242 if (retval < 0) 243 dev_warn(&radio->intf->dev, 244 "si470x_set_report: usb_control_msg returned %d\n", 245 retval); 246 return retval; 247 } 248 249 250 /* 251 * si470x_get_register - read register 252 */ 253 static int si470x_get_register(struct si470x_device *radio, int regnr) 254 { 255 int retval; 256 257 radio->usb_buf[0] = REGISTER_REPORT(regnr); 258 259 retval = si470x_get_report(radio, radio->usb_buf, REGISTER_REPORT_SIZE); 260 261 if (retval >= 0) 262 radio->registers[regnr] = get_unaligned_be16(&radio->usb_buf[1]); 263 264 return (retval < 0) ? -EINVAL : 0; 265 } 266 267 268 /* 269 * si470x_set_register - write register 270 */ 271 static int si470x_set_register(struct si470x_device *radio, int regnr) 272 { 273 int retval; 274 275 radio->usb_buf[0] = REGISTER_REPORT(regnr); 276 put_unaligned_be16(radio->registers[regnr], &radio->usb_buf[1]); 277 278 retval = si470x_set_report(radio, radio->usb_buf, REGISTER_REPORT_SIZE); 279 280 return (retval < 0) ? -EINVAL : 0; 281 } 282 283 284 285 /************************************************************************** 286 * General Driver Functions - ENTIRE_REPORT 287 **************************************************************************/ 288 289 /* 290 * si470x_get_all_registers - read entire registers 291 */ 292 static int si470x_get_all_registers(struct si470x_device *radio) 293 { 294 int retval; 295 unsigned char regnr; 296 297 radio->usb_buf[0] = ENTIRE_REPORT; 298 299 retval = si470x_get_report(radio, radio->usb_buf, ENTIRE_REPORT_SIZE); 300 301 if (retval >= 0) 302 for (regnr = 0; regnr < RADIO_REGISTER_NUM; regnr++) 303 radio->registers[regnr] = get_unaligned_be16( 304 &radio->usb_buf[regnr * RADIO_REGISTER_SIZE + 1]); 305 306 return (retval < 0) ? -EINVAL : 0; 307 } 308 309 310 311 /************************************************************************** 312 * General Driver Functions - LED_REPORT 313 **************************************************************************/ 314 315 /* 316 * si470x_set_led_state - sets the led state 317 */ 318 static int si470x_set_led_state(struct si470x_device *radio, 319 unsigned char led_state) 320 { 321 int retval; 322 323 radio->usb_buf[0] = LED_REPORT; 324 radio->usb_buf[1] = LED_COMMAND; 325 radio->usb_buf[2] = led_state; 326 327 retval = si470x_set_report(radio, radio->usb_buf, LED_REPORT_SIZE); 328 329 return (retval < 0) ? -EINVAL : 0; 330 } 331 332 333 334 /************************************************************************** 335 * General Driver Functions - SCRATCH_REPORT 336 **************************************************************************/ 337 338 /* 339 * si470x_get_scratch_versions - gets the scratch page and version infos 340 */ 341 static int si470x_get_scratch_page_versions(struct si470x_device *radio) 342 { 343 int retval; 344 345 radio->usb_buf[0] = SCRATCH_REPORT; 346 347 retval = si470x_get_report(radio, radio->usb_buf, SCRATCH_REPORT_SIZE); 348 349 if (retval < 0) 350 dev_warn(&radio->intf->dev, "si470x_get_scratch: si470x_get_report returned %d\n", 351 retval); 352 else { 353 radio->software_version = radio->usb_buf[1]; 354 radio->hardware_version = radio->usb_buf[2]; 355 } 356 357 return (retval < 0) ? -EINVAL : 0; 358 } 359 360 361 362 /************************************************************************** 363 * RDS Driver Functions 364 **************************************************************************/ 365 366 /* 367 * si470x_int_in_callback - rds callback and processing function 368 * 369 * TODO: do we need to use mutex locks in some sections? 370 */ 371 static void si470x_int_in_callback(struct urb *urb) 372 { 373 struct si470x_device *radio = urb->context; 374 int retval; 375 unsigned char regnr; 376 unsigned char blocknum; 377 unsigned short bler; /* rds block errors */ 378 unsigned short rds; 379 unsigned char tmpbuf[3]; 380 381 if (urb->status) { 382 if (urb->status == -ENOENT || 383 urb->status == -ECONNRESET || 384 urb->status == -ESHUTDOWN) { 385 return; 386 } else { 387 dev_warn(&radio->intf->dev, 388 "non-zero urb status (%d)\n", urb->status); 389 goto resubmit; /* Maybe we can recover. */ 390 } 391 } 392 393 /* Sometimes the device returns len 0 packets */ 394 if (urb->actual_length != RDS_REPORT_SIZE) 395 goto resubmit; 396 397 radio->registers[STATUSRSSI] = 398 get_unaligned_be16(&radio->int_in_buffer[1]); 399 400 if (radio->registers[STATUSRSSI] & STATUSRSSI_STC) 401 complete(&radio->completion); 402 403 if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS)) { 404 /* Update RDS registers with URB data */ 405 for (regnr = 1; regnr < RDS_REGISTER_NUM; regnr++) 406 radio->registers[STATUSRSSI + regnr] = 407 get_unaligned_be16(&radio->int_in_buffer[ 408 regnr * RADIO_REGISTER_SIZE + 1]); 409 /* get rds blocks */ 410 if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSR) == 0) { 411 /* No RDS group ready, better luck next time */ 412 goto resubmit; 413 } 414 if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSS) == 0) { 415 /* RDS decoder not synchronized */ 416 goto resubmit; 417 } 418 for (blocknum = 0; blocknum < 4; blocknum++) { 419 switch (blocknum) { 420 default: 421 bler = (radio->registers[STATUSRSSI] & 422 STATUSRSSI_BLERA) >> 9; 423 rds = radio->registers[RDSA]; 424 break; 425 case 1: 426 bler = (radio->registers[READCHAN] & 427 READCHAN_BLERB) >> 14; 428 rds = radio->registers[RDSB]; 429 break; 430 case 2: 431 bler = (radio->registers[READCHAN] & 432 READCHAN_BLERC) >> 12; 433 rds = radio->registers[RDSC]; 434 break; 435 case 3: 436 bler = (radio->registers[READCHAN] & 437 READCHAN_BLERD) >> 10; 438 rds = radio->registers[RDSD]; 439 break; 440 } 441 442 /* Fill the V4L2 RDS buffer */ 443 put_unaligned_le16(rds, &tmpbuf); 444 tmpbuf[2] = blocknum; /* offset name */ 445 tmpbuf[2] |= blocknum << 3; /* received offset */ 446 if (bler > max_rds_errors) 447 tmpbuf[2] |= 0x80; /* uncorrectable errors */ 448 else if (bler > 0) 449 tmpbuf[2] |= 0x40; /* corrected error(s) */ 450 451 /* copy RDS block to internal buffer */ 452 memcpy(&radio->buffer[radio->wr_index], &tmpbuf, 3); 453 radio->wr_index += 3; 454 455 /* wrap write pointer */ 456 if (radio->wr_index >= radio->buf_size) 457 radio->wr_index = 0; 458 459 /* check for overflow */ 460 if (radio->wr_index == radio->rd_index) { 461 /* increment and wrap read pointer */ 462 radio->rd_index += 3; 463 if (radio->rd_index >= radio->buf_size) 464 radio->rd_index = 0; 465 } 466 } 467 if (radio->wr_index != radio->rd_index) 468 wake_up_interruptible(&radio->read_queue); 469 } 470 471 resubmit: 472 /* Resubmit if we're still running. */ 473 if (radio->int_in_running && radio->usbdev) { 474 retval = usb_submit_urb(radio->int_in_urb, GFP_ATOMIC); 475 if (retval) { 476 dev_warn(&radio->intf->dev, 477 "resubmitting urb failed (%d)", retval); 478 radio->int_in_running = 0; 479 } 480 } 481 radio->status_rssi_auto_update = radio->int_in_running; 482 } 483 484 485 static int si470x_fops_open(struct file *file) 486 { 487 return v4l2_fh_open(file); 488 } 489 490 static int si470x_fops_release(struct file *file) 491 { 492 return v4l2_fh_release(file); 493 } 494 495 static void si470x_usb_release(struct v4l2_device *v4l2_dev) 496 { 497 struct si470x_device *radio = 498 container_of(v4l2_dev, struct si470x_device, v4l2_dev); 499 500 usb_free_urb(radio->int_in_urb); 501 v4l2_ctrl_handler_free(&radio->hdl); 502 v4l2_device_unregister(&radio->v4l2_dev); 503 kfree(radio->int_in_buffer); 504 kfree(radio->buffer); 505 kfree(radio->usb_buf); 506 kfree(radio); 507 } 508 509 510 /************************************************************************** 511 * Video4Linux Interface 512 **************************************************************************/ 513 514 /* 515 * si470x_vidioc_querycap - query device capabilities 516 */ 517 static int si470x_vidioc_querycap(struct file *file, void *priv, 518 struct v4l2_capability *capability) 519 { 520 struct si470x_device *radio = video_drvdata(file); 521 522 strscpy(capability->driver, DRIVER_NAME, sizeof(capability->driver)); 523 strscpy(capability->card, DRIVER_CARD, sizeof(capability->card)); 524 usb_make_path(radio->usbdev, capability->bus_info, 525 sizeof(capability->bus_info)); 526 capability->device_caps = V4L2_CAP_HW_FREQ_SEEK | V4L2_CAP_READWRITE | 527 V4L2_CAP_TUNER | V4L2_CAP_RADIO | V4L2_CAP_RDS_CAPTURE; 528 capability->capabilities = capability->device_caps | V4L2_CAP_DEVICE_CAPS; 529 return 0; 530 } 531 532 533 static int si470x_start_usb(struct si470x_device *radio) 534 { 535 int retval; 536 537 /* initialize interrupt urb */ 538 usb_fill_int_urb(radio->int_in_urb, radio->usbdev, 539 usb_rcvintpipe(radio->usbdev, 540 radio->int_in_endpoint->bEndpointAddress), 541 radio->int_in_buffer, 542 le16_to_cpu(radio->int_in_endpoint->wMaxPacketSize), 543 si470x_int_in_callback, 544 radio, 545 radio->int_in_endpoint->bInterval); 546 547 radio->int_in_running = 1; 548 mb(); 549 550 retval = usb_submit_urb(radio->int_in_urb, GFP_KERNEL); 551 if (retval) { 552 dev_info(&radio->intf->dev, 553 "submitting int urb failed (%d)\n", retval); 554 radio->int_in_running = 0; 555 } 556 radio->status_rssi_auto_update = radio->int_in_running; 557 558 /* start radio */ 559 retval = si470x_start(radio); 560 if (retval < 0) 561 return retval; 562 563 v4l2_ctrl_handler_setup(&radio->hdl); 564 565 return retval; 566 } 567 568 /************************************************************************** 569 * USB Interface 570 **************************************************************************/ 571 572 /* 573 * si470x_usb_driver_probe - probe for the device 574 */ 575 static int si470x_usb_driver_probe(struct usb_interface *intf, 576 const struct usb_device_id *id) 577 { 578 struct si470x_device *radio; 579 struct usb_host_interface *iface_desc; 580 struct usb_endpoint_descriptor *endpoint; 581 int i, int_end_size, retval; 582 unsigned char version_warning = 0; 583 584 /* private data allocation and initialization */ 585 radio = kzalloc(sizeof(struct si470x_device), GFP_KERNEL); 586 if (!radio) { 587 retval = -ENOMEM; 588 goto err_initial; 589 } 590 radio->usb_buf = kmalloc(MAX_REPORT_SIZE, GFP_KERNEL); 591 if (radio->usb_buf == NULL) { 592 retval = -ENOMEM; 593 goto err_radio; 594 } 595 radio->usbdev = interface_to_usbdev(intf); 596 radio->intf = intf; 597 radio->band = 1; /* Default to 76 - 108 MHz */ 598 mutex_init(&radio->lock); 599 init_completion(&radio->completion); 600 601 radio->get_register = si470x_get_register; 602 radio->set_register = si470x_set_register; 603 radio->fops_open = si470x_fops_open; 604 radio->fops_release = si470x_fops_release; 605 radio->vidioc_querycap = si470x_vidioc_querycap; 606 607 iface_desc = intf->cur_altsetting; 608 609 /* Set up interrupt endpoint information. */ 610 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { 611 endpoint = &iface_desc->endpoint[i].desc; 612 if (usb_endpoint_is_int_in(endpoint)) 613 radio->int_in_endpoint = endpoint; 614 } 615 if (!radio->int_in_endpoint) { 616 dev_info(&intf->dev, "could not find interrupt in endpoint\n"); 617 retval = -EIO; 618 goto err_usbbuf; 619 } 620 621 int_end_size = le16_to_cpu(radio->int_in_endpoint->wMaxPacketSize); 622 623 radio->int_in_buffer = kmalloc(int_end_size, GFP_KERNEL); 624 if (!radio->int_in_buffer) { 625 dev_info(&intf->dev, "could not allocate int_in_buffer"); 626 retval = -ENOMEM; 627 goto err_usbbuf; 628 } 629 630 radio->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); 631 if (!radio->int_in_urb) { 632 retval = -ENOMEM; 633 goto err_intbuffer; 634 } 635 636 radio->v4l2_dev.release = si470x_usb_release; 637 638 /* 639 * The si470x SiLabs reference design uses the same USB IDs as 640 * 'Thanko's Raremono' si4734 based receiver. So check here which we 641 * have: attempt to read the device ID from the si470x: the lower 12 642 * bits should be 0x0242 for the si470x. 643 * 644 * We use this check to determine which device we are dealing with. 645 */ 646 if (id->idVendor == 0x10c4 && id->idProduct == 0x818a) { 647 retval = usb_control_msg(radio->usbdev, 648 usb_rcvctrlpipe(radio->usbdev, 0), 649 HID_REQ_GET_REPORT, 650 USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, 651 1, 2, 652 radio->usb_buf, 3, 500); 653 if (retval != 3 || 654 (get_unaligned_be16(&radio->usb_buf[1]) & 0xfff) != 0x0242) { 655 dev_info(&intf->dev, "this is not a si470x device.\n"); 656 retval = -ENODEV; 657 goto err_urb; 658 } 659 } 660 661 retval = v4l2_device_register(&intf->dev, &radio->v4l2_dev); 662 if (retval < 0) { 663 dev_err(&intf->dev, "couldn't register v4l2_device\n"); 664 goto err_urb; 665 } 666 667 v4l2_ctrl_handler_init(&radio->hdl, 2); 668 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops, 669 V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1); 670 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops, 671 V4L2_CID_AUDIO_VOLUME, 0, 15, 1, 15); 672 if (radio->hdl.error) { 673 retval = radio->hdl.error; 674 dev_err(&intf->dev, "couldn't register control\n"); 675 goto err_dev; 676 } 677 radio->videodev = si470x_viddev_template; 678 radio->videodev.ctrl_handler = &radio->hdl; 679 radio->videodev.lock = &radio->lock; 680 radio->videodev.v4l2_dev = &radio->v4l2_dev; 681 radio->videodev.release = video_device_release_empty; 682 video_set_drvdata(&radio->videodev, radio); 683 684 /* get device and chip versions */ 685 if (si470x_get_all_registers(radio) < 0) { 686 retval = -EIO; 687 goto err_ctrl; 688 } 689 dev_info(&intf->dev, "DeviceID=0x%4.4hx ChipID=0x%4.4hx\n", 690 radio->registers[DEVICEID], radio->registers[SI_CHIPID]); 691 if ((radio->registers[SI_CHIPID] & SI_CHIPID_FIRMWARE) < RADIO_FW_VERSION) { 692 dev_warn(&intf->dev, 693 "This driver is known to work with firmware version %hu,\n", 694 RADIO_FW_VERSION); 695 dev_warn(&intf->dev, 696 "but the device has firmware version %hu.\n", 697 radio->registers[SI_CHIPID] & SI_CHIPID_FIRMWARE); 698 version_warning = 1; 699 } 700 701 /* get software and hardware versions */ 702 if (si470x_get_scratch_page_versions(radio) < 0) { 703 retval = -EIO; 704 goto err_ctrl; 705 } 706 dev_info(&intf->dev, "software version %d, hardware version %d\n", 707 radio->software_version, radio->hardware_version); 708 if (radio->hardware_version < RADIO_HW_VERSION) { 709 dev_warn(&intf->dev, 710 "This driver is known to work with hardware version %hu,\n", 711 RADIO_HW_VERSION); 712 dev_warn(&intf->dev, 713 "but the device has hardware version %hu.\n", 714 radio->hardware_version); 715 version_warning = 1; 716 } 717 718 /* give out version warning */ 719 if (version_warning == 1) { 720 dev_warn(&intf->dev, 721 "If you have some trouble using this driver,\n"); 722 dev_warn(&intf->dev, 723 "please report to V4L ML at linux-media@vger.kernel.org\n"); 724 } 725 726 /* set led to connect state */ 727 si470x_set_led_state(radio, BLINK_GREEN_LED); 728 729 /* rds buffer allocation */ 730 radio->buf_size = rds_buf * 3; 731 radio->buffer = kmalloc(radio->buf_size, GFP_KERNEL); 732 if (!radio->buffer) { 733 retval = -EIO; 734 goto err_ctrl; 735 } 736 737 /* rds buffer configuration */ 738 radio->wr_index = 0; 739 radio->rd_index = 0; 740 init_waitqueue_head(&radio->read_queue); 741 usb_set_intfdata(intf, radio); 742 743 /* start radio */ 744 retval = si470x_start_usb(radio); 745 if (retval < 0) 746 goto err_all; 747 748 /* set initial frequency */ 749 si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */ 750 751 /* register video device */ 752 retval = video_register_device(&radio->videodev, VFL_TYPE_RADIO, 753 radio_nr); 754 if (retval) { 755 dev_err(&intf->dev, "Could not register video device\n"); 756 goto err_all; 757 } 758 759 return 0; 760 err_all: 761 kfree(radio->buffer); 762 err_ctrl: 763 v4l2_ctrl_handler_free(&radio->hdl); 764 err_dev: 765 v4l2_device_unregister(&radio->v4l2_dev); 766 err_urb: 767 usb_free_urb(radio->int_in_urb); 768 err_intbuffer: 769 kfree(radio->int_in_buffer); 770 err_usbbuf: 771 kfree(radio->usb_buf); 772 err_radio: 773 kfree(radio); 774 err_initial: 775 return retval; 776 } 777 778 779 /* 780 * si470x_usb_driver_suspend - suspend the device 781 */ 782 static int si470x_usb_driver_suspend(struct usb_interface *intf, 783 pm_message_t message) 784 { 785 struct si470x_device *radio = usb_get_intfdata(intf); 786 787 dev_info(&intf->dev, "suspending now...\n"); 788 789 /* shutdown interrupt handler */ 790 if (radio->int_in_running) { 791 radio->int_in_running = 0; 792 if (radio->int_in_urb) 793 usb_kill_urb(radio->int_in_urb); 794 } 795 796 /* cancel read processes */ 797 wake_up_interruptible(&radio->read_queue); 798 799 /* stop radio */ 800 si470x_stop(radio); 801 return 0; 802 } 803 804 805 /* 806 * si470x_usb_driver_resume - resume the device 807 */ 808 static int si470x_usb_driver_resume(struct usb_interface *intf) 809 { 810 struct si470x_device *radio = usb_get_intfdata(intf); 811 int ret; 812 813 dev_info(&intf->dev, "resuming now...\n"); 814 815 /* start radio */ 816 ret = si470x_start_usb(radio); 817 if (ret == 0) 818 v4l2_ctrl_handler_setup(&radio->hdl); 819 820 return ret; 821 } 822 823 824 /* 825 * si470x_usb_driver_disconnect - disconnect the device 826 */ 827 static void si470x_usb_driver_disconnect(struct usb_interface *intf) 828 { 829 struct si470x_device *radio = usb_get_intfdata(intf); 830 831 mutex_lock(&radio->lock); 832 v4l2_device_disconnect(&radio->v4l2_dev); 833 video_unregister_device(&radio->videodev); 834 usb_set_intfdata(intf, NULL); 835 mutex_unlock(&radio->lock); 836 v4l2_device_put(&radio->v4l2_dev); 837 } 838 839 840 /* 841 * si470x_usb_driver - usb driver interface 842 * 843 * A note on suspend/resume: this driver had only empty suspend/resume 844 * functions, and when I tried to test suspend/resume it always disconnected 845 * instead of resuming (using my ADS InstantFM stick). So I've decided to 846 * remove these callbacks until someone else with better hardware can 847 * implement and test this. 848 */ 849 static struct usb_driver si470x_usb_driver = { 850 .name = DRIVER_NAME, 851 .probe = si470x_usb_driver_probe, 852 .disconnect = si470x_usb_driver_disconnect, 853 .suspend = si470x_usb_driver_suspend, 854 .resume = si470x_usb_driver_resume, 855 .reset_resume = si470x_usb_driver_resume, 856 .id_table = si470x_usb_driver_id_table, 857 }; 858 859 module_usb_driver(si470x_usb_driver); 860 861 MODULE_LICENSE("GPL"); 862 MODULE_AUTHOR(DRIVER_AUTHOR); 863 MODULE_DESCRIPTION(DRIVER_DESC); 864 MODULE_VERSION(DRIVER_VERSION); 865