Lines Matching refs:radio
3 * drivers/media/radio/radio-si476x.c -- V4L2 driver for SI476X chips
40 #define DRIVER_NAME "si476x-radio"
237 * signals from both antennas to receive FM radio.
289 * struct si476x_radio - radio device
300 * core structure is the radio device is being used
333 struct si476x_radio *radio = video_drvdata(file);
335 strscpy(capability->driver, radio->v4l2dev.name,
339 "platform:%s", radio->v4l2dev.name);
347 struct si476x_radio *radio = video_drvdata(file);
352 switch (radio->core->chip_id) {
385 struct si476x_radio *radio = video_drvdata(file);
407 si476x_core_lock(radio->core);
409 if (si476x_core_is_a_secondary_tuner(radio->core)) {
413 } else if (si476x_core_has_am(radio->core)) {
414 if (si476x_core_is_a_primary_tuner(radio->core))
436 tuner->audmode = radio->audmode;
441 err = radio->ops->rsq_status(radio->core,
452 si476x_core_unlock(radio->core);
460 struct si476x_radio *radio = video_drvdata(file);
467 radio->audmode = tuner->audmode;
469 radio->audmode = V4L2_TUNER_MODE_STEREO;
474 static int si476x_radio_init_vtable(struct si476x_radio *radio,
501 radio->ops = &fm_ops;
505 radio->ops = &am_ops;
513 static int si476x_radio_pretune(struct si476x_radio *radio,
529 args.freq = v4l2_to_si476x(radio->core,
531 retval = radio->ops->tune_freq(radio->core, &args);
534 args.freq = v4l2_to_si476x(radio->core,
536 retval = radio->ops->tune_freq(radio->core, &args);
545 static int si476x_radio_do_post_powerup_init(struct si476x_radio *radio,
550 /* regcache_mark_dirty(radio->core->regmap); */
551 err = regcache_sync_region(radio->core->regmap,
557 err = regcache_sync_region(radio->core->regmap,
563 err = regcache_sync_region(radio->core->regmap,
573 err = regcache_sync_region(radio->core->regmap,
579 err = regcache_sync_region(radio->core->regmap,
586 if (si476x_core_has_diversity(radio->core)) {
587 err = si476x_core_cmd_fm_phase_diversity(radio->core,
588 radio->core->diversity_mode);
593 err = regcache_sync_region(radio->core->regmap,
600 return si476x_radio_init_vtable(radio, func);
604 static int si476x_radio_change_func(struct si476x_radio *radio,
614 if (func == radio->core->power_up_parameters.func)
618 err = si476x_core_stop(radio->core, soft);
625 err = si476x_core_stop(radio->core, soft);
630 Set the desired radio tuner function
632 radio->core->power_up_parameters.func = func;
634 err = si476x_core_start(radio->core, soft);
646 return si476x_radio_do_post_powerup_init(radio, func);
653 struct si476x_radio *radio = video_drvdata(file);
659 si476x_core_lock(radio->core);
661 if (radio->ops->rsq_status) {
671 err = radio->ops->rsq_status(radio->core, &args, &report);
673 f->frequency = si476x_to_v4l2(radio->core,
679 si476x_core_unlock(radio->core);
690 struct si476x_radio *radio = video_drvdata(file);
703 si476x_core_lock(radio->core);
711 (!si476x_core_has_am(radio->core) ||
712 si476x_core_is_a_secondary_tuner(radio->core))) {
717 err = si476x_radio_change_func(radio, func);
724 args.freq = v4l2_to_si476x(radio->core, freq);
729 err = radio->ops->tune_freq(radio->core, &args);
732 si476x_core_unlock(radio->core);
742 struct si476x_radio *radio = video_drvdata(file);
751 si476x_core_lock(radio->core);
754 err = regmap_read(radio->core->regmap,
759 rangelow = si476x_to_v4l2(radio->core, rangelow);
762 err = regmap_read(radio->core->regmap,
767 rangehigh = si476x_to_v4l2(radio->core, rangehigh);
779 } else if (si476x_core_has_am(radio->core) &&
788 err = si476x_radio_change_func(radio, func);
793 err = regmap_write(radio->core->regmap,
795 v4l2_to_si476x(radio->core,
801 err = regmap_write(radio->core->regmap,
803 v4l2_to_si476x(radio->core,
809 err = regmap_write(radio->core->regmap,
811 v4l2_to_si476x(radio->core,
817 err = radio->ops->seek_start(radio->core,
821 si476x_core_unlock(radio->core);
831 struct si476x_radio *radio = v4l2_ctrl_handler_to_radio(ctrl->handler);
833 si476x_core_lock(radio->core);
837 if (si476x_core_has_diversity(radio->core)) {
838 if (radio->ops->phase_diversity) {
839 retval = radio->ops->phase_div_status(radio->core);
857 si476x_core_unlock(radio->core);
866 struct si476x_radio *radio = v4l2_ctrl_handler_to_radio(ctrl->handler);
868 si476x_core_lock(radio->core);
872 retval = regmap_update_bits(radio->core->regmap,
880 retval = regmap_update_bits(radio->core->regmap,
886 retval = regmap_update_bits(radio->core->regmap,
892 retval = regmap_update_bits(radio->core->regmap,
903 retval = regmap_write(radio->core->regmap,
908 retval = regmap_write(radio->core->regmap,
913 retval = regmap_write(radio->core->regmap,
923 if (si476x_core_is_in_am_receiver_mode(radio->core))
924 regcache_cache_only(radio->core->regmap, true);
927 retval = regmap_write(radio->core->regmap,
929 radio->core->rds_fifo_depth);
933 if (radio->core->client->irq) {
934 retval = regmap_write(radio->core->regmap,
942 retval = si476x_core_cmd_fm_rds_status(radio->core,
950 retval = regmap_update_bits(radio->core->regmap,
955 retval = regmap_update_bits(radio->core->regmap,
961 if (si476x_core_is_in_am_receiver_mode(radio->core))
962 regcache_cache_only(radio->core->regmap, false);
965 retval = regmap_write(radio->core->regmap,
973 if (mode == radio->core->diversity_mode) {
978 if (si476x_core_is_in_am_receiver_mode(radio->core)) {
983 radio->core->diversity_mode = mode;
986 retval = radio->ops->phase_diversity(radio->core, mode);
988 radio->core->diversity_mode = mode;
997 si476x_core_unlock(radio->core);
1008 struct si476x_radio *radio = video_drvdata(file);
1010 si476x_core_lock(radio->core);
1012 err = regmap_read(radio->core->regmap,
1015 si476x_core_unlock(radio->core);
1024 struct si476x_radio *radio = video_drvdata(file);
1026 si476x_core_lock(radio->core);
1027 err = regmap_write(radio->core->regmap,
1030 si476x_core_unlock(radio->core);
1038 struct si476x_radio *radio = video_drvdata(file);
1046 si476x_core_lock(radio->core);
1047 err = si476x_core_set_power_state(radio->core,
1052 err = si476x_radio_do_post_powerup_init(radio,
1053 radio->core->power_up_parameters.func);
1057 err = si476x_radio_pretune(radio,
1058 radio->core->power_up_parameters.func);
1062 si476x_core_unlock(radio->core);
1064 v4l2_ctrl_handler_setup(&radio->ctrl_handler);
1070 si476x_core_set_power_state(radio->core,
1073 si476x_core_unlock(radio->core);
1082 struct si476x_radio *radio = video_drvdata(file);
1085 atomic_read(&radio->core->is_alive))
1086 si476x_core_set_power_state(radio->core,
1101 struct si476x_radio *radio = video_drvdata(file);
1104 if (kfifo_is_empty(&radio->core->rds_fifo)) {
1108 rval = wait_event_interruptible(radio->core->rds_read_queue,
1109 (!kfifo_is_empty(&radio->core->rds_fifo) ||
1110 !atomic_read(&radio->core->is_alive)));
1114 if (!atomic_read(&radio->core->is_alive))
1118 fifo_len = kfifo_len(&radio->core->rds_fifo);
1120 if (kfifo_to_user(&radio->core->rds_fifo, buf,
1123 dev_warn(&radio->videodev.dev,
1136 struct si476x_radio *radio = video_drvdata(file);
1141 if (atomic_read(&radio->core->is_alive))
1142 poll_wait(file, &radio->core->rds_read_queue, pts);
1144 if (!atomic_read(&radio->core->is_alive))
1147 if (!kfifo_is_empty(&radio->core->rds_fifo))
1197 struct si476x_radio *radio = file->private_data;
1200 si476x_core_lock(radio->core);
1201 if (radio->ops->acf_status)
1202 err = radio->ops->acf_status(radio->core, &report);
1205 si476x_core_unlock(radio->core);
1225 struct si476x_radio *radio = file->private_data;
1228 si476x_core_lock(radio->core);
1229 if (radio->ops->rds_blckcnt)
1230 err = radio->ops->rds_blckcnt(radio->core, true,
1234 si476x_core_unlock(radio->core);
1254 struct si476x_radio *radio = file->private_data;
1257 si476x_core_lock(radio->core);
1258 if (radio->ops->rds_blckcnt)
1259 err = radio->ops->agc_status(radio->core, &report);
1262 si476x_core_unlock(radio->core);
1282 struct si476x_radio *radio = file->private_data;
1292 si476x_core_lock(radio->core);
1293 if (radio->ops->rds_blckcnt)
1294 err = radio->ops->rsq_status(radio->core, &args, &report);
1297 si476x_core_unlock(radio->core);
1317 struct si476x_radio *radio = file->private_data;
1327 si476x_core_lock(radio->core);
1328 if (radio->ops->rds_blckcnt)
1329 err = radio->ops->rsq_status(radio->core, &args, &report);
1332 si476x_core_unlock(radio->core);
1348 static void si476x_radio_init_debugfs(struct si476x_radio *radio)
1350 radio->debugfs = debugfs_create_dir(dev_name(radio->v4l2dev.dev), NULL);
1352 debugfs_create_file("acf", S_IRUGO, radio->debugfs, radio,
1355 debugfs_create_file("rds_blckcnt", S_IRUGO, radio->debugfs, radio,
1358 debugfs_create_file("agc", S_IRUGO, radio->debugfs, radio,
1361 debugfs_create_file("rsq", S_IRUGO, radio->debugfs, radio,
1364 debugfs_create_file("rsq_primary", S_IRUGO, radio->debugfs, radio,
1369 static int si476x_radio_add_new_custom(struct si476x_radio *radio,
1375 ctrl = v4l2_ctrl_new_custom(&radio->ctrl_handler,
1378 rval = radio->ctrl_handler.error;
1380 dev_err(radio->v4l2dev.dev,
1390 struct si476x_radio *radio;
1395 radio = devm_kzalloc(&pdev->dev, sizeof(*radio), GFP_KERNEL);
1396 if (!radio)
1399 radio->core = i2c_mfd_cell_to_core(&pdev->dev);
1401 v4l2_device_set_name(&radio->v4l2dev, DRIVER_NAME, &instance);
1403 rval = v4l2_device_register(&pdev->dev, &radio->v4l2dev);
1409 memcpy(&radio->videodev, &si476x_viddev_template,
1412 radio->videodev.v4l2_dev = &radio->v4l2dev;
1413 radio->videodev.ioctl_ops = &si4761_ioctl_ops;
1414 radio->videodev.device_caps = V4L2_CAP_TUNER | V4L2_CAP_RADIO |
1417 si476x_core_lock(radio->core);
1418 if (!si476x_core_is_a_secondary_tuner(radio->core))
1419 radio->videodev.device_caps |= V4L2_CAP_RDS_CAPTURE |
1421 si476x_core_unlock(radio->core);
1423 video_set_drvdata(&radio->videodev, radio);
1424 platform_set_drvdata(pdev, radio);
1427 radio->v4l2dev.ctrl_handler = &radio->ctrl_handler;
1428 v4l2_ctrl_handler_init(&radio->ctrl_handler,
1431 if (si476x_core_has_am(radio->core)) {
1432 ctrl = v4l2_ctrl_new_std_menu(&radio->ctrl_handler,
1437 rval = radio->ctrl_handler.error;
1444 rval = si476x_radio_add_new_custom(radio,
1450 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_RSSI_THRESHOLD);
1454 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_SNR_THRESHOLD);
1458 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_MAX_TUNE_ERROR);
1462 ctrl = v4l2_ctrl_new_std_menu(&radio->ctrl_handler,
1466 rval = radio->ctrl_handler.error;
1473 ctrl = v4l2_ctrl_new_std(&radio->ctrl_handler, &si476x_ctrl_ops,
1476 rval = radio->ctrl_handler.error;
1483 if (si476x_core_has_diversity(radio->core)) {
1485 si476x_phase_diversity_mode_to_idx(radio->core->diversity_mode);
1486 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_DIVERSITY_MODE);
1490 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_INTERCHIP_LINK);
1496 rval = video_register_device(&radio->videodev, VFL_TYPE_RADIO, -1);
1502 si476x_radio_init_debugfs(radio);
1506 v4l2_ctrl_handler_free(radio->videodev.ctrl_handler);
1512 struct si476x_radio *radio = platform_get_drvdata(pdev);
1514 v4l2_ctrl_handler_free(radio->videodev.ctrl_handler);
1515 video_unregister_device(&radio->videodev);
1516 v4l2_device_unregister(&radio->v4l2dev);
1517 debugfs_remove_recursive(radio->debugfs);
1522 MODULE_ALIAS("platform:si476x-radio");