Lines Matching refs:fmdev
79 static void fm_irq_send_flag_getcmd(struct fmdev *);
80 static void fm_irq_handle_flag_getcmd_resp(struct fmdev *);
81 static void fm_irq_handle_hw_malfunction(struct fmdev *);
82 static void fm_irq_handle_rds_start(struct fmdev *);
83 static void fm_irq_send_rdsdata_getcmd(struct fmdev *);
84 static void fm_irq_handle_rdsdata_getcmd_resp(struct fmdev *);
85 static void fm_irq_handle_rds_finish(struct fmdev *);
86 static void fm_irq_handle_tune_op_ended(struct fmdev *);
87 static void fm_irq_handle_power_enb(struct fmdev *);
88 static void fm_irq_handle_low_rssi_start(struct fmdev *);
89 static void fm_irq_afjump_set_pi(struct fmdev *);
90 static void fm_irq_handle_set_pi_resp(struct fmdev *);
91 static void fm_irq_afjump_set_pimask(struct fmdev *);
92 static void fm_irq_handle_set_pimask_resp(struct fmdev *);
93 static void fm_irq_afjump_setfreq(struct fmdev *);
94 static void fm_irq_handle_setfreq_resp(struct fmdev *);
95 static void fm_irq_afjump_enableint(struct fmdev *);
96 static void fm_irq_afjump_enableint_resp(struct fmdev *);
97 static void fm_irq_start_afjump(struct fmdev *);
98 static void fm_irq_handle_start_afjump_resp(struct fmdev *);
99 static void fm_irq_afjump_rd_freq(struct fmdev *);
100 static void fm_irq_afjump_rd_freq_resp(struct fmdev *);
101 static void fm_irq_handle_low_rssi_finish(struct fmdev *);
102 static void fm_irq_send_intmsk_cmd(struct fmdev *);
103 static void fm_irq_handle_intmsk_cmd_resp(struct fmdev *);
181 static inline void fm_irq_call(struct fmdev *fmdev) in fm_irq_call() argument
183 fmdev->irq_info.handlers[fmdev->irq_info.stage](fmdev); in fm_irq_call()
187 static inline void fm_irq_call_stage(struct fmdev *fmdev, u8 stage) in fm_irq_call_stage() argument
189 fmdev->irq_info.stage = stage; in fm_irq_call_stage()
190 fm_irq_call(fmdev); in fm_irq_call_stage()
193 static inline void fm_irq_timeout_stage(struct fmdev *fmdev, u8 stage) in fm_irq_timeout_stage() argument
195 fmdev->irq_info.stage = stage; in fm_irq_timeout_stage()
196 mod_timer(&fmdev->irq_info.timer, jiffies + FM_DRV_TX_TIMEOUT); in fm_irq_timeout_stage()
251 void fmc_update_region_info(struct fmdev *fmdev, u8 region_to_set) in fmc_update_region_info() argument
253 fmdev->rx.region = region_configs[region_to_set]; in fmc_update_region_info()
262 struct fmdev *fmdev; in recv_tasklet() local
269 fmdev = (struct fmdev *)arg; in recv_tasklet()
270 irq_info = &fmdev->irq_info; in recv_tasklet()
272 while ((skb = skb_dequeue(&fmdev->rx_q))) { in recv_tasklet()
287 if (!test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) { in recv_tasklet()
288 set_bit(FM_INTTASK_RUNNING, &fmdev->flag); in recv_tasklet()
298 irq_info->handlers[irq_info->stage](fmdev); in recv_tasklet()
300 set_bit(FM_INTTASK_SCHEDULE_PENDING, &fmdev->flag); in recv_tasklet()
305 else if (evt_hdr->op == fmdev->pre_op && fmdev->resp_comp != NULL) { in recv_tasklet()
307 spin_lock_irqsave(&fmdev->resp_skb_lock, flags); in recv_tasklet()
308 fmdev->resp_skb = skb; in recv_tasklet()
309 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); in recv_tasklet()
310 complete(fmdev->resp_comp); in recv_tasklet()
312 fmdev->resp_comp = NULL; in recv_tasklet()
313 atomic_set(&fmdev->tx_cnt, 1); in recv_tasklet()
316 else if (evt_hdr->op == fmdev->pre_op && fmdev->resp_comp == NULL) { in recv_tasklet()
317 if (fmdev->resp_skb != NULL) in recv_tasklet()
320 spin_lock_irqsave(&fmdev->resp_skb_lock, flags); in recv_tasklet()
321 fmdev->resp_skb = skb; in recv_tasklet()
322 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); in recv_tasklet()
325 irq_info->handlers[irq_info->stage](fmdev); in recv_tasklet()
328 atomic_set(&fmdev->tx_cnt, 1); in recv_tasklet()
337 if (num_fm_hci_cmds && atomic_read(&fmdev->tx_cnt)) in recv_tasklet()
338 if (!skb_queue_empty(&fmdev->tx_q)) in recv_tasklet()
339 tasklet_schedule(&fmdev->tx_task); in recv_tasklet()
346 struct fmdev *fmdev; in send_tasklet() local
350 fmdev = (struct fmdev *)arg; in send_tasklet()
352 if (!atomic_read(&fmdev->tx_cnt)) in send_tasklet()
356 if ((jiffies - fmdev->last_tx_jiffies) > FM_DRV_TX_TIMEOUT) { in send_tasklet()
358 atomic_set(&fmdev->tx_cnt, 1); in send_tasklet()
362 skb = skb_dequeue(&fmdev->tx_q); in send_tasklet()
366 atomic_dec(&fmdev->tx_cnt); in send_tasklet()
367 fmdev->pre_op = fm_cb(skb)->fm_op; in send_tasklet()
369 if (fmdev->resp_comp != NULL) in send_tasklet()
372 fmdev->resp_comp = fm_cb(skb)->completion; in send_tasklet()
378 fmdev->resp_comp = NULL; in send_tasklet()
380 atomic_set(&fmdev->tx_cnt, 1); in send_tasklet()
382 fmdev->last_tx_jiffies = jiffies; in send_tasklet()
390 static int fm_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload, in fm_send_cmd() argument
401 if (test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag) && payload == NULL) { in fm_send_cmd()
405 if (!test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag)) in fm_send_cmd()
420 if (!test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag) || in fm_send_cmd()
421 test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) { in fm_send_cmd()
452 skb_queue_tail(&fmdev->tx_q, skb); in fm_send_cmd()
453 tasklet_schedule(&fmdev->tx_task); in fm_send_cmd()
459 int fmc_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload, in fmc_send_cmd() argument
467 init_completion(&fmdev->maintask_comp); in fmc_send_cmd()
468 ret = fm_send_cmd(fmdev, fm_op, type, payload, payload_len, in fmc_send_cmd()
469 &fmdev->maintask_comp); in fmc_send_cmd()
473 if (!wait_for_completion_timeout(&fmdev->maintask_comp, in fmc_send_cmd()
480 if (!fmdev->resp_skb) { in fmc_send_cmd()
484 spin_lock_irqsave(&fmdev->resp_skb_lock, flags); in fmc_send_cmd()
485 skb = fmdev->resp_skb; in fmc_send_cmd()
486 fmdev->resp_skb = NULL; in fmc_send_cmd()
487 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); in fmc_send_cmd()
511 static inline int check_cmdresp_status(struct fmdev *fmdev, in check_cmdresp_status() argument
517 del_timer(&fmdev->irq_info.timer); in check_cmdresp_status()
519 spin_lock_irqsave(&fmdev->resp_skb_lock, flags); in check_cmdresp_status()
520 *skb = fmdev->resp_skb; in check_cmdresp_status()
521 fmdev->resp_skb = NULL; in check_cmdresp_status()
522 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); in check_cmdresp_status()
530 mod_timer(&fmdev->irq_info.timer, jiffies + FM_DRV_TX_TIMEOUT); in check_cmdresp_status()
537 static inline void fm_irq_common_cmd_resp_helper(struct fmdev *fmdev, u8 stage) in fm_irq_common_cmd_resp_helper() argument
541 if (!check_cmdresp_status(fmdev, &skb)) in fm_irq_common_cmd_resp_helper()
542 fm_irq_call_stage(fmdev, stage); in fm_irq_common_cmd_resp_helper()
554 struct fmdev *fmdev; in int_timeout_handler() local
558 fmdev = (struct fmdev *)data; in int_timeout_handler()
559 fmirq = &fmdev->irq_info; in int_timeout_handler()
571 fm_irq_call_stage(fmdev, FM_SEND_INTMSK_CMD_IDX); in int_timeout_handler()
575 static void fm_irq_send_flag_getcmd(struct fmdev *fmdev) in fm_irq_send_flag_getcmd() argument
580 if (!fm_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, sizeof(flag), NULL)) in fm_irq_send_flag_getcmd()
581 fm_irq_timeout_stage(fmdev, FM_HANDLE_FLAG_GETCMD_RESP_IDX); in fm_irq_send_flag_getcmd()
584 static void fm_irq_handle_flag_getcmd_resp(struct fmdev *fmdev) in fm_irq_handle_flag_getcmd_resp() argument
589 if (check_cmdresp_status(fmdev, &skb)) in fm_irq_handle_flag_getcmd_resp()
596 memcpy(&fmdev->irq_info.flag, skb->data, fm_evt_hdr->dlen); in fm_irq_handle_flag_getcmd_resp()
598 fmdev->irq_info.flag = be16_to_cpu((__force __be16)fmdev->irq_info.flag); in fm_irq_handle_flag_getcmd_resp()
599 fmdbg("irq: flag register(0x%x)\n", fmdev->irq_info.flag); in fm_irq_handle_flag_getcmd_resp()
602 fm_irq_call_stage(fmdev, FM_HW_MAL_FUNC_IDX); in fm_irq_handle_flag_getcmd_resp()
605 static void fm_irq_handle_hw_malfunction(struct fmdev *fmdev) in fm_irq_handle_hw_malfunction() argument
607 if (fmdev->irq_info.flag & FM_MAL_EVENT & fmdev->irq_info.mask) in fm_irq_handle_hw_malfunction()
611 fm_irq_call_stage(fmdev, FM_RDS_START_IDX); in fm_irq_handle_hw_malfunction()
614 static void fm_irq_handle_rds_start(struct fmdev *fmdev) in fm_irq_handle_rds_start() argument
616 if (fmdev->irq_info.flag & FM_RDS_EVENT & fmdev->irq_info.mask) { in fm_irq_handle_rds_start()
618 fmdev->irq_info.stage = FM_RDS_SEND_RDS_GETCMD_IDX; in fm_irq_handle_rds_start()
621 fmdev->irq_info.stage = FM_HW_TUNE_OP_ENDED_IDX; in fm_irq_handle_rds_start()
624 fm_irq_call(fmdev); in fm_irq_handle_rds_start()
627 static void fm_irq_send_rdsdata_getcmd(struct fmdev *fmdev) in fm_irq_send_rdsdata_getcmd() argument
630 if (!fm_send_cmd(fmdev, RDS_DATA_GET, REG_RD, NULL, in fm_irq_send_rdsdata_getcmd()
632 fm_irq_timeout_stage(fmdev, FM_RDS_HANDLE_RDS_GETCMD_RESP_IDX); in fm_irq_send_rdsdata_getcmd()
636 static void fm_rx_update_af_cache(struct fmdev *fmdev, u8 af) in fm_rx_update_af_cache() argument
638 struct tuned_station_info *stat_info = &fmdev->rx.stat_info; in fm_rx_update_af_cache()
639 u8 reg_idx = fmdev->rx.region.fm_band; in fm_rx_update_af_cache()
645 fmdev->rx.stat_info.af_list_max = (af - FM_RDS_1_AF_FOLLOWS + 1); in fm_rx_update_af_cache()
646 fmdev->rx.stat_info.afcache_size = 0; in fm_rx_update_af_cache()
647 fmdbg("No of expected AF : %d\n", fmdev->rx.stat_info.af_list_max); in fm_rx_update_af_cache()
658 freq = fmdev->rx.region.bot_freq + (af * 100); in fm_rx_update_af_cache()
659 if (freq == fmdev->rx.freq) { in fm_rx_update_af_cache()
661 fmdev->rx.freq, freq); in fm_rx_update_af_cache()
689 static void fm_rdsparse_swapbytes(struct fmdev *fmdev, in fm_rdsparse_swapbytes() argument
700 if (fmdev->asci_id != 0x6350) { in fm_rdsparse_swapbytes()
709 static void fm_irq_handle_rdsdata_getcmd_resp(struct fmdev *fmdev) in fm_irq_handle_rdsdata_getcmd_resp() argument
713 struct fm_rds *rds = &fmdev->rx.rds; in fm_irq_handle_rdsdata_getcmd_resp()
720 if (check_cmdresp_status(fmdev, &skb)) in fm_irq_handle_rdsdata_getcmd_resp()
758 fm_rdsparse_swapbytes(fmdev, &rds_fmt); in fm_irq_handle_rdsdata_getcmd_resp()
765 if (fmdev->rx.stat_info.picode != cur_picode) in fm_irq_handle_rdsdata_getcmd_resp()
766 fmdev->rx.stat_info.picode = cur_picode; in fm_irq_handle_rdsdata_getcmd_resp()
776 fm_rx_update_af_cache(fmdev, rds_fmt.data.group0A.af[0]); in fm_irq_handle_rdsdata_getcmd_resp()
777 fm_rx_update_af_cache(fmdev, rds_fmt.data.group0A.af[1]); in fm_irq_handle_rdsdata_getcmd_resp()
788 spin_lock_irqsave(&fmdev->rds_buff_lock, flags); in fm_irq_handle_rdsdata_getcmd_resp()
816 spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags); in fm_irq_handle_rdsdata_getcmd_resp()
822 fm_irq_call_stage(fmdev, FM_RDS_FINISH_IDX); in fm_irq_handle_rdsdata_getcmd_resp()
825 static void fm_irq_handle_rds_finish(struct fmdev *fmdev) in fm_irq_handle_rds_finish() argument
827 fm_irq_call_stage(fmdev, FM_HW_TUNE_OP_ENDED_IDX); in fm_irq_handle_rds_finish()
830 static void fm_irq_handle_tune_op_ended(struct fmdev *fmdev) in fm_irq_handle_tune_op_ended() argument
832 if (fmdev->irq_info.flag & (FM_FR_EVENT | FM_BL_EVENT) & fmdev-> in fm_irq_handle_tune_op_ended()
835 if (test_and_clear_bit(FM_AF_SWITCH_INPROGRESS, &fmdev->flag)) { in fm_irq_handle_tune_op_ended()
836 fmdev->irq_info.stage = FM_AF_JUMP_RD_FREQ_IDX; in fm_irq_handle_tune_op_ended()
838 complete(&fmdev->maintask_comp); in fm_irq_handle_tune_op_ended()
839 fmdev->irq_info.stage = FM_HW_POWER_ENB_IDX; in fm_irq_handle_tune_op_ended()
842 fmdev->irq_info.stage = FM_HW_POWER_ENB_IDX; in fm_irq_handle_tune_op_ended()
844 fm_irq_call(fmdev); in fm_irq_handle_tune_op_ended()
847 static void fm_irq_handle_power_enb(struct fmdev *fmdev) in fm_irq_handle_power_enb() argument
849 if (fmdev->irq_info.flag & FM_POW_ENB_EVENT) { in fm_irq_handle_power_enb()
851 complete(&fmdev->maintask_comp); in fm_irq_handle_power_enb()
854 fm_irq_call_stage(fmdev, FM_LOW_RSSI_START_IDX); in fm_irq_handle_power_enb()
857 static void fm_irq_handle_low_rssi_start(struct fmdev *fmdev) in fm_irq_handle_low_rssi_start() argument
859 if ((fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON) && in fm_irq_handle_low_rssi_start()
860 (fmdev->irq_info.flag & FM_LEV_EVENT & fmdev->irq_info.mask) && in fm_irq_handle_low_rssi_start()
861 (fmdev->rx.freq != FM_UNDEFINED_FREQ) && in fm_irq_handle_low_rssi_start()
862 (fmdev->rx.stat_info.afcache_size != 0)) { in fm_irq_handle_low_rssi_start()
866 fmdev->irq_info.mask &= ~FM_LEV_EVENT; in fm_irq_handle_low_rssi_start()
868 fmdev->rx.afjump_idx = 0; in fm_irq_handle_low_rssi_start()
869 fmdev->rx.freq_before_jump = fmdev->rx.freq; in fm_irq_handle_low_rssi_start()
870 fmdev->irq_info.stage = FM_AF_JUMP_SETPI_IDX; in fm_irq_handle_low_rssi_start()
873 fmdev->irq_info.stage = FM_SEND_INTMSK_CMD_IDX; in fm_irq_handle_low_rssi_start()
876 fm_irq_call(fmdev); in fm_irq_handle_low_rssi_start()
879 static void fm_irq_afjump_set_pi(struct fmdev *fmdev) in fm_irq_afjump_set_pi() argument
884 payload = fmdev->rx.stat_info.picode; in fm_irq_afjump_set_pi()
885 if (!fm_send_cmd(fmdev, RDS_PI_SET, REG_WR, &payload, sizeof(payload), NULL)) in fm_irq_afjump_set_pi()
886 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SETPI_RESP_IDX); in fm_irq_afjump_set_pi()
889 static void fm_irq_handle_set_pi_resp(struct fmdev *fmdev) in fm_irq_handle_set_pi_resp() argument
891 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_SETPI_MASK_IDX); in fm_irq_handle_set_pi_resp()
899 static void fm_irq_afjump_set_pimask(struct fmdev *fmdev) in fm_irq_afjump_set_pimask() argument
904 if (!fm_send_cmd(fmdev, RDS_PI_MASK_SET, REG_WR, &payload, sizeof(payload), NULL)) in fm_irq_afjump_set_pimask()
905 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SETPI_MASK_RESP_IDX); in fm_irq_afjump_set_pimask()
908 static void fm_irq_handle_set_pimask_resp(struct fmdev *fmdev) in fm_irq_handle_set_pimask_resp() argument
910 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_SET_AF_FREQ_IDX); in fm_irq_handle_set_pimask_resp()
913 static void fm_irq_afjump_setfreq(struct fmdev *fmdev) in fm_irq_afjump_setfreq() argument
918 fmdbg("Swtich to %d KHz\n", fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx]); in fm_irq_afjump_setfreq()
919 frq_index = (fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx] - in fm_irq_afjump_setfreq()
920 fmdev->rx.region.bot_freq) / FM_FREQ_MUL; in fm_irq_afjump_setfreq()
923 if (!fm_send_cmd(fmdev, AF_FREQ_SET, REG_WR, &payload, sizeof(payload), NULL)) in fm_irq_afjump_setfreq()
924 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SET_AFFREQ_RESP_IDX); in fm_irq_afjump_setfreq()
927 static void fm_irq_handle_setfreq_resp(struct fmdev *fmdev) in fm_irq_handle_setfreq_resp() argument
929 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_ENABLE_INT_IDX); in fm_irq_handle_setfreq_resp()
932 static void fm_irq_afjump_enableint(struct fmdev *fmdev) in fm_irq_afjump_enableint() argument
938 if (!fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, sizeof(payload), NULL)) in fm_irq_afjump_enableint()
939 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_ENABLE_INT_RESP_IDX); in fm_irq_afjump_enableint()
942 static void fm_irq_afjump_enableint_resp(struct fmdev *fmdev) in fm_irq_afjump_enableint_resp() argument
944 fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_START_AFJUMP_IDX); in fm_irq_afjump_enableint_resp()
947 static void fm_irq_start_afjump(struct fmdev *fmdev) in fm_irq_start_afjump() argument
952 if (!fm_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload, in fm_irq_start_afjump()
954 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_START_AFJUMP_RESP_IDX); in fm_irq_start_afjump()
957 static void fm_irq_handle_start_afjump_resp(struct fmdev *fmdev) in fm_irq_handle_start_afjump_resp() argument
961 if (check_cmdresp_status(fmdev, &skb)) in fm_irq_handle_start_afjump_resp()
964 fmdev->irq_info.stage = FM_SEND_FLAG_GETCMD_IDX; in fm_irq_handle_start_afjump_resp()
965 set_bit(FM_AF_SWITCH_INPROGRESS, &fmdev->flag); in fm_irq_handle_start_afjump_resp()
966 clear_bit(FM_INTTASK_RUNNING, &fmdev->flag); in fm_irq_handle_start_afjump_resp()
969 static void fm_irq_afjump_rd_freq(struct fmdev *fmdev) in fm_irq_afjump_rd_freq() argument
973 if (!fm_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, sizeof(payload), NULL)) in fm_irq_afjump_rd_freq()
974 fm_irq_timeout_stage(fmdev, FM_AF_JUMP_RD_FREQ_RESP_IDX); in fm_irq_afjump_rd_freq()
977 static void fm_irq_afjump_rd_freq_resp(struct fmdev *fmdev) in fm_irq_afjump_rd_freq_resp() argument
983 if (check_cmdresp_status(fmdev, &skb)) in fm_irq_afjump_rd_freq_resp()
990 curr_freq = fmdev->rx.region.bot_freq + ((u32)read_freq * FM_FREQ_MUL); in fm_irq_afjump_rd_freq_resp()
992 jumped_freq = fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx]; in fm_irq_afjump_rd_freq_resp()
995 if ((curr_freq != fmdev->rx.freq_before_jump) && (curr_freq == jumped_freq)) { in fm_irq_afjump_rd_freq_resp()
997 fmdev->rx.freq = curr_freq; in fm_irq_afjump_rd_freq_resp()
998 fm_rx_reset_rds_cache(fmdev); in fm_irq_afjump_rd_freq_resp()
1001 if (fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON) in fm_irq_afjump_rd_freq_resp()
1002 fmdev->irq_info.mask |= FM_LEV_EVENT; in fm_irq_afjump_rd_freq_resp()
1004 fmdev->irq_info.stage = FM_LOW_RSSI_FINISH_IDX; in fm_irq_afjump_rd_freq_resp()
1006 fmdev->rx.afjump_idx++; in fm_irq_afjump_rd_freq_resp()
1009 if (fmdev->rx.afjump_idx >= fmdev->rx.stat_info.afcache_size) { in fm_irq_afjump_rd_freq_resp()
1011 fmdev->irq_info.stage = FM_LOW_RSSI_FINISH_IDX; in fm_irq_afjump_rd_freq_resp()
1015 fmdev->irq_info.stage = FM_AF_JUMP_SETPI_IDX; in fm_irq_afjump_rd_freq_resp()
1018 fm_irq_call(fmdev); in fm_irq_afjump_rd_freq_resp()
1021 static void fm_irq_handle_low_rssi_finish(struct fmdev *fmdev) in fm_irq_handle_low_rssi_finish() argument
1023 fm_irq_call_stage(fmdev, FM_SEND_INTMSK_CMD_IDX); in fm_irq_handle_low_rssi_finish()
1026 static void fm_irq_send_intmsk_cmd(struct fmdev *fmdev) in fm_irq_send_intmsk_cmd() argument
1031 payload = fmdev->irq_info.mask; in fm_irq_send_intmsk_cmd()
1033 if (!fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, in fm_irq_send_intmsk_cmd()
1035 fm_irq_timeout_stage(fmdev, FM_HANDLE_INTMSK_CMD_RESP_IDX); in fm_irq_send_intmsk_cmd()
1038 static void fm_irq_handle_intmsk_cmd_resp(struct fmdev *fmdev) in fm_irq_handle_intmsk_cmd_resp() argument
1042 if (check_cmdresp_status(fmdev, &skb)) in fm_irq_handle_intmsk_cmd_resp()
1048 fmdev->irq_info.stage = FM_SEND_FLAG_GETCMD_IDX; in fm_irq_handle_intmsk_cmd_resp()
1051 if (test_and_clear_bit(FM_INTTASK_SCHEDULE_PENDING, &fmdev->flag)) in fm_irq_handle_intmsk_cmd_resp()
1052 fmdev->irq_info.handlers[fmdev->irq_info.stage](fmdev); in fm_irq_handle_intmsk_cmd_resp()
1054 clear_bit(FM_INTTASK_RUNNING, &fmdev->flag); in fm_irq_handle_intmsk_cmd_resp()
1058 int fmc_is_rds_data_available(struct fmdev *fmdev, struct file *file, in fmc_is_rds_data_available() argument
1061 poll_wait(file, &fmdev->rx.rds.read_queue, pts); in fmc_is_rds_data_available()
1062 if (fmdev->rx.rds.rd_idx != fmdev->rx.rds.wr_idx) in fmc_is_rds_data_available()
1069 int fmc_transfer_rds_from_internal_buff(struct fmdev *fmdev, struct file *file, in fmc_transfer_rds_from_internal_buff() argument
1077 if (fmdev->rx.rds.wr_idx == fmdev->rx.rds.rd_idx) { in fmc_transfer_rds_from_internal_buff()
1081 ret = wait_event_interruptible(fmdev->rx.rds.read_queue, in fmc_transfer_rds_from_internal_buff()
1082 (fmdev->rx.rds.wr_idx != fmdev->rx.rds.rd_idx)); in fmc_transfer_rds_from_internal_buff()
1093 spin_lock_irqsave(&fmdev->rds_buff_lock, flags); in fmc_transfer_rds_from_internal_buff()
1095 if (fmdev->rx.rds.wr_idx == fmdev->rx.rds.rd_idx) { in fmc_transfer_rds_from_internal_buff()
1096 spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags); in fmc_transfer_rds_from_internal_buff()
1099 memcpy(tmpbuf, &fmdev->rx.rds.buff[fmdev->rx.rds.rd_idx], in fmc_transfer_rds_from_internal_buff()
1101 fmdev->rx.rds.rd_idx += FM_RDS_BLK_SIZE; in fmc_transfer_rds_from_internal_buff()
1102 if (fmdev->rx.rds.rd_idx >= fmdev->rx.rds.buf_size) in fmc_transfer_rds_from_internal_buff()
1103 fmdev->rx.rds.rd_idx = 0; in fmc_transfer_rds_from_internal_buff()
1105 spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags); in fmc_transfer_rds_from_internal_buff()
1117 int fmc_set_freq(struct fmdev *fmdev, u32 freq_to_set) in fmc_set_freq() argument
1119 switch (fmdev->curr_fmmode) { in fmc_set_freq()
1121 return fm_rx_set_freq(fmdev, freq_to_set); in fmc_set_freq()
1124 return fm_tx_set_freq(fmdev, freq_to_set); in fmc_set_freq()
1131 int fmc_get_freq(struct fmdev *fmdev, u32 *cur_tuned_frq) in fmc_get_freq() argument
1133 if (fmdev->rx.freq == FM_UNDEFINED_FREQ) { in fmc_get_freq()
1142 switch (fmdev->curr_fmmode) { in fmc_get_freq()
1144 *cur_tuned_frq = fmdev->rx.freq; in fmc_get_freq()
1157 int fmc_set_region(struct fmdev *fmdev, u8 region_to_set) in fmc_set_region() argument
1159 switch (fmdev->curr_fmmode) { in fmc_set_region()
1161 return fm_rx_set_region(fmdev, region_to_set); in fmc_set_region()
1164 return fm_tx_set_region(fmdev, region_to_set); in fmc_set_region()
1171 int fmc_set_mute_mode(struct fmdev *fmdev, u8 mute_mode_toset) in fmc_set_mute_mode() argument
1173 switch (fmdev->curr_fmmode) { in fmc_set_mute_mode()
1175 return fm_rx_set_mute_mode(fmdev, mute_mode_toset); in fmc_set_mute_mode()
1178 return fm_tx_set_mute_mode(fmdev, mute_mode_toset); in fmc_set_mute_mode()
1185 int fmc_set_stereo_mono(struct fmdev *fmdev, u16 mode) in fmc_set_stereo_mono() argument
1187 switch (fmdev->curr_fmmode) { in fmc_set_stereo_mono()
1189 return fm_rx_set_stereo_mono(fmdev, mode); in fmc_set_stereo_mono()
1192 return fm_tx_set_stereo_mono(fmdev, mode); in fmc_set_stereo_mono()
1199 int fmc_set_rds_mode(struct fmdev *fmdev, u8 rds_en_dis) in fmc_set_rds_mode() argument
1201 switch (fmdev->curr_fmmode) { in fmc_set_rds_mode()
1203 return fm_rx_set_rds_mode(fmdev, rds_en_dis); in fmc_set_rds_mode()
1206 return fm_tx_set_rds_mode(fmdev, rds_en_dis); in fmc_set_rds_mode()
1214 static int fm_power_down(struct fmdev *fmdev) in fm_power_down() argument
1219 if (!test_bit(FM_CORE_READY, &fmdev->flag)) { in fm_power_down()
1223 if (fmdev->curr_fmmode == FM_MODE_OFF) { in fm_power_down()
1229 ret = fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload, in fm_power_down()
1234 return fmc_release(fmdev); in fm_power_down()
1238 static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name) in fm_download_firmware() argument
1248 set_bit(FM_FW_DW_INPROGRESS, &fmdev->flag); in fm_download_firmware()
1251 &fmdev->radio_dev->dev); in fm_download_firmware()
1278 if (fmc_send_cmd(fmdev, 0, 0, action->data, in fm_download_firmware()
1297 clear_bit(FM_FW_DW_INPROGRESS, &fmdev->flag); in fm_download_firmware()
1303 static int load_default_rx_configuration(struct fmdev *fmdev) in load_default_rx_configuration() argument
1307 ret = fm_rx_set_volume(fmdev, FM_DEFAULT_RX_VOLUME); in load_default_rx_configuration()
1311 return fm_rx_set_rssi_threshold(fmdev, FM_DEFAULT_RSSI_THRESHOLD); in load_default_rx_configuration()
1315 static int fm_power_up(struct fmdev *fmdev, u8 mode) in fm_power_up() argument
1331 ret = fmc_prepare(fmdev); in fm_power_up()
1338 if (fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload, in fm_power_up()
1345 if (fmc_send_cmd(fmdev, ASIC_ID_GET, REG_RD, NULL, in fm_power_up()
1349 if (fmc_send_cmd(fmdev, ASIC_VER_GET, REG_RD, NULL, in fm_power_up()
1359 ret = fm_download_firmware(fmdev, fw_name); in fm_power_up()
1368 ret = fm_download_firmware(fmdev, fw_name); in fm_power_up()
1375 return fmc_release(fmdev); in fm_power_up()
1379 int fmc_set_mode(struct fmdev *fmdev, u8 fm_mode) in fmc_set_mode() argument
1387 if (fmdev->curr_fmmode == fm_mode) { in fmc_set_mode()
1394 ret = fm_power_down(fmdev); in fmc_set_mode()
1404 if (fmdev->curr_fmmode != FM_MODE_OFF) { in fmc_set_mode()
1405 ret = fm_power_down(fmdev); in fmc_set_mode()
1412 ret = fm_power_up(fmdev, fm_mode); in fmc_set_mode()
1418 fmdev->curr_fmmode = fm_mode; in fmc_set_mode()
1421 if (fmdev->curr_fmmode == FM_MODE_RX) { in fmc_set_mode()
1423 ret = load_default_rx_configuration(fmdev); in fmc_set_mode()
1432 int fmc_get_mode(struct fmdev *fmdev, u8 *fmmode) in fmc_get_mode() argument
1434 if (!test_bit(FM_CORE_READY, &fmdev->flag)) { in fmc_get_mode()
1443 *fmmode = fmdev->curr_fmmode; in fmc_get_mode()
1450 struct fmdev *fmdev; in fm_st_receive() local
1452 fmdev = (struct fmdev *)arg; in fm_st_receive()
1465 skb_queue_tail(&fmdev->rx_q, skb); in fm_st_receive()
1466 tasklet_schedule(&fmdev->rx_task); in fm_st_receive()
1477 struct fmdev *fmdev; in fm_st_reg_comp_cb() local
1479 fmdev = (struct fmdev *)arg; in fm_st_reg_comp_cb()
1480 fmdev->streg_cbdata = data; in fm_st_reg_comp_cb()
1488 int fmc_prepare(struct fmdev *fmdev) in fmc_prepare() argument
1493 if (test_bit(FM_CORE_READY, &fmdev->flag)) { in fmc_prepare()
1503 fm_st_proto.priv_data = fmdev; in fmc_prepare()
1514 fmdev->streg_cbdata = -EINPROGRESS; in fmc_prepare()
1524 if (fmdev->streg_cbdata != 0) { in fmc_prepare()
1526 "status %d\n", fmdev->streg_cbdata); in fmc_prepare()
1546 spin_lock_init(&fmdev->rds_buff_lock); in fmc_prepare()
1547 spin_lock_init(&fmdev->resp_skb_lock); in fmc_prepare()
1550 skb_queue_head_init(&fmdev->tx_q); in fmc_prepare()
1551 tasklet_init(&fmdev->tx_task, send_tasklet, (unsigned long)fmdev); in fmc_prepare()
1554 skb_queue_head_init(&fmdev->rx_q); in fmc_prepare()
1555 tasklet_init(&fmdev->rx_task, recv_tasklet, (unsigned long)fmdev); in fmc_prepare()
1557 fmdev->irq_info.stage = 0; in fmc_prepare()
1558 atomic_set(&fmdev->tx_cnt, 1); in fmc_prepare()
1559 fmdev->resp_comp = NULL; in fmc_prepare()
1561 init_timer(&fmdev->irq_info.timer); in fmc_prepare()
1562 fmdev->irq_info.timer.function = &int_timeout_handler; in fmc_prepare()
1563 fmdev->irq_info.timer.data = (unsigned long)fmdev; in fmc_prepare()
1565 fmdev->irq_info.mask = FM_MAL_EVENT; in fmc_prepare()
1568 fmdev->rx.region = region_configs[default_radio_region]; in fmc_prepare()
1570 fmdev->rx.mute_mode = FM_MUTE_OFF; in fmc_prepare()
1571 fmdev->rx.rf_depend_mute = FM_RX_RF_DEPENDENT_MUTE_OFF; in fmc_prepare()
1572 fmdev->rx.rds.flag = FM_RDS_DISABLE; in fmc_prepare()
1573 fmdev->rx.freq = FM_UNDEFINED_FREQ; in fmc_prepare()
1574 fmdev->rx.rds_mode = FM_RDS_SYSTEM_RDS; in fmc_prepare()
1575 fmdev->rx.af_mode = FM_RX_RDS_AF_SWITCH_MODE_OFF; in fmc_prepare()
1576 fmdev->irq_info.retry = 0; in fmc_prepare()
1578 fm_rx_reset_rds_cache(fmdev); in fmc_prepare()
1579 init_waitqueue_head(&fmdev->rx.rds.read_queue); in fmc_prepare()
1581 fm_rx_reset_station_info(fmdev); in fmc_prepare()
1582 set_bit(FM_CORE_READY, &fmdev->flag); in fmc_prepare()
1591 int fmc_release(struct fmdev *fmdev) in fmc_release() argument
1596 if (!test_bit(FM_CORE_READY, &fmdev->flag)) { in fmc_release()
1601 wake_up_interruptible(&fmdev->rx.rds.read_queue); in fmc_release()
1603 tasklet_kill(&fmdev->tx_task); in fmc_release()
1604 tasklet_kill(&fmdev->rx_task); in fmc_release()
1606 skb_queue_purge(&fmdev->tx_q); in fmc_release()
1607 skb_queue_purge(&fmdev->rx_q); in fmc_release()
1609 fmdev->resp_comp = NULL; in fmc_release()
1610 fmdev->rx.freq = 0; in fmc_release()
1622 clear_bit(FM_CORE_READY, &fmdev->flag); in fmc_release()
1632 struct fmdev *fmdev = NULL; in fm_drv_init() local
1637 fmdev = kzalloc(sizeof(struct fmdev), GFP_KERNEL); in fm_drv_init()
1638 if (NULL == fmdev) { in fm_drv_init()
1642 fmdev->rx.rds.buf_size = default_rds_buf * FM_RDS_BLK_SIZE; in fm_drv_init()
1643 fmdev->rx.rds.buff = kzalloc(fmdev->rx.rds.buf_size, GFP_KERNEL); in fm_drv_init()
1644 if (NULL == fmdev->rx.rds.buff) { in fm_drv_init()
1649 ret = fm_v4l2_init_video_device(fmdev, radio_nr); in fm_drv_init()
1653 fmdev->irq_info.handlers = int_handler_table; in fm_drv_init()
1654 fmdev->curr_fmmode = FM_MODE_OFF; in fm_drv_init()
1655 fmdev->tx_data.pwr_lvl = FM_PWR_LVL_DEF; in fm_drv_init()
1656 fmdev->tx_data.preemph = FM_TX_PREEMPH_50US; in fm_drv_init()
1660 kfree(fmdev->rx.rds.buff); in fm_drv_init()
1662 kfree(fmdev); in fm_drv_init()
1670 struct fmdev *fmdev = NULL; in fm_drv_exit() local
1672 fmdev = fm_v4l2_deinit_video_device(); in fm_drv_exit()
1673 if (fmdev != NULL) { in fm_drv_exit()
1674 kfree(fmdev->rx.rds.buff); in fm_drv_exit()
1675 kfree(fmdev); in fm_drv_exit()