0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include "fmdrv.h"
0012 #include "fmdrv_common.h"
0013 #include "fmdrv_rx.h"
0014
0015 void fm_rx_reset_rds_cache(struct fmdev *fmdev)
0016 {
0017 fmdev->rx.rds.flag = FM_RDS_DISABLE;
0018 fmdev->rx.rds.last_blk_idx = 0;
0019 fmdev->rx.rds.wr_idx = 0;
0020 fmdev->rx.rds.rd_idx = 0;
0021
0022 if (fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON)
0023 fmdev->irq_info.mask |= FM_LEV_EVENT;
0024 }
0025
0026 void fm_rx_reset_station_info(struct fmdev *fmdev)
0027 {
0028 fmdev->rx.stat_info.picode = FM_NO_PI_CODE;
0029 fmdev->rx.stat_info.afcache_size = 0;
0030 fmdev->rx.stat_info.af_list_max = 0;
0031 }
0032
0033 int fm_rx_set_freq(struct fmdev *fmdev, u32 freq)
0034 {
0035 unsigned long timeleft;
0036 u16 payload, curr_frq, intr_flag;
0037 u32 curr_frq_in_khz;
0038 u32 resp_len;
0039 int ret;
0040
0041 if (freq < fmdev->rx.region.bot_freq || freq > fmdev->rx.region.top_freq) {
0042 fmerr("Invalid frequency %d\n", freq);
0043 return -EINVAL;
0044 }
0045
0046
0047 payload = FM_RX_AUDIO_ENABLE_I2S_AND_ANALOG;
0048
0049 ret = fmc_send_cmd(fmdev, AUDIO_ENABLE_SET, REG_WR, &payload,
0050 sizeof(payload), NULL, NULL);
0051 if (ret < 0)
0052 return ret;
0053
0054
0055 payload = FM_RX_IFFREQ_HILO_AUTOMATIC;
0056 ret = fmc_send_cmd(fmdev, HILO_SET, REG_WR, &payload,
0057 sizeof(payload), NULL, NULL);
0058 if (ret < 0)
0059 return ret;
0060
0061
0062 payload = (freq - fmdev->rx.region.bot_freq) / FM_FREQ_MUL;
0063
0064 ret = fmc_send_cmd(fmdev, FREQ_SET, REG_WR, &payload,
0065 sizeof(payload), NULL, NULL);
0066 if (ret < 0)
0067 return ret;
0068
0069
0070 ret = fmc_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, 2, NULL, NULL);
0071 if (ret < 0)
0072 return ret;
0073
0074
0075 intr_flag = fmdev->irq_info.mask;
0076 fmdev->irq_info.mask = (FM_FR_EVENT | FM_BL_EVENT);
0077 payload = fmdev->irq_info.mask;
0078 ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload,
0079 sizeof(payload), NULL, NULL);
0080 if (ret < 0)
0081 return ret;
0082
0083
0084 payload = FM_TUNER_PRESET_MODE;
0085 ret = fmc_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload,
0086 sizeof(payload), NULL, NULL);
0087 if (ret < 0)
0088 goto exit;
0089
0090
0091 init_completion(&fmdev->maintask_comp);
0092 timeleft = wait_for_completion_timeout(&fmdev->maintask_comp,
0093 FM_DRV_TX_TIMEOUT);
0094 if (!timeleft) {
0095 fmerr("Timeout(%d sec),didn't get tune ended int\n",
0096 jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000);
0097 ret = -ETIMEDOUT;
0098 goto exit;
0099 }
0100
0101
0102 ret = fmc_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, 2, &curr_frq, &resp_len);
0103 if (ret < 0)
0104 goto exit;
0105
0106 curr_frq = be16_to_cpu((__force __be16)curr_frq);
0107 curr_frq_in_khz = (fmdev->rx.region.bot_freq + ((u32)curr_frq * FM_FREQ_MUL));
0108
0109 if (curr_frq_in_khz != freq) {
0110 pr_info("Frequency is set to (%d) but requested freq is (%d)\n",
0111 curr_frq_in_khz, freq);
0112 }
0113
0114
0115 fmdev->rx.freq = curr_frq_in_khz;
0116 exit:
0117
0118 fmdev->irq_info.mask = intr_flag;
0119 payload = fmdev->irq_info.mask;
0120 ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload,
0121 sizeof(payload), NULL, NULL);
0122 if (ret < 0)
0123 return ret;
0124
0125
0126 fm_rx_reset_rds_cache(fmdev);
0127 fm_rx_reset_station_info(fmdev);
0128
0129 return ret;
0130 }
0131
0132 static int fm_rx_set_channel_spacing(struct fmdev *fmdev, u32 spacing)
0133 {
0134 u16 payload;
0135 int ret;
0136
0137 if (spacing > 0 && spacing <= 50000)
0138 spacing = FM_CHANNEL_SPACING_50KHZ;
0139 else if (spacing > 50000 && spacing <= 100000)
0140 spacing = FM_CHANNEL_SPACING_100KHZ;
0141 else
0142 spacing = FM_CHANNEL_SPACING_200KHZ;
0143
0144
0145 payload = spacing;
0146 ret = fmc_send_cmd(fmdev, CHANL_BW_SET, REG_WR, &payload,
0147 sizeof(payload), NULL, NULL);
0148 if (ret < 0)
0149 return ret;
0150
0151 fmdev->rx.region.chanl_space = spacing * FM_FREQ_MUL;
0152
0153 return ret;
0154 }
0155
0156 int fm_rx_seek(struct fmdev *fmdev, u32 seek_upward,
0157 u32 wrap_around, u32 spacing)
0158 {
0159 u32 resp_len;
0160 u16 curr_frq, next_frq, last_frq;
0161 u16 payload, int_reason, intr_flag;
0162 u16 offset, space_idx;
0163 unsigned long timeleft;
0164 int ret;
0165
0166
0167 ret = fm_rx_set_channel_spacing(fmdev, spacing);
0168 if (ret < 0) {
0169 fmerr("Failed to set channel spacing\n");
0170 return ret;
0171 }
0172
0173
0174 ret = fmc_send_cmd(fmdev, FREQ_SET, REG_RD, NULL,
0175 sizeof(curr_frq), &curr_frq, &resp_len);
0176 if (ret < 0)
0177 return ret;
0178
0179 curr_frq = be16_to_cpu((__force __be16)curr_frq);
0180 last_frq = (fmdev->rx.region.top_freq - fmdev->rx.region.bot_freq) / FM_FREQ_MUL;
0181
0182
0183 space_idx = fmdev->rx.region.chanl_space / FM_FREQ_MUL;
0184 offset = curr_frq % space_idx;
0185
0186 next_frq = seek_upward ? curr_frq + space_idx :
0187 curr_frq - space_idx ;
0188
0189
0190
0191
0192
0193 if ((short)next_frq < 0)
0194 next_frq = last_frq - offset;
0195 else if (next_frq > last_frq)
0196 next_frq = 0 + offset;
0197
0198 again:
0199
0200 payload = next_frq;
0201 ret = fmc_send_cmd(fmdev, FREQ_SET, REG_WR, &payload,
0202 sizeof(payload), NULL, NULL);
0203 if (ret < 0)
0204 return ret;
0205
0206
0207 payload = (seek_upward ? FM_SEARCH_DIRECTION_UP : FM_SEARCH_DIRECTION_DOWN);
0208 ret = fmc_send_cmd(fmdev, SEARCH_DIR_SET, REG_WR, &payload,
0209 sizeof(payload), NULL, NULL);
0210 if (ret < 0)
0211 return ret;
0212
0213
0214 ret = fmc_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, 2, NULL, NULL);
0215 if (ret < 0)
0216 return ret;
0217
0218
0219 intr_flag = fmdev->irq_info.mask;
0220 fmdev->irq_info.mask = (FM_FR_EVENT | FM_BL_EVENT);
0221 payload = fmdev->irq_info.mask;
0222 ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload,
0223 sizeof(payload), NULL, NULL);
0224 if (ret < 0)
0225 return ret;
0226
0227
0228 payload = FM_TUNER_AUTONOMOUS_SEARCH_MODE;
0229 ret = fmc_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload,
0230 sizeof(payload), NULL, NULL);
0231 if (ret < 0)
0232 return ret;
0233
0234
0235 init_completion(&fmdev->maintask_comp);
0236 timeleft = wait_for_completion_timeout(&fmdev->maintask_comp,
0237 FM_DRV_RX_SEEK_TIMEOUT);
0238 if (!timeleft) {
0239 fmerr("Timeout(%d sec),didn't get tune ended int\n",
0240 jiffies_to_msecs(FM_DRV_RX_SEEK_TIMEOUT) / 1000);
0241 return -ENODATA;
0242 }
0243
0244 int_reason = fmdev->irq_info.flag & (FM_TUNE_COMPLETE | FM_BAND_LIMIT);
0245
0246
0247 fmdev->irq_info.mask = intr_flag;
0248 payload = fmdev->irq_info.mask;
0249 ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload,
0250 sizeof(payload), NULL, NULL);
0251 if (ret < 0)
0252 return ret;
0253
0254 if (int_reason & FM_BL_EVENT) {
0255 if (wrap_around == 0) {
0256 fmdev->rx.freq = seek_upward ?
0257 fmdev->rx.region.top_freq :
0258 fmdev->rx.region.bot_freq;
0259 } else {
0260 fmdev->rx.freq = seek_upward ?
0261 fmdev->rx.region.bot_freq :
0262 fmdev->rx.region.top_freq;
0263
0264 next_frq = (fmdev->rx.freq -
0265 fmdev->rx.region.bot_freq) / FM_FREQ_MUL;
0266 goto again;
0267 }
0268 } else {
0269
0270 ret = fmc_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, 2,
0271 &curr_frq, &resp_len);
0272 if (ret < 0)
0273 return ret;
0274
0275 curr_frq = be16_to_cpu((__force __be16)curr_frq);
0276 fmdev->rx.freq = (fmdev->rx.region.bot_freq +
0277 ((u32)curr_frq * FM_FREQ_MUL));
0278
0279 }
0280
0281 fm_rx_reset_rds_cache(fmdev);
0282 fm_rx_reset_station_info(fmdev);
0283
0284 return ret;
0285 }
0286
0287 int fm_rx_set_volume(struct fmdev *fmdev, u16 vol_to_set)
0288 {
0289 u16 payload;
0290 int ret;
0291
0292 if (fmdev->curr_fmmode != FM_MODE_RX)
0293 return -EPERM;
0294
0295 if (vol_to_set > FM_RX_VOLUME_MAX) {
0296 fmerr("Volume is not within(%d-%d) range\n",
0297 FM_RX_VOLUME_MIN, FM_RX_VOLUME_MAX);
0298 return -EINVAL;
0299 }
0300 vol_to_set *= FM_RX_VOLUME_GAIN_STEP;
0301
0302 payload = vol_to_set;
0303 ret = fmc_send_cmd(fmdev, VOLUME_SET, REG_WR, &payload,
0304 sizeof(payload), NULL, NULL);
0305 if (ret < 0)
0306 return ret;
0307
0308 fmdev->rx.volume = vol_to_set;
0309 return ret;
0310 }
0311
0312
0313 int fm_rx_get_volume(struct fmdev *fmdev, u16 *curr_vol)
0314 {
0315 if (fmdev->curr_fmmode != FM_MODE_RX)
0316 return -EPERM;
0317
0318 if (curr_vol == NULL) {
0319 fmerr("Invalid memory\n");
0320 return -ENOMEM;
0321 }
0322
0323 *curr_vol = fmdev->rx.volume / FM_RX_VOLUME_GAIN_STEP;
0324
0325 return 0;
0326 }
0327
0328
0329 int fm_rx_get_band_freq_range(struct fmdev *fmdev, u32 *bot_freq, u32 *top_freq)
0330 {
0331 if (bot_freq != NULL)
0332 *bot_freq = fmdev->rx.region.bot_freq;
0333
0334 if (top_freq != NULL)
0335 *top_freq = fmdev->rx.region.top_freq;
0336
0337 return 0;
0338 }
0339
0340
0341 void fm_rx_get_region(struct fmdev *fmdev, u8 *region)
0342 {
0343 *region = fmdev->rx.region.fm_band;
0344 }
0345
0346
0347 int fm_rx_set_region(struct fmdev *fmdev, u8 region_to_set)
0348 {
0349 u16 payload;
0350 u32 new_frq = 0;
0351 int ret;
0352
0353 if (region_to_set != FM_BAND_EUROPE_US &&
0354 region_to_set != FM_BAND_JAPAN) {
0355 fmerr("Invalid band\n");
0356 return -EINVAL;
0357 }
0358
0359 if (fmdev->rx.region.fm_band == region_to_set) {
0360 fmerr("Requested band is already configured\n");
0361 return 0;
0362 }
0363
0364
0365 payload = (u16)region_to_set;
0366 ret = fmc_send_cmd(fmdev, BAND_SET, REG_WR, &payload,
0367 sizeof(payload), NULL, NULL);
0368 if (ret < 0)
0369 return ret;
0370
0371 fmc_update_region_info(fmdev, region_to_set);
0372
0373
0374 if (fmdev->rx.freq < fmdev->rx.region.bot_freq)
0375 new_frq = fmdev->rx.region.bot_freq;
0376 else if (fmdev->rx.freq > fmdev->rx.region.top_freq)
0377 new_frq = fmdev->rx.region.top_freq;
0378
0379 if (new_frq) {
0380 fmdbg("Current freq is not within band limit boundary,switching to %d KHz\n",
0381 new_frq);
0382
0383 ret = fm_rx_set_freq(fmdev, new_frq);
0384 }
0385
0386 return ret;
0387 }
0388
0389
0390 int fm_rx_get_mute_mode(struct fmdev *fmdev, u8 *curr_mute_mode)
0391 {
0392 if (fmdev->curr_fmmode != FM_MODE_RX)
0393 return -EPERM;
0394
0395 if (curr_mute_mode == NULL) {
0396 fmerr("Invalid memory\n");
0397 return -ENOMEM;
0398 }
0399
0400 *curr_mute_mode = fmdev->rx.mute_mode;
0401
0402 return 0;
0403 }
0404
0405 static int fm_config_rx_mute_reg(struct fmdev *fmdev)
0406 {
0407 u16 payload, muteval;
0408 int ret;
0409
0410 muteval = 0;
0411 switch (fmdev->rx.mute_mode) {
0412 case FM_MUTE_ON:
0413 muteval = FM_RX_AC_MUTE_MODE;
0414 break;
0415
0416 case FM_MUTE_OFF:
0417 muteval = FM_RX_UNMUTE_MODE;
0418 break;
0419
0420 case FM_MUTE_ATTENUATE:
0421 muteval = FM_RX_SOFT_MUTE_FORCE_MODE;
0422 break;
0423 }
0424 if (fmdev->rx.rf_depend_mute == FM_RX_RF_DEPENDENT_MUTE_ON)
0425 muteval |= FM_RX_RF_DEP_MODE;
0426 else
0427 muteval &= ~FM_RX_RF_DEP_MODE;
0428
0429 payload = muteval;
0430 ret = fmc_send_cmd(fmdev, MUTE_STATUS_SET, REG_WR, &payload,
0431 sizeof(payload), NULL, NULL);
0432 if (ret < 0)
0433 return ret;
0434
0435 return 0;
0436 }
0437
0438
0439 int fm_rx_set_mute_mode(struct fmdev *fmdev, u8 mute_mode_toset)
0440 {
0441 u8 org_state;
0442 int ret;
0443
0444 if (fmdev->rx.mute_mode == mute_mode_toset)
0445 return 0;
0446
0447 org_state = fmdev->rx.mute_mode;
0448 fmdev->rx.mute_mode = mute_mode_toset;
0449
0450 ret = fm_config_rx_mute_reg(fmdev);
0451 if (ret < 0) {
0452 fmdev->rx.mute_mode = org_state;
0453 return ret;
0454 }
0455
0456 return 0;
0457 }
0458
0459
0460 int fm_rx_get_rfdepend_softmute(struct fmdev *fmdev, u8 *curr_mute_mode)
0461 {
0462 if (fmdev->curr_fmmode != FM_MODE_RX)
0463 return -EPERM;
0464
0465 if (curr_mute_mode == NULL) {
0466 fmerr("Invalid memory\n");
0467 return -ENOMEM;
0468 }
0469
0470 *curr_mute_mode = fmdev->rx.rf_depend_mute;
0471
0472 return 0;
0473 }
0474
0475
0476 int fm_rx_set_rfdepend_softmute(struct fmdev *fmdev, u8 rfdepend_mute)
0477 {
0478 u8 org_state;
0479 int ret;
0480
0481 if (fmdev->curr_fmmode != FM_MODE_RX)
0482 return -EPERM;
0483
0484 if (rfdepend_mute != FM_RX_RF_DEPENDENT_MUTE_ON &&
0485 rfdepend_mute != FM_RX_RF_DEPENDENT_MUTE_OFF) {
0486 fmerr("Invalid RF dependent soft mute\n");
0487 return -EINVAL;
0488 }
0489 if (fmdev->rx.rf_depend_mute == rfdepend_mute)
0490 return 0;
0491
0492 org_state = fmdev->rx.rf_depend_mute;
0493 fmdev->rx.rf_depend_mute = rfdepend_mute;
0494
0495 ret = fm_config_rx_mute_reg(fmdev);
0496 if (ret < 0) {
0497 fmdev->rx.rf_depend_mute = org_state;
0498 return ret;
0499 }
0500
0501 return 0;
0502 }
0503
0504
0505 int fm_rx_get_rssi_level(struct fmdev *fmdev, u16 *rssilvl)
0506 {
0507 __be16 curr_rssi_lel;
0508 u32 resp_len;
0509 int ret;
0510
0511 if (rssilvl == NULL) {
0512 fmerr("Invalid memory\n");
0513 return -ENOMEM;
0514 }
0515
0516 ret = fmc_send_cmd(fmdev, RSSI_LVL_GET, REG_RD, NULL, 2,
0517 &curr_rssi_lel, &resp_len);
0518 if (ret < 0)
0519 return ret;
0520
0521 *rssilvl = be16_to_cpu(curr_rssi_lel);
0522
0523 return 0;
0524 }
0525
0526
0527
0528
0529
0530 int fm_rx_set_rssi_threshold(struct fmdev *fmdev, short rssi_lvl_toset)
0531 {
0532 u16 payload;
0533 int ret;
0534
0535 if (rssi_lvl_toset < FM_RX_RSSI_THRESHOLD_MIN ||
0536 rssi_lvl_toset > FM_RX_RSSI_THRESHOLD_MAX) {
0537 fmerr("Invalid RSSI threshold level\n");
0538 return -EINVAL;
0539 }
0540 payload = (u16)rssi_lvl_toset;
0541 ret = fmc_send_cmd(fmdev, SEARCH_LVL_SET, REG_WR, &payload,
0542 sizeof(payload), NULL, NULL);
0543 if (ret < 0)
0544 return ret;
0545
0546 fmdev->rx.rssi_threshold = rssi_lvl_toset;
0547
0548 return 0;
0549 }
0550
0551
0552 int fm_rx_get_rssi_threshold(struct fmdev *fmdev, short *curr_rssi_lvl)
0553 {
0554 if (fmdev->curr_fmmode != FM_MODE_RX)
0555 return -EPERM;
0556
0557 if (curr_rssi_lvl == NULL) {
0558 fmerr("Invalid memory\n");
0559 return -ENOMEM;
0560 }
0561
0562 *curr_rssi_lvl = fmdev->rx.rssi_threshold;
0563
0564 return 0;
0565 }
0566
0567
0568 int fm_rx_set_stereo_mono(struct fmdev *fmdev, u16 mode)
0569 {
0570 u16 payload;
0571 int ret;
0572
0573 if (mode != FM_STEREO_MODE && mode != FM_MONO_MODE) {
0574 fmerr("Invalid mode\n");
0575 return -EINVAL;
0576 }
0577
0578
0579 payload = (u16)mode;
0580 ret = fmc_send_cmd(fmdev, MOST_MODE_SET, REG_WR, &payload,
0581 sizeof(payload), NULL, NULL);
0582 if (ret < 0)
0583 return ret;
0584
0585
0586 payload = FM_STEREO_SOFT_BLEND;
0587 ret = fmc_send_cmd(fmdev, MOST_BLEND_SET, REG_WR, &payload,
0588 sizeof(payload), NULL, NULL);
0589 if (ret < 0)
0590 return ret;
0591
0592 return 0;
0593 }
0594
0595
0596 int fm_rx_get_stereo_mono(struct fmdev *fmdev, u16 *mode)
0597 {
0598 __be16 curr_mode;
0599 u32 resp_len;
0600 int ret;
0601
0602 if (mode == NULL) {
0603 fmerr("Invalid memory\n");
0604 return -ENOMEM;
0605 }
0606
0607 ret = fmc_send_cmd(fmdev, MOST_MODE_SET, REG_RD, NULL, 2,
0608 &curr_mode, &resp_len);
0609 if (ret < 0)
0610 return ret;
0611
0612 *mode = be16_to_cpu(curr_mode);
0613
0614 return 0;
0615 }
0616
0617
0618 int fm_rx_set_deemphasis_mode(struct fmdev *fmdev, u16 mode)
0619 {
0620 u16 payload;
0621 int ret;
0622
0623 if (fmdev->curr_fmmode != FM_MODE_RX)
0624 return -EPERM;
0625
0626 if (mode != FM_RX_EMPHASIS_FILTER_50_USEC &&
0627 mode != FM_RX_EMPHASIS_FILTER_75_USEC) {
0628 fmerr("Invalid rx de-emphasis mode (%d)\n", mode);
0629 return -EINVAL;
0630 }
0631
0632 payload = mode;
0633 ret = fmc_send_cmd(fmdev, DEMPH_MODE_SET, REG_WR, &payload,
0634 sizeof(payload), NULL, NULL);
0635 if (ret < 0)
0636 return ret;
0637
0638 fmdev->rx.deemphasis_mode = mode;
0639
0640 return 0;
0641 }
0642
0643
0644 int fm_rx_get_deemph_mode(struct fmdev *fmdev, u16 *curr_deemphasis_mode)
0645 {
0646 if (fmdev->curr_fmmode != FM_MODE_RX)
0647 return -EPERM;
0648
0649 if (curr_deemphasis_mode == NULL) {
0650 fmerr("Invalid memory\n");
0651 return -ENOMEM;
0652 }
0653
0654 *curr_deemphasis_mode = fmdev->rx.deemphasis_mode;
0655
0656 return 0;
0657 }
0658
0659
0660 int fm_rx_set_rds_mode(struct fmdev *fmdev, u8 rds_en_dis)
0661 {
0662 u16 payload;
0663 int ret;
0664
0665 if (rds_en_dis != FM_RDS_ENABLE && rds_en_dis != FM_RDS_DISABLE) {
0666 fmerr("Invalid rds option\n");
0667 return -EINVAL;
0668 }
0669
0670 if (rds_en_dis == FM_RDS_ENABLE
0671 && fmdev->rx.rds.flag == FM_RDS_DISABLE) {
0672
0673 payload = FM_RX_PWR_SET_FM_AND_RDS_BLK_ON;
0674 ret = fmc_send_cmd(fmdev, POWER_SET, REG_WR, &payload,
0675 sizeof(payload), NULL, NULL);
0676 if (ret < 0)
0677 return ret;
0678
0679
0680 payload = FM_RX_RDS_FLUSH_FIFO;
0681 ret = fmc_send_cmd(fmdev, RDS_CNTRL_SET, REG_WR, &payload,
0682 sizeof(payload), NULL, NULL);
0683 if (ret < 0)
0684 return ret;
0685
0686
0687 ret = fmc_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, 2,
0688 NULL, NULL);
0689 if (ret < 0)
0690 return ret;
0691
0692
0693 payload = FM_RX_RDS_FIFO_THRESHOLD;
0694 ret = fmc_send_cmd(fmdev, RDS_MEM_SET, REG_WR, &payload,
0695 sizeof(payload), NULL, NULL);
0696 if (ret < 0)
0697 return ret;
0698
0699
0700 fmdev->irq_info.mask |= FM_RDS_EVENT;
0701 payload = fmdev->irq_info.mask;
0702 ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload,
0703 sizeof(payload), NULL, NULL);
0704 if (ret < 0) {
0705 fmdev->irq_info.mask &= ~FM_RDS_EVENT;
0706 return ret;
0707 }
0708
0709
0710 fmdev->rx.rds.flag = FM_RDS_ENABLE;
0711 } else if (rds_en_dis == FM_RDS_DISABLE
0712 && fmdev->rx.rds.flag == FM_RDS_ENABLE) {
0713
0714 payload = FM_RX_PWR_SET_FM_ON_RDS_OFF;
0715 ret = fmc_send_cmd(fmdev, POWER_SET, REG_WR, &payload,
0716 sizeof(payload), NULL, NULL);
0717 if (ret < 0)
0718 return ret;
0719
0720
0721 fmdev->rx.rds.last_blk_idx = 0;
0722 fmdev->rx.rds.wr_idx = 0;
0723 fmdev->rx.rds.rd_idx = 0;
0724 fm_rx_reset_station_info(fmdev);
0725
0726
0727 fmdev->irq_info.mask &= ~(FM_RDS_EVENT);
0728 fmdev->rx.rds.flag = FM_RDS_DISABLE;
0729 }
0730
0731 return 0;
0732 }
0733
0734
0735 int fm_rx_get_rds_mode(struct fmdev *fmdev, u8 *curr_rds_en_dis)
0736 {
0737 if (fmdev->curr_fmmode != FM_MODE_RX)
0738 return -EPERM;
0739
0740 if (curr_rds_en_dis == NULL) {
0741 fmerr("Invalid memory\n");
0742 return -ENOMEM;
0743 }
0744
0745 *curr_rds_en_dis = fmdev->rx.rds.flag;
0746
0747 return 0;
0748 }
0749
0750
0751 int fm_rx_set_rds_system(struct fmdev *fmdev, u8 rds_mode)
0752 {
0753 u16 payload;
0754 int ret;
0755
0756 if (fmdev->curr_fmmode != FM_MODE_RX)
0757 return -EPERM;
0758
0759 if (rds_mode != FM_RDS_SYSTEM_RDS && rds_mode != FM_RDS_SYSTEM_RBDS) {
0760 fmerr("Invalid rds mode\n");
0761 return -EINVAL;
0762 }
0763
0764 payload = (u16)rds_mode;
0765 ret = fmc_send_cmd(fmdev, RDS_SYSTEM_SET, REG_WR, &payload,
0766 sizeof(payload), NULL, NULL);
0767 if (ret < 0)
0768 return ret;
0769
0770 fmdev->rx.rds_mode = rds_mode;
0771
0772 return 0;
0773 }
0774
0775
0776 int fm_rx_set_af_switch(struct fmdev *fmdev, u8 af_mode)
0777 {
0778 u16 payload;
0779 int ret;
0780
0781 if (fmdev->curr_fmmode != FM_MODE_RX)
0782 return -EPERM;
0783
0784 if (af_mode != FM_RX_RDS_AF_SWITCH_MODE_ON &&
0785 af_mode != FM_RX_RDS_AF_SWITCH_MODE_OFF) {
0786 fmerr("Invalid af mode\n");
0787 return -EINVAL;
0788 }
0789
0790 if (af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON)
0791 fmdev->irq_info.mask |= FM_LEV_EVENT;
0792 else
0793 fmdev->irq_info.mask &= ~FM_LEV_EVENT;
0794
0795 payload = fmdev->irq_info.mask;
0796 ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload,
0797 sizeof(payload), NULL, NULL);
0798 if (ret < 0)
0799 return ret;
0800
0801 fmdev->rx.af_mode = af_mode;
0802
0803 return 0;
0804 }
0805
0806
0807 int fm_rx_get_af_switch(struct fmdev *fmdev, u8 *af_mode)
0808 {
0809 if (fmdev->curr_fmmode != FM_MODE_RX)
0810 return -EPERM;
0811
0812 if (af_mode == NULL) {
0813 fmerr("Invalid memory\n");
0814 return -ENOMEM;
0815 }
0816
0817 *af_mode = fmdev->rx.af_mode;
0818
0819 return 0;
0820 }