/* Set modulator attributes. If mode is not TX, set to TX. */ static int fm_v4l2_vidioc_s_modulator(struct file *file, void *priv, struct v4l2_modulator *mod) { struct fmdev *fmdev = video_drvdata(file); u8 rds_mode; u16 aud_mode; int ret; if (mod->index != 0) return -EINVAL; if (fmdev->curr_fmmode != FM_MODE_TX) { ret = fmc_set_mode(fmdev, FM_MODE_TX); if (ret != 0) { fmerr("Failed to set TX mode\n"); return ret; } } aud_mode = (mod->txsubchans & V4L2_TUNER_SUB_STEREO) ? FM_STEREO_MODE : FM_MONO_MODE; rds_mode = (mod->txsubchans & V4L2_TUNER_SUB_RDS) ? FM_RDS_ENABLE : FM_RDS_DISABLE; ret = fm_tx_set_stereo_mono(fmdev, aud_mode); if (ret < 0) { fmerr("Failed to set mono/stereo mode for TX\n"); return ret; } ret = fm_tx_set_rds_mode(fmdev, rds_mode); if (ret < 0) fmerr("Failed to set rds mode for TX\n"); return ret; }
int fm_tx_set_radio_text(struct fmdev *fmdev, u8 *rds_text, u8 rds_type) { u16 payload; int ret; if (fmdev->curr_fmmode != FM_MODE_TX) return -EPERM; fm_tx_set_rds_mode(fmdev, 0); /* Set RDS length */ set_rds_len(fmdev, rds_type, strlen(rds_text)); /* Set RDS text */ set_rds_text(fmdev, rds_text); /* Set RDS mode */ set_rds_data_mode(fmdev, 0x0); payload = 1; ret = fmc_send_cmd(fmdev, RDS_DATA_ENB, REG_WR, &payload, sizeof(payload), NULL, NULL); if (ret < 0) return ret; return 0; }