Lines Matching refs:fmdev

69 static void fm_irq_send_flag_getcmd(struct fmdev *);
70 static void fm_irq_handle_flag_getcmd_resp(struct fmdev *);
71 static void fm_irq_handle_hw_malfunction(struct fmdev *);
72 static void fm_irq_handle_rds_start(struct fmdev *);
73 static void fm_irq_send_rdsdata_getcmd(struct fmdev *);
74 static void fm_irq_handle_rdsdata_getcmd_resp(struct fmdev *);
75 static void fm_irq_handle_rds_finish(struct fmdev *);
76 static void fm_irq_handle_tune_op_ended(struct fmdev *);
77 static void fm_irq_handle_power_enb(struct fmdev *);
78 static void fm_irq_handle_low_rssi_start(struct fmdev *);
79 static void fm_irq_afjump_set_pi(struct fmdev *);
80 static void fm_irq_handle_set_pi_resp(struct fmdev *);
81 static void fm_irq_afjump_set_pimask(struct fmdev *);
82 static void fm_irq_handle_set_pimask_resp(struct fmdev *);
83 static void fm_irq_afjump_setfreq(struct fmdev *);
84 static void fm_irq_handle_setfreq_resp(struct fmdev *);
85 static void fm_irq_afjump_enableint(struct fmdev *);
86 static void fm_irq_afjump_enableint_resp(struct fmdev *);
87 static void fm_irq_start_afjump(struct fmdev *);
88 static void fm_irq_handle_start_afjump_resp(struct fmdev *);
89 static void fm_irq_afjump_rd_freq(struct fmdev *);
90 static void fm_irq_afjump_rd_freq_resp(struct fmdev *);
91 static void fm_irq_handle_low_rssi_finish(struct fmdev *);
92 static void fm_irq_send_intmsk_cmd(struct fmdev *);
93 static void fm_irq_handle_intmsk_cmd_resp(struct fmdev *);
171 static inline void fm_irq_call(struct fmdev *fmdev)
173 fmdev->irq_info.handlers[fmdev->irq_info.stage](fmdev);
177 static inline void fm_irq_call_stage(struct fmdev *fmdev, u8 stage)
179 fmdev->irq_info.stage = stage;
180 fm_irq_call(fmdev);
183 static inline void fm_irq_timeout_stage(struct fmdev *fmdev, u8 stage)
185 fmdev->irq_info.stage = stage;
186 mod_timer(&fmdev->irq_info.timer, jiffies + FM_DRV_TX_TIMEOUT);
241 void fmc_update_region_info(struct fmdev *fmdev, u8 region_to_set)
243 fmdev->rx.region = region_configs[region_to_set];
252 struct fmdev *fmdev;
259 fmdev = from_tasklet(fmdev, t, tx_task);
260 irq_info = &fmdev->irq_info;
262 while ((skb = skb_dequeue(&fmdev->rx_q))) {
277 if (!test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) {
278 set_bit(FM_INTTASK_RUNNING, &fmdev->flag);
288 irq_info->handlers[irq_info->stage](fmdev);
290 set_bit(FM_INTTASK_SCHEDULE_PENDING, &fmdev->flag);
295 else if (evt_hdr->op == fmdev->pre_op && fmdev->resp_comp != NULL) {
297 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
298 fmdev->resp_skb = skb;
299 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
300 complete(fmdev->resp_comp);
302 fmdev->resp_comp = NULL;
303 atomic_set(&fmdev->tx_cnt, 1);
306 else if (evt_hdr->op == fmdev->pre_op && fmdev->resp_comp == NULL) {
307 if (fmdev->resp_skb != NULL)
310 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
311 fmdev->resp_skb = skb;
312 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
315 irq_info->handlers[irq_info->stage](fmdev);
318 atomic_set(&fmdev->tx_cnt, 1);
327 if (num_fm_hci_cmds && atomic_read(&fmdev->tx_cnt))
328 if (!skb_queue_empty(&fmdev->tx_q))
329 tasklet_schedule(&fmdev->tx_task);
336 struct fmdev *fmdev;
340 fmdev = from_tasklet(fmdev, t, tx_task);
342 if (!atomic_read(&fmdev->tx_cnt))
346 if (time_is_before_jiffies(fmdev->last_tx_jiffies + FM_DRV_TX_TIMEOUT)) {
348 atomic_set(&fmdev->tx_cnt, 1);
352 skb = skb_dequeue(&fmdev->tx_q);
356 atomic_dec(&fmdev->tx_cnt);
357 fmdev->pre_op = fm_cb(skb)->fm_op;
359 if (fmdev->resp_comp != NULL)
362 fmdev->resp_comp = fm_cb(skb)->completion;
368 fmdev->resp_comp = NULL;
370 atomic_set(&fmdev->tx_cnt, 1);
372 fmdev->last_tx_jiffies = jiffies;
380 static int fm_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload,
391 if (test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag) && payload == NULL) {
395 if (!test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag))
410 if (!test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag) ||
411 test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) {
442 skb_queue_tail(&fmdev->tx_q, skb);
443 tasklet_schedule(&fmdev->tx_task);
449 int fmc_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload,
457 init_completion(&fmdev->maintask_comp);
458 ret = fm_send_cmd(fmdev, fm_op, type, payload, payload_len,
459 &fmdev->maintask_comp);
463 if (!wait_for_completion_timeout(&fmdev->maintask_comp,
469 if (!fmdev->resp_skb) {
473 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
474 skb = fmdev->resp_skb;
475 fmdev->resp_skb = NULL;
476 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
501 static inline int check_cmdresp_status(struct fmdev *fmdev,
507 del_timer(&fmdev->irq_info.timer);
509 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
510 *skb = fmdev->resp_skb;
511 fmdev->resp_skb = NULL;
512 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
519 mod_timer(&fmdev->irq_info.timer, jiffies + FM_DRV_TX_TIMEOUT);
526 static inline void fm_irq_common_cmd_resp_helper(struct fmdev *fmdev, u8 stage)
530 if (!check_cmdresp_status(fmdev, &skb))
531 fm_irq_call_stage(fmdev, stage);
543 struct fmdev *fmdev;
547 fmdev = from_timer(fmdev, t, irq_info.timer);
548 fmirq = &fmdev->irq_info;
559 fm_irq_call_stage(fmdev, FM_SEND_INTMSK_CMD_IDX);
563 static void fm_irq_send_flag_getcmd(struct fmdev *fmdev)
568 if (!fm_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, sizeof(flag), NULL))
569 fm_irq_timeout_stage(fmdev, FM_HANDLE_FLAG_GETCMD_RESP_IDX);
572 static void fm_irq_handle_flag_getcmd_resp(struct fmdev *fmdev)
577 if (check_cmdresp_status(fmdev, &skb))
581 if (fm_evt_hdr->dlen > sizeof(fmdev->irq_info.flag))
586 memcpy(&fmdev->irq_info.flag, skb->data, fm_evt_hdr->dlen);
588 fmdev->irq_info.flag = be16_to_cpu((__force __be16)fmdev->irq_info.flag);
589 fmdbg("irq: flag register(0x%x)\n", fmdev->irq_info.flag);
592 fm_irq_call_stage(fmdev, FM_HW_MAL_FUNC_IDX);
595 static void fm_irq_handle_hw_malfunction(struct fmdev *fmdev)
597 if (fmdev->irq_info.flag & FM_MAL_EVENT & fmdev->irq_info.mask)
601 fm_irq_call_stage(fmdev, FM_RDS_START_IDX);
604 static void fm_irq_handle_rds_start(struct fmdev *fmdev)
606 if (fmdev->irq_info.flag & FM_RDS_EVENT & fmdev->irq_info.mask) {
608 fmdev->irq_info.stage = FM_RDS_SEND_RDS_GETCMD_IDX;
611 fmdev->irq_info.stage = FM_HW_TUNE_OP_ENDED_IDX;
614 fm_irq_call(fmdev);
617 static void fm_irq_send_rdsdata_getcmd(struct fmdev *fmdev)
620 if (!fm_send_cmd(fmdev, RDS_DATA_GET, REG_RD, NULL,
622 fm_irq_timeout_stage(fmdev, FM_RDS_HANDLE_RDS_GETCMD_RESP_IDX);
626 static void fm_rx_update_af_cache(struct fmdev *fmdev, u8 af)
628 struct tuned_station_info *stat_info = &fmdev->rx.stat_info;
629 u8 reg_idx = fmdev->rx.region.fm_band;
635 fmdev->rx.stat_info.af_list_max = (af - FM_RDS_1_AF_FOLLOWS + 1);
636 fmdev->rx.stat_info.afcache_size = 0;
637 fmdbg("No of expected AF : %d\n", fmdev->rx.stat_info.af_list_max);
648 freq = fmdev->rx.region.bot_freq + (af * 100);
649 if (freq == fmdev->rx.freq) {
651 fmdev->rx.freq, freq);
679 static void fm_rdsparse_swapbytes(struct fmdev *fmdev,
690 if (fmdev->asci_id != 0x6350) {
699 static void fm_irq_handle_rdsdata_getcmd_resp(struct fmdev *fmdev)
703 struct fm_rds *rds = &fmdev->rx.rds;
710 if (check_cmdresp_status(fmdev, &skb))
750 fm_rdsparse_swapbytes(fmdev, &rds_fmt);
757 if (fmdev->rx.stat_info.picode != cur_picode)
758 fmdev->rx.stat_info.picode = cur_picode;
768 fm_rx_update_af_cache(fmdev, rds_fmt.data.group0A.af[0]);
769 fm_rx_update_af_cache(fmdev, rds_fmt.data.group0A.af[1]);
780 spin_lock_irqsave(&fmdev->rds_buff_lock, flags);
808 spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags);
814 fm_irq_call_stage(fmdev, FM_RDS_FINISH_IDX);
817 static void fm_irq_handle_rds_finish(struct fmdev *fmdev)
819 fm_irq_call_stage(fmdev, FM_HW_TUNE_OP_ENDED_IDX);
822 static void fm_irq_handle_tune_op_ended(struct fmdev *fmdev)
824 if (fmdev->irq_info.flag & (FM_FR_EVENT | FM_BL_EVENT) & fmdev->
827 if (test_and_clear_bit(FM_AF_SWITCH_INPROGRESS, &fmdev->flag)) {
828 fmdev->irq_info.stage = FM_AF_JUMP_RD_FREQ_IDX;
830 complete(&fmdev->maintask_comp);
831 fmdev->irq_info.stage = FM_HW_POWER_ENB_IDX;
834 fmdev->irq_info.stage = FM_HW_POWER_ENB_IDX;
836 fm_irq_call(fmdev);
839 static void fm_irq_handle_power_enb(struct fmdev *fmdev)
841 if (fmdev->irq_info.flag & FM_POW_ENB_EVENT) {
843 complete(&fmdev->maintask_comp);
846 fm_irq_call_stage(fmdev, FM_LOW_RSSI_START_IDX);
849 static void fm_irq_handle_low_rssi_start(struct fmdev *fmdev)
851 if ((fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON) &&
852 (fmdev->irq_info.flag & FM_LEV_EVENT & fmdev->irq_info.mask) &&
853 (fmdev->rx.freq != FM_UNDEFINED_FREQ) &&
854 (fmdev->rx.stat_info.afcache_size != 0)) {
858 fmdev->irq_info.mask &= ~FM_LEV_EVENT;
860 fmdev->rx.afjump_idx = 0;
861 fmdev->rx.freq_before_jump = fmdev->rx.freq;
862 fmdev->irq_info.stage = FM_AF_JUMP_SETPI_IDX;
865 fmdev->irq_info.stage = FM_SEND_INTMSK_CMD_IDX;
868 fm_irq_call(fmdev);
871 static void fm_irq_afjump_set_pi(struct fmdev *fmdev)
876 payload = fmdev->rx.stat_info.picode;
877 if (!fm_send_cmd(fmdev, RDS_PI_SET, REG_WR, &payload, sizeof(payload), NULL))
878 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SETPI_RESP_IDX);
881 static void fm_irq_handle_set_pi_resp(struct fmdev *fmdev)
883 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_SETPI_MASK_IDX);
891 static void fm_irq_afjump_set_pimask(struct fmdev *fmdev)
896 if (!fm_send_cmd(fmdev, RDS_PI_MASK_SET, REG_WR, &payload, sizeof(payload), NULL))
897 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SETPI_MASK_RESP_IDX);
900 static void fm_irq_handle_set_pimask_resp(struct fmdev *fmdev)
902 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_SET_AF_FREQ_IDX);
905 static void fm_irq_afjump_setfreq(struct fmdev *fmdev)
910 fmdbg("Switch to %d KHz\n", fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx]);
911 frq_index = (fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx] -
912 fmdev->rx.region.bot_freq) / FM_FREQ_MUL;
915 if (!fm_send_cmd(fmdev, AF_FREQ_SET, REG_WR, &payload, sizeof(payload), NULL))
916 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SET_AFFREQ_RESP_IDX);
919 static void fm_irq_handle_setfreq_resp(struct fmdev *fmdev)
921 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_ENABLE_INT_IDX);
924 static void fm_irq_afjump_enableint(struct fmdev *fmdev)
930 if (!fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, sizeof(payload), NULL))
931 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_ENABLE_INT_RESP_IDX);
934 static void fm_irq_afjump_enableint_resp(struct fmdev *fmdev)
936 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_START_AFJUMP_IDX);
939 static void fm_irq_start_afjump(struct fmdev *fmdev)
944 if (!fm_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload,
946 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_START_AFJUMP_RESP_IDX);
949 static void fm_irq_handle_start_afjump_resp(struct fmdev *fmdev)
953 if (check_cmdresp_status(fmdev, &skb))
956 fmdev->irq_info.stage = FM_SEND_FLAG_GETCMD_IDX;
957 set_bit(FM_AF_SWITCH_INPROGRESS, &fmdev->flag);
958 clear_bit(FM_INTTASK_RUNNING, &fmdev->flag);
961 static void fm_irq_afjump_rd_freq(struct fmdev *fmdev)
965 if (!fm_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, sizeof(payload), NULL))
966 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_RD_FREQ_RESP_IDX);
969 static void fm_irq_afjump_rd_freq_resp(struct fmdev *fmdev)
975 if (check_cmdresp_status(fmdev, &skb))
982 curr_freq = fmdev->rx.region.bot_freq + ((u32)read_freq * FM_FREQ_MUL);
984 jumped_freq = fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx];
987 if ((curr_freq != fmdev->rx.freq_before_jump) && (curr_freq == jumped_freq)) {
989 fmdev->rx.freq = curr_freq;
990 fm_rx_reset_rds_cache(fmdev);
993 if (fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON)
994 fmdev->irq_info.mask |= FM_LEV_EVENT;
996 fmdev->irq_info.stage = FM_LOW_RSSI_FINISH_IDX;
998 fmdev->rx.afjump_idx++;
1001 if (fmdev->rx.afjump_idx >= fmdev->rx.stat_info.afcache_size) {
1003 fmdev->irq_info.stage = FM_LOW_RSSI_FINISH_IDX;
1007 fmdev->irq_info.stage = FM_AF_JUMP_SETPI_IDX;
1010 fm_irq_call(fmdev);
1013 static void fm_irq_handle_low_rssi_finish(struct fmdev *fmdev)
1015 fm_irq_call_stage(fmdev, FM_SEND_INTMSK_CMD_IDX);
1018 static void fm_irq_send_intmsk_cmd(struct fmdev *fmdev)
1023 payload = fmdev->irq_info.mask;
1025 if (!fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload,
1027 fm_irq_timeout_stage(fmdev, FM_HANDLE_INTMSK_CMD_RESP_IDX);
1030 static void fm_irq_handle_intmsk_cmd_resp(struct fmdev *fmdev)
1034 if (check_cmdresp_status(fmdev, &skb))
1040 fmdev->irq_info.stage = FM_SEND_FLAG_GETCMD_IDX;
1043 if (test_and_clear_bit(FM_INTTASK_SCHEDULE_PENDING, &fmdev->flag))
1044 fmdev->irq_info.handlers[fmdev->irq_info.stage](fmdev);
1046 clear_bit(FM_INTTASK_RUNNING, &fmdev->flag);
1050 int fmc_is_rds_data_available(struct fmdev *fmdev, struct file *file,
1053 poll_wait(file, &fmdev->rx.rds.read_queue, pts);
1054 if (fmdev->rx.rds.rd_idx != fmdev->rx.rds.wr_idx)
1061 int fmc_transfer_rds_from_internal_buff(struct fmdev *fmdev, struct file *file,
1069 if (fmdev->rx.rds.wr_idx == fmdev->rx.rds.rd_idx) {
1073 ret = wait_event_interruptible(fmdev->rx.rds.read_queue,
1074 (fmdev->rx.rds.wr_idx != fmdev->rx.rds.rd_idx));
1085 spin_lock_irqsave(&fmdev->rds_buff_lock, flags);
1087 if (fmdev->rx.rds.wr_idx == fmdev->rx.rds.rd_idx) {
1088 spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags);
1091 memcpy(tmpbuf, &fmdev->rx.rds.buff[fmdev->rx.rds.rd_idx],
1093 fmdev->rx.rds.rd_idx += FM_RDS_BLK_SIZE;
1094 if (fmdev->rx.rds.rd_idx >= fmdev->rx.rds.buf_size)
1095 fmdev->rx.rds.rd_idx = 0;
1097 spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags);
1109 int fmc_set_freq(struct fmdev *fmdev, u32 freq_to_set)
1111 switch (fmdev->curr_fmmode) {
1113 return fm_rx_set_freq(fmdev, freq_to_set);
1116 return fm_tx_set_freq(fmdev, freq_to_set);
1123 int fmc_get_freq(struct fmdev *fmdev, u32 *cur_tuned_frq)
1125 if (fmdev->rx.freq == FM_UNDEFINED_FREQ) {
1134 switch (fmdev->curr_fmmode) {
1136 *cur_tuned_frq = fmdev->rx.freq;
1149 int fmc_set_region(struct fmdev *fmdev, u8 region_to_set)
1151 switch (fmdev->curr_fmmode) {
1153 return fm_rx_set_region(fmdev, region_to_set);
1156 return fm_tx_set_region(fmdev, region_to_set);
1163 int fmc_set_mute_mode(struct fmdev *fmdev, u8 mute_mode_toset)
1165 switch (fmdev->curr_fmmode) {
1167 return fm_rx_set_mute_mode(fmdev, mute_mode_toset);
1170 return fm_tx_set_mute_mode(fmdev, mute_mode_toset);
1177 int fmc_set_stereo_mono(struct fmdev *fmdev, u16 mode)
1179 switch (fmdev->curr_fmmode) {
1181 return fm_rx_set_stereo_mono(fmdev, mode);
1184 return fm_tx_set_stereo_mono(fmdev, mode);
1191 int fmc_set_rds_mode(struct fmdev *fmdev, u8 rds_en_dis)
1193 switch (fmdev->curr_fmmode) {
1195 return fm_rx_set_rds_mode(fmdev, rds_en_dis);
1198 return fm_tx_set_rds_mode(fmdev, rds_en_dis);
1206 static int fm_power_down(struct fmdev *fmdev)
1211 if (!test_bit(FM_CORE_READY, &fmdev->flag)) {
1215 if (fmdev->curr_fmmode == FM_MODE_OFF) {
1221 ret = fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload,
1226 return fmc_release(fmdev);
1230 static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name)
1239 set_bit(FM_FW_DW_INPROGRESS, &fmdev->flag);
1242 &fmdev->radio_dev->dev);
1269 ret = fmc_send_cmd(fmdev, 0, 0, action->data,
1289 clear_bit(FM_FW_DW_INPROGRESS, &fmdev->flag);
1295 static int load_default_rx_configuration(struct fmdev *fmdev)
1299 ret = fm_rx_set_volume(fmdev, FM_DEFAULT_RX_VOLUME);
1303 return fm_rx_set_rssi_threshold(fmdev, FM_DEFAULT_RSSI_THRESHOLD);
1307 static int fm_power_up(struct fmdev *fmdev, u8 mode)
1323 ret = fmc_prepare(fmdev);
1330 if (fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload,
1337 if (fmc_send_cmd(fmdev, ASIC_ID_GET, REG_RD, NULL,
1341 if (fmc_send_cmd(fmdev, ASIC_VER_GET, REG_RD, NULL,
1351 ret = fm_download_firmware(fmdev, fw_name);
1360 ret = fm_download_firmware(fmdev, fw_name);
1367 return fmc_release(fmdev);
1371 int fmc_set_mode(struct fmdev *fmdev, u8 fm_mode)
1379 if (fmdev->curr_fmmode == fm_mode) {
1386 ret = fm_power_down(fmdev);
1396 if (fmdev->curr_fmmode != FM_MODE_OFF) {
1397 ret = fm_power_down(fmdev);
1404 ret = fm_power_up(fmdev, fm_mode);
1410 fmdev->curr_fmmode = fm_mode;
1413 if (fmdev->curr_fmmode == FM_MODE_RX) {
1415 ret = load_default_rx_configuration(fmdev);
1424 int fmc_get_mode(struct fmdev *fmdev, u8 *fmmode)
1426 if (!test_bit(FM_CORE_READY, &fmdev->flag)) {
1435 *fmmode = fmdev->curr_fmmode;
1442 struct fmdev *fmdev;
1444 fmdev = arg;
1457 skb_queue_tail(&fmdev->rx_q, skb);
1458 tasklet_schedule(&fmdev->rx_task);
1469 struct fmdev *fmdev;
1471 fmdev = (struct fmdev *)arg;
1472 fmdev->streg_cbdata = data;
1480 int fmc_prepare(struct fmdev *fmdev)
1485 if (test_bit(FM_CORE_READY, &fmdev->flag)) {
1495 fm_st_proto.priv_data = fmdev;
1506 fmdev->streg_cbdata = -EINPROGRESS;
1515 if (fmdev->streg_cbdata != 0) {
1517 fmdev->streg_cbdata);
1537 spin_lock_init(&fmdev->rds_buff_lock);
1538 spin_lock_init(&fmdev->resp_skb_lock);
1541 skb_queue_head_init(&fmdev->tx_q);
1542 tasklet_setup(&fmdev->tx_task, send_tasklet);
1545 skb_queue_head_init(&fmdev->rx_q);
1546 tasklet_setup(&fmdev->rx_task, recv_tasklet);
1548 fmdev->irq_info.stage = 0;
1549 atomic_set(&fmdev->tx_cnt, 1);
1550 fmdev->resp_comp = NULL;
1552 timer_setup(&fmdev->irq_info.timer, int_timeout_handler, 0);
1554 fmdev->irq_info.mask = FM_MAL_EVENT;
1557 fmdev->rx.region = region_configs[default_radio_region];
1559 fmdev->rx.mute_mode = FM_MUTE_OFF;
1560 fmdev->rx.rf_depend_mute = FM_RX_RF_DEPENDENT_MUTE_OFF;
1561 fmdev->rx.rds.flag = FM_RDS_DISABLE;
1562 fmdev->rx.freq = FM_UNDEFINED_FREQ;
1563 fmdev->rx.rds_mode = FM_RDS_SYSTEM_RDS;
1564 fmdev->rx.af_mode = FM_RX_RDS_AF_SWITCH_MODE_OFF;
1565 fmdev->irq_info.retry = 0;
1567 fm_rx_reset_rds_cache(fmdev);
1568 init_waitqueue_head(&fmdev->rx.rds.read_queue);
1570 fm_rx_reset_station_info(fmdev);
1571 set_bit(FM_CORE_READY, &fmdev->flag);
1580 int fmc_release(struct fmdev *fmdev)
1585 if (!test_bit(FM_CORE_READY, &fmdev->flag)) {
1590 wake_up_interruptible(&fmdev->rx.rds.read_queue);
1592 tasklet_kill(&fmdev->tx_task);
1593 tasklet_kill(&fmdev->rx_task);
1595 skb_queue_purge(&fmdev->tx_q);
1596 skb_queue_purge(&fmdev->rx_q);
1598 fmdev->resp_comp = NULL;
1599 fmdev->rx.freq = 0;
1611 clear_bit(FM_CORE_READY, &fmdev->flag);
1621 struct fmdev *fmdev = NULL;
1626 fmdev = kzalloc(sizeof(struct fmdev), GFP_KERNEL);
1627 if (NULL == fmdev) {
1631 fmdev->rx.rds.buf_size = default_rds_buf * FM_RDS_BLK_SIZE;
1632 fmdev->rx.rds.buff = kzalloc(fmdev->rx.rds.buf_size, GFP_KERNEL);
1633 if (NULL == fmdev->rx.rds.buff) {
1638 ret = fm_v4l2_init_video_device(fmdev, radio_nr);
1642 fmdev->irq_info.handlers = int_handler_table;
1643 fmdev->curr_fmmode = FM_MODE_OFF;
1644 fmdev->tx_data.pwr_lvl = FM_PWR_LVL_DEF;
1645 fmdev->tx_data.preemph = FM_TX_PREEMPH_50US;
1649 kfree(fmdev->rx.rds.buff);
1651 kfree(fmdev);
1659 struct fmdev *fmdev = NULL;
1661 fmdev = fm_v4l2_deinit_video_device();
1662 if (fmdev != NULL) {
1663 kfree(fmdev->rx.rds.buff);
1664 kfree(fmdev);