Lines Matching refs:radio
3 * drivers/media/radio/si470x/radio-si470x-usb.c
20 #define DRIVER_DESC "USB radio driver for Si470x FM Radio Receivers"
28 #include "radio-si470x.h"
198 static int si470x_get_report(struct si470x_device *radio, void *buf, int size)
203 retval = usb_control_msg(radio->usbdev,
204 usb_rcvctrlpipe(radio->usbdev, 0),
211 dev_warn(&radio->intf->dev,
221 static int si470x_set_report(struct si470x_device *radio, void *buf, int size)
226 retval = usb_control_msg(radio->usbdev,
227 usb_sndctrlpipe(radio->usbdev, 0),
234 dev_warn(&radio->intf->dev,
244 static int si470x_get_register(struct si470x_device *radio, int regnr)
248 radio->usb_buf[0] = REGISTER_REPORT(regnr);
250 retval = si470x_get_report(radio, radio->usb_buf, REGISTER_REPORT_SIZE);
253 radio->registers[regnr] = get_unaligned_be16(&radio->usb_buf[1]);
262 static int si470x_set_register(struct si470x_device *radio, int regnr)
266 radio->usb_buf[0] = REGISTER_REPORT(regnr);
267 put_unaligned_be16(radio->registers[regnr], &radio->usb_buf[1]);
269 retval = si470x_set_report(radio, radio->usb_buf, REGISTER_REPORT_SIZE);
283 static int si470x_get_all_registers(struct si470x_device *radio)
288 radio->usb_buf[0] = ENTIRE_REPORT;
290 retval = si470x_get_report(radio, radio->usb_buf, ENTIRE_REPORT_SIZE);
294 radio->registers[regnr] = get_unaligned_be16(
295 &radio->usb_buf[regnr * RADIO_REGISTER_SIZE + 1]);
309 static int si470x_set_led_state(struct si470x_device *radio,
314 radio->usb_buf[0] = LED_REPORT;
315 radio->usb_buf[1] = LED_COMMAND;
316 radio->usb_buf[2] = led_state;
318 retval = si470x_set_report(radio, radio->usb_buf, LED_REPORT_SIZE);
332 static int si470x_get_scratch_page_versions(struct si470x_device *radio)
336 radio->usb_buf[0] = SCRATCH_REPORT;
338 retval = si470x_get_report(radio, radio->usb_buf, SCRATCH_REPORT_SIZE);
341 dev_warn(&radio->intf->dev, "si470x_get_scratch: si470x_get_report returned %d\n",
344 radio->software_version = radio->usb_buf[1];
345 radio->hardware_version = radio->usb_buf[2];
364 struct si470x_device *radio = urb->context;
378 dev_warn(&radio->intf->dev,
388 radio->registers[STATUSRSSI] =
389 get_unaligned_be16(&radio->int_in_buffer[1]);
391 if (radio->registers[STATUSRSSI] & STATUSRSSI_STC)
392 complete(&radio->completion);
394 if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS)) {
397 radio->registers[STATUSRSSI + regnr] =
398 get_unaligned_be16(&radio->int_in_buffer[
401 if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSR) == 0) {
405 if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSS) == 0) {
412 bler = (radio->registers[STATUSRSSI] &
414 rds = radio->registers[RDSA];
417 bler = (radio->registers[READCHAN] &
419 rds = radio->registers[RDSB];
422 bler = (radio->registers[READCHAN] &
424 rds = radio->registers[RDSC];
427 bler = (radio->registers[READCHAN] &
429 rds = radio->registers[RDSD];
443 memcpy(&radio->buffer[radio->wr_index], &tmpbuf, 3);
444 radio->wr_index += 3;
447 if (radio->wr_index >= radio->buf_size)
448 radio->wr_index = 0;
451 if (radio->wr_index == radio->rd_index) {
453 radio->rd_index += 3;
454 if (radio->rd_index >= radio->buf_size)
455 radio->rd_index = 0;
458 if (radio->wr_index != radio->rd_index)
459 wake_up_interruptible(&radio->read_queue);
464 if (radio->int_in_running && radio->usbdev) {
465 retval = usb_submit_urb(radio->int_in_urb, GFP_ATOMIC);
467 dev_warn(&radio->intf->dev,
469 radio->int_in_running = 0;
472 radio->status_rssi_auto_update = radio->int_in_running;
488 struct si470x_device *radio =
491 usb_free_urb(radio->int_in_urb);
492 v4l2_ctrl_handler_free(&radio->hdl);
493 v4l2_device_unregister(&radio->v4l2_dev);
494 kfree(radio->int_in_buffer);
495 kfree(radio->buffer);
496 kfree(radio->usb_buf);
497 kfree(radio);
511 struct si470x_device *radio = video_drvdata(file);
515 usb_make_path(radio->usbdev, capability->bus_info,
521 static int si470x_start_usb(struct si470x_device *radio)
526 usb_fill_int_urb(radio->int_in_urb, radio->usbdev,
527 usb_rcvintpipe(radio->usbdev,
528 radio->int_in_endpoint->bEndpointAddress),
529 radio->int_in_buffer,
530 le16_to_cpu(radio->int_in_endpoint->wMaxPacketSize),
532 radio,
533 radio->int_in_endpoint->bInterval);
535 radio->int_in_running = 1;
538 retval = usb_submit_urb(radio->int_in_urb, GFP_KERNEL);
540 dev_info(&radio->intf->dev,
542 radio->int_in_running = 0;
544 radio->status_rssi_auto_update = radio->int_in_running;
546 /* start radio */
547 retval = si470x_start(radio);
551 v4l2_ctrl_handler_setup(&radio->hdl);
566 struct si470x_device *radio;
573 radio = kzalloc(sizeof(struct si470x_device), GFP_KERNEL);
574 if (!radio) {
578 radio->usb_buf = kmalloc(MAX_REPORT_SIZE, GFP_KERNEL);
579 if (radio->usb_buf == NULL) {
583 radio->usbdev = interface_to_usbdev(intf);
584 radio->intf = intf;
585 radio->band = 1; /* Default to 76 - 108 MHz */
586 mutex_init(&radio->lock);
587 init_completion(&radio->completion);
589 radio->get_register = si470x_get_register;
590 radio->set_register = si470x_set_register;
591 radio->fops_open = si470x_fops_open;
592 radio->fops_release = si470x_fops_release;
593 radio->vidioc_querycap = si470x_vidioc_querycap;
601 radio->int_in_endpoint = endpoint;
603 if (!radio->int_in_endpoint) {
609 int_end_size = le16_to_cpu(radio->int_in_endpoint->wMaxPacketSize);
611 radio->int_in_buffer = kmalloc(int_end_size, GFP_KERNEL);
612 if (!radio->int_in_buffer) {
618 radio->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
619 if (!radio->int_in_urb) {
624 radio->v4l2_dev.release = si470x_usb_release;
635 retval = usb_control_msg(radio->usbdev,
636 usb_rcvctrlpipe(radio->usbdev, 0),
640 radio->usb_buf, 3, 500);
642 (get_unaligned_be16(&radio->usb_buf[1]) & 0xfff) != 0x0242) {
649 retval = v4l2_device_register(&intf->dev, &radio->v4l2_dev);
655 v4l2_ctrl_handler_init(&radio->hdl, 2);
656 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops,
658 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops,
660 if (radio->hdl.error) {
661 retval = radio->hdl.error;
665 radio->videodev = si470x_viddev_template;
666 radio->videodev.ctrl_handler = &radio->hdl;
667 radio->videodev.lock = &radio->lock;
668 radio->videodev.v4l2_dev = &radio->v4l2_dev;
669 radio->videodev.release = video_device_release_empty;
670 radio->videodev.device_caps =
673 video_set_drvdata(&radio->videodev, radio);
676 if (si470x_get_all_registers(radio) < 0) {
681 radio->registers[DEVICEID], radio->registers[SI_CHIPID]);
682 if ((radio->registers[SI_CHIPID] & SI_CHIPID_FIRMWARE) < RADIO_FW_VERSION) {
686 radio->registers[SI_CHIPID] & SI_CHIPID_FIRMWARE);
691 if (si470x_get_scratch_page_versions(radio) < 0) {
696 radio->software_version, radio->hardware_version);
697 if (radio->hardware_version < RADIO_HW_VERSION) {
701 radio->hardware_version);
712 si470x_set_led_state(radio, BLINK_GREEN_LED);
715 radio->buf_size = rds_buf * 3;
716 radio->buffer = kmalloc(radio->buf_size, GFP_KERNEL);
717 if (!radio->buffer) {
723 radio->wr_index = 0;
724 radio->rd_index = 0;
725 init_waitqueue_head(&radio->read_queue);
726 usb_set_intfdata(intf, radio);
728 /* start radio */
729 retval = si470x_start_usb(radio);
730 if (retval < 0 && !radio->int_in_running)
732 else if (retval < 0) /* in case of radio->int_in_running == 1 */
736 si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */
739 retval = video_register_device(&radio->videodev, VFL_TYPE_RADIO,
748 usb_kill_urb(radio->int_in_urb);
750 kfree(radio->buffer);
752 v4l2_ctrl_handler_free(&radio->hdl);
754 v4l2_device_unregister(&radio->v4l2_dev);
756 usb_free_urb(radio->int_in_urb);
758 kfree(radio->int_in_buffer);
760 kfree(radio->usb_buf);
762 kfree(radio);
774 struct si470x_device *radio = usb_get_intfdata(intf);
779 if (radio->int_in_running) {
780 radio->int_in_running = 0;
781 if (radio->int_in_urb)
782 usb_kill_urb(radio->int_in_urb);
786 wake_up_interruptible(&radio->read_queue);
788 /* stop radio */
789 si470x_stop(radio);
799 struct si470x_device *radio = usb_get_intfdata(intf);
804 /* start radio */
805 ret = si470x_start_usb(radio);
807 v4l2_ctrl_handler_setup(&radio->hdl);
818 struct si470x_device *radio = usb_get_intfdata(intf);
820 mutex_lock(&radio->lock);
821 v4l2_device_disconnect(&radio->v4l2_dev);
822 video_unregister_device(&radio->videodev);
823 usb_kill_urb(radio->int_in_urb);
825 mutex_unlock(&radio->lock);
826 v4l2_device_put(&radio->v4l2_dev);