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
327 struct si476x_radio *radio = video_drvdata(file);
329 strscpy(capability->driver, radio->v4l2dev.name,
333 "platform:%s", radio->v4l2dev.name);
341 struct si476x_radio *radio = video_drvdata(file);
346 switch (radio->core->chip_id) {
379 struct si476x_radio *radio = video_drvdata(file);
401 si476x_core_lock(radio->core);
403 if (si476x_core_is_a_secondary_tuner(radio->core)) {
407 } else if (si476x_core_has_am(radio->core)) {
408 if (si476x_core_is_a_primary_tuner(radio->core))
430 tuner->audmode = radio->audmode;
435 err = radio->ops->rsq_status(radio->core,
446 si476x_core_unlock(radio->core);
454 struct si476x_radio *radio = video_drvdata(file);
461 radio->audmode = tuner->audmode;
463 radio->audmode = V4L2_TUNER_MODE_STEREO;
468 static int si476x_radio_init_vtable(struct si476x_radio *radio,
495 radio->ops = &fm_ops;
499 radio->ops = &am_ops;
507 static int si476x_radio_pretune(struct si476x_radio *radio,
523 args.freq = v4l2_to_si476x(radio->core,
525 retval = radio->ops->tune_freq(radio->core, &args);
528 args.freq = v4l2_to_si476x(radio->core,
530 retval = radio->ops->tune_freq(radio->core, &args);
539 static int si476x_radio_do_post_powerup_init(struct si476x_radio *radio,
544 /* regcache_mark_dirty(radio->core->regmap); */
545 err = regcache_sync_region(radio->core->regmap,
551 err = regcache_sync_region(radio->core->regmap,
557 err = regcache_sync_region(radio->core->regmap,
567 err = regcache_sync_region(radio->core->regmap,
573 err = regcache_sync_region(radio->core->regmap,
580 if (si476x_core_has_diversity(radio->core)) {
581 err = si476x_core_cmd_fm_phase_diversity(radio->core,
582 radio->core->diversity_mode);
587 err = regcache_sync_region(radio->core->regmap,
594 return si476x_radio_init_vtable(radio, func);
598 static int si476x_radio_change_func(struct si476x_radio *radio,
608 if (func == radio->core->power_up_parameters.func)
612 err = si476x_core_stop(radio->core, soft);
619 err = si476x_core_stop(radio->core, soft);
624 Set the desired radio tuner function
626 radio->core->power_up_parameters.func = func;
628 err = si476x_core_start(radio->core, soft);
640 return si476x_radio_do_post_powerup_init(radio, func);
647 struct si476x_radio *radio = video_drvdata(file);
653 si476x_core_lock(radio->core);
655 if (radio->ops->rsq_status) {
665 err = radio->ops->rsq_status(radio->core, &args, &report);
667 f->frequency = si476x_to_v4l2(radio->core,
673 si476x_core_unlock(radio->core);
684 struct si476x_radio *radio = video_drvdata(file);
697 si476x_core_lock(radio->core);
705 (!si476x_core_has_am(radio->core) ||
706 si476x_core_is_a_secondary_tuner(radio->core))) {
711 err = si476x_radio_change_func(radio, func);
718 args.freq = v4l2_to_si476x(radio->core, freq);
723 err = radio->ops->tune_freq(radio->core, &args);
726 si476x_core_unlock(radio->core);
736 struct si476x_radio *radio = video_drvdata(file);
745 si476x_core_lock(radio->core);
748 err = regmap_read(radio->core->regmap,
753 rangelow = si476x_to_v4l2(radio->core, rangelow);
756 err = regmap_read(radio->core->regmap,
761 rangehigh = si476x_to_v4l2(radio->core, rangehigh);
773 } else if (si476x_core_has_am(radio->core) &&
782 err = si476x_radio_change_func(radio, func);
787 err = regmap_write(radio->core->regmap,
789 v4l2_to_si476x(radio->core,
795 err = regmap_write(radio->core->regmap,
797 v4l2_to_si476x(radio->core,
803 err = regmap_write(radio->core->regmap,
805 v4l2_to_si476x(radio->core,
811 err = radio->ops->seek_start(radio->core,
815 si476x_core_unlock(radio->core);
825 struct si476x_radio *radio = v4l2_ctrl_handler_to_radio(ctrl->handler);
827 si476x_core_lock(radio->core);
831 if (si476x_core_has_diversity(radio->core)) {
832 if (radio->ops->phase_diversity) {
833 retval = radio->ops->phase_div_status(radio->core);
851 si476x_core_unlock(radio->core);
860 struct si476x_radio *radio = v4l2_ctrl_handler_to_radio(ctrl->handler);
862 si476x_core_lock(radio->core);
866 retval = regmap_update_bits(radio->core->regmap,
874 retval = regmap_update_bits(radio->core->regmap,
880 retval = regmap_update_bits(radio->core->regmap,
886 retval = regmap_update_bits(radio->core->regmap,
897 retval = regmap_write(radio->core->regmap,
902 retval = regmap_write(radio->core->regmap,
907 retval = regmap_write(radio->core->regmap,
917 if (si476x_core_is_in_am_receiver_mode(radio->core))
918 regcache_cache_only(radio->core->regmap, true);
921 retval = regmap_write(radio->core->regmap,
923 radio->core->rds_fifo_depth);
927 if (radio->core->client->irq) {
928 retval = regmap_write(radio->core->regmap,
936 retval = si476x_core_cmd_fm_rds_status(radio->core,
944 retval = regmap_update_bits(radio->core->regmap,
949 retval = regmap_update_bits(radio->core->regmap,
955 if (si476x_core_is_in_am_receiver_mode(radio->core))
956 regcache_cache_only(radio->core->regmap, false);
959 retval = regmap_write(radio->core->regmap,
967 if (mode == radio->core->diversity_mode) {
972 if (si476x_core_is_in_am_receiver_mode(radio->core)) {
977 radio->core->diversity_mode = mode;
980 retval = radio->ops->phase_diversity(radio->core, mode);
982 radio->core->diversity_mode = mode;
991 si476x_core_unlock(radio->core);
1002 struct si476x_radio *radio = video_drvdata(file);
1004 si476x_core_lock(radio->core);
1006 err = regmap_read(radio->core->regmap,
1009 si476x_core_unlock(radio->core);
1018 struct si476x_radio *radio = video_drvdata(file);
1020 si476x_core_lock(radio->core);
1021 err = regmap_write(radio->core->regmap,
1024 si476x_core_unlock(radio->core);
1032 struct si476x_radio *radio = video_drvdata(file);
1040 si476x_core_lock(radio->core);
1041 err = si476x_core_set_power_state(radio->core,
1046 err = si476x_radio_do_post_powerup_init(radio,
1047 radio->core->power_up_parameters.func);
1051 err = si476x_radio_pretune(radio,
1052 radio->core->power_up_parameters.func);
1056 si476x_core_unlock(radio->core);
1058 v4l2_ctrl_handler_setup(&radio->ctrl_handler);
1064 si476x_core_set_power_state(radio->core,
1067 si476x_core_unlock(radio->core);
1075 struct si476x_radio *radio = video_drvdata(file);
1078 atomic_read(&radio->core->is_alive))
1079 si476x_core_set_power_state(radio->core,
1092 struct si476x_radio *radio = video_drvdata(file);
1095 if (kfifo_is_empty(&radio->core->rds_fifo)) {
1099 rval = wait_event_interruptible(radio->core->rds_read_queue,
1100 (!kfifo_is_empty(&radio->core->rds_fifo) ||
1101 !atomic_read(&radio->core->is_alive)));
1105 if (!atomic_read(&radio->core->is_alive))
1109 fifo_len = kfifo_len(&radio->core->rds_fifo);
1111 if (kfifo_to_user(&radio->core->rds_fifo, buf,
1114 dev_warn(&radio->videodev.dev,
1127 struct si476x_radio *radio = video_drvdata(file);
1132 if (atomic_read(&radio->core->is_alive))
1133 poll_wait(file, &radio->core->rds_read_queue, pts);
1135 if (!atomic_read(&radio->core->is_alive))
1138 if (!kfifo_is_empty(&radio->core->rds_fifo))
1188 struct si476x_radio *radio = file->private_data;
1191 si476x_core_lock(radio->core);
1192 if (radio->ops->acf_status)
1193 err = radio->ops->acf_status(radio->core, &report);
1196 si476x_core_unlock(radio->core);
1216 struct si476x_radio *radio = file->private_data;
1219 si476x_core_lock(radio->core);
1220 if (radio->ops->rds_blckcnt)
1221 err = radio->ops->rds_blckcnt(radio->core, true,
1225 si476x_core_unlock(radio->core);
1245 struct si476x_radio *radio = file->private_data;
1248 si476x_core_lock(radio->core);
1249 if (radio->ops->rds_blckcnt)
1250 err = radio->ops->agc_status(radio->core, &report);
1253 si476x_core_unlock(radio->core);
1273 struct si476x_radio *radio = file->private_data;
1283 si476x_core_lock(radio->core);
1284 if (radio->ops->rds_blckcnt)
1285 err = radio->ops->rsq_status(radio->core, &args, &report);
1288 si476x_core_unlock(radio->core);
1308 struct si476x_radio *radio = file->private_data;
1318 si476x_core_lock(radio->core);
1319 if (radio->ops->rds_blckcnt)
1320 err = radio->ops->rsq_status(radio->core, &args, &report);
1323 si476x_core_unlock(radio->core);
1339 static void si476x_radio_init_debugfs(struct si476x_radio *radio)
1341 radio->debugfs = debugfs_create_dir(dev_name(radio->v4l2dev.dev), NULL);
1343 debugfs_create_file("acf", S_IRUGO, radio->debugfs, radio,
1346 debugfs_create_file("rds_blckcnt", S_IRUGO, radio->debugfs, radio,
1349 debugfs_create_file("agc", S_IRUGO, radio->debugfs, radio,
1352 debugfs_create_file("rsq", S_IRUGO, radio->debugfs, radio,
1355 debugfs_create_file("rsq_primary", S_IRUGO, radio->debugfs, radio,
1360 static int si476x_radio_add_new_custom(struct si476x_radio *radio,
1366 ctrl = v4l2_ctrl_new_custom(&radio->ctrl_handler,
1369 rval = radio->ctrl_handler.error;
1371 dev_err(radio->v4l2dev.dev,
1381 struct si476x_radio *radio;
1386 radio = devm_kzalloc(&pdev->dev, sizeof(*radio), GFP_KERNEL);
1387 if (!radio)
1390 radio->core = i2c_mfd_cell_to_core(&pdev->dev);
1392 v4l2_device_set_name(&radio->v4l2dev, DRIVER_NAME, &instance);
1394 rval = v4l2_device_register(&pdev->dev, &radio->v4l2dev);
1400 memcpy(&radio->videodev, &si476x_viddev_template,
1403 radio->videodev.v4l2_dev = &radio->v4l2dev;
1404 radio->videodev.ioctl_ops = &si4761_ioctl_ops;
1405 radio->videodev.device_caps = V4L2_CAP_TUNER | V4L2_CAP_RADIO |
1408 si476x_core_lock(radio->core);
1409 if (!si476x_core_is_a_secondary_tuner(radio->core))
1410 radio->videodev.device_caps |= V4L2_CAP_RDS_CAPTURE |
1412 si476x_core_unlock(radio->core);
1414 video_set_drvdata(&radio->videodev, radio);
1415 platform_set_drvdata(pdev, radio);
1418 radio->v4l2dev.ctrl_handler = &radio->ctrl_handler;
1419 v4l2_ctrl_handler_init(&radio->ctrl_handler,
1422 if (si476x_core_has_am(radio->core)) {
1423 ctrl = v4l2_ctrl_new_std_menu(&radio->ctrl_handler,
1428 rval = radio->ctrl_handler.error;
1435 rval = si476x_radio_add_new_custom(radio,
1441 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_RSSI_THRESHOLD);
1445 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_SNR_THRESHOLD);
1449 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_MAX_TUNE_ERROR);
1453 ctrl = v4l2_ctrl_new_std_menu(&radio->ctrl_handler,
1457 rval = radio->ctrl_handler.error;
1464 ctrl = v4l2_ctrl_new_std(&radio->ctrl_handler, &si476x_ctrl_ops,
1467 rval = radio->ctrl_handler.error;
1474 if (si476x_core_has_diversity(radio->core)) {
1476 si476x_phase_diversity_mode_to_idx(radio->core->diversity_mode);
1477 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_DIVERSITY_MODE);
1481 rval = si476x_radio_add_new_custom(radio, SI476X_IDX_INTERCHIP_LINK);
1487 rval = video_register_device(&radio->videodev, VFL_TYPE_RADIO, -1);
1493 si476x_radio_init_debugfs(radio);
1497 v4l2_ctrl_handler_free(radio->videodev.ctrl_handler);
1503 struct si476x_radio *radio = platform_get_drvdata(pdev);
1505 v4l2_ctrl_handler_free(radio->videodev.ctrl_handler);
1506 video_unregister_device(&radio->videodev);
1507 v4l2_device_unregister(&radio->v4l2dev);
1508 debugfs_remove_recursive(radio->debugfs);
1511 MODULE_ALIAS("platform:si476x-radio");