Lines Matching refs:radio

211 static int si470x_get_report(struct si470x_device *radio, void *buf, int size)  in si470x_get_report()  argument
216 retval = usb_control_msg(radio->usbdev, in si470x_get_report()
217 usb_rcvctrlpipe(radio->usbdev, 0), in si470x_get_report()
224 dev_warn(&radio->intf->dev, in si470x_get_report()
234 static int si470x_set_report(struct si470x_device *radio, void *buf, int size) in si470x_set_report() argument
239 retval = usb_control_msg(radio->usbdev, in si470x_set_report()
240 usb_sndctrlpipe(radio->usbdev, 0), in si470x_set_report()
247 dev_warn(&radio->intf->dev, in si470x_set_report()
257 int si470x_get_register(struct si470x_device *radio, int regnr) in si470x_get_register() argument
261 radio->usb_buf[0] = REGISTER_REPORT(regnr); in si470x_get_register()
263 retval = si470x_get_report(radio, radio->usb_buf, REGISTER_REPORT_SIZE); in si470x_get_register()
266 radio->registers[regnr] = get_unaligned_be16(&radio->usb_buf[1]); in si470x_get_register()
275 int si470x_set_register(struct si470x_device *radio, int regnr) in si470x_set_register() argument
279 radio->usb_buf[0] = REGISTER_REPORT(regnr); in si470x_set_register()
280 put_unaligned_be16(radio->registers[regnr], &radio->usb_buf[1]); in si470x_set_register()
282 retval = si470x_set_report(radio, radio->usb_buf, REGISTER_REPORT_SIZE); in si470x_set_register()
296 static int si470x_get_all_registers(struct si470x_device *radio) in si470x_get_all_registers() argument
301 radio->usb_buf[0] = ENTIRE_REPORT; in si470x_get_all_registers()
303 retval = si470x_get_report(radio, radio->usb_buf, ENTIRE_REPORT_SIZE); in si470x_get_all_registers()
307 radio->registers[regnr] = get_unaligned_be16( in si470x_get_all_registers()
308 &radio->usb_buf[regnr * RADIO_REGISTER_SIZE + 1]); in si470x_get_all_registers()
322 static int si470x_set_led_state(struct si470x_device *radio, in si470x_set_led_state() argument
327 radio->usb_buf[0] = LED_REPORT; in si470x_set_led_state()
328 radio->usb_buf[1] = LED_COMMAND; in si470x_set_led_state()
329 radio->usb_buf[2] = led_state; in si470x_set_led_state()
331 retval = si470x_set_report(radio, radio->usb_buf, LED_REPORT_SIZE); in si470x_set_led_state()
345 static int si470x_get_scratch_page_versions(struct si470x_device *radio) in si470x_get_scratch_page_versions() argument
349 radio->usb_buf[0] = SCRATCH_REPORT; in si470x_get_scratch_page_versions()
351 retval = si470x_get_report(radio, radio->usb_buf, SCRATCH_REPORT_SIZE); in si470x_get_scratch_page_versions()
354 dev_warn(&radio->intf->dev, "si470x_get_scratch: " in si470x_get_scratch_page_versions()
357 radio->software_version = radio->usb_buf[1]; in si470x_get_scratch_page_versions()
358 radio->hardware_version = radio->usb_buf[2]; in si470x_get_scratch_page_versions()
377 struct si470x_device *radio = urb->context; in si470x_int_in_callback() local
391 dev_warn(&radio->intf->dev, in si470x_int_in_callback()
401 radio->registers[STATUSRSSI] = in si470x_int_in_callback()
402 get_unaligned_be16(&radio->int_in_buffer[1]); in si470x_int_in_callback()
404 if (radio->registers[STATUSRSSI] & STATUSRSSI_STC) in si470x_int_in_callback()
405 complete(&radio->completion); in si470x_int_in_callback()
407 if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS)) { in si470x_int_in_callback()
410 radio->registers[STATUSRSSI + regnr] = in si470x_int_in_callback()
411 get_unaligned_be16(&radio->int_in_buffer[ in si470x_int_in_callback()
414 if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSR) == 0) { in si470x_int_in_callback()
418 if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSS) == 0) { in si470x_int_in_callback()
425 bler = (radio->registers[STATUSRSSI] & in si470x_int_in_callback()
427 rds = radio->registers[RDSA]; in si470x_int_in_callback()
430 bler = (radio->registers[READCHAN] & in si470x_int_in_callback()
432 rds = radio->registers[RDSB]; in si470x_int_in_callback()
435 bler = (radio->registers[READCHAN] & in si470x_int_in_callback()
437 rds = radio->registers[RDSC]; in si470x_int_in_callback()
440 bler = (radio->registers[READCHAN] & in si470x_int_in_callback()
442 rds = radio->registers[RDSD]; in si470x_int_in_callback()
456 memcpy(&radio->buffer[radio->wr_index], &tmpbuf, 3); in si470x_int_in_callback()
457 radio->wr_index += 3; in si470x_int_in_callback()
460 if (radio->wr_index >= radio->buf_size) in si470x_int_in_callback()
461 radio->wr_index = 0; in si470x_int_in_callback()
464 if (radio->wr_index == radio->rd_index) { in si470x_int_in_callback()
466 radio->rd_index += 3; in si470x_int_in_callback()
467 if (radio->rd_index >= radio->buf_size) in si470x_int_in_callback()
468 radio->rd_index = 0; in si470x_int_in_callback()
471 if (radio->wr_index != radio->rd_index) in si470x_int_in_callback()
472 wake_up_interruptible(&radio->read_queue); in si470x_int_in_callback()
477 if (radio->int_in_running && radio->usbdev) { in si470x_int_in_callback()
478 retval = usb_submit_urb(radio->int_in_urb, GFP_ATOMIC); in si470x_int_in_callback()
480 dev_warn(&radio->intf->dev, in si470x_int_in_callback()
482 radio->int_in_running = 0; in si470x_int_in_callback()
485 radio->status_rssi_auto_update = radio->int_in_running; in si470x_int_in_callback()
501 struct si470x_device *radio = in si470x_usb_release() local
504 usb_free_urb(radio->int_in_urb); in si470x_usb_release()
505 v4l2_ctrl_handler_free(&radio->hdl); in si470x_usb_release()
506 v4l2_device_unregister(&radio->v4l2_dev); in si470x_usb_release()
507 kfree(radio->int_in_buffer); in si470x_usb_release()
508 kfree(radio->buffer); in si470x_usb_release()
509 kfree(radio->usb_buf); in si470x_usb_release()
510 kfree(radio); in si470x_usb_release()
524 struct si470x_device *radio = video_drvdata(file); in si470x_vidioc_querycap() local
528 usb_make_path(radio->usbdev, capability->bus_info, in si470x_vidioc_querycap()
537 static int si470x_start_usb(struct si470x_device *radio) in si470x_start_usb() argument
542 usb_fill_int_urb(radio->int_in_urb, radio->usbdev, in si470x_start_usb()
543 usb_rcvintpipe(radio->usbdev, in si470x_start_usb()
544 radio->int_in_endpoint->bEndpointAddress), in si470x_start_usb()
545 radio->int_in_buffer, in si470x_start_usb()
546 le16_to_cpu(radio->int_in_endpoint->wMaxPacketSize), in si470x_start_usb()
548 radio, in si470x_start_usb()
549 radio->int_in_endpoint->bInterval); in si470x_start_usb()
551 radio->int_in_running = 1; in si470x_start_usb()
554 retval = usb_submit_urb(radio->int_in_urb, GFP_KERNEL); in si470x_start_usb()
556 dev_info(&radio->intf->dev, in si470x_start_usb()
558 radio->int_in_running = 0; in si470x_start_usb()
560 radio->status_rssi_auto_update = radio->int_in_running; in si470x_start_usb()
563 retval = si470x_start(radio); in si470x_start_usb()
567 v4l2_ctrl_handler_setup(&radio->hdl); in si470x_start_usb()
582 struct si470x_device *radio; in si470x_usb_driver_probe() local
589 radio = kzalloc(sizeof(struct si470x_device), GFP_KERNEL); in si470x_usb_driver_probe()
590 if (!radio) { in si470x_usb_driver_probe()
594 radio->usb_buf = kmalloc(MAX_REPORT_SIZE, GFP_KERNEL); in si470x_usb_driver_probe()
595 if (radio->usb_buf == NULL) { in si470x_usb_driver_probe()
599 radio->usbdev = interface_to_usbdev(intf); in si470x_usb_driver_probe()
600 radio->intf = intf; in si470x_usb_driver_probe()
601 radio->band = 1; /* Default to 76 - 108 MHz */ in si470x_usb_driver_probe()
602 mutex_init(&radio->lock); in si470x_usb_driver_probe()
603 init_completion(&radio->completion); in si470x_usb_driver_probe()
611 radio->int_in_endpoint = endpoint; in si470x_usb_driver_probe()
613 if (!radio->int_in_endpoint) { in si470x_usb_driver_probe()
619 int_end_size = le16_to_cpu(radio->int_in_endpoint->wMaxPacketSize); in si470x_usb_driver_probe()
621 radio->int_in_buffer = kmalloc(int_end_size, GFP_KERNEL); in si470x_usb_driver_probe()
622 if (!radio->int_in_buffer) { in si470x_usb_driver_probe()
628 radio->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); in si470x_usb_driver_probe()
629 if (!radio->int_in_urb) { in si470x_usb_driver_probe()
635 radio->v4l2_dev.release = si470x_usb_release; in si470x_usb_driver_probe()
646 retval = usb_control_msg(radio->usbdev, in si470x_usb_driver_probe()
647 usb_rcvctrlpipe(radio->usbdev, 0), in si470x_usb_driver_probe()
651 radio->usb_buf, 3, 500); in si470x_usb_driver_probe()
653 (get_unaligned_be16(&radio->usb_buf[1]) & 0xfff) != 0x0242) { in si470x_usb_driver_probe()
660 retval = v4l2_device_register(&intf->dev, &radio->v4l2_dev); in si470x_usb_driver_probe()
666 v4l2_ctrl_handler_init(&radio->hdl, 2); in si470x_usb_driver_probe()
667 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops, in si470x_usb_driver_probe()
669 v4l2_ctrl_new_std(&radio->hdl, &si470x_ctrl_ops, in si470x_usb_driver_probe()
671 if (radio->hdl.error) { in si470x_usb_driver_probe()
672 retval = radio->hdl.error; in si470x_usb_driver_probe()
676 radio->videodev = si470x_viddev_template; in si470x_usb_driver_probe()
677 radio->videodev.ctrl_handler = &radio->hdl; in si470x_usb_driver_probe()
678 radio->videodev.lock = &radio->lock; in si470x_usb_driver_probe()
679 radio->videodev.v4l2_dev = &radio->v4l2_dev; in si470x_usb_driver_probe()
680 radio->videodev.release = video_device_release_empty; in si470x_usb_driver_probe()
681 video_set_drvdata(&radio->videodev, radio); in si470x_usb_driver_probe()
684 if (si470x_get_all_registers(radio) < 0) { in si470x_usb_driver_probe()
689 radio->registers[DEVICEID], radio->registers[CHIPID]); in si470x_usb_driver_probe()
690 if ((radio->registers[CHIPID] & CHIPID_FIRMWARE) < RADIO_FW_VERSION) { in si470x_usb_driver_probe()
696 radio->registers[CHIPID] & CHIPID_FIRMWARE); in si470x_usb_driver_probe()
701 if (si470x_get_scratch_page_versions(radio) < 0) { in si470x_usb_driver_probe()
706 radio->software_version, radio->hardware_version); in si470x_usb_driver_probe()
707 if (radio->hardware_version < RADIO_HW_VERSION) { in si470x_usb_driver_probe()
713 radio->hardware_version); in si470x_usb_driver_probe()
727 si470x_set_led_state(radio, BLINK_GREEN_LED); in si470x_usb_driver_probe()
730 radio->buf_size = rds_buf * 3; in si470x_usb_driver_probe()
731 radio->buffer = kmalloc(radio->buf_size, GFP_KERNEL); in si470x_usb_driver_probe()
732 if (!radio->buffer) { in si470x_usb_driver_probe()
738 radio->wr_index = 0; in si470x_usb_driver_probe()
739 radio->rd_index = 0; in si470x_usb_driver_probe()
740 init_waitqueue_head(&radio->read_queue); in si470x_usb_driver_probe()
741 usb_set_intfdata(intf, radio); in si470x_usb_driver_probe()
744 retval = si470x_start_usb(radio); in si470x_usb_driver_probe()
749 si470x_set_freq(radio, 87.5 * FREQ_MUL); /* available in all regions */ in si470x_usb_driver_probe()
752 retval = video_register_device(&radio->videodev, VFL_TYPE_RADIO, in si470x_usb_driver_probe()
761 kfree(radio->buffer); in si470x_usb_driver_probe()
763 v4l2_ctrl_handler_free(&radio->hdl); in si470x_usb_driver_probe()
765 v4l2_device_unregister(&radio->v4l2_dev); in si470x_usb_driver_probe()
767 usb_free_urb(radio->int_in_urb); in si470x_usb_driver_probe()
769 kfree(radio->int_in_buffer); in si470x_usb_driver_probe()
771 kfree(radio->usb_buf); in si470x_usb_driver_probe()
773 kfree(radio); in si470x_usb_driver_probe()
785 struct si470x_device *radio = usb_get_intfdata(intf); in si470x_usb_driver_suspend() local
790 if (radio->int_in_running) { in si470x_usb_driver_suspend()
791 radio->int_in_running = 0; in si470x_usb_driver_suspend()
792 if (radio->int_in_urb) in si470x_usb_driver_suspend()
793 usb_kill_urb(radio->int_in_urb); in si470x_usb_driver_suspend()
797 wake_up_interruptible(&radio->read_queue); in si470x_usb_driver_suspend()
800 si470x_stop(radio); in si470x_usb_driver_suspend()
810 struct si470x_device *radio = usb_get_intfdata(intf); in si470x_usb_driver_resume() local
816 ret = si470x_start_usb(radio); in si470x_usb_driver_resume()
818 v4l2_ctrl_handler_setup(&radio->hdl); in si470x_usb_driver_resume()
829 struct si470x_device *radio = usb_get_intfdata(intf); in si470x_usb_driver_disconnect() local
831 mutex_lock(&radio->lock); in si470x_usb_driver_disconnect()
832 v4l2_device_disconnect(&radio->v4l2_dev); in si470x_usb_driver_disconnect()
833 video_unregister_device(&radio->videodev); in si470x_usb_driver_disconnect()
835 mutex_unlock(&radio->lock); in si470x_usb_driver_disconnect()
836 v4l2_device_put(&radio->v4l2_dev); in si470x_usb_driver_disconnect()